From c91b01f7e39922c074f5a986b08a580b5c3a799b Mon Sep 17 00:00:00 2001 From: Gui Chen Date: Thu, 31 Jul 2014 23:47:07 -0400 Subject: [PATCH] Imported Upstream version 2.35.8 --- .dir-locals.el | 1 + .gitignore | 44 + AUTHORS | 40 + COPYING | 482 + 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 | 36 + INSTALL.in | 122 + Makefile.am | 140 + Makefile.decl | 97 + NEWS | 7102 ++++++ NEWS.pre-1-3 | 211 + README.commits | 72 + README.in | 323 + README.win32 | 369 + acglib.m4 | 131 + acinclude.m4 | 452 + autogen.sh | 36 + build/ChangeLog | 591 + build/Makefile-newvs.am | 32 + build/Makefile.am | 7 + build/README | 2 + build/win32/Makefile.am | 9 + build/win32/dirent/Makefile.am | 9 + 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/setup.py | 366 + build/win32/vs10/.gitignore | 6 + build/win32/vs10/Makefile.am | 37 + build/win32/vs10/README.txt | 84 + build/win32/vs10/gio.vcxproj.filtersin | 25 + build/win32/vs10/gio.vcxprojin | 199 + .../win32/vs10/glib-compile-resources.vcxproj | 181 + .../glib-compile-resources.vcxproj.filters | 17 + build/win32/vs10/glib-compile-schemas.vcxproj | 181 + .../vs10/glib-compile-schemas.vcxproj.filters | 17 + build/win32/vs10/glib-genmarshal.vcxproj | 173 + .../vs10/glib-genmarshal.vcxproj.filters | 22 + build/win32/vs10/glib.props | 608 + build/win32/vs10/glib.sln | 271 + build/win32/vs10/glib.vcxproj.filtersin | 115 + build/win32/vs10/glib.vcxprojin | 531 + build/win32/vs10/gmodule.vcxproj | 184 + build/win32/vs10/gmodule.vcxproj.filters | 27 + build/win32/vs10/gobject.vcxproj.filtersin | 25 + build/win32/vs10/gobject.vcxprojin | 194 + build/win32/vs10/gresource.vcxproj | 180 + build/win32/vs10/gresource.vcxproj.filters | 14 + build/win32/vs10/gsettings.vcxproj | 181 + build/win32/vs10/gsettings.vcxproj.filters | 14 + .../vs10/gspawn-win32-helper-console.vcxproj | 175 + ...spawn-win32-helper-console.vcxproj.filters | 22 + build/win32/vs10/gspawn-win32-helper.vcxproj | 175 + .../vs10/gspawn-win32-helper.vcxproj.filters | 22 + build/win32/vs10/gthread.vcxproj | 184 + build/win32/vs10/gthread.vcxproj.filters | 27 + build/win32/vs10/install.vcxproj | 153 + build/win32/vs10/testglib.vcxproj | 173 + build/win32/vs10/testglib.vcxproj.filters | 22 + build/win32/vs11/.gitignore | 30 + build/win32/vs11/Makefile.am | 37 + build/win32/vs8/Makefile.am | 11 + build/win32/vs8/README | 4 + build/win32/vs8/gio.vcproj | 486 + build/win32/vs8/glib-genmarshal.vcproj | 199 + build/win32/vs8/glib.sln | 84 + build/win32/vs8/glib.vcproj | 605 + build/win32/vs8/gmodule.vcproj | 217 + build/win32/vs8/gobject.vcproj | 295 + .../vs8/gspawn-win32-helper-console.vcproj | 201 + build/win32/vs8/gspawn-win32-helper.vcproj | 201 + build/win32/vs8/gthread.vcproj | 215 + build/win32/vs9/.gitignore | 3 + build/win32/vs9/Makefile.am | 21 + build/win32/vs9/README.txt | 84 + build/win32/vs9/gio.vcprojin | 174 + build/win32/vs9/glib-compile-resources.vcproj | 156 + build/win32/vs9/glib-compile-schemas.vcproj | 156 + build/win32/vs9/glib-genmarshal.vcproj | 161 + build/win32/vs9/glib.sln | 332 + build/win32/vs9/glib.vcprojin | 500 + build/win32/vs9/glib.vsprops | 346 + build/win32/vs9/gmodule.vcproj | 170 + build/win32/vs9/gobject.vcprojin | 171 + build/win32/vs9/gresource.vcproj | 155 + build/win32/vs9/gsettings.vcproj | 156 + .../vs9/gspawn-win32-helper-console.vcproj | 163 + build/win32/vs9/gspawn-win32-helper.vcproj | 160 + build/win32/vs9/gthread.vcproj | 167 + build/win32/vs9/install.vcproj | 77 + build/win32/vs9/testglib.vcproj | 161 + check-abis.sh | 23 + config.h.win32.in | 909 + configure.ac | 3737 +++ docs/Makefile.am | 11 + docs/debugging.txt | 41 + docs/macros.txt | 81 + docs/reference/.gitignore | 16 + docs/reference/AUTHORS | 7 + docs/reference/COPYING | 30 + docs/reference/ChangeLog | 4152 ++++ docs/reference/Makefile.am | 3 + docs/reference/NEWS | 0 docs/reference/README | 63 + docs/reference/gio/.gitignore | 3 + docs/reference/gio/Makefile.am | 179 + docs/reference/gio/gdbus-codegen.xml | 853 + .../gdbus-object-manager-example/.gitignore | 1 + .../gdbus-object-manager-example/Makefile.am | 68 + .../gdbus-object-manager-example-docs.xml | 17 + .../gdbus-object-manager-example-sections.txt | 161 + .../gdbus-object-manager-example.types | 10 + docs/reference/gio/gdbus.xml | 361 + docs/reference/gio/gio-docs.xml | 306 + docs/reference/gio/gio-querymodules.xml | 45 + docs/reference/gio/gio-sections.txt | 4024 +++ docs/reference/gio/gio.types | 139 + docs/reference/gio/glib-compile-resources.xml | 191 + docs/reference/gio/glib-compile-schemas.xml | 103 + docs/reference/gio/gresource.xml | 127 + docs/reference/gio/gsettings.xml | 229 + docs/reference/gio/gvfs-overview.odg | Bin 0 -> 17772 bytes docs/reference/gio/gvfs-overview.png | Bin 0 -> 48474 bytes docs/reference/gio/menu-example.png | Bin 0 -> 31470 bytes docs/reference/gio/menu-model.png | Bin 0 -> 20647 bytes docs/reference/gio/migrating-gconf.xml | 515 + docs/reference/gio/migrating-gdbus.xml | 305 + docs/reference/gio/migrating-gnome-vfs.xml | 133 + docs/reference/gio/migrating-posix.xml | 27 + docs/reference/gio/overview.xml | 683 + docs/reference/gio/version.xml.in | 1 + docs/reference/glib/Makefile.am | 128 + docs/reference/glib/building.xml | 547 + docs/reference/glib/changes.xml | 174 + docs/reference/glib/compiling.xml | 126 + docs/reference/glib/cross.xml | 208 + 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.xml | 220 + docs/reference/glib/glib-gettextize.xml | 88 + docs/reference/glib/glib-overrides.txt | 303 + docs/reference/glib/glib-sections.txt | 3227 +++ docs/reference/glib/glib.types | 0 docs/reference/glib/gtester-report.xml | 68 + docs/reference/glib/gtester.xml | 189 + docs/reference/glib/gvariant-text.xml | 619 + docs/reference/glib/gvariant-varargs.xml | 1137 + 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/programming.xml | 67 + docs/reference/glib/regex-syntax.xml | 2531 ++ docs/reference/glib/resources.xml | 115 + docs/reference/glib/running.xml | 380 + docs/reference/glib/version.xml.in | 1 + docs/reference/gobject/Makefile.am | 104 + docs/reference/gobject/glib-genmarshal.xml | 382 + docs/reference/gobject/glib-mkenums.xml | 329 + docs/reference/gobject/gobject-docs.xml | 174 + docs/reference/gobject/gobject-overrides.txt | 0 docs/reference/gobject/gobject-query.xml | 123 + docs/reference/gobject/gobject-sections.txt | 949 + docs/reference/gobject/gobject.cI | 11 + docs/reference/gobject/gobject.types | 7 + docs/reference/gobject/images/glue.png | Bin 0 -> 12722 bytes docs/reference/gobject/tmpl/.gitignore | 15 + docs/reference/gobject/tut_gobject.xml | 749 + docs/reference/gobject/tut_gsignal.xml | 524 + docs/reference/gobject/tut_gtype.xml | 1008 + docs/reference/gobject/tut_howto.xml | 1844 ++ docs/reference/gobject/tut_intro.xml | 182 + docs/reference/gobject/tut_tools.xml | 132 + docs/reference/gobject/version.xml.in | 1 + gio-2.0.pc.in | 18 + gio-unix-2.0.pc.in | 11 + gio-windows-2.0.pc.in | 11 + gio/.gitignore | 16 + gio/ChangeLog | 5966 +++++ gio/Makefile.am | 784 + gio/completion/gdbus | 33 + gio/completion/gresource | 58 + gio/completion/gsettings | 84 + gio/data-to-c.pl | 39 + gio/dbus-daemon.xml | 76 + gio/fam/Makefile.am | 49 + gio/fam/fam-helper.c | 276 + gio/fam/fam-helper.h | 38 + gio/fam/fam-module.c | 56 + gio/fam/gfamdirectorymonitor.c | 157 + gio/fam/gfamdirectorymonitor.h | 54 + gio/fam/gfamfilemonitor.c | 155 + gio/fam/gfamfilemonitor.h | 55 + gio/fen/Makefile.am | 29 + gio/fen/fen-dump.c | 76 + gio/fen/fen-dump.h | 29 + gio/fen/fen-helper.c | 195 + gio/fen/fen-helper.h | 33 + gio/fen/fen-kernel.c | 555 + gio/fen/fen-kernel.h | 43 + gio/fen/fen-node.c | 640 + gio/fen/fen-node.h | 104 + gio/fen/gfendirectorymonitor.c | 142 + gio/fen/gfendirectorymonitor.h | 58 + gio/fen/gfenfilemonitor.c | 142 + gio/fen/gfenfilemonitor.h | 59 + gio/gaction.c | 391 + gio/gaction.h | 86 + gio/gactiongroup.c | 750 + gio/gactiongroup.h | 163 + gio/gactiongroupexporter.c | 587 + gio/gactiongroupexporter.h | 47 + gio/gactionmap.c | 276 + gio/gactionmap.h | 97 + gio/gappinfo.c | 1029 + gio/gappinfo.h | 301 + gio/gapplication.c | 1851 ++ gio/gapplication.h | 201 + gio/gapplicationcommandline.c | 699 + gio/gapplicationcommandline.h | 121 + gio/gapplicationimpl-dbus.c | 778 + gio/gapplicationimpl.h | 41 + gio/gasynchelper.c | 219 + gio/gasynchelper.h | 51 + gio/gasyncinitable.c | 458 + gio/gasyncinitable.h | 126 + gio/gasyncresult.c | 235 + gio/gasyncresult.h | 87 + gio/gbufferedinputstream.c | 1276 + gio/gbufferedinputstream.h | 135 + gio/gbufferedoutputstream.c | 759 + gio/gbufferedoutputstream.h | 88 + gio/gcancellable.c | 758 + gio/gcancellable.h | 120 + gio/gcharsetconverter.c | 473 + gio/gcharsetconverter.h | 65 + gio/gcontenttype-win32.c | 390 + gio/gcontenttype.c | 1415 ++ gio/gcontenttype.h | 73 + gio/gcontenttypeprivate.h | 36 + gio/gconverter.c | 202 + gio/gconverter.h | 98 + gio/gconverterinputstream.c | 654 + gio/gconverterinputstream.h | 82 + gio/gconverteroutputstream.c | 694 + gio/gconverteroutputstream.h | 82 + gio/gcredentials.c | 534 + gio/gcredentials.h | 87 + gio/gdatainputstream.c | 1467 ++ gio/gdatainputstream.h | 182 + gio/gdataoutputstream.c | 604 + gio/gdataoutputstream.h | 127 + gio/gdbus-2.0/codegen/.gitignore | 2 + gio/gdbus-2.0/codegen/Makefile.am | 30 + gio/gdbus-2.0/codegen/__init__.py | 29 + gio/gdbus-2.0/codegen/codegen.py | 3375 +++ gio/gdbus-2.0/codegen/codegen_docbook.py | 331 + gio/gdbus-2.0/codegen/codegen_main.py | 203 + gio/gdbus-2.0/codegen/config.py.in | 27 + gio/gdbus-2.0/codegen/dbustypes.py | 426 + gio/gdbus-2.0/codegen/gdbus-codegen.in | 41 + gio/gdbus-2.0/codegen/parser.py | 290 + gio/gdbus-2.0/codegen/utils.py | 104 + gio/gdbus-tool.c | 2107 ++ gio/gdbusactiongroup-private.h | 37 + gio/gdbusactiongroup.c | 541 + gio/gdbusactiongroup.h | 56 + gio/gdbusaddress.c | 1635 ++ gio/gdbusaddress.h | 67 + gio/gdbusauth.c | 1382 ++ gio/gdbusauth.h | 87 + gio/gdbusauthmechanism.c | 341 + gio/gdbusauthmechanism.h | 154 + gio/gdbusauthmechanismanon.c | 326 + gio/gdbusauthmechanismanon.h | 63 + gio/gdbusauthmechanismexternal.c | 404 + gio/gdbusauthmechanismexternal.h | 63 + gio/gdbusauthmechanismsha1.c | 1225 + gio/gdbusauthmechanismsha1.h | 63 + gio/gdbusauthobserver.c | 280 + gio/gdbusauthobserver.h | 53 + gio/gdbusconnection.c | 7016 ++++++ gio/gdbusconnection.h | 640 + gio/gdbusdaemon.c | 1752 ++ gio/gdbusdaemon.h | 19 + gio/gdbuserror.c | 882 + gio/gdbuserror.h | 111 + gio/gdbusinterface.c | 142 + gio/gdbusinterface.h | 83 + gio/gdbusinterfaceskeleton.c | 1009 + gio/gdbusinterfaceskeleton.h | 129 + gio/gdbusintrospection.c | 2192 ++ gio/gdbusintrospection.h | 327 + gio/gdbusmenumodel.c | 931 + gio/gdbusmenumodel.h | 47 + gio/gdbusmessage.c | 3621 +++ gio/gdbusmessage.h | 199 + gio/gdbusmethodinvocation.c | 672 + gio/gdbusmethodinvocation.h | 97 + gio/gdbusnameowning.c | 959 + gio/gdbusnameowning.h | 117 + gio/gdbusnamewatching.c | 851 + gio/gdbusnamewatching.h | 104 + gio/gdbusobject.c | 147 + gio/gdbusobject.h | 80 + gio/gdbusobjectmanager.c | 227 + gio/gdbusobjectmanager.h | 96 + gio/gdbusobjectmanagerclient.c | 1745 ++ gio/gdbusobjectmanagerclient.h | 148 + gio/gdbusobjectmanagerserver.c | 1144 + gio/gdbusobjectmanagerserver.h | 95 + gio/gdbusobjectproxy.c | 361 + gio/gdbusobjectproxy.h | 81 + gio/gdbusobjectskeleton.c | 512 + gio/gdbusobjectskeleton.h | 98 + gio/gdbusprivate.c | 2237 ++ gio/gdbusprivate.h | 151 + gio/gdbusproxy.c | 3257 +++ gio/gdbusproxy.h | 216 + gio/gdbusserver.c | 1136 + gio/gdbusserver.h | 62 + gio/gdbusutils.c | 734 + gio/gdbusutils.h | 57 + gio/gdelayedsettingsbackend.c | 493 + gio/gdelayedsettingsbackend.h | 67 + gio/gdesktopappinfo.c | 3544 +++ gio/gdesktopappinfo.h | 158 + gio/gdrive.c | 918 + gio/gdrive.h | 261 + gio/gdummyfile.c | 753 + gio/gdummyfile.h | 51 + gio/gdummyproxyresolver.c | 135 + gio/gdummyproxyresolver.h | 54 + gio/gdummytlsbackend.c | 386 + gio/gdummytlsbackend.h | 46 + gio/gemblem.c | 359 + gio/gemblem.h | 63 + gio/gemblemedicon.c | 423 + gio/gemblemedicon.h | 83 + gio/gfile.c | 7377 ++++++ gio/gfile.h | 1154 + gio/gfileattribute-priv.h | 93 + gio/gfileattribute.c | 1057 + gio/gfileattribute.h | 86 + gio/gfiledescriptorbased.c | 73 + gio/gfiledescriptorbased.h | 65 + gio/gfileenumerator.c | 740 + gio/gfileenumerator.h | 146 + gio/gfileicon.c | 340 + gio/gfileicon.h | 59 + gio/gfileinfo-priv.h | 142 + gio/gfileinfo.c | 2705 ++ gio/gfileinfo.h | 1057 + gio/gfileinputstream.c | 434 + gio/gfileinputstream.h | 116 + gio/gfileiostream.c | 668 + gio/gfileiostream.h | 123 + gio/gfilemonitor.c | 738 + gio/gfilemonitor.h | 100 + gio/gfilenamecompleter.c | 512 + gio/gfilenamecompleter.h | 81 + gio/gfileoutputstream.c | 537 + gio/gfileoutputstream.h | 124 + gio/gfilterinputstream.c | 315 + gio/gfilterinputstream.h | 80 + gio/gfilteroutputstream.c | 311 + gio/gfilteroutputstream.h | 80 + gio/gicon.c | 449 + gio/gicon.h | 96 + gio/ginetaddress.c | 885 + gio/ginetaddress.h | 126 + gio/ginetaddressmask.c | 474 + gio/ginetaddressmask.h | 87 + gio/ginetsocketaddress.c | 422 + gio/ginetsocketaddress.h | 77 + gio/ginitable.c | 238 + gio/ginitable.h | 101 + gio/ginputstream.c | 1363 + gio/ginputstream.h | 203 + gio/gio-querymodules.c | 146 + gio/gio.h | 164 + gio/gio.rc.in | 30 + gio/gioenums.h | 1663 ++ gio/gioenumtypes.c.template | 38 + gio/gioenumtypes.h.template | 24 + gio/gioerror.c | 253 + gio/gioerror.h | 55 + gio/giomodule-priv.h | 48 + gio/giomodule.c | 1392 ++ gio/giomodule.h | 167 + gio/gioscheduler.c | 324 + gio/gioscheduler.h | 56 + gio/giostream.c | 832 + gio/giostream.h | 135 + gio/giotypes.h | 473 + gio/gkeyfilesettingsbackend.c | 666 + gio/glib-compile-resources.c | 949 + gio/glib-compile-schemas.c | 2133 ++ gio/gloadableicon.c | 232 + gio/gloadableicon.h | 101 + gio/glocaldirectorymonitor.c | 270 + gio/glocaldirectorymonitor.h | 76 + gio/glocalfile.c | 2555 ++ gio/glocalfile.h | 51 + gio/glocalfileenumerator.c | 456 + gio/glocalfileenumerator.h | 57 + gio/glocalfileinfo.c | 2654 ++ gio/glocalfileinfo.h | 100 + gio/glocalfileinputstream.c | 369 + gio/glocalfileinputstream.h | 63 + gio/glocalfileiostream.c | 118 + gio/glocalfileiostream.h | 60 + gio/glocalfilemonitor.c | 179 + gio/glocalfilemonitor.h | 69 + gio/glocalfileoutputstream.c | 1200 + gio/glocalfileoutputstream.h | 92 + gio/glocalvfs.c | 218 + gio/glocalvfs.h | 46 + gio/gmemoryinputstream.c | 532 + gio/gmemoryinputstream.h | 92 + gio/gmemoryoutputstream.c | 811 + gio/gmemoryoutputstream.h | 109 + gio/gmemorysettingsbackend.c | 194 + gio/gmenu.c | 1336 + gio/gmenu.h | 177 + gio/gmenuexporter.c | 813 + gio/gmenuexporter.h | 42 + gio/gmenumodel.c | 1021 + gio/gmenumodel.h | 276 + gio/gmount.c | 1054 + gio/gmount.h | 278 + gio/gmountoperation.c | 758 + gio/gmountoperation.h | 142 + gio/gmountprivate.h | 35 + gio/gnativevolumemonitor.c | 52 + gio/gnativevolumemonitor.h | 63 + gio/gnetworkaddress.c | 1031 + gio/gnetworkaddress.h | 80 + gio/gnetworking.c | 79 + gio/gnetworking.h.in | 83 + gio/gnetworking.h.win32 | 82 + gio/gnetworkingprivate.h | 44 + gio/gnetworkmonitor.c | 286 + gio/gnetworkmonitor.h | 95 + gio/gnetworkmonitorbase.c | 416 + gio/gnetworkmonitorbase.h | 70 + gio/gnetworkmonitornetlink.c | 468 + gio/gnetworkmonitornetlink.h | 57 + gio/gnetworkservice.c | 750 + gio/gnetworkservice.h | 78 + gio/gnextstepsettingsbackend.c | 482 + gio/gnullsettingsbackend.c | 139 + gio/goutputstream.c | 1680 ++ gio/goutputstream.h | 242 + gio/gpermission.c | 469 + gio/gpermission.h | 129 + gio/gpollableinputstream.c | 221 + gio/gpollableinputstream.h | 107 + gio/gpollableoutputstream.c | 222 + gio/gpollableoutputstream.h | 107 + gio/gpollableutils.c | 350 + gio/gpollableutils.h | 66 + gio/gpollfilemonitor.c | 232 + gio/gpollfilemonitor.h | 50 + gio/gproxy.c | 209 + gio/gproxy.h | 130 + gio/gproxyaddress.c | 449 + gio/gproxyaddress.h | 88 + gio/gproxyaddressenumerator.c | 756 + gio/gproxyaddressenumerator.h | 76 + gio/gproxyresolver.c | 197 + gio/gproxyresolver.h | 97 + gio/gregistrysettingsbackend.c | 1971 ++ gio/gregistrysettingsbackend.h | 30 + gio/gremoteactiongroup.c | 136 + gio/gremoteactiongroup.h | 77 + gio/gresolver.c | 858 + gio/gresolver.h | 214 + gio/gresource-tool.c | 645 + gio/gresource.c | 1028 + gio/gresource.h | 131 + gio/gresourcefile.c | 878 + gio/gresourcefile.h | 51 + gio/gschema.dtd | 73 + gio/gseekable.c | 176 + gio/gseekable.h | 105 + gio/gsettings-mapping.c | 594 + gio/gsettings-mapping.h | 36 + gio/gsettings-tool.c | 834 + gio/gsettings.c | 3130 +++ gio/gsettings.h | 326 + gio/gsettingsbackend.c | 1035 + gio/gsettingsbackend.h | 156 + gio/gsettingsbackendinternal.h | 93 + gio/gsettingsschema-internal.h | 75 + gio/gsettingsschema.c | 1036 + gio/gsettingsschema.h | 65 + gio/gsimpleaction.c | 554 + gio/gsimpleaction.h | 61 + gio/gsimpleactiongroup.c | 389 + gio/gsimpleactiongroup.h | 99 + gio/gsimpleasyncresult.c | 1106 + gio/gsimpleasyncresult.h | 164 + gio/gsimplepermission.c | 85 + gio/gsimplepermission.h | 47 + gio/gsimpleproxyresolver.c | 596 + gio/gsimpleproxyresolver.h | 91 + gio/gsocket.c | 4531 ++++ gio/gsocket.h | 291 + gio/gsocketaddress.c | 417 + gio/gsocketaddress.h | 84 + gio/gsocketaddressenumerator.c | 177 + gio/gsocketaddressenumerator.h | 93 + gio/gsocketclient.c | 1962 ++ gio/gsocketclient.h | 199 + gio/gsocketconnectable.c | 153 + gio/gsocketconnectable.h | 77 + gio/gsocketconnection.c | 657 + gio/gsocketconnection.h | 117 + gio/gsocketcontrolmessage.c | 215 + gio/gsocketcontrolmessage.h | 111 + gio/gsocketinputstream.c | 228 + gio/gsocketinputstream.h | 58 + gio/gsocketlistener.c | 1126 + gio/gsocketlistener.h | 152 + gio/gsocketoutputstream.c | 232 + gio/gsocketoutputstream.h | 58 + gio/gsocketservice.c | 332 + gio/gsocketservice.h | 93 + gio/gsocks4aproxy.c | 459 + gio/gsocks4aproxy.h | 55 + gio/gsocks4proxy.c | 71 + gio/gsocks4proxy.h | 44 + gio/gsocks5proxy.c | 1043 + gio/gsocks5proxy.h | 48 + gio/gsrvtarget.c | 314 + gio/gsrvtarget.h | 61 + gio/gtask.c | 1843 ++ gio/gtask.h | 160 + gio/gtcpconnection.c | 334 + gio/gtcpconnection.h | 71 + gio/gtcpwrapperconnection.c | 199 + gio/gtcpwrapperconnection.h | 71 + gio/gtestdbus.c | 762 + gio/gtestdbus.h | 74 + gio/gthemedicon.c | 522 + gio/gthemedicon.h | 70 + gio/gthreadedresolver.c | 784 + gio/gthreadedresolver.h | 51 + gio/gthreadedsocketservice.c | 272 + gio/gthreadedsocketservice.h | 83 + gio/gtlsbackend.c | 216 + gio/gtlsbackend.h | 98 + gio/gtlscertificate.c | 598 + gio/gtlscertificate.h | 94 + gio/gtlsclientconnection.c | 337 + gio/gtlsclientconnection.h | 73 + gio/gtlsconnection.c | 860 + gio/gtlsconnection.h | 156 + gio/gtlsdatabase.c | 928 + gio/gtlsdatabase.h | 249 + gio/gtlsfiledatabase.c | 105 + gio/gtlsfiledatabase.h | 58 + gio/gtlsinteraction.c | 536 + gio/gtlsinteraction.h | 107 + gio/gtlspassword.c | 454 + gio/gtlspassword.h | 112 + gio/gtlsserverconnection.c | 96 + gio/gtlsserverconnection.h | 63 + gio/gunionvolumemonitor.c | 690 + gio/gunionvolumemonitor.h | 49 + gio/gunixconnection.c | 684 + gio/gunixconnection.h | 100 + gio/gunixcredentialsmessage.c | 389 + gio/gunixcredentialsmessage.h | 87 + gio/gunixfdlist.c | 397 + gio/gunixfdlist.h | 96 + gio/gunixfdmessage.c | 325 + gio/gunixfdmessage.h | 84 + gio/gunixinputstream.c | 534 + gio/gunixinputstream.h | 83 + gio/gunixmount.c | 486 + gio/gunixmount.h | 59 + gio/gunixmounts.c | 2376 ++ gio/gunixmounts.h | 141 + gio/gunixoutputstream.c | 498 + gio/gunixoutputstream.h | 82 + gio/gunixsocketaddress.c | 527 + gio/gunixsocketaddress.h | 81 + gio/gunixvolume.c | 526 + gio/gunixvolume.h | 60 + gio/gunixvolumemonitor.c | 418 + gio/gunixvolumemonitor.h | 63 + gio/gvdb/gvdb-builder.c | 516 + gio/gvdb/gvdb-builder.h | 57 + gio/gvdb/gvdb-format.h | 87 + gio/gvdb/gvdb-reader.c | 752 + gio/gvdb/gvdb-reader.h | 90 + gio/gvdb/gvdb.doap | 32 + gio/gvfs.c | 220 + gio/gvfs.h | 133 + gio/gvolume.c | 693 + gio/gvolume.h | 256 + gio/gvolumemonitor.c | 391 + gio/gvolumemonitor.h | 156 + gio/gwin32appinfo.c | 699 + gio/gwin32appinfo.h | 50 + gio/gwin32inputstream.c | 394 + gio/gwin32inputstream.h | 84 + gio/gwin32mount.c | 367 + gio/gwin32mount.h | 57 + gio/gwin32outputstream.c | 382 + gio/gwin32outputstream.h | 83 + gio/gwin32volumemonitor.c | 257 + gio/gwin32volumemonitor.h | 65 + gio/gzlibcompressor.c | 438 + gio/gzlibcompressor.h | 64 + gio/gzlibdecompressor.c | 415 + gio/gzlibdecompressor.h | 60 + gio/inotify/Makefile.am | 32 + gio/inotify/ginotifydirectorymonitor.c | 156 + gio/inotify/ginotifydirectorymonitor.h | 53 + gio/inotify/ginotifyfilemonitor.c | 181 + gio/inotify/ginotifyfilemonitor.h | 54 + gio/inotify/inotify-helper.c | 294 + gio/inotify/inotify-helper.h | 33 + gio/inotify/inotify-kernel.c | 683 + gio/inotify/inotify-kernel.h | 63 + gio/inotify/inotify-missing.c | 167 + gio/inotify/inotify-missing.h | 35 + gio/inotify/inotify-path.c | 664 + gio/inotify/inotify-path.h | 33 + gio/inotify/inotify-sub.c | 74 + gio/inotify/inotify-sub.h | 44 + gio/kqueue/Makefile.am | 35 + gio/kqueue/dep-list.c | 521 + gio/kqueue/dep-list.h | 69 + gio/kqueue/gkqueuedirectorymonitor.c | 205 + gio/kqueue/gkqueuedirectorymonitor.h | 49 + gio/kqueue/gkqueuefilemonitor.c | 209 + gio/kqueue/gkqueuefilemonitor.h | 51 + gio/kqueue/kqueue-exclusions.c | 65 + gio/kqueue/kqueue-exclusions.h | 28 + gio/kqueue/kqueue-helper.c | 646 + gio/kqueue/kqueue-helper.h | 37 + gio/kqueue/kqueue-missing.c | 157 + gio/kqueue/kqueue-missing.h | 32 + gio/kqueue/kqueue-sub.c | 79 + gio/kqueue/kqueue-sub.h | 50 + gio/kqueue/kqueue-thread.c | 310 + gio/kqueue/kqueue-thread.h | 45 + gio/kqueue/kqueue-utils.c | 242 + gio/kqueue/kqueue-utils.h | 57 + gio/makefile.msc | 259 + gio/strinfo.c | 350 + gio/tests/.gitignore | 118 + gio/tests/Makefile.am | 467 + gio/tests/actions.c | 847 + gio/tests/appinfo-test-gnome.desktop | 6 + gio/tests/appinfo-test-notgnome.desktop | 6 + gio/tests/appinfo-test.c | 20 + gio/tests/appinfo-test.desktop | 17 + gio/tests/appinfo-test2.desktop | 11 + gio/tests/appinfo.c | 449 + gio/tests/async-close-output-stream.c | 283 + gio/tests/basic-application.c | 83 + gio/tests/buffered-input-stream.c | 553 + gio/tests/buffered-output-stream.c | 319 + gio/tests/cancellable.c | 229 + gio/tests/cert-key.pem | 32 + gio/tests/cert-list.pem | 52 + gio/tests/cert1.pem | 17 + gio/tests/cert2.pem | 17 + gio/tests/cert3.pem | 17 + gio/tests/contenttype.c | 217 + gio/tests/contexts.c | 202 + gio/tests/converter-stream.c | 1201 + gio/tests/credentials.c | 127 + gio/tests/data-input-stream.c | 502 + gio/tests/data-output-stream.c | 508 + gio/tests/de.po | 17 + gio/tests/desktop-app-info.c | 399 + gio/tests/echo-server.c | 70 + gio/tests/enums.xml.template | 18 + gio/tests/file.c | 751 + gio/tests/fileattributematcher.c | 176 + gio/tests/filter-cat.c | 261 + gio/tests/filter-streams.c | 392 + gio/tests/g-file-info.c | 126 + gio/tests/g-file.c | 537 + gio/tests/g-icon.c | 382 + gio/tests/gapplication-example-actions.c | 122 + gio/tests/gapplication-example-cmdline.c | 43 + gio/tests/gapplication-example-cmdline2.c | 106 + gio/tests/gapplication-example-cmdline3.c | 106 + gio/tests/gapplication-example-dbushooks.c | 97 + gio/tests/gapplication-example-open.c | 56 + gio/tests/gapplication.c | 527 + gio/tests/gdbus-addresses.c | 146 + gio/tests/gdbus-auth.c | 311 + gio/tests/gdbus-bz627724.c | 89 + gio/tests/gdbus-close-pending.c | 395 + gio/tests/gdbus-connection-flush-helper.c | 58 + gio/tests/gdbus-connection-flush.c | 383 + gio/tests/gdbus-connection-loss.c | 142 + gio/tests/gdbus-connection-slow.c | 207 + gio/tests/gdbus-connection.c | 1159 + gio/tests/gdbus-daemon.c | 70 + gio/tests/gdbus-error.c | 268 + gio/tests/gdbus-example-export.c | 334 + .../gdbus-example-objectmanager-client.c | 168 + .../gdbus-example-objectmanager-server.c | 160 + gio/tests/gdbus-example-own-name.c | 84 + gio/tests/gdbus-example-peer.c | 306 + gio/tests/gdbus-example-proxy-subclass.c | 358 + gio/tests/gdbus-example-server.c | 390 + gio/tests/gdbus-example-subtree.c | 398 + gio/tests/gdbus-example-unix-fd-client.c | 132 + gio/tests/gdbus-example-watch-name.c | 86 + gio/tests/gdbus-example-watch-proxy.c | 230 + gio/tests/gdbus-exit-on-close.c | 217 + gio/tests/gdbus-export.c | 1554 ++ gio/tests/gdbus-introspection.c | 326 + gio/tests/gdbus-message.c | 158 + gio/tests/gdbus-names.c | 787 + gio/tests/gdbus-non-socket.c | 301 + .../gdbus-object-manager-example/Makefile.am | 50 + .../gdbus-example-objectmanager.xml | 78 + gio/tests/gdbus-peer-object-manager.c | 365 + gio/tests/gdbus-peer.c | 1871 ++ gio/tests/gdbus-proxy-threads.c | 249 + gio/tests/gdbus-proxy-well-known-name.c | 273 + gio/tests/gdbus-proxy.c | 941 + gio/tests/gdbus-serialization.c | 1072 + gio/tests/gdbus-sessionbus.c | 49 + gio/tests/gdbus-sessionbus.h | 36 + gio/tests/gdbus-test-codegen.c | 2372 ++ gio/tests/gdbus-test-fixture.c | 112 + gio/tests/gdbus-tests.c | 159 + gio/tests/gdbus-tests.h | 121 + gio/tests/gdbus-testserver.c | 889 + gio/tests/gdbus-threading.c | 613 + gio/tests/gmenumodel.c | 1164 + gio/tests/gschema-compile.c | 144 + gio/tests/gsettings.c | 2226 ++ gio/tests/gtesttlsbackend.c | 312 + gio/tests/gtesttlsbackend.h | 49 + gio/tests/gtlsconsoleinteraction.c | 156 + gio/tests/gtlsconsoleinteraction.h | 56 + gio/tests/httpd.c | 181 + gio/tests/inet-address.c | 402 + gio/tests/io-stream.c | 185 + gio/tests/key-cert.pem | 32 + gio/tests/key.pem | 15 + gio/tests/key8.pem | 16 + gio/tests/live-g-file.c | 1335 + gio/tests/live-g-file.txt | 27 + gio/tests/memory-input-stream.c | 279 + gio/tests/memory-output-stream.c | 230 + gio/tests/mimeapps.c | 594 + gio/tests/network-address.c | 127 + gio/tests/network-monitor.c | 549 + gio/tests/nothing.pem | 0 .../org.gtk.schemasourcecheck.gschema.xml | 7 + gio/tests/org.gtk.test.gschema | 39 + gio/tests/org.gtk.test.gschema.xml | 170 + gio/tests/permission.c | 117 + gio/tests/pollable.c | 290 + gio/tests/proxy-test.c | 1293 + gio/tests/proxy.c | 660 + gio/tests/readwrite.c | 297 + gio/tests/resolver.c | 744 + gio/tests/resourceplugin.c | 18 + gio/tests/resources.c | 651 + .../array-default-not-in-choices.gschema.xml | 11 + gio/tests/schema-tests/bad-choice.gschema.xml | 14 + gio/tests/schema-tests/bad-key.gschema.xml | 7 + gio/tests/schema-tests/bad-key2.gschema.xml | 7 + gio/tests/schema-tests/bad-key3.gschema.xml | 7 + gio/tests/schema-tests/bad-key4.gschema.xml | 7 + gio/tests/schema-tests/bad-type.gschema.xml | 7 + gio/tests/schema-tests/bare-alias.gschema.xml | 7 + gio/tests/schema-tests/cdata.gschema.xml | 7 + .../schema-tests/choice-alias.gschema.xml | 15 + gio/tests/schema-tests/choice-bad.gschema.xml | 14 + .../schema-tests/choice-badtype.gschema.xml | 7 + .../choice-invalid-alias.gschema.xml | 15 + .../choice-missing-value.gschema.xml | 10 + .../choice-shadowed-alias.gschema.xml | 14 + .../choice-upside-down.gschema.xml | 14 + gio/tests/schema-tests/choice.gschema.xml | 14 + .../choices-wrong-type.gschema.xml | 8 + .../default-in-aliases.gschema.xml | 15 + .../default-not-in-choices.gschema.xml | 11 + .../default-out-of-range.gschema.xml | 8 + gio/tests/schema-tests/empty-key.gschema.xml | 7 + .../enum-with-aliases.gschema.xml | 20 + .../enum-with-bad-default.gschema.xml | 16 + .../enum-with-chained-alias.gschema.xml | 21 + .../schema-tests/enum-with-choice.gschema.xml | 17 + .../enum-with-invalid-alias.gschema.xml | 20 + .../enum-with-repeated-alias.gschema.xml | 21 + .../enum-with-repeated-nick.gschema.xml | 10 + .../enum-with-repeated-value.gschema.xml | 10 + .../enum-with-shadow-alias.gschema.xml | 20 + gio/tests/schema-tests/enum.gschema.xml | 16 + .../extend-and-shadow-indirect.gschema.xml | 17 + .../extend-and-shadow.gschema.xml | 17 + .../schema-tests/extend-missing.gschema.xml | 3 + .../schema-tests/extend-nonlist.gschema.xml | 4 + .../schema-tests/extend-self.gschema.xml | 3 + .../extend-wrong-list-indirect.gschema.xml | 6 + .../extend-wrong-list.gschema.xml | 5 + gio/tests/schema-tests/extending.gschema.xml | 21 + .../flags-aliased-default.gschema.xml | 19 + .../flags-bad-default.gschema.xml | 16 + .../flags-more-than-one-bit.gschema.xml | 10 + .../flags-with-enum-attr.gschema.xml | 14 + .../flags-with-enum-tag.gschema.xml | 14 + gio/tests/schema-tests/from-docs.gschema.xml | 34 + .../schema-tests/incomplete-list.gschema.xml | 7 + .../inherit-gettext-domain.gschema.xml | 8 + .../schema-tests/invalid-path.gschema.xml | 3 + .../key-in-list-indirect.gschema.xml | 8 + .../schema-tests/key-in-list.gschema.xml | 6 + .../schema-tests/list-of-missing.gschema.xml | 3 + .../schema-tests/missing-quotes.gschema.xml | 7 + gio/tests/schema-tests/no-default.gschema.xml | 6 + gio/tests/schema-tests/overflow.gschema.xml | 7 + .../schema-tests/override-missing.gschema.xml | 11 + .../override-range-error.gschema.xml | 12 + .../override-then-key.gschema.xml | 15 + .../schema-tests/override-twice.gschema.xml | 12 + .../override-type-error.gschema.xml | 11 + gio/tests/schema-tests/override.gschema.xml | 34 + .../schema-tests/range-badtype.gschema.xml | 7 + .../range-default-high.gschema.xml | 8 + .../range-default-low.gschema.xml | 8 + .../range-high-default.gschema.xml | 8 + .../range-low-default.gschema.xml | 8 + .../range-missing-max.gschema.xml | 8 + .../range-missing-min.gschema.xml | 8 + .../range-parse-error.gschema.xml | 8 + .../schema-tests/range-type-test.gschema.xml | 76 + .../schema-tests/range-wrong-type.gschema.xml | 8 + gio/tests/schema-tests/range.gschema.xml | 8 + .../schema-tests/wrong-category.gschema.xml | 7 + gio/tests/send-data.c | 207 + gio/tests/services/Makefile.am | 2 + ...tk.GDBus.Examples.ObjectManager.service.in | 3 + gio/tests/simple-async-result.c | 130 + gio/tests/simple-proxy.c | 236 + gio/tests/sleepy-stream.c | 292 + gio/tests/socket-client.c | 444 + gio/tests/socket-common.c | 123 + gio/tests/socket-server.c | 366 + gio/tests/socket.c | 851 + gio/tests/srvtarget.c | 157 + gio/tests/task.c | 1736 ++ gio/tests/test-codegen.xml | 480 + gio/tests/test-io-stream.c | 104 + gio/tests/test-io-stream.h | 53 + gio/tests/test-pipe-unix.c | 131 + gio/tests/test-pipe-unix.h | 37 + gio/tests/test.gresource.xml | 11 + gio/tests/test1.txt | 1 + gio/tests/test2.gresource.xml | 6 + gio/tests/test2.txt | 1 + gio/tests/test3.gresource.xml | 6 + gio/tests/test3.txt | 1 + gio/tests/test4.gresource.xml | 6 + gio/tests/testenum.h | 16 + gio/tests/tls-certificate.c | 313 + gio/tests/tls-interaction.c | 664 + gio/tests/unix-fd.c | 242 + gio/tests/unix-streams.c | 363 + gio/tests/vfs.c | 54 + gio/tests/volumemonitor.c | 181 + gio/tests/win32-streams.c | 536 + gio/win32/Makefile.am | 28 + gio/win32/gwin32directorymonitor.c | 246 + gio/win32/gwin32directorymonitor.h | 62 + gio/win32/gwinhttpfile.c | 785 + gio/win32/gwinhttpfile.h | 64 + gio/win32/gwinhttpfileinputstream.c | 177 + gio/win32/gwinhttpfileinputstream.h | 52 + gio/win32/gwinhttpfileoutputstream.c | 185 + gio/win32/gwinhttpfileoutputstream.h | 51 + gio/win32/gwinhttpvfs.c | 470 + gio/win32/gwinhttpvfs.h | 108 + gio/win32/makefile.msc | 35 + gio/win32/winhttp.h | 248 + gio/xdgmime/.gitignore | 1 + gio/xdgmime/Makefile.am | 24 + gio/xdgmime/xdgmime.c | 946 + gio/xdgmime/xdgmime.h | 137 + gio/xdgmime/xdgmimealias.c | 186 + gio/xdgmime/xdgmimealias.h | 52 + gio/xdgmime/xdgmimecache.c | 1094 + gio/xdgmime/xdgmimecache.h | 87 + gio/xdgmime/xdgmimeglob.c | 732 + gio/xdgmime/xdgmimeglob.h | 72 + gio/xdgmime/xdgmimeicon.c | 185 + gio/xdgmime/xdgmimeicon.h | 52 + gio/xdgmime/xdgmimeint.c | 191 + gio/xdgmime/xdgmimeint.h | 77 + gio/xdgmime/xdgmimemagic.c | 818 + gio/xdgmime/xdgmimemagic.h | 57 + gio/xdgmime/xdgmimeparent.c | 222 + gio/xdgmime/xdgmimeparent.h | 53 + glib-2.0.pc.in | 16 + glib-gettextize.in | 188 + glib-zip.in | 94 + glib.doap | 47 + glib/.gitignore | 12 + glib/Makefile.am | 504 + glib/deprecated/gallocator.c | 104 + glib/deprecated/gallocator.h | 90 + glib/deprecated/gcache.c | 347 + glib/deprecated/gcache.h | 73 + glib/deprecated/gcompletion.c | 502 + glib/deprecated/gcompletion.h | 85 + glib/deprecated/gmain.h | 138 + glib/deprecated/grel.c | 683 + glib/deprecated/grel.h | 107 + glib/deprecated/gthread-deprecated.c | 1600 ++ glib/deprecated/gthread.h | 286 + glib/docs.c | 2397 ++ glib/galloca.h | 110 + glib/garray.c | 1808 ++ glib/garray.h | 236 + glib/gasyncqueue.c | 802 + glib/gasyncqueue.h | 111 + glib/gasyncqueueprivate.h | 31 + glib/gatomic.c | 871 + glib/gatomic.h | 232 + glib/gbacktrace.c | 375 + glib/gbacktrace.h | 66 + glib/gbase64.c | 445 + glib/gbase64.h | 63 + glib/gbitlock.c | 537 + glib/gbitlock.h | 78 + glib/gbookmarkfile.c | 3708 +++ glib/gbookmarkfile.h | 255 + glib/gbsearcharray.h | 303 + glib/gbytes.c | 486 + glib/gbytes.h | 92 + glib/gcharset.c | 592 + glib/gcharset.h | 44 + glib/gcharsetprivate.h | 32 + glib/gchecksum.c | 1809 ++ glib/gchecksum.h | 103 + glib/gconstructor.h | 91 + glib/gconvert.c | 2247 ++ glib/gconvert.h | 200 + glib/gdataset.c | 1244 + glib/gdataset.h | 152 + glib/gdatasetprivate.h | 44 + glib/gdate.c | 2551 ++ glib/gdate.h | 311 + glib/gdatetime.c | 2754 +++ glib/gdatetime.h | 264 + glib/gdir.c | 323 + glib/gdir.h | 62 + glib/gen-iswide-table.py | 58 + glib/gen-script-table.pl | 119 + glib/gen-unicode-tables.pl | 1340 + glib/genviron.c | 713 + glib/genviron.h | 80 + glib/gerror.c | 728 + glib/gerror.h | 119 + glib/gfileutils.c | 2671 ++ glib/gfileutils.h | 208 + glib/ggettext.c | 622 + glib/ggettext.h | 65 + glib/ghash.c | 1905 ++ glib/ghash.h | 184 + glib/ghmac.c | 400 + glib/ghmac.h | 80 + glib/ghook.c | 1054 + glib/ghook.h | 204 + glib/ghostutils.c | 800 + glib/ghostutils.h | 45 + glib/gi18n-lib.h | 38 + glib/gi18n.h | 34 + glib/giochannel.c | 2588 ++ glib/giochannel.h | 415 + glib/giounix.c | 656 + glib/giowin32.c | 2245 ++ glib/gkeyfile.c | 4374 ++++ glib/gkeyfile.h | 315 + glib/glib-init.c | 273 + glib/glib-init.h | 40 + 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 | 42 + glib/glib-private.c | 51 + glib/glib-private.h | 58 + glib/glib-unix.c | 424 + glib/glib-unix.h | 123 + glib/glib.h | 114 + glib/glib.py | 253 + glib/glib.rc.in | 30 + glib/glib.stp.in | 84 + glib/glib_probes.d | 8 + glib/glib_trace.h | 43 + glib/glibconfig.h.win32.in | 266 + glib/glibintl.h | 44 + glib/glist.c | 1180 + glib/glist.h | 154 + glib/gmacros.h | 347 + glib/gmain-internal.h | 35 + glib/gmain.c | 5462 ++++ glib/gmain.h | 611 + glib/gmappedfile.c | 428 + glib/gmappedfile.h | 60 + glib/gmarkup.c | 2867 +++ glib/gmarkup.h | 257 + glib/gmem.c | 919 + glib/gmem.h | 301 + glib/gmessages.c | 1554 ++ glib/gmessages.h | 419 + glib/gmirroringtable.h | 901 + glib/gnode.c | 1252 + glib/gnode.h | 324 + glib/gnulib/Makefile.am | 27 + glib/gnulib/README | 44 + glib/gnulib/asnprintf.c | 40 + glib/gnulib/g-gnulib.h | 49 + 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 | 1084 + glib/gnulib/vasnprintf.h | 61 + glib/goption.c | 2460 ++ glib/goption.h | 396 + glib/gpattern.c | 447 + glib/gpattern.h | 55 + glib/gpoll.c | 432 + glib/gpoll.h | 121 + glib/gprimes.c | 98 + glib/gprimes.h | 52 + glib/gprintf.c | 340 + glib/gprintf.h | 59 + glib/gprintfint.h | 59 + glib/gqsort.c | 306 + glib/gqsort.h | 47 + glib/gquark.c | 361 + glib/gquark.h | 70 + glib/gqueue.c | 1072 + glib/gqueue.h | 192 + glib/grand.c | 696 + glib/grand.h | 101 + glib/gregex.c | 3120 +++ glib/gregex.h | 601 + glib/gscanner.c | 2260 ++ glib/gscanner.h | 305 + glib/gscripttable.h | 3120 +++ glib/gsequence.c | 2009 ++ glib/gsequence.h | 173 + glib/gshell.c | 700 + glib/gshell.h | 59 + glib/gslice.c | 1718 ++ glib/gslice.h | 100 + glib/gslist.c | 1098 + glib/gslist.h | 145 + glib/gspawn-win32-helper.c | 333 + glib/gspawn-win32.c | 1512 ++ glib/gspawn.c | 1842 ++ glib/gspawn.h | 305 + glib/gstdio.c | 880 + glib/gstdio.h | 172 + glib/gstrfuncs.c | 2813 +++ glib/gstrfuncs.h | 293 + glib/gstring.c | 1270 + glib/gstring.h | 191 + glib/gstringchunk.c | 327 + glib/gstringchunk.h | 59 + glib/gtester-report | 492 + glib/gtester.c | 734 + glib/gtestutils.c | 2625 ++ glib/gtestutils.h | 364 + glib/gthread-posix.c | 1186 + glib/gthread-win32.c | 1033 + glib/gthread.c | 1067 + glib/gthread.h | 273 + glib/gthreadpool.c | 1017 + glib/gthreadpool.h | 94 + glib/gthreadprivate.h | 61 + glib/gtimer.c | 557 + glib/gtimer.h | 76 + glib/gtimezone.c | 1876 ++ glib/gtimezone.h | 91 + glib/gtrashstack.c | 94 + glib/gtrashstack.h | 103 + glib/gtree.c | 1414 ++ glib/gtree.h | 106 + glib/gtypes.h | 484 + glib/gunibreak.c | 61 + glib/gunibreak.h | 20548 ++++++++++++++++ glib/gunichartables.h | 15149 ++++++++++++ glib/gunicode.h | 813 + glib/gunicodeprivate.h | 34 + glib/gunicollate.c | 682 + glib/gunicomp.h | 938 + glib/gunidecomp.c | 751 + glib/gunidecomp.h | 13512 ++++++++++ glib/guniprop.c | 1512 ++ glib/gurifuncs.c | 252 + glib/gurifuncs.h | 85 + glib/gutf8.c | 1747 ++ glib/gutils.c | 2474 ++ glib/gutils.h | 404 + glib/gvariant-core.c | 1104 + glib/gvariant-core.h | 39 + glib/gvariant-internal.h | 52 + glib/gvariant-parser.c | 2547 ++ glib/gvariant-serialiser.c | 1702 ++ glib/gvariant-serialiser.h | 75 + glib/gvariant.c | 5328 ++++ glib/gvariant.h | 395 + glib/gvarianttype.c | 1520 ++ glib/gvarianttype.h | 382 + glib/gvarianttypeinfo.c | 869 + glib/gvarianttypeinfo.h | 161 + glib/gversion.c | 157 + glib/gversion.h | 57 + glib/gversionmacros.h | 275 + glib/gwakeup.c | 269 + glib/gwakeup.h | 37 + glib/gwin32.c | 577 + glib/gwin32.h | 133 + glib/libcharset/.gitignore | 3 + glib/libcharset/Makefile.am | 66 + glib/libcharset/README | 46 + glib/libcharset/codeset.m4 | 21 + glib/libcharset/config.charset | 672 + 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 | 143 + glib/pcre/COPYING | 5 + glib/pcre/Makefile.am | 63 + glib/pcre/makefile.msc | 30 + glib/pcre/pcre.h | 507 + glib/pcre/pcre_byte_order.c | 288 + glib/pcre/pcre_chartables.c | 198 + glib/pcre/pcre_compile.c | 8215 ++++++ glib/pcre/pcre_config.c | 170 + glib/pcre/pcre_dfa_exec.c | 3613 +++ glib/pcre/pcre_exec.c | 7149 ++++++ glib/pcre/pcre_fullinfo.c | 206 + glib/pcre/pcre_get.c | 587 + glib/pcre/pcre_globals.c | 90 + glib/pcre/pcre_internal.h | 2334 ++ glib/pcre/pcre_jit_compile.c | 7499 ++++++ glib/pcre/pcre_newline.c | 184 + glib/pcre/pcre_ord2utf8.c | 97 + glib/pcre/pcre_string_utils.c | 168 + glib/pcre/pcre_study.c | 1534 ++ glib/pcre/pcre_tables.c | 602 + glib/pcre/pcre_valid_utf8.c | 299 + glib/pcre/pcre_xclass.c | 198 + glib/pcre/ucp.h | 179 + glib/tests/.gitignore | 81 + glib/tests/1bit-mutex.c | 165 + glib/tests/4096-random-bytes | 45 + glib/tests/642026.c | 91 + glib/tests/Makefile.am | 144 + glib/tests/array-test.c | 879 + glib/tests/asyncqueue.c | 221 + glib/tests/atomic.c | 273 + glib/tests/base64.c | 370 + glib/tests/bitlock.c | 39 + glib/tests/bookmarkfile.c | 297 + glib/tests/bookmarks.xbel | 23 + glib/tests/bookmarks/fail-01.xbel | 0 glib/tests/bookmarks/fail-02.xbel | 2 + glib/tests/bookmarks/fail-03.xbel | 18 + glib/tests/bookmarks/fail-04.xbel | 21 + glib/tests/bookmarks/fail-05.xbel | 21 + glib/tests/bookmarks/fail-06.xbel | 19 + glib/tests/bookmarks/fail-07.xbel | 21 + glib/tests/bookmarks/fail-08.xbel | 18 + glib/tests/bookmarks/fail-09.xbel | 20 + glib/tests/bookmarks/fail-10.xbel | 21 + glib/tests/bookmarks/fail-11.xbel | 22 + glib/tests/bookmarks/fail-12.xbel | 22 + glib/tests/bookmarks/fail-13.xbel | 22 + glib/tests/bookmarks/fail-14.xbel | 24 + glib/tests/bookmarks/fail-15.xbel | 23 + glib/tests/bookmarks/fail-16.xbel | 24 + glib/tests/bookmarks/fail-17.xbel | 22 + glib/tests/bookmarks/valid-01.xbel | 21 + glib/tests/bookmarks/valid-02.xbel | 15 + glib/tests/bookmarks/valid-03.xbel | 21 + glib/tests/bytes.c | 358 + glib/tests/cache.c | 167 + glib/tests/checksum.c | 1028 + glib/tests/collate.c | 231 + glib/tests/cond.c | 243 + glib/tests/convert.c | 719 + glib/tests/dataset.c | 215 + glib/tests/date.c | 377 + glib/tests/dir.c | 53 + glib/tests/echo-script | 1 + glib/tests/empty | 0 glib/tests/environment.c | 129 + glib/tests/error.c | 100 + glib/tests/fileutils.c | 792 + glib/tests/gdatetime.c | 1589 ++ glib/tests/gvariant.c | 4339 ++++ glib/tests/gwakeuptest.c | 273 + glib/tests/hash.c | 1297 + glib/tests/hmac.c | 318 + glib/tests/hook.c | 95 + glib/tests/hostutils.c | 347 + glib/tests/include.c | 18 + glib/tests/keyfile.c | 1616 ++ glib/tests/keyfiletest.ini | 4 + glib/tests/list.c | 521 + glib/tests/logging.c | 276 + glib/tests/mainloop.c | 1275 + glib/tests/mappedfile.c | 187 + glib/tests/markup-collect.c | 234 + glib/tests/markup-escape.c | 160 + glib/tests/markup-parse.c | 315 + glib/tests/markup-subparser.c | 380 + glib/tests/markups/fail-1.expected | 1 + glib/tests/markups/fail-1.gmarkup | 0 glib/tests/markups/fail-10.expected | 4 + glib/tests/markups/fail-10.gmarkup | 2 + glib/tests/markups/fail-11.expected | 7 + glib/tests/markups/fail-11.gmarkup | 4 + glib/tests/markups/fail-12.expected | 1 + glib/tests/markups/fail-12.gmarkup | 1 + glib/tests/markups/fail-13.expected | 1 + glib/tests/markups/fail-13.gmarkup | 1 + glib/tests/markups/fail-14.expected | 4 + glib/tests/markups/fail-14.gmarkup | 2 + glib/tests/markups/fail-15.expected | 8 + glib/tests/markups/fail-15.gmarkup | 3 + glib/tests/markups/fail-16.expected | 2 + glib/tests/markups/fail-16.gmarkup | 1 + glib/tests/markups/fail-17.expected | 1 + glib/tests/markups/fail-17.gmarkup | 1 + glib/tests/markups/fail-18.expected | 1 + glib/tests/markups/fail-18.gmarkup | 1 + glib/tests/markups/fail-19.expected | 1 + glib/tests/markups/fail-19.gmarkup | 1 + glib/tests/markups/fail-2.expected | 1 + glib/tests/markups/fail-2.gmarkup | 1 + glib/tests/markups/fail-20.expected | 1 + glib/tests/markups/fail-20.gmarkup | 1 + glib/tests/markups/fail-21.expected | 1 + glib/tests/markups/fail-21.gmarkup | 1 + glib/tests/markups/fail-22.expected | 2 + glib/tests/markups/fail-22.gmarkup | 1 + glib/tests/markups/fail-23.expected | 4 + glib/tests/markups/fail-23.gmarkup | 2 + glib/tests/markups/fail-24.expected | 1 + glib/tests/markups/fail-24.gmarkup | 1 + glib/tests/markups/fail-25.expected | 1 + glib/tests/markups/fail-25.gmarkup | 1 + glib/tests/markups/fail-26.expected | 2 + glib/tests/markups/fail-26.gmarkup | 1 + glib/tests/markups/fail-27.expected | 2 + glib/tests/markups/fail-27.gmarkup | 1 + glib/tests/markups/fail-28.expected | 2 + glib/tests/markups/fail-28.gmarkup | 1 + glib/tests/markups/fail-29.expected | 2 + glib/tests/markups/fail-29.gmarkup | 1 + glib/tests/markups/fail-3.gmarkup | 49 + glib/tests/markups/fail-30.expected | 2 + glib/tests/markups/fail-30.gmarkup | 1 + glib/tests/markups/fail-31.expected | 2 + glib/tests/markups/fail-31.gmarkup | 1 + glib/tests/markups/fail-32.expected | 2 + glib/tests/markups/fail-32.gmarkup | 1 + glib/tests/markups/fail-33.expected | 2 + glib/tests/markups/fail-33.gmarkup | 1 + glib/tests/markups/fail-34.expected | 2 + glib/tests/markups/fail-34.gmarkup | 1 + glib/tests/markups/fail-35.expected | 2 + glib/tests/markups/fail-35.gmarkup | 1 + glib/tests/markups/fail-36.gmarkup | 1 + glib/tests/markups/fail-37.expected | 1 + glib/tests/markups/fail-37.gmarkup | 1 + glib/tests/markups/fail-38.expected | 3 + glib/tests/markups/fail-38.gmarkup | 1 + glib/tests/markups/fail-39.expected | 3 + glib/tests/markups/fail-39.gmarkup | 1 + glib/tests/markups/fail-4.expected | 1 + glib/tests/markups/fail-4.gmarkup | 1 + glib/tests/markups/fail-40.expected | 2 + glib/tests/markups/fail-40.gmarkup | 1 + glib/tests/markups/fail-41.expected | 1 + glib/tests/markups/fail-41.gmarkup | 3 + glib/tests/markups/fail-42.expected | 1 + glib/tests/markups/fail-42.gmarkup | 5 + glib/tests/markups/fail-43.expected | 1 + glib/tests/markups/fail-43.gmarkup | 1 + glib/tests/markups/fail-44.expected | 3 + glib/tests/markups/fail-44.gmarkup | 1 + glib/tests/markups/fail-45.expected | 3 + glib/tests/markups/fail-45.gmarkup | 1 + glib/tests/markups/fail-46.expected | 2 + glib/tests/markups/fail-46.gmarkup | 2 + glib/tests/markups/fail-47.expected | 1 + glib/tests/markups/fail-47.gmarkup | 1 + glib/tests/markups/fail-48.expected | 1 + glib/tests/markups/fail-48.gmarkup | 2 + glib/tests/markups/fail-49.expected | 3 + glib/tests/markups/fail-49.gmarkup | 1 + glib/tests/markups/fail-5.expected | 1 + glib/tests/markups/fail-5.gmarkup | 2 + glib/tests/markups/fail-6.expected | 1 + glib/tests/markups/fail-6.gmarkup | 2 + glib/tests/markups/fail-7.expected | 1 + glib/tests/markups/fail-7.gmarkup | 2 + glib/tests/markups/fail-8.expected | 3 + glib/tests/markups/fail-8.gmarkup | 2 + glib/tests/markups/fail-9.expected | 1 + glib/tests/markups/fail-9.gmarkup | 2 + glib/tests/markups/valid-1.expected | 37 + glib/tests/markups/valid-1.gmarkup | 9 + glib/tests/markups/valid-10.expected | 6 + glib/tests/markups/valid-10.gmarkup | 6 + glib/tests/markups/valid-11.expected | 3 + glib/tests/markups/valid-11.gmarkup | 2 + glib/tests/markups/valid-12.expected | 5 + glib/tests/markups/valid-12.gmarkup | 3 + glib/tests/markups/valid-13.expected | 4 + glib/tests/markups/valid-13.gmarkup | 3 + glib/tests/markups/valid-14.expected | 30 + glib/tests/markups/valid-14.gmarkup | 24 + glib/tests/markups/valid-15.expected | 3 + glib/tests/markups/valid-15.gmarkup | 1 + glib/tests/markups/valid-2.expected | 51 + glib/tests/markups/valid-2.gmarkup | 49 + glib/tests/markups/valid-3.expected | 61 + glib/tests/markups/valid-3.gmarkup | 10 + glib/tests/markups/valid-4.expected | 29 + glib/tests/markups/valid-4.gmarkup | 8 + glib/tests/markups/valid-5.expected | 4 + glib/tests/markups/valid-5.gmarkup | 2 + glib/tests/markups/valid-6.expected | 6 + glib/tests/markups/valid-6.gmarkup | 4 + glib/tests/markups/valid-7.expected | 4 + glib/tests/markups/valid-7.gmarkup | 2 + glib/tests/markups/valid-8.expected | 5 + glib/tests/markups/valid-8.gmarkup | 1 + glib/tests/markups/valid-9.expected | 3 + glib/tests/markups/valid-9.gmarkup | 2 + glib/tests/mem-overflow.c | 163 + glib/tests/mutex.c | 237 + glib/tests/node.c | 424 + glib/tests/once.c | 137 + glib/tests/option-argv0.c | 67 + glib/tests/option-context.c | 2311 ++ glib/tests/pages.ini | 92 + glib/tests/pattern.c | 244 + glib/tests/private.c | 395 + glib/tests/protocol.c | 357 + glib/tests/queue.c | 1103 + glib/tests/rand.c | 176 + glib/tests/rec-mutex.c | 255 + glib/tests/regex.c | 2742 +++ glib/tests/rwlock.c | 287 + glib/tests/scannerapi.c | 142 + glib/tests/sequence.c | 1401 ++ glib/tests/shell.c | 233 + glib/tests/slice.c | 34 + glib/tests/slist.c | 352 + glib/tests/sort.c | 130 + glib/tests/spawn-multithreaded.c | 243 + glib/tests/spawn-singlethread.c | 231 + glib/tests/strfuncs.c | 1367 + glib/tests/string.c | 524 + glib/tests/test-printf.c | 997 + glib/tests/test-spawn-echo.c | 39 + glib/tests/testing.c | 346 + glib/tests/thread.c | 205 + glib/tests/timeout.c | 108 + glib/tests/tree.c | 354 + glib/tests/unicode.c | 860 + glib/tests/unix.c | 164 + glib/tests/uri.c | 395 + glib/tests/utf8-misc.c | 146 + glib/tests/utf8-performance.c | 200 + glib/tests/utf8-pointer.c | 138 + glib/tests/utf8-validate.c | 305 + glib/tests/utils.c | 554 + glib/update-pcre/Makefile.am | 6 + glib/update-pcre/digitab.patch | 94 + glib/update-pcre/memory.patch | 40 + glib/update-pcre/ucp.patch | 834 + glib/update-pcre/update.sh | 159 + glib/win_iconv.c | 1965 ++ gmodule-2.0.pc.in | 14 + gmodule-export-2.0.pc.in | 14 + gmodule-no-export-2.0.pc.in | 14 + gmodule/.gitignore | 2 + gmodule/AUTHORS | 1 + gmodule/COPYING | 482 + gmodule/ChangeLog | 1042 + gmodule/Makefile.am | 110 + 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 | 202 + gmodule/gmodule.c | 935 + gmodule/gmodule.h | 117 + gmodule/gmodule.rc.in | 30 + gmodule/gmoduleconf.h.in | 54 + gmodule/gmoduleconf.h.win32 | 44 + gmodule/makefile.msc.in | 37 + gobject-2.0.pc.in | 12 + gobject/.gitignore | 9 + gobject/ChangeLog | 3973 +++ gobject/Makefile.am | 285 + gobject/gatomicarray.c | 168 + gobject/gatomicarray.h | 60 + gobject/gbinding.c | 1190 + gobject/gbinding.h | 146 + gobject/gboxed.c | 553 + gobject/gboxed.h | 124 + gobject/gclosure.c | 1892 ++ gobject/gclosure.h | 299 + gobject/genums.c | 621 + gobject/genums.h | 275 + gobject/glib-genmarshal.c | 1084 + gobject/glib-mkenums.in | 565 + gobject/glib-types.h | 338 + gobject/gmarshal.c | 1750 ++ gobject/gmarshal.h | 385 + gobject/gmarshal.list | 32 + gobject/gobject-query.c | 228 + gobject/gobject.c | 4148 ++++ gobject/gobject.h | 669 + gobject/gobject.py | 305 + gobject/gobject.rc.in | 30 + gobject/gobject.stp.in | 199 + gobject/gobject_probes.d | 13 + gobject/gobject_trace.h | 43 + gobject/gobjectnotifyqueue.c | 199 + gobject/gparam.c | 1508 ++ gobject/gparam.h | 443 + gobject/gparamspecs.c | 2522 ++ gobject/gparamspecs.h | 1166 + gobject/gsignal.c | 3824 +++ gobject/gsignal.h | 585 + gobject/gsourceclosure.c | 239 + gobject/gsourceclosure.h | 40 + gobject/gtype-private.h | 78 + gobject/gtype.c | 4720 ++++ gobject/gtype.h | 1790 ++ gobject/gtypemodule.c | 581 + gobject/gtypemodule.h | 271 + gobject/gtypeplugin.c | 206 + gobject/gtypeplugin.h | 139 + gobject/gvalue.c | 553 + gobject/gvalue.h | 194 + gobject/gvaluearray.c | 387 + gobject/gvaluearray.h | 106 + gobject/gvaluecollector.h | 256 + gobject/gvaluetransform.c | 435 + gobject/gvaluetypes.c | 1447 ++ gobject/gvaluetypes.h | 302 + gobject/libgobject-gdb.py.in | 10 + gobject/makefile.msc.in | 83 + gobject/marshal-genstrings.pl | 9 + gobject/tests/.gitignore | 13 + gobject/tests/Makefile.am | 45 + gobject/tests/binding.c | 591 + gobject/tests/boxed.c | 533 + gobject/tests/dynamictests.c | 367 + gobject/tests/enums.c | 124 + gobject/tests/ifaceproperties.c | 648 + gobject/tests/marshalers.list | 3 + gobject/tests/param.c | 803 + gobject/tests/properties.c | 268 + gobject/tests/qdata.c | 93 + gobject/tests/reference.c | 616 + gobject/tests/signals.c | 862 + gobject/tests/testcommon.h | 100 + gobject/tests/threadtests.c | 349 + gobject/tests/valuearray.c | 64 + gthread-2.0.pc.in | 11 + gthread/.gitignore | 1 + gthread/ChangeLog | 837 + gthread/Makefile.am | 97 + gthread/gthread-impl.c | 50 + gthread/gthread.def | 3 + gthread/gthread.rc.in | 30 + gthread/makefile.msc.in | 26 + m4macros/.gitignore | 6 + m4macros/Makefile.am | 8 + m4macros/attributes.m4 | 288 + m4macros/glib-2.0.m4 | 214 + m4macros/glib-gettext.m4 | 436 + m4macros/gsettings.m4 | 83 + makefile.msc | 28 + msvc_recommended_pragmas.h | 32 + po/.gitignore | 3 + po/ChangeLog | 4775 ++++ po/LINGUAS | 96 + po/Makefile.in.in | 268 + po/POTFILES.in | 160 + po/POTFILES.skip | 2 + po/README.translators | 25 + po/af.po | 3722 +++ po/am.po | 3731 +++ po/ar.po | 4179 ++++ po/as.po | 4478 ++++ po/ast.po | 3821 +++ po/az.po | 3820 +++ po/be.po | 4386 ++++ po/be@latin.po | 4125 ++++ po/bg.po | 4399 ++++ po/bn.po | 3802 +++ po/bn_IN.po | 3802 +++ po/bs.po | 3819 +++ po/ca.po | 4740 ++++ po/ca@valencia.po | 4736 ++++ po/cs.po | 4392 ++++ po/cy.po | 3853 +++ po/da.po | 4618 ++++ po/de.po | 4688 ++++ po/dz.po | 3836 +++ po/el.po | 4735 ++++ po/en@shaw.po | 3809 +++ po/en_CA.po | 3922 +++ po/en_GB.po | 4536 ++++ po/eo.po | 4225 ++++ po/es.po | 4733 ++++ po/et.po | 3346 +++ po/eu.po | 4370 ++++ po/fa.po | 4192 ++++ po/fi.po | 3835 +++ po/fr.po | 4523 ++++ po/ga.po | 3744 +++ po/gl.po | 4617 ++++ po/gu.po | 4268 ++++ po/he.po | 4637 ++++ po/hi.po | 4474 ++++ po/hr.po | 3816 +++ po/hu.po | 4368 ++++ po/hy.po | 3956 +++ po/id.po | 4349 ++++ po/is.po | 3808 +++ po/it.po | 4547 ++++ po/ja.po | 4296 ++++ po/ka.po | 3826 +++ po/kk.po | 3707 +++ po/kn.po | 4316 ++++ po/ko.po | 4309 ++++ po/ku.po | 3721 +++ po/lt.po | 4396 ++++ po/lv.po | 4459 ++++ po/mai.po | 3845 +++ po/mg.po | 3845 +++ po/mk.po | 3874 +++ po/ml.po | 3785 +++ po/mn.po | 3855 +++ po/mr.po | 4400 ++++ po/ms.po | 3814 +++ po/nb.po | 4339 ++++ po/nds.po | 3707 +++ po/ne.po | 3812 +++ po/nl.po | 4455 ++++ po/nn.po | 3916 +++ po/oc.po | 3718 +++ po/or.po | 4506 ++++ po/pa.po | 4524 ++++ po/pl.po | 4471 ++++ po/po2tbl.sed.in | 102 + po/ps.po | 3744 +++ po/pt.po | 4638 ++++ po/pt_BR.po | 4533 ++++ po/ro.po | 4013 +++ po/ru.po | 4467 ++++ po/rw.po | 3896 +++ po/si.po | 3769 +++ po/sk.po | 4440 ++++ po/sl.po | 4398 ++++ po/sq.po | 4294 ++++ po/sr.po | 4380 ++++ po/sr@ije.po | 3833 +++ po/sr@latin.po | 4380 ++++ po/sv.po | 4400 ++++ po/ta.po | 4400 ++++ po/te.po | 4415 ++++ po/th.po | 3853 +++ po/tl.po | 3873 +++ po/tr.po | 3959 +++ po/tt.po | 3751 +++ po/ug.po | 4294 ++++ po/uk.po | 3800 +++ po/vi.po | 4455 ++++ po/wa.po | 3773 +++ po/xh.po | 3863 +++ po/yi.po | 3820 +++ po/zh_CN.po | 4129 ++++ po/zh_HK.po | 4417 ++++ po/zh_TW.po | 4442 ++++ sanity_check | 40 + tests/.gitignore | 78 + tests/Makefile.am | 192 + tests/assert-msg-test.c | 8 + tests/assert-msg-test.gdb | 3 + tests/asyncqueue-test.c | 243 + tests/atomic-test.c | 63 + tests/bit-test.c | 145 + tests/casefold.txt | 1140 + tests/casemap.txt | 3269 +++ tests/child-test.c | 202 + 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 | 82 + tests/cxx-test.C | 10 + tests/datetime.c | 43 + tests/dirname-test.c | 121 + tests/env-test.c | 117 + tests/file-test.c | 232 + tests/gen-casefold-txt.pl | 84 + tests/gen-casemap-txt.pl | 258 + tests/gio-ls.c | 114 + tests/gio-test.c | 428 + tests/gobject/.gitignore | 14 + tests/gobject/Makefile.am | 96 + tests/gobject/accumulator.c | 307 + tests/gobject/defaultiface.c | 196 + tests/gobject/deftype.c | 61 + tests/gobject/dynamictype.c | 177 + tests/gobject/gvalue-test.c | 398 + tests/gobject/ifacecheck.c | 165 + tests/gobject/ifaceinherit.c | 232 + tests/gobject/ifaceinit.c | 423 + tests/gobject/override.c | 417 + tests/gobject/paramspec-test.c | 267 + tests/gobject/performance-threaded.c | 379 + tests/gobject/performance.c | 920 + tests/gobject/references.c | 281 + tests/gobject/run-performance.sh | 6 + tests/gobject/singleton.c | 86 + tests/gobject/testcommon.h | 100 + tests/gobject/testmarshal.list | 4 + tests/gobject/testmodule.c | 69 + tests/gobject/testmodule.h | 57 + tests/iochannel-test-infile | 5 + tests/iochannel-test.c | 170 + tests/libmoduletestplugin_a.c | 77 + tests/libmoduletestplugin_b.c | 78 + tests/mainloop-test.c | 436 + tests/makefile.msc.in | 105 + tests/mapping-test.c | 256 + tests/memchunks.c | 605 + tests/module-test.c | 204 + tests/onceinit.c | 275 + tests/qsort-test.c | 33 + tests/refcount/Makefile.am | 44 + tests/refcount/closures.c | 290 + tests/refcount/objects.c | 156 + tests/refcount/objects2.c | 118 + tests/refcount/properties.c | 249 + tests/refcount/properties2.c | 197 + tests/refcount/properties3.c | 202 + tests/refcount/properties4.c | 169 + tests/refcount/signals.c | 309 + tests/relation-test.c | 139 + tests/run-assert-msg-test.sh | 48 + tests/run-collate-tests.sh | 38 + tests/slice-color.c | 179 + tests/slice-concurrent.c | 122 + tests/slice-test.c | 308 + tests/slice-threadinit.c | 166 + tests/sources.c | 179 + tests/spawn-test-win32-gui.c | 111 + tests/spawn-test.c | 294 + tests/testgdate.c | 507 + tests/testgdateparser.c | 100 + tests/testglib.c | 1600 ++ tests/testgobject.c | 429 + tests/thread-test.c | 396 + tests/threadpool-test.c | 464 + tests/timeloop-basic.c | 235 + tests/timeloop-closure.c | 220 + tests/timeloop.c | 216 + 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/utf8.txt | 301 + win32-fixup.pl | 41 + 1732 files changed, 1093046 insertions(+) create mode 100644 .dir-locals.el create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 COPYING 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 Makefile.am create mode 100644 Makefile.decl create mode 100644 NEWS create mode 100644 NEWS.pre-1-3 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 100755 autogen.sh create mode 100644 build/ChangeLog create mode 100644 build/Makefile-newvs.am create mode 100644 build/Makefile.am create mode 100644 build/README create mode 100644 build/win32/Makefile.am create mode 100644 build/win32/dirent/Makefile.am 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/setup.py create mode 100644 build/win32/vs10/.gitignore create mode 100644 build/win32/vs10/Makefile.am create mode 100644 build/win32/vs10/README.txt create mode 100644 build/win32/vs10/gio.vcxproj.filtersin create mode 100644 build/win32/vs10/gio.vcxprojin create mode 100644 build/win32/vs10/glib-compile-resources.vcxproj create mode 100644 build/win32/vs10/glib-compile-resources.vcxproj.filters create mode 100644 build/win32/vs10/glib-compile-schemas.vcxproj create mode 100644 build/win32/vs10/glib-compile-schemas.vcxproj.filters create mode 100644 build/win32/vs10/glib-genmarshal.vcxproj create mode 100644 build/win32/vs10/glib-genmarshal.vcxproj.filters create mode 100644 build/win32/vs10/glib.props create mode 100644 build/win32/vs10/glib.sln create mode 100644 build/win32/vs10/glib.vcxproj.filtersin create mode 100644 build/win32/vs10/glib.vcxprojin create mode 100644 build/win32/vs10/gmodule.vcxproj create mode 100644 build/win32/vs10/gmodule.vcxproj.filters create mode 100644 build/win32/vs10/gobject.vcxproj.filtersin create mode 100644 build/win32/vs10/gobject.vcxprojin create mode 100644 build/win32/vs10/gresource.vcxproj create mode 100644 build/win32/vs10/gresource.vcxproj.filters create mode 100644 build/win32/vs10/gsettings.vcxproj create mode 100644 build/win32/vs10/gsettings.vcxproj.filters create mode 100644 build/win32/vs10/gspawn-win32-helper-console.vcxproj create mode 100644 build/win32/vs10/gspawn-win32-helper-console.vcxproj.filters create mode 100644 build/win32/vs10/gspawn-win32-helper.vcxproj create mode 100644 build/win32/vs10/gspawn-win32-helper.vcxproj.filters create mode 100644 build/win32/vs10/gthread.vcxproj create mode 100644 build/win32/vs10/gthread.vcxproj.filters create mode 100644 build/win32/vs10/install.vcxproj create mode 100644 build/win32/vs10/testglib.vcxproj create mode 100644 build/win32/vs10/testglib.vcxproj.filters create mode 100644 build/win32/vs11/.gitignore create mode 100644 build/win32/vs11/Makefile.am create mode 100644 build/win32/vs8/Makefile.am create mode 100644 build/win32/vs8/README create mode 100644 build/win32/vs8/gio.vcproj create mode 100644 build/win32/vs8/glib-genmarshal.vcproj create mode 100644 build/win32/vs8/glib.sln create mode 100644 build/win32/vs8/glib.vcproj create mode 100644 build/win32/vs8/gmodule.vcproj create mode 100644 build/win32/vs8/gobject.vcproj create mode 100644 build/win32/vs8/gspawn-win32-helper-console.vcproj create mode 100644 build/win32/vs8/gspawn-win32-helper.vcproj create mode 100644 build/win32/vs8/gthread.vcproj create mode 100644 build/win32/vs9/.gitignore create mode 100644 build/win32/vs9/Makefile.am create mode 100644 build/win32/vs9/README.txt create mode 100644 build/win32/vs9/gio.vcprojin create mode 100644 build/win32/vs9/glib-compile-resources.vcproj create mode 100644 build/win32/vs9/glib-compile-schemas.vcproj create mode 100644 build/win32/vs9/glib-genmarshal.vcproj create mode 100644 build/win32/vs9/glib.sln 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.vcprojin create mode 100644 build/win32/vs9/gresource.vcproj create mode 100644 build/win32/vs9/gsettings.vcproj 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 check-abis.sh create mode 100644 config.h.win32.in create mode 100644 configure.ac create mode 100644 docs/Makefile.am create mode 100644 docs/debugging.txt create mode 100644 docs/macros.txt create mode 100644 docs/reference/.gitignore 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/NEWS create mode 100644 docs/reference/README create mode 100644 docs/reference/gio/.gitignore create mode 100644 docs/reference/gio/Makefile.am create mode 100644 docs/reference/gio/gdbus-codegen.xml create mode 100644 docs/reference/gio/gdbus-object-manager-example/.gitignore create mode 100644 docs/reference/gio/gdbus-object-manager-example/Makefile.am create mode 100644 docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml create mode 100644 docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt create mode 100644 docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example.types create mode 100644 docs/reference/gio/gdbus.xml create mode 100644 docs/reference/gio/gio-docs.xml create mode 100644 docs/reference/gio/gio-querymodules.xml create mode 100644 docs/reference/gio/gio-sections.txt create mode 100644 docs/reference/gio/gio.types create mode 100644 docs/reference/gio/glib-compile-resources.xml create mode 100644 docs/reference/gio/glib-compile-schemas.xml create mode 100644 docs/reference/gio/gresource.xml create mode 100644 docs/reference/gio/gsettings.xml create mode 100644 docs/reference/gio/gvfs-overview.odg create mode 100644 docs/reference/gio/gvfs-overview.png create mode 100644 docs/reference/gio/menu-example.png create mode 100644 docs/reference/gio/menu-model.png create mode 100644 docs/reference/gio/migrating-gconf.xml create mode 100644 docs/reference/gio/migrating-gdbus.xml create mode 100644 docs/reference/gio/migrating-gnome-vfs.xml create mode 100644 docs/reference/gio/migrating-posix.xml create mode 100644 docs/reference/gio/overview.xml create mode 100644 docs/reference/gio/version.xml.in create mode 100644 docs/reference/glib/Makefile.am create mode 100644 docs/reference/glib/building.xml create mode 100644 docs/reference/glib/changes.xml create mode 100644 docs/reference/glib/compiling.xml create mode 100644 docs/reference/glib/cross.xml 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.xml 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.xml create mode 100644 docs/reference/glib/gtester.xml create mode 100644 docs/reference/glib/gvariant-text.xml create mode 100644 docs/reference/glib/gvariant-varargs.xml 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/programming.xml create mode 100644 docs/reference/glib/regex-syntax.xml create mode 100644 docs/reference/glib/resources.xml create mode 100644 docs/reference/glib/running.xml create mode 100644 docs/reference/glib/version.xml.in create mode 100644 docs/reference/gobject/Makefile.am create mode 100644 docs/reference/gobject/glib-genmarshal.xml create mode 100644 docs/reference/gobject/glib-mkenums.xml create mode 100644 docs/reference/gobject/gobject-docs.xml create mode 100644 docs/reference/gobject/gobject-overrides.txt 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/images/glue.png create mode 100644 docs/reference/gobject/tmpl/.gitignore 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.pc.in create mode 100644 gio-unix-2.0.pc.in create mode 100644 gio-windows-2.0.pc.in create mode 100644 gio/.gitignore create mode 100644 gio/ChangeLog create mode 100644 gio/Makefile.am create mode 100644 gio/completion/gdbus create mode 100644 gio/completion/gresource create mode 100644 gio/completion/gsettings create mode 100755 gio/data-to-c.pl create mode 100644 gio/dbus-daemon.xml create mode 100644 gio/fam/Makefile.am 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/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-node.c create mode 100644 gio/fen/fen-node.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/gaction.c create mode 100644 gio/gaction.h create mode 100644 gio/gactiongroup.c create mode 100644 gio/gactiongroup.h create mode 100644 gio/gactiongroupexporter.c create mode 100644 gio/gactiongroupexporter.h create mode 100644 gio/gactionmap.c create mode 100644 gio/gactionmap.h create mode 100644 gio/gappinfo.c create mode 100644 gio/gappinfo.h create mode 100644 gio/gapplication.c create mode 100644 gio/gapplication.h create mode 100644 gio/gapplicationcommandline.c create mode 100644 gio/gapplicationcommandline.h create mode 100644 gio/gapplicationimpl-dbus.c create mode 100644 gio/gapplicationimpl.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-win32.c 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/gcredentials.c create mode 100644 gio/gcredentials.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/gdbus-2.0/codegen/.gitignore create mode 100644 gio/gdbus-2.0/codegen/Makefile.am create mode 100644 gio/gdbus-2.0/codegen/__init__.py create mode 100644 gio/gdbus-2.0/codegen/codegen.py create mode 100644 gio/gdbus-2.0/codegen/codegen_docbook.py create mode 100755 gio/gdbus-2.0/codegen/codegen_main.py create mode 100644 gio/gdbus-2.0/codegen/config.py.in create mode 100644 gio/gdbus-2.0/codegen/dbustypes.py create mode 100644 gio/gdbus-2.0/codegen/gdbus-codegen.in create mode 100644 gio/gdbus-2.0/codegen/parser.py create mode 100644 gio/gdbus-2.0/codegen/utils.py create mode 100644 gio/gdbus-tool.c create mode 100644 gio/gdbusactiongroup-private.h create mode 100644 gio/gdbusactiongroup.c create mode 100644 gio/gdbusactiongroup.h create mode 100644 gio/gdbusaddress.c create mode 100644 gio/gdbusaddress.h create mode 100644 gio/gdbusauth.c create mode 100644 gio/gdbusauth.h create mode 100644 gio/gdbusauthmechanism.c create mode 100644 gio/gdbusauthmechanism.h create mode 100644 gio/gdbusauthmechanismanon.c create mode 100644 gio/gdbusauthmechanismanon.h create mode 100644 gio/gdbusauthmechanismexternal.c create mode 100644 gio/gdbusauthmechanismexternal.h create mode 100644 gio/gdbusauthmechanismsha1.c create mode 100644 gio/gdbusauthmechanismsha1.h create mode 100644 gio/gdbusauthobserver.c create mode 100644 gio/gdbusauthobserver.h create mode 100644 gio/gdbusconnection.c create mode 100644 gio/gdbusconnection.h create mode 100644 gio/gdbusdaemon.c create mode 100644 gio/gdbusdaemon.h create mode 100644 gio/gdbuserror.c create mode 100644 gio/gdbuserror.h create mode 100644 gio/gdbusinterface.c create mode 100644 gio/gdbusinterface.h create mode 100644 gio/gdbusinterfaceskeleton.c create mode 100644 gio/gdbusinterfaceskeleton.h create mode 100644 gio/gdbusintrospection.c create mode 100644 gio/gdbusintrospection.h create mode 100644 gio/gdbusmenumodel.c create mode 100644 gio/gdbusmenumodel.h create mode 100644 gio/gdbusmessage.c create mode 100644 gio/gdbusmessage.h create mode 100644 gio/gdbusmethodinvocation.c create mode 100644 gio/gdbusmethodinvocation.h create mode 100644 gio/gdbusnameowning.c create mode 100644 gio/gdbusnameowning.h create mode 100644 gio/gdbusnamewatching.c create mode 100644 gio/gdbusnamewatching.h create mode 100644 gio/gdbusobject.c create mode 100644 gio/gdbusobject.h create mode 100644 gio/gdbusobjectmanager.c create mode 100644 gio/gdbusobjectmanager.h create mode 100644 gio/gdbusobjectmanagerclient.c create mode 100644 gio/gdbusobjectmanagerclient.h create mode 100644 gio/gdbusobjectmanagerserver.c create mode 100644 gio/gdbusobjectmanagerserver.h create mode 100644 gio/gdbusobjectproxy.c create mode 100644 gio/gdbusobjectproxy.h create mode 100644 gio/gdbusobjectskeleton.c create mode 100644 gio/gdbusobjectskeleton.h create mode 100644 gio/gdbusprivate.c create mode 100644 gio/gdbusprivate.h create mode 100644 gio/gdbusproxy.c create mode 100644 gio/gdbusproxy.h create mode 100644 gio/gdbusserver.c create mode 100644 gio/gdbusserver.h create mode 100644 gio/gdbusutils.c create mode 100644 gio/gdbusutils.h create mode 100644 gio/gdelayedsettingsbackend.c create mode 100644 gio/gdelayedsettingsbackend.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/gdummyproxyresolver.c create mode 100644 gio/gdummyproxyresolver.h create mode 100644 gio/gdummytlsbackend.c create mode 100644 gio/gdummytlsbackend.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/ginetaddressmask.c create mode 100644 gio/ginetaddressmask.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-querymodules.c create mode 100644 gio/gio.h create mode 100644 gio/gio.rc.in create mode 100644 gio/gioenums.h create mode 100644 gio/gioenumtypes.c.template 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/gkeyfilesettingsbackend.c create mode 100644 gio/glib-compile-resources.c create mode 100644 gio/glib-compile-schemas.c 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/gmemorysettingsbackend.c create mode 100644 gio/gmenu.c create mode 100644 gio/gmenu.h create mode 100644 gio/gmenuexporter.c create mode 100644 gio/gmenuexporter.h create mode 100644 gio/gmenumodel.c create mode 100644 gio/gmenumodel.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/gnetworking.c create mode 100644 gio/gnetworking.h.in create mode 100644 gio/gnetworking.h.win32 create mode 100644 gio/gnetworkingprivate.h create mode 100644 gio/gnetworkmonitor.c create mode 100644 gio/gnetworkmonitor.h create mode 100644 gio/gnetworkmonitorbase.c create mode 100644 gio/gnetworkmonitorbase.h create mode 100644 gio/gnetworkmonitornetlink.c create mode 100644 gio/gnetworkmonitornetlink.h create mode 100644 gio/gnetworkservice.c create mode 100644 gio/gnetworkservice.h create mode 100644 gio/gnextstepsettingsbackend.c create mode 100644 gio/gnullsettingsbackend.c create mode 100644 gio/goutputstream.c create mode 100644 gio/goutputstream.h create mode 100644 gio/gpermission.c create mode 100644 gio/gpermission.h create mode 100644 gio/gpollableinputstream.c create mode 100644 gio/gpollableinputstream.h create mode 100644 gio/gpollableoutputstream.c create mode 100644 gio/gpollableoutputstream.h create mode 100644 gio/gpollableutils.c create mode 100644 gio/gpollableutils.h create mode 100644 gio/gpollfilemonitor.c create mode 100644 gio/gpollfilemonitor.h create mode 100644 gio/gproxy.c create mode 100644 gio/gproxy.h create mode 100644 gio/gproxyaddress.c create mode 100644 gio/gproxyaddress.h create mode 100644 gio/gproxyaddressenumerator.c create mode 100644 gio/gproxyaddressenumerator.h create mode 100644 gio/gproxyresolver.c create mode 100644 gio/gproxyresolver.h create mode 100644 gio/gregistrysettingsbackend.c create mode 100644 gio/gregistrysettingsbackend.h create mode 100644 gio/gremoteactiongroup.c create mode 100644 gio/gremoteactiongroup.h create mode 100644 gio/gresolver.c create mode 100644 gio/gresolver.h create mode 100644 gio/gresource-tool.c create mode 100644 gio/gresource.c create mode 100644 gio/gresource.h create mode 100644 gio/gresourcefile.c create mode 100644 gio/gresourcefile.h create mode 100644 gio/gschema.dtd create mode 100644 gio/gseekable.c create mode 100644 gio/gseekable.h create mode 100644 gio/gsettings-mapping.c create mode 100644 gio/gsettings-mapping.h create mode 100644 gio/gsettings-tool.c create mode 100644 gio/gsettings.c create mode 100644 gio/gsettings.h create mode 100644 gio/gsettingsbackend.c create mode 100644 gio/gsettingsbackend.h create mode 100644 gio/gsettingsbackendinternal.h create mode 100644 gio/gsettingsschema-internal.h create mode 100644 gio/gsettingsschema.c create mode 100644 gio/gsettingsschema.h create mode 100644 gio/gsimpleaction.c create mode 100644 gio/gsimpleaction.h create mode 100644 gio/gsimpleactiongroup.c create mode 100644 gio/gsimpleactiongroup.h create mode 100644 gio/gsimpleasyncresult.c create mode 100644 gio/gsimpleasyncresult.h create mode 100644 gio/gsimplepermission.c create mode 100644 gio/gsimplepermission.h create mode 100644 gio/gsimpleproxyresolver.c create mode 100644 gio/gsimpleproxyresolver.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/gsocks4aproxy.c create mode 100644 gio/gsocks4aproxy.h create mode 100644 gio/gsocks4proxy.c create mode 100644 gio/gsocks4proxy.h create mode 100644 gio/gsocks5proxy.c create mode 100644 gio/gsocks5proxy.h create mode 100644 gio/gsrvtarget.c create mode 100644 gio/gsrvtarget.h create mode 100644 gio/gtask.c create mode 100644 gio/gtask.h create mode 100644 gio/gtcpconnection.c create mode 100644 gio/gtcpconnection.h create mode 100644 gio/gtcpwrapperconnection.c create mode 100644 gio/gtcpwrapperconnection.h create mode 100644 gio/gtestdbus.c create mode 100644 gio/gtestdbus.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/gtlsbackend.c create mode 100644 gio/gtlsbackend.h create mode 100644 gio/gtlscertificate.c create mode 100644 gio/gtlscertificate.h create mode 100644 gio/gtlsclientconnection.c create mode 100644 gio/gtlsclientconnection.h create mode 100644 gio/gtlsconnection.c create mode 100644 gio/gtlsconnection.h create mode 100644 gio/gtlsdatabase.c create mode 100644 gio/gtlsdatabase.h create mode 100644 gio/gtlsfiledatabase.c create mode 100644 gio/gtlsfiledatabase.h create mode 100644 gio/gtlsinteraction.c create mode 100644 gio/gtlsinteraction.h create mode 100644 gio/gtlspassword.c create mode 100644 gio/gtlspassword.h create mode 100644 gio/gtlsserverconnection.c create mode 100644 gio/gtlsserverconnection.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/gunixcredentialsmessage.c create mode 100644 gio/gunixcredentialsmessage.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/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/gvdb/gvdb-builder.c create mode 100644 gio/gvdb/gvdb-builder.h create mode 100644 gio/gvdb/gvdb-format.h create mode 100644 gio/gvdb/gvdb-reader.c create mode 100644 gio/gvdb/gvdb-reader.h create mode 100644 gio/gvdb/gvdb.doap 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/gwin32inputstream.c create mode 100644 gio/gwin32inputstream.h create mode 100644 gio/gwin32mount.c create mode 100644 gio/gwin32mount.h create mode 100644 gio/gwin32outputstream.c create mode 100644 gio/gwin32outputstream.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/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-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/kqueue/Makefile.am create mode 100644 gio/kqueue/dep-list.c create mode 100644 gio/kqueue/dep-list.h create mode 100644 gio/kqueue/gkqueuedirectorymonitor.c create mode 100644 gio/kqueue/gkqueuedirectorymonitor.h create mode 100644 gio/kqueue/gkqueuefilemonitor.c create mode 100644 gio/kqueue/gkqueuefilemonitor.h create mode 100644 gio/kqueue/kqueue-exclusions.c create mode 100644 gio/kqueue/kqueue-exclusions.h create mode 100644 gio/kqueue/kqueue-helper.c create mode 100644 gio/kqueue/kqueue-helper.h create mode 100644 gio/kqueue/kqueue-missing.c create mode 100644 gio/kqueue/kqueue-missing.h create mode 100644 gio/kqueue/kqueue-sub.c create mode 100644 gio/kqueue/kqueue-sub.h create mode 100644 gio/kqueue/kqueue-thread.c create mode 100644 gio/kqueue/kqueue-thread.h create mode 100644 gio/kqueue/kqueue-utils.c create mode 100644 gio/kqueue/kqueue-utils.h create mode 100644 gio/makefile.msc create mode 100644 gio/strinfo.c create mode 100644 gio/tests/.gitignore create mode 100644 gio/tests/Makefile.am create mode 100644 gio/tests/actions.c create mode 100644 gio/tests/appinfo-test-gnome.desktop create mode 100644 gio/tests/appinfo-test-notgnome.desktop create mode 100644 gio/tests/appinfo-test.c create mode 100644 gio/tests/appinfo-test.desktop create mode 100644 gio/tests/appinfo-test2.desktop create mode 100644 gio/tests/appinfo.c create mode 100644 gio/tests/async-close-output-stream.c create mode 100644 gio/tests/basic-application.c create mode 100644 gio/tests/buffered-input-stream.c create mode 100644 gio/tests/buffered-output-stream.c create mode 100644 gio/tests/cancellable.c create mode 100644 gio/tests/cert-key.pem create mode 100644 gio/tests/cert-list.pem create mode 100644 gio/tests/cert1.pem create mode 100644 gio/tests/cert2.pem create mode 100644 gio/tests/cert3.pem create mode 100644 gio/tests/contenttype.c create mode 100644 gio/tests/contexts.c create mode 100644 gio/tests/converter-stream.c create mode 100644 gio/tests/credentials.c create mode 100644 gio/tests/data-input-stream.c create mode 100644 gio/tests/data-output-stream.c create mode 100644 gio/tests/de.po create mode 100644 gio/tests/desktop-app-info.c create mode 100644 gio/tests/echo-server.c create mode 100644 gio/tests/enums.xml.template create mode 100644 gio/tests/file.c create mode 100644 gio/tests/fileattributematcher.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/gapplication-example-actions.c create mode 100644 gio/tests/gapplication-example-cmdline.c create mode 100644 gio/tests/gapplication-example-cmdline2.c create mode 100644 gio/tests/gapplication-example-cmdline3.c create mode 100644 gio/tests/gapplication-example-dbushooks.c create mode 100644 gio/tests/gapplication-example-open.c create mode 100644 gio/tests/gapplication.c create mode 100644 gio/tests/gdbus-addresses.c create mode 100644 gio/tests/gdbus-auth.c create mode 100644 gio/tests/gdbus-bz627724.c create mode 100644 gio/tests/gdbus-close-pending.c create mode 100644 gio/tests/gdbus-connection-flush-helper.c create mode 100644 gio/tests/gdbus-connection-flush.c create mode 100644 gio/tests/gdbus-connection-loss.c create mode 100644 gio/tests/gdbus-connection-slow.c create mode 100644 gio/tests/gdbus-connection.c create mode 100644 gio/tests/gdbus-daemon.c create mode 100644 gio/tests/gdbus-error.c create mode 100644 gio/tests/gdbus-example-export.c create mode 100644 gio/tests/gdbus-example-objectmanager-client.c create mode 100644 gio/tests/gdbus-example-objectmanager-server.c create mode 100644 gio/tests/gdbus-example-own-name.c create mode 100644 gio/tests/gdbus-example-peer.c create mode 100644 gio/tests/gdbus-example-proxy-subclass.c create mode 100644 gio/tests/gdbus-example-server.c create mode 100644 gio/tests/gdbus-example-subtree.c create mode 100644 gio/tests/gdbus-example-unix-fd-client.c create mode 100644 gio/tests/gdbus-example-watch-name.c create mode 100644 gio/tests/gdbus-example-watch-proxy.c create mode 100644 gio/tests/gdbus-exit-on-close.c create mode 100644 gio/tests/gdbus-export.c create mode 100644 gio/tests/gdbus-introspection.c create mode 100644 gio/tests/gdbus-message.c create mode 100644 gio/tests/gdbus-names.c create mode 100644 gio/tests/gdbus-non-socket.c create mode 100644 gio/tests/gdbus-object-manager-example/Makefile.am create mode 100644 gio/tests/gdbus-object-manager-example/gdbus-example-objectmanager.xml create mode 100644 gio/tests/gdbus-peer-object-manager.c create mode 100644 gio/tests/gdbus-peer.c create mode 100644 gio/tests/gdbus-proxy-threads.c create mode 100644 gio/tests/gdbus-proxy-well-known-name.c create mode 100644 gio/tests/gdbus-proxy.c create mode 100644 gio/tests/gdbus-serialization.c create mode 100644 gio/tests/gdbus-sessionbus.c create mode 100644 gio/tests/gdbus-sessionbus.h create mode 100644 gio/tests/gdbus-test-codegen.c create mode 100644 gio/tests/gdbus-test-fixture.c create mode 100644 gio/tests/gdbus-tests.c create mode 100644 gio/tests/gdbus-tests.h create mode 100644 gio/tests/gdbus-testserver.c create mode 100644 gio/tests/gdbus-threading.c create mode 100644 gio/tests/gmenumodel.c create mode 100644 gio/tests/gschema-compile.c create mode 100644 gio/tests/gsettings.c create mode 100644 gio/tests/gtesttlsbackend.c create mode 100644 gio/tests/gtesttlsbackend.h create mode 100644 gio/tests/gtlsconsoleinteraction.c create mode 100644 gio/tests/gtlsconsoleinteraction.h create mode 100644 gio/tests/httpd.c create mode 100644 gio/tests/inet-address.c create mode 100644 gio/tests/io-stream.c create mode 100644 gio/tests/key-cert.pem create mode 100644 gio/tests/key.pem create mode 100644 gio/tests/key8.pem create mode 100644 gio/tests/live-g-file.c create mode 100644 gio/tests/live-g-file.txt create mode 100644 gio/tests/memory-input-stream.c create mode 100644 gio/tests/memory-output-stream.c create mode 100644 gio/tests/mimeapps.c create mode 100644 gio/tests/network-address.c create mode 100644 gio/tests/network-monitor.c create mode 100644 gio/tests/nothing.pem create mode 100644 gio/tests/org.gtk.schemasourcecheck.gschema.xml create mode 100644 gio/tests/org.gtk.test.gschema create mode 100644 gio/tests/org.gtk.test.gschema.xml create mode 100644 gio/tests/permission.c create mode 100644 gio/tests/pollable.c create mode 100644 gio/tests/proxy-test.c create mode 100644 gio/tests/proxy.c create mode 100644 gio/tests/readwrite.c create mode 100644 gio/tests/resolver.c create mode 100644 gio/tests/resourceplugin.c create mode 100644 gio/tests/resources.c create mode 100644 gio/tests/schema-tests/array-default-not-in-choices.gschema.xml create mode 100644 gio/tests/schema-tests/bad-choice.gschema.xml create mode 100644 gio/tests/schema-tests/bad-key.gschema.xml create mode 100644 gio/tests/schema-tests/bad-key2.gschema.xml create mode 100644 gio/tests/schema-tests/bad-key3.gschema.xml create mode 100644 gio/tests/schema-tests/bad-key4.gschema.xml create mode 100644 gio/tests/schema-tests/bad-type.gschema.xml create mode 100644 gio/tests/schema-tests/bare-alias.gschema.xml create mode 100644 gio/tests/schema-tests/cdata.gschema.xml create mode 100644 gio/tests/schema-tests/choice-alias.gschema.xml create mode 100644 gio/tests/schema-tests/choice-bad.gschema.xml create mode 100644 gio/tests/schema-tests/choice-badtype.gschema.xml create mode 100644 gio/tests/schema-tests/choice-invalid-alias.gschema.xml create mode 100644 gio/tests/schema-tests/choice-missing-value.gschema.xml create mode 100644 gio/tests/schema-tests/choice-shadowed-alias.gschema.xml create mode 100644 gio/tests/schema-tests/choice-upside-down.gschema.xml create mode 100644 gio/tests/schema-tests/choice.gschema.xml create mode 100644 gio/tests/schema-tests/choices-wrong-type.gschema.xml create mode 100644 gio/tests/schema-tests/default-in-aliases.gschema.xml create mode 100644 gio/tests/schema-tests/default-not-in-choices.gschema.xml create mode 100644 gio/tests/schema-tests/default-out-of-range.gschema.xml create mode 100644 gio/tests/schema-tests/empty-key.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-aliases.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-bad-default.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-chained-alias.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-choice.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-invalid-alias.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-repeated-alias.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-repeated-nick.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-repeated-value.gschema.xml create mode 100644 gio/tests/schema-tests/enum-with-shadow-alias.gschema.xml create mode 100644 gio/tests/schema-tests/enum.gschema.xml create mode 100644 gio/tests/schema-tests/extend-and-shadow-indirect.gschema.xml create mode 100644 gio/tests/schema-tests/extend-and-shadow.gschema.xml create mode 100644 gio/tests/schema-tests/extend-missing.gschema.xml create mode 100644 gio/tests/schema-tests/extend-nonlist.gschema.xml create mode 100644 gio/tests/schema-tests/extend-self.gschema.xml create mode 100644 gio/tests/schema-tests/extend-wrong-list-indirect.gschema.xml create mode 100644 gio/tests/schema-tests/extend-wrong-list.gschema.xml create mode 100644 gio/tests/schema-tests/extending.gschema.xml create mode 100644 gio/tests/schema-tests/flags-aliased-default.gschema.xml create mode 100644 gio/tests/schema-tests/flags-bad-default.gschema.xml create mode 100644 gio/tests/schema-tests/flags-more-than-one-bit.gschema.xml create mode 100644 gio/tests/schema-tests/flags-with-enum-attr.gschema.xml create mode 100644 gio/tests/schema-tests/flags-with-enum-tag.gschema.xml create mode 100644 gio/tests/schema-tests/from-docs.gschema.xml create mode 100644 gio/tests/schema-tests/incomplete-list.gschema.xml create mode 100644 gio/tests/schema-tests/inherit-gettext-domain.gschema.xml create mode 100644 gio/tests/schema-tests/invalid-path.gschema.xml create mode 100644 gio/tests/schema-tests/key-in-list-indirect.gschema.xml create mode 100644 gio/tests/schema-tests/key-in-list.gschema.xml create mode 100644 gio/tests/schema-tests/list-of-missing.gschema.xml create mode 100644 gio/tests/schema-tests/missing-quotes.gschema.xml create mode 100644 gio/tests/schema-tests/no-default.gschema.xml create mode 100644 gio/tests/schema-tests/overflow.gschema.xml create mode 100644 gio/tests/schema-tests/override-missing.gschema.xml create mode 100644 gio/tests/schema-tests/override-range-error.gschema.xml create mode 100644 gio/tests/schema-tests/override-then-key.gschema.xml create mode 100644 gio/tests/schema-tests/override-twice.gschema.xml create mode 100644 gio/tests/schema-tests/override-type-error.gschema.xml create mode 100644 gio/tests/schema-tests/override.gschema.xml create mode 100644 gio/tests/schema-tests/range-badtype.gschema.xml create mode 100644 gio/tests/schema-tests/range-default-high.gschema.xml create mode 100644 gio/tests/schema-tests/range-default-low.gschema.xml create mode 100644 gio/tests/schema-tests/range-high-default.gschema.xml create mode 100644 gio/tests/schema-tests/range-low-default.gschema.xml create mode 100644 gio/tests/schema-tests/range-missing-max.gschema.xml create mode 100644 gio/tests/schema-tests/range-missing-min.gschema.xml create mode 100644 gio/tests/schema-tests/range-parse-error.gschema.xml create mode 100644 gio/tests/schema-tests/range-type-test.gschema.xml create mode 100644 gio/tests/schema-tests/range-wrong-type.gschema.xml create mode 100644 gio/tests/schema-tests/range.gschema.xml create mode 100644 gio/tests/schema-tests/wrong-category.gschema.xml create mode 100644 gio/tests/send-data.c create mode 100644 gio/tests/services/Makefile.am create mode 100644 gio/tests/services/org.gtk.GDBus.Examples.ObjectManager.service.in create mode 100644 gio/tests/simple-async-result.c create mode 100644 gio/tests/simple-proxy.c create mode 100644 gio/tests/sleepy-stream.c create mode 100644 gio/tests/socket-client.c create mode 100644 gio/tests/socket-common.c create mode 100644 gio/tests/socket-server.c create mode 100644 gio/tests/socket.c create mode 100644 gio/tests/srvtarget.c create mode 100644 gio/tests/task.c create mode 100644 gio/tests/test-codegen.xml create mode 100644 gio/tests/test-io-stream.c create mode 100644 gio/tests/test-io-stream.h create mode 100644 gio/tests/test-pipe-unix.c create mode 100644 gio/tests/test-pipe-unix.h create mode 100644 gio/tests/test.gresource.xml create mode 100644 gio/tests/test1.txt create mode 100644 gio/tests/test2.gresource.xml create mode 100644 gio/tests/test2.txt create mode 100644 gio/tests/test3.gresource.xml create mode 100644 gio/tests/test3.txt create mode 100644 gio/tests/test4.gresource.xml create mode 100644 gio/tests/testenum.h create mode 100644 gio/tests/tls-certificate.c create mode 100644 gio/tests/tls-interaction.c create mode 100644 gio/tests/unix-fd.c create mode 100644 gio/tests/unix-streams.c create mode 100644 gio/tests/vfs.c create mode 100644 gio/tests/volumemonitor.c create mode 100644 gio/tests/win32-streams.c create mode 100644 gio/win32/Makefile.am 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/makefile.msc create mode 100644 gio/win32/winhttp.h create mode 100644 gio/xdgmime/.gitignore create mode 100644 gio/xdgmime/Makefile.am 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.pc.in create mode 100644 glib-gettextize.in create mode 100755 glib-zip.in create mode 100644 glib.doap create mode 100644 glib/.gitignore create mode 100644 glib/Makefile.am create mode 100644 glib/deprecated/gallocator.c create mode 100644 glib/deprecated/gallocator.h create mode 100644 glib/deprecated/gcache.c create mode 100644 glib/deprecated/gcache.h create mode 100644 glib/deprecated/gcompletion.c create mode 100644 glib/deprecated/gcompletion.h create mode 100644 glib/deprecated/gmain.h create mode 100644 glib/deprecated/grel.c create mode 100644 glib/deprecated/grel.h create mode 100644 glib/deprecated/gthread-deprecated.c create mode 100644 glib/deprecated/gthread.h create mode 100644 glib/docs.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/gasyncqueueprivate.h 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/gbytes.c create mode 100644 glib/gbytes.h create mode 100644 glib/gcharset.c create mode 100644 glib/gcharset.h create mode 100644 glib/gcharsetprivate.h create mode 100644 glib/gchecksum.c create mode 100644 glib/gchecksum.h create mode 100644 glib/gconstructor.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/gdatetime.c create mode 100644 glib/gdatetime.h create mode 100644 glib/gdir.c create mode 100644 glib/gdir.h create mode 100755 glib/gen-iswide-table.py create mode 100755 glib/gen-script-table.pl create mode 100755 glib/gen-unicode-tables.pl create mode 100644 glib/genviron.c create mode 100644 glib/genviron.h 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/ggettext.c create mode 100644 glib/ggettext.h create mode 100644 glib/ghash.c create mode 100644 glib/ghash.h create mode 100644 glib/ghmac.c create mode 100644 glib/ghmac.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-init.c create mode 100644 glib/glib-init.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-private.c create mode 100644 glib/glib-private.h create mode 100644 glib/glib-unix.c create mode 100644 glib/glib-unix.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.stp.in create mode 100644 glib/glib_probes.d create mode 100644 glib/glib_trace.h create mode 100644 glib/glibconfig.h.win32.in 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-internal.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/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.c 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/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.c create mode 100644 glib/gspawn-win32.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 100644 glib/gstringchunk.c create mode 100644 glib/gstringchunk.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-posix.c create mode 100644 glib/gthread-win32.c 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/gtimezone.c create mode 100644 glib/gtimezone.h create mode 100644 glib/gtrashstack.c create mode 100644 glib/gtrashstack.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/gversion.c create mode 100644 glib/gversion.h create mode 100644 glib/gversionmacros.h create mode 100644 glib/gwakeup.c create mode 100644 glib/gwakeup.h create mode 100644 glib/gwin32.c create mode 100644 glib/gwin32.h create mode 100644 glib/libcharset/.gitignore create mode 100644 glib/libcharset/Makefile.am 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 100644 glib/pcre/COPYING create mode 100644 glib/pcre/Makefile.am create mode 100644 glib/pcre/makefile.msc create mode 100644 glib/pcre/pcre.h create mode 100644 glib/pcre/pcre_byte_order.c 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_internal.h create mode 100644 glib/pcre/pcre_jit_compile.c create mode 100644 glib/pcre/pcre_newline.c create mode 100644 glib/pcre/pcre_ord2utf8.c create mode 100644 glib/pcre/pcre_string_utils.c create mode 100644 glib/pcre/pcre_study.c create mode 100644 glib/pcre/pcre_tables.c create mode 100644 glib/pcre/pcre_valid_utf8.c create mode 100644 glib/pcre/pcre_xclass.c create mode 100644 glib/pcre/ucp.h create mode 100644 glib/tests/.gitignore create mode 100644 glib/tests/1bit-mutex.c create mode 100644 glib/tests/4096-random-bytes create mode 100644 glib/tests/642026.c create mode 100644 glib/tests/Makefile.am create mode 100644 glib/tests/array-test.c create mode 100644 glib/tests/asyncqueue.c create mode 100644 glib/tests/atomic.c create mode 100644 glib/tests/base64.c create mode 100644 glib/tests/bitlock.c create mode 100644 glib/tests/bookmarkfile.c create mode 100644 glib/tests/bookmarks.xbel create mode 100644 glib/tests/bookmarks/fail-01.xbel create mode 100644 glib/tests/bookmarks/fail-02.xbel create mode 100644 glib/tests/bookmarks/fail-03.xbel create mode 100644 glib/tests/bookmarks/fail-04.xbel create mode 100644 glib/tests/bookmarks/fail-05.xbel create mode 100644 glib/tests/bookmarks/fail-06.xbel create mode 100644 glib/tests/bookmarks/fail-07.xbel create mode 100644 glib/tests/bookmarks/fail-08.xbel create mode 100644 glib/tests/bookmarks/fail-09.xbel create mode 100644 glib/tests/bookmarks/fail-10.xbel create mode 100644 glib/tests/bookmarks/fail-11.xbel create mode 100644 glib/tests/bookmarks/fail-12.xbel create mode 100644 glib/tests/bookmarks/fail-13.xbel create mode 100644 glib/tests/bookmarks/fail-14.xbel create mode 100644 glib/tests/bookmarks/fail-15.xbel create mode 100644 glib/tests/bookmarks/fail-16.xbel create mode 100644 glib/tests/bookmarks/fail-17.xbel create mode 100644 glib/tests/bookmarks/valid-01.xbel create mode 100644 glib/tests/bookmarks/valid-02.xbel create mode 100644 glib/tests/bookmarks/valid-03.xbel create mode 100644 glib/tests/bytes.c create mode 100644 glib/tests/cache.c create mode 100644 glib/tests/checksum.c create mode 100644 glib/tests/collate.c create mode 100644 glib/tests/cond.c create mode 100644 glib/tests/convert.c create mode 100644 glib/tests/dataset.c create mode 100644 glib/tests/date.c create mode 100644 glib/tests/dir.c create mode 100755 glib/tests/echo-script create mode 100644 glib/tests/empty create mode 100644 glib/tests/environment.c create mode 100644 glib/tests/error.c create mode 100644 glib/tests/fileutils.c create mode 100644 glib/tests/gdatetime.c create mode 100644 glib/tests/gvariant.c create mode 100644 glib/tests/gwakeuptest.c create mode 100644 glib/tests/hash.c create mode 100644 glib/tests/hmac.c create mode 100644 glib/tests/hook.c create mode 100644 glib/tests/hostutils.c create mode 100644 glib/tests/include.c create mode 100644 glib/tests/keyfile.c create mode 100644 glib/tests/keyfiletest.ini create mode 100644 glib/tests/list.c create mode 100644 glib/tests/logging.c create mode 100644 glib/tests/mainloop.c create mode 100644 glib/tests/mappedfile.c create mode 100644 glib/tests/markup-collect.c create mode 100644 glib/tests/markup-escape.c create mode 100644 glib/tests/markup-parse.c create mode 100644 glib/tests/markup-subparser.c create mode 100644 glib/tests/markups/fail-1.expected create mode 100644 glib/tests/markups/fail-1.gmarkup create mode 100644 glib/tests/markups/fail-10.expected create mode 100644 glib/tests/markups/fail-10.gmarkup create mode 100644 glib/tests/markups/fail-11.expected create mode 100644 glib/tests/markups/fail-11.gmarkup create mode 100644 glib/tests/markups/fail-12.expected create mode 100644 glib/tests/markups/fail-12.gmarkup create mode 100644 glib/tests/markups/fail-13.expected create mode 100644 glib/tests/markups/fail-13.gmarkup create mode 100644 glib/tests/markups/fail-14.expected create mode 100644 glib/tests/markups/fail-14.gmarkup create mode 100644 glib/tests/markups/fail-15.expected create mode 100644 glib/tests/markups/fail-15.gmarkup create mode 100644 glib/tests/markups/fail-16.expected create mode 100644 glib/tests/markups/fail-16.gmarkup create mode 100644 glib/tests/markups/fail-17.expected create mode 100644 glib/tests/markups/fail-17.gmarkup create mode 100644 glib/tests/markups/fail-18.expected create mode 100644 glib/tests/markups/fail-18.gmarkup create mode 100644 glib/tests/markups/fail-19.expected create mode 100644 glib/tests/markups/fail-19.gmarkup create mode 100644 glib/tests/markups/fail-2.expected create mode 100644 glib/tests/markups/fail-2.gmarkup create mode 100644 glib/tests/markups/fail-20.expected create mode 100644 glib/tests/markups/fail-20.gmarkup create mode 100644 glib/tests/markups/fail-21.expected create mode 100644 glib/tests/markups/fail-21.gmarkup create mode 100644 glib/tests/markups/fail-22.expected create mode 100644 glib/tests/markups/fail-22.gmarkup create mode 100644 glib/tests/markups/fail-23.expected create mode 100644 glib/tests/markups/fail-23.gmarkup create mode 100644 glib/tests/markups/fail-24.expected create mode 100644 glib/tests/markups/fail-24.gmarkup create mode 100644 glib/tests/markups/fail-25.expected create mode 100644 glib/tests/markups/fail-25.gmarkup create mode 100644 glib/tests/markups/fail-26.expected create mode 100644 glib/tests/markups/fail-26.gmarkup create mode 100644 glib/tests/markups/fail-27.expected create mode 100644 glib/tests/markups/fail-27.gmarkup create mode 100644 glib/tests/markups/fail-28.expected create mode 100644 glib/tests/markups/fail-28.gmarkup create mode 100644 glib/tests/markups/fail-29.expected create mode 100644 glib/tests/markups/fail-29.gmarkup create mode 100644 glib/tests/markups/fail-3.gmarkup create mode 100644 glib/tests/markups/fail-30.expected create mode 100644 glib/tests/markups/fail-30.gmarkup create mode 100644 glib/tests/markups/fail-31.expected create mode 100644 glib/tests/markups/fail-31.gmarkup create mode 100644 glib/tests/markups/fail-32.expected create mode 100644 glib/tests/markups/fail-32.gmarkup create mode 100644 glib/tests/markups/fail-33.expected create mode 100644 glib/tests/markups/fail-33.gmarkup create mode 100644 glib/tests/markups/fail-34.expected create mode 100644 glib/tests/markups/fail-34.gmarkup create mode 100644 glib/tests/markups/fail-35.expected create mode 100644 glib/tests/markups/fail-35.gmarkup create mode 100644 glib/tests/markups/fail-36.gmarkup create mode 100644 glib/tests/markups/fail-37.expected create mode 100644 glib/tests/markups/fail-37.gmarkup create mode 100644 glib/tests/markups/fail-38.expected create mode 100644 glib/tests/markups/fail-38.gmarkup create mode 100644 glib/tests/markups/fail-39.expected create mode 100644 glib/tests/markups/fail-39.gmarkup create mode 100644 glib/tests/markups/fail-4.expected create mode 100644 glib/tests/markups/fail-4.gmarkup create mode 100644 glib/tests/markups/fail-40.expected create mode 100644 glib/tests/markups/fail-40.gmarkup create mode 100644 glib/tests/markups/fail-41.expected create mode 100644 glib/tests/markups/fail-41.gmarkup create mode 100644 glib/tests/markups/fail-42.expected create mode 100644 glib/tests/markups/fail-42.gmarkup create mode 100644 glib/tests/markups/fail-43.expected create mode 100644 glib/tests/markups/fail-43.gmarkup create mode 100644 glib/tests/markups/fail-44.expected create mode 100644 glib/tests/markups/fail-44.gmarkup create mode 100644 glib/tests/markups/fail-45.expected create mode 100644 glib/tests/markups/fail-45.gmarkup create mode 100644 glib/tests/markups/fail-46.expected create mode 100644 glib/tests/markups/fail-46.gmarkup create mode 100644 glib/tests/markups/fail-47.expected create mode 100644 glib/tests/markups/fail-47.gmarkup create mode 100644 glib/tests/markups/fail-48.expected create mode 100644 glib/tests/markups/fail-48.gmarkup create mode 100644 glib/tests/markups/fail-49.expected create mode 100644 glib/tests/markups/fail-49.gmarkup create mode 100644 glib/tests/markups/fail-5.expected create mode 100644 glib/tests/markups/fail-5.gmarkup create mode 100644 glib/tests/markups/fail-6.expected create mode 100644 glib/tests/markups/fail-6.gmarkup create mode 100644 glib/tests/markups/fail-7.expected create mode 100644 glib/tests/markups/fail-7.gmarkup create mode 100644 glib/tests/markups/fail-8.expected create mode 100644 glib/tests/markups/fail-8.gmarkup create mode 100644 glib/tests/markups/fail-9.expected create mode 100644 glib/tests/markups/fail-9.gmarkup create mode 100644 glib/tests/markups/valid-1.expected create mode 100644 glib/tests/markups/valid-1.gmarkup create mode 100644 glib/tests/markups/valid-10.expected create mode 100644 glib/tests/markups/valid-10.gmarkup create mode 100644 glib/tests/markups/valid-11.expected create mode 100644 glib/tests/markups/valid-11.gmarkup create mode 100644 glib/tests/markups/valid-12.expected create mode 100644 glib/tests/markups/valid-12.gmarkup create mode 100644 glib/tests/markups/valid-13.expected create mode 100644 glib/tests/markups/valid-13.gmarkup create mode 100644 glib/tests/markups/valid-14.expected create mode 100644 glib/tests/markups/valid-14.gmarkup create mode 100644 glib/tests/markups/valid-15.expected create mode 100644 glib/tests/markups/valid-15.gmarkup create mode 100644 glib/tests/markups/valid-2.expected create mode 100644 glib/tests/markups/valid-2.gmarkup create mode 100644 glib/tests/markups/valid-3.expected create mode 100644 glib/tests/markups/valid-3.gmarkup create mode 100644 glib/tests/markups/valid-4.expected create mode 100644 glib/tests/markups/valid-4.gmarkup create mode 100644 glib/tests/markups/valid-5.expected create mode 100644 glib/tests/markups/valid-5.gmarkup create mode 100644 glib/tests/markups/valid-6.expected create mode 100644 glib/tests/markups/valid-6.gmarkup create mode 100644 glib/tests/markups/valid-7.expected create mode 100644 glib/tests/markups/valid-7.gmarkup create mode 100644 glib/tests/markups/valid-8.expected create mode 100644 glib/tests/markups/valid-8.gmarkup create mode 100644 glib/tests/markups/valid-9.expected create mode 100644 glib/tests/markups/valid-9.gmarkup create mode 100644 glib/tests/mem-overflow.c create mode 100644 glib/tests/mutex.c create mode 100644 glib/tests/node.c create mode 100644 glib/tests/once.c create mode 100644 glib/tests/option-argv0.c create mode 100644 glib/tests/option-context.c create mode 100644 glib/tests/pages.ini create mode 100644 glib/tests/pattern.c create mode 100644 glib/tests/private.c create mode 100644 glib/tests/protocol.c create mode 100644 glib/tests/queue.c create mode 100644 glib/tests/rand.c create mode 100644 glib/tests/rec-mutex.c create mode 100644 glib/tests/regex.c create mode 100644 glib/tests/rwlock.c create mode 100644 glib/tests/scannerapi.c create mode 100644 glib/tests/sequence.c create mode 100644 glib/tests/shell.c create mode 100644 glib/tests/slice.c create mode 100644 glib/tests/slist.c create mode 100644 glib/tests/sort.c create mode 100644 glib/tests/spawn-multithreaded.c create mode 100644 glib/tests/spawn-singlethread.c create mode 100644 glib/tests/strfuncs.c create mode 100644 glib/tests/string.c create mode 100644 glib/tests/test-printf.c create mode 100644 glib/tests/test-spawn-echo.c create mode 100644 glib/tests/testing.c create mode 100644 glib/tests/thread.c create mode 100644 glib/tests/timeout.c create mode 100644 glib/tests/tree.c create mode 100644 glib/tests/unicode.c create mode 100644 glib/tests/unix.c create mode 100644 glib/tests/uri.c create mode 100644 glib/tests/utf8-misc.c create mode 100644 glib/tests/utf8-performance.c create mode 100644 glib/tests/utf8-pointer.c create mode 100644 glib/tests/utf8-validate.c create mode 100644 glib/tests/utils.c create mode 100644 glib/update-pcre/Makefile.am create mode 100644 glib/update-pcre/digitab.patch create mode 100644 glib/update-pcre/memory.patch create mode 100644 glib/update-pcre/ucp.patch create mode 100644 glib/update-pcre/update.sh create mode 100644 glib/win_iconv.c 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.pc.in create mode 100644 gmodule/.gitignore 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/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/gmoduleconf.h.in create mode 100644 gmodule/gmoduleconf.h.win32 create mode 100644 gmodule/makefile.msc.in create mode 100644 gobject-2.0.pc.in create mode 100644 gobject/.gitignore create mode 100644 gobject/ChangeLog create mode 100644 gobject/Makefile.am create mode 100644 gobject/gatomicarray.c create mode 100644 gobject/gatomicarray.h create mode 100644 gobject/gbinding.c create mode 100644 gobject/gbinding.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.c create mode 100755 gobject/glib-mkenums.in create mode 100644 gobject/glib-types.h create mode 100644 gobject/gmarshal.c create mode 100644 gobject/gmarshal.h create mode 100644 gobject/gmarshal.list 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.stp.in create mode 100644 gobject/gobject_probes.d create mode 100644 gobject/gobject_trace.h 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 100644 gobject/marshal-genstrings.pl create mode 100644 gobject/tests/.gitignore create mode 100644 gobject/tests/Makefile.am create mode 100644 gobject/tests/binding.c create mode 100644 gobject/tests/boxed.c create mode 100644 gobject/tests/dynamictests.c create mode 100644 gobject/tests/enums.c create mode 100644 gobject/tests/ifaceproperties.c create mode 100644 gobject/tests/marshalers.list create mode 100644 gobject/tests/param.c create mode 100644 gobject/tests/properties.c create mode 100644 gobject/tests/qdata.c create mode 100644 gobject/tests/reference.c create mode 100644 gobject/tests/signals.c create mode 100644 gobject/tests/testcommon.h create mode 100644 gobject/tests/threadtests.c create mode 100644 gobject/tests/valuearray.c create mode 100644 gthread-2.0.pc.in create mode 100644 gthread/.gitignore create mode 100644 gthread/ChangeLog create mode 100644 gthread/Makefile.am create mode 100644 gthread/gthread-impl.c create mode 100644 gthread/gthread.def create mode 100644 gthread/gthread.rc.in create mode 100644 gthread/makefile.msc.in create mode 100644 m4macros/.gitignore create mode 100644 m4macros/Makefile.am create mode 100644 m4macros/attributes.m4 create mode 100644 m4macros/glib-2.0.m4 create mode 100644 m4macros/glib-gettext.m4 create mode 100644 m4macros/gsettings.m4 create mode 100644 makefile.msc create mode 100644 msvc_recommended_pragmas.h create mode 100644 po/.gitignore 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/POTFILES.skip create mode 100644 po/README.translators create mode 100644 po/af.po create mode 100644 po/am.po create mode 100644 po/ar.po create mode 100644 po/as.po create mode 100644 po/ast.po create mode 100644 po/az.po create mode 100644 po/be.po create mode 100644 po/be@latin.po create mode 100644 po/bg.po create mode 100644 po/bn.po create mode 100644 po/bn_IN.po create mode 100644 po/bs.po create mode 100644 po/ca.po create mode 100644 po/ca@valencia.po create mode 100644 po/cs.po create mode 100644 po/cy.po create mode 100644 po/da.po create mode 100644 po/de.po create mode 100644 po/dz.po create mode 100644 po/el.po create mode 100644 po/en@shaw.po create mode 100644 po/en_CA.po create mode 100644 po/en_GB.po create mode 100644 po/eo.po create mode 100644 po/es.po create mode 100644 po/et.po create mode 100644 po/eu.po create mode 100644 po/fa.po create mode 100644 po/fi.po create mode 100644 po/fr.po create mode 100644 po/ga.po create mode 100644 po/gl.po create mode 100644 po/gu.po create mode 100644 po/he.po create mode 100644 po/hi.po create mode 100644 po/hr.po create mode 100644 po/hu.po create mode 100644 po/hy.po create mode 100644 po/id.po create mode 100644 po/is.po create mode 100644 po/it.po create mode 100644 po/ja.po create mode 100644 po/ka.po create mode 100644 po/kk.po create mode 100644 po/kn.po create mode 100644 po/ko.po create mode 100644 po/ku.po create mode 100644 po/lt.po create mode 100644 po/lv.po create mode 100644 po/mai.po create mode 100644 po/mg.po create mode 100644 po/mk.po create mode 100644 po/ml.po create mode 100644 po/mn.po create mode 100644 po/mr.po create mode 100644 po/ms.po create mode 100644 po/nb.po create mode 100644 po/nds.po create mode 100644 po/ne.po create mode 100644 po/nl.po create mode 100644 po/nn.po create mode 100644 po/oc.po create mode 100644 po/or.po create mode 100644 po/pa.po create mode 100644 po/pl.po create mode 100644 po/po2tbl.sed.in create mode 100644 po/ps.po create mode 100644 po/pt.po create mode 100644 po/pt_BR.po create mode 100644 po/ro.po create mode 100644 po/ru.po create mode 100644 po/rw.po create mode 100644 po/si.po create mode 100644 po/sk.po create mode 100644 po/sl.po create mode 100644 po/sq.po create mode 100644 po/sr.po create mode 100644 po/sr@ije.po create mode 100644 po/sr@latin.po create mode 100644 po/sv.po create mode 100644 po/ta.po create mode 100644 po/te.po create mode 100644 po/th.po create mode 100644 po/tl.po create mode 100644 po/tr.po create mode 100644 po/tt.po create mode 100644 po/ug.po create mode 100644 po/uk.po create mode 100644 po/vi.po create mode 100644 po/wa.po create mode 100644 po/xh.po create mode 100644 po/yi.po create mode 100644 po/zh_CN.po create mode 100644 po/zh_HK.po create mode 100644 po/zh_TW.po create mode 100755 sanity_check create mode 100644 tests/.gitignore create mode 100644 tests/Makefile.am create mode 100644 tests/assert-msg-test.c create mode 100644 tests/assert-msg-test.gdb create mode 100644 tests/asyncqueue-test.c create mode 100644 tests/atomic-test.c create mode 100644 tests/bit-test.c create mode 100644 tests/casefold.txt create mode 100644 tests/casemap.txt 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/cxx-test.C create mode 100644 tests/datetime.c create mode 100644 tests/dirname-test.c create mode 100644 tests/env-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-ls.c create mode 100644 tests/gio-test.c create mode 100644 tests/gobject/.gitignore create mode 100644 tests/gobject/Makefile.am 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/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 100755 tests/gobject/run-performance.sh create mode 100644 tests/gobject/singleton.c create mode 100644 tests/gobject/testcommon.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/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/mainloop-test.c create mode 100644 tests/makefile.msc.in create mode 100644 tests/mapping-test.c create mode 100644 tests/memchunks.c create mode 100644 tests/module-test.c create mode 100644 tests/onceinit.c create mode 100644 tests/qsort-test.c create mode 100644 tests/refcount/Makefile.am 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/properties3.c create mode 100644 tests/refcount/properties4.c create mode 100644 tests/refcount/signals.c create mode 100644 tests/relation-test.c create mode 100755 tests/run-assert-msg-test.sh create mode 100755 tests/run-collate-tests.sh 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/sources.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/testgobject.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/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/utf8.txt create mode 100644 win32-fixup.pl diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..abf24af --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1 @@ +((c-mode . ((indent-tabs-mode . nil))))) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..52cb21d --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# for all subdirectories +Makefile.in +Makefile +TAGS +.libs +.deps +*.o +*.lo +*.la +*.pc +.*.swp +.sw? +*.rc +*.gcno +*.gcda +*.gcov +*.sourcefiles +*.stp +*.exe +*.def + +# autofoo stuff here +compile +config.* +configure +depcomp +aclocal.m4 +autom4te.cache +stamp-* +libtool +ltmain.sh +mingw32-config.cache +missing +install-sh +glib-gettextize +glib-zip +gtk-doc.make +py-compile + +INSTALL +README +ChangeLog +/glib-lcov.info +/glib-lcov/ 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.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..a1f613a --- /dev/null +++ b/HACKING @@ -0,0 +1,36 @@ +If you want to hack on the GLib project, you'll need to have the +following packages installed: + + - GNU autoconf 2.62 + - GNU automake 1.11 + - GNU libtool 2.2 + - GNU gettext 0.10.40 + - pkg-config 0.16 + - gtk-doc + - libffi 3.0.0 + +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 GIT 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: + + checkout/glib# ./autogen.sh + +Basically this does the following for you: + + checkout/glib# aclocal; automake; autoconf + + The above commands create the "configure" script. Now you + can run the configure script in checkout/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..27a7c1a --- /dev/null +++ b/INSTALL.in @@ -0,0 +1,122 @@ +Simple install procedure +======================== + + % tar xf glib-@GLIB_VERSION@.tar.gz # 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. + +GObject uses libffi to implement generic marshalling functionality. + +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://library.gnome.org/devel/glib/stable/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/Makefile.am b/Makefile.am new file mode 100644 index 0000000..b2555ad --- /dev/null +++ b/Makefile.am @@ -0,0 +1,140 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +# http://people.gnome.org/~walters/docs/build-api.txt +.buildapi-allow-builddir: + +ACLOCAL_AMFLAGS = -I m4macros ${ACLOCAL_FLAGS} + +SUBDIRS = . m4macros glib gmodule gthread gobject gio po docs +DIST_SUBDIRS = $(SUBDIRS) build +if BUILD_MODULAR_TESTS +SUBDIRS += tests +else +DIST_SUBDIRS += tests +endif + +bin_SCRIPTS = glib-gettextize + +if OS_LINUX +TESTS = check-abis.sh +endif + +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 \ + autogen.sh \ + Makefile.decl \ + makefile.msc \ + 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 \ + gio-windows-2.0.pc.in \ + check-abis.sh + + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + README \ + INSTALL \ + ChangeLog \ + config.h.win32 \ + gtk-doc.make + +CONFIGURE_DEPENDENCIES = acglib.m4 + +ChangeLog: + $(AM_V_GEN) 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 + +if OS_WIN32 +pkgconfig_DATA += gio-windows-2.0.pc +endif + +$(pkgconfig_DATA): config.status + +# build documentation when doing distcheck +DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-gtk-doc --enable-man --disable-maintainer-mode + +DISTCLEANFILES = config.lt + +distclean-local: lcov-clean + 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..50cf169 --- /dev/null +++ b/Makefile.decl @@ -0,0 +1,97 @@ +# 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-nonrecursive +if OS_UNIX + @ for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done + +# test-nonrecursive: run tests only in cwd +test-nonrecursive: ${TEST_PROGS} + @test -z "${TEST_PROGS}" || G_DEBUG=gc-friendly MALLOC_CHECK_=2 MALLOC_PERTURB_=$$(($${RANDOM:-256} % 256)) ${GTESTER} --verbose ${TEST_PROGS} +else +test-nonrecursive: +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 ; \ + if test -d "$(top_srcdir)/.git" ; then \ + REVISION=`git describe` ; \ + else \ + REVISION=$(VERSION) ; \ + fi ; \ + for subdir in $(SUBDIRS) . ; do \ + test "$$subdir" = "." -o "$$subdir" = "po" || \ + ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ + done ; \ + $$ignore_logdir || { \ + echo '' > $@.xml ; \ + echo '' >> $@.xml ; \ + echo '' >> $@.xml ; \ + echo ' $(PACKAGE)' >> $@.xml ; \ + echo ' $(VERSION)' >> $@.xml ; \ + echo " $$REVISION" >> $@.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 test-nonrecursive + +.PHONY: lcov genlcov lcov-clean +# use recursive makes in order to ignore errors during check +lcov: + -$(MAKE) $(AM_MAKEFLAGS) -k check + $(MAKE) $(AM_MAKEFLAGS) genlcov + +# we have to massage the lcov.info file slightly to hide the effect of libtool +# placing the objects files in the .libs/ directory separate from the *.c +# we also have to delete tests/.libs/libmoduletestplugin_*.gcda +genlcov: + rm -f $(top_builddir)/tests/.libs/libmoduletestplugin_*.gcda + $(LTP) --directory $(top_builddir) --capture --output-file glib-lcov.info --test-name GLIB_PERF --no-checksum --compat-libtool + LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory glib-lcov --title "GLib Code Coverage" --legend --show-details glib-lcov.info + @echo "file://$(abs_top_builddir)/glib-lcov/index.html" + +lcov-clean: + -$(LTP) --directory $(top_builddir) -z + -rm -rf glib-lcov.info glib-lcov + -find -name '*.gcda' -print | xargs rm + +# run tests in cwd as part of make check +check-local: test-nonrecursive diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..369316b --- /dev/null +++ b/NEWS @@ -0,0 +1,7102 @@ +Overview of changes from GLib 2.35.7 to 2.35.8 +============================================== + +This release contains one major change that may cause problems: type +modules are now never unloaded. This is implemented by (effectively) +leaking the last reference on dynamic types. Some testcases that check +for unloading of types have been observed to be broken by this change, +but we know of no actual cases of "real code" breaking. Please report +any problems. + +Other changes: + * A couple of build fixes for Solaris + * Fix signal emission for GDBusObjectManagerClient + * annotations fixes + * new API: g_dbus_address_escape_value() + * GSocketClient: add proxy-resolver property + * GSimpleProxyResolver: new simple GProxyResolver class + * documentation fixes + * gnetworkaddress: preserve IPv6 scope ID in IP literals + +Bugs fixed: + 691105 Allow GSocketClient to override GProxyResolver for per client proxy settings. + 692827 configure test fails for arpa_nameser.h + 692829 new Btrfs support causes build failure on Solaris + 693285 GDBusObjectManagerClient: won't emit object-added|removed if name-owner arrives later + 693502 Cross-compiling documentation: typo (np -> no) + 693673 add g_dbus_address_escape_value() + 693694 gio: Fix annotations on g_[async_]initable_new() and friends + +Translations: + Dutch + Galician + Polish + Serbian + +Overview of changes from GLib 2.35.6 to 2.35.7 +============================================== + +This is a quick follow-up release with a few bug fixes. + +* Fix the build on systems with strict linkers by adding -pthread back + to the LDFLAGS for a testcase. + +* Re-enable native atomic operations on some buggy versions of clang + that ship as part of the MacOS X SDK. + +* Make G_IO_FLAG_IS_WRITEABLE an enum again (the #define broke bindings) + +* a small docs fix + +* Bugs fixed: + 657045 + 636683 + 682818 + 693105 + +* Translations: + Italian + +Overview of changes from GLib 2.35.4 to 2.35.6 +============================================== + +* GUnixFdSource is a new way to add file descriptors + to the mainloop + +* g_source_set_ready_time lets you mark a source to become + ready at a specified monotonic time + +* The internal visibility handling of GLib has been reworked + +* GFileMonitor will now automatically use fam instead of inotify + if $HOME is on NFS + +* The file monitor implementation can now be overridden with + the GIO_USE_FILE_MONITOR environment variable + +* Bugs fixed: + 570572 2 make check errors on + 592211 No monitoring over NFS mounts + 625552 wrong behaviour of GVolume GVolumeMonitor related func... + 657729 modernise GMainLoop + 658020 GSource for a single GPollFD + 678223 g_mutex_free + 682560 leak fixes + 682819 EINTR-harden all the things + 684404 When using g_network_address_address_enumerator_next()... + 686853 new GSource fd API + 688169 G_DISABLE_DEPRECATED doesn't cover deprecated/gthread.... + 688681 build: Make .symbols file canonical on all platforms + 690118 Crash when closing last tab of a window using Ctrl-w + 691624 glib/gtester.c: missing include + 691812 gioinputstream - give task as callback_data not task_data + 691866 fails out of source build directory - gnetwork.h not f... + 692029 Add new API checking utility + 692034 Install an invalidation notifier for GClosure in g_sou... + 692058 Broken makefile for gio tests + 692079 build failure in gmarkup.c when using gcc 4.8 and buil... + 692201 inotify: fix a memleak + 692202 gfile: don't report completion twice on g_file_load_co... + 692229 Incorrect string formatters in a translation string + 692332 GNetworkMonitorNetlink: make the netlink socket cloexec + 692360 possibly non-threadsafe code in g_content_type_guess()? + 692404 tester: Use FD_CLOEXEC when creating pipes + 692408 nautilus SIGSEGV in g_file_info_get_size() + 692544 [PATCH] gfile: Ensure we create internal pipe with FD_C... + 692583 atomic get doesn't accept a const argument on architect... + 692618 Use g_timeout_add_seconds + 692815 Using g_hash_table_insert() when using a hash table as ... + 692865 Invalid docbook generated by gdbus-codegen + 692928 Document G_MENU_{ATTRIBUTE,LINK}_* + +* Translation updates: + Hebrew + Kannada + Lithuanian + Norwegian bokmÃ¥l + Polish + Serbian + Slovenian + Spanish + Uyghur + + +Overview of changes from GLib 2.35.3 to 2.35.4 +============================================== + +* New features: + - New API: g_get_num_processors + - New API: g_application_command_line_get_stdin + - New GFileMonitor flag: G_FILE_MONITOR_WATCH_HARD_LINKS + - Parse more timezone offset formats + - Better timezone support on Windows + - Make GParamSpec constructors introspectable + +* Removed or deprecated features: + - Disallow adding interfaces after class_init + +* Bug fixes: + 532815 gio + inotify support for hardlinks + 614930 add g_get_num_processors (), return the max concurrent... + 626497 Btrfs clone/reflink ioctl support in g_local_file_copy + 633117 glib fails stests if /etc/localtime is not properly set + 661767 merge/improve various bits of run-in-thread functionality + 668210 Add g_application_command_line_get_stdin() + 675856 Use GDbus via gobject-introspection instead dbus-python + 684103 make glib work with python3 + 684723 run-assert-msg-test.sh fails + 686058 OpenBSD: disable ipv6_v4mapped test + 686128 GTimeZone should be able to parse POSIX format for... + 687223 cleverer GThreadPool management + 687659 drop support for adding interfaces after class_init + 687920 GCredentials should have an accessor for the process ID + 688681 build: Make .symbols file canonical on all platforms + 688829 Variable overflow in utils.c test on 32-bit machine + 689324 Variable scoping in gunixmounts.c + 689810 Include guard optimization + 690043 Broken link for gsettings tutorial: gnome-utils in... + 690084 gmarkup: Make GMarkupParseContext a boxed type + 690388 Check if CMSG_FIRSTHDR() returns NULL when there is... + 690538 gschema DTD is invalid + 690543 Add test coverage for testing in-tree DBus services... + 690670 local_command_line not introspectable/annotated + 690902 G_END_DECLS needs to be at the end of gutils.h + 690970 Unhelpful deprecation message for g_value_array_get_nth + 691001 building docs is broken on master branch + 691011 Automake-1.13 errors on obsolete AM_PROG_CC_STDC + 691077 gio-querymodules crashes with SIGSEGV + 691110 g_cond_wait() docs incomplete + 691489 Crash in Oscars 2013 page + 691558 Only check for .hidden files if standard::is-hidden... + 691608 Support compilation with clang 3.2 + +* Translation updates: + Assamese + Bulgarian + Estonian + Galician + Greek + Hebrew + Norwegian bokmÃ¥l + Polish + Slovak + Slovenian + Spanish + Tamil + + +Overview of changes from GLib 2.35.2 to 2.35.3 +============================================== + +* This release contains an incompatible change to the g_get_home_dir() + function. Previously, this function would effectively ignore the HOME + environment variable and always return the value from /etc/password. + As of this version, the HOME variable is used if it is set and the + value from /etc/passwd is only used as a fallback. + +* We now install a public "gnetworking.h" header that can be used to + include the relevant OS-dependent networking headers. This does not + really abstract away unix-vs-windows however; error codes, in + particular, are incompatible. + +* Bugs fixed in this release: + 142568 Allow $HOME to override passwd entry if the user really wants + 587806 The file selector should honor .hidden files + 602715 [GChecksum] Please add support for SHA512 + 623187 provide some support for arbitrary setsockopt()s? + 629301 .goutputstream files left behind when cancelling I/O + 652650 Optimize GDBusMessage serialization + 664627 /gapplication/basic test intermittently fails: cmdline re-or... + 675516 Win32: Don't start a DBus server when built as static library + 679683 replace g_test_trap_fork() + 684145 Current Git sources fails to cross-compile for Windows in Li... + 686895 file-info: catch thumbnail files in large directory as well + 687092 IPv6 <-> IPv4 mismatch when subscribing to multicast (send) + 688180 GObject: Minor error in description of floating reference + 688319 gthread: add missing AVAILABLE_IN_2_32 annotations + 688377 configure: add missing square bracket in AS_IF for memmove + 688419 gtask: source_object arguments and return values not annota... + 688497 AppInfo: Add sufficient api to port gnome-session from Egg... + 688681 build: Make .symbols file canonical on all platforms + 688704 Add boxed GType for GThread + 688886 Improve the i18n documentation + 688931 GMemoryOutputStream: Add new _resizable() constructor usab... + 689037 need helper for creating a GFile from a remote commandline... + 689377 Fix a compiler warning in GDBus + 689538 Source object tag set too late in gsocketlistener + 689800 Treat lost+found directory as a hidden file + 689847 Add fast repeated typename -> GType resolver + 689982 Make GChecksum more fully introspectable + 690069 g_unix_open_pipe: Add missing F_SETFD + 690083 gfileenumerator: Add a g_file_enumerator_get_child method + 690163 Add a pre-configured gio/gnetworking.h for Visual C++ builds + 690346 Remove an unneeded escaping in NAMESER_COMPAT_INCLUDE + 690348 Fix g_type_add_class_private() name in g_warning + +* Translation updates: + Assamese + Galician + Hebrew + Hindi + Kannada + Odia + Polish + Spanish + + +Overview of changes from GLib 2.35.1 to 2.35.2 +============================================== + +Note that the incompatible change to the ->constructed() vfunc that was +made in the last unstable release (2.35.1) has been reverted due to +causing regressions in applications. + +A new incompatible change has been introduced in this version: it is no +longer permitted to add interfaces to a class after the first +instantiation (or more strictly: after g_type_class_ref()). Bug #687659 +is tracking this. + +Two private symbols (g_menu_{attribute,link}_hash_iter_get_type) which +were accidentally exported have also been properly hidden. This may +cause some tools to issue warnings about ABI mismatch. + +The remaining changes should be relatively harmless: + + * GIO now has kqueue support for GFileMonitor (BSDs, Mac OS) + + * New g_variant_new_from_bytes() API + + * UNIX signal sources now allow watching SIGUSR1 and SIGUSR2 + + * Many pedantic cleanups to adhere to a higher level of -W use + + * GTask changes to avoid a deadlock + + * many cleanups/fixes for Windows + + * Boxing for GPollFD, GIOChannel, GBytes, GByteArray + + * Fix URL-encoding of trashed files + + * Many other docs and annotations fixes + +Translations: + + Galician + Gujarati + Lithuanian + Serbian + Slovak + Slovenian + +Bugs closed: + + 649302 Add support for GNU/FreeBSD + 668842 [GSocket] Add caching for the sender address in g_socket_receive_from() + 672924 Add annotations for g_filename_from_uri() + 673229 glib: Use Returns:, not @returns + 677062 (partial) GVariant: Make g_variant_new_from_bytes() public, add more GBytes API + 686185 g_date_time_format Transcoding Fails on OSX + 686191 g_mutex_get_impl() should use g_atomic_pointer_get() + 686797 Box GPollFD to make it introspectable + 686810 [regression] Infinite wait in g_task_run_in_thread_sync() + 686822 possible dlopen()/dlclose() issue with automatic g_type_init() + 686839 mkinstalldirs: Move to glib-mkinstalldirs + 686895 file-info: catch thumbnail files in large directory as well + 686898 g_unix_signal_source_new: Allow SIGUSR1 and SIGUSR2 + 686920 gdbus: Allow GDBusObjectManagerClient to work on peer connections + 686921 Remove some of the repetition from gio/tests/Makefile.am + 687075 g_spawn_sync diagnostic incorrectly complains about SIGCHLD + 687089 g_dbus_connection_export_menu_model(): fix a crash + 687098 Repeated g_timeout_add* use can lead to guint overflow + 687385 Add some stricter CFLAGS, fix up the code + 687441 ABI break in master: g_menu_attribute_hash_iter_get_type, g_menu_link_hash_iter_get_type removed + 687516 typo in string: KB should be kB + 687540 In Trash folder, Nautilus misinterprets "\n" in filename as a line break + 687541 GSignalQuery param_types field needs array annotation + 687600 gfileutils.c performs invalid cast of (varargs) open to non-vararg type + 687698 plural forms needed + 687700 ending spaces + 687742 Add support for internal linkage to glib-compile-resources + 687801 tests/buffered-input-stream: Fix size of parameter passed + 688109 win32 warning/error fixes + 688255 'make check' regressed in 138f4c1 because GMarkup error messages changed + 688338 [PATCH] gobject/gtype.c: Fix spelling of »exceed« + 688370 GDBusError documentation improvement for client-side + 688378 g_socket_join_multicast_group not working + 688518 gio-kqueue: use O_EVTONLY on MacOS + + + +Overview of changes from GLib 2.34.0 to 2.35.1 +============================================== + +These two changes in particular may be slightly incompatible. Please +give feedback if they cause trouble: + + * Signal handlers connected with g_signal_connect_object() are now + automatically disconnected on target object destruction + + * The ->constructed vfunc is now called after all properties are set + +The remaining changes should not cause problems. + + * g_type_init() is no longer necessary and has been deprecated + + * GTask (the new GAsyncResult implementation) has landed + + * GLib version macros updated + + * Update to Unicode 6.2 + + * Thread safety fixes for GFileMonitor in non-default main contexts + + * GTimeZone support for old-format zoneinfo database (as on Mac OS) + + * g_settings_bind() now works with non-canonical property names + + * Fix crashes related to NULL connection passed to + GBusNameVanishedCallback and document this situation + +* Bugs fixed: + 118536 Make g_signal_connect_object'ed handlers disconnect when the data object is destroyed + 661767 merge/improve various bits of run-in-thread functionality + 682950 GFileMonitor crashing on high event count when running in different thread + 683642 Missing g_content_type_get_symbolic_icon + 684882 Gsettings should spaw a warning when binding against a low_underscored_property + 684909 codegen: Explicitly close output + 684912 Update to Unicode 6.2 + 685037 g_strcmp0: Returns shall include values less and greater than zero + 685069 Leak in glib-compile-resources + 685208 missing g_return_if_fail + 685608 [Patch] Port gio tests from pygobject to pygi + 685697 Documentation typo in g_dbus_interface_skeleton_has_connection() + 685733 Call ->constructed() after all properties are set + 685787 gtestdbus: correct documentation typos + 685995 Crash in g_menu_exporter_name_vanished + 686091 Invalid reads in g_bytes_unref_to_data + 686119 dtrace, gobject_probes.d, the last three probes - semicolon missing + 686161 Deprecate g_type_init() + 686231 GBusNameVanishedCallback: document NULL connection + 686458 slightly increase poll duration in test_timed_wait + +* Translations updated + Catalan (Valencian) + Czech + Danish + Italian + Lithuanian + Norwegian bokmÃ¥l + Slovenian + +Overview of changes from GLib 2.33.14 to 2.34.0 +=============================================== + +* Bug fixes: + 654239 g_type_init()'s docs have no statement about how to... + 674620 Update GSettings migration guide for intltool updates + 676034 Fix doc annotation for g_ptr_array_ref() + 684278 Fix GIO build on Windows + +* Translation updates: + Brazilian Portuguese + British English + Bulgarian + Catalan + Galician + German + Hebrew + Hindi + Hungarian + Kannada + Latvian + Marathi + Spanish + Telugu + + +Overview of changes from GLib 2.33.12 to 2.33.14 +================================================ + + * CVE-2012-3524: don't run dbus-launch from setuid binaries + + * g_content_type_get_generic_icon_name(): + new API for getting the icon name for a mime type + + * Introspection fixes: + - GDBusConnection nullability fixes + - give a box type to GTimeZone + + * Drop GVFS_INOTIFY_DIAG + + * Add a new "Writing GLib Applications" section to the reference + documentation with general info on security, threads, etc. + + * gwin32mount.c: Fix syntax error + + * gresource tests: srcdir != builddir fixes + + * tests/gvariant: Fix test on big endian architectures + + * Fix regression in g_shell_parse_argv() + +Bugs fixed: + 562907 g_shell_parse_argv() mishandles # (hash) + 683167 g_time_zone_new not introspectable + 683384 /gvariant/checksum-basic failure on big endian machines + 683641 Typo in gwin32mount.c + 683744 have a way to get the generic icon name for a mime type + +Translation updates: + Assamese + Belarusian + British English + Czech + Danish + French + Galician + German + Greek + Hebrew + Indonesian + Indonesian + Korean + Lithuanian + Marathi + Marathi + Polish + Portuguese + Punjabi + Russian + Serbian + Slovenian + Traditional Chinese + +Overview of changes from GLib 2.33.10 to 2.33.12 +================================================ + +* Add a G_DEFINE_QUARK macro + +* Add symbolic icon support to drive, volume, and mount, file + and content types + +* Add API to allow thread-safe access to the same qdata item + +* Bugs fixed: + 562907 g_shell_parse_argv() mishandles # (hash) + 627240 add G_DEFINE_QUARK + 672329 memory leaks in gutils.c and glib tests + 673012 Stable byte-level specification for normal form + 674805 gdbusproxy async test is broken + 679835 gvariant format string parsing (and assertions)... + 682075 gdbus: Fix double free and use after free of ob... + 682101 Provide a way to get a symbolic icon for a device + 682222 test_method_calls_on_proxy: assertion failed (e... + 682284 mount-op: use gint64 instead of guint64 for tim... + 682386 "make check" fails due to sys/resource.h not be... + 682560 leak fixes + 682586 gsettings-tool: make list-recursively really re... + 682819 EINTR-harden all the things + 682833 Handle EINTR for open() + 682849 drop the global lock for g_object_weak_ref + 682965 gdbus-tool: Check return value of strrchr() + 683088 gdbus-codegen: fix error when wrong interface n... + Fix the build with gtk-doc-stub + Don't crash if set_app_info is called before ad... + +* Translation updates + Assamese + Galician + Greek + Indonesian + Japanese + Latvian + Lithuanian + Norwegian bokmÃ¥l + Polish + Portuguese + Punjabi + Russian + Spanish + Traditional Chinese + Vietnamese + + +Overview of changes from GLib 2.33.8 to 2.33.10 +=============================================== + +* New GTest API for testcases where log output is expected: + g_test_expect_message() + +* GMenuItem now has 'get' accessors and a construct-from-GMenuModel API + +* GVariant now has a function to check a format-string for type + compatibility + +* win32: We now use overlapped IO to support multiple asynchronous + operations (ie: reading and writing) at the same time. + +* GMappedFile: Add g_mapped_file_get_bytes() + +* The problems with g_file_make_directory_with_parents() should be + resolved. + +* The long-standing issues with placeholder generation of manpages are + now resolved. + +* gtlscertificate: Add GBytes based certificate and private-key props + +* build: Switch back to using AS_IF for conditionals + +* test coverage improvements, documentation improvements, leak fixes + +* Bugs fixed + 326931 Better docs for G_GNUC_* + 550433 g_test_init doesn't recognize --help + 600751 GCompletion should better document if and how items memory is managed + 628193 Miscellaneous string fixes + 637460 man glib-genmarshal is hard to use + 674483 broken configure results when cross-compiling with gcc >= 4.5 + 677065 GMappedFile: Add g_mapped_file_get_bytes() + 679288 win32: use overlapped events for streams + 679556 it's hard to use gtest when g_warning() is expected + 680823 g_file_make_directory_with_parents: Fix error propagation + 681319 gtlscertificate: Add certificate-bytes and private-key-bytes props + 681336 man pages not built if --enable-gtk-doc not specified + 681413 build: Switch back to using AS_IF for conditionals + 681501 gmem: array only partially filled with memcpy + 681854 Documentation fix for Howto compile a program with glib + 682025 Documentation correction + 682067 Fix problems with CLEANFILES and automake-1.11.1 + +* Translations updated: + Lithuanian + Spanish + Galician + Telugu + Serbian + Assamese + Marathi + Indonesian + Traditional Chinese + +Overview of changes from GLib 2.33.6 to 2.33.8 +============================================== + +* GIO now has a g_file_delete_async function + +* The defaults for GThreadPools max_unused_threads + and max_idle_time values have been changed to + 2 and 15*1000, respectively. + +* Bugs fixed: + 661767 merge/improve various bits of run-in-thread functionality + 680074 undefined symbol "get_C_locale" + 680121 g_cancellable_source_new: don't use a file descriptor + 680148 gthread: check for definition of PR_SET_NAME + 680310 Sorting of access points by strengh not working + 680704 g_utf8_strup() crash + 68076a0 GFile: Add g_file_delete_async() + 680787 Add .dir-locals.el to tell Emacs users not to use tabs... + 680823 g_file_make_directory_with_parents: Fix error propagation + 680994 STATIC_ASSERT in GDBusError docs don't have much utility + 681116 gtlscertificate: Add g_tls_certificate_equal() function + 681118 gtlsdatabase: Don't complain if no callbacks for async... + 669331 try to get gio tests working a little better on win32 + 674314 Make gtk-doc not a hard dependency of GLib + 674800 gclosure: generic marshaller leaks return value + 675524 gsocket: FIONREAD undeclared (needs sys/filio.h) + 679509 use after free in g_dbus_action_group_describe_all_done() + 679996 gobject docs minor cleanup + 680459 Extra newline char in local implementation of g_applic... + 680505 object_path memory leak in gdbusobjectproxy.c + 680831 Deprecate and remove g_slice_[sg]et_config.* + 680912 gchecksum: Add g_compute_checksum_for_bytes() + 681151 checksum: Use functions instead of macros when buildin... + 681158 gtlscertificate: Don't confuse certificate and public ... + +* Translation updates: + Galician + German + Gujarati + Hebrew + Norwegian bokmÃ¥l + Serbian + Slovenian + + +Overview of changes from GLib 2.33.4 to 2.33.6 +============================================== + +* GAsyncInitable: partially revert the init_finish changes, + some applications were found to rely on behaviour that + was broken by these changes + +* Bugs fixed: + 679617 win32: fix g_get_environ() + 679968 Add some annotations to GBytes, GVariantType... + 680111 GIOScheduler assumes GCancellable "cancelled... + +* Translation updates: + Spanish + +Overview of changes from GLib 2.33.3 to 2.33.4 +============================================== + +* GMainContext: the source list has been reorganzied to + avoid O(n) behaviour + +* GRegex: Update included PCRE to 8.31 and expose new + functionality in 8.x versions of PCRE + +* GMountOperation gained a ::show-unmount-progress signal + which provides information about slow unmount operations + +* Bugs fixed: + 616892 gio: Add a boxed type for GFileAttributeMatcher + 619329 g_source_attach() O(n) in number of sources + 639771 g_dir_read_name() can also return NULL on error + 661767 merge/improve various bits of run-in-thread fun... + 667375 GAsyncInitable subclassing (and async subclassi... + 671545 Constify collect and lcopy strings in GTypeValu... + 674452 SEGFAULT in gio contenttype test + 674898 Deal with GLIB_VERSION_MIN_REQUIRED/MAX_ALLOWED... + 675504 Fix up GObject interface documentation + 677064 GString: Tweak documentation, add g_string_free... + 677578 error in PCRE error code conversion + 677579 update GRegexError for newer PCRE error codes + 678066 gdbus codegen does not work with python3 + 678273 unicode othercasing is wrong in gregex + 678576 GIOScheduler performance enhancements + 678758 GTlsInteraction unlocks an unlocked mutex + 678808 GTestDBus issues + 678881 Test failures in /socket/timed_wait in some cas... + 678941 /contenttype/guess test case failure + 678944 gio returns the wrong default applications for ... + 678949 wrong definition of ulong_bool for 64 bit big e... + 678959 /mainloop/timeouts race condition: assertion fa... + 679193 update included pcre to 8.31 + 679258 The 'Since' tag for G_SOURCE_CONTINUE and G_SOU... + 679473 Don't generate invalid property names + 679691 Add g_spawn_check_exit_status() + 679671 GDBusNodeInfo: the XML string must contain exac... + 676111 mount-operation: add show-unmount-progress signal + 679691 win32: fix build g_spawn_check_exit_status() wi... + 679813 Documentation bug on http://developer.gnome.org... + +* Translation updates: + Assamese + Belarusian + Bulgarian + Galician + Greek + Norwegian bokmÃ¥l + Polish + Spanish + Traditional Chinese + Vietnamese + + +Overview of changes from GLib 2.33.2 to 2.33.3 +============================================== + +This release contains mostly bugfixes, cleanups and performance +improvements (including many fixes contributed by Colin on the advice of +Coverity). There are a few notable externally-visible changes: + +* Thumbnails are now in XDG_CACHE_HOME + +* new GDBus API: per-thread g_dbus_connection_get_last_serial() + +* GUnixOutputStream now has a can_poll() implementation + +* New deep copy APIs for G(S)List: g_(s)list_copy_deep + +* Bugs fixed: + 518309 Incorrect data*dir path in glib-gettextize output + 566994 Safer passing of -framework flag + 672889 GLib.utf8_validate does segfault + 673253 Not strict enough autconf test for libelf + 675024 adds g_list_copy_deep() and g_slist_copy_deep + 675168 prepare for thumbnails to move to XDG_CACHE_HOME + 675966 gresolver: More robust parsing of DNS responses + 676594 [Patch] fix g_reload_user_special_dirs_cache + 676825 Implement g_dbus_connection_get_last_serial () + 677235 Clarify the comment at the top of gmarshal.list + 677527 OS X: gthread/spawn-async selftest failure + 677718 GDBusProxy: treat org.freedesktop.systemd1.Masked error as non-fatal + 677770 GUnixOutputStream does not implement can_poll + 677782 Install bash completion files in /usr/share + 677817 g_key_file_to_data adds extra blank lines in some cases + 677952 Missing annotation for GDBusConnection signal "closed" + 678052 g_wakeup_acknowledge is called too often. + 678273 unicode othercasing is wrong in gregex + 678333 gdbus-codegen code causes warnings under -Wfloat-equal + +* Translations updated: + Arabic + Assamese + Galecian + Greek + Spanish + Telugu + +Overview of changes from GLib 2.33.1 to 2.33.2 +============================================== + +* GLIB_VERSION_MIN_REQUIRED now defaults to the current stable version + +* GIO input and output stream classes have grown GBytes-based methods + +* GApplication now has hooks to register D-Bus objects before the bus + name is taken + +* Bugs fixed: + 605976 add g_type_ensure(), to ensure that a type has... + 660851 Breakage of code due to changes in the GThread... + 666386 Empathy doesn't open Redirect URI with particu... + 671139 need (transfer async) for io stream buffers + 672329 memory leaks in gutils.c and glib tests + 672548 g_utf8_validate: @str shouldn't end up annotat... + 674111 Provide an accessor for MimeType desktop entry... + 674483 broken configure results when cross-compiling ... + 674634 Add g_clear_pointer() + 674777 What's the (transfer) of g_variant_lookup()? + 675309 gkeyfile: Fix annotations for g_key_file_load_... + 675446 gfile: Plug memory leak in g_file_make_directo... + 675509 add extra dbus hooks + 675832 Incomplete gsettings bash auto-completion + 676208 The tmpl parameter to g_file_new_tmp can be NULL + 676265 GNetworkMonitor leaks a lot of memory + 676277 Document that g_app_info_create_from_commandli... + 676397 g_environ_* should work with NULL envp + 676398 g_spawn_* should take PATH from the passed env... + 676478 Broken gzip decoding + 676594 [Patch] fix g_reload_user_special_dirs_cache + 676816 Add more GLIB_AVAILABLE_IN_* + 676937 Document notify signal deduplication with free... + +* Translation updates: + Czech + French + German + Greek + Japanese + Russian + Slovenian + Spanish + + +Overview of changes from GLib 2.32.1 to 2.33.1 +============================================== + +* GApplication + - can now have a NULL application ID + - add accessors for determining dbus connection and object path + +* g_clear_object: fix warnings when using it on C++ (due to lack of + ability to implicitly cast void*) +* add g_clear_pointer as a generic form of g_clear_object + +* GDBus: + - add our own implementation of the message bus for use on Windows only + - fix up a few bugs that use of this bus uncovered in GDBus + - escape nonce files in dbus addressess (think 'c:\') + - support initial underscores in dbus codegen namespace (for private) + - add GTestDBus for bringing up a session bus for testing purposes + - gdbus-codegen: Avoid warnings in generated code + - GDBusAuthObserver: Add a way to control what authentication mechanisms to use + - + +* Fix misdetection of GNUstep as Cocoa (for the MacOS GSettings backend) + +* make sure configure fails if AC_CHECK_ALIGNOF cannot detect the alignment + +* GAppInfo + - overwrite the DISPLAY only if it is set in the launch context + - add accessor for StartupWMClass + +* glib/tests/date: force US locale running the GDateTime tests + +* Resources: + - fix broken use of GVDB on big endian machines + - set a 'display name' so that pretty file names appear in Gtk CSS + warning messages + +* GMainContext: + - block child sources when blocking the parent + - introduce more testcases for child sources + +* GResolver: add support for MX, TXT, NS and SOA records + +* GSocketControlMessage: Don't warn about unknown messages + +* GIO: + - implement GSeekable for the data and buffered stream classes + - implement GPollable for many more classes as well + - fix GConverterInputStream infinite loop when fill_buffer returns an error + - fileinfo: document the correct type for trash::orig-path + +* test coverage improvements and general fixes + +* new 2.34 stuff: version macros, docs index section, etc. + +* Build: + - add --disable-modular-tests build option + - don't require host binaries if tests are not enabled for cross-builds + +* Translations updated + Brazilian Portuguese + Bulgarian + Czech + French + Galician + German + Hebrew + Hindi + Italian + Norwegian bokmÃ¥l + Polish + Russian + Russian + Serbian + Simplified Chinese + Slovenian + Spanish + Telugu + +Overview of changes from GLib 2.32.0 to 2.32.1 +============================================== + +* Bugs fixed: + 670254 glib-2.30.2: Fails /GDateTime/new_from_unix test + 672541 glib-compile-resources prepends --sourcedir to absolute paths + 673139 URL to mailing lists in README incorrect + 673174 g_input_stream_read[_finish]: document returning 0 on EOF + 673191 glib/gchecksum.c warning: dereferencing type-punned pointer... + 673216 [W32] gtestutils does not use path separators consistently + 673439 Properly deprecate g_value_{set,get}_char + 673612 Fails to decode dictionaries wrapped in two layers of array + 673803 gclosure: Support return values of GVariants + 669285 glib/tests/markup-parse fails under non-english locale + 673911 gio-2.0.pc lists full path to executables, breaking cross com.. + 673762 gnextstepsettingsbackend.c:343: error: parse error before 'in' + +* Updated translations: + Belarusian + British English + Bulgarian + Catalan + Czech + French + German + Hebrew + Hindi + Hungarian + Italian + Japanese + Kannada + Latvian + Lithuanian + Marathi + Norwegian bokmÃ¥l + Odia + Polish + Serbian + Slovenian + Spanish + Swedish + Telugu + + +Overview of changes from GLib 2.31.22 to 2.32.0 +=============================================== + +* Bugs fixed: + 671988 Quickly registering / unregistering objects on bus... + 672095 glib needs stable sort function + 672406 glib/tests/include.c fails to build on FreeBSD + +* Updated translations: + Telugu + + +Overview of changes from GLib 2.31.20 to 2.31.22 +================================================ + +* Bugs fixed: + 531901 Use __builtin_bswap* for GUINT*_SWAP_LE_BE if building... + 653167 Out of tree build is broken on windows + 668973 Test /gvariant/parser fails on Solaris 10 + 669797 gvfs now lists its fuse mounts + 670846 deadlock: GStreamer-WARNING **: wrong STREAM_LOCK count 0 + 671664 gio-querymodules: unlink instead of writing empty cache + 671676 Glib can't be cross-compiled any more after merge of... + 671918 gnome-shell is inaccessible unless started while an AT... + 671942 GSocketMsgFlags: annotate as a flags + 671997 Unix signal handling assumes that volatile 1-byte writes... + 672013 GSimpleAsyncResult: support reliable cancellation + 672026 default log output should include pid and/or prgname + 672095 glib needs stable sort function + 672201 G_SPAWN_SEARCH_PATH should continue on ENODEV and ETIMEDOUT + 672239 request NO_REPLY from g_dbus_connection_call() with no as... + 672249 gdbusproxy leaks asyncresult in an error case instead of... + +* Translation updates: + Assamese + British English + Catalan + Catalan (Valencian) + Danish + Esperanto + Finnish + French + German + Hungarian + Korean + Lithuanian + Norwegian bokmÃ¥l + Polish + Portuguese + Russian + Traditional Chinese + + +Overview of changes from GLib 2.31.18 to 2.31.20 +================================================ + +* Update to Unicode 6.1 + +* Update PCRE to 8.30 + +* Deprecations are now versioned, and new API is + marked with the version it was introduced. + Use these with GLIB_VERSION_{MIN,MAX}_REQUIRED + +* The performance of signal emissions has been + improved for simple cases + +* Bugs fixed: + 529806 Cannot build in 64-bit Mac OS X due to libiconv + 580873 Documentation of register type functions incomplete + 592666 Document how to unset an attribute + 597785 g_type_class_add_private code snippet is a bad example + 621368 glib-2.24.1: FAIL: run-assert-msg-test.sh when updating... + 622149 --disable-regex breaks glib2 build + 639873 GBinding: Crash when binding two properties on the same... + 640202 For GLIB v. 2.23.6 and above: impossibility to build mu... + 668295 Need a way to classify GVolume instances + 669670 gasyncqueue: don't use deprecated g_cond_timed_wait() + 670542 Add version information for deprecations + 670557 gvaluetransform: Fix an infinite loop with GFlagsValue... + 670721 global variable for signal ID should be hidden + 670751 IceWM build fails due to the G_DEPRECATED_FOR macro + 670909 g_dbus_connection_call leaks when it receives an error... + 670922 Include path to gdbus-codegen in the pkgconfig file + 670969 GSequence lookup may fail if there was no sort prior to... + 671025 Constants and identifiers starting with a number are no... + 671270 make distclean failures + 671281 glib-compile-resources.xml is missing from the dist tar... + +* Translation updates: + Basque + Belarusian + Brazilian Portuguese + Bulgarian + Galician + Hebrew + Lithuanian + Persian + Punjabi + Serbian + Simplified Chinese + Slovenian + Telugu + Traditional Chinese + Uyghur + Vietnamese + + +Overview of changes from GLib 2.31.16 to 2.31.18 +================================================ + +* GDBusProxy has now a flag, G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, + which can be set to make GDBus automatically reload + changed properties even if the propertychanged signal + does not contain the new values. + +* GApplication puts non-unique applications on the bus + +* GApplication now has g_application_quit() + +* g_async_queue_timed_pop has been deprecated in favor of + the new g_async_queue_timeout_pop, which uses relative + delays in microseconds instead of a GTimeVal. + +* a huge number of API documentation fixes + +* Bugs fixed: + 647986 put non-unique apps on D-Bus + 658484 vpn connection vs NetworkSecretDialog + 664237 GDateTime falls back to UTC if TZ is set + 669329 gthread-win32: update for g_get_monotonic_time() changes + 669330 glocalfile: fix error code when opening a directory on win32 + 669372 glib/tests memory leaks. + 669412 mem leak in g_environ_unsetenv + 669538 Fix compilation of glib-compile-resources.c on Windows + 669544 gdbus-codegen example introspection XML is not complete + 669595 glib-mkenums: fix handling of forward enum declarations + 669670 gasyncqueue: don't use deprecated g_cond_timed_wait() + 669671 gobject: use #pragmas to avoid deprecated function warnings + 669689 Retrieve cwd and environ in local GApplicationCommandLine + 669810 socket/win32: flush pending read before signaling HUP + 669865 g_regex_fetch() + 670085 memory leak in g_output_stream_write_async + 670138 gbytes.h is missing the G_BEGIN/END_DECL guards + 670485 Simplify session API (shared bug with gtk+) + +* Updated translations: + Belarusian + Danish + Galician + Serbian + Telugu + Hebrew + + +Overview of changes from GLib 2.31.14 to 2.31.16 +================================================ + +* GResource: + - The resource compiler can now convert pngs into + pixel data that can be used without parsing at runtime + (requires gdk-pixbuf-pixdata to be present) + +* Bugs fixed: + 669123 resource compiler: failing to-pixdata should... + 669173 resource: fix xml preprocess entity handling + 669224 Cross-compilation broken by data-to-c + 669253 gsettings set buggy on array values + 669334 fix memory leak in bookmark file parser + +* Translation updates: + Norwegian bokmÃ¥l + Spanish + + +Overview of changes from GLib 2.31.12 to 2.31.14 +================================================ + +* GResource: + - GLib now includes a commandline utility, gresource, + to explore resources in ELF files + - The resource compiler can now optionally strip + ignorable whitespace from XML resources + - The resource compiler can now generate build dependencies + - The resource compiler will now autoselect output formats + +* GApplication: + - The menu markup parser API has been dropped, the + menu XML support lives in GTK+ now + +* GValueArray has been deprecated + +* Bugs fixed: + 626258 N-ary Trees - 'nodes' can be inserted before and after... + 634232 Core Dump / Aborted using g_key_file_to_data + 639099 schema compiler chokes on valid schema + 667228 Deprecate GValueArray + 667243 Add an element clear function to GArray + 667929 glib-compile-resources: xml resources doesn't need to... + 668250 g_date_time_format() produces a non-UTF8 string + 668468 'IP_ADD_SOURCE_MEMBERSHIP' undeclared + 668532 resources: add dependency generator to the resource compiler + 668539 resources: compiler should autoselect output format... + 668561 gresource-tool not internationalized + 668572 glib_cv_g_atomic_lock_free config.cache setting not honored... + 668650 GRealArray->clear_func should be initialized + 668756 GKeyFile: allow loading from empty strings + 668857 fix couple of typos in comments + 669024 goption: implement platform_get_argv0() for OpenBSD + +* Updated translations: + Galician + Norwegian bokmÃ¥l + Spanish + Traditional Chinese + +Overview of changes from GLib 2.31.10 to 2.31.12 +================================================ + +* GApplication: + - Drop support for exporting menus - this functionality + will be provided in GtkApplication + - Add a way to create actions that change settings + +* Bugs fixed: + 629503 Add async versions of g_unix_connection_{receive,send}_credentials + 656301 glib-compile-schemas should not create an empty file + 668071 mingw-gcc build fails on gio/gsocket.[c|h] + 668118 the big appmenu switcheroo + 668158 base64 encode and line termination + 668163 GDBusConnection: note that exit-on-close is sometimes TRUE + 668269 gsignal: add g_signal_handlers_disconnect_by_data + 668279 create GAction from GSettings + +* Translation updates: + Norwegian bokmÃ¥l + + +Overview of changes from GLib 2.31.8 to 2.31.10 +=============================================== + +* GResource: + - A new facility to allow linking data files into binaries + and make them available as resources + - Resources are compiled using glib-compile-resources + - GIO supports resource:/// uris to access resources + +* Bugs fixed: + 619126 Missing dependency libs + 658315 g_key_file_get_keys() should set length to 0... + 660371 is it ever valid to have 0 as a GError domain? + 666700 Add some missing (allow-none) annotations + 667375 GAsyncInitable subclassing (and async subclassing... + 667447 Missing many introspection annotations + 667790 Protect call to pthread_condattr_setclock with define + 667938 wrong gtypes generated for empty flags enums + +* Translation updates: + Hebrew + Spanish + + +Overview of changes from GLib 2.31.6 to 2.31.8 +============================================== + +* GObject: + - The type checks for overriding properties have been loosened. + In particular, it is now possible to add the CONSTRUCT flag + to an overridden property + - GWeakRef is a new API for weak references; unlike g_object_weak_ref + and g_object_add_weak_pointer, it is thread-safe. + +* GHashTable has grown new convenience api for use as a set: + g_hash_table_add, g_hash_table_contains + +* GSocketConnection has gained API for managing connection status + +* GSettings: a native OS X backend has been added, under the + name 'nexstep' + +* Bugs fixed + 455640 Something fishy with GRegex and unicode + 548954 weak references are not threadsafe + 625751 Add G_FILE_ATTRIBUTE_FILESYSTEM_USED + 658871 gbacktrace: g_get_prgname () isn't called for a NULL argu... + 664069 gvariant: Never break out of g_variant_iter_loop + 664830 g_strescape doesn't natively handle \v (vertical tab) + 665211 GDBusConnection singleton access can race with disposal + 665805 Add GSocketClient::action, for tracking socket client status + 666116 some tests provoke undefined behaviour, which is undesira... + 666422 Unreachable code in gio gnetworkmonitornetlink.c + 666551 Crash in g_thread_xp_SleepConditionVariableSRW + 666595 menu parser disallows id='' on submenu and section + 666615 loosen property override flag restrictions + 666616 gobject: fix property override type checks + 666803 g_utf8_validate() fails to validate strings with known size + 666804 g_ateaxit deprecation warning in devhelp points in wrong ... + 666951 g_mkdtemp: Since version incorrect in docs + 666978 Fails to compile glib applications with ISO C90 compiler + 667098 ginetaddressmask leaks its address property + 667225 GSocket: add missing type checks to public methods + 667226 GSocket: fix an error return value + 667279 Sometimes crashes when launching commandline-crea... + 667285 Wrong keyname listed in documentation for g_deskt... + 667331 Use g_queue_free_full() convenience function + 667420 GHashTable GDB pretty printing is broken + +* Updated translations + Belarusian + Bulgarian + Hebrew + Norwegian bokmÃ¥l + Norwegian Nynorsk + Spanish + Vietnamese + + +Overview of changes from GLib 2.31.4 to 2.31.6 +============================================== + +* GApplication no longer has APIs for setting menus. Those have been + moved to GtkApplication. + +* the GActionGroup import/export functionality has been decoupled from + GApplication by the introduction of a new interface for the purpose of + handling platform data: GRemoteActionGroup. This allows Gtk to + properly deal with platform data (and gdk threads) on window actions. + +* lots of documentation improvements + +* bug fixes and a huge number of memory leak fixes + +* the test suite now passes on ARM and some of the GDBus testcase hangs + we've been seeing have been resolved (although others could remain) + +* g_bytes_get_data() API changed: now includes 'size' out parameter + +* new g_queue_free_full() API similar to g_[s]list_free_full() + +* desktop files: use standard "Keywords" now, not "X-GNOME-Keywords" + +* gsettings commandline tool now has --schemadir option for schemas not + installed in the usual place (ie: as part of plugins) + +* Bugs fixed: + 643736 GApplication doesn't emit dbus signals on action updates + 657433 g_queue_free_full() missing + 664699 glib: documentation fixes + 665737 acquire/release gdk threads lock on incoming dbus + 665879 GBytes: add a size argument to g_bytes_get_data + 666113 various leaks in GLib, GIO are visible in the regression tests + 666115 various tests leak memory, obscuring real leaks in the library + 666145 Doc could be more explicite that g_thread_init calls can be droped + 666173 Configure warning - linux/netlink.h usability... no + 666296 Race condition in g_thread_xp_get_srwlock + 666415 Settings tools should allow specifying a schema directory + +* Translations updated: + French + Spanish + +Overview of changes from GLib 2.31.2 to 2.31.4 +============================================== + +* EXPERIMENTAL: Menu support has been added to GApplication. Menus + are exported on the bus, alongside the actions that are already there. + There have also been many related improvements to action group + functionality. + + These new APIs are subject to changes in the coming releases. In + particular, it seems somewhat likely that the APIs for registering + menubars may change in order to accommodate windows with different + types of menubars. + +* GDBusConnection previously directly dispatched destroy notifies when + unregistering objects if the current main context was the same context + the object was exported on. It now unconditionally dispatches these + through an idle on the context. + +* Clean up Requires in pc files. Linking against GIO no + longer drags in gmodule. This may require dependency + fixes here and there. + +* Introduce GBytes, a data type for immutable, fixed-size + byte sequences. This makes the pre-existing GBuffer + API available outside GLib + +* GDBusInterfaceSkeleton can now be exported on multiple + connections + +* Bugs fixed: + 600161 Do not use static GTypeInfo and GInterfaceInfo + 640077 GFileMonitor: Always send CHANGES_DONE_HINT after a move... + 641720 Misleading definition for local_command_line() in GApplic... + 648516 Little comment error and 2 useless lines of code + 651997 Dummy backend for gapplication + 652560 Test for g_ascii_strtod is failing + 662208 failure to initialize a GInitable should be considered... + 662718 GDBusInterfaceSkeleton should be able to export on multi... + 663291 GBytes: Immutable, refcounted sequence of bytes + 664406 Need context for a proper translation + 664455 Build fixes for GLib GIT master (2.31.x) + 664558 GDBusWorker.frozen has a value > 1 in a gboolean + 664559 sys/wait.h not available on windows + 664617 gdbus segfault error 4 in libgio-2.0.so.0.3102.0 + 664635 GMemory{Out,In}putStream _async functions break sub-class... + 664809 Add command line option to gtester to allow skipping tests + 665067 cryptic assertion failure if nonsensical flag combinations... + 665184 Check ref. count before reffing/unreffing + 665298 Add 'Requires.private: libpcre' to glib-2.0.pc + 665391 update documentation around mainloops + 665607 ./configure is there for fiddling with cross-compile enviro... + 665634 g_dbus_node_info_new_for_xml() errors on unknown attributes... + 665685 Add a #define for the max length of a Unicode decomposition + 665733 GDBusConnection holds lock while calling destroynotify + +* Translation updates: + Norwegian bokmÃ¥l + Spanish + + +Overview of changes from GLib 2.31.0 to 2.31.2 +============================================== + +* Monotonic time is now properly supported on Windows + +* glib-mkenums: fix @ENUMPREFIX@ with /*< underscore_name=... >*/ + +* EXPERIMENTAL: introduce new GSettingsSchema and GSettingsSchemaSource + APIs for the convenience of plugin system authors and those who wish + to introspect the contents of schemas. This API may change. + +* Improve the performance of GObject property notifies. + +* GDBus: + - fix a race when unowning a name immediately after owning it + - thread safety improvements on GDBusConnection + - fixes for exit-on-close functionality + +* Deprecations: + - add G_SIGNAL_DEPRECATED + - don't use G_DISABLE_DEPRECATED masking for functions anymore + +* docs + - tmpl/ is finally dead for glib + +* GIO: + - GInetAddressMask: new type for internet address range matching + - various GIO file and stream fixes + - improvements to attribute and fileinfo handling + +Overview of changes from GLib 2.29/2.30 to 2.31.0 +================================================= + +This release contains a huge number of changes (500 commits worth). The +list below attempts to summarise, but not every change is listed. + +* Major changes to threading and synchronisation + - threading is now always enabled in GLib + - support for custom thread implementations (including our own internal + support for errorcheck mutexes) has been removed + - a whole lot of dead code (to deal with the non-threaded case) has + been ripped out. This includes the racy path of GMainContext that + caused deadlocks with respect to child process exits in + single-threaded programs (such as gtester). + - libgthread is now an empty shell and g_thread_init() is no longer + required (and has been deprecated) + - GMutex and GCond can now be statically allocated without explicit + initialisation. Dynamic allocation for these types is deprecated. + - new types GRecMutex and GRWLock can also be statically allocated + without explicit initialisation. + - GPrivate can now be statically allocated and has an improved API. + Dynamic allocation of GPrivate is deprecated. + - GStaticMutex, GStaticRecMutex, GStaticRwLock, GStaticPrivate are + deprecated. + - GCond now uses monotonic time internally and a new API takes + monotonic time for timed waits, deprecating the wallclock API + - removal of the insane macro indirection used in the previous + implementation of threading and synchronisation APIs + - use SRWLock and CONDITION_VARIABLE APIs when available on Windows + (Vista and later) and emulate them on XP + - leaks of G(Static)Private-allocated data on some cases of thread exit + have been fixed + - simplified new thread creation API with the old API deprecated. The + concept of joinability has disappeared (all threads are joinable) as + have priority levels, 'bound'ness (ie: kernel vs. userspace threads) + and ability to manipulate the stack size. + - GThread is now a refcounted type + - other implementation details changed + +* Move headers for some deprecated functionality to a separate + deprecated/ directory. + +* New support for attribute-based deprecations to issue compiler + warnings instead of breaking the build and/or giving warnings about + implicit declarations (and possibly miscompiling). + +* GCache has been deprecated (after its last use was removed from our + platform over a year ago). + +* It is no longer possible to include individual headers (like + "ghash.h") -- you must #include . + +* The misguided experiment of allowing the program to stumble along with + missing GSettings schemas is now over -- the abort is back. + +* Clarify that fork() is not valid while using GMainContext. This is + because the internal resources of the GMainContext end up being shared + by both processes. We had an assert here but it was breaking existing + (valid) use cases as well, so it has been removed for now. + +* GApplication + - add ::shutdown signal as logical dual to ::startup + - don't use a GMainLoop: iterate the GMainContext directly (improves + quit logic) + +* Several portability fixes for Windows, OpenBSD, Solaris + +* Add new GValue API to specifically deal in signed chars (in case the + platform defines 'char' as unsigned) + +* some new API to mitigate the problems associated with calling setenv() + in a multi-threaded program + +* Use CLOCK_MONOTONIC unconditionally if the libc has support at compile + time (ie: stop checking for kernel support at runtime). + +* pkg-config files: + - drop -uninstalled variants + - remove gobject dependency on gthread + +* New macro G_ATOMIC_LOCK_FREE is defined if the atomic operations are + implemented without use of a mutex. Cleaned up atomic-related + compilation issues with mingw compilers on win32 systems. + +* SOCKS proxy and resolver improvements + +* Fix the spelling of G_IO_FLAG_IS_WRITABLE (was WRITEABLE) and + introduce a macro for backwards compatibility. + +* GDBus: + - many code generation updates and improvements + - some race condition fixes, including testcase hangs + +* GVariant: + - new g_variant_new_from_fixed_array() API + - substantial docs improvements/clarifications + +* GKeyFile is now refcounted and boxed + +* mount monitoring is now based on /proc/mounts (where available) + instead of mtab + +* new macros G_SOURCE_CONTINUE and G_SOURCE_REMOVE for returning from + GSourceFunc (so you don't have to remember what TRUE and FALSE mean) + +* use xlocale functions where available to avoid too much heavy lifting + in functions like g_ascii_strtod() + +* GMappedFile can now be created from an fd + +* error message strings grammar/i18n fixes + +* many docs updates + +* Partial list of bugs closed: + 70598 Unify GStaticMutex and GMutex. + 320888 optimization for g_main_context_wakeup + 398418 GChildWatch race condition? + 527214 g_timer_elapsed() returns random values + 580505 add a way to set/get name for a thread + 583511 race condition means g_main_loop_quit() does not work + 590808 GKeyFile should have a refcount and a boxed type in GObject + 592715 Document that g_str_hash() and g_int_hash() are not NULL safe + 631413 Add macros for GSourceFunc return values + 632049 not immediately clear what g_variant_get_fixed_array expects + 640212 "Error stating file" is not a friendly message + 640293 Use xlocale functions to implement g_ascii_strtod() + 640975 Check that error exists before trying to set it + 643934 GApplication lacking a logical dual for the ::startup signal + 651268 assertion failed in GDBus worker thread + 653987 g_key_file_get_integer cannot interpret trailing spaces + 654412 Documentation for g_variant_get_child_value unclear + 654563 info capplet: Failed to calculate disk space + 655366 missing GSettings schemas lead to obscure crashes + 656621 g_spawn_*() calls executables in current directory + 656679 [gi] Add two annotations to gio + 657992 Add glib__private__() API to share between glib,gio + 658188 _set_as_last_used_for_type generates a broken mimeapps.list + 658206 gsocks5proxy.c has invalid gettext use + 658207 glib-compile-schemas says "can not" + 658558 simpleaction: Fix documentation of :enabled + 658683 clean up charset/language threading issues + 658692 add introspection annotations to g_time_val_from_iso8601() + 658715 Duplicite strings + 658769 Invalid reuse of GError in GThreadedResolver + 658806 sign error in string hash implementation + 658976 gdbus-codegen's C namespace option needs to support Ugly_Case + 659070 gdbus-codegen generated code segfaults when property changes + 659082 gdbus-codegen: Single letter namespaces get dropped from names + 659212 GMappedFile should fail on non-regular files + 659324 _SPLICE_CLOSE_TARGET doesn't mark the output stream as closed + 659423 Use adaptive mutexes when available + 659427 Move deprecated code to a separate directory + 659646 gdbus-codegen produce code that warnings at build + 659690 Possible build warning in code generated by gdbus-codegen + 659699 property name collision when generating code for "Connection" + 659754 Add API to GMappedFile that allows to pass FD + 659838 incorrect types in introspection for g_object_bind_property + 659866 pthread_rwlock_t requires defined __USE_UNIX98 + 659870 gvalue: Fix signedness of g_value_get_char() + 659889 glib-2.29.92/gio-2.0.pc.in has a wrong line. + 659916 GObject size of 64K is not actively enforced + 659920 Missing setter for read/write property 'closed' of GIOStream + 659923 Add g_variant_new_fixed_array() function + 660013 Remove old g_atomic configure cruft + 660096 glib/rwlock tests failure (tests asserted) + 660130 Possible loss of user data when updating mimeapps.list + 660147 tracker causes g_critical in "gsettings list-recursively" + 660413 Make G_ASSERT_STATIC work with clang + 660498 Generated test code fails when the codegen changes + 660511 Use /proc/mounts for monitoring mounts, not /etc/mtab + 660536 Expose options for /etc/fstab entries + 660635 Deprecate g_thread_foreach + 660637 Pending dbus method calls not canceled on connection loss + 660739 kill off g_{mutex,cond}_{new,free}() + 660740 make GThread more standard + 660741 g_cond_timedwait is a disaster + 660743 macro wrappers for g_once_init_enter/leave + 660744 finish killing g_thread_init() + 660745 GPrivate leaks on Windows + 660791 [gio] Improve doc for g_file_make_directory_with_parents() + 660843 asyncqueue-test is broken + 660849 Remove cruft from g_strerror and g_strsignal + 660886 GDBusProxy: don't drop/complain about unknown props/signals + 660887 g_slice_set_config() is broken + 660994 Add g_main_context_ref_thread_default() + 661255 gio: enable test_peer regression test for OpenBSD + 661257 giomodules.c uses ":" instead of G_SEARCHPATH_SEPARATOR_S + 661318 tests use pthread without appropriate compiler/linker flags + 661421 Applications fail to initialize on GNU Hurd - commit + 661438 Implement G_GNUC_DEPRECATED/G_GNUC_DEPRECATED_FOR on Visual C++ + 661711 Sorting keys for GDrive, GVolume and GMount instances + 661763 desktop-app-info: Add support for X-GNOME-Keywords + 661896 /gdbus/connection/life-cycle is racy + 661914 Gstreamer/Totem locks up + 662100 regression: g_dbus_connection_close() triggers exit-on-close logic + +* Translations updates: + Belarusian + Brazilian Portuguese + British English + Bulgarian + Catalan + Catalan (Valencian) + Czech + Danish + Esperanto + French + Gujarati + Hebrew + Hungarian + Italian + Japanese + Lithuanian + Norwegian bokmål + Oriya + Polish + Russian + Serbian + Simplified Chinese + Slovak + Slovenian + Spanish + Tamil + Vietnamese + +Overview of changes from GLib 2.29.18 to 2.29.90 +================================================ + +* API/ABI changes: + - unix signal watches now match the API of all of the other sources + - revert the addition of g_date_time_source_new () from last release + +* networking and other fixes for Solaris + - we no longer support symbolic port names (ie: from /etc/services) + - check if -lsocket is needed + - fix g_socket_details_from_fd() + - avoid getmntinfo + - fix some harmless warnings + +* GDateTime improvements: + - generally improved standards compliance (with C99) + - support C99-specified format strings: %g, %G, %V, %c, %C, %w + - consult the locale for the preferred 12-hour time format (%r) + - drop support for non-standard %N and broken %W + - better support for formatting non-POSIX (eg: Arabic) numerals + - locale-related test case fixups, and fix some leaks + +* GTlsInteraction: add interaction method invocation guarantees + +* gdbus-codegen: post-process all interfaces when parsing >1 file + +* make GMainLoop, GMainContext and GSource boxed types + +* fix a race condition in the first use of g_get_monotonic_time() + +* lots gtk-doc cleanups + +* better intltool compatibility when generating pot file + +* avoid GCC-specific compiler options when not using GCC + +* Translation updates: + Belarusian + Brazilian Portuguese + Canadian English + Galician + Indonesian + Korean + Lithuanian + Norwegian bokmål + Portuguese + Spanish + Swedish + +Overview of changes from GLib 2.29.16 to 2.29.18 +================================================ + +* GDateTime is now respecting LC_TIME when formatting + +* GTimeZoneMonitor has been removed again + +* A new API for wallclock functionality has been added: + g_date_time_source_new(). This API is still experimental + and may be changed or removed before 2.30. + +* Bugs fixed: + 628904 Add credential support for FreeBSD and fix a socket issue + 650763 gdbus-codegen is broken with python 2.7 + 655129 GDateTime could provide api for implementing wall clocks + 656341 gtlsconsoleinteraction.c uses getpass() which isn't avail... + 656387 GCancellable can be used concurrently + 656443 Make GTlsInteraction ask_password cancellable + 656675 void functions should not return in glib 2.29.16 + 656772 g_variant_compare for uint64 incorrect + 656914 Load GIO_EXTRA_MODULES first, and ignore duplicates + 657083 The header langinfo.h is not available on all systems + 657084 gfileutils: fix docs/annotations for temp file methods + 657138 Some files missing in POTFILES.in + 657206 GInputStream leaked in g_file_icon_load_async() + 657243 g_cancellable_set_error_if_cancelled() documentation + 657274 Use detected PYTHON variable as shebang for gdbus-codegen + 657336 Speling fixes for glib found with codespell + 657452 plural forms needed + 657454 Translation comment needed + 657540 Print out file:// URL to coverage HTML report after building + 657593 g_test_trap_fork calls close(-1) + 646082 Addresses from GSocket should be normalized before returning + 657517 fix gio/tests/gdbus-peer on bsd + +* Translation updates: + Brazilian Portuguese + Galician + Norwegian bokmål + Punjabi + Russian + Serbian + Spanish + Swedish + Traditional Chinese + Uighur + + +Overview of changes from GLib 2.29.14 to 2.29.16 +================================================ + +* GTlsDatabase: an abstract class that provides support + or certificate and key lookup. An implementation will + be provided in glib-networking + +* GHmac: Support or HMAC digests + +* Misc new API: + - g_ptr_array_add_full: creates a GPtrArray with + a preallocated size and a destroy function + - g_desktop_app_info_get_show_in: checks if a GDesktopAppInfo + should be shown in a given desktop environment + - g_mkdtemp, g_mkdtemp_full, g_dir_make_tmp: create + temporary directories + +* Unify thread wakeup implementations of GMainContext + and GCancellable, and use eventfd for it when available + +* Show mounts in $XDG_USER_DIR in addition to /media and $HOME + +* Bugs fixed: + 636572 GTlsCertificateDB + 644601 Some tests need a running dbus session + 652284 deal with small key lengths + 652827 glib-2.29.8 no longer builds with mingw.org's toolchain + 653063 PEM parser fails parsing private key when put first + 654078 Fail to static linking with Glib library + 654450 New functions: g_ptr_array_new_full() + 654793 Add G_VALUE_INIT + 655044 GDesktopAppInfo: Add g_desktop_app_info_get_show_in() + 655148 gdbusconnection is broken when compiling with mingw + 655241 glocalfile.c no longer compiles with MinGW GCC + 655598 g_cancellable_get_fd: silently return -1 for NULL cancellable + 655664 gdbus should not abort if no dbus session is available + 655769 Use ZLIB_CFLAGS when compiling gio + 656031 Improve GVariant annotations + 656048 glib-codegen requires Python >= 2.5 + 656151 configure test logic inverted, doesn't match comments + 656152 GCC only syntax used, yet other compilers allowed by configure. + 656162 allow use of lcov 1.9 for coverage + 656282 GDBusProxy: uninitialized local variables can be freed + 656283 Failing tls connection cause assertion + 118563 Add g_mkdtemp in the spirit of g_mkstemp + 636405 Add g_return_if_fail() to g_settings_bind_with_mapping() + 656039 race condition between GDBusProxy signals and public API + 656492 g_io_channel_new_file failure (open(2) behavior wrt POSIX) + +* Translation updates: + Bulgarian + Esperanto + French + Galician + German + Hebrew + Indonesian + Italian + Norwegian bokmål + Russian + Spanish + Swedish + + +Overview of changes from GLib 2.29.12 to 2.29.14 +================================================ + +* Unicode improvements + - add g_unicode_script_{to,from}_iso15924 + - add G_UNICODE_SPACING_MARK define + - more normalisation improvements + - stop using deprecated g_unicode_canonical_decomposition() + +* GParamSpec: + - mark the 'name' field as 'const' and add a comment to the header to + help avoid future problems caused by bad hacks + +* Merge some (modified) patches from Debian: + - 03_blacklist-directories.patch + - add some blacklisted mount directories + - 60_wait-longer-for-threads-to-die.patch + - sleep longer in a test case, if needed to avoid failing + +* Units policy change: prefer use of SI units + - deprecate g_format_size_for_display, add g_format_size(_full) + +* GSettings: don't call g_error() when the schema is missing + +* GVariant support for arrays of object paths: + - new g_variant_{new,get,dup}_objv API + - support for g_variant_{new,get} '^ao' and '^a&o' similar to '^as' + +* GDBus: + - use new improved array-of-objects support and pass 'ao' as char** + instead of GVariant* + - improve handling of 'h' type (Unix file descriptor index) + +* GIO: + - fix compilation without USE_STATFS and USE_STATVFS + +* Documentation fixes + +* Bugs fixed: + 622921 Migrate from dbus-glib to glib's GDBus + 648271 Add g_unicode_script_to_iso15924() + 654948 Stop using deprecated g_unicode_canonical_decomposition() + 654988 g_atomic_int_add should document behaviour change + 655025 #define G_UNICODE_SPACING_MARK G_UNICODE_COMBINING_MARK + 655076 normalization misses some Full_Composition_Exclusion=True. + +* Translations updated: + Spanish + +Overview of changes from GLib 2.29.10 to 2.29.12 +================================================ + +* Add new API to do Unicode (de-)composition in atomic steps, + for use in Harfbuzz. + +* Bugs fixed: + 615895 (indirectly) support non-NULL-terminated regexes in GRegex + 617949 glib trunk fails to compile on Solaris w/ Studio 12... + 620423 Document the possibility to unset attributes + 627974 Floating reference headaches + 644687 Not finding cross-links in current doc set + 649246 g_output_stream_splice() cannot be used on 32-bit machines... + 653841 a helper script to build glib from git master on win32 + 653935 g_slist_free_full/g_list_free_full iterates twice in the list + 654017 tests: fix glib_translations_work() in gsettings unit test + 654085 Don't needlessly use "echo -e" when creating .def files + 654195 Add g_unichar_compose() and g_unichar_decompose() + 654232 GCancellable eventfd problems + 654394 suspicious use of floating references in GDBusInterfaceSkeleton + 654536 GSettings: lift key name length restriction to 64 + 654627 GParamSpec: intern property names + 654651 Better g_unicode_canonical_decomposition() + 654917 Make g_cclosure_marshal_generic the default signal handler + +* Translation updates: + Belarusian + Finnish + Korean + Latvian + Lithuanian + Norwegian bokmål + Turkish + + +Overview of changes from GLib 2.29.8 to 2.29.10 +=============================================== + +* New features: + - g_desktop_app_info_get_nodisplay: a function that is required + to port gnome-menus to GDesktopAppInfo + - g_hash_Table_iter_replace: new function to replace a value + while iterating over a hash table + - g_utf8_substring: convenience API to extract substrings from + UTF-8 strings + - g_action_group_add_entries: convenience API for creating lots + of actions quickly + - Use eventfd instead of pipes for waking up main contexts and + for cancellation when available + - GMatchInfo is now a refcounted boxed type + +* API changes in GAction: + - the 'set_state' entry in the GActionInterface vtable has been + renamed to 'change_state + - g_action_set_state has been renamed to g_action_change_state + - the 'state' property has been changed to read-only + - GSimpleAction can no longer be subclassed + +* Bug fixes + 647796 g_variant_new_variant is not marked as constructor + 652072 gmain: make use of signalfd() + 652168 Crosscompiling Fails if build<=2.24 and host >2.24 + 652750 make dist fails + 652758 GDataInputStream: Clarify g_data_input_stream_read_line docs... + 652822 Add a g_hash_table_iter_replace + 652897 tiny docs clarification for g_utf8_to_ucs4_fast + 653140 gmain: use Linux eventfd() for main context wake up + 653429 drop AM_MAINTAINER_MODE or enable it by default + 653484 GAsyncCallbacks should default to allow-none + Add missing fundamental types to the generic marshaller + +* Translation updates + Belarusian + Galician + Russian + +Overview of changes from GLib 2.29.6 to 2.29.8 +============================================== + +* Bug fixes + 646608 export_symbols variable for gio dynamic library is wrong + 646635 Fix introspection of GLib + 647930 Documentation: GDataInputStream _read_upto() version + 651745 Switch to _ prefixing rather than G_GNUC_INTERNAL + 651920 Improve qsort_r detection + 651959 gbitlock: "asm goto" is not available in gcc < 4.5 + 651998 gdbus-codegen: Use relative Python imports + 652000 Fix for gatomic.c on Windows/MSVC + 652002 Proposal to clean up gvaluetransform.c for MSVC + 652025 g_dbus_connection_register_object: error is not set... + 652081 Typos in a GBinding warning message + 652197 Improper handling of double values in GDBusMessage + Fix a deadlock in gobject finalization + +* Translation updates: + Czech + Galician + German + Hebrew + Norwegian bokmål + Spanish + Uighur + + +Overview of changes from GLib 2.29.4 to 2.29.6 +============================================== + +* Atomic operations have been rewritten from scratch to make use + of gcc builtins where possible. As a side-effect of this, calls + to g_atomic_ API with explicit casts may now be problematic; if + that happens to you, try first to remove the casts. Another + side-effect of the rewrite is that g_atomic_int_exchange_and_add + has been deprecated in favor of g_atomic_int_add. + +* A full set of atomic operations on pointers has been added, + including bit locks in pointer-size locations. + +* Access to quarks is now lockless + +* GObject data scalability has been greatly improved + +* g_data_time_format now supports alternative digits and padding + +* Introspection improvements: + - Add a boxed type for GVariantBuilder + - Annotation fixes in GDBus, GVariant, g_base64_ + +* Bugs fixed: + 502560 g_rand_double_range returns 'inf' + 612729 g_mkdir_with_parents can fail if the directory already exists + 617491 g_once() implementation is inefficient + 619418 Add a performance test for UTF-8 decoding functions + 619435 Make g_utf8_to_ucs4_fast() yet faster + 626549 G_STATIC_ASSERT_EXPR + 631231 bitlock: Fix detection and usage of futexes with Bionic + 632294 g_queue_remove() should return a boolean + 640518 GMainLoop has quadratic complexity when all pollfd's... + 642026 Race condition in g_static_private_free + 646635 Fix introspection of GLib + 648678 g_date_time_format(): support %O flags for localized numbers + 649480 Use MSG_CMSG_CLOEXEC in recvmsg in gio/gsocket.c + 649506 GTestFunc et al lacking Since tag + 649657 Don't return gboolean for functions that throw + 649775 glib-gio-gdbuscodegen-Makefile.patch + 649915 gsettings accepts unquoted strings longer than two characters + 649973 gthread: build unix tests only on unix + 649988 gdbus-codegen: Drop dependency on argparse + 650078 forkbomb building glib/tests/protocol + 650211 Optimization in key file parsing + 650236 Application over DBus implements action state incorrectly + 650345 g_key_file_has_key_full: New function to fix g_key_file_has_key... + 650458 reduce overhead in g_object_set/get_data + 650459 hash table consistency while calling destroy notify funcs + 650688 enforce rules about hash table modification + 650823 expand the set of atomic ops + 650874 codegen chokes on docs + 650882 use stdout instead of stderr for informational messages + 650884 fix compilation with gcc2 + 650885 implement glib credentials on OpenBSD (hackish) + 650935 G_GNUC_MAY_ALIAS and atomic ops + 651009 minor documentation fix + 651034 Regarding g_cond_wait after g_thread_pool_push in gthreadedresolver + 651133 race condition in GDBusConnection's emit_signal_instance_in_idle_cb + 651141 hashtable infinite loop + 651219 fix path to true(1) on OpenBSD + 651223 Fix some compile warnings on OpenBSD + 651327 Minor fixes for the gsocket API + 651467 Add pointer sized bitlocks + 651650 gdbus: Avoid busy wait loop + 651725 gmain: Cleanups and a new test case + 651745 Switch to _ prefixing rather than G_GNUC_INTERNAL + +* Updated translations: + Catalan (Valencian) + Esperanto + Hebrew + Hungarian + Russian + Spanish + + +Overview of changes from GLib 2.29.2 to 2.29.4 +============================================== + +* GDBus: + - Includes several new types to support modeling D-Bus + objects and interfaces more fully, and also introduces + an 'object manager' pattern: + GDBusInterface, GDBusObject, GDBusObjectManager + These interfaces have client-side implementations: + GDBusProxy, GDBusObjectProxy, GDBusObjectManagerClient + And server-side implementations: + GDBusInterfaceSkeleton, GDBusObjectSkeleton, GDBusObjectManagerServer + - The new gdbus-codegen utility uses these new classes + to generate C code and documentation from D-Bus interface + descriptions in XML + +* GTest: + - There is now a g_test_fail() function to mark + tests as failed + +* GDesktopAppInfo + - Now has a binding-friendly filename property + - Other new API to more fully expose desktop file contents: + g_desktop_app_info_get_categories(), + g_desktop_app_info_get_generic_name() + +* GHashTable: + - Several optimizations to reduce space consumption of + large hash tables, in particular tables that are used + to store sets. + +* Unix-specific APIs: + GLib now installs a separate header, glib-unix.h, that is + meant to collect Unix-specific APIs. For now, it contains + g_unix_open_pipe(), g_unix_set_fd_non_blocking() for dealing + with pipes and fds, as well as APIs to create mainloop + sources which can trigger callbacks on certain Unix + signals (SIGTERM, SIGHUP, SIGINT). + +* Bugs fixed: + 631379 GDBus nonce-tcp test failing + 632631 GLib-CRITICAL **: g_variant_new_string: assertion `g_utf8_validate (string, -1, NULL)' failed + 635694 gdbus aborting due to unauthorized socket in DBUS_SESSION_BUS_ADDRESS + 637561 Crash when using G_DBUS_SERVER_FLAGS_RUN_IN_THREAD + 642935 g_date_time_format() prints wrong value for %z and timezone -0800 + 643134 g_dbus_message_copy + 644941 glib-unix: New Unix-specific API + 646013 g_hash_table_remove_all_nodes optimization + 646309 glib cannot be cross-compilled for mingw32 + 646435 GTimeZone doesn't seem to be thread-safe + 646957 GIO chained calls don't work with a thread default context + 647594 README link to mailing list is broken + 647602 Cannot connect to remote message bus via TCP + 647746 The GSocketService documentation is incomplete. + 647826 API: gtester: Add g_test_fail() + 647903 GDesktopAppInfo: Add g_desktop_app_info_get_categories() + 648416 g_app_info_create_from_commandline ignores SUPPORTS_STARTUP_NOTIFICATION + 648423 Support G_DEBUG=trap-warnings + 648425 GDesktopAppInfo: Add "filename" property for bindings + 648966 Update g_unichar_iswide and g_unichar_iswide_cjk + +* Updated translations + Norwegian bokmål + Spanish + Turkish + Uighur + + +Overview of Changes from GLib 2.28.0 to 2.29.2 +============================================== + +* GApplication + - The documentation has been enhanced and clarified + - An opt-out for uniqueness has been added: G_APPLICATION_NON_UNIQUE + - GApplication now syncs settings before g_application_run() returns + +* GDBus + - Interface lookups are now happening in constant time + - Signature checking and handling of various unexpected + situations has been improved + +* GVariant + - The format accepted by the GVariant parser has beend documented + - GVariant accepts G_VARIANT_TYPE_VARDICT for a{sv} + +* GDateTime: + - The return value of g_datetime_compare() has been fixed to + match strcmp() semantics + - In order to handle problems with changing timezones, a GTimeZoneMonitor + has been added to GIO, and g_time_zone_refresh_local() can be + called to update the cached information about the local timezone + +* GOption now uses /proc/self/cmdline to set the program name instead + and only falls back to "" if that is unavailable + +* GSettings: + - The schema compiler now warns about references to non-existing schemas + +* Commandline utilities are now fully translated + +* Signals can now indicate that collecting their arguments must + always happen, even in the absence of connected signal handlers, + using the G_SIGNAL_MUST_COLLECT flag. + +* Bugs fixed: + 635099 Memory leak in gdbus introspection when parsing xml + 640489 $ and ^ do not match lines if G_REGEX_MULTILINE|G_R... + 642042 Overriding GDBus org.freedesktop.DBus.Properties im... + 642052 g_timeout_add(_seconds) cannot handle large intervals + 642490 notify_desktop_launch() "g_variant_new_bytestring:... + 613269 g_type_get_qdata() doesn't work as I expected on subtypes + 624943 G_VALUE_NOCOPY_CONTENTS is undocumented + 637738 object_interface_check_properties never actually executes + 638185 GIOCondition should be annotated as "flags" + 639478 GDBusServer's g_dbus_server_new_sync() function should just... + 641755 Add g_settings_get/set_uint() helpers + 641768 dconf gsettings backend silently drops writes if it can't... + 642797 g_app_info_get_default_for_type() broken for subtypes + 642825 Unnecessary assertion failure in g_option_context_parse() + 642944 NULL key lookup using g_hash_table_lookup_extended() + 643074 Incorrect documentation for g_socket_receive() and g_socket... + 643197 g_application_id_is_valid docs imply no valid ids + 643468 GApplication docs: Warn that handling "command-line" means... + 643478 GApplication::local_command_line vfunc documentation seems wrong + 643624 Can g_variant_unref() on an already free'd variant + 643649 g_application_run() should say that argc/argv can be NULL + 643780 shouldn't need to create an action group to use actions... + 643795 g_timeout_add_seconds fires with intervals 1 second longer... + 644309 Program name is not set when using GtkApplication + 644428 Crash in failure section of g_markup_collect_attributes() + 644465 undefined reference to `_usleep' + 644552 g_timeout_add_seconds(1, ...) may have a latency of up to 2... + 644607 Correct internal definition of C_() + 645789 annotations for g_file_*_contents + 646039 g_settings_list_children() returns child that cannot be opened + 646310 Accept range with only min or max + 646420 g_dbus_method_invocation_get_parameters() docs should say... + 646843 occasional abort on autologin + 646985 add G_APPLICATION_NON_UNIQUE flag + 647579 gsettings: Implement reset-recursively + 647600 gsettings description has typo + +* Translation updates + Afrikaans + Bulgarian + Bengali India + British English + Bulgarian + Catalan + Czech + Danish + French + Galician + German + Greek + Gujarati + Hebrew + Hungarian + Italian + Japanese + Korean + Lithuanian + Polish + Portuguese + Romanian + Serbian + Simplified Chinese + Spanish + Swedish + Traditional Chinese + Uighur + Vietnamese + + +Overview of Changes from GLib 2.27.93 to 2.28.0 +=============================================== + +* Bugs fixed: +641363 GInitable documentation isn't clear about that finalize... +641395 Add more data about the origin application to the "Lau... +641411 gdesktopappinfo signals lost if it's the session bus... +641477 glib-mkenums uses unportable #! line +641572 Add @EXEEXT@ to pkgconfig binary name +641688 glib installs GSettings.html and gsettings.html + +* Translation updates: + Galician + Italian + Korean + Punjabi + + +Overview of Changes from GLib 2.27.92 to 2.27.93 +================================================ + +* Bugs fixed: + 637013 gio/gdbusmessage.c fails to compile on Solaris + 640192 Error creating a Gio.Settings object through py... + 640261 Minimum version for external pcre needs to be.. + 640262 GActionGroup contains redundant TYPE macros + 640436 Make load_user_special_dirs() resistant to non... + 640695 g_key_file_load_from_file() mishandles a CR-LF... + 640724 can't compile gio due to format string issues + 640725 can't compile tests due to format string issue + 640807 improve GVariant behaviour with invalid pointers + 640823 wrong documentation for g_source_add_child_source + +* Translation updates: + Bulgarian + Galician + Hebrew + Norwegian bokmål + Spanish + Traditional Chinese + + +Overview of Changes from GLib 2.27.91 to 2.27.92 +================================================ + +* Update to Unicode 6.0 + +* Update PCRE to 8.12 + +* Bugs fixed: + 637696 g_unix_connection_send_fd() doesn't work + 638872 null settings backend bug + 640042 GtkApplication's warning about not connecting... + +* Translation updates: + Arabic + Basque + Estonian + Greek + +Overview of Changes from GLib 2.27.90 to 2.27.91 +================================================ + +* Bugs fixed: + 638838 gdesktopappinfo: Don't crash if we don't have a desktop filename + 638894 Splitting on \s* gives no result + 639064 Update gschema.dtd + 639084 Copy/paste error in GSettings::writable-changed signal + 639177 SIGSEGV for GApplications with G_APPLICATION_IS_SERVICE + +* Translation updates: + Estonian + Galician + Indonesian + + +Overview of Changes from GLib 2.27.5 to 2.27.90 +=============================================== + +* Test reports created by gtester-report can now + include revision information + +* The g_desktop_app_info_launch_* family of functions + now emit a DBus signal when an application is launched. + Additionally, there is a new variant + g_desktop_app_info_launch_uris_as_manager(), which + gives more control over the launched process. + +* The memory and null GSettings backends are now available + as public API + +* g_get_locale_variants() is a new function that returns a + list of variants of a locale identifier + +* Bugs fixed: + 587898 I/O timeouts for GSocket + 606960 gio: Add extension point for informing parties... + 631980 Handle an optional node in the report... + 634569 Document that g_variant_builder_add_value consumes... + 635998 Make _g_compute_locale_variants public + 636806 Add g_{memory,null}_settings_backend_get_default + 637262 Need a binary DER version of ::accepted-cas + 637544 Skip fsync() on btrfs + 637720 void functions should not return a value. + 637738 object_interface_check_properties never actually... + 637759 GIOChannel: fix a crash in g_io_channel_read_chars() + 637852 Updates to glib.vsprops file for MSVC 2008 builds... + 637858 Updates to test/testglib.c... + 638349 parameter name of g_variant_new_* may conflict... + +* Translation updates: + Hebrew + Norwegian bokmål + Simplified Chinese + Spanish + Swedish + Uyghur + Vietnamese + + +Overview of Changes from GLib 2.27.4 to 2.27.5 +============================================== + +* Network support: + - Add g_tls_certificate_verify() to verify a certificate + - Add GTlsConnection:use-system-certdb + - Other TLS api additions + +* GIO: + - Add g_io_stream_splice_async()/_finish() to splice two iostreams + - Add g_emblemed_icon_clear_emblems() and make GEmblemedIcon derivable + - Remove GPeriodic; it did not receive the necessary review and + integration work to declare it stable + +* GSequence: + - New methods g_sequence_lookup() and g_sequence_lookup_iter() + +* Bugs fixed: + 617254 Missing g_sequence_lookup + 632544 g_dbus_connection_send_message can not send a locked message... + 633350 g_hostname_to_ascii() ignores non-ascii dots + 634583 Better error reporting for g_variant_parse() + 635007 gsetting enum rule don't work for out-of-srcdir builds + 635626 GDBus message idle can execute while flushes are pending + 636100 Can't read GSettings:backend property + 636305 Typo on g_queue_remove_all() function description + 636311 appinfo: tweak application positioning for content-types + 636351 g_simple_async_result_is_valid lacks a version tag + 636387 gdb autoload files shadow the "dir" builtin + 636673 g_simple_async_report_error_in_idle should allow object... + 637147 Add a "delay-apply" property to GSettings + 637171 emblemedicon: add g_emblemed_icon_clear_emblems() + 637237 gapplication: plug a memory leak + +* Translation updates: + Estonian + Galician + Hebrew + Norwegian bokmål + Simplified Chinese + Spanish + Traditional Chinese + Vietnamese + + +Overview of Changes from GLib 2.27.3 to 2.27.4 +============================================== + +* GIO + - Mounts are treated as hidden if they have a path element + that starts with a dot + - GAppInfo gained API to differentiate between recommended + and fallback mime handlers + - g_cancellable_create_source: creates a GSource that triggers + when the GCancellable is canceled + - GPollableInput/OutputStream: Interfaces for pollable streams + - TLS support has landed, with an extension point that is + implemented in glib-networking + +* GLib + - Mainloop sources can now have 'child sources' + - g_get_runtime_dir: New function to return the XDG_RUNTIME_DIR + +* Bugs fixed: + 530786 GFileMonitor "changed" signal underdocumented + 588189 TLS support for GSocket* + 630357 g_object_new_valist uses uninitialized memory + 630559 typo in public string in gsocks: 'The SOCKSv5 require... + 632445 Documentation refers to removed GNOME 2.0 porting guide + 634239 Child GSources + 634241 Add pollable input/output streams + 634504 allow passing a NULL emblem to g_emblemed_icon_new() + 634613 unsufficient g_get_user_runtime_dir() documentation + 635640 schema should inherit gettext-domain from schemalist + 635768 Protect g_file_monitor_set_rate_limit() against negative... + 635882 Fix the wrong-category schema test + 635187 Wrong type of GVariant received in an action... + +* Updated translations: + Galician + Italian + Norwegian bokmål + Uyghur + + +Overview of Changes from GLib 2.27.2 to 2.27.3 +============================================== + +* The GTimeSpec type that was introduced in the 2.27.2 has been + dropped again in favour of APIs that return microseconds as + 64-bit integer. + Affected functions: + g_source_get_time + g_periodic_unblock + g_get_monotonic_time + g_get_real_time + The similar GTimeVal struct is still around, but its use is + discouraged. + +* GTimer is now using monotonic time unconditionally + +* There are some new functions to facilitate error reporting + in async GIO APIs: + g_simple_async_result_take_error + g_simple_async_result_new_take_error + g_simple_async_report_take_gerror_in_idle + +* There is new convenience API to us GVariant dictionaries: + g_variant_lookup + +* It is now possible to delay sending match rules to the + D-Bus daemon in GDBus: + G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE + +* Support has been added for XDG_RUNTIME_DIR: + g_get_user_runtime_dir + +* Various fixes for Win64/MSVC builds have been committed + +* Bugs fixed: + 620263 Add g_clear_object, g_clear_pointer, g_clear_boxed + 633075 update Project Files and sources for MSVC 2008/C89 + 633381 gsettings Makefile rules should handle empty list... + 633685 Use g_simple_async_result_{new_,}take_error + 633686 Add g_simple_async_report_take_gerror_in_idle + +* Translation updates: + Belarusian + Galician + Hebrew + Punjabi + Spanish + + +Overview of Changes from GLib 2.27.1 to 2.27.2 +============================================== + +* GApplication + - Export actions over DBus and support activating them from remote instances + - Support environment passing + +* GSettings + - The gsettings utility has a list-recursively command + - The gsettings utility has commandline completion for enum values + +* GLib is now linked against librt and uses monotonic time for + timeouts and GPeriod sources. GSource has a new g_source_get_time() + which returns monotonic time, and g_source_get_current_time() has + been deprecated + +* Bugs fixed: + 158725 free linked list with data + 626320 GVariant: Avoid locking in g_variant_get_child_value() if possible + 629247 add gsimpleasyncresult methods to take over a GError + 629274 GNetworkService does not do fallback when there is no SRV record + 631264 gsettings-tool choice/range support + 631482 g_date_time_from_instant: 1000000000000000000 + 632169 docs for manual use of gsettings-data-convert + 632571 Add equivalent to gconftool-2's -R option + 633115 GSettings m4 doesn't fail the build for broken schemas + 633206 Default g_application_local_command_line() doesn't set exit_status... + 633339 support more complex gapplication setups + 633356 Make timeout G_MAXINT mean "no timeout" + +* Translation updates: + Catalan (Valencian) + Indonesian + Japanese + + +Overview of Changes from GLib 2.27.0 to 2.27.1 +============================================== + +* GDateTime now has full week number support. + New API: g_date_time_get_week_numbering_year + +* The GSettings schema compiler will now skip over + broken .xml schema files instead of aborting altogether + +* GSettings now works properly on bigendian systems + +* GSettings has more complete support for ranges + New API: + g_settings_get_range + g_settings_range_check + The gsettings commandline tool supports ranges too. + +* GApplication has been rewritten; see the API docs for details + and examples. The action support is not complete yet. + +* The GLib mainloop has gained 'dispatch to context' functionality, + which can replace manually created idles in many cases. + New API: + g_main_context_invoke + g_main_context_invoke_full + +* The gio-desktop-app-info-lookup extension point has been + removed from GIO. GIO now uses x-scheme-handler mimetypes when + looking for default applications. + +* On win32, make g_get_user_data_dir() return the CSIDL_LOCAL_APPDATA + folder on Windows, and not CSIDL_PERSONAL. This matches what Qt does, + and has been widely requested. Also make g_get_user_config_dir() return + this and not the (roaming) CSIDL_APPDATA folder. + +* A periodic event clock has been added in GIO: GPeriodic. Note that this + API is still experimental and expected to undergo changes before it + will be incorporated into a stable GLib release. Use at your own risk. + +Bug fixes: + 613822 gobject signal connect/disconnect not thread safe + 618737 "dispatch to context" functionality + 620710 g_get_user_data_dir() uses CSIDL_PERSONAL and not CSIDL_APPDATA + 623400 acquire context before dispatching + 627126 gsettings schema files don't get installed on FreeBSD + 627171 g_socket_new_from_fd() doesn't set the right protocol + 628876 Wrong error description + 628937 gracefully handle broken schemas + 629274 GNetworkService doesn't fallback when there is no SRV record + 629289 g_error() used wrong, produces core dump + 629687 leaks class refcount in gsocketcontrolmessage + 629849 GLib-CRITICAL **: g_source_get_context: assertion `!SOURCE_... + 629945 GDBus deadlock in g_bus_get_sync() + 630000 g_date_time_difference + 630077 GDateTime week number support + 630185 Allow NULL strings in g_quark_try_string() + 630797 docs mention non-existent g_object_dispose() + 630968 gschema-compile problems on power g5 + 631263 GSettings needs range/choice APIs + 631264 gsettings-tool choice/range support + 631379 GDBus nonce-tcp test failing + 631410 Port gapplookupgconf.c to using x-scheme-handler/ + 632884 Possible deadlock in g_object_remove_toggle_ref() + +Transation updates: + Basque + Brazilian Portuguese + British English + Bulgarian + Czech + Dutch + Estonian + French + Galician + German + Greek + Hebrew + Hungarian + Japanese + Lithuanian + Polish + Portuguese + Romanian + Simplified Chinese + Slovenian + Spanish + + +Overview of Changes from GLib 2.25.15 to GLib 2.27.0 +==================================================== + +Build: + - massive restructuring to reduce #include abuse + - tweaks to silence some harmless compiler warnings + - rename gschema-compile.c to glib-compile-schemas.c + - Windows fixes + - fix building with zlib < 1.2.4 on win32 + +GDateTime: + - better msgctxt for translating month and weekday names + - API is changed quite a lot, implementation is improved + - GTimeZone is now exposed + +GObject: + - make ordering for overridden interface properties consistent + - ->priv structures are limited to 64k but this was not documented, + and exceeding this limit produced bad results. Add docs and enforce + the limit properly. + - add g_object_class_install_properties() to install multiple + properties in one go + - improve debugging output for GValue containing G_TYPE_STRV + +GIO: + - fix priority sorting of GIO extensions + - add GCredentials support on FreeBSD + - fix support for IPv6 addresses in URI parsing functions + - GSocketClient fixes for when g_socket_connect succeeds immediately + - clarify string encoding for GFile constructors in docs + - new functions g_data_input_stream_read_upto{,async,finish} + - tweak confusing documentation for g_output_stream_write() + +GDBus: + - GDBusMessage can now be locked and copied (like in libdbus) + - GDBusConnection filter function API has changed again + - GDBusServer: ::new-connection now declares if the connection was claimed + - add a partial workaround for GObject bug 627724. + - very many memory leaks fixed + +GVariant: + - check for size == 0 in g_variant_get_bytestring to avoid a crash + when attempting to get_bytestring() from an empty array + - improve gobject-introspection annotations + +GSettings: + - add GSettings Windows registry backend + - some internal tweaks to the backend API + - remove g_settings_list_items + - add g_settings_list_children and _list_keys to replace it + - add schema compiler restrictions for dealing with lists + - don't automatically emit value changed signals on writability + changes + +Other: + - constify the 'parser' vtable param to g_markup_parse_context_push() + - plug many memory leaks in test cases + +Bugs closed: + 50076 Time API to go with date API + 584284 g_data_input_stream_read_until_async different from sync version + 624546 Modification of GDBusMessage in filter function + 626919 Let g_object_class_install_property() return the installed GParamSpec* + 628029 GDateTime missing get_week_of_year method + 628253 Interface properties not listed in a consistent order + 628331 Plug lots of mem leaks in gio test suite + 628345 Plug a mem leak + 628436 Plug a mem leak + 628505 Fix building with zlib < 1.2.4 on win32 + 628839 [PATCH] datetime: Rename shadowing variables + 628904 [PATCH] Add credential support for FreeBSD and fix a socket issue + 628952 incorrect glib_major_version and other variables on cygwin. + 629192 g_strdup_value_contents(): dump GStrv more usefully + 629251 g_socket_client_async_connect_complete: assertion failed + 629259 Failed to connect to "::1" + 629328 g_markup_parse_context_push doesn't respect const structs + 629429 month "May" short and full form same with "GDateTime" msgctxt + 629689 GDBusConnection leaks its GCredentials + 629698 Segfault in g_variant_get_bytestring() + +Updated translations: + Arabic + Armenian + Basque + British English + Czech + Finnish + Galician + German + Hungarian + Indonesian + Japanese + Lithuanian + Norwegian bokmål + Polish + Portuguese + Punjabi + Simplified Chinese + Slovenian + Spanish + Swedish + Swedish + Traditional Chinese + +Overview of Changes from GLib 2.25.14 to GLib 2.25.15 +===================================================== + + * GIO + - Memory leak fixes + - The GZip(De}Compressor can now process header information + - Support for network proxies has been added, with the GProxy + interface and the gio-proxy-resolver extension point. GIO + includes SOCKSv4 and SOCKSv5 implementations, and libproxy + is also going to provide an implementation of this extension + point. + - There are GAction and GActionGroup interfaces now, which will + be used in GApplication in the near future. + + * GObject + - There are now convenience macros for defining boxed and + pointer types + + * GDBus + - Memory leak fixes + - GDBusProxy for well-known names can now auto-restart + the service if the name owner disapperas + - Filter functions are now allowed to modify messages + + * GLib + - GDateTime is a replacement for GDate that supports time + and timezone information. + + * Bugs fixed: + 50076 Time API to go with date API + 449565 Add G_DEFINE_BOXED_TYPE() + 617691 Add GZIP header processing to GZlibCompressor/GZlibDecompressor + 622184 add g_memory_output_stream_steal_data + 624546 Modification of GDBusMessage in filter function + 627088 Build failure in gdbus-peer.c on FreeBSD + 627181 save a memdup + 627182 Plug a mem leak in the gdbus-connection test + 627187 Plug some gdbus mem leaks + 627188 gdbus-non-socket test occasionally fails + 627252 G_OPTION_FLAG_NO_ARG is only for callback options + 627392 gdbus commit 8a3a4596 breaks win32 compile + 627407 FTBFS on !linux UNIX platforms + 627604 String error: 'that' twice in a row + 627969 ABR in g_file_open_tmp + 628084 gdbus-peer fails with assertion + 628193 Miscellaneous string fixes + 628296 abort() in gsocketconnection.c + 628309 Plug a mem leak in GConverterOutputStream + 628317 GEmblemedIcon:equal implementation is buggy + 628323 Fix invalid reads + 628327 Plug a mem leak + 628328 Plug a mem leak + 628329 Don't leak the FD list + 628324 Invalid reads in gdbus-export test + + * Updated translations: + British English + Danish + Galician + Hebrew + Punjabi + Serbian + Spanish + Traditional Chinese + + +Overview of Changes from GLib 2.25.13 to GLib 2.25.14 +===================================================== + +* GDBus + - Make the closure variants of GDBus apis work + - Make error unregistration work + - Use async IO in the IO thread (626748) + +* GIO + - Make g_simple_async_result_is_valid work without source (626208) + - GSocketClient: add a timeout property + - Fix memory leaks in GSocketClient + - Handle async vs. sync correctly in GSocketConnection stream (616458) + - Declare stream base classes as abstract + - Clarify semantics of g_output_stream_write() (627071) + +* Other + - Improve test coverage for GDBus, GRegex, GAsyncResult + - Drop dead code in pcre, xdgmime + - Fix a race condition in gtester (578295) + - Avoid an extra allocation in GAsyncQueue (626704) + - Add test case for non-socket GIOStream (626841) + - More explicit GVariant docs (622770) + - Imroved docs for GAsyncInitable and GSimpleAsyncResult (602417) + +* Translation updates: + - Galician + - Norwegian bokmål + - Punjabi + - Simplified Chinese + - Swedish + + +Overview of Changes from GLib 2.25.12 to GLib 2.25.13 +===================================================== + ++-------------------------------------------------------------------+ +| WARNING: There have been no breaks in API or ABI. Weird, eh? | ++-------------------------------------------------------------------+ + +The primary purpose of this release is to fix a serious problem with +glib 2.25.12: glibconfig.h (as generated on a Fedora amd64 system) was +being distributed in the tarball. It was being used to build some parts +of glib on other systems (eg: 32bit ones). This was causing some very +serious problems. + +There have been many other improvements, however: + + Build and testing: + - vastly improved test coverage + - old tests moved to the gtester framework + - gtester Makefile modified so that the tests only run once + - cleanup of how we handle includes while building glib + + GVariant: + - add a g_return_if_fail (utf8) to g_variant_new_string() + + GDBus: + - perform extra sanity checks when serialising messages + - add API to query and set the byteorder of a GDBusMessage + - improve debug output, add some extra options + - if exiting due to the bus disconnecting us, print an error message + explaining why + - sort property names correctly + - don't bother sending RemoveMatch when we will close the connection + anyway + - use effective uid/gid for credential passing + + GSettings: + - add G_SETTINGS_BIND_INVERT_BOOLEAN for inverting boolean bindings + without mapping functions + - mark all strings in the schema compiler for translation + + Binding: + - improve closure support for bindings + - copy GSettings INVERT_BOOLEAN flag + + Other: + - fix another complicated GCancellable deadlock possibility + +Bugs closed: + 599590 glib build doesn't look for correct pkg-config + 619026 avoid warning in gutils.h when using gcc with -Wconversion + 624739 Please fix POTFILES.in + 625472 Valgrind claims uninitialized bytes used + 625500 g_date_set_time_val documentation doesn't mention local time + 625628 GDBusProxy: wrong property name sorting + 625753 Incorrect flags used in g_dbus_connection_call_sync() + 625827 Expand documentation about error quark naming + 625988 builddir != srcdir issues + 626107 glibconfig.h is being disted + +Updated translations: + French + Galician + Hebrew + Norwegian bokmål + Spanish + + +Overview of Changes from GLib 2.25.11 to GLib 2.25.12 +===================================================== + ++-------------------------------------------------------------------+ +| WARNING: There have been many API changes in GDBus -- sending | +| messages, subscribing to signals, closing connections and | +| registering subtrees are affected. The ABI for GSettingsBackend | +| has also been changed. For both reasons, a new dconf release is | +| required (and will be along soon). | ++-------------------------------------------------------------------+ + +Build: + - cleanup automake setup + - rename configure.in to configure.ac + - various docs fixups + - move glibconfig.h to glib/ + - disable dtrace support on Mac OS (which has incompatible 'dtrace') + +GSettings: + - add support for vendor override files (to change the default values + in a schema) + - change GSettingsBackend vtable + - add g_settings_reset() + - support binding to G_TYPE_STRV properties + +GDBus: + - many bug fixes, including a serialisation fix + - stop handling incoming connections as soon as stop() is called + - proper support for file descriptor passing + - new flags parameter for sending messages + - new flags parameter for subscribing to signals + - always reset the message serial when sending a message unless + G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL is given + - constness fixes for introspection structures + - clean ups to subtree registration API + +Other: + - fix divide by zero bug in g_malloc_n functions + - GIO: don't blindly assume that SOCK_CLOEXEC is supported + - make GObject property notify freezes threadsafe + - GIO: clean up credentials passing + - GApplication: make default-quit not apply if register=FALSE + - GIO: add annotations for gobject-introspection + +Bugs closed: + 166020 use GAtomic for refcounting + 617483 Credentials passing + 622005 [GApplication] no way to modify the "default-quit" property + 623293 vendor override files + 623810 Message serialization bug + 623815 Don't check sender for GDBusProxy objects where name is not set + 624473 GDBusSubtreeIntrospectFunc return type + 624483 GDBusSubtreeEnumerateFunc clarification + 624484 GDBusSubtreeDispatchFunc clarification + 624754 gdbusaddress.c missing sys/wait.h + 624968 div by zero in g_malloc_n family + 624991 GSettings mapping for G_TYPE_STRV + 625383 Add missing GI annotations + +Updated Translations: + Armenian + Galician + German + Hebrew + Kazakh + Romanian + Simplified Chinese + Spanish + +Overview of Changes from GLib 2.25.10 to GLib 2.25.11 +===================================================== + ++-------------------------------------------------------------------+ +| WARNING: There have been minor API changes in GDBus and GVariant. | +| These API changes will not affect many users, but they do require | +| a new version of GTK+ to be installed. | ++-------------------------------------------------------------------+ + +Build: + - add a --disable-Bsymbolic configure flag to disable linking with + -Bsymbolic-functions + - this release sees the complete removal of the old 'g*alias' hacks + - honour the NOCONFIGURE environment variable from autogen.sh + - use proper feature test macros for isnan + - use pkg-config to check for zlib + - add ACLOCAL_AMFLAGS to Makefile.am + +GDBus: + - hide Class and instance structures for all GDBus types except + GDBusProxy. This breaks API by preventing subclassing, but probably + nobody was doing that. + - add new GDBusConnection call to support flushing all pending + outgoing messages + - change the register_object API to add a reference to the + GDBusInterfaceInfo object so the caller need not keep it alive + themselves + - don't rewrite the serial number when sending messages that already + have a serial number + - better error checking for DBUS_SESSION_BUS_ADDRESS environment + variable + - switch to g_parse_debug_string for G_DBUS_DEBUG and add a lot of new + flags + - add support for temporarily freezing a freshly created + GDBusConnection. Do this until after the ::new-connection signal + has finished running on GDBus services. + - never require non-closed connections (the user is incapable of doing + this due to the obvious race) + - remove weird/misleading redundant check on NameOwnerChanged signal + - emit GDBusProxy::g-properties-changed on NameOwnerChanged + +GVariant: + - the 'g_variant_{new,get}_byte_array' APIs have been removed + - g_variant_{new,get,dup}_bytestring has been added, with different + arguments and different behaviour + - g_variant_{new,get,dup}_bytestring_array has been added, doing + essentially the same thing as the 'strv' functions, but with byte + strings instead of utf8 strings + - G_VARIANT_TYPE_BYTESTRING ('ay'), BYTESTRING_ARRAY ('aay') and + STRING_ARRAY ('as') constants have been added + - the undocumented behaviour that g_variant_get_strv() deserialised + arrays of object paths or signature strings has been dropped + - additional varargs support for converting bytestrings or bytestring + arrays with ^ay ^aay ^&ay and ^a&ay + - improved gobject-introspection annotation + - fix a problem with GBuffer calling g_slice_free for the wrong type + - fix leaks in the type inferencing code of the parser + +GSettings: + - improved documentation + - updated schema XML DTD, now xincluded into the docs + - added support for schemas that extend other schemas (using the + 'extends=' attribute). Values of keys in the base schema can be + overridden using . + - added theoretical support for lists (using the 'list-of=' attribute) + - lots of new tests + - add support for flags (implemented similarly to enums) + - add support for generating .enums.xml files to gsettings.m4: + gsettings_ENUM_NAMESPACE = org.example.myapp + gsettings_ENUM_FILES = ../path/to/*.h + will generate org.example.myapp.enums.xml with mappings for all + enums and flags in the specified .h files. + - warn with g_message() if the 'memory' backend is used by default + (ie: because no other GSettings backends are installed) + - fix get_property() for GSettings::schema + - command line tool: fix a bug that prevented non-basic values from + being set due to a premature free + - command line tool: bash completion support + - chain up in _finalize + - add a new g_settings_get_mapped API to read settings that require + post-processing + - retry with the translated or schema default value if the + GSettingsBindGetMapping function fails + - schema compiler: never fail due to empty schema directories (but + warn) + - peek rather than ref/unref the GEnumClass in the mapping function + - schema compiler: compile *.enums.xml before *.gschemas.xml to ensure + that we have all the enums that the schemas may reference + - schema compiler: improve accuracy of line numbers in error reports + - fix crashes in the keyfile backend caused by invalid group names in + the keyfile + +Other: + - always intern GBinding prop names + - base64: remove asserts preventing conversion of empty strings + - document NULL special-cases for GValueArray + - GNode docs improvements + - improve detection of 'system internal' mounts + - fix leaks in the inotify GFileMonitor implementation + - annotate all custom GIO GSources to improve debugging (e.g. using + SystemTap) + +Tests: + - Turn on glibc malloc checking features for make check + - improvements for GSettings tests, plus new tests + - improved tests for GKeyfile + - new tests for GDir, GSList, GSList, GAppLaunchContext, + CharsetConverter, GIcon, ... + - move some tests to GTester (tree tests, uri tests) + - generally, really an awful lot of new tests + - don't try to allocate 2gigs of memory anymore for the array test + + 552363 g_value_array_{insert,prepend,append}'s special cases for NULL + 561248 Improve return value description from g_node_prev/next_sibling() + 570036 Add ACLOCAL_AMFLAGS to Makefile.am + 576833 g_sprintf add a reference to g_strdup_printf + 576854 g_strconcat() documentation should provide a hint about bad l10n + 582227 reference: add other URI functions to 'URI Functions' section + 599223 should provide g_spawn_* variants that take a GAppLaunchContext + 610784 array test failing + 613057 Leak in inotify GFileMonitor implementation + 620536 Annotate all custom GIO GSource using g_source_set_name + 620913 More control with G_DBUS_DEBUG + 622124 implement flags + 622127 GSettings extended key validation + 622128 retry with default value for failed mapping + 622294 More annotations for GVariant + 622565 glib-compile-schemas fails when no schemas + 622600 Fix missing prototype warning + 622813 gsettings mapping & enum buglet + 623142 Ensure ::new-connection runs before processing D-Bus messages + 623143 Never require non-closed connections + 623319 use g_parse_debug_string for dbus debug flags + 623401 process enums first + 623402 schema compiler reports wrong line numbers + 623407 g_keyfile_settings_backend_new crashes with the key "/" + 623473 zlib should be checked with pkg-config + 623537 GDBusProxy has weird checking on NameOwnerChanged + 623538 GDBusProxy::g-properties-changed emission for corner cases + 623692 directory with file at multiple MLS levels may display empty + 623720 gschema.dtd does not contain enum definitions + 623770 quoting of expand_macro in gdesktopappinfo.c + 623772 gdesktopappinfo.c, function child_setup + 623780 g_unix_is_mount_path_system_internal + 623954 g_settings_finalize + 623955 Dubious return values + +Updated translations: + Galician + Hebrew + Norwegian bokmål + Spanish + +Overview of Changes from GLib 2.25.9 to GLib 2.25.10 +==================================================== + ++----------------------------------------------------------------+ +| WARNING: There have been API changes in GDBus. Users of these | +| APIs will need to be adapted. In particular, a new release of | +| dconf is required to go along with this one. There has also | +| been a change in the GSettings backend API used for keyfiles. | ++----------------------------------------------------------------+ + +* GDBus: + - add direction parameter to filter functions (API change) + - allow calling other interfaces with a GDBusProxy + - padding added to class struct fields (ABI change) + - fixes for closures-based functions + +* GVariant: + - new is_floating() call + - add g_value_take_variant() call (required for marshallers) + +* GSettings: + - support for binding GParamSpecEnum properties + - ifelse-style condition support for GLIB_GSETTINGS m4 macro + - remove gsettings-schema-convert tool (now in GConf) + - allow introspection of all installed schemas + - allow introspection of the keys in a schema + - rewrite keyfile backend (API change) + +* GNIO: + - don't implicitly close GSocket until it is destroyed + - windows fixups + +* Other: + - allow GChecksum to take (NULL, 0) for data/length + - GRelation and GCompletion are now deprecated + - introduce G_PARAM_DEPRECATED and G_ENABLE_DIAGNOSTIC + - add working directory to GApplication platform data + - lots of documentation cleanups + - PCRE updated to 8.02 + +* Build: + - the IA__g_* style symbol aliasing has been disabled and replaced with + the -Bsymbolic-functions linker flag on platforms that support it. + Please be on the watch for portability issues and report them to us. + - many test cases have been moved to the GTester framework + - lcov support has been added for tests + - many windows fixes + +* Bugs fixed: + 501057 lcov coverage suite and GLib integration + 551271 deprecate GRelation + 601686 Implement diagnostic mode + 603309 GSocketOutputStream broken on Windows (?) + 616718 GLIB_GSETTINGS macro can't be used conditionally + 616855 GSocketConnection: don't close the socket if it's still reffed + 618866 g_ptr_array_remove_index_fast memory leak + 619878 keyfile backend calls keys_changed with invalid argument + 619879 keyfile backend doesn't make use of expected_type + 621092 Add with_closures() variants for bindings + 621172 Cross compiling fails + 621838 Actually add cwd to platform data + 621945 Filter outgoing messages in GDBusConnection + 621947 add g_value_take_variant + 622038 GSettings: "It is a programmer error" documentation is unclear + 622154 [patch] update documentation for g_application_new + 622281 binding: Add SYNC_CREATE to the flags + 622480 Improve documentation for g_strcmp0() + 622554 g_error called if schema not installed + 622601 Return interned strings from g_settings_list_keys + +* Translation updates: + - Galician + +Overview of Changes from GLib 2.25.8 to GLib 2.25.9 +=================================================== + ++----------------------------------------------------------------+ +| WARNING: There have been API changes in GDBus, GSettings and | +| GApplication. Users of these APIs will need to be adapted. In | +| particular, a new release of GTK+ is required to go along with | +| this one. | ++----------------------------------------------------------------+ + +* GDBus + - Use Gio's default async implementation + - Fix proxy construction for objects with no properties + - Fix error handling in synchronous initialization + - Do not dispatch calls to unregistered objects + - Add _with_closures alternative functions + - Allow constructing GDBusProxy with well-known names + - Remove GType parameters from GDBusProxy constructors + - Nuke g_bus_watch_proxy API + - Add --xml to gdbus-tool to print raw introspected XML + +* GSettings + - schema file format change: store (default, options) in gvdb + - Add g_settings_sync() + - Add support for enums and ranges + - 'context' support has been replaced by direct use of + GSettingsBackend + +* GApplication + - Switch to using variants for timestamps + - Use GInitable + +* GObject + - Introduce g_object_notify_by_pspec + - Add GBinding + - The GVariant gtype G_TYPE_VARIANT was changed from boxed + to fundamental. We believe there were no existing users + of the boxed type, so this should not cause any applications + to break. + +* Test framework + - Add package and version to the test report XML + - Use optparse to parse gtester-report commandline + - Add subunit support to gtester-report + - Prevent division by zero if no tests + +* Bugs fixed: + 621782 Crash using gbinding + 619945 GConverterOutputStream triggers assertion and corrupts data + 621319 more leaked GVariants in GSettings + 621168 GKeyFile memory leak on Windows platform + 621002 Switch to using variants for timestamps, split out signals + 620953 tiny docs addition + 618904 Lies in gunixmounts documentation + 621702 Correctly initialize GError + 611778 minor cleanup of gtester-report + 621213 GDBusProxy and well-known names + 621034 Rewrite apps test to ensure children are killed + 620954 gapplication gvariant simplifications + 611869 add subunit out feature to gtester-report + 621119 GDBusProxy and objects with no properties + 620990 Use Gio's default async implementation again + 620952 g_application_register_with_data is an ugly API + 621252 GSettings leaks context + 618715 fork() in GSettings test cases is problematic 618715 + 621905 Assume a ref when doing async work + 621266 GSettings "context" clarification + +* Translation updates: + Chinese + + +Overview of Changes from GLib 2.25.7 to GLib 2.25.8 +=================================================== + +* Initial support for dtrace and systemtap profiling: + - mainloop sources can be named + - probes for memory allocation with g_malloc and gslice + - gquark name tracking + - type creation + - object life-cyle (creation, finalization, ref, unref) + - signal creation and emission + +* GVariant + - has been fixed to work with the FreeBSD malloc + - added introspection annotations + - new function: g_variant_builder_add_parsed + +* GSettings: + - g_settings_set/get_strv functions have lost their length parameter + - g_settings_set_strv accepts NULL + - added introspection annotiations + +* GPermission: an abstract interface for representing permissions, + with a minimal implementation named GSimplePermission + +* GApplication: a basic application support class, with a D-Bus based + implementation + +* Bugs fixed: + 619585 glib-compile-schemas asserts on FreeBSD + 620384 Annotate GVariant and GSettings _strv() functions + 606044 Add support for dtrace/systemtap static markers + 620350 add g_variant_builder_add_parsed() API + 620349 utf8ify GVariant printer + 620767 Typo in GSettings documentation: "INTLTOOL_NOMERGE_RULE" + 620312 Fix g_settings_[gs]et_strv() API + 620519 GPermission + 620582 GPermission needs a simple implementation + 620496 GSettings schema compiler should reject invalid paths + 620173 missing single header inclusion guards + 620265 g_assertion_message_error should take const GError * + +* Translation updates: + Esperanto + Galician + Hebrew + Indonesian + Norwegian bokmål + Slovenian + Spanish + + +Overview of Changes from GLib 2.25.6 to GLib 2.25.7 +=================================================== + +* NOTE: API/ABI breaks since 2.25.6 release: + - g_dbus_connection_sync{,_sync} takes a new 'reply_type' argument + - GSettingsBackendClass 'list' virtual function changed + + GSettings backends and things using GDBus may need to be rebuilt. + +* GDBus: many build-related fixes + +* GDBus (service): return a DBus error when receiving a method call for + an unknown interface. + +* GSettings: fix 'make install' bug in gsettings.m4 for generated schema + files + +* GSettings: avoid non-portable use of LC_MESSAGES + +* better approach to handling man pages + + +* Bugs fixed: + 619527 please improve docs on g_file_make_symlink + 619391 send-with-reply should have expected result signature + 618616 Use stack-allocated GVariantBuilders + 617004 Build with "--disable-nls" fails under MinGW/Win32 + 619142 Build fixes (GDBus) + +* Updated translations: + Estonian + Galician + Norwegian bokmål + +Overview of Changes from GLib 2.25.5 to GLib 2.25.6 +=================================================== + +* GDBus: introspection improvements +* GDBus: build fixes + +* GSettings: GSettingsBackend ABI changed **** NOTE **** +* GSettings: --uninstall option for schema compiler +* GSettings: new m4 macro with more power +* GSettings: thread support + +* rework of file notification on Solaris +* fixes for gold linker + +* Bugs fixed: + 619038 increase gsettings.m4 power + 619031 method-calls-in-thread test failing + 618839 Typo at translation message + 616864 GSETTINGS_CHECK_RULE doesn't work with multiple files + 618730 gunixcredentialsmessage.c doesn't compile on GNU/kfreebsd + 616314 Make GSettings (partially) threadsafe + +* Updated Translations: + Indonesian + Galician + Spanish + +Overview of Changes from GLib 2.25.4 to GLib 2.25.5 +=================================================== + +* GDBus: Fix serialization of empty arrays + +* GDBus: Plug various memory leaks + +* GSettings: Fix problems with GSETTINGS_CHECK_RULE + +* Bugs fixed: + 616731 GSETTINGS_CHECK_RULE doesn't work in non-srcdir builds + 616864 GSETTINGS_CHECK_RULE doesn't work with multiple files + 618615 mem leaks in parse_value_from_blob + 618622 Plug some mem leaks in gdbus + 618650 Plug a mem leak in gdbusauth + 618663 Plug mem leaks in gdbus tests & examples + +* Updated translations: + Spanish + + +Overview of Changes from GLib 2.25.3 to GLib 2.25.4 +=================================================== + +* GDBus D-Bus support has been merged. This provides an API + to replace dbus-glib + +* GVariant no requires strings to be UTF-8. You can use byte + arrays for non-UTF-8 strings. + +* GSettings allows to bind string properties to byte arrays + +* The schema compiler supports range restrictions + +* Bugs fixed: + 618051 socket-server|client.c fail to compile under AIX... + 616102 GSettings ignores and + 616720 Chunked quark allocation + 616877 Several issues with g_socket_receive_message + 616892 gio: Add a boxed type for GFileAttributeMatcher + 616967 Add g_regex_get_compile_flags() and g_regex_get_match_flags() + 617767 g_settings_[gs]et_strv() 'length' argument has missing docs... + 617914 gtester-report: cope with binaries with no test cases + 617937 output_stream_close vs output_stream_close_async semantics + 615494 Connction timeouts produce partially invalid error messages + 617823 glib-compile-schemas problems with an out of source build + 617947 glib-mkenums: add @valuenum@ support + +* Translation updates: + Galicaian + Norwegian bokmål + Shavian + Spanish + + +Overview of Changes from GLib 2.25.2 to GLib 2.25.3 +=================================================== + +* New macro: G_GNUC_DEPRECATED_FOR, a variant of G_GNUC_DEPRECATED + that lets you add replacement information (requires gcc 4.5) + +* Rename AM_GSETTINGS autoconf macro to GLIB_GSETTINGS + +* Rename gschema-compile utility to glib-compile-schemas + +* Add support for timeouts in GSocket + +* Bugs fixed: + 589989 Compilation error on Solaris 9 + 616648 Change AM_GSETTINGS macro to GLIB_GSETTINGS + 587898 I/O timeouts for GSocket + 614541 Add G_TYPE_ERROR boxed type for GError + + +Overview of Changes from GLib 2.25.0 to GLib 2.25.2 +=================================================== + +* Include a 'gsettings' utility, for commandline access to GSettings + +* Install a AM_GSETTINGS autoconf macro similar to AM_GCONF + +* GSettings can bind the writability of a key explicitly + +* There is now a predefined boxed type for GError + +* Bugs fixed: + 615379 g_new macros crash if sizeof(struct_type) == 0 + 616312 Add m4 rule equivalent to GCONF_SCHEMAS_INSTALL + 616295 mapping bug for uint64 + 616216 glib compile from remote directory fails + 615960 Fix size passed to connect() for abstract sockets + 616432 Crash in gschema-compile + 616331 gsettings-schema-convert uses imaginary types + 616309 gsettings-schema-convert should output gettext-domain + 616384 Add mention of GConfBridge in conversion docs + 616311 gschema-compile outputs in current directory + 616276 simplify gschema-compile test setup + 616156 keys with unnecessary empty options arrays + 616405 gsettings missing g_return_if_fail's + 616245 Use G_DEFINE_INTERFACE macro + 614541 Add G_TYPE_ERROR boxed type for GError + +* Updated translations: + Catalan (Valencian) + Galician + Kannada + Spanish + + +Overview of Changes from GLib 2.24.0 to GLib 2.25.0 +=================================================== + +* The GSettings framework has been merged. This provides the API to + replace GConf. DConf will provide a backend implementation for it. + GConf will also provide a backend implementation to ease the + transition. We provide utilities to assist with schema conversion + and data migration, as well as a porting guide. + +* Translation updates: + Bengali + Catalan + Danish + Gujarati + Marathi + Thai + Traditional Chinese + + +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. + + 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.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..3537b7f --- /dev/null +++ b/README.in @@ -0,0 +1,323 @@ +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 download locations are: + ftp://ftp.gtk.org/pub/glib + http://download.gnome.org/sources/glib + +The official web site is: + http://www.gtk.org/ + +Information about mailing lists can be found at + http://www.gtk.org/mailing-lists.php + +To subscribe, send mail to gtk-list-request@gnome.org +with the subject "subscribe". + +Installation +============ + +See the file 'INSTALL' + +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 GNU diff.) + +Notes about GLib 2.36 +===================== + +* It is no longer necessary to call g_type_init(). If you are + loading GLib as a dynamic module, you should be careful to avoid + unloading it, then subsequently loading it again. This never + really worked before, but it is now explicitly undefined behavior. + Note that if g_type_init() was the only explicit use of a GObject + API and you are using linker flags such as --no-add-needed, then + you may have to artificially use some GObject call to keep the + linker from optimizing away -lgobject. We recommend to use + g_type_ensure (G_TYPE_OBJECT) for this purpose. + +* This release contains an incompatible change to the g_get_home_dir() + function. Previously, this function would effectively ignore the HOME + environment variable and always return the value from /etc/password. + As of this version, the HOME variable is used if it is set and the + value from /etc/passwd is only used as a fallback. + +* The 'flowinfo' and 'scope_id' fields of GInetSocketAddress + (introduced in GLib 2.32) have been fixed to be in host byte order + rather than network byte order. This is an incompatible change, but + the previous behavior was clearly broken, so it seems unlikely that + anyone was using it. + +Notes about GLib 2.34 +===================== + +* GIO now looks for thumbnails in XDG_CACHE_HOME, following a + recent alignment of the thumbnail spec with the basedir spec. + +* The default values for GThreadPools max_unused_threads and + max_idle_time settings have been changed to 2 and 15*1000, + respectively. + +Notes about GLib 2.32 +===================== + +* It is no longer necessary to use g_thread_init() or to link against + libgthread. libglib is now always thread-enabled. Custom thread + system implementations are no longer supported (including errorcheck + mutexes). + +* The thread and synchronisation APIs have been updated. + GMutex and GCond can be statically allocated without explicit + initialisation, as can new types GRWLock and GRecMutex. The + GStatic_______ variants of these types have been deprecated. GPrivate + can also be statically allocated and has a nicer API (deprecating + GStaticPrivate). Finally, g_thread_create() has been replaced with a + substantially simplified g_thread_new(). + +* The g_once_init_enter()/_leave() functions have been replaced with + macros that allow for a pointer to any gsize-sized object, not just a + gsize*. The assertions to ensure that a pointer to a correctly-sized + object is being used will not work with generic pointers (ie: (void*) + and (gpointer) casts) which would have worked with the old version. + +* It is now mandatory to include glib.h instead of individual headers. + +* The -uninstalled variants of the pkg-config files have been dropped. + +* For a long time, gobject-2.0.pc mistakenly declared a public + dependency on gthread-2.0.pc (when the dependency should have been + private). This means that programs got away with calling + g_thread_init() without explicitly listing gthread-2.0.pc among their + dependencies. + + gthread has now been removed as a gobject dependency, which will cause + such programs to break. + + The fix for this problem is either to declare an explicit dependency + on gthread-2.0.pc (if you care about compatibility with older GLib + versions) or to stop calling g_thread_init(). + +* g_debug() output is no longer enabled by default. It can be enabled + on a per-domain basis with the G_MESSAGES_DEBUG environment variable + like + G_MESSAGES_DEBUG=domain1,domain2 + or + G_MESSAGES_DEBUG=all + +Notes about GLib 2.30 +===================== + +* GObject includes a generic marshaller, g_cclosure_marshal_generic. + To use it, simply specify NULL as the marshaller in g_signal_new(). + The generic marshaller is implemented with libffi, and consequently + GObject depends on libffi now. + +Notes about GLib 2.28 +===================== + +* The GApplication API has changed compared to the version that was + included in the 2.25 development snapshots. Existing users will need + adjustments. + +Notes about GLib 2.26 +===================== + +* Nothing noteworthy. + +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. diff --git a/README.win32 b/README.win32 new file mode 100644 index 0000000..520cbdb --- /dev/null +++ b/README.win32 @@ -0,0 +1,369 @@ +Tor Lillqvist +Hans Breuer + +Note that this document is not really maintained in a serious +fashion. Lots of information here might be misleading or outdated. You +have been warned. + +The general parts, and the section about gcc and autoconfiscated +build, and about a Visual Studio build are by Tor Lillqvist. The +sections about MSVC build with NMAKE 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 has +reportedly been used. + +You can also cross-compile GLib for Windows from Linux using the +cross-compiling mingw packages for your distro. + +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 that uses msvcrt.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 should *not* be +thought to be part of the version number of GLib. 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.ac +and libtool documentation. + +Building with Visual Studio +=========================== + +A more detailed outline of building GLib with its dependencies can +now be found in GNOME Live!: + +https://live.gnome.org/GTK%2B/Win32/MSVCCompilationOfGTKStack + +Please do not build GLib in paths that contain spaces in them, as +this may cause problems during compilation and during usage of the +library. + +In an unpacked tarball, you will find in build\win32\vs9 (VS 2008) and +build\win32\vs10 (VS 2010) a solution file that can be used to build +the GLib DLLs and some auxiliary programs under VS 2008 and VS 2010 +(Express Edition will suffice with the needed dependencies) respectively. +Read the README.txt file in those folders for more +information. Note that you will need a libintl implementation, zlib, and +libFFI. + +If you are building from a GIT checkout, you will first need to use some +Unix-like environment or run build/win32/setup.py, +which will expand the VS 2008/2010 project files, the DLL resouce files and +other miscellanious files required for the build. Run build/win32/setup.py +as follows: + +$python build/win32/setup.py --perl path_to_your_perl.exe + +for more usage on this script, run +$python build/win32/setup.py -h/--help + +Building with MSVC and NMAKE +============================ + +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/autogen.sh b/autogen.sh new file mode 100755 index 0000000..4bbc00d --- /dev/null +++ b/autogen.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +test -n "$srcdir" || srcdir=`dirname "$0"` +test -n "$srcdir" || srcdir=. + +olddir=`pwd` +cd "$srcdir" + +GTKDOCIZE=$(which gtkdocize 2>/dev/null) +if test -z $GTKDOCIZE; then + echo "You don't have gtk-doc installed, and thus won't be able to generate the documentation." + rm -f gtk-doc.make + cat > gtk-doc.make < + + * 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-newvs.am b/build/Makefile-newvs.am new file mode 100644 index 0000000..298887a --- /dev/null +++ b/build/Makefile-newvs.am @@ -0,0 +1,32 @@ +# Centralized autotools file +# Create the Visual Studio 2012 project files +# from the Visual Studio 2010 project files + +# Author: Fan, Chun-wei +# November 05, 2012 + +# MSVC_SLN: name of root project + +VCXPROJ_FILES = + +$(MSVC_SLN).sln: $(top_srcdir)/build/win32/vs10/$(MSVC_SLN).sln create_vcxproj copy_filters + cat $(top_srcdir)/build/win32/vs10/$(MSVC_SLN).sln | sed 's/11\.00/12\.00/g' | sed 's/2010/2012/g' > $(top_builddir)/build/win32/vs11/$(MSVC_SLN).sln + +$(MSVC_SLN).props: $(top_builddir)/build/win32/vs10/$(MSVC_SLN).props + cat $(top_builddir)/build/win32/vs10/$(MSVC_SLN).props | sed 's/10/11/g' > $(top_builddir)/build/win32/vs11/$(MSVC_SLN).props + +README.txt: $(top_srcdir)/build/win32/vs10/README.txt + cat $(top_srcdir)/build/win32/vs10/README.txt | sed 's/vs10/vs11/g' | sed 's/VS10/VS11/g' > $(top_builddir)/build/win32/vs11/README.txt + +create_vcxproj: + for F in `(cd $(top_builddir)/build/win32/vs10 && ls *.vcxproj)`; do \ + case $$F in \ + *) cat $(top_builddir)/build/win32/vs10/$$F | sed 's/v100/v110/g' > $(top_builddir)/build/win32/vs11/$$F \ + ;; \ + esac; \ + done + +copy_filters: + cp $(top_srcdir)/build/win32/vs10/*.vcxproj.filters $(top_builddir)/build/win32/vs11/ + + 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/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..7ee6648 --- /dev/null +++ b/build/win32/Makefile.am @@ -0,0 +1,9 @@ +SUBDIRS = \ + dirent \ + vs9 \ + vs10 \ + vs11 + +EXTRA_DIST = \ + make.msc \ + module.defs 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/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/setup.py b/build/win32/setup.py new file mode 100644 index 0000000..7cdbd67 --- /dev/null +++ b/build/win32/setup.py @@ -0,0 +1,366 @@ +#!/usr/bin/python +# vim: encoding=utf-8 +#expand *.in files +#this script is only intended for building from git, not for building from the released tarball, which already includes all necessary files +import os +import sys +import re +import string +import subprocess +import optparse + +def get_version(srcroot): + ver = {} + RE_VERSION = re.compile(r'^m4_define\(\[(glib_\w+)\],\s*\[(\d+)\]\)') + with open(os.path.join(srcroot, 'configure.ac'), 'r') as ac: + for i in ac: + mo = RE_VERSION.search(i) + if mo: + ver[mo.group(1).upper()] = int(mo.group(2)) + ver['GLIB_BINARY_AGE'] = 100 * ver['GLIB_MINOR_VERSION'] + ver['GLIB_MICRO_VERSION'] + ver['GLIB_VERSION'] = '%d.%d.%d' % (ver['GLIB_MAJOR_VERSION'], + ver['GLIB_MINOR_VERSION'], + ver['GLIB_MICRO_VERSION']) + ver['LT_RELEASE'] = '%d.%d' % (ver['GLIB_MAJOR_VERSION'], ver['GLIB_MINOR_VERSION']) + ver['LT_CURRENT'] = 100 * ver['GLIB_MINOR_VERSION'] + ver['GLIB_MICRO_VERSION'] - ver['GLIB_INTERFACE_AGE'] + ver['LT_REVISION'] = ver['GLIB_INTERFACE_AGE'] + ver['LT_AGE'] = ver['GLIB_BINARY_AGE'] - ver['GLIB_INTERFACE_AGE'] + ver['LT_CURRENT_MINUS_AGE'] = ver['LT_CURRENT'] - ver['LT_AGE'] + return ver + +def process_in(src, dest, vars): + RE_VARS = re.compile(r'@(\w+?)@') + with open(src, 'r') as s: + with open(dest, 'w') as d: + for i in s: + i = RE_VARS.sub(lambda x: str(vars[x.group(1)]), i) + d.write(i) + +def process_include(src, dest, includes): + RE_INCLUDE = re.compile(r'^\s*#include\s+"(.*)"') + with open(src, 'r') as s: + with open(dest, 'w') as d: + for i in s: + mo = RE_INCLUDE.search(i) + if mo: + target = '' + for j in includes: + #print "searching in ", j + if mo.group(1) in os.listdir(j): + target = os.path.join(j, mo.group(1)) + break + if not target: + raise Exception("Couldn't fine include file %s" % mo.group(1)) + else: + with open(target, 'r') as t: + for inc in t.readlines(): + d.write(inc) + else: + d.write(i) + +def generate_libgio_sourcefiles(srcroot, dest, stype): + vars = read_vars_from_AM(os.path.join(srcroot, 'gio', 'Makefile.am'), + vars = {'top_srcdir': srcroot}, + conds = {'OS_WIN32': True}, + filters = ['libgio_2_0_la_SOURCES', 'win32_more_sources_for_vcproj']) + + files = vars['libgio_2_0_la_SOURCES'].split() + \ + vars['win32_more_sources_for_vcproj'].split() + + sources = [i for i in files \ + if i != 'gdesktopappinfo.c' and \ + not (i.startswith('gunix') and i.endswith('.c')) \ + and i.endswith('.c') ] + if stype == '9': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10f': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\tSource Files\n') + else: + raise Exception("Must specify project type (9, 10 or 10f)") + +def generate_libgio_enumtypes(srcroot, perl): + vars = read_vars_from_AM(os.path.join(srcroot, 'gio', 'Makefile.am'), + vars = {'top_srcdir': srcroot}, + conds = {'OS_WIN32': True}, + filters = ['gio_headers']) + cwd = os.getcwd() + os.chdir(os.path.join(srcroot, 'gio')) + for suffix in ['.c', '.h']: + cmd = [perl, os.path.join(srcroot, 'gobject', 'glib-mkenums'), + '--template', 'gioenumtypes' + suffix + '.template'] + vars['gio_headers'].split() + with open('gioenumtypes' + suffix, 'w') as d: + subprocess.Popen(cmd, stdout = d).communicate() + os.chdir(cwd) +def generate_libglib_sourcefiles(srcroot, dest, stype): + vars = read_vars_from_AM(os.path.join(srcroot, 'glib', 'Makefile.am'), + vars = {'top_srcdir': srcroot}, + conds = {'OS_WIN32': True, + 'ENABLE_REGEX': True}, + filters = ['libglib_2_0_la_SOURCES']) + + files = vars['libglib_2_0_la_SOURCES'].split() + + sources = [i for i in files \ + if not (i.endswith('-gcc.c') or i.endswith('-unix.c')) \ + and i.endswith('.c') ] + if stype == '9': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10f': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\tSource Files\n') + else: + raise Exception("Must specify project type (9, 10 or 10f)") + +def generate_libgobject_sourcefiles(srcroot, dest, stype): + vars = read_vars_from_AM(os.path.join(srcroot, 'gobject', 'Makefile.am'), + vars = {'top_srcdir': srcroot}, + conds = {'OS_WIN32': True}, + filters = ['libgobject_2_0_la_SOURCES']) + + files = vars['libgobject_2_0_la_SOURCES'].split() + + sources = [i for i in files if i.endswith('.c') ] + if stype == '9': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\t\n') + elif stype == '10f': + with open(dest, 'w') as d: + for i in sources: + d.write('\t\t\tSource Files\n') + else: + raise Exception("Must specify project type (9, 10 or 10f)") + +def read_vars_from_AM(path, vars = {}, conds = {}, filters = None): + ''' + path: path to the Makefile.am + vars: predefined variables + conds: condition variables for Makefile + filters: if None, all variables defined are returned, + otherwise, it is a list contains that variables should be returned + ''' + cur_vars = vars.copy() + RE_AM_VAR_REF = re.compile(r'\$\((\w+?)\)') + RE_AM_VAR = re.compile(r'^\s*(\w+)\s*=(.*)$') + RE_AM_INCLUDE = re.compile(r'^\s*include\s+(\w+)') + RE_AM_CONTINUING = re.compile(r'\\\s*$') + RE_AM_IF = re.compile(r'^\s*if\s+(\w+)') + RE_AM_ELSE = re.compile(r'^\s*else') + RE_AM_ENDIF = re.compile(r'^\s*endif') + def am_eval(cont): + return RE_AM_VAR_REF.sub(lambda x: cur_vars.get(x.group(1), ''), cont) + with open(path, 'r') as f: + contents = f.readlines() + #combine continuing lines + i = 0 + ncont = [] + while i < len(contents): + line = contents[i] + if RE_AM_CONTINUING.search(line): + line = RE_AM_CONTINUING.sub('', line) + j = i + 1 + while j < len(contents) and RE_AM_CONTINUING.search(contents[j]): + line += RE_AM_CONTINUING.sub('', contents[j]) + j += 1 + else: + if j < len(contents): + line += contents[j] + i = j + else: + i += 1 + ncont.append(line) + + #include, var define, var evaluation + i = -1 + skip = False + oldskip = [] + while i < len(ncont) - 1: + i += 1 + line = ncont[i] + mo = RE_AM_IF.search(line) + if mo: + oldskip.append(skip) + skip = False if mo.group(1) in conds and conds[mo.group(1)] \ + else True + continue + mo = RE_AM_ELSE.search(line) + if mo: + skip = not skip + continue + mo = RE_AM_ENDIF.search(line) + if mo: + skip = oldskip.pop() + continue + if not skip: + mo = RE_AM_INCLUDE.search(line) + if mo: + cur_vars.update(read_vars_from_AM(am_eval(mo.group(1)), cur_vars, conds, None)) + continue + mo = RE_AM_VAR.search(line) + if mo: + cur_vars[mo.group(1)] = am_eval(mo.group(2).strip()) + continue + + #filter: + if filters != None: + ret = {} + for i in filters: + ret[i] = cur_vars.get(i, '') + return ret + else: + return cur_vars + +def main(argv): + parser = optparse.OptionParser() + parser.add_option('-p', '--perl', dest='perl', metavar='PATH', default='C:\\Perl\\bin\\perl.exe', action='store', help='path to the perl interpretor (default: C:\\Perl\\bin\\perl.exe)') + opt, args = parser.parse_args(argv) + def parent_dir(path): + if not os.path.isabs(path): + path = os.path.abspath(path) + if os.path.isfile(path): + path = os.path.dirname(path) + return os.path.split(path)[0] + srcroot = parent_dir(parent_dir(__file__)) + #print 'srcroot', srcroot + ver = get_version(srcroot) + #print 'ver', ver + config_vars = ver.copy() + config_vars['GETTEXT_PACKAGE'] = 'Glib' + process_in(os.path.join(srcroot, 'config.h.win32.in'), + os.path.join(srcroot, 'config.h'), + config_vars) + glibconfig_vars = ver.copy() + glibconfig_vars['GLIB_WIN32_STATIC_COMPILATION_DEFINE'] = '' + process_in(os.path.join(srcroot, 'glib', 'glibconfig.h.win32.in'), + os.path.join(srcroot, 'glib', 'glibconfig.h'), + glibconfig_vars) + + for submodule in ['glib', 'gobject', 'gthread', 'gmodule', 'gio']: + process_in(os.path.join(srcroot, submodule, submodule + '.rc.in'), + os.path.join(srcroot, submodule, submodule + '.rc'), + ver) + + #------------ submodule gobject ------------------- + generate_libglib_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libglib.sourcefiles'), '9') + generate_libglib_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libglib.vs10.sourcefiles'), '10') + generate_libglib_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libglib.vs10.sourcefiles.filters'), '10f') + process_include(os.path.join(srcroot, 'build', 'win32', 'vs9', 'glib.vcprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs9', 'glib.vcproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'glib.vcxprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'glib.vcxproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'glib.vcxproj.filtersin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'glib.vcxproj.filters'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libglib.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libglib.vs10.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libglib.vs10.sourcefiles.filters')) + with open(os.path.join(srcroot, 'glib', 'gspawn-win32-helper-console.c'), 'w') as c: + c.write('#define HELPER_CONSOLE\n') + c.write('#include "gspawn-win32-helper.c"\n') + with open(os.path.join(srcroot, 'glib', 'gspawn-win64-helper-console.c'), 'w') as c: + c.write('#define HELPER_CONSOLE\n') + c.write('#include "gspawn-win32-helper.c"\n') + with open(os.path.join(srcroot, 'glib', 'gspawn-win64-helper.c'), 'w') as c: + c.write('#include "gspawn-win32-helper.c"\n') + #------------ end of submodule glib ------------------- + + #------------ submodule gobject ------------------- + mkenums_vars = ver.copy() + mkenums_vars.update({'PERL_PATH': opt.perl}) + process_in(os.path.join(srcroot, 'gobject', 'glib-mkenums.in'), + os.path.join(srcroot, 'gobject', 'glib-mkenums'), + mkenums_vars) + + #gmarshal.strings + cwd = os.getcwd() + os.chdir(os.path.join(srcroot, 'gobject')) + with open(os.path.join(srcroot, 'gobject', 'gmarshal.strings'), 'w') as d: + with open(os.path.join(srcroot, 'gobject', 'gmarshal.list'), 'r') as s: + for i in s: + if i[0] not in string.ascii_uppercase: #^[A-Z] + continue + line = '"g_cclosure_marshal_' # s/^/"g_cclosure_marshal_/ + for c in i: + if c == ':': + line += '__' # s/:/__ + elif c == ',': + line += '_' # s/,/_ + elif c not in '\r\n': + line += c + d.write(line + '",\n') + #subprocess.Popen([opt.perl, 'marshal-genstrings.pl'], stdout=d).communicate() + os.chdir(cwd) + + generate_libgobject_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgobject.sourcefiles'), '9') + generate_libgobject_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgobject.vs10.sourcefiles'), '10') + generate_libgobject_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgobject.vs10.sourcefiles.filters'), '10f') + process_include(os.path.join(srcroot, 'build', 'win32', 'vs9', 'gobject.vcprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs9', 'gobject.vcproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'gobject.vcxprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'gobject.vcxproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'gobject.vcxproj.filtersin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'gobject.vcxproj.filters'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgobject.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgobject.vs10.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgobject.vs10.sourcefiles.filters')) + #------------ end of submodule gobject ------------------- + + #------------ submodule gio ------------------- + #depends on glib-mkenums + generate_libgio_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgio.sourcefiles'), '9') + generate_libgio_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgio.vs10.sourcefiles'), '10') + generate_libgio_sourcefiles(srcroot, + os.path.join(srcroot, 'build', 'win32', 'libgio.vs10.sourcefiles.filters'), '10f') + process_include(os.path.join(srcroot, 'build', 'win32', 'vs9', 'gio.vcprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs9', 'gio.vcproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'gio.vcxprojin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'gio.vcxproj'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + process_include(os.path.join(srcroot, 'build', 'win32', 'vs10', 'gio.vcxproj.filtersin'), + os.path.join(srcroot, 'build', 'win32', 'vs10', 'gio.vcxproj.filters'), + includes = [os.path.join(srcroot, 'build', 'win32')]) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgio.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgio.vs10.sourcefiles')) + os.unlink(os.path.join(srcroot, 'build', 'win32', 'libgio.vs10.sourcefiles.filters')) + generate_libgio_enumtypes(srcroot, opt.perl) + #------------ end of submodule gio ------------------- + + #------------ submodule gmodule ------------------- + #------------ end of submodule gmodule ------------------- + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/build/win32/vs10/.gitignore b/build/win32/vs10/.gitignore new file mode 100644 index 0000000..f05d126 --- /dev/null +++ b/build/win32/vs10/.gitignore @@ -0,0 +1,6 @@ +gio.vcxproj +gio.vcxproj.filters +glib.vcxproj +glib.vcxproj.filters +gobject.vcxproj +gobject.vcxproj.filters diff --git a/build/win32/vs10/Makefile.am b/build/win32/vs10/Makefile.am new file mode 100644 index 0000000..52f2610 --- /dev/null +++ b/build/win32/vs10/Makefile.am @@ -0,0 +1,37 @@ +EXTRA_DIST = \ + README.txt \ + glib.sln \ + glib.props \ + glib.vcxproj \ + glib.vcxproj.filters \ + glib.vcxprojin \ + glib.vcxproj.filtersin \ + glib-genmarshal.vcxproj \ + glib-genmarshal.vcxproj.filters \ + gspawn-win32-helper-console.vcxproj \ + gspawn-win32-helper-console.vcxproj.filters \ + gspawn-win32-helper.vcxproj \ + gspawn-win32-helper.vcxproj.filters \ + gmodule.vcxproj \ + gmodule.vcxproj.filters \ + gobject.vcxproj \ + gobject.vcxproj.filters \ + gobject.vcxprojin \ + gobject.vcxproj.filtersin \ + gthread.vcxproj \ + gthread.vcxproj.filters \ + gio.vcxproj \ + gio.vcxproj.filters \ + gio.vcxprojin \ + gio.vcxproj.filtersin \ + testglib.vcxproj \ + testglib.vcxproj.filters \ + glib-compile-schemas.vcxproj \ + glib-compile-schemas.vcxproj.filters \ + gsettings.vcxproj \ + gsettings.vcxproj.filters \ + glib-compile-resources.vcxproj \ + glib-compile-resources.vcxproj.filters \ + gresource.vcxproj \ + gresource.vcxproj.filters \ + install.vcxproj diff --git a/build/win32/vs10/README.txt b/build/win32/vs10/README.txt new file mode 100644 index 0000000..b5e092f --- /dev/null +++ b/build/win32/vs10/README.txt @@ -0,0 +1,84 @@ +Please do not compile this package (GLib) in paths that contain +spaces in them-as strange problems may occur during compilation or during +the use of the library. + +Please refer to the following GNOME Live! page for more detailed +instructions on building GLib and its dependencies with Visual C++: + +https://live.gnome.org/GTK%2B/Win32/MSVCCompilationOfGTKStack + +This VS10 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 run build/win32/setup.py, +which will do the work for you: + +$python build/win32/setup.py --perl path_to_your_perl.exe + +for more usage on this script, run +$python build/win32/setup.py -h/--help + +The required dependencies are zlib, proxy-libintl and LibFFI. Fetch the latest +proxy-libintl-dev and zlib-dev zipfiles 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. + +One may wish to build his/her own ZLib-It is recommended that ZLib is +built using the win32/Makefile.msc makefile with VS10 with the ASM routines +to avoid linking problems-see win32/Makefile.msc in ZLib for more details. + +For LibFFI, please get version 3.0.10 or later, as Visual C++ build support +was added in the 3.0.10 release series. Please see the README file that +comes with the LibFFI source package for more details on how to build LibFFI +on Visual C++-please note that the mozilla-build package from Mozilla is needed +in order to build LibFFI on Windows. + +One may optionally use his/her own PCRE installation by selecting the +(BuildType)_ExtPCRE configuration, but please note the PCRE must be built +with VS10 with unicode support using the /MD (release) or /MDd (debug) +runtime option which corresponds to your GLib build flavour (release, debug). +(These are the defaults set by CMAKE, which is used in recent versions of PCRE.) +Not doing so will most probably result in unexpected crashes in +your programs due to the use of different CRTs. If using a static PCRE +build, add PCRE_STATIC to the "preprocessor definitions". +Note that one may still continue to build with the bundled PCRE by selecting +the (BuildType) configuration. + +Set up the source tree as follows under some arbitrary top +folder : + +\ +\vs10\ + +*this* file you are now reading is thus located at +\\build\win32\vs10\README. + + is either Win32 or x64, as in VS10 project files. + +You should unpack the proxy-libintl-dev zip file into +\vs10\, so that for instance libintl.h end up at +\vs10\\include\libintl.h. + +For LibFFI, one should also put the generated ffi.h and ffitarget.h +into \vs10\\include\ and the compiled static libffi.lib +(or copy libffi-convenience.lib into libffi.lib) into +\vs10\\lib\. + +The "install" project will copy build results and headers into their +appropriate location under \vs10\. For instance, +built DLLs go into \vs10\\bin, built LIBs into +\vs10\\lib and GLib headers into +\vs10\\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. + +Note: If you see C4819 warnings and you are compiling GLib on a DBCS +(Chinese/Korean/Japanese) version of Windows, you may need to switch +to an English locale in Control Panel->Region and Languages->System-> +Change System Locale, reboot and rebuild to ensure GLib, Pango, GDK-Pixbuf, +ATK and GTK+ is built correctly. This is due to a bug in Visual C++ running +on DBCS locales. + +--Tor Lillqvist +--Updated by Chun-wei Fan diff --git a/build/win32/vs10/gio.vcxproj.filtersin b/build/win32/vs10/gio.vcxproj.filtersin new file mode 100644 index 0000000..02a7ccf --- /dev/null +++ b/build/win32/vs10/gio.vcxproj.filtersin @@ -0,0 +1,25 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + +#include "libgio.vs10.sourcefiles.filters" + + + + Resource Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gio.vcxprojin b/build/win32/vs10/gio.vcxprojin new file mode 100644 index 0000000..52f6d1a --- /dev/null +++ b/build/win32/vs10/gio.vcxprojin @@ -0,0 +1,199 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F3D1583C-5613-4809-BD98-7CC1C1276F92} + gio + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + ../../../gio;../../../gmodule;%(AdditionalIncludeDirectories) + _DEBUG;G_LOG_DOMAIN="GLib-GIO";GIO_COMPILATION;DLL_EXPORT;GIO_MODULE_DIR="gio/modules";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + zlib1d.lib;ws2_32.lib;shlwapi.lib;dnsapi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + ../../../gio;../../../gmodule;%(AdditionalIncludeDirectories) + G_LOG_DOMAIN="GLib-GIO";GIO_COMPILATION;DLL_EXPORT;GIO_MODULE_DIR="gio/modules";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + zlib1.lib;ws2_32.lib;shlwapi.lib;dnsapi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + ../../../gio;../../../gmodule;%(AdditionalIncludeDirectories) + _DEBUG;G_LOG_DOMAIN="GLib-GIO";GIO_COMPILATION;DLL_EXPORT;GIO_MODULE_DIR="gio/modules";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + zlib1d.lib;ws2_32.lib;shlwapi.lib;dnsapi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + ../../../gio;../../../gmodule;%(AdditionalIncludeDirectories) + G_LOG_DOMAIN="GLib-GIO";GIO_COMPILATION;DLL_EXPORT;GIO_MODULE_DIR="gio/modules";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + zlib1.lib;ws2_32.lib;shlwapi.lib;dnsapi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + +#include "libgio.vs10.sourcefiles" + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {4214047c-f5c1-40b3-8369-5dced8c32770} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-compile-resources.vcxproj b/build/win32/vs10/glib-compile-resources.vcxproj new file mode 100644 index 0000000..8f17071 --- /dev/null +++ b/build/win32/vs10/glib-compile-resources.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A} + glibcompileresources + Win32Proj + + + + Application + Unicode + true + v100 + + + Application + Unicode + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + ..\..\..\gmodule;..\..\..\gio;%(AdditionalIncludeDirectories) + _DEBUG;GIO_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + ..\..\..\gmodule;..\..\..\gio;%(AdditionalIncludeDirectories) + _DEBUG;GIO_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + MaxSpeed + true + ..\..\..\gmodule;..\..\..\gio;%(AdditionalIncludeDirectories) + GIO_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + ..\..\..\gmodule;..\..\..\gio;%(AdditionalIncludeDirectories) + GIO_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + + {f3d1583c-5613-4809-bd98-7cc1c1276f92} + false + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-compile-resources.vcxproj.filters b/build/win32/vs10/glib-compile-resources.vcxproj.filters new file mode 100644 index 0000000..265b612 --- /dev/null +++ b/build/win32/vs10/glib-compile-resources.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-compile-schemas.vcxproj b/build/win32/vs10/glib-compile-schemas.vcxproj new file mode 100644 index 0000000..318de49 --- /dev/null +++ b/build/win32/vs10/glib-compile-schemas.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {015D69D0-8B42-438A-ADAE-052AC036E065} + glibcompileschemas + Win32Proj + + + + Application + Unicode + true + v100 + + + Application + Unicode + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + MaxSpeed + true + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + {f3d1583c-5613-4809-bd98-7cc1c1276f92} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-compile-schemas.vcxproj.filters b/build/win32/vs10/glib-compile-schemas.vcxproj.filters new file mode 100644 index 0000000..2f5dca9 --- /dev/null +++ b/build/win32/vs10/glib-compile-schemas.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-genmarshal.vcxproj b/build/win32/vs10/glib-genmarshal.vcxproj new file mode 100644 index 0000000..1fb0ce9 --- /dev/null +++ b/build/win32/vs10/glib-genmarshal.vcxproj @@ -0,0 +1,173 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BD12E835-5C52-4E5D-8234-1C579F33E27A} + glibgenmarshal + Win32Proj + + + + Application + Unicode + true + v100 + + + Application + MultiByte + v100 + + + Application + Unicode + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + true + Console + false + + + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/glib-genmarshal.vcxproj.filters b/build/win32/vs10/glib-genmarshal.vcxproj.filters new file mode 100644 index 0000000..12b29af --- /dev/null +++ b/build/win32/vs10/glib-genmarshal.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/glib.props b/build/win32/vs10/glib.props new file mode 100644 index 0000000..1b22bef --- /dev/null +++ b/build/win32/vs10/glib.props @@ -0,0 +1,608 @@ + + + + ..\..\..\..\vs10\$(Platform) + $(GlibEtcInstallRoot) + 2.0 + +mkdir $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\*.dll $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\glib-genmarshal.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\gspawn-win*-helper*.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\glib-compile-schemas.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\gsettings.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\glib-compile-resources.exe $(CopyDir)\bin + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\gresource.exe $(CopyDir)\bin + + +mkdir $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\msvc_recommended_pragmas.h $(CopyDir)\include\glib-$(ApiVersion) + +copy ..\..\..\glib\glib.h $(CopyDir)\include\glib-$(ApiVersion) + + +copy ..\..\..\glib\glib-object.h $(CopyDir)\include\glib-$(ApiVersion) + +copy ..\..\..\glib\galloca.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\garray.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gasyncqueue.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gatomic.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gbacktrace.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gbase64.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gbitlock.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gbookmarkfile.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gbytes.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gcharset.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gchecksum.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gconvert.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gdataset.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gdate.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gdatetime.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gdir.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\genviron.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gerror.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gfileutils.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\ggettext.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\ghash.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\ghmac.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\ghook.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\ghostutils.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gi18n-lib.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gi18n.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\giochannel.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gkeyfile.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\glist.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmacros.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmain.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmappedfile.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmarkup.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmem.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gmessages.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gnode.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\goption.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gpattern.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gpoll.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gprimes.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gprintf.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gqsort.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gquark.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gqueue.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\grand.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gregex.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gscanner.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gsequence.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gshell.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gslice.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gslist.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gspawn.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gstdio.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gstringchunk.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gstrfuncs.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gstring.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtestutils.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gthread.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gthreadpool.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtimer.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtimezone.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtrashstack.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtree.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gtypes.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gunicode.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gurifuncs.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gutils.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gvariant.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gvarianttype.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gversion.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gversionmacros.h $(CopyDir)\include\glib-$(ApiVersion)\glib + +copy ..\..\..\glib\gwin32.h $(CopyDir)\include\glib-$(ApiVersion)\glib + + +mkdir $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\gallocator.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\gcache.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\gcompletion.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\gmain.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\grel.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + +copy ..\..\..\glib\deprecated\gthread.h $(CopyDir)\include\glib-$(ApiVersion)\glib\deprecated + + +copy ..\..\..\gmodule\gmodule.h $(CopyDir)\include\glib-$(ApiVersion) + + +mkdir $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gbinding.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gboxed.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gclosure.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\genums.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\glib-types.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gmarshal.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gobject.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gobjectnotifyqueue.c $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gparam.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gparamspecs.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gsignal.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gsourceclosure.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gtype.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gtypemodule.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gtypeplugin.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gvalue.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gvaluearray.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gvaluecollector.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + +copy ..\..\..\gobject\gvaluetypes.h $(CopyDir)\include\glib-$(ApiVersion)\gobject + + +mkdir $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gaction.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gactiongroup.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gactiongroupexporter.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gactionmap.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gappinfo.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gapplication.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gapplicationcommandline.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gasyncinitable.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gasyncresult.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gbufferedinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gbufferedoutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gcancellable.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gcharsetconverter.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gcontenttype.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gconverter.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gconverterinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gconverteroutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gcredentials.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdatainputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdataoutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusactiongroup.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusauthobserver.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusutils.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbuserror.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusinterface.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusinterfaceskeleton.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusmenumodel.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusmessage.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusnameowning.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusnamewatching.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobject.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobjectmanager.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobjectmanagerclient.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobjectmanagerserver.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobjectproxy.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusobjectskeleton.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusproxy.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusintrospection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusmethodinvocation.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdbusserver.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gdrive.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gemblem.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gemblemedicon.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfile.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileattribute.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileenumerator.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileicon.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileinfo.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileiostream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfilemonitor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfilenamecompleter.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfileoutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfilterinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gfilteroutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gicon.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\ginetaddressmask.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\ginetaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\ginetsocketaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\ginitable.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\ginputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gio.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gioenums.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gioenumtypes.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gioerror.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\giomodule.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gioscheduler.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\giostream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\giotypes.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gloadableicon.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmemoryinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmemoryoutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmenuexporter.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmenumodel.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmenu.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmount.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gmountoperation.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gnativevolumemonitor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gnetworkaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gnetworkmonitor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gnetworkservice.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\goutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gpermission.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gpollableinputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gpollableoutputstream.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gpollableutils.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gproxy.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gproxyaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gproxyaddressenumerator.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gproxyresolver.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gremoteactiongroup.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gresolver.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gresource.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gseekable.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsettingsschema.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsettings.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsimpleasyncresult.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsimpleaction.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsimpleactiongroup.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsimplepermission.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocket.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketaddress.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketaddressenumerator.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketclient.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketconnectable.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketcontrolmessage.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketlistener.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsocketservice.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gsrvtarget.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtcpconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtcpwrapperconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtestdbus.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gthemedicon.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gthreadedsocketservice.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsbackend.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlscertificate.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsclientconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsdatabase.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsfiledatabase.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsinteraction.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlspassword.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gtlsserverconnection.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gvfs.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gvolume.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gvolumemonitor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gzlibcompressor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + +copy ..\..\..\gio\gzlibdecompressor.h $(CopyDir)\include\glib-$(ApiVersion)\gio + + +mkdir $(CopyDir)\include\gio-win32-$(ApiVersion)\gio + +copy ..\..\..\gio\gwin32inputstream.h $(CopyDir)\include\gio-win32-$(ApiVersion)\gio + +copy ..\..\..\gio\gwin32outputstream.h $(CopyDir)\include\gio-win32-$(ApiVersion)\gio + + +mkdir $(CopyDir)\lib\glib-$(ApiVersion)\include + +copy ..\..\..\glib\glibconfig.h $(CopyDir)\lib\glib-$(ApiVersion)\include + + +copy $(SolutionDir)$(Configuration)\$(Platform)\bin\*-$(ApiVersion).lib $(CopyDir)\lib + + +mkdir $(CopyDir)\share\glib-$(ApiVersion)\schemas + +copy ..\..\..\gio\gschema.dtd $(CopyDir)\share\glib-$(ApiVersion)\schemas + + + lib + -$(ApiVersion)-0 + + -2-vs10 + $(GlibSeparateVS10DllPrefix) + $(GlibSeparateVS10DllSuffix) + + + <_PropertySheetDisplayName>glibprops + $(SolutionDir)$(Configuration)\$(PlatformName)\bin\ + $(SolutionDir)$(Configuration)\$(PlatformName)\obj\$(ProjectName)\ + + + + ..\..\..;..\..\..\glib;$(GlibEtcInstallRoot)\include;%(AdditionalIncludeDirectories) + HAVE_CONFIG_H;%(PreprocessorDefinitions) + msvc_recommended_pragmas.h;%(ForcedIncludeFiles) + + + intl.lib;%(AdditionalDependencies) + $(GlibEtcInstallRoot)\lib;%(AdditionalLibraryDirectories) + + + +if exist ..\..\..\config.h goto DONE_CONFIG_H + +copy ..\..\..\config.h.win32 ..\..\..\config.h + +:DONE_CONFIG_H + + +if exist ..\..\..\glib\glibconfig.h goto DONE_GLIBCONFIG_H + +copy ..\..\..\glib\glibconfig.h.win32 ..\..\..\glib\glibconfig.h + +:DONE_GLIBCONFIG_H + + +if exist ..\..\..\gmodule\gmoduleconf.h goto DONE_GMODULECONF_H + +copy ..\..\..\gmodule\gmoduleconf.h.win32 ..\..\..\gmodule\gmoduleconf.h + +:DONE_GMODULECONF_H + +if exist ..\..\..\gio\gnetworking.h goto DONE_GNETWORKING_H + +copy ..\..\..\gio\gnetworking.h.win32 ..\..\..\gio\gnetworking.h + +:DONE_GNETWORKING_H + + + + + + + $(GlibEtcInstallRoot) + + + $(CopyDir) + + + $(ApiVersion) + + + $(GlibDoInstall) + + + $(GlibLibtoolCompatibleDllPrefix) + + + $(GlibLibtoolCompatibleDllSuffix) + + + $(GlibSeparateVS10DllPrefix) + + + $(GlibSeparateVS10DllSuffix) + + + $(GlibDllPrefix) + + + $(GlibDllSuffix) + + + \ No newline at end of file diff --git a/build/win32/vs10/glib.sln b/build/win32/vs10/glib.sln new file mode 100644 index 0000000..fbba63e --- /dev/null +++ b/build/win32/vs10/glib.sln @@ -0,0 +1,271 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib", "glib.vcxproj", "{12BCA020-EABF-429E-876A-A476BC9C10C0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmodule", "gmodule.vcxproj", "{4214047C-F5C1-40B3-8369-5DCED8C32770}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gobject", "gobject.vcxproj", "{F172EFFC-E30F-4593-809E-DB2024B1E753}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gthread", "gthread.vcxproj", "{C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib-genmarshal", "glib-genmarshal.vcxproj", "{BD12E835-5C52-4E5D-8234-1C579F33E27A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gio", "gio.vcxproj", "{F3D1583C-5613-4809-BD98-7CC1C1276F92}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gspawn-win32-helper", "gspawn-win32-helper.vcxproj", "{289240E7-E167-47CE-A20C-58D852E520BA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gspawn-win32-helper-console", "gspawn-win32-helper-console.vcxproj", "{E40E8A7E-7CAE-4659-9B8B-BC38898E3074}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testglib", "testglib.vcxproj", "{64E09909-5599-40C0-B808-27F55F7B823C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib-compile-schemas", "glib-compile-schemas.vcxproj", "{015D69D0-8B42-438A-ADAE-052AC036E065}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsettings", "gsettings.vcxproj", "{05041C63-F1C5-49BA-A7DE-61EBB5307EAA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "install", "install.vcxproj", "{2093D218-190E-4194-9421-3BA7CBF33B10}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gresource", "gresource.vcxproj", "{95A1571F-61BE-4C51-BE53-2F2DAB280685}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib-compile-resources", "glib-compile-resources.vcxproj", "{B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_ExtPCRE|Win32 = Debug_ExtPCRE|Win32 + Debug_ExtPCRE|x64 = Debug_ExtPCRE|x64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release_ExtPCRE|Win32 = Release_ExtPCRE|Win32 + Release_ExtPCRE|x64 = Release_ExtPCRE|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|Win32.ActiveCfg = Debug_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|Win32.Build.0 = Debug_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|x64.ActiveCfg = Debug_ExtPCRE|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|x64.Build.0 = Debug_ExtPCRE|x64 + {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_ExtPCRE|Win32.ActiveCfg = Release_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|Win32.Build.0 = Release_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|x64.ActiveCfg = Release_ExtPCRE|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|x64.Build.0 = Release_ExtPCRE|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|x64.Build.0 = Release|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_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|x64.Build.0 = Release|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 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|Win32.ActiveCfg = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|Win32.Build.0 = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|x64.ActiveCfg = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|x64.Build.0 = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|Win32.ActiveCfg = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|Win32.Build.0 = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|x64.ActiveCfg = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|x64.Build.0 = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|Win32.ActiveCfg = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|Win32.Build.0 = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|x64.ActiveCfg = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|x64.Build.0 = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|Win32.ActiveCfg = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|Win32.Build.0 = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|x64.ActiveCfg = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|x64.Build.0 = Release|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|x64.Build.0 = Debug|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_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|x64.Build.0 = Release|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 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|Win32.ActiveCfg = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|Win32.Build.0 = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|x64.ActiveCfg = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|x64.Build.0 = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|Win32.ActiveCfg = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|Win32.Build.0 = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|x64.ActiveCfg = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|x64.Build.0 = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|Win32.Build.0 = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|x64.ActiveCfg = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|x64.Build.0 = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|Win32.ActiveCfg = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|Win32.Build.0 = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|x64.ActiveCfg = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs10/glib.vcxproj.filtersin b/build/win32/vs10/glib.vcxproj.filtersin new file mode 100644 index 0000000..8262d2f --- /dev/null +++ b/build/win32/vs10/glib.vcxproj.filtersin @@ -0,0 +1,115 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {bb961775-fd45-4205-b1fd-901c3c8fd64c} + + + {f630c518-4c58-4dfa-ab43-5fa0b0eb10f1} + + + {9fef0e23-cf71-48aa-979b-7eb84df56143} + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + +#include "libglib.vs10.sourcefiles.filters" + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\libcharset + + + Source Files\gnulib + + + Source Files\gnulib + + + Source Files\gnulib + + + Source Files\gnulib + + + Source Files\gnulib + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + Source Files\pcre + + + + + Resource Files + + + \ No newline at end of file diff --git a/build/win32/vs10/glib.vcxprojin b/build/win32/vs10/glib.vcxprojin new file mode 100644 index 0000000..ebb4a9a --- /dev/null +++ b/build/win32/vs10/glib.vcxprojin @@ -0,0 +1,531 @@ + + + + + Debug_ExtPCRE + Win32 + + + Debug_ExtPCRE + x64 + + + Debug + Win32 + + + Debug + x64 + + + Release_ExtPCRE + Win32 + + + Release_ExtPCRE + x64 + + + Release + Win32 + + + Release + x64 + + + + {12BCA020-EABF-429E-876A-A476BC9C10C0} + glib + Win32Proj + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + Debug\$(Platform)\bin\ + true + true + Debug\$(Platform)\bin\ + false + false + Release\$(Platform)\bin\ + false + false + Release\$(Platform)\bin\ + + + + Disabled + _DEBUG;GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";G_ENABLE_DEBUG;PCRE_STATIC;LINK_SIZE=2;MAX_NAME_SIZE=32;MAX_NAME_COUNT=10000;NEWLINE=-1;POSIX_MALLOC_THRESHOLD=10;MATCH_LIMIT=10000000;MATCH_LIMIT_RECURSION=10000000;SUPPORT_UCP;SUPPORT_UTF;SUPPORT_UTF8;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + _DEBUG;GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";G_ENABLE_DEBUG;USE_SYSTEM_PCRE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + ws2_32.lib;winmm.lib;pcred.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + _DEBUG;GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";G_ENABLE_DEBUG;PCRE_STATIC;LINK_SIZE=2;MAX_NAME_SIZE=32;MAX_NAME_COUNT=10000;NEWLINE=-1;POSIX_MALLOC_THRESHOLD=10;MATCH_LIMIT=10000000;MATCH_LIMIT_RECURSION=10000000;SUPPORT_UCP;SUPPORT_UTF;SUPPORT_UTF8;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + Disabled + _DEBUG;GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";G_ENABLE_DEBUG;USE_SYSTEM_PCRE;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;pcred.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";PCRE_STATIC;LINK_SIZE=2;MAX_NAME_SIZE=32;MAX_NAME_COUNT=10000;NEWLINE=-1;POSIX_MALLOC_THRESHOLD=10;MATCH_LIMIT=10000000;MATCH_LIMIT_RECURSION=10000000;SUPPORT_UCP;SUPPORT_UTF;SUPPORT_UTF8;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";USE_SYSTEM_PCRE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;pcre.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";PCRE_STATIC;LINK_SIZE=2;MAX_NAME_SIZE=32;MAX_NAME_COUNT=10000;NEWLINE=-1;POSIX_MALLOC_THRESHOLD=10;MATCH_LIMIT=10000000;MATCH_LIMIT_RECURSION=10000000;SUPPORT_UCP;SUPPORT_UTF;SUPPORT_UTF8;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + GLIB_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib";USE_SYSTEM_PCRE;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + ws2_32.lib;winmm.lib;pcre.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + +#include "libglib.vs10.sourcefiles" + + + + + + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + LIBDIR=/irrelevant/lib;%(PreprocessorDefinitions) + + + + + + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + -DG_LOG_DOMAIN=\"GLib-GRegex\" -UBSR_ANYCRLF -UEBCDIC %(AdditionalOptions) + true + + + + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gmodule.vcxproj b/build/win32/vs10/gmodule.vcxproj new file mode 100644 index 0000000..dd9e602 --- /dev/null +++ b/build/win32/vs10/gmodule.vcxproj @@ -0,0 +1,184 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4214047C-F5C1-40B3-8369-5DCED8C32770} + gmodule + Win32Proj + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;G_LOG_DOMAIN="GModule";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + G_LOG_DOMAIN="GModule";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + _DEBUG;G_LOG_DOMAIN="GModule";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + G_LOG_DOMAIN="GModule";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gmodule.vcxproj.filters b/build/win32/vs10/gmodule.vcxproj.filters new file mode 100644 index 0000000..ceab446 --- /dev/null +++ b/build/win32/vs10/gmodule.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gobject.vcxproj.filtersin b/build/win32/vs10/gobject.vcxproj.filtersin new file mode 100644 index 0000000..17db3ef --- /dev/null +++ b/build/win32/vs10/gobject.vcxproj.filtersin @@ -0,0 +1,25 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + +#include "libgobject.vs10.sourcefiles.filters" + + + + Resource Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gobject.vcxprojin b/build/win32/vs10/gobject.vcxprojin new file mode 100644 index 0000000..171b3b7 --- /dev/null +++ b/build/win32/vs10/gobject.vcxprojin @@ -0,0 +1,194 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F172EFFC-E30F-4593-809E-DB2024B1E753} + gobject + Win32Proj + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;GOBJECT_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib-GObject";FFI_BUILDING;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + libffi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + false + GOBJECT_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib-GObject";FFI_BUILDING;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libffi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + + + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + _DEBUG;GOBJECT_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib-GObject";FFI_BUILDING;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + + + libffi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + false + GOBJECT_COMPILATION;DLL_EXPORT;G_LOG_DOMAIN="Glib-GObject";FFI_BUILDING;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + libffi.lib;%(AdditionalDependencies) + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + + + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + +#include "libgobject.vs10.sourcefiles" + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {c8afb8c3-fffd-460f-bc13-9ac25d7b117c} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gresource.vcxproj b/build/win32/vs10/gresource.vcxproj new file mode 100644 index 0000000..364548c --- /dev/null +++ b/build/win32/vs10/gresource.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {95A1571F-61BE-4C51-BE53-2F2DAB280685} + gresource + Win32Proj + + + + Application + Unicode + true + v100 + + + Application + Unicode + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + MaxSpeed + true + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + true + Console + true + true + MachineX86 + + + + + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + {f3d1583c-5613-4809-bd98-7cc1c1276f92} + false + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gresource.vcxproj.filters b/build/win32/vs10/gresource.vcxproj.filters new file mode 100644 index 0000000..b121704 --- /dev/null +++ b/build/win32/vs10/gresource.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gsettings.vcxproj b/build/win32/vs10/gsettings.vcxproj new file mode 100644 index 0000000..0c9c94f --- /dev/null +++ b/build/win32/vs10/gsettings.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA} + gsettings + Win32Proj + + + + Application + Unicode + true + v100 + + + Application + Unicode + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + true + Console + MachineX86 + + + + + Disabled + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + MaxSpeed + true + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + true + + + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + true + Console + true + true + MachineX86 + + + + + ..\..\..\gmodule;%(AdditionalIncludeDirectories) + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + {f3d1583c-5613-4809-bd98-7cc1c1276f92} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gsettings.vcxproj.filters b/build/win32/vs10/gsettings.vcxproj.filters new file mode 100644 index 0000000..0c81fc6 --- /dev/null +++ b/build/win32/vs10/gsettings.vcxproj.filters @@ -0,0 +1,14 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gspawn-win32-helper-console.vcxproj b/build/win32/vs10/gspawn-win32-helper-console.vcxproj new file mode 100644 index 0000000..7d4daaf --- /dev/null +++ b/build/win32/vs10/gspawn-win32-helper-console.vcxproj @@ -0,0 +1,175 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074} + gspawnwin32helperconsole + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;GLIB_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + true + Console + false + + + MachineX86 + + + + + GLIB_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX86 + + + + + Disabled + _DEBUG;GLIB_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)gspawn-win64-helper-console.exe + true + Console + false + + + MachineX64 + + + + + GLIB_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)gspawn-win64-helper-console.exe + true + Console + true + true + false + + + MachineX64 + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gspawn-win32-helper-console.vcxproj.filters b/build/win32/vs10/gspawn-win32-helper-console.vcxproj.filters new file mode 100644 index 0000000..5b9e6ef --- /dev/null +++ b/build/win32/vs10/gspawn-win32-helper-console.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gspawn-win32-helper.vcxproj b/build/win32/vs10/gspawn-win32-helper.vcxproj new file mode 100644 index 0000000..84aede6 --- /dev/null +++ b/build/win32/vs10/gspawn-win32-helper.vcxproj @@ -0,0 +1,175 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {289240E7-E167-47CE-A20C-58D852E520BA} + gspawnwin32helper + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + true + false + false + + + + Disabled + _DEBUG;GLIB_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + true + Windows + false + + + MachineX86 + + + + + Disabled + _DEBUG;GLIB_COMPILATION;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)gspawn-win64-helper.exe + true + Windows + false + + + MachineX64 + + + + + GLIB_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Windows + true + true + false + + + MachineX86 + + + + + GLIB_COMPILATION;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)gspawn-win64-helper.exe + true + Windows + true + true + false + + + MachineX64 + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gspawn-win32-helper.vcxproj.filters b/build/win32/vs10/gspawn-win32-helper.vcxproj.filters new file mode 100644 index 0000000..0a83fa2 --- /dev/null +++ b/build/win32/vs10/gspawn-win32-helper.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs10/gthread.vcxproj b/build/win32/vs10/gthread.vcxproj new file mode 100644 index 0000000..e28e9db --- /dev/null +++ b/build/win32/vs10/gthread.vcxproj @@ -0,0 +1,184 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C} + gthread + Win32Proj + + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + DynamicLibrary + MultiByte + true + v100 + + + DynamicLibrary + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;G_LOG_DOMAIN="GThread";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + G_LOG_DOMAIN="GThread";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX86 + + + + + Disabled + _DEBUG;G_LOG_DOMAIN="GThread";%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + G_LOG_DOMAIN="GThread";%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + $(OutDir)$(GlibDllPrefix)$(ProjectName)$(GlibDllSuffix).dll + true + Windows + true + true + false + + + $(TargetDir)$(ProjectName)-2.0.lib + MachineX64 + + + + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/gthread.vcxproj.filters b/build/win32/vs10/gthread.vcxproj.filters new file mode 100644 index 0000000..fb35c1f --- /dev/null +++ b/build/win32/vs10/gthread.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/build/win32/vs10/install.vcxproj b/build/win32/vs10/install.vcxproj new file mode 100644 index 0000000..4cb3ef0 --- /dev/null +++ b/build/win32/vs10/install.vcxproj @@ -0,0 +1,153 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {2093D218-190E-4194-9421-3BA7CBF33B10} + install + Win32Proj + + + + Utility + MultiByte + true + v100 + + + Utility + MultiByte + v100 + + + Utility + MultiByte + true + v100 + + + Utility + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(GlibEtcInstallRoot)\ + + $(GlibEtcInstallRoot)\ + + $(GlibEtcInstallRoot)\ + + $(GlibEtcInstallRoot)\ + + + + + $(GlibDoInstall) + + + + + $(GlibDoInstall) + + + + + $(GlibDoInstall) + + + + + $(GlibDoInstall) + + + + + {f3d1583c-5613-4809-bd98-7cc1c1276f92} + false + + + {bd12e835-5c52-4e5d-8234-1c579f33e27a} + false + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + {4214047c-f5c1-40b3-8369-5dced8c32770} + false + + + {f172effc-e30f-4593-809e-db2024b1e753} + false + + + {e40e8a7e-7cae-4659-9b8b-bc38898e3074} + false + + + {289240e7-e167-47ce-a20c-58d852e520ba} + false + + + {c8afb8c3-fffd-460f-bc13-9ac25d7b117c} + false + + + {015d69d0-8b42-438a-adae-052ac036e065} + false + + + {05041c63-f1c5-49ba-a7de-61ebb5307eaa} + false + + + {b0cdec7f-dce1-4f7e-b8a4-a3009c18fb2a} + false + + + {95a1571f-61be-4c51-be53-2f2dab280685} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/testglib.vcxproj b/build/win32/vs10/testglib.vcxproj new file mode 100644 index 0000000..33ef16d --- /dev/null +++ b/build/win32/vs10/testglib.vcxproj @@ -0,0 +1,173 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {64E09909-5599-40C0-B808-27F55F7B823C} + testglib + Win32Proj + + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + Application + MultiByte + true + v100 + + + Application + MultiByte + v100 + + + + + + + + + + + + + + + + + + + + + + + true + false + true + false + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + CompileAsC + + + true + Console + false + + + MachineX86 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX86 + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + false + + + MachineX64 + + + + + %(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + CompileAsC + + + true + Console + true + true + false + + + MachineX64 + + + + + + + + {12bca020-eabf-429e-876a-a476bc9c10c0} + false + + + + + + \ No newline at end of file diff --git a/build/win32/vs10/testglib.vcxproj.filters b/build/win32/vs10/testglib.vcxproj.filters new file mode 100644 index 0000000..d871809 --- /dev/null +++ b/build/win32/vs10/testglib.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + \ No newline at end of file diff --git a/build/win32/vs11/.gitignore b/build/win32/vs11/.gitignore new file mode 100644 index 0000000..846cbaa --- /dev/null +++ b/build/win32/vs11/.gitignore @@ -0,0 +1,30 @@ +gio.vcxproj +gio.vcxproj.filters +glib-compile-resources.vcxproj +glib-compile-resources.vcxproj.filters +glib-compile-schemas.vcxproj +glib-compile-schemas.vcxproj.filters +glib-genmarshal.vcxproj +glib-genmarshal.vcxproj.filters +glib.vcxproj +glib.vcxproj.filters +gmodule.vcxproj +gmodule.vcxproj.filters +gobject.vcxproj +gobject.vcxproj.filters +gresource.vcxproj +gresource.vcxproj.filters +gsettings.vcxproj +gsettings.vcxproj.filters +gspawn-win32-helper-console.vcxproj +gspawn-win32-helper-console.vcxproj.filters +gspawn-win32-helper.vcxproj +gspawn-win32-helper.vcxproj.filters +gthread.vcxproj +gthread.vcxproj.filters +testglib.vcxproj +testglib.vcxproj.filters +install.vcxproj +glib.props +glib.sln +README.txt diff --git a/build/win32/vs11/Makefile.am b/build/win32/vs11/Makefile.am new file mode 100644 index 0000000..54594a0 --- /dev/null +++ b/build/win32/vs11/Makefile.am @@ -0,0 +1,37 @@ +EXTRA_DIST = \ + README.txt \ + glib.sln \ + glib.props \ + glib.vcxproj \ + glib.vcxproj.filters \ + glib-genmarshal.vcxproj \ + glib-genmarshal.vcxproj.filters \ + gspawn-win32-helper-console.vcxproj \ + gspawn-win32-helper-console.vcxproj.filters \ + gspawn-win32-helper.vcxproj \ + gspawn-win32-helper.vcxproj.filters \ + gmodule.vcxproj \ + gmodule.vcxproj.filters \ + gobject.vcxproj \ + gobject.vcxproj.filters \ + gthread.vcxproj \ + gthread.vcxproj.filters \ + gio.vcxproj \ + gio.vcxproj.filters \ + testglib.vcxproj \ + testglib.vcxproj.filters \ + glib-compile-schemas.vcxproj \ + glib-compile-schemas.vcxproj.filters \ + gsettings.vcxproj \ + gsettings.vcxproj.filters \ + glib-compile-resources.vcxproj \ + glib-compile-resources.vcxproj.filters \ + gresource.vcxproj \ + gresource.vcxproj.filters \ + install.vcxproj + +DISTCLEANFILES = $(EXTRA_DIST) + +MSVC_SLN = glib + +include $(top_srcdir)/build/Makefile-newvs.am diff --git a/build/win32/vs8/Makefile.am b/build/win32/vs8/Makefile.am new file mode 100644 index 0000000..69cd83f --- /dev/null +++ b/build/win32/vs8/Makefile.am @@ -0,0 +1,11 @@ +EXTRA_DIST = \ + README \ + gio.vcproj \ + glib-genmarshal.vcproj \ + glib.sln \ + glib.vcproj \ + gmodule.vcproj \ + gobject.vcproj \ + gspawn-win32-helper-console.vcproj \ + gspawn-win32-helper.vcproj \ + gthread.vcproj diff --git a/build/win32/vs8/README b/build/win32/vs8/README new file mode 100644 index 0000000..4576aae --- /dev/null +++ b/build/win32/vs8/README @@ -0,0 +1,4 @@ +Note that this is mostly experimental and not really maintained. It +seems that the OAH project at https://code.launchpad.net/oah might be +a better choice if you want to start building GLib (and more of the +GTK+ stack) with Visual Studio. diff --git a/build/win32/vs8/gio.vcproj b/build/win32/vs8/gio.vcproj new file mode 100644 index 0000000..13902ac --- /dev/null +++ b/build/win32/vs8/gio.vcproj @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/glib-genmarshal.vcproj b/build/win32/vs8/glib-genmarshal.vcproj new file mode 100644 index 0000000..06cb398 --- /dev/null +++ b/build/win32/vs8/glib-genmarshal.vcproj @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/glib.sln b/build/win32/vs8/glib.sln new file mode 100644 index 0000000..544560e --- /dev/null +++ b/build/win32/vs8/glib.sln @@ -0,0 +1,84 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +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} + 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} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + {4214047C-F5C1-40B3-8369-5DCED8C32770} = {4214047C-F5C1-40B3-8369-5DCED8C32770} + 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 +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + 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}.Release|Win32.ActiveCfg = Release|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release|Win32.Build.0 = Release|Win32 + {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}.Release|Win32.ActiveCfg = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs8/glib.vcproj b/build/win32/vs8/glib.vcproj new file mode 100644 index 0000000..00d6eff --- /dev/null +++ b/build/win32/vs8/glib.vcproj @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/gmodule.vcproj b/build/win32/vs8/gmodule.vcproj new file mode 100644 index 0000000..b6e0e8c --- /dev/null +++ b/build/win32/vs8/gmodule.vcproj @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/gobject.vcproj b/build/win32/vs8/gobject.vcproj new file mode 100644 index 0000000..21c6079 --- /dev/null +++ b/build/win32/vs8/gobject.vcproj @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/gspawn-win32-helper-console.vcproj b/build/win32/vs8/gspawn-win32-helper-console.vcproj new file mode 100644 index 0000000..5bf95af --- /dev/null +++ b/build/win32/vs8/gspawn-win32-helper-console.vcproj @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/gspawn-win32-helper.vcproj b/build/win32/vs8/gspawn-win32-helper.vcproj new file mode 100644 index 0000000..6e34dbc --- /dev/null +++ b/build/win32/vs8/gspawn-win32-helper.vcproj @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs8/gthread.vcproj b/build/win32/vs8/gthread.vcproj new file mode 100644 index 0000000..db73a4f --- /dev/null +++ b/build/win32/vs8/gthread.vcproj @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/.gitignore b/build/win32/vs9/.gitignore new file mode 100644 index 0000000..3c5cef6 --- /dev/null +++ b/build/win32/vs9/.gitignore @@ -0,0 +1,3 @@ +glib.vcproj +gobject.vcproj +gio.vcproj diff --git a/build/win32/vs9/Makefile.am b/build/win32/vs9/Makefile.am new file mode 100644 index 0000000..57230fd --- /dev/null +++ b/build/win32/vs9/Makefile.am @@ -0,0 +1,21 @@ +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 \ + glib-compile-schemas.vcproj \ + gsettings.vcproj \ + glib-compile-resources.vcproj \ + gresource.vcproj \ + install.vcproj diff --git a/build/win32/vs9/README.txt b/build/win32/vs9/README.txt new file mode 100644 index 0000000..59e77b2 --- /dev/null +++ b/build/win32/vs9/README.txt @@ -0,0 +1,84 @@ +Please do not compile this package (GLib) in paths that contain +spaces in them-as strange problems may occur during compilation or during +the use of the library. + +Please refer to the following GNOME Live! page for more detailed +instructions on building GLib and its dependencies with Visual C++: + +https://live.gnome.org/GTK%2B/Win32/MSVCCompilationOfGTKStack + +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 run build/win32/setup.py, +which will do the work for you: + +$python build/win32/setup.py --perl path_to_your_perl.exe + +for more usage on this script, run +$python build/win32/setup.py -h/--help + +The required dependencies are zlib and proxy-libintl. Fetch the latest +proxy-libintl-dev and zlib-dev zipfiles 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. + +One may wish to build his/her own ZLib-It is recommended that ZLib is +built using the win32/Makefile.msc makefile with VS9 with the ASM routines +to avoid linking problems-see win32/Makefile.msc in ZLib for more details. + +For LibFFI, please get version 3.0.10 or later, as Visual C++ build support +was added in the 3.0.10 release series. Please see the README file that +comes with the LibFFI source package for more details on how to build LibFFI +on Visual C++-please note that the mozilla-build package from Mozilla is needed +in order to build LibFFI on Windows. + +One may optionally use his/her own PCRE installation by selecting the +(BuildType)_ExtPCRE configuration, but please note the PCRE must be built +with VS9 with unicode support using the /MD (release) or /MDd (debug) +runtime option which corresponds to your GLib build flavour (release, debug). +(These are the defaults set by CMAKE, which is used in recent versions of PCRE.) +Not doing so will most probably result in unexpected crashes in +your programs due to the use of different CRTs. If using a static PCRE +build, add PCRE_STATIC to the "preprocessor definitions". +Note that one may still continue to build with the bundled PCRE by selecting +the (BuildType) configuration. + +Set up the source tree as follows under some arbitrary top +folder : + +\ +\vs9\ + +*this* file you are now reading is thus located at +\\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. + +For LibFFI, one should also put the generated ffi.h and ffitarget.h +into \vs9\\include\ and the compiled static libffi.lib +(or copy libffi-convenience.lib into libffi.lib) into +\vs9\\lib\. + +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. + +Note: If you see C4819 warnings and you are compiling GLib on a DBCS +(Chinese/Korean/Japanese) version of Windows, you may need to switch +to an English locale in Control Panel->Region and Languages->System-> +Change System Locale, reboot and rebuild to ensure GLib, Pango, GDK-Pixbuf, +ATK and GTK+ is built correctly. This is due to a bug in Visual C++ running +on DBCS locales. + +--Tor Lillqvist +--Updated by Chun-wei Fan diff --git a/build/win32/vs9/gio.vcprojin b/build/win32/vs9/gio.vcprojin new file mode 100644 index 0000000..bba9704 --- /dev/null +++ b/build/win32/vs9/gio.vcprojin @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libgio.sourcefiles" + + + + + + + + diff --git a/build/win32/vs9/glib-compile-resources.vcproj b/build/win32/vs9/glib-compile-resources.vcproj new file mode 100644 index 0000000..0030edd --- /dev/null +++ b/build/win32/vs9/glib-compile-resources.vcproj @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib-compile-schemas.vcproj b/build/win32/vs9/glib-compile-schemas.vcproj new file mode 100644 index 0000000..d96a743 --- /dev/null +++ b/build/win32/vs9/glib-compile-schemas.vcproj @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib-genmarshal.vcproj b/build/win32/vs9/glib-genmarshal.vcproj new file mode 100644 index 0000000..95787ea --- /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..5642892 --- /dev/null +++ b/build/win32/vs9/glib.sln @@ -0,0 +1,332 @@ +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}") = "glib-compile-schemas", "glib-compile-schemas.vcproj", "{015D69D0-8B42-438A-ADAE-052AC036E065}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + {F3D1583C-5613-4809-BD98-7CC1C1276F92} = {F3D1583C-5613-4809-BD98-7CC1C1276F92} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsettings", "gsettings.vcproj", "{05041C63-F1C5-49BA-A7DE-61EBB5307EAA}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + {F3D1583C-5613-4809-BD98-7CC1C1276F92} = {F3D1583C-5613-4809-BD98-7CC1C1276F92} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glib-compile-resources", "glib-compile-resources.vcproj", "{B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + {F3D1583C-5613-4809-BD98-7CC1C1276F92} = {F3D1583C-5613-4809-BD98-7CC1C1276F92} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gresource", "gresource.vcproj", "{95A1571F-61BE-4C51-BE53-2F2DAB280685}" + ProjectSection(ProjectDependencies) = postProject + {12BCA020-EABF-429E-876A-A476BC9C10C0} = {12BCA020-EABF-429E-876A-A476BC9C10C0} + {F172EFFC-E30F-4593-809E-DB2024B1E753} = {F172EFFC-E30F-4593-809E-DB2024B1E753} + {F3D1583C-5613-4809-BD98-7CC1C1276F92} = {F3D1583C-5613-4809-BD98-7CC1C1276F92} + 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} + {015D69D0-8B42-438A-ADAE-052AC036E065} = {015D69D0-8B42-438A-ADAE-052AC036E065} + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA} = {05041C63-F1C5-49BA-A7DE-61EBB5307EAA} + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A} = {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A} + {95A1571F-61BE-4C51-BE53-2F2DAB280685} = {95A1571F-61BE-4C51-BE53-2F2DAB280685} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + Debug_ExtPCRE|Win32 = Debug_ExtPCRE|Win32 + Debug_ExtPCRE|x64 = Debug_ExtPCRE|x64 + Release_ExtPCRE|Win32 = Release_ExtPCRE|Win32 + Release_ExtPCRE|x64 = Release_ExtPCRE|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 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|Win32.ActiveCfg = Debug_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|Win32.Build.0 = Debug_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|x64.ActiveCfg = Debug_ExtPCRE|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Debug_ExtPCRE|x64.Build.0 = Debug_ExtPCRE|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|Win32.ActiveCfg = Release_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|Win32.Build.0 = Release_ExtPCRE|Win32 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|x64.ActiveCfg = Release_ExtPCRE|x64 + {12BCA020-EABF-429E-876A-A476BC9C10C0}.Release_ExtPCRE|x64.Build.0 = Release_ExtPCRE|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 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {4214047C-F5C1-40B3-8369-5DCED8C32770}.Release_ExtPCRE|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 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {F172EFFC-E30F-4593-809E-DB2024B1E753}.Release_ExtPCRE|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 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {C8AFB8C3-FFFD-460F-BC13-9AC25D7B117C}.Release_ExtPCRE|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 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {BD12E835-5C52-4E5D-8234-1C579F33E27A}.Release_ExtPCRE|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 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {F3D1583C-5613-4809-BD98-7CC1C1276F92}.Release_ExtPCRE|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 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {289240E7-E167-47CE-A20C-58D852E520BA}.Release_ExtPCRE|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 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {E40E8A7E-7CAE-4659-9B8B-BC38898E3074}.Release_ExtPCRE|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 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {64E09909-5599-40C0-B808-27F55F7B823C}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|Win32.ActiveCfg = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|Win32.Build.0 = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|x64.ActiveCfg = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug|x64.Build.0 = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|Win32.ActiveCfg = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|Win32.Build.0 = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|x64.ActiveCfg = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release|x64.Build.0 = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {015D69D0-8B42-438A-ADAE-052AC036E065}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|Win32.ActiveCfg = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|Win32.Build.0 = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|x64.ActiveCfg = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug|x64.Build.0 = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|Win32.ActiveCfg = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|Win32.Build.0 = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|x64.ActiveCfg = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release|x64.Build.0 = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {05041C63-F1C5-49BA-A7DE-61EBB5307EAA}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|Win32.Build.0 = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|x64.ActiveCfg = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug|x64.Build.0 = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|Win32.ActiveCfg = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|Win32.Build.0 = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|x64.ActiveCfg = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release|x64.Build.0 = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {B0CDEC7F-DCE1-4F7E-B8A4-A3009C18FB2A}.Release_ExtPCRE|x64.Build.0 = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|Win32.ActiveCfg = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|Win32.Build.0 = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|x64.ActiveCfg = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug|x64.Build.0 = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|Win32.ActiveCfg = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|Win32.Build.0 = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|x64.ActiveCfg = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release|x64.Build.0 = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {95A1571F-61BE-4C51-BE53-2F2DAB280685}.Release_ExtPCRE|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 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|Win32.ActiveCfg = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|Win32.Build.0 = Debug|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|x64.ActiveCfg = Debug|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Debug_ExtPCRE|x64.Build.0 = Debug|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|Win32.ActiveCfg = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|Win32.Build.0 = Release|Win32 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|x64.ActiveCfg = Release|x64 + {2093D218-190E-4194-9421-3BA7CBF33B10}.Release_ExtPCRE|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/build/win32/vs9/glib.vcprojin b/build/win32/vs9/glib.vcprojin new file mode 100644 index 0000000..6865eac --- /dev/null +++ b/build/win32/vs9/glib.vcprojin @@ -0,0 +1,500 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libglib.sourcefiles" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/glib.vsprops b/build/win32/vs9/glib.vsprops new file mode 100644 index 0000000..5cbb45a --- /dev/null +++ b/build/win32/vs9/glib.vsprops @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gmodule.vcproj b/build/win32/vs9/gmodule.vcproj new file mode 100644 index 0000000..b4a1331 --- /dev/null +++ b/build/win32/vs9/gmodule.vcproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gobject.vcprojin b/build/win32/vs9/gobject.vcprojin new file mode 100644 index 0000000..f8300e9 --- /dev/null +++ b/build/win32/vs9/gobject.vcprojin @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include "libgobject.sourcefiles" + + + + + + + + diff --git a/build/win32/vs9/gresource.vcproj b/build/win32/vs9/gresource.vcproj new file mode 100644 index 0000000..dbe83e5 --- /dev/null +++ b/build/win32/vs9/gresource.vcproj @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gsettings.vcproj b/build/win32/vs9/gsettings.vcproj new file mode 100644 index 0000000..3fc3bb2 --- /dev/null +++ b/build/win32/vs9/gsettings.vcproj @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..8f77add --- /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..99c2598 --- /dev/null +++ b/build/win32/vs9/gspawn-win32-helper.vcproj @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/win32/vs9/gthread.vcproj b/build/win32/vs9/gthread.vcproj new file mode 100644 index 0000000..7a6c1d9 --- /dev/null +++ b/build/win32/vs9/gthread.vcproj @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..420a7c5 --- /dev/null +++ b/build/win32/vs9/testglib.vcproj @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/check-abis.sh b/check-abis.sh new file mode 100755 index 0000000..037cca6 --- /dev/null +++ b/check-abis.sh @@ -0,0 +1,23 @@ +#!/bin/sh -e + +list_leaked_symbols () { + nm -D "$1" | grep ' T ' | cut -f 3 -d ' ' | egrep -v "$2" +} + +check_symbols () { + if [ "`list_leaked_symbols "$1" "$2" | wc -l`" -ne 0 ]; then + echo File "$1" possibly leaking symbols: + list_leaked_symbols "$1" "$2" + exit 1 + fi +} + +allowed="^_init$|^_fini$|^g_" +allowed_in_libglib="${allowed}|^glib__private__$|^glib_gettext$|^glib_pgettext$|^glib_check_version$" +allowed_in_libgthread='^_init$|^_fini$|^g_thread_init$|^g_thread_init_with_errorcheck_mutexes$' + +check_symbols glib/.libs/libglib-2.0.so "$allowed_in_libglib" +check_symbols gthread/.libs/libgthread-2.0.so "$allowed_in_libgthread" +for file in gmodule/.libs/libgmodule-2.0.so gobject/.libs/libgobject-2.0.so gio/.libs/libgio-2.0.so; do + check_symbols "$file" "$allowed" +done diff --git a/config.h.win32.in b/config.h.win32.in new file mode 100644 index 0000000..7a577ff --- /dev/null +++ b/config.h.win32.in @@ -0,0 +1,909 @@ +/* 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.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* The normal alignment of `guint32', in bytes. */ +#define ALIGNOF_GUINT32 4 + +/* The normal alignment of `guint64', in bytes. */ +#define ALIGNOF_GUINT64 8 + +/* The normal alignment of `unsigned long', in bytes. */ +#define ALIGNOF_UNSIGNED_LONG 4 + +/* 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 + +/* 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@ + +/* 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@ + +/* 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__ */ + +/* 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 `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 */ + +/* define to 1 if Cocoa is available */ +/* #undef HAVE_COCOA */ + +/* Have nl_langinfo (CODESET) */ +/* #undef HAVE_CODESET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CRT_EXTERNS_H */ + +/* Define if dbus-1 is available */ +/* #undef HAVE_DBUS1 */ + +/* Define to 1 if you have the `dcgettext' function. */ +#define HAVE_DCGETTEXT 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#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 using dtrace probes. */ +/* #undef HAVE_DTRACE */ + +/* Define to 1 if you have the `endmntent' function. */ +/* #undef HAVE_ENDMNTENT */ + +/* Define to 1 if you have the `endservent' function. */ +/* #undef HAVE_ENDSERVENT */ + +/* we have the eventfd(2) system call */ +/* #undef HAVE_EVENTFD */ + +/* 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 `getfsstat' function. */ +/* #undef HAVE_GETFSSTAT */ + +/* 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 `getprotobyname_r' function. */ +/* #undef HAVE_GETPROTOBYNAME_R */ + +/* Define to 1 if you have the `getpwuid' function. */ +/* #undef HAVE_GETPWUID */ + +/* Define to 1 if you have the `getresuid' function. */ +/* #undef HAVE_GETRESUID */ + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#define HAVE_GETTEXT 1 + +/* Define to 1 if you have the `getvfsstat' function. */ +/* #undef HAVE_GETVFSSTAT */ + +/* 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 `if_nametoindex' function. */ +/* This is available on Windows, but the catch is that this will require */ +/* Windows Vista/Server 2008, so disabled for now-please see */ +/* http://msdn.microsoft.com/en-us/library/windows/desktop/bb408409%28v=vs.85%29.aspx */ +/* A workaround for Windows XP is under review in Bug 668071 */ +/* #undef HAVE_IF_NAMETOINDEX */ + +/* 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 */ +#if (_MSC_VER >= 1600) +#define HAVE_INTMAX_T 1 +#endif +/* #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 we have struct ip_mreqn */ +/* #undef HAVE_IP_MREQN */ + +/* Define to 1 if you have the `issetugid' function. */ +/* #undef HAVE_ISSETUGID */ + +/* Define to 1 if you have the `kevent' function. */ +/* #undef HAVE_KEVENT */ + +/* Define to 1 if you have the `kqueue' function. */ +/* #undef HAVE_KQUEUE */ + +/* Define if you have and nl_langinfo(CODESET). */ +/* #undef HAVE_LANGINFO_CODESET */ + +/* Have nl_langinfo (_NL_CTYPE_OUTDIGITn_WC) */ +/* #undef HAVE_LANGINFO_OUTDIGIT */ + +/* Have nl_langinfo (PM_STR) */ +/* #undef HAVE_LANGINFO_TIME */ + +/* 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 if you have the __libc_enable_secure variable (GNU libc, eglibc) */ +/* #undef HAVE_LIBC_ENABLE_SECURE */ + +/* Define if libelf is available */ +/* #undef HAVE_LIBELF */ + +/* 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. */ +/* #undef HAVE_LINUX_MAGIC_H */ + +/* 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 `memmem' function. */ +/* #undef HAVE_MEMMEM */ + +/* 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 */ + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* We have AF_NETLINK sockets */ +/* #undef HAVE_NETLINK */ + +/* Define to 1 if you have the `newlocale' function. */ +/* #undef HAVE_NEWLOCALE */ + +/* 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 `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 */ + +/* Define to 1 if you have the `prlimit' function. */ +/* #undef HAVE_PRLIMIT */ + +/* Have function pthread_attr_setstacksize */ +/* #undef HAVE_PTHREAD_ATTR_SETSTACKSIZE */ + +/* Have function pthread_condattr_setclock */ +/* #undef HAVE_PTHREAD_CONDATTR_SETCLOCK */ + +/* 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 if you have the 'sig_atomic_t' type. */ +#define HAVE_SIG_ATOMIC_T 1 + +/* 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 */ +#if (_MSC_VER >= 1600) /*VS 2010 ships with stdint.h*/ +#define HAVE_STDINT_H 1 +#else +/* #undef HAVE_STDINT_H */ +#endif +#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 */ +#if (_MSC_VER >= 1600) +#define HAVE_STDINT_H_WITH_UINTMAX 1 +#else +/* #undef HAVE_STDINT_H_WITH_UINTMAX */ +#endif +#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) +#define strcasecmp _stricmp +#endif /* _MSC_VER uses _stricmp, which is identical to strcasecmp */ + +#if !defined(__DMC__) +#define HAVE_STRCASECMP 1 +#endif /* _MSC_VER or __gcc__ */ + +/* 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(__DMC__) +#if defined(_MSC_VER) +#define strncasecmp _strnicmp +#endif /* _MSC_VER uses _strnicmp, which is identical to strncasecmp */ +#define HAVE_STRNCASECMP 1 +#else /* __DMC__ */ +/* #undef HAVE_STRNCASECMP */ +#endif /* __DMC__ */ + +/* Define to 1 if you have the `strsignal' function. */ +/* #undef HAVE_STRSIGNAL */ + +/* Define to 1 if you have the `strtod_l' function. */ +/* #undef HAVE_STRTOD_L */ + +/* Define to 1 if you have the `strtoll_l' function. */ +/* #undef HAVE_STRTOLL_L */ + +/* Define to 1 if you have the `strtoull_l' function. */ +/* #undef HAVE_STRTOULL_L */ + +/* Define to 1 if `d_type' is a member of `struct dirent'. */ +/* #undef HAVE_STRUCT_DIRENT_D_TYPE */ + +/* 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 `f_fstypename' is a member of `struct statvfs'. */ +/* #undef HAVE_STRUCT_STATVFS_F_FSTYPENAME */ + +/* 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 `tm_gmtoff' is a a member of `struct tm'. */ +/* #undef HAVE_STRUCT_TM_TM_GMTOFF */ + +/* Define to 1 if `__tm_gmtoff' is a member of `struct tm'. */ +/* #undef HAVE_STRUCT_TM___TM_GMTOFF */ + +/* Define to 1 if you have the `symlink' function. */ +/* #undef HAVE_SYMLINK */ + +/* Define to 1 if you have the `sysctlbyname' function. */ +/* #undef HAVE_SYSCTLBYNAME */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_EVENT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_FILIO_H */ + +/* 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_IOCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MKDEV_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, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_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 `uselocale' function. */ +/* #undef HAVE_USELOCALE */ + +/* 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 */ +#if (_MSC_VER >= 1500) +#define HAVE_VSNPRINTF 1 +#endif /* VS 2008+ has vsnprintf */ +/* #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 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 header file. */ +/* #undef HAVE_XLOCALE_H */ + +/* 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 */ + +/* 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 home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@.@GLIB_MICRO_VERSION@" + +/* define if posix_memalign() can allocate any size */ +/* #undef POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS */ + +/* 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. */ +#ifdef _MSC_VER +#if (defined(_M_X64) || defined(_M_AMD64)) +#define SIZEOF_VOID_P 8 +#elif (defined(_M_IX86)) +#define SIZEOF_VOID_P 4 +#endif +#else +#define SIZEOF_VOID_P 4 +#endif + +/* 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 + +/* Define to use statfs() */ +/* #undef USE_STATFS */ + +/* Define to use statvfs() */ +/* #undef USE_STATVFS */ + +/* 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 */ + +/* defines how to decorate public symbols while building */ +#define _GLIB_EXTERN __declspec (dllexport) + +/* Make all glibc extensions visible */ +/* #undef _GNU_SOURCE */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Target the Windows XP API */ +#define _WIN32_WINNT 0x0501 + +/* 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/configure.ac b/configure.ac new file mode 100644 index 0000000..b4540d8 --- /dev/null +++ b/configure.ac @@ -0,0 +1,3737 @@ +# Process this file with autoconf to produce a configure script. +AC_PREREQ([2.62]) + +dnl *********************************** +dnl *** include special GLib macros *** +dnl *********************************** + +m4_define(glib_configure_ac) + +# +# 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. +# +# remember to add a GLIB_VERSION_2_xx macro every time the minor version is +# bumped, as well as the GLIB_DEPRECATED_IN and GLIB_AVAILABLE_IN macros +# for that version - see gversion.h for further information. +# +# in easier to understand terms: +# +# on the stable branch, interface age == micro +# on the unstable (ie master), interface age = 0 + +m4_define([glib_major_version], [2]) +m4_define([glib_minor_version], [35]) +m4_define([glib_micro_version], [8]) +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_HEADERS([config.h]) +AC_CONFIG_SRCDIR([glib/glib.h]) +AC_CONFIG_MACRO_DIR([m4macros]) + +# Save this value here, since automake will set cflags later +cflags_set=${CFLAGS+set} + +AM_INIT_AUTOMAKE([1.11 -Wno-portability no-define no-dist-gzip dist-xz tar-ustar]) +AM_MAINTAINER_MODE([enable]) + +# Support silent build rules. Disable +# by either passing --disable-silent-rules to configure or passing V=1 +# to make +AM_SILENT_RULES([yes]) + +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 Checks for programs. +AC_PROG_CC +AC_PROG_CPP + +AM_CONDITIONAL(HAVE_GCC, [test "$GCC" = "yes"]) + +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 + + AC_DEFINE([_WIN32_WINNT], [0x0501], [Target the Windows XP API]) + ;; + *) + 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]) + +glib_have_cocoa=no +AC_MSG_CHECKING([for Mac OS X Cocoa support]) +AC_TRY_CPP([ +#include +#ifdef GNUSTEP_BASE_VERSION +#error "Detected GNUstep, not Cocoa" +#endif +], glib_have_cocoa=yes) + +AC_MSG_RESULT([$glib_have_cocoa]) + +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"]) +AM_CONDITIONAL(OS_COCOA, [test "$glib_have_cocoa" = "yes"]) + +AS_IF([test "$glib_native_win32" = "yes"], [ + 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_TOOL(DLLTOOL, dlltool, :) + AC_CHECK_PROG(ms_librarian, [lib.exe], [yes], [no]) +]) +AM_CONDITIONAL(MS_LIB_AVAILABLE, [test x$ms_librarian = xyes]) + +AS_IF([test "x$glib_have_carbon" = "xyes"], [ + AC_DEFINE(HAVE_CARBON, 1, [define to 1 if Carbon is available]) + LDFLAGS="$LDFLAGS -Wl,-framework,Carbon" +]) + +if test "x$glib_have_cocoa" = "xyes"; then + AC_DEFINE(HAVE_COCOA, 1, [define to 1 if Cocoa is available]) + LDFLAGS="$LDFLAGS -Wl,-framework,Foundation" +fi + +gl_GLIBC21 +AS_IF([test "x$GLIBC21" = "xyes"], [ + AC_DEFINE([_GNU_SOURCE], 1, [Make all glibc extensions visible]) +]) + +dnl declare --enable-* args and collect ac_help strings +AC_ARG_ENABLE(debug, + AS_HELP_STRING([--enable-debug=@<:@no/minimum/yes@:>@], + [turn on debugging @<:@default=glib_debug_default@:>@]),, + enable_debug=glib_debug_default) + +AC_ARG_ENABLE(gc_friendly, + [AS_HELP_STRING([--enable-gc-friendly], + [turn on garbage collector friendliness [default=no]])],, + [enable_gc_friendly=no]) +AC_ARG_ENABLE(mem_pools, + [AS_HELP_STRING([--disable-mem-pools], + [disable all glib memory pools])],, + [disable_mem_pools=no]) +AC_ARG_ENABLE(rebuilds, + [AS_HELP_STRING([--disable-rebuilds], + [disable all source autogeneration rules])],, + [enable_rebuilds=yes]) +AC_ARG_ENABLE(modular_tests, + AS_HELP_STRING([--disable-modular-tests], + [Disable build of test programs (default: no)]),, + [enable_modular_tests=yes]) +AM_CONDITIONAL(BUILD_MODULAR_TESTS, test x$enable_modular_tests = xyes) + +AC_MSG_CHECKING([whether to enable garbage collector friendliness]) +AS_IF([test "x$enable_gc_friendly" = "xyes"], [ + AC_DEFINE(ENABLE_GC_FRIENDLY_DEFAULT, 1, [Whether to enable GC friendliness by default]) + AC_MSG_RESULT([yes]) +], [ AC_MSG_RESULT([no]) ]) + +AC_MSG_CHECKING([whether to disable memory pools]) +AS_IF([test "x$disable_mem_pools" = "xno"], [ + AC_MSG_RESULT([no]) +], [ + AC_DEFINE(DISABLE_MEM_POOLS, [1], [Whether to disable memory pools]) + AC_MSG_RESULT([yes]) +]) + +dnl location to install runtime libraries, e.g. ../../lib to install +dnl to /lib if libdir is /usr/lib +AC_ARG_WITH(runtime-libdir, + [AS_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 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_C_O +AC_PROG_INSTALL + +AC_SYS_LARGEFILE + +PKG_PROG_PKG_CONFIG(0.16) + +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 + +# 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) + +# option to specify python interpreter to use; this just sets $PYTHON, so that +# we will fallback to reading $PYTHON if --with-python is not given, and +# python.m4 will get the expected input +AC_ARG_WITH(python, + AS_HELP_STRING([--with-python=PATH], + [Path to Python interpreter; searches $PATH if only a program name is given; if not given, searches for a few standard names such as "python3" or "python2"]), + [PYTHON="$withval"], []) +if test x"$PYTHON" = xyes; then + AC_MSG_ERROR([--with-python option requires a path or program argument]) +fi +AM_PATH_PYTHON(2.5,,PYTHON="/usr/bin/env python2.5") + + +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 + +AS_IF([ test x"$glib_native_win32" = xyes], [ + with_libiconv=native +], [ + AC_ARG_WITH(libiconv, + [AS_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 +]) + +AC_ARG_ENABLE(iconv-cache, + [AS_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 +PKG_CHECK_MODULES([ZLIB], [zlib], [found_zlib=yes], [found_zlib=no]) +AS_IF([test "x$found_zlib" = "xno"], [ + 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) +]) + +PKG_CHECK_MODULES(LIBFFI, [libffi >= 3.0.0]) +AC_SUBST(LIBFFI_CFLAGS) +AC_SUBST(LIBFFI_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 + +AS_IF([test x"$glib_native_win32" != xyes], [ + if test x$with_libiconv != xno ; then + case " $INTLLIBS " in + *[[\ \ ]]-liconv[[\ \ ]]*) ;; + *) ICONV_LIBS="-liconv" ;; + esac + 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 +LT_PREREQ([2.2]) +LT_INIT([disable-static win32-dll]) +dnl when using libtool 2.x create libtool early, because it's used in configure +m4_ifdef([LT_OUTPUT], [LT_OUTPUT]) + + +AS_IF([test "$glib_native_win32" = "yes"], [ + 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 +]) +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 +AS_IF([test $cross_compiling != yes], [ + 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 +]) + +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 library functions. +AC_FUNC_VPRINTF +AC_FUNC_ALLOCA +AC_CHECK_FUNCS(mmap posix_memalign memalign valloc fsync pipe2 issetugid) +AC_CHECK_FUNCS(atexit on_exit timegm gmtime_r) + +AC_CACHE_CHECK([for __libc_enable_secure], glib_cv_have_libc_enable_secure, + [AC_TRY_LINK([#include + extern int __libc_enable_secure;], + [return __libc_enable_secure;], + glib_cv_have_libc_enable_secure=yes, + glib_cv_have_libc_enable_secure=no)]) +AS_IF([test x$glib_cv_have_libc_enable_secure = xyes], [ + AC_DEFINE(HAVE_LIBC_ENABLE_SECURE, 1, + [Define if you have the __libc_enable_secure variable (GNU libc, eglibc)]) +]) + +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) + +AC_CACHE_CHECK([for sig_atomic_t], ac_cv_type_sig_atomic_t, + [AC_TRY_LINK([#include + #include + sig_atomic_t val = 42;], + [return val == 42 ? 0 : 1], + ac_cv_type_sig_atomic_t=yes, + ac_cv_type_sig_atomic_t=no)]) +if test x$ac_cv_type_sig_atomic_t = xyes; then + AC_DEFINE(HAVE_SIG_ATOMIC_T, 1, + [Define if you have the 'sig_atomic_t' type.]) +fi + +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 + +AS_IF([test x$glib_native_win32 != xyes && test x$ac_cv_sizeof_long_long = x8], [ + # 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]) + AS_IF([ test -n "$glib_cv_long_long_format"], [ + 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 + ], [AC_MSG_RESULT(none)]) +],[ test x$ac_cv_sizeof___int64 = x8], [ + # __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]) +]) + +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 +AS_IF([test "x$GCC" = "xyes"], [ + 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) +]) +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([AC_LANG_SOURCE([[ + __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([AC_LANG_SOURCE([[ + __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([AC_LANG_SOURCE([[ + #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([AC_LANG_SOURCE([[ +#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++) +AS_IF([test "$CXX" = ""], [ +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 +]) +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([AC_LANG_SOURCE([[ +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 (void) +{ + 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/vmount.h sys/statfs.h sys/statvfs.h sys/filio.h]) +AC_CHECK_HEADERS([mntent.h sys/mnttab.h sys/vfstab.h sys/mntctl.h fstab.h]) +AC_CHECK_HEADERS([sys/uio.h sys/mkdev.h]) +AC_CHECK_HEADERS([linux/magic.h]) +AC_CHECK_HEADERS([sys/prctl.h]) + +AC_CHECK_HEADERS([sys/mount.h sys/sysctl.h], [], [], +[#if HAVE_SYS_PARAM_H + #include + #endif +]) +AC_CHECK_FUNCS(sysctlbyname) + +AC_CHECK_HEADERS([xlocale.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 ]) +AC_CHECK_MEMBERS([struct statvfs.f_fstypename],,, [#include ]) +AC_CHECK_MEMBERS([struct tm.tm_gmtoff, struct tm.__tm_gmtoff],,,[#include ]) + +AC_STRUCT_DIRENT_D_TYPE + +# Checks for libcharset +AM_LANGINFO_CODESET +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 +AS_IF([test $ac_cv_sizeof_size_t = $ac_cv_sizeof_int && + test $ac_cv_sizeof_size_t = $ac_cv_sizeof_long], [ + GLIB_CHECK_COMPILE_WARNINGS([AC_LANG_SOURCE([[ +#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([AC_LANG_SOURCE([[ +#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)]) +]) + +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 memmem) +AC_CHECK_FUNCS(chown lchmod lchown fchmod fchown link utimes getgrgid getpwuid getresuid) +AC_CHECK_FUNCS(getmntent_r setmntent endmntent hasmntopt getfsstat getvfsstat) +# Check for high-resolution sleep functions +AC_CHECK_FUNCS(splice) +AC_CHECK_FUNCS(prlimit) + +# To avoid finding a compatibility unusable statfs, which typically +# successfully compiles, but warns to use the newer statvfs interface: +AS_IF([test $ac_cv_header_sys_statvfs_h = yes], [AC_CHECK_FUNCS([statvfs])]) +AS_IF([test $ac_cv_header_sys_statfs_h = yes -o $ac_cv_header_sys_mount_h = yes], [AC_CHECK_FUNCS([statfs])]) + +AC_MSG_CHECKING([whether to use statfs or statvfs]) +# Some systems have both statfs and statvfs, pick the most "native" for these +AS_IF([test x$ac_cv_func_statfs = xyes && test x$ac_cv_func_statvfs = xyes], + [ + # on solaris and irix, statfs doesn't even have the f_bavail field + AS_IF([test x$ac_cv_member_struct_statfs_f_bavail = xno], + [ac_cv_func_statfs=no], + # else, at least on linux, statfs is the actual syscall + [ac_cv_func_statvfs=no]) + ]) + +AS_IF([test x$ac_cv_func_statfs = xyes], + [ + AC_DEFINE([USE_STATFS], [1], [Define to use statfs()]) + AC_MSG_RESULT([statfs]) + ], + [test x$ac_cv_func_statvfs = xyes], + [ + AC_DEFINE([USE_STATVFS], [1], [Define to use statvfs()]) + AC_MSG_RESULT([statvfs]) + ], + [ AC_MSG_RESULT([neither])]) + +AC_CHECK_HEADERS(crt_externs.h) +AC_CHECK_FUNCS(_NSGetEnviron) + +AC_CHECK_FUNCS(newlocale uselocale strtod_l strtoll_l strtoull_l) + +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 if_nametoindex) + +AS_IF([test $glib_native_win32 = yes], [ + # 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). + AC_CHECK_HEADER([wspiapi.h], [WSPIAPI_INCLUDE="#include "]) + AC_SUBST(WSPIAPI_INCLUDE) +], [ + AC_MSG_CHECKING([if arpa/nameser_compat.h is needed]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include + #include ], + [int qclass = C_IN;])], + [AC_MSG_RESULT([no])], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include + #include + #include ], + [int qclass = C_IN;])], + [AC_MSG_RESULT([yes]) + NAMESER_COMPAT_INCLUDE="#include "], + [AC_MSG_ERROR([could not compile test program either way])])]) + AC_SUBST(NAMESER_COMPAT_INCLUDE) + + # We can't just use AC_CHECK_FUNC/AC_CHECK_LIB here. Bug 586150 + NETWORK_LIBS="" + 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]) + NETWORK_LIBS="-lresolv $NETWORK_LIBS"], + [LIBS="-lbind $save_libs" + AC_TRY_LINK([#include ], + [res_query("test", 0, 0, (void *)0, 0);], + [AC_MSG_RESULT([in -lbind]) + NETWORK_LIBS="-lbind $NETWORK_LIBS"], + [AC_MSG_ERROR(not found)])]) + LIBS="$save_libs"]) + AC_CHECK_FUNC(socket, :, AC_CHECK_LIB(socket, socket, + [NETWORK_LIBS="-lsocket $NETWORK_LIBS"], + [AC_MSG_ERROR(Could not find socket())])) +]) +AC_SUBST(NETWORK_LIBS) + +AC_CHECK_HEADER([linux/netlink.h], + [AC_DEFINE(HAVE_NETLINK, 1, [We have AF_NETLINK sockets])],, + [#include ]) +AM_CONDITIONAL(HAVE_NETLINK, [test "$ac_cv_header_linux_netlink_h" = "yes"]) + +AC_CHECK_TYPE([struct ip_mreqn], [ + AC_DEFINE(HAVE_IP_MREQN,, [Define if we have struct ip_mreqn])],, + [#include ]) + +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 +AS_IF([test "$ac_cv_func_statfs" = yes], [ + 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()])])]) +]) + +# +# Check whether to use an included printf +# + +AC_ARG_ENABLE(included-printf, + [AS_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") +AS_IF([test "$enable_included_printf" != "yes"], [ + AC_DEFINE(HAVE_GOOD_PRINTF,1,[define to use system printf]) +], [ + if test -z "$glib_cv_long_long_format" ; then + glib_cv_long_long_format="ll" + fi + AC_DEFINE(HAVE_VASPRINTF,1) +]) + +# 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. +AS_IF([test "$ac_cv_func_memmove" != "yes"], [ + 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 +]) + +# 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) +AS_IF([test "$gtk_ok" = "yes"], [ + AC_MSG_RESULT([yes, found in sys/types.h]) +], [ + 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 +]) + +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]) +]) +AS_IF([test x$glib_cv_sane_realloc = xyes], [ + AC_DEFINE(REALLOC_0_WORKS,1,[whether realloc (NULL,) works]) +]) + +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 Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c +AC_CACHE_CHECK([for nl_langinfo (PM_STR)],glib_cv_langinfo_time,[ + AC_TRY_COMPILE([#include ], + [char *str; + str = nl_langinfo (PM_STR); + str = nl_langinfo (D_T_FMT); + str = nl_langinfo (D_FMT); + str = nl_langinfo (T_FMT); + str = nl_langinfo (T_FMT_AMPM); + str = nl_langinfo (MON_1); + str = nl_langinfo (ABMON_12); + str = nl_langinfo (DAY_1); + str = nl_langinfo (ABDAY_7);], + [glib_cv_langinfo_time=yes], + [glib_cv_langinfo_time=no])]) +if test x$glib_cv_langinfo_time = xyes; then + AC_DEFINE(HAVE_LANGINFO_TIME,1,[Have nl_langinfo (PM_STR)]) +fi + +dnl Check for nl_langinfo and _NL_CTYPE_OUTDIGITn_MB +AC_CACHE_CHECK([for nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)], glib_cv_langinfo_outdigit,[ + AC_TRY_COMPILE([#include ], + [char *str; + str = nl_langinfo (_NL_CTYPE_OUTDIGIT0_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT1_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT2_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT3_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT4_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT5_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT6_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT7_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT8_MB); + str = nl_langinfo (_NL_CTYPE_OUTDIGIT9_MB);], + [glib_cv_langinfo_outdigit=yes], + [glib_cv_langinfo_outdigit=no])]) +if test x$glib_cv_langinfo_outdigit = xyes; then + AC_DEFINE(HAVE_LANGINFO_OUTDIGIT,1,[Have nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)]) +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 + ]) +AS_IF([test "$glib_cv_compliant_posix_memalign" = "1"], [ + AC_MSG_RESULT(yes) + AC_DEFINE(POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS, 1, [define if posix_memalign() can allocate any size]) +], [ + AC_MSG_RESULT(no) +]) + + +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([AC_LANG_SOURCE([[#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([AC_LANG_SOURCE([[#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]) +]) + +AS_IF([ test "x$glib_cv_va_val_copy" = "xno"], [ + AC_DEFINE(G_VA_COPY_AS_ARRAY,1, ['va_lists' cannot be copies as values]) +]) + +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 +AS_IF([ test -z "$G_MODULE_IMPL"], [ + AC_CHECK_FUNC(dlopen, + [AC_CHECK_FUNC(dlsym, + [G_MODULE_IMPL=G_MODULE_IMPL_DL],[])], + []) +]) +dnl *** load_image (BeOS) +AS_IF([test -z "$G_MODULE_IMPL" && test "x$glib_native_beos" = "xyes"], [ + 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], + []) +]) +dnl *** NSLinkModule (dyld) in system libraries (Darwin) +AS_IF([ test -z "$G_MODULE_IMPL" ], [ + AC_CHECK_FUNC(NSLinkModule, + [G_MODULE_IMPL=G_MODULE_IMPL_DYLD + G_MODULE_NEED_USCORE=1], + []) +]) +dnl *** dlopen() and dlsym() in libdl +AS_IF([ test -z "$G_MODULE_IMPL"], [ + AC_CHECK_LIB(dl, dlopen, + [AC_CHECK_LIB(dl, dlsym, + [G_MODULE_LIBS=-ldl + G_MODULE_IMPL=G_MODULE_IMPL_DL],[])], + []) +]) +dnl *** shl_load() in libdld (HP-UX) +AS_IF([ test -z "$G_MODULE_IMPL"], [ + AC_CHECK_LIB(dld, shl_load, + [G_MODULE_LIBS=-ldld + G_MODULE_IMPL=G_MODULE_IMPL_DLD], + []) +]) +dnl *** additional checks for G_MODULE_IMPL_DL +AS_IF([ test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL" ], [ + 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 --tag=CC ${CC} ${CFLAGS} \ + ${CPPFLAGS} -c -o plugin.lo plugin.c >/dev/null 2>&1 + ${SHELL} ./libtool --mode=link --tag=CC ${CC} ${CFLAGS} \ + ${LDFLAGS} -module -o plugin.la -export-dynamic \ + -shrext ".o" -avoid-version plugin.lo \ + -rpath /dont/care >/dev/null 2>&1 + eval `./libtool --config | grep ^objdir` + 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 ("./$objdir/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 plugin.la ${objdir}/plugin.* + rmdir ${objdir} 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" +]) +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, + [AS_HELP_STRING([--with-gio-module-dir=DIR], + [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, + AS_HELP_STRING([--disable-selinux], + [build without selinux support])) +msg_selinux=no +SELINUX_LIBS= +AS_IF([ test "x$enable_selinux" != "xno"], [ + + 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]) + ]) + ]) +]) +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 kqueue (GIO) ** +dnl **************************** +kqueue_support=no +AC_CHECK_HEADERS([sys/event.h], +[ + AC_CHECK_FUNCS(kqueue kevent, [kqueue_support=yes]) +]) + +AM_CONDITIONAL(HAVE_KQUEUE, [test "$kqueue_support" = "yes"]) + +dnl ********************************* +dnl ** Check for Solaris FEN (GIO) ** +dnl ********************************* +fen_support=no +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#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, + AS_HELP_STRING([--disable-fam], + [don't use fam for file system monitoring]), + [ + if test "x$enable_fam" = "xno"; then + should_disable_fam=yes + 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, + AS_HELP_STRING([--disable-xattr], [build without xattr support])) +msg_xattr=no +XATTR_LIBS= +AS_IF([ test "x$enable_xattr" != "xno"], [ + +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]) + ]) + + AS_IF([ test "x$msg_xattr" != "xyes"], [ +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]) + ]) + ]) + + AS_IF([ test "x$msg_xattr" = "xyes"], [ + 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])] + ) + ]) +]) +AC_SUBST(XATTR_LIBS) + +dnl ************************ +dnl *** check for libelf *** +dnl ************************ +AC_ARG_ENABLE(libelf, + AS_HELP_STRING([--disable-libelf], [build without libelf support])) +AS_IF([ test "x$enable_libelf" != "xno"],[ +PKG_CHECK_MODULES([LIBELF], [libelf >= 0.8.12], [have_libelf=yes], [have_libelf=maybe]) +AS_IF([ test $have_libelf = maybe ], [ + glib_save_LIBS=$LIBS + AC_CHECK_LIB([elf], [elf_begin], [:], [have_libelf=no]) + AC_CHECK_LIB([elf], [elf_getshdrstrndx], [:], [have_libelf=no]) + AC_CHECK_LIB([elf], [elf_getshdrnum], [:], [have_libelf=no]) + AC_CHECK_HEADER([libelf.h], [:], [have_libelf=no]) + LIBS=$glib_save_LIBS + + if test $have_libelf != no; then + LIBELF_LIBS=-lelf + have_libelf=yes + fi +]) +]) + +if test x$have_libelf = xyes; then + AC_DEFINE(HAVE_LIBELF, 1, [Define if libelf is available]) +fi + +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, + [AS_HELP_STRING([--with-threads=@<:@posix/win32@:>@], + [specify a thread implementation to use])], + [], + [with_threads=yes]) + +dnl error and warning message +dnl ************************* + +THREAD_NO_IMPLEMENTATION="No thread implementation found." + +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." + +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." + +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 *************************************** + +AC_MSG_CHECKING(for thread implementation) + +have_threads=no +AS_IF([ test "x$with_threads" = xyes || test "x$with_threads" = xposix], [ + # -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" + AS_IF([ test "x$have_threads" = xno], [ + AC_TRY_COMPILE([#include ], + [pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;], + have_threads=posix) + ]) + # 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" +]) +if test "x$with_threads" = xyes || test "x$with_threads" = xwin32; then + case $host in + *-*-mingw*) + have_threads=win32 + ;; + esac +fi + +if test "x$have_threads" = xno; then + AC_MSG_RESULT(none available) + AC_MSG_ERROR($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); +}]) + +AS_IF([ test x"$have_threads" = xposix], [ + # 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([AC_LANG_SOURCE(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 +]) + +AS_IF([ test x"$G_THREAD_CFLAGS" = x], [ + + # 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" + ;; + *-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 +]) + +# 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" + +dnl determination of G_THREAD_LIBS +dnl ****************************** + +AS_IF([test x$have_threads = xposix], [ + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + AS_IF([ test x"$G_THREAD_LIBS" = x ], [ + 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; 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([AC_LANG_SOURCE(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 + ]) + + g_threads_impl="POSIX" + AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES) + CPPFLAGS="$glib_save_CPPFLAGS" +], [test x$have_threads = xwin32], [ + g_threads_impl="WIN32" +], [ + g_threads_impl="NONE" + G_THREAD_LIBS=error +]) + +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 ************************************************************ + +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) +AS_IF([ test "$ac_cv_header_pwd_h" = "yes"], [ + 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 +]) +AS_IF([ test "$ac_cv_header_grp_h" = "yes"], [ + 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) + AS_IF([ test "$ac_cv_func_posix_getgrgid_r" = yes ], [ + AC_DEFINE(HAVE_POSIX_GETGRGID_R,1, + [Have POSIX function getgrgid_r]) + ], [ + 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 + ]) +]) +LIBS="$G_THREAD_LIBS $LIBS" +AS_IF([ test x"$have_threads" = xposix], [ + glib_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES" + # This is not AC_CHECK_FUNC to also work with function + # name mangling in header files. + AC_MSG_CHECKING(for pthread_attr_setstacksize) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#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 pthread_condattr_setclock) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [#include ], + [pthread_condattr_t a; pthread_condattr_setclock(&a,0)])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_CONDATTR_SETCLOCK,1, + [Have function pthread_condattr_setclock])], + [AC_MSG_RESULT(no)]) + CPPFLAGS="$glib_save_CPPFLAGS" +]) + +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 + +# +# 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/`" + ;; + *-*-openbsd*) + LDFLAGS="$LDFLAGS -pthread" + ;; + *) + G_THREAD_LIBS_FOR_GTHREAD="$G_THREAD_LIBS" + ;; +esac + +AC_SUBST(G_THREAD_CFLAGS) +AC_SUBST(G_THREAD_LIBS) +AC_SUBST(G_THREAD_LIBS_FOR_GTHREAD) +AC_SUBST(G_THREAD_LIBS_EXTRA) + +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" + ]) +]) + + +dnl ************************ +dnl *** g_atomic_* tests *** +dnl ************************ + +dnl We need to decide at configure time if GLib will use real atomic +dnl operations ("lock free") or emulated ones with a mutex. This is +dnl because we must put this information in glibconfig.h so we know if +dnl it is safe or not to inline using compiler intrinsics directly from +dnl the header. +dnl +dnl We also publish the information via G_ATOMIC_LOCK_FREE in case the +dnl user is interested in knowing if they can use the atomic ops across +dnl processes. +dnl +dnl We can currently support the atomic ops natively when building GLib +dnl with recent versions of GCC or MSVC. MSVC doesn't run ./configure, +dnl so we skip that case here and define G_ATOMIC_LOCK_FREE exactly when +dnl we are using GCC. +dnl +dnl Note that the atomic ops are only available with GCC on x86 when +dnl using -march=i486 or higher. If we detect that the atomic ops are +dnl not available but would be available given the right flags, we want +dnl to abort and advise the user to fix their CFLAGS. It's better to do +dnl that then to silently fall back on emulated atomic ops just because +dnl the user had the wrong build environment. + +dnl We may add other compilers here in the future... + +AC_CACHE_CHECK([for lock-free atomic intrinsics], glib_cv_g_atomic_lock_free, [ + AC_TRY_COMPILE([], + [volatile int atomic = 2;\ + __sync_bool_compare_and_swap (&atomic, 2, 3);], + [glib_cv_g_atomic_lock_free=yes], + [glib_cv_g_atomic_lock_free=no])]) + +if test "$glib_cv_g_atomic_lock_free" = "no"; then + SAVE_CFLAGS="${CFLAGS}" + CFLAGS="-march=i486" + AC_TRY_COMPILE([], + [volatile int atomic = 2;\ + __sync_bool_compare_and_swap (&atomic, 2, 3);], + [AC_MSG_ERROR([GLib must be build with -march=i486 or later.])], + []) + CFLAGS="${SAVE_CFLAGS}" +fi + +# Some compilers support atomic operations but do not define +# __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4, like clang +if test x"$glib_cv_g_atomic_lock_free" = xyes; then + AC_TRY_COMPILE([], + [__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;], + [], + [AC_DEFINE(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4, 1, [ compiler supports atomic operations])]) +fi + +dnl We need a more robust approach here... +case $host_cpu in + i?86|x86_64|s390|s390x|arm*|crisv32*|etrax*) + glib_memory_barrier_needed=no + ;; + sparc*|alpha*|powerpc*|ia64) + glib_memory_barrier_needed=yes + ;; + *) + glib_memory_barrier_needed=yes + ;; +esac + +dnl ************************ +dnl ** Check for futex(2) ** +dnl ************************ +AC_CACHE_CHECK(for futex(2) system call, + glib_cv_futex,AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +#include +#include +#include +],[ +int +main (void) +{ + /* it is not like this actually runs or anything... */ + syscall (__NR_futex, NULL, FUTEX_WAKE, FUTEX_WAIT); + return 0; +} +])],glib_cv_futex=yes,glib_cv_futex=no)) +if test x"$glib_cv_futex" = xyes; then + AC_DEFINE(HAVE_FUTEX, 1, [we have the futex(2) system call]) +fi + +AC_CACHE_CHECK(for eventfd(2) system call, + glib_cv_eventfd,AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ +#include +#include +],[ +int +main (void) +{ + eventfd (0, EFD_CLOEXEC); + return 0; +} +])],glib_cv_eventfd=yes,glib_cv_eventfd=no)) +if test x"$glib_cv_eventfd" = x"yes"; then + AC_DEFINE(HAVE_EVENTFD, 1, [we have the eventfd(2) system call]) +fi +AM_CONDITIONAL(HAVE_EVENTFD, [test "$glib_cv_eventfd" = "yes"]) + +dnl **************************************** +dnl *** GLib POLL* compatibility defines *** +dnl **************************************** + +glib_poll_includes=[" +#include +#include +"] + +AS_IF([ test $ac_cv_header_sys_types_h = yes && + test $ac_cv_header_sys_poll_h = yes ], [ + 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 +], [ + 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 +]) + +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=8.13 + +# Check if we should use the internal or the system-supplied pcre +AC_ARG_WITH(pcre, + [AS_HELP_STRING([--with-pcre=@<:@internal/system@:>@], + [whether to use system PCRE [default=internal]])]) + +AM_CONDITIONAL(USE_SYSTEM_PCRE, [test "x$with_pcre" = xsystem]) + +AS_IF([ test "x$with_pcre" = xsystem], [ + 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) +], [ + # If using gcc 4 pass -Wno-pointer-sign when compiling the internal PCRE + AS_IF([ test x"$GCC" = xyes], [ + 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" + ]) +]) +AC_SUBST(PCRE_WARN_CFLAGS) + +dnl ********************** +dnl *** Win32 API libs *** +dnl ********************** + +case $host in + *-*-cygwin*) + G_LIBS_EXTRA="-luser32 -lkernel32" + ;; + *-*-mingw*) + G_LIBS_EXTRA="-lws2_32 -lole32 -lwinmm -lshlwapi" + ;; + *) + 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 *** If we are cross-compiling, look for glib-genmarshal and *** +dnl *** glib-compile-schemas in PATH *** +dnl ****************************************************************** + +AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes) + +AS_IF([ test $cross_compiling = yes && test x$enable_modular_tests = xyes], [ + 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 + + AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas, no) + if test x$GLIB_COMPILE_SCHEMAS = xno; then + AC_MSG_ERROR(Could not find a glib-compile-schemas in your PATH) + fi + + AC_PATH_PROG(GLIB_COMPILE_RESOURCES, glib-compile-resources, no) + if test x$GLIB_COMPILE_RESOURCES = xno; then + AC_MSG_ERROR(Could not find a glib-compile-resources in your PATH) + fi +]) + +dnl ************************** +dnl *** Checks for gtk-doc *** +dnl ************************** +# gtkdocize greps for ^GTK_DOC_CHECK and parses it, so you need to have +# it on it's own line. +m4_ifdef([GTK_DOC_CHECK], [ +GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) +],[ +AM_CONDITIONAL([ENABLE_GTK_DOC],[false]) +]) + +AC_ARG_ENABLE(man, + [AS_HELP_STRING([--enable-man], + [generate man pages [default=auto]])],, + enable_man=maybe) + +AS_IF([test "$enable_man" != no], [ + AC_PATH_PROG([XSLTPROC], [xsltproc]) + AS_IF([test -z "$XSLTPROC"], [ + AS_IF([test "$enable_man" = yes], [ + AC_MSG_ERROR([xsltproc is required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AS_IF([ test "$enable_man" != no ], [ + dnl check for DocBook DTD in the local catalog + JH_CHECK_XML_CATALOG([-//OASIS//DTD DocBook XML V4.1.2//EN], + [DocBook XML DTD V4.1.2], [have_docbook_dtd=yes], [have_docbook_dtd=no]) + AS_IF([test "$have_docbook_dtd" != yes], [ + AS_IF([test "$enable_man" = yes ], [ + AC_MSG_ERROR([DocBook DTD is required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AS_IF([test "$enable_man" != no], [ + dnl check for DocBook XSL stylesheets in the local catalog + JH_CHECK_XML_CATALOG([http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl], + [DocBook XSL Stylesheets], [have_docbook_style=yes],[have_docbook_style=no]) + AS_IF([ test "$have_docbook_dtd" != yes ], [ + AS_IF([ test "$enable_man" = yes ], [ + AC_MSG_ERROR([DocBook XSL Stylesheets are required for --enable-man]) + ]) + enable_man=no + ]) +]) + +AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) + +AC_MSG_CHECKING([whether to generate man pages]) +AS_IF([ test "$enable_man" != no ], [ + AC_MSG_RESULT([yes]) +], [ + AC_MSG_RESULT([no]) +]) + +dnl +dnl Tracing +dnl + +AC_ARG_ENABLE([dtrace], + [AS_HELP_STRING([--enable-dtrace], + [include tracing support for dtrace])]) +have_dtrace=no +AC_MSG_CHECKING([whether to include dtrace tracing support]) +AS_IF([ test "x$enable_dtrace" != xno], [ + if test x$glib_have_carbon = xyes; then + AC_MSG_RESULT([no (not yet compatible with MacOS dtrace)]) + else + AC_MSG_RESULT([yes]) + AC_CHECK_PROGS(DTRACE, dtrace) + if test -z "$DTRACE"; then + if test "x$enable_dtrace" = xyes; then + AC_MSG_ERROR([dtrace not found]) + fi + else + AC_CHECK_HEADER([sys/sdt.h],have_dtrace=yes, + [if test "x$enable_dtrace" = xyes; then + AC_MSG_ERROR([dtrace support needs sys/sdt.h header]) + fi]) + fi + fi +], [ + AC_MSG_RESULT([no]) +]) +if test "x$have_dtrace" = xyes; then + AC_DEFINE([HAVE_DTRACE], [1], [Define to 1 if using dtrace probes.]) +fi +AM_CONDITIONAL([ENABLE_DTRACE], [test x$have_dtrace = xyes ]) + +AC_MSG_CHECKING([whether to include systemtap tracing support]) +AC_ARG_ENABLE([systemtap], + [AS_HELP_STRING([--enable-systemtap], + [include tracing support for systemtap])]) +have_systemtap=no +if test "x$enable_systemtap" != xno -a "x$have_dtrace" = xyes; then + have_systemtap=yes +fi +AC_MSG_RESULT(${have_systemtap}) + +AM_CONDITIONAL([ENABLE_SYSTEMTAP], [test x$have_systemtap = xyes]) + +AC_ARG_WITH([tapset-install-dir], + AS_HELP_STRING([--with-tapset-install-dir=DIR], + [path where systemtap tapsets are installed [DATADIR/systemtap/tapset]]), + [if test "x${withval}" = x; then + ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset" + else + ABS_TAPSET_DIR="${withval}" + fi], + [ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"]) +AC_SUBST(ABS_TAPSET_DIR) + +dnl ************************************ +dnl *** Enable lcov coverage reports *** +dnl ************************************ + +AC_ARG_ENABLE(gcov, + AS_HELP_STRING([--enable-gcov], + [enable coverage testing with gcov]), + [use_gcov=$enableval], [use_gcov=no]) + +AS_IF([ test "x$use_gcov" = "xyes"], [ + dnl we need gcc: + if test "$GCC" != "yes"; then + AC_MSG_ERROR([GCC is required for --enable-gcov]) + fi + + dnl Check if ccache is being used + AC_CHECK_PROG(SHTOOL, shtool, shtool) + case `$SHTOOL path $CC` in + *ccache*[)] gcc_ccache=yes;; + *[)] gcc_ccache=no;; + esac + + if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then + AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.]) + fi + + ltp_version_list="1.6 1.7 1.8 1.9" + AC_CHECK_PROG(LTP, lcov, lcov) + AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) + + AS_IF([ test "$LTP" ], [ + AC_CACHE_CHECK([for ltp version], glib_cv_ltp_version, [ + glib_cv_ltp_version=invalid + ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` + for ltp_check_version in $ltp_version_list; do + if test "$ltp_version" = "$ltp_check_version"; then + glib_cv_ltp_version="$ltp_check_version (ok)" + fi + done + ]) + ], [ + ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list" + AC_MSG_ERROR([$ltp_msg]) + ]) + + case $glib_cv_ltp_version in + ""|invalid[)] + ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)." + AC_MSG_ERROR([$ltp_msg]) + LTP="exit 0;" + ;; + esac + + if test -z "$LTP_GENHTML"; then + AC_MSG_ERROR([Could not find genhtml from the LTP package]) + fi + + dnl Remove all optimization flags from CFLAGS + changequote({,}) + CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` + changequote([,]) + + dnl Add the special gcc flags + CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage" + LDFLAGS="$LDFLAGS -lgcov" +]) + +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 "glib/glibconfig.h" as an argument. +AC_CONFIG_COMMANDS([glib/glibconfig.h], +[ + outfile=glib/glibconfig.h-tmp + cat > $outfile <<\_______EOF +/* glibconfig.h + * + * This is a generated file. Please modify 'configure.ac' + */ + +#ifndef __GLIBCONFIG_H__ +#define __GLIBCONFIG_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 + cat >>$outfile <<_______EOF +#define G_THREADS_ENABLED +#define G_THREADS_IMPL_$g_threads_impl_def +_______EOF + + if test x"$g_memory_barrier_needed" != xno; then + echo >>$outfile + echo "#define G_ATOMIC_OP_MEMORY_BARRIER_NEEDED 1" >>$outfile + fi + if test x"$g_atomic_lock_free" = xyes; then + echo >>$outfile + echo "#define G_ATOMIC_LOCK_FREE" >>$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" + +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 glib/glibconfig.h; then + AC_MSG_NOTICE([glib/glibconfig.h is unchanged]) + rm -f $outfile + else + mv $outfile glib/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='(gint)' + glib_gpui_cast='(guint)' + ;; +$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 + +# If a family is not found on the system, define that family to +# a negative value, picking a different one for each undefined +# family (-1 for AF_UNIX, -2 for the next one, -3 ...) +# This is needed because glib-mkenums doesn't handle optional +# values in enums, and thus we have to have all existing values +# defined in the enum. +if test "x$glib_cv_value_AF_UNIX" != "x"; then + g_af_unix=$glib_cv_value_AF_UNIX +else + g_af_unix=-1 +fi +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 + +g_threads_impl_def=$g_threads_impl + +g_atomic_lock_free="$glib_cv_g_atomic_lock_free" +g_memory_barrier_needed="$glib_memory_barrier_needed" +g_gcc_atomic_ops="$glib_cv_gcc_has_builtin_atomic_operations" + +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 +]) + +# Redo enough to get guint32 and guint64 for the alignment checks below +case 4 in +$ac_cv_sizeof_short) + gint32=short + ;; +$ac_cv_sizeof_int) + gint32=int + ;; +$ac_cv_sizeof_long) + gint32=long + ;; +esac +case 8 in +$ac_cv_sizeof_int) + gint64=int + ;; +$ac_cv_sizeof_long) + gint64=long + ;; +$ac_cv_sizeof_long_long) + gint64='long long' + ;; +$ac_cv_sizeof___int64) + gint64='__int64' + ;; +esac + +AC_CHECK_TYPE([guint32],,,[typedef unsigned $gint32 guint32;]) +AC_CHECK_ALIGNOF([guint32], [AC_INCLUDES_DEFAULT +typedef unsigned $gint32 guint32;]) +AC_CHECK_TYPE([guint64],,,[typedef unsigned $gint64 guint64;]) +AC_CHECK_ALIGNOF([guint64], [AC_INCLUDES_DEFAULT +typedef unsigned $gint64 guint64;]) +AC_CHECK_TYPE([unsigned long]) +AC_CHECK_ALIGNOF([unsigned long]) + +# Check for libdbus1 - Optional - is only used in the GDBus test cases +# +# 1.2.14 required for dbus_message_set_serial +AS_IF([ test x$enable_modular_tests = xyes], [ + PKG_CHECK_MODULES(DBUS1, + dbus-1 >= 1.2.14, + [AC_DEFINE(HAVE_DBUS1, 1, [Define if dbus-1 is available]) have_dbus1=yes], + have_dbus1=no) + AC_SUBST(DBUS1_CFLAGS) + AC_SUBST(DBUS1_LIBS) +]) +AM_CONDITIONAL(HAVE_DBUS1, [test "x$have_dbus1" = "xyes"]) + +AC_CHECK_PROGS([DBUS_DAEMON], [dbus-daemon]) +AM_CONDITIONAL([HAVE_DBUS_DAEMON], [test x$DBUS_DAEMON = xdbus-daemon ]) + +dnl +dnl Check for -Bsymbolic-functions linker flag used to avoid +dnl intra-library PLT jumps, if available. +dnl + +AC_ARG_ENABLE(Bsymbolic, + [AS_HELP_STRING([--disable-Bsymbolic], + [avoid linking with -Bsymbolic])],, + [SAVED_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([for -Bsymbolic-functions linker flag]) + LDFLAGS=-Wl,-Bsymbolic-functions + AC_TRY_LINK([], [int main (void) { return 0; }], + AC_MSG_RESULT(yes) + enable_Bsymbolic=yes, + AC_MSG_RESULT(no) + enable_Bsymbolic=no) + LDFLAGS="${SAVED_LDFLAGS}"]) + +if test "x${enable_Bsymbolic}" = "xyes"; then + GLIB_LINK_FLAGS=-Wl,-Bsymbolic-functions +fi + +AC_SUBST(GLIB_LINK_FLAGS) + +dnl +dnl Check for -fvisibility=hidden to determine if we can do GNU-style +dnl visibility attributes for symbol export control +dnl +GLIB_HIDDEN_VISIBILITY_CFLAGS="" +case "$host" in + *-*-mingw*) + dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport) + AC_DEFINE([_GLIB_EXTERN], [__attribute__((visibility("default"))) __declspec(dllexport) extern], + [defines how to decorate public symbols while building]) + CFLAGS="${CFLAGS} -fvisibility=hidden" + ;; + *) + dnl on other compilers, check if we can do -fvisibility=hidden + SAVED_CFLAGS="${CFLAGS}" + CFLAGS="-fvisibility=hidden" + AC_MSG_CHECKING([for -fvisibility=hidden compiler flag]) + AC_TRY_COMPILE([], [int main (void) { return 0; }], + AC_MSG_RESULT(yes) + enable_fvisibility_hidden=yes, + AC_MSG_RESULT(no) + enable_fvisibility_hidden=no) + CFLAGS="${SAVED_CFLAGS}" + + AS_IF([test "${enable_fvisibility_hidden}" = "yes"], [ + AC_DEFINE([_GLIB_EXTERN], [__attribute__((visibility("default"))) extern], + [defines how to decorate public symbols while building]) + GLIB_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden" + ]) + ;; +esac +AC_SUBST(GLIB_HIDDEN_VISIBILITY_CFLAGS) + +dnl Compiler flags; macro originates from systemd +dnl See https://bugzilla.gnome.org/show_bug.cgi?id=608953 +CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\ + -Wall -Wstrict-prototypes -Werror=declaration-after-statement \ + -Werror=missing-prototypes -Werror=implicit-function-declaration \ + -Werror=pointer-arith -Werror=init-self -Werror=format-security \ + -Werror=format=2 -Werror=missing-include-dirs]) +CFLAGS="$with_cflags $CFLAGS" + +# +# Define variables corresponding to the correct include paths to use for +# in-tree building. +# + +# for config.h: +config_h_INCLUDES='-I$(top_builddir)' +AC_SUBST(config_h_INCLUDES) + +# glib: +# config.h +# $(top_builddir)/glib: for glibconfig.h +# $(top_srcdir)/glib: for glib.h +# $(top_srcdir): for everything +glib_INCLUDES='$(config_h_INCLUDES) -I$(top_builddir)/glib -I$(top_srcdir)/glib -I$(top_srcdir)' +AC_SUBST(glib_INCLUDES) + +# gobject: +# same as glib +gobject_INCLUDES='$(glib_INCLUDES)' +AC_SUBST(gobject_INCLUDES) + +# gmodule: +# glib includes +# $(top_srcdir)/gmodule: for gmodule.h +gmodule_INCLUDES='$(glib_INCLUDES) -I$(top_srcdir)/gmodule' +AC_SUBST(gmodule_INCLUDES) + +# gio: +# same as gmodule +gio_INCLUDES='$(gmodule_INCLUDES)' +AC_SUBST(gio_INCLUDES) + + +AC_CONFIG_FILES([ +glib-2.0.pc +gmodule-2.0.pc +gmodule-export-2.0.pc +gmodule-no-export-2.0.pc +gthread-2.0.pc +gobject-2.0.pc +gio-2.0.pc +gio-unix-2.0.pc +gio-windows-2.0.pc +glib-zip +glib-gettextize +Makefile +build/Makefile +build/win32/Makefile +build/win32/dirent/Makefile +build/win32/vs9/Makefile +build/win32/vs10/Makefile +build/win32/vs11/Makefile +glib/Makefile +glib/glib.stp +glib/libcharset/Makefile +glib/gnulib/Makefile +glib/pcre/Makefile +glib/update-pcre/Makefile +glib/tests/Makefile +gmodule/Makefile +gmodule/gmoduleconf.h +gobject/Makefile +gobject/gobject.stp +gobject/glib-mkenums +gobject/tests/Makefile +gthread/Makefile +gio/Makefile +gio/gdbus-2.0/codegen/Makefile +gio/gdbus-2.0/codegen/config.py +gio/gnetworking.h +gio/xdgmime/Makefile +gio/inotify/Makefile +gio/kqueue/Makefile +gio/fen/Makefile +gio/fam/Makefile +gio/win32/Makefile +gio/tests/Makefile +gio/tests/gdbus-object-manager-example/Makefile +gio/tests/services/Makefile +gio/tests/services/org.gtk.GDBus.Examples.ObjectManager.service +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/gdbus-object-manager-example/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 + glib/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/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/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/.gitignore b/docs/reference/.gitignore new file mode 100644 index 0000000..f9e370e --- /dev/null +++ b/docs/reference/.gitignore @@ -0,0 +1,16 @@ +*-decl-list.txt +*-decl.txt +*-unused.txt +*-undocumented.txt +*-undeclared.txt +*.args +*.hierarchy +*.interfaces +*.prerequisites +*.signals +*.stamp +html +xml +*.bak +version.xml +*.1 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/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/.gitignore b/docs/reference/gio/.gitignore new file mode 100644 index 0000000..e9e522e --- /dev/null +++ b/docs/reference/gio/.gitignore @@ -0,0 +1,3 @@ +*.1 +gio-overrides.txt +tmpl diff --git a/docs/reference/gio/Makefile.am b/docs/reference/gio/Makefile.am new file mode 100644 index 0000000..99606d3 --- /dev/null +++ b/docs/reference/gio/Makefile.am @@ -0,0 +1,179 @@ +include $(top_srcdir)/Makefile.decl +NULL = + +SUBDIRS = gdbus-object-manager-example + +# 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" \ + --ignore-decorators="G_GNUC_WARN_UNUSED_RESULT" + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=$(top_srcdir)/gio + +BUILT_HFILES=gioenumtypes.h +HFILE_GLOB=$(top_srcdir)/gio/*.h +CFILE_GLOB=$(top_srcdir)/gio/*.c + +IGNORE_HFILES = \ + fam \ + fen \ + gdbus-2.0 \ + gvdb \ + inotify \ + libasyncns \ + tests \ + win32 \ + xdgmime \ + gapplicationimpl.h \ + gasynchelper.h \ + gcontenttypeprivate.h \ + gdbusauth.h \ + gdbusauthmechanismanon.h \ + gdbusauthmechanismexternal.h \ + gdbusauthmechanism.h \ + gdbusauthmechanismsha1.h \ + gdbusprivate.h \ + gdelayedsettingsbackend.h \ + gdummyfile.h \ + gdummyproxyresolver.h \ + gdummytlsbackend.h \ + gfileattribute-priv.h \ + gfileinfo-priv.h \ + giomodule-priv.h \ + glocaldirectorymonitor.h \ + glocalfileenumerator.h \ + glocalfile.h \ + glocalfileinfo.h \ + glocalfileinputstream.h \ + glocalfileiostream.h \ + glocalfilemonitor.h \ + glocalfileoutputstream.h \ + glocalvfs.h \ + gmountprivate.h \ + gnativevolumemonitor.h \ + gnetworkingprivate.h \ + gnetworkmonitorbase.h \ + gnetworkmonitornetlink.h \ + gpollfilemonitor.h \ + gregistrysettingsbackend.h \ + gsettingsbackendinternal.h \ + gsettings-mapping.h \ + gsettingsschema-internal.h \ + gsocketinputstream.h \ + gsocketoutputstream.h \ + gsocks4aproxy.h \ + gsocks4proxy.h \ + gsocks5proxy.h \ + gthreadedresolver.h \ + gunionvolumemonitor.h \ + gunixmount.h \ + gunixresolver.h \ + gunixvolume.h \ + gunixvolumemonitor.h \ + gwin32appinfo.h \ + gwin32mount.h \ + gwin32resolver.h \ + gwin32volumemonitor.h + + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +AM_CPPFLAGS = \ + $(gio_INCLUDES) \ + $(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 tests' + +# Images to copy into HTML directory +HTML_IMAGES = \ + gvfs-overview.png \ + menu-example.png \ + menu-model.png + +content_files = \ + version.xml \ + overview.xml \ + migrating-posix.xml \ + migrating-gnome-vfs.xml \ + migrating-gconf.xml \ + migrating-gdbus.xml \ + gio-querymodules.xml \ + glib-compile-schemas.xml\ + glib-compile-resources.xml \ + gsettings.xml \ + gresource.xml \ + gdbus.xml \ + gdbus-codegen.xml \ + $(NULL) + +expand_content_files = \ + overview.xml \ + migrating-posix.xml \ + migrating-gnome-vfs.xml \ + migrating-gconf.xml \ + migrating-gdbus.xml \ + gdbus-codegen.xml \ + $(NULL) + +extra_files = \ + version.xml.in \ + gvfs-overview.odg + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS=--extra-dir=$(srcdir)/../glib/html --extra-dir=$(srcdir)/../gobject/html + +include $(top_srcdir)/gtk-doc.make + +EXTRA_DIST += \ + version.xml.in + +man_MANS = + +if ENABLE_MAN + +man_MANS += \ + gio-querymodules.1 \ + glib-compile-schemas.1 \ + glib-compile-resources.1 \ + gsettings.1 \ + gresource.1 \ + gdbus.1 \ + gdbus-codegen.1 + +XSLTPROC_FLAGS = \ + --nonet \ + --stringparam man.output.quietly 1 \ + --stringparam funcsynopsis.style ansi \ + --stringparam man.th.extra1.suppress 1 \ + --stringparam man.authors.section.enabled 0 \ + --stringparam man.copyright.section.enabled 0 + +.xml.1: + $(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +CLEANFILES ?= +CLEANFILES += $(man_MANS) + +EXTRA_DIST += $(man_MANS) + +dist-hook-local: all-local + +gio-docs-clean: clean + cd $(srcdir) && rm -rf xml html diff --git a/docs/reference/gio/gdbus-codegen.xml b/docs/reference/gio/gdbus-codegen.xml new file mode 100644 index 0000000..babbca2 --- /dev/null +++ b/docs/reference/gio/gdbus-codegen.xml @@ -0,0 +1,853 @@ + + + + gdbus + GIO + + + Developer + David + Zeuthen + zeuthen@gmail.com + + + + + + gdbus-codegen + 1 + User Commands + + + + gdbus-codegen + D-Bus code and documentation generator + + + + + gdbus-codegen + org.project.Prefix + OUTFILES + YourProject + + OUTFILES + + + + ELEMENT + KEY + VALUE + + + FILE + + FILE + + + + + + Description + + gdbus-codegen is used to generate code and/or + documentation for one or more D-Bus interfaces. The tool reads + D-Bus + Introspection XML files and generates output files. The + tool currently supports generating C code (via + ) and Docbook XML (via + ). + + + + + Generating C code + + When generating C code, a + #GInterface-derived type is generated for each D-Bus + interface. Additionally, for every generated type, + FooBar, two concrete instantiable types, + FooBarProxy and FooBarSkeleton, implementing + said interface are also generated. The former is derived from + #GDBusProxy and intended for use on the client side + while the latter is derived from the + #GDBusInterfaceSkeleton type making it easy to export on a + #GDBusConnection either directly or via a + #GDBusObjectManagerServer instance. + + + The name of each generated C type is derived from the D-Bus + interface name stripped with the prefix given with + and with the dots removed and + initial characters capitalized. For example, for the D-Bus + interface com.acme.Coyote the name used is + ComAcmeCoyote. For the D-Bus interface + org.project.Bar.Frobnicator with + + org.project., the name used is + BarFrobnicator. + + + For methods, signals and properties, if not specified, the name + defaults to the name of the method, signal or property. + + + Two forms of the name are used - the CamelCase form and the + lower-case form. The CamelCase form is used for the #GType and + struct name, while lower-case form is used in function names. The + lower-case form is calculated by converting from CamelCase to + lower-case and inserting underscores at word boundaries (using + certain heuristics). + + + If the value given by the org.gtk.GDBus.C.Name + annotation or the option contains + an underscore (sometimes called Ugly_Case), + then the camel-case name is derived by removing all underscores, + and the lower-case name is derived by lower-casing the + string. This is useful in some situations where abbreviations are + used. For example, if the annotation is used on the interface + net.MyCorp.MyApp.iSCSITarget with the value + iSCSI_Target the CamelCase form is + iSCSITarget while the lower-case form is + iscsi_target. If the annotation is used on the + method EjectTheiPod with the value + Eject_The_iPod, the lower-case form is + eject_the_ipod. + + + + + Generating Docbook documentation + + Each generated Docbook XML file (see the + option for details) is a RefEntry + article describing the D-Bus interface. + + + + + Options + + The following options are supported: + + + + + org.project.Prefix. + + + A prefix to strip from all D-Bus interface names when + calculating the typename for the C binding and the Docbook + sortas + attribute. + + + + + + OUTFILES + + + Generate Docbook Documentation for each D-Bus interface and + put it in OUTFILES-NAME.xml where + NAME is a place-holder for the interface + name, e.g. net.Corp.FooBar and so on. + + + + + + OUTFILES + + + Generate C code for all D-Bus interfaces and put it in + OUTFILES.c and + OUTFILES.h. + + + + + + YourProject + + + The namespace to use for generated C code. This is expected + to be in CamelCase + or Ugly_Case (see above). + + + + + + + + + If this option is passed, suitable #GDBusObject, + #GDBusObjectProxy, #GDBusObjectSkeleton and + #GDBusObjectManagerClient subclasses are generated. + + + + + + ELEMENT KEY VALUE + + + Used to inject D-Bus annotations into the given XML + files. It can be used with interfaces, methods, signals, + properties and arguments in the following way: + + + + Any UTF-8 string can be used for KEY and VALUE. + + + + + + + + + Supported D-Bus Annotations + + The following D-Bus annotations are supported by + gdbus-codegen: + + + + + + org.freedesktop.DBus.Deprecated + + + Can be used on any <interface>, + <method>, + <signal> and + <property> element to specify that + the element is deprecated if its value is + true. Note that this annotation is + defined in the D-Bus + specification and can only assume the values + true and false. In + particular, you cannot specify the version that the element + was deprecated in nor any helpful deprecation message. Such + information should be added to the element documentation + instead. + + + When generating C code, this annotation is used to add + #G_GNUC_DEPRECATED to generated functions for the element. + + + When generating Docbook XML, a deprecation warning will + appear along the documentation for the element. + + + + + + org.gtk.GDBus.Since + + + Can be used on any <interface>, + <method>, + <signal> and + <property> element to specify the + version (any free-form string but compared using a + version-aware sort function) the element appeared in. + + + When generating C code, this field is used to ensure + function pointer order for preserving ABI/API, see . + + + When generating Docbook XML, the value of this tag appears + in the documentation. + + + + + + org.gtk.GDBus.DocString + + + A string with Docbook content for documentation. This annotation can + be used on <interface>, + <method>, + <signal>, + <property> and + <arg> elements. + + + + + + org.gtk.GDBus.DocString.Short + + + A string with Docbook content for short/brief + documentation. This annotation can only be used on + <interface> elements. + + + + + + org.gtk.GDBus.C.Name + + + Can be used on any <interface>, + <method>, + <signal> and + <property> element to specify the + name to use when generating C code. The value is expected to + be in CamelCase + or Ugly_Case (see above). + + + + + + org.gtk.GDBus.C.ForceGVariant + + + If set to a non-empty string, a #GVariant instance will + be used instead of the natural C type. This annotation can + be used on any <arg> and + <property> element. + + + + + + org.gtk.GDBus.C.UnixFD + + + If set to a non-empty string, the generated code will + include parameters to exchange file descriptors using the + #GUnixFDList type. This annotation can be used on + <method> elements. + + + + + + + + As an easier alternative to using the + org.gtk.GDBus.DocString annotation, note that + parser used by gdbus-codegen parses XML + comments in a way similar to gtk-doc: +longer description. + + This is a new paragraph. +--> + + + + + + + + + + + + + + + + +]]> + + + Note that can be used in any inline + documentation bit (e.g. for interfaces, methods, signals and + properties) to set the org.gtk.GDBus.Since + annotation. For the org.gtk.GDBus.DocString + annotation (and inline comments), note that substrings of the form + , + , + and + are all + expanded to links to the respective interface, method, signal and + property. + Additionally, substrings starting with @ and % characters are rendered as + parameter and + constant respectively. + + + If both XML comments and + org.gtk.GDBus.DocString or + org.gtk.GDBus.DocString.Short annotations are + present, the latter wins. + + + + + Example + + Consider the following D-Bus Introspection XML. + + + + + + + + + + + + + + + + + +]]> + + + If gdbus-codegen is used on this file like this: + + + + two files called + myapp-generated.[ch] are + generated. The files provide an abstract + #GTypeInterface-derived type called + MyAppFrobber as well as two instantiable types with + the same name but suffixed with Proxy and + Skeleton. The generated file, roughly, contains the + following facilities: + + + + Thus, for every D-Bus method, there will be three C functions for + calling the method, one #GObject signal for handling an incoming + call and one C function for completing an incoming call. For every + D-Bus signal, there's one #GObject signal and one C function for + emitting it. For every D-Bus property, two C functions are + generated (one setter, one getter) and one #GObject property. The + following table summarizes the generated facilities and where they + are applicable: + + + + + + + Client + Server + + + + + Types + Use MyAppFrobberProxy + Any type implementing the MyAppFrobber interface + + + Methods + Use m_a_f_hello_world() to call. + Receive via the handle_hello_world() signal handler. Complete the call with m_a_f_complete_hello_world() + + + Signals + Connect to the ::notification GObject signal. + Use m_a_f_emit_notification() to emit signal. + + + Properties (Reading) + Use m_a_f_get_verbose() or :verbose. + Implement #GObject's get_property() vfunc. + + + Properties (writing) + Use m_a_f_set_verbose() or :verbose. + Implement #GObject's set_property() vfunc. + + + + + + + Client-side usage + + You can use the generated proxy type with the generated + constructors: + + + + Instead of using the generic #GDBusProxy facilities, one can use + the generated methods such as + my_app_frobber_call_hello_world() to invoke + the net.Corp.MyApp.Frobber.HelloWorld() + D-Bus method, connect to the the + ::notification GObject signal to receive + the net.Corp.MyApp.Frobber::Notication + D-Bus signal and get/set the + net.Corp.MyApp.Frobber:Verbose D-Bus + Property using either the GObject property + :verbose or the + my_app_get_verbose() and + my_app_set_verbose() methods. Use the + standard #GObject::notify signal to listen to property changes. + + + Note that all property access is via #GDBusProxy's + property cache so no I/O is ever done when reading properties. + Also note that setting a property will cause the + org.freedesktop.DBus.Properties.Set method to be + called on the remote object. This call, however, is asynchronous + so setting a property won't block. Further, the change is + delayed and no error checking is possible. + + + + + Server-side usage + + The generated MyAppFrobber interface is designed so + it is easy to implement it in a #GObject + subclass. For example, to handle + HelloWorld() method invocations, set the + vfunc for handle_hello_hello_world() in the + MyAppFrobberIface structure. Similary, to handle + the net.Corp.MyApp.Frobber:Verbose + property override the :verbose #GObject + property from the subclass. To emit a signal, use + e.g. my_app_emit_signal() or + g_signal_emit_by_name(). + + + Instead of subclassing, it is often easier to use the generated + MyAppFrobberSkeleton subclass. To handle incoming + method calls, use g_signal_connect() with + the ::handle-* signals and instead of + overriding #GObject's + get_property() and + set_property() vfuncs, use + g_object_get() and + g_object_set() or the generated property + getters and setters (the generated class has an internal + property bag implementation). + + + + To facilitate atomic changesets (multiple properties changing at + the same time), #GObject::notify signals are queued up when + received. The queue is drained in an idle handler (which is called from the + thread-default main loop + of the thread where the skeleton object was + contructed) and will cause emissions of the org.freedesktop.DBus.Properties::PropertiesChanged + signal with all the properties that have changed. Use + g_dbus_interface_skeleton_flush() or + g_dbus_object_skeleton_flush() to empty the queue + immediately. Use g_object_freeze_notify() and + g_object_thaw_notify() for atomic changesets if on a different + thread. + + + + + + C Type Mapping + + Scalar types + (type-strings + 'b', + 'y', + 'n', + 'q', + 'i', + 'u', + 'x', + 't' and + 'd') + ), + strings (type-strings + 's', + 'ay', + 'o' and + 'g') and + arrays of string (type-strings + 'as', + 'ao' and + 'aay') + are mapped to the natural types, + e.g. #gboolean, #gdouble, #gint, gchar*, + gchar** and + so on. Everything else is mapped to the #GVariant + type. + + + This automatic mapping can be turned off by using the annotation + org.gtk.GDBus.C.ForceGVariant - if used then a + #GVariant is always exchanged instead of the + corresponding native C type. This annotation may be convenient to + use when using + bytestrings (type-string 'ay') + for data that could have embedded NUL bytes. + + + + + Stability Guarantees + + The generated C functions are guaranteed to not change their ABI + that is, if a method, signal or property does not change its + signature in the introspection XML, the generated C functions will + not change its C ABI either. + + + The ABI of the generated #GTypes will be preserved only if + the org.gtk.GDBus.Since annotation is used + judiciously — this is because the VTable for the #GInterface + relies on functions pointers for signal handlers. Specifically, if + a D-Bus method, property or signal or is added to a D-Bus + interface, then ABI of the generated #GInterface type is preserved + if, and only if, each added method, property signal is annotated + with they org.gtk.GDBus.Since annotation using + a greater version number than previous versions. + + + The generated C code currently happens to be annotated with gtk-doc / GObject + Introspection comments / annotations. The layout and + contents might change in the future so no guarantees about + e.g. SECTION usage etc. is given. + + + While the generated Docbook for D-Bus interfaces isn't expected to + change, no guarantees are given at this point. + + + + + Bugs + + Please send bug reports to either the distribution bug tracker + or the upstream bug tracker at + https://bugzilla.gnome.org/enter_bug.cgi?product=glib. + + + + + See also + + + gdbus1 + + + + + diff --git a/docs/reference/gio/gdbus-object-manager-example/.gitignore b/docs/reference/gio/gdbus-object-manager-example/.gitignore new file mode 100644 index 0000000..cc8a11d --- /dev/null +++ b/docs/reference/gio/gdbus-object-manager-example/.gitignore @@ -0,0 +1 @@ +gdbus-object-manager-example-overrides.txt diff --git a/docs/reference/gio/gdbus-object-manager-example/Makefile.am b/docs/reference/gio/gdbus-object-manager-example/Makefile.am new file mode 100644 index 0000000..53acd51 --- /dev/null +++ b/docs/reference/gio/gdbus-object-manager-example/Makefile.am @@ -0,0 +1,68 @@ +include $(top_srcdir)/Makefile.decl +NULL = + +# The name of the module. +DOC_MODULE=gdbus-object-manager-example + +# The top-level SGML file. +DOC_MAIN_SGML_FILE=gdbus-object-manager-example-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_builddir)/gio/tests/gdbus-object-manager-example + +HFILE_GLOB=$(top_builddir)/gio/tests/gdbus-object-manager-example/*.h +CFILE_GLOB=$(top_builddir)/gio/tests/gdbus-object-manager-example/*.c + +# Headers to ignore +IGNORE_HFILES = \ + $(NULL) + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +AM_CPPFLAGS = \ + $(gio_INCLUDES) \ + $(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 \ + $(top_builddir)/gio/tests/gdbus-object-manager-example/libgdbus-example-objectmanager.la \ + $(NULL) + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --output-format=xml --sgml-mode --name-space=g \ + $(NULL) + +# Images to copy into HTML directory +HTML_IMAGES = \ + $(NULL) + +content_files = \ + $(NULL) + +expand_content_files = \ + $(NULL) + +extra_files = \ + $(NULL) + +include $(top_srcdir)/gtk-doc.make + +EXTRA_DIST += \ + $(NULL) + +MAINTAINERCLEANFILES = $(BUILT_SOURCES) + +dist-hook-local: all-local + +gdbus-object-manager-example-docs-clean: clean + cd $(srcdir) && rm -rf xml html + +# Nuke installed docs (don't know how to avoid installing them) +install-data-hook : + rm -rf $(DESTDIR)$(datadir)/gtk-doc/html/gdbus-object-manager-example diff --git a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml new file mode 100644 index 0000000..7b0d1ca --- /dev/null +++ b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml @@ -0,0 +1,17 @@ + + +]> + + + foo + + bar + + + + + + + diff --git a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt new file mode 100644 index 0000000..1e3b8b8 --- /dev/null +++ b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt @@ -0,0 +1,161 @@ +
+ExampleAnimal +ExampleAnimal +ExampleAnimal +ExampleAnimalIface +example_animal_interface_info +example_animal_override_properties +example_animal_call_poke +example_animal_call_poke_finish +example_animal_call_poke_sync +example_animal_complete_poke +example_animal_emit_jumped +example_animal_get_mood +example_animal_get_foo +example_animal_get_bar +example_animal_dup_mood +example_animal_dup_foo +example_animal_dup_bar +example_animal_set_mood +example_animal_set_foo +example_animal_set_bar +ExampleAnimalProxy +ExampleAnimalProxyClass +example_animal_proxy_new +example_animal_proxy_new_finish +example_animal_proxy_new_sync +example_animal_proxy_new_for_bus +example_animal_proxy_new_for_bus_finish +example_animal_proxy_new_for_bus_sync +ExampleAnimalSkeleton +ExampleAnimalSkeletonClass +example_animal_skeleton_new + +example_animal_get_type +example_animal_proxy_get_type +example_animal_skeleton_get_type +ExampleAnimalSkeletonPrivate +ExampleAnimalProxyPrivate +EXAMPLE_TYPE_ANIMAL +EXAMPLE_TYPE_ANIMAL_PROXY +EXAMPLE_TYPE_ANIMAL_SKELETON +EXAMPLE_ANIMAL +EXAMPLE_ANIMAL_GET_IFACE +EXAMPLE_ANIMAL_PROXY +EXAMPLE_ANIMAL_PROXY_CLASS +EXAMPLE_ANIMAL_PROXY_GET_CLASS +EXAMPLE_ANIMAL_SKELETON +EXAMPLE_ANIMAL_SKELETON_CLASS +EXAMPLE_ANIMAL_SKELETON_GET_CLASS +EXAMPLE_IS_ANIMAL +EXAMPLE_IS_ANIMAL_PROXY +EXAMPLE_IS_ANIMAL_PROXY_CLASS +EXAMPLE_IS_ANIMAL_SKELETON +EXAMPLE_IS_ANIMAL_SKELETON_CLASS +
+ +
+ExampleCat +ExampleCat +ExampleCat +ExampleCatIface +example_cat_interface_info +example_cat_override_properties +ExampleCatProxy +ExampleCatProxyClass +example_cat_proxy_new +example_cat_proxy_new_finish +example_cat_proxy_new_sync +example_cat_proxy_new_for_bus +example_cat_proxy_new_for_bus_finish +example_cat_proxy_new_for_bus_sync +ExampleCatSkeleton +ExampleCatSkeletonClass +example_cat_skeleton_new + +example_cat_get_type +example_cat_proxy_get_type +example_cat_skeleton_get_type +ExampleCatProxyPrivate +ExampleCatSkeletonPrivate +EXAMPLE_TYPE_CAT +EXAMPLE_TYPE_CAT_PROXY +EXAMPLE_TYPE_CAT_SKELETON +EXAMPLE_CAT +EXAMPLE_CAT_GET_IFACE +EXAMPLE_CAT_PROXY +EXAMPLE_CAT_PROXY_CLASS +EXAMPLE_CAT_PROXY_GET_CLASS +EXAMPLE_CAT_SKELETON +EXAMPLE_CAT_SKELETON_CLASS +EXAMPLE_CAT_SKELETON_GET_CLASS +EXAMPLE_IS_CAT +EXAMPLE_IS_CAT_PROXY +EXAMPLE_IS_CAT_PROXY_CLASS +EXAMPLE_IS_CAT_SKELETON +EXAMPLE_IS_CAT_SKELETON_CLASS +
+ +
+ExampleObject +ExampleObject +ExampleObject +ExampleObjectIface +example_object_get_animal +example_object_get_cat +example_object_peek_animal +example_object_peek_cat +ExampleObjectProxy +ExampleObjectProxyClass +example_object_proxy_new +ExampleObjectSkeleton +ExampleObjectSkeletonClass +example_object_skeleton_new +example_object_skeleton_set_animal +example_object_skeleton_set_cat + +example_object_get_type +example_object_proxy_get_type +example_object_skeleton_get_type +ExampleObjectProxyPrivate +ExampleObjectSkeletonPrivate +EXAMPLE_IS_OBJECT +EXAMPLE_IS_OBJECT_PROXY +EXAMPLE_IS_OBJECT_PROXY_CLASS +EXAMPLE_IS_OBJECT_SKELETON +EXAMPLE_IS_OBJECT_SKELETON_CLASS +EXAMPLE_OBJECT +EXAMPLE_OBJECT_GET_IFACE +EXAMPLE_OBJECT_PROXY +EXAMPLE_OBJECT_PROXY_CLASS +EXAMPLE_OBJECT_PROXY_GET_CLASS +EXAMPLE_OBJECT_SKELETON +EXAMPLE_OBJECT_SKELETON_CLASS +EXAMPLE_OBJECT_SKELETON_GET_CLASS +EXAMPLE_TYPE_OBJECT +EXAMPLE_TYPE_OBJECT_PROXY +EXAMPLE_TYPE_OBJECT_SKELETON +
+ +
+ExampleObjectManagerClient +ExampleObjectManagerClient +ExampleObjectManagerClient +ExampleObjectManagerClientClass +example_object_manager_client_get_proxy_type +example_object_manager_client_new +example_object_manager_client_new_finish +example_object_manager_client_new_sync +example_object_manager_client_new_for_bus +example_object_manager_client_new_for_bus_finish +example_object_manager_client_new_for_bus_sync + +example_object_manager_client_get_type +EXAMPLE_IS_OBJECT_MANAGER_CLIENT +EXAMPLE_IS_OBJECT_MANAGER_CLIENT_CLASS +EXAMPLE_OBJECT_MANAGER_CLIENT +EXAMPLE_OBJECT_MANAGER_CLIENT_CLASS +EXAMPLE_OBJECT_MANAGER_CLIENT_GET_CLASS +EXAMPLE_TYPE_OBJECT_MANAGER_CLIENT +ExampleObjectManagerClientPrivate +
diff --git a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example.types b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example.types new file mode 100644 index 0000000..af1dfee --- /dev/null +++ b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example.types @@ -0,0 +1,10 @@ +example_object_get_type +example_object_proxy_get_type +example_object_skeleton_get_type +example_animal_get_type +example_animal_proxy_get_type +example_animal_skeleton_get_type +example_cat_get_type +example_cat_proxy_get_type +example_cat_skeleton_get_type +example_object_manager_client_get_type diff --git a/docs/reference/gio/gdbus.xml b/docs/reference/gio/gdbus.xml new file mode 100644 index 0000000..81682d9 --- /dev/null +++ b/docs/reference/gio/gdbus.xml @@ -0,0 +1,361 @@ + + + + gdbus + GIO + + + Developer + David + Zeuthen + zeuthen@gmail.com + + + + + + gdbus + 1 + User Commands + + + + gdbus + Tool for working with D-Bus objects + + + + + gdbus + introspect + + --system + --session + --address address + + --dest bus_name + --object-path /path/to/object + + --xml + + + --recurse + + + --only-properties + + + + gdbus + monitor + + --system + --session + --address address + + --dest bus_name + + --object-path /path/to/object + + + + gdbus + call + + --system + --session + --address address + + --dest bus_name + --object-path /path/to/object + --method org.project.InterfaceName.MethodName + + --timeout seconds + + ARG1 + ARG2 + + + gdbus + emit + + --system + --session + --address address + + --object-path /path/to/object + --signal org.project.InterfaceName.SignalName + + --dest unique_bus_name + + ARG1 + ARG2 + + + gdbus + help + + + + + Description + + gdbus is a simple tool for working with D-Bus objects. + + + + Commands + + + + + Prints out interfaces and property values for a remote object. + For this to work, the owner of the object needs to implement the + org.freedesktop.DBus.Introspectable interface. + If the option is used, the returned + introspection XML is printed, otherwise a parsed pretty + representation is printed. + The option can be used to + introspect children (and their children and so on) and the + option can be used to + only print the interfaces with properties. + + + + + + Monitors one or all objects owned by the owner of + bus_name. + + + + + + Invokes a method on a remote object. Each argument to pass to the + method must be specified as a serialized + GVariant except that strings do + not need explicit quotes. The return values are printed out as + serialized GVariant + values. + + + + + + Emits a signal. Each argument to include in the signal must be specified as a serialized + GVariant except that strings do + not need explicit quotes. + + + + + + Prints help and exit. + + + + + + + Bash Completion + + gdbus ships with a bash completion script to + complete commands, destinations, bus names, object paths and + interface/method names. + + + + + Examples + This shows how to introspect an object - note that the value of each + property is displayed: + +$ gdbus introspect --system \ + --dest org.freedesktop.NetworkManager \ + --object-path /org/freedesktop/NetworkManager/Devices/0 +node /org/freedesktop/NetworkManager/Devices/0 { + interface org.freedesktop.DBus.Introspectable { + methods: + Introspect(out s data); + }; + interface org.freedesktop.DBus.Properties { + methods: + Get(in s interface, + in s propname, + out v value); + Set(in s interface, + in s propname, + in v value); + GetAll(in s interface, + out a{sv} props); + }; + interface org.freedesktop.NetworkManager.Device.Wired { + signals: + PropertiesChanged(a{sv} arg_0); + properties: + readonly b Carrier = false; + readonly u Speed = 0; + readonly s HwAddress = '00:1D:72:88:BE:97'; + }; + interface org.freedesktop.NetworkManager.Device { + methods: + Disconnect(); + signals: + StateChanged(u arg_0, + u arg_1, + u arg_2); + properties: + readonly u DeviceType = 1; + readonly b Managed = true; + readwrite o Ip6Config = '/'; + readwrite o Dhcp4Config = '/'; + readwrite o Ip4Config = '/'; + readonly u State = 2; + readwrite u Ip4Address = 0; + readonly u Capabilities = 3; + readonly s Driver = 'e1000e'; + readwrite s Interface = 'eth0'; + readonly s Udi = '/sys/devices/pci0000:00/0000:00:19.0/net/eth0'; + }; +}; + + + The and options can be useful when wanting to inspect all objects owned by a particular process: + + +$ gdbus introspect --system --dest org.freedesktop.UPower --object-path / --recurse --only-properties +node / { + node /org { + node /org/freedesktop { + node /org/freedesktop/UPower { + interface org.freedesktop.UPower { + properties: + readonly b IsDocked = true; + readonly b LidForceSleep = false; + readonly b LidIsPresent = false; + readonly b LidIsClosed = false; + readonly b OnLowBattery = false; + readonly b OnBattery = false; + readonly b CanHibernate = true; + readonly b CanSuspend = true; + readonly s DaemonVersion = '0.9.10'; + }; + node /org/freedesktop/UPower/Policy { + }; + node /org/freedesktop/UPower/Wakeups { + interface org.freedesktop.UPower.Wakeups { + properties: + readonly b HasCapability = true; + }; + }; + }; + }; + }; +}; + + + In a similar fashion, the command can be + used to learn details about the Notify method: + + +[...] + interface org.freedesktop.Notifications { + methods: + GetServerInformation(out s return_name, + out s return_vendor, + out s return_version, + out s return_spec_version); + GetCapabilities(out as return_caps); + CloseNotification(in u id); + Notify(in s app_name, + in u id, + in s icon, + in s summary, + in s body, + in as actions, + in a{sv} hints, + in i timeout, + out u return_id); + }; +[...] + + + With this information, it's easy to use the + command to display a notification + + +$ gdbus call --session \ + --dest org.freedesktop.Notifications \ + --object-path /org/freedesktop/Notifications \ + --method org.freedesktop.Notifications.Notify \ + my_app_name \ + 42 \ + gtk-dialog-info \ + "The Summary" \ + "Here's the body of the notification" \ + [] \ + {} \ + 5000 +(uint32 12,) + + + Monitoring all objects on a service: + + +$ gdbus monitor --system --dest org.freedesktop.ConsoleKit +Monitoring signals from all objects owned by org.freedesktop.ConsoleKit +The name org.freedesktop.ConsoleKit is owned by :1.15 +/org/freedesktop/ConsoleKit/Session2: org.freedesktop.ConsoleKit.Session.ActiveChanged (false,) +/org/freedesktop/ConsoleKit/Seat1: org.freedesktop.ConsoleKit.Seat.ActiveSessionChanged ('',) +/org/freedesktop/ConsoleKit/Session2: org.freedesktop.ConsoleKit.Session.ActiveChanged (true,) +/org/freedesktop/ConsoleKit/Seat1: org.freedesktop.ConsoleKit.Seat.ActiveSessionChanged ('/org/freedesktop/ConsoleKit/Session2',) + + + Monitoring a single object on a service: + + +$ gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager/AccessPoint/4141 +Monitoring signals on object /org/freedesktop/NetworkManager/AccessPoint/4141 owned by org.freedesktop.NetworkManager +The name org.freedesktop.NetworkManager is owned by :1.5 +/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x5c>},) +/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x64>},) +/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x5e>},) +/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x64>},) + + + + Emitting a signal: + + +$ gdbus emit --session --object-path /foo --signal org.bar.Foo "['foo', 'bar', 'baz']" + + + + Emitting a signal to a specific process: + + +$ gdbus emit --session --object-path /bar --signal org.bar.Bar someString --dest :1.42 + + + + + + Bugs + + Please send bug reports to either the distribution bug tracker + or the upstream bug tracker at + . + + + + + See Also + + + dbus-send1 + + + + + + diff --git a/docs/reference/gio/gio-docs.xml b/docs/reference/gio/gio-docs.xml new file mode 100644 index 0000000..3c66dad --- /dev/null +++ b/docs/reference/gio/gio-docs.xml @@ -0,0 +1,306 @@ + + + +]> + +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 + + + + File-related Utilities + + + + Asynchronous I/O + + + + + + + + Data conversion + + + + + + + Streaming I/O + + + + + + + + + + + + + + + + + + + + + + + + + + + + File types and applications + + + + + + Volumes and Drives + + + + + + + + Icons + + + + + + + + + Failable Initialization + + + + + Low-level network support + + + + + + + + + + + + + + + + + High-level network functionallity + + + + + + + + + + + + TLS (SSL) support + + + + + + + + + + + + + DNS resolution + + + + + + + + + + Lowlevel D-Bus Support + + + + + + + + + + + + Highlevel D-Bus Support + + + + + + + + + + + + + + Settings + + + + + + Resources + + + + Permissions + + + + + Application support + + + + + + + + + + + + + + + + + Extending GIO + + + + + + GIO Tools + + + + + + + + + + GIO Testing + + + + + + Migrating to 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 + + + + Index of new symbols in 2.26 + + + + Index of new symbols in 2.28 + + + + Index of new symbols in 2.30 + + + + Index of new symbols in 2.32 + + + + Index of new symbols in 2.34 + + + + Index of new symbols in 2.36 + + + + + + diff --git a/docs/reference/gio/gio-querymodules.xml b/docs/reference/gio/gio-querymodules.xml new file mode 100644 index 0000000..c9c5eec --- /dev/null +++ b/docs/reference/gio/gio-querymodules.xml @@ -0,0 +1,45 @@ + + + + glib-compile-schemas + GIO + + + Developer + Alexander + Larsson + + + + + + gio-querymodules + 1 + User Commands + + + + gio-querymodules + GIO module cache creation + + + + + gio-querymodules + DIRECTORY + + + +Description +gio-querymodules creates a +giomodule.cache file in the listed directories. +This file lists the implemented extension points for each module +that has been found. It is used by GIO at runtime to avoid opening +all modules just to find out which extension points they are implementing. + + +GIO modules are usually installed in the gio/modules +subdirectory of libdir. + + + diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt new file mode 100644 index 0000000..03e8400 --- /dev/null +++ b/docs/reference/gio/gio-sections.txt @@ -0,0 +1,4024 @@ +
+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_new_for_commandline_arg_and_cwd +g_file_new_tmp +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_delete_async +g_file_delete_finish +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 +g_file_enumerator_get_child + +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_SYMBOLIC_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_USED +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_TRASH_DELETION_DATE +G_FILE_ATTRIBUTE_TRASH_ORIG_PATH +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_symbolic_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_get_deletion_date +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_symbolic_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_subtract +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 +g_file_attribute_matcher_to_string + +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_attribute_matcher_get_type + +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 +g_emblemed_icon_clear_emblems + +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 +g_input_stream_read_bytes +g_input_stream_read_bytes_async +g_input_stream_read_bytes_finish + +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 +
+ +
+gwin32inputstream +GWin32InputStream +GWin32InputStream +g_win32_input_stream_new +g_win32_input_stream_set_close_handle +g_win32_input_stream_get_close_handle +g_win32_input_stream_get_handle + +GWin32InputStreamClass +G_WIN32_INPUT_STREAM +G_IS_WIN32_INPUT_STREAM +G_TYPE_WIN32_INPUT_STREAM +G_WIN32_INPUT_STREAM_CLASS +G_IS_WIN32_INPUT_STREAM_CLASS +G_WIN32_INPUT_STREAM_GET_CLASS + +g_win32_input_stream_get_type +GWin32InputStreamPrivate +
+ +
+gmemoryinputstream +GMemoryInputStream +GMemoryInputStream +g_memory_input_stream_new +g_memory_input_stream_new_from_data +g_memory_input_stream_new_from_bytes +g_memory_input_stream_add_data +g_memory_input_stream_add_bytes + +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_utf8 +g_data_input_stream_read_line_async +g_data_input_stream_read_line_finish +g_data_input_stream_read_line_finish_utf8 +g_data_input_stream_read_upto +g_data_input_stream_read_upto_async +g_data_input_stream_read_upto_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 +g_output_stream_write_bytes +g_output_stream_write_bytes_async +g_output_stream_write_bytes_finish + +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_new_resizable +g_memory_output_stream_get_data +g_memory_output_stream_get_size +g_memory_output_stream_get_data_size +g_memory_output_stream_steal_data +g_memory_output_stream_steal_as_bytes + +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 +
+ +
+gwin32outputstream +GWin32OutputStream +GWin32OutputStream +g_win32_output_stream_new +g_win32_output_stream_set_close_handle +g_win32_output_stream_get_close_handle +g_win32_output_stream_get_handle + +GWin32OutputStreamClass +G_WIN32_OUTPUT_STREAM +G_IS_WIN32_OUTPUT_STREAM +G_TYPE_WIN32_OUTPUT_STREAM +G_WIN32_OUTPUT_STREAM_CLASS +G_IS_WIN32_OUTPUT_STREAM_CLASS +G_WIN32_OUTPUT_STREAM_GET_CLASS + +g_win32_output_stream_get_type +GWin32OutputStreamPrivate +
+ +
+giostream +GIOStream +GIOStreamSpliceFlags +GIOStream +g_io_stream_get_input_stream +g_io_stream_get_output_stream +g_io_stream_splice_async +g_io_stream_splice_finish +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_symbolic_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_mount_get_sort_key + +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_symbolic_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_IDENTIFIER_KIND_CLASS +g_volume_enumerate_identifiers +g_volume_get_identifier +g_volume_get_sort_key + +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_get_symbolic_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_get_sort_key + +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_source_new +GCancellableSourceFunc +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 + +GCancellablePrivate +g_cancellable_get_type +
+ +
+gasyncresult +GAsyncResult +GAsyncResult +GAsyncResultIface +GAsyncReadyCallback +g_async_result_get_user_data +g_async_result_get_source_object +g_async_result_is_tagged +g_async_result_legacy_propagate_error + +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_new_take_error +g_simple_async_result_set_check_cancellable +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_take_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 +g_simple_async_report_take_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_from_win32_error + +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_get_symbolic_icon +g_content_type_get_generic_icon_name +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_set_as_last_used_for_type +g_app_info_add_supports_type +g_app_info_can_remove_supports_type +g_app_info_remove_supports_type +g_app_info_get_supported_types +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_get_fallback_for_type +g_app_info_get_recommended_for_type +g_app_info_launch_default_for_uri +g_app_launch_context_setenv +g_app_launch_context_unsetenv +g_app_launch_context_get_environment +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_info_create_flags_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 +g_ask_password_flags_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 +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_symbolic_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_get_options +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_symbolic_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 + +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_unix_mount_monitor_get_type +
+ +
+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_get_nodisplay +g_desktop_app_info_get_show_in +g_desktop_app_info_get_generic_name +g_desktop_app_info_get_categories +g_desktop_app_info_get_keywords +g_desktop_app_info_get_startup_wm_class +g_desktop_app_info_set_desktop_env +g_desktop_app_info_get_string +g_desktop_app_info_get_boolean +g_desktop_app_info_has_key +GDesktopAppLaunchCallback +g_desktop_app_info_launch_uris_as_manager + +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 + +g_desktop_app_info_get_type +g_desktop_app_info_lookup_get_default_for_uri_scheme +g_desktop_app_info_lookup_get_type +
+ +
+giomodule +GIOModule +GIOModule +GIOModuleScope +GIOModuleScopeFlags +g_io_module_new +g_io_module_scope_block +g_io_module_scope_free +g_io_module_scope_new +g_io_modules_load_all_in_directory +g_io_modules_load_all_in_directory_with_scope +g_io_modules_scan_all_in_directory +g_io_modules_scan_all_in_directory_with_scope +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 +G_UNIX_FD_LIST_CLASS +G_IS_UNIX_FD_LIST +G_IS_UNIX_FD_LIST_CLASS +G_UNIX_FD_LIST_GET_CLASS +G_TYPE_UNIX_FD_LIST + +GUnixFDListPrivate +g_unix_fd_list_get_type +
+ +
+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_equal +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 +
+ +
+ginetaddressmask +GInetAddressMask +GInetAddressMask +g_inet_address_mask_new +g_inet_address_mask_new_from_string +g_inet_address_mask_to_string +g_inet_address_mask_get_family +g_inet_address_mask_get_address +g_inet_address_mask_get_length +g_inet_address_mask_matches +g_inet_address_mask_equal + +GInetAddressMaskClass +GInetAddressMaskPrivate +G_INET_ADDRESS_MASK +G_INET_ADDRESS_MASK_CLASS +G_INET_ADDRESS_MASK_GET_CLASS +G_IS_INET_ADDRESS_MASK +G_IS_INET_ADDRESS_MASK_CLASS +G_TYPE_INET_ADDRESS_MASK + +g_inet_address_mask_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 +g_inet_socket_address_get_flowinfo +g_inet_socket_address_get_scope_id + +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 +GUnixSocketAddressType +g_unix_socket_address_new +g_unix_socket_address_new_abstract +g_unix_socket_address_new_with_type +g_unix_socket_address_get_is_abstract +g_unix_socket_address_get_address_type +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_lookup_records +g_resolver_lookup_records_async +g_resolver_lookup_records_finish + + +G_RESOLVER_ERROR +GResolverError + + +GResolverClass +G_IS_RESOLVER +G_IS_RESOLVER_CLASS +G_RESOLVER +G_RESOLVER_CLASS +G_RESOLVER_GET_CLASS +G_TYPE_RESOLVER + + +GResolverPrivate +g_resolver_get_type +g_resolver_error_quark +g_resolver_record_type_get_type +
+ +
+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 +g_socket_connectable_proxy_enumerate + +GSocketAddressEnumerator +g_socket_address_enumerator_next +g_socket_address_enumerator_next_async +g_socket_address_enumerator_next_finish + +GProxyAddressEnumerator + +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 +GProxyAddressEnumeratorClass +G_IS_PROXY_ADDRESS_ENUMERATOR +G_IS_PROXY_ADDRESS_ENUMERATOR_CLASS +G_PROXY_ADDRESS_ENUMERATOR +G_PROXY_ADDRESS_ENUMERATOR_CLASS +G_PROXY_ADDRESS_ENUMERATOR_GET_CLASS +G_TYPE_PROXY_ADDRESS_ENUMERATOR + +GProxyAddressEnumeratorPrivate +g_proxy_address_enumerator_get_type +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_get_scheme +g_network_address_parse +g_network_address_parse_uri + +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 +g_network_service_get_scheme +g_network_service_set_scheme + +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_receive_with_blocking +g_socket_send +g_socket_send_to +g_socket_send_message +g_socket_send_with_blocking +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_condition_timed_wait +g_socket_get_available_bytes +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_timeout +g_socket_set_timeout +g_socket_set_ttl +g_socket_get_ttl +g_socket_get_broadcast +g_socket_set_broadcast +g_socket_get_option +g_socket_set_option +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 +g_socket_get_credentials + +g_socket_join_multicast_group +g_socket_leave_multicast_group +g_socket_get_multicast_loopback +g_socket_set_multicast_loopback +g_socket_get_multicast_ttl +g_socket_set_multicast_ttl + +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 +GSocketClientEvent +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_connect_to_uri +g_socket_client_connect_to_uri_async +g_socket_client_connect_to_uri_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_set_timeout +g_socket_client_set_enable_proxy +g_socket_client_set_proxy_resolver +g_socket_client_set_tls +g_socket_client_set_tls_validation_flags +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_get_timeout +g_socket_client_get_enable_proxy +g_socket_client_get_proxy_resolver +g_socket_client_get_tls +g_socket_client_get_tls_validation_flags +g_socket_client_add_application_proxy + +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_connect +g_socket_connection_connect_async +g_socket_connection_connect_finish + +g_socket_connection_is_connected +g_socket_connection_get_local_address +g_socket_connection_get_remote_address +g_socket_connection_get_socket + +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 + +GSocketConnectionPrivate +g_socket_connection_get_type +
+ +
+gunixconnection +GUnixConnection +GUnixConnection +g_unix_connection_receive_fd +g_unix_connection_send_fd +g_unix_connection_receive_credentials +g_unix_connection_receive_credentials_async +g_unix_connection_receive_credentials_finish +g_unix_connection_send_credentials +g_unix_connection_send_credentials_async +g_unix_connection_send_credentials_finish + +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 + +GUnixConnectionPrivate +g_unix_connection_get_type +
+ +
+gtcpconnection +GTcpConnection +GTcpConnection +g_tcp_connection_set_graceful_disconnect +g_tcp_connection_get_graceful_disconnect + +GTcpConnectionClass +G_IS_TCP_CONNECTION +G_IS_TCP_CONNECTION_CLASS +G_TYPE_TCP_CONNECTION +G_TCP_CONNECTION +G_TCP_CONNECTION_CLASS +G_TCP_CONNECTION_GET_CLASS + +GTcpConnectionPrivate +g_tcp_connection_get_type +
+ +
+gtcpwrapperconnection +GTcpWrapperConnection +GTcpWrapperConnection +g_tcp_wrapper_connection_new +g_tcp_wrapper_connection_get_base_io_stream + +GTcpWrapperConnectionClass +G_IS_TCP_WRAPPER_CONNECTION +G_IS_TCP_WRAPPER_CONNECTION_CLASS +G_TYPE_TCP_WRAPPER_CONNECTION +G_TCP_WRAPPER_CONNECTION +G_TCP_WRAPPER_CONNECTION_CLASS +G_TCP_WRAPPER_CONNECTION_GET_CLASS + +GTcpWrapperConnectionPrivate +g_tcp_wrapper_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_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 +GConverterFlags +g_converter_convert +g_converter_reset + +G_TYPE_CONVERTER +G_CONVERTER +G_IS_CONVERTER +G_CONVERTER_GET_IFACE + +g_converter_get_type +g_converter_flags_get_type +g_converter_result_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 +g_zlib_compressor_get_file_info +g_zlib_compressor_set_file_info + +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 +g_zlib_decompressor_get_file_info + +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 +
+ +
+gsettingsbackend +GSettingsBackend +GSettingsBackend +GSettingsBackendClass +G_SETTINGS_BACKEND_EXTENSION_POINT_NAME +g_settings_backend_get_default +g_settings_backend_changed +g_settings_backend_path_changed +g_settings_backend_keys_changed +g_settings_backend_path_writable_changed +g_settings_backend_writable_changed +g_settings_backend_changed_tree +g_settings_backend_flatten_tree +g_keyfile_settings_backend_new +g_memory_settings_backend_new +g_null_settings_backend_new + + +G_IS_SETTINGS_BACKEND +G_IS_SETTINGS_BACKEND_CLASS +G_SETTINGS_BACKEND +G_SETTINGS_BACKEND_CLASS +G_SETTINGS_BACKEND_GET_CLASS +G_TYPE_SETTINGS_BACKEND + + +g_settings_backend_get_type +GSettingsBackendPrivate +
+ +
+gsettingsschema +GSettingsSchema, GSettingsSchemaSource +GSettingsSchemaSource +G_TYPE_SETTINGS_SCHEMA_SOURCE +g_settings_schema_source_get_default +g_settings_schema_source_ref +g_settings_schema_source_unref + + +g_settings_schema_source_new_from_directory + + +g_settings_schema_source_lookup + + +GSettingsSchema +G_TYPE_SETTINGS_SCHEMA +g_settings_schema_ref +g_settings_schema_unref + + +g_settings_schema_get_id +g_settings_schema_get_path + + +g_settings_schema_get_type +g_settings_schema_source_get_type +
+ +
+gsettings +GSettings +GSettings +g_settings_new +g_settings_new_with_path +g_settings_new_with_backend +g_settings_new_with_backend_and_path +g_settings_new_full +g_settings_sync +g_settings_get_value +g_settings_set_value +g_settings_is_writable +g_settings_delay +g_settings_apply +g_settings_revert +g_settings_get_has_unapplied +g_settings_get_child +g_settings_reset + + +g_settings_list_schemas +g_settings_list_relocatable_schemas +g_settings_list_keys +g_settings_list_children +g_settings_get_range +g_settings_range_check + + +g_settings_get +g_settings_set +g_settings_get_boolean +g_settings_set_boolean +g_settings_get_int +g_settings_set_int +g_settings_get_uint +g_settings_set_uint +g_settings_get_double +g_settings_set_double +g_settings_get_string +g_settings_set_string +g_settings_get_strv +g_settings_set_strv +g_settings_get_enum +g_settings_set_enum +g_settings_get_flags +g_settings_set_flags + + +GSettingsGetMapping +g_settings_get_mapped + + +GSettingsBindFlags +g_settings_bind +g_settings_bind_with_mapping +g_settings_bind_writable +g_settings_unbind +GSettingsBindSetMapping +GSettingsBindGetMapping + + +g_settings_create_action + + +GSettingsClass +G_IS_SETTINGS +G_IS_SETTINGS_CLASS +G_SETTINGS +G_SETTINGS_CLASS +G_SETTINGS_GET_CLASS +G_TYPE_SETTINGS + + +GSettingsPrivate +g_settings_get_type +
+ +
+gunixcredentialsmessage +GUnixCredentialsMessage +GUnixCredentialsMessage +GUnixCredentialsMessageClass +g_unix_credentials_message_new +g_unix_credentials_message_new_with_credentials +g_unix_credentials_message_get_credentials +g_unix_credentials_message_is_supported + +G_IS_UNIX_CREDENTIALS_MESSAGE +G_IS_UNIX_CREDENTIALS_MESSAGE_CLASS +G_TYPE_UNIX_CREDENTIALS_MESSAGE +G_UNIX_CREDENTIALS_MESSAGE +G_UNIX_CREDENTIALS_MESSAGE_CLASS +G_UNIX_CREDENTIALS_MESSAGE_GET_CLASS + +GUnixCredentialsMessagePrivate +g_unix_credentials_message_get_type +
+ +
+gcredentials +GCredentials +GCredentials +GCredentialsType +g_credentials_new +g_credentials_to_string +g_credentials_get_native +g_credentials_set_native +g_credentials_is_same_user +g_credentials_get_unix_user +g_credentials_set_unix_user +g_credentials_get_unix_pid + +G_CREDENTIALS +G_IS_CREDENTIALS +G_TYPE_CREDENTIALS +G_CREDENTIALS_CLASS +G_IS_CREDENTIALS_CLASS +G_CREDENTIALS_GET_CLASS + +g_credentials_get_type +g_credentials_type_get_type +
+ +
+gdbusaddress +g_dbus_is_address +g_dbus_is_supported_address +g_dbus_address_get_stream +g_dbus_address_get_stream_finish +g_dbus_address_get_stream_sync +g_dbus_address_get_for_bus_sync +
+ +
+gdbusutils +g_dbus_generate_guid +g_dbus_is_guid +g_dbus_is_name +g_dbus_is_unique_name +g_dbus_is_member_name +g_dbus_is_interface_name +g_dbus_gvalue_to_gvariant +g_dbus_gvariant_to_gvalue +
+ +
+gdbusauthobserver +GDBusAuthObserver +GDBusAuthObserver +g_dbus_auth_observer_new +g_dbus_auth_observer_authorize_authenticated_peer +g_dbus_auth_observer_allow_mechanism + +G_DBUS_AUTH_OBSERVER +G_IS_DBUS_AUTH_OBSERVER +G_TYPE_DBUS_AUTH_OBSERVER + +g_dbus_auth_observer_get_type +
+ +
+gdbusserver +GDBusServer +GDBusServer +GDBusServerFlags +g_dbus_server_new_sync +g_dbus_server_start +g_dbus_server_stop +g_dbus_server_is_active +g_dbus_server_get_guid +g_dbus_server_get_flags +g_dbus_server_get_client_address + +G_DBUS_SERVER +G_IS_DBUS_SERVER +G_TYPE_DBUS_SERVER + +g_dbus_server_get_type +
+ +
+gdbusmessage +GDBusMessage +GDBusMessage +GDBusMessageType +GDBusMessageFlags +GDBusMessageHeaderField +GDBusMessageByteOrder +g_dbus_message_new +g_dbus_message_new_signal +g_dbus_message_new_method_call +g_dbus_message_new_method_reply +g_dbus_message_new_method_error +g_dbus_message_new_method_error_valist +g_dbus_message_new_method_error_literal +g_dbus_message_print +g_dbus_message_get_locked +g_dbus_message_lock +g_dbus_message_copy +g_dbus_message_get_byte_order +g_dbus_message_set_byte_order +g_dbus_message_get_message_type +g_dbus_message_set_message_type +g_dbus_message_get_serial +g_dbus_message_set_serial +g_dbus_message_get_flags +g_dbus_message_set_flags +g_dbus_message_get_body +g_dbus_message_set_body +g_dbus_message_get_unix_fd_list +g_dbus_message_set_unix_fd_list +g_dbus_message_get_num_unix_fds +g_dbus_message_set_num_unix_fds +g_dbus_message_get_header_fields +g_dbus_message_get_header +g_dbus_message_set_header +g_dbus_message_get_destination +g_dbus_message_set_destination +g_dbus_message_get_error_name +g_dbus_message_set_error_name +g_dbus_message_get_interface +g_dbus_message_set_interface +g_dbus_message_get_member +g_dbus_message_set_member +g_dbus_message_get_path +g_dbus_message_set_path +g_dbus_message_get_reply_serial +g_dbus_message_set_reply_serial +g_dbus_message_get_sender +g_dbus_message_set_sender +g_dbus_message_get_signature +g_dbus_message_set_signature +g_dbus_message_get_arg0 +g_dbus_message_to_blob +g_dbus_message_bytes_needed +g_dbus_message_new_from_blob +g_dbus_message_to_gerror + +G_DBUS_MESSAGE +G_IS_DBUS_MESSAGE +G_TYPE_DBUS_MESSAGE + +g_dbus_message_get_type +
+ +
+gdbusconnection +GDBusConnection +GBusType +g_bus_get +g_bus_get_finish +g_bus_get_sync +GDBusConnection +GDBusConnectionFlags +g_dbus_connection_new +g_dbus_connection_new_finish +g_dbus_connection_new_sync +g_dbus_connection_new_for_address +g_dbus_connection_new_for_address_finish +g_dbus_connection_new_for_address_sync +g_dbus_connection_start_message_processing +g_dbus_connection_close +g_dbus_connection_close_finish +g_dbus_connection_close_sync +g_dbus_connection_is_closed +g_dbus_connection_flush +g_dbus_connection_flush_finish +g_dbus_connection_flush_sync +g_dbus_connection_get_exit_on_close +g_dbus_connection_set_exit_on_close +g_dbus_connection_get_stream +g_dbus_connection_get_guid +g_dbus_connection_get_unique_name +GDBusCapabilityFlags +g_dbus_connection_get_capabilities +g_dbus_connection_get_peer_credentials +g_dbus_connection_get_last_serial +GDBusCallFlags +g_dbus_connection_call +g_dbus_connection_call_finish +g_dbus_connection_call_sync +g_dbus_connection_call_with_unix_fd_list +g_dbus_connection_call_with_unix_fd_list_finish +g_dbus_connection_call_with_unix_fd_list_sync +g_dbus_connection_emit_signal +GDBusSignalFlags +GDBusSignalCallback +g_dbus_connection_signal_subscribe +g_dbus_connection_signal_unsubscribe +GDBusSendMessageFlags +g_dbus_connection_send_message +g_dbus_connection_send_message_with_reply +g_dbus_connection_send_message_with_reply_finish +g_dbus_connection_send_message_with_reply_sync +GDBusMessageFilterFunction +g_dbus_connection_add_filter +g_dbus_connection_remove_filter +GDBusInterfaceVTable +GDBusInterfaceMethodCallFunc +GDBusInterfaceGetPropertyFunc +GDBusInterfaceSetPropertyFunc +g_dbus_connection_register_object +g_dbus_connection_unregister_object +GDBusSubtreeVTable +GDBusSubtreeEnumerateFunc +GDBusSubtreeIntrospectFunc +GDBusSubtreeDispatchFunc +GDBusSubtreeFlags +g_dbus_connection_register_subtree +g_dbus_connection_unregister_subtree + +G_DBUS_CONNECTION +G_IS_DBUS_CONNECTION +G_TYPE_DBUS_CONNECTION + +g_dbus_connection_get_type +g_bus_type_get_type +
+ +
+gdbusmethodinvocation +GDBusMethodInvocation +GDBusMethodInvocation +g_dbus_method_invocation_get_sender +g_dbus_method_invocation_get_object_path +g_dbus_method_invocation_get_interface_name +g_dbus_method_invocation_get_method_name +g_dbus_method_invocation_get_method_info +g_dbus_method_invocation_get_connection +g_dbus_method_invocation_get_message +g_dbus_method_invocation_get_parameters +g_dbus_method_invocation_get_user_data +g_dbus_method_invocation_return_value +g_dbus_method_invocation_return_error +g_dbus_method_invocation_return_error_valist +g_dbus_method_invocation_return_error_literal +g_dbus_method_invocation_return_gerror +g_dbus_method_invocation_return_dbus_error +g_dbus_method_invocation_take_error +g_dbus_method_invocation_return_value_with_unix_fd_list + +G_DBUS_METHOD_INVOCATION +G_IS_DBUS_METHOD_INVOCATION +G_TYPE_DBUS_METHOD_INVOCATION + +g_dbus_method_invocation_get_type +
+ +
+gdbusnameowning +GBusAcquiredCallback +GBusNameAcquiredCallback +GBusNameLostCallback +GBusNameOwnerFlags +g_bus_own_name +g_bus_own_name_on_connection +g_bus_unown_name +g_bus_own_name_with_closures +g_bus_own_name_on_connection_with_closures + + +g_bus_name_owner_flags_get_type +
+ +
+gdbusnamewatching +GBusNameAppearedCallback +GBusNameVanishedCallback +GBusNameWatcherFlags +g_bus_watch_name +g_bus_watch_name_on_connection +g_bus_unwatch_name +g_bus_watch_name_with_closures +g_bus_watch_name_on_connection_with_closures + + +g_bus_name_watcher_flags_get_type +
+ +
+gdbuserror +GDBusError +G_DBUS_ERROR +g_dbus_error_is_remote_error +g_dbus_error_get_remote_error +g_dbus_error_strip_remote_error +GDBusErrorEntry +g_dbus_error_register_error_domain +g_dbus_error_register_error +g_dbus_error_unregister_error +g_dbus_error_new_for_dbus_error +g_dbus_error_set_dbus_error +g_dbus_error_set_dbus_error_valist +g_dbus_error_encode_gerror + +g_dbus_error_quark +
+ +
+gdbusproxy +GDBusProxy +GDBusProxyFlags +GDBusProxy +GDBusProxyClass +g_dbus_proxy_new +g_dbus_proxy_new_finish +g_dbus_proxy_new_sync +g_dbus_proxy_new_for_bus +g_dbus_proxy_new_for_bus_finish +g_dbus_proxy_new_for_bus_sync +g_dbus_proxy_get_flags +g_dbus_proxy_get_connection +g_dbus_proxy_get_name +g_dbus_proxy_get_name_owner +g_dbus_proxy_get_object_path +g_dbus_proxy_get_interface_name +g_dbus_proxy_get_default_timeout +g_dbus_proxy_set_default_timeout +g_dbus_proxy_get_cached_property +g_dbus_proxy_set_cached_property +g_dbus_proxy_get_cached_property_names +g_dbus_proxy_set_interface_info +g_dbus_proxy_get_interface_info +g_dbus_proxy_call +g_dbus_proxy_call_finish +g_dbus_proxy_call_sync +g_dbus_proxy_call_with_unix_fd_list +g_dbus_proxy_call_with_unix_fd_list_finish +g_dbus_proxy_call_with_unix_fd_list_sync + +G_DBUS_PROXY +G_IS_DBUS_PROXY +G_TYPE_DBUS_PROXY +G_DBUS_PROXY_CLASS +G_IS_DBUS_PROXY_CLASS +G_DBUS_PROXY_GET_CLASS + +GDBusProxyPrivate +g_dbus_proxy_get_type +
+ +
+gdbusintrospection +GDBusAnnotationInfo +GDBusArgInfo +GDBusMethodInfo +GDBusSignalInfo +GDBusPropertyInfoFlags +GDBusPropertyInfo +GDBusInterfaceInfo +GDBusNodeInfo +g_dbus_annotation_info_lookup +g_dbus_interface_info_lookup_method +g_dbus_interface_info_lookup_signal +g_dbus_interface_info_lookup_property +g_dbus_interface_info_cache_build +g_dbus_interface_info_cache_release +g_dbus_interface_info_generate_xml +g_dbus_node_info_new_for_xml +g_dbus_node_info_lookup_interface +g_dbus_node_info_generate_xml +G_TYPE_DBUS_NODE_INFO +G_TYPE_DBUS_INTERFACE_INFO +G_TYPE_DBUS_METHOD_INFO +G_TYPE_DBUS_SIGNAL_INFO +G_TYPE_DBUS_PROPERTY_INFO +G_TYPE_DBUS_ARG_INFO +G_TYPE_DBUS_ANNOTATION_INFO +g_dbus_node_info_ref +g_dbus_interface_info_ref +g_dbus_method_info_ref +g_dbus_signal_info_ref +g_dbus_property_info_ref +g_dbus_arg_info_ref +g_dbus_annotation_info_ref +g_dbus_node_info_unref +g_dbus_interface_info_unref +g_dbus_method_info_unref +g_dbus_signal_info_unref +g_dbus_property_info_unref +g_dbus_arg_info_unref +g_dbus_annotation_info_unref + +g_dbus_annotation_info_get_type +g_dbus_arg_info_get_type +g_dbus_interface_info_get_type +g_dbus_method_info_get_type +g_dbus_node_info_get_type +g_dbus_property_info_get_type +g_dbus_signal_info_get_type +
+ +
+gpermission +GPermission +g_permission_get_allowed +g_permission_get_can_acquire +g_permission_get_can_release + +g_permission_acquire +g_permission_acquire_async +g_permission_acquire_finish +g_permission_release +g_permission_release_async +g_permission_release_finish + +g_permission_impl_update + +G_PERMISSION +G_PERMISSION_CLASS +G_PERMISSION_GET_CLASS +G_IS_PERMISSION +G_IS_PERMISSION_CLASS +GPermissionClass +G_TYPE_PERMISSION + +g_permission_get_type +GPermissionPrivate +
+ +
+gsimplepermission +GSimplePermission +g_simple_permission_new + + +G_SIMPLE_PERMISSION +G_IS_SIMPLE_PERMISSION +G_TYPE_SIMPLE_PERMISSION + + +g_simple_permission_get_type +
+ +
+gapplication +GApplication +GApplicationClass + +GApplicationFlags +g_application_id_is_valid +g_application_new + +g_application_get_application_id +g_application_set_application_id + +g_application_get_inactivity_timeout +g_application_set_inactivity_timeout + +g_application_get_flags +g_application_set_flags + +g_application_get_dbus_connection +g_application_get_dbus_object_path + +g_application_set_action_group + +g_application_get_is_registered +g_application_get_is_remote +g_application_register + +g_application_hold +g_application_release +g_application_quit + +g_application_activate +g_application_open + +g_application_run +g_application_set_default +g_application_get_default + +G_TYPE_APPLICATION +G_APPLICATION +G_APPLICATION_CLASS +G_IS_APPLICATION +G_IS_APPLICATION_CLASS +G_APPLICATION_GET_CLASS + +GApplicationPrivate +g_application_get_type +g_application_flags_get_type +
+ +
+gapplicationcommandline +GApplicationCommandLine +GApplicationCommandLineClass + +g_application_command_line_get_arguments +g_application_command_line_get_cwd +g_application_command_line_get_environ +g_application_command_line_get_stdin +g_application_command_line_create_file_for_arg +g_application_command_line_getenv +g_application_command_line_get_is_remote +g_application_command_line_get_platform_data + +g_application_command_line_set_exit_status +g_application_command_line_get_exit_status + +g_application_command_line_print +g_application_command_line_printerr + +G_TYPE_APPLICATION_COMMAND_LINE +G_APPLICATION_COMMAND_LINE +G_APPLICATION_COMMAND_LINE_CLASS +G_IS_APPLICATION_COMMAND_LINE +G_IS_APPLICATION_COMMAND_LINE_CLASS +G_APPLICATION_COMMAND_LINE_GET_CLASS + +GApplicationCommandLinePrivate +g_application_command_line_get_type +
+ + +
+gactiongroup +GActionGroup +GActionGroup +GActionGroupInterface + + +g_action_group_list_actions +g_action_group_query_action + + +g_action_group_has_action +g_action_group_get_action_enabled +g_action_group_get_action_parameter_type +g_action_group_get_action_state_type +g_action_group_get_action_state_hint +g_action_group_get_action_state + + +g_action_group_change_action_state +g_action_group_activate_action + + +g_action_group_action_added +g_action_group_action_removed +g_action_group_action_enabled_changed +g_action_group_action_state_changed + + +g_action_group_get_type +G_TYPE_ACTION_GROUP +G_IS_ACTION_GROUP +G_ACTION_GROUP_GET_IFACE +G_ACTION_GROUP +
+ +
+gactiongroupexporter +g_dbus_connection_export_action_group +g_dbus_connection_unexport_action_group +
+ +
+gdbusactiongroup +GDBusActionGroup +g_dbus_action_group_get + + +G_TYPE_DBUS_ACTION_GROUP +G_DBUS_ACTION_GROUP +G_DBUS_ACTION_GROUP_CLASS +G_IS_DBUS_ACTION_GROUP +G_IS_DBUS_ACTION_GROUP_CLASS +G_DBUS_ACTION_GROUP_GET_CLASS + + +g_dbus_action_group_get_type +
+ +
+gremoteactiongroup +GRemoteActionGroup +GRemoteActionGroupInterface + + +g_remote_action_group_activate_action_full +g_remote_action_group_change_action_state_full + + +G_TYPE_REMOTE_ACTION_GROUP +G_REMOTE_ACTION_GROUP +G_IS_REMOTE_ACTION_GROUP +G_REMOTE_ACTION_GROUP_GET_IFACE +
+ +
+gaction +GAction +GAction +GActionInterface + + +g_action_get_name +g_action_get_parameter_type +g_action_get_state_type +g_action_get_state_hint + + +g_action_get_enabled +g_action_get_state + + +g_action_change_state +g_action_activate + + +g_action_get_type +G_TYPE_ACTION +G_IS_ACTION +G_ACTION_GET_IFACE +G_ACTION +
+ +
+gsimpleaction +GSimpleAction +GSimpleAction + + +g_simple_action_new +g_simple_action_new_stateful + + +g_simple_action_set_enabled +g_simple_action_set_state + + +g_simple_action_get_type +G_TYPE_SIMPLE_ACTION +G_IS_SIMPLE_ACTION +G_SIMPLE_ACTION +
+ +
+gsimpleactiongroup +GSimpleActionGroup +GSimpleActionGroup + + +g_simple_action_group_new + + +g_simple_action_group_lookup +g_simple_action_group_insert +g_simple_action_group_remove + + +g_simple_action_group_add_entries + + +GSimpleActionGroupClass +GSimpleActionGroupPrivate +g_simple_action_group_get_type +G_TYPE_SIMPLE_ACTION_GROUP +G_IS_SIMPLE_ACTION_GROUP +G_SIMPLE_ACTION_GROUP_CLASS +G_SIMPLE_ACTION_GROUP_GET_CLASS +G_IS_SIMPLE_ACTION_GROUP_CLASS +G_SIMPLE_ACTION_GROUP +
+ +
+gactionmap +GActionMap +GActionMap +GActionMapInterface +g_action_map_lookup_action +GActionEntry +g_action_map_add_action_entries +g_action_map_add_action +g_action_map_remove_action + + +GActionMapInterface +G_TYPE_ACTION_MAP +G_ACTION_MAP +G_IS_ACTION_MAP +G_ACTION_MAP_GET_IFACE + + +g_action_map_get_type +
+ +
+gproxyresolver +GProxyResolver +GProxyResolver +GProxyResolverInterface +G_PROXY_RESOLVER_EXTENSION_POINT_NAME +g_proxy_resolver_get_default +g_proxy_resolver_is_supported +g_proxy_resolver_lookup +g_proxy_resolver_lookup_async +g_proxy_resolver_lookup_finish + +G_PROXY_RESOLVER +G_IS_PROXY_RESOLVER +G_TYPE_PROXY_RESOLVER +G_PROXY_RESOLVER_GET_IFACE + +g_proxy_resolver_get_type +
+ +
+gproxyaddress +GProxyAddress +GProxyAddress +GProxyAddressClass +g_proxy_address_get_destination_protocol +g_proxy_address_get_destination_hostname +g_proxy_address_get_destination_port +g_proxy_address_get_password +g_proxy_address_get_protocol +g_proxy_address_get_username +g_proxy_address_get_uri +g_proxy_address_new + +G_PROXY_ADDRESS +G_PROXY_ADDRESS_CLASS +G_PROXY_ADDRESS_GET_CLASS +G_IS_PROXY_ADDRESS +G_IS_PROXY_ADDRESS_CLASS +G_TYPE_PROXY_ADDRESS + +GProxyAddressPrivate +g_proxy_address_get_type +
+ +
+gproxy +GProxy +GProxy +GProxyInterface +G_PROXY_EXTENSION_POINT_NAME +g_proxy_connect +g_proxy_connect_async +g_proxy_connect_finish +g_proxy_get_default_for_protocol +g_proxy_supports_hostname + +G_PROXY +G_PROXY_GET_IFACE +G_IS_PROXY +G_TYPE_PROXY + +g_proxy_get_type +
+ +
+gpollableinputstream +GPollableInputStream +GPollableInputStream +GPollableInputStreamInterface + +g_pollable_input_stream_can_poll +g_pollable_input_stream_is_readable +g_pollable_input_stream_create_source +g_pollable_input_stream_read_nonblocking + +G_POLLABLE_INPUT_STREAM +G_POLLABLE_INPUT_STREAM_GET_INTERFACE +G_IS_POLLABLE_INPUT_STREAM +G_TYPE_POLLABLE_INPUT_STREAM + +g_pollable_input_stream_get_type +
+ +
+gpollableoutputstream +GPollableOutputStream +GPollableOutputStream +GPollableOutputStreamInterface + +g_pollable_output_stream_can_poll +g_pollable_output_stream_is_writable +g_pollable_output_stream_create_source +g_pollable_output_stream_write_nonblocking + +G_POLLABLE_OUTPUT_STREAM +G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE +G_IS_POLLABLE_OUTPUT_STREAM +G_TYPE_POLLABLE_OUTPUT_STREAM + +g_pollable_output_stream_get_type +
+ +
+gpollableutils +GPollableSourceFunc +g_pollable_source_new +g_pollable_source_new_full + +g_pollable_stream_read +g_pollable_stream_write +g_pollable_stream_write_all +
+ +
+gtls +G_TLS_ERROR +GTlsError + +GTlsAuthenticationMode +GTlsCertificateFlags +
+ +
+gtlsbackend +GTlsBackend +G_TLS_BACKEND_EXTENSION_POINT_NAME +GTlsBackend +GTlsBackendInterface +g_tls_backend_get_default +g_tls_backend_supports_tls +g_tls_backend_get_default_database +g_tls_backend_get_certificate_type +g_tls_backend_get_client_connection_type +g_tls_backend_get_server_connection_type +g_tls_backend_get_file_database_type + +G_IS_TLS_BACKEND +G_TLS_BACKEND +G_TLS_BACKEND_GET_INTERFACE +G_TYPE_TLS_BACKEND +g_tls_error_quark + +g_tls_backend_get_type +
+ +
+gtlscertificate +GTlsCertificate +GTlsCertificate +g_tls_certificate_new_from_pem +g_tls_certificate_new_from_file +g_tls_certificate_new_from_files +g_tls_certificate_list_new_from_file +g_tls_certificate_get_issuer +g_tls_certificate_verify +g_tls_certificate_is_same + +GTlsCertificateClass +GTlsCertificatePrivate +G_IS_TLS_CERTIFICATE +G_IS_TLS_CERTIFICATE_CLASS +G_TLS_CERTIFICATE +G_TLS_CERTIFICATE_CLASS +G_TLS_CERTIFICATE_GET_CLASS +G_TYPE_TLS_CERTIFICATE + +g_tls_certificate_get_type +
+ +
+gtlsconnection +GTlsConnection +GTlsConnection +g_tls_connection_set_certificate +g_tls_connection_get_certificate +g_tls_connection_get_peer_certificate +g_tls_connection_get_peer_certificate_errors +g_tls_connection_set_require_close_notify +g_tls_connection_get_require_close_notify +GTlsRehandshakeMode +g_tls_connection_set_rehandshake_mode +g_tls_connection_get_rehandshake_mode +g_tls_connection_set_use_system_certdb +g_tls_connection_get_use_system_certdb +g_tls_connection_get_database +g_tls_connection_set_database +g_tls_connection_get_interaction +g_tls_connection_set_interaction + +g_tls_connection_handshake +g_tls_connection_handshake_async +g_tls_connection_handshake_finish + +g_tls_connection_emit_accept_certificate + +GTlsConnectionClass +GTlsConnectionPrivate +G_IS_TLS_CONNECTION +G_IS_TLS_CONNECTION_CLASS +G_TLS_CONNECTION +G_TLS_CONNECTION_CLASS +G_TLS_CONNECTION_GET_CLASS +G_TYPE_TLS_CONNECTION + +g_tls_connection_get_type +
+ +
+gtlsclientconnection +GTlsClientConnection +GTlsClientConnection +GTlsClientConnectionInterface +g_tls_client_connection_new +g_tls_client_connection_set_server_identity +g_tls_client_connection_get_server_identity +g_tls_client_connection_set_validation_flags +g_tls_client_connection_get_validation_flags +g_tls_client_connection_set_use_ssl3 +g_tls_client_connection_get_use_ssl3 +g_tls_client_connection_get_accepted_cas + +G_IS_TLS_CLIENT_CONNECTION +G_TLS_CLIENT_CONNECTION +G_TLS_CLIENT_CONNECTION_GET_INTERFACE +G_TYPE_TLS_CLIENT_CONNECTION + +g_tls_client_connection_get_type +
+ +
+gtlsdatabase +GTlsDatabase +GTlsDatabase +GTlsDatabaseVerifyFlags +G_TLS_DATABASE_PURPOSE_AUTHENTICATE_SERVER +G_TLS_DATABASE_PURPOSE_AUTHENTICATE_CLIENT +g_tls_database_verify_chain +g_tls_database_verify_chain_async +g_tls_database_verify_chain_finish +GTlsDatabaseLookupFlags +g_tls_database_lookup_certificate_issuer +g_tls_database_lookup_certificate_issuer_async +g_tls_database_lookup_certificate_issuer_finish +g_tls_database_lookup_certificates_issued_by +g_tls_database_lookup_certificates_issued_by_async +g_tls_database_lookup_certificates_issued_by_finish +g_tls_database_create_certificate_handle +g_tls_database_lookup_certificate_for_handle +g_tls_database_lookup_certificate_for_handle_async +g_tls_database_lookup_certificate_for_handle_finish + +G_IS_TLS_DATABASE +G_IS_TLS_DATABASE_CLASS +G_TLS_DATABASE +G_TLS_DATABASE_CLASS +G_TLS_DATABASE_GET_CLASS +G_TYPE_TLS_DATABASE +G_TYPE_TLS_DATABASE_LOOKUP_FLAGS +G_TYPE_TLS_DATABASE_VERIFY_FLAGS + +g_tls_database_lookup_flags_get_type +g_tls_database_verify_flags_get_type +g_tls_database_get_type +GTlsDatabasePrivate +
+ +
+gtlsfiledatabase +GTlsFileDatabase +GTlsFileDatabase +GTlsFileDatabaseInterface +g_tls_file_database_new + +G_TLS_FILE_DATABASE +G_TLS_FILE_DATABASE_GET_INTERFACE +G_TYPE_TLS_FILE_DATABASE +G_IS_TLS_FILE_DATABASE + +g_tls_file_database_get_type +
+ +
+gtlsserverconnection +GTlsServerConnection +GTlsServerConnection +GTlsServerConnectionInterface +g_tls_server_connection_new + +G_IS_TLS_SERVER_CONNECTION +G_TLS_SERVER_CONNECTION +G_TLS_SERVER_CONNECTION_GET_INTERFACE +G_TYPE_TLS_SERVER_CONNECTION + +g_tls_server_connection_get_type +
+ +
+gtlspassword +GTlsPassword +GTlsPassword +GTlsPasswordClass +GTlsPasswordFlags +g_tls_password_new +g_tls_password_get_value +g_tls_password_set_value +g_tls_password_set_value_full +g_tls_password_get_description +g_tls_password_set_description +g_tls_password_get_flags +g_tls_password_set_flags +g_tls_password_get_warning +g_tls_password_set_warning + +g_tls_password_flags_get_type +g_tls_password_get_type +G_IS_TLS_PASSWORD +G_TLS_PASSWORD +G_TYPE_TLS_PASSWORD +G_TYPE_TLS_PASSWORD_FLAGS +
+ +
+gtlsinteraction +GTlsInteraction +GTlsInteraction +GTlsInteractionResult +g_tls_interaction_ask_password +g_tls_interaction_ask_password_async +g_tls_interaction_ask_password_finish +g_tls_interaction_invoke_ask_password + +GTlsInteractionClass +G_IS_TLS_INTERACTION +G_IS_TLS_INTERACTION_CLASS +G_TYPE_TLS_INTERACTION +G_TLS_INTERACTION +G_TLS_INTERACTION_CLASS +G_TLS_INTERACTION_GET_CLASS +G_TYPE_TLS_INTERACTION_RESULT + +GTlsInteractionPrivate +g_tls_interaction_get_type +g_tls_interaction_result_get_type +
+ +
+gdbusinterface +GDBusInterface +GDBusInterface +GDBusInterfaceIface +g_dbus_interface_get_info +g_dbus_interface_get_object +g_dbus_interface_dup_object +g_dbus_interface_set_object + +G_DBUS_INTERFACE +G_IS_DBUS_INTERFACE +G_TYPE_DBUS_INTERFACE +g_dbus_interface_get_type +G_DBUS_INTERFACE_GET_IFACE +
+ + +
+gdbusinterfaceskeleton +GDBusInterfaceSkeleton +GDBusInterfaceSkeleton +GDBusInterfaceSkeletonClass +g_dbus_interface_skeleton_flush +g_dbus_interface_skeleton_get_info +g_dbus_interface_skeleton_get_vtable +g_dbus_interface_skeleton_get_properties +g_dbus_interface_skeleton_export +g_dbus_interface_skeleton_unexport +g_dbus_interface_skeleton_unexport_from_connection +g_dbus_interface_skeleton_get_connection +g_dbus_interface_skeleton_get_connections +g_dbus_interface_skeleton_has_connection +g_dbus_interface_skeleton_get_object_path +GDBusInterfaceSkeletonFlags +g_dbus_interface_skeleton_get_flags +g_dbus_interface_skeleton_set_flags + +G_DBUS_INTERFACE_SKELETON +G_IS_DBUS_INTERFACE_SKELETON +G_TYPE_DBUS_INTERFACE_SKELETON +g_dbus_interface_skeleton_get_type +G_DBUS_INTERFACE_SKELETON_CLASS +G_IS_DBUS_INTERFACE_SKELETON_CLASS +G_DBUS_INTERFACE_SKELETON_GET_CLASS + +GDBusInterfaceSkeletonPrivate +G_TYPE_DBUS_INTERFACE_SKELETON_FLAGS +g_dbus_interface_skeleton_flags_get_type +
+ +
+gdbusobject +GDBusObject +GDBusObject +GDBusObjectIface +g_dbus_object_get_object_path +g_dbus_object_get_interfaces +g_dbus_object_get_interface + +G_DBUS_OBJECT +G_IS_DBUS_OBJECT +G_TYPE_DBUS_OBJECT +g_dbus_object_get_type +G_DBUS_OBJECT_GET_IFACE +
+ +
+gdbusobjectproxy +GDBusObjectProxy +GDBusObjectProxy +GDBusObjectProxyClass +g_dbus_object_proxy_new +g_dbus_object_proxy_get_connection + +G_DBUS_OBJECT_PROXY +G_IS_DBUS_OBJECT_PROXY +G_TYPE_DBUS_OBJECT_PROXY +g_dbus_object_proxy_get_type +G_DBUS_OBJECT_PROXY_CLASS +G_IS_DBUS_OBJECT_PROXY_CLASS +G_DBUS_OBJECT_PROXY_GET_CLASS + +GDBusObjectProxyPrivate +
+ +
+gdbusobjectskeleton +GDBusObjectSkeleton +GDBusObjectSkeleton +GDBusObjectSkeletonClass +g_dbus_object_skeleton_new +g_dbus_object_skeleton_flush +g_dbus_object_skeleton_add_interface +g_dbus_object_skeleton_remove_interface +g_dbus_object_skeleton_remove_interface_by_name +g_dbus_object_skeleton_set_object_path + +G_DBUS_OBJECT_SKELETON +G_IS_DBUS_OBJECT_SKELETON +G_TYPE_DBUS_OBJECT_SKELETON +g_dbus_object_skeleton_get_type +G_DBUS_OBJECT_SKELETON_CLASS +G_IS_DBUS_OBJECT_SKELETON_CLASS +G_DBUS_OBJECT_SKELETON_GET_CLASS + +GDBusObjectSkeletonPrivate +
+ +
+gdbusobjectmanager +GDBusObjectManager +GDBusObjectManager +GDBusObjectManagerIface +g_dbus_object_manager_get_object_path +g_dbus_object_manager_get_objects +g_dbus_object_manager_get_object +g_dbus_object_manager_get_interface + +G_DBUS_OBJECT_MANAGER +G_IS_DBUS_OBJECT_MANAGER +G_TYPE_DBUS_OBJECT_MANAGER +g_dbus_object_manager_get_type +G_DBUS_OBJECT_MANAGER_GET_IFACE +
+ +
+gdbusobjectmanagerclient +GDBusObjectManagerClient +GDBusObjectManagerClient +GDBusObjectManagerClientClass +GDBusObjectManagerClientFlags +GDBusProxyTypeFunc +g_dbus_object_manager_client_new +g_dbus_object_manager_client_new_finish +g_dbus_object_manager_client_new_sync +g_dbus_object_manager_client_new_for_bus +g_dbus_object_manager_client_new_for_bus_finish +g_dbus_object_manager_client_new_for_bus_sync +g_dbus_object_manager_client_get_connection +g_dbus_object_manager_client_get_flags +g_dbus_object_manager_client_get_name +g_dbus_object_manager_client_get_name_owner + +G_DBUS_OBJECT_MANAGER_CLIENT +G_IS_DBUS_OBJECT_MANAGER_CLIENT +G_TYPE_DBUS_OBJECT_MANAGER_CLIENT +g_dbus_object_manager_client_get_type +G_DBUS_OBJECT_MANAGER_CLIENT_CLASS +G_IS_DBUS_OBJECT_MANAGER_CLIENT_CLASS +G_DBUS_OBJECT_MANAGER_CLIENT_GET_CLASS + +GDBusObjectManagerClientPrivate +G_TYPE_DBUS_OBJECT_MANAGER_CLIENT_FLAGS +g_dbus_object_manager_client_flags_get_type +
+ +
+gdbusobjectmanagerserver +GDBusObjectManagerServer +GDBusObjectManagerServer +GDBusObjectManagerServerClass +g_dbus_object_manager_server_new +g_dbus_object_manager_server_get_connection +g_dbus_object_manager_server_set_connection +g_dbus_object_manager_server_export +g_dbus_object_manager_server_export_uniquely +g_dbus_object_manager_server_is_exported +g_dbus_object_manager_server_unexport + +G_DBUS_OBJECT_MANAGER_SERVER +G_IS_DBUS_OBJECT_MANAGER_SERVER +G_TYPE_DBUS_OBJECT_MANAGER_SERVER +g_dbus_object_manager_server_get_type +G_DBUS_OBJECT_MANAGER_SERVER_CLASS +G_IS_DBUS_OBJECT_MANAGER_SERVER_CLASS +G_DBUS_OBJECT_MANAGER_SERVER_GET_CLASS + +GDBusObjectManagerServerPrivate +
+ +
+gnetworkmonitor +GNetworkMonitor +GNetworkMonitor +GNetworkMonitorInterface +G_NETWORK_MONITOR_EXTENSION_POINT_NAME +g_network_monitor_get_default +g_network_monitor_get_network_available +g_network_monitor_can_reach +g_network_monitor_can_reach_async +g_network_monitor_can_reach_finish + +g_network_monitor_get_type +G_TYPE_NETWORK_MONITOR +G_NETWORK_MONITOR +G_IS_NETWORK_MONITOR +G_NETWORK_MONITOR_GET_INTERFACE +
+ +
+gmenuexporter +g_dbus_connection_export_menu_model +g_dbus_connection_unexport_menu_model +
+ +
+gdbusmenumodel +GDBusMenuModel +g_dbus_menu_model_get + + +G_TYPE_DBUS_MENU_MODEL +G_DBUS_MENU_MODEL +G_IS_BDUS_MENU_MODEL + + +g_dbus_menu_model_get_type +
+ +
+gmenu +GMenu +g_menu_new +g_menu_freeze + + +g_menu_insert +g_menu_prepend +g_menu_append + + +g_menu_insert_item +g_menu_append_item +g_menu_prepend_item + + +g_menu_insert_section +g_menu_prepend_section +g_menu_append_section + + +g_menu_append_submenu +g_menu_insert_submenu +g_menu_prepend_submenu + + +g_menu_remove + + +GMenuItem +g_menu_item_new +g_menu_item_new_section +g_menu_item_new_submenu +g_menu_item_new_from_model + + +g_menu_item_set_label +g_menu_item_set_action_and_target_value +g_menu_item_set_action_and_target +g_menu_item_set_detailed_action +g_menu_item_set_section +g_menu_item_set_submenu + + +g_menu_item_get_attribute_value +g_menu_item_get_attribute +g_menu_item_get_link +g_menu_item_set_attribute_value +g_menu_item_set_attribute +g_menu_item_set_link + + +g_menu_item_get_type +g_menu_get_type + + +G_TYPE_MENU +G_MENU +G_IS_MENU + +G_TYPE_MENU_ITEM +G_MENU_ITEM +G_IS_MENU_ITEM +
+ +
+gmenumodel +GMenuModel +g_menu_model_is_mutable +g_menu_model_get_n_items + + +G_MENU_ATTRIBUTE_ACTION +G_MENU_ATTRIBUTE_LABEL +G_MENU_ATTRIBUTE_TARGET +G_MENU_LINK_SECTION +G_MENU_LINK_SUBMENU + + +g_menu_model_get_item_attribute_value +g_menu_model_get_item_attribute +g_menu_model_get_item_link +g_menu_model_iterate_item_attributes +g_menu_model_iterate_item_links + + +g_menu_model_items_changed + + +GMenuAttributeIter +g_menu_attribute_iter_get_next +g_menu_attribute_iter_get_name +g_menu_attribute_iter_get_value +g_menu_attribute_iter_next + + +GMenuLinkIter +g_menu_link_iter_get_name +g_menu_link_iter_get_next +g_menu_link_iter_get_value +g_menu_link_iter_next + + +g_menu_attribute_iter_get_type +g_menu_link_iter_get_type +g_menu_model_get_type +g_menu_model_get_label_quark +g_menu_model_get_action_quark +g_menu_model_get_section_quark +g_menu_model_get_submenu_quark +g_menu_model_get_target_quark + + +GMenuModelClass +GMenuModelPrivate +G_TYPE_MENU_MODEL +G_MENU_MODEL +G_IS_MENU_MODEL +G_MENU_MODEL_CLASS +G_IS_MENU_MODEL_CLASS +G_MENU_MODEL_GET_CLASS + +GMenuAttributeIterClass +GMenuAttributeIterPrivate +G_TYPE_MENU_LINK_ITER +G_MENU_LINK_ITER +G_IS_MENU_LINK_ITER +G_MENU_LINK_ITER_CLASS +G_IS_MENU_LINK_ITER_CLASS +G_MENU_LINK_ITER_GET_CLASS + +GMenuLinkIterClass +GMenuLinkIterPrivate +G_TYPE_MENU_ATTRIBUTE_ITER +G_MENU_ATTRIBUTE_ITER +G_IS_MENU_ATTRIBUTE_ITER +G_MENU_ATTRIBUTE_ITER_CLASS +G_IS_MENU_ATTRIBUTE_ITER_CLASS +G_MENU_ATTRIBUTE_ITER_GET_CLASS +
+ +
+gresource +GResource +GResource +GResourceFlags +GResourceLookupFlags +g_resource_load +g_resource_new_from_data +g_resource_ref +g_resource_unref +g_resource_lookup_data +g_resource_open_stream +g_resource_enumerate_children +g_resource_get_info + + +g_static_resource_init +g_static_resource_fini +g_static_resource_get_resource + + +g_resources_register +g_resources_unregister +g_resources_lookup_data +g_resources_open_stream +g_resources_enumerate_children +g_resources_get_info + + +G_RESOURCE_ERROR +GResourceError + + +G_TYPE_RESOURCE +G_TYPE_RESOURCE_ERROR +G_TYPE_RESOURCE_FILE +G_TYPE_RESOURCE_FLAGS +G_TYPE_RESOURCE_LOOKUP_FLAGS + + +g_resource_get_type +g_resource_error_get_type +g_resource_flags_get_type +g_resource_lookup_flags_get_type +g_resource_error_quark +
+ +
+gtestdbus +GTestDBus +GTestDBus +GTestDBusFlags +g_test_dbus_new +g_test_dbus_get_flags +g_test_dbus_get_bus_address +g_test_dbus_add_service_dir +g_test_dbus_up +g_test_dbus_stop +g_test_dbus_down +g_test_dbus_unset + +g_test_dbus_get_type +g_test_dbus_flags_get_type +
+ +
+gtask +GTask +GTask +g_task_new +g_task_set_task_data +g_task_set_priority +g_task_set_check_cancellable +g_task_set_return_on_cancel +g_task_set_source_tag + +g_task_report_error +g_task_report_new_error + +g_task_get_task_data +g_task_get_priority +g_task_get_cancellable +g_task_get_check_cancellable +g_task_get_return_on_cancel +g_task_get_context +g_task_get_source_object +g_task_get_source_tag + +g_task_return_boolean +g_task_return_int +g_task_return_pointer +g_task_return_error +g_task_return_new_error +g_task_return_error_if_cancelled + +g_task_propagate_boolean +g_task_propagate_int +g_task_propagate_pointer +g_task_had_error + +g_task_run_in_thread +g_task_run_in_thread_sync +GTaskThreadFunc +g_task_attach_source + +g_task_is_valid + +GTaskClass +GTaskPrivate +G_TYPE_TASK +G_TASK +G_IS_TASK +G_TASK_CLASS +G_IS_TASK_CLASS +G_TASK_GET_CLASS +g_task_get_type +
+ +
+gnetworking +gnetworking.h +g_networking_init +
+ +
+gsimpleproxyresolver +GSimpleProxyResolver +GSimpleProxyResolver +g_simple_proxy_resolver_new +g_simple_proxy_resolver_set_default_proxy +g_simple_proxy_resolver_set_ignore_hosts +g_simple_proxy_resolver_set_uri_proxy + +GSimpleProxyResolverClass +GSimpleProxyResolverPrivate +G_TYPE_SIMPLE_PROXY_RESOLVER +G_SIMPLE_PROXY_RESOLVER +G_IS_SIMPLE_PROXY_RESOLVER +G_SIMPLE_PROXY_RESOLVER_CLASS +G_IS_SIMPLE_PROXY_RESOLVER_CLASS +G_SIMPLE_PROXY_RESOLVER_GET_CLASS +g_simple_proxy_resolver_get_type +
diff --git a/docs/reference/gio/gio.types b/docs/reference/gio/gio.types new file mode 100644 index 0000000..8e4825d --- /dev/null +++ b/docs/reference/gio/gio.types @@ -0,0 +1,139 @@ +g_action_get_type +g_simple_action_get_type +g_action_group_get_type +g_action_map_get_type +g_simple_action_group_get_type +g_app_info_get_type +g_app_launch_context_get_type +g_application_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_input_stream_get_type +g_converter_output_stream_get_type +g_data_input_stream_get_type +g_data_output_stream_get_type +g_dbus_action_group_get_type +g_dbus_menu_model_get_type +g_desktop_app_info_get_type +g_drive_get_type +g_emblem_get_type +g_emblemed_icon_get_type +g_file_attribute_matcher_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_get_type +g_file_output_stream_get_type +g_filename_completer_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_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_menu_attribute_iter_get_type +g_menu_get_type +g_menu_link_iter_get_type +g_mount_get_type +g_mount_operation_get_type +g_native_volume_monitor_get_type +g_network_address_get_type +g_network_monitor_get_type +g_network_service_get_type +g_output_stream_get_type +g_permission_get_type +g_pollable_input_stream_get_type +g_pollable_output_stream_get_type +g_proxy_address_enumerator_get_type +g_proxy_address_get_type +g_proxy_get_type +g_proxy_resolver_get_type +g_resolver_get_type +g_seekable_get_type +g_settings_get_type +g_settings_backend_get_type +g_simple_async_result_get_type +g_simple_permission_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_get_type +g_socket_listener_get_type +g_socket_service_get_type +g_srv_target_get_type +g_tcp_connection_get_type +g_tcp_wrapper_connection_get_type +g_themed_icon_get_type +g_threaded_socket_service_get_type +g_tls_backend_get_type +g_tls_certificate_get_type +g_tls_client_connection_get_type +g_tls_connection_get_type +g_tls_database_get_type +g_tls_file_database_get_type +g_tls_password_get_type +g_tls_server_connection_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_decompressor_get_type +g_dbus_message_get_type +g_dbus_connection_get_type +g_dbus_proxy_get_type +g_dbus_method_invocation_get_type +g_dbus_server_get_type +g_dbus_auth_observer_get_type +g_credentials_get_type +g_unix_credentials_message_get_type +g_dbus_interface_get_type +g_dbus_interface_skeleton_get_type +g_dbus_object_get_type +g_dbus_object_skeleton_get_type +g_dbus_object_proxy_get_type +g_dbus_object_manager_get_type +g_dbus_object_manager_client_get_type +g_dbus_object_manager_server_get_type +g_dbus_annotation_info_get_type +g_dbus_arg_info_get_type +g_dbus_property_info_get_type +g_dbus_signal_info_get_type +g_dbus_method_info_get_type +g_dbus_interface_info_get_type +g_dbus_node_info_get_type +g_menu_model_get_type +g_menu_attribute_iter_get_type +g_menu_link_iter_get_type +g_menu_get_type +g_menu_item_get_type +g_test_dbus_get_type +g_test_dbus_flags_get_type +g_task_get_type +g_simple_proxy_resolver_get_type diff --git a/docs/reference/gio/glib-compile-resources.xml b/docs/reference/gio/glib-compile-resources.xml new file mode 100644 index 0000000..a9e3367 --- /dev/null +++ b/docs/reference/gio/glib-compile-resources.xml @@ -0,0 +1,191 @@ + + + + glib-compile-schemas + GIO + + + Developer + Alexander + Larsson + + + + + + glib-compile-resources + 1 + User Commands + + + + glib-compile-resources + GLib resource compiler + + + + + glib-compile-resources + OPTION + FILE + + + +Description +glib-compile-resources reads the resource description from +FILE and the files that it references +and creates a binary resource bundle that is suitable for use with the +GResource API. +The resulting bundle is then written out as-is, or as C source for linking into +an application. + + +The XML resource files normally have the filename extension .gresource.xml. +For a detailed description of the XML file format, see the +GResource documentation. + + + +Options + + + +, + +Print help and exit + + + + + + +Store the compiled resources in the file TARGET. +If not specified a filename based on the FILE +basename is used. + + + + + + +The files referenced in FILE are loaded from +this directory. If not specified, the current directory is used. + + + + + + +Write the output file in the format selected for by its filename extension: + + +.c +C source + + +.h +C header + + +.gresource +resource bundle + + + + + + + + +Instead of a writing the resource bundle in binary form create a C source file +that contains the resource bundle. This can then be compiled into an +application for easy access. + + + + + + +Generate a header file for use with C code generated by +. + + + + + + +Prints the list of files that the resource bundle references to standard output. +This can be used to track dependencies in the build system. For example, the +following make rule would mark test.gresource as +depending on all the files that test.gresource.xml +includes, so that is is automatically rebuilt if any of them change: + +test.gresource: test.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies test.gresource.xml) + +Note that this may or may not be portable to non-GNU make. + + + + + + + +Specify the prefix used for the C identifiers in the code generated by + and . + + + + + + +By default code generated by uses automatic +initialization of the resource. This works on most systems by using the +compiler support for constructors. However, some (uncommon) compilers may not +support this, you can then specify , +which will generate custom register and unregister functions that your code +can manually call at initialization and uninitialization time. + + + + + + +By default code generated by declares all +initialization functions as extern. So they are exported +unless this is prevented by a link script or other means. Since libraries +usually want to use the functions only internally it can be more useful to +declare them as +G_GNUC_INTERNAL +which is what does. + + + + + + +Environment + + + +XMLLINT + +The full path to the xmllint executable. This is used to preprocess resources +with the xml-stripblanks preprocessing option. If this +environment variable is not set, xmllint is searched in the +PATH. + + + + +GDK_PIXBUF_PIXDATA + +The full path to the gdk-pixbuf-pixdata executable. This is used to preprocess +resources with the to-pixdata preprocessing option. If this +environment variable is not set, gdk-pixbuf-pixdata is searched in the +PATH. + + + + + + diff --git a/docs/reference/gio/glib-compile-schemas.xml b/docs/reference/gio/glib-compile-schemas.xml new file mode 100644 index 0000000..04ed05f --- /dev/null +++ b/docs/reference/gio/glib-compile-schemas.xml @@ -0,0 +1,103 @@ + + + + glib-compile-schemas + GIO + + + Developer + Ryan + Lortie + + + + + + glib-compile-schemas + 1 + User Commands + + + + glib-compile-schemas + GSettings schema compiler + + + + + glib-compile-schemas + OPTION + DIRECTORY + + + +Description +glib-compile-schemas compiles all the GSettings XML +schema files in DIRECTORY into a binary file +with the name gschemas.compiled that can be used +by GSettings. The XML schema +files must have the filename extension .gschema.xml. +For a detailed description of the XML file format, see the +GSettings documentation. + + +At runtime, GSettings looks for schemas in the +glib-2.0/schemas subdirectories of all directories +specified in the XDG_DATA_DIRS environment variable. The +usual location to install schema files is +/usr/share/glib-2.0/schemas. + + +In addition to schema files, glib-compile-schemas reads 'vendor override' +files, which are key files that can override default values for keys in +the schemas. The group names in the key files are the schema id, and the +values are written in serialized GVariant form. +Vendor override files must have the filename extension +.gschema.override. + + +By convention, vendor override files begin with nn_ +where nn is a number from 00 to 99. Higher +numbered files have higher priority (eg: if the same override is made in +a file numbered 10 and then again in a file numbered 20, the override +from 20 will take precedence). + + + +Options + + + +, + +Print help and exit + + + + + + +Store gschemas.compiled in the TARGET directory instead of DIRECTORY. + + + + + + +Don't write gschemas.compiled. This option can be used +to check .gschema.xml sources for errors. + + + + + + +Do not enforce restrictions on key names. Note that this option is purely +to facility the transition from GConf, and will be removed at some time +in the future. + + + + + + diff --git a/docs/reference/gio/gresource.xml b/docs/reference/gio/gresource.xml new file mode 100644 index 0000000..7e43015 --- /dev/null +++ b/docs/reference/gio/gresource.xml @@ -0,0 +1,127 @@ + + + + gresource + GIO + + + Developer + Matthias + Clasen + + + + + + gresource + 1 + User Commands + + + + gresource + GResource tool + + + + + gresource + --section SECTION + list + FILE + PATH + + + gresource + --section SECTION + details + FILE + PATH + + + gresource + --section SECTION + extract + FILE + PATH + + + gresource + sections + FILE + + + gresource + help + COMMAND + + + +Description +gresource offers a simple commandline +interface to GResource. +It lets you list and extract resources that have been compiled +into a resource file or included in an elf file (a binary or a +shared library). + + +The file to operate on is specified by the FILE +argument. + + +If an elf file includes multiple sections with resources, it is +possible to select which one to operate on with the +--section option. Use the +sections command to find available sections. + + + +Commands + + + + + +Lists resources. If SECTION is given, only +list resourcs in this section. If PATH is +given, only list matching resources. + + + + + + +Lists resources with details. If SECTION +is given, only list resources in this section. If +PATH is given, only list matching resources. +Details include the section, size and compression of each resource. + + + + + + +Extracts the resource named by PATH to stdout. +Note that resources may contain binary data. + + + + + + +Lists sections containing resources. This is only interesting if +FILE is an elf file. + + + + + + +Prints help and exits. + + + + + + + diff --git a/docs/reference/gio/gsettings.xml b/docs/reference/gio/gsettings.xml new file mode 100644 index 0000000..7105d59 --- /dev/null +++ b/docs/reference/gio/gsettings.xml @@ -0,0 +1,229 @@ + + + + gsettings + GIO + + + Developer + Ryan + Lortie + + + + + + gsettings + 1 + User Commands + + + + gsettings + GSettings configuration tool + + + + + gsettings + get + SCHEMA:PATH + KEY + + + gsettings + monitor + SCHEMA:PATH + KEY + + + gsettings + writable + SCHEMA:PATH + KEY + + + gsettings + range + SCHEMA:PATH + KEY + + + gsettings + set + SCHEMA:PATH + KEY + VALUE + + + gsettings + reset + SCHEMA:PATH + KEY + + + gsettings + reset-recursively + SCHEMA:PATH + + + gsettings + list-schemas + + + gsettings + list-relocatable-schemas + + + gsettings + list-keys + SCHEMA:PATH + + + gsettings + list-children + SCHEMA:PATH + + + gsettings + list-recursively + SCHEMA:PATH + + + gsettings + help + COMMAND + + + +Description +gsettings offers a simple commandline +interface to GSettings. +It lets you get, set or monitor an individual key for changes. + + +The SCHEMA and KEY +arguments are required for most commands to specify the schema id and the +name of the key to operate on. The schema id may optionally have a +:PATH suffix. Specifying the path is only needed +if the schema does not have a fixed path. + + +When setting a key, you also need specify a VALUE +The format for the value is that of a serialized +GVariant, +so e.g. a string +must include explicit quotes: "'foo'". This format is also used when printing +out values. + + + +Commands + + + + + +Gets the value of KEY. +The value is printed out as a serialised +GVariant. + + + + + + +Monitors KEY for changes and prints the changed +values. If no KEY is specified, all keys in the +schema are monitored. Monitoring will continue until the process is terminated. + + + + + + +Finds out whether KEY is writable. + + + + + + +Queries the range of valid values for KEY. + + + + + + +Sets the value of KEY to +VALUE. The value is specified as a serialised +GVariant. + + + + + + +Resets KEY to its default value. + + + + + + +Reset all keys under the given SCHEMA. + + + + + + +Lists the installed, non-relocatable schemas. +See if you are interested in +relocatable schemas. + + + + + + +Lists the installed, relocatable schemas. +See if you are interested in +non-relocatable schemas. + + + + + + +Lists the keys in SCHEMA. + + + + + + +Lists the children of SCHEMA. + + + + + + +Lists keys and values, recursively. If no SCHEMA +is given, list keys in all schemas. + + + + + + +Prints help and exits. + + + + + + + diff --git a/docs/reference/gio/gvfs-overview.odg b/docs/reference/gio/gvfs-overview.odg new file mode 100644 index 0000000000000000000000000000000000000000..ca2bb8d66d24619fbf28e346ac6b41d772ecbb35 GIT binary patch literal 17772 zcmbun1yo$g)&|-nIKkcB-5r9vy9IZ54NeFa++6~}gG%R4>S9e#P+WV_-@2akKPVcHxlz9n`26|2duKhgOFB!UNf&B9u8hG1U+M2p}I+z+d zIM`Sk8@gE9+cCP?nK0NJI$Jt3*gKfonb;e<+M3$AFqk_TI#^g5J1hPdAb|0ogahP6 z?Cs1f&0U>-K{>N9I=dLUxH=mdIx+sH2Msj)OyoaGK!)-k^bC!SO>Im87<(s1V^=4q zX9ga&HZMVnGEmRNK`)*^fb{Qluz=dX(=oHLH*_)mgUqx3-^u)w5f1hat`2|`Tz@y> zpY-tlp*065dvhmK=f9Z$Pn!S4^SQAM#L zDkwD-G@J^0`lZY|3^E%Ar4ECJhe1!juvni!W>28hC(!V7d(Y4SwiyUe1!RHB=aztE z#>$$?$~w%-`t++|ploKwnrg;6Y{vTZiw96`mdcu%$~v6N`t*wyAZ<3xnmWunJk0v^ zizT3J_Qaa{#5(-M`t*x5Ud7@!S^1NFcKAf=j_4V#%g{jv~f z7$~QvnhmF#J^eBm-~m*p4x0@Rn?3!qAD{(Dr#_htKbbxKatGioz&(IJ00#gT1117C z0Y(6<0h$0WfC$hs01aRRV1PCt4%7n|fHa(%`t-|{fQ3NAKzVpL_34*q0fPY^K=trb z>eDYr1Kk4j1K@bT(|~IMUjohpyal)i@CV=kz+%8efHZ&wum)%XyZ|CV%K$Wh4S)gK zfH+VOTmaJ3uRa4@30Md;43wXKbs^CIK!*c840P%9=y~oUpih8K0K5*k`MHAuUjps` zSOUs`KL7^+76T>%qya2|H9!;K1rPyR2A~0K01VIu#DRL?!t*$6d>$YF|5M|H!t*SE zAtfrL>XBi*N(sUeM~|ezQe#p^2Z4sv_`ui@S5KbXkrI;^tq?W{{P)=u4v;dow{!V@ z#yr&3vR@oT_dTve@=(eV>ok4$1?g`6h0tvr2yzMIEi081RaGGuxD$!TXp{!wfGB*%IROX1r$x-~tG;jV zyC@Huv!Z4Y>Jh!s$XcR;f_?OnkBHtBeL-9zhMk!UZ}q^}^hT>h^^Ouj+tl5sxlGGU ztmqy{7fj7W)@VX?kuPLXS-`2ROZ8WJY z+%ta_I16Q$Otz+trce~`5C?&0D`t>Z*zX1xa2UwICn}KdWP^P3o&Y1_HONT*i$oZ^ znt-$pIyKh;Cso?3s6mw(%)HIT;vXWBXZ6I~ z3crLOsCr(hSMOI<68n;-9}G2Ae$*GcD>heJz)^ME42hqXEiS#s+7MP9jDh4u#gvXC zDa@vwDiS(V*(9ebiCGNVtlwIMSoc_gz{!0{lDj${+w6lZiuS%S6fAt#O$d*-HTm&J zL*?jCgv0WFp9V;)bK>8j05xniXson_RvMsY()ppWY$gz&dyJ0f``9J{6G>TFs=1j7n-`5 zbA(y#u5xIs(9Ow8&wsel)1Z4nyHSp&)z80;&K{McNrzD;5?G9Fll8It`cx$iXMR@g zmKA*?z*)G%6s|%{cQuOcqu4vda{Bdd-x=E}qh)dR#`6Oo?phMgBbV&Rf2N6!I>DLvqL~7DZju*XoH*MXeT;peK zNn(4B9X206P@lDIdF#9=ih7YmvgaZ}6Qiem$lrI0O<@F)KpebUj^w1*MUB)Ply`QB z=DO@nQ?ewjL}mY~uPr-ouN*DWG~&KBJ8uEVk=f?k9u<9R%gJ*@S=0E6wCZ0=SOE4- zoo0|z*+YI2f4w68a7?+^p45j1#R~;r(VDdsyke`*WU{AVg@0BCq<0=@6s4*rnPlE! zPIo}b{`zQ@U|Zn|+RB>s^UI0A)#XmijuCBMsp>KQeeOoB2uM?^m71I&a_?Hc4t(10 zj??5>6?_i*EuhxdyIZU`!FacmaBOcrs9(GoN!Awc_x1w&44(PM+Fq=ZiX^XUkrF?G zJiV-bu7B>T;{hX9bWHnr`%99mg*ps<=y&KXRJ;jeGWH>kn_EaqnAV}Osx4B^-KF={ zWQj+^rvc=PvsxA_&NMG&e%41MHkWd5L4>d_ThB;#j%`XG4qN2r>^d(y4G^@9(jTvR z$keY!8ErJ5d=Np`Y}R@7WqTmL+Xl}`rKf*0RvT_a-m?`j~VIAm~Nz@pI7 zI!9KG9h^J6wJKdUE>CeV8y&f?>=mm?g`HujR4CSI7Sjyby%pC%kxUIZ8MDdmz&{vwjH`=cJ^)X75+QkIrm5Au}^)uHh`t#uow`M47AE$wOv zxBw4{AY9%^=ao{mH0LglRG;oG^YZ#GuQcM4-_!ZA@Zg}BG;_o(bV`})sU8ZWPsJr` z?9+{Hd#CS*KH@@8b_dB+g9I%QMqMC%@AqR-RIvwAmA8_q*d<>hROLL^$EpX!Vk1aJ z<1@wigAd0@wsmm7subAMUnUSD65m)sgMs-<1}D&xnD|HrPn8mbLu`qV6zIVd--xW| z>mz0(rWHk%5*PT4@!7sX&W%nj+NDL%2$X!NLUA?awJz%Ueq~b=1@HDf9C045E;@Ve zm85>DTv2E3Lt(biX@3iz-h6t~d^cgdVQ6b~`r%vg3fGhPGkAlaW;fxj47!7xMt4XW zN9+?LOcyI2P(3D^t5YPs z2U25i|CqHhqXaHSjWJr=I=;Dnu5-hEKE`yOe>)KEC->&5`ZkJ6?49N9jHg+tLyU~B zlLnmuo)B8wOC`0KNQxXq#Y8Z^Ef;URZzx{}O8Q$%I+WD>89*Pm@JRr=$II#5XybRp`3SRWHb!4VXIFgYm39#?%J3i@rb{4KA`9zrVeD6McIpIgu<>F#Q2gC&iIQ~1Ysq>yYCS%k7e zAtKXVXs?{fgf7y0TbeD&I;U0@%UM|}JZEnDl7CohLP_RtOR3~lOG?|Ml<3SJjz?(} z=yPB11cI|@busV!<@JP$ z*XU>pJd>eCr{7?e*gYn^R!7YLo9wlHnZjpIC+dU(6_K1{pK8anY7AszfPl~blK?dZAA z$F+uckYS6$dN}Sgw(O}wc69VVuRd+qE*6A?AhbC5>jd;!twCOahY(!9+jF(;jj+i8o|3meqE0^Sf@aDDcg3$! zKeReuWuBy#`}%3HF+EM{zFyZ>v9?7v@|Zh8(`Ts+dPWM?JqtCuRX-Xq z1s)NfpQZ2WoqOKRSKoe-3&pQp!O){B^b3@> z-#S}Wlq-*wV}XH@m^{&*I8yU?igah#T6S~s zj2lO;E^Jn>yDknn@djB8T@#HBgY{?$x(LzXn(68527SSpp;N@;$1`=hWIm&FO;OW9 z7BSd58BOLFYh@|8>(h-1^SWb!nCFp&Whtc=3{FW}xlKd-vnr{`51(__)8-S^ZA#z4 zlG@88F}xcsOV!)eoET9w+=P(TJN<}7(?X9@jYfuIDUaTs-@~yspImyXUF>t@nLc7x z&7BV2bQU;ovu$Zr?x1?U^--2h1J9GrkV|U~BEF-hg<8eslW+fiNkZao;6Ue?qS%!> zdvX~Fg9-D&X)Z`NHOX(e0@8c-umoz`LT<}IaB|pIgF7Ph%b?c5V4-Tc_srGA9k}Sj zY*BQS{(#GlZvSE+O&lMgP2rl`RtQpE36%lI7j@2yhhlR9-lg=Q1Ka`hcm!{k82&sd zRZ@lthB1G}6aS#kIxaU0M+uZc<&fVAD08t1U-6$EHI;~-c+>M;kqw2YvJ(xh31OPS z>}#!)mluJ3Gs??;t*AJ3u)k0U*EibiiXVU}Y#`ugKamq1F9N?OsKM}g>);N2<5J`XCfuMg8cPYKdv zXHh4i>mI&#UU~YCyjM786H>ES#26gOTmiORI;^XLUap7x6!Ox-V9YXyB08|%6{63x zq)PtFDsi}3ipfJ5p|~YGT}V`nZ~1r}B@EcCHnT=KVUx7ww_Eg5EJgNA)@|#7j#l5b zSQ_FAuYlvn;BW2bj|UZ*rMwrXklYG!4c8*j{Gu#9*`*Tz-Biuwg$ab__J zRDBI6rXRDF!$&;8$31uPAR;6lsV*eU+pt4V(jb|{U*PG4KF;2HhQzJIkuuY3 z(_Vu4z@B;_ZqW5UEe9uaHmH6Nu1S}VR5UV~lkj`l+uo3@R4u8+of{6)9e9vLNh)Vb zfU1c&zM4@(M3~m33Ss(LvNLh4@$IyH_XdIs^OGTp({NI)Y{|y={z!W2ZoxT<&zT%S~?h!9a@YSxOtS79JO)en$>9Hq!H`-mJH#3KAR42Cf-F?q;ATv zF0gb$$Dj}SgH7b1QIBZjafgmMu|u|RdMMj&(_Cx3CePTGjwVN%mWD?BjLXW86vm>0 zl5lg_Y%MJb&sLMxW}dx!ytT72Di~E^slHVDDUrb~#AvszE$O?(p+nAkQs*aqZei1a zk8hXl=!>g+lv!e{7!H}@q`C|3KcgQM9e$mP*)RkRsahA*4x?P*mm9r8C zrE$fWX5*A!r}_4vxe+yMm78QuE~QvxrZpFR!?mYRyCbEuTqZhdM=UkM6k}S7ELlO%L{9?(58#v<*F!&Cj73)eQu$JyyOw( zI4JeP@Z9X>jmu_Wg6V51p-0C_LO=W4_=m1BXn#$DrS=9N(6A0QO7f61erxcD0aI*VZfRZ@D>|3|Y8OvV;!mn?>991}Z>DBi56ydN7` zVBP%mb^Fte`{DLC5gdi9+rax}XkYjvw^kWU5^TbFkgQ@>)_%b;KFc<=N*7eBm5GZT z1so)Kt^jOHXUIfCf;m|(Tuib12<}zFiMjC3!8lUj#1AzRwzs0e4Ep54Kce3$a;3IO z2Y=_o5jL+x$&Tpj`jObXJ0u}uaVx!Xae$2MmFdWHLI|ICE~t^?)~`mrbE)P6waCfD zsVYXxHirhQmZ%87K$6RE1snTQQ!hxhs~M)oO#C~WuAwSvpKE&W=buJAAWjLz1X#+l zeeTc#bR}!*!Ra*Ba+XQ9# f0+kbgaXAMqcB|o(X{kasOU3HCl*QGtV3gJP!oF$K zk;1P_0+kC;vO=vgIrk$j8pC2ITXli2UNb21`YoS1(mO{AbexcU5#~4JY0VZ8@z$*M z`^=`VvSHyp!aRWTLGFoH@1u9Kl+kIbm{k{gu*PKJu?@{U1!LkR#EWW;DZ**@JquE~ zz;k0>smlg9C@)#eP;XhYFL*Z0{2;lSo@|tFH1C$q0vY#?vkAWBo`Z&n-x#m#!^m-t zv~1ktHH>mP*wxTJ#U#NYA7`mdcKyhq8EOsKajR9!9(ti0bm>;np6UAb2l=_4##fCP zOGTZwC4Bor?w9=Ov7z3d-4lGyC^j6x~jeNSzrg2d$zAZVs6S<|O+@$HM^uP}&~@IxC*7|%;sG5XRB zUu=9V!9EhT{isr;yZ=U&bgL};F!r@N6>CL_57SggSH;_-Wluq&OJqM{?3E5AWSP$f z6<7t$nN(`l)V?>H(YziAjT#CxjjT3tvSX&^5E1qmC%LSyB*IB1=&V%FaWN~ZFzN8$Jp>iOiJK+=a_@Wv57|{I0*Fo{uPNabuoOtx8f57K8V~*ot%MK3_l4o0}~06shzRC ziKU%6KZ%;EI6W7Mpa3kNy_uP%u_@0V;Td`$j$=p!sMdfO}%=6cX4$ohud44tY+Z7KROFL_R5(^g>2OdU7cXxLNcUA^_Cv!$-ZfK_&eP;N-l6sc?Dz{eMV5`{Orv{h|(pFW4A=EC0dT+1AqLe{JzumfqOj)&byYWMlf*Mh)#OZU0x8 zXW3tt{s!=SPyb~|u#gD+(f`km65#vgE^|}6-vVX=3V>A#zsAQet5_MB$Yd?;Ts?^X zyFwp`Pg$87yD+jcG1)S+lL@<8+L+LDvvP9tG5!tlw-zkzEL|)O0TZ1}p96COa)vH0 z7M6z2L?SkZK==Hv^>?Y?bbsjpLz>1RApx2VdCInWBFbCzvcK$ zjCuZ0;HGEdpl9MzWd@``I{bUF}@>NmyA(7=P~; zS7%cvdJ|JKOFL7O-$b8(jr=51c4qcO%>SF%|A@x=zoD@`i~T;#d43x}f0X`X-LK34 z9%OiqR;XII+8WszTG}`>y8MxSj`}5PxhhWSe|b8phK7TNlcAGra0zvxiE^QVqas?) zM3G5`rXeDJPb4Yn&ME00#@0CT6(xCv_v%}w=W!;l^AoqT*|&4PAKarEl!D_6Y0<|U zN^4*s2mP(EJOq&cQT=Q7qt-8Vc*Cz@L5S+AXj>OPEQr-P0tL71tqm%V*`+Btifwpg zEkSs_8JZu2JC0(hX=&VQ%Cl}xa%Ko?m76_GDBqKB{(xI|e6<;}ia+qxzzLG^XflY_ zQ^ass>LbdC3W|yf&AYS4+@WTj9|1Po+qZRJ-awEx3>9YW+)5}&E#9mXM2SfnAiKOn zjeQxbaMJ_|^pPP2b%31L82%RAr_N|3ohD@TI}cj$!g?Sn5Fg_tBQ&`w>b zyd&>Fn|GYp8AiQD49>emHwaI}@K(6FR~pH6kWv@HCfBV-xMd8u@G!D6*F289vgW#) zbcJLrFFPzFC5)P^?w%>V6T%g%&rDl7T5qU%nb%9zueSuOvIf(u( zBN29n?IAl4dYqcBcy|5{%|c_Fst6^&AqD|neeJ_Sft8tePeb$op?8l@Pc;Pv@p5yk zU?|!(QQD^?A-WgRPB_vv6g6#Tl0T$!!=Sl16k_DOrK)&ktTkq5QLq(n(@%rmNp7~; zlgqc$1a&9ti%_F#m!*v6eaPWf*ne-z2GR9uqv#l?An1FsR^?UYxA^{h_MZjn-86(3 zP|S>IVRdbedD+I*pxgvrO|Y=XcP2?>5)?3sZ?C(kSW$5}5F`p9;3uc zVld@wJ5s*1;`odeIyLk9IB zss!s4ulc$s+f)LT)C7-=JVsF(f2sg z=$CGx3qFKD-fv>P^^_Z22)G0DIHOnOnK}^Yp`kpR+%bNq?d|ejt4cs><$5-Mq|?kEemL6=YRl(M2K1Q>n@=NWB19NtXj%*zpV z&o(Y-&nb}+3^eDpOYw8Yu6;6=Y{!4KnB)6K-p-WuOya<7-VVaGqdufhho)1saRT-< z%H_OKOWTj-35q9k>zk^xwTywp#K2s|6{61aqZnknnu$_*sLeE*I0l|D2Ktb`22?H< zh52{%L8RpzKgM{RD&$hj@#JGol!0{yET>P9oA|*vREm8G(0b?lnEdFaBp z)NSO$9pKQgD2Z!hM8fYfJ+~Xm2lFubYd_t(cZo?bF%UrKzt&!;zdtY8pPv+M=(@DgT@9`tt ze^=hsvvP;0md-R7JWQa#VLo&X|-F<&{`;id4 zv+BL_#+J6u*9S=a1U><)?q;~y6Oje*1_$C~cS{wLPE_v|#DpK=J5E0ihZ|ckC8pOU zL)+Dh+=Uw}wSA~TM_g7Ob^BVs z?A`7TgB;|~;L5!q*yp2pg;{cO%dzV9$_41(}>LrwVGSj6nZFg~3T z#*1ujN!9Vjxs|+|Pc5$7^tPetyGki>;Ce@5Qxu(O0|MF0cCz}}BzQ20+&zf4r;t5@ zoteHtA*4ZDlrSw#FZ^y15R}30cDcOXFlpcSYvX#H4(;`?s#`HVVzlI+zOlrl^x2Zw zlB!C25mE_q&$oT+NW)|Tm3)6q9-_hasVJPbS4s`uSb70B)2qTwK_vXp zAyW%FUL$_Oy!2%9@i90ls`ef$6UZ(-7h8FCzJ#iu#@VH>W_rck`lXw&lZj9hJLAQY zJ>=|rW4T^NKPpQ)BTUHUo24ykbwj5%3o!9M8b*eJDwG2W6qI2l^*5p z2ar;ksYK2;Ws}g~M{oL>AlO1$c}yfb*vvy?y3PxuIQf^=yf)*AXccu$6m zEw~3qdif>1C*N0F2AnV}K>#iwoKD!mP@ZcG!}PmApJuh;rqKwQ0>NkAp()b2kI-#* z&TM*`q?(POn5{Y^1TUc^sXU*_v9B*idw7K4R-2R%X`x1G4jpg7ejJ5ilo`MwF+@fo zp?OSTth!MTI7Zdn^C8u+vVS9Ap5dHP?=F0?gk%l{-5nbf3Np4Zj_~x;(nE<6H=TU1 z?7G9-IX0hM9U1UlJa;+1V2d)CBQ1fS>$;k_{`hpd^*$f?4^#gE$B0@>m$h+cDuzf? zBK1>fLx7<|aABUPInD{W$*R*+l7zSR&;rJTajd6mIg%HxezX#zpN_43G~(Bc2xmV5 zuB=KVDFT`qwes=Y^wsv_2+53&ryc}KsKoQMHS1yTW}k%KT{gtc%)3?(h%2PaUNtPw zX&q9ji%0kZy9=$x%%2!P>?d!#Uk|H@ejIS=l87X)LQ*AnF>$AvPX{GJhhx9OUt@ra z^Ur=q3ucC5t{I$X2KUZWI8<1V9Tp?{vD(4I$8q<}r}cDJvut4{&{_C9hi2eDv0r`P zd@r+8FV;M;j6j!TkXK?zj6NP+pc>WE^~khVU?G(qveJVu-u@>spPBlm)VxjL>jD0o z)&s)38j5M{J)!RE)#-VfvlkfRxj{4qF7TiH16984evCxerw{qq95y~YtN1qk)9srM zj_X3xSt_14dPfUZdI=nYZf(<kUMAK@jel`bBTJW*Z13$hqUldipt8 zi&oNG)t>MWh1Lf@RvBcZ-5~TuHXbL%Y_-7h@>i``OWO#X=v2YKkD;YQE3juLkT|W7 zuNhp32vu93{WLAg+>piZE@pHz&oCAI4WFfFsvv3vH|Idt5RKgumX=;w?}k2rfg+9L zQlZPWVH4jgwc)hz+-6qo`&9HGuHC!Jx~ey6@%D&|jhnuM>6J0jWr6PpG&EqFAZ!Lw z6SfN87P}=W(L>{181<^yIm2WoPjyw&zU;`Sx9|F=fuR<#1X+ zU=3bLKP2RsnMGc-1;^56SFi z?(xm=GQF^aSf%Is$`apx1vKu=(NXvo^7P6)v*+b!jY(VQO3BfAhcWAf^ki#!vSeF&x}FfLLUk^cee>+)LJssTW zqq9Z>)!(O+i;dEYOgXtpA4Lk3-s)q#mMHD4cPFWj%$2jE?DDOM`qriZf497!riB;UoE;N86?$eHZ!Cb$QF%gFY`=CEV)wtW1f zY;`QYS*7M5WP=ma(s2#@PQsmK*Fk7nwx1@UyTuY-UEH#!t&8M*S^c<4Hbb>6g2YxZ zJ%^%{@{o+{(Z~N#BN|51hd+5T1g9s3En|l;*`oz+ALW9>e$ygWP}KI#mpWYHwFgUH zzBoTaXi`RF5G14jLD-ni-<|M)L;9%?WgN@IEJ7T&)i_6cGMl5KE)TLT&y=h z`(!TaUDF5CKzlgfYkAk)XKCZB`;+0cwg14f&s~^}g63+WtDhvBWk4yIYu#_()kWZV z9=Chr=|&>2;wZuE`yGzs&rCiOI-V8KN}S8V$34dwWiPMkHBElRynEp;L%UOf8EIC$ zW$gg`0As5vnxLBIlS2=QSEMiug0mZ(*X<jObtd)emp_A zsDkRd$VkG@?hQ)c(CFGISQU)=*GaM}4CJIu6H4u+qYl0CAF}m{2*mpBF!k3Lw-S&z zDNNpqCXtifbXOq+L%?>Yma(WKTb-FyB{+K2wx{+DwrkwU6_K#lbGUJx^{Aef;&eu| zFw*!g6s&wO<9{-2orR5ER!fyav9DS^!X7Z0LoAcKNUcyz>K<-LGUk}AS6KQ8-|v+- zih855FJ{`z{%$rtxIVUBQ!tov;#LX1hJmF`?>cL_xA3HGDAfFZs8^H|#~x(H7&p1* z0j^Yodciq1>wA8;(T^FQ6f{l$pt$_*LAES(8?IX$BZDof)zH~H979^umujj^)SE><;)eYXaVa z*?8T#=uH7Xv3^IVf#y(Z@!L*At{@{uu#DJXa^>h67yEeOSnWu!`$d9ZPpX1#zovhR-N(nixmChDJiu6 zH08%bFX7-InF{ zO#l&^hxBd=Q9X|7cwnm-Gqtu|RWKm4aoAK|Ya;Xd4O|1SXJ1xd)UIJ^o%M=dMa9U+ z*L3xcJR5PFBOx*WHy9rDVf7%{a{ip@WcLNt7Isd5Kf zMgDr8VRwv34v)oHj03&6+pF63&=gzprdyGuvYVWo<3WQEIV`w3nah#FWJeDDn(IY_tj)D#r=^9s4a8p7bmz zO{LQza4u(C;t$r{n^6xaLT^6+e@6x9Z1{E6Y1rcPMBfE{VLIWJ_-N(Cj?qL4hn&avRM;SxWm|@o zBjRAOQHHlOzRQr}>4GNv;ko>yT02lykpOPzCe8comlDsdv8-O%m( zfk~!(qBM!65-RNKLNv@1EKnYLTu-FP+NbzuY?>;w%qeP)hOsu|+In0@>I2xEscCmo zYfO}gSs4mt(BfB^q0bQlIsN`DHUgJ|p;rF)+VWp6HWVh*8>ju)s|jFg?0e*o;D0`_ zci++y=|szn&!?g)NkWOcIG5-E^~J~7%cz|)^_ zJ82(V+ZjNbJ?ETtUH3GyBHfnHxRhi8WrrwOoStTd<+IOYa$UZyKNA5Zem>;rC<QuRMtyE}xIL;kj(0dz4|JDo z_eJSC+)k61f*W(unDKUU?{!cD7A2-cbt8zCRYw)DP_9#WC91GcpH@Te_a+0#RT-n} zHGf=@la=~+W0uR@uE!mK z$>$Dq@+r`oa=-6pW0dzg<3|M(tO`f`Sz<=6rJN+IKsx&6ZQr1;b#uYT^?9AU!7MVI z)QZ>8<^re1O)0RuVFS7>ZZk9q3;B1Z=k$&yg=sVol?2>%YfFyCEUM?>l4hGlASCVSxOrD&8SYVEy%o^;%>@(yEF+4qRrLupz#>JJE^KHmot zZqJI}M>3`@&fjx`4V*MwWkzza>WZohe;uI8;)t}DiG(ayExVeVjOVNfo5K|PBEGZU zl?}!|us!_qY;vOArcJ5VobWI`lH_5VbP3bEh`VF%+Vup%;;lPR0ZkE_-Wq`4CA*u8#fo4u=wz^36Wo+ zui{`9rb%q}w9#W(^o4&DmBeLe6$WU%(;>sStXf8gaGGp;^i7r~Z>NLxF6y@CzjYZbnKJ2T zz}V4tNPsYJI2}wMNON}b`E78~*-6H}cfo1flG=>Adt=z8OEMKuRYMCkO~p0{t!@%G zh9t(SeAX~v*f*hSJ4omF$^ebw3GI#0g+`Xo_$uAk;F2HYX9T{v26^cE`qLvK8x$lR zg}>e+Cg&jTyZxWSxU{;Q2hbKPC&Rtrc{m{-<8Z!#w>x?C&vTI>&HfDbDXcc^ra%N6 z4DuzgH~!{eQ*J68tnsNirX zu$<`%-HLeTyAwF~SS)?i;&j0zZH;`>{R1Cud>d6K2Is!zgg{0mUn?$0h3OFcvW7r9 zR(N$ef4^byB-^^MEnW+b`YHHsjJ+#Xoa2x)9YZ6#eR>iboT7LX-C1v+;+M?cEzFk9 zr*P7Ua6QZ{4!eF>lo+Nt#WHVM#S0D;o`BZ<;NU&VQ9inZ7iy|BQ`&IF+WRJC26rYLyE8iagZ%z}J7=j_ zu#^@LpC>GMV_d234U*w4- zS!|8Ht=lirui%F5+bfARI-m3IfbT>ul>GWWHj%qN*NccZje(JYT>w83K}O5gtw}e9 zs;&>ITy=YBofOQxNRJ#`-}BIGw=yCrla3Ufg#5NrlGWr975q3t*^h89%e5fRBGkf%#qIdrFBHKz&IFwsLTr?-l0c=UyChIhlSdUgh6;6=`UDq+7?AG zqxF_Uw^l$g00bStD@f@-y=7=pEUM4`dq%+!X;VDoa~6swe3h zAMBq3309VNn2`!|X4p7YXM;lEjT6c8#_*>O{g^TM$1?WvMSVv+8~NR-yfQzqoMA%8 zY!#{RL&0!{-H~pT%HzdPtAg6aQ4ZTb?-&)MWm;&Y2q3^w&Fdq#_S$(BF`p^7!lR!^WE&!pYB70gP~m2tn6kx$7FmK5Vny4mWMsFpu{ zRXKY73JPpY<6JF!2VPAmeUlAsR|~AJ?rq);oMMsj&>pyBq?@=0wN;o|9UO6?SBq(s zgGdnPl}42F@ee9A0|>Lj_1xuw6_VY>mC_K~>iZWNZo$kN8Ubk6l05e{7gWBz zpjDn*y4K9ci^A7CS5Nn2T~2TJT-?B;2h+kwBCv-#Bz0&f)enptM)c>rE^7~hmEegI zXT>qvSv~gE={!`l17KxHc{<`uEb&to2FC(&&-U-DHMIFn-5v7THXZW>&E1(lCHC(g z&z*$X)yc%Kz(ph5rWo`w0tw;xPk*G>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?faRkwfF@TD|&ob#-;s zu3fdC{p@|h739R>VX$F9KtSLnB}9}!KtS_>rxFwdutcj`-vxL9by5-sfK*T8o&s+m z45h_IfLBtGufN~hr-8qq?IkpwKtK=%|DB-8Gzd7rLP%#xSy9OKZwMF+=q|6s8^9tg zXHgAjVLKZe6I*8xVMh}KXA@&WHw$NTLUBo11$BP}3=j}P5J?ds75BCCY&Un@p^q=U z1~1VrjiCgSHZ9wo0NCM@!L%)F?vmhJSZHW{OF-m4XPkH64mg-a5cbbrgsHwD!-#13 z)_*m-I5c&ZUCn%aHzc{UFN+dw#u9k1j?<6FFQ!Z!sh~MQGUK;+3)?(+g$QOS3$rO zS!fBA7_KpHMjR_E>&>7rBk+aUpv7s4GA`qVjVnkeJ9zl$7*W6!QRb14K$@2oE+|Sw zDtJM>Wak%~s8~iA@HJ4jP~*K1c~nIlihOtMuafRaQ=~+4Vt9C2!5fq~%i+2}RmqI7 z7(!?~T2Rq9G>5DO?WUq|3E{$hR0Ss}^0njqxCHV75(&VR1Fkv!%ivvCn@Eu)@VQYO z@Hu79)lGt;6CMHU&$u9j;nh4UM~lm=qcRd%5o~O{RKGo<+@sGJQJI@EVp$P78NdyS z0&Otr#Zw>tf(UT5&|#dCNBXgB#SyH?O(3|T;hl!@QnUq3*hG2mONz9Bd7wz2j#?Az~wHLN_RKoHu1qhVe{` z3arEtVls13l8GubRQV;mb9-bt=G)Q23X-zO@#IAC(T~D_8%}~jVeY!HP|l@z%OGvm z(?&4pAr`qsT&K*r(b736BA^&qg(Nb9SXtL7pxHwGjFYaI7kx&dm{AOlSw$swBP7^_ z_%qUeYCy9U^BN*6(AI~)<1w2%RQ6{)khSyGjCZ z!%Y~*8Ah>%6dBil1$vWy%nEH`-l&HH!%;XU21R-6)ksJT6&BWNgsezQRuoR zp9h$7MtxDFxg+>q))%z~1DH&P;8avpuQul9xZhXmO<=D&?+^sAIS_~tYV!M!AL>me zel**x59_#XE(rug^$Xy@&JAZ4{BAh1h0I3|MTrmfp_MMl!zKdtVlj=2KI1i9=j&Ywst26eSx(@p zlv*mt&&%`s*IiNB4%9iS7st%{cyCAbn{@o{~B7m); zY^51*`OASie^gX%K=>I@3S2cy2thCz zjUx(+a}qYn4{0$BD*01oZQXaEVN*P8paO_C@o~aMg)`(NHz(#^X>N=1K-?bBReO$K zJ!bkfta>kp)Wk5_^TI~H{YKwm!n|L?J4P3nz-Xw7UaX*$kCujjIuJLw-DmBAqND_I z{7Zk&9$SC?p`*aRs?&41YjT6G&{^@#VOhX;V1>2NrWwtK`${V?D8K^=J_S!uGJMy5 zwx=wt$*Ko3&sPx{0Cg@1LW2~R`i*!b$hgcVK@ly!=%x)Y$KJKT86{Qrn`3Q}A8_M2 zW&y^H7RDNbCjg=>dCsSI^8kweNc>@)+vB&H5}fS`c8s4X8bGo|-fH7^CIVNG&>W3N zM@pKIl@(T~bFUhkgV2Now!j)MH4FzjVK|+|wbC4o6af0|l|^6BHwa0BDxJj);Zrbg zjpW`mD^RauasiM{e5$?TQ`-IjhaffK|C8NHFg5qZ~z?pJm*x4Ukc ztD0w`d*mH6l*6&p`V*;l8tuQ~SSlz+vVY+T@YOKYRinpf%jo&1|Iq;5ytRV6m`PM~Ox#3c~iNDKQ{UHher^)wb{Z-l|QXq@=0V9er&0R=gOBJ8&wer^`E-S(BI;r+y{V9$A7Xr__ka8T* z9%>HJep%9KMOHvjq8g|-m~9?+KF;&dt|&yw|5UlundwZ$-)&RHw@w~sqIdvMOTLt& zqrrXygM7YR?^;Qb&AlO^vQMqst7x*`RQDfYcaUI!Z1x>F7x>EYwYerN28=2Fc=v#j z_ic>8JN&`veZEQ%R;w>M7P*Gs9A4Y0qOKkaKu=Eo@!jkzX`+MXU<>hi;w^KvZHFsI z>#}b=v$ty*frO{ee@+9RjYGirIs<*%d#3qA^*K4*Lbcv%z|eH+nXD(bBh)V{{%L*y z@hfNi8^f>ZH645u6dS2#hU07s-wBq9i9m;zyLy~%KMNxw9-h$3^YgVQ-G)6^HCOi4 zRj!+*M5NL=d%OwvWCi5~71p2rK^cV+dp~*PXz~aAMIxp-({X`N0iVFS8Oi-+H!(Pg z@_X0JZeukjIwVhu`Z9N^n=@t{_Lt?zY!@OeGerzwae*GR&83!ZZWC{0|WasZm{FFUVyt^$- zQ9i5oxH9qam7@o|XndaWST`5Am70t#^L|~*S$D))<+x{mb>2YCY%U@OGV^;_p)cVH zLN5VLQ%PgvJ?n6mJs1Frc7hlQ%2ndu%_-KYtnPLg7yVY#e&g>d__Y0uHF+rP+*<4f z9yzJ-tGC)CJTz2l zFe>&A;-YLry5CsZZk8EjzHNMm8xKb3={ruOR61Q?!D?1hsH=h5Wn^Rty)NXx{y^k; z_EuyvJD@iXR4K!!U}2u-+&zmOlz-xYEJYvzH6gnbKrR{jaIl?q2WMq(+?wFM}ZNh)<|F&8BfH zXCvMk%w~?x8)guazb%>LB41?5E>y1ul&CMnn4r&V`L@KN6d-G^t=LvXUsPI}J8kSX zl$b`h`Z0}JJr@{4%YUI3sT^eS$M;bs2sVihJ!Y%WK=aM)o<+_Ob~r-obzSQ)2!50z^I-?)CfYM--HVN8HL4ss2O>&yt8_@X#mW}LYE%wLOqAK>w1ddPG|WX zG{nJwnsnZbslCR`*qH8{64N3seU6f^9rXs7dAwFQ8XqZygdfssJ*wls=n<6Uy`O70`q{wPyXC8geA~54d#VODdWVivHkinfGBJHB8v*_Kt%Fi} zoI-XDoI8wb+F;n$hjwD`FjY^CN>t9)?3VkOC`f-Mhp+Q_FB0VbuK-Bt0@hWnaAh4~ zA@cV{jrCHTS~XIly`-`!hvh$<+UVRSAgD7Zlbv7Z04YHMc-bEMT76+ZvIV={ImoZkgDuGPlt!a8dnt%nC^4kx*TwS_H{Gx0ago5>3qPa;sWUep%1jT8*u;TMMB7IbL1w*A-*^~Mxm z{*EMSo=E7Ytr3^b!I{fnxl1!2!SW#=83b&};-NuGNAH#>xov%a8{(zrUb3XI5(?r> z6mNZICAIlJ`AU9iPu?E;j1?W@aRx;fZ)Dkj>9u*;14d5x+46&ALdX1s0s}&p7z<97 zW`nafvLL=jEMlx;SO7*B+2nZxYsvgUj|?!#Sgc)TzmaVp=XMnWBW?F77#Ud+;&~ro ze3Hy|o-`?o?H{@#AZDr zb}NQyzDs7qU^!~bD@EtwF{HTRDv3>^m-n0XzH;d9{H4wuMD^)c4NQqd>e{*L9j=n>rmcXN3t?K}b+Sb%6RdP+d~cZhQTc zDtOmEamV$~6RR>ie=NlbJuPl4DvCW1JecaC3M5>@e1ZcugqrI2CD3pZu4Iu?=x!M5 zt{<&R5|Z}%Qivw#K8&=F)4l;6IX?j=M=!iLGnpr)<<}a0;b%&JVi$~7AND9~V8BZo zX@XCsdM})V=4k+z6a2h6f`KBcSL23}=l2!zG`GBQMC zCWaD-$;mz{lf31_W^4=s<4+7nyScpmhQ8d#Gwva|7;Q}O-~0hT`FXc8j>9J3U^-os zc#*)825;5&o7UXKJKNhcuDai1L*k?@JFL;2-NT`WUKe|twHMo?<>>t+B#9Dx;u@=a&^qu@0Tz}(L ze(eRg!Gf_fA=_FT*4Fo;{#}VD4TJEi4gsRtw;a1Ul~_?8Ku(d~TZThl(6ipJuG(^K zZ=Ch87bZ~y_k0b$x9-7#DQmKCMCOW~{CRB!KCdoXT=Q6h#1fm4P7v>5g(;!OhOadg z{{)!|c>yn1iaNk(dHmTJFjUG#Lo(!jQ~;+@JsjFlg?O4 zeOTL*#w~gRRF5o$S8CgVFEM-mkPj|AJiMr=$WMv$=Lj~+1UN&yn-_QD$*CB zZe_8z<;)U#JxOwb_q4~3os5JW(VPKc(BPx0_>B@z#?LjQwx^+G2`Twu6DY7`P#wAc zxa8!a>1>`c`wph4AG!YPE1WK!DOv7WsErH#25NwUbOug*kBTV=JhXn031!LP>4>!g zJ4_TiQPJ!d#X@{&k1pMa$Vf>!$-WEMmLiMlI&@?NQDlpG3j-AHBwa|^PGg%Kpr;;T zu+Fa2;YvnF7d@59q5M;69$Shs__$Q(CY;POhgjUkYUc^yjTg#?<46q&cZ@=QFH+P`E{cFqeew+8z8$Q${F2t z@JcPQ)(0H`r2DX|Dnc?ATrF^kP$G^+*+f}yrU8FA!D+t?I2yX2b1pihEfBW~`Wa6W zvWJ69?~OFJy*Cl(%x%E9)0%12*2|vIEx$=g>_Zu@wr}!&eL9A~VNI4PYF-#73R01I zJz?DSXC3B&4@BIuA_GT&Vi}(!UO3XI+@HT+<+06Te64@$==9SHzFIiM0Q2DRh|&5Q zX)C8Ch3JZlMy6OWJ(pVm^e>CzFRZ3oG)I zK{&&w{lP@^KV~#Pt<3a>Pxy4LiAD$JEEKebj@V)GMcZ9!d2N$5xv|#9MPy;ASRY)u zyNdYF4{oVd4Yg?KanVa?j37SY?@qoOrK|A9m2^p72xI#rh03SKB3$&iaQMkHY{ICL zC=q8Uh&YHED^;CSP8%M4=lnm^#nLW$C*1YjIUqKh{US`yH5WY(MTCV(@CS`ztdLLF zoJoq}=7;6@v&C~izJE)IQUHKoo_F6fa0c%}!693Q2``uZ;J6x;!XQK${hR7X_!IjK zdrKc%=f2|;`4jUIZoWBSpLEI{;&(w$o{iQo@DTC^hNb`pX_YRBjrata9^;kfE$QMa z1uf|p04|ox{BuLd?OMvH#GVq0#kxj4*UM7Ip-AC3;Td>t?j!}MOWap@{PEg+HUp?{ zuw-|3*n+XrThUe6Dr`7gUTIcx1d`j;!OjHE#2DL8+%(b`1InJ*MOKspA@`-yhLqCZ zyq@pt2v{yxa-1(XGMs#GaB0R(_!ed{nr0OG-ZRB-_T@V@w%-H#_}Ud`o8lVuHieY4 zA2p~4w3PZhbA@UE81((I(A*g0apyIA9Vj@z!F3>xoi-hyNrTv?E!r%y9K6k{@$`CK zDBO;+d?byz0!Hw#u(a9eLqDN~Ix?8Gvz(PMY&p3Cd0E_JBqWXk96Ykpgv>XN^^+8w zu&UawIKXsJsyV!$6FyyVgWC7u4PAA6qbI?H^*Fh;q$qj#m`JD4w|(j3;t6GyU>IVyfs8N~UReK5729l!E51W-fJM=lODl7ANSppj%$>V8z^>$4J z&}UdMat{}gsT0a@h$uIiylMu&8{$B#(p4_)X?)$P*Nua~g2};%7b~2U8%8gW97*++ zX;Z}T@uRSyN>oysrAriQwf7}3OPW@rDr$~*3+~U%CUMc5>e2)^+9+i{Op}aDjz(2* z>-5%8auY%iMK`i|+^^=c5Hhho8j>$G zWoD{IKZHNk=!@3HUR~lz=e~(*bdc3u$W?A#h@-b7*tDgMI)nDdOJ1q?H@Tn-sFX0h z7vYm)6T1_Lvk%B$glpKlYq9p2jOfzkmnRgzv2b=Uh9^ytoh#FOx;YtKF&w=~;pD=x z--CXqlRi-h|Ew25KXFi#fqv(z)L7)+_S+>btD}Q^-YxAZrZ)l(Qg$9aw>Ljbv$PYD0LjlA|(mIyp>jW z9H+-IsALos6d20QDKO(B%qMJ;XGxy6^h~W zQ!KRjQslX8{&6wCumHgpr-R1hj%2&#@c@6?a3jw7+8B@S@d{*6vo*d$q~w`hI~gqG#KH z@64a7vSu3fJ_6;{?e;?LKBtn#W@@XJqu;$n%5`_OgbNEZ_V-+6!U|lmr=P;!FY^AP z&s_J&`5q$5^Nme0*cMJYCMt5qF&%G

9zK@wK`#I_tdPUUnb&B9|~iQV4VerOHj{ z&*IhG$X_1rN{e56nX$ioo8F~xL)@Jf7mZ@&IsLVS=JUE#^Rnq-)GALE!doBbR(&#G z7OKtrqS0QMWb=)CVe`7S=noOmyN61)QGimC?bZ;@mW&+j_`!J&IW(B}5`Xh0ZSl`P zaF^@n8;9a1Z7V$!k?K@Q^{Z_(Agh#oJctY&U`F?7J}k!cvD$Cq zY8Vu=Mw3&W*Q0cBGH9U+a==LEo=|0UR#ffGwSGtd2`#5^A3DrsZ5$HaWE#_c{scou zN;ewAVvg_zaV5b=a>!m!KYJLfs2X&+3C}1M3tC3LONeGQk z%HIUme3`CS&75A=H_bR+`3+P3^W3sf$V-sFcxrNw554VQ^lkU-XuS@d=Y?(008mks zCUS)zyW4i1V?d|nhHxhu+1sFx0LEXTwm$$5hMBmmR=&X7vQd=`4MP~)^t?)sBu11^ z9TU?Ows<1!ink#i&Mxg}2gK89w#*1nv{~IYqJruoDfDf?wDId_5gZiU0`f(G*tW<0 zGdKW~sKp)V3fsgin2Yf@Kiw0I9XbJ?en{0ERpsX=$AysJ{Sm`9>u%417fEwq1IiWJ zVsJBcIo%!#spL0}f5`Bh1fU(#xAnH}gN927?Y|0*%7Yha{{rN|_%(tSyPe1kI4`R< z3;8#VRoewUR`$S}?$4h+647NR3Aq(4LWv3!`Fdae4pVk>VbR$gkB)Pq7zUUj({RxU z!I}-Gb3I?Z!ZBuZdv-3SmM9T1uWwi8xU_HsvoB?HMEMgBit{0-w6p&X2=c$G|2G$4 z_FwoM7@}Vk@)~JUWZcBq9M&1>VP~K)~yke#F?npx>Z^G zky5qnKMUnrRFM1&zAA_{MnRsj9)M4afXmqnWQwNOnygNjDlpu(Jj?=}a$as>$18XE zc%@4nKN-4rqk3izE{zfy!J)*-e=V%fxI&KK8f4nywzF*7Ci}{oNoJllqRg9r19z?^ zHC|^Ico~z|XfTBbHb&91?c=4As54iK9EHo35KkiRxZ#JZ-7kCWKVbER!^D}mB(FCU zF4{)QjXFxl9sf7?HDXUtqy60Q2d{_D{;|jfSZdvgyt)J63T{L41ulm%I@aw)_-xeh z*tgXFWu^OooX3HCfeM#9p6bfBsGWUHX^W2}yy#};`e+drYmO!}sIkG_s;3HFji&`< zkeCu)7Jyx)jkRADWc8nG zRv^&9jV|xlhJop7{iW012{d=p0p^&$?MJMNU+NV;Ust$O0YBaCT}N7{J{02n8_kcd zFQh^a-pN%nc{7tH5uzKlcCO133Jw6Q_^zP1bS0jE4$ZKC$jMx;N zA?a=FLhC1)=_%$16!DAN4J#+@kr4KgCI@shS@EV>E9+k>%6y`CJ3T<-+MLb03Y z{n*6J%!zM^yhw?D86q#Kyu822zPovkEePNUl~d{Ouyi&WfR=u4lX!n59&-kBPD@52 z`>p}~RlJMqCS*Ym$m?>o==FMn^|H4%t@NJ|?5 zySm}JZj+Rn>a_jqDLyC1XZ95OTxa+!f>kV6QKTMAyG{tx0*>p66Gcj`*0CqpSAOAm z&^y4#jG1?05UCGOJ~2Yh$lVdELhW)$31)k^CEfFd($kb;*Rjo>41?)K3z0|dVi*J8 zqNeU%a_+2@FV)Kf=}=cV5f}%10Jm!9GnX^LWi>})=y_-U{rmT1u0ZblyZ1ET(}wW5 z5X8b9Aq)|SY6qP=@T*$1q8BF5DL3nP2zlfvZDQUgRrAB+oZR55sD6B84Mhb8rW$2J72U(*{za1vDeneyyA zRkG@2702F@6d#xnCYi0=9KYmbe4amjX=$pQ)*o%tCK4i4UI`KdS6af_aOOF$a&ny> zcWe)e$an6m%s$Dx7!<{Yvm;$=zmR3&EtoC8W{m(BVQC0|XcdJ;YC3OWPESumyQu+d z;k@?8gdqaXY%OT~Ll^t?D|a`}wx1JnA@7&!QF3fZVz|eH5k2Q5m)$SWSv@&|PvZ<8 zw@0Vel&|Pt_=zFP4@UZ?(0ALPSyLp_g)LS*SD&x!x|<|T$6AndcYv~=H}@Sum>Vv=DN zbN1-~#_i7c0ZiUce14kNOgDknSRzRXViVffPX1^kfwp)fp5q0llcCPpQ=gJteZ!N- z-@do%+eQA4Tx;K;o-WZ57}T4S896!W)g{0;t4Qb4u|w5M{Yzt`(#?fFMO zO9r}I`dBr(p}=?!d=Evl8t+yU1*Y2k)BqhK&UGISDv{0n7#QPO&(EwI{Rl~AQbpq$tw}E-QXup(8}v_2ipQv6i15(z z&CMHy$%@8G_5m#_7ou3FFDTgJOwgxwguv}cJi(9H#|kLj42iNwuUdwZaEZjY;dsJa z2raG?sj|5~B9kB(rHE0@X<)t=P#}!RL(VgQlI05vmqD>PMl8U9NlJ5;LC)rhs%)%l zR(;Edy1+$%bBg*$UAP^i%)wdX8|#fZu>JnzT7%$97G-mDXK$2q1K?m|!Vr|$ zzBRPFl{ugZifLAhr+WSC6aZdSMQk-nwGr5+&1x!2u`wFhyvSmFp1O>=RS@c-*VNU| zyPzc5N2pSn^m*%o40f9gT??T?*`-hjqCNKm+Y0P|lJrYDlV6Fnt5uU4Tl}rOPo8{4 z>$>)+INo9AybE)Ky}sS!C+CU0fFK0O7hpSeW<0UA<53iePgLEni^d5-X8E^)OwhH| zI_wXpC2OjAkNkboo4mfvmayk`Aa^aWzvisYcm(YLgP}YQ47VWtJlQ^P%CI8lO0vof zX{4jovKWvJCCoo@A<7sM6s94HP9ZNH*lG6M=>?_ld3XF%ts`Bd+tqqE&4ZI;e03zi z5wpLx8m#^0JHu?`?3U2!wNm>I%m1@05JoHh7~Dil$VH4Vp z4`qHU52&fQSmDbuP23T5wHEQ47KKS#N@IWgH-d9gjUF3DBzTS%2Pe!ZnGvOM^i4}hUEMEbd=kpjnUikmhtL!UDqu}@$+UGGw< z)#TTL-;rXF-JdH;B+wH%1{-qS+tXt>_lC&iIWUm*>(N*UUa!O6B2X@UIyVN)CdTS6g7S5q?B@QH_Wx&bGyOnNLLI(f z5$n$~wi&DSsndUnF?&vqWw}n1$+YiqI%a_xWTXY`kUJqj#{9%dj?78j9N`O7FxreQ z@R_Ogoo3>_IpV&=;!P^jSRUS;HA}TIRyM&NnC6e%e>>hmnk~H2A2wXv-s7>sjphAC zaqR3$NVzA^P<6bpZ+1P}ujPKacwe%hfvUcxI{7>$0%6RFM0(c0I)21yn3mt<6rcuN z#N}p~$6zH0p@CQ|rg14L!v|xDZ5Pe!lne~V-EWs9d_eG0A?r9SYcO5%>%DeIK&Hon z_d6v2k(+u{$ud>XerEl!tWtNh9m~V5;{Bvt|Dofq6useX3%+aRTJ#l?S6xgsYU^KO zjvD!M(Jy8C!=vrbz}1P!I%4^AH}Zi7nW)(xJCdTMOuTJTsx(iAROr6gUeU$!5o!We zx?6Kr!xli)sKp03>kQt*L&g4It@X2KTz{{#$*j>}n>LRJwfu~B@7Yr|k;$C!``Jg= zN?pQ^&amA~=HLQ4#_h5EpZYt&?@Ov$9-rWl^LA{u5@=w;VGyKNS_UX%tJySqx)Vn= zdi&~TF2(l^;;qich;kn8(C81hWcBW_K~Sr%-Zv$R`mM_L77&&njs)1K5tmryl9Isf zlqNx5c80N&c$foO6-rTBL{n2!``5!#t9JDfS&=F2sB^-c6$saON#|gs3Yd5R>S0AM zMv9!*Hpk><+_1;fdsYLa8wmv)XsI3F9Y^r`ZJ}Odx>zbMMRLak)Z*ub!QTX%ptm__ zag^@^)BD43rq{O=6KQXE);|Q^sI7Pnj3l?eVoi!&)IB&RO(aFBKVrv(&b83QvDwxD zFUwLugCU0VI}W#K!V(_2>vo(*+j&m(MpmEhE9~!Z){rcsz=SXV&(ZqiZRW489>$lm z?b>nNF?50P0V3@K#PQH3J0`OsSJ$g``E+?h)5m{k0Co$A29i+@H~V>dx}(*ff)*t1 zt%!pAP{n&Y1#WAS4_D?#reg^Xt1+4t8$g2WHl5yY{YyQ(K4I7|SNckdo!svlHaWcz ziMGkkCQVHU9G<4+uX_&vYTg}2Za7Riv!iW}*9;f!o}!NBYSZ93cRXt5 zbO_xXD|gKP-oYgQ9GI$77B>i?XGc+jruB_kr@)=@)9u2vU*q%U(uc9@asRH9U7%)x zRVrildL7K`-p2?L+Y>qib9uChcxfb&;4cwQ5sfXL6BNcM%AwsZUieEm2n;z_Y{kr- zQMeEJM^^q0%y%~piLf80lW8}zP0QLMTYm&6plDGC>~n$%Q(8lp42Xzmt0&SAuv)^_)zewS$slJb7Z+rq z%3}xK1eIzQvN1Xx$=u#??>o2Kcj$2H&}Sh)0waM7tPY&GeU6GOCWNfPgeVLje@!l1 z_hTSI?V@&IVLuh1fKkmK=L&JiLczaK4wVa`%`q-q^TGkx@f}2+w%fUnX+?KE{SbqmO=P~hPhmlW`kT*$7 zHyhZ1c9kd@tvV$`m=YWN0-kw;N6u@|MdKu;9FMBt)wt+Rbf1#)X_tO&R$oTqANr?3 zRw$ALAdXt%+MMNvUEu!X4;l-=%HOIonq0F&#NOz>9{7ZDDscY8Ct>bqoOB5^pBRrSw!jF+=S17iPxF$8Sg*CM{P-I9vrDHs&y7Me=-}#q}|X2 z11xtK91S0+ZzvBD^E!)obCdvmg3a7vqR>0BfpoBh>8y|vH zfvQfYM`Uyl2TI?04d7!^EgUfTQ>m#aGrRU)0>q7~UI7LI*pnFLnjBT8o3y|rdkCt5 zuKoTFBWyhAcG%6~NyO-Q#n#fSgf%81AP@}S*{k3E%&%LF!>3pR_LMle*5~^|U?aA; z$q4QEt3!tUKPkwuMQJj*kS%illqhpu0&f(O0|HIt-(fE3^}7WzzoX3kZps(CW|V+6uB_($I4!vXe9^Z2D3iL%{xhyNUoW`lx9tqN}PRvs4nX9=;G zN@xC}3V&E^C^!-Ya)>%FcE` z561-kuj%GY5OUY3BaZ|5(d<`aM|u~FUqO=FjKu#7vIIMji+k4oR6>2uinZ zdAC!7iYvyP05`dhxL3T6-wWRk5|YwH=dhlbyfWo0+Wt^JFh90CWQ6{kTqTCMSrI;B z3`grG6EARp2)K#@+3Euamiqi~y|FfY5Ow#IwDfLSH)H@)3Y**S6<)AqCS0{P9GO~?&fZjy&qn6?mymt z$n|`>G{2zh*A@Tkv+t|)r-lbz4eh4bO^K#<_m#Z%U1ZA&)@+sj#4_lrKG_8~@q9#C zp6``-jBSd&8W|dBRylk=s9M2nV%vElnuwZO= zAXcP5k>7Z*jMugDyzeVh&Br4tvn=SnQSWSGA0v_qB*}P31XfS_s2?0;fJoVELMZ-w z0BEew$UetouMNmYr2Bii>g3B@Zd%vAl21xU*{PFf2+G=r82;N~`n?nzvIWImWQX|m z37uU-`>RrWQKlz}|DThvCD;BiLgN1@BxNjUz0Stui#;sVvsmbKD(9>C-uz3$1Inyk z9Spu<7gVo0`+LnS{!i!Wba!Mkgt5Nw;E%M2>))uN+Vr7LON1_vR1P#${*f2INxoTK zDW#m>)xRGREBPwQml&+B(r)h#C`o7VhT`Y1yAa4d6=mEo1|Doow^q2;&J+^rq)z=I z%=e5;v;5Eddj((YrOIccF`7zKC|6vcg>8dZ4uc5sShoxbpPl;;_r&_VKwr(g1hoFEf&oLk1T?yh}gqd3uiXHZJ}z8T)yT1<;2zR|QzIOgt7by6-`yJ&Aud)#GZt zuDsk7Zanm}?>(emS9!(g@n5sr&FJ+F*NX=U_a$pK`NT>hznjd<|ZFT_Ms| zCzZKR&xu}+rg~u2b+v2_i~MubNeS0x2l*g3Yks91+bX=jEYdqubB2U}**pDRR7`Ui zhaw?L?!7&3{ndX1cd`@-TDm!q`mN;pF;abYi3$Xx%hoe9m_Y{6^$YPBZ#mbWgyEn& z9p{F_ve0S%E<}^oW1roz$2*N?1fk%IsnmY;gJpH8jbK&IKkP4VbhE-GNsH6$i96CF zmu9dpwn6T0AKZ6w4f~J)8ng`qBBGyZOh&`P%eqcYx|SqT!HG)5#e?;*->&pUyL>@)X7WQctC3SCR6NsYC|{-=xutmA!~ zIyS${m{zd>2GWdpLgJt%S}SRsfI#{OUz#Gizf{~raBvNuT}d!U;!_s8$0Eb>fq(l) zfm*|O7H_P4EE27^s^PlHV%Z31I-MoyqKZB?HbzQD5ucSLV`vBl4ISRPNv}#bS_GiY~lX;YX^kW=n--k)#|V zoC_upfxx38KB&abXRcY`s>bbBgao}Ai*H&<|Fd_I$jGc4(h};t(S`Z=K{SLqNB@w_ zD)y?r69e!+J;6axT1=$x%Kxfb-GiwpY4Dl>bs6UP<<&6bldaw9!EE&-%o)XtDYkdgCEymVjdgHkbg zD_A57g?G=G`hG3k-QEft7g5sGq zC;sI5kAlJmN39Y-rUn2^odOb52qe3U$cVdEgQD)kV?R;mJxcz?jwA{X&3|`GTSjZj zS&|ja@y}8)gl9Qp=zS?fB*|9zM7zTF2}L2C#P_%s#udn`C708I3vK;Rijn$;1@j3v zX>LU*=?>|ZyVe=M4M(eEed|$?92)1E-kOyuG8#ImVp8tlNdX)Z{7hYOIlSkQP$*$R zMqaXlIC0)=s%J!*iC0X(#%DGc#rnjXUUL0143BX;CLedEF4<6L+pxHxkV|-IbV)GY z6FVvl66T^FMx_BYct{yfsmUb?@awS)lS;Z@e*)Eq;u&;gL{z!#7^?FI5hgN{SjnSg zh;$_W(60`tn}o9GD~a;@dIeVP6dn#`agk zLwB>I=x3m`LKCV}! z1;)E2d&1#P+#??h_eBJHPv4N^8@kcwi=Fg*nQjpS2 zp*D#17LT#ZT?8%bA4m|{unSz>jQ-~$iGCw9f2xYTyEgSoJA)*bb+K@_+5Dqs8)*5E zwxFT;#XXN%#hzqH8HW6kYgal-18O)_>I7y}!bgt+?VcR|%;LTtkP(|e+%2aN7F)I| z)QEXeHRtd=f^()zVhzE%H6xkgNqvIxcaY4Rw_ zHe$)@@x~#Yl#L^s>6cDgNXsKObXb)0@H34@dwD=`NoIZ^GuHC<49-Nw?}UeBed$fJ zkq8}c&PrG_ZYg&Y2ezErO=}|>nz6?!{D>II;>d*wF#=MPVg<^ImuHZy`9k_B7$MVG z>*))l+M73&ZeIPwwB+&d4@a(rm7xwTT5GbCMVd?&uikdHw{$IP$q8vQYds8ryVbUk zr4T#nD^{hR`uJV~2y@?5o)1B+INsY+U{TXNHO1faQ0u47M)z`?Ul5%MxZ^4$LBnT^)rphjr=A1{>2C>M3 zFH)XYW+{=Vz{5DQL}##VUtcbu-!wbvC?rT-Tb|ZYlx0X$8EeUn#m^fGurT^g`##>Q z)F*X_sG%X3=)7S1#Ls}=Q;Em0+Qb2(nIPCpjKmlaZLZ4Z#iur#^<72nrv}2eQn(yc ze7ndk@sMqb7;nV{zvY2(I#397@`Rt%m}z@vLrM%w(;{g4TI`>GBCRsaxCuI5-YRbw zYu+18>!CU)q&gbbsN|<5#>@B&OHDI|4My@H%z-n8Jc*;O(Djf$;l2Y;lu`_IjK3=l35<)I~{+)WJW=tXEGd>bBiO9xsAORARXgo%4~-&XR8xJ8hvS zmM`*(sQpN|BHw)mu;wXnT0qOF*}b0;Dp*FG{)|p@3a7p_`wX7f=tQO4Grv@W@ElJY z=VK4uaII^0crX;_$cV}FMpxTrM%d73)>*Q=NmW4akdn1<2+L!N`4oU^s95Wa-7aOW z=$-XBmc(sdV1~e*N|w-^!0xO!MA)S!nOQ9S-&}xSGu0>zDJYzY4V1W^!~^YQEhVsx zVE~bz&@SL?;08F}iY@EL(lq&bOJhfZ;i;Qy8j{TUQh%y!F!_lzG^vJoO3)GI5UH)2+tNBir(tx2M5KPQ!b98T3Xtv)AAFUtX7Ji}rKv zMOBhIUK#!|j@o@@ktZIiRX`A3dYySTcc5DR7PB9us7bn)@9k?r2_I1opL;jf!VeP~ zb99h}1~-HMhv6k;riYnxe-NKklSh-;?)%}UxYPUzE((0)+5CqJr`Bc)CGr0$?5%_1 z{(^78BtY;4CrEI24esvl8l2$n5*SYu4e@d96$Yhlh zbs%ytXBrrCB?75=$x$VF8q2ecurjf%B(;KVpiX|#x~Vv+nYdT3sPsinvGa9Sm2ZSWnd?tuCnx*F8L|0bwhpLk609XgjM?Qc(Hs26 z12*!sY5(GL`my46&^lK#>XN5vT{n-MxbwiHy{2$PnYAMjq4b72Fgxu{%(tx%!8h`K zzz`}pp5D|g0{Yz*2Paqg0Ym=rBLNI11>{7~WJP8%Q5H5T22lv%WO){aTynz4BP1H9 ze8FC&bz8i|m=u(`vioo{GQV>wacV9!F0TvU#fLlM=(J^TlgC{>$;uD01QaM2e;h+8 zRy?pVuF!tqj~hZjbd2AR)gJv!5cIX`e6a75{7ZIkAGyw52-K5rn5yB_<&E-h|By{$V` z>pwpG1aCRE`w1X6cu*&QEG`baI-%37sRr?>qE47cO=i`Y2&!0iSh?Wp4MNIjXM$T2-B=b(pAKvawBwN!mH#zFc-?(*f?s>C0^ zNnb3tq4l2l7UoZLHP*D1c7I~zoIfReSd3HELgqnUrBe(!9Z%SSL}BvwIi-%Ama=a0ao-ZR6X~=zw@2Q)$Ws@jyPa1v#-m4YJIE`*BnM>0sBgkY&fZc^hj zZ}#$Kl-JZF<*@_VTia{I>~c2!AlnK?v*QOWo_d&~3)`Nn?#Hgfya{zG)0&szs3&R? z-_`9h2(b zaWO=2?oZ#RCv%${5$rj#1i~^0>|y3w@}NtdY|B+dme1)}^srhQu+aCEQP@z$?QGlBl1bP7pG zA*TJa>Nmu#Llu9vp(tV^lc~;|Q^2HXx=+nevZ(Tq!Yp86t3b<}PB?&D3SqKzrn*F2eL#I%qZLxrLJs&M9Wo~w+WaP!d9<+ku`yi%nS74-Vw_#Z!=jMVoUoFzJuK{dOOy#H+aD9zMzL(a&YEF^L{ z|1#>0)hNMK1(0cG{s+}uvKmGvCOTH4z@yT? z10{3_xpnF~Hl=lQV&yYGrnQrA+*(#_vAw(wZQ72(I)3`SR^@XDHkH#6{xGn;sHTR3 zs=5e)f8TW3Xs< zC}UTTTE*51Q-DOk%&a@`%cCmo=3+so&iNz#ze}pG+)?+e5RwKz4Lx;blo+xcS!_A$ zim*`1>Y@DHlHVo4B|(faO)54)+G+Qf!B~rSm+Q_r*R!vr8C}>go^Fg1VkT+zn1OPo zUSV-B_bXXrXHqpd->CIxb=|VR1on@b4|3xBrQi5qDswqeW3nEPrSv2k=lRX*2Q%K| zXFJ-${&J_{x1vB4hd5h)?$WafN>oYJVXo6iucQ)uku0Rg?_`_3$@fcVN|sT^2?Mck zUxVyQ!vk`E|CZ)_Z&?ytv5%7pdbq3`92wRkB6;MpD>TLXe9-ibbntif>zwi-M1I?Y zVN6MRB_tx_;mkdlF6aaUtS9K0rC1*>sWx5ZuS!lwBquVE&aN&R+8&GIz(HvcPxYrC@*^l^lm_2=44!v4P zr2Y~TN=86iNWv4eP9!I{d#pcALymK;uCU?F@@0Tec)w4`!o6wu3)QGv4?y;Ur; z99TkP*146Rk-ze@f&8bYCN6);J)~Gg=}b0~93(Ww26qwx6}7rY@V6!8qRn&9bLfDr zJ0J=8%lA%A&F@elPlh$#}Q}dn3ybM{Lo0NAHQQOOu;8Yw|nk<`rcgp z-ujiTTIRu^BLQ@H(@nxMA6dyd8Oho6`&K}?iIvf$DJjgg;wAux{2G&B`a)&`A{k@t zX2pmAfv);;&OB_#ohyG>c-}SMc=Ecp@we)OTQ$t}(W>1B!$8$iqI`a3G|d$uubOQu zw#6y2(j;Q=*z|j`70rfBqD&Y^sEL-YpWgvv)fPO5f;^Rd6==dKNWcte+)!i*${*0+ zP2CZ?vOpxp!USO0ZnpDOK0PZ0gpxur<(OpuF$t^tO1g%Wa5lOfkL~+C>R`H{+PHmZe?E4f=bxmPD z8Js!(<2}vT!u4~|S#axe5Zw45qTzOVL`S2d7=HNcCnC?*MROQ91%i?i1aRwI50H5> zh?lIE{RjTMKQQA%99e>#9(GBIk(PQxXfsTHiA5(-b777b@0T2u97P3U;Z|GD*q9gw zcrGyCFcPC-(LdJI;(!2Cn7gTMLJ_rXwj=BHFoBm;=nsyCB-fYNx7{U!jgsjT7Ybj`A&}8{4!jQ$AM4P;b`P3Vj>;&r+QeAsg+3ew3F=3pn zU{C1$E1KnRa>yc+|6D$s-NF}}RYH@Yp-s>ed*N0abm{f+^_PE7aV#@qq$$pceHk<0^yN)E6g(ZLZ`2IFu=5oK(tjV6e& zKgP%CJSdUDn}&He_xtFIn)uOq3Z!{1O@MVcLW%NagvXmUjXKy;m-Pla4dJHQl==1f zaFM8$scwEsd}dUh!vXEcbI#bJvTV00#Dfx`Zvlnd8Z*{sWS||bAh%?hm3XdYSyWJX zM`~aN*&JBng>7pstQ@yk*EMt(Ce*0f?S#$poDXNGsBk-0AEc&*8iBSjK07l$(&^a?7fKJX$ziDVGDV(< zsH%;g$W$}Ro5CQ7Tr|7ekJ4`KZacg*seIvY#8BjP&ksvJTrufic`j@8M(yXpjIR6G z((skfhiZ4b{&Lrb9^a_~H^(zYpD)z%CwkfZxKK-KS+ANRrq@t>VMKgNk1AOLIZ3s~ zFqe$}W&weepfH8>@5ebcwa`e*A8Fy=f0I3)Y>ls#p+&&Xwsy@aVUA>T@wZ;sZ=EY8 z26B}ep`=^gp3P-*TuzrJk1u@xhq<4=_zGqap1i~{m>Y_aQnSDbkFUZ1*m-|A^z_-YJMBm8 z-ICUu9U+K-8$x(V^>vVW@!|^$Wi-1{8pYVtz5~#D;X$XP_sG(CURh_XY|#AjWe)Q)f+i^JUg)8a!2fj zP0oGydQ(Zu<+`Ql)>Taxk<1}5c5ToCUJrz|Ka)f+fN3rt9@!8Tp$#dOPG!^FEx#2> z5nNyU5KR022kr-uti{W(pxG9kVHC=R=uKL@uBlG$$_8k7v0HPomd&z+`uk8xxLG?a z<*#mLh*Buk>+WhKyNK7^uH|!wf=pYU-mu7+!&xaLrYn#w(^mm@HF6ZB>rncsq0%UF zUFB4n&K5Z~ZG8yAdM~GELR&d;v+Tc%%VGk95fBUGy{BrLp|d{@5^B{{l`37JAd~1{ zX;VBYVcSp;w9uZ$QXf+urG~`pKzK4}p_%SuB8CI-i}Gk-S-m>rP8b@gb{RB3gm-oJ z86(ls7ETj}(-Tx7z5J<+f;0umQrnugXbi=@xB+pL=rYw#3IO%}xe=p|` ztA62egT^kAzHK)`Ku?&e=jv9HT0*8oLxU!+F)^9fb{w8j?#Dyto-t#xokG!HIHxdI zL)y6HSo&$IHD&GjX}CJ2#h#khwiR7X&13(%A;k+~!OwZp@0_6Y2PiRt{&VA6Dc0^>UJvo~TY3uCuU!^8LW@t?+2-0sy;c7&@|pSo_a*ZK6`- zp}xF#ZC~sikqXo-`TJ*?o(=cAlGe|6{U2z$L$(y%b2HI{A$#XgUrq}ims%}6Nm&R? z3Tx$dd{Gsbnk5zFgjs$T6T!{L2Ybp4Jl}W5^!`Mr&@k{MPAUBi3>n;^ znC8g2d89qDP?UF%=Z;wGj`}e$>IMyiC`jFFlb0dqbA4`S4;MyeM*_%b(t|%ph=oud z`0g7G;wK_cDY=n8Wid6rsL0Iyxz($0RUU(tP>0bab* z$t*9scfv!6g*NdjdmeC@;ae4z9bLh*IU-spH#=JyKD|KnY@Uy^i}wJ1(92-Yj~O=m zv{sD$IZi_rAl$+mQob?_N}7#hK@&eKJ3`#%+Ex_fD#t_8S}YFWl-Zp*4Kmo$CO&*_ zE}R%QwXYf+%hu->me8QOZ{iBukgDu2+ghYpq?n9T%ttZV^Vel4C+NvG;FGo$8XOFl z+z$*TgNF}@X=lT*$;vY(A7{pTyyqW0gGIVIvNIj~Im6#1w)dP$XV9K;eK=b~XK`k& z2PE+JQj+GX&Y;J|tHB5jBw#UlCO)LZ95RS<77^u~T?6GSy_g!hoy{(XaL~x#jxBqW zHRd!>2k909h)iZV?1vAEnYz`5C@u+aPIpm|J{DJ2?jDp@?u1ch{i3}iV7F`77^dHg z2#s^;4+D8K)basjYCEVQT3bGov=NTq%Q<4V5?+d&y;T%bSv zJQ1z6S^Rd={%EUSp*u*9i2H@po(Kl!9DSTH`+?NY=T{3;C;eBhNyV#r^0(7_92c&4 z^@&X`5#ICh{phz9bWBB6amMyLlGW!ExBHjdjaVjo}QjKtkx&(Xj^IZV5QZl$j{9U_{@Lj9~~VnDhA|pQUGWM*c~KY2h%Q;R|4Z~ zCJJJB->lbGU!PZt%gVOaIs=_uUHcw0^10Cp0!2Kd>YM8K}@D1mxzPs~gsm3WPzfI;9*g9^Yzk07uP_O#q!C4el@mXi&j`_fKX4J5a!s)`5o z-kZNcFJo%SfrWw$t}En}aQFZsJid5N!7L{x81m`s#(6&>(DmY{>2Q+67~icu@K@!1 z?+A#q?pNaymUeb-^Uay%92zm3muu%B#+5jPLOoYT@Tu)_xAiRj)A0p~BQ{@Wtm2V) zAu5T9rWSj;qNyqQTd~jR=xA+Sox^4n$Hc@$SBYBb7gjT*BvW8MWTm9w@9*!=&6M_r z=@#Cs3JWoQF9TZgh)|*B#M06TPz0CC>%lUs??s;{0j8j&49UpAFDWT$yjieHWwS&p z)u^QSf^_pD5QUP{MSHirqpe?FzCN$Up;Gs}Tc+uYjTenaJ>1PA3_`k$Olh`Vthd4E z^Gxu0ycwUFdFy8yRB>3QT^Ak~hlY!Xw|{gbTaQQmW?po*(9`3T>1EFzpO2QB;(_O} z=(Ry5eOU?^dc@A>8@(7d?j!qBevmGMSVB7x&{0SVq-ePh;`p|w?n#_q6$-fDGn6w@1wk}fk zJa3-rbOSU1(YtX<<8<7D1FAVkGI^4LTEu`(qFDn!J_#^^=`JLbDm?Bt4MP@4Hy$i0 zi2@oyi8barRVBlKgPv<~W4zoMmCZ`I~}XMg;$9hkHj|AOs?>|71i?z+R^5 zbh*6r;EidZbB&)q>zllPed}~g@3&$2@59s4LvjJ#i#T$gtruvt(q?@`Iz zC&ymoQ+6RLS=G6%?|6McfBot1T#LeaYMg||pFgolNmwPNrPQ>vqyhqj z-As2k4IQKL3jBllQt_P5dx|tIPI&0jX~F*;+ZOL5gYA}W^wfIF`TD4+C{Z8TG_+yXu3gCdTg=k}*c_HkwP?oIQD_1=tB* zg3psh3g&BnfBr5BFSG=9T(#e;ue6Me$IZMsV9R7VZNQ_H)Ed2SoB0WGBfE zpIKjh*xj-H^q#+Ug?FgWCxeh9qkkFvnnWAop_JeaY1*ftXuW0XD7NXX*7n#IAlO-s zHQ3s5ijcIFZefl{(JafMK?vW-aaJYgvO#8Z)rJPQLQZB#cIfbAd`&z_#ORF{`pse{ zRr?`%e6(FOq~%M@&_|PI^Abk-&$%>DW2A@1v84rmM9u|_4{)?W%0DbDezmqPJ$J^@YF=OY$kGlK zrNquxPHRdvMv zT2HjKO}`mU%X#Wx9-Ql893PPTOVf<7t<+f=p;lv2se)Q>~{X+;DV0b2y!s#S{ z%146TbN4R-zP#-0>{7QKK;vVeDENSZW|gQ*mhQj~BEA6BaUc-mMu(s$XztQ$s zxoy?4{5P6If49lNCuoe%J;rjiHH0hZAeAhq@dEV?@yMeCHQAZLadL}!R0uFIFuFiX z=GOB*Jl=}|(xb%&FklJ*zvK?|ly={WmG})nlr*afhjeWU7X><%unn-t#PQa@kwn|ao?}Cp;K+ztrw=kv>~8f5LSCjQ??Ut)`y>DFN>U@;4Q_Y!1x}}(fJ;b2Nf86H{84~f%0?hH8x+?r`=4u0 zj+GNF-Z*zp0ov*U4Gm8clhCq6@(=dlAN`TI(>`575O19x(e1AZ?Tm~n(yK63kMX%5tJ_K7Jx4Tz3Wo4N^Eeui`#fJv#gQ?5887p` zTD~r+ToTGsgn*cH7DpMeo+Rt+RA|n|^$w38o4y~+cPdl&mWWdSssipzM$AWV5 zgE(dLqSFrWoAE?&!p+tg4AT^R#=_sJ-N&_8c9to+DMC@??2hx~u0=&XN?v0-B@Amz z6)s}m7WI|=#$h4`#!^-o)iId4@a)}b`}9E1PmyyP!8JI$6Amguj)cO8?)sUj+{?93 z`jviQQn_Pjq^OKI;>a}a`15W=Qsf{0fp{}j)7;7PfuGL$yd*fswT3c=$4;kd@XAjW zTh7UGWy~E`j=tkBH%2cPU{|#^<11_p>b>3>yj)Z#dt`HF=d2i-tk(P{aQAO}Ot-k! z*-8eRdS06hIZdX~D$5D|w~n=%RN9!k++MEDg~v+X2@1cr+R`{UC)DJ{qJ?)m`S8_g zQ~5Lt>iKW5nT2r+@=9@dexWe>rmd`Y-q5EjCh3jzOxP!9nx>{m{Fql^0ncM+O8ms_ zn!x-te}m519Fd0Yx=#4Vzjs$PuF}PRip49N)>JEn`SKKagTATVzQ;(5`MZXUkip!>UZ*8cryhqvXUZ+)6$3PBQ-j+OmJto|unC>$UpbL4SQ;qm%zbpOWI2ShglpiZFQi zbV+l#ulu7ZYci{wEGoe^S)7azmsq`zl?N2{Ikctijd7xv;skmye=RdHmzOLG=rad= z>qX9!vK%HD~Mr@o}FSJ!p0^w(R7w`j0>B36Qf8lr9T*QUFqMuDH|BnJ*M`tBEpTc! zMBTPLP$;mwaZWO7j##W14hL&+%~^gRkfs@08^CLIBMA)>+RgEFZJiu%NoTox&r^TA z^Dj(YJNjs|uH0*n3U};IsK}RLlDc=0e*_0x>_0D3>Tblaf1)tqvqkm;^SVyE&B#7Nd~YcT)C4{jr5`N+@ug^7mV@-Y}Fxf@q;TkViQsfW2-<2;ERhf9WaX^bt34e3s8s~GB%O+EP zdkJa=gNgoVMW1ExI3r{Pcn}lzETV+v@5y%bS*YueGkF7O5+pTJlGkPU`-_@SCH9}4 zrZph>1=-(~Z>^~E9e0#z%oc9>!)W`t_479Jth+pPImd5E#iVZg@f7&s`$PVV>)GLh z?23w+gp}gE)iiYbG?)C6CVcgLS7Zom#~hXug&*3`HH3+Vy$}Op1}%SUAP6Tp4mc)Y zOeku{#hA9h1rYTh)h@Q|P3WY=Aom;|48y4|wXC4EEAL06LlfJC{nnVTC(FUO2o8wL zsfyd_P)mLyERNqVz^e#L!CIOe^+9Ch^jL>bIz(%Tm~ zWI68Ck|@wZC`O7Z7*e^m?8DpUkX5Er{`zl>&BVPqNBt+Q&(@ z^T%iC5AW%Qg_SVaB3_#Bw~tL*#PLi8$V;!kfG~!1er~sp;w79FY*s7FT*8hNsi1j|>k- zcn5^uzl)1=+S{{$PL_(gx*5R+Bf~M50;A?S5^;IW%iv4bl#j&ScLSr@McG}%@zNX_ z`;D4!9#&pm^nZ(=Be3Yh=}xd9$ZBe8s%mO~95%((EA>aCI95XYH}`i9XhH@J9+5jl zgw!yT9|OL!53a{Z^4d}lI5*iO$DsZseNqjVx^M?BrhfOG6y_$Hv z#n-MO8J+vWfY#e=4Mm@8 zkvql*Vg=jf!D#I4t&n7}AQ*ySiwi=kDTVwft`adaLsZsd3!FGi`X4yeAK9h?_Kbxi3DDh$o9}`QX)al8$yute~_H=o;q(?YK!# zSLUtW-6C|V@omwpGQ#K0YfB&u#^*2fR)X)v5<6&wIP*xOO?CLhkJ~k=e$6qA-w=gq z%1g|<%z+EViku=Bp~ZMXNp)Y+vo--nTD+PYA1 z9Iq8}|GBn)-0Iru?~yE*r>Wwl?-*W5@9qxkwIH49v_8Kj)-VgpYJUG^4r4{)Y~b+7 zmfi?b{bx%eI}d~T*qC+TUhXRoI5@>BYvFLf8D6Y67sabRMrT6_J+wc|_XwLnuTA?! z9A+I!fqvZTt@Z_I!3)rK(1Ah#rQ+Ms@i;L)E+ioV8&4q@-l8Bk`2{GJ2WS`Ic#$V4 zi-ZV&nRxgyZM|hoO~w z7iA`BX+p6&7n%b;=-oAh=ky6}%|(~D-s({dtjo4o_oGE!w<7ODogc4q5((ThcyZPE z>Qv*;v!0uQdYL9O{|W?P88-XDMTLdIZ^8HLc@n)&3Q!9g`8%@D#(GYpr=a7723vt% zTm#d>C!PLOTXWKyQG3kzjw|_Md!KMq=Jo|>x|Gq?wffBAb;22PaN(4qJ~33-F*R9l zLeT3|>tEzevv~pjlXpVZ=^=K9;s0%A;ejAY4a)=aKd~|P7?FXJ|2J2GOWe%fUDjgR z?$S(PRmkAE%*E{~2piZ$156UEd4KDOf3u`=5dFSdgf*{T125@<8ngH!Di{!hgI4|8 z_T$PyUMhR6A82?qS7(Kd$6;#%5Oo!n7L$c?we|JN08M_`sLmZ7Rv>5X@c^@u?n0f{ z2CI3i&~UyQ;uQ|pyy6||_fRRnLvQeRtLEe19NerWXSlIFOQdTWsw@xh-H_e$DH{z3 zmvhF((;+RSbtu=i#=s}=>fecVDc`W%%f{0rnw_UJ0s_4|6oa&s?$}+wp=AYvycUKW zi}$PTPH3#J_uB31_q4VKyfNK}8jhENu&FoQUMVWSbAJ!&hj7s1wyP?rt8L`xnux)R zZyDAYgaBM~J7G&>E$0Viy*H&EG!h@9Cs=YEQIJ&v!Vr7A!RWA}L2ysgJV5Fgo!OT=q@ zEkz$xQRqJ$Xoc!I)`>vdT~qq1Y%l%;e7vwZF^zRv-~XqrjaL3p1OW{mUf4`pvd*R3 zvcBW`gyCM`Y5j9eMeD^-z8D;!Tr4bTzi|NnJ0);OS*#7DdIXORDq&!ViTy#6Wpk!q zIyc6pC@de*Qc_i=uiqG{?%LEHFPhIb#vzV8dA@EZ^u+=4bH1bUH%O_`A)&LinGX>R zvoVowij2>eaLK#NU2#7|uv^X8PpfGxBeIDxQ2Jy2!rXhu{gZ*{3p~jJ!B`1n^QAxyBS5go0=+`d3Q1NCBFTl-1Dr#M|RJp z;TkT$lXGc`)(-&cT$_L?f^S~Wrvm769brfo#-p?TjYIB~Tb3-R@Qf6d5(3Fj=UmvB zHj_mLB6A~$@J>0w=HrD_{|$Ia0J+T*6KBrhsOFB1Z_%T}bMxlMw*~O1^>M+6w0GA1OHbY94vcOLCLsXg+xI1L>OKK_Xuct=4$m%v~sQnnC&N zrMK6c1cTU&`U7*p5{Q^&@IIpC2}jUs=HU)QeUACWy|Iy!)r2kn8<->(R}7a46`Vo? z{P6R@%l#T|CV8Nxgr)vi$5s2KGpkr%#V5M8L_rmh{5NU^h)qX9q87GCpSg6h#Zesv zzLyO9v2&Z(e84$Yxtavzz6(`MMgSW=`=&3y9kE6D5=bt{0wL~%Ggh&ID#KXFRsfu2 zvKSO6X&8nUQ&Y<`KgA0%0=ZKb0>Gd68Lc|mj3-`^?LCZ`Frf{+7Cf%C`S*a!KdS07 zb)lJ6|MbIc=8QZ`#NdYrca#Jb>F=-V5aog0l1iInVOcL`ZCM{OH=h`f0JK^cDbs670u&O!b70jZh{(wyUteDX zw}u65Y#8;=99y?};77cAa^W2k!c`8V`~2R-w9R%W05d+|dHJE5V`KE8bWO{Un^oSPMXsPPqaTA4hpbTG z$z=q?)U{mVQR{6~lYKZRRZ1?TOrIp)rjnd^R7_Y18@0Fh^tQ%nS6*6LTC>&ywFI{X zB%~@Hfz7z{_a_v9s#(k-8SUWD`%qtaj0JC(>mfq!n1tKt=72{Nbe19%+lO2I;>m1) z*Ag8`C6f|!#hDi~Nsc)P-6@2V zM1e@cbEzm^ZK-xs5I(xc(*9onx!QWZ8f2t|5p;jKTjTreX*QPSqb!DSV}l_E|4I@& zHEreg0|$G>mkX?W`|c1A+hH3eQDp21Z_HC*@N{glNnbl(MP4|p@GOjyWLS(WiS%4k z$|Qd10!ca}&;VfS;$muO7`Ea9&?tz9t1Yap0U4L1SQAi20o^9%F)+k$_#R4~3l{;A z)kM)duETo#Nas#>AB{lM&0oR0(`b~@z~szDz*PLa+mS2-1d7XK%_l>RO%#Rx=yU2C zk?c(d19%S^$%5O1V%KxdqGM_5%nUU0>@|UzrO_#G9VLH1Y+3;iC_MR_l^KpQTd)bO@C)I(HRCJ&Am#lWIeD+nX-Q5JfB{UEKKvi3iU z#2dJL8Uwt0*IVnhQ0aY~)%`H7q9;VFZhpuy_EM*s)%rzIGOMbFfHZ5hb`N11*FLc7 znu@I#$D$-Px?9Gv-b)fv_J09Fzyqy%tl7>$ja@qdr7hDLf$9H?oZ{wdEz!%%%YmD} zZcj(xf8Y=rw1J_@6*a%T)01MNcc1;f;_k!4@0I*Z{qF$0@t3{PgPjp+G5%s{sw_!K zA}kJSa_-duo7}1P==)HAAZ>>nn$JljEgE{OHM&FO|BPKKoj?yz^mats9@M<&J(EjS z?&W#sX%Hy8Y5Pek#viVfISFFOmGJ5@Blqntdt&#Ei zoexj)K+~)HwA*=E+RzJ(kYqOK==K-}E|?UPoPN9>Xt?(OmKJ{Czu#;2`k=(NAt!?E z=eMjN=*COD|7||3t!uo=T4BlAxq8}xl9Y7!*@Uu}A|Cvv*NBeIR5l%3=#Nr9hZ zz^n_MkkBq~c#t4c!V*r2#DQ8sL-+=iG100S11z~f=;h%x2B4$FnDv-g90|#pL20T) zRSX67qzKWC=Ot-J!w7F^;+86W_i{)gUhz3F>bK&_Z>oHv~k8V9h>=4UAuKkN#6Z?D5uByvoUD<8z6*rW+-}Pm`#pdo!$ADJ@W4X%^2~FB z9{+Drd?ux7w8XBNcWmX~er)gvHKCfaqV{A=s-QS9+5x9ILiK-SBr7uN?qdA`N{sZW zG^do%zLbb9t3D?-mF!|IA3)6&v;Alcg$n^8g?PW=&MARx4H8uH7P5@Ls{Fh_IvG?E zTLw1!U>zLQrRdgCp;JpVC6NrjAb@FwM9EO%&~`m0dAO|CEX&@rGs>Lhje#$NJ)3YJAB{o{qy*I zkinUI&$;*Rv-jF-twZQX1xb|G1g{|w2#U0n*e3|&*#vl9{OTq67Y8ZX8~k|gAR?{u z3VeCKG715|BYu(6aDYJ2G@icU)I!t2Q4oAbadk&!TN6hYeS2ewi;D}Bxs9cRq5c0w;%0AdYUT(L6@B}`(b3-Az{%0v)`n5p3>^Bw%G}cUt(l|a z7hYy&LwjR=M{{RmLtATWTN{U`GcjA48yed<7&|Z`aBifQEc8WpCv;z~c>i7T;(%!f&2 z^86a#5h)}NMmPRN)2AY?v`H6cu>Vo)%_ry^DAY7J|E8$Q5JMznw@e8-Y4dL)kDHHA ziw{Rh+`!Oqw$ePdplTf*Mr1|6ZuXN@z`fGH3LXP$I++i3v$M0~oQe{CMP}3SvUP9} z1s50Bvin_r$emVra?jM%)b_!F%|46RoAR~YggAxLPGo>I3g1aI4xCSVPUS9i!McP!gIx#6ch$L4|ptt z$;1L@$_x>-YHX^U@nD$9cr3o@0v?)t$YcRD37>-DOmqu`C!~5?Wim(S^j|6cs+{A* zLvAl54$2kQ+;_JOej9+!l{L{gyQ=wuBe5tJixU+U`*)6(_9Y^!gv0fEr)*5jHqz@t z4Bf2q3TKFj%4^2#Wz{O>0@bCNS#!9MFd1@YMN_4NO_S(9KfkAFSw$Yvg-*@Ey&~(7 z&pUQ=2p`QvOk&OIIB(JQPD1LAP9d%Fxzg8+Chq^b)WrDj{I=z>{m)=zkk<`Mi!${m zRHEFo#6Wb8`OIi%laZf%GK}F-3Z|O_%eHmVvlX{1TU#Q-=_uRFJ{a@Wof)Y-KMZ$~BMxh~b{mJq0Q0#fqYXf1@9VqxFC?cu``If{}AaXz*fDSvExC$Wn$<38; zf4Ui`x%qcrUbs67@;CeU!o>Z)wvPEk4fD{_62-yNU}r3~Ew3t>*kFydR;pV^t&^oK z^2<24(~E@Mt=(O@<>tuJni{fq@6r9o<7c7No$vblfNCS#8fF;{9RK zTs%qVxUU%<&)C${KVD|4_-<>+ShLc4X#q=8QtKT#^JtAN`Q5#aM$G{-E|bbY$}_Tn zTAhiofE)LPf78?y49L;h@}nCYafv5(t}ggI+D{b=zze5v3f^6BVY9L!Nz3+c?Un?ew!+h2 z?br0MUcUeG8H>a{R{#N(;&i{}@@PUiCZpuqoS&R|Nc8t=Kx_d=~)v7Q5vlo^ReOT2Ge;GM^gh4u`rn( z(f5Zxf(8bGOagWK&-0nGjpoZz<`xRKWkJ<|pl8`U^O-mdD}Te@U~g@zO5KTs%xx9b z+?3hsv0g5mvbi_KL<`oZC<@|RDdaA@7m$K^vKa*A-L<1393OYPR5)8xSl~yqA-+EO zX}7K@t;oEx8a#h`-0iPXxy{1E)9HCWDY)cr*-&@jFnqoO&a6Q(0cj87FuuFe8=Ou{ zwW8mAfi4mS8A1kV~A|KvDXo}S0{Cm7Nc%WFXq$>_eT7ObqUn!PvWrRriAn(OZmMZ!H{ zO32ZJrt32)O4H8g=$Q`d*7+D1aPp?b)H@NwjVn-8n4BB+e$NaD?jDB);)(`6kE`t- zN<-Xy5ibI=okEdRF1?7pDvmQ#d?r_2ULIapI8U=9ZMXN`s7wqZnFWFW2TEGn6jb6n zjhZ3$&P*>4AIREz1q%W6`*-{8kw44)FMfM@2svC&mY2V_v!nImy7rlaR9fu>78M2k z{%r+Gch9F+6lzL(Lob&(Tw!`idrs2X8I;SLWdy9FY)9jiwv+%f;#MdKm2e)bK%`!!|8K5=?!n(;x^Ynti?uLx5fySA z#43dx!^L_h_8R(o6(%LNH~Dl4m73DI;zf3w1Nd$2Xt2o}Ek0}|Kja|ngZhGSiV2Yr zf}9B*!7d!!e!+<WUo#kjw*09OqYUfv=P$^s75n0^wIvpV)(jIU8 z-Pf`35-%{mYILjRF#Bw$V`)2l+&lLx5K8aDK&NiUWJsP*n|z;9D<^FoJ&EBE4-`-9jh!!Z+(}G1FkI`X zX3*liP!(mI6h*7*Ue>Gb#}*06|7dCAJaBx80Bzd2sK4{v)HYp8_sEpso+|Pfzr+=p zAUfZjUiC+NX}|2%uMQR-L{M;un{QroqCjifPa<-`wmw74ni&LzdoBm!`FUj;d*}h1 zDa?#rtnpGe^dvNeb9Ke$CbQaV0IwViYtUF!@HV2AN$1FB_Pfn6zvz4@mTVDqK(1>T z%H5s*U_oNpYidS#fF?` zNBcDh*BA5t5dKp+uC7Q+QBapcLuVPZT@#sG77$v$k$q^qvCzA_(>^+}XRUcWXz=$u zjm*1G=J?h4aKnj8A_upUms4+GSztVrng*$@n>_^u5Raex6&jjk6p6s_)p5)BIH*xn zg$|$4l6Qj;99%Jjp7-|zy$7VGrB|&!j~>)mRF%JUn|LWGH%eWPF$C`&qdRwx`k4*Y z%m31N-Eyv_dn7A={At=2pvU99C-S0cOyrdk-$Zgi{Zg8XX2eH5ez)(iJ*%fYBe3k< zzg*HN(pId4e6!+@Y0bs|z>@ngk_RYx>V!t+}$|-hK%KQ~LW%Hl6zCtloDefB#~SxA+*c6LhY*0UV*2 z?zZXT$P1t0%^OfyD6-^ciU4tT)&w}uzo&9lMLO$TP@Io5;yf#@5)*cpQ2Y`Wk@<9eWK1;=55@);>T+XQoc6)Br0y1$f*A$@z1M5=e+gbthA?QFqOg*~a9$7)i7m@D%%P?k`!?SE?v6+#UX^Utb64M! zG(tcn1yDSG+q69>_jNe9=@tb9E&bh*+ek=dEf!+^&95bD0?=y|lzw!zK5t!1vlkW? zj_Zm^OdLcY-TPZHe8J*uRlr(h_oY<-U_syWdPDHpGr`~D;mlX}mw4D4UDl8K?D;s# z-2W!ZQlqM^wTR@CJ^TF8k|mEM#N_dmoUT{MgOMevjR{I9GR$j-J3bwhB*UBARMza_jpxY5Uetm8<7LNeg$G75?qk zP*%TT^n3mGmzd7`u*JW+F29;Q7u;_VNGTr2C^0Yh$n2)$qMe5eb^3qu zIF#CbdCSES2YC;O5K;=e*h~^w0c!sGc`|`!CVFy%~(*DB|P2r8Fs3 zRkCoLNR#Q}=h+JT!UhJ;q23Qy>kK3$QJ{Fl`y(iagoIG@^ON`<9dW07*As%pd~;?l zrWCUT+s}uheL4F4+H}}tG#{_f}8qG21oK%%64B^SzHb^tkxFP9D9o zx8Ba2DLHO2fM@?nPD^QaW%v-4D6=Mgd@MCHtJe+h&4slX$YfITgT^C2JFVt%OqH0K6(#R)NZHIr zh(VL%7a6%DD&+qmOReNZ1nF|nRFPLA$1Yk}ILbuPuGy%dke;OfOHww_L?v^avezKE z?iTH*^2ADj{xFfxh4iI=n5xId<&c`*zTwfz+aP4~zGg3J$A9b@dwcX+n@y(*+`H3~ z@13papFPvY=dhqn;Y?Zz$)!8nsrYuhK0lHjiN@S=hg(nVs+k$>%rqWW3O8c zGRJpp;WQoxkhz$!ad1u!8V*lbtKN>|n1r@|LO?JXN`8?jaj9CUZdd*D=L+hs1XX}r z$)>KvPD+TI=S+ss;*>>bz#D+rq9V60VG_k(Jeu1s0`T00HEuAfCokIs( zglbqEL4UqIbJh5d?cfRzn46l4Uu_T8qQ_ARwX(J@C}buiO!1aa;oP4s)$i3o6x*+| zS>*L4w88XpTV2(bLqZdULKjt*nv*#!gZep84KX=1ltIok-3QPWw!naCQKTxHqmWhz zC>L=8PAeKA*_xz&#B(Rwu(4QrB((X3y|#8=UthZAXw9cKEMBt(tqQ&E23x#L33~(O zGZu>^baHiSp%VbxfLtjY@`=vQ&b!jjaCpd5VUjAClDN23ca~@e`Q;Xabf1{A)w67s z+}O?V_}m%N)6=Jma%g0*iW&I#+$)gK*4Njqw}#T_Qz(}uSXo((K18F#Bub@nBPGZ~ zX=x)~R;s?1QfYMjZ0p=BN|`Uy*NM%(oSnyZD}wU%OSFk)M73 zleRYh_1*O;*R1x$=i5SJUv!ZLsk{cy%4Su++!##1rYTey+(_Hphmf$}vyS`th6%VN zL+}S}j%)gLxFovr&`G?vo2mx@WQ(Z869@#)RcNr)^B+II+ns0&YVsJr@k3xJe&Kj9 z;B%oVP=pPeQpV20{eqqAzthpKC6gTpV&Gq~1oebOQ#x6OSCDNAC(iVt`#K7MG&Xic zfN(kOj)EGyiY!E>!*M<%&CTa6EcEz<1jgggh*ZdB8%o~*Rhk{2rPXtAsyEbqu^yvJ z-~T!}(jPu)YpCpDRI*1{Amg>x z2|advG@6rp3o;syxA&brfcMph+|~rv)Cxv64FHCp8t#)vv$&7G)4sb8T`uznKv|{| zac?XTlsNnEvGj+blfq#zPlSMHb8T%RQzd%CJL5S;#PPWdbXK$Ffs9(!EG7eqKE+FW zOeCOH6N`kdbDf4Pm%)QeZ{j2pYD3qZ?>ZM}g zwpOe&aX9KEclzdyciczp7eYcp5PJuQQ8V_={Ctw)6~TIV zE#G2JPR>fp=_vj7pySCJJ*W}afBo{LOk{>A3VM?r`2#WE*vXPdKL;=P)s4-%E4q8C zx7Tyd}HP189}_0Uj2v9A2~zscv$ z`>$K4rgcU2R5}JGR1WTsCA*4r`XATU?NC_KV$;wu{1j6-#jIz9Rkex2RAt+S(sCsX z{Gh(ybJ^Ii>+{48-SzB*Ykn0x zI4Q`ibX8Qp6!;v1D%nhBbfY6E_FvwT6-bcV&DUVnczJ}fiYmppDO&o1RK93m_}|Ti zUC?m+VrqO!bzw!ski@SvmCop}cX<|*Ug*DQ!iZNK+rwa-eQMAu%{u}tz#h?Z*rqE_ zDuu{w!OE5#-5531&8rT?DMvF)`VL5*ZK@gv!{!qG%w-k8bgDt&@bK_38B8{Q;u<~y z7#l~|>mN(nK@-kxN!id({X;d7Nn&Zp zYQx+d*^@?4w|~0Xb$`1)pN#^M_PC7a#*+YW?zfE&LbezqS8+LPBG;R^0RrChYIQLVqZxz~ef}}|gfkP< z46o+FZ{w|hVe^QEasJ2s6! zIT?$5r*-FLri=aLk|&DA+}!K)8XdMEr&3j5)y-vgQBN4Jt{f;Nbdz=$h$FEAS?T<^ z8$^0sUXf3C6#Mq5KN7XVh{*!?36rkTv?OVa&#?ieBx3;Nqg;Uosho^VIWrAS>uA|Y zHEd{zY3*!BHYe{S!Wqua`)ltayc`gFfFLoio?7n#MLN(NQbKv0l3%5j4G!mkY zTqQ=jy@w}ix1@#SgPh#U6fVi}#yVVGT{Q(QG-St(j?nJf!)DdJxj4|8a7GJE&90F= z(Z30L2ZLJ~Xq1$c2u({;^VQA1v}6wtw=utSaK9xd_qPRRCbH)h)$LadJDdJ_rtD^K zkBWpFWpMJBK69VV#L=MlyN5Zr)PVsJ??*380T0gH(k;MgacC6vyylb7PzcUb9*nMX zc22Fm^NQX|Z_k~sa2=fCW&m3=!uo!8El#uw|ni46L@jleyt zK+aEH8+Pj%F)qSxS(ORV_2XKyxvobxB=Wnx=}*wp zSqdig<~C>^F4hT^OQ}ZnUHMGvereMaMa(M0*dYXf_q2J{T>i4GihA6i&r*4B5YNjp zyw?tAD+Z&fZRU&~1VIn}nvD(rXozpqQk;k9Ngmm}#WgYcj$?eYt(=fC9Ee4IWHTv) zXqLV4@HVb!tJx%x+5rNF4+xUt*Zf;w(P{$*PI%C1iJ2h5W zWz|c&-?l}Z6)*u$^vBJ)se1F>?@q_)DB}Cs+EM$kpg$k&>HE%iht(;@A%MpCY-`(| z<}#J3oCARX&d+RN29R1P;Em*dKIg{zMkdg$hK0+Y_O!RJ4_xwl-#z>DNAS(*-@sf- zZ1J7RCXY+rDPAdgm8QZ%hPL+h3JY-&ogZoPCRT;lWglENqQ4bok^^M~XQM&rArWYx z3D*zxjr_G1q+4qX3#`oU*s$tPR@fq+IHaIDO#oe`FktG`y$u(HZ_d#K9HMCt5&3Comaew0*DD7*H^R1(jO zX-^Kgs@WV&(b{OG*C)=)%L@n&o{pj=opzvQ#f<*>_F_22Wzl^W5s~}$CSG%s052rG zMW~LJmPV7&n~aR;=AfbPmD(#iAg9;Rg<-xd95G`*NaJ<-baQz)JXNGsz#m^*D+h>d zE}?@l%5Ur4%<2=;asypMUdPhs|IZ7cAiG$Pnnl$jEzL7CV|H}(g+id|ul5n(7+rU= zT3oL;T0$Z`zhaOl1G>i>0yNS0MpEb?S7k1gNlNIpE$Q~hkZ;Y_vHkjS!oIg(MI_*! z9uo3>162Ov5eDsQ9&_&Ld8P{(QK|`zI?x3_-m*`^9k(rl{?NN|= zEBNl&`bLb++wpPyV!P%~zo|@VoL!LK~#1_&S9lbsy@BtX;xmTn9*|A1ROnX}Xi1+w||Nv!A14!YpgTbNiK`r0NS*Z7gSmfVyl zSTq^=FJ>IWEdgz!AmA8smWUT_*?W5tgKwI=>#{RJ+q^sK->~HBkGMOX**{FJKh30Y zcM>k10;KfKnqboG#UHfXZtmrd6Ev^cQa6CE%X38Ay= z8y{Eh-slXCTb(IG!hW+;qVX_m>hZ;?%J6t?^l8zm=`Dt38use_%9LOnZWb{Lz`8Y4DhcjtBlfcllUP>SI4bWZ0gnj96FDTgzyW9b-Hnp|A0O7!w`zeq(vjkUStV3KmzRQnZ( z5DKC5;%%-3Ip`@Q{@S+0X*Taia?MFRiY*8yK=BaqLF# z#93?qyGhqx!Pf zWDj--E8gvzuxuJH;i{=aQN||}O=e@&5n_T&LZq^Gj+Ps%G66B>a?k z%%FW3JhT00yw4I)Yh7i%+kbUzJyS_L=gIiCHSYRUa-?WJlFJaVZ)h%;E>AUYJcqQ~ zk#lYRjrb>nJ}I7pv~xMg_U7q;6Wt@^Et-%~hhyrxQ}C3We3K?ChBTH*%34X{VO$Ir-bx$wrb)pT{ok`X9qfP12k0 zOia$tU)Fz5PL@?wy}sN9ylfUwPq-GFdCR48_xJW*rE!mHmW62kJMeSS;(M;t{~Q4U zi-^c`Jq+BhzP+PWl_$A*xuxv7ataPUxzt>_^13y5SctUkiAPiz`sMA#1xh~=7FA)T zdZniTP#zK`Np{R^TAVBy*1I1yH!mjR2KN4IH_&}|Dks570Q$fi2|yt%P93Ya-=J-5 z5?YDk6KwC__2TCza@)z$HEw>)hvpm~*NrVLF8ZnI?&$m){zG5|xj0x1PfJS!P9rD< zBV&=wEua10S3Epfwi}cd)ffBo>wDT9^B;_jjAjmIlpaLo#RlVIV#s_F19A>w_(m&m#pT~Nuy0XLL6*?pP)NN93Q+iAMWx#r942ECO(*qC`|E=C||tDnCLeTl~hjq<}!I zqd|y(Z#sptTe5&cc-6j$?ppY5aV+eYETNs=941=+zz@87OfV+ zFf!3(U~w7%MxD)FpcfWuU`e}Pi9RvhU^$rXPR)EeJRX&7P_K7Hp05$=8CP_Hf6K!Y z44`?1*RB84=X!dmi)Wj&^NuB>pO`F>kT8b}tCvk4%x~!nO2uXq-}eLQIs-i0M4nR@ zAPFccc4M9k-hIIZ3E|tt{=JlRoqhTI{Uvh_@Jwh{oovpU`bd^=t?lb@gwNB*0{t1x z6}_zu(DKs^e6B2kfO;Q@#=@$QElNn!=>Qf7%3@O9AAP?>)g+o@zgs*geE$CNznQ2c z^HVJ5%b&CDZ|ffla82O7NGuI4gl2<)|#2xCAkZN9EC@Vx!~`*)?M;Ch&6QBvy?I-F41-}c_`%qx``5%Sz-@)eI-rjNQ}+&e zq(@C}L@|ME4;&A&Q>Y(QFqxT|!@Hm6WE1M|4{z8Nv3hm94#}Vk8zXU5g-(9IWdy9U z_1|#jX5q{-NhNH{;CFPO65~aRQ)Zt&jgTwV?tAHb9|nt1hMp%@!2?^EB`bj`T}hptfKUrkrH?4-3wxJ=_x})Gh&Q z)#+ArZtfRL?4%Piy0ouf2XP45`TpK(S;Lq|^lG%BlV8M@=HO0!Gr8@1m0+b%M!kCWMmN6@`CQ>Z3M|8X46tnhEIAyhnXb~@GfLEG%PRv z-P(HcT_7$jmIyI}WhnPnMd=4^>nCv~96JXj94`TW{^aw$+3^D^(Kj3)U0q#QuTQt= zcgImY{QrzNPvk0{C_Hl7U+ifpq;kh7;a{p^8&|3p6k)hQwY90l#a}99G>aWBq2ROr zrnPOZOWPUev%5K?thR~dnBJeQfCDJy=(xMV?dT7BGS?+cUz95d%{Hi{1PMawT^k#Y zTXL6XJ3AJhr_A>)Rv8$dZn=FP`gXnos}%paiW&j?7jgi8qJ@^kRaG${E(=NtK>8^4 zyq11apKNU2pKk6`b8ysH=q74?B!5^HADsFvjRpK7g>ukI@i5pP#QXULZ5V5FBNC2| zw)PnysJ?$(mH^(6-$FhQo>_}}O4uCS+_hr|%=sCBJ^|OLw0a4}?j&(-|IEVua4~Ni zLBR2vlr-b@VGb*>HT;?;g!|%9@nl0At=NiNR5TqvX#e9+3ju;~Fc1nsg$F*akjTO3 z!Z~coyL>#etUeE~ri%F57hMqS9`B3HC;!Ppw6*sDzQSPA?g8+KTrOoQ^!C6~TB?U1 z*a(4TB8j7b+W+O^pPO?fz`X>FjC|Ityn^NHMx{`JBn6Yn%_ji;q2daM91@P+N9Z{l zeK2JJ`Wt=Dk!K&j$Hr<@nqfo|CZrl_>p1RUhNu?k0}yexKOgdVZ;J&9$01%F1awzvv#}L8Qhys82C;pDJ|zo z0B{xXPMY@paDL)da!0AR&n0jedE2sNhu_;9A*mMgzevP9Nn-Oc1)U0bL(cw$?dpbC zE5cq)^83f|*QV?QC_WF@rgpBbwL^1dA#@v_nXmKn|M?}n5uZh7P{KB5LC?2j!hAtC0QzhsmP)BJ>8e|{j}9YtKwxGS5$RA#h;8G&c3tuaC4=k3SOvgs$&&;p}b zYNaUd%R4za>FF)8SV1CQ3ieOS#uX|=Vl z18XbuY18S6BN6v!f>8yTJ~Fn7Z$QkOspp6X4e!OiENgT~P7dyuO*sP44{iqV3h8w} z-1kC&z43dxt}u|-Q-$=Jwk%~u80k_Kay%q*#@%qSvDJZJ=)CXj`mP0sfrS3>Yv}&|7f;wow*C}xbff}u&HPHC`lXqA)ETuW?MiLhL)Wc5d(C)Ig$2Wl2j{4|*-W$uj0&A~G`*LV_8hAMH_kih+ zonYME9sz-{yds?8pQ$OXzHJGI5EIRaA_ zhAAcNuQo6}J~cJ$$RJo@p?#IZ*_l{EMs#y!fTGfo<@C_qQQPr4-g(yHSA(s!udvDZ z79TV;#}_ZMF7;4mdHFJ{Dl%Cz_jX&NwA`?8#S6YD3#q_v=$;$c-g5#6k6&>j<~Ery z-wLD@;|k9ViT}lOcy_B9bX(g)t;3nuoYrAoW-3Vn4QN0dzPs7Y!*l|^)I8mxs2^Qzy;0uXLJ{so-D! zxb=qUWO#l@@V-CKo?99U;vnvdm)7FGzcQ~5v|jJjW!B{TJs%IFX$B5E5a+aCFw{}l zp9wy@Q-L-qLno(!K3S0euSQrhQbPIf=4RK(FVP~r>!SAr(B{Vn^d~b4@Qo;|tJ{D1 zyxv9gMEGP%RQ*x!PKIrKIJeaB~6Yd3WZH-P6%A@mJsQd{(J^&Zu_Xx(bnvB zorT=Hmj^B229Dr2bB{uv^VP-^^88%GCWB@RC8TMl11x$Cr!9|Jb}inuTox*R7-75k zGe&OScld`WQf#T^7gY{O%V}J|CfwZ6dlpa-h{y|ElBq_jI4_A zbxODYv*#;4nN4#k~ked#L!V1ceS|2t}u)%*!t>7kz+l)T(;+mX9`Xg132p z4r8Q@JWn#}=>*OfWnxLJuS7{`&6DwzS9N z#huduGw+QHMF(?$fV2m<`$KN0mpl8mUrj7murgW&^X$p`)xmkgcwfVtV~yiGy9>04 z{0+?@lk~yu$)C7&opn~>^AZ*||B70;Ja(5rLJf?4_$h9?U zR#Q+gMEuF{6amyNz0%Uduiz*4`pv9$BrV; z&JP+Z_U^fC6{OVhT!80Rz;uvKY02iqD4Up9Eai9|QKus4R;}>!%I%@n1Q`1H`c!ci z@TeTM1U&zDxeezVn}AEEug{LpjUHLV2wnvQ1dis~F0*#$5JaYGw4`s6OOD+<-15{J z1d6-G`oX)Mbs!$x9r`>aCw})kZUC)P`u#;klkCoDo&@5yAe73RX|pE1+Y5f@wdY=X zK50{E{H+n0lIDW;MoH@hQeiN5cpOL{Ogy}>8vSIM>95YuW-TuwD;Yg8(~>Gvtr<@5 z`a^07PSW0Lgqq{t6~%!K7mnue&P-gb%4@zo+hlik4xxjUWxqJI!oU80q@{Li5)xH- z#-p1DdqZ?Vuz}jFvhMeBxA?>G{d`vh42?Wg()De_Pyh z`#(J|z)R7Zo5fcss2lyiCM}iHpRj!wZy4+@14e`3_k0Cog`4HoxJpznNDiKCy^iv@ zM0@SQq^N62ruC;&TE;>=NX{|)^*DaxDVnQ|D8gtnutoriH zZ8SYICr4akU~{m;YH0vCr5H9fpX`$OM@t@7ZWkKPUS}9U1>(neBW{zw(UaViLYTp2 z8)dK6oCBzgzM^(=s(p z4~h8wcJSn|4p;&*xGaM#SiU@#v|xh00f-nFMjaic@7RA(!6Tfsmb8?=W3QBZe?K2; z+`oN&cM2HRa{IRDU%MmO5*F`QgNbw+6P?C$GR@c{bgCoZ4x9VY?r$^As*sb}f{RL; zWq_m6aBHnClUm{9k2Gr=p_7I~?kamqLg0n>1rm8%X-V_iz+6=>v{tKs!^mA=1pO@s zN1S*#&U>StZ*<|Snm9z7tv{TVr963K-cYL@4f@$~f3r7^bWxYWD{9ml{X0(e`_1ps z7CWD6xuv!{_){LYW22;7yE2DAy;GsBXz;YG*sDgC$>}R*>php`EnB4;7XGvj6&WbMvN3ZfN75Ph+$XuBv-7!+Qw4cm;M2UeIp19;z>^w?XY}1UmtCkr z+Ulq7th>5hpKcZi#${qxlpKA7y+VNQYbgww4Go3h`L;aVgcoVmB$E&#GqrAo!L;#% znw*?{J55gj7jHH5aZ`toelSlq$Lva4l&U7>>Hf{!W;7M@SA8$*?|zn@hvV`6;+yJc z_sl9r8^Ra$&*~?4Rf_{OKdd&0E-M+a3~CKdCq+e|ULaDna`;k8CM4$AVH1YcCEDKj zSV)baUr-*d54o!eCh<7!V5hbK5fbwH;}Oq-N36*0N8gf34LI zp51y58x0K&a9RyHrKMkFpl6HuP!fj2KGhtPlWn6@If?=)o|L4C@DT(>QSfZ2wZCD zsfR?0cJA3)9z5pr^n-ilT4SX_d7qL;=QEHjuA~svX-v(`3}H1e7?>V2G$^%m>=>HG z53YBD8z>PF?y7SDrrL~0&b`Hyo5hBd-PEfM+;H(s&7WX1gJUy)oY6*K-1YJCv8^F* zc{A(`A_%#AtOL7cKD2n>t2aBly>NDLczqr?AjFb!jj%aB*T4~+Lz*r78TW!}zjJ;z zCGm{@@uhoadTk+hV`^jHq@-W7FMKbh3)i{xg@ow@MiP#O1s|y?=>qWrA`&8-Uifer zHSgltX8%uu?W&)+icVf(wi2HH6=`h4wr=URsNTxOS9F>>8TI^kN9~ZkWxW%lmOjVF zd&B%nA$@@-f+W8JOPKTL4ES<$bEAzbbAQMX<1KYC9lAfqg#h^Q!*Y}?Q6e6ii7{^( z@l&tjG2prKqfR|Ku+VHi^fzo({;Hi}&o8Fo@(TM45{`^^zqE`92f?xBa{ALoy>J-9gw){GMGlGK=u&CsOa|*l>8q#ZBzd9ssZR@u10R(}W@kSBh5p~nvRLeBkjgwrk z|Ln#D+vwwTS#e!smYQt%_2A7SrRq-2P;oi{#o(afa2PV zAF%B+v-Fv(=ZZF--*XN;!(3iAwu9&#A(UNC&YPWj>EO#kbhTrm>Z#XrT03d90(Ho<$J$ z%1e_0a8*B?Dy^x44VT9Ig!+#8oPQKN{%*=%Bu+*pmYE1bdE?C9@T)d)JCYFWcnqx2 zs{UD3Lw)6kz}@7|0dd1+`c~_~wNL7u_}lCDX&VEG!dUm7$_-V0iI*{!QzKrRa;(E? zSX+u((52KeS~~=S+n6M64)LuMFS6jwP?K3 z{@iD+4e@EUUy}^SevcJVamRL84hJwY(0-JrsDPb#SJ26iC6U(jB zEw$b;3^EP5)4t6<7lP( zq&Jr|_gSSyt;;5y>|Py1`0X~4hXe&TA5u(Ao*nr`qXn%Qs0Ifn-2lIj`Lf{CrY``t znbnqWzCL?!U43!WbWMeJcSBDN(AEYAY9?(7&~bY2TORsi-@iArvXYu>ND$I<@6~R$ znPaE2nrR(JM8tFC9kQ7hdKYKoQH1I7kI#Jwcs;G#l1(cgjynB}sLczp_DybzIbkB|KD>QuHtDKT< zaNHC=iZ4fgb6xLw8selATyK^5IXS$TZM%nN;PVtIrAuYr;FW$E(>gBy|K6_+Ae*bP+ zms9^$7Za)}Apv;YXXAqXQBJ#{ zA!3n#iTe9Pi7pO#XDcSoouVDVO{~eHmp9ShWbBU7NOT*##evC2NWs4CgwwV+qU z{I?G*53lyTay1Nua51naqLGr8e~;B*F+t8j{jq@ftK4YUae>E)PQcTvS3z1|$&7~j z;-JZ{UGw+M99*u-9$H*!a|-EiT$uJ#r#>M?jqj~C(jz?-RJ>@Uch7FAi9>>yT2!>6UC#V;UG1a^#X z{5O^7*R-^>;>%u_X_M1Mq4}Bl`4~Md`kk-8#m9F|>-j`ZX>86201B%3hcagxkqOuTt5i(Nfzn|#)c1Gm)|*prSE&Udse)C5#r{L!+2}$AkI?cZ zn`We(1IC)_)1bi4%f?ASxUjdlO*Dhg<-r9J@fYo-?E`?dw{H}Y>_L9>KmB8J!ZxPm zeSRlRJdsY@NVe!KdKH`tf(yhm)hltv`JJ`bya5ZrOhRL{Evl#g2ad#fmxAfYC^%vb z7ZYNAGJW=Qv%Yeyes!$6Y%x7u1>L*Dp~tebt4~on+!7@(n{p3TGcuy?p9_QK%kQ+M z+(`Vu*%@T;k{#bSBb+qwMkI)fP(jWenRNdqgg=c)k;X>osX+ykSMFC}Sod2&*dEVC zL->TMPEp`Rc%GH%Bk4@F_jmg`b6}g@KjYxG7v|ON8^u3${a!V=n5u_7By%fztVU@W z^ZttW_T=(M%cw;qQNtHxUtJWB_rC_8JEYY|Ik{C07tC1h%Wt5#KectPS(o%gd_EDS z-&m$1=#z4h?D)Qc-~g`VgotlLNl@Gq`{UEpyTBz6M5E=9m{`uJ zW*4T5{AwQYYzkCEddZAGu$efRb%C)>(6cF>a(%oV-B@=&Xy3VIawy?{Nbs$s-_&cu zT|vM(?81AW=ZAZ4>Tu-=9tyOkKNv7=+-b6>|ya)07rV3=phjZ@gz62+FJ z4fq$3I@0A9Eva?|My_8b+^733z8o8BARbZwo38#*Z9=t_!(*3rS}H{P?N1#DQnTh! z`02cIWw4=Bq*~yiP<_T&@~0c;o%!t77FuPIfk?Qlu1BBuoNtp5*!?>VG-jH;ZkbdI zCYz9?Q}k=*o4~fge_ysC_wG%04Prk>hTyGFOI6tSWRUSpx~gicCTUFCx-D}zrOTA?M;hqK;Q zsu&ZLA-m+o)I2;%K++%}AaExL8f|AEOpVv=XF)C*&6K9Ln_#PYIo}CZbHD z@GHAC%vh$fMz-vP25|;)#=dV8Mz$=~WKD|5lET;qMPnz+SY|@m*U^j_`||rZ=dYRT zn(v$IdEV!KpZop3_r6~RL*>I%TRnau#hmt>l>358{oH*Ovp=qWik%Mp^BrwV;8=iw zJo76eI2XC@>cnz=cDHh2;H~2k{0~DJL_me&sG*_pD5HRP)P-Lw3&DR?B|A4us8U@@ zM8u1Olv0mIA*M%x4`B3ZI$Kwpg320bDh}|(S$y!MV=%>U;LM;7EWNefcH;5f!@mTj z;oXi*Lf!%{j0)P)YB^1-^HR4UBu&zWFK#TZXWQC?m!BW=-C@k$#Kc?ZC+2!74x zlaFeV8B#mNyF){!OG``EUb@JufRKy2p>{BNh4*+A?px^##6ioVkD*@5sEUI7A zeNB{1gD@R#;_Gx@Lz9PQ-IF|ry(O1iptfB&X-6=Foe?6qFUP9K;YEH%&LWX-3@Rjp zzOc6haPyy4`K!T+pOD$?R)BQIwZfK1JP96a35cz#R-XYe?9ebpTvGBra}@@oV^h7h zpeFK4tFG04cjs2ye9LU?>$b6m#s{z+s=w;R?NBAyZRw z$2ny>aD6i~o3zUAS5T7q4G7m@)0ZSUsNfbk+w9dMD-u!EY}XBS^~}nRJ~6^XD!FD*QZZSIbIWkgjxX-Rn;wOo9nrApAD7!7WzYVbUP8_ zb!>`GV?m}sU_e}beaW915m;@*@T)O`7N3eDPM%rNh8q@oxla7pru8$eEBIk4Jb8I{o6Puc%)6+vJwe#wQPzrwYMoy6HX?(E% z)Sus82h?O4Ogx#jd1WjGkn0BYZFI@3Jt7wS6jp@qFaM*JShttHy1(Q5_+ZbNz9P`R zL=2|VNmv+Mv);QIm+-K2xYUYYe5lf~?I1~1kMQZS9$!nW3}T0_4=8n%NEc)d zVzAg-mXdaR8@N^5;qZONc?XB#U(?gG3LMR@4CiS=Y&4*Ke6A3o*le*oCmVEIOY1KioU<}%eO&?w^-XbcV+SJ{ zS3l7dx?GwEWGNd+vv#j`71OuwLUY=!{+*0jFtD_=pfrUG*ZW^c&B|(%!qLSbejqB< zDrs+OY6I3dAIbFHMWt~3;xT-qKXfbfY%BXy=suSRb~dVKoC=U(fAbSenxE%7nwgoo zPd4I3UqRg}DwwdcdGNfv?EguX3M(l^*w!a0k${?mffFJ!sMEW^87M64^WxsWZdc^v z4Rd?DU#HEy{29bJbM5ArQ<i2RZ)1j@@_Kb|6sHmT5!GKc`46F2h z#(YXJysWIOZDb_YZ?&PQ%;V>YwI5%Xw)VVp-(0cB&5Q`bj<`Z(K*jS!U<_i212_Qb zUYZyRcq*w1I;S`>ijIoXO-;QRzu23-U-LUg&vwVmVr0ETd^axX01%GAzO~dtNq}Wo z7B@)=k*UPtP_*++y4KdhU%#I4SqtL^0eIuSNb2Zs4E7i1i@$(oiB@t@kG1>eKM95x z4`S_wj)EZN0m}z&B+H<}N4A!lUWba1P@72k z=Hh67XA5U6Qz9-Jka?Vq|DG8Yb!H+QUK+QNv$YifCHb$ki(X&kqEdOnc2Lu|($h_$ z!)pJ$!J2&>0Ic7;fW1^)aeOFVEfmHB-cQK~Yzv38@iLd^x@3eNccj_^5al{Q)0KNr z*`F9bcGKj}@wnbEKwhq}E_Ifx9x98xSjYzlNVfFYuwGw-yf}*h8s2PZ}1+G#kX&D@^0oTU}fu$j_baahty=D z^;RBq%?63)dfT3karl(XS=a-O!oHn?vP8~^Swj?SKt=zl(`=% zoJU_2snoFqMCC!E(3G^8Z<&Sr$D`#UH!9XR|KPT*3Gr3dv~-(8g_7pcJjGyY?i?QM zt7b=4p36SQ1pthr{sa8*^%<|w17l;~xg;+G>P8H8dTqXSmtgkaT^=6NL?SxUz-2{Z z{){r0wz@jn#Po>KF&Og07)qX6?hq47+W2@$BJvIFPtPkWi)6nf53cy|q47MQIcCA%EYZ?q8QKbJ(V>2~zK+u^5{;&adJQwI98ak&_z%wD&~@<$`db6 zpwD_;vgDeI3KozYq`b1|C3_wwm)Vln*TN?|35l)ms{I{nf8bj-49SQ77^Lo;YI=Z?CR>_lJ3Ndf4z>kPh{-$1UeLlGG z?NO7`&;Zpeh)7u21@2*Dnwn-6@R`-FW-!3a;S3Ov)NAX^<6Z__Hd?#R3h<6n4iArG z7*$Xx#n-CBx04u&gJ+2CZeM!;S;w?@@*A0H#b+md$(FoMNY0w z)ZEl3;q6;Tkf|9_5lRVpb9`~@6W2&rLvdlLg2s*yXO0oA_=k2fpluMTBVlwry{A|P z3smEf894^(Kbu{vV5uh+&~{>AR8=Hjw(^GcF)sq#B@r kLi^S4%Nx!Mm#!VIR>l{$Y9{Fc=LLf9X&Pvh-F+1Ge_r_RkN^Mx literal 0 HcmV?d00001 diff --git a/docs/reference/gio/migrating-gconf.xml b/docs/reference/gio/migrating-gconf.xml new file mode 100644 index 0000000..b1a491f --- /dev/null +++ b/docs/reference/gio/migrating-gconf.xml @@ -0,0 +1,515 @@ + + Migrating from GConf to GSettings + +

+ Before you start + + + Converting individual applications and their settings from GConf to + GSettings can be done at will. But desktop-wide settings like font or + theme settings often have consumers in multiple modules. Therefore, + some consideration has to go into making sure that all users of a setting + are converted to GSettings at the same time or that the program + responsible for configuring that setting continues to update the value in + both places. + + + It is always a good idea to have a look at how others have handled + similar problems before. + +
+ +
+ Conceptual differences + + + Conceptually, GConf and GSettings are fairly similar. Both + have a concept of pluggable backends. Both keep information + about keys and their types in schemas. Both have a concept of + mandatory values, which lets you implement lock-down. + + + There are some differences in the approach to schemas. GConf + installs the schemas into the database and has API to handle + schema information (gconf_client_get_default_from_schema(), + gconf_value_get_schema(), etc). GSettings on the other hand + assumes that an application knows its own schemas, and does + not provide API to handle schema information at runtime. + GSettings is also more strict about requiring a schema whenever + you want to read or write a key. To deal with more free-form + information that would appear in schema-less entries in GConf, + GSettings allows for schemas to be 'relocatable'. + + + One difference in the way applications interact with their + settings is that with GConf you interact with a tree of + settings (ie the keys you pass to functions when reading + or writing values are actually paths with the actual name + of the key as the last element. With GSettings, you create + a GSettings object which has an implicit prefix that determines + where the settings get stored in the global tree of settings, + but the keys you pass when reading or writing values are just + the key names, not the full path. + +
+ +
+ GConfClient (and GConfBridge) API conversion + + + Most people use GConf via the high-level #GConfClient API. + The corresponding API is the #GSettings object. While not + every GConfClient function has a direct GSettings equivalent, + many do: + + + + GConfClientGSettings + + + gconf_client_get_default()no direct equivalent, + instead you call g_settings_new() for the schemas you use + gconf_client_set()g_settings_set() + gconf_client_get()g_settings_get() + gconf_client_get_bool()g_settings_get_boolean() + gconf_client_set_bool()g_settings_set_boolean() + gconf_client_get_int()g_settings_get_int() + gconf_client_set_int()g_settings_set_int() + gconf_client_get_float()g_settings_get_double() + gconf_client_set_float()g_settings_set_double() + gconf_client_get_string()g_settings_get_string() + gconf_client_set_string()g_settings_set_string() + gconf_client_get_list()for string lists, see g_settings_get_strv(), else see g_settings_get_value() and #GVariant API + gconf_client_set_list()for string lists, see g_settings_set_strv(), else see g_settings_set_value() and #GVariant API + gconf_entry_get_is_writable()g_settings_is_writable() + gconf_client_notify_add()not required, the #GSettings::changed signal is emitted automatically + gconf_client_add_dir()not required, each GSettings instance automatically watches all keys in its path + #GConfChangeSetg_settings_delay(), g_settings_apply() + gconf_client_get_default_from_schema()no equivalent, applications are expected to know their schema + gconf_client_all_entries()no equivalent, applications are expected to know their schema, and GSettings does not allow schema-less entries + gconf_client_get_without_default()no equivalent + gconf_bridge_bind_property()g_settings_bind() + gconf_bridge_bind_property_full()g_settings_bind_with_mapping() + + +
+
+ + GConfBridge was a third-party library that used GConf to bind an object property + to a particular configuration key. GSettings offers this service itself. + + + There is a pattern that is sometimes used for GConf, where a setting can have + explicit 'value A', explicit 'value B' or 'use the system default'. With GConf, + 'use the system default' is sometimes implemented by unsetting the user value. + + + This is not possible in GSettings, since it does not have API to determine if a value + is the default and does not let you unset values. The recommended way (and much + clearer) way in which this can be implemented in GSettings is to have a separate + 'use-system-default' boolean setting. + +
+ +
+ Change notification + + + GConf requires you to call gconf_client_add_dir() and + gconf_client_notify_add() to get change notification. With + GSettings, this is not necessary; signals get emitted automatically + for every change. + + + The #GSettings::changed signal is emitted for each changed key. + There is also a #GSettings::change-event signal that you can handle + if you need to see groups of keys that get changed at the same time. + + + GSettings also notifies you about changes in writability of keys, + with the #GSettings::writable-changed signal (and the + #GSettings::writable-change-event signal). + +
+ +
Change sets + + GConf has a a concept of a set of changes which can be applied or reverted + at once: #GConfChangeSet (GConf doesn't actually apply changes atomically, + which is one of its shortcomings). + + + Instead of a separate object to represent a change set, GSettings has a + 'delayed-apply' mode, which can be turned on for a GSettings object by + calling g_settings_delay(). In this mode, changes done to the GSettings + object are not applied - they are still visible when calling g_settings_get() + on the same object, but not to other GSettings instances + or even other processes. + + + To apply the pending changes all at once (GSettings does + atomicity here), call g_settings_apply(). To revert the pending changes, + call g_settings_revert() or just drop the reference to the #GSettings object. + +
+ +
+ Schema conversion + + + If you are porting your application from GConf, most likely you already + have a GConf schema. GConf comes with a commandline tool + gsettings-schema-convert that can help with the task of converting + a GConf schema into an equivalent GSettings schema. The tool is not + perfect and may need assistence in some cases. + + An example for using gsettings-schema-convert + Running gsettings-schema-convert --gconf --xml --schema-id "org.gnome.font-rendering" --output org.gnome.font-rendering.gschema.xml destop_gnome_font_rendering.schemas on the following desktop_gnome_font_rendering.schemas file: + + + + + + /schemas/desktop/gnome/font_rendering/dpi + /desktop/gnome/font_rendering/dpi + gnome + int + 96 + + DPI + The resolution used for converting font sizes to pixel sizes, in dots per inch. + + + + +]]> + +produces a org.gnome.font-rendering.gschema.xml file with the following content: + + + + + 96 + DPI + The resolution used for converting font sizes to pixel sizes, in dots per inch. + + + +]]> + + + + + + GSettings schemas are identified at runtime by their id (as specified + in the XML source file). It is recommended to use a dotted name as schema + id, similar in style to a D-Bus bus name, e.g. "org.gnome.SessionManager". + In cases where the settings are general and not specific to one application, + the id should not use StudlyCaps, e.g. "org.gnome.font-rendering". + The filename used for the XML schema source is immaterial, but + schema compiler expects the files to have the extension + .gschema.xml. It is recommended to simply + use the schema id as the filename, followed by this extension, + e.g. org.gnome.SessionManager.gschema.xml. + + + + The XML source file for your GSettings schema needs to get installed + into $datadir/glib-2.0/schemas, and needs to be + compiled into a binary form. At runtime, GSettings looks for compiled + schemas in the glib-2.0/schemas subdirectories + of all XDG_DATA_DIRS directories, so if you install + your schema in a different location, you need to set the + XDG_DATA_DIRS environment variable appropriately. + + + Schemas are compiled into binary form by the + glib-compile-schemas utility. + GIO provides a glib_compile_schemas + variable for the schema compiler. + + + You can ignore all of this by using the provided m4 macros. To + do this, add to your configure.ac: + +GLIB_GSETTINGS + + The corresponding Makefile.am fragment looks like + this: + +# gsettings_SCHEMAS is a list of all the schemas you want to install +gsettings_SCHEMAS = my.app.gschema.xml + +# include the appropriate makefile rules for schema handling +@GSETTINGS_RULES@ + + + + + This is not sufficient on its own. You need to mention what the source + of the my.app.gschema.xml file is. If the schema + file is distributed directly with your project's tarball then a mention + in EXTRA_DIST is appropriate. If the schema file is + generated from another source then you will need the appropriate rule + for that, plus probably an item in EXTRA_DIST for the + source files used by that rule. + + + + One possible pitfall in doing schema conversion is that the default + values in GSettings schemas are parsed by the #GVariant parser. + This means that strings need to include quotes in the XML. Also note + that the types are now specified as #GVariant type strings. + +string +rgb +]]> + + becomes + + + 'rgb' + +]]> + + + + Another possible complication is that GConf specifies full paths + for each key, while a GSettings schema has a 'path' attribute that + contains the prefix for all the keys in the schema, and individual + keys just have a simple name. So + +/schemas/desktop/gnome/font_rendering/antialiasing +]]> + + becomes + + + +]]> + + + + Default values can be localized in both GConf and GSettings schemas, + but GSettings uses gettext for the localization. You can specify + the gettext domain to use in the gettext-domain + attribute. Therefore, when converting localized defaults in GConf, + +/schemas/apps/my_app/font_size + + 18 + + + 24 + + +]]> + + becomes + + + ... + + 18 + +]]> + + + + GSettings uses gettext for translation of default values. + The string that is translated is exactly the string that appears + inside of the default element. This + includes the quotation marks that appear around strings. + Default values must be marked with the l10n + attribute in the default tag, which + should be set as equal to 'messages' or + 'time' depending on the desired category. An + optional translation context can also be specified with the + context attribute, as in the example. This + is usually recommended, since the string "18" + is not particularly easy to translate without context. The + translated version of the default value should be stored in the + specified gettext-domain. Care must be taken + during translation to ensure that all translated values remain + syntactically valid; mistakes here will cause runtime errors. + + + GSettings schemas have optional summary and + description elements for each key which + correspond to the short and + long elements in the GConf schema and + will be used in similar ways by a future gsettings-editor, so you + should use the same conventions for them: The summary is just a short + label with no punctuation, the description can be one or more complete + sentences. If multiple paragraphs are desired for the description, the + paragraphs should be separated by a completely empty line. + + + Translations for these strings will also be handled + via gettext, so you should arrange for these strings to be + extracted into your gettext catalog. One way to do that is to use + intltool. Since intltool 0.50.1, schema files are + supported, so all you have to do is to add your .gschema.xml + files to POTFILES.in with a line like + + [type: gettext/gsettings]data/org.foo.MyApp.gschema.xml + + + + GSettings is a bit more restrictive about key names than GConf. Key + names in GSettings can be at most 32 characters long, and must only + consist of lowercase characters, numbers and dashes, with no + consecutive dashes. The first character must not be a number or dash, + and the last character cannot be '-'. + + + If you are using the GConf backend for GSettings during the + transition, you may want to keep your key names the same they + were in GConf, so that existing settings in the users GConf + database are preserved. You can achieve this by using the + with the + glib-compile-schemas schema + compiler. Note that this option is only meant + to ease the process of porting your application, allowing parts + of your application to continue to access GConf and parts to use + GSettings. By the time you have finished porting your application + you must ensure that all key names are valid. + +
+ +
Data conversion + + GConf comes with a GSettings backend that can be used to + facility the transition to the GSettings API until you are + ready to make the jump to a different backend (most likely + dconf). To use it, you need to set the GSETTINGS_BACKEND + to 'gconf', e.g. by using + + g_setenv ("GSETTINGS_BACKEND", "gconf", TRUE); + + early on in your program. Note that this backend is meant purely + as a transition tool, and should not be used in production. + + + GConf also comes with a utility called + gsettings-data-convert, which is designed to help + with the task of migrating user settings from GConf into another + GSettings backend. It can be run manually, but it is designed to be + executed automatically, every time a user logs in. It keeps track of + the data migrations that it has already done, and it is harmless to + run it more than once. + + + To make use of this utility, you must install a keyfile in the + directory /usr/share/GConf/gsettings which + lists the GSettings keys and GConf paths to map to each other, for + each schema that you want to migrate user data for. + + + Here is an example: + + + + The last key demonstrates that it may be necessary to modify the key + name to comply with stricter GSettings key name rules. Of course, + that means your application must use the new key names when looking + up settings in GSettings. + + + The last group in the example also shows how to handle the case + of 'relocatable' schemas, which don't have a fixed path. You can + specify the path to use in the group name, separated by a colon. + + + There are some limitations: gsettings-data-convert + does not do any transformation of the values. And it does not handle + complex GConf types other than lists of strings or integers. + + + Don't forget to require GConf 2.31.1 or newer in your configure + script if you are making use of the GConf backend or the conversion + utility. + + + + If, as an application developer, you are interested in manually + ensuring that gsettings-data-convert has been + invoked (for example, to deal with the case where the user is + logged in during a distribution upgrade or for non-XDG desktop + environments which do not run the command as an autostart) you + may invoke it manually during your program initialisation. This + is not recommended for all application authors -- it is your + choice if this use case concerns you enough. + + + Internally, gsettings-data-convert uses a + keyfile to track which settings have been migrated. The + following code fragment will check that keyfile to see if your + data conversion script has been run yet and, if not, will + attempt to invoke the tool to run it. You should adapt it to + your application as you see fit. + + + + + + + + Although there is the possibility that the + gsettings-data-convert script will end up + running multiple times concurrently with this approach, it is + believed that this is safe. + +
+ diff --git a/docs/reference/gio/migrating-gdbus.xml b/docs/reference/gio/migrating-gdbus.xml new file mode 100644 index 0000000..4f51679 --- /dev/null +++ b/docs/reference/gio/migrating-gdbus.xml @@ -0,0 +1,305 @@ + + + +]> + + Migrating to GDBus + +
+ Conceptual differences + + + The central concepts of D-Bus are modelled in a very similar way + in dbus-glib and GDBus. Both have a objects representing connections, + proxies and method invocations. But there are some important + differences: + + + dbus-glib uses the libdbus + reference implementation, GDBus doesn't. Instead, it + relies on GIO streams as transport layer, and has its own + implementation for the the D-Bus connection setup and + authentication. Apart from using streams as transport, + avoiding libdbus also lets GDBus avoid some thorny + multithreading issues. + + + dbus-glib uses the GObject type system for method arguments and + return values, including a homegrown container specialization + mechanism. GDBus relies on the #GVariant type system which is + explicitly designed to match D-Bus types. + + + dbus-glib models only D-Bus interfaces and does not provide + any types for objects. GDBus models both D-Bus interfaces + (via the #GDBusInterface, #GDBusProxy and + #GDBusInterfaceSkeleton types) and objects (via the + #GDBusObject, #GDBusObjectSkeleton and #GDBusObjectProxy types). + + + GDBus includes native support for the org.freedesktop.DBus.Properties (via the #GDBusProxy type) and org.freedesktop.DBus.ObjectManager D-Bus interfaces, dbus-glib doesn't. + + + The typical way to export an object in dbus-glib involves + generating glue code from XML introspection data using + dbus-binding-tool. GDBus provides a + similar tool called gdbus-codegen that + can also generate Docbook D-Bus interface documentation. + + + dbus-glib doesn't provide any convenience API for owning and + watching bus names, GDBus provides the g_bus_own_name() and + g_bus_watch_name() family of convenience functions. + + + GDBus provides API to parse, generate and work with Introspection + XML, dbus-glib doesn't. + + + +
+ +
+ API comparison + + + dbus-glib APIs and their GDBus counterparts + + + dbus-glibGDBus + + + #DBusGConnection#GDBusConnection + #DBusGProxy#GDBusProxy, #GDBusInterface - also see #GDBusObjectProxy + #DBusGObject#GDBusInterfaceSkeleton, #GDBusInterface - also see #GDBusObjectSkeleton + #DBusGMethodInvocation#GDBusMethodInvocation + dbus_g_bus_get()g_bus_get_sync(), also see + g_bus_get() + dbus_g_proxy_new_for_name()g_dbus_proxy_new_sync() and + g_dbus_proxy_new_for_bus_sync(), also see g_dbus_proxy_new() + dbus_g_proxy_add_signal()not needed, use the generic #GDBusProxy::g-signal + dbus_g_proxy_connect_signal()use g_signal_connect() with #GDBusProxy::g-signal + dbus_g_connection_register_g_object()g_dbus_connection_register_object() - also see g_dbus_object_manager_server_export() + dbus_g_connection_unregister_g_object()g_dbus_connection_unregister_object() - also see g_dbus_object_manager_server_unexport() + dbus_g_object_type_install_info()introspection data is installed while registering + an object, see g_dbus_connection_register_object() + dbus_g_proxy_begin_call()g_dbus_proxy_call() + dbus_g_proxy_end_call()g_dbus_proxy_call_finish() + dbus_g_proxy_call()g_dbus_proxy_call_sync() + dbus_g_error_domain_register()g_dbus_error_register_error_domain() + dbus_g_error_has_name()no direct equivalent, see g_dbus_error_get_remote_error() + dbus_g_method_return()g_dbus_method_invocation_return_value() + dbus_g_method_return_error()g_dbus_method_invocation_return_error() and variants + dbus_g_method_get_sender()g_dbus_method_invocation_get_sender() + + +
+
+ +
+ Owning bus names + + Using dbus-glib, you typically call RequestName manually + to own a name, like in the following excerpt: + message); + g_error_free (error); + } + else + { + g_warning ("Failed to acquire %s", NAME_TO_CLAIM); + } + goto out; + } + + if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + if (error != NULL) + { + g_warning ("Failed to acquire %s: %s", + NAME_TO_CLAIM, error->message); + g_error_free (error); + } + else + { + g_warning ("Failed to acquire %s", NAME_TO_CLAIM); + } + exit (1); + } + + dbus_g_proxy_add_signal (system_bus_proxy, "NameLost", + G_TYPE_STRING, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (system_bus_proxy, "NameLost", + G_CALLBACK (on_name_lost), NULL, NULL); + + /* further setup ... */ +]]> + + + + While you can do things this way with GDBus too, using + g_dbus_proxy_call_sync(), it is much nicer to use the high-level API + for this: + + + Note that g_bus_own_name() works asynchronously and requires + you to enter your mainloop to await the on_name_aquired() + callback. Also note that in order to avoid race conditions (e.g. + when your service is activated by a method call), you have to export + your manager object before acquiring the + name. The on_bus_acquired() callback is the right place to do + such preparations. + +
+ +
+ Creating proxies for well-known names + + dbus-glib lets you create proxy objects for well-known names, like the + following example: + + + For a #DBusGProxy constructed like this, method calls will be sent to + the current owner of the name, and that owner can change over time. + + + The same can be achieved with #GDBusProxy: + + + For an added layer of safety, you can specify what D-Bus + interface the proxy is expected to conform to by using the + #GDBusInterfaceInfo type. Additionally, #GDBusProxy loads, + caches and tracks changes to the D-Bus properties on the remote + object. It also sets up match rules so D-Bus signals from the + remote object are delivered locally. + + + The #GDBusProxy type normally isn't used directly - instead + proxies subclassing #GDBusProxy generated by gdbus-codegen is used, see + +
+ +
+ Generating code and docs + +
+ Using gdbus-codegen + + + dbus-glib comes with dbus-binding-tool, which + can produce somewhat nice client- and server-side wrappers for a D-Bus interface. + With GDBus, gdbus-codegen is used and like + its counterpart, it also takes D-Bus Introspection XML as input: + + Example D-Bus Introspection XMLFIXME: MISSING XINCLUDE CONTENT + + If this XML is processed like this + + then two files generated-code.h and + generated-code.c are + generated. Additionally, two XML files + generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal and + generated-docs-org.gtk.GDBus.Example.ObjectManager.Cat + with Docbook XML are generated. For an example of what the docs look + like see the Animal D-Bus interface documentation. + and + the Cat D-Bus interface documentation. + + + While the contents of generated-code.h and + generated-code.c are best described by the + gdbus-codegen manual + page, brief examples of how this generated code can be used can be found in + + and . Additionally, since + the generated code has 100% gtk-doc coverage, see + #ExampleAnimal, #ExampleCat, #ExampleObject and + #ExampleObjectManagerClient pages for documentation. + + + Server-side application using generated codeFIXME: MISSING XINCLUDE CONTENT + + Client-side application using generated codeFIXME: MISSING XINCLUDE CONTENT + +
+ + + + + + + + +
+ +
diff --git a/docs/reference/gio/migrating-gnome-vfs.xml b/docs/reference/gio/migrating-gnome-vfs.xml new file mode 100644 index 0000000..ba3987c --- /dev/null +++ b/docs/reference/gio/migrating-gnome-vfs.xml @@ -0,0 +1,133 @@ + + 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/migrating-posix.xml b/docs/reference/gio/migrating-posix.xml new file mode 100644 index 0000000..e7dc9f4 --- /dev/null +++ b/docs/reference/gio/migrating-posix.xml @@ -0,0 +1,27 @@ + + 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 + + +
+ +
+
diff --git a/docs/reference/gio/overview.xml b/docs/reference/gio/overview.xml new file mode 100644 index 0000000..6da4492 --- /dev/null +++ b/docs/reference/gio/overview.xml @@ -0,0 +1,683 @@ + + 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, as well as other generally + useful APIs for desktop applications (such as networking and + D-Bus support). 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 a framework for storing and retrieving application settings: + + + GSettings + stores and retrieves application settings + + + There is support for network programming, including connectivity monitoring, + 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 + + + GNetworkMonitor + network connectivity monitoring + + + There is support for connecting to D-Bus, + sending and receiving messages, owning and watching bus names, + and making objects available on the bus: + + + GDBusConnection + a D-Bus connection + + + + GDBusMethodInvocation + for handling remove calls + + + + GDBusServer + helper for accepting connections + + + + GDBusProxy + proxy to access D-Bus interfaces on a remote object + + + + 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. + +
+ + + Writing GIO applications + + + The information in the GLib documentation about writing GLib + applications is generally applicable when writing GIO applications. + + + Threads + + + GDBus has its own private worker thread, so applications using + GDBus have at least 3 threads. GIO makes heavy use of the concept + of a thread-default + main context to execute callbacks of asynchronous + methods in the same context in which the operation was started. + + + + + Security + + +When your program needs to carry out some privileged operation (say, +create a new user account), there are various ways in which you can go +about this: + + +Implement a daemon that offers the privileged operation. A convenient +way to do this is as a D-Bus system-bus service. The daemon will probably +need ways to check the identity and authorization of the caller before +executing the operation. polkit is a framework that allows this. + + +Use a small helper that is executed with elevated privileges via +pkexec. pkexec is a small program launcher that is part of polkit. + + +Use a small helper that is executed with elevated privileges by +being suid root. + + +None of these approaches is the clear winner, they all have their +advantages and disadvantages. + + + +When writing code that runs with elevated privileges, it is important +to follow some basic rules of secure programming. David Wheeler has an +excellent book on this topic, +Secure Programming for Linux and Unix HOWTO. + + + +When using GIO in code that runs with elevated privileges, you have to +be careful. GIO has extension points whose implementations get loaded +from modules (executable code in shared objects), which could allow +an attacker to sneak his own code into your application by tricking it +into loading the code as a module. However, GIO will never load modules +from your home directory except when explictly asked to do so via an +environment variable. + + + +In most cases, your helper program should be so small that you don't +need GIO, whose APIs are largely designed to support full-blown desktop +applications. If you can't resist the convenience of these APIs, here +are some steps you should take: + + +Clear the environment, e.g. using the clearenv() +function. +David Wheeler has a good explanation for why it is +important to sanitize the environment. +See +for a list of all environment variables affecting GIO. In particular, +PATH (used to locate binaries), GIO_EXTRA_MODULES (used to locate loadable modules) and DBUS_{SYSTEM,SESSION}_BUS_ADDRESS (used to locate the D-Bus system and session bus) are important. + + +Don't use GVfs, by setting GIO_USE_VFS=local in the environment. +The reason to avoid GVfs in security-sensitive programs is that it uses +many libraries which have not necessarily been audited for security problems. +Gvfs is also heavily distributed and relies on a session bus to be present. + + + + + + + + + + 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 + + + + Since GIO is based on GObject, you need to call g_type_init() + before you can use any GIO functions. If your application uses + GTK+, this is already taken care of by gtk_init(). + + + + + 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_FILE_MONITOR</envar> + + + This variable can be set to the name of a #GFileMonitor + implementation to override the default for debugging purposes. + The #GFileMonitor implementation for local files that is included + in GIO on Linux has the name "inotify", others that are built + are built as modules (depending on the platform) are called + "fam" and "fen". + + + + + <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_TLS</envar> + + + This variable can be set to the name of a #GTlsBackend + implementation to override the default for debugging purposes. + GIO does not include a #GTlsBackend implementation, the gnutls-based + implementation in the glib-networking module has the name "gnutls". + + + + + <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. + + + + + <envar>GSETTINGS_BACKEND</envar> + + + This variable can be set to the name of a #GSettingsBackend + implementation to override the default for debugging purposes. + The memory-based implementation that is included in GIO has + the name "memory", the one in dconf has the name "dconf-settings". + + + + + <envar>GSETTINGS_SCHEMA_DIR</envar> + + + This variable can be set to the name of a directory that is + considered in addition to the glib-2.0/schemas + subdirectories of the XDG system data dirs when looking + for compiled schemas for #GSettings. + + + + + <envar>DBUS_SYSTEM_BUS_ADDRESS</envar> + + + This variable is consulted to find the address of the D-Bus system + bus. For the format of D-Bus addresses, see the D-Bus + specification. + + + Setting this variable overrides platform-specific ways of determining + the system bus address. + + + + + <envar>DBUS_SESSION_BUS_ADDRESS</envar> + + + This variable is consulted to find the address of the D-Bus session bus. + + + Setting this variable overrides platform-specific ways of determining + the session bus address. + + + + + <envar>DBUS_STARTER_BUS_TYPE</envar> + + + This variable is consulted to find out the 'starter' bus for an + application that has been started via D-Bus activation. The possible + values are 'system' or 'session'. + + + + + <envar>G_DBUS_DEBUG</envar> + + + This variable can be set to a list of debug options, which + cause GLib to print out different types of debugging + information when using the D-Bus routines. + + + transport + Show IO activity (e.g. reads and writes) + + + message + Show all sent and received D-Bus messages + + + payload + Show payload for all sent and received D-Bus messages (implies message) + + + call + Trace g_dbus_connection_call() and g_dbus_connection_call_sync() API usage + + + signal + Show when a D-Bus signal is received + + + incoming + Show when an incoming D-Bus method call is received + + + return + Show when a reply is returned via the #GDBusMethodInvocation API + + + emission + Trace g_dbus_connection_emit_signal() API usage + + + authentication + Show information about connection authentication + + + address + Show information about D-Bus address lookups and autolaunching + + + The special value all can be used to turn + on all debug options. The special value + help can be used to print a list of + supported options to standard output. + + + + + <envar>G_DBUS_COOKIE_SHA1_KEYRING_DIR</envar> + + + Can be used to override the directory used to store the + keyring used in the DBUS_COOKIE_SHA1 + authentication mechanism. Normally the directory used is + .dbus-keyrings in the user's home + directory. + + + + + <envar>G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION</envar> + + + If set, the permissions of the directory used to store the + keyring used in the DBUS_COOKIE_SHA1 + authentication mechanism won't be checked. Normally the + directory must be readable only by the user. + + + + + + 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. + + + This extension point has been discontinued in GLib 2.28. It is + still available to keep API and ABI stability, but GIO is no + longer using it for default handlers. Instead, the mime handler + mechanism is used, together with x-scheme-handler pseudo-mimetypes. + + + + + G_SETTINGS_BACKEND_EXTENSION_POINT_NAME + + + Allows to provide an alternative storage for #GSettings. + Implementations of this extension point must derive from the + #GSettingsBackend type. GIO contains a keyfile-based + implementation of this extension point, another one is provided + by dconf. + + + + + G_PROXY_EXTENSION_POINT_NAME + + + Allows to provide implementations for network proxying. + Implementations of this extension point must provide the + #GProxy interface, and must be named after the network + protocol they are proxying. + + + glib-networking contains an implementation of this extension + point based on libproxy. + + + + G_TLS_BACKEND_EXTENSION_POINT_NAME + + + Allows to provide implementations for TLS support. + Implementations of this extension point must implement + the #GTlsBackend interface. + + + glib-networking contains an implementation of this extension + point. + + + + + G_NETWORK_MONITOR_EXTENSION_POINT_NAME + + + Allows to provide implementations for network connectivity + monitoring. + Implementations of this extension point must implement + the #GNetworkMonitorInterface interface. + + + GIO contains an implementation of this extension point + that is using the netlink interface of the Linux kernel. + + + +
+ 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..54918c8 --- /dev/null +++ b/docs/reference/glib/Makefile.am @@ -0,0 +1,128 @@ +## 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.xml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=$(top_srcdir)/glib $(top_srcdir)/gmodule + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" --ignore-decorators="GLIB_VAR|G_GNUC_WARN_UNUSED_RESULT" + +# 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 + +# Ignore some private headers +IGNORE_HFILES = \ + gallocator.h \ + gdatasetprivate.h \ + glibintl.h \ + gbsearcharray.h \ + glib-private.h \ + gmoduleconf.h \ + gthreadprivate.h \ + gunibreak.h \ + gunicomp.h \ + gunidecomp.h \ + gunichartables.h \ + glib_probes.h \ + glib_trace.h \ + libcharset.h \ + gdebug.h \ + gprintfint.h \ + gmirroringtable.h \ + gscripttable.h \ + glib-mirroring-tab \ + gnulib \ + pcre \ + update-pcre \ + gbytesprivate.h \ + gvariant-internal.h \ + gvariant-serialiser.h \ + gvariant-core.h \ + gvarianttypeinfo.h \ + gwakeup.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.xml \ + running.xml \ + building.xml \ + changes.xml \ + compiling.xml \ + programming.xml \ + resources.xml \ + regex-syntax.xml \ + version.xml \ + glib-gettextize.xml \ + gtester.xml \ + gtester-report.xml \ + gvariant-varargs.xml \ + gvariant-text.xml + +expand_content_files = \ + compiling.xml + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS=--extra-dir=$(srcdir)/../gobject/html --extra-dir=$(srcdir)/../gio/html + +# 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 = + +if ENABLE_MAN + +man_MANS += \ + glib-gettextize.1 \ + gtester.1 \ + gtester-report.1 + +XSLTPROC_FLAGS = \ + --nonet \ + --stringparam man.output.quietly 1 \ + --stringparam funcsynopsis.style ansi \ + --stringparam man.th.extra1.suppress 1 \ + --stringparam man.authors.section.enabled 0 \ + --stringparam man.copyright.section.enabled 0 + +.xml.1: + $(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +CLEANFILES ?= +CLEANFILES += $(man_MANS) + +EXTRA_DIST += $(man_MANS) + +dist-hook-local: all-local + +glib-docs-clean: clean + cd $(srcdir) && rm -rf xml html diff --git a/docs/reference/glib/building.xml b/docs/reference/glib/building.xml new file mode 100644 index 0000000..739cc45 --- /dev/null +++ b/docs/reference/glib/building.xml @@ -0,0 +1,547 @@ + + + + + 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. The thread support in GLib + can be based upon POSIX threads or win32 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 option + to, 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 + option. + + + + + The optional SELinux support in GIO requires libselinux. + To build GLib without SELinux support, use the + option. + + + + + The optional support for DTrace requires the + sys/sdt.h header, which is provided + by SystemTap on Linux. To build GLib without DTrace, use + the configure option. + + + + + The optional support for + SystemTap + can be disabled with the + configure option. + + + + + + + Extra Configuration Options + + + In addition to the normal options, the + configure script in the GLib + library supports these additional arguments: + + + + <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: + + + + 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>--with-threads</systemitem> + + + Specify a thread implementation to use. Available options are + 'posix' or 'win32'. Normally, configure + should be able to work out the system threads API on its own. + + + + + <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-Bsymbolic</systemitem> and + <systemitem>--enable-Bsymbolic</systemitem> + + + By default, GLib uses the -Bsymbolic-functions linker + flag to avoid intra-library PLT jumps. A side-effect + of this is that it is no longer possible to override + internal uses of GLib functions with + LD_PRELOAD. Therefore, it may make + sense to turn this feature off in some situations. + 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>--disable-dtrace</systemitem> and + <systemitem>--enable-dtrace</systemitem> + + + By default the configure script will + detect if DTrace support is available, and use it. + + + + + <systemitem>--disable-systemtap</systemitem> and + <systemitem>--enable-systemtap</systemitem> + + + This option requires DTrace support. If it is available, then + the configure script will also check for + the presence of SystemTap. + + + + + <systemitem>--enable-gcov</systemitem> and + <systemitem>--disable-gcov</systemitem> + + + Enable the generation of coverage reports for the GLib tests. + This requires the lcov frontend to gcov from the + Linux Test Project. + To generate a coverage report, use the lcov make target. The + report is placed in the glib-lcov directory. + + + + + <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. + + + + + <systemitem>--with-python</systemitem> + + + Allows specifying the Python interpreter to use, either as an absolute path, + or as a program name. GLib can be built with Python 2 (at least version 2.5) + or Python 3. + + + + + diff --git a/docs/reference/glib/changes.xml b/docs/reference/glib/changes.xml new file mode 100644 index 0000000..24d6bcd --- /dev/null +++ b/docs/reference/glib/changes.xml @@ -0,0 +1,174 @@ + + + + +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 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.xml b/docs/reference/glib/compiling.xml new file mode 100644 index 0000000..6a86264 --- /dev/null +++ b/docs/reference/glib/compiling.xml @@ -0,0 +1,126 @@ + + + + +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 + + + +See the pkg-config website +for more information about pkg-config. + + +If your application uses or GObject +features, it must be compiled and linked with the options returned +by the following pkg-config invocation: + +$ 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 hello.c `pkg-config --cflags --libs glib-2.0` -o hello + + + +Note that the name of the file must come before the other options +(such as pkg-config), or else you may get an +error from the linker. + + + +Deprecated GLib functions are annotated to make the compiler +emit warnings when they are used (e.g. with gcc, you need to use +the -Wdeprecated-declarations option). If these warnings are +problematic, they can be turned off by defining the preprocessor +symbol %GLIB_DISABLE_DEPRECATION_WARNINGS by using the commandline +option -DGLIB_DISABLE_DEPRECATION_WARNINGS + + + +GLib deprecation annotations are versioned; by defining the +macros %GLIB_VERSION_MIN_REQUIRED and %GLIB_VERSION_MAX_ALLOWED, +you can specify the range of GLib versions whose API you want +to use. APIs that were deprecated before or introduced after +this range will trigger compiler warnings. + + + +The older deprecation mechanism of hiding deprecated interfaces +entirely from the compiler by using the preprocessor symbol +G_DISABLE_DEPRECATED is still used for deprecated macros, +enumeration values, etc. To detect uses of these in your code, +use the commandline option -DG_DISABLE_DEPRECATED. + + + +The recommended way of using GLib has always been to only include the +toplevel headers glib.h, +glib-object.h, gio.h. +Starting with 2.32, GLib enforces this by generating an error +when individual headers are directly included. + + + +Still, there are some exceptions; these headers have to be included +separately: +gmodule.h, +glib-unix.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). + + + + + diff --git a/docs/reference/glib/cross.xml b/docs/reference/glib/cross.xml new file mode 100644 index 0000000..2b16618 --- /dev/null +++ b/docs/reference/glib/cross.xml @@ -0,0 +1,208 @@ + + + + +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/no] + + + 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_have_qsort_r=[yes/no] + + + Whether you have qsort_r() that matches + BSD. 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.xml b/docs/reference/glib/glib-docs.xml new file mode 100644 index 0000000..f44d425 --- /dev/null +++ b/docs/reference/glib/glib-docs.xml @@ -0,0 +1,220 @@ + + + +]> + + + 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 mainloop abstraction, and so on. It works on many UNIX-like platforms, + as well as Windows and OS X. GLib is released under the GNU Library + General Public License (GNU LGPL). + + + + + + + + + + + + + + GLib Fundamentals + + + + + + + + + + + + GLib Core Application Support + + + + + + + + + + + + + + + GLib Utilities + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GLib Data Types + + + + + + + + + + + + + + + + + + + + + + + + Deprecated APIs + + + + + + + + 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 + + + + Index of new symbols in 2.26 + + + + Index of new symbols in 2.28 + + + + Index of new symbols in 2.30 + + + + Index of new symbols in 2.32 + + + + Index of new symbols in 2.34 + + + + Index of new symbols in 2.36 + + + + + + diff --git a/docs/reference/glib/glib-gettextize.xml b/docs/reference/glib/glib-gettextize.xml new file mode 100644 index 0000000..f016b28 --- /dev/null +++ b/docs/reference/glib/glib-gettextize.xml @@ -0,0 +1,88 @@ + + + +glib-gettextize +GLib + + +Developer +Owen +Taylor + + + + + +glib-gettextize +1 +User Commands + + + +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 + +gettextize1 + + + diff --git a/docs/reference/glib/glib-overrides.txt b/docs/reference/glib/glib-overrides.txt new file mode 100644 index 0000000..c8ae3d5 --- /dev/null +++ b/docs/reference/glib/glib-overrides.txt @@ -0,0 +1,303 @@ +# This file makes most of the thread related macros look like +# functions, which they really were, if possible easy. + + +GLIB_DISABLE_DEPRECATION_WARNINGS +#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS + + + +G_ATOMIC_LOCK_FREE +#define G_ATOMIC_LOCK_FREE + + +# default thread implementation + + +G_THREADS_IMPL_POSIX +#define G_THREADS_IMPL_POSIX + + + +G_THREADS_IMPL_WIN32 +#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_INIT +#define G_PRIVATE_INIT(notify) + + +# 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..4153a29 --- /dev/null +++ b/docs/reference/glib/glib-sections.txt @@ -0,0 +1,3227 @@ +glib.h + +
+Basic Types +types +gboolean +gpointer +gconstpointer +gchar +guchar + + +gint +G_MININT +G_MAXINT +guint +G_MAXUINT +gshort +G_MINSHORT +G_MAXSHORT +gushort +G_MAXUSHORT +glong +G_MINLONG +G_MAXLONG +gulong +G_MAXULONG + + +gint8 +G_MININT8 +G_MAXINT8 +guint8 +G_MAXUINT8 +gint16 +G_MININT16 +G_MAXINT16 +G_GINT16_MODIFIER +G_GINT16_FORMAT +guint16 +G_MAXUINT16 +G_GUINT16_FORMAT +gint32 +G_MININT32 +G_MAXINT32 +G_GINT32_MODIFIER +G_GINT32_FORMAT +guint32 +G_MAXUINT32 +G_GUINT32_FORMAT +gint64 +G_MININT64 +G_MAXINT64 +G_GINT64_MODIFIER +G_GINT64_FORMAT +G_GINT64_CONSTANT +guint64 +G_MAXUINT64 +G_GUINT64_FORMAT +G_GUINT64_CONSTANT + + +gfloat +G_MINFLOAT +G_MAXFLOAT +gdouble +G_MINDOUBLE +G_MAXDOUBLE + + +gsize +G_MAXSIZE +G_GSIZE_MODIFIER +G_GSIZE_FORMAT +gssize +G_MINSSIZE +G_MAXSSIZE +G_GSSIZE_FORMAT +goffset +G_MINOFFSET +G_MAXOFFSET +G_GOFFSET_MODIFIER +G_GOFFSET_FORMAT +G_GOFFSET_CONSTANT + + +gintptr +G_GINTPTR_MODIFIER +G_GINTPTR_FORMAT +guintptr +G_GUINTPTR_FORMAT + + +GLIB_SIZEOF_VOID_P +GLIB_SIZEOF_LONG +GLIB_SIZEOF_SIZE_T +G_HAVE_GINT64 +
+ +
+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 + + +GLIB_VERSION_2_26 +GLIB_VERSION_2_28 +GLIB_VERSION_2_30 +GLIB_VERSION_2_32 +GLIB_VERSION_2_34 +GLIB_VERSION_2_36 +GLIB_VERSION_MIN_REQUIRED +GLIB_VERSION_MAX_ALLOWED +GLIB_DISABLE_DEPRECATION_WARNINGS +
+ +
+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 + + +G_N_ELEMENTS +
+ +
+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_VA_COPY + + +G_STRINGIFY +G_PASTE +G_STATIC_ASSERT +G_STATIC_ASSERT_EXPR + + +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_DEPRECATED_FOR +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +G_GNUC_END_IGNORE_DEPRECATIONS +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_DEPRECATED +G_DEPRECATED_FOR +G_UNAVAILABLE + + +G_LIKELY +G_UNLIKELY + + +G_STRLOC +G_STRFUNC + + +GLIB_VAR +G_STRINGIFY_ARG +G_PASTE_ARGS +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 +G_VA_COPY_AS_ARRAY +GLIB_DEPRECATED +GLIB_DEPRECATED_FOR +
+ +
+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 + + +G_SOURCE_CONTINUE +G_SOURCE_REMOVE + + +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_invoke +g_main_context_invoke_full + + +g_main_context_get_thread_default +g_main_context_ref_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_name +g_source_set_name +g_source_set_name_by_id +g_source_get_context +g_source_set_callback +GSourceFunc +g_source_set_callback_indirect +g_source_set_ready_time +g_source_get_ready_time +g_source_add_unix_fd +g_source_remove_unix_fd +g_source_modify_unix_fd +g_source_query_unix_fd +g_source_add_poll +g_source_remove_poll +g_source_add_child_source +g_source_remove_child_source +g_source_get_time +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_USING_SYSTEM_PRINTF +GLIB_SYSDEF_POLLERR +GLIB_SYSDEF_POLLHUP +GLIB_SYSDEF_POLLIN +GLIB_SYSDEF_POLLNVAL +GLIB_SYSDEF_POLLOUT +GLIB_SYSDEF_POLLPRI +GLIB_SYSDEF_AF_INET +GLIB_SYSDEF_AF_INET6 +GLIB_SYSDEF_AF_UNIX +GLIB_SYSDEF_MSG_DONTROUTE +GLIB_SYSDEF_MSG_OOB +GLIB_SYSDEF_MSG_PEEK +G_WIN32_MSG_HANDLE +g_idle_funcs +g_timeout_funcs +g_child_watch_funcs +GSourcePrivate +
+ + +
+Threads +threads + +G_THREAD_ERROR +GThreadError + + +GThread +GThreadFunc +g_thread_new +g_thread_try_new +g_thread_ref +g_thread_unref +g_thread_join +g_thread_yield +g_thread_exit +g_thread_self + + +GMutex +g_mutex_init +g_mutex_clear +g_mutex_lock +g_mutex_trylock +g_mutex_unlock + + +G_LOCK_DEFINE +G_LOCK_DEFINE_STATIC +G_LOCK_EXTERN +G_LOCK +G_TRYLOCK +G_UNLOCK + + +GRecMutex +g_rec_mutex_init +g_rec_mutex_clear +g_rec_mutex_lock +g_rec_mutex_trylock +g_rec_mutex_unlock + + +GRWLock +g_rw_lock_init +g_rw_lock_clear +g_rw_lock_writer_lock +g_rw_lock_writer_trylock +g_rw_lock_writer_unlock +g_rw_lock_reader_lock +g_rw_lock_reader_trylock +g_rw_lock_reader_unlock + + +GCond +g_cond_init +g_cond_clear +g_cond_wait +g_cond_timed_wait +g_cond_wait_until +g_cond_signal +g_cond_broadcast + + +GPrivate +G_PRIVATE_INIT +g_private_get +g_private_set +g_private_replace + + +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_pointer_bit_lock +g_pointer_bit_trylock +g_pointer_bit_unlock + + +g_get_num_processors + + +G_LOCK_NAME +atexit +g_thread_error_quark +g_once_impl +
+ +
+Deprecated Thread APIs +threads-deprecated + + +G_THREADS_IMPL_POSIX +G_THREADS_IMPL_WIN32 + + +g_thread_init +g_thread_supported +g_thread_get_initialized + + +g_thread_create +g_thread_create_full +GThreadPriority +g_thread_set_priority +g_thread_foreach + + +g_mutex_new +g_mutex_free +g_cond_new +g_cond_free +g_private_new + + +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 + + +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 + + +GStaticPrivate +G_STATIC_PRIVATE_INIT +g_static_private_init +g_static_private_get +g_static_private_set +g_static_private_free + + +GThreadFunctions +g_thread_init_with_errorcheck_mutexes +G_THREADS_ENABLED +g_static_mutex_get_mutex_impl +g_thread_use_default_impl +g_threads_got_initialized +g_thread_functions_for_glib_use +g_thread_gettime +g_once_init_enter_impl +
+ +
+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_timeout_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_timeout_pop_unlocked +g_async_queue_length_unlocked +g_async_queue_sort_unlocked + + +g_async_queue_timed_pop +g_async_queue_timed_pop_unlocked +
+ +
+Atomic Operations +atomic_operations +G_ATOMIC_LOCK_FREE + + +g_atomic_int_get +g_atomic_int_set +g_atomic_int_inc +g_atomic_int_dec_and_test +g_atomic_int_compare_and_exchange +g_atomic_int_add +g_atomic_int_and +g_atomic_int_or +g_atomic_int_xor + + +g_atomic_pointer_get +g_atomic_pointer_set +g_atomic_pointer_compare_and_exchange +g_atomic_pointer_add +g_atomic_pointer_and +g_atomic_pointer_or +g_atomic_pointer_xor + + +g_atomic_int_exchange_and_add +
+ +
+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_read +GIOError +g_io_channel_write +g_io_channel_seek +g_io_channel_close + + +g_io_channel_win32_poll +g_io_channel_win32_make_pollfd +g_io_channel_win32_get_fd +g_io_channel_error_quark +g_io_watch_funcs +G_IO_FLAG_IS_WRITEABLE +g_io_channel_error_quark +
+ +
+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_clear_pointer +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_has_cr_or_lf +g_regex_get_string_number +g_regex_get_compile_flags +g_regex_get_match_flags +g_regex_escape_string +g_regex_escape_nul +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_ref +g_match_info_unref +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_check_exit_status +g_spawn_command_line_async +g_spawn_command_line_sync +g_spawn_close_pid + +g_spawn_error_quark +g_spawn_exit_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 +g_markup_parse_context_ref +g_markup_parse_context_unref + +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 +g_mkdtemp +g_mkdtemp_full +g_dir_make_tmp + + +GDir +g_dir_open +g_dir_read_name +g_dir_rewind +g_dir_close + + +GMappedFile +g_mapped_file_new +g_mapped_file_new_from_fd +g_mapped_file_ref +g_mapped_file_unref +g_mapped_file_free +g_mapped_file_get_length +g_mapped_file_get_contents +g_mapped_file_get_bytes + + +g_open +g_rename +g_mkdir +GStatBuf +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_close + + +g_file_error_quark +utimbuf +
+ + +
+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 +g_ascii_table +
+ +
+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 + + +g_get_monotonic_time +g_get_real_time + + +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 +
+ +
+timezone + +GTimeZone +g_time_zone_unref +g_time_zone_ref + +g_time_zone_new +g_time_zone_new_local +g_time_zone_new_utc + +GTimeType +g_time_zone_find_interval +g_time_zone_adjust_time + +g_time_zone_get_abbreviation +g_time_zone_get_offset +g_time_zone_is_dst +
+ +
+date-time +GTimeSpan +G_TIME_SPAN_DAY +G_TIME_SPAN_HOUR +G_TIME_SPAN_MINUTE +G_TIME_SPAN_SECOND +G_TIME_SPAN_MILLISECOND + + +GDateTime +g_date_time_unref +g_date_time_ref + + +g_date_time_new_now +g_date_time_new_now_local +g_date_time_new_now_utc + + +g_date_time_new_from_unix_local +g_date_time_new_from_unix_utc + + +g_date_time_new_from_timeval_local +g_date_time_new_from_timeval_utc + + +g_date_time_new +g_date_time_new_local +g_date_time_new_utc + + +g_date_time_add + + +g_date_time_add_years +g_date_time_add_months +g_date_time_add_weeks +g_date_time_add_days + + +g_date_time_add_hours +g_date_time_add_minutes +g_date_time_add_seconds + + +g_date_time_add_full + + +g_date_time_compare +g_date_time_difference +g_date_time_hash +g_date_time_equal + + +g_date_time_get_ymd + + +g_date_time_get_year +g_date_time_get_month +g_date_time_get_day_of_month + + +g_date_time_get_week_numbering_year +g_date_time_get_week_of_year +g_date_time_get_day_of_week + + +g_date_time_get_day_of_year + + +g_date_time_get_hour +g_date_time_get_minute +g_date_time_get_second +g_date_time_get_microsecond +g_date_time_get_seconds + + +g_date_time_to_unix +g_date_time_to_timeval + + +g_date_time_get_utc_offset +g_date_time_get_timezone_abbreviation +g_date_time_is_daylight_savings + + +g_date_time_to_timezone +g_date_time_to_local +g_date_time_to_utc + + +g_date_time_format +
+ +
+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_get_environ +g_environ_getenv +g_environ_setenv +g_environ_unsetenv +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 +g_get_user_runtime_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 +GFormatSizeFlags +g_format_size_full +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_ref +g_key_file_unref +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_int64 +g_key_file_get_uint64 +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_int64 +g_key_file_set_uint64 +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 +g_key_file_get_type +
+ +
+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 + +
+ +
+UNIX-specific utilities and integration +gunix +G_UNIX_ERROR +g_unix_open_pipe +g_unix_set_fd_nonblocking + + +g_unix_signal_add +g_unix_signal_add_full +g_unix_signal_source_new + + +GUnixFDSourceFunc +g_unix_fd_add +g_unix_fd_add_full +g_unix_fd_source_new + + +g_unix_error_quark +
+ +# Data Structures + +
+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_free_full + + +g_list_alloc +g_list_free_1 +g_list_free1 + + +g_list_length +g_list_copy +g_list_copy_deep +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 +
+ +
+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_full +g_slist_free_1 +g_slist_free1 + + +g_slist_length +g_slist_copy +g_slist_copy_deep +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 +
+ +
+Double-ended Queues +queue + +GQueue +g_queue_new +g_queue_free +g_queue_free_full +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_lookup +g_sequence_lookup_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_add +g_hash_table_contains +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_replace +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_free_to_bytes + + +g_string_up +g_string_down + + +g_string_hash +g_string_equal + + +g_string_append_c_inline +
+ +
+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_set_clear_func +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_new_full +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_new_take +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 +g_byte_array_free_to_bytes + + +GBytes +g_bytes_new +g_bytes_new_take +g_bytes_new_static +g_bytes_new_with_free_func +g_bytes_new_from_bytes +g_bytes_get_data +g_bytes_get_size +g_bytes_hash +g_bytes_equal +g_bytes_compare +g_bytes_ref +g_bytes_unref +g_bytes_unref_to_data +g_bytes_unref_to_array + + +g_bytes_get_type +
+ +
+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_after +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 +
+ + +
+Quarks +quarks +GQuark +G_DEFINE_QUARK +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 +GDuplicateFunc +g_datalist_id_dup_data +g_datalist_id_replace_data + + +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 +
+ +
+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_get_filename_charsets +g_filename_display_name +g_filename_display_basename +g_locale_from_utf8 +GConvertError + + +g_get_charset +g_get_codeset + + +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 +g_unichar_compose +g_unichar_decompose +g_unichar_fully_decompose +G_UNICHAR_MAX_DECOMPOSITION_LENGTH +GUnicodeType +G_UNICODE_COMBINING_MARK +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_unicode_script_from_iso15924 +g_unicode_script_to_iso15924 + + +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_substring +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 + + +g_utf8_skip +
+ +
+I18N +i18n +glib.h,glib/gi18n.h +_ +Q_ +C_ +N_ +NC_ +g_dgettext +g_dcgettext +g_dngettext +g_dpgettext +g_dpgettext2 +g_strip_context + +g_get_language_names +g_get_locale_variants +
+ +
+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 +g_filename_from_uri +g_filename_to_uri +
+ +
+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 +g_compute_checksum_for_bytes +
+ +
+Data HMACs +hmac +GHmac +g_hmac_new +g_hmac_copy +g_hmac_ref +g_hmac_unref +g_hmac_update +g_hmac_get_string +g_hmac_get_digest + +g_compute_hmac_for_data +g_compute_hmac_for_string +
+ +
+Testing +testing +g_test_minimized_result +g_test_maximized_result +g_test_init +g_test_initialized +g_test_quick +g_test_slow +g_test_thorough +g_test_perf +g_test_verbose +g_test_undefined +g_test_quiet +g_test_run +GTestFunc +g_test_add_func +GTestDataFunc +g_test_add_data_func +g_test_add_data_func_full +g_test_add + +g_test_fail +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 + +g_test_expect_message +g_test_assert_expected_messages + +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 +GTestFixtureFunc +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_assert_expected_messages_internal + +g_test_config_vars + +g_test_add_vtable +GTestConfig +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_STRING_ARRAY +G_VARIANT_TYPE_OBJECT_PATH_ARRAY +G_VARIANT_TYPE_BYTESTRING +G_VARIANT_TYPE_BYTESTRING_ARRAY +G_VARIANT_TYPE_VARDICT + + +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_is_floating +g_variant_take_ref +g_variant_get_type +g_variant_get_type_string +g_variant_is_of_type +g_variant_is_container +g_variant_compare + + +g_variant_classify +GVariantClass + + +g_variant_check_format_string +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_new_objv +g_variant_new_bytestring +g_variant_new_bytestring_array + + +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_get_objv +g_variant_dup_objv +g_variant_get_bytestring +g_variant_dup_bytestring +g_variant_get_bytestring_array +g_variant_dup_bytestring_array + + +g_variant_new_maybe +g_variant_new_array +g_variant_new_tuple +g_variant_new_dict_entry +g_variant_new_fixed_array + + +g_variant_get_maybe +g_variant_n_children +g_variant_get_child_value +g_variant_get_child +g_variant_lookup_value +g_variant_lookup +g_variant_get_fixed_array + + +g_variant_get_size +g_variant_get_data +g_variant_get_data_as_bytes +g_variant_store +g_variant_new_from_data +g_variant_new_from_bytes +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_add_parsed +g_variant_builder_end +g_variant_builder_open +g_variant_builder_close + + +GVariantParseError +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.xml b/docs/reference/glib/gtester-report.xml new file mode 100644 index 0000000..3196ce8 --- /dev/null +++ b/docs/reference/glib/gtester-report.xml @@ -0,0 +1,68 @@ + + + +gtester-report +GLib + + +Developer +Tim +Janik + + + + + +gtester-report +1 +User Commands + + + +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.xml b/docs/reference/glib/gtester.xml new file mode 100644 index 0000000..b1c126b --- /dev/null +++ b/docs/reference/glib/gtester.xml @@ -0,0 +1,189 @@ + + + +gtester +GLib + + +Developer +Tim +Janik + + +Developer +Sven +Herzberg + + + + + +gtester +1 +User Commands + + + +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 one of: + + + + + + run performance tests + + + + + , + + run slow tests, or repeat non-deterministic tests more often + + + + + + + do not run slow or performance tests, or do extra repeats + of non-deterministic tests (default) + + + + + + + run test cases that deliberately provoke checks or assertion + failures, if implemented (default) + + + + + + + do not run test cases that deliberately provoke checks or + assertion failures + + + + + + + + + + +only run test cases matching TESTPATH + + + + + + +skip 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-text.xml b/docs/reference/glib/gvariant-text.xml new file mode 100644 index 0000000..da80d17 --- /dev/null +++ b/docs/reference/glib/gvariant-text.xml @@ -0,0 +1,619 @@ + + + + + GVariant Text Format + + + GVariant Text Format + textual representation of GVariants + + + + GVariant Text Format + + + This page attempts to document the GVariant text format as produced by + g_variant_print() and parsed by the + g_variant_parse() family of functions. In most + cases the style closely resembles the formatting of literals in Python but there are some additions and + exceptions. + + + + The functions that deal with GVariant text format absolutely always deal in utf-8. Conceptually, GVariant + text format is a string of Unicode characters -- not bytes. Non-ASCII but otherwise printable Unicode + characters are not treated any differently from normal ASCII characters. + + + + The parser makes two passes. The purpose of the first pass is to determine the type of the value being + parsed. The second pass does the actual parsing. Based on the fact that all elements in an array have to + have the same type, GVariant is able to make some deductions that would not otherwise be possible. As an + example: + + [[1, 2, 3], [4, 5, 6]] + + is parsed as an array of arrays of integers (type 'aai'), but + + [[1, 2, 3], [4, 5, 6.0]] + + is parsed as a array of arrays of doubles (type 'aad'). + + + + As another example, GVariant is able to determine that + + ["hello", nothing] + + is an array of maybe strings (type 'ams'). + + + + What the parser accepts as valid input is dependent on context. The API permits for out-of-band type + information to be supplied to the parser (which will change its behaviour). This can be seen in the + GSettings and GDBus command line utilities where the type information is available from the schema or the + remote introspection information. The additional information can cause parses to succeed when they would not + otherwise have been able to (by resolving ambiguous type information) or can cause them to fail (due to + conflicting type information). Unless stated otherwise, the examples given in this section assume that no + out-of-band type data has been given to the parser. + + + + + Syntax Summary + + + The following table describes the rough meaning of symbols that may appear inside GVariant text format. + Each symbol is described in detail in its own section, including usage examples. + + + + + + + + + + + + Symbol + + + + + Meaning + + + + + + + + true, + false + + + + + Booleans. + + + + + + + + "", + '' + + + + + String literal. See Strings below. + + + + + + + + numbers + + + + + See Numbers below. + + + + + + + + () + + + + + Tuples. + + + + + + + + [] + + + + + Arrays. + + + + + + + + {} + + + + + Dictionaries and Dictionary Entries. + + + + + + + + <> + + + + + Variants. + + + + + + + + just, + nothing + + + + + Maybe Types. + + + + + + + + @ + + + + + Type Annotations. + + + + + + + + type keywords + + + + + boolean, + byte, + int16, + uint16, + int32, + uint32, + handle, + int64, + uint64, + double, + string, + objectpath, + signature + + + See Type Annotations below. + + + + + + + + b"", + b'' + + + + + Bytestrings. + + + + + + + + % + + + + + Positional Parameters. + + + + + + + + + Booleans + + The strings true and false are parsed as booleans. This is the only + way to specify a boolean value. + + + + + Strings + + Strings literals must be quoted using "" or ''. The two are + completely equivalent (except for the fact that each one is unable to contain itself unescaped). + + + Strings are Unicode strings with no particular encoding. For example, to specify the character + é, you just write 'é'. You could also give the Unicode codepoint of + that character (U+E9) as the escape sequence '\u00e9'. Since the strings are pure + Unicode, you should not attempt to encode the utf-8 byte sequence corresponding to the string using escapes; + it won't work and you'll end up with the individual characters corresponding to each byte. + + + Unicode escapes of the form \uxxxx and \Uxxxxxxxx are supported, in + hexidecimal. The usual control sequence escapes \a, \b, + \f, \n, \r, \t and + \v are supported. Additionally, a \ before a newline character causes + the newline to be ignored. Finally, any other character following \ is copied literally + (for example, \" or \\) but for forwards compatibility with future + additions you should only use this feature when necessary for escaping backslashes or quotes. + + + The usual octal and hexidecimal escapes \0nnn and \xnn are not + supported here. Those escapes are used to encode byte values and GVariant strings are Unicode. + + + Single-character strings are not interpreted as bytes. Bytes must be specified by their numerical value. + + + + + Numbers + + Numbers are given by default as decimal values. Octal and hex values can be given in the usual way (by + prefixing with 0 or 0x). Note that GVariant considers bytes to be + unsigned integers and will print them as a two digit hexidecimal number by default. + + + Floating point numbers can also be given in the usual ways, including scientific and hexidecimal notations. + + + For lack of additional information, integers will be parsed as int32 values by default. If the number has a + point or an 'e' in it, then it will be parsed as a double precision floating point number by default. If + type information is available (either explicitly or inferred) then that type will be used instead. + + + Some examples: + + + 5 parses as the int32 value five. + + + 37.5 parses as a floating point value. + + + 3.75e1 parses the same as the value above. + + + uint64 7 parses seven as a uint64. + See Type Annotations. + + + + + Tuples + + Tuples are formed using the same syntax as Python. Here are some examples: + + + () parses as the empty tuple. + + + (5,) is a tuple containing a single value. + + + ("hello", 42) is a pair. Note that values of different types are permitted. + + + + + Arrays + + Arrays are formed using the same syntax as Python uses for lists (which is arguably the term that GVariant + should have used). Note that, unlike Python lists, GVariant arrays are statically typed. This has two + implications. + + + First, all items in the array must have the same type. Second, the type of the array must be known, even in + the case that it is empty. This means that (unless there is some other way to infer it) type information + will need to be given explicitly for empty arrays. + + + The parser is able to infer some types based on the fact that all items in an array must have the same type. + See the examples below: + + + [1] parses (without additional type information) as a one-item array of signed integers. + + + [1, 2, 3] parses (similarly) as a three-item array. + + + [1, 2, 3.0] parses as an array of doubles. This is the most simple case of the type + inferencing in action. + + + [(1, 2), (3, 4.0)] causes the 2 to also be parsed as a double (but the 1 and 4 are still + integers). + + + ["", nothing] parses as an array of maybe strings. The presence of + "nothing" clearly implies that the array elements are nullable. + + + [[], [""]] will parse properly because the type of the first (empty) array can be + inferred to be equal to the type of the second array (both are arrays of strings). + + + [b'hello', []] looks odd but will parse properly. + See Bytestrings + + + And some examples of errors: + + + ["hello", 42] fails to parse due to conflicting types. + + + [] will fail to parse without additional type information. + + + + + Dictionaries and Dictionary Entries + + Dictionaries and dictionary entries are both specified using the {} characters. + + + The dictionary syntax is more commonly used. This is what the printer elects to use in the normal case of + dictionary entries appearing in an array (aka "a dictionary"). The separate syntax for dictionary entries + is typically only used for when the entries appear on their own, outside of an array (which is valid but + unusual). Of course, you are free to use the dictionary entry syntax within arrays but there is no good + reason to do so (and the printer itself will never do so). Note that, as with arrays, the type of empty + dictionaries must be established (either explicitly or through inference). + + + The dictionary syntax is the same as Python's syntax for dictionaries. Some examples: + + + @a{sv} {} parses as the empty dictionary of everyone's favourite type. + + + @a{sv} [] is the same as above (owing to the fact that dictionaries are really arrays). + + + {1: "one", 2: "two", 3: "three"} parses as a dictionary mapping integers to strings. + + + The dictionary entry syntax looks just like a pair (2-tuple) that uses braces instead of parens. The + presence of a comma immediately following the key differentiates it from the dictionary syntax (which + features a colon after the first key). Some examples: + + + {1, "one"} is a free-standing dictionary entry that can be parsed on its own or as part + of another container value. + + + [{1, "one"}, {2, "two"}, {3, "three"}] is exactly equivalent to the dictionary example + given above. + + + + + Variants + + Variants are denoted using angle brackets (aka "XML brackets"), <>. They may not + be omitted. + + + Using <> effectively disrupts the type inferencing that occurs between array + elements. This can have positive and negative effects. + + + [<"hello">, <42>] will parse whereas ["hello", 42] would + not. + + + [<['']>, <[]>] will fail to parse even though [[''], []] + parses successfully. You would need to specify [<['']>, <@as []>]. + + + {"title": <"frobit">, "enabled": <true>, width: <800>} is an example of + perhaps the most pervasive use of both dictionaries and variants. + + + + + Maybe Types + + The syntax for specifying maybe types is inspired by Haskell. + + + The null case is specified using the keyword nothing and the non-null case is explicitly + specified using the keyword just. GVariant allows just to be omitted + in every case that it is able to unambiguously determine the intention of the writer. There are two cases + where it must be specified: + + + + when using nested maybes, in order to specify the just nothing case + + + + to establish the nullability of the type of a value without explicitly specifying its full type + + + + + Some examples: + + + just 'hello' parses as a non-null nullable string. + + + @ms 'hello' is the same (demonstrating how just can be dropped if the type is already + known). + + + nothing will not parse wtihout extra type information. + + + @ms nothing parses as a null nullable string. + + + [just 3, nothing] is an array of nullable integers + + + [3, nothing] is the same as the above (demonstrating another place were + just can be dropped). + + + [3, just nothing] parses as an array of maybe maybe integers (type + 'ammi'). + + + + + Type Annotations + + Type annotations allow additional type information to be given to the parser. Depending on the context, + this type information can change the output of the parser, cause an error when parsing would otherwise have + succeeded or resolve an error when parsing would have otherwise failed. + + + Type annotations come in two forms: type codes and type keywords. + + + Type keywords can be seen as more verbose (and more legible) versions of a common subset of the type codes. + The type keywords boolean, byte, int16, + uint16, int32, uint32, handle, + int64, uint64, double, string, + objectpath and literal signature are each exactly equivalent to their + corresponding type code. + + + Type codes are an @ ("at" sign) followed by a definite GVariant type string. Some + examples: + + + uint32 5 causes the number to be parsed unsigned instead of signed (the default). + + + @u 5 is the same + + + objectpath "/org/gnome/xyz" creates an object path instead of a normal string + + + @au [] specifies the type of the empty array (which would not parse otherwise) + + + @ms "" indicates that a string value is meant to have a maybe type + + + + + Bytestrings + + The bytestring syntax is a piece of syntactic sugar meant to complement the bytestring APIs in GVariant. It + constructs arrays of non-nul bytes (type 'ay') with a nul terminator at the end. + + + Bytestrings are specified with either b"" or b''. As with strings, + there is no fundamental difference between the two different types of quotes. + + + Bytestrings support the full range of escapes that you would expect (ie: those supported by + g_strcompress(). This includes the normal control + sequence escapes (as mentioned in the section on strings) as well as octal and hexidecimal escapes of the + forms \0nnn and \xnn. + + + b'abc' is equivalent to [byte 0x97, 0x98, 0x99, 0]. + + + When formatting arrays of bytes, the printer will choose to display the array as a bytestring if it contains + a nul character at the end and no other nul bytes within. Otherwise, it is formatted as a normal array. + + + + + Positional Parameters + + Positional parameters are not a part of the normal GVariant text format, but they are mentioned here because + they can be used with g_variant_new_parsed(). + + + A positional parameter is indicated with a % followed by any valid + GVariant Format String. Variable arguments are collected as + specified by the format string and the resulting value is inserted at the current position. + + + This feature is best explained by example: + + , 'enabled': <%b>}", t, en);]]> + + This constructs a dictionary mapping strings to variants (type 'a{sv}') with two items in + it. The key names are parsed from the string and the values for those keys are taken as variable arguments + parameters. + + + The arguments are always collected in the order that they appear in the string to be parsed. Format strings + that collect multiple arguments are permitted, so you may require more varargs parameters than the number of + % signs that appear. You can also give format strings that collect no arguments, but + there's no good reason to do so. + + + + diff --git a/docs/reference/glib/gvariant-varargs.xml b/docs/reference/glib/gvariant-varargs.xml new file mode 100644 index 0000000..3f34d53 --- /dev/null +++ b/docs/reference/glib/gvariant-varargs.xml @@ -0,0 +1,1137 @@ + + + + + GVariant Format Strings + + + GVariant Format Strings + varargs conversion of GVariants + + + + 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', + '^a&s', '^ao', '^a&o','^ay', + '^&ay', '^aay' or '^a&ay'. + + + + + 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 + *); if it is a floating reference, ownership will be taken, as + if by using g_variant_ref_sink(). + 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_free(). + 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 'a', '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. + + + Note that the "special exception" introduced in the array section for constructing empty arrays is ignored + here. Using a NULL pointer with the format string 'mas' constructs + the Nothing value -- not an empty array. + + + 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 supports conversion to and from bytestrings or to and from arrays + of strings or bytestrings. It has a number of forms. + + + + In all forms, when used with g_variant_new() one + pointer value is collected from the variable arguments and passed to a function (as given in the table below). + The result of that function is used as the value for this position. When used with + g_variant_get() one pointer value is produced by using + the function (given in the table) and returned by reference. + + + + + + + + + + + + + Conversion + + + + + + Used with g_variant_new() + + + + + + + Used with g_variant_get() + + + + + + + + + + ^as + + + + + + equivalent to g_variant_new_strv() + + + + + equivalent to g_variant_dup_strv() + + + + + + + + + ^a&s + + + + + + equivalent to g_variant_get_strv() + + + + + + + + + ^ao + + + + + + equivalent to g_variant_new_objv() + + + + + equivalent to g_variant_dup_objv() + + + + + + + + + ^a&o + + + + + + equivalent to g_variant_get_objv() + + + + + + + + + ^ay + + + + + + equivalent to g_variant_new_bytestring() + + + + + equivalent to g_variant_dup_bytestring() + + + + + + + + + ^&ay + + + + + + equivalent to g_variant_get_bytestring() + + + + + + + + + ^aay + + + + + + equivalent to g_variant_new_bytestring_array() + + + + + equivalent to g_variant_dup_bytestring_array() + + + + + + + + + ^a&ay + + + + + + equivalent to g_variant_get_bytestring_array() + + + + + + + + + + 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/programming.xml b/docs/reference/glib/programming.xml new file mode 100644 index 0000000..87860c9 --- /dev/null +++ b/docs/reference/glib/programming.xml @@ -0,0 +1,67 @@ + + + + +Writing GLib Applications +3 +GLib Library + + + +Writing GLib Applications + +General considerations when programming with GLib + + + + +Writing GLib Applications + + +Threads + + +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 is creating a worker thread for its own purposes, so GLib applications +will always have at least 2 threads. + + + +See the sections on threads and +threadpools for GLib APIs that +support multithreaded applications. + + + + + +Security + + +When writing code that runs with elevated privileges, it is important +to follow some basic rules of secure programming. David Wheeler has an +excellent book on this topic, +Secure Programming for Linux and Unix HOWTO. + + + +When it comes to GLib and its associated libraries, GLib and +GObject are generally fine to use in code that runs with elevated +privileges; they don't load modules (executable code in shared objects) +or run other programs 'behind your back'. GIO has to be used +carefully in privileged programs, see the GIO documentation for details. + + + + + + + diff --git a/docs/reference/glib/regex-syntax.xml b/docs/reference/glib/regex-syntax.xml new file mode 100644 index 0000000..bd95249 --- /dev/null +++ b/docs/reference/glib/regex-syntax.xml @@ -0,0 +1,2531 @@ + + + + + Regular expression syntax + + + + + + +Regular expression syntax + +syntax and semantics of 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. + + + +Note that the C compiler interprets backslash in strings itself, therefore +you need to duplicate all \ characters when you put a regular expression +in a C string, like "\\d{3}". + + + +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 can be found in the documentation for +the #GUnicodeScript enumeration. Script names for use with \p{} can be +found by replacing all spaces with underscores, e.g. for Linear B use +\p{Linear_B}. + + + +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 + + + +In addition to the two-letter category codes listed in the +documentation for the #GUnicodeType enumeration, the following +general category property codes are supported: + + + +Property codes + + + + + Code + Meaning + + + + + C + Other + + + L + Letter + + + M + Mark + + + N + Number + + + P + Punctuation + + + S + Symbol + + + Z + 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_match_info_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.xml b/docs/reference/glib/resources.xml new file mode 100644 index 0000000..186bbf7 --- /dev/null +++ b/docs/reference/glib/resources.xml @@ -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.xml b/docs/reference/glib/running.xml new file mode 100644 index 0000000..bef37b3 --- /dev/null +++ b/docs/reference/glib/running.xml @@ -0,0 +1,380 @@ + + + + +Running GLib Applications +3 +GLib Library + + + +Running GLib Applications + +How to run and debug your GLib application + + + + +Running and debugging GLib Applications + + +Environment variables + + + The runtime behaviour of GLib applications can be influenced by a + number of environment variables. + + + + Standard variables + + + GLib reads standard environment variables like LANG, + PATH, HOME, TMPDIR, + TZ and LOGNAME. + + + + + XDG directories + + + GLib consults the environment variables XDG_DATA_HOME, + XDG_DATA_DIRS, XDG_CONFIG_HOME, + XDG_CONFIG_DIRS, XDG_CACHE_HOME and + XDG_RUNTIME_DIR for the various XDG directories. + For more information, see the XDG basedir spec. + + + + + <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. + The possible values are + error, + warning, + critical, + message, + info and + debug. + You can also use the special values + all and + help. + + + This environment variable only affects the default log handler, + g_log_default_handler(). + + + + + <envar>G_MESSAGES_DEBUG</envar> + + + A space-separated list of log domains for which informational + and debug messages should be printed. By default, these + messages are not printed. + + + You can also use the special value all. + + + This environment variable only affects the default log handler, + g_log_default_handler(). + + + + + <envar>G_DEBUG</envar> + + + This environment 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(). + + + + fatal-criticals + Causes GLib to abort the program at the first call + to g_critical(). + + + + 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 Boehm GC alike + algorithms to produce more accurate results. + + + + 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. + + + + bind-now-modules + All modules loaded by GModule will bind their symbols + at load time, even when the code uses %G_MODULE_BIND_LAZY. + + + + 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 Boehm 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, although + debug-blocks is usually 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 newer, better ones. You should + only set this variable if you have sequences of numbers that were + 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. + + + + + <envar>TZDIR</envar> + + + Allows to specify a nonstandard location for the timezone data files + that are used by the #GDateTime API. The default location is under + /usr/share/zoneinfo. For more information, + also look at the tzset manual page. + + + + + + +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. + + + + + +SystemTap + + +SystemTap is a dynamic whole-system +analysis toolkit. GLib ships with a file glib.stp which defines a +set of probe points, which you can hook into with custom SystemTap scripts. +See the files glib.stp and gobject.stp which +are in your shared SystemTap scripts directory. + + + + + +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/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..dd89464 --- /dev/null +++ b/docs/reference/gobject/Makefile.am @@ -0,0 +1,104 @@ +## 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.xml + +# The directory containing the source code. Relative to $(srcdir) +DOC_SOURCE_DIR=$(top_srcdir)/gobject + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS=--deprecated-guards="G_DISABLE_DEPRECATED" \ + --ignore-decorators="G_GNUC_INTERNAL|G_GNUC_WARN_UNUSED_RESULT" + +# 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 = \ + tests \ + gobject_trace.h \ + gtype-private.h \ + gatomicarray.h + + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +AM_CPPFLAGS = \ + -I$(srcdir) \ + $(gobject_INCLUDES) \ + $(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 = \ + 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 = + +if ENABLE_MAN + +man_MANS += \ + glib-mkenums.1 \ + glib-genmarshal.1 \ + gobject-query.1 + + +XSLTPROC_FLAGS = \ + --nonet \ + --stringparam man.output.quietly 1 \ + --stringparam funcsynopsis.style ansi \ + --stringparam man.th.extra1.suppress 1 \ + --stringparam man.authors.section.enabled 0 \ + --stringparam man.copyright.section.enabled 0 + +.xml.1: + $(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +endif + +CLEANFILES ?= +CLEANFILES += $(man_MANS) + +EXTRA_DIST += $(man_MANS) + +dist-hook-local: all-local + +gobject-docs-clean: clean + cd $(srcdir) && rm -rf xml html diff --git a/docs/reference/gobject/glib-genmarshal.xml b/docs/reference/gobject/glib-genmarshal.xml new file mode 100644 index 0000000..1d8e146 --- /dev/null +++ b/docs/reference/gobject/glib-genmarshal.xml @@ -0,0 +1,382 @@ + + + + glib-genmarshal + GObject + + + Developer + Tim + Janik + + + + + +glib-genmarshal +1 +User Commands + + + +glib-genmarshal +C code marshaller generation utility for GLib closures + + + + +glib-genmarshal +OPTION +FILE + + + +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. + + +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. + + +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*) + + + + +VARIANT + +for GVariant types (GVariant*) + + + + +NONE + +deprecated alias for VOID + + + + +BOOL + +deprecated alias for BOOLEAN + + + + + + + +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. + + + + + + +Mark generated functions as internal, using G_GNUC_INTERNAL. + + + + + + +Generate valist marshallers, for use with g_signal_set_va_marshaller(). + + + + +, + +Print version information. + + + + + + +Make warnings fatal, that is, exit immediately once a warning occurs. + + + + +, + +Print brief help and exit. + + + + +, + +Print version and exit. + + + + + + +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 file has to look like this: + + +VOID:VOID +VOID:INT +FLOAT:BOOLEAN,UCHAR + + +and you call glib-genmarshal like this: + + +glib-genmarshal --header marshaller.list > marshaller.h +glib-genmarshal --body marshaller.list > marshaller.c + + +The generated marshallers have the arguments encoded in their function name. +For this particular list, they are + + +g_cclosure_user_marshal_VOID__VOID(), +g_cclosure_user_marshal_VOID__INT(), +g_cclosure_user_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_user_marshal_VOID__VOID); +cc_bar = g_cclosure_new (NULL, bar, NULL); +g_closure_set_marshal (cc_bar, g_cclosure_user_marshal_VOID__INT); +cc_baz = g_cclosure_new (NULL, baz, NULL); +g_closure_set_marshal (cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR); + + +See also + + +glib-mkenums +1 + + + + diff --git a/docs/reference/gobject/glib-mkenums.xml b/docs/reference/gobject/glib-mkenums.xml new file mode 100644 index 0000000..d22c37a --- /dev/null +++ b/docs/reference/gobject/glib-mkenums.xml @@ -0,0 +1,329 @@ + + + + gdbus + GObject + + + Developer + Owen + Taylor + + + + + +glib-mkenums +1 +User Commands + + + +glib-mkenums +C language enum description generation utility + + + + +glib-mkenums +OPTION +FILE + + + +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. + + +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. + + +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). + + + + +@valuenum@ + +The integer value for the enum value currently being processed. This is +calculated by using perl to attempt to evaluate the +expression as it appears in the C source code. If evaluation fails then +glib-mkenums will exit with an error status, but this +only happens if @valuenum@ appears in your value +production template. (Since: 2.26) + + + + +@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 "underscore_name" +option can be used to specify the word separation used in the *_get_type() +function. For instance, /*< underscore_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; + + + + + +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. + + + + + PREFIX + +Indicates what portion of the enum name should be intepreted as the +prefix (eg, the "Gtk" in +"GtkDirectionType"). Normally this will be figured +out automatically, but you may need to override the default if your +namespace is capitalized oddly. + + + + + PREFIX + +Indicates what prefix should be used to correspond to the identifier +prefix in related C function names (eg, the "gtk" +in "gtk_direction_type_get_type". Equivalently, +this is the lowercase version of the prefix component of the enum +value names (eg, the "GTK" in +"GTK_DIR_UP". The default value is the identifier +prefix, converted to lowercase. + + + + + + +Print brief help and exit. + + + + + + +Print version and exit. + + + + + + +See also + + +glib-genmarshal +1 + + + + diff --git a/docs/reference/gobject/gobject-docs.xml b/docs/reference/gobject/gobject-docs.xml new file mode 100644 index 0000000..f0a15bf --- /dev/null +++ b/docs/reference/gobject/gobject-docs.xml @@ -0,0 +1,174 @@ + + + +]> + + + 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 + + + + Index of new symbols in 2.26 + + + + Index of new symbols in 2.28 + + + + Index of new symbols in 2.30 + + + + Index of new symbols in 2.32 + + + + Index of new symbols in 2.34 + + + + Index of new symbols in 2.36 + + + + + + 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.xml b/docs/reference/gobject/gobject-query.xml new file mode 100644 index 0000000..437d714 --- /dev/null +++ b/docs/reference/gobject/gobject-query.xml @@ -0,0 +1,123 @@ + + + + gobject-query + GObject + + + Developer + Tim + Janik + + + + + +gobject-query +1 +User Commands + + + +gobject-query +display a tree of types + + + + +gobject-query +froots +OPTION + + +gobject-query +tree +OPTION + + + +Description + +gobject-query is a small utility that draws a tree of +types. + + + +gobject-query takes a mandatory argument that specifies +whether it should iterate over the fundamental types or print a type tree. + + + +Commands + + + + +iterate over fundamental roots + + + + + +print type tree + + + + + +Options + + + + 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..a85699b --- /dev/null +++ b/docs/reference/gobject/gobject-sections.txt @@ -0,0 +1,949 @@ +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_CLASS_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_type_ensure +g_type_get_type_registration_serial + +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_DEFINE_BOXED_TYPE +G_DEFINE_BOXED_TYPE_WITH_CODE +G_DEFINE_POINTER_TYPE +G_DEFINE_POINTER_TYPE_WITH_CODE + + +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_VARIANT + + +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 +
+ +
+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_install_properties +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 +g_clear_object +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_notify_by_pspec +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_dup_data +g_object_replace_data +g_object_get_qdata +g_object_set_qdata +g_object_set_qdata_full +g_object_steal_qdata +g_object_dup_qdata +g_object_replace_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 + + +GWeakRef +g_weak_ref_init +g_weak_ref_clear +g_weak_ref_get +g_weak_ref_set + + +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_MATCH_INFO +G_TYPE_ARRAY +G_TYPE_BYTE_ARRAY +G_TYPE_PTR_ARRAY +G_TYPE_BYTES +G_TYPE_VARIANT_TYPE +G_TYPE_ERROR +G_TYPE_DATE_TIME +G_TYPE_TIME_ZONE +G_TYPE_IO_CHANNEL +G_TYPE_IO_CONDITION +G_TYPE_VARIANT_BUILDER +G_TYPE_KEY_FILE +G_TYPE_MAIN_CONTEXT +G_TYPE_MAIN_LOOP +G_TYPE_MARKUP_PARSE_CONTEXT +G_TYPE_SOURCE +G_TYPE_POLLFD +G_TYPE_THREAD +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_match_info_get_type +g_array_get_type +g_byte_array_get_type +g_ptr_array_get_type +g_error_get_type +g_date_time_get_type +g_time_zone_get_type +g_variant_get_gtype +g_variant_type_get_gtype +g_variant_builder_get_type +g_gtype_get_type +g_main_context_get_type +g_main_loop_get_type +g_source_get_type +g_pollfd_get_type +g_bytes_get_type +g_key_file_get_type +
+ +
+Generic values +generic_values +G_VALUE_INIT +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_value_get_schar +g_value_set_schar + + +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_IS_PARAM_SPEC_VARIANT +G_PARAM_SPEC_VARIANT +G_VALUE_HOLDS_VARIANT +G_TYPE_PARAM_VARIANT +GParamSpecVariant +g_param_spec_variant +g_value_get_variant +g_value_dup_variant +g_value_set_variant +g_value_take_variant + + +g_value_set_instance +g_param_spec_types +
+ +
+Varargs Value Collection +value_collection +glib-object.h,gobject/gvaluecollector.h +GTypeCValue +G_VALUE_COLLECT_INIT +G_VALUE_COLLECT +G_VALUE_COLLECT_SKIP +G_VALUE_LCOPY +G_VALUE_COLLECT_FORMAT_MAX_LENGTH +
+ +
+Signals +signals +GSignalInvocationHint +GSignalAccumulator +GSignalCMarshaller +GSignalCVaMarshaller +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_set_va_marshaller +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_handlers_disconnect_by_data +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_first_wins +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 +GVaClosureMarshal +GClosureNotify +g_cclosure_new +g_cclosure_new_swap +g_cclosure_new_object +g_cclosure_new_object_swap +g_cclosure_marshal_generic +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_source_set_dummy_callback + + +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__VARIANT +g_cclosure_marshal_STRING__OBJECT_POINTER +g_cclosure_marshal_VOID__UINT_POINTER +g_cclosure_marshal_BOOLEAN__FLAGS +g_cclosure_marshal_BOOL__FLAGS +g_cclosure_marshal_BOOLEAN__BOXED_BOXED +g_cclosure_marshal_BOOL__BOXED_BOXED + + +g_cclosure_marshal_generic_va +g_cclosure_marshal_VOID__VOIDv +g_cclosure_marshal_VOID__BOOLEANv +g_cclosure_marshal_VOID__CHARv +g_cclosure_marshal_VOID__UCHARv +g_cclosure_marshal_VOID__INTv +g_cclosure_marshal_VOID__UINTv +g_cclosure_marshal_VOID__LONGv +g_cclosure_marshal_VOID__ULONGv +g_cclosure_marshal_VOID__ENUMv +g_cclosure_marshal_VOID__FLAGSv +g_cclosure_marshal_VOID__FLOATv +g_cclosure_marshal_VOID__DOUBLEv +g_cclosure_marshal_VOID__STRINGv +g_cclosure_marshal_VOID__PARAMv +g_cclosure_marshal_VOID__BOXEDv +g_cclosure_marshal_VOID__POINTERv +g_cclosure_marshal_VOID__OBJECTv +g_cclosure_marshal_VOID__VARIANTv +g_cclosure_marshal_STRING__OBJECT_POINTERv +g_cclosure_marshal_VOID__UINT_POINTERv +g_cclosure_marshal_BOOLEAN__FLAGSv +g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv + + +GClosureNotifyData +g_closure_get_type +g_io_channel_get_type +g_io_condition_get_type +
+ +
+gbinding +GBinding +GBindingFlags +g_binding_get_source +g_binding_get_source_property +g_binding_get_target +g_binding_get_target_property +g_binding_get_flags + +g_object_bind_property +GBindingTransformFunc +g_object_bind_property_full +g_object_bind_property_with_closures + +G_TYPE_BINDING +G_TYPE_BINDING_FLAGS +G_BINDING +G_IS_BINDING + +g_binding_flags_get_type +g_binding_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..bb4e7b8 --- /dev/null +++ b/docs/reference/gobject/gobject.types @@ -0,0 +1,7 @@ +#include +#include "gobject.cI" + +g_binding_get_type +g_object_get_type +g_type_module_get_type +g_type_plugin_get_type 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/.gitignore b/docs/reference/gobject/tmpl/.gitignore new file mode 100644 index 0000000..4e6ee08 --- /dev/null +++ b/docs/reference/gobject/tmpl/.gitignore @@ -0,0 +1,15 @@ +enumerations_flags.sgml +gboxed.sgml +gbinding.sgml +gclosure.sgml +generic_values.sgml +gparamspec.sgml +gobject-unused.sgml +gtype.sgml +gtypemodule.sgml +gtypeplugin.sgml +objects.sgml +param_value_types.sgml +signals.sgml +value_arrays.sgml +value_collection.sgml diff --git a/docs/reference/gobject/tut_gobject.xml b/docs/reference/gobject/tut_gobject.xml new file mode 100644 index 0000000..c3b8ed1 --- /dev/null +++ b/docs/reference/gobject/tut_gobject.xml @@ -0,0 +1,749 @@ + + + + The GObject base class + + + The previous chapter discussed the details of GLib's Dynamic Type 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 */ + obj = G_OBJECT_CLASS (maman_bar_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). 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_run_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_run_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_properties + (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, + + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +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); + + gobject_class->set_property = maman_bar_set_property; + gobject_class->get_property = maman_bar_get_property; + + obj_properties[PROP_NAME] = + 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); + + obj_properties[PROP_NUMBER] = + 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_properties (gobject_class, + N_PROPERTIES, + obj_properties); +} + +/************************************************/ +/* Use */ +/************************************************/ + +GObject *bar; +GValue val = G_VALUE_INIT; + +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 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 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..2d520af --- /dev/null +++ b/docs/reference/gobject/tut_gsignal.xml @@ -0,0 +1,524 @@ + + + + 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, + 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..c4ac673 --- /dev/null +++ b/docs/reference/gobject/tut_gtype.xml @@ -0,0 +1,1008 @@ + + + + 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, 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 = G_VALUE_INIT; + GValue b_value = G_VALUE_INIT; + 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 = G_VALUE_INIT; + GValue obj_valb = G_VALUE_INIT; + 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) { + const GTypeInfo info = { + /* You fill this structure. */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "MamanBarType", + &info, 0); + } + return type; +} + + + + + If you have no special requirements you can use the + G_DEFINE_TYPE + macro to define a class: + +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) { + 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. The first part of the + class structure (ie: the embedded parent class structure) is initialized by copying the contents from + the class structure of the parent class. The rest of class structure is initialized to zero. If there + is no parent, the entire class structure is initialized to zero. The type system 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 (GClassFinalizeFunc) 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_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; + + 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) { + const GTypeInfo info = { + sizeof (MamanBazClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (MamanBaz), + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + 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_TYPE_IBAZ, + &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; +}; + + + + + If you have no special requirements you can use the + G_IMPLEMENT_INTERFACE macro + to implement an interface: + +static void +maman_baz_do_action (MamanIbaz *self) +{ + g_print ("Baz implementation of Ibaz interface Action.\n"); +} + +static void +maman_ibaz_interface_init (MamanIbazInterface *iface) +{ + iface->do_action = maman_baz_do_action; +} + +G_DEFINE_TYPE_WITH_CODE (MamanBaz, maman_baz, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ, + maman_ibaz_interface_init)); + + + + + Interface Initialization + + + When an instantiable classed type which implements an interface + (either directly or by inheriting an implementation from a superclass) + 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. + + + + The interface's base_init function is called, + and then the interface's default_init is invoked. + Finally if the type has registered an implementation of the interface, + the implementation's interface_init + function is invoked. 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 recommended to use a default_init function to + initialize an interface. This function is called only once for the interface no + matter how many implementations there are. The + default_init function is declared by + G_DEFINE_INTERFACE + which can be used to define the interface: + +G_DEFINE_INTERFACE (MamanIbaz, maman_ibaz, G_TYPE_OBJECT); + +static void +maman_ibaz_default_init (MamanIbazInterface *iface) +{ + /* add properties and signals here, will only called once */ +} + + + + + Or you can do that yourself in a GType function for your interface: + +GType +maman_ibaz_get_type (void) +{ + static volatile gsize type_id = 0; + if (g_once_init_enter (&type_id)) { + const GTypeInfo info = { + sizeof (MamanIbazInterface), + NULL, /* base_init */ + NULL, /* base_finalize */ + maman_ibaz_default_init, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + GType type = g_type_register_static (G_TYPE_INTERFACE, + "MamanIbaz", + &info, 0); + g_once_init_leave (&type_id, type); + } + return type_id; +} + +static void +maman_ibaz_default_init (MamanIbazInterface *iface) +{ + /* add properties and signals here, will only called once */ +} + + + + + 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: + + + + + Interface Initialization + + + + + + + + Invocation time + Function Invoked + Function's parameters + Remark + + + + + First call to g_type_create_instance + for any type implementing interface + + interface's base_init function + On interface's vtable + Rarely necessary to use this. Called once per instantiated classed type implementing the interface. + + + First call to g_type_create_instance + for each type implementing interface + + interface's default_init function + On interface's vtable + Register interface's signals, properties, etc. here. Will be called once. + + + First call to g_type_create_instance + for any type implementing interface + + implementation's interface_init function + On interface's vtable + + Initialize interface implementation. Called for each class that that + implements the interface. Initialize the interface method pointers + in the interface structure to the implementing class'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..744552b --- /dev/null +++ b/docs/reference/gobject/tut_howto.xml @@ -0,0 +1,1844 @@ + + + + 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+) + + Some people like the first two solutions better: it makes reading file + names easier for those with poor eyesight. + + + + 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. + +enum { + PROP_0, + + PROP_MAMAN, + + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +bar_class_init (MamanBarClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = bar_set_property; + gobject_class->get_property = bar_get_property; + + obj_properties[PROP_MAMAN] = + 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_properties (gobject_class, + N_PROPERTIES, + obj_properties); +} + + 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 an interface + + + 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. This interface + defines two methods: + +#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); + void (*do_something) (MamanIbaz *self); +}; + +GType maman_ibaz_get_type (void); + +void maman_ibaz_do_action (MamanIbaz *self); +void maman_ibaz_do_something (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: + + G_DEFINE_INTERFACE + creates a maman_ibaz_get_type function which registers the + type in the type system. The third argument is used to define a + prerequisite interface + (which we'll talk about more later). Just pass 0 for this + argument when an interface has no prerequisite. + + maman_ibaz_default_init is expected + to register the interface's signals if there are any (we will see a bit + later how to use them). + The interface methods maman_ibaz_do_action + and maman_ibaz_do_something dereference the interface + structure to access its associated interface function and call it. + + + +G_DEFINE_INTERFACE (MamanIbaz, maman_ibaz, 0); + +static void +maman_ibaz_default_init (gpointer g_class) +{ + /* add properties and signals to the interface here */ +} + +void +maman_ibaz_do_action (MamanIbaz *self) +{ + g_return_if_fail (MAMAN_IS_IBAZ (self)); + + MAMAN_IBAZ_GET_INTERFACE (self)->do_action (self); +} + +void +maman_ibaz_do_something (MamanIbaz *self) +{ + g_return_if_fail (MAMAN_IS_IBAZ (self)); + + MAMAN_IBAZ_GET_INTERFACE (self)->do_something (self); +} + + + + + + How to 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 derive 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_baz_do_something (MamanBaz *self) +{ + g_print ("Baz implementation of Ibaz interface Something: 0x%x.\n", + self->instance_member); +} + +static void +maman_ibaz_interface_init (MamanIbazInterface *iface) +{ + iface->do_action = maman_baz_do_action; + iface->do_something = maman_baz_do_something; +} + +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 types 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: + +/* Make the MamanIbar interface require MamanIbaz interface. */ +G_DEFINE_INTERFACE (MamanIbar, maman_ibar, MAMAN_TYPE_IBAZ); + + In the G_DEFINE_INTERFACE + call above, the third parameter defines the prerequisite type. This + is the GType of either an interface or a class. In this case + the MamanIbaz interface is a prerequisite of the MamanIbar. 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_do_something (MamanIbaz *ibaz) +{ + MamanBar *self = MAMAN_BAR (ibaz); + + g_print ("Bar implementation of Ibaz interface Something: 0x%x.\n", + self->instance_member); +} + +static void +maman_ibaz_interface_init (MamanIbazInterface *iface) +{ + iface->do_action = maman_ibaz_do_action; + iface->do_something = maman_ibaz_do_something; +} + +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 + + + 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_default_init as shown below: + +static void +maman_ibaz_default_init (gpointer g_iface) +{ + g_object_interface_install_property (g_iface, + g_param_spec_string ("name", + "Name", + "Name of the MamanIbaz", + "maman", + G_PARAM_READWRITE)); +} + + + + + 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 declares and defines it's properties in the usual + way as explained in , except for one + small change: it can 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"); +} + + + + + + + + Overriding interface methods + + + If a base class already implements an interface, and in a derived + class you wish to implement the same interface overriding only certain + methods of that interface, you just reimplement the interface and + set only the interface methods you wish to override. + + + + In this example MamanDerivedBaz is derived from MamanBaz. Both + implement the MamanIbaz interface. MamanDerivedBaz only implements one + method of the MamanIbaz interface and uses the base class implementation + of the other. + +static void +maman_derived_ibaz_do_action (MamanIbaz *ibaz) +{ + MamanDerivedBaz *self = MAMAN_DERIVED_BAZ (ibaz); + g_print ("DerivedBaz implementation of Ibaz interface Action\n"); +} + +static void +maman_derived_ibaz_interface_init (MamanIbazInterface *iface) +{ + /* Override the implementation of do_action */ + iface->do_action = maman_derived_ibaz_do_action; + + /* + * We simply leave iface->do_something alone, it is already set to the + * base class implementation. + */ +} + +G_DEFINE_TYPE_WITH_CODE (MamanDerivedBaz, maman_derived_baz, MAMAN_TYPE_BAZ, + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ, + maman_derived_ibaz_interface_init) + +static void +maman_derived_baz_class_init (MamanDerivedBazClass *klass) +{ + +} + +static void +maman_derived_baz_init (MamanDerivedBaz *self) +{ + +} + + + + + To access the base class interface implementation use + g_type_interface_peek_parent + from within an interface's default_init function. + + + + If you wish to call the base class implementation of an interface + method from an derived class where than interface method has been + overridden then you can stash away the pointer returned from + g_type_interface_peek_parent + in a global variable. + + + + In this example MamanDerivedBaz overides the + do_action interface method. In it's overridden method + it calls the base class implementation of the same interface method. + +static MamanIbazInterface *maman_ibaz_parent_interface = NULL; + +static void +maman_derived_ibaz_do_action (MamanIbaz *ibaz) +{ + MamanDerivedBaz *self = MAMAN_DERIVED_BAZ (ibaz); + g_print ("DerivedBaz implementation of Ibaz interface Action\n"); + + /* Now we call the base implementation */ + maman_ibaz_parent_interface->do_action (ibaz); +} + +static void +maman_derived_ibaz_interface_init (MamanIbazInterface *iface) +{ + maman_ibaz_parent_interface = g_type_interface_peek_parent (iface); + iface->do_action = maman_derived_ibaz_do_action; +} + +G_DEFINE_TYPE_WITH_CODE (MamanDerivedBaz, maman_derived_baz, MAMAN_TYPE_BAZ, + G_IMPLEMENT_INTERFACE (MAMAN_TYPE_IBAZ, + maman_derived_ibaz_interface_init) + +static void +maman_derived_baz_class_init (MamanDerivedBazClass *klass) +{ + +} + +static void +maman_derived_baz_init (MamanDerivedBaz *self) +{ + +} + + + + + + + + + + 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..8cfcef7 --- /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..c8be945 --- /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.pc.in b/gio-2.0.pc.in new file mode 100644 index 0000000..9f7123f --- /dev/null +++ b/gio-2.0.pc.in @@ -0,0 +1,18 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +giomoduledir=@GIO_MODULE_DIR@ +glib_compile_schemas=glib-compile-schemas +glib_compile_resources=glib-compile-resources +gdbus_codegen=gdbus-codegen + +Name: GIO +Description: glib I/O library +Version: @VERSION@ +Requires: glib-2.0 gobject-2.0 +Requires.private: gmodule-no-export-2.0 +Libs: -L${libdir} -lgio-2.0 +Libs.private: @ZLIB_LIBS@ @NETWORK_LIBS@ +Cflags: diff --git a/gio-unix-2.0.pc.in b/gio-unix-2.0.pc.in new file mode 100644 index 0000000..fba58e2 --- /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,gio-2.0 +Libs: -L${libdir} -lgio-2.0 +Cflags: -I${includedir}/gio-unix-2.0/ diff --git a/gio-windows-2.0.pc.in b/gio-windows-2.0.pc.in new file mode 100644 index 0000000..77eecdf --- /dev/null +++ b/gio-windows-2.0.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: GIO Windows specific APIs +Description: Windows 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-win32-2.0/ diff --git a/gio/.gitignore b/gio/.gitignore new file mode 100644 index 0000000..be25b26 --- /dev/null +++ b/gio/.gitignore @@ -0,0 +1,16 @@ +gconstructor_as_data.h +gdbus +gdbus-example-objectmanager-generated-org.gtk.GDBus.Example.ObjectManager.Animal.xml +gdbus-example-objectmanager-generated-org.gtk.GDBus.Example.ObjectManager.Cat.xml +gdbus-example-objectmanager-generated.[ch] +gdbus-daemon-generated.[ch] +gio-marshal.[ch] +gio-public-headers.txt +gio-querymodules +gioenumtypes.[ch] +glib-compile-resources +glib-compile-schemas +gnetworking.h +gresource +gschema-compile +gsettings 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..06c71b9 --- /dev/null +++ b/gio/Makefile.am @@ -0,0 +1,784 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +SUBDIRS = gdbus-2.0/codegen + +if OS_UNIX +SUBDIRS += 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) + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gmodule_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_COMPILATION \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" + +lib_LTLIBRARIES = libgio-2.0.la + +gdbus_headers = \ + gdbusauthobserver.h \ + gcredentials.h \ + gdbusutils.h \ + gdbuserror.h \ + gdbusaddress.h \ + gdbusconnection.h \ + gdbusmessage.h \ + gdbusnameowning.h \ + gdbusnamewatching.h \ + gdbusproxy.h \ + gdbusintrospection.h \ + gdbusmethodinvocation.h \ + gdbusserver.h \ + gdbusinterface.h \ + gdbusinterfaceskeleton.h \ + gdbusobject.h \ + gdbusobjectskeleton.h \ + gdbusobjectproxy.h \ + gdbusobjectmanager.h \ + gdbusobjectmanagerclient.h \ + gdbusobjectmanagerserver.h \ + gtestdbus.h \ + $(NULL) + +gdbus_sources = \ + gdbusutils.h gdbusutils.c \ + gdbusaddress.h gdbusaddress.c \ + gdbusauthobserver.h gdbusauthobserver.c \ + gdbusauth.h gdbusauth.c \ + gdbusauthmechanism.h gdbusauthmechanism.c \ + gdbusauthmechanismanon.h gdbusauthmechanismanon.c \ + gdbusauthmechanismexternal.h gdbusauthmechanismexternal.c \ + gdbusauthmechanismsha1.h gdbusauthmechanismsha1.c \ + gdbuserror.h gdbuserror.c \ + gdbusconnection.h gdbusconnection.c \ + gdbusmessage.h gdbusmessage.c \ + gdbusnameowning.h gdbusnameowning.c \ + gdbusnamewatching.h gdbusnamewatching.c \ + gdbusproxy.h gdbusproxy.c \ + gdbusprivate.h gdbusprivate.c \ + gdbusintrospection.h gdbusintrospection.c \ + gdbusmethodinvocation.h gdbusmethodinvocation.c \ + gdbusserver.h gdbusserver.c \ + gdbusinterface.h gdbusinterface.c \ + gdbusinterfaceskeleton.h gdbusinterfaceskeleton.c \ + gdbusobject.h gdbusobject.c \ + gdbusobjectskeleton.h gdbusobjectskeleton.c \ + gdbusobjectproxy.h gdbusobjectproxy.c \ + gdbusobjectmanager.h gdbusobjectmanager.c \ + gdbusobjectmanagerclient.h gdbusobjectmanagerclient.c \ + gdbusobjectmanagerserver.h gdbusobjectmanagerserver.c \ + gtestdbus.h gtestdbus.c \ + $(NULL) + +# These are not built into the library yet +EXTRA_DIST += gdbusdaemon.c gdbusdaemon.h dbus-daemon.xml + +gdbus-daemon-generated.h gdbus-daemon-generated.c: $(srcdir)/dbus-daemon.xml $(srcdir)/gdbus-2.0/codegen/gdbus-codegen.in + $(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \ + UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \ + $(PYTHON) $(srcdir)/gdbus-2.0/codegen/gdbus-codegen.in \ + --interface-prefix org. \ + --generate-c-code gdbus-daemon-generated \ + --c-namespace _G \ + $(srcdir)/dbus-daemon.xml \ + $(NULL) + +settings_headers = \ + gsettingsbackend.h \ + gsettingsschema.h \ + gsettings.h + +settings_sources = \ + gvdb/gvdb-format.h \ + gvdb/gvdb-reader.h \ + gvdb/gvdb-reader.c \ + gdelayedsettingsbackend.h \ + gdelayedsettingsbackend.c \ + gkeyfilesettingsbackend.c \ + gmemorysettingsbackend.c \ + gnullsettingsbackend.c \ + gsettingsbackendinternal.h \ + gsettingsbackend.c \ + gsettingsschema.h \ + gsettingsschema-internal.h \ + gsettingsschema.c \ + gsettings-mapping.h \ + gsettings-mapping.c \ + gsettings.c + +if OS_WIN32 +settings_sources += \ + gregistrysettingsbackend.h \ + gregistrysettingsbackend.c +endif + +if OS_COCOA +settings_sources += \ + gnextstepsettingsbackend.c +endif + +application_headers = \ + gapplication.h \ + gapplicationcommandline.h \ + \ + gactiongroup.h \ + gactionmap.h \ + gsimpleactiongroup.h \ + gremoteactiongroup.h \ + gactiongroupexporter.h \ + gdbusactiongroup.h \ + gaction.h \ + gsimpleaction.h \ + \ + gmenumodel.h \ + gmenu.h \ + gmenuexporter.h \ + gdbusmenumodel.h \ + $(NULL) + +application_sources = \ + gapplication.c \ + gapplicationcommandline.c \ + gapplicationimpl-dbus.c \ + gapplicationimpl.h \ + \ + gactiongroup.c \ + gactionmap.c \ + gsimpleactiongroup.c \ + gremoteactiongroup.c \ + gactiongroupexporter.c \ + gdbusactiongroup-private.h \ + gdbusactiongroup.c \ + gaction.c \ + gsimpleaction.c \ + \ + gmenumodel.c \ + gmenu.c \ + gmenuexporter.c \ + gdbusmenumodel.c \ + $(NULL) + +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 \ + gsocks4proxy.c \ + gsocks4proxy.h \ + gsocks4aproxy.c \ + gsocks4aproxy.h \ + gsocks5proxy.c \ + gsocks5proxy.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_KQUEUE +SUBDIRS += kqueue +platform_libadd += kqueue/libkqueue.la +platform_deps += kqueue/libkqueue.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 +platform_libadd += xdgmime/libxdgmime.la $(RESOLVER_LIBADD) +platform_deps += xdgmime/libxdgmime.la +unix_sources = \ + gfiledescriptorbased.c \ + gunixconnection.c \ + gunixcredentialsmessage.c \ + gunixfdlist.c \ + gunixfdmessage.c \ + gunixmount.c \ + gunixmount.h \ + gunixmounts.c \ + gunixsocketaddress.c \ + gunixvolume.c \ + gunixvolume.h \ + gunixvolumemonitor.c \ + gunixvolumemonitor.h \ + gunixinputstream.c \ + gunixoutputstream.c \ + gcontenttype.c \ + gcontenttypeprivate.h \ + $(NULL) + + +giounixincludedir=$(includedir)/gio-unix-2.0/gio +giounixinclude_HEADERS = \ + gdesktopappinfo.h \ + gfiledescriptorbased.h \ + gunixconnection.h \ + gunixcredentialsmessage.h \ + gunixmounts.h \ + gunixfdlist.h \ + gunixfdmessage.h \ + gunixinputstream.h \ + gunixoutputstream.h \ + gunixsocketaddress.h \ + $(NULL) + +if HAVE_NETLINK +unix_sources += \ + gnetworkmonitornetlink.c \ + gnetworkmonitornetlink.h \ + $(NULL) +endif +endif + +gdbus_daemon_sources = \ + gdbusdaemon.c \ + gdbusdaemon.h \ + gdbus-daemon-generated.c \ + gdbus-daemon-generated.h \ + $(NULL) + +win32_actual_sources = \ + $(gdbus_daemon_sources) \ + gcontenttype-win32.c \ + gwin32mount.c \ + gwin32mount.h \ + gwin32volumemonitor.c \ + gwin32volumemonitor.h \ + gwin32inputstream.c \ + gwin32outputstream.c \ + gwin32outputstream.h \ + $(NULL) + +win32_more_sources_for_vcproj = \ + gwin32appinfo.c \ + gregistrysettingsbackend.c \ + win32/gwin32directorymonitor.c \ + win32/gwinhttpfile.c \ + win32/gwinhttpfileinputstream.c \ + win32/gwinhttpfileoutputstream.c \ + win32/gwinhttpvfs.c + +if OS_WIN32 +appinfo_sources += gwin32appinfo.c gwin32appinfo.h +platform_libadd += -lshlwapi -lws2_32 -ldnsapi +win32_sources = $(win32_actual_sources) + +giowin32includedir=$(includedir)/gio-win32-2.0/gio +giowin32include_HEADERS = \ + gwin32inputstream.h \ + gwin32outputstream.h \ + $(NULL) + +endif + +if BUILD_MODULAR_TESTS +SUBDIRS += tests +endif + +libgio_2_0_la_SOURCES = \ + gappinfo.c \ + gasynchelper.c \ + gasynchelper.h \ + gasyncinitable.c \ + gasyncresult.c \ + gbufferedinputstream.c \ + gbufferedoutputstream.c \ + gcancellable.c \ + gcharsetconverter.c \ + gconverter.c \ + gconverterinputstream.c \ + gconverteroutputstream.c \ + gcredentials.c \ + gdatainputstream.c \ + gdataoutputstream.c \ + gdrive.c \ + gdummyfile.h \ + gdummyfile.c \ + gdummyproxyresolver.c \ + gdummyproxyresolver.h \ + gdummytlsbackend.c \ + gdummytlsbackend.h \ + gemblem.h \ + gemblem.c \ + gemblemedicon.h \ + gemblemedicon.c \ + gfile.c \ + gfileattribute.c \ + gfileattribute-priv.h \ + 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 \ + ginetaddressmask.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 \ + gnetworking.c \ + gnetworkingprivate.h \ + gnetworkmonitor.c \ + gnetworkmonitorbase.c \ + gnetworkmonitorbase.h \ + gnetworkservice.c \ + goutputstream.c \ + gpermission.c \ + gpollableinputstream.c \ + gpollableoutputstream.c \ + gpollableutils.c \ + gpollfilemonitor.c \ + gpollfilemonitor.h \ + gproxy.c \ + gproxyaddress.c \ + gproxyaddressenumerator.c \ + gproxyresolver.c \ + gresolver.c \ + gresource.c \ + gresourcefile.c \ + gresourcefile.h \ + gseekable.c \ + gsimpleasyncresult.c \ + gsimplepermission.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 \ + gsimpleproxyresolver.c \ + gtask.c \ + gtcpconnection.c \ + gtcpwrapperconnection.c \ + gthreadedsocketservice.c\ + gthemedicon.c \ + gthreadedresolver.c \ + gthreadedresolver.h \ + gtlsbackend.c \ + gtlscertificate.c \ + gtlsclientconnection.c \ + gtlsconnection.c \ + gtlsdatabase.c \ + gtlsfiledatabase.c \ + gtlsinteraction.c \ + gtlspassword.c \ + gtlsserverconnection.c \ + gunionvolumemonitor.c \ + gunionvolumemonitor.h \ + gvfs.c \ + gvolume.c \ + gvolumemonitor.c \ + gzlibcompressor.c \ + gzlibdecompressor.c \ + gmountprivate.h \ + gioenumtypes.h \ + gioenumtypes.c \ + $(appinfo_sources) \ + $(unix_sources) \ + $(win32_sources) \ + $(application_sources) \ + $(settings_sources) \ + $(gdbus_sources) \ + $(local_sources) \ + $(NULL) + +EXTRA_DIST += strinfo.c + +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) \ + $(NETWORK_LIBS) \ + $(NULL) + +libgio_2_0_la_CPPFLAGS = $(ZLIB_CFLAGS) $(AM_CPPFLAGS) + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +gio_win32_res = gio-win32-res.o +gio_win32_res_ldflag = -Wl,$(gio_win32_res) +endif + +install-data-local: install-ms-lib + $(mkinstalldirs) $(DESTDIR)$(GIO_MODULE_DIR) + +uninstall-local: uninstall-ms-lib + +libgio_2_0_la_CFLAGS = $(AM_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +libgio_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \ + $(gio_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +if OS_COCOA +# This is dumb. The ObjC source file should be properly named .m +libgio_2_0_la_CFLAGS += -xobjective-c +libgio_2_0_la_LDFLAGS += -Wl,-framework,Foundation +endif + +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 \ + ginetaddressmask.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 \ + gnetworking.h \ + gnetworkmonitor.h \ + gnetworkservice.h \ + goutputstream.h \ + gpermission.h \ + gpollableinputstream.h \ + gpollableoutputstream.h \ + gpollableutils.h \ + gproxyaddress.h \ + gproxy.h \ + gproxyaddressenumerator.h \ + gproxyresolver.h \ + gresolver.h \ + gresource.h \ + gseekable.h \ + gsimpleasyncresult.h \ + gsimplepermission.h \ + gsocket.h \ + gsocketaddress.h \ + gsocketaddressenumerator.h \ + gsocketclient.h \ + gsocketconnectable.h \ + gsocketconnection.h \ + gsocketcontrolmessage.h \ + gsocketlistener.h \ + gsocketservice.h \ + gsrvtarget.h \ + gsimpleproxyresolver.h \ + gtask.h \ + gtcpconnection.h \ + gtcpwrapperconnection.h \ + gthreadedsocketservice.h\ + gthemedicon.h \ + gtlsbackend.h \ + gtlscertificate.h \ + gtlsclientconnection.h \ + gtlsconnection.h \ + gtlsdatabase.h \ + gtlsfiledatabase.h \ + gtlsinteraction.h \ + gtlspassword.h \ + gtlsserverconnection.h \ + gvfs.h \ + gvolume.h \ + gvolumemonitor.h \ + gzlibcompressor.h \ + gzlibdecompressor.h \ + $(application_headers) \ + $(settings_headers) \ + $(gdbus_headers) \ + $(NULL) + +gioincludedir=$(includedir)/glib-2.0/gio/ +gioinclude_HEADERS = \ + $(gio_headers) \ + gioenumtypes.h + +# these sources (also mentioned above) are generated. +BUILT_SOURCES = \ + gconstructor_as_data.h \ + gioenumtypes.h \ + gioenumtypes.c \ + gdbus-daemon-generated.c \ + gdbus-daemon-generated.h \ + gnetworking.h \ + $(NULL) + +EXTRA_DIST += \ + data-to-c.pl \ + gioenumtypes.h.template \ + gioenumtypes.c.template \ + makefile.msc \ + gio.rc.in \ + gschema.dtd \ + gconstructor_as_data.h \ + gnetworking.h.win32 \ + $(NULL) + +BUILT_EXTRA_DIST = \ + gio.rc + +# This is read by gobject-introspection/misc/ and gtk-doc +gio-public-headers.txt: Makefile + $(AM_V_GEN) echo $(gioinclude_HEADERS) $(giowin32include_HEADERS) $(giounixinclude_HEADERS) > $@.tmp && mv $@.tmp $@ + +CLEANFILES = gdbus-daemon-generated.c gdbus-daemon-generated.h gio-public-headers.txt gconstructor_as_data.h + + +DISTCLEANFILES = \ + gioenumtypes.h \ + gioenumtypes.c + +all-local: gio-public-headers.txt + +gioenumtypes.h: $(gio_headers) gioenumtypes.h.template + $(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out %.template,$^) > \ + gioenumtypes.h.tmp && mv gioenumtypes.h.tmp gioenumtypes.h + +gioenumtypes.c: $(gio_headers) gioenumtypes.c.template + $(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out %.template,$^) > \ + 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:$(builddir)/gio.def -out:$@ + +bin_PROGRAMS = gio-querymodules glib-compile-schemas glib-compile-resources gsettings + +glib_compile_resources_LDADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + libgio-2.0.la + +glib_compile_resources_SOURCES = \ + gvdb/gvdb-format.h \ + gvdb/gvdb-builder.h \ + gvdb/gvdb-builder.c \ + glib-compile-resources.c + +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) + +gconstructor_as_data.h: $(top_srcdir)/glib/gconstructor.h data-to-c.pl + $(AM_V_GEN) $(srcdir)/data-to-c.pl $(top_srcdir)/glib/gconstructor.h gconstructor_code > $@.tmp && mv $@.tmp $@ + +glib_compile_schemas_LDADD = $(top_builddir)/glib/libglib-2.0.la +glib_compile_schemas_SOURCES = \ + gconstructor_as_data.h \ + gvdb/gvdb-format.h \ + gvdb/gvdb-builder.h \ + gvdb/gvdb-builder.c \ + glib-compile-schemas.c + +gsettings_LDADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + libgio-2.0.la +gsettings_SOURCES = gsettings-tool.c + +schemadir = $(datadir)/glib-2.0/schemas +dist_schema_DATA = gschema.dtd + +# ------------------------------------------------------------------------ +# gdbus(1) tool + +bin_PROGRAMS += gdbus +gdbus_SOURCES = gdbus-tool.c +gdbus_LDADD = libgio-2.0.la \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la + +completiondir = $(datadir)/bash-completion/completions +completion_DATA = \ + completion/gdbus \ + completion/gsettings \ + completion/gresource +EXTRA_DIST += $(completion_DATA) + +# ------------------------------------------------------------------------ +# gresource tool + +bin_PROGRAMS += gresource +gresource_SOURCES = gresource-tool.c +gresource_CPPFLAGS = $(LIBELF_CFLAGS) $(AM_CPPFLAGS) +gresource_LDADD = libgio-2.0.la \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(LIBELF_LIBS) + +# ------------------------------------------------------------------------ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gio.vcproj ../build/win32/vs10/gio.vcxproj ../build/win32/vs10/gio.vcxproj.filters + 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 `echo $(libgio_2_0_la_SOURCES) $(win32_actual_sources) $(win32_more_sources_for_vcproj) | tr '/' '\\'`; do \ + case $$F in \ + gunix*.c|gdesktopappinfo.c|gnetworkmonitornetlink.c|gcontenttype.c) ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done | sort -u >libgio.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/gio.vcprojin >$@ + rm libgio.sourcefiles + +../build/win32/vs10/gio.vcxproj: $(top_srcdir)/build/win32/vs10/gio.vcxprojin + for F in `echo $(libgio_2_0_la_SOURCES) $(win32_actual_sources) $(win32_more_sources_for_vcproj) | tr '/' '\\'`; do \ + case $$F in \ + gunix*.c|gdesktopappinfo.c|gnetworkmonitornetlink.c|gcontenttype.c) ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done | sort -u >libgio.vs10.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/gio.vcxprojin >$@ + rm libgio.vs10.sourcefiles + +../build/win32/vs10/gio.vcxproj.filters: $(top_srcdir)/build/win32/vs10/gio.vcxproj.filtersin + for F in `echo $(libgio_2_0_la_SOURCES) $(win32_actual_sources) $(win32_more_sources_for_vcproj) | tr '/' '\\'`; do \ + case $$F in \ + gunix*.c|gdesktopappinfo.c|gnetworkmonitornetlink.c|gcontenttype.c) ;; \ + *.c) echo ' Source Files' \ + ;; \ + esac; \ + done | sort -u >libgio.vs10.sourcefiles.filters + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/gio.vcxproj.filtersin >$@ + rm libgio.vs10.sourcefiles.filters + +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/completion/gdbus b/gio/completion/gdbus new file mode 100644 index 0000000..79f4cb4 --- /dev/null +++ b/gio/completion/gdbus @@ -0,0 +1,33 @@ + +# Check for bash +[ -z "$BASH_VERSION" ] && return + +#################################################################################################### + + +__gdbus() { + local IFS=$'\n' + local cur=`_get_cword :` + + local suggestions=$(gdbus complete "${COMP_LINE}" ${COMP_POINT}) + COMPREPLY=($(compgen -W "$suggestions" -- "$cur")) + + # Remove colon-word prefix from COMPREPLY items + case "$cur" in + *:*) + case "$COMP_WORDBREAKS" in + *:*) + local colon_word=${cur%${cur##*:}} + local i=${#COMPREPLY[*]} + while [ $((--i)) -ge 0 ]; do + COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"} + done + ;; + esac + ;; + esac +} + +#################################################################################################### + +complete -o nospace -F __gdbus gdbus diff --git a/gio/completion/gresource b/gio/completion/gresource new file mode 100644 index 0000000..ef1145d --- /dev/null +++ b/gio/completion/gresource @@ -0,0 +1,58 @@ + +# Check for bash +[ -z "$BASH_VERSION" ] && return + +#################################################################################################### + +__gresource() { + local choices coffset section + + if [ ${COMP_CWORD} -gt 2 ]; then + if [ ${COMP_WORDS[1]} = --section ]; then + section=${COMP_WORDS[2]} + coffset=2 + else + coffset=0 + fi + else + coffset=0 + fi + + case "$((${COMP_CWORD}-$coffset))" in + 1) + choices=$'--section \nhelp \nsections \nlist \ndetails \nextract ' + ;; + + 2) + case "${COMP_WORDS[$(($coffset+1))]}" in + --section) + return 0 + ;; + + help) + choices=$'sections\nlist\ndetails\nextract' + ;; + + sections|list|details|extract) + COMPREPLY=($(compgen -f -- ${COMP_WORDS[${COMP_CWORD}]})) + return 0 + ;; + esac + ;; + + 3) + case "${COMP_WORDS[$(($coffset+1))]}" in + list|details|extract) + choices="$(gresource list ${COMP_WORDS[$(($coffset+2))]} 2> /dev/null | sed -e 's.$. .')" + ;; + esac + ;; + esac + + local IFS=$'\n' + COMPREPLY=($(compgen -W "${choices}" -- "${COMP_WORDS[${COMP_CWORD}]}")) +} + +#################################################################################################### + +complete -o nospace -F __gresource gresource diff --git a/gio/completion/gsettings b/gio/completion/gsettings new file mode 100644 index 0000000..145c6a8 --- /dev/null +++ b/gio/completion/gsettings @@ -0,0 +1,84 @@ + +# Check for bash +[ -z "$BASH_VERSION" ] && return + +#################################################################################################### + +__gsettings() { + local choices coffset schemadir + + if [ ${COMP_CWORD} -gt 2 ]; then + if [ ${COMP_WORDS[1]} = --schemadir ]; then + # this complexity is needed to perform correct tilde expansion + schemadir=$(eval "echo --schemadir ${COMP_WORDS[2]}") + coffset=2 + else + coffset=0 + fi + else + coffset=0 + fi + + case "$((${COMP_CWORD}-$coffset))" in + 1) + choices=$'--schemadir\nhelp \nlist-schemas\nlist-relocatable-schemas\nlist-keys \nlist-children \nlist-recursively \nget \nrange \nset \nreset \nreset-recursively \nwritable \nmonitor' + ;; + + 2) + case "${COMP_WORDS[$(($coffset+1))]}" in + --schemadir) + COMPREPLY=($(compgen -o dirnames -- ${COMP_WORDS[${COMP_CWORD}]})) + return 0 + ;; + + help) + choices=$'list-schemas\nlist-relocatable-schemas\nlist-keys\nlist-children\nlist-recursively\nget\nrange\nset\nreset\nreset-recursively\nwritable\nmonitor' + ;; + list-keys|list-children|list-recursively|reset-recursively) + choices="$(gsettings $schemadir list-schemas)"$'\n'"$(gsettings $schemadir list-relocatable-schemas | sed -e 's.$.:/.')" + ;; + + get|range|set|reset|writable|monitor) + choices="$(gsettings $schemadir list-schemas | sed -e 's.$. .')"$'\n'"$(gsettings $schemadir list-relocatable-schemas | sed -e 's.$.:/.')" + ;; + esac + ;; + + 3) + case "${COMP_WORDS[$(($coffset+1))]}" in + set) + choices="$(gsettings $schemadir list-keys ${COMP_WORDS[$(($coffset+2))]} 2> /dev/null | sed -e 's.$. .')" + ;; + + get|range|reset|writable|monitor) + choices="$(gsettings $schemadir list-keys ${COMP_WORDS[$(($coffset+2))]} 2> /dev/null)" + ;; + esac + ;; + + 4) + case "${COMP_WORDS[$(($coffset+2))]}" in + set) + range=($(gsettings $schemadir range ${COMP_WORDS[$(($coffset+2))]} ${COMP_WORDS[$(($coffset+3))]} 2> /dev/null)) + case "${range[0]}" in + enum) + unset range[0] + ;; + *) + unset range + ;; + esac + local IFS=$'\n' + choices="${range[*]}" + ;; + esac + ;; + esac + + local IFS=$'\n' + COMPREPLY=($(compgen -W "${choices}" -- "${COMP_WORDS[${COMP_CWORD}]}")) +} + +#################################################################################################### + +complete -o nospace -F __gsettings gsettings diff --git a/gio/data-to-c.pl b/gio/data-to-c.pl new file mode 100755 index 0000000..20ba2fb --- /dev/null +++ b/gio/data-to-c.pl @@ -0,0 +1,39 @@ +#!/usr/bin/perl + +# Copyright © 2011 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 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: Kalev Lember + + +if (@ARGV != 2) { + die "Usage: data-to-c.pl \n"; +} + +$file = $ARGV[0]; + +open (FILE, $file) || die "Cannot open $file: $!\n"; + +printf ("const char %s[] = \"", $ARGV[1]); +while (my $line = ) { + foreach my $c (split //, $line) { + printf ("\\x%02x", ord ($c)); + } +} +print "\";\n"; + +close (FILE); diff --git a/gio/dbus-daemon.xml b/gio/dbus-daemon.xml new file mode 100644 index 0000000..515dd34 --- /dev/null +++ b/gio/dbus-daemon.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gio/fam/Makefile.am b/gio/fam/Makefile.am new file mode 100644 index 0000000..429d7f4 --- /dev/null +++ b/gio/fam/Makefile.am @@ -0,0 +1,49 @@ +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\" \ + $(gio_INCLUDES) \ + $(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)/giomodule.cache diff --git a/gio/fam/fam-helper.c b/gio/fam/fam-helper.c new file mode 100644 index 0000000..6cc7031 --- /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 + +#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..c25da33 --- /dev/null +++ b/gio/fam/fam-module.c @@ -0,0 +1,56 @@ +/* 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 +#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, + G_NFS_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + G_NFS_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..0bc69b5 --- /dev/null +++ b/gio/fam/gfamdirectorymonitor.c @@ -0,0 +1,157 @@ +/* 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 + +#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); + g_io_extension_point_implement (G_NFS_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..8945da1 --- /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 +#include + +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..79983c7 --- /dev/null +++ b/gio/fam/gfamfilemonitor.c @@ -0,0 +1,155 @@ +/* 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 + +#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); + g_io_extension_point_implement (G_NFS_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..b1b101f --- /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 +#include + +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..0a22a64 --- /dev/null +++ b/gio/fen/Makefile.am @@ -0,0 +1,29 @@ +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-helper.c \ + fen-helper.h \ + gfenfilemonitor.c \ + gfenfilemonitor.h \ + gfendirectorymonitor.c \ + gfendirectorymonitor.h \ + $(NULL) + +libfen_la_CFLAGS = \ + $(GLIB_HIDDEN_VISIBILITY_CFLAGS) \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED diff --git a/gio/fen/fen-dump.c b/gio/fen/fen-dump.c new file mode 100644 index 0000000..7a34fa4 --- /dev/null +++ b/gio/fen/fen-dump.c @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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-dump.h" + +G_LOCK_EXTERN (fen_lock); + +/*-------------------- node ------------------*/ +static void +dump_node (node_t* node, gpointer data) +{ + g_printf ("n:0x%p ds:0x%p s:0x%p %s\n", node, node->dir_subs, node->subs, NODE_NAME(node)); +} + +static void +dump_tree (node_t* node) +{ + if (G_TRYLOCK (fen_lock)) { + node_traverse(NULL, dump_node, NULL); + G_UNLOCK (fen_lock); + } +} + +/* ------------------ fdata port hash --------------------*/ +void +dump_hash_cb (gpointer key, + gpointer value, + gpointer user_data) +{ + g_printf ("k:0x%p v:0x%p >\n", 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 (node_event_t* ev, gpointer user_data) +{ + node_t* node = ev->user_data; + g_printf ("ne:0x%p e:%p n:0x%p ds:0x%p s:0x%p s\n", ev, ev->e, node, node->dir_subs, node->subs, NODE_NAME(node)); +} diff --git a/gio/fen/fen-dump.h b/gio/fen/fen-dump.h new file mode 100644 index 0000000..ffac822 --- /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, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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..f1c51da --- /dev/null +++ b/gio/fen/fen-helper.c @@ -0,0 +1,195 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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-helper.h" +#include "fen-kernel.h" +#ifdef GIO_COMPILATION +#include +#else +#include "gam_event.h" +#include "gam_server.h" +#include "gam_protocol.h" +#endif + +#ifdef GIO_COMPILATION +#define FH_W if (FALSE) g_debug +#else +#include "gam_error.h" +#define FH_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_EXTERN (fen_lock); + +/* misc */ +static void +scan_children_init(node_t *f, gpointer sub) +{ + gboolean emit; + gint event; + + FH_W ("%s %s [0x%p]\n", __func__, NODE_NAME(f), f); + +#ifdef GIO_COMPILATION + emit = FALSE; + event = G_FILE_MONITOR_EVENT_CREATED; +#else + emit = TRUE; + event = GAMIN_EVENT_EXISTS; +#endif + + if (!NODE_HAS_FLAG(f, NODE_FLAG_SNAPSHOT_UPDATED)) { + /* TODO snapshot should also compare to the sub created timestamp. */ + /* GIO initially doesn't emit created/existed events. */ + node_create_children_snapshot(f, event, emit); + } else { + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, f->children); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + node_t *child = (node_t *)value; + +#ifdef GIO_COMPILATION + /* GIO initially doesn't emit created/existed events. */ + /* g_file_monitor_emit_event(G_FILE_MONITOR(sub), child->gfile, NULL, event); */ +#else + gam_server_emit_one_event(NODE_NAME(child), gam_subscription_is_dir(sub), event, sub, 1); +#endif + } + } +} + +/** + * fen_add + * + * Won't hold a ref, we have a timout callback to clean unused node_t. + * 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_t* f; + + g_assert (filename); + g_assert (sub); + + G_LOCK (fen_lock); + f = node_find(NULL, filename, TRUE); + FH_W ("%s 0x%p sub[0x%p] %s\n", __func__, f, sub, filename); + g_assert (f); + + /* Update timestamp, the events in global queue will compare itself to this + * timestamp to decide if be emitted. TODO, timestamp should be per sub. + */ + if (!NODE_IS_ACTIVE(f)) { + g_get_current_time(&f->atv); + } + + if (is_mondir) { + f->dir_subs = g_list_prepend(f->dir_subs, sub); + } else { + f->subs = g_list_prepend(f->subs, sub); + } + + if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED) || + (node_lstat(f) == 0 && port_add(f) == 0)) { +#ifndef GIO_COMPILATION + gam_server_emit_one_event (NODE_NAME(f), + gam_subscription_is_dir (sub), GAMIN_EVENT_EXISTS, sub, 1); +#endif + if (is_mondir) { + scan_children_init (f, sub); + } + } else { +#ifndef GIO_COMPILATION + gam_server_emit_one_event (NODE_NAME(f), + gam_subscription_is_dir (sub), GAMIN_EVENT_DELETED, sub, 1); +#endif + node_adjust_deleted (f); + } +#ifndef GIO_COMPILATION + gam_server_emit_one_event (NODE_NAME(f), + 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_t* f; + + g_assert (filename); + g_assert (sub); + + G_LOCK (fen_lock); + f = node_find(NULL, filename, FALSE); + FH_W ("%s 0x%p sub[0x%p] %s\n", __func__, f, sub, filename); + + if (f) { + if (is_mondir) { + f->dir_subs = g_list_remove(f->dir_subs, sub); + } else { + f->subs = g_list_remove(f->subs, sub); + } + + if (!NODE_IS_ACTIVE(f)) { + node_try_delete (f); + } + } + G_UNLOCK (fen_lock); +} + +/** + * fen_init: + * + * FEN subsystem initializing. + */ +gboolean +fen_init () +{ + static gboolean initialized = FALSE; + static gboolean result = FALSE; + + G_LOCK (fen_lock); + if (initialized) { + G_UNLOCK (fen_lock); + return result; + } + + result = node_class_init(); + + if (!result) { + G_UNLOCK (fen_lock); + return result; + } + + initialized = TRUE; + + G_UNLOCK (fen_lock); + return result; +} diff --git a/gio/fen/fen-helper.h b/gio/fen/fen-helper.h new file mode 100644 index 0000000..25df38f --- /dev/null +++ b/gio/fen/fen-helper.h @@ -0,0 +1,33 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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_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); + +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..8748a06 --- /dev/null +++ b/gio/fen/fen-kernel.c @@ -0,0 +1,555 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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-kernel.h" +#include "fen-dump.h" + +#ifdef GIO_COMPILATION +#define FK_W if (FALSE) g_debug +#else +#include "gam_error.h" +#define FK_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_DEFINE (fen_lock); + +static ulong max_port_events = 512; +static GList *pn_visible_list; /* the queue of ports which don't have the max objs */ +static GQueue *g_eventq = NULL; +static timespec_t zero_wait; +static void (*user_process_events_cb) (gpointer, node_event_t*); +static port_event_t *pevents = NULL; +static gint PE_ALLOC = 2048; +static GHashTable *renamed_hash = NULL; /* */ + +typedef struct _PSource { + GSource source; /* Inherit from GSource, must be the first. */ + GPollFD gfd; + gboolean pending; + uint_t event_growing_factor; + uint_t pending_events; +} PSource; + +#define PGPFD(s) (&((PSource *)(s))->gfd) +#define SLEEP_BASE_TIME 10 /* in milliseconds */ +#define EXPECT_INC_EVENTS(pn) (1 << (pn->event_growing_factor)) + +#define RENAME_EVENTS_INTERVAL 500 /* in milliseconds */ +#define PROCESS_PORT_EVENTS_TIME 1000 /* in milliseconds */ +guint process_port_event_id = 0; + +static gchar* _event_strings(int event); +static const gchar* _event_string (int event); +static GSource *psource_new(); + +static gboolean port_prepare(GSource *source, gint *timeout_); +static gboolean port_check(GSource *source); +static gboolean port_dispatch(GSource *source, GSourceFunc callback, gpointer user_data); +static GSourceFuncs fen_source_func = { + port_prepare, + port_check, + port_dispatch, + NULL +}; + +static gboolean +port_prepare(GSource *source, gint *timeout_) +{ + return FALSE; +} + +static gboolean +port_check(GSource *source) +{ + PSource *pn = (PSource *)source; + uint_t nget; + + if (pn->pending) { + pn->pending = FALSE; + g_source_add_poll(source, PGPFD(source)); + g_source_unref(source); + return FALSE; + } + + if (!(PGPFD(pn)->revents & G_IO_IN)) + return FALSE; + + if (port_getn(PGPFD(source)->fd, NULL, 0, &nget, 0) == 0) { + if (nget - pn->pending_events > EXPECT_INC_EVENTS(pn)) { + /* Sleep for a while. */ + pn->pending_events = nget; + pn->event_growing_factor ++; + + pn->pending = TRUE; + g_source_ref(source); + g_source_remove_poll(source, PGPFD(source)); + g_timeout_add(SLEEP_BASE_TIME, + (GSourceFunc)port_check, + (gpointer)pn); + return FALSE; + } + } + + pn->pending_events = 0; + pn->event_growing_factor = 0; + + return TRUE; +} + +static gboolean +port_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) +{ + node_t *f; + uint_t nget = 0; + uint_t total = 0; + + FK_W ("%s 0x%p fd %d\n", __func__, source, PGPFD(source)->fd); + + G_LOCK (fen_lock); + do { + nget = 1; + if (port_getn(PGPFD(source)->fd, pevents, PE_ALLOC, &nget, &zero_wait) == 0) { + int i; + for (i = 0; i < nget; i++) { + f = (node_t *)pevents[i].portev_user; + + if (pevents[i].portev_source == PORT_SOURCE_FILE) { + + NODE_CLE_STATE(f, NODE_STATE_ASSOCIATED); + NODE_SET_STATE(f, NODE_STATE_HAS_EVENTS); + + if (HAS_NO_EXCEPTION_EVENTS(pevents[i].portev_events)) { + /* If the events do not show it's deleted, update + * file timestamp to avoid missing events next time. + */ + if (node_lstat(f) != 0 /* || port_add(f) != 0 */) { + /* Included deleted event. */ + pevents[i].portev_events |= FILE_DELETE; + } + } + + /* Queue it and waiting for processing. */ + g_queue_push_tail(g_eventq, + node_event_new(pevents[i].portev_events, (gpointer)f)); + + } else { + FK_W ("[kernel] unknown portev_source %d\n", pevents[i].portev_source); + } + } + + total += nget; + + } else { + FK_W ("[kernel] port_getn %s\n", g_strerror (errno)); + break; + } + } while (nget == PE_ALLOC); + + G_UNLOCK (fen_lock); + + if (total > 0 && callback) { + FK_W ("[kernel] get total %ld events\n", total); + return callback (user_data); + } + return TRUE; +} + +static gboolean +process_renamed_hash_cb(gpointer key, gpointer value, gpointer user_data) +{ + node_event_t *ev = value; + +#if 0 + node_add_event(ev->user_data, ev); +#else + user_process_events_cb(ev->user_data, ev); +#endif + /* Always delete self from hash. */ + return TRUE; +} + +static gboolean +port_events_process_cb(gpointer user_data) +{ + node_event_t *ev; + + G_LOCK (fen_lock); + + /* Processing g_eventq */ + while ((ev = (node_event_t*)g_queue_pop_head (g_eventq)) != NULL) { + + /* FK_W ("[%s] 0x%p %s\n", __func__, ev, _event_string (ev->e)); */ + + { + gchar *log = _event_strings(ev->e); + FK_W ("%s %s %s\n", __func__, NODE_NAME(ev->user_data), log); + g_free(log); + } + +#ifdef GIO_COMPILATION + /* Use the parent node as a hash, because only the dir_subs in the + * parent node should receive MOVE event. + */ + if (NODE_PARENT(ev->user_data)) { + if (ev->e == FILE_RENAME_TO) { + g_hash_table_insert(renamed_hash, NODE_PARENT(ev->user_data), ev); + g_time_val_add(&ev->rename_tv, RENAME_EVENTS_INTERVAL); + continue; + } + if (ev->e == FILE_RENAME_FROM) { + node_event_t *pair_ev; + + pair_ev = g_hash_table_lookup(renamed_hash, NODE_PARENT(ev->user_data)); + if (pair_ev && node_timeval_lt(&ev->ctv, &pair_ev->rename_tv)) { + g_hash_table_remove(renamed_hash, NODE_PARENT(ev->user_data)); + pair_ev->pair_data = ev->user_data; + /* Free ev, exchange pair_ev and ev. */ + node_event_delete(ev); + ev = pair_ev; + } + } + } +#endif + +#if 0 + node_add_event(ev->user_data, ev); +#else + user_process_events_cb(ev->user_data, ev); +#endif + } + + /* Processing the events in renamed_hash. TODO we should delay it and wait + * for more possible pair. + */ + g_hash_table_foreach_remove(renamed_hash, process_renamed_hash_cb, NULL); + + G_UNLOCK (fen_lock); + + process_port_event_id = 0; + return FALSE; +} + +static gboolean +port_events_read_cb(gpointer user_data) +{ + + if (process_port_event_id == 0) { + process_port_event_id = g_timeout_add(PROCESS_PORT_EVENTS_TIME, + port_events_process_cb, + NULL); + } + + return TRUE; +} + +/* + * malloc PSource and port_create, start thread at pnode_ref. + * if psource_new succeeded, the PSource will never + * be freed. So PSource can be freed only in psource_new. + * Note pnode_monitor_remove_all can also free PSource, but currently no one + * invork it. + */ +static GSource* +psource_new() +{ + GSource *source = NULL; + int fd; + + if ((fd = port_create()) >= 0) { + source = g_source_new(&fen_source_func, sizeof(PSource)); + PGPFD(source)->fd = fd; + PGPFD(source)->events = G_IO_IN | G_IO_HUP | G_IO_ERR; + g_source_set_callback(source, port_events_read_cb, NULL, NULL); + g_source_attach(source, NULL); + g_source_unref(source); + g_source_add_poll(source, PGPFD(source)); + + FK_W ("%s 0x%p fd %d\n", __func__, source, PGPFD(source)->fd); + } else { + FK_W ("PORT_CREATE %s\n", g_strerror(errno)); + g_return_val_if_reached(NULL); + } + + return source; +} + +/* + * port_add: + * @f: + * + * Unsafe, need lock fen_lock. + * port_add will associate a GSource to @f->source + */ +gint +port_add(node_t *f) +{ + GSource *source = f->source; + + FK_W ("%s [0x%p] %s\n", __func__, f, NODE_NAME(f)); + + g_assert(f); + g_assert(NODE_HAS_FLAG(f, NODE_FLAG_STAT_UPDATED)); + + /* if (!NODE_HAS_FLAG(f, NODE_FLAG_STAT_DONE)) { */ + /* if (NODE_STAT(f) != 0) { */ + /* return errno; */ + /* } */ + /* } */ + + /* Try re-use f->pn. f->pn may be used by other request, e.g. f is deleted + * for a long time. So if pn is full, we try to open a new one. + */ + if (!source) { +start_over: + /* Try the next visible source. */ + if (pn_visible_list) { + source = (GSource *)pn_visible_list->data; + } else { + if ((source = psource_new()) != NULL) { + g_assert (g_list_find (pn_visible_list, source) == NULL); + pn_visible_list = g_list_prepend (pn_visible_list, source); + } + } + } + + if (port_associate(PGPFD(source)->fd, PORT_SOURCE_FILE, (uintptr_t)FILE_OBJECT(f), + CONCERNED_EVENTS, + (void *)f) == 0) { + f->source = source; + NODE_SET_STATE(f, NODE_STATE_ASSOCIATED); + NODE_CLE_FLAG(f, NODE_FLAG_STAT_UPDATED); + FK_W ("PORT_ASSOCIATE 0x%p OK\n", f); + return 0; + } else if (errno == EAGAIN) { + /* Full, remove it. */ + pn_visible_list = g_list_remove (pn_visible_list, source); + /* Re-add to port */ + goto start_over; + + } else if (errno == ENOENT) { + /* File is not exist */ + } else if (errno == ENOTSUP) { + /* FS is not supported. Currently we think it no longer make sense to + * monitor it, so clean the stat info and return 0 to ignore this + * node. If there are requirement, we can consider to add polling + * method. + */ + NODE_CLE_FLAG(f, NODE_FLAG_STAT_UPDATED); + return 0; + } else { + FK_W ("PORT_ASSOCIATE 0x%p %s\n", f, g_strerror (errno)); + } + + /* No matter if associated successfully, stat info is out-of-date, so clean it. */ + NODE_CLE_FLAG(f, NODE_FLAG_STAT_UPDATED); + return errno; +} + +/* + * port_remove + * + * < private > + * Unsafe, need lock fen_lock. + */ +void +port_remove (node_t *f) +{ + /* g_assert(f->source); */ + + if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED)) { + /* Mark unregisted. */ + if (port_dissociate(PGPFD(f->source)->fd, PORT_SOURCE_FILE, (uintptr_t)FILE_OBJECT(f)) == 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. + */ + NODE_CLE_STATE(f, NODE_STATE_ASSOCIATED); + FK_W ("PORT_DISSOCIATE 0x%p OK\n", f); + } else if (errno == ENOENT) { + /* The file has been removed from port, after port_get or before + * port_get but DELETED event has been generated. + * Ignored. */ + } else { + FK_W ("PORT_DISSOCIATE 0x%p %s\n", f, g_strerror (errno)); + g_return_if_reached(); + } + } +} + +/* + * Get Solaris resouce values. + * + */ + +extern gboolean +port_class_init (void (*user_process_events_callback) (gpointer, node_event_t*)) +{ + rctlblk_t *rblk; + + 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 ("max_port_events = %u\n", max_port_events); + free (rblk); + } + renamed_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, NULL); + if (renamed_hash == NULL) { + FK_W ("[kernel] FEN global renamed queue initializing faild\n"); + return FALSE; + } + if ((g_eventq = g_queue_new ()) == NULL) { + FK_W ("[kernel] FEN global event queue initializing faild\n"); + return FALSE; + } + if (user_process_events_callback == NULL) { + FK_W ("[kernel] FEN global no user_process_events_callback\n"); + return FALSE; + } + user_process_events_cb = user_process_events_callback; + memset (&zero_wait, 0, sizeof (timespec_t)); + + pevents = g_malloc(PE_ALLOC * sizeof(port_event_t)); + if (pevents == NULL) { + FK_W ("[kernel] FEN global alloc pevents failed\n"); + return FALSE; + } + + return TRUE; +} + +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 gchar * +_event_strings(int event) +{ + GString *str = g_string_sized_new(80); + + if (event & FILE_DELETE) + g_string_append(str, " FILE_DELETE"); + + if (event & FILE_RENAME_FROM) + g_string_append(str, " FILE_RENAME_FROM"); + + if (event & FILE_MODIFIED) + g_string_append(str, " FILE_MODIFIED"); + + if (event & FILE_RENAME_TO) + g_string_append(str, " FILE_RENAME_TO"); + + if (event & MOUNTEDOVER) + g_string_append(str, " MOUNTEDOVER"); + + if (event & FILE_ATTRIB) + g_string_append(str, " FILE_ATTRIB"); + + if (event & UNMOUNTED) + g_string_append(str, " UNMOUNTED"); + + if (event & FILE_ACCESS) + g_string_append(str, " FILE_ACCESS"); + + return g_string_free(str, FALSE); +} + +static 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"; + } +} diff --git a/gio/fen/fen-kernel.h b/gio/fen/fen-kernel.h new file mode 100644 index 0000000..6d2c49b --- /dev/null +++ b/gio/fen/fen-kernel.h @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 "fen-node.h" + +#ifndef _FEN_KERNEL_H_ +#define _FEN_KERNEL_H_ + +#define CONCERNED_EVENTS (FILE_MODIFIED | FILE_ATTRIB | FILE_NOFOLLOW) +#define EXCEPTION_EVENTS (FILE_DELETE | FILE_RENAME_FROM) +#define HAS_EXCEPTION_EVENTS(e) ((e & EXCEPTION_EVENTS) != 0) +#define HAS_NO_EXCEPTION_EVENTS(e) ((e & EXCEPTION_EVENTS) == 0) + +gint port_add (node_t* f); +void port_remove (node_t *f); + +gboolean port_class_init (); + +#endif /* _FEN_KERNEL_H_ */ diff --git a/gio/fen/fen-node.c b/gio/fen/fen-node.c new file mode 100644 index 0000000..0a5f1e0 --- /dev/null +++ b/gio/fen/fen-node.c @@ -0,0 +1,640 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 "fen-kernel.h" +#include "fen-node.h" +#include "fen-dump.h" + +#ifdef GIO_COMPILATION +#include +#else +#include "gam_event.h" +#include "gam_server.h" +#include "gam_protocol.h" +#endif + +#ifdef GIO_COMPILATION +#define FN_W if (FALSE) g_debug +#else +#include "gam_error.h" +#define FN_W(...) GAM_DEBUG(DEBUG_INFO, __VA_ARGS__) +#endif + +G_LOCK_EXTERN (fen_lock); + +/* Must continue monitoring if: + * 1) I'm subscribed, + * 2) The subscribed children (one of the children has subs) are missing, + * 3) my parent is subscribed (monitoring directory). + */ +#define NODE_NEED_MONITOR(f) \ + (NODE_IS_ACTIVE(f) || node_children_num(f) > 0 || NODE_IS_REQUIRED_BY_PARENT(f)) + +static int concern_events[] = { + FILE_DELETE, + FILE_RENAME_FROM, + UNMOUNTED, + MOUNTEDOVER, +#ifdef GIO_COMPILATION + FILE_MODIFIED, + FILE_ATTRIB, +#else + FILE_MODIFIED | FILE_ATTRIB, +#endif + FILE_RENAME_TO, +}; + +node_t *ROOT = NULL; + +static void node_emit_one_event(node_t *f, GList *subs, node_t *other, int event); +static void node_emit_events(node_t *f, const node_event_t *ne); +static int node_event_translate(int event, gboolean pair); +static void node_add_event (node_t *f, node_event_t *ev); +static node_t* node_new (node_t* parent, const gchar* basename); +static void node_delete (node_t* parent); +static node_t* node_get_child (node_t *f, const gchar *basename); +static void children_add (node_t *p, node_t *f); +static void children_remove (node_t *p, node_t *f); +static gboolean children_remove_cb (gpointer key, gpointer value, gpointer user_data); +static guint node_children_num (node_t *f); + +gboolean +node_timeval_lt(const GTimeVal *val1, const 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; +} + +void +node_traverse (node_t* node, void(*traverse_cb)(node_t*, gpointer), gpointer user_data) +{ + GHashTableIter iter; + gpointer value; + + g_assert(traverse_cb); + if (node == NULL) { + node = ROOT; + } + + if (node) { + traverse_cb(node, user_data); + } + + g_hash_table_iter_init (&iter, node->children); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + node_traverse((node_t *)value, traverse_cb, user_data); + } +} + +node_t* +node_find(node_t* node, const gchar* filename, gboolean create_on_missing) +{ + gchar* str; + gchar* token; + gchar* lasts; + node_t* parent; + node_t* child; + + g_assert (filename && filename[0] == '/'); + + if (node == NULL) { + node = ROOT; + } + + FN_W ("%s %s\n", __func__, filename); + + parent = child = node; + str = g_strdup (filename); + + for (token = strtok_r (str, G_DIR_SEPARATOR_S, &lasts); + token != NULL && child != NULL; + token = strtok_r (NULL, G_DIR_SEPARATOR_S, &lasts)) { + child = node_get_child(parent, token); + if (child) { + parent = child; + } else if (create_on_missing) { + child = node_new (parent, token); + if (child) { + children_add (parent, child); + parent = child; + continue; + } else { + FN_W ("%s create %s failed", __func__, token); + } + } else { + break; + } + } + + g_free (str); + return child; +} + +gint +node_lstat(node_t *f) +{ + struct stat buf; + + g_assert(!NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED)); + + if (lstat(NODE_NAME(f), &buf) == 0) { + FN_W ("%s %s\n", __func__, NODE_NAME(f)); + FILE_OBJECT(f)->fo_atime = buf.st_atim; + FILE_OBJECT(f)->fo_mtime = buf.st_mtim; + FILE_OBJECT(f)->fo_ctime = buf.st_ctim; + NODE_SET_FLAG(f, NODE_FLAG_STAT_UPDATED | + (S_ISDIR (buf.st_mode) ? NODE_FLAG_DIR : NODE_FLAG_NONE)); + return 0; + } else { + FN_W ("%s(lstat) %s %s\n", __func__, NODE_NAME(f), g_strerror (errno)); + } + return errno; +} + +void +node_create_children_snapshot(node_t *f, gint created_event, gboolean emit) +{ + GDir *dir; + GError *err = NULL; + + FN_W ("%s %s [0x%p]\n", __func__, NODE_NAME(f), f); + + dir = g_dir_open (NODE_NAME(f), 0, &err); + if (dir) { + const char *basename; + node_t *child = NULL; + + while ((basename = g_dir_read_name (dir))) { + node_t* data; + GList *idx; + + child = node_get_child (f, basename); + if (child == NULL) { + gchar *filename; + + child = node_new (f, basename); + children_add (f, child); + } + + if (f->dir_subs) { + /* We need monitor the new children, or the existed child which + * is in the DELETED mode. + */ + if (!NODE_HAS_STATE(child, NODE_STATE_ASSOCIATED) && + node_lstat(child) == 0 && port_add(child) == 0) { + if (emit) { + /* Emit the whatever event for the new found file. */ + node_emit_one_event(child, child->dir_subs, NULL, created_event); + node_emit_one_event(child, child->subs, NULL, created_event); + node_emit_one_event(child, f->dir_subs, NULL, created_event); + node_emit_one_event(child, f->subs, NULL, created_event); + } + } + /* else ignore, because it may be deleted. */ + } + } + g_dir_close (dir); + + /* We have finished children snapshot. Any other new added subs should + * directory iterate the snapshot instead of scan directory again. + */ + NODE_SET_FLAG(f, NODE_FLAG_SNAPSHOT_UPDATED); + + } else { + FN_W (err->message); + g_error_free (err); + } +} + +/* + * If all active children nodes are ported, then cancel monitor the parent + * node. If we know how many children are created, then we can stop accordingly. + * + * Unsafe, need lock. + */ +static void +foreach_known_children_scan(gpointer key, gpointer value, gpointer user_data) +{ + node_t* f = (node_t*)value; + + FN_W ("%s 0x%p %s\n", __func__, f, NODE_NAME(f)); + + if (!NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED)) { + if (node_lstat(f) == 0 && port_add(f) == 0) { + node_emit_one_event(f, f->dir_subs, NULL, FN_EVENT_CREATED); + node_emit_one_event(f, f->subs, NULL, FN_EVENT_CREATED); + if (NODE_PARENT(f)) { + node_emit_one_event(f, NODE_PARENT(f)->dir_subs, NULL, FN_EVENT_CREATED); + node_emit_one_event(f, NODE_PARENT(f)->subs, NULL, FN_EVENT_CREATED); + } + } + } +} + +gboolean +node_try_delete(node_t* node) +{ + g_assert (node); + + FN_W ("%s 0x%p %s\n", __func__, node, NODE_NAME(node)); + + /* Try clean children */ + if (node_children_num (node) > 0) { + g_hash_table_foreach_remove(node->children, children_remove_cb, NULL); + } + if (!NODE_NEED_MONITOR(node)) { + /* Clean some flags. */ + /* NODE_CLE_FLAG(node, NODE_FLAG_HAS_SNAPSHOT | NODE_FLAG_STAT_DONE); */ + + /* Now we handle the state. */ + if (NODE_HAS_STATE(node, NODE_STATE_ASSOCIATED)) { + port_remove(node); + } + /* Actually ignore the ROOT node. */ + if (node->state == 0 && NODE_PARENT(node)) { + children_remove(NODE_PARENT(node), node); + /* Do clean instead of returning TRUE. */ + node_delete (node); + } + /* else, we have events, clean event queue? */ + } + return FALSE; +} + +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) { + NODE_NAME(f) = g_build_filename(NODE_NAME(parent), basename, NULL); + } else { + NODE_NAME(f) = g_strdup(G_DIR_SEPARATOR_S); + } + f->basename = g_strdup (basename); + /* f->children = g_hash_table_new_full (g_str_hash, g_str_equal, */ + /* NULL, (GDestroyNotify)node_delete); */ + f->children = g_hash_table_new_full (g_str_hash, g_str_equal, + NULL, NULL); +#ifdef GIO_COMPILATION + f->gfile = g_file_new_for_path (NODE_NAME(f)); +#endif + 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)); + /* Clean flags. */ + f->flag = 0; + g_assert(f->state == 0); + g_assert(!NODE_IS_ACTIVE(f)); + g_assert(g_hash_table_size (f->children) == 0); + g_assert(NODE_PARENT(f) == NULL); + g_hash_table_unref(f->children); +#ifdef GIO_COMPILATION + g_object_unref (f->gfile); +#endif + g_free(f->basename); + g_free(NODE_NAME(f)); + g_free (f); +} + +static void +children_add (node_t *p, node_t *f) +{ + FN_W ("%s %s %s\n", __func__, NODE_NAME(p), f->basename); + g_hash_table_insert (p->children, f->basename, f); + NODE_PARENT(f) = p; +} + +static void +children_remove (node_t *p, node_t *f) +{ + FN_W ("%s %s %s\n", __func__, NODE_NAME(p), f->basename); + g_hash_table_steal (p->children, f->basename); + NODE_PARENT(f) = NULL; +} + +static node_t * +node_get_child (node_t *f, const gchar *basename) +{ + if (f->children) { + return (node_t *) g_hash_table_lookup (f->children, (gpointer)basename); + } + return NULL; +} + +static guint +node_children_num (node_t *f) +{ + return g_hash_table_size (f->children); +} + +/* + * depth first delete recursively + */ +static gboolean +children_remove_cb (gpointer key, gpointer value, gpointer user_data) +{ + return node_try_delete ((node_t*)value); +} + +gboolean +node_class_init() +{ + ROOT = node_new (NULL, G_DIR_SEPARATOR_S); + if (ROOT == NULL) { + FN_W ("[node] Create ROOT node failed.\n"); + return FALSE; + } + + return port_class_init (node_add_event); +} + +/* + * Adjust self on failing to Port + */ +void +node_adjust_deleted(node_t* f) +{ + node_t *ancestor; + + FN_W ("%s %s\n", __func__, NODE_NAME(f)); + + for (ancestor = NODE_PARENT(f); + ancestor != NULL; + ancestor = NODE_PARENT(ancestor)) { + /* Stop if we find a node which been already associated or is existed + * and can be associated. + */ + if (NODE_HAS_STATE(ancestor, NODE_STATE_ASSOCIATED) || + (node_lstat(ancestor) == 0 && port_add(ancestor) == 0)) { + break; + } + } + + /* We assume we shouldn't reach here, because Root is always existed and + * associated. But given bugster#6955199, if PORT FS has problems on root, + * we may reach here. So just return ROOT and the whole GIO fen backend will + * fail. + */ + /* g_assert(ancestor != NULL); */ +} + + +static void +node_emit_events(node_t *f, const node_event_t *ne) +{ + gsize num = sizeof(concern_events)/sizeof(int); + gint i; + int translated_e; + node_t *p; + + if (node_timeval_lt(&f->atv, &ne->ctv)) { + int event = ne->e; + + /* Emit DELETED on the pair_data */ + if (ne->pair_data) { + node_t *from = ne->pair_data; + node_emit_one_event(from, from->dir_subs, NULL, node_event_translate(FILE_DELETE, FALSE)); + node_emit_one_event(from, from->subs, NULL, node_event_translate(FILE_DELETE, FALSE)); + } + + for (i = 0; i < num; i++) { + if (event & concern_events[i]) { + translated_e = node_event_translate(concern_events[i], FALSE); + /* Neither GIO or gamin cares about modified events on a + * directory. + */ +#ifdef GIO_COMPILATION + if ((concern_events[i] & FILE_MODIFIED) == 0) { + node_emit_one_event(f, f->dir_subs, NULL, translated_e); + } +#else + /* Gamin doesn't care about attrib changed events on a directory + * either. + */ + if ((concern_events[i] & (FILE_MODIFIED | FILE_ATTRIB)) == 0) { + node_emit_one_event(f, f->dir_subs, NULL, translated_e); + } +#endif + node_emit_one_event(f, f->subs, NULL, translated_e); + } + event &= ~concern_events[i]; + } + } + + p = NODE_PARENT(f); + if (p != NULL && node_timeval_lt(&p->atv, &ne->ctv)) { + int event = ne->e; + for (i = 0; i < num; i++) { + if (event & concern_events[i]) { + translated_e = node_event_translate(concern_events[i], ne->pair_data != NULL); + node_emit_one_event(f, p->dir_subs, ne->pair_data, translated_e); + node_emit_one_event(f, p->subs, ne->pair_data, translated_e); + } + event &= ~concern_events[i]; + } + } +} + +/* + * node_add_event: + * + */ +static void +node_add_event (node_t *f, node_event_t *ev) +{ + FN_W ("%s %d\n", __func__, ev->e); + + /* Clean the events flag early, because all received events need be + * processed in this function. + */ + NODE_CLE_STATE(f, NODE_STATE_HAS_EVENTS); + + /* + * 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. + */ + if (NODE_NEED_MONITOR(f)) { + if (HAS_NO_EXCEPTION_EVENTS(ev->e)) { + if (NODE_HAS_STATE(f, NODE_STATE_ASSOCIATED) || port_add(f) == 0) { + if ((ev->e & FILE_MODIFIED) && NODE_HAS_FLAG(f, NODE_FLAG_DIR)) { + if (f->dir_subs) { + node_create_children_snapshot(f, FN_EVENT_CREATED, TRUE); + } else { + g_hash_table_foreach(f->children, foreach_known_children_scan, NULL); + } + } + } else { + /* Emit delete event */ + ev->e |= FILE_DELETE; + + node_adjust_deleted(f); + } + + } else { + node_adjust_deleted(f); + } + + /* Send events to clients. */ + node_emit_events (f, ev); + + } else { + /* Send events to clients. */ + node_emit_events (f, ev); + + node_try_delete(f); + } + + if (ev->pair_data) { + node_t *from = ev->pair_data; + g_assert(ev->e == FILE_RENAME_TO); + + if (NODE_NEED_MONITOR(from)) { + /* Clean the events flag, since it may block free this node. */ + NODE_CLE_STATE(from, NODE_STATE_HAS_EVENTS); + node_adjust_deleted(from); + } else { + node_try_delete(from); + } + } + + node_event_delete (ev); +} + +static void +node_emit_one_event(node_t *f, GList *subs, node_t *other, int event) +{ + GList* idx; + + FN_W ("%s %s %d\n", __func__, NODE_NAME(f), event); + +#ifdef GIO_COMPILATION + for (idx = subs; idx; idx = idx->next) { + g_file_monitor_emit_event(G_FILE_MONITOR(idx->data), f->gfile, + (other == NULL ? NULL : other->gfile), event); + } +#else + for (idx = subs; idx; idx = idx->next) { + gam_server_emit_one_event(NODE_NAME(f), gam_subscription_is_dir(idx->data), event, idx->data, 1); + } +#endif +} + +static int +node_event_translate(int event, gboolean pair) +{ +#ifdef GIO_COMPILATION + switch (event) { + 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: + return G_FILE_MONITOR_EVENT_CHANGED; + case FILE_RENAME_TO: + if (pair) { + return G_FILE_MONITOR_EVENT_MOVED; + } else { + return G_FILE_MONITOR_EVENT_CREATED; + } + default: + /* case FILE_ACCESS: */ + g_assert_not_reached (); + return -1; + } +#else + switch (event) { + case FILE_DELETE: + case FILE_RENAME_FROM: + return GAMIN_EVENT_DELETED; + case MOUNTEDOVER: + case UNMOUNTED: + return GAMIN_EVENT_CHANGED; + case FILE_RENAME_TO: + if (pair) { + return GAMIN_EVENT_MOVED; + } else { + return GAMIN_EVENT_CREATED; + } + default: + if (event & (FILE_ATTRIB | FILE_MODIFIED)) { + return GAMIN_EVENT_CHANGED; + } + /* case FILE_ACCESS: */ + g_assert_not_reached (); + return -1; + } +#endif +} + +node_event_t* +node_event_new (int event, gpointer user_data) +{ + node_event_t *ev; + + if ((ev = g_new (node_event_t, 1)) != NULL) { + g_assert (ev); + ev->e = event; + ev->user_data = user_data; + ev->pair_data = NULL; /* For renamed file. */ + /* Created timestamp */ + g_get_current_time(&ev->ctv); + ev->rename_tv = ev->ctv; + } + return ev; +} + +void +node_event_delete (node_event_t* ev) +{ + g_free (ev); +} diff --git a/gio/fen/fen-node.h b/gio/fen/fen-node.h new file mode 100644 index 0000000..7e99032 --- /dev/null +++ b/gio/fen/fen-node.h @@ -0,0 +1,104 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:set expandtab ts=4 shiftwidth=4: */ +/* + * Copyright (c) 2008, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 + +#ifndef _FEN_NODE_H_ +#define _FEN_NODE_H_ + +#ifdef GIO_COMPILATION +#define FN_EVENT_CREATED G_FILE_MONITOR_EVENT_CREATED +#else +#define FN_EVENT_CREATED GAMIN_EVENT_CREATED +#endif + +#define NODE_STATE_NONE 0x00000000 +#define NODE_STATE_ASSOCIATED 0x00000001 /* This is a confilct to NODE_FLAG_STAT_DONE */ +#define NODE_STATE_HAS_EVENTS 0x00000002 + +#define NODE_FLAG_NONE 0x00000000 +#define NODE_FLAG_SNAPSHOT_UPDATED 0x00000001 +#define NODE_FLAG_DIR 0x00000002 +#define NODE_FLAG_STAT_UPDATED 0x00000004 + +#define NODE_CLE_STATE(f, st) (f->state &= ~(st)) +#define NODE_SET_STATE(f, st) (f->state = ((f->state & ~(st)) | (st))) +#define NODE_HAS_STATE(f, st) (f->state & (st)) + +#define NODE_CLE_FLAG(f, fl) (f->flag &= ~(fl)) +#define NODE_SET_FLAG(f, fl) (f->flag = ((f->flag & ~(fl)) | (fl))) +#define NODE_HAS_FLAG(f, fl) (f->flag & (fl)) + +typedef struct node node_t; +struct node +{ + file_obj_t fobj; /* Inherit from file_obj_t, must be the first. */ + GSource *source; + gchar *basename; + guint32 state; + guint32 flag; + GTimeVal atv; /* Timestamp for the first added sub. */ + + /* the parent and children of node */ + node_t *parent; + GHashTable *children; /* children in basename */ + + /* List of subscriptions monitoring this fdata/path */ + GList *subs; + GList *dir_subs; + +#ifdef GIO_COMPILATION + GFile* gfile; +#endif +}; + +#define FILE_OBJECT(f) ((file_obj_t *)(f)) +#define NODE_NAME(f) (FILE_OBJECT(f)->fo_name) +#define NODE_PARENT(f) (((node_t *)f)->parent) +#define NODE_IS_ACTIVE(f) (f->dir_subs || f->subs) +#define NODE_IS_REQUIRED_BY_PARENT(f) (NODE_PARENT(f) && NODE_PARENT(f)->dir_subs) + +gboolean node_timeval_lt(const GTimeVal *val1, const GTimeVal *val2); +gboolean node_try_delete(node_t* node); +void node_traverse(node_t* node, void(*traverse_cb)(node_t*, gpointer), gpointer user_data); +node_t* node_find(node_t* node, const gchar* filename, gboolean create_on_missing); +gint node_lstat(node_t *f); +void node_create_children_snapshot(node_t *f, gint created_event, gboolean emit); +void node_adjust_deleted(node_t *f); +gboolean node_class_init(); + +typedef struct node_event +{ + int e; + gpointer user_data; + gpointer pair_data; + GTimeVal ctv; /* Created timestamp */ + GTimeVal rename_tv; /* Possible rename timestamp */ +} node_event_t; + +node_event_t* node_event_new (int event, gpointer user_data); +void node_event_delete (node_event_t* ev); + +#endif /* _FEN_NODE_H_ */ diff --git a/gio/fen/gfendirectorymonitor.c b/gio/fen/gfendirectorymonitor.c new file mode 100644 index 0000000..055f52f --- /dev/null +++ b/gio/fen/gfendirectorymonitor.c @@ -0,0 +1,142 @@ +/* -*- 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, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 + +#include "fen-helper.h" + +struct _GFenDirectoryMonitor +{ + GLocalDirectoryMonitor parent_instance; + gboolean enabled; +}; + +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->enabled) { + fen_remove (G_LOCAL_DIRECTORY_MONITOR (self)->dirname, self, TRUE); + self->enabled = FALSE; + } + + 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 */ + fen_add (dirname, self, TRUE); + self->enabled = 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->enabled) { + fen_remove (G_LOCAL_DIRECTORY_MONITOR (self)->dirname, self, TRUE); + self->enabled = FALSE; + } + + 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..a4d133d --- /dev/null +++ b/gio/fen/gfendirectorymonitor.h @@ -0,0 +1,58 @@ +/* -*- 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, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 + */ + +#ifndef __G_FEN_DIRECTORY_MONITOR_H__ +#define __G_FEN_DIRECTORY_MONITOR_H__ + +#include +#include +#include +#include + +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..72394cf --- /dev/null +++ b/gio/fen/gfenfilemonitor.c @@ -0,0 +1,142 @@ +/* -*- 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, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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" + +struct _GFenFileMonitor +{ + GLocalFileMonitor parent_instance; + gboolean enabled; +}; + +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->enabled) { + fen_remove (G_LOCAL_FILE_MONITOR (self)->filename, self, FALSE); + self->enabled = FALSE; + } + + 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 */ + fen_add (filename, self, FALSE); + self->enabled = TRUE; + + 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->enabled) { + fen_remove (G_LOCAL_FILE_MONITOR (self)->filename, self, FALSE); + self->enabled = FALSE; + } + + 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..e44fd99 --- /dev/null +++ b/gio/fen/gfenfilemonitor.h @@ -0,0 +1,59 @@ +/* -*- 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, 2010 Oracle and/or its affiliates, Inc. All rights + * reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 + */ + +#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/gaction.c b/gio/gaction.c new file mode 100644 index 0000000..3329830 --- /dev/null +++ b/gio/gaction.c @@ -0,0 +1,391 @@ +/* + * 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 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 + */ + +#include "config.h" +#include "gaction.h" +#include "glibintl.h" + +G_DEFINE_INTERFACE (GAction, g_action, G_TYPE_OBJECT) + +/** + * SECTION:gaction + * @title: GAction + * @short_description: An action interface + * + * #GAction represents a single named action. + * + * The main interface to an action is that it can be activated with + * g_action_activate(). This results in the 'activate' signal being + * emitted. An activation has a #GVariant parameter (which may be + * %NULL). The correct type for the parameter is determined by a static + * parameter type (which is given at construction time). + * + * An action may optionally have a state, in which case the state may be + * set with g_action_change_state(). This call takes a #GVariant. The + * correct type for the state is determined by a static state type + * (which is given at construction time). + * + * The state may have a hint associated with it, specifying its valid + * range. + * + * #GAction is merely the interface to the concept of an action, as + * described above. Various implementations of actions exist, including + * #GSimpleAction and #GtkAction. + * + * In all cases, the implementing class is responsible for storing the + * name of the action, the parameter type, the enabled state, the + * optional state type and the state and emitting the appropriate + * signals when these change. The implementor responsible for filtering + * calls to g_action_activate() and g_action_change_state() for type + * safety and for the state being enabled. + * + * Probably the only useful thing to do with a #GAction is to put it + * inside of a #GSimpleActionGroup. + **/ + +/** + * GActionInterface: + * @get_name: the virtual function pointer for g_action_get_name() + * @get_parameter_type: the virtual function pointer for g_action_get_parameter_type() + * @get_state_type: the virtual function pointer for g_action_get_state_type() + * @get_state_hint: the virtual function pointer for g_action_get_state_hint() + * @get_enabled: the virtual function pointer for g_action_get_enabled() + * @get_state: the virtual function pointer for g_action_get_state() + * @change_state: the virtual function pointer for g_action_change_state() + * @activate: the virtual function pointer for g_action_activate(). Note that #GAction does not have an + * 'activate' signal but that implementations of it may have one. + * + * The virtual function table for #GAction. + * + * Since: 2.28 + */ + +void +g_action_default_init (GActionInterface *iface) +{ + /** + * GAction:name: + * + * The name of the action. This is mostly meaningful for identifying + * the action once it has been added to a #GActionGroup. + * + * Since: 2.28 + **/ + g_object_interface_install_property (iface, + g_param_spec_string ("name", + P_("Action Name"), + P_("The name used to invoke the action"), + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GAction:parameter-type: + * + * The type of the parameter that must be given when activating the + * action. + * + * Since: 2.28 + **/ + g_object_interface_install_property (iface, + g_param_spec_boxed ("parameter-type", + P_("Parameter Type"), + P_("The type of GVariant passed to activate()"), + G_TYPE_VARIANT_TYPE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GAction:enabled: + * + * If @action is currently enabled. + * + * If the action is disabled then calls to g_action_activate() and + * g_action_change_state() have no effect. + * + * Since: 2.28 + **/ + g_object_interface_install_property (iface, + g_param_spec_boolean ("enabled", + P_("Enabled"), + P_("If the action can be activated"), + TRUE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GAction:state-type: + * + * The #GVariantType of the state that the action has, or %NULL if the + * action is stateless. + * + * Since: 2.28 + **/ + g_object_interface_install_property (iface, + g_param_spec_boxed ("state-type", + P_("State Type"), + P_("The type of the state kept by the action"), + G_TYPE_VARIANT_TYPE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GAction:state: + * + * The state of the action, or %NULL if the action is stateless. + * + * Since: 2.28 + **/ + g_object_interface_install_property (iface, + g_param_spec_variant ("state", + P_("State"), + P_("The state the action is in"), + G_VARIANT_TYPE_ANY, + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_action_change_state: + * @action: a #GAction + * @value: the new state + * + * Request for the state of @action to be changed to @value. + * + * The action must be stateful and @value must be of the correct type. + * See g_action_get_state_type(). + * + * This call merely requests a change. The action may refuse to change + * its state or may change its state to something other than @value. + * See g_action_get_state_hint(). + * + * If the @value GVariant is floating, it is consumed. + * + * Since: 2.30 + **/ +void +g_action_change_state (GAction *action, + GVariant *value) +{ + const GVariantType *state_type; + + g_return_if_fail (G_IS_ACTION (action)); + g_return_if_fail (value != NULL); + state_type = g_action_get_state_type (action); + g_return_if_fail (state_type != NULL); + g_return_if_fail (g_variant_is_of_type (value, state_type)); + + g_variant_ref_sink (value); + + G_ACTION_GET_IFACE (action) + ->change_state (action, value); + + g_variant_unref (value); +} + +/** + * g_action_get_state: + * @action: a #GAction + * + * Queries the current state of @action. + * + * If the action is not stateful then %NULL will be returned. If the + * action is stateful then the type of the return value is the type + * given by g_action_get_state_type(). + * + * The return value (if non-%NULL) should be freed with + * g_variant_unref() when it is no longer required. + * + * Returns: (transfer full): the current state of the action + * + * Since: 2.28 + **/ +GVariant * +g_action_get_state (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), NULL); + + return G_ACTION_GET_IFACE (action) + ->get_state (action); +} + +/** + * g_action_get_name: + * @action: a #GAction + * + * Queries the name of @action. + * + * Returns: the name of the action + * + * Since: 2.28 + **/ +const gchar * +g_action_get_name (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), NULL); + + return G_ACTION_GET_IFACE (action) + ->get_name (action); +} + +/** + * g_action_get_parameter_type: + * @action: a #GAction + * + * Queries the type of the parameter that must be given when activating + * @action. + * + * When activating the action using g_action_activate(), the #GVariant + * given to that function must be of the type returned by this function. + * + * In the case that this function returns %NULL, you must not give any + * #GVariant, but %NULL instead. + * + * Returns: (allow-none): the parameter type + * + * Since: 2.28 + **/ +const GVariantType * +g_action_get_parameter_type (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), NULL); + + return G_ACTION_GET_IFACE (action) + ->get_parameter_type (action); +} + +/** + * g_action_get_state_type: + * @action: a #GAction + * + * Queries the type of the state of @action. + * + * If the action is stateful (e.g. created with + * g_simple_action_new_stateful()) then this function returns the + * #GVariantType of the state. This is the type of the initial value + * given as the state. All calls to g_action_change_state() must give a + * #GVariant of this type and g_action_get_state() will return a + * #GVariant of the same type. + * + * If the action is not stateful (e.g. created with g_simple_action_new()) + * then this function will return %NULL. In that case, g_action_get_state() + * will return %NULL and you must not call g_action_change_state(). + * + * Returns: (allow-none): the state type, if the action is stateful + * + * Since: 2.28 + **/ +const GVariantType * +g_action_get_state_type (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), NULL); + + return G_ACTION_GET_IFACE (action) + ->get_state_type (action); +} + +/** + * g_action_get_state_hint: + * @action: a #GAction + * + * Requests a hint about the valid range of values for the state of + * @action. + * + * If %NULL is returned it either means that the action is not stateful + * or that there is no hint about the valid range of values for the + * state of the action. + * + * If a #GVariant array is returned then each item in the array is a + * possible value for the state. If a #GVariant pair (ie: two-tuple) is + * returned then the tuple specifies the inclusive lower and upper bound + * of valid values for the state. + * + * In any case, the information is merely a hint. It may be possible to + * have a state value outside of the hinted range and setting a value + * within the range may fail. + * + * The return value (if non-%NULL) should be freed with + * g_variant_unref() when it is no longer required. + * + * Returns: (transfer full): the state range hint + * + * Since: 2.28 + **/ +GVariant * +g_action_get_state_hint (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), NULL); + + return G_ACTION_GET_IFACE (action) + ->get_state_hint (action); +} + +/** + * g_action_get_enabled: + * @action: a #GAction + * + * Checks if @action is currently enabled. + * + * An action must be enabled in order to be activated or in order to + * have its state changed from outside callers. + * + * Returns: whether the action is enabled + * + * Since: 2.28 + **/ +gboolean +g_action_get_enabled (GAction *action) +{ + g_return_val_if_fail (G_IS_ACTION (action), FALSE); + + return G_ACTION_GET_IFACE (action) + ->get_enabled (action); +} + +/** + * g_action_activate: + * @action: a #GAction + * @parameter: (allow-none): the parameter to the activation + * + * Activates the action. + * + * @parameter must be the correct type of parameter for the action (ie: + * the parameter type given at construction time). If the parameter + * type was %NULL then @parameter must also be %NULL. + * + * Since: 2.28 + **/ +void +g_action_activate (GAction *action, + GVariant *parameter) +{ + g_return_if_fail (G_IS_ACTION (action)); + + if (parameter != NULL) + g_variant_ref_sink (parameter); + + G_ACTION_GET_IFACE (action) + ->activate (action, parameter); + + if (parameter != NULL) + g_variant_unref (parameter); +} diff --git a/gio/gaction.h b/gio/gaction.h new file mode 100644 index 0000000..5f846ca --- /dev/null +++ b/gio/gaction.h @@ -0,0 +1,86 @@ +/* + * 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 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_ACTION_H__ +#define __G_ACTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_ACTION (g_action_get_type ()) +#define G_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_ACTION, GAction)) +#define G_IS_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_ACTION)) +#define G_ACTION_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + G_TYPE_ACTION, GActionInterface)) + +typedef struct _GActionInterface GActionInterface; + +struct _GActionInterface +{ + GTypeInterface g_iface; + + /* virtual functions */ + const gchar * (* get_name) (GAction *action); + const GVariantType * (* get_parameter_type) (GAction *action); + const GVariantType * (* get_state_type) (GAction *action); + GVariant * (* get_state_hint) (GAction *action); + + gboolean (* get_enabled) (GAction *action); + GVariant * (* get_state) (GAction *action); + + void (* change_state) (GAction *action, + GVariant *value); + void (* activate) (GAction *action, + GVariant *parameter); +}; + +GLIB_AVAILABLE_IN_2_30 +GType g_action_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +const gchar * g_action_get_name (GAction *action); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_action_get_parameter_type (GAction *action); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_action_get_state_type (GAction *action); +GLIB_AVAILABLE_IN_ALL +GVariant * g_action_get_state_hint (GAction *action); + +GLIB_AVAILABLE_IN_ALL +gboolean g_action_get_enabled (GAction *action); +GLIB_AVAILABLE_IN_ALL +GVariant * g_action_get_state (GAction *action); + +GLIB_AVAILABLE_IN_ALL +void g_action_change_state (GAction *action, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +void g_action_activate (GAction *action, + GVariant *parameter); +G_END_DECLS + +#endif /* __G_ACTION_H__ */ diff --git a/gio/gactiongroup.c b/gio/gactiongroup.c new file mode 100644 index 0000000..30e5e13 --- /dev/null +++ b/gio/gactiongroup.c @@ -0,0 +1,750 @@ +/* + * 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 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 + */ + +#include "config.h" +#include "gactiongroup.h" +#include "gaction.h" +#include "glibintl.h" + +/** + * SECTION:gactiongroup + * @title: GActionGroup + * @short_description: A group of actions + * @see_also: #GAction + * + * #GActionGroup represents a group of actions. Actions can be used to + * expose functionality in a structured way, either from one part of a + * program to another, or to the outside world. Action groups are often + * used together with a #GMenuModel that provides additional + * representation data for displaying the actions to the user, e.g. in + * a menu. + * + * The main way to interact with the actions in a GActionGroup is to + * activate them with g_action_group_activate_action(). Activating an + * action may require a #GVariant parameter. The required type of the + * parameter can be inquired with g_action_group_get_action_parameter_type(). + * Actions may be disabled, see g_action_group_get_action_enabled(). + * Activating a disabled action has no effect. + * + * Actions may optionally have a state in the form of a #GVariant. The + * current state of an action can be inquired with + * g_action_group_get_action_state(). Activating a stateful action may + * change its state, but it is also possible to set the state by calling + * g_action_group_change_action_state(). + * + * As typical example, consider a text editing application which has an + * option to change the current font to 'bold'. A good way to represent + * this would be a stateful action, with a boolean state. Activating the + * action would toggle the state. + * + * Each action in the group has a unique name (which is a string). All + * method calls, except g_action_group_list_actions() take the name of + * an action as an argument. + * + * The #GActionGroup API is meant to be the 'public' API to the action + * group. The calls here are exactly the interaction that 'external + * forces' (eg: UI, incoming D-Bus messages, etc.) are supposed to have + * with actions. 'Internal' APIs (ie: ones meant only to be accessed by + * the action group implementation) are found on subclasses. This is + * why you will find - for example - g_action_group_get_action_enabled() + * but not an equivalent set() call. + * + * Signals are emitted on the action group in response to state changes + * on individual actions. + * + * Implementations of #GActionGroup should provide implementations for + * the virtual functions g_action_group_list_actions() and + * g_action_group_query_action(). The other virtual functions should + * not be implemented - their "wrappers" are actually implemented with + * calls to g_action_group_query_action(). + */ + +/** + * GActionGroupInterface: + * @has_action: the virtual function pointer for g_action_group_has_action() + * @list_actions: the virtual function pointer for g_action_group_list_actions() + * @get_action_parameter_type: the virtual function pointer for g_action_group_get_action_parameter_type() + * @get_action_state_type: the virtual function pointer for g_action_group_get_action_state_type() + * @get_action_state_hint: the virtual function pointer for g_action_group_get_action_state_hint() + * @get_action_enabled: the virtual function pointer for g_action_group_get_action_enabled() + * @get_action_state: the virtual function pointer for g_action_group_get_action_state() + * @change_action_state: the virtual function pointer for g_action_group_change_action_state() + * @query_action: the virtual function pointer for g_action_group_query_action() + * @activate_action: the virtual function pointer for g_action_group_activate_action() + * @change_action_state: the virtual function pointer for g_action_group_change_action_state() + * @action_added: the class closure for the #GActionGroup::action-added signal + * @action_removed: the class closure for the #GActionGroup::action-removed signal + * @action_enabled_changed: the class closure for the #GActionGroup::action-enabled-changed signal + * @action_state_changed: the class closure for the #GActionGroup::action-enabled-changed signal + * + * The virtual function table for #GActionGroup. + * + * Since: 2.28 + **/ + +G_DEFINE_INTERFACE (GActionGroup, g_action_group, G_TYPE_OBJECT) + +enum +{ + SIGNAL_ACTION_ADDED, + SIGNAL_ACTION_REMOVED, + SIGNAL_ACTION_ENABLED_CHANGED, + SIGNAL_ACTION_STATE_CHANGED, + NR_SIGNALS +}; + +static guint g_action_group_signals[NR_SIGNALS]; + +static gboolean +g_action_group_real_has_action (GActionGroup *action_group, + const gchar *action_name) +{ + return g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, NULL, NULL); +} + +static gboolean +g_action_group_real_get_action_enabled (GActionGroup *action_group, + const gchar *action_name) +{ + gboolean enabled = FALSE; + + g_action_group_query_action (action_group, action_name, &enabled, NULL, NULL, NULL, NULL); + + return enabled; +} + +static const GVariantType * +g_action_group_real_get_action_parameter_type (GActionGroup *action_group, + const gchar *action_name) +{ + const GVariantType *type = NULL; + + g_action_group_query_action (action_group, action_name, NULL, &type, NULL, NULL, NULL); + + return type; +} + +static const GVariantType * +g_action_group_real_get_action_state_type (GActionGroup *action_group, + const gchar *action_name) +{ + const GVariantType *type = NULL; + + g_action_group_query_action (action_group, action_name, NULL, NULL, &type, NULL, NULL); + + return type; +} + +static GVariant * +g_action_group_real_get_action_state_hint (GActionGroup *action_group, + const gchar *action_name) +{ + GVariant *hint = NULL; + + g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, &hint, NULL); + + return hint; +} + +static GVariant * +g_action_group_real_get_action_state (GActionGroup *action_group, + const gchar *action_name) +{ + GVariant *state = NULL; + + g_action_group_query_action (action_group, action_name, NULL, NULL, NULL, NULL, &state); + + return state; +} + +static gboolean +g_action_group_real_query_action (GActionGroup *action_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + GActionGroupInterface *iface = G_ACTION_GROUP_GET_IFACE (action_group); + + /* we expect implementations to override this method, but we also + * allow for implementations that existed before this method was + * introduced to override the individual accessors instead. + * + * detect the case that neither has happened and report it. + */ + if G_UNLIKELY (iface->has_action == g_action_group_real_has_action || + iface->get_action_enabled == g_action_group_real_get_action_enabled || + iface->get_action_parameter_type == g_action_group_real_get_action_parameter_type || + iface->get_action_state_type == g_action_group_real_get_action_state_type || + iface->get_action_state_hint == g_action_group_real_get_action_state_hint || + iface->get_action_state == g_action_group_real_get_action_state) + { + g_critical ("Class '%s' implements GActionGroup interface without overriding " + "query_action() method -- bailing out to avoid infinite recursion.", + G_OBJECT_TYPE_NAME (action_group)); + return FALSE; + } + + if (!(* iface->has_action) (action_group, action_name)) + return FALSE; + + if (enabled != NULL) + *enabled = (* iface->get_action_enabled) (action_group, action_name); + + if (parameter_type != NULL) + *parameter_type = (* iface->get_action_parameter_type) (action_group, action_name); + + if (state_type != NULL) + *state_type = (* iface->get_action_state_type) (action_group, action_name); + + if (state_hint != NULL) + *state_hint = (* iface->get_action_state_hint) (action_group, action_name); + + if (state != NULL) + *state = (* iface->get_action_state) (action_group, action_name); + + return TRUE; +} + +static void +g_action_group_default_init (GActionGroupInterface *iface) +{ + iface->has_action = g_action_group_real_has_action; + iface->get_action_enabled = g_action_group_real_get_action_enabled; + iface->get_action_parameter_type = g_action_group_real_get_action_parameter_type; + iface->get_action_state_type = g_action_group_real_get_action_state_type; + iface->get_action_state_hint = g_action_group_real_get_action_state_hint; + iface->get_action_state = g_action_group_real_get_action_state; + iface->query_action = g_action_group_real_query_action; + + /** + * GActionGroup::action-added: + * @action_group: the #GActionGroup that changed + * @action_name: the name of the action in @action_group + * + * Signals that a new action was just added to the group. + * This signal is emitted after the action has been added + * and is now visible. + * + * Since: 2.28 + **/ + g_action_group_signals[SIGNAL_ACTION_ADDED] = + g_signal_new (I_("action-added"), + G_TYPE_ACTION_GROUP, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (GActionGroupInterface, action_added), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + /** + * GActionGroup::action-removed: + * @action_group: the #GActionGroup that changed + * @action_name: the name of the action in @action_group + * + * Signals that an action is just about to be removed from the group. + * This signal is emitted before the action is removed, so the action + * is still visible and can be queried from the signal handler. + * + * Since: 2.28 + **/ + g_action_group_signals[SIGNAL_ACTION_REMOVED] = + g_signal_new (I_("action-removed"), + G_TYPE_ACTION_GROUP, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (GActionGroupInterface, action_removed), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, + G_TYPE_STRING); + + + /** + * GActionGroup::action-enabled-changed: + * @action_group: the #GActionGroup that changed + * @action_name: the name of the action in @action_group + * @enabled: whether the action is enabled or not + * + * Signals that the enabled status of the named action has changed. + * + * Since: 2.28 + **/ + g_action_group_signals[SIGNAL_ACTION_ENABLED_CHANGED] = + g_signal_new (I_("action-enabled-changed"), + G_TYPE_ACTION_GROUP, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (GActionGroupInterface, + action_enabled_changed), + NULL, NULL, + NULL, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_BOOLEAN); + + /** + * GActionGroup::action-state-changed: + * @action_group: the #GActionGroup that changed + * @action_name: the name of the action in @action_group + * @value: the new value of the state + * + * Signals that the state of the named action has changed. + * + * Since: 2.28 + **/ + g_action_group_signals[SIGNAL_ACTION_STATE_CHANGED] = + g_signal_new (I_("action-state-changed"), + G_TYPE_ACTION_GROUP, + G_SIGNAL_RUN_LAST | + G_SIGNAL_DETAILED | + G_SIGNAL_MUST_COLLECT, + G_STRUCT_OFFSET (GActionGroupInterface, + action_state_changed), + NULL, NULL, + NULL, + G_TYPE_NONE, 2, + G_TYPE_STRING, + G_TYPE_VARIANT); +} + +/** + * g_action_group_list_actions: + * @action_group: a #GActionGroup + * + * Lists the actions contained within @action_group. + * + * The caller is responsible for freeing the list with g_strfreev() when + * it is no longer required. + * + * Returns: (transfer full): a %NULL-terminated array of the names of the + * actions in the groupb + * + * Since: 2.28 + **/ +gchar ** +g_action_group_list_actions (GActionGroup *action_group) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), NULL); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->list_actions (action_group); +} + +/** + * g_action_group_has_action: + * @action_group: a #GActionGroup + * @action_name: the name of the action to check for + * + * Checks if the named action exists within @action_group. + * + * Returns: whether the named action exists + * + * Since: 2.28 + **/ +gboolean +g_action_group_has_action (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), FALSE); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->has_action (action_group, action_name); +} + +/** + * g_action_group_get_action_parameter_type: + * @action_group: a #GActionGroup + * @action_name: the name of the action to query + * + * Queries the type of the parameter that must be given when activating + * the named action within @action_group. + * + * When activating the action using g_action_group_activate_action(), + * the #GVariant given to that function must be of the type returned + * by this function. + * + * In the case that this function returns %NULL, you must not give any + * #GVariant, but %NULL instead. + * + * The parameter type of a particular action will never change but it is + * possible for an action to be removed and for a new action to be added + * with the same name but a different parameter type. + * + * Return value: the parameter type + * + * Since: 2.28 + **/ +const GVariantType * +g_action_group_get_action_parameter_type (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), NULL); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->get_action_parameter_type (action_group, action_name); +} + +/** + * g_action_group_get_action_state_type: + * @action_group: a #GActionGroup + * @action_name: the name of the action to query + * + * Queries the type of the state of the named action within + * @action_group. + * + * If the action is stateful then this function returns the + * #GVariantType of the state. All calls to + * g_action_group_change_action_state() must give a #GVariant of this + * type and g_action_group_get_action_state() will return a #GVariant + * of the same type. + * + * If the action is not stateful then this function will return %NULL. + * In that case, g_action_group_get_action_state() will return %NULL + * and you must not call g_action_group_change_action_state(). + * + * The state type of a particular action will never change but it is + * possible for an action to be removed and for a new action to be added + * with the same name but a different state type. + * + * Returns: (transfer full): the state type, if the action is stateful + * + * Since: 2.28 + **/ +const GVariantType * +g_action_group_get_action_state_type (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), NULL); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->get_action_state_type (action_group, action_name); +} + +/** + * g_action_group_get_action_state_hint: + * @action_group: a #GActionGroup + * @action_name: the name of the action to query + * + * Requests a hint about the valid range of values for the state of the + * named action within @action_group. + * + * If %NULL is returned it either means that the action is not stateful + * or that there is no hint about the valid range of values for the + * state of the action. + * + * If a #GVariant array is returned then each item in the array is a + * possible value for the state. If a #GVariant pair (ie: two-tuple) is + * returned then the tuple specifies the inclusive lower and upper bound + * of valid values for the state. + * + * In any case, the information is merely a hint. It may be possible to + * have a state value outside of the hinted range and setting a value + * within the range may fail. + * + * The return value (if non-%NULL) should be freed with + * g_variant_unref() when it is no longer required. + * + * Return value: (transfer full): the state range hint + * + * Since: 2.28 + **/ +GVariant * +g_action_group_get_action_state_hint (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), NULL); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->get_action_state_hint (action_group, action_name); +} + +/** + * g_action_group_get_action_enabled: + * @action_group: a #GActionGroup + * @action_name: the name of the action to query + * + * Checks if the named action within @action_group is currently enabled. + * + * An action must be enabled in order to be activated or in order to + * have its state changed from outside callers. + * + * Return value: whether or not the action is currently enabled + * + * Since: 2.28 + **/ +gboolean +g_action_group_get_action_enabled (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), FALSE); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->get_action_enabled (action_group, action_name); +} + +/** + * g_action_group_get_action_state: + * @action_group: a #GActionGroup + * @action_name: the name of the action to query + * + * Queries the current state of the named action within @action_group. + * + * If the action is not stateful then %NULL will be returned. If the + * action is stateful then the type of the return value is the type + * given by g_action_group_get_action_state_type(). + * + * The return value (if non-%NULL) should be freed with + * g_variant_unref() when it is no longer required. + * + * Return value: (allow-none): the current state of the action + * + * Since: 2.28 + **/ +GVariant * +g_action_group_get_action_state (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_ACTION_GROUP (action_group), NULL); + + return G_ACTION_GROUP_GET_IFACE (action_group) + ->get_action_state (action_group, action_name); +} + +/** + * g_action_group_change_action_state: + * @action_group: a #GActionGroup + * @action_name: the name of the action to request the change on + * @value: the new state + * + * Request for the state of the named action within @action_group to be + * changed to @value. + * + * The action must be stateful and @value must be of the correct type. + * See g_action_group_get_action_state_type(). + * + * This call merely requests a change. The action may refuse to change + * its state or may change its state to something other than @value. + * See g_action_group_get_action_state_hint(). + * + * If the @value GVariant is floating, it is consumed. + * + * Since: 2.28 + **/ +void +g_action_group_change_action_state (GActionGroup *action_group, + const gchar *action_name, + GVariant *value) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + g_return_if_fail (value != NULL); + + G_ACTION_GROUP_GET_IFACE (action_group) + ->change_action_state (action_group, action_name, value); +} + +/** + * g_action_group_activate_action: + * @action_group: a #GActionGroup + * @action_name: the name of the action to activate + * @parameter: (allow-none): parameters to the activation + * + * Activate the named action within @action_group. + * + * If the action is expecting a parameter, then the correct type of + * parameter must be given as @parameter. If the action is expecting no + * parameters then @parameter must be %NULL. See + * g_action_group_get_action_parameter_type(). + * + * Since: 2.28 + **/ +void +g_action_group_activate_action (GActionGroup *action_group, + const gchar *action_name, + GVariant *parameter) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + + G_ACTION_GROUP_GET_IFACE (action_group) + ->activate_action (action_group, action_name, parameter); +} + +/** + * g_action_group_action_added: + * @action_group: a #GActionGroup + * @action_name: the name of an action in the group + * + * Emits the #GActionGroup::action-added signal on @action_group. + * + * This function should only be called by #GActionGroup implementations. + * + * Since: 2.28 + **/ +void +g_action_group_action_added (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + + g_signal_emit (action_group, + g_action_group_signals[SIGNAL_ACTION_ADDED], + g_quark_try_string (action_name), + action_name); +} + +/** + * g_action_group_action_removed: + * @action_group: a #GActionGroup + * @action_name: the name of an action in the group + * + * Emits the #GActionGroup::action-removed signal on @action_group. + * + * This function should only be called by #GActionGroup implementations. + * + * Since: 2.28 + **/ +void +g_action_group_action_removed (GActionGroup *action_group, + const gchar *action_name) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + + g_signal_emit (action_group, + g_action_group_signals[SIGNAL_ACTION_REMOVED], + g_quark_try_string (action_name), + action_name); +} + +/** + * g_action_group_action_enabled_changed: + * @action_group: a #GActionGroup + * @action_name: the name of an action in the group + * @enabled: whether or not the action is now enabled + * + * Emits the #GActionGroup::action-enabled-changed signal on @action_group. + * + * This function should only be called by #GActionGroup implementations. + * + * Since: 2.28 + **/ +void +g_action_group_action_enabled_changed (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + + enabled = !!enabled; + + g_signal_emit (action_group, + g_action_group_signals[SIGNAL_ACTION_ENABLED_CHANGED], + g_quark_try_string (action_name), + action_name, + enabled); +} + +/** + * g_action_group_action_state_changed: + * @action_group: a #GActionGroup + * @action_name: the name of an action in the group + * @state: the new state of the named action + * + * Emits the #GActionGroup::action-state-changed signal on @action_group. + * + * This function should only be called by #GActionGroup implementations. + * + * Since: 2.28 + **/ +void +g_action_group_action_state_changed (GActionGroup *action_group, + const gchar *action_name, + GVariant *state) +{ + g_return_if_fail (G_IS_ACTION_GROUP (action_group)); + g_return_if_fail (action_name != NULL); + + g_signal_emit (action_group, + g_action_group_signals[SIGNAL_ACTION_STATE_CHANGED], + g_quark_try_string (action_name), + action_name, + state); +} + +/** + * g_action_group_query_action: + * @action_group: a #GActionGroup + * @action_name: the name of an action in the group + * @enabled: (out): if the action is presently enabled + * @parameter_type: (out) (allow-none): the parameter type, or %NULL if none needed + * @state_type: (out) (allow-none): the state type, or %NULL if stateless + * @state_hint: (out) (allow-none): the state hint, or %NULL if none + * @state: (out) (allow-none): the current state, or %NULL if stateless + * + * Queries all aspects of the named action within an @action_group. + * + * This function acquires the information available from + * g_action_group_has_action(), g_action_group_get_action_enabled(), + * g_action_group_get_action_parameter_type(), + * g_action_group_get_action_state_type(), + * g_action_group_get_action_state_hint() and + * g_action_group_get_action_state() with a single function call. + * + * This provides two main benefits. + * + * The first is the improvement in efficiency that comes with not having + * to perform repeated lookups of the action in order to discover + * different things about it. The second is that implementing + * #GActionGroup can now be done by only overriding this one virtual + * function. + * + * The interface provides a default implementation of this function that + * calls the individual functions, as required, to fetch the + * information. The interface also provides default implementations of + * those functions that call this function. All implementations, + * therefore, must override either this function or all of the others. + * + * If the action exists, %TRUE is returned and any of the requested + * fields (as indicated by having a non-%NULL reference passed in) are + * filled. If the action doesn't exist, %FALSE is returned and the + * fields may or may not have been modified. + * + * Returns: %TRUE if the action exists, else %FALSE + * + * Since: 2.32 + **/ +gboolean +g_action_group_query_action (GActionGroup *action_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + return G_ACTION_GROUP_GET_IFACE (action_group) + ->query_action (action_group, action_name, enabled, parameter_type, state_type, state_hint, state); +} diff --git a/gio/gactiongroup.h b/gio/gactiongroup.h new file mode 100644 index 0000000..9fc3b2b --- /dev/null +++ b/gio/gactiongroup.h @@ -0,0 +1,163 @@ +/* + * 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 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_ACTION_GROUP_H__ +#define __G_ACTION_GROUP_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +#define G_TYPE_ACTION_GROUP (g_action_group_get_type ()) +#define G_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_ACTION_GROUP, GActionGroup)) +#define G_IS_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_ACTION_GROUP)) +#define G_ACTION_GROUP_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + G_TYPE_ACTION_GROUP, GActionGroupInterface)) + +typedef struct _GActionGroupInterface GActionGroupInterface; + +struct _GActionGroupInterface +{ + GTypeInterface g_iface; + + /* virtual functions */ + gboolean (* has_action) (GActionGroup *action_group, + const gchar *action_name); + + gchar ** (* list_actions) (GActionGroup *action_group); + + gboolean (* get_action_enabled) (GActionGroup *action_group, + const gchar *action_name); + + const GVariantType * (* get_action_parameter_type) (GActionGroup *action_group, + const gchar *action_name); + + const GVariantType * (* get_action_state_type) (GActionGroup *action_group, + const gchar *action_name); + + GVariant * (* get_action_state_hint) (GActionGroup *action_group, + const gchar *action_name); + + GVariant * (* get_action_state) (GActionGroup *action_group, + const gchar *action_name); + + void (* change_action_state) (GActionGroup *action_group, + const gchar *action_name, + GVariant *value); + + void (* activate_action) (GActionGroup *action_group, + const gchar *action_name, + GVariant *parameter); + + /* signals */ + void (* action_added) (GActionGroup *action_group, + const gchar *action_name); + void (* action_removed) (GActionGroup *action_group, + const gchar *action_name); + void (* action_enabled_changed) (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled); + void (* action_state_changed) (GActionGroup *action_group, + const gchar *action_name, + GVariant *state); + + /* more virtual functions */ + gboolean (* query_action) (GActionGroup *action_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_action_group_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_action_group_has_action (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +gchar ** g_action_group_list_actions (GActionGroup *action_group); + +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_action_group_get_action_parameter_type (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_action_group_get_action_state_type (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +GVariant * g_action_group_get_action_state_hint (GActionGroup *action_group, + const gchar *action_name); + +GLIB_AVAILABLE_IN_ALL +gboolean g_action_group_get_action_enabled (GActionGroup *action_group, + const gchar *action_name); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_action_group_get_action_state (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +void g_action_group_change_action_state (GActionGroup *action_group, + const gchar *action_name, + GVariant *value); + +GLIB_AVAILABLE_IN_ALL +void g_action_group_activate_action (GActionGroup *action_group, + const gchar *action_name, + GVariant *parameter); + +/* signals */ +GLIB_AVAILABLE_IN_ALL +void g_action_group_action_added (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +void g_action_group_action_removed (GActionGroup *action_group, + const gchar *action_name); +GLIB_AVAILABLE_IN_ALL +void g_action_group_action_enabled_changed (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled); + +GLIB_AVAILABLE_IN_ALL +void g_action_group_action_state_changed (GActionGroup *action_group, + const gchar *action_name, + GVariant *state); + +GLIB_AVAILABLE_IN_2_32 +gboolean g_action_group_query_action (GActionGroup *action_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state); + +G_END_DECLS + +#endif /* __G_ACTION_GROUP_H__ */ diff --git a/gio/gactiongroupexporter.c b/gio/gactiongroupexporter.c new file mode 100644 index 0000000..c906344 --- /dev/null +++ b/gio/gactiongroupexporter.c @@ -0,0 +1,587 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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 + */ + +#include "config.h" + +#include "gactiongroupexporter.h" + +#include "gdbusmethodinvocation.h" +#include "gremoteactiongroup.h" +#include "gdbusintrospection.h" +#include "gdbusconnection.h" +#include "gactiongroup.h" +#include "gdbuserror.h" + +/** + * SECTION:gactiongroupexporter + * @title: GActionGroup exporter + * @short_description: Export GActionGroups on D-Bus + * @see_also: #GActionGroup, #GDBusActionGroup + * + * These functions support exporting a #GActionGroup on D-Bus. + * The D-Bus interface that is used is a private implementation + * detail. + * + * To access an exported #GActionGroup remotely, use + * g_dbus_action_group_get() to obtain a #GDBusActionGroup. + */ + +static GVariant * +g_action_group_describe_action (GActionGroup *action_group, + const gchar *name) +{ + const GVariantType *type; + GVariantBuilder builder; + gboolean enabled; + GVariant *state; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(bgav)")); + + enabled = g_action_group_get_action_enabled (action_group, name); + g_variant_builder_add (&builder, "b", enabled); + + if ((type = g_action_group_get_action_parameter_type (action_group, name))) + { + gchar *str = g_variant_type_dup_string (type); + g_variant_builder_add (&builder, "g", str); + g_free (str); + } + else + g_variant_builder_add (&builder, "g", ""); + + g_variant_builder_open (&builder, G_VARIANT_TYPE ("av")); + if ((state = g_action_group_get_action_state (action_group, name))) + { + g_variant_builder_add (&builder, "v", state); + g_variant_unref (state); + } + g_variant_builder_close (&builder); + + return g_variant_builder_end (&builder); +} + +/* Using XML saves us dozens of relocations vs. using the introspection + * structure types. We only need to burn cycles and memory if we + * actually use the exporter -- not in every single app using GIO. + * + * It's also a lot easier to read. :) + * + * For documentation of this interface, see + * http://live.gnome.org/GTK+/GApplication-dbus-apis + */ +const char org_gtk_Actions_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +static GDBusInterfaceInfo *org_gtk_Actions; + +typedef struct +{ + GActionGroup *action_group; + GDBusConnection *connection; + GMainContext *context; + gchar *object_path; + GHashTable *pending_changes; + GSource *pending_source; +} GActionGroupExporter; + +#define ACTION_ADDED_EVENT (1u<<0) +#define ACTION_REMOVED_EVENT (1u<<1) +#define ACTION_STATE_CHANGED_EVENT (1u<<2) +#define ACTION_ENABLED_CHANGED_EVENT (1u<<3) + +static gboolean +g_action_group_exporter_dispatch_events (gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + GVariantBuilder removes; + GVariantBuilder enabled_changes; + GVariantBuilder state_changes; + GVariantBuilder adds; + GHashTableIter iter; + gpointer value; + gpointer key; + + g_variant_builder_init (&removes, G_VARIANT_TYPE_STRING_ARRAY); + g_variant_builder_init (&enabled_changes, G_VARIANT_TYPE ("a{sb}")); + g_variant_builder_init (&state_changes, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_init (&adds, G_VARIANT_TYPE ("a{s(bgav)}")); + + g_hash_table_iter_init (&iter, exporter->pending_changes); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + guint events = GPOINTER_TO_INT (value); + const gchar *name = key; + + /* Adds and removes are incompatible with enabled or state + * changes, but we must report at least one event. + */ + g_assert (((events & (ACTION_ENABLED_CHANGED_EVENT | ACTION_STATE_CHANGED_EVENT)) == 0) != + ((events & (ACTION_REMOVED_EVENT | ACTION_ADDED_EVENT)) == 0)); + + if (events & ACTION_REMOVED_EVENT) + g_variant_builder_add (&removes, "s", name); + + if (events & ACTION_ENABLED_CHANGED_EVENT) + { + gboolean enabled; + + enabled = g_action_group_get_action_enabled (exporter->action_group, name); + g_variant_builder_add (&enabled_changes, "{sb}", name, enabled); + } + + if (events & ACTION_STATE_CHANGED_EVENT) + { + GVariant *state; + + state = g_action_group_get_action_state (exporter->action_group, name); + g_variant_builder_add (&state_changes, "{sv}", name, state); + g_variant_unref (state); + } + + if (events & ACTION_ADDED_EVENT) + { + GVariant *description; + + description = g_action_group_describe_action (exporter->action_group, name); + g_variant_builder_add (&adds, "{s@(bgav)}", name, description); + } + } + + g_hash_table_remove_all (exporter->pending_changes); + + g_dbus_connection_emit_signal (exporter->connection, NULL, exporter->object_path, + "org.gtk.Actions", "Changed", + g_variant_new ("(asa{sb}a{sv}a{s(bgav)})", + &removes, &enabled_changes, + &state_changes, &adds), + NULL); + + exporter->pending_source = NULL; + + return FALSE; +} + +static guint +g_action_group_exporter_get_events (GActionGroupExporter *exporter, + const gchar *name) +{ + return (gsize) g_hash_table_lookup (exporter->pending_changes, name); +} + +static void +g_action_group_exporter_set_events (GActionGroupExporter *exporter, + const gchar *name, + guint events) +{ + gboolean have_events; + gboolean is_queued; + + if (events != 0) + g_hash_table_insert (exporter->pending_changes, g_strdup (name), GINT_TO_POINTER (events)); + else + g_hash_table_remove (exporter->pending_changes, name); + + have_events = g_hash_table_size (exporter->pending_changes) > 0; + is_queued = exporter->pending_source != NULL; + + if (have_events && !is_queued) + { + GSource *source; + + source = g_idle_source_new (); + exporter->pending_source = source; + g_source_set_callback (source, g_action_group_exporter_dispatch_events, exporter, NULL); + g_source_attach (source, exporter->context); + g_source_unref (source); + } + + if (!have_events && is_queued) + { + g_source_destroy (exporter->pending_source); + exporter->pending_source = NULL; + } +} + +static void +g_action_group_exporter_action_added (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + guint event_mask; + + event_mask = g_action_group_exporter_get_events (exporter, action_name); + + /* The action is new, so we should not have any pending + * enabled-changed or state-changed signals for it. + */ + g_assert (~event_mask & (ACTION_STATE_CHANGED_EVENT | + ACTION_ENABLED_CHANGED_EVENT)); + + event_mask |= ACTION_ADDED_EVENT; + + g_action_group_exporter_set_events (exporter, action_name, event_mask); +} + +static void +g_action_group_exporter_action_removed (GActionGroup *action_group, + const gchar *action_name, + gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + guint event_mask; + + event_mask = g_action_group_exporter_get_events (exporter, action_name); + + /* If the add event for this is still queued then just cancel it since + * it's gone now. + * + * If the event was freshly added, there should not have been any + * enabled or state changed events. + */ + if (event_mask & ACTION_ADDED_EVENT) + { + g_assert (~event_mask & ~(ACTION_STATE_CHANGED_EVENT | ACTION_ENABLED_CHANGED_EVENT)); + event_mask &= ~ACTION_ADDED_EVENT; + } + + /* Otherwise, queue a remove event. Drop any state or enabled changes + * that were queued before the remove. */ + else + { + event_mask |= ACTION_REMOVED_EVENT; + event_mask &= ~(ACTION_STATE_CHANGED_EVENT | ACTION_ENABLED_CHANGED_EVENT); + } + + g_action_group_exporter_set_events (exporter, action_name, event_mask); +} + +static void +g_action_group_exporter_action_state_changed (GActionGroup *action_group, + const gchar *action_name, + GVariant *value, + gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + guint event_mask; + + event_mask = g_action_group_exporter_get_events (exporter, action_name); + + /* If it was removed, it must have been added back. Otherwise, why + * are we hearing about changes? + */ + g_assert (~event_mask & ACTION_REMOVED_EVENT || + event_mask & ACTION_ADDED_EVENT); + + /* If it is freshly added, don't also bother with the state change + * signal since the updated state will be sent as part of the pending + * add message. + */ + if (~event_mask & ACTION_ADDED_EVENT) + event_mask |= ACTION_STATE_CHANGED_EVENT; + + g_action_group_exporter_set_events (exporter, action_name, event_mask); +} + +static void +g_action_group_exporter_action_enabled_changed (GActionGroup *action_group, + const gchar *action_name, + gboolean enabled, + gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + guint event_mask; + + event_mask = g_action_group_exporter_get_events (exporter, action_name); + + /* Reasoning as above. */ + g_assert (~event_mask & ACTION_REMOVED_EVENT || + event_mask & ACTION_ADDED_EVENT); + + if (~event_mask & ACTION_ADDED_EVENT) + event_mask |= ACTION_ENABLED_CHANGED_EVENT; + + g_action_group_exporter_set_events (exporter, action_name, event_mask); +} + +static void +org_gtk_Actions_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + GVariant *result = NULL; + + if (g_str_equal (method_name, "List")) + { + gchar **list; + + list = g_action_group_list_actions (exporter->action_group); + result = g_variant_new ("(^as)", list); + g_strfreev (list); + } + + else if (g_str_equal (method_name, "Describe")) + { + const gchar *name; + GVariant *desc; + + g_variant_get (parameters, "(&s)", &name); + desc = g_action_group_describe_action (exporter->action_group, name); + result = g_variant_new ("(@(bgav))", desc); + } + + else if (g_str_equal (method_name, "DescribeAll")) + { + GVariantBuilder builder; + gchar **list; + gint i; + + list = g_action_group_list_actions (exporter->action_group); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{s(bgav)}")); + for (i = 0; list[i]; i++) + { + const gchar *name = list[i]; + GVariant *description; + + description = g_action_group_describe_action (exporter->action_group, name); + g_variant_builder_add (&builder, "{s@(bgav)}", name, description); + } + result = g_variant_new ("(a{s(bgav)})", &builder); + g_strfreev (list); + } + + else if (g_str_equal (method_name, "Activate")) + { + GVariant *parameter = NULL; + GVariant *platform_data; + GVariantIter *iter; + const gchar *name; + + g_variant_get (parameters, "(&sav@a{sv})", &name, &iter, &platform_data); + g_variant_iter_next (iter, "v", ¶meter); + g_variant_iter_free (iter); + + if (G_IS_REMOTE_ACTION_GROUP (exporter->action_group)) + g_remote_action_group_activate_action_full (G_REMOTE_ACTION_GROUP (exporter->action_group), + name, parameter, platform_data); + else + g_action_group_activate_action (exporter->action_group, name, parameter); + + if (parameter) + g_variant_unref (parameter); + + g_variant_unref (platform_data); + } + + else if (g_str_equal (method_name, "SetState")) + { + GVariant *platform_data; + const gchar *name; + GVariant *state; + + g_variant_get (parameters, "(&sv@a{sv})", &name, &state, &platform_data); + + if (G_IS_REMOTE_ACTION_GROUP (exporter->action_group)) + g_remote_action_group_change_action_state_full (G_REMOTE_ACTION_GROUP (exporter->action_group), + name, state, platform_data); + else + g_action_group_change_action_state (exporter->action_group, name, state); + + g_variant_unref (platform_data); + g_variant_unref (state); + } + + else + g_assert_not_reached (); + + g_dbus_method_invocation_return_value (invocation, result); +} + +static void +g_action_group_exporter_free (gpointer user_data) +{ + GActionGroupExporter *exporter = user_data; + + g_signal_handlers_disconnect_by_func (exporter->action_group, + g_action_group_exporter_action_added, exporter); + g_signal_handlers_disconnect_by_func (exporter->action_group, + g_action_group_exporter_action_enabled_changed, exporter); + g_signal_handlers_disconnect_by_func (exporter->action_group, + g_action_group_exporter_action_state_changed, exporter); + g_signal_handlers_disconnect_by_func (exporter->action_group, + g_action_group_exporter_action_removed, exporter); + + g_hash_table_unref (exporter->pending_changes); + if (exporter->pending_source) + g_source_destroy (exporter->pending_source); + + g_main_context_unref (exporter->context); + g_object_unref (exporter->connection); + g_object_unref (exporter->action_group); + g_free (exporter->object_path); + + g_slice_free (GActionGroupExporter, exporter); +} + +/** + * g_dbus_connection_export_action_group: + * @connection: a #GDBusConnection + * @object_path: a D-Bus object path + * @action_group: a #GActionGroup + * @error: a pointer to a %NULL #GError, or %NULL + * + * Exports @action_group on @connection at @object_path. + * + * The implemented D-Bus API should be considered private. It is + * subject to change in the future. + * + * A given object path can only have one action group exported on it. + * If this constraint is violated, the export will fail and 0 will be + * returned (with @error set accordingly). + * + * You can unexport the action group using + * g_dbus_connection_unexport_action_group() with the return value of + * this function. + * + * The thread default main context is taken at the time of this call. + * All incoming action activations and state change requests are + * reported from this context. Any changes on the action group that + * cause it to emit signals must also come from this same context. + * Since incoming action activations and state change requests are + * rather likely to cause changes on the action group, this effectively + * limits a given action group to being exported from only one main + * context. + * + * Returns: the ID of the export (never zero), or 0 in case of failure + * + * Since: 2.32 + **/ +guint +g_dbus_connection_export_action_group (GDBusConnection *connection, + const gchar *object_path, + GActionGroup *action_group, + GError **error) +{ + const GDBusInterfaceVTable vtable = { + org_gtk_Actions_method_call + }; + GActionGroupExporter *exporter; + guint id; + + if G_UNLIKELY (org_gtk_Actions == NULL) + { + GError *error = NULL; + GDBusNodeInfo *info; + + info = g_dbus_node_info_new_for_xml (org_gtk_Actions_xml, &error); + if G_UNLIKELY (info == NULL) + g_error ("%s", error->message); + org_gtk_Actions = g_dbus_node_info_lookup_interface (info, "org.gtk.Actions"); + g_assert (org_gtk_Actions != NULL); + g_dbus_interface_info_ref (org_gtk_Actions); + g_dbus_node_info_unref (info); + } + + exporter = g_slice_new (GActionGroupExporter); + id = g_dbus_connection_register_object (connection, object_path, org_gtk_Actions, &vtable, + exporter, g_action_group_exporter_free, error); + + if (id == 0) + { + g_slice_free (GActionGroupExporter, exporter); + return 0; + } + + exporter->context = g_main_context_ref_thread_default (); + exporter->pending_changes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + exporter->pending_source = NULL; + exporter->action_group = g_object_ref (action_group); + exporter->connection = g_object_ref (connection); + exporter->object_path = g_strdup (object_path); + + g_signal_connect (action_group, "action-added", + G_CALLBACK (g_action_group_exporter_action_added), exporter); + g_signal_connect (action_group, "action-removed", + G_CALLBACK (g_action_group_exporter_action_removed), exporter); + g_signal_connect (action_group, "action-state-changed", + G_CALLBACK (g_action_group_exporter_action_state_changed), exporter); + g_signal_connect (action_group, "action-enabled-changed", + G_CALLBACK (g_action_group_exporter_action_enabled_changed), exporter); + + return id; +} + +/** + * g_dbus_connection_unexport_action_group: + * @connection: a #GDBusConnection + * @export_id: the ID from g_dbus_connection_export_action_group() + * + * Reverses the effect of a previous call to + * g_dbus_connection_export_action_group(). + * + * It is an error to call this function with an ID that wasn't returned + * from g_dbus_connection_export_action_group() or to call it with the + * same ID more than once. + * + * Since: 2.32 + **/ +void +g_dbus_connection_unexport_action_group (GDBusConnection *connection, + guint export_id) +{ + g_dbus_connection_unregister_object (connection, export_id); +} diff --git a/gio/gactiongroupexporter.h b/gio/gactiongroupexporter.h new file mode 100644 index 0000000..31f21f2 --- /dev/null +++ b/gio/gactiongroupexporter.h @@ -0,0 +1,47 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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_ACTION_GROUP_EXPORTER_H__ +#define __G_ACTION_GROUP_EXPORTER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_32 +guint g_dbus_connection_export_action_group (GDBusConnection *connection, + const gchar *object_path, + GActionGroup *action_group, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +void g_dbus_connection_unexport_action_group (GDBusConnection *connection, + guint export_id); + +G_END_DECLS + +#endif /* __G_ACTION_GROUP_EXPORTER_H__ */ diff --git a/gio/gactionmap.c b/gio/gactionmap.c new file mode 100644 index 0000000..caa63ad --- /dev/null +++ b/gio/gactionmap.c @@ -0,0 +1,276 @@ +/* + * 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 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 + */ + +#include "config.h" + +#include "gsimpleaction.h" +#include "gactiongroup.h" +#include "gactionmap.h" +#include "gaction.h" + +/** + * SECTION:gactionmap + * @title: GActionMap + * @short_description: Interface for action containers + * + * The GActionMap interface is implemented by #GActionGroup + * implementations that operate by containing a number of + * named #GAction instances, such as #GSimpleActionGroup. + * + * One useful application of this interface is to map the + * names of actions from various action groups to unique, + * prefixed names (e.g. by prepending "app." or "win."). + * This is the motivation for the 'Map' part of the interface + * name. + * + * Since: 2.32 + **/ + +/** + * GActionMapInterface: + * @lookup_action: the virtual function pointer for g_action_map_lookup_action() + * @add_action: the virtual function pointer for g_action_map_add_action() + * @remove_action: the virtual function pointer for g_action_map_remove_action() + * + * The virtual function table for #GActionMap. + * + * Since: 2.32 + **/ + +G_DEFINE_INTERFACE (GActionMap, g_action_map, G_TYPE_ACTION_GROUP) + +static void +g_action_map_default_init (GActionMapInterface *iface) +{ +} + +/** + * g_action_map_lookup_action: + * @action_map: a #GActionMap + * @action_name: the name of an action + * + * Looks up the action with the name @action_name in @action_map. + * + * If no such action exists, returns %NULL. + * + * Returns: (transfer none): a #GAction, or %NULL + * + * Since: 2.32 + */ +GAction * +g_action_map_lookup_action (GActionMap *action_map, + const gchar *action_name) +{ + return G_ACTION_MAP_GET_IFACE (action_map) + ->lookup_action (action_map, action_name); +} + +/** + * g_action_map_add_action: + * @action_map: a #GActionMap + * @action: a #GAction + * + * Adds an action to the @action_map. + * + * If the action map already contains an action with the same name + * as @action then the old action is dropped from the action map. + * + * The action map takes its own reference on @action. + * + * Since: 2.32 + */ +void +g_action_map_add_action (GActionMap *action_map, + GAction *action) +{ + G_ACTION_MAP_GET_IFACE (action_map)->add_action (action_map, action); +} + +/** + * g_action_map_remove_action: + * @action_map: a #GActionMap + * @action_name: the name of the action + * + * Removes the named action from the action map. + * + * If no action of this name is in the map then nothing happens. + * + * Since: 2.32 + */ +void +g_action_map_remove_action (GActionMap *action_map, + const gchar *action_name) +{ + G_ACTION_MAP_GET_IFACE (action_map)->remove_action (action_map, action_name); +} + +/** + * GActionEntry: + * @name: the name of the action + * @activate: the callback to connect to the "activate" signal of the + * action + * @parameter_type: the type of the parameter that must be passed to the + * activate function for this action, given as a single + * GVariant type string (or %NULL for no parameter) + * @state: the initial state for this action, given in GVariant text + * format. The state is parsed with no extra type information, + * so type tags must be added to the string if they are + * necessary. + * @change_state: the callback to connect to the "change-state" signal + * of the action + * + * This struct defines a single action. It is for use with + * g_action_map_add_action_entries(). + * + * The order of the items in the structure are intended to reflect + * frequency of use. It is permissible to use an incomplete initialiser + * in order to leave some of the later values as %NULL. All values + * after @name are optional. Additional optional fields may be added in + * the future. + * + * See g_action_map_add_action_entries() for an example. + **/ + +/** + * g_action_map_add_action_entries: + * @action_map: a #GActionMap + * @entries: (array length=n_entries) (element-type GActionEntry): a pointer to + * the first item in an array of #GActionEntry structs + * @n_entries: the length of @entries, or -1 if @entries is %NULL-terminated + * @user_data: the user data for signal connections + * + * A convenience function for creating multiple #GSimpleAction instances + * and adding them to a #GActionMap. + * + * Each action is constructed as per one #GActionEntry. + * + * + * Using g_action_map_add_action_entries() + * + * static void + * activate_quit (GSimpleAction *simple, + * GVariant *parameter, + * gpointer user_data) + * { + * exit (0); + * } + * + * static void + * activate_print_string (GSimpleAction *simple, + * GVariant *parameter, + * gpointer user_data) + * { + * g_print ("%s\n", g_variant_get_string (parameter, NULL)); + * } + * + * static GActionGroup * + * create_action_group (void) + * { + * const GActionEntry entries[] = { + * { "quit", activate_quit }, + * { "print-string", activate_print_string, "s" } + * }; + * GSimpleActionGroup *group; + * + * group = g_simple_action_group_new (); + * g_action_map_add_action_entries (G_ACTION_MAP (group), entries, G_N_ELEMENTS (entries), NULL); + * + * return G_ACTION_GROUP (group); + * } + * + * + * + * Since: 2.32 + */ +void +g_action_map_add_action_entries (GActionMap *action_map, + const GActionEntry *entries, + gint n_entries, + gpointer user_data) +{ + gint i; + + g_return_if_fail (G_IS_ACTION_MAP (action_map)); + g_return_if_fail (entries != NULL || n_entries == 0); + + for (i = 0; n_entries == -1 ? entries[i].name != NULL : i < n_entries; i++) + { + const GActionEntry *entry = &entries[i]; + const GVariantType *parameter_type; + GSimpleAction *action; + + if (entry->parameter_type) + { + if (!g_variant_type_string_is_valid (entry->parameter_type)) + { + g_critical ("g_action_map_add_entries: the type " + "string '%s' given as the parameter type for " + "action '%s' is not a valid GVariant type " + "string. This action will not be added.", + entry->parameter_type, entry->name); + return; + } + + parameter_type = G_VARIANT_TYPE (entry->parameter_type); + } + else + parameter_type = NULL; + + if (entry->state) + { + GError *error = NULL; + GVariant *state; + + state = g_variant_parse (NULL, entry->state, NULL, NULL, &error); + if (state == NULL) + { + g_critical ("g_action_map_add_entries: GVariant could " + "not parse the state value given for action '%s' " + "('%s'): %s. This action will not be added.", + entry->name, entry->state, error->message); + g_error_free (error); + continue; + } + + action = g_simple_action_new_stateful (entry->name, + parameter_type, + state); + + g_variant_unref (state); + } + else + { + action = g_simple_action_new (entry->name, + parameter_type); + } + + if (entry->activate != NULL) + g_signal_connect (action, "activate", + G_CALLBACK (entry->activate), user_data); + + if (entry->change_state != NULL) + g_signal_connect (action, "change-state", + G_CALLBACK (entry->change_state), user_data); + + g_action_map_add_action (action_map, G_ACTION (action)); + g_object_unref (action); + } +} diff --git a/gio/gactionmap.h b/gio/gactionmap.h new file mode 100644 index 0000000..93451a8 --- /dev/null +++ b/gio/gactionmap.h @@ -0,0 +1,97 @@ +/* + * 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 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_ACTION_MAP_H__ +#define __G_ACTION_MAP_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +#define G_TYPE_ACTION_MAP (g_action_map_get_type ()) +#define G_ACTION_MAP(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_ACTION_MAP, GActionMap)) +#define G_IS_ACTION_MAP(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_ACTION_MAP)) +#define G_ACTION_MAP_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + G_TYPE_ACTION_MAP, GActionMapInterface)) + +typedef struct _GActionMapInterface GActionMapInterface; +typedef struct _GActionEntry GActionEntry; + +struct _GActionMapInterface +{ + GTypeInterface g_iface; + + GAction * (* lookup_action) (GActionMap *action_map, + const gchar *action_name); + void (* add_action) (GActionMap *action_map, + GAction *action); + void (* remove_action) (GActionMap *action_map, + const gchar *action_name); +}; + +struct _GActionEntry +{ + const gchar *name; + + void (* activate) (GSimpleAction *action, + GVariant *parameter, + gpointer user_data); + + const gchar *parameter_type; + + const gchar *state; + + void (* change_state) (GSimpleAction *action, + GVariant *value, + gpointer user_data); + + /*< private >*/ + gsize padding[3]; +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_action_map_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +GAction * g_action_map_lookup_action (GActionMap *action_map, + const gchar *action_name); +GLIB_AVAILABLE_IN_2_32 +void g_action_map_add_action (GActionMap *action_map, + GAction *action); +GLIB_AVAILABLE_IN_2_32 +void g_action_map_remove_action (GActionMap *action_map, + const gchar *action_name); +GLIB_AVAILABLE_IN_2_32 +void g_action_map_add_action_entries (GActionMap *action_map, + const GActionEntry *entries, + gint n_entries, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_ACTION_MAP_H__ */ diff --git a/gio/gappinfo.c b/gio/gappinfo.c new file mode 100644 index 0000000..9472c0c --- /dev/null +++ b/gio/gappinfo.c @@ -0,0 +1,1029 @@ +/* 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 + + +/** + * 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: (transfer full): 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_last_used_for_type: + * @appinfo: a #GAppInfo. + * @content_type: the content type. + * @error: a #GError. + * + * Sets the application as the last used application for a given type. + * This will make the application appear as first in the list returned + * by g_app_info_get_recommended_for_type(), regardless of the default + * application for that content type. + * + * Returns: %TRUE on success, %FALSE on error. + **/ +gboolean +g_app_info_set_as_last_used_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_last_used_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_supported_types: + * @appinfo: a #GAppInfo that can handle files + * + * Retrieves the list of content types that @app_info claims to support. + * If this information is not provided by the environment, this function + * will return %NULL. + * This function does not take in consideration associations added with + * g_app_info_add_supports_type(), but only those exported directly by + * the application. + * + * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): + * a list of content types. + * + * Since: 2.34 + */ +const char ** +g_app_info_get_supported_types (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_supported_types) + return iface->get_supported_types (appinfo); + else + return NULL; +} + + +/** + * g_app_info_get_icon: + * @appinfo: a #GAppInfo. + * + * Gets the icon for the application. + * + * Returns: (transfer none): the default #GIcon for @appinfo or %NULL + * if there is no default icon. + **/ +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: (allow-none) (element-type GFile): a #GList of #GFile objects + * @launch_context: (allow-none): 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 launch 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. + * + * The launched application inherits the environment of the launching + * process, but it can be modified with g_app_launch_context_setenv() and + * g_app_launch_context_unsetenv(). + * + * On UNIX, this function sets the GIO_LAUNCHED_DESKTOP_FILE + * environment variable with the path of the launched desktop file and + * GIO_LAUNCHED_DESKTOP_FILE_PID to the process + * id of the launched process. This can be used to ignore + * GIO_LAUNCHED_DESKTOP_FILE, should it be inherited + * by further processes. The DISPLAY and + * DESKTOP_STARTUP_ID environment variables are also + * set, based on information provided in @launch_context. + * + * 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: (allow-none) (element-type utf8): a #GList containing URIs to launch. + * @launch_context: (allow-none): a #GAppLaunchContext or %NULL + * @error: a #GError + * + * Launches the application. This passes the @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 launch 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: (allow-none): 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) +{ + char *uri_scheme; + GAppInfo *app_info = NULL; + GList l; + gboolean res; + + /* g_file_query_default_handler() calls + * g_app_info_get_default_for_uri_scheme() too, but we have to do it + * here anyway in case GFile can't parse @uri correctly. + */ + uri_scheme = g_uri_parse_scheme (uri); + if (uri_scheme && uri_scheme[0] != '\0') + app_info = g_app_info_get_default_for_uri_scheme (uri_scheme); + g_free (uri_scheme); + + if (!app_info) + { + GFile *file; + + 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; + + /* We still use the original @uri rather than calling + * g_file_get_uri(), because GFile might have modified the URI + * in ways we don't want (eg, removing the fragment identifier + * from a file: 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(). + * + * Virtual: do_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; +} + + +enum { + LAUNCH_FAILED, + LAUNCHED, + LAST_SIGNAL +}; + +guint signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (GAppLaunchContext, g_app_launch_context, G_TYPE_OBJECT); + +struct _GAppLaunchContextPrivate { + char **envp; +}; + +/** + * 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_finalize (GObject *object) +{ + GAppLaunchContext *context = G_APP_LAUNCH_CONTEXT (object); + + g_strfreev (context->priv->envp); + + G_OBJECT_CLASS (g_app_launch_context_parent_class)->finalize (object); +} + +static void +g_app_launch_context_class_init (GAppLaunchContextClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GAppLaunchContextPrivate)); + + object_class->finalize = g_app_launch_context_finalize; + + /* + * GAppLaunchContext::launch-failed: + * @context: the object emitting the signal + * @startup_notify_id: the startup notification id for the failed launch + * + * The ::launch-failed signal is emitted when a #GAppInfo launch + * fails. The startup notification id is provided, so that the launcher + * can cancel the startup notification. + * + * Since: 2.36 + */ + signals[LAUNCH_FAILED] = g_signal_new ("launch-failed", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GAppLaunchContextClass, launch_failed), + NULL, NULL, NULL, + G_TYPE_NONE, 1, G_TYPE_STRING); + + /* + * GAppLaunchContext::launched: + * @context: the object emitting the signal + * @info: the #GAppInfo that was just launched + * @platform_data: additional platform-specific data for this launch + * + * The ::launched signal is emitted when a #GAppInfo is successfully + * launched. The @platform_data is an GVariant dictionary mapping + * strings to variants (ie a{sv}), which contains additional, + * platform-specific data about this launch. On UNIX, at least the + * "pid" and "startup-notification-id" keys will be present. + * + * Since: 2.36 + */ + signals[LAUNCHED] = g_signal_new ("launched", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GAppLaunchContextClass, launched), + NULL, NULL, NULL, + G_TYPE_NONE, 2, + G_TYPE_APP_INFO, G_TYPE_VARIANT); +} + +static void +g_app_launch_context_init (GAppLaunchContext *context) +{ + context->priv = G_TYPE_INSTANCE_GET_PRIVATE (context, G_TYPE_APP_LAUNCH_CONTEXT, GAppLaunchContextPrivate); +} + +/** + * g_app_launch_context_setenv: + * @context: a #GAppLaunchContext + * @variable: the environment variable to set + * @value: the value for to set the variable to. + * + * Arranges for @variable to be set to @value in the child's + * environment when @context is used to launch an application. + * + * Since: 2.32 + */ +void +g_app_launch_context_setenv (GAppLaunchContext *context, + const char *variable, + const char *value) +{ + if (!context->priv->envp) + context->priv->envp = g_get_environ (); + + context->priv->envp = + g_environ_setenv (context->priv->envp, variable, value, TRUE); +} + +/** + * g_app_launch_context_unsetenv: + * @context: a #GAppLaunchContext + * @variable: the environment variable to remove + * + * Arranges for @variable to be unset in the child's environment + * when @context is used to launch an application. + * + * Since: 2.32 + */ +void +g_app_launch_context_unsetenv (GAppLaunchContext *context, + const char *variable) +{ + if (!context->priv->envp) + context->priv->envp = g_get_environ (); + + context->priv->envp = + g_environ_unsetenv (context->priv->envp, variable); +} + +/** + * g_app_launch_context_get_environment: + * @context: a #GAppLaunchContext + * + * Gets the complete environment variable list to be passed to + * the child process when @context is used to launch an application. + * This is a %NULL-terminated array of strings, where each string has + * the form KEY=VALUE. + * + * Return value: (array zero-terminated=1) (transfer full): the + * child's environment + * + * Since: 2.32 + */ +char ** +g_app_launch_context_get_environment (GAppLaunchContext *context) +{ + if (!context->priv->envp) + context->priv->envp = g_get_environ (); + + return g_strdupv (context->priv->envp); +} + +/** + * g_app_launch_context_get_display: + * @context: a #GAppLaunchContext + * @info: a #GAppInfo + * @files: (element-type GFile): a #GList of #GFile objects + * + * Gets the display string for the @context. This is used to ensure new + * applications are started on the same display as the launching + * application, by setting the DISPLAY environment variable. + * + * 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: (element-type GFile): 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) +{ + g_return_if_fail (G_IS_APP_LAUNCH_CONTEXT (context)); + g_return_if_fail (startup_notify_id != NULL); + + g_signal_emit (context, signals[LAUNCH_FAILED], 0, startup_notify_id); +} diff --git a/gio/gappinfo.h b/gio/gappinfo.h new file mode 100644 index 0000000..baed4c4 --- /dev/null +++ b/gio/gappinfo.h @@ -0,0 +1,301 @@ +/* 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_APP_INFO_H__ +#define __G_APP_INFO_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 + * @set_as_last_used_for_type: Sets the application as the last used. See g_app_info_set_as_last_used_for_type(). + * + * 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 *files, + 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); + gboolean (* set_as_last_used_for_type) (GAppInfo *appinfo, + const char *content_type, + GError **error); + const char ** (* get_supported_types) (GAppInfo *appinfo); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_app_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GAppInfo * g_app_info_create_from_commandline (const char *commandline, + const char *application_name, + GAppInfoCreateFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +GAppInfo * g_app_info_dup (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_equal (GAppInfo *appinfo1, + GAppInfo *appinfo2); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_id (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_name (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_display_name (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_description (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_executable (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +const char *g_app_info_get_commandline (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +GIcon * g_app_info_get_icon (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_launch (GAppInfo *appinfo, + GList *files, + GAppLaunchContext *launch_context, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_supports_uris (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_supports_files (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_should_show (GAppInfo *appinfo); + +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_set_as_default_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_set_as_default_for_extension (GAppInfo *appinfo, + const char *extension, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_add_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_can_remove_supports_type (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_remove_supports_type (GAppInfo *appinfo, + const char *content_type, + GError **error); +GLIB_AVAILABLE_IN_2_34 +const char **g_app_info_get_supported_types (GAppInfo *appinfo); + +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_can_delete (GAppInfo *appinfo); +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_delete (GAppInfo *appinfo); + +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_set_as_last_used_for_type (GAppInfo *appinfo, + const char *content_type, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GList * g_app_info_get_all (void); +GLIB_AVAILABLE_IN_ALL +GList * g_app_info_get_all_for_type (const char *content_type); +GLIB_AVAILABLE_IN_ALL +GList * g_app_info_get_recommended_for_type (const gchar *content_type); +GLIB_AVAILABLE_IN_ALL +GList * g_app_info_get_fallback_for_type (const gchar *content_type); + +GLIB_AVAILABLE_IN_ALL +void g_app_info_reset_type_associations (const char *content_type); +GLIB_AVAILABLE_IN_ALL +GAppInfo *g_app_info_get_default_for_type (const char *content_type, + gboolean must_support_uris); +GLIB_AVAILABLE_IN_ALL +GAppInfo *g_app_info_get_default_for_uri_scheme (const char *uri_scheme); + +GLIB_AVAILABLE_IN_ALL +gboolean g_app_info_launch_default_for_uri (const char *uri, + GAppLaunchContext *launch_context, + GError **error); + +/** + * 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. + */ +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); + void (* launched) (GAppLaunchContext *context, + GAppInfo *info, + GVariant *platform_data); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_app_launch_context_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GAppLaunchContext *g_app_launch_context_new (void); + +GLIB_AVAILABLE_IN_2_32 +void g_app_launch_context_setenv (GAppLaunchContext *context, + const char *variable, + const char *value); +GLIB_AVAILABLE_IN_2_32 +void g_app_launch_context_unsetenv (GAppLaunchContext *context, + const char *variable); +GLIB_AVAILABLE_IN_2_32 +char ** g_app_launch_context_get_environment (GAppLaunchContext *context); + +GLIB_AVAILABLE_IN_ALL +char * g_app_launch_context_get_display (GAppLaunchContext *context, + GAppInfo *info, + GList *files); +GLIB_AVAILABLE_IN_ALL +char * g_app_launch_context_get_startup_notify_id (GAppLaunchContext *context, + GAppInfo *info, + GList *files); +GLIB_AVAILABLE_IN_ALL +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/gapplication.c b/gio/gapplication.c new file mode 100644 index 0000000..29a5149 --- /dev/null +++ b/gio/gapplication.c @@ -0,0 +1,1851 @@ +/* + * 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 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 + */ + +/* Prologue {{{1 */ +#include "config.h" + +#include "gapplication.h" + +#include "gapplicationcommandline.h" +#include "gsimpleactiongroup.h" +#include "gremoteactiongroup.h" +#include "gapplicationimpl.h" +#include "gactiongroup.h" +#include "gactionmap.h" +#include "gmenumodel.h" +#include "gsettings.h" + +#include "gioenumtypes.h" +#include "gioenums.h" +#include "gfile.h" + +#include "glibintl.h" + +#include + +/** + * SECTION:gapplication + * @title: GApplication + * @short_description: Core application class + * + * A #GApplication is the foundation of an application. It wraps some + * low-level platform-specific services and is intended to act as the + * foundation for higher-level application classes such as + * #GtkApplication or #MxApplication. In general, you should not use + * this class outside of a higher level framework. + * + * GApplication provides convenient life cycle management by maintaining + * a use count for the primary application instance. + * The use count can be changed using g_application_hold() and + * g_application_release(). If it drops to zero, the application exits. + * Higher-level classes such as #GtkApplication employ the use count to + * ensure that the application stays alive as long as it has any opened + * windows. + * + * Another feature that GApplication (optionally) provides is process + * uniqueness. Applications can make use of this functionality by + * providing a unique application ID. If given, only one application + * with this ID can be running at a time per session. The session + * concept is platform-dependent, but corresponds roughly to a graphical + * desktop login. When your application is launched again, its + * arguments are passed through platform communication to the already + * running program. The already running instance of the program is + * called the primary instance; for non-unique + * applications this is the always the current instance. + * On Linux, the D-Bus session bus is used for communication. + * + * The use of #GApplication differs from some other commonly-used + * uniqueness libraries (such as libunique) in important ways. The + * application is not expected to manually register itself and check if + * it is the primary instance. Instead, the main() + * function of a #GApplication should do very little more than + * instantiating the application instance, possibly connecting signal + * handlers, then calling g_application_run(). All checks for + * uniqueness are done internally. If the application is the primary + * instance then the startup signal is emitted and the mainloop runs. + * If the application is not the primary instance then a signal is sent + * to the primary instance and g_application_run() promptly returns. + * See the code examples below. + * + * If used, the expected form of an application identifier is very close + * to that of of a + * DBus bus name. + * Examples include: "com.example.MyApp", "org.example.internal-apps.Calculator". + * For details on valid application identifiers, see g_application_id_is_valid(). + * + * On Linux, the application identifier is claimed as a well-known bus name + * on the user's session bus. This means that the uniqueness of your + * application is scoped to the current session. It also means that your + * application may provide additional services (through registration of other + * object paths) at that bus name. The registration of these object paths + * should be done with the shared GDBus session bus. Note that due to the + * internal architecture of GDBus, method calls can be dispatched at any time + * (even if a main loop is not running). For this reason, you must ensure that + * any object paths that you wish to register are registered before #GApplication + * attempts to acquire the bus name of your application (which happens in + * g_application_register()). Unfortunately, this means that you cannot use + * g_application_get_is_remote() to decide if you want to register object paths. + * + * GApplication also implements the #GActionGroup and #GActionMap + * interfaces and lets you easily export actions by adding them with + * g_action_map_add_action(). When invoking an action by calling + * g_action_group_activate_action() on the application, it is always + * invoked in the primary instance. The actions are also exported on + * the session bus, and GIO provides the #GDBusActionGroup wrapper to + * conveniently access them remotely. GIO provides a #GDBusMenuModel wrapper + * for remote access to exported #GMenuModels. + * + * There is a number of different entry points into a GApplication: + * + * via 'Activate' (i.e. just starting the application) + * via 'Open' (i.e. opening some files) + * by handling a command-line + * via activating an action + * + * The #GApplication::startup signal lets you handle the application + * initialization for all of these in a single place. + * + * Regardless of which of these entry points is used to start the application, + * GApplication passes some platform + * data from the launching instance to the primary instance, + * in the form of a #GVariant dictionary mapping strings to variants. + * To use platform data, override the @before_emit or @after_emit virtual + * functions in your #GApplication subclass. When dealing with + * #GApplicationCommandLine objects, the platform data is directly + * available via g_application_command_line_get_cwd(), + * g_application_command_line_get_environ() and + * g_application_command_line_get_platform_data(). + * + * As the name indicates, the platform data may vary depending on the + * operating system, but it always includes the current directory (key + * "cwd"), and optionally the environment (ie the set of environment + * variables and their values) of the calling process (key "environ"). + * The environment is only added to the platform data if the + * %G_APPLICATION_SEND_ENVIRONMENT flag is set. #GApplication subclasses + * can add their own platform data by overriding the @add_platform_data + * virtual function. For instance, #GtkApplication adds startup notification + * data in this way. + * + * To parse commandline arguments you may handle the + * #GApplication::command-line signal or override the local_command_line() + * vfunc, to parse them in either the primary instance or the local instance, + * respectively. + * + * Opening files with a GApplication + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + * + * A GApplication with actions + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + * + * A GApplication with menus + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + * + * Using extra D-Bus hooks with a GApplication + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + */ + +/** + * GApplicationClass: + * @startup: invoked on the primary instance immediately after registration + * @shutdown: invoked only on the registered primary instance immediately + * after the main loop terminates + * @activate: invoked on the primary instance when an activation occurs + * @open: invoked on the primary instance when there are files to open + * @command_line: invoked on the primary instance when a command-line is + * not handled locally + * @local_command_line: invoked (locally) when the process has been invoked + * via commandline execution (as opposed to, say, D-Bus activation - which + * is not currently supported by GApplication). The virtual function has + * the chance to inspect (and possibly replace) the list of command line + * arguments. See g_application_run() for more information. + * @before_emit: invoked on the primary instance before 'activate', 'open', + * 'command-line' or any action invocation, gets the 'platform data' from + * the calling instance + * @after_emit: invoked on the primary instance after 'activate', 'open', + * 'command-line' or any action invocation, gets the 'platform data' from + * the calling instance + * @add_platform_data: invoked (locally) to add 'platform data' to be sent to + * the primary instance when activating, opening or invoking actions + * @quit_mainloop: Used to be invoked on the primary instance when the use + * count of the application drops to zero (and after any inactivity + * timeout, if requested). Not used anymore since 2.32 + * @run_mainloop: Used to be invoked on the primary instance from + * g_application_run() if the use-count is non-zero. Since 2.32, + * GApplication is iterating the main context directly and is not + * using @run_mainloop anymore + * @dbus_register: invoked locally during registration, if the application is + * using its D-Bus backend. You can use this to export extra objects on the + * bus, that need to exist before the application tries to own the bus name. + * The function is passed the #GDBusConnection to to session bus, and the + * object path that #GApplication will use to export is D-Bus API. + * If this function returns %TRUE, registration will proceed; otherwise + * registration will abort. Since: 2.34 + * @dbus_unregister: invoked locally during unregistration, if the application + * is using its D-Bus backend. Use this to undo anything done by the + * @dbus_register vfunc. Since: 2.34 + * + * Virtual function table for #GApplication. + * + * Since: 2.28 + */ + +struct _GApplicationPrivate +{ + GApplicationFlags flags; + gchar *id; + + GActionGroup *actions; + GMenuModel *app_menu; + GMenuModel *menubar; + + guint inactivity_timeout_id; + guint inactivity_timeout; + guint use_count; + + guint is_registered : 1; + guint is_remote : 1; + guint did_startup : 1; + guint did_shutdown : 1; + guint must_quit_now : 1; + + GRemoteActionGroup *remote_actions; + GApplicationImpl *impl; +}; + +enum +{ + PROP_NONE, + PROP_APPLICATION_ID, + PROP_FLAGS, + PROP_IS_REGISTERED, + PROP_IS_REMOTE, + PROP_INACTIVITY_TIMEOUT, + PROP_ACTION_GROUP +}; + +enum +{ + SIGNAL_STARTUP, + SIGNAL_SHUTDOWN, + SIGNAL_ACTIVATE, + SIGNAL_OPEN, + SIGNAL_ACTION, + SIGNAL_COMMAND_LINE, + NR_SIGNALS +}; + +static guint g_application_signals[NR_SIGNALS]; + +static void g_application_action_group_iface_init (GActionGroupInterface *); +static void g_application_action_map_iface_init (GActionMapInterface *); +G_DEFINE_TYPE_WITH_CODE (GApplication, g_application, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_application_action_group_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, g_application_action_map_iface_init)) + +/* GApplicationExportedActions {{{1 */ + +/* We create a subclass of GSimpleActionGroup that implements + * GRemoteActionGroup and deals with the platform data using + * GApplication's before/after_emit vfuncs. This is the action group we + * will be exporting. + * + * We could implement GRemoteActionGroup on GApplication directly, but + * this would be potentially extremely confusing to have exposed as part + * of the public API of GApplication. We certainly don't want anyone in + * the same process to be calling these APIs... + */ +typedef GSimpleActionGroupClass GApplicationExportedActionsClass; +typedef struct +{ + GSimpleActionGroup parent_instance; + GApplication *application; +} GApplicationExportedActions; + +static GType g_application_exported_actions_get_type (void); +static void g_application_exported_actions_iface_init (GRemoteActionGroupInterface *iface); +G_DEFINE_TYPE_WITH_CODE (GApplicationExportedActions, g_application_exported_actions, G_TYPE_SIMPLE_ACTION_GROUP, + G_IMPLEMENT_INTERFACE (G_TYPE_REMOTE_ACTION_GROUP, g_application_exported_actions_iface_init)) + +static void +g_application_exported_actions_activate_action_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *parameter, + GVariant *platform_data) +{ + GApplicationExportedActions *exported = (GApplicationExportedActions *) remote; + + G_APPLICATION_GET_CLASS (exported->application) + ->before_emit (exported->application, platform_data); + + g_action_group_activate_action (G_ACTION_GROUP (exported), action_name, parameter); + + G_APPLICATION_GET_CLASS (exported->application) + ->after_emit (exported->application, platform_data); +} + +static void +g_application_exported_actions_change_action_state_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *value, + GVariant *platform_data) +{ + GApplicationExportedActions *exported = (GApplicationExportedActions *) remote; + + G_APPLICATION_GET_CLASS (exported->application) + ->before_emit (exported->application, platform_data); + + g_action_group_change_action_state (G_ACTION_GROUP (exported), action_name, value); + + G_APPLICATION_GET_CLASS (exported->application) + ->after_emit (exported->application, platform_data); +} + +static void +g_application_exported_actions_init (GApplicationExportedActions *actions) +{ +} + +static void +g_application_exported_actions_iface_init (GRemoteActionGroupInterface *iface) +{ + iface->activate_action_full = g_application_exported_actions_activate_action_full; + iface->change_action_state_full = g_application_exported_actions_change_action_state_full; +} + +static void +g_application_exported_actions_class_init (GApplicationExportedActionsClass *class) +{ +} + +static GActionGroup * +g_application_exported_actions_new (GApplication *application) +{ + GApplicationExportedActions *actions; + + actions = g_object_new (g_application_exported_actions_get_type (), NULL); + actions->application = application; + + return G_ACTION_GROUP (actions); +} + +/* vfunc defaults {{{1 */ +static void +g_application_real_before_emit (GApplication *application, + GVariant *platform_data) +{ +} + +static void +g_application_real_after_emit (GApplication *application, + GVariant *platform_data) +{ +} + +static void +g_application_real_startup (GApplication *application) +{ + application->priv->did_startup = TRUE; +} + +static void +g_application_real_shutdown (GApplication *application) +{ + application->priv->did_shutdown = TRUE; +} + +static void +g_application_real_activate (GApplication *application) +{ + if (!g_signal_has_handler_pending (application, + g_application_signals[SIGNAL_ACTIVATE], + 0, TRUE) && + G_APPLICATION_GET_CLASS (application)->activate == g_application_real_activate) + { + static gboolean warned; + + if (warned) + return; + + g_warning ("Your application does not implement " + "g_application_activate() and has no handlers connected " + "to the 'activate' signal. It should do one of these."); + warned = TRUE; + } +} + +static void +g_application_real_open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint) +{ + if (!g_signal_has_handler_pending (application, + g_application_signals[SIGNAL_OPEN], + 0, TRUE) && + G_APPLICATION_GET_CLASS (application)->open == g_application_real_open) + { + static gboolean warned; + + if (warned) + return; + + g_warning ("Your application claims to support opening files " + "but does not implement g_application_open() and has no " + "handlers connected to the 'open' signal."); + warned = TRUE; + } +} + +static int +g_application_real_command_line (GApplication *application, + GApplicationCommandLine *cmdline) +{ + if (!g_signal_has_handler_pending (application, + g_application_signals[SIGNAL_COMMAND_LINE], + 0, TRUE) && + G_APPLICATION_GET_CLASS (application)->command_line == g_application_real_command_line) + { + static gboolean warned; + + if (warned) + return 1; + + g_warning ("Your application claims to support custom command line " + "handling but does not implement g_application_command_line() " + "and has no handlers connected to the 'command-line' signal."); + + warned = TRUE; + } + + return 1; +} + +static gboolean +g_application_real_local_command_line (GApplication *application, + gchar ***arguments, + int *exit_status) +{ + if (application->priv->flags & G_APPLICATION_HANDLES_COMMAND_LINE) + return FALSE; + + else + { + GError *error = NULL; + gint n_args; + + if (!g_application_register (application, NULL, &error)) + { + g_critical ("%s", error->message); + g_error_free (error); + *exit_status = 1; + return TRUE; + } + + n_args = g_strv_length (*arguments); + + if (application->priv->flags & G_APPLICATION_IS_SERVICE) + { + if ((*exit_status = n_args > 1)) + { + g_printerr ("GApplication service mode takes no arguments.\n"); + application->priv->flags &= ~G_APPLICATION_IS_SERVICE; + } + + return TRUE; + } + + if (n_args <= 1) + { + g_application_activate (application); + *exit_status = 0; + } + + else + { + if (~application->priv->flags & G_APPLICATION_HANDLES_OPEN) + { + g_critical ("This application can not open files."); + *exit_status = 1; + } + else + { + GFile **files; + gint n_files; + gint i; + + n_files = n_args - 1; + files = g_new (GFile *, n_files); + + for (i = 0; i < n_files; i++) + files[i] = g_file_new_for_commandline_arg ((*arguments)[i + 1]); + + g_application_open (application, files, n_files, ""); + + for (i = 0; i < n_files; i++) + g_object_unref (files[i]); + g_free (files); + + *exit_status = 0; + } + } + + return TRUE; + } +} + +static void +g_application_real_add_platform_data (GApplication *application, + GVariantBuilder *builder) +{ +} + +static gboolean +g_application_real_dbus_register (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + return TRUE; +} + +static void +g_application_real_dbus_unregister (GApplication *application, + GDBusConnection *connection, + const gchar *object_path) +{ +} + +/* GObject implementation stuff {{{1 */ +static void +g_application_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GApplication *application = G_APPLICATION (object); + + switch (prop_id) + { + case PROP_APPLICATION_ID: + g_application_set_application_id (application, + g_value_get_string (value)); + break; + + case PROP_FLAGS: + g_application_set_flags (application, g_value_get_flags (value)); + break; + + case PROP_INACTIVITY_TIMEOUT: + g_application_set_inactivity_timeout (application, + g_value_get_uint (value)); + break; + + case PROP_ACTION_GROUP: + g_clear_object (&application->priv->actions); + application->priv->actions = g_value_dup_object (value); + break; + + default: + g_assert_not_reached (); + } +} + +/** + * g_application_set_action_group: + * @application: a #GApplication + * @action_group: (allow-none): a #GActionGroup, or %NULL + * + * This used to be how actions were associated with a #GApplication. + * Now there is #GActionMap for that. + * + * Since: 2.28 + * + * Deprecated:2.32:Use the #GActionMap interface instead. Never ever + * mix use of this API with use of #GActionMap on the same @application + * or things will go very badly wrong. This function is known to + * introduce buggy behaviour (ie: signals not emitted on changes to the + * action group), so you should really use #GActionMap instead. + **/ +void +g_application_set_action_group (GApplication *application, + GActionGroup *action_group) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + g_return_if_fail (!application->priv->is_registered); + + if (application->priv->actions != NULL) + g_object_unref (application->priv->actions); + + application->priv->actions = action_group; + + if (application->priv->actions != NULL) + g_object_ref (application->priv->actions); +} + +static void +g_application_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GApplication *application = G_APPLICATION (object); + + switch (prop_id) + { + case PROP_APPLICATION_ID: + g_value_set_string (value, + g_application_get_application_id (application)); + break; + + case PROP_FLAGS: + g_value_set_flags (value, + g_application_get_flags (application)); + break; + + case PROP_IS_REGISTERED: + g_value_set_boolean (value, + g_application_get_is_registered (application)); + break; + + case PROP_IS_REMOTE: + g_value_set_boolean (value, + g_application_get_is_remote (application)); + break; + + case PROP_INACTIVITY_TIMEOUT: + g_value_set_uint (value, + g_application_get_inactivity_timeout (application)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_application_constructed (GObject *object) +{ + GApplication *application = G_APPLICATION (object); + + if (g_application_get_default () == NULL) + g_application_set_default (application); +} + +static void +g_application_finalize (GObject *object) +{ + GApplication *application = G_APPLICATION (object); + + if (application->priv->impl) + g_application_impl_destroy (application->priv->impl); + g_free (application->priv->id); + + if (g_application_get_default () == application) + g_application_set_default (NULL); + + if (application->priv->actions) + g_object_unref (application->priv->actions); + + G_OBJECT_CLASS (g_application_parent_class) + ->finalize (object); +} + +static void +g_application_init (GApplication *application) +{ + application->priv = G_TYPE_INSTANCE_GET_PRIVATE (application, + G_TYPE_APPLICATION, + GApplicationPrivate); + + application->priv->actions = g_application_exported_actions_new (application); + + /* application->priv->actions is the one and only ref on the group, so when + * we dispose, the action group will die, disconnecting all signals. + */ + g_signal_connect_swapped (application->priv->actions, "action-added", + G_CALLBACK (g_action_group_action_added), application); + g_signal_connect_swapped (application->priv->actions, "action-enabled-changed", + G_CALLBACK (g_action_group_action_enabled_changed), application); + g_signal_connect_swapped (application->priv->actions, "action-state-changed", + G_CALLBACK (g_action_group_action_state_changed), application); + g_signal_connect_swapped (application->priv->actions, "action-removed", + G_CALLBACK (g_action_group_action_removed), application); +} + +static void +g_application_class_init (GApplicationClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->constructed = g_application_constructed; + object_class->finalize = g_application_finalize; + object_class->get_property = g_application_get_property; + object_class->set_property = g_application_set_property; + + class->before_emit = g_application_real_before_emit; + class->after_emit = g_application_real_after_emit; + class->startup = g_application_real_startup; + class->shutdown = g_application_real_shutdown; + class->activate = g_application_real_activate; + class->open = g_application_real_open; + class->command_line = g_application_real_command_line; + class->local_command_line = g_application_real_local_command_line; + class->add_platform_data = g_application_real_add_platform_data; + class->dbus_register = g_application_real_dbus_register; + class->dbus_unregister = g_application_real_dbus_unregister; + + g_object_class_install_property (object_class, PROP_APPLICATION_ID, + g_param_spec_string ("application-id", + P_("Application identifier"), + P_("The unique identifier for the application"), + NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Application flags"), + P_("Flags specifying the behaviour of the application"), + G_TYPE_APPLICATION_FLAGS, G_APPLICATION_FLAGS_NONE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_IS_REGISTERED, + g_param_spec_boolean ("is-registered", + P_("Is registered"), + P_("If g_application_register() has been called"), + FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_IS_REMOTE, + g_param_spec_boolean ("is-remote", + P_("Is remote"), + P_("If this application instance is remote"), + FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_INACTIVITY_TIMEOUT, + g_param_spec_uint ("inactivity-timeout", + P_("Inactivity timeout"), + P_("Time (ms) to stay alive after becoming idle"), + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_ACTION_GROUP, + g_param_spec_object ("action-group", + P_("Action group"), + P_("The group of actions that the application exports"), + G_TYPE_ACTION_GROUP, + G_PARAM_DEPRECATED | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GApplication::startup: + * @application: the application + * + * The ::startup signal is emitted on the primary instance immediately + * after registration. See g_application_register(). + */ + g_application_signals[SIGNAL_STARTUP] = + g_signal_new ("startup", G_TYPE_APPLICATION, G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GApplicationClass, startup), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * GApplication::shutdown: + * @application: the application + * + * The ::shutdown signal is emitted only on the registered primary instance + * immediately after the main loop terminates. + */ + g_application_signals[SIGNAL_SHUTDOWN] = + g_signal_new ("shutdown", G_TYPE_APPLICATION, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GApplicationClass, shutdown), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * GApplication::activate: + * @application: the application + * + * The ::activate signal is emitted on the primary instance when an + * activation occurs. See g_application_activate(). + */ + g_application_signals[SIGNAL_ACTIVATE] = + g_signal_new ("activate", G_TYPE_APPLICATION, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GApplicationClass, activate), + NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + + /** + * GApplication::open: + * @application: the application + * @files: (array length=n_files) (element-type GFile): an array of #GFiles + * @n_files: the length of @files + * @hint: a hint provided by the calling instance + * + * The ::open signal is emitted on the primary instance when there are + * files to open. See g_application_open() for more information. + */ + g_application_signals[SIGNAL_OPEN] = + g_signal_new ("open", G_TYPE_APPLICATION, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GApplicationClass, open), + NULL, NULL, NULL, + G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_INT, G_TYPE_STRING); + + /** + * GApplication::command-line: + * @application: the application + * @command_line: a #GApplicationCommandLine representing the + * passed commandline + * + * The ::command-line signal is emitted on the primary instance when + * a commandline is not handled locally. See g_application_run() and + * the #GApplicationCommandLine documentation for more information. + * + * Returns: An integer that is set as the exit status for the calling + * process. See g_application_command_line_set_exit_status(). + */ + g_application_signals[SIGNAL_COMMAND_LINE] = + g_signal_new ("command-line", G_TYPE_APPLICATION, G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GApplicationClass, command_line), + g_signal_accumulator_first_wins, NULL, + NULL, + G_TYPE_INT, 1, G_TYPE_APPLICATION_COMMAND_LINE); + + g_type_class_add_private (class, sizeof (GApplicationPrivate)); +} + +static GVariant * +get_platform_data (GApplication *application) +{ + GVariantBuilder *builder; + GVariant *result; + + builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); + + { + gchar *cwd = g_get_current_dir (); + g_variant_builder_add (builder, "{sv}", "cwd", + g_variant_new_bytestring (cwd)); + g_free (cwd); + } + + if (application->priv->flags & G_APPLICATION_SEND_ENVIRONMENT) + { + GVariant *array; + gchar **envp; + + envp = g_get_environ (); + array = g_variant_new_bytestring_array ((const gchar **) envp, -1); + g_strfreev (envp); + + g_variant_builder_add (builder, "{sv}", "environ", array); + } + + G_APPLICATION_GET_CLASS (application)-> + add_platform_data (application, builder); + + result = g_variant_builder_end (builder); + g_variant_builder_unref (builder); + + return result; +} + +/* Application ID validity {{{1 */ + +/** + * g_application_id_is_valid: + * @application_id: a potential application identifier + * + * Checks if @application_id is a valid application identifier. + * + * A valid ID is required for calls to g_application_new() and + * g_application_set_application_id(). + * + * For convenience, the restrictions on application identifiers are + * reproduced here: + * + * Application identifiers must contain only the ASCII characters "[A-Z][a-z][0-9]_-." and must not begin with a digit. + * Application identifiers must contain at least one '.' (period) character (and thus at least three elements). + * Application identifiers must not begin or end with a '.' (period) character. + * Application identifiers must not contain consecutive '.' (period) characters. + * Application identifiers must not exceed 255 characters. + * + * + * Returns: %TRUE if @application_id is valid + **/ +gboolean +g_application_id_is_valid (const gchar *application_id) +{ + gsize len; + gboolean allow_dot; + gboolean has_dot; + + len = strlen (application_id); + + if (len > 255) + return FALSE; + + if (!g_ascii_isalpha (application_id[0])) + return FALSE; + + if (application_id[len-1] == '.') + return FALSE; + + application_id++; + allow_dot = TRUE; + has_dot = FALSE; + for (; *application_id; application_id++) + { + if (g_ascii_isalnum (*application_id) || + (*application_id == '-') || + (*application_id == '_')) + { + allow_dot = TRUE; + } + else if (allow_dot && *application_id == '.') + { + has_dot = TRUE; + allow_dot = FALSE; + } + else + return FALSE; + } + + if (!has_dot) + return FALSE; + + return TRUE; +} + +/* Public Constructor {{{1 */ +/** + * g_application_new: + * @application_id: (allow-none): the application id + * @flags: the application flags + * + * Creates a new #GApplication instance. + * + * If non-%NULL, the application id must be valid. See + * g_application_id_is_valid(). + * + * If no application ID is given then some features of #GApplication + * (most notably application uniqueness) will be disabled. + * + * Returns: a new #GApplication instance + **/ +GApplication * +g_application_new (const gchar *application_id, + GApplicationFlags flags) +{ + g_return_val_if_fail (application_id == NULL || g_application_id_is_valid (application_id), NULL); + + return g_object_new (G_TYPE_APPLICATION, + "application-id", application_id, + "flags", flags, + NULL); +} + +/* Simple get/set: application id, flags, inactivity timeout {{{1 */ +/** + * g_application_get_application_id: + * @application: a #GApplication + * + * Gets the unique identifier for @application. + * + * Returns: the identifier for @application, owned by @application + * + * Since: 2.28 + **/ +const gchar * +g_application_get_application_id (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), NULL); + + return application->priv->id; +} + +/** + * g_application_set_application_id: + * @application: a #GApplication + * @application_id: (allow-none): the identifier for @application + * + * Sets the unique identifier for @application. + * + * The application id can only be modified if @application has not yet + * been registered. + * + * If non-%NULL, the application id must be valid. See + * g_application_id_is_valid(). + * + * Since: 2.28 + **/ +void +g_application_set_application_id (GApplication *application, + const gchar *application_id) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + if (g_strcmp0 (application->priv->id, application_id) != 0) + { + g_return_if_fail (application_id == NULL || g_application_id_is_valid (application_id)); + g_return_if_fail (!application->priv->is_registered); + + g_free (application->priv->id); + application->priv->id = g_strdup (application_id); + + g_object_notify (G_OBJECT (application), "application-id"); + } +} + +/** + * g_application_get_flags: + * @application: a #GApplication + * + * Gets the flags for @application. + * + * See #GApplicationFlags. + * + * Returns: the flags for @application + * + * Since: 2.28 + **/ +GApplicationFlags +g_application_get_flags (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), 0); + + return application->priv->flags; +} + +/** + * g_application_set_flags: + * @application: a #GApplication + * @flags: the flags for @application + * + * Sets the flags for @application. + * + * The flags can only be modified if @application has not yet been + * registered. + * + * See #GApplicationFlags. + * + * Since: 2.28 + **/ +void +g_application_set_flags (GApplication *application, + GApplicationFlags flags) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + if (application->priv->flags != flags) + { + g_return_if_fail (!application->priv->is_registered); + + application->priv->flags = flags; + + g_object_notify (G_OBJECT (application), "flags"); + } +} + +/** + * g_application_get_inactivity_timeout: + * @application: a #GApplication + * + * Gets the current inactivity timeout for the application. + * + * This is the amount of time (in milliseconds) after the last call to + * g_application_release() before the application stops running. + * + * Returns: the timeout, in milliseconds + * + * Since: 2.28 + **/ +guint +g_application_get_inactivity_timeout (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), 0); + + return application->priv->inactivity_timeout; +} + +/** + * g_application_set_inactivity_timeout: + * @application: a #GApplication + * @inactivity_timeout: the timeout, in milliseconds + * + * Sets the current inactivity timeout for the application. + * + * This is the amount of time (in milliseconds) after the last call to + * g_application_release() before the application stops running. + * + * This call has no side effects of its own. The value set here is only + * used for next time g_application_release() drops the use count to + * zero. Any timeouts currently in progress are not impacted. + * + * Since: 2.28 + **/ +void +g_application_set_inactivity_timeout (GApplication *application, + guint inactivity_timeout) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + if (application->priv->inactivity_timeout != inactivity_timeout) + { + application->priv->inactivity_timeout = inactivity_timeout; + + g_object_notify (G_OBJECT (application), "inactivity-timeout"); + } +} +/* Read-only property getters (is registered, is remote, dbus stuff) {{{1 */ +/** + * g_application_get_is_registered: + * @application: a #GApplication + * + * Checks if @application is registered. + * + * An application is registered if g_application_register() has been + * successfully called. + * + * Returns: %TRUE if @application is registered + * + * Since: 2.28 + **/ +gboolean +g_application_get_is_registered (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), FALSE); + + return application->priv->is_registered; +} + +/** + * g_application_get_is_remote: + * @application: a #GApplication + * + * Checks if @application is remote. + * + * If @application is remote then it means that another instance of + * application already exists (the 'primary' instance). Calls to + * perform actions on @application will result in the actions being + * performed by the primary instance. + * + * The value of this property cannot be accessed before + * g_application_register() has been called. See + * g_application_get_is_registered(). + * + * Returns: %TRUE if @application is remote + * + * Since: 2.28 + **/ +gboolean +g_application_get_is_remote (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), FALSE); + g_return_val_if_fail (application->priv->is_registered, FALSE); + + return application->priv->is_remote; +} + +/** + * g_application_get_dbus_connection: + * @application: a #GApplication + * + * Gets the #GDBusConnection being used by the application, or %NULL. + * + * If #GApplication is using its D-Bus backend then this function will + * return the #GDBusConnection being used for uniqueness and + * communication with the desktop environment and other instances of the + * application. + * + * If #GApplication is not using D-Bus then this function will return + * %NULL. This includes the situation where the D-Bus backend would + * normally be in use but we were unable to connect to the bus. + * + * This function must not be called before the application has been + * registered. See g_application_get_is_registered(). + * + * Returns: (transfer none): a #GDBusConnection, or %NULL + * + * Since: 2.34 + **/ +GDBusConnection * +g_application_get_dbus_connection (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), FALSE); + g_return_val_if_fail (application->priv->is_registered, FALSE); + + return g_application_impl_get_dbus_connection (application->priv->impl); +} + +/** + * g_application_get_dbus_object_path: + * @application: a #GApplication + * + * Gets the D-Bus object path being used by the application, or %NULL. + * + * If #GApplication is using its D-Bus backend then this function will + * return the D-Bus object path that #GApplication is using. If the + * application is the primary instance then there is an object published + * at this path. If the application is not the primary instance then + * the result of this function is undefined. + * + * If #GApplication is not using D-Bus then this function will return + * %NULL. This includes the situation where the D-Bus backend would + * normally be in use but we were unable to connect to the bus. + * + * This function must not be called before the application has been + * registered. See g_application_get_is_registered(). + * + * Returns: the object path, or %NULL + * + * Since: 2.34 + **/ +const gchar * +g_application_get_dbus_object_path (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), FALSE); + g_return_val_if_fail (application->priv->is_registered, FALSE); + + return g_application_impl_get_dbus_object_path (application->priv->impl); +} + +/* Register {{{1 */ +/** + * g_application_register: + * @application: a #GApplication + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: a pointer to a NULL #GError, or %NULL + * + * Attempts registration of the application. + * + * This is the point at which the application discovers if it is the + * primary instance or merely acting as a remote for an already-existing + * primary instance. This is implemented by attempting to acquire the + * application identifier as a unique bus name on the session bus using + * GDBus. + * + * If there is no application ID or if %G_APPLICATION_NON_UNIQUE was + * given, then this process will always become the primary instance. + * + * Due to the internal architecture of GDBus, method calls can be + * dispatched at any time (even if a main loop is not running). For + * this reason, you must ensure that any object paths that you wish to + * register are registered before calling this function. + * + * If the application has already been registered then %TRUE is + * returned with no work performed. + * + * The #GApplication::startup signal is emitted if registration succeeds + * and @application is the primary instance (including the non-unique + * case). + * + * In the event of an error (such as @cancellable being cancelled, or a + * failure to connect to the session bus), %FALSE is returned and @error + * is set appropriately. + * + * Note: the return value of this function is not an indicator that this + * instance is or is not the primary instance of the application. See + * g_application_get_is_remote() for that. + * + * Returns: %TRUE if registration succeeded + * + * Since: 2.28 + **/ +gboolean +g_application_register (GApplication *application, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), FALSE); + + if (!application->priv->is_registered) + { + if (application->priv->id == NULL) + application->priv->flags |= G_APPLICATION_NON_UNIQUE; + + application->priv->impl = + g_application_impl_register (application, application->priv->id, + application->priv->flags, + application->priv->actions, + &application->priv->remote_actions, + cancellable, error); + + if (application->priv->impl == NULL) + return FALSE; + + application->priv->is_remote = application->priv->remote_actions != NULL; + application->priv->is_registered = TRUE; + + g_object_notify (G_OBJECT (application), "is-registered"); + + if (!application->priv->is_remote) + { + g_signal_emit (application, g_application_signals[SIGNAL_STARTUP], 0); + + if (!application->priv->did_startup) + g_critical ("GApplication subclass '%s' failed to chain up on" + " ::startup (from start of override function)", + G_OBJECT_TYPE_NAME (application)); + } + } + + return TRUE; +} + +/* Hold/release {{{1 */ +/** + * g_application_hold: + * @application: a #GApplication + * + * Increases the use count of @application. + * + * Use this function to indicate that the application has a reason to + * continue to run. For example, g_application_hold() is called by GTK+ + * when a toplevel window is on the screen. + * + * To cancel the hold, call g_application_release(). + **/ +void +g_application_hold (GApplication *application) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + if (application->priv->inactivity_timeout_id) + { + g_source_remove (application->priv->inactivity_timeout_id); + application->priv->inactivity_timeout_id = 0; + } + + application->priv->use_count++; +} + +static gboolean +inactivity_timeout_expired (gpointer data) +{ + GApplication *application = G_APPLICATION (data); + + application->priv->inactivity_timeout_id = 0; + + return G_SOURCE_REMOVE; +} + + +/** + * g_application_release: + * @application: a #GApplication + * + * Decrease the use count of @application. + * + * When the use count reaches zero, the application will stop running. + * + * Never call this function except to cancel the effect of a previous + * call to g_application_hold(). + **/ +void +g_application_release (GApplication *application) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + application->priv->use_count--; + + if (application->priv->use_count == 0 && application->priv->inactivity_timeout) + application->priv->inactivity_timeout_id = g_timeout_add (application->priv->inactivity_timeout, + inactivity_timeout_expired, application); +} + +/* Activate, Open {{{1 */ +/** + * g_application_activate: + * @application: a #GApplication + * + * Activates the application. + * + * In essence, this results in the #GApplication::activate signal being + * emitted in the primary instance. + * + * The application must be registered before calling this function. + * + * Since: 2.28 + **/ +void +g_application_activate (GApplication *application) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + g_return_if_fail (application->priv->is_registered); + + if (application->priv->is_remote) + g_application_impl_activate (application->priv->impl, + get_platform_data (application)); + + else + g_signal_emit (application, g_application_signals[SIGNAL_ACTIVATE], 0); +} + +/** + * g_application_open: + * @application: a #GApplication + * @files: (array length=n_files): an array of #GFiles to open + * @n_files: the length of the @files array + * @hint: a hint (or ""), but never %NULL + * + * Opens the given files. + * + * In essence, this results in the #GApplication::open signal being emitted + * in the primary instance. + * + * @n_files must be greater than zero. + * + * @hint is simply passed through to the ::open signal. It is + * intended to be used by applications that have multiple modes for + * opening files (eg: "view" vs "edit", etc). Unless you have a need + * for this functionality, you should use "". + * + * The application must be registered before calling this function + * and it must have the %G_APPLICATION_HANDLES_OPEN flag set. + * + * Since: 2.28 + **/ +void +g_application_open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + g_return_if_fail (application->priv->flags & + G_APPLICATION_HANDLES_OPEN); + g_return_if_fail (application->priv->is_registered); + + if (application->priv->is_remote) + g_application_impl_open (application->priv->impl, + files, n_files, hint, + get_platform_data (application)); + + else + g_signal_emit (application, g_application_signals[SIGNAL_OPEN], + 0, files, n_files, hint); +} + +/* Run {{{1 */ +/** + * g_application_run: + * @application: a #GApplication + * @argc: the argc from main() (or 0 if @argv is %NULL) + * @argv: (array length=argc) (allow-none): the argv from main(), or %NULL + * + * Runs the application. + * + * This function is intended to be run from main() and its return value + * is intended to be returned by main(). Although you are expected to pass + * the @argc, @argv parameters from main() to this function, it is possible + * to pass %NULL if @argv is not available or commandline handling is not + * required. + * + * First, the local_command_line() virtual function is invoked. + * This function always runs on the local instance. It gets passed a pointer + * to a %NULL-terminated copy of @argv and is expected to remove the arguments + * that it handled (shifting up remaining arguments). See + * for an example of + * parsing @argv manually. Alternatively, you may use the #GOptionContext API, + * after setting argc = g_strv_length (argv);. + * + * The last argument to local_command_line() is a pointer to the @status + * variable which can used to set the exit status that is returned from + * g_application_run(). + * + * If local_command_line() returns %TRUE, the command line is expected + * to be completely handled, including possibly registering as the primary + * instance, calling g_application_activate() or g_application_open(), etc. + * + * If local_command_line() returns %FALSE then the application is registered + * and the #GApplication::command-line signal is emitted in the primary + * instance (which may or may not be this instance). The signal handler + * gets passed a #GApplicationCommandLine object that (among other things) + * contains the remaining commandline arguments that have not been handled + * by local_command_line(). + * + * If the application has the %G_APPLICATION_HANDLES_COMMAND_LINE + * flag set then the default implementation of local_command_line() + * always returns %FALSE immediately, resulting in the commandline + * always being handled in the primary instance. + * + * Otherwise, the default implementation of local_command_line() tries + * to do a couple of things that are probably reasonable for most + * applications. First, g_application_register() is called to attempt + * to register the application. If that works, then the command line + * arguments are inspected. If no commandline arguments are given, then + * g_application_activate() is called. If commandline arguments are + * given and the %G_APPLICATION_HANDLES_OPEN flag is set then they + * are assumed to be filenames and g_application_open() is called. + * + * If you need to handle commandline arguments that are not filenames, + * and you don't mind commandline handling to happen in the primary + * instance, you should set %G_APPLICATION_HANDLES_COMMAND_LINE and + * process the commandline arguments in your #GApplication::command-line + * signal handler, either manually or using the #GOptionContext API. + * + * If you are interested in doing more complicated local handling of the + * commandline then you should implement your own #GApplication subclass + * and override local_command_line(). In this case, you most likely want + * to return %TRUE from your local_command_line() implementation to + * suppress the default handling. See + * for an example. + * + * If, after the above is done, the use count of the application is zero + * then the exit status is returned immediately. If the use count is + * non-zero then the default main context is iterated until the use count + * falls to zero, at which point 0 is returned. + * + * If the %G_APPLICATION_IS_SERVICE flag is set, then the exiting at + * use count of zero is delayed for a while (ie: the instance stays + * around to provide its service to others). + * + * Returns: the exit status + * + * Since: 2.28 + **/ +int +g_application_run (GApplication *application, + int argc, + char **argv) +{ + gchar **arguments; + int status; + gint i; + + g_return_val_if_fail (G_IS_APPLICATION (application), 1); + g_return_val_if_fail (argc == 0 || argv != NULL, 1); + g_return_val_if_fail (!application->priv->must_quit_now, 1); + + arguments = g_new (gchar *, argc + 1); + for (i = 0; i < argc; i++) + arguments[i] = g_strdup (argv[i]); + arguments[i] = NULL; + + if (g_get_prgname () == NULL && argc > 0) + { + gchar *prgname; + + prgname = g_path_get_basename (argv[0]); + g_set_prgname (prgname); + g_free (prgname); + } + + if (!G_APPLICATION_GET_CLASS (application) + ->local_command_line (application, &arguments, &status)) + { + GError *error = NULL; + + if (!g_application_register (application, NULL, &error)) + { + g_printerr ("%s", error->message); + g_error_free (error); + return 1; + } + + if (application->priv->is_remote) + { + GVariant *platform_data; + + platform_data = get_platform_data (application); + status = g_application_impl_command_line (application->priv->impl, + arguments, platform_data); + } + else + { + GApplicationCommandLine *cmdline; + GVariant *v; + + v = g_variant_new_bytestring_array ((const gchar **) arguments, -1); + cmdline = g_object_new (G_TYPE_APPLICATION_COMMAND_LINE, + "arguments", v, NULL); + g_signal_emit (application, + g_application_signals[SIGNAL_COMMAND_LINE], + 0, cmdline, &status); + g_object_unref (cmdline); + } + } + + g_strfreev (arguments); + + if (application->priv->flags & G_APPLICATION_IS_SERVICE && + application->priv->is_registered && + !application->priv->use_count && + !application->priv->inactivity_timeout_id) + { + application->priv->inactivity_timeout_id = + g_timeout_add (10000, inactivity_timeout_expired, application); + } + + while (application->priv->use_count || application->priv->inactivity_timeout_id) + { + if (application->priv->must_quit_now) + break; + + g_main_context_iteration (NULL, TRUE); + status = 0; + } + + if (application->priv->is_registered && !application->priv->is_remote) + { + g_signal_emit (application, g_application_signals[SIGNAL_SHUTDOWN], 0); + + if (!application->priv->did_shutdown) + g_critical ("GApplication subclass '%s' failed to chain up on" + " ::shutdown (from end of override function)", + G_OBJECT_TYPE_NAME (application)); + } + + if (application->priv->impl) + g_application_impl_flush (application->priv->impl); + + g_settings_sync (); + + return status; +} + +static gchar ** +g_application_list_actions (GActionGroup *action_group) +{ + GApplication *application = G_APPLICATION (action_group); + + g_return_val_if_fail (application->priv->is_registered, NULL); + + if (application->priv->remote_actions != NULL) + return g_action_group_list_actions (G_ACTION_GROUP (application->priv->remote_actions)); + + else if (application->priv->actions != NULL) + return g_action_group_list_actions (application->priv->actions); + + else + /* empty string array */ + return g_new0 (gchar *, 1); +} + +static gboolean +g_application_query_action (GActionGroup *group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + GApplication *application = G_APPLICATION (group); + + g_return_val_if_fail (application->priv->is_registered, FALSE); + + if (application->priv->remote_actions != NULL) + return g_action_group_query_action (G_ACTION_GROUP (application->priv->remote_actions), + action_name, + enabled, + parameter_type, + state_type, + state_hint, + state); + + if (application->priv->actions != NULL) + return g_action_group_query_action (application->priv->actions, + action_name, + enabled, + parameter_type, + state_type, + state_hint, + state); + + return FALSE; +} + +static void +g_application_change_action_state (GActionGroup *action_group, + const gchar *action_name, + GVariant *value) +{ + GApplication *application = G_APPLICATION (action_group); + + g_return_if_fail (application->priv->is_remote || + application->priv->actions != NULL); + g_return_if_fail (application->priv->is_registered); + + if (application->priv->remote_actions) + g_remote_action_group_change_action_state_full (application->priv->remote_actions, + action_name, value, get_platform_data (application)); + + else + g_action_group_change_action_state (application->priv->actions, action_name, value); +} + +static void +g_application_activate_action (GActionGroup *action_group, + const gchar *action_name, + GVariant *parameter) +{ + GApplication *application = G_APPLICATION (action_group); + + g_return_if_fail (application->priv->is_remote || + application->priv->actions != NULL); + g_return_if_fail (application->priv->is_registered); + + if (application->priv->remote_actions) + g_remote_action_group_activate_action_full (application->priv->remote_actions, + action_name, parameter, get_platform_data (application)); + + else + g_action_group_activate_action (application->priv->actions, action_name, parameter); +} + +static GAction * +g_application_lookup_action (GActionMap *action_map, + const gchar *action_name) +{ + GApplication *application = G_APPLICATION (action_map); + + g_return_val_if_fail (G_IS_SIMPLE_ACTION_GROUP (application->priv->actions), NULL); + + return g_simple_action_group_lookup (G_SIMPLE_ACTION_GROUP (application->priv->actions), action_name); +} + +static void +g_application_add_action (GActionMap *action_map, + GAction *action) +{ + GApplication *application = G_APPLICATION (action_map); + + g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (application->priv->actions)); + + g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (application->priv->actions), action); +} + +static void +g_application_remove_action (GActionMap *action_map, + const gchar *action_name) +{ + GApplication *application = G_APPLICATION (action_map); + + g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (application->priv->actions)); + + g_simple_action_group_remove (G_SIMPLE_ACTION_GROUP (application->priv->actions), action_name); +} + +static void +g_application_action_group_iface_init (GActionGroupInterface *iface) +{ + iface->list_actions = g_application_list_actions; + iface->query_action = g_application_query_action; + iface->change_action_state = g_application_change_action_state; + iface->activate_action = g_application_activate_action; +} + +static void +g_application_action_map_iface_init (GActionMapInterface *iface) +{ + iface->lookup_action = g_application_lookup_action; + iface->add_action = g_application_add_action; + iface->remove_action = g_application_remove_action; +} + +/* Default Application {{{1 */ + +static GApplication *default_app; + +/** + * g_application_get_default: + * + * Returns the default #GApplication instance for this process. + * + * Normally there is only one #GApplication per process and it becomes + * the default when it is created. You can exercise more control over + * this by using g_application_set_default(). + * + * If there is no default application then %NULL is returned. + * + * Returns: (transfer none): the default application for this process, or %NULL + * + * Since: 2.32 + **/ +GApplication * +g_application_get_default (void) +{ + return default_app; +} + +/** + * g_application_set_default: + * @application: (allow-none): the application to set as default, or %NULL + * + * Sets or unsets the default application for the process, as returned + * by g_application_get_default(). + * + * This function does not take its own reference on @application. If + * @application is destroyed then the default application will revert + * back to %NULL. + * + * Since: 2.32 + **/ +void +g_application_set_default (GApplication *application) +{ + default_app = application; +} + +/** + * g_application_quit: + * @application: a #GApplication + * + * Immediately quits the application. + * + * Upon return to the mainloop, g_application_run() will return, + * calling only the 'shutdown' function before doing so. + * + * The hold count is ignored. + * + * The result of calling g_application_run() again after it returns is + * unspecified. + * + * Since: 2.32 + **/ +void +g_application_quit (GApplication *application) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + + application->priv->must_quit_now = TRUE; +} + +/* Epilogue {{{1 */ +/* vim:set foldmethod=marker: */ diff --git a/gio/gapplication.h b/gio/gapplication.h new file mode 100644 index 0000000..7829892 --- /dev/null +++ b/gio/gapplication.h @@ -0,0 +1,201 @@ +/* + * 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 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_APPLICATION_H__ +#define __G_APPLICATION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_APPLICATION (g_application_get_type ()) +#define G_APPLICATION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_APPLICATION, GApplication)) +#define G_APPLICATION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_APPLICATION, GApplicationClass)) +#define G_IS_APPLICATION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_APPLICATION)) +#define G_IS_APPLICATION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_APPLICATION)) +#define G_APPLICATION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_APPLICATION, GApplicationClass)) + +typedef struct _GApplicationPrivate GApplicationPrivate; +typedef struct _GApplicationClass GApplicationClass; + +/** + * GApplication: + * + * Since: 2.28 + */ +struct _GApplication +{ + /*< private >*/ + GObject parent_instance; + + GApplicationPrivate *priv; +}; + +struct _GApplicationClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* signals */ + void (* startup) (GApplication *application); + + void (* activate) (GApplication *application); + + void (* open) (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint); + + int (* command_line) (GApplication *application, + GApplicationCommandLine *command_line); + + /* vfuncs */ + + /** + * GApplicationClass::local_command_line: + * @application: a #GApplication + * @arguments: (inout) (array zero-terminated=1): array of command line arguments + * @exit_status: (out): exit status to fill after processing the command line. + * + * This virtual function is always invoked in the local instance. It + * gets passed a pointer to a %NULL-terminated copy of @argv and is + * expected to remove arguments that it handled (shifting up remaining + * arguments). + * + * The last argument to local_command_line() is a pointer to the @status + * variable which can used to set the exit status that is returned from + * g_application_run(). + * + * See g_application_run() for more details on #GApplication startup. + * + * Returns: %TRUE if the commandline has been completely handled + */ + gboolean (* local_command_line) (GApplication *application, + gchar ***arguments, + int *exit_status); + + void (* before_emit) (GApplication *application, + GVariant *platform_data); + void (* after_emit) (GApplication *application, + GVariant *platform_data); + void (* add_platform_data) (GApplication *application, + GVariantBuilder *builder); + void (* quit_mainloop) (GApplication *application); + void (* run_mainloop) (GApplication *application); + void (* shutdown) (GApplication *application); + + gboolean (* dbus_register) (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error); + void (* dbus_unregister) (GApplication *application, + GDBusConnection *connection, + const gchar *object_path); + + /*< private >*/ + gpointer padding[9]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_application_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_application_id_is_valid (const gchar *application_id); + +GLIB_AVAILABLE_IN_ALL +GApplication * g_application_new (const gchar *application_id, + GApplicationFlags flags); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_application_get_application_id (GApplication *application); +GLIB_AVAILABLE_IN_ALL +void g_application_set_application_id (GApplication *application, + const gchar *application_id); + +GLIB_AVAILABLE_IN_2_34 +GDBusConnection * g_application_get_dbus_connection (GApplication *application); +GLIB_AVAILABLE_IN_2_34 +const gchar * g_application_get_dbus_object_path (GApplication *application); + +GLIB_AVAILABLE_IN_ALL +guint g_application_get_inactivity_timeout (GApplication *application); +GLIB_AVAILABLE_IN_ALL +void g_application_set_inactivity_timeout (GApplication *application, + guint inactivity_timeout); + +GLIB_AVAILABLE_IN_ALL +GApplicationFlags g_application_get_flags (GApplication *application); +GLIB_AVAILABLE_IN_ALL +void g_application_set_flags (GApplication *application, + GApplicationFlags flags); + +GLIB_DEPRECATED +void g_application_set_action_group (GApplication *application, + GActionGroup *action_group); + +GLIB_AVAILABLE_IN_ALL +gboolean g_application_get_is_registered (GApplication *application); +GLIB_AVAILABLE_IN_ALL +gboolean g_application_get_is_remote (GApplication *application); + +GLIB_AVAILABLE_IN_ALL +gboolean g_application_register (GApplication *application, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_application_hold (GApplication *application); +GLIB_AVAILABLE_IN_ALL +void g_application_release (GApplication *application); + +GLIB_AVAILABLE_IN_ALL +void g_application_activate (GApplication *application); + +GLIB_AVAILABLE_IN_ALL +void g_application_open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint); + +GLIB_AVAILABLE_IN_ALL +int g_application_run (GApplication *application, + int argc, + char **argv); + +GLIB_AVAILABLE_IN_2_32 +void g_application_quit (GApplication *application); + +GLIB_AVAILABLE_IN_2_32 +GApplication * g_application_get_default (void); +GLIB_AVAILABLE_IN_2_32 +void g_application_set_default (GApplication *application); + +G_END_DECLS + +#endif /* __G_APPLICATION_H__ */ diff --git a/gio/gapplicationcommandline.c b/gio/gapplicationcommandline.c new file mode 100644 index 0000000..c1fbbb7 --- /dev/null +++ b/gio/gapplicationcommandline.c @@ -0,0 +1,699 @@ +/* + * 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 + * 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 + */ + +#include "config.h" + +#include "gapplicationcommandline.h" + +#include "glibintl.h" +#include "gfile.h" + +#include +#include + +#ifdef G_OS_UNIX +#include "gunixinputstream.h" +#endif + +#ifdef G_OS_WIN32 +#include +#undef environ +#include "gwin32inputstream.h" +#endif + +G_DEFINE_TYPE (GApplicationCommandLine, g_application_command_line, G_TYPE_OBJECT) + +/** + * SECTION:gapplicationcommandline + * @title: GApplicationCommandLine + * @short_description: A command-line invocation of an application + * @see_also: #GApplication + * + * #GApplicationCommandLine represents a command-line invocation of + * an application. It is created by #GApplication and emitted + * in the #GApplication::command-line signal and virtual function. + * + * The class contains the list of arguments that the program was invoked + * with. It is also possible to query if the commandline invocation was + * local (ie: the current process is running in direct response to the + * invocation) or remote (ie: some other process forwarded the + * commandline to this process). + * + * The GApplicationCommandLine object can provide the @argc and @argv + * parameters for use with the #GOptionContext command-line parsing API, + * with the g_application_command_line_get_arguments() function. See + * for an example. + * + * The exit status of the originally-invoked process may be set and + * messages can be printed to stdout or stderr of that process. The + * lifecycle of the originally-invoked process is tied to the lifecycle + * of this object (ie: the process exits when the last reference is + * dropped). + * + * The main use for #GApplicationCommandLine (and the + * #GApplication::command-line signal) is 'Emacs server' like use cases: + * You can set the EDITOR environment variable to have + * e.g. git use your favourite editor to edit commit messages, and if you + * already have an instance of the editor running, the editing will happen + * in the running instance, instead of opening a new one. An important + * aspect of this use case is that the process that gets started by git + * does not return until the editing is done. + * + * Handling commandline arguments with GApplication + * + * A simple example where the commandline is completely handled + * in the #GApplication::command-line handler. The launching instance exits + * once the signal handler in the primary instance has returned, and the + * return value of the signal handler becomes the exit status of the launching + * instance. + * + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + * + * Split commandline handling + * + * An example of split commandline handling. Options that start with + * --local- are handled locally, all other options are + * passed to the #GApplication::command-line handler which runs in the primary + * instance. + * + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + * + * Deferred commandline handling + * + * An example of deferred commandline handling. Here, the commandline is + * not completely handled before the #GApplication::command-line handler + * returns. Instead, we keep a reference to the GApplicationCommandLine + * object and handle it later(in this example, in an idle). Note that it + * is necessary to hold the application until you are done with the + * commandline. + * + * + * This example also shows how to use #GOptionContext for parsing the + * commandline arguments. Note that it is necessary to disable the + * built-in help-handling of #GOptionContext, since it calls exit() + * after printing help, which is not what you want to happen in + * the primary instance. + * + * + * + * FIXME: MISSING XINCLUDE CONTENT + * + * + * + **/ + +/** + * GApplicationCommandLineClass: + * + * The GApplicationCommandLineClass structure + * contains private data only + * + * Since: 2.28 + **/ +enum +{ + PROP_NONE, + PROP_ARGUMENTS, + PROP_PLATFORM_DATA, + PROP_IS_REMOTE +}; + +struct _GApplicationCommandLinePrivate +{ + GVariant *platform_data; + GVariant *arguments; + gchar *cwd; + + gchar **environ; + gint exit_status; +}; + +/* All subclasses represent remote invocations of some kind. */ +#define IS_REMOTE(cmdline) (G_TYPE_FROM_INSTANCE (cmdline) != \ + G_TYPE_APPLICATION_COMMAND_LINE) + +static void +grok_platform_data (GApplicationCommandLine *cmdline) +{ + GVariantIter iter; + const gchar *key; + GVariant *value; + + g_variant_iter_init (&iter, cmdline->priv->platform_data); + + while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) + if (strcmp (key, "cwd") == 0) + { + if (!cmdline->priv->cwd) + cmdline->priv->cwd = g_variant_dup_bytestring (value, NULL); + } + + else if (strcmp (key, "environ") == 0) + { + if (!cmdline->priv->environ) + cmdline->priv->environ = + g_variant_dup_bytestring_array (value, NULL); + } +} + +static void +g_application_command_line_real_print_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + g_print ("%s", message); +} + +static void +g_application_command_line_real_printerr_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + g_printerr ("%s", message); +} + +static GInputStream * +g_application_command_line_real_get_stdin (GApplicationCommandLine *cmdline) +{ +#ifdef G_OS_UNIX + return g_unix_input_stream_new (0, FALSE); +#else + return g_win32_input_stream_new (GetStdHandle (STD_INPUT_HANDLE), FALSE); +#endif +} + +static void +g_application_command_line_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + + switch (prop_id) + { + case PROP_ARGUMENTS: + g_value_set_variant (value, cmdline->priv->arguments); + break; + + case PROP_PLATFORM_DATA: + g_value_set_variant (value, cmdline->priv->platform_data); + break; + + case PROP_IS_REMOTE: + g_value_set_boolean (value, IS_REMOTE (cmdline)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_application_command_line_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + + switch (prop_id) + { + case PROP_ARGUMENTS: + g_assert (cmdline->priv->arguments == NULL); + cmdline->priv->arguments = g_value_dup_variant (value); + break; + + case PROP_PLATFORM_DATA: + g_assert (cmdline->priv->platform_data == NULL); + cmdline->priv->platform_data = g_value_dup_variant (value); + if (cmdline->priv->platform_data != NULL) + grok_platform_data (cmdline); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_application_command_line_finalize (GObject *object) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + + if (cmdline->priv->platform_data) + g_variant_unref (cmdline->priv->platform_data); + if (cmdline->priv->arguments) + g_variant_unref (cmdline->priv->arguments); + + g_free (cmdline->priv->cwd); + g_strfreev (cmdline->priv->environ); + + G_OBJECT_CLASS (g_application_command_line_parent_class) + ->finalize (object); +} + +static void +g_application_command_line_init (GApplicationCommandLine *cmdline) +{ + cmdline->priv = + G_TYPE_INSTANCE_GET_PRIVATE (cmdline, + G_TYPE_APPLICATION_COMMAND_LINE, + GApplicationCommandLinePrivate); +} + +static void +g_application_command_line_constructed (GObject *object) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + + if (IS_REMOTE (cmdline)) + return; + + /* In the local case, set cmd and environ */ + if (!cmdline->priv->cwd) + cmdline->priv->cwd = g_get_current_dir (); + + if (!cmdline->priv->environ) + cmdline->priv->environ = g_get_environ (); +} + +static void +g_application_command_line_class_init (GApplicationCommandLineClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->get_property = g_application_command_line_get_property; + object_class->set_property = g_application_command_line_set_property; + object_class->finalize = g_application_command_line_finalize; + object_class->constructed = g_application_command_line_constructed; + + class->printerr_literal = g_application_command_line_real_printerr_literal; + class->print_literal = g_application_command_line_real_print_literal; + class->get_stdin = g_application_command_line_real_get_stdin; + + g_object_class_install_property (object_class, PROP_ARGUMENTS, + g_param_spec_variant ("arguments", + P_("Commandline arguments"), + P_("The commandline that caused this ::command-line signal emission"), + G_VARIANT_TYPE_BYTESTRING_ARRAY, NULL, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_PLATFORM_DATA, + g_param_spec_variant ("platform-data", + P_("Platform data"), + P_("Platform-specific data for the commandline"), + G_VARIANT_TYPE ("a{sv}"), NULL, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_IS_REMOTE, + g_param_spec_boolean ("is-remote", + P_("Is remote"), + P_("TRUE if this is a remote commandline"), + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_type_class_add_private (class, sizeof (GApplicationCommandLinePrivate)); +} + + +/** + * g_application_command_line_get_arguments: + * @cmdline: a #GApplicationCommandLine + * @argc: (out) (allow-none): the length of the arguments array, or %NULL + * + * Gets the list of arguments that was passed on the command line. + * + * The strings in the array may contain non-utf8 data. + * + * The return value is %NULL-terminated and should be freed using + * g_strfreev(). + * + * Returns: (array length=argc) (transfer full): the string array + * containing the arguments (the argv) + * + * Since: 2.28 + **/ +gchar ** +g_application_command_line_get_arguments (GApplicationCommandLine *cmdline, + int *argc) +{ + gchar **argv; + gsize len; + + g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline), NULL); + + argv = g_variant_dup_bytestring_array (cmdline->priv->arguments, &len); + + if (argc) + *argc = len; + + return argv; +} + +/** + * g_application_command_line_get_stdin: + * @cmdline: a #GApplicationCommandLine + * + * Gets the stdin of the invoking process. + * + * The #GInputStream can be used to read data passed to the standard + * input of the invoking process. + * This doesn't work on all platforms. Presently, it is only available + * on UNIX when using a DBus daemon capable of passing file descriptors. + * If stdin is not available then %NULL will be returned. In the + * future, support may be expanded to other platforms. + * + * You must only call this function once per commandline invocation. + * + * Returns: (transfer full): a #GInputStream for stdin + * + * Since: 2.34 + **/ +GInputStream * +g_application_command_line_get_stdin (GApplicationCommandLine *cmdline) +{ + return G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline)->get_stdin (cmdline); +} + +/** + * g_application_command_line_get_cwd: + * @cmdline: a #GApplicationCommandLine + * + * Gets the working directory of the command line invocation. + * The string may contain non-utf8 data. + * + * It is possible that the remote application did not send a working + * directory, so this may be %NULL. + * + * The return value should not be modified or freed and is valid for as + * long as @cmdline exists. + * + * Returns: the current directory, or %NULL + * + * Since: 2.28 + **/ +const gchar * +g_application_command_line_get_cwd (GApplicationCommandLine *cmdline) +{ + return cmdline->priv->cwd; +} + +/** + * g_application_command_line_get_environ: + * @cmdline: a #GApplicationCommandLine + * + * Gets the contents of the 'environ' variable of the command line + * invocation, as would be returned by g_get_environ(), ie as a + * %NULL-terminated list of strings in the form 'NAME=VALUE'. + * The strings may contain non-utf8 data. + * + * The remote application usually does not send an environment. Use + * %G_APPLICATION_SEND_ENVIRONMENT to affect that. Even with this flag + * set it is possible that the environment is still not available (due + * to invocation messages from other applications). + * + * The return value should not be modified or freed and is valid for as + * long as @cmdline exists. + * + * See g_application_command_line_getenv() if you are only interested + * in the value of a single environment variable. + * + * Returns: (array zero-terminated=1) (transfer none): the environment + * strings, or %NULL if they were not sent + * + * Since: 2.28 + **/ +const gchar * const * +g_application_command_line_get_environ (GApplicationCommandLine *cmdline) +{ + return (const gchar **)cmdline->priv->environ; +} + +/** + * g_application_command_line_getenv: + * @cmdline: a #GApplicationCommandLine + * @name: the environment variable to get + * + * Gets the value of a particular environment variable of the command + * line invocation, as would be returned by g_getenv(). The strings may + * contain non-utf8 data. + * + * The remote application usually does not send an environment. Use + * %G_APPLICATION_SEND_ENVIRONMENT to affect that. Even with this flag + * set it is possible that the environment is still not available (due + * to invocation messages from other applications). + * + * The return value should not be modified or freed and is valid for as + * long as @cmdline exists. + * + * Returns: the value of the variable, or %NULL if unset or unsent + * + * Since: 2.28 + **/ +const gchar * +g_application_command_line_getenv (GApplicationCommandLine *cmdline, + const gchar *name) +{ + gint length = strlen (name); + gint i; + + /* TODO: expand on windows */ + if (cmdline->priv->environ) + for (i = 0; cmdline->priv->environ[i]; i++) + if (strncmp (cmdline->priv->environ[i], name, length) == 0 && + cmdline->priv->environ[i][length] == '=') + return cmdline->priv->environ[i] + length + 1; + + return NULL; +} + +/** + * g_application_command_line_get_is_remote: + * @cmdline: a #GApplicationCommandLine + * + * Determines if @cmdline represents a remote invocation. + * + * Returns: %TRUE if the invocation was remote + * + * Since: 2.28 + **/ +gboolean +g_application_command_line_get_is_remote (GApplicationCommandLine *cmdline) +{ + return IS_REMOTE (cmdline); +} + +/** + * g_application_command_line_print: + * @cmdline: a #GApplicationCommandLine + * @format: a printf-style format string + * @...: arguments, as per @format + * + * Formats a message and prints it using the stdout print handler in the + * invoking process. + * + * If @cmdline is a local invocation then this is exactly equivalent to + * g_print(). If @cmdline is remote then this is equivalent to calling + * g_print() in the invoking process. + * + * Since: 2.28 + **/ +void +g_application_command_line_print (GApplicationCommandLine *cmdline, + const gchar *format, + ...) +{ + gchar *message; + va_list ap; + + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + g_return_if_fail (format != NULL); + + va_start (ap, format); + message = g_strdup_vprintf (format, ap); + va_end (ap); + + G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline) + ->print_literal (cmdline, message); + g_free (message); +} + +/** + * g_application_command_line_printerr: + * @cmdline: a #GApplicationCommandLine + * @format: a printf-style format string + * @...: arguments, as per @format + * + * Formats a message and prints it using the stderr print handler in the + * invoking process. + * + * If @cmdline is a local invocation then this is exactly equivalent to + * g_printerr(). If @cmdline is remote then this is equivalent to + * calling g_printerr() in the invoking process. + * + * Since: 2.28 + **/ +void +g_application_command_line_printerr (GApplicationCommandLine *cmdline, + const gchar *format, + ...) +{ + gchar *message; + va_list ap; + + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + g_return_if_fail (format != NULL); + + va_start (ap, format); + message = g_strdup_vprintf (format, ap); + va_end (ap); + + G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline) + ->printerr_literal (cmdline, message); + g_free (message); +} + +/** + * g_application_command_line_set_exit_status: + * @cmdline: a #GApplicationCommandLine + * @exit_status: the exit status + * + * Sets the exit status that will be used when the invoking process + * exits. + * + * The return value of the #GApplication::command-line signal is + * passed to this function when the handler returns. This is the usual + * way of setting the exit status. + * + * In the event that you want the remote invocation to continue running + * and want to decide on the exit status in the future, you can use this + * call. For the case of a remote invocation, the remote process will + * typically exit when the last reference is dropped on @cmdline. The + * exit status of the remote process will be equal to the last value + * that was set with this function. + * + * In the case that the commandline invocation is local, the situation + * is slightly more complicated. If the commandline invocation results + * in the mainloop running (ie: because the use-count of the application + * increased to a non-zero value) then the application is considered to + * have been 'successful' in a certain sense, and the exit status is + * always zero. If the application use count is zero, though, the exit + * status of the local #GApplicationCommandLine is used. + * + * Since: 2.28 + **/ +void +g_application_command_line_set_exit_status (GApplicationCommandLine *cmdline, + int exit_status) +{ + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + + cmdline->priv->exit_status = exit_status; +} + +/** + * g_application_command_line_get_exit_status: + * @cmdline: a #GApplicationCommandLine + * + * Gets the exit status of @cmdline. See + * g_application_command_line_set_exit_status() for more information. + * + * Returns: the exit status + * + * Since: 2.28 + **/ +int +g_application_command_line_get_exit_status (GApplicationCommandLine *cmdline) +{ + g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline), -1); + + return cmdline->priv->exit_status; +} + +/** + * g_application_command_line_get_platform_data: + * @cmdline: #GApplicationCommandLine + * + * Gets the platform data associated with the invocation of @cmdline. + * + * This is a #GVariant dictionary containing information about the + * context in which the invocation occurred. It typically contains + * information like the current working directory and the startup + * notification ID. + * + * For local invocation, it will be %NULL. + * + * Returns: (allow-none): the platform data, or %NULL + * + * Since: 2.28 + **/ +GVariant * +g_application_command_line_get_platform_data (GApplicationCommandLine *cmdline) +{ + g_return_val_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline), NULL); + + if (cmdline->priv->platform_data) + return g_variant_ref (cmdline->priv->platform_data); + else + return NULL; +} + +/** + * g_application_command_line_create_file_for_arg: + * @cmdline: a #GApplicationCommandLine + * @arg: an argument from @cmdline + * + * Creates a #GFile corresponding to a filename that was given as part + * of the invocation of @cmdline. + * + * This differs from g_file_new_for_commandline_arg() in that it + * resolves relative pathnames using the current working directory of + * the invoking process rather than the local process. + * + * Returns: (transfer full): a new #GFile + * + * Since: 2.36 + **/ +GFile * +g_application_command_line_create_file_for_arg (GApplicationCommandLine *cmdline, + const gchar *arg) +{ + g_return_val_if_fail (arg != NULL, NULL); + + if (cmdline->priv->cwd) + return g_file_new_for_commandline_arg_and_cwd (arg, cmdline->priv->cwd); + + g_warning ("Requested creation of GFile for commandline invocation that did not send cwd. " + "Using cwd of local process to resolve relative path names."); + + return g_file_new_for_commandline_arg (arg); +} diff --git a/gio/gapplicationcommandline.h b/gio/gapplicationcommandline.h new file mode 100644 index 0000000..5f70d65 --- /dev/null +++ b/gio/gapplicationcommandline.h @@ -0,0 +1,121 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * 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 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_APPLICATION_COMMAND_LINE_H__ +#define __G_APPLICATION_COMMAND_LINE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_APPLICATION_COMMAND_LINE (g_application_command_line_get_type ()) +#define G_APPLICATION_COMMAND_LINE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_APPLICATION_COMMAND_LINE, \ + GApplicationCommandLine)) +#define G_APPLICATION_COMMAND_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_APPLICATION_COMMAND_LINE, \ + GApplicationCommandLineClass)) +#define G_IS_APPLICATION_COMMAND_LINE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_APPLICATION_COMMAND_LINE)) +#define G_IS_APPLICATION_COMMAND_LINE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_APPLICATION_COMMAND_LINE)) +#define G_APPLICATION_COMMAND_LINE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_APPLICATION_COMMAND_LINE, \ + GApplicationCommandLineClass)) + +typedef struct _GApplicationCommandLinePrivate GApplicationCommandLinePrivate; +typedef struct _GApplicationCommandLineClass GApplicationCommandLineClass; + +struct _GApplicationCommandLine +{ + /*< private >*/ + GObject parent_instance; + + GApplicationCommandLinePrivate *priv; +}; + +struct _GApplicationCommandLineClass +{ + /*< private >*/ + GObjectClass parent_class; + + void (* print_literal) (GApplicationCommandLine *cmdline, + const gchar *message); + void (* printerr_literal) (GApplicationCommandLine *cmdline, + const gchar *message); + GInputStream * (* get_stdin) (GApplicationCommandLine *cmdline); + + gpointer padding[11]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_application_command_line_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gchar ** g_application_command_line_get_arguments (GApplicationCommandLine *cmdline, + int *argc); + +GLIB_AVAILABLE_IN_2_36 +GInputStream * g_application_command_line_get_stdin (GApplicationCommandLine *cmdline); + +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_application_command_line_get_environ (GApplicationCommandLine *cmdline); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_application_command_line_getenv (GApplicationCommandLine *cmdline, + const gchar *name); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_application_command_line_get_cwd (GApplicationCommandLine *cmdline); + +GLIB_AVAILABLE_IN_ALL +gboolean g_application_command_line_get_is_remote (GApplicationCommandLine *cmdline); + +GLIB_AVAILABLE_IN_ALL +void g_application_command_line_print (GApplicationCommandLine *cmdline, + const gchar *format, + ...) G_GNUC_PRINTF(2, 3); +GLIB_AVAILABLE_IN_ALL +void g_application_command_line_printerr (GApplicationCommandLine *cmdline, + const gchar *format, + ...) G_GNUC_PRINTF(2, 3); + +GLIB_AVAILABLE_IN_ALL +int g_application_command_line_get_exit_status (GApplicationCommandLine *cmdline); +GLIB_AVAILABLE_IN_ALL +void g_application_command_line_set_exit_status (GApplicationCommandLine *cmdline, + int exit_status); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_application_command_line_get_platform_data (GApplicationCommandLine *cmdline); + +GLIB_AVAILABLE_IN_2_36 +GFile * g_application_command_line_create_file_for_arg (GApplicationCommandLine *cmdline, + const gchar *arg); + +G_END_DECLS + +#endif /* __G_APPLICATION_COMMAND_LINE_H__ */ diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c new file mode 100644 index 0000000..5afb0d0 --- /dev/null +++ b/gio/gapplicationimpl-dbus.c @@ -0,0 +1,778 @@ +/* + * 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. + * + * Authors: Ryan Lortie + */ + +#include "config.h" + +#include "gapplicationimpl.h" + +#include "gactiongroup.h" +#include "gactiongroupexporter.h" +#include "gremoteactiongroup.h" +#include "gdbusactiongroup-private.h" +#include "gapplication.h" +#include "gfile.h" +#include "gdbusconnection.h" +#include "gdbusintrospection.h" +#include "gdbuserror.h" +#include "glib/gstdio.h" + +#include +#include + +#include "gapplicationcommandline.h" +#include "gdbusmethodinvocation.h" + +#ifdef G_OS_UNIX +#include "gunixinputstream.h" +#include "gunixfdlist.h" +#endif + +/* DBus Interface definition {{{1 */ + +/* For documentation of these interfaces, see + * http://live.gnome.org/GTK+/GApplication-dbus-apis + */ +static const gchar org_gtk_Application_xml[] = + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static GDBusInterfaceInfo *org_gtk_Application; + +static const gchar org_gtk_private_CommandLine_xml[] = + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static GDBusInterfaceInfo *org_gtk_private_CommandLine; + +/* GApplication implementation {{{1 */ +struct _GApplicationImpl +{ + GDBusConnection *session_bus; + GActionGroup *exported_actions; + const gchar *bus_name; + + gchar *object_path; + guint object_id; + guint actions_id; + + gboolean properties_live; + gboolean primary; + GApplication *app; +}; + + +static GApplicationCommandLine * +g_dbus_command_line_new (GDBusMethodInvocation *invocation); + + +static void +g_application_impl_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GApplicationImpl *impl = user_data; + GApplicationClass *class; + + class = G_APPLICATION_GET_CLASS (impl->app); + + if (strcmp (method_name, "Activate") == 0) + { + GVariant *platform_data; + + g_variant_get (parameters, "(@a{sv})", &platform_data); + class->before_emit (impl->app, platform_data); + g_signal_emit_by_name (impl->app, "activate"); + class->after_emit (impl->app, platform_data); + g_variant_unref (platform_data); + + g_dbus_method_invocation_return_value (invocation, NULL); + } + + else if (strcmp (method_name, "Open") == 0) + { + GVariant *platform_data; + const gchar *hint; + GVariant *array; + GFile **files; + gint n, i; + + g_variant_get (parameters, "(@ass@a{sv})", + &array, &hint, &platform_data); + + n = g_variant_n_children (array); + files = g_new (GFile *, n + 1); + + for (i = 0; i < n; i++) + { + const gchar *uri; + + g_variant_get_child (array, i, "&s", &uri); + files[i] = g_file_new_for_uri (uri); + } + g_variant_unref (array); + files[n] = NULL; + + class->before_emit (impl->app, platform_data); + g_signal_emit_by_name (impl->app, "open", files, n, hint); + class->after_emit (impl->app, platform_data); + + g_variant_unref (platform_data); + + for (i = 0; i < n; i++) + g_object_unref (files[i]); + g_free (files); + + g_dbus_method_invocation_return_value (invocation, NULL); + } + + else if (strcmp (method_name, "CommandLine") == 0) + { + GApplicationCommandLine *cmdline; + GVariant *platform_data; + int status; + + cmdline = g_dbus_command_line_new (invocation); + platform_data = g_variant_get_child_value (parameters, 2); + class->before_emit (impl->app, platform_data); + g_signal_emit_by_name (impl->app, "command-line", cmdline, &status); + g_application_command_line_set_exit_status (cmdline, status); + class->after_emit (impl->app, platform_data); + g_variant_unref (platform_data); + g_object_unref (cmdline); + } + else + g_assert_not_reached (); +} + +static gchar * +application_path_from_appid (const gchar *appid) +{ + gchar *appid_path, *iter; + + if (appid == NULL) + /* this is a private implementation detail */ + return g_strdup ("/org/gtk/Application/anonymous"); + + appid_path = g_strconcat ("/", appid, NULL); + for (iter = appid_path; *iter; iter++) + { + if (*iter == '.') + *iter = '/'; + + if (*iter == '-') + *iter = '_'; + } + + return appid_path; +} + +/* Attempt to become the primary instance. + * + * Returns %TRUE if everything went OK, regardless of if we became the + * primary instance or not. %FALSE is reserved for when something went + * seriously wrong (and @error will be set too, in that case). + * + * After a %TRUE return, impl->primary will be TRUE if we were + * successful. + */ +static gboolean +g_application_impl_attempt_primary (GApplicationImpl *impl, + GCancellable *cancellable, + GError **error) +{ + const static GDBusInterfaceVTable vtable = { + g_application_impl_method_call, + }; + GApplicationClass *app_class = G_APPLICATION_GET_CLASS (impl->app); + GVariant *reply; + guint32 rval; + + if (org_gtk_Application == NULL) + { + GError *error = NULL; + GDBusNodeInfo *info; + + info = g_dbus_node_info_new_for_xml (org_gtk_Application_xml, &error); + if G_UNLIKELY (info == NULL) + g_error ("%s", error->message); + org_gtk_Application = g_dbus_node_info_lookup_interface (info, "org.gtk.Application"); + g_assert (org_gtk_Application != NULL); + g_dbus_interface_info_ref (org_gtk_Application); + g_dbus_node_info_unref (info); + } + + /* We could possibly have been D-Bus activated as a result of incoming + * requests on either the application or actiongroup interfaces. + * Because of how GDBus dispatches messages, we need to ensure that + * both of those things are registered before we attempt to request + * our name. + * + * The action group need not be populated yet, as long as it happens + * before we return to the mainloop. The reason for that is because + * GDBus does the check to make sure the object exists from the worker + * thread but doesn't actually dispatch the action invocation until we + * hit the mainloop in this thread. There is also no danger of + * receiving 'activate' or 'open' signals until after 'startup' runs, + * for the same reason. + */ + impl->object_id = g_dbus_connection_register_object (impl->session_bus, impl->object_path, + org_gtk_Application, &vtable, impl, NULL, error); + + if (impl->object_id == 0) + return FALSE; + + impl->actions_id = g_dbus_connection_export_action_group (impl->session_bus, impl->object_path, + impl->exported_actions, error); + + if (impl->actions_id == 0) + return FALSE; + + if (!app_class->dbus_register (impl->app, + impl->session_bus, + impl->object_path, + error)) + return FALSE; + + if (impl->bus_name == NULL) + { + /* If this is a non-unique application then it is sufficient to + * have our object paths registered. We can return now. + * + * Note: non-unique applications always act as primary-instance. + */ + impl->primary = TRUE; + return TRUE; + } + + /* If this is a unique application then we need to attempt to own + * the well-known name and fall back to remote mode (!is_primary) + * in the case that we can't do that. + */ + /* DBUS_NAME_FLAG_DO_NOT_QUEUE: 0x4 */ + reply = g_dbus_connection_call_sync (impl->session_bus, "org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "RequestName", + g_variant_new ("(su)", impl->bus_name, 0x4), G_VARIANT_TYPE ("(u)"), + 0, -1, cancellable, error); + + if (reply == NULL) + return FALSE; + + g_variant_get (reply, "(u)", &rval); + g_variant_unref (reply); + + /* DBUS_REQUEST_NAME_REPLY_EXISTS: 3 */ + impl->primary = (rval != 3); + + return TRUE; +} + +/* Stop doing the things that the primary instance does. + * + * This should be called if attempting to become the primary instance + * failed (in order to clean up any partial success) and should also + * be called when freeing the GApplication. + * + * It is safe to call this multiple times. + */ +static void +g_application_impl_stop_primary (GApplicationImpl *impl) +{ + GApplicationClass *app_class = G_APPLICATION_GET_CLASS (impl->app); + + app_class->dbus_unregister (impl->app, + impl->session_bus, + impl->object_path); + + if (impl->object_id) + { + g_dbus_connection_unregister_object (impl->session_bus, impl->object_id); + impl->object_id = 0; + } + + if (impl->actions_id) + { + g_dbus_connection_unexport_action_group (impl->session_bus, impl->actions_id); + impl->actions_id = 0; + } + + if (impl->primary && impl->bus_name) + { + g_dbus_connection_call (impl->session_bus, "org.freedesktop.DBus", + "/org/freedesktop/DBus", "org.freedesktop.DBus", + "ReleaseName", g_variant_new ("(s)", impl->bus_name), + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); + impl->primary = FALSE; + } +} + +void +g_application_impl_destroy (GApplicationImpl *impl) +{ + g_application_impl_stop_primary (impl); + + if (impl->session_bus) + g_object_unref (impl->session_bus); + + g_free (impl->object_path); + + g_slice_free (GApplicationImpl, impl); +} + +GApplicationImpl * +g_application_impl_register (GApplication *application, + const gchar *appid, + GApplicationFlags flags, + GActionGroup *exported_actions, + GRemoteActionGroup **remote_actions, + GCancellable *cancellable, + GError **error) +{ + GDBusActionGroup *actions; + GApplicationImpl *impl; + + g_assert ((flags & G_APPLICATION_NON_UNIQUE) || appid != NULL); + + impl = g_slice_new0 (GApplicationImpl); + + impl->app = application; + impl->exported_actions = exported_actions; + + /* non-unique applications do not attempt to acquire a bus name */ + if (~flags & G_APPLICATION_NON_UNIQUE) + impl->bus_name = appid; + + impl->session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, cancellable, NULL); + + if (impl->session_bus == NULL) + { + /* If we can't connect to the session bus, proceed as a normal + * non-unique application. + */ + *remote_actions = NULL; + return impl; + } + + impl->object_path = application_path_from_appid (appid); + + /* Only try to be the primary instance if + * G_APPLICATION_IS_LAUNCHER was not specified. + */ + if (~flags & G_APPLICATION_IS_LAUNCHER) + { + if (!g_application_impl_attempt_primary (impl, cancellable, error)) + { + g_application_impl_destroy (impl); + return NULL; + } + + if (impl->primary) + return impl; + + /* We didn't make it. Drop our service-side stuff. */ + g_application_impl_stop_primary (impl); + + if (flags & G_APPLICATION_IS_SERVICE) + { + g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "Unable to acquire bus name `%s'", appid); + g_application_impl_destroy (impl); + + return NULL; + } + } + + /* We are non-primary. Try to get the primary's list of actions. + * This also serves as a mechanism to ensure that the primary exists + * (ie: DBus service files installed correctly, etc). + */ + actions = g_dbus_action_group_get (impl->session_bus, impl->bus_name, impl->object_path); + if (!g_dbus_action_group_sync (actions, cancellable, error)) + { + /* The primary appears not to exist. Fail the registration. */ + g_application_impl_destroy (impl); + g_object_unref (actions); + + return NULL; + } + + *remote_actions = G_REMOTE_ACTION_GROUP (actions); + + return impl; +} + +void +g_application_impl_activate (GApplicationImpl *impl, + GVariant *platform_data) +{ + g_dbus_connection_call (impl->session_bus, + impl->bus_name, + impl->object_path, + "org.gtk.Application", + "Activate", + g_variant_new ("(@a{sv})", platform_data), + NULL, 0, -1, NULL, NULL, NULL); +} + +void +g_application_impl_open (GApplicationImpl *impl, + GFile **files, + gint n_files, + const gchar *hint, + GVariant *platform_data) +{ + GVariantBuilder builder; + gint i; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(assa{sv})")); + g_variant_builder_open (&builder, G_VARIANT_TYPE_STRING_ARRAY); + for (i = 0; i < n_files; i++) + { + gchar *uri = g_file_get_uri (files[i]); + g_variant_builder_add (&builder, "s", uri); + g_free (uri); + } + g_variant_builder_close (&builder); + g_variant_builder_add (&builder, "s", hint); + g_variant_builder_add_value (&builder, platform_data); + + g_dbus_connection_call (impl->session_bus, + impl->bus_name, + impl->object_path, + "org.gtk.Application", + "Open", + g_variant_builder_end (&builder), + NULL, 0, -1, NULL, NULL, NULL); +} + +static void +g_application_impl_cmdline_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *message; + + g_variant_get_child (parameters, 0, "&s", &message); + + if (strcmp (method_name, "Print") == 0) + g_print ("%s", message); + else if (strcmp (method_name, "PrintError") == 0) + g_printerr ("%s", message); + else + g_assert_not_reached (); + + g_dbus_method_invocation_return_value (invocation, NULL); +} + +typedef struct +{ + GMainLoop *loop; + int status; +} CommandLineData; + +static void +g_application_impl_cmdline_done (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + CommandLineData *data = user_data; + GError *error = NULL; + GVariant *reply; + +#ifdef G_OS_UNIX + reply = g_dbus_connection_call_with_unix_fd_list_finish (G_DBUS_CONNECTION (source), NULL, result, &error); +#else + reply = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error); +#endif + + + if (reply != NULL) + { + g_variant_get (reply, "(i)", &data->status); + g_variant_unref (reply); + } + + else + { + g_printerr ("%s\n", error->message); + g_error_free (error); + data->status = 1; + } + + g_main_loop_quit (data->loop); +} + +int +g_application_impl_command_line (GApplicationImpl *impl, + gchar **arguments, + GVariant *platform_data) +{ + const static GDBusInterfaceVTable vtable = { + g_application_impl_cmdline_method_call + }; + const gchar *object_path = "/org/gtk/Application/CommandLine"; + GMainContext *context; + CommandLineData data; + guint object_id; + + context = g_main_context_new (); + data.loop = g_main_loop_new (context, FALSE); + g_main_context_push_thread_default (context); + + if (org_gtk_private_CommandLine == NULL) + { + GError *error = NULL; + GDBusNodeInfo *info; + + info = g_dbus_node_info_new_for_xml (org_gtk_private_CommandLine_xml, &error); + if G_UNLIKELY (info == NULL) + g_error ("%s", error->message); + org_gtk_private_CommandLine = g_dbus_node_info_lookup_interface (info, "org.gtk.private.CommandLine"); + g_assert (org_gtk_private_CommandLine != NULL); + g_dbus_interface_info_ref (org_gtk_private_CommandLine); + g_dbus_node_info_unref (info); + } + + object_id = g_dbus_connection_register_object (impl->session_bus, object_path, + org_gtk_private_CommandLine, + &vtable, &data, NULL, NULL); + /* In theory we should try other paths... */ + g_assert (object_id != 0); + +#ifdef G_OS_UNIX + { + GError *error = NULL; + GUnixFDList *fd_list; + + /* send along the stdin in case + * g_application_command_line_get_stdin_data() is called + */ + fd_list = g_unix_fd_list_new (); + g_unix_fd_list_append (fd_list, 0, &error); + g_assert_no_error (error); + + g_dbus_connection_call_with_unix_fd_list (impl->session_bus, impl->bus_name, impl->object_path, + "org.gtk.Application", "CommandLine", + g_variant_new ("(o^aay@a{sv})", object_path, arguments, platform_data), + G_VARIANT_TYPE ("(i)"), 0, G_MAXINT, fd_list, NULL, + g_application_impl_cmdline_done, &data); + } +#else + g_dbus_connection_call (impl->session_bus, impl->bus_name, impl->object_path, + "org.gtk.Application", "CommandLine", + g_variant_new ("(o^aay@a{sv})", object_path, arguments, platform_data), + G_VARIANT_TYPE ("(i)"), 0, G_MAXINT, NULL, + g_application_impl_cmdline_done, &data); +#endif + + g_main_loop_run (data.loop); + + g_main_context_pop_thread_default (context); + g_main_context_unref (context); + g_main_loop_unref (data.loop); + + return data.status; +} + +void +g_application_impl_flush (GApplicationImpl *impl) +{ + if (impl->session_bus) + g_dbus_connection_flush_sync (impl->session_bus, NULL, NULL); +} + +GDBusConnection * +g_application_impl_get_dbus_connection (GApplicationImpl *impl) +{ + return impl->session_bus; +} + +const gchar * +g_application_impl_get_dbus_object_path (GApplicationImpl *impl) +{ + return impl->object_path; +} + +/* GDBusCommandLine implementation {{{1 */ + +typedef GApplicationCommandLineClass GDBusCommandLineClass; +static GType g_dbus_command_line_get_type (void); +typedef struct +{ + GApplicationCommandLine parent_instance; + GDBusMethodInvocation *invocation; + + GDBusConnection *connection; + const gchar *bus_name; + const gchar *object_path; +} GDBusCommandLine; + + +G_DEFINE_TYPE (GDBusCommandLine, + g_dbus_command_line, + G_TYPE_APPLICATION_COMMAND_LINE) + +static void +g_dbus_command_line_print_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + GDBusCommandLine *gdbcl = (GDBusCommandLine *) cmdline; + + g_dbus_connection_call (gdbcl->connection, + gdbcl->bus_name, + gdbcl->object_path, + "org.gtk.private.CommandLine", "Print", + g_variant_new ("(s)", message), + NULL, 0, -1, NULL, NULL, NULL); +} + +static void +g_dbus_command_line_printerr_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + GDBusCommandLine *gdbcl = (GDBusCommandLine *) cmdline; + + g_dbus_connection_call (gdbcl->connection, + gdbcl->bus_name, + gdbcl->object_path, + "org.gtk.private.CommandLine", "PrintError", + g_variant_new ("(s)", message), + NULL, 0, -1, NULL, NULL, NULL); +} + +static GInputStream * +g_dbus_command_line_get_stdin (GApplicationCommandLine *cmdline) +{ +#ifdef G_OS_UNIX + GDBusCommandLine *gdbcl = (GDBusCommandLine *) cmdline; + GInputStream *result = NULL; + GDBusMessage *message; + GUnixFDList *fd_list; + + message = g_dbus_method_invocation_get_message (gdbcl->invocation); + fd_list = g_dbus_message_get_unix_fd_list (message); + + if (fd_list && g_unix_fd_list_get_length (fd_list)) + { + gint *fds, n_fds, i; + + fds = g_unix_fd_list_steal_fds (fd_list, &n_fds); + result = g_unix_input_stream_new (fds[0], TRUE); + for (i = 1; i < n_fds; i++) + (void) g_close (fds[i], NULL); + g_free (fds); + } + + return result; +#else + return NULL; +#endif +} + +static void +g_dbus_command_line_finalize (GObject *object) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + GDBusCommandLine *gdbcl = (GDBusCommandLine *) object; + gint status; + + status = g_application_command_line_get_exit_status (cmdline); + + g_dbus_method_invocation_return_value (gdbcl->invocation, + g_variant_new ("(i)", status)); + g_object_unref (gdbcl->invocation); + + G_OBJECT_CLASS (g_dbus_command_line_parent_class) + ->finalize (object); +} + +static void +g_dbus_command_line_init (GDBusCommandLine *gdbcl) +{ +} + +static void +g_dbus_command_line_class_init (GApplicationCommandLineClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_dbus_command_line_finalize; + class->printerr_literal = g_dbus_command_line_printerr_literal; + class->print_literal = g_dbus_command_line_print_literal; + class->get_stdin = g_dbus_command_line_get_stdin; +} + +static GApplicationCommandLine * +g_dbus_command_line_new (GDBusMethodInvocation *invocation) +{ + GDBusCommandLine *gdbcl; + GVariant *args; + + args = g_dbus_method_invocation_get_parameters (invocation); + + gdbcl = g_object_new (g_dbus_command_line_get_type (), + "arguments", g_variant_get_child_value (args, 1), + "platform-data", g_variant_get_child_value (args, 2), + NULL); + gdbcl->connection = g_dbus_method_invocation_get_connection (invocation); + gdbcl->bus_name = g_dbus_method_invocation_get_sender (invocation); + g_variant_get_child (args, 0, "&o", &gdbcl->object_path); + gdbcl->invocation = g_object_ref (invocation); + + return G_APPLICATION_COMMAND_LINE (gdbcl); +} + +/* Epilogue {{{1 */ + +/* vim:set foldmethod=marker: */ diff --git a/gio/gapplicationimpl.h b/gio/gapplicationimpl.h new file mode 100644 index 0000000..8743d0f --- /dev/null +++ b/gio/gapplicationimpl.h @@ -0,0 +1,41 @@ +#include "giotypes.h" + +typedef struct _GApplicationImpl GApplicationImpl; + +typedef struct +{ + gchar *name; + + GVariantType *parameter_type; + gboolean enabled; + GVariant *state; +} RemoteActionInfo; + +void g_application_impl_destroy (GApplicationImpl *impl); + +GApplicationImpl * g_application_impl_register (GApplication *application, + const gchar *appid, + GApplicationFlags flags, + GActionGroup *exported_actions, + GRemoteActionGroup **remote_actions, + GCancellable *cancellable, + GError **error); + +void g_application_impl_activate (GApplicationImpl *impl, + GVariant *platform_data); + +void g_application_impl_open (GApplicationImpl *impl, + GFile **files, + gint n_files, + const gchar *hint, + GVariant *platform_data); + +int g_application_impl_command_line (GApplicationImpl *impl, + gchar **arguments, + GVariant *platform_data); + +void g_application_impl_flush (GApplicationImpl *impl); + +GDBusConnection * g_application_impl_get_dbus_connection (GApplicationImpl *impl); + +const gchar * g_application_impl_get_dbus_object_path (GApplicationImpl *impl); diff --git a/gio/gasynchelper.c b/gio/gasynchelper.c new file mode 100644 index 0000000..ab8bd2c --- /dev/null +++ b/gio/gasynchelper.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 "gasynchelper.h" + + +/*< private > + * SECTION:gasynchelper + * @short_description: Asynchronous Helper Functions + * @include: gio/gio.h + * @see_also: #GAsyncResult + * + * Provides helper functions for asynchronous operations. + * + **/ + +/************************************************************************* + * fd source * + ************************************************************************/ + +typedef struct +{ + GSource source; + GPollFD pollfd; +} FDSource; + +static gboolean +fd_source_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + return FALSE; +} + +static gboolean +fd_source_check (GSource *source) +{ + FDSource *fd_source = (FDSource *)source; + + return fd_source->pollfd.revents != 0; +} + +static gboolean +fd_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) + +{ + GFDSourceFunc func = (GFDSourceFunc)callback; + FDSource *fd_source = (FDSource *)source; + + g_warn_if_fail (func != NULL); + + return (*func) (fd_source->pollfd.fd, fd_source->pollfd.revents, user_data); +} + +static void +fd_source_finalize (GSource *source) +{ +} + +static gboolean +fd_source_closure_callback (int fd, + GIOCondition condition, + gpointer data) +{ + GClosure *closure = data; + + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + GValue result_value = G_VALUE_INIT; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + + g_value_init (¶ms[0], G_TYPE_INT); + g_value_set_int (¶ms[0], fd); + + 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 void +fd_source_closure_marshal (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + GFDSourceFunc callback; + GCClosure *cc = (GCClosure*) closure; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 0); + + callback = (GFDSourceFunc) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (g_value_get_int (param_values), + g_value_get_flags (param_values + 1), + closure->data); + + g_value_set_boolean (return_value, v_return); +} + +static GSourceFuncs fd_source_funcs = { + fd_source_prepare, + fd_source_check, + fd_source_dispatch, + fd_source_finalize, + (GSourceFunc)fd_source_closure_callback, + (GSourceDummyMarshal)fd_source_closure_marshal, +}; + +GSource * +_g_fd_source_new (int fd, + gushort events, + GCancellable *cancellable) +{ + GSource *source; + FDSource *fd_source; + + source = g_source_new (&fd_source_funcs, sizeof (FDSource)); + fd_source = (FDSource *)source; + + fd_source->pollfd.fd = fd; + fd_source->pollfd.events = events; + g_source_add_poll (source, &fd_source->pollfd); + + if (cancellable) + { + GSource *cancellable_source = g_cancellable_source_new (cancellable); + + g_source_set_dummy_callback (cancellable_source); + g_source_add_child_source (source, cancellable_source); + g_source_unref (cancellable_source); + } + + return source; +} + +#ifdef G_OS_WIN32 +gboolean +_g_win32_overlap_wait_result (HANDLE hfile, + OVERLAPPED *overlap, + DWORD *transferred, + GCancellable *cancellable) +{ + GPollFD pollfd[2]; + gboolean result = FALSE; + gint num, npoll; + + pollfd[0].fd = (gint)overlap->hEvent; + pollfd[0].events = G_IO_IN; + num = 1; + + if (g_cancellable_make_pollfd (cancellable, &pollfd[1])) + num++; + +loop: + npoll = g_poll (pollfd, num, -1); + if (npoll <= 0) + /* error out, should never happen */ + goto end; + + if (g_cancellable_is_cancelled (cancellable)) + { + /* CancelIO only cancels pending operations issued by the + * current thread and since we're doing only sync operations, + * this is safe.... */ + /* CancelIoEx is only Vista+. Since we have only one overlap + * operaton on this thread, we can just use: */ + result = CancelIo (hfile); + g_warn_if_fail (result); + } + + result = GetOverlappedResult (overlap->hEvent, overlap, transferred, FALSE); + if (result == FALSE && + GetLastError () == ERROR_IO_INCOMPLETE && + !g_cancellable_is_cancelled (cancellable)) + goto loop; + +end: + if (num > 1) + g_cancellable_release_fd (cancellable); + + return result; +} +#endif diff --git a/gio/gasynchelper.h b/gio/gasynchelper.h new file mode 100644 index 0000000..cbee6a6 --- /dev/null +++ b/gio/gasynchelper.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_ASYNC_HELPER_H__ +#define __G_ASYNC_HELPER_H__ + +#include + +#ifdef G_OS_WIN32 +#include +#endif + +G_BEGIN_DECLS + +typedef gboolean (*GFDSourceFunc) (int fd, + GIOCondition condition, + gpointer user_data); + +GSource *_g_fd_source_new (int fd, + gushort events, + GCancellable *cancellable); + +#ifdef G_OS_WIN32 +gboolean _g_win32_overlap_wait_result (HANDLE hfile, + OVERLAPPED *overlap, + DWORD *transferred, + GCancellable *cancellable); +#endif + +G_END_DECLS + +#endif /* __G_ASYNC_HELPER_H__ */ diff --git a/gio/gasyncinitable.c b/gio/gasyncinitable.c new file mode 100644 index 0000000..5cc60f2 --- /dev/null +++ b/gio/gasyncinitable.c @@ -0,0 +1,458 @@ +/* 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 "gtask.h" +#include "glibintl.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. + * + * A typical implementation might look something like this: + * + * |[ + * enum { + * NOT_INITIALIZED, + * INITIALIZING, + * INITIALIZED + * }; + * + * static void + * _foo_ready_cb (Foo *self) + * { + * GList *l; + * + * self->priv->state = INITIALIZED; + * + * for (l = self->priv->init_results; l != NULL; l = l->next) + * { + * GTask *task = l->data; + * + * if (self->priv->success) + * g_task_return_boolean (task, TRUE); + * else + * g_task_return_new_error (task, ...); + * g_object_unref (task); + * } + * + * g_list_free (self->priv->init_results); + * self->priv->init_results = NULL; + * } + * + * static void + * foo_init_async (GAsyncInitable *initable, + * int io_priority, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * Foo *self = FOO (initable); + * GTask *task; + * + * task = g_task_new (initable, cancellable, callback, user_data); + * + * switch (self->priv->state) + * { + * case NOT_INITIALIZED: + * _foo_get_ready (self); + * self->priv->init_results = g_list_append (self->priv->init_results, + * task); + * self->priv->state = INITIALIZING; + * break; + * case INITIALIZING: + * self->priv->init_results = g_list_append (self->priv->init_results, + * task); + * break; + * case INITIALIZED: + * if (!self->priv->success) + * g_task_return_new_error (task, ...); + * else + * g_task_return_boolean (task, TRUE); + * g_object_unref (task); + * break; + * } + * } + * + * static gboolean + * foo_init_finish (GAsyncInitable *initable, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, initable), FALSE); + * + * return g_task_propagate_boolean (G_TASK (result), error); + * } + * + * static void + * foo_async_initable_iface_init (gpointer g_iface, + * gpointer data) + * { + * GAsyncInitableIface *iface = g_iface; + * + * iface->init_async = foo_init_async; + * iface->init_finish = foo_init_finish; + * } + * ]| + */ + +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); + + +typedef GAsyncInitableIface GAsyncInitableInterface; +G_DEFINE_INTERFACE (GAsyncInitable, g_async_initable, G_TYPE_OBJECT) + + +static void +g_async_initable_default_init (GAsyncInitableInterface *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. + * + * As with #GInitable, if the object is not initialized, or initialization + * returns with an error, then all operations on the object except + * g_object_ref() and g_object_unref() are considered to be invalid, and + * have undefined behaviour. They will often fail with g_critical() or + * g_warning(), but this must not be relied on. + * + * 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 occurring, 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_async_result_legacy_propagate_error (res, error)) + return FALSE; + + iface = G_ASYNC_INITABLE_GET_IFACE (initable); + + return (* iface->init_finish) (initable, res, error); +} + +static void +async_init_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GError *error = NULL; + + if (g_initable_init (G_INITABLE (source_object), cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); +} + +static void +g_async_initable_real_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + g_return_if_fail (G_IS_INITABLE (initable)); + + task = g_task_new (initable, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, async_init_thread); + g_object_unref (task); +} + +static gboolean +g_async_initable_real_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + /* For backward compatibility we have to process GSimpleAsyncResults + * even though g_async_initable_real_init_async doesn't generate + * them any more. + */ + 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; + else + return TRUE; + } + + g_return_val_if_fail (g_task_is_valid (res, initable), FALSE); + + return g_task_propagate_boolean (G_TASK (res), error); +} + +/** + * 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: (allow-none): 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 #GAsyncInitable 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 #GAsyncInitable 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 #GAsyncInitable 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: return location for errors, 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: (type GObject.Object) (transfer full): 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; +} diff --git a/gio/gasyncinitable.h b/gio/gasyncinitable.h new file mode 100644 index 0000000..af5cfb1 --- /dev/null +++ b/gio/gasyncinitable.h @@ -0,0 +1,126 @@ +/* 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 + */ + +#ifndef __G_ASYNC_INITABLE_H__ +#define __G_ASYNC_INITABLE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_async_initable_get_type (void) G_GNUC_CONST; + + +GLIB_AVAILABLE_IN_ALL +void g_async_initable_init_async (GAsyncInitable *initable, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_async_initable_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_async_initable_new_async (GType object_type, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data, + const gchar *first_property_name, + ...); +GLIB_AVAILABLE_IN_ALL +void g_async_initable_newv_async (GType object_type, + guint n_parameters, + GParameter *parameters, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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..c86b3dc --- /dev/null +++ b/gio/gasyncresult.c @@ -0,0 +1,235 @@ +/* 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 "glibintl.h" + + +/** + * SECTION:gasyncresult + * @short_description: Asynchronous Function Results + * @include: gio/gio.h + * @see_also: #GTask + * + * 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. You can pass + * %NULL for the #GAsyncReadyCallback if you don't need to take any + * action at all after the operation completes. 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. + * + * I/O + * priority Many I/O-related asynchronous + * operations have a priority parameter, which is used in certain + * cases 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. + **/ + +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: (transfer full): 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: (transfer full): 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); +} + +/** + * g_async_result_legacy_propagate_error: + * @res: a #GAsyncResult + * @error: (out): a location to propagate the error to. + * + * If @res is a #GSimpleAsyncResult, this is equivalent to + * g_simple_async_result_propagate_error(). Otherwise it returns + * %FALSE. + * + * This can be used for legacy error handling in async + * _finish () wrapper functions that traditionally + * handled #GSimpleAsyncResult error returns themselves rather than + * calling into the virtual method. This should not be used in new + * code; #GAsyncResult errors that are set by virtual methods should + * also be extracted by virtual methods, to enable subclasses to chain + * up correctly. + * + * Returns: %TRUE if @error is has been filled in with an error from + * @res, %FALSE if not. + * + * Since: 2.34 + **/ +gboolean +g_async_result_legacy_propagate_error (GAsyncResult *res, + GError **error) +{ + /* This doesn't use a vmethod, because it's only for code that used + * to use GSimpleAsyncResult. (But it's a GAsyncResult method so + * that callers don't need to worry about GSimpleAsyncResult + * deprecation warnings in the future.) + */ + + if (G_IS_SIMPLE_ASYNC_RESULT (res)) + { + return g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), + error); + } + else + return FALSE; +} + +/** + * g_async_result_is_tagged: + * @res: a #GAsyncResult + * @source_tag: an application-defined tag + * + * Checks if @res has the given @source_tag (generally a function + * pointer indicating the function @res was created by). + * + * Returns: %TRUE if @res has the indicated @source_tag, %FALSE if + * not. + * + * Since: 2.34 + **/ +gboolean +g_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag) +{ + GAsyncResultIface *iface; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + + iface = G_ASYNC_RESULT_GET_IFACE (res); + + if (!iface->is_tagged) + return FALSE; + + return (* iface->is_tagged) (res, source_tag); +} diff --git a/gio/gasyncresult.h b/gio/gasyncresult.h new file mode 100644 index 0000000..9c8184f --- /dev/null +++ b/gio/gasyncresult.h @@ -0,0 +1,87 @@ +/* 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_RESULT_H__ +#define __G_ASYNC_RESULT_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + * @is_tagged: Checks if a result is tagged with a particular source. + * + * Interface definition for #GAsyncResult. + **/ +struct _GAsyncResultIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + gpointer (* get_user_data) (GAsyncResult *res); + GObject * (* get_source_object) (GAsyncResult *res); + + gboolean (* is_tagged) (GAsyncResult *res, + gpointer source_tag); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_async_result_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gpointer g_async_result_get_user_data (GAsyncResult *res); +GLIB_AVAILABLE_IN_ALL +GObject *g_async_result_get_source_object (GAsyncResult *res); + +GLIB_AVAILABLE_IN_2_34 +gboolean g_async_result_legacy_propagate_error (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_2_34 +gboolean g_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag); + +G_END_DECLS + +#endif /* __G_ASYNC_RESULT_H__ */ diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c new file mode 100644 index 0000000..2013118 --- /dev/null +++ b/gio/gbufferedinputstream.c @@ -0,0 +1,1276 @@ +/* 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 "gtask.h" +#include "gseekable.h" +#include "gioerror.h" +#include +#include "glibintl.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 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 g_buffered_input_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_buffered_input_stream_tell (GSeekable *seekable); +static gboolean g_buffered_input_stream_can_seek (GSeekable *seekable); +static gboolean g_buffered_input_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_buffered_input_stream_can_truncate (GSeekable *seekable); +static gboolean g_buffered_input_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +static void g_buffered_input_stream_finalize (GObject *object); + +static void compact_buffer (GBufferedInputStream *stream); + +G_DEFINE_TYPE_WITH_CODE (GBufferedInputStream, + g_buffered_input_stream, + G_TYPE_FILTER_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_buffered_input_stream_seekable_iface_init)) + +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; + + 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: a #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: a #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_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_buffered_input_stream_tell; + iface->can_seek = g_buffered_input_stream_can_seek; + iface->seek = g_buffered_input_stream_seek; + iface->can_truncate = g_buffered_input_stream_can_truncate; + iface->truncate_fn = g_buffered_input_stream_truncate; +} + +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: a #GBufferedInputStream + * @count: the number of bytes that will be read from the stream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore + * @error: location to store the error occurring, 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: a #GBufferedInputStream + * @count: the number of bytes that will be read from the stream + * @io_priority: the I/O priority + * of the request + * @cancellable: (allow-none): optional #GCancellable object + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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; + GError *error = NULL; + + g_return_if_fail (G_IS_BUFFERED_INPUT_STREAM (stream)); + + if (count == 0) + { + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_buffered_input_stream_fill_async); + g_task_return_int (task, 0); + g_object_unref (task); + return; + } + + if (count < -1) + { + g_task_report_new_error (stream, callback, user_data, + g_buffered_input_stream_fill_async, + 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_task_report_error (stream, callback, user_data, + g_buffered_input_stream_fill_async, + 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) +{ + 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_async_result_legacy_propagate_error (result, error)) + return -1; + else if (g_async_result_is_tagged (result, g_buffered_input_stream_fill_async)) + return g_task_propagate_int (G_TASK (result), error); + + 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: (array length=count) (element-type guint8): 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: (out): 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: (array length=count) (element-type guint8) (transfer none): + * 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 available 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; +} + +static goffset +g_buffered_input_stream_tell (GSeekable *seekable) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GInputStream *base_stream; + GSeekable *base_stream_seekable; + gsize available; + goffset base_offset; + + bstream = G_BUFFERED_INPUT_STREAM (seekable); + priv = bstream->priv; + + base_stream = G_FILTER_INPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + return 0; + base_stream_seekable = G_SEEKABLE (base_stream); + + available = priv->end - priv->pos; + base_offset = g_seekable_tell (base_stream_seekable); + + return base_offset - available; +} + +static gboolean +g_buffered_input_stream_can_seek (GSeekable *seekable) +{ + GInputStream *base_stream; + + base_stream = G_FILTER_INPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_seek (G_SEEKABLE (base_stream)); +} + +static gboolean +g_buffered_input_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + GBufferedInputStreamPrivate *priv; + GInputStream *base_stream; + GSeekable *base_stream_seekable; + + bstream = G_BUFFERED_INPUT_STREAM (seekable); + priv = bstream->priv; + + base_stream = G_FILTER_INPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + + if (type == G_SEEK_CUR) + { + if (offset <= priv->end - priv->pos && offset >= -priv->pos) + { + priv->pos += offset; + return TRUE; + } + else + { + offset -= priv->end - priv->pos; + } + } + + if (g_seekable_seek (base_stream_seekable, offset, type, cancellable, error)) + { + priv->pos = 0; + priv->end = 0; + return TRUE; + } + else + { + return FALSE; + } +} + +static gboolean +g_buffered_input_stream_can_truncate (GSeekable *seekable) +{ + return FALSE; +} + +static gboolean +g_buffered_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 GBufferedInputStream")); + return FALSE; +} + +/** + * g_buffered_input_stream_read_byte: + * @stream: a #GBufferedInputStream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore + * @error: location to store the error occurring, 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; + GTask *task = user_data; + + error = NULL; + res = g_input_stream_read_finish (G_INPUT_STREAM (source_object), + result, &error); + if (res == -1) + g_task_return_error (task, error); + else + { + GBufferedInputStream *stream; + GBufferedInputStreamPrivate *priv; + + stream = g_task_get_source_object (task); + priv = G_BUFFERED_INPUT_STREAM (stream)->priv; + + g_assert_cmpint (priv->end + res, <=, priv->len); + priv->end += res; + + g_task_return_int (task, res); + } + + g_object_unref (task); +} + +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; + GTask *task; + 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); + + task = g_task_new (stream, cancellable, callback, user_data); + + 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, + task); +} + +static gssize +g_buffered_input_stream_real_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (result), error); +} + +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) +{ + GTask *task = G_TASK (user_data); + SkipAsyncData *data; + GError *error; + gssize nread; + + data = g_task_get_task_data (task); + + 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_task_return_error (task, error); + else + { + if (error) + g_error_free (error); + + if (nread > 0) + data->bytes_skipped += nread; + + g_task_return_int (task, data->bytes_skipped); + } + + g_object_unref (task); +} + +static void +skip_fill_buffer_callback (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = G_TASK (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_task_get_task_data (task); + + error = NULL; + nread = g_buffered_input_stream_fill_finish (bstream, + result, &error); + + if (nread < 0 && data->bytes_skipped == 0) + g_task_return_error (task, error); + else + { + if (error) + g_error_free (error); + + if (nread > 0) + { + available = priv->end - priv->pos; + data->count = MIN (data->count, available); + + data->bytes_skipped += data->count; + priv->pos += data->count; + } + + g_task_return_int (task, data->bytes_skipped); + } + + g_object_unref (task); +} + +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; + GTask *task; + SkipAsyncData *data; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + priv = bstream->priv; + + data = g_slice_new (SkipAsyncData); + data->bytes_skipped = 0; + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, data, free_skip_async_data); + + available = priv->end - priv->pos; + + if (count <= available) + { + priv->pos += count; + + g_task_return_int (task, count); + g_object_unref (task); + return; + } + + /* Full request not available, skip all currently available + * 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, + task); + } + else + { + class = G_BUFFERED_INPUT_STREAM_GET_CLASS (stream); + class->fill_async (bstream, priv->len, io_priority, cancellable, + skip_fill_buffer_callback, task); + } +} + +static gssize +g_buffered_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (result), error); +} diff --git a/gio/gbufferedinputstream.h b/gio/gbufferedinputstream.h new file mode 100644 index 0000000..a4f8ef0 --- /dev/null +++ b/gio/gbufferedinputstream.h @@ -0,0 +1,135 @@ +/* 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 + */ + +#ifndef __G_BUFFERED_INPUT_STREAM_H__ +#define __G_BUFFERED_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_buffered_input_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GInputStream* g_buffered_input_stream_new (GInputStream *base_stream); +GLIB_AVAILABLE_IN_ALL +GInputStream* g_buffered_input_stream_new_sized (GInputStream *base_stream, + gsize size); + +GLIB_AVAILABLE_IN_ALL +gsize g_buffered_input_stream_get_buffer_size (GBufferedInputStream *stream); +GLIB_AVAILABLE_IN_ALL +void g_buffered_input_stream_set_buffer_size (GBufferedInputStream *stream, + gsize size); +GLIB_AVAILABLE_IN_ALL +gsize g_buffered_input_stream_get_available (GBufferedInputStream *stream); +GLIB_AVAILABLE_IN_ALL +gsize g_buffered_input_stream_peek (GBufferedInputStream *stream, + void *buffer, + gsize offset, + gsize count); +GLIB_AVAILABLE_IN_ALL +const void* g_buffered_input_stream_peek_buffer (GBufferedInputStream *stream, + gsize *count); + +GLIB_AVAILABLE_IN_ALL +gssize g_buffered_input_stream_fill (GBufferedInputStream *stream, + gssize count, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_buffered_input_stream_fill_async (GBufferedInputStream *stream, + gssize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gssize g_buffered_input_stream_fill_finish (GBufferedInputStream *stream, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +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..64fafbf --- /dev/null +++ b/gio/gbufferedoutputstream.c @@ -0,0 +1,759 @@ +/* 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 "gseekable.h" +#include "gtask.h" +#include "string.h" +#include "gioerror.h" +#include "glibintl.h" + +/** + * 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_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); + +static void g_buffered_output_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_buffered_output_stream_tell (GSeekable *seekable); +static gboolean g_buffered_output_stream_can_seek (GSeekable *seekable); +static gboolean g_buffered_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_buffered_output_stream_can_truncate (GSeekable *seekable); +static gboolean g_buffered_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GBufferedOutputStream, + g_buffered_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_buffered_output_stream_seekable_iface_init)) + + +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->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); + +} + +static void +g_buffered_output_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_buffered_output_stream_tell; + iface->can_seek = g_buffered_output_stream_can_seek; + iface->seek = g_buffered_output_stream_seek; + iface->can_truncate = g_buffered_output_stream_can_truncate; + iface->truncate_fn = g_buffered_output_stream_truncate; +} + +/** + * 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; +} + +static goffset +g_buffered_output_stream_tell (GSeekable *seekable) +{ + GBufferedOutputStream *bstream; + GBufferedOutputStreamPrivate *priv; + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + goffset base_offset; + + bstream = G_BUFFERED_OUTPUT_STREAM (seekable); + priv = bstream->priv; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + return 0; + + base_stream_seekable = G_SEEKABLE (base_stream); + + base_offset = g_seekable_tell (base_stream_seekable); + return base_offset + priv->pos; +} + +static gboolean +g_buffered_output_stream_can_seek (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_seek (G_SEEKABLE (base_stream)); +} + +static gboolean +g_buffered_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStream *bstream; + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + gboolean flushed; + + bstream = G_BUFFERED_OUTPUT_STREAM (seekable); + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + flushed = flush_buffer (bstream, cancellable, error); + if (!flushed) + return FALSE; + + return g_seekable_seek (base_stream_seekable, offset, type, cancellable, error); +} + +static gboolean +g_buffered_output_stream_can_truncate (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_truncate (G_SEEKABLE (base_stream)); +} + +static gboolean +g_buffered_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + GBufferedOutputStream *bstream; + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + gboolean flushed; + + bstream = G_BUFFERED_OUTPUT_STREAM (seekable); + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + + flushed = flush_buffer (bstream, cancellable, error); + if (!flushed) + return FALSE; + return g_seekable_truncate (base_stream_seekable, offset, cancellable, error); +} + +/* ************************** */ +/* 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 (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GBufferedOutputStream *stream; + GOutputStream *base_stream; + FlushData *fdata; + gboolean res; + GError *error = NULL; + + stream = G_BUFFERED_OUTPUT_STREAM (object); + fdata = task_data; + 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_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); +} + +static void +g_buffered_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GTask *task; + FlushData *fdata; + + fdata = g_slice_new (FlushData); + fdata->flush_stream = TRUE; + fdata->close_stream = FALSE; + + task = g_task_new (stream, cancellable, callback, data); + g_task_set_task_data (task, fdata, free_flush_data); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, flush_buffer_thread); + g_object_unref (task); +} + +static gboolean +g_buffered_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +g_buffered_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GTask *task; + FlushData *fdata; + + fdata = g_slice_new (FlushData); + fdata->close_stream = TRUE; + + task = g_task_new (stream, cancellable, callback, data); + g_task_set_task_data (task, fdata, free_flush_data); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, flush_buffer_thread); + g_object_unref (task); +} + +static gboolean +g_buffered_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/gio/gbufferedoutputstream.h b/gio/gbufferedoutputstream.h new file mode 100644 index 0000000..49c0fa9 --- /dev/null +++ b/gio/gbufferedoutputstream.h @@ -0,0 +1,88 @@ +/* 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 + */ + +#ifndef __G_BUFFERED_OUTPUT_STREAM_H__ +#define __G_BUFFERED_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_buffered_output_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GOutputStream* g_buffered_output_stream_new (GOutputStream *base_stream); +GLIB_AVAILABLE_IN_ALL +GOutputStream* g_buffered_output_stream_new_sized (GOutputStream *base_stream, + gsize size); +GLIB_AVAILABLE_IN_ALL +gsize g_buffered_output_stream_get_buffer_size (GBufferedOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +void g_buffered_output_stream_set_buffer_size (GBufferedOutputStream *stream, + gsize size); +GLIB_AVAILABLE_IN_ALL +gboolean g_buffered_output_stream_get_auto_grow (GBufferedOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +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..0ba3a01 --- /dev/null +++ b/gio/gcancellable.c @@ -0,0 +1,758 @@ +/* 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 "glib.h" +#include +#include "glib-private.h" +#include "gcancellable.h" +#include "glibintl.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; + GWakeup *wakeup; +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (GCancellable, g_cancellable, G_TYPE_OBJECT); + +static GPrivate current_cancellable; +static GMutex cancellable_mutex; +static GCond cancellable_cond; + +static void +g_cancellable_finalize (GObject *object) +{ + GCancellable *cancellable = G_CANCELLABLE (object); + + if (cancellable->priv->wakeup) + GLIB_PRIVATE_CALL (g_wakeup_free) (cancellable->priv->wakeup); + + 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)); + + 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); + +} + +static void +g_cancellable_init (GCancellable *cancellable) +{ + cancellable->priv = G_TYPE_INSTANCE_GET_PRIVATE (cancellable, + G_TYPE_CANCELLABLE, + GCancellablePrivate); +} + +/** + * 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 or 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 + * cancellable can then be received 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_private_get (¤t_cancellable); + l = g_slist_prepend (l, cancellable); + g_private_set (¤t_cancellable, l); +} + +/** + * 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_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_private_set (¤t_cancellable, l); +} + +/** + * g_cancellable_get_current: + * + * Gets the top cancellable from the stack. + * + * Returns: (transfer none): 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_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. + * + * If cancellable is currently in use by any cancellable operation + * then the behavior of this function is undefined. + **/ +void +g_cancellable_reset (GCancellable *cancellable) +{ + GCancellablePrivate *priv; + + g_return_if_fail (G_IS_CANCELLABLE (cancellable)); + + g_mutex_lock (&cancellable_mutex); + + priv = cancellable->priv; + + while (priv->cancelled_running) + { + priv->cancelled_running_waiting = TRUE; + g_cond_wait (&cancellable_cond, &cancellable_mutex); + } + + if (priv->cancelled) + { + if (priv->wakeup) + GLIB_PRIVATE_CALL (g_wakeup_acknowledge) (priv->wakeup); + + priv->cancelled = FALSE; + } + + g_mutex_unlock (&cancellable_mutex); +} + +/** + * g_cancellable_is_cancelled: + * @cancellable: (allow-none): 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: (allow-none): a #GCancellable or %NULL + * @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) +{ + GPollFD pollfd; + + if (cancellable == NULL) + return -1; + +#ifdef G_OS_WIN32 + pollfd.fd = -1; +#else + g_cancellable_make_pollfd (cancellable, &pollfd); +#endif + + return pollfd.fd; +} + +/** + * g_cancellable_make_pollfd: + * @cancellable: (allow-none): 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); + + g_mutex_lock (&cancellable_mutex); + + cancellable->priv->fd_refcount++; + + if (cancellable->priv->wakeup == NULL) + { + cancellable->priv->wakeup = GLIB_PRIVATE_CALL (g_wakeup_new) (); + + if (cancellable->priv->cancelled) + GLIB_PRIVATE_CALL (g_wakeup_signal) (cancellable->priv->wakeup); + } + + GLIB_PRIVATE_CALL (g_wakeup_get_pollfd) (cancellable->priv->wakeup, pollfd); + + g_mutex_unlock (&cancellable_mutex); + + 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; + + if (cancellable == NULL) + return; + + g_return_if_fail (G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (cancellable->priv->fd_refcount > 0); + + priv = cancellable->priv; + + g_mutex_lock (&cancellable_mutex); + + priv->fd_refcount--; + if (priv->fd_refcount == 0) + { + GLIB_PRIVATE_CALL (g_wakeup_free) (priv->wakeup); + priv->wakeup = NULL; + } + + g_mutex_unlock (&cancellable_mutex); +} + +/** + * 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) +{ + GCancellablePrivate *priv; + + if (cancellable == NULL || + cancellable->priv->cancelled) + return; + + priv = cancellable->priv; + + g_mutex_lock (&cancellable_mutex); + + if (priv->cancelled) + { + g_mutex_unlock (&cancellable_mutex); + return; + } + + priv->cancelled = TRUE; + priv->cancelled_running = TRUE; + + if (priv->wakeup) + GLIB_PRIVATE_CALL (g_wakeup_signal) (priv->wakeup); + + g_mutex_unlock (&cancellable_mutex); + + g_object_ref (cancellable); + g_signal_emit (cancellable, signals[CANCELLED], 0); + + g_mutex_lock (&cancellable_mutex); + + priv->cancelled_running = FALSE; + if (priv->cancelled_running_waiting) + g_cond_broadcast (&cancellable_cond); + priv->cancelled_running_waiting = FALSE; + + g_mutex_unlock (&cancellable_mutex); + + g_object_unref (cancellable); +} + +/** + * g_cancellable_connect: + * @cancellable: A #GCancellable. + * @callback: The #GCallback to connect. + * @data: Data to pass to @callback. + * @data_destroy_func: (allow-none): 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_mutex_lock (&cancellable_mutex); + + 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_mutex_unlock (&cancellable_mutex); + + return id; +} + +/** + * g_cancellable_disconnect: + * @cancellable: (allow-none): 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_mutex_lock (&cancellable_mutex); + + priv = cancellable->priv; + + while (priv->cancelled_running) + { + priv->cancelled_running_waiting = TRUE; + g_cond_wait (&cancellable_cond, &cancellable_mutex); + } + + g_signal_handler_disconnect (cancellable, handler_id); + + g_mutex_unlock (&cancellable_mutex); +} + +typedef struct { + GSource source; + + GCancellable *cancellable; +} GCancellableSource; + +static void +cancellable_source_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GSource *source = user_data; + + g_main_context_wakeup (g_source_get_context (source)); +} + +static gboolean +cancellable_source_prepare (GSource *source, + gint *timeout) +{ + GCancellableSource *cancellable_source = (GCancellableSource *)source; + + *timeout = -1; + return g_cancellable_is_cancelled (cancellable_source->cancellable); +} + +static gboolean +cancellable_source_check (GSource *source) +{ + GCancellableSource *cancellable_source = (GCancellableSource *)source; + + return g_cancellable_is_cancelled (cancellable_source->cancellable); +} + +static gboolean +cancellable_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GCancellableSourceFunc func = (GCancellableSourceFunc)callback; + GCancellableSource *cancellable_source = (GCancellableSource *)source; + + return (*func) (cancellable_source->cancellable, user_data); +} + +static void +cancellable_source_finalize (GSource *source) +{ + GCancellableSource *cancellable_source = (GCancellableSource *)source; + + if (cancellable_source->cancellable) + { + g_signal_handlers_disconnect_by_func (cancellable_source->cancellable, + G_CALLBACK (cancellable_source_cancelled), + cancellable_source); + g_object_unref (cancellable_source->cancellable); + } +} + +static gboolean +cancellable_source_closure_callback (GCancellable *cancellable, + gpointer data) +{ + GClosure *closure = data; + + GValue params = G_VALUE_INIT; + GValue result_value = G_VALUE_INIT; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + + g_value_init (¶ms, G_TYPE_CANCELLABLE); + g_value_set_object (¶ms, cancellable); + + g_closure_invoke (closure, &result_value, 1, ¶ms, NULL); + + result = g_value_get_boolean (&result_value); + g_value_unset (&result_value); + g_value_unset (¶ms); + + return result; +} + +static GSourceFuncs cancellable_source_funcs = +{ + cancellable_source_prepare, + cancellable_source_check, + cancellable_source_dispatch, + cancellable_source_finalize, + (GSourceFunc)cancellable_source_closure_callback, + (GSourceDummyMarshal)g_cclosure_marshal_generic, +}; + +/** + * g_cancellable_source_new: (skip) + * @cancellable: (allow-none): a #GCancellable, or %NULL + * + * Creates a source that triggers if @cancellable is cancelled and + * calls its callback of type #GCancellableSourceFunc. This is + * primarily useful for attaching to another (non-cancellable) source + * with g_source_add_child_source() to add cancellability to it. + * + * For convenience, you can call this with a %NULL #GCancellable, + * in which case the source will never trigger. + * + * Return value: (transfer full): the new #GSource. + * + * Since: 2.28 + */ +GSource * +g_cancellable_source_new (GCancellable *cancellable) +{ + GSource *source; + GCancellableSource *cancellable_source; + + source = g_source_new (&cancellable_source_funcs, sizeof (GCancellableSource)); + g_source_set_name (source, "GCancellable"); + cancellable_source = (GCancellableSource *)source; + + if (cancellable) + { + cancellable_source->cancellable = g_object_ref (cancellable); + g_signal_connect (cancellable, "cancelled", + G_CALLBACK (cancellable_source_cancelled), + source); + } + + return source; +} diff --git a/gio/gcancellable.h b/gio/gcancellable.h new file mode 100644 index 0000000..e44bbad --- /dev/null +++ b/gio/gcancellable.h @@ -0,0 +1,120 @@ +/* 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_CANCELLABLE_H__ +#define __G_CANCELLABLE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_cancellable_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GCancellable *g_cancellable_new (void); + +/* These are only safe to call inside a cancellable op */ +GLIB_AVAILABLE_IN_ALL +gboolean g_cancellable_is_cancelled (GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +gboolean g_cancellable_set_error_if_cancelled (GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +int g_cancellable_get_fd (GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +gboolean g_cancellable_make_pollfd (GCancellable *cancellable, + GPollFD *pollfd); +GLIB_AVAILABLE_IN_ALL +void g_cancellable_release_fd (GCancellable *cancellable); + +GLIB_AVAILABLE_IN_ALL +GSource * g_cancellable_source_new (GCancellable *cancellable); + +GLIB_AVAILABLE_IN_ALL +GCancellable *g_cancellable_get_current (void); +GLIB_AVAILABLE_IN_ALL +void g_cancellable_push_current (GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +void g_cancellable_pop_current (GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +void g_cancellable_reset (GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +gulong g_cancellable_connect (GCancellable *cancellable, + GCallback callback, + gpointer data, + GDestroyNotify data_destroy_func); +GLIB_AVAILABLE_IN_ALL +void g_cancellable_disconnect (GCancellable *cancellable, + gulong handler_id); + + +/* This is safe to call from another thread */ +GLIB_AVAILABLE_IN_ALL +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..c7f4807 --- /dev/null +++ b/gio/gcharsetconverter.c @@ -0,0 +1,473 @@ +/* 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 "gcharsetconverter.h" + +#include + +#include "ginitable.h" +#include "gioerror.h" +#include "glibintl.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 == (GIConv)-1) + { + 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; +} diff --git a/gio/gcharsetconverter.h b/gio/gcharsetconverter.h new file mode 100644 index 0000000..af9b989 --- /dev/null +++ b/gio/gcharsetconverter.h @@ -0,0 +1,65 @@ +/* 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 + */ + +#ifndef __G_CHARSET_CONVERTER_H__ +#define __G_CHARSET_CONVERTER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_charset_converter_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GCharsetConverter *g_charset_converter_new (const gchar *to_charset, + const gchar *from_charset, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_charset_converter_set_use_fallback (GCharsetConverter *converter, + gboolean use_fallback); +GLIB_AVAILABLE_IN_ALL +gboolean g_charset_converter_get_use_fallback (GCharsetConverter *converter); +GLIB_AVAILABLE_IN_ALL +guint g_charset_converter_get_num_fallbacks (GCharsetConverter *converter); + +G_END_DECLS + +#endif /* __G_CHARSET_CONVERTER_H__ */ diff --git a/gio/gcontenttype-win32.c b/gio/gcontenttype-win32.c new file mode 100644 index 0000000..e7e9785 --- /dev/null +++ b/gio/gcontenttype-win32.c @@ -0,0 +1,390 @@ +/* -*- 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 "gcontenttype.h" +#include "gthemedicon.h" +#include "gicon.h" +#include "glibintl.h" + +#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 gchar *type1, + const gchar *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 gchar *type, + const gchar *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 gchar *type) +{ + g_return_val_if_fail (type != NULL, FALSE); + + return strcmp ("*", type) == 0; +} + +gchar * +g_content_type_get_description (const gchar *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); +} + +gchar * +g_content_type_get_mime_type (const gchar *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 gchar *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); +} + +GIcon * +g_content_type_get_symbolic_icon (const gchar *type) +{ + return g_content_type_get_icon (type); +} + +gchar * +g_content_type_get_generic_icon_name (const gchar *type) +{ + return NULL; +} + +gboolean +g_content_type_can_be_executable (const gchar *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; +} + +gchar * +g_content_type_from_mime_type (const gchar *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; +} + +gchar * +g_content_type_guess (const gchar *filename, + const guchar *data, + gsize data_size, + gboolean *result_uncertain) +{ + char *basename; + char *type; + char *dot; + + type = NULL; + + if (result_uncertain) + *result_uncertain = FALSE; + + /* our test suite and potentially other code used -1 in the past, which is + * not documented and not allowed; guard against that */ + g_return_val_if_fail (data_size != (gsize) -1, g_strdup ("*")); + + 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); +} + +gchar ** +g_content_type_guess_for_tree (GFile *root) +{ + /* FIXME: implement */ + return NULL; +} diff --git a/gio/gcontenttype.c b/gio/gcontenttype.c new file mode 100644 index 0000000..5d49b7e --- /dev/null +++ b/gio/gcontenttype.c @@ -0,0 +1,1415 @@ +/* -*- 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" + + +/** + * 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 like "text/plain" or "image/png". + * On Win32 it is an extension string like ".doc", ".txt" or a perceived + * string like "audio". Such strings can be looked up in the registry at + * HKEY_CLASSES_ROOT. + **/ + +#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; +} + +gchar * +_g_unix_content_type_unalias (const gchar *type) +{ + gchar *res; + + G_LOCK (gio_xdgmime); + res = g_strdup (xdg_mime_unalias_mime_type (type)); + G_UNLOCK (gio_xdgmime); + + return res; +} + +gchar ** +_g_unix_content_type_get_parents (const gchar *type) +{ + const gchar *umime; + gchar **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 (gchar **)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 gchar *type1, + const gchar *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 content type 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 gchar *type, + const gchar *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 gchar *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. Free the + * returned string with g_free() + */ +gchar * +g_content_type_get_description (const gchar *type) +{ + static GHashTable *type_comment_cache = NULL; + gchar *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: (allow-none): 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); +} + + +static GIcon * +g_content_type_get_icon_internal (const gchar *type, + gboolean symbolic) +{ + char *mimetype_icon; + char *generic_mimetype_icon = NULL; + char *q; + char *xdg_mimetype_icon = NULL; + char *legacy_mimetype_icon; + char *xdg_mimetype_generic_icon; + char *icon_names[5]; + int n = 0; + GIcon *themed_icon; + const char *file_template; + const char *xdg_icon; + + g_return_val_if_fail (type != NULL, NULL); + + if (symbolic) + { + file_template = "%s-symbolic"; + } + else + { + file_template = "%s"; + } + + G_LOCK (gio_xdgmime); + xdg_icon = xdg_mime_get_icon (type); + G_UNLOCK (gio_xdgmime); + if (xdg_icon != NULL) + xdg_mimetype_icon = g_strdup_printf (file_template, xdg_icon); + xdg_mimetype_generic_icon = g_content_type_get_generic_icon_name (type); + + mimetype_icon = g_strdup_printf (file_template, type); + if (xdg_mimetype_generic_icon) + generic_mimetype_icon = g_strdup_printf (file_template, xdg_mimetype_generic_icon); + + while ((q = strchr (mimetype_icon, '/')) != NULL) + *q = '-'; + + /* 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); + + if (xdg_mimetype_icon) + icon_names[n++] = xdg_mimetype_icon; + + icon_names[n++] = mimetype_icon; + icon_names[n++] = legacy_mimetype_icon; + + if (generic_mimetype_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_get_icon: + * @type: a content type string + * + * Gets the icon for a content type. + * + * Returns: (transfer full): #GIcon corresponding to the content type. Free the returned + * object with g_object_unref() + */ +GIcon * +g_content_type_get_icon (const gchar *type) +{ + return g_content_type_get_icon_internal (type, FALSE); +} + +/** + * g_content_type_get_symbolic_icon: + * @type: a content type string + * + * Gets the symbolic icon for a content type. + * + * Returns: (transfer full): symbolic #GIcon corresponding to the content type. + * Free the returned object with g_object_unref() + * + * Since: 2.34 + */ +GIcon * +g_content_type_get_symbolic_icon (const gchar *type) +{ + return g_content_type_get_icon_internal (type, TRUE); +} + +/** + * g_content_type_get_generic_icon_name: + * @type: a content type string + * + * Gets the generic icon name for a content type. + * + * See the shared-mime-info + * specification for more on the generic icon name. + * + * Returns: (allow-none): the registered generic icon name for the given @type, + * or %NULL if unknown. Free with g_free() + * + * Since: 2.34 + */ +gchar * +g_content_type_get_generic_icon_name (const gchar *type) +{ + const gchar *xdg_icon_name; + gchar *icon_name; + + G_LOCK (gio_xdgmime); + xdg_icon_name = xdg_mime_get_generic_icon (type); + G_UNLOCK (gio_xdgmime); + + if (!xdg_icon_name) + { + const char *p; + const char *suffix = "-x-generic"; + + p = strchr (type, '/'); + if (p == NULL) + p = type + strlen (type); + + icon_name = g_malloc (p - type + strlen (suffix) + 1); + memcpy (icon_name, type, p - type); + memcpy (icon_name + (p - type), suffix, strlen (suffix)); + icon_name[(p - type) + strlen (suffix)] = 0; + } + else + { + icon_name = g_strdup (xdg_icon_name); + } + + return icon_name; +} + +/** + * 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 gchar *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: (allow-none): Newly allocated string with content type + * or %NULL. Free with g_free() + * + * Since: 2.18 + **/ +gchar * +g_content_type_from_mime_type (const gchar *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: (allow-none): a string, or %NULL + * @data: (allow-none) (array length=data_size): a stream of data, or %NULL + * @data_size: the size of @data + * @result_uncertain: (allow-none) (out): return location for the certainty + * of the result, or %NULL + * + * 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. Free with g_free() + */ +gchar * +g_content_type_guess (const gchar *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; + + /* our test suite and potentially other code used -1 in the past, which is + * not documented and not allowed; guard against that */ + g_return_val_if_fail (data_size != (gsize) -1, g_strdup (XDG_MIME_TYPE_UNKNOWN)); + + 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) + { + gchar *s = g_strdup (name_mimetypes[0]); + G_UNLOCK (gio_xdgmime); + return s; + } + + 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_free_full (list, g_free); + * + * + * Returns: (element-type utf8) (transfer full): #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_free_full (matchlet->matches, (GDestroyNotify) tree_matchlet_free); + g_free (matchlet->path); + g_free (matchlet->mimetype); + g_slice_free (TreeMatchlet, matchlet); +} + +static void +tree_match_free (TreeMatch *match) +{ + g_list_free_full (match->matches, (GDestroyNotify) tree_matchlet_free); + 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_free_full (tree_matches, (GDestroyNotify) tree_match_free); + 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: (transfer full) (array zero-terminated=1): an %NULL-terminated + * array of zero or more content types. Free with g_strfreev() + * + * Since: 2.18 + */ +gchar ** +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 (gchar **)g_ptr_array_free (types, FALSE); +} diff --git a/gio/gcontenttype.h b/gio/gcontenttype.h new file mode 100644 index 0000000..9ffbdeb --- /dev/null +++ b/gio/gcontenttype.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 + */ + +#ifndef __G_CONTENT_TYPE_H__ +#define __G_CONTENT_TYPE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gboolean g_content_type_equals (const gchar *type1, + const gchar *type2); +GLIB_AVAILABLE_IN_ALL +gboolean g_content_type_is_a (const gchar *type, + const gchar *supertype); +GLIB_AVAILABLE_IN_ALL +gboolean g_content_type_is_unknown (const gchar *type); +GLIB_AVAILABLE_IN_ALL +gchar * g_content_type_get_description (const gchar *type); +GLIB_AVAILABLE_IN_ALL +gchar * g_content_type_get_mime_type (const gchar *type); +GLIB_AVAILABLE_IN_ALL +GIcon * g_content_type_get_icon (const gchar *type); +GLIB_AVAILABLE_IN_2_34 +GIcon * g_content_type_get_symbolic_icon (const gchar *type); +GLIB_AVAILABLE_IN_2_34 +gchar * g_content_type_get_generic_icon_name (const gchar *type); + +GLIB_AVAILABLE_IN_ALL +gboolean g_content_type_can_be_executable (const gchar *type); + +GLIB_AVAILABLE_IN_ALL +gchar * g_content_type_from_mime_type (const gchar *mime_type); + +GLIB_AVAILABLE_IN_ALL +gchar * g_content_type_guess (const gchar *filename, + const guchar *data, + gsize data_size, + gboolean *result_uncertain); + +GLIB_AVAILABLE_IN_ALL +gchar ** g_content_type_guess_for_tree (GFile *root); + +GLIB_AVAILABLE_IN_ALL +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..f02ff70 --- /dev/null +++ b/gio/gconverter.c @@ -0,0 +1,202 @@ +/* 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" + + +/** + * 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 + **/ + + +typedef GConverterIface GConverterInterface; +G_DEFINE_INTERFACE (GConverter, g_converter, G_TYPE_OBJECT) + +static void +g_converter_default_init (GConverterInterface *iface) +{ +} + +/** + * g_converter_convert: + * @converter: a #GConverter. + * @inbuf: (array length=inbuf_size) (element-type guint8): 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 #GConverterFlags controlling the conversion details + * @bytes_read: (out): will be set to the number of bytes read from @inbuf on success + * @bytes_written: (out): will be set to the number of bytes written to @outbuf on success + * @error: location to store the error occurring, 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 available 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); +} diff --git a/gio/gconverter.h b/gio/gconverter.h new file mode 100644 index 0000000..4fea64d --- /dev/null +++ b/gio/gconverter.h @@ -0,0 +1,98 @@ +/* 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 + */ + +#ifndef __G_CONVERTER_H__ +#define __G_CONVERTER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_converter_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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..0c04bfe --- /dev/null +++ b/gio/gconverterinputstream.c @@ -0,0 +1,654 @@ +/* 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 "gpollableinputstream.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.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. + * + * As of GLib 2.34, #GConverterInputStream implements + * #GPollableInputStream. + **/ + +#define INITIAL_BUFFER_SIZE 4096 + +typedef struct { + char *data; + gsize start; + gsize end; + gsize size; +} Buffer; + +struct _GConverterInputStreamPrivate { + gboolean at_input_end; + gboolean finished; + gboolean need_input; + 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); + +static gboolean g_converter_input_stream_can_poll (GPollableInputStream *stream); +static gboolean g_converter_input_stream_is_readable (GPollableInputStream *stream); +static gssize g_converter_input_stream_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize size, + GError **error); + +static GSource *g_converter_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable); + +static void g_converter_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (GConverterInputStream, + g_converter_input_stream, + G_TYPE_FILTER_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, + g_converter_input_stream_pollable_iface_init); + ) + +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_pollable_iface_init (GPollableInputStreamInterface *iface) +{ + iface->can_poll = g_converter_input_stream_can_poll; + iface->is_readable = g_converter_input_stream_is_readable; + iface->read_nonblocking = g_converter_input_stream_read_nonblocking; + iface->create_source = g_converter_input_stream_create_source; +} + +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_data_size (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_data_size (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_data_size (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; +} + +/* Ensures that the buffer can fit at_least_size bytes, + * *including* the current in-buffer data */ +static void +buffer_ensure_space (Buffer *buffer, + gsize at_least_size) +{ + gsize in_buffer, left_to_fill; + + in_buffer = buffer_data_size (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, + gboolean blocking, + 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_pollable_stream_read (base_stream, + priv->input_buffer.data + priv->input_buffer.end, + buffer_tailspace (&priv->input_buffer), + blocking, + cancellable, + error); + + if (nread > 0) + { + priv->input_buffer.end += nread; + priv->need_input = FALSE; + } + + return nread; +} + + +static gssize +read_internal (GInputStream *stream, + void *buffer, + gsize count, + gboolean blocking, + 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_data_size (&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; + buffer = (char *) buffer + available; + count -= available; + + /* If there is no data to convert, and no pre-converted data, + do some i/o for more input */ + if (buffer_data_size (&priv->input_buffer) == 0 && + total_bytes_read == 0 && + !priv->at_input_end) + { + nread = fill_input_buffer (cstream, count, blocking, 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_data_size (&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_data_size (&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_data_size (&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_data_size (&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_data_size (&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; + nread = fill_input_buffer (cstream, + buffer_data_size (&priv->input_buffer) + 4096, + blocking, + cancellable, + &my_error2); + if (nread < 0) + { + /* Can't read any more data, return that error */ + g_error_free (my_error); + g_propagate_error (error, my_error2); + priv->need_input = TRUE; + return -1; + } + else if (nread == 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 (); +} + +static gssize +g_converter_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + return read_internal (stream, buffer, count, TRUE, cancellable, error); +} + +static gboolean +g_converter_input_stream_can_poll (GPollableInputStream *stream) +{ + GInputStream *base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + + return (G_IS_POLLABLE_INPUT_STREAM (base_stream) && + g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (base_stream))); +} + +static gboolean +g_converter_input_stream_is_readable (GPollableInputStream *stream) +{ + GInputStream *base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + GConverterInputStream *cstream = G_CONVERTER_INPUT_STREAM (stream); + + if (buffer_data_size (&cstream->priv->converted_buffer)) + return TRUE; + else if (buffer_data_size (&cstream->priv->input_buffer) && + !cstream->priv->need_input) + return TRUE; + else + return g_pollable_input_stream_is_readable (G_POLLABLE_INPUT_STREAM (base_stream)); +} + +static gssize +g_converter_input_stream_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize count, + GError **error) +{ + return read_internal (G_INPUT_STREAM (stream), buffer, count, + FALSE, NULL, error); +} + +static GSource * +g_converter_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable) +{ + GInputStream *base_stream = G_FILTER_INPUT_STREAM (stream)->base_stream; + GSource *base_source, *pollable_source; + + if (g_pollable_input_stream_is_readable (stream)) + base_source = g_timeout_source_new (0); + else + base_source = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM (base_stream), NULL); + + pollable_source = g_pollable_source_new_full (stream, base_source, + cancellable); + g_source_unref (base_source); + + return pollable_source; +} + + +/** + * g_converter_input_stream_get_converter: + * @converter_stream: a #GConverterInputStream + * + * Gets the #GConverter that is used by @converter_stream. + * + * Returns: (transfer none): 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; +} diff --git a/gio/gconverterinputstream.h b/gio/gconverterinputstream.h new file mode 100644 index 0000000..3a8f845 --- /dev/null +++ b/gio/gconverterinputstream.h @@ -0,0 +1,82 @@ +/* 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 + */ + +#ifndef __G_CONVERTER_INPUT_STREAM_H__ +#define __G_CONVERTER_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_converter_input_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GInputStream *g_converter_input_stream_new (GInputStream *base_stream, + GConverter *converter); +GLIB_AVAILABLE_IN_ALL +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..9199010 --- /dev/null +++ b/gio/gconverteroutputstream.c @@ -0,0 +1,694 @@ +/* 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 "gpollableoutputstream.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.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. + * + * As of GLib 2.34, #GConverterOutputStream implements + * #GPollableOutputStream. + **/ + +#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); + +static gboolean g_converter_output_stream_can_poll (GPollableOutputStream *stream); +static gboolean g_converter_output_stream_is_writable (GPollableOutputStream *stream); +static gssize g_converter_output_stream_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize size, + GError **error); + +static GSource *g_converter_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable); + +static void g_converter_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (GConverterOutputStream, + g_converter_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, + g_converter_output_stream_pollable_iface_init); + ) + +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_pollable_iface_init (GPollableOutputStreamInterface *iface) +{ + iface->can_poll = g_converter_output_stream_can_poll; + iface->is_writable = g_converter_output_stream_is_writable; + iface->write_nonblocking = g_converter_output_stream_write_nonblocking; + iface->create_source = g_converter_output_stream_create_source; +} + +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_data_size (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_data_size (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_data_size (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; +} + +/* Ensures that the buffer can fit at_least_size bytes, + * *including* the current in-buffer data */ +static void +buffer_ensure_space (Buffer *buffer, + gsize at_least_size) +{ + gsize in_buffer, left_to_fill; + + in_buffer = buffer_data_size (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_data_size (buffer) + data_size); + memcpy (buffer->data + buffer->end, data, data_size); + buffer->end += data_size; +} + + +static gboolean +flush_buffer (GConverterOutputStream *stream, + gboolean blocking, + 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_data_size (&priv->converted_buffer); + if (available > 0) + { + res = g_pollable_stream_write_all (base_stream, + buffer_data (&priv->converted_buffer), + available, + blocking, + &nwritten, + cancellable, + error); + buffer_consumed (&priv->converted_buffer, nwritten); + return res; + } + return TRUE; +} + + +static gssize +write_internal (GOutputStream *stream, + const void *buffer, + gsize count, + gboolean blocking, + 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, blocking, cancellable, error)) + return -1; + + if (priv->finished) + return 0; + + /* Convert as much as possible */ + if (buffer_data_size (&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_data_size (&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) + { + /* Ensure we have *some* target space */ + if (buffer_tailspace (&priv->converted_buffer) == 0) + grow_buffer (&priv->converted_buffer); + + /* 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_data_size (&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 */ + + g_error_free (my_error); + 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, blocking, cancellable, NULL); + + return retval; +} + +static gssize +g_converter_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + return write_internal (stream, buffer, count, TRUE, cancellable, error); +} + +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, TRUE, 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) + { + /* Ensure we have *some* target space */ + if (buffer_tailspace (&priv->converted_buffer) == 0) + grow_buffer (&priv->converted_buffer); + + /* Try to convert to our buffer */ + my_error = NULL; + res = g_converter_convert (priv->converter, + buffer_data (&priv->output_buffer), + buffer_data_size (&priv->output_buffer), + buffer_data (&priv->converted_buffer) + buffer_data_size (&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_data_size (&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 FALSE; + } + } + + /* Now write all converted data to base stream */ + if (!flush_buffer (cstream, TRUE, cancellable, error)) + return FALSE; + + return TRUE; +} + +static gboolean +g_converter_output_stream_can_poll (GPollableOutputStream *stream) +{ + GOutputStream *base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + return (G_IS_POLLABLE_OUTPUT_STREAM (base_stream) && + g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (base_stream))); +} + +static gboolean +g_converter_output_stream_is_writable (GPollableOutputStream *stream) +{ + GOutputStream *base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + + return g_pollable_output_stream_is_writable (G_POLLABLE_OUTPUT_STREAM (base_stream)); +} + +static gssize +g_converter_output_stream_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GError **error) +{ + return write_internal (G_OUTPUT_STREAM (stream), buffer, count, FALSE, + NULL, error); +} + +static GSource * +g_converter_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable) +{ + GOutputStream *base_stream = G_FILTER_OUTPUT_STREAM (stream)->base_stream; + GSource *base_source, *pollable_source; + + base_source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (base_stream), NULL); + pollable_source = g_pollable_source_new_full (stream, base_source, + cancellable); + g_source_unref (base_source); + + return pollable_source; +} + +/** + * g_converter_output_stream_get_converter: + * @converter_stream: a #GConverterOutputStream + * + * Gets the #GConverter that is used by @converter_stream. + * + * Returns: (transfer none): 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; +} diff --git a/gio/gconverteroutputstream.h b/gio/gconverteroutputstream.h new file mode 100644 index 0000000..1f91001 --- /dev/null +++ b/gio/gconverteroutputstream.h @@ -0,0 +1,82 @@ +/* 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 + */ + +#ifndef __G_CONVERTER_OUTPUT_STREAM_H__ +#define __G_CONVERTER_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_converter_output_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GOutputStream *g_converter_output_stream_new (GOutputStream *base_stream, + GConverter *converter); +GLIB_AVAILABLE_IN_ALL +GConverter *g_converter_output_stream_get_converter (GConverterOutputStream *converter_stream); + +G_END_DECLS + +#endif /* __G_CONVERTER_OUTPUT_STREAM_H__ */ diff --git a/gio/gcredentials.c b/gio/gcredentials.c new file mode 100644 index 0000000..ea59b47 --- /dev/null +++ b/gio/gcredentials.c @@ -0,0 +1,534 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include + +#include "gcredentials.h" +#include "gnetworking.h" +#include "gioerror.h" + +#include "glibintl.h" + +/** + * SECTION:gcredentials + * @short_description: An object containing credentials + * @include: gio/gio.h + * + * The #GCredentials type is a reference-counted wrapper for native + * credentials. This information is typically used for identifying, + * authenticating and authorizing other processes. + * + * Some operating systems supports looking up the credentials of the + * remote peer of a communication endpoint - see e.g. + * g_socket_get_credentials(). + * + * Some operating systems supports securely sending and receiving + * credentials over a Unix Domain Socket, see + * #GUnixCredentialsMessage, g_unix_connection_send_credentials() and + * g_unix_connection_receive_credentials() for details. + * + * On Linux, the native credential type is a struct ucred + * - see the + * unix7 + * man page for details. This corresponds to + * %G_CREDENTIALS_TYPE_LINUX_UCRED. + * + * On FreeBSD, the native credential type is a struct cmsgcred. + * This corresponds to %G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED. + * + * On OpenBSD, the native credential type is a struct sockpeercred. + * This corresponds to %G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED. + */ + +/** + * GCredentials: + * + * The #GCredentials structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GCredentials +{ + /*< private >*/ + GObject parent_instance; + +#ifdef __linux__ + struct ucred native; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + struct cmsgcred native; +#elif defined(__OpenBSD__) + struct sockpeercred native; +#else +#ifdef __GNUC__ +#warning Please add GCredentials support for your OS +#endif +#endif +}; + +/** + * GCredentialsClass: + * + * Class structure for #GCredentials. + * + * Since: 2.26 + */ +struct _GCredentialsClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +G_DEFINE_TYPE (GCredentials, g_credentials, G_TYPE_OBJECT); + +static void +g_credentials_finalize (GObject *object) +{ + G_GNUC_UNUSED GCredentials *credentials = G_CREDENTIALS (object); + + if (G_OBJECT_CLASS (g_credentials_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_credentials_parent_class)->finalize (object); +} + + +static void +g_credentials_class_init (GCredentialsClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = g_credentials_finalize; +} + +static void +g_credentials_init (GCredentials *credentials) +{ +#ifdef __linux__ + credentials->native.pid = getpid (); + credentials->native.uid = geteuid (); + credentials->native.gid = getegid (); +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + memset (&credentials->native, 0, sizeof (struct cmsgcred)); + credentials->native.cmcred_pid = getpid (); + credentials->native.cmcred_euid = geteuid (); + credentials->native.cmcred_gid = getegid (); +#elif defined(__OpenBSD__) + credentials->native.pid = getpid (); + credentials->native.uid = geteuid (); + credentials->native.gid = getegid (); +#endif +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_credentials_new: + * + * Creates a new #GCredentials object with credentials matching the + * the current process. + * + * Returns: A #GCredentials. Free with g_object_unref(). + * + * Since: 2.26 + */ +GCredentials * +g_credentials_new (void) +{ + return g_object_new (G_TYPE_CREDENTIALS, NULL); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_credentials_to_string: + * @credentials: A #GCredentials object. + * + * Creates a human-readable textual representation of @credentials + * that can be used in logging and debug messages. The format of the + * returned string may change in future GLib release. + * + * Returns: A string that should be freed with g_free(). + * + * Since: 2.26 + */ +gchar * +g_credentials_to_string (GCredentials *credentials) +{ + GString *ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); + + ret = g_string_new ("GCredentials:"); +#ifdef __linux__ + g_string_append (ret, "linux-ucred:"); + if (credentials->native.pid != -1) + g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid); + if (credentials->native.uid != -1) + g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.uid); + if (credentials->native.gid != -1) + g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.gid); + if (ret->str[ret->len - 1] == ',') + ret->str[ret->len - 1] = '\0'; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + g_string_append (ret, "freebsd-cmsgcred:"); + if (credentials->native.cmcred_pid != -1) + g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_pid); + if (credentials->native.cmcred_euid != -1) + g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_euid); + if (credentials->native.cmcred_gid != -1) + g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.cmcred_gid); +#elif defined(__OpenBSD__) + g_string_append (ret, "openbsd-sockpeercred:"); + if (credentials->native.pid != -1) + g_string_append_printf (ret, "pid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.pid); + if (credentials->native.uid != -1) + g_string_append_printf (ret, "uid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.uid); + if (credentials->native.gid != -1) + g_string_append_printf (ret, "gid=%" G_GINT64_FORMAT ",", (gint64) credentials->native.gid); + if (ret->str[ret->len - 1] == ',') + ret->str[ret->len - 1] = '\0'; +#else + g_string_append (ret, "unknown"); +#endif + + return g_string_free (ret, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_credentials_is_same_user: + * @credentials: A #GCredentials. + * @other_credentials: A #GCredentials. + * @error: Return location for error or %NULL. + * + * Checks if @credentials and @other_credentials is the same user. + * + * This operation can fail if #GCredentials is not supported on the + * the OS. + * + * Returns: %TRUE if @credentials and @other_credentials has the same + * user, %FALSE otherwise or if @error is set. + * + * Since: 2.26 + */ +gboolean +g_credentials_is_same_user (GCredentials *credentials, + GCredentials *other_credentials, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE); + g_return_val_if_fail (G_IS_CREDENTIALS (other_credentials), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; +#ifdef __linux__ + if (credentials->native.uid == other_credentials->native.uid) + ret = TRUE; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + if (credentials->native.cmcred_euid == other_credentials->native.cmcred_euid) + ret = TRUE; +#elif defined(__OpenBSD__) + if (credentials->native.uid == other_credentials->native.uid) + ret = TRUE; +#else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("GCredentials is not implemented on this OS")); +#endif + + return ret; +} + +/** + * g_credentials_get_native: (skip) + * @credentials: A #GCredentials. + * @native_type: The type of native credentials to get. + * + * Gets a pointer to native credentials of type @native_type from + * @credentials. + * + * It is a programming error (which will cause an warning to be + * logged) to use this method if there is no #GCredentials support for + * the OS or if @native_type isn't supported by the OS. + * + * Returns: The pointer to native credentials or %NULL if the + * operation there is no #GCredentials support for the OS or if + * @native_type isn't supported by the OS. Do not free the returned + * data, it is owned by @credentials. + * + * Since: 2.26 + */ +gpointer +g_credentials_get_native (GCredentials *credentials, + GCredentialsType native_type) +{ + gpointer ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); + + ret = NULL; + +#ifdef __linux__ + if (native_type != G_CREDENTIALS_TYPE_LINUX_UCRED) + { + g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only " + "G_CREDENTIALS_TYPE_LINUX_UCRED is supported.", + native_type); + } + else + { + ret = &credentials->native; + } +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + if (native_type != G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED) + { + g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only " + "G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED is supported.", + native_type); + } + else + { + ret = &credentials->native; + } +#elif defined(__OpenBSD__) + if (native_type != G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED) + { + g_warning ("g_credentials_get_native: Trying to get credentials of type %d but only " + "G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED is supported.", + native_type); + } + else + { + ret = &credentials->native; + } +#else + g_warning ("g_credentials_get_native: Trying to get credentials but GLib has no support " + "for the native credentials type. Please add support."); +#endif + + return ret; +} + +/** + * g_credentials_set_native: + * @credentials: A #GCredentials. + * @native_type: The type of native credentials to set. + * @native: A pointer to native credentials. + * + * Copies the native credentials of type @native_type from @native + * into @credentials. + * + * It is a programming error (which will cause an warning to be + * logged) to use this method if there is no #GCredentials support for + * the OS or if @native_type isn't supported by the OS. + * + * Since: 2.26 + */ +void +g_credentials_set_native (GCredentials *credentials, + GCredentialsType native_type, + gpointer native) +{ +#ifdef __linux__ + if (native_type != G_CREDENTIALS_TYPE_LINUX_UCRED) + { + g_warning ("g_credentials_set_native: Trying to set credentials of type %d " + "but only G_CREDENTIALS_TYPE_LINUX_UCRED is supported.", + native_type); + } + else + { + memcpy (&credentials->native, native, sizeof (struct ucred)); + } +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + if (native_type != G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED) + { + g_warning ("g_credentials_set_native: Trying to set credentials of type %d " + "but only G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED is supported.", + native_type); + } + else + { + memcpy (&credentials->native, native, sizeof (struct cmsgcred)); + } +#elif defined(__OpenBSD__) + if (native_type != G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED) + { + g_warning ("g_credentials_set_native: Trying to set credentials of type %d " + "but only G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED is supported.", + native_type); + } + else + { + memcpy (&credentials->native, native, sizeof (struct sockpeercred)); + } +#else + g_warning ("g_credentials_set_native: Trying to set credentials but GLib has no support " + "for the native credentials type. Please add support."); +#endif +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX +/** + * g_credentials_get_unix_user: + * @credentials: A #GCredentials + * @error: Return location for error or %NULL. + * + * Tries to get the UNIX user identifier from @credentials. This + * method is only available on UNIX platforms. + * + * This operation can fail if #GCredentials is not supported on the + * OS or if the native credentials type does not contain information + * about the UNIX user. + * + * Returns: The UNIX user identifier or -1 if @error is set. + * + * Since: 2.26 + */ +uid_t +g_credentials_get_unix_user (GCredentials *credentials, + GError **error) +{ + uid_t ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), -1); + g_return_val_if_fail (error == NULL || *error == NULL, -1); + +#ifdef __linux__ + ret = credentials->native.uid; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + ret = credentials->native.cmcred_euid; +#elif defined(__OpenBSD__) + ret = credentials->native.uid; +#else + ret = -1; + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("There is no GCredentials support for your platform")); +#endif + + return ret; +} + +/** + * g_credentials_get_unix_pid: + * @credentials: A #GCredentials + * @error: Return location for error or %NULL. + * + * Tries to get the UNIX process identifier from @credentials. This + * method is only available on UNIX platforms. + * + * This operation can fail if #GCredentials is not supported on the + * OS or if the native credentials type does not contain information + * about the UNIX process ID. + * + * Returns: The UNIX process ID, or -1 if @error is set. + * + * Since: 2.36 + */ +pid_t +g_credentials_get_unix_pid (GCredentials *credentials, + GError **error) +{ + pid_t ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), -1); + g_return_val_if_fail (error == NULL || *error == NULL, -1); + +#ifdef __linux__ + ret = credentials->native.pid; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + ret = credentials->native.cmcred_pid; +#elif defined(__OpenBSD__) + ret = credentials->native.pid; +#else + ret = -1; + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("GCredentials does not contain a process ID on this OS")); +#endif + + return ret; +} + +/** + * g_credentials_set_unix_user: + * @credentials: A #GCredentials. + * @uid: The UNIX user identifier to set. + * @error: Return location for error or %NULL. + * + * Tries to set the UNIX user identifier on @credentials. This method + * is only available on UNIX platforms. + * + * This operation can fail if #GCredentials is not supported on the + * OS or if the native credentials type does not contain information + * about the UNIX user. + * + * Returns: %TRUE if @uid was set, %FALSE if error is set. + * + * Since: 2.26 + */ +gboolean +g_credentials_set_unix_user (GCredentials *credentials, + uid_t uid, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), FALSE); + g_return_val_if_fail (uid != -1, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; +#ifdef __linux__ + credentials->native.uid = uid; + ret = TRUE; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + credentials->native.cmcred_euid = uid; + ret = TRUE; +#elif defined(__OpenBSD__) + credentials->native.uid = uid; + ret = TRUE; +#else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("GCredentials is not implemented on this OS")); +#endif + + return ret; +} + +#endif /* G_OS_UNIX */ diff --git a/gio/gcredentials.h b/gio/gcredentials.h new file mode 100644 index 0000000..ff1ae4d --- /dev/null +++ b/gio/gcredentials.h @@ -0,0 +1,87 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_CREDENTIALS_H__ +#define __G_CREDENTIALS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +#ifdef G_OS_UNIX +/* To get the uid_t type */ +#include +#include +#endif + +G_BEGIN_DECLS + +#define G_TYPE_CREDENTIALS (g_credentials_get_type ()) +#define G_CREDENTIALS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_CREDENTIALS, GCredentials)) +#define G_CREDENTIALS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_CREDENTIALS, GCredentialsClass)) +#define G_CREDENTIALS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CREDENTIALS, GCredentialsClass)) +#define G_IS_CREDENTIALS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_CREDENTIALS)) +#define G_IS_CREDENTIALS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CREDENTIALS)) + +typedef struct _GCredentialsClass GCredentialsClass; + +GLIB_AVAILABLE_IN_ALL +GType g_credentials_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GCredentials *g_credentials_new (void); + +GLIB_AVAILABLE_IN_ALL +gchar *g_credentials_to_string (GCredentials *credentials); + +GLIB_AVAILABLE_IN_ALL +gpointer g_credentials_get_native (GCredentials *credentials, + GCredentialsType native_type); + +GLIB_AVAILABLE_IN_ALL +void g_credentials_set_native (GCredentials *credentials, + GCredentialsType native_type, + gpointer native); + +GLIB_AVAILABLE_IN_ALL +gboolean g_credentials_is_same_user (GCredentials *credentials, + GCredentials *other_credentials, + GError **error); + +#ifdef G_OS_UNIX +GLIB_AVAILABLE_IN_2_36 +pid_t g_credentials_get_unix_pid (GCredentials *credentials, + GError **error); +GLIB_AVAILABLE_IN_ALL +uid_t g_credentials_get_unix_user (GCredentials *credentials, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_credentials_set_unix_user (GCredentials *credentials, + uid_t uid, + GError **error); +#endif + +G_END_DECLS + +#endif /* __G_DBUS_PROXY_H__ */ diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c new file mode 100644 index 0000000..46b62b7 --- /dev/null +++ b/gio/gdatainputstream.c @@ -0,0 +1,1467 @@ +/* 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 "gtask.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.h" + +#include + +/** + * 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 available. + * + **/ +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: (allow-none): 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: (allow-none): 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_input_stream_get_byte_order() and g_data_input_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: (allow-none): 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_input_stream_get_byte_order() and g_data_input_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: (allow-none): 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_input_stream_get_byte_order() and g_data_input_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: (allow-none): 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_input_stream_get_byte_order() and g_data_input_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: (allow-none): 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_input_stream_get_byte_order() and g_data_input_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: (allow-none): 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_input_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: (out): a #gsize to get the length of the data read in. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a line from the data input stream. Note that no encoding + * checks or conversion is performed; the input is not guaranteed to + * be UTF-8, and may in fact have embedded NUL characters. + * + * 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: (transfer full) (array zero-terminated=1) (element-type guint8): a + * NUL terminated byte array 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; +} + +/** + * g_data_input_stream_read_line_utf8: + * @stream: a given #GDataInputStream. + * @length: (out): a #gsize to get the length of the data read in. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: #GError for error reporting. + * + * Reads a UTF-8 encoded 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: (transfer full): a NUL terminated UTF-8 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. For UTF-8 conversion errors, + * the set error domain is %G_CONVERT_ERROR. If there's no content to + * read, it will still return %NULL, but @error won't be set. + * + * Since: 2.30 + **/ +char * +g_data_input_stream_read_line_utf8 (GDataInputStream *stream, + gsize *length, + GCancellable *cancellable, + GError **error) +{ + char *res; + + res = g_data_input_stream_read_line (stream, length, cancellable, error); + if (!res) + return NULL; + + if (!g_utf8_validate (res, -1, NULL)) + { + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + g_free (res); + return NULL; + } + return res; +} + +static gssize +scan_for_chars (GDataInputStream *stream, + gsize *checked_out, + const char *stop_chars, + gssize stop_chars_len) +{ + GBufferedInputStream *bstream; + const char *buffer; + gsize start, end, peeked; + int i; + gsize available, checked; + const char *stop_char; + const char *stop_end; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + stop_end = stop_chars + stop_chars_len; + + 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 != stop_end; 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: (out): a #gsize to get the length of the data read in. + * @cancellable: (allow-none): 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. + * + * Don't use this function in new code. Its functionality is + * inconsistent with g_data_input_stream_read_until_async(). Both + * functions will be marked as deprecated in a future release. Use + * g_data_input_stream_read_upto() instead, but note that that function + * does not consume the stop character. + * + * Returns: (transfer full): 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; + gchar *result; + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + result = g_data_input_stream_read_upto (stream, stop_chars, -1, + length, cancellable, error); + + /* If we're not at end of stream then we have a stop_char to consume. */ + if (result != NULL && g_buffered_input_stream_get_available (bstream) > 0) + { + gsize res; + gchar b; + + res = g_input_stream_read (G_INPUT_STREAM (stream), &b, 1, NULL, NULL); + g_assert (res == 1); + } + + return result; +} + +typedef struct +{ + gboolean last_saw_cr; + gsize checked; + + gchar *stop_chars; + gssize stop_chars_len; + gsize length; +} GDataInputStreamReadData; + +static void +g_data_input_stream_read_complete (GTask *task, + gsize read_length, + gsize skip_length) +{ + GDataInputStreamReadData *data = g_task_get_task_data (task); + GInputStream *stream = g_task_get_source_object (task); + char *line = NULL; + + if (read_length || skip_length) + { + gssize bytes; + + data->length = read_length; + line = g_malloc (read_length + 1); + line[read_length] = '\0'; + + /* we already checked the buffer. this shouldn't fail. */ + bytes = g_input_stream_read (stream, line, read_length, NULL, NULL); + g_assert_cmpint (bytes, ==, read_length); + + bytes = g_input_stream_skip (stream, skip_length, NULL, NULL); + g_assert_cmpint (bytes, ==, skip_length); + } + + g_task_return_pointer (task, line, g_free); + g_object_unref (task); +} + +static void +g_data_input_stream_read_line_ready (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GDataInputStreamReadData *data = g_task_get_task_data (task); + GBufferedInputStream *buffer = g_task_get_source_object (task); + gssize found_pos; + gint newline_len; + + if (result) + /* this is a callback. finish the async call. */ + { + GError *error = NULL; + gssize bytes; + + bytes = g_buffered_input_stream_fill_finish (buffer, result, &error); + + if (bytes <= 0) + { + if (bytes < 0) + /* stream error. */ + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + g_data_input_stream_read_complete (task, data->checked, 0); + return; + } + + /* only proceed if we got more bytes... */ + } + + if (data->stop_chars) + { + found_pos = scan_for_chars (G_DATA_INPUT_STREAM (buffer), + &data->checked, + data->stop_chars, + data->stop_chars_len); + newline_len = 0; + } + else + found_pos = scan_for_newline (G_DATA_INPUT_STREAM (buffer), &data->checked, + &data->last_saw_cr, &newline_len); + + if (found_pos == -1) + /* didn't find a full line; need to buffer some more bytes */ + { + 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, + g_task_get_priority (task), + g_task_get_cancellable (task), + 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 (task, found_pos, newline_len); + } +} + +static void +g_data_input_stream_read_data_free (gpointer user_data) +{ + GDataInputStreamReadData *data = user_data; + + g_free (data->stop_chars); + g_slice_free (GDataInputStreamReadData, data); +} + +static void +g_data_input_stream_read_async (GDataInputStream *stream, + const gchar *stop_chars, + gssize stop_chars_len, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDataInputStreamReadData *data; + GTask *task; + + data = g_slice_new0 (GDataInputStreamReadData); + if (stop_chars_len == -1) + stop_chars_len = strlen (stop_chars); + data->stop_chars = g_memdup (stop_chars, stop_chars_len); + data->stop_chars_len = stop_chars_len; + data->last_saw_cr = FALSE; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, data, g_data_input_stream_read_data_free); + g_task_set_priority (task, io_priority); + + g_data_input_stream_read_line_ready (NULL, NULL, task); +} + +static gchar * +g_data_input_stream_read_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + GTask *task = G_TASK (result); + gchar *line; + + line = g_task_propagate_pointer (task, error); + + if (length && line) + { + GDataInputStreamReadData *data = g_task_get_task_data (task); + + *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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied. + * @user_data: (closure): 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, 0, io_priority, + cancellable, callback, user_data); +} + +/** + * 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied. + * @user_data: (closure): 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. + * + * Don't use this function in new code. Its functionality is + * inconsistent with g_data_input_stream_read_until(). Both functions + * will be marked as deprecated in a future release. Use + * g_data_input_stream_read_upto_async() instead. + * + * 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, -1, io_priority, + cancellable, callback, user_data); +} + +/** + * g_data_input_stream_read_line_finish: + * @stream: a given #GDataInputStream. + * @result: the #GAsyncResult that was provided to the callback. + * @length: (out): 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(). Note the warning about + * string encoding in g_data_input_stream_read_line() applies here as + * well. + * + * Returns: (transfer full) (array zero-terminated=1) (element-type guint8): a + * NUL-terminated byte array 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_task_is_valid (result, stream), NULL); + + return g_data_input_stream_read_finish (stream, result, length, error); +} + +/** + * g_data_input_stream_read_line_finish_utf8: + * @stream: a given #GDataInputStream. + * @result: the #GAsyncResult that was provided to the callback. + * @length: (out): 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: (transfer full): 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. For UTF-8 conversion errors, the set error domain is + * %G_CONVERT_ERROR. If there's no content to read, it will still + * return %NULL, but @error won't be set. + * + * Since: 2.30 + */ +gchar * +g_data_input_stream_read_line_finish_utf8 (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + gchar *res; + + res = g_data_input_stream_read_line_finish (stream, result, length, error); + if (!res) + return NULL; + + if (!g_utf8_validate (res, -1, NULL)) + { + g_set_error_literal (error, G_CONVERT_ERROR, + G_CONVERT_ERROR_ILLEGAL_SEQUENCE, + _("Invalid byte sequence in conversion input")); + g_free (res); + return NULL; + } + return res; +} + +/** + * g_data_input_stream_read_until_finish: + * @stream: a given #GDataInputStream. + * @result: the #GAsyncResult that was provided to the callback. + * @length: (out): 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: (transfer full): 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_task_is_valid (result, stream), NULL); + + return g_data_input_stream_read_finish (stream, result, length, error); +} + +/** + * g_data_input_stream_read_upto: + * @stream: a #GDataInputStream + * @stop_chars: characters to terminate the read + * @stop_chars_len: length of @stop_chars. May be -1 if @stop_chars is + * nul-terminated + * @length: (out): a #gsize to get the length of the data read in + * @cancellable: (allow-none): 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. + * + * In contrast to g_data_input_stream_read_until(), this function + * does not consume the stop character. You have + * to use g_data_input_stream_read_byte() to get it before calling + * g_data_input_stream_read_upto() again. + * + * Note that @stop_chars may contain '\0' if @stop_chars_len is + * specified. + * + * Returns: (transfer full): 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.26 + */ +char * +g_data_input_stream_read_upto (GDataInputStream *stream, + const gchar *stop_chars, + gssize stop_chars_len, + gsize *length, + GCancellable *cancellable, + GError **error) +{ + GBufferedInputStream *bstream; + gsize checked; + gssize found_pos; + gssize res; + char *data_until; + + g_return_val_if_fail (G_IS_DATA_INPUT_STREAM (stream), NULL); + + if (stop_chars_len < 0) + stop_chars_len = strlen (stop_chars); + + bstream = G_BUFFERED_INPUT_STREAM (stream); + + checked = 0; + + while ((found_pos = scan_for_chars (stream, &checked, stop_chars, stop_chars_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; + break; + } + } + } + + data_until = g_malloc (found_pos + 1); + + res = g_input_stream_read (G_INPUT_STREAM (stream), + data_until, + found_pos, + NULL, NULL); + if (length) + *length = (gsize)found_pos; + g_warn_if_fail (res == found_pos); + data_until[found_pos] = 0; + + return data_until; +} + +/** + * g_data_input_stream_read_upto_async: + * @stream: a #GDataInputStream + * @stop_chars: characters to terminate the read + * @stop_chars_len: length of @stop_chars. May be -1 if @stop_chars is + * nul-terminated + * @io_priority: the I/O priority + * of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * The asynchronous version of g_data_input_stream_read_upto(). + * It is an error to have two outstanding calls to this function. + * + * In contrast to g_data_input_stream_read_until(), this function + * does not consume the stop character. You have + * to use g_data_input_stream_read_byte() to get it before calling + * g_data_input_stream_read_upto() again. + * + * Note that @stop_chars may contain '\0' if @stop_chars_len is + * specified. + * + * When the operation is finished, @callback will be called. You + * can then call g_data_input_stream_read_upto_finish() to get + * the result of the operation. + * + * Since: 2.26 + */ +void +g_data_input_stream_read_upto_async (GDataInputStream *stream, + const gchar *stop_chars, + gssize stop_chars_len, + 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, stop_chars_len, io_priority, + cancellable, callback, user_data); +} + +/** + * g_data_input_stream_read_upto_finish: + * @stream: a #GDataInputStream + * @result: the #GAsyncResult that was provided to the callback + * @length: (out): 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_upto_async(). + * + * Note that this function does not consume the + * stop character. You have to use g_data_input_stream_read_byte() to + * get it before calling g_data_input_stream_read_upto_async() again. + * + * Returns: (transfer full): 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.24 + */ +gchar * +g_data_input_stream_read_upto_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), NULL); + + return g_data_input_stream_read_finish (stream, result, length, error); +} diff --git a/gio/gdatainputstream.h b/gio/gdatainputstream.h new file mode 100644 index 0000000..3ebf67a --- /dev/null +++ b/gio/gdatainputstream.h @@ -0,0 +1,182 @@ +/* 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_DATA_INPUT_STREAM_H__ +#define __G_DATA_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_data_input_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDataInputStream * g_data_input_stream_new (GInputStream *base_stream); + +GLIB_AVAILABLE_IN_ALL +void g_data_input_stream_set_byte_order (GDataInputStream *stream, + GDataStreamByteOrder order); +GLIB_AVAILABLE_IN_ALL +GDataStreamByteOrder g_data_input_stream_get_byte_order (GDataInputStream *stream); +GLIB_AVAILABLE_IN_ALL +void g_data_input_stream_set_newline_type (GDataInputStream *stream, + GDataStreamNewlineType type); +GLIB_AVAILABLE_IN_ALL +GDataStreamNewlineType g_data_input_stream_get_newline_type (GDataInputStream *stream); +GLIB_AVAILABLE_IN_ALL +guchar g_data_input_stream_read_byte (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint16 g_data_input_stream_read_int16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +guint16 g_data_input_stream_read_uint16 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint32 g_data_input_stream_read_int32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +guint32 g_data_input_stream_read_uint32 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint64 g_data_input_stream_read_int64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +guint64 g_data_input_stream_read_uint64 (GDataInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_line (GDataInputStream *stream, + gsize *length, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_30 +char * g_data_input_stream_read_line_utf8 (GDataInputStream *stream, + gsize *length, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_data_input_stream_read_line_async (GDataInputStream *stream, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_line_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error); +GLIB_AVAILABLE_IN_2_30 +char * g_data_input_stream_read_line_finish_utf8(GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error); +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_until (GDataInputStream *stream, + const gchar *stop_chars, + gsize *length, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_data_input_stream_read_until_async (GDataInputStream *stream, + const gchar *stop_chars, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_until_finish (GDataInputStream *stream, + GAsyncResult *result, + gsize *length, + GError **error); + +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_upto (GDataInputStream *stream, + const gchar *stop_chars, + gssize stop_chars_len, + gsize *length, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_data_input_stream_read_upto_async (GDataInputStream *stream, + const gchar *stop_chars, + gssize stop_chars_len, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +char * g_data_input_stream_read_upto_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..5abf68f --- /dev/null +++ b/gio/gdataoutputstream.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 "gdataoutputstream.h" +#include "gseekable.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "glibintl.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); + +static void g_data_output_stream_seekable_iface_init (GSeekableIface *iface); +static goffset g_data_output_stream_tell (GSeekable *seekable); +static gboolean g_data_output_stream_can_seek (GSeekable *seekable); +static gboolean g_data_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static gboolean g_data_output_stream_can_truncate (GSeekable *seekable); +static gboolean g_data_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_DEFINE_TYPE_WITH_CODE (GDataOutputStream, + g_data_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_SEEKABLE, + g_data_output_stream_seekable_iface_init)) + + +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; +} + +static void +g_data_output_stream_seekable_iface_init (GSeekableIface *iface) +{ + iface->tell = g_data_output_stream_tell; + iface->can_seek = g_data_output_stream_can_seek; + iface->seek = g_data_output_stream_seek; + iface->can_truncate = g_data_output_stream_can_truncate; + iface->truncate_fn = g_data_output_stream_truncate; +} + +/** + * 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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); +} + +static goffset +g_data_output_stream_tell (GSeekable *seekable) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + return 0; + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_tell (base_stream_seekable); +} + +static gboolean +g_data_output_stream_can_seek (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_seek (G_SEEKABLE (base_stream)); +} + +static gboolean +g_data_output_stream_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Seek not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_seek (base_stream_seekable, offset, type, cancellable, error); +} + +static gboolean +g_data_output_stream_can_truncate (GSeekable *seekable) +{ + GOutputStream *base_stream; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + return G_IS_SEEKABLE (base_stream) && g_seekable_can_truncate (G_SEEKABLE (base_stream)); +} + +static gboolean +g_data_output_stream_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error) +{ + GOutputStream *base_stream; + GSeekable *base_stream_seekable; + + base_stream = G_FILTER_OUTPUT_STREAM (seekable)->base_stream; + if (!G_IS_SEEKABLE (base_stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Truncate not supported on base stream")); + return FALSE; + } + + base_stream_seekable = G_SEEKABLE (base_stream); + return g_seekable_truncate (base_stream_seekable, offset, cancellable, error); +} diff --git a/gio/gdataoutputstream.h b/gio/gdataoutputstream.h new file mode 100644 index 0000000..12db684 --- /dev/null +++ b/gio/gdataoutputstream.h @@ -0,0 +1,127 @@ +/* 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_DATA_OUTPUT_STREAM_H__ +#define __G_DATA_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_data_output_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDataOutputStream * g_data_output_stream_new (GOutputStream *base_stream); + +GLIB_AVAILABLE_IN_ALL +void g_data_output_stream_set_byte_order (GDataOutputStream *stream, + GDataStreamByteOrder order); +GLIB_AVAILABLE_IN_ALL +GDataStreamByteOrder g_data_output_stream_get_byte_order (GDataOutputStream *stream); + +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_byte (GDataOutputStream *stream, + guchar data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_int16 (GDataOutputStream *stream, + gint16 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_uint16 (GDataOutputStream *stream, + guint16 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_int32 (GDataOutputStream *stream, + gint32 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_uint32 (GDataOutputStream *stream, + guint32 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_int64 (GDataOutputStream *stream, + gint64 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_data_output_stream_put_uint64 (GDataOutputStream *stream, + guint64 data, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +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/gdbus-2.0/codegen/.gitignore b/gio/gdbus-2.0/codegen/.gitignore new file mode 100644 index 0000000..2d1abb9 --- /dev/null +++ b/gio/gdbus-2.0/codegen/.gitignore @@ -0,0 +1,2 @@ +*.pyc +gdbus-codegen diff --git a/gio/gdbus-2.0/codegen/Makefile.am b/gio/gdbus-2.0/codegen/Makefile.am new file mode 100644 index 0000000..1afdaf0 --- /dev/null +++ b/gio/gdbus-2.0/codegen/Makefile.am @@ -0,0 +1,30 @@ +include $(top_srcdir)/Makefile.decl + +NULL = +bin_SCRIPTS = +CLEANFILES = + +codegendir = $(datadir)/glib-2.0/codegen +codegen_PYTHON = \ + __init__.py \ + codegen.py \ + codegen_main.py \ + codegen_docbook.py \ + config.py \ + dbustypes.py \ + parser.py \ + utils.py \ + $(NULL) + +CLEANFILES += config.pyc + +bin_SCRIPTS += gdbus-codegen +CLEANFILES += gdbus-codegen +EXTRA_DIST += gdbus-codegen.in + +gdbus-codegen: gdbus-codegen.in Makefile $(codegen_PYTHON) + $(AM_V_GEN) sed -e 's,@datadir\@,$(datadir),' -e 's,@PYTHON\@,$(PYTHON),' $< > $@.tmp && mv $@.tmp $@ + @chmod a+x $@ + +clean-local: + rm -f *~ diff --git a/gio/gdbus-2.0/codegen/__init__.py b/gio/gdbus-2.0/codegen/__init__.py new file mode 100644 index 0000000..abfca81 --- /dev/null +++ b/gio/gdbus-2.0/codegen/__init__.py @@ -0,0 +1,29 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import os + +builddir = os.environ.get('UNINSTALLED_GLIB_BUILDDIR') + +if builddir is not None: + __path__.append(os.path.abspath(os.path.join(builddir, 'gio', 'gdbus-2.0', 'codegen'))) diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py new file mode 100644 index 0000000..2f5ba83 --- /dev/null +++ b/gio/gdbus-2.0/codegen/codegen.py @@ -0,0 +1,3375 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import sys + +from . import config +from . import utils +from . import dbustypes + +# ---------------------------------------------------------------------------------------------------- + +class CodeGenerator: + def __init__(self, ifaces, namespace, interface_prefix, generate_objmanager, docbook_gen, h, c): + self.docbook_gen = docbook_gen + self.generate_objmanager = generate_objmanager + self.ifaces = ifaces + self.h = h + self.c = c + self.namespace = namespace + if len(namespace) > 0: + if utils.is_ugly_case(namespace): + self.namespace = namespace.replace('_', '') + self.ns_upper = namespace.upper() + '_' + self.ns_lower = namespace.lower() + '_' + else: + self.ns_upper = utils.camel_case_to_uscore(namespace).upper() + '_' + self.ns_lower = utils.camel_case_to_uscore(namespace).lower() + '_' + else: + self.ns_upper = '' + self.ns_lower = '' + self.interface_prefix = interface_prefix + self.header_guard = self.h.name.upper().replace('.', '_').replace('-', '_').replace('/', '_') + + # ---------------------------------------------------------------------------------------------------- + + def generate_intro(self): + self.c.write('/*\n' + ' * Generated by gdbus-codegen %s. DO NOT EDIT.\n' + ' *\n' + ' * The license of this code is the same as for the source it was derived from.\n' + ' */\n' + '\n' + %(config.VERSION)) + self.c.write('#ifdef HAVE_CONFIG_H\n' + '# include "config.h"\n' + '#endif\n' + '\n' + '#include "%s"\n' + '\n' + '#include \n' + %(self.h.name)) + + self.c.write('#ifdef G_OS_UNIX\n' + '# include \n' + '#endif\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' GDBusArgInfo parent_struct;\n' + ' gboolean use_gvariant;\n' + '} _ExtendedGDBusArgInfo;\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' GDBusMethodInfo parent_struct;\n' + ' const gchar *signal_name;\n' + ' gboolean pass_fdlist;\n' + '} _ExtendedGDBusMethodInfo;\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' GDBusSignalInfo parent_struct;\n' + ' const gchar *signal_name;\n' + '} _ExtendedGDBusSignalInfo;\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' GDBusPropertyInfo parent_struct;\n' + ' const gchar *hyphen_name;\n' + ' gboolean use_gvariant;\n' + '} _ExtendedGDBusPropertyInfo;\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' GDBusInterfaceInfo parent_struct;\n' + ' const gchar *hyphen_name;\n' + '} _ExtendedGDBusInterfaceInfo;\n' + '\n') + + self.c.write('typedef struct\n' + '{\n' + ' const _ExtendedGDBusPropertyInfo *info;\n' + ' guint prop_id;\n' + ' GValue orig_value; /* the value before the change */\n' + '} ChangedProperty;\n' + '\n' + 'static void\n' + '_changed_property_free (ChangedProperty *data)\n' + '{\n' + ' g_value_unset (&data->orig_value);\n' + ' g_free (data);\n' + '}\n' + '\n') + + self.c.write('static gboolean\n' + '_g_strv_equal0 (gchar **a, gchar **b)\n' + '{\n' + ' gboolean ret = FALSE;\n' + ' guint n;\n' + ' if (a == NULL && b == NULL)\n' + ' {\n' + ' ret = TRUE;\n' + ' goto out;\n' + ' }\n' + ' if (a == NULL || b == NULL)\n' + ' goto out;\n' + ' if (g_strv_length (a) != g_strv_length (b))\n' + ' goto out;\n' + ' for (n = 0; a[n] != NULL; n++)\n' + ' if (g_strcmp0 (a[n], b[n]) != 0)\n' + ' goto out;\n' + ' ret = TRUE;\n' + 'out:\n' + ' return ret;\n' + '}\n' + '\n') + + self.c.write('static gboolean\n' + '_g_variant_equal0 (GVariant *a, GVariant *b)\n' + '{\n' + ' gboolean ret = FALSE;\n' + ' if (a == NULL && b == NULL)\n' + ' {\n' + ' ret = TRUE;\n' + ' goto out;\n' + ' }\n' + ' if (a == NULL || b == NULL)\n' + ' goto out;\n' + ' ret = g_variant_equal (a, b);\n' + 'out:\n' + ' return ret;\n' + '}\n' + '\n') + + # simplified - only supports the types we use + self.c.write('G_GNUC_UNUSED static gboolean\n' + '_g_value_equal (const GValue *a, const GValue *b)\n' + '{\n' + ' gboolean ret = FALSE;\n' + ' g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));\n' + ' switch (G_VALUE_TYPE (a))\n' + ' {\n' + ' case G_TYPE_BOOLEAN:\n' + ' ret = (g_value_get_boolean (a) == g_value_get_boolean (b));\n' + ' break;\n' + ' case G_TYPE_UCHAR:\n' + ' ret = (g_value_get_uchar (a) == g_value_get_uchar (b));\n' + ' break;\n' + ' case G_TYPE_INT:\n' + ' ret = (g_value_get_int (a) == g_value_get_int (b));\n' + ' break;\n' + ' case G_TYPE_UINT:\n' + ' ret = (g_value_get_uint (a) == g_value_get_uint (b));\n' + ' break;\n' + ' case G_TYPE_INT64:\n' + ' ret = (g_value_get_int64 (a) == g_value_get_int64 (b));\n' + ' break;\n' + ' case G_TYPE_UINT64:\n' + ' ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));\n' + ' break;\n' + ' case G_TYPE_DOUBLE:\n' + ' {\n' + ' /* Avoid -Wfloat-equal warnings by doing a direct bit compare */\n' + ' gdouble da = g_value_get_double (a);\n' + ' gdouble db = g_value_get_double (b);\n' + ' ret = memcmp (&da, &db, sizeof (gdouble)) == 0;\n' + ' }\n' + ' break;\n' + ' case G_TYPE_STRING:\n' + ' ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);\n' + ' break;\n' + ' case G_TYPE_VARIANT:\n' + ' ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));\n' + ' break;\n' + ' default:\n' + ' if (G_VALUE_TYPE (a) == G_TYPE_STRV)\n' + ' ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));\n' + ' else\n' + ' g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));\n' + ' break;\n' + ' }\n' + ' return ret;\n' + '}\n' + '\n') + + self.h.write('/*\n' + ' * Generated by gdbus-codegen %s. DO NOT EDIT.\n' + ' *\n' + ' * The license of this code is the same as for the source it was derived from.\n' + ' */\n' + '\n' + '#ifndef __%s__\n' + '#define __%s__\n' + '\n'%(config.VERSION, self.header_guard, self.header_guard)) + self.h.write('#include \n' + '\n' + 'G_BEGIN_DECLS\n' + '\n') + + # ---------------------------------------------------------------------------------------------------- + + def declare_types(self): + for i in self.ifaces: + self.h.write('\n') + self.h.write('/* ------------------------------------------------------------------------ */\n') + self.h.write('/* Declarations for %s */\n'%i.name) + self.h.write('\n') + + # First the GInterface + self.h.write('#define %sTYPE_%s (%s_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower)) + self.h.write('#define %s%s(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s, %s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %sIS_%s(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + self.h.write('#define %s%s_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_%s, %sIface))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('\n') + self.h.write('struct _%s;\n'%(i.camel_name)) + self.h.write('typedef struct _%s %s;\n'%(i.camel_name, i.camel_name)) + self.h.write('typedef struct _%sIface %sIface;\n'%(i.camel_name, i.camel_name)) + self.h.write('\n') + self.h.write('struct _%sIface\n'%(i.camel_name)) + self.h.write('{\n') + self.h.write(' GTypeInterface parent_iface;\n') + + function_pointers = {} + + # vfuncs for methods + if len(i.methods) > 0: + self.h.write('\n') + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + key = (m.since, '_method_%s'%m.name_lower) + value = ' gboolean (*handle_%s) (\n'%(m.name_lower) + value += ' %s *object,\n'%(i.camel_name) + value += ' GDBusMethodInvocation *invocation'%() + if unix_fd: + value += ',\n GUnixFDList *fd_list' + for a in m.in_args: + value += ',\n %sarg_%s'%(a.ctype_in, a.name) + value += ');\n\n' + function_pointers[key] = value + + # vfuncs for signals + if len(i.signals) > 0: + self.h.write('\n') + for s in i.signals: + key = (s.since, '_signal_%s'%s.name_lower) + value = ' void (*%s) (\n'%(s.name_lower) + value += ' %s *object'%(i.camel_name) + for a in s.args: + value += ',\n %sarg_%s'%(a.ctype_in, a.name) + value += ');\n\n' + function_pointers[key] = value + + # vfuncs for properties + if len(i.properties) > 0: + self.h.write('\n') + for p in i.properties: + key = (p.since, '_prop_get_%s'%p.name_lower) + value = ' %s (*get_%s) (%s *object);\n\n'%(p.arg.ctype_in, p.name_lower, i.camel_name) + function_pointers[key] = value + + # Sort according to @since tag, then name.. this ensures + # that the function pointers don't change order assuming + # judicious use of @since + # + # Also use a proper version comparison function so e.g. + # 10.0 comes after 2.0. + # + # See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5 + # for discussion + for key in sorted(function_pointers.keys(), key=utils.version_cmp_key): + self.h.write('%s'%function_pointers[key]) + + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %s_get_type (void) G_GNUC_CONST;\n'%(i.name_lower)) + self.h.write('\n') + self.h.write('GDBusInterfaceInfo *%s_interface_info (void);\n'%(i.name_lower)) + self.h.write('guint %s_override_properties (GObjectClass *klass, guint property_id_begin);\n'%(i.name_lower)) + self.h.write('\n') + + # Then method call completion functions + if len(i.methods) > 0: + self.h.write('\n') + self.h.write('/* D-Bus method call completion functions: */\n') + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + if m.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_complete_%s (\n' + ' %s *object,\n' + ' GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name)) + if unix_fd: + self.h.write(',\n GUnixFDList *fd_list') + for a in m.out_args: + self.h.write(',\n %s%s'%(a.ctype_in, a.name)) + self.h.write(');\n') + self.h.write('\n') + self.h.write('\n') + + # Then signal emission functions + if len(i.signals) > 0: + self.h.write('\n') + self.h.write('/* D-Bus signal emissions functions: */\n') + for s in i.signals: + if s.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_emit_%s (\n' + ' %s *object'%(i.name_lower, s.name_lower, i.camel_name)) + for a in s.args: + self.h.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + self.h.write(');\n') + self.h.write('\n') + self.h.write('\n') + + # Then method call declarations + if len(i.methods) > 0: + self.h.write('\n') + self.h.write('/* D-Bus method calls: */\n') + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + # async begin + if m.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_call_%s (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.h.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + if unix_fd: + self.h.write(',\n GUnixFDList *fd_list') + self.h.write(',\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data);\n') + self.h.write('\n') + # async finish + if m.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('gboolean %s_call_%s_finish (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.out_args: + self.h.write(',\n %sout_%s'%(a.ctype_out, a.name)) + if unix_fd: + self.h.write(',\n GUnixFDList **out_fd_list') + self.h.write(',\n' + ' GAsyncResult *res,\n' + ' GError **error);\n') + self.h.write('\n') + # sync + if m.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('gboolean %s_call_%s_sync (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.h.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + if unix_fd: + self.h.write(',\n GUnixFDList *fd_list') + for a in m.out_args: + self.h.write(',\n %sout_%s'%(a.ctype_out, a.name)) + if unix_fd: + self.h.write(',\n GUnixFDList **out_fd_list') + self.h.write(',\n' + ' GCancellable *cancellable,\n' + ' GError **error);\n') + self.h.write('\n') + self.h.write('\n') + + # Then the property accessor declarations + if len(i.properties) > 0: + self.h.write('\n') + self.h.write('/* D-Bus property accessors: */\n') + for p in i.properties: + # getter + if p.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s%s_get_%s (%s *object);\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name)) + if p.arg.free_func != None: + if p.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s%s_dup_%s (%s *object);\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name)) + # setter + if p.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_set_%s (%s *object, %svalue);\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, )) + self.h.write('\n') + + # Then the proxy + self.h.write('\n') + self.h.write('/* ---- */\n') + self.h.write('\n') + self.h.write('#define %sTYPE_%s_PROXY (%s_proxy_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower)) + self.h.write('#define %s%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_PROXY, %sProxy))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %s%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %s%s_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %sIS_%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + self.h.write('#define %sIS_%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + self.h.write('\n') + self.h.write('typedef struct _%sProxy %sProxy;\n'%(i.camel_name, i.camel_name)) + self.h.write('typedef struct _%sProxyClass %sProxyClass;\n'%(i.camel_name, i.camel_name)) + self.h.write('typedef struct _%sProxyPrivate %sProxyPrivate;\n'%(i.camel_name, i.camel_name)) + self.h.write('\n') + self.h.write('struct _%sProxy\n'%(i.camel_name)) + self.h.write('{\n') + self.h.write(' /*< private >*/\n') + self.h.write(' GDBusProxy parent_instance;\n') + self.h.write(' %sProxyPrivate *priv;\n'%(i.camel_name)) + self.h.write('};\n') + self.h.write('\n') + self.h.write('struct _%sProxyClass\n'%(i.camel_name)) + self.h.write('{\n') + self.h.write(' GDBusProxyClass parent_class;\n') + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %s_proxy_get_type (void) G_GNUC_CONST;\n'%(i.name_lower)) + + self.h.write('\n') + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_proxy_new (\n' + ' GDBusConnection *connection,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data);\n' + %(i.name_lower)) + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s *%s_proxy_new_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error);\n' + %(i.camel_name, i.name_lower)) + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s *%s_proxy_new_sync (\n' + ' GDBusConnection *connection,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error);\n' + %(i.camel_name, i.name_lower)) + self.h.write('\n') + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('void %s_proxy_new_for_bus (\n' + ' GBusType bus_type,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data);\n' + %(i.name_lower)) + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s *%s_proxy_new_for_bus_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error);\n' + %(i.camel_name, i.name_lower)) + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s *%s_proxy_new_for_bus_sync (\n' + ' GBusType bus_type,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error);\n' + %(i.camel_name, i.name_lower)) + self.h.write('\n') + + # Then the skeleton + self.h.write('\n') + self.h.write('/* ---- */\n') + self.h.write('\n') + self.h.write('#define %sTYPE_%s_SKELETON (%s_skeleton_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower)) + self.h.write('#define %s%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_SKELETON, %sSkeleton))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %s%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %s%s_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name)) + self.h.write('#define %sIS_%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + self.h.write('#define %sIS_%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + self.h.write('\n') + self.h.write('typedef struct _%sSkeleton %sSkeleton;\n'%(i.camel_name, i.camel_name)) + self.h.write('typedef struct _%sSkeletonClass %sSkeletonClass;\n'%(i.camel_name, i.camel_name)) + self.h.write('typedef struct _%sSkeletonPrivate %sSkeletonPrivate;\n'%(i.camel_name, i.camel_name)) + self.h.write('\n') + self.h.write('struct _%sSkeleton\n'%(i.camel_name)) + self.h.write('{\n') + self.h.write(' /*< private >*/\n') + self.h.write(' GDBusInterfaceSkeleton parent_instance;\n') + self.h.write(' %sSkeletonPrivate *priv;\n'%(i.camel_name)) + self.h.write('};\n') + self.h.write('\n') + self.h.write('struct _%sSkeletonClass\n'%(i.camel_name)) + self.h.write('{\n') + self.h.write(' GDBusInterfaceSkeletonClass parent_class;\n') + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %s_skeleton_get_type (void) G_GNUC_CONST;\n'%(i.name_lower)) + self.h.write('\n') + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write('%s *%s_skeleton_new (void);\n'%(i.camel_name, i.name_lower)) + + self.h.write('\n') + + # Finally, the Object, ObjectProxy, ObjectSkeleton and ObjectManagerClient + if self.generate_objmanager: + self.h.write('\n') + self.h.write('/* ---- */\n') + self.h.write('\n') + self.h.write('#define %sTYPE_OBJECT (%sobject_get_type ())\n'%(self.ns_upper, self.ns_lower)) + self.h.write('#define %sOBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sIS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('#define %sOBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('\n') + self.h.write('struct _%sObject;\n'%(self.namespace)) + self.h.write('typedef struct _%sObject %sObject;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectIface %sObjectIface;\n'%(self.namespace, self.namespace)) + self.h.write('\n') + self.h.write('struct _%sObjectIface\n'%(self.namespace)) + self.h.write('{\n' + ' GTypeInterface parent_iface;\n' + '};\n' + '\n') + self.h.write('GType %sobject_get_type (void) G_GNUC_CONST;\n' + '\n' + %(self.ns_lower)) + for i in self.ifaces: + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write ('%s *%sobject_get_%s (%sObject *object);\n' + %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace)) + for i in self.ifaces: + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write ('%s *%sobject_peek_%s (%sObject *object);\n' + %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace)) + self.h.write('\n') + self.h.write('#define %sTYPE_OBJECT_PROXY (%sobject_proxy_get_type ())\n'%(self.ns_upper, self.ns_lower)) + self.h.write('#define %sOBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_PROXY, %sObjectProxy))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sIS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('#define %sIS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('\n') + self.h.write('typedef struct _%sObjectProxy %sObjectProxy;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectProxyClass %sObjectProxyClass;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectProxyPrivate %sObjectProxyPrivate;\n'%(self.namespace, self.namespace)) + self.h.write('\n') + self.h.write('struct _%sObjectProxy\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' /*< private >*/\n') + self.h.write(' GDBusObjectProxy parent_instance;\n') + self.h.write(' %sObjectProxyPrivate *priv;\n'%(self.namespace)) + self.h.write('};\n') + self.h.write('\n') + self.h.write('struct _%sObjectProxyClass\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' GDBusObjectProxyClass parent_class;\n') + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %sobject_proxy_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower)) + self.h.write('%sObjectProxy *%sobject_proxy_new (GDBusConnection *connection, const gchar *object_path);\n'%(self.namespace, self.ns_lower)) + self.h.write('\n') + self.h.write('#define %sTYPE_OBJECT_SKELETON (%sobject_skeleton_get_type ())\n'%(self.ns_upper, self.ns_lower)) + self.h.write('#define %sOBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeleton))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sIS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('#define %sIS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('\n') + self.h.write('typedef struct _%sObjectSkeleton %sObjectSkeleton;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectSkeletonClass %sObjectSkeletonClass;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectSkeletonPrivate %sObjectSkeletonPrivate;\n'%(self.namespace, self.namespace)) + self.h.write('\n') + self.h.write('struct _%sObjectSkeleton\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' /*< private >*/\n') + self.h.write(' GDBusObjectSkeleton parent_instance;\n') + self.h.write(' %sObjectSkeletonPrivate *priv;\n'%(self.namespace)) + self.h.write('};\n') + self.h.write('\n') + self.h.write('struct _%sObjectSkeletonClass\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' GDBusObjectSkeletonClass parent_class;\n') + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %sobject_skeleton_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower)) + self.h.write('%sObjectSkeleton *%sobject_skeleton_new (const gchar *object_path);\n' + %(self.namespace, self.ns_lower)) + for i in self.ifaces: + if i.deprecated: + self.h.write('G_GNUC_DEPRECATED ') + self.h.write ('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_);\n' + %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name)) + self.h.write('\n') + + self.h.write('/* ---- */\n') + self.h.write('\n') + self.h.write('#define %sTYPE_OBJECT_MANAGER_CLIENT (%sobject_manager_client_get_type ())\n'%(self.ns_upper, self.ns_lower)) + self.h.write('#define %sOBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClient))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sOBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace)) + self.h.write('#define %sIS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('#define %sIS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper)) + self.h.write('\n') + self.h.write('typedef struct _%sObjectManagerClient %sObjectManagerClient;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectManagerClientClass %sObjectManagerClientClass;\n'%(self.namespace, self.namespace)) + self.h.write('typedef struct _%sObjectManagerClientPrivate %sObjectManagerClientPrivate;\n'%(self.namespace, self.namespace)) + self.h.write('\n') + self.h.write('struct _%sObjectManagerClient\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' /*< private >*/\n') + self.h.write(' GDBusObjectManagerClient parent_instance;\n') + self.h.write(' %sObjectManagerClientPrivate *priv;\n'%(self.namespace)) + self.h.write('};\n') + self.h.write('\n') + self.h.write('struct _%sObjectManagerClientClass\n'%(self.namespace)) + self.h.write('{\n') + self.h.write(' GDBusObjectManagerClientClass parent_class;\n') + self.h.write('};\n') + self.h.write('\n') + self.h.write('GType %sobject_manager_client_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower)) + self.h.write('\n') + self.h.write('GType %sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);\n'%(self.ns_lower)) + self.h.write('\n') + self.h.write('void %sobject_manager_client_new (\n' + ' GDBusConnection *connection,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data);\n' + %(self.ns_lower)) + self.h.write('GDBusObjectManager *%sobject_manager_client_new_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error);\n' + %(self.ns_lower)) + self.h.write('GDBusObjectManager *%sobject_manager_client_new_sync (\n' + ' GDBusConnection *connection,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error);\n' + %(self.ns_lower)) + self.h.write('\n') + self.h.write('void %sobject_manager_client_new_for_bus (\n' + ' GBusType bus_type,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data);\n' + %(self.ns_lower)) + self.h.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error);\n' + %(self.ns_lower)) + self.h.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_sync (\n' + ' GBusType bus_type,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error);\n' + %(self.ns_lower)) + self.h.write('\n') + + # ---------------------------------------------------------------------------------------------------- + + def generate_outro(self): + self.h.write('\n' + 'G_END_DECLS\n' + '\n' + '#endif /* __%s__ */\n'%(self.header_guard)) + + # ---------------------------------------------------------------------------------------------------- + + def generate_annotations(self, prefix, annotations): + if annotations == None: + return + + n = 0 + for a in annotations: + #self.generate_annotations('%s_%d'%(prefix, n), a.get_annotations()) + + # skip internal annotations + if a.key.startswith('org.gtk.GDBus'): + continue + + self.c.write('static const GDBusAnnotationInfo %s_%d =\n' + '{\n' + ' -1,\n' + ' (gchar *) "%s",\n' + ' (gchar *) "%s",\n'%(prefix, n, a.key, a.value)) + if len(a.annotations) == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &%s_%d_pointers\n'%(prefix, n)) + self.c.write('};\n' + '\n') + n += 1 + + if n > 0: + self.c.write('static const GDBusAnnotationInfo * const %s_pointers[] =\n' + '{\n'%(prefix)) + m = 0; + for a in annotations: + if a.key.startswith('org.gtk.GDBus'): + continue + self.c.write(' &%s_%d,\n'%(prefix, m)) + m += 1 + self.c.write(' NULL\n' + '};\n' + '\n') + return n + + def generate_args(self, prefix, args): + for a in args: + num_anno = self.generate_annotations('%s_arg_%s_annotation_info'%(prefix, a.name), a.annotations) + + self.c.write('static const _ExtendedGDBusArgInfo %s_%s =\n' + '{\n' + ' {\n' + ' -1,\n' + ' (gchar *) "%s",\n' + ' (gchar *) "%s",\n'%(prefix, a.name, a.name, a.signature)) + if num_anno == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &%s_arg_%s_annotation_info_pointers\n'%(prefix, a.name)) + self.c.write(' },\n') + if not utils.lookup_annotation(a.annotations, 'org.gtk.GDBus.C.ForceGVariant'): + self.c.write(' FALSE\n') + else: + self.c.write(' TRUE\n') + self.c.write('};\n' + '\n') + + if len(args) > 0: + self.c.write('static const _ExtendedGDBusArgInfo * const %s_pointers[] =\n' + '{\n'%(prefix)) + for a in args: + self.c.write(' &%s_%s,\n'%(prefix, a.name)) + self.c.write(' NULL\n' + '};\n' + '\n') + + def generate_introspection_for_interface(self, i): + self.c.write('/* ---- Introspection data for %s ---- */\n' + '\n'%(i.name)) + + if len(i.methods) > 0: + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + self.generate_args('_%s_method_info_%s_IN_ARG'%(i.name_lower, m.name_lower), m.in_args) + self.generate_args('_%s_method_info_%s_OUT_ARG'%(i.name_lower, m.name_lower), m.out_args) + + num_anno = self.generate_annotations('_%s_method_%s_annotation_info'%(i.name_lower, m.name_lower), m.annotations) + + self.c.write('static const _ExtendedGDBusMethodInfo _%s_method_info_%s =\n' + '{\n' + ' {\n' + ' -1,\n' + ' (gchar *) "%s",\n'%(i.name_lower, m.name_lower, m.name)) + if len(m.in_args) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusArgInfo **) &_%s_method_info_%s_IN_ARG_pointers,\n'%(i.name_lower, m.name_lower)) + if len(m.out_args) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusArgInfo **) &_%s_method_info_%s_OUT_ARG_pointers,\n'%(i.name_lower, m.name_lower)) + if num_anno == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &_%s_method_%s_annotation_info_pointers\n'%(i.name_lower, m.name_lower)) + self.c.write(' },\n' + ' "handle-%s",\n' + ' %s\n' + %(m.name_hyphen, 'TRUE' if unix_fd else 'FALSE')) + self.c.write('};\n' + '\n') + + self.c.write('static const _ExtendedGDBusMethodInfo * const _%s_method_info_pointers[] =\n' + '{\n'%(i.name_lower)) + for m in i.methods: + self.c.write(' &_%s_method_info_%s,\n'%(i.name_lower, m.name_lower)) + self.c.write(' NULL\n' + '};\n' + '\n') + + # --- + + if len(i.signals) > 0: + for s in i.signals: + self.generate_args('_%s_signal_info_%s_ARG'%(i.name_lower, s.name_lower), s.args) + + num_anno = self.generate_annotations('_%s_signal_%s_annotation_info'%(i.name_lower, s.name_lower), s.annotations) + self.c.write('static const _ExtendedGDBusSignalInfo _%s_signal_info_%s =\n' + '{\n' + ' {\n' + ' -1,\n' + ' (gchar *) "%s",\n'%(i.name_lower, s.name_lower, s.name)) + if len(s.args) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusArgInfo **) &_%s_signal_info_%s_ARG_pointers,\n'%(i.name_lower, s.name_lower)) + if num_anno == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &_%s_signal_%s_annotation_info_pointers\n'%(i.name_lower, s.name_lower)) + self.c.write(' },\n' + ' "%s"\n' + %(s.name_hyphen)) + self.c.write('};\n' + '\n') + + self.c.write('static const _ExtendedGDBusSignalInfo * const _%s_signal_info_pointers[] =\n' + '{\n'%(i.name_lower)) + for s in i.signals: + self.c.write(' &_%s_signal_info_%s,\n'%(i.name_lower, s.name_lower)) + self.c.write(' NULL\n' + '};\n' + '\n') + + # --- + + if len(i.properties) > 0: + for p in i.properties: + if p.readable and p.writable: + access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE' + elif p.readable: + access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE' + elif p.writable: + access = 'G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE' + else: + access = 'G_DBUS_PROPERTY_INFO_FLAGS_NONE' + num_anno = self.generate_annotations('_%s_property_%s_annotation_info'%(i.name_lower, p.name_lower), p.annotations) + self.c.write('static const _ExtendedGDBusPropertyInfo _%s_property_info_%s =\n' + '{\n' + ' {\n' + ' -1,\n' + ' (gchar *) "%s",\n' + ' (gchar *) "%s",\n' + ' %s,\n'%(i.name_lower, p.name_lower, p.name, p.arg.signature, access)) + if num_anno == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &_%s_property_%s_annotation_info_pointers\n'%(i.name_lower, p.name_lower)) + self.c.write(' },\n' + ' "%s",\n' + %(p.name_hyphen)) + if not utils.lookup_annotation(p.annotations, 'org.gtk.GDBus.C.ForceGVariant'): + self.c.write(' FALSE\n') + else: + self.c.write(' TRUE\n') + self.c.write('};\n' + '\n') + + self.c.write('static const _ExtendedGDBusPropertyInfo * const _%s_property_info_pointers[] =\n' + '{\n'%(i.name_lower)) + for p in i.properties: + self.c.write(' &_%s_property_info_%s,\n'%(i.name_lower, p.name_lower)) + self.c.write(' NULL\n' + '};\n' + '\n') + + num_anno = self.generate_annotations('_%s_annotation_info'%(i.name_lower), i.annotations) + self.c.write('static const _ExtendedGDBusInterfaceInfo _%s_interface_info =\n' + '{\n' + ' {\n' + ' -1,\n' + ' (gchar *) "%s",\n'%(i.name_lower, i.name)) + if len(i.methods) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusMethodInfo **) &_%s_method_info_pointers,\n'%(i.name_lower)) + if len(i.signals) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusSignalInfo **) &_%s_signal_info_pointers,\n'%(i.name_lower)) + if len(i.properties) == 0: + self.c.write(' NULL,\n') + else: + self.c.write(' (GDBusPropertyInfo **) &_%s_property_info_pointers,\n'%(i.name_lower)) + if num_anno == 0: + self.c.write(' NULL\n') + else: + self.c.write(' (GDBusAnnotationInfo **) &_%s_annotation_info_pointers\n'%(i.name_lower)) + self.c.write(' },\n' + ' "%s",\n' + '};\n' + '\n' + %(i.name_hyphen)) + self.c.write('\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_interface_info:\n' + ' *\n' + ' * Gets a machine-readable description of the #%s D-Bus interface.\n' + ' *\n' + ' * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.\n' + %(i.name_lower, i.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('GDBusInterfaceInfo *\n' + '%s_interface_info (void)\n' + '{\n' + ' return (GDBusInterfaceInfo *) &_%s_interface_info.parent_struct;\n' + '}\n' + '\n'%(i.name_lower, i.name_lower)) + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_override_properties:\n' + ' * @klass: The class structure for a #GObject-derived class.\n' + ' * @property_id_begin: The property id to assign to the first overridden property.\n' + ' *\n' + ' * Overrides all #GObject properties in the #%s interface for a concrete class.\n' + ' * The properties are overridden in the order they are defined.\n' + ' *\n' + ' * Returns: The last property id.\n' + %(i.name_lower, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('guint\n' + '%s_override_properties (GObjectClass *klass, guint property_id_begin)\n' + '{\n'%(i.name_lower)) + for p in i.properties: + self.c.write (' g_object_class_override_property (klass, property_id_begin++, "%s");\n'%(p.name_hyphen)) + self.c.write(' return property_id_begin - 1;\n' + '}\n' + '\n') + self.c.write('\n') + + # ---------------------------------------------------------------------------------------------------- + + def generate_interface(self, i): + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s:\n' + ' *\n' + ' * Abstract interface type for the D-Bus interface #%s.\n' + %(i.camel_name, i.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sIface:\n' + ' * @parent_iface: The parent interface.\n' + %(i.camel_name), False)) + + doc_bits = {} + if len(i.methods) > 0: + for m in i.methods: + key = (m.since, '_method_%s'%m.name_lower) + value = '@handle_%s: '%(m.name_lower) + value += 'Handler for the #%s::handle-%s signal.'%(i.camel_name, m.name_hyphen) + doc_bits[key] = value + if len(i.signals) > 0: + for s in i.signals: + key = (s.since, '_signal_%s'%s.name_lower) + value = '@%s: '%(s.name_lower) + value += 'Handler for the #%s::%s signal.'%(i.camel_name, s.name_hyphen) + doc_bits[key] = value + if len(i.properties) > 0: + for p in i.properties: + key = (p.since, '_prop_get_%s'%p.name_lower) + value = '@get_%s: '%(p.name_lower) + value += 'Getter for the #%s:%s property.'%(i.camel_name, p.name_hyphen) + doc_bits[key] = value + for key in sorted(doc_bits.keys(), key=utils.version_cmp_key): + self.c.write(' * %s\n'%doc_bits[key]) + + self.c.write(self.docbook_gen.expand( + ' *\n' + ' * Virtual table for the D-Bus interface #%s.\n' + %(i.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write('static void\n' + '%s_default_init (%sIface *iface)\n' + '{\n'%(i.name_lower, i.camel_name)); + + if len(i.methods) > 0: + self.c.write(' /* GObject signals for incoming D-Bus method calls: */\n') + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + self.c.write(self.docbook_gen.expand( + ' /**\n' + ' * %s::handle-%s:\n' + ' * @object: A #%s.\n' + ' * @invocation: A #GDBusMethodInvocation.\n' + %(i.camel_name, m.name_hyphen, i.camel_name), False)) + if unix_fd: + self.c.write (' * @fd_list: (allow-none): A #GUnixFDList or %NULL.\n') + for a in m.in_args: + self.c.write (' * @arg_%s: Argument passed by remote caller.\n'%(a.name)) + self.c.write(self.docbook_gen.expand( + ' *\n' + ' * Signal emitted when a remote caller is invoking the %s.%s() D-Bus method.\n' + ' *\n' + ' * If a signal handler returns %%TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call %s_complete_%s() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %%G_DBUS_ERROR_UNKNOWN_METHOD error is returned.\n' + ' *\n' + ' * Returns: %%TRUE if the invocation was handled, %%FALSE to let other signal handlers run.\n' + %(i.name, m.name, i.name_lower, m.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(m, self.c, 2) + if unix_fd: + extra_args = 2 + else: + extra_args = 1 + self.c.write(' g_signal_new ("handle-%s",\n' + ' G_TYPE_FROM_INTERFACE (iface),\n' + ' G_SIGNAL_RUN_LAST,\n' + ' G_STRUCT_OFFSET (%sIface, handle_%s),\n' + ' g_signal_accumulator_true_handled,\n' + ' NULL,\n' # accu_data + ' g_cclosure_marshal_generic,\n' + ' G_TYPE_BOOLEAN,\n' + ' %d,\n' + ' G_TYPE_DBUS_METHOD_INVOCATION' + %(m.name_hyphen, i.camel_name, m.name_lower, len(m.in_args) + extra_args)) + if unix_fd: + self.c.write(', G_TYPE_UNIX_FD_LIST') + for a in m.in_args: + self.c.write (', %s'%(a.gtype)) + self.c.write(');\n') + self.c.write('\n') + + if len(i.signals) > 0: + self.c.write(' /* GObject signals for received D-Bus signals: */\n') + for s in i.signals: + self.c.write(self.docbook_gen.expand( + ' /**\n' + ' * %s::%s:\n' + ' * @object: A #%s.\n' + %(i.camel_name, s.name_hyphen, i.camel_name), False)) + for a in s.args: + self.c.write (' * @arg_%s: Argument.\n'%(a.name)) + self.c.write(self.docbook_gen.expand( + ' *\n' + ' * On the client-side, this signal is emitted whenever the D-Bus signal #%s::%s is received.\n' + ' *\n' + ' * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.\n' + %(i.name, s.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(s, self.c, 2) + self.c.write(' g_signal_new ("%s",\n' + ' G_TYPE_FROM_INTERFACE (iface),\n' + ' G_SIGNAL_RUN_LAST,\n' + ' G_STRUCT_OFFSET (%sIface, %s),\n' + ' NULL,\n' # accumulator + ' NULL,\n' # accu_data + ' g_cclosure_marshal_generic,\n' + ' G_TYPE_NONE,\n' + ' %d' + %(s.name_hyphen, i.camel_name, s.name_lower, len(s.args))) + for a in s.args: + self.c.write (', %s'%(a.gtype)) + self.c.write(');\n') + self.c.write('\n') + + if len(i.properties) > 0: + self.c.write(' /* GObject properties for D-Bus properties: */\n') + for p in i.properties: + if p.readable and p.writable: + hint = 'Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.' + elif p.readable: + hint = 'Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.' + elif p.writable: + hint = 'Since the D-Bus property for this #GObject property is writable but not readable, it is meaningful to write to it on both the client- and service-side. It is only meaningful, however, to read from it on the service-side.' + else: + raise RuntimeError('Cannot handle property %s that neither readable nor writable'%(p.name)) + self.c.write(self.docbook_gen.expand( + ' /**\n' + ' * %s:%s:\n' + ' *\n' + ' * Represents the D-Bus property #%s:%s.\n' + ' *\n' + ' * %s\n' + %(i.camel_name, p.name_hyphen, i.name, p.name, hint), False)) + self.write_gtkdoc_deprecated_and_since_and_close(p, self.c, 2) + self.c.write(' g_object_interface_install_property (iface,\n') + if p.arg.gtype == 'G_TYPE_VARIANT': + s = 'g_param_spec_variant ("%s", "%s", "%s", G_VARIANT_TYPE ("%s"), NULL'%(p.name_hyphen, p.name, p.name, p.arg.signature) + elif p.arg.signature == 'b': + s = 'g_param_spec_boolean ("%s", "%s", "%s", FALSE'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'y': + s = 'g_param_spec_uchar ("%s", "%s", "%s", 0, 255, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'n': + s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT16, G_MAXINT16, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'q': + s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT16, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'i': + s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT32, G_MAXINT32, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'u': + s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT32, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'x': + s = 'g_param_spec_int64 ("%s", "%s", "%s", G_MININT64, G_MAXINT64, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 't': + s = 'g_param_spec_uint64 ("%s", "%s", "%s", 0, G_MAXUINT64, 0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'd': + s = 'g_param_spec_double ("%s", "%s", "%s", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 's': + s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'o': + s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'g': + s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'ay': + s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'as': + s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'ao': + s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name) + elif p.arg.signature == 'aay': + s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name) + else: + raise RuntimeError('Unsupported gtype %s for GParamSpec'%(p.arg.gtype)) + self.c.write(' %s, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));'%s); + self.c.write('\n') + + self.c.write('}\n' + '\n') + + self.c.write('typedef %sIface %sInterface;\n'%(i.camel_name, i.camel_name)) + self.c.write('G_DEFINE_INTERFACE (%s, %s, G_TYPE_OBJECT);\n'%(i.camel_name, i.name_lower)) + self.c.write('\n') + + # ---------------------------------------------------------------------------------------------------- + + def generate_property_accessors(self, i): + for p in i.properties: + # getter + if p.readable and p.writable: + hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.' + elif p.readable: + hint = 'Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.' + elif p.writable: + hint = 'Since this D-Bus property is not readable, it is only meaningful to use this function on the service-side.' + else: + raise RuntimeError('Cannot handle property %s that neither readable nor writable'%(p.name)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_get_%s: (skip)\n' + ' * @object: A #%s.\n' + ' *\n' + ' * Gets the value of the #%s:%s D-Bus property.\n' + ' *\n' + ' * %s\n' + ' *\n' + %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False)) + if p.arg.free_func != None: + self.c.write(' * The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use %s_dup_%s() if on another thread.\n' + ' *\n' + ' * Returns: (transfer none): The property value or %%NULL if the property is not set. Do not free the returned value, it belongs to @object.\n' + %(i.name_lower, p.name_lower)) + else: + self.c.write(' * Returns: The property value.\n') + self.write_gtkdoc_deprecated_and_since_and_close(p, self.c, 0) + self.c.write('%s\n' + '%s_get_%s (%s *object)\n' + '{\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name)) + self.c.write(' return %s%s_GET_IFACE (object)->get_%s (object);\n'%(i.ns_upper, i.name_upper, p.name_lower)) + self.c.write('}\n') + self.c.write('\n') + if p.arg.free_func != None: + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_dup_%s: (skip)\n' + ' * @object: A #%s.\n' + ' *\n' + ' * Gets a copy of the #%s:%s D-Bus property.\n' + ' *\n' + ' * %s\n' + ' *\n' + ' * Returns: (transfer full): The property value or %%NULL if the property is not set. The returned value should be freed with %s().\n' + %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint, p.arg.free_func), False)) + self.write_gtkdoc_deprecated_and_since_and_close(p, self.c, 0) + self.c.write('%s\n' + '%s_dup_%s (%s *object)\n' + '{\n' + ' %svalue;\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in_dup)) + self.c.write(' g_object_get (G_OBJECT (object), "%s", &value, NULL);\n'%(p.name_hyphen)) + self.c.write(' return value;\n') + self.c.write('}\n') + self.c.write('\n') + + # setter + if p.readable and p.writable: + hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.' + elif p.readable: + hint = 'Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.' + elif p.writable: + hint = 'Since this D-Bus property is writable, it is meaningful to use this function on both the client- and service-side.' + else: + raise RuntimeError('Cannot handle property %s that neither readable nor writable'%(p.name)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_set_%s: (skip)\n' + ' * @object: A #%s.\n' + ' * @value: The value to set.\n' + ' *\n' + ' * Sets the #%s:%s D-Bus property to @value.\n' + ' *\n' + ' * %s\n' + %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False)) + self.write_gtkdoc_deprecated_and_since_and_close(p, self.c, 0) + self.c.write('void\n' + '%s_set_%s (%s *object, %svalue)\n' + '{\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, )) + self.c.write(' g_object_set (G_OBJECT (object), "%s", value, NULL);\n'%(p.name_hyphen)) + self.c.write('}\n') + self.c.write('\n') + + # --------------------------------------------------------------------------------------------------- + + def generate_signal_emitters(self, i): + for s in i.signals: + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_emit_%s:\n' + ' * @object: A #%s.\n' + %(i.name_lower, s.name_lower, i.camel_name), False)) + for a in s.args: + self.c.write(' * @arg_%s: Argument to pass with the signal.\n'%(a.name)) + self.c.write(self.docbook_gen.expand( + ' *\n' + ' * Emits the #%s::%s D-Bus signal.\n' + %(i.name, s.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(s, self.c, 0) + self.c.write('void\n' + '%s_emit_%s (\n' + ' %s *object'%(i.name_lower, s.name_lower, i.camel_name)) + for a in s.args: + self.c.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + self.c.write(')\n' + '{\n' + ' g_signal_emit_by_name (object, "%s"'%(s.name_hyphen)) + for a in s.args: + self.c.write(', arg_%s'%a.name) + self.c.write(');\n') + self.c.write('}\n' + '\n') + + # --------------------------------------------------------------------------------------------------- + + def generate_method_calls(self, i): + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + # async begin + self.c.write('/**\n' + ' * %s_call_%s:\n' + ' * @proxy: A #%sProxy.\n' + %(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.c.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name)) + if unix_fd: + self.c.write(' * @fd_list: (allow-none): A #GUnixFDList or %NULL.\n') + self.c.write(self.docbook_gen.expand( + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %%NULL.\n' + ' * @user_data: User data to pass to @callback.\n' + ' *\n' + ' * Asynchronously invokes the %s.%s() D-Bus method on @proxy.\n' + ' * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from.\n' + ' * You can then call %s_call_%s_finish() to get the result of the operation.\n' + ' *\n' + ' * See %s_call_%s_sync() for the synchronous, blocking version of this method.\n' + %(i.name, m.name, i.name_lower, m.name_lower, i.name_lower, m.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(m, self.c, 0) + self.c.write('void\n' + '%s_call_%s (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.c.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + if unix_fd: + self.c.write(',\n GUnixFDList *fd_list') + self.c.write(',\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data)\n' + '{\n') + if unix_fd: + self.c.write(' g_dbus_proxy_call_with_unix_fd_list (G_DBUS_PROXY (proxy),\n') + else: + self.c.write(' g_dbus_proxy_call (G_DBUS_PROXY (proxy),\n') + self.c.write(' "%s",\n' + ' g_variant_new ("('%(m.name)) + for a in m.in_args: + self.c.write('%s'%(a.format_in)) + self.c.write(')"') + for a in m.in_args: + self.c.write(',\n arg_%s'%(a.name)) + self.c.write('),\n' + ' G_DBUS_CALL_FLAGS_NONE,\n' + ' -1,\n') + if unix_fd: + self.c.write(' fd_list,\n') + self.c.write(' cancellable,\n' + ' callback,\n' + ' user_data);\n') + self.c.write('}\n' + '\n') + # async finish + self.c.write('/**\n' + ' * %s_call_%s_finish:\n' + ' * @proxy: A #%sProxy.\n' + %(i.name_lower, m.name_lower, i.camel_name)) + for a in m.out_args: + self.c.write(' * @out_%s: (out): Return location for return parameter or %%NULL to ignore.\n'%(a.name)) + if unix_fd: + self.c.write(' * @out_fd_list: (out): Return location for a #GUnixFDList or %NULL.\n') + self.c.write(self.docbook_gen.expand( + ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_call_%s().\n' + ' * @error: Return location for error or %%NULL.\n' + ' *\n' + ' * Finishes an operation started with %s_call_%s().\n' + ' *\n' + ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n' + %(i.name_lower, m.name_lower, i.name_lower, m.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(m, self.c, 0) + self.c.write('gboolean\n' + '%s_call_%s_finish (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.out_args: + self.c.write(',\n %sout_%s'%(a.ctype_out, a.name)) + if unix_fd: + self.c.write(',\n GUnixFDList **out_fd_list') + self.c.write(',\n' + ' GAsyncResult *res,\n' + ' GError **error)\n' + '{\n' + ' GVariant *_ret;\n') + if unix_fd: + self.c.write(' _ret = g_dbus_proxy_call_with_unix_fd_list_finish (G_DBUS_PROXY (proxy), out_fd_list, res, error);\n') + else: + self.c.write(' _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);\n') + self.c.write(' if (_ret == NULL)\n' + ' goto _out;\n') + self.c.write(' g_variant_get (_ret,\n' + ' \"(') + for a in m.out_args: + self.c.write('%s'%(a.format_out)) + self.c.write(')"') + for a in m.out_args: + self.c.write(',\n out_%s'%(a.name)) + self.c.write(');\n' + ' g_variant_unref (_ret);\n') + self.c.write('_out:\n' + ' return _ret != NULL;\n' + '}\n' + '\n') + + + # sync + self.c.write('/**\n' + ' * %s_call_%s_sync:\n' + ' * @proxy: A #%sProxy.\n' + %(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.c.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name)) + if unix_fd: + self.c.write(' * @fd_list: (allow-none): A #GUnixFDList or %NULL.\n') + for a in m.out_args: + self.c.write(' * @out_%s: (out): Return location for return parameter or %%NULL to ignore.\n'%(a.name)) + if unix_fd: + self.c.write(' * @out_fd_list: (out): Return location for a #GUnixFDList or %NULL.\n') + self.c.write(self.docbook_gen.expand( + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @error: Return location for error or %%NULL.\n' + ' *\n' + ' * Synchronously invokes the %s.%s() D-Bus method on @proxy. The calling thread is blocked until a reply is received.\n' + ' *\n' + ' * See %s_call_%s() for the asynchronous version of this method.\n' + ' *\n' + ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n' + %(i.name, m.name, i.name_lower, m.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(m, self.c, 0) + self.c.write('gboolean\n' + '%s_call_%s_sync (\n' + ' %s *proxy'%(i.name_lower, m.name_lower, i.camel_name)) + for a in m.in_args: + self.c.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + if unix_fd: + self.c.write(',\n GUnixFDList *fd_list') + for a in m.out_args: + self.c.write(',\n %sout_%s'%(a.ctype_out, a.name)) + if unix_fd: + self.c.write(',\n GUnixFDList **out_fd_list') + self.c.write(',\n' + ' GCancellable *cancellable,\n' + ' GError **error)\n' + '{\n' + ' GVariant *_ret;\n') + if unix_fd: + self.c.write(' _ret = g_dbus_proxy_call_with_unix_fd_list_sync (G_DBUS_PROXY (proxy),\n') + else: + self.c.write(' _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),\n') + self.c.write(' "%s",\n' + ' g_variant_new ("('%(m.name)) + for a in m.in_args: + self.c.write('%s'%(a.format_in)) + self.c.write(')"') + for a in m.in_args: + self.c.write(',\n arg_%s'%(a.name)) + self.c.write('),\n' + ' G_DBUS_CALL_FLAGS_NONE,\n' + ' -1,\n') + if unix_fd: + self.c.write(' fd_list,\n' + ' out_fd_list,\n') + self.c.write(' cancellable,\n' + ' error);\n' + ' if (_ret == NULL)\n' + ' goto _out;\n') + self.c.write(' g_variant_get (_ret,\n' + ' \"(') + for a in m.out_args: + self.c.write('%s'%(a.format_out)) + self.c.write(')"') + for a in m.out_args: + self.c.write(',\n out_%s'%(a.name)) + self.c.write(');\n' + ' g_variant_unref (_ret);\n') + self.c.write('_out:\n' + ' return _ret != NULL;\n' + '}\n' + '\n') + + # --------------------------------------------------------------------------------------------------- + + def generate_method_completers(self, i): + for m in i.methods: + unix_fd = False + if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'): + unix_fd = True + self.c.write('/**\n' + ' * %s_complete_%s:\n' + ' * @object: A #%s.\n' + ' * @invocation: (transfer full): A #GDBusMethodInvocation.\n' + %(i.name_lower, m.name_lower, i.camel_name)) + if unix_fd: + self.c.write (' * @fd_list: (allow-none): A #GUnixFDList or %NULL.\n') + for a in m.out_args: + self.c.write(' * @%s: Parameter to return.\n'%(a.name)) + self.c.write(self.docbook_gen.expand( + ' *\n' + ' * Helper function used in service implementations to finish handling invocations of the %s.%s() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.\n' + ' *\n' + ' * This method will free @invocation, you cannot use it afterwards.\n' + %(i.name, m.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(m, self.c, 0) + self.c.write('void\n' + '%s_complete_%s (\n' + ' %s *object,\n' + ' GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name)) + if unix_fd: + self.c.write(',\n GUnixFDList *fd_list') + for a in m.out_args: + self.c.write(',\n %s%s'%(a.ctype_in, a.name)) + self.c.write(')\n' + '{\n') + + if unix_fd: + self.c.write(' g_dbus_method_invocation_return_value_with_unix_fd_list (invocation,\n' + ' g_variant_new ("(') + else: + self.c.write(' g_dbus_method_invocation_return_value (invocation,\n' + ' g_variant_new ("(') + for a in m.out_args: + self.c.write('%s'%(a.format_in)) + self.c.write(')"') + for a in m.out_args: + self.c.write(',\n %s'%(a.name)) + if unix_fd: + self.c.write('),\n fd_list);\n') + else: + self.c.write('));\n') + self.c.write('}\n' + '\n') + + # --------------------------------------------------------------------------------------------------- + + def generate_proxy(self, i): + # class boilerplate + self.c.write('/* ------------------------------------------------------------------------ */\n' + '\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sProxy:\n' + ' *\n' + ' * The #%sProxy structure contains only private data and should only be accessed using the provided API.\n' + %(i.camel_name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sProxyClass:\n' + ' * @parent_class: The parent class.\n' + ' *\n' + ' * Class structure for #%sProxy.\n' + %(i.camel_name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write('struct _%sProxyPrivate\n' + '{\n' + ' GData *qdata;\n' + '};\n' + '\n'%i.camel_name) + + self.c.write('static void %s_proxy_iface_init (%sIface *iface);\n' + '\n'%(i.name_lower, i.camel_name)) + self.c.write('G_DEFINE_TYPE_WITH_CODE (%sProxy, %s_proxy, G_TYPE_DBUS_PROXY,\n'%(i.camel_name, i.name_lower)) + self.c.write(' G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_proxy_iface_init));\n\n'%(i.ns_upper, i.name_upper, i.name_lower)) + + # finalize + self.c.write('static void\n' + '%s_proxy_finalize (GObject *object)\n' + '{\n'%(i.name_lower)) + self.c.write(' %sProxy *proxy = %s%s_PROXY (object);\n'%(i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' g_datalist_clear (&proxy->priv->qdata);\n') + self.c.write(' G_OBJECT_CLASS (%s_proxy_parent_class)->finalize (object);\n' + '}\n' + '\n'%(i.name_lower)) + + # property accessors + # + # Note that we are guaranteed that prop_id starts at 1 and is + # laid out in the same order as introspection data pointers + # + self.c.write('static void\n' + '%s_proxy_get_property (GObject *object,\n' + ' guint prop_id,\n' + ' GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n'%(i.name_lower)) + if len(i.properties) > 0: + self.c.write(' const _ExtendedGDBusPropertyInfo *info;\n' + ' GVariant *variant;\n' + ' g_assert (prop_id != 0 && prop_id - 1 < %d);\n' + ' info = _%s_property_info_pointers[prop_id - 1];\n' + ' variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);\n' + ' if (info->use_gvariant)\n' + ' {\n' + ' g_value_set_variant (value, variant);\n' + ' }\n' + ' else\n' + ' {\n' + # could be that we don't have the value in cache - in that case, we do + # nothing and the user gets the default value for the GType + ' if (variant != NULL)\n' + ' g_dbus_gvariant_to_gvalue (variant, value);\n' + ' }\n' + ' if (variant != NULL)\n' + ' g_variant_unref (variant);\n' + %(len(i.properties), i.name_lower)) + self.c.write('}\n' + '\n') + if len(i.properties) > 0: + self.c.write('static void\n' + '%s_proxy_set_property_cb (GDBusProxy *proxy,\n' + ' GAsyncResult *res,\n' + ' gpointer user_data)\n' + '{\n'%(i.name_lower)) + self.c.write(' const _ExtendedGDBusPropertyInfo *info = user_data;\n' + ' GError *error;\n' + ' error = NULL;\n' + ' if (!g_dbus_proxy_call_finish (proxy, res, &error))\n' + ' {\n' + ' g_warning ("Error setting property `%%s\' on interface %s: %%s (%%s, %%d)",\n' + ' info->parent_struct.name, \n' + ' error->message, g_quark_to_string (error->domain), error->code);\n' + ' g_error_free (error);\n' + ' }\n' + %(i.name)) + self.c.write('}\n' + '\n') + self.c.write('static void\n' + '%s_proxy_set_property (GObject *object,\n' + ' guint prop_id,\n' + ' const GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n'%(i.name_lower)) + if len(i.properties) > 0: + self.c.write(' const _ExtendedGDBusPropertyInfo *info;\n' + ' GVariant *variant;\n' + ' g_assert (prop_id != 0 && prop_id - 1 < %d);\n' + ' info = _%s_property_info_pointers[prop_id - 1];\n' + ' variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));\n' + ' g_dbus_proxy_call (G_DBUS_PROXY (object),\n' + ' "org.freedesktop.DBus.Properties.Set",\n' + ' g_variant_new ("(ssv)", "%s", info->parent_struct.name, variant),\n' + ' G_DBUS_CALL_FLAGS_NONE,\n' + ' -1,\n' + ' NULL, (GAsyncReadyCallback) %s_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);\n' + ' g_variant_unref (variant);\n' + %(len(i.properties), i.name_lower, i.name, i.name_lower)) + self.c.write('}\n' + '\n') + + # signal received + self.c.write('static void\n' + '%s_proxy_g_signal (GDBusProxy *proxy,\n' + ' const gchar *sender_name,\n' + ' const gchar *signal_name,\n' + ' GVariant *parameters)\n' + '{\n'%(i.name_lower)) + self.c.write(' _ExtendedGDBusSignalInfo *info;\n' + ' GVariantIter iter;\n' + ' GVariant *child;\n' + ' GValue *paramv;\n' + ' guint num_params;\n' + ' guint n;\n' + ' guint signal_id;\n'); + # Note: info could be NULL if we are talking to a newer version of the interface + self.c.write(' info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, signal_name);\n' + ' if (info == NULL)\n' + ' return;\n' + %(i.name_lower)) + self.c.write (' num_params = g_variant_n_children (parameters);\n' + ' paramv = g_new0 (GValue, num_params + 1);\n' + ' g_value_init (¶mv[0], %sTYPE_%s);\n' + ' g_value_set_object (¶mv[0], proxy);\n' + %(i.ns_upper, i.name_upper)) + self.c.write(' g_variant_iter_init (&iter, parameters);\n' + ' n = 1;\n' + ' while ((child = g_variant_iter_next_value (&iter)) != NULL)\n' + ' {\n' + ' _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];\n' + ' if (arg_info->use_gvariant)\n' + ' {\n' + ' g_value_init (¶mv[n], G_TYPE_VARIANT);\n' + ' g_value_set_variant (¶mv[n], child);\n' + ' n++;\n' + ' }\n' + ' else\n' + ' g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);\n' + ' g_variant_unref (child);\n' + ' }\n' + ) + self.c.write(' signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n' + %(i.ns_upper, i.name_upper)) + self.c.write(' g_signal_emitv (paramv, signal_id, 0, NULL);\n') + self.c.write(' for (n = 0; n < num_params + 1; n++)\n' + ' g_value_unset (¶mv[n]);\n' + ' g_free (paramv);\n') + self.c.write('}\n' + '\n') + + # property changed + self.c.write('static void\n' + '%s_proxy_g_properties_changed (GDBusProxy *_proxy,\n' + ' GVariant *changed_properties,\n' + ' const gchar *const *invalidated_properties)\n' + '{\n'%(i.name_lower)) + # Note: info could be NULL if we are talking to a newer version of the interface + self.c.write(' %sProxy *proxy = %s%s_PROXY (_proxy);\n' + ' guint n;\n' + ' const gchar *key;\n' + ' GVariantIter *iter;\n' + ' _ExtendedGDBusPropertyInfo *info;\n' + ' g_variant_get (changed_properties, "a{sv}", &iter);\n' + ' while (g_variant_iter_next (iter, "{&sv}", &key, NULL))\n' + ' {\n' + ' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, key);\n' + ' g_datalist_remove_data (&proxy->priv->qdata, key);\n' + ' if (info != NULL)\n' + ' g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n' + ' }\n' + ' g_variant_iter_free (iter);\n' + ' for (n = 0; invalidated_properties[n] != NULL; n++)\n' + ' {\n' + ' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, invalidated_properties[n]);\n' + ' g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);\n' + ' if (info != NULL)\n' + ' g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n' + ' }\n' + '}\n' + '\n' + %(i.camel_name, i.ns_upper, i.name_upper, + i.name_lower, i.name_lower)) + + # property vfuncs + for p in i.properties: + nul_value = '0' + if p.arg.free_func != None: + nul_value = 'NULL' + self.c.write('static %s\n' + '%s_proxy_get_%s (%s *object)\n' + '{\n' + ' %sProxy *proxy = %s%s_PROXY (object);\n' + ' GVariant *variant;\n' + ' %svalue = %s;\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name, + i.camel_name, i.ns_upper, i.name_upper, + p.arg.ctype_in, nul_value)) + # For some property types, we have to free the returned + # value (or part of it, e.g. the container) because of how + # GVariant works.. see https://bugzilla.gnome.org/show_bug.cgi?id=657100 + # for details + # + free_container = False; + if p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objpathv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array': + free_container = True; + # If already using an old value for strv, objpathv, bytestring_array (see below), + # then just return that... that way the result from multiple consecutive calls + # to the getter are valid as long as they're freed + # + if free_container: + self.c.write(' value = g_datalist_get_data (&proxy->priv->qdata, \"%s\");\n' + ' if (value != NULL)\n' + ' return value;\n' + %(p.name)) + self.c.write(' variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), \"%s\");\n'%(p.name)) + if p.arg.gtype == 'G_TYPE_VARIANT': + self.c.write(' value = variant;\n') + self.c.write(' if (variant != NULL)\n') + self.c.write(' g_variant_unref (variant);\n') + else: + self.c.write(' if (variant != NULL)\n' + ' {\n') + extra_len = '' + if p.arg.gvariant_get == 'g_variant_get_string' or p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array': + extra_len = ', NULL' + self.c.write(' value = %s (variant%s);\n'%(p.arg.gvariant_get, extra_len)) + if free_container: + self.c.write(' g_datalist_set_data_full (&proxy->priv->qdata, \"%s\", (gpointer) value, g_free);\n' + %(p.name)) + self.c.write(' g_variant_unref (variant);\n') + self.c.write(' }\n') + self.c.write(' return value;\n') + self.c.write('}\n') + self.c.write('\n') + + # class boilerplate + self.c.write('static void\n' + '%s_proxy_init (%sProxy *proxy)\n' + '{\n' + ' proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, %sTYPE_%s_PROXY, %sProxyPrivate);\n' + ' g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), %s_interface_info ());\n' + '}\n' + '\n' + %(i.name_lower, i.camel_name, + i.ns_upper, i.name_upper, i.camel_name, + i.name_lower)) + self.c.write('static void\n' + '%s_proxy_class_init (%sProxyClass *klass)\n' + '{\n' + ' GObjectClass *gobject_class;\n' + ' GDBusProxyClass *proxy_class;\n' + '\n' + ' g_type_class_add_private (klass, sizeof (%sProxyPrivate));\n' + '\n' + ' gobject_class = G_OBJECT_CLASS (klass);\n' + ' gobject_class->finalize = %s_proxy_finalize;\n' + ' gobject_class->get_property = %s_proxy_get_property;\n' + ' gobject_class->set_property = %s_proxy_set_property;\n' + '\n' + ' proxy_class = G_DBUS_PROXY_CLASS (klass);\n' + ' proxy_class->g_signal = %s_proxy_g_signal;\n' + ' proxy_class->g_properties_changed = %s_proxy_g_properties_changed;\n' + '\n'%(i.name_lower, i.camel_name, + i.camel_name, + i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name_lower)) + if len(i.properties) > 0: + self.c.write('\n' + ' %s_override_properties (gobject_class, 1);\n'%(i.name_lower)) + self.c.write('}\n' + '\n') + + self.c.write('static void\n' + '%s_proxy_iface_init (%sIface *iface)\n' + '{\n'%(i.name_lower, i.camel_name)) + for p in i.properties: + self.c.write(' iface->get_%s = %s_proxy_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower)) + self.c.write('}\n' + '\n') + + # constructors + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_proxy_new:\n' + ' * @connection: A #GDBusConnection.\n' + ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n' + ' * @name: (allow-none): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n' + ' * @user_data: User data to pass to @callback.\n' + ' *\n' + ' * Asynchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new() for more details.\n' + ' *\n' + ' * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from.\n' + ' * You can then call %s_proxy_new_finish() to get the result of the operation.\n' + ' *\n' + ' * See %s_proxy_new_sync() for the synchronous, blocking version of this constructor.\n' + %(i.name_lower, i.name, i.name_lower, i.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('void\n' + '%s_proxy_new (\n' + ' GDBusConnection *connection,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data)\n' + '{\n' + ' g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n' + '}\n' + '\n' + %(i.name_lower, i.ns_upper, i.name_upper, i.name)) + self.c.write('/**\n' + ' * %s_proxy_new_finish:\n' + ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new().\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Finishes an operation started with %s_proxy_new().\n' + ' *\n' + ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n' + %(i.name_lower, i.name_lower, i.name_lower, i.camel_name)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('%s *\n' + '%s_proxy_new_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error)\n' + '{\n' + ' GObject *ret;\n' + ' GObject *source_object;\n' + ' source_object = g_async_result_get_source_object (res);\n' + ' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n' + ' g_object_unref (source_object);\n' + ' if (ret != NULL)\n' + ' return %s%s (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_proxy_new_sync:\n' + ' * @connection: A #GDBusConnection.\n' + ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n' + ' * @name: (allow-none): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Synchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new_sync() for more details.\n' + ' *\n' + ' * The calling thread is blocked until a reply is received.\n' + ' *\n' + ' * See %s_proxy_new() for the asynchronous version of this constructor.\n' + ' *\n' + ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n' + %(i.name_lower, i.name, i.name_lower, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('%s *\n' + '%s_proxy_new_sync (\n' + ' GDBusConnection *connection,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error)\n' + '{\n' + ' GInitable *ret;\n' + ' ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n' + ' if (ret != NULL)\n' + ' return %s%s (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper)) + self.c.write('\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_proxy_new_for_bus:\n' + ' * @bus_type: A #GBusType.\n' + ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n' + ' * @name: A bus name (well-known or unique).\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n' + ' * @user_data: User data to pass to @callback.\n' + ' *\n' + ' * Like %s_proxy_new() but takes a #GBusType instead of a #GDBusConnection.\n' + ' *\n' + ' * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from.\n' + ' * You can then call %s_proxy_new_for_bus_finish() to get the result of the operation.\n' + ' *\n' + ' * See %s_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n' + %(i.name_lower, i.name_lower, i.name_lower, i.name_lower), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('void\n' + '%s_proxy_new_for_bus (\n' + ' GBusType bus_type,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data)\n' + '{\n' + ' g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n' + '}\n' + '\n' + %(i.name_lower, i.ns_upper, i.name_upper, i.name)) + self.c.write('/**\n' + ' * %s_proxy_new_for_bus_finish:\n' + ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new_for_bus().\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Finishes an operation started with %s_proxy_new_for_bus().\n' + ' *\n' + ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n' + %(i.name_lower, i.name_lower, i.name_lower, i.camel_name)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('%s *\n' + '%s_proxy_new_for_bus_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error)\n' + '{\n' + ' GObject *ret;\n' + ' GObject *source_object;\n' + ' source_object = g_async_result_get_source_object (res);\n' + ' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n' + ' g_object_unref (source_object);\n' + ' if (ret != NULL)\n' + ' return %s%s (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_proxy_new_for_bus_sync:\n' + ' * @bus_type: A #GBusType.\n' + ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n' + ' * @name: A bus name (well-known or unique).\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Like %s_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n' + ' *\n' + ' * The calling thread is blocked until a reply is received.\n' + ' *\n' + ' * See %s_proxy_new_for_bus() for the asynchronous version of this constructor.\n' + ' *\n' + ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n' + %(i.name_lower, i.name_lower, i.name_lower, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('%s *\n' + '%s_proxy_new_for_bus_sync (\n' + ' GBusType bus_type,\n' + ' GDBusProxyFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error)\n' + '{\n' + ' GInitable *ret;\n' + ' ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n' + ' if (ret != NULL)\n' + ' return %s%s (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper)) + self.c.write('\n') + + # --------------------------------------------------------------------------------------------------- + + def generate_skeleton(self, i): + # class boilerplate + self.c.write('/* ------------------------------------------------------------------------ */\n' + '\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sSkeleton:\n' + ' *\n' + ' * The #%sSkeleton structure contains only private data and should only be accessed using the provided API.\n' + %(i.camel_name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sSkeletonClass:\n' + ' * @parent_class: The parent class.\n' + ' *\n' + ' * Class structure for #%sSkeleton.\n' + %(i.camel_name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('\n') + + self.c.write('struct _%sSkeletonPrivate\n' + '{\n' + ' GValue *properties;\n' + ' GList *changed_properties;\n' + ' GSource *changed_properties_idle_source;\n' + ' GMainContext *context;\n' + ' GMutex lock;\n' + '};\n' + '\n'%i.camel_name) + + self.c.write('static void\n' + '_%s_skeleton_handle_method_call (\n' + ' GDBusConnection *connection,\n' + ' const gchar *sender,\n' + ' const gchar *object_path,\n' + ' const gchar *interface_name,\n' + ' const gchar *method_name,\n' + ' GVariant *parameters,\n' + ' GDBusMethodInvocation *invocation,\n' + ' gpointer user_data)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n' + ' _ExtendedGDBusMethodInfo *info;\n' + ' GVariantIter iter;\n' + ' GVariant *child;\n' + ' GValue *paramv;\n' + ' guint num_params;\n' + ' guint num_extra;\n' + ' guint n;\n' + ' guint signal_id;\n' + ' GValue return_value = G_VALUE_INIT;\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);\n' + ' g_assert (info != NULL);\n' + %()) + self.c.write (' num_params = g_variant_n_children (parameters);\n' + ' num_extra = info->pass_fdlist ? 3 : 2;' + ' paramv = g_new0 (GValue, num_params + num_extra);\n' + ' n = 0;\n' + ' g_value_init (¶mv[n], %sTYPE_%s);\n' + ' g_value_set_object (¶mv[n++], skeleton);\n' + ' g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);\n' + ' g_value_set_object (¶mv[n++], invocation);\n' + ' if (info->pass_fdlist)\n' + ' {\n' + '#ifdef G_OS_UNIX\n' + ' g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);\n' + ' g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));\n' + '#else\n' + ' g_assert_not_reached ();\n' + '#endif\n' + ' }\n' + %(i.ns_upper, i.name_upper)) + self.c.write(' g_variant_iter_init (&iter, parameters);\n' + ' while ((child = g_variant_iter_next_value (&iter)) != NULL)\n' + ' {\n' + ' _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];\n' + ' if (arg_info->use_gvariant)\n' + ' {\n' + ' g_value_init (¶mv[n], G_TYPE_VARIANT);\n' + ' g_value_set_variant (¶mv[n], child);\n' + ' n++;\n' + ' }\n' + ' else\n' + ' g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);\n' + ' g_variant_unref (child);\n' + ' }\n' + ) + self.c.write(' signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n' + %(i.ns_upper, i.name_upper)) + self.c.write(' g_value_init (&return_value, G_TYPE_BOOLEAN);\n' + ' g_signal_emitv (paramv, signal_id, 0, &return_value);\n' + ' if (!g_value_get_boolean (&return_value))\n' + ' g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);\n' + ' g_value_unset (&return_value);\n' + ) + self.c.write(' for (n = 0; n < num_params + num_extra; n++)\n' + ' g_value_unset (¶mv[n]);\n' + ' g_free (paramv);\n') + self.c.write('}\n' + '\n') + + self.c.write('static GVariant *\n' + '_%s_skeleton_handle_get_property (\n' + ' GDBusConnection *connection,\n' + ' const gchar *sender,\n' + ' const gchar *object_path,\n' + ' const gchar *interface_name,\n' + ' const gchar *property_name,\n' + ' GError **error,\n' + ' gpointer user_data)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n' + ' GValue value = G_VALUE_INIT;\n' + ' GParamSpec *pspec;\n' + ' _ExtendedGDBusPropertyInfo *info;\n' + ' GVariant *ret;\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' ret = NULL;\n' + ' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n' + ' g_assert (info != NULL);\n' + ' pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n' + ' if (pspec == NULL)\n' + ' {\n' + ' g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n' + ' }\n' + ' else\n' + ' {\n' + ' g_value_init (&value, pspec->value_type);\n' + ' g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n' + ' ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));\n' + ' g_value_unset (&value);\n' + ' }\n' + ' return ret;\n' + '}\n' + '\n' + %(i.name_lower)) + + self.c.write('static gboolean\n' + '_%s_skeleton_handle_set_property (\n' + ' GDBusConnection *connection,\n' + ' const gchar *sender,\n' + ' const gchar *object_path,\n' + ' const gchar *interface_name,\n' + ' const gchar *property_name,\n' + ' GVariant *variant,\n' + ' GError **error,\n' + ' gpointer user_data)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n' + ' GValue value = G_VALUE_INIT;\n' + ' GParamSpec *pspec;\n' + ' _ExtendedGDBusPropertyInfo *info;\n' + ' gboolean ret;\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' ret = FALSE;\n' + ' info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n' + ' g_assert (info != NULL);\n' + ' pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n' + ' if (pspec == NULL)\n' + ' {\n' + ' g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n' + ' }\n' + ' else\n' + ' {\n' + ' if (info->use_gvariant)\n' + ' g_value_set_variant (&value, variant);\n' + ' else\n' + ' g_dbus_gvariant_to_gvalue (variant, &value);\n' + ' g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n' + ' g_value_unset (&value);\n' + ' ret = TRUE;\n' + ' }\n' + ' return ret;\n' + '}\n' + '\n' + %(i.name_lower)) + + + self.c.write('static const GDBusInterfaceVTable _%s_skeleton_vtable =\n' + '{\n' + ' _%s_skeleton_handle_method_call,\n' + ' _%s_skeleton_handle_get_property,\n' + ' _%s_skeleton_handle_set_property\n' + '};\n' + '\n'%(i.name_lower, i.name_lower, i.name_lower, i.name_lower)) + + self.c.write('static GDBusInterfaceInfo *\n' + '%s_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton)\n' + '{\n' + ' return %s_interface_info ();\n' + %(i.name_lower, i.name_lower)) + self.c.write('}\n' + '\n') + + self.c.write('static GDBusInterfaceVTable *\n' + '%s_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton)\n' + '{\n' + ' return (GDBusInterfaceVTable *) &_%s_skeleton_vtable;\n' + %(i.name_lower, i.name_lower)) + self.c.write('}\n' + '\n') + + self.c.write('static GVariant *\n' + '%s_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper)) + self.c.write('\n' + ' GVariantBuilder builder;\n' + ' guint n;\n' + ' g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n' + ' if (_%s_interface_info.parent_struct.properties == NULL)\n' + ' goto out;\n' + ' for (n = 0; _%s_interface_info.parent_struct.properties[n] != NULL; n++)\n' + ' {\n' + ' GDBusPropertyInfo *info = _%s_interface_info.parent_struct.properties[n];\n' + ' if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)\n' + ' {\n' + ' GVariant *value;\n' + ' value = _%s_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", info->name, NULL, skeleton);\n' + ' if (value != NULL)\n' + ' {\n' + ' g_variant_take_ref (value);\n' + ' g_variant_builder_add (&builder, "{sv}", info->name, value);\n' + ' g_variant_unref (value);\n' + ' }\n' + ' }\n' + ' }\n' + 'out:\n' + ' return g_variant_builder_end (&builder);\n' + '}\n' + '\n' + %(i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name)) + + if len(i.properties) > 0: + self.c.write('static gboolean _%s_emit_changed (gpointer user_data);\n' + '\n' + %(i.name_lower)) + + self.c.write('static void\n' + '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)\n' + '{\n' + %(i.name_lower)) + if len(i.properties) > 0: + self.c.write(' %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n' + ' gboolean emit_changed = FALSE;\n' + '\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' if (skeleton->priv->changed_properties_idle_source != NULL)\n' + ' {\n' + ' g_source_destroy (skeleton->priv->changed_properties_idle_source);\n' + ' skeleton->priv->changed_properties_idle_source = NULL;\n' + ' emit_changed = TRUE;\n' + ' }\n' + ' g_mutex_unlock (&skeleton->priv->lock);\n' + '\n' + ' if (emit_changed)\n' + ' _%s_emit_changed (skeleton);\n' + %(i.camel_name, i.ns_upper, i.name_upper, i.name_lower)) + self.c.write('}\n' + '\n') + + for s in i.signals: + self.c.write('static void\n' + '_%s_on_signal_%s (\n' + ' %s *object'%(i.name_lower, s.name_lower, i.camel_name)) + for a in s.args: + self.c.write(',\n %sarg_%s'%(a.ctype_in, a.name)) + self.c.write(')\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (object);\n\n' + ' GList *connections, *l;\n' + ' GVariant *signal_variant;\n' + ' connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n' + %(i.camel_name, i.ns_upper, i.name_upper)) + self.c.write('\n' + ' signal_variant = g_variant_ref_sink (g_variant_new ("(') + for a in s.args: + self.c.write('%s'%(a.format_in)) + self.c.write(')"') + for a in s.args: + self.c.write(',\n arg_%s'%(a.name)) + self.c.write('));\n') + + self.c.write(' for (l = connections; l != NULL; l = l->next)\n' + ' {\n' + ' GDBusConnection *connection = l->data;\n' + ' g_dbus_connection_emit_signal (connection,\n' + ' NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", "%s",\n' + ' signal_variant, NULL);\n' + ' }\n' + %(i.name, s.name)) + self.c.write(' g_variant_unref (signal_variant);\n') + self.c.write(' g_list_free_full (connections, g_object_unref);\n') + self.c.write('}\n' + '\n') + + self.c.write('static void %s_skeleton_iface_init (%sIface *iface);\n' + %(i.name_lower, i.camel_name)) + + self.c.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower)) + self.c.write(' G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init));\n\n'%(i.ns_upper, i.name_upper, i.name_lower)) + + # finalize + self.c.write('static void\n' + '%s_skeleton_finalize (GObject *object)\n' + '{\n'%(i.name_lower)) + self.c.write(' %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper)) + if len(i.properties) > 0: + self.c.write(' guint n;\n' + ' for (n = 0; n < %d; n++)\n' + ' g_value_unset (&skeleton->priv->properties[n]);\n'%(len(i.properties))) + self.c.write(' g_free (skeleton->priv->properties);\n') + self.c.write(' g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n') + self.c.write(' if (skeleton->priv->changed_properties_idle_source != NULL)\n') + self.c.write(' g_source_destroy (skeleton->priv->changed_properties_idle_source);\n') + self.c.write(' g_main_context_unref (skeleton->priv->context);\n') + self.c.write(' g_mutex_clear (&skeleton->priv->lock);\n') + self.c.write(' G_OBJECT_CLASS (%s_skeleton_parent_class)->finalize (object);\n' + '}\n' + '\n'%(i.name_lower)) + + # property accessors (TODO: generate PropertiesChanged signals in setter) + if len(i.properties) > 0: + self.c.write('static void\n' + '%s_skeleton_get_property (GObject *object,\n' + ' guint prop_id,\n' + ' GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n'%(i.name_lower)) + self.c.write(' %sSkeleton *skeleton = %s%s_SKELETON (object);\n' + ' g_assert (prop_id != 0 && prop_id - 1 < %d);\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' g_value_copy (&skeleton->priv->properties[prop_id - 1], value);\n' + ' g_mutex_unlock (&skeleton->priv->lock);\n' + %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties))) + self.c.write('}\n' + '\n') + + # if property is already scheduled then re-use entry.. though it could be + # that the user did + # + # foo_set_prop_bar (object, ""); + # foo_set_prop_bar (object, "blah"); + # + # say, every update... In this case, where nothing happens, we obviously + # don't want a PropertiesChanged() event. We can easily check for this + # by comparing against the _original value_ recorded before the first + # change event. If the latest value is not different from the original + # one, we can simply ignore the ChangedProperty + # + self.c.write('static gboolean\n' + '_%s_emit_changed (gpointer user_data)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' GList *l;\n' + ' GVariantBuilder builder;\n' + ' GVariantBuilder invalidated_builder;\n' + ' guint num_changes;\n' + '\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n' + ' g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));\n' + ' for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)\n' + ' {\n' + ' ChangedProperty *cp = l->data;\n' + ' GVariant *variant;\n' + ' const GValue *cur_value;\n' + '\n' + ' cur_value = &skeleton->priv->properties[cp->prop_id - 1];\n' + ' if (!_g_value_equal (cur_value, &cp->orig_value))\n' + ' {\n' + ' variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));\n' + ' g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);\n' + ' g_variant_unref (variant);\n' + ' num_changes++;\n' + ' }\n' + ' }\n' + ' if (num_changes > 0)\n' + ' {\n' + ' GList *connections, *ll;\n' + ' GVariant *signal_variant;' + '\n' + ' signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "%s",\n' + ' &builder, &invalidated_builder));\n' + ' connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n' + ' for (ll = connections; ll != NULL; ll = ll->next)\n' + ' {\n' + ' GDBusConnection *connection = ll->data;\n' + '\n' + ' g_dbus_connection_emit_signal (connection,\n' + ' NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),\n' + ' "org.freedesktop.DBus.Properties",\n' + ' "PropertiesChanged",\n' + ' signal_variant,\n' + ' NULL);\n' + ' }\n' + ' g_variant_unref (signal_variant);\n' + ' g_list_free_full (connections, g_object_unref);\n' + ' }\n' + ' else\n' + ' {\n' + ' g_variant_builder_clear (&builder);\n' + ' g_variant_builder_clear (&invalidated_builder);\n' + ' }\n' + %(i.name)) + self.c.write(' g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n') + self.c.write(' skeleton->priv->changed_properties = NULL;\n') + self.c.write(' skeleton->priv->changed_properties_idle_source = NULL;\n') + self.c.write(' g_mutex_unlock (&skeleton->priv->lock);\n') + self.c.write(' return FALSE;\n' + '}\n' + '\n') + # holding lock while being called + self.c.write('static void\n' + '_%s_schedule_emit_changed (%sSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)\n' + '{\n' + ' ChangedProperty *cp;\n' + ' GList *l;\n' + ' cp = NULL;\n' + ' for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)\n' + ' {\n' + ' ChangedProperty *i_cp = l->data;\n' + ' if (i_cp->info == info)\n' + ' {\n' + ' cp = i_cp;\n' + ' break;\n' + ' }\n' + ' }\n' + %(i.name_lower, i.camel_name)) + self.c.write(' if (cp == NULL)\n' + ' {\n' + ' cp = g_new0 (ChangedProperty, 1);\n' + ' cp->prop_id = prop_id;\n' + ' cp->info = info;\n' + ' skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);\n' + ' g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));\n' + ' g_value_copy (orig_value, &cp->orig_value);\n' + ' }\n' + '}\n' + '\n' + %()) + + # Postpone setting up the refresh source until the ::notify signal is emitted as + # this allows use of g_object_freeze_notify()/g_object_thaw_notify() ... + # This is useful when updating several properties from another thread than + # where the idle will be emitted from + self.c.write('static void\n' + '%s_skeleton_notify (GObject *object,\n' + ' GParamSpec *pspec)\n' + '{\n' + ' %sSkeleton *skeleton = %s%s_SKELETON (object);\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' if (skeleton->priv->changed_properties != NULL &&\n' + ' skeleton->priv->changed_properties_idle_source == NULL)\n' + ' {\n' + ' skeleton->priv->changed_properties_idle_source = g_idle_source_new ();\n' + ' g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);\n' + ' g_source_set_callback (skeleton->priv->changed_properties_idle_source, _%s_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);\n' + ' g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);\n' + ' g_source_unref (skeleton->priv->changed_properties_idle_source);\n' + ' }\n' + ' g_mutex_unlock (&skeleton->priv->lock);\n' + '}\n' + '\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper, i.name_lower)) + + self.c.write('static void\n' + '%s_skeleton_set_property (GObject *object,\n' + ' guint prop_id,\n' + ' const GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n'%(i.name_lower)) + self.c.write(' %sSkeleton *skeleton = %s%s_SKELETON (object);\n' + ' g_assert (prop_id != 0 && prop_id - 1 < %d);\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' g_object_freeze_notify (object);\n' + ' if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))\n' + ' {\n' + ' if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)\n' + ' _%s_schedule_emit_changed (skeleton, _%s_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);\n' + ' g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);\n' + ' g_object_notify_by_pspec (object, pspec);\n' + ' }\n' + ' g_mutex_unlock (&skeleton->priv->lock);\n' + ' g_object_thaw_notify (object);\n' + %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties), i.name_lower, i.name_lower)) + self.c.write('}\n' + '\n') + + self.c.write('static void\n' + '%s_skeleton_init (%sSkeleton *skeleton)\n' + '{\n' + ' skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, %sTYPE_%s_SKELETON, %sSkeletonPrivate);\n' + %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper, i.camel_name)) + self.c.write(' g_mutex_init (&skeleton->priv->lock);\n') + self.c.write(' skeleton->priv->context = g_main_context_ref_thread_default ();\n') + if len(i.properties) > 0: + self.c.write(' skeleton->priv->properties = g_new0 (GValue, %d);\n'%(len(i.properties))) + n = 0 + for p in i.properties: + self.c.write(' g_value_init (&skeleton->priv->properties[%d], %s);\n'%(n, p.arg.gtype)) + n += 1 + self.c.write('}\n' + '\n') + + # property vfuncs + n = 0 + for p in i.properties: + self.c.write('static %s\n' + '%s_skeleton_get_%s (%s *object)\n' + '{\n' + %(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name)) + self.c.write(' %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper)) + self.c.write(' %svalue;\n' + ' g_mutex_lock (&skeleton->priv->lock);\n' + ' value = %s (&(skeleton->priv->properties[%d]));\n' + ' g_mutex_unlock (&skeleton->priv->lock);\n' + %(p.arg.ctype_in_g, p.arg.gvalue_get, n)) + self.c.write(' return value;\n') + self.c.write('}\n') + self.c.write('\n') + n += 1 + + self.c.write('static void\n' + '%s_skeleton_class_init (%sSkeletonClass *klass)\n' + '{\n' + ' GObjectClass *gobject_class;\n' + ' GDBusInterfaceSkeletonClass *skeleton_class;\n' + '\n' + ' g_type_class_add_private (klass, sizeof (%sSkeletonPrivate));\n' + '\n' + ' gobject_class = G_OBJECT_CLASS (klass);\n' + ' gobject_class->finalize = %s_skeleton_finalize;\n' + %(i.name_lower, i.camel_name, i.camel_name, i.name_lower)) + if len(i.properties) > 0: + self.c.write(' gobject_class->get_property = %s_skeleton_get_property;\n' + ' gobject_class->set_property = %s_skeleton_set_property;\n' + ' gobject_class->notify = %s_skeleton_notify;\n' + '\n'%(i.name_lower, i.name_lower, i.name_lower)) + self.c.write('\n' + ' %s_override_properties (gobject_class, 1);\n'%(i.name_lower)) + self.c.write('\n' + ' skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);\n'); + self.c.write(' skeleton_class->get_info = %s_skeleton_dbus_interface_get_info;\n'%(i.name_lower)) + self.c.write(' skeleton_class->get_properties = %s_skeleton_dbus_interface_get_properties;\n'%(i.name_lower)) + self.c.write(' skeleton_class->flush = %s_skeleton_dbus_interface_flush;\n'%(i.name_lower)) + self.c.write(' skeleton_class->get_vtable = %s_skeleton_dbus_interface_get_vtable;\n'%(i.name_lower)) + self.c.write('}\n' + '\n') + + self.c.write('static void\n' + '%s_skeleton_iface_init (%sIface *iface)\n' + '{\n' + %(i.name_lower, i.camel_name)) + for s in i.signals: + self.c.write(' iface->%s = _%s_on_signal_%s;\n' + %(s.name_lower, i.name_lower, s.name_lower)) + for p in i.properties: + self.c.write(' iface->get_%s = %s_skeleton_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower)) + self.c.write('}\n' + '\n') + + # constructors + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %s_skeleton_new:\n' + ' *\n' + ' * Creates a skeleton object for the D-Bus interface #%s.\n' + ' *\n' + ' * Returns: (transfer full) (type %sSkeleton): The skeleton object.\n' + %(i.name_lower, i.name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write('%s *\n' + '%s_skeleton_new (void)\n' + '{\n' + ' return %s%s (g_object_new (%sTYPE_%s_SKELETON, NULL));\n' + '}\n' + '\n'%(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.ns_upper, i.name_upper)) + + # --------------------------------------------------------------------------------------------------- + + def generate_object(self): + self.c.write('/* ------------------------------------------------------------------------\n' + ' * Code for Object, ObjectProxy and ObjectSkeleton\n' + ' * ------------------------------------------------------------------------\n' + ' */\n' + '\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * SECTION:%sObject\n' + ' * @title: %sObject\n' + ' * @short_description: Specialized GDBusObject types\n' + ' *\n' + ' * This section contains the #%sObject, #%sObjectProxy, and #%sObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.\n' + ' */\n' + %(self.namespace, self.namespace, self.namespace, self.namespace, self.namespace), False)) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObject:\n' + ' *\n' + ' * The #%sObject type is a specialized container of interfaces.\n' + ' */\n' + %(self.namespace, self.namespace), False)) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectIface:\n' + ' * @parent_iface: The parent interface.\n' + ' *\n' + ' * Virtual table for the #%sObject interface.\n' + ' */\n' + %(self.namespace, self.namespace), False)) + self.c.write('\n') + + self.c.write('static void\n' + '%sobject_default_init (%sObjectIface *iface)\n' + '{\n' + %(self.ns_lower, self.namespace)); + for i in self.ifaces: + self.c.write(self.docbook_gen.expand( + ' /**\n' + ' * %sObject:%s:\n' + ' *\n' + ' * The #%s instance corresponding to the D-Bus interface #%s, if any.\n' + ' *\n' + ' * Connect to the #GObject::notify signal to get informed of property changes.\n' + %(self.namespace, i.name_hyphen, i.camel_name, i.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 2) + self.c.write(' g_object_interface_install_property (iface, g_param_spec_object ("%s", "%s", "%s", %sTYPE_%s, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));\n' + '\n' + %(i.name_hyphen, i.name_hyphen, i.name_hyphen, self.ns_upper, i.name_upper)) + self.c.write('}\n' + '\n') + + self.c.write('typedef %sObjectIface %sObjectInterface;\n'%(self.namespace, self.namespace)) + self.c.write('G_DEFINE_INTERFACE_WITH_CODE (%sObject, %sobject, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));\n'%(self.namespace, self.ns_lower)) + self.c.write('\n') + + for i in self.ifaces: + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_get_%s:\n' + ' * @object: A #%sObject.\n' + ' *\n' + ' * Gets the #%s instance for the D-Bus interface #%s on @object, if any.\n' + ' *\n' + ' * Returns: (transfer full): A #%s that must be freed with g_object_unref() or %%NULL if @object does not implement the interface.\n' + %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.name, i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write ('%s *%sobject_get_%s (%sObject *object)\n' + %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace)) + self.c.write('{\n' + ' GDBusInterface *ret;\n' + ' ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n' + ' if (ret == NULL)\n' + ' return NULL;\n' + ' return %s%s (ret);\n' + '}\n' + '\n' + %(i.name, self.ns_upper, i.name_upper)) + self.c.write('\n') + for i in self.ifaces: + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_peek_%s: (skip)\n' + ' * @object: A #%sObject.\n' + ' *\n' + ' * Like %sobject_get_%s() but doesn\'t increase the reference count on the returned object.\n' + ' *\n' + ' * It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.\n' + ' *\n' + ' * Returns: (transfer none): A #%s or %%NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.\n' + %(self.ns_lower, i.name_upper.lower(), self.namespace, self.ns_lower, i.name_upper.lower(), i.camel_name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write ('%s *%sobject_peek_%s (%sObject *object)\n' + %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace)) + self.c.write('{\n' + ' GDBusInterface *ret;\n' + ' ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n' + ' if (ret == NULL)\n' + ' return NULL;\n' + ' g_object_unref (ret);\n' + ' return %s%s (ret);\n' + '}\n' + '\n' + %(i.name, self.ns_upper, i.name_upper)) + self.c.write('\n') + # shared by ObjectProxy and ObjectSkeleton classes + self.c.write('static void\n' + '%sobject_notify (GDBusObject *object, GDBusInterface *interface)\n' + '{\n' + ' g_object_notify (G_OBJECT (object), ((_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface))->hyphen_name);\n' + '}\n' + '\n' + %(self.ns_lower)) + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectProxy:\n' + ' *\n' + ' * The #%sObjectProxy structure contains only private data and should only be accessed using the provided API.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectProxyClass:\n' + ' * @parent_class: The parent class.\n' + ' *\n' + ' * Class structure for #%sObjectProxy.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + # class boilerplate + self.c.write('static void\n' + '%sobject_proxy__%sobject_iface_init (%sObjectIface *iface)\n' + '{\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_lower, self.namespace)) + self.c.write('static void\n' + '%sobject_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)\n' + '{\n' + ' iface->interface_added = %sobject_notify;\n' + ' iface->interface_removed = %sobject_notify;\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_lower, self.ns_lower)) + self.c.write('\n') + self.c.write('G_DEFINE_TYPE_WITH_CODE (%sObjectProxy, %sobject_proxy, G_TYPE_DBUS_OBJECT_PROXY,\n' + ' G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_proxy__%sobject_iface_init)\n' + ' G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_proxy__g_dbus_object_iface_init));\n' + '\n' + %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower)) + # class boilerplate + self.c.write('static void\n' + '%sobject_proxy_init (%sObjectProxy *object)\n' + '{\n' + '}\n' + '\n'%(self.ns_lower, self.namespace)) + self.c.write('static void\n' + '%sobject_proxy_set_property (GObject *gobject,\n' + ' guint prop_id,\n' + ' const GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n' + ' G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n' + %(self.ns_lower)) + self.c.write('}\n' + '\n'%()) + self.c.write('static void\n' + '%sobject_proxy_get_property (GObject *gobject,\n' + ' guint prop_id,\n' + ' GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n' + ' %sObjectProxy *object = %sOBJECT_PROXY (gobject);\n' + ' GDBusInterface *interface;\n' + '\n' + ' switch (prop_id)\n' + ' {\n' + %(self.ns_lower, self.namespace, self.ns_upper)) + n = 1 + for i in self.ifaces: + self.c.write(' case %d:\n' + ' interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n' + ' g_value_take_object (value, interface);\n' + ' break;\n' + '\n' + %(n, i.name)) + n += 1 + self.c.write(' default:\n' + ' G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n' + ' break;\n' + ' }\n' + '}\n' + '\n'%()) + self.c.write('static void\n' + '%sobject_proxy_class_init (%sObjectProxyClass *klass)\n' + '{\n' + ' GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n' + '\n' + ' gobject_class->set_property = %sobject_proxy_set_property;\n' + ' gobject_class->get_property = %sobject_proxy_get_property;\n' + '\n' + %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower)) + n = 1 + for i in self.ifaces: + self.c.write(' g_object_class_override_property (gobject_class, %d, "%s");' + '\n' + %(n, i.name_hyphen)) + n += 1 + self.c.write('}\n' + '\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_proxy_new:\n' + ' * @connection: A #GDBusConnection.\n' + ' * @object_path: An object path.\n' + ' *\n' + ' * Creates a new proxy object.\n' + ' *\n' + ' * Returns: (transfer full): The proxy object.\n' + ' */\n' + %(self.ns_lower), False)) + self.c.write('%sObjectProxy *\n' + '%sobject_proxy_new (GDBusConnection *connection,\n' + ' const gchar *object_path)\n' + '{\n' + ' g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);\n' + ' g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n' + ' return %sOBJECT_PROXY (g_object_new (%sTYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));\n' + '}\n' + '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper)) + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectSkeleton:\n' + ' *\n' + ' * The #%sObjectSkeleton structure contains only private data and should only be accessed using the provided API.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectSkeletonClass:\n' + ' * @parent_class: The parent class.\n' + ' *\n' + ' * Class structure for #%sObjectSkeleton.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + # class boilerplate + self.c.write('static void\n' + '%sobject_skeleton__%sobject_iface_init (%sObjectIface *iface)\n' + '{\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_lower, self.namespace)) + self.c.write('\n') + self.c.write('static void\n' + '%sobject_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)\n' + '{\n' + ' iface->interface_added = %sobject_notify;\n' + ' iface->interface_removed = %sobject_notify;\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_lower, self.ns_lower)) + self.c.write('G_DEFINE_TYPE_WITH_CODE (%sObjectSkeleton, %sobject_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,\n' + ' G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_skeleton__%sobject_iface_init)\n' + ' G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_skeleton__g_dbus_object_iface_init));\n' + '\n' + %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower)) + # class boilerplate + self.c.write('static void\n' + '%sobject_skeleton_init (%sObjectSkeleton *object)\n' + '{\n' + '}\n' + '\n'%(self.ns_lower, self.namespace)) + self.c.write('static void\n' + '%sobject_skeleton_set_property (GObject *gobject,\n' + ' guint prop_id,\n' + ' const GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n' + ' %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n' + ' GDBusInterfaceSkeleton *interface;\n' + '\n' + ' switch (prop_id)\n' + ' {\n' + %(self.ns_lower, self.namespace, self.ns_upper)) + n = 1 + for i in self.ifaces: + self.c.write(' case %d:\n' + ' interface = g_value_get_object (value);\n' + ' if (interface != NULL)\n' + ' {\n' + ' g_warn_if_fail (%sIS_%s (interface));\n' + ' g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);\n' + ' }\n' + ' else\n' + ' {\n' + ' g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "%s");\n' + ' }\n' + ' break;\n' + '\n' + %(n, self.ns_upper, i.name_upper, i.name)) + n += 1 + self.c.write(' default:\n' + ' G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n' + ' break;\n' + ' }\n' + '}\n' + '\n'%()) + self.c.write('static void\n' + '%sobject_skeleton_get_property (GObject *gobject,\n' + ' guint prop_id,\n' + ' GValue *value,\n' + ' GParamSpec *pspec)\n' + '{\n' + ' %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n' + ' GDBusInterface *interface;\n' + '\n' + ' switch (prop_id)\n' + ' {\n' + %(self.ns_lower, self.namespace, self.ns_upper)) + n = 1 + for i in self.ifaces: + self.c.write(' case %d:\n' + ' interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n' + ' g_value_take_object (value, interface);\n' + ' break;\n' + '\n' + %(n, i.name)) + n += 1 + self.c.write(' default:\n' + ' G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n' + ' break;\n' + ' }\n' + '}\n' + '\n'%()) + self.c.write('static void\n' + '%sobject_skeleton_class_init (%sObjectSkeletonClass *klass)\n' + '{\n' + ' GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n' + '\n' + ' gobject_class->set_property = %sobject_skeleton_set_property;\n' + ' gobject_class->get_property = %sobject_skeleton_get_property;\n' + '\n' + %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower)) + n = 1 + for i in self.ifaces: + self.c.write(' g_object_class_override_property (gobject_class, %d, "%s");' + '\n' + %(n, i.name_hyphen)) + n += 1 + self.c.write('}\n' + '\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_skeleton_new:\n' + ' * @object_path: An object path.\n' + ' *\n' + ' * Creates a new skeleton object.\n' + ' *\n' + ' * Returns: (transfer full): The skeleton object.\n' + ' */\n' + %(self.ns_lower), False)) + self.c.write('%sObjectSkeleton *\n' + '%sobject_skeleton_new (const gchar *object_path)\n' + '{\n' + ' g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n' + ' return %sOBJECT_SKELETON (g_object_new (%sTYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));\n' + '}\n' + '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper)) + for i in self.ifaces: + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_skeleton_set_%s:\n' + ' * @object: A #%sObjectSkeleton.\n' + ' * @interface_: (allow-none): A #%s or %%NULL to clear the interface.\n' + ' *\n' + ' * Sets the #%s instance for the D-Bus interface #%s on @object.\n' + %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.camel_name, i.name), False)) + self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0) + self.c.write ('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_)\n' + %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name)) + self.c.write('{\n' + ' g_object_set (G_OBJECT (object), "%s", interface_, NULL);\n' + '}\n' + '\n' + %(i.name_hyphen)) + self.c.write('\n') + + + def generate_object_manager_client(self): + self.c.write('/* ------------------------------------------------------------------------\n' + ' * Code for ObjectManager client\n' + ' * ------------------------------------------------------------------------\n' + ' */\n' + '\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * SECTION:%sObjectManagerClient\n' + ' * @title: %sObjectManagerClient\n' + ' * @short_description: Generated GDBusObjectManagerClient type\n' + ' *\n' + ' * This section contains a #GDBusObjectManagerClient that uses %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.\n' + ' */\n' + %(self.namespace, self.namespace, self.ns_lower), False)) + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectManagerClient:\n' + ' *\n' + ' * The #%sObjectManagerClient structure contains only private data and should only be accessed using the provided API.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sObjectManagerClientClass:\n' + ' * @parent_class: The parent class.\n' + ' *\n' + ' * Class structure for #%sObjectManagerClient.\n' + %(self.namespace, self.namespace), False)) + self.c.write(' */\n') + self.c.write('\n') + + # class boilerplate + self.c.write('G_DEFINE_TYPE (%sObjectManagerClient, %sobject_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);\n' + '\n' + %(self.namespace, self.ns_lower)) + + # class boilerplate + self.c.write('static void\n' + '%sobject_manager_client_init (%sObjectManagerClient *manager)\n' + '{\n' + '}\n' + '\n'%(self.ns_lower, self.namespace)) + self.c.write('static void\n' + '%sobject_manager_client_class_init (%sObjectManagerClientClass *klass)\n' + '{\n' + '}\n' + '\n'%(self.ns_lower, self.namespace)) + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_manager_client_get_proxy_type:\n' + ' * @manager: A #GDBusObjectManagerClient.\n' + ' * @object_path: The object path of the remote object (unused).\n' + ' * @interface_name: (allow-none): Interface name of the remote object or %%NULL to get the object proxy #GType.\n' + ' * @user_data: User data (unused).\n' + ' *\n' + ' * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy- and #GDBusProxy-derived types.\n' + ' *\n' + ' * Returns: A #GDBusProxy-derived #GType if @interface_name is not %%NULL, otherwise the #GType for #%sObjectProxy.\n' + %(self.ns_lower, self.namespace), False)) + self.c.write(' */\n') + self.c.write('GType\n' + '%sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data)\n' + '{\n' + %(self.ns_lower)) + self.c.write(' static gsize once_init_value = 0;\n' + ' static GHashTable *lookup_hash;\n' + ' GType ret;\n' + '\n' + ' if (interface_name == NULL)\n' + ' return %sTYPE_OBJECT_PROXY;\n' + ' if (g_once_init_enter (&once_init_value))\n' + ' {\n' + ' lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);\n' + %(self.ns_upper)) + for i in self.ifaces: + self.c.write(' g_hash_table_insert (lookup_hash, (gpointer) "%s", GSIZE_TO_POINTER (%sTYPE_%s_PROXY));\n' + %(i.name, i.ns_upper, i.name_upper)) + self.c.write(' g_once_init_leave (&once_init_value, 1);\n' + ' }\n') + self.c.write(' ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));\n' + ' if (ret == (GType) 0)\n' + ' ret = G_TYPE_DBUS_PROXY;\n') + self.c.write(' return ret;\n' + '}\n' + '\n') + + # constructors + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_manager_client_new:\n' + ' * @connection: A #GDBusConnection.\n' + ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n' + ' * @name: (allow-none): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n' + ' * @user_data: User data to pass to @callback.\n' + ' *\n' + ' * Asynchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.\n' + ' *\n' + ' * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from.\n' + ' * You can then call %sobject_manager_client_new_finish() to get the result of the operation.\n' + ' *\n' + ' * See %sobject_manager_client_new_sync() for the synchronous, blocking version of this constructor.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False)) + self.c.write(' */\n') + self.c.write('void\n' + '%sobject_manager_client_new (\n' + ' GDBusConnection *connection,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data)\n' + '{\n' + ' g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_upper, self.ns_lower)) + self.c.write('/**\n' + ' * %sobject_manager_client_new_finish:\n' + ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new().\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Finishes an operation started with %sobject_manager_client_new().\n' + ' *\n' + ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace)) + self.c.write(' */\n') + self.c.write('GDBusObjectManager *\n' + '%sobject_manager_client_new_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error)\n' + '{\n' + ' GObject *ret;\n' + ' GObject *source_object;\n' + ' source_object = g_async_result_get_source_object (res);\n' + ' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n' + ' g_object_unref (source_object);\n' + ' if (ret != NULL)\n' + ' return G_DBUS_OBJECT_MANAGER (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(self.ns_lower)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_manager_client_new_sync:\n' + ' * @connection: A #GDBusConnection.\n' + ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n' + ' * @name: (allow-none): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Synchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.\n' + ' *\n' + ' * The calling thread is blocked until a reply is received.\n' + ' *\n' + ' * See %sobject_manager_client_new() for the asynchronous version of this constructor.\n' + ' *\n' + ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False)) + self.c.write(' */\n') + self.c.write('GDBusObjectManager *\n' + '%sobject_manager_client_new_sync (\n' + ' GDBusConnection *connection,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error)\n' + '{\n' + ' GInitable *ret;\n' + ' ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n' + ' if (ret != NULL)\n' + ' return G_DBUS_OBJECT_MANAGER (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_upper, self.ns_lower)) + self.c.write('\n') + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_manager_client_new_for_bus:\n' + ' * @bus_type: A #GBusType.\n' + ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n' + ' * @name: A bus name (well-known or unique).\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n' + ' * @user_data: User data to pass to @callback.\n' + ' *\n' + ' * Like %sobject_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.\n' + ' *\n' + ' * When the operation is finished, @callback will be invoked in the thread-default main loop of the thread you are calling this method from.\n' + ' * You can then call %sobject_manager_client_new_for_bus_finish() to get the result of the operation.\n' + ' *\n' + ' * See %sobject_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False)) + self.c.write(' */\n') + self.c.write('void\n' + '%sobject_manager_client_new_for_bus (\n' + ' GBusType bus_type,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GAsyncReadyCallback callback,\n' + ' gpointer user_data)\n' + '{\n' + ' g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_upper, self.ns_lower)) + self.c.write('/**\n' + ' * %sobject_manager_client_new_for_bus_finish:\n' + ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new_for_bus().\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Finishes an operation started with %sobject_manager_client_new_for_bus().\n' + ' *\n' + ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace)) + self.c.write(' */\n') + self.c.write('GDBusObjectManager *\n' + '%sobject_manager_client_new_for_bus_finish (\n' + ' GAsyncResult *res,\n' + ' GError **error)\n' + '{\n' + ' GObject *ret;\n' + ' GObject *source_object;\n' + ' source_object = g_async_result_get_source_object (res);\n' + ' ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n' + ' g_object_unref (source_object);\n' + ' if (ret != NULL)\n' + ' return G_DBUS_OBJECT_MANAGER (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(self.ns_lower)) + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * %sobject_manager_client_new_for_bus_sync:\n' + ' * @bus_type: A #GBusType.\n' + ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n' + ' * @name: A bus name (well-known or unique).\n' + ' * @object_path: An object path.\n' + ' * @cancellable: (allow-none): A #GCancellable or %%NULL.\n' + ' * @error: Return location for error or %%NULL\n' + ' *\n' + ' * Like %sobject_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n' + ' *\n' + ' * The calling thread is blocked until a reply is received.\n' + ' *\n' + ' * See %sobject_manager_client_new_for_bus() for the asynchronous version of this constructor.\n' + ' *\n' + ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n' + %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False)) + self.c.write(' */\n') + self.c.write('GDBusObjectManager *\n' + '%sobject_manager_client_new_for_bus_sync (\n' + ' GBusType bus_type,\n' + ' GDBusObjectManagerClientFlags flags,\n' + ' const gchar *name,\n' + ' const gchar *object_path,\n' + ' GCancellable *cancellable,\n' + ' GError **error)\n' + '{\n' + ' GInitable *ret;\n' + ' ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n' + ' if (ret != NULL)\n' + ' return G_DBUS_OBJECT_MANAGER (ret);\n' + ' else\n' + ' return NULL;\n' + '}\n' + '\n' + %(self.ns_lower, self.ns_upper, self.ns_lower)) + self.c.write('\n') + + # --------------------------------------------------------------------------------------------------- + + def write_gtkdoc_deprecated_and_since_and_close(self, obj, f, indent): + if len(obj.since) > 0: + f.write('%*s *\n' + '%*s * Since: %s\n' + %(indent, '', indent, '', obj.since)) + if obj.deprecated: + if isinstance(obj, dbustypes.Interface): + thing = 'The D-Bus interface' + elif isinstance(obj, dbustypes.Method): + thing = 'The D-Bus method' + elif isinstance(obj, dbustypes.Signal): + thing = 'The D-Bus signal' + elif isinstance(obj, dbustypes.Property): + thing = 'The D-Bus property' + else: + raise RuntimeError('Cannot handle object ', obj) + f.write(self.docbook_gen.expand( + '%*s *\n' + '%*s * Deprecated: %s has been deprecated.\n' + %(indent, '', indent, '', thing), False)) + f.write('%*s */\n'%(indent, '')) + + # --------------------------------------------------------------------------------------------------- + + def generate_interface_intro(self, i): + self.c.write('/* ------------------------------------------------------------------------\n' + ' * Code for interface %s\n' + ' * ------------------------------------------------------------------------\n' + ' */\n' + '\n'%(i.name)) + + self.c.write(self.docbook_gen.expand( + '/**\n' + ' * SECTION:%s\n' + ' * @title: %s\n' + ' * @short_description: Generated C code for the %s D-Bus interface\n' + ' *\n' + ' * This section contains code for working with the #%s D-Bus interface in C.\n' + ' */\n' + %(i.camel_name, i.camel_name, i.name, i.name), False)) + self.c.write('\n') + + def generate(self): + self.generate_intro() + self.declare_types() + for i in self.ifaces: + self.generate_interface_intro(i) + self.generate_introspection_for_interface(i) + self.generate_interface(i) + self.generate_property_accessors(i) + self.generate_signal_emitters(i) + self.generate_method_calls(i) + self.generate_method_completers(i) + self.generate_proxy(i) + self.generate_skeleton(i) + if self.generate_objmanager: + self.generate_object() + self.generate_object_manager_client() + self.generate_outro() diff --git a/gio/gdbus-2.0/codegen/codegen_docbook.py b/gio/gdbus-2.0/codegen/codegen_docbook.py new file mode 100644 index 0000000..94e07ed --- /dev/null +++ b/gio/gdbus-2.0/codegen/codegen_docbook.py @@ -0,0 +1,331 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import sys +import re + +from . import config +from . import utils +from . import dbustypes +from . import parser + +# ---------------------------------------------------------------------------------------------------- + +class DocbookCodeGenerator: + def __init__(self, ifaces, docbook): + self.ifaces = ifaces + self.docbook = docbook + self.generate_expand_dicts() + + def print_method_prototype(self, i, m, in_synopsis): + max_method_len = 0 + if in_synopsis: + for _m in i.methods: + max_method_len = max(len(_m.name), max_method_len) + else: + max_method_len = max(len(m.name), max_method_len) + + max_signature_len = 0 + if in_synopsis: + for _m in i.methods: + for a in _m.in_args: + max_signature_len = max(len(a.signature), max_signature_len) + for a in _m.out_args: + max_signature_len = max(len(a.signature), max_signature_len) + else: + for a in m.in_args: + max_signature_len = max(len(a.signature), max_signature_len) + for a in m.out_args: + max_signature_len = max(len(a.signature), max_signature_len) + + if in_synopsis: + self.out.write('%s%*s (' + %(utils.dots_to_hyphens(i.name), m.name, m.name, max_method_len - len(m.name), '')) + else: + self.out.write('%s%*s (' + %(m.name, max_method_len - len(m.name), '')) + count = 0 + for a in m.in_args: + if (count > 0): + self.out.write(',\n%*s'%(max_method_len + 2, '')) + self.out.write('IN %s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name)) + count = count + 1 + for a in m.out_args: + if (count > 0): + self.out.write(',\n%*s'%(max_method_len + 2, '')) + self.out.write('OUT %s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name)) + count = count + 1 + self.out.write(');\n') + + def print_signal_prototype(self, i, s, in_synopsis): + max_signal_len = 0 + if in_synopsis: + for _s in i.signals: + max_signal_len = max(len(_s.name), max_signal_len) + else: + max_signal_len = max(len(s.name), max_signal_len) + + max_signature_len = 0 + if in_synopsis: + for _s in i.signals: + for a in _s.args: + max_signature_len = max(len(a.signature), max_signature_len) + else: + for a in s.args: + max_signature_len = max(len(a.signature), max_signature_len) + + if in_synopsis: + self.out.write('%s%*s (' + %(utils.dots_to_hyphens(i.name), s.name, s.name, max_signal_len - len(s.name), '')) + else: + self.out.write('%s%*s (' + %(s.name, max_signal_len - len(s.name), '')) + count = 0 + for a in s.args: + if (count > 0): + self.out.write(',\n%*s'%(max_signal_len + 2, '')) + self.out.write('%s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name)) + count = count + 1 + self.out.write(');\n') + + def print_property_prototype(self, i, p, in_synopsis): + max_property_len = 0 + if in_synopsis: + for _p in i.properties: + max_property_len = max(len(_p.name), max_property_len) + else: + max_property_len = max(len(p.name), max_property_len) + + max_signature_len = 0 + if in_synopsis: + for _p in i.properties: + max_signature_len = max(len(_p.signature), max_signature_len) + else: + max_signature_len = max(len(p.signature), max_signature_len) + + if in_synopsis: + self.out.write('%s%*s' + %(utils.dots_to_hyphens(i.name), p.name, p.name, max_property_len - len(p.name), '')) + else: + self.out.write('%s%*s' + %(p.name, max_property_len - len(p.name), '')) + if p.readable and p.writable: + access = 'readwrite' + elif p.readable: + access = 'readable ' + else: + access = 'writable ' + self.out.write(' %s %s\n'%(access, p.signature)) + + + def print_synopsis_methods(self, i): + self.out.write(' \n'%()) + self.out.write(' Methods\n'%()) + self.out.write(' \n'%()) + for m in i.methods: + self.print_method_prototype(i, m, in_synopsis=True) + self.out.write('\n'%()) + self.out.write(' \n'%()) + + def print_synopsis_signals(self, i): + self.out.write(' \n'%()) + self.out.write(' Signals\n'%()) + self.out.write(' \n'%()) + for s in i.signals: + self.print_signal_prototype(i, s, in_synopsis=True) + self.out.write('\n'%()) + self.out.write(' \n'%()) + + def print_synopsis_properties(self, i): + self.out.write(' \n'%()) + self.out.write(' Properties\n'%()) + self.out.write(' \n'%()) + for p in i.properties: + self.print_property_prototype(i, p, in_synopsis=True) + self.out.write('\n'%()) + self.out.write(' \n'%()) + + def print_method(self, i, m): + self.out.write('\n'%(utils.dots_to_hyphens(i.name), m.name)) + self.out.write(' The %s() method\n'%(m.name)) + self.out.write(' %s.%s()\n'%(utils.dots_to_hyphens(i.name), m.name, i.name_without_prefix, m.name, i.name, m.name)) + self.out.write('\n') + self.print_method_prototype(i, m, in_synopsis=False) + self.out.write('\n') + self.out.write('%s\n'%(self.expand_paras(m.doc_string, True))) + if m.in_args or m.out_args: + self.out.write('\n') + for a in m.in_args: + self.out.write('\n'%()) + self.out.write(' IN %s %s:\n'%(a.signature, a.name)) + self.out.write(' %s\n'%(self.expand_paras(a.doc_string, True))) + self.out.write('\n'%()) + for a in m.out_args: + self.out.write('\n'%()) + self.out.write(' OUT %s %s:\n'%(a.signature, a.name)) + self.out.write(' %s\n'%(self.expand_paras(a.doc_string, True))) + self.out.write('\n'%()) + self.out.write('\n') + if len(m.since) > 0: + self.out.write('Since %s\n'%(m.since)) + if m.deprecated: + self.out.write('The %s() method is deprecated.'%(m.name)) + self.out.write('\n') + + def print_signal(self, i, s): + self.out.write('\n'%(utils.dots_to_hyphens(i.name), s.name)) + self.out.write(' The "%s" signal\n'%(s.name)) + self.out.write(' %s::%s\n'%(utils.dots_to_hyphens(i.name), s.name, i.name_without_prefix, s.name, i.name, s.name)) + self.out.write('\n') + self.print_signal_prototype(i, s, in_synopsis=False) + self.out.write('\n') + self.out.write('%s\n'%(self.expand_paras(s.doc_string, True))) + if s.args: + self.out.write('\n') + for a in s.args: + self.out.write('\n'%()) + self.out.write(' %s %s:\n'%(a.signature, a.name)) + self.out.write(' %s\n'%(self.expand_paras(a.doc_string, True))) + self.out.write('\n'%()) + self.out.write('\n') + if len(s.since) > 0: + self.out.write('Since %s\n'%(s.since)) + if s.deprecated: + self.out.write('The "%s" signal is deprecated.'%(s.name)) + self.out.write('\n') + + def print_property(self, i, p): + self.out.write('\n'%(utils.dots_to_hyphens(i.name), p.name)) + self.out.write(' The "%s" property\n'%(p.name)) + self.out.write(' %s:%s\n'%(utils.dots_to_hyphens(i.name), p.name, i.name_without_prefix, p.name, i.name, p.name)) + self.out.write('\n') + self.print_property_prototype(i, p, in_synopsis=False) + self.out.write('\n') + self.out.write('%s\n'%(self.expand_paras(p.doc_string, True))) + if len(p.since) > 0: + self.out.write('Since %s\n'%(p.since)) + if p.deprecated: + self.out.write('The "%s" property is deprecated.'%(p.name)) + self.out.write('\n') + + def expand(self, s, expandParamsAndConstants): + for key in self.expand_member_dict_keys: + s = s.replace(key, self.expand_member_dict[key]) + for key in self.expand_iface_dict_keys: + s = s.replace(key, self.expand_iface_dict[key]) + if expandParamsAndConstants: + # replace @foo with foo + s = re.sub('@[a-zA-Z0-9_]*', lambda m: '' + m.group(0)[1:] + '', s) + # replace e.g. %TRUE with TRUE + s = re.sub('%[a-zA-Z0-9_]*', lambda m: '' + m.group(0)[1:] + '', s) + return s + + def expand_paras(self, s, expandParamsAndConstants): + s = self.expand(s, expandParamsAndConstants).strip() + if not s.startswith("\n'%()) + self.out.write('\n'%()) + self.out.write('\n'%(i.name)) + self.out.write(' '%()) + self.out.write(' %s\n'%(utils.dots_to_hyphens(i.name), i.name)) + self.out.write(' %s\n'%(utils.dots_to_hyphens(i.name), i.name_without_prefix, i.name)) + self.out.write(' '%()) + + self.out.write(' '%()) + self.out.write(' %s'%(i.name)) + self.out.write(' %s'%(i.doc_string_brief)) + self.out.write(' '%()) + + if len(i.methods) > 0: + self.print_synopsis_methods(i) + if len(i.signals) > 0: + self.print_synopsis_signals(i) + if len(i.properties) > 0: + self.print_synopsis_properties(i) + + self.out.write('\n'%(utils.dots_to_hyphens(i.name))) + self.out.write(' Description\n'%()) + self.out.write(' %s\n'%(self.expand_paras(i.doc_string, True))) + if len(i.since) > 0: + self.out.write(' Since %s\n'%(i.since)) + if i.deprecated: + self.out.write('The %s interface is deprecated.'%(i.name)) + self.out.write('\n'%()) + + if len(i.methods) > 0: + self.out.write('\n'%(i.name)) + self.out.write(' Method Details\n'%()) + for m in i.methods: + self.print_method(i, m) + self.out.write('\n'%()) + + if len(i.signals) > 0: + self.out.write('\n'%(i.name)) + self.out.write(' Signal Details\n'%()) + for s in i.signals: + self.print_signal(i, s) + self.out.write('\n'%()) + + if len(i.properties) > 0: + self.out.write('\n'%(i.name)) + self.out.write(' Property Details\n'%()) + for s in i.properties: + self.print_property(i, s) + self.out.write('\n'%()) + + self.out.write('\n') + self.out.write('\n') + diff --git a/gio/gdbus-2.0/codegen/codegen_main.py b/gio/gdbus-2.0/codegen/codegen_main.py new file mode 100755 index 0000000..aa7984e --- /dev/null +++ b/gio/gdbus-2.0/codegen/codegen_main.py @@ -0,0 +1,203 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import sys +import optparse + +from . import config +from . import utils +from . import dbustypes +from . import parser +from . import codegen +from . import codegen_docbook + +def find_arg(arg_list, arg_name): + for a in arg_list: + if a.name == arg_name: + return a + return None + +def find_method(iface, method): + for m in iface.methods: + if m.name == method: + return m + return None + +def find_signal(iface, signal): + for m in iface.signals: + if m.name == signal: + return m + return None + +def find_prop(iface, prop): + for m in iface.properties: + if m.name == prop: + return m + return None + +def apply_annotation(iface_list, iface, method, signal, prop, arg, key, value): + iface_obj = None + for i in iface_list: + if i.name == iface: + iface_obj = i + break + + if iface_obj == None: + raise RuntimeError('No interface %s'%iface) + + target_obj = None + + if method: + method_obj = find_method(iface_obj, method) + if method_obj == None: + raise RuntimeError('No method %s on interface %s'%(method, iface)) + if arg: + arg_obj = find_arg(method_obj.in_args, arg) + if (arg_obj == None): + arg_obj = find_arg(method_obj.out_args, arg) + if (arg_obj == None): + raise RuntimeError('No arg %s on method %s on interface %s'%(arg, method, iface)) + target_obj = arg_obj + else: + target_obj = method_obj + elif signal: + signal_obj = find_signal(iface_obj, signal) + if signal_obj == None: + raise RuntimeError('No signal %s on interface %s'%(signal, iface)) + if arg: + arg_obj = find_arg(signal_obj.args, arg) + if (arg_obj == None): + raise RuntimeError('No arg %s on signal %s on interface %s'%(arg, signal, iface)) + target_obj = arg_obj + else: + target_obj = signal_obj + elif prop: + prop_obj = find_prop(iface_obj, prop) + if prop_obj == None: + raise RuntimeError('No property %s on interface %s'%(prop, iface)) + target_obj = prop_obj + else: + target_obj = iface_obj + target_obj.annotations.insert(0, dbustypes.Annotation(key, value)) + + +def apply_annotations(iface_list, annotation_list): + # apply annotations given on the command line + for (what, key, value) in annotation_list: + pos = what.find('::') + if pos != -1: + # signal + iface = what[0:pos]; + signal = what[pos + 2:] + pos = signal.find('[') + if pos != -1: + arg = signal[pos + 1:] + signal = signal[0:pos] + pos = arg.find(']') + arg = arg[0:pos] + apply_annotation(iface_list, iface, None, signal, None, arg, key, value) + else: + apply_annotation(iface_list, iface, None, signal, None, None, key, value) + else: + pos = what.find(':') + if pos != -1: + # property + iface = what[0:pos]; + prop = what[pos + 1:] + apply_annotation(iface_list, iface, None, None, prop, None, key, value) + else: + pos = what.find('()') + if pos != -1: + # method + combined = what[0:pos] + pos = combined.rfind('.') + iface = combined[0:pos] + method = combined[pos + 1:] + pos = what.find('[') + if pos != -1: + arg = what[pos + 1:] + pos = arg.find(']') + arg = arg[0:pos] + apply_annotation(iface_list, iface, method, None, None, arg, key, value) + else: + apply_annotation(iface_list, iface, method, None, None, None, key, value) + else: + # must be an interface + iface = what + apply_annotation(iface_list, iface, None, None, None, None, key, value) + +def codegen_main(): + arg_parser = optparse.OptionParser('%prog [options]') + arg_parser.add_option('', '--xml-files', metavar='FILE', action='append', + help='D-Bus introspection XML file') + arg_parser.add_option('', '--interface-prefix', metavar='PREFIX', default='', + help='String to strip from D-Bus interface names for code and docs') + arg_parser.add_option('', '--c-namespace', metavar='NAMESPACE', default='', + help='The namespace to use for generated C code') + arg_parser.add_option('', '--c-generate-object-manager', action='store_true', + help='Generate a GDBusObjectManagerClient subclass when generating C code') + arg_parser.add_option('', '--generate-c-code', metavar='OUTFILES', + help='Generate C code in OUTFILES.[ch]') + arg_parser.add_option('', '--generate-docbook', metavar='OUTFILES', + help='Generate Docbook in OUTFILES-org.Project.IFace.xml') + arg_parser.add_option('', '--annotate', nargs=3, action='append', metavar='WHAT KEY VALUE', + help='Add annotation (may be used several times)') + (opts, args) = arg_parser.parse_args(); + + all_ifaces = [] + for fname in args: + f = open(fname) + xml_data = f.read() + f.close() + parsed_ifaces = parser.parse_dbus_xml(xml_data) + all_ifaces.extend(parsed_ifaces) + + if opts.annotate != None: + apply_annotations(all_ifaces, opts.annotate) + + for i in all_ifaces: + i.post_process(opts.interface_prefix, opts.c_namespace) + + docbook = opts.generate_docbook + docbook_gen = codegen_docbook.DocbookCodeGenerator(all_ifaces, docbook); + if docbook: + ret = docbook_gen.generate() + + c_code = opts.generate_c_code + if c_code: + h = open(c_code + '.h', 'w') + c = open(c_code + '.c', 'w') + gen = codegen.CodeGenerator(all_ifaces, + opts.c_namespace, + opts.interface_prefix, + opts.c_generate_object_manager, + docbook_gen, + h, c); + ret = gen.generate() + h.close() + c.close() + + sys.exit(0) + +if __name__ == "__main__": + codegen_main() diff --git a/gio/gdbus-2.0/codegen/config.py.in b/gio/gdbus-2.0/codegen/config.py.in new file mode 100644 index 0000000..ee1a308 --- /dev/null +++ b/gio/gdbus-2.0/codegen/config.py.in @@ -0,0 +1,27 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +DATADIR = "@datarootdir@" +DATADIR = DATADIR.replace( + "${prefix}", "@prefix@") +VERSION = "@VERSION@" diff --git a/gio/gdbus-2.0/codegen/dbustypes.py b/gio/gdbus-2.0/codegen/dbustypes.py new file mode 100644 index 0000000..38eb0c4 --- /dev/null +++ b/gio/gdbus-2.0/codegen/dbustypes.py @@ -0,0 +1,426 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +from . import utils + +class Annotation: + def __init__(self, key, value): + self.key = key + self.value = value + self.annotations = [] + +class Arg: + def __init__(self, name, signature): + self.name = name + self.signature = signature + self.annotations = [] + self.doc_string = '' + self.since = '' + + def post_process(self, interface_prefix, cns, cns_upper, cns_lower, arg_number): + if len(self.doc_string) == 0: + self.doc_string = utils.lookup_docs(self.annotations) + if len(self.since) == 0: + self.since = utils.lookup_since(self.annotations) + + if self.name == None: + self.name = 'unnamed_arg%d'%arg_number + # default to GVariant + self.ctype_in_g = 'GVariant *' + self.ctype_in = 'GVariant *' + self.ctype_in_dup = 'GVariant *' + self.ctype_out = 'GVariant **' + self.gtype = 'G_TYPE_VARIANT' + self.free_func = 'g_variant_unref' + self.format_in = '@' + self.signature + self.format_out = '@' + self.signature + self.gvariant_get = 'XXX' + self.gvalue_get = 'g_value_get_variant' + if not utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.ForceGVariant'): + if self.signature == 'b': + self.ctype_in_g = 'gboolean ' + self.ctype_in = 'gboolean ' + self.ctype_out = 'gboolean *' + self.gtype = 'G_TYPE_BOOLEAN' + self.free_func = None + self.format_in = 'b' + self.format_out = 'b' + self.gvariant_get = 'g_variant_get_boolean' + self.gvalue_get = 'g_value_get_boolean' + elif self.signature == 'y': + self.ctype_in_g = 'guchar ' + self.ctype_in = 'guchar ' + self.ctype_out = 'guchar *' + self.gtype = 'G_TYPE_UCHAR' + self.free_func = None + self.format_in = 'y' + self.format_out = 'y' + self.gvariant_get = 'g_variant_get_byte' + self.gvalue_get = 'g_value_get_uchar' + elif self.signature == 'n': + self.ctype_in_g = 'gint ' + self.ctype_in = 'gint16 ' + self.ctype_out = 'gint16 *' + self.gtype = 'G_TYPE_INT' + self.free_func = None + self.format_in = 'n' + self.format_out = 'n' + self.gvariant_get = 'g_variant_get_int16' + self.gvalue_get = 'g_value_get_int' + elif self.signature == 'q': + self.ctype_in_g = 'guint ' + self.ctype_in = 'guint16 ' + self.ctype_out = 'guint16 *' + self.gtype = 'G_TYPE_UINT' + self.free_func = None + self.format_in = 'q' + self.format_out = 'q' + self.gvariant_get = 'g_variant_get_uint16' + self.gvalue_get = 'g_value_get_uint' + elif self.signature == 'i': + self.ctype_in_g = 'gint ' + self.ctype_in = 'gint ' + self.ctype_out = 'gint *' + self.gtype = 'G_TYPE_INT' + self.free_func = None + self.format_in = 'i' + self.format_out = 'i' + self.gvariant_get = 'g_variant_get_int32' + self.gvalue_get = 'g_value_get_int' + elif self.signature == 'u': + self.ctype_in_g = 'guint ' + self.ctype_in = 'guint ' + self.ctype_out = 'guint *' + self.gtype = 'G_TYPE_UINT' + self.free_func = None + self.format_in = 'u' + self.format_out = 'u' + self.gvariant_get = 'g_variant_get_uint32' + self.gvalue_get = 'g_value_get_uint' + elif self.signature == 'x': + self.ctype_in_g = 'gint64 ' + self.ctype_in = 'gint64 ' + self.ctype_out = 'gint64 *' + self.gtype = 'G_TYPE_INT64' + self.free_func = None + self.format_in = 'x' + self.format_out = 'x' + self.gvariant_get = 'g_variant_get_int64' + self.gvalue_get = 'g_value_get_int64' + elif self.signature == 't': + self.ctype_in_g = 'guint64 ' + self.ctype_in = 'guint64 ' + self.ctype_out = 'guint64 *' + self.gtype = 'G_TYPE_UINT64' + self.free_func = None + self.format_in = 't' + self.format_out = 't' + self.gvariant_get = 'g_variant_get_uint64' + self.gvalue_get = 'g_value_get_uint64' + elif self.signature == 'd': + self.ctype_in_g = 'gdouble ' + self.ctype_in = 'gdouble ' + self.ctype_out = 'gdouble *' + self.gtype = 'G_TYPE_DOUBLE' + self.free_func = None + self.format_in = 'd' + self.format_out = 'd' + self.gvariant_get = 'g_variant_get_double' + self.gvalue_get = 'g_value_get_double' + elif self.signature == 's': + self.ctype_in_g = 'const gchar *' + self.ctype_in = 'const gchar *' + self.ctype_in_dup = 'gchar *' + self.ctype_out = 'gchar **' + self.gtype = 'G_TYPE_STRING' + self.free_func = 'g_free' + self.format_in = 's' + self.format_out = 's' + self.gvariant_get = 'g_variant_get_string' + self.gvalue_get = 'g_value_get_string' + elif self.signature == 'o': + self.ctype_in_g = 'const gchar *' + self.ctype_in = 'const gchar *' + self.ctype_in_dup = 'gchar *' + self.ctype_out = 'gchar **' + self.gtype = 'G_TYPE_STRING' + self.free_func = 'g_free' + self.format_in = 'o' + self.format_out = 'o' + self.gvariant_get = 'g_variant_get_string' + self.gvalue_get = 'g_value_get_string' + elif self.signature == 'g': + self.ctype_in_g = 'const gchar *' + self.ctype_in = 'const gchar *' + self.ctype_in_dup = 'gchar *' + self.ctype_out = 'gchar **' + self.gtype = 'G_TYPE_STRING' + self.free_func = 'g_free' + self.format_in = 'g' + self.format_out = 'g' + self.gvariant_get = 'g_variant_get_string' + self.gvalue_get = 'g_value_get_string' + elif self.signature == 'ay': + self.ctype_in_g = 'const gchar *' + self.ctype_in = 'const gchar *' + self.ctype_in_dup = 'gchar *' + self.ctype_out = 'gchar **' + self.gtype = 'G_TYPE_STRING' + self.free_func = 'g_free' + self.format_in = '^ay' + self.format_out = '^ay' + self.gvariant_get = 'g_variant_get_bytestring' + self.gvalue_get = 'g_value_get_string' + elif self.signature == 'as': + self.ctype_in_g = 'const gchar *const *' + self.ctype_in = 'const gchar *const *' + self.ctype_in_dup = 'gchar **' + self.ctype_out = 'gchar ***' + self.gtype = 'G_TYPE_STRV' + self.free_func = 'g_strfreev' + self.format_in = '^as' + self.format_out = '^as' + self.gvariant_get = 'g_variant_get_strv' + self.gvalue_get = 'g_value_get_boxed' + elif self.signature == 'ao': + self.ctype_in_g = 'const gchar *const *' + self.ctype_in = 'const gchar *const *' + self.ctype_in_dup = 'gchar **' + self.ctype_out = 'gchar ***' + self.gtype = 'G_TYPE_STRV' + self.free_func = 'g_strfreev' + self.format_in = '^ao' + self.format_out = '^ao' + self.gvariant_get = 'g_variant_get_objv' + self.gvalue_get = 'g_value_get_boxed' + elif self.signature == 'aay': + self.ctype_in_g = 'const gchar *const *' + self.ctype_in = 'const gchar *const *' + self.ctype_in_dup = 'gchar **' + self.ctype_out = 'gchar ***' + self.gtype = 'G_TYPE_STRV' + self.free_func = 'g_strfreev' + self.format_in = '^aay' + self.format_out = '^aay' + self.gvariant_get = 'g_variant_get_bytestring_array' + self.gvalue_get = 'g_value_get_boxed' + +class Method: + def __init__(self, name): + self.name = name + self.in_args = [] + self.out_args = [] + self.annotations = [] + self.doc_string = '' + self.since = '' + self.deprecated = False + + def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface): + if len(self.doc_string) == 0: + self.doc_string = utils.lookup_docs(self.annotations) + if len(self.since) == 0: + self.since = utils.lookup_since(self.annotations) + if len(self.since) == 0: + self.since = containing_iface.since + + name = self.name + overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name') + if utils.is_ugly_case(overridden_name): + self.name_lower = overridden_name.lower() + else: + if overridden_name: + name = overridden_name + self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_') + self.name_hyphen = self.name_lower.replace('_', '-') + + arg_count = 0 + for a in self.in_args: + a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count) + arg_count += 1 + + for a in self.out_args: + a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count) + arg_count += 1 + + if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true': + self.deprecated = True + +class Signal: + def __init__(self, name): + self.name = name + self.args = [] + self.annotations = [] + self.doc_string = '' + self.since = '' + self.deprecated = False + + def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface): + if len(self.doc_string) == 0: + self.doc_string = utils.lookup_docs(self.annotations) + if len(self.since) == 0: + self.since = utils.lookup_since(self.annotations) + if len(self.since) == 0: + self.since = containing_iface.since + + name = self.name + overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name') + if utils.is_ugly_case(overridden_name): + self.name_lower = overridden_name.lower() + else: + if overridden_name: + name = overridden_name + self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_') + self.name_hyphen = self.name_lower.replace('_', '-') + + arg_count = 0 + for a in self.args: + a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count) + arg_count += 1 + + if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true': + self.deprecated = True + +class Property: + def __init__(self, name, signature, access): + self.name = name + self.signature = signature + self.access = access + self.annotations = [] + self.arg = Arg('value', self.signature) + self.arg.annotations = self.annotations + self.readable = False + self.writable = False + if self.access == 'readwrite': + self.readable = True + self.writable = True + elif self.access == 'read': + self.readable = True + elif self.access == 'write': + self.writable = True + else: + raise RuntimeError('Invalid access type %s'%self.access) + self.doc_string = '' + self.since = '' + self.deprecated = False + + def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface): + if len(self.doc_string) == 0: + self.doc_string = utils.lookup_docs(self.annotations) + if len(self.since) == 0: + self.since = utils.lookup_since(self.annotations) + if len(self.since) == 0: + self.since = containing_iface.since + + name = self.name + overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name') + if utils.is_ugly_case(overridden_name): + self.name_lower = overridden_name.lower() + else: + if overridden_name: + name = overridden_name + self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_') + self.name_hyphen = self.name_lower.replace('_', '-') + # don't clash with the GType getter, e.g.: GType foo_bar_get_type (void); G_GNUC_CONST + if self.name_lower == 'type': + self.name_lower = 'type_' + + # recalculate arg + self.arg.annotations = self.annotations + self.arg.post_process(interface_prefix, cns, cns_upper, cns_lower, 0) + + if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true': + self.deprecated = True + +class Interface: + def __init__(self, name): + self.name = name + self.methods = [] + self.signals = [] + self.properties = [] + self.annotations = [] + self.doc_string = '' + self.doc_string_brief = '' + self.since = '' + self.deprecated = False + + def post_process(self, interface_prefix, c_namespace): + if len(self.doc_string) == 0: + self.doc_string = utils.lookup_docs(self.annotations) + if len(self.doc_string_brief) == 0: + self.doc_string_brief = utils.lookup_brief_docs(self.annotations) + if len(self.since) == 0: + self.since = utils.lookup_since(self.annotations) + + if len(c_namespace) > 0: + if utils.is_ugly_case(c_namespace): + cns = c_namespace.replace('_', '') + cns_upper = c_namespace.upper() + '_' + cns_lower = c_namespace.lower() + '_' + else: + cns = c_namespace + cns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_' + cns_lower = utils.camel_case_to_uscore(c_namespace).lower() + '_' + else: + cns = '' + cns_upper = '' + cns_lower = '' + + overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name') + if utils.is_ugly_case(overridden_name): + name = overridden_name.replace('_', '') + name_with_ns = cns + name + self.name_without_prefix = name + self.camel_name = name_with_ns + self.ns_upper = cns_upper + self.name_lower = cns_lower + overridden_name.lower() + self.name_upper = overridden_name.upper() + + #raise RuntimeError('handle Ugly_Case ', overridden_name) + else: + if overridden_name: + name = overridden_name + else: + name = self.name + if name.startswith(interface_prefix): + name = name[len(interface_prefix):] + self.name_without_prefix = name + name = utils.strip_dots(name) + name_with_ns = utils.strip_dots(cns + '.' + name) + self.camel_name = name_with_ns + self.ns_upper = cns_upper + self.name_lower = cns_lower + utils.camel_case_to_uscore(name) + self.name_upper = utils.camel_case_to_uscore(name).upper() + + self.name_hyphen = self.name_upper.lower().replace('_', '-') + + if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true': + self.deprecated = True + + for m in self.methods: + m.post_process(interface_prefix, cns, cns_upper, cns_lower, self) + + for s in self.signals: + s.post_process(interface_prefix, cns, cns_upper, cns_lower, self) + + for p in self.properties: + p.post_process(interface_prefix, cns, cns_upper, cns_lower, self) diff --git a/gio/gdbus-2.0/codegen/gdbus-codegen.in b/gio/gdbus-2.0/codegen/gdbus-codegen.in new file mode 100644 index 0000000..253d151 --- /dev/null +++ b/gio/gdbus-2.0/codegen/gdbus-codegen.in @@ -0,0 +1,41 @@ +#!@PYTHON@ + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + + +import os +import sys + +srcdir = os.getenv('UNINSTALLED_GLIB_SRCDIR', None) + +if srcdir is not None: + path = os.path.join(srcdir, 'gio', 'gdbus-2.0') +elif os.name == 'nt': + # Makes gdbus-codegen 'relocatable' at runtime on Windows. + path = os.path.join(os.path.dirname(__file__), '..', 'lib', 'gdbus-2.0') +else: + path = os.path.join('@datadir@', 'glib-2.0') + +sys.path.insert(0, os.path.abspath(path)) +from codegen import codegen_main + +sys.exit(codegen_main.codegen_main()) diff --git a/gio/gdbus-2.0/codegen/parser.py b/gio/gdbus-2.0/codegen/parser.py new file mode 100644 index 0000000..7b9d216 --- /dev/null +++ b/gio/gdbus-2.0/codegen/parser.py @@ -0,0 +1,290 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import sys +import xml.parsers.expat + +from . import dbustypes + +class DBusXMLParser: + STATE_TOP = 'top' + STATE_NODE = 'node' + STATE_INTERFACE = 'interface' + STATE_METHOD = 'method' + STATE_SIGNAL = 'signal' + STATE_PROPERTY = 'property' + STATE_ARG = 'arg' + STATE_ANNOTATION = 'annotation' + STATE_IGNORED = 'ignored' + + def __init__(self, xml_data): + self._parser = xml.parsers.expat.ParserCreate() + self._parser.CommentHandler = self.handle_comment + self._parser.CharacterDataHandler = self.handle_char_data + self._parser.StartElementHandler = self.handle_start_element + self._parser.EndElementHandler = self.handle_end_element + + self.parsed_interfaces = [] + self._cur_object = None + + self.state = DBusXMLParser.STATE_TOP + self.state_stack = [] + self._cur_object = None + self._cur_object_stack = [] + + self.doc_comment_last_symbol = '' + + self._parser.Parse(xml_data) + + COMMENT_STATE_BEGIN = 'begin' + COMMENT_STATE_PARAMS = 'params' + COMMENT_STATE_BODY = 'body' + COMMENT_STATE_SKIP = 'skip' + def handle_comment(self, data): + comment_state = DBusXMLParser.COMMENT_STATE_BEGIN; + lines = data.split('\n') + symbol = '' + body = '' + in_para = False + params = {} + for line in lines: + orig_line = line + line = line.lstrip() + if comment_state == DBusXMLParser.COMMENT_STATE_BEGIN: + if len(line) > 0: + colon_index = line.find(': ') + if colon_index == -1: + if line.endswith(':'): + symbol = line[0:len(line)-1] + comment_state = DBusXMLParser.COMMENT_STATE_PARAMS + else: + comment_state = DBusXMLParser.COMMENT_STATE_SKIP + else: + symbol = line[0:colon_index] + rest_of_line = line[colon_index+2:].strip() + if len(rest_of_line) > 0: + body += '' + rest_of_line + '' + comment_state = DBusXMLParser.COMMENT_STATE_PARAMS + elif comment_state == DBusXMLParser.COMMENT_STATE_PARAMS: + if line.startswith('@'): + colon_index = line.find(': ') + if colon_index == -1: + comment_state = DBusXMLParser.COMMENT_STATE_BODY + if not in_para: + body += '' + in_para = True + body += orig_line + '\n' + else: + param = line[1:colon_index] + docs = line[colon_index + 2:] + params[param] = docs + else: + comment_state = DBusXMLParser.COMMENT_STATE_BODY + if len(line) > 0: + if not in_para: + body += '' + in_para = True + body += orig_line + '\n' + elif comment_state == DBusXMLParser.COMMENT_STATE_BODY: + if len(line) > 0: + if not in_para: + body += '' + in_para = True + body += orig_line + '\n' + else: + if in_para: + body += '' + in_para = False + if in_para: + body += '' + + if symbol != '': + self.doc_comment_last_symbol = symbol + self.doc_comment_params = params + self.doc_comment_body = body + + def handle_char_data(self, data): + #print 'char_data=%s'%data + pass + + def handle_start_element(self, name, attrs): + old_state = self.state + old_cur_object = self._cur_object + if self.state == DBusXMLParser.STATE_IGNORED: + self.state = DBusXMLParser.STATE_IGNORED + elif self.state == DBusXMLParser.STATE_TOP: + if name == DBusXMLParser.STATE_NODE: + self.state = DBusXMLParser.STATE_NODE + else: + self.state = DBusXMLParser.STATE_IGNORED + elif self.state == DBusXMLParser.STATE_NODE: + if name == DBusXMLParser.STATE_INTERFACE: + self.state = DBusXMLParser.STATE_INTERFACE + iface = dbustypes.Interface(attrs['name']) + self._cur_object = iface + self.parsed_interfaces.append(iface) + elif name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + # assign docs, if any + if 'name' in attrs and self.doc_comment_last_symbol == attrs['name']: + self._cur_object.doc_string = self.doc_comment_body + if 'short_description' in self.doc_comment_params: + short_description = self.doc_comment_params['short_description'] + self._cur_object.doc_string_brief = short_description + if 'since' in self.doc_comment_params: + self._cur_object.since = self.doc_comment_params['since'] + + elif self.state == DBusXMLParser.STATE_INTERFACE: + if name == DBusXMLParser.STATE_METHOD: + self.state = DBusXMLParser.STATE_METHOD + method = dbustypes.Method(attrs['name']) + self._cur_object.methods.append(method) + self._cur_object = method + elif name == DBusXMLParser.STATE_SIGNAL: + self.state = DBusXMLParser.STATE_SIGNAL + signal = dbustypes.Signal(attrs['name']) + self._cur_object.signals.append(signal) + self._cur_object = signal + elif name == DBusXMLParser.STATE_PROPERTY: + self.state = DBusXMLParser.STATE_PROPERTY + prop = dbustypes.Property(attrs['name'], attrs['type'], attrs['access']) + self._cur_object.properties.append(prop) + self._cur_object = prop + elif name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + # assign docs, if any + if 'name' in attrs and self.doc_comment_last_symbol == attrs['name']: + self._cur_object.doc_string = self.doc_comment_body + if 'since' in self.doc_comment_params: + self._cur_object.since = self.doc_comment_params['since'] + + elif self.state == DBusXMLParser.STATE_METHOD: + if name == DBusXMLParser.STATE_ARG: + self.state = DBusXMLParser.STATE_ARG + arg_name = None + if 'name' in attrs: + arg_name = attrs['name'] + arg = dbustypes.Arg(arg_name, attrs['type']) + direction = attrs['direction'] + if direction == 'in': + self._cur_object.in_args.append(arg) + elif direction == 'out': + self._cur_object.out_args.append(arg) + else: + raise RuntimeError('Invalid direction "%s"'%(direction)) + self._cur_object = arg + elif name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + # assign docs, if any + if self.doc_comment_last_symbol == old_cur_object.name: + if 'name' in attrs and attrs['name'] in self.doc_comment_params: + doc_string = self.doc_comment_params[attrs['name']] + if doc_string != None: + self._cur_object.doc_string = doc_string + if 'since' in self.doc_comment_params: + self._cur_object.since = self.doc_comment_params['since'] + + elif self.state == DBusXMLParser.STATE_SIGNAL: + if name == DBusXMLParser.STATE_ARG: + self.state = DBusXMLParser.STATE_ARG + arg_name = None + if 'name' in attrs: + arg_name = attrs['name'] + arg = dbustypes.Arg(arg_name, attrs['type']) + self._cur_object.args.append(arg) + self._cur_object = arg + elif name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + # assign docs, if any + if self.doc_comment_last_symbol == old_cur_object.name: + if 'name' in attrs and attrs['name'] in self.doc_comment_params: + doc_string = self.doc_comment_params[attrs['name']] + if doc_string != None: + self._cur_object.doc_string = doc_string + if 'since' in self.doc_comment_params: + self._cur_object.since = self.doc_comment_params['since'] + + elif self.state == DBusXMLParser.STATE_PROPERTY: + if name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + elif self.state == DBusXMLParser.STATE_ARG: + if name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + elif self.state == DBusXMLParser.STATE_ANNOTATION: + if name == DBusXMLParser.STATE_ANNOTATION: + self.state = DBusXMLParser.STATE_ANNOTATION + anno = dbustypes.Annotation(attrs['name'], attrs['value']) + self._cur_object.annotations.append(anno) + self._cur_object = anno + else: + self.state = DBusXMLParser.STATE_IGNORED + + else: + raise RuntimeError('Unhandled state "%s" while entering element with name "%s"'%(self.state, name)) + + self.state_stack.append(old_state) + self._cur_object_stack.append(old_cur_object) + + def handle_end_element(self, name): + self.state = self.state_stack.pop() + self._cur_object = self._cur_object_stack.pop() + +def parse_dbus_xml(xml_data): + parser = DBusXMLParser(xml_data) + return parser.parsed_interfaces diff --git a/gio/gdbus-2.0/codegen/utils.py b/gio/gdbus-2.0/codegen/utils.py new file mode 100644 index 0000000..239b64e --- /dev/null +++ b/gio/gdbus-2.0/codegen/utils.py @@ -0,0 +1,104 @@ +# -*- Mode: Python -*- + +# GDBus - GLib D-Bus Library +# +# Copyright (C) 2008-2011 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: David Zeuthen + +import distutils.version + +def strip_dots(s): + ret = '' + force_upper = False + for c in s: + if c == '.': + force_upper = True + else: + if force_upper: + ret += c.upper() + force_upper = False + else: + ret += c + return ret + +def dots_to_hyphens(s): + return s.replace('.', '-') + +def camel_case_to_uscore(s): + ret = '' + insert_uscore = False + prev_was_lower = False + initial = True; + for c in s: + # Keep initial underscores in camel case + if initial and c == '_': + ret += '_' + continue; + initial = False + + if c.isupper(): + if prev_was_lower: + insert_uscore = True + prev_was_lower = False + else: + prev_was_lower = True + if insert_uscore: + ret += '_' + ret += c.lower() + insert_uscore = False + return ret + +def is_ugly_case(s): + if s and s.find('_') > 0: + return True + return False + +def lookup_annotation(annotations, key): + if annotations: + for a in annotations: + if a.key == key: + return a.value + return None + +def lookup_docs(annotations): + s = lookup_annotation(annotations, 'org.gtk.GDBus.DocString') + if s == None: + return '' + else: + return s + +def lookup_since(annotations): + s = lookup_annotation(annotations, 'org.gtk.GDBus.Since') + if s == None: + return '' + else: + return s + +def lookup_brief_docs(annotations): + s = lookup_annotation(annotations, 'org.gtk.GDBus.DocString.Short') + if s == None: + return '' + else: + return s + +def version_cmp_key(key): + # If the 'since' version is empty put a 0 in its place as this will + # allow LooseVersion to work and will always compare lower. + v = key[0] if key[0] else '0' + return (distutils.version.LooseVersion(v), key[1]) diff --git a/gio/gdbus-tool.c b/gio/gdbus-tool.c new file mode 100644 index 0000000..bd71d1e --- /dev/null +++ b/gio/gdbus-tool.c @@ -0,0 +1,2107 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#include +#include + +#include + +#include + +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +G_GNUC_UNUSED static void completion_debug (const gchar *format, ...); + +/* Uncomment to get debug traces in /tmp/gdbus-completion-debug.txt (nice + * to not have it interfere with stdout/stderr) + */ +#if 0 +G_GNUC_UNUSED static void +completion_debug (const gchar *format, ...) +{ + va_list var_args; + gchar *s; + static FILE *f = NULL; + + va_start (var_args, format); + s = g_strdup_vprintf (format, var_args); + if (f == NULL) + { + f = fopen ("/tmp/gdbus-completion-debug.txt", "a+"); + } + fprintf (f, "%s\n", s); + g_free (s); +} +#else +static void +completion_debug (const gchar *format, ...) +{ +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + + +static void +remove_arg (gint num, gint *argc, gchar **argv[]) +{ + gint n; + + g_assert (num <= (*argc)); + + for (n = num; (*argv)[n] != NULL; n++) + (*argv)[n] = (*argv)[n+1]; + (*argv)[n] = NULL; + (*argc) = (*argc) - 1; +} + +static void +usage (gint *argc, gchar **argv[], gboolean use_stdout) +{ + GOptionContext *o; + gchar *s; + gchar *program_name; + + o = g_option_context_new (_("COMMAND")); + g_option_context_set_help_enabled (o, FALSE); + /* Ignore parsing result */ + g_option_context_parse (o, argc, argv, NULL); + program_name = g_path_get_basename ((*argv)[0]); + s = g_strdup_printf (_("Commands:\n" + " help Shows this information\n" + " introspect Introspect a remote object\n" + " monitor Monitor a remote object\n" + " call Invoke a method on a remote object\n" + " emit Emit a signal\n" + "\n" + "Use \"%s COMMAND --help\" to get help on each command.\n"), + program_name); + g_free (program_name); + g_option_context_set_description (o, s); + g_free (s); + s = g_option_context_get_help (o, FALSE, NULL); + if (use_stdout) + g_print ("%s", s); + else + g_printerr ("%s", s); + g_free (s); + g_option_context_free (o); +} + +static void +modify_argv0_for_command (gint *argc, gchar **argv[], const gchar *command) +{ + gchar *s; + gchar *program_name; + + /* TODO: + * 1. get a g_set_prgname() ?; or + * 2. save old argv[0] and restore later + */ + + g_assert (g_strcmp0 ((*argv)[1], command) == 0); + remove_arg (1, argc, argv); + + program_name = g_path_get_basename ((*argv)[0]); + s = g_strdup_printf ("%s %s", (*argv)[0], command); + (*argv)[0] = s; + g_free (program_name); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +print_methods (GDBusConnection *c, + const gchar *name, + const gchar *path) +{ + GVariant *result; + GError *error; + const gchar *xml_data; + GDBusNodeInfo *node; + guint n; + guint m; + + error = NULL; + result = g_dbus_connection_call_sync (c, + name, + path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 secs */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(&s)", &xml_data); + + error = NULL; + node = g_dbus_node_info_new_for_xml (xml_data, &error); + g_variant_unref (result); + if (node == NULL) + { + g_printerr (_("Error parsing introspection XML: %s\n"), error->message); + g_error_free (error); + goto out; + } + + for (n = 0; node->interfaces != NULL && node->interfaces[n] != NULL; n++) + { + const GDBusInterfaceInfo *iface = node->interfaces[n]; + for (m = 0; iface->methods != NULL && iface->methods[m] != NULL; m++) + { + const GDBusMethodInfo *method = iface->methods[m]; + g_print ("%s.%s \n", iface->name, method->name); + } + } + g_dbus_node_info_unref (node); + + out: + ; +} + +static void +print_paths (GDBusConnection *c, + const gchar *name, + const gchar *path) +{ + GVariant *result; + GError *error; + const gchar *xml_data; + GDBusNodeInfo *node; + guint n; + + error = NULL; + result = g_dbus_connection_call_sync (c, + name, + path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 secs */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(&s)", &xml_data); + + //g_printerr ("xml=`%s'", xml_data); + + error = NULL; + node = g_dbus_node_info_new_for_xml (xml_data, &error); + g_variant_unref (result); + if (node == NULL) + { + g_printerr (_("Error parsing introspection XML: %s\n"), error->message); + g_error_free (error); + goto out; + } + + //g_printerr ("bar `%s'\n", path); + + if (node->interfaces != NULL) + g_print ("%s \n", path); + + for (n = 0; node->nodes != NULL && node->nodes[n] != NULL; n++) + { + gchar *s; + + //g_printerr ("foo `%s'\n", node->nodes[n].path); + + if (g_strcmp0 (path, "/") == 0) + s = g_strdup_printf ("/%s", node->nodes[n]->path); + else + s = g_strdup_printf ("%s/%s", path, node->nodes[n]->path); + + print_paths (c, name, s); + + g_free (s); + } + g_dbus_node_info_unref (node); + + out: + ; +} + +static void +print_names (GDBusConnection *c, + gboolean include_unique_names) +{ + GVariant *result; + GError *error; + GVariantIter *iter; + gchar *str; + GHashTable *name_set; + GList *keys; + GList *l; + + name_set = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + error = NULL; + result = g_dbus_connection_call_sync (c, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "ListNames", + NULL, + G_VARIANT_TYPE ("(as)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 secs */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(as)", &iter); + while (g_variant_iter_loop (iter, "s", &str)) + g_hash_table_insert (name_set, g_strdup (str), NULL); + g_variant_iter_free (iter); + g_variant_unref (result); + + error = NULL; + result = g_dbus_connection_call_sync (c, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "ListActivatableNames", + NULL, + G_VARIANT_TYPE ("(as)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 secs */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(as)", &iter); + while (g_variant_iter_loop (iter, "s", &str)) + g_hash_table_insert (name_set, g_strdup (str), NULL); + g_variant_iter_free (iter); + g_variant_unref (result); + + keys = g_hash_table_get_keys (name_set); + keys = g_list_sort (keys, (GCompareFunc) g_strcmp0); + for (l = keys; l != NULL; l = l->next) + { + const gchar *name = l->data; + if (!include_unique_names && g_str_has_prefix (name, ":")) + continue; + + g_print ("%s \n", name); + } + g_list_free (keys); + + out: + g_hash_table_unref (name_set); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean opt_connection_system = FALSE; +static gboolean opt_connection_session = FALSE; +static gchar *opt_connection_address = NULL; + +static const GOptionEntry connection_entries[] = +{ + { "system", 'y', 0, G_OPTION_ARG_NONE, &opt_connection_system, N_("Connect to the system bus"), NULL}, + { "session", 'e', 0, G_OPTION_ARG_NONE, &opt_connection_session, N_("Connect to the session bus"), NULL}, + { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_connection_address, N_("Connect to given D-Bus address"), NULL}, + { NULL } +}; + +static GOptionGroup * +connection_get_group (void) +{ + static GOptionGroup *g; + + g = g_option_group_new ("connection", + N_("Connection Endpoint Options:"), + N_("Options specifying the connection endpoint"), + NULL, + NULL); + g_option_group_set_translation_domain (g, GETTEXT_PACKAGE); + g_option_group_add_entries (g, connection_entries); + + return g; +} + +static GDBusConnection * +connection_get_dbus_connection (GError **error) +{ + GDBusConnection *c; + + c = NULL; + + /* First, ensure we have exactly one connect */ + if (!opt_connection_system && !opt_connection_session && opt_connection_address == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("No connection endpoint specified")); + goto out; + } + else if ((opt_connection_system && (opt_connection_session || opt_connection_address != NULL)) || + (opt_connection_session && (opt_connection_system || opt_connection_address != NULL)) || + (opt_connection_address != NULL && (opt_connection_system || opt_connection_session))) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Multiple connection endpoints specified")); + goto out; + } + + if (opt_connection_system) + { + c = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error); + } + else if (opt_connection_session) + { + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, error); + } + else if (opt_connection_address != NULL) + { + c = g_dbus_connection_new_for_address_sync (opt_connection_address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + error); + } + + out: + return c; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GPtrArray * +call_helper_get_method_in_signature (GDBusConnection *c, + const gchar *dest, + const gchar *path, + const gchar *interface_name, + const gchar *method_name, + GError **error) +{ + GPtrArray *ret; + GVariant *result; + GDBusNodeInfo *node_info; + const gchar *xml_data; + GDBusInterfaceInfo *interface_info; + GDBusMethodInfo *method_info; + guint n; + + ret = NULL; + result = NULL; + node_info = NULL; + + result = g_dbus_connection_call_sync (c, + dest, + path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 secs */ + NULL, + error); + if (result == NULL) + goto out; + + g_variant_get (result, "(&s)", &xml_data); + node_info = g_dbus_node_info_new_for_xml (xml_data, error); + if (node_info == NULL) + goto out; + + interface_info = g_dbus_node_info_lookup_interface (node_info, interface_name); + if (interface_info == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Warning: According to introspection data, interface `%s' does not exist\n"), + interface_name); + goto out; + } + + method_info = g_dbus_interface_info_lookup_method (interface_info, method_name); + if (method_info == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Warning: According to introspection data, method `%s' does not exist on interface `%s'\n"), + method_name, + interface_name); + goto out; + } + + ret = g_ptr_array_new_with_free_func ((GDestroyNotify) g_variant_type_free); + for (n = 0; method_info->in_args != NULL && method_info->in_args[n] != NULL; n++) + { + g_ptr_array_add (ret, g_variant_type_new (method_info->in_args[n]->signature)); + } + + out: + if (node_info != NULL) + g_dbus_node_info_unref (node_info); + if (result != NULL) + g_variant_unref (result); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GVariant * +_g_variant_parse_me_harder (GVariantType *type, + const gchar *given_str, + GError **error) +{ + GVariant *value; + gchar *s; + guint n; + GString *str; + + str = g_string_new ("\""); + for (n = 0; given_str[n] != '\0'; n++) + { + if (G_UNLIKELY (given_str[n] == '\"')) + g_string_append (str, "\\\""); + else + g_string_append_c (str, given_str[n]); + } + g_string_append_c (str, '"'); + s = g_string_free (str, FALSE); + + value = g_variant_parse (type, + s, + NULL, + NULL, + error); + g_free (s); + + return value; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar *opt_emit_dest = NULL; +static gchar *opt_emit_object_path = NULL; +static gchar *opt_emit_signal = NULL; + +static const GOptionEntry emit_entries[] = +{ + { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_emit_dest, N_("Optional destination for signal (unique name)"), NULL}, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_emit_object_path, N_("Object path to emit signal on"), NULL}, + { "signal", 's', 0, G_OPTION_ARG_STRING, &opt_emit_signal, N_("Signal and interface name"), NULL}, + { NULL } +}; + +static gboolean +handle_emit (gint *argc, + gchar **argv[], + gboolean request_completion, + const gchar *completion_cur, + const gchar *completion_prev) +{ + gint ret; + GOptionContext *o; + gchar *s; + GError *error; + GDBusConnection *c; + GVariant *parameters; + gchar *interface_name; + gchar *signal_name; + GVariantBuilder builder; + guint n; + + ret = FALSE; + c = NULL; + parameters = NULL; + interface_name = NULL; + signal_name = NULL; + + modify_argv0_for_command (argc, argv, "emit"); + + o = g_option_context_new (NULL); + g_option_context_set_help_enabled (o, FALSE); + g_option_context_set_summary (o, _("Emit a signal.")); + g_option_context_add_main_entries (o, emit_entries, GETTEXT_PACKAGE); + g_option_context_add_group (o, connection_get_group ()); + + if (!g_option_context_parse (o, argc, argv, NULL)) + { + if (!request_completion) + { + s = g_option_context_get_help (o, FALSE, NULL); + g_printerr ("%s", s); + g_free (s); + goto out; + } + } + + error = NULL; + c = connection_get_dbus_connection (&error); + if (c == NULL) + { + if (request_completion) + { + if (g_strcmp0 (completion_prev, "--address") == 0) + { + g_print ("unix:\n" + "tcp:\n" + "nonce-tcp:\n"); + } + else + { + g_print ("--system \n--session \n--address \n"); + } + } + else + { + g_printerr (_("Error connecting: %s\n"), error->message); + g_error_free (error); + } + goto out; + } + + /* All done with completion now */ + if (request_completion) + goto out; + + if (opt_emit_object_path == NULL) + { + g_printerr (_("Error: object path not specified.\n")); + goto out; + } + if (!g_variant_is_object_path (opt_emit_object_path)) + { + g_printerr (_("Error: %s is not a valid object path\n"), opt_emit_object_path); + goto out; + } + + if (opt_emit_signal == NULL) + { + g_printerr (_("Error: signal not specified.\n")); + goto out; + } + + s = strrchr (opt_emit_signal, '.'); + if (s == NULL) + { + g_printerr (_("Error: signal must be the fully-qualified name.\n")); + goto out; + } + signal_name = g_strdup (s + 1); + interface_name = g_strndup (opt_emit_signal, s - opt_emit_signal); + + if (!g_dbus_is_interface_name (interface_name)) + { + g_printerr (_("Error: %s is not a valid interface name\n"), interface_name); + goto out; + } + + if (!g_dbus_is_member_name (signal_name)) + { + g_printerr (_("Error: %s is not a valid member name\n"), signal_name); + goto out; + } + + if (opt_emit_dest != NULL && !g_dbus_is_unique_name (opt_emit_dest)) + { + g_printerr (_("Error: %s is not a valid unique bus name.\n"), opt_emit_dest); + goto out; + } + + /* Read parameters */ + g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); + for (n = 1; n < (guint) *argc; n++) + { + GVariant *value; + + error = NULL; + value = g_variant_parse (NULL, + (*argv)[n], + NULL, + NULL, + &error); + if (value == NULL) + { + g_error_free (error); + error = NULL; + value = _g_variant_parse_me_harder (NULL, (*argv)[n], &error); + if (value == NULL) + { + g_printerr (_("Error parsing parameter %d: %s\n"), + n, + error->message); + g_error_free (error); + g_variant_builder_clear (&builder); + goto out; + } + } + g_variant_builder_add_value (&builder, value); + } + parameters = g_variant_builder_end (&builder); + + if (parameters != NULL) + parameters = g_variant_ref_sink (parameters); + if (!g_dbus_connection_emit_signal (c, + opt_emit_dest, + opt_emit_object_path, + interface_name, + signal_name, + parameters, + &error)) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + + if (!g_dbus_connection_flush_sync (c, NULL, &error)) + { + g_printerr (_("Error flushing connection: %s\n"), error->message); + g_error_free (error); + goto out; + } + + ret = TRUE; + + out: + if (c != NULL) + g_object_unref (c); + if (parameters != NULL) + g_variant_unref (parameters); + g_free (interface_name); + g_free (signal_name); + g_option_context_free (o); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar *opt_call_dest = NULL; +static gchar *opt_call_object_path = NULL; +static gchar *opt_call_method = NULL; +static gint opt_call_timeout = -1; + +static const GOptionEntry call_entries[] = +{ + { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_call_dest, N_("Destination name to invoke method on"), NULL}, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_call_object_path, N_("Object path to invoke method on"), NULL}, + { "method", 'm', 0, G_OPTION_ARG_STRING, &opt_call_method, N_("Method and interface name"), NULL}, + { "timeout", 't', 0, G_OPTION_ARG_INT, &opt_call_timeout, N_("Timeout in seconds"), NULL}, + { NULL } +}; + +static gboolean +handle_call (gint *argc, + gchar **argv[], + gboolean request_completion, + const gchar *completion_cur, + const gchar *completion_prev) +{ + gint ret; + GOptionContext *o; + gchar *s; + GError *error; + GDBusConnection *c; + GVariant *parameters; + gchar *interface_name; + gchar *method_name; + GVariant *result; + GPtrArray *in_signature_types; + gboolean complete_names; + gboolean complete_paths; + gboolean complete_methods; + GVariantBuilder builder; + guint n; + + ret = FALSE; + c = NULL; + parameters = NULL; + interface_name = NULL; + method_name = NULL; + result = NULL; + in_signature_types = NULL; + + modify_argv0_for_command (argc, argv, "call"); + + o = g_option_context_new (NULL); + g_option_context_set_help_enabled (o, FALSE); + g_option_context_set_summary (o, _("Invoke a method on a remote object.")); + g_option_context_add_main_entries (o, call_entries, GETTEXT_PACKAGE); + g_option_context_add_group (o, connection_get_group ()); + + complete_names = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--dest") == 0) + { + complete_names = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + complete_paths = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--object-path") == 0) + { + complete_paths = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + complete_methods = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--method") == 0) + { + complete_methods = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + if (!g_option_context_parse (o, argc, argv, NULL)) + { + if (!request_completion) + { + s = g_option_context_get_help (o, FALSE, NULL); + g_printerr ("%s", s); + g_free (s); + goto out; + } + } + + error = NULL; + c = connection_get_dbus_connection (&error); + if (c == NULL) + { + if (request_completion) + { + if (g_strcmp0 (completion_prev, "--address") == 0) + { + g_print ("unix:\n" + "tcp:\n" + "nonce-tcp:\n"); + } + else + { + g_print ("--system \n--session \n--address \n"); + } + } + else + { + g_printerr (_("Error connecting: %s\n"), error->message); + g_error_free (error); + } + goto out; + } + + /* validate and complete destination (bus name) */ + if (g_dbus_connection_get_unique_name (c) != NULL) + { + /* this only makes sense on message bus connections */ + if (complete_names) + { + print_names (c, FALSE); + goto out; + } + if (opt_call_dest == NULL) + { + if (request_completion) + g_print ("--dest \n"); + else + g_printerr (_("Error: Destination is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--dest", completion_prev) == 0) + { + print_names (c, g_str_has_prefix (opt_call_dest, ":")); + goto out; + } + } + + /* validate and complete object path */ + if (complete_paths) + { + print_paths (c, opt_call_dest, "/"); + goto out; + } + if (opt_call_object_path == NULL) + { + if (request_completion) + g_print ("--object-path \n"); + else + g_printerr (_("Error: Object path is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--object-path", completion_prev) == 0) + { + gchar *p; + s = g_strdup (opt_call_object_path); + p = strrchr (s, '/'); + if (p != NULL) + { + if (p == s) + p++; + *p = '\0'; + } + print_paths (c, opt_call_dest, s); + g_free (s); + goto out; + } + if (!request_completion && !g_variant_is_object_path (opt_call_object_path)) + { + g_printerr (_("Error: %s is not a valid object path\n"), opt_call_object_path); + goto out; + } + + /* validate and complete method (interface + method name) */ + if (complete_methods) + { + print_methods (c, opt_call_dest, opt_call_object_path); + goto out; + } + if (opt_call_method == NULL) + { + if (request_completion) + g_print ("--method \n"); + else + g_printerr (_("Error: Method name is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--method", completion_prev) == 0) + { + print_methods (c, opt_call_dest, opt_call_object_path); + goto out; + } + s = strrchr (opt_call_method, '.'); + if (!request_completion && s == NULL) + { + g_printerr (_("Error: Method name `%s' is invalid\n"), opt_call_method); + goto out; + } + method_name = g_strdup (s + 1); + interface_name = g_strndup (opt_call_method, s - opt_call_method); + + /* All done with completion now */ + if (request_completion) + goto out; + + /* Introspect, for easy conversion - it's not fatal if we can't do this */ + in_signature_types = call_helper_get_method_in_signature (c, + opt_call_dest, + opt_call_object_path, + interface_name, + method_name, + &error); + if (in_signature_types == NULL) + { + //g_printerr ("Error getting introspection data: %s\n", error->message); + g_error_free (error); + error = NULL; + } + + /* Read parameters */ + g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); + for (n = 1; n < (guint) *argc; n++) + { + GVariant *value; + GVariantType *type; + + type = NULL; + if (in_signature_types != NULL) + { + if (n - 1 >= in_signature_types->len) + { + /* Only warn for the first param */ + if (n - 1 == in_signature_types->len) + { + g_printerr ("Warning: Introspection data indicates %d parameters but more was passed\n", + in_signature_types->len); + } + } + else + { + type = in_signature_types->pdata[n - 1]; + } + } + + error = NULL; + value = g_variant_parse (type, + (*argv)[n], + NULL, + NULL, + &error); + if (value == NULL) + { + g_error_free (error); + error = NULL; + value = _g_variant_parse_me_harder (type, (*argv)[n], &error); + if (value == NULL) + { + if (type != NULL) + { + s = g_variant_type_dup_string (type); + g_printerr (_("Error parsing parameter %d of type `%s': %s\n"), + n, + s, + error->message); + g_free (s); + } + else + { + g_printerr (_("Error parsing parameter %d: %s\n"), + n, + error->message); + } + g_error_free (error); + g_variant_builder_clear (&builder); + goto out; + } + } + g_variant_builder_add_value (&builder, value); + } + parameters = g_variant_builder_end (&builder); + + if (parameters != NULL) + parameters = g_variant_ref_sink (parameters); + result = g_dbus_connection_call_sync (c, + opt_call_dest, + opt_call_object_path, + interface_name, + method_name, + parameters, + NULL, + G_DBUS_CALL_FLAGS_NONE, + opt_call_timeout > 0 ? opt_call_timeout * 1000 : opt_call_timeout, + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + if (in_signature_types != NULL) + { + GString *s; + s = g_string_new (NULL); + for (n = 0; n < in_signature_types->len; n++) + { + GVariantType *type = in_signature_types->pdata[n]; + g_string_append_len (s, + g_variant_type_peek_string (type), + g_variant_type_get_string_length (type)); + } + g_printerr ("(According to introspection data, you need to pass `%s')\n", s->str); + g_string_free (s, TRUE); + } + goto out; + } + + s = g_variant_print (result, TRUE); + g_print ("%s\n", s); + g_free (s); + + ret = TRUE; + + out: + if (in_signature_types != NULL) + g_ptr_array_unref (in_signature_types); + if (result != NULL) + g_variant_unref (result); + if (c != NULL) + g_object_unref (c); + if (parameters != NULL) + g_variant_unref (parameters); + g_free (interface_name); + g_free (method_name); + g_option_context_free (o); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar *opt_introspect_dest = NULL; +static gchar *opt_introspect_object_path = NULL; +static gboolean opt_introspect_xml = FALSE; +static gboolean opt_introspect_recurse = FALSE; +static gboolean opt_introspect_only_properties = FALSE; + +static void +dump_annotation (const GDBusAnnotationInfo *o, + guint indent, + gboolean ignore_indent) +{ + guint n; + g_print ("%*s@%s(\"%s\")\n", + ignore_indent ? 0 : indent, "", + o->key, + o->value); + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent + 2, FALSE); +} + +static void +dump_arg (const GDBusArgInfo *o, + guint indent, + const gchar *direction, + gboolean ignore_indent, + gboolean include_newline) +{ + guint n; + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + { + dump_annotation (o->annotations[n], indent, ignore_indent); + ignore_indent = FALSE; + } + + g_print ("%*s%s%s %s%s", + ignore_indent ? 0 : indent, "", + direction, + o->signature, + o->name, + include_newline ? ",\n" : ""); +} + +static guint +count_args (GDBusArgInfo **args) +{ + guint n; + n = 0; + if (args == NULL) + goto out; + while (args[n] != NULL) + n++; + out: + return n; +} + +static void +dump_method (const GDBusMethodInfo *o, + guint indent) +{ + guint n; + guint m; + guint name_len; + guint total_num_args; + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent, FALSE); + + g_print ("%*s%s(", indent, "", o->name); + name_len = strlen (o->name); + total_num_args = count_args (o->in_args) + count_args (o->out_args); + for (n = 0, m = 0; o->in_args != NULL && o->in_args[n] != NULL; n++, m++) + { + gboolean ignore_indent = (m == 0); + gboolean include_newline = (m != total_num_args - 1); + + dump_arg (o->in_args[n], + indent + name_len + 1, + "in ", + ignore_indent, + include_newline); + } + for (n = 0; o->out_args != NULL && o->out_args[n] != NULL; n++, m++) + { + gboolean ignore_indent = (m == 0); + gboolean include_newline = (m != total_num_args - 1); + dump_arg (o->out_args[n], + indent + name_len + 1, + "out ", + ignore_indent, + include_newline); + } + g_print (");\n"); +} + +static void +dump_signal (const GDBusSignalInfo *o, + guint indent) +{ + guint n; + guint name_len; + guint total_num_args; + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent, FALSE); + + g_print ("%*s%s(", indent, "", o->name); + name_len = strlen (o->name); + total_num_args = count_args (o->args); + for (n = 0; o->args != NULL && o->args[n] != NULL; n++) + { + gboolean ignore_indent = (n == 0); + gboolean include_newline = (n != total_num_args - 1); + dump_arg (o->args[n], + indent + name_len + 1, + "", + ignore_indent, + include_newline); + } + g_print (");\n"); +} + +static void +dump_property (const GDBusPropertyInfo *o, + guint indent, + GVariant *value) +{ + const gchar *access; + guint n; + + if (o->flags == G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + access = "readonly"; + else if (o->flags == G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE) + access = "writeonly"; + else if (o->flags == (G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE)) + access = "readwrite"; + else + g_assert_not_reached (); + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent, FALSE); + + if (value != NULL) + { + gchar *s = g_variant_print (value, FALSE); + g_print ("%*s%s %s %s = %s;\n", indent, "", access, o->signature, o->name, s); + g_free (s); + } + else + { + g_print ("%*s%s %s %s;\n", indent, "", access, o->signature, o->name); + } +} + +static void +dump_interface (GDBusConnection *c, + const gchar *name, + const GDBusInterfaceInfo *o, + guint indent, + const gchar *object_path) +{ + guint n; + GHashTable *properties; + + properties = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_variant_unref); + + /* Try to get properties */ + if (c != NULL && name != NULL && object_path != NULL && o->properties != NULL) + { + GVariant *result; + result = g_dbus_connection_call_sync (c, + name, + object_path, + "org.freedesktop.DBus.Properties", + "GetAll", + g_variant_new ("(s)", o->name), + NULL, + G_DBUS_CALL_FLAGS_NONE, + 3000, + NULL, + NULL); + if (result != NULL) + { + if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(a{sv})"))) + { + GVariantIter *iter; + GVariant *item; + g_variant_get (result, + "(a{sv})", + &iter); + while ((item = g_variant_iter_next_value (iter))) + { + gchar *key; + GVariant *value; + g_variant_get (item, + "{sv}", + &key, + &value); + + g_hash_table_insert (properties, key, g_variant_ref (value)); + } + } + g_variant_unref (result); + } + else + { + guint n; + for (n = 0; o->properties != NULL && o->properties[n] != NULL; n++) + { + result = g_dbus_connection_call_sync (c, + name, + object_path, + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new ("(ss)", o->name, o->properties[n]->name), + G_VARIANT_TYPE ("(v)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, + NULL, + NULL); + if (result != NULL) + { + GVariant *property_value; + g_variant_get (result, + "(v)", + &property_value); + g_hash_table_insert (properties, + g_strdup (o->properties[n]->name), + g_variant_ref (property_value)); + g_variant_unref (result); + } + } + } + } + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent, FALSE); + + g_print ("%*sinterface %s {\n", indent, "", o->name); + if (o->methods != NULL && !opt_introspect_only_properties) + { + g_print ("%*s methods:\n", indent, ""); + for (n = 0; o->methods[n] != NULL; n++) + dump_method (o->methods[n], indent + 4); + } + if (o->signals != NULL && !opt_introspect_only_properties) + { + g_print ("%*s signals:\n", indent, ""); + for (n = 0; o->signals[n] != NULL; n++) + dump_signal (o->signals[n], indent + 4); + } + if (o->properties != NULL) + { + g_print ("%*s properties:\n", indent, ""); + for (n = 0; o->properties[n] != NULL; n++) + { + dump_property (o->properties[n], + indent + 4, + g_hash_table_lookup (properties, (o->properties[n])->name)); + } + } + g_print ("%*s};\n", + indent, ""); + + g_hash_table_unref (properties); +} + +static gboolean +introspect_do (GDBusConnection *c, + const gchar *object_path, + guint indent); + +static void +dump_node (GDBusConnection *c, + const gchar *name, + const GDBusNodeInfo *o, + guint indent, + const gchar *object_path, + gboolean recurse) +{ + guint n; + const gchar *object_path_to_print; + + object_path_to_print = object_path; + if (o->path != NULL) + object_path_to_print = o->path; + + for (n = 0; o->annotations != NULL && o->annotations[n] != NULL; n++) + dump_annotation (o->annotations[n], indent, FALSE); + + g_print ("%*snode %s", indent, "", object_path_to_print != NULL ? object_path_to_print : "(not set)"); + if (o->interfaces != NULL || o->nodes != NULL) + { + g_print (" {\n"); + for (n = 0; o->interfaces != NULL && o->interfaces[n] != NULL; n++) + { + if (opt_introspect_only_properties) + { + if (o->interfaces[n]->properties != NULL && o->interfaces[n]->properties[0] != NULL) + dump_interface (c, name, o->interfaces[n], indent + 2, object_path); + } + else + { + dump_interface (c, name, o->interfaces[n], indent + 2, object_path); + } + } + for (n = 0; o->nodes != NULL && o->nodes[n] != NULL; n++) + { + if (recurse) + { + gchar *child_path; + if (g_variant_is_object_path (o->nodes[n]->path)) + { + child_path = g_strdup (o->nodes[n]->path); + /* avoid infinite loops */ + if (g_str_has_prefix (child_path, object_path)) + { + introspect_do (c, child_path, indent + 2); + } + else + { + g_print ("Skipping path %s that is not enclosed by parent %s\n", + child_path, object_path); + } + } + else + { + if (g_strcmp0 (object_path, "/") == 0) + child_path = g_strdup_printf ("/%s", o->nodes[n]->path); + else + child_path = g_strdup_printf ("%s/%s", object_path, o->nodes[n]->path); + introspect_do (c, child_path, indent + 2); + } + g_free (child_path); + } + else + { + dump_node (NULL, NULL, o->nodes[n], indent + 2, NULL, recurse); + } + } + g_print ("%*s};\n", + indent, ""); + } + else + { + g_print ("\n"); + } +} + +static const GOptionEntry introspect_entries[] = +{ + { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_introspect_dest, N_("Destination name to introspect"), NULL}, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_introspect_object_path, N_("Object path to introspect"), NULL}, + { "xml", 'x', 0, G_OPTION_ARG_NONE, &opt_introspect_xml, N_("Print XML"), NULL}, + { "recurse", 'r', 0, G_OPTION_ARG_NONE, &opt_introspect_recurse, N_("Introspect children"), NULL}, + { "only-properties", 'p', 0, G_OPTION_ARG_NONE, &opt_introspect_only_properties, N_("Only print properties"), NULL}, + { NULL } +}; + +static gboolean +introspect_do (GDBusConnection *c, + const gchar *object_path, + guint indent) +{ + GError *error; + GVariant *result; + GDBusNodeInfo *node; + gboolean ret; + const gchar *xml_data; + + ret = FALSE; + node = NULL; + result = NULL; + + error = NULL; + result = g_dbus_connection_call_sync (c, + opt_introspect_dest, + object_path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + 3000, /* 3 sec */ + NULL, + &error); + if (result == NULL) + { + g_printerr (_("Error: %s\n"), error->message); + g_error_free (error); + goto out; + } + g_variant_get (result, "(&s)", &xml_data); + + if (opt_introspect_xml) + { + g_print ("%s", xml_data); + } + else + { + error = NULL; + node = g_dbus_node_info_new_for_xml (xml_data, &error); + if (node == NULL) + { + g_printerr (_("Error parsing introspection XML: %s\n"), error->message); + g_error_free (error); + goto out; + } + + dump_node (c, opt_introspect_dest, node, indent, object_path, opt_introspect_recurse); + } + + ret = TRUE; + + out: + if (node != NULL) + g_dbus_node_info_unref (node); + if (result != NULL) + g_variant_unref (result); + return ret; +} + +static gboolean +handle_introspect (gint *argc, + gchar **argv[], + gboolean request_completion, + const gchar *completion_cur, + const gchar *completion_prev) +{ + gint ret; + GOptionContext *o; + gchar *s; + GError *error; + GDBusConnection *c; + gboolean complete_names; + gboolean complete_paths; + + ret = FALSE; + c = NULL; + + modify_argv0_for_command (argc, argv, "introspect"); + + o = g_option_context_new (NULL); + if (request_completion) + g_option_context_set_ignore_unknown_options (o, TRUE); + g_option_context_set_help_enabled (o, FALSE); + g_option_context_set_summary (o, _("Introspect a remote object.")); + g_option_context_add_main_entries (o, introspect_entries, GETTEXT_PACKAGE); + g_option_context_add_group (o, connection_get_group ()); + + complete_names = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--dest") == 0) + { + complete_names = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + complete_paths = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--object-path") == 0) + { + complete_paths = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + if (!g_option_context_parse (o, argc, argv, NULL)) + { + if (!request_completion) + { + s = g_option_context_get_help (o, FALSE, NULL); + g_printerr ("%s", s); + g_free (s); + goto out; + } + } + + error = NULL; + c = connection_get_dbus_connection (&error); + if (c == NULL) + { + if (request_completion) + { + if (g_strcmp0 (completion_prev, "--address") == 0) + { + g_print ("unix:\n" + "tcp:\n" + "nonce-tcp:\n"); + } + else + { + g_print ("--system \n--session \n--address \n"); + } + } + else + { + g_printerr (_("Error connecting: %s\n"), error->message); + g_error_free (error); + } + goto out; + } + + if (g_dbus_connection_get_unique_name (c) != NULL) + { + if (complete_names) + { + print_names (c, FALSE); + goto out; + } + /* this only makes sense on message bus connections */ + if (opt_introspect_dest == NULL) + { + if (request_completion) + g_print ("--dest \n"); + else + g_printerr (_("Error: Destination is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--dest", completion_prev) == 0) + { + print_names (c, g_str_has_prefix (opt_introspect_dest, ":")); + goto out; + } + } + if (complete_paths) + { + print_paths (c, opt_introspect_dest, "/"); + goto out; + } + if (opt_introspect_object_path == NULL) + { + if (request_completion) + g_print ("--object-path \n"); + else + g_printerr (_("Error: Object path is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--object-path", completion_prev) == 0) + { + gchar *p; + s = g_strdup (opt_introspect_object_path); + p = strrchr (s, '/'); + if (p != NULL) + { + if (p == s) + p++; + *p = '\0'; + } + print_paths (c, opt_introspect_dest, s); + g_free (s); + goto out; + } + if (!request_completion && !g_variant_is_object_path (opt_introspect_object_path)) + { + g_printerr (_("Error: %s is not a valid object path\n"), opt_introspect_object_path); + goto out; + } + + if (request_completion && opt_introspect_object_path != NULL && !opt_introspect_recurse) + { + g_print ("--recurse \n"); + } + + if (request_completion && opt_introspect_object_path != NULL && !opt_introspect_only_properties) + { + g_print ("--only-properties \n"); + } + + /* All done with completion now */ + if (request_completion) + goto out; + + if (!introspect_do (c, opt_introspect_object_path, 0)) + goto out; + + ret = TRUE; + + out: + if (c != NULL) + g_object_unref (c); + g_option_context_free (o); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar *opt_monitor_dest = NULL; +static gchar *opt_monitor_object_path = NULL; + +static guint monitor_filter_id = 0; + +static void +monitor_signal_cb (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + gchar *s; + s = g_variant_print (parameters, TRUE); + g_print ("%s: %s.%s %s\n", + object_path, + interface_name, + signal_name, + s); + g_free (s); +} + +static void +monitor_on_name_appeared (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + g_print ("The name %s is owned by %s\n", name, name_owner); + g_assert (monitor_filter_id == 0); + monitor_filter_id = g_dbus_connection_signal_subscribe (connection, + name_owner, + NULL, /* any interface */ + NULL, /* any member */ + opt_monitor_object_path, + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + monitor_signal_cb, + NULL, /* user_data */ + NULL); /* user_data destroy notify */ +} + +static void +monitor_on_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("The name %s does not have an owner\n", name); + + if (monitor_filter_id != 0) + { + g_dbus_connection_signal_unsubscribe (connection, monitor_filter_id); + monitor_filter_id = 0; + } +} + +static const GOptionEntry monitor_entries[] = +{ + { "dest", 'd', 0, G_OPTION_ARG_STRING, &opt_monitor_dest, N_("Destination name to monitor"), NULL}, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_monitor_object_path, N_("Object path to monitor"), NULL}, + { NULL } +}; + +static gboolean +handle_monitor (gint *argc, + gchar **argv[], + gboolean request_completion, + const gchar *completion_cur, + const gchar *completion_prev) +{ + gint ret; + GOptionContext *o; + gchar *s; + GError *error; + GDBusConnection *c; + GVariant *result; + GDBusNodeInfo *node; + gboolean complete_names; + gboolean complete_paths; + GMainLoop *loop; + + ret = FALSE; + c = NULL; + node = NULL; + result = NULL; + + modify_argv0_for_command (argc, argv, "monitor"); + + o = g_option_context_new (NULL); + if (request_completion) + g_option_context_set_ignore_unknown_options (o, TRUE); + g_option_context_set_help_enabled (o, FALSE); + g_option_context_set_summary (o, _("Monitor a remote object.")); + g_option_context_add_main_entries (o, monitor_entries, GETTEXT_PACKAGE); + g_option_context_add_group (o, connection_get_group ()); + + complete_names = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--dest") == 0) + { + complete_names = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + complete_paths = FALSE; + if (request_completion && *argc > 1 && g_strcmp0 ((*argv)[(*argc)-1], "--object-path") == 0) + { + complete_paths = TRUE; + remove_arg ((*argc) - 1, argc, argv); + } + + if (!g_option_context_parse (o, argc, argv, NULL)) + { + if (!request_completion) + { + s = g_option_context_get_help (o, FALSE, NULL); + g_printerr ("%s", s); + g_free (s); + goto out; + } + } + + error = NULL; + c = connection_get_dbus_connection (&error); + if (c == NULL) + { + if (request_completion) + { + if (g_strcmp0 (completion_prev, "--address") == 0) + { + g_print ("unix:\n" + "tcp:\n" + "nonce-tcp:\n"); + } + else + { + g_print ("--system \n--session \n--address \n"); + } + } + else + { + g_printerr (_("Error connecting: %s\n"), error->message); + g_error_free (error); + } + goto out; + } + + if (g_dbus_connection_get_unique_name (c) != NULL) + { + if (complete_names) + { + print_names (c, FALSE); + goto out; + } + /* this only makes sense on message bus connections */ + if (opt_monitor_dest == NULL) + { + if (request_completion) + g_print ("--dest \n"); + else + g_printerr (_("Error: Destination is not specified\n")); + goto out; + } + if (request_completion && g_strcmp0 ("--dest", completion_prev) == 0) + { + print_names (c, g_str_has_prefix (opt_monitor_dest, ":")); + goto out; + } + } + if (complete_paths) + { + print_paths (c, opt_monitor_dest, "/"); + goto out; + } + if (opt_monitor_object_path == NULL) + { + if (request_completion) + { + g_print ("--object-path \n"); + goto out; + } + /* it's fine to not have an object path */ + } + if (request_completion && g_strcmp0 ("--object-path", completion_prev) == 0) + { + gchar *p; + s = g_strdup (opt_monitor_object_path); + p = strrchr (s, '/'); + if (p != NULL) + { + if (p == s) + p++; + *p = '\0'; + } + print_paths (c, opt_monitor_dest, s); + g_free (s); + goto out; + } + if (!request_completion && (opt_monitor_object_path != NULL && !g_variant_is_object_path (opt_monitor_object_path))) + { + g_printerr (_("Error: %s is not a valid object path\n"), opt_monitor_object_path); + goto out; + } + + /* All done with completion now */ + if (request_completion) + goto out; + + if (opt_monitor_object_path != NULL) + g_print ("Monitoring signals on object %s owned by %s\n", opt_monitor_object_path, opt_monitor_dest); + else + g_print ("Monitoring signals from all objects owned by %s\n", opt_monitor_dest); + + loop = g_main_loop_new (NULL, FALSE); + g_bus_watch_name_on_connection (c, + opt_monitor_dest, + G_BUS_NAME_WATCHER_FLAGS_AUTO_START, + monitor_on_name_appeared, + monitor_on_name_vanished, + NULL, + NULL); + + g_main_loop_run (loop); + g_main_loop_unref (loop); + + ret = TRUE; + + out: + if (node != NULL) + g_dbus_node_info_unref (node); + if (result != NULL) + g_variant_unref (result); + if (c != NULL) + g_object_unref (c); + g_option_context_free (o); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +pick_word_at (const gchar *s, + gint cursor, + gint *out_word_begins_at) +{ + gint begin; + gint end; + + if (s[0] == '\0') + { + if (out_word_begins_at != NULL) + *out_word_begins_at = -1; + return NULL; + } + + if (g_ascii_isspace (s[cursor]) && ((cursor > 0 && g_ascii_isspace(s[cursor-1])) || cursor == 0)) + { + if (out_word_begins_at != NULL) + *out_word_begins_at = cursor; + return g_strdup (""); + } + + while (!g_ascii_isspace (s[cursor - 1]) && cursor > 0) + cursor--; + begin = cursor; + + end = begin; + while (!g_ascii_isspace (s[end]) && s[end] != '\0') + end++; + + if (out_word_begins_at != NULL) + *out_word_begins_at = begin; + + return g_strndup (s + begin, end - begin); +} + +gint +main (gint argc, gchar *argv[]) +{ + gint ret; + const gchar *command; + gboolean request_completion; + gchar *completion_cur; + gchar *completion_prev; +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + 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 + + ret = 1; + completion_cur = NULL; + completion_prev = NULL; + + if (argc < 2) + { + usage (&argc, &argv, FALSE); + goto out; + } + + request_completion = FALSE; + + //completion_debug ("---- argc=%d --------------------------------------------------------", argc); + + again: + command = argv[1]; + if (g_strcmp0 (command, "help") == 0) + { + if (request_completion) + { + /* do nothing */ + } + else + { + usage (&argc, &argv, TRUE); + ret = 0; + } + goto out; + } + else if (g_strcmp0 (command, "emit") == 0) + { + if (handle_emit (&argc, + &argv, + request_completion, + completion_cur, + completion_prev)) + ret = 0; + goto out; + } + else if (g_strcmp0 (command, "call") == 0) + { + if (handle_call (&argc, + &argv, + request_completion, + completion_cur, + completion_prev)) + ret = 0; + goto out; + } + else if (g_strcmp0 (command, "introspect") == 0) + { + if (handle_introspect (&argc, + &argv, + request_completion, + completion_cur, + completion_prev)) + ret = 0; + goto out; + } + else if (g_strcmp0 (command, "monitor") == 0) + { + if (handle_monitor (&argc, + &argv, + request_completion, + completion_cur, + completion_prev)) + ret = 0; + goto out; + } + else if (g_strcmp0 (command, "complete") == 0 && argc == 4 && !request_completion) + { + const gchar *completion_line; + gchar **completion_argv; + gint completion_argc; + gint completion_point; + gchar *endp; + gint cur_begin; + + request_completion = TRUE; + + completion_line = argv[2]; + completion_point = strtol (argv[3], &endp, 10); + if (endp == argv[3] || *endp != '\0') + goto out; + +#if 0 + completion_debug ("completion_point=%d", completion_point); + completion_debug ("----"); + completion_debug (" 0123456789012345678901234567890123456789012345678901234567890123456789"); + completion_debug ("`%s'", completion_line); + completion_debug (" %*s^", + completion_point, ""); + completion_debug ("----"); +#endif + + if (!g_shell_parse_argv (completion_line, + &completion_argc, + &completion_argv, + NULL)) + { + /* it's very possible the command line can't be parsed (for + * example, missing quotes etc) - in that case, we just + * don't autocomplete at all + */ + goto out; + } + + /* compute cur and prev */ + completion_prev = NULL; + completion_cur = pick_word_at (completion_line, completion_point, &cur_begin); + if (cur_begin > 0) + { + gint prev_end; + for (prev_end = cur_begin - 1; prev_end >= 0; prev_end--) + { + if (!g_ascii_isspace (completion_line[prev_end])) + { + completion_prev = pick_word_at (completion_line, prev_end, NULL); + break; + } + } + } +#if 0 + completion_debug (" cur=`%s'", completion_cur); + completion_debug ("prev=`%s'", completion_prev); +#endif + + argc = completion_argc; + argv = completion_argv; + + ret = 0; + + goto again; + } + else + { + if (request_completion) + { + g_print ("help \nemit \ncall \nintrospect \nmonitor \n"); + ret = 0; + goto out; + } + else + { + g_printerr ("Unknown command `%s'\n", command); + usage (&argc, &argv, FALSE); + goto out; + } + } + + out: + g_free (completion_cur); + g_free (completion_prev); + return ret; +} diff --git a/gio/gdbusactiongroup-private.h b/gio/gdbusactiongroup-private.h new file mode 100644 index 0000000..8c42b4d --- /dev/null +++ b/gio/gdbusactiongroup-private.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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_DBUS_ACTION_GROUP_PRIVATE_H__ +#define __G_DBUS_ACTION_GROUP_PRIVATE_H__ + +#include "gdbusactiongroup.h" + +G_BEGIN_DECLS + +gboolean +g_dbus_action_group_sync (GDBusActionGroup *group, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif diff --git a/gio/gdbusactiongroup.c b/gio/gdbusactiongroup.c new file mode 100644 index 0000000..a3deb04 --- /dev/null +++ b/gio/gdbusactiongroup.c @@ -0,0 +1,541 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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 + */ + +#include "config.h" + +#include "gdbusactiongroup-private.h" + +#include "gremoteactiongroup.h" +#include "gdbusconnection.h" +#include "gactiongroup.h" + +/** + * SECTION:gdbusactiongroup + * @title: GDBusActionGroup + * @short_description: A D-Bus GActionGroup implementation + * @see_also: GActionGroup exporter + * + * #GDBusActionGroup is an implementation of the #GActionGroup + * interface that can be used as a proxy for an action group + * that is exported over D-Bus with g_dbus_connection_export_action_group(). + */ + +struct _GDBusActionGroup +{ + GObject parent_instance; + + GDBusConnection *connection; + gchar *bus_name; + gchar *object_path; + guint subscription_id; + GHashTable *actions; + + /* The 'strict' flag indicates that the non-existence of at least one + * action has potentially been observed through the API. This means + * that we should always emit 'action-added' signals for all new + * actions. + * + * The user can observe the non-existence of an action by listing the + * actions or by performing a query (such as parameter type) on a + * non-existent action. + * + * If the user has no way of knowing that a given action didn't + * already exist then we can skip emitting 'action-added' signals + * since they have no way of knowing that it wasn't there from the + * start. + */ + gboolean strict; +}; + +typedef GObjectClass GDBusActionGroupClass; + +typedef struct +{ + gchar *name; + GVariantType *parameter_type; + gboolean enabled; + GVariant *state; +} ActionInfo; + +static void +action_info_free (gpointer user_data) +{ + ActionInfo *info = user_data; + + g_free (info->name); + + if (info->state) + g_variant_unref (info->state); + + if (info->parameter_type) + g_variant_type_free (info->parameter_type); + + g_slice_free (ActionInfo, info); +} + +static ActionInfo * +action_info_new_from_iter (GVariantIter *iter) +{ + const gchar *param_str; + ActionInfo *info; + gboolean enabled; + GVariant *state; + gchar *name; + + if (!g_variant_iter_next (iter, "{s(b&g@av)}", &name, + &enabled, ¶m_str, &state)) + return NULL; + + info = g_slice_new (ActionInfo); + info->name = name; + info->enabled = enabled; + + if (g_variant_n_children (state)) + g_variant_get_child (state, 0, "v", &info->state); + else + info->state = NULL; + g_variant_unref (state); + + if (param_str[0]) + info->parameter_type = g_variant_type_copy ((GVariantType *) param_str); + else + info->parameter_type = NULL; + + return info; +} + +static void g_dbus_action_group_remote_iface_init (GRemoteActionGroupInterface *iface); +static void g_dbus_action_group_iface_init (GActionGroupInterface *iface); +G_DEFINE_TYPE_WITH_CODE (GDBusActionGroup, g_dbus_action_group, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_dbus_action_group_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_REMOTE_ACTION_GROUP, g_dbus_action_group_remote_iface_init)) + +static void +g_dbus_action_group_changed (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GDBusActionGroup *group = user_data; + GActionGroup *g_group = user_data; + + /* make sure that we've been fully initialised */ + if (group->actions == NULL) + return; + + if (g_str_equal (signal_name, "Changed") && + g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(asa{sb}a{sv}a{s(bgav)})"))) + { + /* Removes */ + { + GVariantIter *iter; + const gchar *name; + + g_variant_get_child (parameters, 0, "as", &iter); + while (g_variant_iter_next (iter, "&s", &name)) + { + if (g_hash_table_lookup (group->actions, name)) + { + g_hash_table_remove (group->actions, name); + g_action_group_action_removed (g_group, name); + } + } + g_variant_iter_free (iter); + } + + /* Enable changes */ + { + GVariantIter *iter; + const gchar *name; + gboolean enabled; + + g_variant_get_child (parameters, 1, "a{sb}", &iter); + while (g_variant_iter_next (iter, "{&sb}", &name, &enabled)) + { + ActionInfo *info; + + info = g_hash_table_lookup (group->actions, name); + + if (info && info->enabled != enabled) + { + info->enabled = enabled; + g_action_group_action_enabled_changed (g_group, name, enabled); + } + } + g_variant_iter_free (iter); + } + + /* State changes */ + { + GVariantIter *iter; + const gchar *name; + GVariant *state; + + g_variant_get_child (parameters, 2, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &name, &state)) + { + ActionInfo *info; + + info = g_hash_table_lookup (group->actions, name); + + if (info && info->state && !g_variant_equal (state, info->state) && + g_variant_is_of_type (state, g_variant_get_type (info->state))) + { + g_variant_unref (info->state); + info->state = g_variant_ref (state); + + g_action_group_action_state_changed (g_group, name, state); + } + + g_variant_unref (state); + } + g_variant_iter_free (iter); + } + + /* Additions */ + { + GVariantIter *iter; + ActionInfo *info; + + g_variant_get_child (parameters, 3, "a{s(bgav)}", &iter); + while ((info = action_info_new_from_iter (iter))) + { + if (!g_hash_table_lookup (group->actions, info->name)) + { + g_hash_table_insert (group->actions, info->name, info); + + if (group->strict) + g_action_group_action_added (g_group, info->name); + } + else + action_info_free (info); + } + g_variant_iter_free (iter); + } + } +} + + +static void +g_dbus_action_group_describe_all_done (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GDBusActionGroup *group= user_data; + GVariant *reply; + + g_assert (group->actions == NULL); + group->actions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, action_info_free); + + g_assert (group->connection == (gpointer) source); + reply = g_dbus_connection_call_finish (group->connection, result, NULL); + + if (reply != NULL) + { + GVariantIter *iter; + ActionInfo *action; + + g_variant_get (reply, "(a{s(bgav)})", &iter); + while ((action = action_info_new_from_iter (iter))) + { + g_hash_table_insert (group->actions, action->name, action); + + if (group->strict) + g_action_group_action_added (G_ACTION_GROUP (group), action->name); + } + g_variant_iter_free (iter); + g_variant_unref (reply); + } + + g_object_unref (group); +} + + +static void +g_dbus_action_group_async_init (GDBusActionGroup *group) +{ + if (group->subscription_id != 0) + return; + + group->subscription_id = + g_dbus_connection_signal_subscribe (group->connection, group->bus_name, "org.gtk.Actions", "Changed", group->object_path, + NULL, G_DBUS_SIGNAL_FLAGS_NONE, g_dbus_action_group_changed, group, NULL); + + g_dbus_connection_call (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", "DescribeAll", NULL, + G_VARIANT_TYPE ("(a{s(bgav)})"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, + g_dbus_action_group_describe_all_done, g_object_ref (group)); +} + +static gchar ** +g_dbus_action_group_list_actions (GActionGroup *g_group) +{ + GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group); + gchar **keys; + + if (group->actions != NULL) + { + GHashTableIter iter; + gint n, i = 0; + gpointer key; + + n = g_hash_table_size (group->actions); + keys = g_new (gchar *, n + 1); + + g_hash_table_iter_init (&iter, group->actions); + while (g_hash_table_iter_next (&iter, &key, NULL)) + keys[i++] = g_strdup (key); + g_assert_cmpint (i, ==, n); + keys[n] = NULL; + } + else + { + g_dbus_action_group_async_init (group); + keys = g_new0 (gchar *, 1); + } + + group->strict = TRUE; + + return keys; +} + +static gboolean +g_dbus_action_group_query_action (GActionGroup *g_group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group); + ActionInfo *info; + + if (group->actions != NULL) + { + info = g_hash_table_lookup (group->actions, action_name); + + if (info == NULL) + { + group->strict = TRUE; + return FALSE; + } + + if (enabled) + *enabled = info->enabled; + + if (parameter_type) + *parameter_type = info->parameter_type; + + if (state_type) + *state_type = info->state ? g_variant_get_type (info->state) : NULL; + + if (state_hint) + *state_hint = NULL; + + if (state) + *state = info->state ? g_variant_ref (info->state) : NULL; + + return TRUE; + } + else + { + g_dbus_action_group_async_init (group); + group->strict = TRUE; + + return FALSE; + } +} + +static void +g_dbus_action_group_activate_action_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *parameter, + GVariant *platform_data) +{ + GDBusActionGroup *group = G_DBUS_ACTION_GROUP (remote); + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("av")); + + if (parameter) + g_variant_builder_add (&builder, "v", parameter); + + g_dbus_connection_call (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", "Activate", + g_variant_new ("(sav@a{sv})", action_name, &builder, platform_data), + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); +} + +static void +g_dbus_action_group_change_action_state_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *value, + GVariant *platform_data) +{ + GDBusActionGroup *group = G_DBUS_ACTION_GROUP (remote); + + g_dbus_connection_call (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", "SetState", + g_variant_new ("(sv@a{sv})", action_name, value, platform_data), + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL); +} + +static void +g_dbus_action_group_change_state (GActionGroup *group, + const gchar *action_name, + GVariant *value) +{ + g_dbus_action_group_change_action_state_full (G_REMOTE_ACTION_GROUP (group), + action_name, value, g_variant_new ("a{sv}", NULL)); +} + +static void +g_dbus_action_group_activate (GActionGroup *group, + const gchar *action_name, + GVariant *parameter) +{ + g_dbus_action_group_activate_action_full (G_REMOTE_ACTION_GROUP (group), + action_name, parameter, g_variant_new ("a{sv}", NULL)); +} + +static void +g_dbus_action_group_finalize (GObject *object) +{ + GDBusActionGroup *group = G_DBUS_ACTION_GROUP (object); + + if (group->subscription_id) + g_dbus_connection_signal_unsubscribe (group->connection, group->subscription_id); + + if (group->actions) + g_hash_table_unref (group->actions); + + g_object_unref (group->connection); + g_free (group->object_path); + g_free (group->bus_name); + + G_OBJECT_CLASS (g_dbus_action_group_parent_class) + ->finalize (object); +} + +static void +g_dbus_action_group_init (GDBusActionGroup *group) +{ +} + +static void +g_dbus_action_group_class_init (GDBusActionGroupClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_dbus_action_group_finalize; +} + +static void +g_dbus_action_group_remote_iface_init (GRemoteActionGroupInterface *iface) +{ + iface->activate_action_full = g_dbus_action_group_activate_action_full; + iface->change_action_state_full = g_dbus_action_group_change_action_state_full; +} + +static void +g_dbus_action_group_iface_init (GActionGroupInterface *iface) +{ + iface->list_actions = g_dbus_action_group_list_actions; + iface->query_action = g_dbus_action_group_query_action; + iface->change_action_state = g_dbus_action_group_change_state; + iface->activate_action = g_dbus_action_group_activate; +} + +/** + * g_dbus_action_group_get: + * @connection: A #GDBusConnection + * @bus_name: the bus name which exports the action group + * @object_path: the object path at which the action group is exported + * + * Obtains a #GDBusActionGroup for the action group which is exported at + * the given @bus_name and @object_path. + * + * The thread default main context is taken at the time of this call. + * All signals on the menu model (and any linked models) are reported + * with respect to this context. All calls on the returned menu model + * (and linked models) must also originate from this same context, with + * the thread default main context unchanged. + * + * This call is non-blocking. The returned action group may or may not + * already be filled in. The correct thing to do is connect the signals + * for the action group to monitor for changes and then to call + * g_action_group_list_actions() to get the initial list. + * + * Returns: (transfer full): a #GDBusActionGroup + * + * Since: 2.32 + */ +GDBusActionGroup * +g_dbus_action_group_get (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path) +{ + GDBusActionGroup *group; + + group = g_object_new (G_TYPE_DBUS_ACTION_GROUP, NULL); + group->connection = g_object_ref (connection); + group->bus_name = g_strdup (bus_name); + group->object_path = g_strdup (object_path); + + return group; +} + +gboolean +g_dbus_action_group_sync (GDBusActionGroup *group, + GCancellable *cancellable, + GError **error) +{ + GVariant *reply; + + g_assert (group->subscription_id == 0); + + group->subscription_id = + g_dbus_connection_signal_subscribe (group->connection, group->bus_name, "org.gtk.Actions", "Changed", group->object_path, + NULL, G_DBUS_SIGNAL_FLAGS_NONE, g_dbus_action_group_changed, group, NULL); + + reply = g_dbus_connection_call_sync (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", + "DescribeAll", NULL, G_VARIANT_TYPE ("(a{s(bgav)})"), + G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error); + + if (reply != NULL) + { + GVariantIter *iter; + ActionInfo *action; + + g_assert (group->actions == NULL); + group->actions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, action_info_free); + + g_variant_get (reply, "(a{s(bgav)})", &iter); + while ((action = action_info_new_from_iter (iter))) + g_hash_table_insert (group->actions, action->name, action); + g_variant_iter_free (iter); + g_variant_unref (reply); + } + + return reply != NULL; +} diff --git a/gio/gdbusactiongroup.h b/gio/gdbusactiongroup.h new file mode 100644 index 0000000..4d8e168 --- /dev/null +++ b/gio/gdbusactiongroup.h @@ -0,0 +1,56 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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_DBUS_ACTION_GROUP_H__ +#define __G_DBUS_ACTION_GROUP_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include "giotypes.h" + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_ACTION_GROUP (g_dbus_action_group_get_type ()) +#define G_DBUS_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_DBUS_ACTION_GROUP, GDBusActionGroup)) +#define G_DBUS_ACTION_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_DBUS_ACTION_GROUP, GDBusActionGroupClass)) +#define G_IS_DBUS_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_DBUS_ACTION_GROUP)) +#define G_IS_DBUS_ACTION_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_DBUS_ACTION_GROUP)) +#define G_DBUS_ACTION_GROUP_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_DBUS_ACTION_GROUP, GDBusActionGroupClass)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_action_group_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +GDBusActionGroup * g_dbus_action_group_get (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path); + +G_END_DECLS + +#endif /* __G_DBUS_ACTION_GROUP_H__ */ diff --git a/gio/gdbusaddress.c b/gio/gdbusaddress.c new file mode 100644 index 0000000..cc9703c --- /dev/null +++ b/gio/gdbusaddress.c @@ -0,0 +1,1635 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "gioerror.h" +#include "gdbusutils.h" +#include "gdbusaddress.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" +#include "gnetworkaddress.h" +#include "gsocketclient.h" +#include "giostream.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "glib-private.h" +#include "gdbusprivate.h" +#include "giomodule-priv.h" +#include "gdbusdaemon.h" + +#ifdef G_OS_UNIX +#include +#endif + +#ifdef G_OS_WIN32 +#include +#include +#include +#endif + +#include "glibintl.h" + +/** + * SECTION:gdbusaddress + * @title: D-Bus Addresses + * @short_description: D-Bus connection endpoints + * @include: gio/gio.h + * + * Routines for working with D-Bus addresses. A D-Bus address is a string + * like "unix:tmpdir=/tmp/my-app-name". The exact format of addresses + * is explained in detail in the D-Bus specification. + */ + +static gchar *get_session_address_platform_specific (GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_is_address: + * @string: A string. + * + * Checks if @string is a D-Bus address. + * + * This doesn't check if @string is actually supported by #GDBusServer + * or #GDBusConnection - use g_dbus_is_supported_address() to do more + * checks. + * + * Returns: %TRUE if @string is a valid D-Bus address, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_address (const gchar *string) +{ + guint n; + gchar **a; + gboolean ret; + + ret = FALSE; + + g_return_val_if_fail (string != NULL, FALSE); + + a = g_strsplit (string, ";", 0); + if (a[0] == NULL) + goto out; + + for (n = 0; a[n] != NULL; n++) + { + if (!_g_dbus_address_parse_entry (a[n], + NULL, + NULL, + NULL)) + goto out; + } + + ret = TRUE; + + out: + g_strfreev (a); + return ret; +} + +static gboolean +is_valid_unix (const gchar *address_entry, + GHashTable *key_value_pairs, + GError **error) +{ + gboolean ret; + GList *keys; + GList *l; + const gchar *path; + const gchar *tmpdir; + const gchar *abstract; + + ret = FALSE; + keys = NULL; + path = NULL; + tmpdir = NULL; + abstract = NULL; + + keys = g_hash_table_get_keys (key_value_pairs); + for (l = keys; l != NULL; l = l->next) + { + const gchar *key = l->data; + if (g_strcmp0 (key, "path") == 0) + path = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "tmpdir") == 0) + tmpdir = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "abstract") == 0) + abstract = g_hash_table_lookup (key_value_pairs, key); + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Unsupported key `%s' in address entry `%s'"), + key, + address_entry); + goto out; + } + } + + if (path != NULL) + { + if (tmpdir != NULL || abstract != NULL) + goto meaningless; + } + else if (tmpdir != NULL) + { + if (path != NULL || abstract != NULL) + goto meaningless; + } + else if (abstract != NULL) + { + if (path != NULL || tmpdir != NULL) + goto meaningless; + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)"), + address_entry); + goto out; + } + + + ret= TRUE; + goto out; + + meaningless: + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Meaningless key/value pair combination in address entry `%s'"), + address_entry); + + out: + g_list_free (keys); + + return ret; +} + +static gboolean +is_valid_nonce_tcp (const gchar *address_entry, + GHashTable *key_value_pairs, + GError **error) +{ + gboolean ret; + GList *keys; + GList *l; + const gchar *host; + const gchar *port; + const gchar *family; + const gchar *nonce_file; + gint port_num; + gchar *endp; + + ret = FALSE; + keys = NULL; + host = NULL; + port = NULL; + family = NULL; + nonce_file = NULL; + + keys = g_hash_table_get_keys (key_value_pairs); + for (l = keys; l != NULL; l = l->next) + { + const gchar *key = l->data; + if (g_strcmp0 (key, "host") == 0) + host = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "port") == 0) + port = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "family") == 0) + family = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "noncefile") == 0) + nonce_file = g_hash_table_lookup (key_value_pairs, key); + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Unsupported key `%s' in address entry `%s'"), + key, + address_entry); + goto out; + } + } + + if (port != NULL) + { + port_num = strtol (port, &endp, 10); + if ((*port == '\0' || *endp != '\0') || port_num < 0 || port_num >= 65536) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the port attribute is malformed"), + address_entry); + goto out; + } + } + + if (family != NULL && !(g_strcmp0 (family, "ipv4") == 0 || g_strcmp0 (family, "ipv6") == 0)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the family attribute is malformed"), + address_entry); + goto out; + } + + if (host != NULL) + { + /* TODO: validate host */ + } + + nonce_file = nonce_file; /* To avoid -Wunused-but-set-variable */ + + ret= TRUE; + + out: + g_list_free (keys); + + return ret; +} + +static gboolean +is_valid_tcp (const gchar *address_entry, + GHashTable *key_value_pairs, + GError **error) +{ + gboolean ret; + GList *keys; + GList *l; + const gchar *host; + const gchar *port; + const gchar *family; + gint port_num; + gchar *endp; + + ret = FALSE; + keys = NULL; + host = NULL; + port = NULL; + family = NULL; + + keys = g_hash_table_get_keys (key_value_pairs); + for (l = keys; l != NULL; l = l->next) + { + const gchar *key = l->data; + if (g_strcmp0 (key, "host") == 0) + host = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "port") == 0) + port = g_hash_table_lookup (key_value_pairs, key); + else if (g_strcmp0 (key, "family") == 0) + family = g_hash_table_lookup (key_value_pairs, key); + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Unsupported key `%s' in address entry `%s'"), + key, + address_entry); + goto out; + } + } + + if (port != NULL) + { + port_num = strtol (port, &endp, 10); + if ((*port == '\0' || *endp != '\0') || port_num < 0 || port_num >= 65536) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the port attribute is malformed"), + address_entry); + goto out; + } + } + + if (family != NULL && !(g_strcmp0 (family, "ipv4") == 0 || g_strcmp0 (family, "ipv6") == 0)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the family attribute is malformed"), + address_entry); + goto out; + } + + if (host != NULL) + { + /* TODO: validate host */ + } + + ret= TRUE; + + out: + g_list_free (keys); + + return ret; +} + +/** + * g_dbus_is_supported_address: + * @string: A string. + * @error: Return location for error or %NULL. + * + * Like g_dbus_is_address() but also checks if the library suppors the + * transports in @string and that key/value pairs for each transport + * are valid. + * + * Returns: %TRUE if @string is a valid D-Bus address that is + * supported by this library, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_supported_address (const gchar *string, + GError **error) +{ + guint n; + gchar **a; + gboolean ret; + + ret = FALSE; + + g_return_val_if_fail (string != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + a = g_strsplit (string, ";", 0); + for (n = 0; a[n] != NULL; n++) + { + gchar *transport_name; + GHashTable *key_value_pairs; + gboolean supported; + + if (!_g_dbus_address_parse_entry (a[n], + &transport_name, + &key_value_pairs, + error)) + goto out; + + supported = FALSE; + if (g_strcmp0 (transport_name, "unix") == 0) + supported = is_valid_unix (a[n], key_value_pairs, error); + else if (g_strcmp0 (transport_name, "tcp") == 0) + supported = is_valid_tcp (a[n], key_value_pairs, error); + else if (g_strcmp0 (transport_name, "nonce-tcp") == 0) + supported = is_valid_nonce_tcp (a[n], key_value_pairs, error); + else if (g_strcmp0 (a[n], "autolaunch:") == 0) + supported = TRUE; + + g_free (transport_name); + g_hash_table_unref (key_value_pairs); + + if (!supported) + goto out; + } + + ret = TRUE; + + out: + g_strfreev (a); + + g_assert (ret || (!ret && (error == NULL || *error != NULL))); + + return ret; +} + +gboolean +_g_dbus_address_parse_entry (const gchar *address_entry, + gchar **out_transport_name, + GHashTable **out_key_value_pairs, + GError **error) +{ + gboolean ret; + GHashTable *key_value_pairs; + gchar *transport_name; + gchar **kv_pairs; + const gchar *s; + guint n; + + ret = FALSE; + kv_pairs = NULL; + transport_name = NULL; + key_value_pairs = NULL; + + s = strchr (address_entry, ':'); + if (s == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Address element `%s' does not contain a colon (:)"), + address_entry); + goto out; + } + + transport_name = g_strndup (address_entry, s - address_entry); + key_value_pairs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + kv_pairs = g_strsplit (s + 1, ",", 0); + for (n = 0; kv_pairs != NULL && kv_pairs[n] != NULL; n++) + { + const gchar *kv_pair = kv_pairs[n]; + gchar *key; + gchar *value; + + s = strchr (kv_pair, '='); + if (s == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Key/Value pair %d, `%s', in address element `%s' does not contain an equal sign"), + n, + kv_pair, + address_entry); + goto out; + } + + key = g_uri_unescape_segment (kv_pair, s, NULL); + value = g_uri_unescape_segment (s + 1, kv_pair + strlen (kv_pair), NULL); + if (key == NULL || value == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'"), + n, + kv_pair, + address_entry); + g_free (key); + g_free (value); + goto out; + } + g_hash_table_insert (key_value_pairs, key, value); + } + + ret = TRUE; + +out: + g_strfreev (kv_pairs); + if (ret) + { + if (out_transport_name != NULL) + *out_transport_name = transport_name; + else + g_free (transport_name); + if (out_key_value_pairs != NULL) + *out_key_value_pairs = key_value_pairs; + else if (key_value_pairs != NULL) + g_hash_table_unref (key_value_pairs); + } + else + { + g_free (transport_name); + if (key_value_pairs != NULL) + g_hash_table_unref (key_value_pairs); + } + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GIOStream * +g_dbus_address_try_connect_one (const gchar *address_entry, + gchar **out_guid, + GCancellable *cancellable, + GError **error); + +/* TODO: Declare an extension point called GDBusTransport (or similar) + * and move code below to extensions implementing said extension + * point. That way we can implement a D-Bus transport over X11 without + * making libgio link to libX11... + */ +static GIOStream * +g_dbus_address_connect (const gchar *address_entry, + const gchar *transport_name, + GHashTable *key_value_pairs, + GCancellable *cancellable, + GError **error) +{ + GIOStream *ret; + GSocketConnectable *connectable; + const gchar *nonce_file; + + connectable = NULL; + ret = NULL; + nonce_file = NULL; + + if (FALSE) + { + } +#ifdef G_OS_UNIX + else if (g_strcmp0 (transport_name, "unix") == 0) + { + const gchar *path; + const gchar *abstract; + path = g_hash_table_lookup (key_value_pairs, "path"); + abstract = g_hash_table_lookup (key_value_pairs, "abstract"); + if ((path == NULL && abstract == NULL) || (path != NULL && abstract != NULL)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the unix transport requires exactly one of the " + "keys `path' or `abstract' to be set"), + address_entry); + } + else if (path != NULL) + { + connectable = G_SOCKET_CONNECTABLE (g_unix_socket_address_new (path)); + } + else if (abstract != NULL) + { + connectable = G_SOCKET_CONNECTABLE (g_unix_socket_address_new_with_type (abstract, + -1, + G_UNIX_SOCKET_ADDRESS_ABSTRACT)); + } + else + { + g_assert_not_reached (); + } + } +#endif + else if (g_strcmp0 (transport_name, "tcp") == 0 || g_strcmp0 (transport_name, "nonce-tcp") == 0) + { + const gchar *s; + const gchar *host; + glong port; + gchar *endp; + gboolean is_nonce; + + is_nonce = (g_strcmp0 (transport_name, "nonce-tcp") == 0); + + host = g_hash_table_lookup (key_value_pairs, "host"); + if (host == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the host attribute is missing or malformed"), + address_entry); + goto out; + } + + s = g_hash_table_lookup (key_value_pairs, "port"); + if (s == NULL) + s = "0"; + port = strtol (s, &endp, 10); + if ((*s == '\0' || *endp != '\0') || port < 0 || port >= 65536) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the port attribute is missing or malformed"), + address_entry); + goto out; + } + + + if (is_nonce) + { + nonce_file = g_hash_table_lookup (key_value_pairs, "noncefile"); + if (nonce_file == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error in address `%s' - the noncefile attribute is missing or malformed"), + address_entry); + goto out; + } + } + + /* TODO: deal with family key/value-pair */ + connectable = g_network_address_new (host, port); + } + else if (g_strcmp0 (address_entry, "autolaunch:") == 0) + { + gchar *autolaunch_address; + autolaunch_address = get_session_address_platform_specific (error); + if (autolaunch_address != NULL) + { + ret = g_dbus_address_try_connect_one (autolaunch_address, NULL, cancellable, error); + g_free (autolaunch_address); + goto out; + } + else + { + g_prefix_error (error, _("Error auto-launching: ")); + } + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Unknown or unsupported transport `%s' for address `%s'"), + transport_name, + address_entry); + } + + if (connectable != NULL) + { + GSocketClient *client; + GSocketConnection *connection; + + g_assert (ret == NULL); + client = g_socket_client_new (); + connection = g_socket_client_connect (client, + connectable, + cancellable, + error); + g_object_unref (connectable); + g_object_unref (client); + if (connection == NULL) + goto out; + + ret = G_IO_STREAM (connection); + + if (nonce_file != NULL) + { + gchar nonce_contents[16 + 1]; + size_t num_bytes_read; + FILE *f; + + /* be careful to read only 16 bytes - we also check that the file is only 16 bytes long */ + f = fopen (nonce_file, "rb"); + if (f == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error opening nonce file `%s': %s"), + nonce_file, + g_strerror (errno)); + g_object_unref (ret); + ret = NULL; + goto out; + } + num_bytes_read = fread (nonce_contents, + sizeof (gchar), + 16 + 1, + f); + if (num_bytes_read != 16) + { + if (num_bytes_read == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error reading from nonce file `%s': %s"), + nonce_file, + g_strerror (errno)); + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error reading from nonce file `%s', expected 16 bytes, got %d"), + nonce_file, + (gint) num_bytes_read); + } + g_object_unref (ret); + ret = NULL; + fclose (f); + goto out; + } + fclose (f); + + if (!g_output_stream_write_all (g_io_stream_get_output_stream (ret), + nonce_contents, + 16, + NULL, + cancellable, + error)) + { + g_prefix_error (error, _("Error writing contents of nonce file `%s' to stream:"), nonce_file); + g_object_unref (ret); + ret = NULL; + goto out; + } + } + } + + out: + + return ret; +} + +static GIOStream * +g_dbus_address_try_connect_one (const gchar *address_entry, + gchar **out_guid, + GCancellable *cancellable, + GError **error) +{ + GIOStream *ret; + GHashTable *key_value_pairs; + gchar *transport_name; + const gchar *guid; + + ret = NULL; + transport_name = NULL; + key_value_pairs = NULL; + + if (!_g_dbus_address_parse_entry (address_entry, + &transport_name, + &key_value_pairs, + error)) + goto out; + + ret = g_dbus_address_connect (address_entry, + transport_name, + key_value_pairs, + cancellable, + error); + if (ret == NULL) + goto out; + + guid = g_hash_table_lookup (key_value_pairs, "guid"); + if (guid != NULL && out_guid != NULL) + *out_guid = g_strdup (guid); + +out: + g_free (transport_name); + if (key_value_pairs != NULL) + g_hash_table_unref (key_value_pairs); + return ret; +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + gchar *address; + GIOStream *stream; + gchar *guid; +} GetStreamData; + +static void +get_stream_data_free (GetStreamData *data) +{ + g_free (data->address); + if (data->stream != NULL) + g_object_unref (data->stream); + g_free (data->guid); + g_free (data); +} + +static void +get_stream_thread_func (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GetStreamData *data; + GError *error; + + data = g_simple_async_result_get_op_res_gpointer (res); + + error = NULL; + data->stream = g_dbus_address_get_stream_sync (data->address, + &data->guid, + cancellable, + &error); + if (data->stream == NULL) + g_simple_async_result_take_error (res, error); +} + +/** + * g_dbus_address_get_stream: + * @address: A valid D-Bus address. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: Data to pass to @callback. + * + * Asynchronously connects to an endpoint specified by @address and + * sets up the connection so it is in a state to run the client-side + * of the D-Bus authentication conversation. + * + * When the operation is finished, @callback will be invoked. You can + * then call g_dbus_address_get_stream_finish() to get the result of + * the operation. + * + * This is an asynchronous failable function. See + * g_dbus_address_get_stream_sync() for the synchronous version. + * + * Since: 2.26 + */ +void +g_dbus_address_get_stream (const gchar *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *res; + GetStreamData *data; + + g_return_if_fail (address != NULL); + + res = g_simple_async_result_new (NULL, + callback, + user_data, + g_dbus_address_get_stream); + g_simple_async_result_set_check_cancellable (res, cancellable); + data = g_new0 (GetStreamData, 1); + data->address = g_strdup (address); + g_simple_async_result_set_op_res_gpointer (res, + data, + (GDestroyNotify) get_stream_data_free); + g_simple_async_result_run_in_thread (res, + get_stream_thread_func, + G_PRIORITY_DEFAULT, + cancellable); + g_object_unref (res); +} + +/** + * g_dbus_address_get_stream_finish: + * @res: A #GAsyncResult obtained from the GAsyncReadyCallback passed to g_dbus_address_get_stream(). + * @out_guid: %NULL or return location to store the GUID extracted from @address, if any. + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_address_get_stream(). + * + * Returns: (transfer full): A #GIOStream or %NULL if @error is set. + * + * Since: 2.26 + */ +GIOStream * +g_dbus_address_get_stream_finish (GAsyncResult *res, + gchar **out_guid, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GetStreamData *data; + GIOStream *ret; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_dbus_address_get_stream); + + ret = NULL; + + data = g_simple_async_result_get_op_res_gpointer (simple); + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + ret = g_object_ref (data->stream); + if (out_guid != NULL) + *out_guid = g_strdup (data->guid); + + out: + return ret; +} + +/** + * g_dbus_address_get_stream_sync: + * @address: A valid D-Bus address. + * @out_guid: %NULL or return location to store the GUID extracted from @address, if any. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously connects to an endpoint specified by @address and + * sets up the connection so it is in a state to run the client-side + * of the D-Bus authentication conversation. + * + * This is a synchronous failable function. See + * g_dbus_address_get_stream() for the asynchronous version. + * + * Returns: (transfer full): A #GIOStream or %NULL if @error is set. + * + * Since: 2.26 + */ +GIOStream * +g_dbus_address_get_stream_sync (const gchar *address, + gchar **out_guid, + GCancellable *cancellable, + GError **error) +{ + GIOStream *ret; + gchar **addr_array; + guint n; + GError *last_error; + + g_return_val_if_fail (address != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = NULL; + last_error = NULL; + + addr_array = g_strsplit (address, ";", 0); + if (addr_array != NULL && addr_array[0] == NULL) + { + last_error = g_error_new_literal (G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("The given address is empty")); + goto out; + } + + for (n = 0; addr_array != NULL && addr_array[n] != NULL; n++) + { + const gchar *addr = addr_array[n]; + GError *this_error; + + this_error = NULL; + ret = g_dbus_address_try_connect_one (addr, + out_guid, + cancellable, + &this_error); + if (ret != NULL) + { + goto out; + } + else + { + g_assert (this_error != NULL); + if (last_error != NULL) + g_error_free (last_error); + last_error = this_error; + } + } + + out: + if (ret != NULL) + { + if (last_error != NULL) + g_error_free (last_error); + } + else + { + g_assert (last_error != NULL); + g_propagate_error (error, last_error); + } + + g_strfreev (addr_array); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX +static gchar * +get_session_address_dbus_launch (GError **error) +{ + gchar *ret; + gchar *machine_id; + gchar *command_line; + gchar *launch_stdout; + gchar *launch_stderr; + gint exit_status; + gchar *old_dbus_verbose; + gboolean restore_dbus_verbose; + + ret = NULL; + machine_id = NULL; + command_line = NULL; + launch_stdout = NULL; + launch_stderr = NULL; + restore_dbus_verbose = FALSE; + old_dbus_verbose = NULL; + + /* Don't run binaries as root if we're setuid. */ + if (GLIB_PRIVATE_CALL (g_check_setuid) ()) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Cannot spawn a message bus when setuid")); + goto out; + } + + machine_id = _g_dbus_get_machine_id (error); + if (machine_id == NULL) + { + g_prefix_error (error, _("Cannot spawn a message bus without a machine-id: ")); + goto out; + } + + /* We're using private libdbus facilities here. When everything + * (X11, Mac OS X, Windows) is spec'ed out correctly (not even the + * X11 property is correctly documented right now) we should + * consider using the spec instead of dbus-launch. + * + * --autolaunch=MACHINEID + * This option implies that dbus-launch should scan for a previ‐ + * ously-started session and reuse the values found there. If no + * session is found, it will start a new session. The --exit-with- + * session option is implied if --autolaunch is given. This option + * is for the exclusive use of libdbus, you do not want to use it + * manually. It may change in the future. + */ + + /* TODO: maybe provide a variable for where to look for the dbus-launch binary? */ + command_line = g_strdup_printf ("dbus-launch --autolaunch=%s --binary-syntax --close-stderr", machine_id); + + if (G_UNLIKELY (_g_dbus_debug_address ())) + { + _g_dbus_debug_print_lock (); + g_print ("GDBus-debug:Address: Running `%s' to get bus address (possibly autolaunching)\n", command_line); + old_dbus_verbose = g_strdup (g_getenv ("DBUS_VERBOSE")); + restore_dbus_verbose = TRUE; + g_setenv ("DBUS_VERBOSE", "1", TRUE); + _g_dbus_debug_print_unlock (); + } + + if (!g_spawn_command_line_sync (command_line, + &launch_stdout, + &launch_stderr, + &exit_status, + error)) + { + goto out; + } + + if (!g_spawn_check_exit_status (exit_status, error)) + { + g_prefix_error (error, _("Error spawning command line `%s': "), command_line); + goto out; + } + + /* From the dbus-launch(1) man page: + * + * --binary-syntax Write to stdout a nul-terminated bus address, + * then the bus PID as a binary integer of size sizeof(pid_t), + * then the bus X window ID as a binary integer of size + * sizeof(long). Integers are in the machine's byte order, not + * network byte order or any other canonical byte order. + */ + ret = g_strdup (launch_stdout); + + out: + if (G_UNLIKELY (_g_dbus_debug_address ())) + { + gchar *s; + _g_dbus_debug_print_lock (); + g_print ("GDBus-debug:Address: dbus-launch output:"); + if (launch_stdout != NULL) + { + s = _g_dbus_hexdump (launch_stdout, strlen (launch_stdout) + 1 + sizeof (pid_t) + sizeof (long), 2); + g_print ("\n%s", s); + g_free (s); + } + else + { + g_print (" (none)\n"); + } + g_print ("GDBus-debug:Address: dbus-launch stderr output:"); + if (launch_stderr != NULL) + g_print ("\n%s", launch_stderr); + else + g_print (" (none)\n"); + _g_dbus_debug_print_unlock (); + } + + g_free (machine_id); + g_free (command_line); + g_free (launch_stdout); + g_free (launch_stderr); + if (G_UNLIKELY (restore_dbus_verbose)) + { + if (old_dbus_verbose != NULL) + g_setenv ("DBUS_VERBOSE", old_dbus_verbose, TRUE); + else + g_unsetenv ("DBUS_VERBOSE"); + } + g_free (old_dbus_verbose); + return ret; +} +#endif + +#ifdef G_OS_WIN32 + +#define DBUS_DAEMON_ADDRESS_INFO "DBusDaemonAddressInfo" +#define DBUS_DAEMON_MUTEX "DBusDaemonMutex" +#define UNIQUE_DBUS_INIT_MUTEX "UniqueDBusInitMutex" +#define DBUS_AUTOLAUNCH_MUTEX "DBusAutolaunchMutex" + +static void +release_mutex (HANDLE mutex) +{ + ReleaseMutex (mutex); + CloseHandle (mutex); +} + +static HANDLE +acquire_mutex (const char *mutexname) +{ + HANDLE mutex; + DWORD res; + + mutex = CreateMutexA (NULL, FALSE, mutexname); + if (!mutex) + return 0; + + res = WaitForSingleObject (mutex, INFINITE); + switch (res) + { + case WAIT_ABANDONED: + release_mutex (mutex); + return 0; + case WAIT_FAILED: + case WAIT_TIMEOUT: + return 0; + } + + return mutex; +} + +static gboolean +is_mutex_owned (const char *mutexname) +{ + HANDLE mutex; + gboolean res = FALSE; + + mutex = CreateMutexA (NULL, FALSE, mutexname); + if (WaitForSingleObject (mutex, 10) == WAIT_TIMEOUT) + res = TRUE; + else + ReleaseMutex (mutex); + CloseHandle (mutex); + + return res; +} + +static char * +read_shm (const char *shm_name) +{ + HANDLE shared_mem; + char *shared_data; + char *res; + int i; + + res = NULL; + + for (i = 0; i < 20; i++) + { + shared_mem = OpenFileMappingA (FILE_MAP_READ, FALSE, shm_name); + if (shared_mem != 0) + break; + Sleep (100); + } + + if (shared_mem != 0) + { + shared_data = MapViewOfFile (shared_mem, FILE_MAP_READ, 0, 0, 0); + if (shared_data != NULL) + { + res = g_strdup (shared_data); + UnmapViewOfFile (shared_data); + } + CloseHandle (shared_mem); + } + + return res; +} + +static HANDLE +set_shm (const char *shm_name, const char *value) +{ + HANDLE shared_mem; + char *shared_data; + + shared_mem = CreateFileMappingA (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, + 0, strlen (value) + 1, shm_name); + if (shared_mem == 0) + return 0; + + shared_data = MapViewOfFile (shared_mem, FILE_MAP_WRITE, 0, 0, 0 ); + if (shared_data == NULL) + return 0; + + strcpy (shared_data, value); + + UnmapViewOfFile (shared_data); + + return shared_mem; +} + +/* These keep state between publish_session_bus and unpublish_session_bus */ +static HANDLE published_daemon_mutex; +static HANDLE published_shared_mem; + +static gboolean +publish_session_bus (const char *address) +{ + HANDLE init_mutex; + + init_mutex = acquire_mutex (UNIQUE_DBUS_INIT_MUTEX); + + published_daemon_mutex = CreateMutexA (NULL, FALSE, DBUS_DAEMON_MUTEX); + if (WaitForSingleObject (published_daemon_mutex, 10 ) != WAIT_OBJECT_0) + { + release_mutex (init_mutex); + CloseHandle (published_daemon_mutex); + published_daemon_mutex = NULL; + return FALSE; + } + + published_shared_mem = set_shm (DBUS_DAEMON_ADDRESS_INFO, address); + if (!published_shared_mem) + { + release_mutex (init_mutex); + CloseHandle (published_daemon_mutex); + published_daemon_mutex = NULL; + return FALSE; + } + + release_mutex (init_mutex); + return TRUE; +} + +static void +unpublish_session_bus (void) +{ + HANDLE init_mutex; + + init_mutex = acquire_mutex (UNIQUE_DBUS_INIT_MUTEX); + + CloseHandle (published_shared_mem); + published_shared_mem = NULL; + + release_mutex (published_daemon_mutex); + published_daemon_mutex = NULL; + + release_mutex (init_mutex); +} + +static void +wait_console_window (void) +{ + FILE *console = fopen ("CONOUT$", "w"); + + SetConsoleTitleW (L"gdbus-daemon output. Type any character to close this window."); + fprintf (console, _("(Type any character to close this window)\n")); + fflush (console); + _getch (); +} + +static void +open_console_window (void) +{ + if (((HANDLE) _get_osfhandle (fileno (stdout)) == INVALID_HANDLE_VALUE || + (HANDLE) _get_osfhandle (fileno (stderr)) == INVALID_HANDLE_VALUE) && AllocConsole ()) + { + if ((HANDLE) _get_osfhandle (fileno (stdout)) == INVALID_HANDLE_VALUE) + freopen ("CONOUT$", "w", stdout); + + if ((HANDLE) _get_osfhandle (fileno (stderr)) == INVALID_HANDLE_VALUE) + freopen ("CONOUT$", "w", stderr); + + SetConsoleTitleW (L"gdbus-daemon debug output."); + + atexit (wait_console_window); + } +} +static void +idle_timeout_cb (GDBusDaemon *daemon, gpointer user_data) +{ + GMainLoop *loop = user_data; + g_main_loop_quit (loop); +} + +__declspec(dllexport) void CALLBACK g_win32_run_session_bus (HWND hwnd, HINSTANCE hinst, char *cmdline, int nCmdShow); + +__declspec(dllexport) void CALLBACK +g_win32_run_session_bus (HWND hwnd, HINSTANCE hinst, char *cmdline, int nCmdShow) +{ + GDBusDaemon *daemon; + GMainLoop *loop; + const char *address; + GError *error = NULL; + + if (g_getenv ("GDBUS_DAEMON_DEBUG") != NULL) + open_console_window (); + + loop = g_main_loop_new (NULL, FALSE); + + address = "nonce-tcp:"; + daemon = _g_dbus_daemon_new (address, NULL, &error); + if (daemon == NULL) + { + g_printerr ("Can't init bus: %s\n", error->message); + return; + } + + g_signal_connect (daemon, "idle-timeout", G_CALLBACK (idle_timeout_cb), loop); + + if ( publish_session_bus (_g_dbus_daemon_get_address (daemon))) + { + g_main_loop_run (loop); + + unpublish_session_bus (); + } + + g_main_loop_unref (loop); + g_object_unref (daemon); +} + +static gchar * +get_session_address_dbus_launch (GError **error) +{ + HANDLE autolaunch_mutex, init_mutex; + char *address = NULL; + wchar_t gio_path[MAX_PATH+1+200]; + + autolaunch_mutex = acquire_mutex (DBUS_AUTOLAUNCH_MUTEX); + + init_mutex = acquire_mutex (UNIQUE_DBUS_INIT_MUTEX); + + if (is_mutex_owned (DBUS_DAEMON_MUTEX)) + address = read_shm (DBUS_DAEMON_ADDRESS_INFO); + + release_mutex (init_mutex); + + if (address == NULL) + { + gio_path[MAX_PATH] = 0; + if (GetModuleFileNameW (_g_io_win32_get_module (), gio_path, MAX_PATH)) + { + PROCESS_INFORMATION pi = { 0 }; + STARTUPINFOW si = { 0 }; + BOOL res; + wchar_t gio_path_short[MAX_PATH]; + wchar_t rundll_path[MAX_PATH*2]; + wchar_t args[MAX_PATH*4]; + + GetShortPathNameW (gio_path, gio_path_short, MAX_PATH); + + GetWindowsDirectoryW (rundll_path, MAX_PATH); + wcscat (rundll_path, L"\\rundll32.exe"); + if (GetFileAttributesW (rundll_path) == INVALID_FILE_ATTRIBUTES) + { + GetSystemDirectoryW (rundll_path, MAX_PATH); + wcscat (rundll_path, L"\\rundll32.exe"); + } + + wcscpy (args, L"\""); + wcscat (args, rundll_path); + wcscat (args, L"\" "); + wcscat (args, gio_path_short); + wcscat (args, L",g_win32_run_session_bus@16"); + + res = CreateProcessW (rundll_path, args, + 0, 0, FALSE, + NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | DETACHED_PROCESS, + 0, NULL /* TODO: Should be root */, + &si, &pi); + if (res) + address = read_shm (DBUS_DAEMON_ADDRESS_INFO); + } + } + + release_mutex (autolaunch_mutex); + + if (address == NULL) + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Session dbus not running, and autolaunch failed")); + + return address; +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +get_session_address_platform_specific (GError **error) +{ + gchar *ret; +#if defined (G_OS_UNIX) || defined(G_OS_WIN32) + /* need to handle OS X in a different way since `dbus-launch --autolaunch' probably won't work there */ + ret = get_session_address_dbus_launch (error); +#else + /* TODO: implement for OS X */ + ret = NULL; + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cannot determine session bus address (not implemented for this OS)")); +#endif + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_address_get_for_bus_sync: + * @bus_type: A #GBusType. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously looks up the D-Bus address for the well-known message + * bus instance specified by @bus_type. This may involve using various + * platform specific mechanisms. + * + * Returns: A valid D-Bus address string for @bus_type or %NULL if @error is set. + * + * Since: 2.26 + */ +gchar * +g_dbus_address_get_for_bus_sync (GBusType bus_type, + GCancellable *cancellable, + GError **error) +{ + gchar *ret; + const gchar *starter_bus; + GError *local_error; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = NULL; + local_error = NULL; + + if (G_UNLIKELY (_g_dbus_debug_address ())) + { + guint n; + _g_dbus_debug_print_lock (); + g_print ("GDBus-debug:Address: In g_dbus_address_get_for_bus_sync() for bus type `%s'\n", + _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type)); + for (n = 0; n < 3; n++) + { + const gchar *k; + const gchar *v; + switch (n) + { + case 0: k = "DBUS_SESSION_BUS_ADDRESS"; break; + case 1: k = "DBUS_SYSTEM_BUS_ADDRESS"; break; + case 2: k = "DBUS_STARTER_BUS_TYPE"; break; + default: g_assert_not_reached (); + } + v = g_getenv (k); + g_print ("GDBus-debug:Address: env var %s", k); + if (v != NULL) + g_print ("=`%s'\n", v); + else + g_print (" is not set\n"); + } + _g_dbus_debug_print_unlock (); + } + + switch (bus_type) + { + case G_BUS_TYPE_SYSTEM: + ret = g_strdup (g_getenv ("DBUS_SYSTEM_BUS_ADDRESS")); + if (ret == NULL) + { + ret = g_strdup ("unix:path=/var/run/dbus/system_bus_socket"); + } + break; + + case G_BUS_TYPE_SESSION: + ret = g_strdup (g_getenv ("DBUS_SESSION_BUS_ADDRESS")); + if (ret == NULL) + { + ret = get_session_address_platform_specific (&local_error); + } + break; + + case G_BUS_TYPE_STARTER: + starter_bus = g_getenv ("DBUS_STARTER_BUS_TYPE"); + if (g_strcmp0 (starter_bus, "session") == 0) + { + ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SESSION, cancellable, &local_error); + goto out; + } + else if (g_strcmp0 (starter_bus, "system") == 0) + { + ret = g_dbus_address_get_for_bus_sync (G_BUS_TYPE_SYSTEM, cancellable, &local_error); + goto out; + } + else + { + if (starter_bus != NULL) + { + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" + " - unknown value `%s'"), + starter_bus); + } + else + { + g_set_error_literal (&local_error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " + "variable is not set")); + } + } + break; + + default: + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unknown bus type %d"), + bus_type); + break; + } + + out: + if (G_UNLIKELY (_g_dbus_debug_address ())) + { + _g_dbus_debug_print_lock (); + if (ret != NULL) + { + g_print ("GDBus-debug:Address: Returning address `%s' for bus type `%s'\n", + ret, + _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type)); + } + else + { + g_print ("GDBus-debug:Address: Cannot look-up address bus type `%s': %s\n", + _g_dbus_enum_to_string (G_TYPE_BUS_TYPE, bus_type), + local_error ? local_error->message : ""); + } + _g_dbus_debug_print_unlock (); + } + + if (local_error != NULL) + g_propagate_error (error, local_error); + + return ret; +} + +/** + * g_dbus_address_escape_value: + * @string: an unescaped string to be included in a D-Bus address + * as the value in a key-value pair + * + * Escape @string so it can appear in a D-Bus address as the value + * part of a key-value pair. + * + * For instance, if @string is /run/bus-for-:0, + * this function would return /run/bus-for-%3A0, + * which could be used in a D-Bus address like + * unix:nonce-tcp:host=127.0.0.1,port=42,noncefile=/run/bus-for-%3A0. + * + * Returns: (transfer full): a copy of @string with all + * non-optionally-escaped bytes escaped + * + * Since: 2.36 + */ +gchar * +g_dbus_address_escape_value (const gchar *string) +{ + GString *s; + gsize i; + + g_return_val_if_fail (string != NULL, NULL); + + /* There will often not be anything needing escaping at all. */ + s = g_string_sized_new (strlen (string)); + + /* D-Bus address escaping is mostly the same as URI escaping... */ + g_string_append_uri_escaped (s, string, "\\/", FALSE); + + /* ... but '~' is an unreserved character in URIs, but a + * non-optionally-escaped character in D-Bus addresses. */ + for (i = 0; i < s->len; i++) + { + if (G_UNLIKELY (s->str[i] == '~')) + { + s->str[i] = '%'; + g_string_insert (s, i + 1, "7E"); + i += 2; + } + } + + return g_string_free (s, FALSE); +} diff --git a/gio/gdbusaddress.h b/gio/gdbusaddress.h new file mode 100644 index 0000000..08773aa --- /dev/null +++ b/gio/gdbusaddress.h @@ -0,0 +1,67 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_ADDRESS_H__ +#define __G_DBUS_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_36 +gchar *g_dbus_address_escape_value (const gchar *string); + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_address (const gchar *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_supported_address (const gchar *string, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_address_get_stream (const gchar *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GIOStream *g_dbus_address_get_stream_finish (GAsyncResult *res, + gchar **out_guid, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GIOStream *g_dbus_address_get_stream_sync (const gchar *address, + gchar **out_guid, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_address_get_for_bus_sync (GBusType bus_type, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_DBUS_ADDRESS_H__ */ diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c new file mode 100644 index 0000000..dd4cc2c --- /dev/null +++ b/gio/gdbusauth.c @@ -0,0 +1,1382 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusauth.h" + +#include "gdbusauthmechanismanon.h" +#include "gdbusauthmechanismexternal.h" +#include "gdbusauthmechanismsha1.h" +#include "gdbusauthobserver.h" + +#include "gdbuserror.h" +#include "gdbusutils.h" +#include "gioenumtypes.h" +#include "gcredentials.h" +#include "gdbusprivate.h" +#include "giostream.h" +#include "gdatainputstream.h" +#include "gdataoutputstream.h" + +#ifdef G_OS_UNIX +#include "gnetworking.h" +#include "gunixconnection.h" +#include "gunixcredentialsmessage.h" +#endif + +#include "glibintl.h" + +G_GNUC_PRINTF(1, 2) +static void +debug_print (const gchar *message, ...) +{ + if (G_UNLIKELY (_g_dbus_debug_authentication ())) + { + gchar *s; + GString *str; + va_list var_args; + guint n; + + _g_dbus_debug_print_lock (); + + va_start (var_args, message); + s = g_strdup_vprintf (message, var_args); + va_end (var_args); + + str = g_string_new (NULL); + for (n = 0; s[n] != '\0'; n++) + { + if (G_UNLIKELY (s[n] == '\r')) + g_string_append (str, "\\r"); + else if (G_UNLIKELY (s[n] == '\n')) + g_string_append (str, "\\n"); + else + g_string_append_c (str, s[n]); + } + g_print ("GDBus-debug:Auth: %s\n", str->str); + g_string_free (str, TRUE); + g_free (s); + + _g_dbus_debug_print_unlock (); + } +} + +typedef struct +{ + const gchar *name; + gint priority; + GType gtype; +} Mechanism; + +static void mechanism_free (Mechanism *m); + +struct _GDBusAuthPrivate +{ + GIOStream *stream; + + /* A list of available Mechanism, sorted according to priority */ + GList *available_mechanisms; +}; + +enum +{ + PROP_0, + PROP_STREAM +}; + +G_DEFINE_TYPE (GDBusAuth, _g_dbus_auth, G_TYPE_OBJECT); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +_g_dbus_auth_finalize (GObject *object) +{ + GDBusAuth *auth = G_DBUS_AUTH (object); + + if (auth->priv->stream != NULL) + g_object_unref (auth->priv->stream); + g_list_free_full (auth->priv->available_mechanisms, (GDestroyNotify) mechanism_free); + + if (G_OBJECT_CLASS (_g_dbus_auth_parent_class)->finalize != NULL) + G_OBJECT_CLASS (_g_dbus_auth_parent_class)->finalize (object); +} + +static void +_g_dbus_auth_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusAuth *auth = G_DBUS_AUTH (object); + + switch (prop_id) + { + case PROP_STREAM: + g_value_set_object (value, auth->priv->stream); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +_g_dbus_auth_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusAuth *auth = G_DBUS_AUTH (object); + + switch (prop_id) + { + case PROP_STREAM: + auth->priv->stream = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +_g_dbus_auth_class_init (GDBusAuthClass *klass) +{ + GObjectClass *gobject_class; + + g_type_class_add_private (klass, sizeof (GDBusAuthPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->get_property = _g_dbus_auth_get_property; + gobject_class->set_property = _g_dbus_auth_set_property; + gobject_class->finalize = _g_dbus_auth_finalize; + + g_object_class_install_property (gobject_class, + PROP_STREAM, + g_param_spec_object ("stream", + P_("IO Stream"), + P_("The underlying GIOStream used for I/O"), + G_TYPE_IO_STREAM, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); +} + +static void +mechanism_free (Mechanism *m) +{ + g_free (m); +} + +static void +add_mechanism (GDBusAuth *auth, + GDBusAuthObserver *observer, + GType mechanism_type) +{ + const gchar *name; + + name = _g_dbus_auth_mechanism_get_name (mechanism_type); + if (observer == NULL || g_dbus_auth_observer_allow_mechanism (observer, name)) + { + Mechanism *m; + m = g_new0 (Mechanism, 1); + m->name = name; + m->priority = _g_dbus_auth_mechanism_get_priority (mechanism_type); + m->gtype = mechanism_type; + auth->priv->available_mechanisms = g_list_prepend (auth->priv->available_mechanisms, m); + } +} + +static gint +mech_compare_func (Mechanism *a, Mechanism *b) +{ + gint ret; + /* ensure deterministic order */ + ret = b->priority - a->priority; + if (ret == 0) + ret = g_strcmp0 (b->name, a->name); + return ret; +} + +static void +_g_dbus_auth_init (GDBusAuth *auth) +{ + auth->priv = G_TYPE_INSTANCE_GET_PRIVATE (auth, G_TYPE_DBUS_AUTH, GDBusAuthPrivate); + +} + +static void +_g_dbus_auth_add_mechs (GDBusAuth *auth, + GDBusAuthObserver *observer) +{ + /* TODO: trawl extension points */ + add_mechanism (auth, observer, G_TYPE_DBUS_AUTH_MECHANISM_ANON); + add_mechanism (auth, observer, G_TYPE_DBUS_AUTH_MECHANISM_SHA1); + add_mechanism (auth, observer, G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL); + + auth->priv->available_mechanisms = g_list_sort (auth->priv->available_mechanisms, + (GCompareFunc) mech_compare_func); +} + +static GType +find_mech_by_name (GDBusAuth *auth, + const gchar *name) +{ + GType ret; + GList *l; + + ret = (GType) 0; + + for (l = auth->priv->available_mechanisms; l != NULL; l = l->next) + { + Mechanism *m = l->data; + if (g_strcmp0 (name, m->name) == 0) + { + ret = m->gtype; + goto out; + } + } + + out: + return ret; +} + +GDBusAuth * +_g_dbus_auth_new (GIOStream *stream) +{ + return g_object_new (G_TYPE_DBUS_AUTH, + "stream", stream, + NULL); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* like g_data_input_stream_read_line() but sets error if there's no content to read */ +static gchar * +_my_g_data_input_stream_read_line (GDataInputStream *dis, + gsize *out_line_length, + GCancellable *cancellable, + GError **error) +{ + gchar *ret; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = g_data_input_stream_read_line (dis, + out_line_length, + cancellable, + error); + if (ret == NULL && error != NULL && *error == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unexpected lack of content trying to read a line")); + } + + return ret; +} + +/* This function is to avoid situations like this + * + * BEGIN\r\nl\0\0\1... + * + * e.g. where we read into the first D-Bus message while waiting for + * the final line from the client (TODO: file bug against gio for + * this) + */ +static gchar * +_my_g_input_stream_read_line_safe (GInputStream *i, + gsize *out_line_length, + GCancellable *cancellable, + GError **error) +{ + GString *str; + gchar c; + gssize num_read; + gboolean last_was_cr; + + str = g_string_new (NULL); + + last_was_cr = FALSE; + while (TRUE) + { + num_read = g_input_stream_read (i, + &c, + 1, + cancellable, + error); + if (num_read == -1) + goto fail; + if (num_read == 0) + { + if (error != NULL && *error == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unexpected lack of content trying to (safely) read a line")); + } + goto fail; + } + + g_string_append_c (str, (gint) c); + if (last_was_cr) + { + if (c == 0x0a) + { + g_assert (str->len >= 2); + g_string_set_size (str, str->len - 2); + goto out; + } + } + last_was_cr = (c == 0x0d); + } + + out: + if (out_line_length != NULL) + *out_line_length = str->len; + return g_string_free (str, FALSE); + + fail: + g_assert (error == NULL || *error != NULL); + g_string_free (str, TRUE); + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +append_nibble (GString *s, gint val) +{ + g_string_append_c (s, val >= 10 ? ('a' + val - 10) : ('0' + val)); +} + +static gchar * +hexdecode (const gchar *str, + gsize *out_len, + GError **error) +{ + gchar *ret; + GString *s; + guint n; + + ret = NULL; + s = g_string_new (NULL); + + for (n = 0; str[n] != '\0'; n += 2) + { + gint upper_nibble; + gint lower_nibble; + guint value; + + upper_nibble = g_ascii_xdigit_value (str[n]); + lower_nibble = g_ascii_xdigit_value (str[n + 1]); + if (upper_nibble == -1 || lower_nibble == -1) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Error hexdecoding string `%s' around position %d", + str, n); + goto out; + } + value = (upper_nibble<<4) | lower_nibble; + g_string_append_c (s, value); + } + + ret = g_string_free (s, FALSE); + s = NULL; + + out: + if (s != NULL) + g_string_free (s, TRUE); + return ret; +} + +/* TODO: take len */ +static gchar * +hexencode (const gchar *str) +{ + guint n; + GString *s; + + s = g_string_new (NULL); + for (n = 0; str[n] != '\0'; n++) + { + gint val; + gint upper_nibble; + gint lower_nibble; + + val = ((const guchar *) str)[n]; + upper_nibble = val >> 4; + lower_nibble = val & 0x0f; + + append_nibble (s, upper_nibble); + append_nibble (s, lower_nibble); + } + + return g_string_free (s, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanism * +client_choose_mech_and_send_initial_response (GDBusAuth *auth, + GCredentials *credentials_that_were_sent, + const gchar* const *supported_auth_mechs, + GPtrArray *attempted_auth_mechs, + GDataOutputStream *dos, + GCancellable *cancellable, + GError **error) +{ + GDBusAuthMechanism *mech; + GType auth_mech_to_use_gtype; + guint n; + guint m; + gchar *initial_response; + gsize initial_response_len; + gchar *encoded; + gchar *s; + + again: + mech = NULL; + + debug_print ("CLIENT: Trying to choose mechanism"); + + /* find an authentication mechanism to try, if any */ + auth_mech_to_use_gtype = (GType) 0; + for (n = 0; supported_auth_mechs[n] != NULL; n++) + { + gboolean attempted_already; + attempted_already = FALSE; + for (m = 0; m < attempted_auth_mechs->len; m++) + { + if (g_strcmp0 (supported_auth_mechs[n], attempted_auth_mechs->pdata[m]) == 0) + { + attempted_already = TRUE; + break; + } + } + if (!attempted_already) + { + auth_mech_to_use_gtype = find_mech_by_name (auth, supported_auth_mechs[n]); + if (auth_mech_to_use_gtype != (GType) 0) + break; + } + } + + if (auth_mech_to_use_gtype == (GType) 0) + { + guint n; + gchar *available; + GString *tried_str; + + debug_print ("CLIENT: Exhausted all available mechanisms"); + + available = g_strjoinv (", ", (gchar **) supported_auth_mechs); + + tried_str = g_string_new (NULL); + for (n = 0; n < attempted_auth_mechs->len; n++) + { + if (n > 0) + g_string_append (tried_str, ", "); + g_string_append (tried_str, attempted_auth_mechs->pdata[n]); + } + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Exhausted all available authentication mechanisms (tried: %s) (available: %s)"), + tried_str->str, + available); + g_string_free (tried_str, TRUE); + g_free (available); + goto out; + } + + /* OK, decided on a mechanism - let's do this thing */ + mech = g_object_new (auth_mech_to_use_gtype, + "stream", auth->priv->stream, + "credentials", credentials_that_were_sent, + NULL); + debug_print ("CLIENT: Trying mechanism `%s'", _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype)); + g_ptr_array_add (attempted_auth_mechs, (gpointer) _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype)); + + /* the auth mechanism may not be supported + * (for example, EXTERNAL only works if credentials were exchanged) + */ + if (!_g_dbus_auth_mechanism_is_supported (mech)) + { + debug_print ("CLIENT: Mechanism `%s' says it is not supported", _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype)); + g_object_unref (mech); + mech = NULL; + goto again; + } + + initial_response_len = -1; + initial_response = _g_dbus_auth_mechanism_client_initiate (mech, + &initial_response_len); +#if 0 + g_printerr ("using auth mechanism with name `%s' of type `%s' with initial response `%s'\n", + _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype), + g_type_name (G_TYPE_FROM_INSTANCE (mech)), + initial_response); +#endif + if (initial_response != NULL) + { + //g_printerr ("initial_response = `%s'\n", initial_response); + encoded = hexencode (initial_response); + s = g_strdup_printf ("AUTH %s %s\r\n", + _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype), + encoded); + g_free (initial_response); + g_free (encoded); + } + else + { + s = g_strdup_printf ("AUTH %s\r\n", _g_dbus_auth_mechanism_get_name (auth_mech_to_use_gtype)); + } + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_object_unref (mech); + mech = NULL; + g_free (s); + goto out; + } + g_free (s); + + out: + return mech; +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef enum +{ + CLIENT_STATE_WAITING_FOR_DATA, + CLIENT_STATE_WAITING_FOR_OK, + CLIENT_STATE_WAITING_FOR_REJECT, + CLIENT_STATE_WAITING_FOR_AGREE_UNIX_FD +} ClientState; + +gchar * +_g_dbus_auth_run_client (GDBusAuth *auth, + GDBusAuthObserver *observer, + GDBusCapabilityFlags offered_capabilities, + GDBusCapabilityFlags *out_negotiated_capabilities, + GCancellable *cancellable, + GError **error) +{ + gchar *s; + GDataInputStream *dis; + GDataOutputStream *dos; + GCredentials *credentials; + gchar *ret_guid; + gchar *line; + gsize line_length; + gchar **supported_auth_mechs; + GPtrArray *attempted_auth_mechs; + GDBusAuthMechanism *mech; + ClientState state; + GDBusCapabilityFlags negotiated_capabilities; + + debug_print ("CLIENT: initiating"); + + _g_dbus_auth_add_mechs (auth, observer); + + ret_guid = NULL; + supported_auth_mechs = NULL; + attempted_auth_mechs = g_ptr_array_new (); + mech = NULL; + negotiated_capabilities = 0; + credentials = NULL; + + dis = G_DATA_INPUT_STREAM (g_data_input_stream_new (g_io_stream_get_input_stream (auth->priv->stream))); + dos = G_DATA_OUTPUT_STREAM (g_data_output_stream_new (g_io_stream_get_output_stream (auth->priv->stream))); + g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (dis), FALSE); + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (dos), FALSE); + + g_data_input_stream_set_newline_type (dis, G_DATA_STREAM_NEWLINE_TYPE_CR_LF); + +#ifdef G_OS_UNIX + if (G_IS_UNIX_CONNECTION (auth->priv->stream)) + { + credentials = g_credentials_new (); + if (!g_unix_connection_send_credentials (G_UNIX_CONNECTION (auth->priv->stream), + cancellable, + error)) + goto out; + } + else + { + if (!g_data_output_stream_put_byte (dos, '\0', cancellable, error)) + goto out; + } +#else + if (!g_data_output_stream_put_byte (dos, '\0', cancellable, error)) + goto out; +#endif + + if (credentials != NULL) + { + if (G_UNLIKELY (_g_dbus_debug_authentication ())) + { + s = g_credentials_to_string (credentials); + debug_print ("CLIENT: sent credentials `%s'", s); + g_free (s); + } + } + else + { + debug_print ("CLIENT: didn't send any credentials"); + } + + /* TODO: to reduce roundtrips, try to pick an auth mechanism to start with */ + + /* Get list of supported authentication mechanisms */ + s = "AUTH\r\n"; + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + state = CLIENT_STATE_WAITING_FOR_REJECT; + + while (TRUE) + { + switch (state) + { + case CLIENT_STATE_WAITING_FOR_REJECT: + debug_print ("CLIENT: WaitingForReject"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + if (line == NULL) + goto out; + debug_print ("CLIENT: WaitingForReject, read '%s'", line); + + choose_mechanism: + if (!g_str_has_prefix (line, "REJECTED ")) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "In WaitingForReject: Expected `REJECTED am1 am2 ... amN', got `%s'", + line); + g_free (line); + goto out; + } + if (supported_auth_mechs == NULL) + { + supported_auth_mechs = g_strsplit (line + sizeof ("REJECTED ") - 1, " ", 0); +#if 0 + for (n = 0; supported_auth_mechs != NULL && supported_auth_mechs[n] != NULL; n++) + g_printerr ("supported_auth_mechs[%d] = `%s'\n", n, supported_auth_mechs[n]); +#endif + } + g_free (line); + mech = client_choose_mech_and_send_initial_response (auth, + credentials, + (const gchar* const *) supported_auth_mechs, + attempted_auth_mechs, + dos, + cancellable, + error); + if (mech == NULL) + goto out; + if (_g_dbus_auth_mechanism_client_get_state (mech) == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA) + state = CLIENT_STATE_WAITING_FOR_DATA; + else + state = CLIENT_STATE_WAITING_FOR_OK; + break; + + case CLIENT_STATE_WAITING_FOR_OK: + debug_print ("CLIENT: WaitingForOK"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + if (line == NULL) + goto out; + debug_print ("CLIENT: WaitingForOK, read `%s'", line); + if (g_str_has_prefix (line, "OK ")) + { + if (!g_dbus_is_guid (line + 3)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Invalid OK response `%s'", + line); + g_free (line); + goto out; + } + ret_guid = g_strdup (line + 3); + g_free (line); + + if (offered_capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING) + { + s = "NEGOTIATE_UNIX_FD\r\n"; + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + state = CLIENT_STATE_WAITING_FOR_AGREE_UNIX_FD; + } + else + { + s = "BEGIN\r\n"; + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + /* and we're done! */ + goto out; + } + } + else if (g_str_has_prefix (line, "REJECTED ")) + { + goto choose_mechanism; + } + else + { + /* TODO: handle other valid responses */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "In WaitingForOk: unexpected response `%s'", + line); + g_free (line); + goto out; + } + break; + + case CLIENT_STATE_WAITING_FOR_AGREE_UNIX_FD: + debug_print ("CLIENT: WaitingForAgreeUnixFD"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + if (line == NULL) + goto out; + debug_print ("CLIENT: WaitingForAgreeUnixFD, read=`%s'", line); + if (g_strcmp0 (line, "AGREE_UNIX_FD") == 0) + { + g_free (line); + negotiated_capabilities |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING; + s = "BEGIN\r\n"; + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + /* and we're done! */ + goto out; + } + else if (g_str_has_prefix (line, "ERROR") && (line[5] == 0 || g_ascii_isspace (line[5]))) + { + //g_strstrip (line + 5); g_debug ("bah, no unix_fd: `%s'", line + 5); + g_free (line); + s = "BEGIN\r\n"; + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + /* and we're done! */ + goto out; + } + else + { + /* TODO: handle other valid responses */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "In WaitingForAgreeUnixFd: unexpected response `%s'", + line); + g_free (line); + goto out; + } + break; + + case CLIENT_STATE_WAITING_FOR_DATA: + debug_print ("CLIENT: WaitingForData"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + if (line == NULL) + goto out; + debug_print ("CLIENT: WaitingForData, read=`%s'", line); + if (g_str_has_prefix (line, "DATA ")) + { + gchar *encoded; + gchar *decoded_data; + gsize decoded_data_len = 0; + + encoded = g_strdup (line + 5); + g_free (line); + g_strstrip (encoded); + decoded_data = hexdecode (encoded, &decoded_data_len, error); + g_free (encoded); + if (decoded_data == NULL) + { + g_prefix_error (error, "DATA response is malformed: "); + /* invalid encoding, disconnect! */ + goto out; + } + _g_dbus_auth_mechanism_client_data_receive (mech, decoded_data, decoded_data_len); + g_free (decoded_data); + + if (_g_dbus_auth_mechanism_client_get_state (mech) == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND) + { + gchar *data; + gsize data_len; + gchar *encoded_data; + data = _g_dbus_auth_mechanism_client_data_send (mech, &data_len); + encoded_data = hexencode (data); + s = g_strdup_printf ("DATA %s\r\n", encoded_data); + g_free (encoded_data); + g_free (data); + debug_print ("CLIENT: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + } + state = CLIENT_STATE_WAITING_FOR_OK; + } + else if (g_str_has_prefix (line, "REJECTED ")) + { + /* could be the chosen authentication method just doesn't work. Try + * another one... + */ + goto choose_mechanism; + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "In WaitingForData: unexpected response `%s'", + line); + g_free (line); + goto out; + } + break; + + default: + g_assert_not_reached (); + break; + } + + }; /* main authentication client loop */ + + out: + if (mech != NULL) + g_object_unref (mech); + g_ptr_array_unref (attempted_auth_mechs); + g_strfreev (supported_auth_mechs); + g_object_unref (dis); + g_object_unref (dos); + + /* ensure return value is NULL if error is set */ + if (error != NULL && *error != NULL) + { + g_free (ret_guid); + ret_guid = NULL; + } + + if (ret_guid != NULL) + { + if (out_negotiated_capabilities != NULL) + *out_negotiated_capabilities = negotiated_capabilities; + } + + if (credentials != NULL) + g_object_unref (credentials); + + debug_print ("CLIENT: Done, authenticated=%d", ret_guid != NULL); + + return ret_guid; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +get_auth_mechanisms (GDBusAuth *auth, + gboolean allow_anonymous, + const gchar *prefix, + const gchar *suffix, + const gchar *separator) +{ + GList *l; + GString *str; + gboolean need_sep; + + str = g_string_new (prefix); + need_sep = FALSE; + for (l = auth->priv->available_mechanisms; l != NULL; l = l->next) + { + Mechanism *m = l->data; + + if (!allow_anonymous && g_strcmp0 (m->name, "ANONYMOUS") == 0) + continue; + + if (need_sep) + g_string_append (str, separator); + g_string_append (str, m->name); + need_sep = TRUE; + } + + g_string_append (str, suffix); + return g_string_free (str, FALSE); +} + + +typedef enum +{ + SERVER_STATE_WAITING_FOR_AUTH, + SERVER_STATE_WAITING_FOR_DATA, + SERVER_STATE_WAITING_FOR_BEGIN +} ServerState; + +gboolean +_g_dbus_auth_run_server (GDBusAuth *auth, + GDBusAuthObserver *observer, + const gchar *guid, + gboolean allow_anonymous, + GDBusCapabilityFlags offered_capabilities, + GDBusCapabilityFlags *out_negotiated_capabilities, + GCredentials **out_received_credentials, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + ServerState state; + GDataInputStream *dis; + GDataOutputStream *dos; + GError *local_error; + guchar byte; + gchar *line; + gsize line_length; + GDBusAuthMechanism *mech; + gchar *s; + GDBusCapabilityFlags negotiated_capabilities; + GCredentials *credentials; + + debug_print ("SERVER: initiating"); + + _g_dbus_auth_add_mechs (auth, observer); + + ret = FALSE; + dis = NULL; + dos = NULL; + mech = NULL; + negotiated_capabilities = 0; + credentials = NULL; + + if (!g_dbus_is_guid (guid)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "The given guid `%s' is not valid", + guid); + goto out; + } + + dis = G_DATA_INPUT_STREAM (g_data_input_stream_new (g_io_stream_get_input_stream (auth->priv->stream))); + dos = G_DATA_OUTPUT_STREAM (g_data_output_stream_new (g_io_stream_get_output_stream (auth->priv->stream))); + g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (dis), FALSE); + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (dos), FALSE); + + g_data_input_stream_set_newline_type (dis, G_DATA_STREAM_NEWLINE_TYPE_CR_LF); + + /* first read the NUL-byte (TODO: read credentials if using a unix domain socket) */ +#ifdef G_OS_UNIX + if (G_IS_UNIX_CONNECTION (auth->priv->stream)) + { + local_error = NULL; + credentials = g_unix_connection_receive_credentials (G_UNIX_CONNECTION (auth->priv->stream), + cancellable, + &local_error); + if (credentials == NULL && !g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) + { + g_propagate_error (error, local_error); + goto out; + } + } + else + { + local_error = NULL; + byte = g_data_input_stream_read_byte (dis, cancellable, &local_error); + byte = byte; /* To avoid -Wunused-but-set-variable */ + if (local_error != NULL) + { + g_propagate_error (error, local_error); + goto out; + } + } +#else + local_error = NULL; + byte = g_data_input_stream_read_byte (dis, cancellable, &local_error); + byte = byte; /* To avoid -Wunused-but-set-variable */ + if (local_error != NULL) + { + g_propagate_error (error, local_error); + goto out; + } +#endif + if (credentials != NULL) + { + if (G_UNLIKELY (_g_dbus_debug_authentication ())) + { + s = g_credentials_to_string (credentials); + debug_print ("SERVER: received credentials `%s'", s); + g_free (s); + } + } + else + { + debug_print ("SERVER: didn't receive any credentials"); + } + + state = SERVER_STATE_WAITING_FOR_AUTH; + while (TRUE) + { + switch (state) + { + case SERVER_STATE_WAITING_FOR_AUTH: + debug_print ("SERVER: WaitingForAuth"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + debug_print ("SERVER: WaitingForAuth, read `%s'", line); + if (line == NULL) + goto out; + if (g_strcmp0 (line, "AUTH") == 0) + { + s = get_auth_mechanisms (auth, allow_anonymous, "REJECTED ", "\r\n", " "); + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + g_free (line); + } + else if (g_str_has_prefix (line, "AUTH ")) + { + gchar **tokens; + const gchar *encoded; + const gchar *mech_name; + GType auth_mech_to_use_gtype; + + tokens = g_strsplit (line, " ", 0); + g_free (line); + + switch (g_strv_length (tokens)) + { + case 2: + /* no initial response */ + mech_name = tokens[1]; + encoded = NULL; + break; + + case 3: + /* initial response */ + mech_name = tokens[1]; + encoded = tokens[2]; + break; + + default: + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Unexpected line `%s' while in WaitingForAuth state", + line); + g_strfreev (tokens); + goto out; + } + + /* TODO: record that the client has attempted to use this mechanism */ + //g_debug ("client is trying `%s'", mech_name); + + auth_mech_to_use_gtype = find_mech_by_name (auth, mech_name); + if ((auth_mech_to_use_gtype == (GType) 0) || + (!allow_anonymous && g_strcmp0 (mech_name, "ANONYMOUS") == 0)) + { + /* We don't support this auth mechanism */ + g_strfreev (tokens); + s = get_auth_mechanisms (auth, allow_anonymous, "REJECTED ", "\r\n", " "); + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + + /* stay in WAITING FOR AUTH */ + state = SERVER_STATE_WAITING_FOR_AUTH; + } + else + { + gchar *initial_response; + gsize initial_response_len; + + mech = g_object_new (auth_mech_to_use_gtype, + "stream", auth->priv->stream, + "credentials", credentials, + NULL); + + initial_response = NULL; + initial_response_len = 0; + if (encoded != NULL) + { + initial_response = hexdecode (encoded, &initial_response_len, error); + if (initial_response == NULL) + { + g_prefix_error (error, "Initial response is malformed: "); + /* invalid encoding, disconnect! */ + g_strfreev (tokens); + goto out; + } + } + + _g_dbus_auth_mechanism_server_initiate (mech, + initial_response, + initial_response_len); + g_free (initial_response); + g_strfreev (tokens); + + change_state: + switch (_g_dbus_auth_mechanism_server_get_state (mech)) + { + case G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED: + if (observer != NULL && + !g_dbus_auth_observer_authorize_authenticated_peer (observer, + auth->priv->stream, + credentials)) + { + /* disconnect */ + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cancelled via GDBusAuthObserver::authorize-authenticated-peer")); + goto out; + } + else + { + s = g_strdup_printf ("OK %s\r\n", guid); + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + state = SERVER_STATE_WAITING_FOR_BEGIN; + } + break; + + case G_DBUS_AUTH_MECHANISM_STATE_REJECTED: + s = get_auth_mechanisms (auth, allow_anonymous, "REJECTED ", "\r\n", " "); + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + state = SERVER_STATE_WAITING_FOR_AUTH; + break; + + case G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA: + state = SERVER_STATE_WAITING_FOR_DATA; + break; + + case G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND: + { + gchar *data; + gsize data_len; + gchar *encoded_data; + data = _g_dbus_auth_mechanism_server_data_send (mech, &data_len); + encoded_data = hexencode (data); + s = g_strdup_printf ("DATA %s\r\n", encoded_data); + g_free (encoded_data); + g_free (data); + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + { + g_free (s); + goto out; + } + g_free (s); + } + goto change_state; + break; + + default: + /* TODO */ + g_assert_not_reached (); + break; + } + } + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Unexpected line `%s' while in WaitingForAuth state", + line); + g_free (line); + goto out; + } + break; + + case SERVER_STATE_WAITING_FOR_DATA: + debug_print ("SERVER: WaitingForData"); + line = _my_g_data_input_stream_read_line (dis, &line_length, cancellable, error); + debug_print ("SERVER: WaitingForData, read `%s'", line); + if (line == NULL) + goto out; + if (g_str_has_prefix (line, "DATA ")) + { + gchar *encoded; + gchar *decoded_data; + gsize decoded_data_len = 0; + + encoded = g_strdup (line + 5); + g_free (line); + g_strstrip (encoded); + decoded_data = hexdecode (encoded, &decoded_data_len, error); + g_free (encoded); + if (decoded_data == NULL) + { + g_prefix_error (error, "DATA response is malformed: "); + /* invalid encoding, disconnect! */ + goto out; + } + _g_dbus_auth_mechanism_server_data_receive (mech, decoded_data, decoded_data_len); + g_free (decoded_data); + /* oh man, this goto-crap is so ugly.. really need to rewrite the state machine */ + goto change_state; + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Unexpected line `%s' while in WaitingForData state", + line); + g_free (line); + } + goto out; + + case SERVER_STATE_WAITING_FOR_BEGIN: + debug_print ("SERVER: WaitingForBegin"); + /* Use extremely slow (but reliable) line reader - this basically + * does a recvfrom() system call per character + * + * (the problem with using GDataInputStream's read_line is that because of + * buffering it might start reading into the first D-Bus message that + * appears after "BEGIN\r\n"....) + */ + line = _my_g_input_stream_read_line_safe (g_io_stream_get_input_stream (auth->priv->stream), + &line_length, + cancellable, + error); + debug_print ("SERVER: WaitingForBegin, read `%s'", line); + if (line == NULL) + goto out; + if (g_strcmp0 (line, "BEGIN") == 0) + { + /* YAY, done! */ + ret = TRUE; + g_free (line); + goto out; + } + else if (g_strcmp0 (line, "NEGOTIATE_UNIX_FD") == 0) + { + g_free (line); + if (offered_capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING) + { + negotiated_capabilities |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING; + s = "AGREE_UNIX_FD\r\n"; + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + } + else + { + s = "ERROR \"fd passing not offered\"\r\n"; + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + } + } + else + { + g_debug ("Unexpected line `%s' while in WaitingForBegin state", line); + g_free (line); + s = "ERROR \"Unknown Command\"\r\n"; + debug_print ("SERVER: writing `%s'", s); + if (!g_data_output_stream_put_string (dos, s, cancellable, error)) + goto out; + } + break; + + default: + g_assert_not_reached (); + break; + } + } + + + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Not implemented (server)"); + + out: + if (mech != NULL) + g_object_unref (mech); + if (dis != NULL) + g_object_unref (dis); + if (dos != NULL) + g_object_unref (dos); + + /* ensure return value is FALSE if error is set */ + if (error != NULL && *error != NULL) + { + ret = FALSE; + } + + if (ret) + { + if (out_negotiated_capabilities != NULL) + *out_negotiated_capabilities = negotiated_capabilities; + if (out_received_credentials != NULL) + *out_received_credentials = credentials != NULL ? g_object_ref (credentials) : NULL; + } + + if (credentials != NULL) + g_object_unref (credentials); + + debug_print ("SERVER: Done, authenticated=%d", ret); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusauth.h b/gio/gdbusauth.h new file mode 100644 index 0000000..0eee95c --- /dev/null +++ b/gio/gdbusauth.h @@ -0,0 +1,87 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_H__ +#define __G_DBUS_AUTH_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusauth.h is a private header file." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH (_g_dbus_auth_get_type ()) +#define G_DBUS_AUTH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH, GDBusAuth)) +#define G_DBUS_AUTH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_AUTH, GDBusAuthClass)) +#define G_DBUS_AUTH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_AUTH, GDBusAuthClass)) +#define G_IS_DBUS_AUTH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH)) +#define G_IS_DBUS_AUTH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_AUTH)) + +typedef struct _GDBusAuth GDBusAuth; +typedef struct _GDBusAuthClass GDBusAuthClass; +typedef struct _GDBusAuthPrivate GDBusAuthPrivate; + +struct _GDBusAuthClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +struct _GDBusAuth +{ + GObject parent_instance; + GDBusAuthPrivate *priv; +}; + +GType _g_dbus_auth_get_type (void) G_GNUC_CONST; +GDBusAuth *_g_dbus_auth_new (GIOStream *stream); + +/* TODO: need a way to set allowed authentication mechanisms */ + +/* TODO: need a way to convey credentials etc. */ + +/* TODO: need a way to convey negotiated features (e.g. returning flags from e.g. GDBusConnectionFeatures) */ + +/* TODO: need to expose encode()/decode() from the AuthMechanism (and whether it is needed at all) */ + +gboolean _g_dbus_auth_run_server (GDBusAuth *auth, + GDBusAuthObserver *observer, + const gchar *guid, + gboolean allow_anonymous, + GDBusCapabilityFlags offered_capabilities, + GDBusCapabilityFlags *out_negotiated_capabilities, + GCredentials **out_received_credentials, + GCancellable *cancellable, + GError **error); + +gchar *_g_dbus_auth_run_client (GDBusAuth *auth, + GDBusAuthObserver *observer, + GDBusCapabilityFlags offered_capabilities, + GDBusCapabilityFlags *out_negotiated_capabilities, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_DBUS_AUTH_H__ */ diff --git a/gio/gdbusauthmechanism.c b/gio/gdbusauthmechanism.c new file mode 100644 index 0000000..c255992 --- /dev/null +++ b/gio/gdbusauthmechanism.c @@ -0,0 +1,341 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusauthmechanism.h" +#include "gcredentials.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" +#include "giostream.h" + +#include "glibintl.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +struct _GDBusAuthMechanismPrivate +{ + GIOStream *stream; + GCredentials *credentials; +}; + +enum +{ + PROP_0, + PROP_STREAM, + PROP_CREDENTIALS +}; + +G_DEFINE_ABSTRACT_TYPE (GDBusAuthMechanism, _g_dbus_auth_mechanism, G_TYPE_OBJECT); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +_g_dbus_auth_mechanism_finalize (GObject *object) +{ + GDBusAuthMechanism *mechanism = G_DBUS_AUTH_MECHANISM (object); + + if (mechanism->priv->stream != NULL) + g_object_unref (mechanism->priv->stream); + if (mechanism->priv->credentials != NULL) + g_object_unref (mechanism->priv->credentials); + + G_OBJECT_CLASS (_g_dbus_auth_mechanism_parent_class)->finalize (object); +} + +static void +_g_dbus_auth_mechanism_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusAuthMechanism *mechanism = G_DBUS_AUTH_MECHANISM (object); + + switch (prop_id) + { + case PROP_STREAM: + g_value_set_object (value, mechanism->priv->stream); + break; + + case PROP_CREDENTIALS: + g_value_set_object (value, mechanism->priv->credentials); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +_g_dbus_auth_mechanism_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusAuthMechanism *mechanism = G_DBUS_AUTH_MECHANISM (object); + + switch (prop_id) + { + case PROP_STREAM: + mechanism->priv->stream = g_value_dup_object (value); + break; + + case PROP_CREDENTIALS: + mechanism->priv->credentials = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +_g_dbus_auth_mechanism_class_init (GDBusAuthMechanismClass *klass) +{ + GObjectClass *gobject_class; + + g_type_class_add_private (klass, sizeof (GDBusAuthMechanismPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->get_property = _g_dbus_auth_mechanism_get_property; + gobject_class->set_property = _g_dbus_auth_mechanism_set_property; + gobject_class->finalize = _g_dbus_auth_mechanism_finalize; + + g_object_class_install_property (gobject_class, + PROP_STREAM, + g_param_spec_object ("stream", + P_("IO Stream"), + P_("The underlying GIOStream used for I/O"), + G_TYPE_IO_STREAM, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusAuthMechanism:credentials: + * + * If authenticating as a server, this property contains the + * received credentials, if any. + * + * If authenticating as a client, the property contains the + * credentials that were sent, if any. + */ + g_object_class_install_property (gobject_class, + PROP_CREDENTIALS, + g_param_spec_object ("credentials", + P_("Credentials"), + P_("The credentials of the remote peer"), + G_TYPE_CREDENTIALS, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); +} + +static void +_g_dbus_auth_mechanism_init (GDBusAuthMechanism *mechanism) +{ + /* not used for now */ + mechanism->priv = G_TYPE_INSTANCE_GET_PRIVATE (mechanism, + G_TYPE_DBUS_AUTH_MECHANISM, + GDBusAuthMechanismPrivate); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GIOStream * +_g_dbus_auth_mechanism_get_stream (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return mechanism->priv->stream; +} + +GCredentials * +_g_dbus_auth_mechanism_get_credentials (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return mechanism->priv->credentials; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +const gchar * +_g_dbus_auth_mechanism_get_name (GType mechanism_type) +{ + const gchar *name; + GDBusAuthMechanismClass *klass; + + g_return_val_if_fail (g_type_is_a (mechanism_type, G_TYPE_DBUS_AUTH_MECHANISM), NULL); + + klass = g_type_class_ref (mechanism_type); + g_assert (klass != NULL); + name = klass->get_name (); + //g_type_class_unref (klass); + + return name; +} + +gint +_g_dbus_auth_mechanism_get_priority (GType mechanism_type) +{ + gint priority; + GDBusAuthMechanismClass *klass; + + g_return_val_if_fail (g_type_is_a (mechanism_type, G_TYPE_DBUS_AUTH_MECHANISM), 0); + + klass = g_type_class_ref (mechanism_type); + g_assert (klass != NULL); + priority = klass->get_priority (); + //g_type_class_unref (klass); + + return priority; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +gboolean +_g_dbus_auth_mechanism_is_supported (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), FALSE); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->is_supported (mechanism); +} + +gchar * +_g_dbus_auth_mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->encode_data (mechanism, data, data_len, out_data_len); +} + + +gchar * +_g_dbus_auth_mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->decode_data (mechanism, data, data_len, out_data_len); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GDBusAuthMechanismState +_g_dbus_auth_mechanism_server_get_state (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_get_state (mechanism); +} + +void +_g_dbus_auth_mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len) +{ + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism)); + G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_initiate (mechanism, initial_response, initial_response_len); +} + +void +_g_dbus_auth_mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism)); + G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_data_receive (mechanism, data, data_len); +} + +gchar * +_g_dbus_auth_mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_data_send (mechanism, out_data_len); +} + +gchar * +_g_dbus_auth_mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_get_reject_reason (mechanism); +} + +void +_g_dbus_auth_mechanism_server_shutdown (GDBusAuthMechanism *mechanism) +{ + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism)); + G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->server_shutdown (mechanism); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GDBusAuthMechanismState +_g_dbus_auth_mechanism_client_get_state (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->client_get_state (mechanism); +} + +gchar * +_g_dbus_auth_mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->client_initiate (mechanism, + out_initial_response_len); +} + +void +_g_dbus_auth_mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism)); + G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->client_data_receive (mechanism, data, data_len); +} + +gchar * +_g_dbus_auth_mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism), NULL); + return G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->client_data_send (mechanism, out_data_len); +} + +void +_g_dbus_auth_mechanism_client_shutdown (GDBusAuthMechanism *mechanism) +{ + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM (mechanism)); + G_DBUS_AUTH_MECHANISM_GET_CLASS (mechanism)->client_shutdown (mechanism); +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusauthmechanism.h b/gio/gdbusauthmechanism.h new file mode 100644 index 0000000..2373a88 --- /dev/null +++ b/gio/gdbusauthmechanism.h @@ -0,0 +1,154 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_MECHANISM_H__ +#define __G_DBUS_AUTH_MECHANISM_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusauthmechanism.h is a private header file." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH_MECHANISM (_g_dbus_auth_mechanism_get_type ()) +#define G_DBUS_AUTH_MECHANISM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH_MECHANISM, GDBusAuthMechanism)) +#define G_DBUS_AUTH_MECHANISM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_AUTH_MECHANISM, GDBusAuthMechanismClass)) +#define G_DBUS_AUTH_MECHANISM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_AUTH_MECHANISM, GDBusAuthMechanismClass)) +#define G_IS_DBUS_AUTH_MECHANISM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH_MECHANISM)) +#define G_IS_DBUS_AUTH_MECHANISM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_AUTH_MECHANISM)) + +typedef struct _GDBusAuthMechanism GDBusAuthMechanism; +typedef struct _GDBusAuthMechanismClass GDBusAuthMechanismClass; +typedef struct _GDBusAuthMechanismPrivate GDBusAuthMechanismPrivate; + +typedef enum { + G_DBUS_AUTH_MECHANISM_STATE_INVALID, + G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA, + G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, + G_DBUS_AUTH_MECHANISM_STATE_REJECTED, + G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED, +} GDBusAuthMechanismState; + +struct _GDBusAuthMechanismClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + + /* VTable */ + + /* TODO: server_initiate and client_initiate probably needs to have a + * GCredentials parameter... + */ + + gint (*get_priority) (void); + const gchar *(*get_name) (void); + + /* functions shared by server/client */ + gboolean (*is_supported) (GDBusAuthMechanism *mechanism); + gchar *(*encode_data) (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); + gchar *(*decode_data) (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); + + /* functions for server-side authentication */ + GDBusAuthMechanismState (*server_get_state) (GDBusAuthMechanism *mechanism); + void (*server_initiate) (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len); + void (*server_data_receive) (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); + gchar *(*server_data_send) (GDBusAuthMechanism *mechanism, + gsize *out_data_len); + gchar *(*server_get_reject_reason) (GDBusAuthMechanism *mechanism); + void (*server_shutdown) (GDBusAuthMechanism *mechanism); + + /* functions for client-side authentication */ + GDBusAuthMechanismState (*client_get_state) (GDBusAuthMechanism *mechanism); + gchar *(*client_initiate) (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len); + void (*client_data_receive) (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); + gchar *(*client_data_send) (GDBusAuthMechanism *mechanism, + gsize *out_data_len); + void (*client_shutdown) (GDBusAuthMechanism *mechanism); +}; + +struct _GDBusAuthMechanism +{ + GObject parent_instance; + GDBusAuthMechanismPrivate *priv; +}; + +GType _g_dbus_auth_mechanism_get_type (void) G_GNUC_CONST; + +gint _g_dbus_auth_mechanism_get_priority (GType mechanism_type); +const gchar *_g_dbus_auth_mechanism_get_name (GType mechanism_type); + +GIOStream *_g_dbus_auth_mechanism_get_stream (GDBusAuthMechanism *mechanism); +GCredentials *_g_dbus_auth_mechanism_get_credentials (GDBusAuthMechanism *mechanism); + +gboolean _g_dbus_auth_mechanism_is_supported (GDBusAuthMechanism *mechanism); +gchar *_g_dbus_auth_mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +gchar *_g_dbus_auth_mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); + +GDBusAuthMechanismState _g_dbus_auth_mechanism_server_get_state (GDBusAuthMechanism *mechanism); +void _g_dbus_auth_mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len); +void _g_dbus_auth_mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +gchar *_g_dbus_auth_mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +gchar *_g_dbus_auth_mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism); +void _g_dbus_auth_mechanism_server_shutdown (GDBusAuthMechanism *mechanism); + +GDBusAuthMechanismState _g_dbus_auth_mechanism_client_get_state (GDBusAuthMechanism *mechanism); +gchar *_g_dbus_auth_mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len); +void _g_dbus_auth_mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +gchar *_g_dbus_auth_mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +void _g_dbus_auth_mechanism_client_shutdown (GDBusAuthMechanism *mechanism); + + +G_END_DECLS + +#endif /* __G_DBUS_AUTH_MECHANISM_H__ */ diff --git a/gio/gdbusauthmechanismanon.c b/gio/gdbusauthmechanismanon.c new file mode 100644 index 0000000..ea58438 --- /dev/null +++ b/gio/gdbusauthmechanismanon.c @@ -0,0 +1,326 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusauthmechanismanon.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" + +#include "glibintl.h" + +struct _GDBusAuthMechanismAnonPrivate +{ + gboolean is_client; + gboolean is_server; + GDBusAuthMechanismState state; +}; + +static gint mechanism_get_priority (void); +static const gchar *mechanism_get_name (void); + +static gboolean mechanism_is_supported (GDBusAuthMechanism *mechanism); +static gchar *mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static gchar *mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static GDBusAuthMechanismState mechanism_server_get_state (GDBusAuthMechanism *mechanism); +static void mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len); +static void mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static gchar *mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism); +static void mechanism_server_shutdown (GDBusAuthMechanism *mechanism); +static GDBusAuthMechanismState mechanism_client_get_state (GDBusAuthMechanism *mechanism); +static gchar *mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len); +static void mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static void mechanism_client_shutdown (GDBusAuthMechanism *mechanism); + +/* ---------------------------------------------------------------------------------------------------- */ + +G_DEFINE_TYPE (GDBusAuthMechanismAnon, _g_dbus_auth_mechanism_anon, G_TYPE_DBUS_AUTH_MECHANISM); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +_g_dbus_auth_mechanism_anon_finalize (GObject *object) +{ + //GDBusAuthMechanismAnon *mechanism = G_DBUS_AUTH_MECHANISM_ANON (object); + + if (G_OBJECT_CLASS (_g_dbus_auth_mechanism_anon_parent_class)->finalize != NULL) + G_OBJECT_CLASS (_g_dbus_auth_mechanism_anon_parent_class)->finalize (object); +} + +static void +_g_dbus_auth_mechanism_anon_class_init (GDBusAuthMechanismAnonClass *klass) +{ + GObjectClass *gobject_class; + GDBusAuthMechanismClass *mechanism_class; + + g_type_class_add_private (klass, sizeof (GDBusAuthMechanismAnonPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = _g_dbus_auth_mechanism_anon_finalize; + + mechanism_class = G_DBUS_AUTH_MECHANISM_CLASS (klass); + mechanism_class->get_priority = mechanism_get_priority; + mechanism_class->get_name = mechanism_get_name; + mechanism_class->is_supported = mechanism_is_supported; + mechanism_class->encode_data = mechanism_encode_data; + mechanism_class->decode_data = mechanism_decode_data; + mechanism_class->server_get_state = mechanism_server_get_state; + mechanism_class->server_initiate = mechanism_server_initiate; + mechanism_class->server_data_receive = mechanism_server_data_receive; + mechanism_class->server_data_send = mechanism_server_data_send; + mechanism_class->server_get_reject_reason = mechanism_server_get_reject_reason; + mechanism_class->server_shutdown = mechanism_server_shutdown; + mechanism_class->client_get_state = mechanism_client_get_state; + mechanism_class->client_initiate = mechanism_client_initiate; + mechanism_class->client_data_receive = mechanism_client_data_receive; + mechanism_class->client_data_send = mechanism_client_data_send; + mechanism_class->client_shutdown = mechanism_client_shutdown; +} + +static void +_g_dbus_auth_mechanism_anon_init (GDBusAuthMechanismAnon *mechanism) +{ + mechanism->priv = G_TYPE_INSTANCE_GET_PRIVATE (mechanism, + G_TYPE_DBUS_AUTH_MECHANISM_ANON, + GDBusAuthMechanismAnonPrivate); +} + +/* ---------------------------------------------------------------------------------------------------- */ + + +static gint +mechanism_get_priority (void) +{ + /* We prefer ANONYMOUS to most other mechanism (such as DBUS_COOKIE_SHA1) but not to EXTERNAL */ + return 50; +} + + +static const gchar * +mechanism_get_name (void) +{ + return "ANONYMOUS"; +} + +static gboolean +mechanism_is_supported (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), FALSE); + return TRUE; +} + +static gchar * +mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + + +static gchar * +mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_server_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static void +mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism)); + g_return_if_fail (!m->priv->is_server && !m->priv->is_client); + + //g_debug ("ANONYMOUS: initial_response was `%s'", initial_response); + + m->priv->is_server = TRUE; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; +} + +static void +mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + /* can never end up here because we are never in the WAITING_FOR_DATA state */ + g_assert_not_reached (); +} + +static gchar * +mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */ + g_assert_not_reached (); + + return NULL; +} + +static gchar * +mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_REJECTED, NULL); + + /* can never end up here because we are never in the REJECTED state */ + g_assert_not_reached (); + + return NULL; +} + +static void +mechanism_server_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + + m->priv->is_server = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_client_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static gchar * +mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL); + g_return_val_if_fail (!m->priv->is_server && !m->priv->is_client, NULL); + + m->priv->is_client = TRUE; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + + *out_initial_response_len = -1; + + /* just return our library name and version */ + return g_strdup ("GDBus 0.1"); +} + +static void +mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + /* can never end up here because we are never in the WAITING_FOR_DATA state */ + g_assert_not_reached (); +} + +static gchar * +mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism), NULL); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */ + g_assert_not_reached (); + + return NULL; +} + +static void +mechanism_client_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismAnon *m = G_DBUS_AUTH_MECHANISM_ANON (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_ANON (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + + m->priv->is_client = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusauthmechanismanon.h b/gio/gdbusauthmechanismanon.h new file mode 100644 index 0000000..f5d69a7 --- /dev/null +++ b/gio/gdbusauthmechanismanon.h @@ -0,0 +1,63 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_MECHANISM_ANON_H__ +#define __G_DBUS_AUTH_MECHANISM_ANON_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusauthmechanismanon.h is a private header file." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH_MECHANISM_ANON (_g_dbus_auth_mechanism_anon_get_type ()) +#define G_DBUS_AUTH_MECHANISM_ANON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH_MECHANISM_ANON, GDBusAuthMechanismAnon)) +#define G_DBUS_AUTH_MECHANISM_ANON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_AUTH_MECHANISM_ANON, GDBusAuthMechanismAnonClass)) +#define G_DBUS_AUTH_MECHANISM_ANON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_AUTH_MECHANISM_ANON, GDBusAuthMechanismAnonClass)) +#define G_IS_DBUS_AUTH_MECHANISM_ANON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH_MECHANISM_ANON)) +#define G_IS_DBUS_AUTH_MECHANISM_ANON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_AUTH_MECHANISM_ANON)) + +typedef struct _GDBusAuthMechanismAnon GDBusAuthMechanismAnon; +typedef struct _GDBusAuthMechanismAnonClass GDBusAuthMechanismAnonClass; +typedef struct _GDBusAuthMechanismAnonPrivate GDBusAuthMechanismAnonPrivate; + +struct _GDBusAuthMechanismAnonClass +{ + /*< private >*/ + GDBusAuthMechanismClass parent_class; +}; + +struct _GDBusAuthMechanismAnon +{ + GDBusAuthMechanism parent_instance; + GDBusAuthMechanismAnonPrivate *priv; +}; + +GType _g_dbus_auth_mechanism_anon_get_type (void) G_GNUC_CONST; + + +G_END_DECLS + +#endif /* __G_DBUS_AUTH_MECHANISM_ANON_H__ */ diff --git a/gio/gdbusauthmechanismexternal.c b/gio/gdbusauthmechanismexternal.c new file mode 100644 index 0000000..3fcb1ee --- /dev/null +++ b/gio/gdbusauthmechanismexternal.c @@ -0,0 +1,404 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gdbusauthmechanismexternal.h" +#include "gcredentials.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" + +#include "glibintl.h" + +struct _GDBusAuthMechanismExternalPrivate +{ + gboolean is_client; + gboolean is_server; + GDBusAuthMechanismState state; +}; + +static gint mechanism_get_priority (void); +static const gchar *mechanism_get_name (void); + +static gboolean mechanism_is_supported (GDBusAuthMechanism *mechanism); +static gchar *mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static gchar *mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static GDBusAuthMechanismState mechanism_server_get_state (GDBusAuthMechanism *mechanism); +static void mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len); +static void mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static gchar *mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism); +static void mechanism_server_shutdown (GDBusAuthMechanism *mechanism); +static GDBusAuthMechanismState mechanism_client_get_state (GDBusAuthMechanism *mechanism); +static gchar *mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len); +static void mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static void mechanism_client_shutdown (GDBusAuthMechanism *mechanism); + +/* ---------------------------------------------------------------------------------------------------- */ + +G_DEFINE_TYPE (GDBusAuthMechanismExternal, _g_dbus_auth_mechanism_external, G_TYPE_DBUS_AUTH_MECHANISM); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +_g_dbus_auth_mechanism_external_finalize (GObject *object) +{ + //GDBusAuthMechanismExternal *mechanism = G_DBUS_AUTH_MECHANISM_EXTERNAL (object); + + if (G_OBJECT_CLASS (_g_dbus_auth_mechanism_external_parent_class)->finalize != NULL) + G_OBJECT_CLASS (_g_dbus_auth_mechanism_external_parent_class)->finalize (object); +} + +static void +_g_dbus_auth_mechanism_external_class_init (GDBusAuthMechanismExternalClass *klass) +{ + GObjectClass *gobject_class; + GDBusAuthMechanismClass *mechanism_class; + + g_type_class_add_private (klass, sizeof (GDBusAuthMechanismExternalPrivate)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = _g_dbus_auth_mechanism_external_finalize; + + mechanism_class = G_DBUS_AUTH_MECHANISM_CLASS (klass); + mechanism_class->get_name = mechanism_get_name; + mechanism_class->get_priority = mechanism_get_priority; + mechanism_class->is_supported = mechanism_is_supported; + mechanism_class->encode_data = mechanism_encode_data; + mechanism_class->decode_data = mechanism_decode_data; + mechanism_class->server_get_state = mechanism_server_get_state; + mechanism_class->server_initiate = mechanism_server_initiate; + mechanism_class->server_data_receive = mechanism_server_data_receive; + mechanism_class->server_data_send = mechanism_server_data_send; + mechanism_class->server_get_reject_reason = mechanism_server_get_reject_reason; + mechanism_class->server_shutdown = mechanism_server_shutdown; + mechanism_class->client_get_state = mechanism_client_get_state; + mechanism_class->client_initiate = mechanism_client_initiate; + mechanism_class->client_data_receive = mechanism_client_data_receive; + mechanism_class->client_data_send = mechanism_client_data_send; + mechanism_class->client_shutdown = mechanism_client_shutdown; +} + +static void +_g_dbus_auth_mechanism_external_init (GDBusAuthMechanismExternal *mechanism) +{ + mechanism->priv = G_TYPE_INSTANCE_GET_PRIVATE (mechanism, + G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL, + GDBusAuthMechanismExternalPrivate); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +mechanism_is_supported (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), FALSE); + /* This mechanism is only available if credentials has been exchanged */ + if (_g_dbus_auth_mechanism_get_credentials (mechanism) != NULL) + return TRUE; + else + return FALSE; +} + +static gint +mechanism_get_priority (void) +{ + /* We prefer EXTERNAL to most other mechanism (DBUS_COOKIE_SHA1 and ANONYMOUS) */ + return 100; +} + +static const gchar * +mechanism_get_name (void) +{ + return "EXTERNAL"; +} + +static gchar * +mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + + +static gchar * +mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_server_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static gboolean +data_matches_credentials (const gchar *data, + GCredentials *credentials) +{ + gboolean match; + + match = FALSE; + + if (credentials == NULL) + goto out; + + if (data == NULL || strlen (data) == 0) + goto out; + +#if defined(G_OS_UNIX) + { + gint64 alleged_uid; + gchar *endp; + + /* on UNIX, this is the uid as a string in base 10 */ + alleged_uid = g_ascii_strtoll (data, &endp, 10); + if (*endp == '\0') + { + if (g_credentials_get_unix_user (credentials, NULL) == alleged_uid) + { + match = TRUE; + } + } + } +#else + /* TODO: Dont know how to compare credentials on this OS. Please implement. */ +#endif + + out: + return match; +} + +static void +mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism)); + g_return_if_fail (!m->priv->is_server && !m->priv->is_client); + + m->priv->is_server = TRUE; + + if (initial_response != NULL) + { + if (data_matches_credentials (initial_response, _g_dbus_auth_mechanism_get_credentials (mechanism))) + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + } + else + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + } + } + else + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA; + } +} + +static void +mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + if (data_matches_credentials (data, _g_dbus_auth_mechanism_get_credentials (mechanism))) + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + } + else + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + } +} + +static gchar * +mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */ + g_assert_not_reached (); + + return NULL; +} + +static gchar * +mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_REJECTED, NULL); + + /* can never end up here because we are never in the REJECTED state */ + g_assert_not_reached (); + + return NULL; +} + +static void +mechanism_server_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + + m->priv->is_server = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_client_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static gchar * +mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + gchar *initial_response; + GCredentials *credentials; + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), NULL); + g_return_val_if_fail (!m->priv->is_server && !m->priv->is_client, NULL); + + m->priv->is_client = TRUE; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + + *out_initial_response_len = -1; + + credentials = _g_dbus_auth_mechanism_get_credentials (mechanism); + g_assert (credentials != NULL); + + /* return the uid */ +#if defined(G_OS_UNIX) + initial_response = g_strdup_printf ("%" G_GINT64_FORMAT, (gint64) g_credentials_get_unix_user (credentials, NULL)); +#elif defined(G_OS_WIN32) +#ifdef __GNUC__ +#warning Dont know how to send credentials on this OS. The EXTERNAL D-Bus authentication mechanism will not work. +#endif + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; +#endif + return initial_response; +} + +static void +mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + /* can never end up here because we are never in the WAITING_FOR_DATA state */ + g_assert_not_reached (); +} + +static gchar * +mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism), NULL); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + /* can never end up here because we are never in the HAVE_DATA_TO_SEND state */ + g_assert_not_reached (); + + return NULL; +} + +static void +mechanism_client_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismExternal *m = G_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_EXTERNAL (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + + m->priv->is_client = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusauthmechanismexternal.h b/gio/gdbusauthmechanismexternal.h new file mode 100644 index 0000000..b5f011f --- /dev/null +++ b/gio/gdbusauthmechanismexternal.h @@ -0,0 +1,63 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_MECHANISM_EXTERNAL_H__ +#define __G_DBUS_AUTH_MECHANISM_EXTERNAL_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusauthmechanismexternal.h is a private header file." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL (_g_dbus_auth_mechanism_external_get_type ()) +#define G_DBUS_AUTH_MECHANISM_EXTERNAL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL, GDBusAuthMechanismExternal)) +#define G_DBUS_AUTH_MECHANISM_EXTERNAL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL, GDBusAuthMechanismExternalClass)) +#define G_DBUS_AUTH_MECHANISM_EXTERNAL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL, GDBusAuthMechanismExternalClass)) +#define G_IS_DBUS_AUTH_MECHANISM_EXTERNAL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL)) +#define G_IS_DBUS_AUTH_MECHANISM_EXTERNAL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_AUTH_MECHANISM_EXTERNAL)) + +typedef struct _GDBusAuthMechanismExternal GDBusAuthMechanismExternal; +typedef struct _GDBusAuthMechanismExternalClass GDBusAuthMechanismExternalClass; +typedef struct _GDBusAuthMechanismExternalPrivate GDBusAuthMechanismExternalPrivate; + +struct _GDBusAuthMechanismExternalClass +{ + /*< private >*/ + GDBusAuthMechanismClass parent_class; +}; + +struct _GDBusAuthMechanismExternal +{ + GDBusAuthMechanism parent_instance; + GDBusAuthMechanismExternalPrivate *priv; +}; + +GType _g_dbus_auth_mechanism_external_get_type (void) G_GNUC_CONST; + + +G_END_DECLS + +#endif /* __G_DBUS_AUTH_MECHANISM_EXTERNAL_H__ */ diff --git a/gio/gdbusauthmechanismsha1.c b/gio/gdbusauthmechanismsha1.c new file mode 100644 index 0000000..5e8b6c0 --- /dev/null +++ b/gio/gdbusauthmechanismsha1.c @@ -0,0 +1,1225 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef _WIN32 +#include +#endif + +#include + +#include "gdbusauthmechanismsha1.h" +#include "gcredentials.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "gdbusprivate.h" + +#include "glibintl.h" + +struct _GDBusAuthMechanismSha1Private +{ + gboolean is_client; + gboolean is_server; + GDBusAuthMechanismState state; + + /* used on the client side */ + gchar *to_send; + + /* used on the server side */ + gchar *cookie; + gchar *server_challenge; +}; + +static gint mechanism_get_priority (void); +static const gchar *mechanism_get_name (void); + +static gboolean mechanism_is_supported (GDBusAuthMechanism *mechanism); +static gchar *mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static gchar *mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len); +static GDBusAuthMechanismState mechanism_server_get_state (GDBusAuthMechanism *mechanism); +static void mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len); +static void mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static gchar *mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism); +static void mechanism_server_shutdown (GDBusAuthMechanism *mechanism); +static GDBusAuthMechanismState mechanism_client_get_state (GDBusAuthMechanism *mechanism); +static gchar *mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len); +static void mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len); +static gchar *mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len); +static void mechanism_client_shutdown (GDBusAuthMechanism *mechanism); + +/* ---------------------------------------------------------------------------------------------------- */ + +G_DEFINE_TYPE (GDBusAuthMechanismSha1, _g_dbus_auth_mechanism_sha1, G_TYPE_DBUS_AUTH_MECHANISM); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +_g_dbus_auth_mechanism_sha1_finalize (GObject *object) +{ + GDBusAuthMechanismSha1 *mechanism = G_DBUS_AUTH_MECHANISM_SHA1 (object); + + g_free (mechanism->priv->to_send); + + g_free (mechanism->priv->cookie); + g_free (mechanism->priv->server_challenge); + + if (G_OBJECT_CLASS (_g_dbus_auth_mechanism_sha1_parent_class)->finalize != NULL) + G_OBJECT_CLASS (_g_dbus_auth_mechanism_sha1_parent_class)->finalize (object); +} + +static void +_g_dbus_auth_mechanism_sha1_class_init (GDBusAuthMechanismSha1Class *klass) +{ + GObjectClass *gobject_class; + GDBusAuthMechanismClass *mechanism_class; + + g_type_class_add_private (klass, sizeof (GDBusAuthMechanismSha1Private)); + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = _g_dbus_auth_mechanism_sha1_finalize; + + mechanism_class = G_DBUS_AUTH_MECHANISM_CLASS (klass); + mechanism_class->get_priority = mechanism_get_priority; + mechanism_class->get_name = mechanism_get_name; + mechanism_class->is_supported = mechanism_is_supported; + mechanism_class->encode_data = mechanism_encode_data; + mechanism_class->decode_data = mechanism_decode_data; + mechanism_class->server_get_state = mechanism_server_get_state; + mechanism_class->server_initiate = mechanism_server_initiate; + mechanism_class->server_data_receive = mechanism_server_data_receive; + mechanism_class->server_data_send = mechanism_server_data_send; + mechanism_class->server_get_reject_reason = mechanism_server_get_reject_reason; + mechanism_class->server_shutdown = mechanism_server_shutdown; + mechanism_class->client_get_state = mechanism_client_get_state; + mechanism_class->client_initiate = mechanism_client_initiate; + mechanism_class->client_data_receive = mechanism_client_data_receive; + mechanism_class->client_data_send = mechanism_client_data_send; + mechanism_class->client_shutdown = mechanism_client_shutdown; +} + +static void +_g_dbus_auth_mechanism_sha1_init (GDBusAuthMechanismSha1 *mechanism) +{ + mechanism->priv = G_TYPE_INSTANCE_GET_PRIVATE (mechanism, + G_TYPE_DBUS_AUTH_MECHANISM_SHA1, + GDBusAuthMechanismSha1Private); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gint +mechanism_get_priority (void) +{ + return 0; +} + +static const gchar * +mechanism_get_name (void) +{ + return "DBUS_COOKIE_SHA1"; +} + +static gboolean +mechanism_is_supported (GDBusAuthMechanism *mechanism) +{ + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), FALSE); + return TRUE; +} + +static gchar * +mechanism_encode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + + +static gchar * +mechanism_decode_data (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len, + gsize *out_data_len) +{ + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gint +random_ascii (void) +{ + gint ret; + ret = g_random_int_range (0, 60); + if (ret < 25) + ret += 'A'; + else if (ret < 50) + ret += 'a' - 25; + else + ret += '0' - 50; + return ret; +} + +static gchar * +random_ascii_string (guint len) +{ + GString *challenge; + guint n; + + challenge = g_string_new (NULL); + for (n = 0; n < len; n++) + g_string_append_c (challenge, random_ascii ()); + return g_string_free (challenge, FALSE); +} + +static gchar * +random_blob (guint len) +{ + GString *challenge; + guint n; + + challenge = g_string_new (NULL); + for (n = 0; n < len; n++) + g_string_append_c (challenge, g_random_int_range (0, 256)); + return g_string_free (challenge, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* ensure keyring dir exists and permissions are correct */ +static gchar * +ensure_keyring_directory (GError **error) +{ + gchar *path; + const gchar *e; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + e = g_getenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR"); + if (e != NULL) + { + path = g_strdup (e); + } + else + { + path = g_build_filename (g_get_home_dir (), + ".dbus-keyrings", + NULL); + } + + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) + { + if (g_getenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION") == NULL) + { +#ifdef G_OS_UNIX + struct stat statbuf; + if (stat (path, &statbuf) != 0) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error when getting information for directory `%s': %s"), + path, + strerror (errno)); + g_free (path); + path = NULL; + goto out; + } + if ((statbuf.st_mode & 0777) != 0700) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o"), + path, + statbuf.st_mode & 0777); + g_free (path); + path = NULL; + goto out; + } +#else +#ifdef __GNUC__ +#warning Please implement permission checking on this non-UNIX platform +#endif +#endif + } + goto out; + } + + if (g_mkdir (path, 0700) != 0) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error creating directory `%s': %s"), + path, + strerror (errno)); + g_free (path); + path = NULL; + goto out; + } + +out: + return path; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +append_nibble (GString *s, gint val) +{ + g_string_append_c (s, val >= 10 ? ('a' + val - 10) : ('0' + val)); +} + +static gchar * +hexencode (const gchar *str, + gssize len) +{ + guint n; + GString *s; + + if (len == -1) + len = strlen (str); + + s = g_string_new (NULL); + for (n = 0; n < len; n++) + { + gint val; + gint upper_nibble; + gint lower_nibble; + + val = ((const guchar *) str)[n]; + upper_nibble = val >> 4; + lower_nibble = val & 0x0f; + + append_nibble (s, upper_nibble); + append_nibble (s, lower_nibble); + } + + return g_string_free (s, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* looks up an entry in the keyring */ +static gchar * +keyring_lookup_entry (const gchar *cookie_context, + gint cookie_id, + GError **error) +{ + gchar *ret; + gchar *keyring_dir; + gchar *contents; + gchar *path; + guint n; + gchar **lines; + + g_return_val_if_fail (cookie_context != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = NULL; + path = NULL; + contents = NULL; + lines = NULL; + + keyring_dir = ensure_keyring_directory (error); + if (keyring_dir == NULL) + goto out; + + path = g_build_filename (keyring_dir, cookie_context, NULL); + + if (!g_file_get_contents (path, + &contents, + NULL, + error)) + { + g_prefix_error (error, + _("Error opening keyring `%s' for reading: "), + path); + goto out; + } + g_assert (contents != NULL); + + lines = g_strsplit (contents, "\n", 0); + for (n = 0; lines[n] != NULL; n++) + { + const gchar *line = lines[n]; + gchar **tokens; + gchar *endp; + gint line_id; + guint64 line_when; + + if (line[0] == '\0') + continue; + + tokens = g_strsplit (line, " ", 0); + if (g_strv_length (tokens) != 3) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + + line_id = g_ascii_strtoll (tokens[0], &endp, 10); + if (*endp != '\0') + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("First token of line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + + line_when = g_ascii_strtoll (tokens[1], &endp, 10); + line_when = line_when; /* To avoid -Wunused-but-set-variable */ + if (*endp != '\0') + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Second token of line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + + if (line_id == cookie_id) + { + /* YAY, success */ + ret = tokens[2]; /* steal pointer */ + tokens[2] = NULL; + g_strfreev (tokens); + goto out; + } + + g_strfreev (tokens); + } + + /* BOOH, didn't find the cookie */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Didn't find cookie with id %d in the keyring at `%s'"), + cookie_id, + path); + + out: + g_free (keyring_dir); + g_free (path); + g_free (contents); + g_strfreev (lines); + return ret; +} + +/* function for logging important events that the system administrator should take notice of */ +G_GNUC_PRINTF(1, 2) +static void +_log (const gchar *message, + ...) +{ + gchar *s; + va_list var_args; + + va_start (var_args, message); + s = g_strdup_vprintf (message, var_args); + va_end (var_args); + + /* TODO: might want to send this to syslog instead */ + g_printerr ("GDBus-DBUS_COOKIE_SHA1: %s\n", s); + g_free (s); +} + +static gint +keyring_acquire_lock (const gchar *path, + GError **error) +{ + gchar *lock; + gint ret; + guint num_tries; + guint num_create_tries; + + g_return_val_if_fail (path != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = -1; + lock = g_strdup_printf ("%s.lock", path); + + /* This is what the D-Bus spec says + * + * Create a lockfile name by appending ".lock" to the name of the + * cookie file. The server should attempt to create this file using + * O_CREAT | O_EXCL. If file creation fails, the lock + * fails. Servers should retry for a reasonable period of time, + * then they may choose to delete an existing lock to keep users + * from having to manually delete a stale lock. [1] + * + * [1] : Lockfiles are used instead of real file locking fcntl() because + * real locking implementations are still flaky on network filesystems + */ + + num_create_tries = 0; +#ifdef EEXISTS + again: +#endif + num_tries = 0; + while (g_file_test (lock, G_FILE_TEST_EXISTS)) + { + /* sleep 10ms, then try again */ + g_usleep (1000*10); + num_tries++; + if (num_tries == 50) + { + /* ok, we slept 50*10ms = 0.5 seconds. Conclude that the lock file must be + * stale (nuke the it from orbit) + */ + if (g_unlink (lock) != 0) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error deleting stale lock file `%s': %s"), + lock, + strerror (errno)); + goto out; + } + _log ("Deleted stale lock file `%s'", lock); + break; + } + } + + ret = g_open (lock, O_CREAT | +#ifdef O_EXCL + O_EXCL, +#else + 0, +#endif + 0700); + if (ret == -1) + { +#ifdef EEXISTS + /* EEXIST: pathname already exists and O_CREAT and O_EXCL were used. */ + if (errno == EEXISTS) + { + num_create_tries++; + if (num_create_tries < 5) + goto again; + } +#endif + num_create_tries = num_create_tries; /* To avoid -Wunused-but-set-variable */ + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error creating lock file `%s': %s"), + lock, + strerror (errno)); + goto out; + } + + out: + g_free (lock); + return ret; +} + +static gboolean +keyring_release_lock (const gchar *path, + gint lock_fd, + GError **error) +{ + gchar *lock; + gboolean ret; + + g_return_val_if_fail (path != NULL, FALSE); + g_return_val_if_fail (lock_fd != -1, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + lock = g_strdup_printf ("%s.lock", path); + if (close (lock_fd) != 0) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error closing (unlinked) lock file `%s': %s"), + lock, + strerror (errno)); + goto out; + } + if (g_unlink (lock) != 0) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error unlinking lock file `%s': %s"), + lock, + strerror (errno)); + goto out; + } + + ret = TRUE; + + out: + g_free (lock); + return ret; +} + + +/* adds an entry to the keyring, taking care of locking and deleting stale/future entries */ +static gboolean +keyring_generate_entry (const gchar *cookie_context, + gint *out_id, + gchar **out_cookie, + GError **error) +{ + gboolean ret; + gchar *keyring_dir; + gchar *path; + gchar *contents; + GError *local_error; + gchar **lines; + gint max_line_id; + GString *new_contents; + guint64 now; + gboolean have_id; + gint use_id; + gchar *use_cookie; + gboolean changed_file; + gint lock_fd; + + g_return_val_if_fail (cookie_context != NULL, FALSE); + g_return_val_if_fail (out_id != NULL, FALSE); + g_return_val_if_fail (out_cookie != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + path = NULL; + contents = NULL; + lines = NULL; + new_contents = NULL; + have_id = FALSE; + use_id = 0; + use_cookie = NULL; + lock_fd = -1; + + keyring_dir = ensure_keyring_directory (error); + if (keyring_dir == NULL) + goto out; + + path = g_build_filename (keyring_dir, cookie_context, NULL); + + lock_fd = keyring_acquire_lock (path, error); + if (lock_fd == -1) + goto out; + + local_error = NULL; + contents = NULL; + if (!g_file_get_contents (path, + &contents, + NULL, + &local_error)) + { + if (local_error->domain == G_FILE_ERROR && local_error->code == G_FILE_ERROR_NOENT) + { + /* file doesn't have to exist */ + g_error_free (local_error); + } + else + { + g_propagate_prefixed_error (error, + local_error, + _("Error opening keyring `%s' for writing: "), + path); + goto out; + } + } + + new_contents = g_string_new (NULL); + now = time (NULL); + changed_file = FALSE; + + max_line_id = 0; + if (contents != NULL) + { + guint n; + lines = g_strsplit (contents, "\n", 0); + for (n = 0; lines[n] != NULL; n++) + { + const gchar *line = lines[n]; + gchar **tokens; + gchar *endp; + gint line_id; + guint64 line_when; + gboolean keep_entry; + + if (line[0] == '\0') + continue; + + tokens = g_strsplit (line, " ", 0); + if (g_strv_length (tokens) != 3) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + + line_id = g_ascii_strtoll (tokens[0], &endp, 10); + if (*endp != '\0') + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("First token of line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + + line_when = g_ascii_strtoll (tokens[1], &endp, 10); + if (*endp != '\0') + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Second token of line %d of the keyring at `%s' with content `%s' is malformed"), + n + 1, + path, + line); + g_strfreev (tokens); + goto out; + } + line_when = line_when; /* To avoid -Wunused-but-set-variable */ + + + /* D-Bus spec says: + * + * Once the lockfile has been created, the server loads the + * cookie file. It should then delete any cookies that are + * old (the timeout can be fairly short), or more than a + * reasonable time in the future (so that cookies never + * accidentally become permanent, if the clock was set far + * into the future at some point). If no recent keys remain, + * the server may generate a new key. + * + */ + keep_entry = TRUE; + if (line_when > now) + { + /* Oddball case: entry is more recent than our current wall-clock time.. + * This is OK, it means that another server on another machine but with + * same $HOME wrote the entry. + * + * So discard the entry if it's more than 1 day in the future ("reasonable + * time in the future"). + */ + if (line_when - now > 24*60*60) + { + keep_entry = FALSE; + _log ("Deleted SHA1 cookie from %" G_GUINT64_FORMAT " seconds in the future", line_when - now); + } + } + else + { + /* Discard entry if it's older than 15 minutes ("can be fairly short") */ + if (now - line_when > 15*60) + { + keep_entry = FALSE; + } + } + + if (!keep_entry) + { + changed_file = FALSE; + } + else + { + g_string_append_printf (new_contents, + "%d %" G_GUINT64_FORMAT " %s\n", + line_id, + line_when, + tokens[2]); + max_line_id = MAX (line_id, max_line_id); + /* Only reuse entry if not older than 10 minutes. + * + * (We need a bit of grace time compared to 15 minutes above.. otherwise + * there's a race where we reuse the 14min59.9 secs old entry and a + * split-second later another server purges the now 15 minute old entry.) + */ + if (now - line_when < 10 * 60) + { + if (!have_id) + { + use_id = line_id; + use_cookie = tokens[2]; /* steal memory */ + tokens[2] = NULL; + have_id = TRUE; + } + } + } + g_strfreev (tokens); + } + } /* for each line */ + + ret = TRUE; + + if (have_id) + { + *out_id = use_id; + *out_cookie = use_cookie; + use_cookie = NULL; + } + else + { + gchar *raw_cookie; + *out_id = max_line_id + 1; + raw_cookie = random_blob (32); + *out_cookie = hexencode (raw_cookie, 32); + g_free (raw_cookie); + + g_string_append_printf (new_contents, + "%d %" G_GUINT64_FORMAT " %s\n", + *out_id, + (guint64) time (NULL), + *out_cookie); + changed_file = TRUE; + } + + /* and now actually write the cookie file if there are changes (this is atomic) */ + if (changed_file) + { + if (!g_file_set_contents (path, + new_contents->str, + -1, + error)) + { + *out_id = 0; + *out_cookie = 0; + g_free (*out_cookie); + ret = FALSE; + goto out; + } + } + + out: + + if (lock_fd != -1) + { + GError *local_error; + local_error = NULL; + if (!keyring_release_lock (path, lock_fd, &local_error)) + { + if (error != NULL) + { + if (*error == NULL) + { + *error = local_error; + } + else + { + g_prefix_error (error, + _("(Additionally, releasing the lock for `%s' also failed: %s) "), + path, + local_error->message); + } + } + else + { + g_error_free (local_error); + } + } + } + + g_free (keyring_dir); + g_free (path); + g_strfreev (lines); + g_free (contents); + if (new_contents != NULL) + g_string_free (new_contents, TRUE); + g_free (use_cookie); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +generate_sha1 (const gchar *server_challenge, + const gchar *client_challenge, + const gchar *cookie) +{ + GString *str; + gchar *sha1; + + str = g_string_new (server_challenge); + g_string_append_c (str, ':'); + g_string_append (str, client_challenge); + g_string_append_c (str, ':'); + g_string_append (str, cookie); + sha1 = g_compute_checksum_for_string (G_CHECKSUM_SHA1, str->str, -1); + g_string_free (str, TRUE); + + return sha1; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_server_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static void +mechanism_server_initiate (GDBusAuthMechanism *mechanism, + const gchar *initial_response, + gsize initial_response_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism)); + g_return_if_fail (!m->priv->is_server && !m->priv->is_client); + + m->priv->is_server = TRUE; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + + if (initial_response != NULL && strlen (initial_response) > 0) + { +#ifdef G_OS_UNIX + gint64 uid; + gchar *endp; + + uid = g_ascii_strtoll (initial_response, &endp, 10); + if (*endp == '\0') + { + if (uid == getuid ()) + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND; + } + } +#elif defined(G_OS_WIN32) + gchar *sid; + sid = _g_dbus_win32_get_user_sid (); + if (g_strcmp0 (initial_response, sid) == 0) + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND; + g_free (sid); +#else +#error Please implement for your OS +#endif + } +} + +static void +mechanism_server_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + gchar **tokens; + const gchar *client_challenge; + const gchar *alleged_sha1; + gchar *sha1; + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + tokens = NULL; + sha1 = NULL; + + tokens = g_strsplit (data, " ", 0); + if (g_strv_length (tokens) != 2) + { + g_warning ("Malformed data `%s'", data); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + goto out; + } + + client_challenge = tokens[0]; + alleged_sha1 = tokens[1]; + + sha1 = generate_sha1 (m->priv->server_challenge, client_challenge, m->priv->cookie); + + if (g_strcmp0 (sha1, alleged_sha1) == 0) + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + } + else + { + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + } + + out: + g_strfreev (tokens); + g_free (sha1); +} + +static gchar * +mechanism_server_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + gchar *s; + gint cookie_id; + const gchar *cookie_context; + GError *error; + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + s = NULL; + + /* TODO: use GDBusAuthObserver here to get the cookie context to use? */ + cookie_context = "org_gtk_gdbus_general"; + + cookie_id = -1; + error = NULL; + if (!keyring_generate_entry (cookie_context, + &cookie_id, + &m->priv->cookie, + &error)) + { + g_warning ("Error adding entry to keyring: %s", error->message); + g_error_free (error); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + goto out; + } + + m->priv->server_challenge = random_ascii_string (16); + s = g_strdup_printf ("%s %d %s", + cookie_context, + cookie_id, + m->priv->server_challenge); + + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA; + + out: + return s; +} + +static gchar * +mechanism_server_get_reject_reason (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), NULL); + g_return_val_if_fail (m->priv->is_server && !m->priv->is_client, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_REJECTED, NULL); + + /* can never end up here because we are never in the REJECTED state */ + g_assert_not_reached (); + + return NULL; +} + +static void +mechanism_server_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism)); + g_return_if_fail (m->priv->is_server && !m->priv->is_client); + + m->priv->is_server = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAuthMechanismState +mechanism_client_get_state (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), G_DBUS_AUTH_MECHANISM_STATE_INVALID); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, G_DBUS_AUTH_MECHANISM_STATE_INVALID); + + return m->priv->state; +} + +static gchar * +mechanism_client_initiate (GDBusAuthMechanism *mechanism, + gsize *out_initial_response_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + gchar *initial_response; + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), NULL); + g_return_val_if_fail (!m->priv->is_server && !m->priv->is_client, NULL); + + m->priv->is_client = TRUE; + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA; + + *out_initial_response_len = -1; + +#ifdef G_OS_UNIX + initial_response = g_strdup_printf ("%" G_GINT64_FORMAT, (gint64) getuid ()); +#elif defined (G_OS_WIN32) +initial_response = _g_dbus_win32_get_user_sid (); +#else +#error Please implement for your OS +#endif + g_assert (initial_response != NULL); + + return initial_response; +} + +static void +mechanism_client_data_receive (GDBusAuthMechanism *mechanism, + const gchar *data, + gsize data_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + gchar **tokens; + const gchar *cookie_context; + guint cookie_id; + const gchar *server_challenge; + gchar *client_challenge; + gchar *endp; + gchar *cookie; + GError *error; + gchar *sha1; + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + g_return_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_WAITING_FOR_DATA); + + tokens = NULL; + cookie = NULL; + client_challenge = NULL; + + tokens = g_strsplit (data, " ", 0); + if (g_strv_length (tokens) != 3) + { + g_warning ("Malformed data `%s'", data); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + goto out; + } + + cookie_context = tokens[0]; + cookie_id = g_ascii_strtoll (tokens[1], &endp, 10); + if (*endp != '\0') + { + g_warning ("Malformed cookie_id `%s'", tokens[1]); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + goto out; + } + server_challenge = tokens[2]; + + error = NULL; + cookie = keyring_lookup_entry (cookie_context, cookie_id, &error); + if (cookie == NULL) + { + g_warning ("Problems looking up entry in keyring: %s", error->message); + g_error_free (error); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_REJECTED; + goto out; + } + + client_challenge = random_ascii_string (16); + sha1 = generate_sha1 (server_challenge, client_challenge, cookie); + m->priv->to_send = g_strdup_printf ("%s %s", client_challenge, sha1); + g_free (sha1); + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND; + + out: + g_strfreev (tokens); + g_free (cookie); + g_free (client_challenge); +} + +static gchar * +mechanism_client_data_send (GDBusAuthMechanism *mechanism, + gsize *out_data_len) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_val_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism), NULL); + g_return_val_if_fail (m->priv->is_client && !m->priv->is_server, NULL); + g_return_val_if_fail (m->priv->state == G_DBUS_AUTH_MECHANISM_STATE_HAVE_DATA_TO_SEND, NULL); + + g_assert (m->priv->to_send != NULL); + + m->priv->state = G_DBUS_AUTH_MECHANISM_STATE_ACCEPTED; + + return g_strdup (m->priv->to_send); +} + +static void +mechanism_client_shutdown (GDBusAuthMechanism *mechanism) +{ + GDBusAuthMechanismSha1 *m = G_DBUS_AUTH_MECHANISM_SHA1 (mechanism); + + g_return_if_fail (G_IS_DBUS_AUTH_MECHANISM_SHA1 (mechanism)); + g_return_if_fail (m->priv->is_client && !m->priv->is_server); + + m->priv->is_client = FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusauthmechanismsha1.h b/gio/gdbusauthmechanismsha1.h new file mode 100644 index 0000000..7cb08f7 --- /dev/null +++ b/gio/gdbusauthmechanismsha1.h @@ -0,0 +1,63 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_MECHANISM_SHA1_H__ +#define __G_DBUS_AUTH_MECHANISM_SHA1_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusauthmechanismsha1.h is a private header file." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH_MECHANISM_SHA1 (_g_dbus_auth_mechanism_sha1_get_type ()) +#define G_DBUS_AUTH_MECHANISM_SHA1(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH_MECHANISM_SHA1, GDBusAuthMechanismSha1)) +#define G_DBUS_AUTH_MECHANISM_SHA1_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_AUTH_MECHANISM_SHA1, GDBusAuthMechanismSha1Class)) +#define G_DBUS_AUTH_MECHANISM_SHA1_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_AUTH_MECHANISM_SHA1, GDBusAuthMechanismSha1Class)) +#define G_IS_DBUS_AUTH_MECHANISM_SHA1(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH_MECHANISM_SHA1)) +#define G_IS_DBUS_AUTH_MECHANISM_SHA1_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_AUTH_MECHANISM_SHA1)) + +typedef struct _GDBusAuthMechanismSha1 GDBusAuthMechanismSha1; +typedef struct _GDBusAuthMechanismSha1Class GDBusAuthMechanismSha1Class; +typedef struct _GDBusAuthMechanismSha1Private GDBusAuthMechanismSha1Private; + +struct _GDBusAuthMechanismSha1Class +{ + /*< private >*/ + GDBusAuthMechanismClass parent_class; +}; + +struct _GDBusAuthMechanismSha1 +{ + GDBusAuthMechanism parent_instance; + GDBusAuthMechanismSha1Private *priv; +}; + +GType _g_dbus_auth_mechanism_sha1_get_type (void) G_GNUC_CONST; + + +G_END_DECLS + +#endif /* __G_DBUS_AUTH_MECHANISM_SHA1_H__ */ diff --git a/gio/gdbusauthobserver.c b/gio/gdbusauthobserver.c new file mode 100644 index 0000000..0140c52 --- /dev/null +++ b/gio/gdbusauthobserver.c @@ -0,0 +1,280 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusauthobserver.h" +#include "gcredentials.h" +#include "gioenumtypes.h" +#include "giostream.h" +#include "gdbusprivate.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusauthobserver + * @short_description: Object used for authenticating connections + * @include: gio/gio.h + * + * The #GDBusAuthObserver type provides a mechanism for participating + * in how a #GDBusServer (or a #GDBusConnection) authenticates remote + * peers. Simply instantiate a #GDBusAuthObserver and connect to the + * signals you are interested in. Note that new signals may be added + * in the future + * + * For example, if you only want to allow D-Bus connections from + * processes owned by the same uid as the server, you would use a + * signal handler like the following: + * Controlling Authentication + * static gboolean + * on_authorize_authenticated_peer (GDBusAuthObserver *observer, + * GIOStream *stream, + * GCredentials *credentials, + * gpointer user_data) + * { + * gboolean authorized; + * + * authorized = FALSE; + * if (credentials != NULL) + * { + * GCredentials *own_credentials; + * own_credentials = g_credentials_new (); + * if (g_credentials_is_same_user (credentials, own_credentials, NULL)) + * authorized = TRUE; + * g_object_unref (own_credentials); + * } + * + * return authorized; + * } + * + */ + +typedef struct _GDBusAuthObserverClass GDBusAuthObserverClass; + +/** + * GDBusAuthObserverClass: + * @authorize_authenticated_peer: Signal class handler for the #GDBusAuthObserver::authorize-authenticated-peer signal. + * + * Class structure for #GDBusAuthObserverClass. + * + * Since: 2.26 + */ +struct _GDBusAuthObserverClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + + /* Signals */ + gboolean (*authorize_authenticated_peer) (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials); + + gboolean (*allow_mechanism) (GDBusAuthObserver *observer, + const gchar *mechanism); +}; + +/** + * GDBusAuthObserver: + * + * The #GDBusAuthObserver structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusAuthObserver +{ + GObject parent_instance; +}; + +enum +{ + AUTHORIZE_AUTHENTICATED_PEER_SIGNAL, + ALLOW_MECHANISM_SIGNAL, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +G_DEFINE_TYPE (GDBusAuthObserver, g_dbus_auth_observer, G_TYPE_OBJECT); + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_auth_observer_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_dbus_auth_observer_parent_class)->finalize (object); +} + +static gboolean +g_dbus_auth_observer_authorize_authenticated_peer_real (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials) +{ + return TRUE; +} + +static gboolean +g_dbus_auth_observer_allow_mechanism_real (GDBusAuthObserver *observer, + const gchar *mechanism) +{ + return TRUE; +} + +static void +g_dbus_auth_observer_class_init (GDBusAuthObserverClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_auth_observer_finalize; + + klass->authorize_authenticated_peer = g_dbus_auth_observer_authorize_authenticated_peer_real; + klass->allow_mechanism = g_dbus_auth_observer_allow_mechanism_real; + + /** + * GDBusAuthObserver::authorize-authenticated-peer: + * @observer: The #GDBusAuthObserver emitting the signal. + * @stream: A #GIOStream for the #GDBusConnection. + * @credentials: (allow-none): Credentials received from the peer or %NULL. + * + * Emitted to check if a peer that is successfully authenticated + * is authorized. + * + * Returns: %TRUE if the peer is authorized, %FALSE if not. + * + * Since: 2.26 + */ + signals[AUTHORIZE_AUTHENTICATED_PEER_SIGNAL] = + g_signal_new ("authorize-authenticated-peer", + G_TYPE_DBUS_AUTH_OBSERVER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusAuthObserverClass, authorize_authenticated_peer), + _g_signal_accumulator_false_handled, + NULL, /* accu_data */ + NULL, + G_TYPE_BOOLEAN, + 2, + G_TYPE_IO_STREAM, + G_TYPE_CREDENTIALS); + + /** + * GDBusAuthObserver::allow-mechanism: + * @observer: The #GDBusAuthObserver emitting the signal. + * @mechanism: The name of the mechanism, e.g. DBUS_COOKIE_SHA1. + * + * Emitted to check if @mechanism is allowed to be used. + * + * Returns: %TRUE if @mechanism can be used to authenticate the other peer, %FALSE if not. + * + * Since: 2.34 + */ + signals[ALLOW_MECHANISM_SIGNAL] = + g_signal_new ("allow-mechanism", + G_TYPE_DBUS_AUTH_OBSERVER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusAuthObserverClass, allow_mechanism), + _g_signal_accumulator_false_handled, + NULL, /* accu_data */ + NULL, + G_TYPE_BOOLEAN, + 1, + G_TYPE_STRING); +} + +static void +g_dbus_auth_observer_init (GDBusAuthObserver *observer) +{ +} + +/** + * g_dbus_auth_observer_new: + * + * Creates a new #GDBusAuthObserver object. + * + * Returns: A #GDBusAuthObserver. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusAuthObserver * +g_dbus_auth_observer_new (void) +{ + return g_object_new (G_TYPE_DBUS_AUTH_OBSERVER, NULL); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_auth_observer_authorize_authenticated_peer: + * @observer: A #GDBusAuthObserver. + * @stream: A #GIOStream for the #GDBusConnection. + * @credentials: (allow-none): Credentials received from the peer or %NULL. + * + * Emits the #GDBusAuthObserver::authorize-authenticated-peer signal on @observer. + * + * Returns: %TRUE if the peer is authorized, %FALSE if not. + * + * Since: 2.26 + */ +gboolean +g_dbus_auth_observer_authorize_authenticated_peer (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials) +{ + gboolean denied; + + denied = FALSE; + g_signal_emit (observer, + signals[AUTHORIZE_AUTHENTICATED_PEER_SIGNAL], + 0, + stream, + credentials, + &denied); + return denied; +} + +/** + * g_dbus_auth_observer_allow_mechanism: + * @observer: A #GDBusAuthObserver. + * @mechanism: The name of the mechanism, e.g. DBUS_COOKIE_SHA1. + * + * Emits the #GDBusAuthObserver::allow-mechanism signal on @observer. + * + * Returns: %TRUE if @mechanism can be used to authenticate the other peer, %FALSE if not. + * + * Since: 2.34 + */ +gboolean +g_dbus_auth_observer_allow_mechanism (GDBusAuthObserver *observer, + const gchar *mechanism) +{ + gboolean ret; + + ret = FALSE; + g_signal_emit (observer, + signals[ALLOW_MECHANISM_SIGNAL], + 0, + mechanism, + &ret); + return ret; +} + diff --git a/gio/gdbusauthobserver.h b/gio/gdbusauthobserver.h new file mode 100644 index 0000000..bc61c53 --- /dev/null +++ b/gio/gdbusauthobserver.h @@ -0,0 +1,53 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_AUTH_OBSERVER_H__ +#define __G_DBUS_AUTH_OBSERVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_AUTH_OBSERVER (g_dbus_auth_observer_get_type ()) +#define G_DBUS_AUTH_OBSERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_AUTH_OBSERVER, GDBusAuthObserver)) +#define G_IS_DBUS_AUTH_OBSERVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_AUTH_OBSERVER)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_auth_observer_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusAuthObserver *g_dbus_auth_observer_new (void); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_auth_observer_authorize_authenticated_peer (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials); + +GLIB_AVAILABLE_IN_2_34 +gboolean g_dbus_auth_observer_allow_mechanism (GDBusAuthObserver *observer, + const gchar *mechanism); + +G_END_DECLS + +#endif /* _G_DBUS_AUTH_OBSERVER_H__ */ diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c new file mode 100644 index 0000000..f4c63a9 --- /dev/null +++ b/gio/gdbusconnection.c @@ -0,0 +1,7016 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +/* + * TODO for GDBus: + * + * - would be nice to expose GDBusAuthMechanism and an extension point + * + * - Need to rewrite GDBusAuth and rework GDBusAuthMechanism. In particular + * the mechanism VFuncs need to be able to set an error. + * + * - Need to document other mechanisms/sources for determining the D-Bus + * address of a well-known bus. + * + * - e.g. on Win32 we need code like from here + * + * http://cgit.freedesktop.org/~david/gdbus-standalone/tree/gdbus/gdbusaddress.c#n900 + * + * that was never copied over here because it originally was copy-paste + * from the GPLv2 / AFL 2.1 libdbus sources. + * + * - on OS X we need to look in launchd for the address + * + * https://bugs.freedesktop.org/show_bug.cgi?id=14259 + * + * - on X11 we need to look in a X11 property on the X server + * - (we can also just use dbus-launch(1) from the D-Bus + * distribution) + * + * - (ideally) this requires D-Bus spec work because none of + * this has never really been specced out properly (except + * the X11 bits) + * + * - Related to the above, we also need to be able to launch a message bus + * instance.... Since we don't want to write our own bus daemon we should + * launch dbus-daemon(1) (thus: Win32 and OS X need to bundle it) + * + * - probably want a G_DBUS_NONCE_TCP_TMPDIR environment variable + * to specify where the nonce is stored. This will allow people to use + * G_DBUS_NONCE_TCP_TMPDIR=/mnt/secure.company.server/dbus-nonce-dir + * to easily achieve secure RPC via nonce-tcp. + * + * - need to expose an extension point for resolving D-Bus address and + * turning them into GIOStream objects. This will allow us to implement + * e.g. X11 D-Bus transports without dlopen()'ing or linking against + * libX11 from libgio. + * - see g_dbus_address_connect() in gdbusaddress.c + * + * - would be cute to use kernel-specific APIs to resolve fds for + * debug output when using G_DBUS_DEBUG=message, e.g. in addition to + * + * fd 21: dev=8:1,mode=0100644,ino=1171231,uid=0,gid=0,rdev=0:0,size=234,atime=1273070640,mtime=1267126160,ctime=1267126160 + * + * maybe we can show more information about what fd 21 really is. + * Ryan suggests looking in /proc/self/fd for clues / symlinks! + * Initial experiments on Linux 2.6 suggests that the symlink looks + * like this: + * + * 3 -> /proc/18068/fd + * + * e.g. not of much use. + * + * - GDBus High-Level docs + * - Proxy: properties, signals... + * - Connection: IOStream based, ::close, connection setup steps + * mainloop integration, threading + * - Differences from libdbus (extend "Migrating from") + * - the message handling thread + * - Using GVariant instead of GValue + * - Explain why the high-level API is a good thing and what + * kind of pitfalls it avoids + * - Export objects before claiming names + * - Talk about auto-starting services (cf. GBusNameWatcherFlags) + * + * - use abstract sockets in test code + * - right now it doesn't work, dbus-daemon(1) fails with + * + * /gdbus/connection/filter: Failed to start message bus: Failed to bind + * socket "/tmp/g-dbus-tests-pid-28531": Address already in use + * ** WARNING **: Error reading address from dbus daemon, 0 bytes read + * + * or similar. + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gdbusauth.h" +#include "gdbusutils.h" +#include "gdbusaddress.h" +#include "gdbusmessage.h" +#include "gdbusconnection.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" +#include "gdbusintrospection.h" +#include "gdbusmethodinvocation.h" +#include "gdbusprivate.h" +#include "gdbusauthobserver.h" +#include "ginitable.h" +#include "gasyncinitable.h" +#include "giostream.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" + +#ifdef G_OS_UNIX +#include "gunixconnection.h" +#include "gunixfdmessage.h" +#endif + +#include "glibintl.h" + +/** + * SECTION:gdbusconnection + * @short_description: D-Bus Connections + * @include: gio/gio.h + * + * The #GDBusConnection type is used for D-Bus connections to remote + * peers such as a message buses. It is a low-level API that offers a + * lot of flexibility. For instance, it lets you establish a connection + * over any transport that can by represented as an #GIOStream. + * + * This class is rarely used directly in D-Bus clients. If you are writing + * an D-Bus client, it is often easier to use the g_bus_own_name(), + * g_bus_watch_name() or g_dbus_proxy_new_for_bus() APIs. + * + * As an exception to the usual GLib rule that a particular object must not be + * used by two threads at the same time, #GDBusConnection's methods may be + * called from any thread + * + * This is so that g_bus_get() and g_bus_get_sync() can safely return the + * same #GDBusConnection when called from any thread. + * + * . + * + * Most of the ways to obtain a #GDBusConnection automatically initialize it + * (i.e. connect to D-Bus): for instance, g_dbus_connection_new() and + * g_bus_get(), and the synchronous versions of those methods, give you an + * initialized connection. Language bindings for GIO should use + * g_initable_new() or g_async_initable_new_async(), which also initialize the + * connection. + * + * If you construct an uninitialized #GDBusConnection, such as via + * g_object_new(), you must initialize it via g_initable_init() or + * g_async_initable_init_async() before using its methods or properties. + * Calling methods or accessing properties on a #GDBusConnection that has not + * completed initialization successfully is considered to be invalid, and leads + * to undefined behaviour. In particular, if initialization fails with a + * #GError, the only valid thing you can do with that #GDBusConnection is to + * free it with g_object_unref(). + * + * D-Bus server exampleFIXME: MISSING XINCLUDE CONTENT + * + * D-Bus subtree exampleFIXME: MISSING XINCLUDE CONTENT + * + * D-Bus UNIX File Descriptor exampleFIXME: MISSING XINCLUDE CONTENT + * + * Exporting a GObjectFIXME: MISSING XINCLUDE CONTENT + */ + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct _GDBusConnectionClass GDBusConnectionClass; + +/** + * GDBusConnectionClass: + * @closed: Signal class handler for the #GDBusConnection::closed signal. + * + * Class structure for #GDBusConnection. + * + * Since: 2.26 + */ +struct _GDBusConnectionClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Signals */ + void (*closed) (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error); +}; + +G_LOCK_DEFINE_STATIC (message_bus_lock); + +static GWeakRef the_session_bus; +static GWeakRef the_system_bus; + +/* Extra pseudo-member of GDBusSendMessageFlags. + * Set by initable_init() to indicate that despite not being initialized yet, + * enough of the only-valid-after-init members are set that we can send a + * message, and we're being called from its thread, so no memory barrier is + * required before accessing them. + */ +#define SEND_MESSAGE_FLAGS_INITIALIZING (1<<31) + +/* Same as SEND_MESSAGE_FLAGS_INITIALIZING, but in GDBusCallFlags */ +#define CALL_FLAGS_INITIALIZING (1<<31) + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDestroyNotify callback; + gpointer user_data; + GMainContext *context; +} CallDestroyNotifyData; + +static gboolean +call_destroy_notify_data_in_idle (gpointer user_data) +{ + CallDestroyNotifyData *data = user_data; + data->callback (data->user_data); + return FALSE; +} + +static void +call_destroy_notify_data_free (CallDestroyNotifyData *data) +{ + if (data->context != NULL) + g_main_context_unref (data->context); + g_free (data); +} + +/* + * call_destroy_notify: + * @context: (allow-none): A #GMainContext or %NULL. + * @callback: (allow-none): A #GDestroyNotify or %NULL. + * @user_data: Data to pass to @callback. + * + * Schedules @callback to run in @context. + */ +static void +call_destroy_notify (GMainContext *context, + GDestroyNotify callback, + gpointer user_data) +{ + GSource *idle_source; + CallDestroyNotifyData *data; + + if (callback == NULL) + goto out; + + data = g_new0 (CallDestroyNotifyData, 1); + data->callback = callback; + data->user_data = user_data; + data->context = context; + if (data->context != NULL) + g_main_context_ref (data->context); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + call_destroy_notify_data_in_idle, + data, + (GDestroyNotify) call_destroy_notify_data_free); + g_source_attach (idle_source, data->context); + g_source_unref (idle_source); + + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +_g_strv_has_string (const gchar* const *haystack, + const gchar *needle) +{ + guint n; + + for (n = 0; haystack != NULL && haystack[n] != NULL; n++) + { + if (g_strcmp0 (haystack[n], needle) == 0) + return TRUE; + } + return FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_WIN32 +#define CONNECTION_ENSURE_LOCK(obj) do { ; } while (FALSE) +#else +// TODO: for some reason this doesn't work on Windows +#define CONNECTION_ENSURE_LOCK(obj) do { \ + if (G_UNLIKELY (g_mutex_trylock(&(obj)->lock))) \ + { \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + "CONNECTION_ENSURE_LOCK: GDBusConnection object lock is not locked"); \ + } \ + } while (FALSE) +#endif + +#define CONNECTION_LOCK(obj) do { \ + g_mutex_lock (&(obj)->lock); \ + } while (FALSE) + +#define CONNECTION_UNLOCK(obj) do { \ + g_mutex_unlock (&(obj)->lock); \ + } while (FALSE) + +/* Flags in connection->atomic_flags */ +enum { + FLAG_INITIALIZED = 1 << 0, + FLAG_EXIT_ON_CLOSE = 1 << 1, + FLAG_CLOSED = 1 << 2 +}; + +/** + * GDBusConnection: + * + * The #GDBusConnection structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusConnection +{ + /*< private >*/ + GObject parent_instance; + + /* ------------------------------------------------------------------------ */ + /* -- General object state ------------------------------------------------ */ + /* ------------------------------------------------------------------------ */ + + /* General-purpose lock for most fields */ + GMutex lock; + + /* A lock used in the init() method of the GInitable interface - see comments + * in initable_init() for why a separate lock is needed. + * + * If you need both @lock and @init_lock, you must take @init_lock first. + */ + GMutex init_lock; + + /* Set (by loading the contents of /var/lib/dbus/machine-id) the first time + * someone calls org.freedesktop.DBus.GetMachineId(). Protected by @lock. + */ + gchar *machine_id; + + /* The underlying stream used for communication + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + GIOStream *stream; + + /* The object used for authentication (if any). + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + GDBusAuth *auth; + + /* Last serial used. Protected by @lock. */ + guint32 last_serial; + + /* The object used to send/receive messages. + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + GDBusWorker *worker; + + /* If connected to a message bus, this contains the unique name assigned to + * us by the bus (e.g. ":1.42"). + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + gchar *bus_unique_name; + + /* The GUID returned by the other side if we authenticed as a client or + * the GUID to use if authenticating as a server. + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + gchar *guid; + + /* FLAG_INITIALIZED is set exactly when initable_init() has finished running. + * Inspect @initialization_error to see whether it succeeded or failed. + * + * FLAG_EXIT_ON_CLOSE is the exit-on-close property. + * + * FLAG_CLOSED is the closed property. It may be read at any time, but + * may only be written while holding @lock. + */ + volatile gint atomic_flags; + + /* If the connection could not be established during initable_init(), + * this GError will be set. + * Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + GError *initialization_error; + + /* The result of g_main_context_ref_thread_default() when the object + * was created (the GObject _init() function) - this is used for delivery + * of the :closed GObject signal. + * + * Only set in the GObject init function, so no locks are needed. + */ + GMainContext *main_context_at_construction; + + /* Read-only construct properties, no locks needed */ + gchar *address; + GDBusConnectionFlags flags; + + /* Map used for managing method replies, protected by @lock */ + GHashTable *map_method_serial_to_send_message_data; /* guint32 -> SendMessageData* */ + + /* Maps used for managing signal subscription, protected by @lock */ + GHashTable *map_rule_to_signal_data; /* match rule (gchar*) -> SignalData */ + GHashTable *map_id_to_signal_data; /* id (guint) -> SignalData */ + GHashTable *map_sender_unique_name_to_signal_data_array; /* unique sender (gchar*) -> GPtrArray* of SignalData */ + + /* Maps used for managing exported objects and subtrees, + * protected by @lock + */ + GHashTable *map_object_path_to_eo; /* gchar* -> ExportedObject* */ + GHashTable *map_id_to_ei; /* guint -> ExportedInterface* */ + GHashTable *map_object_path_to_es; /* gchar* -> ExportedSubtree* */ + GHashTable *map_id_to_es; /* guint -> ExportedSubtree* */ + + /* Map used for storing last used serials for each thread, protected by @lock */ + GHashTable *map_thread_to_last_serial; + + /* Structure used for message filters, protected by @lock */ + GPtrArray *filters; + + /* Capabilities negotiated during authentication + * Read-only after initable_init(), so it may be read without holding a + * lock, if you check for initialization first. + */ + GDBusCapabilityFlags capabilities; + + /* Protected by @init_lock */ + GDBusAuthObserver *authentication_observer; + + /* Read-only after initable_init(), so it may be read if you either + * hold @init_lock or check for initialization first. + */ + GCredentials *credentials; + + /* set to TRUE when finalizing */ + gboolean finalizing; +}; + +typedef struct ExportedObject ExportedObject; +static void exported_object_free (ExportedObject *eo); + +typedef struct ExportedSubtree ExportedSubtree; +static void exported_subtree_free (ExportedSubtree *es); + +enum +{ + CLOSED_SIGNAL, + LAST_SIGNAL, +}; + +enum +{ + PROP_0, + PROP_STREAM, + PROP_ADDRESS, + PROP_FLAGS, + PROP_GUID, + PROP_UNIQUE_NAME, + PROP_CLOSED, + PROP_EXIT_ON_CLOSE, + PROP_CAPABILITY_FLAGS, + PROP_AUTHENTICATION_OBSERVER, +}; + +static void distribute_signals (GDBusConnection *connection, + GDBusMessage *message); + +static void distribute_method_call (GDBusConnection *connection, + GDBusMessage *message); + +static gboolean handle_generic_unlocked (GDBusConnection *connection, + GDBusMessage *message); + + +static void purge_all_signal_subscriptions (GDBusConnection *connection); +static void purge_all_filters (GDBusConnection *connection); + +#define _G_ENSURE_LOCK(name) do { \ + if (G_UNLIKELY (G_TRYLOCK(name))) \ + { \ + g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + "_G_ENSURE_LOCK: Lock `" #name "' is not locked"); \ + } \ + } while (FALSE) \ + +static guint signals[LAST_SIGNAL] = { 0 }; + +static void initable_iface_init (GInitableIface *initable_iface); +static void async_initable_iface_init (GAsyncInitableIface *async_initable_iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusConnection, g_dbus_connection, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init) + ); + +/* + * Check that all members of @connection that can only be accessed after + * the connection is initialized can safely be accessed. If not, + * log a critical warning. This function is a memory barrier. + * + * Returns: %TRUE if initialized + */ +static gboolean +check_initialized (GDBusConnection *connection) +{ + /* The access to @atomic_flags isn't conditional, so that this function + * provides a memory barrier for thread-safety even if checks are disabled. + * (If you don't want this stricter guarantee, you can call + * g_return_if_fail (check_initialized (c)).) + * + * This isn't strictly necessary now that we've decided use of an + * uninitialized GDBusConnection is undefined behaviour, but it seems + * better to be as deterministic as is feasible. + * + * (Anything that could suffer a crash from seeing undefined values + * must have a race condition - thread A initializes the connection while + * thread B calls a method without initialization, hoping that thread A will + * win the race - so its behaviour is undefined anyway.) + */ + gint flags = g_atomic_int_get (&connection->atomic_flags); + + g_return_val_if_fail (flags & FLAG_INITIALIZED, FALSE); + + /* We can safely access this, due to the memory barrier above */ + g_return_val_if_fail (connection->initialization_error == NULL, FALSE); + + return TRUE; +} + +typedef enum { + MAY_BE_UNINITIALIZED = (1<<1) +} CheckUnclosedFlags; + +/* + * Check the same thing as check_initialized(), and also that the + * connection is not closed. If the connection is uninitialized, + * raise a critical warning (it's programmer error); if it's closed, + * raise a recoverable GError (it's a runtime error). + * + * This function is a memory barrier. + * + * Returns: %TRUE if initialized and not closed + */ +static gboolean +check_unclosed (GDBusConnection *connection, + CheckUnclosedFlags check, + GError **error) +{ + /* check_initialized() is effectively inlined, so we don't waste time + * doing two memory barriers + */ + gint flags = g_atomic_int_get (&connection->atomic_flags); + + if (!(check & MAY_BE_UNINITIALIZED)) + { + g_return_val_if_fail (flags & FLAG_INITIALIZED, FALSE); + g_return_val_if_fail (connection->initialization_error == NULL, FALSE); + } + + if (flags & FLAG_CLOSED) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_CLOSED, + _("The connection is closed")); + return FALSE; + } + + return TRUE; +} + +static GHashTable *alive_connections = NULL; + +static void +g_dbus_connection_dispose (GObject *object) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (object); + + G_LOCK (message_bus_lock); + CONNECTION_LOCK (connection); + if (connection->worker != NULL) + { + _g_dbus_worker_stop (connection->worker); + connection->worker = NULL; + if (alive_connections != NULL) + g_warn_if_fail (g_hash_table_remove (alive_connections, connection)); + } + else + { + if (alive_connections != NULL) + g_warn_if_fail (g_hash_table_lookup (alive_connections, connection) == NULL); + } + CONNECTION_UNLOCK (connection); + G_UNLOCK (message_bus_lock); + + if (G_OBJECT_CLASS (g_dbus_connection_parent_class)->dispose != NULL) + G_OBJECT_CLASS (g_dbus_connection_parent_class)->dispose (object); +} + +static void +g_dbus_connection_finalize (GObject *object) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (object); + + connection->finalizing = TRUE; + + purge_all_signal_subscriptions (connection); + + purge_all_filters (connection); + g_ptr_array_unref (connection->filters); + + if (connection->authentication_observer != NULL) + g_object_unref (connection->authentication_observer); + + if (connection->auth != NULL) + g_object_unref (connection->auth); + + if (connection->credentials) + g_object_unref (connection->credentials); + + if (connection->stream != NULL) + { + g_object_unref (connection->stream); + connection->stream = NULL; + } + + g_free (connection->address); + + g_free (connection->guid); + g_free (connection->bus_unique_name); + + if (connection->initialization_error != NULL) + g_error_free (connection->initialization_error); + + g_hash_table_unref (connection->map_method_serial_to_send_message_data); + + g_hash_table_unref (connection->map_rule_to_signal_data); + g_hash_table_unref (connection->map_id_to_signal_data); + g_hash_table_unref (connection->map_sender_unique_name_to_signal_data_array); + + g_hash_table_unref (connection->map_id_to_ei); + g_hash_table_unref (connection->map_object_path_to_eo); + g_hash_table_unref (connection->map_id_to_es); + g_hash_table_unref (connection->map_object_path_to_es); + + g_hash_table_unref (connection->map_thread_to_last_serial); + + g_main_context_unref (connection->main_context_at_construction); + + g_free (connection->machine_id); + + g_mutex_clear (&connection->init_lock); + g_mutex_clear (&connection->lock); + + G_OBJECT_CLASS (g_dbus_connection_parent_class)->finalize (object); +} + +/* called in any user thread, with the connection's lock not held */ +static void +g_dbus_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (object); + + switch (prop_id) + { + case PROP_STREAM: + g_value_set_object (value, g_dbus_connection_get_stream (connection)); + break; + + case PROP_GUID: + g_value_set_string (value, g_dbus_connection_get_guid (connection)); + break; + + case PROP_UNIQUE_NAME: + g_value_set_string (value, g_dbus_connection_get_unique_name (connection)); + break; + + case PROP_CLOSED: + g_value_set_boolean (value, g_dbus_connection_is_closed (connection)); + break; + + case PROP_EXIT_ON_CLOSE: + g_value_set_boolean (value, g_dbus_connection_get_exit_on_close (connection)); + break; + + case PROP_CAPABILITY_FLAGS: + g_value_set_flags (value, g_dbus_connection_get_capabilities (connection)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* called in any user thread, with the connection's lock not held */ +static void +g_dbus_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (object); + + switch (prop_id) + { + case PROP_STREAM: + connection->stream = g_value_dup_object (value); + break; + + case PROP_GUID: + connection->guid = g_value_dup_string (value); + break; + + case PROP_ADDRESS: + connection->address = g_value_dup_string (value); + break; + + case PROP_FLAGS: + connection->flags = g_value_get_flags (value); + break; + + case PROP_EXIT_ON_CLOSE: + g_dbus_connection_set_exit_on_close (connection, g_value_get_boolean (value)); + break; + + case PROP_AUTHENTICATION_OBSERVER: + connection->authentication_observer = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* Base-class implementation of GDBusConnection::closed. + * + * Called in a user thread, by the main context that was thread-default when + * the object was constructed. + */ +static void +g_dbus_connection_real_closed (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error) +{ + gint flags = g_atomic_int_get (&connection->atomic_flags); + + /* Because atomic int access is a memory barrier, we can safely read + * initialization_error without a lock, as long as we do it afterwards. + */ + if (remote_peer_vanished && + (flags & FLAG_EXIT_ON_CLOSE) != 0 && + (flags & FLAG_INITIALIZED) != 0 && + connection->initialization_error == NULL) + { + if (error != NULL) + { + g_print ("%s: Remote peer vanished with error: %s (%s, %d). Exiting.\n", + G_STRFUNC, + error->message, + g_quark_to_string (error->domain), error->code); + } + else + { + g_print ("%s: Remote peer vanished. Exiting.\n", G_STRFUNC); + } + raise (SIGTERM); + } +} + +static void +g_dbus_connection_class_init (GDBusConnectionClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_connection_finalize; + gobject_class->dispose = g_dbus_connection_dispose; + gobject_class->set_property = g_dbus_connection_set_property; + gobject_class->get_property = g_dbus_connection_get_property; + + klass->closed = g_dbus_connection_real_closed; + + /** + * GDBusConnection:stream: + * + * The underlying #GIOStream used for I/O. + * + * If this is passed on construction and is a #GSocketConnection, + * then the corresponding #GSocket will be put into non-blocking mode. + * + * While the #GDBusConnection is active, it will interact with this + * stream from a worker thread, so it is not safe to interact with + * the stream directly. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_STREAM, + g_param_spec_object ("stream", + P_("IO Stream"), + P_("The underlying streams used for I/O"), + G_TYPE_IO_STREAM, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:address: + * + * A D-Bus address specifying potential endpoints that can be used + * when establishing the connection. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_ADDRESS, + g_param_spec_string ("address", + P_("Address"), + P_("D-Bus address specifying potential socket endpoints"), + NULL, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:flags: + * + * Flags from the #GDBusConnectionFlags enumeration. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Flags"), + P_("Flags"), + G_TYPE_DBUS_CONNECTION_FLAGS, + G_DBUS_CONNECTION_FLAGS_NONE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:guid: + * + * The GUID of the peer performing the role of server when + * authenticating. + * + * If you are constructing a #GDBusConnection and pass + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER in the + * #GDBusConnection:flags property then you MUST also set this + * property to a valid guid. + * + * If you are constructing a #GDBusConnection and pass + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT in the + * #GDBusConnection:flags property you will be able to read the GUID + * of the other peer here after the connection has been successfully + * initialized. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_GUID, + g_param_spec_string ("guid", + P_("GUID"), + P_("GUID of the server peer"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:unique-name: + * + * The unique name as assigned by the message bus or %NULL if the + * connection is not open or not a message bus connection. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_UNIQUE_NAME, + g_param_spec_string ("unique-name", + P_("unique-name"), + P_("Unique name of bus connection"), + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:closed: + * + * A boolean specifying whether the connection has been closed. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSED, + g_param_spec_boolean ("closed", + P_("Closed"), + P_("Whether the connection is closed"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:exit-on-close: + * + * A boolean specifying whether the process will be terminated (by + * calling raise(SIGTERM)) if the connection + * is closed by the remote peer. + * + * Note that #GDBusConnection objects returned by g_bus_get_finish() and + * g_bus_get_sync() will (usually) have this property set to %TRUE. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_EXIT_ON_CLOSE, + g_param_spec_boolean ("exit-on-close", + P_("Exit on close"), + P_("Whether the process is terminated when the connection is closed"), + FALSE, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:capabilities: + * + * Flags from the #GDBusCapabilityFlags enumeration + * representing connection features negotiated with the other peer. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CAPABILITY_FLAGS, + g_param_spec_flags ("capabilities", + P_("Capabilities"), + P_("Capabilities"), + G_TYPE_DBUS_CAPABILITY_FLAGS, + G_DBUS_CAPABILITY_FLAGS_NONE, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection:authentication-observer: + * + * A #GDBusAuthObserver object to assist in the authentication process or %NULL. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_AUTHENTICATION_OBSERVER, + g_param_spec_object ("authentication-observer", + P_("Authentication Observer"), + P_("Object used to assist in the authentication process"), + G_TYPE_DBUS_AUTH_OBSERVER, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusConnection::closed: + * @connection: The #GDBusConnection emitting the signal. + * @remote_peer_vanished: %TRUE if @connection is closed because the + * remote peer closed its end of the connection. + * @error: (allow-none): A #GError with more details about the event or %NULL. + * + * Emitted when the connection is closed. + * + * The cause of this event can be + * + * + * If g_dbus_connection_close() is called. In this case + * @remote_peer_vanished is set to %FALSE and @error is %NULL. + * + * + * If the remote peer closes the connection. In this case + * @remote_peer_vanished is set to %TRUE and @error is set. + * + * + * If the remote peer sends invalid or malformed data. In this + * case @remote_peer_vanished is set to %FALSE and @error + * is set. + * + * + * + * Upon receiving this signal, you should give up your reference to + * @connection. You are guaranteed that this signal is emitted only + * once. + * + * Since: 2.26 + */ + signals[CLOSED_SIGNAL] = g_signal_new ("closed", + G_TYPE_DBUS_CONNECTION, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusConnectionClass, closed), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 2, + G_TYPE_BOOLEAN, + G_TYPE_ERROR); +} + +static void +g_dbus_connection_init (GDBusConnection *connection) +{ + g_mutex_init (&connection->lock); + g_mutex_init (&connection->init_lock); + + connection->map_method_serial_to_send_message_data = g_hash_table_new (g_direct_hash, g_direct_equal); + + connection->map_rule_to_signal_data = g_hash_table_new (g_str_hash, + g_str_equal); + connection->map_id_to_signal_data = g_hash_table_new (g_direct_hash, + g_direct_equal); + connection->map_sender_unique_name_to_signal_data_array = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_ptr_array_unref); + + connection->map_object_path_to_eo = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) exported_object_free); + + connection->map_id_to_ei = g_hash_table_new (g_direct_hash, + g_direct_equal); + + connection->map_object_path_to_es = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) exported_subtree_free); + + connection->map_id_to_es = g_hash_table_new (g_direct_hash, + g_direct_equal); + + connection->map_thread_to_last_serial = g_hash_table_new (g_direct_hash, + g_direct_equal); + + connection->main_context_at_construction = g_main_context_ref_thread_default (); + + connection->filters = g_ptr_array_new (); +} + +/** + * g_dbus_connection_get_stream: + * @connection: a #GDBusConnection + * + * Gets the underlying stream used for IO. + * + * While the #GDBusConnection is active, it will interact with this + * stream from a worker thread, so it is not safe to interact with + * the stream directly. + * + * Returns: (transfer none): the stream used for IO + * + * Since: 2.26 + */ +GIOStream * +g_dbus_connection_get_stream (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return NULL; + + return connection->stream; +} + +/** + * g_dbus_connection_start_message_processing: + * @connection: A #GDBusConnection. + * + * If @connection was created with + * %G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, this method + * starts processing messages. Does nothing on if @connection wasn't + * created with this flag or if the method has already been called. + * + * Since: 2.26 + */ +void +g_dbus_connection_start_message_processing (GDBusConnection *connection) +{ + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return; + + g_assert (connection->worker != NULL); + _g_dbus_worker_unfreeze (connection->worker); +} + +/** + * g_dbus_connection_is_closed: + * @connection: A #GDBusConnection. + * + * Gets whether @connection is closed. + * + * Returns: %TRUE if the connection is closed, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_is_closed (GDBusConnection *connection) +{ + gint flags; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + + flags = g_atomic_int_get (&connection->atomic_flags); + + return (flags & FLAG_CLOSED) ? TRUE : FALSE; +} + +/** + * g_dbus_connection_get_capabilities: + * @connection: A #GDBusConnection. + * + * Gets the capabilities negotiated with the remote peer + * + * Returns: Zero or more flags from the #GDBusCapabilityFlags enumeration. + * + * Since: 2.26 + */ +GDBusCapabilityFlags +g_dbus_connection_get_capabilities (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), G_DBUS_CAPABILITY_FLAGS_NONE); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return G_DBUS_CAPABILITY_FLAGS_NONE; + + return connection->capabilities; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called in a temporary thread without holding locks. */ +static void +flush_in_thread_func (GSimpleAsyncResult *res, + GObject *object, + GCancellable *cancellable) +{ + GError *error; + + error = NULL; + if (!g_dbus_connection_flush_sync (G_DBUS_CONNECTION (object), + cancellable, + &error)) + g_simple_async_result_take_error (res, error); +} + +/** + * g_dbus_connection_flush: + * @connection: A #GDBusConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is + * satisfied or %NULL if you don't care about the result. + * @user_data: The data to pass to @callback. + * + * Asynchronously flushes @connection, that is, writes all queued + * outgoing message to the transport and then flushes the transport + * (using g_output_stream_flush_async()). This is useful in programs + * that wants to emit a D-Bus signal and then exit + * immediately. Without flushing the connection, there is no guarantee + * that the message has been sent to the networking buffers in the OS + * kernel. + * + * This is an asynchronous method. When the operation is finished, + * @callback will be invoked in the thread-default main + * loop of the thread you are calling this method from. You can + * then call g_dbus_connection_flush_finish() to get the result of the + * operation. See g_dbus_connection_flush_sync() for the synchronous + * version. + * + * Since: 2.26 + */ +void +g_dbus_connection_flush (GDBusConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + + simple = g_simple_async_result_new (G_OBJECT (connection), + callback, + user_data, + g_dbus_connection_flush); + g_simple_async_result_set_check_cancellable (simple, cancellable); + g_simple_async_result_run_in_thread (simple, + flush_in_thread_func, + G_PRIORITY_DEFAULT, + cancellable); + g_object_unref (simple); +} + +/** + * g_dbus_connection_flush_finish: + * @connection: A #GDBusConnection. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_flush(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_flush(). + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_flush_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gboolean ret; + + ret = FALSE; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_dbus_connection_flush); + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + ret = TRUE; + + out: + return ret; +} + +/** + * g_dbus_connection_flush_sync: + * @connection: A #GDBusConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously flushes @connection. The calling thread is blocked + * until this is done. See g_dbus_connection_flush() for the + * asynchronous version of this method and more details about what it + * does. + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_flush_sync (GDBusConnection *connection, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + + /* This is only a best-effort attempt to see whether the connection is + * closed, so it doesn't need the lock. If the connection closes just + * after this check, but before scheduling the flush operation, the + * result will be more or less the same as if the connection closed while + * the flush operation was pending - it'll fail with either CLOSED or + * CANCELLED. + */ + if (!check_unclosed (connection, 0, error)) + goto out; + + g_assert (connection->worker != NULL); + + ret = _g_dbus_worker_flush_sync (connection->worker, + cancellable, + error); + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusConnection *connection; + GError *error; + gboolean remote_peer_vanished; +} EmitClosedData; + +static void +emit_closed_data_free (EmitClosedData *data) +{ + g_object_unref (data->connection); + if (data->error != NULL) + g_error_free (data->error); + g_free (data); +} + +/* Called in a user thread that has acquired the main context that was + * thread-default when the object was constructed + */ +static gboolean +emit_closed_in_idle (gpointer user_data) +{ + EmitClosedData *data = user_data; + gboolean result; + + g_object_notify (G_OBJECT (data->connection), "closed"); + g_signal_emit (data->connection, + signals[CLOSED_SIGNAL], + 0, + data->remote_peer_vanished, + data->error, + &result); + return FALSE; +} + +/* Can be called from any thread, must hold lock. + * FLAG_CLOSED must already have been set. + */ +static void +schedule_closed_unlocked (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error) +{ + GSource *idle_source; + EmitClosedData *data; + + CONNECTION_ENSURE_LOCK (connection); + + data = g_new0 (EmitClosedData, 1); + data->connection = g_object_ref (connection); + data->remote_peer_vanished = remote_peer_vanished; + data->error = error != NULL ? g_error_copy (error) : NULL; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + emit_closed_in_idle, + data, + (GDestroyNotify) emit_closed_data_free); + g_source_attach (idle_source, connection->main_context_at_construction); + g_source_unref (idle_source); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_close: + * @connection: A #GDBusConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is + * satisfied or %NULL if you don't care about the result. + * @user_data: The data to pass to @callback. + * + * Closes @connection. Note that this never causes the process to + * exit (this might only happen if the other end of a shared message + * bus connection disconnects, see #GDBusConnection:exit-on-close). + * + * Once the connection is closed, operations such as sending a message + * will return with the error %G_IO_ERROR_CLOSED. Closing a connection + * will not automatically flush the connection so queued messages may + * be lost. Use g_dbus_connection_flush() if you need such guarantees. + * + * If @connection is already closed, this method fails with + * %G_IO_ERROR_CLOSED. + * + * When @connection has been closed, the #GDBusConnection::closed + * signal is emitted in the thread-default main + * loop of the thread that @connection was constructed in. + * + * This is an asynchronous method. When the operation is finished, + * @callback will be invoked in the thread-default main + * loop of the thread you are calling this method from. You can + * then call g_dbus_connection_close_finish() to get the result of the + * operation. See g_dbus_connection_close_sync() for the synchronous + * version. + * + * Since: 2.26 + */ +void +g_dbus_connection_close (GDBusConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return; + + g_assert (connection->worker != NULL); + + simple = g_simple_async_result_new (G_OBJECT (connection), + callback, + user_data, + g_dbus_connection_close); + g_simple_async_result_set_check_cancellable (simple, cancellable); + _g_dbus_worker_close (connection->worker, cancellable, simple); + g_object_unref (simple); +} + +/** + * g_dbus_connection_close_finish: + * @connection: A #GDBusConnection. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_close(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_close(). + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_close_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + gboolean ret; + + ret = FALSE; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_dbus_connection_close); + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + ret = TRUE; + + out: + return ret; +} + +typedef struct { + GMainLoop *loop; + GAsyncResult *result; +} SyncCloseData; + +/* Can be called by any thread, without the connection lock */ +static void +sync_close_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + SyncCloseData *data = user_data; + + data->result = g_object_ref (res); + g_main_loop_quit (data->loop); +} + +/** + * g_dbus_connection_close_sync: + * @connection: A #GDBusConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously closees @connection. The calling thread is blocked + * until this is done. See g_dbus_connection_close() for the + * asynchronous version of this method and more details about what it + * does. + * + * Returns: %TRUE if the operation succeeded, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_close_sync (GDBusConnection *connection, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + + if (check_unclosed (connection, 0, error)) + { + GMainContext *context; + SyncCloseData data; + + context = g_main_context_new (); + g_main_context_push_thread_default (context); + data.loop = g_main_loop_new (context, TRUE); + data.result = NULL; + + g_dbus_connection_close (connection, cancellable, sync_close_cb, &data); + g_main_loop_run (data.loop); + ret = g_dbus_connection_close_finish (connection, data.result, error); + + g_object_unref (data.result); + g_main_loop_unref (data.loop); + g_main_context_pop_thread_default (context); + g_main_context_unref (context); + } + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_get_last_serial: + * @connection: A #GDBusConnection. + * + * Retrieves the last serial number assigned to a #GDBusMessage on + * the current thread. This includes messages sent via both low-level + * API such as g_dbus_connection_send_message() as well as + * high-level API such as g_dbus_connection_emit_signal(), + * g_dbus_connection_call() or g_dbus_proxy_call(). + * + * Returns: the last used serial or zero when no message has been sent + * within the current thread. + * + * Since: 2.34 + */ +guint32 +g_dbus_connection_get_last_serial (GDBusConnection *connection) +{ + guint32 ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + + CONNECTION_LOCK (connection); + ret = GPOINTER_TO_UINT (g_hash_table_lookup (connection->map_thread_to_last_serial, + g_thread_self ())); + CONNECTION_UNLOCK (connection); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Can be called by any thread, with the connection lock held */ +static gboolean +g_dbus_connection_send_message_unlocked (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + volatile guint32 *out_serial, + GError **error) +{ + guchar *blob; + gsize blob_size; + guint32 serial_to_use; + gboolean ret; + + CONNECTION_ENSURE_LOCK (connection); + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); + + /* TODO: check all necessary headers are present */ + + ret = FALSE; + blob = NULL; + + if (out_serial != NULL) + *out_serial = 0; + + /* If we're in initable_init(), don't check for being initialized, to avoid + * chicken-and-egg problems. initable_init() is responsible for setting up + * our prerequisites (mainly connection->worker), and only calling us + * from its own thread (so no memory barrier is needed). + */ + if (!check_unclosed (connection, + (flags & SEND_MESSAGE_FLAGS_INITIALIZING) ? MAY_BE_UNINITIALIZED : 0, + error)) + goto out; + + blob = g_dbus_message_to_blob (message, + &blob_size, + connection->capabilities, + error); + if (blob == NULL) + goto out; + + if (flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL) + serial_to_use = g_dbus_message_get_serial (message); + else + serial_to_use = ++connection->last_serial; /* TODO: handle overflow */ + + switch (blob[0]) + { + case 'l': + ((guint32 *) blob)[2] = GUINT32_TO_LE (serial_to_use); + break; + case 'B': + ((guint32 *) blob)[2] = GUINT32_TO_BE (serial_to_use); + break; + default: + g_assert_not_reached (); + break; + } + +#if 0 + g_printerr ("Writing message of %" G_GSIZE_FORMAT " bytes (serial %d) on %p:\n", + blob_size, serial_to_use, connection); + g_printerr ("----\n"); + hexdump (blob, blob_size); + g_printerr ("----\n"); +#endif + + /* TODO: use connection->auth to encode the blob */ + + if (out_serial != NULL) + *out_serial = serial_to_use; + + /* store used serial for the current thread */ + /* TODO: watch the thread disposal and remove associated record + * from hashtable + * - see https://bugzilla.gnome.org/show_bug.cgi?id=676825#c7 + */ + g_hash_table_replace (connection->map_thread_to_last_serial, + g_thread_self (), + GUINT_TO_POINTER (serial_to_use)); + + if (!(flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL)) + g_dbus_message_set_serial (message, serial_to_use); + + g_dbus_message_lock (message); + _g_dbus_worker_send_message (connection->worker, + message, + (gchar*) blob, + blob_size); + blob = NULL; /* since _g_dbus_worker_send_message() steals the blob */ + + ret = TRUE; + + out: + g_free (blob); + + return ret; +} + +/** + * g_dbus_connection_send_message: + * @connection: A #GDBusConnection. + * @message: A #GDBusMessage + * @flags: Flags affecting how the message is sent. + * @out_serial: (out) (allow-none): Return location for serial number assigned + * to @message when sending it or %NULL. + * @error: Return location for error or %NULL. + * + * Asynchronously sends @message to the peer represented by @connection. + * + * Unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag, the serial number + * will be assigned by @connection and set on @message via + * g_dbus_message_set_serial(). If @out_serial is not %NULL, then the + * serial number used will be written to this location prior to + * submitting the message to the underlying transport. + * + * If @connection is closed then the operation will fail with + * %G_IO_ERROR_CLOSED. If @message is not well-formed, + * the operation fails with %G_IO_ERROR_INVALID_ARGUMENT. + * + * See and for an example of how to use this + * low-level API to send and receive UNIX file descriptors. + * + * Note that @message must be unlocked, unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag. + * + * Returns: %TRUE if the message was well-formed and queued for + * transmission, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_send_message (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + volatile guint32 *out_serial, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); + g_return_val_if_fail ((flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL) || !g_dbus_message_get_locked (message), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + CONNECTION_LOCK (connection); + ret = g_dbus_connection_send_message_unlocked (connection, message, flags, out_serial, error); + CONNECTION_UNLOCK (connection); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + volatile gint ref_count; + GDBusConnection *connection; + guint32 serial; + GSimpleAsyncResult *simple; + + GMainContext *main_context; + + GCancellable *cancellable; + + gulong cancellable_handler_id; + + GSource *timeout_source; + + gboolean delivered; +} SendMessageData; + +/* Can be called from any thread with or without lock held */ +static SendMessageData * +send_message_data_ref (SendMessageData *data) +{ + g_atomic_int_inc (&data->ref_count); + return data; +} + +/* Can be called from any thread with or without lock held */ +static void +send_message_data_unref (SendMessageData *data) +{ + if (g_atomic_int_dec_and_test (&data->ref_count)) + { + g_assert (data->timeout_source == NULL); + g_assert (data->simple == NULL); + g_assert (data->cancellable_handler_id == 0); + g_object_unref (data->connection); + if (data->cancellable != NULL) + g_object_unref (data->cancellable); + g_main_context_unref (data->main_context); + g_free (data); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* can be called from any thread with lock held - caller must have prepared GSimpleAsyncResult already */ +static void +send_message_with_reply_deliver (SendMessageData *data, gboolean remove) +{ + CONNECTION_ENSURE_LOCK (data->connection); + + g_assert (!data->delivered); + + data->delivered = TRUE; + + g_simple_async_result_complete_in_idle (data->simple); + g_object_unref (data->simple); + data->simple = NULL; + + if (data->timeout_source != NULL) + { + g_source_destroy (data->timeout_source); + data->timeout_source = NULL; + } + if (data->cancellable_handler_id > 0) + { + g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id); + data->cancellable_handler_id = 0; + } + + if (remove) + { + g_warn_if_fail (g_hash_table_remove (data->connection->map_method_serial_to_send_message_data, + GUINT_TO_POINTER (data->serial))); + } + + send_message_data_unref (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Can be called from any thread with lock held */ +static void +send_message_data_deliver_reply_unlocked (SendMessageData *data, + GDBusMessage *reply) +{ + if (data->delivered) + goto out; + + g_simple_async_result_set_op_res_gpointer (data->simple, + g_object_ref (reply), + g_object_unref); + + send_message_with_reply_deliver (data, TRUE); + + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called from a user thread, lock is not held */ +static gboolean +send_message_with_reply_cancelled_idle_cb (gpointer user_data) +{ + SendMessageData *data = user_data; + + CONNECTION_LOCK (data->connection); + if (data->delivered) + goto out; + + g_simple_async_result_set_error (data->simple, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, + _("Operation was cancelled")); + + send_message_with_reply_deliver (data, TRUE); + + out: + CONNECTION_UNLOCK (data->connection); + return FALSE; +} + +/* Can be called from any thread with or without lock held */ +static void +send_message_with_reply_cancelled_cb (GCancellable *cancellable, + gpointer user_data) +{ + SendMessageData *data = user_data; + GSource *idle_source; + + /* postpone cancellation to idle handler since we may be called directly + * via g_cancellable_connect() (e.g. holding lock) + */ + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + send_message_with_reply_cancelled_idle_cb, + send_message_data_ref (data), + (GDestroyNotify) send_message_data_unref); + g_source_attach (idle_source, data->main_context); + g_source_unref (idle_source); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called from a user thread, lock is not held */ +static gboolean +send_message_with_reply_timeout_cb (gpointer user_data) +{ + SendMessageData *data = user_data; + + CONNECTION_LOCK (data->connection); + if (data->delivered) + goto out; + + g_simple_async_result_set_error (data->simple, + G_IO_ERROR, + G_IO_ERROR_TIMED_OUT, + _("Timeout was reached")); + + send_message_with_reply_deliver (data, TRUE); + + out: + CONNECTION_UNLOCK (data->connection); + + return FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called from a user thread, connection's lock is held */ +static void +g_dbus_connection_send_message_with_reply_unlocked (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + gint timeout_msec, + volatile guint32 *out_serial, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + SendMessageData *data; + GError *error; + volatile guint32 serial; + + data = NULL; + + if (out_serial == NULL) + out_serial = &serial; + + if (timeout_msec == -1) + timeout_msec = 25 * 1000; + + simple = g_simple_async_result_new (G_OBJECT (connection), + callback, + user_data, + g_dbus_connection_send_message_with_reply); + g_simple_async_result_set_check_cancellable (simple, cancellable); + + if (g_cancellable_is_cancelled (cancellable)) + { + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_CANCELLED, + _("Operation was cancelled")); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + goto out; + } + + error = NULL; + if (!g_dbus_connection_send_message_unlocked (connection, message, flags, out_serial, &error)) + { + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + goto out; + } + + data = g_new0 (SendMessageData, 1); + data->ref_count = 1; + data->connection = g_object_ref (connection); + data->simple = simple; + data->serial = *out_serial; + data->main_context = g_main_context_ref_thread_default (); + + if (cancellable != NULL) + { + data->cancellable = g_object_ref (cancellable); + data->cancellable_handler_id = g_cancellable_connect (cancellable, + G_CALLBACK (send_message_with_reply_cancelled_cb), + send_message_data_ref (data), + (GDestroyNotify) send_message_data_unref); + } + + if (timeout_msec != G_MAXINT) + { + data->timeout_source = g_timeout_source_new (timeout_msec); + g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT); + g_source_set_callback (data->timeout_source, + send_message_with_reply_timeout_cb, + send_message_data_ref (data), + (GDestroyNotify) send_message_data_unref); + g_source_attach (data->timeout_source, data->main_context); + g_source_unref (data->timeout_source); + } + + g_hash_table_insert (connection->map_method_serial_to_send_message_data, + GUINT_TO_POINTER (*out_serial), + data); + + out: + ; +} + +/** + * g_dbus_connection_send_message_with_reply: + * @connection: A #GDBusConnection. + * @message: A #GDBusMessage. + * @flags: Flags affecting how the message is sent. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @out_serial: (out) (allow-none): Return location for serial number assigned + * to @message when sending it or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is + * satisfied or %NULL if you don't care about the result. + * @user_data: The data to pass to @callback. + * + * Asynchronously sends @message to the peer represented by @connection. + * + * Unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag, the serial number + * will be assigned by @connection and set on @message via + * g_dbus_message_set_serial(). If @out_serial is not %NULL, then the + * serial number used will be written to this location prior to + * submitting the message to the underlying transport. + * + * If @connection is closed then the operation will fail with + * %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will + * fail with %G_IO_ERROR_CANCELLED. If @message is not well-formed, + * the operation fails with %G_IO_ERROR_INVALID_ARGUMENT. + * + * This is an asynchronous method. When the operation is finished, @callback will be invoked + * in the thread-default main loop + * of the thread you are calling this method from. You can then call + * g_dbus_connection_send_message_with_reply_finish() to get the result of the operation. + * See g_dbus_connection_send_message_with_reply_sync() for the synchronous version. + * + * Note that @message must be unlocked, unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag. + * + * See and for an example of how to use this + * low-level API to send and receive UNIX file descriptors. + * + * Since: 2.26 + */ +void +g_dbus_connection_send_message_with_reply (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + gint timeout_msec, + volatile guint32 *out_serial, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail ((flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL) || !g_dbus_message_get_locked (message)); + g_return_if_fail (timeout_msec >= 0 || timeout_msec == -1); + + CONNECTION_LOCK (connection); + g_dbus_connection_send_message_with_reply_unlocked (connection, + message, + flags, + timeout_msec, + out_serial, + cancellable, + callback, + user_data); + CONNECTION_UNLOCK (connection); +} + +/** + * g_dbus_connection_send_message_with_reply_finish: + * @connection: a #GDBusConnection + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_send_message_with_reply(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_send_message_with_reply(). + * + * Note that @error is only set if a local in-process error + * occurred. That is to say that the returned #GDBusMessage object may + * be of type %G_DBUS_MESSAGE_TYPE_ERROR. Use + * g_dbus_message_to_gerror() to transcode this to a #GError. + * + * See and for an example of how to use this + * low-level API to send and receive UNIX file descriptors. + * + * Returns: (transfer full): A locked #GDBusMessage or %NULL if @error is set. + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_connection_send_message_with_reply_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GDBusMessage *reply; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + reply = NULL; + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_dbus_connection_send_message_with_reply); + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + reply = g_object_ref (g_simple_async_result_get_op_res_gpointer (simple)); + + out: + return reply; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GAsyncResult *res; + GMainContext *context; + GMainLoop *loop; +} SendMessageSyncData; + +/* Called from a user thread, lock is not held */ +static void +send_message_with_reply_sync_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + SendMessageSyncData *data = user_data; + data->res = g_object_ref (res); + g_main_loop_quit (data->loop); +} + +/** + * g_dbus_connection_send_message_with_reply_sync: + * @connection: A #GDBusConnection. + * @message: A #GDBusMessage. + * @flags: Flags affecting how the message is sent. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @out_serial: (out) (allow-none): Return location for serial number assigned + * to @message when sending it or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously sends @message to the peer represented by @connection + * and blocks the calling thread until a reply is received or the + * timeout is reached. See g_dbus_connection_send_message_with_reply() + * for the asynchronous version of this method. + * + * Unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag, the serial number + * will be assigned by @connection and set on @message via + * g_dbus_message_set_serial(). If @out_serial is not %NULL, then the + * serial number used will be written to this location prior to + * submitting the message to the underlying transport. + * + * If @connection is closed then the operation will fail with + * %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will + * fail with %G_IO_ERROR_CANCELLED. If @message is not well-formed, + * the operation fails with %G_IO_ERROR_INVALID_ARGUMENT. + * + * Note that @error is only set if a local in-process error + * occurred. That is to say that the returned #GDBusMessage object may + * be of type %G_DBUS_MESSAGE_TYPE_ERROR. Use + * g_dbus_message_to_gerror() to transcode this to a #GError. + * + * See and for an example of how to use this + * low-level API to send and receive UNIX file descriptors. + * + * Note that @message must be unlocked, unless @flags contain the + * %G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL flag. + * + * Returns: (transfer full): A locked #GDBusMessage that is the reply to @message or %NULL if @error is set. + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_connection_send_message_with_reply_sync (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + gint timeout_msec, + volatile guint32 *out_serial, + GCancellable *cancellable, + GError **error) +{ + SendMessageSyncData *data; + GDBusMessage *reply; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + g_return_val_if_fail ((flags & G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL) || !g_dbus_message_get_locked (message), NULL); + g_return_val_if_fail (timeout_msec >= 0 || timeout_msec == -1, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + data = g_new0 (SendMessageSyncData, 1); + data->context = g_main_context_new (); + data->loop = g_main_loop_new (data->context, FALSE); + + g_main_context_push_thread_default (data->context); + + g_dbus_connection_send_message_with_reply (connection, + message, + flags, + timeout_msec, + out_serial, + cancellable, + (GAsyncReadyCallback) send_message_with_reply_sync_cb, + data); + g_main_loop_run (data->loop); + reply = g_dbus_connection_send_message_with_reply_finish (connection, + data->res, + error); + + g_main_context_pop_thread_default (data->context); + + g_main_context_unref (data->context); + g_main_loop_unref (data->loop); + g_object_unref (data->res); + g_free (data); + + return reply; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusMessageFilterFunction func; + gpointer user_data; +} FilterCallback; + +typedef struct +{ + guint id; + GDBusMessageFilterFunction filter_function; + gpointer user_data; + GDestroyNotify user_data_free_func; +} FilterData; + +/* Called in GDBusWorker's thread - we must not block - with no lock held */ +static void +on_worker_message_received (GDBusWorker *worker, + GDBusMessage *message, + gpointer user_data) +{ + GDBusConnection *connection; + FilterCallback *filters; + guint num_filters; + guint n; + gboolean alive; + + G_LOCK (message_bus_lock); + alive = (g_hash_table_lookup (alive_connections, user_data) != NULL); + if (!alive) + { + G_UNLOCK (message_bus_lock); + return; + } + connection = G_DBUS_CONNECTION (user_data); + g_object_ref (connection); + G_UNLOCK (message_bus_lock); + + //g_debug ("in on_worker_message_received"); + + g_object_ref (message); + g_dbus_message_lock (message); + + //g_debug ("boo ref_count = %d %p %p", G_OBJECT (connection)->ref_count, connection, connection->worker); + + /* First collect the set of callback functions */ + CONNECTION_LOCK (connection); + num_filters = connection->filters->len; + filters = g_new0 (FilterCallback, num_filters); + for (n = 0; n < num_filters; n++) + { + FilterData *data = connection->filters->pdata[n]; + filters[n].func = data->filter_function; + filters[n].user_data = data->user_data; + } + CONNECTION_UNLOCK (connection); + + /* then call the filters in order (without holding the lock) */ + for (n = 0; n < num_filters; n++) + { + message = filters[n].func (connection, + message, + TRUE, + filters[n].user_data); + if (message == NULL) + break; + g_dbus_message_lock (message); + } + + /* Standard dispatch unless the filter ate the message - no need to + * do anything if the message was altered + */ + if (message != NULL) + { + GDBusMessageType message_type; + + message_type = g_dbus_message_get_message_type (message); + if (message_type == G_DBUS_MESSAGE_TYPE_METHOD_RETURN || message_type == G_DBUS_MESSAGE_TYPE_ERROR) + { + guint32 reply_serial; + SendMessageData *send_message_data; + + reply_serial = g_dbus_message_get_reply_serial (message); + CONNECTION_LOCK (connection); + send_message_data = g_hash_table_lookup (connection->map_method_serial_to_send_message_data, + GUINT_TO_POINTER (reply_serial)); + if (send_message_data != NULL) + { + //g_debug ("delivering reply/error for serial %d for %p", reply_serial, connection); + send_message_data_deliver_reply_unlocked (send_message_data, message); + } + else + { + //g_debug ("message reply/error for serial %d but no SendMessageData found for %p", reply_serial, connection); + } + CONNECTION_UNLOCK (connection); + } + else if (message_type == G_DBUS_MESSAGE_TYPE_SIGNAL) + { + CONNECTION_LOCK (connection); + distribute_signals (connection, message); + CONNECTION_UNLOCK (connection); + } + else if (message_type == G_DBUS_MESSAGE_TYPE_METHOD_CALL) + { + CONNECTION_LOCK (connection); + distribute_method_call (connection, message); + CONNECTION_UNLOCK (connection); + } + } + + if (message != NULL) + g_object_unref (message); + g_object_unref (connection); + g_free (filters); +} + +/* Called in GDBusWorker's thread, lock is not held */ +static GDBusMessage * +on_worker_message_about_to_be_sent (GDBusWorker *worker, + GDBusMessage *message, + gpointer user_data) +{ + GDBusConnection *connection; + FilterCallback *filters; + guint num_filters; + guint n; + gboolean alive; + + G_LOCK (message_bus_lock); + alive = (g_hash_table_lookup (alive_connections, user_data) != NULL); + if (!alive) + { + G_UNLOCK (message_bus_lock); + return message; + } + connection = G_DBUS_CONNECTION (user_data); + g_object_ref (connection); + G_UNLOCK (message_bus_lock); + + //g_debug ("in on_worker_message_about_to_be_sent"); + + /* First collect the set of callback functions */ + CONNECTION_LOCK (connection); + num_filters = connection->filters->len; + filters = g_new0 (FilterCallback, num_filters); + for (n = 0; n < num_filters; n++) + { + FilterData *data = connection->filters->pdata[n]; + filters[n].func = data->filter_function; + filters[n].user_data = data->user_data; + } + CONNECTION_UNLOCK (connection); + + /* then call the filters in order (without holding the lock) */ + for (n = 0; n < num_filters; n++) + { + g_dbus_message_lock (message); + message = filters[n].func (connection, + message, + FALSE, + filters[n].user_data); + if (message == NULL) + break; + } + + g_object_unref (connection); + g_free (filters); + + return message; +} + +/* called with connection lock held, in GDBusWorker thread */ +static gboolean +cancel_method_on_close (gpointer key, gpointer value, gpointer user_data) +{ + SendMessageData *data = value; + + if (data->delivered) + return FALSE; + + g_simple_async_result_set_error (data->simple, + G_IO_ERROR, + G_IO_ERROR_CLOSED, + _("The connection is closed")); + + /* Ask send_message_with_reply_deliver not to remove the element from the + * hash table - we're in the middle of a foreach; that would be unsafe. + * Instead, return TRUE from this function so that it gets removed safely. + */ + send_message_with_reply_deliver (data, FALSE); + return TRUE; +} + +/* Called in GDBusWorker's thread - we must not block - without lock held */ +static void +on_worker_closed (GDBusWorker *worker, + gboolean remote_peer_vanished, + GError *error, + gpointer user_data) +{ + GDBusConnection *connection; + gboolean alive; + guint old_atomic_flags; + + G_LOCK (message_bus_lock); + alive = (g_hash_table_lookup (alive_connections, user_data) != NULL); + if (!alive) + { + G_UNLOCK (message_bus_lock); + return; + } + connection = G_DBUS_CONNECTION (user_data); + g_object_ref (connection); + G_UNLOCK (message_bus_lock); + + //g_debug ("in on_worker_closed: %s", error->message); + + CONNECTION_LOCK (connection); + /* Even though this is atomic, we do it inside the lock to avoid breaking + * assumptions in remove_match_rule(). We'd need the lock in a moment + * anyway, so, no loss. + */ + old_atomic_flags = g_atomic_int_or (&connection->atomic_flags, FLAG_CLOSED); + + if (!(old_atomic_flags & FLAG_CLOSED)) + { + g_hash_table_foreach_remove (connection->map_method_serial_to_send_message_data, cancel_method_on_close, NULL); + schedule_closed_unlocked (connection, remote_peer_vanished, error); + } + CONNECTION_UNLOCK (connection); + + g_object_unref (connection); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Determines the biggest set of capabilities we can support on this + * connection. + * + * Called with the init_lock held. + */ +static GDBusCapabilityFlags +get_offered_capabilities_max (GDBusConnection *connection) +{ + GDBusCapabilityFlags ret; + ret = G_DBUS_CAPABILITY_FLAGS_NONE; +#ifdef G_OS_UNIX + if (G_IS_UNIX_CONNECTION (connection->stream)) + ret |= G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING; +#endif + return ret; +} + +/* Called in a user thread, lock is not held */ +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (initable); + gboolean ret; + + /* This method needs to be idempotent to work with the singleton + * pattern. See the docs for g_initable_init(). We implement this by + * locking. + * + * Unfortunately we can't use the main lock since the on_worker_*() + * callbacks above needs the lock during initialization (for message + * bus connections we do a synchronous Hello() call on the bus). + */ + g_mutex_lock (&connection->init_lock); + + ret = FALSE; + + /* Make this a no-op if we're already initialized (successfully or + * unsuccessfully) + */ + if ((g_atomic_int_get (&connection->atomic_flags) & FLAG_INITIALIZED)) + { + ret = (connection->initialization_error == NULL); + goto out; + } + + /* Because of init_lock, we can't get here twice in different threads */ + g_assert (connection->initialization_error == NULL); + + /* The user can pass multiple (but mutally exclusive) construct + * properties: + * + * - stream (of type GIOStream) + * - address (of type gchar*) + * + * At the end of the day we end up with a non-NULL GIOStream + * object in connection->stream. + */ + if (connection->address != NULL) + { + g_assert (connection->stream == NULL); + + if ((connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER) || + (connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS)) + { + g_set_error_literal (&connection->initialization_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Unsupported flags encountered when constructing a client-side connection")); + goto out; + } + + connection->stream = g_dbus_address_get_stream_sync (connection->address, + NULL, /* TODO: out_guid */ + cancellable, + &connection->initialization_error); + if (connection->stream == NULL) + goto out; + } + else if (connection->stream != NULL) + { + /* nothing to do */ + } + else + { + g_assert_not_reached (); + } + + /* Authenticate the connection */ + if (connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER) + { + g_assert (!(connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT)); + g_assert (connection->guid != NULL); + connection->auth = _g_dbus_auth_new (connection->stream); + if (!_g_dbus_auth_run_server (connection->auth, + connection->authentication_observer, + connection->guid, + (connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS), + get_offered_capabilities_max (connection), + &connection->capabilities, + &connection->credentials, + cancellable, + &connection->initialization_error)) + goto out; + } + else if (connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT) + { + g_assert (!(connection->flags & G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER)); + g_assert (connection->guid == NULL); + connection->auth = _g_dbus_auth_new (connection->stream); + connection->guid = _g_dbus_auth_run_client (connection->auth, + connection->authentication_observer, + get_offered_capabilities_max (connection), + &connection->capabilities, + cancellable, + &connection->initialization_error); + if (connection->guid == NULL) + goto out; + } + + if (connection->authentication_observer != NULL) + { + g_object_unref (connection->authentication_observer); + connection->authentication_observer = NULL; + } + + //g_output_stream_flush (G_SOCKET_CONNECTION (connection->stream) + + //g_debug ("haz unix fd passing powers: %d", connection->capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + +#ifdef G_OS_UNIX + /* We want all IO operations to be non-blocking since they happen in + * the worker thread which is shared by _all_ connections. + */ + if (G_IS_SOCKET_CONNECTION (connection->stream)) + { + g_socket_set_blocking (g_socket_connection_get_socket (G_SOCKET_CONNECTION (connection->stream)), FALSE); + } +#endif + + G_LOCK (message_bus_lock); + if (alive_connections == NULL) + alive_connections = g_hash_table_new (g_direct_hash, g_direct_equal); + g_hash_table_insert (alive_connections, connection, connection); + G_UNLOCK (message_bus_lock); + + connection->worker = _g_dbus_worker_new (connection->stream, + connection->capabilities, + ((connection->flags & G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) != 0), + on_worker_message_received, + on_worker_message_about_to_be_sent, + on_worker_closed, + connection); + + /* if a bus connection, call org.freedesktop.DBus.Hello - this is how we're getting a name */ + if (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) + { + GVariant *hello_result; + + /* we could lift this restriction by adding code in gdbusprivate.c */ + if (connection->flags & G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) + { + g_set_error_literal (&connection->initialization_error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Cannot use DELAY_MESSAGE_PROCESSING with MESSAGE_BUS_CONNECTION"); + goto out; + } + + hello_result = g_dbus_connection_call_sync (connection, + "org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* path */ + "org.freedesktop.DBus", /* interface */ + "Hello", + NULL, /* parameters */ + G_VARIANT_TYPE ("(s)"), + CALL_FLAGS_INITIALIZING, + -1, + NULL, /* TODO: cancellable */ + &connection->initialization_error); + if (hello_result == NULL) + goto out; + + g_variant_get (hello_result, "(s)", &connection->bus_unique_name); + g_variant_unref (hello_result); + //g_debug ("unique name is `%s'", connection->bus_unique_name); + } + + ret = TRUE; + out: + if (!ret) + { + g_assert (connection->initialization_error != NULL); + g_propagate_error (error, g_error_copy (connection->initialization_error)); + } + + g_atomic_int_or (&connection->atomic_flags, FLAG_INITIALIZED); + g_mutex_unlock (&connection->init_lock); + + return ret; +} + +static void +initable_iface_init (GInitableIface *initable_iface) +{ + initable_iface->init = initable_init; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +async_initable_iface_init (GAsyncInitableIface *async_initable_iface) +{ + /* Use default */ +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_new: + * @stream: A #GIOStream. + * @guid: (allow-none): The GUID to use if a authenticating as a server or %NULL. + * @flags: Flags describing how to make the connection. + * @observer: (allow-none): A #GDBusAuthObserver or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: The data to pass to @callback. + * + * Asynchronously sets up a D-Bus connection for exchanging D-Bus messages + * with the end represented by @stream. + * + * If @stream is a #GSocketConnection, then the corresponding #GSocket + * will be put into non-blocking mode. + * + * The D-Bus connection will interact with @stream from a worker thread. + * As a result, the caller should not interact with @stream after this + * method has been called, except by calling g_object_unref() on it. + * + * If @observer is not %NULL it may be used to control the + * authentication process. + * + * When the operation is finished, @callback will be invoked. You can + * then call g_dbus_connection_new_finish() to get the result of the + * operation. + * + * This is a asynchronous failable constructor. See + * g_dbus_connection_new_sync() for the synchronous + * version. + * + * Since: 2.26 + */ +void +g_dbus_connection_new (GIOStream *stream, + const gchar *guid, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_IO_STREAM (stream)); + g_async_initable_new_async (G_TYPE_DBUS_CONNECTION, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "stream", stream, + "guid", guid, + "flags", flags, + "authentication-observer", observer, + NULL); +} + +/** + * g_dbus_connection_new_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_new(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_new(). + * + * Returns: A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_connection_new_finish (GAsyncResult *res, + GError **error) +{ + GObject *object; + GObject *source_object; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + source_object = g_async_result_get_source_object (res); + g_assert (source_object != NULL); + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + res, + error); + g_object_unref (source_object); + if (object != NULL) + return G_DBUS_CONNECTION (object); + else + return NULL; +} + +/** + * g_dbus_connection_new_sync: + * @stream: A #GIOStream. + * @guid: (allow-none): The GUID to use if a authenticating as a server or %NULL. + * @flags: Flags describing how to make the connection. + * @observer: (allow-none): A #GDBusAuthObserver or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously sets up a D-Bus connection for exchanging D-Bus messages + * with the end represented by @stream. + * + * If @stream is a #GSocketConnection, then the corresponding #GSocket + * will be put into non-blocking mode. + * + * The D-Bus connection will interact with @stream from a worker thread. + * As a result, the caller should not interact with @stream after this + * method has been called, except by calling g_object_unref() on it. + * + * If @observer is not %NULL it may be used to control the + * authentication process. + * + * This is a synchronous failable constructor. See + * g_dbus_connection_new() for the asynchronous version. + * + * Returns: A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_connection_new_sync (GIOStream *stream, + const gchar *guid, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_IO_STREAM (stream), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + return g_initable_new (G_TYPE_DBUS_CONNECTION, + cancellable, + error, + "stream", stream, + "guid", guid, + "flags", flags, + "authentication-observer", observer, + NULL); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_new_for_address: + * @address: A D-Bus address. + * @flags: Flags describing how to make the connection. + * @observer: (allow-none): A #GDBusAuthObserver or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: The data to pass to @callback. + * + * Asynchronously connects and sets up a D-Bus client connection for + * exchanging D-Bus messages with an endpoint specified by @address + * which must be in the D-Bus address format. + * + * This constructor can only be used to initiate client-side + * connections - use g_dbus_connection_new() if you need to act as the + * server. In particular, @flags cannot contain the + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER or + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS flags. + * + * When the operation is finished, @callback will be invoked. You can + * then call g_dbus_connection_new_finish() to get the result of the + * operation. + * + * If @observer is not %NULL it may be used to control the + * authentication process. + * + * This is a asynchronous failable constructor. See + * g_dbus_connection_new_for_address_sync() for the synchronous + * version. + * + * Since: 2.26 + */ +void +g_dbus_connection_new_for_address (const gchar *address, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (address != NULL); + g_async_initable_new_async (G_TYPE_DBUS_CONNECTION, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "address", address, + "flags", flags, + "authentication-observer", observer, + NULL); +} + +/** + * g_dbus_connection_new_for_address_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_new(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_new_for_address(). + * + * Returns: A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_connection_new_for_address_finish (GAsyncResult *res, + GError **error) +{ + GObject *object; + GObject *source_object; + + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + source_object = g_async_result_get_source_object (res); + g_assert (source_object != NULL); + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + res, + error); + g_object_unref (source_object); + if (object != NULL) + return G_DBUS_CONNECTION (object); + else + return NULL; +} + +/** + * g_dbus_connection_new_for_address_sync: + * @address: A D-Bus address. + * @flags: Flags describing how to make the connection. + * @observer: (allow-none): A #GDBusAuthObserver or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously connects and sets up a D-Bus client connection for + * exchanging D-Bus messages with an endpoint specified by @address + * which must be in the D-Bus address format. + * + * This constructor can only be used to initiate client-side + * connections - use g_dbus_connection_new_sync() if you need to act + * as the server. In particular, @flags cannot contain the + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER or + * %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS flags. + * + * This is a synchronous failable constructor. See + * g_dbus_connection_new_for_address() for the asynchronous version. + * + * If @observer is not %NULL it may be used to control the + * authentication process. + * + * Returns: A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_connection_new_for_address_sync (const gchar *address, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (address != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + return g_initable_new (G_TYPE_DBUS_CONNECTION, + cancellable, + error, + "address", address, + "flags", flags, + "authentication-observer", observer, + NULL); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_set_exit_on_close: + * @connection: A #GDBusConnection. + * @exit_on_close: Whether the process should be terminated + * when @connection is closed by the remote peer. + * + * Sets whether the process should be terminated when @connection is + * closed by the remote peer. See #GDBusConnection:exit-on-close for + * more details. + * + * Note that this function should be used with care. Most modern UNIX + * desktops tie the notion of a user session the session bus, and expect + * all of a users applications to quit when their bus connection goes away. + * If you are setting @exit_on_close to %FALSE for the shared session + * bus connection, you should make sure that your application exits + * when the user session ends. + * + * Since: 2.26 + */ +void +g_dbus_connection_set_exit_on_close (GDBusConnection *connection, + gboolean exit_on_close) +{ + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + + if (exit_on_close) + g_atomic_int_or (&connection->atomic_flags, FLAG_EXIT_ON_CLOSE); + else + g_atomic_int_and (&connection->atomic_flags, ~FLAG_EXIT_ON_CLOSE); + +} + +/** + * g_dbus_connection_get_exit_on_close: + * @connection: A #GDBusConnection. + * + * Gets whether the process is terminated when @connection is + * closed by the remote peer. See + * #GDBusConnection:exit-on-close for more details. + * + * Returns: Whether the process is terminated when @connection is + * closed by the remote peer. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_get_exit_on_close (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + + if (g_atomic_int_get (&connection->atomic_flags) & FLAG_EXIT_ON_CLOSE) + return TRUE; + else + return FALSE; +} + +/** + * g_dbus_connection_get_guid: + * @connection: A #GDBusConnection. + * + * The GUID of the peer performing the role of server when + * authenticating. See #GDBusConnection:guid for more details. + * + * Returns: The GUID. Do not free this string, it is owned by + * @connection. + * + * Since: 2.26 + */ +const gchar * +g_dbus_connection_get_guid (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + return connection->guid; +} + +/** + * g_dbus_connection_get_unique_name: + * @connection: A #GDBusConnection. + * + * Gets the unique name of @connection as assigned by the message + * bus. This can also be used to figure out if @connection is a + * message bus connection. + * + * Returns: The unique name or %NULL if @connection is not a message + * bus connection. Do not free this string, it is owned by + * @connection. + * + * Since: 2.26 + */ +const gchar * +g_dbus_connection_get_unique_name (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return NULL; + + return connection->bus_unique_name; +} + +/** + * g_dbus_connection_get_peer_credentials: + * @connection: A #GDBusConnection. + * + * Gets the credentials of the authenticated peer. This will always + * return %NULL unless @connection acted as a server + * (e.g. %G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER was passed) + * when set up and the client passed credentials as part of the + * authentication process. + * + * In a message bus setup, the message bus is always the server and + * each application is a client. So this method will always return + * %NULL for message bus clients. + * + * Returns: (transfer none): A #GCredentials or %NULL if not available. Do not free + * this object, it is owned by @connection. + * + * Since: 2.26 + */ +GCredentials * +g_dbus_connection_get_peer_credentials (GDBusConnection *connection) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + + /* do not use g_return_val_if_fail(), we want the memory barrier */ + if (!check_initialized (connection)) + return NULL; + + return connection->credentials; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static guint _global_filter_id = 1; + +/** + * g_dbus_connection_add_filter: + * @connection: A #GDBusConnection. + * @filter_function: A filter function. + * @user_data: User data to pass to @filter_function. + * @user_data_free_func: Function to free @user_data with when filter + * is removed or %NULL. + * + * Adds a message filter. Filters are handlers that are run on all + * incoming and outgoing messages, prior to standard dispatch. Filters + * are run in the order that they were added. The same handler can be + * added as a filter more than once, in which case it will be run more + * than once. Filters added during a filter callback won't be run on + * the message being processed. Filter functions are allowed to modify + * and even drop messages. + * + * Note that filters are run in a dedicated message handling thread so + * they can't block and, generally, can't do anything but signal a + * worker thread. Also note that filters are rarely needed - use API + * such as g_dbus_connection_send_message_with_reply(), + * g_dbus_connection_signal_subscribe() or g_dbus_connection_call() instead. + * + * If a filter consumes an incoming message the message is not + * dispatched anywhere else - not even the standard dispatch machinery + * (that API such as g_dbus_connection_signal_subscribe() and + * g_dbus_connection_send_message_with_reply() relies on) will see the + * message. Similary, if a filter consumes an outgoing message, the + * message will not be sent to the other peer. + * + * Returns: A filter identifier that can be used with + * g_dbus_connection_remove_filter(). + * + * Since: 2.26 + */ +guint +g_dbus_connection_add_filter (GDBusConnection *connection, + GDBusMessageFilterFunction filter_function, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + FilterData *data; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (filter_function != NULL, 0); + g_return_val_if_fail (check_initialized (connection), 0); + + CONNECTION_LOCK (connection); + data = g_new0 (FilterData, 1); + data->id = _global_filter_id++; /* TODO: overflow etc. */ + data->filter_function = filter_function; + data->user_data = user_data; + data->user_data_free_func = user_data_free_func; + g_ptr_array_add (connection->filters, data); + CONNECTION_UNLOCK (connection); + + return data->id; +} + +/* only called from finalize(), removes all filters */ +static void +purge_all_filters (GDBusConnection *connection) +{ + guint n; + for (n = 0; n < connection->filters->len; n++) + { + FilterData *data = connection->filters->pdata[n]; + if (data->user_data_free_func != NULL) + data->user_data_free_func (data->user_data); + g_free (data); + } +} + +/** + * g_dbus_connection_remove_filter: + * @connection: a #GDBusConnection + * @filter_id: an identifier obtained from g_dbus_connection_add_filter() + * + * Removes a filter. + * + * Since: 2.26 + */ +void +g_dbus_connection_remove_filter (GDBusConnection *connection, + guint filter_id) +{ + guint n; + FilterData *to_destroy; + + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail (check_initialized (connection)); + + CONNECTION_LOCK (connection); + to_destroy = NULL; + for (n = 0; n < connection->filters->len; n++) + { + FilterData *data = connection->filters->pdata[n]; + if (data->id == filter_id) + { + g_ptr_array_remove_index (connection->filters, n); + to_destroy = data; + break; + } + } + CONNECTION_UNLOCK (connection); + + /* do free without holding lock */ + if (to_destroy != NULL) + { + if (to_destroy->user_data_free_func != NULL) + to_destroy->user_data_free_func (to_destroy->user_data); + g_free (to_destroy); + } + else + { + g_warning ("g_dbus_connection_remove_filter: No filter found for filter_id %d", filter_id); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + gchar *rule; + gchar *sender; + gchar *sender_unique_name; /* if sender is unique or org.freedesktop.DBus, then that name... otherwise blank */ + gchar *interface_name; + gchar *member; + gchar *object_path; + gchar *arg0; + GArray *subscribers; +} SignalData; + +typedef struct +{ + GDBusSignalCallback callback; + gpointer user_data; + GDestroyNotify user_data_free_func; + guint id; + GMainContext *context; +} SignalSubscriber; + +static void +signal_data_free (SignalData *signal_data) +{ + g_free (signal_data->rule); + g_free (signal_data->sender); + g_free (signal_data->sender_unique_name); + g_free (signal_data->interface_name); + g_free (signal_data->member); + g_free (signal_data->object_path); + g_free (signal_data->arg0); + g_array_free (signal_data->subscribers, TRUE); + g_free (signal_data); +} + +static gchar * +args_to_rule (const gchar *sender, + const gchar *interface_name, + const gchar *member, + const gchar *object_path, + const gchar *arg0, + gboolean negate) +{ + GString *rule; + + rule = g_string_new ("type='signal'"); + if (negate) + g_string_prepend_c (rule, '-'); + if (sender != NULL) + g_string_append_printf (rule, ",sender='%s'", sender); + if (interface_name != NULL) + g_string_append_printf (rule, ",interface='%s'", interface_name); + if (member != NULL) + g_string_append_printf (rule, ",member='%s'", member); + if (object_path != NULL) + g_string_append_printf (rule, ",path='%s'", object_path); + if (arg0 != NULL) + g_string_append_printf (rule, ",arg0='%s'", arg0); + + return g_string_free (rule, FALSE); +} + +static guint _global_subscriber_id = 1; +static guint _global_registration_id = 1; +static guint _global_subtree_registration_id = 1; + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called in a user thread, lock is held */ +static void +add_match_rule (GDBusConnection *connection, + const gchar *match_rule) +{ + GError *error; + GDBusMessage *message; + + if (match_rule[0] == '-') + return; + + message = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* path */ + "org.freedesktop.DBus", /* interface */ + "AddMatch"); + g_dbus_message_set_body (message, g_variant_new ("(s)", match_rule)); + error = NULL; + if (!g_dbus_connection_send_message_unlocked (connection, + message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + NULL, + &error)) + { + g_critical ("Error while sending AddMatch() message: %s", error->message); + g_error_free (error); + } + g_object_unref (message); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called in a user thread, lock is held */ +static void +remove_match_rule (GDBusConnection *connection, + const gchar *match_rule) +{ + GError *error; + GDBusMessage *message; + + if (match_rule[0] == '-') + return; + + message = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* path */ + "org.freedesktop.DBus", /* interface */ + "RemoveMatch"); + g_dbus_message_set_body (message, g_variant_new ("(s)", match_rule)); + + error = NULL; + if (!g_dbus_connection_send_message_unlocked (connection, + message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + NULL, + &error)) + { + /* If we could get G_IO_ERROR_CLOSED here, it wouldn't be reasonable to + * critical; but we're holding the lock, and our caller checked whether + * we were already closed, so we can't get that error. + */ + g_critical ("Error while sending RemoveMatch() message: %s", error->message); + g_error_free (error); + } + g_object_unref (message); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +is_signal_data_for_name_lost_or_acquired (SignalData *signal_data) +{ + return g_strcmp0 (signal_data->sender_unique_name, "org.freedesktop.DBus") == 0 && + g_strcmp0 (signal_data->interface_name, "org.freedesktop.DBus") == 0 && + g_strcmp0 (signal_data->object_path, "/org/freedesktop/DBus") == 0 && + (g_strcmp0 (signal_data->member, "NameLost") == 0 || + g_strcmp0 (signal_data->member, "NameAcquired") == 0); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_signal_subscribe: + * @connection: A #GDBusConnection. + * @sender: (allow-none): Sender name to match on (unique or well-known name) + * or %NULL to listen from all senders. + * @interface_name: (allow-none): D-Bus interface name to match on or %NULL to + * match on all interfaces. + * @member: (allow-none): D-Bus signal name to match on or %NULL to match on all signals. + * @object_path: (allow-none): Object path to match on or %NULL to match on all object paths. + * @arg0: (allow-none): Contents of first string argument to match on or %NULL + * to match on all kinds of arguments. + * @flags: Flags describing how to subscribe to the signal (currently unused). + * @callback: Callback to invoke when there is a signal matching the requested data. + * @user_data: User data to pass to @callback. + * @user_data_free_func: (allow-none): Function to free @user_data with when + * subscription is removed or %NULL. + * + * Subscribes to signals on @connection and invokes @callback with a + * whenever the signal is received. Note that @callback + * will be invoked in the thread-default main + * loop of the thread you are calling this method from. + * + * If @connection is not a message bus connection, @sender must be + * %NULL. + * + * If @sender is a well-known name note that @callback is invoked with + * the unique name for the owner of @sender, not the well-known name + * as one would expect. This is because the message bus rewrites the + * name. As such, to avoid certain race conditions, users should be + * tracking the name owner of the well-known name and use that when + * processing the received signal. + * + * Returns: A subscription identifier that can be used with g_dbus_connection_signal_unsubscribe(). + * + * Since: 2.26 + */ +guint +g_dbus_connection_signal_subscribe (GDBusConnection *connection, + const gchar *sender, + const gchar *interface_name, + const gchar *member, + const gchar *object_path, + const gchar *arg0, + GDBusSignalFlags flags, + GDBusSignalCallback callback, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + gchar *rule; + SignalData *signal_data; + SignalSubscriber subscriber; + GPtrArray *signal_data_array; + const gchar *sender_unique_name; + + /* Right now we abort if AddMatch() fails since it can only fail with the bus being in + * an OOM condition. We might want to change that but that would involve making + * g_dbus_connection_signal_subscribe() asynchronous and having the call sites + * handle that. And there's really no sensible way of handling this short of retrying + * to add the match rule... and then there's the little thing that, hey, maybe there's + * a reason the bus in an OOM condition. + * + * Doable, but not really sure it's worth it... + */ + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (sender == NULL || (g_dbus_is_name (sender) && (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION)), 0); + g_return_val_if_fail (interface_name == NULL || g_dbus_is_interface_name (interface_name), 0); + g_return_val_if_fail (member == NULL || g_dbus_is_member_name (member), 0); + g_return_val_if_fail (object_path == NULL || g_variant_is_object_path (object_path), 0); + g_return_val_if_fail (callback != NULL, 0); + g_return_val_if_fail (check_initialized (connection), 0); + + CONNECTION_LOCK (connection); + + /* If G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE was specified, we will end up + * with a '-' character to prefix the rule (which will otherwise be + * normal). + * + * This allows us to hash the rule and do our lifecycle tracking in + * the usual way, but the '-' prevents the match rule from ever + * actually being send to the bus (either for add or remove). + */ + rule = args_to_rule (sender, interface_name, member, object_path, arg0, + (flags & G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE) != 0); + + if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0)) + sender_unique_name = sender; + else + sender_unique_name = ""; + + subscriber.callback = callback; + subscriber.user_data = user_data; + subscriber.user_data_free_func = user_data_free_func; + subscriber.id = _global_subscriber_id++; /* TODO: overflow etc. */ + subscriber.context = g_main_context_ref_thread_default (); + + /* see if we've already have this rule */ + signal_data = g_hash_table_lookup (connection->map_rule_to_signal_data, rule); + if (signal_data != NULL) + { + g_array_append_val (signal_data->subscribers, subscriber); + g_free (rule); + goto out; + } + + signal_data = g_new0 (SignalData, 1); + signal_data->rule = rule; + signal_data->sender = g_strdup (sender); + signal_data->sender_unique_name = g_strdup (sender_unique_name); + signal_data->interface_name = g_strdup (interface_name); + signal_data->member = g_strdup (member); + signal_data->object_path = g_strdup (object_path); + signal_data->arg0 = g_strdup (arg0); + signal_data->subscribers = g_array_new (FALSE, FALSE, sizeof (SignalSubscriber)); + g_array_append_val (signal_data->subscribers, subscriber); + + g_hash_table_insert (connection->map_rule_to_signal_data, + signal_data->rule, + signal_data); + + /* Add the match rule to the bus... + * + * Avoid adding match rules for NameLost and NameAcquired messages - the bus will + * always send such messages to us. + */ + if (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) + { + if (!is_signal_data_for_name_lost_or_acquired (signal_data)) + add_match_rule (connection, signal_data->rule); + } + + signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array, + signal_data->sender_unique_name); + if (signal_data_array == NULL) + { + signal_data_array = g_ptr_array_new (); + g_hash_table_insert (connection->map_sender_unique_name_to_signal_data_array, + g_strdup (signal_data->sender_unique_name), + signal_data_array); + } + g_ptr_array_add (signal_data_array, signal_data); + + out: + g_hash_table_insert (connection->map_id_to_signal_data, + GUINT_TO_POINTER (subscriber.id), + signal_data); + + CONNECTION_UNLOCK (connection); + + return subscriber.id; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* called in any thread */ +/* must hold lock when calling this (except if connection->finalizing is TRUE) */ +static void +unsubscribe_id_internal (GDBusConnection *connection, + guint subscription_id, + GArray *out_removed_subscribers) +{ + SignalData *signal_data; + GPtrArray *signal_data_array; + guint n; + + signal_data = g_hash_table_lookup (connection->map_id_to_signal_data, + GUINT_TO_POINTER (subscription_id)); + if (signal_data == NULL) + { + /* Don't warn here, we may have thrown all subscriptions out when the connection was closed */ + goto out; + } + + for (n = 0; n < signal_data->subscribers->len; n++) + { + SignalSubscriber *subscriber; + + subscriber = &(g_array_index (signal_data->subscribers, SignalSubscriber, n)); + if (subscriber->id != subscription_id) + continue; + + g_warn_if_fail (g_hash_table_remove (connection->map_id_to_signal_data, + GUINT_TO_POINTER (subscription_id))); + g_array_append_val (out_removed_subscribers, *subscriber); + g_array_remove_index (signal_data->subscribers, n); + + if (signal_data->subscribers->len == 0) + { + g_warn_if_fail (g_hash_table_remove (connection->map_rule_to_signal_data, signal_data->rule)); + + signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array, + signal_data->sender_unique_name); + g_warn_if_fail (signal_data_array != NULL); + g_warn_if_fail (g_ptr_array_remove (signal_data_array, signal_data)); + + if (signal_data_array->len == 0) + { + g_warn_if_fail (g_hash_table_remove (connection->map_sender_unique_name_to_signal_data_array, + signal_data->sender_unique_name)); + } + + /* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */ + if ((connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) && + !is_signal_data_for_name_lost_or_acquired (signal_data) && + !g_dbus_connection_is_closed (connection) && + !connection->finalizing) + { + /* The check for g_dbus_connection_is_closed() means that + * sending the RemoveMatch message can't fail with + * G_IO_ERROR_CLOSED, because we're holding the lock, + * so on_worker_closed() can't happen between the check we just + * did, and releasing the lock later. + */ + remove_match_rule (connection, signal_data->rule); + } + + signal_data_free (signal_data); + } + + goto out; + } + + g_assert_not_reached (); + + out: + ; +} + +/** + * g_dbus_connection_signal_unsubscribe: + * @connection: A #GDBusConnection. + * @subscription_id: A subscription id obtained from g_dbus_connection_signal_subscribe(). + * + * Unsubscribes from signals. + * + * Since: 2.26 + */ +void +g_dbus_connection_signal_unsubscribe (GDBusConnection *connection, + guint subscription_id) +{ + GArray *subscribers; + guint n; + + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail (check_initialized (connection)); + + subscribers = g_array_new (FALSE, FALSE, sizeof (SignalSubscriber)); + + CONNECTION_LOCK (connection); + unsubscribe_id_internal (connection, + subscription_id, + subscribers); + CONNECTION_UNLOCK (connection); + + /* invariant */ + g_assert (subscribers->len == 0 || subscribers->len == 1); + + /* call GDestroyNotify without lock held */ + for (n = 0; n < subscribers->len; n++) + { + SignalSubscriber *subscriber; + subscriber = &(g_array_index (subscribers, SignalSubscriber, n)); + call_destroy_notify (subscriber->context, + subscriber->user_data_free_func, + subscriber->user_data); + g_main_context_unref (subscriber->context); + } + + g_array_free (subscribers, TRUE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + guint subscription_id; + GDBusSignalCallback callback; + gpointer user_data; + GDBusMessage *message; + GDBusConnection *connection; + const gchar *sender; + const gchar *path; + const gchar *interface; + const gchar *member; +} SignalInstance; + +/* called on delivery thread (e.g. where g_dbus_connection_signal_subscribe() was called) with + * no locks held + */ +static gboolean +emit_signal_instance_in_idle_cb (gpointer data) +{ + SignalInstance *signal_instance = data; + GVariant *parameters; + gboolean has_subscription; + + parameters = g_dbus_message_get_body (signal_instance->message); + if (parameters == NULL) + { + parameters = g_variant_new ("()"); + g_variant_ref_sink (parameters); + } + else + { + g_variant_ref_sink (parameters); + } + +#if 0 + g_print ("in emit_signal_instance_in_idle_cb (id=%d sender=%s path=%s interface=%s member=%s params=%s)\n", + signal_instance->subscription_id, + signal_instance->sender, + signal_instance->path, + signal_instance->interface, + signal_instance->member, + g_variant_print (parameters, TRUE)); +#endif + + /* Careful here, don't do the callback if we no longer has the subscription */ + CONNECTION_LOCK (signal_instance->connection); + has_subscription = FALSE; + if (g_hash_table_lookup (signal_instance->connection->map_id_to_signal_data, + GUINT_TO_POINTER (signal_instance->subscription_id)) != NULL) + has_subscription = TRUE; + CONNECTION_UNLOCK (signal_instance->connection); + + if (has_subscription) + signal_instance->callback (signal_instance->connection, + signal_instance->sender, + signal_instance->path, + signal_instance->interface, + signal_instance->member, + parameters, + signal_instance->user_data); + + g_variant_unref (parameters); + + return FALSE; +} + +static void +signal_instance_free (SignalInstance *signal_instance) +{ + g_object_unref (signal_instance->message); + g_object_unref (signal_instance->connection); + g_free (signal_instance); +} + +/* called in GDBusWorker thread WITH lock held */ +static void +schedule_callbacks (GDBusConnection *connection, + GPtrArray *signal_data_array, + GDBusMessage *message, + const gchar *sender) +{ + guint n, m; + const gchar *interface; + const gchar *member; + const gchar *path; + const gchar *arg0; + + interface = NULL; + member = NULL; + path = NULL; + arg0 = NULL; + + interface = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + path = g_dbus_message_get_path (message); + arg0 = g_dbus_message_get_arg0 (message); + +#if 0 + g_print ("In schedule_callbacks:\n" + " sender = `%s'\n" + " interface = `%s'\n" + " member = `%s'\n" + " path = `%s'\n" + " arg0 = `%s'\n", + sender, + interface, + member, + path, + arg0); +#endif + + /* TODO: if this is slow, then we can change signal_data_array into + * map_object_path_to_signal_data_array or something. + */ + for (n = 0; n < signal_data_array->len; n++) + { + SignalData *signal_data = signal_data_array->pdata[n]; + + if (signal_data->interface_name != NULL && g_strcmp0 (signal_data->interface_name, interface) != 0) + continue; + + if (signal_data->member != NULL && g_strcmp0 (signal_data->member, member) != 0) + continue; + + if (signal_data->object_path != NULL && g_strcmp0 (signal_data->object_path, path) != 0) + continue; + + if (signal_data->arg0 != NULL && g_strcmp0 (signal_data->arg0, arg0) != 0) + continue; + + for (m = 0; m < signal_data->subscribers->len; m++) + { + SignalSubscriber *subscriber; + GSource *idle_source; + SignalInstance *signal_instance; + + subscriber = &(g_array_index (signal_data->subscribers, SignalSubscriber, m)); + + signal_instance = g_new0 (SignalInstance, 1); + signal_instance->subscription_id = subscriber->id; + signal_instance->callback = subscriber->callback; + signal_instance->user_data = subscriber->user_data; + signal_instance->message = g_object_ref (message); + signal_instance->connection = g_object_ref (connection); + signal_instance->sender = sender; + signal_instance->path = path; + signal_instance->interface = interface; + signal_instance->member = member; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + emit_signal_instance_in_idle_cb, + signal_instance, + (GDestroyNotify) signal_instance_free); + g_source_attach (idle_source, subscriber->context); + g_source_unref (idle_source); + } + } +} + +/* called in GDBusWorker thread with lock held */ +static void +distribute_signals (GDBusConnection *connection, + GDBusMessage *message) +{ + GPtrArray *signal_data_array; + const gchar *sender; + + sender = g_dbus_message_get_sender (message); + + if (G_UNLIKELY (_g_dbus_debug_signal ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Signal:\n" + " <<<< RECEIVED SIGNAL %s.%s\n" + " on object %s\n" + " sent by name %s\n", + g_dbus_message_get_interface (message), + g_dbus_message_get_member (message), + g_dbus_message_get_path (message), + sender != NULL ? sender : "(none)"); + _g_dbus_debug_print_unlock (); + } + + /* collect subscribers that match on sender */ + if (sender != NULL) + { + signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array, sender); + if (signal_data_array != NULL) + schedule_callbacks (connection, signal_data_array, message, sender); + } + + /* collect subscribers not matching on sender */ + signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array, ""); + if (signal_data_array != NULL) + schedule_callbacks (connection, signal_data_array, message, sender); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* only called from finalize(), removes all subscriptions */ +static void +purge_all_signal_subscriptions (GDBusConnection *connection) +{ + GHashTableIter iter; + gpointer key; + GArray *ids; + GArray *subscribers; + guint n; + + ids = g_array_new (FALSE, FALSE, sizeof (guint)); + g_hash_table_iter_init (&iter, connection->map_id_to_signal_data); + while (g_hash_table_iter_next (&iter, &key, NULL)) + { + guint subscription_id = GPOINTER_TO_UINT (key); + g_array_append_val (ids, subscription_id); + } + + subscribers = g_array_new (FALSE, FALSE, sizeof (SignalSubscriber)); + for (n = 0; n < ids->len; n++) + { + guint subscription_id = g_array_index (ids, guint, n); + unsubscribe_id_internal (connection, + subscription_id, + subscribers); + } + g_array_free (ids, TRUE); + + /* call GDestroyNotify without lock held */ + for (n = 0; n < subscribers->len; n++) + { + SignalSubscriber *subscriber; + subscriber = &(g_array_index (subscribers, SignalSubscriber, n)); + call_destroy_notify (subscriber->context, + subscriber->user_data_free_func, + subscriber->user_data); + g_main_context_unref (subscriber->context); + } + + g_array_free (subscribers, TRUE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusInterfaceVTable * +_g_dbus_interface_vtable_copy (const GDBusInterfaceVTable *vtable) +{ + /* Don't waste memory by copying padding - remember to update this + * when changing struct _GDBusInterfaceVTable in gdbusconnection.h + */ + return g_memdup ((gconstpointer) vtable, 3 * sizeof (gpointer)); +} + +static void +_g_dbus_interface_vtable_free (GDBusInterfaceVTable *vtable) +{ + g_free (vtable); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusSubtreeVTable * +_g_dbus_subtree_vtable_copy (const GDBusSubtreeVTable *vtable) +{ + /* Don't waste memory by copying padding - remember to update this + * when changing struct _GDBusSubtreeVTable in gdbusconnection.h + */ + return g_memdup ((gconstpointer) vtable, 3 * sizeof (gpointer)); +} + +static void +_g_dbus_subtree_vtable_free (GDBusSubtreeVTable *vtable) +{ + g_free (vtable); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +struct ExportedObject +{ + gchar *object_path; + GDBusConnection *connection; + + /* maps gchar* -> ExportedInterface* */ + GHashTable *map_if_name_to_ei; +}; + +/* only called with lock held */ +static void +exported_object_free (ExportedObject *eo) +{ + g_free (eo->object_path); + g_hash_table_unref (eo->map_if_name_to_ei); + g_free (eo); +} + +typedef struct +{ + ExportedObject *eo; + + guint id; + gchar *interface_name; + GDBusInterfaceVTable *vtable; + GDBusInterfaceInfo *interface_info; + + GMainContext *context; + gpointer user_data; + GDestroyNotify user_data_free_func; +} ExportedInterface; + +/* called with lock held */ +static void +exported_interface_free (ExportedInterface *ei) +{ + g_dbus_interface_info_cache_release (ei->interface_info); + g_dbus_interface_info_unref ((GDBusInterfaceInfo *) ei->interface_info); + + call_destroy_notify (ei->context, + ei->user_data_free_func, + ei->user_data); + + g_main_context_unref (ei->context); + + g_free (ei->interface_name); + _g_dbus_interface_vtable_free (ei->vtable); + g_free (ei); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Convenience function to check if @registration_id (if not zero) or + * @subtree_registration_id (if not zero) has been unregistered. If + * so, returns %TRUE. + * + * May be called by any thread. Caller must *not* hold lock. + */ +static gboolean +has_object_been_unregistered (GDBusConnection *connection, + guint registration_id, + guint subtree_registration_id) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + + ret = FALSE; + + CONNECTION_LOCK (connection); + if (registration_id != 0 && g_hash_table_lookup (connection->map_id_to_ei, + GUINT_TO_POINTER (registration_id)) == NULL) + { + ret = TRUE; + } + else if (subtree_registration_id != 0 && g_hash_table_lookup (connection->map_id_to_es, + GUINT_TO_POINTER (subtree_registration_id)) == NULL) + { + ret = TRUE; + } + CONNECTION_UNLOCK (connection); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusConnection *connection; + GDBusMessage *message; + gpointer user_data; + const gchar *property_name; + const GDBusInterfaceVTable *vtable; + GDBusInterfaceInfo *interface_info; + const GDBusPropertyInfo *property_info; + guint registration_id; + guint subtree_registration_id; +} PropertyData; + +static void +property_data_free (PropertyData *data) +{ + g_object_unref (data->connection); + g_object_unref (data->message); + g_free (data); +} + +/* called in thread where object was registered - no locks held */ +static gboolean +invoke_get_property_in_idle_cb (gpointer _data) +{ + PropertyData *data = _data; + GVariant *value; + GError *error; + GDBusMessage *reply; + + if (has_object_been_unregistered (data->connection, + data->registration_id, + data->subtree_registration_id)) + { + reply = g_dbus_message_new_method_error (data->message, + "org.freedesktop.DBus.Error.UnknownMethod", + _("No such interface `org.freedesktop.DBus.Properties' on object at path %s"), + g_dbus_message_get_path (data->message)); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + goto out; + } + + error = NULL; + value = data->vtable->get_property (data->connection, + g_dbus_message_get_sender (data->message), + g_dbus_message_get_path (data->message), + data->interface_info->name, + data->property_name, + &error, + data->user_data); + + + if (value != NULL) + { + g_assert_no_error (error); + + g_variant_take_ref (value); + reply = g_dbus_message_new_method_reply (data->message); + g_dbus_message_set_body (reply, g_variant_new ("(v)", value)); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_variant_unref (value); + g_object_unref (reply); + } + else + { + gchar *dbus_error_name; + g_assert (error != NULL); + dbus_error_name = g_dbus_error_encode_gerror (error); + reply = g_dbus_message_new_method_error_literal (data->message, + dbus_error_name, + error->message); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_free (dbus_error_name); + g_error_free (error); + g_object_unref (reply); + } + + out: + return FALSE; +} + +/* called in thread where object was registered - no locks held */ +static gboolean +invoke_set_property_in_idle_cb (gpointer _data) +{ + PropertyData *data = _data; + GError *error; + GDBusMessage *reply; + GVariant *value; + + error = NULL; + value = NULL; + + g_variant_get (g_dbus_message_get_body (data->message), + "(ssv)", + NULL, + NULL, + &value); + + /* Fail with org.freedesktop.DBus.Error.InvalidArgs if the type + * of the given value is wrong + */ + if (g_strcmp0 (g_variant_get_type_string (value), data->property_info->signature) != 0) + { + reply = g_dbus_message_new_method_error (data->message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("Error setting property `%s': Expected type `%s' but got `%s'"), + data->property_info->name, + data->property_info->signature, + g_variant_get_type_string (value)); + goto out; + } + + if (!data->vtable->set_property (data->connection, + g_dbus_message_get_sender (data->message), + g_dbus_message_get_path (data->message), + data->interface_info->name, + data->property_name, + value, + &error, + data->user_data)) + { + gchar *dbus_error_name; + g_assert (error != NULL); + dbus_error_name = g_dbus_error_encode_gerror (error); + reply = g_dbus_message_new_method_error_literal (data->message, + dbus_error_name, + error->message); + g_free (dbus_error_name); + g_error_free (error); + } + else + { + reply = g_dbus_message_new_method_reply (data->message); + } + + out: + g_assert (reply != NULL); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + g_variant_unref (value); + + return FALSE; +} + +/* called in any thread with connection's lock held */ +static gboolean +validate_and_maybe_schedule_property_getset (GDBusConnection *connection, + GDBusMessage *message, + guint registration_id, + guint subtree_registration_id, + gboolean is_get, + GDBusInterfaceInfo *interface_info, + const GDBusInterfaceVTable *vtable, + GMainContext *main_context, + gpointer user_data) +{ + gboolean handled; + const char *interface_name; + const char *property_name; + const GDBusPropertyInfo *property_info; + GSource *idle_source; + PropertyData *property_data; + GDBusMessage *reply; + + handled = FALSE; + + if (is_get) + g_variant_get (g_dbus_message_get_body (message), + "(&s&s)", + &interface_name, + &property_name); + else + g_variant_get (g_dbus_message_get_body (message), + "(&s&sv)", + &interface_name, + &property_name, + NULL); + + + if (is_get) + { + if (vtable == NULL || vtable->get_property == NULL) + goto out; + } + else + { + if (vtable == NULL || vtable->set_property == NULL) + goto out; + } + + /* Check that the property exists - if not fail with org.freedesktop.DBus.Error.InvalidArgs + */ + property_info = NULL; + + /* TODO: the cost of this is O(n) - it might be worth caching the result */ + property_info = g_dbus_interface_info_lookup_property (interface_info, property_name); + if (property_info == NULL) + { + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("No such property `%s'"), + property_name); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + if (is_get && !(property_info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)) + { + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("Property `%s' is not readable"), + property_name); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + else if (!is_get && !(property_info->flags & G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE)) + { + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("Property `%s' is not writable"), + property_name); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + /* ok, got the property info - call user code in an idle handler */ + property_data = g_new0 (PropertyData, 1); + property_data->connection = g_object_ref (connection); + property_data->message = g_object_ref (message); + property_data->user_data = user_data; + property_data->property_name = property_name; + property_data->vtable = vtable; + property_data->interface_info = interface_info; + property_data->property_info = property_info; + property_data->registration_id = registration_id; + property_data->subtree_registration_id = subtree_registration_id; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + is_get ? invoke_get_property_in_idle_cb : invoke_set_property_in_idle_cb, + property_data, + (GDestroyNotify) property_data_free); + g_source_attach (idle_source, main_context); + g_source_unref (idle_source); + + handled = TRUE; + + out: + return handled; +} + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +handle_getset_property (GDBusConnection *connection, + ExportedObject *eo, + GDBusMessage *message, + gboolean is_get) +{ + ExportedInterface *ei; + gboolean handled; + const char *interface_name; + const char *property_name; + + handled = FALSE; + + if (is_get) + g_variant_get (g_dbus_message_get_body (message), + "(&s&s)", + &interface_name, + &property_name); + else + g_variant_get (g_dbus_message_get_body (message), + "(&s&sv)", + &interface_name, + &property_name, + NULL); + + /* Fail with org.freedesktop.DBus.Error.InvalidArgs if there is + * no such interface registered + */ + ei = g_hash_table_lookup (eo->map_if_name_to_ei, interface_name); + if (ei == NULL) + { + GDBusMessage *reply; + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("No such interface `%s'"), + interface_name); + g_dbus_connection_send_message_unlocked (eo->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + handled = validate_and_maybe_schedule_property_getset (eo->connection, + message, + ei->id, + 0, + is_get, + ei->interface_info, + ei->vtable, + ei->context, + ei->user_data); + out: + return handled; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusConnection *connection; + GDBusMessage *message; + gpointer user_data; + const GDBusInterfaceVTable *vtable; + GDBusInterfaceInfo *interface_info; + guint registration_id; + guint subtree_registration_id; +} PropertyGetAllData; + +static void +property_get_all_data_free (PropertyData *data) +{ + g_object_unref (data->connection); + g_object_unref (data->message); + g_free (data); +} + +/* called in thread where object was registered - no locks held */ +static gboolean +invoke_get_all_properties_in_idle_cb (gpointer _data) +{ + PropertyGetAllData *data = _data; + GVariantBuilder builder; + GDBusMessage *reply; + guint n; + + if (has_object_been_unregistered (data->connection, + data->registration_id, + data->subtree_registration_id)) + { + reply = g_dbus_message_new_method_error (data->message, + "org.freedesktop.DBus.Error.UnknownMethod", + _("No such interface `org.freedesktop.DBus.Properties' on object at path %s"), + g_dbus_message_get_path (data->message)); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + goto out; + } + + /* TODO: Right now we never fail this call - we just omit values if + * a get_property() call is failing. + * + * We could fail the whole call if just a single get_property() call + * returns an error. We need clarification in the D-Bus spec about this. + */ + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a{sv})")); + g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}")); + for (n = 0; data->interface_info->properties != NULL && data->interface_info->properties[n] != NULL; n++) + { + const GDBusPropertyInfo *property_info = data->interface_info->properties[n]; + GVariant *value; + + if (!(property_info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)) + continue; + + value = data->vtable->get_property (data->connection, + g_dbus_message_get_sender (data->message), + g_dbus_message_get_path (data->message), + data->interface_info->name, + property_info->name, + NULL, + data->user_data); + + if (value == NULL) + continue; + + g_variant_take_ref (value); + g_variant_builder_add (&builder, + "{sv}", + property_info->name, + value); + g_variant_unref (value); + } + g_variant_builder_close (&builder); + + reply = g_dbus_message_new_method_reply (data->message); + g_dbus_message_set_body (reply, g_variant_builder_end (&builder)); + g_dbus_connection_send_message (data->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + + out: + return FALSE; +} + +/* called in any thread with connection's lock held */ +static gboolean +validate_and_maybe_schedule_property_get_all (GDBusConnection *connection, + GDBusMessage *message, + guint registration_id, + guint subtree_registration_id, + GDBusInterfaceInfo *interface_info, + const GDBusInterfaceVTable *vtable, + GMainContext *main_context, + gpointer user_data) +{ + gboolean handled; + const char *interface_name; + GSource *idle_source; + PropertyGetAllData *property_get_all_data; + + handled = FALSE; + + g_variant_get (g_dbus_message_get_body (message), + "(&s)", + &interface_name); + + if (vtable == NULL || vtable->get_property == NULL) + goto out; + + /* ok, got the property info - call user in an idle handler */ + property_get_all_data = g_new0 (PropertyGetAllData, 1); + property_get_all_data->connection = g_object_ref (connection); + property_get_all_data->message = g_object_ref (message); + property_get_all_data->user_data = user_data; + property_get_all_data->vtable = vtable; + property_get_all_data->interface_info = interface_info; + property_get_all_data->registration_id = registration_id; + property_get_all_data->subtree_registration_id = subtree_registration_id; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + invoke_get_all_properties_in_idle_cb, + property_get_all_data, + (GDestroyNotify) property_get_all_data_free); + g_source_attach (idle_source, main_context); + g_source_unref (idle_source); + + handled = TRUE; + + out: + return handled; +} + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +handle_get_all_properties (GDBusConnection *connection, + ExportedObject *eo, + GDBusMessage *message) +{ + ExportedInterface *ei; + gboolean handled; + const char *interface_name; + + handled = FALSE; + + g_variant_get (g_dbus_message_get_body (message), + "(&s)", + &interface_name); + + /* Fail with org.freedesktop.DBus.Error.InvalidArgs if there is + * no such interface registered + */ + ei = g_hash_table_lookup (eo->map_if_name_to_ei, interface_name); + if (ei == NULL) + { + GDBusMessage *reply; + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("No such interface"), + interface_name); + g_dbus_connection_send_message_unlocked (eo->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + handled = validate_and_maybe_schedule_property_get_all (eo->connection, + message, + ei->id, + 0, + ei->interface_info, + ei->vtable, + ei->context, + ei->user_data); + out: + return handled; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static const gchar introspect_header[] = + "\n" + "\n" + "\n"; + +static const gchar introspect_tail[] = + "\n"; + +static const gchar introspect_properties_interface[] = + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n"; + +static const gchar introspect_introspectable_interface[] = + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n"; + +static void +introspect_append_header (GString *s) +{ + g_string_append (s, introspect_header); +} + +static void +maybe_add_path (const gchar *path, gsize path_len, const gchar *object_path, GHashTable *set) +{ + if (g_str_has_prefix (object_path, path) && strlen (object_path) > path_len && object_path[path_len-1] == '/') + { + const gchar *begin; + const gchar *end; + gchar *s; + + begin = object_path + path_len; + end = strchr (begin, '/'); + if (end != NULL) + s = g_strndup (begin, end - begin); + else + s = g_strdup (begin); + + if (g_hash_table_lookup (set, s) == NULL) + g_hash_table_insert (set, s, GUINT_TO_POINTER (1)); + else + g_free (s); + } +} + +/* TODO: we want a nicer public interface for this */ +/* called in any thread with connection's lock held */ +static gchar ** +g_dbus_connection_list_registered_unlocked (GDBusConnection *connection, + const gchar *path) +{ + GPtrArray *p; + gchar **ret; + GHashTableIter hash_iter; + const gchar *object_path; + gsize path_len; + GHashTable *set; + GList *keys; + GList *l; + + CONNECTION_ENSURE_LOCK (connection); + + path_len = strlen (path); + if (path_len > 1) + path_len++; + + set = g_hash_table_new (g_str_hash, g_str_equal); + + g_hash_table_iter_init (&hash_iter, connection->map_object_path_to_eo); + while (g_hash_table_iter_next (&hash_iter, (gpointer) &object_path, NULL)) + maybe_add_path (path, path_len, object_path, set); + + g_hash_table_iter_init (&hash_iter, connection->map_object_path_to_es); + while (g_hash_table_iter_next (&hash_iter, (gpointer) &object_path, NULL)) + maybe_add_path (path, path_len, object_path, set); + + p = g_ptr_array_new (); + keys = g_hash_table_get_keys (set); + for (l = keys; l != NULL; l = l->next) + g_ptr_array_add (p, l->data); + g_hash_table_unref (set); + g_list_free (keys); + + g_ptr_array_add (p, NULL); + ret = (gchar **) g_ptr_array_free (p, FALSE); + return ret; +} + +/* called in any thread with connection's lock not held */ +static gchar ** +g_dbus_connection_list_registered (GDBusConnection *connection, + const gchar *path) +{ + gchar **ret; + CONNECTION_LOCK (connection); + ret = g_dbus_connection_list_registered_unlocked (connection, path); + CONNECTION_UNLOCK (connection); + return ret; +} + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +handle_introspect (GDBusConnection *connection, + ExportedObject *eo, + GDBusMessage *message) +{ + guint n; + GString *s; + GDBusMessage *reply; + GHashTableIter hash_iter; + ExportedInterface *ei; + gchar **registered; + + /* first the header with the standard interfaces */ + s = g_string_sized_new (sizeof (introspect_header) + + sizeof (introspect_properties_interface) + + sizeof (introspect_introspectable_interface) + + sizeof (introspect_tail)); + introspect_append_header (s); + if (!g_hash_table_lookup (eo->map_if_name_to_ei, + "org.freedesktop.DBus.Properties")) + g_string_append (s, introspect_properties_interface); + + if (!g_hash_table_lookup (eo->map_if_name_to_ei, + "org.freedesktop.DBus.Introspectable")) + g_string_append (s, introspect_introspectable_interface); + + /* then include the registered interfaces */ + g_hash_table_iter_init (&hash_iter, eo->map_if_name_to_ei); + while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer) &ei)) + g_dbus_interface_info_generate_xml (ei->interface_info, 2, s); + + /* finally include nodes registered below us */ + registered = g_dbus_connection_list_registered_unlocked (connection, eo->object_path); + for (n = 0; registered != NULL && registered[n] != NULL; n++) + g_string_append_printf (s, " \n", registered[n]); + g_strfreev (registered); + g_string_append (s, introspect_tail); + + reply = g_dbus_message_new_method_reply (message); + g_dbus_message_set_body (reply, g_variant_new ("(s)", s->str)); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + g_string_free (s, TRUE); + + return TRUE; +} + +/* called in thread where object was registered - no locks held */ +static gboolean +call_in_idle_cb (gpointer user_data) +{ + GDBusMethodInvocation *invocation = G_DBUS_METHOD_INVOCATION (user_data); + GDBusInterfaceVTable *vtable; + guint registration_id; + guint subtree_registration_id; + + registration_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (invocation), "g-dbus-registration-id")); + subtree_registration_id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (invocation), "g-dbus-subtree-registration-id")); + + if (has_object_been_unregistered (g_dbus_method_invocation_get_connection (invocation), + registration_id, + subtree_registration_id)) + { + GDBusMessage *reply; + reply = g_dbus_message_new_method_error (g_dbus_method_invocation_get_message (invocation), + "org.freedesktop.DBus.Error.UnknownMethod", + _("No such interface `%s' on object at path %s"), + g_dbus_method_invocation_get_interface_name (invocation), + g_dbus_method_invocation_get_object_path (invocation)); + g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + goto out; + } + + vtable = g_object_get_data (G_OBJECT (invocation), "g-dbus-interface-vtable"); + g_assert (vtable != NULL && vtable->method_call != NULL); + + vtable->method_call (g_dbus_method_invocation_get_connection (invocation), + g_dbus_method_invocation_get_sender (invocation), + g_dbus_method_invocation_get_object_path (invocation), + g_dbus_method_invocation_get_interface_name (invocation), + g_dbus_method_invocation_get_method_name (invocation), + g_dbus_method_invocation_get_parameters (invocation), + g_object_ref (invocation), + g_dbus_method_invocation_get_user_data (invocation)); + + out: + return FALSE; +} + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +validate_and_maybe_schedule_method_call (GDBusConnection *connection, + GDBusMessage *message, + guint registration_id, + guint subtree_registration_id, + GDBusInterfaceInfo *interface_info, + const GDBusInterfaceVTable *vtable, + GMainContext *main_context, + gpointer user_data) +{ + GDBusMethodInvocation *invocation; + const GDBusMethodInfo *method_info; + GDBusMessage *reply; + GVariant *parameters; + GSource *idle_source; + gboolean handled; + GVariantType *in_type; + + handled = FALSE; + + /* TODO: the cost of this is O(n) - it might be worth caching the result */ + method_info = g_dbus_interface_info_lookup_method (interface_info, g_dbus_message_get_member (message)); + + /* if the method doesn't exist, return the org.freedesktop.DBus.Error.UnknownMethod + * error to the caller + */ + if (method_info == NULL) + { + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.UnknownMethod", + _("No such method `%s'"), + g_dbus_message_get_member (message)); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + parameters = g_dbus_message_get_body (message); + if (parameters == NULL) + { + parameters = g_variant_new ("()"); + g_variant_ref_sink (parameters); + } + else + { + g_variant_ref (parameters); + } + + /* Check that the incoming args are of the right type - if they are not, return + * the org.freedesktop.DBus.Error.InvalidArgs error to the caller + */ + in_type = _g_dbus_compute_complete_signature (method_info->in_args); + if (!g_variant_is_of_type (parameters, in_type)) + { + gchar *type_string; + + type_string = g_variant_type_dup_string (in_type); + + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("Type of message, `%s', does not match expected type `%s'"), + g_variant_get_type_string (parameters), + type_string); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_variant_type_free (in_type); + g_variant_unref (parameters); + g_object_unref (reply); + g_free (type_string); + handled = TRUE; + goto out; + } + g_variant_type_free (in_type); + + /* schedule the call in idle */ + invocation = _g_dbus_method_invocation_new (g_dbus_message_get_sender (message), + g_dbus_message_get_path (message), + g_dbus_message_get_interface (message), + g_dbus_message_get_member (message), + method_info, + connection, + message, + parameters, + user_data); + g_variant_unref (parameters); + + /* TODO: would be nicer with a real MethodData like we already + * have PropertyData and PropertyGetAllData... */ + g_object_set_data (G_OBJECT (invocation), "g-dbus-interface-vtable", (gpointer) vtable); + g_object_set_data (G_OBJECT (invocation), "g-dbus-registration-id", GUINT_TO_POINTER (registration_id)); + g_object_set_data (G_OBJECT (invocation), "g-dbus-subtree-registration-id", GUINT_TO_POINTER (subtree_registration_id)); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + call_in_idle_cb, + invocation, + g_object_unref); + g_source_attach (idle_source, main_context); + g_source_unref (idle_source); + + handled = TRUE; + + out: + return handled; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +obj_message_func (GDBusConnection *connection, + ExportedObject *eo, + GDBusMessage *message) +{ + const gchar *interface_name; + const gchar *member; + const gchar *signature; + gboolean handled; + + handled = FALSE; + + interface_name = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + signature = g_dbus_message_get_signature (message); + + /* see if we have an interface for handling this call */ + if (interface_name != NULL) + { + ExportedInterface *ei; + ei = g_hash_table_lookup (eo->map_if_name_to_ei, interface_name); + if (ei != NULL) + { + /* we do - invoke the handler in idle in the right thread */ + + /* handle no vtable or handler being present */ + if (ei->vtable == NULL || ei->vtable->method_call == NULL) + goto out; + + handled = validate_and_maybe_schedule_method_call (connection, + message, + ei->id, + 0, + ei->interface_info, + ei->vtable, + ei->context, + ei->user_data); + goto out; + } + } + + if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Introspectable") == 0 && + g_strcmp0 (member, "Introspect") == 0 && + g_strcmp0 (signature, "") == 0) + { + handled = handle_introspect (connection, eo, message); + goto out; + } + else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0 && + g_strcmp0 (member, "Get") == 0 && + g_strcmp0 (signature, "ss") == 0) + { + handled = handle_getset_property (connection, eo, message, TRUE); + goto out; + } + else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0 && + g_strcmp0 (member, "Set") == 0 && + g_strcmp0 (signature, "ssv") == 0) + { + handled = handle_getset_property (connection, eo, message, FALSE); + goto out; + } + else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0 && + g_strcmp0 (member, "GetAll") == 0 && + g_strcmp0 (signature, "s") == 0) + { + handled = handle_get_all_properties (connection, eo, message); + goto out; + } + + out: + return handled; +} + +/** + * g_dbus_connection_register_object: + * @connection: A #GDBusConnection. + * @object_path: The object path to register at. + * @interface_info: Introspection data for the interface. + * @vtable: (allow-none): A #GDBusInterfaceVTable to call into or %NULL. + * @user_data: (allow-none): Data to pass to functions in @vtable. + * @user_data_free_func: Function to call when the object path is unregistered. + * @error: Return location for error or %NULL. + * + * Registers callbacks for exported objects at @object_path with the + * D-Bus interface that is described in @interface_info. + * + * Calls to functions in @vtable (and @user_data_free_func) will + * happen in the thread-default main + * loop of the thread you are calling this method from. + * + * Note that all #GVariant values passed to functions in @vtable will match + * the signature given in @interface_info - if a remote caller passes + * incorrect values, the org.freedesktop.DBus.Error.InvalidArgs + * is returned to the remote caller. + * + * Additionally, if the remote caller attempts to invoke methods or + * access properties not mentioned in @interface_info the + * org.freedesktop.DBus.Error.UnknownMethod resp. + * org.freedesktop.DBus.Error.InvalidArgs errors + * are returned to the caller. + * + * It is considered a programming error if the + * #GDBusInterfaceGetPropertyFunc function in @vtable returns a + * #GVariant of incorrect type. + * + * If an existing callback is already registered at @object_path and + * @interface_name, then @error is set to #G_IO_ERROR_EXISTS. + * + * GDBus automatically implements the standard D-Bus interfaces + * org.freedesktop.DBus.Properties, org.freedesktop.DBus.Introspectable + * and org.freedesktop.Peer, so you don't have to implement those for + * the objects you export. You can implement + * org.freedesktop.DBus.Properties yourself, e.g. to handle getting + * and setting of properties asynchronously. + * + * Note that the reference count on @interface_info will be + * incremented by 1 (unless allocated statically, e.g. if the + * reference count is -1, see g_dbus_interface_info_ref()) for as long + * as the object is exported. Also note that @vtable will be copied. + * + * See for an example of how to use this method. + * + * Returns: 0 if @error is set, otherwise a registration id (never 0) + * that can be used with g_dbus_connection_unregister_object() . + * + * Since: 2.26 + */ +guint +g_dbus_connection_register_object (GDBusConnection *connection, + const gchar *object_path, + GDBusInterfaceInfo *interface_info, + const GDBusInterfaceVTable *vtable, + gpointer user_data, + GDestroyNotify user_data_free_func, + GError **error) +{ + ExportedObject *eo; + ExportedInterface *ei; + guint ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (object_path != NULL && g_variant_is_object_path (object_path), 0); + g_return_val_if_fail (interface_info != NULL, 0); + g_return_val_if_fail (g_dbus_is_interface_name (interface_info->name), 0); + g_return_val_if_fail (error == NULL || *error == NULL, 0); + g_return_val_if_fail (check_initialized (connection), 0); + + ret = 0; + + CONNECTION_LOCK (connection); + + eo = g_hash_table_lookup (connection->map_object_path_to_eo, object_path); + if (eo == NULL) + { + eo = g_new0 (ExportedObject, 1); + eo->object_path = g_strdup (object_path); + eo->connection = connection; + eo->map_if_name_to_ei = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) exported_interface_free); + g_hash_table_insert (connection->map_object_path_to_eo, eo->object_path, eo); + } + + ei = g_hash_table_lookup (eo->map_if_name_to_ei, interface_info->name); + if (ei != NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_EXISTS, + _("An object is already exported for the interface %s at %s"), + interface_info->name, + object_path); + goto out; + } + + ei = g_new0 (ExportedInterface, 1); + ei->id = _global_registration_id++; /* TODO: overflow etc. */ + ei->eo = eo; + ei->user_data = user_data; + ei->user_data_free_func = user_data_free_func; + ei->vtable = _g_dbus_interface_vtable_copy (vtable); + ei->interface_info = g_dbus_interface_info_ref (interface_info); + g_dbus_interface_info_cache_build (ei->interface_info); + ei->interface_name = g_strdup (interface_info->name); + ei->context = g_main_context_ref_thread_default (); + + g_hash_table_insert (eo->map_if_name_to_ei, + (gpointer) ei->interface_name, + ei); + g_hash_table_insert (connection->map_id_to_ei, + GUINT_TO_POINTER (ei->id), + ei); + + ret = ei->id; + + out: + CONNECTION_UNLOCK (connection); + + return ret; +} + +/** + * g_dbus_connection_unregister_object: + * @connection: A #GDBusConnection. + * @registration_id: A registration id obtained from g_dbus_connection_register_object(). + * + * Unregisters an object. + * + * Returns: %TRUE if the object was unregistered, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_unregister_object (GDBusConnection *connection, + guint registration_id) +{ + ExportedInterface *ei; + ExportedObject *eo; + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (check_initialized (connection), FALSE); + + ret = FALSE; + + CONNECTION_LOCK (connection); + + ei = g_hash_table_lookup (connection->map_id_to_ei, + GUINT_TO_POINTER (registration_id)); + if (ei == NULL) + goto out; + + eo = ei->eo; + + g_warn_if_fail (g_hash_table_remove (connection->map_id_to_ei, GUINT_TO_POINTER (ei->id))); + g_warn_if_fail (g_hash_table_remove (eo->map_if_name_to_ei, ei->interface_name)); + /* unregister object path if we have no more exported interfaces */ + if (g_hash_table_size (eo->map_if_name_to_ei) == 0) + g_warn_if_fail (g_hash_table_remove (connection->map_object_path_to_eo, + eo->object_path)); + + ret = TRUE; + + out: + CONNECTION_UNLOCK (connection); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_emit_signal: + * @connection: A #GDBusConnection. + * @destination_bus_name: (allow-none): The unique bus name for the destination + * for the signal or %NULL to emit to all listeners. + * @object_path: Path of remote object. + * @interface_name: D-Bus interface to emit a signal on. + * @signal_name: The name of the signal to emit. + * @parameters: (allow-none): A #GVariant tuple with parameters for the signal + * or %NULL if not passing parameters. + * @error: Return location for error or %NULL. + * + * Emits a signal. + * + * If the parameters GVariant is floating, it is consumed. + * + * This can only fail if @parameters is not compatible with the D-Bus protocol. + * + * Returns: %TRUE unless @error is set. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_emit_signal (GDBusConnection *connection, + const gchar *destination_bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + GError **error) +{ + GDBusMessage *message; + gboolean ret; + + message = NULL; + ret = FALSE; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (destination_bus_name == NULL || g_dbus_is_name (destination_bus_name), FALSE); + g_return_val_if_fail (object_path != NULL && g_variant_is_object_path (object_path), FALSE); + g_return_val_if_fail (interface_name != NULL && g_dbus_is_interface_name (interface_name), FALSE); + g_return_val_if_fail (signal_name != NULL && g_dbus_is_member_name (signal_name), FALSE); + g_return_val_if_fail (parameters == NULL || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), FALSE); + g_return_val_if_fail (check_initialized (connection), FALSE); + + if (G_UNLIKELY (_g_dbus_debug_emission ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Emission:\n" + " >>>> SIGNAL EMISSION %s.%s()\n" + " on object %s\n" + " destination %s\n", + interface_name, signal_name, + object_path, + destination_bus_name != NULL ? destination_bus_name : "(none)"); + _g_dbus_debug_print_unlock (); + } + + message = g_dbus_message_new_signal (object_path, + interface_name, + signal_name); + + if (destination_bus_name != NULL) + g_dbus_message_set_header (message, + G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION, + g_variant_new_string (destination_bus_name)); + + if (parameters != NULL) + g_dbus_message_set_body (message, parameters); + + ret = g_dbus_connection_send_message (connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, error); + g_object_unref (message); + + return ret; +} + +static void +add_call_flags (GDBusMessage *message, + GDBusCallFlags flags) +{ + if (flags & G_DBUS_CALL_FLAGS_NO_AUTO_START) + g_dbus_message_set_flags (message, G_DBUS_MESSAGE_FLAGS_NO_AUTO_START); +} + +static GVariant * +decode_method_reply (GDBusMessage *reply, + const gchar *method_name, + const GVariantType *reply_type, + GUnixFDList **out_fd_list, + GError **error) +{ + GVariant *result; + + result = NULL; + switch (g_dbus_message_get_message_type (reply)) + { + case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: + result = g_dbus_message_get_body (reply); + if (result == NULL) + { + result = g_variant_new ("()"); + g_variant_ref_sink (result); + } + else + { + g_variant_ref (result); + } + + if (!g_variant_is_of_type (result, reply_type)) + { + gchar *type_string = g_variant_type_dup_string (reply_type); + + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Method `%s' returned type `%s', but expected `%s'"), + method_name, g_variant_get_type_string (result), type_string); + + g_variant_unref (result); + g_free (type_string); + result = NULL; + } + +#ifdef G_OS_UNIX + if (result != NULL) + { + if (out_fd_list != NULL) + { + *out_fd_list = g_dbus_message_get_unix_fd_list (reply); + if (*out_fd_list != NULL) + g_object_ref (*out_fd_list); + } + } +#endif + break; + + case G_DBUS_MESSAGE_TYPE_ERROR: + g_dbus_message_to_gerror (reply, error); + break; + + default: + g_assert_not_reached (); + break; + } + + return result; +} + + +typedef struct +{ + GSimpleAsyncResult *simple; + GVariantType *reply_type; + gchar *method_name; /* for error message */ + guint32 serial; + + GVariant *value; + GUnixFDList *fd_list; +} CallState; + +static void +call_state_free (CallState *state) +{ + g_variant_type_free (state->reply_type); + g_free (state->method_name); + + if (state->value != NULL) + g_variant_unref (state->value); + if (state->fd_list != NULL) + g_object_unref (state->fd_list); + g_slice_free (CallState, state); +} + +/* called in any thread, with the connection's lock not held */ +static void +g_dbus_connection_call_done (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + GDBusConnection *connection = G_DBUS_CONNECTION (source); + CallState *state = user_data; + GError *error; + GDBusMessage *reply; + + error = NULL; + reply = g_dbus_connection_send_message_with_reply_finish (connection, + result, + &error); + + if (G_UNLIKELY (_g_dbus_debug_call ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Call:\n" + " <<<< ASYNC COMPLETE %s() (serial %d)\n" + " ", + state->method_name, + state->serial); + if (reply != NULL) + { + g_print ("SUCCESS\n"); + } + else + { + g_print ("FAILED: %s\n", + error->message); + } + _g_dbus_debug_print_unlock (); + } + + if (reply != NULL) + state->value = decode_method_reply (reply, state->method_name, state->reply_type, &state->fd_list, &error); + + simple = state->simple; /* why? because state is freed before we unref simple.. */ + if (error != NULL) + { + g_simple_async_result_take_error (state->simple, error); + g_simple_async_result_complete (state->simple); + call_state_free (state); + } + else + { + g_simple_async_result_set_op_res_gpointer (state->simple, state, (GDestroyNotify) call_state_free); + g_simple_async_result_complete (state->simple); + } + g_clear_object (&reply); + g_object_unref (simple); +} + +/* called in any thread, with the connection's lock not held */ +static void +g_dbus_connection_call_internal (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDBusMessage *message; + guint32 serial; + + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail (bus_name == NULL || g_dbus_is_name (bus_name)); + g_return_if_fail (object_path != NULL && g_variant_is_object_path (object_path)); + g_return_if_fail (interface_name != NULL && g_dbus_is_interface_name (interface_name)); + g_return_if_fail (method_name != NULL && g_dbus_is_member_name (method_name)); + g_return_if_fail (timeout_msec >= 0 || timeout_msec == -1); + g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE)); + g_return_if_fail (check_initialized (connection)); +#ifdef G_OS_UNIX + g_return_if_fail (fd_list == NULL || G_IS_UNIX_FD_LIST (fd_list)); +#else + g_return_if_fail (fd_list == NULL); +#endif + + message = g_dbus_message_new_method_call (bus_name, + object_path, + interface_name, + method_name); + add_call_flags (message, flags); + if (parameters != NULL) + g_dbus_message_set_body (message, parameters); + +#ifdef G_OS_UNIX + if (fd_list != NULL) + g_dbus_message_set_unix_fd_list (message, fd_list); +#endif + + /* If the user has no callback then we can just send the message with + * the G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set and skip all + * the logic for processing the reply. If the service sends the reply + * anyway then it will just be ignored. + */ + if (callback != NULL) + { + CallState *state; + + state = g_slice_new0 (CallState); + state->simple = g_simple_async_result_new (G_OBJECT (connection), + callback, user_data, + g_dbus_connection_call_internal); + g_simple_async_result_set_check_cancellable (state->simple, cancellable); + state->method_name = g_strjoin (".", interface_name, method_name, NULL); + + if (reply_type == NULL) + reply_type = G_VARIANT_TYPE_ANY; + + state->reply_type = g_variant_type_copy (reply_type); + + g_dbus_connection_send_message_with_reply (connection, + message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + timeout_msec, + &state->serial, + cancellable, + g_dbus_connection_call_done, + state); + serial = state->serial; + } + else + { + GDBusMessageFlags flags; + + flags = g_dbus_message_get_flags (message); + flags |= G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED; + g_dbus_message_set_flags (message, flags); + + g_dbus_connection_send_message (connection, + message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + &serial, NULL); + } + + if (G_UNLIKELY (_g_dbus_debug_call ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Call:\n" + " >>>> ASYNC %s.%s()\n" + " on object %s\n" + " owned by name %s (serial %d)\n", + interface_name, + method_name, + object_path, + bus_name != NULL ? bus_name : "(none)", + serial); + _g_dbus_debug_print_unlock (); + } + + if (message != NULL) + g_object_unref (message); +} + +/* called in any thread, with the connection's lock not held */ +static GVariant * +g_dbus_connection_call_finish_internal (GDBusConnection *connection, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple; + CallState *state; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (g_simple_async_result_is_valid (res, G_OBJECT (connection), + g_dbus_connection_call_internal), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + simple = G_SIMPLE_ASYNC_RESULT (res); + + if (g_simple_async_result_propagate_error (simple, error)) + return NULL; + + state = g_simple_async_result_get_op_res_gpointer (simple); + if (out_fd_list != NULL) + *out_fd_list = state->fd_list != NULL ? g_object_ref (state->fd_list) : NULL; + return g_variant_ref (state->value); +} + +/* called in any user thread, with the connection's lock not held */ +static GVariant * +g_dbus_connection_call_sync_internal (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error) +{ + GDBusMessage *message; + GDBusMessage *reply; + GVariant *result; + GError *local_error; + GDBusSendMessageFlags send_flags; + + message = NULL; + reply = NULL; + result = NULL; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (bus_name == NULL || g_dbus_is_name (bus_name), NULL); + g_return_val_if_fail (object_path != NULL && g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (interface_name != NULL && g_dbus_is_interface_name (interface_name), NULL); + g_return_val_if_fail (method_name != NULL && g_dbus_is_member_name (method_name), NULL); + g_return_val_if_fail (timeout_msec >= 0 || timeout_msec == -1, NULL); + g_return_val_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), NULL); +#ifdef G_OS_UNIX + g_return_val_if_fail (fd_list == NULL || G_IS_UNIX_FD_LIST (fd_list), NULL); +#else + g_return_val_if_fail (fd_list == NULL, NULL); +#endif + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + if (!(flags & CALL_FLAGS_INITIALIZING)) + g_return_val_if_fail (check_initialized (connection), FALSE); + + if (reply_type == NULL) + reply_type = G_VARIANT_TYPE_ANY; + + message = g_dbus_message_new_method_call (bus_name, + object_path, + interface_name, + method_name); + add_call_flags (message, flags); + if (parameters != NULL) + g_dbus_message_set_body (message, parameters); + +#ifdef G_OS_UNIX + if (fd_list != NULL) + g_dbus_message_set_unix_fd_list (message, fd_list); +#endif + + if (G_UNLIKELY (_g_dbus_debug_call ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Call:\n" + " >>>> SYNC %s.%s()\n" + " on object %s\n" + " owned by name %s\n", + interface_name, + method_name, + object_path, + bus_name != NULL ? bus_name : "(none)"); + _g_dbus_debug_print_unlock (); + } + + local_error = NULL; + + send_flags = G_DBUS_SEND_MESSAGE_FLAGS_NONE; + + /* translate from one flavour of flags to another... */ + if (flags & CALL_FLAGS_INITIALIZING) + send_flags |= SEND_MESSAGE_FLAGS_INITIALIZING; + + reply = g_dbus_connection_send_message_with_reply_sync (connection, + message, + send_flags, + timeout_msec, + NULL, /* volatile guint32 *out_serial */ + cancellable, + &local_error); + + if (G_UNLIKELY (_g_dbus_debug_call ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Call:\n" + " <<<< SYNC COMPLETE %s.%s()\n" + " ", + interface_name, + method_name); + if (reply != NULL) + { + g_print ("SUCCESS\n"); + } + else + { + g_print ("FAILED: %s\n", + local_error->message); + } + _g_dbus_debug_print_unlock (); + } + + if (reply == NULL) + { + if (error != NULL) + *error = local_error; + else + g_error_free (local_error); + goto out; + } + + result = decode_method_reply (reply, method_name, reply_type, out_fd_list, error); + + out: + if (message != NULL) + g_object_unref (message); + if (reply != NULL) + g_object_unref (reply); + + return result; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_call: + * @connection: A #GDBusConnection. + * @bus_name: (allow-none): A unique or well-known bus name or %NULL if + * @connection is not a message bus connection. + * @object_path: Path of remote object. + * @interface_name: D-Bus interface to invoke method on. + * @method_name: The name of the method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the method + * or %NULL if not passing parameters. + * @reply_type: (allow-none): The expected type of the reply, or %NULL. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is + * satisfied or %NULL if you don't care about the result of the + * method invocation. + * @user_data: The data to pass to @callback. + * + * Asynchronously invokes the @method_name method on the + * @interface_name D-Bus interface on the remote object at + * @object_path owned by @bus_name. + * + * If @connection is closed then the operation will fail with + * %G_IO_ERROR_CLOSED. If @cancellable is canceled, the operation will + * fail with %G_IO_ERROR_CANCELLED. If @parameters contains a value + * not compatible with the D-Bus protocol, the operation fails with + * %G_IO_ERROR_INVALID_ARGUMENT. + * + * If @reply_type is non-%NULL then the reply will be checked for having this type and an + * error will be raised if it does not match. Said another way, if you give a @reply_type + * then any non-%NULL return value will be of this type. + * + * If the @parameters #GVariant is floating, it is consumed. This allows + * convenient 'inline' use of g_variant_new(), e.g.: + * |[ + * g_dbus_connection_call (connection, + * "org.freedesktop.StringThings", + * "/org/freedesktop/StringThings", + * "org.freedesktop.StringThings", + * "TwoStrings", + * g_variant_new ("(ss)", + * "Thing One", + * "Thing Two"), + * NULL, + * G_DBUS_CALL_FLAGS_NONE, + * -1, + * NULL, + * (GAsyncReadyCallback) two_strings_done, + * NULL); + * ]| + * + * This is an asynchronous method. When the operation is finished, @callback will be invoked + * in the thread-default main loop + * of the thread you are calling this method from. You can then call + * g_dbus_connection_call_finish() to get the result of the operation. + * See g_dbus_connection_call_sync() for the synchronous version of this + * function. + * + * If @callback is %NULL then the D-Bus method call message will be sent with + * the %G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set. + * + * Since: 2.26 + */ +void +g_dbus_connection_call (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_connection_call_internal (connection, bus_name, object_path, interface_name, method_name, parameters, reply_type, flags, timeout_msec, NULL, cancellable, callback, user_data); +} + +/** + * g_dbus_connection_call_finish: + * @connection: A #GDBusConnection. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_call(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_call(). + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.26 + */ +GVariant * +g_dbus_connection_call_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error) +{ + return g_dbus_connection_call_finish_internal (connection, NULL, res, error); +} + +/** + * g_dbus_connection_call_sync: + * @connection: A #GDBusConnection. + * @bus_name: (allow-none): A unique or well-known bus name or %NULL if + * @connection is not a message bus connection. + * @object_path: Path of remote object. + * @interface_name: D-Bus interface to invoke method on. + * @method_name: The name of the method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the method + * or %NULL if not passing parameters. + * @reply_type: (allow-none): The expected type of the reply, or %NULL. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the @method_name method on the + * @interface_name D-Bus interface on the remote object at + * @object_path owned by @bus_name. + * + * If @connection is closed then the operation will fail with + * %G_IO_ERROR_CLOSED. If @cancellable is canceled, the + * operation will fail with %G_IO_ERROR_CANCELLED. If @parameters + * contains a value not compatible with the D-Bus protocol, the operation + * fails with %G_IO_ERROR_INVALID_ARGUMENT. + + * If @reply_type is non-%NULL then the reply will be checked for having + * this type and an error will be raised if it does not match. Said + * another way, if you give a @reply_type then any non-%NULL return + * value will be of this type. + * + * If the @parameters #GVariant is floating, it is consumed. + * This allows convenient 'inline' use of g_variant_new(), e.g.: + * |[ + * g_dbus_connection_call_sync (connection, + * "org.freedesktop.StringThings", + * "/org/freedesktop/StringThings", + * "org.freedesktop.StringThings", + * "TwoStrings", + * g_variant_new ("(ss)", + * "Thing One", + * "Thing Two"), + * NULL, + * G_DBUS_CALL_FLAGS_NONE, + * -1, + * NULL, + * &error); + * ]| + * + * The calling thread is blocked until a reply is received. See + * g_dbus_connection_call() for the asynchronous version of + * this method. + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.26 + */ +GVariant * +g_dbus_connection_call_sync (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GError **error) +{ + return g_dbus_connection_call_sync_internal (connection, bus_name, object_path, interface_name, method_name, parameters, reply_type, flags, timeout_msec, NULL, NULL, cancellable, error); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX + +/** + * g_dbus_connection_call_with_unix_fd_list: + * @connection: A #GDBusConnection. + * @bus_name: (allow-none): A unique or well-known bus name or %NULL if + * @connection is not a message bus connection. + * @object_path: Path of remote object. + * @interface_name: D-Bus interface to invoke method on. + * @method_name: The name of the method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the method + * or %NULL if not passing parameters. + * @reply_type: (allow-none): The expected type of the reply, or %NULL. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is + * satisfied or %NULL if you don't * care about the result of the + * method invocation. + * @user_data: The data to pass to @callback. + * + * Like g_dbus_connection_call() but also takes a #GUnixFDList object. + * + * This method is only available on UNIX. + * + * Since: 2.30 + */ +void +g_dbus_connection_call_with_unix_fd_list (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_connection_call_internal (connection, bus_name, object_path, interface_name, method_name, parameters, reply_type, flags, timeout_msec, fd_list, cancellable, callback, user_data); +} + +/** + * g_dbus_connection_call_with_unix_fd_list_finish: + * @connection: A #GDBusConnection. + * @out_fd_list: (out) (allow-none): Return location for a #GUnixFDList or %NULL. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_connection_call_with_unix_fd_list(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_connection_call_with_unix_fd_list(). + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_connection_call_with_unix_fd_list_finish (GDBusConnection *connection, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error) +{ + return g_dbus_connection_call_finish_internal (connection, out_fd_list, res, error); +} + +/** + * g_dbus_connection_call_with_unix_fd_list_sync: + * @connection: A #GDBusConnection. + * @bus_name: (allow-none): A unique or well-known bus name or %NULL if + * @connection is not a message bus connection. + * @object_path: Path of remote object. + * @interface_name: D-Bus interface to invoke method on. + * @method_name: The name of the method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the method + * or %NULL if not passing parameters. + * @reply_type: (allow-none): The expected type of the reply, or %NULL. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds, -1 to use the default + * timeout or %G_MAXINT for no timeout. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * @out_fd_list: (out) (allow-none): Return location for a #GUnixFDList or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Like g_dbus_connection_call_sync() but also takes and returns #GUnixFDList objects. + * + * This method is only available on UNIX. + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_connection_call_with_unix_fd_list_sync (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error) +{ + return g_dbus_connection_call_sync_internal (connection, bus_name, object_path, interface_name, method_name, parameters, reply_type, flags, timeout_msec, fd_list, out_fd_list, cancellable, error); +} + +#endif /* G_OS_UNIX */ + +/* ---------------------------------------------------------------------------------------------------- */ + +struct ExportedSubtree +{ + guint id; + gchar *object_path; + GDBusConnection *connection; + GDBusSubtreeVTable *vtable; + GDBusSubtreeFlags flags; + + GMainContext *context; + gpointer user_data; + GDestroyNotify user_data_free_func; +}; + +static void +exported_subtree_free (ExportedSubtree *es) +{ + call_destroy_notify (es->context, + es->user_data_free_func, + es->user_data); + + g_main_context_unref (es->context); + + _g_dbus_subtree_vtable_free (es->vtable); + g_free (es->object_path); + g_free (es); +} + +/* called without lock held in the thread where the caller registered + * the subtree + */ +static gboolean +handle_subtree_introspect (GDBusConnection *connection, + ExportedSubtree *es, + GDBusMessage *message) +{ + GString *s; + gboolean handled; + GDBusMessage *reply; + gchar **children; + gboolean is_root; + const gchar *sender; + const gchar *requested_object_path; + const gchar *requested_node; + GDBusInterfaceInfo **interfaces; + guint n; + gchar **subnode_paths; + gboolean has_properties_interface; + gboolean has_introspectable_interface; + + handled = FALSE; + + requested_object_path = g_dbus_message_get_path (message); + sender = g_dbus_message_get_sender (message); + is_root = (g_strcmp0 (requested_object_path, es->object_path) == 0); + + s = g_string_new (NULL); + introspect_append_header (s); + + /* Strictly we don't need the children in dynamic mode, but we avoid the + * conditionals to preserve code clarity + */ + children = es->vtable->enumerate (es->connection, + sender, + es->object_path, + es->user_data); + + if (!is_root) + { + requested_node = strrchr (requested_object_path, '/') + 1; + + /* Assert existence of object if we are not dynamic */ + if (!(es->flags & G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES) && + !_g_strv_has_string ((const gchar * const *) children, requested_node)) + goto out; + } + else + { + requested_node = NULL; + } + + interfaces = es->vtable->introspect (es->connection, + sender, + es->object_path, + requested_node, + es->user_data); + if (interfaces != NULL) + { + has_properties_interface = FALSE; + has_introspectable_interface = FALSE; + + for (n = 0; interfaces[n] != NULL; n++) + { + if (strcmp (interfaces[n]->name, "org.freedesktop.DBus.Properties") == 0) + has_properties_interface = TRUE; + else if (strcmp (interfaces[n]->name, "org.freedesktop.DBus.Introspectable") == 0) + has_introspectable_interface = TRUE; + } + if (!has_properties_interface) + g_string_append (s, introspect_properties_interface); + if (!has_introspectable_interface) + g_string_append (s, introspect_introspectable_interface); + + for (n = 0; interfaces[n] != NULL; n++) + { + g_dbus_interface_info_generate_xml (interfaces[n], 2, s); + g_dbus_interface_info_unref (interfaces[n]); + } + g_free (interfaces); + } + + /* then include entries from the Subtree for the root */ + if (is_root) + { + for (n = 0; children != NULL && children[n] != NULL; n++) + g_string_append_printf (s, " \n", children[n]); + } + + /* finally include nodes registered below us */ + subnode_paths = g_dbus_connection_list_registered (es->connection, requested_object_path); + for (n = 0; subnode_paths != NULL && subnode_paths[n] != NULL; n++) + g_string_append_printf (s, " \n", subnode_paths[n]); + g_strfreev (subnode_paths); + + g_string_append (s, "\n"); + + reply = g_dbus_message_new_method_reply (message); + g_dbus_message_set_body (reply, g_variant_new ("(s)", s->str)); + g_dbus_connection_send_message (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + + handled = TRUE; + + out: + g_string_free (s, TRUE); + g_strfreev (children); + return handled; +} + +/* called without lock held in the thread where the caller registered + * the subtree + */ +static gboolean +handle_subtree_method_invocation (GDBusConnection *connection, + ExportedSubtree *es, + GDBusMessage *message) +{ + gboolean handled; + const gchar *sender; + const gchar *interface_name; + const gchar *member; + const gchar *signature; + const gchar *requested_object_path; + const gchar *requested_node; + gboolean is_root; + GDBusInterfaceInfo *interface_info; + const GDBusInterfaceVTable *interface_vtable; + gpointer interface_user_data; + guint n; + GDBusInterfaceInfo **interfaces; + gboolean is_property_get; + gboolean is_property_set; + gboolean is_property_get_all; + + handled = FALSE; + interfaces = NULL; + + requested_object_path = g_dbus_message_get_path (message); + sender = g_dbus_message_get_sender (message); + interface_name = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + signature = g_dbus_message_get_signature (message); + is_root = (g_strcmp0 (requested_object_path, es->object_path) == 0); + + is_property_get = FALSE; + is_property_set = FALSE; + is_property_get_all = FALSE; + if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0) + { + if (g_strcmp0 (member, "Get") == 0 && g_strcmp0 (signature, "ss") == 0) + is_property_get = TRUE; + else if (g_strcmp0 (member, "Set") == 0 && g_strcmp0 (signature, "ssv") == 0) + is_property_set = TRUE; + else if (g_strcmp0 (member, "GetAll") == 0 && g_strcmp0 (signature, "s") == 0) + is_property_get_all = TRUE; + } + + if (!is_root) + { + requested_node = strrchr (requested_object_path, '/') + 1; + + if (~es->flags & G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES) + { + /* We don't want to dispatch to unenumerated + * nodes, so ensure that the child exists. + */ + gchar **children; + gboolean exists; + + children = es->vtable->enumerate (es->connection, + sender, + es->object_path, + es->user_data); + + exists = _g_strv_has_string ((const gchar * const *) children, requested_node); + g_strfreev (children); + + if (!exists) + goto out; + } + } + else + { + requested_node = NULL; + } + + /* get introspection data for the node */ + interfaces = es->vtable->introspect (es->connection, + sender, + requested_object_path, + requested_node, + es->user_data); + + if (interfaces == NULL) + goto out; + + interface_info = NULL; + for (n = 0; interfaces[n] != NULL; n++) + { + if (g_strcmp0 (interfaces[n]->name, interface_name) == 0) + interface_info = interfaces[n]; + } + + /* dispatch the call if the user wants to handle it */ + if (interface_info != NULL) + { + /* figure out where to dispatch the method call */ + interface_user_data = NULL; + interface_vtable = es->vtable->dispatch (es->connection, + sender, + es->object_path, + interface_name, + requested_node, + &interface_user_data, + es->user_data); + if (interface_vtable == NULL) + goto out; + + CONNECTION_LOCK (connection); + handled = validate_and_maybe_schedule_method_call (es->connection, + message, + 0, + es->id, + interface_info, + interface_vtable, + es->context, + interface_user_data); + CONNECTION_UNLOCK (connection); + } + /* handle org.freedesktop.DBus.Properties interface if not explicitly handled */ + else if (is_property_get || is_property_set || is_property_get_all) + { + if (is_property_get) + g_variant_get (g_dbus_message_get_body (message), "(&s&s)", &interface_name, NULL); + else if (is_property_set) + g_variant_get (g_dbus_message_get_body (message), "(&s&sv)", &interface_name, NULL, NULL); + else if (is_property_get_all) + g_variant_get (g_dbus_message_get_body (message), "(&s)", &interface_name, NULL, NULL); + else + g_assert_not_reached (); + + /* see if the object supports this interface at all */ + for (n = 0; interfaces[n] != NULL; n++) + { + if (g_strcmp0 (interfaces[n]->name, interface_name) == 0) + interface_info = interfaces[n]; + } + + /* Fail with org.freedesktop.DBus.Error.InvalidArgs if the user-code + * claims it won't support the interface + */ + if (interface_info == NULL) + { + GDBusMessage *reply; + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.InvalidArgs", + _("No such interface `%s'"), + interface_name); + g_dbus_connection_send_message (es->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + handled = TRUE; + goto out; + } + + /* figure out where to dispatch the property get/set/getall calls */ + interface_user_data = NULL; + interface_vtable = es->vtable->dispatch (es->connection, + sender, + es->object_path, + interface_name, + requested_node, + &interface_user_data, + es->user_data); + if (interface_vtable == NULL) + { + g_warning ("The subtree introspection function indicates that '%s' " + "is a valid interface name, but calling the dispatch " + "function on that interface gave us NULL", interface_name); + goto out; + } + + if (is_property_get || is_property_set) + { + CONNECTION_LOCK (connection); + handled = validate_and_maybe_schedule_property_getset (es->connection, + message, + 0, + es->id, + is_property_get, + interface_info, + interface_vtable, + es->context, + interface_user_data); + CONNECTION_UNLOCK (connection); + } + else if (is_property_get_all) + { + CONNECTION_LOCK (connection); + handled = validate_and_maybe_schedule_property_get_all (es->connection, + message, + 0, + es->id, + interface_info, + interface_vtable, + es->context, + interface_user_data); + CONNECTION_UNLOCK (connection); + } + } + + out: + if (interfaces != NULL) + { + for (n = 0; interfaces[n] != NULL; n++) + g_dbus_interface_info_unref (interfaces[n]); + g_free (interfaces); + } + + return handled; +} + +typedef struct +{ + GDBusMessage *message; + ExportedSubtree *es; +} SubtreeDeferredData; + +static void +subtree_deferred_data_free (SubtreeDeferredData *data) +{ + g_object_unref (data->message); + g_free (data); +} + +/* called without lock held in the thread where the caller registered the subtree */ +static gboolean +process_subtree_vtable_message_in_idle_cb (gpointer _data) +{ + SubtreeDeferredData *data = _data; + gboolean handled; + + handled = FALSE; + + if (g_strcmp0 (g_dbus_message_get_interface (data->message), "org.freedesktop.DBus.Introspectable") == 0 && + g_strcmp0 (g_dbus_message_get_member (data->message), "Introspect") == 0 && + g_strcmp0 (g_dbus_message_get_signature (data->message), "") == 0) + handled = handle_subtree_introspect (data->es->connection, + data->es, + data->message); + else + handled = handle_subtree_method_invocation (data->es->connection, + data->es, + data->message); + + if (!handled) + { + CONNECTION_LOCK (data->es->connection); + handled = handle_generic_unlocked (data->es->connection, data->message); + CONNECTION_UNLOCK (data->es->connection); + } + + /* if we couldn't handle the request, just bail with the UnknownMethod error */ + if (!handled) + { + GDBusMessage *reply; + reply = g_dbus_message_new_method_error (data->message, + "org.freedesktop.DBus.Error.UnknownMethod", + _("Method `%s' on interface `%s' with signature `%s' does not exist"), + g_dbus_message_get_member (data->message), + g_dbus_message_get_interface (data->message), + g_dbus_message_get_signature (data->message)); + g_dbus_connection_send_message (data->es->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + } + + return FALSE; +} + +/* called in GDBusWorker thread with connection's lock held */ +static gboolean +subtree_message_func (GDBusConnection *connection, + ExportedSubtree *es, + GDBusMessage *message) +{ + GSource *idle_source; + SubtreeDeferredData *data; + + data = g_new0 (SubtreeDeferredData, 1); + data->message = g_object_ref (message); + data->es = es; + + /* defer this call to an idle handler in the right thread */ + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_HIGH); + g_source_set_callback (idle_source, + process_subtree_vtable_message_in_idle_cb, + data, + (GDestroyNotify) subtree_deferred_data_free); + g_source_attach (idle_source, es->context); + g_source_unref (idle_source); + + /* since we own the entire subtree, handlers for objects not in the subtree have been + * tried already by libdbus-1 - so we just need to ensure that we're always going + * to reply to the message + */ + return TRUE; +} + +/** + * g_dbus_connection_register_subtree: + * @connection: A #GDBusConnection. + * @object_path: The object path to register the subtree at. + * @vtable: A #GDBusSubtreeVTable to enumerate, introspect and dispatch nodes in the subtree. + * @flags: Flags used to fine tune the behavior of the subtree. + * @user_data: Data to pass to functions in @vtable. + * @user_data_free_func: Function to call when the subtree is unregistered. + * @error: Return location for error or %NULL. + * + * Registers a whole subtree of dynamic objects. + * + * The @enumerate and @introspection functions in @vtable are used to + * convey, to remote callers, what nodes exist in the subtree rooted + * by @object_path. + * + * When handling remote calls into any node in the subtree, first the + * @enumerate function is used to check if the node exists. If the node exists + * or the #G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES flag is set + * the @introspection function is used to check if the node supports the + * requested method. If so, the @dispatch function is used to determine + * where to dispatch the call. The collected #GDBusInterfaceVTable and + * #gpointer will be used to call into the interface vtable for processing + * the request. + * + * All calls into user-provided code will be invoked in the thread-default main + * loop of the thread you are calling this method from. + * + * If an existing subtree is already registered at @object_path or + * then @error is set to #G_IO_ERROR_EXISTS. + * + * Note that it is valid to register regular objects (using + * g_dbus_connection_register_object()) in a subtree registered with + * g_dbus_connection_register_subtree() - if so, the subtree handler + * is tried as the last resort. One way to think about a subtree + * handler is to consider it a fallback handler + * for object paths not registered via g_dbus_connection_register_object() + * or other bindings. + * + * Note that @vtable will be copied so you cannot change it after + * registration. + * + * See for an example of how to use this method. + * + * Returns: 0 if @error is set, otherwise a subtree registration id (never 0) + * that can be used with g_dbus_connection_unregister_subtree() . + * + * Since: 2.26 + */ +guint +g_dbus_connection_register_subtree (GDBusConnection *connection, + const gchar *object_path, + const GDBusSubtreeVTable *vtable, + GDBusSubtreeFlags flags, + gpointer user_data, + GDestroyNotify user_data_free_func, + GError **error) +{ + guint ret; + ExportedSubtree *es; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (object_path != NULL && g_variant_is_object_path (object_path), 0); + g_return_val_if_fail (vtable != NULL, 0); + g_return_val_if_fail (error == NULL || *error == NULL, 0); + g_return_val_if_fail (check_initialized (connection), 0); + + ret = 0; + + CONNECTION_LOCK (connection); + + es = g_hash_table_lookup (connection->map_object_path_to_es, object_path); + if (es != NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_EXISTS, + _("A subtree is already exported for %s"), + object_path); + goto out; + } + + es = g_new0 (ExportedSubtree, 1); + es->object_path = g_strdup (object_path); + es->connection = connection; + + es->vtable = _g_dbus_subtree_vtable_copy (vtable); + es->flags = flags; + es->id = _global_subtree_registration_id++; /* TODO: overflow etc. */ + es->user_data = user_data; + es->user_data_free_func = user_data_free_func; + es->context = g_main_context_ref_thread_default (); + + g_hash_table_insert (connection->map_object_path_to_es, es->object_path, es); + g_hash_table_insert (connection->map_id_to_es, + GUINT_TO_POINTER (es->id), + es); + + ret = es->id; + + out: + CONNECTION_UNLOCK (connection); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_connection_unregister_subtree: + * @connection: A #GDBusConnection. + * @registration_id: A subtree registration id obtained from g_dbus_connection_register_subtree(). + * + * Unregisters a subtree. + * + * Returns: %TRUE if the subtree was unregistered, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_connection_unregister_subtree (GDBusConnection *connection, + guint registration_id) +{ + ExportedSubtree *es; + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (check_initialized (connection), FALSE); + + ret = FALSE; + + CONNECTION_LOCK (connection); + + es = g_hash_table_lookup (connection->map_id_to_es, + GUINT_TO_POINTER (registration_id)); + if (es == NULL) + goto out; + + g_warn_if_fail (g_hash_table_remove (connection->map_id_to_es, GUINT_TO_POINTER (es->id))); + g_warn_if_fail (g_hash_table_remove (connection->map_object_path_to_es, es->object_path)); + + ret = TRUE; + + out: + CONNECTION_UNLOCK (connection); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* may be called in any thread, with connection's lock held */ +static void +handle_generic_ping_unlocked (GDBusConnection *connection, + const gchar *object_path, + GDBusMessage *message) +{ + GDBusMessage *reply; + reply = g_dbus_message_new_method_reply (message); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); +} + +/* may be called in any thread, with connection's lock held */ +static void +handle_generic_get_machine_id_unlocked (GDBusConnection *connection, + const gchar *object_path, + GDBusMessage *message) +{ + GDBusMessage *reply; + + reply = NULL; + if (connection->machine_id == NULL) + { + GError *error; + + error = NULL; + connection->machine_id = _g_dbus_get_machine_id (&error); + if (connection->machine_id == NULL) + { + reply = g_dbus_message_new_method_error_literal (message, + "org.freedesktop.DBus.Error.Failed", + error->message); + g_error_free (error); + } + } + + if (reply == NULL) + { + reply = g_dbus_message_new_method_reply (message); + g_dbus_message_set_body (reply, g_variant_new ("(s)", connection->machine_id)); + } + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); +} + +/* may be called in any thread, with connection's lock held */ +static void +handle_generic_introspect_unlocked (GDBusConnection *connection, + const gchar *object_path, + GDBusMessage *message) +{ + guint n; + GString *s; + gchar **registered; + GDBusMessage *reply; + + /* first the header */ + s = g_string_new (NULL); + introspect_append_header (s); + + registered = g_dbus_connection_list_registered_unlocked (connection, object_path); + for (n = 0; registered != NULL && registered[n] != NULL; n++) + g_string_append_printf (s, " \n", registered[n]); + g_strfreev (registered); + g_string_append (s, "\n"); + + reply = g_dbus_message_new_method_reply (message); + g_dbus_message_set_body (reply, g_variant_new ("(s)", s->str)); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + g_string_free (s, TRUE); +} + +/* may be called in any thread, with connection's lock held */ +static gboolean +handle_generic_unlocked (GDBusConnection *connection, + GDBusMessage *message) +{ + gboolean handled; + const gchar *interface_name; + const gchar *member; + const gchar *signature; + const gchar *path; + + CONNECTION_ENSURE_LOCK (connection); + + handled = FALSE; + + interface_name = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + signature = g_dbus_message_get_signature (message); + path = g_dbus_message_get_path (message); + + if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Introspectable") == 0 && + g_strcmp0 (member, "Introspect") == 0 && + g_strcmp0 (signature, "") == 0) + { + handle_generic_introspect_unlocked (connection, path, message); + handled = TRUE; + } + else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Peer") == 0 && + g_strcmp0 (member, "Ping") == 0 && + g_strcmp0 (signature, "") == 0) + { + handle_generic_ping_unlocked (connection, path, message); + handled = TRUE; + } + else if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Peer") == 0 && + g_strcmp0 (member, "GetMachineId") == 0 && + g_strcmp0 (signature, "") == 0) + { + handle_generic_get_machine_id_unlocked (connection, path, message); + handled = TRUE; + } + + return handled; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* called in GDBusWorker thread with connection's lock held */ +static void +distribute_method_call (GDBusConnection *connection, + GDBusMessage *message) +{ + GDBusMessage *reply; + ExportedObject *eo; + ExportedSubtree *es; + const gchar *object_path; + const gchar *interface_name; + const gchar *member; + const gchar *path; + gchar *subtree_path; + gchar *needle; + + g_assert (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL); + + interface_name = g_dbus_message_get_interface (message); + member = g_dbus_message_get_member (message); + path = g_dbus_message_get_path (message); + subtree_path = g_strdup (path); + needle = strrchr (subtree_path, '/'); + if (needle != NULL && needle != subtree_path) + { + *needle = '\0'; + } + else + { + g_free (subtree_path); + subtree_path = NULL; + } + + + if (G_UNLIKELY (_g_dbus_debug_incoming ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Incoming:\n" + " <<<< METHOD INVOCATION %s.%s()\n" + " on object %s\n" + " invoked by name %s\n" + " serial %d\n", + interface_name, member, + path, + g_dbus_message_get_sender (message) != NULL ? g_dbus_message_get_sender (message) : "(none)", + g_dbus_message_get_serial (message)); + _g_dbus_debug_print_unlock (); + } + + object_path = g_dbus_message_get_path (message); + g_assert (object_path != NULL); + + eo = g_hash_table_lookup (connection->map_object_path_to_eo, object_path); + if (eo != NULL) + { + if (obj_message_func (connection, eo, message)) + goto out; + } + + es = g_hash_table_lookup (connection->map_object_path_to_es, object_path); + if (es != NULL) + { + if (subtree_message_func (connection, es, message)) + goto out; + } + + if (subtree_path != NULL) + { + es = g_hash_table_lookup (connection->map_object_path_to_es, subtree_path); + if (es != NULL) + { + if (subtree_message_func (connection, es, message)) + goto out; + } + } + + if (handle_generic_unlocked (connection, message)) + goto out; + + /* if we end up here, the message has not been not handled - so return an error saying this */ + reply = g_dbus_message_new_method_error (message, + "org.freedesktop.DBus.Error.UnknownMethod", + _("No such interface `%s' on object at path %s"), + interface_name, + object_path); + g_dbus_connection_send_message_unlocked (connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + + out: + g_free (subtree_path); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Called in any user thread, with the message_bus_lock held. */ +static GWeakRef * +message_bus_get_singleton (GBusType bus_type, + GError **error) +{ + GWeakRef *ret; + const gchar *starter_bus; + + ret = NULL; + + switch (bus_type) + { + case G_BUS_TYPE_SESSION: + ret = &the_session_bus; + break; + + case G_BUS_TYPE_SYSTEM: + ret = &the_system_bus; + break; + + case G_BUS_TYPE_STARTER: + starter_bus = g_getenv ("DBUS_STARTER_BUS_TYPE"); + if (g_strcmp0 (starter_bus, "session") == 0) + { + ret = message_bus_get_singleton (G_BUS_TYPE_SESSION, error); + goto out; + } + else if (g_strcmp0 (starter_bus, "system") == 0) + { + ret = message_bus_get_singleton (G_BUS_TYPE_SYSTEM, error); + goto out; + } + else + { + if (starter_bus != NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" + " - unknown value `%s'"), + starter_bus); + } + else + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " + "variable is not set")); + } + } + break; + + default: + g_assert_not_reached (); + break; + } + + out: + return ret; +} + +/* Called in any user thread, without holding locks. */ +static GDBusConnection * +get_uninitialized_connection (GBusType bus_type, + GCancellable *cancellable, + GError **error) +{ + GWeakRef *singleton; + GDBusConnection *ret; + + ret = NULL; + + G_LOCK (message_bus_lock); + singleton = message_bus_get_singleton (bus_type, error); + if (singleton == NULL) + goto out; + + ret = g_weak_ref_get (singleton); + + if (ret == NULL) + { + gchar *address; + address = g_dbus_address_get_for_bus_sync (bus_type, cancellable, error); + if (address == NULL) + goto out; + ret = g_object_new (G_TYPE_DBUS_CONNECTION, + "address", address, + "flags", G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + "exit-on-close", TRUE, + NULL); + + g_weak_ref_set (singleton, ret); + g_free (address); + } + + g_assert (ret != NULL); + + out: + G_UNLOCK (message_bus_lock); + return ret; +} + +/* May be called from any thread. Must not hold message_bus_lock. */ +GDBusConnection * +_g_bus_get_singleton_if_exists (GBusType bus_type) +{ + GWeakRef *singleton; + GDBusConnection *ret = NULL; + + G_LOCK (message_bus_lock); + singleton = message_bus_get_singleton (bus_type, NULL); + if (singleton == NULL) + goto out; + + ret = g_weak_ref_get (singleton); + + out: + G_UNLOCK (message_bus_lock); + return ret; +} + +/** + * g_bus_get_sync: + * @bus_type: A #GBusType. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously connects to the message bus specified by @bus_type. + * Note that the returned object may shared with other callers, + * e.g. if two separate parts of a process calls this function with + * the same @bus_type, they will share the same object. + * + * This is a synchronous failable function. See g_bus_get() and + * g_bus_get_finish() for the asynchronous version. + * + * The returned object is a singleton, that is, shared with other + * callers of g_bus_get() and g_bus_get_sync() for @bus_type. In the + * event that you need a private message bus connection, use + * g_dbus_address_get_for_bus_sync() and + * g_dbus_connection_new_for_address(). + * + * Note that the returned #GDBusConnection object will (usually) have + * the #GDBusConnection:exit-on-close property set to %TRUE. + * + * Returns: (transfer full): A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_bus_get_sync (GBusType bus_type, + GCancellable *cancellable, + GError **error) +{ + GDBusConnection *connection; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + connection = get_uninitialized_connection (bus_type, cancellable, error); + if (connection == NULL) + goto out; + + if (!g_initable_init (G_INITABLE (connection), cancellable, error)) + { + g_object_unref (connection); + connection = NULL; + } + + out: + return connection; +} + +static void +bus_get_async_initable_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GError *error; + + error = NULL; + if (!g_async_initable_init_finish (G_ASYNC_INITABLE (source_object), + res, + &error)) + { + g_assert (error != NULL); + g_simple_async_result_take_error (simple, error); + g_object_unref (source_object); + } + else + { + g_simple_async_result_set_op_res_gpointer (simple, + source_object, + g_object_unref); + } + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +/** + * g_bus_get: + * @bus_type: A #GBusType. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: The data to pass to @callback. + * + * Asynchronously connects to the message bus specified by @bus_type. + * + * When the operation is finished, @callback will be invoked. You can + * then call g_bus_get_finish() to get the result of the operation. + * + * This is a asynchronous failable function. See g_bus_get_sync() for + * the synchronous version. + * + * Since: 2.26 + */ +void +g_bus_get (GBusType bus_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDBusConnection *connection; + GSimpleAsyncResult *simple; + GError *error; + + simple = g_simple_async_result_new (NULL, + callback, + user_data, + g_bus_get); + g_simple_async_result_set_check_cancellable (simple, cancellable); + + error = NULL; + connection = get_uninitialized_connection (bus_type, cancellable, &error); + if (connection == NULL) + { + g_assert (error != NULL); + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + } + else + { + g_async_initable_init_async (G_ASYNC_INITABLE (connection), + G_PRIORITY_DEFAULT, + cancellable, + bus_get_async_initable_cb, + simple); + } +} + +/** + * g_bus_get_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_bus_get(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_bus_get(). + * + * The returned object is a singleton, that is, shared with other + * callers of g_bus_get() and g_bus_get_sync() for @bus_type. In the + * event that you need a private message bus connection, use + * g_dbus_address_get_for_bus_sync() and + * g_dbus_connection_new_for_address(). + * + * Note that the returned #GDBusConnection object will (usually) have + * the #GDBusConnection:exit-on-close property set to %TRUE. + * + * Returns: (transfer full): A #GDBusConnection or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusConnection * +g_bus_get_finish (GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GObject *object; + GDBusConnection *ret; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_bus_get); + + ret = NULL; + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + object = g_simple_async_result_get_op_res_gpointer (simple); + g_assert (object != NULL); + ret = g_object_ref (G_DBUS_CONNECTION (object)); + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusconnection.h b/gio/gdbusconnection.h new file mode 100644 index 0000000..1325e37 --- /dev/null +++ b/gio/gdbusconnection.h @@ -0,0 +1,640 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_CONNECTION_H__ +#define __G_DBUS_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_CONNECTION (g_dbus_connection_get_type ()) +#define G_DBUS_CONNECTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_CONNECTION, GDBusConnection)) +#define G_IS_DBUS_CONNECTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_CONNECTION)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_connection_get_type (void) G_GNUC_CONST; + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +void g_bus_get (GBusType bus_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_bus_get_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_bus_get_sync (GBusType bus_type, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_new (GIOStream *stream, + const gchar *guid, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_connection_new_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_connection_new_sync (GIOStream *stream, + const gchar *guid, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_new_for_address (const gchar *address, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_connection_new_for_address_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_connection_new_for_address_sync (const gchar *address, + GDBusConnectionFlags flags, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_start_message_processing (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_is_closed (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +GIOStream *g_dbus_connection_get_stream (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_connection_get_guid (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_connection_get_unique_name (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +GCredentials *g_dbus_connection_get_peer_credentials (GDBusConnection *connection); + +GLIB_AVAILABLE_IN_2_34 +guint32 g_dbus_connection_get_last_serial (GDBusConnection *connection); + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_get_exit_on_close (GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_set_exit_on_close (GDBusConnection *connection, + gboolean exit_on_close); +GLIB_AVAILABLE_IN_ALL +GDBusCapabilityFlags g_dbus_connection_get_capabilities (GDBusConnection *connection); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_close (GDBusConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_close_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_close_sync (GDBusConnection *connection, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_flush (GDBusConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_flush_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_flush_sync (GDBusConnection *connection, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_send_message (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + volatile guint32 *out_serial, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_send_message_with_reply (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + gint timeout_msec, + volatile guint32 *out_serial, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_connection_send_message_with_reply_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_connection_send_message_with_reply_sync (GDBusConnection *connection, + GDBusMessage *message, + GDBusSendMessageFlags flags, + gint timeout_msec, + volatile guint32 *out_serial, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_emit_signal (GDBusConnection *connection, + const gchar *destination_bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_call (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_connection_call_finish (GDBusConnection *connection, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_connection_call_sync (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_30 +void g_dbus_connection_call_with_unix_fd_list (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_30 +GVariant *g_dbus_connection_call_with_unix_fd_list_finish (GDBusConnection *connection, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_2_30 +GVariant *g_dbus_connection_call_with_unix_fd_list_sync (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + const GVariantType *reply_type, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ + + +/** + * GDBusInterfaceMethodCallFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that the method was invoked on. + * @interface_name: The D-Bus interface name the method was invoked on. + * @method_name: The name of the method that was invoked. + * @parameters: A #GVariant tuple with parameters. + * @invocation: A #GDBusMethodInvocation object that can be used to return a value or error. + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_object(). + * + * The type of the @method_call function in #GDBusInterfaceVTable. + * + * Since: 2.26 + */ +typedef void (*GDBusInterfaceMethodCallFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + +/** + * GDBusInterfaceGetPropertyFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that the method was invoked on. + * @interface_name: The D-Bus interface name for the property. + * @property_name: The name of the property to get the value of. + * @error: Return location for error. + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_object(). + * + * The type of the @get_property function in #GDBusInterfaceVTable. + * + * Returns: A #GVariant with the value for @property_name or %NULL if + * @error is set. If the returned #GVariant is floating, it is + * consumed - otherwise its reference count is decreased by one. + * + * Since: 2.26 + */ +typedef GVariant *(*GDBusInterfaceGetPropertyFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data); + +/** + * GDBusInterfaceSetPropertyFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that the method was invoked on. + * @interface_name: The D-Bus interface name for the property. + * @property_name: The name of the property to get the value of. + * @value: The value to set the property to. + * @error: Return location for error. + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_object(). + * + * The type of the @set_property function in #GDBusInterfaceVTable. + * + * Returns: %TRUE if the property was set to @value, %FALSE if @error is set. + * + * Since: 2.26 + */ +typedef gboolean (*GDBusInterfaceSetPropertyFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data); + +/** + * GDBusInterfaceVTable: + * @method_call: Function for handling incoming method calls. + * @get_property: Function for getting a property. + * @set_property: Function for setting a property. + * + * Virtual table for handling properties and method calls for a D-Bus + * interface. + * + * If you want to handle getting/setting D-Bus properties asynchronously, simply + * register an object with the org.freedesktop.DBus.Properties + * D-Bus interface using g_dbus_connection_register_object(). + * + * Since: 2.26 + */ +struct _GDBusInterfaceVTable +{ + GDBusInterfaceMethodCallFunc method_call; + GDBusInterfaceGetPropertyFunc get_property; + GDBusInterfaceSetPropertyFunc set_property; + + /*< private >*/ + /* Padding for future expansion - also remember to update + * gdbusconnection.c:_g_dbus_interface_vtable_copy() when + * changing this. + */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +guint g_dbus_connection_register_object (GDBusConnection *connection, + const gchar *object_path, + GDBusInterfaceInfo *interface_info, + const GDBusInterfaceVTable *vtable, + gpointer user_data, + GDestroyNotify user_data_free_func, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_unregister_object (GDBusConnection *connection, + guint registration_id); + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * GDBusSubtreeEnumerateFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that was registered with g_dbus_connection_register_subtree(). + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_subtree(). + * + * The type of the @enumerate function in #GDBusSubtreeVTable. + * + * This function is called when generating introspection data and also + * when preparing to dispatch incoming messages in the event that the + * %G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES flag is not + * specified (ie: to verify that the object path is valid). + * + * Hierarchies are not supported; the items that you return should not + * contain the '/' character. + * + * The return value will be freed with g_strfreev(). + * + * Returns: A newly allocated array of strings for node names that are children of @object_path. + * + * Since: 2.26 + */ +typedef gchar** (*GDBusSubtreeEnumerateFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + gpointer user_data); + +/** + * GDBusSubtreeIntrospectFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that was registered with g_dbus_connection_register_subtree(). + * @node: A node that is a child of @object_path (relative to @object_path) or %NULL for the root of the subtree. + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_subtree(). + * + * The type of the @introspect function in #GDBusSubtreeVTable. + * + * Subtrees are flat. @node, if non-%NULL, is always exactly one + * segment of the object path (ie: it never contains a slash). + * + * This function should return %NULL to indicate that there is no object + * at this node. + * + * If this function returns non-%NULL, the return value is expected to + * be a %NULL-terminated array of pointers to #GDBusInterfaceInfo + * structures describing the interfaces implemented by @node. This + * array will have g_dbus_interface_info_unref() called on each item + * before being freed with g_free(). + * + * The difference between returning %NULL and an array containing zero + * items is that the standard DBus interfaces will returned to the + * remote introspector in the empty array case, but not in the %NULL + * case. + * + * Returns: A %NULL-terminated array of pointers to #GDBusInterfaceInfo, or %NULL. + * + * Since: 2.26 + */ +typedef GDBusInterfaceInfo ** (*GDBusSubtreeIntrospectFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *node, + gpointer user_data); + +/** + * GDBusSubtreeDispatchFunc: + * @connection: A #GDBusConnection. + * @sender: The unique bus name of the remote caller. + * @object_path: The object path that was registered with g_dbus_connection_register_subtree(). + * @interface_name: The D-Bus interface name that the method call or property access is for. + * @node: A node that is a child of @object_path (relative to @object_path) or %NULL for the root of the subtree. + * @out_user_data: Return location for user data to pass to functions in the returned #GDBusInterfaceVTable (never %NULL). + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_subtree(). + * + * The type of the @dispatch function in #GDBusSubtreeVTable. + * + * Subtrees are flat. @node, if non-%NULL, is always exactly one + * segment of the object path (ie: it never contains a slash). + * + * Returns: A #GDBusInterfaceVTable or %NULL if you don't want to handle the methods. + * + * Since: 2.26 + */ +typedef const GDBusInterfaceVTable * (*GDBusSubtreeDispatchFunc) (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *node, + gpointer *out_user_data, + gpointer user_data); + +/** + * GDBusSubtreeVTable: + * @enumerate: Function for enumerating child nodes. + * @introspect: Function for introspecting a child node. + * @dispatch: Function for dispatching a remote call on a child node. + * + * Virtual table for handling subtrees registered with g_dbus_connection_register_subtree(). + * + * Since: 2.26 + */ +struct _GDBusSubtreeVTable +{ + GDBusSubtreeEnumerateFunc enumerate; + GDBusSubtreeIntrospectFunc introspect; + GDBusSubtreeDispatchFunc dispatch; + + /*< private >*/ + /* Padding for future expansion - also remember to update + * gdbusconnection.c:_g_dbus_subtree_vtable_copy() when + * changing this. + */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +guint g_dbus_connection_register_subtree (GDBusConnection *connection, + const gchar *object_path, + const GDBusSubtreeVTable *vtable, + GDBusSubtreeFlags flags, + gpointer user_data, + GDestroyNotify user_data_free_func, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_connection_unregister_subtree (GDBusConnection *connection, + guint registration_id); + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * GDBusSignalCallback: + * @connection: A #GDBusConnection. + * @sender_name: The unique bus name of the sender of the signal. + * @object_path: The object path that the signal was emitted on. + * @interface_name: The name of the interface. + * @signal_name: The name of the signal. + * @parameters: A #GVariant tuple with parameters for the signal. + * @user_data: User data passed when subscribing to the signal. + * + * Signature for callback function used in g_dbus_connection_signal_subscribe(). + * + * Since: 2.26 + */ +typedef void (*GDBusSignalCallback) (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +guint g_dbus_connection_signal_subscribe (GDBusConnection *connection, + const gchar *sender, + const gchar *interface_name, + const gchar *member, + const gchar *object_path, + const gchar *arg0, + GDBusSignalFlags flags, + GDBusSignalCallback callback, + gpointer user_data, + GDestroyNotify user_data_free_func); +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_signal_unsubscribe (GDBusConnection *connection, + guint subscription_id); + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * GDBusMessageFilterFunction: + * @connection: (transfer none): A #GDBusConnection. + * @message: (transfer full): A locked #GDBusMessage that the filter function takes ownership of. + * @incoming: %TRUE if it is a message received from the other peer, %FALSE if it is + * a message to be sent to the other peer. + * @user_data: User data passed when adding the filter. + * + * Signature for function used in g_dbus_connection_add_filter(). + * + * A filter function is passed a #GDBusMessage and expected to return + * a #GDBusMessage too. Passive filter functions that don't modify the + * message can simply return the @message object: + * |[ + * static GDBusMessage * + * passive_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * /* inspect @message */ + * return message; + * } + * ]| + * Filter functions that wants to drop a message can simply return %NULL: + * |[ + * static GDBusMessage * + * drop_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * if (should_drop_message) + * { + * g_object_unref (message); + * message = NULL; + * } + * return message; + * } + * ]| + * Finally, a filter function may modify a message by copying it: + * |[ + * static GDBusMessage * + * modifying_filter (GDBusConnection *connection + * GDBusMessage *message, + * gboolean incoming, + * gpointer user_data) + * { + * GDBusMessage *copy; + * GError *error; + * + * error = NULL; + * copy = g_dbus_message_copy (message, &error); + * /* handle @error being is set */ + * g_object_unref (message); + * + * /* modify @copy */ + * + * return copy; + * } + * ]| + * If the returned #GDBusMessage is different from @message and cannot + * be sent on @connection (it could use features, such as file + * descriptors, not compatible with @connection), then a warning is + * logged to standard error. Applications can + * check this ahead of time using g_dbus_message_to_blob() passing a + * #GDBusCapabilityFlags value obtained from @connection. + * + * Returns: (transfer full) (allow-none): A #GDBusMessage that will be freed with + * g_object_unref() or %NULL to drop the message. Passive filter + * functions can simply return the passed @message object. + * + * Since: 2.26 + */ +typedef GDBusMessage *(*GDBusMessageFilterFunction) (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +guint g_dbus_connection_add_filter (GDBusConnection *connection, + GDBusMessageFilterFunction filter_function, + gpointer user_data, + GDestroyNotify user_data_free_func); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_connection_remove_filter (GDBusConnection *connection, + guint filter_id); + +/* ---------------------------------------------------------------------------------------------------- */ + + +G_END_DECLS + +#endif /* __G_DBUS_CONNECTION_H__ */ diff --git a/gio/gdbusdaemon.c b/gio/gdbusdaemon.c new file mode 100644 index 0000000..2393771 --- /dev/null +++ b/gio/gdbusdaemon.c @@ -0,0 +1,1752 @@ +#include "config.h" + +#include +#include + +#include +#include +#include +#include "gdbusdaemon.h" + +#include "gdbus-daemon-generated.h" + +#define DBUS_SERVICE_NAME "org.freedesktop.DBus" + +/* Owner flags */ +#define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */ +#define DBUS_NAME_FLAG_REPLACE_EXISTING 0x2 /**< Request to replace the current primary owner */ +#define DBUS_NAME_FLAG_DO_NOT_QUEUE 0x4 /**< If we can not become the primary owner do not place us in the queue */ + +/* Replies to request for a name */ +#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1 /**< Service has become the primary owner of the requested name */ +#define DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2 /**< Service could not become the primary owner and has been placed in the queue */ +#define DBUS_REQUEST_NAME_REPLY_EXISTS 3 /**< Service is already in the queue */ +#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4 /**< Service is already the primary owner */ + +/* Replies to releasing a name */ +#define DBUS_RELEASE_NAME_REPLY_RELEASED 1 /**< Service was released from the given name */ +#define DBUS_RELEASE_NAME_REPLY_NON_EXISTENT 2 /**< The given name does not exist on the bus */ +#define DBUS_RELEASE_NAME_REPLY_NOT_OWNER 3 /**< Service is not an owner of the given name */ + +/* Replies to service starts */ +#define DBUS_START_REPLY_SUCCESS 1 /**< Service was auto started */ +#define DBUS_START_REPLY_ALREADY_RUNNING 2 /**< Service was already running */ + +#define IDLE_TIMEOUT_MSEC 3000 + +struct _GDBusDaemon +{ + _GFreedesktopDBusSkeleton parent_instance; + + gchar *address; + guint timeout; + gchar *tmpdir; + GDBusServer *server; + gchar *guid; + GHashTable *clients; + GHashTable *names; + guint32 next_major_id; + guint32 next_minor_id; +}; + +struct _GDBusDaemonClass +{ + _GFreedesktopDBusSkeletonClass parent_class; +}; + +enum { + PROP_0, + PROP_ADDRESS, +}; + +enum +{ + SIGNAL_IDLE_TIMEOUT, + NR_SIGNALS +}; + +static guint g_dbus_daemon_signals[NR_SIGNALS]; + + +static void initable_iface_init (GInitableIface *initable_iface); +static void g_dbus_daemon_iface_init (_GFreedesktopDBusIface *iface); + +#define g_dbus_daemon_get_type _g_dbus_daemon_get_type +G_DEFINE_TYPE_WITH_CODE (GDBusDaemon, g_dbus_daemon, _G_TYPE_FREEDESKTOP_DBUS_SKELETON, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) + G_IMPLEMENT_INTERFACE (_G_TYPE_FREEDESKTOP_DBUS, g_dbus_daemon_iface_init)); + +typedef struct { + GDBusDaemon *daemon; + char *id; + GDBusConnection *connection; + GList *matches; +} Client; + +typedef struct { + Client *client; + guint32 flags; +} NameOwner; + +typedef struct { + int refcount; + + char *name; + GDBusDaemon *daemon; + + NameOwner *owner; + GList *queue; +} Name; + +enum { + MATCH_ELEMENT_TYPE, + MATCH_ELEMENT_SENDER, + MATCH_ELEMENT_INTERFACE, + MATCH_ELEMENT_MEMBER, + MATCH_ELEMENT_PATH, + MATCH_ELEMENT_PATH_NAMESPACE, + MATCH_ELEMENT_DESTINATION, + MATCH_ELEMENT_ARG0NAMESPACE, + MATCH_ELEMENT_EAVESDROP, + MATCH_ELEMENT_ARGN, + MATCH_ELEMENT_ARGNPATH, +}; + +typedef struct { + guint16 type; + guint16 arg; + char *value; +} MatchElement; + +typedef struct { + gboolean eavesdrop; + GDBusMessageType type; + int n_elements; + MatchElement *elements; +} Match; + +static GDBusMessage *filter_function (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data); +static void connection_closed (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error, + Client *client); + +static NameOwner * +name_owner_new (Client *client, guint32 flags) +{ + NameOwner *owner; + + owner = g_new0 (NameOwner, 1); + owner->client = client; + owner->flags = flags; + return owner; +} + +static void +name_owner_free (NameOwner *owner) +{ + g_free (owner); +} + +static Name * +name_new (GDBusDaemon *daemon, const char *str) +{ + Name *name; + + name = g_new0 (Name, 1); + name->refcount = 1; + name->daemon = daemon; + name->name = g_strdup (str); + + g_hash_table_insert (daemon->names, name->name, name); + + return name; +} + +static Name * +name_ref (Name *name) +{ + name->refcount++; + return name; +} + +static void +name_unref (Name *name) +{ + if (--name->refcount == 0) + { + g_hash_table_remove (name->daemon->names, name->name); + g_free (name->name); + g_free (name); + } +} + +static Name * +name_ensure (GDBusDaemon *daemon, const char *str) +{ + Name *name; + + name = g_hash_table_lookup (daemon->names, str); + + if (name != NULL) + return name_ref (name); + return name_new (daemon, str); +} + +static Name * +name_lookup (GDBusDaemon *daemon, const char *str) +{ + return g_hash_table_lookup (daemon->names, str); +} + +static gboolean +is_key (const char *key_start, const char *key_end, char *value) +{ + gsize len = strlen (value); + + if (len != key_end - key_start) + return FALSE; + + return strncmp (key_start, value, len) == 0; +} + +static gboolean +parse_key (MatchElement *element, const char *key_start, const char *key_end) +{ + gboolean res = TRUE; + + if (is_key (key_start, key_end, "type")) + { + element->type = MATCH_ELEMENT_TYPE; + } + else if (is_key (key_start, key_end, "sender")) + { + element->type = MATCH_ELEMENT_SENDER; + } + else if (is_key (key_start, key_end, "interface")) + { + element->type = MATCH_ELEMENT_INTERFACE; + } + else if (is_key (key_start, key_end, "member")) + { + element->type = MATCH_ELEMENT_MEMBER; + } + else if (is_key (key_start, key_end, "path")) + { + element->type = MATCH_ELEMENT_PATH; + } + else if (is_key (key_start, key_end, "path_namespace")) + { + element->type = MATCH_ELEMENT_PATH_NAMESPACE; + } + else if (is_key (key_start, key_end, "destination")) + { + element->type = MATCH_ELEMENT_DESTINATION; + } + else if (is_key (key_start, key_end, "arg0namespace")) + { + element->type = MATCH_ELEMENT_ARG0NAMESPACE; + } + else if (is_key (key_start, key_end, "eavesdrop")) + { + element->type = MATCH_ELEMENT_EAVESDROP; + } + else if (key_end - key_start > 3 && is_key (key_start, key_start + 3, "arg")) + { + const char *digits = key_start + 3; + const char *end_digits = digits; + + while (end_digits < key_end && g_ascii_isdigit (*end_digits)) + end_digits++; + + if (end_digits == key_end) /* argN */ + { + element->type = MATCH_ELEMENT_ARGN; + element->arg = atoi (digits); + } + else if (is_key (end_digits, key_end, "path")) /* argNpath */ + { + element->type = MATCH_ELEMENT_ARGNPATH; + element->arg = atoi (digits); + } + else + res = FALSE; + } + else + res = FALSE; + + return res; +} + +static const char * +parse_value (MatchElement *element, const char *s) +{ + char quote_char; + GString *value; + + value = g_string_new (""); + + quote_char = 0; + + for (;*s; s++) + { + if (quote_char == 0) + { + switch (*s) + { + case '\'': + quote_char = '\''; + break; + + case ',': + s++; + goto out; + + case '\\': + quote_char = '\\'; + break; + + default: + g_string_append_c (value, *s); + break; + } + } + else if (quote_char == '\\') + { + /* \ only counts as an escape if escaping a quote mark */ + if (*s != '\'') + g_string_append_c (value, '\\'); + + g_string_append_c (value, *s); + quote_char = 0; + } + else /* quote_char == ' */ + { + if (*s == '\'') + quote_char = 0; + else + g_string_append_c (value, *s); + } + } + + out: + + if (quote_char == '\\') + g_string_append_c (value, '\\'); + else if (quote_char == '\'') + { + g_string_free (value, TRUE); + return NULL; + } + + element->value = g_string_free (value, FALSE); + return s; +} + +static Match * +match_new (const char *str) +{ + Match *match; + GArray *elements; + const char *p; + const char *key_start; + const char *key_end; + MatchElement element; + gboolean eavesdrop; + GDBusMessageType type; + int i; + + eavesdrop = FALSE; + type = G_DBUS_MESSAGE_TYPE_INVALID; + elements = g_array_new (TRUE, TRUE, sizeof (MatchElement)); + + p = str; + + while (*p != 0) + { + memset (&element, 0, sizeof (element)); + + /* Skip initial whitespace */ + while (*p && g_ascii_isspace (*p)) + p++; + + key_start = p; + + /* Read non-whitespace non-equals chars */ + while (*p && *p != '=' && !g_ascii_isspace (*p)) + p++; + + key_end = p; + + /* Skip any whitespace after key */ + while (*p && g_ascii_isspace (*p)) + p++; + + if (key_start == key_end) + continue; /* Allow trailing whitespace */ + + if (*p != '=') + goto error; + + ++p; + + if (!parse_key (&element, key_start, key_end)) + goto error; + + p = parse_value (&element, p); + if (p == NULL) + goto error; + + if (element.type == MATCH_ELEMENT_EAVESDROP) + { + if (strcmp (element.value, "true") == 0) + eavesdrop = TRUE; + else if (strcmp (element.value, "false") == 0) + eavesdrop = FALSE; + else + { + g_free (element.value); + goto error; + } + g_free (element.value); + } + else if (element.type == MATCH_ELEMENT_TYPE) + { + if (strcmp (element.value, "signal") == 0) + type = G_DBUS_MESSAGE_TYPE_SIGNAL; + else if (strcmp (element.value, "method_call") == 0) + type = G_DBUS_MESSAGE_TYPE_METHOD_CALL; + else if (strcmp (element.value, "method_return") == 0) + type = G_DBUS_MESSAGE_TYPE_METHOD_RETURN; + else if (strcmp (element.value, "error") == 0) + type = G_DBUS_MESSAGE_TYPE_ERROR; + else + { + g_free (element.value); + goto error; + } + g_free (element.value); + } + else + g_array_append_val (elements, element); + } + + match = g_new0 (Match, 1); + match->n_elements = elements->len; + match->elements = (MatchElement *)g_array_free (elements, FALSE); + match->eavesdrop = eavesdrop; + match->type = type; + + return match; + + error: + for (i = 0; i < elements->len; i++) + g_free (g_array_index (elements, MatchElement, i).value); + g_array_free (elements, TRUE); + return NULL; +} + +static void +match_free (Match *match) +{ + int i; + for (i = 0; i < match->n_elements; i++) + g_free (match->elements[i].value); + g_free (match->elements); + g_free (match); +} + +static gboolean +match_equal (Match *a, Match *b) +{ + int i; + + if (a->eavesdrop != b->eavesdrop) + return FALSE; + if (a->type != b->type) + return FALSE; + if (a->n_elements != b->n_elements) + return FALSE; + for (i = 0; i < a->n_elements; i++) + { + if (a->elements[i].type != b->elements[i].type || + a->elements[i].arg != b->elements[i].arg || + strcmp (a->elements[i].value, b->elements[i].value) != 0) + return FALSE; + } + return TRUE; +} + +static const gchar * +message_get_argN (GDBusMessage *message, int n, gboolean allow_path) +{ + const gchar *ret; + GVariant *body; + + ret = NULL; + + body = g_dbus_message_get_body (message); + + if (body != NULL && g_variant_is_of_type (body, G_VARIANT_TYPE_TUPLE)) + { + GVariant *item; + item = g_variant_get_child_value (body, n); + if (g_variant_is_of_type (item, G_VARIANT_TYPE_STRING) || + (allow_path && g_variant_is_of_type (item, G_VARIANT_TYPE_OBJECT_PATH))) + ret = g_variant_get_string (item, NULL); + g_variant_unref (item); + } + + return ret; +} + +enum { + CHECK_TYPE_STRING, + CHECK_TYPE_NAME, + CHECK_TYPE_PATH_PREFIX, + CHECK_TYPE_PATH_RELATED, + CHECK_TYPE_NAMESPACE_PREFIX +}; + +static gboolean +match_matches (GDBusDaemon *daemon, + Match *match, GDBusMessage *message, + gboolean has_destination) +{ + MatchElement *element; + Name *name; + int i, len, len2; + const char *value; + int check_type; + + if (has_destination && !match->eavesdrop) + return FALSE; + + if (match->type != G_DBUS_MESSAGE_TYPE_INVALID && + g_dbus_message_get_message_type (message) != match->type) + return FALSE; + + for (i = 0; i < match->n_elements; i++) + { + element = &match->elements[i]; + check_type = CHECK_TYPE_STRING; + switch (element->type) + { + case MATCH_ELEMENT_SENDER: + check_type = CHECK_TYPE_NAME; + value = g_dbus_message_get_sender (message); + if (value == NULL) + value = DBUS_SERVICE_NAME; + break; + case MATCH_ELEMENT_DESTINATION: + check_type = CHECK_TYPE_NAME; + value = g_dbus_message_get_destination (message); + break; + case MATCH_ELEMENT_INTERFACE: + value = g_dbus_message_get_interface (message); + break; + case MATCH_ELEMENT_MEMBER: + value = g_dbus_message_get_member (message); + break; + case MATCH_ELEMENT_PATH: + value = g_dbus_message_get_path (message); + break; + case MATCH_ELEMENT_PATH_NAMESPACE: + check_type = CHECK_TYPE_PATH_PREFIX; + value = g_dbus_message_get_path (message); + break; + case MATCH_ELEMENT_ARG0NAMESPACE: + check_type = CHECK_TYPE_NAMESPACE_PREFIX; + value = message_get_argN (message, 0, FALSE); + break; + case MATCH_ELEMENT_ARGN: + value = message_get_argN (message, element->arg, FALSE); + break; + case MATCH_ELEMENT_ARGNPATH: + check_type = CHECK_TYPE_PATH_RELATED; + value = message_get_argN (message, element->arg, TRUE); + break; + default: + case MATCH_ELEMENT_TYPE: + case MATCH_ELEMENT_EAVESDROP: + g_assert_not_reached (); + } + + if (value == NULL) + return FALSE; + + switch (check_type) + { + case CHECK_TYPE_STRING: + if (strcmp (element->value, value) != 0) + return FALSE; + break; + case CHECK_TYPE_NAME: + name = name_lookup (daemon, element->value); + if (name != NULL && name->owner != NULL) + { + if (strcmp (name->owner->client->id, value) != 0) + return FALSE; + } + else if (strcmp (element->value, value) != 0) + return FALSE; + break; + case CHECK_TYPE_PATH_PREFIX: + len = strlen (element->value); + if (!(g_str_has_prefix (value, element->value) && + (value[len] == 0 || value[len] == '/'))) + return FALSE; + break; + case CHECK_TYPE_PATH_RELATED: + len = strlen (element->value); + len2 = strlen (value); + + if (!(strcmp (value, element->value) == 0 || + (len2 > 0 && value[len2-1] == '/' && g_str_has_prefix (element->value, value)) || + (len > 0 && element->value[len-1] == '/' && g_str_has_prefix (value, element->value)))) + return FALSE; + break; + case CHECK_TYPE_NAMESPACE_PREFIX: + len = strlen (element->value); + if (!(g_str_has_prefix (value, element->value) && + (value[len] == 0 || value[len] == '.'))) + return FALSE; + break; + default: + g_assert_not_reached (); + } + } + + return TRUE; +} + +static void +broadcast_message (GDBusDaemon *daemon, + GDBusMessage *message, + gboolean has_destination, + gboolean preserve_serial, + Client *not_to) +{ + GList *clients, *l, *ll; + GDBusMessage *copy; + + clients = g_hash_table_get_values (daemon->clients); + for (l = clients; l != NULL; l = l->next) + { + Client *client = l->data; + + if (client == not_to) + continue; + + for (ll = client->matches; ll != NULL; ll = ll->next) + { + Match *match = ll->data; + + if (match_matches (daemon, match, message, has_destination)) + break; + } + + if (ll != NULL) + { + copy = g_dbus_message_copy (message, NULL); + if (copy) + { + g_dbus_connection_send_message (client->connection, copy, + preserve_serial?G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL:0, NULL, NULL); + g_object_unref (copy); + } + } + } + + g_list_free (clients); +} + +static void +send_name_owner_changed (GDBusDaemon *daemon, + const char *name, + const char *old_owner, + const char *new_owner) +{ + GDBusMessage *signal_message; + + signal_message = g_dbus_message_new_signal ("/org/freedesktop/DBus", + "org.freedesktop.DBus", + "NameOwnerChanged"); + g_dbus_message_set_body (signal_message, + g_variant_new ("(sss)", + name, + old_owner ? old_owner : "", + new_owner ? new_owner : "")); + + broadcast_message (daemon, signal_message, FALSE, FALSE, NULL); + g_object_unref (signal_message); + +} + +static gboolean +name_unqueue_owner (Name *name, Client *client) +{ + GList *l; + + for (l = name->queue; l != NULL; l = l->next) + { + NameOwner *other = l->data; + + if (other->client == client) + { + name->queue = g_list_delete_link (name->queue, l); + name_unref (name); + name_owner_free (other); + return TRUE; + } + } + + return FALSE; +} + +static void +name_replace_owner (Name *name, NameOwner *owner) +{ + GDBusDaemon *daemon = name->daemon; + NameOwner *old_owner; + char *old_name = NULL, *new_name = NULL; + Client *new_client = NULL; + + if (owner) + new_client = owner->client; + + name_ref (name); + + old_owner = name->owner; + if (old_owner) + { + Client *old_client = old_owner->client; + + g_assert (old_owner->client != new_client); + + g_dbus_connection_emit_signal (old_client->connection, + NULL, "/org/freedesktop/DBus", + "org.freedesktop.DBus", "NameLost", + g_variant_new ("(s)", + name->name), NULL); + + old_name = g_strdup (old_client->id); + if (old_owner->flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) + { + name_unref (name); + name_owner_free (old_owner); + } + else + name->queue = g_list_prepend (name->queue, old_owner); + } + + name->owner = owner; + if (owner) + { + name_unqueue_owner (name, owner->client); + name_ref (name); + new_name = new_client->id; + + g_dbus_connection_emit_signal (new_client->connection, + NULL, "/org/freedesktop/DBus", + "org.freedesktop.DBus", "NameAcquired", + g_variant_new ("(s)", + name->name), NULL); + } + + send_name_owner_changed (daemon, name->name, old_name, new_name); + + g_free (old_name); + + name_unref (name); +} + +static void +name_release_owner (Name *name) +{ + NameOwner *next_owner = NULL; + + name_ref (name); + + /* Will someone else take over? */ + if (name->queue) + { + next_owner = name->queue->data; + name_unref (name); + name->queue = g_list_delete_link (name->queue, name->queue); + } + + name->owner->flags |= DBUS_NAME_FLAG_DO_NOT_QUEUE; + name_replace_owner (name, next_owner); + + name_unref (name); +} + +static void +name_queue_owner (Name *name, NameOwner *owner) +{ + GList *l; + + for (l = name->queue; l != NULL; l = l->next) + { + NameOwner *other = l->data; + + if (other->client == owner->client) + { + other->flags = owner->flags; + name_owner_free (owner); + return; + } + } + + name->queue = g_list_append (name->queue, owner); + name_ref (name); +} + +static Client * +client_new (GDBusDaemon *daemon, GDBusConnection *connection) +{ + Client *client; + GError *error = NULL; + + client = g_new0 (Client, 1); + client->daemon = daemon; + client->id = g_strdup_printf (":%d.%d", daemon->next_major_id, daemon->next_minor_id); + client->connection = g_object_ref (connection); + + if (daemon->next_minor_id == G_MAXUINT32) + { + daemon->next_minor_id = 0; + daemon->next_major_id++; + } + else + daemon->next_minor_id++; + + g_object_set_data (G_OBJECT (connection), "client", client); + g_hash_table_insert (daemon->clients, client->id, client); + + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (daemon), connection, + "/org/freedesktop/DBus", &error); + g_assert_no_error (error); + + g_signal_connect (connection, "closed", G_CALLBACK (connection_closed), client); + g_dbus_connection_add_filter (connection, + filter_function, + client, NULL); + + send_name_owner_changed (daemon, client->id, NULL, client->id); + + return client; +} + +static void +client_free (Client *client) +{ + GDBusDaemon *daemon = client->daemon; + GList *l, *names; + + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (daemon), + client->connection); + + g_hash_table_remove (daemon->clients, client->id); + + names = g_hash_table_get_values (daemon->names); + for (l = names; l != NULL; l = l->next) + { + Name *name = l->data; + + name_ref (name); + + if (name->owner && name->owner->client == client) + name_release_owner (name); + + name_unqueue_owner (name, client); + + name_unref (name); + } + g_list_free (names); + + send_name_owner_changed (daemon, client->id, client->id, NULL); + + g_object_unref (client->connection); + + for (l = client->matches; l != NULL; l = l->next) + match_free (l->data); + g_list_free (client->matches); + + g_free (client->id); + g_free (client); +} + +static gboolean +idle_timeout_cb (gpointer user_data) +{ + GDBusDaemon *daemon = user_data; + + daemon->timeout = 0; + + g_signal_emit (daemon, + g_dbus_daemon_signals[SIGNAL_IDLE_TIMEOUT], + 0); + + return G_SOURCE_REMOVE; +} + +static void +connection_closed (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error, + Client *client) +{ + GDBusDaemon *daemon = client->daemon; + + client_free (client); + + if (g_hash_table_size (daemon->clients) == 0) + daemon->timeout = g_timeout_add (IDLE_TIMEOUT_MSEC, + idle_timeout_cb, + daemon); +} + +static gboolean +handle_add_match (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_rule) +{ + Client *client = g_object_get_data (G_OBJECT (g_dbus_method_invocation_get_connection (invocation)), "client"); + Match *match; + + match = match_new (arg_rule); + + if (match == NULL) + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_MATCH_RULE_INVALID, + "Invalid rule: %s", arg_rule); + else + { + client->matches = g_list_prepend (client->matches, match); + _g_freedesktop_dbus_complete_add_match (object, invocation); + } + return TRUE; +} + +static gboolean +handle_get_connection_selinux_security_context (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN, + "selinux context not supported"); + _g_freedesktop_dbus_complete_get_connection_selinux_security_context (object, invocation, ""); + return TRUE; +} + +static gboolean +handle_get_connection_unix_process_id (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, + "connection pid not supported"); + return TRUE; +} + +static gboolean +handle_get_connection_unix_user (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, + "connection user not supported"); + return TRUE; +} + +static gboolean +handle_get_id (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + _g_freedesktop_dbus_complete_get_id (object, invocation, + daemon->guid); + return TRUE; +} + +static gboolean +handle_get_name_owner (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + Name *name; + + if (strcmp (arg_name, DBUS_SERVICE_NAME) == 0) + { + _g_freedesktop_dbus_complete_get_name_owner (object, invocation, DBUS_SERVICE_NAME); + return TRUE; + } + + if (arg_name[0] == ':') + { + if (g_hash_table_lookup (daemon->clients, arg_name) == NULL) + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER, + "Could not get owner of name '%s': no such name", arg_name); + else + _g_freedesktop_dbus_complete_get_name_owner (object, invocation, arg_name); + return TRUE; + } + + name = name_lookup (daemon, arg_name); + if (name == NULL || name->owner == NULL) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER, + "Could not get owner of name '%s': no such name", arg_name); + return TRUE; + } + + _g_freedesktop_dbus_complete_get_name_owner (object, invocation, name->owner->client->id); + return TRUE; +} + +static gboolean +handle_hello (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation) +{ + Client *client = g_object_get_data (G_OBJECT (g_dbus_method_invocation_get_connection (invocation)), "client"); + _g_freedesktop_dbus_complete_hello (object, invocation, client->id); + + g_dbus_connection_emit_signal (client->connection, + NULL, "/org/freedesktop/DBus", + "org.freedesktop.DBus", "NameAcquired", + g_variant_new ("(s)", + client->id), NULL); + + return TRUE; +} + +static gboolean +handle_list_activatable_names (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation) +{ + const char *names[] = { NULL }; + + _g_freedesktop_dbus_complete_list_activatable_names (object, + invocation, + names); + return TRUE; +} + +static gboolean +handle_list_names (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + GPtrArray *array; + GList *clients, *names, *l; + + array = g_ptr_array_new (); + + clients = g_hash_table_get_values (daemon->clients); + for (l = clients; l != NULL; l = l->next) + { + Client *client = l->data; + + g_ptr_array_add (array, client->id); + } + + g_list_free (clients); + + names = g_hash_table_get_values (daemon->names); + for (l = names; l != NULL; l = l->next) + { + Name *name = l->data; + + g_ptr_array_add (array, name->name); + } + + g_list_free (names); + + g_ptr_array_add (array, NULL); + + _g_freedesktop_dbus_complete_list_names (object, + invocation, + (const gchar * const*)array->pdata); + g_ptr_array_free (array, TRUE); + return TRUE; +} + +static gboolean +handle_list_queued_owners (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + GPtrArray *array; + Name *name; + GList *l; + + array = g_ptr_array_new (); + + name = name_lookup (daemon, arg_name); + if (name && name->owner) + { + for (l = name->queue; l != NULL; l = l->next) + { + Client *client = l->data; + + g_ptr_array_add (array, client->id); + } + } + + g_ptr_array_add (array, NULL); + + _g_freedesktop_dbus_complete_list_queued_owners (object, + invocation, + (const gchar * const*)array->pdata); + g_ptr_array_free (array, TRUE); + return TRUE; +} + +static gboolean +handle_name_has_owner (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + Name *name; + Client *client; + + name = name_lookup (daemon, arg_name); + client = g_hash_table_lookup (daemon->clients, arg_name); + + _g_freedesktop_dbus_complete_name_has_owner (object, invocation, + name != NULL || client != NULL); + return TRUE; +} + +static gboolean +handle_release_name (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name) +{ + Client *client = g_object_get_data (G_OBJECT (g_dbus_method_invocation_get_connection (invocation)), "client"); + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + Name *name; + guint32 result; + + if (!g_dbus_is_name (arg_name)) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Given bus name \"%s\" is not valid", arg_name); + return TRUE; + } + + if (*arg_name == ':') + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Cannot release a service starting with ':' such as \"%s\"", arg_name); + return TRUE; + } + + if (strcmp (arg_name, DBUS_SERVICE_NAME) == 0) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Cannot release a service named " DBUS_SERVICE_NAME ", because that is owned by the bus"); + return TRUE; + } + + name = name_lookup (daemon, arg_name); + + if (name == NULL) + result = DBUS_RELEASE_NAME_REPLY_NON_EXISTENT; + else if (name->owner && name->owner->client == client) + { + name_release_owner (name); + result = DBUS_RELEASE_NAME_REPLY_RELEASED; + } + else if (name_unqueue_owner (name, client)) + result = DBUS_RELEASE_NAME_REPLY_RELEASED; + else + result = DBUS_RELEASE_NAME_REPLY_NOT_OWNER; + + _g_freedesktop_dbus_complete_release_name (object, invocation, result); + return TRUE; +} + +static gboolean +handle_reload_config (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation) +{ + _g_freedesktop_dbus_complete_reload_config (object, invocation); + return TRUE; +} + +static gboolean +handle_update_activation_environment (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + GVariant *arg_environment) +{ + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "UpdateActivationEnvironment not implemented"); + return TRUE; +} + +static gboolean +handle_remove_match (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_rule) +{ + Client *client = g_object_get_data (G_OBJECT (g_dbus_method_invocation_get_connection (invocation)), "client"); + Match *match, *other_match; + GList *l; + + match = match_new (arg_rule); + + if (match == NULL) + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_MATCH_RULE_INVALID, + "Invalid rule: %s", arg_rule); + else + { + for (l = client->matches; l != NULL; l = l->next) + { + other_match = l->data; + if (match_equal (match, other_match)) + { + match_free (other_match); + client->matches = g_list_delete_link (client->matches, l); + break; + } + } + + if (l == NULL) + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_MATCH_RULE_NOT_FOUND, + "The given match rule wasn't found and can't be removed"); + else + _g_freedesktop_dbus_complete_remove_match (object, invocation); + } + + match_free (match); + + return TRUE; +} + +static gboolean +handle_request_name (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name, + guint flags) +{ + Client *client = g_object_get_data (G_OBJECT (g_dbus_method_invocation_get_connection (invocation)), "client"); + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + Name *name; + NameOwner *owner; + guint32 result; + + if (!g_dbus_is_name (arg_name)) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Requested bus name \"%s\" is not valid", arg_name); + return TRUE; + } + + if (*arg_name == ':') + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Cannot acquire a service starting with ':' such as \"%s\"", arg_name); + return TRUE; + } + + if (strcmp (arg_name, DBUS_SERVICE_NAME) == 0) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, + "Cannot acquire a service named " DBUS_SERVICE_NAME ", because that is reserved"); + return TRUE; + } + + name = name_ensure (daemon, arg_name); + if (name->owner == NULL) + { + owner = name_owner_new (client, flags); + name_replace_owner (name, owner); + + result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER; + } + else if (name->owner && name->owner->client == client) + { + name->owner->flags = flags; + result = DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER; + } + else if ((flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) && + (!(flags & DBUS_NAME_FLAG_REPLACE_EXISTING) || + !(name->owner->flags & DBUS_NAME_FLAG_ALLOW_REPLACEMENT))) + { + /* Unqueue if queued */ + name_unqueue_owner (name, client); + result = DBUS_REQUEST_NAME_REPLY_EXISTS; + } + else if (!(flags & DBUS_NAME_FLAG_DO_NOT_QUEUE) && + (!(flags & DBUS_NAME_FLAG_REPLACE_EXISTING) || + !(name->owner->flags & DBUS_NAME_FLAG_ALLOW_REPLACEMENT))) + { + /* Queue the connection */ + owner = name_owner_new (client, flags); + name_queue_owner (name, owner); + result = DBUS_REQUEST_NAME_REPLY_IN_QUEUE; + } + else + { + /* Replace the current owner */ + + owner = name_owner_new (client, flags); + name_replace_owner (name, owner); + + result = DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER; + } + + name_unref (name); + + _g_freedesktop_dbus_complete_request_name (object, invocation, result); + return TRUE; +} + +static gboolean +handle_start_service_by_name (_GFreedesktopDBus *object, + GDBusMethodInvocation *invocation, + const gchar *arg_name, + guint arg_flags) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + Name *name; + + name = name_lookup (daemon, arg_name); + if (name) + _g_freedesktop_dbus_complete_start_service_by_name (object, invocation, + DBUS_START_REPLY_ALREADY_RUNNING); + else + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN, + "No support for activation for name: %s", arg_name); + + return TRUE; +} + +G_GNUC_PRINTF(5, 6) +static void +return_error (Client *client, GDBusMessage *message, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + GDBusMessage *reply; + va_list var_args; + char *error_message; + GError *error; + gchar *dbus_error_name; + + va_start (var_args, format); + error_message = g_strdup_vprintf (format, var_args); + va_end (var_args); + + error = g_error_new_literal (domain, code, ""); + dbus_error_name = g_dbus_error_encode_gerror (error); + + reply = g_dbus_message_new_method_error_literal (message, + dbus_error_name, + error_message); + + g_error_free (error); + g_free (dbus_error_name); + g_free (error_message); + + if (!g_dbus_connection_send_message (client->connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL)) + g_warning ("Error sending reply"); + g_object_unref (reply); +} + +static GDBusMessage * +route_message (Client *source_client, GDBusMessage *message) +{ + const char *dest; + Client *dest_client; + GDBusDaemon *daemon; + + daemon = source_client->daemon; + + dest_client = NULL; + dest = g_dbus_message_get_destination (message); + if (dest != NULL && strcmp (dest, DBUS_SERVICE_NAME) != 0) + { + dest_client = g_hash_table_lookup (daemon->clients, dest); + + if (dest_client == NULL) + { + Name *name; + name = name_lookup (daemon, dest); + if (name && name->owner) + dest_client = name->owner->client; + } + + if (dest_client == NULL) + { + if (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL) + return_error (source_client, message, + G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN, + "The name %s is unknown", dest); + } + else + { + GError *error = NULL; + + if (!g_dbus_connection_send_message (dest_client->connection, message, G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL, NULL, &error)) + { + g_warning ("Error forwarding message: %s", error->message); + g_error_free (error); + } + } + } + + broadcast_message (daemon, message, dest_client != NULL, TRUE, dest_client); + + /* Swallow messages not for the bus */ + if (dest == NULL || strcmp (dest, DBUS_SERVICE_NAME) != 0) + { + g_object_unref (message); + message = NULL; + } + + return message; +} + +static GDBusMessage * +copy_if_locked (GDBusMessage *message) +{ + if (g_dbus_message_get_locked (message)) + { + GDBusMessage *copy = g_dbus_message_copy (message, NULL); + g_object_unref (message); + message = copy; + } + return message; +} + +static GDBusMessage * +filter_function (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data) +{ + Client *client = user_data; + char *types[] = {"invalid", "method_call", "method_return", "error", "signal" }; + + if (0) + g_printerr ("%s%s %s %d(%d) sender: %s destination: %s %s %s.%s\n", + client->id, + incoming? "->" : "<-", + types[g_dbus_message_get_message_type (message)], + g_dbus_message_get_serial (message), + g_dbus_message_get_reply_serial (message), + g_dbus_message_get_sender (message), + g_dbus_message_get_destination (message), + g_dbus_message_get_path (message), + g_dbus_message_get_interface (message), + g_dbus_message_get_member (message)); + + if (incoming) + { + /* Ensure its not locked so we can set the sender */ + message = copy_if_locked (message); + if (message == NULL) + { + g_warning ("Failed to copy incoming message"); + return NULL; + } + g_dbus_message_set_sender (message, client->id); + + return route_message (client, message); + } + else + { + if (g_dbus_message_get_sender (message) == NULL) + { + message = copy_if_locked (message); + g_dbus_message_set_sender (message, DBUS_SERVICE_NAME); + } + if (g_dbus_message_get_destination (message) == NULL) + { + message = copy_if_locked (message); + g_dbus_message_set_destination (message, client->id); + } + } + + return message; +} + +static gboolean +on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + GDBusDaemon *daemon = user_data; + + g_dbus_connection_set_exit_on_close (connection, FALSE); + + if (daemon->timeout) + { + g_source_remove (daemon->timeout); + daemon->timeout = 0; + } + + client_new (daemon, connection); + + return TRUE; +} + +static gboolean +on_authorize_authenticated_peer (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials, + gpointer user_data) +{ + gboolean authorized = TRUE; + + if (credentials != NULL) + { + GCredentials *own_credentials; + + own_credentials = g_credentials_new (); + authorized = g_credentials_is_same_user (credentials, own_credentials, NULL); + g_object_unref (own_credentials); + } + + return authorized; +} + +static void +g_dbus_daemon_finalize (GObject *object) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + GList *clients, *l; + + if (daemon->timeout) + g_source_remove (daemon->timeout); + + clients = g_hash_table_get_values (daemon->clients); + for (l = clients; l != NULL; l = l->next) + client_free (l->data); + g_list_free (clients); + + g_assert (g_hash_table_size (daemon->clients) == 0); + g_assert (g_hash_table_size (daemon->names) == 0); + + g_hash_table_destroy (daemon->clients); + g_hash_table_destroy (daemon->names); + + g_object_unref (daemon->server); + + if (daemon->tmpdir) + { + g_rmdir (daemon->tmpdir); + g_free (daemon->tmpdir); + } + + g_free (daemon->guid); + g_free (daemon->address); + + G_OBJECT_CLASS (g_dbus_daemon_parent_class)->finalize (object); +} + +static void +g_dbus_daemon_init (GDBusDaemon *daemon) +{ + daemon->next_major_id = 1; + daemon->clients = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + daemon->names = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); + daemon->guid = g_dbus_generate_guid (); +} + +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (initable); + GDBusAuthObserver *observer; + GDBusServerFlags flags; + + flags = G_DBUS_SERVER_FLAGS_NONE; + if (daemon->address == NULL) + { +#ifdef G_OS_UNIX + if (g_unix_socket_address_abstract_names_supported ()) + daemon->address = g_strdup ("unix:tmpdir=/tmp/gdbus-daemon"); + else + { + daemon->tmpdir = g_dir_make_tmp ("gdbus-daemon-XXXXXX", NULL); + daemon->address = g_strdup_printf ("unix:tmpdir=%s", daemon->tmpdir); + } +#else + daemon->address = g_strdup ("nonce-tcp:"); + flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS; +#endif + } + + observer = g_dbus_auth_observer_new (); + daemon->server = g_dbus_server_new_sync (daemon->address, + flags, + daemon->guid, + observer, + cancellable, + error); + if (daemon->server == NULL) + { + g_object_unref (observer); + return FALSE; + } + + + g_dbus_server_start (daemon->server); + + g_signal_connect (daemon->server, "new-connection", + G_CALLBACK (on_new_connection), + daemon); + g_signal_connect (observer, + "authorize-authenticated-peer", + G_CALLBACK (on_authorize_authenticated_peer), + daemon); + + g_object_unref (observer); + + return TRUE; +} + +static void +g_dbus_daemon_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + + switch (prop_id) + { + case PROP_ADDRESS: + g_free (daemon->address); + daemon->address = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_dbus_daemon_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusDaemon *daemon = G_DBUS_DAEMON (object); + + switch (prop_id) + { + case PROP_ADDRESS: + g_value_set_string (value, daemon->address); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_dbus_daemon_class_init (GDBusDaemonClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = g_dbus_daemon_finalize; + gobject_class->set_property = g_dbus_daemon_set_property; + gobject_class->get_property = g_dbus_daemon_get_property; + + g_dbus_daemon_signals[SIGNAL_IDLE_TIMEOUT] = + g_signal_new ("idle-timeout", + G_TYPE_DBUS_DAEMON, + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + g_object_class_install_property (gobject_class, + PROP_ADDRESS, + g_param_spec_string ("address", + "Bus Address", + "The address the bus should use", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_dbus_daemon_iface_init (_GFreedesktopDBusIface *iface) +{ + iface->handle_add_match = handle_add_match; + iface->handle_get_connection_selinux_security_context = handle_get_connection_selinux_security_context; + iface->handle_get_connection_unix_process_id = handle_get_connection_unix_process_id; + iface->handle_get_connection_unix_user = handle_get_connection_unix_user; + iface->handle_get_id = handle_get_id; + iface->handle_get_name_owner = handle_get_name_owner; + iface->handle_hello = handle_hello; + iface->handle_list_activatable_names = handle_list_activatable_names; + iface->handle_list_names = handle_list_names; + iface->handle_list_queued_owners = handle_list_queued_owners; + iface->handle_name_has_owner = handle_name_has_owner; + iface->handle_release_name = handle_release_name; + iface->handle_reload_config = handle_reload_config; + iface->handle_update_activation_environment = handle_update_activation_environment; + iface->handle_remove_match = handle_remove_match; + iface->handle_request_name = handle_request_name; + iface->handle_start_service_by_name = handle_start_service_by_name; +} + +static void +initable_iface_init (GInitableIface *initable_iface) +{ + initable_iface->init = initable_init; +} + +GDBusDaemon * +_g_dbus_daemon_new (const char *address, + GCancellable *cancellable, + GError **error) +{ + return g_initable_new (G_TYPE_DBUS_DAEMON, + cancellable, + error, + "address", address, + NULL); +} + +const char * +_g_dbus_daemon_get_address (GDBusDaemon *daemon) +{ + return g_dbus_server_get_client_address (daemon->server); +} diff --git a/gio/gdbusdaemon.h b/gio/gdbusdaemon.h new file mode 100644 index 0000000..183b70e --- /dev/null +++ b/gio/gdbusdaemon.h @@ -0,0 +1,19 @@ +#include + +#define G_TYPE_DBUS_DAEMON (_g_dbus_daemon_get_type ()) +#define G_DBUS_DAEMON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_DAEMON, GDBusDaemon)) +#define G_DBUS_DAEMON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_DBUS_DAEMON, GDBusDaemonClass)) +#define G_DBUS_DAEMON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_DAEMON, GDBusDaemonClass)) +#define G_IS_DBUS_DAEMON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_DAEMON)) +#define G_IS_DBUS_DAEMON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_DAEMON)) + +typedef struct _GDBusDaemon GDBusDaemon; +typedef struct _GDBusDaemonClass GDBusDaemonClass; + +GType _g_dbus_daemon_get_type (void) G_GNUC_CONST; + +GDBusDaemon *_g_dbus_daemon_new (const char *address, + GCancellable *cancellable, + GError **error); + +const char *_g_dbus_daemon_get_address (GDBusDaemon *daemon); diff --git a/gio/gdbuserror.c b/gio/gdbuserror.c new file mode 100644 index 0000000..685d853 --- /dev/null +++ b/gio/gdbuserror.c @@ -0,0 +1,882 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include "gdbuserror.h" +#include "gioenums.h" +#include "gioenumtypes.h" +#include "gioerror.h" +#include "gdbusprivate.h" + +#include "glibintl.h" + +/** + * SECTION:gdbuserror + * @title: GDBusError + * @short_description: Mapping D-Bus errors to and from GError + * @include: gio/gio.h + * + * All facilities that return errors from remote methods (such as + * g_dbus_connection_call_sync()) use #GError to represent both D-Bus + * errors (e.g. errors returned from the other peer) and locally + * in-process generated errors. + * + * To check if a returned #GError is an error from a remote peer, use + * g_dbus_error_is_remote_error(). To get the actual D-Bus error name, + * use g_dbus_error_get_remote_error(). Before presenting an error, + * always use g_dbus_error_strip_remote_error(). + * + * In addition, facilities used to return errors to a remote peer also + * use #GError. See g_dbus_method_invocation_return_error() for + * discussion about how the D-Bus error name is set. + * + * Applications can associate a #GError error domain with a set of D-Bus errors in order to + * automatically map from D-Bus errors to #GError and back. This + * is typically done in the function returning the #GQuark for the + * error domain: + * Error Registration + * /* foo-bar-error.h: */ + * + * #define FOO_BAR_ERROR (foo_bar_error_quark ()) + * GQuark foo_bar_error_quark (void); + * + * typedef enum + * { + * FOO_BAR_ERROR_FAILED, + * FOO_BAR_ERROR_ANOTHER_ERROR, + * FOO_BAR_ERROR_SOME_THIRD_ERROR, + * FOO_BAR_N_ERRORS /*< skip >*/ + * } FooBarError; + * + * /* foo-bar-error.c: */ + * + * static const GDBusErrorEntry foo_bar_error_entries[] = + * { + * {FOO_BAR_ERROR_FAILED, "org.project.Foo.Bar.Error.Failed"}, + * {FOO_BAR_ERROR_ANOTHER_ERROR, "org.project.Foo.Bar.Error.AnotherError"}, + * {FOO_BAR_ERROR_SOME_THIRD_ERROR, "org.project.Foo.Bar.Error.SomeThirdError"}, + * }; + * + * /* Ensure that every error code has an associated D-Bus error name */ + * G_STATIC_ASSERT (G_N_ELEMENTS (foo_bar_error_entries) == FOO_BAR_N_ERRORS); + * + * GQuark + * foo_bar_error_quark (void) + * { + * static volatile gsize quark_volatile = 0; + * g_dbus_error_register_error_domain ("foo-bar-error-quark", + * &quark_volatile, + * foo_bar_error_entries, + * G_N_ELEMENTS (foo_bar_error_entries)); + * return (GQuark) quark_volatile; + * } + * + * With this setup, a D-Bus peer can transparently pass e.g. %FOO_BAR_ERROR_ANOTHER_ERROR and + * other peers will see the D-Bus error name org.project.Foo.Bar.Error.AnotherError. + * + * If the other peer is using GDBus, and has registered the association with + * g_dbus_error_register_error_domain() in advance (e.g. by invoking the %FOO_BAR_ERROR quark + * generation itself in the previous example) the peer will see also %FOO_BAR_ERROR_ANOTHER_ERROR instead + * of %G_IO_ERROR_DBUS_ERROR. Note that GDBus clients can still recover + * org.project.Foo.Bar.Error.AnotherError using g_dbus_error_get_remote_error(). + * + * Note that errors in the %G_DBUS_ERROR error domain is intended only + * for returning errors from a remote message bus process. Errors + * generated locally in-process by e.g. #GDBusConnection is from the + * %G_IO_ERROR domain. + */ + +static const GDBusErrorEntry g_dbus_error_entries[] = +{ + {G_DBUS_ERROR_FAILED, "org.freedesktop.DBus.Error.Failed"}, + {G_DBUS_ERROR_NO_MEMORY, "org.freedesktop.DBus.Error.NoMemory"}, + {G_DBUS_ERROR_SERVICE_UNKNOWN, "org.freedesktop.DBus.Error.ServiceUnknown"}, + {G_DBUS_ERROR_NAME_HAS_NO_OWNER, "org.freedesktop.DBus.Error.NameHasNoOwner"}, + {G_DBUS_ERROR_NO_REPLY, "org.freedesktop.DBus.Error.NoReply"}, + {G_DBUS_ERROR_IO_ERROR, "org.freedesktop.DBus.Error.IOError"}, + {G_DBUS_ERROR_BAD_ADDRESS, "org.freedesktop.DBus.Error.BadAddress"}, + {G_DBUS_ERROR_NOT_SUPPORTED, "org.freedesktop.DBus.Error.NotSupported"}, + {G_DBUS_ERROR_LIMITS_EXCEEDED, "org.freedesktop.DBus.Error.LimitsExceeded"}, + {G_DBUS_ERROR_ACCESS_DENIED, "org.freedesktop.DBus.Error.AccessDenied"}, + {G_DBUS_ERROR_AUTH_FAILED, "org.freedesktop.DBus.Error.AuthFailed"}, + {G_DBUS_ERROR_NO_SERVER, "org.freedesktop.DBus.Error.NoServer"}, + {G_DBUS_ERROR_TIMEOUT, "org.freedesktop.DBus.Error.Timeout"}, + {G_DBUS_ERROR_NO_NETWORK, "org.freedesktop.DBus.Error.NoNetwork"}, + {G_DBUS_ERROR_ADDRESS_IN_USE, "org.freedesktop.DBus.Error.AddressInUse"}, + {G_DBUS_ERROR_DISCONNECTED, "org.freedesktop.DBus.Error.Disconnected"}, + {G_DBUS_ERROR_INVALID_ARGS, "org.freedesktop.DBus.Error.InvalidArgs"}, + {G_DBUS_ERROR_FILE_NOT_FOUND, "org.freedesktop.DBus.Error.FileNotFound"}, + {G_DBUS_ERROR_FILE_EXISTS, "org.freedesktop.DBus.Error.FileExists"}, + {G_DBUS_ERROR_UNKNOWN_METHOD, "org.freedesktop.DBus.Error.UnknownMethod"}, + {G_DBUS_ERROR_TIMED_OUT, "org.freedesktop.DBus.Error.TimedOut"}, + {G_DBUS_ERROR_MATCH_RULE_NOT_FOUND, "org.freedesktop.DBus.Error.MatchRuleNotFound"}, + {G_DBUS_ERROR_MATCH_RULE_INVALID, "org.freedesktop.DBus.Error.MatchRuleInvalid"}, + {G_DBUS_ERROR_SPAWN_EXEC_FAILED, "org.freedesktop.DBus.Error.Spawn.ExecFailed"}, + {G_DBUS_ERROR_SPAWN_FORK_FAILED, "org.freedesktop.DBus.Error.Spawn.ForkFailed"}, + {G_DBUS_ERROR_SPAWN_CHILD_EXITED, "org.freedesktop.DBus.Error.Spawn.ChildExited"}, + {G_DBUS_ERROR_SPAWN_CHILD_SIGNALED, "org.freedesktop.DBus.Error.Spawn.ChildSignaled"}, + {G_DBUS_ERROR_SPAWN_FAILED, "org.freedesktop.DBus.Error.Spawn.Failed"}, + {G_DBUS_ERROR_SPAWN_SETUP_FAILED, "org.freedesktop.DBus.Error.Spawn.FailedToSetup"}, + {G_DBUS_ERROR_SPAWN_CONFIG_INVALID, "org.freedesktop.DBus.Error.Spawn.ConfigInvalid"}, + {G_DBUS_ERROR_SPAWN_SERVICE_INVALID, "org.freedesktop.DBus.Error.Spawn.ServiceNotValid"}, + {G_DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND, "org.freedesktop.DBus.Error.Spawn.ServiceNotFound"}, + {G_DBUS_ERROR_SPAWN_PERMISSIONS_INVALID, "org.freedesktop.DBus.Error.Spawn.PermissionsInvalid"}, + {G_DBUS_ERROR_SPAWN_FILE_INVALID, "org.freedesktop.DBus.Error.Spawn.FileInvalid"}, + {G_DBUS_ERROR_SPAWN_NO_MEMORY, "org.freedesktop.DBus.Error.Spawn.NoMemory"}, + {G_DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, "org.freedesktop.DBus.Error.UnixProcessIdUnknown"}, + {G_DBUS_ERROR_INVALID_SIGNATURE, "org.freedesktop.DBus.Error.InvalidSignature"}, + {G_DBUS_ERROR_INVALID_FILE_CONTENT, "org.freedesktop.DBus.Error.InvalidFileContent"}, + {G_DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN, "org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown"}, + {G_DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN, "org.freedesktop.DBus.Error.AdtAuditDataUnknown"}, + {G_DBUS_ERROR_OBJECT_PATH_IN_USE, "org.freedesktop.DBus.Error.ObjectPathInUse"}, +}; + +GQuark +g_dbus_error_quark (void) +{ + G_STATIC_ASSERT (G_N_ELEMENTS (g_dbus_error_entries) - 1 == G_DBUS_ERROR_OBJECT_PATH_IN_USE); + static volatile gsize quark_volatile = 0; + g_dbus_error_register_error_domain ("g-dbus-error-quark", + &quark_volatile, + g_dbus_error_entries, + G_N_ELEMENTS (g_dbus_error_entries)); + return (GQuark) quark_volatile; +} + +/** + * g_dbus_error_register_error_domain: + * @error_domain_quark_name: The error domain name. + * @quark_volatile: A pointer where to store the #GQuark. + * @entries: A pointer to @num_entries #GDBusErrorEntry struct items. + * @num_entries: Number of items to register. + * + * Helper function for associating a #GError error domain with D-Bus error names. + * + * Since: 2.26 + */ +void +g_dbus_error_register_error_domain (const gchar *error_domain_quark_name, + volatile gsize *quark_volatile, + const GDBusErrorEntry *entries, + guint num_entries) +{ + g_return_if_fail (error_domain_quark_name != NULL); + g_return_if_fail (quark_volatile != NULL); + g_return_if_fail (entries != NULL); + g_return_if_fail (num_entries > 0); + + if (g_once_init_enter (quark_volatile)) + { + guint n; + GQuark quark; + + quark = g_quark_from_static_string (error_domain_quark_name); + + for (n = 0; n < num_entries; n++) + { + g_warn_if_fail (g_dbus_error_register_error (quark, + entries[n].error_code, + entries[n].dbus_error_name)); + } + g_once_init_leave (quark_volatile, quark); + } +} + +static gboolean +_g_dbus_error_decode_gerror (const gchar *dbus_name, + GQuark *out_error_domain, + gint *out_error_code) +{ + gboolean ret; + guint n; + GString *s; + gchar *domain_quark_string; + + ret = FALSE; + s = NULL; + + if (g_str_has_prefix (dbus_name, "org.gtk.GDBus.UnmappedGError.Quark._")) + { + s = g_string_new (NULL); + + for (n = sizeof "org.gtk.GDBus.UnmappedGError.Quark._" - 1; + dbus_name[n] != '.' && dbus_name[n] != '\0'; + n++) + { + if (g_ascii_isalnum (dbus_name[n])) + { + g_string_append_c (s, dbus_name[n]); + } + else if (dbus_name[n] == '_') + { + guint nibble_top; + guint nibble_bottom; + + n++; + + nibble_top = dbus_name[n]; + if (nibble_top >= '0' && nibble_top <= '9') + nibble_top -= '0'; + else if (nibble_top >= 'a' && nibble_top <= 'f') + nibble_top -= ('a' - 10); + else + goto not_mapped; + + n++; + + nibble_bottom = dbus_name[n]; + if (nibble_bottom >= '0' && nibble_bottom <= '9') + nibble_bottom -= '0'; + else if (nibble_bottom >= 'a' && nibble_bottom <= 'f') + nibble_bottom -= ('a' - 10); + else + goto not_mapped; + + g_string_append_c (s, (nibble_top<<4) | nibble_bottom); + } + else + { + goto not_mapped; + } + } + + if (!g_str_has_prefix (dbus_name + n, ".Code")) + goto not_mapped; + + domain_quark_string = g_string_free (s, FALSE); + s = NULL; + + if (out_error_domain != NULL) + *out_error_domain = g_quark_from_string (domain_quark_string); + g_free (domain_quark_string); + + if (out_error_code != NULL) + *out_error_code = atoi (dbus_name + n + sizeof ".Code" - 1); + + ret = TRUE; + } + + not_mapped: + + if (s != NULL) + g_string_free (s, TRUE); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GQuark error_domain; + gint error_code; +} QuarkCodePair; + +static guint +quark_code_pair_hash_func (const QuarkCodePair *pair) +{ + gint val; + val = pair->error_domain + pair->error_code; + return g_int_hash (&val); +} + +static gboolean +quark_code_pair_equal_func (const QuarkCodePair *a, + const QuarkCodePair *b) +{ + return (a->error_domain == b->error_domain) && (a->error_code == b->error_code); +} + +typedef struct +{ + QuarkCodePair pair; + gchar *dbus_error_name; +} RegisteredError; + +static void +registered_error_free (RegisteredError *re) +{ + g_free (re->dbus_error_name); + g_free (re); +} + +G_LOCK_DEFINE_STATIC (error_lock); + +/* maps from QuarkCodePair* -> RegisteredError* */ +static GHashTable *quark_code_pair_to_re = NULL; + +/* maps from gchar* -> RegisteredError* */ +static GHashTable *dbus_error_name_to_re = NULL; + +/** + * g_dbus_error_register_error: + * @error_domain: A #GQuark for a error domain. + * @error_code: An error code. + * @dbus_error_name: A D-Bus error name. + * + * Creates an association to map between @dbus_error_name and + * #GErrors specified by @error_domain and @error_code. + * + * This is typically done in the routine that returns the #GQuark for + * an error domain. + * + * Returns: %TRUE if the association was created, %FALSE if it already + * exists. + * + * Since: 2.26 + */ +gboolean +g_dbus_error_register_error (GQuark error_domain, + gint error_code, + const gchar *dbus_error_name) +{ + gboolean ret; + QuarkCodePair pair; + RegisteredError *re; + + g_return_val_if_fail (dbus_error_name != NULL, FALSE); + + ret = FALSE; + + G_LOCK (error_lock); + + if (quark_code_pair_to_re == NULL) + { + g_assert (dbus_error_name_to_re == NULL); /* check invariant */ + quark_code_pair_to_re = g_hash_table_new ((GHashFunc) quark_code_pair_hash_func, + (GEqualFunc) quark_code_pair_equal_func); + dbus_error_name_to_re = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) registered_error_free); + } + + if (g_hash_table_lookup (dbus_error_name_to_re, dbus_error_name) != NULL) + goto out; + + pair.error_domain = error_domain; + pair.error_code = error_code; + + if (g_hash_table_lookup (quark_code_pair_to_re, &pair) != NULL) + goto out; + + re = g_new0 (RegisteredError, 1); + re->pair = pair; + re->dbus_error_name = g_strdup (dbus_error_name); + + g_hash_table_insert (quark_code_pair_to_re, &(re->pair), re); + g_hash_table_insert (dbus_error_name_to_re, re->dbus_error_name, re); + + ret = TRUE; + + out: + G_UNLOCK (error_lock); + return ret; +} + +/** + * g_dbus_error_unregister_error: + * @error_domain: A #GQuark for a error domain. + * @error_code: An error code. + * @dbus_error_name: A D-Bus error name. + * + * Destroys an association previously set up with g_dbus_error_register_error(). + * + * Returns: %TRUE if the association was destroyed, %FALSE if it wasn't found. + * + * Since: 2.26 + */ +gboolean +g_dbus_error_unregister_error (GQuark error_domain, + gint error_code, + const gchar *dbus_error_name) +{ + gboolean ret; + RegisteredError *re; + guint hash_size; + + g_return_val_if_fail (dbus_error_name != NULL, FALSE); + + ret = FALSE; + + G_LOCK (error_lock); + + if (dbus_error_name_to_re == NULL) + { + g_assert (quark_code_pair_to_re == NULL); /* check invariant */ + goto out; + } + + re = g_hash_table_lookup (dbus_error_name_to_re, dbus_error_name); + if (re == NULL) + { + QuarkCodePair pair; + pair.error_domain = error_domain; + pair.error_code = error_code; + g_warn_if_fail (g_hash_table_lookup (quark_code_pair_to_re, &pair) == NULL); /* check invariant */ + goto out; + } + + ret = TRUE; + + g_warn_if_fail (g_hash_table_lookup (quark_code_pair_to_re, &(re->pair)) == re); /* check invariant */ + + g_warn_if_fail (g_hash_table_remove (quark_code_pair_to_re, &(re->pair))); + g_warn_if_fail (g_hash_table_remove (dbus_error_name_to_re, re->dbus_error_name)); + + /* destroy hashes if empty */ + hash_size = g_hash_table_size (dbus_error_name_to_re); + if (hash_size == 0) + { + g_warn_if_fail (g_hash_table_size (quark_code_pair_to_re) == 0); /* check invariant */ + + g_hash_table_unref (dbus_error_name_to_re); + dbus_error_name_to_re = NULL; + g_hash_table_unref (quark_code_pair_to_re); + quark_code_pair_to_re = NULL; + } + else + { + g_warn_if_fail (g_hash_table_size (quark_code_pair_to_re) == hash_size); /* check invariant */ + } + + out: + G_UNLOCK (error_lock); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_error_is_remote_error: + * @error: A #GError. + * + * Checks if @error represents an error received via D-Bus from a remote peer. If so, + * use g_dbus_error_get_remote_error() to get the name of the error. + * + * Returns: %TRUE if @error represents an error from a remote peer, + * %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_error_is_remote_error (const GError *error) +{ + g_return_val_if_fail (error != NULL, FALSE); + return g_str_has_prefix (error->message, "GDBus.Error:"); +} + + +/** + * g_dbus_error_get_remote_error: + * @error: A #GError. + * + * Gets the D-Bus error name used for @error, if any. + * + * This function is guaranteed to return a D-Bus error name for all + * #GErrors returned from functions handling remote method + * calls (e.g. g_dbus_connection_call_finish()) unless + * g_dbus_error_strip_remote_error() has been used on @error. + * + * Returns: An allocated string or %NULL if the D-Bus error name could not be found. Free with g_free(). + * + * Since: 2.26 + */ +gchar * +g_dbus_error_get_remote_error (const GError *error) +{ + RegisteredError *re; + gchar *ret; + + g_return_val_if_fail (error != NULL, NULL); + + /* Ensure that e.g. G_DBUS_ERROR is registered using g_dbus_error_register_error() */ + _g_dbus_initialize (); + + ret = NULL; + + G_LOCK (error_lock); + + re = NULL; + if (quark_code_pair_to_re != NULL) + { + QuarkCodePair pair; + pair.error_domain = error->domain; + pair.error_code = error->code; + g_assert (dbus_error_name_to_re != NULL); /* check invariant */ + re = g_hash_table_lookup (quark_code_pair_to_re, &pair); + } + + if (re != NULL) + { + ret = g_strdup (re->dbus_error_name); + } + else + { + if (g_str_has_prefix (error->message, "GDBus.Error:")) + { + const gchar *begin; + const gchar *end; + begin = error->message + sizeof ("GDBus.Error:") -1; + end = strstr (begin, ":"); + if (end != NULL && end[1] == ' ') + { + ret = g_strndup (begin, end - begin); + } + } + } + + G_UNLOCK (error_lock); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_error_new_for_dbus_error: + * @dbus_error_name: D-Bus error name. + * @dbus_error_message: D-Bus error message. + * + * Creates a #GError based on the contents of @dbus_error_name and + * @dbus_error_message. + * + * Errors registered with g_dbus_error_register_error() will be looked + * up using @dbus_error_name and if a match is found, the error domain + * and code is used. Applications can use g_dbus_error_get_remote_error() + * to recover @dbus_error_name. + * + * If a match against a registered error is not found and the D-Bus + * error name is in a form as returned by g_dbus_error_encode_gerror() + * the error domain and code encoded in the name is used to + * create the #GError. Also, @dbus_error_name is added to the error message + * such that it can be recovered with g_dbus_error_get_remote_error(). + * + * Otherwise, a #GError with the error code %G_IO_ERROR_DBUS_ERROR + * in the #G_IO_ERROR error domain is returned. Also, @dbus_error_name is + * added to the error message such that it can be recovered with + * g_dbus_error_get_remote_error(). + * + * In all three cases, @dbus_error_name can always be recovered from the + * returned #GError using the g_dbus_error_get_remote_error() function + * (unless g_dbus_error_strip_remote_error() hasn't been used on the returned error). + * + * This function is typically only used in object mappings to prepare + * #GError instances for applications. Regular applications should not use + * it. + * + * Returns: An allocated #GError. Free with g_error_free(). + * + * Since: 2.26 + */ +GError * +g_dbus_error_new_for_dbus_error (const gchar *dbus_error_name, + const gchar *dbus_error_message) +{ + GError *error; + RegisteredError *re; + + g_return_val_if_fail (dbus_error_name != NULL, NULL); + g_return_val_if_fail (dbus_error_message != NULL, NULL); + + /* Ensure that e.g. G_DBUS_ERROR is registered using g_dbus_error_register_error() */ + _g_dbus_initialize (); + + G_LOCK (error_lock); + + re = NULL; + if (dbus_error_name_to_re != NULL) + { + g_assert (quark_code_pair_to_re != NULL); /* check invariant */ + re = g_hash_table_lookup (dbus_error_name_to_re, dbus_error_name); + } + + if (re != NULL) + { + error = g_error_new (re->pair.error_domain, + re->pair.error_code, + "GDBus.Error:%s: %s", + dbus_error_name, + dbus_error_message); + } + else + { + GQuark error_domain = 0; + gint error_code = 0; + + if (_g_dbus_error_decode_gerror (dbus_error_name, + &error_domain, + &error_code)) + { + error = g_error_new (error_domain, + error_code, + "GDBus.Error:%s: %s", + dbus_error_name, + dbus_error_message); + } + else + { + error = g_error_new (G_IO_ERROR, + G_IO_ERROR_DBUS_ERROR, + "GDBus.Error:%s: %s", + dbus_error_name, + dbus_error_message); + } + } + + G_UNLOCK (error_lock); + return error; +} + +/** + * g_dbus_error_set_dbus_error: + * @error: A pointer to a #GError or %NULL. + * @dbus_error_name: D-Bus error name. + * @dbus_error_message: D-Bus error message. + * @format: (allow-none): printf()-style format to prepend to @dbus_error_message or %NULL. + * @...: Arguments for @format. + * + * Does nothing if @error is %NULL. Otherwise sets *@error to + * a new #GError created with g_dbus_error_new_for_dbus_error() + * with @dbus_error_message prepend with @format (unless %NULL). + * + * Since: 2.26 + */ +void +g_dbus_error_set_dbus_error (GError **error, + const gchar *dbus_error_name, + const gchar *dbus_error_message, + const gchar *format, + ...) +{ + g_return_if_fail (error == NULL || *error == NULL); + g_return_if_fail (dbus_error_name != NULL); + g_return_if_fail (dbus_error_message != NULL); + + if (error == NULL) + return; + + if (format == NULL) + { + *error = g_dbus_error_new_for_dbus_error (dbus_error_name, dbus_error_message); + } + else + { + va_list var_args; + va_start (var_args, format); + g_dbus_error_set_dbus_error_valist (error, + dbus_error_name, + dbus_error_message, + format, + var_args); + va_end (var_args); + } +} + +/** + * g_dbus_error_set_dbus_error_valist: + * @error: A pointer to a #GError or %NULL. + * @dbus_error_name: D-Bus error name. + * @dbus_error_message: D-Bus error message. + * @format: (allow-none): printf()-style format to prepend to @dbus_error_message or %NULL. + * @var_args: Arguments for @format. + * + * Like g_dbus_error_set_dbus_error() but intended for language bindings. + * + * Since: 2.26 + */ +void +g_dbus_error_set_dbus_error_valist (GError **error, + const gchar *dbus_error_name, + const gchar *dbus_error_message, + const gchar *format, + va_list var_args) +{ + g_return_if_fail (error == NULL || *error == NULL); + g_return_if_fail (dbus_error_name != NULL); + g_return_if_fail (dbus_error_message != NULL); + + if (error == NULL) + return; + + if (format != NULL) + { + gchar *message; + gchar *s; + message = g_strdup_vprintf (format, var_args); + s = g_strdup_printf ("%s: %s", message, dbus_error_message); + *error = g_dbus_error_new_for_dbus_error (dbus_error_name, s); + g_free (s); + g_free (message); + } + else + { + *error = g_dbus_error_new_for_dbus_error (dbus_error_name, dbus_error_message); + } +} + +/** + * g_dbus_error_strip_remote_error: + * @error: A #GError. + * + * Looks for extra information in the error message used to recover + * the D-Bus error name and strips it if found. If stripped, the + * message field in @error will correspond exactly to what was + * received on the wire. + * + * This is typically used when presenting errors to the end user. + * + * Returns: %TRUE if information was stripped, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_error_strip_remote_error (GError *error) +{ + gboolean ret; + + g_return_val_if_fail (error != NULL, FALSE); + + ret = FALSE; + + if (g_str_has_prefix (error->message, "GDBus.Error:")) + { + const gchar *begin; + const gchar *end; + gchar *new_message; + + begin = error->message + sizeof ("GDBus.Error:") -1; + end = strstr (begin, ":"); + if (end != NULL && end[1] == ' ') + { + new_message = g_strdup (end + 2); + g_free (error->message); + error->message = new_message; + ret = TRUE; + } + } + + return ret; +} + +/** + * g_dbus_error_encode_gerror: + * @error: A #GError. + * + * Creates a D-Bus error name to use for @error. If @error matches + * a registered error (cf. g_dbus_error_register_error()), the corresponding + * D-Bus error name will be returned. + * + * Otherwise the a name of the form + * org.gtk.GDBus.UnmappedGError.Quark._ESCAPED_QUARK_NAME.Code_ERROR_CODE + * will be used. This allows other GDBus applications to map the error + * on the wire back to a #GError using g_dbus_error_new_for_dbus_error(). + * + * This function is typically only used in object mappings to put a + * #GError on the wire. Regular applications should not use it. + * + * Returns: A D-Bus error name (never %NULL). Free with g_free(). + * + * Since: 2.26 + */ +gchar * +g_dbus_error_encode_gerror (const GError *error) +{ + RegisteredError *re; + gchar *error_name; + + g_return_val_if_fail (error != NULL, NULL); + + /* Ensure that e.g. G_DBUS_ERROR is registered using g_dbus_error_register_error() */ + _g_dbus_initialize (); + + error_name = NULL; + + G_LOCK (error_lock); + re = NULL; + if (quark_code_pair_to_re != NULL) + { + QuarkCodePair pair; + pair.error_domain = error->domain; + pair.error_code = error->code; + g_assert (dbus_error_name_to_re != NULL); /* check invariant */ + re = g_hash_table_lookup (quark_code_pair_to_re, &pair); + } + if (re != NULL) + { + error_name = g_strdup (re->dbus_error_name); + G_UNLOCK (error_lock); + } + else + { + const gchar *domain_as_string; + GString *s; + guint n; + + G_UNLOCK (error_lock); + + /* We can't make a lot of assumptions about what domain_as_string + * looks like and D-Bus is extremely picky about error names so + * hex-encode it for transport across the wire. + */ + domain_as_string = g_quark_to_string (error->domain); + + /* 0 is not a domain; neither are non-quark integers */ + g_return_val_if_fail (domain_as_string != NULL, NULL); + + s = g_string_new ("org.gtk.GDBus.UnmappedGError.Quark._"); + for (n = 0; domain_as_string[n] != 0; n++) + { + gint c = domain_as_string[n]; + if (g_ascii_isalnum (c)) + { + g_string_append_c (s, c); + } + else + { + guint nibble_top; + guint nibble_bottom; + g_string_append_c (s, '_'); + nibble_top = ((int) domain_as_string[n]) >> 4; + nibble_bottom = ((int) domain_as_string[n]) & 0x0f; + if (nibble_top < 10) + nibble_top += '0'; + else + nibble_top += 'a' - 10; + if (nibble_bottom < 10) + nibble_bottom += '0'; + else + nibble_bottom += 'a' - 10; + g_string_append_c (s, nibble_top); + g_string_append_c (s, nibble_bottom); + } + } + g_string_append_printf (s, ".Code%d", error->code); + error_name = g_string_free (s, FALSE); + } + + return error_name; +} diff --git a/gio/gdbuserror.h b/gio/gdbuserror.h new file mode 100644 index 0000000..cc90a9e --- /dev/null +++ b/gio/gdbuserror.h @@ -0,0 +1,111 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_ERROR_H__ +#define __G_DBUS_ERROR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_DBUS_ERROR: + * + * Error domain for errors generated by a remote message bus. Errors + * in this domain will be from the #GDBusError enumeration. See + * #GError for more information on error domains. + * + * Note that errors in this error domain is intended only for + * returning errors from a remote message bus process. Errors + * generated locally in-process by e.g. #GDBusConnection is from the + * %G_IO_ERROR domain. + * + * Since: 2.26 + */ +#define G_DBUS_ERROR g_dbus_error_quark() + +GLIB_AVAILABLE_IN_ALL +GQuark g_dbus_error_quark (void); + +/* Used by applications to check, get and strip the D-Bus error name */ +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_error_is_remote_error (const GError *error); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_error_get_remote_error (const GError *error); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_error_strip_remote_error (GError *error); + +/** + * GDBusErrorEntry: + * @error_code: An error code. + * @dbus_error_name: The D-Bus error name to associate with @error_code. + * + * Struct used in g_dbus_error_register_error_domain(). + * + * Since: 2.26 + */ +struct _GDBusErrorEntry +{ + gint error_code; + const gchar *dbus_error_name; +}; + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_error_register_error (GQuark error_domain, + gint error_code, + const gchar *dbus_error_name); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_error_unregister_error (GQuark error_domain, + gint error_code, + const gchar *dbus_error_name); +GLIB_AVAILABLE_IN_ALL +void g_dbus_error_register_error_domain (const gchar *error_domain_quark_name, + volatile gsize *quark_volatile, + const GDBusErrorEntry *entries, + guint num_entries); + +/* Only used by object mappings to map back and forth to GError */ +GLIB_AVAILABLE_IN_ALL +GError *g_dbus_error_new_for_dbus_error (const gchar *dbus_error_name, + const gchar *dbus_error_message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_error_set_dbus_error (GError **error, + const gchar *dbus_error_name, + const gchar *dbus_error_message, + const gchar *format, + ...) G_GNUC_PRINTF(4, 5); +GLIB_AVAILABLE_IN_ALL +void g_dbus_error_set_dbus_error_valist (GError **error, + const gchar *dbus_error_name, + const gchar *dbus_error_message, + const gchar *format, + va_list var_args) G_GNUC_PRINTF(4, 0); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_error_encode_gerror (const GError *error); + +G_END_DECLS + +#endif /* __G_DBUS_ERROR_H__ */ diff --git a/gio/gdbusinterface.c b/gio/gdbusinterface.c new file mode 100644 index 0000000..14f1326 --- /dev/null +++ b/gio/gdbusinterface.c @@ -0,0 +1,142 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobject.h" +#include "gdbusinterface.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusinterface + * @short_description: Base type for D-Bus interfaces + * @include: gio/gio.h + * + * The #GDBusInterface type is the base type for D-Bus interfaces both + * on the service side (see #GDBusInterfaceSkeleton) and client side + * (see #GDBusProxy). + */ + +typedef GDBusInterfaceIface GDBusInterfaceInterface; +G_DEFINE_INTERFACE (GDBusInterface, g_dbus_interface, G_TYPE_OBJECT) + +static void +g_dbus_interface_default_init (GDBusInterfaceIface *iface) +{ +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_get_info: + * @interface_: An exported D-Bus interface. + * + * Gets D-Bus introspection information for the D-Bus interface + * implemented by @interface_. + * + * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free. + * + * Since: 2.30 + */ +GDBusInterfaceInfo * +g_dbus_interface_get_info (GDBusInterface *interface_) +{ + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_info (interface_); +} + +/** + * g_dbus_interface_get_object: (skip) + * @interface_: An exported D-Bus interface. + * + * Gets the #GDBusObject that @interface_ belongs to, if any. + * + * It is not safe to use the returned object if @interface_ + * or the returned object is being used from other threads. See + * g_dbus_interface_dup_object() for a thread-safe + * alternative. + * + * Returns: (transfer none): A #GDBusObject or %NULL. The returned + * reference belongs to @interface_ and should not be freed. + * + * Since: 2.30 + */ +GDBusObject * +g_dbus_interface_get_object (GDBusInterface *interface_) +{ + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + return G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); +} + +/** + * g_dbus_interface_dup_object: + * @interface_: An exported D-Bus interface. + * + * Gets the #GDBusObject that @interface_ belongs to, if any. + * + * Returns: (transfer full): A #GDBusObject or %NULL. The returned + * reference should be freed with g_object_unref(). + * + * Since: 2.32 + * + * Rename to: g_dbus_interface_get_object + */ +GDBusObject * +g_dbus_interface_dup_object (GDBusInterface *interface_) +{ + GDBusObject *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE (interface_), NULL); + if (G_LIKELY (G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object != NULL)) + { + ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->dup_object (interface_); + } + else + { + g_warning ("No dup_object() vfunc on type %s - using get_object() in a way that is not thread-safe.", + g_type_name_from_instance ((GTypeInstance *) interface_)); + ret = G_DBUS_INTERFACE_GET_IFACE (interface_)->get_object (interface_); + if (ret != NULL) + g_object_ref (ret); + } + return ret; +} + +/** + * g_dbus_interface_set_object: + * @interface_: An exported D-Bus interface. + * @object: (allow-none): A #GDBusObject or %NULL. + * + * Sets the #GDBusObject for @interface_ to @object. + * + * Note that @interface_ will hold a weak reference to @object. + * + * Since: 2.30 + */ +void +g_dbus_interface_set_object (GDBusInterface *interface_, + GDBusObject *object) +{ + g_return_if_fail (G_IS_DBUS_INTERFACE (interface_)); + g_return_if_fail (object == NULL || G_IS_DBUS_OBJECT (object)); + G_DBUS_INTERFACE_GET_IFACE (interface_)->set_object (interface_, object); +} diff --git a/gio/gdbusinterface.h b/gio/gdbusinterface.h new file mode 100644 index 0000000..a82a757 --- /dev/null +++ b/gio/gdbusinterface.h @@ -0,0 +1,83 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_INTERFACE_H__ +#define __G_DBUS_INTERFACE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_INTERFACE (g_dbus_interface_get_type()) +#define G_DBUS_INTERFACE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_INTERFACE, GDBusInterface)) +#define G_IS_DBUS_INTERFACE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_INTERFACE)) +#define G_DBUS_INTERFACE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), G_TYPE_DBUS_INTERFACE, GDBusInterfaceIface)) + +/** + * GDBusInterface: + * + * Base type for D-Bus interfaces. + * + * Since: 2.30 + */ + +typedef struct _GDBusInterfaceIface GDBusInterfaceIface; + +/** + * GDBusInterfaceIface: + * @parent_iface: The parent interface. + * @get_info: Returns a #GDBusInterfaceInfo. See g_dbus_interface_get_info(). + * @get_object: Gets the enclosing #GDBusObject. See g_dbus_interface_get_object(). + * @set_object: Sets the enclosing #GDBusObject. See g_dbus_interface_set_object(). + * @dup_object: Gets a reference to the enclosing #GDBusObject. See g_dbus_interface_dup_object(). Added in 2.32. + * + * Base type for D-Bus interfaces. + * + * Since: 2.30 + */ +struct _GDBusInterfaceIface +{ + GTypeInterface parent_iface; + + /* Virtual Functions */ + GDBusInterfaceInfo *(*get_info) (GDBusInterface *interface_); + GDBusObject *(*get_object) (GDBusInterface *interface_); + void (*set_object) (GDBusInterface *interface_, + GDBusObject *object); + GDBusObject *(*dup_object) (GDBusInterface *interface_); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_interface_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceInfo *g_dbus_interface_get_info (GDBusInterface *interface_); +GLIB_AVAILABLE_IN_ALL +GDBusObject *g_dbus_interface_get_object (GDBusInterface *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_set_object (GDBusInterface *interface_, + GDBusObject *object); +GLIB_AVAILABLE_IN_2_32 +GDBusObject *g_dbus_interface_dup_object (GDBusInterface *interface_); + +G_END_DECLS + +#endif /* __G_DBUS_INTERFACE_H__ */ diff --git a/gio/gdbusinterfaceskeleton.c b/gio/gdbusinterfaceskeleton.c new file mode 100644 index 0000000..5eb63d9 --- /dev/null +++ b/gio/gdbusinterfaceskeleton.c @@ -0,0 +1,1009 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusinterface.h" +#include "gdbusinterfaceskeleton.h" +#include "gdbusobjectskeleton.h" +#include "gioenumtypes.h" +#include "gdbusprivate.h" +#include "gdbusmethodinvocation.h" +#include "gdbusconnection.h" +#include "gtask.h" +#include "gioerror.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusinterfaceskeleton + * @short_description: Service-side D-Bus interface + * @include: gio/gio.h + * + * Abstract base class for D-Bus interfaces on the service side. + */ + +struct _GDBusInterfaceSkeletonPrivate +{ + GMutex lock; + + GDBusObject *object; + GDBusInterfaceSkeletonFlags flags; + + GSList *connections; /* List of ConnectionData */ + gchar *object_path; /* The object path for this skeleton */ + GDBusInterfaceVTable *hooked_vtable; +}; + +typedef struct +{ + GDBusConnection *connection; + guint registration_id; +} ConnectionData; + +enum +{ + G_AUTHORIZE_METHOD_SIGNAL, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_G_FLAGS +}; + +static guint signals[LAST_SIGNAL] = {0}; + +static void dbus_interface_interface_init (GDBusInterfaceIface *iface); + +static void set_object_path_locked (GDBusInterfaceSkeleton *interface_, + const gchar *object_path); +static void remove_connection_locked (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection); +static void skeleton_intercept_handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data); + + +G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GDBusInterfaceSkeleton, g_dbus_interface_skeleton, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_INTERFACE, dbus_interface_interface_init)); + +static void +g_dbus_interface_skeleton_finalize (GObject *object) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (object); + + /* Hold the lock just incase any code we call verifies that the lock is held */ + g_mutex_lock (&interface->priv->lock); + + /* unexport from all connections if we're exported anywhere */ + while (interface->priv->connections != NULL) + { + ConnectionData *data = interface->priv->connections->data; + remove_connection_locked (interface, data->connection); + } + + set_object_path_locked (interface, NULL); + + g_mutex_unlock (&interface->priv->lock); + + g_free (interface->priv->hooked_vtable); + + if (interface->priv->object != NULL) + g_object_remove_weak_pointer (G_OBJECT (interface->priv->object), (gpointer *) &interface->priv->object); + + g_mutex_clear (&interface->priv->lock); + + G_OBJECT_CLASS (g_dbus_interface_skeleton_parent_class)->finalize (object); +} + +static void +g_dbus_interface_skeleton_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (object); + + switch (prop_id) + { + case PROP_G_FLAGS: + g_value_set_flags (value, g_dbus_interface_skeleton_get_flags (interface)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_interface_skeleton_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (object); + + switch (prop_id) + { + case PROP_G_FLAGS: + g_dbus_interface_skeleton_set_flags (interface, g_value_get_flags (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +g_dbus_interface_skeleton_g_authorize_method_default (GDBusInterfaceSkeleton *interface, + GDBusMethodInvocation *invocation) +{ + return TRUE; +} + +static void +g_dbus_interface_skeleton_class_init (GDBusInterfaceSkeletonClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = g_dbus_interface_skeleton_finalize; + gobject_class->set_property = g_dbus_interface_skeleton_set_property; + gobject_class->get_property = g_dbus_interface_skeleton_get_property; + + klass->g_authorize_method = g_dbus_interface_skeleton_g_authorize_method_default; + + /** + * GDBusInterfaceSkeleton:g-flags: + * + * Flags from the #GDBusInterfaceSkeletonFlags enumeration. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_G_FLAGS, + g_param_spec_flags ("g-flags", + "g-flags", + "Flags for the interface skeleton", + G_TYPE_DBUS_INTERFACE_SKELETON_FLAGS, + G_DBUS_INTERFACE_SKELETON_FLAGS_NONE, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusInterfaceSkeleton::g-authorize-method: + * @interface: The #GDBusInterfaceSkeleton emitting the signal. + * @invocation: A #GDBusMethodInvocation. + * + * Emitted when a method is invoked by a remote caller and used to + * determine if the method call is authorized. + * + * Note that this signal is emitted in a thread dedicated to + * handling the method call so handlers are allowed to perform + * blocking IO. This means that it is appropriate to call + * e.g. polkit_authority_check_authorization_sync() + * with the POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION flag set. + * + * If %FALSE is returned then no further handlers are run and the + * signal handler must take a reference to @invocation and finish + * handling the call (e.g. return an error via + * g_dbus_method_invocation_return_error()). + * + * Otherwise, if %TRUE is returned, signal emission continues. If no + * handlers return %FALSE, then the method is dispatched. If + * @interface has an enclosing #GDBusObjectSkeleton, then the + * #GDBusObjectSkeleton::authorize-method signal handlers run before + * the handlers for this signal. + * + * The default class handler just returns %TRUE. + * + * Please note that the common case is optimized: if no signals + * handlers are connected and the default class handler isn't + * overridden (for both @interface and the enclosing + * #GDBusObjectSkeleton, if any) and #GDBusInterfaceSkeleton:g-flags does + * not have the + * %G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD + * flags set, no dedicated thread is ever used and the call will be + * handled in the same thread as the object that @interface belongs + * to was exported in. + * + * Returns: %TRUE if the call is authorized, %FALSE otherwise. + * + * Since: 2.30 + */ + signals[G_AUTHORIZE_METHOD_SIGNAL] = + g_signal_new ("g-authorize-method", + G_TYPE_DBUS_INTERFACE_SKELETON, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusInterfaceSkeletonClass, g_authorize_method), + _g_signal_accumulator_false_handled, + NULL, + NULL, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_METHOD_INVOCATION); + + g_type_class_add_private (klass, sizeof (GDBusInterfaceSkeletonPrivate)); +} + +static void +g_dbus_interface_skeleton_init (GDBusInterfaceSkeleton *interface) +{ + interface->priv = G_TYPE_INSTANCE_GET_PRIVATE (interface, G_TYPE_DBUS_INTERFACE_SKELETON, GDBusInterfaceSkeletonPrivate); + g_mutex_init (&interface->priv->lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_skeleton_get_flags: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets the #GDBusInterfaceSkeletonFlags that describes what the behavior + * of @interface_ + * + * Returns: One or more flags from the #GDBusInterfaceSkeletonFlags enumeration. + * + * Since: 2.30 + */ +GDBusInterfaceSkeletonFlags +g_dbus_interface_skeleton_get_flags (GDBusInterfaceSkeleton *interface_) +{ + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), G_DBUS_INTERFACE_SKELETON_FLAGS_NONE); + return interface_->priv->flags; +} + +/** + * g_dbus_interface_skeleton_set_flags: + * @interface_: A #GDBusInterfaceSkeleton. + * @flags: Flags from the #GDBusInterfaceSkeletonFlags enumeration. + * + * Sets flags describing what the behavior of @skeleton should be. + * + * Since: 2.30 + */ +void +g_dbus_interface_skeleton_set_flags (GDBusInterfaceSkeleton *interface_, + GDBusInterfaceSkeletonFlags flags) +{ + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); + g_mutex_lock (&interface_->priv->lock); + if (interface_->priv->flags != flags) + { + interface_->priv->flags = flags; + g_mutex_unlock (&interface_->priv->lock); + g_object_notify (G_OBJECT (interface_), "g-flags"); + } + else + { + g_mutex_unlock (&interface_->priv->lock); + } +} + +/** + * g_dbus_interface_skeleton_get_info: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets D-Bus introspection information for the D-Bus interface + * implemented by @interface_. + * + * Returns: (transfer none): A #GDBusInterfaceInfo (never %NULL). Do not free. + * + * Since: 2.30 + */ +GDBusInterfaceInfo * +g_dbus_interface_skeleton_get_info (GDBusInterfaceSkeleton *interface_) +{ + GDBusInterfaceInfo *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + ret = G_DBUS_INTERFACE_SKELETON_GET_CLASS (interface_)->get_info (interface_); + g_warn_if_fail (ret != NULL); + return ret; +} + +/** + * g_dbus_interface_skeleton_get_vtable: (skip) + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets the interface vtable for the D-Bus interface implemented by + * @interface_. The returned function pointers should expect @interface_ + * itself to be passed as @user_data. + * + * Returns: A #GDBusInterfaceVTable (never %NULL). + * + * Since: 2.30 + */ +GDBusInterfaceVTable * +g_dbus_interface_skeleton_get_vtable (GDBusInterfaceSkeleton *interface_) +{ + GDBusInterfaceVTable *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + ret = G_DBUS_INTERFACE_SKELETON_GET_CLASS (interface_)->get_vtable (interface_); + g_warn_if_fail (ret != NULL); + return ret; +} + +/** + * g_dbus_interface_skeleton_get_properties: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets all D-Bus properties for @interface_. + * + * Returns: (transfer full): A #GVariant of type 'a{sv}'. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_interface_skeleton_get_properties (GDBusInterfaceSkeleton *interface_) +{ + GVariant *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + ret = G_DBUS_INTERFACE_SKELETON_GET_CLASS (interface_)->get_properties (interface_); + return g_variant_take_ref (ret); +} + +/** + * g_dbus_interface_skeleton_flush: + * @interface_: A #GDBusInterfaceSkeleton. + * + * If @interface_ has outstanding changes, request for these changes to be + * emitted immediately. + * + * For example, an exported D-Bus interface may queue up property + * changes and emit the + * org.freedesktop.DBus.Properties::PropertiesChanged + * signal later (e.g. in an idle handler). This technique is useful + * for collapsing multiple property changes into one. + * + * Since: 2.30 + */ +void +g_dbus_interface_skeleton_flush (GDBusInterfaceSkeleton *interface_) +{ + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); + G_DBUS_INTERFACE_SKELETON_GET_CLASS (interface_)->flush (interface_); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusInterfaceInfo * +_g_dbus_interface_skeleton_get_info (GDBusInterface *interface_) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (interface_); + return g_dbus_interface_skeleton_get_info (interface); +} + +static GDBusObject * +g_dbus_interface_skeleton_get_object (GDBusInterface *interface_) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (interface_); + GDBusObject *ret; + g_mutex_lock (&interface->priv->lock); + ret = interface->priv->object; + g_mutex_unlock (&interface->priv->lock); + return ret; +} + +static GDBusObject * +g_dbus_interface_skeleton_dup_object (GDBusInterface *interface_) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (interface_); + GDBusObject *ret; + g_mutex_lock (&interface->priv->lock); + ret = interface->priv->object; + if (ret != NULL) + g_object_ref (ret); + g_mutex_unlock (&interface->priv->lock); + return ret; +} + +static void +g_dbus_interface_skeleton_set_object (GDBusInterface *interface_, + GDBusObject *object) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (interface_); + g_mutex_lock (&interface->priv->lock); + if (interface->priv->object != NULL) + g_object_remove_weak_pointer (G_OBJECT (interface->priv->object), (gpointer *) &interface->priv->object); + interface->priv->object = object; + if (object != NULL) + g_object_add_weak_pointer (G_OBJECT (interface->priv->object), (gpointer *) &interface->priv->object); + g_mutex_unlock (&interface->priv->lock); +} + +static void +dbus_interface_interface_init (GDBusInterfaceIface *iface) +{ + iface->get_info = _g_dbus_interface_skeleton_get_info; + iface->get_object = g_dbus_interface_skeleton_get_object; + iface->dup_object = g_dbus_interface_skeleton_dup_object; + iface->set_object = g_dbus_interface_skeleton_set_object; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + volatile gint ref_count; + GDBusInterfaceSkeleton *interface; + GDBusInterfaceMethodCallFunc method_call_func; + GDBusMethodInvocation *invocation; +} DispatchData; + +static void +dispatch_data_unref (DispatchData *data) +{ + if (g_atomic_int_dec_and_test (&data->ref_count)) + g_slice_free (DispatchData, data); +} + +static DispatchData * +dispatch_data_ref (DispatchData *data) +{ + g_atomic_int_inc (&data->ref_count); + return data; +} + +static gboolean +dispatch_invoke_in_context_func (gpointer user_data) +{ + DispatchData *data = user_data; + data->method_call_func (g_dbus_method_invocation_get_connection (data->invocation), + g_dbus_method_invocation_get_sender (data->invocation), + g_dbus_method_invocation_get_object_path (data->invocation), + g_dbus_method_invocation_get_interface_name (data->invocation), + g_dbus_method_invocation_get_method_name (data->invocation), + g_dbus_method_invocation_get_parameters (data->invocation), + data->invocation, + g_dbus_method_invocation_get_user_data (data->invocation)); + return FALSE; +} + +static void +dispatch_in_thread_func (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + DispatchData *data = task_data; + GDBusInterfaceSkeletonFlags flags; + GDBusObject *object; + gboolean authorized; + + g_mutex_lock (&data->interface->priv->lock); + flags = data->interface->priv->flags; + object = data->interface->priv->object; + if (object != NULL) + g_object_ref (object); + g_mutex_unlock (&data->interface->priv->lock); + + /* first check on the enclosing object (if any), then the interface */ + authorized = TRUE; + if (object != NULL) + { + g_signal_emit_by_name (object, + "authorize-method", + data->interface, + data->invocation, + &authorized); + } + if (authorized) + { + g_signal_emit (data->interface, + signals[G_AUTHORIZE_METHOD_SIGNAL], + 0, + data->invocation, + &authorized); + } + + if (authorized) + { + gboolean run_in_thread; + run_in_thread = (flags & G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD); + if (run_in_thread) + { + /* might as well just re-use the existing thread */ + data->method_call_func (g_dbus_method_invocation_get_connection (data->invocation), + g_dbus_method_invocation_get_sender (data->invocation), + g_dbus_method_invocation_get_object_path (data->invocation), + g_dbus_method_invocation_get_interface_name (data->invocation), + g_dbus_method_invocation_get_method_name (data->invocation), + g_dbus_method_invocation_get_parameters (data->invocation), + data->invocation, + g_dbus_method_invocation_get_user_data (data->invocation)); + } + else + { + /* bah, back to original context */ + g_main_context_invoke_full (g_task_get_context (task), + g_task_get_priority (task), + dispatch_invoke_in_context_func, + dispatch_data_ref (data), + (GDestroyNotify) dispatch_data_unref); + } + } + else + { + /* do nothing */ + } + + if (object != NULL) + g_object_unref (object); +} + +static void +g_dbus_interface_method_dispatch_helper (GDBusInterfaceSkeleton *interface, + GDBusInterfaceMethodCallFunc method_call_func, + GDBusMethodInvocation *invocation) +{ + gboolean has_handlers; + gboolean has_default_class_handler; + gboolean emit_authorized_signal; + gboolean run_in_thread; + GDBusInterfaceSkeletonFlags flags; + GDBusObject *object; + + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface)); + g_return_if_fail (method_call_func != NULL); + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + + g_mutex_lock (&interface->priv->lock); + flags = interface->priv->flags; + object = interface->priv->object; + if (object != NULL) + g_object_ref (object); + g_mutex_unlock (&interface->priv->lock); + + /* optimization for the common case where + * + * a) no handler is connected and class handler is not overridden (both interface and object); and + * b) method calls are not dispatched in a thread + */ + has_handlers = g_signal_has_handler_pending (interface, + signals[G_AUTHORIZE_METHOD_SIGNAL], + 0, + TRUE); + has_default_class_handler = (G_DBUS_INTERFACE_SKELETON_GET_CLASS (interface)->g_authorize_method == + g_dbus_interface_skeleton_g_authorize_method_default); + + emit_authorized_signal = (has_handlers || !has_default_class_handler); + if (!emit_authorized_signal) + { + if (object != NULL) + emit_authorized_signal = _g_dbus_object_skeleton_has_authorize_method_handlers (G_DBUS_OBJECT_SKELETON (object)); + } + + run_in_thread = (flags & G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD); + if (!emit_authorized_signal && !run_in_thread) + { + method_call_func (g_dbus_method_invocation_get_connection (invocation), + g_dbus_method_invocation_get_sender (invocation), + g_dbus_method_invocation_get_object_path (invocation), + g_dbus_method_invocation_get_interface_name (invocation), + g_dbus_method_invocation_get_method_name (invocation), + g_dbus_method_invocation_get_parameters (invocation), + invocation, + g_dbus_method_invocation_get_user_data (invocation)); + } + else + { + GTask *task; + DispatchData *data; + + data = g_slice_new0 (DispatchData); + data->interface = interface; + data->method_call_func = method_call_func; + data->invocation = invocation; + data->ref_count = 1; + + task = g_task_new (interface, NULL, NULL, NULL); + g_task_set_task_data (task, data, (GDestroyNotify) dispatch_data_unref); + g_task_run_in_thread (task, dispatch_in_thread_func); + g_object_unref (task); + } + + if (object != NULL) + g_object_unref (object); +} + +static void +skeleton_intercept_handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GDBusInterfaceSkeleton *interface = G_DBUS_INTERFACE_SKELETON (user_data); + g_dbus_interface_method_dispatch_helper (interface, + g_dbus_interface_skeleton_get_vtable (interface)->method_call, + invocation); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static ConnectionData * +new_connection (GDBusConnection *connection, + guint registration_id) +{ + ConnectionData *data; + + data = g_slice_new0 (ConnectionData); + data->connection = g_object_ref (connection); + data->registration_id = registration_id; + + return data; +} + +static void +free_connection (ConnectionData *data) +{ + if (data != NULL) + { + g_object_unref (data->connection); + g_slice_free (ConnectionData, data); + } +} + +static gboolean +add_connection_locked (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection, + GError **error) +{ + ConnectionData *data; + guint registration_id; + gboolean ret = FALSE; + + if (interface_->priv->hooked_vtable == NULL) + { + /* Hook the vtable since we need to intercept method calls for + * ::g-authorize-method and for dispatching in thread vs + * context + * + * We need to wait until subclasses have had time to initialize + * properly before building the hooked_vtable, so we create it + * once at the last minute. + */ + interface_->priv->hooked_vtable = g_memdup (g_dbus_interface_skeleton_get_vtable (interface_), sizeof (GDBusInterfaceVTable)); + interface_->priv->hooked_vtable->method_call = skeleton_intercept_handle_method_call; + } + + registration_id = g_dbus_connection_register_object (connection, + interface_->priv->object_path, + g_dbus_interface_skeleton_get_info (interface_), + interface_->priv->hooked_vtable, + interface_, + NULL, /* user_data_free_func */ + error); + + if (registration_id > 0) + { + data = new_connection (connection, registration_id); + interface_->priv->connections = g_slist_append (interface_->priv->connections, data); + ret = TRUE; + } + + return ret; +} + +static void +remove_connection_locked (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection) +{ + ConnectionData *data; + GSList *l; + + /* Get the connection in the list and unregister ... */ + for (l = interface_->priv->connections; l != NULL; l = l->next) + { + data = l->data; + if (data->connection == connection) + { + g_warn_if_fail (g_dbus_connection_unregister_object (data->connection, data->registration_id)); + free_connection (data); + interface_->priv->connections = g_slist_delete_link (interface_->priv->connections, l); + /* we are guaranteed that the connection is only added once, so bail out early */ + goto out; + } + } + out: + ; +} + +static void +set_object_path_locked (GDBusInterfaceSkeleton *interface_, + const gchar *object_path) +{ + if (g_strcmp0 (interface_->priv->object_path, object_path) != 0) + { + g_free (interface_->priv->object_path); + interface_->priv->object_path = g_strdup (object_path); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_skeleton_get_connection: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets the first connection that @interface_ is exported on, if any. + * + * Returns: (transfer none): A #GDBusConnection or %NULL if @interface_ is + * not exported anywhere. Do not free, the object belongs to @interface_. + * + * Since: 2.30 + */ +GDBusConnection * +g_dbus_interface_skeleton_get_connection (GDBusInterfaceSkeleton *interface_) +{ + ConnectionData *data; + GDBusConnection *ret; + + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + g_mutex_lock (&interface_->priv->lock); + + ret = NULL; + if (interface_->priv->connections != NULL) + { + data = interface_->priv->connections->data; + if (data != NULL) + ret = data->connection; + } + + g_mutex_unlock (&interface_->priv->lock); + + return ret; +} + +/** + * g_dbus_interface_skeleton_get_connections: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets a list of the connections that @interface_ is exported on. + * + * Returns: (element-type GDBusConnection) (transfer full): A list of + * all the connections that @interface_ is exported on. The returned + * list should be freed with g_list_free() after each element has + * been freed with g_object_unref(). + * + * Since: 2.32 + */ +GList * +g_dbus_interface_skeleton_get_connections (GDBusInterfaceSkeleton *interface_) +{ + GList *connections; + GSList *l; + ConnectionData *data; + + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + + g_mutex_lock (&interface_->priv->lock); + connections = NULL; + + for (l = interface_->priv->connections; l != NULL; l = l->next) + { + data = l->data; + connections = g_list_prepend (connections, + /* Return a reference to each connection */ + g_object_ref (data->connection)); + } + + g_mutex_unlock (&interface_->priv->lock); + + return g_list_reverse (connections); +} + +/** + * g_dbus_interface_skeleton_has_connection: + * @interface_: A #GDBusInterfaceSkeleton. + * @connection: A #GDBusConnection. + * + * Checks if @interface_ is exported on @connection. + * + * Returns: %TRUE if @interface_ is exported on @connection, %FALSE otherwise. + * + * Since: 2.32 + */ +gboolean +g_dbus_interface_skeleton_has_connection (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection) +{ + GSList *l; + gboolean ret = FALSE; + + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), FALSE); + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + + g_mutex_lock (&interface_->priv->lock); + + for (l = interface_->priv->connections; l != NULL; l = l->next) + { + ConnectionData *data = l->data; + if (data->connection == connection) + { + ret = TRUE; + goto out; + } + } + + out: + g_mutex_unlock (&interface_->priv->lock); + return ret; +} + +/** + * g_dbus_interface_skeleton_get_object_path: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Gets the object path that @interface_ is exported on, if any. + * + * Returns: A string owned by @interface_ or %NULL if @interface_ is not exported + * anywhere. Do not free, the string belongs to @interface_. + * + * Since: 2.30 + */ +const gchar * +g_dbus_interface_skeleton_get_object_path (GDBusInterfaceSkeleton *interface_) +{ + const gchar *ret; + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), NULL); + g_mutex_lock (&interface_->priv->lock); + ret = interface_->priv->object_path; + g_mutex_unlock (&interface_->priv->lock); + return ret; +} + +/** + * g_dbus_interface_skeleton_export: + * @interface_: The D-Bus interface to export. + * @connection: A #GDBusConnection to export @interface_ on. + * @object_path: The path to export the interface at. + * @error: Return location for error or %NULL. + * + * Exports @interface_ at @object_path on @connection. + * + * This can be called multiple times to export the same @interface_ + * onto multiple connections however the @object_path provided must be + * the same for all connections. + * + * Use g_dbus_interface_skeleton_unexport() to unexport the object. + * + * Returns: %TRUE if the interface was exported on @connection, otherwise %FALSE with + * @error set. + * + * Since: 2.30 + */ +gboolean +g_dbus_interface_skeleton_export (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + gboolean ret = FALSE; + + g_return_val_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_), FALSE); + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), FALSE); + g_return_val_if_fail (g_variant_is_object_path (object_path), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + /* Assert that the object path is the same for multiple connections here */ + g_return_val_if_fail (interface_->priv->object_path == NULL || + g_strcmp0 (interface_->priv->object_path, object_path) == 0, FALSE); + + g_mutex_lock (&interface_->priv->lock); + + /* Set the object path */ + set_object_path_locked (interface_, object_path); + + /* Add the connection */ + ret = add_connection_locked (interface_, connection, error); + + g_mutex_unlock (&interface_->priv->lock); + return ret; +} + +/** + * g_dbus_interface_skeleton_unexport: + * @interface_: A #GDBusInterfaceSkeleton. + * + * Stops exporting @interface_ on all connections it is exported on. + * + * To unexport @interface_ from only a single connection, use + * g_dbus_interface_skeleton_unexport_from_connection() + * + * Since: 2.30 + */ +void +g_dbus_interface_skeleton_unexport (GDBusInterfaceSkeleton *interface_) +{ + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); + g_return_if_fail (interface_->priv->connections != NULL); + + g_mutex_lock (&interface_->priv->lock); + + g_assert (interface_->priv->object_path != NULL); + g_assert (interface_->priv->hooked_vtable != NULL); + + /* Remove all connections */ + while (interface_->priv->connections != NULL) + { + ConnectionData *data = interface_->priv->connections->data; + remove_connection_locked (interface_, data->connection); + } + + /* Unset the object path since there are no connections left */ + set_object_path_locked (interface_, NULL); + + g_mutex_unlock (&interface_->priv->lock); +} + + +/** + * g_dbus_interface_skeleton_unexport_from_connection: + * @interface_: A #GDBusInterfaceSkeleton. + * @connection: A #GDBusConnection. + * + * Stops exporting @interface_ on @connection. + * + * To stop exporting on all connections the interface is exported on, + * use g_dbus_interface_skeleton_unexport(). + * + * Since: 2.32 + */ +void +g_dbus_interface_skeleton_unexport_from_connection (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection) +{ + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail (interface_->priv->connections != NULL); + + g_mutex_lock (&interface_->priv->lock); + + g_assert (interface_->priv->object_path != NULL); + g_assert (interface_->priv->hooked_vtable != NULL); + + remove_connection_locked (interface_, connection); + + /* Reset the object path if we removed the last connection */ + if (interface_->priv->connections == NULL) + set_object_path_locked (interface_, NULL); + + g_mutex_unlock (&interface_->priv->lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusinterfaceskeleton.h b/gio/gdbusinterfaceskeleton.h new file mode 100644 index 0000000..ca79c53 --- /dev/null +++ b/gio/gdbusinterfaceskeleton.h @@ -0,0 +1,129 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_INTERFACE_SKELETON_H__ +#define __G_DBUS_INTERFACE_SKELETON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_INTERFACE_SKELETON (g_dbus_interface_skeleton_get_type ()) +#define G_DBUS_INTERFACE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_INTERFACE_SKELETON, GDBusInterfaceSkeleton)) +#define G_DBUS_INTERFACE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_INTERFACE_SKELETON, GDBusInterfaceSkeletonClass)) +#define G_DBUS_INTERFACE_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_INTERFACE_SKELETON, GDBusInterfaceSkeletonClass)) +#define G_IS_DBUS_INTERFACE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_INTERFACE_SKELETON)) +#define G_IS_DBUS_INTERFACE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_INTERFACE_SKELETON)) + +typedef struct _GDBusInterfaceSkeletonClass GDBusInterfaceSkeletonClass; +typedef struct _GDBusInterfaceSkeletonPrivate GDBusInterfaceSkeletonPrivate; + +/** + * GDBusInterfaceSkeleton: + * + * The #GDBusInterfaceSkeleton structure contains private data and should + * only be accessed using the provided API. + * + * Since: 2.30 + */ +struct _GDBusInterfaceSkeleton +{ + /*< private >*/ + GObject parent_instance; + GDBusInterfaceSkeletonPrivate *priv; +}; + +/** + * GDBusInterfaceSkeletonClass: + * @parent_class: The parent class. + * @get_info: Returns a #GDBusInterfaceInfo. See g_dbus_interface_skeleton_get_info() for details. + * @get_vtable: Returns a #GDBusInterfaceVTable. See g_dbus_interface_skeleton_get_vtable() for details. + * @get_properties: Returns a #GVariant with all properties. See g_dbus_interface_skeleton_get_properties(). + * @flush: Emits outstanding changes, if any. See g_dbus_interface_skeleton_flush(). + * @g_authorize_method: Signal class handler for the #GDBusInterfaceSkeleton::g-authorize-method signal. + * + * Class structure for #GDBusInterfaceSkeleton. + * + * Since: 2.30 + */ +struct _GDBusInterfaceSkeletonClass +{ + GObjectClass parent_class; + + /* Virtual Functions */ + GDBusInterfaceInfo *(*get_info) (GDBusInterfaceSkeleton *interface_); + GDBusInterfaceVTable *(*get_vtable) (GDBusInterfaceSkeleton *interface_); + GVariant *(*get_properties) (GDBusInterfaceSkeleton *interface_); + void (*flush) (GDBusInterfaceSkeleton *interface_); + + /*< private >*/ + gpointer vfunc_padding[8]; + /*< public >*/ + + /* Signals */ + gboolean (*g_authorize_method) (GDBusInterfaceSkeleton *interface_, + GDBusMethodInvocation *invocation); + + /*< private >*/ + gpointer signal_padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_interface_skeleton_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceSkeletonFlags g_dbus_interface_skeleton_get_flags (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_skeleton_set_flags (GDBusInterfaceSkeleton *interface_, + GDBusInterfaceSkeletonFlags flags); +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceInfo *g_dbus_interface_skeleton_get_info (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceVTable *g_dbus_interface_skeleton_get_vtable (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_interface_skeleton_get_properties (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_skeleton_flush (GDBusInterfaceSkeleton *interface_); + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_interface_skeleton_export (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection, + const gchar *object_path, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_skeleton_unexport (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_skeleton_unexport_from_connection (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection); + +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_interface_skeleton_get_connection (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +GList *g_dbus_interface_skeleton_get_connections (GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_interface_skeleton_has_connection (GDBusInterfaceSkeleton *interface_, + GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_interface_skeleton_get_object_path (GDBusInterfaceSkeleton *interface_); + +G_END_DECLS + +#endif /* __G_DBUS_INTERFACE_SKELETON_H */ diff --git a/gio/gdbusintrospection.c b/gio/gdbusintrospection.c new file mode 100644 index 0000000..b05f26f --- /dev/null +++ b/gio/gdbusintrospection.c @@ -0,0 +1,2192 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include "gdbusintrospection.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusintrospection + * @title: D-Bus Introspection Data + * @short_description: Node and interface description data structures + * @include: gio/gio.h + * + * Various data structures and convenience routines to parse and + * generate D-Bus introspection XML. Introspection information is + * used when registering objects with g_dbus_connection_register_object(). + * + * The format of D-Bus introspection XML is specified in the + * D-Bus specification. + */ + +/* ---------------------------------------------------------------------------------------------------- */ + +#define _MY_DEFINE_BOXED_TYPE(TypeName, type_name) \ + G_DEFINE_BOXED_TYPE (TypeName, type_name, type_name##_ref, type_name##_unref) + +_MY_DEFINE_BOXED_TYPE (GDBusNodeInfo, g_dbus_node_info); +_MY_DEFINE_BOXED_TYPE (GDBusInterfaceInfo, g_dbus_interface_info); +_MY_DEFINE_BOXED_TYPE (GDBusMethodInfo, g_dbus_method_info); +_MY_DEFINE_BOXED_TYPE (GDBusSignalInfo, g_dbus_signal_info); +_MY_DEFINE_BOXED_TYPE (GDBusPropertyInfo, g_dbus_property_info); +_MY_DEFINE_BOXED_TYPE (GDBusArgInfo, g_dbus_arg_info); +_MY_DEFINE_BOXED_TYPE (GDBusAnnotationInfo, g_dbus_annotation_info); + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + /* stuff we are currently collecting */ + GPtrArray *args; + GPtrArray *out_args; + GPtrArray *methods; + GPtrArray *signals; + GPtrArray *properties; + GPtrArray *interfaces; + GPtrArray *nodes; + GPtrArray *annotations; + + /* A list of GPtrArray's containing annotations */ + GSList *annotations_stack; + + /* A list of GPtrArray's containing interfaces */ + GSList *interfaces_stack; + + /* A list of GPtrArray's containing nodes */ + GSList *nodes_stack; + + /* Whether the direction was "in" for last parsed arg */ + gboolean last_arg_was_in; + + /* Number of args currently being collected; used for assigning + * names to args without a "name" attribute + */ + guint num_args; + +} ParseData; + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_node_info_ref: + * @info: A #GDBusNodeInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusNodeInfo * +g_dbus_node_info_ref (GDBusNodeInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_interface_info_ref: + * @info: A #GDBusInterfaceInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusInterfaceInfo * +g_dbus_interface_info_ref (GDBusInterfaceInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_method_info_ref: + * @info: A #GDBusMethodInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusMethodInfo * +g_dbus_method_info_ref (GDBusMethodInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_signal_info_ref: + * @info: A #GDBusSignalInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusSignalInfo * +g_dbus_signal_info_ref (GDBusSignalInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_property_info_ref: + * @info: A #GDBusPropertyInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusPropertyInfo * +g_dbus_property_info_ref (GDBusPropertyInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_arg_info_ref: + * @info: A #GDBusArgInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusArgInfo * +g_dbus_arg_info_ref (GDBusArgInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/** + * g_dbus_annotation_info_ref: + * @info: A #GDBusNodeInfo + * + * If @info is statically allocated does nothing. Otherwise increases + * the reference count. + * + * Returns: The same @info. + * + * Since: 2.26 + */ +GDBusAnnotationInfo * +g_dbus_annotation_info_ref (GDBusAnnotationInfo *info) +{ + if (info->ref_count == -1) + return info; + g_atomic_int_inc (&info->ref_count); + return info; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +free_null_terminated_array (gpointer array, GDestroyNotify unref_func) +{ + guint n; + gpointer *p = array; + if (p == NULL) + return; + for (n = 0; p[n] != NULL; n++) + unref_func (p[n]); + g_free (p); +} + +/** + * g_dbus_annotation_info_unref: + * @info: A #GDBusAnnotationInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_annotation_info_unref (GDBusAnnotationInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->key); + g_free (info->value); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_arg_info_unref: + * @info: A #GDBusArgInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_arg_info_unref (GDBusArgInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->name); + g_free (info->signature); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_method_info_unref: + * @info: A #GDBusMethodInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_method_info_unref (GDBusMethodInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->name); + free_null_terminated_array (info->in_args, (GDestroyNotify) g_dbus_arg_info_unref); + free_null_terminated_array (info->out_args, (GDestroyNotify) g_dbus_arg_info_unref); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_signal_info_unref: + * @info: A #GDBusSignalInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_signal_info_unref (GDBusSignalInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->name); + free_null_terminated_array (info->args, (GDestroyNotify) g_dbus_arg_info_unref); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_property_info_unref: + * @info: A #GDBusPropertyInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_property_info_unref (GDBusPropertyInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->name); + g_free (info->signature); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_interface_info_unref: + * @info: A #GDBusInterfaceInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_interface_info_unref (GDBusInterfaceInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->name); + free_null_terminated_array (info->methods, (GDestroyNotify) g_dbus_method_info_unref); + free_null_terminated_array (info->signals, (GDestroyNotify) g_dbus_signal_info_unref); + free_null_terminated_array (info->properties, (GDestroyNotify) g_dbus_property_info_unref); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/** + * g_dbus_node_info_unref: + * @info: A #GDBusNodeInfo. + * + * If @info is statically allocated, does nothing. Otherwise decreases + * the reference count of @info. When its reference count drops to 0, + * the memory used is freed. + * + * Since: 2.26 + */ +void +g_dbus_node_info_unref (GDBusNodeInfo *info) +{ + if (info->ref_count == -1) + return; + if (g_atomic_int_dec_and_test (&info->ref_count)) + { + g_free (info->path); + free_null_terminated_array (info->interfaces, (GDestroyNotify) g_dbus_interface_info_unref); + free_null_terminated_array (info->nodes, (GDestroyNotify) g_dbus_node_info_unref); + free_null_terminated_array (info->annotations, (GDestroyNotify) g_dbus_annotation_info_unref); + g_free (info); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_annotation_info_set (ParseData *data, + GDBusAnnotationInfo *info, + const gchar *key, + const gchar *value, + GDBusAnnotationInfo **embedded_annotations) +{ + info->ref_count = 1; + + if (key != NULL) + info->key = g_strdup (key); + + if (value != NULL) + info->value = g_strdup (value); + + if (embedded_annotations != NULL) + info->annotations = embedded_annotations; +} + +static void +g_dbus_arg_info_set (ParseData *data, + GDBusArgInfo *info, + const gchar *name, + const gchar *signature, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + /* name may be NULL - TODO: compute name? */ + if (name != NULL) + info->name = g_strdup (name); + + if (signature != NULL) + info->signature = g_strdup (signature); + + if (annotations != NULL) + info->annotations = annotations; +} + +static void +g_dbus_method_info_set (ParseData *data, + GDBusMethodInfo *info, + const gchar *name, + GDBusArgInfo **in_args, + GDBusArgInfo **out_args, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + if (name != NULL) + info->name = g_strdup (name); + + if (in_args != NULL) + info->in_args = in_args; + + if (out_args != NULL) + info->out_args = out_args; + + if (annotations != NULL) + info->annotations = annotations; +} + +static void +g_dbus_signal_info_set (ParseData *data, + GDBusSignalInfo *info, + const gchar *name, + GDBusArgInfo **args, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + if (name != NULL) + info->name = g_strdup (name); + + if (args != NULL) + info->args = args; + + if (annotations != NULL) + info->annotations = annotations; +} + +static void +g_dbus_property_info_set (ParseData *data, + GDBusPropertyInfo *info, + const gchar *name, + const gchar *signature, + GDBusPropertyInfoFlags flags, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + if (name != NULL) + info->name = g_strdup (name); + + if (flags != G_DBUS_PROPERTY_INFO_FLAGS_NONE) + info->flags = flags; + + if (signature != NULL) + info->signature = g_strdup (signature); + + if (annotations != NULL) + info->annotations = annotations; +} + +static void +g_dbus_interface_info_set (ParseData *data, + GDBusInterfaceInfo *info, + const gchar *name, + GDBusMethodInfo **methods, + GDBusSignalInfo **signals, + GDBusPropertyInfo **properties, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + if (name != NULL) + info->name = g_strdup (name); + + if (methods != NULL) + info->methods = methods; + + if (signals != NULL) + info->signals = signals; + + if (properties != NULL) + info->properties = properties; + + if (annotations != NULL) + info->annotations = annotations; +} + +static void +g_dbus_node_info_set (ParseData *data, + GDBusNodeInfo *info, + const gchar *path, + GDBusInterfaceInfo **interfaces, + GDBusNodeInfo **nodes, + GDBusAnnotationInfo **annotations) +{ + info->ref_count = 1; + + if (path != NULL) + { + info->path = g_strdup (path); + /* TODO: relative / absolute path snafu */ + } + + if (interfaces != NULL) + info->interfaces = interfaces; + + if (nodes != NULL) + info->nodes = nodes; + + if (annotations != NULL) + info->annotations = annotations; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_annotation_info_generate_xml (GDBusAnnotationInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*skey, + info->value); + + if (info->annotations == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", + indent, ""); + } + +} + +static void +g_dbus_arg_info_generate_xml (GDBusArgInfo *info, + guint indent, + const gchar *extra_attributes, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*ssignature); + + if (info->name != NULL) + g_string_append_printf (string_builder, " name=\"%s\"", info->name); + + if (extra_attributes != NULL) + g_string_append_printf (string_builder, " %s", extra_attributes); + + if (info->annotations == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); + } + +} + +static void +g_dbus_method_info_generate_xml (GDBusMethodInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*sname); + + if (info->annotations == NULL && info->in_args == NULL && info->out_args == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + for (n = 0; info->in_args != NULL && info->in_args[n] != NULL; n++) + g_dbus_arg_info_generate_xml (info->in_args[n], + indent + 2, + "direction=\"in\"", + string_builder); + + for (n = 0; info->out_args != NULL && info->out_args[n] != NULL; n++) + g_dbus_arg_info_generate_xml (info->out_args[n], + indent + 2, + "direction=\"out\"", + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); + } +} + +static void +g_dbus_signal_info_generate_xml (GDBusSignalInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*sname); + + if (info->annotations == NULL && info->args == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + for (n = 0; info->args != NULL && info->args[n] != NULL; n++) + g_dbus_arg_info_generate_xml (info->args[n], + indent + 2, + NULL, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); + } +} + +static void +g_dbus_property_info_generate_xml (GDBusPropertyInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + const gchar *access_string; + + if ((info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) && + (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE)) + { + access_string = "readwrite"; + } + else if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + access_string = "read"; + } + else if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE) + { + access_string = "write"; + } + else + { + g_assert_not_reached (); + } + + g_string_append_printf (string_builder, "%*ssignature, + info->name, + access_string); + + if (info->annotations == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); + } + +} + +/** + * g_dbus_interface_info_generate_xml: + * @info: A #GDBusNodeInfo + * @indent: Indentation level. + * @string_builder: (out): A #GString to to append XML data to. + * + * Appends an XML representation of @info (and its children) to @string_builder. + * + * This function is typically used for generating introspection XML + * documents at run-time for handling the + * org.freedesktop.DBus.Introspectable.Introspect + * method. + * + * Since: 2.26 + */ +void +g_dbus_interface_info_generate_xml (GDBusInterfaceInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*s\n", + indent, "", + info->name); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + for (n = 0; info->methods != NULL && info->methods[n] != NULL; n++) + g_dbus_method_info_generate_xml (info->methods[n], + indent + 2, + string_builder); + + for (n = 0; info->signals != NULL && info->signals[n] != NULL; n++) + g_dbus_signal_info_generate_xml (info->signals[n], + indent + 2, + string_builder); + + for (n = 0; info->properties != NULL && info->properties[n] != NULL; n++) + g_dbus_property_info_generate_xml (info->properties[n], + indent + 2, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); +} + +/** + * g_dbus_node_info_generate_xml: + * @info: A #GDBusNodeInfo. + * @indent: Indentation level. + * @string_builder: (out): A #GString to to append XML data to. + * + * Appends an XML representation of @info (and its children) to @string_builder. + * + * This function is typically used for generating introspection XML documents at run-time for + * handling the org.freedesktop.DBus.Introspectable.Introspect method. + * + * Since: 2.26 + */ +void +g_dbus_node_info_generate_xml (GDBusNodeInfo *info, + guint indent, + GString *string_builder) +{ + guint n; + + g_string_append_printf (string_builder, "%*spath != NULL) + g_string_append_printf (string_builder, " name=\"%s\"", info->path); + + if (info->interfaces == NULL && info->nodes == NULL && info->annotations == NULL) + { + g_string_append (string_builder, "/>\n"); + } + else + { + g_string_append (string_builder, ">\n"); + + for (n = 0; info->annotations != NULL && info->annotations[n] != NULL; n++) + g_dbus_annotation_info_generate_xml (info->annotations[n], + indent + 2, + string_builder); + + for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++) + g_dbus_interface_info_generate_xml (info->interfaces[n], + indent + 2, + string_builder); + + for (n = 0; info->nodes != NULL && info->nodes[n] != NULL; n++) + g_dbus_node_info_generate_xml (info->nodes[n], + indent + 2, + string_builder); + + g_string_append_printf (string_builder, "%*s\n", indent, ""); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAnnotationInfo ** +parse_data_steal_annotations (ParseData *data, + guint *out_num_elements) +{ + GDBusAnnotationInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->annotations->len; + if (data->annotations == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->annotations, NULL); + ret = (GDBusAnnotationInfo **) g_ptr_array_free (data->annotations, FALSE); + } + data->annotations = g_ptr_array_new (); + return ret; +} + +static GDBusArgInfo ** +parse_data_steal_args (ParseData *data, + guint *out_num_elements) +{ + GDBusArgInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->args->len; + if (data->args == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->args, NULL); + ret = (GDBusArgInfo **) g_ptr_array_free (data->args, FALSE); + } + data->args = g_ptr_array_new (); + return ret; +} + +static GDBusArgInfo ** +parse_data_steal_out_args (ParseData *data, + guint *out_num_elements) +{ + GDBusArgInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->out_args->len; + if (data->out_args == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->out_args, NULL); + ret = (GDBusArgInfo **) g_ptr_array_free (data->out_args, FALSE); + } + data->out_args = g_ptr_array_new (); + return ret; +} + +static GDBusMethodInfo ** +parse_data_steal_methods (ParseData *data, + guint *out_num_elements) +{ + GDBusMethodInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->methods->len; + if (data->methods == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->methods, NULL); + ret = (GDBusMethodInfo **) g_ptr_array_free (data->methods, FALSE); + } + data->methods = g_ptr_array_new (); + return ret; +} + +static GDBusSignalInfo ** +parse_data_steal_signals (ParseData *data, + guint *out_num_elements) +{ + GDBusSignalInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->signals->len; + if (data->signals == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->signals, NULL); + ret = (GDBusSignalInfo **) g_ptr_array_free (data->signals, FALSE); + } + data->signals = g_ptr_array_new (); + return ret; +} + +static GDBusPropertyInfo ** +parse_data_steal_properties (ParseData *data, + guint *out_num_elements) +{ + GDBusPropertyInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->properties->len; + if (data->properties == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->properties, NULL); + ret = (GDBusPropertyInfo **) g_ptr_array_free (data->properties, FALSE); + } + data->properties = g_ptr_array_new (); + return ret; +} + +static GDBusInterfaceInfo ** +parse_data_steal_interfaces (ParseData *data, + guint *out_num_elements) +{ + GDBusInterfaceInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->interfaces->len; + if (data->interfaces == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->interfaces, NULL); + ret = (GDBusInterfaceInfo **) g_ptr_array_free (data->interfaces, FALSE); + } + data->interfaces = g_ptr_array_new (); + return ret; +} + +static GDBusNodeInfo ** +parse_data_steal_nodes (ParseData *data, + guint *out_num_elements) +{ + GDBusNodeInfo **ret; + if (out_num_elements != NULL) + *out_num_elements = data->nodes->len; + if (data->nodes == NULL) + ret = NULL; + else + { + g_ptr_array_add (data->nodes, NULL); + ret = (GDBusNodeInfo **) g_ptr_array_free (data->nodes, FALSE); + } + data->nodes = g_ptr_array_new (); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +parse_data_free_annotations (ParseData *data) +{ + if (data->annotations == NULL) + return; + g_ptr_array_foreach (data->annotations, (GFunc) g_dbus_annotation_info_unref, NULL); + g_ptr_array_free (data->annotations, TRUE); + data->annotations = NULL; +} + +static void +parse_data_free_args (ParseData *data) +{ + if (data->args == NULL) + return; + g_ptr_array_foreach (data->args, (GFunc) g_dbus_arg_info_unref, NULL); + g_ptr_array_free (data->args, TRUE); + data->args = NULL; +} + +static void +parse_data_free_out_args (ParseData *data) +{ + if (data->out_args == NULL) + return; + g_ptr_array_foreach (data->out_args, (GFunc) g_dbus_arg_info_unref, NULL); + g_ptr_array_free (data->out_args, TRUE); + data->out_args = NULL; +} + +static void +parse_data_free_methods (ParseData *data) +{ + if (data->methods == NULL) + return; + g_ptr_array_foreach (data->methods, (GFunc) g_dbus_method_info_unref, NULL); + g_ptr_array_free (data->methods, TRUE); + data->methods = NULL; +} + +static void +parse_data_free_signals (ParseData *data) +{ + if (data->signals == NULL) + return; + g_ptr_array_foreach (data->signals, (GFunc) g_dbus_signal_info_unref, NULL); + g_ptr_array_free (data->signals, TRUE); + data->signals = NULL; +} + +static void +parse_data_free_properties (ParseData *data) +{ + if (data->properties == NULL) + return; + g_ptr_array_foreach (data->properties, (GFunc) g_dbus_property_info_unref, NULL); + g_ptr_array_free (data->properties, TRUE); + data->properties = NULL; +} + +static void +parse_data_free_interfaces (ParseData *data) +{ + if (data->interfaces == NULL) + return; + g_ptr_array_foreach (data->interfaces, (GFunc) g_dbus_interface_info_unref, NULL); + g_ptr_array_free (data->interfaces, TRUE); + data->interfaces = NULL; +} + +static void +parse_data_free_nodes (ParseData *data) +{ + if (data->nodes == NULL) + return; + g_ptr_array_foreach (data->nodes, (GFunc) g_dbus_node_info_unref, NULL); + g_ptr_array_free (data->nodes, TRUE); + data->nodes = NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAnnotationInfo * +parse_data_get_annotation (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->annotations, g_new0 (GDBusAnnotationInfo, 1)); + return data->annotations->pdata[data->annotations->len - 1]; +} + +static GDBusArgInfo * +parse_data_get_arg (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->args, g_new0 (GDBusArgInfo, 1)); + return data->args->pdata[data->args->len - 1]; +} + +static GDBusArgInfo * +parse_data_get_out_arg (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->out_args, g_new0 (GDBusArgInfo, 1)); + return data->out_args->pdata[data->out_args->len - 1]; +} + +static GDBusMethodInfo * +parse_data_get_method (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->methods, g_new0 (GDBusMethodInfo, 1)); + return data->methods->pdata[data->methods->len - 1]; +} + +static GDBusSignalInfo * +parse_data_get_signal (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->signals, g_new0 (GDBusSignalInfo, 1)); + return data->signals->pdata[data->signals->len - 1]; +} + +static GDBusPropertyInfo * +parse_data_get_property (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->properties, g_new0 (GDBusPropertyInfo, 1)); + return data->properties->pdata[data->properties->len - 1]; +} + +static GDBusInterfaceInfo * +parse_data_get_interface (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->interfaces, g_new0 (GDBusInterfaceInfo, 1)); + return data->interfaces->pdata[data->interfaces->len - 1]; +} + +static GDBusNodeInfo * +parse_data_get_node (ParseData *data, + gboolean create_new) +{ + if (create_new) + g_ptr_array_add (data->nodes, g_new0 (GDBusNodeInfo, 1)); + return data->nodes->pdata[data->nodes->len - 1]; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static ParseData * +parse_data_new (void) +{ + ParseData *data; + + data = g_new0 (ParseData, 1); + + /* initialize arrays */ + parse_data_steal_annotations (data, NULL); + parse_data_steal_args (data, NULL); + parse_data_steal_out_args (data, NULL); + parse_data_steal_methods (data, NULL); + parse_data_steal_signals (data, NULL); + parse_data_steal_properties (data, NULL); + parse_data_steal_interfaces (data, NULL); + parse_data_steal_nodes (data, NULL); + + return data; +} + +static void +parse_data_free (ParseData *data) +{ + GSList *l; + + /* free stack of annotation arrays */ + for (l = data->annotations_stack; l != NULL; l = l->next) + { + GPtrArray *annotations = l->data; + g_ptr_array_foreach (annotations, (GFunc) g_dbus_annotation_info_unref, NULL); + g_ptr_array_free (annotations, TRUE); + } + g_slist_free (data->annotations_stack); + + /* free stack of interface arrays */ + for (l = data->interfaces_stack; l != NULL; l = l->next) + { + GPtrArray *interfaces = l->data; + g_ptr_array_foreach (interfaces, (GFunc) g_dbus_interface_info_unref, NULL); + g_ptr_array_free (interfaces, TRUE); + } + g_slist_free (data->interfaces_stack); + + /* free stack of node arrays */ + for (l = data->nodes_stack; l != NULL; l = l->next) + { + GPtrArray *nodes = l->data; + g_ptr_array_foreach (nodes, (GFunc) g_dbus_node_info_unref, NULL); + g_ptr_array_free (nodes, TRUE); + } + g_slist_free (data->nodes_stack); + + /* free arrays (data->annotations, data->interfaces and data->nodes have been freed above) */ + parse_data_free_args (data); + parse_data_free_out_args (data); + parse_data_free_methods (data); + parse_data_free_signals (data); + parse_data_free_properties (data); + parse_data_free_interfaces (data); + parse_data_free_annotations (data); + parse_data_free_nodes (data); + + g_free (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +parser_start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ParseData *data = user_data; + GSList *stack; + const gchar *name; + const gchar *type; + const gchar *access; + const gchar *direction; + const gchar *value; + + name = NULL; + type = NULL; + access = NULL; + direction = NULL; + value = NULL; + + stack = (GSList *) g_markup_parse_context_get_element_stack (context); + + /* ---------------------------------------------------------------------------------------------------- */ + if (strcmp (element_name, "node") == 0) + { + if (!(g_slist_length (stack) >= 1 || strcmp (stack->next->data, "node") != 0)) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be top-level or embedded in other elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "name", &name, + /* some hand-written introspection XML documents use this */ + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "xmlns:doc", NULL, + G_MARKUP_COLLECT_INVALID)) + goto out; + + g_dbus_node_info_set (data, + parse_data_get_node (data, TRUE), + name, + NULL, + NULL, + NULL); + + /* push the currently retrieved interfaces and nodes on the stack and prepare new arrays */ + data->interfaces_stack = g_slist_prepend (data->interfaces_stack, data->interfaces); + data->interfaces = NULL; + parse_data_steal_interfaces (data, NULL); + + data->nodes_stack = g_slist_prepend (data->nodes_stack, data->nodes); + data->nodes = NULL; + parse_data_steal_nodes (data, NULL); + + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "interface") == 0) + { + if (g_slist_length (stack) < 2 || strcmp (stack->next->data, "node") != 0) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "name", &name, + /* seen in the wild */ + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "version", NULL, + G_MARKUP_COLLECT_INVALID)) + goto out; + + g_dbus_interface_info_set (data, + parse_data_get_interface (data, TRUE), + name, + NULL, + NULL, + NULL, + NULL); + + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "method") == 0) + { + if (g_slist_length (stack) < 2 || strcmp (stack->next->data, "interface") != 0) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "name", &name, + /* seen in the wild */ + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "version", NULL, + G_MARKUP_COLLECT_INVALID)) + goto out; + + g_dbus_method_info_set (data, + parse_data_get_method (data, TRUE), + name, + NULL, + NULL, + NULL); + + data->num_args = 0; + + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "signal") == 0) + { + if (g_slist_length (stack) < 2 || strcmp (stack->next->data, "interface") != 0) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "name", &name, + G_MARKUP_COLLECT_INVALID)) + goto out; + + g_dbus_signal_info_set (data, + parse_data_get_signal (data, TRUE), + name, + NULL, + NULL); + + data->num_args = 0; + + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "property") == 0) + { + GDBusPropertyInfoFlags flags; + + if (g_slist_length (stack) < 2 || strcmp (stack->next->data, "interface") != 0) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "name", &name, + G_MARKUP_COLLECT_STRING, "type", &type, + G_MARKUP_COLLECT_STRING, "access", &access, + G_MARKUP_COLLECT_INVALID)) + goto out; + + if (strcmp (access, "read") == 0) + flags = G_DBUS_PROPERTY_INFO_FLAGS_READABLE; + else if (strcmp (access, "write") == 0) + flags = G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE; + else if (strcmp (access, "readwrite") == 0) + flags = G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE; + else + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unknown value '%s' of access attribute for element ", + access); + goto out; + } + + g_dbus_property_info_set (data, + parse_data_get_property (data, TRUE), + name, + type, + flags, + NULL); + + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "arg") == 0) + { + gboolean is_in; + gchar *name_to_use; + + if (g_slist_length (stack) < 2 || + (strcmp (stack->next->data, "method") != 0 && + strcmp (stack->next->data, "signal") != 0)) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in or elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "name", &name, + G_MARKUP_COLLECT_STRING | G_MARKUP_COLLECT_OPTIONAL, "direction", &direction, + G_MARKUP_COLLECT_STRING, "type", &type, + G_MARKUP_COLLECT_INVALID)) + goto out; + + if (strcmp (stack->next->data, "method") == 0) + is_in = TRUE; + else + is_in = FALSE; + if (direction != NULL) + { + if (strcmp (direction, "in") == 0) + is_in = TRUE; + else if (strcmp (direction, "out") == 0) + is_in = FALSE; + else + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unknown value '%s' of direction attribute", + direction); + goto out; + } + } + + if (is_in && strcmp (stack->next->data, "signal") == 0) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Only direction 'out' is allowed for elements embedded in "); + goto out; + } + + if (name == NULL) + name_to_use = g_strdup_printf ("arg_%d", data->num_args); + else + name_to_use = g_strdup (name); + data->num_args++; + + if (is_in) + { + g_dbus_arg_info_set (data, + parse_data_get_arg (data, TRUE), + name_to_use, + type, + NULL); + data->last_arg_was_in = TRUE; + } + else + { + g_dbus_arg_info_set (data, + parse_data_get_out_arg (data, TRUE), + name_to_use, + type, + NULL); + data->last_arg_was_in = FALSE; + + } + + g_free (name_to_use); + } + /* ---------------------------------------------------------------------------------------------------- */ + else if (strcmp (element_name, "annotation") == 0) + { + if (g_slist_length (stack) < 2 || + (strcmp (stack->next->data, "node") != 0 && + strcmp (stack->next->data, "interface") != 0 && + strcmp (stack->next->data, "signal") != 0 && + strcmp (stack->next->data, "method") != 0 && + strcmp (stack->next->data, "property") != 0 && + strcmp (stack->next->data, "arg") != 0 && + strcmp (stack->next->data, "annotation") != 0)) + { + g_set_error_literal (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " elements can only be embedded in , , , , , or elements"); + goto out; + } + + if (!g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "name", &name, + G_MARKUP_COLLECT_STRING, "value", &value, + G_MARKUP_COLLECT_INVALID)) + goto out; + + g_dbus_annotation_info_set (data, + parse_data_get_annotation (data, TRUE), + name, + value, + NULL); + } + /* ---------------------------------------------------------------------------------------------------- */ + else + { + /* don't bail on unknown elements; just ignore them */ + } + /* ---------------------------------------------------------------------------------------------------- */ + + /* push the currently retrieved annotations on the stack and prepare a new one */ + data->annotations_stack = g_slist_prepend (data->annotations_stack, data->annotations); + data->annotations = NULL; + parse_data_steal_annotations (data, NULL); + + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusAnnotationInfo ** +steal_annotations (ParseData *data) +{ + return parse_data_steal_annotations (data, NULL); +} + + +static void +parser_end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + ParseData *data = user_data; + gboolean have_popped_annotations; + + have_popped_annotations = FALSE; + + if (strcmp (element_name, "node") == 0) + { + guint num_nodes; + guint num_interfaces; + GDBusNodeInfo **nodes; + GDBusInterfaceInfo **interfaces; + + nodes = parse_data_steal_nodes (data, &num_nodes); + interfaces = parse_data_steal_interfaces (data, &num_interfaces); + + /* destroy the nodes, interfaces for scope we're exiting and and pop the nodes, interfaces from the + * scope we're reentering + */ + parse_data_free_interfaces (data); + data->interfaces = (GPtrArray *) data->interfaces_stack->data; + data->interfaces_stack = g_slist_remove (data->interfaces_stack, data->interfaces_stack->data); + + parse_data_free_nodes (data); + data->nodes = (GPtrArray *) data->nodes_stack->data; + data->nodes_stack = g_slist_remove (data->nodes_stack, data->nodes_stack->data); + + g_dbus_node_info_set (data, + parse_data_get_node (data, FALSE), + NULL, + interfaces, + nodes, + steal_annotations (data)); + + } + else if (strcmp (element_name, "interface") == 0) + { + guint num_methods; + guint num_signals; + guint num_properties; + GDBusMethodInfo **methods; + GDBusSignalInfo **signals; + GDBusPropertyInfo **properties; + + methods = parse_data_steal_methods (data, &num_methods); + signals = parse_data_steal_signals (data, &num_signals); + properties = parse_data_steal_properties (data, &num_properties); + + g_dbus_interface_info_set (data, + parse_data_get_interface (data, FALSE), + NULL, + methods, + signals, + properties, + steal_annotations (data)); + + } + else if (strcmp (element_name, "method") == 0) + { + guint in_num_args; + guint out_num_args; + GDBusArgInfo **in_args; + GDBusArgInfo **out_args; + + in_args = parse_data_steal_args (data, &in_num_args); + out_args = parse_data_steal_out_args (data, &out_num_args); + + g_dbus_method_info_set (data, + parse_data_get_method (data, FALSE), + NULL, + in_args, + out_args, + steal_annotations (data)); + } + else if (strcmp (element_name, "signal") == 0) + { + guint num_args; + GDBusArgInfo **args; + + args = parse_data_steal_out_args (data, &num_args); + + g_dbus_signal_info_set (data, + parse_data_get_signal (data, FALSE), + NULL, + args, + steal_annotations (data)); + } + else if (strcmp (element_name, "property") == 0) + { + g_dbus_property_info_set (data, + parse_data_get_property (data, FALSE), + NULL, + NULL, + G_DBUS_PROPERTY_INFO_FLAGS_NONE, + steal_annotations (data)); + } + else if (strcmp (element_name, "arg") == 0) + { + g_dbus_arg_info_set (data, + data->last_arg_was_in ? parse_data_get_arg (data, FALSE) : parse_data_get_out_arg (data, FALSE), + NULL, + NULL, + steal_annotations (data)); + } + else if (strcmp (element_name, "annotation") == 0) + { + GDBusAnnotationInfo **embedded_annotations; + + embedded_annotations = steal_annotations (data); + + /* destroy the annotations for scope we're exiting and and pop the annotations from the scope we're reentering */ + parse_data_free_annotations (data); + data->annotations = (GPtrArray *) data->annotations_stack->data; + data->annotations_stack = g_slist_remove (data->annotations_stack, data->annotations_stack->data); + + have_popped_annotations = TRUE; + + g_dbus_annotation_info_set (data, + parse_data_get_annotation (data, FALSE), + NULL, + NULL, + embedded_annotations); + } + else + { + /* don't bail on unknown elements; just ignore them */ + } + + if (!have_popped_annotations) + { + /* destroy the annotations for scope we're exiting and and pop the annotations from the scope we're reentering */ + parse_data_free_annotations (data); + data->annotations = (GPtrArray *) data->annotations_stack->data; + data->annotations_stack = g_slist_remove (data->annotations_stack, data->annotations_stack->data); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +parser_error (GMarkupParseContext *context, + GError *error, + gpointer user_data) +{ + gint line_number; + gint char_number; + + g_markup_parse_context_get_position (context, &line_number, &char_number); + + g_prefix_error (&error, "%d:%d: ", + line_number, + char_number); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_node_info_new_for_xml: + * @xml_data: Valid D-Bus introspection XML. + * @error: Return location for error. + * + * Parses @xml_data and returns a #GDBusNodeInfo representing the data. + * + * The introspection XML must contain exactly one top-level + * node element. + * + * Note that this routine is using a + * GMarkup-based + * parser that only accepts a subset of valid XML documents. + * + * Returns: A #GDBusNodeInfo structure or %NULL if @error is set. Free + * with g_dbus_node_info_unref(). + * + * Since: 2.26 + */ +GDBusNodeInfo * +g_dbus_node_info_new_for_xml (const gchar *xml_data, + GError **error) +{ + GDBusNodeInfo *ret; + GMarkupParseContext *context; + GMarkupParser *parser; + guint num_nodes; + ParseData *data; + GDBusNodeInfo **ughret; + + ret = NULL; + parser = NULL; + context = NULL; + + parser = g_new0 (GMarkupParser, 1); + parser->start_element = parser_start_element; + parser->end_element = parser_end_element; + parser->error = parser_error; + + data = parse_data_new (); + context = g_markup_parse_context_new (parser, + 0, + data, + (GDestroyNotify) parse_data_free); + + if (!g_markup_parse_context_parse (context, + xml_data, + strlen (xml_data), + error)) + goto out; + + if (!g_markup_parse_context_end_parse (context, error)) + goto out; + + ughret = parse_data_steal_nodes (data, &num_nodes); + + if (num_nodes != 1) + { + guint n; + + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Expected a single node in introspection XML, found %d", + num_nodes); + + /* clean up */ + for (n = 0; n < num_nodes; n++) + { + g_dbus_node_info_unref (ughret[n]); + ughret[n] = NULL; + } + } + + ret = ughret[0]; + g_free (ughret); + + out: + if (parser != NULL) + g_free (parser); + if (context != NULL) + g_markup_parse_context_free (context); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_annotation_info_lookup: + * @annotations: (array zero-terminated=1) (allow-none): A %NULL-terminated array of annotations or %NULL. + * @name: The name of the annotation to look up. + * + * Looks up the value of an annotation. + * + * The cost of this function is O(n) in number of annotations. + * + * Returns: The value or %NULL if not found. Do not free, it is owned by @annotations. + * + * Since: 2.26 + */ +const gchar * +g_dbus_annotation_info_lookup (GDBusAnnotationInfo **annotations, + const gchar *name) +{ + guint n; + const gchar *ret; + + ret = NULL; + for (n = 0; annotations != NULL && annotations[n] != NULL; n++) + { + if (g_strcmp0 (annotations[n]->key, name) == 0) + { + ret = annotations[n]->value; + goto out; + } + } + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +G_LOCK_DEFINE_STATIC (info_cache_lock); + +typedef struct +{ + gint use_count; + + /* gchar* -> GDBusMethodInfo* */ + GHashTable *method_name_to_data; + + /* gchar* -> GDBusMethodInfo* */ + GHashTable *signal_name_to_data; + + /* gchar* -> GDBusMethodInfo* */ + GHashTable *property_name_to_data; +} InfoCacheEntry; + +static void +info_cache_free (InfoCacheEntry *cache) +{ + g_assert (cache->use_count == 0); + g_hash_table_unref (cache->method_name_to_data); + g_hash_table_unref (cache->signal_name_to_data); + g_hash_table_unref (cache->property_name_to_data); + g_slice_free (InfoCacheEntry, cache); +} + +/* maps from GDBusInterfaceInfo* to InfoCacheEntry* */ +static GHashTable *info_cache = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_info_lookup_method: + * @info: A #GDBusInterfaceInfo. + * @name: A D-Bus method name (typically in CamelCase) + * + * Looks up information about a method. + * + * The cost of this function is O(n) in number of methods unless + * g_dbus_interface_info_cache_build() has been used on @info. + * + * Returns: (transfer none): A #GDBusMethodInfo or %NULL if not found. Do not free, it is owned by @info. + * + * Since: 2.26 + */ +GDBusMethodInfo * +g_dbus_interface_info_lookup_method (GDBusInterfaceInfo *info, + const gchar *name) +{ + guint n; + GDBusMethodInfo *result; + + G_LOCK (info_cache_lock); + if (G_LIKELY (info_cache != NULL)) + { + InfoCacheEntry *cache; + cache = g_hash_table_lookup (info_cache, info); + if (G_LIKELY (cache != NULL)) + { + result = g_hash_table_lookup (cache->method_name_to_data, name); + G_UNLOCK (info_cache_lock); + goto out; + } + } + G_UNLOCK (info_cache_lock); + + for (n = 0; info->methods != NULL && info->methods[n] != NULL; n++) + { + GDBusMethodInfo *i = info->methods[n]; + + if (g_strcmp0 (i->name, name) == 0) + { + result = i; + goto out; + } + } + + result = NULL; + + out: + return result; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_info_lookup_signal: + * @info: A #GDBusInterfaceInfo. + * @name: A D-Bus signal name (typically in CamelCase) + * + * Looks up information about a signal. + * + * The cost of this function is O(n) in number of signals unless + * g_dbus_interface_info_cache_build() has been used on @info. + * + * Returns: (transfer none): A #GDBusSignalInfo or %NULL if not found. Do not free, it is owned by @info. + * + * Since: 2.26 + */ +GDBusSignalInfo * +g_dbus_interface_info_lookup_signal (GDBusInterfaceInfo *info, + const gchar *name) +{ + guint n; + GDBusSignalInfo *result; + + G_LOCK (info_cache_lock); + if (G_LIKELY (info_cache != NULL)) + { + InfoCacheEntry *cache; + cache = g_hash_table_lookup (info_cache, info); + if (G_LIKELY (cache != NULL)) + { + result = g_hash_table_lookup (cache->signal_name_to_data, name); + G_UNLOCK (info_cache_lock); + goto out; + } + } + G_UNLOCK (info_cache_lock); + + for (n = 0; info->signals != NULL && info->signals[n] != NULL; n++) + { + GDBusSignalInfo *i = info->signals[n]; + + if (g_strcmp0 (i->name, name) == 0) + { + result = i; + goto out; + } + } + + result = NULL; + + out: + return result; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_info_lookup_property: + * @info: A #GDBusInterfaceInfo. + * @name: A D-Bus property name (typically in CamelCase). + * + * Looks up information about a property. + * + * The cost of this function is O(n) in number of properties unless + * g_dbus_interface_info_cache_build() has been used on @info. + * + * Returns: (transfer none): A #GDBusPropertyInfo or %NULL if not found. Do not free, it is owned by @info. + * + * Since: 2.26 + */ +GDBusPropertyInfo * +g_dbus_interface_info_lookup_property (GDBusInterfaceInfo *info, + const gchar *name) +{ + guint n; + GDBusPropertyInfo *result; + + G_LOCK (info_cache_lock); + if (G_LIKELY (info_cache != NULL)) + { + InfoCacheEntry *cache; + cache = g_hash_table_lookup (info_cache, info); + if (G_LIKELY (cache != NULL)) + { + result = g_hash_table_lookup (cache->property_name_to_data, name); + G_UNLOCK (info_cache_lock); + goto out; + } + } + G_UNLOCK (info_cache_lock); + + for (n = 0; info->properties != NULL && info->properties[n] != NULL; n++) + { + GDBusPropertyInfo *i = info->properties[n]; + + if (g_strcmp0 (i->name, name) == 0) + { + result = i; + goto out; + } + } + + result = NULL; + + out: + return result; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_interface_info_cache_build: + * @info: A #GDBusInterfaceInfo. + * + * Builds a lookup-cache to speed up + * g_dbus_interface_info_lookup_method(), + * g_dbus_interface_info_lookup_signal() and + * g_dbus_interface_info_lookup_property(). + * + * If this has already been called with @info, the existing cache is + * used and its use count is increased. + * + * Note that @info cannot be modified until + * g_dbus_interface_info_cache_release() is called. + * + * Since: 2.30 + */ +void +g_dbus_interface_info_cache_build (GDBusInterfaceInfo *info) +{ + InfoCacheEntry *cache; + guint n; + + G_LOCK (info_cache_lock); + if (info_cache == NULL) + info_cache = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) info_cache_free); + cache = g_hash_table_lookup (info_cache, info); + if (cache != NULL) + { + cache->use_count += 1; + goto out; + } + cache = g_slice_new0 (InfoCacheEntry); + cache->use_count = 1; + cache->method_name_to_data = g_hash_table_new (g_str_hash, g_str_equal); + cache->signal_name_to_data = g_hash_table_new (g_str_hash, g_str_equal); + cache->property_name_to_data = g_hash_table_new (g_str_hash, g_str_equal); + for (n = 0; info->methods != NULL && info->methods[n] != NULL; n++) + g_hash_table_insert (cache->method_name_to_data, info->methods[n]->name, info->methods[n]); + for (n = 0; info->signals != NULL && info->signals[n] != NULL; n++) + g_hash_table_insert (cache->signal_name_to_data, info->signals[n]->name, info->signals[n]); + for (n = 0; info->properties != NULL && info->properties[n] != NULL; n++) + g_hash_table_insert (cache->property_name_to_data, info->properties[n]->name, info->properties[n]); + g_hash_table_insert (info_cache, info, cache); + out: + G_UNLOCK (info_cache_lock); +} + +/** + * g_dbus_interface_info_cache_release: + * @info: A GDBusInterfaceInfo + * + * Decrements the usage count for the cache for @info built by + * g_dbus_interface_info_cache_build() (if any) and frees the + * resources used by the cache if the usage count drops to zero. + * + * Since: 2.30 + */ +void +g_dbus_interface_info_cache_release (GDBusInterfaceInfo *info) +{ + InfoCacheEntry *cache; + + G_LOCK (info_cache_lock); + if (G_UNLIKELY (info_cache == NULL)) + { + g_warning ("%s called for interface %s but there is no cache", info->name, G_STRFUNC); + goto out; + } + + cache = g_hash_table_lookup (info_cache, info); + if (G_UNLIKELY (cache == NULL)) + { + g_warning ("%s called for interface %s but there is no cache entry", info->name, G_STRFUNC); + goto out; + } + cache->use_count -= 1; + if (cache->use_count == 0) + { + g_hash_table_remove (info_cache, info); + /* could nuke info_cache itself if empty */ + } + out: + G_UNLOCK (info_cache_lock); +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_node_info_lookup_interface: + * @info: A #GDBusNodeInfo. + * @name: A D-Bus interface name. + * + * Looks up information about an interface. + * + * The cost of this function is O(n) in number of interfaces. + * + * Returns: (transfer none): A #GDBusInterfaceInfo or %NULL if not found. Do not free, it is owned by @info. + * + * Since: 2.26 + */ +GDBusInterfaceInfo * +g_dbus_node_info_lookup_interface (GDBusNodeInfo *info, + const gchar *name) +{ + guint n; + GDBusInterfaceInfo *result; + + for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++) + { + GDBusInterfaceInfo *i = info->interfaces[n]; + + if (g_strcmp0 (i->name, name) == 0) + { + result = i; + goto out; + } + } + + result = NULL; + + out: + return result; +} diff --git a/gio/gdbusintrospection.h b/gio/gdbusintrospection.h new file mode 100644 index 0000000..32ee784 --- /dev/null +++ b/gio/gdbusintrospection.h @@ -0,0 +1,327 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_INTROSPECTION_H__ +#define __G_DBUS_INTROSPECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * GDBusAnnotationInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @key: The name of the annotation, e.g. "org.freedesktop.DBus.Deprecated". + * @value: The value of the annotation. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about an annotation. + * + * Since: 2.26 + */ +struct _GDBusAnnotationInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *key; + gchar *value; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusArgInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @name: Name of the argument, e.g. @unix_user_id. + * @signature: D-Bus signature of the argument (a single complete type). + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about an argument for a method or a signal. + * + * Since: 2.26 + */ +struct _GDBusArgInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *name; + gchar *signature; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusMethodInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @name: The name of the D-Bus method, e.g. @RequestName. + * @in_args: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusArgInfo structures or %NULL if there are no in arguments. + * @out_args: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusArgInfo structures or %NULL if there are no out arguments. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about a method on an D-Bus interface. + * + * Since: 2.26 + */ +struct _GDBusMethodInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *name; + GDBusArgInfo **in_args; + GDBusArgInfo **out_args; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusSignalInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @name: The name of the D-Bus signal, e.g. "NameOwnerChanged". + * @args: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusArgInfo structures or %NULL if there are no arguments. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about a signal on a D-Bus interface. + * + * Since: 2.26 + */ +struct _GDBusSignalInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *name; + GDBusArgInfo **args; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusPropertyInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @name: The name of the D-Bus property, e.g. "SupportedFilesystems". + * @signature: The D-Bus signature of the property (a single complete type). + * @flags: Access control flags for the property. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about a D-Bus property on a D-Bus interface. + * + * Since: 2.26 + */ +struct _GDBusPropertyInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *name; + gchar *signature; + GDBusPropertyInfoFlags flags; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusInterfaceInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @name: The name of the D-Bus interface, e.g. "org.freedesktop.DBus.Properties". + * @methods: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusMethodInfo structures or %NULL if there are no methods. + * @signals: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusSignalInfo structures or %NULL if there are no signals. + * @properties: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusPropertyInfo structures or %NULL if there are no properties. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about a D-Bus interface. + * + * Since: 2.26 + */ +struct _GDBusInterfaceInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *name; + GDBusMethodInfo **methods; + GDBusSignalInfo **signals; + GDBusPropertyInfo **properties; + GDBusAnnotationInfo **annotations; +}; + +/** + * GDBusNodeInfo: + * @ref_count: The reference count or -1 if statically allocated. + * @path: The path of the node or %NULL if omitted. Note that this may be a relative path. See the D-Bus specification for more details. + * @interfaces: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusInterfaceInfo structures or %NULL if there are no interfaces. + * @nodes: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusNodeInfo structures or %NULL if there are no nodes. + * @annotations: (array zero-terminated=1): A pointer to a %NULL-terminated array of pointers to #GDBusAnnotationInfo structures or %NULL if there are no annotations. + * + * Information about nodes in a remote object hierarchy. + * + * Since: 2.26 + */ +struct _GDBusNodeInfo +{ + /*< public >*/ + volatile gint ref_count; + gchar *path; + GDBusInterfaceInfo **interfaces; + GDBusNodeInfo **nodes; + GDBusAnnotationInfo **annotations; +}; + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_annotation_info_lookup (GDBusAnnotationInfo **annotations, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GDBusMethodInfo *g_dbus_interface_info_lookup_method (GDBusInterfaceInfo *info, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GDBusSignalInfo *g_dbus_interface_info_lookup_signal (GDBusInterfaceInfo *info, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GDBusPropertyInfo *g_dbus_interface_info_lookup_property (GDBusInterfaceInfo *info, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_info_cache_build (GDBusInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_info_cache_release (GDBusInterfaceInfo *info); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_info_generate_xml (GDBusInterfaceInfo *info, + guint indent, + GString *string_builder); + +GLIB_AVAILABLE_IN_ALL +GDBusNodeInfo *g_dbus_node_info_new_for_xml (const gchar *xml_data, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceInfo *g_dbus_node_info_lookup_interface (GDBusNodeInfo *info, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +void g_dbus_node_info_generate_xml (GDBusNodeInfo *info, + guint indent, + GString *string_builder); + +GLIB_AVAILABLE_IN_ALL +GDBusNodeInfo *g_dbus_node_info_ref (GDBusNodeInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceInfo *g_dbus_interface_info_ref (GDBusInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusMethodInfo *g_dbus_method_info_ref (GDBusMethodInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusSignalInfo *g_dbus_signal_info_ref (GDBusSignalInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusPropertyInfo *g_dbus_property_info_ref (GDBusPropertyInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusArgInfo *g_dbus_arg_info_ref (GDBusArgInfo *info); +GLIB_AVAILABLE_IN_ALL +GDBusAnnotationInfo *g_dbus_annotation_info_ref (GDBusAnnotationInfo *info); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_node_info_unref (GDBusNodeInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_interface_info_unref (GDBusInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_info_unref (GDBusMethodInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_signal_info_unref (GDBusSignalInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_property_info_unref (GDBusPropertyInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_arg_info_unref (GDBusArgInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_dbus_annotation_info_unref (GDBusAnnotationInfo *info); + +/** + * G_TYPE_DBUS_NODE_INFO: + * + * The #GType for a boxed type holding a #GDBusNodeInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_NODE_INFO (g_dbus_node_info_get_type ()) + +/** + * G_TYPE_DBUS_INTERFACE_INFO: + * + * The #GType for a boxed type holding a #GDBusInterfaceInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_INTERFACE_INFO (g_dbus_interface_info_get_type ()) + +/** + * G_TYPE_DBUS_METHOD_INFO: + * + * The #GType for a boxed type holding a #GDBusMethodInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_METHOD_INFO (g_dbus_method_info_get_type ()) + +/** + * G_TYPE_DBUS_SIGNAL_INFO: + * + * The #GType for a boxed type holding a #GDBusSignalInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_SIGNAL_INFO (g_dbus_signal_info_get_type ()) + +/** + * G_TYPE_DBUS_PROPERTY_INFO: + * + * The #GType for a boxed type holding a #GDBusPropertyInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_PROPERTY_INFO (g_dbus_property_info_get_type ()) + +/** + * G_TYPE_DBUS_ARG_INFO: + * + * The #GType for a boxed type holding a #GDBusArgInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_ARG_INFO (g_dbus_arg_info_get_type ()) + +/** + * G_TYPE_DBUS_ANNOTATION_INFO: + * + * The #GType for a boxed type holding a #GDBusAnnotationInfo. + * + * Since: 2.26 + */ +#define G_TYPE_DBUS_ANNOTATION_INFO (g_dbus_annotation_info_get_type ()) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_node_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_interface_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_method_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_signal_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_property_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_arg_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_dbus_annotation_info_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_DBUS_INTROSPECTION_H__ */ diff --git a/gio/gdbusmenumodel.c b/gio/gdbusmenumodel.c new file mode 100644 index 0000000..c437dcf --- /dev/null +++ b/gio/gdbusmenumodel.c @@ -0,0 +1,931 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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 "gdbusmenumodel.h" + +#include "gmenumodel.h" + +/* Prelude {{{1 */ + +/** + * SECTION:gdbusmenumodel + * @title: GDBusMenuModel + * @short_description: A D-Bus GMenuModel implementation + * @see_also: GMenuModel Exporter + * + * #GDBusMenuModel is an implementation of #GMenuModel that can be used + * as a proxy for a menu model that is exported over D-Bus with + * g_dbus_connection_export_menu_model(). + */ + +/* + * There are 3 main (quasi-)classes involved here: + * + * - GDBusMenuPath + * - GDBusMenuGroup + * - GDBusMenuModel + * + * Each of these classes exists as a parameterised singleton keyed to a + * particular thing: + * + * - GDBusMenuPath represents a D-Bus object path on a particular + * unique bus name on a particular GDBusConnection and in a + * particular GMainContext. + * + * - GDBusMenuGroup represents a particular group on a particular + * GDBusMenuPath. + * + * - GDBusMenuModel represents a particular menu within a particular + * GDBusMenuGroup. + * + * There are also two (and a half) utility structs: + * + * - PathIdentifier and ConstPathIdentifier + * - GDBusMenuModelItem + * + * PathIdentifier is the 4-tuple of (GMainContext, GDBusConnection, + * unique name, object path) that uniquely identifies a particular + * GDBusMenuPath. It holds ownership on each of these things, so we + * have a ConstPathIdentifier variant that does not. + * + * We have a 3-level hierarchy of hashtables: + * + * - a global hashtable (g_dbus_menu_paths) maps from PathIdentifier + * to GDBusMenuPath + * + * - each GDBusMenuPath has a hashtable mapping from guint (group + * number) to GDBusMenuGroup + * + * - each GDBusMenuGroup has a hashtable mapping from guint (menu + * number) to GDBusMenuModel. + * + * In this way, each quintuplet of (connection, bus name, object path, + * group id, menu id) maps to a single GDBusMenuModel instance that can be + * located via 3 hashtable lookups. + * + * All of the 3 classes are refcounted (GDBusMenuPath and + * GDBusMenuGroup manually, and GDBusMenuModel by virtue of being a + * GObject). The hashtables do not hold references -- rather, when the + * last reference is dropped, the object is removed from the hashtable. + * + * The hard references go in the other direction: GDBusMenuModel is created + * as the user requests it and only exists as long as the user holds a + * reference on it. GDBusMenuModel holds a reference on the GDBusMenuGroup + * from which it came. GDBusMenuGroup holds a reference on + * GDBusMenuPath. + * + * In addition to refcounts, each object has an 'active' variable (ints + * for GDBusMenuPath and GDBusMenuGroup, boolean for GDBusMenuModel). + * + * - GDBusMenuModel is inactive when created and becomes active only when + * first queried for information. This prevents extra work from + * happening just by someone acquiring a GDBusMenuModel (and not + * actually trying to display it yet). + * + * - The active count on GDBusMenuGroup is equal to the number of + * GDBusMenuModel instances in that group that are active. When the + * active count transitions from 0 to 1, the group calls the 'Start' + * method on the service to begin monitoring that group. When it + * drops from 1 to 0, the group calls the 'End' method to stop + * monitoring. + * + * - The active count on GDBusMenuPath is equal to the number of + * GDBusMenuGroup instances on that path with a non-zero active + * count. When the active count transitions from 0 to 1, the path + * sets up a signal subscription to monitor any changes. The signal + * subscription is taken down when the active count transitions from + * 1 to 0. + * + * When active, GDBusMenuPath gets incoming signals when changes occur. + * If the change signal mentions a group for which we currently have an + * active GDBusMenuGroup, the change signal is passed along to that + * group. If the group is inactive, the change signal is ignored. + * + * Most of the "work" occurs in GDBusMenuGroup. In addition to the + * hashtable of GDBusMenuModel instances, it keeps a hashtable of the actual + * menu contents, each encoded as GSequence of GDBusMenuModelItem. It + * initially populates this table with the results of the "Start" method + * call and then updates it according to incoming change signals. If + * the change signal mentions a menu for which we current have an active + * GDBusMenuModel, the change signal is passed along to that model. If the + * model is inactive, the change signal is ignored. + * + * GDBusMenuModelItem is just a pair of hashtables, one for the attributes + * and one for the links of the item. Both map strings to GVariant + * instances. In the case of links, the GVariant has type '(uu)' and is + * turned into a GDBusMenuModel at the point that the user pulls it through + * the API. + * + * Following the "empty is the same as non-existent" rule, the hashtable + * of GSequence of GDBusMenuModelItem holds NULL for empty menus. + * + * GDBusMenuModel contains very little functionality of its own. It holds a + * (weak) reference to the GSequence of GDBusMenuModelItem contained in the + * GDBusMenuGroup. It uses this GSequence to implement the GMenuModel + * interface. It also emits the "items-changed" signal if it is active + * and it was told that the contents of the GSequence changed. + */ + +typedef struct _GDBusMenuGroup GDBusMenuGroup; +typedef struct _GDBusMenuPath GDBusMenuPath; + +static void g_dbus_menu_group_changed (GDBusMenuGroup *group, + guint menu_id, + gint position, + gint removed, + GVariant *added); +static void g_dbus_menu_model_changed (GDBusMenuModel *proxy, + GSequence *items, + gint position, + gint removed, + gint added); +static GDBusMenuGroup * g_dbus_menu_group_get_from_path (GDBusMenuPath *path, + guint group_id); +static GDBusMenuModel * g_dbus_menu_model_get_from_group (GDBusMenuGroup *group, + guint menu_id); + +/* PathIdentifier {{{1 */ +typedef struct +{ + GMainContext *context; + GDBusConnection *connection; + gchar *bus_name; + gchar *object_path; +} PathIdentifier; + +typedef const struct +{ + GMainContext *context; + GDBusConnection *connection; + const gchar *bus_name; + const gchar *object_path; +} ConstPathIdentifier; + +static guint +path_identifier_hash (gconstpointer data) +{ + ConstPathIdentifier *id = data; + + return g_str_hash (id->object_path); +} + +static gboolean +path_identifier_equal (gconstpointer a, + gconstpointer b) +{ + ConstPathIdentifier *id_a = a; + ConstPathIdentifier *id_b = b; + + return id_a->connection == id_b->connection && + g_str_equal (id_a->bus_name, id_b->bus_name) && + g_str_equal (id_a->object_path, id_b->object_path); +} + +static void +path_identifier_free (PathIdentifier *id) +{ + g_main_context_unref (id->context); + g_object_unref (id->connection); + g_free (id->bus_name); + g_free (id->object_path); + + g_slice_free (PathIdentifier, id); +} + +static PathIdentifier * +path_identifier_new (ConstPathIdentifier *cid) +{ + PathIdentifier *id; + + id = g_slice_new (PathIdentifier); + id->context = g_main_context_ref (cid->context); + id->connection = g_object_ref (cid->connection); + id->bus_name = g_strdup (cid->bus_name); + id->object_path = g_strdup (cid->object_path); + + return id; +} + +/* GDBusMenuPath {{{1 */ + +struct _GDBusMenuPath +{ + PathIdentifier *id; + gint ref_count; + + GHashTable *groups; + gint active; + guint watch_id; +}; + +static GHashTable *g_dbus_menu_paths; + +static GDBusMenuPath * +g_dbus_menu_path_ref (GDBusMenuPath *path) +{ + path->ref_count++; + + return path; +} + +static void +g_dbus_menu_path_unref (GDBusMenuPath *path) +{ + if (--path->ref_count == 0) + { + g_hash_table_remove (g_dbus_menu_paths, path->id); + g_hash_table_unref (path->groups); + path_identifier_free (path->id); + + g_slice_free (GDBusMenuPath, path); + } +} + +static void +g_dbus_menu_path_signal (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GDBusMenuPath *path = user_data; + GVariantIter *iter; + guint group_id; + guint menu_id; + guint position; + guint removes; + GVariant *adds; + + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(a(uuuuaa{sv}))"))) + return; + + g_variant_get (parameters, "(a(uuuuaa{sv}))", &iter); + while (g_variant_iter_loop (iter, "(uuuu@aa{sv})", &group_id, &menu_id, &position, &removes, &adds)) + { + GDBusMenuGroup *group; + + group = g_hash_table_lookup (path->groups, GINT_TO_POINTER (group_id)); + + if (group != NULL) + g_dbus_menu_group_changed (group, menu_id, position, removes, adds); + } + g_variant_iter_free (iter); +} + +static void +g_dbus_menu_path_activate (GDBusMenuPath *path) +{ + if (path->active++ == 0) + path->watch_id = g_dbus_connection_signal_subscribe (path->id->connection, path->id->bus_name, + "org.gtk.Menus", "Changed", path->id->object_path, + NULL, G_DBUS_SIGNAL_FLAGS_NONE, + g_dbus_menu_path_signal, path, NULL); +} + +static void +g_dbus_menu_path_deactivate (GDBusMenuPath *path) +{ + if (--path->active == 0) + g_dbus_connection_signal_unsubscribe (path->id->connection, path->watch_id); +} + +static GDBusMenuPath * +g_dbus_menu_path_get (GMainContext *context, + GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path) +{ + ConstPathIdentifier cid = { context, connection, bus_name, object_path }; + GDBusMenuPath *path; + + if (g_dbus_menu_paths == NULL) + g_dbus_menu_paths = g_hash_table_new (path_identifier_hash, path_identifier_equal); + + path = g_hash_table_lookup (g_dbus_menu_paths, &cid); + + if (path == NULL) + { + path = g_slice_new (GDBusMenuPath); + path->id = path_identifier_new (&cid); + path->groups = g_hash_table_new (NULL, NULL); + path->ref_count = 0; + path->active = 0; + + g_hash_table_insert (g_dbus_menu_paths, path->id, path); + } + + return g_dbus_menu_path_ref (path); +} + +/* GDBusMenuGroup, GDBusMenuModelItem {{{1 */ +typedef enum +{ + GROUP_OFFLINE, + GROUP_PENDING, + GROUP_ONLINE +} GroupStatus; + +struct _GDBusMenuGroup +{ + GDBusMenuPath *path; + guint id; + + GHashTable *proxies; /* uint -> unowned GDBusMenuModel */ + GHashTable *menus; /* uint -> owned GSequence */ + gint ref_count; + GroupStatus state; + gint active; +}; + +typedef struct +{ + GHashTable *attributes; + GHashTable *links; +} GDBusMenuModelItem; + +static GDBusMenuGroup * +g_dbus_menu_group_ref (GDBusMenuGroup *group) +{ + group->ref_count++; + + return group; +} + +static void +g_dbus_menu_group_unref (GDBusMenuGroup *group) +{ + if (--group->ref_count == 0) + { + g_assert (group->state == GROUP_OFFLINE); + g_assert (group->active == 0); + + g_hash_table_remove (group->path->groups, GINT_TO_POINTER (group->id)); + g_hash_table_unref (group->proxies); + g_hash_table_unref (group->menus); + + g_dbus_menu_path_unref (group->path); + + g_slice_free (GDBusMenuGroup, group); + } +} + +static void +g_dbus_menu_model_item_free (gpointer data) +{ + GDBusMenuModelItem *item = data; + + g_hash_table_unref (item->attributes); + g_hash_table_unref (item->links); + + g_slice_free (GDBusMenuModelItem, item); +} + +static GDBusMenuModelItem * +g_dbus_menu_group_create_item (GVariant *description) +{ + GDBusMenuModelItem *item; + GVariantIter iter; + const gchar *key; + GVariant *value; + + item = g_slice_new (GDBusMenuModelItem); + item->attributes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + item->links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + + g_variant_iter_init (&iter, description); + while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) + if (key[0] == ':') + /* key + 1 to skip the ':' */ + g_hash_table_insert (item->links, g_strdup (key + 1), g_variant_ref (value)); + else + g_hash_table_insert (item->attributes, g_strdup (key), g_variant_ref (value)); + + return item; +} + +/* + * GDBusMenuGroup can be in three states: + * + * OFFLINE: not subscribed to this group + * PENDING: we made the call to subscribe to this group, but the result + * has not come back yet + * ONLINE: we are fully subscribed + * + * We can get into some nasty situations where we make a call due to an + * activation request but receive a deactivation request before the call + * returns. If another activation request occurs then we could risk + * sending a Start request even though one is already in progress. For + * this reason, we have to carefully consider what to do in each of the + * three states for each of the following situations: + * + * - activation requested + * - deactivation requested + * - Start call finishes + * + * To simplify things a bit, we do not have a callback for the Stop + * call. We just send it and assume that it takes effect immediately. + * + * Activation requested: + * OFFLINE: make the Start call and transition to PENDING + * PENDING: do nothing -- call is already in progress. + * ONLINE: this should not be possible + * + * Deactivation requested: + * OFFLINE: this should not be possible + * PENDING: do nothing -- handle it when the Start call finishes + * ONLINE: send the Stop call and move to OFFLINE immediately + * + * Start call finishes: + * OFFLINE: this should not be possible + * PENDING: + * If we should be active (ie: active count > 0): move to ONLINE + * If not: send Stop call and move to OFFLINE immediately + * ONLINE: this should not be possible + * + * We have to take care with regards to signal subscriptions (ie: + * activation of the GDBusMenuPath). The signal subscription is always + * established when transitioning from OFFLINE to PENDING and taken down + * when transitioning to OFFLINE (from either PENDING or ONLINE). + * + * Since there are two places where we transition to OFFLINE, we split + * that code out into a separate function. + */ +static void +g_dbus_menu_group_go_offline (GDBusMenuGroup *group) +{ + g_dbus_menu_path_deactivate (group->path); + g_dbus_connection_call (group->path->id->connection, + group->path->id->bus_name, + group->path->id->object_path, + "org.gtk.Menus", "End", + g_variant_new_parsed ("([ %u ],)", group->id), + NULL, G_DBUS_CALL_FLAGS_NONE, -1, + NULL, NULL, NULL); + group->state = GROUP_OFFLINE; +} + + +static void +g_dbus_menu_group_start_ready (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (source_object); + GDBusMenuGroup *group = user_data; + GVariant *reply; + + g_assert (group->state == GROUP_PENDING); + + reply = g_dbus_connection_call_finish (connection, result, NULL); + + if (group->active) + { + group->state = GROUP_ONLINE; + + /* If we receive no reply, just act like we got an empty reply. */ + if (reply) + { + GVariantIter *iter; + GVariant *items; + guint group_id; + guint menu_id; + + g_variant_get (reply, "(a(uuaa{sv}))", &iter); + while (g_variant_iter_loop (iter, "(uu@aa{sv})", &group_id, &menu_id, &items)) + if (group_id == group->id) + g_dbus_menu_group_changed (group, menu_id, 0, 0, items); + g_variant_iter_free (iter); + } + } + else + g_dbus_menu_group_go_offline (group); + + if (reply) + g_variant_unref (reply); + + g_dbus_menu_group_unref (group); +} + +static void +g_dbus_menu_group_activate (GDBusMenuGroup *group) +{ + if (group->active++ == 0) + { + g_assert (group->state != GROUP_ONLINE); + + if (group->state == GROUP_OFFLINE) + { + g_dbus_menu_path_activate (group->path); + + g_dbus_connection_call (group->path->id->connection, + group->path->id->bus_name, + group->path->id->object_path, + "org.gtk.Menus", "Start", + g_variant_new_parsed ("([ %u ],)", group->id), + G_VARIANT_TYPE ("(a(uuaa{sv}))"), + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + g_dbus_menu_group_start_ready, + g_dbus_menu_group_ref (group)); + group->state = GROUP_PENDING; + } + } +} + +static void +g_dbus_menu_group_deactivate (GDBusMenuGroup *group) +{ + if (--group->active == 0) + { + g_assert (group->state != GROUP_OFFLINE); + + if (group->state == GROUP_ONLINE) + { + /* We are here because nobody is watching, so just free + * everything and don't bother with the notifications. + */ + g_hash_table_remove_all (group->menus); + + g_dbus_menu_group_go_offline (group); + } + } +} + +static void +g_dbus_menu_group_changed (GDBusMenuGroup *group, + guint menu_id, + gint position, + gint removed, + GVariant *added) +{ + GSequenceIter *point; + GVariantIter iter; + GDBusMenuModel *proxy; + GSequence *items; + GVariant *item; + gint n_added; + + /* We could have signals coming to us when we're not active (due to + * some other process having subscribed to this group) or when we're + * pending. In both of those cases, we want to ignore the signal + * since we'll get our own information when we call "Start" for + * ourselves. + */ + if (group->state != GROUP_ONLINE) + return; + + items = g_hash_table_lookup (group->menus, GINT_TO_POINTER (menu_id)); + + if (items == NULL) + { + items = g_sequence_new (g_dbus_menu_model_item_free); + g_hash_table_insert (group->menus, GINT_TO_POINTER (menu_id), items); + } + + point = g_sequence_get_iter_at_pos (items, position + removed); + + g_return_if_fail (point != NULL); + + if (removed) + { + GSequenceIter *start; + + start = g_sequence_get_iter_at_pos (items, position); + g_sequence_remove_range (start, point); + } + + n_added = g_variant_iter_init (&iter, added); + while (g_variant_iter_loop (&iter, "@a{sv}", &item)) + g_sequence_insert_before (point, g_dbus_menu_group_create_item (item)); + + if (g_sequence_get_length (items) == 0) + { + g_hash_table_remove (group->menus, GINT_TO_POINTER (menu_id)); + items = NULL; + } + + if ((proxy = g_hash_table_lookup (group->proxies, GINT_TO_POINTER (menu_id)))) + g_dbus_menu_model_changed (proxy, items, position, removed, n_added); +} + +static GDBusMenuGroup * +g_dbus_menu_group_get_from_path (GDBusMenuPath *path, + guint group_id) +{ + GDBusMenuGroup *group; + + group = g_hash_table_lookup (path->groups, GINT_TO_POINTER (group_id)); + + if (group == NULL) + { + group = g_slice_new (GDBusMenuGroup); + group->path = g_dbus_menu_path_ref (path); + group->id = group_id; + group->proxies = g_hash_table_new (NULL, NULL); + group->menus = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_sequence_free); + group->state = GROUP_OFFLINE; + group->active = 0; + group->ref_count = 0; + + g_hash_table_insert (path->groups, GINT_TO_POINTER (group->id), group); + } + + return g_dbus_menu_group_ref (group); +} + +static GDBusMenuGroup * +g_dbus_menu_group_get (GMainContext *context, + GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path, + guint group_id) +{ + GDBusMenuGroup *group; + GDBusMenuPath *path; + + path = g_dbus_menu_path_get (context, connection, bus_name, object_path); + group = g_dbus_menu_group_get_from_path (path, group_id); + g_dbus_menu_path_unref (path); + + return group; +} + +/* GDBusMenuModel {{{1 */ + +typedef GMenuModelClass GDBusMenuModelClass; +struct _GDBusMenuModel +{ + GMenuModel parent; + + GDBusMenuGroup *group; + guint id; + + GSequence *items; /* unowned */ + gboolean active; +}; + +G_DEFINE_TYPE (GDBusMenuModel, g_dbus_menu_model, G_TYPE_MENU_MODEL) + +static gboolean +g_dbus_menu_model_is_mutable (GMenuModel *model) +{ + return TRUE; +} + +static gint +g_dbus_menu_model_get_n_items (GMenuModel *model) +{ + GDBusMenuModel *proxy = G_DBUS_MENU_MODEL (model); + + if (!proxy->active) + { + g_dbus_menu_group_activate (proxy->group); + proxy->active = TRUE; + } + + return proxy->items ? g_sequence_get_length (proxy->items) : 0; +} + +static void +g_dbus_menu_model_get_item_attributes (GMenuModel *model, + gint item_index, + GHashTable **table) +{ + GDBusMenuModel *proxy = G_DBUS_MENU_MODEL (model); + GDBusMenuModelItem *item; + GSequenceIter *iter; + + g_return_if_fail (proxy->active); + g_return_if_fail (proxy->items); + + iter = g_sequence_get_iter_at_pos (proxy->items, item_index); + g_return_if_fail (iter); + + item = g_sequence_get (iter); + g_return_if_fail (item); + + *table = g_hash_table_ref (item->attributes); +} + +static void +g_dbus_menu_model_get_item_links (GMenuModel *model, + gint item_index, + GHashTable **table) +{ + GDBusMenuModel *proxy = G_DBUS_MENU_MODEL (model); + GDBusMenuModelItem *item; + GSequenceIter *iter; + + g_return_if_fail (proxy->active); + g_return_if_fail (proxy->items); + + iter = g_sequence_get_iter_at_pos (proxy->items, item_index); + g_return_if_fail (iter); + + item = g_sequence_get (iter); + g_return_if_fail (item); + + *table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + + { + GHashTableIter tmp; + gpointer key; + gpointer value; + + g_hash_table_iter_init (&tmp, item->links); + while (g_hash_table_iter_next (&tmp, &key, &value)) + { + if (g_variant_is_of_type (value, G_VARIANT_TYPE ("(uu)"))) + { + guint group_id, menu_id; + GDBusMenuGroup *group; + GDBusMenuModel *link; + + g_variant_get (value, "(uu)", &group_id, &menu_id); + + /* save the hash lookup in a relatively common case */ + if (proxy->group->id != group_id) + group = g_dbus_menu_group_get_from_path (proxy->group->path, group_id); + else + group = g_dbus_menu_group_ref (proxy->group); + + link = g_dbus_menu_model_get_from_group (group, menu_id); + + g_hash_table_insert (*table, g_strdup (key), link); + + g_dbus_menu_group_unref (group); + } + } + } +} + +static void +g_dbus_menu_model_finalize (GObject *object) +{ + GDBusMenuModel *proxy = G_DBUS_MENU_MODEL (object); + + if (proxy->active) + g_dbus_menu_group_deactivate (proxy->group); + + g_hash_table_remove (proxy->group->proxies, GINT_TO_POINTER (proxy->id)); + g_dbus_menu_group_unref (proxy->group); + + G_OBJECT_CLASS (g_dbus_menu_model_parent_class) + ->finalize (object); +} + +static void +g_dbus_menu_model_init (GDBusMenuModel *proxy) +{ +} + +static void +g_dbus_menu_model_class_init (GDBusMenuModelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + class->is_mutable = g_dbus_menu_model_is_mutable; + class->get_n_items = g_dbus_menu_model_get_n_items; + class->get_item_attributes = g_dbus_menu_model_get_item_attributes; + class->get_item_links = g_dbus_menu_model_get_item_links; + + object_class->finalize = g_dbus_menu_model_finalize; +} + +static void +g_dbus_menu_model_changed (GDBusMenuModel *proxy, + GSequence *items, + gint position, + gint removed, + gint added) +{ + proxy->items = items; + + if (proxy->active && (removed || added)) + g_menu_model_items_changed (G_MENU_MODEL (proxy), position, removed, added); +} + +static GDBusMenuModel * +g_dbus_menu_model_get_from_group (GDBusMenuGroup *group, + guint menu_id) +{ + GDBusMenuModel *proxy; + + proxy = g_hash_table_lookup (group->proxies, GINT_TO_POINTER (menu_id)); + if (proxy) + g_object_ref (proxy); + + if (proxy == NULL) + { + proxy = g_object_new (G_TYPE_DBUS_MENU_MODEL, NULL); + proxy->items = g_hash_table_lookup (group->menus, GINT_TO_POINTER (menu_id)); + g_hash_table_insert (group->proxies, GINT_TO_POINTER (menu_id), proxy); + proxy->group = g_dbus_menu_group_ref (group); + proxy->id = menu_id; + } + + return proxy; +} + +/** + * g_dbus_menu_model_get: + * @connection: a #GDBusConnection + * @bus_name: the bus name which exports the menu model + * @object_path: the object path at which the menu model is exported + * + * Obtains a #GDBusMenuModel for the menu model which is exported + * at the given @bus_name and @object_path. + * + * The thread default main context is taken at the time of this call. + * All signals on the menu model (and any linked models) are reported + * with respect to this context. All calls on the returned menu model + * (and linked models) must also originate from this same context, with + * the thread default main context unchanged. + * + * Returns: (transfer full): a #GDBusMenuModel object. Free with + * g_object_unref(). + * + * Since: 2.32 + */ +GDBusMenuModel * +g_dbus_menu_model_get (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path) +{ + GDBusMenuGroup *group; + GDBusMenuModel *proxy; + GMainContext *context; + + context = g_main_context_get_thread_default (); + if (context == NULL) + context = g_main_context_default (); + + group = g_dbus_menu_group_get (context, connection, bus_name, object_path, 0); + proxy = g_dbus_menu_model_get_from_group (group, 0); + g_dbus_menu_group_unref (group); + + return proxy; +} + +#if 0 +static void +dump_proxy (gpointer key, gpointer value, gpointer data) +{ + GDBusMenuModel *proxy = value; + + g_print (" menu %d refcount %d active %d\n", + proxy->id, G_OBJECT (proxy)->ref_count, proxy->active); +} + +static void +dump_group (gpointer key, gpointer value, gpointer data) +{ + GDBusMenuGroup *group = value; + + g_print (" group %d refcount %d state %d active %d\n", + group->id, group->ref_count, group->state, group->active); + + g_hash_table_foreach (group->proxies, dump_proxy, NULL); +} + +static void +dump_path (gpointer key, gpointer value, gpointer data) +{ + PathIdentifier *pid = key; + GDBusMenuPath *path = value; + + g_print ("%s active %d\n", pid->object_path, path->active); + g_hash_table_foreach (path->groups, dump_group, NULL); +} + +void +g_dbus_menu_model_dump (void) +{ + g_hash_table_foreach (g_dbus_menu_paths, dump_path, NULL); +} + +#endif + +/* Epilogue {{{1 */ +/* vim:set foldmethod=marker: */ diff --git a/gio/gdbusmenumodel.h b/gio/gdbusmenumodel.h new file mode 100644 index 0000000..e0ec520 --- /dev/null +++ b/gio/gdbusmenumodel.h @@ -0,0 +1,47 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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_DBUS_MENU_MODEL_H__ +#define __G_DBUS_MENU_MODEL_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_MENU_MODEL (g_dbus_menu_model_get_type ()) +#define G_DBUS_MENU_MODEL(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_DBUS_MENU_MODEL, GDBusMenuModel)) +#define G_IS_DBUS_MENU_MODEL(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_DBUS_MENU_MODEL)) + +typedef struct _GDBusMenuModel GDBusMenuModel; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_menu_model_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GDBusMenuModel * g_dbus_menu_model_get (GDBusConnection *connection, + const gchar *bus_name, + const gchar *object_path); + +G_END_DECLS + +#endif /* __G_DBUS_MENU_MODEL_H__ */ diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c new file mode 100644 index 0000000..9181029 --- /dev/null +++ b/gio/gdbusmessage.c @@ -0,0 +1,3621 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +/* Uncomment to debug serializer code */ +/* #define DEBUG_SERIALIZER */ + +#include "config.h" + +#include +#include +#include +#include +#ifdef HAVE_SYS_MKDEV_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gdbusutils.h" +#include "gdbusmessage.h" +#include "gdbuserror.h" +#include "gioenumtypes.h" +#include "ginputstream.h" +#include "gdatainputstream.h" +#include "gmemoryinputstream.h" +#include "goutputstream.h" +#include "gdataoutputstream.h" +#include "gmemoryoutputstream.h" +#include "gseekable.h" +#include "gioerror.h" +#include "gdbusprivate.h" + +#ifdef G_OS_UNIX +#include "gunixfdlist.h" +#endif + +#include "glibintl.h" + +typedef struct _GMemoryBuffer GMemoryBuffer; +struct _GMemoryBuffer +{ + gsize len; + gsize valid_len; + gsize pos; + gchar *data; + GDataStreamByteOrder byte_order; +}; + +static guchar +g_memory_buffer_read_byte (GMemoryBuffer *mbuf, + GError **error) +{ + if (mbuf->pos >= mbuf->valid_len) + return 0; + return mbuf->data [mbuf->pos++]; +} + +static gint16 +g_memory_buffer_read_int16 (GMemoryBuffer *mbuf, + GError **error) +{ + gint16 v; + + if (mbuf->pos > mbuf->valid_len - 2) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 2); + mbuf->pos += 2; + switch (mbuf->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; +} + +static guint16 +g_memory_buffer_read_uint16 (GMemoryBuffer *mbuf, + GError **error) +{ + guint16 v; + + if (mbuf->pos > mbuf->valid_len - 2) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 2); + mbuf->pos += 2; + switch (mbuf->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; +} + +static gint32 +g_memory_buffer_read_int32 (GMemoryBuffer *mbuf, + GError **error) +{ + gint32 v; + + if (mbuf->pos > mbuf->valid_len - 4) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 4); + mbuf->pos += 4; + switch (mbuf->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; +} + +static guint32 +g_memory_buffer_read_uint32 (GMemoryBuffer *mbuf, + GError **error) +{ + guint32 v; + + if (mbuf->pos > mbuf->valid_len - 4) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 4); + mbuf->pos += 4; + switch (mbuf->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; +} + +static gint64 +g_memory_buffer_read_int64 (GMemoryBuffer *mbuf, + GError **error) +{ + gint64 v; + + if (mbuf->pos > mbuf->valid_len - 8) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 8); + mbuf->pos += 8; + switch (mbuf->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; +} + +static guint64 +g_memory_buffer_read_uint64 (GMemoryBuffer *mbuf, + GError **error) +{ + guint64 v; + + if (mbuf->pos > mbuf->valid_len - 8) + { + mbuf->pos = mbuf->valid_len; + return 0; + } + + memcpy (&v, mbuf->data + mbuf->pos, 8); + mbuf->pos += 8; + switch (mbuf->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; +} + +#define MIN_ARRAY_SIZE 128 + +static gint +g_nearest_pow (gint num) +{ + gint n = 1; + + while (n < num) + n <<= 1; + + return n; +} + +static void +array_resize (GMemoryBuffer *mbuf, + gsize size) +{ + gpointer data; + gsize len; + + if (mbuf->len == size) + return; + + len = mbuf->len; + data = g_realloc (mbuf->data, size); + + if (size > len) + memset ((guint8 *)data + len, 0, size - len); + + mbuf->data = data; + mbuf->len = size; + + if (mbuf->len < mbuf->valid_len) + mbuf->valid_len = mbuf->len; +} + +static gboolean +g_memory_buffer_write (GMemoryBuffer *mbuf, + const void *buffer, + gsize count) +{ + guint8 *dest; + gsize new_size; + + if (count == 0) + return TRUE; + + /* Check for address space overflow, but only if the buffer is resizable. + Otherwise we just do a short write and don't worry. */ + if (mbuf->pos + count < mbuf->pos) + return FALSE; + + if (mbuf->pos + count > mbuf->len) + { + /* At least enought to fit the write, rounded up + for greater than linear growth. + TODO: This wastes a lot of memory at large buffer sizes. + Figure out a more rational allocation strategy. */ + new_size = g_nearest_pow (mbuf->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 < mbuf->len) + return FALSE; + + new_size = MAX (new_size, MIN_ARRAY_SIZE); + array_resize (mbuf, new_size); + } + + dest = (guint8 *)mbuf->data + mbuf->pos; + memcpy (dest, buffer, count); + mbuf->pos += count; + + if (mbuf->pos > mbuf->valid_len) + mbuf->valid_len = mbuf->pos; + + return TRUE; +} + +static gboolean +g_memory_buffer_put_byte (GMemoryBuffer *mbuf, + guchar data) +{ + return g_memory_buffer_write (mbuf, &data, 1); +} + +static gboolean +g_memory_buffer_put_int16 (GMemoryBuffer *mbuf, + gint16 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 2); +} + +static gboolean +g_memory_buffer_put_uint16 (GMemoryBuffer *mbuf, + guint16 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 2); +} + +static gboolean +g_memory_buffer_put_int32 (GMemoryBuffer *mbuf, + gint32 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 4); +} + +static gboolean +g_memory_buffer_put_uint32 (GMemoryBuffer *mbuf, + guint32 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 4); +} + +static gboolean +g_memory_buffer_put_int64 (GMemoryBuffer *mbuf, + gint64 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 8); +} + +static gboolean +g_memory_buffer_put_uint64 (GMemoryBuffer *mbuf, + guint64 data) +{ + switch (mbuf->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_memory_buffer_write (mbuf, &data, 8); +} + +static gboolean +g_memory_buffer_put_string (GMemoryBuffer *mbuf, + const char *str) +{ + g_return_val_if_fail (str != NULL, FALSE); + + return g_memory_buffer_write (mbuf, str, strlen (str)); +} + + +/** + * SECTION:gdbusmessage + * @short_description: D-Bus Message + * @include: gio/gio.h + * + * A type for representing D-Bus messages that can be sent or received + * on a #GDBusConnection. + */ + +typedef struct _GDBusMessageClass GDBusMessageClass; + +/** + * GDBusMessageClass: + * + * Class structure for #GDBusMessage. + * + * Since: 2.26 + */ +struct _GDBusMessageClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +/** + * GDBusMessage: + * + * The #GDBusMessage structure contains only private data and should + * only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusMessage +{ + /*< private >*/ + GObject parent_instance; + + GDBusMessageType type; + GDBusMessageFlags flags; + gboolean locked; + GDBusMessageByteOrder byte_order; + guchar major_protocol_version; + guint32 serial; + GHashTable *headers; + GVariant *body; +#ifdef G_OS_UNIX + GUnixFDList *fd_list; +#endif +}; + +enum +{ + PROP_0, + PROP_LOCKED +}; + +G_DEFINE_TYPE (GDBusMessage, g_dbus_message, G_TYPE_OBJECT); + +static void +g_dbus_message_finalize (GObject *object) +{ + GDBusMessage *message = G_DBUS_MESSAGE (object); + + if (message->headers != NULL) + g_hash_table_unref (message->headers); + if (message->body != NULL) + g_variant_unref (message->body); +#ifdef G_OS_UNIX + if (message->fd_list != NULL) + g_object_unref (message->fd_list); +#endif + + if (G_OBJECT_CLASS (g_dbus_message_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_dbus_message_parent_class)->finalize (object); +} + +static void +g_dbus_message_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusMessage *message = G_DBUS_MESSAGE (object); + + switch (prop_id) + { + case PROP_LOCKED: + g_value_set_boolean (value, g_dbus_message_get_locked (message)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_message_class_init (GDBusMessageClass *klass) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = g_dbus_message_finalize; + gobject_class->get_property = g_dbus_message_get_property; + + /** + * GDBusConnection:locked: + * + * A boolean specifying whether the message is locked. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_LOCKED, + g_param_spec_boolean ("locked", + P_("Locked"), + P_("Whether the message is locked"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); +} + +static void +g_dbus_message_init (GDBusMessage *message) +{ + /* Any D-Bus implementation is supposed to handle both Big and + * Little Endian encodings and the Endianness is part of the D-Bus + * message - we prefer to use Big Endian (since it's Network Byte + * Order and just easier to read for humans) but if the machine is + * Little Endian we use that for performance reasons. + */ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + message->byte_order = G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN; +#else + /* this could also be G_PDP_ENDIAN */ + message->byte_order = G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN; +#endif + message->headers = g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + (GDestroyNotify) g_variant_unref); +} + +/** + * g_dbus_message_new: + * + * Creates a new empty #GDBusMessage. + * + * Returns: A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new (void) +{ + return g_object_new (G_TYPE_DBUS_MESSAGE, NULL); +} + +/** + * g_dbus_message_new_method_call: + * @name: (allow-none): A valid D-Bus name or %NULL. + * @path: A valid object path. + * @interface_: (allow-none): A valid D-Bus interface name or %NULL. + * @method: A valid method name. + * + * Creates a new #GDBusMessage for a method call. + * + * Returns: A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_method_call (const gchar *name, + const gchar *path, + const gchar *interface_, + const gchar *method) +{ + GDBusMessage *message; + + g_return_val_if_fail (name == NULL || g_dbus_is_name (name), NULL); + g_return_val_if_fail (g_variant_is_object_path (path), NULL); + g_return_val_if_fail (g_dbus_is_member_name (method), NULL); + g_return_val_if_fail (interface_ == NULL || g_dbus_is_interface_name (interface_), NULL); + + message = g_dbus_message_new (); + message->type = G_DBUS_MESSAGE_TYPE_METHOD_CALL; + + if (name != NULL) + g_dbus_message_set_destination (message, name); + g_dbus_message_set_path (message, path); + g_dbus_message_set_member (message, method); + if (interface_ != NULL) + g_dbus_message_set_interface (message, interface_); + + return message; +} + +/** + * g_dbus_message_new_signal: + * @path: A valid object path. + * @interface_: A valid D-Bus interface name. + * @signal: A valid signal name. + * + * Creates a new #GDBusMessage for a signal emission. + * + * Returns: A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_signal (const gchar *path, + const gchar *interface_, + const gchar *signal) +{ + GDBusMessage *message; + + g_return_val_if_fail (g_variant_is_object_path (path), NULL); + g_return_val_if_fail (g_dbus_is_member_name (signal), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_), NULL); + + message = g_dbus_message_new (); + message->type = G_DBUS_MESSAGE_TYPE_SIGNAL; + message->flags = G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED; + + g_dbus_message_set_path (message, path); + g_dbus_message_set_member (message, signal); + g_dbus_message_set_interface (message, interface_); + + return message; +} + + +/** + * g_dbus_message_new_method_reply: + * @method_call_message: A message of type %G_DBUS_MESSAGE_TYPE_METHOD_CALL to + * create a reply message to. + * + * Creates a new #GDBusMessage that is a reply to @method_call_message. + * + * Returns: (transfer full): #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_method_reply (GDBusMessage *method_call_message) +{ + GDBusMessage *message; + const gchar *sender; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (method_call_message), NULL); + g_return_val_if_fail (g_dbus_message_get_message_type (method_call_message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL, NULL); + g_return_val_if_fail (g_dbus_message_get_serial (method_call_message) != 0, NULL); + + message = g_dbus_message_new (); + message->type = G_DBUS_MESSAGE_TYPE_METHOD_RETURN; + message->flags = G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED; + /* reply with same endianness */ + message->byte_order = method_call_message->byte_order; + + g_dbus_message_set_reply_serial (message, g_dbus_message_get_serial (method_call_message)); + sender = g_dbus_message_get_sender (method_call_message); + if (sender != NULL) + g_dbus_message_set_destination (message, sender); + + return message; +} + +/** + * g_dbus_message_new_method_error: + * @method_call_message: A message of type %G_DBUS_MESSAGE_TYPE_METHOD_CALL to + * create a reply message to. + * @error_name: A valid D-Bus error name. + * @error_message_format: The D-Bus error message in a printf() format. + * @...: Arguments for @error_message_format. + * + * Creates a new #GDBusMessage that is an error reply to @method_call_message. + * + * Returns: (transfer full): A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_method_error (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message_format, + ...) +{ + GDBusMessage *ret; + va_list var_args; + + va_start (var_args, error_message_format); + ret = g_dbus_message_new_method_error_valist (method_call_message, + error_name, + error_message_format, + var_args); + va_end (var_args); + + return ret; +} + +/** + * g_dbus_message_new_method_error_literal: + * @method_call_message: A message of type %G_DBUS_MESSAGE_TYPE_METHOD_CALL to + * create a reply message to. + * @error_name: A valid D-Bus error name. + * @error_message: The D-Bus error message. + * + * Creates a new #GDBusMessage that is an error reply to @method_call_message. + * + * Returns: (transfer full): A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_method_error_literal (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message) +{ + GDBusMessage *message; + const gchar *sender; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (method_call_message), NULL); + g_return_val_if_fail (g_dbus_message_get_message_type (method_call_message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL, NULL); + g_return_val_if_fail (g_dbus_message_get_serial (method_call_message) != 0, NULL); + g_return_val_if_fail (g_dbus_is_name (error_name), NULL); + g_return_val_if_fail (error_message != NULL, NULL); + + message = g_dbus_message_new (); + message->type = G_DBUS_MESSAGE_TYPE_ERROR; + message->flags = G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED; + /* reply with same endianness */ + message->byte_order = method_call_message->byte_order; + + g_dbus_message_set_reply_serial (message, g_dbus_message_get_serial (method_call_message)); + g_dbus_message_set_error_name (message, error_name); + g_dbus_message_set_body (message, g_variant_new ("(s)", error_message)); + + sender = g_dbus_message_get_sender (method_call_message); + if (sender != NULL) + g_dbus_message_set_destination (message, sender); + + return message; +} + +/** + * g_dbus_message_new_method_error_valist: + * @method_call_message: A message of type %G_DBUS_MESSAGE_TYPE_METHOD_CALL to + * create a reply message to. + * @error_name: A valid D-Bus error name. + * @error_message_format: The D-Bus error message in a printf() format. + * @var_args: Arguments for @error_message_format. + * + * Like g_dbus_message_new_method_error() but intended for language bindings. + * + * Returns: (transfer full): A #GDBusMessage. Free with g_object_unref(). + * + * Since: 2.26 + */ +G_GNUC_PRINTF(3, 0) +GDBusMessage * +g_dbus_message_new_method_error_valist (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message_format, + va_list var_args) +{ + GDBusMessage *ret; + gchar *error_message; + error_message = g_strdup_vprintf (error_message_format, var_args); + ret = g_dbus_message_new_method_error_literal (method_call_message, + error_name, + error_message); + g_free (error_message); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_byte_order: + * @message: A #GDBusMessage. + * + * Gets the byte order of @message. + * + * Returns: The byte order. + */ +GDBusMessageByteOrder +g_dbus_message_get_byte_order (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), (GDBusMessageByteOrder) 0); + return message->byte_order; +} + +/** + * g_dbus_message_set_byte_order: + * @message: A #GDBusMessage. + * @byte_order: The byte order. + * + * Sets the byte order of @message. + */ +void +g_dbus_message_set_byte_order (GDBusMessage *message, + GDBusMessageByteOrder byte_order) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + message->byte_order = byte_order; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* TODO: need GI annotations to specify that any guchar value goes for the type */ + +/** + * g_dbus_message_get_message_type: + * @message: A #GDBusMessage. + * + * Gets the type of @message. + * + * Returns: A 8-bit unsigned integer (typically a value from the #GDBusMessageType enumeration). + * + * Since: 2.26 + */ +GDBusMessageType +g_dbus_message_get_message_type (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), G_DBUS_MESSAGE_TYPE_INVALID); + return message->type; +} + +/** + * g_dbus_message_set_message_type: + * @message: A #GDBusMessage. + * @type: A 8-bit unsigned integer (typically a value from the #GDBusMessageType enumeration). + * + * Sets @message to be of @type. + * + * Since: 2.26 + */ +void +g_dbus_message_set_message_type (GDBusMessage *message, + GDBusMessageType type) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (type >=0 && type < 256); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + message->type = type; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* TODO: need GI annotations to specify that any guchar value goes for flags */ + +/** + * g_dbus_message_get_flags: + * @message: A #GDBusMessage. + * + * Gets the flags for @message. + * + * Returns: Flags that are set (typically values from the #GDBusMessageFlags enumeration bitwise ORed together). + * + * Since: 2.26 + */ +GDBusMessageFlags +g_dbus_message_get_flags (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), G_DBUS_MESSAGE_FLAGS_NONE); + return message->flags; +} + +/** + * g_dbus_message_set_flags: + * @message: A #GDBusMessage. + * @flags: Flags for @message that are set (typically values from the #GDBusMessageFlags + * enumeration bitwise ORed together). + * + * Sets the flags to set on @message. + * + * Since: 2.26 + */ +void +g_dbus_message_set_flags (GDBusMessage *message, + GDBusMessageFlags flags) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (flags >=0 && flags < 256); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + message->flags = flags; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_serial: + * @message: A #GDBusMessage. + * + * Gets the serial for @message. + * + * Returns: A #guint32. + * + * Since: 2.26 + */ +guint32 +g_dbus_message_get_serial (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), 0); + return message->serial; +} + +/** + * g_dbus_message_set_serial: + * @message: A #GDBusMessage. + * @serial: A #guint32. + * + * Sets the serial for @message. + * + * Since: 2.26 + */ +void +g_dbus_message_set_serial (GDBusMessage *message, + guint32 serial) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + message->serial = serial; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* TODO: need GI annotations to specify that any guchar value goes for header_field */ + +/** + * g_dbus_message_get_header: + * @message: A #GDBusMessage. + * @header_field: A 8-bit unsigned integer (typically a value from the #GDBusMessageHeaderField enumeration) + * + * Gets a header field on @message. + * + * Returns: A #GVariant with the value if the header was found, %NULL + * otherwise. Do not free, it is owned by @message. + * + * Since: 2.26 + */ +GVariant * +g_dbus_message_get_header (GDBusMessage *message, + GDBusMessageHeaderField header_field) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + g_return_val_if_fail (header_field >=0 && header_field < 256, NULL); + return g_hash_table_lookup (message->headers, GUINT_TO_POINTER (header_field)); +} + +/** + * g_dbus_message_set_header: + * @message: A #GDBusMessage. + * @header_field: A 8-bit unsigned integer (typically a value from the #GDBusMessageHeaderField enumeration) + * @value: (allow-none): A #GVariant to set the header field or %NULL to clear the header field. + * + * Sets a header field on @message. + * + * If @value is floating, @message assumes ownership of @value. + * + * Since: 2.26 + */ +void +g_dbus_message_set_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + GVariant *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (header_field >=0 && header_field < 256); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + if (value == NULL) + { + g_hash_table_remove (message->headers, GUINT_TO_POINTER (header_field)); + } + else + { + g_hash_table_insert (message->headers, GUINT_TO_POINTER (header_field), g_variant_ref_sink (value)); + } +} + +/** + * g_dbus_message_get_header_fields: + * @message: A #GDBusMessage. + * + * Gets an array of all header fields on @message that are set. + * + * Returns: (array zero-terminated=1): An array of header fields + * terminated by %G_DBUS_MESSAGE_HEADER_FIELD_INVALID. Each element + * is a #guchar. Free with g_free(). + * + * Since: 2.26 + */ +guchar * +g_dbus_message_get_header_fields (GDBusMessage *message) +{ + GList *keys; + guchar *ret; + guint num_keys; + GList *l; + guint n; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + + keys = g_hash_table_get_keys (message->headers); + num_keys = g_list_length (keys); + ret = g_new (guchar, num_keys + 1); + for (l = keys, n = 0; l != NULL; l = l->next, n++) + ret[n] = GPOINTER_TO_UINT (l->data); + g_assert (n == num_keys); + ret[n] = G_DBUS_MESSAGE_HEADER_FIELD_INVALID; + g_list_free (keys); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_body: + * @message: A #GDBusMessage. + * + * Gets the body of a message. + * + * Returns: A #GVariant or %NULL if the body is empty. Do not free, it is owned by @message. + * + * Since: 2.26 + */ +GVariant * +g_dbus_message_get_body (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return message->body; +} + +/** + * g_dbus_message_set_body: + * @message: A #GDBusMessage. + * @body: Either %NULL or a #GVariant that is a tuple. + * + * Sets the body @message. As a side-effect the + * %G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE header field is set to the + * type string of @body (or cleared if @body is %NULL). + * + * If @body is floating, @message assumes ownership of @body. + * + * Since: 2.26 + */ +void +g_dbus_message_set_body (GDBusMessage *message, + GVariant *body) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail ((body == NULL) || g_variant_is_of_type (body, G_VARIANT_TYPE_TUPLE)); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + if (message->body != NULL) + g_variant_unref (message->body); + if (body == NULL) + { + message->body = NULL; + g_dbus_message_set_signature (message, NULL); + } + else + { + const gchar *type_string; + gsize type_string_len; + gchar *signature; + + message->body = g_variant_ref_sink (body); + + type_string = g_variant_get_type_string (body); + type_string_len = strlen (type_string); + g_assert (type_string_len >= 2); + signature = g_strndup (type_string + 1, type_string_len - 2); + g_dbus_message_set_signature (message, signature); + g_free (signature); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX +/** + * g_dbus_message_get_unix_fd_list: + * @message: A #GDBusMessage. + * + * Gets the UNIX file descriptors associated with @message, if any. + * + * This method is only available on UNIX. + * + * Returns: (transfer none):A #GUnixFDList or %NULL if no file descriptors are + * associated. Do not free, this object is owned by @message. + * + * Since: 2.26 + */ +GUnixFDList * +g_dbus_message_get_unix_fd_list (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return message->fd_list; +} + +/** + * g_dbus_message_set_unix_fd_list: + * @message: A #GDBusMessage. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * + * Sets the UNIX file descriptors associated with @message. As a + * side-effect the %G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS header + * field is set to the number of fds in @fd_list (or cleared if + * @fd_list is %NULL). + * + * This method is only available on UNIX. + * + * Since: 2.26 + */ +void +g_dbus_message_set_unix_fd_list (GDBusMessage *message, + GUnixFDList *fd_list) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (fd_list == NULL || G_IS_UNIX_FD_LIST (fd_list)); + + if (message->locked) + { + g_warning ("%s: Attempted to modify a locked message", G_STRFUNC); + return; + } + + if (message->fd_list != NULL) + g_object_unref (message->fd_list); + if (fd_list != NULL) + { + message->fd_list = g_object_ref (fd_list); + g_dbus_message_set_num_unix_fds (message, g_unix_fd_list_get_length (fd_list)); + } + else + { + message->fd_list = NULL; + g_dbus_message_set_num_unix_fds (message, 0); + } +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +validate_headers (GDBusMessage *message, + GError **error) +{ + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + + switch (message->type) + { + case G_DBUS_MESSAGE_TYPE_INVALID: + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("type is INVALID")); + goto out; + break; + + case G_DBUS_MESSAGE_TYPE_METHOD_CALL: + if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH) == NULL || + g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER) == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("METHOD_CALL message: PATH or MEMBER header field is missing")); + goto out; + } + break; + + case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: + if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL) == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("METHOD_RETURN message: REPLY_SERIAL header field is missing")); + goto out; + } + break; + + case G_DBUS_MESSAGE_TYPE_ERROR: + if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME) == NULL || + g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL) == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing")); + goto out; + } + break; + + case G_DBUS_MESSAGE_TYPE_SIGNAL: + if (g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH) == NULL || + g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE) == NULL || + g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER) == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: PATH, INTERFACE or MEMBER header field is missing")); + goto out; + } + if (g_strcmp0 (g_dbus_message_get_path (message), "/org/freedesktop/DBus/Local") == 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local")); + goto out; + } + if (g_strcmp0 (g_dbus_message_get_interface (message), "org.freedesktop.DBus.Local") == 0) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local")); + goto out; + } + break; + + default: + /* hitherto unknown type - nothing to check */ + break; + } + + ret = TRUE; + + out: + g_assert (ret || (error == NULL || *error != NULL)); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +ensure_input_padding (GMemoryBuffer *buf, + gsize padding_size, + GError **error) +{ + gsize offset; + gsize wanted_offset; + + offset = buf->pos; + wanted_offset = ((offset + padding_size - 1) / padding_size) * padding_size; + buf->pos = wanted_offset; + return TRUE; +} + +static const gchar * +read_string (GMemoryBuffer *mbuf, + gsize len, + GError **error) +{ + gchar *str; + const gchar *end_valid; + + if (mbuf->pos + len >= mbuf->valid_len || mbuf->pos + len < mbuf->pos) + { + mbuf->pos = mbuf->valid_len; + /* G_GSIZE_FORMAT doesn't work with gettext, so we use %lu */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + g_dngettext (GETTEXT_PACKAGE, + "Wanted to read %lu bytes but only got %lu", + "Wanted to read %lu byte but only got %lu", + (gulong)len), + (gulong)len, + (gulong)mbuf->valid_len - mbuf->pos); + mbuf->pos = mbuf->valid_len; + return NULL; + } + + if (mbuf->data[mbuf->pos + len] != '\0') + { + str = g_strndup (mbuf->data + mbuf->pos, len); + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Expected NUL byte after the string `%s' but found byte %d"), + str, mbuf->data[mbuf->pos + len]); + g_free (str); + mbuf->pos += len + 1; + return NULL; + } + + str = mbuf->data + mbuf->pos; + mbuf->pos += len + 1; + + if (!g_utf8_validate (str, -1, &end_valid)) + { + gint offset; + gchar *valid_str; + offset = (gint) (end_valid - str); + valid_str = g_strndup (str, offset); + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). " + "The valid UTF-8 string up until that point was `%s'"), + offset, + (gint) len, + valid_str); + g_free (valid_str); + return NULL; + } + + return str; +} + +/* if just_align==TRUE, don't read a value, just align the input stream wrt padding */ + +/* returns a non-floating GVariant! */ +static GVariant * +parse_value_from_blob (GMemoryBuffer *buf, + const GVariantType *type, + gboolean just_align, + guint indent, + GError **error) +{ + GVariant *ret; + GError *local_error; + gboolean is_leaf; + const gchar *type_string; + + type_string = g_variant_type_peek_string (type); + +#ifdef DEBUG_SERIALIZER + { + gchar *s; + s = g_variant_type_dup_string (type); + g_print ("%*s%s type %s from offset 0x%04x", + indent, "", + just_align ? "Aligning" : "Reading", + s, + (gint) g_seekable_tell (G_SEEKABLE (buf))); + g_free (s); + } +#endif /* DEBUG_SERIALIZER */ + + ret = NULL; + + is_leaf = TRUE; + local_error = NULL; + switch (type_string[0]) + { + case 'b': /* G_VARIANT_TYPE_BOOLEAN */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + gboolean v; + v = g_memory_buffer_read_uint32 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_boolean (v); + } + break; + + case 'y': /* G_VARIANT_TYPE_BYTE */ + if (!just_align) + { + guchar v; + v = g_memory_buffer_read_byte (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_byte (v); + } + break; + + case 'n': /* G_VARIANT_TYPE_INT16 */ + if (!ensure_input_padding (buf, 2, &local_error)) + goto fail; + if (!just_align) + { + gint16 v; + v = g_memory_buffer_read_int16 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_int16 (v); + } + break; + + case 'q': /* G_VARIANT_TYPE_UINT16 */ + if (!ensure_input_padding (buf, 2, &local_error)) + goto fail; + if (!just_align) + { + guint16 v; + v = g_memory_buffer_read_uint16 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_uint16 (v); + } + break; + + case 'i': /* G_VARIANT_TYPE_INT32 */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + gint32 v; + v = g_memory_buffer_read_int32 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_int32 (v); + } + break; + + case 'u': /* G_VARIANT_TYPE_UINT32 */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + guint32 v; + v = g_memory_buffer_read_uint32 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_uint32 (v); + } + break; + + case 'x': /* G_VARIANT_TYPE_INT64 */ + if (!ensure_input_padding (buf, 8, &local_error)) + goto fail; + if (!just_align) + { + gint64 v; + v = g_memory_buffer_read_int64 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_int64 (v); + } + break; + + case 't': /* G_VARIANT_TYPE_UINT64 */ + if (!ensure_input_padding (buf, 8, &local_error)) + goto fail; + if (!just_align) + { + guint64 v; + v = g_memory_buffer_read_uint64 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_uint64 (v); + } + break; + + case 'd': /* G_VARIANT_TYPE_DOUBLE */ + if (!ensure_input_padding (buf, 8, &local_error)) + goto fail; + if (!just_align) + { + union { + guint64 v_uint64; + gdouble v_double; + } u; + G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); + u.v_uint64 = g_memory_buffer_read_uint64 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_double (u.v_double); + } + break; + + case 's': /* G_VARIANT_TYPE_STRING */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + guint32 len; + const gchar *v; + len = g_memory_buffer_read_uint32 (buf, &local_error); + if (local_error != NULL) + goto fail; + v = read_string (buf, (gsize) len, &local_error); + if (v == NULL) + goto fail; + ret = g_variant_new_string (v); + } + break; + + case 'o': /* G_VARIANT_TYPE_OBJECT_PATH */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + guint32 len; + const gchar *v; + len = g_memory_buffer_read_uint32 (buf, &local_error); + if (local_error != NULL) + goto fail; + v = read_string (buf, (gsize) len, &local_error); + if (v == NULL) + goto fail; + if (!g_variant_is_object_path (v)) + { + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Parsed value `%s' is not a valid D-Bus object path"), + v); + goto fail; + } + ret = g_variant_new_object_path (v); + } + break; + + case 'g': /* G_VARIANT_TYPE_SIGNATURE */ + if (!just_align) + { + guchar len; + const gchar *v; + len = g_memory_buffer_read_byte (buf, &local_error); + if (local_error != NULL) + goto fail; + v = read_string (buf, (gsize) len, &local_error); + if (v == NULL) + goto fail; + if (!g_variant_is_signature (v)) + { + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Parsed value `%s' is not a valid D-Bus signature"), + v); + goto fail; + } + ret = g_variant_new_signature (v); + } + break; + + case 'h': /* G_VARIANT_TYPE_HANDLE */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + if (!just_align) + { + gint32 v; + v = g_memory_buffer_read_int32 (buf, &local_error); + if (local_error != NULL) + goto fail; + ret = g_variant_new_handle (v); + } + break; + + case 'a': /* G_VARIANT_TYPE_ARRAY */ + if (!ensure_input_padding (buf, 4, &local_error)) + goto fail; + + /* If we are only aligning for this array type, it is the child type of + * another array, which is empty. So, we do not need to add padding for + * this nonexistent array's elements: we only need to align for this + * array itself (4 bytes). See + * . + */ + if (!just_align) + { + guint32 array_len; + goffset offset; + goffset target; + const GVariantType *element_type; + GVariantBuilder builder; + + array_len = g_memory_buffer_read_uint32 (buf, &local_error); + if (local_error != NULL) + goto fail; + + is_leaf = FALSE; +#ifdef DEBUG_SERIALIZER + g_print (": array spans 0x%04x bytes\n", array_len); +#endif /* DEBUG_SERIALIZER */ + + if (array_len > (2<<26)) + { + /* G_GUINT32_FORMAT doesn't work with gettext, so use u */ + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + g_dngettext (GETTEXT_PACKAGE, + "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB).", + "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB).", + array_len), + array_len); + goto fail; + } + + g_variant_builder_init (&builder, type); + element_type = g_variant_type_element (type); + + if (array_len == 0) + { + GVariant *item; + item = parse_value_from_blob (buf, + element_type, + TRUE, + indent + 2, + NULL); + g_assert (item == NULL); + } + else + { + /* TODO: optimize array of primitive types */ + offset = buf->pos; + target = offset + array_len; + while (offset < target) + { + GVariant *item; + item = parse_value_from_blob (buf, + element_type, + FALSE, + indent + 2, + &local_error); + if (item == NULL) + { + g_variant_builder_clear (&builder); + goto fail; + } + g_variant_builder_add_value (&builder, item); + g_variant_unref (item); + offset = buf->pos; + } + } + + ret = g_variant_builder_end (&builder); + } + break; + + default: + if (g_variant_type_is_dict_entry (type)) + { + const GVariantType *key_type; + const GVariantType *value_type; + GVariant *key; + GVariant *value; + + if (!ensure_input_padding (buf, 8, &local_error)) + goto fail; + + is_leaf = FALSE; +#ifdef DEBUG_SERIALIZER + g_print ("\n"); +#endif /* DEBUG_SERIALIZER */ + + if (!just_align) + { + key_type = g_variant_type_key (type); + key = parse_value_from_blob (buf, + key_type, + FALSE, + indent + 2, + &local_error); + if (key == NULL) + goto fail; + value_type = g_variant_type_value (type); + value = parse_value_from_blob (buf, + value_type, + FALSE, + indent + 2, + &local_error); + if (value == NULL) + { + g_variant_unref (key); + goto fail; + } + ret = g_variant_new_dict_entry (key, value); + g_variant_unref (key); + g_variant_unref (value); + } + } + else if (g_variant_type_is_tuple (type)) + { + if (!ensure_input_padding (buf, 8, &local_error)) + goto fail; + + is_leaf = FALSE; +#ifdef DEBUG_SERIALIZER + g_print ("\n"); +#endif /* DEBUG_SERIALIZER */ + + if (!just_align) + { + const GVariantType *element_type; + GVariantBuilder builder; + + g_variant_builder_init (&builder, type); + element_type = g_variant_type_first (type); + while (element_type != NULL) + { + GVariant *item; + item = parse_value_from_blob (buf, + element_type, + FALSE, + indent + 2, + &local_error); + if (item == NULL) + { + g_variant_builder_clear (&builder); + goto fail; + } + g_variant_builder_add_value (&builder, item); + g_variant_unref (item); + + element_type = g_variant_type_next (element_type); + } + ret = g_variant_builder_end (&builder); + } + } + else if (g_variant_type_is_variant (type)) + { + is_leaf = FALSE; +#ifdef DEBUG_SERIALIZER + g_print ("\n"); +#endif /* DEBUG_SERIALIZER */ + + if (!just_align) + { + guchar siglen; + const gchar *sig; + GVariantType *variant_type; + GVariant *value; + + siglen = g_memory_buffer_read_byte (buf, &local_error); + if (local_error != NULL) + goto fail; + sig = read_string (buf, (gsize) siglen, &local_error); + if (sig == NULL) + goto fail; + if (!g_variant_is_signature (sig)) + { + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Parsed value `%s' for variant is not a valid D-Bus signature"), + sig); + goto fail; + } + variant_type = g_variant_type_new (sig); + value = parse_value_from_blob (buf, + variant_type, + FALSE, + indent + 2, + &local_error); + g_variant_type_free (variant_type); + if (value == NULL) + goto fail; + ret = g_variant_new_variant (value); + g_variant_unref (value); + } + } + else + { + gchar *s; + s = g_variant_type_dup_string (type); + g_set_error (&local_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error deserializing GVariant with type string `%s' from the D-Bus wire format"), + s); + g_free (s); + goto fail; + } + break; + } + + g_assert ((just_align && ret == NULL) || (!just_align && ret != NULL)); + +#ifdef DEBUG_SERIALIZER + if (ret != NULL) + { + if (is_leaf) + { + gchar *s; + if (g_variant_type_equal (type, G_VARIANT_TYPE_BYTE)) + { + s = g_strdup_printf ("0x%02x '%c'", g_variant_get_byte (ret), g_variant_get_byte (ret)); + } + else + { + s = g_variant_print (ret, FALSE); + } + g_print (": %s\n", s); + g_free (s); + } + } +#else + is_leaf = is_leaf; /* To avoid -Wunused-but-set-variable */ +#endif /* DEBUG_SERIALIZER */ + + /* sink the reference */ + if (ret != NULL) + { + g_assert (g_variant_is_floating (ret)); + g_variant_ref_sink (ret); + } + return ret; + + fail: +#ifdef DEBUG_SERIALIZER + g_print ("\n" + "%*sFAILURE: %s (%s, %d)\n", + indent, "", + local_error->message, + g_quark_to_string (local_error->domain), + local_error->code); +#endif /* DEBUG_SERIALIZER */ + g_propagate_error (error, local_error); + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* message_header must be at least 16 bytes */ + +/** + * g_dbus_message_bytes_needed: + * @blob: (array length=blob_len) (element-type guint8): A blob represent a binary D-Bus message. + * @blob_len: The length of @blob (must be at least 16). + * @error: Return location for error or %NULL. + * + * Utility function to calculate how many bytes are needed to + * completely deserialize the D-Bus message stored at @blob. + * + * Returns: Number of bytes needed or -1 if @error is set (e.g. if + * @blob contains invalid data or not enough data is available to + * determine the size). + * + * Since: 2.26 + */ +gssize +g_dbus_message_bytes_needed (guchar *blob, + gsize blob_len, + GError **error) +{ + gssize ret; + + ret = -1; + + g_return_val_if_fail (blob != NULL, -1); + g_return_val_if_fail (error == NULL || *error == NULL, -1); + g_return_val_if_fail (blob_len >= 16, -1); + + if (blob[0] == 'l') + { + /* core header (12 bytes) + ARRAY of STRUCT of (BYTE,VARIANT) */ + ret = 12 + 4 + GUINT32_FROM_LE (((guint32 *) blob)[3]); + /* round up so it's a multiple of 8 */ + ret = 8 * ((ret + 7)/8); + /* finally add the body size */ + ret += GUINT32_FROM_LE (((guint32 *) blob)[1]); + } + else if (blob[0] == 'B') + { + /* core header (12 bytes) + ARRAY of STRUCT of (BYTE,VARIANT) */ + ret = 12 + 4 + GUINT32_FROM_BE (((guint32 *) blob)[3]); + /* round up so it's a multiple of 8 */ + ret = 8 * ((ret + 7)/8); + /* finally add the body size */ + ret += GUINT32_FROM_BE (((guint32 *) blob)[1]); + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "Unable to determine message blob length - given blob is malformed"); + } + + if (ret > (2<<27)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "Blob indicates that message exceeds maximum message length (128MiB)"); + ret = -1; + } + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_new_from_blob: + * @blob: (array length=blob_len) (element-type guint8): A blob represent a binary D-Bus message. + * @blob_len: The length of @blob. + * @capabilities: A #GDBusCapabilityFlags describing what protocol features are supported. + * @error: Return location for error or %NULL. + * + * Creates a new #GDBusMessage from the data stored at @blob. The byte + * order that the message was in can be retrieved using + * g_dbus_message_get_byte_order(). + * + * Returns: A new #GDBusMessage or %NULL if @error is set. Free with + * g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_new_from_blob (guchar *blob, + gsize blob_len, + GDBusCapabilityFlags capabilities, + GError **error) +{ + gboolean ret; + GMemoryBuffer mbuf; + GDBusMessage *message; + guchar endianness; + guchar major_protocol_version; + guint32 message_body_len; + GVariant *headers; + GVariant *item; + GVariantIter iter; + GVariant *signature; + + /* TODO: check against @capabilities */ + + ret = FALSE; + + g_return_val_if_fail (blob != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (blob_len >= 12, NULL); + + message = g_dbus_message_new (); + + memset (&mbuf, 0, sizeof (mbuf)); + mbuf.data = (gchar *)blob; + mbuf.len = mbuf.valid_len = blob_len; + + endianness = g_memory_buffer_read_byte (&mbuf, NULL); + switch (endianness) + { + case 'l': + mbuf.byte_order = G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN; + message->byte_order = G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN; + break; + case 'B': + mbuf.byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN; + message->byte_order = G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN; + break; + default: + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x"), + endianness); + goto out; + } + + message->type = g_memory_buffer_read_byte (&mbuf, NULL); + message->flags = g_memory_buffer_read_byte (&mbuf, NULL); + major_protocol_version = g_memory_buffer_read_byte (&mbuf, NULL); + if (major_protocol_version != 1) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Invalid major protocol version. Expected 1 but found %d"), + major_protocol_version); + goto out; + } + message_body_len = g_memory_buffer_read_uint32 (&mbuf, NULL); + message->serial = g_memory_buffer_read_uint32 (&mbuf, NULL); + +#ifdef DEBUG_SERIALIZER + g_print ("Parsing blob (blob_len = 0x%04x bytes)\n", (gint) blob_len); + { + gchar *s; + s = _g_dbus_hexdump ((const gchar *) blob, blob_len, 2); + g_print ("%s\n", s); + g_free (s); + } +#endif /* DEBUG_SERIALIZER */ + +#ifdef DEBUG_SERIALIZER + g_print ("Parsing headers (blob_len = 0x%04x bytes)\n", (gint) blob_len); +#endif /* DEBUG_SERIALIZER */ + headers = parse_value_from_blob (&mbuf, + G_VARIANT_TYPE ("a{yv}"), + FALSE, + 2, + error); + if (headers == NULL) + goto out; + g_variant_iter_init (&iter, headers); + while ((item = g_variant_iter_next_value (&iter)) != NULL) + { + guchar header_field; + GVariant *value; + g_variant_get (item, + "{yv}", + &header_field, + &value); + g_dbus_message_set_header (message, header_field, value); + g_variant_unref (value); + g_variant_unref (item); + } + g_variant_unref (headers); + + signature = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE); + if (signature != NULL) + { + const gchar *signature_str; + gsize signature_str_len; + + signature_str = g_variant_get_string (signature, &signature_str_len); + + /* signature but no body */ + if (message_body_len == 0 && signature_str_len > 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Signature header with signature `%s' found but message body is empty"), + signature_str); + goto out; + } + else if (signature_str_len > 0) + { + GVariantType *variant_type; + gchar *tupled_signature_str; + + if (!g_variant_is_signature (signature_str)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Parsed value `%s' is not a valid D-Bus signature (for body)"), + signature_str); + goto out; + } + tupled_signature_str = g_strdup_printf ("(%s)", signature_str); + variant_type = g_variant_type_new (tupled_signature_str); + g_free (tupled_signature_str); +#ifdef DEBUG_SERIALIZER + g_print ("Parsing body (blob_len = 0x%04x bytes)\n", (gint) blob_len); +#endif /* DEBUG_SERIALIZER */ + message->body = parse_value_from_blob (&mbuf, + variant_type, + FALSE, + 2, + error); + g_variant_type_free (variant_type); + if (message->body == NULL) + goto out; + } + } + else + { + /* no signature, this is only OK if the body is empty */ + if (message_body_len != 0) + { + /* G_GUINT32_FORMAT doesn't work with gettext, just use %u */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + g_dngettext (GETTEXT_PACKAGE, + "No signature header in message but the message body is %u byte", + "No signature header in message but the message body is %u bytes", + message_body_len), + message_body_len); + goto out; + } + } + + if (!validate_headers (message, error)) + { + g_prefix_error (error, _("Cannot deserialize message: ")); + goto out; + } + + ret = TRUE; + + out: + if (ret) + { + return message; + } + else + { + if (message != NULL) + g_object_unref (message); + return NULL; + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gsize +ensure_output_padding (GMemoryBuffer *mbuf, + gsize padding_size) +{ + gsize offset; + gsize wanted_offset; + gsize padding_needed; + guint n; + + offset = mbuf->pos; + wanted_offset = ((offset + padding_size - 1) / padding_size) * padding_size; + padding_needed = wanted_offset - offset; + + for (n = 0; n < padding_needed; n++) + g_memory_buffer_put_byte (mbuf, '\0'); + + return padding_needed; +} + +/* note that value can be NULL for e.g. empty arrays - type is never NULL */ +static gboolean +append_value_to_blob (GVariant *value, + const GVariantType *type, + GMemoryBuffer *mbuf, + gsize *out_padding_added, + GError **error) +{ + gsize padding_added; + const gchar *type_string; + + type_string = g_variant_type_peek_string (type); + + padding_added = 0; + + switch (type_string[0]) + { + case 'b': /* G_VARIANT_TYPE_BOOLEAN */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + gboolean v = g_variant_get_boolean (value); + g_memory_buffer_put_uint32 (mbuf, v); + } + break; + + case 'y': /* G_VARIANT_TYPE_BYTE */ + if (value != NULL) + { + guint8 v = g_variant_get_byte (value); + g_memory_buffer_put_byte (mbuf, v); + } + break; + + case 'n': /* G_VARIANT_TYPE_INT16 */ + padding_added = ensure_output_padding (mbuf, 2); + if (value != NULL) + { + gint16 v = g_variant_get_int16 (value); + g_memory_buffer_put_int16 (mbuf, v); + } + break; + + case 'q': /* G_VARIANT_TYPE_UINT16 */ + padding_added = ensure_output_padding (mbuf, 2); + if (value != NULL) + { + guint16 v = g_variant_get_uint16 (value); + g_memory_buffer_put_uint16 (mbuf, v); + } + break; + + case 'i': /* G_VARIANT_TYPE_INT32 */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + gint32 v = g_variant_get_int32 (value); + g_memory_buffer_put_int32 (mbuf, v); + } + break; + + case 'u': /* G_VARIANT_TYPE_UINT32 */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + guint32 v = g_variant_get_uint32 (value); + g_memory_buffer_put_uint32 (mbuf, v); + } + break; + + case 'x': /* G_VARIANT_TYPE_INT64 */ + padding_added = ensure_output_padding (mbuf, 8); + if (value != NULL) + { + gint64 v = g_variant_get_int64 (value); + g_memory_buffer_put_int64 (mbuf, v); + } + break; + + case 't': /* G_VARIANT_TYPE_UINT64 */ + padding_added = ensure_output_padding (mbuf, 8); + if (value != NULL) + { + guint64 v = g_variant_get_uint64 (value); + g_memory_buffer_put_uint64 (mbuf, v); + } + break; + + case 'd': /* G_VARIANT_TYPE_DOUBLE */ + padding_added = ensure_output_padding (mbuf, 8); + if (value != NULL) + { + union { + guint64 v_uint64; + gdouble v_double; + } u; + G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); + u.v_double = g_variant_get_double (value); + g_memory_buffer_put_uint64 (mbuf, u.v_uint64); + } + break; + + case 's': /* G_VARIANT_TYPE_STRING */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + gsize len; + const gchar *v; + const gchar *end; + v = g_variant_get_string (value, &len); + g_assert (g_utf8_validate (v, -1, &end) && (end == v + len)); + g_memory_buffer_put_uint32 (mbuf, len); + g_memory_buffer_put_string (mbuf, v); + g_memory_buffer_put_byte (mbuf, '\0'); + } + break; + + case 'o': /* G_VARIANT_TYPE_OBJECT_PATH */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + gsize len; + const gchar *v = g_variant_get_string (value, &len); + g_assert (g_variant_is_object_path (v)); + g_memory_buffer_put_uint32 (mbuf, len); + g_memory_buffer_put_string (mbuf, v); + g_memory_buffer_put_byte (mbuf, '\0'); + } + break; + + case 'g': /* G_VARIANT_TYPE_SIGNATURE */ + if (value != NULL) + { + gsize len; + const gchar *v = g_variant_get_string (value, &len); + g_assert (g_variant_is_signature (v)); + g_memory_buffer_put_byte (mbuf, len); + g_memory_buffer_put_string (mbuf, v); + g_memory_buffer_put_byte (mbuf, '\0'); + } + break; + + case 'h': /* G_VARIANT_TYPE_HANDLE */ + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + gint32 v = g_variant_get_handle (value); + g_memory_buffer_put_int32 (mbuf, v); + } + break; + + case 'a': /* G_VARIANT_TYPE_ARRAY */ + { + GVariant *item; + GVariantIter iter; + goffset array_len_offset; + goffset array_payload_begin_offset; + goffset cur_offset; + gsize array_len; + + padding_added = ensure_output_padding (mbuf, 4); + if (value != NULL) + { + /* array length - will be filled in later */ + array_len_offset = mbuf->valid_len; + g_memory_buffer_put_uint32 (mbuf, 0xF00DFACE); + + /* From the D-Bus spec: + * + * "A UINT32 giving the length of the array data in bytes, + * followed by alignment padding to the alignment boundary of + * the array element type, followed by each array element. The + * array length is from the end of the alignment padding to + * the end of the last element, i.e. it does not include the + * padding after the length, or any padding after the last + * element." + * + * Thus, we need to count how much padding the first element + * contributes and subtract that from the array length. + */ + array_payload_begin_offset = mbuf->valid_len; + + if (g_variant_n_children (value) == 0) + { + gsize padding_added_for_item; + if (!append_value_to_blob (NULL, + g_variant_type_element (type), + mbuf, + &padding_added_for_item, + error)) + goto fail; + array_payload_begin_offset += padding_added_for_item; + } + else + { + guint n; + n = 0; + g_variant_iter_init (&iter, value); + while ((item = g_variant_iter_next_value (&iter)) != NULL) + { + gsize padding_added_for_item; + if (!append_value_to_blob (item, + g_variant_get_type (item), + mbuf, + &padding_added_for_item, + error)) + { + g_variant_unref (item); + goto fail; + } + g_variant_unref (item); + if (n == 0) + { + array_payload_begin_offset += padding_added_for_item; + } + n++; + } + } + + cur_offset = mbuf->valid_len; + array_len = cur_offset - array_payload_begin_offset; + mbuf->pos = array_len_offset; + + g_memory_buffer_put_uint32 (mbuf, array_len); + mbuf->pos = cur_offset; + } + } + break; + + default: + if (g_variant_type_is_dict_entry (type) || g_variant_type_is_tuple (type)) + { + padding_added = ensure_output_padding (mbuf, 8); + if (value != NULL) + { + GVariant *item; + GVariantIter iter; + g_variant_iter_init (&iter, value); + while ((item = g_variant_iter_next_value (&iter)) != NULL) + { + if (!append_value_to_blob (item, + g_variant_get_type (item), + mbuf, + NULL, + error)) + { + g_variant_unref (item); + goto fail; + } + g_variant_unref (item); + } + } + } + else if (g_variant_type_is_variant (type)) + { + if (value != NULL) + { + GVariant *child; + const gchar *signature; + child = g_variant_get_child_value (value, 0); + signature = g_variant_get_type_string (child); + g_memory_buffer_put_byte (mbuf, strlen (signature)); + g_memory_buffer_put_string (mbuf, signature); + g_memory_buffer_put_byte (mbuf, '\0'); + if (!append_value_to_blob (child, + g_variant_get_type (child), + mbuf, + NULL, + error)) + { + g_variant_unref (child); + goto fail; + } + g_variant_unref (child); + } + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Error serializing GVariant with type string `%s' to the D-Bus wire format"), + g_variant_get_type_string (value)); + goto fail; + } + break; + } + + if (out_padding_added != NULL) + *out_padding_added = padding_added; + + return TRUE; + + fail: + return FALSE; +} + +static gboolean +append_body_to_blob (GVariant *value, + GMemoryBuffer *mbuf, + GError **error) +{ + GVariant *item; + GVariantIter iter; + + if (!g_variant_is_of_type (value, G_VARIANT_TYPE_TUPLE)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "Expected a tuple for the body of the GDBusMessage."); + goto fail; + } + + g_variant_iter_init (&iter, value); + while ((item = g_variant_iter_next_value (&iter)) != NULL) + { + if (!append_value_to_blob (item, + g_variant_get_type (item), + mbuf, + NULL, + error)) + { + g_variant_unref (item); + goto fail; + } + g_variant_unref (item); + } + return TRUE; + + fail: + return FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_to_blob: + * @message: A #GDBusMessage. + * @out_size: Return location for size of generated blob. + * @capabilities: A #GDBusCapabilityFlags describing what protocol features are supported. + * @error: Return location for error. + * + * Serializes @message to a blob. The byte order returned by + * g_dbus_message_get_byte_order() will be used. + * + * Returns: (array length=out_size) (transfer full): A pointer to a + * valid binary D-Bus message of @out_size bytes generated by @message + * or %NULL if @error is set. Free with g_free(). + * + * Since: 2.26 + */ +guchar * +g_dbus_message_to_blob (GDBusMessage *message, + gsize *out_size, + GDBusCapabilityFlags capabilities, + GError **error) +{ + GMemoryBuffer mbuf; + guchar *ret; + gsize size; + goffset body_len_offset; + goffset body_start_offset; + gsize body_size; + GVariant *header_fields; + GVariantBuilder builder; + GHashTableIter hash_iter; + gpointer key; + GVariant *header_value; + GVariant *signature; + const gchar *signature_str; + gint num_fds_in_message; + gint num_fds_according_to_header; + + /* TODO: check against @capabilities */ + + ret = NULL; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + g_return_val_if_fail (out_size != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + memset (&mbuf, 0, sizeof (mbuf)); + mbuf.len = MIN_ARRAY_SIZE; + mbuf.data = g_malloc (mbuf.len); + + mbuf.byte_order = G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN; + switch (message->byte_order) + { + case G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN: + mbuf.byte_order = G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN; + break; + case G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN: + mbuf.byte_order = G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN; + break; + } + + /* Core header */ + g_memory_buffer_put_byte (&mbuf, (guchar) message->byte_order); + g_memory_buffer_put_byte (&mbuf, message->type); + g_memory_buffer_put_byte (&mbuf, message->flags); + g_memory_buffer_put_byte (&mbuf, 1); /* major protocol version */ + body_len_offset = mbuf.valid_len; + /* body length - will be filled in later */ + g_memory_buffer_put_uint32 (&mbuf, 0xF00DFACE); + g_memory_buffer_put_uint32 (&mbuf, message->serial); + + num_fds_in_message = 0; +#ifdef G_OS_UNIX + if (message->fd_list != NULL) + num_fds_in_message = g_unix_fd_list_get_length (message->fd_list); +#endif + num_fds_according_to_header = g_dbus_message_get_num_unix_fds (message); + if (num_fds_in_message != num_fds_according_to_header) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Message has %d file descriptors but the header field indicates %d file descriptors"), + num_fds_in_message, + num_fds_according_to_header); + goto out; + } + + if (!validate_headers (message, error)) + { + g_prefix_error (error, _("Cannot serialize message: ")); + goto out; + } + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{yv}")); + g_hash_table_iter_init (&hash_iter, message->headers); + while (g_hash_table_iter_next (&hash_iter, &key, (gpointer) &header_value)) + { + g_variant_builder_add (&builder, + "{yv}", + (guchar) GPOINTER_TO_UINT (key), + header_value); + } + header_fields = g_variant_builder_end (&builder); + + if (!append_value_to_blob (header_fields, + g_variant_get_type (header_fields), + &mbuf, + NULL, + error)) + { + g_variant_unref (header_fields); + goto out; + } + g_variant_unref (header_fields); + + /* header size must be a multiple of 8 */ + ensure_output_padding (&mbuf, 8); + + body_start_offset = mbuf.valid_len; + + signature = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE); + signature_str = NULL; + if (signature != NULL) + signature_str = g_variant_get_string (signature, NULL); + if (message->body != NULL) + { + gchar *tupled_signature_str; + tupled_signature_str = g_strdup_printf ("(%s)", signature_str); + if (signature == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Message body has signature `%s' but there is no signature header"), + signature_str); + g_free (tupled_signature_str); + goto out; + } + else if (g_strcmp0 (tupled_signature_str, g_variant_get_type_string (message->body)) != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Message body has type signature `%s' but signature in the header field is `%s'"), + tupled_signature_str, g_variant_get_type_string (message->body)); + g_free (tupled_signature_str); + goto out; + } + g_free (tupled_signature_str); + if (!append_body_to_blob (message->body, &mbuf, error)) + goto out; + } + else + { + if (signature != NULL && strlen (signature_str) > 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Message body is empty but signature in the header field is `(%s)'"), + signature_str); + goto out; + } + } + + /* OK, we're done writing the message - set the body length */ + size = mbuf.valid_len; + body_size = size - body_start_offset; + + mbuf.pos = body_len_offset; + + g_memory_buffer_put_uint32 (&mbuf, body_size); + + *out_size = size; + ret = (guchar *)mbuf.data; + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static guint32 +get_uint32_header (GDBusMessage *message, + GDBusMessageHeaderField header_field) +{ + GVariant *value; + guint32 ret; + + ret = 0; + value = g_hash_table_lookup (message->headers, GUINT_TO_POINTER (header_field)); + if (value != NULL && g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32)) + ret = g_variant_get_uint32 (value); + + return ret; +} + +static const gchar * +get_string_header (GDBusMessage *message, + GDBusMessageHeaderField header_field) +{ + GVariant *value; + const gchar *ret; + + ret = NULL; + value = g_hash_table_lookup (message->headers, GUINT_TO_POINTER (header_field)); + if (value != NULL && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + ret = g_variant_get_string (value, NULL); + + return ret; +} + +static const gchar * +get_object_path_header (GDBusMessage *message, + GDBusMessageHeaderField header_field) +{ + GVariant *value; + const gchar *ret; + + ret = NULL; + value = g_hash_table_lookup (message->headers, GUINT_TO_POINTER (header_field)); + if (value != NULL && g_variant_is_of_type (value, G_VARIANT_TYPE_OBJECT_PATH)) + ret = g_variant_get_string (value, NULL); + + return ret; +} + +static const gchar * +get_signature_header (GDBusMessage *message, + GDBusMessageHeaderField header_field) +{ + GVariant *value; + const gchar *ret; + + ret = NULL; + value = g_hash_table_lookup (message->headers, GUINT_TO_POINTER (header_field)); + if (value != NULL && g_variant_is_of_type (value, G_VARIANT_TYPE_SIGNATURE)) + ret = g_variant_get_string (value, NULL); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +set_uint32_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + guint32 value) +{ + g_dbus_message_set_header (message, + header_field, + g_variant_new_uint32 (value)); +} + +static void +set_string_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + const gchar *value) +{ + g_dbus_message_set_header (message, + header_field, + value == NULL ? NULL : g_variant_new_string (value)); +} + +static void +set_object_path_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + const gchar *value) +{ + g_dbus_message_set_header (message, + header_field, + value == NULL ? NULL : g_variant_new_object_path (value)); +} + +static void +set_signature_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + const gchar *value) +{ + g_dbus_message_set_header (message, + header_field, + value == NULL ? NULL : g_variant_new_signature (value)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_reply_serial: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +guint32 +g_dbus_message_get_reply_serial (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), 0); + return get_uint32_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL); +} + +/** + * g_dbus_message_set_reply_serial: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_reply_serial (GDBusMessage *message, + guint32 value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + set_uint32_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_interface: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_interface (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE); +} + +/** + * g_dbus_message_set_interface: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_interface (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_dbus_is_interface_name (value)); + set_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_member: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_MEMBER header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_member (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER); +} + +/** + * g_dbus_message_set_member: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_MEMBER header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_member (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_dbus_is_member_name (value)); + set_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_path: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_PATH header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_path (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_object_path_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH); +} + +/** + * g_dbus_message_set_path: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_PATH header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_path (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_variant_is_object_path (value)); + set_object_path_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_sender: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_SENDER header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_sender (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SENDER); +} + +/** + * g_dbus_message_set_sender: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_SENDER header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_sender (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_dbus_is_name (value)); + set_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SENDER, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_destination: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_destination (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION); +} + +/** + * g_dbus_message_set_destination: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_destination (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_dbus_is_name (value)); + set_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_error_name: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_error_name (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + return get_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME); +} + +/** + * g_dbus_message_set_error_name: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_error_name (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_dbus_is_interface_name (value)); + set_string_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_signature: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_signature (GDBusMessage *message) +{ + const gchar *ret; + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + ret = get_signature_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE); + if (ret == NULL) + ret = ""; + return ret; +} + +/** + * g_dbus_message_set_signature: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_signature (GDBusMessage *message, + const gchar *value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (value == NULL || g_variant_is_signature (value)); + set_signature_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_arg0: + * @message: A #GDBusMessage. + * + * Convenience to get the first item in the body of @message. + * + * Returns: The string item or %NULL if the first item in the body of + * @message is not a string. + * + * Since: 2.26 + */ +const gchar * +g_dbus_message_get_arg0 (GDBusMessage *message) +{ + const gchar *ret; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + + ret = NULL; + + if (message->body != NULL && g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE)) + { + GVariant *item; + item = g_variant_get_child_value (message->body, 0); + if (g_variant_is_of_type (item, G_VARIANT_TYPE_STRING)) + ret = g_variant_get_string (item, NULL); + g_variant_unref (item); + } + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_get_num_unix_fds: + * @message: A #GDBusMessage. + * + * Convenience getter for the %G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS header field. + * + * Returns: The value. + * + * Since: 2.26 + */ +guint32 +g_dbus_message_get_num_unix_fds (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), 0); + return get_uint32_header (message, G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS); +} + +/** + * g_dbus_message_set_num_unix_fds: + * @message: A #GDBusMessage. + * @value: The value to set. + * + * Convenience setter for the %G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS header field. + * + * Since: 2.26 + */ +void +g_dbus_message_set_num_unix_fds (GDBusMessage *message, + guint32 value) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + set_uint32_header (message, G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS, value); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_message_to_gerror: + * @message: A #GDBusMessage. + * @error: The #GError to set. + * + * If @message is not of type %G_DBUS_MESSAGE_TYPE_ERROR does + * nothing and returns %FALSE. + * + * Otherwise this method encodes the error in @message as a #GError + * using g_dbus_error_set_dbus_error() using the information in the + * %G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME header field of @message as + * well as the first string item in @message's body. + * + * Returns: %TRUE if @error was set, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_message_to_gerror (GDBusMessage *message, + GError **error) +{ + gboolean ret; + const gchar *error_name; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); + + ret = FALSE; + if (message->type != G_DBUS_MESSAGE_TYPE_ERROR) + goto out; + + error_name = g_dbus_message_get_error_name (message); + if (error_name != NULL) + { + GVariant *body; + + body = g_dbus_message_get_body (message); + + if (body != NULL && g_variant_is_of_type (body, G_VARIANT_TYPE ("(s)"))) + { + const gchar *error_message; + g_variant_get (body, "(&s)", &error_message); + g_dbus_error_set_dbus_error (error, + error_name, + error_message, + NULL); + } + else + { + /* these two situations are valid, yet pretty rare */ + if (body != NULL) + { + g_dbus_error_set_dbus_error (error, + error_name, + "", + _("Error return with body of type `%s'"), + g_variant_get_type_string (body)); + } + else + { + g_dbus_error_set_dbus_error (error, + error_name, + "", + _("Error return with empty body")); + } + } + } + else + { + /* TOOD: this shouldn't happen - should check this at message serialization + * time and disconnect the peer. + */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Error return without error-name header!"); + } + + ret = TRUE; + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +flags_to_string (GType flags_type, guint value) +{ + GString *s; + GFlagsClass *klass; + guint n; + + klass = g_type_class_ref (flags_type); + s = g_string_new (NULL); + for (n = 0; n < 32; n++) + { + if ((value & (1<len > 0) + g_string_append_c (s, ','); + if (flags_value != NULL) + g_string_append (s, flags_value->value_nick); + else + g_string_append_printf (s, "unknown (bit %d)", n); + } + } + if (s->len == 0) + g_string_append (s, "none"); + g_type_class_unref (klass); + return g_string_free (s, FALSE); +} + +static gint +_sort_keys_func (gconstpointer a, + gconstpointer b) +{ + gint ia; + gint ib; + + ia = GPOINTER_TO_INT (a); + ib = GPOINTER_TO_INT (b); + + return ia - ib; +} + +/** + * g_dbus_message_print: + * @message: A #GDBusMessage. + * @indent: Indentation level. + * + * Produces a human-readable multi-line description of @message. + * + * The contents of the description has no ABI guarantees, the contents + * and formatting is subject to change at any time. Typical output + * looks something like this: + * + * Type: method-call + * Flags: none + * Version: 0 + * Serial: 4 + * Headers: + * path -> objectpath '/org/gtk/GDBus/TestObject' + * interface -> 'org.gtk.GDBus.TestInterface' + * member -> 'GimmeStdout' + * destination -> ':1.146' + * Body: () + * UNIX File Descriptors: + * (none) + * + * or + * + * Type: method-return + * Flags: no-reply-expected + * Version: 0 + * Serial: 477 + * Headers: + * reply-serial -> uint32 4 + * destination -> ':1.159' + * sender -> ':1.146' + * num-unix-fds -> uint32 1 + * Body: () + * UNIX File Descriptors: + * fd 12: dev=0:10,mode=020620,ino=5,uid=500,gid=5,rdev=136:2,size=0,atime=1273085037,mtime=1273085851,ctime=1272982635 + * + * + * Returns: A string that should be freed with g_free(). + * + * Since: 2.26 + */ +gchar * +g_dbus_message_print (GDBusMessage *message, + guint indent) +{ + GString *str; + gchar *s; + GList *keys; + GList *l; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + + str = g_string_new (NULL); + + s = _g_dbus_enum_to_string (G_TYPE_DBUS_MESSAGE_TYPE, message->type); + g_string_append_printf (str, "%*sType: %s\n", indent, "", s); + g_free (s); + s = flags_to_string (G_TYPE_DBUS_MESSAGE_FLAGS, message->flags); + g_string_append_printf (str, "%*sFlags: %s\n", indent, "", s); + g_free (s); + g_string_append_printf (str, "%*sVersion: %d\n", indent, "", message->major_protocol_version); + g_string_append_printf (str, "%*sSerial: %d\n", indent, "", message->serial); + + g_string_append_printf (str, "%*sHeaders:\n", indent, ""); + keys = g_hash_table_get_keys (message->headers); + keys = g_list_sort (keys, _sort_keys_func); + if (keys != NULL) + { + for (l = keys; l != NULL; l = l->next) + { + gint key = GPOINTER_TO_INT (l->data); + GVariant *value; + gchar *value_str; + + value = g_hash_table_lookup (message->headers, l->data); + g_assert (value != NULL); + + s = _g_dbus_enum_to_string (G_TYPE_DBUS_MESSAGE_HEADER_FIELD, key); + value_str = g_variant_print (value, TRUE); + g_string_append_printf (str, "%*s %s -> %s\n", indent, "", s, value_str); + g_free (s); + g_free (value_str); + } + } + else + { + g_string_append_printf (str, "%*s (none)\n", indent, ""); + } + g_string_append_printf (str, "%*sBody: ", indent, ""); + if (message->body != NULL) + { + g_variant_print_string (message->body, + str, + TRUE); + } + else + { + g_string_append (str, "()"); + } + g_string_append (str, "\n"); +#ifdef G_OS_UNIX + g_string_append_printf (str, "%*sUNIX File Descriptors:\n", indent, ""); + if (message->fd_list != NULL) + { + gint num_fds; + const gint *fds; + gint n; + + fds = g_unix_fd_list_peek_fds (message->fd_list, &num_fds); + if (num_fds > 0) + { + for (n = 0; n < num_fds; n++) + { + GString *fs; + struct stat statbuf; + fs = g_string_new (NULL); + if (fstat (fds[n], &statbuf) == 0) + { + g_string_append_printf (fs, "%s" "dev=%d:%d", fs->len > 0 ? "," : "", + major (statbuf.st_dev), minor (statbuf.st_dev)); + g_string_append_printf (fs, "%s" "mode=0%o", fs->len > 0 ? "," : "", + statbuf.st_mode); + g_string_append_printf (fs, "%s" "ino=%" G_GUINT64_FORMAT, fs->len > 0 ? "," : "", + (guint64) statbuf.st_ino); + g_string_append_printf (fs, "%s" "uid=%d", fs->len > 0 ? "," : "", + statbuf.st_uid); + g_string_append_printf (fs, "%s" "gid=%d", fs->len > 0 ? "," : "", + statbuf.st_gid); + g_string_append_printf (fs, "%s" "rdev=%d:%d", fs->len > 0 ? "," : "", + major (statbuf.st_rdev), minor (statbuf.st_rdev)); + g_string_append_printf (fs, "%s" "size=%" G_GUINT64_FORMAT, fs->len > 0 ? "," : "", + (guint64) statbuf.st_size); + g_string_append_printf (fs, "%s" "atime=%" G_GUINT64_FORMAT, fs->len > 0 ? "," : "", + (guint64) statbuf.st_atime); + g_string_append_printf (fs, "%s" "mtime=%" G_GUINT64_FORMAT, fs->len > 0 ? "," : "", + (guint64) statbuf.st_mtime); + g_string_append_printf (fs, "%s" "ctime=%" G_GUINT64_FORMAT, fs->len > 0 ? "," : "", + (guint64) statbuf.st_ctime); + } + else + { + g_string_append_printf (fs, "(fstat failed: %s)", strerror (errno)); + } + g_string_append_printf (str, "%*s fd %d: %s\n", indent, "", fds[n], fs->str); + g_string_free (fs, TRUE); + } + } + else + { + g_string_append_printf (str, "%*s (empty)\n", indent, ""); + } + } + else + { + g_string_append_printf (str, "%*s (none)\n", indent, ""); + } +#endif + + return g_string_free (str, FALSE); +} + +/** + * g_dbus_message_get_locked: + * @message: A #GDBusMessage. + * + * Checks whether @message is locked. To monitor changes to this + * value, conncet to the #GObject::notify signal to listen for changes + * on the #GDBusMessage:locked property. + * + * Returns: %TRUE if @message is locked, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_message_get_locked (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); + return message->locked; +} + +/** + * g_dbus_message_lock: + * @message: A #GDBusMessage. + * + * If @message is locked, does nothing. Otherwise locks the message. + * + * Since: 2.26 + */ +void +g_dbus_message_lock (GDBusMessage *message) +{ + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + + if (message->locked) + goto out; + + message->locked = TRUE; + g_object_notify (G_OBJECT (message), "locked"); + + out: + ; +} + +/** + * g_dbus_message_copy: + * @message: A #GDBusMessage. + * @error: Return location for error or %NULL. + * + * Copies @message. The copy is a deep copy and the returned + * #GDBusMessage is completely identical except that it is guaranteed + * to not be locked. + * + * This operation can fail if e.g. @message contains file descriptors + * and the per-process or system-wide open files limit is reached. + * + * Returns: (transfer full): A new #GDBusMessage or %NULL if @error is set. + * Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_message_copy (GDBusMessage *message, + GError **error) +{ + GDBusMessage *ret; + GHashTableIter iter; + gpointer header_key; + GVariant *header_value; + + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = g_dbus_message_new (); + ret->type = message->type; + ret->flags = message->flags; + ret->byte_order = message->byte_order; + ret->major_protocol_version = message->major_protocol_version; + ret->serial = message->serial; + +#ifdef G_OS_UNIX + if (message->fd_list != NULL) + { + gint n; + gint num_fds; + const gint *fds; + + ret->fd_list = g_unix_fd_list_new (); + fds = g_unix_fd_list_peek_fds (message->fd_list, &num_fds); + for (n = 0; n < num_fds; n++) + { + if (g_unix_fd_list_append (ret->fd_list, + fds[n], + error) == -1) + { + g_object_unref (ret); + ret = NULL; + goto out; + } + } + } +#endif + + /* see https://bugzilla.gnome.org/show_bug.cgi?id=624546#c8 for why it's fine + * to just ref (as opposed to deep-copying) the GVariant instances + */ + ret->body = message->body != NULL ? g_variant_ref (message->body) : NULL; + g_hash_table_iter_init (&iter, message->headers); + while (g_hash_table_iter_next (&iter, &header_key, (gpointer) &header_value)) + g_hash_table_insert (ret->headers, header_key, g_variant_ref (header_value)); + +#ifdef G_OS_UNIX + out: +#endif + return ret; +} diff --git a/gio/gdbusmessage.h b/gio/gdbusmessage.h new file mode 100644 index 0000000..bf27f7a --- /dev/null +++ b/gio/gdbusmessage.h @@ -0,0 +1,199 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_MESSAGE_H__ +#define __G_DBUS_MESSAGE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_MESSAGE (g_dbus_message_get_type ()) +#define G_DBUS_MESSAGE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_MESSAGE, GDBusMessage)) +#define G_IS_DBUS_MESSAGE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_MESSAGE)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_message_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new (void); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_signal (const gchar *path, + const gchar *interface_, + const gchar *signal); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_method_call (const gchar *name, + const gchar *path, + const gchar *interface_, + const gchar *method); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_method_reply (GDBusMessage *method_call_message); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_method_error (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message_format, + ...); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_method_error_valist (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message_format, + va_list var_args); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_method_error_literal (GDBusMessage *method_call_message, + const gchar *error_name, + const gchar *error_message); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_message_print (GDBusMessage *message, + guint indent); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_message_get_locked (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_lock (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_copy (GDBusMessage *message, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusMessageByteOrder g_dbus_message_get_byte_order (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_byte_order (GDBusMessage *message, + GDBusMessageByteOrder byte_order); + +GLIB_AVAILABLE_IN_ALL +GDBusMessageType g_dbus_message_get_message_type (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_message_type (GDBusMessage *message, + GDBusMessageType type); +GLIB_AVAILABLE_IN_ALL +GDBusMessageFlags g_dbus_message_get_flags (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_flags (GDBusMessage *message, + GDBusMessageFlags flags); +GLIB_AVAILABLE_IN_ALL +guint32 g_dbus_message_get_serial (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_serial (GDBusMessage *message, + guint32 serial); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_message_get_header (GDBusMessage *message, + GDBusMessageHeaderField header_field); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_header (GDBusMessage *message, + GDBusMessageHeaderField header_field, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +guchar *g_dbus_message_get_header_fields (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_message_get_body (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_body (GDBusMessage *message, + GVariant *body); +GLIB_AVAILABLE_IN_ALL +GUnixFDList *g_dbus_message_get_unix_fd_list (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_unix_fd_list (GDBusMessage *message, + GUnixFDList *fd_list); + +GLIB_AVAILABLE_IN_ALL +guint32 g_dbus_message_get_reply_serial (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_reply_serial (GDBusMessage *message, + guint32 value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_interface (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_interface (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_member (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_member (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_path (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_path (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_sender (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_sender (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_destination (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_destination (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_error_name (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_error_name (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_signature (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_signature (GDBusMessage *message, + const gchar *value); + +GLIB_AVAILABLE_IN_ALL +guint32 g_dbus_message_get_num_unix_fds (GDBusMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_message_set_num_unix_fds (GDBusMessage *message, + guint32 value); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_message_get_arg0 (GDBusMessage *message); + + +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_message_new_from_blob (guchar *blob, + gsize blob_len, + GDBusCapabilityFlags capabilities, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gssize g_dbus_message_bytes_needed (guchar *blob, + gsize blob_len, + GError **error); + +GLIB_AVAILABLE_IN_ALL +guchar *g_dbus_message_to_blob (GDBusMessage *message, + gsize *out_size, + GDBusCapabilityFlags capabilities, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_message_to_gerror (GDBusMessage *message, + GError **error); + +G_END_DECLS + +#endif /* __G_DBUS_MESSAGE_H__ */ diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c new file mode 100644 index 0000000..979468e --- /dev/null +++ b/gio/gdbusmethodinvocation.c @@ -0,0 +1,672 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include + +#include "gdbusutils.h" +#include "gdbusconnection.h" +#include "gdbusmessage.h" +#include "gdbusmethodinvocation.h" +#include "gdbusintrospection.h" +#include "gdbuserror.h" +#include "gdbusprivate.h" + +#ifdef G_OS_UNIX +#include "gunixfdlist.h" +#endif + +#include "glibintl.h" + +/** + * SECTION:gdbusmethodinvocation + * @short_description: Object for handling remote calls + * @include: gio/gio.h + * + * Instances of the #GDBusMethodInvocation class are used when + * handling D-Bus method calls. It provides a way to asynchronously + * return results and errors. + * + * The normal way to obtain a #GDBusMethodInvocation object is to receive + * it as an argument to the handle_method_call() function in a + * #GDBusInterfaceVTable that was passed to g_dbus_connection_register_object(). + */ + +typedef struct _GDBusMethodInvocationClass GDBusMethodInvocationClass; + +/** + * GDBusMethodInvocationClass: + * + * Class structure for #GDBusMethodInvocation. + * + * Since: 2.26 + */ +struct _GDBusMethodInvocationClass +{ + /*< private >*/ + GObjectClass parent_class; +}; + +/** + * GDBusMethodInvocation: + * + * The #GDBusMethodInvocation structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusMethodInvocation +{ + /*< private >*/ + GObject parent_instance; + + /* construct-only properties */ + gchar *sender; + gchar *object_path; + gchar *interface_name; + gchar *method_name; + const GDBusMethodInfo *method_info; + GDBusConnection *connection; + GDBusMessage *message; + GVariant *parameters; + gpointer user_data; +}; + +G_DEFINE_TYPE (GDBusMethodInvocation, g_dbus_method_invocation, G_TYPE_OBJECT); + +static void +g_dbus_method_invocation_finalize (GObject *object) +{ + GDBusMethodInvocation *invocation = G_DBUS_METHOD_INVOCATION (object); + + g_free (invocation->sender); + g_free (invocation->object_path); + g_free (invocation->interface_name); + g_free (invocation->method_name); + g_object_unref (invocation->connection); + g_object_unref (invocation->message); + g_variant_unref (invocation->parameters); + + G_OBJECT_CLASS (g_dbus_method_invocation_parent_class)->finalize (object); +} + +static void +g_dbus_method_invocation_class_init (GDBusMethodInvocationClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_method_invocation_finalize; +} + +static void +g_dbus_method_invocation_init (GDBusMethodInvocation *invocation) +{ +} + +/** + * g_dbus_method_invocation_get_sender: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the bus name that invoked the method. + * + * Returns: A string. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +const gchar * +g_dbus_method_invocation_get_sender (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->sender; +} + +/** + * g_dbus_method_invocation_get_object_path: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the object path the method was invoked on. + * + * Returns: A string. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +const gchar * +g_dbus_method_invocation_get_object_path (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->object_path; +} + +/** + * g_dbus_method_invocation_get_interface_name: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the name of the D-Bus interface the method was invoked on. + * + * Returns: A string. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +const gchar * +g_dbus_method_invocation_get_interface_name (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->interface_name; +} + +/** + * g_dbus_method_invocation_get_method_info: + * @invocation: A #GDBusMethodInvocation. + * + * Gets information about the method call, if any. + * + * Returns: A #GDBusMethodInfo or %NULL. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +const GDBusMethodInfo * +g_dbus_method_invocation_get_method_info (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->method_info; +} + +/** + * g_dbus_method_invocation_get_method_name: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the name of the method that was invoked. + * + * Returns: A string. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +const gchar * +g_dbus_method_invocation_get_method_name (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->method_name; +} + +/** + * g_dbus_method_invocation_get_connection: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the #GDBusConnection the method was invoked on. + * + * Returns: (transfer none):A #GDBusConnection. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_method_invocation_get_connection (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->connection; +} + +/** + * g_dbus_method_invocation_get_message: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the #GDBusMessage for the method invocation. This is useful if + * you need to use low-level protocol features, such as UNIX file + * descriptor passing, that cannot be properly expressed in the + * #GVariant API. + * + * See and for an example of how to use this + * low-level API to send and receive UNIX file descriptors. + * + * Returns: (transfer none): #GDBusMessage. Do not free, it is owned by @invocation. + * + * Since: 2.26 + */ +GDBusMessage * +g_dbus_method_invocation_get_message (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->message; +} + +/** + * g_dbus_method_invocation_get_parameters: + * @invocation: A #GDBusMethodInvocation. + * + * Gets the parameters of the method invocation. If there are no input + * parameters then this will return a GVariant with 0 children rather than NULL. + * + * Returns: (transfer none): A #GVariant tuple. Do not unref this because it is owned by @invocation. + * + * Since: 2.26 + */ +GVariant * +g_dbus_method_invocation_get_parameters (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->parameters; +} + +/** + * g_dbus_method_invocation_get_user_data: (skip) + * @invocation: A #GDBusMethodInvocation. + * + * Gets the @user_data #gpointer passed to g_dbus_connection_register_object(). + * + * Returns: A #gpointer. + * + * Since: 2.26 + */ +gpointer +g_dbus_method_invocation_get_user_data (GDBusMethodInvocation *invocation) +{ + g_return_val_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation), NULL); + return invocation->user_data; +} + +/* < internal > + * _g_dbus_method_invocation_new: + * @sender: (allow-none): The bus name that invoked the method or %NULL if @connection is not a bus connection. + * @object_path: The object path the method was invoked on. + * @interface_name: The name of the D-Bus interface the method was invoked on. + * @method_name: The name of the method that was invoked. + * @method_info: (allow-none): Information about the method call or %NULL. + * @connection: The #GDBusConnection the method was invoked on. + * @message: The D-Bus message as a #GDBusMessage. + * @parameters: The parameters as a #GVariant tuple. + * @user_data: The @user_data #gpointer passed to g_dbus_connection_register_object(). + * + * Creates a new #GDBusMethodInvocation object. + * + * Returns: A #GDBusMethodInvocation. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusMethodInvocation * +_g_dbus_method_invocation_new (const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + const GDBusMethodInfo *method_info, + GDBusConnection *connection, + GDBusMessage *message, + GVariant *parameters, + gpointer user_data) +{ + GDBusMethodInvocation *invocation; + + g_return_val_if_fail (sender == NULL || g_dbus_is_name (sender), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (interface_name == NULL || g_dbus_is_interface_name (interface_name), NULL); + g_return_val_if_fail (g_dbus_is_member_name (method_name), NULL); + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + g_return_val_if_fail (g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), NULL); + + invocation = G_DBUS_METHOD_INVOCATION (g_object_new (G_TYPE_DBUS_METHOD_INVOCATION, NULL)); + invocation->sender = g_strdup (sender); + invocation->object_path = g_strdup (object_path); + invocation->interface_name = g_strdup (interface_name); + invocation->method_name = g_strdup (method_name); + invocation->method_info = g_dbus_method_info_ref ((GDBusMethodInfo *)method_info); + invocation->connection = g_object_ref (connection); + invocation->message = g_object_ref (message); + invocation->parameters = g_variant_ref (parameters); + invocation->user_data = user_data; + + return invocation; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocation, + GVariant *parameters, + GUnixFDList *fd_list) +{ + GDBusMessage *reply; + GError *error; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail ((parameters == NULL) || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE)); + + if (parameters == NULL) + parameters = g_variant_new_tuple (NULL, 0); + + /* if we have introspection data, check that the signature of @parameters is correct */ + if (invocation->method_info != NULL) + { + GVariantType *type; + + type = _g_dbus_compute_complete_signature (invocation->method_info->out_args); + + if (!g_variant_is_of_type (parameters, type)) + { + gchar *type_string = g_variant_type_dup_string (type); + + g_warning ("Type of return value is incorrect: expected `%s', got `%s''", + type_string, g_variant_get_type_string (parameters)); + g_variant_type_free (type); + g_free (type_string); + goto out; + } + g_variant_type_free (type); + } + + if (G_UNLIKELY (_g_dbus_debug_return ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Return:\n" + " >>>> METHOD RETURN\n" + " in response to %s.%s()\n" + " on object %s\n" + " to name %s\n" + " reply-serial %d\n", + invocation->interface_name, invocation->method_name, + invocation->object_path, + invocation->sender, + g_dbus_message_get_serial (invocation->message)); + _g_dbus_debug_print_unlock (); + } + + reply = g_dbus_message_new_method_reply (invocation->message); + g_dbus_message_set_body (reply, parameters); + +#ifdef G_OS_UNIX + if (fd_list != NULL) + g_dbus_message_set_unix_fd_list (reply, fd_list); +#endif + + error = NULL; + if (!g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error)) + { + g_warning ("Error sending message: %s", error->message); + g_error_free (error); + } + g_object_unref (reply); + + out: + g_object_unref (invocation); +} + +/** + * g_dbus_method_invocation_return_value: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @parameters: (allow-none): A #GVariant tuple with out parameters for the method or %NULL if not passing any parameters. + * + * Finishes handling a D-Bus method call by returning @parameters. + * If the @parameters GVariant is floating, it is consumed. + * + * It is an error if @parameters is not of the right format. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, + GVariant *parameters) +{ + g_dbus_method_invocation_return_value_internal (invocation, parameters, NULL); +} + +#ifdef G_OS_UNIX +/** + * g_dbus_method_invocation_return_value_with_unix_fd_list: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @parameters: (allow-none): A #GVariant tuple with out parameters for the method or %NULL if not passing any parameters. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * + * Like g_dbus_method_invocation_return_value() but also takes a #GUnixFDList. + * + * This method is only available on UNIX. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.30 + */ +void +g_dbus_method_invocation_return_value_with_unix_fd_list (GDBusMethodInvocation *invocation, + GVariant *parameters, + GUnixFDList *fd_list) +{ + g_dbus_method_invocation_return_value_internal (invocation, parameters, fd_list); +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_method_invocation_return_error: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @domain: A #GQuark for the #GError error domain. + * @code: The error code. + * @format: printf()-style format. + * @...: Parameters for @format. + * + * Finishes handling a D-Bus method call by returning an error. + * + * See g_dbus_error_encode_gerror() for details about what error name + * will be returned on the wire. In a nutshell, if the given error is + * registered using g_dbus_error_register_error() the name given + * during registration is used. Otherwise, a name of the form + * org.gtk.GDBus.UnmappedGError.Quark... is + * used. This provides transparent mapping of #GError between + * applications using GDBus. + * + * If you are writing an application intended to be portable, + * always register errors with g_dbus_error_register_error() + * or use g_dbus_method_invocation_return_dbus_error(). + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_error (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + va_list var_args; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (format != NULL); + + va_start (var_args, format); + g_dbus_method_invocation_return_error_valist (invocation, + domain, + code, + format, + var_args); + va_end (var_args); +} + +/** + * g_dbus_method_invocation_return_error_valist: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @domain: A #GQuark for the #GError error domain. + * @code: The error code. + * @format: printf()-style format. + * @var_args: #va_list of parameters for @format. + * + * Like g_dbus_method_invocation_return_error() but intended for + * language bindings. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_error_valist (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *format, + va_list var_args) +{ + gchar *literal_message; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (format != NULL); + + literal_message = g_strdup_vprintf (format, var_args); + g_dbus_method_invocation_return_error_literal (invocation, + domain, + code, + literal_message); + g_free (literal_message); +} + +/** + * g_dbus_method_invocation_return_error_literal: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @domain: A #GQuark for the #GError error domain. + * @code: The error code. + * @message: The error message. + * + * Like g_dbus_method_invocation_return_error() but without printf()-style formatting. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_error_literal (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *message) +{ + GError *error; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (message != NULL); + + error = g_error_new_literal (domain, code, message); + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); +} + +/** + * g_dbus_method_invocation_return_gerror: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @error: A #GError. + * + * Like g_dbus_method_invocation_return_error() but takes a #GError + * instead of the error domain, error code and message. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_gerror (GDBusMethodInvocation *invocation, + const GError *error) +{ + gchar *dbus_error_name; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (error != NULL); + + dbus_error_name = g_dbus_error_encode_gerror (error); + + g_dbus_method_invocation_return_dbus_error (invocation, + dbus_error_name, + error->message); + g_free (dbus_error_name); +} + +/** + * g_dbus_method_invocation_take_error: (skip) + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @error: (transfer full): A #GError. + * + * Like g_dbus_method_invocation_return_gerror() but takes ownership + * of @error so the caller does not need to free it. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.30 + */ +void +g_dbus_method_invocation_take_error (GDBusMethodInvocation *invocation, + GError *error) +{ + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (error != NULL); + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); +} + +/** + * g_dbus_method_invocation_return_dbus_error: + * @invocation: (transfer full): A #GDBusMethodInvocation. + * @error_name: A valid D-Bus error name. + * @error_message: A valid D-Bus error message. + * + * Finishes handling a D-Bus method call by returning an error. + * + * This method will free @invocation, you cannot use it afterwards. + * + * Since: 2.26 + */ +void +g_dbus_method_invocation_return_dbus_error (GDBusMethodInvocation *invocation, + const gchar *error_name, + const gchar *error_message) +{ + GDBusMessage *reply; + + g_return_if_fail (G_IS_DBUS_METHOD_INVOCATION (invocation)); + g_return_if_fail (error_name != NULL && g_dbus_is_name (error_name)); + g_return_if_fail (error_message != NULL); + + if (G_UNLIKELY (_g_dbus_debug_return ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Return:\n" + " >>>> METHOD ERROR %s\n" + " message `%s'\n" + " in response to %s.%s()\n" + " on object %s\n" + " to name %s\n" + " reply-serial %d\n", + error_name, + error_message, + invocation->interface_name, invocation->method_name, + invocation->object_path, + invocation->sender, + g_dbus_message_get_serial (invocation->message)); + _g_dbus_debug_print_unlock (); + } + + reply = g_dbus_message_new_method_error_literal (invocation->message, + error_name, + error_message); + g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); + g_object_unref (reply); + + g_object_unref (invocation); +} diff --git a/gio/gdbusmethodinvocation.h b/gio/gdbusmethodinvocation.h new file mode 100644 index 0000000..5f139c7 --- /dev/null +++ b/gio/gdbusmethodinvocation.h @@ -0,0 +1,97 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_METHOD_INVOCATION_H__ +#define __G_DBUS_METHOD_INVOCATION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_METHOD_INVOCATION (g_dbus_method_invocation_get_type ()) +#define G_DBUS_METHOD_INVOCATION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_METHOD_INVOCATION, GDBusMethodInvocation)) +#define G_IS_DBUS_METHOD_INVOCATION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_METHOD_INVOCATION)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_method_invocation_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_method_invocation_get_sender (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_method_invocation_get_object_path (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_method_invocation_get_interface_name (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_method_invocation_get_method_name (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +const GDBusMethodInfo *g_dbus_method_invocation_get_method_info (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_method_invocation_get_connection (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +GDBusMessage *g_dbus_method_invocation_get_message (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_method_invocation_get_parameters (GDBusMethodInvocation *invocation); +GLIB_AVAILABLE_IN_ALL +gpointer g_dbus_method_invocation_get_user_data (GDBusMethodInvocation *invocation); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_value (GDBusMethodInvocation *invocation, + GVariant *parameters); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_value_with_unix_fd_list (GDBusMethodInvocation *invocation, + GVariant *parameters, + GUnixFDList *fd_list); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_error (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF(4, 5); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_error_valist (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *format, + va_list var_args) + G_GNUC_PRINTF(4, 0); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_error_literal (GDBusMethodInvocation *invocation, + GQuark domain, + gint code, + const gchar *message); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_gerror (GDBusMethodInvocation *invocation, + const GError *error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_take_error (GDBusMethodInvocation *invocation, + GError *error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_method_invocation_return_dbus_error (GDBusMethodInvocation *invocation, + const gchar *error_name, + const gchar *error_message); + +G_END_DECLS + +#endif /* __G_DBUS_METHOD_INVOCATION_H__ */ diff --git a/gio/gdbusnameowning.c b/gio/gdbusnameowning.c new file mode 100644 index 0000000..260b088 --- /dev/null +++ b/gio/gdbusnameowning.c @@ -0,0 +1,959 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include + +#include "gdbusutils.h" +#include "gdbusnameowning.h" +#include "gdbuserror.h" +#include "gdbusprivate.h" +#include "gdbusconnection.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusnameowning + * @title: Owning Bus Names + * @short_description: Simple API for owning bus names + * @include: gio/gio.h + * + * Convenience API for owning bus names. + * + * Simple application owning a nameFIXME: MISSING XINCLUDE CONTENT + */ + +G_LOCK_DEFINE_STATIC (lock); + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef enum +{ + PREVIOUS_CALL_NONE = 0, + PREVIOUS_CALL_ACQUIRED, + PREVIOUS_CALL_LOST, +} PreviousCall; + +typedef struct +{ + volatile gint ref_count; + guint id; + GBusNameOwnerFlags flags; + gchar *name; + GBusAcquiredCallback bus_acquired_handler; + GBusNameAcquiredCallback name_acquired_handler; + GBusNameLostCallback name_lost_handler; + gpointer user_data; + GDestroyNotify user_data_free_func; + GMainContext *main_context; + + PreviousCall previous_call; + + GDBusConnection *connection; + gulong disconnected_signal_handler_id; + guint name_acquired_subscription_id; + guint name_lost_subscription_id; + + volatile gboolean cancelled; /* must hold lock when reading or modifying */ + + gboolean needs_release; +} Client; + +static guint next_global_id = 1; +static GHashTable *map_id_to_client = NULL; + + +static Client * +client_ref (Client *client) +{ + g_atomic_int_inc (&client->ref_count); + return client; +} + +static void +client_unref (Client *client) +{ + if (g_atomic_int_dec_and_test (&client->ref_count)) + { + if (client->connection != NULL) + { + if (client->disconnected_signal_handler_id > 0) + g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); + if (client->name_acquired_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_acquired_subscription_id); + if (client->name_lost_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_lost_subscription_id); + g_object_unref (client->connection); + } + g_main_context_unref (client->main_context); + g_free (client->name); + if (client->user_data_free_func != NULL) + client->user_data_free_func (client->user_data); + g_free (client); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + + +typedef enum +{ + CALL_TYPE_NAME_ACQUIRED, + CALL_TYPE_NAME_LOST +} CallType; + +typedef struct +{ + Client *client; + + /* keep this separate because client->connection may + * be set to NULL after scheduling the call + */ + GDBusConnection *connection; + + /* set to TRUE to call acquired */ + CallType call_type; +} CallHandlerData; + +static void +call_handler_data_free (CallHandlerData *data) +{ + if (data->connection != NULL) + g_object_unref (data->connection); + client_unref (data->client); + g_free (data); +} + +static void +actually_do_call (Client *client, GDBusConnection *connection, CallType call_type) +{ + switch (call_type) + { + case CALL_TYPE_NAME_ACQUIRED: + if (client->name_acquired_handler != NULL) + { + client->name_acquired_handler (connection, + client->name, + client->user_data); + } + break; + + case CALL_TYPE_NAME_LOST: + if (client->name_lost_handler != NULL) + { + client->name_lost_handler (connection, + client->name, + client->user_data); + } + break; + + default: + g_assert_not_reached (); + break; + } +} + +static gboolean +call_in_idle_cb (gpointer _data) +{ + CallHandlerData *data = _data; + actually_do_call (data->client, data->connection, data->call_type); + return FALSE; +} + +static void +schedule_call_in_idle (Client *client, CallType call_type) +{ + CallHandlerData *data; + GSource *idle_source; + + data = g_new0 (CallHandlerData, 1); + data->client = client_ref (client); + data->connection = client->connection != NULL ? g_object_ref (client->connection) : NULL; + data->call_type = call_type; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_HIGH); + g_source_set_callback (idle_source, + call_in_idle_cb, + data, + (GDestroyNotify) call_handler_data_free); + g_source_attach (idle_source, client->main_context); + g_source_unref (idle_source); +} + +static void +do_call (Client *client, CallType call_type) +{ + GMainContext *current_context; + + /* only schedule in idle if we're not in the right thread */ + current_context = g_main_context_ref_thread_default (); + if (current_context != client->main_context) + schedule_call_in_idle (client, call_type); + else + actually_do_call (client, client->connection, call_type); + g_main_context_unref (current_context); +} + +static void +call_acquired_handler (Client *client) +{ + G_LOCK (lock); + if (client->previous_call != PREVIOUS_CALL_ACQUIRED) + { + client->previous_call = PREVIOUS_CALL_ACQUIRED; + if (!client->cancelled) + { + G_UNLOCK (lock); + do_call (client, CALL_TYPE_NAME_ACQUIRED); + goto out; + } + } + G_UNLOCK (lock); + out: + ; +} + +static void +call_lost_handler (Client *client) +{ + G_LOCK (lock); + if (client->previous_call != PREVIOUS_CALL_LOST) + { + client->previous_call = PREVIOUS_CALL_LOST; + if (!client->cancelled) + { + G_UNLOCK (lock); + do_call (client, CALL_TYPE_NAME_LOST); + goto out; + } + } + G_UNLOCK (lock); + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_name_lost_or_acquired (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + Client *client = user_data; + const gchar *name; + + if (g_strcmp0 (object_path, "/org/freedesktop/DBus") != 0 || + g_strcmp0 (interface_name, "org.freedesktop.DBus") != 0 || + g_strcmp0 (sender_name, "org.freedesktop.DBus") != 0) + goto out; + + if (g_strcmp0 (signal_name, "NameLost") == 0) + { + g_variant_get (parameters, "(&s)", &name); + if (g_strcmp0 (name, client->name) == 0) + { + call_lost_handler (client); + } + } + else if (g_strcmp0 (signal_name, "NameAcquired") == 0) + { + g_variant_get (parameters, "(&s)", &name); + if (g_strcmp0 (name, client->name) == 0) + { + call_acquired_handler (client); + } + } + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +request_name_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + Client *client = user_data; + GVariant *result; + guint32 request_name_reply; + gboolean subscribe; + + request_name_reply = 0; + result = NULL; + + /* don't use client->connection - it may be NULL already */ + result = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), + res, + NULL); + if (result != NULL) + { + g_variant_get (result, "(u)", &request_name_reply); + g_variant_unref (result); + } + + subscribe = FALSE; + + switch (request_name_reply) + { + case 1: /* DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER */ + /* We got the name - now listen for NameLost and NameAcquired */ + call_acquired_handler (client); + subscribe = TRUE; + client->needs_release = TRUE; + break; + + case 2: /* DBUS_REQUEST_NAME_REPLY_IN_QUEUE */ + /* Waiting in line - listen for NameLost and NameAcquired */ + call_lost_handler (client); + subscribe = TRUE; + client->needs_release = TRUE; + break; + + default: + /* assume we couldn't get the name - explicit fallthrough */ + case 3: /* DBUS_REQUEST_NAME_REPLY_EXISTS */ + case 4: /* DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER */ + /* Some other part of the process is already owning the name */ + call_lost_handler (client); + break; + } + + + if (subscribe) + { + GDBusConnection *connection = NULL; + + /* if cancelled, there is no point in subscribing to signals - if not, make sure + * we use a known good Connection object since it may be set to NULL at any point + * after being cancelled + */ + G_LOCK (lock); + if (!client->cancelled) + connection = g_object_ref (client->connection); + G_UNLOCK (lock); + + /* start listening to NameLost and NameAcquired messages */ + if (connection != NULL) + { + client->name_lost_subscription_id = + g_dbus_connection_signal_subscribe (connection, + "org.freedesktop.DBus", + "org.freedesktop.DBus", + "NameLost", + "/org/freedesktop/DBus", + client->name, + G_DBUS_SIGNAL_FLAGS_NONE, + on_name_lost_or_acquired, + client, + NULL); + client->name_acquired_subscription_id = + g_dbus_connection_signal_subscribe (connection, + "org.freedesktop.DBus", + "org.freedesktop.DBus", + "NameAcquired", + "/org/freedesktop/DBus", + client->name, + G_DBUS_SIGNAL_FLAGS_NONE, + on_name_lost_or_acquired, + client, + NULL); + g_object_unref (connection); + } + } + + client_unref (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_connection_disconnected (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error, + gpointer user_data) +{ + Client *client = user_data; + + if (client->disconnected_signal_handler_id > 0) + g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); + if (client->name_acquired_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_acquired_subscription_id); + if (client->name_lost_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_lost_subscription_id); + g_object_unref (client->connection); + client->disconnected_signal_handler_id = 0; + client->name_acquired_subscription_id = 0; + client->name_lost_subscription_id = 0; + client->connection = NULL; + + call_lost_handler (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +has_connection (Client *client) +{ + /* listen for disconnection */ + client->disconnected_signal_handler_id = g_signal_connect (client->connection, + "closed", + G_CALLBACK (on_connection_disconnected), + client); + + /* attempt to acquire the name */ + g_dbus_connection_call (client->connection, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "RequestName", /* method name */ + g_variant_new ("(su)", + client->name, + client->flags), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) request_name_cb, + client_ref (client)); +} + + +static void +connection_get_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + Client *client = user_data; + + /* must not do anything if already cancelled */ + G_LOCK (lock); + if (client->cancelled) + { + G_UNLOCK (lock); + goto out; + } + G_UNLOCK (lock); + + client->connection = g_bus_get_finish (res, NULL); + if (client->connection == NULL) + { + call_lost_handler (client); + goto out; + } + + /* No need to schedule this in idle as we're already in the thread + * that the user called g_bus_own_name() from. This is because + * g_bus_get() guarantees that. + * + * Also, we need to ensure that the handler is invoked *before* + * we call RequestName(). Otherwise there is a race. + */ + if (client->bus_acquired_handler != NULL) + { + client->bus_acquired_handler (client->connection, + client->name, + client->user_data); + } + + has_connection (client); + + out: + client_unref (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_bus_own_name_on_connection: + * @connection: A #GDBusConnection. + * @name: The well-known name to own. + * @flags: A set of flags from the #GBusNameOwnerFlags enumeration. + * @name_acquired_handler: (allow-none): Handler to invoke when @name is acquired or %NULL. + * @name_lost_handler: (allow-none): Handler to invoke when @name is lost or %NULL. + * @user_data: User data to pass to handlers. + * @user_data_free_func: (allow-none): Function for freeing @user_data or %NULL. + * + * Like g_bus_own_name() but takes a #GDBusConnection instead of a + * #GBusType. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unown_name() to stop owning the name. + * + * Since: 2.26 + */ +guint +g_bus_own_name_on_connection (GDBusConnection *connection, + const gchar *name, + GBusNameOwnerFlags flags, + GBusNameAcquiredCallback name_acquired_handler, + GBusNameLostCallback name_lost_handler, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + Client *client; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (g_dbus_is_name (name) && !g_dbus_is_unique_name (name), 0); + + G_LOCK (lock); + + client = g_new0 (Client, 1); + client->ref_count = 1; + client->id = next_global_id++; /* TODO: uh oh, handle overflow */ + client->name = g_strdup (name); + client->flags = flags; + client->name_acquired_handler = name_acquired_handler; + client->name_lost_handler = name_lost_handler; + client->user_data = user_data; + client->user_data_free_func = user_data_free_func; + client->main_context = g_main_context_ref_thread_default (); + + client->connection = g_object_ref (connection); + + if (map_id_to_client == NULL) + { + map_id_to_client = g_hash_table_new (g_direct_hash, g_direct_equal); + } + g_hash_table_insert (map_id_to_client, + GUINT_TO_POINTER (client->id), + client); + + G_UNLOCK (lock); + + has_connection (client); + + return client->id; +} + +/** + * g_bus_own_name: + * @bus_type: The type of bus to own a name on. + * @name: The well-known name to own. + * @flags: A set of flags from the #GBusNameOwnerFlags enumeration. + * @bus_acquired_handler: (allow-none): Handler to invoke when connected to the bus of type @bus_type or %NULL. + * @name_acquired_handler: (allow-none): Handler to invoke when @name is acquired or %NULL. + * @name_lost_handler: (allow-none): Handler to invoke when @name is lost or %NULL. + * @user_data: User data to pass to handlers. + * @user_data_free_func: (allow-none): Function for freeing @user_data or %NULL. + * + * Starts acquiring @name on the bus specified by @bus_type and calls + * @name_acquired_handler and @name_lost_handler when the name is + * acquired respectively lost. Callbacks will be invoked in the thread-default main + * loop of the thread you are calling this function from. + * + * You are guaranteed that one of the @name_acquired_handler and @name_lost_handler + * callbacks will be invoked after calling this function - there are three + * possible cases: + * + * + * @name_lost_handler with a %NULL connection (if a connection to the bus can't be made). + * + * + * @bus_acquired_handler then @name_lost_handler (if the name can't be obtained) + * + * + * @bus_acquired_handler then @name_acquired_handler (if the name was obtained). + * + * + * When you are done owning the name, just call g_bus_unown_name() + * with the owner id this function returns. + * + * If the name is acquired or lost (for example another application + * could acquire the name if you allow replacement or the application + * currently owning the name exits), the handlers are also invoked. If the + * #GDBusConnection that is used for attempting to own the name + * closes, then @name_lost_handler is invoked since it is no + * longer possible for other processes to access the process. + * + * You cannot use g_bus_own_name() several times for the same name (unless + * interleaved with calls to g_bus_unown_name()) - only the first call + * will work. + * + * Another guarantee is that invocations of @name_acquired_handler + * and @name_lost_handler are guaranteed to alternate; that + * is, if @name_acquired_handler is invoked then you are + * guaranteed that the next time one of the handlers is invoked, it + * will be @name_lost_handler. The reverse is also true. + * + * If you plan on exporting objects (using e.g. + * g_dbus_connection_register_object()), note that it is generally too late + * to export the objects in @name_acquired_handler. Instead, you can do this + * in @bus_acquired_handler since you are guaranteed that this will run + * before @name is requested from the bus. + * + * This behavior makes it very simple to write applications that wants + * to own names and export objects, see . + * Simply register objects to be exported in @bus_acquired_handler and + * unregister the objects (if any) in @name_lost_handler. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unown_name() to stop owning the name. + * + * Since: 2.26 + */ +guint +g_bus_own_name (GBusType bus_type, + const gchar *name, + GBusNameOwnerFlags flags, + GBusAcquiredCallback bus_acquired_handler, + GBusNameAcquiredCallback name_acquired_handler, + GBusNameLostCallback name_lost_handler, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + Client *client; + + g_return_val_if_fail (g_dbus_is_name (name) && !g_dbus_is_unique_name (name), 0); + + G_LOCK (lock); + + client = g_new0 (Client, 1); + client->ref_count = 1; + client->id = next_global_id++; /* TODO: uh oh, handle overflow */ + client->name = g_strdup (name); + client->flags = flags; + client->bus_acquired_handler = bus_acquired_handler; + client->name_acquired_handler = name_acquired_handler; + client->name_lost_handler = name_lost_handler; + client->user_data = user_data; + client->user_data_free_func = user_data_free_func; + client->main_context = g_main_context_ref_thread_default (); + + if (map_id_to_client == NULL) + { + map_id_to_client = g_hash_table_new (g_direct_hash, g_direct_equal); + } + g_hash_table_insert (map_id_to_client, + GUINT_TO_POINTER (client->id), + client); + + g_bus_get (bus_type, + NULL, + connection_get_cb, + client_ref (client)); + + G_UNLOCK (lock); + + return client->id; +} + +typedef struct { + GClosure *bus_acquired_closure; + GClosure *name_acquired_closure; + GClosure *name_lost_closure; +} OwnNameData; + +static OwnNameData * +own_name_data_new (GClosure *bus_acquired_closure, + GClosure *name_acquired_closure, + GClosure *name_lost_closure) +{ + OwnNameData *data; + + data = g_new0 (OwnNameData, 1); + + if (bus_acquired_closure != NULL) + { + data->bus_acquired_closure = g_closure_ref (bus_acquired_closure); + g_closure_sink (bus_acquired_closure); + if (G_CLOSURE_NEEDS_MARSHAL (bus_acquired_closure)) + g_closure_set_marshal (bus_acquired_closure, g_cclosure_marshal_generic); + } + + if (name_acquired_closure != NULL) + { + data->name_acquired_closure = g_closure_ref (name_acquired_closure); + g_closure_sink (name_acquired_closure); + if (G_CLOSURE_NEEDS_MARSHAL (name_acquired_closure)) + g_closure_set_marshal (name_acquired_closure, g_cclosure_marshal_generic); + } + + if (name_lost_closure != NULL) + { + data->name_lost_closure = g_closure_ref (name_lost_closure); + g_closure_sink (name_lost_closure); + if (G_CLOSURE_NEEDS_MARSHAL (name_lost_closure)) + g_closure_set_marshal (name_lost_closure, g_cclosure_marshal_generic); + } + + return data; +} + +static void +own_with_closures_on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + + g_value_init (¶ms[0], G_TYPE_DBUS_CONNECTION); + g_value_set_object (¶ms[0], connection); + + g_value_init (¶ms[1], G_TYPE_STRING); + g_value_set_string (¶ms[1], name); + + g_closure_invoke (data->bus_acquired_closure, NULL, 2, params, NULL); + + g_value_unset (params + 0); + g_value_unset (params + 1); +} + +static void +own_with_closures_on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + + g_value_init (¶ms[0], G_TYPE_DBUS_CONNECTION); + g_value_set_object (¶ms[0], connection); + + g_value_init (¶ms[1], G_TYPE_STRING); + g_value_set_string (¶ms[1], name); + + g_closure_invoke (data->name_acquired_closure, NULL, 2, params, NULL); + + g_value_unset (params + 0); + g_value_unset (params + 1); +} + +static void +own_with_closures_on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + + g_value_init (¶ms[0], G_TYPE_DBUS_CONNECTION); + g_value_set_object (¶ms[0], connection); + + g_value_init (¶ms[1], G_TYPE_STRING); + g_value_set_string (¶ms[1], name); + + g_closure_invoke (data->name_lost_closure, NULL, 2, params, NULL); + + g_value_unset (params + 0); + g_value_unset (params + 1); +} + +static void +bus_own_name_free_func (gpointer user_data) +{ + OwnNameData *data = user_data; + + if (data->bus_acquired_closure != NULL) + g_closure_unref (data->bus_acquired_closure); + + if (data->name_acquired_closure != NULL) + g_closure_unref (data->name_acquired_closure); + + if (data->name_lost_closure != NULL) + g_closure_unref (data->name_lost_closure); + + g_free (data); +} + +/** + * g_bus_own_name_with_closures: + * @bus_type: The type of bus to own a name on. + * @name: The well-known name to own. + * @flags: A set of flags from the #GBusNameOwnerFlags enumeration. + * @bus_acquired_closure: (allow-none): #GClosure to invoke when connected to + * the bus of type @bus_type or %NULL. + * @name_acquired_closure: (allow-none): #GClosure to invoke when @name is + * acquired or %NULL. + * @name_lost_closure: (allow-none): #GClosure to invoke when @name is lost or + * %NULL. + * + * Version of g_bus_own_name() using closures instead of callbacks for + * easier binding in other languages. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unown_name() to stop owning the name. + * + * Rename to: g_bus_own_name + * + * Since: 2.26 + */ +guint +g_bus_own_name_with_closures (GBusType bus_type, + const gchar *name, + GBusNameOwnerFlags flags, + GClosure *bus_acquired_closure, + GClosure *name_acquired_closure, + GClosure *name_lost_closure) +{ + return g_bus_own_name (bus_type, + name, + flags, + bus_acquired_closure != NULL ? own_with_closures_on_bus_acquired : NULL, + name_acquired_closure != NULL ? own_with_closures_on_name_acquired : NULL, + name_lost_closure != NULL ? own_with_closures_on_name_lost : NULL, + own_name_data_new (bus_acquired_closure, + name_acquired_closure, + name_lost_closure), + bus_own_name_free_func); +} + +/** + * g_bus_own_name_on_connection_with_closures: + * @connection: A #GDBusConnection. + * @name: The well-known name to own. + * @flags: A set of flags from the #GBusNameOwnerFlags enumeration. + * @name_acquired_closure: (allow-none): #GClosure to invoke when @name is + * acquired or %NULL. + * @name_lost_closure: (allow-none): #GClosure to invoke when @name is lost or + * %NULL. + * + * Version of g_bus_own_name_on_connection() using closures instead of callbacks for + * easier binding in other languages. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unown_name() to stop owning the name. + * + * Rename to: g_bus_own_name_on_connection + * + * Since: 2.26 + */ +guint +g_bus_own_name_on_connection_with_closures (GDBusConnection *connection, + const gchar *name, + GBusNameOwnerFlags flags, + GClosure *name_acquired_closure, + GClosure *name_lost_closure) +{ + return g_bus_own_name_on_connection (connection, + name, + flags, + name_acquired_closure != NULL ? own_with_closures_on_name_acquired : NULL, + name_lost_closure != NULL ? own_with_closures_on_name_lost : NULL, + own_name_data_new (NULL, + name_acquired_closure, + name_lost_closure), + bus_own_name_free_func); +} + +/** + * g_bus_unown_name: + * @owner_id: An identifier obtained from g_bus_own_name() + * + * Stops owning a name. + * + * Since: 2.26 + */ +void +g_bus_unown_name (guint owner_id) +{ + Client *client; + + g_return_if_fail (owner_id > 0); + + client = NULL; + + G_LOCK (lock); + if (owner_id == 0 || map_id_to_client == NULL || + (client = g_hash_table_lookup (map_id_to_client, GUINT_TO_POINTER (owner_id))) == NULL) + { + g_warning ("Invalid id %d passed to g_bus_unown_name()", owner_id); + goto out; + } + + client->cancelled = TRUE; + g_warn_if_fail (g_hash_table_remove (map_id_to_client, GUINT_TO_POINTER (owner_id))); + + out: + G_UNLOCK (lock); + + /* do callback without holding lock */ + if (client != NULL) + { + /* Release the name if needed */ + if (client->needs_release && client->connection != NULL) + { + GVariant *result; + GError *error; + guint32 release_name_reply; + + /* TODO: it kinda sucks having to do a sync call to release the name - but if + * we don't, then a subsequent grab of the name will make the bus daemon return + * IN_QUEUE which will trigger name_lost(). + * + * I believe this is a bug in the bus daemon. + */ + error = NULL; + result = g_dbus_connection_call_sync (client->connection, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "ReleaseName", /* method name */ + g_variant_new ("(s)", client->name), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (result == NULL) + { + g_warning ("Error releasing name %s: %s", client->name, error->message); + g_error_free (error); + } + else + { + g_variant_get (result, "(u)", &release_name_reply); + if (release_name_reply != 1 /* DBUS_RELEASE_NAME_REPLY_RELEASED */) + { + g_warning ("Unexpected reply %d when releasing name %s", release_name_reply, client->name); + } + g_variant_unref (result); + } + } + + if (client->disconnected_signal_handler_id > 0) + g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); + if (client->name_acquired_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_acquired_subscription_id); + if (client->name_lost_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_lost_subscription_id); + client->disconnected_signal_handler_id = 0; + client->name_acquired_subscription_id = 0; + client->name_lost_subscription_id = 0; + if (client->connection != NULL) + { + g_object_unref (client->connection); + client->connection = NULL; + } + + client_unref (client); + } +} diff --git a/gio/gdbusnameowning.h b/gio/gdbusnameowning.h new file mode 100644 index 0000000..6e69bff --- /dev/null +++ b/gio/gdbusnameowning.h @@ -0,0 +1,117 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_NAME_OWNING_H__ +#define __G_DBUS_NAME_OWNING_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * GBusAcquiredCallback: + * @connection: The #GDBusConnection to a message bus. + * @name: The name that is requested to be owned. + * @user_data: User data passed to g_bus_own_name(). + * + * Invoked when a connection to a message bus has been obtained. + * + * Since: 2.26 + */ +typedef void (*GBusAcquiredCallback) (GDBusConnection *connection, + const gchar *name, + gpointer user_data); + +/** + * GBusNameAcquiredCallback: + * @connection: The #GDBusConnection on which to acquired the name. + * @name: The name being owned. + * @user_data: User data passed to g_bus_own_name() or g_bus_own_name_on_connection(). + * + * Invoked when the name is acquired. + * + * Since: 2.26 + */ +typedef void (*GBusNameAcquiredCallback) (GDBusConnection *connection, + const gchar *name, + gpointer user_data); + +/** + * GBusNameLostCallback: + * @connection: The #GDBusConnection on which to acquire the name or %NULL if + * the connection was disconnected. + * @name: The name being owned. + * @user_data: User data passed to g_bus_own_name() or g_bus_own_name_on_connection(). + * + * Invoked when the name is lost or @connection has been closed. + * + * Since: 2.26 + */ +typedef void (*GBusNameLostCallback) (GDBusConnection *connection, + const gchar *name, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +guint g_bus_own_name (GBusType bus_type, + const gchar *name, + GBusNameOwnerFlags flags, + GBusAcquiredCallback bus_acquired_handler, + GBusNameAcquiredCallback name_acquired_handler, + GBusNameLostCallback name_lost_handler, + gpointer user_data, + GDestroyNotify user_data_free_func); + +GLIB_AVAILABLE_IN_ALL +guint g_bus_own_name_on_connection (GDBusConnection *connection, + const gchar *name, + GBusNameOwnerFlags flags, + GBusNameAcquiredCallback name_acquired_handler, + GBusNameLostCallback name_lost_handler, + gpointer user_data, + GDestroyNotify user_data_free_func); + +GLIB_AVAILABLE_IN_ALL +guint g_bus_own_name_with_closures (GBusType bus_type, + const gchar *name, + GBusNameOwnerFlags flags, + GClosure *bus_acquired_closure, + GClosure *name_acquired_closure, + GClosure *name_lost_closure); + +GLIB_AVAILABLE_IN_ALL +guint g_bus_own_name_on_connection_with_closures ( + GDBusConnection *connection, + const gchar *name, + GBusNameOwnerFlags flags, + GClosure *name_acquired_closure, + GClosure *name_lost_closure); + +GLIB_AVAILABLE_IN_ALL +void g_bus_unown_name (guint owner_id); + +G_END_DECLS + +#endif /* __G_DBUS_NAME_OWNING_H__ */ diff --git a/gio/gdbusnamewatching.c b/gio/gdbusnamewatching.c new file mode 100644 index 0000000..12e8ed7 --- /dev/null +++ b/gio/gdbusnamewatching.c @@ -0,0 +1,851 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include "gdbusutils.h" +#include "gdbusnamewatching.h" +#include "gdbuserror.h" +#include "gdbusprivate.h" +#include "gdbusconnection.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusnamewatching + * @title: Watching Bus Names + * @short_description: Simple API for watching bus names + * @include: gio/gio.h + * + * Convenience API for watching bus names. + * + * Simple application watching a nameFIXME: MISSING XINCLUDE CONTENT + */ + +G_LOCK_DEFINE_STATIC (lock); + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef enum +{ + PREVIOUS_CALL_NONE = 0, + PREVIOUS_CALL_APPEARED, + PREVIOUS_CALL_VANISHED, +} PreviousCall; + +typedef struct +{ + volatile gint ref_count; + guint id; + gchar *name; + GBusNameWatcherFlags flags; + gchar *name_owner; + GBusNameAppearedCallback name_appeared_handler; + GBusNameVanishedCallback name_vanished_handler; + gpointer user_data; + GDestroyNotify user_data_free_func; + GMainContext *main_context; + + GDBusConnection *connection; + gulong disconnected_signal_handler_id; + guint name_owner_changed_subscription_id; + + PreviousCall previous_call; + + gboolean cancelled; + gboolean initialized; +} Client; + +static guint next_global_id = 1; +static GHashTable *map_id_to_client = NULL; + +static Client * +client_ref (Client *client) +{ + g_atomic_int_inc (&client->ref_count); + return client; +} + +static void +client_unref (Client *client) +{ + if (g_atomic_int_dec_and_test (&client->ref_count)) + { + if (client->connection != NULL) + { + if (client->name_owner_changed_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_owner_changed_subscription_id); + if (client->disconnected_signal_handler_id > 0) + g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); + g_object_unref (client->connection); + } + g_free (client->name); + g_free (client->name_owner); + g_main_context_unref (client->main_context); + if (client->user_data_free_func != NULL) + client->user_data_free_func (client->user_data); + g_free (client); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef enum +{ + CALL_TYPE_NAME_APPEARED, + CALL_TYPE_NAME_VANISHED +} CallType; + +typedef struct +{ + Client *client; + + /* keep this separate because client->connection may + * be set to NULL after scheduling the call + */ + GDBusConnection *connection; + + /* ditto */ + gchar *name_owner; + + CallType call_type; +} CallHandlerData; + +static void +call_handler_data_free (CallHandlerData *data) +{ + if (data->connection != NULL) + g_object_unref (data->connection); + g_free (data->name_owner); + client_unref (data->client); + g_free (data); +} + +static void +actually_do_call (Client *client, GDBusConnection *connection, const gchar *name_owner, CallType call_type) +{ + switch (call_type) + { + case CALL_TYPE_NAME_APPEARED: + if (client->name_appeared_handler != NULL) + { + client->name_appeared_handler (connection, + client->name, + name_owner, + client->user_data); + } + break; + + case CALL_TYPE_NAME_VANISHED: + if (client->name_vanished_handler != NULL) + { + client->name_vanished_handler (connection, + client->name, + client->user_data); + } + break; + + default: + g_assert_not_reached (); + break; + } +} + +static gboolean +call_in_idle_cb (gpointer _data) +{ + CallHandlerData *data = _data; + actually_do_call (data->client, data->connection, data->name_owner, data->call_type); + return FALSE; +} + +static void +schedule_call_in_idle (Client *client, CallType call_type) +{ + CallHandlerData *data; + GSource *idle_source; + + data = g_new0 (CallHandlerData, 1); + data->client = client_ref (client); + data->connection = client->connection != NULL ? g_object_ref (client->connection) : NULL; + data->name_owner = g_strdup (client->name_owner); + data->call_type = call_type; + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_HIGH); + g_source_set_callback (idle_source, + call_in_idle_cb, + data, + (GDestroyNotify) call_handler_data_free); + g_source_attach (idle_source, client->main_context); + g_source_unref (idle_source); +} + +static void +do_call (Client *client, CallType call_type) +{ + GMainContext *current_context; + + /* only schedule in idle if we're not in the right thread */ + current_context = g_main_context_ref_thread_default (); + if (current_context != client->main_context) + schedule_call_in_idle (client, call_type); + else + actually_do_call (client, client->connection, client->name_owner, call_type); + g_main_context_unref (current_context); +} + +static void +call_appeared_handler (Client *client) +{ + if (client->previous_call != PREVIOUS_CALL_APPEARED) + { + client->previous_call = PREVIOUS_CALL_APPEARED; + if (!client->cancelled && client->name_appeared_handler != NULL) + { + do_call (client, CALL_TYPE_NAME_APPEARED); + } + } +} + +static void +call_vanished_handler (Client *client, + gboolean ignore_cancelled) +{ + if (client->previous_call != PREVIOUS_CALL_VANISHED) + { + client->previous_call = PREVIOUS_CALL_VANISHED; + if (((!client->cancelled) || ignore_cancelled) && client->name_vanished_handler != NULL) + { + do_call (client, CALL_TYPE_NAME_VANISHED); + } + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_connection_disconnected (GDBusConnection *connection, + gboolean remote_peer_vanished, + GError *error, + gpointer user_data) +{ + Client *client = user_data; + + if (client->name_owner_changed_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (client->connection, client->name_owner_changed_subscription_id); + if (client->disconnected_signal_handler_id > 0) + g_signal_handler_disconnect (client->connection, client->disconnected_signal_handler_id); + g_object_unref (client->connection); + client->disconnected_signal_handler_id = 0; + client->name_owner_changed_subscription_id = 0; + client->connection = NULL; + + call_vanished_handler (client, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_name_owner_changed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + Client *client = user_data; + const gchar *name; + const gchar *old_owner; + const gchar *new_owner; + + if (!client->initialized) + goto out; + + if (g_strcmp0 (object_path, "/org/freedesktop/DBus") != 0 || + g_strcmp0 (interface_name, "org.freedesktop.DBus") != 0 || + g_strcmp0 (sender_name, "org.freedesktop.DBus") != 0) + goto out; + + g_variant_get (parameters, + "(&s&s&s)", + &name, + &old_owner, + &new_owner); + + /* we only care about a specific name */ + if (g_strcmp0 (name, client->name) != 0) + goto out; + + if ((old_owner != NULL && strlen (old_owner) > 0) && client->name_owner != NULL) + { + g_free (client->name_owner); + client->name_owner = NULL; + call_vanished_handler (client, FALSE); + } + + if (new_owner != NULL && strlen (new_owner) > 0) + { + g_warn_if_fail (client->name_owner == NULL); + g_free (client->name_owner); + client->name_owner = g_strdup (new_owner); + call_appeared_handler (client); + } + + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +get_name_owner_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + Client *client = user_data; + GVariant *result; + const char *name_owner; + + name_owner = NULL; + result = NULL; + + result = g_dbus_connection_call_finish (client->connection, + res, + NULL); + if (result != NULL) + { + g_variant_get (result, "(&s)", &name_owner); + } + + if (name_owner != NULL) + { + g_warn_if_fail (client->name_owner == NULL); + client->name_owner = g_strdup (name_owner); + call_appeared_handler (client); + } + else + { + call_vanished_handler (client, FALSE); + } + + client->initialized = TRUE; + + if (result != NULL) + g_variant_unref (result); + client_unref (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +invoke_get_name_owner (Client *client) +{ + g_dbus_connection_call (client->connection, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetNameOwner", /* method name */ + g_variant_new ("(s)", client->name), + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) get_name_owner_cb, + client_ref (client)); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +start_service_by_name_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + Client *client = user_data; + GVariant *result; + + result = NULL; + + result = g_dbus_connection_call_finish (client->connection, + res, + NULL); + if (result != NULL) + { + guint32 start_service_result; + g_variant_get (result, "(u)", &start_service_result); + + if (start_service_result == 1) /* DBUS_START_REPLY_SUCCESS */ + { + invoke_get_name_owner (client); + } + else if (start_service_result == 2) /* DBUS_START_REPLY_ALREADY_RUNNING */ + { + invoke_get_name_owner (client); + } + else + { + g_warning ("Unexpected reply %d from StartServiceByName() method", start_service_result); + call_vanished_handler (client, FALSE); + client->initialized = TRUE; + } + } + else + { + /* Errors are not unexpected; the bus will reply e.g. + * + * org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.Epiphany2 + * was not provided by any .service files + * + * This doesn't mean that the name doesn't have an owner, just + * that it's not provided by a .service file. So proceed to + * invoke GetNameOwner(). + */ + invoke_get_name_owner (client); + } + + if (result != NULL) + g_variant_unref (result); + client_unref (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +has_connection (Client *client) +{ + /* listen for disconnection */ + client->disconnected_signal_handler_id = g_signal_connect (client->connection, + "closed", + G_CALLBACK (on_connection_disconnected), + client); + + /* start listening to NameOwnerChanged messages immediately */ + client->name_owner_changed_subscription_id = g_dbus_connection_signal_subscribe (client->connection, + "org.freedesktop.DBus", /* name */ + "org.freedesktop.DBus", /* if */ + "NameOwnerChanged", /* signal */ + "/org/freedesktop/DBus", /* path */ + client->name, + G_DBUS_SIGNAL_FLAGS_NONE, + on_name_owner_changed, + client, + NULL); + + if (client->flags & G_BUS_NAME_WATCHER_FLAGS_AUTO_START) + { + g_dbus_connection_call (client->connection, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "StartServiceByName", /* method name */ + g_variant_new ("(su)", client->name, 0), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) start_service_by_name_cb, + client_ref (client)); + } + else + { + /* check owner */ + invoke_get_name_owner (client); + } +} + + +static void +connection_get_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + Client *client = user_data; + + client->connection = g_bus_get_finish (res, NULL); + if (client->connection == NULL) + { + call_vanished_handler (client, FALSE); + goto out; + } + + has_connection (client); + + out: + client_unref (client); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_bus_watch_name: + * @bus_type: The type of bus to watch a name on. + * @name: The name (well-known or unique) to watch. + * @flags: Flags from the #GBusNameWatcherFlags enumeration. + * @name_appeared_handler: (allow-none): Handler to invoke when @name is known to exist or %NULL. + * @name_vanished_handler: (allow-none): Handler to invoke when @name is known to not exist or %NULL. + * @user_data: User data to pass to handlers. + * @user_data_free_func: (allow-none): Function for freeing @user_data or %NULL. + * + * Starts watching @name on the bus specified by @bus_type and calls + * @name_appeared_handler and @name_vanished_handler when the name is + * known to have a owner respectively known to lose its + * owner. Callbacks will be invoked in the thread-default main + * loop of the thread you are calling this function from. + * + * You are guaranteed that one of the handlers will be invoked after + * calling this function. When you are done watching the name, just + * call g_bus_unwatch_name() with the watcher id this function + * returns. + * + * If the name vanishes or appears (for example the application owning + * the name could restart), the handlers are also invoked. If the + * #GDBusConnection that is used for watching the name disconnects, then + * @name_vanished_handler is invoked since it is no longer + * possible to access the name. + * + * Another guarantee is that invocations of @name_appeared_handler + * and @name_vanished_handler are guaranteed to alternate; that + * is, if @name_appeared_handler is invoked then you are + * guaranteed that the next time one of the handlers is invoked, it + * will be @name_vanished_handler. The reverse is also true. + * + * This behavior makes it very simple to write applications that wants + * to take action when a certain name exists, see . Basically, the application + * should create object proxies in @name_appeared_handler and destroy + * them again (if any) in @name_vanished_handler. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unwatch_name() to stop watching the name. + * + * Since: 2.26 + */ +guint +g_bus_watch_name (GBusType bus_type, + const gchar *name, + GBusNameWatcherFlags flags, + GBusNameAppearedCallback name_appeared_handler, + GBusNameVanishedCallback name_vanished_handler, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + Client *client; + + g_return_val_if_fail (g_dbus_is_name (name), 0); + + G_LOCK (lock); + + client = g_new0 (Client, 1); + client->ref_count = 1; + client->id = next_global_id++; /* TODO: uh oh, handle overflow */ + client->name = g_strdup (name); + client->flags = flags; + client->name_appeared_handler = name_appeared_handler; + client->name_vanished_handler = name_vanished_handler; + client->user_data = user_data; + client->user_data_free_func = user_data_free_func; + client->main_context = g_main_context_ref_thread_default (); + + if (map_id_to_client == NULL) + { + map_id_to_client = g_hash_table_new (g_direct_hash, g_direct_equal); + } + g_hash_table_insert (map_id_to_client, + GUINT_TO_POINTER (client->id), + client); + + g_bus_get (bus_type, + NULL, + connection_get_cb, + client_ref (client)); + + G_UNLOCK (lock); + + return client->id; +} + +/** + * g_bus_watch_name_on_connection: + * @connection: A #GDBusConnection. + * @name: The name (well-known or unique) to watch. + * @flags: Flags from the #GBusNameWatcherFlags enumeration. + * @name_appeared_handler: (allow-none): Handler to invoke when @name is known to exist or %NULL. + * @name_vanished_handler: (allow-none): Handler to invoke when @name is known to not exist or %NULL. + * @user_data: User data to pass to handlers. + * @user_data_free_func: (allow-none): Function for freeing @user_data or %NULL. + * + * Like g_bus_watch_name() but takes a #GDBusConnection instead of a + * #GBusType. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unwatch_name() to stop watching the name. + * + * Since: 2.26 + */ +guint g_bus_watch_name_on_connection (GDBusConnection *connection, + const gchar *name, + GBusNameWatcherFlags flags, + GBusNameAppearedCallback name_appeared_handler, + GBusNameVanishedCallback name_vanished_handler, + gpointer user_data, + GDestroyNotify user_data_free_func) +{ + Client *client; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), 0); + g_return_val_if_fail (g_dbus_is_name (name), 0); + + G_LOCK (lock); + + client = g_new0 (Client, 1); + client->ref_count = 1; + client->id = next_global_id++; /* TODO: uh oh, handle overflow */ + client->name = g_strdup (name); + client->flags = flags; + client->name_appeared_handler = name_appeared_handler; + client->name_vanished_handler = name_vanished_handler; + client->user_data = user_data; + client->user_data_free_func = user_data_free_func; + client->main_context = g_main_context_ref_thread_default (); + + if (map_id_to_client == NULL) + map_id_to_client = g_hash_table_new (g_direct_hash, g_direct_equal); + + g_hash_table_insert (map_id_to_client, + GUINT_TO_POINTER (client->id), + client); + + client->connection = g_object_ref (connection); + G_UNLOCK (lock); + + has_connection (client); + + return client->id; +} + +typedef struct { + GClosure *name_appeared_closure; + GClosure *name_vanished_closure; +} WatchNameData; + +static WatchNameData * +watch_name_data_new (GClosure *name_appeared_closure, + GClosure *name_vanished_closure) +{ + WatchNameData *data; + + data = g_new0 (WatchNameData, 1); + + if (name_appeared_closure != NULL) + { + data->name_appeared_closure = g_closure_ref (name_appeared_closure); + g_closure_sink (name_appeared_closure); + if (G_CLOSURE_NEEDS_MARSHAL (name_appeared_closure)) + g_closure_set_marshal (name_appeared_closure, g_cclosure_marshal_generic); + } + + if (name_vanished_closure != NULL) + { + data->name_vanished_closure = g_closure_ref (name_vanished_closure); + g_closure_sink (name_vanished_closure); + if (G_CLOSURE_NEEDS_MARSHAL (name_vanished_closure)) + g_closure_set_marshal (name_vanished_closure, g_cclosure_marshal_generic); + } + + return data; +} + +static void +watch_with_closures_on_name_appeared (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + WatchNameData *data = user_data; + GValue params[3] = { G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT }; + + g_value_init (¶ms[0], G_TYPE_DBUS_CONNECTION); + g_value_set_object (¶ms[0], connection); + + g_value_init (¶ms[1], G_TYPE_STRING); + g_value_set_string (¶ms[1], name); + + g_value_init (¶ms[2], G_TYPE_STRING); + g_value_set_string (¶ms[2], name_owner); + + g_closure_invoke (data->name_appeared_closure, NULL, 3, params, NULL); + + g_value_unset (params + 0); + g_value_unset (params + 1); + g_value_unset (params + 2); +} + +static void +watch_with_closures_on_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + WatchNameData *data = user_data; + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + + g_value_init (¶ms[0], G_TYPE_DBUS_CONNECTION); + g_value_set_object (¶ms[0], connection); + + g_value_init (¶ms[1], G_TYPE_STRING); + g_value_set_string (¶ms[1], name); + + g_closure_invoke (data->name_vanished_closure, NULL, 2, params, NULL); + + g_value_unset (params + 0); + g_value_unset (params + 1); +} + +static void +bus_watch_name_free_func (gpointer user_data) +{ + WatchNameData *data = user_data; + + if (data->name_appeared_closure != NULL) + g_closure_unref (data->name_appeared_closure); + + if (data->name_vanished_closure != NULL) + g_closure_unref (data->name_vanished_closure); + + g_free (data); +} + +/** + * g_bus_watch_name_with_closures: + * @bus_type: The type of bus to watch a name on. + * @name: The name (well-known or unique) to watch. + * @flags: Flags from the #GBusNameWatcherFlags enumeration. + * @name_appeared_closure: (allow-none): #GClosure to invoke when @name is known + * to exist or %NULL. + * @name_vanished_closure: (allow-none): #GClosure to invoke when @name is known + * to not exist or %NULL. + * + * Version of g_bus_watch_name() using closures instead of callbacks for + * easier binding in other languages. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unwatch_name() to stop watching the name. + * + * Rename to: g_bus_watch_name + * + * Since: 2.26 + */ +guint +g_bus_watch_name_with_closures (GBusType bus_type, + const gchar *name, + GBusNameWatcherFlags flags, + GClosure *name_appeared_closure, + GClosure *name_vanished_closure) +{ + return g_bus_watch_name (bus_type, + name, + flags, + name_appeared_closure != NULL ? watch_with_closures_on_name_appeared : NULL, + name_vanished_closure != NULL ? watch_with_closures_on_name_vanished : NULL, + watch_name_data_new (name_appeared_closure, name_vanished_closure), + bus_watch_name_free_func); +} + +/** + * g_bus_watch_name_on_connection_with_closures: + * @connection: A #GDBusConnection. + * @name: The name (well-known or unique) to watch. + * @flags: Flags from the #GBusNameWatcherFlags enumeration. + * @name_appeared_closure: (allow-none): #GClosure to invoke when @name is known + * to exist or %NULL. + * @name_vanished_closure: (allow-none): #GClosure to invoke when @name is known + * to not exist or %NULL. + * + * Version of g_bus_watch_name_on_connection() using closures instead of callbacks for + * easier binding in other languages. + * + * Returns: An identifier (never 0) that an be used with + * g_bus_unwatch_name() to stop watching the name. + * + * Rename to: g_bus_watch_name_on_connection + * + * Since: 2.26 + */ +guint g_bus_watch_name_on_connection_with_closures ( + GDBusConnection *connection, + const gchar *name, + GBusNameWatcherFlags flags, + GClosure *name_appeared_closure, + GClosure *name_vanished_closure) +{ + return g_bus_watch_name_on_connection (connection, + name, + flags, + name_appeared_closure != NULL ? watch_with_closures_on_name_appeared : NULL, + name_vanished_closure != NULL ? watch_with_closures_on_name_vanished : NULL, + watch_name_data_new (name_appeared_closure, name_vanished_closure), + bus_watch_name_free_func); +} + +/** + * g_bus_unwatch_name: + * @watcher_id: An identifier obtained from g_bus_watch_name() + * + * Stops watching a name. + * + * Since: 2.26 + */ +void +g_bus_unwatch_name (guint watcher_id) +{ + Client *client; + + g_return_if_fail (watcher_id > 0); + + client = NULL; + + G_LOCK (lock); + if (watcher_id == 0 || + map_id_to_client == NULL || + (client = g_hash_table_lookup (map_id_to_client, GUINT_TO_POINTER (watcher_id))) == NULL) + { + g_warning ("Invalid id %d passed to g_bus_unwatch_name()", watcher_id); + goto out; + } + + client->cancelled = TRUE; + g_warn_if_fail (g_hash_table_remove (map_id_to_client, GUINT_TO_POINTER (watcher_id))); + + out: + G_UNLOCK (lock); + + /* do callback without holding lock */ + if (client != NULL) + { + client_unref (client); + } +} diff --git a/gio/gdbusnamewatching.h b/gio/gdbusnamewatching.h new file mode 100644 index 0000000..85607bf --- /dev/null +++ b/gio/gdbusnamewatching.h @@ -0,0 +1,104 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_NAME_WATCHING_H__ +#define __G_DBUS_NAME_WATCHING_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * GBusNameAppearedCallback: + * @connection: The #GDBusConnection the name is being watched on. + * @name: The name being watched. + * @name_owner: Unique name of the owner of the name being watched. + * @user_data: User data passed to g_bus_watch_name(). + * + * Invoked when the name being watched is known to have to have a owner. + * + * Since: 2.26 + */ +typedef void (*GBusNameAppearedCallback) (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data); + +/** + * GBusNameVanishedCallback: + * @connection: The #GDBusConnection the name is being watched on, or + * %NULL. + * @name: The name being watched. + * @user_data: User data passed to g_bus_watch_name(). + * + * Invoked when the name being watched is known not to have to have a owner. + * + * This is also invoked when the #GDBusConection on which the watch was + * established has been closed. In that case, @connection will be + * %NULL. + * + * Since: 2.26 + */ +typedef void (*GBusNameVanishedCallback) (GDBusConnection *connection, + const gchar *name, + gpointer user_data); + + +GLIB_AVAILABLE_IN_ALL +guint g_bus_watch_name (GBusType bus_type, + const gchar *name, + GBusNameWatcherFlags flags, + GBusNameAppearedCallback name_appeared_handler, + GBusNameVanishedCallback name_vanished_handler, + gpointer user_data, + GDestroyNotify user_data_free_func); +GLIB_AVAILABLE_IN_ALL +guint g_bus_watch_name_on_connection (GDBusConnection *connection, + const gchar *name, + GBusNameWatcherFlags flags, + GBusNameAppearedCallback name_appeared_handler, + GBusNameVanishedCallback name_vanished_handler, + gpointer user_data, + GDestroyNotify user_data_free_func); +GLIB_AVAILABLE_IN_ALL +guint g_bus_watch_name_with_closures (GBusType bus_type, + const gchar *name, + GBusNameWatcherFlags flags, + GClosure *name_appeared_closure, + GClosure *name_vanished_closure); +GLIB_AVAILABLE_IN_ALL +guint g_bus_watch_name_on_connection_with_closures ( + GDBusConnection *connection, + const gchar *name, + GBusNameWatcherFlags flags, + GClosure *name_appeared_closure, + GClosure *name_vanished_closure); +GLIB_AVAILABLE_IN_ALL +void g_bus_unwatch_name (guint watcher_id); + +G_END_DECLS + +#endif /* __G_DBUS_NAME_WATCHING_H__ */ diff --git a/gio/gdbusobject.c b/gio/gdbusobject.c new file mode 100644 index 0000000..52f003d --- /dev/null +++ b/gio/gdbusobject.c @@ -0,0 +1,147 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobject.h" +#include "gdbusinterface.h" +#include "gdbusutils.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobject + * @short_description: Base type for D-Bus objects + * @include: gio/gio.h + * + * The #GDBusObject type is the base type for D-Bus objects on both + * the service side (see #GDBusObjectSkeleton) and the client side + * (see #GDBusObjectProxy). It is essentially just a container of + * interfaces. + */ + +typedef GDBusObjectIface GDBusObjectInterface; +G_DEFINE_INTERFACE (GDBusObject, g_dbus_object, G_TYPE_OBJECT) + +static void +g_dbus_object_default_init (GDBusObjectIface *iface) +{ + /** + * GDBusObject::interface-added: + * @object: The #GDBusObject emitting the signal. + * @interface: The #GDBusInterface that was added. + * + * Emitted when @interface is added to @object. + * + * Since: 2.30 + */ + g_signal_new ("interface-added", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectIface, interface_added), + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_DBUS_INTERFACE); + + /** + * GDBusObject::interface-removed: + * @object: The #GDBusObject emitting the signal. + * @interface: The #GDBusInterface that was removed. + * + * Emitted when @interface is removed from @object. + * + * Since: 2.30 + */ + g_signal_new ("interface-removed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectIface, interface_removed), + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_DBUS_INTERFACE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_get_object_path: + * @object: A #GDBusObject. + * + * Gets the object path for @object. + * + * Returns: A string owned by @object. Do not free. + * + * Since: 2.30 + */ +const gchar * +g_dbus_object_get_object_path (GDBusObject *object) +{ + GDBusObjectIface *iface = G_DBUS_OBJECT_GET_IFACE (object); + return iface->get_object_path (object); +} + +/** + * g_dbus_object_get_interfaces: + * @object: A #GDBusObject. + * + * Gets the D-Bus interfaces associated with @object. + * + * Returns: (element-type GDBusInterface) (transfer full) : A list of #GDBusInterface instances. + * The returned list must be freed by g_list_free() after each element has been freed + * with g_object_unref(). + * + * Since: 2.30 + */ +GList * +g_dbus_object_get_interfaces (GDBusObject *object) +{ + GDBusObjectIface *iface = G_DBUS_OBJECT_GET_IFACE (object); + return iface->get_interfaces (object); +} + +/** + * g_dbus_object_get_interface: + * @object: A #GDBusObject. + * @interface_name: A D-Bus interface name. + * + * Gets the D-Bus interface with name @interface_name associated with + * @object, if any. + * + * Returns: (transfer full): %NULL if not found, otherwise a + * #GDBusInterface that must be freed with g_object_unref(). + * + * Since: 2.30 + */ +GDBusInterface * +g_dbus_object_get_interface (GDBusObject *object, + const gchar *interface_name) +{ + GDBusObjectIface *iface = G_DBUS_OBJECT_GET_IFACE (object); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + return iface->get_interface (object, interface_name); +} diff --git a/gio/gdbusobject.h b/gio/gdbusobject.h new file mode 100644 index 0000000..ad6c4d8 --- /dev/null +++ b/gio/gdbusobject.h @@ -0,0 +1,80 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_H__ +#define __G_DBUS_OBJECT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT (g_dbus_object_get_type()) +#define G_DBUS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT, GDBusObject)) +#define G_IS_DBUS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT)) +#define G_DBUS_OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), G_TYPE_DBUS_OBJECT, GDBusObjectIface)) + +typedef struct _GDBusObjectIface GDBusObjectIface; + +/** + * GDBusObjectIface: + * @parent_iface: The parent interface. + * @get_object_path: Returns the object path. See g_dbus_object_get_object_path(). + * @get_interfaces: Returns all interfaces. See g_dbus_object_get_interfaces(). + * @get_interface: Returns an interface by name. See g_dbus_object_get_interface(). + * @interface_added: Signal handler for the #GDBusObject::interface-added signal. + * @interface_removed: Signal handler for the #GDBusObject::interface-removed signal. + * + * Base object type for D-Bus objects. + * + * Since: 2.30 + */ +struct _GDBusObjectIface +{ + GTypeInterface parent_iface; + + /* Virtual Functions */ + const gchar *(*get_object_path) (GDBusObject *object); + GList *(*get_interfaces) (GDBusObject *object); + GDBusInterface *(*get_interface) (GDBusObject *object, + const gchar *interface_name); + + /* Signals */ + void (*interface_added) (GDBusObject *object, + GDBusInterface *interface_); + void (*interface_removed) (GDBusObject *object, + GDBusInterface *interface_); + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_object_get_object_path (GDBusObject *object); +GLIB_AVAILABLE_IN_ALL +GList *g_dbus_object_get_interfaces (GDBusObject *object); +GLIB_AVAILABLE_IN_ALL +GDBusInterface *g_dbus_object_get_interface (GDBusObject *object, + const gchar *interface_name); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_H__ */ diff --git a/gio/gdbusobjectmanager.c b/gio/gdbusobjectmanager.c new file mode 100644 index 0000000..3a7a5ec --- /dev/null +++ b/gio/gdbusobjectmanager.c @@ -0,0 +1,227 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobject.h" +#include "gdbusobjectmanager.h" +#include "gdbusinterface.h" +#include "gdbusutils.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobjectmanager + * @short_description: Base type for D-Bus object managers + * @include: gio/gio.h + * + * The #GDBusObjectManager type is the base type for service- and + * client-side implementations of the standardized org.freedesktop.DBus.ObjectManager + * interface. + * + * See #GDBusObjectManagerClient for the client-side implementation + * and #GDBusObjectManagerServer for the service-side implementation. + */ + +typedef GDBusObjectManagerIface GDBusObjectManagerInterface; +G_DEFINE_INTERFACE (GDBusObjectManager, g_dbus_object_manager, G_TYPE_OBJECT) + +static void +g_dbus_object_manager_default_init (GDBusObjectManagerIface *iface) +{ + /** + * GDBusObjectManager::object-added: + * @manager: The #GDBusObjectManager emitting the signal. + * @object: The #GDBusObject that was added. + * + * Emitted when @object is added to @manager. + * + * Since: 2.30 + */ + g_signal_new ("object-added", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerIface, object_added), + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_DBUS_OBJECT); + + /** + * GDBusObjectManager::object-removed: + * @manager: The #GDBusObjectManager emitting the signal. + * @object: The #GDBusObject that was removed. + * + * Emitted when @object is removed from @manager. + * + * Since: 2.30 + */ + g_signal_new ("object-removed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerIface, object_removed), + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_DBUS_OBJECT); + + /** + * GDBusObjectManager::interface-added: + * @manager: The #GDBusObjectManager emitting the signal. + * @object: The #GDBusObject on which an interface was added. + * @interface: The #GDBusInterface that was added. + * + * Emitted when @interface is added to @object. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all objects managed by @manager. + * + * Since: 2.30 + */ + g_signal_new ("interface-added", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerIface, interface_added), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 2, + G_TYPE_DBUS_OBJECT, + G_TYPE_DBUS_INTERFACE); + + /** + * GDBusObjectManager::interface-removed: + * @manager: The #GDBusObjectManager emitting the signal. + * @object: The #GDBusObject on which an interface was removed. + * @interface: The #GDBusInterface that was removed. + * + * Emitted when @interface has been removed from @object. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all objects managed by @manager. + * + * Since: 2.30 + */ + g_signal_new ("interface-removed", + G_TYPE_FROM_INTERFACE (iface), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerIface, interface_removed), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 2, + G_TYPE_DBUS_OBJECT, + G_TYPE_DBUS_INTERFACE); + +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_manager_get_object_path: + * @manager: A #GDBusObjectManager. + * + * Gets the object path that @manager is for. + * + * Returns: A string owned by @manager. Do not free. + * + * Since: 2.30 + */ +const gchar * +g_dbus_object_manager_get_object_path (GDBusObjectManager *manager) +{ + GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager); + return iface->get_object_path (manager); +} + +/** + * g_dbus_object_manager_get_objects: + * @manager: A #GDBusObjectManager. + * + * Gets all #GDBusObject objects known to @manager. + * + * Returns: (transfer full) (element-type GDBusObject): A list of + * #GDBusObject objects. The returned list should be freed with + * g_list_free() after each element has been freed with + * g_object_unref(). + * + * Since: 2.30 + */ +GList * +g_dbus_object_manager_get_objects (GDBusObjectManager *manager) +{ + GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager); + return iface->get_objects (manager); +} + +/** + * g_dbus_object_manager_get_object: + * @manager: A #GDBusObjectManager. + * @object_path: Object path to lookup. + * + * Gets the #GDBusObjectProxy at @object_path, if any. + * + * Returns: (transfer full): A #GDBusObject or %NULL. Free with + * g_object_unref(). + * + * Since: 2.30 + */ +GDBusObject * +g_dbus_object_manager_get_object (GDBusObjectManager *manager, + const gchar *object_path) +{ + GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return iface->get_object (manager, object_path); +} + +/** + * g_dbus_object_manager_get_interface: + * @manager: A #GDBusObjectManager. + * @object_path: Object path to lookup. + * @interface_name: D-Bus interface name to lookup. + * + * Gets the interface proxy for @interface_name at @object_path, if + * any. + * + * Returns: (transfer full): A #GDBusInterface instance or %NULL. Free + * with g_object_unref(). + * + * Since: 2.30 + */ +GDBusInterface * +g_dbus_object_manager_get_interface (GDBusObjectManager *manager, + const gchar *object_path, + const gchar *interface_name) +{ + GDBusObjectManagerIface *iface = G_DBUS_OBJECT_MANAGER_GET_IFACE (manager); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + return iface->get_interface (manager, object_path, interface_name); +} diff --git a/gio/gdbusobjectmanager.h b/gio/gdbusobjectmanager.h new file mode 100644 index 0000000..bc00c5e --- /dev/null +++ b/gio/gdbusobjectmanager.h @@ -0,0 +1,96 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_MANAGER_H__ +#define __G_DBUS_OBJECT_MANAGER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT_MANAGER (g_dbus_object_manager_get_type()) +#define G_DBUS_OBJECT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT_MANAGER, GDBusObjectManager)) +#define G_IS_DBUS_OBJECT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT_MANAGER)) +#define G_DBUS_OBJECT_MANAGER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), G_TYPE_DBUS_OBJECT_MANAGER, GDBusObjectManagerIface)) + +typedef struct _GDBusObjectManagerIface GDBusObjectManagerIface; + +/** + * GDBusObjectManagerIface: + * @parent_iface: The parent interface. + * @get_object_path: Virtual function for g_dbus_object_manager_get_object_path(). + * @get_objects: Virtual function for g_dbus_object_manager_get_objects(). + * @get_object: Virtual function for g_dbus_object_manager_get_object(). + * @get_interface: Virtual function for g_dbus_object_manager_get_interface(). + * @object_added: Signal handler for the #GDBusObjectManager::object-added signal. + * @object_removed: Signal handler for the #GDBusObjectManager::object-removed signal. + * @interface_added: Signal handler for the #GDBusObjectManager::interface-added signal. + * @interface_removed: Signal handler for the #GDBusObjectManager::interface-removed signal. + * + * Base type for D-Bus object managers. + * + * Since: 2.30 + */ +struct _GDBusObjectManagerIface +{ + GTypeInterface parent_iface; + + /* Virtual Functions */ + const gchar *(*get_object_path) (GDBusObjectManager *manager); + GList *(*get_objects) (GDBusObjectManager *manager); + GDBusObject *(*get_object) (GDBusObjectManager *manager, + const gchar *object_path); + GDBusInterface *(*get_interface) (GDBusObjectManager *manager, + const gchar *object_path, + const gchar *interface_name); + + /* Signals */ + void (*object_added) (GDBusObjectManager *manager, + GDBusObject *object); + void (*object_removed) (GDBusObjectManager *manager, + GDBusObject *object); + + void (*interface_added) (GDBusObjectManager *manager, + GDBusObject *object, + GDBusInterface *interface_); + void (*interface_removed) (GDBusObjectManager *manager, + GDBusObject *object, + GDBusInterface *interface_); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_manager_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_object_manager_get_object_path (GDBusObjectManager *manager); +GLIB_AVAILABLE_IN_ALL +GList *g_dbus_object_manager_get_objects (GDBusObjectManager *manager); +GLIB_AVAILABLE_IN_ALL +GDBusObject *g_dbus_object_manager_get_object (GDBusObjectManager *manager, + const gchar *object_path); +GLIB_AVAILABLE_IN_ALL +GDBusInterface *g_dbus_object_manager_get_interface (GDBusObjectManager *manager, + const gchar *object_path, + const gchar *interface_name); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_MANAGER_H__ */ diff --git a/gio/gdbusobjectmanagerclient.c b/gio/gdbusobjectmanagerclient.c new file mode 100644 index 0000000..5a60281 --- /dev/null +++ b/gio/gdbusobjectmanagerclient.c @@ -0,0 +1,1745 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobjectmanager.h" +#include "gdbusobjectmanagerclient.h" +#include "gdbusobject.h" +#include "gdbusprivate.h" +#include "gioenumtypes.h" +#include "ginitable.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gasyncinitable.h" +#include "gdbusconnection.h" +#include "gdbusutils.h" +#include "gdbusobject.h" +#include "gdbusobjectproxy.h" +#include "gdbusproxy.h" +#include "gdbusinterface.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobjectmanagerclient + * @short_description: Client-side object manager + * @include: gio/gio.h + * + * #GDBusObjectManagerClient is used to create, monitor and delete object + * proxies for remote objects exported by a #GDBusObjectManagerServer (or any + * code implementing the org.freedesktop.DBus.ObjectManager + * interface). + * + * Once an instance of this type has been created, you can connect to + * the #GDBusObjectManager::object-added and + * #GDBusObjectManager::object-removed signals and inspect the + * #GDBusObjectProxy objects returned by + * g_dbus_object_manager_get_objects(). + * + * If the name for a #GDBusObjectManagerClient is not owned by anyone at + * object construction time, the default behavior is to request the + * message bus to launch an owner for the name. This behavior can be + * disabled using the %G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START + * flag. It's also worth noting that this only works if the name of + * interest is activatable in the first place. E.g. in some cases it + * is not possible to launch an owner for the requested name. In this + * case, #GDBusObjectManagerClient object construction still succeeds but + * there will be no object proxies + * (e.g. g_dbus_object_manager_get_objects() returns the empty list) and + * the #GDBusObjectManagerClient:name-owner property is %NULL. + * + * The owner of the requested name can come and go (for example + * consider a system service being restarted) – #GDBusObjectManagerClient + * handles this case too; simply connect to the #GObject::notify + * signal to watch for changes on the #GDBusObjectManagerClient:name-owner + * property. When the name owner vanishes, the behavior is that + * #GDBusObjectManagerClient:name-owner is set to %NULL (this includes + * emission of the #GObject::notify signal) and then + * #GDBusObjectManager::object-removed signals are synthesized + * for all currently existing object proxies. Since + * #GDBusObjectManagerClient:name-owner is %NULL when this happens, you can + * use this information to disambiguate a synthesized signal from a + * genuine signal caused by object removal on the remote + * #GDBusObjectManager. Similarly, when a new name owner appears, + * #GDBusObjectManager::object-added signals are synthesized + * while #GDBusObjectManagerClient:name-owner is still %NULL. Only when all + * object proxies have been added, the #GDBusObjectManagerClient:name-owner + * is set to the new name owner (this includes emission of the + * #GObject::notify signal). Furthermore, you are guaranteed that + * #GDBusObjectManagerClient:name-owner will alternate between a name owner + * (e.g. :1.42) and %NULL even in the case where + * the name of interest is atomically replaced + * + * Ultimately, #GDBusObjectManagerClient is used to obtain #GDBusProxy + * instances. All signals (including the + * org.freedesktop.DBus.Properties::PropertiesChanged + * signal) delivered to #GDBusProxy instances are guaranteed to + * originate from the name owner. This guarantee along with the + * behavior described above, means that certain race conditions + * including the half the proxy is from the old owner + * and the other half is from the new owner problem + * cannot happen. + * + * To avoid having the application connect to signals on the returned + * #GDBusObjectProxy and #GDBusProxy objects, the + * #GDBusObject::interface-added, + * #GDBusObject::interface-removed, + * #GDBusProxy::g-properties-changed and + * #GDBusProxy::g-signal signals + * are also emitted on the #GDBusObjectManagerClient instance managing these + * objects. The signals emitted are + * #GDBusObjectManager::interface-added, + * #GDBusObjectManager::interface-removed, + * #GDBusObjectManagerClient::interface-proxy-properties-changed and + * #GDBusObjectManagerClient::interface-proxy-signal. + * + * Note that all callbacks and signals are emitted in the + * thread-default main loop + * that the #GDBusObjectManagerClient object was constructed + * in. Additionally, the #GDBusObjectProxy and #GDBusProxy objects + * originating from the #GDBusObjectManagerClient object will be created in + * the same context and, consequently, will deliver signals in the + * same main loop. + */ + +struct _GDBusObjectManagerClientPrivate +{ + GMutex lock; + + GBusType bus_type; + GDBusConnection *connection; + gchar *object_path; + gchar *name; + gchar *name_owner; + GDBusObjectManagerClientFlags flags; + + GDBusProxy *control_proxy; + + GHashTable *map_object_path_to_object_proxy; + + guint signal_subscription_id; + gchar *match_rule; + + GDBusProxyTypeFunc get_proxy_type_func; + gpointer get_proxy_type_user_data; + GDestroyNotify get_proxy_type_destroy_notify; +}; + +enum +{ + PROP_0, + PROP_BUS_TYPE, + PROP_CONNECTION, + PROP_FLAGS, + PROP_OBJECT_PATH, + PROP_NAME, + PROP_NAME_OWNER, + PROP_GET_PROXY_TYPE_FUNC, + PROP_GET_PROXY_TYPE_USER_DATA, + PROP_GET_PROXY_TYPE_DESTROY_NOTIFY +}; + +enum +{ + INTERFACE_PROXY_SIGNAL_SIGNAL, + INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +static void initable_iface_init (GInitableIface *initable_iface); +static void async_initable_iface_init (GAsyncInitableIface *async_initable_iface); +static void dbus_object_manager_interface_init (GDBusObjectManagerIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusObjectManagerClient, g_dbus_object_manager_client, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT_MANAGER, dbus_object_manager_interface_init)); + +static void maybe_unsubscribe_signals (GDBusObjectManagerClient *manager); + +static void on_control_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data); + +static void process_get_all_result (GDBusObjectManagerClient *manager, + GVariant *value, + const gchar *name_owner); + +static void +g_dbus_object_manager_client_finalize (GObject *object) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object); + + maybe_unsubscribe_signals (manager); + + g_hash_table_unref (manager->priv->map_object_path_to_object_proxy); + + if (manager->priv->control_proxy != NULL) + { + g_signal_handlers_disconnect_by_func (manager->priv->control_proxy, + on_control_proxy_g_signal, + manager); + g_object_unref (manager->priv->control_proxy); + } + g_object_unref (manager->priv->connection); + g_free (manager->priv->object_path); + g_free (manager->priv->name); + g_free (manager->priv->name_owner); + + if (manager->priv->get_proxy_type_destroy_notify != NULL) + manager->priv->get_proxy_type_destroy_notify (manager->priv->get_proxy_type_user_data); + + g_mutex_clear (&manager->priv->lock); + + if (G_OBJECT_CLASS (g_dbus_object_manager_client_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_dbus_object_manager_client_parent_class)->finalize (object); +} + +static void +g_dbus_object_manager_client_get_property (GObject *_object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (_object); + + switch (prop_id) + { + case PROP_CONNECTION: + g_value_set_object (value, g_dbus_object_manager_client_get_connection (manager)); + break; + + case PROP_OBJECT_PATH: + g_value_set_string (value, g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager))); + break; + + case PROP_NAME: + g_value_set_string (value, g_dbus_object_manager_client_get_name (manager)); + break; + + case PROP_FLAGS: + g_value_set_flags (value, g_dbus_object_manager_client_get_flags (manager)); + break; + + case PROP_NAME_OWNER: + g_value_take_string (value, g_dbus_object_manager_client_get_name_owner (manager)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (manager, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_manager_client_set_property (GObject *_object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (_object); + const gchar *name; + + switch (prop_id) + { + case PROP_BUS_TYPE: + manager->priv->bus_type = g_value_get_enum (value); + break; + + case PROP_CONNECTION: + if (g_value_get_object (value) != NULL) + { + g_assert (manager->priv->connection == NULL); + g_assert (G_IS_DBUS_CONNECTION (g_value_get_object (value))); + manager->priv->connection = g_value_dup_object (value); + } + break; + + case PROP_OBJECT_PATH: + g_assert (manager->priv->object_path == NULL); + g_assert (g_variant_is_object_path (g_value_get_string (value))); + manager->priv->object_path = g_value_dup_string (value); + break; + + case PROP_NAME: + g_assert (manager->priv->name == NULL); + name = g_value_get_string (value); + g_assert (name == NULL || g_dbus_is_name (name)); + manager->priv->name = g_strdup (name); + break; + + case PROP_FLAGS: + manager->priv->flags = g_value_get_flags (value); + break; + + case PROP_GET_PROXY_TYPE_FUNC: + manager->priv->get_proxy_type_func = g_value_get_pointer (value); + break; + + case PROP_GET_PROXY_TYPE_USER_DATA: + manager->priv->get_proxy_type_user_data = g_value_get_pointer (value); + break; + + case PROP_GET_PROXY_TYPE_DESTROY_NOTIFY: + manager->priv->get_proxy_type_destroy_notify = g_value_get_pointer (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (manager, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_object_manager_client_finalize; + gobject_class->set_property = g_dbus_object_manager_client_set_property; + gobject_class->get_property = g_dbus_object_manager_client_get_property; + + /** + * GDBusObjectManagerClient:connection: + * + * The #GDBusConnection to use. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_CONNECTION, + g_param_spec_object ("connection", + "Connection", + "The connection to use", + G_TYPE_DBUS_CONNECTION, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:bus-type: + * + * If this property is not %G_BUS_TYPE_NONE, then + * #GDBusObjectManagerClient:connection must be %NULL and will be set to the + * #GDBusConnection obtained by calling g_bus_get() with the value + * of this property. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_BUS_TYPE, + g_param_spec_enum ("bus-type", + "Bus Type", + "The bus to connect to, if any", + G_TYPE_BUS_TYPE, + G_BUS_TYPE_NONE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusObjectManagerClient:flags: + * + * Flags from the #GDBusObjectManagerClientFlags enumeration. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", + "Flags", + "Flags for the proxy manager", + G_TYPE_DBUS_OBJECT_MANAGER_CLIENT_FLAGS, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusObjectManagerClient:object-path: + * + * The object path the manager is for. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_OBJECT_PATH, + g_param_spec_string ("object-path", + "Object Path", + "The object path of the control object", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:name: + * + * The well-known name or unique name that the manager is for. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name that the manager is for", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:name-owner: + * + * The unique name that owns #GDBusObjectManagerClient:name or %NULL if + * no-one is currently owning the name. Connect to the + * #GObject::notify signal to track changes to this property. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_NAME_OWNER, + g_param_spec_string ("name-owner", + "Name Owner", + "The owner of the name we are watching", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:get-proxy-type-func: + * + * The #GDBusProxyTypeFunc to use when determining what #GType to + * use for interface proxies or %NULL. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_GET_PROXY_TYPE_FUNC, + g_param_spec_pointer ("get-proxy-type-func", + "GDBusProxyTypeFunc Function Pointer", + "The GDBusProxyTypeFunc pointer to use", + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:get-proxy-type-user-data: + * + * The #gpointer user_data to pass to #GDBusObjectManagerClient:get-proxy-type-func. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_GET_PROXY_TYPE_USER_DATA, + g_param_spec_pointer ("get-proxy-type-user-data", + "GDBusProxyTypeFunc User Data", + "The GDBusProxyTypeFunc user_data", + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient:get-proxy-type-destroy-notify: + * + * A #GDestroyNotify for the #gpointer user_data in #GDBusObjectManagerClient:get-proxy-type-user-data. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_GET_PROXY_TYPE_DESTROY_NOTIFY, + g_param_spec_pointer ("get-proxy-type-destroy-notify", + "GDBusProxyTypeFunc user data free function", + "The GDBusProxyTypeFunc user data free function", + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerClient::interface-proxy-signal: + * @manager: The #GDBusObjectManagerClient emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface is emitting a D-Bus signal. + * @interface_proxy: The #GDBusProxy that is emitting a D-Bus signal. + * @sender_name: The sender of the signal or NULL if the connection is not a bus connection. + * @signal_name: The signal name. + * @parameters: A #GVariant tuple with parameters for the signal. + * + * Emitted when a D-Bus signal is received on @interface_proxy. + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all interface proxies managed by @manager. + * + * This signal is emitted in the + * thread-default main loop + * that @manager was constructed in. + * + * Since: 2.30 + */ + signals[INTERFACE_PROXY_SIGNAL_SIGNAL] = + g_signal_new ("interface-proxy-signal", + G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerClientClass, interface_proxy_signal), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 5, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_VARIANT); + + /** + * GDBusObjectManagerClient::interface-proxy-properties-changed: + * @manager: The #GDBusObjectManagerClient emitting the signal. + * @object_proxy: The #GDBusObjectProxy on which an interface has properties that are changing. + * @interface_proxy: The #GDBusProxy that has properties that are changing. + * @changed_properties: A #GVariant containing the properties that changed. + * @invalidated_properties: A %NULL terminated array of properties that was invalidated. + * + * Emitted when one or more D-Bus properties on proxy changes. The + * local cache has already been updated when this signal fires. Note + * that both @changed_properties and @invalidated_properties are + * guaranteed to never be %NULL (either may be empty though). + * + * This signal exists purely as a convenience to avoid having to + * connect signals to all interface proxies managed by @manager. + * + * This signal is emitted in the + * thread-default main loop + * that @manager was constructed in. + * + * Since: 2.30 + */ + signals[INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL] = + g_signal_new ("interface-proxy-properties-changed", + G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectManagerClientClass, interface_proxy_properties_changed), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 4, + G_TYPE_DBUS_OBJECT_PROXY, + G_TYPE_DBUS_PROXY, + G_TYPE_VARIANT, + G_TYPE_STRV); + + g_type_class_add_private (klass, sizeof (GDBusObjectManagerClientPrivate)); +} + +static void +g_dbus_object_manager_client_init (GDBusObjectManagerClient *manager) +{ + manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, + G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + GDBusObjectManagerClientPrivate); + g_mutex_init (&manager->priv->lock); + manager->priv->map_object_path_to_object_proxy = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_object_unref); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_manager_client_new_sync: + * @connection: A #GDBusConnection. + * @flags: Zero or more flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: (allow-none): The owner of the control object (unique or well-known name), or %NULL when not using a message bus connection. + * @object_path: The object path of the control object. + * @get_proxy_type_func: (allow-none): A #GDBusProxyTypeFunc function or %NULL to always construct #GDBusProxy proxies. + * @get_proxy_type_user_data: User data to pass to @get_proxy_type_func. + * @get_proxy_type_destroy_notify: (allow-none): Free function for @get_proxy_type_user_data or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL + * @error: Return location for error or %NULL. + * + * Creates a new #GDBusObjectManagerClient object. + * + * This is a synchronous failable constructor - the calling thread is + * blocked until a reply is received. See g_dbus_object_manager_client_new() + * for the asynchronous version. + * + * Returns: (transfer full) (type GDBusObjectManagerClient): A + * #GDBusObjectManagerClient object or %NULL if @error is set. Free + * with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectManager * +g_dbus_object_manager_client_new_sync (GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GError **error) +{ + GInitable *initable; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail ((name == NULL && g_dbus_connection_get_unique_name (connection) == NULL) || + g_dbus_is_name (name), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + initable = g_initable_new (G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + cancellable, + error, + "connection", connection, + "flags", flags, + "name", name, + "object-path", object_path, + "get-proxy-type-func", get_proxy_type_func, + "get-proxy-type-user-data", get_proxy_type_user_data, + "get-proxy-type-destroy-notify", get_proxy_type_destroy_notify, + NULL); + if (initable != NULL) + return G_DBUS_OBJECT_MANAGER (initable); + else + return NULL; +} + +/** + * g_dbus_object_manager_client_new: + * @connection: A #GDBusConnection. + * @flags: Zero or more flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: The owner of the control object (unique or well-known name). + * @object_path: The object path of the control object. + * @get_proxy_type_func: (allow-none): A #GDBusProxyTypeFunc function or %NULL to always construct #GDBusProxy proxies. + * @get_proxy_type_user_data: User data to pass to @get_proxy_type_func. + * @get_proxy_type_destroy_notify: (allow-none): Free function for @get_proxy_type_user_data or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: The data to pass to @callback. + * + * Asynchronously creates a new #GDBusObjectManagerClient object. + * + * This is an asynchronous failable constructor. When the result is + * ready, @callback will be invoked in the + * thread-default main loop + * of the thread you are calling this method from. You can + * then call g_dbus_object_manager_client_new_finish() to get the result. See + * g_dbus_object_manager_client_new_sync() for the synchronous version. + * + * Since: 2.30 + */ +void +g_dbus_object_manager_client_new (GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail ((name == NULL && g_dbus_connection_get_unique_name (connection) == NULL) || + g_dbus_is_name (name)); + g_return_if_fail (g_variant_is_object_path (object_path)); + + g_async_initable_new_async (G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "connection", connection, + "flags", flags, + "name", name, + "object-path", object_path, + "get-proxy-type-func", get_proxy_type_func, + "get-proxy-type-user-data", get_proxy_type_user_data, + "get-proxy-type-destroy-notify", get_proxy_type_destroy_notify, + NULL); +} + +/** + * g_dbus_object_manager_client_new_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_object_manager_client_new(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_object_manager_client_new(). + * + * Returns: (transfer full) (type GDBusObjectManagerClient): A + * #GDBusObjectManagerClient object or %NULL if @error is set. Free + * with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectManager * +g_dbus_object_manager_client_new_finish (GAsyncResult *res, + GError **error) +{ + GObject *object; + GObject *source_object; + + source_object = g_async_result_get_source_object (res); + g_assert (source_object != NULL); + + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + res, + error); + g_object_unref (source_object); + + if (object != NULL) + return G_DBUS_OBJECT_MANAGER (object); + else + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_manager_client_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Zero or more flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: The owner of the control object (unique or well-known name). + * @object_path: The object path of the control object. + * @get_proxy_type_func: (allow-none): A #GDBusProxyTypeFunc function or %NULL to always construct #GDBusProxy proxies. + * @get_proxy_type_user_data: User data to pass to @get_proxy_type_func. + * @get_proxy_type_destroy_notify: (allow-none): Free function for @get_proxy_type_user_data or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL + * @error: Return location for error or %NULL. + * + * Like g_dbus_object_manager_client_new_sync() but takes a #GBusType instead + * of a #GDBusConnection. + * + * This is a synchronous failable constructor - the calling thread is + * blocked until a reply is received. See g_dbus_object_manager_client_new_for_bus() + * for the asynchronous version. + * + * Returns: (transfer full) (type GDBusObjectManagerClient): A + * #GDBusObjectManagerClient object or %NULL if @error is set. Free + * with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectManager * +g_dbus_object_manager_client_new_for_bus_sync (GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GError **error) +{ + GInitable *initable; + + g_return_val_if_fail (bus_type != G_BUS_TYPE_NONE, NULL); + g_return_val_if_fail (g_dbus_is_name (name), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + initable = g_initable_new (G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + cancellable, + error, + "bus-type", bus_type, + "flags", flags, + "name", name, + "object-path", object_path, + "get-proxy-type-func", get_proxy_type_func, + "get-proxy-type-user-data", get_proxy_type_user_data, + "get-proxy-type-destroy-notify", get_proxy_type_destroy_notify, + NULL); + if (initable != NULL) + return G_DBUS_OBJECT_MANAGER (initable); + else + return NULL; +} + +/** + * g_dbus_object_manager_client_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Zero or more flags from the #GDBusObjectManagerClientFlags enumeration. + * @name: The owner of the control object (unique or well-known name). + * @object_path: The object path of the control object. + * @get_proxy_type_func: (allow-none): A #GDBusProxyTypeFunc function or %NULL to always construct #GDBusProxy proxies. + * @get_proxy_type_user_data: User data to pass to @get_proxy_type_func. + * @get_proxy_type_destroy_notify: (allow-none): Free function for @get_proxy_type_user_data or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL + * @callback: A #GAsyncReadyCallback to call when the request is satisfied. + * @user_data: The data to pass to @callback. + * + * Like g_dbus_object_manager_client_new() but takes a #GBusType instead of a + * #GDBusConnection. + * + * This is an asynchronous failable constructor. When the result is + * ready, @callback will be invoked in the + * thread-default main loop + * of the thread you are calling this method from. You can + * then call g_dbus_object_manager_client_new_for_bus_finish() to get the result. See + * g_dbus_object_manager_client_new_for_bus_sync() for the synchronous version. + * + * Since: 2.30 + */ +void +g_dbus_object_manager_client_new_for_bus (GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (bus_type != G_BUS_TYPE_NONE); + g_return_if_fail (g_dbus_is_name (name)); + g_return_if_fail (g_variant_is_object_path (object_path)); + + g_async_initable_new_async (G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "bus-type", bus_type, + "flags", flags, + "name", name, + "object-path", object_path, + "get-proxy-type-func", get_proxy_type_func, + "get-proxy-type-user-data", get_proxy_type_user_data, + "get-proxy-type-destroy-notify", get_proxy_type_destroy_notify, + NULL); +} + +/** + * g_dbus_object_manager_client_new_for_bus_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_object_manager_client_new_for_bus(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_object_manager_client_new_for_bus(). + * + * Returns: (transfer full) (type GDBusObjectManagerClient): A + * #GDBusObjectManagerClient object or %NULL if @error is set. Free + * with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectManager * +g_dbus_object_manager_client_new_for_bus_finish (GAsyncResult *res, + GError **error) +{ + GObject *object; + GObject *source_object; + + source_object = g_async_result_get_source_object (res); + g_assert (source_object != NULL); + + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + res, + error); + g_object_unref (source_object); + + if (object != NULL) + return G_DBUS_OBJECT_MANAGER (object); + else + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_manager_client_get_connection: + * @manager: A #GDBusObjectManagerClient + * + * Gets the #GDBusConnection used by @manager. + * + * Returns: (transfer none): A #GDBusConnection object. Do not free, + * the object belongs to @manager. + * + * Since: 2.30 + */ +GDBusConnection * +g_dbus_object_manager_client_get_connection (GDBusObjectManagerClient *manager) +{ + GDBusConnection *ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager), NULL); + g_mutex_lock (&manager->priv->lock); + ret = manager->priv->connection; + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +/** + * g_dbus_object_manager_client_get_name: + * @manager: A #GDBusObjectManagerClient + * + * Gets the name that @manager is for, or %NULL if not a message bus + * connection. + * + * Returns: A unique or well-known name. Do not free, the string + * belongs to @manager. + * + * Since: 2.30 + */ +const gchar * +g_dbus_object_manager_client_get_name (GDBusObjectManagerClient *manager) +{ + const gchar *ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager), NULL); + g_mutex_lock (&manager->priv->lock); + ret = manager->priv->name; + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +/** + * g_dbus_object_manager_client_get_flags: + * @manager: A #GDBusObjectManagerClient + * + * Gets the flags that @manager was constructed with. + * + * Returns: Zero of more flags from the #GDBusObjectManagerClientFlags + * enumeration. + * + * Since: 2.30 + */ +GDBusObjectManagerClientFlags +g_dbus_object_manager_client_get_flags (GDBusObjectManagerClient *manager) +{ + GDBusObjectManagerClientFlags ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager), G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE); + g_mutex_lock (&manager->priv->lock); + ret = manager->priv->flags; + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +/** + * g_dbus_object_manager_client_get_name_owner: + * @manager: A #GDBusObjectManagerClient. + * + * The unique name that owns the name that @manager is for or %NULL if + * no-one currently owns that name. You can connect to the + * #GObject::notify signal to track changes to the + * #GDBusObjectManagerClient:name-owner property. + * + * Returns: The name owner or %NULL if no name owner exists. Free with + * g_free(). + * + * Since: 2.30 + */ +gchar * +g_dbus_object_manager_client_get_name_owner (GDBusObjectManagerClient *manager) +{ + gchar *ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager), NULL); + g_mutex_lock (&manager->priv->lock); + ret = g_strdup (manager->priv->name_owner); + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* signal handler for all objects we manage - we dispatch signals + * from here to the objects + */ +static void +signal_cb (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (user_data); + GDBusObjectProxy *object_proxy; + GDBusInterface *interface; + + g_mutex_lock (&manager->priv->lock); + object_proxy = g_hash_table_lookup (manager->priv->map_object_path_to_object_proxy, object_path); + if (object_proxy == NULL) + { + g_mutex_unlock (&manager->priv->lock); + goto out; + } + g_object_ref (object_proxy); + g_mutex_unlock (&manager->priv->lock); + + //g_debug ("yay, signal_cb %s %s: %s\n", signal_name, object_path, g_variant_print (parameters, TRUE)); + + if (g_strcmp0 (interface_name, "org.freedesktop.DBus.Properties") == 0) + { + if (g_strcmp0 (signal_name, "PropertiesChanged") == 0) + { + const gchar *interface_name; + GVariant *changed_properties; + const gchar **invalidated_properties; + + g_variant_get (parameters, + "(&s@a{sv}^a&s)", + &interface_name, + &changed_properties, + &invalidated_properties); + + interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object_proxy), interface_name); + if (interface != NULL) + { + GVariantIter property_iter; + const gchar *property_name; + GVariant *property_value; + guint n; + + /* update caches... */ + g_variant_iter_init (&property_iter, changed_properties); + while (g_variant_iter_next (&property_iter, + "{&sv}", + &property_name, + &property_value)) + { + g_dbus_proxy_set_cached_property (G_DBUS_PROXY (interface), + property_name, + property_value); + g_variant_unref (property_value); + } + + for (n = 0; invalidated_properties[n] != NULL; n++) + { + g_dbus_proxy_set_cached_property (G_DBUS_PROXY (interface), + invalidated_properties[n], + NULL); + } + /* ... and then synthesize the signal */ + g_signal_emit_by_name (interface, + "g-properties-changed", + changed_properties, + invalidated_properties); + g_signal_emit (manager, + signals[INTERFACE_PROXY_PROPERTIES_CHANGED_SIGNAL], + 0, + object_proxy, + interface, + changed_properties, + invalidated_properties); + g_object_unref (interface); + } + g_variant_unref (changed_properties); + g_free (invalidated_properties); + } + } + else + { + /* regular signal - just dispatch it */ + interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object_proxy), interface_name); + if (interface != NULL) + { + g_signal_emit_by_name (interface, + "g-signal", + sender_name, + signal_name, + parameters); + g_signal_emit (manager, + signals[INTERFACE_PROXY_SIGNAL_SIGNAL], + 0, + object_proxy, + interface, + sender_name, + signal_name, + parameters); + g_object_unref (interface); + } + } + + out: + g_clear_object (&object_proxy); +} + +static void +subscribe_signals (GDBusObjectManagerClient *manager, + const gchar *name_owner) +{ + GError *error = NULL; + GVariant *ret; + + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_return_if_fail (manager->priv->signal_subscription_id == 0); + g_return_if_fail (name_owner == NULL || g_dbus_is_unique_name (name_owner)); + + if (name_owner != NULL) + { + /* the bus daemon may not implement path_prefix so gracefully + * handle this by using a fallback + */ + manager->priv->match_rule = g_strdup_printf ("type='signal',sender='%s',path_namespace='%s'", + name_owner, manager->priv->object_path); + + ret = g_dbus_connection_call_sync (manager->priv->connection, + "org.freedesktop.DBus", + "/org/freedeskop/DBus", + "org.freedesktop.DBus", + "AddMatch", + g_variant_new ("(s)", + manager->priv->match_rule), + NULL, /* reply_type */ + G_DBUS_CALL_FLAGS_NONE, + -1, /* default timeout */ + NULL, /* TODO: Cancellable */ + &error); + + /* yay, bus daemon supports path_namespace */ + if (ret != NULL) + g_variant_unref (ret); + } + + if (error == NULL) + { + /* still need to ask GDBusConnection for the callbacks */ + manager->priv->signal_subscription_id = + g_dbus_connection_signal_subscribe (manager->priv->connection, + name_owner, + NULL, /* interface */ + NULL, /* member */ + NULL, /* path - TODO: really want wilcard support here */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE | + G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE, + signal_cb, + manager, + NULL); /* user_data_free_func */ + + } + else + { + /* TODO: we could report this to the user + g_warning ("Message bus daemon does not support path_namespace: %s (%s %d)", + error->message, + g_quark_to_string (error->domain), + error->code); + */ + + g_error_free (error); + + /* no need to call RemoveMatch when done since it didn't work */ + g_free (manager->priv->match_rule); + manager->priv->match_rule = NULL; + + /* Fallback is to subscribe to *all* signals from the name owner which + * is rather wasteful. It's probably not a big practical problem because + * users typically want all objects that the name owner supplies. + */ + manager->priv->signal_subscription_id = + g_dbus_connection_signal_subscribe (manager->priv->connection, + name_owner, + NULL, /* interface */ + NULL, /* member */ + NULL, /* path - TODO: really want wilcard support here */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + signal_cb, + manager, + NULL); /* user_data_free_func */ + } +} + +static void +maybe_unsubscribe_signals (GDBusObjectManagerClient *manager) +{ + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager)); + + if (manager->priv->signal_subscription_id > 0) + { + g_dbus_connection_signal_unsubscribe (manager->priv->connection, + manager->priv->signal_subscription_id); + manager->priv->signal_subscription_id = 0; + } + + if (manager->priv->match_rule != NULL) + { + /* Since the AddMatch call succeeded this is guaranteed to not + * fail - therefore, don't bother checking the return value + */ + g_dbus_connection_call (manager->priv->connection, + "org.freedesktop.DBus", + "/org/freedeskop/DBus", + "org.freedesktop.DBus", + "RemoveMatch", + g_variant_new ("(s)", + manager->priv->match_rule), + NULL, /* reply_type */ + G_DBUS_CALL_FLAGS_NONE, + -1, /* default timeout */ + NULL, /* GCancellable */ + NULL, /* GAsyncReadyCallback */ + NULL); /* user data */ + g_free (manager->priv->match_rule); + manager->priv->match_rule = NULL; + } + +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_notify_g_name_owner (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (user_data); + gchar *old_name_owner; + gchar *new_name_owner; + + g_mutex_lock (&manager->priv->lock); + old_name_owner = manager->priv->name_owner; + new_name_owner = g_dbus_proxy_get_name_owner (manager->priv->control_proxy); + manager->priv->name_owner = NULL; + + if (g_strcmp0 (old_name_owner, new_name_owner) != 0) + { + GList *l; + GList *proxies; + + /* remote manager changed; nuke all local proxies */ + proxies = g_hash_table_get_values (manager->priv->map_object_path_to_object_proxy); + g_list_foreach (proxies, (GFunc) g_object_ref, NULL); + g_hash_table_remove_all (manager->priv->map_object_path_to_object_proxy); + + g_mutex_unlock (&manager->priv->lock); + + /* do the :name-owner notify with a NULL name - this way the user knows + * the ::object-proxy-removed following is because the name owner went + * away + */ + g_object_notify (G_OBJECT (manager), "name-owner"); + + for (l = proxies; l != NULL; l = l->next) + { + GDBusObjectProxy *object_proxy = G_DBUS_OBJECT_PROXY (l->data); + g_signal_emit_by_name (manager, "object-removed", object_proxy); + } + g_list_free_full (proxies, g_object_unref); + + /* nuke local filter */ + maybe_unsubscribe_signals (manager); + } + else + { + g_mutex_unlock (&manager->priv->lock); + } + + if (new_name_owner != NULL) + { + GError *error; + GVariant *value; + + //g_debug ("repopulating for %s", new_name_owner); + + /* TODO: do this async! */ + subscribe_signals (manager, + new_name_owner); + error = NULL; + value = g_dbus_proxy_call_sync (manager->priv->control_proxy, + "GetManagedObjects", + NULL, /* parameters */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (value == NULL) + { + maybe_unsubscribe_signals (manager); + g_warning ("Error calling GetManagedObjects() when name owner %s for name %s came back: %s", + new_name_owner, + manager->priv->name, + error->message); + g_error_free (error); + } + else + { + process_get_all_result (manager, value, new_name_owner); + g_variant_unref (value); + } + + /* do the :name-owner notify *AFTER* emitting ::object-proxy-added signals - this + * way the user knows that the signals were emitted because the name owner came back + */ + g_mutex_lock (&manager->priv->lock); + manager->priv->name_owner = new_name_owner; + g_mutex_unlock (&manager->priv->lock); + g_object_notify (G_OBJECT (manager), "name-owner"); + + } + g_free (old_name_owner); +} + +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (initable); + gboolean ret; + GVariant *value; + GDBusProxyFlags proxy_flags; + + ret = FALSE; + + if (manager->priv->bus_type != G_BUS_TYPE_NONE) + { + g_assert (manager->priv->connection == NULL); + manager->priv->connection = g_bus_get_sync (manager->priv->bus_type, cancellable, error); + if (manager->priv->connection == NULL) + goto out; + } + + proxy_flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES; + if (manager->priv->flags & G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START) + proxy_flags |= G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; + + manager->priv->control_proxy = g_dbus_proxy_new_sync (manager->priv->connection, + proxy_flags, + NULL, /* GDBusInterfaceInfo* */ + manager->priv->name, + manager->priv->object_path, + "org.freedesktop.DBus.ObjectManager", + cancellable, + error); + if (manager->priv->control_proxy == NULL) + goto out; + + g_signal_connect (G_OBJECT (manager->priv->control_proxy), + "notify::g-name-owner", + G_CALLBACK (on_notify_g_name_owner), + manager); + + g_signal_connect (manager->priv->control_proxy, + "g-signal", + G_CALLBACK (on_control_proxy_g_signal), + manager); + + manager->priv->name_owner = g_dbus_proxy_get_name_owner (manager->priv->control_proxy); + if (manager->priv->name_owner == NULL && manager->priv->name != NULL) + { + /* it's perfectly fine if there's no name owner.. we're just going to + * wait until one is ready + */ + } + else + { + /* yay, we can get the objects */ + subscribe_signals (manager, + manager->priv->name_owner); + value = g_dbus_proxy_call_sync (manager->priv->control_proxy, + "GetManagedObjects", + NULL, /* parameters */ + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (value == NULL) + { + maybe_unsubscribe_signals (manager); + g_warn_if_fail (g_signal_handlers_disconnect_by_func (manager->priv->control_proxy, + on_control_proxy_g_signal, + manager) == 1); + g_object_unref (manager->priv->control_proxy); + manager->priv->control_proxy = NULL; + goto out; + } + + process_get_all_result (manager, value, manager->priv->name_owner); + g_variant_unref (value); + } + + ret = TRUE; + + out: + return ret; +} + +static void +initable_iface_init (GInitableIface *initable_iface) +{ + initable_iface->init = initable_init; +} + +static void +async_initable_iface_init (GAsyncInitableIface *async_initable_iface) +{ + /* for now, just use default: run GInitable code in thread */ +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +add_interfaces (GDBusObjectManagerClient *manager, + const gchar *object_path, + GVariant *ifaces_and_properties, + const gchar *name_owner) +{ + GDBusObjectProxy *op; + gboolean added; + GVariantIter iter; + const gchar *interface_name; + GVariant *properties; + GList *interface_added_signals, *l; + GDBusProxy *interface_proxy; + + g_return_if_fail (name_owner == NULL || g_dbus_is_unique_name (name_owner)); + + g_mutex_lock (&manager->priv->lock); + + interface_added_signals = NULL; + added = FALSE; + + op = g_hash_table_lookup (manager->priv->map_object_path_to_object_proxy, object_path); + if (op == NULL) + { + GType object_proxy_type; + if (manager->priv->get_proxy_type_func != NULL) + { + object_proxy_type = manager->priv->get_proxy_type_func (manager, + object_path, + NULL, + manager->priv->get_proxy_type_user_data); + g_warn_if_fail (g_type_is_a (object_proxy_type, G_TYPE_DBUS_OBJECT_PROXY)); + } + else + { + object_proxy_type = G_TYPE_DBUS_OBJECT_PROXY; + } + op = g_object_new (object_proxy_type, + "g-connection", manager->priv->connection, + "g-object-path", object_path, + NULL); + added = TRUE; + } + g_object_ref (op); + + g_variant_iter_init (&iter, ifaces_and_properties); + while (g_variant_iter_next (&iter, + "{&s@a{sv}}", + &interface_name, + &properties)) + { + GError *error; + GType interface_proxy_type; + + if (manager->priv->get_proxy_type_func != NULL) + { + interface_proxy_type = manager->priv->get_proxy_type_func (manager, + object_path, + interface_name, + manager->priv->get_proxy_type_user_data); + g_warn_if_fail (g_type_is_a (interface_proxy_type, G_TYPE_DBUS_PROXY)); + } + else + { + interface_proxy_type = G_TYPE_DBUS_PROXY; + } + + /* this is fine - there is no blocking IO because we pass DO_NOT_LOAD_PROPERTIES and + * DO_NOT_CONNECT_SIGNALS and use a unique name + */ + error = NULL; + interface_proxy = g_initable_new (interface_proxy_type, + NULL, /* GCancellable */ + &error, + "g-connection", manager->priv->connection, + "g-flags", G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + "g-name", name_owner, + "g-object-path", object_path, + "g-interface-name", interface_name, + NULL); + if (interface_proxy == NULL) + { + g_warning ("%s: Error constructing proxy for path %s and interface %s: %s", + G_STRLOC, + object_path, + interface_name, + error->message); + g_error_free (error); + } + else + { + GVariantIter property_iter; + const gchar *property_name; + GVariant *property_value; + + /* associate the interface proxy with the object */ + g_dbus_interface_set_object (G_DBUS_INTERFACE (interface_proxy), + G_DBUS_OBJECT (op)); + + g_variant_iter_init (&property_iter, properties); + while (g_variant_iter_next (&property_iter, + "{&sv}", + &property_name, + &property_value)) + { + g_dbus_proxy_set_cached_property (interface_proxy, + property_name, + property_value); + g_variant_unref (property_value); + } + + _g_dbus_object_proxy_add_interface (op, interface_proxy); + if (!added) + interface_added_signals = g_list_append (interface_added_signals, g_object_ref (interface_proxy)); + g_object_unref (interface_proxy); + } + g_variant_unref (properties); + } + + g_mutex_unlock (&manager->priv->lock); + + /* now that we don't hold the lock any more, emit signals */ + for (l = interface_added_signals; l != NULL; l = l->next) + { + interface_proxy = G_DBUS_PROXY (l->data); + g_signal_emit_by_name (manager, "interface-added", op, interface_proxy); + g_object_unref (interface_proxy); + } + g_list_free (interface_added_signals); + + if (added) + { + g_hash_table_insert (manager->priv->map_object_path_to_object_proxy, + g_strdup (object_path), + op); + g_signal_emit_by_name (manager, "object-added", op); + } + g_object_unref (op); + +} + +static void +remove_interfaces (GDBusObjectManagerClient *manager, + const gchar *object_path, + const gchar *const *interface_names) +{ + GDBusObjectProxy *op; + GList *interfaces; + guint n; + guint num_interfaces; + guint num_interfaces_to_remove; + + g_mutex_lock (&manager->priv->lock); + + op = g_hash_table_lookup (manager->priv->map_object_path_to_object_proxy, object_path); + if (op == NULL) + { + g_warning ("%s: Processing InterfaceRemoved signal for path %s but no object proxy exists", + G_STRLOC, + object_path); + g_mutex_unlock (&manager->priv->lock); + goto out; + } + + interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (op)); + num_interfaces = g_list_length (interfaces); + g_list_free_full (interfaces, g_object_unref); + + num_interfaces_to_remove = g_strv_length ((gchar **) interface_names); + + /* see if we are going to completety remove the object */ + if (num_interfaces_to_remove == num_interfaces) + { + g_object_ref (op); + g_warn_if_fail (g_hash_table_remove (manager->priv->map_object_path_to_object_proxy, object_path)); + g_mutex_unlock (&manager->priv->lock); + g_signal_emit_by_name (manager, "object-removed", op); + g_object_unref (op); + } + else + { + g_object_ref (op); + g_mutex_unlock (&manager->priv->lock); + for (n = 0; interface_names != NULL && interface_names[n] != NULL; n++) + { + GDBusInterface *interface; + interface = g_dbus_object_get_interface (G_DBUS_OBJECT (op), interface_names[n]); + _g_dbus_object_proxy_remove_interface (op, interface_names[n]); + if (interface != NULL) + { + g_signal_emit_by_name (manager, "interface-removed", op, interface); + g_object_unref (interface); + } + } + g_object_unref (op); + } + out: + ; +} + +static void +process_get_all_result (GDBusObjectManagerClient *manager, + GVariant *value, + const gchar *name_owner) +{ + GVariant *arg0; + const gchar *object_path; + GVariant *ifaces_and_properties; + GVariantIter iter; + + g_return_if_fail (name_owner == NULL || g_dbus_is_unique_name (name_owner)); + + arg0 = g_variant_get_child_value (value, 0); + g_variant_iter_init (&iter, arg0); + while (g_variant_iter_next (&iter, + "{&o@a{sa{sv}}}", + &object_path, + &ifaces_and_properties)) + { + add_interfaces (manager, object_path, ifaces_and_properties, name_owner); + g_variant_unref (ifaces_and_properties); + } + g_variant_unref (arg0); +} + +static void +on_control_proxy_g_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (user_data); + const gchar *object_path; + + //g_debug ("yay, g_signal %s: %s\n", signal_name, g_variant_print (parameters, TRUE)); + + if (g_strcmp0 (signal_name, "InterfacesAdded") == 0) + { + GVariant *ifaces_and_properties; + g_variant_get (parameters, + "(&o@a{sa{sv}})", + &object_path, + &ifaces_and_properties); + add_interfaces (manager, object_path, ifaces_and_properties, manager->priv->name_owner); + g_variant_unref (ifaces_and_properties); + } + else if (g_strcmp0 (signal_name, "InterfacesRemoved") == 0) + { + const gchar **ifaces; + g_variant_get (parameters, + "(&o^a&s)", + &object_path, + &ifaces); + remove_interfaces (manager, object_path, ifaces); + g_free (ifaces); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static const gchar * +g_dbus_object_manager_client_get_object_path (GDBusObjectManager *_manager) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (_manager); + return manager->priv->object_path; +} + +static GDBusObject * +g_dbus_object_manager_client_get_object (GDBusObjectManager *_manager, + const gchar *object_path) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (_manager); + GDBusObject *ret; + + g_mutex_lock (&manager->priv->lock); + ret = g_hash_table_lookup (manager->priv->map_object_path_to_object_proxy, object_path); + if (ret != NULL) + g_object_ref (ret); + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +static GDBusInterface * +g_dbus_object_manager_client_get_interface (GDBusObjectManager *_manager, + const gchar *object_path, + const gchar *interface_name) +{ + GDBusInterface *ret; + GDBusObject *object; + + ret = NULL; + + object = g_dbus_object_manager_get_object (_manager, object_path); + if (object == NULL) + goto out; + + ret = g_dbus_object_get_interface (object, interface_name); + g_object_unref (object); + + out: + return ret; +} + +static GList * +g_dbus_object_manager_client_get_objects (GDBusObjectManager *_manager) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (_manager); + GList *ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_CLIENT (manager), NULL); + + g_mutex_lock (&manager->priv->lock); + ret = g_hash_table_get_values (manager->priv->map_object_path_to_object_proxy); + g_list_foreach (ret, (GFunc) g_object_ref, NULL); + g_mutex_unlock (&manager->priv->lock); + + return ret; +} + + +static void +dbus_object_manager_interface_init (GDBusObjectManagerIface *iface) +{ + iface->get_object_path = g_dbus_object_manager_client_get_object_path; + iface->get_objects = g_dbus_object_manager_client_get_objects; + iface->get_object = g_dbus_object_manager_client_get_object; + iface->get_interface = g_dbus_object_manager_client_get_interface; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusobjectmanagerclient.h b/gio/gdbusobjectmanagerclient.h new file mode 100644 index 0000000..91d45a8 --- /dev/null +++ b/gio/gdbusobjectmanagerclient.h @@ -0,0 +1,148 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_MANAGER_CLIENT_H__ +#define __G_DBUS_OBJECT_MANAGER_CLIENT_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT_MANAGER_CLIENT (g_dbus_object_manager_client_get_type ()) +#define G_DBUS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, GDBusObjectManagerClient)) +#define G_DBUS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, GDBusObjectManagerClientClass)) +#define G_DBUS_OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_OBJECT_MANAGER_CLIENT, GDBusObjectManagerClientClass)) +#define G_IS_DBUS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT_MANAGER_CLIENT)) +#define G_IS_DBUS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_OBJECT_MANAGER_CLIENT)) + +typedef struct _GDBusObjectManagerClientClass GDBusObjectManagerClientClass; +typedef struct _GDBusObjectManagerClientPrivate GDBusObjectManagerClientPrivate; + +/** + * GDBusObjectManagerClient: + * + * The #GDBusObjectManagerClient structure contains private data and should + * only be accessed using the provided API. + * + * Since: 2.30 + */ +struct _GDBusObjectManagerClient +{ + /*< private >*/ + GObject parent_instance; + GDBusObjectManagerClientPrivate *priv; +}; + +/** + * GDBusObjectManagerClientClass: + * @parent_class: The parent class. + * @interface_proxy_signal: Signal class handler for the #GDBusObjectManagerClient::interface-proxy-signal signal. + * @interface_proxy_properties_changed: Signal class handler for the #GDBusObjectManagerClient::interface-proxy-properties-changed signal. + * + * Class structure for #GDBusObjectManagerClient. + * + * Since: 2.30 + */ +struct _GDBusObjectManagerClientClass +{ + GObjectClass parent_class; + + /* signals */ + void (*interface_proxy_signal) (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters); + + void (*interface_proxy_properties_changed) (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties); + + /*< private >*/ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_manager_client_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_manager_client_new (GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusObjectManager *g_dbus_object_manager_client_new_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusObjectManager *g_dbus_object_manager_client_new_sync (GDBusConnection *connection, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_manager_client_new_for_bus (GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusObjectManager *g_dbus_object_manager_client_new_for_bus_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusObjectManager *g_dbus_object_manager_client_new_for_bus_sync (GBusType bus_type, + GDBusObjectManagerClientFlags flags, + const gchar *name, + const gchar *object_path, + GDBusProxyTypeFunc get_proxy_type_func, + gpointer get_proxy_type_user_data, + GDestroyNotify get_proxy_type_destroy_notify, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_object_manager_client_get_connection (GDBusObjectManagerClient *manager); +GLIB_AVAILABLE_IN_ALL +GDBusObjectManagerClientFlags g_dbus_object_manager_client_get_flags (GDBusObjectManagerClient *manager); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_object_manager_client_get_name (GDBusObjectManagerClient *manager); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_object_manager_client_get_name_owner (GDBusObjectManagerClient *manager); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_MANAGER_CLIENT_H */ diff --git a/gio/gdbusobjectmanagerserver.c b/gio/gdbusobjectmanagerserver.c new file mode 100644 index 0000000..4802c65 --- /dev/null +++ b/gio/gdbusobjectmanagerserver.c @@ -0,0 +1,1144 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobjectmanager.h" +#include "gdbusobjectmanagerserver.h" +#include "gdbusobject.h" +#include "gdbusobjectskeleton.h" +#include "gdbusinterfaceskeleton.h" +#include "gdbusconnection.h" +#include "gdbusintrospection.h" +#include "gdbusmethodinvocation.h" +#include "gdbuserror.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobjectmanagerserver + * @short_description: Service-side object manager + * @include: gio/gio.h + * + * #GDBusObjectManagerServer is used to export #GDBusObject instances using + * the standardized org.freedesktop.DBus.ObjectManager + * interface. For example, remote D-Bus clients can get all objects + * and properties in a single call. Additionally, any change in the + * object hierarchy is broadcast using signals. This means that D-Bus + * clients can keep caches up to date by only listening to D-Bus + * signals. + * + * See #GDBusObjectManagerClient for the client-side code that is + * intended to be used with #GDBusObjectManagerServer or any D-Bus + * object implementing the org.freedesktop.DBus.ObjectManager + * interface. + */ + +typedef struct +{ + GDBusObjectSkeleton *object; + GDBusObjectManagerServer *manager; + GHashTable *map_iface_name_to_iface; + gboolean exported; +} RegistrationData; + +static void registration_data_free (RegistrationData *data); + +static void export_all (GDBusObjectManagerServer *manager); +static void unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager); + +static void g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager, + RegistrationData *data, + const gchar *const *interfaces, + const gchar *object_path); + +static void g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager, + RegistrationData *data, + const gchar *const *interfaces); + +static gboolean g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer *manager, + const gchar *object_path); + +struct _GDBusObjectManagerServerPrivate +{ + GMutex lock; + GDBusConnection *connection; + gchar *object_path; + gchar *object_path_ending_in_slash; + GHashTable *map_object_path_to_data; + guint manager_reg_id; +}; + +enum +{ + PROP_0, + PROP_CONNECTION, + PROP_OBJECT_PATH +}; + +static void dbus_object_manager_interface_init (GDBusObjectManagerIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusObjectManagerServer, g_dbus_object_manager_server, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT_MANAGER, dbus_object_manager_interface_init)); + +static void g_dbus_object_manager_server_constructed (GObject *object); + +static void +g_dbus_object_manager_server_finalize (GObject *object) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); + + if (manager->priv->connection != NULL) + { + unexport_all (manager, TRUE); + g_object_unref (manager->priv->connection); + } + g_hash_table_unref (manager->priv->map_object_path_to_data); + g_free (manager->priv->object_path); + g_free (manager->priv->object_path_ending_in_slash); + + g_mutex_clear (&manager->priv->lock); + + if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->finalize (object); +} + +static void +g_dbus_object_manager_server_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); + + switch (prop_id) + { + case PROP_CONNECTION: + g_mutex_lock (&manager->priv->lock); + g_value_set_object (value, manager->priv->connection); + g_mutex_unlock (&manager->priv->lock); + break; + + case PROP_OBJECT_PATH: + g_value_set_string (value, g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager))); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_manager_server_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); + + switch (prop_id) + { + case PROP_CONNECTION: + g_dbus_object_manager_server_set_connection (manager, g_value_get_object (value)); + break; + + case PROP_OBJECT_PATH: + g_assert (manager->priv->object_path == NULL); + g_assert (g_variant_is_object_path (g_value_get_string (value))); + manager->priv->object_path = g_value_dup_string (value); + manager->priv->object_path_ending_in_slash = g_strdup_printf ("%s/", manager->priv->object_path); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_object_manager_server_finalize; + gobject_class->constructed = g_dbus_object_manager_server_constructed; + gobject_class->set_property = g_dbus_object_manager_server_set_property; + gobject_class->get_property = g_dbus_object_manager_server_get_property; + + /** + * GDBusObjectManagerServer:connection: + * + * The #GDBusConnection to export objects on. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_CONNECTION, + g_param_spec_object ("connection", + "Connection", + "The connection to export objects on", + G_TYPE_DBUS_CONNECTION, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectManagerServer:object-path: + * + * The object path to register the manager object at. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_OBJECT_PATH, + g_param_spec_string ("object-path", + "Object Path", + "The object path to register the manager object at", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_type_class_add_private (klass, sizeof (GDBusObjectManagerServerPrivate)); +} + +static void +g_dbus_object_manager_server_init (GDBusObjectManagerServer *manager) +{ + manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, + G_TYPE_DBUS_OBJECT_MANAGER_SERVER, + GDBusObjectManagerServerPrivate); + g_mutex_init (&manager->priv->lock); + manager->priv->map_object_path_to_data = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) registration_data_free); +} + +/** + * g_dbus_object_manager_server_new: + * @object_path: The object path to export the manager object at. + * + * Creates a new #GDBusObjectManagerServer object. + * + * The returned server isn't yet exported on any connection. To do so, + * use g_dbus_object_manager_server_set_connection(). Normally you + * want to export all of your objects before doing so to avoid InterfacesAdded + * signals being emitted. + * + * Returns: A #GDBusObjectManagerServer object. Free with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectManagerServer * +g_dbus_object_manager_server_new (const gchar *object_path) +{ + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return G_DBUS_OBJECT_MANAGER_SERVER (g_object_new (G_TYPE_DBUS_OBJECT_MANAGER_SERVER, + "object-path", object_path, + NULL)); +} + +/** + * g_dbus_object_manager_server_set_connection: + * @manager: A #GDBusObjectManagerServer. + * @connection: (allow-none): A #GDBusConnection or %NULL. + * + * Exports all objects managed by @manager on @connection. If + * @connection is %NULL, stops exporting objects. + */ +void +g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer *manager, + GDBusConnection *connection) +{ + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); + g_return_if_fail (connection == NULL || G_IS_DBUS_CONNECTION (connection)); + + g_mutex_lock (&manager->priv->lock); + + if (manager->priv->connection == connection) + { + g_mutex_unlock (&manager->priv->lock); + goto out; + } + + if (manager->priv->connection != NULL) + { + unexport_all (manager, FALSE); + g_object_unref (manager->priv->connection); + manager->priv->connection = NULL; + } + + manager->priv->connection = connection != NULL ? g_object_ref (connection) : NULL; + if (manager->priv->connection != NULL) + export_all (manager); + + g_mutex_unlock (&manager->priv->lock); + + g_object_notify (G_OBJECT (manager), "connection"); + out: + ; +} + +/** + * g_dbus_object_manager_server_get_connection: + * @manager: A #GDBusObjectManagerServer + * + * Gets the #GDBusConnection used by @manager. + * + * Returns: (transfer full): A #GDBusConnection object or %NULL if + * @manager isn't exported on a connection. The returned object should + * be freed with g_object_unref(). + * + * Since: 2.30 + */ +GDBusConnection * +g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager) +{ + GDBusConnection *ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), NULL); + g_mutex_lock (&manager->priv->lock); + ret = manager->priv->connection != NULL ? g_object_ref (manager->priv->connection) : NULL; + g_mutex_unlock (&manager->priv->lock); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +registration_data_export_interface (RegistrationData *data, + GDBusInterfaceSkeleton *interface_skeleton, + const gchar *object_path) +{ + GDBusInterfaceInfo *info; + GError *error; + + info = g_dbus_interface_skeleton_get_info (interface_skeleton); + error = NULL; + if (data->manager->priv->connection != NULL) + { + if (!g_dbus_interface_skeleton_export (interface_skeleton, + data->manager->priv->connection, + object_path, + &error)) + { + g_warning ("%s: Error registering object at %s with interface %s: %s", + G_STRLOC, + object_path, + info->name, + error->message); + g_error_free (error); + } + } + + g_assert (g_hash_table_lookup (data->map_iface_name_to_iface, info->name) == NULL); + g_hash_table_insert (data->map_iface_name_to_iface, + info->name, + g_object_ref (interface_skeleton)); + + /* if we are already exported, then... */ + if (data->exported) + { + const gchar *interfaces[2]; + /* emit InterfacesAdded on the ObjectManager object */ + interfaces[0] = info->name; + interfaces[1] = NULL; + g_dbus_object_manager_server_emit_interfaces_added (data->manager, data, interfaces, object_path); + } +} + +static void +registration_data_unexport_interface (RegistrationData *data, + GDBusInterfaceSkeleton *interface_skeleton) +{ + GDBusInterfaceInfo *info; + GDBusInterfaceSkeleton *iface; + + info = g_dbus_interface_skeleton_get_info (interface_skeleton); + iface = g_hash_table_lookup (data->map_iface_name_to_iface, info->name); + g_assert (iface != NULL); + + if (data->manager->priv->connection != NULL) + g_dbus_interface_skeleton_unexport (iface); + + g_warn_if_fail (g_hash_table_remove (data->map_iface_name_to_iface, info->name)); + + /* if we are already exported, then... */ + if (data->exported) + { + const gchar *interfaces[2]; + /* emit InterfacesRemoved on the ObjectManager object */ + interfaces[0] = info->name; + interfaces[1] = NULL; + g_dbus_object_manager_server_emit_interfaces_removed (data->manager, data, interfaces); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_interface_added (GDBusObject *object, + GDBusInterface *interface, + gpointer user_data) +{ + RegistrationData *data = user_data; + const gchar *object_path; + g_mutex_lock (&data->manager->priv->lock); + object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); + registration_data_export_interface (data, G_DBUS_INTERFACE_SKELETON (interface), object_path); + g_mutex_unlock (&data->manager->priv->lock); +} + +static void +on_interface_removed (GDBusObject *object, + GDBusInterface *interface, + gpointer user_data) +{ + RegistrationData *data = user_data; + g_mutex_lock (&data->manager->priv->lock); + registration_data_unexport_interface (data, G_DBUS_INTERFACE_SKELETON (interface)); + g_mutex_unlock (&data->manager->priv->lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ + + +static void +registration_data_free (RegistrationData *data) +{ + GHashTableIter iter; + GDBusInterfaceSkeleton *iface; + + data->exported = FALSE; + + g_hash_table_iter_init (&iter, data->map_iface_name_to_iface); + while (g_hash_table_iter_next (&iter, NULL, (gpointer) &iface)) + { + if (data->manager->priv->connection != NULL) + g_dbus_interface_skeleton_unexport (iface); + } + + g_signal_handlers_disconnect_by_func (data->object, G_CALLBACK (on_interface_added), data); + g_signal_handlers_disconnect_by_func (data->object, G_CALLBACK (on_interface_removed), data); + g_object_unref (data->object); + g_hash_table_destroy (data->map_iface_name_to_iface); + g_free (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_object_manager_server_export_unlocked (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object, + const gchar *object_path) +{ + RegistrationData *data; + GList *existing_interfaces; + GList *l; + GPtrArray *interface_names; + + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); + g_return_if_fail (G_IS_DBUS_OBJECT (object)); + g_return_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash)); + + interface_names = g_ptr_array_new (); + + data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); + if (data != NULL) + g_dbus_object_manager_server_unexport_unlocked (manager, object_path); + + data = g_new0 (RegistrationData, 1); + data->object = g_object_ref (object); + data->manager = manager; + data->map_iface_name_to_iface = g_hash_table_new_full (g_str_hash, + g_str_equal, + NULL, + (GDestroyNotify) g_object_unref); + + g_signal_connect (object, + "interface-added", + G_CALLBACK (on_interface_added), + data); + g_signal_connect (object, + "interface-removed", + G_CALLBACK (on_interface_removed), + data); + + /* Register all known interfaces - note that data->exported is FALSE so + * we don't emit any InterfacesAdded signals. + */ + existing_interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); + for (l = existing_interfaces; l != NULL; l = l->next) + { + GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data); + registration_data_export_interface (data, interface_skeleton, object_path); + g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name); + } + g_list_free_full (existing_interfaces, g_object_unref); + g_ptr_array_add (interface_names, NULL); + + data->exported = TRUE; + + /* now emit InterfacesAdded() for all the interfaces */ + g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata, object_path); + g_ptr_array_unref (interface_names); + + g_hash_table_insert (manager->priv->map_object_path_to_data, + g_strdup (object_path), + data); +} + +/** + * g_dbus_object_manager_server_export: + * @manager: A #GDBusObjectManagerServer. + * @object: A #GDBusObjectSkeleton. + * + * Exports @object on @manager. + * + * If there is already a #GDBusObject exported at the object path, + * then the old object is removed. + * + * The object path for @object must be in the hierarchy rooted by the + * object path for @manager. + * + * Note that @manager will take a reference on @object for as long as + * it is exported. + * + * Since: 2.30 + */ +void +g_dbus_object_manager_server_export (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object) +{ + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); + g_mutex_lock (&manager->priv->lock); + g_dbus_object_manager_server_export_unlocked (manager, object, + g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); + g_mutex_unlock (&manager->priv->lock); +} + +/** + * g_dbus_object_manager_server_export_uniquely: + * @manager: A #GDBusObjectManagerServer. + * @object: An object. + * + * Like g_dbus_object_manager_server_export() but appends a string of + * the form _N (with N being a natural number) to + * @object's object path if an object with the given path + * already exists. As such, the #GDBusObjectProxy:g-object-path property + * of @object may be modified. + * + * Since: 2.30 + */ +void +g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object) +{ + gchar *orig_object_path; + gchar *object_path; + guint count; + gboolean modified; + + orig_object_path = g_strdup (g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); + + g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); + g_return_if_fail (G_IS_DBUS_OBJECT (object)); + g_return_if_fail (g_str_has_prefix (orig_object_path, manager->priv->object_path_ending_in_slash)); + + g_mutex_lock (&manager->priv->lock); + + object_path = g_strdup (orig_object_path); + count = 1; + modified = FALSE; + while (TRUE) + { + RegistrationData *data; + data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); + if (data == NULL) + { + break; + } + g_free (object_path); + object_path = g_strdup_printf ("%s_%d", orig_object_path, count++); + modified = TRUE; + } + + g_dbus_object_manager_server_export_unlocked (manager, object, object_path); + + g_mutex_unlock (&manager->priv->lock); + + if (modified) + g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), object_path); + + g_free (object_path); + g_free (orig_object_path); + +} + +/** + * g_dbus_object_manager_server_is_exported: + * @manager: A #GDBusObjectManagerServer. + * @object: An object. + * + * Returns whether @object is currently exported on @manager. + * + * Returns: %TRUE if @object is exported + * + * Since: 2.34 + **/ +gboolean +g_dbus_object_manager_server_is_exported (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object) +{ + RegistrationData *data = NULL; + const gchar *object_path; + gboolean object_is_exported; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE); + g_return_val_if_fail (G_IS_DBUS_OBJECT (object), FALSE); + + g_mutex_lock (&manager->priv->lock); + + object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object)); + if (object_path != NULL) + data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); + object_is_exported = (data != NULL); + + g_mutex_unlock (&manager->priv->lock); + + return object_is_exported; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +g_dbus_object_manager_server_unexport_unlocked (GDBusObjectManagerServer *manager, + const gchar *object_path) +{ + RegistrationData *data; + gboolean ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE); + g_return_val_if_fail (g_variant_is_object_path (object_path), FALSE); + g_return_val_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash), FALSE); + + ret = FALSE; + + data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); + if (data != NULL) + { + GPtrArray *interface_names; + GHashTableIter iter; + const gchar *iface_name; + + interface_names = g_ptr_array_new (); + g_hash_table_iter_init (&iter, data->map_iface_name_to_iface); + while (g_hash_table_iter_next (&iter, (gpointer) &iface_name, NULL)) + g_ptr_array_add (interface_names, (gpointer) iface_name); + g_ptr_array_add (interface_names, NULL); + /* now emit InterfacesRemoved() for all the interfaces */ + g_dbus_object_manager_server_emit_interfaces_removed (manager, data, (const gchar *const *) interface_names->pdata); + g_ptr_array_unref (interface_names); + + g_hash_table_remove (manager->priv->map_object_path_to_data, object_path); + ret = TRUE; + } + + return ret; +} + +/** + * g_dbus_object_manager_server_unexport: + * @manager: A #GDBusObjectManagerServer. + * @object_path: An object path. + * + * If @manager has an object at @path, removes the object. Otherwise + * does nothing. + * + * Note that @object_path must be in the hierarchy rooted by the + * object path for @manager. + * + * Returns: %TRUE if object at @object_path was removed, %FALSE otherwise. + * + * Since: 2.30 + */ +gboolean +g_dbus_object_manager_server_unexport (GDBusObjectManagerServer *manager, + const gchar *object_path) +{ + gboolean ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager), FALSE); + g_mutex_lock (&manager->priv->lock); + ret = g_dbus_object_manager_server_unexport_unlocked (manager, object_path); + g_mutex_unlock (&manager->priv->lock); + return ret; +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +static const GDBusArgInfo manager_interfaces_added_signal_info_arg0 = +{ + -1, + "object_path", + "o", + (GDBusAnnotationInfo**) NULL, +}; + +static const GDBusArgInfo manager_interfaces_added_signal_info_arg1 = +{ + -1, + "interfaces_and_properties", + "a{sa{sv}}", + (GDBusAnnotationInfo**) NULL, +}; + +static const GDBusArgInfo * const manager_interfaces_added_signal_info_arg_pointers[] = +{ + &manager_interfaces_added_signal_info_arg0, + &manager_interfaces_added_signal_info_arg1, + NULL +}; + +static const GDBusSignalInfo manager_interfaces_added_signal_info = +{ + -1, + "InterfacesAdded", + (GDBusArgInfo**) &manager_interfaces_added_signal_info_arg_pointers, + (GDBusAnnotationInfo**) NULL +}; + +/* ---------- */ + +static const GDBusArgInfo manager_interfaces_removed_signal_info_arg0 = +{ + -1, + "object_path", + "o", + (GDBusAnnotationInfo**) NULL, +}; + +static const GDBusArgInfo manager_interfaces_removed_signal_info_arg1 = +{ + -1, + "interfaces", + "as", + (GDBusAnnotationInfo**) NULL, +}; + +static const GDBusArgInfo * const manager_interfaces_removed_signal_info_arg_pointers[] = +{ + &manager_interfaces_removed_signal_info_arg0, + &manager_interfaces_removed_signal_info_arg1, + NULL +}; + +static const GDBusSignalInfo manager_interfaces_removed_signal_info = +{ + -1, + "InterfacesRemoved", + (GDBusArgInfo**) &manager_interfaces_removed_signal_info_arg_pointers, + (GDBusAnnotationInfo**) NULL +}; + +/* ---------- */ + +static const GDBusSignalInfo * const manager_signal_info_pointers[] = +{ + &manager_interfaces_added_signal_info, + &manager_interfaces_removed_signal_info, + NULL +}; + +/* ---------- */ + +static const GDBusArgInfo manager_get_all_method_info_out_arg0 = +{ + -1, + "object_paths_interfaces_and_properties", + "a{oa{sa{sv}}}", + (GDBusAnnotationInfo**) NULL, +}; + +static const GDBusArgInfo * const manager_get_all_method_info_out_arg_pointers[] = +{ + &manager_get_all_method_info_out_arg0, + NULL +}; + +static const GDBusMethodInfo manager_get_all_method_info = +{ + -1, + "GetManagedObjects", + (GDBusArgInfo**) NULL, + (GDBusArgInfo**) &manager_get_all_method_info_out_arg_pointers, + (GDBusAnnotationInfo**) NULL +}; + +static const GDBusMethodInfo * const manager_method_info_pointers[] = +{ + &manager_get_all_method_info, + NULL +}; + +/* ---------- */ + +static const GDBusInterfaceInfo manager_interface_info = +{ + -1, + "org.freedesktop.DBus.ObjectManager", + (GDBusMethodInfo **) manager_method_info_pointers, + (GDBusSignalInfo **) manager_signal_info_pointers, + (GDBusPropertyInfo **) NULL, + (GDBusAnnotationInfo **) NULL +}; + +static void +manager_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (user_data); + GVariantBuilder array_builder; + GHashTableIter object_iter; + RegistrationData *data; + + g_mutex_lock (&manager->priv->lock); + + if (g_strcmp0 (method_name, "GetManagedObjects") == 0) + { + g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{oa{sa{sv}}}")); + g_hash_table_iter_init (&object_iter, manager->priv->map_object_path_to_data); + while (g_hash_table_iter_next (&object_iter, NULL, (gpointer) &data)) + { + GVariantBuilder interfaces_builder; + GHashTableIter interface_iter; + GDBusInterfaceSkeleton *iface; + const gchar *iter_object_path; + + g_variant_builder_init (&interfaces_builder, G_VARIANT_TYPE ("a{sa{sv}}")); + g_hash_table_iter_init (&interface_iter, data->map_iface_name_to_iface); + while (g_hash_table_iter_next (&interface_iter, NULL, (gpointer) &iface)) + { + GVariant *properties = g_dbus_interface_skeleton_get_properties (iface); + g_variant_builder_add (&interfaces_builder, "{s@a{sv}}", + g_dbus_interface_skeleton_get_info (iface)->name, + properties); + g_variant_unref (properties); + } + iter_object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); + g_variant_builder_add (&array_builder, + "{oa{sa{sv}}}", + iter_object_path, + &interfaces_builder); + } + + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(a{oa{sa{sv}}})", + &array_builder)); + } + else + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_UNKNOWN_METHOD, + "Unknown method %s - only GetManagedObjects() is supported", + method_name); + } + g_mutex_unlock (&manager->priv->lock); +} + +static const GDBusInterfaceVTable manager_interface_vtable = +{ + manager_method_call, /* handle_method_call */ + NULL, /* get_property */ + NULL /* set_property */ +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_object_manager_server_constructed (GObject *object) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (object); + + if (manager->priv->connection != NULL) + export_all (manager); + + if (G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed != NULL) + G_OBJECT_CLASS (g_dbus_object_manager_server_parent_class)->constructed (object); +} + +static void +g_dbus_object_manager_server_emit_interfaces_added (GDBusObjectManagerServer *manager, + RegistrationData *data, + const gchar *const *interfaces, + const gchar *object_path) +{ + GVariantBuilder array_builder; + GError *error; + guint n; + + if (data->manager->priv->connection == NULL) + goto out; + + g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("a{sa{sv}}")); + for (n = 0; interfaces[n] != NULL; n++) + { + GDBusInterfaceSkeleton *iface; + GVariant *properties; + + iface = g_hash_table_lookup (data->map_iface_name_to_iface, interfaces[n]); + g_assert (iface != NULL); + properties = g_dbus_interface_skeleton_get_properties (iface); + g_variant_builder_add (&array_builder, "{s@a{sv}}", interfaces[n], properties); + g_variant_unref (properties); + } + + error = NULL; + g_dbus_connection_emit_signal (data->manager->priv->connection, + NULL, /* destination_bus_name */ + manager->priv->object_path, + manager_interface_info.name, + "InterfacesAdded", + g_variant_new ("(oa{sa{sv}})", + object_path, + &array_builder), + &error); + g_assert_no_error (error); + out: + ; +} + +static void +g_dbus_object_manager_server_emit_interfaces_removed (GDBusObjectManagerServer *manager, + RegistrationData *data, + const gchar *const *interfaces) +{ + GVariantBuilder array_builder; + GError *error; + guint n; + const gchar *object_path; + + if (data->manager->priv->connection == NULL) + goto out; + + g_variant_builder_init (&array_builder, G_VARIANT_TYPE ("as")); + for (n = 0; interfaces[n] != NULL; n++) + g_variant_builder_add (&array_builder, "s", interfaces[n]); + + error = NULL; + object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (data->object)); + g_dbus_connection_emit_signal (data->manager->priv->connection, + NULL, /* destination_bus_name */ + manager->priv->object_path, + manager_interface_info.name, + "InterfacesRemoved", + g_variant_new ("(oas)", + object_path, + &array_builder), + &error); + g_assert_no_error (error); + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GList * +g_dbus_object_manager_server_get_objects (GDBusObjectManager *_manager) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); + GList *ret; + GHashTableIter iter; + RegistrationData *data; + + g_mutex_lock (&manager->priv->lock); + + ret = NULL; + g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); + while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data)) + { + ret = g_list_prepend (ret, g_object_ref (data->object)); + } + + g_mutex_unlock (&manager->priv->lock); + + return ret; +} + +static const gchar * +g_dbus_object_manager_server_get_object_path (GDBusObjectManager *_manager) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); + return manager->priv->object_path; +} + +static GDBusObject * +g_dbus_object_manager_server_get_object (GDBusObjectManager *_manager, + const gchar *object_path) +{ + GDBusObjectManagerServer *manager = G_DBUS_OBJECT_MANAGER_SERVER (_manager); + GDBusObject *ret; + RegistrationData *data; + + ret = NULL; + + g_mutex_lock (&manager->priv->lock); + data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); + if (data != NULL) + ret = g_object_ref (data->object); + g_mutex_unlock (&manager->priv->lock); + + return ret; +} + +static GDBusInterface * +g_dbus_object_manager_server_get_interface (GDBusObjectManager *_manager, + const gchar *object_path, + const gchar *interface_name) +{ + GDBusInterface *ret; + GDBusObject *object; + + ret = NULL; + + object = g_dbus_object_manager_get_object (_manager, object_path); + if (object == NULL) + goto out; + + ret = g_dbus_object_get_interface (object, interface_name); + g_object_unref (object); + + out: + return ret; +} + +static void +dbus_object_manager_interface_init (GDBusObjectManagerIface *iface) +{ + iface->get_object_path = g_dbus_object_manager_server_get_object_path; + iface->get_objects = g_dbus_object_manager_server_get_objects; + iface->get_object = g_dbus_object_manager_server_get_object; + iface->get_interface = g_dbus_object_manager_server_get_interface; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +export_all (GDBusObjectManagerServer *manager) +{ + GHashTableIter iter; + const gchar *object_path; + RegistrationData *data; + GHashTableIter iface_iter; + GDBusInterfaceSkeleton *iface; + GError *error; + + g_return_if_fail (manager->priv->connection != NULL); + + error = NULL; + g_warn_if_fail (manager->priv->manager_reg_id == 0); + manager->priv->manager_reg_id = g_dbus_connection_register_object (manager->priv->connection, + manager->priv->object_path, + (GDBusInterfaceInfo *) &manager_interface_info, + &manager_interface_vtable, + manager, + NULL, /* user_data_free_func */ + &error); + if (manager->priv->manager_reg_id == 0) + { + g_warning ("%s: Error registering manager at %s: %s", + G_STRLOC, + manager->priv->object_path, + error->message); + g_error_free (error); + } + + g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); + while (g_hash_table_iter_next (&iter, (gpointer) &object_path, (gpointer) &data)) + { + g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface); + while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface)) + { + g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) == NULL); + error = NULL; + if (!g_dbus_interface_skeleton_export (iface, + manager->priv->connection, + object_path, + &error)) + { + g_warning ("%s: Error registering object at %s with interface %s: %s", + G_STRLOC, + object_path, + g_dbus_interface_skeleton_get_info (iface)->name, + error->message); + g_error_free (error); + } + } + } +} + +static void +unexport_all (GDBusObjectManagerServer *manager, gboolean only_manager) +{ + GHashTableIter iter; + RegistrationData *data; + GHashTableIter iface_iter; + GDBusInterfaceSkeleton *iface; + + g_return_if_fail (manager->priv->connection != NULL); + + g_warn_if_fail (manager->priv->manager_reg_id > 0); + if (manager->priv->manager_reg_id > 0) + { + g_warn_if_fail (g_dbus_connection_unregister_object (manager->priv->connection, + manager->priv->manager_reg_id)); + manager->priv->manager_reg_id = 0; + } + if (only_manager) + goto out; + + g_hash_table_iter_init (&iter, manager->priv->map_object_path_to_data); + while (g_hash_table_iter_next (&iter, NULL, (gpointer) &data)) + { + g_hash_table_iter_init (&iface_iter, data->map_iface_name_to_iface); + while (g_hash_table_iter_next (&iface_iter, NULL, (gpointer) &iface)) + { + g_warn_if_fail (g_dbus_interface_skeleton_get_connection (iface) != NULL); + g_dbus_interface_skeleton_unexport (iface); + } + } + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusobjectmanagerserver.h b/gio/gdbusobjectmanagerserver.h new file mode 100644 index 0000000..cd7bb4b --- /dev/null +++ b/gio/gdbusobjectmanagerserver.h @@ -0,0 +1,95 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_MANAGER_SERVER_H__ +#define __G_DBUS_OBJECT_MANAGER_SERVER_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT_MANAGER_SERVER (g_dbus_object_manager_server_get_type ()) +#define G_DBUS_OBJECT_MANAGER_SERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT_MANAGER_SERVER, GDBusObjectManagerServer)) +#define G_DBUS_OBJECT_MANAGER_SERVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_OBJECT_MANAGER_SERVER, GDBusObjectManagerServerClass)) +#define G_DBUS_OBJECT_MANAGER_SERVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_OBJECT_MANAGER_SERVER, GDBusObjectManagerServerClass)) +#define G_IS_DBUS_OBJECT_MANAGER_SERVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT_MANAGER_SERVER)) +#define G_IS_DBUS_OBJECT_MANAGER_SERVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_OBJECT_MANAGER_SERVER)) + +typedef struct _GDBusObjectManagerServerClass GDBusObjectManagerServerClass; +typedef struct _GDBusObjectManagerServerPrivate GDBusObjectManagerServerPrivate; + +/** + * GDBusObjectManagerServer: + * + * The #GDBusObjectManagerServer structure contains private data and should + * only be accessed using the provided API. + * + * Since: 2.30 + */ +struct _GDBusObjectManagerServer +{ + /*< private >*/ + GObject parent_instance; + GDBusObjectManagerServerPrivate *priv; +}; + +/** + * GDBusObjectManagerServerClass: + * @parent_class: The parent class. + * + * Class structure for #GDBusObjectManagerServer. + * + * Since: 2.30 + */ +struct _GDBusObjectManagerServerClass +{ + GObjectClass parent_class; + + /*< private >*/ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_manager_server_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusObjectManagerServer *g_dbus_object_manager_server_new (const gchar *object_path); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_object_manager_server_get_connection (GDBusObjectManagerServer *manager); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_manager_server_set_connection (GDBusObjectManagerServer *manager, + GDBusConnection *connection); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_manager_server_export (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_manager_server_export_uniquely (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_object_manager_server_is_exported (GDBusObjectManagerServer *manager, + GDBusObjectSkeleton *object); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_object_manager_server_unexport (GDBusObjectManagerServer *manager, + const gchar *object_path); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_MANAGER_SERVER_H */ diff --git a/gio/gdbusobjectproxy.c b/gio/gdbusobjectproxy.c new file mode 100644 index 0000000..9f28074 --- /dev/null +++ b/gio/gdbusobjectproxy.c @@ -0,0 +1,361 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobject.h" +#include "gdbusobjectproxy.h" +#include "gdbusconnection.h" +#include "gdbusprivate.h" +#include "gdbusutils.h" +#include "gdbusproxy.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobjectproxy + * @short_description: Client-side D-Bus object + * @include: gio/gio.h + * + * A #GDBusObjectProxy is an object used to represent a remote object + * with one or more D-Bus interfaces. Normally, you don't instantiate + * a #GDBusObjectProxy yourself - typically #GDBusObjectManagerClient + * is used to obtain it. + * + * Since: 2.30 + */ + +struct _GDBusObjectProxyPrivate +{ + GMutex lock; + GHashTable *map_name_to_iface; + gchar *object_path; + GDBusConnection *connection; +}; + +enum +{ + PROP_0, + PROP_G_OBJECT_PATH, + PROP_G_CONNECTION +}; + +static void dbus_object_interface_init (GDBusObjectIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusObjectProxy, g_dbus_object_proxy, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, dbus_object_interface_init)); + +static void +g_dbus_object_proxy_finalize (GObject *object) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + + g_hash_table_unref (proxy->priv->map_name_to_iface); + + g_clear_object (&proxy->priv->connection); + + g_free (proxy->priv->object_path); + + g_mutex_clear (&proxy->priv->lock); + + if (G_OBJECT_CLASS (g_dbus_object_proxy_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_dbus_object_proxy_parent_class)->finalize (object); +} + +static void +g_dbus_object_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + + switch (prop_id) + { + case PROP_G_OBJECT_PATH: + g_mutex_lock (&proxy->priv->lock); + g_value_set_string (value, proxy->priv->object_path); + g_mutex_unlock (&proxy->priv->lock); + break; + + case PROP_G_CONNECTION: + g_value_set_object (value, g_dbus_object_proxy_get_connection (proxy)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (proxy, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + + switch (prop_id) + { + case PROP_G_OBJECT_PATH: + g_mutex_lock (&proxy->priv->lock); + proxy->priv->object_path = g_value_dup_string (value); + g_mutex_unlock (&proxy->priv->lock); + break; + + case PROP_G_CONNECTION: + g_mutex_lock (&proxy->priv->lock); + proxy->priv->connection = g_value_dup_object (value); + g_mutex_unlock (&proxy->priv->lock); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (proxy, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_proxy_class_init (GDBusObjectProxyClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_object_proxy_finalize; + gobject_class->set_property = g_dbus_object_proxy_set_property; + gobject_class->get_property = g_dbus_object_proxy_get_property; + + /** + * GDBusObjectProxy:g-object-path: + * + * The object path of the proxy. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_G_OBJECT_PATH, + g_param_spec_string ("g-object-path", + "Object Path", + "The object path of the proxy", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectProxy:g-connection: + * + * The connection of the proxy. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_G_CONNECTION, + g_param_spec_object ("g-connection", + "Connection", + "The connection of the proxy", + G_TYPE_DBUS_CONNECTION, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_type_class_add_private (klass, sizeof (GDBusObjectProxyPrivate)); +} + +static void +g_dbus_object_proxy_init (GDBusObjectProxy *proxy) +{ + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, + G_TYPE_DBUS_OBJECT_PROXY, + GDBusObjectProxyPrivate); + g_mutex_init (&proxy->priv->lock); + proxy->priv->map_name_to_iface = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_object_unref); +} + +static const gchar * +g_dbus_object_proxy_get_object_path (GDBusObject *object) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + const gchar *ret; + g_mutex_lock (&proxy->priv->lock); + ret = proxy->priv->object_path; + g_mutex_unlock (&proxy->priv->lock); + return ret; +} + +/** + * g_dbus_object_proxy_get_connection: + * @proxy: a #GDBusObjectProxy + * + * Gets the connection that @proxy is for. + * + * Returns: (transfer none): A #GDBusConnection. Do not free, the + * object is owned by @proxy. + * + * Since: 2.30 + */ +GDBusConnection * +g_dbus_object_proxy_get_connection (GDBusObjectProxy *proxy) +{ + GDBusConnection *ret; + g_return_val_if_fail (G_IS_DBUS_OBJECT_PROXY (proxy), NULL); + g_mutex_lock (&proxy->priv->lock); + ret = proxy->priv->connection; + g_mutex_unlock (&proxy->priv->lock); + return ret; +} + +static GDBusInterface * +g_dbus_object_proxy_get_interface (GDBusObject *object, + const gchar *interface_name) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + GDBusProxy *ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_PROXY (proxy), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + + g_mutex_lock (&proxy->priv->lock); + ret = g_hash_table_lookup (proxy->priv->map_name_to_iface, interface_name); + if (ret != NULL) + g_object_ref (ret); + g_mutex_unlock (&proxy->priv->lock); + + return (GDBusInterface *) ret; /* TODO: proper cast */ +} + +static GList * +g_dbus_object_proxy_get_interfaces (GDBusObject *object) +{ + GDBusObjectProxy *proxy = G_DBUS_OBJECT_PROXY (object); + GList *ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_PROXY (proxy), NULL); + + ret = NULL; + + g_mutex_lock (&proxy->priv->lock); + ret = g_hash_table_get_values (proxy->priv->map_name_to_iface); + g_list_foreach (ret, (GFunc) g_object_ref, NULL); + g_mutex_unlock (&proxy->priv->lock); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_object_proxy_new: + * @connection: a #GDBusConnection + * @object_path: the object path + * + * Creates a new #GDBusObjectProxy for the given connection and + * object path. + * + * Returns: a new #GDBusObjectProxy + * + * Since: 2.30 + */ +GDBusObjectProxy * +g_dbus_object_proxy_new (GDBusConnection *connection, + const gchar *object_path) +{ + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return G_DBUS_OBJECT_PROXY (g_object_new (G_TYPE_DBUS_OBJECT_PROXY, + "g-object-path", object_path, + "g-connection", connection, + NULL)); +} + +void +_g_dbus_object_proxy_add_interface (GDBusObjectProxy *proxy, + GDBusProxy *interface_proxy) +{ + const gchar *interface_name; + GDBusProxy *interface_proxy_to_remove; + + g_return_if_fail (G_IS_DBUS_OBJECT_PROXY (proxy)); + g_return_if_fail (G_IS_DBUS_PROXY (interface_proxy)); + + g_mutex_lock (&proxy->priv->lock); + + interface_name = g_dbus_proxy_get_interface_name (interface_proxy); + interface_proxy_to_remove = g_hash_table_lookup (proxy->priv->map_name_to_iface, interface_name); + if (interface_proxy_to_remove != NULL) + { + g_object_ref (interface_proxy_to_remove); + g_warn_if_fail (g_hash_table_remove (proxy->priv->map_name_to_iface, interface_name)); + } + g_hash_table_insert (proxy->priv->map_name_to_iface, + g_strdup (interface_name), + g_object_ref (interface_proxy)); + g_object_ref (interface_proxy); + + g_mutex_unlock (&proxy->priv->lock); + + if (interface_proxy_to_remove != NULL) + { + g_signal_emit_by_name (proxy, "interface-removed", interface_proxy_to_remove); + g_object_unref (interface_proxy_to_remove); + } + + g_signal_emit_by_name (proxy, "interface-added", interface_proxy); + g_object_unref (interface_proxy); +} + +void +_g_dbus_object_proxy_remove_interface (GDBusObjectProxy *proxy, + const gchar *interface_name) +{ + GDBusProxy *interface_proxy; + + g_return_if_fail (G_IS_DBUS_OBJECT_PROXY (proxy)); + g_return_if_fail (g_dbus_is_interface_name (interface_name)); + + g_mutex_lock (&proxy->priv->lock); + + interface_proxy = g_hash_table_lookup (proxy->priv->map_name_to_iface, interface_name); + if (interface_proxy != NULL) + { + g_object_ref (interface_proxy); + g_warn_if_fail (g_hash_table_remove (proxy->priv->map_name_to_iface, interface_name)); + g_mutex_unlock (&proxy->priv->lock); + g_signal_emit_by_name (proxy, "interface-removed", interface_proxy); + g_object_unref (interface_proxy); + } + else + { + g_mutex_unlock (&proxy->priv->lock); + } +} + +static void +dbus_object_interface_init (GDBusObjectIface *iface) +{ + iface->get_object_path = g_dbus_object_proxy_get_object_path; + iface->get_interfaces = g_dbus_object_proxy_get_interfaces; + iface->get_interface = g_dbus_object_proxy_get_interface; +} diff --git a/gio/gdbusobjectproxy.h b/gio/gdbusobjectproxy.h new file mode 100644 index 0000000..8fe7416 --- /dev/null +++ b/gio/gdbusobjectproxy.h @@ -0,0 +1,81 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_PROXY_H__ +#define __G_DBUS_OBJECT_PROXY_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT_PROXY (g_dbus_object_proxy_get_type ()) +#define G_DBUS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT_PROXY, GDBusObjectProxy)) +#define G_DBUS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_OBJECT_PROXY, GDBusObjectProxyClass)) +#define G_DBUS_OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_OBJECT_PROXY, GDBusObjectProxyClass)) +#define G_IS_DBUS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT_PROXY)) +#define G_IS_DBUS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_OBJECT_PROXY)) + +typedef struct _GDBusObjectProxyClass GDBusObjectProxyClass; +typedef struct _GDBusObjectProxyPrivate GDBusObjectProxyPrivate; + +/** + * GDBusObjectProxy: + * + * The #GDBusObjectProxy structure contains private data and should + * only be accessed using the provided API. + * + * Since: 2.30 + */ +struct _GDBusObjectProxy +{ + /*< private >*/ + GObject parent_instance; + GDBusObjectProxyPrivate *priv; +}; + +/** + * GDBusObjectProxyClass: + * @parent_class: The parent class. + * + * Class structure for #GDBusObjectProxy. + * + * Since: 2.30 + */ +struct _GDBusObjectProxyClass +{ + GObjectClass parent_class; + + /*< private >*/ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_proxy_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusObjectProxy *g_dbus_object_proxy_new (GDBusConnection *connection, + const gchar *object_path); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_object_proxy_get_connection (GDBusObjectProxy *proxy); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_PROXY_H */ diff --git a/gio/gdbusobjectskeleton.c b/gio/gdbusobjectskeleton.c new file mode 100644 index 0000000..3152f8f --- /dev/null +++ b/gio/gdbusobjectskeleton.c @@ -0,0 +1,512 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include "gdbusobject.h" +#include "gdbusobjectskeleton.h" +#include "gdbusinterfaceskeleton.h" +#include "gdbusprivate.h" +#include "gdbusmethodinvocation.h" +#include "gdbusintrospection.h" +#include "gdbusinterface.h" +#include "gdbusutils.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusobjectskeleton + * @short_description: Service-side D-Bus object + * @include: gio/gio.h + * + * A #GDBusObjectSkeleton instance is essentially a group of D-Bus + * interfaces. The set of exported interfaces on the object may be + * dynamic and change at runtime. + * + * This type is intended to be used with #GDBusObjectManager. + */ + +struct _GDBusObjectSkeletonPrivate +{ + GMutex lock; + gchar *object_path; + GHashTable *map_name_to_iface; +}; + +enum +{ + PROP_0, + PROP_G_OBJECT_PATH +}; + +enum +{ + AUTHORIZE_METHOD_SIGNAL, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = {0}; + +static void dbus_object_interface_init (GDBusObjectIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusObjectSkeleton, g_dbus_object_skeleton, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, dbus_object_interface_init)); + + +static void +g_dbus_object_skeleton_finalize (GObject *_object) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + + g_free (object->priv->object_path); + g_hash_table_unref (object->priv->map_name_to_iface); + + g_mutex_clear (&object->priv->lock); + + if (G_OBJECT_CLASS (g_dbus_object_skeleton_parent_class)->finalize != NULL) + G_OBJECT_CLASS (g_dbus_object_skeleton_parent_class)->finalize (_object); +} + +static void +g_dbus_object_skeleton_get_property (GObject *_object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + + switch (prop_id) + { + case PROP_G_OBJECT_PATH: + g_mutex_lock (&object->priv->lock); + g_value_set_string (value, object->priv->object_path); + g_mutex_unlock (&object->priv->lock); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_object_skeleton_set_property (GObject *_object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + + switch (prop_id) + { + case PROP_G_OBJECT_PATH: + g_dbus_object_skeleton_set_object_path (object, g_value_get_string (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +g_dbus_object_skeleton_authorize_method_default (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface, + GDBusMethodInvocation *invocation) +{ + return TRUE; +} + +static void +g_dbus_object_skeleton_class_init (GDBusObjectSkeletonClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_object_skeleton_finalize; + gobject_class->set_property = g_dbus_object_skeleton_set_property; + gobject_class->get_property = g_dbus_object_skeleton_get_property; + + klass->authorize_method = g_dbus_object_skeleton_authorize_method_default; + + /** + * GDBusObjectSkeleton:g-object-path: + * + * The object path where the object is exported. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, + PROP_G_OBJECT_PATH, + g_param_spec_string ("g-object-path", + "Object Path", + "The object path where the object is exported", + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + /** + * GDBusObjectSkeleton::authorize-method: + * @object: The #GDBusObjectSkeleton emitting the signal. + * @interface: The #GDBusInterfaceSkeleton that @invocation is for. + * @invocation: A #GDBusMethodInvocation. + * + * Emitted when a method is invoked by a remote caller and used to + * determine if the method call is authorized. + * + * This signal is like #GDBusInterfaceSkeleton's + * #GDBusInterfaceSkeleton::g-authorize-method signal, except that it is + * for the enclosing object. + * + * The default class handler just returns %TRUE. + * + * Returns: %TRUE if the call is authorized, %FALSE otherwise. + * + * Since: 2.30 + */ + signals[AUTHORIZE_METHOD_SIGNAL] = + g_signal_new ("authorize-method", + G_TYPE_DBUS_OBJECT_SKELETON, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusObjectSkeletonClass, authorize_method), + _g_signal_accumulator_false_handled, + NULL, + NULL, + G_TYPE_BOOLEAN, + 2, + G_TYPE_DBUS_INTERFACE_SKELETON, + G_TYPE_DBUS_METHOD_INVOCATION); + + g_type_class_add_private (klass, sizeof (GDBusObjectSkeletonPrivate)); +} + +static void +g_dbus_object_skeleton_init (GDBusObjectSkeleton *object) +{ + object->priv = G_TYPE_INSTANCE_GET_PRIVATE (object, G_TYPE_DBUS_OBJECT_SKELETON, GDBusObjectSkeletonPrivate); + g_mutex_init (&object->priv->lock); + object->priv->map_name_to_iface = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_object_unref); +} + +/** + * g_dbus_object_skeleton_new: + * @object_path: An object path. + * + * Creates a new #GDBusObjectSkeleton. + * + * Returns: A #GDBusObjectSkeleton. Free with g_object_unref(). + * + * Since: 2.30 + */ +GDBusObjectSkeleton * +g_dbus_object_skeleton_new (const gchar *object_path) +{ + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + return G_DBUS_OBJECT_SKELETON (g_object_new (G_TYPE_DBUS_OBJECT_SKELETON, + "g-object-path", object_path, + NULL)); +} + +/** + * g_dbus_object_skeleton_set_object_path: + * @object: A #GDBusObjectSkeleton. + * @object_path: A valid D-Bus object path. + * + * Sets the object path for @object. + * + * Since: 2.30 + */ +void +g_dbus_object_skeleton_set_object_path (GDBusObjectSkeleton *object, + const gchar *object_path) +{ + g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); + g_return_if_fail (object_path == NULL || g_variant_is_object_path (object_path)); + g_mutex_lock (&object->priv->lock); + /* TODO: fail if object is currently exported */ + if (g_strcmp0 (object->priv->object_path, object_path) != 0) + { + g_free (object->priv->object_path); + object->priv->object_path = g_strdup (object_path); + g_mutex_unlock (&object->priv->lock); + g_object_notify (G_OBJECT (object), "g-object-path"); + } + else + { + g_mutex_unlock (&object->priv->lock); + } +} + +static const gchar * +g_dbus_object_skeleton_get_object_path (GDBusObject *_object) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + const gchar *ret; + g_mutex_lock (&object->priv->lock); + ret = object->priv->object_path; + g_mutex_unlock (&object->priv->lock); + return ret; +} + +/** + * g_dbus_object_skeleton_add_interface: + * @object: A #GDBusObjectSkeleton. + * @interface_: A #GDBusInterfaceSkeleton. + * + * Adds @interface_ to @object. + * + * If @object already contains a #GDBusInterfaceSkeleton with the same + * interface name, it is removed before @interface_ is added. + * + * Note that @object takes its own reference on @interface_ and holds + * it until removed. + * + * Since: 2.30 + */ +void +g_dbus_object_skeleton_add_interface (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface_) +{ + GDBusInterfaceInfo *info; + GDBusInterface *interface_to_remove; + + g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); + g_return_if_fail (G_IS_DBUS_INTERFACE_SKELETON (interface_)); + + g_mutex_lock (&object->priv->lock); + + info = g_dbus_interface_skeleton_get_info (interface_); + g_object_ref (interface_); + + interface_to_remove = g_hash_table_lookup (object->priv->map_name_to_iface, info->name); + if (interface_to_remove != NULL) + { + g_object_ref (interface_to_remove); + g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, info->name)); + } + g_hash_table_insert (object->priv->map_name_to_iface, + g_strdup (info->name), + g_object_ref (interface_)); + g_dbus_interface_set_object (G_DBUS_INTERFACE (interface_), G_DBUS_OBJECT (object)); + + g_mutex_unlock (&object->priv->lock); + + if (interface_to_remove != NULL) + { + g_dbus_interface_set_object (interface_to_remove, NULL); + g_signal_emit_by_name (object, + "interface-removed", + interface_to_remove); + g_object_unref (interface_to_remove); + } + + g_signal_emit_by_name (object, + "interface-added", + interface_); + g_object_unref (interface_); +} + +/** + * g_dbus_object_skeleton_remove_interface: + * @object: A #GDBusObjectSkeleton. + * @interface_: A #GDBusInterfaceSkeleton. + * + * Removes @interface_ from @object. + * + * Since: 2.30 + */ +void +g_dbus_object_skeleton_remove_interface (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface_) +{ + GDBusInterfaceSkeleton *other_interface; + GDBusInterfaceInfo *info; + + g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); + g_return_if_fail (G_IS_DBUS_INTERFACE (interface_)); + + g_mutex_lock (&object->priv->lock); + + info = g_dbus_interface_skeleton_get_info (interface_); + + other_interface = g_hash_table_lookup (object->priv->map_name_to_iface, info->name); + if (other_interface == NULL) + { + g_mutex_unlock (&object->priv->lock); + g_warning ("Tried to remove interface with name %s from object " + "at path %s but no such interface exists", + info->name, + object->priv->object_path); + } + else if (other_interface != interface_) + { + g_mutex_unlock (&object->priv->lock); + g_warning ("Tried to remove interface %p with name %s from object " + "at path %s but the object has the interface %p", + interface_, + info->name, + object->priv->object_path, + other_interface); + } + else + { + g_object_ref (interface_); + g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, info->name)); + g_mutex_unlock (&object->priv->lock); + g_dbus_interface_set_object (G_DBUS_INTERFACE (interface_), NULL); + g_signal_emit_by_name (object, + "interface-removed", + interface_); + g_object_unref (interface_); + } +} + + +/** + * g_dbus_object_skeleton_remove_interface_by_name: + * @object: A #GDBusObjectSkeleton. + * @interface_name: A D-Bus interface name. + * + * Removes the #GDBusInterface with @interface_name from @object. + * + * If no D-Bus interface of the given interface exists, this function + * does nothing. + * + * Since: 2.30 + */ +void +g_dbus_object_skeleton_remove_interface_by_name (GDBusObjectSkeleton *object, + const gchar *interface_name) +{ + GDBusInterface *interface; + + g_return_if_fail (G_IS_DBUS_OBJECT_SKELETON (object)); + g_return_if_fail (g_dbus_is_interface_name (interface_name)); + + g_mutex_lock (&object->priv->lock); + interface = g_hash_table_lookup (object->priv->map_name_to_iface, interface_name); + if (interface != NULL) + { + g_object_ref (interface); + g_warn_if_fail (g_hash_table_remove (object->priv->map_name_to_iface, interface_name)); + g_mutex_unlock (&object->priv->lock); + g_dbus_interface_set_object (interface, NULL); + g_signal_emit_by_name (object, + "interface-removed", + interface); + g_object_unref (interface); + } + else + { + g_mutex_unlock (&object->priv->lock); + } +} + +static GDBusInterface * +g_dbus_object_skeleton_get_interface (GDBusObject *_object, + const gchar *interface_name) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + GDBusInterface *ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_SKELETON (object), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + + g_mutex_lock (&object->priv->lock); + ret = g_hash_table_lookup (object->priv->map_name_to_iface, interface_name); + if (ret != NULL) + g_object_ref (ret); + g_mutex_unlock (&object->priv->lock); + return ret; +} + +static GList * +g_dbus_object_skeleton_get_interfaces (GDBusObject *_object) +{ + GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (_object); + GList *ret; + + g_return_val_if_fail (G_IS_DBUS_OBJECT_SKELETON (object), NULL); + + ret = NULL; + + g_mutex_lock (&object->priv->lock); + ret = g_hash_table_get_values (object->priv->map_name_to_iface); + g_list_foreach (ret, (GFunc) g_object_ref, NULL); + g_mutex_unlock (&object->priv->lock); + + return ret; +} + +/** + * g_dbus_object_skeleton_flush: + * @object: A #GDBusObjectSkeleton. + * + * This method simply calls g_dbus_interface_skeleton_flush() on all + * interfaces belonging to @object. See that method for when flushing + * is useful. + * + * Since: 2.30 + */ +void +g_dbus_object_skeleton_flush (GDBusObjectSkeleton *object) +{ + GList *to_flush, *l; + + g_mutex_lock (&object->priv->lock); + to_flush = g_hash_table_get_values (object->priv->map_name_to_iface); + g_list_foreach (to_flush, (GFunc) g_object_ref, NULL); + g_mutex_unlock (&object->priv->lock); + + for (l = to_flush; l != NULL; l = l->next) + g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (l->data)); + + g_list_free_full (to_flush, g_object_unref); +} + +static void +dbus_object_interface_init (GDBusObjectIface *iface) +{ + iface->get_object_path = g_dbus_object_skeleton_get_object_path; + iface->get_interfaces = g_dbus_object_skeleton_get_interfaces; + iface->get_interface = g_dbus_object_skeleton_get_interface; +} + +gboolean +_g_dbus_object_skeleton_has_authorize_method_handlers (GDBusObjectSkeleton *object) +{ + gboolean has_handlers; + gboolean has_default_class_handler; + + has_handlers = g_signal_has_handler_pending (object, + signals[AUTHORIZE_METHOD_SIGNAL], + 0, + TRUE); + has_default_class_handler = (G_DBUS_OBJECT_SKELETON_GET_CLASS (object)->authorize_method == + g_dbus_object_skeleton_authorize_method_default); + + return has_handlers || !has_default_class_handler; +} diff --git a/gio/gdbusobjectskeleton.h b/gio/gdbusobjectskeleton.h new file mode 100644 index 0000000..3bce873 --- /dev/null +++ b/gio/gdbusobjectskeleton.h @@ -0,0 +1,98 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_OBJECT_SKELETON_H__ +#define __G_DBUS_OBJECT_SKELETON_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_OBJECT_SKELETON (g_dbus_object_skeleton_get_type ()) +#define G_DBUS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_OBJECT_SKELETON, GDBusObjectSkeleton)) +#define G_DBUS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_OBJECT_SKELETON, GDBusObjectSkeletonClass)) +#define G_DBUS_OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_OBJECT_SKELETON, GDBusObjectSkeletonClass)) +#define G_IS_DBUS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_OBJECT_SKELETON)) +#define G_IS_DBUS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_OBJECT_SKELETON)) + +typedef struct _GDBusObjectSkeletonClass GDBusObjectSkeletonClass; +typedef struct _GDBusObjectSkeletonPrivate GDBusObjectSkeletonPrivate; + +/** + * GDBusObjectSkeleton: + * + * The #GDBusObjectSkeleton structure contains private data and should only be + * accessed using the provided API. + * + * Since: 2.30 + */ +struct _GDBusObjectSkeleton +{ + /*< private >*/ + GObject parent_instance; + GDBusObjectSkeletonPrivate *priv; +}; + +/** + * GDBusObjectSkeletonClass: + * @parent_class: The parent class. + * @authorize_method: Signal class handler for the #GDBusObjectSkeleton::authorize-method signal. + * + * Class structure for #GDBusObjectSkeleton. + * + * Since: 2.30 + */ +struct _GDBusObjectSkeletonClass +{ + GObjectClass parent_class; + + /* Signals */ + gboolean (*authorize_method) (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface_, + GDBusMethodInvocation *invocation); + + /*< private >*/ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_object_skeleton_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusObjectSkeleton *g_dbus_object_skeleton_new (const gchar *object_path); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_skeleton_flush (GDBusObjectSkeleton *object); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_skeleton_add_interface (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_skeleton_remove_interface (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface_); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_skeleton_remove_interface_by_name (GDBusObjectSkeleton *object, + const gchar *interface_name); +GLIB_AVAILABLE_IN_ALL +void g_dbus_object_skeleton_set_object_path (GDBusObjectSkeleton *object, + const gchar *object_path); + +G_END_DECLS + +#endif /* __G_DBUS_OBJECT_SKELETON_H */ diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c new file mode 100644 index 0000000..0e5bef2 --- /dev/null +++ b/gio/gdbusprivate.c @@ -0,0 +1,2237 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "giotypes.h" +#include "gsocket.h" +#include "gdbusprivate.h" +#include "gdbusmessage.h" +#include "gdbuserror.h" +#include "gdbusintrospection.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "ginputstream.h" +#include "gmemoryinputstream.h" +#include "giostream.h" +#include "glib/gstdio.h" +#include "gsocketcontrolmessage.h" +#include "gsocketconnection.h" +#include "gsocketoutputstream.h" + +#ifdef G_OS_UNIX +#include "gunixfdmessage.h" +#include "gunixconnection.h" +#include "gunixcredentialsmessage.h" +#endif + +#ifdef G_OS_WIN32 +#include +#endif + +#include "glibintl.h" + +static gboolean _g_dbus_worker_do_initial_read (gpointer data); + +/* ---------------------------------------------------------------------------------------------------- */ + +gchar * +_g_dbus_hexdump (const gchar *data, gsize len, guint indent) +{ + guint n, m; + GString *ret; + + ret = g_string_new (NULL); + + for (n = 0; n < len; n += 16) + { + g_string_append_printf (ret, "%*s%04x: ", indent, "", n); + + for (m = n; m < n + 16; m++) + { + if (m > n && (m%4) == 0) + g_string_append_c (ret, ' '); + if (m < len) + g_string_append_printf (ret, "%02x ", (guchar) data[m]); + else + g_string_append (ret, " "); + } + + g_string_append (ret, " "); + + for (m = n; m < len && m < n + 16; m++) + g_string_append_c (ret, g_ascii_isprint (data[m]) ? data[m] : '.'); + + g_string_append_c (ret, '\n'); + } + + return g_string_free (ret, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Unfortunately ancillary messages are discarded when reading from a + * socket using the GSocketInputStream abstraction. So we provide a + * very GInputStream-ish API that uses GSocket in this case (very + * similar to GSocketInputStream). + */ + +typedef struct +{ + GSocket *socket; + GCancellable *cancellable; + + void *buffer; + gsize count; + + GSocketControlMessage ***messages; + gint *num_messages; + + GSimpleAsyncResult *simple; + + gboolean from_mainloop; +} ReadWithControlData; + +static void +read_with_control_data_free (ReadWithControlData *data) +{ + g_object_unref (data->socket); + if (data->cancellable != NULL) + g_object_unref (data->cancellable); + g_object_unref (data->simple); + g_free (data); +} + +static gboolean +_g_socket_read_with_control_messages_ready (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + ReadWithControlData *data = user_data; + GError *error; + gssize result; + GInputVector vector; + + error = NULL; + vector.buffer = data->buffer; + vector.size = data->count; + result = g_socket_receive_message (data->socket, + NULL, /* address */ + &vector, + 1, + data->messages, + data->num_messages, + NULL, + data->cancellable, + &error); + if (result >= 0) + { + g_simple_async_result_set_op_res_gssize (data->simple, result); + } + else + { + g_assert (error != NULL); + g_simple_async_result_take_error (data->simple, error); + } + + if (data->from_mainloop) + g_simple_async_result_complete (data->simple); + else + g_simple_async_result_complete_in_idle (data->simple); + + return FALSE; +} + +static void +_g_socket_read_with_control_messages (GSocket *socket, + void *buffer, + gsize count, + GSocketControlMessage ***messages, + gint *num_messages, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + ReadWithControlData *data; + + data = g_new0 (ReadWithControlData, 1); + data->socket = g_object_ref (socket); + data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL; + data->buffer = buffer; + data->count = count; + data->messages = messages; + data->num_messages = num_messages; + + data->simple = g_simple_async_result_new (G_OBJECT (socket), + callback, + user_data, + _g_socket_read_with_control_messages); + g_simple_async_result_set_check_cancellable (data->simple, cancellable); + + if (!g_socket_condition_check (socket, G_IO_IN)) + { + GSource *source; + data->from_mainloop = TRUE; + source = g_socket_create_source (data->socket, + G_IO_IN | G_IO_HUP | G_IO_ERR, + cancellable); + g_source_set_callback (source, + (GSourceFunc) _g_socket_read_with_control_messages_ready, + data, + (GDestroyNotify) read_with_control_data_free); + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + } + else + { + _g_socket_read_with_control_messages_ready (data->socket, G_IO_IN, data); + read_with_control_data_free (data); + } +} + +static gssize +_g_socket_read_with_control_messages_finish (GSocket *socket, + GAsyncResult *result, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); + + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == _g_socket_read_with_control_messages); + + if (g_simple_async_result_propagate_error (simple, error)) + return -1; + else + return g_simple_async_result_get_op_res_gssize (simple); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Work-around for https://bugzilla.gnome.org/show_bug.cgi?id=627724 */ + +static GPtrArray *ensured_classes = NULL; + +static void +ensure_type (GType gtype) +{ + g_ptr_array_add (ensured_classes, g_type_class_ref (gtype)); +} + +static void +release_required_types (void) +{ + g_ptr_array_foreach (ensured_classes, (GFunc) g_type_class_unref, NULL); + g_ptr_array_unref (ensured_classes); + ensured_classes = NULL; +} + +static void +ensure_required_types (void) +{ + g_assert (ensured_classes == NULL); + ensured_classes = g_ptr_array_new (); + ensure_type (G_TYPE_SIMPLE_ASYNC_RESULT); + ensure_type (G_TYPE_MEMORY_INPUT_STREAM); +} +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + volatile gint refcount; + GThread *thread; + GMainContext *context; + GMainLoop *loop; +} SharedThreadData; + +static gpointer +gdbus_shared_thread_func (gpointer user_data) +{ + SharedThreadData *data = user_data; + + g_main_context_push_thread_default (data->context); + g_main_loop_run (data->loop); + g_main_context_pop_thread_default (data->context); + + release_required_types (); + + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static SharedThreadData * +_g_dbus_shared_thread_ref (void) +{ + static gsize shared_thread_data = 0; + SharedThreadData *ret; + + if (g_once_init_enter (&shared_thread_data)) + { + SharedThreadData *data; + + /* Work-around for https://bugzilla.gnome.org/show_bug.cgi?id=627724 */ + ensure_required_types (); + + data = g_new0 (SharedThreadData, 1); + data->refcount = 0; + + data->context = g_main_context_new (); + data->loop = g_main_loop_new (data->context, FALSE); + data->thread = g_thread_new ("gdbus", + gdbus_shared_thread_func, + data); + /* We can cast between gsize and gpointer safely */ + g_once_init_leave (&shared_thread_data, (gsize) data); + } + + ret = (SharedThreadData*) shared_thread_data; + g_atomic_int_inc (&ret->refcount); + return ret; +} + +static void +_g_dbus_shared_thread_unref (SharedThreadData *data) +{ + /* TODO: actually destroy the shared thread here */ +#if 0 + g_assert (data != NULL); + if (g_atomic_int_dec_and_test (&data->refcount)) + { + g_main_loop_quit (data->loop); + //g_thread_join (data->thread); + g_main_loop_unref (data->loop); + g_main_context_unref (data->context); + } +#endif +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef enum { + PENDING_NONE = 0, + PENDING_WRITE, + PENDING_FLUSH, + PENDING_CLOSE +} OutputPending; + +struct GDBusWorker +{ + volatile gint ref_count; + + SharedThreadData *shared_thread_data; + + /* really a boolean, but GLib 2.28 lacks atomic boolean ops */ + volatile gint stopped; + + /* TODO: frozen (e.g. G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING) currently + * only affects messages received from the other peer (since GDBusServer is the + * only user) - we might want it to affect messages sent to the other peer too? + */ + gboolean frozen; + GDBusCapabilityFlags capabilities; + GQueue *received_messages_while_frozen; + + GIOStream *stream; + GCancellable *cancellable; + GDBusWorkerMessageReceivedCallback message_received_callback; + GDBusWorkerMessageAboutToBeSentCallback message_about_to_be_sent_callback; + GDBusWorkerDisconnectedCallback disconnected_callback; + gpointer user_data; + + /* if not NULL, stream is GSocketConnection */ + GSocket *socket; + + /* used for reading */ + GMutex read_lock; + gchar *read_buffer; + gsize read_buffer_allocated_size; + gsize read_buffer_cur_size; + gsize read_buffer_bytes_wanted; + GUnixFDList *read_fd_list; + GSocketControlMessage **read_ancillary_messages; + gint read_num_ancillary_messages; + + /* Whether an async write, flush or close, or none of those, is pending. + * Only the worker thread may change its value, and only with the write_lock. + * Other threads may read its value when holding the write_lock. + * The worker thread may read its value at any time. + */ + OutputPending output_pending; + /* used for writing */ + GMutex write_lock; + /* queue of MessageToWriteData, protected by write_lock */ + GQueue *write_queue; + /* protected by write_lock */ + guint64 write_num_messages_written; + /* number of messages we'd written out last time we flushed; + * protected by write_lock + */ + guint64 write_num_messages_flushed; + /* list of FlushData, protected by write_lock */ + GList *write_pending_flushes; + /* list of CloseData, protected by write_lock */ + GList *pending_close_attempts; + /* no lock - only used from the worker thread */ + gboolean close_expected; +}; + +static void _g_dbus_worker_unref (GDBusWorker *worker); + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMutex mutex; + GCond cond; + guint64 number_to_wait_for; + GError *error; +} FlushData; + +struct _MessageToWriteData ; +typedef struct _MessageToWriteData MessageToWriteData; + +static void message_to_write_data_free (MessageToWriteData *data); + +static void read_message_print_transport_debug (gssize bytes_read, + GDBusWorker *worker); + +static void write_message_print_transport_debug (gssize bytes_written, + MessageToWriteData *data); + +typedef struct { + GDBusWorker *worker; + GCancellable *cancellable; + GSimpleAsyncResult *result; +} CloseData; + +static void close_data_free (CloseData *close_data) +{ + if (close_data->cancellable != NULL) + g_object_unref (close_data->cancellable); + + if (close_data->result != NULL) + g_object_unref (close_data->result); + + _g_dbus_worker_unref (close_data->worker); + g_slice_free (CloseData, close_data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusWorker * +_g_dbus_worker_ref (GDBusWorker *worker) +{ + g_atomic_int_inc (&worker->ref_count); + return worker; +} + +static void +_g_dbus_worker_unref (GDBusWorker *worker) +{ + if (g_atomic_int_dec_and_test (&worker->ref_count)) + { + g_assert (worker->write_pending_flushes == NULL); + + _g_dbus_shared_thread_unref (worker->shared_thread_data); + + g_object_unref (worker->stream); + + g_mutex_clear (&worker->read_lock); + g_object_unref (worker->cancellable); + if (worker->read_fd_list != NULL) + g_object_unref (worker->read_fd_list); + + g_queue_free_full (worker->received_messages_while_frozen, (GDestroyNotify) g_object_unref); + g_mutex_clear (&worker->write_lock); + g_queue_free_full (worker->write_queue, (GDestroyNotify) message_to_write_data_free); + g_free (worker->read_buffer); + + g_free (worker); + } +} + +static void +_g_dbus_worker_emit_disconnected (GDBusWorker *worker, + gboolean remote_peer_vanished, + GError *error) +{ + if (!g_atomic_int_get (&worker->stopped)) + worker->disconnected_callback (worker, remote_peer_vanished, error, worker->user_data); +} + +static void +_g_dbus_worker_emit_message_received (GDBusWorker *worker, + GDBusMessage *message) +{ + if (!g_atomic_int_get (&worker->stopped)) + worker->message_received_callback (worker, message, worker->user_data); +} + +static GDBusMessage * +_g_dbus_worker_emit_message_about_to_be_sent (GDBusWorker *worker, + GDBusMessage *message) +{ + GDBusMessage *ret; + if (!g_atomic_int_get (&worker->stopped)) + ret = worker->message_about_to_be_sent_callback (worker, message, worker->user_data); + else + ret = message; + return ret; +} + +/* can only be called from private thread with read-lock held - takes ownership of @message */ +static void +_g_dbus_worker_queue_or_deliver_received_message (GDBusWorker *worker, + GDBusMessage *message) +{ + if (worker->frozen || g_queue_get_length (worker->received_messages_while_frozen) > 0) + { + /* queue up */ + g_queue_push_tail (worker->received_messages_while_frozen, message); + } + else + { + /* not frozen, nor anything in queue */ + _g_dbus_worker_emit_message_received (worker, message); + g_object_unref (message); + } +} + +/* called in private thread shared by all GDBusConnection instances (without read-lock held) */ +static gboolean +unfreeze_in_idle_cb (gpointer user_data) +{ + GDBusWorker *worker = user_data; + GDBusMessage *message; + + g_mutex_lock (&worker->read_lock); + if (worker->frozen) + { + while ((message = g_queue_pop_head (worker->received_messages_while_frozen)) != NULL) + { + _g_dbus_worker_emit_message_received (worker, message); + g_object_unref (message); + } + worker->frozen = FALSE; + } + else + { + g_assert (g_queue_get_length (worker->received_messages_while_frozen) == 0); + } + g_mutex_unlock (&worker->read_lock); + return FALSE; +} + +/* can be called from any thread */ +void +_g_dbus_worker_unfreeze (GDBusWorker *worker) +{ + GSource *idle_source; + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + unfreeze_in_idle_cb, + _g_dbus_worker_ref (worker), + (GDestroyNotify) _g_dbus_worker_unref); + g_source_attach (idle_source, worker->shared_thread_data->context); + g_source_unref (idle_source); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void _g_dbus_worker_do_read_unlocked (GDBusWorker *worker); + +/* called in private thread shared by all GDBusConnection instances (without read-lock held) */ +static void +_g_dbus_worker_do_read_cb (GInputStream *input_stream, + GAsyncResult *res, + gpointer user_data) +{ + GDBusWorker *worker = user_data; + GError *error; + gssize bytes_read; + + g_mutex_lock (&worker->read_lock); + + /* If already stopped, don't even process the reply */ + if (g_atomic_int_get (&worker->stopped)) + goto out; + + error = NULL; + if (worker->socket == NULL) + bytes_read = g_input_stream_read_finish (g_io_stream_get_input_stream (worker->stream), + res, + &error); + else + bytes_read = _g_socket_read_with_control_messages_finish (worker->socket, + res, + &error); + if (worker->read_num_ancillary_messages > 0) + { + gint n; + for (n = 0; n < worker->read_num_ancillary_messages; n++) + { + GSocketControlMessage *control_message = G_SOCKET_CONTROL_MESSAGE (worker->read_ancillary_messages[n]); + + if (FALSE) + { + } +#ifdef G_OS_UNIX + else if (G_IS_UNIX_FD_MESSAGE (control_message)) + { + GUnixFDMessage *fd_message; + gint *fds; + gint num_fds; + + fd_message = G_UNIX_FD_MESSAGE (control_message); + fds = g_unix_fd_message_steal_fds (fd_message, &num_fds); + if (worker->read_fd_list == NULL) + { + worker->read_fd_list = g_unix_fd_list_new_from_array (fds, num_fds); + } + else + { + gint n; + for (n = 0; n < num_fds; n++) + { + /* TODO: really want a append_steal() */ + g_unix_fd_list_append (worker->read_fd_list, fds[n], NULL); + (void) g_close (fds[n], NULL); + } + } + g_free (fds); + } + else if (G_IS_UNIX_CREDENTIALS_MESSAGE (control_message)) + { + /* do nothing */ + } +#endif + else + { + if (error == NULL) + { + g_set_error (&error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Unexpected ancillary message of type %s received from peer", + g_type_name (G_TYPE_FROM_INSTANCE (control_message))); + _g_dbus_worker_emit_disconnected (worker, TRUE, error); + g_error_free (error); + g_object_unref (control_message); + n++; + while (n < worker->read_num_ancillary_messages) + g_object_unref (worker->read_ancillary_messages[n++]); + g_free (worker->read_ancillary_messages); + goto out; + } + } + g_object_unref (control_message); + } + g_free (worker->read_ancillary_messages); + } + + if (bytes_read == -1) + { + if (G_UNLIKELY (_g_dbus_debug_transport ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Transport:\n" + " ---- READ ERROR on stream of type %s:\n" + " ---- %s %d: %s\n", + g_type_name (G_TYPE_FROM_INSTANCE (g_io_stream_get_input_stream (worker->stream))), + g_quark_to_string (error->domain), error->code, + error->message); + _g_dbus_debug_print_unlock (); + } + + /* Every async read that uses this callback uses worker->cancellable + * as its GCancellable. worker->cancellable gets cancelled if and only + * if the GDBusConnection tells us to close (either via + * _g_dbus_worker_stop, which is called on last-unref, or directly), + * so a cancelled read must mean our connection was closed locally. + * + * If we're closing, other errors are possible - notably, + * G_IO_ERROR_CLOSED can be seen if we close the stream with an async + * read in-flight. It seems sensible to treat all read errors during + * closing as an expected thing that doesn't trip exit-on-close. + * + * Because close_expected can't be set until we get into the worker + * thread, but the cancellable is signalled sooner (from another + * thread), we do still need to check the error. + */ + if (worker->close_expected || + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + _g_dbus_worker_emit_disconnected (worker, FALSE, NULL); + else + _g_dbus_worker_emit_disconnected (worker, TRUE, error); + + g_error_free (error); + goto out; + } + +#if 0 + g_debug ("read %d bytes (is_closed=%d blocking=%d condition=0x%02x) stream %p, %p", + (gint) bytes_read, + g_socket_is_closed (g_socket_connection_get_socket (G_SOCKET_CONNECTION (worker->stream))), + g_socket_get_blocking (g_socket_connection_get_socket (G_SOCKET_CONNECTION (worker->stream))), + g_socket_condition_check (g_socket_connection_get_socket (G_SOCKET_CONNECTION (worker->stream)), + G_IO_IN | G_IO_OUT | G_IO_HUP), + worker->stream, + worker); +#endif + + /* TODO: hmm, hmm... */ + if (bytes_read == 0) + { + g_set_error (&error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Underlying GIOStream returned 0 bytes on an async read"); + _g_dbus_worker_emit_disconnected (worker, TRUE, error); + g_error_free (error); + goto out; + } + + read_message_print_transport_debug (bytes_read, worker); + + worker->read_buffer_cur_size += bytes_read; + if (worker->read_buffer_bytes_wanted == worker->read_buffer_cur_size) + { + /* OK, got what we asked for! */ + if (worker->read_buffer_bytes_wanted == 16) + { + gssize message_len; + /* OK, got the header - determine how many more bytes are needed */ + error = NULL; + message_len = g_dbus_message_bytes_needed ((guchar *) worker->read_buffer, + 16, + &error); + if (message_len == -1) + { + g_warning ("_g_dbus_worker_do_read_cb: error determining bytes needed: %s", error->message); + _g_dbus_worker_emit_disconnected (worker, FALSE, error); + g_error_free (error); + goto out; + } + + worker->read_buffer_bytes_wanted = message_len; + _g_dbus_worker_do_read_unlocked (worker); + } + else + { + GDBusMessage *message; + error = NULL; + + /* TODO: use connection->priv->auth to decode the message */ + + message = g_dbus_message_new_from_blob ((guchar *) worker->read_buffer, + worker->read_buffer_cur_size, + worker->capabilities, + &error); + if (message == NULL) + { + gchar *s; + s = _g_dbus_hexdump (worker->read_buffer, worker->read_buffer_cur_size, 2); + g_warning ("Error decoding D-Bus message of %" G_GSIZE_FORMAT " bytes\n" + "The error is: %s\n" + "The payload is as follows:\n" + "%s\n", + worker->read_buffer_cur_size, + error->message, + s); + g_free (s); + _g_dbus_worker_emit_disconnected (worker, FALSE, error); + g_error_free (error); + goto out; + } + +#ifdef G_OS_UNIX + if (worker->read_fd_list != NULL) + { + g_dbus_message_set_unix_fd_list (message, worker->read_fd_list); + g_object_unref (worker->read_fd_list); + worker->read_fd_list = NULL; + } +#endif + + if (G_UNLIKELY (_g_dbus_debug_message ())) + { + gchar *s; + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Message:\n" + " <<<< RECEIVED D-Bus message (%" G_GSIZE_FORMAT " bytes)\n", + worker->read_buffer_cur_size); + s = g_dbus_message_print (message, 2); + g_print ("%s", s); + g_free (s); + if (G_UNLIKELY (_g_dbus_debug_payload ())) + { + s = _g_dbus_hexdump (worker->read_buffer, worker->read_buffer_cur_size, 2); + g_print ("%s\n", s); + g_free (s); + } + _g_dbus_debug_print_unlock (); + } + + /* yay, got a message, go deliver it */ + _g_dbus_worker_queue_or_deliver_received_message (worker, message); + + /* start reading another message! */ + worker->read_buffer_bytes_wanted = 0; + worker->read_buffer_cur_size = 0; + _g_dbus_worker_do_read_unlocked (worker); + } + } + else + { + /* didn't get all the bytes we requested - so repeat the request... */ + _g_dbus_worker_do_read_unlocked (worker); + } + + out: + g_mutex_unlock (&worker->read_lock); + + /* gives up the reference acquired when calling g_input_stream_read_async() */ + _g_dbus_worker_unref (worker); +} + +/* called in private thread shared by all GDBusConnection instances (with read-lock held) */ +static void +_g_dbus_worker_do_read_unlocked (GDBusWorker *worker) +{ + /* Note that we do need to keep trying to read even if close_expected is + * true, because only failing a read causes us to signal 'closed'. + */ + + /* if bytes_wanted is zero, it means start reading a message */ + if (worker->read_buffer_bytes_wanted == 0) + { + worker->read_buffer_cur_size = 0; + worker->read_buffer_bytes_wanted = 16; + } + + /* ensure we have a (big enough) buffer */ + if (worker->read_buffer == NULL || worker->read_buffer_bytes_wanted > worker->read_buffer_allocated_size) + { + /* TODO: 4096 is randomly chosen; might want a better chosen default minimum */ + worker->read_buffer_allocated_size = MAX (worker->read_buffer_bytes_wanted, 4096); + worker->read_buffer = g_realloc (worker->read_buffer, worker->read_buffer_allocated_size); + } + + if (worker->socket == NULL) + g_input_stream_read_async (g_io_stream_get_input_stream (worker->stream), + worker->read_buffer + worker->read_buffer_cur_size, + worker->read_buffer_bytes_wanted - worker->read_buffer_cur_size, + G_PRIORITY_DEFAULT, + worker->cancellable, + (GAsyncReadyCallback) _g_dbus_worker_do_read_cb, + _g_dbus_worker_ref (worker)); + else + { + worker->read_ancillary_messages = NULL; + worker->read_num_ancillary_messages = 0; + _g_socket_read_with_control_messages (worker->socket, + worker->read_buffer + worker->read_buffer_cur_size, + worker->read_buffer_bytes_wanted - worker->read_buffer_cur_size, + &worker->read_ancillary_messages, + &worker->read_num_ancillary_messages, + G_PRIORITY_DEFAULT, + worker->cancellable, + (GAsyncReadyCallback) _g_dbus_worker_do_read_cb, + _g_dbus_worker_ref (worker)); + } +} + +/* called in private thread shared by all GDBusConnection instances (without read-lock held) */ +static gboolean +_g_dbus_worker_do_initial_read (gpointer data) +{ + GDBusWorker *worker = data; + g_mutex_lock (&worker->read_lock); + _g_dbus_worker_do_read_unlocked (worker); + g_mutex_unlock (&worker->read_lock); + return FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +struct _MessageToWriteData +{ + GDBusWorker *worker; + GDBusMessage *message; + gchar *blob; + gsize blob_size; + + gsize total_written; + GSimpleAsyncResult *simple; + +}; + +static void +message_to_write_data_free (MessageToWriteData *data) +{ + _g_dbus_worker_unref (data->worker); + if (data->message) + g_object_unref (data->message); + g_free (data->blob); + g_free (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void write_message_continue_writing (MessageToWriteData *data); + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_WRITE on entry + */ +static void +write_message_async_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + MessageToWriteData *data = user_data; + GSimpleAsyncResult *simple; + gssize bytes_written; + GError *error; + + /* Note: we can't access data->simple after calling g_async_result_complete () because the + * callback can free @data and we're not completing in idle. So use a copy of the pointer. + */ + simple = data->simple; + + error = NULL; + bytes_written = g_output_stream_write_finish (G_OUTPUT_STREAM (source_object), + res, + &error); + if (bytes_written == -1) + { + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } + g_assert (bytes_written > 0); /* zero is never returned */ + + write_message_print_transport_debug (bytes_written, data); + + data->total_written += bytes_written; + g_assert (data->total_written <= data->blob_size); + if (data->total_written == data->blob_size) + { + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } + + write_message_continue_writing (data); + + out: + ; +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_WRITE on entry + */ +#ifdef G_OS_UNIX +static gboolean +on_socket_ready (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + MessageToWriteData *data = user_data; + write_message_continue_writing (data); + return FALSE; /* remove source */ +} +#endif + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_WRITE on entry + */ +static void +write_message_continue_writing (MessageToWriteData *data) +{ + GOutputStream *ostream; +#ifdef G_OS_UNIX + GSimpleAsyncResult *simple; + GUnixFDList *fd_list; +#endif + +#ifdef G_OS_UNIX + /* Note: we can't access data->simple after calling g_async_result_complete () because the + * callback can free @data and we're not completing in idle. So use a copy of the pointer. + */ + simple = data->simple; +#endif + + ostream = g_io_stream_get_output_stream (data->worker->stream); +#ifdef G_OS_UNIX + fd_list = g_dbus_message_get_unix_fd_list (data->message); +#endif + + g_assert (!g_output_stream_has_pending (ostream)); + g_assert_cmpint (data->total_written, <, data->blob_size); + + if (FALSE) + { + } +#ifdef G_OS_UNIX + else if (G_IS_SOCKET_OUTPUT_STREAM (ostream) && data->total_written == 0) + { + GOutputVector vector; + GSocketControlMessage *control_message; + gssize bytes_written; + GError *error; + + vector.buffer = data->blob; + vector.size = data->blob_size; + + control_message = NULL; + if (fd_list != NULL && g_unix_fd_list_get_length (fd_list) > 0) + { + if (!(data->worker->capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING)) + { + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Tried sending a file descriptor but remote peer does not support this capability"); + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } + control_message = g_unix_fd_message_new_with_fd_list (fd_list); + } + + error = NULL; + bytes_written = g_socket_send_message (data->worker->socket, + NULL, /* address */ + &vector, + 1, + control_message != NULL ? &control_message : NULL, + control_message != NULL ? 1 : 0, + G_SOCKET_MSG_NONE, + data->worker->cancellable, + &error); + if (control_message != NULL) + g_object_unref (control_message); + + if (bytes_written == -1) + { + /* Handle WOULD_BLOCK by waiting until there's room in the buffer */ + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + { + GSource *source; + source = g_socket_create_source (data->worker->socket, + G_IO_OUT | G_IO_HUP | G_IO_ERR, + data->worker->cancellable); + g_source_set_callback (source, + (GSourceFunc) on_socket_ready, + data, + NULL); /* GDestroyNotify */ + g_source_attach (source, g_main_context_get_thread_default ()); + g_source_unref (source); + g_error_free (error); + goto out; + } + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } + g_assert (bytes_written > 0); /* zero is never returned */ + + write_message_print_transport_debug (bytes_written, data); + + data->total_written += bytes_written; + g_assert (data->total_written <= data->blob_size); + if (data->total_written == data->blob_size) + { + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } + + write_message_continue_writing (data); + } +#endif + else + { +#ifdef G_OS_UNIX + if (fd_list != NULL) + { + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Tried sending a file descriptor on unsupported stream of type %s", + g_type_name (G_TYPE_FROM_INSTANCE (ostream))); + g_simple_async_result_complete (simple); + g_object_unref (simple); + goto out; + } +#endif + + g_output_stream_write_async (ostream, + (const gchar *) data->blob + data->total_written, + data->blob_size - data->total_written, + G_PRIORITY_DEFAULT, + data->worker->cancellable, + write_message_async_cb, + data); + } +#ifdef G_OS_UNIX + out: +#endif + ; +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_WRITE on entry + */ +static void +write_message_async (GDBusWorker *worker, + MessageToWriteData *data, + GAsyncReadyCallback callback, + gpointer user_data) +{ + data->simple = g_simple_async_result_new (NULL, + callback, + user_data, + write_message_async); + data->total_written = 0; + write_message_continue_writing (data); +} + +/* called in private thread shared by all GDBusConnection instances (with write-lock held) */ +static gboolean +write_message_finish (GAsyncResult *res, + GError **error) +{ + g_warn_if_fail (g_simple_async_result_get_source_tag (G_SIMPLE_ASYNC_RESULT (res)) == write_message_async); + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return FALSE; + else + return TRUE; +} +/* ---------------------------------------------------------------------------------------------------- */ + +static void continue_writing (GDBusWorker *worker); + +typedef struct +{ + GDBusWorker *worker; + GList *flushers; +} FlushAsyncData; + +static void +flush_data_list_complete (const GList *flushers, + const GError *error) +{ + const GList *l; + + for (l = flushers; l != NULL; l = l->next) + { + FlushData *f = l->data; + + f->error = error != NULL ? g_error_copy (error) : NULL; + + g_mutex_lock (&f->mutex); + g_cond_signal (&f->cond); + g_mutex_unlock (&f->mutex); + } +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_FLUSH on entry + */ +static void +ostream_flush_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + FlushAsyncData *data = user_data; + GError *error; + + error = NULL; + g_output_stream_flush_finish (G_OUTPUT_STREAM (source_object), + res, + &error); + + if (error == NULL) + { + if (G_UNLIKELY (_g_dbus_debug_transport ())) + { + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Transport:\n" + " ---- FLUSHED stream of type %s\n", + g_type_name (G_TYPE_FROM_INSTANCE (g_io_stream_get_output_stream (data->worker->stream)))); + _g_dbus_debug_print_unlock (); + } + } + + g_assert (data->flushers != NULL); + flush_data_list_complete (data->flushers, error); + g_list_free (data->flushers); + + if (error != NULL) + g_error_free (error); + + /* Make sure we tell folks that we don't have additional + flushes pending */ + g_mutex_lock (&data->worker->write_lock); + data->worker->write_num_messages_flushed = data->worker->write_num_messages_written; + g_assert (data->worker->output_pending == PENDING_FLUSH); + data->worker->output_pending = PENDING_NONE; + g_mutex_unlock (&data->worker->write_lock); + + /* OK, cool, finally kick off the next write */ + continue_writing (data->worker); + + _g_dbus_worker_unref (data->worker); + g_free (data); +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_FLUSH on entry + */ +static void +start_flush (FlushAsyncData *data) +{ + g_output_stream_flush_async (g_io_stream_get_output_stream (data->worker->stream), + G_PRIORITY_DEFAULT, + data->worker->cancellable, + ostream_flush_cb, + data); +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is held on entry + * output_pending is PENDING_NONE on entry + */ +static void +message_written_unlocked (GDBusWorker *worker, + MessageToWriteData *message_data) +{ + if (G_UNLIKELY (_g_dbus_debug_message ())) + { + gchar *s; + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Message:\n" + " >>>> SENT D-Bus message (%" G_GSIZE_FORMAT " bytes)\n", + message_data->blob_size); + s = g_dbus_message_print (message_data->message, 2); + g_print ("%s", s); + g_free (s); + if (G_UNLIKELY (_g_dbus_debug_payload ())) + { + s = _g_dbus_hexdump (message_data->blob, message_data->blob_size, 2); + g_print ("%s\n", s); + g_free (s); + } + _g_dbus_debug_print_unlock (); + } + + worker->write_num_messages_written += 1; +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is held on entry + * output_pending is PENDING_NONE on entry + * + * Returns: non-%NULL, setting @output_pending, if we need to flush now + */ +static FlushAsyncData * +prepare_flush_unlocked (GDBusWorker *worker) +{ + GList *l; + GList *ll; + GList *flushers; + + flushers = NULL; + for (l = worker->write_pending_flushes; l != NULL; l = ll) + { + FlushData *f = l->data; + ll = l->next; + + if (f->number_to_wait_for == worker->write_num_messages_written) + { + flushers = g_list_append (flushers, f); + worker->write_pending_flushes = g_list_delete_link (worker->write_pending_flushes, l); + } + } + if (flushers != NULL) + { + g_assert (worker->output_pending == PENDING_NONE); + worker->output_pending = PENDING_FLUSH; + } + + if (flushers != NULL) + { + FlushAsyncData *data; + + data = g_new0 (FlushAsyncData, 1); + data->worker = _g_dbus_worker_ref (worker); + data->flushers = flushers; + return data; + } + + return NULL; +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_WRITE on entry + */ +static void +write_message_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + MessageToWriteData *data = user_data; + GError *error; + + g_mutex_lock (&data->worker->write_lock); + g_assert (data->worker->output_pending == PENDING_WRITE); + data->worker->output_pending = PENDING_NONE; + + error = NULL; + if (!write_message_finish (res, &error)) + { + g_mutex_unlock (&data->worker->write_lock); + + /* TODO: handle */ + _g_dbus_worker_emit_disconnected (data->worker, TRUE, error); + g_error_free (error); + + g_mutex_lock (&data->worker->write_lock); + } + + message_written_unlocked (data->worker, data); + + g_mutex_unlock (&data->worker->write_lock); + + continue_writing (data->worker); + + message_to_write_data_free (data); +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending is PENDING_CLOSE on entry + */ +static void +iostream_close_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusWorker *worker = user_data; + GError *error = NULL; + GList *pending_close_attempts, *pending_flush_attempts; + GQueue *send_queue; + + g_io_stream_close_finish (worker->stream, res, &error); + + g_mutex_lock (&worker->write_lock); + + pending_close_attempts = worker->pending_close_attempts; + worker->pending_close_attempts = NULL; + + pending_flush_attempts = worker->write_pending_flushes; + worker->write_pending_flushes = NULL; + + send_queue = worker->write_queue; + worker->write_queue = g_queue_new (); + + g_assert (worker->output_pending == PENDING_CLOSE); + worker->output_pending = PENDING_NONE; + + g_mutex_unlock (&worker->write_lock); + + while (pending_close_attempts != NULL) + { + CloseData *close_data = pending_close_attempts->data; + + pending_close_attempts = g_list_delete_link (pending_close_attempts, + pending_close_attempts); + + if (close_data->result != NULL) + { + if (error != NULL) + g_simple_async_result_set_from_error (close_data->result, error); + + /* this must be in an idle because the result is likely to be + * intended for another thread + */ + g_simple_async_result_complete_in_idle (close_data->result); + } + + close_data_free (close_data); + } + + g_clear_error (&error); + + /* all messages queued for sending are discarded */ + g_queue_free_full (send_queue, (GDestroyNotify) message_to_write_data_free); + /* all queued flushes fail */ + error = g_error_new (G_IO_ERROR, G_IO_ERROR_CANCELLED, + _("Operation was cancelled")); + flush_data_list_complete (pending_flush_attempts, error); + g_list_free (pending_flush_attempts); + g_clear_error (&error); + + _g_dbus_worker_unref (worker); +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending must be PENDING_NONE on entry + */ +static void +continue_writing (GDBusWorker *worker) +{ + MessageToWriteData *data; + FlushAsyncData *flush_async_data; + + write_next: + /* we mustn't try to write two things at once */ + g_assert (worker->output_pending == PENDING_NONE); + + g_mutex_lock (&worker->write_lock); + + data = NULL; + flush_async_data = NULL; + + /* if we want to close the connection, that takes precedence */ + if (worker->pending_close_attempts != NULL) + { + worker->close_expected = TRUE; + worker->output_pending = PENDING_CLOSE; + + g_io_stream_close_async (worker->stream, G_PRIORITY_DEFAULT, + NULL, iostream_close_cb, + _g_dbus_worker_ref (worker)); + } + else + { + flush_async_data = prepare_flush_unlocked (worker); + + if (flush_async_data == NULL) + { + data = g_queue_pop_head (worker->write_queue); + + if (data != NULL) + worker->output_pending = PENDING_WRITE; + } + } + + g_mutex_unlock (&worker->write_lock); + + /* Note that write_lock is only used for protecting the @write_queue + * and @output_pending fields of the GDBusWorker struct ... which we + * need to modify from arbitrary threads in _g_dbus_worker_send_message(). + * + * Therefore, it's fine to drop it here when calling back into user + * code and then writing the message out onto the GIOStream since this + * function only runs on the worker thread. + */ + + if (flush_async_data != NULL) + { + start_flush (flush_async_data); + g_assert (data == NULL); + } + else if (data != NULL) + { + GDBusMessage *old_message; + guchar *new_blob; + gsize new_blob_size; + GError *error; + + old_message = data->message; + data->message = _g_dbus_worker_emit_message_about_to_be_sent (worker, data->message); + if (data->message == old_message) + { + /* filters had no effect - do nothing */ + } + else if (data->message == NULL) + { + /* filters dropped message */ + g_mutex_lock (&worker->write_lock); + worker->output_pending = PENDING_NONE; + g_mutex_unlock (&worker->write_lock); + message_to_write_data_free (data); + goto write_next; + } + else + { + /* filters altered the message -> reencode */ + error = NULL; + new_blob = g_dbus_message_to_blob (data->message, + &new_blob_size, + worker->capabilities, + &error); + if (new_blob == NULL) + { + /* if filter make the GDBusMessage unencodeable, just complain on stderr and send + * the old message instead + */ + g_warning ("Error encoding GDBusMessage with serial %d altered by filter function: %s", + g_dbus_message_get_serial (data->message), + error->message); + g_error_free (error); + } + else + { + g_free (data->blob); + data->blob = (gchar *) new_blob; + data->blob_size = new_blob_size; + } + } + + write_message_async (worker, + data, + write_message_cb, + data); + } +} + +/* called in private thread shared by all GDBusConnection instances + * + * write-lock is not held on entry + * output_pending may be anything + */ +static gboolean +continue_writing_in_idle_cb (gpointer user_data) +{ + GDBusWorker *worker = user_data; + + /* Because this is the worker thread, we can read this struct member + * without holding the lock: no other thread ever modifies it. + */ + if (worker->output_pending == PENDING_NONE) + continue_writing (worker); + + return FALSE; +} + +/* + * @write_data: (transfer full) (allow-none): + * @flush_data: (transfer full) (allow-none): + * @close_data: (transfer full) (allow-none): + * + * Can be called from any thread + * + * write_lock is held on entry + * output_pending may be anything + */ +static void +schedule_writing_unlocked (GDBusWorker *worker, + MessageToWriteData *write_data, + FlushData *flush_data, + CloseData *close_data) +{ + if (write_data != NULL) + g_queue_push_tail (worker->write_queue, write_data); + + if (flush_data != NULL) + worker->write_pending_flushes = g_list_prepend (worker->write_pending_flushes, flush_data); + + if (close_data != NULL) + worker->pending_close_attempts = g_list_prepend (worker->pending_close_attempts, + close_data); + + /* If we had output pending, the next bit of output will happen + * automatically when it finishes, so we only need to do this + * if nothing was pending. + * + * The idle callback will re-check that output_pending is still + * PENDING_NONE, to guard against output starting before the idle. + */ + if (worker->output_pending == PENDING_NONE) + { + GSource *idle_source; + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + continue_writing_in_idle_cb, + _g_dbus_worker_ref (worker), + (GDestroyNotify) _g_dbus_worker_unref); + g_source_attach (idle_source, worker->shared_thread_data->context); + g_source_unref (idle_source); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* can be called from any thread - steals blob + * + * write_lock is not held on entry + * output_pending may be anything + */ +void +_g_dbus_worker_send_message (GDBusWorker *worker, + GDBusMessage *message, + gchar *blob, + gsize blob_len) +{ + MessageToWriteData *data; + + g_return_if_fail (G_IS_DBUS_MESSAGE (message)); + g_return_if_fail (blob != NULL); + g_return_if_fail (blob_len > 16); + + data = g_new0 (MessageToWriteData, 1); + data->worker = _g_dbus_worker_ref (worker); + data->message = g_object_ref (message); + data->blob = blob; /* steal! */ + data->blob_size = blob_len; + + g_mutex_lock (&worker->write_lock); + schedule_writing_unlocked (worker, data, NULL, NULL); + g_mutex_unlock (&worker->write_lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GDBusWorker * +_g_dbus_worker_new (GIOStream *stream, + GDBusCapabilityFlags capabilities, + gboolean initially_frozen, + GDBusWorkerMessageReceivedCallback message_received_callback, + GDBusWorkerMessageAboutToBeSentCallback message_about_to_be_sent_callback, + GDBusWorkerDisconnectedCallback disconnected_callback, + gpointer user_data) +{ + GDBusWorker *worker; + GSource *idle_source; + + g_return_val_if_fail (G_IS_IO_STREAM (stream), NULL); + g_return_val_if_fail (message_received_callback != NULL, NULL); + g_return_val_if_fail (message_about_to_be_sent_callback != NULL, NULL); + g_return_val_if_fail (disconnected_callback != NULL, NULL); + + worker = g_new0 (GDBusWorker, 1); + worker->ref_count = 1; + + g_mutex_init (&worker->read_lock); + worker->message_received_callback = message_received_callback; + worker->message_about_to_be_sent_callback = message_about_to_be_sent_callback; + worker->disconnected_callback = disconnected_callback; + worker->user_data = user_data; + worker->stream = g_object_ref (stream); + worker->capabilities = capabilities; + worker->cancellable = g_cancellable_new (); + worker->output_pending = PENDING_NONE; + + worker->frozen = initially_frozen; + worker->received_messages_while_frozen = g_queue_new (); + + g_mutex_init (&worker->write_lock); + worker->write_queue = g_queue_new (); + + if (G_IS_SOCKET_CONNECTION (worker->stream)) + worker->socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (worker->stream)); + + worker->shared_thread_data = _g_dbus_shared_thread_ref (); + + /* begin reading */ + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + _g_dbus_worker_do_initial_read, + _g_dbus_worker_ref (worker), + (GDestroyNotify) _g_dbus_worker_unref); + g_source_attach (idle_source, worker->shared_thread_data->context); + g_source_unref (idle_source); + + return worker; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* can be called from any thread + * + * write_lock is not held on entry + * output_pending may be anything + */ +void +_g_dbus_worker_close (GDBusWorker *worker, + GCancellable *cancellable, + GSimpleAsyncResult *result) +{ + CloseData *close_data; + + close_data = g_slice_new0 (CloseData); + close_data->worker = _g_dbus_worker_ref (worker); + close_data->cancellable = + (cancellable == NULL ? NULL : g_object_ref (cancellable)); + close_data->result = (result == NULL ? NULL : g_object_ref (result)); + + /* Don't set worker->close_expected here - we're in the wrong thread. + * It'll be set before the actual close happens. + */ + g_cancellable_cancel (worker->cancellable); + g_mutex_lock (&worker->write_lock); + schedule_writing_unlocked (worker, NULL, NULL, close_data); + g_mutex_unlock (&worker->write_lock); +} + +/* This can be called from any thread - frees worker. Note that + * callbacks might still happen if called from another thread than the + * worker - use your own synchronization primitive in the callbacks. + * + * write_lock is not held on entry + * output_pending may be anything + */ +void +_g_dbus_worker_stop (GDBusWorker *worker) +{ + g_atomic_int_set (&worker->stopped, TRUE); + + /* Cancel any pending operations and schedule a close of the underlying I/O + * stream in the worker thread + */ + _g_dbus_worker_close (worker, NULL, NULL); + + /* _g_dbus_worker_close holds a ref until after an idle in the worker + * thread has run, so we no longer need to unref in an idle like in + * commit 322e25b535 + */ + _g_dbus_worker_unref (worker); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* can be called from any thread (except the worker thread) - blocks + * calling thread until all queued outgoing messages are written and + * the transport has been flushed + * + * write_lock is not held on entry + * output_pending may be anything + */ +gboolean +_g_dbus_worker_flush_sync (GDBusWorker *worker, + GCancellable *cancellable, + GError **error) +{ + gboolean ret; + FlushData *data; + guint64 pending_writes; + + data = NULL; + ret = TRUE; + + g_mutex_lock (&worker->write_lock); + + /* if the queue is empty, no write is in-flight and we haven't written + * anything since the last flush, then there's nothing to wait for + */ + pending_writes = g_queue_get_length (worker->write_queue); + + /* if a write is in-flight, we shouldn't be satisfied until the first + * flush operation that follows it + */ + if (worker->output_pending == PENDING_WRITE) + pending_writes += 1; + + if (pending_writes > 0 || + worker->write_num_messages_written != worker->write_num_messages_flushed) + { + data = g_new0 (FlushData, 1); + g_mutex_init (&data->mutex); + g_cond_init (&data->cond); + data->number_to_wait_for = worker->write_num_messages_written + pending_writes; + g_mutex_lock (&data->mutex); + + schedule_writing_unlocked (worker, NULL, data, NULL); + } + g_mutex_unlock (&worker->write_lock); + + if (data != NULL) + { + g_cond_wait (&data->cond, &data->mutex); + g_mutex_unlock (&data->mutex); + + /* note:the element is removed from worker->write_pending_flushes in flush_cb() above */ + g_cond_clear (&data->cond); + g_mutex_clear (&data->mutex); + if (data->error != NULL) + { + ret = FALSE; + g_propagate_error (error, data->error); + } + g_free (data); + } + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#define G_DBUS_DEBUG_AUTHENTICATION (1<<0) +#define G_DBUS_DEBUG_TRANSPORT (1<<1) +#define G_DBUS_DEBUG_MESSAGE (1<<2) +#define G_DBUS_DEBUG_PAYLOAD (1<<3) +#define G_DBUS_DEBUG_CALL (1<<4) +#define G_DBUS_DEBUG_SIGNAL (1<<5) +#define G_DBUS_DEBUG_INCOMING (1<<6) +#define G_DBUS_DEBUG_RETURN (1<<7) +#define G_DBUS_DEBUG_EMISSION (1<<8) +#define G_DBUS_DEBUG_ADDRESS (1<<9) + +static gint _gdbus_debug_flags = 0; + +gboolean +_g_dbus_debug_authentication (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_AUTHENTICATION) != 0; +} + +gboolean +_g_dbus_debug_transport (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_TRANSPORT) != 0; +} + +gboolean +_g_dbus_debug_message (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_MESSAGE) != 0; +} + +gboolean +_g_dbus_debug_payload (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_PAYLOAD) != 0; +} + +gboolean +_g_dbus_debug_call (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_CALL) != 0; +} + +gboolean +_g_dbus_debug_signal (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_SIGNAL) != 0; +} + +gboolean +_g_dbus_debug_incoming (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_INCOMING) != 0; +} + +gboolean +_g_dbus_debug_return (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_RETURN) != 0; +} + +gboolean +_g_dbus_debug_emission (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_EMISSION) != 0; +} + +gboolean +_g_dbus_debug_address (void) +{ + _g_dbus_initialize (); + return (_gdbus_debug_flags & G_DBUS_DEBUG_ADDRESS) != 0; +} + +G_LOCK_DEFINE_STATIC (print_lock); + +void +_g_dbus_debug_print_lock (void) +{ + G_LOCK (print_lock); +} + +void +_g_dbus_debug_print_unlock (void) +{ + G_UNLOCK (print_lock); +} + +/* + * _g_dbus_initialize: + * + * Does various one-time init things such as + * + * - registering the G_DBUS_ERROR error domain + * - parses the G_DBUS_DEBUG environment variable + */ +void +_g_dbus_initialize (void) +{ + static volatile gsize initialized = 0; + + if (g_once_init_enter (&initialized)) + { + volatile GQuark g_dbus_error_domain; + const gchar *debug; + + g_dbus_error_domain = G_DBUS_ERROR; + (g_dbus_error_domain); /* To avoid -Wunused-but-set-variable */ + + debug = g_getenv ("G_DBUS_DEBUG"); + if (debug != NULL) + { + const GDebugKey keys[] = { + { "authentication", G_DBUS_DEBUG_AUTHENTICATION }, + { "transport", G_DBUS_DEBUG_TRANSPORT }, + { "message", G_DBUS_DEBUG_MESSAGE }, + { "payload", G_DBUS_DEBUG_PAYLOAD }, + { "call", G_DBUS_DEBUG_CALL }, + { "signal", G_DBUS_DEBUG_SIGNAL }, + { "incoming", G_DBUS_DEBUG_INCOMING }, + { "return", G_DBUS_DEBUG_RETURN }, + { "emission", G_DBUS_DEBUG_EMISSION }, + { "address", G_DBUS_DEBUG_ADDRESS } + }; + + _gdbus_debug_flags = g_parse_debug_string (debug, keys, G_N_ELEMENTS (keys)); + if (_gdbus_debug_flags & G_DBUS_DEBUG_PAYLOAD) + _gdbus_debug_flags |= G_DBUS_DEBUG_MESSAGE; + } + + g_once_init_leave (&initialized, 1); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GVariantType * +_g_dbus_compute_complete_signature (GDBusArgInfo **args) +{ + const GVariantType *arg_types[256]; + guint n; + + if (args) + for (n = 0; args[n] != NULL; n++) + { + /* DBus places a hard limit of 255 on signature length. + * therefore number of args must be less than 256. + */ + g_assert (n < 256); + + arg_types[n] = G_VARIANT_TYPE (args[n]->signature); + + if G_UNLIKELY (arg_types[n] == NULL) + return NULL; + } + else + n = 0; + + return g_variant_type_new_tuple (arg_types, n); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_WIN32 + +extern BOOL WINAPI ConvertSidToStringSidA (PSID Sid, LPSTR *StringSid); + +gchar * +_g_dbus_win32_get_user_sid (void) +{ + HANDLE h; + TOKEN_USER *user; + DWORD token_information_len; + PSID psid; + gchar *sid; + gchar *ret; + + ret = NULL; + user = NULL; + h = INVALID_HANDLE_VALUE; + + if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &h)) + { + g_warning ("OpenProcessToken failed with error code %d", (gint) GetLastError ()); + goto out; + } + + /* Get length of buffer */ + token_information_len = 0; + if (!GetTokenInformation (h, TokenUser, NULL, 0, &token_information_len)) + { + if (GetLastError () != ERROR_INSUFFICIENT_BUFFER) + { + g_warning ("GetTokenInformation() failed with error code %d", (gint) GetLastError ()); + goto out; + } + } + user = g_malloc (token_information_len); + if (!GetTokenInformation (h, TokenUser, user, token_information_len, &token_information_len)) + { + g_warning ("GetTokenInformation() failed with error code %d", (gint) GetLastError ()); + goto out; + } + + psid = user->User.Sid; + if (!IsValidSid (psid)) + { + g_warning ("Invalid SID"); + goto out; + } + + if (!ConvertSidToStringSidA (psid, &sid)) + { + g_warning ("Invalid SID"); + goto out; + } + + ret = g_strdup (sid); + LocalFree (sid); + +out: + g_free (user); + if (h != INVALID_HANDLE_VALUE) + CloseHandle (h); + return ret; +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +gchar * +_g_dbus_get_machine_id (GError **error) +{ +#ifdef G_OS_WIN32 + HW_PROFILE_INFOA info; + char *src, *dest, *res; + int i; + + if (!GetCurrentHwProfileA (&info)) + { + char *message = g_win32_error_message (GetLastError ()); + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unable to get Hardware profile: %s"), message); + g_free (message); + return NULL; + } + + /* Form: {12340001-4980-1920-6788-123456789012} */ + src = &info.szHwProfileGuid[0]; + + res = g_malloc (32+1); + dest = res; + + src++; /* Skip { */ + for (i = 0; i < 8; i++) + *dest++ = *src++; + src++; /* Skip - */ + for (i = 0; i < 4; i++) + *dest++ = *src++; + src++; /* Skip - */ + for (i = 0; i < 4; i++) + *dest++ = *src++; + src++; /* Skip - */ + for (i = 0; i < 4; i++) + *dest++ = *src++; + src++; /* Skip - */ + for (i = 0; i < 12; i++) + *dest++ = *src++; + *dest = 0; + + return res; +#else + gchar *ret; + GError *first_error; + /* TODO: use PACKAGE_LOCALSTATEDIR ? */ + ret = NULL; + first_error = NULL; + if (!g_file_get_contents ("/var/lib/dbus/machine-id", + &ret, + NULL, + &first_error) && + !g_file_get_contents ("/etc/machine-id", + &ret, + NULL, + NULL)) + { + g_propagate_prefixed_error (error, first_error, + _("Unable to load /var/lib/dbus/machine-id or /etc/machine-id: ")); + } + else + { + /* ignore the error from the first try, if any */ + g_clear_error (&first_error); + /* TODO: validate value */ + g_strstrip (ret); + } + return ret; +#endif +} + +/* ---------------------------------------------------------------------------------------------------- */ + +gchar * +_g_dbus_enum_to_string (GType enum_type, gint value) +{ + gchar *ret; + GEnumClass *klass; + GEnumValue *enum_value; + + klass = g_type_class_ref (enum_type); + enum_value = g_enum_get_value (klass, value); + if (enum_value != NULL) + ret = g_strdup (enum_value->value_nick); + else + ret = g_strdup_printf ("unknown (value %d)", value); + g_type_class_unref (klass); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +write_message_print_transport_debug (gssize bytes_written, + MessageToWriteData *data) +{ + if (G_LIKELY (!_g_dbus_debug_transport ())) + goto out; + + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Transport:\n" + " >>>> WROTE %" G_GSIZE_FORMAT " bytes of message with serial %d and\n" + " size %" G_GSIZE_FORMAT " from offset %" G_GSIZE_FORMAT " on a %s\n", + bytes_written, + g_dbus_message_get_serial (data->message), + data->blob_size, + data->total_written, + g_type_name (G_TYPE_FROM_INSTANCE (g_io_stream_get_output_stream (data->worker->stream)))); + _g_dbus_debug_print_unlock (); + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +read_message_print_transport_debug (gssize bytes_read, + GDBusWorker *worker) +{ + gsize size; + gint32 serial; + gint32 message_length; + + if (G_LIKELY (!_g_dbus_debug_transport ())) + goto out; + + size = bytes_read + worker->read_buffer_cur_size; + serial = 0; + message_length = 0; + if (size >= 16) + message_length = g_dbus_message_bytes_needed ((guchar *) worker->read_buffer, size, NULL); + if (size >= 1) + { + switch (worker->read_buffer[0]) + { + case 'l': + if (size >= 12) + serial = GUINT32_FROM_LE (((guint32 *) worker->read_buffer)[2]); + break; + case 'B': + if (size >= 12) + serial = GUINT32_FROM_BE (((guint32 *) worker->read_buffer)[2]); + break; + default: + /* an error will be set elsewhere if this happens */ + goto out; + } + } + + _g_dbus_debug_print_lock (); + g_print ("========================================================================\n" + "GDBus-debug:Transport:\n" + " <<<< READ %" G_GSIZE_FORMAT " bytes of message with serial %d and\n" + " size %d to offset %" G_GSIZE_FORMAT " from a %s\n", + bytes_read, + serial, + message_length, + worker->read_buffer_cur_size, + g_type_name (G_TYPE_FROM_INSTANCE (g_io_stream_get_input_stream (worker->stream)))); + _g_dbus_debug_print_unlock (); + out: + ; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +gboolean +_g_signal_accumulator_false_handled (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) +{ + gboolean continue_emission; + gboolean signal_return; + + signal_return = g_value_get_boolean (handler_return); + g_value_set_boolean (return_accu, signal_return); + continue_emission = signal_return; + + return continue_emission; +} diff --git a/gio/gdbusprivate.h b/gio/gdbusprivate.h new file mode 100644 index 0000000..3a62867 --- /dev/null +++ b/gio/gdbusprivate.h @@ -0,0 +1,151 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_PRIVATE_H__ +#define __G_DBUS_PRIVATE_H__ + +#if !defined (GIO_COMPILATION) +#error "gdbusprivate.h is a private header file." +#endif + +#include + +G_BEGIN_DECLS + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct GDBusWorker GDBusWorker; + +typedef void (*GDBusWorkerMessageReceivedCallback) (GDBusWorker *worker, + GDBusMessage *message, + gpointer user_data); + +typedef GDBusMessage *(*GDBusWorkerMessageAboutToBeSentCallback) (GDBusWorker *worker, + GDBusMessage *message, + gpointer user_data); + +typedef void (*GDBusWorkerDisconnectedCallback) (GDBusWorker *worker, + gboolean remote_peer_vanished, + GError *error, + gpointer user_data); + +/* This function may be called from any thread - callbacks will be in the shared private message thread + * and must not block. + */ +GDBusWorker *_g_dbus_worker_new (GIOStream *stream, + GDBusCapabilityFlags capabilities, + gboolean initially_frozen, + GDBusWorkerMessageReceivedCallback message_received_callback, + GDBusWorkerMessageAboutToBeSentCallback message_about_to_be_sent_callback, + GDBusWorkerDisconnectedCallback disconnected_callback, + gpointer user_data); + +/* can be called from any thread - steals blob */ +void _g_dbus_worker_send_message (GDBusWorker *worker, + GDBusMessage *message, + gchar *blob, + gsize blob_len); + +/* can be called from any thread */ +void _g_dbus_worker_stop (GDBusWorker *worker); + +/* can be called from any thread */ +void _g_dbus_worker_unfreeze (GDBusWorker *worker); + +/* can be called from any thread (except the worker thread) */ +gboolean _g_dbus_worker_flush_sync (GDBusWorker *worker, + GCancellable *cancellable, + GError **error); + +/* can be called from any thread */ +void _g_dbus_worker_close (GDBusWorker *worker, + GCancellable *cancellable, + GSimpleAsyncResult *result); + +/* ---------------------------------------------------------------------------------------------------- */ + +void _g_dbus_initialize (void); +gboolean _g_dbus_debug_authentication (void); +gboolean _g_dbus_debug_transport (void); +gboolean _g_dbus_debug_message (void); +gboolean _g_dbus_debug_payload (void); +gboolean _g_dbus_debug_call (void); +gboolean _g_dbus_debug_signal (void); +gboolean _g_dbus_debug_incoming (void); +gboolean _g_dbus_debug_return (void); +gboolean _g_dbus_debug_emission (void); +gboolean _g_dbus_debug_address (void); + +void _g_dbus_debug_print_lock (void); +void _g_dbus_debug_print_unlock (void); + +gboolean _g_dbus_address_parse_entry (const gchar *address_entry, + gchar **out_transport_name, + GHashTable **out_key_value_pairs, + GError **error); + +GVariantType * _g_dbus_compute_complete_signature (GDBusArgInfo **args); + +gchar *_g_dbus_hexdump (const gchar *data, gsize len, guint indent); + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_WIN32 +gchar *_g_dbus_win32_get_user_sid (void); +#endif + +gchar *_g_dbus_get_machine_id (GError **error); + +gchar *_g_dbus_enum_to_string (GType enum_type, gint value); + +/* ---------------------------------------------------------------------------------------------------- */ + +GDBusMethodInvocation *_g_dbus_method_invocation_new (const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + const GDBusMethodInfo *method_info, + GDBusConnection *connection, + GDBusMessage *message, + GVariant *parameters, + gpointer user_data); + +/* ---------------------------------------------------------------------------------------------------- */ + +gboolean _g_signal_accumulator_false_handled (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + +gboolean _g_dbus_object_skeleton_has_authorize_method_handlers (GDBusObjectSkeleton *object); + +void _g_dbus_object_proxy_add_interface (GDBusObjectProxy *proxy, + GDBusProxy *interface_proxy); +void _g_dbus_object_proxy_remove_interface (GDBusObjectProxy *proxy, + const gchar *interface_name); + +/* Implemented in gdbusconnection.c */ +GDBusConnection *_g_bus_get_singleton_if_exists (GBusType bus_type); + +G_END_DECLS + +#endif /* __G_DBUS_PRIVATE_H__ */ diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c new file mode 100644 index 0000000..799c793 --- /dev/null +++ b/gio/gdbusproxy.c @@ -0,0 +1,3257 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include "gdbusutils.h" +#include "gdbusproxy.h" +#include "gioenumtypes.h" +#include "gdbusconnection.h" +#include "gdbuserror.h" +#include "gdbusprivate.h" +#include "ginitable.h" +#include "gasyncinitable.h" +#include "gioerror.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "gcancellable.h" +#include "gdbusinterface.h" + +#ifdef G_OS_UNIX +#include "gunixfdlist.h" +#endif + +#include "glibintl.h" + +/** + * SECTION:gdbusproxy + * @short_description: Client-side D-Bus interface proxy + * @include: gio/gio.h + * + * #GDBusProxy is a base class used for proxies to access a D-Bus + * interface on a remote object. A #GDBusProxy can be constructed for + * both well-known and unique names. + * + * By default, #GDBusProxy will cache all properties (and listen to + * changes) of the remote object, and proxy all signals that gets + * emitted. This behaviour can be changed by passing suitable + * #GDBusProxyFlags when the proxy is created. If the proxy is for a + * well-known name, the property cache is flushed when the name owner + * vanishes and reloaded when a name owner appears. + * + * If a #GDBusProxy is used for a well-known name, the owner of the + * name is tracked and can be read from + * #GDBusProxy:g-name-owner. Connect to the #GObject::notify signal to + * get notified of changes. Additionally, only signals and property + * changes emitted from the current name owner are considered and + * calls are always sent to the current name owner. This avoids a + * number of race conditions when the name is lost by one owner and + * claimed by another. However, if no name owner currently exists, + * then calls will be sent to the well-known name which may result in + * the message bus launching an owner (unless + * %G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START is set). + * + * The generic #GDBusProxy::g-properties-changed and + * #GDBusProxy::g-signal signals are not very convenient to work + * with. Therefore, the recommended way of working with proxies is to + * subclass #GDBusProxy, and have more natural properties and signals + * in your derived class. See + * for how this can easily be done using the + * gdbus-codegen + * tool. + * + * A #GDBusProxy instance can be used from multiple threads but note + * that all signals (e.g. #GDBusProxy::g-signal, #GDBusProxy::g-properties-changed + * and #GObject::notify) are emitted in the + * thread-default main loop + * of the thread where the instance was constructed. + * + * GDBusProxy for a well-known-nameFIXME: MISSING XINCLUDE CONTENT + */ + +/* lock protecting the mutable properties: name_owner, timeout_msec, + * expected_interface, and the properties hash table + */ +G_LOCK_DEFINE_STATIC (properties_lock); + +/* ---------------------------------------------------------------------------------------------------- */ + +G_LOCK_DEFINE_STATIC (signal_subscription_lock); + +typedef struct +{ + volatile gint ref_count; + GDBusProxy *proxy; +} SignalSubscriptionData; + +static SignalSubscriptionData * +signal_subscription_ref (SignalSubscriptionData *data) +{ + g_atomic_int_inc (&data->ref_count); + return data; +} + +static void +signal_subscription_unref (SignalSubscriptionData *data) +{ + if (g_atomic_int_dec_and_test (&data->ref_count)) + { + g_slice_free (SignalSubscriptionData, data); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +struct _GDBusProxyPrivate +{ + GBusType bus_type; + GDBusProxyFlags flags; + GDBusConnection *connection; + + gchar *name; + /* mutable, protected by properties_lock */ + gchar *name_owner; + gchar *object_path; + gchar *interface_name; + /* mutable, protected by properties_lock */ + gint timeout_msec; + + guint name_owner_changed_subscription_id; + + GCancellable *get_all_cancellable; + + /* gchar* -> GVariant*, protected by properties_lock */ + GHashTable *properties; + + /* mutable, protected by properties_lock */ + GDBusInterfaceInfo *expected_interface; + + guint properties_changed_subscription_id; + guint signals_subscription_id; + + gboolean initialized; + + /* mutable, protected by properties_lock */ + GDBusObject *object; + + SignalSubscriptionData *signal_subscription_data; +}; + +enum +{ + PROP_0, + PROP_G_CONNECTION, + PROP_G_BUS_TYPE, + PROP_G_NAME, + PROP_G_NAME_OWNER, + PROP_G_FLAGS, + PROP_G_OBJECT_PATH, + PROP_G_INTERFACE_NAME, + PROP_G_DEFAULT_TIMEOUT, + PROP_G_INTERFACE_INFO +}; + +enum +{ + PROPERTIES_CHANGED_SIGNAL, + SIGNAL_SIGNAL, + LAST_SIGNAL, +}; + +static guint signals[LAST_SIGNAL] = {0}; + +static void dbus_interface_iface_init (GDBusInterfaceIface *dbus_interface_iface); +static void initable_iface_init (GInitableIface *initable_iface); +static void async_initable_iface_init (GAsyncInitableIface *async_initable_iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusProxy, g_dbus_proxy, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_INTERFACE, dbus_interface_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, async_initable_iface_init) + ); + +static void +g_dbus_proxy_dispose (GObject *object) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + G_LOCK (signal_subscription_lock); + if (proxy->priv->signal_subscription_data != NULL) + { + proxy->priv->signal_subscription_data->proxy = NULL; + signal_subscription_unref (proxy->priv->signal_subscription_data); + proxy->priv->signal_subscription_data = NULL; + } + G_UNLOCK (signal_subscription_lock); + + G_OBJECT_CLASS (g_dbus_proxy_parent_class)->dispose (object); +} + +static void +g_dbus_proxy_finalize (GObject *object) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + + g_warn_if_fail (proxy->priv->get_all_cancellable == NULL); + + if (proxy->priv->name_owner_changed_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (proxy->priv->connection, + proxy->priv->name_owner_changed_subscription_id); + + if (proxy->priv->properties_changed_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (proxy->priv->connection, + proxy->priv->properties_changed_subscription_id); + + if (proxy->priv->signals_subscription_id > 0) + g_dbus_connection_signal_unsubscribe (proxy->priv->connection, + proxy->priv->signals_subscription_id); + + if (proxy->priv->connection != NULL) + g_object_unref (proxy->priv->connection); + g_free (proxy->priv->name); + g_free (proxy->priv->name_owner); + g_free (proxy->priv->object_path); + g_free (proxy->priv->interface_name); + if (proxy->priv->properties != NULL) + g_hash_table_unref (proxy->priv->properties); + + if (proxy->priv->expected_interface != NULL) + { + g_dbus_interface_info_cache_release (proxy->priv->expected_interface); + g_dbus_interface_info_unref (proxy->priv->expected_interface); + } + + if (proxy->priv->object != NULL) + g_object_remove_weak_pointer (G_OBJECT (proxy->priv->object), (gpointer *) &proxy->priv->object); + + G_OBJECT_CLASS (g_dbus_proxy_parent_class)->finalize (object); +} + +static void +g_dbus_proxy_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + + switch (prop_id) + { + case PROP_G_CONNECTION: + g_value_set_object (value, proxy->priv->connection); + break; + + case PROP_G_FLAGS: + g_value_set_flags (value, proxy->priv->flags); + break; + + case PROP_G_NAME: + g_value_set_string (value, proxy->priv->name); + break; + + case PROP_G_NAME_OWNER: + g_value_take_string (value, g_dbus_proxy_get_name_owner (proxy)); + break; + + case PROP_G_OBJECT_PATH: + g_value_set_string (value, proxy->priv->object_path); + break; + + case PROP_G_INTERFACE_NAME: + g_value_set_string (value, proxy->priv->interface_name); + break; + + case PROP_G_DEFAULT_TIMEOUT: + g_value_set_int (value, g_dbus_proxy_get_default_timeout (proxy)); + break; + + case PROP_G_INTERFACE_INFO: + g_value_set_boxed (value, g_dbus_proxy_get_interface_info (proxy)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_proxy_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + + switch (prop_id) + { + case PROP_G_CONNECTION: + proxy->priv->connection = g_value_dup_object (value); + break; + + case PROP_G_FLAGS: + proxy->priv->flags = g_value_get_flags (value); + break; + + case PROP_G_NAME: + proxy->priv->name = g_value_dup_string (value); + break; + + case PROP_G_OBJECT_PATH: + proxy->priv->object_path = g_value_dup_string (value); + break; + + case PROP_G_INTERFACE_NAME: + proxy->priv->interface_name = g_value_dup_string (value); + break; + + case PROP_G_DEFAULT_TIMEOUT: + g_dbus_proxy_set_default_timeout (proxy, g_value_get_int (value)); + break; + + case PROP_G_INTERFACE_INFO: + g_dbus_proxy_set_interface_info (proxy, g_value_get_boxed (value)); + break; + + case PROP_G_BUS_TYPE: + proxy->priv->bus_type = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_proxy_class_init (GDBusProxyClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->dispose = g_dbus_proxy_dispose; + gobject_class->finalize = g_dbus_proxy_finalize; + gobject_class->set_property = g_dbus_proxy_set_property; + gobject_class->get_property = g_dbus_proxy_get_property; + + /* Note that all property names are prefixed to avoid collisions with D-Bus property names + * in derived classes */ + + /** + * GDBusProxy:g-interface-info: + * + * Ensure that interactions with this proxy conform to the given + * interface. This is mainly to ensure that malformed data received + * from the other peer is ignored. The given #GDBusInterfaceInfo is + * said to be the expected interface. + * + * The checks performed are: + * + * + * When completing a method call, if the type signature of + * the reply message isn't what's expected, the reply is + * discarded and the #GError is set to %G_IO_ERROR_INVALID_ARGUMENT. + * + * + * Received signals that have a type signature mismatch are dropped and + * a warning is logged via g_warning(). + * + * + * Properties received via the initial GetAll() call + * or via the ::PropertiesChanged signal (on the + * org.freedesktop.DBus.Properties interface) or + * set using g_dbus_proxy_set_cached_property() with a type signature + * mismatch are ignored and a warning is logged via g_warning(). + * + * + * Note that these checks are never done on methods, signals and + * properties that are not referenced in the given + * #GDBusInterfaceInfo, since extending a D-Bus interface on the + * service-side is not considered an ABI break. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_INTERFACE_INFO, + g_param_spec_boxed ("g-interface-info", + P_("Interface Information"), + P_("Interface Information"), + G_TYPE_DBUS_INTERFACE_INFO, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-connection: + * + * The #GDBusConnection the proxy is for. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_CONNECTION, + g_param_spec_object ("g-connection", + P_("g-connection"), + P_("The connection the proxy is for"), + G_TYPE_DBUS_CONNECTION, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-bus-type: + * + * If this property is not %G_BUS_TYPE_NONE, then + * #GDBusProxy:g-connection must be %NULL and will be set to the + * #GDBusConnection obtained by calling g_bus_get() with the value + * of this property. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_BUS_TYPE, + g_param_spec_enum ("g-bus-type", + P_("Bus Type"), + P_("The bus to connect to, if any"), + G_TYPE_BUS_TYPE, + G_BUS_TYPE_NONE, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-flags: + * + * Flags from the #GDBusProxyFlags enumeration. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_FLAGS, + g_param_spec_flags ("g-flags", + P_("g-flags"), + P_("Flags for the proxy"), + G_TYPE_DBUS_PROXY_FLAGS, + G_DBUS_PROXY_FLAGS_NONE, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-name: + * + * The well-known or unique name that the proxy is for. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_NAME, + g_param_spec_string ("g-name", + P_("g-name"), + P_("The well-known or unique name that the proxy is for"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-name-owner: + * + * The unique name that owns #GDBusProxy:g-name or %NULL if no-one + * currently owns that name. You may connect to #GObject::notify signal to + * track changes to this property. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_NAME_OWNER, + g_param_spec_string ("g-name-owner", + P_("g-name-owner"), + P_("The unique name for the owner"), + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-object-path: + * + * The object path the proxy is for. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_OBJECT_PATH, + g_param_spec_string ("g-object-path", + P_("g-object-path"), + P_("The object path the proxy is for"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-interface-name: + * + * The D-Bus interface name the proxy is for. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_INTERFACE_NAME, + g_param_spec_string ("g-interface-name", + P_("g-interface-name"), + P_("The D-Bus interface name the proxy is for"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy:g-default-timeout: + * + * The timeout to use if -1 (specifying default timeout) is passed + * as @timeout_msec in the g_dbus_proxy_call() and + * g_dbus_proxy_call_sync() functions. + * + * This allows applications to set a proxy-wide timeout for all + * remote method invocations on the proxy. If this property is -1, + * the default timeout (typically 25 seconds) is used. If set to + * %G_MAXINT, then no timeout is used. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_G_DEFAULT_TIMEOUT, + g_param_spec_int ("g-default-timeout", + P_("Default Timeout"), + P_("Timeout for remote method invocation"), + -1, + G_MAXINT, + -1, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusProxy::g-properties-changed: + * @proxy: The #GDBusProxy emitting the signal. + * @changed_properties: A #GVariant containing the properties that changed + * @invalidated_properties: A %NULL terminated array of properties that was invalidated + * + * Emitted when one or more D-Bus properties on @proxy changes. The + * local cache has already been updated when this signal fires. Note + * that both @changed_properties and @invalidated_properties are + * guaranteed to never be %NULL (either may be empty though). + * + * If the proxy has the flag + * %G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES set, then + * @invalidated_properties will always be empty. + * + * This signal corresponds to the + * PropertiesChanged D-Bus signal on the + * org.freedesktop.DBus.Properties interface. + * + * Since: 2.26 + */ + signals[PROPERTIES_CHANGED_SIGNAL] = g_signal_new ("g-properties-changed", + G_TYPE_DBUS_PROXY, + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + G_STRUCT_OFFSET (GDBusProxyClass, g_properties_changed), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 2, + G_TYPE_VARIANT, + G_TYPE_STRV | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** + * GDBusProxy::g-signal: + * @proxy: The #GDBusProxy emitting the signal. + * @sender_name: (allow-none): The sender of the signal or %NULL if the connection is not a bus connection. + * @signal_name: The name of the signal. + * @parameters: A #GVariant tuple with parameters for the signal. + * + * Emitted when a signal from the remote object and interface that @proxy is for, has been received. + * + * Since: 2.26 + */ + signals[SIGNAL_SIGNAL] = g_signal_new ("g-signal", + G_TYPE_DBUS_PROXY, + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + G_STRUCT_OFFSET (GDBusProxyClass, g_signal), + NULL, + NULL, + NULL, + G_TYPE_NONE, + 3, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_VARIANT); + + + g_type_class_add_private (klass, sizeof (GDBusProxyPrivate)); +} + +static void +g_dbus_proxy_init (GDBusProxy *proxy) +{ + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, G_TYPE_DBUS_PROXY, GDBusProxyPrivate); + proxy->priv->signal_subscription_data = g_slice_new0 (SignalSubscriptionData); + proxy->priv->signal_subscription_data->ref_count = 1; + proxy->priv->signal_subscription_data->proxy = proxy; + proxy->priv->properties = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_variant_unref); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gint +property_name_sort_func (const gchar **a, + const gchar **b) +{ + return g_strcmp0 (*a, *b); +} + +/** + * g_dbus_proxy_get_cached_property_names: + * @proxy: A #GDBusProxy. + * + * Gets the names of all cached properties on @proxy. + * + * Returns: (transfer full): A %NULL-terminated array of strings or %NULL if + * @proxy has no cached properties. Free the returned array with + * g_strfreev(). + * + * Since: 2.26 + */ +gchar ** +g_dbus_proxy_get_cached_property_names (GDBusProxy *proxy) +{ + gchar **names; + GPtrArray *p; + GHashTableIter iter; + const gchar *key; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + + G_LOCK (properties_lock); + + names = NULL; + if (g_hash_table_size (proxy->priv->properties) == 0) + goto out; + + p = g_ptr_array_new (); + + g_hash_table_iter_init (&iter, proxy->priv->properties); + while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) + g_ptr_array_add (p, g_strdup (key)); + g_ptr_array_sort (p, (GCompareFunc) property_name_sort_func); + g_ptr_array_add (p, NULL); + + names = (gchar **) g_ptr_array_free (p, FALSE); + + out: + G_UNLOCK (properties_lock); + return names; +} + +/* properties_lock must be held for as long as you will keep the + * returned value + */ +static const GDBusPropertyInfo * +lookup_property_info (GDBusProxy *proxy, + const gchar *property_name) +{ + const GDBusPropertyInfo *info = NULL; + + if (proxy->priv->expected_interface == NULL) + goto out; + + info = g_dbus_interface_info_lookup_property (proxy->priv->expected_interface, property_name); + + out: + return info; +} + +/** + * g_dbus_proxy_get_cached_property: + * @proxy: A #GDBusProxy. + * @property_name: Property name. + * + * Looks up the value for a property from the cache. This call does no + * blocking IO. + * + * If @proxy has an expected interface (see + * #GDBusProxy:g-interface-info) and @property_name is referenced by + * it, then @value is checked against the type of the property. + * + * Returns: A reference to the #GVariant instance that holds the value + * for @property_name or %NULL if the value is not in the cache. The + * returned reference must be freed with g_variant_unref(). + * + * Since: 2.26 + */ +GVariant * +g_dbus_proxy_get_cached_property (GDBusProxy *proxy, + const gchar *property_name) +{ + const GDBusPropertyInfo *info; + GVariant *value; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + g_return_val_if_fail (property_name != NULL, NULL); + + G_LOCK (properties_lock); + + value = g_hash_table_lookup (proxy->priv->properties, property_name); + if (value == NULL) + goto out; + + info = lookup_property_info (proxy, property_name); + if (info != NULL) + { + const gchar *type_string = g_variant_get_type_string (value); + if (g_strcmp0 (type_string, info->signature) != 0) + { + g_warning ("Trying to get property %s with type %s but according to the expected " + "interface the type is %s", + property_name, + type_string, + info->signature); + value = NULL; + goto out; + } + } + + g_variant_ref (value); + + out: + G_UNLOCK (properties_lock); + return value; +} + +/** + * g_dbus_proxy_set_cached_property: + * @proxy: A #GDBusProxy + * @property_name: Property name. + * @value: (allow-none): Value for the property or %NULL to remove it from the cache. + * + * If @value is not %NULL, sets the cached value for the property with + * name @property_name to the value in @value. + * + * If @value is %NULL, then the cached value is removed from the + * property cache. + * + * If @proxy has an expected interface (see + * #GDBusProxy:g-interface-info) and @property_name is referenced by + * it, then @value is checked against the type of the property. + * + * If the @value #GVariant is floating, it is consumed. This allows + * convenient 'inline' use of g_variant_new(), e.g. + * |[ + * g_dbus_proxy_set_cached_property (proxy, + * "SomeProperty", + * g_variant_new ("(si)", + * "A String", + * 42)); + * ]| + * + * Normally you will not need to use this method since @proxy is + * tracking changes using the + * org.freedesktop.DBus.Properties.PropertiesChanged + * D-Bus signal. However, for performance reasons an object may decide + * to not use this signal for some properties and instead use a + * proprietary out-of-band mechanism to transmit changes. + * + * As a concrete example, consider an object with a property + * ChatroomParticipants which is an array of + * strings. Instead of transmitting the same (long) array every time + * the property changes, it is more efficient to only transmit the + * delta using e.g. signals ChatroomParticipantJoined(String + * name) and ChatroomParticipantParted(String + * name). + * + * Since: 2.26 + */ +void +g_dbus_proxy_set_cached_property (GDBusProxy *proxy, + const gchar *property_name, + GVariant *value) +{ + const GDBusPropertyInfo *info; + + g_return_if_fail (G_IS_DBUS_PROXY (proxy)); + g_return_if_fail (property_name != NULL); + + G_LOCK (properties_lock); + + if (value != NULL) + { + info = lookup_property_info (proxy, property_name); + if (info != NULL) + { + if (g_strcmp0 (info->signature, g_variant_get_type_string (value)) != 0) + { + g_warning ("Trying to set property %s of type %s but according to the expected " + "interface the type is %s", + property_name, + g_variant_get_type_string (value), + info->signature); + goto out; + } + } + g_hash_table_insert (proxy->priv->properties, + g_strdup (property_name), + g_variant_ref_sink (value)); + } + else + { + g_hash_table_remove (proxy->priv->properties, property_name); + } + + out: + G_UNLOCK (properties_lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_signal_received (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + SignalSubscriptionData *data = user_data; + GDBusProxy *proxy; + + G_LOCK (signal_subscription_lock); + proxy = data->proxy; + if (proxy == NULL) + { + G_UNLOCK (signal_subscription_lock); + return; + } + else + { + g_object_ref (proxy); + G_UNLOCK (signal_subscription_lock); + } + + if (!proxy->priv->initialized) + goto out; + + G_LOCK (properties_lock); + + if (proxy->priv->name_owner != NULL && g_strcmp0 (sender_name, proxy->priv->name_owner) != 0) + { + G_UNLOCK (properties_lock); + goto out; + } + + if (proxy->priv->expected_interface != NULL) + { + const GDBusSignalInfo *info; + info = g_dbus_interface_info_lookup_signal (proxy->priv->expected_interface, signal_name); + if (info != NULL) + { + GVariantType *expected_type; + expected_type = _g_dbus_compute_complete_signature (info->args); + if (!g_variant_type_equal (expected_type, g_variant_get_type (parameters))) + { + gchar *expected_type_string = g_variant_type_dup_string (expected_type); + g_warning ("Dropping signal %s of type %s since the type from the expected interface is %s", + info->name, + g_variant_get_type_string (parameters), + expected_type_string); + g_free (expected_type_string); + g_variant_type_free (expected_type); + G_UNLOCK (properties_lock); + goto out; + } + g_variant_type_free (expected_type); + } + } + + G_UNLOCK (properties_lock); + + g_signal_emit (proxy, + signals[SIGNAL_SIGNAL], + 0, + sender_name, + signal_name, + parameters); + + out: + if (proxy != NULL) + g_object_unref (proxy); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* must hold properties_lock */ +static void +insert_property_checked (GDBusProxy *proxy, + gchar *property_name, + GVariant *value) +{ + if (proxy->priv->expected_interface != NULL) + { + const GDBusPropertyInfo *info; + info = g_dbus_interface_info_lookup_property (proxy->priv->expected_interface, property_name); + /* Only check known properties */ + if (info != NULL) + { + /* Warn about properties with the wrong type */ + if (g_strcmp0 (info->signature, g_variant_get_type_string (value)) != 0) + { + g_warning ("Received property %s with type %s does not match expected type " + "%s in the expected interface", + property_name, + g_variant_get_type_string (value), + info->signature); + goto invalid; + } + } + } + + g_hash_table_insert (proxy->priv->properties, + property_name, /* adopts string */ + value); /* adopts value */ + + return; + + invalid: + g_variant_unref (value); + g_free (property_name); +} + +typedef struct +{ + GDBusProxy *proxy; + gchar *prop_name; +} InvalidatedPropGetData; + +static void +invalidated_property_get_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + InvalidatedPropGetData *data = user_data; + const gchar *invalidated_properties[] = {NULL}; + GVariantBuilder builder; + GVariant *value = NULL; + GVariant *unpacked_value = NULL; + + /* errors are fine, the other end could have disconnected */ + value = g_dbus_connection_call_finish (connection, res, NULL); + if (value == NULL) + { + goto out; + } + + if (!g_variant_is_of_type (value, G_VARIANT_TYPE ("(v)"))) + { + g_warning ("Expected type `(v)' for Get() reply, got `%s'", g_variant_get_type_string (value)); + goto out; + } + + g_variant_get (value, "(v)", &unpacked_value); + + /* synthesize the a{sv} in the PropertiesChanged signal */ + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&builder, "{sv}", data->prop_name, unpacked_value); + + G_LOCK (properties_lock); + insert_property_checked (data->proxy, + data->prop_name, /* adopts string */ + unpacked_value); /* adopts value */ + data->prop_name = NULL; + G_UNLOCK (properties_lock); + + g_signal_emit (data->proxy, + signals[PROPERTIES_CHANGED_SIGNAL], 0, + g_variant_builder_end (&builder), /* consumed */ + invalidated_properties); + + + out: + if (value != NULL) + g_variant_unref (value); + g_object_unref (data->proxy); + g_free (data->prop_name); + g_slice_free (InvalidatedPropGetData, data); +} + +static void +on_properties_changed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + SignalSubscriptionData *data = user_data; + gboolean emit_g_signal = FALSE; + GDBusProxy *proxy; + const gchar *interface_name_for_signal; + GVariant *changed_properties; + gchar **invalidated_properties; + GVariantIter iter; + gchar *key; + GVariant *value; + guint n; + + changed_properties = NULL; + invalidated_properties = NULL; + + G_LOCK (signal_subscription_lock); + proxy = data->proxy; + if (proxy == NULL) + { + G_UNLOCK (signal_subscription_lock); + goto out; + } + else + { + g_object_ref (proxy); + G_UNLOCK (signal_subscription_lock); + } + + if (!proxy->priv->initialized) + goto out; + + G_LOCK (properties_lock); + + if (proxy->priv->name_owner != NULL && g_strcmp0 (sender_name, proxy->priv->name_owner) != 0) + { + G_UNLOCK (properties_lock); + goto out; + } + + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sa{sv}as)"))) + { + g_warning ("Value for PropertiesChanged signal with type `%s' does not match `(sa{sv}as)'", + g_variant_get_type_string (parameters)); + G_UNLOCK (properties_lock); + goto out; + } + + g_variant_get (parameters, + "(&s@a{sv}^a&s)", + &interface_name_for_signal, + &changed_properties, + &invalidated_properties); + + if (g_strcmp0 (interface_name_for_signal, proxy->priv->interface_name) != 0) + { + G_UNLOCK (properties_lock); + goto out; + } + + g_variant_iter_init (&iter, changed_properties); + while (g_variant_iter_next (&iter, "{sv}", &key, &value)) + { + insert_property_checked (proxy, + key, /* adopts string */ + value); /* adopts value */ + emit_g_signal = TRUE; + } + + if (proxy->priv->flags & G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES) + { + if (proxy->priv->name_owner != NULL) + { + for (n = 0; invalidated_properties[n] != NULL; n++) + { + InvalidatedPropGetData *data; + data = g_slice_new0 (InvalidatedPropGetData); + data->proxy = g_object_ref (proxy); + data->prop_name = g_strdup (invalidated_properties[n]); + g_dbus_connection_call (proxy->priv->connection, + proxy->priv->name_owner, + proxy->priv->object_path, + "org.freedesktop.DBus.Properties", + "Get", + g_variant_new ("(ss)", proxy->priv->interface_name, data->prop_name), + G_VARIANT_TYPE ("(v)"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + NULL, /* GCancellable */ + (GAsyncReadyCallback) invalidated_property_get_cb, + data); + } + } + } + else + { + emit_g_signal = TRUE; + for (n = 0; invalidated_properties[n] != NULL; n++) + { + g_hash_table_remove (proxy->priv->properties, invalidated_properties[n]); + } + } + + G_UNLOCK (properties_lock); + + if (emit_g_signal) + { + g_signal_emit (proxy, signals[PROPERTIES_CHANGED_SIGNAL], + 0, + changed_properties, + invalidated_properties); + } + + out: + if (changed_properties != NULL) + g_variant_unref (changed_properties); + g_free (invalidated_properties); + if (proxy != NULL) + g_object_unref (proxy); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +process_get_all_reply (GDBusProxy *proxy, + GVariant *result) +{ + GVariantIter *iter; + gchar *key; + GVariant *value; + guint num_properties; + + if (!g_variant_is_of_type (result, G_VARIANT_TYPE ("(a{sv})"))) + { + g_warning ("Value for GetAll reply with type `%s' does not match `(a{sv})'", + g_variant_get_type_string (result)); + goto out; + } + + G_LOCK (properties_lock); + + g_variant_get (result, "(a{sv})", &iter); + while (g_variant_iter_next (iter, "{sv}", &key, &value)) + { + insert_property_checked (proxy, + key, /* adopts string */ + value); /* adopts value */ + } + g_variant_iter_free (iter); + + num_properties = g_hash_table_size (proxy->priv->properties); + G_UNLOCK (properties_lock); + + /* Synthesize ::g-properties-changed changed */ + if (num_properties > 0) + { + GVariant *changed_properties; + const gchar *invalidated_properties[1] = {NULL}; + + g_variant_get (result, + "(@a{sv})", + &changed_properties); + g_signal_emit (proxy, signals[PROPERTIES_CHANGED_SIGNAL], + 0, + changed_properties, + invalidated_properties); + g_variant_unref (changed_properties); + } + + out: + ; +} + +typedef struct +{ + GDBusProxy *proxy; + GCancellable *cancellable; + gchar *name_owner; +} LoadPropertiesOnNameOwnerChangedData; + +static void +on_name_owner_changed_get_all_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + LoadPropertiesOnNameOwnerChangedData *data = user_data; + GVariant *result; + GError *error; + gboolean cancelled; + + cancelled = FALSE; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + if (result == NULL) + { + if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_CANCELLED) + cancelled = TRUE; + /* We just ignore if GetAll() is failing. Because this might happen + * if the object has no properties at all. Or if the caller is + * not authorized to see the properties. + * + * Either way, apps can know about this by using + * get_cached_property_names() or get_cached_property(). + * + * TODO: handle G_DBUS_DEBUG flag 'proxy' and, if enabled, log the + * fact that GetAll() failed + */ + //g_debug ("error: %d %d %s", error->domain, error->code, error->message); + g_error_free (error); + } + + /* and finally we can notify */ + if (!cancelled) + { + G_LOCK (properties_lock); + g_free (data->proxy->priv->name_owner); + data->proxy->priv->name_owner = data->name_owner; + data->name_owner = NULL; /* to avoid an extra copy, we steal the string */ + g_hash_table_remove_all (data->proxy->priv->properties); + G_UNLOCK (properties_lock); + if (result != NULL) + { + process_get_all_reply (data->proxy, result); + g_variant_unref (result); + } + + g_object_notify (G_OBJECT (data->proxy), "g-name-owner"); + } + + if (data->cancellable == data->proxy->priv->get_all_cancellable) + data->proxy->priv->get_all_cancellable = NULL; + + g_object_unref (data->proxy); + g_object_unref (data->cancellable); + g_free (data->name_owner); + g_free (data); +} + +static void +on_name_owner_changed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + SignalSubscriptionData *data = user_data; + GDBusProxy *proxy; + const gchar *old_owner; + const gchar *new_owner; + + G_LOCK (signal_subscription_lock); + proxy = data->proxy; + if (proxy == NULL) + { + G_UNLOCK (signal_subscription_lock); + goto out; + } + else + { + g_object_ref (proxy); + G_UNLOCK (signal_subscription_lock); + } + + /* if we are already trying to load properties, cancel that */ + if (proxy->priv->get_all_cancellable != NULL) + { + g_cancellable_cancel (proxy->priv->get_all_cancellable); + proxy->priv->get_all_cancellable = NULL; + } + + g_variant_get (parameters, + "(&s&s&s)", + NULL, + &old_owner, + &new_owner); + + if (strlen (new_owner) == 0) + { + G_LOCK (properties_lock); + g_free (proxy->priv->name_owner); + proxy->priv->name_owner = NULL; + + /* Synthesize ::g-properties-changed changed */ + if (!(proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES) && + g_hash_table_size (proxy->priv->properties) > 0) + { + GVariantBuilder builder; + GPtrArray *invalidated_properties; + GHashTableIter iter; + const gchar *key; + + /* Build changed_properties (always empty) and invalidated_properties ... */ + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + + invalidated_properties = g_ptr_array_new_with_free_func (g_free); + g_hash_table_iter_init (&iter, proxy->priv->properties); + while (g_hash_table_iter_next (&iter, (gpointer) &key, NULL)) + g_ptr_array_add (invalidated_properties, g_strdup (key)); + g_ptr_array_add (invalidated_properties, NULL); + + /* ... throw out the properties ... */ + g_hash_table_remove_all (proxy->priv->properties); + + G_UNLOCK (properties_lock); + + /* ... and finally emit the ::g-properties-changed signal */ + g_signal_emit (proxy, signals[PROPERTIES_CHANGED_SIGNAL], + 0, + g_variant_builder_end (&builder) /* consumed */, + (const gchar* const *) invalidated_properties->pdata); + g_ptr_array_unref (invalidated_properties); + } + else + { + G_UNLOCK (properties_lock); + } + g_object_notify (G_OBJECT (proxy), "g-name-owner"); + } + else + { + G_LOCK (properties_lock); + + /* ignore duplicates - this can happen when activating the service */ + if (g_strcmp0 (new_owner, proxy->priv->name_owner) == 0) + { + G_UNLOCK (properties_lock); + goto out; + } + + if (proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES) + { + g_free (proxy->priv->name_owner); + proxy->priv->name_owner = g_strdup (new_owner); + + g_hash_table_remove_all (proxy->priv->properties); + G_UNLOCK (properties_lock); + g_object_notify (G_OBJECT (proxy), "g-name-owner"); + } + else + { + LoadPropertiesOnNameOwnerChangedData *data; + + G_UNLOCK (properties_lock); + + /* start loading properties.. only then emit notify::g-name-owner .. we + * need to be able to cancel this in the event another NameOwnerChanged + * signal suddenly happens + */ + + g_assert (proxy->priv->get_all_cancellable == NULL); + proxy->priv->get_all_cancellable = g_cancellable_new (); + data = g_new0 (LoadPropertiesOnNameOwnerChangedData, 1); + data->proxy = g_object_ref (proxy); + data->cancellable = proxy->priv->get_all_cancellable; + data->name_owner = g_strdup (new_owner); + g_dbus_connection_call (proxy->priv->connection, + data->name_owner, + proxy->priv->object_path, + "org.freedesktop.DBus.Properties", + "GetAll", + g_variant_new ("(s)", proxy->priv->interface_name), + G_VARIANT_TYPE ("(a{sv})"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + proxy->priv->get_all_cancellable, + (GAsyncReadyCallback) on_name_owner_changed_get_all_cb, + data); + } + } + + out: + if (proxy != NULL) + g_object_unref (proxy); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusProxy *proxy; + GCancellable *cancellable; + GSimpleAsyncResult *simple; +} AsyncInitData; + +static void +async_init_data_free (AsyncInitData *data) +{ + g_object_unref (data->proxy); + if (data->cancellable != NULL) + g_object_unref (data->cancellable); + g_object_unref (data->simple); + g_free (data); +} + +static void +async_init_get_all_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + AsyncInitData *data = user_data; + GVariant *result; + GError *error; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + if (result == NULL) + { + /* We just ignore if GetAll() is failing. Because this might happen + * if the object has no properties at all. Or if the caller is + * not authorized to see the properties. + * + * Either way, apps can know about this by using + * get_cached_property_names() or get_cached_property(). + * + * TODO: handle G_DBUS_DEBUG flag 'proxy' and, if enabled, log the + * fact that GetAll() failed + */ + //g_debug ("error: %d %d %s", error->domain, error->code, error->message); + g_error_free (error); + } + else + { + g_simple_async_result_set_op_res_gpointer (data->simple, + result, + (GDestroyNotify) g_variant_unref); + } + + g_simple_async_result_complete_in_idle (data->simple); + async_init_data_free (data); +} + +static void +async_init_data_set_name_owner (AsyncInitData *data, + const gchar *name_owner) +{ + gboolean get_all; + + + if (name_owner != NULL) + { + /* it starts as NULL anyway */ + G_LOCK (properties_lock); + data->proxy->priv->name_owner = g_strdup (name_owner); + G_UNLOCK (properties_lock); + } + + get_all = TRUE; + + if (data->proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES) + { + /* Don't load properties if the API user doesn't want them */ + get_all = FALSE; + } + else if (name_owner == NULL && data->proxy->priv->name != NULL) + { + /* Don't attempt to load properties if the name_owner is NULL (which + * usually means the name isn't owned), unless name is also NULL (which + * means we actually wanted to talk to the directly-connected process - + * either dbus-daemon or a peer - instead of going via dbus-daemon) + */ + get_all = FALSE; + } + + if (get_all) + { + /* load all properties asynchronously */ + g_dbus_connection_call (data->proxy->priv->connection, + name_owner, + data->proxy->priv->object_path, + "org.freedesktop.DBus.Properties", + "GetAll", + g_variant_new ("(s)", data->proxy->priv->interface_name), + G_VARIANT_TYPE ("(a{sv})"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + data->cancellable, + (GAsyncReadyCallback) async_init_get_all_cb, + data); + } + else + { + g_simple_async_result_complete_in_idle (data->simple); + async_init_data_free (data); + } +} + +static void +async_init_get_name_owner_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + AsyncInitData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + if (result == NULL) + { + if (error->domain == G_DBUS_ERROR && + error->code == G_DBUS_ERROR_NAME_HAS_NO_OWNER) + { + g_error_free (error); + async_init_data_set_name_owner (data, NULL); + } + else + { + g_simple_async_result_take_error (data->simple, error); + g_simple_async_result_complete_in_idle (data->simple); + async_init_data_free (data); + } + } + else + { + /* borrowed from result to avoid an extra copy */ + const gchar *name_owner; + + g_variant_get (result, "(&s)", &name_owner); + async_init_data_set_name_owner (data, name_owner); + g_variant_unref (result); + } +} + +static void +async_init_call_get_name_owner (AsyncInitData *data) +{ + g_dbus_connection_call (data->proxy->priv->connection, + "org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface */ + "GetNameOwner", + g_variant_new ("(s)", + data->proxy->priv->name), + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + data->cancellable, + (GAsyncReadyCallback) async_init_get_name_owner_cb, + data); +} + +static void +async_init_start_service_by_name_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + AsyncInitData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + if (result == NULL) + { + /* Errors are not unexpected; the bus will reply e.g. + * + * org.freedesktop.DBus.Error.ServiceUnknown: The name org.gnome.Epiphany2 + * was not provided by any .service files + * + * or (see #677718) + * + * org.freedesktop.systemd1.Masked: Unit polkit.service is masked. + * + * This doesn't mean that the name doesn't have an owner, just + * that it's not provided by a .service file or can't currently + * be started. + * + * In particular, in both cases, it could be that a service + * owner will actually appear later. So instead of erroring out, + * we just proceed to invoke GetNameOwner() if dealing with the + * kind of errors above. + */ + if (error->domain == G_DBUS_ERROR && error->code == G_DBUS_ERROR_SERVICE_UNKNOWN) + { + g_error_free (error); + } + else + { + gchar *remote_error = g_dbus_error_get_remote_error (error); + if (g_strcmp0 (remote_error, "org.freedesktop.systemd1.Masked") == 0) + { + g_error_free (error); + g_free (remote_error); + } + else + { + g_prefix_error (&error, + _("Error calling StartServiceByName for %s: "), + data->proxy->priv->name); + g_free (remote_error); + goto failed; + } + } + } + else + { + guint32 start_service_result; + g_variant_get (result, + "(u)", + &start_service_result); + g_variant_unref (result); + if (start_service_result == 1 || /* DBUS_START_REPLY_SUCCESS */ + start_service_result == 2) /* DBUS_START_REPLY_ALREADY_RUNNING */ + { + /* continue to invoke GetNameOwner() */ + } + else + { + error = g_error_new (G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unexpected reply %d from StartServiceByName(\"%s\") method"), + start_service_result, + data->proxy->priv->name); + goto failed; + } + } + + async_init_call_get_name_owner (data); + return; + + failed: + g_warn_if_fail (error != NULL); + g_simple_async_result_take_error (data->simple, error); + g_simple_async_result_complete_in_idle (data->simple); + async_init_data_free (data); +} + +static void +async_init_call_start_service_by_name (AsyncInitData *data) +{ + g_dbus_connection_call (data->proxy->priv->connection, + "org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface */ + "StartServiceByName", + g_variant_new ("(su)", + data->proxy->priv->name, + 0), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout */ + data->cancellable, + (GAsyncReadyCallback) async_init_start_service_by_name_cb, + data); +} + +static void +async_initable_init_second_async (GAsyncInitable *initable, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY (initable); + AsyncInitData *data; + + data = g_new0 (AsyncInitData, 1); + data->proxy = g_object_ref (proxy); + data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL; + data->simple = g_simple_async_result_new (G_OBJECT (proxy), + callback, + user_data, + NULL); + g_simple_async_result_set_check_cancellable (data->simple, cancellable); + + /* Check name ownership asynchronously - possibly also start the service */ + if (proxy->priv->name == NULL) + { + /* Do nothing */ + async_init_data_set_name_owner (data, NULL); + } + else if (g_dbus_is_unique_name (proxy->priv->name)) + { + async_init_data_set_name_owner (data, proxy->priv->name); + } + else + { + if (proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START) + { + async_init_call_get_name_owner (data); + } + else + { + async_init_call_start_service_by_name (data); + } + } +} + +static gboolean +async_initable_init_second_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + GDBusProxy *proxy = G_DBUS_PROXY (initable); + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GVariant *result; + gboolean ret; + + ret = FALSE; + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + result = g_simple_async_result_get_op_res_gpointer (simple); + if (result != NULL) + { + process_get_all_reply (proxy, result); + } + + ret = TRUE; + + out: + proxy->priv->initialized = TRUE; + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +async_initable_init_first (GAsyncInitable *initable) +{ + GDBusProxy *proxy = G_DBUS_PROXY (initable); + + if (!(proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES)) + { + /* subscribe to PropertiesChanged() */ + proxy->priv->properties_changed_subscription_id = + g_dbus_connection_signal_subscribe (proxy->priv->connection, + proxy->priv->name, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + proxy->priv->object_path, + proxy->priv->interface_name, + G_DBUS_SIGNAL_FLAGS_NONE, + on_properties_changed, + signal_subscription_ref (proxy->priv->signal_subscription_data), + (GDestroyNotify) signal_subscription_unref); + } + + if (!(proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS)) + { + /* subscribe to all signals for the object */ + proxy->priv->signals_subscription_id = + g_dbus_connection_signal_subscribe (proxy->priv->connection, + proxy->priv->name, + proxy->priv->interface_name, + NULL, /* member */ + proxy->priv->object_path, + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + on_signal_received, + signal_subscription_ref (proxy->priv->signal_subscription_data), + (GDestroyNotify) signal_subscription_unref); + } + + if (proxy->priv->name != NULL && !g_dbus_is_unique_name (proxy->priv->name)) + { + proxy->priv->name_owner_changed_subscription_id = + g_dbus_connection_signal_subscribe (proxy->priv->connection, + "org.freedesktop.DBus", /* name */ + "org.freedesktop.DBus", /* interface */ + "NameOwnerChanged", /* signal name */ + "/org/freedesktop/DBus", /* path */ + proxy->priv->name, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + on_name_owner_changed, + signal_subscription_ref (proxy->priv->signal_subscription_data), + (GDestroyNotify) signal_subscription_unref); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* initialization is split into two parts - the first is the + * non-blocing part that requires the callers GMainContext - the + * second is a blocking part async part that doesn't require the + * callers GMainContext.. we do this split so the code can be reused + * in the GInitable implementation below. + * + * Note that obtaining a GDBusConnection is not shared between the two + * paths. + */ + +typedef struct +{ + GDBusProxy *proxy; + gint io_priority; + GCancellable *cancellable; + GAsyncReadyCallback callback; + gpointer user_data; +} GetConnectionData; + +static void +get_connection_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GetConnectionData *data = user_data; + GError *error; + + error = NULL; + data->proxy->priv->connection = g_bus_get_finish (res, &error); + if (data->proxy->priv->connection == NULL) + { + GSimpleAsyncResult *simple; + simple = g_simple_async_result_new (G_OBJECT (data->proxy), + data->callback, + data->user_data, + NULL); + g_simple_async_result_set_check_cancellable (simple, data->cancellable); + g_simple_async_result_take_error (simple, error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + } + else + { + async_initable_init_first (G_ASYNC_INITABLE (data->proxy)); + async_initable_init_second_async (G_ASYNC_INITABLE (data->proxy), + data->io_priority, + data->cancellable, + data->callback, + data->user_data); + } + + if (data->cancellable != NULL) + g_object_unref (data->cancellable); + + g_object_unref (data->proxy); + g_free (data); +} + +static void +async_initable_init_async (GAsyncInitable *initable, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY (initable); + + if (proxy->priv->bus_type != G_BUS_TYPE_NONE) + { + GetConnectionData *data; + + g_assert (proxy->priv->connection == NULL); + + data = g_new0 (GetConnectionData, 1); + data->proxy = g_object_ref (proxy); + data->io_priority = io_priority; + data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL; + data->callback = callback; + data->user_data = user_data; + g_bus_get (proxy->priv->bus_type, + cancellable, + get_connection_cb, + data); + } + else + { + async_initable_init_first (initable); + async_initable_init_second_async (initable, io_priority, cancellable, callback, user_data); + } +} + +static gboolean +async_initable_init_finish (GAsyncInitable *initable, + GAsyncResult *res, + GError **error) +{ + return async_initable_init_second_finish (initable, res, error); +} + +static void +async_initable_iface_init (GAsyncInitableIface *async_initable_iface) +{ + async_initable_iface->init_async = async_initable_init_async; + async_initable_iface->init_finish = async_initable_init_finish; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMainContext *context; + GMainLoop *loop; + GAsyncResult *res; +} InitableAsyncInitableData; + +static void +async_initable_init_async_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + InitableAsyncInitableData *data = user_data; + data->res = g_object_ref (res); + g_main_loop_quit (data->loop); +} + +/* Simply reuse the GAsyncInitable implementation but run the first + * part (that is non-blocking and requires the callers GMainContext) + * with the callers GMainContext.. and the second with a private + * GMainContext (bug 621310 is slightly related). + * + * Note that obtaining a GDBusConnection is not shared between the two + * paths. + */ +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GDBusProxy *proxy = G_DBUS_PROXY (initable); + InitableAsyncInitableData *data; + gboolean ret; + + ret = FALSE; + + if (proxy->priv->bus_type != G_BUS_TYPE_NONE) + { + g_assert (proxy->priv->connection == NULL); + proxy->priv->connection = g_bus_get_sync (proxy->priv->bus_type, + cancellable, + error); + if (proxy->priv->connection == NULL) + goto out; + } + + async_initable_init_first (G_ASYNC_INITABLE (initable)); + + data = g_new0 (InitableAsyncInitableData, 1); + data->context = g_main_context_new (); + data->loop = g_main_loop_new (data->context, FALSE); + + g_main_context_push_thread_default (data->context); + + async_initable_init_second_async (G_ASYNC_INITABLE (initable), + G_PRIORITY_DEFAULT, + cancellable, + async_initable_init_async_cb, + data); + + g_main_loop_run (data->loop); + + ret = async_initable_init_second_finish (G_ASYNC_INITABLE (initable), + data->res, + error); + + g_main_context_pop_thread_default (data->context); + + g_main_context_unref (data->context); + g_main_loop_unref (data->loop); + g_object_unref (data->res); + g_free (data); + + out: + + return ret; +} + +static void +initable_iface_init (GInitableIface *initable_iface) +{ + initable_iface->init = initable_init; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_proxy_new: + * @connection: A #GDBusConnection. + * @flags: Flags used when constructing the proxy. + * @info: (allow-none): A #GDBusInterfaceInfo specifying the minimal interface that @proxy conforms to or %NULL. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @interface_name: A D-Bus interface name. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: Callback function to invoke when the proxy is ready. + * @user_data: User data to pass to @callback. + * + * Creates a proxy for accessing @interface_name on the remote object + * at @object_path owned by @name at @connection and asynchronously + * loads D-Bus properties unless the + * %G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES flag is used. Connect to + * the #GDBusProxy::g-properties-changed signal to get notified about + * property changes. + * + * If the %G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS flag is not set, also sets up + * match rules for signals. Connect to the #GDBusProxy::g-signal signal + * to handle signals from the remote object. + * + * If @name is a well-known name and the + * %G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag isn't set and no name + * owner currently exists, the message bus will be requested to launch + * a name owner for the name. + * + * This is a failable asynchronous constructor - when the proxy is + * ready, @callback will be invoked and you can use + * g_dbus_proxy_new_finish() to get the result. + * + * See g_dbus_proxy_new_sync() and for a synchronous version of this constructor. + * + * See for an example of how #GDBusProxy can be used. + * + * Since: 2.26 + */ +void +g_dbus_proxy_new (GDBusConnection *connection, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_DBUS_CONNECTION (connection)); + g_return_if_fail ((name == NULL && g_dbus_connection_get_unique_name (connection) == NULL) || g_dbus_is_name (name)); + g_return_if_fail (g_variant_is_object_path (object_path)); + g_return_if_fail (g_dbus_is_interface_name (interface_name)); + + g_async_initable_new_async (G_TYPE_DBUS_PROXY, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "g-flags", flags, + "g-interface-info", info, + "g-name", name, + "g-connection", connection, + "g-object-path", object_path, + "g-interface-name", interface_name, + NULL); +} + +/** + * g_dbus_proxy_new_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback function passed to g_dbus_proxy_new(). + * @error: Return location for error or %NULL. + * + * Finishes creating a #GDBusProxy. + * + * Returns: A #GDBusProxy or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusProxy * +g_dbus_proxy_new_finish (GAsyncResult *res, + GError **error) +{ + GObject *object; + GObject *source_object; + + source_object = g_async_result_get_source_object (res); + g_assert (source_object != NULL); + + object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), + res, + error); + g_object_unref (source_object); + + if (object != NULL) + return G_DBUS_PROXY (object); + else + return NULL; +} + +/** + * g_dbus_proxy_new_sync: + * @connection: A #GDBusConnection. + * @flags: Flags used when constructing the proxy. + * @info: (allow-none): A #GDBusInterfaceInfo specifying the minimal interface that @proxy conforms to or %NULL. + * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection. + * @object_path: An object path. + * @interface_name: A D-Bus interface name. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: (allow-none): Return location for error or %NULL. + * + * Creates a proxy for accessing @interface_name on the remote object + * at @object_path owned by @name at @connection and synchronously + * loads D-Bus properties unless the + * %G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES flag is used. + * + * If the %G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS flag is not set, also sets up + * match rules for signals. Connect to the #GDBusProxy::g-signal signal + * to handle signals from the remote object. + * + * If @name is a well-known name and the + * %G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag isn't set and no name + * owner currently exists, the message bus will be requested to launch + * a name owner for the name. + * + * This is a synchronous failable constructor. See g_dbus_proxy_new() + * and g_dbus_proxy_new_finish() for the asynchronous version. + * + * See for an example of how #GDBusProxy can be used. + * + * Returns: A #GDBusProxy or %NULL if error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusProxy * +g_dbus_proxy_new_sync (GDBusConnection *connection, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GError **error) +{ + GInitable *initable; + + g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL); + g_return_val_if_fail ((name == NULL && g_dbus_connection_get_unique_name (connection) == NULL) || + g_dbus_is_name (name), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + + initable = g_initable_new (G_TYPE_DBUS_PROXY, + cancellable, + error, + "g-flags", flags, + "g-interface-info", info, + "g-name", name, + "g-connection", connection, + "g-object-path", object_path, + "g-interface-name", interface_name, + NULL); + if (initable != NULL) + return G_DBUS_PROXY (initable); + else + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_proxy_new_for_bus: + * @bus_type: A #GBusType. + * @flags: Flags used when constructing the proxy. + * @info: (allow-none): A #GDBusInterfaceInfo specifying the minimal interface that @proxy conforms to or %NULL. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @interface_name: A D-Bus interface name. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: Callback function to invoke when the proxy is ready. + * @user_data: User data to pass to @callback. + * + * Like g_dbus_proxy_new() but takes a #GBusType instead of a #GDBusConnection. + * + * See for an example of how #GDBusProxy can be used. + * + * Since: 2.26 + */ +void +g_dbus_proxy_new_for_bus (GBusType bus_type, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (g_dbus_is_name (name)); + g_return_if_fail (g_variant_is_object_path (object_path)); + g_return_if_fail (g_dbus_is_interface_name (interface_name)); + + g_async_initable_new_async (G_TYPE_DBUS_PROXY, + G_PRIORITY_DEFAULT, + cancellable, + callback, + user_data, + "g-flags", flags, + "g-interface-info", info, + "g-name", name, + "g-bus-type", bus_type, + "g-object-path", object_path, + "g-interface-name", interface_name, + NULL); +} + +/** + * g_dbus_proxy_new_for_bus_finish: + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback function passed to g_dbus_proxy_new_for_bus(). + * @error: Return location for error or %NULL. + * + * Finishes creating a #GDBusProxy. + * + * Returns: A #GDBusProxy or %NULL if @error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusProxy * +g_dbus_proxy_new_for_bus_finish (GAsyncResult *res, + GError **error) +{ + return g_dbus_proxy_new_finish (res, error); +} + +/** + * g_dbus_proxy_new_for_bus_sync: + * @bus_type: A #GBusType. + * @flags: Flags used when constructing the proxy. + * @info: (allow-none): A #GDBusInterfaceInfo specifying the minimal interface + * that @proxy conforms to or %NULL. + * @name: A bus name (well-known or unique). + * @object_path: An object path. + * @interface_name: A D-Bus interface name. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Like g_dbus_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection. + * + * See for an example of how #GDBusProxy can be used. + * + * Returns: A #GDBusProxy or %NULL if error is set. Free with g_object_unref(). + * + * Since: 2.26 + */ +GDBusProxy * +g_dbus_proxy_new_for_bus_sync (GBusType bus_type, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GError **error) +{ + GInitable *initable; + + g_return_val_if_fail (g_dbus_is_name (name), NULL); + g_return_val_if_fail (g_variant_is_object_path (object_path), NULL); + g_return_val_if_fail (g_dbus_is_interface_name (interface_name), NULL); + + initable = g_initable_new (G_TYPE_DBUS_PROXY, + cancellable, + error, + "g-flags", flags, + "g-interface-info", info, + "g-name", name, + "g-bus-type", bus_type, + "g-object-path", object_path, + "g-interface-name", interface_name, + NULL); + if (initable != NULL) + return G_DBUS_PROXY (initable); + else + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_proxy_get_connection: + * @proxy: A #GDBusProxy. + * + * Gets the connection @proxy is for. + * + * Returns: (transfer none): A #GDBusConnection owned by @proxy. Do not free. + * + * Since: 2.26 + */ +GDBusConnection * +g_dbus_proxy_get_connection (GDBusProxy *proxy) +{ + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + return proxy->priv->connection; +} + +/** + * g_dbus_proxy_get_flags: + * @proxy: A #GDBusProxy. + * + * Gets the flags that @proxy was constructed with. + * + * Returns: Flags from the #GDBusProxyFlags enumeration. + * + * Since: 2.26 + */ +GDBusProxyFlags +g_dbus_proxy_get_flags (GDBusProxy *proxy) +{ + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), 0); + return proxy->priv->flags; +} + +/** + * g_dbus_proxy_get_name: + * @proxy: A #GDBusProxy. + * + * Gets the name that @proxy was constructed for. + * + * Returns: A string owned by @proxy. Do not free. + * + * Since: 2.26 + */ +const gchar * +g_dbus_proxy_get_name (GDBusProxy *proxy) +{ + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + return proxy->priv->name; +} + +/** + * g_dbus_proxy_get_name_owner: + * @proxy: A #GDBusProxy. + * + * The unique name that owns the name that @proxy is for or %NULL if + * no-one currently owns that name. You may connect to the + * #GObject::notify signal to track changes to the + * #GDBusProxy:g-name-owner property. + * + * Returns: The name owner or %NULL if no name owner exists. Free with g_free(). + * + * Since: 2.26 + */ +gchar * +g_dbus_proxy_get_name_owner (GDBusProxy *proxy) +{ + gchar *ret; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + + G_LOCK (properties_lock); + ret = g_strdup (proxy->priv->name_owner); + G_UNLOCK (properties_lock); + return ret; +} + +/** + * g_dbus_proxy_get_object_path: + * @proxy: A #GDBusProxy. + * + * Gets the object path @proxy is for. + * + * Returns: A string owned by @proxy. Do not free. + * + * Since: 2.26 + */ +const gchar * +g_dbus_proxy_get_object_path (GDBusProxy *proxy) +{ + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + return proxy->priv->object_path; +} + +/** + * g_dbus_proxy_get_interface_name: + * @proxy: A #GDBusProxy. + * + * Gets the D-Bus interface name @proxy is for. + * + * Returns: A string owned by @proxy. Do not free. + * + * Since: 2.26 + */ +const gchar * +g_dbus_proxy_get_interface_name (GDBusProxy *proxy) +{ + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + return proxy->priv->interface_name; +} + +/** + * g_dbus_proxy_get_default_timeout: + * @proxy: A #GDBusProxy. + * + * Gets the timeout to use if -1 (specifying default timeout) is + * passed as @timeout_msec in the g_dbus_proxy_call() and + * g_dbus_proxy_call_sync() functions. + * + * See the #GDBusProxy:g-default-timeout property for more details. + * + * Returns: Timeout to use for @proxy. + * + * Since: 2.26 + */ +gint +g_dbus_proxy_get_default_timeout (GDBusProxy *proxy) +{ + gint ret; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), -1); + + G_LOCK (properties_lock); + ret = proxy->priv->timeout_msec; + G_UNLOCK (properties_lock); + return ret; +} + +/** + * g_dbus_proxy_set_default_timeout: + * @proxy: A #GDBusProxy. + * @timeout_msec: Timeout in milliseconds. + * + * Sets the timeout to use if -1 (specifying default timeout) is + * passed as @timeout_msec in the g_dbus_proxy_call() and + * g_dbus_proxy_call_sync() functions. + * + * See the #GDBusProxy:g-default-timeout property for more details. + * + * Since: 2.26 + */ +void +g_dbus_proxy_set_default_timeout (GDBusProxy *proxy, + gint timeout_msec) +{ + g_return_if_fail (G_IS_DBUS_PROXY (proxy)); + g_return_if_fail (timeout_msec == -1 || timeout_msec >= 0); + + G_LOCK (properties_lock); + + if (proxy->priv->timeout_msec != timeout_msec) + { + proxy->priv->timeout_msec = timeout_msec; + G_UNLOCK (properties_lock); + + g_object_notify (G_OBJECT (proxy), "g-default-timeout"); + } + else + { + G_UNLOCK (properties_lock); + } +} + +/** + * g_dbus_proxy_get_interface_info: + * @proxy: A #GDBusProxy + * + * Returns the #GDBusInterfaceInfo, if any, specifying the interface + * that @proxy conforms to. See the #GDBusProxy:g-interface-info + * property for more details. + * + * Returns: A #GDBusInterfaceInfo or %NULL. Do not unref the returned + * object, it is owned by @proxy. + * + * Since: 2.26 + */ +GDBusInterfaceInfo * +g_dbus_proxy_get_interface_info (GDBusProxy *proxy) +{ + GDBusInterfaceInfo *ret; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + + G_LOCK (properties_lock); + ret = proxy->priv->expected_interface; + G_UNLOCK (properties_lock); + /* FIXME: returning a borrowed ref with no guarantee that nobody will + * call g_dbus_proxy_set_interface_info() and make it invalid... + */ + return ret; +} + +/** + * g_dbus_proxy_set_interface_info: + * @proxy: A #GDBusProxy + * @info: (allow-none): Minimum interface this proxy conforms to or %NULL to unset. + * + * Ensure that interactions with @proxy conform to the given + * interface. See the #GDBusProxy:g-interface-info property for more + * details. + * + * Since: 2.26 + */ +void +g_dbus_proxy_set_interface_info (GDBusProxy *proxy, + GDBusInterfaceInfo *info) +{ + g_return_if_fail (G_IS_DBUS_PROXY (proxy)); + G_LOCK (properties_lock); + + if (proxy->priv->expected_interface != NULL) + { + g_dbus_interface_info_cache_release (proxy->priv->expected_interface); + g_dbus_interface_info_unref (proxy->priv->expected_interface); + } + proxy->priv->expected_interface = info != NULL ? g_dbus_interface_info_ref (info) : NULL; + if (proxy->priv->expected_interface != NULL) + g_dbus_interface_info_cache_build (proxy->priv->expected_interface); + + G_UNLOCK (properties_lock); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +maybe_split_method_name (const gchar *method_name, + gchar **out_interface_name, + const gchar **out_method_name) +{ + gboolean was_split; + + was_split = FALSE; + g_assert (out_interface_name != NULL); + g_assert (out_method_name != NULL); + *out_interface_name = NULL; + *out_method_name = NULL; + + if (strchr (method_name, '.') != NULL) + { + gchar *p; + gchar *last_dot; + + p = g_strdup (method_name); + last_dot = strrchr (p, '.'); + *last_dot = '\0'; + + *out_interface_name = p; + *out_method_name = last_dot + 1; + + was_split = TRUE; + } + + return was_split; +} + +typedef struct +{ + GVariant *value; +#ifdef G_OS_UNIX + GUnixFDList *fd_list; +#endif +} ReplyData; + +static void +reply_data_free (ReplyData *data) +{ + g_variant_unref (data->value); +#ifdef G_OS_UNIX + if (data->fd_list != NULL) + g_object_unref (data->fd_list); +#endif + g_slice_free (ReplyData, data); +} + +static void +reply_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (user_data); + GVariant *value; + GError *error; +#ifdef G_OS_UNIX + GUnixFDList *fd_list; +#endif + + error = NULL; +#ifdef G_OS_UNIX + value = g_dbus_connection_call_with_unix_fd_list_finish (connection, + &fd_list, + res, + &error); +#else + value = g_dbus_connection_call_finish (connection, + res, + &error); +#endif + if (error != NULL) + { + g_simple_async_result_take_error (simple, error); + } + else + { + ReplyData *data; + data = g_slice_new0 (ReplyData); + data->value = value; +#ifdef G_OS_UNIX + data->fd_list = fd_list; +#endif + g_simple_async_result_set_op_res_gpointer (simple, data, (GDestroyNotify) reply_data_free); + } + + /* no need to complete in idle since the method GDBusConnection already does */ + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +/* properties_lock must be held for as long as you will keep the + * returned value + */ +static const GDBusMethodInfo * +lookup_method_info (GDBusProxy *proxy, + const gchar *method_name) +{ + const GDBusMethodInfo *info = NULL; + + if (proxy->priv->expected_interface == NULL) + goto out; + + info = g_dbus_interface_info_lookup_method (proxy->priv->expected_interface, method_name); + +out: + return info; +} + +/* properties_lock must be held for as long as you will keep the + * returned value + */ +static const gchar * +get_destination_for_call (GDBusProxy *proxy) +{ + const gchar *ret; + + ret = NULL; + + /* If proxy->priv->name is a unique name, then proxy->priv->name_owner + * is never NULL and always the same as proxy->priv->name. We use this + * knowledge to avoid checking if proxy->priv->name is a unique or + * well-known name. + */ + ret = proxy->priv->name_owner; + if (ret != NULL) + goto out; + + if (proxy->priv->flags & G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START) + goto out; + + ret = proxy->priv->name; + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +g_dbus_proxy_call_internal (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *simple; + gboolean was_split; + gchar *split_interface_name; + const gchar *split_method_name; + const gchar *target_method_name; + const gchar *target_interface_name; + gchar *destination; + GVariantType *reply_type; + GAsyncReadyCallback my_callback; + + g_return_if_fail (G_IS_DBUS_PROXY (proxy)); + g_return_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name)); + g_return_if_fail (parameters == NULL || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE)); + g_return_if_fail (timeout_msec == -1 || timeout_msec >= 0); +#ifdef G_OS_UNIX + g_return_if_fail (fd_list == NULL || G_IS_UNIX_FD_LIST (fd_list)); +#else + g_return_if_fail (fd_list == NULL); +#endif + + reply_type = NULL; + split_interface_name = NULL; + + /* g_dbus_connection_call() is optimised for the case of a NULL + * callback. If we get a NULL callback from our user then make sure + * we pass along a NULL callback for ourselves as well. + */ + if (callback != NULL) + { + my_callback = (GAsyncReadyCallback) reply_cb; + simple = g_simple_async_result_new (G_OBJECT (proxy), + callback, + user_data, + g_dbus_proxy_call_internal); + g_simple_async_result_set_check_cancellable (simple, cancellable); + } + else + { + my_callback = NULL; + simple = NULL; + } + + G_LOCK (properties_lock); + + was_split = maybe_split_method_name (method_name, &split_interface_name, &split_method_name); + target_method_name = was_split ? split_method_name : method_name; + target_interface_name = was_split ? split_interface_name : proxy->priv->interface_name; + + /* Warn if method is unexpected (cf. :g-interface-info) */ + if (!was_split) + { + const GDBusMethodInfo *expected_method_info; + expected_method_info = lookup_method_info (proxy, target_method_name); + if (expected_method_info != NULL) + reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args); + } + + destination = NULL; + if (proxy->priv->name != NULL) + { + destination = g_strdup (get_destination_for_call (proxy)); + if (destination == NULL) + { + if (simple != NULL) + { + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag")); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); + } + G_UNLOCK (properties_lock); + goto out; + } + } + + G_UNLOCK (properties_lock); + +#ifdef G_OS_UNIX + g_dbus_connection_call_with_unix_fd_list (proxy->priv->connection, + destination, + proxy->priv->object_path, + target_interface_name, + target_method_name, + parameters, + reply_type, + flags, + timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, + fd_list, + cancellable, + my_callback, + simple); +#else + g_dbus_connection_call (proxy->priv->connection, + destination, + proxy->priv->object_path, + target_interface_name, + target_method_name, + parameters, + reply_type, + flags, + timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, + cancellable, + my_callback, + simple); +#endif + + out: + if (reply_type != NULL) + g_variant_type_free (reply_type); + + g_free (destination); + g_free (split_interface_name); +} + +static GVariant * +g_dbus_proxy_call_finish_internal (GDBusProxy *proxy, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error) +{ + GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); + GVariant *value; + ReplyData *data; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (res), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_dbus_proxy_call_internal); + + value = NULL; + + if (g_simple_async_result_propagate_error (simple, error)) + goto out; + + data = g_simple_async_result_get_op_res_gpointer (simple); + value = g_variant_ref (data->value); +#ifdef G_OS_UNIX + if (out_fd_list != NULL) + *out_fd_list = data->fd_list != NULL ? g_object_ref (data->fd_list) : NULL; +#endif + + out: + return value; +} + +static GVariant * +g_dbus_proxy_call_sync_internal (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error) +{ + GVariant *ret; + gboolean was_split; + gchar *split_interface_name; + const gchar *split_method_name; + const gchar *target_method_name; + const gchar *target_interface_name; + gchar *destination; + GVariantType *reply_type; + + g_return_val_if_fail (G_IS_DBUS_PROXY (proxy), NULL); + g_return_val_if_fail (g_dbus_is_member_name (method_name) || g_dbus_is_interface_name (method_name), NULL); + g_return_val_if_fail (parameters == NULL || g_variant_is_of_type (parameters, G_VARIANT_TYPE_TUPLE), NULL); + g_return_val_if_fail (timeout_msec == -1 || timeout_msec >= 0, NULL); +#ifdef G_OS_UNIX + g_return_val_if_fail (fd_list == NULL || G_IS_UNIX_FD_LIST (fd_list), NULL); +#else + g_return_val_if_fail (fd_list == NULL, NULL); +#endif + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + reply_type = NULL; + + G_LOCK (properties_lock); + + was_split = maybe_split_method_name (method_name, &split_interface_name, &split_method_name); + target_method_name = was_split ? split_method_name : method_name; + target_interface_name = was_split ? split_interface_name : proxy->priv->interface_name; + + /* Warn if method is unexpected (cf. :g-interface-info) */ + if (!was_split) + { + const GDBusMethodInfo *expected_method_info; + expected_method_info = lookup_method_info (proxy, target_method_name); + if (expected_method_info != NULL) + reply_type = _g_dbus_compute_complete_signature (expected_method_info->out_args); + } + + destination = NULL; + if (proxy->priv->name != NULL) + { + destination = g_strdup (get_destination_for_call (proxy)); + if (destination == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag")); + ret = NULL; + G_UNLOCK (properties_lock); + goto out; + } + } + + G_UNLOCK (properties_lock); + +#ifdef G_OS_UNIX + ret = g_dbus_connection_call_with_unix_fd_list_sync (proxy->priv->connection, + destination, + proxy->priv->object_path, + target_interface_name, + target_method_name, + parameters, + reply_type, + flags, + timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, + fd_list, + out_fd_list, + cancellable, + error); +#else + ret = g_dbus_connection_call_sync (proxy->priv->connection, + destination, + proxy->priv->object_path, + target_interface_name, + target_method_name, + parameters, + reply_type, + flags, + timeout_msec == -1 ? proxy->priv->timeout_msec : timeout_msec, + cancellable, + error); +#endif + + out: + if (reply_type != NULL) + g_variant_type_free (reply_type); + + g_free (destination); + g_free (split_interface_name); + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_proxy_call: + * @proxy: A #GDBusProxy. + * @method_name: Name of method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the signal or %NULL if not passing parameters. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning + * "infinite") or -1 to use the proxy default timeout. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is satisfied or %NULL if you don't + * care about the result of the method invocation. + * @user_data: The data to pass to @callback. + * + * Asynchronously invokes the @method_name method on @proxy. + * + * If @method_name contains any dots, then @name is split into interface and + * method name parts. This allows using @proxy for invoking methods on + * other interfaces. + * + * If the #GDBusConnection associated with @proxy is closed then + * the operation will fail with %G_IO_ERROR_CLOSED. If + * @cancellable is canceled, the operation will fail with + * %G_IO_ERROR_CANCELLED. If @parameters contains a value not + * compatible with the D-Bus protocol, the operation fails with + * %G_IO_ERROR_INVALID_ARGUMENT. + * + * If the @parameters #GVariant is floating, it is consumed. This allows + * convenient 'inline' use of g_variant_new(), e.g.: + * |[ + * g_dbus_proxy_call (proxy, + * "TwoStrings", + * g_variant_new ("(ss)", + * "Thing One", + * "Thing Two"), + * G_DBUS_CALL_FLAGS_NONE, + * -1, + * NULL, + * (GAsyncReadyCallback) two_strings_done, + * &data); + * ]| + * + * If @proxy has an expected interface (see + * #GDBusProxy:g-interface-info) and @method_name is referenced by it, + * then the return value is checked against the return type. + * + * This is an asynchronous method. When the operation is finished, + * @callback will be invoked in the + * thread-default main loop + * of the thread you are calling this method from. + * You can then call g_dbus_proxy_call_finish() to get the result of + * the operation. See g_dbus_proxy_call_sync() for the synchronous + * version of this method. + * + * If @callback is %NULL then the D-Bus method call message will be sent with + * the %G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED flag set. + * + * Since: 2.26 + */ +void +g_dbus_proxy_call (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call_internal (proxy, method_name, parameters, flags, timeout_msec, NULL, cancellable, callback, user_data); +} + +/** + * g_dbus_proxy_call_finish: + * @proxy: A #GDBusProxy. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_proxy_call(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_proxy_call(). + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.26 + */ +GVariant * +g_dbus_proxy_call_finish (GDBusProxy *proxy, + GAsyncResult *res, + GError **error) +{ + return g_dbus_proxy_call_finish_internal (proxy, NULL, res, error); +} + +/** + * g_dbus_proxy_call_sync: + * @proxy: A #GDBusProxy. + * @method_name: Name of method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the signal + * or %NULL if not passing parameters. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning + * "infinite") or -1 to use the proxy default timeout. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Synchronously invokes the @method_name method on @proxy. + * + * If @method_name contains any dots, then @name is split into interface and + * method name parts. This allows using @proxy for invoking methods on + * other interfaces. + * + * If the #GDBusConnection associated with @proxy is disconnected then + * the operation will fail with %G_IO_ERROR_CLOSED. If + * @cancellable is canceled, the operation will fail with + * %G_IO_ERROR_CANCELLED. If @parameters contains a value not + * compatible with the D-Bus protocol, the operation fails with + * %G_IO_ERROR_INVALID_ARGUMENT. + * + * If the @parameters #GVariant is floating, it is consumed. This allows + * convenient 'inline' use of g_variant_new(), e.g.: + * |[ + * g_dbus_proxy_call_sync (proxy, + * "TwoStrings", + * g_variant_new ("(ss)", + * "Thing One", + * "Thing Two"), + * G_DBUS_CALL_FLAGS_NONE, + * -1, + * NULL, + * &error); + * ]| + * + * The calling thread is blocked until a reply is received. See + * g_dbus_proxy_call() for the asynchronous version of this + * method. + * + * If @proxy has an expected interface (see + * #GDBusProxy:g-interface-info) and @method_name is referenced by it, + * then the return value is checked against the return type. + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.26 + */ +GVariant * +g_dbus_proxy_call_sync (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GError **error) +{ + return g_dbus_proxy_call_sync_internal (proxy, method_name, parameters, flags, timeout_msec, NULL, NULL, cancellable, error); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX + +/** + * g_dbus_proxy_call_with_unix_fd_list: + * @proxy: A #GDBusProxy. + * @method_name: Name of method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the signal or %NULL if not passing parameters. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning + * "infinite") or -1 to use the proxy default timeout. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @callback: (allow-none): A #GAsyncReadyCallback to call when the request is satisfied or %NULL if you don't + * care about the result of the method invocation. + * @user_data: The data to pass to @callback. + * + * Like g_dbus_proxy_call() but also takes a #GUnixFDList object. + * + * This method is only available on UNIX. + * + * Since: 2.30 + */ +void +g_dbus_proxy_call_with_unix_fd_list (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_dbus_proxy_call_internal (proxy, method_name, parameters, flags, timeout_msec, fd_list, cancellable, callback, user_data); +} + +/** + * g_dbus_proxy_call_with_unix_fd_list_finish: + * @proxy: A #GDBusProxy. + * @out_fd_list: (out) (allow-none): Return location for a #GUnixFDList or %NULL. + * @res: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to g_dbus_proxy_call_with_unix_fd_list(). + * @error: Return location for error or %NULL. + * + * Finishes an operation started with g_dbus_proxy_call_with_unix_fd_list(). + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_proxy_call_with_unix_fd_list_finish (GDBusProxy *proxy, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error) +{ + return g_dbus_proxy_call_finish_internal (proxy, out_fd_list, res, error); +} + +/** + * g_dbus_proxy_call_with_unix_fd_list_sync: + * @proxy: A #GDBusProxy. + * @method_name: Name of method to invoke. + * @parameters: (allow-none): A #GVariant tuple with parameters for the signal + * or %NULL if not passing parameters. + * @flags: Flags from the #GDBusCallFlags enumeration. + * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning + * "infinite") or -1 to use the proxy default timeout. + * @fd_list: (allow-none): A #GUnixFDList or %NULL. + * @out_fd_list: (out) (allow-none): Return location for a #GUnixFDList or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Like g_dbus_proxy_call_sync() but also takes and returns #GUnixFDList objects. + * + * This method is only available on UNIX. + * + * Returns: %NULL if @error is set. Otherwise a #GVariant tuple with + * return values. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_proxy_call_with_unix_fd_list_sync (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error) +{ + return g_dbus_proxy_call_sync_internal (proxy, method_name, parameters, flags, timeout_msec, fd_list, out_fd_list, cancellable, error); +} + +#endif /* G_OS_UNIX */ + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusInterfaceInfo * +_g_dbus_proxy_get_info (GDBusInterface *interface) +{ + GDBusProxy *proxy = G_DBUS_PROXY (interface); + return g_dbus_proxy_get_interface_info (proxy); +} + +static GDBusObject * +_g_dbus_proxy_get_object (GDBusInterface *interface) +{ + GDBusProxy *proxy = G_DBUS_PROXY (interface); + return proxy->priv->object; +} + +static GDBusObject * +_g_dbus_proxy_dup_object (GDBusInterface *interface) +{ + GDBusProxy *proxy = G_DBUS_PROXY (interface); + GDBusObject *ret = NULL; + + G_LOCK (properties_lock); + if (proxy->priv->object != NULL) + ret = g_object_ref (proxy->priv->object); + G_UNLOCK (properties_lock); + return ret; +} + +static void +_g_dbus_proxy_set_object (GDBusInterface *interface, + GDBusObject *object) +{ + GDBusProxy *proxy = G_DBUS_PROXY (interface); + G_LOCK (properties_lock); + if (proxy->priv->object != NULL) + g_object_remove_weak_pointer (G_OBJECT (proxy->priv->object), (gpointer *) &proxy->priv->object); + proxy->priv->object = object; + if (proxy->priv->object != NULL) + g_object_add_weak_pointer (G_OBJECT (proxy->priv->object), (gpointer *) &proxy->priv->object); + G_UNLOCK (properties_lock); +} + +static void +dbus_interface_iface_init (GDBusInterfaceIface *dbus_interface_iface) +{ + dbus_interface_iface->get_info = _g_dbus_proxy_get_info; + dbus_interface_iface->get_object = _g_dbus_proxy_get_object; + dbus_interface_iface->dup_object = _g_dbus_proxy_dup_object; + dbus_interface_iface->set_object = _g_dbus_proxy_set_object; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusproxy.h b/gio/gdbusproxy.h new file mode 100644 index 0000000..18a9138 --- /dev/null +++ b/gio/gdbusproxy.h @@ -0,0 +1,216 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_PROXY_H__ +#define __G_DBUS_PROXY_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_PROXY (g_dbus_proxy_get_type ()) +#define G_DBUS_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_PROXY, GDBusProxy)) +#define G_DBUS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DBUS_PROXY, GDBusProxyClass)) +#define G_DBUS_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DBUS_PROXY, GDBusProxyClass)) +#define G_IS_DBUS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_PROXY)) +#define G_IS_DBUS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DBUS_PROXY)) + +typedef struct _GDBusProxyClass GDBusProxyClass; +typedef struct _GDBusProxyPrivate GDBusProxyPrivate; + +/** + * GDBusProxy: + * + * The #GDBusProxy structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusProxy +{ + /*< private >*/ + GObject parent_instance; + GDBusProxyPrivate *priv; +}; + +/** + * GDBusProxyClass: + * @g_properties_changed: Signal class handler for the #GDBusProxy::g-properties-changed signal. + * @g_signal: Signal class handler for the #GDBusProxy::g-signal signal. + * + * Class structure for #GDBusProxy. + * + * Since: 2.26 + */ +struct _GDBusProxyClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Signals */ + void (*g_properties_changed) (GDBusProxy *proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties); + void (*g_signal) (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[32]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_proxy_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_new (GDBusConnection *connection, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusProxy *g_dbus_proxy_new_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusProxy *g_dbus_proxy_new_sync (GDBusConnection *connection, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_new_for_bus (GBusType bus_type, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GDBusProxy *g_dbus_proxy_new_for_bus_finish (GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusProxy *g_dbus_proxy_new_for_bus_sync (GBusType bus_type, + GDBusProxyFlags flags, + GDBusInterfaceInfo *info, + const gchar *name, + const gchar *object_path, + const gchar *interface_name, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GDBusConnection *g_dbus_proxy_get_connection (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +GDBusProxyFlags g_dbus_proxy_get_flags (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_proxy_get_name (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_proxy_get_name_owner (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_proxy_get_object_path (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_proxy_get_interface_name (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +gint g_dbus_proxy_get_default_timeout (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_set_default_timeout (GDBusProxy *proxy, + gint timeout_msec); +GLIB_AVAILABLE_IN_ALL +GDBusInterfaceInfo *g_dbus_proxy_get_interface_info (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_set_interface_info (GDBusProxy *proxy, + GDBusInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_proxy_get_cached_property (GDBusProxy *proxy, + const gchar *property_name); +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_set_cached_property (GDBusProxy *proxy, + const gchar *property_name, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +gchar **g_dbus_proxy_get_cached_property_names (GDBusProxy *proxy); +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_call (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_proxy_call_finish (GDBusProxy *proxy, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_proxy_call_sync (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_proxy_call_with_unix_fd_list (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_proxy_call_with_unix_fd_list_finish (GDBusProxy *proxy, + GUnixFDList **out_fd_list, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_proxy_call_with_unix_fd_list_sync (GDBusProxy *proxy, + const gchar *method_name, + GVariant *parameters, + GDBusCallFlags flags, + gint timeout_msec, + GUnixFDList *fd_list, + GUnixFDList **out_fd_list, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __G_DBUS_PROXY_H__ */ diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c new file mode 100644 index 0000000..02508e6 --- /dev/null +++ b/gio/gdbusserver.c @@ -0,0 +1,1136 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef _WIN32 +#include +#endif + +#include "giotypes.h" +#include "gioerror.h" +#include "gdbusaddress.h" +#include "gdbusutils.h" +#include "gdbusconnection.h" +#include "gdbusserver.h" +#include "gioenumtypes.h" +#include "gdbusprivate.h" +#include "gdbusauthobserver.h" +#include "ginitable.h" +#include "gsocketservice.h" +#include "gthreadedsocketservice.h" +#include "gresolver.h" +#include "glib/gstdio.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "ginputstream.h" +#include "giostream.h" + +#ifdef G_OS_UNIX +#include "gunixsocketaddress.h" +#endif + +#include "glibintl.h" + +/** + * SECTION:gdbusserver + * @short_description: Helper for accepting connections + * @include: gio/gio.h + * + * #GDBusServer is a helper for listening to and accepting D-Bus + * connections. This can be used to create a new D-Bus server, allowing two + * peers to use the D-Bus protocol for their own specialized communication. + * A server instance provided in this way will not perform message routing or + * implement the org.freedesktop.DBus interface. + * + * To just export an object on a well-known name on a message bus, such as the + * session or system bus, you should instead use g_bus_own_name(). + * + * D-Bus peer-to-peer exampleFIXME: MISSING XINCLUDE CONTENT + */ + +/** + * GDBusServer: + * + * The #GDBusServer structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GDBusServer +{ + /*< private >*/ + GObject parent_instance; + + GDBusServerFlags flags; + gchar *address; + gchar *guid; + + guchar *nonce; + gchar *nonce_file; + + gchar *client_address; + + GSocketListener *listener; + gboolean is_using_listener; + gulong run_signal_handler_id; + + /* The result of g_main_context_ref_thread_default() when the object + * was created (the GObject _init() function) - this is used for delivery + * of the :new-connection GObject signal. + */ + GMainContext *main_context_at_construction; + + gboolean active; + + GDBusAuthObserver *authentication_observer; +}; + +typedef struct _GDBusServerClass GDBusServerClass; + +/** + * GDBusServerClass: + * @new_connection: Signal class handler for the #GDBusServer::new-connection signal. + * + * Class structure for #GDBusServer. + * + * Since: 2.26 + */ +struct _GDBusServerClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + /* Signals */ + gboolean (*new_connection) (GDBusServer *server, + GDBusConnection *connection); +}; + +enum +{ + PROP_0, + PROP_ADDRESS, + PROP_CLIENT_ADDRESS, + PROP_FLAGS, + PROP_GUID, + PROP_ACTIVE, + PROP_AUTHENTICATION_OBSERVER, +}; + +enum +{ + NEW_CONNECTION_SIGNAL, + LAST_SIGNAL, +}; + +static guint _signals[LAST_SIGNAL] = {0}; + +static void initable_iface_init (GInitableIface *initable_iface); + +G_DEFINE_TYPE_WITH_CODE (GDBusServer, g_dbus_server, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, initable_iface_init) + ); + +static void +g_dbus_server_finalize (GObject *object) +{ + GDBusServer *server = G_DBUS_SERVER (object); + + if (server->authentication_observer != NULL) + g_object_unref (server->authentication_observer); + + if (server->run_signal_handler_id > 0) + g_signal_handler_disconnect (server->listener, server->run_signal_handler_id); + + if (server->listener != NULL) + g_object_unref (server->listener); + + g_free (server->address); + g_free (server->guid); + g_free (server->client_address); + if (server->nonce != NULL) + { + memset (server->nonce, '\0', 16); + g_free (server->nonce); + } + /* we could unlink the nonce file but I don't + * think it's really worth the effort/risk + */ + g_free (server->nonce_file); + + g_main_context_unref (server->main_context_at_construction); + + G_OBJECT_CLASS (g_dbus_server_parent_class)->finalize (object); +} + +static void +g_dbus_server_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDBusServer *server = G_DBUS_SERVER (object); + + switch (prop_id) + { + case PROP_FLAGS: + g_value_set_flags (value, server->flags); + break; + + case PROP_GUID: + g_value_set_string (value, server->guid); + break; + + case PROP_ADDRESS: + g_value_set_string (value, server->address); + break; + + case PROP_CLIENT_ADDRESS: + g_value_set_string (value, server->client_address); + break; + + case PROP_ACTIVE: + g_value_set_boolean (value, server->active); + break; + + case PROP_AUTHENTICATION_OBSERVER: + g_value_set_object (value, server->authentication_observer); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_server_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDBusServer *server = G_DBUS_SERVER (object); + + switch (prop_id) + { + case PROP_FLAGS: + server->flags = g_value_get_flags (value); + break; + + case PROP_GUID: + server->guid = g_value_dup_string (value); + break; + + case PROP_ADDRESS: + server->address = g_value_dup_string (value); + break; + + case PROP_AUTHENTICATION_OBSERVER: + server->authentication_observer = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_dbus_server_class_init (GDBusServerClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_dbus_server_finalize; + gobject_class->set_property = g_dbus_server_set_property; + gobject_class->get_property = g_dbus_server_get_property; + + /** + * GDBusServer:flags: + * + * Flags from the #GDBusServerFlags enumeration. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Flags"), + P_("Flags for the server"), + G_TYPE_DBUS_SERVER_FLAGS, + G_DBUS_SERVER_FLAGS_NONE, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer:guid: + * + * The guid of the server. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_GUID, + g_param_spec_string ("guid", + P_("GUID"), + P_("The guid of the server"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer:address: + * + * The D-Bus address to listen on. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_ADDRESS, + g_param_spec_string ("address", + P_("Address"), + P_("The address to listen on"), + NULL, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer:client-address: + * + * The D-Bus address that clients can use. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CLIENT_ADDRESS, + g_param_spec_string ("client-address", + P_("Client Address"), + P_("The address clients can use"), + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer:active: + * + * Whether the server is currently active. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_ACTIVE, + g_param_spec_boolean ("active", + P_("Active"), + P_("Whether the server is currently active"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer:authentication-observer: + * + * A #GDBusAuthObserver object to assist in the authentication process or %NULL. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_AUTHENTICATION_OBSERVER, + g_param_spec_object ("authentication-observer", + P_("Authentication Observer"), + P_("Object used to assist in the authentication process"), + G_TYPE_DBUS_AUTH_OBSERVER, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + + /** + * GDBusServer::new-connection: + * @server: The #GDBusServer emitting the signal. + * @connection: A #GDBusConnection for the new connection. + * + * Emitted when a new authenticated connection has been made. Use + * g_dbus_connection_get_peer_credentials() to figure out what + * identity (if any), was authenticated. + * + * If you want to accept the connection, take a reference to the + * @connection object and return %TRUE. When you are done with the + * connection call g_dbus_connection_close() and give up your + * reference. Note that the other peer may disconnect at any time - + * a typical thing to do when accepting a connection is to listen to + * the #GDBusConnection::closed signal. + * + * If #GDBusServer:flags contains %G_DBUS_SERVER_FLAGS_RUN_IN_THREAD + * then the signal is emitted in a new thread dedicated to the + * connection. Otherwise the signal is emitted in the thread-default main + * loop of the thread that @server was constructed in. + * + * You are guaranteed that signal handlers for this signal runs + * before incoming messages on @connection are processed. This means + * that it's suitable to call g_dbus_connection_register_object() or + * similar from the signal handler. + * + * Returns: %TRUE to claim @connection, %FALSE to let other handlers + * run. + * + * Since: 2.26 + */ + _signals[NEW_CONNECTION_SIGNAL] = g_signal_new ("new-connection", + G_TYPE_DBUS_SERVER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GDBusServerClass, new_connection), + g_signal_accumulator_true_handled, + NULL, /* accu_data */ + NULL, + G_TYPE_BOOLEAN, + 1, + G_TYPE_DBUS_CONNECTION); +} + +static void +g_dbus_server_init (GDBusServer *server) +{ + server->main_context_at_construction = g_main_context_ref_thread_default (); +} + +static gboolean +on_run (GSocketService *service, + GSocketConnection *socket_connection, + GObject *source_object, + gpointer user_data); + +/** + * g_dbus_server_new_sync: + * @address: A D-Bus address. + * @flags: Flags from the #GDBusServerFlags enumeration. + * @guid: A D-Bus GUID. + * @observer: (allow-none): A #GDBusAuthObserver or %NULL. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for server or %NULL. + * + * Creates a new D-Bus server that listens on the first address in + * @address that works. + * + * Once constructed, you can use g_dbus_server_get_client_address() to + * get a D-Bus address string that clients can use to connect. + * + * Connect to the #GDBusServer::new-connection signal to handle + * incoming connections. + * + * The returned #GDBusServer isn't active - you have to start it with + * g_dbus_server_start(). + * + * See for how #GDBusServer can + * be used. + * + * This is a synchronous failable constructor. See + * g_dbus_server_new() for the asynchronous version. + * + * Returns: A #GDBusServer or %NULL if @error is set. Free with + * g_object_unref(). + * + * Since: 2.26 + */ +GDBusServer * +g_dbus_server_new_sync (const gchar *address, + GDBusServerFlags flags, + const gchar *guid, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error) +{ + GDBusServer *server; + + g_return_val_if_fail (address != NULL, NULL); + g_return_val_if_fail (g_dbus_is_guid (guid), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + server = g_initable_new (G_TYPE_DBUS_SERVER, + cancellable, + error, + "address", address, + "flags", flags, + "guid", guid, + "authentication-observer", observer, + NULL); + + return server; +} + +/** + * g_dbus_server_get_client_address: + * @server: A #GDBusServer. + * + * Gets a D-Bus address string that can be used by clients to connect + * to @server. + * + * Returns: A D-Bus address string. Do not free, the string is owned + * by @server. + * + * Since: 2.26 + */ +const gchar * +g_dbus_server_get_client_address (GDBusServer *server) +{ + g_return_val_if_fail (G_IS_DBUS_SERVER (server), NULL); + return server->client_address; +} + +/** + * g_dbus_server_get_guid: + * @server: A #GDBusServer. + * + * Gets the GUID for @server. + * + * Returns: A D-Bus GUID. Do not free this string, it is owned by @server. + * + * Since: 2.26 + */ +const gchar * +g_dbus_server_get_guid (GDBusServer *server) +{ + g_return_val_if_fail (G_IS_DBUS_SERVER (server), NULL); + return server->guid; +} + +/** + * g_dbus_server_get_flags: + * @server: A #GDBusServer. + * + * Gets the flags for @server. + * + * Returns: A set of flags from the #GDBusServerFlags enumeration. + * + * Since: 2.26 + */ +GDBusServerFlags +g_dbus_server_get_flags (GDBusServer *server) +{ + g_return_val_if_fail (G_IS_DBUS_SERVER (server), G_DBUS_SERVER_FLAGS_NONE); + return server->flags; +} + +/** + * g_dbus_server_is_active: + * @server: A #GDBusServer. + * + * Gets whether @server is active. + * + * Returns: %TRUE if server is active, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_server_is_active (GDBusServer *server) +{ + g_return_val_if_fail (G_IS_DBUS_SERVER (server), G_DBUS_SERVER_FLAGS_NONE); + return server->active; +} + +/** + * g_dbus_server_start: + * @server: A #GDBusServer. + * + * Starts @server. + * + * Since: 2.26 + */ +void +g_dbus_server_start (GDBusServer *server) +{ + g_return_if_fail (G_IS_DBUS_SERVER (server)); + if (server->active) + return; + /* Right now we don't have any transport not using the listener... */ + g_assert (server->is_using_listener); + g_socket_service_start (G_SOCKET_SERVICE (server->listener)); + server->active = TRUE; + g_object_notify (G_OBJECT (server), "active"); +} + +/** + * g_dbus_server_stop: + * @server: A #GDBusServer. + * + * Stops @server. + * + * Since: 2.26 + */ +void +g_dbus_server_stop (GDBusServer *server) +{ + g_return_if_fail (G_IS_DBUS_SERVER (server)); + if (!server->active) + return; + /* Right now we don't have any transport not using the listener... */ + g_assert (server->is_using_listener); + g_assert (server->run_signal_handler_id > 0); + g_signal_handler_disconnect (server->listener, server->run_signal_handler_id); + server->run_signal_handler_id = 0; + g_socket_service_stop (G_SOCKET_SERVICE (server->listener)); + server->active = FALSE; + g_object_notify (G_OBJECT (server), "active"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX + +static gint +random_ascii (void) +{ + gint ret; + ret = g_random_int_range (0, 60); + if (ret < 25) + ret += 'A'; + else if (ret < 50) + ret += 'a' - 25; + else + ret += '0' - 50; + return ret; +} + +/* note that address_entry has already been validated => exactly one of path, tmpdir or abstract keys are set */ +static gboolean +try_unix (GDBusServer *server, + const gchar *address_entry, + GHashTable *key_value_pairs, + GError **error) +{ + gboolean ret; + const gchar *path; + const gchar *tmpdir; + const gchar *abstract; + GSocketAddress *address; + + ret = FALSE; + address = NULL; + + path = g_hash_table_lookup (key_value_pairs, "path"); + tmpdir = g_hash_table_lookup (key_value_pairs, "tmpdir"); + abstract = g_hash_table_lookup (key_value_pairs, "abstract"); + + if (path != NULL) + { + address = g_unix_socket_address_new (path); + } + else if (tmpdir != NULL) + { + gint n; + GString *s; + GError *local_error; + + retry: + s = g_string_new (tmpdir); + g_string_append (s, "/dbus-"); + for (n = 0; n < 8; n++) + g_string_append_c (s, random_ascii ()); + + /* prefer abstract namespace if available */ + if (g_unix_socket_address_abstract_names_supported ()) + address = g_unix_socket_address_new_with_type (s->str, + -1, + G_UNIX_SOCKET_ADDRESS_ABSTRACT); + else + address = g_unix_socket_address_new (s->str); + g_string_free (s, TRUE); + + local_error = NULL; + if (!g_socket_listener_add_address (server->listener, + address, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL, /* source_object */ + NULL, /* effective_address */ + &local_error)) + { + if (local_error->domain == G_IO_ERROR && local_error->code == G_IO_ERROR_ADDRESS_IN_USE) + { + g_error_free (local_error); + goto retry; + } + g_propagate_error (error, local_error); + goto out; + } + ret = TRUE; + goto out; + } + else if (abstract != NULL) + { + if (!g_unix_socket_address_abstract_names_supported ()) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Abstract name space not supported")); + goto out; + } + address = g_unix_socket_address_new_with_type (abstract, + -1, + G_UNIX_SOCKET_ADDRESS_ABSTRACT); + } + else + { + g_assert_not_reached (); + } + + if (!g_socket_listener_add_address (server->listener, + address, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL, /* source_object */ + NULL, /* effective_address */ + error)) + goto out; + + ret = TRUE; + + out: + + if (address != NULL) + { + /* Fill out client_address if the connection attempt worked */ + if (ret) + { + server->is_using_listener = TRUE; + + switch (g_unix_socket_address_get_address_type (G_UNIX_SOCKET_ADDRESS (address))) + { + case G_UNIX_SOCKET_ADDRESS_ABSTRACT: + server->client_address = g_strdup_printf ("unix:abstract=%s", + g_unix_socket_address_get_path (G_UNIX_SOCKET_ADDRESS (address))); + break; + + case G_UNIX_SOCKET_ADDRESS_PATH: + server->client_address = g_strdup_printf ("unix:path=%s", + g_unix_socket_address_get_path (G_UNIX_SOCKET_ADDRESS (address))); + break; + + default: + g_assert_not_reached (); + break; + } + } + g_object_unref (address); + } + return ret; +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +/* note that address_entry has already been validated => + * both host and port (guaranteed to be a number in [0, 65535]) are set (family is optional) + */ +static gboolean +try_tcp (GDBusServer *server, + const gchar *address_entry, + GHashTable *key_value_pairs, + gboolean do_nonce, + GError **error) +{ + gboolean ret; + const gchar *host; + const gchar *port; + gint port_num; + GResolver *resolver; + GList *resolved_addresses; + GList *l; + + ret = FALSE; + resolver = NULL; + resolved_addresses = NULL; + + host = g_hash_table_lookup (key_value_pairs, "host"); + port = g_hash_table_lookup (key_value_pairs, "port"); + /* family = g_hash_table_lookup (key_value_pairs, "family"); */ + if (g_hash_table_lookup (key_value_pairs, "noncefile") != NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Cannot specify nonce file when creating a server")); + goto out; + } + + if (host == NULL) + host = "localhost"; + if (port == NULL) + port = "0"; + port_num = strtol (port, NULL, 10); + + resolver = g_resolver_get_default (); + resolved_addresses = g_resolver_lookup_by_name (resolver, + host, + NULL, + error); + if (resolved_addresses == NULL) + goto out; + + /* TODO: handle family */ + for (l = resolved_addresses; l != NULL; l = l->next) + { + GInetAddress *address = G_INET_ADDRESS (l->data); + GSocketAddress *socket_address; + GSocketAddress *effective_address; + + socket_address = g_inet_socket_address_new (address, port_num); + if (!g_socket_listener_add_address (server->listener, + socket_address, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_TCP, + NULL, /* GObject *source_object */ + &effective_address, + error)) + { + g_object_unref (socket_address); + goto out; + } + if (port_num == 0) + /* make sure we allocate the same port number for other listeners */ + port_num = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (effective_address)); + + g_object_unref (effective_address); + g_object_unref (socket_address); + } + + if (do_nonce) + { + gint fd; + guint n; + gsize bytes_written; + gsize bytes_remaining; + char *file_escaped; + + server->nonce = g_new0 (guchar, 16); + for (n = 0; n < 16; n++) + server->nonce[n] = g_random_int_range (0, 256); + fd = g_file_open_tmp ("gdbus-nonce-file-XXXXXX", + &server->nonce_file, + error); + if (fd == -1) + { + g_socket_listener_close (server->listener); + goto out; + } + again: + bytes_written = 0; + bytes_remaining = 16; + while (bytes_remaining > 0) + { + gssize ret; + ret = write (fd, server->nonce + bytes_written, bytes_remaining); + if (ret == -1) + { + if (errno == EINTR) + goto again; + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error writing nonce file at `%s': %s"), + server->nonce_file, + strerror (errno)); + goto out; + } + bytes_written += ret; + bytes_remaining -= ret; + } + if (!g_close (fd, error)) + goto out; + file_escaped = g_uri_escape_string (server->nonce_file, "/\\", FALSE); + server->client_address = g_strdup_printf ("nonce-tcp:host=%s,port=%d,noncefile=%s", + host, + port_num, + file_escaped); + g_free (file_escaped); + } + else + { + server->client_address = g_strdup_printf ("tcp:host=%s,port=%d", host, port_num); + } + server->is_using_listener = TRUE; + ret = TRUE; + + out: + g_list_free_full (resolved_addresses, g_object_unref); + g_object_unref (resolver); + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusServer *server; + GDBusConnection *connection; +} EmitIdleData; + +static void +emit_idle_data_free (EmitIdleData *data) +{ + g_object_unref (data->server); + g_object_unref (data->connection); + g_free (data); +} + +static gboolean +emit_new_connection_in_idle (gpointer user_data) +{ + EmitIdleData *data = user_data; + gboolean claimed; + + claimed = FALSE; + g_signal_emit (data->server, + _signals[NEW_CONNECTION_SIGNAL], + 0, + data->connection, + &claimed); + + if (claimed) + g_dbus_connection_start_message_processing (data->connection); + g_object_unref (data->connection); + + return FALSE; +} + +/* Called in new thread */ +static gboolean +on_run (GSocketService *service, + GSocketConnection *socket_connection, + GObject *source_object, + gpointer user_data) +{ + GDBusServer *server = G_DBUS_SERVER (user_data); + GDBusConnection *connection; + GDBusConnectionFlags connection_flags; + + if (server->nonce != NULL) + { + gchar buf[16]; + gsize bytes_read; + + if (!g_input_stream_read_all (g_io_stream_get_input_stream (G_IO_STREAM (socket_connection)), + buf, + 16, + &bytes_read, + NULL, /* GCancellable */ + NULL)) /* GError */ + goto out; + + if (bytes_read != 16) + goto out; + + if (memcmp (buf, server->nonce, 16) != 0) + goto out; + } + + connection_flags = + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER | + G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING; + if (server->flags & G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS) + connection_flags |= G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS; + + connection = g_dbus_connection_new_sync (G_IO_STREAM (socket_connection), + server->guid, + connection_flags, + server->authentication_observer, + NULL, /* GCancellable */ + NULL); /* GError */ + if (connection == NULL) + goto out; + + if (server->flags & G_DBUS_SERVER_FLAGS_RUN_IN_THREAD) + { + gboolean claimed; + + claimed = FALSE; + g_signal_emit (server, + _signals[NEW_CONNECTION_SIGNAL], + 0, + connection, + &claimed); + if (claimed) + g_dbus_connection_start_message_processing (connection); + g_object_unref (connection); + } + else + { + GSource *idle_source; + EmitIdleData *data; + + data = g_new0 (EmitIdleData, 1); + data->server = g_object_ref (server); + data->connection = g_object_ref (connection); + + idle_source = g_idle_source_new (); + g_source_set_priority (idle_source, G_PRIORITY_DEFAULT); + g_source_set_callback (idle_source, + emit_new_connection_in_idle, + data, + (GDestroyNotify) emit_idle_data_free); + g_source_attach (idle_source, server->main_context_at_construction); + g_source_unref (idle_source); + } + + out: + return TRUE; +} + +static gboolean +initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GDBusServer *server = G_DBUS_SERVER (initable); + gboolean ret; + guint n; + gchar **addr_array; + GError *last_error; + + ret = FALSE; + addr_array = NULL; + last_error = NULL; + + if (!g_dbus_is_guid (server->guid)) + { + g_set_error (&last_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("The string `%s' is not a valid D-Bus GUID"), + server->guid); + goto out; + } + + server->listener = G_SOCKET_LISTENER (g_threaded_socket_service_new (-1)); + + addr_array = g_strsplit (server->address, ";", 0); + last_error = NULL; + for (n = 0; addr_array != NULL && addr_array[n] != NULL; n++) + { + const gchar *address_entry = addr_array[n]; + GHashTable *key_value_pairs; + gchar *transport_name; + GError *this_error; + + this_error = NULL; + if (g_dbus_is_supported_address (address_entry, + &this_error) && + _g_dbus_address_parse_entry (address_entry, + &transport_name, + &key_value_pairs, + &this_error)) + { + + if (FALSE) + { + } +#ifdef G_OS_UNIX + else if (g_strcmp0 (transport_name, "unix") == 0) + ret = try_unix (server, address_entry, key_value_pairs, &this_error); +#endif + else if (g_strcmp0 (transport_name, "tcp") == 0) + ret = try_tcp (server, address_entry, key_value_pairs, FALSE, &this_error); + else if (g_strcmp0 (transport_name, "nonce-tcp") == 0) + ret = try_tcp (server, address_entry, key_value_pairs, TRUE, &this_error); + else + g_set_error (&this_error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("Cannot listen on unsupported transport `%s'"), + transport_name); + + g_free (transport_name); + if (key_value_pairs != NULL) + g_hash_table_unref (key_value_pairs); + + if (ret) + { + g_assert (this_error == NULL); + goto out; + } + } + + if (this_error != NULL) + { + if (last_error != NULL) + g_error_free (last_error); + last_error = this_error; + } + } + + out: + + g_strfreev (addr_array); + + if (ret) + { + if (last_error != NULL) + g_error_free (last_error); + + /* Right now we don't have any transport not using the listener... */ + g_assert (server->is_using_listener); + server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener), + "run", + G_CALLBACK (on_run), + server); + } + else + { + g_assert (last_error != NULL); + g_propagate_error (error, last_error); + } + return ret; +} + + +static void +initable_iface_init (GInitableIface *initable_iface) +{ + initable_iface->init = initable_init; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/gdbusserver.h b/gio/gdbusserver.h new file mode 100644 index 0000000..05557f0 --- /dev/null +++ b/gio/gdbusserver.h @@ -0,0 +1,62 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_SERVER_H__ +#define __G_DBUS_SERVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DBUS_SERVER (g_dbus_server_get_type ()) +#define G_DBUS_SERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DBUS_SERVER, GDBusServer)) +#define G_IS_DBUS_SERVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_SERVER)) + +GLIB_AVAILABLE_IN_ALL +GType g_dbus_server_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GDBusServer *g_dbus_server_new_sync (const gchar *address, + GDBusServerFlags flags, + const gchar *guid, + GDBusAuthObserver *observer, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_server_get_client_address (GDBusServer *server); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dbus_server_get_guid (GDBusServer *server); +GLIB_AVAILABLE_IN_ALL +GDBusServerFlags g_dbus_server_get_flags (GDBusServer *server); +GLIB_AVAILABLE_IN_ALL +void g_dbus_server_start (GDBusServer *server); +GLIB_AVAILABLE_IN_ALL +void g_dbus_server_stop (GDBusServer *server); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_server_is_active (GDBusServer *server); + +G_END_DECLS + +#endif /* __G_DBUS_SERVER_H__ */ diff --git a/gio/gdbusutils.c b/gio/gdbusutils.c new file mode 100644 index 0000000..1492053 --- /dev/null +++ b/gio/gdbusutils.c @@ -0,0 +1,734 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include + +#include "gdbusutils.h" + +#include "glibintl.h" + +/** + * SECTION:gdbusutils + * @title: D-Bus Utilities + * @short_description: Various utilities related to D-Bus. + * @include: gio/gio.h + * + * Various utility routines related to D-Bus. + */ + +static gboolean +is_valid_bus_name_character (gint c, + gboolean allow_hyphen) +{ + return + (c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c == '_') || + (allow_hyphen && c == '-'); +} + +static gboolean +is_valid_initial_bus_name_character (gint c, + gboolean allow_initial_digit, + gboolean allow_hyphen) +{ + if (allow_initial_digit) + return is_valid_bus_name_character (c, allow_hyphen); + else + return + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c == '_') || + (allow_hyphen && c == '-'); +} + +static gboolean +is_valid_name (const gchar *start, + guint len, + gboolean allow_initial_digit, + gboolean allow_hyphen) +{ + gboolean ret; + const gchar *s; + const gchar *end; + gboolean has_dot; + + ret = FALSE; + + if (len == 0) + goto out; + + s = start; + end = s + len; + has_dot = FALSE; + while (s != end) + { + if (*s == '.') + { + s += 1; + if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, allow_initial_digit, allow_hyphen))) + goto out; + has_dot = TRUE; + } + else if (G_UNLIKELY (!is_valid_bus_name_character (*s, allow_hyphen))) + { + goto out; + } + s += 1; + } + + if (G_UNLIKELY (!has_dot)) + goto out; + + ret = TRUE; + + out: + return ret; +} + +/** + * g_dbus_is_name: + * @string: The string to check. + * + * Checks if @string is a valid D-Bus bus name (either unique or well-known). + * + * Returns: %TRUE if valid, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_name (const gchar *string) +{ + guint len; + gboolean ret; + const gchar *s; + + g_return_val_if_fail (string != NULL, FALSE); + + ret = FALSE; + + len = strlen (string); + if (G_UNLIKELY (len == 0 || len > 255)) + goto out; + + s = string; + if (*s == ':') + { + /* handle unique name */ + if (!is_valid_name (s + 1, len - 1, TRUE, TRUE)) + goto out; + ret = TRUE; + goto out; + } + else if (G_UNLIKELY (*s == '.')) + { + /* can't start with a . */ + goto out; + } + else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, FALSE, TRUE))) + goto out; + + ret = is_valid_name (s + 1, len - 1, FALSE, TRUE); + + out: + return ret; +} + +/** + * g_dbus_is_unique_name: + * @string: The string to check. + * + * Checks if @string is a valid D-Bus unique bus name. + * + * Returns: %TRUE if valid, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_unique_name (const gchar *string) +{ + gboolean ret; + guint len; + + g_return_val_if_fail (string != NULL, FALSE); + + ret = FALSE; + + len = strlen (string); + if (G_UNLIKELY (len == 0 || len > 255)) + goto out; + + if (G_UNLIKELY (*string != ':')) + goto out; + + if (G_UNLIKELY (!is_valid_name (string + 1, len - 1, TRUE, TRUE))) + goto out; + + ret = TRUE; + + out: + return ret; +} + +/** + * g_dbus_is_member_name: + * @string: The string to check. + * + * Checks if @string is a valid D-Bus member (e.g. signal or method) name. + * + * Returns: %TRUE if valid, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_member_name (const gchar *string) +{ + gboolean ret; + guint n; + + ret = FALSE; + if (G_UNLIKELY (string == NULL)) + goto out; + + if (G_UNLIKELY (!is_valid_initial_bus_name_character (string[0], FALSE, FALSE))) + goto out; + + for (n = 1; string[n] != '\0'; n++) + { + if (G_UNLIKELY (!is_valid_bus_name_character (string[n], FALSE))) + { + goto out; + } + } + + ret = TRUE; + + out: + return ret; +} + +/** + * g_dbus_is_interface_name: + * @string: The string to check. + * + * Checks if @string is a valid D-Bus interface name. + * + * Returns: %TRUE if valid, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_interface_name (const gchar *string) +{ + guint len; + gboolean ret; + const gchar *s; + + g_return_val_if_fail (string != NULL, FALSE); + + ret = FALSE; + + len = strlen (string); + if (G_UNLIKELY (len == 0 || len > 255)) + goto out; + + s = string; + if (G_UNLIKELY (*s == '.')) + { + /* can't start with a . */ + goto out; + } + else if (G_UNLIKELY (!is_valid_initial_bus_name_character (*s, FALSE, FALSE))) + goto out; + + ret = is_valid_name (s + 1, len - 1, FALSE, FALSE); + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* TODO: maybe move to glib? if so, it should conform to http://en.wikipedia.org/wiki/Guid and/or + * http://tools.ietf.org/html/rfc4122 - specifically it should have hyphens then. + */ + +/** + * g_dbus_generate_guid: + * + * Generate a D-Bus GUID that can be used with + * e.g. g_dbus_connection_new(). + * + * See the D-Bus specification regarding what strings are valid D-Bus + * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant). + * + * Returns: A valid D-Bus GUID. Free with g_free(). + * + * Since: 2.26 + */ +gchar * +g_dbus_generate_guid (void) +{ + GString *s; + GTimeVal now; + guint32 r1; + guint32 r2; + guint32 r3; + + s = g_string_new (NULL); + + r1 = g_random_int (); + r2 = g_random_int (); + r3 = g_random_int (); + g_get_current_time (&now); + + g_string_append_printf (s, "%08x", r1); + g_string_append_printf (s, "%08x", r2); + g_string_append_printf (s, "%08x", r3); + g_string_append_printf (s, "%08x", (guint32) now.tv_sec); + + return g_string_free (s, FALSE); +} + +/** + * g_dbus_is_guid: + * @string: The string to check. + * + * Checks if @string is a D-Bus GUID. + * + * See the D-Bus specification regarding what strings are valid D-Bus + * GUID (for example, D-Bus GUIDs are not RFC-4122 compliant). + * + * Returns: %TRUE if @string is a guid, %FALSE otherwise. + * + * Since: 2.26 + */ +gboolean +g_dbus_is_guid (const gchar *string) +{ + gboolean ret; + guint n; + + g_return_val_if_fail (string != NULL, FALSE); + + ret = FALSE; + + for (n = 0; n < 32; n++) + { + if (!g_ascii_isxdigit (string[n])) + goto out; + } + if (string[32] != '\0') + goto out; + + ret = TRUE; + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_dbus_gvariant_to_gvalue: + * @value: A #GVariant. + * @out_gvalue: (out): Return location pointing to a zero-filled (uninitialized) #GValue. + * + * Converts a #GVariant to a #GValue. If @value is floating, it is consumed. + * + * The rules specified in the g_dbus_gvalue_to_gvariant() function are + * used - this function is essentially its reverse form. + * + * The conversion never fails - a valid #GValue is always returned in + * @out_gvalue. + * + * Since: 2.30 + */ +void +g_dbus_gvariant_to_gvalue (GVariant *value, + GValue *out_gvalue) +{ + const GVariantType *type; + gchar **array; + + g_return_if_fail (value != NULL); + g_return_if_fail (out_gvalue != NULL); + + memset (out_gvalue, '\0', sizeof (GValue)); + + switch (g_variant_classify (value)) + { + case G_VARIANT_CLASS_BOOLEAN: + g_value_init (out_gvalue, G_TYPE_BOOLEAN); + g_value_set_boolean (out_gvalue, g_variant_get_boolean (value)); + break; + + case G_VARIANT_CLASS_BYTE: + g_value_init (out_gvalue, G_TYPE_UCHAR); + g_value_set_uchar (out_gvalue, g_variant_get_byte (value)); + break; + + case G_VARIANT_CLASS_INT16: + g_value_init (out_gvalue, G_TYPE_INT); + g_value_set_int (out_gvalue, g_variant_get_int16 (value)); + break; + + case G_VARIANT_CLASS_UINT16: + g_value_init (out_gvalue, G_TYPE_UINT); + g_value_set_uint (out_gvalue, g_variant_get_uint16 (value)); + break; + + case G_VARIANT_CLASS_INT32: + g_value_init (out_gvalue, G_TYPE_INT); + g_value_set_int (out_gvalue, g_variant_get_int32 (value)); + break; + + case G_VARIANT_CLASS_UINT32: + g_value_init (out_gvalue, G_TYPE_UINT); + g_value_set_uint (out_gvalue, g_variant_get_uint32 (value)); + break; + + case G_VARIANT_CLASS_INT64: + g_value_init (out_gvalue, G_TYPE_INT64); + g_value_set_int64 (out_gvalue, g_variant_get_int64 (value)); + break; + + case G_VARIANT_CLASS_UINT64: + g_value_init (out_gvalue, G_TYPE_UINT64); + g_value_set_uint64 (out_gvalue, g_variant_get_uint64 (value)); + break; + + case G_VARIANT_CLASS_DOUBLE: + g_value_init (out_gvalue, G_TYPE_DOUBLE); + g_value_set_double (out_gvalue, g_variant_get_double (value)); + break; + + case G_VARIANT_CLASS_STRING: + g_value_init (out_gvalue, G_TYPE_STRING); + g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + g_value_init (out_gvalue, G_TYPE_STRING); + g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); + break; + + case G_VARIANT_CLASS_SIGNATURE: + g_value_init (out_gvalue, G_TYPE_STRING); + g_value_set_string (out_gvalue, g_variant_get_string (value, NULL)); + break; + + case G_VARIANT_CLASS_ARRAY: + type = g_variant_get_type (value); + switch (g_variant_type_peek_string (type)[1]) + { + case G_VARIANT_CLASS_BYTE: + g_value_init (out_gvalue, G_TYPE_STRING); + g_value_set_string (out_gvalue, g_variant_get_bytestring (value)); + break; + + case G_VARIANT_CLASS_STRING: + g_value_init (out_gvalue, G_TYPE_STRV); + array = g_variant_dup_strv (value, NULL); + g_value_take_boxed (out_gvalue, array); + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + g_value_init (out_gvalue, G_TYPE_STRV); + array = g_variant_dup_objv (value, NULL); + g_value_take_boxed (out_gvalue, array); + break; + + case G_VARIANT_CLASS_ARRAY: + switch (g_variant_type_peek_string (type)[2]) + { + case G_VARIANT_CLASS_BYTE: + g_value_init (out_gvalue, G_TYPE_STRV); + array = g_variant_dup_bytestring_array (value, NULL); + g_value_take_boxed (out_gvalue, array); + break; + + default: + g_value_init (out_gvalue, G_TYPE_VARIANT); + g_value_set_variant (out_gvalue, value); + break; + } + break; + + default: + g_value_init (out_gvalue, G_TYPE_VARIANT); + g_value_set_variant (out_gvalue, value); + break; + } + break; + + case G_VARIANT_CLASS_HANDLE: + case G_VARIANT_CLASS_VARIANT: + case G_VARIANT_CLASS_MAYBE: + case G_VARIANT_CLASS_TUPLE: + case G_VARIANT_CLASS_DICT_ENTRY: + g_value_init (out_gvalue, G_TYPE_VARIANT); + g_value_set_variant (out_gvalue, value); + break; + } +} + + +/** + * g_dbus_gvalue_to_gvariant: + * @gvalue: A #GValue to convert to a #GVariant. + * @type: A #GVariantType. + * + * Converts a #GValue to a #GVariant of the type indicated by the @type parameter. + * + * The conversion is using the following rules: + * + * #GValue / #GVariant conversion rules + * + * + * + * If the #GType for @gvalue is... + * ... then @type must be + * + * + * + * + * #G_TYPE_STRING + * 's', 'o', 'g' or 'ay' + * + * + * #G_TYPE_STRV + * 'as', 'ao' or 'aay' + * + * + * #G_TYPE_BOOLEAN + * 'b' + * + * + * #G_TYPE_UCHAR + * 'y' + * + * + * #G_TYPE_INT + * 'i' or 'n' + * + * + * #G_TYPE_UINT + * 'u' or 'q' + * + * + * #G_TYPE_INT64 + * 'x' + * + * + * #G_TYPE_UINT64 + * 't' + * + * + * #G_TYPE_DOUBLE + * 'd' + * + * + * #G_TYPE_VARIANT + * Any #GVariantType + * + * + * + *
+ * This can fail if e.g. @gvalue is of type #G_TYPE_STRING and @type + * is 'i'. It will + * also fail for any #GType (including e.g. #G_TYPE_OBJECT and + * #G_TYPE_BOXED derived-types) not in the table above. + * + * Note that if @gvalue is of type #G_TYPE_VARIANT and its value is + * %NULL, the empty #GVariant instance (never + * %NULL) for @type is returned (e.g. 0 for scalar types, the empty + * string for string types, '/' for object path + * types, the empty array for any array type and so on). + * + * See the g_dbus_gvariant_to_gvalue() function for how to convert a + * #GVariant to a #GValue. + * + * Returns: A #GVariant (never floating) of #GVariantType + * @type holding the data from @gvalue or %NULL in case of + * failure. Free with g_variant_unref(). + * + * Since: 2.30 + */ +GVariant * +g_dbus_gvalue_to_gvariant (const GValue *gvalue, + const GVariantType *type) +{ + GVariant *ret; + const gchar *s; + const gchar * const *as; + const gchar *empty_strv[1] = {NULL}; + + g_return_val_if_fail (gvalue != NULL, NULL); + g_return_val_if_fail (type != NULL, NULL); + + ret = NULL; + + /* @type can easily be e.g. "s" with the GValue holding a GVariant - for example this + * can happen when using the org.gtk.GDBus.C.ForceGVariant annotation with the + * gdbus-codegen(1) tool. + */ + if (G_VALUE_TYPE (gvalue) == G_TYPE_VARIANT) + { + ret = g_value_dup_variant (gvalue); + } + else + { + switch (g_variant_type_peek_string (type)[0]) + { + case G_VARIANT_CLASS_BOOLEAN: + ret = g_variant_ref_sink (g_variant_new_boolean (g_value_get_boolean (gvalue))); + break; + + case G_VARIANT_CLASS_BYTE: + ret = g_variant_ref_sink (g_variant_new_byte (g_value_get_uchar (gvalue))); + break; + + case G_VARIANT_CLASS_INT16: + ret = g_variant_ref_sink (g_variant_new_int16 (g_value_get_int (gvalue))); + break; + + case G_VARIANT_CLASS_UINT16: + ret = g_variant_ref_sink (g_variant_new_uint16 (g_value_get_uint (gvalue))); + break; + + case G_VARIANT_CLASS_INT32: + ret = g_variant_ref_sink (g_variant_new_int32 (g_value_get_int (gvalue))); + break; + + case G_VARIANT_CLASS_UINT32: + ret = g_variant_ref_sink (g_variant_new_uint32 (g_value_get_uint (gvalue))); + break; + + case G_VARIANT_CLASS_INT64: + ret = g_variant_ref_sink (g_variant_new_int64 (g_value_get_int64 (gvalue))); + break; + + case G_VARIANT_CLASS_UINT64: + ret = g_variant_ref_sink (g_variant_new_uint64 (g_value_get_uint64 (gvalue))); + break; + + case G_VARIANT_CLASS_DOUBLE: + ret = g_variant_ref_sink (g_variant_new_double (g_value_get_double (gvalue))); + break; + + case G_VARIANT_CLASS_STRING: + s = g_value_get_string (gvalue); + if (s == NULL) + s = ""; + ret = g_variant_ref_sink (g_variant_new_string (s)); + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + s = g_value_get_string (gvalue); + if (s == NULL) + s = "/"; + ret = g_variant_ref_sink (g_variant_new_object_path (s)); + break; + + case G_VARIANT_CLASS_SIGNATURE: + s = g_value_get_string (gvalue); + if (s == NULL) + s = ""; + ret = g_variant_ref_sink (g_variant_new_signature (s)); + break; + + case G_VARIANT_CLASS_ARRAY: + switch (g_variant_type_peek_string (type)[1]) + { + case G_VARIANT_CLASS_BYTE: + s = g_value_get_string (gvalue); + if (s == NULL) + s = ""; + ret = g_variant_ref_sink (g_variant_new_bytestring (s)); + break; + + case G_VARIANT_CLASS_STRING: + as = g_value_get_boxed (gvalue); + if (as == NULL) + as = empty_strv; + ret = g_variant_ref_sink (g_variant_new_strv (as, -1)); + break; + + case G_VARIANT_CLASS_OBJECT_PATH: + as = g_value_get_boxed (gvalue); + if (as == NULL) + as = empty_strv; + ret = g_variant_ref_sink (g_variant_new_objv (as, -1)); + break; + + case G_VARIANT_CLASS_ARRAY: + switch (g_variant_type_peek_string (type)[2]) + { + case G_VARIANT_CLASS_BYTE: + as = g_value_get_boxed (gvalue); + if (as == NULL) + as = empty_strv; + ret = g_variant_ref_sink (g_variant_new_bytestring_array (as, -1)); + break; + + default: + ret = g_value_dup_variant (gvalue); + break; + } + break; + + default: + ret = g_value_dup_variant (gvalue); + break; + } + break; + + case G_VARIANT_CLASS_HANDLE: + case G_VARIANT_CLASS_VARIANT: + case G_VARIANT_CLASS_MAYBE: + case G_VARIANT_CLASS_TUPLE: + case G_VARIANT_CLASS_DICT_ENTRY: + ret = g_value_dup_variant (gvalue); + break; + } + } + + /* Could be that the GValue is holding a NULL GVariant - in that case, + * we return an "empty" GVariant instead of a NULL GVariant + */ + if (ret == NULL) + { + GVariant *untrusted_empty; + untrusted_empty = g_variant_new_from_data (type, NULL, 0, FALSE, NULL, NULL); + ret = g_variant_ref_sink (g_variant_get_normal_form (untrusted_empty)); + g_variant_unref (untrusted_empty); + } + + g_assert (!g_variant_is_floating (ret)); + + return ret; +} diff --git a/gio/gdbusutils.h b/gio/gdbusutils.h new file mode 100644 index 0000000..6ef2ffd --- /dev/null +++ b/gio/gdbusutils.h @@ -0,0 +1,57 @@ +/* GDBus - GLib D-Bus Library + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#ifndef __G_DBUS_UTILS_H__ +#define __G_DBUS_UTILS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_guid (const gchar *string); +GLIB_AVAILABLE_IN_ALL +gchar *g_dbus_generate_guid (void); + +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_name (const gchar *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_unique_name (const gchar *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_member_name (const gchar *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_dbus_is_interface_name (const gchar *string); + +GLIB_AVAILABLE_IN_ALL +void g_dbus_gvariant_to_gvalue (GVariant *value, + GValue *out_gvalue); +GLIB_AVAILABLE_IN_ALL +GVariant *g_dbus_gvalue_to_gvariant (const GValue *gvalue, + const GVariantType *type); + +G_END_DECLS + +#endif /* __G_DBUS_UTILS_H__ */ diff --git a/gio/gdelayedsettingsbackend.c b/gio/gdelayedsettingsbackend.c new file mode 100644 index 0000000..6f3c411 --- /dev/null +++ b/gio/gdelayedsettingsbackend.c @@ -0,0 +1,493 @@ +/* + * 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 "gdelayedsettingsbackend.h" +#include "gsettingsbackendinternal.h" + +#include + + +struct _GDelayedSettingsBackendPrivate +{ + GSettingsBackend *backend; + GMutex lock; + GTree *delayed; + + GMainContext *owner_context; + gpointer owner; +}; + +G_DEFINE_TYPE (GDelayedSettingsBackend, + g_delayed_settings_backend, + G_TYPE_SETTINGS_BACKEND) + +static gboolean +invoke_notify_unapplied (gpointer data) +{ + g_object_notify (data, "has-unapplied"); + g_object_unref (data); + + return FALSE; +} + +static void +g_delayed_settings_backend_notify_unapplied (GDelayedSettingsBackend *delayed) +{ + GMainContext *target_context; + GObject *target; + + g_mutex_lock (&delayed->priv->lock); + if (delayed->priv->owner) + { + target_context = delayed->priv->owner_context; + target = g_object_ref (delayed->priv->owner); + } + else + { + target_context = NULL; + target = NULL; + } + g_mutex_unlock (&delayed->priv->lock); + + if (target != NULL) + g_main_context_invoke (target_context, invoke_notify_unapplied, target); +} + + +static GVariant * +g_delayed_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + gpointer result = NULL; + + if (!default_value) + { + g_mutex_lock (&delayed->priv->lock); + if (g_tree_lookup_extended (delayed->priv->delayed, key, NULL, &result)) + { + /* NULL in the tree means we should consult the default value */ + if (result != NULL) + g_variant_ref (result); + else + default_value = TRUE; + } + g_mutex_unlock (&delayed->priv->lock); + } + + if (result == NULL) + result = g_settings_backend_read (delayed->priv->backend, key, + expected_type, default_value); + + return result; +} + +static gboolean +g_delayed_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + gboolean was_empty; + + g_mutex_lock (&delayed->priv->lock); + was_empty = g_tree_nnodes (delayed->priv->delayed) == 0; + g_tree_insert (delayed->priv->delayed, g_strdup (key), + g_variant_ref_sink (value)); + g_mutex_unlock (&delayed->priv->lock); + + g_settings_backend_changed (backend, key, origin_tag); + + if (was_empty) + g_delayed_settings_backend_notify_unapplied (delayed); + + return TRUE; +} + +static gboolean +add_to_tree (gpointer key, + gpointer value, + gpointer user_data) +{ + g_tree_insert (user_data, g_strdup (key), g_variant_ref (value)); + return FALSE; +} + +static gboolean +g_delayed_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + gboolean was_empty; + + g_mutex_lock (&delayed->priv->lock); + was_empty = g_tree_nnodes (delayed->priv->delayed) == 0; + + g_tree_foreach (tree, add_to_tree, delayed->priv->delayed); + g_mutex_unlock (&delayed->priv->lock); + + g_settings_backend_changed_tree (backend, tree, origin_tag); + + if (was_empty) + g_delayed_settings_backend_notify_unapplied (delayed); + + return TRUE; +} + +static gboolean +g_delayed_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *name) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + + return g_settings_backend_get_writable (delayed->priv->backend, name); +} + +static void +g_delayed_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + gboolean was_empty; + + g_mutex_lock (&delayed->priv->lock); + was_empty = g_tree_nnodes (delayed->priv->delayed) == 0; + g_tree_insert (delayed->priv->delayed, g_strdup (key), NULL); + g_mutex_unlock (&delayed->priv->lock); + + if (was_empty) + g_delayed_settings_backend_notify_unapplied (delayed); +} + +static void +g_delayed_settings_backend_subscribe (GSettingsBackend *backend, + const char *name) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + + g_settings_backend_subscribe (delayed->priv->backend, name); +} + +static void +g_delayed_settings_backend_unsubscribe (GSettingsBackend *backend, + const char *name) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + + g_settings_backend_unsubscribe (delayed->priv->backend, name); +} + +static GPermission * +g_delayed_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (backend); + + return g_settings_backend_get_permission (delayed->priv->backend, path); +} + + +/* method calls */ +gboolean +g_delayed_settings_backend_get_has_unapplied (GDelayedSettingsBackend *delayed) +{ + /* we don't need to lock for this... */ + + return g_tree_nnodes (delayed->priv->delayed) > 0; +} + +void +g_delayed_settings_backend_apply (GDelayedSettingsBackend *delayed) +{ + if (g_tree_nnodes (delayed->priv->delayed) > 0) + { + gboolean success; + GTree *tmp; + + g_mutex_lock (&delayed->priv->lock); + tmp = delayed->priv->delayed; + delayed->priv->delayed = g_settings_backend_create_tree (); + success = g_settings_backend_write_tree (delayed->priv->backend, + tmp, delayed->priv); + g_mutex_unlock (&delayed->priv->lock); + + if (!success) + g_settings_backend_changed_tree (G_SETTINGS_BACKEND (delayed), + tmp, NULL); + + g_tree_unref (tmp); + + g_delayed_settings_backend_notify_unapplied (delayed); + } +} + +void +g_delayed_settings_backend_revert (GDelayedSettingsBackend *delayed) +{ + if (g_tree_nnodes (delayed->priv->delayed) > 0) + { + GTree *tmp; + + g_mutex_lock (&delayed->priv->lock); + tmp = delayed->priv->delayed; + delayed->priv->delayed = g_settings_backend_create_tree (); + g_mutex_unlock (&delayed->priv->lock); + g_settings_backend_changed_tree (G_SETTINGS_BACKEND (delayed), tmp, NULL); + g_tree_unref (tmp); + + g_delayed_settings_backend_notify_unapplied (delayed); + } +} + +/* change notification */ +static void +delayed_backend_changed (GObject *target, + GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target); + + if (origin_tag != delayed->priv) + g_settings_backend_changed (G_SETTINGS_BACKEND (delayed), + key, origin_tag); +} + +static void +delayed_backend_keys_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path, + const gchar * const *items, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target); + + if (origin_tag != delayed->priv) + g_settings_backend_keys_changed (G_SETTINGS_BACKEND (delayed), + path, items, origin_tag); +} + +static void +delayed_backend_path_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path, + gpointer origin_tag) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target); + + if (origin_tag != delayed->priv) + g_settings_backend_path_changed (G_SETTINGS_BACKEND (delayed), + path, origin_tag); +} + +static void +delayed_backend_writable_changed (GObject *target, + GSettingsBackend *backend, + const gchar *key) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target); + gboolean last_one = FALSE; + + g_mutex_lock (&delayed->priv->lock); + + if (g_tree_lookup (delayed->priv->delayed, key) != NULL && + !g_settings_backend_get_writable (delayed->priv->backend, key)) + { + /* drop the key from our changeset if it just became read-only. + * no need to signal since the writable change below implies it. + * + * note that the item in the tree may very well be set to NULL in + * the case that the user stored a reset. we intentionally don't + * drop the key in this case since a reset will always succeed + * (even against a non-writable key). + */ + g_tree_remove (delayed->priv->delayed, key); + + /* if that was the only key... */ + last_one = g_tree_nnodes (delayed->priv->delayed) == 0; + } + + g_mutex_unlock (&delayed->priv->lock); + + if (last_one) + g_delayed_settings_backend_notify_unapplied (delayed); + + g_settings_backend_writable_changed (G_SETTINGS_BACKEND (delayed), key); +} + +/* slow method until we get foreach-with-remove in GTree + */ +typedef struct +{ + const gchar *path; + const gchar **keys; + gsize index; +} CheckPrefixState; + +static gboolean +check_prefix (gpointer key, + gpointer value, + gpointer data) +{ + CheckPrefixState *state = data; + + if (g_str_has_prefix (key, state->path)) + state->keys[state->index++] = key; + + return FALSE; +} + +static void +delayed_backend_path_writable_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (target); + gboolean last_one = FALSE; + gsize n_keys; + + g_mutex_lock (&delayed->priv->lock); + + n_keys = g_tree_nnodes (delayed->priv->delayed); + + if (n_keys > 0) + { + CheckPrefixState state = { path, g_new (const gchar *, n_keys) }; + gsize i; + + /* collect a list of possibly-affected keys (ie: matching the path) */ + g_tree_foreach (delayed->priv->delayed, check_prefix, &state); + + /* drop the keys that have been affected. + * + * don't drop 'reset' keys (see above) */ + for (i = 0; i < state.index; i++) + if (g_tree_lookup (delayed->priv->delayed, state.keys[i]) != NULL && + !g_settings_backend_get_writable (delayed->priv->backend, + state.keys[i])) + g_tree_remove (delayed->priv->delayed, state.keys[i]); + + g_free (state.keys); + + last_one = g_tree_nnodes (delayed->priv->delayed) == 0; + } + + g_mutex_unlock (&delayed->priv->lock); + + if (last_one) + g_delayed_settings_backend_notify_unapplied (delayed); + + g_settings_backend_path_writable_changed (G_SETTINGS_BACKEND (delayed), + path); +} + +static void +g_delayed_settings_backend_finalize (GObject *object) +{ + GDelayedSettingsBackend *delayed = G_DELAYED_SETTINGS_BACKEND (object); + + g_mutex_clear (&delayed->priv->lock); + g_object_unref (delayed->priv->backend); + g_tree_unref (delayed->priv->delayed); + + /* if our owner is still alive, why are we finalizing? */ + g_assert (delayed->priv->owner == NULL); + + G_OBJECT_CLASS (g_delayed_settings_backend_parent_class) + ->finalize (object); +} + +static void +g_delayed_settings_backend_class_init (GDelayedSettingsBackendClass *class) +{ + GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + g_type_class_add_private (class, sizeof (GDelayedSettingsBackendPrivate)); + + backend_class->read = g_delayed_settings_backend_read; + backend_class->write = g_delayed_settings_backend_write; + backend_class->write_tree = g_delayed_settings_backend_write_tree; + backend_class->reset = g_delayed_settings_backend_reset; + backend_class->get_writable = g_delayed_settings_backend_get_writable; + backend_class->subscribe = g_delayed_settings_backend_subscribe; + backend_class->unsubscribe = g_delayed_settings_backend_unsubscribe; + backend_class->get_permission = g_delayed_settings_backend_get_permission; + + object_class->finalize = g_delayed_settings_backend_finalize; +} + +static void +g_delayed_settings_backend_init (GDelayedSettingsBackend *delayed) +{ + delayed->priv = + G_TYPE_INSTANCE_GET_PRIVATE (delayed, G_TYPE_DELAYED_SETTINGS_BACKEND, + GDelayedSettingsBackendPrivate); + + delayed->priv->delayed = g_settings_backend_create_tree (); + g_mutex_init (&delayed->priv->lock); +} + +static void +g_delayed_settings_backend_disown (gpointer data, + GObject *where_the_object_was) +{ + GDelayedSettingsBackend *delayed = data; + + g_mutex_lock (&delayed->priv->lock); + delayed->priv->owner_context = NULL; + delayed->priv->owner = NULL; + g_mutex_unlock (&delayed->priv->lock); +} + +GDelayedSettingsBackend * +g_delayed_settings_backend_new (GSettingsBackend *backend, + gpointer owner, + GMainContext *owner_context) +{ + static GSettingsListenerVTable vtable = { + delayed_backend_changed, + delayed_backend_path_changed, + delayed_backend_keys_changed, + delayed_backend_writable_changed, + delayed_backend_path_writable_changed + }; + GDelayedSettingsBackend *delayed; + + delayed = g_object_new (G_TYPE_DELAYED_SETTINGS_BACKEND, NULL); + delayed->priv->backend = g_object_ref (backend); + delayed->priv->owner_context = owner_context; + delayed->priv->owner = owner; + + g_object_weak_ref (owner, g_delayed_settings_backend_disown, delayed); + + g_settings_backend_watch (delayed->priv->backend, + &vtable, G_OBJECT (delayed), NULL); + + return delayed; +} diff --git a/gio/gdelayedsettingsbackend.h b/gio/gdelayedsettingsbackend.h new file mode 100644 index 0000000..92a4851 --- /dev/null +++ b/gio/gdelayedsettingsbackend.h @@ -0,0 +1,67 @@ +/* + * 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_DELAYED_SETTINGS_BACKEND_H__ +#define __G_DELAYED_SETTINGS_BACKEND_H__ + +#include + +#include + +#define G_TYPE_DELAYED_SETTINGS_BACKEND (g_delayed_settings_backend_get_type ()) +#define G_DELAYED_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_DELAYED_SETTINGS_BACKEND, \ + GDelayedSettingsBackend)) +#define G_DELAYED_SETTINGS_BACKEND_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_DELAYED_SETTINGS_BACKEND, \ + GDelayedSettingsBackendClass)) +#define G_IS_DELAYED_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_DELAYED_SETTINGS_BACKEND)) +#define G_IS_DELAYED_SETTINGS_BACKEND_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_DELAYED_SETTINGS_BACKEND)) +#define G_DELAYED_SETTINGS_BACKEND_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_DELAYED_SETTINGS_BACKEND, \ + GDelayedSettingsBackendClass)) + +typedef struct _GDelayedSettingsBackendPrivate GDelayedSettingsBackendPrivate; +typedef struct _GDelayedSettingsBackendClass GDelayedSettingsBackendClass; +typedef struct _GDelayedSettingsBackend GDelayedSettingsBackend; + +struct _GDelayedSettingsBackendClass +{ + GSettingsBackendClass parent_class; +}; + +struct _GDelayedSettingsBackend +{ + GSettingsBackend parent_instance; + GDelayedSettingsBackendPrivate *priv; +}; + +GType g_delayed_settings_backend_get_type (void); +GDelayedSettingsBackend * g_delayed_settings_backend_new (GSettingsBackend *backend, + gpointer owner, + GMainContext *owner_context); +void g_delayed_settings_backend_revert (GDelayedSettingsBackend *delayed); +void g_delayed_settings_backend_apply (GDelayedSettingsBackend *delayed); +gboolean g_delayed_settings_backend_get_has_unapplied (GDelayedSettingsBackend *delayed); + +#endif /* __G_DELAYED_SETTINGS_BACKEND_H__ */ diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c new file mode 100644 index 0000000..c60939c --- /dev/null +++ b/gio/gdesktopappinfo.c @@ -0,0 +1,3544 @@ +/* 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 + +#ifdef HAVE_CRT_EXTERNS_H +#include +#endif + +#include "gcontenttypeprivate.h" +#include "gdesktopappinfo.h" +#ifdef G_OS_UNIX +#include "glib-unix.h" +#endif +#include "gfile.h" +#include "gioerror.h" +#include "gthemedicon.h" +#include "gfileicon.h" +#include +#include "glibintl.h" +#include "giomodule-priv.h" +#include "gappinfo.h" + + +/** + * SECTION:gdesktopappinfo + * @title: 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 GENERIC_NAME_KEY "GenericName" +#define FULL_NAME_KEY "X-GNOME-FullName" +#define KEYWORDS_KEY "Keywords" +#define STARTUP_WM_CLASS_KEY "StartupWMClass" + +enum { + PROP_0, + PROP_FILENAME +}; + +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, + gboolean include_fallback, + char **explicit_default); +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; + + GKeyFile *keyfile; + + char *name; + char *generic_name; + char *fullname; + char *comment; + char *icon_name; + GIcon *icon; + char **keywords; + char **only_show_in; + char **not_show_in; + char *try_exec; + char *exec; + char *binary; + char *path; + char *categories; + char *startup_wm_class; + char **mime_types; + + guint nodisplay : 1; + guint hidden : 1; + guint terminal : 1; + guint startup_notify : 1; + guint no_fuse : 1; +}; + +typedef enum { + UPDATE_MIME_NONE = 1 << 0, + UPDATE_MIME_SET_DEFAULT = 1 << 1, + UPDATE_MIME_SET_NON_DEFAULT = 1 << 2, + UPDATE_MIME_REMOVE = 1 << 3, + UPDATE_MIME_SET_LAST_USED = 1 << 4, +} UpdateMimeFlags; + +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)) + +G_LOCK_DEFINE_STATIC (g_desktop_env); +static gchar *g_desktop_env = NULL; + +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); + + if (info->keyfile) + g_key_file_unref (info->keyfile); + + g_free (info->name); + g_free (info->generic_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->keywords); + 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_free (info->categories); + g_free (info->startup_wm_class); + g_strfreev (info->mime_types); + + G_OBJECT_CLASS (g_desktop_app_info_parent_class)->finalize (object); +} + +static void +g_desktop_app_info_set_property(GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GDesktopAppInfo *self = G_DESKTOP_APP_INFO (object); + + switch (prop_id) + { + case PROP_FILENAME: + self->filename = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_desktop_app_info_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GDesktopAppInfo *self = G_DESKTOP_APP_INFO (object); + + switch (prop_id) + { + case PROP_FILENAME: + g_value_set_string (value, self->filename); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_desktop_app_info_class_init (GDesktopAppInfoClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = g_desktop_app_info_get_property; + gobject_class->set_property = g_desktop_app_info_set_property; + gobject_class->finalize = g_desktop_app_info_finalize; + + /** + * GDesktopAppInfo:filename: + * + * The origin filename of this #GDesktopAppInfo + */ + g_object_class_install_property (gobject_class, + PROP_FILENAME, + g_param_spec_string ("filename", "Filename", "", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +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); + +} + +static gboolean +g_desktop_app_info_load_from_keyfile (GDesktopAppInfo *info, + GKeyFile *key_file) +{ + 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 FALSE; + } + 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 FALSE; + } + 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 FALSE; + } + g_free (t); + } + + info->name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, NULL, NULL); + info->generic_name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, GENERIC_NAME_KEY, NULL, NULL); + info->fullname = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, FULL_NAME_KEY, NULL, NULL); + info->keywords = g_key_file_get_locale_string_list (key_file, G_KEY_FILE_DESKTOP_GROUP, KEYWORDS_KEY, NULL, 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->categories = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_CATEGORIES, NULL); + info->startup_wm_class = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, STARTUP_WM_CLASS_KEY, NULL); + info->mime_types = g_key_file_get_string_list (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_MIME_TYPE, NULL, NULL); + + 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; + } + + info->keyfile = g_key_file_ref (key_file); + + return TRUE; +} + +static gboolean +g_desktop_app_info_load_file (GDesktopAppInfo *self) +{ + GKeyFile *key_file; + gboolean retval = FALSE; + + g_return_val_if_fail (self->filename != NULL, FALSE); + + key_file = g_key_file_new (); + + if (g_key_file_load_from_file (key_file, + self->filename, + G_KEY_FILE_NONE, + NULL)) + { + retval = g_desktop_app_info_load_from_keyfile (self, key_file); + } + + g_key_file_unref (key_file); + return retval; +} + +/** + * 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; + + info = g_object_new (G_TYPE_DESKTOP_APP_INFO, NULL); + info->filename = NULL; + if (!g_desktop_app_info_load_from_keyfile (info, key_file)) + { + g_object_unref (info); + return 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) +{ + GDesktopAppInfo *info = NULL; + + info = g_object_new (G_TYPE_DESKTOP_APP_INFO, "filename", filename, NULL); + if (!g_desktop_app_info_load_file (info)) + { + g_object_unref (info); + return NULL; + } + 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); + + if (info->keyfile) + new_info->keyfile = g_key_file_ref (info->keyfile); + + new_info->name = g_strdup (info->name); + new_info->generic_name = g_strdup (info->generic_name); + new_info->fullname = g_strdup (info->fullname); + new_info->keywords = g_strdupv (info->keywords); + 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; +} + +/** + * g_desktop_app_info_get_categories: + * @info: a #GDesktopAppInfo + * + * Gets the categories from the desktop file. + * + * Returns: The unparsed Categories key from the desktop file; + * i.e. no attempt is made to split it by ';' or validate it. + */ +const char * +g_desktop_app_info_get_categories (GDesktopAppInfo *info) +{ + return info->categories; +} + +/** + * g_desktop_app_info_get_keywords: + * @info: a #GDesktopAppInfo + * + * Gets the keywords from the desktop file. + * + * Returns: (transfer none): The value of the Keywords key + * + * Since: 2.32 + */ +const char * const * +g_desktop_app_info_get_keywords (GDesktopAppInfo *info) +{ + return (const char * const *)info->keywords; +} + +/** + * g_desktop_app_info_get_generic_name: + * @info: a #GDesktopAppInfo + * + * Gets the generic name from the destkop file. + * + * Returns: The value of the GenericName key + */ +const char * +g_desktop_app_info_get_generic_name (GDesktopAppInfo *info) +{ + return info->generic_name; +} + +/** + * g_desktop_app_info_get_nodisplay: + * @info: a #GDesktopAppInfo + * + * Gets the value of the NoDisplay key, which helps determine if the + * application info should be shown in menus. See + * #G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY and g_app_info_should_show(). + * + * Returns: The value of the NoDisplay key + * + * Since: 2.30 + */ +gboolean +g_desktop_app_info_get_nodisplay (GDesktopAppInfo *info) +{ + return info->nodisplay; +} + +/** + * g_desktop_app_info_get_show_in: + * @info: a #GDesktopAppInfo + * @desktop_env: a string specifying a desktop name + * + * Checks if the application info should be shown in menus that list available + * applications for a specific name of the desktop, based on the + * OnlyShowIn and NotShowIn keys. + * + * If @desktop_env is %NULL, then the name of the desktop set with + * g_desktop_app_info_set_desktop_env() is used. + * + * Note that g_app_info_should_show() for @info will include this check (with + * %NULL for @desktop_env) as well as additional checks. + * + * Returns: %TRUE if the @info should be shown in @desktop_env according to the + * OnlyShowIn and NotShowIn keys, %FALSE + * otherwise. + * + * Since: 2.30 + */ +gboolean +g_desktop_app_info_get_show_in (GDesktopAppInfo *info, + const gchar *desktop_env) +{ + gboolean found; + int i; + + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE); + + if (!desktop_env) { + 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; +} + +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 "); + expanded = g_shell_quote (info->icon_name); + g_string_append (exec, expanded); + g_free (expanded); + } + break; + + case 'c': + if (info->name) + { + expanded = g_shell_quote (info->name); + g_string_append (exec, expanded); + g_free (expanded); + } + break; + + case 'k': + if (info->filename) + { + expanded = g_shell_quote (info->filename); + g_string_append (exec, expanded); + g_free (expanded); + } + 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 * +create_files_for_uris (GList *uris) +{ + GList *res; + GList *iter; + + res = NULL; + + for (iter = uris; iter; iter = iter->next) + { + GFile *file = g_file_new_for_uri ((char *)iter->data); + res = g_list_prepend (res, file); + } + + return g_list_reverse (res); +} + +typedef struct +{ + GSpawnChildSetupFunc user_setup; + gpointer user_setup_data; + + char *pid_envvar; +} ChildSetupData; + +static void +child_setup (gpointer user_data) +{ + ChildSetupData *data = user_data; + + if (data->pid_envvar) + { + pid_t pid = getpid (); + char buf[20]; + int i; + + /* Write the pid into the space already reserved for it in the + * environment array. We can't use sprintf because it might + * malloc, so we do it by hand. It's simplest to write the pid + * out backwards first, then copy it over. + */ + for (i = 0; pid; i++, pid /= 10) + buf[i] = (pid % 10) + '0'; + for (i--; i >= 0; i--) + *(data->pid_envvar++) = buf[i]; + *data->pid_envvar = '\0'; + } + + if (data->user_setup) + data->user_setup (data->user_setup_data); +} + +static void +notify_desktop_launch (GDBusConnection *session_bus, + GDesktopAppInfo *info, + long pid, + const char *display, + const char *sn_id, + GList *uris) +{ + GDBusMessage *msg; + GVariantBuilder uri_variant; + GVariantBuilder extras_variant; + GList *iter; + const char *desktop_file_id; + const char *gio_desktop_file; + + if (session_bus == NULL) + return; + + g_variant_builder_init (&uri_variant, G_VARIANT_TYPE ("as")); + for (iter = uris; iter; iter = iter->next) + g_variant_builder_add (&uri_variant, "s", iter->data); + + g_variant_builder_init (&extras_variant, G_VARIANT_TYPE ("a{sv}")); + if (sn_id != NULL && g_utf8_validate (sn_id, -1, NULL)) + g_variant_builder_add (&extras_variant, "{sv}", + "startup-id", + g_variant_new ("s", + sn_id)); + gio_desktop_file = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE"); + if (gio_desktop_file != NULL) + g_variant_builder_add (&extras_variant, "{sv}", + "origin-desktop-file", + g_variant_new_bytestring (gio_desktop_file)); + if (g_get_prgname () != NULL) + g_variant_builder_add (&extras_variant, "{sv}", + "origin-prgname", + g_variant_new_bytestring (g_get_prgname ())); + g_variant_builder_add (&extras_variant, "{sv}", + "origin-pid", + g_variant_new ("x", + (gint64)getpid ())); + + if (info->filename) + desktop_file_id = info->filename; + else if (info->desktop_id) + desktop_file_id = info->desktop_id; + else + desktop_file_id = ""; + + msg = g_dbus_message_new_signal ("/org/gtk/gio/DesktopAppInfo", + "org.gtk.gio.DesktopAppInfo", + "Launched"); + g_dbus_message_set_body (msg, g_variant_new ("(@aysxasa{sv})", + g_variant_new_bytestring (desktop_file_id), + display ? display : "", + (gint64)pid, + &uri_variant, + &extras_variant)); + g_dbus_connection_send_message (session_bus, + msg, 0, + NULL, + NULL); + g_object_unref (msg); +} + +#define _SPAWN_FLAGS_DEFAULT (G_SPAWN_SEARCH_PATH) + +static gboolean +_g_desktop_app_info_launch_uris_internal (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GSpawnFlags spawn_flags, + GSpawnChildSetupFunc user_setup, + gpointer user_setup_data, + GDesktopAppLaunchCallback pid_callback, + gpointer pid_callback_data, + GError **error) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + GDBusConnection *session_bus; + gboolean completed = FALSE; + GList *old_uris; + char **argv, **envp; + int argc; + ChildSetupData data; + + g_return_val_if_fail (appinfo != NULL, FALSE); + + argv = NULL; + + session_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + if (launch_context) + envp = g_app_launch_context_get_environment (launch_context); + else + envp = g_get_environ (); + + do + { + GPid pid; + GList *launched_uris; + GList *iter; + char *display, *sn_id; + + old_uris = uris; + if (!expand_application_parameters (info, &uris, + &argc, &argv, error)) + goto out; + + /* Get the subset of URIs we're launching with this process */ + launched_uris = NULL; + for (iter = old_uris; iter != NULL && iter != uris; iter = iter->next) + launched_uris = g_list_prepend (launched_uris, iter->data); + launched_uris = g_list_reverse (launched_uris); + + 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.user_setup = user_setup; + data.user_setup_data = user_setup_data; + + if (info->filename) + { + envp = g_environ_setenv (envp, + "GIO_LAUNCHED_DESKTOP_FILE", + info->filename, + TRUE); + envp = g_environ_setenv (envp, + "GIO_LAUNCHED_DESKTOP_FILE_PID", + "XXXXXXXXXXXXXXXXXXXX", /* filled in child_setup */ + TRUE); + data.pid_envvar = (char *)g_environ_getenv (envp, "GIO_LAUNCHED_DESKTOP_FILE_PID"); + } + else + { + data.pid_envvar = NULL; + } + + display = NULL; + sn_id = NULL; + if (launch_context) + { + GList *launched_files = create_files_for_uris (launched_uris); + + display = g_app_launch_context_get_display (launch_context, + appinfo, + launched_files); + if (display) + envp = g_environ_setenv (envp, "DISPLAY", display, TRUE); + + if (info->startup_notify) + { + sn_id = g_app_launch_context_get_startup_notify_id (launch_context, + appinfo, + launched_files); + envp = g_environ_setenv (envp, "DESKTOP_STARTUP_ID", sn_id, TRUE); + } + + g_list_free_full (launched_files, g_object_unref); + } + + if (!g_spawn_async (info->path, + argv, + envp, + spawn_flags, + child_setup, + &data, + &pid, + error)) + { + if (sn_id) + g_app_launch_context_launch_failed (launch_context, sn_id); + + g_free (display); + g_free (sn_id); + g_list_free (launched_uris); + + goto out; + } + + if (pid_callback != NULL) + pid_callback (info, pid, pid_callback_data); + + if (launch_context != NULL) + { + GVariantBuilder builder; + GVariant *platform_data; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (&builder, "{sv}", "pid", g_variant_new_int32 (pid)); + if (sn_id) + g_variant_builder_add (&builder, "{sv}", "startup-notification-id", g_variant_new_string (sn_id)); + platform_data = g_variant_ref_sink (g_variant_builder_end (&builder)); + g_signal_emit_by_name (launch_context, "launched", info, platform_data); + g_variant_unref (platform_data); + } + + notify_desktop_launch (session_bus, + info, + pid, + display, + sn_id, + launched_uris); + + g_free (display); + g_free (sn_id); + g_list_free (launched_uris); + + g_strfreev (argv); + argv = NULL; + } + while (uris != NULL); + + /* TODO - need to handle the process exiting immediately + * after launching an app. See http://bugzilla.gnome.org/606960 + */ + if (session_bus != NULL) + { + /* This asynchronous flush holds a reference until it completes, + * which ensures that the following unref won't immediately kill + * the connection if we were the initial owner. + */ + g_dbus_connection_flush (session_bus, NULL, NULL, NULL); + } + + completed = TRUE; + + out: + g_clear_object (&session_bus); + g_strfreev (argv); + g_strfreev (envp); + + return completed; +} + +static gboolean +g_desktop_app_info_launch_uris (GAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GError **error) +{ + return _g_desktop_app_info_launch_uris_internal (appinfo, uris, + launch_context, + _SPAWN_FLAGS_DEFAULT, + NULL, NULL, NULL, NULL, + error); +} + +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_free_full (uris, g_free); + + return res; +} + +/** + * g_desktop_app_info_launch_uris_as_manager: + * @appinfo: a #GDesktopAppInfo + * @uris: (element-type utf8): List of URIs + * @launch_context: a #GAppLaunchContext + * @spawn_flags: #GSpawnFlags, used for each process + * @user_setup: (scope call): a #GSpawnChildSetupFunc, used once for + * each process. + * @user_setup_data: (closure user_setup): User data for @user_setup + * @pid_callback: (scope call): Callback for child processes + * @pid_callback_data: (closure pid_callback): User data for @callback + * @error: return location for a #GError, or %NULL + * + * This function performs the equivalent of g_app_info_launch_uris(), + * but is intended primarily for operating system components that + * launch applications. Ordinary applications should use + * g_app_info_launch_uris(). + * + * In contrast to g_app_info_launch_uris(), all processes created will + * always be run directly as children as if by the UNIX fork()/exec() + * calls. + * + * This guarantee allows additional control over the exact environment + * of the child processes, which is provided via a setup function + * @user_setup, as well as the process identifier of each child process + * via @pid_callback. See g_spawn_async() for more information about the + * semantics of the @user_setup function. + * + * Returns: %TRUE on successful launch, %FALSE otherwise. + */ +gboolean +g_desktop_app_info_launch_uris_as_manager (GDesktopAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GSpawnFlags spawn_flags, + GSpawnChildSetupFunc user_setup, + gpointer user_setup_data, + GDesktopAppLaunchCallback pid_callback, + gpointer pid_callback_data, + GError **error) +{ + return _g_desktop_app_info_launch_uris_internal ((GAppInfo*)appinfo, + uris, + launch_context, + spawn_flags, + user_setup, + user_setup_data, + pid_callback, + pid_callback_data, + error); +} + +/** + * 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() and + * g_desktop_app_info_get_show_in() to evaluate the + * OnlyShowIn and NotShowIn + * desktop entry fields. + * + * The Desktop + * Menu specification recognizes the following: + * + * GNOME + * KDE + * ROX + * XFCE + * LXDE + * Unity + * 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); + + if (info->nodisplay) + return FALSE; + + return g_desktop_app_info_get_show_in (info, NULL); +} + +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, + UpdateMimeFlags flags, + GError **error) +{ + char *dirname, *filename, *string; + GKeyFile *key_file; + gboolean load_succeeded, res; + char **old_list, **list; + gsize length, data_size; + char *data; + int i, j, k; + char **content_types; + + /* Don't add both at start and end */ + g_assert (!((flags & UPDATE_MIME_SET_DEFAULT) && + (flags & UPDATE_MIME_SET_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_has_group (key_file, REMOVED_ASSOCIATIONS_GROUP) && + !g_key_file_has_group (key_file, DEFAULT_APPLICATIONS_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, DEFAULT_APPLICATIONS_GROUP, NULL, NULL); + } + + for (k = 0; content_types && content_types[k]; k++) + { + /* set as default, if requested so */ + string = g_key_file_get_string (key_file, + DEFAULT_APPLICATIONS_GROUP, + content_types[k], + NULL); + + if (g_strcmp0 (string, desktop_id) != 0 && + (flags & UPDATE_MIME_SET_DEFAULT)) + { + g_free (string); + string = g_strdup (desktop_id); + + /* add in the non-default list too, if it's not already there */ + flags |= UPDATE_MIME_SET_NON_DEFAULT; + } + + if (string == NULL || desktop_id == NULL) + g_key_file_remove_key (key_file, + DEFAULT_APPLICATIONS_GROUP, + content_types[k], + NULL); + else + g_key_file_set_string (key_file, + DEFAULT_APPLICATIONS_GROUP, + content_types[k], + string); + + g_free (string); + } + + if (content_type) + { + /* reuse the list from above */ + } + else + { + g_strfreev (content_types); + 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 we're adding a last-used hint, just put the application in front of the list */ + if (flags & UPDATE_MIME_SET_LAST_USED) + { + /* avoid adding this again as non-default later */ + if (flags & UPDATE_MIME_SET_NON_DEFAULT) + flags ^= UPDATE_MIME_SET_NON_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) + { + /* rewrite other entries if they're different from the new one */ + list[i++] = g_strdup (old_list[j]); + } + else if (flags & UPDATE_MIME_SET_NON_DEFAULT) + { + /* we encountered an old entry which is equal to the one we're adding as non-default, + * don't change its position in the list. + */ + flags ^= UPDATE_MIME_SET_NON_DEFAULT; + list[i++] = g_strdup (old_list[j]); + } + } + } + + /* add it at the end of the list */ + if (flags & UPDATE_MIME_SET_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 (flags & UPDATE_MIME_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_last_used_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; + + if (!info->desktop_id) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Application information lacks an identifier")); + return FALSE; + } + + /* both add support for the content type and set as last used */ + return update_mimeapps_list (info->desktop_id, content_type, + UPDATE_MIME_SET_NON_DEFAULT | + UPDATE_MIME_SET_LAST_USED, + error); +} + +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; + + if (!info->desktop_id) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Application information lacks an identifier")); + return FALSE; + } + + return update_mimeapps_list (info->desktop_id, content_type, + UPDATE_MIME_SET_DEFAULT, + error); +} + +static void +update_program_done (GPid pid, + gint status, + gpointer data) +{ + /* Did the application exit correctly */ + if (g_spawn_check_exit_status (status, NULL)) + { + /* 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, + UPDATE_MIME_SET_NON_DEFAULT, + 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, + UPDATE_MIME_REMOVE, + error); +} + +static const char ** +g_desktop_app_info_get_supported_types (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return (const char**) info->mime_types; +} + + +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); + if (info->nodisplay) + g_key_file_set_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, + G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, 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->generic_name != NULL) + g_key_file_set_string (key_file, G_KEY_FILE_DESKTOP_GROUP, + GENERIC_NAME_KEY, info->generic_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); + + /* FIXME - actually handle error */ + (void) g_close (fd, NULL); + + res = g_file_set_contents (filename, data, data_size, error); + g_free (data); + 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, + UPDATE_MIME_NONE, + 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: (allow-none): 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 occurring, %NULL to ignore. + * + * Creates a new #GAppInfo from the given information. + * + * Note that for @commandline, the quoting rules of the Exec key of the + * freedesktop.org Desktop + * Entry Specification are applied. For example, if the @commandline contains + * percent-encoded URIs, the percent-character must be doubled in order to prevent it from + * being swallowed by Exec key unquoting. See the specification for exact quoting rules. + * + * Returns: (transfer full): 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) != 0; + info->startup_notify = (flags & G_APP_INFO_CREATE_SUPPORTS_STARTUP_NOTIFICATION) != 0; + info->hidden = FALSE; + if ((flags & G_APP_INFO_CREATE_SUPPORTS_URIS) != 0) + 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; + iface->set_as_last_used_for_type = g_desktop_app_info_set_as_last_used_for_type; + iface->get_supported_types = g_desktop_app_info_get_supported_types; +} + +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_recommended_for_type: + * @content_type: the content type to find a #GAppInfo for + * + * Gets a list of recommended #GAppInfos for a given content type, i.e. + * those applications which claim to support the given content type exactly, + * and not by MIME type subclassing. + * Note that the first application of the list is the last used one, i.e. + * the last one for which g_app_info_set_as_last_used_for_type() has been + * called. + * + * Returns: (element-type GAppInfo) (transfer full): #GList of #GAppInfos + * for given @content_type or %NULL on error. + * + * Since: 2.28 + **/ +GList * +g_app_info_get_recommended_for_type (const gchar *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, FALSE, 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_get_fallback_for_type: + * @content_type: the content type to find a #GAppInfo for + * + * Gets a list of fallback #GAppInfos for a given content type, i.e. + * those applications which claim to support the given content type + * by MIME type subclassing and not directly. + * + * Returns: (element-type GAppInfo) (transfer full): #GList of #GAppInfos + * for given @content_type or %NULL on error. + * + * Since: 2.28 + **/ +GList * +g_app_info_get_fallback_for_type (const gchar *content_type) +{ + GList *desktop_entries, *l; + GList *infos, *recommended_infos; + GDesktopAppInfo *info; + + g_return_val_if_fail (content_type != NULL, NULL); + + desktop_entries = get_all_desktop_entries_for_mime_type (content_type, NULL, TRUE, NULL); + recommended_infos = g_app_info_get_recommended_for_type (content_type); + + 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) || + app_info_in_list (G_APP_INFO (info), recommended_infos)) + g_object_unref (info); + else + infos = g_list_prepend (infos, info); + } + g_free (desktop_entry); + } + + g_list_free (desktop_entries); + g_list_free_full (recommended_infos, g_object_unref); + + return g_list_reverse (infos); +} + +/** + * 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, + * including the recommended and fallback #GAppInfos. See + * g_app_info_get_recommended_for_type() and + * g_app_info_get_fallback_for_type(). + * + * Returns: (element-type GAppInfo) (transfer full): #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; + char *user_default = NULL; + GDesktopAppInfo *info; + + g_return_val_if_fail (content_type != NULL, NULL); + + desktop_entries = get_all_desktop_entries_for_mime_type (content_type, NULL, TRUE, &user_default); + infos = NULL; + + /* put the user default in front of the list, for compatibility */ + if (user_default != NULL) + { + info = g_desktop_app_info_new (user_default); + + if (info != NULL) + infos = g_list_prepend (infos, info); + } + + g_free (user_default); + + 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, + UPDATE_MIME_NONE, + 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 default #GAppInfo for a given content type. + * + * Returns: (transfer full): #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; + char *user_default = NULL; + GAppInfo *info; + + g_return_val_if_fail (content_type != NULL, NULL); + + desktop_entries = get_all_desktop_entries_for_mime_type (content_type, NULL, TRUE, &user_default); + + info = NULL; + + if (user_default != NULL) + { + info = (GAppInfo *) g_desktop_app_info_new (user_default); + + if (info) + { + if (must_support_uris && !g_app_info_supports_uris (info)) + { + g_object_unref (info); + info = NULL; + } + } + } + + g_free (user_default); + + if (info != NULL) + { + g_list_free_full (desktop_entries, g_free); + return info; + } + + /* pick the first from the other list that matches our URI + * requirements. + */ + 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_free_full (desktop_entries, g_free); + + return info; +} + +/** + * g_app_info_get_default_for_uri_scheme: + * @uri_scheme: a string containing a URI scheme. + * + * Gets the default application for handling URIs with + * the given 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: (transfer full): #GAppInfo for given @uri_scheme or %NULL on error. + */ +GAppInfo * +g_app_info_get_default_for_uri_scheme (const char *uri_scheme) +{ + GAppInfo *app_info; + char *content_type, *scheme_down; + + scheme_down = g_ascii_strdown (uri_scheme, -1); + content_type = g_strdup_printf ("x-scheme-handler/%s", scheme_down); + g_free (scheme_down); + app_info = g_app_info_get_default_for_type (content_type, FALSE); + g_free (content_type); + + return app_info; +} + +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: (element-type GAppInfo) (transfer full): 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; + GHashTable *mimeapps_list_defaults_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_free_full (value, g_free); +} + +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; + char *desktop_id; + 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); + + if (dir->mimeapps_list_defaults_map != NULL) + g_hash_table_destroy (dir->mimeapps_list_defaults_map); + dir->mimeapps_list_defaults_map = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + 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); + } + + 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_id = g_key_file_get_string (key_file, + DEFAULT_APPLICATIONS_GROUP, + mime_types[i], + NULL); + if (desktop_id == NULL) + continue; + + unaliased_type = _g_unix_content_type_unalias (mime_types[i]); + g_hash_table_replace (dir->mimeapps_list_defaults_map, + unaliased_type, + desktop_id); + } + + 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; + } + + if (dir->mimeapps_list_defaults_map != NULL) + { + g_hash_table_destroy (dir->mimeapps_list_defaults_map); + dir->mimeapps_list_defaults_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_free_full (cache->dirs, (GDestroyNotify) mime_info_cache_dir_free); + 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, + gboolean include_fallback, + char **explicit_default) +{ + GList *desktop_entries, *removed_entries, *list, *dir_list, *tmp; + MimeInfoCacheDir *dir; + char *mime_type, *default_entry = NULL; + char *old_default_entry = NULL; + const char *entry; + char **mime_types; + char **default_entries; + char **removed_associations; + gboolean already_found_handler; + int i, j, k; + GPtrArray *array; + char **anc; + + mime_info_cache_init (); + + if (include_fallback) + { + /* 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); + } + else + { + mime_types = g_malloc0 (2 * sizeof (gchar *)); + mime_types[0] = g_strdup (base_mime_type); + mime_types[1] = NULL; + } + + 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]; + + /* This is true if we already found a handler for a more specific + mimetype. If its set we ignore any defaults for the less specific + mimetypes. */ + already_found_handler = (desktop_entries != NULL); + + /* Go through all apps listed in user and system dirs */ + for (dir_list = mime_info_cache->dirs; + dir_list != NULL; + dir_list = dir_list->next) + { + dir = dir_list->data; + + /* Pick the explicit default application if we got no result earlier + * (ie, for more specific mime types) + */ + if (!already_found_handler) + { + entry = g_hash_table_lookup (dir->mimeapps_list_defaults_map, mime_type); + + if (entry != NULL) + { + /* Save the default entry if it's the first one we encounter */ + if (default_entry == NULL) + default_entry = g_strdup (entry); + } + } + + /* Then 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++) + { + if (default_entry == NULL && old_default_entry == NULL && !already_found_handler) + old_default_entry = g_strdup (default_entries[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); + + /* If we have no default from mimeapps.list, take it from + * defaults.list intead. + * + * If we do have a default from mimeapps.list, free any one that came + * from defaults.list. + */ + if (default_entry == NULL) + default_entry = old_default_entry; + else + g_free (old_default_entry); + + if (explicit_default != NULL) + *explicit_default = default_entry; + else + g_free (default_entry); + + g_list_free_full (removed_entries, g_free); + + desktop_entries = g_list_reverse (desktop_entries); + + return desktop_entries; +} + +/* GDesktopAppInfoLookup interface: */ + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + +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: (transfer full): #GAppInfo for given @uri_scheme or %NULL on error. + * + * Deprecated: The #GDesktopAppInfoLookup interface is deprecated and unused by gio. + */ +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); +} + +G_GNUC_END_IGNORE_DEPRECATIONS + +/** + * g_desktop_app_info_get_startup_wm_class: + * @info: a #GDesktopAppInfo that supports startup notify + * + * Retrieves the StartupWMClass field from @info. This represents the + * WM_CLASS property of the main window of the application, if launched + * through @info. + * + * Returns: (transfer none): the startup WM class, or %NULL if none is set + * in the desktop file. + * + * Since: 2.34 + */ +const char * +g_desktop_app_info_get_startup_wm_class (GDesktopAppInfo *info) +{ + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), NULL); + + return info->startup_wm_class; +} + +/** + * g_desktop_app_info_get_string: + * @info: a #GDesktopAppInfo + * @key: the key to look up + * + * Looks up a string value in the keyfile backing @info. + * + * The @key is looked up in the "Desktop Entry" group. + * + * Returns: a newly allocated string, or %NULL if the key + * is not found + * + * Since: 2.36 + */ +char * +g_desktop_app_info_get_string (GDesktopAppInfo *info, + const char *key) +{ + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), NULL); + + return g_key_file_get_string (info->keyfile, + G_KEY_FILE_DESKTOP_GROUP, key, NULL); +} + +/** + * g_desktop_app_info_get_boolean: + * @info: a #GDesktopAppInfo + * @key: the key to look up + * + * Looks up a boolean value in the keyfile backing @info. + * + * The @key is looked up in the "Desktop Entry" group. + * + * Returns: the boolean value, or %FALSE if the key + * is not found + * + * Since: 2.36 + */ +gboolean +g_desktop_app_info_get_boolean (GDesktopAppInfo *info, + const char *key) +{ + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE); + + return g_key_file_get_boolean (info->keyfile, + G_KEY_FILE_DESKTOP_GROUP, key, NULL); +} + +/** + * g_desktop_app_info_has_key: + * @info: a #GDesktopAppInfo + * @key: the key to look up + * + * Returns whether @key exists in the "Desktop Entry" group + * of the keyfile backing @info. + * + * Returns: %TRUE if the @key exists + * + * Since: 2.26 + */ +gboolean +g_desktop_app_info_has_key (GDesktopAppInfo *info, + const char *key) +{ + g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), FALSE); + + return g_key_file_has_key (info->keyfile, + G_KEY_FILE_DESKTOP_GROUP, key, NULL); +} diff --git a/gio/gdesktopappinfo.h b/gio/gdesktopappinfo.h new file mode 100644 index 0000000..b1be8d5 --- /dev/null +++ b/gio/gdesktopappinfo.h @@ -0,0 +1,158 @@ +/* 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; +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_desktop_app_info_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GDesktopAppInfo *g_desktop_app_info_new_from_filename (const char *filename); +GLIB_AVAILABLE_IN_ALL +GDesktopAppInfo *g_desktop_app_info_new_from_keyfile (GKeyFile *key_file); + +GLIB_AVAILABLE_IN_ALL +const char * g_desktop_app_info_get_filename (GDesktopAppInfo *info); + +GLIB_AVAILABLE_IN_2_30 +const char * g_desktop_app_info_get_generic_name (GDesktopAppInfo *info); +GLIB_AVAILABLE_IN_2_30 +const char * g_desktop_app_info_get_categories (GDesktopAppInfo *info); +GLIB_AVAILABLE_IN_2_30 +const char * const *g_desktop_app_info_get_keywords (GDesktopAppInfo *info); +GLIB_AVAILABLE_IN_2_30 +gboolean g_desktop_app_info_get_nodisplay (GDesktopAppInfo *info); +GLIB_AVAILABLE_IN_2_30 +gboolean g_desktop_app_info_get_show_in (GDesktopAppInfo *info, + const gchar *desktop_env); +GLIB_AVAILABLE_IN_2_34 +const char * g_desktop_app_info_get_startup_wm_class (GDesktopAppInfo *info); + +GLIB_AVAILABLE_IN_ALL +GDesktopAppInfo *g_desktop_app_info_new (const char *desktop_id); +GLIB_AVAILABLE_IN_ALL +gboolean g_desktop_app_info_get_is_hidden (GDesktopAppInfo *info); + +GLIB_AVAILABLE_IN_ALL +void g_desktop_app_info_set_desktop_env (const char *desktop_env); + +GLIB_AVAILABLE_IN_2_36 +gboolean g_desktop_app_info_has_key (GDesktopAppInfo *info, + const char *key); +GLIB_AVAILABLE_IN_2_36 +char * g_desktop_app_info_get_string (GDesktopAppInfo *info, + const char *key); +GLIB_AVAILABLE_IN_2_36 +gboolean g_desktop_app_info_get_boolean (GDesktopAppInfo *info, + const char *key); + +#ifndef G_DISABLE_DEPRECATED + +#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" + +#endif /* G_DISABLE_DEPRECATED */ + +/** + * 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); +}; + +GLIB_DEPRECATED +GType g_desktop_app_info_lookup_get_type (void) G_GNUC_CONST; + +GLIB_DEPRECATED +GAppInfo *g_desktop_app_info_lookup_get_default_for_uri_scheme (GDesktopAppInfoLookup *lookup, + const char *uri_scheme); + +/** + * GDesktopAppLaunchCallback: + * @appinfo: a #GDesktopAppInfo + * @pid: Process identifier + * @user_data: User data + * + * During invocation, g_desktop_app_info_launch_uris_as_manager() may + * create one or more child processes. This callback is invoked once + * for each, providing the process ID. + */ +typedef void (*GDesktopAppLaunchCallback) (GDesktopAppInfo *appinfo, + GPid pid, + gpointer user_data); + +GLIB_AVAILABLE_IN_2_28 +gboolean g_desktop_app_info_launch_uris_as_manager (GDesktopAppInfo *appinfo, + GList *uris, + GAppLaunchContext *launch_context, + GSpawnFlags spawn_flags, + GSpawnChildSetupFunc user_setup, + gpointer user_setup_data, + GDesktopAppLaunchCallback pid_callback, + gpointer pid_callback_data, + GError **error); + + +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..32f7848 --- /dev/null +++ b/gio/gdrive.c @@ -0,0 +1,918 @@ +/* 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 "gtask.h" +#include "gthemedicon.h" +#include "gasyncresult.h" +#include "gioerror.h" +#include "glibintl.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, determining 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: (transfer full): #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_get_symbolic_icon: + * @drive: a #GDrive. + * + * Gets the icon for @drive. + * + * Returns: (transfer full): symbolic #GIcon for the @drive. + * Free the returned object with g_object_unref(). + * + * Since: 2.34 + **/ +GIcon * +g_drive_get_symbolic_icon (GDrive *drive) +{ + GDriveIface *iface; + GIcon *ret; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + + iface = G_DRIVE_GET_IFACE (drive); + + if (iface->get_symbolic_icon != NULL) + ret = iface->get_symbolic_icon (drive); + else + ret = g_themed_icon_new_with_default_fallbacks ("drive-removable-media-symbolic"); + + return ret; +} + +/** + * 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: (element-type GVolume) (transfer full): #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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (drive, callback, user_data, + g_drive_eject_with_operation, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_drive_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (drive, callback, user_data, + g_drive_eject_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_drive_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (drive, callback, user_data, + g_drive_poll_for_media, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_drive_poll_for_media)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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_identifier() to obtain the identifiers + * themselves. + * + * Returns: (transfer full) (array zero-terminated=1): 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (drive, callback, user_data, + g_drive_start, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_drive_start)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (drive, callback, user_data, + g_drive_start, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_drive_start)) + return g_task_propagate_boolean (G_TASK (result), error); + + iface = G_DRIVE_GET_IFACE (drive); + + return (* iface->stop_finish) (drive, result, error); +} + +/** + * g_drive_get_sort_key: + * @drive: A #GDrive. + * + * Gets the sort key for @drive, if any. + * + * Returns: Sorting key for @drive or %NULL if no such key is available. + * + * Since: 2.32 + */ +const gchar * +g_drive_get_sort_key (GDrive *drive) +{ + const gchar *ret = NULL; + GDriveIface *iface; + + g_return_val_if_fail (G_IS_DRIVE (drive), NULL); + + iface = G_DRIVE_GET_IFACE (drive); + if (iface->get_sort_key != NULL) + ret = iface->get_sort_key (drive); + + return ret; +} diff --git a/gio/gdrive.h b/gio/gdrive.h new file mode 100644 index 0000000..13c02ae --- /dev/null +++ b/gio/gdrive.h @@ -0,0 +1,261 @@ +/* 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_DRIVE_H__ +#define __G_DRIVE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + * @get_sort_key: Gets a key used for sorting #GDrive instances or %NULL if no such key exists. Since 2.32. + * @get_symbolic_icon: Returns a symbolic #GIcon for the given #GDrive. Since 2.34. + * + * 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); + + const gchar * (* get_sort_key) (GDrive *drive); + GIcon * (* get_symbolic_icon) (GDrive *drive); + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_drive_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +char * g_drive_get_name (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +GIcon * g_drive_get_icon (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +GIcon * g_drive_get_symbolic_icon (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_has_volumes (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +GList * g_drive_get_volumes (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_is_media_removable (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_has_media (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_is_media_check_automatic (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_can_poll_for_media (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_can_eject (GDrive *drive); +GLIB_DEPRECATED_FOR(g_drive_eject_with_operation) +void g_drive_eject (GDrive *drive, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_drive_eject_with_operation_finish) +gboolean g_drive_eject_finish (GDrive *drive, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_drive_poll_for_media (GDrive *drive, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_poll_for_media_finish (GDrive *drive, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +char * g_drive_get_identifier (GDrive *drive, + const char *kind); +GLIB_AVAILABLE_IN_ALL +char ** g_drive_enumerate_identifiers (GDrive *drive); + +GLIB_AVAILABLE_IN_ALL +GDriveStartStopType g_drive_get_start_stop_type (GDrive *drive); + +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_can_start (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_can_start_degraded (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +void g_drive_start (GDrive *drive, + GDriveStartFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_start_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_can_stop (GDrive *drive); +GLIB_AVAILABLE_IN_ALL +void g_drive_stop (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_stop_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_drive_eject_with_operation (GDrive *drive, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_drive_eject_with_operation_finish (GDrive *drive, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +const gchar *g_drive_get_sort_key (GDrive *drive); + +G_END_DECLS + +#endif /* __G_DRIVE_H__ */ diff --git a/gio/gdummyfile.c b/gio/gdummyfile.c new file mode 100644 index 0000000..4546e3c --- /dev/null +++ b/gio/gdummyfile.c @@ -0,0 +1,753 @@ +/* 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" + + +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/gdummyproxyresolver.c b/gio/gdummyproxyresolver.c new file mode 100644 index 0000000..8f3969e --- /dev/null +++ b/gio/gdummyproxyresolver.c @@ -0,0 +1,135 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include "gdummyproxyresolver.h" + +#include + +#include "gasyncresult.h" +#include "gcancellable.h" +#include "gproxyresolver.h" +#include "gtask.h" + +#include "giomodule.h" +#include "giomodule-priv.h" + +struct _GDummyProxyResolver { + GObject parent_instance; +}; + +static void g_dummy_proxy_resolver_iface_init (GProxyResolverInterface *iface); + +#define g_dummy_proxy_resolver_get_type _g_dummy_proxy_resolver_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyProxyResolver, g_dummy_proxy_resolver, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY_RESOLVER, + g_dummy_proxy_resolver_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_PROXY_RESOLVER_EXTENSION_POINT_NAME, + g_define_type_id, + "dummy", + -100)) + +static void +g_dummy_proxy_resolver_finalize (GObject *object) +{ + /* must chain up */ + G_OBJECT_CLASS (g_dummy_proxy_resolver_parent_class)->finalize (object); +} + +static void +g_dummy_proxy_resolver_init (GDummyProxyResolver *resolver) +{ +} + +static gboolean +g_dummy_proxy_resolver_is_supported (GProxyResolver *resolver) +{ + return TRUE; +} + +static gchar ** +g_dummy_proxy_resolver_lookup (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error) +{ + gchar **proxies; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + proxies = g_new0 (gchar *, 2); + proxies[0] = g_strdup ("direct://"); + + return proxies; +} + +static void +g_dummy_proxy_resolver_lookup_async (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GError *error = NULL; + GTask *task; + gchar **proxies; + + task = g_task_new (resolver, cancellable, callback, user_data); + + proxies = g_dummy_proxy_resolver_lookup (resolver, uri, cancellable, &error); + if (proxies) + g_task_return_pointer (task, proxies, (GDestroyNotify) g_strfreev); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +static gchar ** +g_dummy_proxy_resolver_lookup_finish (GProxyResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, resolver), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_dummy_proxy_resolver_class_init (GDummyProxyResolverClass *resolver_class) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (resolver_class); + object_class->finalize = g_dummy_proxy_resolver_finalize; +} + +static void +g_dummy_proxy_resolver_iface_init (GProxyResolverInterface *iface) +{ + iface->is_supported = g_dummy_proxy_resolver_is_supported; + iface->lookup = g_dummy_proxy_resolver_lookup; + iface->lookup_async = g_dummy_proxy_resolver_lookup_async; + iface->lookup_finish = g_dummy_proxy_resolver_lookup_finish; +} diff --git a/gio/gdummyproxyresolver.h b/gio/gdummyproxyresolver.h new file mode 100644 index 0000000..d5e091f --- /dev/null +++ b/gio/gdummyproxyresolver.h @@ -0,0 +1,54 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_DUMMY_PROXY_RESOLVER_H__ +#define __G_DUMMY_PROXY_RESOLVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DUMMY_PROXY_RESOLVER (_g_dummy_proxy_resolver_get_type ()) +#define G_DUMMY_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DUMMY_PROXY_RESOLVER, GDummyProxyResolver)) +#define G_DUMMY_PROXY_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DUMMY_PROXY_RESOLVER, GDummyProxyResolverClass)) +#define G_IS_DUMMY_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DUMMY_PROXY_RESOLVER)) +#define G_IS_DUMMY_PROXY_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DUMMY_PROXY_RESOLVER)) +#define G_DUMMY_PROXY_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DUMMY_PROXY_RESOLVER, GDummyProxyResolverClass)) + +typedef struct _GDummyProxyResolver GDummyProxyResolver; +typedef struct _GDummyProxyResolverClass GDummyProxyResolverClass; + + +struct _GDummyProxyResolverClass { + GObjectClass parent_class; +}; + +GType _g_dummy_proxy_resolver_get_type (void); + + +G_END_DECLS + +#endif /* __G_DUMMY_PROXY_RESOLVER_H__ */ diff --git a/gio/gdummytlsbackend.c b/gio/gdummytlsbackend.c new file mode 100644 index 0000000..5a2463b --- /dev/null +++ b/gio/gdummytlsbackend.c @@ -0,0 +1,386 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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 "gdummytlsbackend.h" + +#include + +#include "gasyncresult.h" +#include "gcancellable.h" +#include "ginitable.h" +#include "gtlsbackend.h" +#include "gtlscertificate.h" +#include "gtlsclientconnection.h" +#include "gtlsdatabase.h" +#include "gtlsfiledatabase.h" +#include "gtlsserverconnection.h" +#include "gsimpleasyncresult.h" + +#include "giomodule.h" +#include "giomodule-priv.h" + +#include "glibintl.h" + +static GType _g_dummy_tls_certificate_get_type (void); +static GType _g_dummy_tls_connection_get_type (void); +static GType _g_dummy_tls_database_get_type (void); + +struct _GDummyTlsBackend { + GObject parent_instance; + GTlsDatabase *database; +}; + +static void g_dummy_tls_backend_iface_init (GTlsBackendInterface *iface); + +#define g_dummy_tls_backend_get_type _g_dummy_tls_backend_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyTlsBackend, g_dummy_tls_backend, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_BACKEND, + g_dummy_tls_backend_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_TLS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, + "dummy", + -100)) + +static void +g_dummy_tls_backend_init (GDummyTlsBackend *backend) +{ +} + +static void +g_dummy_tls_backend_class_init (GDummyTlsBackendClass *backend_class) +{ +} + +static GTlsDatabase* +g_dummy_tls_backend_get_default_database (GTlsBackend *backend) +{ + return g_object_new (_g_dummy_tls_database_get_type (), NULL); +} + +static void +g_dummy_tls_backend_iface_init (GTlsBackendInterface *iface) +{ + iface->get_certificate_type = _g_dummy_tls_certificate_get_type; + iface->get_client_connection_type = _g_dummy_tls_connection_get_type; + iface->get_server_connection_type = _g_dummy_tls_connection_get_type; + iface->get_file_database_type = _g_dummy_tls_database_get_type; + iface->get_default_database = g_dummy_tls_backend_get_default_database; +} + +/* Dummy certificate type */ + +typedef struct _GDummyTlsCertificate GDummyTlsCertificate; +typedef struct _GDummyTlsCertificateClass GDummyTlsCertificateClass; + +struct _GDummyTlsCertificate { + GTlsCertificate parent_instance; +}; + +struct _GDummyTlsCertificateClass { + GTlsCertificateClass parent_class; +}; + +enum +{ + PROP_CERTIFICATE_0, + + PROP_CERT_CERTIFICATE, + PROP_CERT_CERTIFICATE_PEM, + PROP_CERT_PRIVATE_KEY, + PROP_CERT_PRIVATE_KEY_PEM, + PROP_CERT_ISSUER +}; + +static void g_dummy_tls_certificate_initable_iface_init (GInitableIface *iface); + +#define g_dummy_tls_certificate_get_type _g_dummy_tls_certificate_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyTlsCertificate, g_dummy_tls_certificate, G_TYPE_TLS_CERTIFICATE, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_dummy_tls_certificate_initable_iface_init);) + +static void +g_dummy_tls_certificate_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + /* We need to define this method to make GObject happy, but it will + * never be possible to construct a working GDummyTlsCertificate, so + * it doesn't have to do anything useful. + */ +} + +static void +g_dummy_tls_certificate_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + /* Just ignore all attempts to set properties. */ +} + +static void +g_dummy_tls_certificate_class_init (GDummyTlsCertificateClass *certificate_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (certificate_class); + + gobject_class->get_property = g_dummy_tls_certificate_get_property; + gobject_class->set_property = g_dummy_tls_certificate_set_property; + + g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE, "certificate"); + g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE_PEM, "certificate-pem"); + g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY, "private-key"); + g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY_PEM, "private-key-pem"); + g_object_class_override_property (gobject_class, PROP_CERT_ISSUER, "issuer"); +} + +static void +g_dummy_tls_certificate_init (GDummyTlsCertificate *certificate) +{ +} + +static gboolean +g_dummy_tls_certificate_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE, + _("TLS support is not available")); + return FALSE; +} + +static void +g_dummy_tls_certificate_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_dummy_tls_certificate_initable_init; +} + +/* Dummy connection type; since GTlsClientConnection and + * GTlsServerConnection are just interfaces, we can implement them + * both on a single object. + */ + +typedef struct _GDummyTlsConnection GDummyTlsConnection; +typedef struct _GDummyTlsConnectionClass GDummyTlsConnectionClass; + +struct _GDummyTlsConnection { + GTlsConnection parent_instance; +}; + +struct _GDummyTlsConnectionClass { + GTlsConnectionClass parent_class; +}; + +enum +{ + PROP_CONNECTION_0, + + PROP_CONN_BASE_IO_STREAM, + PROP_CONN_USE_SYSTEM_CERTDB, + PROP_CONN_REQUIRE_CLOSE_NOTIFY, + PROP_CONN_REHANDSHAKE_MODE, + PROP_CONN_CERTIFICATE, + PROP_CONN_DATABASE, + PROP_CONN_PEER_CERTIFICATE, + PROP_CONN_PEER_CERTIFICATE_ERRORS, + PROP_CONN_VALIDATION_FLAGS, + PROP_CONN_SERVER_IDENTITY, + PROP_CONN_USE_SSL3, + PROP_CONN_ACCEPTED_CAS, + PROP_CONN_AUTHENTICATION_MODE +}; + +static void g_dummy_tls_connection_initable_iface_init (GInitableIface *iface); + +#define g_dummy_tls_connection_get_type _g_dummy_tls_connection_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyTlsConnection, g_dummy_tls_connection, G_TYPE_TLS_CONNECTION, + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_CLIENT_CONNECTION, NULL); + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_SERVER_CONNECTION, NULL); + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_dummy_tls_connection_initable_iface_init);) + +static void +g_dummy_tls_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ +} + +static void +g_dummy_tls_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ +} + +static gboolean +g_dummy_tls_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_dummy_tls_connection_class_init (GDummyTlsConnectionClass *connection_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (connection_class); + GIOStreamClass *io_stream_class = G_IO_STREAM_CLASS (connection_class); + + gobject_class->get_property = g_dummy_tls_connection_get_property; + gobject_class->set_property = g_dummy_tls_connection_set_property; + + /* Need to override this because when initable_init fails it will + * dispose the connection, which will close it, which would + * otherwise try to close its input/output streams, which don't + * exist. + */ + io_stream_class->close_fn = g_dummy_tls_connection_close; + + g_object_class_override_property (gobject_class, PROP_CONN_BASE_IO_STREAM, "base-io-stream"); + g_object_class_override_property (gobject_class, PROP_CONN_USE_SYSTEM_CERTDB, "use-system-certdb"); + g_object_class_override_property (gobject_class, PROP_CONN_REQUIRE_CLOSE_NOTIFY, "require-close-notify"); + g_object_class_override_property (gobject_class, PROP_CONN_REHANDSHAKE_MODE, "rehandshake-mode"); + g_object_class_override_property (gobject_class, PROP_CONN_CERTIFICATE, "certificate"); + g_object_class_override_property (gobject_class, PROP_CONN_DATABASE, "database"); + g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE, "peer-certificate"); + g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE_ERRORS, "peer-certificate-errors"); + g_object_class_override_property (gobject_class, PROP_CONN_VALIDATION_FLAGS, "validation-flags"); + g_object_class_override_property (gobject_class, PROP_CONN_SERVER_IDENTITY, "server-identity"); + g_object_class_override_property (gobject_class, PROP_CONN_USE_SSL3, "use-ssl3"); + g_object_class_override_property (gobject_class, PROP_CONN_ACCEPTED_CAS, "accepted-cas"); + g_object_class_override_property (gobject_class, PROP_CONN_AUTHENTICATION_MODE, "authentication-mode"); +} + +static void +g_dummy_tls_connection_init (GDummyTlsConnection *connection) +{ +} + +static gboolean +g_dummy_tls_connection_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE, + _("TLS support is not available")); + return FALSE; +} + +static void +g_dummy_tls_connection_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_dummy_tls_connection_initable_init; +} + +/* Dummy database type. + */ + +typedef struct _GDummyTlsDatabase GDummyTlsDatabase; +typedef struct _GDummyTlsDatabaseClass GDummyTlsDatabaseClass; + +struct _GDummyTlsDatabase { + GTlsDatabase parent_instance; +}; + +struct _GDummyTlsDatabaseClass { + GTlsDatabaseClass parent_class; +}; + +enum +{ + PROP_DATABASE_0, + + PROP_ANCHORS, +}; + +static void g_dummy_tls_database_file_database_iface_init (GTlsFileDatabaseInterface *iface); +static void g_dummy_tls_database_initable_iface_init (GInitableIface *iface); + +#define g_dummy_tls_database_get_type _g_dummy_tls_database_get_type +G_DEFINE_TYPE_WITH_CODE (GDummyTlsDatabase, g_dummy_tls_database, G_TYPE_TLS_DATABASE, + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_FILE_DATABASE, + g_dummy_tls_database_file_database_iface_init); + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_dummy_tls_database_initable_iface_init);) + + +static void +g_dummy_tls_database_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + /* We need to define this method to make GObject happy, but it will + * never be possible to construct a working GDummyTlsDatabase, so + * it doesn't have to do anything useful. + */ +} + +static void +g_dummy_tls_database_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + /* Just ignore all attempts to set properties. */ +} + +static void +g_dummy_tls_database_class_init (GDummyTlsDatabaseClass *database_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (database_class); + + gobject_class->get_property = g_dummy_tls_database_get_property; + gobject_class->set_property = g_dummy_tls_database_set_property; + + g_object_class_override_property (gobject_class, PROP_ANCHORS, "anchors"); +} + +static void +g_dummy_tls_database_init (GDummyTlsDatabase *database) +{ +} + +static void +g_dummy_tls_database_file_database_iface_init (GTlsFileDatabaseInterface *iface) +{ +} + +static gboolean +g_dummy_tls_database_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE, + _("TLS support is not available")); + return FALSE; +} + +static void +g_dummy_tls_database_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_dummy_tls_database_initable_init; +} diff --git a/gio/gdummytlsbackend.h b/gio/gdummytlsbackend.h new file mode 100644 index 0000000..40b5038 --- /dev/null +++ b/gio/gdummytlsbackend.h @@ -0,0 +1,46 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_DUMMY_TLS_BACKEND_H__ +#define __G_DUMMY_TLS_BACKEND_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_DUMMY_TLS_BACKEND (_g_dummy_tls_backend_get_type ()) +#define G_DUMMY_TLS_BACKEND(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_DUMMY_TLS_BACKEND, GDummyTlsBackend)) +#define G_DUMMY_TLS_BACKEND_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_DUMMY_TLS_BACKEND, GDummyTlsBackendClass)) +#define G_IS_DUMMY_TLS_BACKEND(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DUMMY_TLS_BACKEND)) +#define G_IS_DUMMY_TLS_BACKEND_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DUMMY_TLS_BACKEND)) +#define G_DUMMY_TLS_BACKEND_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DUMMY_TLS_BACKEND, GDummyTlsBackendClass)) + +typedef struct _GDummyTlsBackend GDummyTlsBackend; +typedef struct _GDummyTlsBackendClass GDummyTlsBackendClass; + +struct _GDummyTlsBackendClass { + GObjectClass parent_class; +}; + +GType _g_dummy_tls_backend_get_type (void); + +G_END_DECLS + +#endif /* __G_DUMMY_TLS_BACKEND_H__ */ diff --git a/gio/gemblem.c b/gio/gemblem.c new file mode 100644 index 0000000..1df712b --- /dev/null +++ b/gio/gemblem.c @@ -0,0 +1,359 @@ +/* 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 + + +/** + * 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: (transfer none): 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: (transfer none): 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; +} diff --git a/gio/gemblem.h b/gio/gemblem.h new file mode 100644 index 0000000..d581abb --- /dev/null +++ b/gio/gemblem.h @@ -0,0 +1,63 @@ +/* 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. + * + */ + +#ifndef __G_EMBLEM_H__ +#define __G_EMBLEM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +GType g_emblem_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GEmblem *g_emblem_new (GIcon *icon); +GLIB_AVAILABLE_IN_ALL +GEmblem *g_emblem_new_with_origin (GIcon *icon, + GEmblemOrigin origin); +GLIB_AVAILABLE_IN_ALL +GIcon *g_emblem_get_icon (GEmblem *emblem); +GLIB_AVAILABLE_IN_ALL +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..c10dc9b --- /dev/null +++ b/gio/gemblemedicon.c @@ -0,0 +1,423 @@ +/* -*- 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" + + +/** + * 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. + **/ + +enum { + PROP_GICON = 1, + NUM_PROPERTIES +}; + +struct _GEmblemedIconPrivate { + GIcon *icon; + GList *emblems; +}; + +static GParamSpec *properties[NUM_PROPERTIES] = { NULL, }; + +static void g_emblemed_icon_icon_iface_init (GIconIface *iface); + +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->priv->icon); + g_list_free_full (emblemed->priv->emblems, g_object_unref); + + (*G_OBJECT_CLASS (g_emblemed_icon_parent_class)->finalize) (object); +} + +static void +g_emblemed_icon_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GEmblemedIcon *self = G_EMBLEMED_ICON (object); + + switch (property_id) + { + case PROP_GICON: + self->priv->icon = g_value_dup_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_emblemed_icon_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GEmblemedIcon *self = G_EMBLEMED_ICON (object); + + switch (property_id) + { + case PROP_GICON: + g_value_set_object (value, self->priv->icon); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_emblemed_icon_class_init (GEmblemedIconClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_emblemed_icon_finalize; + gobject_class->set_property = g_emblemed_icon_set_property; + gobject_class->get_property = g_emblemed_icon_get_property; + + properties[PROP_GICON] = + g_param_spec_object ("gicon", + P_("The base GIcon"), + P_("The GIcon to attach emblems to"), + G_TYPE_ICON, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties); + + g_type_class_add_private (klass, sizeof (GEmblemedIconPrivate)); +} + +static void +g_emblemed_icon_init (GEmblemedIcon *emblemed) +{ + emblemed->priv = + G_TYPE_INSTANCE_GET_PRIVATE (emblemed, G_TYPE_EMBLEMED_ICON, + GEmblemedIconPrivate); +} + +/** + * g_emblemed_icon_new: + * @icon: a #GIcon + * @emblem: (allow-none): a #GEmblem, or %NULL + * + * Creates a new emblemed icon for @icon with the emblem @emblem. + * + * Returns: (transfer full) (type GEmblemedIcon): 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); + + emblemed = G_EMBLEMED_ICON (g_object_new (G_TYPE_EMBLEMED_ICON, + "gicon", icon, + NULL)); + + if (emblem != NULL) + 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: (transfer none): 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->priv->icon; +} + +/** + * g_emblemed_icon_get_emblems: + * @emblemed: a #GEmblemedIcon + * + * Gets the list of emblems for the @icon. + * + * Returns: (element-type Gio.Emblem) (transfer none): 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->priv->emblems; +} + +/** + * g_emblemed_icon_clear_emblems: + * @emblemed: a #GEmblemedIcon + * + * Removes all the emblems from @icon. + * + * Since: 2.28 + **/ +void +g_emblemed_icon_clear_emblems (GEmblemedIcon *emblemed) +{ + g_return_if_fail (G_IS_EMBLEMED_ICON (emblemed)); + + if (emblemed->priv->emblems == NULL) + return; + + g_list_free_full (emblemed->priv->emblems, g_object_unref); + emblemed->priv->emblems = NULL; +} + +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; +} + +/** + * 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->priv->emblems = g_list_insert_sorted (emblemed->priv->emblems, emblem, + (GCompareFunc) g_emblem_comp); +} + +static guint +g_emblemed_icon_hash (GIcon *icon) +{ + GEmblemedIcon *emblemed = G_EMBLEMED_ICON (icon); + GList *list; + guint hash = g_icon_hash (emblemed->priv->icon); + + for (list = emblemed->priv->emblems; list != NULL; list = list->next) + hash ^= g_icon_hash (G_ICON (list->data)); + + return hash; +} + +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->priv->icon, emblemed2->priv->icon)) + return FALSE; + + list1 = emblemed1->priv->emblems; + list2 = emblemed2->priv->emblems; + + 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->priv->icon); + if (s == NULL) + return FALSE; + + g_ptr_array_add (tokens, s); + + for (l = emblemed_icon->priv->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->priv->icon = g_icon_new_for_string (tokens[0], error); + if (emblemed_icon->priv->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->priv->emblems = g_list_append (emblemed_icon->priv->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; +} diff --git a/gio/gemblemedicon.h b/gio/gemblemedicon.h new file mode 100644 index 0000000..714fe39 --- /dev/null +++ b/gio/gemblemedicon.h @@ -0,0 +1,83 @@ +/* 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 + */ + +#ifndef __G_EMBLEMED_ICON_H__ +#define __G_EMBLEMED_ICON_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +typedef struct _GEmblemedIconPrivate GEmblemedIconPrivate; + +struct _GEmblemedIcon +{ + GObject parent_instance; + + /*< private >*/ + GEmblemedIconPrivate *priv; +}; + +struct _GEmblemedIconClass +{ + GObjectClass parent_class; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_emblemed_icon_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GIcon *g_emblemed_icon_new (GIcon *icon, + GEmblem *emblem); +GLIB_AVAILABLE_IN_ALL +GIcon *g_emblemed_icon_get_icon (GEmblemedIcon *emblemed); +GLIB_AVAILABLE_IN_ALL +GList *g_emblemed_icon_get_emblems (GEmblemedIcon *emblemed); +GLIB_AVAILABLE_IN_ALL +void g_emblemed_icon_add_emblem (GEmblemedIcon *emblemed, + GEmblem *emblem); +GLIB_AVAILABLE_IN_ALL +void g_emblemed_icon_clear_emblems (GEmblemedIcon *emblemed); + +G_END_DECLS + +#endif /* __G_EMBLEMED_ICON_H__ */ diff --git a/gio/gfile.c b/gio/gfile.c new file mode 100644 index 0000000..6d281e6 --- /dev/null +++ b/gio/gfile.c @@ -0,0 +1,7377 @@ +/* -*- 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 __linux__ +#include +#include +/* See linux.git/fs/btrfs/ioctl.h */ +#define BTRFS_IOCTL_MAGIC 0x94 +#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int) +#endif + +#ifdef HAVE_SPLICE +#include +#include +#include +#include +#endif + +#include +#include +#ifdef HAVE_PWD_H +#include +#endif + +#include "gfile.h" +#include "glib/gstdio.h" +#ifdef G_OS_UNIX +#include "glib-unix.h" +#endif +#include "gvfs.h" +#include "gtask.h" +#include "gfileattribute-priv.h" +#include "gfiledescriptorbased.h" +#include "gpollfilemonitor.h" +#include "gappinfo.h" +#include "gfileinputstream.h" +#include "gfileoutputstream.h" +#include "glocalfileoutputstream.h" +#include "glocalfileiostream.h" +#include "gcancellable.h" +#include "gasyncresult.h" +#include "gioerror.h" +#include "glibintl.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_new_tmp() to create a temporary file from a template. + * g_file_parse_name() from a UTF-8 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 UTF-8 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_delete_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +static gboolean g_file_real_delete_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->delete_file_async = g_file_real_delete_async; + iface->delete_file_finish = g_file_real_delete_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 UTF-8 the pathname is used, otherwise the IRI is used + * (a form of URI that allows UTF-8 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: (transfer full): 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: (type GFile): #gconstpointer to a #GFile + * + * Creates a hash value for a #GFile. + * + * This call does no blocking I/O. + * + * Virtual: hash + * 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: (transfer full): 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: (allow-none): 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: (transfer full): 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: return location for an error + * + * Gets the child of @file for a given @display_name (i.e. a UTF-8 + * 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: (transfer full): 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 words, if the names of initial elements of @file's + * 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. + * + * Virtual: prefix_matches + * 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: (transfer full): #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: (allow-none): 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 @attributes 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. @attributes should + * be a comma-separated list of attributes 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_IO_ERROR_NOT_DIRECTORY + * error will be returned. Other errors are possible too. + * + * Returns: (transfer full): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call when the + * request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): 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 an 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: (allow-none): 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: (allow-none): 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 @attributes 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. @attributes should be a + * comma-separated list of attributes 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: (transfer full): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call when the + * request is satisfied + * @user_data: (closure): 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: (transfer full): #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_async_result_legacy_propagate_error (res, 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: (allow-none): 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 @attributes value is a string that specifies the 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. @attributes should be a comma-separated list of + * attributes or attribute wildcards. The wildcard "*" means all + * attributes, and a wildcard like "filesystem::*" means all attributes + * in the filesystem namespace. The standard namespace for filesystem + * attributes is "filesystem". 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: (transfer full): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): #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_async_result_legacy_propagate_error (res, 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: (allow-none): 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: (transfer full): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): #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_async_result_legacy_propagate_error (res, 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: (allow-none): 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. + * + * Virtual: read_fn + * Returns: (transfer full): #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: (allow-none): 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: (transfer full): 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: (allow-none): 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: (transfer full): 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: (allow-none): 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: (allow-none): 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: (transfer full): 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: (allow-none): 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: (transfer full): #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: (allow-none): 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: (transfer full): 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: (allow-none): 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: (allow-none): 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: (transfer full): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, error)) + return NULL; + + iface = G_FILE_GET_IFACE (file); + return (* iface->create_finish) (file, res, error); +} + +/** + * g_file_replace_async: + * @file: input #GFile + * @etag: (allow-none): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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 && + g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_TYPE)) + { + 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) + */ + g_clear_object (&info); + if (my_error != NULL && !g_error_matches (my_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + { + g_propagate_error (error, my_error); + return NULL; + } + g_clear_error (&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: (allow-none): 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] = { -1, -1 }; + 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 (!g_unix_open_pipe (buffer, FD_CLOEXEC, error)) + 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); + + if (!g_close (buffer[0], error)) + goto out; + buffer[0] = -1; + if (!g_close (buffer[1], error)) + goto out; + buffer[1] = -1; + out: + if (buffer[0] != -1) + (void) g_close (buffer[0], NULL); + if (buffer[1] != -1) + (void) g_close (buffer[1], NULL); + + return res; +} +#endif + +#ifdef __linux__ +static gboolean +btrfs_reflink_with_progress (GInputStream *in, + GOutputStream *out, + GFileInfo *info, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + goffset source_size; + int fd_in, fd_out; + int ret; + + 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 (progress_callback) + source_size = g_file_info_get_size (info); + + /* Btrfs clone ioctl properties: + * - Works at the inode level + * - Doesn't work with directories + * - Always follows symlinks (source and destination) + * + * By the time we get here, *in and *out are both regular files */ + ret = ioctl (fd_out, BTRFS_IOC_CLONE, fd_in); + + if (ret < 0) + { + if (errno == EXDEV) + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Copy (reflink/clone) between mounts is not supported")); + else if (errno == EINVAL) + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Copy (reflink/clone) is not supported or invalid")); + else + /* Most probably something odd happened; retry with fallback */ + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Copy (reflink/clone) is not supported or didn't work")); + /* We retry with fallback for all error cases because Btrfs is currently + * unstable, and so we can't trust it to do clone properly. + * In addition, any hard errors here would cause the same failure in the + * fallback manual copy as well. */ + return FALSE; + } + + /* Make sure we send full copied size */ + if (progress_callback) + progress_callback (source_size, source_size, progress_callback_data); + + return TRUE; +} +#endif + +static gboolean +file_copy_fallback (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error) +{ + gboolean ret = FALSE; + GInputStream *in = NULL; + GOutputStream *out = NULL; + GFileInfo *info = NULL; + const char *target; + + /* 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) + goto out; + + /* 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)) + goto out; + + ret = TRUE; + goto out; + } + /* ... else fall back on a regular file copy */ + } + /* 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")); + goto out; + } + + /* Everything else should just fall back on a regular copy. */ + + in = open_source_for_copy (source, destination, flags, cancellable, error); + if (!in) + goto out; + + 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) + goto out; + +#ifdef __linux__ + if (G_IS_FILE_DESCRIPTOR_BASED (in) && G_IS_FILE_DESCRIPTOR_BASED (out)) + { + GError *reflink_err = NULL; + + if (!btrfs_reflink_with_progress (in, out, info, cancellable, + progress_callback, progress_callback_data, + &reflink_err)) + { + if (g_error_matches (reflink_err, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) + { + g_clear_error (&reflink_err); + } + else + { + g_propagate_error (error, reflink_err); + goto out; + } + } + else + { + ret = TRUE; + goto out; + } + } +#endif + +#ifdef HAVE_SPLICE + if (G_IS_FILE_DESCRIPTOR_BASED (in) && G_IS_FILE_DESCRIPTOR_BASED (out)) + { + GError *splice_err = NULL; + + if (!splice_stream_with_progress (in, out, cancellable, + progress_callback, progress_callback_data, + &splice_err)) + { + if (g_error_matches (splice_err, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) + { + g_clear_error (&splice_err); + } + else + { + g_propagate_error (error, splice_err); + goto out; + } + } + else + { + ret = TRUE; + goto out; + } + } + +#endif + + /* A plain read/write loop */ + if (!copy_stream_with_progress (in, out, source, cancellable, + progress_callback, progress_callback_data, + error)) + goto out; + + ret = TRUE; + out: + /* Ignore errors here. Failure to copy metadata is not a hard error */ + if (ret) + (void) g_file_copy_attributes (source, destination, + flags, cancellable, NULL); + + if (in) + { + /* Don't care about errors in source here */ + (void) g_input_stream_close (in, cancellable, NULL); + g_object_unref (in); + } + + if (out) + { + /* But write errors on close are bad! */ + if (!g_output_stream_close (out, cancellable, ret ? error : NULL)) + ret = FALSE; + g_object_unref (out); + } + + g_clear_object (&info); + + return ret; +} + +/** + * g_file_copy: + * @source: input #GFile + * @destination: destination #GFile + * @flags: set of #GFileCopyFlags + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @progress_callback: (allow-none) (scope call): function to callback with + * progress information, or %NULL if progress information is not needed + * @progress_callback_data: (closure): 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: (skip) + * @source: input #GFile + * @destination: destination #GFile + * @flags: set of #GFileCopyFlags + * @io_priority: the I/O priority + * of the request + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @progress_callback: (allow-none): function to callback with progress + * information, or %NULL if progress information is not needed + * @progress_callback_data: (closure): 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_async_result_legacy_propagate_error (res, 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @progress_callback: (allow-none) (scope call): #GFileProgressCallback + * function for updates + * @progress_callback_data: (closure): 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: (allow-none): 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: (allow-none): 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. If the directory itself already exists, + * this function will fail setting @error to %G_IO_ERROR_EXISTS, unlike + * the similar g_mkdir_with_parents(). + * + * 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) +{ + GFile *work_file = NULL; + GList *list = NULL, *l; + GError *my_error = NULL; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + g_file_make_directory (file, cancellable, &my_error); + if (my_error == NULL || my_error->code != G_IO_ERROR_NOT_FOUND) + { + if (my_error) + g_propagate_error (error, my_error); + return my_error == NULL; + } + + work_file = g_object_ref (file); + + while (my_error != NULL && my_error->code == G_IO_ERROR_NOT_FOUND) + { + GFile *parent_file; + + parent_file = g_file_get_parent (work_file); + if (parent_file == NULL) + break; + + g_clear_error (&my_error); + g_file_make_directory (parent_file, cancellable, &my_error); + + g_object_unref (work_file); + work_file = g_object_ref (parent_file); + + if (my_error != NULL && my_error->code == G_IO_ERROR_NOT_FOUND) + list = g_list_prepend (list, parent_file); /* Transfer ownership of ref */ + else + g_object_unref (parent_file); + } + + for (l = list; my_error == NULL && l; l = l->next) + { + g_file_make_directory ((GFile *) l->data, cancellable, &my_error); + } + + if (work_file) + g_object_unref (work_file); + + /* Clean up */ + while (list != NULL) + { + g_object_unref ((GFile *) list->data); + list = g_list_remove (list, list->data); + } + + if (my_error != NULL) + { + g_propagate_error (error, my_error); + return FALSE; + } + + return g_file_make_directory (file, cancellable, error); +} + +/** + * g_file_make_symbolic_link: + * @file: a #GFile with the name of the symlink to create + * @symlink_value: a string with the path for the target of the new symlink + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @error: a #GError + * + * Creates a symbolic link named @file which contains the string + * @symlink_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 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: (allow-none): 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. This has the same semantics as g_unlink(). + * + * 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. + * + * Virtual: delete_file + * 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_delete_async: + * @file: input #GFile + * @io_priority: the I/O priority + * of the request + * @cancellable: (allow-none): 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 delete a file. If the @file is a directory, it will + * only be deleted if it is empty. This has the same semantics as + * g_unlink(). + * + * Virtual: delete_file_async + * Since: 2.34 + */ +void +g_file_delete_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->delete_file_async) (file, + io_priority, + cancellable, + callback, + user_data); +} + +/** + * g_file_delete_finish: + * @file: input #GFile + * @result: a #GAsyncResult + * @error: a #GError, or %NULL + * + * Finishes deleting a file started with g_file_delete_async(). + * + * Virtual: delete_file_finish + * Since: 2.34 + **/ +gboolean +g_file_delete_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_async_result_legacy_propagate_error (result, error)) + return FALSE; + + iface = G_FILE_GET_IFACE (file); + return (* iface->delete_file_finish) (file, result, error); +} + +/** + * g_file_trash: + * @file: #GFile to send to trash + * @cancellable: (allow-none): 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @error: a #GError, or %NULL + * + * Renames @file to the specified display name. + * + * The display name is converted from UTF-8 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: (transfer full): 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 gchar *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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback to call + * when the request is satisfied + * @user_data: (closure): 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 gchar *display_name, + gint 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: (transfer full): 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_async_result_legacy_propagate_error (res, 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: (allow-none): 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: (allow-none): 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: (allow-none): a pointer to the value (or the pointer + * itself if the type is a pointer type) + * @flags: a set of #GFileQueryInfoFlags + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @error: a #GError, or %NULL + * + * Sets an attribute in the file with attribute name @attribute to @value. + * + * Some attributes can be unset by setting @attribute to + * %G_FILE_ATTRIBUTE_TYPE_INVALID and @value_p to %NULL. + * + * 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 gchar *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: (allow-none): 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: %FALSE if there was any error, %TRUE 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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: (out) (transfer full): 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: (allow-none): 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: (allow-none): 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 gchar *attribute, + const gchar *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: (allow-none): 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 gchar *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: (allow-none): 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 gchar *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: (allow-none): 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 gchar *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: (allow-none): 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 gchar *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: (allow-none): a #GMountOperation, + * or %NULL to avoid user interaction + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async) (allow-none): a #GAsyncReadyCallback to call + * when the request is satisfied, or %NULL + * @user_data: (closure): 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_task_report_new_error (file, callback, user_data, + g_file_mount_mountable, + 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: (transfer full): 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_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_file_mount_mountable)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async) (allow-none): a #GAsyncReadyCallback to call + * when the request is satisfied, or %NULL + * @user_data: (closure): 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_task_report_new_error (file, callback, user_data, + g_file_unmount_mountable_with_operation, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_unmount_mountable_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation, + * or %NULL to avoid user interaction + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async) (allow-none): a #GAsyncReadyCallback to call + * when the request is satisfied, or %NULL + * @user_data: (closure): 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_task_report_new_error (file, callback, user_data, + g_file_unmount_mountable_with_operation, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_unmount_mountable_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async) (allow-none): a #GAsyncReadyCallback to call + * when the request is satisfied, or %NULL + * @user_data: (closure): 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_task_report_new_error (file, callback, user_data, + g_file_eject_mountable_with_operation, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_eject_mountable_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation, + * or %NULL to avoid user interaction + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (scope async) (allow-none): a #GAsyncReadyCallback to call + * when the request is satisfied, or %NULL + * @user_data: (closure): 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_task_report_new_error (file, callback, user_data, + g_file_eject_mountable_with_operation, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_eject_mountable_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): 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. + * + * It does not make sense for @flags to contain + * %G_FILE_MONITOR_WATCH_HARD_LINKS, since hard links can not be made to + * directories. It is not possible to monitor all the files in a + * directory for changes made via hard links; if you want to do this then + * you must register individual watches with g_file_monitor(). + * + * Virtual: monitor_dir + * Returns: (transfer full): 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); + g_return_val_if_fail (~flags & G_FILE_MONITOR_WATCH_HARD_LINKS, 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: (allow-none): 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. + * + * If @flags contains %G_FILE_MONITOR_WATCH_HARD_LINKS then the monitor + * will also attempt to report changes made to the file via another + * filename (ie, a hard link). Without this flag, you can only rely on + * changes made through the filename contained in @file to be + * reported. Using this flag may result in an increase in resource + * usage, and may not have any effect depending on the #GFileMonitor + * backend and/or filesystem type. + * + * Returns: (transfer full): 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: (allow-none): 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: (transfer full): 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 & ~G_FILE_MONITOR_WATCH_HARD_LINKS, + cancellable, error); + else + return g_file_monitor_file (file, flags, cancellable, error); +} + +/******************************************** + * Default implementation of async ops * + ********************************************/ + +typedef struct { + char *attributes; + GFileQueryInfoFlags flags; +} QueryInfoAsyncData; + +static void +query_info_data_free (QueryInfoAsyncData *data) +{ + g_free (data->attributes); + g_free (data); +} + +static void +query_info_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + QueryInfoAsyncData *data = task_data; + GFileInfo *info; + GError *error = NULL; + + info = g_file_query_info (G_FILE (object), data->attributes, data->flags, cancellable, &error); + if (info) + g_task_return_pointer (task, info, g_object_unref); + else + g_task_return_error (task, error); +} + +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) +{ + GTask *task; + QueryInfoAsyncData *data; + + data = g_new0 (QueryInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + data->flags = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)query_info_data_free); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, query_info_async_thread); + g_object_unref (task); +} + +static GFileInfo * +g_file_real_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +query_filesystem_info_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + const char *attributes = task_data; + GFileInfo *info; + GError *error = NULL; + + info = g_file_query_filesystem_info (G_FILE (object), attributes, cancellable, &error); + if (info) + g_task_return_pointer (task, info, g_object_unref); + else + g_task_return_error (task, 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) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (attributes), g_free); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, query_filesystem_info_async_thread); + g_object_unref (task); +} + +static GFileInfo * +g_file_real_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +enumerate_children_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + QueryInfoAsyncData *data = task_data; + GFileEnumerator *enumerator; + GError *error = NULL; + + enumerator = g_file_enumerate_children (G_FILE (object), data->attributes, data->flags, cancellable, &error); + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, enumerator, g_object_unref); +} + +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) +{ + GTask *task; + QueryInfoAsyncData *data; + + data = g_new0 (QueryInfoAsyncData, 1); + data->attributes = g_strdup (attributes); + data->flags = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)query_info_data_free); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, enumerate_children_async_thread); + g_object_unref (task); +} + +static GFileEnumerator * +g_file_real_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +open_read_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileInputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->read_fn == NULL) + { + g_task_return_new_error (task, G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + stream = iface->read_fn (G_FILE (object), cancellable, &error); + if (stream) + g_task_return_pointer (task, stream, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +g_file_real_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, open_read_async_thread); + g_object_unref (task); +} + +static GFileInputStream * +g_file_real_read_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +append_to_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data = task_data; + GFileOutputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (source_object); + + stream = iface->append_to (G_FILE (source_object), *data, cancellable, &error); + if (stream) + g_task_return_pointer (task, stream, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +g_file_real_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileCreateFlags *data; + GTask *task; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, append_to_async_thread); + g_object_unref (task); +} + +static GFileOutputStream * +g_file_real_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +create_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data = task_data; + GFileOutputStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (source_object); + + stream = iface->create (G_FILE (source_object), *data, cancellable, &error); + if (stream) + g_task_return_pointer (task, stream, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +g_file_real_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GFileCreateFlags *data; + GTask *task; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, create_async_thread); + g_object_unref (task); +} + +static GFileOutputStream * +g_file_real_create_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +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 (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileOutputStream *stream; + ReplaceAsyncData *data = task_data; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (source_object); + + stream = iface->replace (G_FILE (source_object), + data->etag, + data->make_backup, + data->flags, + cancellable, + &error); + + if (stream) + g_task_return_pointer (task, stream, g_object_unref); + else + g_task_return_error (task, 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) +{ + GTask *task; + ReplaceAsyncData *data; + + data = g_new0 (ReplaceAsyncData, 1); + data->etag = g_strdup (etag); + data->make_backup = make_backup; + data->flags = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)replace_async_data_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, replace_async_thread); + g_object_unref (task); +} + +static GFileOutputStream * +g_file_real_replace_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +delete_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GFile *file = object; + GFileIface *iface; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->delete_file (file, + cancellable, + &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); +} + +static void +g_file_real_delete_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, delete_async_thread); + g_object_unref (task); +} + +static gboolean +g_file_real_delete_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), FALSE); + + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +open_readwrite_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileIOStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->open_readwrite == NULL) + { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + stream = iface->open_readwrite (G_FILE (object), cancellable, &error); + + if (stream == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, stream, g_object_unref); +} + +static void +g_file_real_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, open_readwrite_async_thread); + g_object_unref (task); +} + +static GFileIOStream * +g_file_real_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +create_readwrite_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileCreateFlags *data = task_data; + GFileIOStream *stream; + GError *error = NULL; + + iface = G_FILE_GET_IFACE (object); + + if (iface->create_readwrite == NULL) + { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Operation not supported")); + return; + } + + stream = iface->create_readwrite (G_FILE (object), *data, cancellable, &error); + + if (stream == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, 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; + GTask *task; + + data = g_new0 (GFileCreateFlags, 1); + *data = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, create_readwrite_async_thread); + g_object_unref (task); +} + +static GFileIOStream * +g_file_real_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +typedef struct { + char *etag; + gboolean make_backup; + GFileCreateFlags flags; +} ReplaceRWAsyncData; + +static void +replace_rw_async_data_free (ReplaceRWAsyncData *data) +{ + g_free (data->etag); + g_free (data); +} + +static void +replace_readwrite_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileIface *iface; + GFileIOStream *stream; + GError *error = NULL; + ReplaceRWAsyncData *data = task_data; + + iface = G_FILE_GET_IFACE (object); + + stream = iface->replace_readwrite (G_FILE (object), + data->etag, + data->make_backup, + data->flags, + cancellable, + &error); + + if (stream == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, stream, g_object_unref); +} + +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) +{ + GTask *task; + ReplaceRWAsyncData *data; + + data = g_new0 (ReplaceRWAsyncData, 1); + data->etag = g_strdup (etag); + data->make_backup = make_backup; + data->flags = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)replace_rw_async_data_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, replace_readwrite_async_thread); + g_object_unref (task); +} + +static GFileIOStream * +g_file_real_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +static void +set_display_name_async_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GError *error = NULL; + char *name = task_data; + GFile *file; + + file = g_file_set_display_name (G_FILE (object), name, cancellable, &error); + + if (file == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, file, g_object_unref); +} + +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) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (display_name), g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, set_display_name_async_thread); + g_object_unref (task); +} + +static GFile * +g_file_real_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + +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 (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + SetInfoAsyncData *data = task_data; + + 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) +{ + GTask *task; + SetInfoAsyncData *data; + + data = g_new0 (SetInfoAsyncData, 1); + data->info = g_file_info_dup (info); + data->flags = flags; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)set_info_data_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, set_info_async_thread); + g_object_unref (task); +} + +static gboolean +g_file_real_set_attributes_finish (GFile *file, + GAsyncResult *res, + GFileInfo **info, + GError **error) +{ + SetInfoAsyncData *data; + + g_return_val_if_fail (g_task_is_valid (res, file), FALSE); + + data = g_task_get_task_data (G_TASK (res)); + + 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 (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GError *error = NULL; + GMount *mount; + + mount = g_file_find_enclosing_mount (G_FILE (object), cancellable, &error); + + if (mount == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, mount, g_object_unref); +} + +static void +g_file_real_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (file, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, find_enclosing_mount_async_thread); + g_object_unref (task); +} + +static GMount * +g_file_real_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} + + +typedef struct { + GFile *source; + GFile *destination; + GFileCopyFlags flags; + GFileProgressCallback progress_cb; + gpointer progress_cb_data; +} CopyAsyncData; + +static void +copy_async_data_free (CopyAsyncData *data) +{ + g_object_unref (data->source); + g_object_unref (data->destination); + g_slice_free (CopyAsyncData, 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 void +copy_async_progress_callback (goffset current_num_bytes, + goffset total_num_bytes, + gpointer user_data) +{ + GTask *task = user_data; + CopyAsyncData *data = g_task_get_task_data (task); + 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_main_context_invoke_full (g_task_get_context (task), + g_task_get_priority (task), + copy_async_progress_in_main, + progress, + g_free); +} + +static void +copy_async_thread (GTask *task, + gpointer source, + gpointer task_data, + GCancellable *cancellable) +{ + CopyAsyncData *data = task_data; + gboolean result; + GError *error = NULL; + + result = g_file_copy (data->source, + data->destination, + data->flags, + cancellable, + (data->progress_cb != NULL) ? copy_async_progress_callback : NULL, + task, + &error); + if (result) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, 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) +{ + GTask *task; + CopyAsyncData *data; + + data = g_slice_new (CopyAsyncData); + 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; + + task = g_task_new (source, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)copy_async_data_free); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, copy_async_thread); + g_object_unref (task); +} + +static gboolean +g_file_real_copy_finish (GFile *file, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, file), FALSE); + + return g_task_propagate_boolean (G_TASK (res), error); +} + + +/******************************************** + * Default VFS operations * + ********************************************/ + +/** + * g_file_new_for_path: + * @path: a string containing a relative or absolute path. + * The string must be encoded in the glib filename encoding. + * + * 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: (transfer full): a new #GFile for the given @path. + * Free the returned object with g_object_unref(). + */ +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 UTF-8 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: (transfer full): a new #GFile for the given @uri. + * Free the returned object with g_object_unref(). + */ +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_new_tmp: + * @tmpl: (type filename) (allow-none): Template for the file + * name, as in g_file_open_tmp(), or %NULL for a default template + * @iostream: (out): on return, a #GFileIOStream for the created file + * @error: a #GError, or %NULL + * + * Opens a file in the preferred directory for temporary files (as + * returned by g_get_tmp_dir()) and returns a #GFile and + * #GFileIOStream pointing to it. + * + * @tmpl should be a string in the GLib file name encoding + * containing a sequence of six 'X' characters, and containing no + * directory components. If it is %NULL, a default template is used. + * + * Unlike the other #GFile constructors, this will return %NULL if + * a temporary file could not be created. + * + * Returns: (transfer full): a new #GFile. + * Free the returned object with g_object_unref(). + * + * Since: 2.32 + */ +GFile * +g_file_new_tmp (const char *tmpl, + GFileIOStream **iostream, + GError **error) +{ + gint fd; + gchar *path; + GFile *file; + GFileOutputStream *output; + + g_return_val_if_fail (iostream != NULL, NULL); + + fd = g_file_open_tmp (tmpl, &path, error); + if (fd == -1) + return NULL; + + file = g_file_new_for_path (path); + + output = _g_local_file_output_stream_new (fd); + *iostream = _g_local_file_io_stream_new (G_LOCAL_FILE_OUTPUT_STREAM (output)); + + g_object_unref (output); + g_free (path); + + return file; +} + +/** + * 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: (transfer full): 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 == ':'; +} + +static GFile * +new_for_cmdline_arg (const gchar *arg, + const gchar *cwd) +{ + GFile *file; + char *filename; + + 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); + + if (cwd == NULL) + { + char *current_dir; + + current_dir = g_get_current_dir (); + filename = g_build_filename (current_dir, arg, NULL); + g_free (current_dir); + } + else + filename = g_build_filename (cwd, arg, NULL); + + file = g_file_new_for_path (filename); + g_free (filename); + + return file; +} + +/** + * 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: (transfer full): a new #GFile. + * Free the returned object with g_object_unref(). + */ +GFile * +g_file_new_for_commandline_arg (const char *arg) +{ + g_return_val_if_fail (arg != NULL, NULL); + + return new_for_cmdline_arg (arg, NULL); +} + +/** + * g_file_new_for_commandline_arg_and_cwd: + * @arg: a command line string + * @cwd: the current working directory of the commandline + * + * Creates a #GFile with the given argument from the command line. + * + * This function is similar to g_file_new_for_commandline_arg() except + * that it allows for passing the current working directory as an + * argument instead of using the current working directory of the + * process. + * + * This is useful if the commandline argument was given in a context + * other than the invocation of the current process. + * + * See also g_application_command_line_create_file_for_arg(). + * + * Returns: (transfer full): a new #GFile + * + * Since: 2.36 + **/ +GFile * +g_file_new_for_commandline_arg_and_cwd (const gchar *arg, + const gchar *cwd) +{ + g_return_val_if_fail (arg != NULL, NULL); + g_return_val_if_fail (cwd != NULL, NULL); + + return new_for_cmdline_arg (arg, cwd); +} + +/** + * g_file_mount_enclosing_volume: + * @location: input #GFile + * @flags: flags affecting the operation + * @mount_operation: (allow-none): a #GMountOperation + * or %NULL to avoid user interaction + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (allow-none): 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_task_report_new_error (location, callback, user_data, + g_file_mount_enclosing_volume, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_mount_enclosing_volume)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (transfer full): 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 available */ + 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: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file + * @length: (out) (allow-none): a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: (out) (allow-none): 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 { + GTask *task; + GFileReadMoreCallback read_more_callback; + GByteArray *content; + gsize pos; + char *etag; +} LoadContentsData; + + +static void +load_contents_data_free (LoadContentsData *data) +{ + if (data->content) + g_byte_array_free (data->content, TRUE); + g_free (data->etag); + 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; + + /* Ignore errors here, we're only reading anyway */ + g_input_stream_close_finish (stream, close_res, NULL); + g_object_unref (stream); + + g_task_return_boolean (data->task, TRUE); + g_object_unref (data->task); +} + +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, + g_task_get_cancellable (data->task), + 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) + { + g_task_return_error (data->task, error); + g_object_unref (data->task); + + /* Close the file ignoring any error */ + g_input_stream_close_async (stream, 0, NULL, NULL, NULL); + g_object_unref (stream); + } + else if (read_size == 0) + { + g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), + G_FILE_ATTRIBUTE_ETAG_VALUE, + 0, + g_task_get_cancellable (data->task), + 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, + g_async_result_get_user_data (G_ASYNC_RESULT (data->task)))) + g_file_input_stream_query_info_async (G_FILE_INPUT_STREAM (stream), + G_FILE_ATTRIBUTE_ETAG_VALUE, + 0, + g_task_get_cancellable (data->task), + load_contents_fstat_callback, + data); + else + g_input_stream_read_async (stream, + data->content->data + data->pos, + GET_CONTENT_BLOCK_SIZE, + 0, + g_task_get_cancellable (data->task), + 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; + + 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, + g_task_get_cancellable (data->task), + load_contents_read_callback, + data); + } + else + { + g_task_return_error (data->task, error); + g_object_unref (data->task); + } +} + +/** + * g_file_load_partial_contents_async: (skip) + * @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); + data->read_more_callback = read_more_callback; + data->content = g_byte_array_new (); + + data->task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (data->task, data, (GDestroyNotify)load_contents_data_free); + + g_file_read_async (file, + 0, + g_task_get_cancellable (data->task), + load_contents_open_callback, + data); +} + +/** + * g_file_load_partial_contents_finish: + * @file: input #GFile + * @res: a #GAsyncResult + * @contents: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file + * @length: (out) (allow-none): a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: (out) (allow-none): 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) +{ + GTask *task; + LoadContentsData *data; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (g_task_is_valid (res, file), FALSE); + g_return_val_if_fail (contents != NULL, FALSE); + + task = G_TASK (res); + + if (!g_task_propagate_boolean (task, error)) + { + if (length) + *length = 0; + return FALSE; + } + + data = g_task_get_task_data (task); + + 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: (out) (transfer full) (element-type guint8) (array length=length): a location to place the contents of the file + * @length: (out) (allow-none): a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @etag_out: (out) (allow-none): 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: (element-type guint8) (array length=length): a string containing the new contents for @file + * @length: the length of @contents in bytes + * @etag: (allow-none): 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: (allow-none) (out): 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 { + GTask *task; + const char *content; + gsize length; + gsize pos; + char *etag; + gboolean failed; +} ReplaceContentsData; + +static void +replace_contents_data_free (ReplaceContentsData *data) +{ + 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; + + /* Ignore errors here, we're only reading anyway */ + g_output_stream_close_finish (stream, close_res, NULL); + g_object_unref (stream); + + if (!data->failed) + { + data->etag = g_file_output_stream_get_etag (G_FILE_OUTPUT_STREAM (stream)); + g_task_return_boolean (data->task, TRUE); + } + g_object_unref (data->task); +} + +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->failed = TRUE; + g_task_return_error (data->task, error); + } + g_output_stream_close_async (stream, 0, + g_task_get_cancellable (data->task), + 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, + g_task_get_cancellable (data->task), + replace_contents_close_callback, data); + else + g_output_stream_write_async (stream, + data->content + data->pos, + data->length - data->pos, + 0, + g_task_get_cancellable (data->task), + 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; + + 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, + g_task_get_cancellable (data->task), + replace_contents_write_callback, + data); + } + else + { + g_task_return_error (data->task, error); + g_object_unref (data->task); + } +} + +/** + * g_file_replace_contents_async: + * @file: input #GFile + * @contents: (element-type guint8) (array length=length): string of contents to replace the file with + * @length: the length of @contents in bytes + * @etag: (allow-none): 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); + + data->content = contents; + data->length = length; + + data->task = g_task_new (file, cancellable, callback, user_data); + g_task_set_task_data (data->task, data, (GDestroyNotify)replace_contents_data_free); + + g_file_replace_async (file, + etag, + make_backup, + flags, + 0, + g_task_get_cancellable (data->task), + replace_contents_open_callback, + data); +} + +/** + * g_file_replace_contents_finish: + * @file: input #GFile + * @res: a #GAsyncResult + * @new_etag: (out) (allow-none): 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) +{ + GTask *task; + ReplaceContentsData *data; + + g_return_val_if_fail (G_IS_FILE (file), FALSE); + g_return_val_if_fail (g_task_is_valid (res, file), FALSE); + + task = G_TASK (res); + + if (!g_task_propagate_boolean (task, error)) + return FALSE; + + data = g_task_get_task_data (task); + + 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: (allow-none): a #GMountOperation, or %NULL to avoid user interaction + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore + * @callback: (allow-none): 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_task_report_new_error (file, callback, user_data, + g_file_start_mountable, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_start_mountable)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation, + * or %NULL to avoid user interaction. + * @cancellable: (allow-none): optional #GCancellable object, + * %NULL to ignore + * @callback: (allow-none): 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_task_report_new_error (file, callback, user_data, + g_file_stop_mountable, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_stop_mountable)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): 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_task_report_new_error (file, callback, user_data, + g_file_poll_mountable, + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_poll_mountable)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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; +} diff --git a/gio/gfile.h b/gio/gfile.h new file mode 100644 index 0000000..66126b6 --- /dev/null +++ b/gio/gfile.h @@ -0,0 +1,1154 @@ +/* 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_H__ +#define __G_FILE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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) (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* delete_file_finish) (GFile *file, + GAsyncResult *result, + GError **error); + + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFile * g_file_new_for_path (const char *path); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_new_for_uri (const char *uri); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_new_for_commandline_arg (const char *arg); +GLIB_AVAILABLE_IN_2_36 +GFile * g_file_new_for_commandline_arg_and_cwd (const gchar *arg, + const gchar *cwd); +GLIB_AVAILABLE_IN_2_32 +GFile * g_file_new_tmp (const char *tmpl, + GFileIOStream **iostream, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_parse_name (const char *parse_name); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_dup (GFile *file); +GLIB_AVAILABLE_IN_ALL +guint g_file_hash (gconstpointer file); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_equal (GFile *file1, + GFile *file2); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_basename (GFile *file); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_path (GFile *file); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_uri (GFile *file); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_parse_name (GFile *file); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_get_parent (GFile *file); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_has_parent (GFile *file, + GFile *parent); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_get_child (GFile *file, + const char *name); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_has_prefix (GFile *file, + GFile *prefix); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_relative_path (GFile *parent, + GFile *descendant); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_resolve_relative_path (GFile *file, + const char *relative_path); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_is_native (GFile *file); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_has_uri_scheme (GFile *file, + const char *uri_scheme); +GLIB_AVAILABLE_IN_ALL +char * g_file_get_uri_scheme (GFile *file); +GLIB_AVAILABLE_IN_ALL +GFileInputStream * g_file_read (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_read_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileInputStream * g_file_read_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_append_to (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_create (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_replace (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_append_to_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_append_to_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_create_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_create_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +GFileOutputStream * g_file_replace_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_open_readwrite (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_open_readwrite_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_open_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_create_readwrite (GFile *file, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_create_readwrite_async (GFile *file, + GFileCreateFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_create_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_replace_readwrite (GFile *file, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +GFileIOStream * g_file_replace_readwrite_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_query_exists (GFile *file, + GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +GFileType g_file_query_file_type (GFile *file, + GFileQueryInfoFlags flags, + GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_query_info_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_query_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_query_filesystem_info (GFile *file, + const char *attributes, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_query_filesystem_info_async (GFile *file, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_query_filesystem_info_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GMount * g_file_find_enclosing_mount (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_find_enclosing_mount_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GMount * g_file_find_enclosing_mount_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileEnumerator * g_file_enumerate_children (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_enumerate_children_async (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileEnumerator * g_file_enumerate_children_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_set_display_name (GFile *file, + const char *display_name, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_set_display_name_async (GFile *file, + const char *display_name, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_set_display_name_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_delete (GFile *file, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_2_34 +void g_file_delete_async (GFile *file, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_2_34 +gboolean g_file_delete_finish (GFile *file, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_file_trash (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_copy (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_copy_finish (GFile *file, + GAsyncResult *res, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_move (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GFileProgressCallback progress_callback, + gpointer progress_callback_data, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_make_directory (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_make_directory_with_parents (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_make_symbolic_link (GFile *file, + const char *symlink_value, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileAttributeInfoList *g_file_query_settable_attributes (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileAttributeInfoList *g_file_query_writable_namespaces (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute (GFile *file, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attributes_from_info (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_set_attributes_async (GFile *file, + GFileInfo *info, + GFileQueryInfoFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attributes_finish (GFile *file, + GAsyncResult *result, + GFileInfo **info, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_byte_string (GFile *file, + const char *attribute, + const char *value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_uint32 (GFile *file, + const char *attribute, + guint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_int32 (GFile *file, + const char *attribute, + gint32 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_uint64 (GFile *file, + const char *attribute, + guint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_attribute_int64 (GFile *file, + const char *attribute, + gint64 value, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_mount_enclosing_volume (GFile *location, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_mount_enclosing_volume_finish (GFile *location, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_mount_mountable (GFile *file, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_mount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +GLIB_DEPRECATED_FOR(g_file_unmount_mountable_with_operation) +void g_file_unmount_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_file_unmount_mountable_with_operation_finish) +gboolean g_file_unmount_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_unmount_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_unmount_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error); +GLIB_DEPRECATED_FOR(g_file_eject_mountable_with_operation) +void g_file_eject_mountable (GFile *file, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_file_eject_mountable_with_operation_finish) +gboolean g_file_eject_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_eject_mountable_with_operation (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_eject_mountable_with_operation_finish (GFile *file, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_file_copy_attributes (GFile *source, + GFile *destination, + GFileCopyFlags flags, + GCancellable *cancellable, + GError **error); + + +GLIB_AVAILABLE_IN_ALL +GFileMonitor* g_file_monitor_directory (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileMonitor* g_file_monitor_file (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GFileMonitor* g_file_monitor (GFile *file, + GFileMonitorFlags flags, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_file_start_mountable (GFile *file, + GDriveStartFlags flags, + GMountOperation *start_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_start_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_stop_mountable (GFile *file, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_stop_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_file_poll_mountable (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_poll_mountable_finish (GFile *file, + GAsyncResult *result, + GError **error); + +/* Utilities */ + +GLIB_AVAILABLE_IN_ALL +GAppInfo *g_file_query_default_handler (GFile *file, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_load_contents (GFile *file, + GCancellable *cancellable, + char **contents, + gsize *length, + char **etag_out, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_load_contents_async (GFile *file, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_load_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_load_partial_contents_async (GFile *file, + GCancellable *cancellable, + GFileReadMoreCallback read_more_callback, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_load_partial_contents_finish (GFile *file, + GAsyncResult *res, + char **contents, + gsize *length, + char **etag_out, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_replace_contents_finish (GFile *file, + GAsyncResult *res, + char **new_etag, + GError **error); + +GLIB_AVAILABLE_IN_ALL +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..eec4595 --- /dev/null +++ b/gio/gfileattribute.c @@ -0,0 +1,1057 @@ +/* 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" + + +/** + * 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. + * + * The list of possible attributes for a filesystem (pointed to by a #GFile) is + * available as a #GFileAttributeInfoList. This list is queryable by key names + * as indicated earlier. + * + * Information is stored within the list in #GFileAttributeInfo structures. + * The info structure can store different types, listed in the enum + * #GFileAttributeType. Upon creation of a #GFileAttributeInfo, the type will + * be set to %G_FILE_ATTRIBUTE_TYPE_INVALID. + * + * 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. Examples 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_USEDfilesystem::useduint64 + * %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; +} + +G_DEFINE_BOXED_TYPE (GFileAttributeInfoList, g_file_attribute_info_list, + g_file_attribute_info_list_dup, + g_file_attribute_info_list_unref) + +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 UTF-8 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 UTF-8 string to set within the type. + * + * Sets the attribute value to a given UTF-8 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); + g_free (list); + } +} + +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); +} diff --git a/gio/gfileattribute.h b/gio/gfileattribute.h new file mode 100644 index 0000000..8ebdcd4 --- /dev/null +++ b/gio/gfileattribute.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_FILE_ATTRIBUTE_H__ +#define __G_FILE_ATTRIBUTE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +#define G_TYPE_FILE_ATTRIBUTE_INFO_LIST (g_file_attribute_info_list_get_type ()) +GLIB_AVAILABLE_IN_ALL +GType g_file_attribute_info_list_get_type (void); + +GLIB_AVAILABLE_IN_ALL +GFileAttributeInfoList * g_file_attribute_info_list_new (void); +GLIB_AVAILABLE_IN_ALL +GFileAttributeInfoList * g_file_attribute_info_list_ref (GFileAttributeInfoList *list); +GLIB_AVAILABLE_IN_ALL +void g_file_attribute_info_list_unref (GFileAttributeInfoList *list); +GLIB_AVAILABLE_IN_ALL +GFileAttributeInfoList * g_file_attribute_info_list_dup (GFileAttributeInfoList *list); +GLIB_AVAILABLE_IN_ALL +const GFileAttributeInfo *g_file_attribute_info_list_lookup (GFileAttributeInfoList *list, + const char *name); +GLIB_AVAILABLE_IN_ALL +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..6d4ef13 --- /dev/null +++ b/gio/gfiledescriptorbased.c @@ -0,0 +1,73 @@ +/* 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" + + +/** + * SECTION:gfiledescriptorbased + * @short_description: Interface for file descriptor based IO + * @include: gio/gfiledescriptorbased.h + * @see_also: #GInputStream, #GOutputStream + * + * #GFileDescriptorBased is implemented by streams (implementations of + * #GInputStream or #GOutputStream) that are based on file descriptors. + * + * Note that <gio/gfiledescriptorbased.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. + * + * 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); +} diff --git a/gio/gfiledescriptorbased.h b/gio/gfiledescriptorbased.h new file mode 100644 index 0000000..cf045b4 --- /dev/null +++ b/gio/gfiledescriptorbased.h @@ -0,0 +1,65 @@ +/* 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_descriptor_based_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +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..d2779ce --- /dev/null +++ b/gio/gfileenumerator.c @@ -0,0 +1,740 @@ +/* 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 "gioerror.h" +#include "glibintl.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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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: (transfer full): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure): 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; + + 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) + { + GTask *task; + + task = g_task_new (enumerator, cancellable, callback, user_data); + g_task_set_source_tag (task, g_file_enumerator_next_files_async); + g_task_return_pointer (task, NULL, NULL); + g_object_unref (task); + return; + } + + if (enumerator->priv->closed) + { + g_task_report_new_error (enumerator, callback, user_data, + g_file_enumerator_next_files_async, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("File enumerator is already closed")); + return; + } + + if (enumerator->priv->pending) + { + g_task_report_new_error (enumerator, callback, user_data, + g_file_enumerator_next_files_async, + 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 occurring, or %NULL to + * ignore. + * + * Finishes the asynchronous operation started with g_file_enumerator_next_files_async(). + * + * Returns: (transfer full) (element-type Gio.FileInfo): 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; + + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (g_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_file_enumerator_next_files_async)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure): 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_task_report_new_error (enumerator, callback, user_data, + g_file_enumerator_close_async, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("File enumerator is already closed")); + return; + } + + if (enumerator->priv->pending) + { + g_task_report_new_error (enumerator, callback, user_data, + g_file_enumerator_close_async, + 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 occurring, 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) +{ + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_file_enumerator_close_async)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (transfer none): 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; +} + +/** + * g_file_enumerator_get_child: + * @enumerator: a #GFileEnumerator + * @info: a #GFileInfo gotten from g_file_enumerator_next_file() + * or the async equivalents. + * + * Return a new #GFile which refers to the file named by @info in the source + * directory of @enumerator. This function is primarily intended to be used + * inside loops with g_file_enumerator_next_file(). + * + * This is a convenience method that's equivalent to: + * |[ + * gchar *name = g_file_info_get_name (info); + * GFile *child = g_file_get_child (g_file_enumerator_get_container (enumr), + * name); + * ]| + * + * Returns: (transfer full): a #GFile for the #GFileInfo passed it. + * + * Since: 2.36 + */ +GFile * +g_file_enumerator_get_child (GFileEnumerator *enumerator, + GFileInfo *info) +{ + g_return_val_if_fail (G_IS_FILE_ENUMERATOR (enumerator), NULL); + + return g_file_get_child (enumerator->priv->container, + g_file_info_get_name (info)); +} + +static void +next_async_op_free (GList *files) +{ + g_list_free_full (files, g_object_unref); +} + +static void +next_files_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileEnumerator *enumerator = source_object; + int num_files = GPOINTER_TO_INT (task_data); + GFileEnumeratorClass *class; + GList *files = NULL; + GError *error = NULL; + GFileInfo *info; + int i; + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + + for (i = 0; i < 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 (g_error_matches (error, G_IO_ERROR, 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 + files = g_list_prepend (files, info); + } + + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, files, (GDestroyNotify)next_async_op_free); +} + +static void +g_file_enumerator_real_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (enumerator, cancellable, callback, user_data); + g_task_set_task_data (task, GINT_TO_POINTER (num_files), NULL); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, next_files_thread); + g_object_unref (task); +} + +static GList * +g_file_enumerator_real_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, enumerator), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +close_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileEnumerator *enumerator = source_object; + GFileEnumeratorClass *class; + GError *error = NULL; + gboolean result; + + class = G_FILE_ENUMERATOR_GET_CLASS (enumerator); + result = class->close_fn (enumerator, cancellable, &error); + if (result) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); +} + +static void +g_file_enumerator_real_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (enumerator, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, close_async_thread); + g_object_unref (task); +} + +static gboolean +g_file_enumerator_real_close_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, enumerator), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/gio/gfileenumerator.h b/gio/gfileenumerator.h new file mode 100644 index 0000000..7607002 --- /dev/null +++ b/gio/gfileenumerator.h @@ -0,0 +1,146 @@ +/* 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_ENUMERATOR_H__ +#define __G_FILE_ENUMERATOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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 *result, + GError **error); + void (* close_async) (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* close_finish) (GFileEnumerator *enumerator, + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_enumerator_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_enumerator_next_files_async (GFileEnumerator *enumerator, + int num_files, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GList * g_file_enumerator_next_files_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_enumerator_close_async (GFileEnumerator *enumerator, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_enumerator_close_finish (GFileEnumerator *enumerator, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_enumerator_is_closed (GFileEnumerator *enumerator); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_enumerator_has_pending (GFileEnumerator *enumerator); +GLIB_AVAILABLE_IN_ALL +void g_file_enumerator_set_pending (GFileEnumerator *enumerator, + gboolean pending); +GLIB_AVAILABLE_IN_ALL +GFile * g_file_enumerator_get_container (GFileEnumerator *enumerator); +GLIB_AVAILABLE_IN_2_36 +GFile * g_file_enumerator_get_child (GFileEnumerator *enumerator, + GFileInfo *info); + +G_END_DECLS + +#endif /* __G_FILE_ENUMERATOR_H__ */ diff --git a/gio/gfileicon.c b/gio/gfileicon.c new file mode 100644 index 0000000..26f2825 --- /dev/null +++ b/gio/gfileicon.c @@ -0,0 +1,340 @@ +/* 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 "gtask.h" +#include "gioerror.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: (transfer full) (type GFileIcon): 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: (transfer none): 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); +} + +static void +load_async_callback (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GFileInputStream *stream; + GError *error = NULL; + GTask *task = user_data; + + stream = g_file_read_finish (G_FILE (source_object), res, &error); + if (stream == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, stream, g_object_unref); + g_object_unref (task); +} + +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); + GTask *task; + + task = g_task_new (icon, cancellable, callback, user_data); + + g_file_read_async (file_icon->file, 0, + cancellable, + load_async_callback, task); +} + +static GInputStream * +g_file_icon_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, icon), NULL); + + if (type) + *type = NULL; + + return g_task_propagate_pointer (G_TASK (res), error); +} + +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; +} diff --git a/gio/gfileicon.h b/gio/gfileicon.h new file mode 100644 index 0000000..2e6f3d5 --- /dev/null +++ b/gio/gfileicon.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 + */ + +#ifndef __G_FILE_ICON_H__ +#define __G_FILE_ICON_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +GType g_file_icon_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GIcon * g_file_icon_new (GFile *file); + +GLIB_AVAILABLE_IN_ALL +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..0298db5 --- /dev/null +++ b/gio/gfileinfo-priv.h @@ -0,0 +1,142 @@ +/* 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_STANDARD_SYMBOLIC_ICON (1048576 + 19) +#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..30bed5c --- /dev/null +++ b/gio/gfileinfo.c @@ -0,0 +1,2705 @@ +/* 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" + + +/* 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] = g_new (char *, 1); + attributes[ns_info->id][0] = g_strconcat (namespace, "::*", 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 (STANDARD_SYMBOLIC_ICON); + 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: (transfer full): 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: (array zero-terminated=1) (transfer full): 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: (out) (allow-none): return location for the attribute type, or %NULL + * @value_pp: (out) (allow-none): return location for the attribute value, or %NULL + * @status: (out) (allow-none): return location for the attribute status, or %NULL + * + * Gets the attribute type, value and status for an attribute key. + * + * Returns: (transfer none): %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), FALSE); + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + 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: (transfer none): 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 UTF-8 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: (transfer none): the contents of the @attribute value as a stringv, or + * %NULL otherwise. Do not free. These returned strings are UTF-8. + * + * 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. To unset the + * attribute, use %G_ATTRIBUTE_TYPE_INVALID for @type. + **/ +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: (array) (element-type utf8): a %NULL terminated array of UTF-8 strings. + * + * 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 UTF-8 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_deletion_date: + * @info: a #GFileInfo. + * + * Returns the #GDateTime representing the deletion date of the file, as + * available in G_FILE_ATTRIBUTE_TRASH_DELETION_DATE. If the + * G_FILE_ATTRIBUTE_TRASH_DELETION_DATE attribute is unset, %NULL is returned. + * + * Returns: a #GDateTime, or %NULL. + * + * Since: 2.36 + **/ +GDateTime * +g_file_info_get_deletion_date (GFileInfo *info) +{ + static guint32 attr = 0; + GFileAttributeValue *value; + const char *date_str; + GTimeVal tv; + + g_return_val_if_fail (G_IS_FILE_INFO (info), FALSE); + + if (attr == 0) + attr = lookup_attribute (G_FILE_ATTRIBUTE_TRASH_DELETION_DATE); + + value = g_file_info_find_value (info, attr); + date_str = _g_file_attribute_value_get_string (value); + if (!date_str) + return NULL; + + if (g_time_val_from_iso8601 (date_str, &tv) == FALSE) + return NULL; + + return g_date_time_new_from_timeval_local (&tv); +} + +/** + * 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: (transfer none): #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_symbolic_icon: + * @info: a #GFileInfo. + * + * Gets the symbolic icon for a file. + * + * Returns: (transfer none): #GIcon for the given @info. + * + * Since: 2.34 + **/ +GIcon * +g_file_info_get_symbolic_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_SYMBOLIC_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: (out caller-allocates): 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_symbolic_icon: + * @info: a #GFileInfo. + * @icon: a #GIcon. + * + * Sets the symbolic icon for a given #GFileInfo. + * See %G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON. + * + * Since: 2.34 + **/ +void +g_file_info_set_symbolic_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_SYMBOLIC_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); +} + + +typedef struct { + guint32 id; + guint32 mask; +} SubMatcher; + +struct _GFileAttributeMatcher { + gboolean all; + gint ref; + + GArray *sub_matchers; + + /* Interator */ + guint32 iterator_ns; + gint iterator_pos; +}; + +G_DEFINE_BOXED_TYPE (GFileAttributeMatcher, g_file_attribute_matcher, + g_file_attribute_matcher_ref, + g_file_attribute_matcher_unref) + +static gint +compare_sub_matchers (gconstpointer a, + gconstpointer b) +{ + const SubMatcher *suba = a; + const SubMatcher *subb = b; + int diff; + + diff = suba->id - subb->id; + + if (diff) + return diff; + + return suba->mask - subb->mask; +} + +static gboolean +sub_matcher_matches (SubMatcher *matcher, + SubMatcher *submatcher) +{ + if ((matcher->mask & submatcher->mask) != matcher->mask) + return FALSE; + + return matcher->id == (submatcher->id & matcher->mask); +} + +/* Call this function after modifying a matcher. + * It will ensure all the invariants other functions rely on. + */ +static GFileAttributeMatcher * +matcher_optimize (GFileAttributeMatcher *matcher) +{ + SubMatcher *submatcher, *compare; + guint i, j; + + /* remove sub_matchers if we match everything anyway */ + if (matcher->all) + { + if (matcher->sub_matchers) + { + g_array_free (matcher->sub_matchers, TRUE); + matcher->sub_matchers = NULL; + } + return matcher; + } + + if (matcher->sub_matchers->len == 0) + { + g_file_attribute_matcher_unref (matcher); + return NULL; + } + + /* sort sub_matchers by id (and then mask), so we can bsearch + * and compare matchers in O(N) instead of O(N²) */ + g_array_sort (matcher->sub_matchers, compare_sub_matchers); + + /* remove duplicates and specific matches when we match the whole namespace */ + j = 0; + compare = &g_array_index (matcher->sub_matchers, SubMatcher, j); + + for (i = 1; i < matcher->sub_matchers->len; i++) + { + submatcher = &g_array_index (matcher->sub_matchers, SubMatcher, i); + if (sub_matcher_matches (compare, submatcher)) + continue; + + j++; + compare++; + + if (j < i) + *compare = *submatcher; + } + + g_array_set_size (matcher->sub_matchers, j + 1); + + return matcher; +} + +/** + * 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; + matcher->sub_matchers = g_array_new (FALSE, FALSE, sizeof (SubMatcher)); + + split = g_strsplit (attributes, ",", -1); + + for (i = 0; split[i] != NULL; i++) + { + if (strcmp (split[i], "*") == 0) + matcher->all = TRUE; + else + { + SubMatcher s; + + colon = strstr (split[i], "::"); + if (colon != NULL && + !(colon[2] == 0 || + (colon[2] == '*' && + colon[3] == 0))) + { + s.id = lookup_attribute (split[i]); + s.mask = 0xffffffff; + } + else + { + if (colon) + *colon = 0; + + s.id = lookup_namespace (split[i]) << NS_POS; + s.mask = NS_MASK << NS_POS; + } + + g_array_append_val (matcher->sub_matchers, s); + } + } + + g_strfreev (split); + + matcher = matcher_optimize (matcher); + + return matcher; +} + +/** + * g_file_attribute_matcher_subtract: + * @matcher: Matcher to subtract from + * @subtract: The matcher to subtract + * + * Subtracts all attributes of @subtract from @matcher and returns + * a matcher that supports those attributes. + * + * Note that currently it is not possible to remove a single + * attribute when the @matcher matches the whole namespace - or remove + * a namespace or attribute when the matcher matches everything. This + * is a limitation of the current implementation, but may be fixed + * in the future. + * + * Returns: A file attribute matcher matching all attributes of + * @matcher that are not matched by @subtract + **/ +GFileAttributeMatcher * +g_file_attribute_matcher_subtract (GFileAttributeMatcher *matcher, + GFileAttributeMatcher *subtract) +{ + GFileAttributeMatcher *result; + guint mi, si; + SubMatcher *msub, *ssub; + + if (matcher == NULL) + return NULL; + if (subtract == NULL) + return g_file_attribute_matcher_ref (matcher); + if (subtract->all) + return NULL; + if (matcher->all) + return g_file_attribute_matcher_ref (matcher); + + result = g_malloc0 (sizeof (GFileAttributeMatcher)); + result->ref = 1; + result->sub_matchers = g_array_new (FALSE, FALSE, sizeof (SubMatcher)); + + si = 0; + g_assert (subtract->sub_matchers->len > 0); + ssub = &g_array_index (subtract->sub_matchers, SubMatcher, si); + + for (mi = 0; mi < matcher->sub_matchers->len; mi++) + { + msub = &g_array_index (matcher->sub_matchers, SubMatcher, mi); + +retry: + if (sub_matcher_matches (ssub, msub)) + continue; + + si++; + if (si >= subtract->sub_matchers->len) + break; + + ssub = &g_array_index (subtract->sub_matchers, SubMatcher, si); + if (ssub->id <= msub->id) + goto retry; + + g_array_append_val (result->sub_matchers, *msub); + } + + if (mi < matcher->sub_matchers->len) + g_array_append_vals (result->sub_matchers, + &g_array_index (matcher->sub_matchers, SubMatcher, mi), + matcher->sub_matchers->len - mi); + + result = matcher_optimize (result); + + return result; +} + +/** + * 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->sub_matchers) + g_array_free (matcher->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) +{ + SubMatcher *sub_matcher; + guint32 id; + + g_return_val_if_fail (attribute != NULL && *attribute != '\0', FALSE); + + if (matcher == NULL || + matcher->all) + return FALSE; + + if (matcher->sub_matchers->len != 1) + return FALSE; + + id = lookup_attribute (attribute); + + sub_matcher = &g_array_index (matcher->sub_matchers, SubMatcher, 0); + + return sub_matcher->id == id && + sub_matcher->mask == 0xffffffff; +} + +static gboolean +matcher_matches_id (GFileAttributeMatcher *matcher, + guint32 id) +{ + SubMatcher *sub_matchers; + int i; + + if (matcher->sub_matchers) + { + sub_matchers = (SubMatcher *)matcher->sub_matchers->data; + for (i = 0; i < matcher->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; + + if (matcher->sub_matchers) + { + sub_matchers = (SubMatcher *)matcher->sub_matchers->data; + for (i = 0; i < matcher->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 (matcher->sub_matchers == NULL) + return NULL; + + if (i < matcher->sub_matchers->len) + sub_matcher = &g_array_index (matcher->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); + } +} + +/** + * g_file_attribute_matcher_to_string: + * @matcher: (allow-none): a #GFileAttributeMatcher. + * + * Prints what the matcher is matching against. The format will be + * equal to the format passed to g_file_attribute_matcher_new(). + * The output however, might not be identical, as the matcher may + * decide to use a different order or omit needless parts. + * + * Returns: a string describing the attributes the matcher matches + * against or %NULL if @matcher was %NULL. + * + * Since: 2.32 + **/ +char * +g_file_attribute_matcher_to_string (GFileAttributeMatcher *matcher) +{ + GString *string; + guint i; + + if (matcher == NULL) + return NULL; + + if (matcher->all) + return g_strdup ("*"); + + string = g_string_new (""); + for (i = 0; i < matcher->sub_matchers->len; i++) + { + SubMatcher *submatcher = &g_array_index (matcher->sub_matchers, SubMatcher, i); + + if (i > 0) + g_string_append_c (string, ','); + + g_string_append (string, get_attribute_for_id (submatcher->id)); + } + + return g_string_free (string, FALSE); +} diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h new file mode 100644 index 0000000..a001b0d --- /dev/null +++ b/gio/gfileinfo.h @@ -0,0 +1,1057 @@ +/* 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_INFO_H__ +#define __G_FILE_INFO_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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_SYMBOLIC_ICON: + * + * A key in the "standard" namespace for getting the symbolic icon for the file. + * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_OBJECT. + * The value for this key should contain a #GIcon. + * + * Since: 2.34 + **/ +#define G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON "standard::symbolic-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_USED: + * + * A key in the "filesystem" namespace for getting the number of bytes of used on the + * file system. Corresponding #GFileAttributeType is + * %G_FILE_ATTRIBUTE_TYPE_UINT64. + * + * Since: 2.32 + */ +#define G_FILE_ATTRIBUTE_FILESYSTEM_USED "filesystem::used" /* 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_BYTE_STRING. + * + * Since: 2.24. + **/ +#define G_FILE_ATTRIBUTE_TRASH_ORIG_PATH "trash::orig-path" /* byte 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 */ + +GLIB_AVAILABLE_IN_ALL +GType g_file_info_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_info_new (void); +GLIB_AVAILABLE_IN_ALL +GFileInfo * g_file_info_dup (GFileInfo *other); +GLIB_AVAILABLE_IN_ALL +void g_file_info_copy_into (GFileInfo *src_info, + GFileInfo *dest_info); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_has_attribute (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_has_namespace (GFileInfo *info, + const char *name_space); +GLIB_AVAILABLE_IN_ALL +char ** g_file_info_list_attributes (GFileInfo *info, + const char *name_space); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_get_attribute_data (GFileInfo *info, + const char *attribute, + GFileAttributeType *type, + gpointer *value_pp, + GFileAttributeStatus *status); +GLIB_AVAILABLE_IN_ALL +GFileAttributeType g_file_info_get_attribute_type (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +void g_file_info_remove_attribute (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +GFileAttributeStatus g_file_info_get_attribute_status (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_set_attribute_status (GFileInfo *info, + const char *attribute, + GFileAttributeStatus status); +GLIB_AVAILABLE_IN_ALL +char * g_file_info_get_attribute_as_string (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_attribute_string (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_attribute_byte_string (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_get_attribute_boolean (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +guint32 g_file_info_get_attribute_uint32 (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gint32 g_file_info_get_attribute_int32 (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +guint64 g_file_info_get_attribute_uint64 (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gint64 g_file_info_get_attribute_int64 (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +GObject * g_file_info_get_attribute_object (GFileInfo *info, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +char ** g_file_info_get_attribute_stringv (GFileInfo *info, + const char *attribute); + +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute (GFileInfo *info, + const char *attribute, + GFileAttributeType type, + gpointer value_p); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_string (GFileInfo *info, + const char *attribute, + const char *attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_byte_string (GFileInfo *info, + const char *attribute, + const char *attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_boolean (GFileInfo *info, + const char *attribute, + gboolean attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_uint32 (GFileInfo *info, + const char *attribute, + guint32 attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_int32 (GFileInfo *info, + const char *attribute, + gint32 attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_uint64 (GFileInfo *info, + const char *attribute, + guint64 attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_int64 (GFileInfo *info, + const char *attribute, + gint64 attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_object (GFileInfo *info, + const char *attribute, + GObject *attr_value); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_stringv (GFileInfo *info, + const char *attribute, + char **attr_value); + +GLIB_AVAILABLE_IN_ALL +void g_file_info_clear_status (GFileInfo *info); + +/* Helper getters: */ +GLIB_AVAILABLE_IN_2_36 +GDateTime * g_file_info_get_deletion_date (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +GFileType g_file_info_get_file_type (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_get_is_hidden (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_get_is_backup (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_info_get_is_symlink (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_name (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_display_name (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_edit_name (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +GIcon * g_file_info_get_icon (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +GIcon * g_file_info_get_symbolic_icon (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_content_type (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +goffset g_file_info_get_size (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_file_info_get_modification_time (GFileInfo *info, + GTimeVal *result); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_symlink_target (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +const char * g_file_info_get_etag (GFileInfo *info); +GLIB_AVAILABLE_IN_ALL +gint32 g_file_info_get_sort_order (GFileInfo *info); + +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_attribute_mask (GFileInfo *info, + GFileAttributeMatcher *mask); +GLIB_AVAILABLE_IN_ALL +void g_file_info_unset_attribute_mask (GFileInfo *info); + +/* Helper setters: */ +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_file_type (GFileInfo *info, + GFileType type); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_is_hidden (GFileInfo *info, + gboolean is_hidden); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_is_symlink (GFileInfo *info, + gboolean is_symlink); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_name (GFileInfo *info, + const char *name); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_display_name (GFileInfo *info, + const char *display_name); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_edit_name (GFileInfo *info, + const char *edit_name); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_icon (GFileInfo *info, + GIcon *icon); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_symbolic_icon (GFileInfo *info, + GIcon *icon); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_content_type (GFileInfo *info, + const char *content_type); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_size (GFileInfo *info, + goffset size); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_modification_time (GFileInfo *info, + GTimeVal *mtime); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_symlink_target (GFileInfo *info, + const char *symlink_target); +GLIB_AVAILABLE_IN_ALL +void g_file_info_set_sort_order (GFileInfo *info, + gint32 sort_order); + +#define G_TYPE_FILE_ATTRIBUTE_MATCHER (g_file_attribute_matcher_get_type ()) +GLIB_AVAILABLE_IN_ALL +GType g_file_attribute_matcher_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFileAttributeMatcher *g_file_attribute_matcher_new (const char *attributes); +GLIB_AVAILABLE_IN_ALL +GFileAttributeMatcher *g_file_attribute_matcher_ref (GFileAttributeMatcher *matcher); +GLIB_AVAILABLE_IN_ALL +void g_file_attribute_matcher_unref (GFileAttributeMatcher *matcher); +GLIB_AVAILABLE_IN_ALL +GFileAttributeMatcher *g_file_attribute_matcher_subtract (GFileAttributeMatcher *matcher, + GFileAttributeMatcher *subtract); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_attribute_matcher_matches (GFileAttributeMatcher *matcher, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_attribute_matcher_matches_only (GFileAttributeMatcher *matcher, + const char *attribute); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_attribute_matcher_enumerate_namespace (GFileAttributeMatcher *matcher, + const char *ns); +GLIB_AVAILABLE_IN_ALL +const char * g_file_attribute_matcher_enumerate_next (GFileAttributeMatcher *matcher); +GLIB_AVAILABLE_IN_2_32 +char * g_file_attribute_matcher_to_string (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..73e7b78 --- /dev/null +++ b/gio/gfileinputstream.c @@ -0,0 +1,434 @@ +/* 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 "gcancellable.h" +#include "gasyncresult.h" +#include "gtask.h" +#include "gioerror.h" +#include "glibintl.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_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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, 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: (transfer full): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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_task_report_error (stream, callback, user_data, + g_file_input_stream_query_info_async, + 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 occurring, + * or %NULL to ignore. + * + * Finishes an asynchronous info query operation. + * + * Returns: (transfer full): #GFileInfo. + **/ +GFileInfo * +g_file_input_stream_query_info_finish (GFileInputStream *stream, + GAsyncResult *result, + GError **error) +{ + 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_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_file_input_stream_query_info_async)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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 * + ********************************************/ + +static void +query_info_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileInputStream *stream = source_object; + const char *attributes = task_data; + GFileInputStreamClass *class; + GError *error = NULL; + GFileInfo *info = NULL; + + 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 (info == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, info, g_object_unref); +} + +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) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (attributes), g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, query_info_async_thread); + g_object_unref (task); +} + +static GFileInfo * +g_file_input_stream_real_query_info_finish (GFileInputStream *stream, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, stream), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} diff --git a/gio/gfileinputstream.h b/gio/gfileinputstream.h new file mode 100644 index 0000000..338ccae --- /dev/null +++ b/gio/gfileinputstream.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 + */ + +#ifndef __G_FILE_INPUT_STREAM_H__ +#define __G_FILE_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 *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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_input_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_input_stream_query_info_async (GFileInputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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..7eb6186 --- /dev/null +++ b/gio/gfileiostream.c @@ -0,0 +1,668 @@ +/* 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 "gasyncresult.h" +#include "gtask.h" +#include "gcancellable.h" +#include "gioerror.h" +#include "gfileoutputstream.h" +#include "glibintl.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: (allow-none): 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: (transfer full): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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_task_report_error (stream, callback, user_data, + g_file_io_stream_query_info_async, + 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: (transfer full): A #GFileInfo for the finished query. + * + * Since: 2.22 + **/ +GFileInfo * +g_file_io_stream_query_info_finish (GFileIOStream *stream, + GAsyncResult *result, + GError **error) +{ + 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_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_file_io_stream_query_info_async)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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; +} diff --git a/gio/gfileiostream.h b/gio/gfileiostream.h new file mode 100644 index 0000000..89a5536 --- /dev/null +++ b/gio/gfileiostream.h @@ -0,0 +1,123 @@ +/* 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 + */ + +#ifndef __G_FILE_IO_STREAM_H__ +#define __G_FILE_IO_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 *result, + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_io_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_io_stream_query_info (GFileIOStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_io_stream_query_info_async (GFileIOStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_io_stream_query_info_finish (GFileIOStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..55d4d6f --- /dev/null +++ b/gio/gfilemonitor.c @@ -0,0 +1,738 @@ +/* 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 "gioenumtypes.h" +#include "gfile.h" +#include "gvfs.h" +#include "glibintl.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; + + GMutex mutex; + 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); + + g_main_context_unref (monitor->priv->context); + g_mutex_clear (&monitor->priv->mutex); + + 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_free_full (priv->pending_file_changes, (GDestroyNotify) file_change_free); + 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: (allow-none): a #GFile or #NULL. + * @event_type: a #GFileMonitorEvent. + * + * Emitted when @file has been changed. + * + * If using #G_FILE_MONITOR_SEND_MOVED flag and @event_type is + * #G_FILE_MONITOR_EVENT_MOVED, @file will be set to a #GFile containing the + * old path, and @other_file will be set to a #GFile containing the new path. + * + * In all the other cases, @other_file will be set to #NULL. + **/ + signals[CHANGED] = + g_signal_new (I_("changed"), + G_TYPE_FILE_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GFileMonitorClass, changed), + NULL, NULL, + NULL, + 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_ref_thread_default (); + g_mutex_init (&monitor->priv->mutex); +} + +/** + * 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 non-negative 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, + gint limit_msecs) +{ + GFileMonitorPrivate *priv; + + g_return_if_fail (G_IS_FILE_MONITOR (monitor)); + g_return_if_fail (limit_msecs >= 0); + + 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; + + g_mutex_lock (&monitor->priv->mutex); + 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_mutex_unlock (&monitor->priv->mutex); + + 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; + + g_mutex_lock (&monitor->priv->mutex); + 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); + g_mutex_unlock (&monitor->priv->mutex); +} + +static guint32 +get_time_msecs (void) +{ + return g_get_monotonic_time () / G_TIME_SPAN_MILLISECOND; +} + +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 eventually */ + 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 eventually */ + 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); + } +} diff --git a/gio/gfilemonitor.h b/gio/gfilemonitor.h new file mode 100644 index 0000000..e29ad0a --- /dev/null +++ b/gio/gfilemonitor.h @@ -0,0 +1,100 @@ +/* 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_MONITOR_H__ +#define __G_FILE_MONITOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_monitor_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_file_monitor_cancel (GFileMonitor *monitor); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_monitor_is_cancelled (GFileMonitor *monitor); +GLIB_AVAILABLE_IN_ALL +void g_file_monitor_set_rate_limit (GFileMonitor *monitor, + gint limit_msecs); + + +/* For implementations */ +GLIB_AVAILABLE_IN_ALL +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..f841c16 --- /dev/null +++ b/gio/gfilenamecompleter.c @@ -0,0 +1,512 @@ +/* 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" + + +/** + * 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; + gboolean dirs_only; + GList *basenames; + + 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_free_full (completer->basenames, g_free); + + 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_free_full (data->basenames, g_free); + + 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_free_full (data->completer->basenames, g_free); + + 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_free_full (data->completer->basenames, g_free); + + /* 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 zero-terminated=1) (transfer full): 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; +} diff --git a/gio/gfilenamecompleter.h b/gio/gfilenamecompleter.h new file mode 100644 index 0000000..0745bbb --- /dev/null +++ b/gio/gfilenamecompleter.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 + */ + +#ifndef __G_FILENAME_COMPLETER_H__ +#define __G_FILENAME_COMPLETER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_filename_completer_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFilenameCompleter *g_filename_completer_new (void); + +GLIB_AVAILABLE_IN_ALL +char * g_filename_completer_get_completion_suffix (GFilenameCompleter *completer, + const char *initial_text); +GLIB_AVAILABLE_IN_ALL +char ** g_filename_completer_get_completions (GFilenameCompleter *completer, + const char *initial_text); +GLIB_AVAILABLE_IN_ALL +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..7b77ba5 --- /dev/null +++ b/gio/gfileoutputstream.c @@ -0,0 +1,537 @@ +/* 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 "gasyncresult.h" +#include "gtask.h" +#include "gcancellable.h" +#include "gioerror.h" +#include "glibintl.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: (transfer full): 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_task_report_error (stream, callback, user_data, + g_file_output_stream_query_info_async, + 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: (transfer full): A #GFileInfo for the finished query. + **/ +GFileInfo * +g_file_output_stream_query_info_finish (GFileOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + 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_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_file_output_stream_query_info_async)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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 * + ********************************************/ + +static void +query_info_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GFileOutputStream *stream = source_object; + const char *attributes = task_data; + GFileOutputStreamClass *class; + GError *error = NULL; + GFileInfo *info = NULL; + + 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 (info == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, info, g_object_unref); +} + +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) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (attributes), g_free); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, query_info_async_thread); + g_object_unref (task); +} + +static GFileInfo * +g_file_output_stream_real_query_info_finish (GFileOutputStream *stream, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (res, stream), NULL); + + return g_task_propagate_pointer (G_TASK (res), error); +} diff --git a/gio/gfileoutputstream.h b/gio/gfileoutputstream.h new file mode 100644 index 0000000..5e8a5fe --- /dev/null +++ b/gio/gfileoutputstream.h @@ -0,0 +1,124 @@ +/* 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_OUTPUT_STREAM_H__ +#define __G_FILE_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 *result, + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_file_output_stream_get_type (void) G_GNUC_CONST; + + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_output_stream_query_info (GFileOutputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_file_output_stream_query_info_async (GFileOutputStream *stream, + const char *attributes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_file_output_stream_query_info_finish (GFileOutputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..890fb6e --- /dev/null +++ b/gio/gfilterinputstream.c @@ -0,0 +1,315 @@ +/* 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 "glibintl.h" + + +/** + * SECTION:gfilterinputstream + * @short_description: Filter Input Stream + * @include: gio/gio.h + * + * Base class for input stream implementations that perform some + * kind of filtering operation on a base stream. Typical examples + * of filtering operations are character set conversion, compression + * and byte order flipping. + **/ + +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_ABSTRACT_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; +} 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 | + 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: (transfer none): 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; +} diff --git a/gio/gfilterinputstream.h b/gio/gfilterinputstream.h new file mode 100644 index 0000000..afe15a5 --- /dev/null +++ b/gio/gfilterinputstream.h @@ -0,0 +1,80 @@ +/* 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 + */ + +#ifndef __G_FILTER_INPUT_STREAM_H__ +#define __G_FILTER_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_filter_input_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GInputStream * g_filter_input_stream_get_base_stream (GFilterInputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_filter_input_stream_get_close_base_stream (GFilterInputStream *stream); +GLIB_AVAILABLE_IN_ALL +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..6f32ce9 --- /dev/null +++ b/gio/gfilteroutputstream.c @@ -0,0 +1,311 @@ +/* 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 "goutputstream.h" +#include "glibintl.h" + + +/** + * SECTION:gfilteroutputstream + * @short_description: Filter Output Stream + * @include: gio/gio.h + * + * Base class for output stream implementations that perform some + * kind of filtering operation on a base stream. Typical examples + * of filtering operations are character set conversion, compression + * and byte order flipping. + */ + +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_ABSTRACT_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: (transfer none): 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; +} diff --git a/gio/gfilteroutputstream.h b/gio/gfilteroutputstream.h new file mode 100644 index 0000000..7e29086 --- /dev/null +++ b/gio/gfilteroutputstream.h @@ -0,0 +1,80 @@ +/* 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 + */ + +#ifndef __G_FILTER_OUTPUT_STREAM_H__ +#define __G_FILTER_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_filter_output_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GOutputStream * g_filter_output_stream_get_base_stream (GFilterOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_filter_output_stream_get_close_base_stream (GFilterOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +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..b75e067 --- /dev/null +++ b/gio/gicon.c @@ -0,0 +1,449 @@ +/* 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" + + +/* 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. + * + * Virtual: hash + * 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: (allow-none): pointer to the first #GIcon. + * @icon2: (allow-none): 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) +{ + 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); + + 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). + * + * + * + * Virtual: to_tokens + * 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) +{ + g_type_ensure (G_TYPE_THEMED_ICON); + g_type_ensure (G_TYPE_FILE_ICON); + g_type_ensure (G_TYPE_EMBLEMED_ICON); + g_type_ensure (G_TYPE_EMBLEM); +} + +/** + * 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: (transfer full): 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 of the icon encoding")); + } + else + { + gchar *scheme; + + /* handle special GFileIcon and GThemedIcon cases */ + scheme = g_uri_parse_scheme (str); + if (scheme != NULL || str[0] == '/' || str[0] == G_DIR_SEPARATOR) + { + 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; +} diff --git a/gio/gicon.h b/gio/gicon.h new file mode 100644 index 0000000..81e32ac --- /dev/null +++ b/gio/gicon.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_ICON_H__ +#define __G_ICON_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_icon_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +guint g_icon_hash (gconstpointer icon); +GLIB_AVAILABLE_IN_ALL +gboolean g_icon_equal (GIcon *icon1, + GIcon *icon2); +GLIB_AVAILABLE_IN_ALL +gchar *g_icon_to_string (GIcon *icon); +GLIB_AVAILABLE_IN_ALL +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..de67272 --- /dev/null +++ b/gio/ginetaddress.c @@ -0,0 +1,885 @@ +/* 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" + + +/** + * 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. + */ + +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) +{ +#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 + + /* If this GInetAddress is the first networking-related object to be + * created, then we won't have called g_networking_init() yet at + * this point. + */ + g_networking_init (); + +#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: (array) (element-type guint8): 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_SOCKET_FAMILY_IPV4 and 16 bytes for + * %G_SOCKET_FAMILY_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: (skip) + * @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); +} + +/** + * g_inet_address_equal: + * @address: A #GInetAddress. + * @other_address: Another #GInetAddress. + * + * Checks if two #GInetAddress instances are equal, e.g. the same address. + * + * Returns: %TRUE if @address and @other_address are equal, %FALSE otherwise. + * + * Since: 2.30 + */ +gboolean +g_inet_address_equal (GInetAddress *address, + GInetAddress *other_address) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + g_return_val_if_fail (G_IS_INET_ADDRESS (other_address), FALSE); + + if (g_inet_address_get_family (address) != g_inet_address_get_family (other_address)) + return FALSE; + + if (memcmp (g_inet_address_to_bytes (address), + g_inet_address_to_bytes (other_address), + g_inet_address_get_native_size (address)) != 0) + return FALSE; + + return TRUE; +} diff --git a/gio/ginetaddress.h b/gio/ginetaddress.h new file mode 100644 index 0000000..940b798 --- /dev/null +++ b/gio/ginetaddress.h @@ -0,0 +1,126 @@ +/* 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_INET_ADDRESS_H__ +#define __G_INET_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_inet_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GInetAddress * g_inet_address_new_from_string (const gchar *string); + +GLIB_AVAILABLE_IN_ALL +GInetAddress * g_inet_address_new_from_bytes (const guint8 *bytes, + GSocketFamily family); + +GLIB_AVAILABLE_IN_ALL +GInetAddress * g_inet_address_new_loopback (GSocketFamily family); + +GLIB_AVAILABLE_IN_ALL +GInetAddress * g_inet_address_new_any (GSocketFamily family); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_equal (GInetAddress *address, + GInetAddress *other_address); + +GLIB_AVAILABLE_IN_ALL +gchar * g_inet_address_to_string (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +const guint8 * g_inet_address_to_bytes (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gsize g_inet_address_get_native_size (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +GSocketFamily g_inet_address_get_family (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_any (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_loopback (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_link_local (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_site_local (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_multicast (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_mc_global (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_mc_link_local (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_mc_node_local (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_mc_org_local (GInetAddress *address); + +GLIB_AVAILABLE_IN_ALL +gboolean g_inet_address_get_is_mc_site_local (GInetAddress *address); + +G_END_DECLS + +#endif /* __G_INET_ADDRESS_H__ */ + diff --git a/gio/ginetaddressmask.c b/gio/ginetaddressmask.c new file mode 100644 index 0000000..560f47c --- /dev/null +++ b/gio/ginetaddressmask.c @@ -0,0 +1,474 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "ginetaddressmask.h" +#include "ginetaddress.h" +#include "ginitable.h" +#include "gioerror.h" +#include "gioenumtypes.h" +#include "glibintl.h" + +/** + * SECTION:ginetaddressmask + * @short_description: An IPv4/IPv6 address mask + * + * #GInetAddressMask represents a range of IPv4 or IPv6 addresses + * described by a base address and a length indicating how many bits + * of the base address are relevant for matching purposes. These are + * often given in string form. Eg, "10.0.0.0/8", or "fe80::/10". + */ + +/** + * GInetAddressMask: + * + * A combination of an IPv4 or IPv6 base address and a length, + * representing a range of IP addresses. + * + * Since: 2.32 + */ + +static void g_inet_address_mask_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GInetAddressMask, g_inet_address_mask, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_inet_address_mask_initable_iface_init)); + +struct _GInetAddressMaskPrivate +{ + GInetAddress *addr; + guint length; +}; + +enum +{ + PROP_0, + PROP_FAMILY, + PROP_ADDRESS, + PROP_LENGTH +}; + +static void +g_inet_address_mask_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GInetAddressMask *mask = G_INET_ADDRESS_MASK (object); + + switch (prop_id) + { + case PROP_ADDRESS: + if (mask->priv->addr) + g_object_unref (mask->priv->addr); + mask->priv->addr = g_value_dup_object (value); + break; + + case PROP_LENGTH: + mask->priv->length = g_value_get_uint (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + +} + +static void +g_inet_address_mask_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GInetAddressMask *mask = G_INET_ADDRESS_MASK (object); + + switch (prop_id) + { + case PROP_FAMILY: + g_value_set_enum (value, g_inet_address_get_family (mask->priv->addr)); + break; + + case PROP_ADDRESS: + g_value_set_object (value, mask->priv->addr); + break; + + case PROP_LENGTH: + g_value_set_uint (value, mask->priv->length); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_inet_address_mask_dispose (GObject *object) +{ + GInetAddressMask *mask = G_INET_ADDRESS_MASK (object); + + g_clear_object (&mask->priv->addr); + + G_OBJECT_CLASS (g_inet_address_mask_parent_class)->dispose (object); +} + +static void +g_inet_address_mask_class_init (GInetAddressMaskClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GInetAddressMaskPrivate)); + + gobject_class->set_property = g_inet_address_mask_set_property; + gobject_class->get_property = g_inet_address_mask_get_property; + gobject_class->dispose = g_inet_address_mask_dispose; + + 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_READABLE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_ADDRESS, + g_param_spec_object ("address", + P_("Address"), + P_("The base address"), + G_TYPE_INET_ADDRESS, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_LENGTH, + g_param_spec_uint ("length", + P_("Length"), + P_("The prefix length"), + 0, 128, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static gboolean +g_inet_address_mask_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GInetAddressMask *mask = G_INET_ADDRESS_MASK (initable); + guint addrlen, nbytes, nbits; + const guint8 *bytes; + gboolean ok; + + if (!mask->priv->addr) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("No address specified")); + return FALSE; + } + + addrlen = g_inet_address_get_native_size (mask->priv->addr); + if (mask->priv->length > addrlen * 8) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Length %u is too long for address"), + mask->priv->length); + return FALSE; + } + + /* Make sure all the bits after @length are 0 */ + bytes = g_inet_address_to_bytes (mask->priv->addr); + ok = TRUE; + + nbytes = mask->priv->length / 8; + bytes += nbytes; + addrlen -= nbytes; + + nbits = mask->priv->length % 8; + if (nbits) + { + if (bytes[0] & (0xFF >> nbits)) + ok = FALSE; + bytes++; + addrlen--; + } + + while (addrlen) + { + if (bytes[0]) + ok = FALSE; + bytes++; + addrlen--; + } + + if (!ok) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Address has bits set beyond prefix length")); + return FALSE; + } + + return TRUE; +} + +static void +g_inet_address_mask_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_inet_address_mask_initable_init; +} + +static void +g_inet_address_mask_init (GInetAddressMask *mask) +{ + mask->priv = G_TYPE_INSTANCE_GET_PRIVATE (mask, + G_TYPE_INET_ADDRESS_MASK, + GInetAddressMaskPrivate); +} + +/** + * g_inet_address_mask_new: + * @addr: a #GInetAddress + * @length: number of bits of @addr to use + * @error: return location for #GError, or %NULL + * + * Creates a new #GInetAddressMask representing all addresses whose + * first @length bits match @addr. + * + * Returns: a new #GInetAddressMask, or %NULL on error + * + * Since: 2.32 + */ +GInetAddressMask * +g_inet_address_mask_new (GInetAddress *addr, + guint length, + GError **error) +{ + return g_initable_new (G_TYPE_INET_ADDRESS_MASK, NULL, error, + "address", addr, + "length", length, + NULL); +} + +/** + * g_inet_address_mask_new_from_string: + * @mask_string: an IP address or address/length string + * @error: return location for #GError, or %NULL + * + * Parses @mask_string as an IP address and (optional) length, and + * creates a new #GInetAddressMask. The length, if present, is + * delimited by a "/". If it is not present, then the length is + * assumed to be the full length of the address. + * + * Returns: a new #GInetAddressMask corresponding to @string, or %NULL + * on error. + * + * Since: 2.32 + */ +GInetAddressMask * +g_inet_address_mask_new_from_string (const gchar *mask_string, + GError **error) +{ + GInetAddressMask *mask; + GInetAddress *addr; + gchar *slash; + guint length; + + slash = strchr (mask_string, '/'); + if (slash) + { + gchar *address, *end; + + length = strtoul (slash + 1, &end, 10); + if (*end || !*(slash + 1)) + { + parse_error: + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Could not parse '%s' as IP address mask"), + mask_string); + return NULL; + } + + address = g_strndup (mask_string, slash - mask_string); + addr = g_inet_address_new_from_string (address); + g_free (address); + + if (!addr) + goto parse_error; + } + else + { + addr = g_inet_address_new_from_string (mask_string); + if (!addr) + goto parse_error; + + length = g_inet_address_get_native_size (addr) * 8; + } + + mask = g_inet_address_mask_new (addr, length, error); + g_object_unref (addr); + + return mask; +} + +/** + * g_inet_address_mask_to_string: + * @mask: a #GInetAddressMask + * + * Converts @mask back to its corresponding string form. + * + * Return value: a string corresponding to @mask. + * + * Since: 2.32 + */ +gchar * +g_inet_address_mask_to_string (GInetAddressMask *mask) +{ + gchar *addr_string, *mask_string; + + g_return_val_if_fail (G_IS_INET_ADDRESS_MASK (mask), NULL); + + addr_string = g_inet_address_to_string (mask->priv->addr); + + if (mask->priv->length == (g_inet_address_get_native_size (mask->priv->addr) * 8)) + return addr_string; + + mask_string = g_strdup_printf ("%s/%u", addr_string, mask->priv->length); + g_free (addr_string); + + return mask_string; +} + +/** + * g_inet_address_mask_get_family: + * @mask: a #GInetAddressMask + * + * Gets the #GSocketFamily of @mask's address + * + * Return value: the #GSocketFamily of @mask's address + * + * Since: 2.32 + */ +GSocketFamily +g_inet_address_mask_get_family (GInetAddressMask *mask) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS_MASK (mask), G_SOCKET_FAMILY_INVALID); + + return g_inet_address_get_family (mask->priv->addr); +} + +/** + * g_inet_address_mask_get_address: + * @mask: a #GInetAddressMask + * + * Gets @mask's base address + * + * Return value: (transfer none): @mask's base address + * + * Since: 2.32 + */ +GInetAddress * +g_inet_address_mask_get_address (GInetAddressMask *mask) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS_MASK (mask), NULL); + + return mask->priv->addr; +} + +/** + * g_inet_address_mask_get_length: + * @mask: a #GInetAddressMask + * + * Gets @mask's length + * + * Return value: @mask's length + * + * Since: 2.32 + */ +guint +g_inet_address_mask_get_length (GInetAddressMask *mask) +{ + g_return_val_if_fail (G_IS_INET_ADDRESS_MASK (mask), 0); + + return mask->priv->length; +} + +/** + * g_inet_address_mask_matches: + * @mask: a #GInetAddressMask + * @address: a #GInetAddress + * + * Tests if @address falls within the range described by @mask. + * + * Return value: whether @address falls within the range described by + * @mask. + * + * Since: 2.32 + */ +gboolean +g_inet_address_mask_matches (GInetAddressMask *mask, + GInetAddress *address) +{ + const guint8 *maskbytes, *addrbytes; + int nbytes, nbits; + + g_return_val_if_fail (G_IS_INET_ADDRESS_MASK (mask), FALSE); + g_return_val_if_fail (G_IS_INET_ADDRESS (address), FALSE); + + if (g_inet_address_get_family (mask->priv->addr) != + g_inet_address_get_family (address)) + return FALSE; + + if (mask->priv->length == 0) + return TRUE; + + maskbytes = g_inet_address_to_bytes (mask->priv->addr); + addrbytes = g_inet_address_to_bytes (address); + + nbytes = mask->priv->length / 8; + if (nbytes != 0 && memcmp (maskbytes, addrbytes, nbytes) != 0) + return FALSE; + + nbits = mask->priv->length % 8; + if (nbits == 0) + return TRUE; + + return maskbytes[nbytes] == (addrbytes[nbytes] & (0xFF << (8 - nbits))); +} + + +/** + * g_inet_address_mask_equal: + * @mask: a #GInetAddressMask + * @mask2: another #GInetAddressMask + * + * Tests if @mask and @mask2 are the same mask. + * + * Return value: whether @mask and @mask2 are the same mask + * + * Since: 2.32 + */ +gboolean +g_inet_address_mask_equal (GInetAddressMask *mask, + GInetAddressMask *mask2) +{ + return ((mask->priv->length == mask2->priv->length) && + g_inet_address_equal (mask->priv->addr, mask2->priv->addr)); +} diff --git a/gio/ginetaddressmask.h b/gio/ginetaddressmask.h new file mode 100644 index 0000000..05b0630 --- /dev/null +++ b/gio/ginetaddressmask.h @@ -0,0 +1,87 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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_INET_ADDRESS_MASK_H__ +#define __G_INET_ADDRESS_MASK_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_INET_ADDRESS_MASK (g_inet_address_mask_get_type ()) +#define G_INET_ADDRESS_MASK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_INET_ADDRESS_MASK, GInetAddressMask)) +#define G_INET_ADDRESS_MASK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_INET_ADDRESS_MASK, GInetAddressMaskClass)) +#define G_IS_INET_ADDRESS_MASK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_INET_ADDRESS_MASK)) +#define G_IS_INET_ADDRESS_MASK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INET_ADDRESS_MASK)) +#define G_INET_ADDRESS_MASK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_INET_ADDRESS_MASK, GInetAddressMaskClass)) + +typedef struct _GInetAddressMaskClass GInetAddressMaskClass; +typedef struct _GInetAddressMaskPrivate GInetAddressMaskPrivate; + +struct _GInetAddressMask +{ + GObject parent_instance; + + /*< private >*/ + GInetAddressMaskPrivate *priv; +}; + +struct _GInetAddressMaskClass +{ + GObjectClass parent_class; + +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_inet_address_mask_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +GInetAddressMask *g_inet_address_mask_new (GInetAddress *addr, + guint length, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +GInetAddressMask *g_inet_address_mask_new_from_string (const gchar *mask_string, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gchar *g_inet_address_mask_to_string (GInetAddressMask *mask); + +GLIB_AVAILABLE_IN_2_32 +GSocketFamily g_inet_address_mask_get_family (GInetAddressMask *mask); +GLIB_AVAILABLE_IN_2_32 +GInetAddress *g_inet_address_mask_get_address (GInetAddressMask *mask); +GLIB_AVAILABLE_IN_2_32 +guint g_inet_address_mask_get_length (GInetAddressMask *mask); + +GLIB_AVAILABLE_IN_2_32 +gboolean g_inet_address_mask_matches (GInetAddressMask *mask, + GInetAddress *address); +GLIB_AVAILABLE_IN_2_32 +gboolean g_inet_address_mask_equal (GInetAddressMask *mask, + GInetAddressMask *mask2); + +G_END_DECLS + +#endif /* __G_INET_ADDRESS_MASK_H__ */ + diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c new file mode 100644 index 0000000..9b45aa2 --- /dev/null +++ b/gio/ginetsocketaddress.c @@ -0,0 +1,422 @@ +/* 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" + + +/** + * 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, + PROP_FLOWINFO, + PROP_SCOPE_ID +}; + +struct _GInetSocketAddressPrivate +{ + GInetAddress *address; + guint16 port; + guint32 flowinfo; + guint32 scope_id; +}; + +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; + + case PROP_FLOWINFO: + g_return_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6); + g_value_set_uint (value, address->priv->flowinfo); + break; + + case PROP_SCOPE_ID: + g_return_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6); + g_value_set_uint (value, address->priv->scope_id); + 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; + + case PROP_FLOWINFO: + /* We can't test that address->priv->address is IPv6 here, + * since this property might get set before PROP_ADDRESS. + */ + address->priv->flowinfo = g_value_get_uint (value); + break; + + case PROP_SCOPE_ID: + address->priv->scope_id = 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), FALSE); + + 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); + sock->sin6_flowinfo = addr->priv->flowinfo; + sock->sin6_scope_id = addr->priv->scope_id; + 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)); + + /** + * GInetSocketAddress:flowinfo: + * + * The sin6_flowinfo field, for IPv6 addresses. + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_FLOWINFO, + g_param_spec_uint ("flowinfo", + P_("Flow info"), + P_("IPv6 flow info"), + 0, + G_MAXUINT32, + 0, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GInetSocketAddress:scope_id: + * + * The sin6_scope_id field, for IPv6 addresses. + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_SCOPE_ID, + g_param_spec_uint ("scope-id", + P_("Scope ID"), + P_("IPv6 scope ID"), + 0, + G_MAXUINT32, + 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); +} + +/** + * 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: (transfer none): 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; +} + + +/** + * g_inet_socket_address_get_flowinfo: + * @address: a %G_SOCKET_FAMILY_IPV6 #GInetSocketAddress + * + * Gets the sin6_flowinfo field from @address, + * which must be an IPv6 address. + * + * Return value: the flowinfo field + * + * Since: 2.32 + */ +guint32 +g_inet_socket_address_get_flowinfo (GInetSocketAddress *address) +{ + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + g_return_val_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6, 0); + + return address->priv->flowinfo; +} + +/** + * g_inet_socket_address_get_scope_id: + * @address: a %G_SOCKET_FAMILY_IPV6 #GInetAddress + * + * Gets the sin6_scope_id field from @address, + * which must be an IPv6 address. + * + * Return value: the scope id field + * + * Since: 2.32 + */ +guint32 +g_inet_socket_address_get_scope_id (GInetSocketAddress *address) +{ + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); + g_return_val_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6, 0); + + return address->priv->scope_id; +} diff --git a/gio/ginetsocketaddress.h b/gio/ginetsocketaddress.h new file mode 100644 index 0000000..1865a3b --- /dev/null +++ b/gio/ginetsocketaddress.h @@ -0,0 +1,77 @@ +/* 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_INET_SOCKET_ADDRESS_H__ +#define __G_INET_SOCKET_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_inet_socket_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_inet_socket_address_new (GInetAddress *address, + guint16 port); + +GLIB_AVAILABLE_IN_ALL +GInetAddress * g_inet_socket_address_get_address (GInetSocketAddress *address); +GLIB_AVAILABLE_IN_ALL +guint16 g_inet_socket_address_get_port (GInetSocketAddress *address); + +GLIB_AVAILABLE_IN_2_32 +guint32 g_inet_socket_address_get_flowinfo (GInetSocketAddress *address); +GLIB_AVAILABLE_IN_2_32 +guint32 g_inet_socket_address_get_scope_id (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..3205b2f --- /dev/null +++ b/gio/ginitable.c @@ -0,0 +1,238 @@ +/* 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" + + +/** + * 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 then + * it must be initialized as the first thing after construction, + * either via g_initable_init() or g_async_initable_init_async() + * (the latter is only available if it also implements #GAsyncInitable). + * + * If the object is not initialized, or initialization returns with an + * error, then all operations on the object except g_object_ref() and + * g_object_unref() are considered to be invalid, and have undefined + * behaviour. They will often fail with g_critical() or g_warning(), but + * this must not be relied on. + * + * 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 (at which point the instance is + * unreferenced). + * + * 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. + */ + +typedef GInitableIface GInitableInterface; +G_DEFINE_INTERFACE (GInitable, g_initable, G_TYPE_OBJECT) + +static void +g_initable_default_init (GInitableInterface *iface) +{ +} + +/** + * g_initable_init: + * @initable: a #GInitable. + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Initializes the object implementing the interface. + * + * The object must be initialized before any real use after initial + * construction, either with this function or g_async_initable_init_async(). + * + * 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 the object is not initialized, or initialization returns with an + * error, then all operations on the object except g_object_ref() and + * g_object_unref() are considered to be invalid, and have undefined + * behaviour. See the section introduction + * for more details. + * + * 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. + * + * 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 occurring, or %NULL to + * ignore. + * @first_property_name: (allow-none): 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 #GInitable object. This is + * similar to g_object_new() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: (type GObject.Object) (transfer full): 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: (array length=n_parameters): the parameters to use to construct the object + * @cancellable: optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Helper function for constructing #GInitable object. This is + * similar to g_object_newv() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: (type GObject.Object) (transfer full): 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 occurring, or %NULL to + * ignore. + * + * Helper function for constructing #GInitable object. This is + * similar to g_object_new_valist() but also initializes the object + * and returns %NULL, setting an error on failure. + * + * Return value: (type GObject.Object) (transfer full): 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; +} diff --git a/gio/ginitable.h b/gio/ginitable.h new file mode 100644 index 0000000..c147013 --- /dev/null +++ b/gio/ginitable.h @@ -0,0 +1,101 @@ +/* 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 + */ + +#ifndef __G_INITABLE_H__ +#define __G_INITABLE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_initable_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gpointer g_initable_new (GType object_type, + GCancellable *cancellable, + GError **error, + const gchar *first_property_name, + ...); +GLIB_AVAILABLE_IN_ALL +gpointer g_initable_newv (GType object_type, + guint n_parameters, + GParameter *parameters, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..5fbf025 --- /dev/null +++ b/gio/ginputstream.c @@ -0,0 +1,1363 @@ +/* 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 "gioerror.h" +#include "gpollableinputstream.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_ABSTRACT_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: (array length=count) (element-type guint8): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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, or 0 on end of file. + **/ +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: (array length=count) (element-type guint8): 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: (out): location to store the number of bytes that was read from the stream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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_read_bytes: + * @stream: a #GInputStream. + * @count: maximum number of bytes that will be read from the stream. Common + * values include 4096 and 8192. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, or %NULL to ignore + * + * Like g_input_stream_read(), this tries to read @count bytes from + * the stream in a blocking fashion. However, rather than reading into + * a user-supplied buffer, this will create a new #GBytes containing + * the data that was read. This may be easier to use from language + * bindings. + * + * If count is zero, returns a zero-length #GBytes and does nothing. A + * value of @count larger than %G_MAXSSIZE will cause a + * %G_IO_ERROR_INVALID_ARGUMENT error. + * + * On success, a new #GBytes is returned. It is not an error if the + * size of this object is not the same as the requested size, as it + * can happen e.g. near the end of a file. A zero-length #GBytes 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 %NULL is returned and @error is set accordingly. + * + * Return value: a new #GBytes, or %NULL on error + **/ +GBytes * +g_input_stream_read_bytes (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + guchar *buf; + gssize nread; + + buf = g_malloc (count); + nread = g_input_stream_read (stream, buf, count, cancellable, error); + if (nread == -1) + { + g_free (buf); + return NULL; + } + else if (nread == 0) + { + g_free (buf); + return g_bytes_new_static ("", 0); + } + else + return g_bytes_new_take (buf, nread); +} + +/** + * g_input_stream_skip: + * @stream: a #GInputStream. + * @count: the number of bytes that will be skipped from the stream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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: (array length=count) (element-type guint8): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + g_return_if_fail (buffer != NULL); + + if (count == 0) + { + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_input_stream_read_async); + g_task_return_int (task, 0); + g_object_unref (task); + return; + } + + if (((gssize) count) < 0) + { + g_task_report_new_error (stream, callback, user_data, + g_input_stream_read_async, + 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_task_report_error (stream, callback, user_data, + g_input_stream_read_async, + 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 occurring, or %NULL to + * ignore. + * + * Finishes an asynchronous stream read operation. + * + * Returns: number of bytes read in, or -1 on error, or 0 on end of file. + **/ +gssize +g_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + 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_async_result_legacy_propagate_error (result, error)) + return -1; + else if (g_async_result_is_tagged (result, g_input_stream_read_async)) + return g_task_propagate_int (G_TASK (result), error); + + class = G_INPUT_STREAM_GET_CLASS (stream); + return class->read_finish (stream, result, error); +} + +static void +read_bytes_callback (GObject *stream, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + guchar *buf = g_task_get_task_data (task); + GError *error = NULL; + gssize nread; + GBytes *bytes = NULL; + + nread = g_input_stream_read_finish (G_INPUT_STREAM (stream), + result, &error); + if (nread == -1) + { + g_free (buf); + g_task_return_error (task, error); + } + else if (nread == 0) + { + g_free (buf); + bytes = g_bytes_new_static ("", 0); + } + else + bytes = g_bytes_new_take (buf, nread); + + if (bytes) + g_task_return_pointer (task, bytes, (GDestroyNotify)g_bytes_unref); + + g_object_unref (task); +} + +/** + * g_input_stream_read_bytes_async: + * @stream: A #GInputStream. + * @count: the number of bytes that will be read from the stream + * @io_priority: the I/O priority + * of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Request an asynchronous read of @count bytes from the stream into a + * new #GBytes. When the operation is finished @callback will be + * called. You can then call g_input_stream_read_bytes_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 new #GBytes will be passed to the callback. It is + * not an error if this is smaller than 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. + **/ +void +g_input_stream_read_bytes_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + guchar *buf; + + task = g_task_new (stream, cancellable, callback, user_data); + buf = g_malloc (count); + g_task_set_task_data (task, buf, NULL); + + g_input_stream_read_async (stream, buf, count, + io_priority, cancellable, + read_bytes_callback, task); +} + +/** + * g_input_stream_read_bytes_finish: + * @stream: a #GInputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an asynchronous stream read-into-#GBytes operation. + * + * Returns: the newly-allocated #GBytes, or %NULL on error + **/ +GBytes * +g_input_stream_read_bytes_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_INPUT_STREAM (stream), NULL); + g_return_val_if_fail (g_task_is_valid (result, stream), NULL); + + return g_task_propagate_pointer (G_TASK (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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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 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. + **/ +void +g_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + + if (count == 0) + { + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_input_stream_skip_async); + g_task_return_int (task, 0); + g_object_unref (task); + return; + } + + if (((gssize) count) < 0) + { + g_task_report_new_error (stream, callback, user_data, + g_input_stream_skip_async, + 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_task_report_error (stream, callback, user_data, + g_input_stream_skip_async, + 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 occurring, 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) +{ + 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_async_result_legacy_propagate_error (result, error)) + return -1; + else if (g_async_result_is_tagged (result, g_input_stream_skip_async)) + return g_task_propagate_int (G_TASK (result), error); + + 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: (allow-none): optional cancellable object + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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; + GError *error = NULL; + + g_return_if_fail (G_IS_INPUT_STREAM (stream)); + + if (stream->priv->closed) + { + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_input_stream_close_async); + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + if (!g_input_stream_set_pending (stream, &error)) + { + g_task_report_error (stream, callback, user_data, + g_input_stream_close_async, + 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 occurring, 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) +{ + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_input_stream_close_async)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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 occurring, 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; +} ReadData; + +static void +free_read_data (ReadData *op) +{ + g_slice_free (ReadData, op); +} + +static void +read_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GInputStream *stream = source_object; + ReadData *op = task_data; + GInputStreamClass *class; + GError *error = NULL; + gssize nread; + + class = G_INPUT_STREAM_GET_CLASS (stream); + + nread = class->read_fn (stream, + op->buffer, op->count, + g_task_get_cancellable (task), + &error); + if (nread == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, nread); +} + +static void read_async_pollable (GPollableInputStream *stream, + GTask *task); + +static gboolean +read_async_pollable_ready (GPollableInputStream *stream, + gpointer user_data) +{ + GTask *task = user_data; + + read_async_pollable (stream, task); + return FALSE; +} + +static void +read_async_pollable (GPollableInputStream *stream, + GTask *task) +{ + ReadData *op = g_task_get_task_data (task); + GError *error = NULL; + gssize nread; + + if (g_task_return_error_if_cancelled (task)) + return; + + nread = G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)-> + read_nonblocking (stream, op->buffer, op->count, &error); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + { + GSource *source; + + g_error_free (error); + + source = g_pollable_input_stream_create_source (stream, + g_task_get_cancellable (task)); + g_task_attach_source (task, source, + (GSourceFunc) read_async_pollable_ready); + g_source_unref (source); + return; + } + + if (nread == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, nread); + /* g_input_stream_real_read_async() unrefs task */ +} + +#define CAN_DO_NONBLOCKING_READS(stream) \ + (G_IS_POLLABLE_INPUT_STREAM (stream) && \ + g_pollable_input_stream_can_poll (G_POLLABLE_INPUT_STREAM (stream))) + + +static void +g_input_stream_real_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + ReadData *op; + + op = g_slice_new0 (ReadData); + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, op, (GDestroyNotify) free_read_data); + g_task_set_priority (task, io_priority); + op->buffer = buffer; + op->count = count; + + if (CAN_DO_NONBLOCKING_READS (stream)) + read_async_pollable (G_POLLABLE_INPUT_STREAM (stream), task); + else + g_task_run_in_thread (task, read_async_thread); + g_object_unref (task); +} + +static gssize +g_input_stream_real_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (result), error); +} + + +static void +skip_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GInputStream *stream = source_object; + gsize count = GPOINTER_TO_SIZE (task_data); + GInputStreamClass *class; + GError *error = NULL; + gssize ret; + + class = G_INPUT_STREAM_GET_CLASS (stream); + ret = class->skip (stream, count, + g_task_get_cancellable (task), + &error); + if (ret == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, ret); +} + +typedef struct { + char buffer[8192]; + gsize count; + gsize count_skipped; +} SkipFallbackAsyncData; + +static void +skip_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GInputStreamClass *class; + GTask *task = user_data; + SkipFallbackAsyncData *data = g_task_get_task_data (task); + 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), + g_task_get_priority (task), + g_task_get_cancellable (task), + skip_callback_wrapper, task); + return; + } + } + + if (ret == -1 && + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + data->count_skipped) + { + /* No error, return partial read */ + g_clear_error (&error); + } + + if (error) + g_task_return_error (task, error); + else + g_task_return_int (task, data->count_skipped); + g_object_unref (task); + } + +static void +g_input_stream_real_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GInputStreamClass *class; + SkipFallbackAsyncData *data; + GTask *task; + + class = G_INPUT_STREAM_GET_CLASS (stream); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + if (class->read_async == g_input_stream_real_read_async && + !CAN_DO_NONBLOCKING_READS (stream)) + { + /* Read is thread-using async fallback. + * Make skip use threads too, so that we can use a possible sync skip + * implementation. */ + g_task_set_task_data (task, GSIZE_TO_POINTER (count), NULL); + + g_task_run_in_thread (task, skip_async_thread); + g_object_unref (task); + } + 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; + g_task_set_task_data (task, data, g_free); + g_task_set_check_cancellable (task, FALSE); + class->read_async (stream, data->buffer, MIN (8192, count), io_priority, cancellable, + skip_callback_wrapper, task); + } + +} + +static gssize +g_input_stream_real_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (result), error); +} + +static void +close_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GInputStream *stream = source_object; + GInputStreamClass *class; + GError *error = NULL; + gboolean result; + + class = G_INPUT_STREAM_GET_CLASS (stream); + if (class->close_fn) + { + result = class->close_fn (stream, + g_task_get_cancellable (task), + &error); + if (!result) + { + g_task_return_error (task, error); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static void +g_input_stream_real_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_check_cancellable (task, FALSE); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, close_async_thread); + g_object_unref (task); +} + +static gboolean +g_input_stream_real_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/gio/ginputstream.h b/gio/ginputstream.h new file mode 100644 index 0000000..bedfba7 --- /dev/null +++ b/gio/ginputstream.h @@ -0,0 +1,203 @@ +/* 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_INPUT_STREAM_H__ +#define __G_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_input_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gssize g_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_read_all (GInputStream *stream, + void *buffer, + gsize count, + gsize *bytes_read, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_34 +GBytes *g_input_stream_read_bytes (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_input_stream_read_async (GInputStream *stream, + void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gssize g_input_stream_read_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_2_34 +void g_input_stream_read_bytes_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +GBytes *g_input_stream_read_bytes_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_input_stream_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gssize g_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error); + +/* For implementations: */ + +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_is_closed (GInputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_has_pending (GInputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_input_stream_set_pending (GInputStream *stream, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_input_stream_clear_pending (GInputStream *stream); + +G_END_DECLS + +#endif /* __G_INPUT_STREAM_H__ */ diff --git a/gio/gio-querymodules.c b/gio/gio-querymodules.c new file mode 100644 index 0000000..ee60fef --- /dev/null +++ b/gio/gio-querymodules.c @@ -0,0 +1,146 @@ +/* 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" + +#include +#include + +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); + + if (data->len > 0) + { + 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); + } + } + else + { + if (g_unlink (cachename) != 0 && errno != ENOENT) + g_printerr ("Unable to unlink %s: %s\n", cachename, g_strerror (errno)); + } + + g_string_free (data, TRUE); +} + +int +main (gint argc, + gchar *argv[]) +{ + int i; + + if (argc == 1) + { + g_print ("Usage: gio-querymodules [ ...]\n"); + g_print ("Will update giomodule.cache in the listed directories\n"); + return 1; + } + + /* Be defensive and ensure we're linked to GObject */ + g_type_ensure (G_TYPE_OBJECT); + + 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..1f83062 --- /dev/null +++ b/gio/gio.h @@ -0,0 +1,164 @@ +/* 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 +#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..cfaa42d --- /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-2011 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/gioenums.h b/gio/gioenums.h new file mode 100644 index 0000000..b76f7a6 --- /dev/null +++ b/gio/gioenums.h @@ -0,0 +1,1663 @@ +/* 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 __GIO_ENUMS_H__ +#define __GIO_ENUMS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + * @G_APP_INFO_CREATE_SUPPORTS_STARTUP_NOTIFICATION: Application supports startup notification. Since 2.26 + * + * 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 >*/ + G_APP_INFO_CREATE_SUPPORTS_STARTUP_NOTIFICATION = (1 << 2) /*< nick=supports-startup-notification >*/ +} 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 /*< flags >*/ { + 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 /*< flags >*/ { + 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). + * @G_FILE_MONITOR_WATCH_HARD_LINKS: Watch for changes to the file made + * via another hard link. Since 2.36. + * + * 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), + G_FILE_MONITOR_WATCH_HARD_LINKS = (1 << 2) +} 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. + * @G_IO_ERROR_EXISTS: File already exists. + * @G_IO_ERROR_IS_DIRECTORY: File is a directory. + * @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: The input data was invalid. Since 2.24 + * @G_IO_ERROR_DBUS_ERROR: A remote object generated an error that + * doesn't correspond to a locally registered #GError error + * domain. Use g_dbus_error_get_remote_error() to extract the D-Bus + * error name and g_dbus_error_strip_remote_error() to fix up the + * message so it matches what was received on the wire. Since 2.26. + * @G_IO_ERROR_HOST_UNREACHABLE: Host unreachable. Since 2.26 + * @G_IO_ERROR_NETWORK_UNREACHABLE: Network unreachable. Since 2.26 + * @G_IO_ERROR_CONNECTION_REFUSED: Connection refused. Since 2.26 + * @G_IO_ERROR_PROXY_FAILED: Connection to proxy server failed. Since 2.26 + * @G_IO_ERROR_PROXY_AUTH_FAILED: Proxy authentication failed. Since 2.26 + * @G_IO_ERROR_PROXY_NEED_AUTH: Proxy server needs authentication. Since 2.26 + * @G_IO_ERROR_PROXY_NOT_ALLOWED: Proxy connection is not allowed by ruleset. + * Since 2.26 + * @G_IO_ERROR_BROKEN_PIPE: Broken pipe. Since 2.36 + * + * 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, + G_IO_ERROR_DBUS_ERROR, + G_IO_ERROR_HOST_UNREACHABLE, + G_IO_ERROR_NETWORK_UNREACHABLE, + G_IO_ERROR_CONNECTION_REFUSED, + G_IO_ERROR_PROXY_FAILED, + G_IO_ERROR_PROXY_AUTH_FAILED, + G_IO_ERROR_PROXY_NEED_AUTH, + G_IO_ERROR_PROXY_NOT_ALLOWED, + G_IO_ERROR_BROKEN_PIPE +} 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; + + +/** + * GIOStreamSpliceFlags: + * @G_IO_STREAM_SPLICE_NONE: Do not close either stream. + * @G_IO_STREAM_SPLICE_CLOSE_STREAM1: Close the first stream after + * the splice. + * @G_IO_STREAM_SPLICE_CLOSE_STREAM2: Close the second stream after + * the splice. + * @G_IO_STREAM_SPLICE_WAIT_FOR_BOTH: Wait for both splice operations to finish + * before calling the callback. + * + * GIOStreamSpliceFlags determine how streams should be spliced. + * + * Since: 2.28 + **/ +typedef enum { + G_IO_STREAM_SPLICE_NONE = 0, + G_IO_STREAM_SPLICE_CLOSE_STREAM1 = (1 << 0), + G_IO_STREAM_SPLICE_CLOSE_STREAM2 = (1 << 1), + G_IO_STREAM_SPLICE_WAIT_FOR_BOTH = (1 << 2) +} GIOStreamSpliceFlags; + +/** + * 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; + +/** + * GResolverRecordType: + * @G_RESOLVER_RECORD_SRV: lookup DNS SRV records for a domain + * @G_RESOLVER_RECORD_MX: lookup DNS MX records for a domain + * @G_RESOLVER_RECORD_TXT: lookup DNS TXT records for a name + * @G_RESOLVER_RECORD_SOA: lookup DNS SOA records for a zone + * @G_RESOLVER_RECORD_NS: lookup DNS NS records for a domain + * + * The type of record that g_resolver_lookup_records() or + * g_resolver_lookup_records_async() should retrieve. The records are returned + * as lists of #GVariant tuples. Each record type has different values in + * the variant tuples returned. + * + * %G_RESOLVER_RECORD_SRV records are returned as variants with the signature + * '(qqqs)', containing a guint16 with the priority, a guint16 with the + * weight, a guint16 with the port, and a string of the hostname. + * + * %G_RESOLVER_RECORD_MX records are returned as variants with the signature + * '(qs)', representing a guint16 with the preference, and a string containing + * the mail exchanger hostname. + * + * %G_RESOLVER_RECORD_TXT records are returned as variants with the signature + * '(as)', representing an array of the strings in the text record. + * + * %G_RESOLVER_RECORD_SOA records are returned as variants with the signature + * '(ssuuuuu)', representing a string containing the primary name server, a + * string containing the administrator, the serial as a guint32, the refresh + * interval as guint32, the retry interval as a guint32, the expire timeout + * as a guint32, and the ttl as a guint32. + * + * %G_RESOLVER_RECORD_NS records are returned as variants with the signature + * '(s)', representing a string of the hostname of the name server. + * + * Since: 2.34 + */ +typedef enum { + G_RESOLVER_RECORD_SRV = 1, + G_RESOLVER_RECORD_MX, + G_RESOLVER_RECORD_TXT, + G_RESOLVER_RECORD_SOA, + G_RESOLVER_RECORD_NS +} GResolverRecordType; + +/** + * GResourceError: + * @G_RESOURCE_ERROR_NOT_FOUND: no file was found at the requested path + * @G_RESOURCE_ERROR_INTERNAL: unknown error + * + * An error code used with %G_RESOURCE_ERROR in a #GError returned + * from a #GResource routine. + * + * Since: 2.32 + */ +typedef enum { + G_RESOURCE_ERROR_NOT_FOUND, + G_RESOURCE_ERROR_INTERNAL +} GResourceError; + +/** + * GResourceFlags: + * @G_RESOURCE_FLAGS_NONE: No flags set. + * @G_RESOURCE_FLAGS_COMPRESSED: The file is compressed. + * + * GResourceFlags give information about a particular file inside a resource + * bundle. + * + * Since: 2.32 + **/ +typedef enum { + G_RESOURCE_FLAGS_NONE = 0, + G_RESOURCE_FLAGS_COMPRESSED = (1<<0) +} GResourceFlags; + +/** + * GResourceLookupFlags: + * @G_RESOURCE_LOOKUP_FLAGS_NONE: No flags set. + * + * GResourceLookupFlags determine how resource path lookups are handled. + * + * Since: 2.32 + **/ +typedef enum /*< flags >*/ { + G_RESOURCE_LOOKUP_FLAGS_NONE = 0 +} GResourceLookupFlags; + +/** + * 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, + G_SOCKET_FAMILY_UNIX = GLIB_SYSDEF_AF_UNIX, + 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 /*< flags >*/ +{ + 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; + +/** + * GUnixSocketAddressType: + * @G_UNIX_SOCKET_ADDRESS_INVALID: invalid + * @G_UNIX_SOCKET_ADDRESS_ANONYMOUS: anonymous + * @G_UNIX_SOCKET_ADDRESS_PATH: a filesystem path + * @G_UNIX_SOCKET_ADDRESS_ABSTRACT: an abstract name + * @G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED: an abstract name, 0-padded + * to the full length of a unix socket name + * + * The type of name used by a #GUnixSocketAddress. + * %G_UNIX_SOCKET_ADDRESS_PATH indicates a traditional unix domain + * socket bound to a filesystem path. %G_UNIX_SOCKET_ADDRESS_ANONYMOUS + * indicates a socket not bound to any name (eg, a client-side socket, + * or a socket created with socketpair()). + * + * For abstract sockets, there are two incompatible ways of naming + * them; the man pages suggest using the entire struct + * sockaddr_un as the name, padding the unused parts of the + * %sun_path field with zeroes; this corresponds to + * %G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED. However, many programs + * instead just use a portion of %sun_path, and pass an appropriate + * smaller length to bind() or connect(). This is + * %G_UNIX_SOCKET_ADDRESS_ABSTRACT. + * + * Since: 2.26 + */ +typedef enum { + G_UNIX_SOCKET_ADDRESS_INVALID, + G_UNIX_SOCKET_ADDRESS_ANONYMOUS, + G_UNIX_SOCKET_ADDRESS_PATH, + G_UNIX_SOCKET_ADDRESS_ABSTRACT, + G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED +} GUnixSocketAddressType; + +/** + * GBusType: + * @G_BUS_TYPE_STARTER: An alias for the message bus that activated the process, if any. + * @G_BUS_TYPE_NONE: Not a message bus. + * @G_BUS_TYPE_SYSTEM: The system-wide message bus. + * @G_BUS_TYPE_SESSION: The login session message bus. + * + * An enumeration for well-known message buses. + * + * Since: 2.26 + */ +typedef enum +{ + G_BUS_TYPE_STARTER = -1, + G_BUS_TYPE_NONE = 0, + G_BUS_TYPE_SYSTEM = 1, + G_BUS_TYPE_SESSION = 2 +} GBusType; + +/** + * GBusNameOwnerFlags: + * @G_BUS_NAME_OWNER_FLAGS_NONE: No flags set. + * @G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT: Allow another message bus connection to claim the name. + * @G_BUS_NAME_OWNER_FLAGS_REPLACE: If another message bus connection owns the name and have + * specified #G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT, then take the name from the other connection. + * + * Flags used in g_bus_own_name(). + * + * Since: 2.26 + */ +typedef enum +{ + G_BUS_NAME_OWNER_FLAGS_NONE = 0, /*< nick=none >*/ + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT = (1<<0), /*< nick=allow-replacement >*/ + G_BUS_NAME_OWNER_FLAGS_REPLACE = (1<<1) /*< nick=replace >*/ +} GBusNameOwnerFlags; + +/** + * GBusNameWatcherFlags: + * @G_BUS_NAME_WATCHER_FLAGS_NONE: No flags set. + * @G_BUS_NAME_WATCHER_FLAGS_AUTO_START: If no-one owns the name when + * beginning to watch the name, ask the bus to launch an owner for the + * name. + * + * Flags used in g_bus_watch_name(). + * + * Since: 2.26 + */ +typedef enum +{ + G_BUS_NAME_WATCHER_FLAGS_NONE = 0, + G_BUS_NAME_WATCHER_FLAGS_AUTO_START = (1<<0) +} GBusNameWatcherFlags; + +/** + * GDBusProxyFlags: + * @G_DBUS_PROXY_FLAGS_NONE: No flags set. + * @G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES: Don't load properties. + * @G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS: Don't connect to signals on the remote object. + * @G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START: If not set and the proxy if for a well-known name, + * then request the bus to launch an owner for the name if no-one owns the name. This flag can + * only be used in proxies for well-known names. + * @G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES: If set, the property value for any invalidated property will be (asynchronously) retrieved upon receiving the PropertiesChanged D-Bus signal and the property will not cause emission of the #GDBusProxy::g-properties-changed signal. When the value is received the #GDBusProxy::g-properties-changed signal is emitted for the property along with the retrieved value. Since 2.32. + * + * Flags used when constructing an instance of a #GDBusProxy derived class. + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_PROXY_FLAGS_NONE = 0, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES = (1<<0), + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS = (1<<1), + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START = (1<<2), + G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES = (1<<3) +} GDBusProxyFlags; + +/** + * GDBusError: + * @G_DBUS_ERROR_FAILED: + * A generic error; "something went wrong" - see the error message for + * more. + * @G_DBUS_ERROR_NO_MEMORY: + * There was not enough memory to complete an operation. + * @G_DBUS_ERROR_SERVICE_UNKNOWN: + * The bus doesn't know how to launch a service to supply the bus name + * you wanted. + * @G_DBUS_ERROR_NAME_HAS_NO_OWNER: + * The bus name you referenced doesn't exist (i.e. no application owns + * it). + * @G_DBUS_ERROR_NO_REPLY: + * No reply to a message expecting one, usually means a timeout occurred. + * @G_DBUS_ERROR_IO_ERROR: + * Something went wrong reading or writing to a socket, for example. + * @G_DBUS_ERROR_BAD_ADDRESS: + * A D-Bus bus address was malformed. + * @G_DBUS_ERROR_NOT_SUPPORTED: + * Requested operation isn't supported (like ENOSYS on UNIX). + * @G_DBUS_ERROR_LIMITS_EXCEEDED: + * Some limited resource is exhausted. + * @G_DBUS_ERROR_ACCESS_DENIED: + * Security restrictions don't allow doing what you're trying to do. + * @G_DBUS_ERROR_AUTH_FAILED: + * Authentication didn't work. + * @G_DBUS_ERROR_NO_SERVER: + * Unable to connect to server (probably caused by ECONNREFUSED on a + * socket). + * @G_DBUS_ERROR_TIMEOUT: + * Certain timeout errors, possibly ETIMEDOUT on a socket. Note that + * %G_DBUS_ERROR_NO_REPLY is used for message reply timeouts. Warning: + * this is confusingly-named given that %G_DBUS_ERROR_TIMED_OUT also + * exists. We can't fix it for compatibility reasons so just be + * careful. + * @G_DBUS_ERROR_NO_NETWORK: + * No network access (probably ENETUNREACH on a socket). + * @G_DBUS_ERROR_ADDRESS_IN_USE: + * Can't bind a socket since its address is in use (i.e. EADDRINUSE). + * @G_DBUS_ERROR_DISCONNECTED: + * The connection is disconnected and you're trying to use it. + * @G_DBUS_ERROR_INVALID_ARGS: + * Invalid arguments passed to a method call. + * @G_DBUS_ERROR_FILE_NOT_FOUND: + * Missing file. + * @G_DBUS_ERROR_FILE_EXISTS: + * Existing file and the operation you're using does not silently overwrite. + * @G_DBUS_ERROR_UNKNOWN_METHOD: + * Method name you invoked isn't known by the object you invoked it on. + * @G_DBUS_ERROR_TIMED_OUT: + * Certain timeout errors, e.g. while starting a service. Warning: this is + * confusingly-named given that %G_DBUS_ERROR_TIMEOUT also exists. We + * can't fix it for compatibility reasons so just be careful. + * @G_DBUS_ERROR_MATCH_RULE_NOT_FOUND: + * Tried to remove or modify a match rule that didn't exist. + * @G_DBUS_ERROR_MATCH_RULE_INVALID: + * The match rule isn't syntactically valid. + * @G_DBUS_ERROR_SPAWN_EXEC_FAILED: + * While starting a new process, the exec() call failed. + * @G_DBUS_ERROR_SPAWN_FORK_FAILED: + * While starting a new process, the fork() call failed. + * @G_DBUS_ERROR_SPAWN_CHILD_EXITED: + * While starting a new process, the child exited with a status code. + * @G_DBUS_ERROR_SPAWN_CHILD_SIGNALED: + * While starting a new process, the child exited on a signal. + * @G_DBUS_ERROR_SPAWN_FAILED: + * While starting a new process, something went wrong. + * @G_DBUS_ERROR_SPAWN_SETUP_FAILED: + * We failed to setup the environment correctly. + * @G_DBUS_ERROR_SPAWN_CONFIG_INVALID: + * We failed to setup the config parser correctly. + * @G_DBUS_ERROR_SPAWN_SERVICE_INVALID: + * Bus name was not valid. + * @G_DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND: + * Service file not found in system-services directory. + * @G_DBUS_ERROR_SPAWN_PERMISSIONS_INVALID: + * Permissions are incorrect on the setuid helper. + * @G_DBUS_ERROR_SPAWN_FILE_INVALID: + * Service file invalid (Name, User or Exec missing). + * @G_DBUS_ERROR_SPAWN_NO_MEMORY: + * Tried to get a UNIX process ID and it wasn't available. + * @G_DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN: + * Tried to get a UNIX process ID and it wasn't available. + * @G_DBUS_ERROR_INVALID_SIGNATURE: + * A type signature is not valid. + * @G_DBUS_ERROR_INVALID_FILE_CONTENT: + * A file contains invalid syntax or is otherwise broken. + * @G_DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN: + * Asked for SELinux security context and it wasn't available. + * @G_DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN: + * Asked for ADT audit data and it wasn't available. + * @G_DBUS_ERROR_OBJECT_PATH_IN_USE: + * There's already an object with the requested object path. + * + * Error codes for the %G_DBUS_ERROR error domain. + * + * Since: 2.26 + */ +typedef enum +{ + /* Well-known errors in the org.freedesktop.DBus.Error namespace */ + G_DBUS_ERROR_FAILED, /* org.freedesktop.DBus.Error.Failed */ + G_DBUS_ERROR_NO_MEMORY, /* org.freedesktop.DBus.Error.NoMemory */ + G_DBUS_ERROR_SERVICE_UNKNOWN, /* org.freedesktop.DBus.Error.ServiceUnknown */ + G_DBUS_ERROR_NAME_HAS_NO_OWNER, /* org.freedesktop.DBus.Error.NameHasNoOwner */ + G_DBUS_ERROR_NO_REPLY, /* org.freedesktop.DBus.Error.NoReply */ + G_DBUS_ERROR_IO_ERROR, /* org.freedesktop.DBus.Error.IOError */ + G_DBUS_ERROR_BAD_ADDRESS, /* org.freedesktop.DBus.Error.BadAddress */ + G_DBUS_ERROR_NOT_SUPPORTED, /* org.freedesktop.DBus.Error.NotSupported */ + G_DBUS_ERROR_LIMITS_EXCEEDED, /* org.freedesktop.DBus.Error.LimitsExceeded */ + G_DBUS_ERROR_ACCESS_DENIED, /* org.freedesktop.DBus.Error.AccessDenied */ + G_DBUS_ERROR_AUTH_FAILED, /* org.freedesktop.DBus.Error.AuthFailed */ + G_DBUS_ERROR_NO_SERVER, /* org.freedesktop.DBus.Error.NoServer */ + G_DBUS_ERROR_TIMEOUT, /* org.freedesktop.DBus.Error.Timeout */ + G_DBUS_ERROR_NO_NETWORK, /* org.freedesktop.DBus.Error.NoNetwork */ + G_DBUS_ERROR_ADDRESS_IN_USE, /* org.freedesktop.DBus.Error.AddressInUse */ + G_DBUS_ERROR_DISCONNECTED, /* org.freedesktop.DBus.Error.Disconnected */ + G_DBUS_ERROR_INVALID_ARGS, /* org.freedesktop.DBus.Error.InvalidArgs */ + G_DBUS_ERROR_FILE_NOT_FOUND, /* org.freedesktop.DBus.Error.FileNotFound */ + G_DBUS_ERROR_FILE_EXISTS, /* org.freedesktop.DBus.Error.FileExists */ + G_DBUS_ERROR_UNKNOWN_METHOD, /* org.freedesktop.DBus.Error.UnknownMethod */ + G_DBUS_ERROR_TIMED_OUT, /* org.freedesktop.DBus.Error.TimedOut */ + G_DBUS_ERROR_MATCH_RULE_NOT_FOUND, /* org.freedesktop.DBus.Error.MatchRuleNotFound */ + G_DBUS_ERROR_MATCH_RULE_INVALID, /* org.freedesktop.DBus.Error.MatchRuleInvalid */ + G_DBUS_ERROR_SPAWN_EXEC_FAILED, /* org.freedesktop.DBus.Error.Spawn.ExecFailed */ + G_DBUS_ERROR_SPAWN_FORK_FAILED, /* org.freedesktop.DBus.Error.Spawn.ForkFailed */ + G_DBUS_ERROR_SPAWN_CHILD_EXITED, /* org.freedesktop.DBus.Error.Spawn.ChildExited */ + G_DBUS_ERROR_SPAWN_CHILD_SIGNALED, /* org.freedesktop.DBus.Error.Spawn.ChildSignaled */ + G_DBUS_ERROR_SPAWN_FAILED, /* org.freedesktop.DBus.Error.Spawn.Failed */ + G_DBUS_ERROR_SPAWN_SETUP_FAILED, /* org.freedesktop.DBus.Error.Spawn.FailedToSetup */ + G_DBUS_ERROR_SPAWN_CONFIG_INVALID, /* org.freedesktop.DBus.Error.Spawn.ConfigInvalid */ + G_DBUS_ERROR_SPAWN_SERVICE_INVALID, /* org.freedesktop.DBus.Error.Spawn.ServiceNotValid */ + G_DBUS_ERROR_SPAWN_SERVICE_NOT_FOUND, /* org.freedesktop.DBus.Error.Spawn.ServiceNotFound */ + G_DBUS_ERROR_SPAWN_PERMISSIONS_INVALID, /* org.freedesktop.DBus.Error.Spawn.PermissionsInvalid */ + G_DBUS_ERROR_SPAWN_FILE_INVALID, /* org.freedesktop.DBus.Error.Spawn.FileInvalid */ + G_DBUS_ERROR_SPAWN_NO_MEMORY, /* org.freedesktop.DBus.Error.Spawn.NoMemory */ + G_DBUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, /* org.freedesktop.DBus.Error.UnixProcessIdUnknown */ + G_DBUS_ERROR_INVALID_SIGNATURE, /* org.freedesktop.DBus.Error.InvalidSignature */ + G_DBUS_ERROR_INVALID_FILE_CONTENT, /* org.freedesktop.DBus.Error.InvalidFileContent */ + G_DBUS_ERROR_SELINUX_SECURITY_CONTEXT_UNKNOWN, /* org.freedesktop.DBus.Error.SELinuxSecurityContextUnknown */ + G_DBUS_ERROR_ADT_AUDIT_DATA_UNKNOWN, /* org.freedesktop.DBus.Error.AdtAuditDataUnknown */ + G_DBUS_ERROR_OBJECT_PATH_IN_USE /* org.freedesktop.DBus.Error.ObjectPathInUse */ +} GDBusError; +/* Remember to update g_dbus_error_quark() in gdbuserror.c if you extend this enumeration */ + +/** + * GDBusConnectionFlags: + * @G_DBUS_CONNECTION_FLAGS_NONE: No flags set. + * @G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT: Perform authentication against server. + * @G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER: Perform authentication against client. + * @G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS: When + * authenticating as a server, allow the anonymous authentication + * method. + * @G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION: Pass this flag if connecting to a peer that is a + * message bus. This means that the Hello() method will be invoked as part of the connection setup. + * @G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING: If set, processing of D-Bus messages is + * delayed until g_dbus_connection_start_message_processing() is called. + * + * Flags used when creating a new #GDBusConnection. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_CONNECTION_FLAGS_NONE = 0, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT = (1<<0), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER = (1<<1), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS = (1<<2), + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION = (1<<3), + G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING = (1<<4) +} GDBusConnectionFlags; + +/** + * GDBusCapabilityFlags: + * @G_DBUS_CAPABILITY_FLAGS_NONE: No flags set. + * @G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING: The connection + * supports exchanging UNIX file descriptors with the remote peer. + * + * Capabilities negotiated with the remote peer. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_CAPABILITY_FLAGS_NONE = 0, + G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING = (1<<0) +} GDBusCapabilityFlags; + +/** + * GDBusCallFlags: + * @G_DBUS_CALL_FLAGS_NONE: No flags set. + * @G_DBUS_CALL_FLAGS_NO_AUTO_START: The bus must not launch + * an owner for the destination name in response to this method + * invocation. + * + * Flags used in g_dbus_connection_call() and similar APIs. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_CALL_FLAGS_NONE = 0, + G_DBUS_CALL_FLAGS_NO_AUTO_START = (1<<0) +} GDBusCallFlags; +/* (1<<31) is reserved for internal use by GDBusConnection, do not use it. */ + +/** + * GDBusMessageType: + * @G_DBUS_MESSAGE_TYPE_INVALID: Message is of invalid type. + * @G_DBUS_MESSAGE_TYPE_METHOD_CALL: Method call. + * @G_DBUS_MESSAGE_TYPE_METHOD_RETURN: Method reply. + * @G_DBUS_MESSAGE_TYPE_ERROR: Error reply. + * @G_DBUS_MESSAGE_TYPE_SIGNAL: Signal emission. + * + * Message types used in #GDBusMessage. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_MESSAGE_TYPE_INVALID, + G_DBUS_MESSAGE_TYPE_METHOD_CALL, + G_DBUS_MESSAGE_TYPE_METHOD_RETURN, + G_DBUS_MESSAGE_TYPE_ERROR, + G_DBUS_MESSAGE_TYPE_SIGNAL +} GDBusMessageType; + +/** + * GDBusMessageFlags: + * @G_DBUS_MESSAGE_FLAGS_NONE: No flags set. + * @G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED: A reply is not expected. + * @G_DBUS_MESSAGE_FLAGS_NO_AUTO_START: The bus must not launch an + * owner for the destination name in response to this message. + * + * Message flags used in #GDBusMessage. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_MESSAGE_FLAGS_NONE = 0, + G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED = (1<<0), + G_DBUS_MESSAGE_FLAGS_NO_AUTO_START = (1<<1) +} GDBusMessageFlags; + +/** + * GDBusMessageHeaderField: + * @G_DBUS_MESSAGE_HEADER_FIELD_INVALID: Not a valid header field. + * @G_DBUS_MESSAGE_HEADER_FIELD_PATH: The object path. + * @G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE: The interface name. + * @G_DBUS_MESSAGE_HEADER_FIELD_MEMBER: The method or signal name. + * @G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME: The name of the error that occurred. + * @G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL: The serial number the message is a reply to. + * @G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION: The name the message is intended for. + * @G_DBUS_MESSAGE_HEADER_FIELD_SENDER: Unique name of the sender of the message (filled in by the bus). + * @G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE: The signature of the message body. + * @G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS: The number of UNIX file descriptors that accompany the message. + * + * Header fields used in #GDBusMessage. + * + * Since: 2.26 + */ +typedef enum { + G_DBUS_MESSAGE_HEADER_FIELD_INVALID, + G_DBUS_MESSAGE_HEADER_FIELD_PATH, + G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE, + G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, + G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME, + G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, + G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION, + G_DBUS_MESSAGE_HEADER_FIELD_SENDER, + G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE, + G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS +} GDBusMessageHeaderField; + +/** + * GDBusPropertyInfoFlags: + * @G_DBUS_PROPERTY_INFO_FLAGS_NONE: No flags set. + * @G_DBUS_PROPERTY_INFO_FLAGS_READABLE: Property is readable. + * @G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE: Property is writable. + * + * Flags describing the access control of a D-Bus property. + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_PROPERTY_INFO_FLAGS_NONE = 0, + G_DBUS_PROPERTY_INFO_FLAGS_READABLE = (1<<0), + G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE = (1<<1) +} GDBusPropertyInfoFlags; + +/** + * GDBusSubtreeFlags: + * @G_DBUS_SUBTREE_FLAGS_NONE: No flags set. + * @G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES: Method calls to objects not in the enumerated range + * will still be dispatched. This is useful if you want + * to dynamically spawn objects in the subtree. + * + * Flags passed to g_dbus_connection_register_subtree(). + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_SUBTREE_FLAGS_NONE = 0, + G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES = (1<<0) +} GDBusSubtreeFlags; + +/** + * GDBusServerFlags: + * @G_DBUS_SERVER_FLAGS_NONE: No flags set. + * @G_DBUS_SERVER_FLAGS_RUN_IN_THREAD: All #GDBusServer::new-connection + * signals will run in separated dedicated threads (see signal for + * details). + * @G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS: Allow the anonymous + * authentication method. + * + * Flags used when creating a #GDBusServer. + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_SERVER_FLAGS_NONE = 0, + G_DBUS_SERVER_FLAGS_RUN_IN_THREAD = (1<<0), + G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS = (1<<1) +} GDBusServerFlags; + +/** + * GDBusSignalFlags: + * @G_DBUS_SIGNAL_FLAGS_NONE: No flags set. + * @G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE: Don't actually send the AddMatch + * D-Bus call for this signal subscription. This gives you more control + * over which match rules you add (but you must add them manually). + * + * Flags used when subscribing to signals via g_dbus_connection_signal_subscribe(). + * + * Since: 2.26 + */ +typedef enum /*< flags >*/ +{ + G_DBUS_SIGNAL_FLAGS_NONE = 0, + G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE = (1<<0) +} GDBusSignalFlags; + +/** + * GDBusSendMessageFlags: + * @G_DBUS_SEND_MESSAGE_FLAGS_NONE: No flags set. + * @G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL: Do not automatically + * assign a serial number from the #GDBusConnection object when + * sending a message. + * + * Flags used when sending #GDBusMessages on a #GDBusConnection. + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_SEND_MESSAGE_FLAGS_NONE = 0, + G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL = (1<<0) +} GDBusSendMessageFlags; +/* (1<<31) is reserved for internal use by GDBusConnection, do not use it. */ + +/** + * GCredentialsType: + * @G_CREDENTIALS_TYPE_INVALID: Indicates an invalid native credential type. + * @G_CREDENTIALS_TYPE_LINUX_UCRED: The native credentials type is a struct ucred. + * @G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED: The native credentials type is a struct cmsgcred. + * @G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED: The native credentials type is a struct sockpeercred. Added in 2.30. + * + * Enumeration describing different kinds of native credential types. + * + * Since: 2.26 + */ +typedef enum +{ + G_CREDENTIALS_TYPE_INVALID, + G_CREDENTIALS_TYPE_LINUX_UCRED, + G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED, + G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED +} GCredentialsType; + +/** + * GDBusMessageByteOrder: + * @G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN: The byte order is big endian. + * @G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN: The byte order is little endian. + * + * Enumeration used to describe the byte order of a D-Bus message. + * + * Since: 2.26 + */ +typedef enum +{ + G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN = 'B', + G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN = 'l' +} GDBusMessageByteOrder; + +/** + * GApplicationFlags: + * @G_APPLICATION_FLAGS_NONE: Default + * @G_APPLICATION_IS_SERVICE: Run as a service. In this mode, registration + * fails if the service is already running, and the application will + * stay around for a while when the use count falls to zero. + * @G_APPLICATION_IS_LAUNCHER: Don't try to become the primary instance. + * @G_APPLICATION_HANDLES_OPEN: This application handles opening files (in + * the primary instance). Note that this flag only affects the default + * implementation of local_command_line(), and has no effect if + * %G_APPLICATION_HANDLES_COMMAND_LINE is given. + * See g_application_run() for details. + * @G_APPLICATION_HANDLES_COMMAND_LINE: This application handles command line + * arguments (in the primary instance). Note that this flag only affect + * the default implementation of local_command_line(). + * See g_application_run() for details. + * @G_APPLICATION_SEND_ENVIRONMENT: Send the environment of the + * launching process to the primary instance. Set this flag if your + * application is expected to behave differently depending on certain + * environment variables. For instance, an editor might be expected + * to use the GIT_COMMITTER_NAME environment variable + * when editing a git commit message. The environment is available + * to the #GApplication::command-line signal handler, via + * g_application_command_line_getenv(). + * @G_APPLICATION_NON_UNIQUE: Make no attempts to do any of the typical + * single-instance application negotiation, even if the application + * ID is given. The application neither attempts to become the + * owner of the application ID nor does it check if an existing + * owner already exists. Everything occurs in the local process. + * Since: 2.30. + * + * Flags used to define the behaviour of a #GApplication. + * + * Since: 2.28 + **/ +typedef enum +{ + G_APPLICATION_FLAGS_NONE, + G_APPLICATION_IS_SERVICE = (1 << 0), + G_APPLICATION_IS_LAUNCHER = (1 << 1), + + G_APPLICATION_HANDLES_OPEN = (1 << 2), + G_APPLICATION_HANDLES_COMMAND_LINE = (1 << 3), + G_APPLICATION_SEND_ENVIRONMENT = (1 << 4), + + G_APPLICATION_NON_UNIQUE = (1 << 5) +} GApplicationFlags; + +/** + * GTlsError: + * @G_TLS_ERROR_UNAVAILABLE: No TLS provider is available + * @G_TLS_ERROR_MISC: Miscellaneous TLS error + * @G_TLS_ERROR_BAD_CERTIFICATE: A certificate could not be parsed + * @G_TLS_ERROR_NOT_TLS: The TLS handshake failed because the + * peer does not seem to be a TLS server. + * @G_TLS_ERROR_HANDSHAKE: The TLS handshake failed because the + * peer's certificate was not acceptable. + * @G_TLS_ERROR_CERTIFICATE_REQUIRED: The TLS handshake failed because + * the server requested a client-side certificate, but none was + * provided. See g_tls_connection_set_certificate(). + * @G_TLS_ERROR_EOF: The TLS connection was closed without proper + * notice, which may indicate an attack. See + * g_tls_connection_set_require_close_notify(). + * + * An error code used with %G_TLS_ERROR in a #GError returned from a + * TLS-related routine. + * + * Since: 2.28 + */ +typedef enum { + G_TLS_ERROR_UNAVAILABLE, + G_TLS_ERROR_MISC, + G_TLS_ERROR_BAD_CERTIFICATE, + G_TLS_ERROR_NOT_TLS, + G_TLS_ERROR_HANDSHAKE, + G_TLS_ERROR_CERTIFICATE_REQUIRED, + G_TLS_ERROR_EOF +} GTlsError; + +/** + * GTlsCertificateFlags: + * @G_TLS_CERTIFICATE_UNKNOWN_CA: The signing certificate authority is + * not known. + * @G_TLS_CERTIFICATE_BAD_IDENTITY: The certificate does not match the + * expected identity of the site that it was retrieved from. + * @G_TLS_CERTIFICATE_NOT_ACTIVATED: The certificate's activation time + * is still in the future + * @G_TLS_CERTIFICATE_EXPIRED: The certificate has expired + * @G_TLS_CERTIFICATE_REVOKED: The certificate has been revoked + * according to the #GTlsConnection's certificate revocation list. + * @G_TLS_CERTIFICATE_INSECURE: The certificate's algorithm is + * considered insecure. + * @G_TLS_CERTIFICATE_GENERIC_ERROR: Some other error occurred validating + * the certificate + * @G_TLS_CERTIFICATE_VALIDATE_ALL: the combination of all of the above + * flags + * + * A set of flags describing TLS certification validation. This can be + * used to set which validation steps to perform (eg, with + * g_tls_client_connection_set_validation_flags()), or to describe why + * a particular certificate was rejected (eg, in + * #GTlsConnection::accept-certificate). + * + * Since: 2.28 + */ +typedef enum { + G_TLS_CERTIFICATE_UNKNOWN_CA = (1 << 0), + G_TLS_CERTIFICATE_BAD_IDENTITY = (1 << 1), + G_TLS_CERTIFICATE_NOT_ACTIVATED = (1 << 2), + G_TLS_CERTIFICATE_EXPIRED = (1 << 3), + G_TLS_CERTIFICATE_REVOKED = (1 << 4), + G_TLS_CERTIFICATE_INSECURE = (1 << 5), + G_TLS_CERTIFICATE_GENERIC_ERROR = (1 << 6), + + G_TLS_CERTIFICATE_VALIDATE_ALL = 0x007f +} GTlsCertificateFlags; + +/** + * GTlsAuthenticationMode: + * @G_TLS_AUTHENTICATION_NONE: client authentication not required + * @G_TLS_AUTHENTICATION_REQUESTED: client authentication is requested + * @G_TLS_AUTHENTICATION_REQUIRED: client authentication is required + * + * The client authentication mode for a #GTlsServerConnection. + * + * Since: 2.28 + */ +typedef enum { + G_TLS_AUTHENTICATION_NONE, + G_TLS_AUTHENTICATION_REQUESTED, + G_TLS_AUTHENTICATION_REQUIRED +} GTlsAuthenticationMode; + +/** + * GTlsRehandshakeMode: + * @G_TLS_REHANDSHAKE_NEVER: Never allow rehandshaking + * @G_TLS_REHANDSHAKE_SAFELY: Allow safe rehandshaking only + * @G_TLS_REHANDSHAKE_UNSAFELY: Allow unsafe rehandshaking + * + * When to allow rehandshaking. See + * g_tls_connection_set_rehandshake_mode(). + * + * Since: 2.28 + */ +typedef enum { + G_TLS_REHANDSHAKE_NEVER, + G_TLS_REHANDSHAKE_SAFELY, + G_TLS_REHANDSHAKE_UNSAFELY +} GTlsRehandshakeMode; + +/** + * GTlsPasswordFlags: + * @G_TLS_PASSWORD_NONE: No flags + * @G_TLS_PASSWORD_RETRY: The password was wrong, and the user should retry. + * @G_TLS_PASSWORD_MANY_TRIES: Hint to the user that the password has been + * wrong many times, and the user may not have many chances left. + * @G_TLS_PASSWORD_FINAL_TRY: Hint to the user that this is the last try to get + * this password right. + * + * Various flags for the password. + * + * Since: 2.30 + */ + +typedef enum _GTlsPasswordFlags +{ + G_TLS_PASSWORD_NONE = 0, + G_TLS_PASSWORD_RETRY = 1 << 1, + G_TLS_PASSWORD_MANY_TRIES = 1 << 2, + G_TLS_PASSWORD_FINAL_TRY = 1 << 3 +} GTlsPasswordFlags; + +/** + * GTlsInteractionResult: + * @G_TLS_INTERACTION_UNHANDLED: The interaction was unhandled (i.e. not + * implemented). + * @G_TLS_INTERACTION_HANDLED: The interaction completed, and resulting data + * is available. + * @G_TLS_INTERACTION_FAILED: The interaction has failed, or was cancelled. + * and the operation should be aborted. + * + * #GTlsInteractionResult is returned by various functions in #GTlsInteraction + * when finishing an interaction request. + * + * Since: 2.30 + */ +typedef enum { + G_TLS_INTERACTION_UNHANDLED, + G_TLS_INTERACTION_HANDLED, + G_TLS_INTERACTION_FAILED +} GTlsInteractionResult; + +/** + * GDBusInterfaceSkeletonFlags: + * @G_DBUS_INTERFACE_SKELETON_FLAGS_NONE: No flags set. + * @G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD: Each method invocation is handled in + * a thread dedicated to the invocation. This means that the method implementation can use blocking IO + * without blocking any other part of the process. It also means that the method implementation must + * use locking to access data structures used by other threads. + * + * Flags describing the behavior of a #GDBusInterfaceSkeleton instance. + * + * Since: 2.30 + */ +typedef enum +{ + G_DBUS_INTERFACE_SKELETON_FLAGS_NONE = 0, + G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD = (1<<0) +} GDBusInterfaceSkeletonFlags; + +/** + * GDBusObjectManagerClientFlags: + * @G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE: No flags set. + * @G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START: If not set and the + * manager is for a well-known name, then request the bus to launch + * an owner for the name if no-one owns the name. This flag can only + * be used in managers for well-known names. + * + * Flags used when constructing a #GDBusObjectManagerClient. + * + * Since: 2.30 + */ +typedef enum +{ + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE = 0, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START = (1<<0) +} GDBusObjectManagerClientFlags; + +/** + * GTlsDatabaseVerifyFlags: + * @G_TLS_DATABASE_VERIFY_NONE: No verification flags + * + * Flags for g_tls_database_verify_chain(). + * + * Since: 2.30 + */ +typedef enum /*< flags >*/ { + G_TLS_DATABASE_VERIFY_NONE = 0 +} GTlsDatabaseVerifyFlags; + +/** + * GTlsDatabaseLookupFlags: + * @G_TLS_DATABASE_LOOKUP_NONE: No lookup flags + * @G_TLS_DATABASE_LOOKUP_KEYPAIR: Restrict lookup to certificates that have + * a private key. + * + * Flags for g_tls_database_lookup_certificate_handle(), + * g_tls_database_lookup_certificate_issuer(), + * and g_tls_database_lookup_certificates_issued_by(). + * + * Since: 2.30 + */ +typedef enum { + G_TLS_DATABASE_LOOKUP_NONE = 0, + G_TLS_DATABASE_LOOKUP_KEYPAIR = 1 +} GTlsDatabaseLookupFlags; + +/** + * GIOModuleScopeFlags: + * @G_IO_MODULE_SCOPE_NONE: No module scan flags + * @G_IO_MODULE_SCOPE_BLOCK_DUPLICATES: When using this scope to load or + * scan modules, automatically block a modules which has the same base + * basename as previously loaded module. + * + * Flags for use with g_io_module_scope_new(). + * + * Since: 2.30 + */ +typedef enum { + G_IO_MODULE_SCOPE_NONE, + G_IO_MODULE_SCOPE_BLOCK_DUPLICATES +} GIOModuleScopeFlags; + +/** + * GSocketClientEvent: + * @G_SOCKET_CLIENT_RESOLVING: The client is doing a DNS lookup. + * @G_SOCKET_CLIENT_RESOLVED: The client has completed a DNS lookup. + * @G_SOCKET_CLIENT_CONNECTING: The client is connecting to a remote + * host (either a proxy or the destination server). + * @G_SOCKET_CLIENT_CONNECTED: The client has connected to a remote + * host. + * @G_SOCKET_CLIENT_PROXY_NEGOTIATING: The client is negotiating + * with a proxy to connect to the destination server. + * @G_SOCKET_CLIENT_PROXY_NEGOTIATED: The client has negotiated + * with the proxy server. + * @G_SOCKET_CLIENT_TLS_HANDSHAKING: The client is performing a + * TLS handshake. + * @G_SOCKET_CLIENT_TLS_HANDSHAKED: The client has performed a + * TLS handshake. + * @G_SOCKET_CLIENT_COMPLETE: The client is done with a particular + * #GSocketConnectable. + * + * Describes an event occurring on a #GSocketClient. See the + * #GSocketClient::event signal for more details. + * + * Additional values may be added to this type in the future. + * + * Since: 2.32 + */ +typedef enum { + G_SOCKET_CLIENT_RESOLVING, + G_SOCKET_CLIENT_RESOLVED, + G_SOCKET_CLIENT_CONNECTING, + G_SOCKET_CLIENT_CONNECTED, + G_SOCKET_CLIENT_PROXY_NEGOTIATING, + G_SOCKET_CLIENT_PROXY_NEGOTIATED, + G_SOCKET_CLIENT_TLS_HANDSHAKING, + G_SOCKET_CLIENT_TLS_HANDSHAKED, + G_SOCKET_CLIENT_COMPLETE +} GSocketClientEvent; + +/** + * GTestDBusFlags: + * @G_TEST_DBUS_NONE: No flags. + * + * Flags to define future #GTestDBus behaviour. + * + * Since: 2.34 + */ +typedef enum /*< flags >*/ { + G_TEST_DBUS_NONE = 0 +} GTestDBusFlags; + +G_END_DECLS + +#endif /* __GIO_ENUMS_H__ */ diff --git a/gio/gioenumtypes.c.template b/gio/gioenumtypes.c.template new file mode 100644 index 0000000..e9adc4a --- /dev/null +++ b/gio/gioenumtypes.c.template @@ -0,0 +1,38 @@ +/*** BEGIN file-header ***/ +#include "config.h" +#include "gioenumtypes.h" +#include + +/*** 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 ***/ diff --git a/gio/gioenumtypes.h.template b/gio/gioenumtypes.h.template new file mode 100644 index 0000000..4baa6df --- /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 ***/ +GLIB_AVAILABLE_IN_ALL 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..3a7785f --- /dev/null +++ b/gio/gioerror.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 +#include "gioerror.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. + **/ +G_DEFINE_QUARK (g-io-error-quark, g_io_error) + +/** + * 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 + +#ifdef EHOSTUNREACH + case EHOSTUNREACH: + return G_IO_ERROR_HOST_UNREACHABLE; + break; +#endif + +#ifdef ENETUNREACH + case ENETUNREACH: + return G_IO_ERROR_NETWORK_UNREACHABLE; + break; +#endif + +#ifdef ECONNREFUSED + case ECONNREFUSED: + return G_IO_ERROR_CONNECTION_REFUSED; + break; +#endif + +#ifdef EPIPE + case EPIPE: + return G_IO_ERROR_BROKEN_PIPE; + break; +#endif + + default: + return G_IO_ERROR_FAILED; + break; + } +} + +#ifdef G_OS_WIN32 + +/** + * g_io_error_from_win32_error: + * @error_code: Windows error number. + * + * Converts some common error codes into GIO error codes. The + * fallback value G_IO_ERROR_FAILED is returned for error codes not + * handled. + * + * Returns: #GIOErrorEnum value for the given error number. + * + * Since: 2.26 + **/ +GIOErrorEnum +g_io_error_from_win32_error (gint error_code) +{ + switch (error_code) + { + default: + return G_IO_ERROR_FAILED; + break; + } +} + +#endif diff --git a/gio/gioerror.h b/gio/gioerror.h new file mode 100644 index 0000000..ed23df4 --- /dev/null +++ b/gio/gioerror.h @@ -0,0 +1,55 @@ +/* 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_ERROR_H__ +#define __G_IO_ERROR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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() + +GLIB_AVAILABLE_IN_ALL +GQuark g_io_error_quark (void); +GLIB_AVAILABLE_IN_ALL +GIOErrorEnum g_io_error_from_errno (gint err_no); + +#ifdef G_OS_WIN32 +GLIB_AVAILABLE_IN_ALL +GIOErrorEnum g_io_error_from_win32_error (gint error_code); +#endif + +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..1591c06 --- /dev/null +++ b/gio/giomodule-priv.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 + */ + +#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); + +typedef gboolean (*GIOModuleVerifyFunc) (gpointer); +gpointer _g_io_module_get_default (const gchar *extension_point, + const gchar *envvar, + GIOModuleVerifyFunc verify_func); + +GType _g_io_module_get_default_type (const gchar *extension_point, + const gchar *envvar, + guint is_supported_offset); + +#ifdef G_PLATFORM_WIN32 +void *_g_io_win32_get_module (void); +#endif + +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..a394c60 --- /dev/null +++ b/gio/giomodule.c @@ -0,0 +1,1392 @@ +/* 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 "gproxyresolver.h" +#include "gproxy.h" +#include "gsettingsbackendinternal.h" +#include "gsocks4proxy.h" +#include "gsocks4aproxy.h" +#include "gsocks5proxy.h" +#include "gtlsbackend.h" +#include "gvfs.h" +#ifdef G_OS_WIN32 +#include "gregistrysettingsbackend.h" +#endif +#include + +#ifdef G_OS_UNIX +#include "gdesktopappinfo.h" +#endif + +/** + * 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. + * + * To avoid opening all modules just to find out what extension + * points they implement, GIO makes use of a caching mechanism, + * see gio-querymodules. + * You are expected to run this command after installing a + * GIO module. + * + * The GIO_EXTRA_MODULES environment variable can be + * used to specify additional directories to automatically load modules + * from. This environment variable has the same syntax as the + * PATH. If two modules have the same base name in different + * directories, then the latter one will be ignored. If additional + * directories are specified GIO will load modules from the built-in + * directory last. + */ + +/** + * GIOModuleScope: + * + * Represents a scope for loading IO modules. A scope can be used for blocking + * duplicate modules, or blocking a module you don't want to load. + * + * The scope can be used with g_io_modules_load_all_in_directory_with_scope() + * or g_io_modules_scan_all_in_directory_with_scope(). + * + * Since: 2.30 + */ +struct _GIOModuleScope { + GIOModuleScopeFlags flags; + GHashTable *basenames; +}; + +/** + * g_io_module_scope_new: + * @flags: flags for the new scope + * + * Create a new scope for loading of IO modules. A scope can be used for + * blocking duplicate modules, or blocking a module you don't want to load. + * + * Specify the %G_IO_MODULE_SCOPE_BLOCK_DUPLICATES flag to block modules + * which have the same base name as a module that has already been seen + * in this scope. + * + * Returns: (transfer full): the new module scope + * + * Since: 2.30 + */ +GIOModuleScope * +g_io_module_scope_new (GIOModuleScopeFlags flags) +{ + GIOModuleScope *scope = g_new0 (GIOModuleScope, 1); + scope->flags = flags; + scope->basenames = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + return scope; +} + +/** + * g_io_module_scope_free: + * @scope: a module loading scope + * + * Free a module scope. + * + * Since: 2.30 + */ +void +g_io_module_scope_free (GIOModuleScope *scope) +{ + if (!scope) + return; + g_hash_table_destroy (scope->basenames); + g_free (scope); +} + +/** + * g_io_module_scope_block: + * @scope: a module loading scope + * @basename: the basename to block + * + * Block modules with the given @basename from being loaded when + * this scope is used with g_io_modules_scan_all_in_directory_with_scope() + * or g_io_modules_load_all_in_directory_with_scope(). + * + * Since: 2.30 + */ +void +g_io_module_scope_block (GIOModuleScope *scope, + const gchar *basename) +{ + gchar *key; + + g_return_if_fail (scope != NULL); + g_return_if_fail (basename != NULL); + + key = g_strdup (basename); + g_hash_table_insert (scope->basenames, key, key); +} + +static gboolean +_g_io_module_scope_contains (GIOModuleScope *scope, + const gchar *basename) +{ + return g_hash_table_lookup (scope->basenames, basename) ? TRUE : FALSE; +} + +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, + GIOModuleScope *scope) +{ + gboolean result; + +#if !defined(G_OS_WIN32) && !defined(G_WITH_CYGWIN) + if (!g_str_has_prefix (basename, "lib") || + !g_str_has_suffix (basename, ".so")) + return FALSE; +#else + if (!g_str_has_suffix (basename, ".dll")) + return FALSE; +#endif + + result = TRUE; + if (scope) + { + result = _g_io_module_scope_contains (scope, basename) ? FALSE : TRUE; + if (result && (scope->flags & G_IO_MODULE_SCOPE_BLOCK_DUPLICATES)) + g_io_module_scope_block (scope, basename); + } + + return result; +} + + +/** + * g_io_modules_scan_all_in_directory_with_scope: + * @dirname: pathname for a directory containing modules to scan. + * @scope: a scope to use when scanning the modules + * + * 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_load_all_in_directory(). + * + * Since: 2.30 + **/ +void +g_io_modules_scan_all_in_directory_with_scope (const char *dirname, + GIOModuleScope *scope) +{ + const gchar *name; + char *filename; + GDir *dir; + GStatBuf statbuf; + 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, scope)) + { + 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_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_load_all_in_directory(). + * + * Since: 2.24 + **/ +void +g_io_modules_scan_all_in_directory (const char *dirname) +{ + g_io_modules_scan_all_in_directory_with_scope (dirname, NULL); +} + +/** + * g_io_modules_load_all_in_directory_with_scope: + * @dirname: pathname for a directory containing modules to load. + * @scope: a scope to use when scanning the modules. + * + * 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: (element-type GIOModule) (transfer full): 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(). + * + * Since: 2.30 + **/ +GList * +g_io_modules_load_all_in_directory_with_scope (const char *dirname, + GIOModuleScope *scope) +{ + 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, scope)) + { + 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_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: (element-type GIOModule) (transfer full): 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) +{ + return g_io_modules_load_all_in_directory_with_scope (dirname, NULL); +} + +static gpointer +try_class (GIOExtension *extension, + guint is_supported_offset) +{ + GType type = g_io_extension_get_type (extension); + typedef gboolean (*verify_func) (void); + gpointer class; + + class = g_type_class_ref (type); + if (!is_supported_offset || (* G_STRUCT_MEMBER(verify_func, class, is_supported_offset)) ()) + return class; + + g_type_class_unref (class); + return NULL; +} + +/** + * _g_io_module_get_default_type: + * @extension_point: the name of an extension point + * @envvar: (allow-none): the name of an environment variable to + * override the default implementation. + * @is_supported_offset: a vtable offset, or zero + * + * Retrieves the default class implementing @extension_point. + * + * If @envvar is not %NULL, and the environment variable with that + * name is set, then the implementation it specifies will be tried + * first. After that, or if @envvar is not set, all other + * implementations will be tried in order of decreasing priority. + * + * If @is_supported_offset is non-zero, then it is the offset into the + * class vtable at which there is a function that takes no arguments and + * returns a boolean. This function will be called on each candidate + * implementation to check if it is actually usable or not. + * + * The result is cached after it is generated the first time, and + * the function is thread-safe. + * + * Return value: (transfer none): an object implementing + * @extension_point, or %NULL if there are no usable + * implementations. + */ +GType +_g_io_module_get_default_type (const gchar *extension_point, + const gchar *envvar, + guint is_supported_offset) +{ + static GRecMutex default_modules_lock; + static GHashTable *default_modules; + const char *use_this; + GList *l; + GIOExtensionPoint *ep; + GIOExtension *extension, *preferred; + gpointer impl; + + g_rec_mutex_lock (&default_modules_lock); + if (default_modules) + { + gpointer key; + + if (g_hash_table_lookup_extended (default_modules, extension_point, &key, &impl)) + { + g_rec_mutex_unlock (&default_modules_lock); + return impl ? G_OBJECT_CLASS_TYPE (impl) : G_TYPE_INVALID; + } + } + else + { + default_modules = g_hash_table_new (g_str_hash, g_str_equal); + } + + _g_io_modules_ensure_loaded (); + ep = g_io_extension_point_lookup (extension_point); + + if (!ep) + { + g_warn_if_reached (); + g_rec_mutex_unlock (&default_modules_lock); + return G_TYPE_INVALID; + } + + use_this = envvar ? g_getenv (envvar) : NULL; + if (use_this) + { + preferred = g_io_extension_point_get_extension_by_name (ep, use_this); + if (preferred) + { + impl = try_class (preferred, is_supported_offset); + if (impl) + goto done; + } + else + g_warning ("Can't find module '%s' specified in %s", use_this, envvar); + } + else + preferred = NULL; + + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + if (extension == preferred) + continue; + + impl = try_class (extension, is_supported_offset); + if (impl) + goto done; + } + + impl = NULL; + + done: + g_hash_table_insert (default_modules, g_strdup (extension_point), impl); + g_rec_mutex_unlock (&default_modules_lock); + + return impl ? G_OBJECT_CLASS_TYPE (impl) : G_TYPE_INVALID; +} + +static gpointer +try_implementation (GIOExtension *extension, + GIOModuleVerifyFunc verify_func) +{ + GType type = g_io_extension_get_type (extension); + gpointer impl; + + if (g_type_is_a (type, G_TYPE_INITABLE)) + return g_initable_new (type, NULL, NULL, NULL); + else + { + impl = g_object_new (type, NULL); + if (!verify_func || verify_func (impl)) + return impl; + + g_object_unref (impl); + return NULL; + } +} + +/** + * _g_io_module_get_default: + * @extension_point: the name of an extension point + * @envvar: (allow-none): the name of an environment variable to + * override the default implementation. + * @verify_func: (allow-none): a function to call to verify that + * a given implementation is usable in the current environment. + * + * Retrieves the default object implementing @extension_point. + * + * If @envvar is not %NULL, and the environment variable with that + * name is set, then the implementation it specifies will be tried + * first. After that, or if @envvar is not set, all other + * implementations will be tried in order of decreasing priority. + * + * If an extension point implementation implements #GInitable, then + * that implementation will only be used if it initializes + * successfully. Otherwise, if @verify_func is not %NULL, then it will + * be called on each candidate implementation after construction, to + * check if it is actually usable or not. + * + * The result is cached after it is generated the first time, and + * the function is thread-safe. + * + * Return value: (transfer none): an object implementing + * @extension_point, or %NULL if there are no usable + * implementations. + */ +gpointer +_g_io_module_get_default (const gchar *extension_point, + const gchar *envvar, + GIOModuleVerifyFunc verify_func) +{ + static GRecMutex default_modules_lock; + static GHashTable *default_modules; + const char *use_this; + GList *l; + GIOExtensionPoint *ep; + GIOExtension *extension, *preferred; + gpointer impl; + + g_rec_mutex_lock (&default_modules_lock); + if (default_modules) + { + gpointer key; + + if (g_hash_table_lookup_extended (default_modules, extension_point, + &key, &impl)) + { + g_rec_mutex_unlock (&default_modules_lock); + return impl; + } + } + else + { + default_modules = g_hash_table_new (g_str_hash, g_str_equal); + } + + _g_io_modules_ensure_loaded (); + ep = g_io_extension_point_lookup (extension_point); + + if (!ep) + { + g_warn_if_reached (); + g_rec_mutex_unlock (&default_modules_lock); + return NULL; + } + + use_this = envvar ? g_getenv (envvar) : NULL; + if (use_this) + { + preferred = g_io_extension_point_get_extension_by_name (ep, use_this); + if (preferred) + { + impl = try_implementation (preferred, verify_func); + if (impl) + goto done; + } + else + g_warning ("Can't find module '%s' specified in %s", use_this, envvar); + } + else + preferred = NULL; + + for (l = g_io_extension_point_get_extensions (ep); l != NULL; l = l->next) + { + extension = l->data; + if (extension == preferred) + continue; + + impl = try_implementation (extension, verify_func); + if (impl) + goto done; + } + + impl = NULL; + + done: + g_hash_table_insert (default_modules, + g_strdup (extension_point), + impl ? g_object_ref (impl) : NULL); + g_rec_mutex_unlock (&default_modules_lock); + + return impl; +} + +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_kqueue_directory_monitor_get_type (void); +extern GType _g_kqueue_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); + +extern GType _g_dummy_proxy_resolver_get_type (void); +extern GType _g_dummy_tls_backend_get_type (void); +extern GType g_network_monitor_base_get_type (void); +#ifdef HAVE_NETLINK +extern GType _g_network_monitor_netlink_get_type (void); +#endif + +#ifdef G_PLATFORM_WIN32 + +#include + +static HMODULE gio_dll = NULL; + +#ifdef DLL_EXPORT + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved); + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + gio_dll = hinstDLL; + + return TRUE; +} + +#endif + +void * +_g_io_win32_get_module (void) +{ + if (!gio_dll) + GetModuleHandleExA (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, + (const char *) _g_io_win32_get_module, + &gio_dll); + return gio_dll; +} + +#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 +#if !GLIB_CHECK_VERSION (3, 0, 0) + ep = g_io_extension_point_register (G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_io_extension_point_set_required_type (ep, G_TYPE_DESKTOP_APP_INFO_LOOKUP); + G_GNUC_END_IGNORE_DEPRECATIONS +#endif +#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_NFS_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_NFS_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); + + ep = g_io_extension_point_register (G_PROXY_RESOLVER_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_PROXY_RESOLVER); + + ep = g_io_extension_point_register (G_PROXY_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_PROXY); + + ep = g_io_extension_point_register (G_TLS_BACKEND_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_TLS_BACKEND); + + ep = g_io_extension_point_register (G_NETWORK_MONITOR_EXTENSION_POINT_NAME); + g_io_extension_point_set_required_type (ep, G_TYPE_NETWORK_MONITOR); + } + + G_UNLOCK (registered_extensions); +} + +void +_g_io_modules_ensure_loaded (void) +{ + static gboolean loaded_dirs = FALSE; + const char *module_path; + GIOModuleScope *scope; + + _g_io_modules_ensure_extension_points_registered (); + + G_LOCK (loaded_dirs); + + if (!loaded_dirs) + { + loaded_dirs = TRUE; + scope = g_io_module_scope_new (G_IO_MODULE_SCOPE_BLOCK_DUPLICATES); + + /* First load any overrides, extras */ + module_path = g_getenv ("GIO_EXTRA_MODULES"); + if (module_path) + { + gchar **paths; + int i; + + paths = g_strsplit (module_path, G_SEARCHPATH_SEPARATOR_S, 0); + + for (i = 0; paths[i] != NULL; i++) + { + g_io_modules_scan_all_in_directory_with_scope (paths[i], scope); + } + + g_strfreev (paths); + } + + /* Then load the compiled in path */ + g_io_modules_scan_all_in_directory_with_scope (GIO_MODULE_DIR, scope); + + g_io_module_scope_free (scope); + + /* Initialize types from built-in "modules" */ + g_type_ensure (g_null_settings_backend_get_type ()); + g_type_ensure (g_memory_settings_backend_get_type ()); +#if defined(HAVE_SYS_INOTIFY_H) || defined(HAVE_LINUX_INOTIFY_H) + g_type_ensure (_g_inotify_directory_monitor_get_type ()); + g_type_ensure (_g_inotify_file_monitor_get_type ()); +#endif +#if defined(HAVE_KQUEUE) + g_type_ensure (_g_kqueue_directory_monitor_get_type ()); + g_type_ensure (_g_kqueue_file_monitor_get_type ()); +#endif +#if defined(HAVE_FEN) + g_type_ensure (_g_fen_directory_monitor_get_type ()); + g_type_ensure (_g_fen_file_monitor_get_type ()); +#endif +#ifdef G_OS_WIN32 + g_type_ensure (_g_win32_volume_monitor_get_type ()); + g_type_ensure (g_win32_directory_monitor_get_type ()); + g_type_ensure (g_registry_backend_get_type ()); +#endif +#ifdef HAVE_CARBON + g_nextstep_settings_backend_get_type (); +#endif +#ifdef G_OS_UNIX + g_type_ensure (_g_unix_volume_monitor_get_type ()); +#endif +#ifdef G_OS_WIN32 + g_type_ensure (_g_winhttp_vfs_get_type ()); +#endif + g_type_ensure (_g_local_vfs_get_type ()); + g_type_ensure (_g_dummy_proxy_resolver_get_type ()); + g_type_ensure (_g_socks4a_proxy_get_type ()); + g_type_ensure (_g_socks4_proxy_get_type ()); + g_type_ensure (_g_socks5_proxy_get_type ()); + g_type_ensure (_g_dummy_tls_backend_get_type ()); + g_type_ensure (g_network_monitor_base_get_type ()); +#ifdef HAVE_NETLINK + g_type_ensure (_g_network_monitor_netlink_get_type ()); +#endif + } + + 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: (transfer none): 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: (transfer none): 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; +} + +static 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: (element-type GIOExtension) (transfer none): 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: (transfer none): 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; + + if (extension_a->priority > extension_b->priority) + return -1; + + if (extension_b->priority > extension_a->priority) + return 1; + + return 0; +} + +/** + * 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: (transfer none): 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: (transfer full): 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; +} diff --git a/gio/giomodule.h b/gio/giomodule.h new file mode 100644 index 0000000..b0aedeb --- /dev/null +++ b/gio/giomodule.h @@ -0,0 +1,167 @@ +/* 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_H__ +#define __G_IO_MODULE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GIOModuleScope GIOModuleScope; + +GLIB_AVAILABLE_IN_2_30 +GIOModuleScope * g_io_module_scope_new (GIOModuleScopeFlags flags); +GLIB_AVAILABLE_IN_2_30 +void g_io_module_scope_free (GIOModuleScope *scope); +GLIB_AVAILABLE_IN_2_30 +void g_io_module_scope_block (GIOModuleScope *scope, + const gchar *basename); + +#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; + +GLIB_AVAILABLE_IN_ALL +GType g_io_module_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GIOModule *g_io_module_new (const gchar *filename); + +GLIB_AVAILABLE_IN_ALL +void g_io_modules_scan_all_in_directory (const char *dirname); +GLIB_AVAILABLE_IN_ALL +GList *g_io_modules_load_all_in_directory (const gchar *dirname); + +GLIB_AVAILABLE_IN_2_30 +void g_io_modules_scan_all_in_directory_with_scope (const gchar *dirname, + GIOModuleScope *scope); +GLIB_AVAILABLE_IN_2_30 +GList *g_io_modules_load_all_in_directory_with_scope (const gchar *dirname, + GIOModuleScope *scope); + +GLIB_AVAILABLE_IN_ALL +GIOExtensionPoint *g_io_extension_point_register (const char *name); +GLIB_AVAILABLE_IN_ALL +GIOExtensionPoint *g_io_extension_point_lookup (const char *name); +GLIB_AVAILABLE_IN_ALL +void g_io_extension_point_set_required_type (GIOExtensionPoint *extension_point, + GType type); +GLIB_AVAILABLE_IN_ALL +GType g_io_extension_point_get_required_type (GIOExtensionPoint *extension_point); +GLIB_AVAILABLE_IN_ALL +GList *g_io_extension_point_get_extensions (GIOExtensionPoint *extension_point); +GLIB_AVAILABLE_IN_ALL +GIOExtension * g_io_extension_point_get_extension_by_name (GIOExtensionPoint *extension_point, + const char *name); +GLIB_AVAILABLE_IN_ALL +GIOExtension * g_io_extension_point_implement (const char *extension_point_name, + GType type, + const char *extension_name, + gint priority); + +GLIB_AVAILABLE_IN_ALL +GType g_io_extension_get_type (GIOExtension *extension); +GLIB_AVAILABLE_IN_ALL +const char * g_io_extension_get_name (GIOExtension *extension); +GLIB_AVAILABLE_IN_ALL +gint g_io_extension_get_priority (GIOExtension *extension); +GLIB_AVAILABLE_IN_ALL +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. + **/ +GLIB_AVAILABLE_IN_ALL +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. + **/ +GLIB_AVAILABLE_IN_ALL +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 model 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: (transfer full): 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 + **/ +GLIB_AVAILABLE_IN_ALL +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..182931d --- /dev/null +++ b/gio/gioscheduler.c @@ -0,0 +1,324 @@ +/* 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 "gtask.h" + +/** + * SECTION:gioscheduler + * @short_description: I/O Scheduler + * @include: gio/gio.h + * + * + * As of GLib 2.36, the g_io_scheduler methods + * are deprecated in favor of #GThreadPool and #GTask. + * + * + * Schedules asynchronous I/O operations. #GIOScheduler integrates + * into the main event loop (#GMainLoop) and uses threads. + **/ + +struct _GIOSchedulerJob { + GList *active_link; + GTask *task; + + GIOSchedulerJobFunc job_func; + gpointer data; + GDestroyNotify destroy_notify; + + GCancellable *cancellable; + gulong cancellable_id; + GMainContext *context; +}; + +G_LOCK_DEFINE_STATIC(active_jobs); +static GList *active_jobs = NULL; + +static void +g_io_job_free (GIOSchedulerJob *job) +{ + if (job->destroy_notify) + job->destroy_notify (job->data); + + G_LOCK (active_jobs); + active_jobs = g_list_delete_link (active_jobs, job->active_link); + G_UNLOCK (active_jobs); + + if (job->cancellable) + g_object_unref (job->cancellable); + g_main_context_unref (job->context); + g_slice_free (GIOSchedulerJob, job); +} + +static void +io_job_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GIOSchedulerJob *job = task_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); +} + +/** + * g_io_scheduler_push_job: + * @job_func: a #GIOSchedulerJobFunc. + * @user_data: data to pass to @job_func + * @notify: (allow-none): 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 in another thread. + * + * @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(). + * + * Deprecated: use #GThreadPool or g_task_run_in_thread() + **/ +void +g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, + gpointer user_data, + GDestroyNotify notify, + gint io_priority, + GCancellable *cancellable) +{ + GIOSchedulerJob *job; + GTask *task; + + g_return_if_fail (job_func != NULL); + + job = g_slice_new0 (GIOSchedulerJob); + job->job_func = job_func; + job->data = user_data; + job->destroy_notify = notify; + + if (cancellable) + job->cancellable = g_object_ref (cancellable); + + job->context = g_main_context_ref_thread_default (); + + G_LOCK (active_jobs); + active_jobs = g_list_prepend (active_jobs, job); + job->active_link = active_jobs; + G_UNLOCK (active_jobs); + + task = g_task_new (NULL, cancellable, NULL, NULL); + g_task_set_task_data (task, job, (GDestroyNotify)g_io_job_free); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, io_job_thread); + g_object_unref (task); +} + +/** + * 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(). + * + * Deprecated: You should never call this function, since you don't + * know how other libraries in your program might be making use of + * gioscheduler. + **/ +void +g_io_scheduler_cancel_all_jobs (void) +{ + GList *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_list_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_list_free (cancellable_list); +} + +typedef struct { + GSourceFunc func; + gboolean ret_val; + gpointer data; + GDestroyNotify notify; + + GMutex ack_lock; + GCond ack_condition; + gboolean ack; +} 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); + + g_mutex_lock (&proxy->ack_lock); + proxy->ack = TRUE; + g_cond_signal (&proxy->ack_condition); + g_mutex_unlock (&proxy->ack_lock); + + return FALSE; +} + +static void +mainloop_proxy_free (MainLoopProxy *proxy) +{ + g_mutex_clear (&proxy->ack_lock); + g_cond_clear (&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: (allow-none): 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 + * + * Deprecated: Use g_main_context_invoke(). + **/ +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); + + proxy = g_new0 (MainLoopProxy, 1); + proxy->func = func; + proxy->data = user_data; + proxy->notify = notify; + g_mutex_init (&proxy->ack_lock); + g_cond_init (&proxy->ack_condition); + 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); + + while (!proxy->ack) + 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: (allow-none): 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. + * + * Deprecated: Use g_main_context_invoke(). + **/ +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); + + proxy = g_new0 (MainLoopProxy, 1); + proxy->func = func; + proxy->data = user_data; + proxy->notify = notify; + g_mutex_init (&proxy->ack_lock); + g_cond_init (&proxy->ack_condition); + + 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); +} diff --git a/gio/gioscheduler.h b/gio/gioscheduler.h new file mode 100644 index 0000000..c044b82 --- /dev/null +++ b/gio/gioscheduler.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 + */ + +#ifndef __G_IO_SCHEDULER_H__ +#define __G_IO_SCHEDULER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +GLIB_DEPRECATED_IN_2_36_FOR ("GThreadPool or g_task_run_in_thread") +void g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, + gpointer user_data, + GDestroyNotify notify, + gint io_priority, + GCancellable *cancellable); +GLIB_DEPRECATED_IN_2_36 +void g_io_scheduler_cancel_all_jobs (void); +GLIB_DEPRECATED_IN_2_36_FOR (g_main_context_invoke) +gboolean g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, + GSourceFunc func, + gpointer user_data, + GDestroyNotify notify); +GLIB_DEPRECATED_IN_2_36_FOR (g_main_context_invoke) +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..49bca9b --- /dev/null +++ b/gio/giostream.c @@ -0,0 +1,832 @@ +/* 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 "gasyncresult.h" +#include "gtask.h" + +G_DEFINE_ABSTRACT_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_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->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_READABLE | 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: (transfer none): 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: (transfer none): 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 occurring, 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: (allow-none): optional #GCancellable object, %NULL to ignore + * @error: location to store the error occurring, 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 + * @cancellable: (allow-none): optional cancellable object + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * 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; + GError *error = NULL; + + g_return_if_fail (G_IS_IO_STREAM (stream)); + + if (stream->priv->closed) + { + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_io_stream_close_async); + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + if (!g_io_stream_set_pending (stream, &error)) + { + g_task_report_error (stream, callback, user_data, + g_io_stream_close_async, + 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 occurring, 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) +{ + 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_io_stream_close_async)) + return g_task_propagate_boolean (G_TASK (result), error); + + class = G_IO_STREAM_GET_CLASS (stream); + return class->close_finish (stream, result, error); +} + + +static void +close_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GIOStream *stream = source_object; + GIOStreamClass *class; + GError *error = NULL; + gboolean result; + + class = G_IO_STREAM_GET_CLASS (stream); + if (class->close_fn) + { + result = class->close_fn (stream, + g_task_get_cancellable (task), + &error); + if (!result) + { + g_task_return_error (task, error); + return; + } + } + + g_task_return_boolean (task, TRUE); +} + +static void +g_io_stream_real_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_check_cancellable (task, FALSE); + g_task_set_priority (task, io_priority); + + g_task_run_in_thread (task, close_async_thread); + g_object_unref (task); +} + +static gboolean +g_io_stream_real_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +typedef struct +{ + GIOStream *stream1; + GIOStream *stream2; + GIOStreamSpliceFlags flags; + gint io_priority; + GCancellable *cancellable; + gulong cancelled_id; + GCancellable *op1_cancellable; + GCancellable *op2_cancellable; + guint completed; + GError *error; +} SpliceContext; + +static void +splice_context_free (SpliceContext *ctx) +{ + g_object_unref (ctx->stream1); + g_object_unref (ctx->stream2); + if (ctx->cancellable != NULL) + g_object_unref (ctx->cancellable); + g_object_unref (ctx->op1_cancellable); + g_object_unref (ctx->op2_cancellable); + g_clear_error (&ctx->error); + g_slice_free (SpliceContext, ctx); +} + +static void +splice_complete (GTask *task, + SpliceContext *ctx) +{ + if (ctx->cancelled_id != 0) + g_cancellable_disconnect (ctx->cancellable, ctx->cancelled_id); + ctx->cancelled_id = 0; + + if (ctx->error != NULL) + { + g_task_return_error (task, ctx->error); + ctx->error = NULL; + } + else + g_task_return_boolean (task, TRUE); +} + +static void +splice_close_cb (GObject *iostream, + GAsyncResult *res, + gpointer user_data) +{ + GTask *task = user_data; + SpliceContext *ctx = g_task_get_task_data (task); + GError *error = NULL; + + g_io_stream_close_finish (G_IO_STREAM (iostream), res, &error); + + ctx->completed++; + + /* Keep the first error that occurred */ + if (error != NULL && ctx->error == NULL) + ctx->error = error; + else + g_clear_error (&error); + + /* If all operations are done, complete now */ + if (ctx->completed == 4) + splice_complete (task, ctx); + + g_object_unref (task); +} + +static void +splice_cb (GObject *ostream, + GAsyncResult *res, + gpointer user_data) +{ + GTask *task = user_data; + SpliceContext *ctx = g_task_get_task_data (task); + GError *error = NULL; + + g_output_stream_splice_finish (G_OUTPUT_STREAM (ostream), res, &error); + + ctx->completed++; + + /* ignore cancellation error if it was not requested by the user */ + if (error != NULL && + g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && + (ctx->cancellable == NULL || + !g_cancellable_is_cancelled (ctx->cancellable))) + g_clear_error (&error); + + /* Keep the first error that occurred */ + if (error != NULL && ctx->error == NULL) + ctx->error = error; + else + g_clear_error (&error); + + if (ctx->completed == 1 && + (ctx->flags & G_IO_STREAM_SPLICE_WAIT_FOR_BOTH) == 0) + { + /* We don't want to wait for the 2nd operation to finish, cancel it */ + g_cancellable_cancel (ctx->op1_cancellable); + g_cancellable_cancel (ctx->op2_cancellable); + } + else if (ctx->completed == 2) + { + if (ctx->cancellable == NULL || + !g_cancellable_is_cancelled (ctx->cancellable)) + { + g_cancellable_reset (ctx->op1_cancellable); + g_cancellable_reset (ctx->op2_cancellable); + } + + /* Close the IO streams if needed */ + if ((ctx->flags & G_IO_STREAM_SPLICE_CLOSE_STREAM1) != 0) + { + g_io_stream_close_async (ctx->stream1, + g_task_get_priority (task), + ctx->op1_cancellable, + splice_close_cb, g_object_ref (task)); + } + else + ctx->completed++; + + if ((ctx->flags & G_IO_STREAM_SPLICE_CLOSE_STREAM2) != 0) + { + g_io_stream_close_async (ctx->stream2, + g_task_get_priority (task), + ctx->op2_cancellable, + splice_close_cb, g_object_ref (task)); + } + else + ctx->completed++; + + /* If all operations are done, complete now */ + if (ctx->completed == 4) + splice_complete (task, ctx); + } + + g_object_unref (task); +} + +static void +splice_cancelled_cb (GCancellable *cancellable, + GTask *task) +{ + SpliceContext *ctx; + + ctx = g_task_get_task_data (task); + g_cancellable_cancel (ctx->op1_cancellable); + g_cancellable_cancel (ctx->op2_cancellable); +} + +/** + * g_io_stream_splice_async: + * @stream1: a #GIOStream. + * @stream2: a #GIOStream. + * @flags: a set of #GIOStreamSpliceFlags. + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): user data passed to @callback. + * + * Asyncronously splice the output stream of @stream1 to the input stream of + * @stream2, and splice the output stream of @stream2 to the input stream of + * @stream1. + * + * When the operation is finished @callback will be called. + * You can then call g_io_stream_splice_finish() to get the + * result of the operation. + * + * Since: 2.28 + **/ +void +g_io_stream_splice_async (GIOStream *stream1, + GIOStream *stream2, + GIOStreamSpliceFlags flags, + gint io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + SpliceContext *ctx; + GInputStream *istream; + GOutputStream *ostream; + + if (cancellable != NULL && g_cancellable_is_cancelled (cancellable)) + { + g_task_report_new_error (NULL, callback, user_data, + g_io_stream_splice_async, + G_IO_ERROR, G_IO_ERROR_CANCELLED, + "Operation has been cancelled"); + return; + } + + ctx = g_slice_new0 (SpliceContext); + ctx->stream1 = g_object_ref (stream1); + ctx->stream2 = g_object_ref (stream2); + ctx->flags = flags; + ctx->op1_cancellable = g_cancellable_new (); + ctx->op2_cancellable = g_cancellable_new (); + ctx->completed = 0; + + task = g_task_new (NULL, cancellable, callback, user_data); + g_task_set_task_data (task, ctx, (GDestroyNotify) splice_context_free); + + if (cancellable != NULL) + { + ctx->cancellable = g_object_ref (cancellable); + ctx->cancelled_id = g_cancellable_connect (cancellable, + G_CALLBACK (splice_cancelled_cb), g_object_ref (task), + g_object_unref); + } + + istream = g_io_stream_get_input_stream (stream1); + ostream = g_io_stream_get_output_stream (stream2); + g_output_stream_splice_async (ostream, istream, G_OUTPUT_STREAM_SPLICE_NONE, + io_priority, ctx->op1_cancellable, splice_cb, + g_object_ref (task)); + + istream = g_io_stream_get_input_stream (stream2); + ostream = g_io_stream_get_output_stream (stream1); + g_output_stream_splice_async (ostream, istream, G_OUTPUT_STREAM_SPLICE_NONE, + io_priority, ctx->op2_cancellable, splice_cb, + g_object_ref (task)); + + g_object_unref (task); +} + +/** + * g_io_stream_splice_finish: + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an asynchronous io stream splice operation. + * + * Returns: %TRUE on success, %FALSE otherwise. + * + * Since: 2.28 + **/ +gboolean +g_io_stream_splice_finish (GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/gio/giostream.h b/gio/giostream.h new file mode 100644 index 0000000..561b0e9 --- /dev/null +++ b/gio/giostream.h @@ -0,0 +1,135 @@ +/* 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 + */ + +#ifndef __G_IO_STREAM_H__ +#define __G_IO_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_io_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GInputStream * g_io_stream_get_input_stream (GIOStream *stream); +GLIB_AVAILABLE_IN_ALL +GOutputStream *g_io_stream_get_output_stream (GIOStream *stream); + +GLIB_AVAILABLE_IN_ALL +void g_io_stream_splice_async (GIOStream *stream1, + GIOStream *stream2, + GIOStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_splice_finish (GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_close (GIOStream *stream, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_io_stream_close_async (GIOStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_is_closed (GIOStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_has_pending (GIOStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_io_stream_set_pending (GIOStream *stream, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..2696091 --- /dev/null +++ b/gio/giotypes.h @@ -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 + */ + +#ifndef __GIO_TYPES_H__ +#define __GIO_TYPES_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 _GSimplePermission GSimplePermission; +typedef struct _GZlibCompressor GZlibCompressor; +typedef struct _GZlibDecompressor GZlibDecompressor; + +typedef struct _GSimpleActionGroup GSimpleActionGroup; +typedef struct _GRemoteActionGroup GRemoteActionGroup; +typedef struct _GDBusActionGroup GDBusActionGroup; +typedef struct _GActionMap GActionMap; +typedef struct _GActionGroup GActionGroup; +typedef struct _GSimpleAction GSimpleAction; +typedef struct _GAction GAction; +typedef struct _GApplication GApplication; +typedef struct _GApplicationCommandLine GApplicationCommandLine; +typedef struct _GSettingsBackend GSettingsBackend; +typedef struct _GSettings GSettings; +typedef struct _GPermission GPermission; + +typedef struct _GMenuModel GMenuModel; + +/** + * 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 _GInetAddressMask GInetAddressMask; +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 defining and scheduling IO jobs. + **/ +typedef struct _GIOSchedulerJob GIOSchedulerJob; +typedef struct _GIOStreamAdapter GIOStreamAdapter; +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 _GNetworkMonitor GNetworkMonitor; +typedef struct _GNetworkService GNetworkService; +typedef struct _GOutputStream GOutputStream; +typedef struct _GIOStream GIOStream; +typedef struct _GPollableInputStream GPollableInputStream; /* Dummy typedef */ +typedef struct _GPollableOutputStream GPollableOutputStream; /* Dummy typedef */ +typedef struct _GResolver GResolver; +/** + * GResource: + * + * A resource bundle. + * + * Since: 2.32 + */ +typedef struct _GResource GResource; +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; +/** + * GSocketListener: + * + * 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; +typedef struct _GTask GTask; +/** + * GTcpConnection: + * + * A #GSocketConnection for TCP/IP connections. + * + * Since: 2.22 + **/ +typedef struct _GTcpConnection GTcpConnection; +typedef struct _GTcpWrapperConnection GTcpWrapperConnection; +/** + * GThreadedSocketService: + * + * A helper class for handling accepting incoming connections in the + * glib mainloop and handling them in a thread. + * + * Since: 2.22 + **/ +typedef struct _GThreadedSocketService GThreadedSocketService; +typedef struct _GThemedIcon GThemedIcon; +typedef struct _GTlsCertificate GTlsCertificate; +typedef struct _GTlsClientConnection GTlsClientConnection; /* Dummy typedef */ +typedef struct _GTlsConnection GTlsConnection; +typedef struct _GTlsDatabase GTlsDatabase; +typedef struct _GTlsFileDatabase GTlsFileDatabase; +typedef struct _GTlsInteraction GTlsInteraction; +typedef struct _GTlsPassword GTlsPassword; +typedef struct _GTlsServerConnection GTlsServerConnection; /* Dummy typedef */ +typedef struct _GVfs GVfs; /* Dummy typedef */ + +/** + * GProxyResolver: + * + * A helper class to enumerate proxies base on URI. + * + * Since: 2.26 + **/ +typedef struct _GProxyResolver GProxyResolver; +typedef struct _GProxy GProxy; +typedef struct _GProxyAddress GProxyAddress; +typedef struct _GProxyAddressEnumerator GProxyAddressEnumerator; + +/** + * 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. + * + * 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; +}; + +typedef struct _GCredentials GCredentials; +typedef struct _GUnixCredentialsMessage GUnixCredentialsMessage; +typedef struct _GUnixFDList GUnixFDList; +typedef struct _GDBusMessage GDBusMessage; +typedef struct _GDBusConnection GDBusConnection; +typedef struct _GDBusProxy GDBusProxy; +typedef struct _GDBusMethodInvocation GDBusMethodInvocation; +typedef struct _GDBusServer GDBusServer; +typedef struct _GDBusAuthObserver GDBusAuthObserver; +typedef struct _GDBusErrorEntry GDBusErrorEntry; +typedef struct _GDBusInterfaceVTable GDBusInterfaceVTable; +typedef struct _GDBusSubtreeVTable GDBusSubtreeVTable; +typedef struct _GDBusAnnotationInfo GDBusAnnotationInfo; +typedef struct _GDBusArgInfo GDBusArgInfo; +typedef struct _GDBusMethodInfo GDBusMethodInfo; +typedef struct _GDBusSignalInfo GDBusSignalInfo; +typedef struct _GDBusPropertyInfo GDBusPropertyInfo; +typedef struct _GDBusInterfaceInfo GDBusInterfaceInfo; +typedef struct _GDBusNodeInfo GDBusNodeInfo; + +/** + * GCancellableSourceFunc: + * @cancellable: the #GCancellable + * @user_data: data passed in by the user. + * + * This is the function type of the callback used for the #GSource + * returned by g_cancellable_source_new(). + * + * Returns: it should return %FALSE if the source should be removed. + * + * Since: 2.28 + */ +typedef gboolean (*GCancellableSourceFunc) (GCancellable *cancellable, + gpointer user_data); + +/** + * GPollableSourceFunc: + * @pollable_stream: the #GPollableInputStream or #GPollableOutputStream + * @user_data: data passed in by the user. + * + * This is the function type of the callback used for the #GSource + * returned by g_pollable_input_stream_create_source() and + * g_pollable_output_stream_create_source(). + * + * Returns: it should return %FALSE if the source should be removed. + * + * Since: 2.28 + */ +typedef gboolean (*GPollableSourceFunc) (GObject *pollable_stream, + gpointer user_data); + +typedef struct _GDBusInterface GDBusInterface; /* Dummy typedef */ +typedef struct _GDBusInterfaceSkeleton GDBusInterfaceSkeleton; +typedef struct _GDBusObject GDBusObject; /* Dummy typedef */ +typedef struct _GDBusObjectSkeleton GDBusObjectSkeleton; +typedef struct _GDBusObjectProxy GDBusObjectProxy; +typedef struct _GDBusObjectManager GDBusObjectManager; /* Dummy typedef */ +typedef struct _GDBusObjectManagerClient GDBusObjectManagerClient; +typedef struct _GDBusObjectManagerServer GDBusObjectManagerServer; + +/** + * GDBusProxyTypeFunc: + * @manager: A #GDBusObjectManagerClient. + * @object_path: The object path of the remote object. + * @interface_name: (allow-none): The interface name of the remote object or %NULL if a #GDBusObjectProxy #GType is requested. + * @user_data: User data. + * + * Function signature for a function used to determine the #GType to + * use for an interface proxy (if @interface_name is not %NULL) or + * object proxy (if @interface_name is %NULL). + * + * This function is called in the + * thread-default main loop + * that @manager was constructed in. + * + * Returns: A #GType to use for the remote object. The returned type + * must be a #GDBusProxy- or #GDBusObjectProxy-derived + * type. + * + * Since: 2.30 + */ +typedef GType (*GDBusProxyTypeFunc) (GDBusObjectManagerClient *manager, + const gchar *object_path, + const gchar *interface_name, + gpointer user_data); + +typedef struct _GTestDBus GTestDBus; + +G_END_DECLS + +#endif /* __GIO_TYPES_H__ */ diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c new file mode 100644 index 0000000..6601eba --- /dev/null +++ b/gio/gkeyfilesettingsbackend.c @@ -0,0 +1,666 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2010 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 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: Vincent Untz + * Ryan Lortie + */ + +#include "config.h" + +#include +#include + +#include "gfile.h" +#include "gfileinfo.h" +#include "gfilemonitor.h" +#include "gsimplepermission.h" +#include "gsettingsbackend.h" + + +#define G_TYPE_KEYFILE_SETTINGS_BACKEND (g_keyfile_settings_backend_get_type ()) +#define G_KEYFILE_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_KEYFILE_SETTINGS_BACKEND, \ + GKeyfileSettingsBackend)) +#define G_IS_KEYFILE_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_KEYFILE_SETTINGS_BACKEND)) + + +typedef GSettingsBackendClass GKeyfileSettingsBackendClass; + +typedef struct +{ + GSettingsBackend parent_instance; + + GKeyFile *keyfile; + GPermission *permission; + gboolean writable; + + gchar *prefix; + gint prefix_len; + gchar *root_group; + gint root_group_len; + + GFile *file; + GFileMonitor *file_monitor; + guint8 digest[32]; + GFile *dir; + GFileMonitor *dir_monitor; +} GKeyfileSettingsBackend; + +static GType g_keyfile_settings_backend_get_type (void); +G_DEFINE_TYPE (GKeyfileSettingsBackend, + g_keyfile_settings_backend, + G_TYPE_SETTINGS_BACKEND) + +static void +compute_checksum (guint8 *digest, + gconstpointer contents, + gsize length) +{ + GChecksum *checksum; + gsize len = 32; + + checksum = g_checksum_new (G_CHECKSUM_SHA256); + g_checksum_update (checksum, contents, length); + g_checksum_get_digest (checksum, digest, &len); + g_checksum_free (checksum); + g_assert (len == 32); +} + +static void +g_keyfile_settings_backend_keyfile_write (GKeyfileSettingsBackend *kfsb) +{ + gchar *contents; + gsize length; + + contents = g_key_file_to_data (kfsb->keyfile, &length, NULL); + g_file_replace_contents (kfsb->file, contents, length, NULL, FALSE, + G_FILE_CREATE_REPLACE_DESTINATION, + NULL, NULL, NULL); + + compute_checksum (kfsb->digest, contents, length); + g_free (contents); +} + +static gboolean +group_name_matches (const gchar *group_name, + const gchar *prefix) +{ + /* sort of like g_str_has_prefix() except that it must be an exact + * match or the prefix followed by '/'. + * + * for example 'a' is a prefix of 'a' and 'a/b' but not 'ab'. + */ + gint i; + + for (i = 0; prefix[i]; i++) + if (prefix[i] != group_name[i]) + return FALSE; + + return group_name[i] == '\0' || group_name[i] == '/'; +} + +static gboolean +convert_path (GKeyfileSettingsBackend *kfsb, + const gchar *key, + gchar **group, + gchar **basename) +{ + gint key_len = strlen (key); + gint i; + + if (key_len < kfsb->prefix_len || + memcmp (key, kfsb->prefix, kfsb->prefix_len) != 0) + return FALSE; + + key_len -= kfsb->prefix_len; + key += kfsb->prefix_len; + + for (i = key_len; i >= 0; i--) + if (key[i] == '/') + break; + + if (kfsb->root_group) + { + /* if a root_group was specified, make sure the user hasn't given + * a path that ghosts that group name + */ + if (i == kfsb->root_group_len && memcmp (key, kfsb->root_group, i) == 0) + return FALSE; + } + else + { + /* if no root_group was given, ensure that the user gave a path */ + if (i == -1) + return FALSE; + } + + if (group) + { + if (i >= 0) + { + *group = g_memdup (key, i + 1); + (*group)[i] = '\0'; + } + else + *group = g_strdup (kfsb->root_group); + } + + if (basename) + *basename = g_memdup (key + i + 1, key_len - i); + + return TRUE; +} + +static gboolean +path_is_valid (GKeyfileSettingsBackend *kfsb, + const gchar *path) +{ + return convert_path (kfsb, path, NULL, NULL); +} + +static GVariant * +get_from_keyfile (GKeyfileSettingsBackend *kfsb, + const GVariantType *type, + const gchar *key) +{ + GVariant *return_value = NULL; + gchar *group, *name; + + if (convert_path (kfsb, key, &group, &name)) + { + gchar *str; + + g_assert (*name); + + str = g_key_file_get_value (kfsb->keyfile, group, name, NULL); + + if (str) + { + return_value = g_variant_parse (type, str, NULL, NULL, NULL); + g_free (str); + } + + g_free (group); + g_free (name); + } + + return return_value; +} + +static gboolean +set_to_keyfile (GKeyfileSettingsBackend *kfsb, + const gchar *key, + GVariant *value) +{ + gchar *group, *name; + + if (convert_path (kfsb, key, &group, &name)) + { + if (value) + { + gchar *str = g_variant_print (value, FALSE); + g_key_file_set_value (kfsb->keyfile, group, name, str); + g_variant_unref (g_variant_ref_sink (value)); + g_free (str); + } + else + { + if (*name == '\0') + { + gchar **groups; + gint i; + + groups = g_key_file_get_groups (kfsb->keyfile, NULL); + + for (i = 0; groups[i]; i++) + if (group_name_matches (groups[i], group)) + g_key_file_remove_group (kfsb->keyfile, groups[i], NULL); + + g_strfreev (groups); + } + else + g_key_file_remove_key (kfsb->keyfile, group, name, NULL); + } + + g_free (group); + g_free (name); + + return TRUE; + } + + return FALSE; +} + +static GVariant * +g_keyfile_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); + + if (default_value) + return NULL; + + return get_from_keyfile (kfsb, expected_type, key); +} + +typedef struct +{ + GKeyfileSettingsBackend *kfsb; + gboolean failed; +} WriteManyData; + +static gboolean +g_keyfile_settings_backend_write_one (gpointer key, + gpointer value, + gpointer user_data) +{ + WriteManyData *data = user_data; + gboolean success; + + success = set_to_keyfile (data->kfsb, key, value); + g_assert (success); + + return FALSE; +} + +static gboolean +g_keyfile_settings_backend_check_one (gpointer key, + gpointer value, + gpointer user_data) +{ + WriteManyData *data = user_data; + + return data->failed = !path_is_valid (data->kfsb, key); +} + +static gboolean +g_keyfile_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + WriteManyData data = { G_KEYFILE_SETTINGS_BACKEND (backend) }; + + if (!data.kfsb->writable) + return FALSE; + + g_tree_foreach (tree, g_keyfile_settings_backend_check_one, &data); + + if (data.failed) + return FALSE; + + g_tree_foreach (tree, g_keyfile_settings_backend_write_one, &data); + g_keyfile_settings_backend_keyfile_write (data.kfsb); + + g_settings_backend_changed_tree (backend, tree, origin_tag); + + return TRUE; +} + +static gboolean +g_keyfile_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); + gboolean success; + + if (!kfsb->writable) + return FALSE; + + success = set_to_keyfile (kfsb, key, value); + + if (success) + { + g_settings_backend_changed (backend, key, origin_tag); + g_keyfile_settings_backend_keyfile_write (kfsb); + } + + return success; +} + +static void +g_keyfile_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); + + if (set_to_keyfile (kfsb, key, NULL)) + g_keyfile_settings_backend_keyfile_write (kfsb); + + g_settings_backend_changed (backend, key, origin_tag); +} + +static gboolean +g_keyfile_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *name) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); + + return kfsb->writable && path_is_valid (kfsb, name); +} + +static GPermission * +g_keyfile_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend); + + return g_object_ref (kfsb->permission); +} + +static void +keyfile_to_tree (GKeyfileSettingsBackend *kfsb, + GTree *tree, + GKeyFile *keyfile, + gboolean dup_check) +{ + gchar **groups; + gint i; + + groups = g_key_file_get_groups (keyfile, NULL); + for (i = 0; groups[i]; i++) + { + gboolean is_root_group; + gchar **keys; + gint j; + + is_root_group = g_strcmp0 (kfsb->root_group, groups[i]) == 0; + + /* reject group names that will form invalid key names */ + if (!is_root_group && + (g_str_has_prefix (groups[i], "/") || + g_str_has_suffix (groups[i], "/") || strstr (groups[i], "//"))) + continue; + + keys = g_key_file_get_keys (keyfile, groups[i], NULL, NULL); + + for (j = 0; keys[j]; j++) + { + gchar *path, *value; + + /* reject key names with slashes in them */ + if (strchr (keys[j], '/')) + continue; + + if (is_root_group) + path = g_strdup_printf ("%s%s", kfsb->prefix, keys[j]); + else + path = g_strdup_printf ("%s%s/%s", kfsb->prefix, groups[i], keys[j]); + + value = g_key_file_get_value (keyfile, groups[i], keys[j], NULL); + + if (dup_check && g_strcmp0 (g_tree_lookup (tree, path), value) == 0) + { + g_tree_remove (tree, path); + g_free (value); + g_free (path); + } + else + g_tree_insert (tree, path, value); + } + + g_strfreev (keys); + } + g_strfreev (groups); +} + +static void +g_keyfile_settings_backend_keyfile_reload (GKeyfileSettingsBackend *kfsb) +{ + guint8 digest[32]; + gchar *contents; + gsize length; + + contents = NULL; + length = 0; + + g_file_load_contents (kfsb->file, NULL, &contents, &length, NULL, NULL); + compute_checksum (digest, contents, length); + + if (memcmp (kfsb->digest, digest, sizeof digest) != 0) + { + GKeyFile *keyfiles[2]; + GTree *tree; + + tree = g_tree_new_full ((GCompareDataFunc) strcmp, NULL, + g_free, g_free); + + keyfiles[0] = kfsb->keyfile; + keyfiles[1] = g_key_file_new (); + + if (length > 0) + g_key_file_load_from_data (keyfiles[1], contents, length, + G_KEY_FILE_KEEP_COMMENTS | + G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + + keyfile_to_tree (kfsb, tree, keyfiles[0], FALSE); + keyfile_to_tree (kfsb, tree, keyfiles[1], TRUE); + g_key_file_free (keyfiles[0]); + kfsb->keyfile = keyfiles[1]; + + if (g_tree_nnodes (tree) > 0) + g_settings_backend_changed_tree (&kfsb->parent_instance, tree, NULL); + + g_tree_unref (tree); + + memcpy (kfsb->digest, digest, sizeof digest); + } + + g_free (contents); +} + +static void +g_keyfile_settings_backend_keyfile_writable (GKeyfileSettingsBackend *kfsb) +{ + GFileInfo *fileinfo; + gboolean writable; + + fileinfo = g_file_query_info (kfsb->dir, "access::*", 0, NULL, NULL); + + if (fileinfo) + { + writable = + g_file_info_get_attribute_boolean (fileinfo, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE) && + g_file_info_get_attribute_boolean (fileinfo, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE); + g_object_unref (fileinfo); + } + else + writable = FALSE; + + if (writable != kfsb->writable) + { + kfsb->writable = writable; + g_settings_backend_path_writable_changed (&kfsb->parent_instance, "/"); + } +} + +static void +g_keyfile_settings_backend_finalize (GObject *object) +{ + GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object); + + g_key_file_free (kfsb->keyfile); + g_object_unref (kfsb->permission); + + g_file_monitor_cancel (kfsb->file_monitor); + g_object_unref (kfsb->file_monitor); + g_object_unref (kfsb->file); + + g_file_monitor_cancel (kfsb->dir_monitor); + g_object_unref (kfsb->dir_monitor); + g_object_unref (kfsb->dir); + + g_free (kfsb->root_group); + g_free (kfsb->prefix); + + G_OBJECT_CLASS (g_keyfile_settings_backend_parent_class) + ->finalize (object); +} + +static void +g_keyfile_settings_backend_init (GKeyfileSettingsBackend *kfsb) +{ +} + +static void +g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_keyfile_settings_backend_finalize; + + class->read = g_keyfile_settings_backend_read; + class->write = g_keyfile_settings_backend_write; + class->write_tree = g_keyfile_settings_backend_write_tree; + class->reset = g_keyfile_settings_backend_reset; + class->get_writable = g_keyfile_settings_backend_get_writable; + class->get_permission = g_keyfile_settings_backend_get_permission; + /* No need to implement subscribed/unsubscribe: the only point would be to + * stop monitoring the file when there's no GSettings anymore, which is no + * big win. */ +} + +static void +file_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GKeyfileSettingsBackend *kfsb = user_data; + + g_keyfile_settings_backend_keyfile_reload (kfsb); +} + +static void +dir_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GKeyfileSettingsBackend *kfsb = user_data; + + g_keyfile_settings_backend_keyfile_writable (kfsb); +} + +/** + * g_keyfile_settings_backend_new: + * @filename: the filename of the keyfile + * @root_path: the path under which all settings keys appear + * @root_group: (allow-none): the group name corresponding to + * @root_path, or %NULL + * + * Creates a keyfile-backed #GSettingsBackend. + * + * The filename of the keyfile to use is given by @filename. + * + * All settings read to or written from the backend must fall under the + * path given in @root_path (which must start and end with a slash and + * not contain two consecutive slashes). @root_path may be "/". + * + * If @root_group is non-%NULL then it specifies the name of the keyfile + * group used for keys that are written directly below @root_path. For + * example, if @root_path is "/apps/example/" and @root_group is + * "toplevel", then settings the key "/apps/example/enabled" to a value + * of %TRUE will cause the following to appear in the keyfile: + * + * |[ + * [toplevel] + * enabled=true + * ]| + * + * If @root_group is %NULL then it is not permitted to store keys + * directly below the @root_path. + * + * For keys not stored directly below @root_path (ie: in a sub-path), + * the name of the subpath (with the final slash stripped) is used as + * the name of the keyfile group. To continue the example, if + * "/apps/example/profiles/default/font-size" were set to + * 12 then the following would appear in the keyfile: + * + * |[ + * [profiles/default] + * font-size=12 + * ]| + * + * The backend will refuse writes (and return writability as being + * %FALSE) for keys outside of @root_path and, in the event that + * @root_group is %NULL, also for keys directly under @root_path. + * Writes will also be refused if the backend detects that it has the + * inability to rewrite the keyfile (ie: the containing directory is not + * writable). + * + * There is no checking done for your key namespace clashing with the + * syntax of the key file format. For example, if you have '[' or ']' + * characters in your path names or '=' in your key names you may be in + * trouble. + * + * Returns: (transfer full): a keyfile-backed #GSettingsBackend + **/ +GSettingsBackend * +g_keyfile_settings_backend_new (const gchar *filename, + const gchar *root_path, + const gchar *root_group) +{ + GKeyfileSettingsBackend *kfsb; + + g_return_val_if_fail (filename != NULL, NULL); + g_return_val_if_fail (root_path != NULL, NULL); + g_return_val_if_fail (g_str_has_prefix (root_path, "/"), NULL); + g_return_val_if_fail (g_str_has_suffix (root_path, "/"), NULL); + g_return_val_if_fail (strstr (root_path, "//") == NULL, NULL); + + kfsb = g_object_new (G_TYPE_KEYFILE_SETTINGS_BACKEND, NULL); + kfsb->keyfile = g_key_file_new (); + kfsb->permission = g_simple_permission_new (TRUE); + + kfsb->file = g_file_new_for_path (filename); + kfsb->dir = g_file_get_parent (kfsb->file); + g_file_make_directory_with_parents (kfsb->dir, NULL, NULL); + + kfsb->file_monitor = g_file_monitor_file (kfsb->file, 0, NULL, NULL); + kfsb->dir_monitor = g_file_monitor_file (kfsb->dir, 0, NULL, NULL); + + kfsb->prefix_len = strlen (root_path); + kfsb->prefix = g_strdup (root_path); + + if (root_group) + { + kfsb->root_group_len = strlen (root_group); + kfsb->root_group = g_strdup (root_group); + } + + compute_checksum (kfsb->digest, NULL, 0); + + g_signal_connect (kfsb->file_monitor, "changed", + G_CALLBACK (file_changed), kfsb); + g_signal_connect (kfsb->dir_monitor, "changed", + G_CALLBACK (dir_changed), kfsb); + + g_keyfile_settings_backend_keyfile_writable (kfsb); + g_keyfile_settings_backend_keyfile_reload (kfsb); + + return G_SETTINGS_BACKEND (kfsb); +} diff --git a/gio/glib-compile-resources.c b/gio/glib-compile-resources.c new file mode 100644 index 0000000..6ec3076 --- /dev/null +++ b/gio/glib-compile-resources.c @@ -0,0 +1,949 @@ +/* + * Copyright © 2011 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 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: Alexander Larsson + */ + +#include "config.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef G_OS_WIN32 +#include +#endif + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include "gvdb/gvdb-builder.h" + +#include "gconstructor_as_data.h" + +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + +typedef struct +{ + char *filename; + char *content; + gsize content_size; + gsize size; + guint32 flags; +} FileData; + +typedef struct +{ + GHashTable *table; /* resource path -> FileData */ + + gboolean collect_data; + + /* per gresource */ + char *prefix; + + /* per file */ + char *alias; + gboolean compressed; + char *preproc_options; + + GString *string; /* non-NULL when accepting text */ +} ParseState; + +static gchar **sourcedirs = NULL; +static gchar *xmllint = NULL; +static gchar *gdk_pixbuf_pixdata = NULL; + +static void +file_data_free (FileData *data) +{ + g_free (data->filename); + g_free (data->content); + g_free (data); +} + +static void +start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + const GSList *element_stack; + const gchar *container; + + element_stack = g_markup_parse_context_get_element_stack (context); + container = element_stack->next ? element_stack->next->data : NULL; + +#define COLLECT(first, ...) \ + g_markup_collect_attributes (element_name, \ + attribute_names, attribute_values, error, \ + first, __VA_ARGS__, G_MARKUP_COLLECT_INVALID) +#define OPTIONAL G_MARKUP_COLLECT_OPTIONAL +#define STRDUP G_MARKUP_COLLECT_STRDUP +#define STRING G_MARKUP_COLLECT_STRING +#define BOOL G_MARKUP_COLLECT_BOOLEAN +#define NO_ATTRS() COLLECT (G_MARKUP_COLLECT_INVALID, NULL) + + if (container == NULL) + { + if (strcmp (element_name, "gresources") == 0) + return; + } + else if (strcmp (container, "gresources") == 0) + { + if (strcmp (element_name, "gresource") == 0) + { + COLLECT (OPTIONAL | STRDUP, + "prefix", &state->prefix); + return; + } + } + else if (strcmp (container, "gresource") == 0) + { + if (strcmp (element_name, "file") == 0) + { + COLLECT (OPTIONAL | STRDUP, "alias", &state->alias, + OPTIONAL | BOOL, "compressed", &state->compressed, + OPTIONAL | STRDUP, "preprocess", &state->preproc_options); + state->string = g_string_new (""); + return; + } + } + + if (container) + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Element <%s> not allowed inside <%s>"), + element_name, container); + else + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Element <%s> not allowed at toplevel"), element_name); + +} + +static GvdbItem * +get_parent (GHashTable *table, + gchar *key, + gint length) +{ + GvdbItem *grandparent, *parent; + + if (length == 1) + return NULL; + + while (key[--length - 1] != '/'); + key[length] = '\0'; + + parent = g_hash_table_lookup (table, key); + + if (parent == NULL) + { + parent = gvdb_hash_table_insert (table, key); + + grandparent = get_parent (table, key, length); + + if (grandparent != NULL) + gvdb_item_set_parent (parent, grandparent); + } + + return parent; +} + +static gchar * +find_file (const gchar *filename) +{ + guint i; + gchar *real_file; + gboolean exists; + + if (g_path_is_absolute (filename)) + return g_strdup (filename); + + /* search all the sourcedirs for the correct files in order */ + for (i = 0; sourcedirs[i] != NULL; i++) + { + real_file = g_build_filename (sourcedirs[i], filename, NULL); + exists = g_file_test (real_file, G_FILE_TEST_EXISTS); + if (exists) + return real_file; + g_free (real_file); + } + return NULL; +} + +static void +end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + GError *my_error = NULL; + + if (strcmp (element_name, "gresource") == 0) + { + g_free (state->prefix); + state->prefix = NULL; + } + + else if (strcmp (element_name, "file") == 0) + { + gchar *file, *real_file; + gchar *key; + FileData *data; + char *tmp_file = NULL; + char *tmp_file2 = NULL; + + file = state->string->str; + key = file; + if (state->alias) + key = state->alias; + + if (state->prefix) + key = g_build_path ("/", "/", state->prefix, key, NULL); + else + key = g_build_path ("/", "/", key, NULL); + + if (g_hash_table_lookup (state->table, key) != NULL) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("File %s appears multiple times in the resource"), + key); + return; + } + + data = g_new0 (FileData, 1); + + if (sourcedirs != NULL) + { + real_file = find_file (file); + if (real_file == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Failed to locate '%s' in any source directory"), file); + return; + } + } + else + { + gboolean exists; + exists = g_file_test (file, G_FILE_TEST_EXISTS); + if (!exists) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Failed to locate '%s' in current directory"), file); + return; + } + real_file = g_strdup (file); + } + + data->filename = g_strdup (real_file); + if (!state->collect_data) + goto done; + + if (state->preproc_options) + { + gchar **options; + guint i; + gboolean xml_stripblanks = FALSE; + gboolean to_pixdata = FALSE; + + options = g_strsplit (state->preproc_options, ",", -1); + + for (i = 0; options[i]; i++) + { + if (!strcmp (options[i], "xml-stripblanks")) + xml_stripblanks = TRUE; + else if (!strcmp (options[i], "to-pixdata")) + to_pixdata = TRUE; + else + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("Unknown processing option \"%s\""), options[i]); + g_strfreev (options); + goto cleanup; + } + } + g_strfreev (options); + + if (xml_stripblanks && xmllint != NULL) + { + gchar *argv[8]; + int status, fd, argc; + gchar *stderr_child = NULL; + + tmp_file = g_strdup ("resource-XXXXXXXX"); + if ((fd = g_mkstemp (tmp_file)) == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Failed to create temp file: %s"), + g_strerror (errsv)); + g_free (tmp_file); + tmp_file = NULL; + goto cleanup; + } + close (fd); + + argc = 0; + argv[argc++] = (gchar *) xmllint; + argv[argc++] = "--nonet"; + argv[argc++] = "--noblanks"; + argv[argc++] = "--output"; + argv[argc++] = tmp_file; + argv[argc++] = real_file; + argv[argc++] = NULL; + g_assert (argc <= G_N_ELEMENTS (argv)); + + if (!g_spawn_sync (NULL /* cwd */, argv, NULL /* envv */, + G_SPAWN_STDOUT_TO_DEV_NULL, + NULL, NULL, NULL, &stderr_child, &status, &my_error)) + { + g_propagate_error (error, my_error); + goto cleanup; + } + + /* Ugly...we shoud probably just let stderr be inherited */ + if (!g_spawn_check_exit_status (status, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Error processing input file with xmllint:\n%s"), stderr_child); + g_free (stderr_child); + goto cleanup; + } + + g_free (stderr_child); + g_free (real_file); + real_file = g_strdup (tmp_file); + } + + if (to_pixdata) + { + gchar *argv[4]; + gchar *stderr_child = NULL; + int status, fd, argc; + + if (gdk_pixbuf_pixdata == NULL) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "to-pixbuf preprocessing requested but GDK_PIXBUF_PIXDATA " + "not set and gdk-pixbuf-pixdata not found in path"); + goto cleanup; + } + + tmp_file2 = g_strdup ("resource-XXXXXXXX"); + if ((fd = g_mkstemp (tmp_file2)) == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Failed to create temp file: %s"), + g_strerror (errsv)); + g_free (tmp_file2); + tmp_file2 = NULL; + goto cleanup; + } + close (fd); + + argc = 0; + argv[argc++] = (gchar *) gdk_pixbuf_pixdata; + argv[argc++] = real_file; + argv[argc++] = tmp_file2; + argv[argc++] = NULL; + g_assert (argc <= G_N_ELEMENTS (argv)); + + if (!g_spawn_sync (NULL /* cwd */, argv, NULL /* envv */, + G_SPAWN_STDOUT_TO_DEV_NULL, + NULL, NULL, NULL, &stderr_child, &status, &my_error)) + { + g_propagate_error (error, my_error); + goto cleanup; + } + + if (!g_spawn_check_exit_status (status, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Error processing input file with to-pixdata:\n%s"), stderr_child); + g_free (stderr_child); + goto cleanup; + } + + g_free (stderr_child); + g_free (real_file); + real_file = g_strdup (tmp_file2); + } + } + + if (!g_file_get_contents (real_file, &data->content, &data->size, &my_error)) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("Error reading file %s: %s"), + real_file, my_error->message); + g_clear_error (&my_error); + goto cleanup; + } + /* Include zero termination in content_size for uncompressed files (but not in size) */ + data->content_size = data->size + 1; + + if (state->compressed) + { + GOutputStream *out = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + GZlibCompressor *compressor = + g_zlib_compressor_new (G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 9); + GOutputStream *out2 = g_converter_output_stream_new (out, G_CONVERTER (compressor)); + + if (!g_output_stream_write_all (out2, data->content, data->size, + NULL, NULL, NULL) || + !g_output_stream_close (out2, NULL, NULL)) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("Error compressing file %s"), + real_file); + goto cleanup; + } + + g_free (data->content); + data->content_size = g_memory_output_stream_get_size (G_MEMORY_OUTPUT_STREAM (out)); + data->content = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (out)); + + g_object_unref (compressor); + g_object_unref (out); + g_object_unref (out2); + + data->flags |= G_RESOURCE_FLAGS_COMPRESSED; + } + + done: + + g_hash_table_insert (state->table, key, data); + + cleanup: + /* Cleanup */ + + g_free (state->alias); + state->alias = NULL; + g_string_free (state->string, TRUE); + state->string = NULL; + g_free (state->preproc_options); + state->preproc_options = NULL; + + g_free (real_file); + + if (tmp_file) + { + unlink (tmp_file); + g_free (tmp_file); + } + + if (tmp_file2) + { + unlink (tmp_file2); + g_free (tmp_file2); + } + } +} + +static void +text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + gsize i; + + for (i = 0; i < text_len; i++) + if (!g_ascii_isspace (text[i])) + { + if (state->string) + g_string_append_len (state->string, text, text_len); + + else + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("text may not appear inside <%s>"), + g_markup_parse_context_get_element (context)); + + break; + } +} + +static GHashTable * +parse_resource_file (const gchar *filename, + gboolean collect_data) +{ + GMarkupParser parser = { start_element, end_element, text }; + ParseState state = { 0, }; + GMarkupParseContext *context; + GError *error = NULL; + gchar *contents; + GHashTable *table = NULL; + gsize size; + + if (!g_file_get_contents (filename, &contents, &size, &error)) + { + g_printerr ("%s\n", error->message); + g_clear_error (&error); + return NULL; + } + + state.table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)file_data_free); + state.collect_data = collect_data; + + context = g_markup_parse_context_new (&parser, + G_MARKUP_TREAT_CDATA_AS_TEXT | + G_MARKUP_PREFIX_ERROR_POSITION, + &state, NULL); + + if (!g_markup_parse_context_parse (context, contents, size, &error) || + !g_markup_parse_context_end_parse (context, &error)) + { + g_printerr ("%s: %s.\n", filename, error->message); + g_clear_error (&error); + } + else if (collect_data) + { + GHashTableIter iter; + const char *key; + char *mykey; + gsize key_len; + FileData *data; + GVariant *v_data; + GVariantBuilder builder; + GvdbItem *item; + + table = gvdb_hash_table_new (NULL, NULL); + + g_hash_table_iter_init (&iter, state.table); + while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&data)) + { + key_len = strlen (key); + mykey = g_strdup (key); + + item = gvdb_hash_table_insert (table, key); + gvdb_item_set_parent (item, + get_parent (table, mykey, key_len)); + + g_free (mykey); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(uuay)")); + + g_variant_builder_add (&builder, "u", data->size); /* Size */ + g_variant_builder_add (&builder, "u", data->flags); /* Flags */ + + v_data = g_variant_new_from_data (G_VARIANT_TYPE("ay"), + data->content, data->content_size, TRUE, + g_free, data->content); + g_variant_builder_add_value (&builder, v_data); + data->content = NULL; /* Take ownership */ + + gvdb_item_set_value (item, + g_variant_builder_end (&builder)); + } + } + else + { + table = g_hash_table_ref (state.table); + } + + g_hash_table_unref (state.table); + g_markup_parse_context_free (context); + g_free (contents); + + return table; +} + +static gboolean +write_to_file (GHashTable *table, + const gchar *filename, + GError **error) +{ + gboolean success; + + success = gvdb_table_write_contents (table, filename, + G_BYTE_ORDER != G_LITTLE_ENDIAN, + error); + + return success; +} + +int +main (int argc, char **argv) +{ + GError *error; + GHashTable *table; + gchar *srcfile; + gchar *target = NULL; + gchar *binary_target = NULL; + gboolean generate_automatic = FALSE; + gboolean generate_source = FALSE; + gboolean generate_header = FALSE; + gboolean manual_register = FALSE; + gboolean internal = FALSE; + gboolean generate_dependencies = FALSE; + char *c_name = NULL; + char *c_name_no_underscores; + const char *linkage = "extern"; + GOptionContext *context; + GOptionEntry entries[] = { + { "target", 0, 0, G_OPTION_ARG_FILENAME, &target, N_("name of the output file"), N_("FILE") }, + { "sourcedir", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &sourcedirs, N_("The directories where files are to be read from (default to current directory)"), N_("DIRECTORY") }, + { "generate", 0, 0, G_OPTION_ARG_NONE, &generate_automatic, N_("Generate output in the format selected for by the target filename extension"), NULL }, + { "generate-header", 0, 0, G_OPTION_ARG_NONE, &generate_header, N_("Generate source header"), NULL }, + { "generate-source", 0, 0, G_OPTION_ARG_NONE, &generate_source, N_("Generate sourcecode used to link in the resource file into your code"), NULL }, + { "generate-dependencies", 0, 0, G_OPTION_ARG_NONE, &generate_dependencies, N_("Generate dependency list"), NULL }, + { "manual-register", 0, 0, G_OPTION_ARG_NONE, &manual_register, N_("Don't automatically create and register resource"), NULL }, + { "internal", 0, 0, G_OPTION_ARG_NONE, &internal, N_("Don't export functions; declare them G_GNUC_INTERNAL"), NULL }, + { "c-name", 0, 0, G_OPTION_ARG_STRING, &c_name, N_("C identifier name used for the generated source code"), NULL }, + { NULL } + }; + +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + 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 + + context = g_option_context_new (N_("FILE")); + g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); + g_option_context_set_summary (context, + N_("Compile a resource specification into a resource file.\n" + "Resource specification files have the extension .gresource.xml,\n" + "and the resource file have the extension called .gresource.")); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + + error = NULL; + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s\n", error->message); + return 1; + } + + g_option_context_free (context); + + if (argc != 2) + { + g_printerr (_("You should give exactly one file name\n")); + return 1; + } + + if (internal) + linkage = "G_GNUC_INTERNAL"; + + srcfile = argv[1]; + + xmllint = g_strdup (g_getenv ("XMLLINT")); + if (xmllint == NULL) + xmllint = g_find_program_in_path ("xmllint"); + if (xmllint == NULL) + g_printerr ("XMLLINT not set and xmllint not found in path; skipping xml preprocessing.\n"); + + gdk_pixbuf_pixdata = g_strdup (g_getenv ("GDK_PIXBUF_PIXDATA")); + if (gdk_pixbuf_pixdata == NULL) + gdk_pixbuf_pixdata = g_find_program_in_path ("gdk-pixbuf-pixdata"); + + if (target == NULL) + { + char *dirname = g_path_get_dirname (srcfile); + char *base = g_path_get_basename (srcfile); + char *target_basename; + if (g_str_has_suffix (base, ".xml")) + base[strlen(base) - strlen (".xml")] = 0; + + if (generate_source) + { + if (g_str_has_suffix (base, ".gresource")) + base[strlen(base) - strlen (".gresource")] = 0; + target_basename = g_strconcat (base, ".c", NULL); + } + else + { + if (g_str_has_suffix (base, ".gresource")) + target_basename = g_strdup (base); + else + target_basename = g_strconcat (base, ".gresource", NULL); + } + + target = g_build_filename (dirname, target_basename, NULL); + g_free (target_basename); + g_free (dirname); + g_free (base); + } + else if (generate_automatic) + { + if (g_str_has_suffix (target, ".c")) + generate_source = TRUE; + else if (g_str_has_suffix (target, ".h")) + generate_header = TRUE; + else if (g_str_has_suffix (target, ".gresource")) + ; + } + + if ((table = parse_resource_file (srcfile, !generate_dependencies)) == NULL) + { + g_free (target); + return 1; + } + + if (generate_dependencies) + { + GHashTableIter iter; + gpointer key, data; + FileData *file_data; + + g_hash_table_iter_init (&iter, table); + while (g_hash_table_iter_next (&iter, &key, &data)) + { + file_data = data; + g_print ("%s\n",file_data->filename); + } + } + else if (generate_source || generate_header) + { + if (generate_source) + { + int fd = g_file_open_tmp (NULL, &binary_target, NULL); + if (fd == -1) + { + g_printerr ("Can't open temp file\n"); + return 1; + } + close (fd); + } + + if (c_name == NULL) + { + char *base = g_path_get_basename (srcfile); + GString *s; + char *dot; + int i; + + /* Remove extensions */ + dot = strchr (base, '.'); + if (dot) + *dot = 0; + + s = g_string_new (""); + + for (i = 0; base[i] != 0; i++) + { + const char *first = G_CSET_A_2_Z G_CSET_a_2_z "_"; + const char *rest = G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "_"; + if (strchr ((i == 0) ? first : rest, base[i]) != NULL) + g_string_append_c (s, base[i]); + else if (base[i] == '-') + g_string_append_c (s, '_'); + + } + + c_name = g_string_free (s, FALSE); + } + } + else + binary_target = g_strdup (target); + + c_name_no_underscores = c_name; + while (c_name_no_underscores && *c_name_no_underscores == '_') + c_name_no_underscores++; + + if (binary_target != NULL && + !write_to_file (table, binary_target, &error)) + { + g_printerr ("%s\n", error->message); + g_free (target); + return 1; + } + + if (generate_header) + { + FILE *file; + + file = fopen (target, "w"); + if (file == NULL) + { + g_printerr ("can't write to file %s", target); + return 1; + } + + fprintf (file, + "#ifndef __RESOURCE_%s_H__\n" + "#define __RESOURCE_%s_H__\n" + "\n" + "#include \n" + "\n" + "%s GResource *%s_get_resource (void);\n", + c_name, c_name, linkage, c_name); + + if (manual_register) + fprintf (file, + "\n" + "%s void %s_register_resource (void);\n" + "%s void %s_unregister_resource (void);\n" + "\n", + linkage, c_name, linkage, c_name); + + fprintf (file, + "#endif\n"); + + fclose (file); + } + else if (generate_source) + { + FILE *file; + guint8 *data; + gsize data_size; + gsize i; + + if (!g_file_get_contents (binary_target, (char **)&data, + &data_size, NULL)) + { + g_printerr ("can't read back temporary file"); + return 1; + } + g_unlink (binary_target); + + file = fopen (target, "w"); + if (file == NULL) + { + g_printerr ("can't write to file %s", target); + return 1; + } + + fprintf (file, + "#include \n" + "\n" + "#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))\n" + "# define SECTION __attribute__ ((section (\".gresource.%s\"), aligned (8)))\n" + "#else\n" + "# define SECTION\n" + "#endif\n" + "\n" + "static const SECTION union { const guint8 data[%"G_GSIZE_FORMAT"]; const double alignment; void * const ptr;} %s_resource_data = { {\n", + c_name_no_underscores, data_size, c_name); + + for (i = 0; i < data_size; i++) { + if (i % 8 == 0) + fprintf (file, " "); + fprintf (file, "0x%2.2x", (int)data[i]); + if (i != data_size - 1) + fprintf (file, ", "); + if ((i % 8 == 7) || (i == data_size - 1)) + fprintf (file, "\n"); + } + + fprintf (file, "} };\n"); + + fprintf (file, + "\n" + "static GStaticResource static_resource = { %s_resource_data.data, sizeof (%s_resource_data.data), NULL, NULL, NULL };\n" + "%s GResource *%s_get_resource (void);\n" + "GResource *%s_get_resource (void)\n" + "{\n" + " return g_static_resource_get_resource (&static_resource);\n" + "}\n", + c_name, c_name, linkage, c_name, c_name); + + + if (manual_register) + { + fprintf (file, + "\n" + "%s void %s_unregister_resource (void);\n" + "void %s_unregister_resource (void)\n" + "{\n" + " g_static_resource_fini (&static_resource);\n" + "}\n" + "\n" + "%s void %s_register_resource (void);\n" + "void %s_register_resource (void)\n" + "{\n" + " g_static_resource_init (&static_resource);\n" + "}\n", + linkage, c_name, c_name, linkage, c_name, c_name); + } + else + { + fprintf (file, "%s", gconstructor_code); + fprintf (file, + "\n" + "#ifdef G_HAS_CONSTRUCTORS\n" + "\n" + "#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA\n" + "#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(resource_constructor)\n" + "#endif\n" + "G_DEFINE_CONSTRUCTOR(resource_constructor)\n" + "#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA\n" + "#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(resource_destructor)\n" + "#endif\n" + "G_DEFINE_DESTRUCTOR(resource_destructor)\n" + "\n" + "#else\n" + "#warning \"Constructor not supported on this compiler, linking in resources will not work\"\n" + "#endif\n" + "\n" + "static void resource_constructor (void)\n" + "{\n" + " g_static_resource_init (&static_resource);\n" + "}\n" + "\n" + "static void resource_destructor (void)\n" + "{\n" + " g_static_resource_fini (&static_resource);\n" + "}\n"); + } + + fclose (file); + + g_free (data); + } + + g_free (binary_target); + g_free (target); + g_hash_table_destroy (table); + g_free (xmllint); + + return 0; +} diff --git a/gio/glib-compile-schemas.c b/gio/glib-compile-schemas.c new file mode 100644 index 0000000..41c5b76 --- /dev/null +++ b/gio/glib-compile-schemas.c @@ -0,0 +1,2133 @@ +/* + * 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 + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "gvdb/gvdb-builder.h" +#include "strinfo.c" + +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + +static void +strip_string (GString *string) +{ + gint i; + + for (i = 0; g_ascii_isspace (string->str[i]); i++); + g_string_erase (string, 0, i); + + if (string->len > 0) + { + /* len > 0, so there must be at least one non-whitespace character */ + for (i = string->len - 1; g_ascii_isspace (string->str[i]); i--); + g_string_truncate (string, i + 1); + } +} + +/* Handling of {{{1 */ +typedef struct +{ + GString *strinfo; + + gboolean is_flags; +} EnumState; + +static void +enum_state_free (gpointer data) +{ + EnumState *state = data; + + g_string_free (state->strinfo, TRUE); + g_slice_free (EnumState, state); +} + +static EnumState * +enum_state_new (gboolean is_flags) +{ + EnumState *state; + + state = g_slice_new (EnumState); + state->strinfo = g_string_new (NULL); + state->is_flags = is_flags; + + return state; +} + +static void +enum_state_add_value (EnumState *state, + const gchar *nick, + const gchar *valuestr, + GError **error) +{ + gint64 value; + gchar *end; + + if (nick[0] == '\0' || nick[1] == '\0') + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "nick must be a minimum of 2 characters"); + return; + } + + value = g_ascii_strtoll (valuestr, &end, 0); + if (*end || state->is_flags ? + (value > G_MAXUINT32 || value < 0) : + (value > G_MAXINT32 || value < G_MININT32)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "invalid numeric value"); + return; + } + + if (strinfo_builder_contains (state->strinfo, nick)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already specified", nick); + return; + } + + if (strinfo_builder_contains_value (state->strinfo, value)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "value='%s' already specified", valuestr); + return; + } + + /* Silently drop the null case if it is mentioned. + * It is properly denoted with an empty array. + */ + if (state->is_flags && value == 0) + return; + + if (state->is_flags && (value & (value - 1))) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "flags values must have at most 1 bit set"); + return; + } + + /* Since we reject exact duplicates of value='' and we only allow one + * bit to be set, it's not possible to have overlaps. + * + * If we loosen the one-bit-set restriction we need an overlap check. + */ + + strinfo_builder_append_item (state->strinfo, nick, value); +} + +static void +enum_state_end (EnumState **state_ptr, + GError **error) +{ + EnumState *state; + + state = *state_ptr; + *state_ptr = NULL; + + if (state->strinfo->len == 0) + g_set_error (error, + G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "<%s> must contain at least one ", + state->is_flags ? "flags" : "enum"); +} + +/* Handling of {{{1 */ +typedef struct +{ + /* for , @child_schema will be set. + * for , everything else will be set. + */ + gchar *child_schema; + + + GVariantType *type; + gboolean have_gettext_domain; + + gchar l10n; + gchar *l10n_context; + GString *unparsed_default_value; + GVariant *default_value; + + GString *strinfo; + gboolean is_enum; + gboolean is_flags; + + GVariant *minimum; + GVariant *maximum; + + gboolean has_choices; + gboolean has_aliases; + gboolean is_override; + + gboolean checked; + GVariant *serialised; +} KeyState; + +static KeyState * +key_state_new (const gchar *type_string, + const gchar *gettext_domain, + gboolean is_enum, + gboolean is_flags, + GString *strinfo) +{ + KeyState *state; + + state = g_slice_new0 (KeyState); + state->type = g_variant_type_new (type_string); + state->have_gettext_domain = gettext_domain != NULL; + state->is_enum = is_enum; + state->is_flags = is_flags; + + if (strinfo) + state->strinfo = g_string_new_len (strinfo->str, strinfo->len); + else + state->strinfo = g_string_new (NULL); + + return state; +} + +static KeyState * +key_state_override (KeyState *state, + const gchar *gettext_domain) +{ + KeyState *copy; + + copy = g_slice_new0 (KeyState); + copy->type = g_variant_type_copy (state->type); + copy->have_gettext_domain = gettext_domain != NULL; + copy->strinfo = g_string_new_len (state->strinfo->str, + state->strinfo->len); + copy->is_enum = state->is_enum; + copy->is_flags = state->is_flags; + copy->is_override = TRUE; + + if (state->minimum) + { + copy->minimum = g_variant_ref (state->minimum); + copy->maximum = g_variant_ref (state->maximum); + } + + return copy; +} + +static KeyState * +key_state_new_child (const gchar *child_schema) +{ + KeyState *state; + + state = g_slice_new0 (KeyState); + state->child_schema = g_strdup (child_schema); + + return state; +} + +static gboolean +is_valid_choices (GVariant *variant, + GString *strinfo) +{ + switch (g_variant_classify (variant)) + { + case G_VARIANT_CLASS_MAYBE: + case G_VARIANT_CLASS_ARRAY: + { + gboolean valid = TRUE; + GVariantIter iter; + + g_variant_iter_init (&iter, variant); + + while (valid && (variant = g_variant_iter_next_value (&iter))) + { + valid = is_valid_choices (variant, strinfo); + g_variant_unref (variant); + } + + return valid; + } + + case G_VARIANT_CLASS_STRING: + return strinfo_is_string_valid ((const guint32 *) strinfo->str, + strinfo->len / 4, + g_variant_get_string (variant, NULL)); + + default: + g_assert_not_reached (); + } +} + + +/* Gets called at or to check for + * validity of the default value so that any inconsistency is + * reported as soon as it is encountered. + */ +static void +key_state_check_range (KeyState *state, + GError **error) +{ + if (state->default_value) + { + const gchar *tag; + + tag = state->is_override ? "override" : "default"; + + if (state->minimum) + { + if (g_variant_compare (state->default_value, state->minimum) < 0 || + g_variant_compare (state->default_value, state->maximum) > 0) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "<%s> is not contained in " + "the specified range", tag); + } + } + + else if (state->strinfo->len) + { + if (!is_valid_choices (state->default_value, state->strinfo)) + { + if (state->is_enum) + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "<%s> is not a valid member of " + "the specified enumerated type", tag); + + else if (state->is_flags) + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "<%s> contains string not in the " + "specified flags type", tag); + + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "<%s> contains string not in " + "", tag); + } + } + } +} + +static void +key_state_set_range (KeyState *state, + const gchar *min_str, + const gchar *max_str, + GError **error) +{ + const struct { + const gchar type; + const gchar *min; + const gchar *max; + } table[] = { + { 'y', "0", "255" }, + { 'n', "-32768", "32767" }, + { 'q', "0", "65535" }, + { 'i', "-2147483648", "2147483647" }, + { 'u', "0", "4294967295" }, + { 'x', "-9223372036854775808", "9223372036854775807" }, + { 't', "0", "18446744073709551615" }, + { 'd', "-inf", "inf" }, + }; + gboolean type_ok = FALSE; + gint i; + + if (state->minimum) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already specified for this key"); + return; + } + + for (i = 0; i < G_N_ELEMENTS (table); i++) + if (*(char *) state->type == table[i].type) + { + min_str = min_str ? min_str : table[i].min; + max_str = max_str ? max_str : table[i].max; + type_ok = TRUE; + break; + } + + if (!type_ok) + { + gchar *type = g_variant_type_dup_string (state->type); + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " not allowed for keys of type '%s'", type); + g_free (type); + return; + } + + state->minimum = g_variant_parse (state->type, min_str, NULL, NULL, error); + if (state->minimum == NULL) + return; + + state->maximum = g_variant_parse (state->type, max_str, NULL, NULL, error); + if (state->maximum == NULL) + return; + + if (g_variant_compare (state->minimum, state->maximum) > 0) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " specified minimum is greater than maxmimum"); + return; + } + + key_state_check_range (state, error); +} + +static GString * +key_state_start_default (KeyState *state, + const gchar *l10n, + const gchar *context, + GError **error) +{ + if (l10n != NULL) + { + if (strcmp (l10n, "messages") == 0) + state->l10n = 'm'; + + else if (strcmp (l10n, "time") == 0) + state->l10n = 't'; + + else + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "unsupported l10n category: %s", l10n); + return NULL; + } + + if (!state->have_gettext_domain) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "l10n requested, but no " + "gettext domain given"); + return NULL; + } + + state->l10n_context = g_strdup (context); + } + + else if (context != NULL) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "translation context given for " + " value without l10n enabled"); + return NULL; + } + + return g_string_new (NULL); +} + +static void +key_state_end_default (KeyState *state, + GString **string, + GError **error) +{ + state->unparsed_default_value = *string; + *string = NULL; + + state->default_value = g_variant_parse (state->type, + state->unparsed_default_value->str, + NULL, NULL, error); + key_state_check_range (state, error); +} + +static void +key_state_start_choices (KeyState *state, + GError **error) +{ + const GVariantType *type = state->type; + + if (state->is_enum) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " cannot be specified for keys " + "tagged as having an enumerated type"); + return; + } + + if (state->has_choices) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already specified for this key"); + return; + } + + while (g_variant_type_is_maybe (type) || g_variant_type_is_array (type)) + type = g_variant_type_element (type); + + if (!g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) + { + gchar *type_string = g_variant_type_dup_string (state->type); + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " not allowed for keys of type '%s'", + type_string); + g_free (type_string); + return; + } +} + +static void +key_state_add_choice (KeyState *state, + const gchar *choice, + GError **error) +{ + if (strinfo_builder_contains (state->strinfo, choice)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already given", choice); + return; + } + + strinfo_builder_append_item (state->strinfo, choice, 0); + state->has_choices = TRUE; +} + +static void +key_state_end_choices (KeyState *state, + GError **error) +{ + if (!state->has_choices) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + " must contain at least one "); + return; + } + + key_state_check_range (state, error); +} + +static void +key_state_start_aliases (KeyState *state, + GError **error) +{ + if (state->has_aliases) + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already specified for this key"); + else if (!state->is_flags && !state->is_enum && !state->has_choices) + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " can only be specified for keys with " + "enumerated or flags types or after "); +} + +static void +key_state_add_alias (KeyState *state, + const gchar *alias, + const gchar *target, + GError **error) +{ + if (strinfo_builder_contains (state->strinfo, alias)) + { + if (strinfo_is_string_valid ((guint32 *) state->strinfo->str, + state->strinfo->len / 4, + alias)) + { + if (state->is_enum) + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " given when '%s' is already " + "a member of the enumerated type", alias, alias); + + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " given when " + " was already given", + alias, alias); + } + + else + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " already specified", alias); + + return; + } + + if (!strinfo_builder_append_alias (state->strinfo, alias, target)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "alias target '%s' is not in %s", target, + state->is_enum ? "enumerated type" : ""); + return; + } + + state->has_aliases = TRUE; +} + +static void +key_state_end_aliases (KeyState *state, + GError **error) +{ + if (!state->has_aliases) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + " must contain at least one "); + return; + } +} + +static gboolean +key_state_check (KeyState *state, + GError **error) +{ + if (state->checked) + return TRUE; + + return state->checked = TRUE; +} + +static GVariant * +key_state_serialise (KeyState *state) +{ + if (state->serialised == NULL) + { + if (state->child_schema) + { + state->serialised = g_variant_new_string (state->child_schema); + } + + else + { + GVariantBuilder builder; + + g_assert (key_state_check (state, NULL)); + + g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); + + /* default value */ + g_variant_builder_add_value (&builder, state->default_value); + + /* translation */ + if (state->l10n) + { + /* We are going to store the untranslated default for + * runtime translation according to the current locale. + * We need to strip leading and trailing whitespace from + * the string so that it's exactly the same as the one + * that ended up in the .po file for translation. + * + * We want to do this so that + * + * + * ['a', 'b', 'c'] + * + * + * ends up in the .po file like "['a', 'b', 'c']", + * omitting the extra whitespace at the start and end. + */ + strip_string (state->unparsed_default_value); + + if (state->l10n_context) + { + gint len; + + /* Contextified messages are supported by prepending + * the context, followed by '\004' to the start of the + * message string. We do that here to save GSettings + * the work later on. + */ + len = strlen (state->l10n_context); + state->l10n_context[len] = '\004'; + g_string_prepend_len (state->unparsed_default_value, + state->l10n_context, len + 1); + g_free (state->l10n_context); + state->l10n_context = NULL; + } + + g_variant_builder_add (&builder, "(y(y&s))", 'l', state->l10n, + state->unparsed_default_value->str); + g_string_free (state->unparsed_default_value, TRUE); + state->unparsed_default_value = NULL; + } + + /* choice, aliases, enums */ + if (state->strinfo->len) + { + GVariant *array; + guint32 *words; + gpointer data; + gsize size; + gint i; + + data = state->strinfo->str; + size = state->strinfo->len; + + words = data; + for (i = 0; i < size / sizeof (guint32); i++) + words[i] = GUINT32_TO_LE (words[i]); + + array = g_variant_new_from_data (G_VARIANT_TYPE ("au"), + data, size, TRUE, + g_free, data); + + g_string_free (state->strinfo, FALSE); + state->strinfo = NULL; + + g_variant_builder_add (&builder, "(y@au)", + state->is_flags ? 'f' : + state->is_enum ? 'e' : 'c', + array); + } + + /* range */ + if (state->minimum || state->maximum) + g_variant_builder_add (&builder, "(y(**))", 'r', + state->minimum, state->maximum); + + state->serialised = g_variant_builder_end (&builder); + } + + g_variant_ref_sink (state->serialised); + } + + return g_variant_ref (state->serialised); +} + +static void +key_state_free (gpointer data) +{ + KeyState *state = data; + + if (state->type) + g_variant_type_free (state->type); + + g_free (state->l10n_context); + + if (state->unparsed_default_value) + g_string_free (state->unparsed_default_value, TRUE); + + if (state->default_value) + g_variant_unref (state->default_value); + + if (state->strinfo) + g_string_free (state->strinfo, TRUE); + + if (state->minimum) + g_variant_unref (state->minimum); + + if (state->maximum) + g_variant_unref (state->maximum); + + if (state->serialised) + g_variant_unref (state->serialised); + + g_slice_free (KeyState, state); +} + +/* Key name validity {{{1 */ +static gboolean allow_any_name = FALSE; + +static gboolean +is_valid_keyname (const gchar *key, + GError **error) +{ + gint i; + + if (key[0] == '\0') + { + g_set_error_literal (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("empty names are not permitted")); + return FALSE; + } + + if (allow_any_name) + return TRUE; + + if (!g_ascii_islower (key[0])) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid name '%s': names must begin " + "with a lowercase letter"), key); + return FALSE; + } + + for (i = 1; key[i]; i++) + { + if (key[i] != '-' && + !g_ascii_islower (key[i]) && + !g_ascii_isdigit (key[i])) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid name '%s': invalid character '%c'; " + "only lowercase letters, numbers and hyphen ('-') " + "are permitted."), key, key[i]); + return FALSE; + } + + if (key[i] == '-' && key[i + 1] == '-') + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid name '%s': two successive hyphens ('--') " + "are not permitted."), key); + return FALSE; + } + } + + if (key[i - 1] == '-') + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid name '%s': the last character may not be a " + "hyphen ('-')."), key); + return FALSE; + } + + if (i > 1024) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid name '%s': maximum length is 1024"), key); + return FALSE; + } + + return TRUE; +} + +/* Handling of {{{1 */ +typedef struct _SchemaState SchemaState; +struct _SchemaState +{ + SchemaState *extends; + + gchar *path; + gchar *gettext_domain; + gchar *extends_name; + gchar *list_of; + + GHashTable *keys; +}; + +static SchemaState * +schema_state_new (const gchar *path, + const gchar *gettext_domain, + SchemaState *extends, + const gchar *extends_name, + const gchar *list_of) +{ + SchemaState *state; + + state = g_slice_new (SchemaState); + state->path = g_strdup (path); + state->gettext_domain = g_strdup (gettext_domain); + state->extends = extends; + state->extends_name = g_strdup (extends_name); + state->list_of = g_strdup (list_of); + state->keys = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, key_state_free); + + return state; +} + +static void +schema_state_free (gpointer data) +{ + SchemaState *state = data; + + g_free (state->path); + g_free (state->gettext_domain); + g_hash_table_unref (state->keys); +} + +static void +schema_state_add_child (SchemaState *state, + const gchar *name, + const gchar *schema, + GError **error) +{ + gchar *childname; + + if (!is_valid_keyname (name, error)) + return; + + childname = g_strconcat (name, "/", NULL); + + if (g_hash_table_lookup (state->keys, childname)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" already specified"), name); + return; + } + + g_hash_table_insert (state->keys, childname, + key_state_new_child (schema)); +} + +static KeyState * +schema_state_add_key (SchemaState *state, + GHashTable *enum_table, + GHashTable *flags_table, + const gchar *name, + const gchar *type_string, + const gchar *enum_type, + const gchar *flags_type, + GError **error) +{ + SchemaState *node; + GString *strinfo; + KeyState *key; + + if (state->list_of) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("cannot add keys to a 'list-of' schema")); + return NULL; + } + + if (!is_valid_keyname (name, error)) + return NULL; + + if (g_hash_table_lookup (state->keys, name)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" already specified"), name); + return NULL; + } + + for (node = state; node; node = node->extends) + if (node->extends) + { + KeyState *shadow; + + shadow = g_hash_table_lookup (node->extends->keys, name); + + /* in case of make sure we report the + * location of the original , not the . + */ + if (shadow && !shadow->is_override) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" shadows in " + "; use to modify value"), + name, name, node->extends_name); + return NULL; + } + } + + if ((type_string != NULL) + (enum_type != NULL) + (flags_type != NULL) != 1) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_MISSING_ATTRIBUTE, + _("exactly one of 'type', 'enum' or 'flags' must " + "be specified as an attribute to ")); + return NULL; + } + + if (type_string == NULL) /* flags or enums was specified */ + { + EnumState *enum_state; + + if (enum_type) + enum_state = g_hash_table_lookup (enum_table, enum_type); + else + enum_state = g_hash_table_lookup (flags_table, flags_type); + + + if (enum_state == NULL) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("<%s id='%s'> not (yet) defined."), + flags_type ? "flags" : "enum", + flags_type ? flags_type : enum_type); + return NULL; + } + + type_string = flags_type ? "as" : "s"; + strinfo = enum_state->strinfo; + } + else + { + if (!g_variant_type_string_is_valid (type_string)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("invalid GVariant type string '%s'"), type_string); + return NULL; + } + + strinfo = NULL; + } + + key = key_state_new (type_string, state->gettext_domain, + enum_type != NULL, flags_type != NULL, strinfo); + g_hash_table_insert (state->keys, g_strdup (name), key); + + return key; +} + +static void +schema_state_add_override (SchemaState *state, + KeyState **key_state, + GString **string, + const gchar *key, + const gchar *l10n, + const gchar *context, + GError **error) +{ + SchemaState *parent; + KeyState *original; + + if (state->extends == NULL) + { + g_set_error_literal (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" given but schema isn't " + "extending anything")); + return; + } + + for (parent = state->extends; parent; parent = parent->extends) + if ((original = g_hash_table_lookup (parent->keys, key))) + break; + + if (original == NULL) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("no to override"), key); + return; + } + + if (g_hash_table_lookup (state->keys, key)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" already specified"), key); + return; + } + + *key_state = key_state_override (original, state->gettext_domain); + *string = key_state_start_default (*key_state, l10n, context, error); + g_hash_table_insert (state->keys, g_strdup (key), *key_state); +} + +static void +override_state_end (KeyState **key_state, + GString **string, + GError **error) +{ + key_state_end_default (*key_state, string, error); + *key_state = NULL; +} + +/* Handling of toplevel state {{{1 */ +typedef struct +{ + GHashTable *schema_table; /* string -> SchemaState */ + GHashTable *flags_table; /* string -> EnumState */ + GHashTable *enum_table; /* string -> EnumState */ + + GSList *this_file_schemas; /* strings: s in this file */ + GSList *this_file_flagss; /* strings: s in this file */ + GSList *this_file_enums; /* strings: s in this file */ + + gchar *schemalist_domain; /* the gettext domain */ + + SchemaState *schema_state; /* non-NULL when inside */ + KeyState *key_state; /* non-NULL when inside */ + EnumState *enum_state; /* non-NULL when inside */ + + GString *string; /* non-NULL when accepting text */ +} ParseState; + +static gboolean +is_subclass (const gchar *class_name, + const gchar *possible_parent, + GHashTable *schema_table) +{ + SchemaState *class; + + if (strcmp (class_name, possible_parent) == 0) + return TRUE; + + class = g_hash_table_lookup (schema_table, class_name); + g_assert (class != NULL); + + return class->extends_name && + is_subclass (class->extends_name, possible_parent, schema_table); +} + +static void +parse_state_start_schema (ParseState *state, + const gchar *id, + const gchar *path, + const gchar *gettext_domain, + const gchar *extends_name, + const gchar *list_of, + GError **error) +{ + SchemaState *extends; + gchar *my_id; + + if (g_hash_table_lookup (state->schema_table, id)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" already specified"), id); + return; + } + + if (extends_name) + { + extends = g_hash_table_lookup (state->schema_table, extends_name); + + if (extends == NULL) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" extends not-yet-existing " + "schema '%s'"), id, extends_name); + return; + } + } + else + extends = NULL; + + if (list_of) + { + SchemaState *tmp; + + if (!(tmp = g_hash_table_lookup (state->schema_table, list_of))) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" is list of not-yet-existing " + "schema '%s'"), id, list_of); + return; + } + + if (tmp->path) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("Can not be a list of a schema with a path")); + return; + } + } + + if (extends) + { + if (extends->path) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("Can not extend a schema with a path")); + return; + } + + if (list_of) + { + if (extends->list_of == NULL) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" is a list, extending " + " which is not a list"), + id, extends_name); + return; + } + + if (!is_subclass (list_of, extends->list_of, state->schema_table)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _(" extends but '%s' does not " + "extend '%s'"), id, list_of, extends_name, + extends->list_of, list_of, extends->list_of); + return; + } + } + else + /* by default we are a list of the same thing that the schema + * we are extending is a list of (which might be nothing) + */ + list_of = extends->list_of; + } + + if (path && !(g_str_has_prefix (path, "/") && g_str_has_suffix (path, "/"))) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("a path, if given, must begin and end with a slash")); + return; + } + + if (path && list_of && !g_str_has_suffix (path, ":/")) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("the path of a list must end with ':/'")); + return; + } + + if (path && (g_str_has_prefix (path, "/apps/") || + g_str_has_prefix (path, "/desktop/") || + g_str_has_prefix (path, "/system/"))) + g_printerr ("warning: Schema '%s' has path '%s'. Paths starting with " + "'/apps/', '/desktop/' or '/system/' are deprecated.\n", id, path); + + state->schema_state = schema_state_new (path, gettext_domain, + extends, extends_name, list_of); + + my_id = g_strdup (id); + state->this_file_schemas = g_slist_prepend (state->this_file_schemas, my_id); + g_hash_table_insert (state->schema_table, my_id, state->schema_state); +} + +static void +parse_state_start_enum (ParseState *state, + const gchar *id, + gboolean is_flags, + GError **error) +{ + GSList **list = is_flags ? &state->this_file_flagss : &state->this_file_enums; + GHashTable *table = is_flags ? state->flags_table : state->enum_table; + gchar *my_id; + + if (g_hash_table_lookup (table, id)) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + _("<%s id='%s'> already specified"), + is_flags ? "flags" : "enum", id); + return; + } + + state->enum_state = enum_state_new (is_flags); + + my_id = g_strdup (id); + *list = g_slist_prepend (*list, my_id); + g_hash_table_insert (table, my_id, state->enum_state); +} + +/* GMarkup Parser Functions {{{1 */ + +/* Start element {{{2 */ +static void +start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + const GSList *element_stack; + const gchar *container; + + element_stack = g_markup_parse_context_get_element_stack (context); + container = element_stack->next ? element_stack->next->data : NULL; + +#define COLLECT(first, ...) \ + g_markup_collect_attributes (element_name, \ + attribute_names, attribute_values, error, \ + first, __VA_ARGS__, G_MARKUP_COLLECT_INVALID) +#define OPTIONAL G_MARKUP_COLLECT_OPTIONAL +#define STRDUP G_MARKUP_COLLECT_STRDUP +#define STRING G_MARKUP_COLLECT_STRING +#define NO_ATTRS() COLLECT (G_MARKUP_COLLECT_INVALID, NULL) + + /* Toplevel items {{{3 */ + if (container == NULL) + { + if (strcmp (element_name, "schemalist") == 0) + { + COLLECT (OPTIONAL | STRDUP, + "gettext-domain", + &state->schemalist_domain); + return; + } + } + + + /* children of {{{3 */ + else if (strcmp (container, "schemalist") == 0) + { + if (strcmp (element_name, "schema") == 0) + { + const gchar *id, *path, *gettext_domain, *extends, *list_of; + if (COLLECT (STRING, "id", &id, + OPTIONAL | STRING, "path", &path, + OPTIONAL | STRING, "gettext-domain", &gettext_domain, + OPTIONAL | STRING, "extends", &extends, + OPTIONAL | STRING, "list-of", &list_of)) + parse_state_start_schema (state, id, path, + gettext_domain ? gettext_domain + : state->schemalist_domain, + extends, list_of, error); + return; + } + + else if (strcmp (element_name, "enum") == 0) + { + const gchar *id; + if (COLLECT (STRING, "id", &id)) + parse_state_start_enum (state, id, FALSE, error); + return; + } + + else if (strcmp (element_name, "flags") == 0) + { + const gchar *id; + if (COLLECT (STRING, "id", &id)) + parse_state_start_enum (state, id, TRUE, error); + return; + } + } + + + /* children of {{{3 */ + else if (strcmp (container, "schema") == 0) + { + if (strcmp (element_name, "key") == 0) + { + const gchar *name, *type_string, *enum_type, *flags_type; + + if (COLLECT (STRING, "name", &name, + OPTIONAL | STRING, "type", &type_string, + OPTIONAL | STRING, "enum", &enum_type, + OPTIONAL | STRING, "flags", &flags_type)) + + state->key_state = schema_state_add_key (state->schema_state, + state->enum_table, + state->flags_table, + name, type_string, + enum_type, flags_type, + error); + return; + } + else if (strcmp (element_name, "child") == 0) + { + const gchar *name, *schema; + + if (COLLECT (STRING, "name", &name, STRING, "schema", &schema)) + schema_state_add_child (state->schema_state, + name, schema, error); + return; + } + else if (strcmp (element_name, "override") == 0) + { + const gchar *name, *l10n, *context; + + if (COLLECT (STRING, "name", &name, + OPTIONAL | STRING, "l10n", &l10n, + OPTIONAL | STRING, "context", &context)) + schema_state_add_override (state->schema_state, + &state->key_state, &state->string, + name, l10n, context, error); + return; + } + } + + /* children of {{{3 */ + else if (strcmp (container, "key") == 0) + { + if (strcmp (element_name, "default") == 0) + { + const gchar *l10n, *context; + if (COLLECT (STRING | OPTIONAL, "l10n", &l10n, + STRING | OPTIONAL, "context", &context)) + state->string = key_state_start_default (state->key_state, + l10n, context, error); + return; + } + + else if (strcmp (element_name, "summary") == 0 || + strcmp (element_name, "description") == 0) + { + if (NO_ATTRS ()) + state->string = g_string_new (NULL); + return; + } + + else if (strcmp (element_name, "range") == 0) + { + const gchar *min, *max; + if (COLLECT (STRING | OPTIONAL, "min", &min, + STRING | OPTIONAL, "max", &max)) + key_state_set_range (state->key_state, min, max, error); + return; + } + + else if (strcmp (element_name, "choices") == 0) + { + if (NO_ATTRS ()) + key_state_start_choices (state->key_state, error); + return; + } + + else if (strcmp (element_name, "aliases") == 0) + { + if (NO_ATTRS ()) + key_state_start_aliases (state->key_state, error); + return; + } + } + + + /* children of {{{3 */ + else if (strcmp (container, "choices") == 0) + { + if (strcmp (element_name, "choice") == 0) + { + const gchar *value; + if (COLLECT (STRING, "value", &value)) + key_state_add_choice (state->key_state, value, error); + return; + } + } + + + /* children of {{{3 */ + else if (strcmp (container, "aliases") == 0) + { + if (strcmp (element_name, "alias") == 0) + { + const gchar *value, *target; + if (COLLECT (STRING, "value", &value, STRING, "target", &target)) + key_state_add_alias (state->key_state, value, target, error); + return; + } + } + + + /* children of {{{3 */ + else if (strcmp (container, "enum") == 0 || + strcmp (container, "flags") == 0) + { + if (strcmp (element_name, "value") == 0) + { + const gchar *nick, *valuestr; + if (COLLECT (STRING, "nick", &nick, + STRING, "value", &valuestr)) + enum_state_add_value (state->enum_state, nick, valuestr, error); + return; + } + } + /* 3}}} */ + + if (container) + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Element <%s> not allowed inside <%s>"), + element_name, container); + else + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, + _("Element <%s> not allowed at the top level"), element_name); +} +/* 2}}} */ +/* End element {{{2 */ + +static void +key_state_end (KeyState **state_ptr, + GError **error) +{ + KeyState *state; + + state = *state_ptr; + *state_ptr = NULL; + + if (state->default_value == NULL) + { + g_set_error_literal (error, + G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "element is required in "); + return; + } +} + +static void +schema_state_end (SchemaState **state_ptr, + GError **error) +{ + *state_ptr = NULL; +} + +static void +end_element (GMarkupParseContext *context, + const gchar *element_name, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + + if (strcmp (element_name, "schemalist") == 0) + { + g_free (state->schemalist_domain); + state->schemalist_domain = NULL; + } + + else if (strcmp (element_name, "enum") == 0 || + strcmp (element_name, "flags") == 0) + enum_state_end (&state->enum_state, error); + + else if (strcmp (element_name, "schema") == 0) + schema_state_end (&state->schema_state, error); + + else if (strcmp (element_name, "override") == 0) + override_state_end (&state->key_state, &state->string, error); + + else if (strcmp (element_name, "key") == 0) + key_state_end (&state->key_state, error); + + else if (strcmp (element_name, "default") == 0) + key_state_end_default (state->key_state, &state->string, error); + + else if (strcmp (element_name, "choices") == 0) + key_state_end_choices (state->key_state, error); + + else if (strcmp (element_name, "aliases") == 0) + key_state_end_aliases (state->key_state, error); + + if (state->string) + { + g_string_free (state->string, TRUE); + state->string = NULL; + } +} +/* Text {{{2 */ +static void +text (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + ParseState *state = user_data; + + if (state->string) + { + /* we are expecting a string, so store the text data. + * + * we store the data verbatim here and deal with whitespace + * later on. there are two reasons for that: + * + * 1) whitespace is handled differently depending on the tag + * type. + * + * 2) we could do leading whitespace removal by refusing to + * insert it into state->string if it's at the start, but for + * trailing whitespace, we have no idea if there is another + * text() call coming or not. + */ + g_string_append_len (state->string, text, text_len); + } + else + { + /* string is not expected: accept (and ignore) pure whitespace */ + gsize i; + + for (i = 0; i < text_len; i++) + if (!g_ascii_isspace (text[i])) + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + _("text may not appear inside <%s>"), + g_markup_parse_context_get_element (context)); + break; + } + } +} + +/* Write to GVDB {{{1 */ +typedef struct +{ + GHashTable *table; + GvdbItem *root; +} GvdbPair; + +static void +gvdb_pair_init (GvdbPair *pair) +{ + pair->table = gvdb_hash_table_new (NULL, NULL); + pair->root = gvdb_hash_table_insert (pair->table, ""); +} + +typedef struct +{ + GHashTable *schema_table; + GvdbPair root_pair; +} WriteToFileData; + +typedef struct +{ + GHashTable *schema_table; + GvdbPair pair; + gboolean l10n; +} OutputSchemaData; + +static void +output_key (gpointer key, + gpointer value, + gpointer user_data) +{ + OutputSchemaData *data; + const gchar *name; + KeyState *state; + GvdbItem *item; + + name = key; + state = value; + data = user_data; + + item = gvdb_hash_table_insert (data->pair.table, name); + gvdb_item_set_parent (item, data->pair.root); + gvdb_item_set_value (item, key_state_serialise (state)); + + if (state->l10n) + data->l10n = TRUE; + + if (state->child_schema && + !g_hash_table_lookup (data->schema_table, state->child_schema)) + g_printerr ("warning: undefined reference to \n", + state->child_schema); +} + +static void +output_schema (gpointer key, + gpointer value, + gpointer user_data) +{ + WriteToFileData *wtf_data = user_data; + OutputSchemaData data; + GvdbPair *root_pair; + SchemaState *state; + const gchar *id; + GvdbItem *item; + + id = key; + state = value; + root_pair = &wtf_data->root_pair; + + data.schema_table = wtf_data->schema_table; + gvdb_pair_init (&data.pair); + data.l10n = FALSE; + + item = gvdb_hash_table_insert (root_pair->table, id); + gvdb_item_set_parent (item, root_pair->root); + gvdb_item_set_hash_table (item, data.pair.table); + + g_hash_table_foreach (state->keys, output_key, &data); + + if (state->path) + gvdb_hash_table_insert_string (data.pair.table, ".path", state->path); + + if (state->extends_name) + gvdb_hash_table_insert_string (data.pair.table, ".extends", + state->extends_name); + + if (state->list_of) + gvdb_hash_table_insert_string (data.pair.table, ".list-of", + state->list_of); + + if (data.l10n) + gvdb_hash_table_insert_string (data.pair.table, + ".gettext-domain", + state->gettext_domain); +} + +static gboolean +write_to_file (GHashTable *schema_table, + const gchar *filename, + GError **error) +{ + WriteToFileData data; + gboolean success; + + data.schema_table = schema_table; + + gvdb_pair_init (&data.root_pair); + + g_hash_table_foreach (schema_table, output_schema, &data); + + success = gvdb_table_write_contents (data.root_pair.table, filename, + G_BYTE_ORDER != G_LITTLE_ENDIAN, + error); + g_hash_table_unref (data.root_pair.table); + + return success; +} + +/* Parser driver {{{1 */ +static GHashTable * +parse_gschema_files (gchar **files, + gboolean strict) +{ + GMarkupParser parser = { start_element, end_element, text }; + ParseState state = { 0, }; + const gchar *filename; + GError *error = NULL; + + state.enum_table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, enum_state_free); + + state.flags_table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, enum_state_free); + + state.schema_table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, schema_state_free); + + while ((filename = *files++) != NULL) + { + GMarkupParseContext *context; + gchar *contents; + gsize size; + + if (!g_file_get_contents (filename, &contents, &size, &error)) + { + fprintf (stderr, "%s\n", error->message); + g_clear_error (&error); + continue; + } + + context = g_markup_parse_context_new (&parser, + G_MARKUP_TREAT_CDATA_AS_TEXT | + G_MARKUP_PREFIX_ERROR_POSITION, + &state, NULL); + + + if (!g_markup_parse_context_parse (context, contents, size, &error) || + !g_markup_parse_context_end_parse (context, &error)) + { + GSList *item; + + /* back out any changes from this file */ + for (item = state.this_file_schemas; item; item = item->next) + g_hash_table_remove (state.schema_table, item->data); + + for (item = state.this_file_flagss; item; item = item->next) + g_hash_table_remove (state.flags_table, item->data); + + for (item = state.this_file_enums; item; item = item->next) + g_hash_table_remove (state.enum_table, item->data); + + /* let them know */ + fprintf (stderr, "%s: %s. ", filename, error->message); + g_clear_error (&error); + + if (strict) + { + /* Translators: Do not translate "--strict". */ + fprintf (stderr, _("--strict was specified; exiting.\n")); + g_hash_table_unref (state.schema_table); + g_hash_table_unref (state.flags_table); + g_hash_table_unref (state.enum_table); + + return NULL; + } + else + fprintf (stderr, _("This entire file has been ignored.\n")); + } + + /* cleanup */ + g_markup_parse_context_free (context); + g_slist_free (state.this_file_schemas); + g_slist_free (state.this_file_flagss); + g_slist_free (state.this_file_enums); + state.this_file_schemas = NULL; + state.this_file_flagss = NULL; + state.this_file_enums = NULL; + } + + g_hash_table_unref (state.flags_table); + g_hash_table_unref (state.enum_table); + + return state.schema_table; +} + +static gint +compare_strings (gconstpointer a, + gconstpointer b) +{ + gchar *one = *(gchar **) a; + gchar *two = *(gchar **) b; + gint cmp; + + cmp = g_str_has_suffix (two, ".enums.xml") - + g_str_has_suffix (one, ".enums.xml"); + + if (!cmp) + cmp = strcmp (one, two); + + return cmp; +} + +static gboolean +set_overrides (GHashTable *schema_table, + gchar **files, + gboolean strict) +{ + const gchar *filename; + GError *error = NULL; + + while ((filename = *files++)) + { + GKeyFile *key_file; + gchar **groups; + gint i; + + key_file = g_key_file_new (); + if (!g_key_file_load_from_file (key_file, filename, 0, &error)) + { + fprintf (stderr, "%s: %s. ", filename, error->message); + g_key_file_free (key_file); + g_clear_error (&error); + + if (!strict) + { + fprintf (stderr, _("Ignoring this file.\n")); + continue; + } + + fprintf (stderr, _("--strict was specified; exiting.\n")); + return FALSE; + } + + groups = g_key_file_get_groups (key_file, NULL); + + for (i = 0; groups[i]; i++) + { + const gchar *group = groups[i]; + SchemaState *schema; + gchar **keys; + gint j; + + schema = g_hash_table_lookup (schema_table, group); + + if (schema == NULL) + /* Having the schema not be installed is expected to be a + * common case. Don't even emit an error message about + * that. + */ + continue; + + keys = g_key_file_get_keys (key_file, group, NULL, NULL); + g_assert (keys != NULL); + + for (j = 0; keys[j]; j++) + { + const gchar *key = keys[j]; + KeyState *state; + GVariant *value; + gchar *string; + + state = g_hash_table_lookup (schema->keys, key); + + if (state == NULL) + { + fprintf (stderr, _("No such key `%s' in schema `%s' as " + "specified in override file `%s'"), + key, group, filename); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); + g_strfreev (groups); + g_strfreev (keys); + + return FALSE; + } + + string = g_key_file_get_value (key_file, group, key, NULL); + g_assert (string != NULL); + + value = g_variant_parse (state->type, string, + NULL, NULL, &error); + + if (value == NULL) + { + fprintf (stderr, _("error parsing key `%s' in schema `%s' " + "as specified in override file `%s': " + "%s."), + key, group, filename, error->message); + + g_clear_error (&error); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("Ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _("--strict was specified; exiting.\n")); + g_key_file_free (key_file); + g_strfreev (groups); + g_strfreev (keys); + + return FALSE; + } + + if (state->minimum) + { + if (g_variant_compare (value, state->minimum) < 0 || + g_variant_compare (value, state->maximum) > 0) + { + fprintf (stderr, + _("override for key `%s' in schema `%s' in " + "override file `%s' is outside the range " + "given in the schema"), + key, group, filename); + + g_variant_unref (value); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); + g_strfreev (groups); + g_strfreev (keys); + + return FALSE; + } + } + + else if (state->strinfo->len) + { + if (!is_valid_choices (value, state->strinfo)) + { + fprintf (stderr, + _("override for key `%s' in schema `%s' in " + "override file `%s' is not in the list " + "of valid choices"), + key, group, filename); + + g_variant_unref (value); + g_free (string); + + if (!strict) + { + fprintf (stderr, _("; ignoring override for this key.\n")); + continue; + } + + fprintf (stderr, _(" and --strict was specified; exiting.\n")); + g_key_file_free (key_file); + g_strfreev (groups); + g_strfreev (keys); + + return FALSE; + } + } + + g_variant_unref (state->default_value); + state->default_value = value; + g_free (string); + } + + g_strfreev (keys); + } + + g_strfreev (groups); + } + + return TRUE; +} + +int +main (int argc, char **argv) +{ + GError *error; + GHashTable *table; + GDir *dir; + const gchar *file; + gchar *srcdir; + gchar *targetdir = NULL; + gchar *target; + gboolean dry_run = FALSE; + gboolean strict = FALSE; + gchar **schema_files = NULL; + gchar **override_files = NULL; + GOptionContext *context; + GOptionEntry entries[] = { + { "targetdir", 0, 0, G_OPTION_ARG_FILENAME, &targetdir, N_("where to store the gschemas.compiled file"), N_("DIRECTORY") }, + { "strict", 0, 0, G_OPTION_ARG_NONE, &strict, N_("Abort on any errors in schemas"), NULL }, + { "dry-run", 0, 0, G_OPTION_ARG_NONE, &dry_run, N_("Do not write the gschema.compiled file"), NULL }, + { "allow-any-name", 0, 0, G_OPTION_ARG_NONE, &allow_any_name, N_("Do not enforce key name restrictions") }, + + /* These options are only for use in the gschema-compile tests */ + { "schema-file", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_FILENAME_ARRAY, &schema_files, NULL, NULL }, + { NULL } + }; + +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + 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 + + context = g_option_context_new (N_("DIRECTORY")); + g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); + g_option_context_set_summary (context, + N_("Compile all GSettings schema files into a schema cache.\n" + "Schema files are required to have the extension .gschema.xml,\n" + "and the cache file is called gschemas.compiled.")); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + + error = NULL; + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + fprintf (stderr, "%s\n", error->message); + return 1; + } + + g_option_context_free (context); + + if (!schema_files && argc != 2) + { + fprintf (stderr, _("You should give exactly one directory name\n")); + return 1; + } + + srcdir = argv[1]; + + if (targetdir == NULL) + targetdir = srcdir; + + target = g_build_filename (targetdir, "gschemas.compiled", NULL); + + if (!schema_files) + { + GPtrArray *overrides; + GPtrArray *files; + + files = g_ptr_array_new (); + overrides = g_ptr_array_new (); + + dir = g_dir_open (srcdir, 0, &error); + if (dir == NULL) + { + fprintf (stderr, "%s\n", error->message); + return 1; + } + + while ((file = g_dir_read_name (dir)) != NULL) + { + if (g_str_has_suffix (file, ".gschema.xml") || + g_str_has_suffix (file, ".enums.xml")) + g_ptr_array_add (files, g_build_filename (srcdir, file, NULL)); + + else if (g_str_has_suffix (file, ".gschema.override")) + g_ptr_array_add (overrides, + g_build_filename (srcdir, file, NULL)); + } + + if (files->len == 0) + { + fprintf (stdout, _("No schema files found: ")); + + if (g_unlink (target)) + fprintf (stdout, _("doing nothing.\n")); + + else + fprintf (stdout, _("removed existing output file.\n")); + + return 0; + } + g_ptr_array_sort (files, compare_strings); + g_ptr_array_add (files, NULL); + + g_ptr_array_sort (overrides, compare_strings); + g_ptr_array_add (overrides, NULL); + + schema_files = (char **) g_ptr_array_free (files, FALSE); + override_files = (gchar **) g_ptr_array_free (overrides, FALSE); + } + + if ((table = parse_gschema_files (schema_files, strict)) == NULL) + { + g_free (target); + return 1; + } + + if (override_files != NULL && + !set_overrides (table, override_files, strict)) + { + g_free (target); + return 1; + } + + if (!dry_run && !write_to_file (table, target, &error)) + { + fprintf (stderr, "%s\n", error->message); + g_free (target); + return 1; + } + + g_free (target); + + return 0; +} + +/* Epilogue {{{1 */ + +/* vim:set foldmethod=marker: */ diff --git a/gio/gloadableicon.c b/gio/gloadableicon.c new file mode 100644 index 0000000..f8fa896 --- /dev/null +++ b/gio/gloadableicon.c @@ -0,0 +1,232 @@ +/* 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 "gicon.h" +#include "gloadableicon.h" +#include "gasyncresult.h" +#include "gtask.h" +#include "glibintl.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: (out) (allow-none): a location to store the type of the + * loaded icon, %NULL to ignore. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Loads a loadable icon. For the asynchronous version of this function, + * see g_loadable_icon_load_async(). + * + * Returns: (transfer full): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the + * request is satisfied + * @user_data: (closure): 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 occurring, or %NULL to + * ignore. + * + * Finishes an asynchronous icon load started in g_loadable_icon_load_async(). + * + * Returns: (transfer full): 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_async_result_legacy_propagate_error (res, 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; +} LoadData; + +static void +load_data_free (LoadData *data) +{ + g_free (data->type); + g_free (data); +} + +static void +load_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GLoadableIcon *icon = source_object; + LoadData *data = task_data; + GLoadableIconIface *iface; + GInputStream *stream; + GError *error = NULL; + + iface = G_LOADABLE_ICON_GET_IFACE (icon); + stream = iface->load (icon, data->size, &data->type, + cancellable, &error); + + if (stream) + g_task_return_pointer (task, stream, g_object_unref); + else + g_task_return_error (task, error); +} + + + +static void +g_loadable_icon_real_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + LoadData *data; + + task = g_task_new (icon, cancellable, callback, user_data); + data = g_new0 (LoadData, 1); + g_task_set_task_data (task, data, (GDestroyNotify) load_data_free); + g_task_run_in_thread (task, load_async_thread); + g_object_unref (task); +} + +static GInputStream * +g_loadable_icon_real_load_finish (GLoadableIcon *icon, + GAsyncResult *res, + char **type, + GError **error) +{ + GTask *task; + LoadData *data; + GInputStream *stream; + + g_return_val_if_fail (g_task_is_valid (res, icon), NULL); + + task = G_TASK (res); + data = g_task_get_task_data (task); + + stream = g_task_propagate_pointer (task, error); + if (stream && type) + { + *type = data->type; + data->type = NULL; + } + + return stream; +} diff --git a/gio/gloadableicon.h b/gio/gloadableicon.h new file mode 100644 index 0000000..5bdece8 --- /dev/null +++ b/gio/gloadableicon.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_LOADABLE_ICON_H__ +#define __G_LOADABLE_ICON_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_loadable_icon_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GInputStream *g_loadable_icon_load (GLoadableIcon *icon, + int size, + char **type, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_loadable_icon_load_async (GLoadableIcon *icon, + int size, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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..f175723 --- /dev/null +++ b/gio/glocaldirectorymonitor.c @@ -0,0 +1,270 @@ +/* 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 + + +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; +#ifdef G_OS_UNIX + GUnixMountEntry *mount; +#endif + gboolean is_mounted; + GFile *file; + + /* Emulate unmount detection */ +#ifdef G_OS_UNIX + mount = g_unix_mount_at (local_monitor->dirname, NULL); + + is_mounted = mount != NULL; + + if (mount) + g_unix_mount_free (mount); +#else + /*claim everything was mounted */ + is_mounted = TRUE; +#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; + } +} + +GFileMonitor* +_g_local_directory_monitor_new (const char *dirname, + GFileMonitorFlags flags, + gboolean is_remote_fs, + GError **error) +{ + GFileMonitor *monitor = NULL; + GType type = G_TYPE_INVALID; + + if (is_remote_fs) + type = _g_io_module_get_default_type (G_NFS_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + "GIO_USE_FILE_MONITOR", + G_STRUCT_OFFSET (GLocalDirectoryMonitorClass, is_supported)); + + if (type == G_TYPE_INVALID) + type = _g_io_module_get_default_type (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + "GIO_USE_FILE_MONITOR", + G_STRUCT_OFFSET (GLocalDirectoryMonitorClass, is_supported)); + + 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")); + + 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; +} diff --git a/gio/glocaldirectorymonitor.h b/gio/glocaldirectorymonitor.h new file mode 100644 index 0000000..a2bbc11 --- /dev/null +++ b/gio/glocaldirectorymonitor.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 + */ + +#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" +#define G_NFS_DIRECTORY_MONITOR_EXTENSION_POINT_NAME "gio-nfs-directory-monitor" + +typedef struct _GLocalDirectoryMonitor GLocalDirectoryMonitor; +typedef struct _GLocalDirectoryMonitorClass GLocalDirectoryMonitorClass; + +struct _GLocalDirectoryMonitor +{ + GFileMonitor parent_instance; + + gchar *dirname; + GFileMonitorFlags flags; + /* For mount emulation */ + gboolean was_mounted; + GUnixMountMonitor *mount_monitor; +}; + +struct _GLocalDirectoryMonitorClass +{ + GFileMonitorClass parent_class; + + gboolean mount_notify; + + gboolean (* is_supported) (void); +}; + +#ifdef G_OS_UNIX +GLIB_AVAILABLE_IN_ALL +#endif +GType g_local_directory_monitor_get_type (void) G_GNUC_CONST; + +GFileMonitor * _g_local_directory_monitor_new (const char *dirname, + GFileMonitorFlags flags, + gboolean is_remote_fs, + 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..9007faa --- /dev/null +++ b/gio/glocalfile.c @@ -0,0 +1,2555 @@ +/* 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 + +#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_UNIX +#include "glib-unix.h" +#endif + +#ifdef G_OS_WIN32 +#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 + + +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); + } + + /* Make sure we're using the canonical dir separator */ + p++; + while (p < start && G_IS_DIR_SEPARATOR (*p)) + *p++ = G_DIR_SEPARATOR; + + 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 + { +#ifdef G_OS_WIN32 + char *dup_filename, *p, *backslash; + + /* Turn backslashes into forward slashes like + * g_filename_to_uri() would do (but we can't use that because + * it doesn't output IRIs). + */ + dup_filename = g_strdup (filename); + filename = p = dup_filename; + + while ((backslash = strchr (p, '\\')) != NULL) + { + *backslash = '/'; + p = backslash + 1; + } +#endif + + 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); +#ifdef G_OS_WIN32 + g_free (dup_filename); +#endif + 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; +} + +#if defined(USE_STATFS) && !defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) +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"; + case 0x52345362: + return "reiser4"; + 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) +{ + GStatBuf 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 + const char *fstype; +#ifdef USE_STATFS + guint64 block_size; + struct statfs statfs_buffer; +#elif defined(USE_STATVFS) + guint64 block_size; + struct statvfs statfs_buffer; +#endif /* USE_STATFS */ +#endif /* G_OS_WIN32 */ + 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 /* STATFS_ARGS == 2 */ + 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 available == 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 /* G_OS_WIN32 */ + +#elif defined(USE_STATVFS) + statfs_result = statvfs (local->filename, &statfs_buffer); + block_size = statfs_buffer.f_frsize; +#endif /* USE_STATFS */ + + 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 +#if defined(USE_STATFS) || defined(USE_STATVFS) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, block_size * statfs_buffer.f_bavail); +#endif +#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 +#if defined(USE_STATFS) || defined(USE_STATVFS) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE, block_size * statfs_buffer.f_blocks); +#endif +#endif /* G_OS_WIN32 */ + } + + if (!no_size && + g_file_attribute_matcher_matches (attribute_matcher, + G_FILE_ATTRIBUTE_FILESYSTEM_USED)) + { +#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_free; + ULARGE_INTEGER li_total; + + g_free (localdir); + if (GetDiskFreeSpaceExW (wdirname, &li_free, &li_total, NULL)) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USED, (guint64)li_total.QuadPart - (guint64)li_free.QuadPart); + g_free (wdirname); +#else + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_USED, block_size * (statfs_buffer.f_blocks - statfs_buffer.f_bfree)); +#endif /* G_OS_WIN32 */ + } + +#ifndef G_OS_WIN32 +#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) +#if defined(HAVE_STRUCT_STATVFS_F_FSTYPENAME) + fstype = g_strdup (statfs_buffer.f_fstypename); +#elif defined(HAVE_STRUCT_STATVFS_F_BASETYPE) + fstype = g_strdup (statfs_buffer.f_basetype); +#else + fstype = NULL; +#endif +#endif /* USE_STATFS */ + + 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 /* G_OS_WIN32 */ + + 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_OS_WIN32 */ + } + + 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); + GStatBuf 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; + GStatBuf 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 exists")); + 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, ret; + GLocalFileStat buf; + + fd = g_open (local->filename, O_RDONLY|O_BINARY, 0); + if (fd == -1) + { + int errsv = errno; + +#ifdef G_OS_WIN32 + if (errsv == EACCES) + { + ret = _stati64 (local->filename, &buf); + if (ret == 0 && S_ISDIR (buf.st_mode)) + { + g_set_error_literal (error, G_IO_ERROR, + G_IO_ERROR_IS_DIRECTORY, + _("Can't open directory")); + return NULL; + } + } +#endif + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error opening file: %s"), + g_strerror (errsv)); + return NULL; + } + +#ifdef G_OS_WIN32 + ret = _fstati64 (fd, &buf); +#else + ret = fstat (fd, &buf); +#endif + + if (ret == 0 && S_ISDIR (buf.st_mode)) + { + (void) g_close (fd, NULL); + 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; +} + +#ifndef G_OS_WIN32 + +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; + GStatBuf 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; +} + +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); +} + +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]; + GStatBuf global_stat, trash_stat; + gboolean res; + + if (g_once_init_enter (&home_dev_set)) + { + GStatBuf 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; +} + +#ifdef G_OS_UNIX +gboolean +_g_local_file_is_lost_found_dir (const char *path, dev_t path_dev) +{ + gboolean ret = FALSE; + gchar *mount_dir = NULL; + size_t mount_dir_len; + GStatBuf statbuf; + + if (!g_str_has_suffix (path, "/lost+found")) + goto out; + + mount_dir = find_mountpoint_for (path, path_dev); + if (mount_dir == NULL) + goto out; + + mount_dir_len = strlen (mount_dir); + /* We special-case rootfs ('/') since it's the only case where + * mount_dir ends in '/' + */ + if (mount_dir_len == 1) + mount_dir_len--; + if (mount_dir_len + strlen ("/lost+found") != strlen (path)) + goto out; + + if (g_lstat (path, &statbuf) != 0) + goto out; + + if (!(S_ISDIR (statbuf.st_mode) && + statbuf.st_uid == 0 && + statbuf.st_gid == 0)) + goto out; + + ret = TRUE; + + out: + g_free (mount_dir); + return ret; +} +#endif + +static gboolean +g_local_file_trash (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GLocalFile *local = G_LOCAL_FILE (file); + GStatBuf 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; + GStatBuf 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 = g_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; + } + + (void) g_close (fd, NULL); + + /* 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 = g_uri_escape_string (original_name, "/", FALSE); + + 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; + GStatBuf 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; +} + +#ifdef G_OS_WIN32 + +static gboolean +is_remote (const gchar *filename) +{ + return FALSE; +} + +#else + +static gboolean +is_remote_fs (const gchar *filename) +{ + const char *fsname = NULL; + +#ifdef USE_STATFS + struct statfs statfs_buffer; + int statfs_result = 0; + +#if STATFS_ARGS == 2 + statfs_result = statfs (filename, &statfs_buffer); +#elif STATFS_ARGS == 4 + statfs_result = statfs (filename, &statfs_buffer, sizeof (statfs_buffer), 0); +#endif + +#elif defined(USE_STATVFS) + struct statvfs statfs_buffer; + + statfs_result = statvfs (filename, &statfs_buffer); +#else + return FALSE; +#endif + + if (statfs_result == -1) + return FALSE; + +#ifdef USE_STATFS +#if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) + fsname = statfs_buffer.f_fstypename; +#else + fsname = get_fs_type (statfs_buffer.f_type); +#endif + +#elif defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_BASETYPE) + fsname = statfs_buffer.f_basetype; +#endif + + if (fsname != NULL) + { + if (strcmp (fsname, "nfs") == 0) + return TRUE; + if (strcmp (fsname, "nfs4") == 0) + return TRUE; + } + + return FALSE; +} + +static gboolean +is_remote (const gchar *filename) +{ + static gboolean remote_home; + static gsize initialized; + const gchar *home; + + home = g_get_home_dir (); + if (path_has_prefix (filename, home)) + { + if (g_once_init_enter (&initialized)) + { + remote_home = is_remote_fs (home); + g_once_init_leave (&initialized, TRUE); + } + return remote_home; + } + + return FALSE; +} +#endif /* !G_OS_WIN32 */ + +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, is_remote (local_file->filename), 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, is_remote (local_file->filename), 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..5cba475 --- /dev/null +++ b/gio/glocalfileenumerator.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 +#include +#include +#include +#include +#include "glibintl.h" + + +#define CHUNK_SIZE 1000 + +#ifdef G_OS_WIN32 +#define USE_GDIR +#endif + +#ifndef USE_GDIR + +#include +#include +#include + +typedef struct { + char *name; + long inode; + GFileType type; +} DirEntry; + +#endif + +struct _GLocalFileEnumerator +{ + GFileEnumerator parent; + + GFileAttributeMatcher *matcher; + GFileAttributeMatcher *reduced_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); + g_file_attribute_matcher_unref (local->reduced_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); +} +#else +static GFileAttributeMatcher * +g_file_attribute_matcher_subtract_attributes (GFileAttributeMatcher *matcher, + const char * attributes) +{ + GFileAttributeMatcher *result, *tmp; + + tmp = g_file_attribute_matcher_new (attributes); + result = g_file_attribute_matcher_subtract (matcher, tmp); + g_file_attribute_matcher_unref (tmp); + + return result; +} +#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); +#ifndef USE_GDIR + local->reduced_matcher = g_file_attribute_matcher_subtract_attributes (local->matcher, + G_LOCAL_FILE_INFO_NOSTAT_ATTRIBUTES"," + "standard::type"); +#endif + 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; +} + +#ifdef HAVE_STRUCT_DIRENT_D_TYPE +static GFileType +file_type_from_dirent (char d_type) +{ + switch (d_type) + { + case DT_BLK: + case DT_CHR: + case DT_FIFO: + case DT_SOCK: + return G_FILE_TYPE_SPECIAL; + case DT_DIR: + return G_FILE_TYPE_DIRECTORY; + case DT_LNK: + return G_FILE_TYPE_SYMBOLIC_LINK; + case DT_REG: + return G_FILE_TYPE_REGULAR; + case DT_UNKNOWN: + default: + return G_FILE_TYPE_UNKNOWN; + } +} +#endif + +static const char * +next_file_helper (GLocalFileEnumerator *local, GFileType *file_type) +{ + 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; +#if HAVE_STRUCT_DIRENT_D_TYPE + local->entries[i].type = file_type_from_dirent (entry->d_type); +#else + local->entries[i].type = G_FILE_TYPE_UNKNOWN; +#endif + } + 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; + + *file_type = local->entries[local->entries_pos].type; + + local->entries_pos++; + + 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; + GFileType file_type; + + 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); + file_type = G_FILE_TYPE_UNKNOWN; +#else + filename = next_file_helper (local, &file_type); +#endif + + if (filename == NULL) + return NULL; + + my_error = NULL; + path = g_build_filename (local->filename, filename, NULL); + if (file_type == G_FILE_TYPE_UNKNOWN || + (file_type == G_FILE_TYPE_SYMBOLIC_LINK && !(local->flags & G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS))) + { + info = _g_local_file_info_get (filename, path, + local->matcher, + local->flags, + &local->parent_info, + &my_error); + } + else + { + info = _g_local_file_info_get (filename, path, + local->reduced_matcher, + local->flags, + &local->parent_info, + &my_error); + if (info) + { + _g_local_file_info_get_nostat (info, filename, path, local->matcher); + g_file_info_set_file_type (info, file_type); + if (file_type == G_FILE_TYPE_SYMBOLIC_LINK) + g_file_info_set_is_symlink (info, TRUE); + } + } + 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 (g_error_matches (my_error, G_IO_ERROR, 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..90a074b --- /dev/null +++ b/gio/glocalfileinfo.c @@ -0,0 +1,2654 @@ +/* -*- 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 +#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 + +#ifndef G_OS_WIN32 +#include "glib-unix.h" +#include "glib-private.h" +#endif +#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 "gcontenttypeprivate.h" + + +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) +{ + glong sec, usec; + + sec = statbuf->st_mtime; +#if defined (HAVE_STRUCT_STAT_ST_MTIMENSEC) + usec = statbuf->st_mtimensec / 1000; +#elif defined (HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + usec = statbuf->st_mtim.tv_nsec / 1000; +#else + usec = 0; +#endif + + return g_strdup_printf ("%lu:%lu", sec, 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) +{ + GStatBuf 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 (statbuf != NULL && S_ISDIR(statbuf->st_mode)) + return g_strdup ("inode/directory"); +#ifndef G_OS_WIN32 + else if (statbuf != NULL && S_ISCHR(statbuf->st_mode)) + return g_strdup ("inode/chardevice"); + else if (statbuf != NULL && S_ISBLK(statbuf->st_mode)) + return g_strdup ("inode/blockdevice"); + else if (statbuf != NULL && S_ISFIFO(statbuf->st_mode)) + return g_strdup ("inode/fifo"); +#endif +#ifdef S_ISSOCK + else if (statbuf != NULL && 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 = g_open (path, O_RDONLY | O_NOATIME, 0); + if (fd < 0 && errno == EPERM) +#endif + fd = g_open (path, O_RDONLY, 0); + + if (fd != -1) + { + ssize_t res; + + res = read (fd, sniff_buffer, sniff_length); + (void) g_close (fd, NULL); + 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_user_cache_dir (), + "thumbnails", "large", 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_user_cache_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_user_cache_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 */ + +#ifndef G_OS_WIN32 +/* support for '.hidden' files */ +G_LOCK_DEFINE_STATIC (hidden_cache); +static GHashTable *hidden_cache; + +static gboolean +remove_from_hidden_cache (gpointer user_data) +{ + G_LOCK (hidden_cache); + g_hash_table_remove (hidden_cache, user_data); + G_UNLOCK (hidden_cache); + + return FALSE; +} + +static GHashTable * +read_hidden_file (const gchar *dirname) +{ + gchar *filename; + FILE *hidden; + + filename = g_build_path ("/", dirname, ".hidden", NULL); + hidden = fopen (filename, "r"); + g_free (filename); + + if (hidden != NULL) + { + gchar buffer[PATH_MAX + 2]; /* \n\0 */ + GHashTable *table; + + table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + while (fgets (buffer, sizeof buffer, hidden)) + { + gchar *newline; + + if ((newline = strchr (buffer, '\n')) != NULL) + { + *newline++ = '\0'; + + g_hash_table_insert (table, + g_memdup (buffer, newline - buffer), + GINT_TO_POINTER (TRUE)); + } + } + + fclose (hidden); + + return table; + } + else + return NULL; +} + +static void +maybe_unref_hash_table (gpointer data) +{ + if (data != NULL) + g_hash_table_unref (data); +} + +static gboolean +file_is_hidden (const gchar *path, + const gchar *basename) +{ + gboolean result; + gchar *dirname; + gpointer table; + + dirname = g_path_get_dirname (path); + + G_LOCK (hidden_cache); + + if G_UNLIKELY (hidden_cache == NULL) + hidden_cache = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, maybe_unref_hash_table); + + if (!g_hash_table_lookup_extended (hidden_cache, dirname, + NULL, &table)) + { + gchar *mydirname; + GSource *remove_from_cache_source; + + g_hash_table_insert (hidden_cache, + mydirname = g_strdup (dirname), + table = read_hidden_file (dirname)); + + remove_from_cache_source = g_timeout_source_new_seconds (5); + g_source_set_priority (remove_from_cache_source, G_PRIORITY_DEFAULT); + g_source_set_callback (remove_from_cache_source, + remove_from_hidden_cache, + mydirname, + NULL); + g_source_attach (remove_from_cache_source, + GLIB_PRIVATE_CALL (g_get_worker_context) ()); + g_source_unref (remove_from_cache_source); + } + + result = table != NULL && + GPOINTER_TO_INT (g_hash_table_lookup (table, basename)); + + G_UNLOCK (hidden_cache); + + g_free (dirname); + + return result; +} +#endif /* !G_OS_WIN32 */ + +void +_g_local_file_info_get_nostat (GFileInfo *info, + const char *basename, + const char *path, + GFileAttributeMatcher *attribute_matcher) +{ + g_file_info_set_name (info, basename); + + 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); + } +} + +static const char * +get_icon_name (const char *path, + gboolean use_symbolic, + gboolean *with_fallbacks_out) +{ + const char *name = NULL; + gboolean with_fallbacks = TRUE; + + if (strcmp (path, g_get_home_dir ()) == 0) + { + name = use_symbolic ? "user-home-symbolic" : "user-home"; + with_fallbacks = FALSE; + } + else if (strcmp (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) == 0) + { + name = use_symbolic ? "user-desktop-symbolic" : "user-desktop"; + with_fallbacks = FALSE; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) == 0) + { + name = use_symbolic ? "folder-documents-symbolic" : "folder-documents"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD)) == 0) + { + name = use_symbolic ? "folder-download-symbolic" : "folder-download"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)) == 0) + { + name = use_symbolic ? "folder-music-symbolic" : "folder-music"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)) == 0) + { + name = use_symbolic ? "folder-pictures-symbolic" : "folder-pictures"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE)) == 0) + { + name = use_symbolic ? "folder-publicshare-symbolic" : "folder-publicshare"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES)) == 0) + { + name = use_symbolic ? "folder-templates-symbolic" : "folder-templates"; + } + else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)) == 0) + { + name = use_symbolic ? "folder-videos-symbolic" : "folder-videos"; + } + else + { + name = NULL; + } + + if (with_fallbacks_out != NULL) + *with_fallbacks_out = with_fallbacks; + + return name; +} + +static GIcon * +get_icon (const char *path, + const char *content_type, + gboolean is_folder, + gboolean use_symbolic) +{ + GIcon *icon = NULL; + const char *icon_name; + gboolean with_fallbacks; + + icon_name = get_icon_name (path, use_symbolic, &with_fallbacks); + if (icon_name != NULL) + { + if (with_fallbacks) + icon = g_themed_icon_new_with_default_fallbacks (icon_name); + else + icon = g_themed_icon_new (icon_name); + } + else + { + if (use_symbolic) + icon = g_content_type_get_symbolic_icon (content_type); + else + icon = g_content_type_get_icon (content_type); + + if (G_IS_THEMED_ICON (icon) && is_folder) + { + g_themed_icon_append_name (G_THEMED_ICON (icon), use_symbolic ? "folder-symbolic" : "folder"); + } + } + + return icon; +} + +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 stat_ok; + 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_local_file_info_get_nostat (info, basename, path, attribute_matcher); + + if (attribute_matcher == NULL) + { + g_file_info_unset_attribute_mask (info); + 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; + + /* Don't bail out if we get Permission denied (SELinux?) */ + if (errsv != EACCES) + { + 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 when getting information for file '%s': %s"), + display_name, g_strerror (errsv)); + g_free (display_name); + return NULL; + } + } + + /* Even if stat() fails, try to get as much as other attributes possible */ + stat_ok = res != -1; + + if (stat_ok) + device = statbuf.st_dev; + else + device = 0; + +#ifdef S_ISLNK + is_symlink = stat_ok && 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; + stat_ok = TRUE; + } + else + symlink_broken = TRUE; + } + } +#endif + + if (stat_ok) + set_info_from_stat (info, &statbuf, attribute_matcher); + +#ifdef G_OS_UNIX + if (stat_ok && _g_local_file_is_lost_found_dir (path, statbuf.st_dev)) + g_file_info_set_is_hidden (info, TRUE); +#endif + +#ifndef G_OS_WIN32 + if (_g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_IS_HIDDEN)) + { + if (basename != NULL && + (basename[0] == '.' || + file_is_hidden (path, basename))) + g_file_info_set_is_hidden (info, TRUE); + } + + if (basename != NULL && basename[strlen (basename) -1] == '~' && + (stat_ok && 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_CONTENT_TYPE) || + _g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_ICON) || + _g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_SYMBOLIC_ICON)) + { + char *content_type = get_content_type (basename, path, stat_ok ? &statbuf : NULL, 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) + || _g_file_attribute_matcher_matches_id (attribute_matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_SYMBOLIC_ICON)) + { + GIcon *icon; + + /* non symbolic icon */ + icon = get_icon (path, content_type, S_ISDIR (statbuf.st_mode), FALSE); + if (icon != NULL) + { + g_file_info_set_icon (info, icon); + g_object_unref (icon); + } + + /* symbolic icon */ + icon = get_icon (path, content_type, S_ISDIR (statbuf.st_mode), TRUE); + if (icon != NULL) + { + g_file_info_set_symbolic_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, stat_ok ? &statbuf : NULL, 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 + if (stat_ok) + 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 + if (stat_ok) + 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 + if (stat_ok) + 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 (stat_ok && 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); + + if (stat_ok) + 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 when getting information for 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 = 0; + 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 = 0; + 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 = 0; + guint32 val_usec = 0; + 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..6d35be5 --- /dev/null +++ b/gio/glocalfileinfo.h @@ -0,0 +1,100 @@ +/* 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 + +#define G_LOCAL_FILE_INFO_NOSTAT_ATTRIBUTES \ + G_FILE_ATTRIBUTE_STANDARD_NAME "," \ + G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," \ + G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME "," \ + G_FILE_ATTRIBUTE_STANDARD_COPY_NAME + +gboolean _g_local_file_has_trash_dir (const char *dirname, + dev_t dir_dev); +#ifdef G_OS_UNIX +gboolean _g_local_file_is_lost_found_dir (const char *path, + dev_t path_dev); +#endif +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); +void _g_local_file_info_get_nostat (GFileInfo *info, + const char *basename, + const char *path, + GFileAttributeMatcher *attribute_matcher); +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..bb05bb6 --- /dev/null +++ b/gio/glocalfileinputstream.c @@ -0,0 +1,369 @@ +/* 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 "gioerror.h" +#include "glocalfileinputstream.h" +#include "glocalfileinfo.h" +#include "glibintl.h" + +#ifdef G_OS_UNIX +#include "glib-unix.h" +#include "gfiledescriptorbased.h" +#endif + +#ifdef G_OS_WIN32 +#include +#endif + + + +#ifdef G_OS_UNIX +static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#endif + +#define g_local_file_input_stream_get_type _g_local_file_input_stream_get_type +#ifdef G_OS_UNIX +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) +); +#else +G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM,); +#endif + +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); +#ifdef G_OS_UNIX +static int g_local_file_input_stream_get_fd (GFileDescriptorBased *stream); +#endif + +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; +} + +#ifdef G_OS_UNIX +static void +g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_local_file_input_stream_get_fd; +} +#endif + +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; + + file = G_LOCAL_FILE_INPUT_STREAM (stream); + + if (!file->priv->do_close) + return TRUE; + + if (file->priv->fd == -1) + return TRUE; + + if (!g_close (file->priv->fd, NULL)) + { + 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; + } + + return TRUE; +} + + +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); +} + +#ifdef G_OS_UNIX +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; +} +#endif 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..5e4792b --- /dev/null +++ b/gio/glocalfileiostream.c @@ -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 + */ + +#include "config.h" + +#include +#include +#include "glibintl.h" +#include "gioerror.h" +#include "gcancellable.h" +#include "glocalfileiostream.h" +#include "glocalfileinputstream.h" +#include "glocalfileinfo.h" + +#ifdef G_OS_UNIX +#include "gfiledescriptorbased.h" +#endif + + +#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_local_file_output_stream_get_fd (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..e33369d --- /dev/null +++ b/gio/glocalfilemonitor.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 "gioenumtypes.h" +#include "glocalfilemonitor.h" +#include "giomodule-priv.h" +#include "gioerror.h" +#include "glibintl.h" + +#include + + +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)); +} + +GFileMonitor* +_g_local_file_monitor_new (const char *pathname, + GFileMonitorFlags flags, + gboolean is_remote_fs, + GError **error) +{ + GFileMonitor *monitor = NULL; + GType type = G_TYPE_INVALID; + + if (is_remote_fs) + type = _g_io_module_get_default_type (G_NFS_FILE_MONITOR_EXTENSION_POINT_NAME, + "GIO_USE_FILE_MONITOR", + G_STRUCT_OFFSET (GLocalFileMonitorClass, is_supported)); + + if (type == G_TYPE_INVALID) + type = _g_io_module_get_default_type (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + "GIO_USE_FILE_MONITOR", + G_STRUCT_OFFSET (GLocalFileMonitorClass, is_supported)); + + 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")); + + return monitor; +} diff --git a/gio/glocalfilemonitor.h b/gio/glocalfilemonitor.h new file mode 100644 index 0000000..2c1b794 --- /dev/null +++ b/gio/glocalfilemonitor.h @@ -0,0 +1,69 @@ +/* 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" +#define G_NFS_FILE_MONITOR_EXTENSION_POINT_NAME "gio-nfs-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); +}; + +#ifdef G_OS_UNIX +GLIB_AVAILABLE_IN_ALL +#endif +GType g_local_file_monitor_get_type (void) G_GNUC_CONST; + +GFileMonitor * _g_local_file_monitor_new (const char *pathname, + GFileMonitorFlags flags, + gboolean is_remote_fs, + 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..22fefc4 --- /dev/null +++ b/gio/glocalfileoutputstream.c @@ -0,0 +1,1200 @@ +/* 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 "glocalfileoutputstream.h" +#include "glocalfileinfo.h" + +#ifdef G_OS_UNIX +#include "gfiledescriptorbased.h" +#endif + +#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 + + +#ifdef G_OS_UNIX +static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#endif + +#define g_local_file_output_stream_get_type _g_local_file_output_stream_get_type +#ifdef G_OS_UNIX +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) + ); +#else +G_DEFINE_TYPE_WITH_CODE (GLocalFileOutputStream, g_local_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM,); +#endif + + +/* 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); +#ifdef G_OS_UNIX +static int g_local_file_output_stream_get_fd (GFileDescriptorBased *stream); +#endif + +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; +} + +#ifdef G_OS_UNIX +static void +g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_local_file_output_stream_get_fd; +} +#endif + +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; + +#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); + + if (!g_close (file->priv->fd, NULL)) + { + 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; + } + + g_clear_pointer (&file->priv->tmp_filename, g_free); + } + + 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); + + if (!g_close (file->priv->fd, NULL)) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error closing file: %s"), + g_strerror (errsv)); + goto err_out; + } + +#endif + + return TRUE; + err_out: + +#ifndef G_OS_WIN32 + /* A simple try to close the fd in case we fail before the actual close */ + (void) g_close (file->priv->fd, NULL); +#endif + if (file->priv->tmp_filename) + g_unlink (file->priv->tmp_filename); + + 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_new (int fd) +{ + GLocalFileOutputStream *stream; + + 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_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 when getting information for 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 + ) + ) + { + GLocalFileStat tmp_statbuf; + int tres; + +#ifdef G_OS_WIN32 + tres = _fstati64 (tmpfd, &tmp_statbuf); +#else + tres = fstat (tmpfd, &tmp_statbuf); +#endif + /* Check that we really needed to change something */ + if (tres != 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) + { + (void) g_close (tmpfd, NULL); + g_unlink (tmp_filename); + g_free (tmp_filename); + goto fallback_strategy; + } + } + + (void) g_close (fd, NULL); + *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); + (void) g_close (bfd, NULL); + 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); + (void) g_close (bfd, NULL); + g_free (backup_filename); + + goto err_out; + } + + (void) g_close (bfd, NULL); + 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) + { + (void) g_close (fd, NULL); + + 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: + (void) g_close (fd, NULL); + 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); +} + +gint +_g_local_file_output_stream_get_fd (GLocalFileOutputStream *stream) +{ + g_return_val_if_fail (G_IS_LOCAL_FILE_OUTPUT_STREAM (stream), -1); + return stream->priv->fd; +} + +#ifdef G_OS_UNIX +static int +g_local_file_output_stream_get_fd (GFileDescriptorBased *fd_based) +{ + GLocalFileOutputStream *stream = G_LOCAL_FILE_OUTPUT_STREAM (fd_based); + return _g_local_file_output_stream_get_fd (stream); +} +#endif diff --git a/gio/glocalfileoutputstream.h b/gio/glocalfileoutputstream.h new file mode 100644 index 0000000..844eacb --- /dev/null +++ b/gio/glocalfileoutputstream.h @@ -0,0 +1,92 @@ +/* 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_new (int fd); +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); + +/* Hack to get the fd since GFileDescriptorBased (which is how you + * _should_ get the fd) is only available on UNIX but things like + * win32 needs this as well + */ +gint _g_local_file_output_stream_get_fd (GLocalFileOutputStream *output_stream); + +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..f2eaea2 --- /dev/null +++ b/gio/glocalvfs.c @@ -0,0 +1,218 @@ +/* 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 + + +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..a4feb99 --- /dev/null +++ b/gio/gmemoryinputstream.c @@ -0,0 +1,532 @@ +/* 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 "gpollableinputstream.h" +#include "ginputstream.h" +#include "gseekable.h" +#include "string.h" +#include "gtask.h" +#include "gioerror.h" +#include "glibintl.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. + * + * As of GLib 2.34, #GMemoryInputStream implements + * #GPollableInputStream. + */ + +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_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_pollable_iface_init (GPollableInputStreamInterface *iface); +static gboolean g_memory_input_stream_is_readable (GPollableInputStream *stream); +static GSource *g_memory_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable); + +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); + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, + g_memory_input_stream_pollable_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->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 +g_memory_input_stream_finalize (GObject *object) +{ + GMemoryInputStream *stream; + GMemoryInputStreamPrivate *priv; + + stream = G_MEMORY_INPUT_STREAM (object); + priv = stream->priv; + + g_slist_free_full (priv->chunks, (GDestroyNotify)g_bytes_unref); + + 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_pollable_iface_init (GPollableInputStreamInterface *iface) +{ + iface->is_readable = g_memory_input_stream_is_readable; + iface->create_source = g_memory_input_stream_create_source; +} + +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: (array length=len) (element-type guint8) (transfer full): input data + * @len: length of the data, may be -1 if @data is a nul-terminated string + * @destroy: (allow-none): 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_new_from_bytes: + * @bytes: a #GBytes + * + * Creates a new #GMemoryInputStream with data from the given @bytes. + * + * Returns: new #GInputStream read from @bytes + * + * Since: 2.34 + **/ +GInputStream * +g_memory_input_stream_new_from_bytes (GBytes *bytes) +{ + + GInputStream *stream; + + stream = g_memory_input_stream_new (); + + g_memory_input_stream_add_bytes (G_MEMORY_INPUT_STREAM (stream), + bytes); + + return stream; +} + +/** + * g_memory_input_stream_add_data: + * @stream: a #GMemoryInputStream + * @data: (array length=len) (element-type guint8) (transfer full): input data + * @len: length of the data, may be -1 if @data is a nul-terminated string + * @destroy: (allow-none): 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) +{ + GBytes *bytes; + + if (len == -1) + len = strlen (data); + + /* It's safe to discard the const here because we're chaining the + * destroy callback. + */ + bytes = g_bytes_new_with_free_func (data, len, destroy, (void*)data); + + g_memory_input_stream_add_bytes (stream, bytes); + + g_bytes_unref (bytes); +} + +/** + * g_memory_input_stream_add_bytes: + * @stream: a #GMemoryInputStream + * @bytes: input data + * + * Appends @bytes to data that can be read from the input stream. + * + * Since: 2.34 + */ +void +g_memory_input_stream_add_bytes (GMemoryInputStream *stream, + GBytes *bytes) +{ + GMemoryInputStreamPrivate *priv; + + g_return_if_fail (G_IS_MEMORY_INPUT_STREAM (stream)); + g_return_if_fail (bytes != NULL); + + priv = stream->priv; + + priv->chunks = g_slist_append (priv->chunks, g_bytes_ref (bytes)); + priv->len += g_bytes_get_size (bytes); +} + +static gssize +g_memory_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GMemoryInputStream *memory_stream; + GMemoryInputStreamPrivate *priv; + GSList *l; + GBytes *chunk; + gsize len; + 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 = (GBytes *)l->data; + len = g_bytes_get_size (chunk); + + if (offset + len > priv->pos) + break; + + offset += len; + } + + start = priv->pos - offset; + rest = count; + + for (; l && rest > 0; l = l->next) + { + const guint8* chunk_data; + chunk = (GBytes *)l->data; + + chunk_data = g_bytes_get_data (chunk, &len); + + size = MIN (rest, 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_skip_async (GInputStream *stream, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + gssize nskipped; + GError *error = NULL; + + nskipped = G_INPUT_STREAM_GET_CLASS (stream)->skip (stream, count, cancellable, &error); + task = g_task_new (stream, cancellable, callback, user_data); + if (error) + g_task_return_error (task, error); + else + g_task_return_int (task, nskipped); + g_object_unref (task); +} + +static gssize +g_memory_input_stream_skip_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (result), error); +} + +static void +g_memory_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +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; +} + +static gboolean +g_memory_input_stream_is_readable (GPollableInputStream *stream) +{ + return TRUE; +} + +static GSource * +g_memory_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable) +{ + GSource *base_source, *pollable_source; + + base_source = g_timeout_source_new (0); + pollable_source = g_pollable_source_new_full (stream, base_source, + cancellable); + g_source_unref (base_source); + + return pollable_source; +} diff --git a/gio/gmemoryinputstream.h b/gio/gmemoryinputstream.h new file mode 100644 index 0000000..607c4bb --- /dev/null +++ b/gio/gmemoryinputstream.h @@ -0,0 +1,92 @@ +/* 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 + */ + +#ifndef __G_MEMORY_INPUT_STREAM_H__ +#define __G_MEMORY_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_memory_input_stream_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GInputStream * g_memory_input_stream_new (void); +GLIB_AVAILABLE_IN_ALL +GInputStream * g_memory_input_stream_new_from_data (const void *data, + gssize len, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_2_34 +GInputStream * g_memory_input_stream_new_from_bytes (GBytes *bytes); + +GLIB_AVAILABLE_IN_ALL +void g_memory_input_stream_add_data (GMemoryInputStream *stream, + const void *data, + gssize len, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_2_34 +void g_memory_input_stream_add_bytes (GMemoryInputStream *stream, + GBytes *bytes); + +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..6576bdc --- /dev/null +++ b/gio/gmemoryoutputstream.c @@ -0,0 +1,811 @@ +/* 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 "gpollableoutputstream.h" +#include "gseekable.h" +#include "gtask.h" +#include "gioerror.h" +#include "string.h" +#include "glibintl.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. + * + * As of GLib 2.34, #GMemoryOutputStream implements + * #GPollableOutputStream. + */ + +#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_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); + +static gboolean g_memory_output_stream_is_writable (GPollableOutputStream *stream); +static GSource *g_memory_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable); + +static void g_memory_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface); + +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); + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, + g_memory_output_stream_pollable_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->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: (skip) + * + * 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: (skip) + * + * 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_pollable_iface_init (GPollableOutputStreamInterface *iface) +{ + iface->is_writable = g_memory_output_stream_is_writable; + iface->create_source = g_memory_output_stream_create_source; +} + +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: (skip) + * @data: (allow-none): pointer to a chunk of memory to use, or %NULL + * @size: the size of @data + * @realloc_function: (allow-none): a function with realloc() semantics (like g_realloc()) + * to be called when @data needs to be grown, or %NULL + * @destroy_function: (allow-none): 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_new_resizable: + * + * Creates a new #GMemoryOutputStream, using g_realloc() and g_free() + * for memory allocation. + * + * Since: 2.36 + */ +GOutputStream * +g_memory_output_stream_new_resizable (void) +{ + return g_memory_output_stream_new (NULL, 0, g_realloc, g_free); +} + +/** + * 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: (transfer none): 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 (available 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; +} + +/** + * g_memory_output_stream_steal_data: + * @ostream: a #GMemoryOutputStream + * + * Gets any loaded data from the @ostream. Ownership of the data + * is transferred to the caller; when no longer needed it must be + * freed using the free function set in @ostream's + * #GMemoryOutputStream:destroy-function property. + * + * @ostream must be closed before calling this function. + * + * Returns: (transfer full): the stream's data + * + * Since: 2.26 + **/ +gpointer +g_memory_output_stream_steal_data (GMemoryOutputStream *ostream) +{ + gpointer data; + + g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (ostream), NULL); + g_return_val_if_fail (g_output_stream_is_closed (G_OUTPUT_STREAM (ostream)), NULL); + + data = ostream->priv->data; + ostream->priv->data = NULL; + + return data; +} + +/** + * g_memory_output_stream_steal_as_bytes: + * @ostream: a #GMemoryOutputStream + * + * Returns data from the @ostream as a #GBytes. @ostream must be + * closed before calling this function. + * + * Returns: (transfer full): the stream's data + * + * Since: 2.34 + **/ +GBytes * +g_memory_output_stream_steal_as_bytes (GMemoryOutputStream *ostream) +{ + GBytes *result; + + g_return_val_if_fail (G_IS_MEMORY_OUTPUT_STREAM (ostream), NULL); + g_return_val_if_fail (g_output_stream_is_closed (G_OUTPUT_STREAM (ostream)), NULL); + + result = g_bytes_new_with_free_func (ostream->priv->data, + ostream->priv->valid_len, + ostream->priv->destroy, + ostream->priv->data); + ostream->priv->data = NULL; + + return result; +} + +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_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, data); + + /* will always return TRUE */ + g_memory_output_stream_close (stream, cancellable, NULL); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static gboolean +g_memory_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +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; +} + +static gboolean +g_memory_output_stream_is_writable (GPollableOutputStream *stream) +{ + return TRUE; +} + +static GSource * +g_memory_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable) +{ + GSource *base_source, *pollable_source; + + base_source = g_timeout_source_new (0); + pollable_source = g_pollable_source_new_full (stream, base_source, + cancellable); + g_source_unref (base_source); + + return pollable_source; +} diff --git a/gio/gmemoryoutputstream.h b/gio/gmemoryoutputstream.h new file mode 100644 index 0000000..b95d101 --- /dev/null +++ b/gio/gmemoryoutputstream.h @@ -0,0 +1,109 @@ +/* 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 + */ + +#ifndef __G_MEMORY_OUTPUT_STREAM_H__ +#define __G_MEMORY_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); + +GLIB_AVAILABLE_IN_ALL +GType g_memory_output_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GOutputStream *g_memory_output_stream_new (gpointer data, + gsize size, + GReallocFunc realloc_function, + GDestroyNotify destroy_function); +GLIB_AVAILABLE_IN_2_36 +GOutputStream *g_memory_output_stream_new_resizable (void); +GLIB_AVAILABLE_IN_ALL +gpointer g_memory_output_stream_get_data (GMemoryOutputStream *ostream); +GLIB_AVAILABLE_IN_ALL +gsize g_memory_output_stream_get_size (GMemoryOutputStream *ostream); +GLIB_AVAILABLE_IN_ALL +gsize g_memory_output_stream_get_data_size (GMemoryOutputStream *ostream); +GLIB_AVAILABLE_IN_ALL +gpointer g_memory_output_stream_steal_data (GMemoryOutputStream *ostream); + +GLIB_AVAILABLE_IN_2_34 +GBytes * g_memory_output_stream_steal_as_bytes (GMemoryOutputStream *ostream); + +G_END_DECLS + +#endif /* __G_MEMORY_OUTPUT_STREAM_H__ */ diff --git a/gio/gmemorysettingsbackend.c b/gio/gmemorysettingsbackend.c new file mode 100644 index 0000000..14e3fcd --- /dev/null +++ b/gio/gmemorysettingsbackend.c @@ -0,0 +1,194 @@ +/* + * 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 "config.h" + +#include "gsimplepermission.h" +#include "gsettingsbackendinternal.h" +#include "giomodule.h" + + +#define G_TYPE_MEMORY_SETTINGS_BACKEND (g_memory_settings_backend_get_type()) +#define G_MEMORY_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MEMORY_SETTINGS_BACKEND, \ + GMemorySettingsBackend)) + +typedef GSettingsBackendClass GMemorySettingsBackendClass; +typedef struct +{ + GSettingsBackend parent_instance; + GHashTable *table; +} GMemorySettingsBackend; + +G_DEFINE_TYPE_WITH_CODE (GMemorySettingsBackend, + g_memory_settings_backend, + G_TYPE_SETTINGS_BACKEND, + g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, "memory", 10)) + +static GVariant * +g_memory_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend); + GVariant *value; + + if (default_value) + return NULL; + + value = g_hash_table_lookup (memory->table, key); + + if (value != NULL) + g_variant_ref (value); + + return value; +} + +static gboolean +g_memory_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend); + GVariant *old_value; + + old_value = g_hash_table_lookup (memory->table, key); + g_variant_ref_sink (value); + + if (old_value == NULL || !g_variant_equal (value, old_value)) + { + g_hash_table_insert (memory->table, g_strdup (key), value); + g_settings_backend_changed (backend, key, origin_tag); + } + else + g_variant_unref (value); + + return TRUE; +} + +static gboolean +g_memory_settings_backend_write_one (gpointer key, + gpointer value, + gpointer data) +{ + GMemorySettingsBackend *memory = data; + + if (value != NULL) + g_hash_table_insert (memory->table, g_strdup (key), g_variant_ref (value)); + else + g_hash_table_remove (memory->table, key); + + return FALSE; +} + +static gboolean +g_memory_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + g_tree_foreach (tree, g_memory_settings_backend_write_one, backend); + g_settings_backend_changed_tree (backend, tree, origin_tag); + + return TRUE; +} + +static void +g_memory_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (backend); + + if (g_hash_table_lookup (memory->table, key)) + { + g_hash_table_remove (memory->table, key); + g_settings_backend_changed (backend, key, origin_tag); + } +} + +static gboolean +g_memory_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *name) +{ + return TRUE; +} + +static GPermission * +g_memory_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + return g_simple_permission_new (TRUE); +} + +static void +g_memory_settings_backend_finalize (GObject *object) +{ + GMemorySettingsBackend *memory = G_MEMORY_SETTINGS_BACKEND (object); + + g_hash_table_unref (memory->table); + + G_OBJECT_CLASS (g_memory_settings_backend_parent_class) + ->finalize (object); +} + +static void +g_memory_settings_backend_init (GMemorySettingsBackend *memory) +{ + memory->table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, + (GDestroyNotify) g_variant_unref); +} + +static void +g_memory_settings_backend_class_init (GMemorySettingsBackendClass *class) +{ + GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + backend_class->read = g_memory_settings_backend_read; + backend_class->write = g_memory_settings_backend_write; + backend_class->write_tree = g_memory_settings_backend_write_tree; + backend_class->reset = g_memory_settings_backend_reset; + backend_class->get_writable = g_memory_settings_backend_get_writable; + backend_class->get_permission = g_memory_settings_backend_get_permission; + object_class->finalize = g_memory_settings_backend_finalize; +} + +/** + * g_memory_settings_backend_new: + * + * Creates a memory-backed #GSettingsBackend. + * + * This backend allows changes to settings, but does not write them + * to any backing storage, so the next time you run your application, + * the memory backend will start out with the default values again. + * + * Returns: (transfer full): a newly created #GSettingsBackend + * + * Since: 2.28 + */ +GSettingsBackend * +g_memory_settings_backend_new (void) +{ + return g_object_new (G_TYPE_MEMORY_SETTINGS_BACKEND, NULL); +} diff --git a/gio/gmenu.c b/gio/gmenu.c new file mode 100644 index 0000000..d0b4130 --- /dev/null +++ b/gio/gmenu.c @@ -0,0 +1,1336 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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 "gmenu.h" + +#include + +/** + * SECTION:gmenu + * @title: GMenu + * @short_description: A simple implementation of GMenuModel + * + * #GMenu is a simple implementation of #GMenuModel. + * You populate a #GMenu by adding #GMenuItem instances to it. + * + * There are some convenience functions to allow you to directly + * add items (avoiding #GMenuItem) for the common cases. To add + * a regular item, use g_menu_insert(). To add a section, use + * g_menu_insert_section(). To add a submenu, use + * g_menu_insert_submenu(). + */ + +/** + * GMenu: + * + * #GMenu is an opaque structure type. You must access it using the + * functions below. + * + * Since: 2.32 + */ + +/** + * GMenuItem: + * + * #GMenuItem is an opaque structure type. You must access it using the + * functions below. + * + * Since: 2.32 + */ + +struct _GMenuItem +{ + GObject parent_instance; + + GHashTable *attributes; + GHashTable *links; + gboolean cow; +}; + +typedef GObjectClass GMenuItemClass; + +struct _GMenu +{ + GMenuModel parent_instance; + + GArray *items; + gboolean mutable; +}; + +typedef GMenuModelClass GMenuClass; + +G_DEFINE_TYPE (GMenu, g_menu, G_TYPE_MENU_MODEL) +G_DEFINE_TYPE (GMenuItem, g_menu_item, G_TYPE_OBJECT) + +struct item +{ + GHashTable *attributes; + GHashTable *links; +}; + +static gboolean +g_menu_is_mutable (GMenuModel *model) +{ + GMenu *menu = G_MENU (model); + + return menu->mutable; +} + +static gint +g_menu_get_n_items (GMenuModel *model) +{ + GMenu *menu = G_MENU (model); + + return menu->items->len; +} + +static void +g_menu_get_item_attributes (GMenuModel *model, + gint position, + GHashTable **table) +{ + GMenu *menu = G_MENU (model); + + *table = g_hash_table_ref (g_array_index (menu->items, struct item, position).attributes); +} + +static void +g_menu_get_item_links (GMenuModel *model, + gint position, + GHashTable **table) +{ + GMenu *menu = G_MENU (model); + + *table = g_hash_table_ref (g_array_index (menu->items, struct item, position).links); +} + +/** + * g_menu_insert_item: + * @menu: a #GMenu + * @position: the position at which to insert the item + * @item: the #GMenuItem to insert + * + * Inserts @item into @menu. + * + * The "insertion" is actually done by copying all of the attribute and + * link values of @item and using them to form a new item within @menu. + * As such, @item itself is not really inserted, but rather, a menu item + * that is exactly the same as the one presently described by @item. + * + * This means that @item is essentially useless after the insertion + * occurs. Any changes you make to it are ignored unless it is inserted + * again (at which point its updated values will be copied). + * + * You should probably just free @item once you're done. + * + * There are many convenience functions to take care of common cases. + * See g_menu_insert(), g_menu_insert_section() and + * g_menu_insert_submenu() as well as "prepend" and "append" variants of + * each of these functions. + * + * Since: 2.32 + */ +void +g_menu_insert_item (GMenu *menu, + gint position, + GMenuItem *item) +{ + struct item new_item; + + g_return_if_fail (G_IS_MENU (menu)); + g_return_if_fail (G_IS_MENU_ITEM (item)); + + if (position < 0 || position > menu->items->len) + position = menu->items->len; + + new_item.attributes = g_hash_table_ref (item->attributes); + new_item.links = g_hash_table_ref (item->links); + item->cow = TRUE; + + g_array_insert_val (menu->items, position, new_item); + g_menu_model_items_changed (G_MENU_MODEL (menu), position, 0, 1); +} + +/** + * g_menu_prepend_item: + * @menu: a #GMenu + * @item: a #GMenuItem to prepend + * + * Prepends @item to the start of @menu. + * + * See g_menu_insert_item() for more information. + * + * Since: 2.32 + */ +void +g_menu_prepend_item (GMenu *menu, + GMenuItem *item) +{ + g_menu_insert_item (menu, 0, item); +} + +/** + * g_menu_append_item: + * @menu: a #GMenu + * @item: a #GMenuItem to append + * + * Appends @item to the end of @menu. + * + * See g_menu_insert_item() for more information. + * + * Since: 2.32 + */ +void +g_menu_append_item (GMenu *menu, + GMenuItem *item) +{ + g_menu_insert_item (menu, -1, item); +} + +/** + * g_menu_freeze: + * @menu: a #GMenu + * + * Marks @menu as frozen. + * + * After the menu is frozen, it is an error to attempt to make any + * changes to it. In effect this means that the #GMenu API must no + * longer be used. + * + * This function causes g_menu_model_is_mutable() to begin returning + * %FALSE, which has some positive performance implications. + * + * Since: 2.32 + */ +void +g_menu_freeze (GMenu *menu) +{ + g_return_if_fail (G_IS_MENU (menu)); + + menu->mutable = FALSE; +} + +/** + * g_menu_new: + * + * Creates a new #GMenu. + * + * The new menu has no items. + * + * Returns: a new #GMenu + * + * Since: 2.32 + */ +GMenu * +g_menu_new (void) +{ + return g_object_new (G_TYPE_MENU, NULL); +} + +/** + * g_menu_insert: + * @menu: a #GMenu + * @position: the position at which to insert the item + * @label: (allow-none): the section label, or %NULL + * @detailed_action: (allow-none): the detailed action string, or %NULL + * + * Convenience function for inserting a normal menu item into @menu. + * Combine g_menu_item_new() and g_menu_insert_item() for a more flexible + * alternative. + * + * Since: 2.32 + */ +void +g_menu_insert (GMenu *menu, + gint position, + const gchar *label, + const gchar *detailed_action) +{ + GMenuItem *menu_item; + + menu_item = g_menu_item_new (label, detailed_action); + g_menu_insert_item (menu, position, menu_item); + g_object_unref (menu_item); +} + +/** + * g_menu_prepend: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @detailed_action: (allow-none): the detailed action string, or %NULL + * + * Convenience function for prepending a normal menu item to the start + * of @menu. Combine g_menu_item_new() and g_menu_insert_item() for a more + * flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_prepend (GMenu *menu, + const gchar *label, + const gchar *detailed_action) +{ + g_menu_insert (menu, 0, label, detailed_action); +} + +/** + * g_menu_append: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @detailed_action: (allow-none): the detailed action string, or %NULL + * + * Convenience function for appending a normal menu item to the end of + * @menu. Combine g_menu_item_new() and g_menu_insert_item() for a more + * flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_append (GMenu *menu, + const gchar *label, + const gchar *detailed_action) +{ + g_menu_insert (menu, -1, label, detailed_action); +} + +/** + * g_menu_insert_section: + * @menu: a #GMenu + * @position: the position at which to insert the item + * @label: (allow-none): the section label, or %NULL + * @section: a #GMenuModel with the items of the section + * + * Convenience function for inserting a section menu item into @menu. + * Combine g_menu_item_new_section() and g_menu_insert_item() for a more + * flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_insert_section (GMenu *menu, + gint position, + const gchar *label, + GMenuModel *section) +{ + GMenuItem *menu_item; + + menu_item = g_menu_item_new_section (label, section); + g_menu_insert_item (menu, position, menu_item); + g_object_unref (menu_item); +} + + +/** + * g_menu_prepend_section: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @section: a #GMenuModel with the items of the section + * + * Convenience function for prepending a section menu item to the start + * of @menu. Combine g_menu_item_new_section() and g_menu_insert_item() for + * a more flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_prepend_section (GMenu *menu, + const gchar *label, + GMenuModel *section) +{ + g_menu_insert_section (menu, 0, label, section); +} + +/** + * g_menu_append_section: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @section: a #GMenuModel with the items of the section + * + * Convenience function for appending a section menu item to the end of + * @menu. Combine g_menu_item_new_section() and g_menu_insert_item() for a + * more flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_append_section (GMenu *menu, + const gchar *label, + GMenuModel *section) +{ + g_menu_insert_section (menu, -1, label, section); +} + +/** + * g_menu_insert_submenu: + * @menu: a #GMenu + * @position: the position at which to insert the item + * @label: (allow-none): the section label, or %NULL + * @submenu: a #GMenuModel with the items of the submenu + * + * Convenience function for inserting a submenu menu item into @menu. + * Combine g_menu_item_new_submenu() and g_menu_insert_item() for a more + * flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_insert_submenu (GMenu *menu, + gint position, + const gchar *label, + GMenuModel *submenu) +{ + GMenuItem *menu_item; + + menu_item = g_menu_item_new_submenu (label, submenu); + g_menu_insert_item (menu, position, menu_item); + g_object_unref (menu_item); +} + +/** + * g_menu_prepend_submenu: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @submenu: a #GMenuModel with the items of the submenu + * + * Convenience function for prepending a submenu menu item to the start + * of @menu. Combine g_menu_item_new_submenu() and g_menu_insert_item() for + * a more flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_prepend_submenu (GMenu *menu, + const gchar *label, + GMenuModel *submenu) +{ + g_menu_insert_submenu (menu, 0, label, submenu); +} + +/** + * g_menu_append_submenu: + * @menu: a #GMenu + * @label: (allow-none): the section label, or %NULL + * @submenu: a #GMenuModel with the items of the submenu + * + * Convenience function for appending a submenu menu item to the end of + * @menu. Combine g_menu_item_new_submenu() and g_menu_insert_item() for a + * more flexible alternative. + * + * Since: 2.32 + */ +void +g_menu_append_submenu (GMenu *menu, + const gchar *label, + GMenuModel *submenu) +{ + g_menu_insert_submenu (menu, -1, label, submenu); +} + +static void +g_menu_clear_item (struct item *item) +{ + if (item->attributes != NULL) + g_hash_table_unref (item->attributes); + if (item->links != NULL) + g_hash_table_unref (item->links); +} + +/** + * g_menu_remove: + * @menu: a #GMenu + * @position: the position of the item to remove + * + * Removes an item from the menu. + * + * @position gives the index of the item to remove. + * + * It is an error if position is not in range the range from 0 to one + * less than the number of items in the menu. + * + * It is not possible to remove items by identity since items are added + * to the menu simply by copying their links and attributes (ie: + * identity of the item itself is not preserved). + * + * Since: 2.32 + */ +void +g_menu_remove (GMenu *menu, + gint position) +{ + g_return_if_fail (G_IS_MENU (menu)); + g_return_if_fail (0 <= position && position < menu->items->len); + + g_menu_clear_item (&g_array_index (menu->items, struct item, position)); + g_array_remove_index (menu->items, position); + g_menu_model_items_changed (G_MENU_MODEL (menu), position, 1, 0); +} + +static void +g_menu_finalize (GObject *object) +{ + GMenu *menu = G_MENU (object); + struct item *items; + gint n_items; + gint i; + + n_items = menu->items->len; + items = (struct item *) g_array_free (menu->items, FALSE); + for (i = 0; i < n_items; i++) + g_menu_clear_item (&items[i]); + g_free (items); + + G_OBJECT_CLASS (g_menu_parent_class) + ->finalize (object); +} + +static void +g_menu_init (GMenu *menu) +{ + menu->items = g_array_new (FALSE, FALSE, sizeof (struct item)); + menu->mutable = TRUE; +} + +static void +g_menu_class_init (GMenuClass *class) +{ + GMenuModelClass *model_class = G_MENU_MODEL_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_menu_finalize; + + model_class->is_mutable = g_menu_is_mutable; + model_class->get_n_items = g_menu_get_n_items; + model_class->get_item_attributes = g_menu_get_item_attributes; + model_class->get_item_links = g_menu_get_item_links; +} + + +static void +g_menu_item_clear_cow (GMenuItem *menu_item) +{ + if (menu_item->cow) + { + GHashTableIter iter; + GHashTable *new; + gpointer key; + gpointer val; + + new = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + g_hash_table_iter_init (&iter, menu_item->attributes); + while (g_hash_table_iter_next (&iter, &key, &val)) + g_hash_table_insert (new, g_strdup (key), g_variant_ref (val)); + g_hash_table_unref (menu_item->attributes); + menu_item->attributes = new; + + new = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); + g_hash_table_iter_init (&iter, menu_item->links); + while (g_hash_table_iter_next (&iter, &key, &val)) + g_hash_table_insert (new, g_strdup (key), g_object_ref (val)); + g_hash_table_unref (menu_item->links); + menu_item->links = new; + + menu_item->cow = FALSE; + } +} + +static void +g_menu_item_finalize (GObject *object) +{ + GMenuItem *menu_item = G_MENU_ITEM (object); + + g_hash_table_unref (menu_item->attributes); + g_hash_table_unref (menu_item->links); + + G_OBJECT_CLASS (g_menu_item_parent_class) + ->finalize (object); +} + +static void +g_menu_item_init (GMenuItem *menu_item) +{ + menu_item->attributes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + menu_item->links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); + menu_item->cow = FALSE; +} + +static void +g_menu_item_class_init (GMenuItemClass *class) +{ + class->finalize = g_menu_item_finalize; +} + +/* We treat attribute names the same as GSettings keys: + * - only lowercase ascii, digits and '-' + * - must start with lowercase + * - must not end with '-' + * - no consecutive '-' + * - not longer than 1024 chars + */ +static gboolean +valid_attribute_name (const gchar *name) +{ + gint i; + + if (!g_ascii_islower (name[0])) + return FALSE; + + for (i = 1; name[i]; i++) + { + if (name[i] != '-' && + !g_ascii_islower (name[i]) && + !g_ascii_isdigit (name[i])) + return FALSE; + + if (name[i] == '-' && name[i + 1] == '-') + return FALSE; + } + + if (name[i - 1] == '-') + return FALSE; + + if (i > 1024) + return FALSE; + + return TRUE; +} + +/** + * g_menu_item_set_attribute_value: + * @menu_item: a #GMenuItem + * @attribute: the attribute to set + * @value: (allow-none): a #GVariant to use as the value, or %NULL + * + * Sets or unsets an attribute on @menu_item. + * + * The attribute to set or unset is specified by @attribute. This + * can be one of the standard attribute names %G_MENU_ATTRIBUTE_LABEL, + * %G_MENU_ATTRIBUTE_ACTION, %G_MENU_ATTRIBUTE_TARGET, or a custom + * attribute name. + * Attribute names are restricted to lowercase characters, numbers + * and '-'. Furthermore, the names must begin with a lowercase character, + * must not end with a '-', and must not contain consecutive dashes. + * + * must consist only of lowercase + * ASCII characters, digits and '-'. + * + * If @value is non-%NULL then it is used as the new value for the + * attribute. If @value is %NULL then the attribute is unset. If + * the @value #GVariant is floating, it is consumed. + * + * See also g_menu_item_set_attribute() for a more convenient way to do + * the same. + * + * Since: 2.32 + */ +void +g_menu_item_set_attribute_value (GMenuItem *menu_item, + const gchar *attribute, + GVariant *value) +{ + g_return_if_fail (G_IS_MENU_ITEM (menu_item)); + g_return_if_fail (attribute != NULL); + g_return_if_fail (valid_attribute_name (attribute)); + + g_menu_item_clear_cow (menu_item); + + if (value != NULL) + g_hash_table_insert (menu_item->attributes, g_strdup (attribute), g_variant_ref_sink (value)); + else + g_hash_table_remove (menu_item->attributes, attribute); +} + +/** + * g_menu_item_set_attribute: + * @menu_item: a #GMenuItem + * @attribute: the attribute to set + * @format_string: (allow-none): a #GVariant format string, or %NULL + * @...: positional parameters, as per @format_string + * + * Sets or unsets an attribute on @menu_item. + * + * The attribute to set or unset is specified by @attribute. This + * can be one of the standard attribute names %G_MENU_ATTRIBUTE_LABEL, + * %G_MENU_ATTRIBUTE_ACTION, %G_MENU_ATTRIBUTE_TARGET, or a custom + * attribute name. + * Attribute names are restricted to lowercase characters, numbers + * and '-'. Furthermore, the names must begin with a lowercase character, + * must not end with a '-', and must not contain consecutive dashes. + * + * If @format_string is non-%NULL then the proper position parameters + * are collected to create a #GVariant instance to use as the attribute + * value. If it is %NULL then the positional parameterrs are ignored + * and the named attribute is unset. + * + * See also g_menu_item_set_attribute_value() for an equivalent call + * that directly accepts a #GVariant. + * + * Since: 2.32 + */ +void +g_menu_item_set_attribute (GMenuItem *menu_item, + const gchar *attribute, + const gchar *format_string, + ...) +{ + GVariant *value; + + if (format_string != NULL) + { + va_list ap; + + va_start (ap, format_string); + value = g_variant_new_va (format_string, NULL, &ap); + va_end (ap); + } + else + value = NULL; + + g_menu_item_set_attribute_value (menu_item, attribute, value); +} + +/** + * g_menu_item_set_link: + * @menu_item: a #GMenuItem + * @link: type of link to establish or unset + * @model: (allow-none): the #GMenuModel to link to (or %NULL to unset) + * + * Creates a link from @menu_item to @model if non-%NULL, or unsets it. + * + * Links are used to establish a relationship between a particular menu + * item and another menu. For example, %G_MENU_LINK_SUBMENU is used to + * associate a submenu with a particular menu item, and %G_MENU_LINK_SECTION + * is used to create a section. Other types of link can be used, but there + * is no guarantee that clients will be able to make sense of them. + * Link types are restricted to lowercase characters, numbers + * and '-'. Furthermore, the names must begin with a lowercase character, + * must not end with a '-', and must not contain consecutive dashes. + * + * Since: 2.32 + */ +void +g_menu_item_set_link (GMenuItem *menu_item, + const gchar *link, + GMenuModel *model) +{ + g_return_if_fail (G_IS_MENU_ITEM (menu_item)); + g_return_if_fail (link != NULL); + g_return_if_fail (valid_attribute_name (link)); + + g_menu_item_clear_cow (menu_item); + + if (model != NULL) + g_hash_table_insert (menu_item->links, g_strdup (link), g_object_ref (model)); + else + g_hash_table_remove (menu_item->links, link); +} + +/** + * g_menu_item_get_attribute_value: + * @menu_item: a #GMenuItem + * @attribute: the attribute name to query + * @expected_type: (allow-none): the expected type of the attribute + * + * Queries the named @attribute on @menu_item. + * + * If @expected_type is specified and the attribute does not have this + * type, %NULL is returned. %NULL is also returned if the attribute + * simply does not exist. + * + * Returns: (transfer full): the attribute value, or %NULL + * + * Since: 2.34 + */ +GVariant * +g_menu_item_get_attribute_value (GMenuItem *menu_item, + const gchar *attribute, + const GVariantType *expected_type) +{ + GVariant *value; + + g_return_val_if_fail (G_IS_MENU_ITEM (menu_item), NULL); + g_return_val_if_fail (attribute != NULL, NULL); + + value = g_hash_table_lookup (menu_item->attributes, attribute); + + if (value != NULL) + { + if (expected_type == NULL || g_variant_is_of_type (value, expected_type)) + g_variant_ref (value); + else + value = NULL; + } + + return value; +} + +/** + * g_menu_item_get_attribute: + * @menu_item: a #GMenuItem + * @attribute: the attribute name to query + * @format_string: a #GVariant format string + * @...: positional parameters, as per @format_string + * + * Queries the named @attribute on @menu_item. + * + * If the attribute exists and matches the #GVariantType corresponding + * to @format_string then @format_string is used to deconstruct the + * value into the positional parameters and %TRUE is returned. + * + * If the attribute does not exist, or it does exist but has the wrong + * type, then the positional parameters are ignored and %FALSE is + * returned. + * + * Returns: %TRUE if the named attribute was found with the expected + * type + * + * Since: 2.34 + */ +gboolean +g_menu_item_get_attribute (GMenuItem *menu_item, + const gchar *attribute, + const gchar *format_string, + ...) +{ + GVariant *value; + va_list ap; + + g_return_val_if_fail (G_IS_MENU_ITEM (menu_item), FALSE); + g_return_val_if_fail (attribute != NULL, FALSE); + g_return_val_if_fail (format_string != NULL, FALSE); + + value = g_hash_table_lookup (menu_item->attributes, attribute); + + if (value == NULL) + return FALSE; + + if (!g_variant_check_format_string (value, format_string, FALSE)) + return FALSE; + + va_start (ap, format_string); + g_variant_get_va (value, format_string, NULL, &ap); + va_end (ap); + + return TRUE; +} + +/** + * g_menu_item_get_link: + * @menu_item: a #GMenuItem + * @link: the link name to query + * + * Queries the named @link on @menu_item. + * + * Returns: (transfer full): the link, or %NULL + * + * Since: 2.34 + */ +GMenuModel * +g_menu_item_get_link (GMenuItem *menu_item, + const gchar *link) +{ + GMenuModel *model; + + g_return_val_if_fail (G_IS_MENU_ITEM (menu_item), NULL); + g_return_val_if_fail (link != NULL, NULL); + g_return_val_if_fail (valid_attribute_name (link), NULL); + + model = g_hash_table_lookup (menu_item->links, link); + + if (model) + g_object_ref (model); + + return model; +} + +/** + * g_menu_item_set_label: + * @menu_item: a #GMenuItem + * @label: (allow-none): the label to set, or %NULL to unset + * + * Sets or unsets the "label" attribute of @menu_item. + * + * If @label is non-%NULL it is used as the label for the menu item. If + * it is %NULL then the label attribute is unset. + * + * Since: 2.32 + */ +void +g_menu_item_set_label (GMenuItem *menu_item, + const gchar *label) +{ + GVariant *value; + + if (label != NULL) + value = g_variant_new_string (label); + else + value = NULL; + + g_menu_item_set_attribute_value (menu_item, G_MENU_ATTRIBUTE_LABEL, value); +} + +/** + * g_menu_item_set_submenu: + * @menu_item: a #GMenuItem + * @submenu: (allow-none): a #GMenuModel, or %NULL + * + * Sets or unsets the "submenu" link of @menu_item to @submenu. + * + * If @submenu is non-%NULL, it is linked to. If it is %NULL then the + * link is unset. + * + * The effect of having one menu appear as a submenu of another is + * exactly as it sounds. + * + * Since: 2.32 + */ +void +g_menu_item_set_submenu (GMenuItem *menu_item, + GMenuModel *submenu) +{ + g_menu_item_set_link (menu_item, G_MENU_LINK_SUBMENU, submenu); +} + +/** + * g_menu_item_set_section: + * @menu_item: a #GMenuItem + * @section: (allow-none): a #GMenuModel, or %NULL + * + * Sets or unsets the "section" link of @menu_item to @section. + * + * The effect of having one menu appear as a section of another is + * exactly as it sounds: the items from @section become a direct part of + * the menu that @menu_item is added to. See g_menu_item_new_section() + * for more information about what it means for a menu item to be a + * section. + * + * Since: 2.32 + */ +void +g_menu_item_set_section (GMenuItem *menu_item, + GMenuModel *section) +{ + g_menu_item_set_link (menu_item, G_MENU_LINK_SECTION, section); +} + +/** + * g_menu_item_set_action_and_target_value: + * @menu_item: a #GMenuItem + * @action: (allow-none): the name of the action for this item + * @target_value: (allow-none): a #GVariant to use as the action target + * + * Sets or unsets the "action" and "target" attributes of @menu_item. + * + * If @action is %NULL then both the "action" and "target" attributes + * are unset (and @target_value is ignored). + * + * If @action is non-%NULL then the "action" attribute is set. The + * "target" attribute is then set to the value of @target_value if it is + * non-%NULL or unset otherwise. + * + * Normal menu items (ie: not submenu, section or other custom item + * types) are expected to have the "action" attribute set to identify + * the action that they are associated with. The state type of the + * action help to determine the disposition of the menu item. See + * #GAction and #GActionGroup for an overview of actions. + * + * In general, clicking on the menu item will result in activation of + * the named action with the "target" attribute given as the parameter + * to the action invocation. If the "target" attribute is not set then + * the action is invoked with no parameter. + * + * If the action has no state then the menu item is usually drawn as a + * plain menu item (ie: with no additional decoration). + * + * If the action has a boolean state then the menu item is usually drawn + * as a toggle menu item (ie: with a checkmark or equivalent + * indication). The item should be marked as 'toggled' or 'checked' + * when the boolean state is %TRUE. + * + * If the action has a string state then the menu item is usually drawn + * as a radio menu item (ie: with a radio bullet or equivalent + * indication). The item should be marked as 'selected' when the string + * state is equal to the value of the @target property. + * + * See g_menu_item_set_action_and_target() or + * g_menu_item_set_detailed_action() for two equivalent calls that are + * probably more convenient for most uses. + * + * Since: 2.32 + */ +void +g_menu_item_set_action_and_target_value (GMenuItem *menu_item, + const gchar *action, + GVariant *target_value) +{ + GVariant *action_value; + + if (action != NULL) + { + action_value = g_variant_new_string (action); + } + else + { + action_value = NULL; + target_value = NULL; + } + + g_menu_item_set_attribute_value (menu_item, G_MENU_ATTRIBUTE_ACTION, action_value); + g_menu_item_set_attribute_value (menu_item, G_MENU_ATTRIBUTE_TARGET, target_value); +} + +/** + * g_menu_item_set_action_and_target: + * @menu_item: a #GMenuItem + * @action: (allow-none): the name of the action for this item + * @format_string: (allow-none): a GVariant format string + * @...: positional parameters, as per @format_string + * + * Sets or unsets the "action" and "target" attributes of @menu_item. + * + * If @action is %NULL then both the "action" and "target" attributes + * are unset (and @format_string is ignored along with the positional + * parameters). + * + * If @action is non-%NULL then the "action" attribute is set. + * @format_string is then inspected. If it is non-%NULL then the proper + * position parameters are collected to create a #GVariant instance to + * use as the target value. If it is %NULL then the positional + * parameters are ignored and the "target" attribute is unset. + * + * See also g_menu_item_set_action_and_target_value() for an equivalent + * call that directly accepts a #GVariant. See + * g_menu_item_set_detailed_action() for a more convenient version that + * works with string-typed targets. + * + * See also g_menu_item_set_action_and_target_value() for a + * description of the semantics of the action and target attributes. + * + * Since: 2.32 + */ +void +g_menu_item_set_action_and_target (GMenuItem *menu_item, + const gchar *action, + const gchar *format_string, + ...) +{ + GVariant *value; + + if (format_string != NULL) + { + va_list ap; + + va_start (ap, format_string); + value = g_variant_new_va (format_string, NULL, &ap); + va_end (ap); + } + else + value = NULL; + + g_menu_item_set_action_and_target_value (menu_item, action, value); +} + +/** + * g_menu_item_set_detailed_action: + * @menu_item: a #GMenuItem + * @detailed_action: the "detailed" action string + * + * Sets the "action" and possibly the "target" attribute of @menu_item. + * + * If @detailed_action contains a double colon ("::") then it is used as + * a separator between an action name and a target string. In this + * case, this call is equivalent to calling + * g_menu_item_set_action_and_target() with the part before the "::" and + * with a string-type #GVariant containing the part following the "::". + * + * If @detailed_action doesn't contain "::" then the action is set to + * the given string (verbatim) and the target value is unset. + * + * See g_menu_item_set_action_and_target() or + * g_menu_item_set_action_and_target_value() for more flexible (but + * slightly less convenient) alternatives. + * + * See also g_menu_item_set_action_and_target_value() for a description of + * the semantics of the action and target attributes. + * + * Since: 2.32 + */ +void +g_menu_item_set_detailed_action (GMenuItem *menu_item, + const gchar *detailed_action) +{ + const gchar *sep; + + sep = strstr (detailed_action, "::"); + + if (sep != NULL) + { + gchar *action; + + action = g_strndup (detailed_action, sep - detailed_action); + g_menu_item_set_action_and_target (menu_item, action, "s", sep + 2); + g_free (action); + } + + else + g_menu_item_set_action_and_target_value (menu_item, detailed_action, NULL); +} + +/** + * g_menu_item_new: + * @label: (allow-none): the section label, or %NULL + * @detailed_action: (allow-none): the detailed action string, or %NULL + * + * Creates a new #GMenuItem. + * + * If @label is non-%NULL it is used to set the "label" attribute of the + * new item. + * + * If @detailed_action is non-%NULL it is used to set the "action" and + * possibly the "target" attribute of the new item. See + * g_menu_item_set_detailed_action() for more information. + * + * Returns: a new #GMenuItem + * + * Since: 2.32 + */ +GMenuItem * +g_menu_item_new (const gchar *label, + const gchar *detailed_action) +{ + GMenuItem *menu_item; + + menu_item = g_object_new (G_TYPE_MENU_ITEM, NULL); + + if (label != NULL) + g_menu_item_set_label (menu_item, label); + + if (detailed_action != NULL) + g_menu_item_set_detailed_action (menu_item, detailed_action); + + return menu_item; +} + +/** + * g_menu_item_new_submenu: + * @label: (allow-none): the section label, or %NULL + * @submenu: a #GMenuModel with the items of the submenu + * + * Creates a new #GMenuItem representing a submenu. + * + * This is a convenience API around g_menu_item_new() and + * g_menu_item_set_submenu(). + * + * Returns: a new #GMenuItem + * + * Since: 2.32 + */ +GMenuItem * +g_menu_item_new_submenu (const gchar *label, + GMenuModel *submenu) +{ + GMenuItem *menu_item; + + menu_item = g_object_new (G_TYPE_MENU_ITEM, NULL); + + if (label != NULL) + g_menu_item_set_label (menu_item, label); + + g_menu_item_set_submenu (menu_item, submenu); + + return menu_item; +} + +/** + * g_menu_item_new_section: + * @label: (allow-none): the section label, or %NULL + * @section: a #GMenuModel with the items of the section + * + * Creates a new #GMenuItem representing a section. + * + * This is a convenience API around g_menu_item_new() and + * g_menu_item_set_section(). + * + * The effect of having one menu appear as a section of another is + * exactly as it sounds: the items from @section become a direct part of + * the menu that @menu_item is added to. + * + * Visual separation is typically displayed between two non-empty + * sections. If @label is non-%NULL then it will be encorporated into + * this visual indication. This allows for labeled subsections of a + * menu. + * + * As a simple example, consider a typical "Edit" menu from a simple + * program. It probably contains an "Undo" and "Redo" item, followed by + * a separator, followed by "Cut", "Copy" and "Paste". + * + * This would be accomplished by creating three #GMenu instances. The + * first would be populated with the "Undo" and "Redo" items, and the + * second with the "Cut", "Copy" and "Paste" items. The first and + * second menus would then be added as submenus of the third. In XML + * format, this would look something like the following: + * + * + *
+ * + * + *
+ *
+ * + * + * + *
+ * + * ]]>
+ * + * The following example is exactly equivalent. It is more illustrative + * of the exact relationship between the menus and items (keeping in + * mind that the 'link' element defines a new menu that is linked to the + * containing one). The style of the second example is more verbose and + * difficult to read (and therefore not recommended except for the + * purpose of understanding what is really going on). + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * ]]> + * + * Returns: a new #GMenuItem + * + * Since: 2.32 + */ +GMenuItem * +g_menu_item_new_section (const gchar *label, + GMenuModel *section) +{ + GMenuItem *menu_item; + + menu_item = g_object_new (G_TYPE_MENU_ITEM, NULL); + + if (label != NULL) + g_menu_item_set_label (menu_item, label); + + g_menu_item_set_section (menu_item, section); + + return menu_item; +} + +/** + * g_menu_item_new_from_model: + * @model: a #GMenuModel + * @item_index: the index of an item in @model + * + * Creates a #GMenuItem as an exact copy of an existing menu item in a + * #GMenuModel. + * + * @item_index must be valid (ie: be sure to call + * g_menu_model_get_n_items() first). + * + * Returns: a new #GMenuItem. + * + * Since: 2.34 + */ +GMenuItem * +g_menu_item_new_from_model (GMenuModel *model, + gint item_index) +{ + GMenuModelClass *class = G_MENU_MODEL_GET_CLASS (model); + GMenuItem *menu_item; + + menu_item = g_object_new (G_TYPE_MENU_ITEM, NULL); + + /* With some trickery we can be pretty efficient. + * + * A GMenuModel must either implement iterate_item_attributes() or + * get_item_attributes(). If it implements get_item_attributes() then + * we are in luck -- we can just take a reference on the returned + * hashtable and mark ourselves as copy-on-write. + * + * In the case that the model is based on get_item_attributes (which + * is the case for both GMenu and GDBusMenuModel) then this is + * basically just g_hash_table_ref(). + */ + if (class->get_item_attributes) + { + GHashTable *attributes = NULL; + + class->get_item_attributes (model, item_index, &attributes); + if (attributes) + { + g_hash_table_unref (menu_item->attributes); + menu_item->attributes = attributes; + menu_item->cow = TRUE; + } + } + else + { + GMenuAttributeIter *iter; + const gchar *attribute; + GVariant *value; + + iter = g_menu_model_iterate_item_attributes (model, item_index); + while (g_menu_attribute_iter_get_next (iter, &attribute, &value)) + g_hash_table_insert (menu_item->attributes, g_strdup (attribute), value); + g_object_unref (iter); + } + + /* Same story for the links... */ + if (class->get_item_links) + { + GHashTable *links = NULL; + + class->get_item_links (model, item_index, &links); + if (links) + { + g_hash_table_unref (menu_item->links); + menu_item->links = links; + menu_item->cow = TRUE; + } + } + else + { + GMenuLinkIter *iter; + const gchar *link; + GMenuModel *value; + + iter = g_menu_model_iterate_item_links (model, item_index); + while (g_menu_link_iter_get_next (iter, &link, &value)) + g_hash_table_insert (menu_item->links, g_strdup (link), value); + g_object_unref (iter); + } + + return menu_item; +} diff --git a/gio/gmenu.h b/gio/gmenu.h new file mode 100644 index 0000000..729915d --- /dev/null +++ b/gio/gmenu.h @@ -0,0 +1,177 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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_MENU_H__ +#define __G_MENU_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_MENU (g_menu_get_type ()) +#define G_MENU(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MENU, GMenu)) +#define G_IS_MENU(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_MENU)) + +#define G_TYPE_MENU_ITEM (g_menu_item_get_type ()) +#define G_MENU_ITEM(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MENU_ITEM, GMenuItem)) +#define G_IS_MENU_ITEM(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_MENU_ITEM)) + +typedef struct _GMenuItem GMenuItem; +typedef struct _GMenu GMenu; + +GLIB_AVAILABLE_IN_2_32 +GType g_menu_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_32 +GMenu * g_menu_new (void); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_freeze (GMenu *menu); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_insert_item (GMenu *menu, + gint position, + GMenuItem *item); +GLIB_AVAILABLE_IN_2_32 +void g_menu_prepend_item (GMenu *menu, + GMenuItem *item); +GLIB_AVAILABLE_IN_2_32 +void g_menu_append_item (GMenu *menu, + GMenuItem *item); +GLIB_AVAILABLE_IN_2_32 +void g_menu_remove (GMenu *menu, + gint position); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_insert (GMenu *menu, + gint position, + const gchar *label, + const gchar *detailed_action); +GLIB_AVAILABLE_IN_2_32 +void g_menu_prepend (GMenu *menu, + const gchar *label, + const gchar *detailed_action); +GLIB_AVAILABLE_IN_2_32 +void g_menu_append (GMenu *menu, + const gchar *label, + const gchar *detailed_action); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_insert_section (GMenu *menu, + gint position, + const gchar *label, + GMenuModel *section); +GLIB_AVAILABLE_IN_2_32 +void g_menu_prepend_section (GMenu *menu, + const gchar *label, + GMenuModel *section); +GLIB_AVAILABLE_IN_2_32 +void g_menu_append_section (GMenu *menu, + const gchar *label, + GMenuModel *section); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_insert_submenu (GMenu *menu, + gint position, + const gchar *label, + GMenuModel *submenu); +GLIB_AVAILABLE_IN_2_32 +void g_menu_prepend_submenu (GMenu *menu, + const gchar *label, + GMenuModel *submenu); +GLIB_AVAILABLE_IN_2_32 +void g_menu_append_submenu (GMenu *menu, + const gchar *label, + GMenuModel *submenu); + + +GLIB_AVAILABLE_IN_2_32 +GType g_menu_item_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_32 +GMenuItem * g_menu_item_new (const gchar *label, + const gchar *detailed_action); + +GLIB_AVAILABLE_IN_2_34 +GMenuItem * g_menu_item_new_from_model (GMenuModel *model, + gint item_index); + +GLIB_AVAILABLE_IN_2_32 +GMenuItem * g_menu_item_new_submenu (const gchar *label, + GMenuModel *submenu); + +GLIB_AVAILABLE_IN_2_32 +GMenuItem * g_menu_item_new_section (const gchar *label, + GMenuModel *section); + +GLIB_AVAILABLE_IN_2_34 +GVariant * g_menu_item_get_attribute_value (GMenuItem *menu_item, + const gchar *attribute, + const GVariantType *expected_type); +GLIB_AVAILABLE_IN_2_34 +gboolean g_menu_item_get_attribute (GMenuItem *menu_item, + const gchar *attribute, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_2_34 +GMenuModel *g_menu_item_get_link (GMenuItem *menu_item, + const gchar *link); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_attribute_value (GMenuItem *menu_item, + const gchar *attribute, + GVariant *value); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_attribute (GMenuItem *menu_item, + const gchar *attribute, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_link (GMenuItem *menu_item, + const gchar *link, + GMenuModel *model); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_label (GMenuItem *menu_item, + const gchar *label); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_submenu (GMenuItem *menu_item, + GMenuModel *submenu); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_section (GMenuItem *menu_item, + GMenuModel *section); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_action_and_target_value (GMenuItem *menu_item, + const gchar *action, + GVariant *target_value); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_action_and_target (GMenuItem *menu_item, + const gchar *action, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_2_32 +void g_menu_item_set_detailed_action (GMenuItem *menu_item, + const gchar *detailed_action); + +G_END_DECLS + +#endif /* __G_MENU_H__ */ diff --git a/gio/gmenuexporter.c b/gio/gmenuexporter.c new file mode 100644 index 0000000..0f405ee --- /dev/null +++ b/gio/gmenuexporter.c @@ -0,0 +1,813 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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 "gmenuexporter.h" + +#include "gdbusmethodinvocation.h" +#include "gdbusintrospection.h" +#include "gdbusnamewatching.h" +#include "gdbuserror.h" + +/** + * SECTION:gmenuexporter + * @title: GMenuModel exporter + * @short_description: Export GMenuModels on D-Bus + * @see_also: #GMenuModel, #GDBusMenuModel + * + * These functions support exporting a #GMenuModel on D-Bus. + * The D-Bus interface that is used is a private implementation + * detail. + * + * To access an exported #GMenuModel remotely, use + * g_dbus_menu_model_get() to obtain a #GDBusMenuModel. + */ + +/* {{{1 D-Bus Interface description */ + +/* For documentation of this interface, see + * http://live.gnome.org/GTK+/GApplication-dbus-apis + */ + +static GDBusInterfaceInfo * +org_gtk_Menus_get_interface (void) +{ + static GDBusInterfaceInfo *interface_info; + + if (interface_info == NULL) + { + GError *error = NULL; + GDBusNodeInfo *info; + + info = g_dbus_node_info_new_for_xml ("" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " arg type='a(uuuuaa{sv})' name='changes'/>" + " " + " " + "", &error); + if (info == NULL) + g_error ("%s\n", error->message); + interface_info = g_dbus_node_info_lookup_interface (info, "org.gtk.Menus"); + g_assert (interface_info != NULL); + g_dbus_interface_info_ref (interface_info); + g_dbus_node_info_unref (info); + } + + return interface_info; +} + +/* {{{1 Forward declarations */ +typedef struct _GMenuExporterMenu GMenuExporterMenu; +typedef struct _GMenuExporterLink GMenuExporterLink; +typedef struct _GMenuExporterGroup GMenuExporterGroup; +typedef struct _GMenuExporterRemote GMenuExporterRemote; +typedef struct _GMenuExporterWatch GMenuExporterWatch; +typedef struct _GMenuExporter GMenuExporter; + +static gboolean g_menu_exporter_group_is_subscribed (GMenuExporterGroup *group); +static guint g_menu_exporter_group_get_id (GMenuExporterGroup *group); +static GMenuExporter * g_menu_exporter_group_get_exporter (GMenuExporterGroup *group); +static GMenuExporterMenu * g_menu_exporter_group_add_menu (GMenuExporterGroup *group, + GMenuModel *model); +static void g_menu_exporter_group_remove_menu (GMenuExporterGroup *group, + guint id); + +static GMenuExporterGroup * g_menu_exporter_create_group (GMenuExporter *exporter); +static GMenuExporterGroup * g_menu_exporter_lookup_group (GMenuExporter *exporter, + guint group_id); +static void g_menu_exporter_report (GMenuExporter *exporter, + GVariant *report); +static void g_menu_exporter_remove_group (GMenuExporter *exporter, + guint id); + +/* {{{1 GMenuExporterLink, GMenuExporterMenu */ + +struct _GMenuExporterMenu +{ + GMenuExporterGroup *group; + guint id; + + GMenuModel *model; + gulong handler_id; + GSequence *item_links; +}; + +struct _GMenuExporterLink +{ + gchar *name; + GMenuExporterMenu *menu; + GMenuExporterLink *next; +}; + +static void +g_menu_exporter_menu_free (GMenuExporterMenu *menu) +{ + g_menu_exporter_group_remove_menu (menu->group, menu->id); + + if (menu->handler_id != 0) + g_signal_handler_disconnect (menu->model, menu->handler_id); + + if (menu->item_links != NULL) + g_sequence_free (menu->item_links); + + g_object_unref (menu->model); + + g_slice_free (GMenuExporterMenu, menu); +} + +static void +g_menu_exporter_link_free (gpointer data) +{ + GMenuExporterLink *link = data; + + while (link != NULL) + { + GMenuExporterLink *tmp = link; + link = tmp->next; + + g_menu_exporter_menu_free (tmp->menu); + g_free (tmp->name); + + g_slice_free (GMenuExporterLink, tmp); + } +} + +static GMenuExporterLink * +g_menu_exporter_menu_create_links (GMenuExporterMenu *menu, + gint position) +{ + GMenuExporterLink *list = NULL; + GMenuLinkIter *iter; + const char *name; + GMenuModel *model; + + iter = g_menu_model_iterate_item_links (menu->model, position); + + while (g_menu_link_iter_get_next (iter, &name, &model)) + { + GMenuExporterGroup *group; + GMenuExporterLink *tmp; + + /* keep sections in the same group, but create new groups + * otherwise + */ + if (!g_str_equal (name, "section")) + group = g_menu_exporter_create_group (g_menu_exporter_group_get_exporter (menu->group)); + else + group = menu->group; + + tmp = g_slice_new (GMenuExporterLink); + tmp->name = g_strconcat (":", name, NULL); + tmp->menu = g_menu_exporter_group_add_menu (group, model); + tmp->next = list; + list = tmp; + + g_object_unref (model); + } + + g_object_unref (iter); + + return list; +} + +static GVariant * +g_menu_exporter_menu_describe_item (GMenuExporterMenu *menu, + gint position) +{ + GMenuAttributeIter *attr_iter; + GVariantBuilder builder; + GSequenceIter *iter; + GMenuExporterLink *link; + const char *name; + GVariant *value; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + + attr_iter = g_menu_model_iterate_item_attributes (menu->model, position); + while (g_menu_attribute_iter_get_next (attr_iter, &name, &value)) + { + g_variant_builder_add (&builder, "{sv}", name, value); + g_variant_unref (value); + } + g_object_unref (attr_iter); + + iter = g_sequence_get_iter_at_pos (menu->item_links, position); + for (link = g_sequence_get (iter); link; link = link->next) + g_variant_builder_add (&builder, "{sv}", link->name, + g_variant_new ("(uu)", g_menu_exporter_group_get_id (link->menu->group), link->menu->id)); + + return g_variant_builder_end (&builder); +} + +static GVariant * +g_menu_exporter_menu_list (GMenuExporterMenu *menu) +{ + GVariantBuilder builder; + gint i, n; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}")); + + n = g_sequence_get_length (menu->item_links); + for (i = 0; i < n; i++) + g_variant_builder_add_value (&builder, g_menu_exporter_menu_describe_item (menu, i)); + + return g_variant_builder_end (&builder); +} + +static void +g_menu_exporter_menu_items_changed (GMenuModel *model, + gint position, + gint removed, + gint added, + gpointer user_data) +{ + GMenuExporterMenu *menu = user_data; + GSequenceIter *point; + gint i; + + g_assert (menu->model == model); + g_assert (menu->item_links != NULL); + g_assert (position + removed <= g_sequence_get_length (menu->item_links)); + + point = g_sequence_get_iter_at_pos (menu->item_links, position + removed); + g_sequence_remove_range (g_sequence_get_iter_at_pos (menu->item_links, position), point); + + for (i = position; i < position + added; i++) + g_sequence_insert_before (point, g_menu_exporter_menu_create_links (menu, i)); + + if (g_menu_exporter_group_is_subscribed (menu->group)) + { + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(uuuuaa{sv})")); + g_variant_builder_add (&builder, "u", g_menu_exporter_group_get_id (menu->group)); + g_variant_builder_add (&builder, "u", menu->id); + g_variant_builder_add (&builder, "u", position); + g_variant_builder_add (&builder, "u", removed); + + g_variant_builder_open (&builder, G_VARIANT_TYPE ("aa{sv}")); + for (i = position; i < position + added; i++) + g_variant_builder_add_value (&builder, g_menu_exporter_menu_describe_item (menu, i)); + g_variant_builder_close (&builder); + + g_menu_exporter_report (g_menu_exporter_group_get_exporter (menu->group), g_variant_builder_end (&builder)); + } +} + +static void +g_menu_exporter_menu_prepare (GMenuExporterMenu *menu) +{ + gint n_items; + + g_assert (menu->item_links == NULL); + + if (g_menu_model_is_mutable (menu->model)) + menu->handler_id = g_signal_connect (menu->model, "items-changed", + G_CALLBACK (g_menu_exporter_menu_items_changed), menu); + + menu->item_links = g_sequence_new (g_menu_exporter_link_free); + + n_items = g_menu_model_get_n_items (menu->model); + if (n_items) + g_menu_exporter_menu_items_changed (menu->model, 0, 0, n_items, menu); +} + +static GMenuExporterMenu * +g_menu_exporter_menu_new (GMenuExporterGroup *group, + guint id, + GMenuModel *model) +{ + GMenuExporterMenu *menu; + + menu = g_slice_new0 (GMenuExporterMenu); + menu->group = group; + menu->id = id; + menu->model = g_object_ref (model); + + return menu; +} + +/* {{{1 GMenuExporterGroup */ + +struct _GMenuExporterGroup +{ + GMenuExporter *exporter; + guint id; + + GHashTable *menus; + guint next_menu_id; + gboolean prepared; + + gint subscribed; +}; + +static void +g_menu_exporter_group_check_if_useless (GMenuExporterGroup *group) +{ + if (g_hash_table_size (group->menus) == 0 && group->subscribed == 0) + { + g_menu_exporter_remove_group (group->exporter, group->id); + + g_hash_table_unref (group->menus); + + g_slice_free (GMenuExporterGroup, group); + } +} + +static void +g_menu_exporter_group_subscribe (GMenuExporterGroup *group, + GVariantBuilder *builder) +{ + GHashTableIter iter; + gpointer key, val; + + if (!group->prepared) + { + GMenuExporterMenu *menu; + + /* set this first, so that any menus created during the + * preparation of the first menu also end up in the prepared + * state. + * */ + group->prepared = TRUE; + + menu = g_hash_table_lookup (group->menus, 0); + + /* If the group was created by a subscription and does not yet + * exist, it won't have a root menu... + * + * That menu will be prepared if it is ever added (due to + * group->prepared == TRUE). + */ + if (menu) + g_menu_exporter_menu_prepare (menu); + } + + group->subscribed++; + + g_hash_table_iter_init (&iter, group->menus); + while (g_hash_table_iter_next (&iter, &key, &val)) + { + guint id = GPOINTER_TO_INT (key); + GMenuExporterMenu *menu = val; + + if (g_sequence_get_length (menu->item_links)) + { + g_variant_builder_open (builder, G_VARIANT_TYPE ("(uuaa{sv})")); + g_variant_builder_add (builder, "u", group->id); + g_variant_builder_add (builder, "u", id); + g_variant_builder_add_value (builder, g_menu_exporter_menu_list (menu)); + g_variant_builder_close (builder); + } + } +} + +static void +g_menu_exporter_group_unsubscribe (GMenuExporterGroup *group, + gint count) +{ + g_assert (group->subscribed >= count); + + group->subscribed -= count; + + g_menu_exporter_group_check_if_useless (group); +} + +static GMenuExporter * +g_menu_exporter_group_get_exporter (GMenuExporterGroup *group) +{ + return group->exporter; +} + +static gboolean +g_menu_exporter_group_is_subscribed (GMenuExporterGroup *group) +{ + return group->subscribed > 0; +} + +static guint +g_menu_exporter_group_get_id (GMenuExporterGroup *group) +{ + return group->id; +} + +static void +g_menu_exporter_group_remove_menu (GMenuExporterGroup *group, + guint id) +{ + g_hash_table_remove (group->menus, GINT_TO_POINTER (id)); + + g_menu_exporter_group_check_if_useless (group); +} + +static GMenuExporterMenu * +g_menu_exporter_group_add_menu (GMenuExporterGroup *group, + GMenuModel *model) +{ + GMenuExporterMenu *menu; + guint id; + + id = group->next_menu_id++; + menu = g_menu_exporter_menu_new (group, id, model); + g_hash_table_insert (group->menus, GINT_TO_POINTER (id), menu); + + if (group->prepared) + g_menu_exporter_menu_prepare (menu); + + return menu; +} + +static GMenuExporterGroup * +g_menu_exporter_group_new (GMenuExporter *exporter, + guint id) +{ + GMenuExporterGroup *group; + + group = g_slice_new0 (GMenuExporterGroup); + group->menus = g_hash_table_new (NULL, NULL); + group->exporter = exporter; + group->id = id; + + return group; +} + +/* {{{1 GMenuExporterRemote */ + +struct _GMenuExporterRemote +{ + GMenuExporter *exporter; + GHashTable *watches; + guint watch_id; +}; + +static void +g_menu_exporter_remote_subscribe (GMenuExporterRemote *remote, + guint group_id, + GVariantBuilder *builder) +{ + GMenuExporterGroup *group; + guint count; + + count = (gsize) g_hash_table_lookup (remote->watches, GINT_TO_POINTER (group_id)); + g_hash_table_insert (remote->watches, GINT_TO_POINTER (group_id), GINT_TO_POINTER (count + 1)); + + /* Group will be created (as empty/unsubscribed if it does not exist) */ + group = g_menu_exporter_lookup_group (remote->exporter, group_id); + g_menu_exporter_group_subscribe (group, builder); +} + +static void +g_menu_exporter_remote_unsubscribe (GMenuExporterRemote *remote, + guint group_id) +{ + GMenuExporterGroup *group; + guint count; + + count = (gsize) g_hash_table_lookup (remote->watches, GINT_TO_POINTER (group_id)); + + if (count == 0) + return; + + if (count != 1) + g_hash_table_insert (remote->watches, GINT_TO_POINTER (group_id), GINT_TO_POINTER (count - 1)); + else + g_hash_table_remove (remote->watches, GINT_TO_POINTER (group_id)); + + group = g_menu_exporter_lookup_group (remote->exporter, group_id); + g_menu_exporter_group_unsubscribe (group, 1); +} + +static gboolean +g_menu_exporter_remote_has_subscriptions (GMenuExporterRemote *remote) +{ + return g_hash_table_size (remote->watches) != 0; +} + +static void +g_menu_exporter_remote_free (gpointer data) +{ + GMenuExporterRemote *remote = data; + GHashTableIter iter; + gpointer key, val; + + g_hash_table_iter_init (&iter, remote->watches); + while (g_hash_table_iter_next (&iter, &key, &val)) + { + GMenuExporterGroup *group; + + group = g_menu_exporter_lookup_group (remote->exporter, GPOINTER_TO_INT (key)); + g_menu_exporter_group_unsubscribe (group, GPOINTER_TO_INT (val)); + } + + g_bus_unwatch_name (remote->watch_id); + g_hash_table_unref (remote->watches); + + g_slice_free (GMenuExporterRemote, remote); +} + +static GMenuExporterRemote * +g_menu_exporter_remote_new (GMenuExporter *exporter, + guint watch_id) +{ + GMenuExporterRemote *remote; + + remote = g_slice_new0 (GMenuExporterRemote); + remote->exporter = exporter; + remote->watches = g_hash_table_new (NULL, NULL); + remote->watch_id = watch_id; + + return remote; +} + +/* {{{1 GMenuExporter */ + +struct _GMenuExporter +{ + GDBusConnection *connection; + gchar *object_path; + guint registration_id; + GHashTable *groups; + guint next_group_id; + + GMenuExporterMenu *root; + GHashTable *remotes; +}; + +static void +g_menu_exporter_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GMenuExporter *exporter = user_data; + + /* connection == NULL when we get called because the connection closed */ + g_assert (exporter->connection == connection || connection == NULL); + + g_hash_table_remove (exporter->remotes, name); +} + +static GVariant * +g_menu_exporter_subscribe (GMenuExporter *exporter, + const gchar *sender, + GVariant *group_ids) +{ + GMenuExporterRemote *remote; + GVariantBuilder builder; + GVariantIter iter; + guint32 id; + + remote = g_hash_table_lookup (exporter->remotes, sender); + + if (remote == NULL) + { + guint watch_id; + + watch_id = g_bus_watch_name_on_connection (exporter->connection, sender, G_BUS_NAME_WATCHER_FLAGS_NONE, + NULL, g_menu_exporter_name_vanished, exporter, NULL); + remote = g_menu_exporter_remote_new (exporter, watch_id); + g_hash_table_insert (exporter->remotes, g_strdup (sender), remote); + } + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a(uuaa{sv}))")); + + g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(uuaa{sv})")); + + g_variant_iter_init (&iter, group_ids); + while (g_variant_iter_next (&iter, "u", &id)) + g_menu_exporter_remote_subscribe (remote, id, &builder); + + g_variant_builder_close (&builder); + + return g_variant_builder_end (&builder); +} + +static void +g_menu_exporter_unsubscribe (GMenuExporter *exporter, + const gchar *sender, + GVariant *group_ids) +{ + GMenuExporterRemote *remote; + GVariantIter iter; + guint32 id; + + remote = g_hash_table_lookup (exporter->remotes, sender); + + if (remote == NULL) + return; + + g_variant_iter_init (&iter, group_ids); + while (g_variant_iter_next (&iter, "u", &id)) + g_menu_exporter_remote_unsubscribe (remote, id); + + if (!g_menu_exporter_remote_has_subscriptions (remote)) + g_hash_table_remove (exporter->remotes, sender); +} + +static void +g_menu_exporter_report (GMenuExporter *exporter, + GVariant *report) +{ + GVariantBuilder builder; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE); + g_variant_builder_open (&builder, G_VARIANT_TYPE_ARRAY); + g_variant_builder_add_value (&builder, report); + g_variant_builder_close (&builder); + + g_dbus_connection_emit_signal (exporter->connection, + NULL, + exporter->object_path, + "org.gtk.Menus", "Changed", + g_variant_builder_end (&builder), + NULL); +} + +static void +g_menu_exporter_remove_group (GMenuExporter *exporter, + guint id) +{ + g_hash_table_remove (exporter->groups, GINT_TO_POINTER (id)); +} + +static GMenuExporterGroup * +g_menu_exporter_lookup_group (GMenuExporter *exporter, + guint group_id) +{ + GMenuExporterGroup *group; + + group = g_hash_table_lookup (exporter->groups, GINT_TO_POINTER (group_id)); + + if (group == NULL) + { + group = g_menu_exporter_group_new (exporter, group_id); + g_hash_table_insert (exporter->groups, GINT_TO_POINTER (group_id), group); + } + + return group; +} + +static GMenuExporterGroup * +g_menu_exporter_create_group (GMenuExporter *exporter) +{ + GMenuExporterGroup *group; + guint id; + + id = exporter->next_group_id++; + group = g_menu_exporter_group_new (exporter, id); + g_hash_table_insert (exporter->groups, GINT_TO_POINTER (id), group); + + return group; +} + +static void +g_menu_exporter_free (gpointer user_data) +{ + GMenuExporter *exporter = user_data; + + g_menu_exporter_menu_free (exporter->root); + g_hash_table_unref (exporter->remotes); + g_hash_table_unref (exporter->groups); + g_object_unref (exporter->connection); + g_free (exporter->object_path); + + g_slice_free (GMenuExporter, exporter); +} + +static void +g_menu_exporter_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GMenuExporter *exporter = user_data; + GVariant *group_ids; + + group_ids = g_variant_get_child_value (parameters, 0); + + if (g_str_equal (method_name, "Start")) + g_dbus_method_invocation_return_value (invocation, g_menu_exporter_subscribe (exporter, sender, group_ids)); + + else if (g_str_equal (method_name, "End")) + { + g_menu_exporter_unsubscribe (exporter, sender, group_ids); + g_dbus_method_invocation_return_value (invocation, NULL); + } + + else + g_assert_not_reached (); + + g_variant_unref (group_ids); +} + +/* {{{1 Public API */ + +/** + * g_dbus_connection_export_menu_model: + * @connection: a #GDBusConnection + * @object_path: a D-Bus object path + * @menu: a #GMenuModel + * @error: return location for an error, or %NULL + * + * Exports @menu on @connection at @object_path. + * + * The implemented D-Bus API should be considered private. + * It is subject to change in the future. + * + * An object path can only have one menu model exported on it. If this + * constraint is violated, the export will fail and 0 will be + * returned (with @error set accordingly). + * + * You can unexport the menu model using + * g_dbus_connection_unexport_menu_model() with the return value of + * this function. + * + * Returns: the ID of the export (never zero), or 0 in case of failure + * + * Since: 2.32 + */ +guint +g_dbus_connection_export_menu_model (GDBusConnection *connection, + const gchar *object_path, + GMenuModel *menu, + GError **error) +{ + const GDBusInterfaceVTable vtable = { + g_menu_exporter_method_call, + }; + GMenuExporter *exporter; + guint id; + + exporter = g_slice_new0 (GMenuExporter); + + id = g_dbus_connection_register_object (connection, object_path, org_gtk_Menus_get_interface (), + &vtable, exporter, g_menu_exporter_free, error); + + if (id == 0) + { + g_slice_free (GMenuExporter, exporter); + return 0; + } + + exporter->connection = g_object_ref (connection); + exporter->object_path = g_strdup (object_path); + exporter->groups = g_hash_table_new (NULL, NULL); + exporter->remotes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_menu_exporter_remote_free); + exporter->root = g_menu_exporter_group_add_menu (g_menu_exporter_create_group (exporter), menu); + + return id; +} + +/** + * g_dbus_connection_unexport_menu_model: + * @connection: a #GDBusConnection + * @export_id: the ID from g_dbus_connection_export_menu_model() + * + * Reverses the effect of a previous call to + * g_dbus_connection_export_menu_model(). + * + * It is an error to call this function with an ID that wasn't returned + * from g_dbus_connection_export_menu_model() or to call it with the + * same ID more than once. + * + * Since: 2.32 + */ +void +g_dbus_connection_unexport_menu_model (GDBusConnection *connection, + guint export_id) +{ + g_dbus_connection_unregister_object (connection, export_id); +} + +/* {{{1 Epilogue */ +/* vim:set foldmethod=marker: */ diff --git a/gio/gmenuexporter.h b/gio/gmenuexporter.h new file mode 100644 index 0000000..1673b22 --- /dev/null +++ b/gio/gmenuexporter.h @@ -0,0 +1,42 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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_MENU_EXPORTER_H__ +#define __G_MENU_EXPORTER_H__ + +#include +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_32 +guint g_dbus_connection_export_menu_model (GDBusConnection *connection, + const gchar *object_path, + GMenuModel *menu, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +void g_dbus_connection_unexport_menu_model (GDBusConnection *connection, + guint export_id); + +G_END_DECLS + +#endif /* __G_MENU_EXPORTER_H__ */ diff --git a/gio/gmenumodel.c b/gio/gmenumodel.c new file mode 100644 index 0000000..17cab30 --- /dev/null +++ b/gio/gmenumodel.c @@ -0,0 +1,1021 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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 "gmenumodel.h" + +/** + * SECTION:gmenumodel + * @title: GMenuModel + * @short_description: An abstract class representing the contents of a menu + * @see_also: #GActionGroup + * + * #GMenuModel represents the contents of a menu -- an ordered list of + * menu items. The items are associated with actions, which can be + * activated through them. Items can be grouped in sections, and may + * have submenus associated with them. Both items and sections usually + * have some representation data, such as labels or icons. The type of + * the associated action (ie whether it is stateful, and what kind of + * state it has) can influence the representation of the item. + * + * The conceptual model of menus in #GMenuModel is hierarchical: + * sections and submenus are again represented by #GMenuModels. + * Menus themselves do not define their own roles. Rather, the role + * of a particular #GMenuModel is defined by the item that references + * it (or, in the case of the 'root' menu, is defined by the context + * in which it is used). + * + * As an example, consider the visible portions of the menu in + * . + * + * + * + * There are 8 "menus" visible in the screenshot: one menubar, two + * submenus and 5 sections: + * + * the toplevel menubar (containing 4 items) + * the View submenu (containing 3 sections) + * the first section of the View submenu (containing 2 items) + * the second section of the View submenu (containing 1 item) + * the final section of the View submenu (containing 1 item) + * the Highlight Mode submenu (containing 2 sections) + * the Sources section (containing 2 items) + * the Markup section (containing 2 items) + * + * + * illustrates the conceptual connection between + * these 8 menus. Each large block in the figure represents a menu and the + * smaller blocks within the large block represent items in that menu. Some + * items contain references to other menus. + * + * + * + * Notice that the separators visible in + * appear nowhere in . This is because + * separators are not explicitly represented in the menu model. Instead, + * a separator is inserted between any two non-empty sections of a menu. + * Section items can have labels just like any other item. In that case, + * a display system may show a section header instead of a separator. + * + * The motivation for this abstract model of application controls is + * that modern user interfaces tend to make these controls available + * outside the application. Examples include global menus, jumplists, + * dash boards, etc. To support such uses, it is necessary to 'export' + * information about actions and their representation in menus, which + * is exactly what the + * GActionGroup exporter + * and the + * GMenuModel exporter + * do for #GActionGroup and #GMenuModel. The client-side counterparts + * to make use of the exported information are #GDBusActionGroup and + * #GDBusMenuModel. + * + * The API of #GMenuModel is very generic, with iterators for the + * attributes and links of an item, see g_menu_model_iterate_item_attributes() + * and g_menu_model_iterate_item_links(). The 'standard' attributes and + * link types have predefined names: %G_MENU_ATTRIBUTE_LABEL, + * %G_MENU_ATTRIBUTE_ACTION, %G_MENU_ATTRIBUTE_TARGET, %G_MENU_LINK_SECTION + * and %G_MENU_LINK_SUBMENU. + * + * Items in a #GMenuModel represent active controls if they refer to + * an action that can get activated when the user interacts with the + * menu item. The reference to the action is encoded by the string id + * in the %G_MENU_ATTRIBUTE_ACTION attribute. An action id uniquely + * identifies an action in an action group. Which action group(s) provide + * actions depends on the context in which the menu model is used. + * E.g. when the model is exported as the application menu of a + * #GtkApplication, actions can be application-wide or window-specific + * (and thus come from two different action groups). By convention, the + * application-wide actions have names that start with "app.", while the + * names of window-specific actions start with "win.". + * + * While a wide variety of stateful actions is possible, the following + * is the minimum that is expected to be supported by all users of exported + * menu information: + * + * an action with no parameter type and no state + * an action with no parameter type and boolean state + * an action with string parameter type and string state + * + * + * Stateless + * + * A stateless action typically corresponds to an ordinary menu item. + * + * + * Selecting such a menu item will activate the action (with no parameter). + * + * + * + * Boolean State + * + * An action with a boolean state will most typically be used with a "toggle" + * or "switch" menu item. The state can be set directly, but activating the + * action (with no parameter) results in the state being toggled. + * + * + * Selecting a toggle menu item will activate the action. The menu item should + * be rendered as "checked" when the state is true. + * + * + * + * String Parameter and State + * + * Actions with string parameters and state will most typically be used to + * represent an enumerated choice over the items available for a group of + * radio menu items. Activating the action with a string parameter is + * equivalent to setting that parameter as the state. + * + * + * Radio menu items, in addition to being associated with the action, will + * have a target value. Selecting that menu item will result in activation + * of the action with the target value as the parameter. The menu item should + * be rendered as "selected" when the state of the action is equal to the + * target value of the menu item. + * + * + */ + +/** + * GMenuModel: + * + * #GMenuModel is an opaque structure type. You must access it using the + * functions below. + * + * Since: 2.32 + */ + +/** + * GMenuAttributeIter: + * + * #GMenuAttributeIter is an opaque structure type. You must access it + * using the functions below. + * + * Since: 2.32 + */ + +/** + * GMenuLinkIter: + * + * #GMenuLinkIter is an opaque structure type. You must access it using + * the functions below. + * + * Since: 2.32 + */ + +typedef struct +{ + GMenuLinkIter parent_instance; + GHashTableIter iter; + GHashTable *table; +} GMenuLinkHashIter; + +typedef GMenuLinkIterClass GMenuLinkHashIterClass; + +static GType g_menu_link_hash_iter_get_type (void); + +G_DEFINE_TYPE (GMenuLinkHashIter, g_menu_link_hash_iter, G_TYPE_MENU_LINK_ITER) + +static gboolean +g_menu_link_hash_iter_get_next (GMenuLinkIter *link_iter, + const gchar **out_name, + GMenuModel **value) +{ + GMenuLinkHashIter *iter = (GMenuLinkHashIter *) link_iter; + gpointer keyptr, valueptr; + + if (!g_hash_table_iter_next (&iter->iter, &keyptr, &valueptr)) + return FALSE; + + *out_name = keyptr; + *value = g_object_ref (valueptr); + + return TRUE; +} + +static void +g_menu_link_hash_iter_finalize (GObject *object) +{ + GMenuLinkHashIter *iter = (GMenuLinkHashIter *) object; + + g_hash_table_unref (iter->table); + + G_OBJECT_CLASS (g_menu_link_hash_iter_parent_class) + ->finalize (object); +} + +static void +g_menu_link_hash_iter_init (GMenuLinkHashIter *iter) +{ +} + +static void +g_menu_link_hash_iter_class_init (GMenuLinkHashIterClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_menu_link_hash_iter_finalize; + class->get_next = g_menu_link_hash_iter_get_next; +} + + +typedef struct +{ + GMenuAttributeIter parent_instance; + GHashTableIter iter; + GHashTable *table; +} GMenuAttributeHashIter; + +typedef GMenuAttributeIterClass GMenuAttributeHashIterClass; + +static GType g_menu_attribute_hash_iter_get_type (void); + +G_DEFINE_TYPE (GMenuAttributeHashIter, g_menu_attribute_hash_iter, G_TYPE_MENU_ATTRIBUTE_ITER) + +static gboolean +g_menu_attribute_hash_iter_get_next (GMenuAttributeIter *attr_iter, + const gchar **name, + GVariant **value) +{ + GMenuAttributeHashIter *iter = (GMenuAttributeHashIter *) attr_iter; + gpointer keyptr, valueptr; + + if (!g_hash_table_iter_next (&iter->iter, &keyptr, &valueptr)) + return FALSE; + + *name = keyptr; + + *value = g_variant_ref (valueptr); + + return TRUE; +} + +static void +g_menu_attribute_hash_iter_finalize (GObject *object) +{ + GMenuAttributeHashIter *iter = (GMenuAttributeHashIter *) object; + + g_hash_table_unref (iter->table); + + G_OBJECT_CLASS (g_menu_attribute_hash_iter_parent_class) + ->finalize (object); +} + +static void +g_menu_attribute_hash_iter_init (GMenuAttributeHashIter *iter) +{ +} + +static void +g_menu_attribute_hash_iter_class_init (GMenuAttributeHashIterClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_menu_attribute_hash_iter_finalize; + class->get_next = g_menu_attribute_hash_iter_get_next; +} + +G_DEFINE_ABSTRACT_TYPE (GMenuModel, g_menu_model, G_TYPE_OBJECT) + + +static guint g_menu_model_items_changed_signal; + +static GMenuAttributeIter * +g_menu_model_real_iterate_item_attributes (GMenuModel *model, + gint item_index) +{ + GHashTable *table = NULL; + GMenuAttributeIter *result; + + G_MENU_MODEL_GET_CLASS (model)->get_item_attributes (model, item_index, &table); + + if (table) + { + GMenuAttributeHashIter *iter = g_object_new (g_menu_attribute_hash_iter_get_type (), NULL); + g_hash_table_iter_init (&iter->iter, table); + iter->table = g_hash_table_ref (table); + result = G_MENU_ATTRIBUTE_ITER (iter); + } + else + { + g_critical ("GMenuModel implementation '%s' doesn't override iterate_item_attributes() " + "and fails to return sane values from get_item_attributes()", + G_OBJECT_TYPE_NAME (model)); + result = NULL; + } + + if (table != NULL) + g_hash_table_unref (table); + + return result; +} + +static GVariant * +g_menu_model_real_get_item_attribute_value (GMenuModel *model, + gint item_index, + const gchar *attribute, + const GVariantType *expected_type) +{ + GHashTable *table = NULL; + GVariant *value = NULL; + + G_MENU_MODEL_GET_CLASS (model) + ->get_item_attributes (model, item_index, &table); + + if (table != NULL) + { + value = g_hash_table_lookup (table, attribute); + + if (value != NULL) + { + if (expected_type == NULL || g_variant_is_of_type (value, expected_type)) + value = g_variant_ref (value); + else + value = NULL; + } + } + else + g_assert_not_reached (); + + if (table != NULL) + g_hash_table_unref (table); + + return value; +} + +static GMenuLinkIter * +g_menu_model_real_iterate_item_links (GMenuModel *model, + gint item_index) +{ + GHashTable *table = NULL; + GMenuLinkIter *result; + + G_MENU_MODEL_GET_CLASS (model) + ->get_item_links (model, item_index, &table); + + if (table) + { + GMenuLinkHashIter *iter = g_object_new (g_menu_link_hash_iter_get_type (), NULL); + g_hash_table_iter_init (&iter->iter, table); + iter->table = g_hash_table_ref (table); + result = G_MENU_LINK_ITER (iter); + } + else + { + g_critical ("GMenuModel implementation '%s' doesn't override iterate_item_links() " + "and fails to return sane values from get_item_links()", + G_OBJECT_TYPE_NAME (model)); + result = NULL; + } + + if (table != NULL) + g_hash_table_unref (table); + + return result; +} + +static GMenuModel * +g_menu_model_real_get_item_link (GMenuModel *model, + gint item_index, + const gchar *link) +{ + GHashTable *table = NULL; + GMenuModel *value = NULL; + + G_MENU_MODEL_GET_CLASS (model) + ->get_item_links (model, item_index, &table); + + if (table != NULL) + value = g_hash_table_lookup (table, link); + else + g_assert_not_reached (); + + if (value != NULL) + g_object_ref (value); + + if (table != NULL) + g_hash_table_unref (table); + + return value; +} + +static void +g_menu_model_init (GMenuModel *model) +{ +} + +static void +g_menu_model_class_init (GMenuModelClass *class) +{ + class->iterate_item_attributes = g_menu_model_real_iterate_item_attributes; + class->get_item_attribute_value = g_menu_model_real_get_item_attribute_value; + class->iterate_item_links = g_menu_model_real_iterate_item_links; + class->get_item_link = g_menu_model_real_get_item_link; + + /** + * GMenuModel::items-changed: + * @model: the #GMenuModel that is changing + * @position: the position of the change + * @removed: the number of items removed + * @added: the number of items added + * + * Emitted when a change has occured to the menu. + * + * The only changes that can occur to a menu is that items are removed + * or added. Items may not change (except by being removed and added + * back in the same location). This signal is capable of describing + * both of those changes (at the same time). + * + * The signal means that starting at the index @position, @removed + * items were removed and @added items were added in their place. If + * @removed is zero then only items were added. If @added is zero + * then only items were removed. + * + * As an example, if the menu contains items a, b, c, d (in that + * order) and the signal (2, 1, 3) occurs then the new composition of + * the menu will be a, b, _, _, _, d (with each _ representing some + * new item). + * + * Signal handlers may query the model (particularly the added items) + * and expect to see the results of the modification that is being + * reported. The signal is emitted after the modification. + **/ + g_menu_model_items_changed_signal = + g_signal_new ("items-changed", G_TYPE_MENU_MODEL, + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + g_cclosure_marshal_generic, G_TYPE_NONE, + 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); +} + +/** + * g_menu_model_is_mutable: + * @model: a #GMenuModel + * + * Queries if @model is mutable. + * + * An immutable #GMenuModel will never emit the #GMenuModel::items-changed + * signal. Consumers of the model may make optimisations accordingly. + * + * Returns: %TRUE if the model is mutable (ie: "items-changed" may be + * emitted). + * + * Since: 2.32 + */ +gboolean +g_menu_model_is_mutable (GMenuModel *model) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->is_mutable (model); +} + +/** + * g_menu_model_get_n_items: + * @model: a #GMenuModel + * + * Query the number of items in @model. + * + * Returns: the number of items + * + * Since: 2.32 + */ +gint +g_menu_model_get_n_items (GMenuModel *model) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->get_n_items (model); +} + +/** + * g_menu_model_iterate_item_attributes: + * @model: a #GMenuModel + * @item_index: the index of the item + * + * Creates a #GMenuAttributeIter to iterate over the attributes of + * the item at position @item_index in @model. + * + * You must free the iterator with g_object_unref() when you are done. + * + * Returns: (transfer full): a new #GMenuAttributeIter + * + * Since: 2.32 + */ +GMenuAttributeIter * +g_menu_model_iterate_item_attributes (GMenuModel *model, + gint item_index) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->iterate_item_attributes (model, item_index); +} + +/** + * g_menu_model_get_item_attribute_value: + * @model: a #GMenuModel + * @item_index: the index of the item + * @attribute: the attribute to query + * @expected_type: (allow-none): the expected type of the attribute, or + * %NULL + * + * Queries the item at position @item_index in @model for the attribute + * specified by @attribute. + * + * If @expected_type is non-%NULL then it specifies the expected type of + * the attribute. If it is %NULL then any type will be accepted. + * + * If the attribute exists and matches @expected_type (or if the + * expected type is unspecified) then the value is returned. + * + * If the attribute does not exist, or does not match the expected type + * then %NULL is returned. + * + * Returns: (transfer full): the value of the attribute + * + * Since: 2.32 + */ +GVariant * +g_menu_model_get_item_attribute_value (GMenuModel *model, + gint item_index, + const gchar *attribute, + const GVariantType *expected_type) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->get_item_attribute_value (model, item_index, attribute, expected_type); +} + +/** + * g_menu_model_get_item_attribute: + * @model: a #GMenuModel + * @item_index: the index of the item + * @attribute: the attribute to query + * @format_string: a #GVariant format string + * @...: positional parameters, as per @format_string + * + * Queries item at position @item_index in @model for the attribute + * specified by @attribute. + * + * If the attribute exists and matches the #GVariantType corresponding + * to @format_string then @format_string is used to deconstruct the + * value into the positional parameters and %TRUE is returned. + * + * If the attribute does not exist, or it does exist but has the wrong + * type, then the positional parameters are ignored and %FALSE is + * returned. + * + * This function is a mix of g_menu_model_get_item_attribute_value() and + * g_variant_get(), followed by a g_variant_unref(). As such, + * @format_string must make a complete copy of the data (since the + * #GVariant may go away after the call to g_variant_unref()). In + * particular, no '&' characters are allowed in @format_string. + * + * Returns: %TRUE if the named attribute was found with the expected + * type + * + * Since: 2.32 + */ +gboolean +g_menu_model_get_item_attribute (GMenuModel *model, + gint item_index, + const gchar *attribute, + const gchar *format_string, + ...) +{ + GVariant *value; + va_list ap; + + value = g_menu_model_get_item_attribute_value (model, item_index, attribute, NULL); + + if (value == NULL) + return FALSE; + + if (!g_variant_check_format_string (value, format_string, TRUE)) + { + g_variant_unref (value); + return FALSE; + } + + va_start (ap, format_string); + g_variant_get_va (value, format_string, NULL, &ap); + g_variant_unref (value); + va_end (ap); + + return TRUE; +} + +/** + * g_menu_model_iterate_item_links: + * @model: a #GMenuModel + * @item_index: the index of the item + * + * Creates a #GMenuLinkIter to iterate over the links of the item at + * position @item_index in @model. + * + * You must free the iterator with g_object_unref() when you are done. + * + * Returns: (transfer full): a new #GMenuLinkIter + * + * Since: 2.32 + */ +GMenuLinkIter * +g_menu_model_iterate_item_links (GMenuModel *model, + gint item_index) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->iterate_item_links (model, item_index); +} + +/** + * g_menu_model_get_item_link: + * @model: a #GMenuModel + * @item_index: the index of the item + * @link: the link to query + * + * Queries the item at position @item_index in @model for the link + * specified by @link. + * + * If the link exists, the linked #GMenuModel is returned. If the link + * does not exist, %NULL is returned. + * + * Returns: (transfer full): the linked #GMenuModel, or %NULL + * + * Since: 2.32 + */ +GMenuModel * +g_menu_model_get_item_link (GMenuModel *model, + gint item_index, + const gchar *link) +{ + return G_MENU_MODEL_GET_CLASS (model) + ->get_item_link (model, item_index, link); +} + +/** + * g_menu_model_items_changed: + * @model: a #GMenuModel + * @position: the position of the change + * @removed: the number of items removed + * @added: the number of items added + * + * Requests emission of the #GMenuModel::items-changed signal on @model. + * + * This function should never be called except by #GMenuModel + * subclasses. Any other calls to this function will very likely lead + * to a violation of the interface of the model. + * + * The implementation should update its internal representation of the + * menu before emitting the signal. The implementation should further + * expect to receive queries about the new state of the menu (and + * particularly added menu items) while signal handlers are running. + * + * The implementation must dispatch this call directly from a mainloop + * entry and not in response to calls -- particularly those from the + * #GMenuModel API. Said another way: the menu must not change while + * user code is running without returning to the mainloop. + * + * Since: 2.32 + */ +void +g_menu_model_items_changed (GMenuModel *model, + gint position, + gint removed, + gint added) +{ + g_signal_emit (model, g_menu_model_items_changed_signal, 0, position, removed, added); +} + +G_DEFINE_ABSTRACT_TYPE (GMenuAttributeIter, g_menu_attribute_iter, G_TYPE_OBJECT) + +struct _GMenuAttributeIterPrivate +{ + GQuark name; + GVariant *value; + gboolean valid; +}; + +/** + * g_menu_attribute_iter_get_next: + * @iter: a #GMenuAttributeIter + * @out_name: (out) (allow-none) (transfer none): the type of the attribute + * @value: (out) (allow-none) (transfer full): the attribute value + * + * This function combines g_menu_attribute_iter_next() with + * g_menu_attribute_iter_get_name() and g_menu_attribute_iter_get_value(). + * + * First the iterator is advanced to the next (possibly first) attribute. + * If that fails, then %FALSE is returned and there are no other + * effects. + * + * If successful, @name and @value are set to the name and value of the + * attribute that has just been advanced to. At this point, + * g_menu_attribute_iter_get_name() and g_menu_attribute_iter_get_value() will + * return the same values again. + * + * The value returned in @name remains valid for as long as the iterator + * remains at the current position. The value returned in @value must + * be unreffed using g_variant_unref() when it is no longer in use. + * + * Returns: %TRUE on success, or %FALSE if there is no additional + * attribute + * + * Since: 2.32 + */ +gboolean +g_menu_attribute_iter_get_next (GMenuAttributeIter *iter, + const gchar **out_name, + GVariant **value) +{ + const gchar *name; + + if (iter->priv->value) + { + g_variant_unref (iter->priv->value); + iter->priv->value = NULL; + } + + iter->priv->valid = G_MENU_ATTRIBUTE_ITER_GET_CLASS (iter) + ->get_next (iter, &name, &iter->priv->value); + + if (iter->priv->valid) + { + iter->priv->name = g_quark_from_string (name); + if (out_name) + *out_name = g_quark_to_string (iter->priv->name); + + if (value) + *value = g_variant_ref (iter->priv->value); + } + + return iter->priv->valid; +} + +/** + * g_menu_attribute_iter_next: + * @iter: a #GMenuAttributeIter + * + * Attempts to advance the iterator to the next (possibly first) + * attribute. + * + * %TRUE is returned on success, or %FALSE if there are no more + * attributes. + * + * You must call this function when you first acquire the iterator + * to advance it to the first attribute (and determine if the first + * attribute exists at all). + * + * Returns: %TRUE on success, or %FALSE when there are no more attributes + * + * Since: 2.32 + */ +gboolean +g_menu_attribute_iter_next (GMenuAttributeIter *iter) +{ + return g_menu_attribute_iter_get_next (iter, NULL, NULL); +} + +/** + * g_menu_attribute_iter_get_name: + * @iter: a #GMenuAttributeIter + * + * Gets the name of the attribute at the current iterator position, as + * a string. + * + * The iterator is not advanced. + * + * Returns: the name of the attribute + * + * Since: 2.32 + */ +const gchar * +g_menu_attribute_iter_get_name (GMenuAttributeIter *iter) +{ + g_return_val_if_fail (iter->priv->valid, 0); + + return g_quark_to_string (iter->priv->name); +} + +/** + * g_menu_attribute_iter_get_value: + * @iter: a #GMenuAttributeIter + * + * Gets the value of the attribute at the current iterator position. + * + * The iterator is not advanced. + * + * Returns: (transfer full): the value of the current attribute + * + * Since: 2.32 + */ +GVariant * +g_menu_attribute_iter_get_value (GMenuAttributeIter *iter) +{ + g_return_val_if_fail (iter->priv->valid, NULL); + + return g_variant_ref (iter->priv->value); +} + +static void +g_menu_attribute_iter_finalize (GObject *object) +{ + GMenuAttributeIter *iter = G_MENU_ATTRIBUTE_ITER (object); + + if (iter->priv->value) + g_variant_unref (iter->priv->value); + + G_OBJECT_CLASS (g_menu_attribute_iter_parent_class) + ->finalize (object); +} + +static void +g_menu_attribute_iter_init (GMenuAttributeIter *iter) +{ + iter->priv = G_TYPE_INSTANCE_GET_PRIVATE (iter, G_TYPE_MENU_ATTRIBUTE_ITER, GMenuAttributeIterPrivate); +} + +static void +g_menu_attribute_iter_class_init (GMenuAttributeIterClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_menu_attribute_iter_finalize; + + g_type_class_add_private (class, sizeof (GMenuAttributeIterPrivate)); +} + +G_DEFINE_ABSTRACT_TYPE (GMenuLinkIter, g_menu_link_iter, G_TYPE_OBJECT) + +struct _GMenuLinkIterPrivate +{ + GQuark name; + GMenuModel *value; + gboolean valid; +}; + +/** + * g_menu_link_iter_get_next: + * @iter: a #GMenuLinkIter + * @out_link: (out) (allow-none) (transfer none): the name of the link + * @value: (out) (allow-none) (transfer full): the linked #GMenuModel + * + * This function combines g_menu_link_iter_next() with + * g_menu_link_iter_get_name() and g_menu_link_iter_get_value(). + * + * First the iterator is advanced to the next (possibly first) link. + * If that fails, then %FALSE is returned and there are no other effects. + * + * If successful, @out_link and @value are set to the name and #GMenuModel + * of the link that has just been advanced to. At this point, + * g_menu_link_iter_get_name() and g_menu_link_iter_get_value() will return the + * same values again. + * + * The value returned in @out_link remains valid for as long as the iterator + * remains at the current position. The value returned in @value must + * be unreffed using g_object_unref() when it is no longer in use. + * + * Returns: %TRUE on success, or %FALSE if there is no additional link + * + * Since: 2.32 + */ +gboolean +g_menu_link_iter_get_next (GMenuLinkIter *iter, + const gchar **out_link, + GMenuModel **value) +{ + const gchar *name; + + if (iter->priv->value) + { + g_object_unref (iter->priv->value); + iter->priv->value = NULL; + } + + iter->priv->valid = G_MENU_LINK_ITER_GET_CLASS (iter) + ->get_next (iter, &name, &iter->priv->value); + + if (iter->priv->valid) + { + g_assert (name != NULL); + + iter->priv->name = g_quark_from_string (name); + if (out_link) + *out_link = g_quark_to_string (iter->priv->name); + + if (value) + *value = g_object_ref (iter->priv->value); + } + + return iter->priv->valid; +} + +/** + * g_menu_link_iter_next: + * @iter: a #GMenuLinkIter + * + * Attempts to advance the iterator to the next (possibly first) + * link. + * + * %TRUE is returned on success, or %FALSE if there are no more links. + * + * You must call this function when you first acquire the iterator to + * advance it to the first link (and determine if the first link exists + * at all). + * + * Returns: %TRUE on success, or %FALSE when there are no more links + * + * Since: 2.32 + */ +gboolean +g_menu_link_iter_next (GMenuLinkIter *iter) +{ + return g_menu_link_iter_get_next (iter, NULL, NULL); +} + +/** + * g_menu_link_iter_get_name: + * @iter: a #GMenuLinkIter + * + * Gets the name of the link at the current iterator position. + * + * The iterator is not advanced. + * + * Returns: the type of the link + * + * Since: 2.32 + */ +const gchar * +g_menu_link_iter_get_name (GMenuLinkIter *iter) +{ + g_return_val_if_fail (iter->priv->valid, 0); + + return g_quark_to_string (iter->priv->name); +} + +/** + * g_menu_link_iter_get_value: + * @iter: a #GMenuLinkIter + * + * Gets the linked #GMenuModel at the current iterator position. + * + * The iterator is not advanced. + * + * Returns: (transfer full): the #GMenuModel that is linked to + * + * Since: 2.32 + */ +GMenuModel * +g_menu_link_iter_get_value (GMenuLinkIter *iter) +{ + g_return_val_if_fail (iter->priv->valid, NULL); + + return g_object_ref (iter->priv->value); +} + +static void +g_menu_link_iter_finalize (GObject *object) +{ + GMenuLinkIter *iter = G_MENU_LINK_ITER (object); + + if (iter->priv->value) + g_object_unref (iter->priv->value); + + G_OBJECT_CLASS (g_menu_link_iter_parent_class) + ->finalize (object); +} + +static void +g_menu_link_iter_init (GMenuLinkIter *iter) +{ + iter->priv = G_TYPE_INSTANCE_GET_PRIVATE (iter, G_TYPE_MENU_LINK_ITER, GMenuLinkIterPrivate); +} + +static void +g_menu_link_iter_class_init (GMenuLinkIterClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_menu_link_iter_finalize; + + g_type_class_add_private (class, sizeof (GMenuLinkIterPrivate)); +} diff --git a/gio/gmenumodel.h b/gio/gmenumodel.h new file mode 100644 index 0000000..01ab337 --- /dev/null +++ b/gio/gmenumodel.h @@ -0,0 +1,276 @@ +/* + * Copyright © 2011 Canonical Ltd. + * + * This library is free software; you can redistribute it and/or 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_MENU_MODEL_H__ +#define __G_MENU_MODEL_H__ + +#include + +#include + +G_BEGIN_DECLS + +/** + * G_MENU_ATTRIBUTE_ACTION: + * + * The menu item attribute which holds the action name of the item. Action + * names are namespaced with an identifier for the action group in which the + * action resides. For example, "win." for window-specific actions and "app." + * for application-wide actions. + * + * See also g_menu_model_get_item_attribute() and g_menu_item_set_attribute(). + * + * Since: 2.32 + **/ +#define G_MENU_ATTRIBUTE_ACTION "action" + +/** + * G_MENU_ATTRIBUTE_ACTION_NAMESPACE: + * + * The menu item attribute that holds the namespace for all action names in + * menus that are linked from this item. + * + * Since: 2.36 + **/ +#define G_MENU_ATTRIBUTE_ACTION_NAMESPACE "action-namespace" + +/** + * G_MENU_ATTRIBUTE_TARGET: + * + * The menu item attribute which holds the target with which the item's action + * will be activated. + * + * See also g_menu_item_set_action_and_target() + * + * Since: 2.32 + **/ +#define G_MENU_ATTRIBUTE_TARGET "target" + +/** + * G_MENU_ATTRIBUTE_LABEL: + * + * The menu item attribute which holds the label of the item. + * + * Since: 2.32 + **/ +#define G_MENU_ATTRIBUTE_LABEL "label" + +/** + * G_MENU_LINK_SUBMENU: + * + * The name of the link that associates a menu item with a submenu. + * + * See also g_menu_item_set_link(). + * + * Since: 2.32 + **/ +#define G_MENU_LINK_SUBMENU "submenu" + +/** + * G_MENU_LINK_SECTION: + * + * The name of the link that associates a menu item with a section. The linked + * menu will usually be shown in place of the menu item, using the item's label + * as a header. + * + * See also g_menu_item_set_link(). + * + * Since: 2.32 + **/ +#define G_MENU_LINK_SECTION "section" + +#define G_TYPE_MENU_MODEL (g_menu_model_get_type ()) +#define G_MENU_MODEL(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MENU_MODEL, GMenuModel)) +#define G_MENU_MODEL_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_MENU_MODEL, GMenuModelClass)) +#define G_IS_MENU_MODEL(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_MENU_MODEL)) +#define G_IS_MENU_MODEL_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_MENU_MODEL)) +#define G_MENU_MODEL_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_MENU_MODEL, GMenuModelClass)) + +typedef struct _GMenuModelPrivate GMenuModelPrivate; +typedef struct _GMenuModelClass GMenuModelClass; + +typedef struct _GMenuAttributeIterPrivate GMenuAttributeIterPrivate; +typedef struct _GMenuAttributeIterClass GMenuAttributeIterClass; +typedef struct _GMenuAttributeIter GMenuAttributeIter; + +typedef struct _GMenuLinkIterPrivate GMenuLinkIterPrivate; +typedef struct _GMenuLinkIterClass GMenuLinkIterClass; +typedef struct _GMenuLinkIter GMenuLinkIter; + +struct _GMenuModel +{ + GObject parent_instance; + GMenuModelPrivate *priv; +}; + +struct _GMenuModelClass +{ + GObjectClass parent_class; + + gboolean (*is_mutable) (GMenuModel *model); + gint (*get_n_items) (GMenuModel *model); + void (*get_item_attributes) (GMenuModel *model, + gint item_index, + GHashTable **attributes); + GMenuAttributeIter * (*iterate_item_attributes) (GMenuModel *model, + gint item_index); + GVariant * (*get_item_attribute_value) (GMenuModel *model, + gint item_index, + const gchar *attribute, + const GVariantType *expected_type); + void (*get_item_links) (GMenuModel *model, + gint item_index, + GHashTable **links); + GMenuLinkIter * (*iterate_item_links) (GMenuModel *model, + gint item_index); + GMenuModel * (*get_item_link) (GMenuModel *model, + gint item_index, + const gchar *link); +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_menu_model_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_model_is_mutable (GMenuModel *model); +GLIB_AVAILABLE_IN_2_32 +gint g_menu_model_get_n_items (GMenuModel *model); + +GLIB_AVAILABLE_IN_2_32 +GMenuAttributeIter * g_menu_model_iterate_item_attributes (GMenuModel *model, + gint item_index); +GLIB_AVAILABLE_IN_2_32 +GVariant * g_menu_model_get_item_attribute_value (GMenuModel *model, + gint item_index, + const gchar *attribute, + const GVariantType *expected_type); +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_model_get_item_attribute (GMenuModel *model, + gint item_index, + const gchar *attribute, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_2_32 +GMenuLinkIter * g_menu_model_iterate_item_links (GMenuModel *model, + gint item_index); +GLIB_AVAILABLE_IN_2_32 +GMenuModel * g_menu_model_get_item_link (GMenuModel *model, + gint item_index, + const gchar *link); + +GLIB_AVAILABLE_IN_2_32 +void g_menu_model_items_changed (GMenuModel *model, + gint position, + gint removed, + gint added); + + +#define G_TYPE_MENU_ATTRIBUTE_ITER (g_menu_attribute_iter_get_type ()) +#define G_MENU_ATTRIBUTE_ITER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MENU_ATTRIBUTE_ITER, GMenuAttributeIter)) +#define G_MENU_ATTRIBUTE_ITER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_MENU_ATTRIBUTE_ITER, GMenuAttributeIterClass)) +#define G_IS_MENU_ATTRIBUTE_ITER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_MENU_ATTRIBUTE_ITER)) +#define G_IS_MENU_ATTRIBUTE_ITER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_MENU_ATTRIBUTE_ITER)) +#define G_MENU_ATTRIBUTE_ITER_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_MENU_ATTRIBUTE_ITER, GMenuAttributeIterClass)) + +struct _GMenuAttributeIter +{ + GObject parent_instance; + GMenuAttributeIterPrivate *priv; +}; + +struct _GMenuAttributeIterClass +{ + GObjectClass parent_class; + + gboolean (*get_next) (GMenuAttributeIter *iter, + const gchar **out_name, + GVariant **value); +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_menu_attribute_iter_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_attribute_iter_get_next (GMenuAttributeIter *iter, + const gchar **out_name, + GVariant **value); +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_attribute_iter_next (GMenuAttributeIter *iter); +GLIB_AVAILABLE_IN_2_32 +const gchar * g_menu_attribute_iter_get_name (GMenuAttributeIter *iter); +GLIB_AVAILABLE_IN_2_32 +GVariant * g_menu_attribute_iter_get_value (GMenuAttributeIter *iter); + + +#define G_TYPE_MENU_LINK_ITER (g_menu_link_iter_get_type ()) +#define G_MENU_LINK_ITER(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_MENU_LINK_ITER, GMenuLinkIter)) +#define G_MENU_LINK_ITER_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_MENU_LINK_ITER, GMenuLinkIterClass)) +#define G_IS_MENU_LINK_ITER(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_MENU_LINK_ITER)) +#define G_IS_MENU_LINK_ITER_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_MENU_LINK_ITER)) +#define G_MENU_LINK_ITER_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_MENU_LINK_ITER, GMenuLinkIterClass)) + +struct _GMenuLinkIter +{ + GObject parent_instance; + GMenuLinkIterPrivate *priv; +}; + +struct _GMenuLinkIterClass +{ + GObjectClass parent_class; + + gboolean (*get_next) (GMenuLinkIter *iter, + const gchar **out_link, + GMenuModel **value); +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_menu_link_iter_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_link_iter_get_next (GMenuLinkIter *iter, + const gchar **out_link, + GMenuModel **value); +GLIB_AVAILABLE_IN_2_32 +gboolean g_menu_link_iter_next (GMenuLinkIter *iter); +GLIB_AVAILABLE_IN_2_32 +const gchar * g_menu_link_iter_get_name (GMenuLinkIter *iter); +GLIB_AVAILABLE_IN_2_32 +GMenuModel * g_menu_link_iter_get_value (GMenuLinkIter *iter); + +G_END_DECLS + +#endif /* __G_MENU_MODEL_H__ */ diff --git a/gio/gmount.c b/gio/gmount.c new file mode 100644 index 0000000..ac0179e --- /dev/null +++ b/gio/gmount.c @@ -0,0 +1,1054 @@ +/* -*- 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 "gthemedicon.h" +#include "gasyncresult.h" +#include "gtask.h" +#include "gioerror.h" +#include "glibintl.h" + + +/** + * SECTION:gmount + * @short_description: Mount management + * @include: gio/gio.h + * @see_also: GVolume, GUnixMountEntry, GUnixMountPoint + * + * 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 #GAsyncResult + * and #GTask. 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: (transfer full): 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: (transfer full): 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: (transfer full): 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_symbolic_icon: + * @mount: a #GMount. + * + * Gets the symbolic icon for @mount. + * + * Returns: (transfer full): a #GIcon. + * The returned object should be unreffed with + * g_object_unref() when no longer needed. + * + * Since: 2.34 + **/ +GIcon * +g_mount_get_symbolic_icon (GMount *mount) +{ + GMountIface *iface; + GIcon *ret; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + + if (iface->get_symbolic_icon != NULL) + ret = iface->get_symbolic_icon (mount); + else + ret = g_themed_icon_new_with_default_fallbacks ("folder-remote-symbolic"); + + return ret; +} + +/** + * 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: (transfer full): 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: (transfer full): 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_unmount_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_mount_unmount_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_eject_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_mount_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_unmount_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_mount_unmount_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_eject_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_mount_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to avoid + * user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_remount, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_mount_remount)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): 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_task_report_new_error (mount, callback, user_data, + g_mount_guess_content_type, + 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 occurring, or %NULL to + * ignore + * + * Finishes guessing content types of @mount. If any errors occurred + * 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: (transfer full) (element-type utf8): 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), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + + if (g_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_mount_guess_content_type)) + return g_task_propagate_pointer (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, %NULL to ignore + * @error: a #GError location to store the error occurring, 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: (transfer full) (element-type utf8): 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); +} + +/** + * g_mount_get_sort_key: + * @mount: A #GMount. + * + * Gets the sort key for @mount, if any. + * + * Returns: Sorting key for @mount or %NULL if no such key is available. + * + * Since: 2.32 + */ +const gchar * +g_mount_get_sort_key (GMount *mount) +{ + const gchar *ret = NULL; + GMountIface *iface; + + g_return_val_if_fail (G_IS_MOUNT (mount), NULL); + + iface = G_MOUNT_GET_IFACE (mount); + if (iface->get_sort_key != NULL) + ret = iface->get_sort_key (mount); + + return ret; +} diff --git a/gio/gmount.h b/gio/gmount.h new file mode 100644 index 0000000..58f5193 --- /dev/null +++ b/gio/gmount.h @@ -0,0 +1,278 @@ +/* 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 + */ + +#ifndef __G_MOUNT_H__ +#define __G_MOUNT_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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-unmount 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 content 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. + * @get_sort_key: Gets a key used for sorting #GMount instance or %NULL if no such key exists. Since 2.32. + * @get_symbolic_icon: Gets a symbolic #GIcon for the #GMount. Since 2.34. + * + * 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); + + const gchar * (* get_sort_key) (GMount *mount); + GIcon * (* get_symbolic_icon) (GMount *mount); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_mount_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GFile * g_mount_get_root (GMount *mount); +GLIB_AVAILABLE_IN_ALL +GFile * g_mount_get_default_location (GMount *mount); +GLIB_AVAILABLE_IN_ALL +char * g_mount_get_name (GMount *mount); +GLIB_AVAILABLE_IN_ALL +GIcon * g_mount_get_icon (GMount *mount); +GLIB_AVAILABLE_IN_ALL +GIcon * g_mount_get_symbolic_icon (GMount *mount); +GLIB_AVAILABLE_IN_ALL +char * g_mount_get_uuid (GMount *mount); +GLIB_AVAILABLE_IN_ALL +GVolume * g_mount_get_volume (GMount *mount); +GLIB_AVAILABLE_IN_ALL +GDrive * g_mount_get_drive (GMount *mount); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_can_unmount (GMount *mount); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_can_eject (GMount *mount); + +GLIB_DEPRECATED_FOR(g_mount_unmount_with_operation) +void g_mount_unmount (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_mount_unmount_with_operation_finish) +gboolean g_mount_unmount_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +GLIB_DEPRECATED_FOR(g_mount_eject_with_operation) +void g_mount_eject (GMount *mount, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_mount_eject_with_operation_finish) +gboolean g_mount_eject_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_mount_remount (GMount *mount, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_remount_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_mount_guess_content_type (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gchar ** g_mount_guess_content_type_finish (GMount *mount, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar ** g_mount_guess_content_type_sync (GMount *mount, + gboolean force_rescan, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_is_shadowed (GMount *mount); +GLIB_AVAILABLE_IN_ALL +void g_mount_shadow (GMount *mount); +GLIB_AVAILABLE_IN_ALL +void g_mount_unshadow (GMount *mount); + +GLIB_AVAILABLE_IN_ALL +void g_mount_unmount_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_unmount_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_mount_eject_with_operation (GMount *mount, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_eject_with_operation_finish (GMount *mount, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_mount_get_sort_key (GMount *mount); + +G_END_DECLS + +#endif /* __G_MOUNT_H__ */ diff --git a/gio/gmountoperation.c b/gio/gmountoperation.c new file mode 100644 index 0000000..ec7f5ff --- /dev/null +++ b/gio/gmountoperation.c @@ -0,0 +1,758 @@ +/* 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 "glibintl.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, + SHOW_UNMOUNT_PROGRESS, + 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 G_SOURCE_REMOVE; +} + +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 +show_unmount_progress (GMountOperation *op, + const gchar *message, + gint64 time_left, + gint64 bytes_left) +{ + /* nothing to do */ +} + +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; + klass->show_unmount_progress = show_unmount_progress; + + /** + * 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, + NULL, + 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, + NULL, + 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: (element-type GPid): 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, + NULL, + G_TYPE_NONE, 3, + G_TYPE_STRING, G_TYPE_ARRAY, G_TYPE_STRV); + + /** + * GMountOperation::show-unmount-progress: + * @op: a #GMountOperation: + * @message: string containing a mesage to display to the user + * @time_left: the estimated time left before the operation completes, + * in microseconds, or -1 + * @bytes_left: the amount of bytes to be written before the operation + * completes (or -1 if such amount is not known), or zero if the operation + * is completed + * + * Emitted when an unmount operation has been busy for more than some time + * (typically 1.5 seconds). + * + * When unmounting or ejecting a volume, the kernel might need to flush + * pending data in its buffers to the volume stable storage, and this operation + * can take a considerable amount of time. This signal may be emitted several + * times as long as the unmount operation is outstanding, and then one + * last time when the operation is completed, with @bytes_left set to zero. + * + * Implementations of GMountOperation should handle this signal by + * showing an UI notification, and then dismiss it, or show another notification + * of completion, when @bytes_left reaches zero. + * + * 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.34 + */ + signals[SHOW_UNMOUNT_PROGRESS] = + g_signal_new (I_("show-unmount-progress"), + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GMountOperationClass, show_unmount_progress), + NULL, NULL, NULL, + G_TYPE_NONE, 3, + G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64); + + /** + * 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); +} diff --git a/gio/gmountoperation.h b/gio/gmountoperation.h new file mode 100644 index 0000000..7f8baf1 --- /dev/null +++ b/gio/gmountoperation.h @@ -0,0 +1,142 @@ +/* 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_MOUNT_OPERATION_H__ +#define __G_MOUNT_OPERATION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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[]); + + void (* show_unmount_progress) (GMountOperation *op, + const gchar *message, + gint64 time_left, + gint64 bytes_left); + + /*< 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_mount_operation_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GMountOperation * g_mount_operation_new (void); + +GLIB_AVAILABLE_IN_ALL +const char * g_mount_operation_get_username (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_username (GMountOperation *op, + const char *username); +GLIB_AVAILABLE_IN_ALL +const char * g_mount_operation_get_password (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_password (GMountOperation *op, + const char *password); +GLIB_AVAILABLE_IN_ALL +gboolean g_mount_operation_get_anonymous (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_anonymous (GMountOperation *op, + gboolean anonymous); +GLIB_AVAILABLE_IN_ALL +const char * g_mount_operation_get_domain (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_domain (GMountOperation *op, + const char *domain); +GLIB_AVAILABLE_IN_ALL +GPasswordSave g_mount_operation_get_password_save (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_password_save (GMountOperation *op, + GPasswordSave save); +GLIB_AVAILABLE_IN_ALL +int g_mount_operation_get_choice (GMountOperation *op); +GLIB_AVAILABLE_IN_ALL +void g_mount_operation_set_choice (GMountOperation *op, + int choice); +GLIB_AVAILABLE_IN_ALL +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..71e8936 --- /dev/null +++ b/gio/gnativevolumemonitor.c @@ -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 + */ + +#include "config.h" + +#include + +#include +#include "gnativevolumemonitor.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) +{ +} diff --git a/gio/gnativevolumemonitor.h b/gio/gnativevolumemonitor.h new file mode 100644 index 0000000..e7f6d62 --- /dev/null +++ b/gio/gnativevolumemonitor.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_NATIVE_VOLUME_MONITOR_H__ +#define __G_NATIVE_VOLUME_MONITOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +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..1335d94 --- /dev/null +++ b/gio/gnetworkaddress.c @@ -0,0 +1,1031 @@ +/* -*- 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 "gproxyaddressenumerator.h" +#include "gresolver.h" +#include "gtask.h" +#include "gsocketaddressenumerator.h" +#include "gioerror.h" +#include "gsocketconnectable.h" + +#include + + +/** + * 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; + gchar *scheme; +}; + +enum { + PROP_0, + PROP_HOSTNAME, + PROP_PORT, + PROP_SCHEME, +}; + +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); +static GSocketAddressEnumerator *g_network_address_connectable_proxy_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); + g_free (addr->priv->scheme); + + 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)); + + g_object_class_install_property (gobject_class, PROP_SCHEME, + g_param_spec_string ("scheme", + P_("Scheme"), + P_("URI Scheme"), + NULL, + 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; + connectable_iface->proxy_enumerate = g_network_address_connectable_proxy_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: + 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; + + case PROP_SCHEME: + if (addr->priv->scheme) + g_free (addr->priv->scheme); + addr->priv->scheme = g_value_dup_string (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; + + case PROP_SCHEME: + g_value_set_string (value, addr->priv->scheme); + 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); +} + +static gboolean +g_network_address_parse_sockaddr (GNetworkAddress *addr) +{ + struct addrinfo hints, *res = NULL; + GSocketAddress *sockaddr; + gchar port[32]; + + memset (&hints, 0, sizeof (hints)); + hints.ai_flags = AI_NUMERICHOST +#ifdef AI_NUMERICSERV + | AI_NUMERICSERV +#endif + ; + g_snprintf (port, sizeof (port), "%u", addr->priv->port); + + if (getaddrinfo (addr->priv->hostname, port, &hints, &res) != 0) + return FALSE; + + sockaddr = g_socket_address_new_from_native (res->ai_addr, res->ai_addrlen); + freeaddrinfo (res); + if (!sockaddr || !G_IS_INET_SOCKET_ADDRESS (sockaddr)) + return FALSE; + + addr->priv->sockaddrs = g_list_prepend (addr->priv->sockaddrs, sockaddr); + return TRUE; +} + +/** + * g_network_address_new: + * @hostname: the hostname + * @port: the port + * + * Creates a new #GSocketConnectable for connecting to the given + * @hostname and @port. + * + * Return value: (transfer full) (type GNetworkAddress): 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. + * + * 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. + * + * (The port component of @host_and_port can also be specified as a + * service name rather than as a numeric port, but this functionality + * is deprecated, because it depends on the contents of /etc/services, + * which is generally quite sparse on platforms other than Linux.) + * + * Return value: (transfer full): 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; +} + +/* Allowed characters outside alphanumeric for unreserved. */ +#define G_URI_OTHER_UNRESERVED "-._~" + +/* This or something equivalent will eventually go into glib/guri.h */ +gboolean +_g_uri_parse_authority (const char *uri, + char **host, + guint16 *port, + char **userinfo) +{ + char *tmp_str; + const char *start, *p; + char c; + + g_return_val_if_fail (uri != NULL, FALSE); + + if (host) + *host = NULL; + + if (port) + *port = 0; + + if (userinfo) + *userinfo = NULL; + + /* From RFC 3986 Decodes: + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * hier-part = "//" authority path-abempty + * path-abempty = *( "/" segment ) + * authority = [ userinfo "@" ] host [ ":" port ] + */ + + /* Check we have a valid scheme */ + tmp_str = g_uri_parse_scheme (uri); + + if (tmp_str == NULL) + return FALSE; + + g_free (tmp_str); + + /* Decode hier-part: + * hier-part = "//" authority path-abempty + */ + p = uri; + start = strstr (p, "//"); + + if (start == NULL) + return FALSE; + + start += 2; + + if (strchr (start, '@') != NULL) + { + /* Decode userinfo: + * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * pct-encoded = "%" HEXDIG HEXDIG + */ + p = start; + while (1) + { + c = *p++; + + if (c == '@') + break; + + /* pct-encoded */ + if (c == '%') + { + if (!(g_ascii_isxdigit (p[0]) || + g_ascii_isxdigit (p[1]))) + return FALSE; + + p++; + + continue; + } + + /* unreserved / sub-delims / : */ + if (!(g_ascii_isalnum (c) || + strchr (G_URI_OTHER_UNRESERVED, c) || + strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) || + c == ':')) + return FALSE; + } + + if (userinfo) + *userinfo = g_strndup (start, p - start - 1); + + start = p; + } + else + { + p = start; + } + + + /* decode host: + * host = IP-literal / IPv4address / reg-name + * reg-name = *( unreserved / pct-encoded / sub-delims ) + */ + + /* If IPv6 or IPvFuture */ + if (*p == '[') + { + start++; + p++; + while (1) + { + c = *p++; + + if (c == ']') + break; + + /* unreserved / sub-delims */ + if (!(g_ascii_isalnum (c) || + strchr (G_URI_OTHER_UNRESERVED, c) || + strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) || + c == ':' || + c == '.')) + goto error; + } + } + else + { + while (1) + { + c = *p++; + + if (c == ':' || + c == '/' || + c == '?' || + c == '#' || + c == '\0') + break; + + /* pct-encoded */ + if (c == '%') + { + if (!(g_ascii_isxdigit (p[0]) || + g_ascii_isxdigit (p[1]))) + goto error; + + p++; + + continue; + } + + /* unreserved / sub-delims */ + if (!(g_ascii_isalnum (c) || + strchr (G_URI_OTHER_UNRESERVED, c) || + strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c))) + goto error; + } + } + + if (host) + *host = g_uri_unescape_segment (start, p - 1, NULL); + + if (c == ':') + { + /* Decode pot: + * port = *DIGIT + */ + guint tmp = 0; + + while (1) + { + c = *p++; + + if (c == '/' || + c == '?' || + c == '#' || + c == '\0') + break; + + if (!g_ascii_isdigit (c)) + goto error; + + tmp = (tmp * 10) + (c - '0'); + + if (tmp > 65535) + goto error; + } + if (port) + *port = (guint16) tmp; + } + + return TRUE; + +error: + if (host && *host) + { + g_free (*host); + *host = NULL; + } + + if (userinfo && *userinfo) + { + g_free (*userinfo); + *userinfo = NULL; + } + + return FALSE; +} + +gchar * +_g_uri_from_authority (const gchar *protocol, + const gchar *host, + guint port, + const gchar *userinfo) +{ + GString *uri; + + uri = g_string_new (protocol); + g_string_append (uri, "://"); + + if (userinfo) + { + g_string_append_uri_escaped (uri, userinfo, G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, FALSE); + g_string_append_c (uri, '@'); + } + + if (g_hostname_is_non_ascii (host)) + { + gchar *ace_encoded = g_hostname_to_ascii (host); + + if (!ace_encoded) + { + g_string_free (uri, TRUE); + return NULL; + } + g_string_append (uri, ace_encoded); + g_free (ace_encoded); + } + else if (strchr (host, ':')) + g_string_append_printf (uri, "[%s]", host); + else + g_string_append (uri, host); + + if (port != 0) + g_string_append_printf (uri, ":%u", port); + + return g_string_free (uri, FALSE); +} + +/** + * g_network_address_parse_uri: + * @uri: the hostname and optionally a port + * @default_port: The default port if none is found in the URI + * @error: a pointer to a #GError, or %NULL + * + * Creates a new #GSocketConnectable for connecting to the given + * @uri. May fail and return %NULL in case parsing @uri fails. + * + * Using this rather than g_network_address_new() or + * g_network_address_parse() allows #GSocketClient to determine + * when to use application-specific proxy protocols. + * + * Return value: (transfer full): the new #GNetworkAddress, or %NULL on error + * + * Since: 2.26 + */ +GSocketConnectable * +g_network_address_parse_uri (const gchar *uri, + guint16 default_port, + GError **error) +{ + GSocketConnectable *conn; + gchar *scheme; + gchar *hostname; + guint16 port; + + if (!_g_uri_parse_authority (uri, &hostname, &port, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Invalid URI '%s'", + uri); + return NULL; + } + + if (port == 0) + port = default_port; + + scheme = g_uri_parse_scheme (uri); + + conn = g_object_new (G_TYPE_NETWORK_ADDRESS, + "hostname", hostname, + "port", port, + "scheme", scheme, + NULL); + + g_free (scheme); + g_free (hostname); + + return conn; +} + +/** + * 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; +} + +/** + * g_network_address_get_scheme: + * @addr: a #GNetworkAddress + * + * Gets @addr's scheme + * + * Return value: @addr's scheme (%NULL if not built from URI) + * + * Since: 2.26 + */ +const gchar * +g_network_address_get_scheme (GNetworkAddress *addr) +{ + g_return_val_if_fail (G_IS_NETWORK_ADDRESS (addr), NULL); + + return addr->priv->scheme; +} + +#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 *addresses; + GList *next; +} GNetworkAddressAddressEnumerator; + +typedef struct { + GSocketAddressEnumeratorClass parent_class; + +} GNetworkAddressAddressEnumeratorClass; + +static GType _g_network_address_address_enumerator_get_type (void); +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->addresses == NULL) + { + if (!addr_enum->addr->priv->sockaddrs) + g_network_address_parse_sockaddr (addr_enum->addr); + 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->addresses = addr_enum->addr->priv->sockaddrs; + addr_enum->next = addr_enum->addresses; + } + + if (addr_enum->next == NULL) + return NULL; + + sockaddr = addr_enum->next->data; + addr_enum->next = addr_enum->next->next; + return g_object_ref (sockaddr); +} + +static void +have_addresses (GNetworkAddressAddressEnumerator *addr_enum, + GTask *task, GError *error) +{ + GSocketAddress *sockaddr; + + addr_enum->addresses = addr_enum->addr->priv->sockaddrs; + addr_enum->next = addr_enum->addresses; + + if (addr_enum->next) + { + sockaddr = g_object_ref (addr_enum->next->data); + addr_enum->next = addr_enum->next->next; + } + else + sockaddr = NULL; + + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, sockaddr, g_object_unref); + g_object_unref (task); +} + +static void +got_addresses (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GNetworkAddressAddressEnumerator *addr_enum = g_task_get_source_object (task); + GResolver *resolver = G_RESOLVER (source_object); + GList *addresses; + GError *error = NULL; + + if (!addr_enum->addr->priv->sockaddrs) + { + addresses = g_resolver_lookup_by_name_finish (resolver, result, &error); + + if (!error) + g_network_address_set_addresses (addr_enum->addr, addresses); + } + have_addresses (addr_enum, task, error); +} + +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); + GSocketAddress *sockaddr; + GTask *task; + + task = g_task_new (addr_enum, cancellable, callback, user_data); + + if (addr_enum->addresses == NULL) + { + if (!addr_enum->addr->priv->sockaddrs) + { + if (g_network_address_parse_sockaddr (addr_enum->addr)) + have_addresses (addr_enum, task, NULL); + else + { + GResolver *resolver = g_resolver_get_default (); + + g_resolver_lookup_by_name_async (resolver, + addr_enum->addr->priv->hostname, + cancellable, + got_addresses, task); + g_object_unref (resolver); + } + return; + } + + addr_enum->addresses = addr_enum->addr->priv->sockaddrs; + addr_enum->next = addr_enum->addresses; + } + + if (addr_enum->next) + { + sockaddr = g_object_ref (addr_enum->next->data); + addr_enum->next = addr_enum->next->next; + } + else + sockaddr = NULL; + + g_task_return_pointer (task, sockaddr, g_object_unref); + g_object_unref (task); +} + +static GSocketAddress * +g_network_address_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, enumerator), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +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; +} + +static GSocketAddressEnumerator * +g_network_address_connectable_proxy_enumerate (GSocketConnectable *connectable) +{ + GNetworkAddress *self = G_NETWORK_ADDRESS (connectable); + GSocketAddressEnumerator *proxy_enum; + gchar *uri; + + uri = _g_uri_from_authority (self->priv->scheme ? self->priv->scheme : "none", + self->priv->hostname, + self->priv->port, + NULL); + + proxy_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR, + "connectable", connectable, + "uri", uri, + NULL); + + g_free (uri); + + return proxy_enum; +} diff --git a/gio/gnetworkaddress.h b/gio/gnetworkaddress.h new file mode 100644 index 0000000..326ab21 --- /dev/null +++ b/gio/gnetworkaddress.h @@ -0,0 +1,80 @@ +/* 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_NETWORK_ADDRESS_H__ +#define __G_NETWORK_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_network_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketConnectable *g_network_address_new (const gchar *hostname, + guint16 port); +GLIB_AVAILABLE_IN_ALL +GSocketConnectable *g_network_address_parse (const gchar *host_and_port, + guint16 default_port, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketConnectable *g_network_address_parse_uri (const gchar *uri, + guint16 default_port, + GError **error); +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_address_get_hostname (GNetworkAddress *addr); +GLIB_AVAILABLE_IN_ALL +guint16 g_network_address_get_port (GNetworkAddress *addr); +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_address_get_scheme (GNetworkAddress *addr); + + +G_END_DECLS + +#endif /* __G_NETWORK_ADDRESS_H__ */ diff --git a/gio/gnetworking.c b/gio/gnetworking.c new file mode 100644 index 0000000..24c4013 --- /dev/null +++ b/gio/gnetworking.c @@ -0,0 +1,79 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 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 "gnetworking.h" + +/** + * SECTION:gnetworking + * @title: gnetworking.h + * @short_description: System networking includes + * @include: gio/gnetworking.h + * + * The gnetworking.h header can be included to get + * various low-level networking-related system headers, automatically + * taking care of certain portability issues for you. + * + * This can be used, for example, if you want to call setsockopt() + * on a #GSocket. + * + * Note that while WinSock has many of the same APIs as the + * traditional UNIX socket API, most of them behave at least slightly + * differently (particularly with respect to error handling). If you + * want your code to work under both UNIX and Windows, you will need + * to take these differences into account. + * + * Also, under glibc, certain non-portable functions are only visible + * in the headers if you define _GNU_SOURCE before + * including them. Note that this symbol must be defined before + * including any headers, or it may not take + * effect. + */ + +/** + * g_networking_init: + * + * Initializes the platform networking libraries (eg, on Windows, this + * calls WSAStartup()). GLib will call this itself if it is needed, so + * you only need to call it if you directly call system networking + * functions (without calling any GLib networking functions first). + * + * Since: 2.36 + */ +void +g_networking_init (void) +{ +#ifdef G_OS_WIN32 + static volatile gsize inited = 0; + + if (g_once_init_enter (&inited)) + { + WSADATA wsadata; + + if (WSAStartup (MAKEWORD (2, 0), &wsadata) != 0) + g_error ("Windows Sockets could not be initialized"); + + g_once_init_leave (&inited, 1); + } +#endif +} diff --git a/gio/gnetworking.h.in b/gio/gnetworking.h.in new file mode 100644 index 0000000..99bdadd --- /dev/null +++ b/gio/gnetworking.h.in @@ -0,0 +1,83 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008-2011 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_NETWORKING_H__ +#define __G_NETWORKING_H__ + +#include + +#ifdef G_OS_WIN32 + +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#include +#undef interface +#include +#include +#include +@WSPIAPI_INCLUDE@ + +#else /* !G_OS_WIN32 */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +@NAMESER_COMPAT_INCLUDE@ + +#ifndef T_SRV +#define T_SRV 33 +#endif + +#ifndef _PATH_RESCONF +#define _PATH_RESCONF "/etc/resolv.conf" +#endif + +#ifndef CMSG_LEN +/* CMSG_LEN and CMSG_SPACE are defined by RFC 2292, but missing on + * some older platforms. + */ +#define CMSG_LEN(len) ((size_t)CMSG_DATA((struct cmsghdr *)NULL) + (len)) + +/* CMSG_SPACE must add at least as much padding as CMSG_NXTHDR() + * adds. We overestimate here. + */ +#define GLIB_ALIGN_TO_SIZEOF(len, obj) (((len) + sizeof (obj) - 1) & ~(sizeof (obj) - 1)) +#define CMSG_SPACE(len) GLIB_ALIGN_TO_SIZEOF (CMSG_LEN (len), struct cmsghdr) +#endif +#endif + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_36 +void g_networking_init (void); + +G_END_DECLS + +#endif /* __G_NETWORKING_H__ */ diff --git a/gio/gnetworking.h.win32 b/gio/gnetworking.h.win32 new file mode 100644 index 0000000..c6e11a4 --- /dev/null +++ b/gio/gnetworking.h.win32 @@ -0,0 +1,82 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008-2011 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_NETWORKING_H__ +#define __G_NETWORKING_H__ + +#include + +#ifdef G_OS_WIN32 + +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif +#include +#undef interface +#include +#include +#include +#include + +#else /* !G_OS_WIN32 */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifndef T_SRV +#define T_SRV 33 +#endif + +#ifndef _PATH_RESCONF +#define _PATH_RESCONF "/etc/resolv.conf" +#endif + +#ifndef CMSG_LEN +/* CMSG_LEN and CMSG_SPACE are defined by RFC 2292, but missing on + * some older platforms. + */ +#define CMSG_LEN(len) ((size_t)CMSG_DATA((struct cmsghdr *)NULL) + (len)) + +/* CMSG_SPACE must add at least as much padding as CMSG_NXTHDR() + * adds. We overestimate here. + */ +#define GLIB_ALIGN_TO_SIZEOF(len, obj) (((len) + sizeof (obj) - 1) & ~(sizeof (obj) - 1)) +#define CMSG_SPACE(len) GLIB_ALIGN_TO_SIZEOF (CMSG_LEN (len), struct cmsghdr) +#endif +#endif + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_2_36 +void g_networking_init (void); + +G_END_DECLS + +#endif /* __G_NETWORKING_H__ */ diff --git a/gio/gnetworkingprivate.h b/gio/gnetworkingprivate.h new file mode 100644 index 0000000..1a299c9 --- /dev/null +++ b/gio/gnetworkingprivate.h @@ -0,0 +1,44 @@ +/* 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__ + +#include "gnetworking.h" + +G_BEGIN_DECLS + +gboolean _g_uri_parse_authority (const char *uri, + char **host, + guint16 *port, + char **userinfo); +gchar * _g_uri_from_authority (const gchar *protocol, + const gchar *host, + guint port, + const gchar *userinfo); + +gint g_socket (gint domain, + gint type, + gint protocol, + GError **error); + +G_END_DECLS + +#endif /* __G_NETWORKINGPRIVATE_H__ */ diff --git a/gio/gnetworkmonitor.c b/gio/gnetworkmonitor.c new file mode 100644 index 0000000..ef5389b --- /dev/null +++ b/gio/gnetworkmonitor.c @@ -0,0 +1,286 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "gnetworkmonitor.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "ginitable.h" +#include "gioenumtypes.h" +#include "giomodule-priv.h" +#include "gtask.h" + +/** + * SECTION:gnetworkmonitor + * @title: GNetworkMonitor + * @short_description: Network status monitor + * @include: gio/gio.h + * + * #GNetworkMonitor provides an easy-to-use cross-platform API + * for monitoring network connectivity. On Linux, the implementation + * is based on the kernel's netlink interface. + */ + +/** + * GNetworkMonitor: + * + * #GNetworkMonitor monitors the status of network connections and + * indicates when a possibly-user-visible change has occurred. + * + * Since: 2.32 + */ + +G_DEFINE_INTERFACE_WITH_CODE (GNetworkMonitor, g_network_monitor, G_TYPE_OBJECT, + g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_INITABLE);) + + +enum { + NETWORK_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +/** + * g_network_monitor_get_default: + * + * Gets the default #GNetworkMonitor for the system. + * + * Returns: (transfer none): a #GNetworkMonitor + * + * Since: 2.32 + */ +GNetworkMonitor * +g_network_monitor_get_default (void) +{ + return _g_io_module_get_default (G_NETWORK_MONITOR_EXTENSION_POINT_NAME, + "GIO_USE_NETWORK_MONITOR", + NULL); +} + +/** + * g_network_monitor_get_network_available: + * @monitor: the #GNetworkMonitor + * + * Checks if the network is available. "Available" here means that the + * system has a default route available for at least one of IPv4 or + * IPv6. It does not necessarily imply that the public Internet is + * reachable. See #GNetworkMonitor:network-available for more details. + * + * Return value: whether the network is available + * + * Since: 2.32 + */ +gboolean +g_network_monitor_get_network_available (GNetworkMonitor *monitor) +{ + gboolean available = FALSE; + + g_object_get (G_OBJECT (monitor), "network-available", &available, NULL); + return available; +} + +/** + * g_network_monitor_can_reach: + * @monitor: a #GNetworkMonitor + * @connectable: a #GSocketConnectable + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Attempts to determine whether or not the host pointed to by + * @connectable can be reached, without actually trying to connect to + * it. + * + * This may return %TRUE even when #GNetworkMonitor:network-available + * is %FALSE, if, for example, @monitor can determine that + * @connectable refers to a host on a local network. + * + * If @monitor believes that an attempt to connect to @connectable + * will succeed, it will return %TRUE. Otherwise, it will return + * %FALSE and set @error to an appropriate error (such as + * %G_IO_ERROR_HOST_UNREACHABLE). + * + * Note that although this does not attempt to connect to + * @connectable, it may still block for a brief period of time (eg, + * trying to do multicast DNS on the local network), so if you do not + * want to block, you should use g_network_monitor_can_reach_async(). + * + * Return value: %TRUE if @connectable is reachable, %FALSE if not. + * + * Since: 2.32 + */ +gboolean +g_network_monitor_can_reach (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error) +{ + GNetworkMonitorInterface *iface; + + iface = G_NETWORK_MONITOR_GET_INTERFACE (monitor); + return iface->can_reach (monitor, connectable, cancellable, error); +} + +static void +g_network_monitor_real_can_reach_async (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *error = NULL; + + task = g_task_new (monitor, cancellable, callback, user_data); + if (g_network_monitor_can_reach (monitor, connectable, cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_network_monitor_can_reach_async: + * @monitor: a #GNetworkMonitor + * @connectable: a #GSocketConnectable + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback to call when the + * request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Asynchronously attempts to determine whether or not the host + * pointed to by @connectable can be reached, without actually + * trying to connect to it. + * + * For more details, see g_network_monitor_can_reach(). + * + * When the operation is finished, @callback will be called. + * You can then call g_network_monitor_can_reach_finish() + * to get the result of the operation. + */ +void +g_network_monitor_can_reach_async (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GNetworkMonitorInterface *iface; + + iface = G_NETWORK_MONITOR_GET_INTERFACE (monitor); + iface->can_reach_async (monitor, connectable, cancellable, callback, user_data); +} + +static gboolean +g_network_monitor_real_can_reach_finish (GNetworkMonitor *monitor, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, monitor), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * g_network_monitor_can_reach_finish: + * @monitor: a #GNetworkMonitor + * @result: a #GAsyncResult + * @error: return location for errors, or %NULL + * + * Finishes an async network connectivity test. + * See g_network_monitor_can_reach_async(). + * + * Return value: %TRUE if network is reachable, %FALSE if not. + */ +gboolean +g_network_monitor_can_reach_finish (GNetworkMonitor *monitor, + GAsyncResult *result, + GError **error) +{ + GNetworkMonitorInterface *iface; + + iface = G_NETWORK_MONITOR_GET_INTERFACE (monitor); + return iface->can_reach_finish (monitor, result, error); +} + +static void +g_network_monitor_default_init (GNetworkMonitorInterface *iface) +{ + iface->can_reach_async = g_network_monitor_real_can_reach_async; + iface->can_reach_finish = g_network_monitor_real_can_reach_finish; + + /** + * GNetworkMonitor::network-changed: + * @monitor: a #GNetworkMonitor + * @available: the current value of #GNetworkMonitor:network-available + * + * Emitted when the network configuration changes. If @available is + * %TRUE, then some hosts may be reachable that were not reachable + * before, while others that were reachable before may no longer be + * reachable. If @available is %FALSE, then no remote hosts are + * reachable. + * + * Since: 2.32 + */ + signals[NETWORK_CHANGED] = + g_signal_new (I_("network-changed"), + G_TYPE_NETWORK_MONITOR, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GNetworkMonitorInterface, network_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, + G_TYPE_BOOLEAN); + + /** + * GNetworkMonitor:network-available: + * + * Whether the network is considered available. That is, whether the + * system has a default route for at least one of IPv4 or IPv6. + * + * Real-world networks are of course much more complicated than + * this; the machine may be connected to a wifi hotspot that + * requires payment before allowing traffic through, or may be + * connected to a functioning router that has lost its own upstream + * connectivity. Some hosts might only be accessible when a VPN is + * active. Other hosts might only be accessible when the VPN is + * not active. Thus, it is best to use + * g_network_monitor_can_reach() or + * g_network_monitor_can_reach_async() to test for reachability on a + * host-by-host basis. (On the other hand, when the property is + * %FALSE, the application can reasonably expect that no remote + * hosts at all are reachable, and should indicate this to the user + * in its UI.) + * + * See also #GNetworkMonitor::network-changed. + * + * Since: 2.32 + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("network-available", + P_("Network available"), + P_("Whether the network is available"), + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} diff --git a/gio/gnetworkmonitor.h b/gio/gnetworkmonitor.h new file mode 100644 index 0000000..373934e --- /dev/null +++ b/gio/gnetworkmonitor.h @@ -0,0 +1,95 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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_NETWORK_MONITOR_H__ +#define __G_NETWORK_MONITOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_NETWORK_MONITOR_EXTENSION_POINT_NAME: + * + * Extension point for network status monitoring functionality. + * See Extending GIO. + * + * Since: 2.30 + */ +#define G_NETWORK_MONITOR_EXTENSION_POINT_NAME "gio-network-monitor" + +#define G_TYPE_NETWORK_MONITOR (g_network_monitor_get_type ()) +#define G_NETWORK_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NETWORK_MONITOR, GNetworkMonitor)) +#define G_IS_NETWORK_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NETWORK_MONITOR)) +#define G_NETWORK_MONITOR_GET_INTERFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), G_TYPE_NETWORK_MONITOR, GNetworkMonitorInterface)) + +typedef struct _GNetworkMonitorInterface GNetworkMonitorInterface; + +struct _GNetworkMonitorInterface { + GTypeInterface g_iface; + + void (*network_changed) (GNetworkMonitor *monitor, + gboolean available); + + gboolean (*can_reach) (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error); + void (*can_reach_async) (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*can_reach_finish) (GNetworkMonitor *monitor, + GAsyncResult *result, + GError **error); +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_network_monitor_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_32 +GNetworkMonitor *g_network_monitor_get_default (void); + +GLIB_AVAILABLE_IN_ALL +gboolean g_network_monitor_get_network_available (GNetworkMonitor *monitor); + +GLIB_AVAILABLE_IN_ALL +gboolean g_network_monitor_can_reach (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_network_monitor_can_reach_async (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_network_monitor_can_reach_finish (GNetworkMonitor *monitor, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_NETWORK_MONITOR_H__ */ diff --git a/gio/gnetworkmonitorbase.c b/gio/gnetworkmonitorbase.c new file mode 100644 index 0000000..2494ca3 --- /dev/null +++ b/gio/gnetworkmonitorbase.c @@ -0,0 +1,416 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "gnetworkmonitorbase.h" +#include "ginetaddress.h" +#include "ginetaddressmask.h" +#include "ginetsocketaddress.h" +#include "ginitable.h" +#include "gioerror.h" +#include "giomodule-priv.h" +#include "gnetworkmonitor.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" +#include "glibintl.h" + +static void g_network_monitor_base_iface_init (GNetworkMonitorInterface *iface); +static void g_network_monitor_base_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GNetworkMonitorBase, g_network_monitor_base, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_network_monitor_base_initable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_NETWORK_MONITOR, + g_network_monitor_base_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_NETWORK_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "base", + 0)) + +enum +{ + PROP_0, + + PROP_NETWORK_AVAILABLE +}; + +struct _GNetworkMonitorBasePrivate +{ + GPtrArray *networks; + gboolean have_ipv4_default_route; + gboolean have_ipv6_default_route; + gboolean is_available; + + GMainContext *context; + GSource *network_changed_source; + gboolean initializing; +}; + +static guint network_changed_signal = 0; + +static void queue_network_changed (GNetworkMonitorBase *monitor); + +static void +g_network_monitor_base_init (GNetworkMonitorBase *monitor) +{ + monitor->priv = G_TYPE_INSTANCE_GET_PRIVATE (monitor, + G_TYPE_NETWORK_MONITOR_BASE, + GNetworkMonitorBasePrivate); + + monitor->priv->networks = g_ptr_array_new_with_free_func (g_object_unref); + monitor->priv->context = g_main_context_get_thread_default (); + if (monitor->priv->context) + g_main_context_ref (monitor->priv->context); + + monitor->priv->initializing = TRUE; + queue_network_changed (monitor); +} + +static void +g_network_monitor_base_constructed (GObject *object) +{ + GNetworkMonitorBase *monitor = G_NETWORK_MONITOR_BASE (object); + + if (G_OBJECT_TYPE (monitor) == G_TYPE_NETWORK_MONITOR_BASE) + { + GInetAddressMask *mask; + + /* We're the dumb base class, not a smarter subclass. So just + * assume that the network is available. + */ + mask = g_inet_address_mask_new_from_string ("0.0.0.0/0", NULL); + g_network_monitor_base_add_network (monitor, mask); + g_object_unref (mask); + + mask = g_inet_address_mask_new_from_string ("::/0", NULL); + g_network_monitor_base_add_network (monitor, mask); + g_object_unref (mask); + } +} + +static void +g_network_monitor_base_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GNetworkMonitorBase *monitor = G_NETWORK_MONITOR_BASE (object); + + switch (prop_id) + { + case PROP_NETWORK_AVAILABLE: + g_value_set_boolean (value, monitor->priv->is_available); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + +} + +static void +g_network_monitor_base_finalize (GObject *object) +{ + GNetworkMonitorBase *monitor = G_NETWORK_MONITOR_BASE (object); + + g_ptr_array_free (monitor->priv->networks, TRUE); + if (monitor->priv->network_changed_source) + { + g_source_destroy (monitor->priv->network_changed_source); + g_source_unref (monitor->priv->network_changed_source); + } + if (monitor->priv->context) + g_main_context_unref (monitor->priv->context); + + G_OBJECT_CLASS (g_network_monitor_base_parent_class)->finalize (object); +} + +static void +g_network_monitor_base_class_init (GNetworkMonitorBaseClass *monitor_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (monitor_class); + + g_type_class_add_private (monitor_class, sizeof (GNetworkMonitorBasePrivate)); + + gobject_class->constructed = g_network_monitor_base_constructed; + gobject_class->get_property = g_network_monitor_base_get_property; + gobject_class->finalize = g_network_monitor_base_finalize; + + g_object_class_override_property (gobject_class, PROP_NETWORK_AVAILABLE, "network-available"); +} + +static gboolean +g_network_monitor_base_can_reach (GNetworkMonitor *monitor, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error) +{ + GNetworkMonitorBasePrivate *priv = G_NETWORK_MONITOR_BASE (monitor)->priv; + GSocketAddressEnumerator *enumerator; + GSocketAddress *addr; + + if (priv->have_ipv4_default_route && + priv->have_ipv6_default_route) + return TRUE; + + if (priv->networks->len == 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NETWORK_UNREACHABLE, + _("Network unreachable")); + return FALSE; + } + + enumerator = g_socket_connectable_proxy_enumerate (connectable); + addr = g_socket_address_enumerator_next (enumerator, cancellable, error); + if (!addr) + { + /* Either the user cancelled, or DNS resolution failed */ + g_object_unref (enumerator); + return FALSE; + } + + while (addr) + { + if (G_IS_INET_SOCKET_ADDRESS (addr)) + { + GInetAddress *iaddr; + int i; + + iaddr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (addr)); + for (i = 0; i < priv->networks->len; i++) + { + if (g_inet_address_mask_matches (priv->networks->pdata[i], iaddr)) + { + g_object_unref (addr); + g_object_unref (enumerator); + return TRUE; + } + } + } + + g_object_unref (addr); + addr = g_socket_address_enumerator_next (enumerator, cancellable, error); + } + g_object_unref (enumerator); + + if (error && !*error) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE, + _("Host unreachable")); + } + return FALSE; +} + +static void +g_network_monitor_base_iface_init (GNetworkMonitorInterface *monitor_iface) +{ + monitor_iface->can_reach = g_network_monitor_base_can_reach; + + network_changed_signal = g_signal_lookup ("network-changed", G_TYPE_NETWORK_MONITOR); +} + +static gboolean +g_network_monitor_base_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_network_monitor_base_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_network_monitor_base_initable_init; +} + +static gboolean +emit_network_changed (gpointer user_data) +{ + GNetworkMonitorBase *monitor = user_data; + gboolean is_available; + + g_object_ref (monitor); + + if (monitor->priv->initializing) + monitor->priv->initializing = FALSE; + else + { + is_available = (monitor->priv->have_ipv4_default_route || + monitor->priv->have_ipv6_default_route); + if (monitor->priv->is_available != is_available) + { + monitor->priv->is_available = is_available; + g_object_notify (G_OBJECT (monitor), "network-available"); + } + + g_signal_emit (monitor, network_changed_signal, 0, is_available); + } + + g_source_unref (monitor->priv->network_changed_source); + monitor->priv->network_changed_source = NULL; + + g_object_unref (monitor); + return FALSE; +} + +static void +queue_network_changed (GNetworkMonitorBase *monitor) +{ + if (!monitor->priv->network_changed_source) + { + GSource *source; + + source = g_idle_source_new (); + /* Use G_PRIORITY_HIGH_IDLE priority so that multiple + * network-change-related notifications coming in at + * G_PRIORITY_DEFAULT will get coalesced into one signal + * emission. + */ + g_source_set_priority (source, G_PRIORITY_HIGH_IDLE); + g_source_set_callback (source, emit_network_changed, monitor, NULL); + g_source_attach (source, monitor->priv->context); + monitor->priv->network_changed_source = source; + } + + /* Normally we wait to update is_available until we emit the signal, + * to keep things consistent. But when we're first creating the + * object, we want it to be correct right away. + */ + if (monitor->priv->initializing) + { + monitor->priv->is_available = (monitor->priv->have_ipv4_default_route || + monitor->priv->have_ipv6_default_route); + } +} + +/** + * g_network_monitor_base_add_network: + * @monitor: the #GNetworkMonitorBase + * @network: a #GInetAddressMask + * + * Adds @network to @monitor's list of available networks. + * + * Since: 2.32 + */ +void +g_network_monitor_base_add_network (GNetworkMonitorBase *monitor, + GInetAddressMask *network) +{ + int i; + + for (i = 0; i < monitor->priv->networks->len; i++) + { + if (g_inet_address_mask_equal (monitor->priv->networks->pdata[i], network)) + return; + } + + g_ptr_array_add (monitor->priv->networks, g_object_ref (network)); + if (g_inet_address_mask_get_length (network) == 0) + { + switch (g_inet_address_mask_get_family (network)) + { + case G_SOCKET_FAMILY_IPV4: + monitor->priv->have_ipv4_default_route = TRUE; + break; + case G_SOCKET_FAMILY_IPV6: + monitor->priv->have_ipv6_default_route = TRUE; + break; + default: + break; + } + } + + /* Don't emit network-changed when multicast-link-local routing + * changes. This rather arbitrary decision is mostly because it + * seems to change quite often... + */ + if (g_inet_address_get_is_mc_link_local (g_inet_address_mask_get_address (network))) + return; + + queue_network_changed (monitor); +} + +/** + * g_network_monitor_base_remove_network: + * @monitor: the #GNetworkMonitorBase + * @network: a #GInetAddressMask + * + * Removes @network from @monitor's list of available networks. + * + * Since: 2.32 + */ +void +g_network_monitor_base_remove_network (GNetworkMonitorBase *monitor, + GInetAddressMask *network) +{ + int i; + + for (i = 0; i < monitor->priv->networks->len; i++) + { + if (g_inet_address_mask_equal (monitor->priv->networks->pdata[i], network)) + { + g_ptr_array_remove_index_fast (monitor->priv->networks, i); + + if (g_inet_address_mask_get_length (network) == 0) + { + switch (g_inet_address_mask_get_family (network)) + { + case G_SOCKET_FAMILY_IPV4: + monitor->priv->have_ipv4_default_route = FALSE; + break; + case G_SOCKET_FAMILY_IPV6: + monitor->priv->have_ipv6_default_route = FALSE; + break; + default: + break; + } + } + + queue_network_changed (monitor); + return; + } + } +} + +/** + * g_network_monitor_base_set_networks: + * @monitor: the #GNetworkMonitorBase + * @networks: (array length=length): an array of #GInetAddressMask + * @length: length of @networks + * + * Drops @monitor's current list of available networks and replaces + * it with @networks. + */ +void +g_network_monitor_base_set_networks (GNetworkMonitorBase *monitor, + GInetAddressMask **networks, + gint length) +{ + int i; + + g_ptr_array_set_size (monitor->priv->networks, 0); + monitor->priv->have_ipv4_default_route = FALSE; + monitor->priv->have_ipv6_default_route = FALSE; + + for (i = 0; i < length; i++) + g_network_monitor_base_add_network (monitor, networks[i]); +} diff --git a/gio/gnetworkmonitorbase.h b/gio/gnetworkmonitorbase.h new file mode 100644 index 0000000..225a1ba --- /dev/null +++ b/gio/gnetworkmonitorbase.h @@ -0,0 +1,70 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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_NETWORK_MONITOR_BASE_H__ +#define __G_NETWORK_MONITOR_BASE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_NETWORK_MONITOR_BASE (g_network_monitor_base_get_type ()) +#define G_NETWORK_MONITOR_BASE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NETWORK_MONITOR_BASE, GNetworkMonitorBase)) +#define G_NETWORK_MONITOR_BASE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_NETWORK_MONITOR_BASE, GNetworkMonitorBaseClass)) +#define G_IS_NETWORK_MONITOR_BASE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NETWORK_MONITOR_BASE)) +#define G_IS_NETWORK_MONITOR_BASE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NETWORK_MONITOR_BASE)) +#define G_NETWORK_MONITOR_BASE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_NETWORK_MONITOR_BASE, GNetworkMonitorBaseClass)) + +typedef struct _GNetworkMonitorBase GNetworkMonitorBase; +typedef struct _GNetworkMonitorBaseClass GNetworkMonitorBaseClass; +typedef struct _GNetworkMonitorBasePrivate GNetworkMonitorBasePrivate; + +struct _GNetworkMonitorBase { + GObject parent_instance; + + GNetworkMonitorBasePrivate *priv; +}; + +struct _GNetworkMonitorBaseClass { + GObjectClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_network_monitor_base_get_type (void); + +/*< protected >*/ +GLIB_AVAILABLE_IN_2_32 +void g_network_monitor_base_add_network (GNetworkMonitorBase *monitor, + GInetAddressMask *network); +GLIB_AVAILABLE_IN_2_32 +void g_network_monitor_base_remove_network (GNetworkMonitorBase *monitor, + GInetAddressMask *network); +GLIB_AVAILABLE_IN_ALL +void g_network_monitor_base_set_networks (GNetworkMonitorBase *monitor, + GInetAddressMask **networks, + gint length); + +G_END_DECLS + +#endif /* __G_NETWORK_MONITOR_BASE_H__ */ diff --git a/gio/gnetworkmonitornetlink.c b/gio/gnetworkmonitornetlink.c new file mode 100644 index 0000000..17df1da --- /dev/null +++ b/gio/gnetworkmonitornetlink.c @@ -0,0 +1,468 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "gnetworkmonitornetlink.h" +#include "gcredentials.h" +#include "ginetaddressmask.h" +#include "ginitable.h" +#include "giomodule-priv.h" +#include "glibintl.h" +#include "glib/gstdio.h" +#include "gnetworkingprivate.h" +#include "gnetworkmonitor.h" +#include "gsocket.h" +#include "gunixcredentialsmessage.h" + +/* must come at the end to pick system includes from + * gnetworkingprivate.h */ +#include +#include + +static void g_network_monitor_netlink_iface_init (GNetworkMonitorInterface *iface); +static void g_network_monitor_netlink_initable_iface_init (GInitableIface *iface); + +#define g_network_monitor_netlink_get_type _g_network_monitor_netlink_get_type +G_DEFINE_TYPE_WITH_CODE (GNetworkMonitorNetlink, g_network_monitor_netlink, G_TYPE_NETWORK_MONITOR_BASE, + G_IMPLEMENT_INTERFACE (G_TYPE_NETWORK_MONITOR, + g_network_monitor_netlink_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_network_monitor_netlink_initable_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_NETWORK_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "netlink", + 20)) + +struct _GNetworkMonitorNetlinkPrivate +{ + GSocket *sock; + GSource *source, *dump_source; + + GPtrArray *dump_networks; +}; + +static gboolean read_netlink_messages (GSocket *socket, + GIOCondition condition, + gpointer user_data); +static gboolean request_dump (GNetworkMonitorNetlink *nl, + GError **error); + +static void +g_network_monitor_netlink_init (GNetworkMonitorNetlink *nl) +{ + nl->priv = G_TYPE_INSTANCE_GET_PRIVATE (nl, + G_TYPE_NETWORK_MONITOR_NETLINK, + GNetworkMonitorNetlinkPrivate); +} + + +static gboolean +g_network_monitor_netlink_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + GNetworkMonitorNetlink *nl = G_NETWORK_MONITOR_NETLINK (initable); + gint sockfd; + struct sockaddr_nl snl; + + /* We create the socket the old-school way because sockaddr_netlink + * can't be represented as a GSocketAddress + */ + sockfd = g_socket (PF_NETLINK, SOCK_RAW, NETLINK_ROUTE, NULL); + if (sockfd == -1) + { + int errsv = errno; + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Could not create network monitor: %s"), + g_strerror (errno)); + return FALSE; + } + + snl.nl_family = AF_NETLINK; + snl.nl_pid = snl.nl_pad = 0; + snl.nl_groups = RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE; + if (bind (sockfd, (struct sockaddr *)&snl, sizeof (snl)) != 0) + { + int errsv = errno; + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Could not create network monitor: %s"), + g_strerror (errno)); + (void) g_close (sockfd, NULL); + return FALSE; + } + + nl->priv->sock = g_socket_new_from_fd (sockfd, error); + if (error) + { + g_prefix_error (error, "%s", _("Could not create network monitor: ")); + (void) g_close (sockfd, NULL); + return FALSE; + } + + if (!g_socket_set_option (nl->priv->sock, SOL_SOCKET, SO_PASSCRED, + TRUE, NULL)) + { + int errsv = errno; + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv), + _("Could not create network monitor: %s"), + g_strerror (errno)); + return FALSE; + } + + /* Request the current state */ + if (!request_dump (nl, error)) + return FALSE; + + /* And read responses; since we haven't yet marked the socket + * non-blocking, each call will block until a message is received. + */ + while (nl->priv->dump_networks) + { + if (!read_netlink_messages (NULL, G_IO_IN, nl)) + break; + } + + g_socket_set_blocking (nl->priv->sock, FALSE); + nl->priv->source = g_socket_create_source (nl->priv->sock, G_IO_IN, NULL); + g_source_set_callback (nl->priv->source, + (GSourceFunc) read_netlink_messages, nl, NULL); + g_source_attach (nl->priv->source, + g_main_context_get_thread_default ()); + + return TRUE; +} + +static gboolean +request_dump (GNetworkMonitorNetlink *nl, + GError **error) +{ + struct nlmsghdr *n; + struct rtgenmsg *gen; + gchar buf[NLMSG_SPACE (sizeof (*gen))]; + + memset (buf, 0, sizeof (buf)); + n = (struct nlmsghdr*) buf; + n->nlmsg_len = NLMSG_LENGTH (sizeof (*gen)); + n->nlmsg_type = RTM_GETROUTE; + n->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; + n->nlmsg_pid = 0; + gen = NLMSG_DATA (n); + gen->rtgen_family = AF_UNSPEC; + + if (g_socket_send (nl->priv->sock, buf, sizeof (buf), + NULL, error) < 0) + { + g_prefix_error (error, "%s", _("Could not get network status: ")); + return FALSE; + } + + nl->priv->dump_networks = g_ptr_array_new_with_free_func (g_object_unref); + return TRUE; +} + +static gboolean +timeout_request_dump (gpointer user_data) +{ + GNetworkMonitorNetlink *nl = user_data; + + g_source_destroy (nl->priv->dump_source); + g_source_unref (nl->priv->dump_source); + nl->priv->dump_source = NULL; + + request_dump (nl, NULL); + + return FALSE; +} + +static void +queue_request_dump (GNetworkMonitorNetlink *nl) +{ + if (nl->priv->dump_networks) + return; + + if (nl->priv->dump_source) + { + g_source_destroy (nl->priv->dump_source); + g_source_unref (nl->priv->dump_source); + } + + nl->priv->dump_source = g_timeout_source_new (1000); + g_source_set_callback (nl->priv->dump_source, + (GSourceFunc) timeout_request_dump, nl, NULL); + g_source_attach (nl->priv->dump_source, + g_main_context_get_thread_default ()); +} + +static void +add_network (GNetworkMonitorNetlink *nl, + GSocketFamily family, + gint dest_len, + guint8 *dest, + guint8 *gateway) +{ + GInetAddress *dest_addr; + GInetAddressMask *network; + + if (dest) + dest_addr = g_inet_address_new_from_bytes (dest, family); + else + dest_addr = g_inet_address_new_any (family); + network = g_inet_address_mask_new (dest_addr, dest_len, NULL); + g_object_unref (dest_addr); + g_return_if_fail (network != NULL); + + if (nl->priv->dump_networks) + g_ptr_array_add (nl->priv->dump_networks, network); + else + { + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (nl), network); + g_object_unref (network); + } +} + +static void +remove_network (GNetworkMonitorNetlink *nl, + GSocketFamily family, + gint dest_len, + guint8 *dest, + guint8 *gateway) +{ + GInetAddress *dest_addr; + GInetAddressMask *network; + + if (dest) + dest_addr = g_inet_address_new_from_bytes (dest, family); + else + dest_addr = g_inet_address_new_any (family); + network = g_inet_address_mask_new (dest_addr, dest_len, NULL); + g_object_unref (dest_addr); + g_return_if_fail (network != NULL); + + if (nl->priv->dump_networks) + { + GInetAddressMask **dump_networks = (GInetAddressMask **)nl->priv->dump_networks->pdata; + int i; + + for (i = 0; i < nl->priv->dump_networks->len; i++) + { + if (g_inet_address_mask_equal (network, dump_networks[i])) + g_ptr_array_remove_index_fast (nl->priv->dump_networks, i--); + } + g_object_unref (network); + } + else + { + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (nl), network); + g_object_unref (network); + } +} + +static void +finish_dump (GNetworkMonitorNetlink *nl) +{ + g_network_monitor_base_set_networks (G_NETWORK_MONITOR_BASE (nl), + (GInetAddressMask **)nl->priv->dump_networks->pdata, + nl->priv->dump_networks->len); + g_ptr_array_free (nl->priv->dump_networks, TRUE); + nl->priv->dump_networks = NULL; +} + +static gboolean +read_netlink_messages (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + GNetworkMonitorNetlink *nl = user_data; + GInputVector iv; + gssize len; + GSocketControlMessage **cmsgs = NULL; + gint num_cmsgs = 0, i, flags; + GError *error = NULL; + GCredentials *creds; + uid_t sender; + struct nlmsghdr *msg; + struct rtmsg *rtmsg; + struct rtattr *attr; + gsize attrlen; + guint8 *dest, *gateway; + gboolean retval = TRUE; + + iv.buffer = NULL; + iv.size = 0; + + flags = MSG_PEEK | MSG_TRUNC; + len = g_socket_receive_message (nl->priv->sock, NULL, &iv, 1, + NULL, NULL, &flags, NULL, &error); + if (len < 0) + { + g_warning ("Error on netlink socket: %s", error->message); + g_error_free (error); + if (nl->priv->dump_networks) + finish_dump (nl); + return FALSE; + } + + iv.buffer = g_malloc (len); + iv.size = len; + len = g_socket_receive_message (nl->priv->sock, NULL, &iv, 1, + &cmsgs, &num_cmsgs, NULL, NULL, &error); + if (len < 0) + { + g_warning ("Error on netlink socket: %s", error->message); + g_error_free (error); + if (nl->priv->dump_networks) + finish_dump (nl); + return FALSE; + } + + if (num_cmsgs != 1 || !G_IS_UNIX_CREDENTIALS_MESSAGE (cmsgs[0])) + goto done; + + creds = g_unix_credentials_message_get_credentials (G_UNIX_CREDENTIALS_MESSAGE (cmsgs[0])); + sender = g_credentials_get_unix_user (creds, NULL); + if (sender != 0) + goto done; + + msg = (struct nlmsghdr *) iv.buffer; + for (; len > 0; msg = NLMSG_NEXT (msg, len)) + { + if (!NLMSG_OK (msg, (size_t) len)) + { + g_warning ("netlink message was truncated; shouldn't happen..."); + retval = FALSE; + goto done; + } + + switch (msg->nlmsg_type) + { + case RTM_NEWROUTE: + case RTM_DELROUTE: + rtmsg = NLMSG_DATA (msg); + + if (rtmsg->rtm_family != AF_INET && rtmsg->rtm_family != AF_INET6) + continue; + if (rtmsg->rtm_type == RTN_UNREACHABLE) + continue; + + attrlen = NLMSG_PAYLOAD (msg, sizeof (struct rtmsg)); + attr = RTM_RTA (rtmsg); + dest = gateway = NULL; + while (RTA_OK (attr, attrlen)) + { + if (attr->rta_type == RTA_DST) + dest = RTA_DATA (attr); + else if (attr->rta_type == RTA_GATEWAY) + gateway = RTA_DATA (attr); + attr = RTA_NEXT (attr, attrlen); + } + + if (dest || gateway) + { + if (msg->nlmsg_type == RTM_NEWROUTE) + add_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest, gateway); + else + remove_network (nl, rtmsg->rtm_family, rtmsg->rtm_dst_len, dest, gateway); + queue_request_dump (nl); + } + break; + + case NLMSG_DONE: + finish_dump (nl); + goto done; + + case NLMSG_ERROR: + { + struct nlmsgerr *e = NLMSG_DATA (msg); + + g_warning ("netlink error: %s", g_strerror (-e->error)); + } + retval = FALSE; + goto done; + + default: + g_warning ("unexpected netlink message %d", msg->nlmsg_type); + retval = FALSE; + goto done; + } + } + + done: + for (i = 0; i < num_cmsgs; i++) + g_object_unref (cmsgs[i]); + g_free (cmsgs); + + g_free (iv.buffer); + + if (!retval && nl->priv->dump_networks) + finish_dump (nl); + return retval; +} + +static void +g_network_monitor_netlink_finalize (GObject *object) +{ + GNetworkMonitorNetlink *nl = G_NETWORK_MONITOR_NETLINK (object); + + if (nl->priv->sock) + { + g_socket_close (nl->priv->sock, NULL); + g_object_unref (nl->priv->sock); + } + + if (nl->priv->source) + { + g_source_destroy (nl->priv->source); + g_source_unref (nl->priv->source); + } + + if (nl->priv->dump_source) + { + g_source_destroy (nl->priv->dump_source); + g_source_unref (nl->priv->dump_source); + } + + G_OBJECT_CLASS (g_network_monitor_netlink_parent_class)->finalize (object); +} + +static void +g_network_monitor_netlink_class_init (GNetworkMonitorNetlinkClass *nl_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (nl_class); + + g_type_class_add_private (nl_class, sizeof (GNetworkMonitorNetlinkPrivate)); + + gobject_class->finalize = g_network_monitor_netlink_finalize; +} + +static void +g_network_monitor_netlink_iface_init (GNetworkMonitorInterface *monitor_iface) +{ +} + +static void +g_network_monitor_netlink_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_network_monitor_netlink_initable_init; +} diff --git a/gio/gnetworkmonitornetlink.h b/gio/gnetworkmonitornetlink.h new file mode 100644 index 0000000..f6fa22a --- /dev/null +++ b/gio/gnetworkmonitornetlink.h @@ -0,0 +1,57 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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_NETWORK_MONITOR_NETLINK_H__ +#define __G_NETWORK_MONITOR_NETLINK_H__ + +#include "gnetworkmonitorbase.h" + +G_BEGIN_DECLS + +#define G_TYPE_NETWORK_MONITOR_NETLINK (_g_network_monitor_netlink_get_type ()) +#define G_NETWORK_MONITOR_NETLINK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_NETWORK_MONITOR_NETLINK, GNetworkMonitorNetlink)) +#define G_NETWORK_MONITOR_NETLINK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_NETWORK_MONITOR_NETLINK, GNetworkMonitorNetlinkClass)) +#define G_IS_NETWORK_MONITOR_NETLINK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_NETWORK_MONITOR_NETLINK)) +#define G_IS_NETWORK_MONITOR_NETLINK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_NETWORK_MONITOR_NETLINK)) +#define G_NETWORK_MONITOR_NETLINK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_NETWORK_MONITOR_NETLINK, GNetworkMonitorNetlinkClass)) + +typedef struct _GNetworkMonitorNetlink GNetworkMonitorNetlink; +typedef struct _GNetworkMonitorNetlinkClass GNetworkMonitorNetlinkClass; +typedef struct _GNetworkMonitorNetlinkPrivate GNetworkMonitorNetlinkPrivate; + +struct _GNetworkMonitorNetlink { + GNetworkMonitorBase parent_instance; + + GNetworkMonitorNetlinkPrivate *priv; +}; + +struct _GNetworkMonitorNetlinkClass { + GNetworkMonitorBaseClass parent_class; + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[8]; +}; + +GType _g_network_monitor_netlink_get_type (void); + +G_END_DECLS + +#endif /* __G_NETWORK_MONITOR_NETLINK_H__ */ diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c new file mode 100644 index 0000000..9ec0099 --- /dev/null +++ b/gio/gnetworkservice.c @@ -0,0 +1,750 @@ +/* -*- 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 "gioerror.h" +#include "gnetworkaddress.h" +#include "gnetworkingprivate.h" +#include "gresolver.h" +#include "gtask.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" +#include "gsrvtarget.h" + +#include +#include + + +/** + * 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, *scheme; + GList *targets; +}; + +enum { + PROP_0, + PROP_SERVICE, + PROP_PROTOCOL, + PROP_DOMAIN, + PROP_SCHEME +}; + +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); +static GSocketAddressEnumerator *g_network_service_connectable_proxy_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); + g_free (srv->priv->scheme); + + 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)); + g_object_class_install_property (gobject_class, PROP_DOMAIN, + g_param_spec_string ("scheme", + P_("Scheme"), + P_("Network scheme (default is to use service)"), + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + +} + +static void +g_network_service_connectable_iface_init (GSocketConnectableIface *connectable_iface) +{ + connectable_iface->enumerate = g_network_service_connectable_enumerate; + connectable_iface->proxy_enumerate = g_network_service_connectable_proxy_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; + + case PROP_SCHEME: + g_network_service_set_scheme (srv, g_value_get_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; + + case PROP_SCHEME: + g_value_set_string (value, g_network_service_get_scheme (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: (transfer full) (type GNetworkService): 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; +} + +/** + * g_network_service_get_scheme: + * @srv: a #GNetworkService + * + * Get's the URI scheme used to resolve proxies. By default, the service name + * is used as scheme. + * + * Return value: @srv's scheme name + * + * Since: 2.26 + */ +const gchar * +g_network_service_get_scheme (GNetworkService *srv) +{ + g_return_val_if_fail (G_IS_NETWORK_SERVICE (srv), NULL); + + if (srv->priv->scheme) + return srv->priv->scheme; + else + return srv->priv->service; +} + +/** + * g_network_service_set_scheme: + * @srv: a #GNetworkService + * @scheme: a URI scheme + * + * Set's the URI scheme used to resolve proxies. By default, the service name + * is used as scheme. + * + * Since: 2.26 + */ +void +g_network_service_set_scheme (GNetworkService *srv, + const gchar *scheme) +{ + g_return_if_fail (G_IS_NETWORK_SERVICE (srv)); + + if (srv->priv->scheme) + g_free (srv->priv->scheme); + srv->priv->scheme = g_strdup (scheme); + + g_object_notify (G_OBJECT (srv), "scheme"); +} + +static GList * +g_network_service_fallback_targets (GNetworkService *srv) +{ + GSrvTarget *target; + struct servent *entry; + guint16 port; + + entry = getservbyname (srv->priv->service, "tcp"); + port = entry ? g_ntohs (entry->s_port) : 0; +#ifdef HAVE_ENDSERVENT + endservent (); +#endif + + if (entry == NULL) + return NULL; + + target = g_srv_target_new (srv->priv->domain, port, 0, 0); + return g_list_append (NULL, target); +} + +#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; + GSocketAddressEnumerator *addr_enum; + GList *t; + gboolean use_proxy; + + GError *error; + +} GNetworkServiceAddressEnumerator; + +typedef struct { + GSocketAddressEnumeratorClass parent_class; + +} GNetworkServiceAddressEnumeratorClass; + +static GType _g_network_service_address_enumerator_get_type (void); +G_DEFINE_TYPE (GNetworkServiceAddressEnumerator, _g_network_service_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR) + +static GSocketAddress * +g_network_service_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GNetworkServiceAddressEnumerator *srv_enum = + G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (enumerator); + GSocketAddress *ret = NULL; + + /* If we haven't yet resolved srv, do that */ + if (!srv_enum->srv->priv->targets) + { + GList *targets; + GError *my_error = NULL; + + targets = g_resolver_lookup_service (srv_enum->resolver, + srv_enum->srv->priv->service, + srv_enum->srv->priv->protocol, + srv_enum->srv->priv->domain, + cancellable, &my_error); + if (!targets && g_error_matches (my_error, G_RESOLVER_ERROR, + G_RESOLVER_ERROR_NOT_FOUND)) + { + targets = g_network_service_fallback_targets (srv_enum->srv); + if (targets) + g_clear_error (&my_error); + } + + if (my_error) + { + g_propagate_error (error, my_error); + return NULL; + } + + srv_enum->srv->priv->targets = targets; + srv_enum->t = srv_enum->srv->priv->targets; + } + + /* Delegate to GNetworkAddress */ + do + { + if (srv_enum->addr_enum == NULL && srv_enum->t) + { + GError *error = NULL; + gchar *uri; + gchar *hostname; + GSocketConnectable *addr; + GSrvTarget *target = srv_enum->t->data; + + srv_enum->t = g_list_next (srv_enum->t); + + hostname = g_hostname_to_ascii (g_srv_target_get_hostname (target)); + + if (hostname == NULL) + { + if (srv_enum->error == NULL) + srv_enum->error = + g_error_new (G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Received invalid hostname '%s' from GSrvTarget", + g_srv_target_get_hostname (target)); + continue; + } + + uri = _g_uri_from_authority (g_network_service_get_scheme (srv_enum->srv), + hostname, + g_srv_target_get_port (target), + NULL); + g_free (hostname); + + addr = g_network_address_parse_uri (uri, + g_srv_target_get_port (target), + &error); + g_free (uri); + + if (addr == NULL) + { + if (srv_enum->error == NULL) + srv_enum->error = error; + continue; + } + + if (srv_enum->use_proxy) + srv_enum->addr_enum = g_socket_connectable_proxy_enumerate (addr); + else + srv_enum->addr_enum = g_socket_connectable_enumerate (addr); + g_object_unref (addr); + } + + if (srv_enum->addr_enum) + { + GError *error = NULL; + + ret = g_socket_address_enumerator_next (srv_enum->addr_enum, + cancellable, + &error); + + if (error) + { + if (srv_enum->error == NULL) + srv_enum->error = error; + else + g_error_free (error); + } + + if (!ret) + { + g_object_unref (srv_enum->addr_enum); + srv_enum->addr_enum = NULL; + } + } + } + while (srv_enum->addr_enum == NULL && srv_enum->t); + + if (ret == NULL && srv_enum->error) + { + g_propagate_error (error, srv_enum->error); + srv_enum->error = NULL; + } + + return ret; +} + +static void next_async_resolved_targets (GObject *source_object, + GAsyncResult *result, + gpointer user_data); +static void next_async_have_targets (GTask *srv_enum); +static void next_async_have_address (GObject *source_object, + GAsyncResult *result, + gpointer user_data); + +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); + GTask *task; + + task = g_task_new (enumerator, cancellable, callback, user_data); + + /* 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, + task); + } + else + next_async_have_targets (task); +} + +static void +next_async_resolved_targets (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GNetworkServiceAddressEnumerator *srv_enum = g_task_get_source_object (task); + GError *error = NULL; + GList *targets; + + targets = g_resolver_lookup_service_finish (srv_enum->resolver, + result, &error); + + if (!targets && g_error_matches (error, G_RESOLVER_ERROR, + G_RESOLVER_ERROR_NOT_FOUND)) + { + targets = g_network_service_fallback_targets (srv_enum->srv); + if (targets) + g_clear_error (&error); + } + + if (error) + { + g_task_return_error (task, error); + g_object_unref (task); + } + else + { + srv_enum->t = srv_enum->srv->priv->targets = targets; + next_async_have_targets (task); + } +} + +static void +next_async_have_targets (GTask *task) +{ + GNetworkServiceAddressEnumerator *srv_enum = g_task_get_source_object (task); + + /* Delegate to GNetworkAddress */ + if (srv_enum->addr_enum == NULL && srv_enum->t) + { + GSocketConnectable *addr; + GSrvTarget *target = srv_enum->t->data; + + srv_enum->t = g_list_next (srv_enum->t); + addr = g_network_address_new (g_srv_target_get_hostname (target), + (guint16) g_srv_target_get_port (target)); + + if (srv_enum->use_proxy) + srv_enum->addr_enum = g_socket_connectable_proxy_enumerate (addr); + else + srv_enum->addr_enum = g_socket_connectable_enumerate (addr); + + g_object_unref (addr); + } + + if (srv_enum->addr_enum) + { + g_socket_address_enumerator_next_async (srv_enum->addr_enum, + g_task_get_cancellable (task), + next_async_have_address, + task); + } + else + { + if (srv_enum->error) + { + g_task_return_error (task, srv_enum->error); + srv_enum->error = NULL; + } + else + g_task_return_pointer (task, NULL, NULL); + + g_object_unref (task); + } +} + +static void +next_async_have_address (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GNetworkServiceAddressEnumerator *srv_enum = g_task_get_source_object (task); + GSocketAddress *address; + GError *error = NULL; + + address = g_socket_address_enumerator_next_finish (srv_enum->addr_enum, + result, + &error); + + if (error) + { + if (srv_enum->error == NULL) + srv_enum->error = error; + else + g_error_free (error); + } + + if (!address) + { + g_object_unref (srv_enum->addr_enum); + srv_enum->addr_enum = NULL; + + next_async_have_targets (task); + } + else + { + g_task_return_pointer (task, address, g_object_unref); + g_object_unref (task); + } +} + +static GSocketAddress * +g_network_service_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +_g_network_service_address_enumerator_init (GNetworkServiceAddressEnumerator *enumerator) +{ +} + +static void +g_network_service_address_enumerator_finalize (GObject *object) +{ + GNetworkServiceAddressEnumerator *srv_enum = + G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (object); + + if (srv_enum->srv) + g_object_unref (srv_enum->srv); + + if (srv_enum->addr_enum) + g_object_unref (srv_enum->addr_enum); + + if (srv_enum->resolver) + 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 void +_g_network_service_address_enumerator_class_init (GNetworkServiceAddressEnumeratorClass *srvenum_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (srvenum_class); + GSocketAddressEnumeratorClass *enumerator_class = + G_SOCKET_ADDRESS_ENUMERATOR_CLASS (srvenum_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 (); + srv_enum->use_proxy = FALSE; + + return G_SOCKET_ADDRESS_ENUMERATOR (srv_enum); +} + +static GSocketAddressEnumerator * +g_network_service_connectable_proxy_enumerate (GSocketConnectable *connectable) +{ + GSocketAddressEnumerator *addr_enum; + GNetworkServiceAddressEnumerator *srv_enum; + + addr_enum = g_network_service_connectable_enumerate (connectable); + srv_enum = G_NETWORK_SERVICE_ADDRESS_ENUMERATOR (addr_enum); + srv_enum->use_proxy = TRUE; + + return addr_enum; +} diff --git a/gio/gnetworkservice.h b/gio/gnetworkservice.h new file mode 100644 index 0000000..082166d --- /dev/null +++ b/gio/gnetworkservice.h @@ -0,0 +1,78 @@ +/* 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_NETWORK_SERVICE_H__ +#define __G_NETWORK_SERVICE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_network_service_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketConnectable *g_network_service_new (const gchar *service, + const gchar *protocol, + const gchar *domain); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_service_get_service (GNetworkService *srv); +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_service_get_protocol (GNetworkService *srv); +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_service_get_domain (GNetworkService *srv); +GLIB_AVAILABLE_IN_ALL +const gchar *g_network_service_get_scheme (GNetworkService *srv); +GLIB_AVAILABLE_IN_ALL +void g_network_service_set_scheme (GNetworkService *srv, const gchar *scheme); + +G_END_DECLS + +#endif /* __G_NETWORK_SERVICE_H__ */ + diff --git a/gio/gnextstepsettingsbackend.c b/gio/gnextstepsettingsbackend.c new file mode 100644 index 0000000..86af0e0 --- /dev/null +++ b/gio/gnextstepsettingsbackend.c @@ -0,0 +1,482 @@ +/* + * Copyright © 2011 William Hua + * + * This library is free software; you can redistribute it and/or + * 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: William Hua + */ + +#include "config.h" + +#include "gsettingsbackendinternal.h" +#include "gsimplepermission.h" +#include "giomodule.h" + +#import + +GType g_nextstep_settings_backend_get_type (void); + +#define G_NEXTSTEP_SETTINGS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), g_nextstep_settings_backend_get_type (), GNextstepSettingsBackend)) + +typedef struct _GNextstepSettingsBackend GNextstepSettingsBackend; +typedef GSettingsBackendClass GNextstepSettingsBackendClass; + +struct _GNextstepSettingsBackend +{ + GSettingsBackend parent_instance; + + /*< private >*/ + NSUserDefaults *user_defaults; + GMutex mutex; +}; + +G_DEFINE_TYPE_WITH_CODE (GNextstepSettingsBackend, + g_nextstep_settings_backend, + G_TYPE_SETTINGS_BACKEND, + g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, "nextstep", 90)); + +static void g_nextstep_settings_backend_finalize (GObject *backend); + +static GVariant * g_nextstep_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value); + +static gboolean g_nextstep_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *key); + +static gboolean g_nextstep_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag); + +static gboolean g_nextstep_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag); + +static void g_nextstep_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag); + +static void g_nextstep_settings_backend_subscribe (GSettingsBackend *backend, + const gchar *name); + +static void g_nextstep_settings_backend_unsubscribe (GSettingsBackend *backend, + const gchar *name); + +static void g_nextstep_settings_backend_sync (GSettingsBackend *backend); + +static GPermission * g_nextstep_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path); + +static gboolean g_nextstep_settings_backend_write_pair (gpointer name, + gpointer value, + gpointer data); + +static GVariant * g_nextstep_settings_backend_get_g_variant (id object, + const GVariantType *type); + +static id g_nextstep_settings_backend_get_ns_object (GVariant *variant); + +static void +g_nextstep_settings_backend_class_init (GNextstepSettingsBackendClass *class) +{ + G_OBJECT_CLASS (class)->finalize = g_nextstep_settings_backend_finalize; + class->read = g_nextstep_settings_backend_read; + class->get_writable = g_nextstep_settings_backend_get_writable; + class->write = g_nextstep_settings_backend_write; + class->write_tree = g_nextstep_settings_backend_write_tree; + class->reset = g_nextstep_settings_backend_reset; + class->subscribe = g_nextstep_settings_backend_subscribe; + class->unsubscribe = g_nextstep_settings_backend_unsubscribe; + class->sync = g_nextstep_settings_backend_sync; + class->get_permission = g_nextstep_settings_backend_get_permission; +} + +static void +g_nextstep_settings_backend_init (GNextstepSettingsBackend *self) +{ + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + self->user_defaults = [[NSUserDefaults standardUserDefaults] retain]; + + g_mutex_init (&self->mutex); + + [pool drain]; +} + +static void +g_nextstep_settings_backend_finalize (GObject *self) +{ + GNextstepSettingsBackend *backend = G_NEXTSTEP_SETTINGS_BACKEND (self); + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + g_mutex_clear (&backend->mutex); + + [backend->user_defaults release]; + + [pool drain]; + + G_OBJECT_CLASS (g_nextstep_settings_backend_parent_class)->finalize (self); +} + +static GVariant * +g_nextstep_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend); + NSAutoreleasePool *pool; + NSString *name; + id value; + GVariant *variant; + + if (default_value) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + name = [NSString stringWithUTF8String:key]; + + g_mutex_lock (&self->mutex); + value = [self->user_defaults objectForKey:name]; + g_mutex_unlock (&self->mutex); + + variant = g_nextstep_settings_backend_get_g_variant (value, expected_type); + + [pool drain]; + + return variant; +} + +static gboolean +g_nextstep_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *key) +{ + return TRUE; +} + +static gboolean +g_nextstep_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend); + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + g_mutex_lock (&self->mutex); + g_nextstep_settings_backend_write_pair ((gpointer) key, value, self); + g_mutex_unlock (&self->mutex); + + g_settings_backend_changed (backend, key, origin_tag); + + [pool drain]; + + return TRUE; +} + +static gboolean +g_nextstep_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend); + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + g_mutex_lock (&self->mutex); + g_tree_foreach (tree, g_nextstep_settings_backend_write_pair, self); + g_mutex_unlock (&self->mutex); + g_settings_backend_changed_tree (backend, tree, origin_tag); + + [pool drain]; + + return TRUE; +} + +static void +g_nextstep_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend); + NSAutoreleasePool *pool; + NSString *name; + + pool = [[NSAutoreleasePool alloc] init]; + name = [NSString stringWithUTF8String:key]; + + g_mutex_lock (&self->mutex); + [self->user_defaults removeObjectForKey:name]; + g_mutex_unlock (&self->mutex); + + g_settings_backend_changed (backend, key, origin_tag); + + [pool drain]; +} + +static void +g_nextstep_settings_backend_subscribe (GSettingsBackend *backend, + const gchar *name) +{ +} + +static void +g_nextstep_settings_backend_unsubscribe (GSettingsBackend *backend, + const gchar *name) +{ +} + +static void +g_nextstep_settings_backend_sync (GSettingsBackend *backend) +{ + GNextstepSettingsBackend *self = G_NEXTSTEP_SETTINGS_BACKEND (backend); + NSAutoreleasePool *pool; + + pool = [[NSAutoreleasePool alloc] init]; + + g_mutex_lock (&self->mutex); + [self->user_defaults synchronize]; + g_mutex_unlock (&self->mutex); + + [pool drain]; +} + +static GPermission * +g_nextstep_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + return g_simple_permission_new (TRUE); +} + +static gboolean +g_nextstep_settings_backend_write_pair (gpointer name, + gpointer value, + gpointer data) +{ + GNextstepSettingsBackend *backend = G_NEXTSTEP_SETTINGS_BACKEND (data); + NSString *key; + id object; + + key = [NSString stringWithUTF8String:name]; + object = g_nextstep_settings_backend_get_ns_object (value); + + [backend->user_defaults setObject:object forKey:key]; + + return FALSE; +} + +static GVariant * +g_nextstep_settings_backend_get_g_variant (id object, + const GVariantType *type) +{ + if ([object isKindOfClass:[NSData class]]) + return g_variant_parse (type, [[[[NSString alloc] initWithData:object encoding:NSUTF8StringEncoding] autorelease] UTF8String], NULL, NULL, NULL); + else if ([object isKindOfClass:[NSNumber class]]) + { + if (g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) + return g_variant_new_boolean ([object boolValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_BYTE)) + return g_variant_new_byte ([object unsignedCharValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16)) + return g_variant_new_int16 ([object shortValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16)) + return g_variant_new_uint16 ([object unsignedShortValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32)) + return g_variant_new_int32 ([object longValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32)) + return g_variant_new_uint32 ([object unsignedLongValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64)) + return g_variant_new_int64 ([object longLongValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64)) + return g_variant_new_uint64 ([object unsignedLongLongValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE)) + return g_variant_new_handle ([object longValue]); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + return g_variant_new_double ([object doubleValue]); + } + else if ([object isKindOfClass:[NSString class]]) + { + const char *string; + + string = [object UTF8String]; + + if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) + return g_variant_new_string (string); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH)) + return g_variant_is_object_path (string) ? + g_variant_new_object_path (string) : NULL; + else if (g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) + return g_variant_is_signature (string) ? + g_variant_new_signature (string) : NULL; + } + else if ([object isKindOfClass:[NSDictionary class]]) + { + if (g_variant_type_is_subtype_of (type, G_VARIANT_TYPE ("a{s*}"))) + { + const GVariantType *value_type; + GVariantBuilder builder; + NSString *key; + + value_type = g_variant_type_value (g_variant_type_element (type)); + + g_variant_builder_init (&builder, type); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 + for(key in object) +#else + NSEnumerator *enumerator = [object objectEnumerator]; + while((key = [enumerator nextObject])) +#endif + { + GVariant *name; + id value; + GVariant *variant; + GVariant *entry; + + name = g_variant_new_string ([key UTF8String]); + value = [object objectForKey:key]; + variant = g_nextstep_settings_backend_get_g_variant (value, value_type); + + if (variant == NULL) + { + g_variant_builder_clear (&builder); + + return NULL; + } + + entry = g_variant_new_dict_entry (name, variant); + g_variant_builder_add_value (&builder, entry); + } + + return g_variant_builder_end (&builder); + } + } + else if ([object isKindOfClass:[NSArray class]]) + { + if (g_variant_type_is_subtype_of (type, G_VARIANT_TYPE_ARRAY)) + { + const GVariantType *value_type; + GVariantBuilder builder; + id value; + + value_type = g_variant_type_element (type); + g_variant_builder_init (&builder, type); + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 + for(value in object) +#else + NSEnumerator *enumerator = [object objectEnumerator]; + while((value = [enumerator nextObject])) +#endif + { + GVariant *variant = g_nextstep_settings_backend_get_g_variant (value, value_type); + + if (variant == NULL) + { + g_variant_builder_clear (&builder); + + return NULL; + } + + g_variant_builder_add_value (&builder, variant); + } + + return g_variant_builder_end (&builder); + } + } + + return NULL; +} + +static id +g_nextstep_settings_backend_get_ns_object (GVariant *variant) +{ + if (variant == NULL) + return nil; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) + return [NSNumber numberWithBool:g_variant_get_boolean (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTE)) + return [NSNumber numberWithUnsignedChar:g_variant_get_byte (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16)) + return [NSNumber numberWithShort:g_variant_get_int16 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16)) + return [NSNumber numberWithUnsignedShort:g_variant_get_uint16 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32)) + return [NSNumber numberWithLong:g_variant_get_int32 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)) + return [NSNumber numberWithUnsignedLong:g_variant_get_uint32 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64)) + return [NSNumber numberWithLongLong:g_variant_get_int64 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64)) + return [NSNumber numberWithUnsignedLongLong:g_variant_get_uint64 (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_HANDLE)) + return [NSNumber numberWithLong:g_variant_get_handle (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE)) + return [NSNumber numberWithDouble:g_variant_get_double (variant)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)) + return [NSString stringWithUTF8String:g_variant_get_string (variant, NULL)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH)) + return [NSString stringWithUTF8String:g_variant_get_string (variant, NULL)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE)) + return [NSString stringWithUTF8String:g_variant_get_string (variant, NULL)]; + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("a{s*}"))) + { + NSMutableDictionary *dictionary; + GVariantIter iter; + GVariant *name; + GVariant *value; + + dictionary = [NSMutableDictionary dictionaryWithCapacity:g_variant_iter_init (&iter, variant)]; + + while (g_variant_iter_loop (&iter, "{s*}", &name, &value)) + { + NSString *key; + id object; + + key = [NSString stringWithUTF8String:g_variant_get_string (name, NULL)]; + object = g_nextstep_settings_backend_get_ns_object (value); + + [dictionary setObject:object forKey:key]; + } + + return dictionary; + } + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_ARRAY)) + { + NSMutableArray *array; + GVariantIter iter; + GVariant *value; + + array = [NSMutableArray arrayWithCapacity:g_variant_iter_init (&iter, variant)]; + + while ((value = g_variant_iter_next_value (&iter)) != NULL) + [array addObject:g_nextstep_settings_backend_get_ns_object (value)]; + + return array; + } + else + return [[NSString stringWithUTF8String:g_variant_print (variant, TRUE)] dataUsingEncoding:NSUTF8StringEncoding]; +} diff --git a/gio/gnullsettingsbackend.c b/gio/gnullsettingsbackend.c new file mode 100644 index 0000000..523f074 --- /dev/null +++ b/gio/gnullsettingsbackend.c @@ -0,0 +1,139 @@ +/* + * 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 "config.h" + +#include "gsettingsbackendinternal.h" +#include "giomodule.h" +#include "gsimplepermission.h" + + +#define G_TYPE_NULL_SETTINGS_BACKEND (g_null_settings_backend_get_type ()) +#define G_NULL_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_NULL_SETTINGS_BACKEND, \ + GNullSettingsBackend)) + + +typedef GSettingsBackendClass GNullSettingsBackendClass; +typedef GSettingsBackend GNullSettingsBackend; + +G_DEFINE_TYPE_WITH_CODE (GNullSettingsBackend, + g_null_settings_backend, + G_TYPE_SETTINGS_BACKEND, + g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, "null", 10)) + +static GVariant * +g_null_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + return NULL; +} + +static gboolean +g_null_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + if (value) + g_variant_unref (g_variant_ref_sink (value)); + return FALSE; +} + +static gboolean +g_null_settings_backend_write_one (gpointer key, + gpointer value, + gpointer data) +{ + if (value) + g_variant_unref (g_variant_ref_sink (value)); + return FALSE; +} + +static gboolean +g_null_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + g_tree_foreach (tree, g_null_settings_backend_write_one, backend); + return FALSE; +} + +static void +g_null_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ +} + +static gboolean +g_null_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *name) +{ + return FALSE; +} + +static GPermission * +g_null_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + return g_simple_permission_new (FALSE); +} + +static void +g_null_settings_backend_init (GNullSettingsBackend *memory) +{ +} + +static void +g_null_settings_backend_class_init (GNullSettingsBackendClass *class) +{ + GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class); + + backend_class->read = g_null_settings_backend_read; + backend_class->write = g_null_settings_backend_write; + backend_class->write_tree = g_null_settings_backend_write_tree; + backend_class->reset = g_null_settings_backend_reset; + backend_class->get_writable = g_null_settings_backend_get_writable; + backend_class->get_permission = g_null_settings_backend_get_permission; +} + +/** + * g_null_settings_backend_new: + * + * + * Creates a readonly #GSettingsBackend. + * + * This backend does not allow changes to settings, so all settings + * will always have their default values. + * + * Returns: (transfer full): a newly created #GSettingsBackend + * + * Since: 2.28 + */ +GSettingsBackend * +g_null_settings_backend_new (void) +{ + return g_object_new (G_TYPE_NULL_SETTINGS_BACKEND, NULL); +} diff --git a/gio/goutputstream.c b/gio/goutputstream.c new file mode 100644 index 0000000..a3ac7ad --- /dev/null +++ b/gio/goutputstream.c @@ -0,0 +1,1680 @@ +/* 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 "gtask.h" +#include "ginputstream.h" +#include "gioerror.h" +#include "glibintl.h" +#include "gpollableoutputstream.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_ABSTRACT_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 gboolean _g_output_stream_close_internal (GOutputStream *stream, + GCancellable *cancellable, + 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: (array length=count) (element-type guint8): the buffer containing the data to write. + * @count: the number of bytes to write + * @cancellable: (allow-none): optional cancellable object + * @error: location to store the error occurring, or %NULL to ignore + * + * Tries to write @count bytes from @buffer into the stream. Will block + * during the operation. + * + * If count is 0, returns 0 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 block until at least one byte + * is written or an error occurs; 0 is never returned (unless + * @count is 0). + * + * 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. + * + * Virtual: write_fn + * + * 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: (array length=count) (element-type guint8): the buffer containing the data to write. + * @count: the number of bytes to write + * @bytes_written: (out): location to store the number of bytes that was + * written to the stream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, 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_write_bytes: + * @stream: a #GOutputStream. + * @bytes: the #GBytes to write + * @cancellable: (allow-none): optional cancellable object + * @error: location to store the error occurring, or %NULL to ignore + * + * Tries to write the data from @bytes into the stream. Will block + * during the operation. + * + * If @bytes is 0-length, returns 0 and does nothing. A #GBytes 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 block until at least one byte + * is written or an error occurs; 0 is never returned (unless + * the size of @bytes is 0). + * + * 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_bytes (GOutputStream *stream, + GBytes *bytes, + GCancellable *cancellable, + GError **error) +{ + gsize size; + gconstpointer data; + + data = g_bytes_get_data (bytes, &size); + + return g_output_stream_write (stream, + data, size, + cancellable, + error); +} + +/** + * g_output_stream_flush: + * @stream: a #GOutputStream. + * @cancellable: (allow-none): optional cancellable object + * @error: location to store the error occurring, or %NULL to ignore + * + * Forces a write of all user-space buffered data for the given + * @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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, 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. Note that if the number of bytes + * spliced is greater than %G_MAXSSIZE, then that will be + * returned, and there is no way to determine the actual number + * of bytes spliced. + **/ +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; + gsize 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; + } + + if (bytes_copied > G_MAXSSIZE) + bytes_copied = G_MAXSSIZE; + } + 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! */ + res = _g_output_stream_close_internal (stream, cancellable, error); + } + + if (res) + return bytes_copied; + + return -1; +} + +/* Must always be called inside + * g_output_stream_set_pending()/g_output_stream_clear_pending(). */ +static gboolean +_g_output_stream_close_internal (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GOutputStreamClass *class; + gboolean res; + + if (stream->priv->closed) + return TRUE; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + 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; + + return res; +} + +/** + * g_output_stream_close: + * @stream: A #GOutputStream. + * @cancellable: (allow-none): optional cancellable object + * @error: location to store the error occurring, 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) +{ + gboolean res; + + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + + if (stream->priv->closed) + return TRUE; + + if (!g_output_stream_set_pending (stream, error)) + return FALSE; + + res = _g_output_stream_close_internal (stream, cancellable, error); + + g_output_stream_clear_pending (stream); + + return res; +} + +static void +async_ready_write_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + GOutputStreamClass *class; + GTask *task = user_data; + gssize nwrote; + GError *error = NULL; + + g_output_stream_clear_pending (stream); + + if (g_async_result_legacy_propagate_error (res, &error)) + nwrote = -1; + else + { + class = G_OUTPUT_STREAM_GET_CLASS (stream); + nwrote = class->write_finish (stream, res, &error); + } + + if (nwrote >= 0) + g_task_return_int (task, nwrote); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_output_stream_write_async: + * @stream: A #GOutputStream. + * @buffer: (array length=count) (element-type guint8): the buffer containing the data to write. + * @count: the number of bytes to write + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): 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. + * + * You are guaranteed that this method will never fail with + * %G_IO_ERROR_WOULD_BLOCK - if @stream can't accept more data, the + * method will just wait until this changes. + * + * 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; + GError *error = NULL; + GTask *task; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + g_return_if_fail (buffer != NULL); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_output_stream_write_async); + g_task_set_priority (task, io_priority); + + if (count == 0) + { + g_task_return_int (task, 0); + g_object_unref (task); + return; + } + + if (((gssize) count) < 0) + { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Too large count value passed to %s"), + G_STRFUNC); + g_object_unref (task); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + class->write_async (stream, buffer, count, io_priority, cancellable, + async_ready_write_callback_wrapper, task); +} + +/** + * g_output_stream_write_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, 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) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, g_output_stream_write_async), FALSE); + + /* @result is always the GTask created by g_output_stream_write_async(); + * we called class->write_finish() from async_ready_write_callback_wrapper. + */ + return g_task_propagate_int (G_TASK (result), error); +} + +static void +write_bytes_callback (GObject *stream, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GError *error = NULL; + gssize nwrote; + + nwrote = g_output_stream_write_finish (G_OUTPUT_STREAM (stream), + result, &error); + if (nwrote == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, nwrote); + g_object_unref (task); +} + +/** + * g_output_stream_write_bytes_async: + * @stream: A #GOutputStream. + * @bytes: The bytes to write + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Request an asynchronous write of the data in @bytes to the stream. + * When the operation is finished @callback will be called. You can + * then call g_output_stream_write_bytes_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 #GBytes 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. + * + * You are guaranteed that this method will never fail with + * %G_IO_ERROR_WOULD_BLOCK - if @stream can't accept more data, the + * method will just wait until this changes. + * + * 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. + * + * For the synchronous, blocking version of this function, see + * g_output_stream_write_bytes(). + **/ +void +g_output_stream_write_bytes_async (GOutputStream *stream, + GBytes *bytes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + gsize size; + gconstpointer data; + + data = g_bytes_get_data (bytes, &size); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, g_bytes_ref (bytes), + (GDestroyNotify) g_bytes_unref); + + g_output_stream_write_async (stream, + data, size, + io_priority, + cancellable, + write_bytes_callback, + task); +} + +/** + * g_output_stream_write_bytes_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes a stream write-from-#GBytes operation. + * + * Returns: a #gssize containing the number of bytes written to the stream. + **/ +gssize +g_output_stream_write_bytes_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (g_task_is_valid (result, stream), -1); + + return g_task_propagate_int (G_TASK (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); + GOutputStreamClass *class; + GTask *task = _data; + gssize nspliced; + GError *error = NULL; + + g_output_stream_clear_pending (stream); + + if (g_async_result_legacy_propagate_error (res, &error)) + nspliced = -1; + else + { + class = G_OUTPUT_STREAM_GET_CLASS (stream); + nspliced = class->splice_finish (stream, res, &error); + } + + if (nspliced >= 0) + g_task_return_int (task, nspliced); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): 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; + GTask *task; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + g_return_if_fail (G_IS_INPUT_STREAM (source)); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_output_stream_splice_async); + g_task_set_priority (task, io_priority); + g_task_set_task_data (task, g_object_ref (source), g_object_unref); + + if (g_input_stream_is_closed (source)) + { + g_task_return_new_error (task, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Source stream is already closed")); + g_object_unref (task); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + class->splice_async (stream, source, flags, io_priority, cancellable, + async_ready_splice_callback_wrapper, task); +} + +/** + * g_output_stream_splice_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an asynchronous stream splice operation. + * + * Returns: a #gssize of the number of bytes spliced. Note that if the + * number of bytes spliced is greater than %G_MAXSSIZE, then that + * will be returned, and there is no way to determine the actual + * number of bytes spliced. + **/ +gssize +g_output_stream_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, g_output_stream_splice_async), FALSE); + + /* @result is always the GTask created by g_output_stream_splice_async(); + * we called class->splice_finish() from async_ready_splice_callback_wrapper. + */ + return g_task_propagate_int (G_TASK (result), error); +} + +static void +async_ready_flush_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + GOutputStreamClass *class; + GTask *task = user_data; + gboolean flushed; + GError *error = NULL; + + g_output_stream_clear_pending (stream); + + if (g_async_result_legacy_propagate_error (res, &error)) + flushed = FALSE; + else + { + class = G_OUTPUT_STREAM_GET_CLASS (stream); + flushed = class->flush_finish (stream, res, &error); + } + + if (flushed) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_output_stream_flush_async: + * @stream: a #GOutputStream. + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Forces an asynchronous write of all user-space buffered data for + * the given @stream. + * 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; + GTask *task; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_output_stream_flush_async); + g_task_set_priority (task, io_priority); + + if (!g_output_stream_set_pending (stream, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (class->flush_async == NULL) + { + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + class->flush_async (stream, io_priority, cancellable, + async_ready_flush_callback_wrapper, task); +} + +/** + * g_output_stream_flush_finish: + * @stream: a #GOutputStream. + * @result: a GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes flushing an output stream. + * + * Returns: %TRUE if flush operation succeeded, %FALSE otherwise. + **/ +gboolean +g_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, g_output_stream_flush_async), FALSE); + + /* @result is always the GTask created by g_output_stream_flush_async(); + * we called class->flush_finish() from async_ready_flush_callback_wrapper. + */ + return g_task_propagate_boolean (G_TASK (result), error); +} + + +static void +async_ready_close_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + GOutputStreamClass *class; + GTask *task = user_data; + GError *error = g_task_get_task_data (task); + + stream->priv->closing = FALSE; + stream->priv->closed = TRUE; + + if (!error && !g_async_result_legacy_propagate_error (res, &error)) + { + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + class->close_finish (stream, res, + error ? NULL : &error); + } + + g_output_stream_clear_pending (stream); + + if (error != NULL) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +async_ready_close_flushed_callback_wrapper (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GOutputStream *stream = G_OUTPUT_STREAM (source_object); + GOutputStreamClass *class; + GTask *task = user_data; + GError *error = NULL; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + if (!g_async_result_legacy_propagate_error (res, &error)) + { + class->flush_finish (stream, res, &error); + } + + /* propagate the possible error */ + if (error) + g_task_set_task_data (task, error, NULL); + + /* we still close, even if there was a flush error */ + class->close_async (stream, + g_task_get_priority (task), + g_task_get_cancellable (task), + async_ready_close_callback_wrapper, task); +} + +/** + * g_output_stream_close_async: + * @stream: A #GOutputStream. + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): optional cancellable object + * @callback: (scope async): callback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * 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; + GTask *task; + GError *error = NULL; + + g_return_if_fail (G_IS_OUTPUT_STREAM (stream)); + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_source_tag (task, g_output_stream_close_async); + g_task_set_priority (task, io_priority); + + if (stream->priv->closed) + { + g_task_return_boolean (task, TRUE); + g_object_unref (task); + return; + } + + if (!g_output_stream_set_pending (stream, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + stream->priv->closing = TRUE; + + /* Call close_async directly if there is no need to flush, or if the flush + can be done sync (in the output stream async close thread) */ + if (class->flush_async == NULL || + (class->flush_async == g_output_stream_real_flush_async && + (class->flush == NULL || class->close_async == g_output_stream_real_close_async))) + { + class->close_async (stream, io_priority, cancellable, + async_ready_close_callback_wrapper, task); + } + else + { + /* First do an async flush, then do the async close in the callback + wrapper (see async_ready_close_flushed_callback_wrapper) */ + class->flush_async (stream, io_priority, cancellable, + async_ready_close_flushed_callback_wrapper, task); + } +} + +/** + * g_output_stream_close_finish: + * @stream: a #GOutputStream. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, 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) +{ + g_return_val_if_fail (G_IS_OUTPUT_STREAM (stream), FALSE); + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + g_return_val_if_fail (g_async_result_is_tagged (result, g_output_stream_close_async), FALSE); + + /* @result is always the GTask created by g_output_stream_close_async(); + * we called class->close_finish() from async_ready_close_callback_wrapper. + */ + return g_task_propagate_boolean (G_TASK (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 occurring, 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 +free_write_data (WriteData *op) +{ + g_slice_free (WriteData, op); +} + +static void +write_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GOutputStream *stream = source_object; + WriteData *op = task_data; + GOutputStreamClass *class; + GError *error = NULL; + gssize count_written; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + count_written = class->write_fn (stream, op->buffer, op->count_requested, + cancellable, &error); + if (count_written == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, count_written); +} + +static void write_async_pollable (GPollableOutputStream *stream, + GTask *task); + +static gboolean +write_async_pollable_ready (GPollableOutputStream *stream, + gpointer user_data) +{ + GTask *task = user_data; + + write_async_pollable (stream, task); + return FALSE; +} + +static void +write_async_pollable (GPollableOutputStream *stream, + GTask *task) +{ + GError *error = NULL; + WriteData *op = g_task_get_task_data (task); + gssize count_written; + + if (g_task_return_error_if_cancelled (task)) + return; + + count_written = G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)-> + write_nonblocking (stream, op->buffer, op->count_requested, &error); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + { + GSource *source; + + g_error_free (error); + + source = g_pollable_output_stream_create_source (stream, + g_task_get_cancellable (task)); + g_task_attach_source (task, source, + (GSourceFunc) write_async_pollable_ready); + g_source_unref (source); + return; + } + + if (count_written == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, count_written); +} + +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) +{ + GTask *task; + WriteData *op; + + op = g_slice_new0 (WriteData); + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_check_cancellable (task, FALSE); + g_task_set_task_data (task, op, (GDestroyNotify) free_write_data); + op->buffer = buffer; + op->count_requested = count; + + if (G_IS_POLLABLE_OUTPUT_STREAM (stream) && + g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (stream))) + write_async_pollable (G_POLLABLE_OUTPUT_STREAM (stream), task); + else + g_task_run_in_thread (task, write_async_thread); + g_object_unref (task); +} + +static gssize +g_output_stream_real_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_int (G_TASK (result), error); +} + +typedef struct { + GInputStream *source; + GOutputStreamSpliceFlags flags; +} SpliceData; + +static void +free_splice_data (SpliceData *op) +{ + g_object_unref (op->source); + g_free (op); +} + +static void +splice_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GOutputStream *stream = source_object; + SpliceData *op = task_data; + GOutputStreamClass *class; + GError *error = NULL; + gssize bytes_copied; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + bytes_copied = class->splice (stream, + op->source, + op->flags, + cancellable, + &error); + if (bytes_copied == -1) + g_task_return_error (task, error); + else + g_task_return_int (task, bytes_copied); +} + +static void +g_output_stream_real_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + SpliceData *op; + + op = g_new0 (SpliceData, 1); + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_task_data (task, op, (GDestroyNotify)free_splice_data); + op->flags = flags; + op->source = g_object_ref (source); + + /* TODO: In the case where both source and destintion have + non-threadbased async calls we can use a true async copy here */ + + g_task_run_in_thread (task, splice_async_thread); + g_object_unref (task); +} + +static gssize +g_output_stream_real_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_int (G_TASK (result), error); +} + + +static void +flush_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GOutputStream *stream = source_object; + GOutputStreamClass *class; + gboolean result; + GError *error = NULL; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + result = TRUE; + if (class->flush) + result = class->flush (stream, cancellable, &error); + + if (result) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); +} + +static void +g_output_stream_real_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, flush_async_thread); + g_object_unref (task); +} + +static gboolean +g_output_stream_real_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static void +close_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GOutputStream *stream = source_object; + GOutputStreamClass *class; + GError *error = NULL; + gboolean result = TRUE; + + class = G_OUTPUT_STREAM_GET_CLASS (stream); + + /* Do a flush here if there is a flush function, and we did not have to do + * an async flush before (see g_output_stream_close_async) + */ + if (class->flush != NULL && + (class->flush_async == NULL || + class->flush_async == g_output_stream_real_flush_async)) + { + result = class->flush (stream, cancellable, &error); + } + + /* 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 */ + + if (class->close_fn) + { + /* Make sure to close, even if the flush failed (see sync close) */ + if (!result) + class->close_fn (stream, cancellable, NULL); + else + result = class->close_fn (stream, cancellable, &error); + } + + if (result) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); +} + +static void +g_output_stream_real_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + g_task_run_in_thread (task, close_async_thread); + g_object_unref (task); +} + +static gboolean +g_output_stream_real_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} diff --git a/gio/goutputstream.h b/gio/goutputstream.h new file mode 100644 index 0000000..dd2cbad --- /dev/null +++ b/gio/goutputstream.h @@ -0,0 +1,242 @@ +/* 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_OUTPUT_STREAM_H__ +#define __G_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 user_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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_output_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gssize g_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_write_all (GOutputStream *stream, + const void *buffer, + gsize count, + gsize *bytes_written, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_34 +gssize g_output_stream_write_bytes (GOutputStream *stream, + GBytes *bytes, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_output_stream_splice (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_flush (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_output_stream_write_async (GOutputStream *stream, + const void *buffer, + gsize count, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gssize g_output_stream_write_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_2_34 +void g_output_stream_write_bytes_async (GOutputStream *stream, + GBytes *bytes, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +gssize g_output_stream_write_bytes_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_output_stream_splice_async (GOutputStream *stream, + GInputStream *source, + GOutputStreamSpliceFlags flags, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gssize g_output_stream_splice_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_output_stream_flush_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_flush_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_is_closed (GOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_is_closing (GOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_has_pending (GOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +gboolean g_output_stream_set_pending (GOutputStream *stream, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_output_stream_clear_pending (GOutputStream *stream); + + +G_END_DECLS + +#endif /* __G_OUTPUT_STREAM_H__ */ diff --git a/gio/gpermission.c b/gio/gpermission.c new file mode 100644 index 0000000..4a57189 --- /dev/null +++ b/gio/gpermission.c @@ -0,0 +1,469 @@ +/* + * 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 "config.h" + +#include "gpermission.h" + +#include "gioerror.h" +#include "gioenums.h" +#include "gasyncresult.h" +#include "gsimpleasyncresult.h" +#include "glibintl.h" + + +/** + * SECTION:gpermission + * @title: GPermission + * @short_description: An object representing the permission to perform + * a certain action + * + * A #GPermission represents the status of the caller's permission to + * perform a certain action. + * + * You can query if the action is currently allowed and if it is + * possible to acquire the permission so that the action will be allowed + * in the future. + * + * There is also an API to actually acquire the permission and one to + * release it. + * + * As an example, a #GPermission might represent the ability for the + * user to write to a #GSettings object. This #GPermission object could + * then be used to decide if it is appropriate to show a "Click here to + * unlock" button in a dialog and to provide the mechanism to invoke + * when that button is clicked. + **/ + +/** + * GPermission: + * + * #GPermission is an opaque data structure and can only be accessed + * using the following functions. + **/ + +G_DEFINE_ABSTRACT_TYPE (GPermission, g_permission, G_TYPE_OBJECT) + +struct _GPermissionPrivate +{ + gboolean allowed; + gboolean can_acquire; + gboolean can_release; +}; + +enum { + PROP_NONE, + PROP_ALLOWED, + PROP_CAN_ACQUIRE, + PROP_CAN_RELEASE +}; + +/** + * g_permission_acquire: + * @permission: a #GPermission instance + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: a pointer to a %NULL #GError, or %NULL + * + * Attempts to acquire the permission represented by @permission. + * + * The precise method by which this happens depends on the permission + * and the underlying authentication mechanism. A simple example is + * that a dialog may appear asking the user to enter their password. + * + * You should check with g_permission_get_can_acquire() before calling + * this function. + * + * If the permission is acquired then %TRUE is returned. Otherwise, + * %FALSE is returned and @error is set appropriately. + * + * This call is blocking, likely for a very long time (in the case that + * user interaction is required). See g_permission_acquire_async() for + * the non-blocking version. + * + * Returns: %TRUE if the permission was successfully acquired + * + * Since: 2.26 + */ +gboolean +g_permission_acquire (GPermission *permission, + GCancellable *cancellable, + GError **error) +{ + return G_PERMISSION_GET_CLASS (permission) + ->acquire (permission, cancellable, error); +} + +/** + * g_permission_acquire_async: + * @permission: a #GPermission instance + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: the #GAsyncReadyCallback to call when done + * @user_data: the user data to pass to @callback + * + * Attempts to acquire the permission represented by @permission. + * + * This is the first half of the asynchronous version of + * g_permission_acquire(). + * + * Since: 2.26 + **/ +void +g_permission_acquire_async (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + G_PERMISSION_GET_CLASS (permission) + ->acquire_async (permission, cancellable, callback, user_data); +} + +/** + * g_permission_acquire_finish: + * @permission: a #GPermission instance + * @result: the #GAsyncResult given to the #GAsyncReadyCallback + * @error: a pointer to a %NULL #GError, or %NULL + * + * Collects the result of attempting to acquire the permission + * represented by @permission. + * + * This is the second half of the asynchronous version of + * g_permission_acquire(). + * + * Returns: %TRUE if the permission was successfully acquired + * + * Since: 2.26 + **/ +gboolean +g_permission_acquire_finish (GPermission *permission, + GAsyncResult *result, + GError **error) +{ + return G_PERMISSION_GET_CLASS (permission) + ->acquire_finish (permission, result, error); +} + +/** + * g_permission_release: + * @permission: a #GPermission instance + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: a pointer to a %NULL #GError, or %NULL + * + * Attempts to release the permission represented by @permission. + * + * The precise method by which this happens depends on the permission + * and the underlying authentication mechanism. In most cases the + * permission will be dropped immediately without further action. + * + * You should check with g_permission_get_can_release() before calling + * this function. + * + * If the permission is released then %TRUE is returned. Otherwise, + * %FALSE is returned and @error is set appropriately. + * + * This call is blocking, likely for a very long time (in the case that + * user interaction is required). See g_permission_release_async() for + * the non-blocking version. + * + * Returns: %TRUE if the permission was successfully released + * + * Since: 2.26 + **/ +gboolean +g_permission_release (GPermission *permission, + GCancellable *cancellable, + GError **error) +{ + return G_PERMISSION_GET_CLASS (permission) + ->release (permission, cancellable, error); +} + +/** + * g_permission_release_async: + * @permission: a #GPermission instance + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: the #GAsyncReadyCallback to call when done + * @user_data: the user data to pass to @callback + * + * Attempts to release the permission represented by @permission. + * + * This is the first half of the asynchronous version of + * g_permission_release(). + * + * Since: 2.26 + **/ +void +g_permission_release_async (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + G_PERMISSION_GET_CLASS (permission) + ->release_async (permission, cancellable, callback, user_data); +} + +/** + * g_permission_release_finish: + * @permission: a #GPermission instance + * @result: the #GAsyncResult given to the #GAsyncReadyCallback + * @error: a pointer to a %NULL #GError, or %NULL + * + * Collects the result of attempting to release the permission + * represented by @permission. + * + * This is the second half of the asynchronous version of + * g_permission_release(). + * + * Returns: %TRUE if the permission was successfully released + * + * Since: 2.26 + **/ +gboolean +g_permission_release_finish (GPermission *permission, + GAsyncResult *result, + GError **error) +{ + return G_PERMISSION_GET_CLASS (permission) + ->release_finish (permission, result, error); +} + +/** + * g_permission_get_allowed: + * @permission: a #GPermission instance + * + * Gets the value of the 'allowed' property. This property is %TRUE if + * the caller currently has permission to perform the action that + * @permission represents the permission to perform. + * + * Returns: the value of the 'allowed' property + * + * Since: 2.26 + **/ +gboolean +g_permission_get_allowed (GPermission *permission) +{ + return permission->priv->allowed; +} + +/** + * g_permission_get_can_acquire: + * @permission: a #GPermission instance + * + * Gets the value of the 'can-acquire' property. This property is %TRUE + * if it is generally possible to acquire the permission by calling + * g_permission_acquire(). + * + * Returns: the value of the 'can-acquire' property + * + * Since: 2.26 + **/ +gboolean +g_permission_get_can_acquire (GPermission *permission) +{ + return permission->priv->can_acquire; +} + +/** + * g_permission_get_can_release: + * @permission: a #GPermission instance + * + * Gets the value of the 'can-release' property. This property is %TRUE + * if it is generally possible to release the permission by calling + * g_permission_release(). + * + * Returns: the value of the 'can-release' property + * + * Since: 2.26 + **/ +gboolean +g_permission_get_can_release (GPermission *permission) +{ + return permission->priv->can_release; +} + +/** + * g_permission_impl_update: + * @permission: a #GPermission instance + * @allowed: the new value for the 'allowed' property + * @can_acquire: the new value for the 'can-acquire' property + * @can_release: the new value for the 'can-release' property + * + * This function is called by the #GPermission implementation to update + * the properties of the permission. You should never call this + * function except from a #GPermission implementation. + * + * GObject notify signals are generated, as appropriate. + * + * Since: 2.26 + **/ +void +g_permission_impl_update (GPermission *permission, + gboolean allowed, + gboolean can_acquire, + gboolean can_release) +{ + GObject *object = G_OBJECT (permission); + + g_object_freeze_notify (object); + + allowed = allowed != FALSE; + if (allowed != permission->priv->allowed) + { + permission->priv->allowed = allowed; + g_object_notify (object, "allowed"); + } + + can_acquire = can_acquire != FALSE; + if (can_acquire != permission->priv->can_acquire) + { + permission->priv->can_acquire = can_acquire; + g_object_notify (object, "can-acquire"); + } + + can_release = can_release != FALSE; + if (can_release != permission->priv->can_release) + { + permission->priv->can_release = can_release; + g_object_notify (object, "can-release"); + } + + g_object_thaw_notify (object); +} + +static void +g_permission_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GPermission *permission = G_PERMISSION (object); + + switch (prop_id) + { + case PROP_ALLOWED: + g_value_set_boolean (value, permission->priv->allowed); + break; + + case PROP_CAN_ACQUIRE: + g_value_set_boolean (value, permission->priv->can_acquire); + break; + + case PROP_CAN_RELEASE: + g_value_set_boolean (value, permission->priv->can_release); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_permission_init (GPermission *permission) +{ + permission->priv = G_TYPE_INSTANCE_GET_PRIVATE (permission, + G_TYPE_PERMISSION, + GPermissionPrivate); +} + +static gboolean +acquire_or_release (GPermission *permission, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Can't acquire or release permission"); + return FALSE; +} + +static void +acquire_or_release_async (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_simple_async_report_error_in_idle (G_OBJECT (permission), + callback, user_data, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Can't acquire or release permission"); +} + +static gboolean +acquire_or_release_finish (GPermission *permission, + GAsyncResult *result, + GError **error) +{ + g_async_result_legacy_propagate_error (result, error); + return FALSE; +} + +static void +g_permission_class_init (GPermissionClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->get_property = g_permission_get_property; + + class->acquire = acquire_or_release; + class->release = acquire_or_release; + class->acquire_async = acquire_or_release_async; + class->release_async = acquire_or_release_async; + class->acquire_finish = acquire_or_release_finish; + class->release_finish = acquire_or_release_finish; + + /** + * GPermission:allowed: + * + * %TRUE if the caller currently has permission to perform the action that + * @permission represents the permission to perform. + */ + g_object_class_install_property (object_class, PROP_ALLOWED, + g_param_spec_boolean ("allowed", + P_("Is allowed"), + P_("If the caller is allowed to perform the action"), + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + + /** + * GPermission:can-acquire: + * + * %TRUE if it is generally possible to acquire the permission by calling + * g_permission_acquire(). + */ + g_object_class_install_property (object_class, PROP_CAN_ACQUIRE, + g_param_spec_boolean ("can-acquire", + P_("Can acquire"), + P_("If calling g_permission_acquire() makes sense"), + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + + /** + * GPermission:can-release: + * + * %TRUE if it is generally possible to release the permission by calling + * g_permission_release(). + */ + g_object_class_install_property (object_class, PROP_CAN_RELEASE, + g_param_spec_boolean ("can-release", + P_("Can release"), + P_("If calling g_permission_release() makes sense"), + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); + + g_type_class_add_private (class, sizeof (GPermissionPrivate)); +} diff --git a/gio/gpermission.h b/gio/gpermission.h new file mode 100644 index 0000000..49c2991 --- /dev/null +++ b/gio/gpermission.h @@ -0,0 +1,129 @@ +/* + * 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_PERMISSION_H__ +#define __G_PERMISSION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_PERMISSION (g_permission_get_type ()) +#define G_PERMISSION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_PERMISSION, GPermission)) +#define G_PERMISSION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_PERMISSION, GPermissionClass)) +#define G_IS_PERMISSION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_PERMISSION)) +#define G_IS_PERMISSION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_PERMISSION)) +#define G_PERMISSION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_PERMISSION, GPermissionClass)) + +typedef struct _GPermissionPrivate GPermissionPrivate; +typedef struct _GPermissionClass GPermissionClass; + +struct _GPermission +{ + GObject parent_instance; + + /*< private >*/ + GPermissionPrivate *priv; +}; + +struct _GPermissionClass { + GObjectClass parent_class; + + gboolean (*acquire) (GPermission *permission, + GCancellable *cancellable, + GError **error); + void (*acquire_async) (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*acquire_finish) (GPermission *permission, + GAsyncResult *result, + GError **error); + + gboolean (*release) (GPermission *permission, + GCancellable *cancellable, + GError **error); + void (*release_async) (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (*release_finish) (GPermission *permission, + GAsyncResult *result, + GError **error); + + gpointer reserved[16]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_permission_get_type (void); +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_acquire (GPermission *permission, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_permission_acquire_async (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_acquire_finish (GPermission *permission, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_release (GPermission *permission, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_permission_release_async (GPermission *permission, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_release_finish (GPermission *permission, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_get_allowed (GPermission *permission); +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_get_can_acquire (GPermission *permission); +GLIB_AVAILABLE_IN_ALL +gboolean g_permission_get_can_release (GPermission *permission); + +GLIB_AVAILABLE_IN_ALL +void g_permission_impl_update (GPermission *permission, + gboolean allowed, + gboolean can_acquire, + gboolean can_release); + +G_END_DECLS + +#endif /* __G_PERMISSION_H__ */ diff --git a/gio/gpollableinputstream.c b/gio/gpollableinputstream.c new file mode 100644 index 0000000..c59f9df --- /dev/null +++ b/gio/gpollableinputstream.c @@ -0,0 +1,221 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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 "gpollableinputstream.h" +#include "gasynchelper.h" +#include "glibintl.h" + +/** + * SECTION:gpollableinputstream + * @short_description: Interface for pollable input streams + * @include: gio/gio.h + * @see_also: #GInputStream, #GPollableOutputStream, #GFileDescriptorBased + * + * #GPollableInputStream is implemented by #GInputStreams that + * can be polled for readiness to read. This can be used when + * interfacing with a non-GIO API that expects + * UNIX-file-descriptor-style asynchronous I/O rather than GIO-style. + * + * Since: 2.28 + */ + +G_DEFINE_INTERFACE (GPollableInputStream, g_pollable_input_stream, G_TYPE_INPUT_STREAM) + +static gboolean g_pollable_input_stream_default_can_poll (GPollableInputStream *stream); +static gssize g_pollable_input_stream_default_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize count, + GError **error); + +static void +g_pollable_input_stream_default_init (GPollableInputStreamInterface *iface) +{ + iface->can_poll = g_pollable_input_stream_default_can_poll; + iface->read_nonblocking = g_pollable_input_stream_default_read_nonblocking; +} + +static gboolean +g_pollable_input_stream_default_can_poll (GPollableInputStream *stream) +{ + return TRUE; +} + +/** + * g_pollable_input_stream_can_poll: + * @stream: a #GPollableInputStream. + * + * Checks if @stream is actually pollable. Some classes may implement + * #GPollableInputStream but have only certain instances of that class + * be pollable. If this method returns %FALSE, then the behavior of + * other #GPollableInputStream methods is undefined. + * + * For any given stream, the value returned by this method is constant; + * a stream cannot switch from pollable to non-pollable or vice versa. + * + * Returns: %TRUE if @stream is pollable, %FALSE if not. + * + * Since: 2.28 + */ +gboolean +g_pollable_input_stream_can_poll (GPollableInputStream *stream) +{ + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), FALSE); + + return G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)->can_poll (stream); +} + +/** + * g_pollable_input_stream_is_readable: + * @stream: a #GPollableInputStream. + * + * Checks if @stream can be read. + * + * Note that some stream types may not be able to implement this 100% + * reliably, and it is possible that a call to g_input_stream_read() + * after this returns %TRUE would still block. To guarantee + * non-blocking behavior, you should always use + * g_pollable_input_stream_read_nonblocking(), which will return a + * %G_IO_ERROR_WOULD_BLOCK error rather than blocking. + * + * Returns: %TRUE if @stream is readable, %FALSE if not. If an error + * has occurred on @stream, this will result in + * g_pollable_input_stream_is_readable() returning %TRUE, and the + * next attempt to read will return the error. + * + * Since: 2.28 + */ +gboolean +g_pollable_input_stream_is_readable (GPollableInputStream *stream) +{ + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), FALSE); + + return G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)->is_readable (stream); +} + +/** + * g_pollable_input_stream_create_source: + * @stream: a #GPollableInputStream. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * + * Creates a #GSource that triggers when @stream can be read, or + * @cancellable is triggered or an error occurs. The callback on the + * source is of the #GPollableSourceFunc type. + * + * As with g_pollable_input_stream_is_readable(), it is possible that + * the stream may not actually be readable even after the source + * triggers, so you should use g_pollable_input_stream_read_nonblocking() + * rather than g_input_stream_read() from the callback. + * + * Returns: (transfer full): a new #GSource + * + * Since: 2.28 + */ +GSource * +g_pollable_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable) +{ + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), NULL); + + return G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)-> + create_source (stream, cancellable); +} + +static gssize +g_pollable_input_stream_default_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize count, + GError **error) +{ + if (!g_pollable_input_stream_is_readable (stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, + g_strerror (EAGAIN)); + return -1; + } + + return G_INPUT_STREAM_GET_CLASS (stream)-> + read_fn (G_INPUT_STREAM (stream), buffer, count, NULL, error); +} + +/** + * g_pollable_input_stream_read_nonblocking: + * @stream: a #GPollableInputStream + * @buffer: a buffer to read data into (which should be at least @count + * bytes long). + * @count: the number of bytes you want to read + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Attempts to read up to @count bytes from @stream into @buffer, as + * with g_input_stream_read(). If @stream is not currently readable, + * this will immediately return %G_IO_ERROR_WOULD_BLOCK, and you can + * use g_pollable_input_stream_create_source() to create a #GSource + * that will be triggered when @stream is readable. + * + * Note that since this method never blocks, you cannot actually + * use @cancellable to cancel it. However, it will return an error + * if @cancellable has already been cancelled when you call, which + * may happen if you call this method after a source triggers due + * to having been cancelled. + * + * Virtual: read_nonblocking + * Return value: the number of bytes read, or -1 on error (including + * %G_IO_ERROR_WOULD_BLOCK). + */ +gssize +g_pollable_input_stream_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + gssize res; + + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, 0); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -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; + } + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = G_POLLABLE_INPUT_STREAM_GET_INTERFACE (stream)-> + read_nonblocking (stream, buffer, count, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + return res; +} diff --git a/gio/gpollableinputstream.h b/gio/gpollableinputstream.h new file mode 100644 index 0000000..a0b1574 --- /dev/null +++ b/gio/gpollableinputstream.h @@ -0,0 +1,107 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_POLLABLE_INPUT_STREAM_H__ +#define __G_POLLABLE_INPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_POLLABLE_INPUT_STREAM (g_pollable_input_stream_get_type ()) +#define G_POLLABLE_INPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_POLLABLE_INPUT_STREAM, GPollableInputStream)) +#define G_IS_POLLABLE_INPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_POLLABLE_INPUT_STREAM)) +#define G_POLLABLE_INPUT_STREAM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_POLLABLE_INPUT_STREAM, GPollableInputStreamInterface)) + +/** + * GPollableInputStream: + * + * An interface for a #GInputStream that can be polled for readability. + * + * Since: 2.28 + */ +typedef struct _GPollableInputStreamInterface GPollableInputStreamInterface; + +/** + * GPollableInputStreamInterface: + * @g_iface: The parent interface. + * @can_poll: Checks if the #GPollableInputStream instance is actually pollable + * @is_readable: Checks if the stream is readable + * @create_source: Creates a #GSource to poll the stream + * @read_nonblocking: Does a non-blocking read or returns + * %G_IO_ERROR_WOULD_BLOCK + * + * The interface for pollable input streams. + * + * The default implementation of @can_poll always returns %TRUE. + * + * The default implementation of @read_nonblocking calls + * g_pollable_input_stream_is_readable(), and then calls + * g_input_stream_read() if it returns %TRUE. This means you only need + * to override it if it is possible that your @is_readable + * implementation may return %TRUE when the stream is not actually + * readable. + * + * Since: 2.28 + */ +struct _GPollableInputStreamInterface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + gboolean (*can_poll) (GPollableInputStream *stream); + + gboolean (*is_readable) (GPollableInputStream *stream); + GSource * (*create_source) (GPollableInputStream *stream, + GCancellable *cancellable); + gssize (*read_nonblocking) (GPollableInputStream *stream, + void *buffer, + gsize count, + GError **error); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_pollable_input_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_pollable_input_stream_can_poll (GPollableInputStream *stream); + +GLIB_AVAILABLE_IN_ALL +gboolean g_pollable_input_stream_is_readable (GPollableInputStream *stream); +GLIB_AVAILABLE_IN_ALL +GSource *g_pollable_input_stream_create_source (GPollableInputStream *stream, + GCancellable *cancellable); + +GLIB_AVAILABLE_IN_ALL +gssize g_pollable_input_stream_read_nonblocking (GPollableInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + + +#endif /* __G_POLLABLE_INPUT_STREAM_H__ */ + diff --git a/gio/gpollableoutputstream.c b/gio/gpollableoutputstream.c new file mode 100644 index 0000000..b019e81 --- /dev/null +++ b/gio/gpollableoutputstream.c @@ -0,0 +1,222 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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 "gpollableoutputstream.h" +#include "gasynchelper.h" +#include "gfiledescriptorbased.h" +#include "glibintl.h" + +/** + * SECTION:gpollableoutputstream + * @short_description: Interface for pollable output streams + * @include: gio/gio.h + * @see_also: #GOutputStream, #GFileDescriptorBased, #GPollableInputStream + * + * #GPollableOutputStream is implemented by #GOutputStreams that + * can be polled for readiness to write. This can be used when + * interfacing with a non-GIO API that expects + * UNIX-file-descriptor-style asynchronous I/O rather than GIO-style. + * + * Since: 2.28 + */ + +G_DEFINE_INTERFACE (GPollableOutputStream, g_pollable_output_stream, G_TYPE_OUTPUT_STREAM) + +static gboolean g_pollable_output_stream_default_can_poll (GPollableOutputStream *stream); +static gssize g_pollable_output_stream_default_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GError **error); + +static void +g_pollable_output_stream_default_init (GPollableOutputStreamInterface *iface) +{ + iface->can_poll = g_pollable_output_stream_default_can_poll; + iface->write_nonblocking = g_pollable_output_stream_default_write_nonblocking; +} + +static gboolean +g_pollable_output_stream_default_can_poll (GPollableOutputStream *stream) +{ + return TRUE; +} + +/** + * g_pollable_output_stream_can_poll: + * @stream: a #GPollableOutputStream. + * + * Checks if @stream is actually pollable. Some classes may implement + * #GPollableOutputStream but have only certain instances of that + * class be pollable. If this method returns %FALSE, then the behavior + * of other #GPollableOutputStream methods is undefined. + * + * For any given stream, the value returned by this method is constant; + * a stream cannot switch from pollable to non-pollable or vice versa. + * + * Returns: %TRUE if @stream is pollable, %FALSE if not. + * + * Since: 2.28 + */ +gboolean +g_pollable_output_stream_can_poll (GPollableOutputStream *stream) +{ + g_return_val_if_fail (G_IS_POLLABLE_OUTPUT_STREAM (stream), FALSE); + + return G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)->can_poll (stream); +} + +/** + * g_pollable_output_stream_is_writable: + * @stream: a #GPollableOutputStream. + * + * Checks if @stream can be written. + * + * Note that some stream types may not be able to implement this 100% + * reliably, and it is possible that a call to g_output_stream_write() + * after this returns %TRUE would still block. To guarantee + * non-blocking behavior, you should always use + * g_pollable_output_stream_write_nonblocking(), which will return a + * %G_IO_ERROR_WOULD_BLOCK error rather than blocking. + * + * Returns: %TRUE if @stream is writable, %FALSE if not. If an error + * has occurred on @stream, this will result in + * g_pollable_output_stream_is_writable() returning %TRUE, and the + * next attempt to write will return the error. + * + * Since: 2.28 + */ +gboolean +g_pollable_output_stream_is_writable (GPollableOutputStream *stream) +{ + g_return_val_if_fail (G_IS_POLLABLE_OUTPUT_STREAM (stream), FALSE); + + return G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)->is_writable (stream); +} + +/** + * g_pollable_output_stream_create_source: + * @stream: a #GPollableOutputStream. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * + * Creates a #GSource that triggers when @stream can be written, or + * @cancellable is triggered or an error occurs. The callback on the + * source is of the #GPollableSourceFunc type. + * + * As with g_pollable_output_stream_is_writable(), it is possible that + * the stream may not actually be writable even after the source + * triggers, so you should use g_pollable_output_stream_write_nonblocking() + * rather than g_output_stream_write() from the callback. + * + * Returns: (transfer full): a new #GSource + * + * Since: 2.28 + */ +GSource * +g_pollable_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable) +{ + g_return_val_if_fail (G_IS_POLLABLE_OUTPUT_STREAM (stream), NULL); + + return G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)-> + create_source (stream, cancellable); +} + +static gssize +g_pollable_output_stream_default_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GError **error) +{ + if (!g_pollable_output_stream_is_writable (stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, + g_strerror (EAGAIN)); + return -1; + } + + return G_OUTPUT_STREAM_GET_CLASS (stream)-> + write_fn (G_OUTPUT_STREAM (stream), buffer, count, NULL, error); +} + +/** + * g_pollable_output_stream_write_nonblocking: + * @stream: a #GPollableOutputStream + * @buffer: (array length=count) (element-type guint8): a buffer to write + * data from + * @count: the number of bytes you want to write + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Attempts to write up to @count bytes from @buffer to @stream, as + * with g_output_stream_write(). If @stream is not currently writable, + * this will immediately return %G_IO_ERROR_WOULD_BLOCK, and you can + * use g_pollable_output_stream_create_source() to create a #GSource + * that will be triggered when @stream is writable. + * + * Note that since this method never blocks, you cannot actually + * use @cancellable to cancel it. However, it will return an error + * if @cancellable has already been cancelled when you call, which + * may happen if you call this method after a source triggers due + * to having been cancelled. + * + * Virtual: write_nonblocking + * Return value: the number of bytes written, or -1 on error (including + * %G_IO_ERROR_WOULD_BLOCK). + */ +gssize +g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + gssize res; + + g_return_val_if_fail (G_IS_POLLABLE_OUTPUT_STREAM (stream), -1); + g_return_val_if_fail (buffer != NULL, 0); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -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; + } + + if (cancellable) + g_cancellable_push_current (cancellable); + + res = G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE (stream)-> + write_nonblocking (stream, buffer, count, error); + + if (cancellable) + g_cancellable_pop_current (cancellable); + + return res; +} diff --git a/gio/gpollableoutputstream.h b/gio/gpollableoutputstream.h new file mode 100644 index 0000000..b6b3e54 --- /dev/null +++ b/gio/gpollableoutputstream.h @@ -0,0 +1,107 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_POLLABLE_OUTPUT_STREAM_H__ +#define __G_POLLABLE_OUTPUT_STREAM_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_POLLABLE_OUTPUT_STREAM (g_pollable_output_stream_get_type ()) +#define G_POLLABLE_OUTPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_POLLABLE_OUTPUT_STREAM, GPollableOutputStream)) +#define G_IS_POLLABLE_OUTPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_POLLABLE_OUTPUT_STREAM)) +#define G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_POLLABLE_OUTPUT_STREAM, GPollableOutputStreamInterface)) + +/** + * GPollableOutputStream: + * + * An interface for a #GOutputStream that can be polled for readability. + * + * Since: 2.28 + */ +typedef struct _GPollableOutputStreamInterface GPollableOutputStreamInterface; + +/** + * GPollableOutputStreamInterface: + * @g_iface: The parent interface. + * @can_poll: Checks if the #GPollableOutputStream instance is actually pollable + * @is_writable: Checks if the stream is writable + * @create_source: Creates a #GSource to poll the stream + * @write_nonblocking: Does a non-blocking write or returns + * %G_IO_ERROR_WOULD_BLOCK + * + * The interface for pollable output streams. + * + * The default implementation of @can_poll always returns %TRUE. + * + * The default implementation of @write_nonblocking calls + * g_pollable_output_stream_is_writable(), and then calls + * g_output_stream_write() if it returns %TRUE. This means you only + * need to override it if it is possible that your @is_writable + * implementation may return %TRUE when the stream is not actually + * writable. + * + * Since: 2.28 + */ +struct _GPollableOutputStreamInterface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + gboolean (*can_poll) (GPollableOutputStream *stream); + + gboolean (*is_writable) (GPollableOutputStream *stream); + GSource * (*create_source) (GPollableOutputStream *stream, + GCancellable *cancellable); + gssize (*write_nonblocking) (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GError **error); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_pollable_output_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_pollable_output_stream_can_poll (GPollableOutputStream *stream); + +GLIB_AVAILABLE_IN_ALL +gboolean g_pollable_output_stream_is_writable (GPollableOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +GSource *g_pollable_output_stream_create_source (GPollableOutputStream *stream, + GCancellable *cancellable); + +GLIB_AVAILABLE_IN_ALL +gssize g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + + +#endif /* __G_POLLABLE_OUTPUT_STREAM_H__ */ + diff --git a/gio/gpollableutils.c b/gio/gpollableutils.c new file mode 100644 index 0000000..0e653fa --- /dev/null +++ b/gio/gpollableutils.c @@ -0,0 +1,350 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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 "gpollableinputstream.h" +#include "gasynchelper.h" +#include "glibintl.h" + +/** + * SECTION:gpollableutils + * @short_description: #GPollableInputStream / #GPollableOutputStream utilities + * @include: gio/gio.h + * + * Utility functions for #GPollableInputStream and + * #GPollableOutputStream implementations. + */ + +typedef struct { + GSource source; + + GObject *stream; +} GPollableSource; + +static gboolean +pollable_source_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + return FALSE; +} + +static gboolean +pollable_source_check (GSource *source) +{ + return FALSE; +} + +static gboolean +pollable_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GPollableSourceFunc func = (GPollableSourceFunc)callback; + GPollableSource *pollable_source = (GPollableSource *)source; + + return (*func) (pollable_source->stream, user_data); +} + +static void +pollable_source_finalize (GSource *source) +{ + GPollableSource *pollable_source = (GPollableSource *)source; + + g_object_unref (pollable_source->stream); +} + +static gboolean +pollable_source_closure_callback (GObject *stream, + gpointer data) +{ + GClosure *closure = data; + + GValue param = G_VALUE_INIT; + GValue result_value = G_VALUE_INIT; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + + g_value_init (¶m, G_TYPE_OBJECT); + g_value_set_object (¶m, stream); + + g_closure_invoke (closure, &result_value, 1, ¶m, NULL); + + result = g_value_get_boolean (&result_value); + g_value_unset (&result_value); + g_value_unset (¶m); + + return result; +} + +static GSourceFuncs pollable_source_funcs = +{ + pollable_source_prepare, + pollable_source_check, + pollable_source_dispatch, + pollable_source_finalize, + (GSourceFunc)pollable_source_closure_callback, + (GSourceDummyMarshal)g_cclosure_marshal_generic, +}; + +/** + * g_pollable_source_new: + * @pollable_stream: the stream associated with the new source + * + * Utility method for #GPollableInputStream and #GPollableOutputStream + * implementations. Creates a new #GSource that expects a callback of + * type #GPollableSourceFunc. The new source does not actually do + * anything on its own; use g_source_add_child_source() to add other + * sources to it to cause it to trigger. + * + * Return value: (transfer full): the new #GSource. + * + * Since: 2.28 + */ +GSource * +g_pollable_source_new (GObject *pollable_stream) +{ + GSource *source; + GPollableSource *pollable_source; + + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (pollable_stream) || + G_IS_POLLABLE_OUTPUT_STREAM (pollable_stream), NULL); + + source = g_source_new (&pollable_source_funcs, sizeof (GPollableSource)); + g_source_set_name (source, "GPollableSource"); + pollable_source = (GPollableSource *)source; + pollable_source->stream = g_object_ref (pollable_stream); + + return source; +} + +/** + * g_pollable_source_new_full: + * @pollable_stream: (type GObject): the stream associated with the + * new source + * @child_source: (allow-none): optional child source to attach + * @cancellable: (allow-none): optional #GCancellable to attach + * + * Utility method for #GPollableInputStream and #GPollableOutputStream + * implementations. Creates a new #GSource, as with + * g_pollable_source_new(), but also attaching @child_source (with a + * dummy callback), and @cancellable, if they are non-%NULL. + * + * Return value: (transfer full): the new #GSource. + * + * Since: 2.34 + */ +GSource * +g_pollable_source_new_full (gpointer pollable_stream, + GSource *child_source, + GCancellable *cancellable) +{ + GSource *source; + + g_return_val_if_fail (G_IS_POLLABLE_INPUT_STREAM (pollable_stream) || + G_IS_POLLABLE_OUTPUT_STREAM (pollable_stream), NULL); + + source = g_pollable_source_new (pollable_stream); + if (child_source) + { + g_source_set_dummy_callback (child_source); + g_source_add_child_source (source, child_source); + } + if (cancellable) + { + GSource *cancellable_source = g_cancellable_source_new (cancellable); + + g_source_set_dummy_callback (cancellable_source); + g_source_add_child_source (source, cancellable_source); + g_source_unref (cancellable_source); + } + + return source; +} + +/** + * g_pollable_stream_read: + * @stream: a #GInputStream + * @buffer: a buffer to read data into + * @count: the number of bytes to read + * @blocking: whether to do blocking I/O + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, or %NULL to ignore + * + * Tries to read from @stream, as with g_input_stream_read() (if + * @blocking is %TRUE) or g_pollable_input_stream_read_nonblocking() + * (if @blocking is %FALSE). This can be used to more easily share + * code between blocking and non-blocking implementations of a method. + * + * If @blocking is %FALSE, then @stream must be a + * #GPollableInputStream for which g_pollable_input_stream_can_poll() + * returns %TRUE, or else the behavior is undefined. If @blocking is + * %TRUE, then @stream does not need to be a #GPollableInputStream. + * + * Returns: the number of bytes read, or -1 on error. + * + * Since: 2.34 + */ +gssize +g_pollable_stream_read (GInputStream *stream, + void *buffer, + gsize count, + gboolean blocking, + GCancellable *cancellable, + GError **error) +{ + if (blocking) + { + return g_input_stream_read (stream, + buffer, count, + cancellable, error); + } + else + { + return g_pollable_input_stream_read_nonblocking (G_POLLABLE_INPUT_STREAM (stream), + buffer, count, + cancellable, error); + } +} + +/** + * g_pollable_stream_write: + * @stream: a #GOutputStream. + * @buffer: (array length=count) (element-type guint8): the buffer + * containing the data to write. + * @count: the number of bytes to write + * @blocking: whether to do blocking I/O + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, or %NULL to ignore + * + * Tries to write to @stream, as with g_output_stream_write() (if + * @blocking is %TRUE) or g_pollable_output_stream_write_nonblocking() + * (if @blocking is %FALSE). This can be used to more easily share + * code between blocking and non-blocking implementations of a method. + * + * If @blocking is %FALSE, then @stream must be a + * #GPollableOutputStream for which + * g_pollable_output_stream_can_poll() returns %TRUE or else the + * behavior is undefined. If @blocking is %TRUE, then @stream does not + * need to be a #GPollableOutputStream. + * + * Returns: the number of bytes written, or -1 on error. + * + * Since: 2.34 + */ +gssize +g_pollable_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + gboolean blocking, + GCancellable *cancellable, + GError **error) +{ + if (blocking) + { + return g_output_stream_write (stream, + buffer, count, + cancellable, error); + } + else + { + return g_pollable_output_stream_write_nonblocking (G_POLLABLE_OUTPUT_STREAM (stream), + buffer, count, + cancellable, error); + } +} + +/** + * g_pollable_stream_write_all: + * @stream: a #GOutputStream. + * @buffer: (array length=count) (element-type guint8): the buffer + * containing the data to write. + * @count: the number of bytes to write + * @blocking: whether to do blocking I/O + * @bytes_written: (out): location to store the number of bytes that was + * written to the stream + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: location to store the error occurring, or %NULL to ignore + * + * Tries to write @count bytes to @stream, as with + * g_output_stream_write_all(), but using g_pollable_stream_write() + * rather than g_output_stream_write(). + * + * 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 (including + * %G_IO_ERROR_WOULD_BLOCK in the non-blocking case), %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. + * + * As with g_pollable_stream_write(), if @blocking is %FALSE, then + * @stream must be a #GPollableOutputStream for which + * g_pollable_output_stream_can_poll() returns %TRUE or else the + * behavior is undefined. If @blocking is %TRUE, then @stream does not + * need to be a #GPollableOutputStream. + * + * Return value: %TRUE on success, %FALSE if there was an error + * + * Since: 2.34 + */ +gboolean +g_pollable_stream_write_all (GOutputStream *stream, + const void *buffer, + gsize count, + gboolean blocking, + gsize *bytes_written, + GCancellable *cancellable, + GError **error) +{ + gsize _bytes_written; + gssize res; + + _bytes_written = 0; + while (_bytes_written < count) + { + res = g_pollable_stream_write (stream, + (char *)buffer + _bytes_written, + count - _bytes_written, + blocking, + 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; +} diff --git a/gio/gpollableutils.h b/gio/gpollableutils.h new file mode 100644 index 0000000..cb4612d --- /dev/null +++ b/gio/gpollableutils.h @@ -0,0 +1,66 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2012 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_POLLABLE_UTILS_H__ +#define __G_POLLABLE_UTILS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +GSource *g_pollable_source_new (GObject *pollable_stream); + +GLIB_AVAILABLE_IN_2_34 +GSource *g_pollable_source_new_full (gpointer pollable_stream, + GSource *child_source, + GCancellable *cancellable); + +GLIB_AVAILABLE_IN_2_34 +gssize g_pollable_stream_read (GInputStream *stream, + void *buffer, + gsize count, + gboolean blocking, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_2_34 +gssize g_pollable_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + gboolean blocking, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_34 +gboolean g_pollable_stream_write_all (GOutputStream *stream, + const void *buffer, + gsize count, + gboolean blocking, + gsize *bytes_written, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* _G_POLLABLE_UTILS_H_ */ diff --git a/gio/gpollfilemonitor.c b/gio/gpollfilemonitor.c new file mode 100644 index 0000000..a3b1306 --- /dev/null +++ b/gio/gpollfilemonitor.c @@ -0,0 +1,232 @@ +/* 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" + + +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 G_SOURCE_REMOVE; +} + +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/gproxy.c b/gio/gproxy.c new file mode 100644 index 0000000..475759f --- /dev/null +++ b/gio/gproxy.c @@ -0,0 +1,209 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include "gproxy.h" + +#include "giomodule.h" +#include "giomodule-priv.h" +#include "glibintl.h" + +/** + * SECTION:gproxy + * @short_description: Interface for proxy handling + * + * A #GProxy handles connecting to a remote host via a given type of + * proxy server. It is implemented by the 'gio-proxy' extension point. + * The extensions are named after their proxy protocol name. As an + * example, a SOCKS5 proxy implementation can be retrieved with the + * name 'socks5' using the function + * g_io_extension_point_get_extension_by_name(). + * + * Since: 2.26 + **/ + +G_DEFINE_INTERFACE (GProxy, g_proxy, G_TYPE_OBJECT) + +static void +g_proxy_default_init (GProxyInterface *iface) +{ +} + +/** + * g_proxy_get_default_for_protocol: + * @protocol: the proxy protocol name (e.g. http, socks, etc) + * + * Lookup "gio-proxy" extension point for a proxy implementation that supports + * specified protocol. + * + * Return value: (transfer full): return a #GProxy or NULL if protocol + * is not supported. + * + * Since: 2.26 + **/ +GProxy * +g_proxy_get_default_for_protocol (const gchar *protocol) +{ + GIOExtensionPoint *ep; + GIOExtension *extension; + + /* Ensure proxy modules loaded */ + _g_io_modules_ensure_loaded (); + + ep = g_io_extension_point_lookup (G_PROXY_EXTENSION_POINT_NAME); + + extension = g_io_extension_point_get_extension_by_name (ep, protocol); + + if (extension) + return g_object_new (g_io_extension_get_type (extension), NULL); + + return NULL; +} + +/** + * g_proxy_connect: + * @proxy: a #GProxy + * @connection: a #GIOStream + * @proxy_address: a #GProxyAddress + * @cancellable: (allow-none): a #GCancellable + * @error: return #GError + * + * Given @connection to communicate with a proxy (eg, a + * #GSocketConnection that is connected to the proxy server), this + * does the necessary handshake to connect to @proxy_address, and if + * required, wraps the #GIOStream to handle proxy payload. + * + * Return value: (transfer full): a #GIOStream that will replace @connection. This might + * be the same as @connection, in which case a reference + * will be added. + * + * Since: 2.26 + */ +GIOStream * +g_proxy_connect (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error) +{ + GProxyInterface *iface; + + g_return_val_if_fail (G_IS_PROXY (proxy), NULL); + + iface = G_PROXY_GET_IFACE (proxy); + + return (* iface->connect) (proxy, + connection, + proxy_address, + cancellable, + error); +} + +/** + * g_proxy_connect_async: + * @proxy: a #GProxy + * @connection: a #GIOStream + * @proxy_address: a #GProxyAddress + * @cancellable: (allow-none): a #GCancellable + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): callback data + * + * Asynchronous version of g_proxy_connect(). + * + * Since: 2.26 + */ +void +g_proxy_connect_async (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GProxyInterface *iface; + + g_return_if_fail (G_IS_PROXY (proxy)); + + iface = G_PROXY_GET_IFACE (proxy); + + (* iface->connect_async) (proxy, + connection, + proxy_address, + cancellable, + callback, + user_data); +} + +/** + * g_proxy_connect_finish: + * @proxy: a #GProxy + * @result: a #GAsyncResult + * @error: return #GError + * + * See g_proxy_connect(). + * + * Return value: (transfer full): a #GIOStream. + * + * Since: 2.26 + */ +GIOStream * +g_proxy_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error) +{ + GProxyInterface *iface; + + g_return_val_if_fail (G_IS_PROXY (proxy), NULL); + + iface = G_PROXY_GET_IFACE (proxy); + + return (* iface->connect_finish) (proxy, result, error); +} + +/** + * g_proxy_supports_hostname: + * @proxy: a #GProxy + * + * Some proxy protocols expect to be passed a hostname, which they + * will resolve to an IP address themselves. Others, like SOCKS4, do + * not allow this. This function will return %FALSE if @proxy is + * implementing such a protocol. When %FALSE is returned, the caller + * should resolve the destination hostname first, and then pass a + * #GProxyAddress containing the stringified IP address to + * g_proxy_connect() or g_proxy_connect_async(). + * + * Return value: %TRUE if hostname resolution is supported. + * + * Since: 2.26 + */ +gboolean +g_proxy_supports_hostname (GProxy *proxy) +{ + GProxyInterface *iface; + + g_return_val_if_fail (G_IS_PROXY (proxy), FALSE); + + iface = G_PROXY_GET_IFACE (proxy); + + return (* iface->supports_hostname) (proxy); +} diff --git a/gio/gproxy.h b/gio/gproxy.h new file mode 100644 index 0000000..b022335 --- /dev/null +++ b/gio/gproxy.h @@ -0,0 +1,130 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_PROXY_H__ +#define __G_PROXY_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_PROXY (g_proxy_get_type ()) +#define G_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_PROXY, GProxy)) +#define G_IS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_PROXY)) +#define G_PROXY_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_PROXY, GProxyInterface)) + +/** + * G_PROXY_EXTENSION_POINT_NAME: + * + * Extension point for proxy functionality. + * See Extending GIO. + * + * Since: 2.26 + */ +#define G_PROXY_EXTENSION_POINT_NAME "gio-proxy" + +/** + * GProxy: + * + * Interface that handles proxy connection and payload. + * + * Since: 2.26 + */ +typedef struct _GProxyInterface GProxyInterface; + +/** + * GProxyInterface: + * @g_iface: The parent interface. + * @connect: Connect to proxy server and wrap (if required) the #connection + * to handle payload. + * @connect_async: Same as connect() but asynchronous. + * @connect_finish: Returns the result of connect_async() + * @supports_hostname: Returns whether the proxy supports hostname lookups. + * + * Provides an interface for handling proxy connection and payload. + * + * Since: 2.26 + */ +struct _GProxyInterface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GIOStream * (* connect) (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error); + + void (* connect_async) (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GIOStream * (* connect_finish) (GProxy *proxy, + GAsyncResult *result, + GError **error); + + gboolean (* supports_hostname) (GProxy *proxy); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_proxy_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GProxy *g_proxy_get_default_for_protocol (const gchar *protocol); + +GLIB_AVAILABLE_IN_ALL +GIOStream *g_proxy_connect (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_proxy_connect_async (GProxy *proxy, + GIOStream *connection, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GIOStream *g_proxy_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_proxy_supports_hostname (GProxy *proxy); + +G_END_DECLS + +#endif /* __G_PROXY_H__ */ diff --git a/gio/gproxyaddress.c b/gio/gproxyaddress.c new file mode 100644 index 0000000..4b995dc --- /dev/null +++ b/gio/gproxyaddress.c @@ -0,0 +1,449 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include +#include +#include + +#include + +#include "gproxyaddress.h" +#include "glibintl.h" + +/** + * SECTION:gproxyaddress + * @short_description: An internet address with proxy information + * + * Support for proxied #GInetSocketAddress. + */ + +/** + * GProxyAddress: + * + * A #GInetSocketAddress representing a connection via a proxy server + * + * Since: 2.26 + **/ +G_DEFINE_TYPE (GProxyAddress, g_proxy_address, G_TYPE_INET_SOCKET_ADDRESS); + +enum +{ + PROP_0, + PROP_PROTOCOL, + PROP_DESTINATION_PROTOCOL, + PROP_DESTINATION_HOSTNAME, + PROP_DESTINATION_PORT, + PROP_USERNAME, + PROP_PASSWORD, + PROP_URI +}; + +struct _GProxyAddressPrivate +{ + gchar *uri; + gchar *protocol; + gchar *username; + gchar *password; + gchar *dest_protocol; + gchar *dest_hostname; + guint16 dest_port; +}; + +static void +g_proxy_address_finalize (GObject *object) +{ + GProxyAddress *proxy = G_PROXY_ADDRESS (object); + + g_free (proxy->priv->uri); + g_free (proxy->priv->protocol); + g_free (proxy->priv->username); + g_free (proxy->priv->password); + g_free (proxy->priv->dest_hostname); + g_free (proxy->priv->dest_protocol); + + G_OBJECT_CLASS (g_proxy_address_parent_class)->finalize (object); +} + +static void +g_proxy_address_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GProxyAddress *proxy = G_PROXY_ADDRESS (object); + + switch (prop_id) + { + case PROP_PROTOCOL: + g_free (proxy->priv->protocol); + proxy->priv->protocol = g_value_dup_string (value); + break; + + case PROP_DESTINATION_PROTOCOL: + g_free (proxy->priv->dest_protocol); + proxy->priv->dest_protocol = g_value_dup_string (value); + break; + + case PROP_DESTINATION_HOSTNAME: + g_free (proxy->priv->dest_hostname); + proxy->priv->dest_hostname = g_value_dup_string (value); + break; + + case PROP_DESTINATION_PORT: + proxy->priv->dest_port = g_value_get_uint (value); + break; + + case PROP_USERNAME: + g_free (proxy->priv->username); + proxy->priv->username = g_value_dup_string (value); + break; + + case PROP_PASSWORD: + g_free (proxy->priv->password); + proxy->priv->password = g_value_dup_string (value); + break; + + case PROP_URI: + g_free (proxy->priv->uri); + proxy->priv->uri = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_proxy_address_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GProxyAddress *proxy = G_PROXY_ADDRESS (object); + + switch (prop_id) + { + case PROP_PROTOCOL: + g_value_set_string (value, proxy->priv->protocol); + break; + + case PROP_DESTINATION_PROTOCOL: + g_value_set_string (value, proxy->priv->dest_protocol); + break; + + case PROP_DESTINATION_HOSTNAME: + g_value_set_string (value, proxy->priv->dest_hostname); + break; + + case PROP_DESTINATION_PORT: + g_value_set_uint (value, proxy->priv->dest_port); + break; + + case PROP_USERNAME: + g_value_set_string (value, proxy->priv->username); + break; + + case PROP_PASSWORD: + g_value_set_string (value, proxy->priv->password); + break; + + case PROP_URI: + g_value_set_string (value, proxy->priv->uri); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_proxy_address_class_init (GProxyAddressClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GProxyAddressPrivate)); + + gobject_class->finalize = g_proxy_address_finalize; + gobject_class->set_property = g_proxy_address_set_property; + gobject_class->get_property = g_proxy_address_get_property; + + g_object_class_install_property (gobject_class, + PROP_PROTOCOL, + g_param_spec_string ("protocol", + P_("Protocol"), + P_("The proxy protocol"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_USERNAME, + g_param_spec_string ("username", + P_("Username"), + P_("The proxy username"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_PASSWORD, + g_param_spec_string ("password", + P_("Password"), + P_("The proxy password"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GProxyAddress:destination-protocol: + * + * The protocol being spoke to the destination host, or %NULL if + * the #GProxyAddress doesn't know. + * + * Since: 2.34 + */ + g_object_class_install_property (gobject_class, + PROP_DESTINATION_PROTOCOL, + g_param_spec_string ("destination-protocol", + P_("Destionation Protocol"), + P_("The proxy destination protocol"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DESTINATION_HOSTNAME, + g_param_spec_string ("destination-hostname", + P_("Destination Hostname"), + P_("The proxy destination hostname"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_DESTINATION_PORT, + g_param_spec_uint ("destination-port", + P_("Destination Port"), + P_("The proxy destination port"), + 0, 65535, 0, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GProxyAddress:uri: + * + * The URI string that the proxy was constructed from (or %NULL + * if the creator didn't specify this). + * + * Since: 2.34 + */ + g_object_class_install_property (gobject_class, + PROP_URI, + g_param_spec_string ("uri", + P_("URI"), + P_("The proxy's URI"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_proxy_address_init (GProxyAddress *proxy) +{ + proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, + G_TYPE_PROXY_ADDRESS, + GProxyAddressPrivate); + proxy->priv->protocol = NULL; + proxy->priv->username = NULL; + proxy->priv->password = NULL; + proxy->priv->dest_hostname = NULL; + proxy->priv->dest_port = 0; +} + +/** + * g_proxy_address_new: + * @inetaddr: The proxy server #GInetAddress. + * @port: The proxy server port. + * @protocol: The proxy protocol to support, in lower case (e.g. socks, http). + * @dest_hostname: The destination hostname the proxy should tunnel to. + * @dest_port: The destination port to tunnel to. + * @username: (allow-none): The username to authenticate to the proxy server + * (or %NULL). + * @password: (allow-none): The password to authenticate to the proxy server + * (or %NULL). + * + * Creates a new #GProxyAddress for @inetaddr with @protocol that should + * tunnel through @dest_hostname and @dest_port. + * + * (Note that this method doesn't set the #GProxyAddress:uri or + * #GProxyAddress:destination-protocol fields; use g_object_new() + * directly if you want to set those.) + * + * Returns: a new #GProxyAddress + * + * Since: 2.26 + */ +GSocketAddress * +g_proxy_address_new (GInetAddress *inetaddr, + guint16 port, + const gchar *protocol, + const gchar *dest_hostname, + guint16 dest_port, + const gchar *username, + const gchar *password) +{ + return g_object_new (G_TYPE_PROXY_ADDRESS, + "address", inetaddr, + "port", port, + "protocol", protocol, + "destination-hostname", dest_hostname, + "destination-port", dest_port, + "username", username, + "password", password, + NULL); +} + + +/** + * g_proxy_address_get_protocol: + * @proxy: a #GProxyAddress + * + * Gets @proxy's protocol. eg, "socks" or "http" + * + * Returns: the @proxy's protocol + * + * Since: 2.26 + */ +const gchar * +g_proxy_address_get_protocol (GProxyAddress *proxy) +{ + return proxy->priv->protocol; +} + +/** + * g_proxy_address_get_destination_protocol: + * @proxy: a #GProxyAddress + * + * Gets the protocol that is being spoken to the destination + * server; eg, "http" or "ftp". + * + * Returns: the @proxy's destination protocol + * + * Since: 2.34 + */ +const gchar * +g_proxy_address_get_destination_protocol (GProxyAddress *proxy) +{ + return proxy->priv->dest_protocol; +} + +/** + * g_proxy_address_get_destination_hostname: + * @proxy: a #GProxyAddress + * + * Gets @proxy's destination hostname; that is, the name of the host + * that will be connected to via the proxy, not the name of the proxy + * itself. + * + * Returns: the @proxy's destination hostname + * + * Since: 2.26 + */ +const gchar * +g_proxy_address_get_destination_hostname (GProxyAddress *proxy) +{ + return proxy->priv->dest_hostname; +} + +/** + * g_proxy_address_get_destination_port: + * @proxy: a #GProxyAddress + * + * Gets @proxy's destination port; that is, the port on the + * destination host that will be connected to via the proxy, not the + * port number of the proxy itself. + * + * Returns: the @proxy's destination port + * + * Since: 2.26 + */ +guint16 +g_proxy_address_get_destination_port (GProxyAddress *proxy) +{ + return proxy->priv->dest_port; +} + +/** + * g_proxy_address_get_username: + * @proxy: a #GProxyAddress + * + * Gets @proxy's username. + * + * Returns: the @proxy's username + * + * Since: 2.26 + */ +const gchar * +g_proxy_address_get_username (GProxyAddress *proxy) +{ + return proxy->priv->username; +} + +/** + * g_proxy_address_get_password: + * @proxy: a #GProxyAddress + * + * Gets @proxy's password. + * + * Returns: the @proxy's password + * + * Since: 2.26 + */ +const gchar * +g_proxy_address_get_password (GProxyAddress *proxy) +{ + return proxy->priv->password; +} + + +/** + * g_proxy_address_get_uri: + * @proxy: a #GProxyAddress + * + * Gets the proxy URI that @proxy was constructed from. + * + * Returns: the @proxy's URI, or %NULL if unknown + * + * Since: 2.34 + */ +const gchar * +g_proxy_address_get_uri (GProxyAddress *proxy) +{ + return proxy->priv->uri; +} diff --git a/gio/gproxyaddress.h b/gio/gproxyaddress.h new file mode 100644 index 0000000..ed67f33 --- /dev/null +++ b/gio/gproxyaddress.h @@ -0,0 +1,88 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_PROXY_ADDRESS_H__ +#define __G_PROXY_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_PROXY_ADDRESS (g_proxy_address_get_type ()) +#define G_PROXY_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_PROXY_ADDRESS, GProxyAddress)) +#define G_PROXY_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_PROXY_ADDRESS, GProxyAddressClass)) +#define G_IS_PROXY_ADDRESS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_PROXY_ADDRESS)) +#define G_IS_PROXY_ADDRESS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_PROXY_ADDRESS)) +#define G_PROXY_ADDRESS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_PROXY_ADDRESS, GProxyAddressClass)) + +typedef struct _GProxyAddressClass GProxyAddressClass; +typedef struct _GProxyAddressPrivate GProxyAddressPrivate; + +struct _GProxyAddress +{ + GInetSocketAddress parent_instance; + + /*< private >*/ + GProxyAddressPrivate *priv; +}; + +struct _GProxyAddressClass +{ + GInetSocketAddressClass parent_class; +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_proxy_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_proxy_address_new (GInetAddress *inetaddr, + guint16 port, + const gchar *protocol, + const gchar *dest_hostname, + guint16 dest_port, + const gchar *username, + const gchar *password); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_proxy_address_get_protocol (GProxyAddress *proxy); +GLIB_AVAILABLE_IN_2_34 +const gchar *g_proxy_address_get_destination_protocol (GProxyAddress *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_proxy_address_get_destination_hostname (GProxyAddress *proxy); +GLIB_AVAILABLE_IN_ALL +guint16 g_proxy_address_get_destination_port (GProxyAddress *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_proxy_address_get_username (GProxyAddress *proxy); +GLIB_AVAILABLE_IN_ALL +const gchar *g_proxy_address_get_password (GProxyAddress *proxy); + +GLIB_AVAILABLE_IN_2_34 +const gchar *g_proxy_address_get_uri (GProxyAddress *proxy); + +G_END_DECLS + +#endif /* __G_PROXY_ADDRESS_H__ */ diff --git a/gio/gproxyaddressenumerator.c b/gio/gproxyaddressenumerator.c new file mode 100644 index 0000000..32a684f --- /dev/null +++ b/gio/gproxyaddressenumerator.c @@ -0,0 +1,756 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" +#include "gproxyaddressenumerator.h" + +#include + +#include "gasyncresult.h" +#include "ginetaddress.h" +#include "glibintl.h" +#include "gnetworkaddress.h" +#include "gnetworkingprivate.h" +#include "gproxy.h" +#include "gproxyaddress.h" +#include "gproxyresolver.h" +#include "gtask.h" +#include "gresolver.h" +#include "gsocketaddress.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" + +G_DEFINE_TYPE (GProxyAddressEnumerator, g_proxy_address_enumerator, G_TYPE_SOCKET_ADDRESS_ENUMERATOR); + +#define GET_PRIVATE(o) (G_PROXY_ADDRESS_ENUMERATOR (o)->priv) + +enum +{ + PROP_0, + PROP_URI, + PROP_CONNECTABLE, + PROP_PROXY_RESOLVER +}; + +struct _GProxyAddressEnumeratorPrivate +{ + /* Destination address */ + GSocketConnectable *connectable; + gchar *dest_uri; + gchar *dest_hostname; + guint16 dest_port; + GList *dest_ips; + + /* Proxy enumeration */ + GProxyResolver *proxy_resolver; + gchar **proxies; + gchar **next_proxy; + GSocketAddressEnumerator *addr_enum; + GSocketAddress *proxy_address; + const gchar *proxy_uri; + gchar *proxy_type; + gchar *proxy_username; + gchar *proxy_password; + gboolean supports_hostname; + GList *next_dest_ip; + GError *last_error; +}; + +static void +save_userinfo (GProxyAddressEnumeratorPrivate *priv, + const gchar *proxy) +{ + gchar *userinfo; + + if (priv->proxy_username) + { + g_free (priv->proxy_username); + priv->proxy_username = NULL; + } + + if (priv->proxy_password) + { + g_free (priv->proxy_password); + priv->proxy_password = NULL; + } + + if (_g_uri_parse_authority (proxy, NULL, NULL, &userinfo)) + { + if (userinfo) + { + gchar **split = g_strsplit (userinfo, ":", 2); + + if (split[0] != NULL) + { + priv->proxy_username = g_uri_unescape_string (split[0], NULL); + if (split[1] != NULL) + priv->proxy_password = g_uri_unescape_string (split[1], NULL); + } + + g_strfreev (split); + g_free (userinfo); + } + } +} + +static void +next_enumerator (GProxyAddressEnumeratorPrivate *priv) +{ + if (priv->proxy_address) + return; + + while (priv->addr_enum == NULL && *priv->next_proxy) + { + GSocketConnectable *connectable = NULL; + GProxy *proxy; + + priv->proxy_uri = *priv->next_proxy++; + g_free (priv->proxy_type); + priv->proxy_type = g_uri_parse_scheme (priv->proxy_uri); + + if (priv->proxy_type == NULL) + continue; + + /* Assumes hostnames are supported for unknown protocols */ + priv->supports_hostname = TRUE; + proxy = g_proxy_get_default_for_protocol (priv->proxy_type); + if (proxy) + { + priv->supports_hostname = g_proxy_supports_hostname (proxy); + g_object_unref (proxy); + } + + if (strcmp ("direct", priv->proxy_type) == 0) + { + if (priv->connectable) + connectable = g_object_ref (priv->connectable); + else + connectable = g_network_address_new (priv->dest_hostname, + priv->dest_port); + } + else + { + GError *error = NULL; + + connectable = g_network_address_parse_uri (priv->proxy_uri, 0, &error); + + if (error) + { + g_warning ("Invalid proxy URI '%s': %s", + priv->proxy_uri, error->message); + g_error_free (error); + } + + save_userinfo (priv, priv->proxy_uri); + } + + if (connectable) + { + priv->addr_enum = g_socket_connectable_enumerate (connectable); + g_object_unref (connectable); + } + } +} + +static GSocketAddress * +g_proxy_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (enumerator); + GSocketAddress *result = NULL; + GError *first_error = NULL; + + if (priv->proxies == NULL) + { + priv->proxies = g_proxy_resolver_lookup (priv->proxy_resolver, + priv->dest_uri, + cancellable, + error); + priv->next_proxy = priv->proxies; + + if (priv->proxies == NULL) + return NULL; + } + + while (result == NULL && (*priv->next_proxy || priv->addr_enum)) + { + gchar *dest_hostname; + gchar *dest_protocol; + GInetSocketAddress *inetsaddr; + GInetAddress *inetaddr; + guint16 port; + + next_enumerator (priv); + + if (!priv->addr_enum) + continue; + + if (priv->proxy_address == NULL) + { + priv->proxy_address = g_socket_address_enumerator_next ( + priv->addr_enum, + cancellable, + first_error ? NULL : &first_error); + } + + if (priv->proxy_address == NULL) + { + g_object_unref (priv->addr_enum); + priv->addr_enum = NULL; + + if (priv->dest_ips) + { + g_resolver_free_addresses (priv->dest_ips); + priv->dest_ips = NULL; + } + + continue; + } + + if (strcmp ("direct", priv->proxy_type) == 0) + { + result = priv->proxy_address; + priv->proxy_address = NULL; + continue; + } + + if (!priv->supports_hostname) + { + GInetAddress *dest_ip; + + if (!priv->dest_ips) + { + GResolver *resolver; + + resolver = g_resolver_get_default(); + priv->dest_ips = g_resolver_lookup_by_name (resolver, + priv->dest_hostname, + cancellable, + first_error ? NULL : &first_error); + g_object_unref (resolver); + + if (!priv->dest_ips) + { + g_object_unref (priv->proxy_address); + priv->proxy_address = NULL; + continue; + } + } + + if (!priv->next_dest_ip) + priv->next_dest_ip = priv->dest_ips; + + dest_ip = G_INET_ADDRESS (priv->next_dest_ip->data); + dest_hostname = g_inet_address_to_string (dest_ip); + + priv->next_dest_ip = g_list_next (priv->next_dest_ip); + } + else + { + dest_hostname = g_strdup (priv->dest_hostname); + } + dest_protocol = g_uri_parse_scheme (priv->dest_uri); + + g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (priv->proxy_address), + NULL); + + inetsaddr = G_INET_SOCKET_ADDRESS (priv->proxy_address); + inetaddr = g_inet_socket_address_get_address (inetsaddr); + port = g_inet_socket_address_get_port (inetsaddr); + + result = g_object_new (G_TYPE_PROXY_ADDRESS, + "address", inetaddr, + "port", port, + "protocol", priv->proxy_type, + "destination-protocol", dest_protocol, + "destination-hostname", dest_hostname, + "destination-port", priv->dest_port, + "username", priv->proxy_username, + "password", priv->proxy_password, + "uri", priv->proxy_uri, + NULL); + g_free (dest_hostname); + g_free (dest_protocol); + + if (priv->supports_hostname || priv->next_dest_ip == NULL) + { + g_object_unref (priv->proxy_address); + priv->proxy_address = NULL; + } + } + + if (result == NULL && first_error) + g_propagate_error (error, first_error); + else if (first_error) + g_error_free (first_error); + + return result; +} + + + +static void +complete_async (GTask *task) +{ + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + + if (priv->last_error) + { + g_task_return_error (task, priv->last_error); + priv->last_error = NULL; + } + else + g_task_return_pointer (task, NULL, NULL); + + g_object_unref (task); +} + +static void +return_result (GTask *task) +{ + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + GSocketAddress *result; + + if (strcmp ("direct", priv->proxy_type) == 0) + { + result = priv->proxy_address; + priv->proxy_address = NULL; + } + else + { + gchar *dest_hostname, *dest_protocol; + GInetSocketAddress *inetsaddr; + GInetAddress *inetaddr; + guint16 port; + + if (!priv->supports_hostname) + { + GInetAddress *dest_ip; + + if (!priv->next_dest_ip) + priv->next_dest_ip = priv->dest_ips; + + dest_ip = G_INET_ADDRESS (priv->next_dest_ip->data); + dest_hostname = g_inet_address_to_string (dest_ip); + + priv->next_dest_ip = g_list_next (priv->next_dest_ip); + } + else + { + dest_hostname = g_strdup (priv->dest_hostname); + } + dest_protocol = g_uri_parse_scheme (priv->dest_uri); + + g_return_if_fail (G_IS_INET_SOCKET_ADDRESS (priv->proxy_address)); + + inetsaddr = G_INET_SOCKET_ADDRESS (priv->proxy_address); + inetaddr = g_inet_socket_address_get_address (inetsaddr); + port = g_inet_socket_address_get_port (inetsaddr); + + result = g_object_new (G_TYPE_PROXY_ADDRESS, + "address", inetaddr, + "port", port, + "protocol", priv->proxy_type, + "destination-protocol", dest_protocol, + "destination-hostname", dest_hostname, + "destination-port", priv->dest_port, + "username", priv->proxy_username, + "password", priv->proxy_password, + "uri", priv->proxy_uri, + NULL); + g_free (dest_hostname); + g_free (dest_protocol); + + if (priv->supports_hostname || priv->next_dest_ip == NULL) + { + g_object_unref (priv->proxy_address); + priv->proxy_address = NULL; + } + } + + g_task_return_pointer (task, result, g_object_unref); + g_object_unref (task); +} + +static void address_enumerate_cb (GObject *object, + GAsyncResult *result, + gpointer user_data); + +static void +next_proxy (GTask *task) +{ + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + + if (*priv->next_proxy) + { + g_object_unref (priv->addr_enum); + priv->addr_enum = NULL; + + if (priv->dest_ips) + { + g_resolver_free_addresses (priv->dest_ips); + priv->dest_ips = NULL; + } + + next_enumerator (priv); + + if (priv->addr_enum) + { + g_socket_address_enumerator_next_async (priv->addr_enum, + g_task_get_cancellable (task), + address_enumerate_cb, + task); + return; + } + } + + complete_async (task); +} + +static void +dest_hostname_lookup_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + + g_clear_error (&priv->last_error); + priv->dest_ips = g_resolver_lookup_by_name_finish (G_RESOLVER (object), + result, + &priv->last_error); + if (priv->dest_ips) + return_result (task); + else + { + g_clear_object (&priv->proxy_address); + next_proxy (task); + } +} + +static void +address_enumerate_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + + g_clear_error (&priv->last_error); + priv->proxy_address = + g_socket_address_enumerator_next_finish (priv->addr_enum, + result, + &priv->last_error); + if (priv->proxy_address) + { + if (!priv->supports_hostname && !priv->dest_ips) + { + GResolver *resolver; + resolver = g_resolver_get_default(); + g_resolver_lookup_by_name_async (resolver, + priv->dest_hostname, + g_task_get_cancellable (task), + dest_hostname_lookup_cb, + task); + g_object_unref (resolver); + return; + } + + return_result (task); + } + else + next_proxy (task); +} + +static void +proxy_lookup_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + GProxyAddressEnumeratorPrivate *priv = g_task_get_task_data (task); + + g_clear_error (&priv->last_error); + priv->proxies = g_proxy_resolver_lookup_finish (G_PROXY_RESOLVER (object), + result, + &priv->last_error); + priv->next_proxy = priv->proxies; + + if (priv->last_error) + { + complete_async (task); + return; + } + else + { + next_enumerator (priv); + if (priv->addr_enum) + { + g_socket_address_enumerator_next_async (priv->addr_enum, + g_task_get_cancellable (task), + address_enumerate_cb, + task); + return; + } + } + + complete_async (task); +} + +static void +g_proxy_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (enumerator); + GTask *task; + + task = g_task_new (enumerator, cancellable, callback, user_data); + g_task_set_task_data (task, priv, NULL); + + if (priv->proxies == NULL) + { + g_proxy_resolver_lookup_async (priv->proxy_resolver, + priv->dest_uri, + cancellable, + proxy_lookup_cb, + task); + return; + } + + if (priv->addr_enum) + { + if (priv->proxy_address) + { + return_result (task); + return; + } + else + { + g_socket_address_enumerator_next_async (priv->addr_enum, + cancellable, + address_enumerate_cb, + task); + return; + } + } + + complete_async (task); +} + +static GSocketAddress * +g_proxy_address_enumerator_next_finish (GSocketAddressEnumerator *enumerator, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, enumerator), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_proxy_address_enumerator_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (object); + switch (property_id) + { + case PROP_URI: + g_value_set_string (value, priv->dest_uri); + break; + + case PROP_CONNECTABLE: + g_value_set_object (value, priv->connectable); + break; + + case PROP_PROXY_RESOLVER: + g_value_set_object (value, priv->proxy_resolver); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +g_proxy_address_enumerator_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (object); + switch (property_id) + { + case PROP_URI: + { + const gchar *uri; + + g_free (priv->dest_hostname); + priv->dest_hostname = NULL; + priv->dest_port = 0; + + g_free (priv->dest_uri); + priv->dest_uri = NULL; + + uri = g_value_get_string (value); + + if (uri) + { + GSocketConnectable *conn; + + conn = g_network_address_parse_uri (uri, 0, NULL); + if (conn) + { + guint port; + + priv->dest_uri = g_strdup (uri); + + g_object_get (conn, + "hostname", &priv->dest_hostname, + "port", &port, + NULL); + + priv->dest_port = port; + g_object_unref (conn); + } + else + g_warning ("Invalid URI '%s'", uri); + } + + break; + } + + case PROP_CONNECTABLE: + priv->connectable = g_value_dup_object (value); + break; + + case PROP_PROXY_RESOLVER: + if (priv->proxy_resolver) + g_object_unref (priv->proxy_resolver); + priv->proxy_resolver = g_value_get_object (value); + if (!priv->proxy_resolver) + priv->proxy_resolver = g_proxy_resolver_get_default (); + g_object_ref (priv->proxy_resolver); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +g_proxy_address_enumerator_finalize (GObject *object) +{ + GProxyAddressEnumeratorPrivate *priv = GET_PRIVATE (object); + + if (priv->connectable) + g_object_unref (priv->connectable); + + if (priv->proxy_resolver) + g_object_unref (priv->proxy_resolver); + + g_free (priv->dest_uri); + g_free (priv->dest_hostname); + + if (priv->dest_ips) + g_resolver_free_addresses (priv->dest_ips); + + g_strfreev (priv->proxies); + + if (priv->addr_enum) + g_object_unref (priv->addr_enum); + + g_free (priv->proxy_type); + g_free (priv->proxy_username); + g_free (priv->proxy_password); + + g_clear_error (&priv->last_error); + + G_OBJECT_CLASS (g_proxy_address_enumerator_parent_class)->finalize (object); +} + +static void +g_proxy_address_enumerator_init (GProxyAddressEnumerator *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, + G_TYPE_PROXY_ADDRESS_ENUMERATOR, + GProxyAddressEnumeratorPrivate); +} + +static void +g_proxy_address_enumerator_class_init (GProxyAddressEnumeratorClass *proxy_enumerator_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (proxy_enumerator_class); + GSocketAddressEnumeratorClass *enumerator_class = G_SOCKET_ADDRESS_ENUMERATOR_CLASS (proxy_enumerator_class); + + g_type_class_add_private (enumerator_class, + sizeof (GProxyAddressEnumeratorPrivate)); + + object_class->set_property = g_proxy_address_enumerator_set_property; + object_class->get_property = g_proxy_address_enumerator_get_property; + object_class->finalize = g_proxy_address_enumerator_finalize; + + enumerator_class->next = g_proxy_address_enumerator_next; + enumerator_class->next_async = g_proxy_address_enumerator_next_async; + enumerator_class->next_finish = g_proxy_address_enumerator_next_finish; + + g_object_class_install_property (object_class, + PROP_URI, + g_param_spec_string ("uri", + P_("URI"), + P_("The destination URI, use none:// for generic socket"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_CONNECTABLE, + g_param_spec_object ("connectable", + P_("Connectable"), + P_("The connectable being enumerated."), + G_TYPE_SOCKET_CONNECTABLE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GProxyAddressEnumerator:proxy-resolver: + * + * The proxy resolver to use. + * + * Since: 2.36 + */ + g_object_class_install_property (object_class, + PROP_PROXY_RESOLVER, + g_param_spec_object ("proxy-resolver", + P_("Proxy resolver"), + P_("The proxy resolver to use."), + G_TYPE_PROXY_RESOLVER, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); +} diff --git a/gio/gproxyaddressenumerator.h b/gio/gproxyaddressenumerator.h new file mode 100644 index 0000000..19bcd51 --- /dev/null +++ b/gio/gproxyaddressenumerator.h @@ -0,0 +1,76 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_PROXY_ADDRESS_ENUMERATOR_H__ +#define __G_PROXY_ADDRESS_ENUMERATOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_PROXY_ADDRESS_ENUMERATOR (g_proxy_address_enumerator_get_type ()) +#define G_PROXY_ADDRESS_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_PROXY_ADDRESS_ENUMERATOR, GProxyAddressEnumerator)) +#define G_PROXY_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_PROXY_ADDRESS_ENUMERATOR, GProxyAddressEnumeratorClass)) +#define G_IS_PROXY_ADDRESS_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_PROXY_ADDRESS_ENUMERATOR)) +#define G_IS_PROXY_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_PROXY_ADDRESS_ENUMERATOR)) +#define G_PROXY_ADDRESS_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_PROXY_ADDRESS_ENUMERATOR, GProxyAddressEnumeratorClass)) + +/** + * GProxyAddressEnumerator: + * + * A subclass of #GSocketAddressEnumerator that takes another address + * enumerator and wraps its results in #GProxyAddresses as + * directed by the default #GProxyResolver. + */ + +typedef struct _GProxyAddressEnumeratorClass GProxyAddressEnumeratorClass; +typedef struct _GProxyAddressEnumeratorPrivate GProxyAddressEnumeratorPrivate; + +struct _GProxyAddressEnumerator +{ + GSocketAddressEnumerator parent_instance; + GProxyAddressEnumeratorPrivate *priv; +}; + +struct _GProxyAddressEnumeratorClass +{ + GSocketAddressEnumeratorClass parent_class; + + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_proxy_address_enumerator_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_PROXY_ADDRESS_ENUMERATOR_H__ */ diff --git a/gio/gproxyresolver.c b/gio/gproxyresolver.c new file mode 100644 index 0000000..db2e475 --- /dev/null +++ b/gio/gproxyresolver.c @@ -0,0 +1,197 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include "gproxyresolver.h" + +#include +#include "glibintl.h" + +#include "gasyncresult.h" +#include "gcancellable.h" +#include "giomodule.h" +#include "giomodule-priv.h" +#include "gsimpleasyncresult.h" + +/** + * SECTION:gproxyresolver + * @short_description: Asynchronous and cancellable network proxy resolver + * @include: gio/gio.h + * + * #GProxyResolver provides synchronous and asynchronous network proxy + * resolution. #GProxyResolver is used within #GSocketClient through + * the method g_socket_connectable_proxy_enumerate(). + */ + +G_DEFINE_INTERFACE (GProxyResolver, g_proxy_resolver, G_TYPE_OBJECT) + +static void +g_proxy_resolver_default_init (GProxyResolverInterface *iface) +{ +} + +/** + * g_proxy_resolver_get_default: + * + * Gets the default #GProxyResolver for the system. + * + * Return value: (transfer none): the default #GProxyResolver. + * + * Since: 2.26 + */ +GProxyResolver * +g_proxy_resolver_get_default (void) +{ + return _g_io_module_get_default (G_PROXY_RESOLVER_EXTENSION_POINT_NAME, + "GIO_USE_PROXY_RESOLVER", + (GIOModuleVerifyFunc)g_proxy_resolver_is_supported); +} + +/** + * g_proxy_resolver_is_supported: + * @resolver: a #GProxyResolver + * + * Checks if @resolver can be used on this system. (This is used + * internally; g_proxy_resolver_get_default() will only return a proxy + * resolver that returns %TRUE for this method.) + * + * Return value: %TRUE if @resolver is supported. + * + * Since: 2.26 + */ +gboolean +g_proxy_resolver_is_supported (GProxyResolver *resolver) +{ + GProxyResolverInterface *iface; + + g_return_val_if_fail (G_IS_PROXY_RESOLVER (resolver), FALSE); + + iface = G_PROXY_RESOLVER_GET_IFACE (resolver); + + return (* iface->is_supported) (resolver); +} + +/** + * g_proxy_resolver_lookup: + * @resolver: a #GProxyResolver + * @uri: a URI representing the destination to connect to + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Looks into the system proxy configuration to determine what proxy, + * if any, to use to connect to @uri. The returned proxy URIs are of the + * form <protocol>://[user[:password]@]host:port + * or direct://, where <protocol> could be + * http, rtsp, socks or other proxying protocol. + * + * If you don't know what network protocol is being used on the + * socket, you should use none as the URI protocol. + * In this case, the resolver might still return a generic proxy type + * (such as SOCKS), but would not return protocol-specific proxy types + * (such as http). + * + * direct:// is used when no proxy is needed. + * Direct connection should not be attempted unless it is part of the + * returned array of proxies. + * + * Return value: (transfer full) (array zero-terminated=1): A + * NULL-terminated array of proxy URIs. Must be freed + * with g_strfreev(). + * + * Since: 2.26 + */ +gchar ** +g_proxy_resolver_lookup (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error) +{ + GProxyResolverInterface *iface; + + g_return_val_if_fail (G_IS_PROXY_RESOLVER (resolver), NULL); + g_return_val_if_fail (uri != NULL, NULL); + + iface = G_PROXY_RESOLVER_GET_IFACE (resolver); + + return (* iface->lookup) (resolver, uri, cancellable, error); +} + +/** + * g_proxy_resolver_lookup_async: + * @resolver: a #GProxyResolver + * @uri: a URI representing the destination to connect to + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): callback to call after resolution completes + * @user_data: (closure): data for @callback + * + * Asynchronous lookup of proxy. See g_proxy_resolver_lookup() for more + * details. + * + * Since: 2.26 + */ +void +g_proxy_resolver_lookup_async (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GProxyResolverInterface *iface; + + g_return_if_fail (G_IS_PROXY_RESOLVER (resolver)); + g_return_if_fail (uri != NULL); + + iface = G_PROXY_RESOLVER_GET_IFACE (resolver); + + (* iface->lookup_async) (resolver, uri, cancellable, callback, user_data); +} + +/** + * g_proxy_resolver_lookup_finish: + * @resolver: a #GProxyResolver + * @result: the result passed to your #GAsyncReadyCallback + * @error: return location for a #GError, or %NULL + * + * Call this function to obtain the array of proxy URIs when + * g_proxy_resolver_lookup_async() is complete. See + * g_proxy_resolver_lookup() for more details. + * + * Return value: (transfer full) (array zero-terminated=1): A + * NULL-terminated array of proxy URIs. Must be freed + * with g_strfreev(). + * + * Since: 2.26 + */ +gchar ** +g_proxy_resolver_lookup_finish (GProxyResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GProxyResolverInterface *iface; + + g_return_val_if_fail (G_IS_PROXY_RESOLVER (resolver), NULL); + + iface = G_PROXY_RESOLVER_GET_IFACE (resolver); + + return (* iface->lookup_finish) (resolver, result, error); +} diff --git a/gio/gproxyresolver.h b/gio/gproxyresolver.h new file mode 100644 index 0000000..eaad834 --- /dev/null +++ b/gio/gproxyresolver.h @@ -0,0 +1,97 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_PROXY_RESOLVER_H__ +#define __G_PROXY_RESOLVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_PROXY_RESOLVER (g_proxy_resolver_get_type ()) +#define G_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_PROXY_RESOLVER, GProxyResolver)) +#define G_IS_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_PROXY_RESOLVER)) +#define G_PROXY_RESOLVER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), G_TYPE_PROXY_RESOLVER, GProxyResolverInterface)) + +/** + * G_PROXY_RESOLVER_EXTENSION_POINT_NAME: + * + * Extension point for proxy resolving functionality. + * See Extending GIO. + */ +#define G_PROXY_RESOLVER_EXTENSION_POINT_NAME "gio-proxy-resolver" + +typedef struct _GProxyResolverInterface GProxyResolverInterface; + +struct _GProxyResolverInterface { + GTypeInterface g_iface; + + /* Virtual Table */ + gboolean (* is_supported) (GProxyResolver *resolver); + + gchar ** (* lookup) (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error); + + void (* lookup_async) (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + gchar ** (* lookup_finish) (GProxyResolver *resolver, + GAsyncResult *result, + GError **error); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_proxy_resolver_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GProxyResolver *g_proxy_resolver_get_default (void); + +GLIB_AVAILABLE_IN_ALL +gboolean g_proxy_resolver_is_supported (GProxyResolver *resolver); +GLIB_AVAILABLE_IN_ALL +gchar **g_proxy_resolver_lookup (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_proxy_resolver_lookup_async (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gchar **g_proxy_resolver_lookup_finish (GProxyResolver *resolver, + GAsyncResult *result, + GError **error); + + +G_END_DECLS + +#endif /* __G_PROXY_RESOLVER_H__ */ diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c new file mode 100644 index 0000000..1b4c119 --- /dev/null +++ b/gio/gregistrysettingsbackend.c @@ -0,0 +1,1971 @@ +/* + * Copyright © 2009-10 Sam Thursfield + * + * This library is free software; you can redistribute it and/or + * 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: Sam Thursfield + */ + +/* GRegistryBackend implementation notes: + * + * - All settings are stored under the path: + * HKEY_CURRENT_USER\Software\GSettings\ + * This means all settings are per-user. Permissions and system-wide + * defaults are not implemented and will probably always be out of scope of + * the Windows port of GLib. + * + * - The registry type system is limited. Most GVariant types are stored as + * literals via g_variant_print/parse(). Strings are stored without the + * quotes that GVariant requires. Integer types are stored as native + * REG_DWORD or REG_QWORD. The REG_MULTI_SZ (string array) type could be + * used to avoid flattening container types. + * + * - Notifications are handled; the change event is watched for in a separate + * thread (Windows does not provide a callback API) which sends them with + * g_idle_add to the GLib main loop. The threading is done using Windows + * API functions, so there is no dependence on GThread. + * + * - Windows doesn't tell us which value has changed. This means we have to + * maintain a cache of every stored value so we can play spot the + * difference. This should not be a performance issue because if you are + * storing thousands of values in GSettings, you are probably using it + * wrong. + * + * - The cache stores the value as a registry type. Because many variants are + * stored as string representations, values which have changed equality but + * not equivalence may trigger spurious change notifications. GSettings + * users must already deal with this possibility and converting all data to + * GVariant values would be more effort. + * + * - Because we have to cache every registry value locally, reads are done + * from the cache rather than directly from the registry. Writes update + * both. This means that the backend will not work if the watch thread is + * not running. A GSettings object always subscribes to changes so we can + * be sure that the watch thread will be running, but if for some reason + * the backend is being used directly you should bear that in mind. + * + * - The registry is totally user-editable, so we are very forgiving about + * errors in the data we get. + * + * - The registry uses backslashes as path separators. GSettings keys only + * allow [A-Za-z\-] so no escaping is needed. No attempt is made to solve + * clashes between keys differing only in case. + * + * - RegCreateKeyA is used - Windows can also handle UTF16LE strings. + * GSettings doesn't pay any attention to encoding, so by using ANSI we + * hopefully avoid passing any invalid Unicode. + * + * - The Windows registry has the following limitations: a key may not exceed + * 255 characters, an entry's value may not exceed 16,383 characters, and + * all the values of a key may not exceed 65,535 characters. + * + * - Terminology: + * * in GSettings, a 'key' is eg. /desktop/gnome/background/primary-color + * * in the registry, the 'key' is path, which contains some 'values'. + * * in this file, any GSettings key is a 'key', while a registry key is + * termed a 'path', which contains 'values'. + * + * - My set of tests for this backend are currently at: + * http://gitorious.org/gsettings-gtk/gsettings-test.git + * + * - There is an undocumented function in ntdll.dll which might be more + * than RegNotifyChangeKeyValue(), NtNotifyChangeKey: + * http://source.winehq.org/source/dlls/ntdll/reg.c#L618 + * http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Key/NtNotifyChangeKey.html + * + * - If updating the cache ever becomes a performance issue it may make sense + * to use a red-black tree, but I don't currently think it's worth the time + */ + +#include "config.h" + +#include "gregistrysettingsbackend.h" +#include "gsimplepermission.h" +#include "gsettingsbackend.h" +#include "giomodule.h" + +#include + +//#define TRACE + +/* GSettings' limit */ +#define MAX_KEY_NAME_LENGTH 32 + +/* Testing (on Windows XP SP3) shows that WaitForMultipleObjects fails with + * "The parameter is incorrect" after 64 watches. We need one for the + * message_sent cond, which is allowed for in the way the watches_remaining + * variable is used. + */ +#define MAX_WATCHES 64 + +/* A watch on one registry path and its subkeys */ +typedef struct +{ + HANDLE event; + HKEY hpath; + char *prefix; + GNode *cache_node; +} RegistryWatch; + + +/* Simple message passing for the watch thread. Not enough traffic to + * justify a queue. + */ +typedef enum +{ + WATCH_THREAD_NONE, + WATCH_THREAD_ADD_WATCH, + WATCH_THREAD_REMOVE_WATCH, + WATCH_THREAD_STOP +} WatchThreadMessageType; + +typedef struct +{ + WatchThreadMessageType type; + RegistryWatch watch; +} WatchThreadMessage; + + +typedef struct +{ + GSettingsBackend *owner; + HANDLE *thread; + + /* Details of the things we are watching. */ + int watches_remaining; + GPtrArray *events, *handles, *prefixes, *cache_nodes; + + /* Communication with the main thread. Only one message is stored at a time, + * to make sure that messages are acknowledged before being overwritten we + * create two events - one is signalled when a new message is set, the + * other is signalled by the thread when it has processed the message. + */ + WatchThreadMessage message; + CRITICAL_SECTION *message_lock; + HANDLE message_sent_event, message_received_event; +} WatchThreadState; + + +#define G_TYPE_REGISTRY_BACKEND (g_registry_backend_get_type ()) +#define G_REGISTRY_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_REGISTRY_BACKEND, GRegistryBackend)) +#define G_IS_REGISTRY_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_REGISTRY_BACKEND)) + + +typedef GSettingsBackendClass GRegistryBackendClass; + +typedef struct { + GSettingsBackend parent_instance; + + char *base_path; + + /* A stored copy of the whole tree being watched. When we receive a change notification + * we have to check against this to see what has changed ... every time ...*/ + CRITICAL_SECTION *cache_lock; + GNode *cache_root; + + WatchThreadState *watch; +} GRegistryBackend; + +G_DEFINE_TYPE_WITH_CODE (GRegistryBackend, + g_registry_backend, + G_TYPE_SETTINGS_BACKEND, + g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, "registry", 90)) + + +/********************************************************************************** + * Utility functions + **********************************************************************************/ + +#include +static void +trace (const char *format, ...) +{ + #ifdef TRACE + va_list va; va_start (va, format); + vprintf (format, va); fflush (stdout); + va_end (va); + #endif +}; + +/* g_message including a windows error message. It is not useful to have an + * equivalent function for g_warning because none of the registry errors can + * result from programmer error (Microsoft programmers don't count), instead + * they will mostly occur from people messing with the registry by hand. */ +static void +g_message_win32_error (DWORD result_code, + const gchar *format, + ...) +{ + va_list va; + gint pos; + gchar win32_message[1024]; + + if (result_code == 0) + result_code = GetLastError (); + + va_start (va, format); + pos = g_vsnprintf (win32_message, 512, format, va); + + win32_message[pos++] = ':'; win32_message[pos++] = ' '; + + FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, result_code, 0, (LPTSTR)(win32_message+pos), + 1023 - pos, NULL); + + if (result_code == ERROR_KEY_DELETED) + trace ("(%s)", win32_message); + else + g_message (win32_message); +}; + + +/* Make gsettings key into a registry path & value pair. + * + * Note that the return value *only* needs freeing - registry_value_name + * is a pointer to further inside the same block of memory. + */ +static gchar * +parse_key (const gchar *key_name, + const gchar *registry_prefix, + gchar **value_name) +{ + gchar *path_name, *c; + + /* All key paths are treated as absolute; gsettings doesn't seem to enforce a + * preceding /. + */ + if (key_name[0] == '/') + key_name ++; + + if (registry_prefix == NULL) + path_name = g_strdup (key_name); + else + path_name = g_strjoin ("/", registry_prefix, key_name, NULL); + + /* Prefix is expected to be in registry format (\ separators) so don't escape that. */ + for (c=path_name+(registry_prefix?strlen(registry_prefix):0); *c!=0; c++) + if (*c == '/') + { + *c = '\\'; + (*value_name) = c; + } + + **value_name = 0; (*value_name)++; + return path_name; +}; + + +static DWORD +g_variant_get_as_dword (GVariant *variant) +{ + switch (g_variant_get_type_string (variant)[0]) + { + case 'b': return g_variant_get_boolean (variant); + case 'y': return g_variant_get_byte (variant); + case 'n': return g_variant_get_int16 (variant); + case 'q': return g_variant_get_uint16 (variant); + case 'i': return g_variant_get_int32 (variant); + case 'u': return g_variant_get_uint32 (variant); + default: g_warn_if_reached (); + } + return 0; +} + +static DWORDLONG +g_variant_get_as_qword (GVariant *variant) +{ + switch (g_variant_get_type_string (variant)[0]) + { + case 'x': return g_variant_get_int64 (variant); + case 't': return g_variant_get_uint64 (variant); + default: g_warn_if_reached (); + } + return 0; +} + + +static void +handle_read_error (LONG result, + const gchar *path_name, + const gchar *value_name) +{ + /* file not found means key value not set, this isn't an error for us. */ + if (result != ERROR_FILE_NOT_FOUND) + g_message_win32_error (result, "Unable to query value %s/%s: %s.\n", + path_name, value_name); +} + +/*************************************************************************** + * Cache of registry values + ***************************************************************************/ + +/* Generic container for registry values */ +typedef struct { + DWORD type; + + union { + gint dword; /* FIXME: could inline QWORD on 64-bit systems too */ + void *ptr; + }; +} RegistryValue; + +static char * +registry_value_dump (RegistryValue value) +{ + if (value.type == REG_DWORD) + return g_strdup_printf ("%i", value.dword); + else if (value.type == REG_QWORD) + return g_strdup_printf ("%I64i", value.ptr==NULL? 0: *(DWORDLONG *)value.ptr); + else if (value.type == REG_SZ) + return g_strdup_printf ("%s", (char *)value.ptr); + else if (value.type == REG_NONE) + return g_strdup_printf (""); + else + return g_strdup_printf (""); +} + +static void +registry_value_free (RegistryValue value) +{ + if (value.type == REG_SZ || value.type == REG_QWORD) + g_free (value.ptr); + value.type = REG_NONE; + value.ptr = NULL; +} + + +/* The registry cache is stored as a tree, for easy traversal. Right now we + * don't sort it in a clever way. Each node corresponds to a path element + * ('key' in registry terms) or a value. + * + * Each subscription uses the same cache. Because GSettings can subscribe to + * the tree at any node any number of times, we need to reference count the + * nodes. + */ +typedef struct +{ + /* Component of path that this node represents */ + gchar *name; + + /* If a watch is subscribed at this point (subscription_count > 0) we can + * block its next notification. This is useful because if two watches cover + * the same path, both will trigger when it changes. It also allows changes + * done by the application to be ignored by the watch thread. + */ + gint32 block_count : 8; + + /* Number of times g_settings_subscribe has been called for this location + * (I guess you can't subscribe more than 16383 times) */ + gint32 subscription_count : 14; + + gint32 ref_count : 9; + + gint32 touched : 1; + RegistryValue value; +} RegistryCacheItem; + + + +static GNode * +registry_cache_add_item (GNode *parent, + gchar *name, + RegistryValue value, + gint ref_count) +{ + RegistryCacheItem *item = g_slice_new (RegistryCacheItem); + GNode *cache_node; + + g_return_val_if_fail (name != NULL, NULL); + g_return_val_if_fail (parent != NULL, NULL); + + /* Ref count should be the number of watch points above this node */ + item->ref_count = ref_count; + + item->name = g_strdup (name); + item->value = value; + item->subscription_count = 0; + item->block_count = 0; + item->touched = FALSE; + trace ("\treg cache: adding %s to %s\n", name, ((RegistryCacheItem *)parent->data)->name); + + cache_node = g_node_new (item); + g_node_append (parent, cache_node); + return cache_node; +} + +/* The reference counting of cache tree nodes works like this: when a node is + * subscribed to (GSettings wants us to watch that path and everything below + * it) the reference count of that node and everything below is increased, as + * well as each parent up to the root. + */ + + +static void +_ref_down (GNode *node) +{ + RegistryCacheItem *item = node->data; + g_node_children_foreach (node, G_TRAVERSE_ALL, + (GNodeForeachFunc)_ref_down, NULL); + item->ref_count ++; +} +static void +registry_cache_ref_tree (GNode *tree) +{ + RegistryCacheItem *item = tree->data; + GNode *node = tree->parent; + + g_return_if_fail (tree != NULL); + + item->ref_count ++; + + g_node_children_foreach (tree, G_TRAVERSE_ALL, + (GNodeForeachFunc)_ref_down, NULL); + + for (node=tree->parent; node; node=node->parent) + { + item = node->data; + item->ref_count ++; + } +} + +static void +_free_cache_item (RegistryCacheItem *item) +{ + trace ("\t -- Free node %s\n", item->name); + g_free (item->name); + registry_value_free (item->value); + g_slice_free (RegistryCacheItem, item); +} + +/* Unreferencing has to be done bottom-up */ +static void +_unref_node (GNode *node) +{ + RegistryCacheItem *item = node->data; + + item->ref_count --; + + g_warn_if_fail (item->ref_count >= 0); + + if (item->ref_count == 0) + { + _free_cache_item (item); + g_node_destroy (node); + } +} + +static void +_unref_down (GNode *node) +{ + g_node_children_foreach (node, G_TRAVERSE_ALL, + (GNodeForeachFunc)_unref_down, NULL); + _unref_node (node); +} + +static void +registry_cache_unref_tree (GNode *tree) +{ + GNode *parent = tree->parent, *next_parent; + + _unref_down (tree); + + while (parent) + { + next_parent = parent->parent; + _unref_node (parent); + parent = next_parent; + } +} + +#if 0 +static void +registry_cache_dump (GNode *cache_node, + gpointer data) +{ + RegistryCacheItem *item = cache_node->data; + + int depth = GPOINTER_TO_INT(data), + new_depth = depth+1, + i; + + g_return_if_fail (cache_node != NULL); + + for (i=0; iname, item->ref_count, (guint)cache_node, + registry_value_dump (item->value)); + g_node_children_foreach (cache_node, G_TRAVERSE_ALL, registry_cache_dump, + GINT_TO_POINTER (new_depth)); +} +#endif + +typedef struct +{ + gchar *name; + GNode *result; +} RegistryCacheSearch; + +static gboolean +registry_cache_find_compare (GNode *node, + gpointer data) +{ + RegistryCacheSearch *search = data; + RegistryCacheItem *item = node->data; + + if (item == NULL) /* root node */ + return FALSE; + + g_return_val_if_fail (search->name != NULL, FALSE); + g_return_val_if_fail (item->name != NULL, FALSE); + + if (strcmp (search->name, item->name) == 0) + { + search->result = node; + return TRUE; + } + return FALSE; +} + +static GNode * +registry_cache_find_immediate_child (GNode *node, + gchar *name) +{ + RegistryCacheSearch search; + search.result = NULL; + search.name = name; + g_node_traverse (node, G_POST_ORDER, G_TRAVERSE_ALL, 2, + registry_cache_find_compare, &search); + return search.result; +} + + +static GNode * +registry_cache_get_node_for_key_recursive (GNode *node, + gchar *key_name, + gboolean create_if_not_found, + gint n_parent_watches) +{ + RegistryCacheItem *item; + gchar *component = key_name, + *c = strchr (component, '/'); + GNode *child; + + if (c != NULL) + *c = 0; + + /* We count up how many watch points we travel through finding this node, + * because a new node should have as many references as there are watches at + * points above it in the tree. + */ + item = node->data; + if (item->subscription_count > 0) + n_parent_watches ++; + + child = registry_cache_find_immediate_child (node, component); + if (child == NULL && create_if_not_found) + { + item = g_slice_new (RegistryCacheItem); + item->name = g_strdup (component); + item->value.type = REG_NONE; + item->value.ptr = NULL; + item->ref_count = n_parent_watches; + child = g_node_new (item); + g_node_append (node, child); + trace ("\tget node for key recursive: new %x = %s.\n", node, item->name); + } + + /* We are done if there are no more path components. Allow for a trailing /. */ + if (child==NULL || c == NULL || *(c+1)==0) + return child; + else + { + trace ("get node for key recursive: next: %s.\n", c+1); + return registry_cache_get_node_for_key_recursive + (child, c+1, create_if_not_found, n_parent_watches); + } +} + +/* Look up a GSettings key in the cache. */ +static GNode * +registry_cache_get_node_for_key (GNode *root, + const gchar *key_name, + gboolean create_if_not_found) +{ + GNode *child = NULL, + *result = NULL; + gchar *component, *c; + + g_return_val_if_fail (key_name != NULL, NULL); + + if (key_name[0] == '/') + key_name ++; + + /* Ignore preceding / */ + component = g_strdup (key_name); + c = strchr (component, '/'); + if (c != NULL) + *c = 0; + + child = registry_cache_find_immediate_child (root, component); + if (child == NULL && create_if_not_found) + { + /* Reference count is set to 0, tree should be referenced by the caller */ + RegistryCacheItem *item = g_slice_new (RegistryCacheItem); + item->value.type = REG_NONE; + item->value.ptr = NULL; + item->name = g_strdup (component); + item->ref_count = 0; + trace ("get_node_for_key: New node for component '%s'\n", item->name); + child = g_node_new (item); + g_node_append (root, child); + } + + if (c == NULL) + result = root; + else if (*(c+1)==0) + result = child; + else if (child != NULL) + result = registry_cache_get_node_for_key_recursive (child, c+1, create_if_not_found, 0); + + g_free (component); + + return result; +} + +/* Check the cache node against the registry key it represents. Return TRUE if + * they differ, and update the cache with the new value. + */ +static gboolean +registry_cache_update_node (GNode *cache_node, + RegistryValue registry_value) +{ + RegistryCacheItem *cache_item = cache_node->data; + + g_return_val_if_fail (cache_node != NULL, FALSE); + g_return_val_if_fail (cache_item != NULL, FALSE); + + if (registry_value.type != cache_item->value.type) + { + /* The type has changed. Update cache item and register it as changed. + * Either the schema has changed and this is entirely legitimate, or + * whenever the app reads the key it will get the default value due to + * the type mismatch. + */ + cache_item->value = registry_value; + return TRUE; + } + + switch (registry_value.type) + { + case REG_DWORD: + { + if (cache_item->value.dword == registry_value.dword) + return FALSE; + else + { + cache_item->value.dword = registry_value.dword; + return TRUE; + } + } + case REG_QWORD: + { + g_return_val_if_fail (registry_value.ptr != NULL && + cache_item->value.ptr != NULL, FALSE); + + if (memcmp (registry_value.ptr, cache_item->value.ptr, 8)==0) + { + g_free (registry_value.ptr); + return FALSE; + } + else + { + g_free (cache_item->value.ptr); + cache_item->value.ptr = registry_value.ptr; + return TRUE; + } + } + case REG_SZ: + { + /* Value should not exist if it is NULL, an empty string is "" */ + g_return_val_if_fail (cache_item->value.ptr != NULL, FALSE); + g_return_val_if_fail (registry_value.ptr != NULL, FALSE); + + if (strcmp (registry_value.ptr, cache_item->value.ptr) == 0) + { + g_free (registry_value.ptr); + return FALSE; + } + else + { + g_free (cache_item->value.ptr); + cache_item->value.ptr = registry_value.ptr; + return TRUE; + } + } + default: + g_warning ("gregistrybackend: registry_cache_update_node: Unhandled value type :("); + return FALSE; + } +} + +/* Blocking notifications is a useful optimisation. When a change is made + * through GSettings we update the cache manually, but a notifcation is + * triggered as well. This function is also used for nested notifications, + * eg. if /test and /test/foo are watched, and /test/foo/value is changed then + * we will get notified both for /test/foo and /test and it is helpful to block + * the second. + */ +static void +registry_cache_block_notification (GNode *node) +{ + RegistryCacheItem *item = node->data; + + g_return_if_fail (node != NULL); + + if (item->subscription_count > 0) + item->block_count ++; + + if (node->parent != NULL) + registry_cache_block_notification (node->parent); +} + +static void +registry_cache_destroy_tree (GNode *node, + WatchThreadState *self); + +/*************************************************************************** + * Reading and writing + ***************************************************************************/ + +static gboolean +registry_read (HKEY hpath, + const gchar *path_name, + const gchar *value_name, + RegistryValue *p_value) +{ + LONG result; + DWORD value_data_size; + gpointer *buffer; + + g_return_val_if_fail (p_value != NULL, FALSE); + + p_value->type = REG_NONE; + p_value->ptr = NULL; + + result = RegQueryValueExA (hpath, value_name, 0, &p_value->type, NULL, &value_data_size); + if (result != ERROR_SUCCESS) + { + handle_read_error (result, path_name, value_name); + return FALSE; + } + + if (p_value->type == REG_SZ && value_data_size == 0) + { + p_value->ptr = g_strdup (""); + return TRUE; + } + + if (p_value->type == REG_DWORD) + /* REG_DWORD is inlined */ + buffer = (void *)&p_value->dword; + else + buffer = p_value->ptr = g_malloc (value_data_size); + + result = RegQueryValueExA (hpath, value_name, 0, NULL, (LPBYTE)buffer, &value_data_size); + if (result != ERROR_SUCCESS) + { + handle_read_error (result, path_name, value_name); + return FALSE; + } + + return TRUE; +} + + +static GVariant * +g_registry_backend_read (GSettingsBackend *backend, + const gchar *key_name, + const GVariantType *expected_type, + gboolean default_value) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (backend); + + GNode *cache_node; + RegistryValue registry_value; + GVariant *gsettings_value = NULL; + gchar *gsettings_type; + + g_return_val_if_fail (expected_type != NULL, NULL); + + if (default_value) + return NULL; + + /* Simply read from the cache, which is updated from the registry by the + * watch thread as soon as changes can propagate. Any changes not yet in the + * cache will have the 'changed' signal emitted after this function returns. + */ + EnterCriticalSection (self->cache_lock); + cache_node = registry_cache_get_node_for_key (self->cache_root, key_name, FALSE); + LeaveCriticalSection (self->cache_lock); + + trace ("Reading key %s, cache node %x\n", key_name, cache_node); + + /* Maybe it's not set, we can return to default */ + if (cache_node == NULL) + return NULL; + + trace ("\t- cached value %s\n", registry_value_dump (((RegistryCacheItem *)cache_node->data)->value)); + + registry_value = ((RegistryCacheItem *)cache_node->data)->value; + + gsettings_type = g_variant_type_dup_string (expected_type); + + /* The registry is user-editable, so we need to be fault-tolerant here. */ + switch (gsettings_type[0]) + { + case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': + if (registry_value.type == REG_DWORD) + gsettings_value = g_variant_new (gsettings_type, registry_value.dword); + break; + + case 't': case 'x': + if (registry_value.type == REG_QWORD) + { + DWORDLONG qword_value = *(DWORDLONG *)registry_value.ptr; + gsettings_value = g_variant_new (gsettings_type, qword_value); + } + break; + + default: + if (registry_value.type == REG_SZ) + { + if (gsettings_type[0]=='s') + gsettings_value = g_variant_new_string ((char *)registry_value.ptr); + else + { + GError *error = NULL; + gsettings_value = g_variant_parse (expected_type, registry_value.ptr, NULL, NULL, &error); + + if (error != NULL) + g_message ("gregistrysettingsbackend: error parsing key %s: %s\n", + key_name, error->message); + } + } + break; + } + + g_free (gsettings_type); + + return gsettings_value; +} + + +typedef struct +{ + GRegistryBackend *self; + HKEY hroot; +} RegistryWrite; + +static gboolean +g_registry_backend_write_one (const char *key_name, + GVariant *variant, + gpointer user_data) +{ + GRegistryBackend *self; + RegistryWrite *action; + RegistryValue value; + + HKEY hroot, hpath; + gchar *path_name, *value_name = NULL; + DWORD value_data_size; + LPVOID value_data; + LONG result; + + GNode *node; + gboolean changed; + + const gchar *type_string = g_variant_get_type_string (variant); + + action = user_data; + self = G_REGISTRY_BACKEND (action->self); + hroot = action->hroot; + + value.type = REG_NONE; + value.ptr = NULL; + + switch (type_string[0]) + { + case 'b': case 'y': case 'n': case 'q': case 'i': case 'u': + value.type = REG_DWORD; + value.dword = g_variant_get_as_dword (variant); + value_data_size = 4; + value_data = &value.dword; + break; + + case 'x': case 't': + value.type = REG_QWORD; + value.ptr = g_malloc (8); + *(DWORDLONG *)value.ptr = g_variant_get_as_qword (variant); + value_data_size = 8; + value_data = value.ptr; + break; + + default: + value.type = REG_SZ; + if (type_string[0]=='s') + { + gsize length; + value.ptr = g_strdup (g_variant_get_string (variant, &length)); + value_data_size = length + 1; + value_data = value.ptr; + } + else + { + GString *value_string; + value_string = g_variant_print_string (variant, NULL, FALSE); + value_data_size = value_string->len+1; + value.ptr = value_data = g_string_free (value_string, FALSE); + } + break; + } + + /* First update the cache, because the value may not have changed and we can + * save a write. + * + * If 'value' has changed then its memory will not be freed by update_node(), + * because it will be stored in the node. + */ + EnterCriticalSection (self->cache_lock); + node = registry_cache_get_node_for_key (self->cache_root, key_name, TRUE); + changed = registry_cache_update_node (node, value); + LeaveCriticalSection (self->cache_lock); + + if (!changed) + return FALSE; + + /* Block the next notification to any watch points above this location, + * because they will each get triggered on a change that is already updated + * in the cache. + */ + registry_cache_block_notification (node); + + path_name = parse_key (key_name, NULL, &value_name); + + trace ("Set key: %s / %s\n", path_name, value_name); + + /* Store the value in the registry */ + result = RegCreateKeyExA (hroot, path_name, 0, NULL, 0, KEY_WRITE, NULL, &hpath, NULL); + if (result != ERROR_SUCCESS) + { + g_message_win32_error (result, "gregistrybackend: opening key %s failed", path_name+1); + registry_value_free (value); + g_free (path_name); + return FALSE; + } + + result = RegSetValueExA (hpath, value_name, 0, value.type, value_data, value_data_size); + if (result != ERROR_SUCCESS) + g_message_win32_error (result, "gregistrybackend: setting value %s\\%s\\%s failed.\n", + self->base_path, path_name, value_name); + + /* If the write fails then it will seem like the value has changed until the + * next execution (because we wrote to the cache first). There's no reason + * for it to fail unless something is weirdly broken, however. + */ + + RegCloseKey (hpath); + g_free (path_name); + + return FALSE; +}; + +/* The dconf write policy is to do the write while making out it succeeded, + * and then backtrack if it didn't. The registry functions are synchronous so + * we can't do that. */ + +static gboolean +g_registry_backend_write (GSettingsBackend *backend, + const gchar *key_name, + GVariant *value, + gpointer origin_tag) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (backend); + LONG result; + HKEY hroot; + RegistryWrite action; + + result = RegCreateKeyExA (HKEY_CURRENT_USER, self->base_path, 0, NULL, 0, + KEY_WRITE, NULL, &hroot, NULL); + if (result != ERROR_SUCCESS) { + trace ("Error opening/creating key %s.\n", self->base_path); + return FALSE; + } + + action.self = self; + action.hroot = hroot; + g_registry_backend_write_one (key_name, value, &action); + g_settings_backend_changed (backend, key_name, origin_tag); + + RegCloseKey (hroot); + + return TRUE; +} + +static gboolean +g_registry_backend_write_tree (GSettingsBackend *backend, + GTree *values, + gpointer origin_tag) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (backend); + LONG result; + HKEY hroot; + RegistryWrite action; + + result = RegCreateKeyExA (HKEY_CURRENT_USER, self->base_path, 0, NULL, 0, + KEY_WRITE, NULL, &hroot, NULL); + if (result != ERROR_SUCCESS) { + trace ("Error opening/creating key %s.\n", self->base_path); + return FALSE; + } + + action.self = self; + action.hroot = hroot; + g_tree_foreach (values, (GTraverseFunc)g_registry_backend_write_one, + &action); + + g_settings_backend_changed_tree (backend, values, origin_tag); + RegCloseKey (hroot); + + return TRUE; +} + +static void +g_registry_backend_reset (GSettingsBackend *backend, + const gchar *key_name, + gpointer origin_tag) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (backend); + gchar *path_name, *value_name = NULL; + GNode *cache_node; + LONG result; + HKEY hpath; + + /* Remove from cache */ + EnterCriticalSection (self->cache_lock); + cache_node = registry_cache_get_node_for_key (self->cache_root, key_name, FALSE); + if (cache_node) + registry_cache_destroy_tree (cache_node, self->watch); + LeaveCriticalSection (self->cache_lock); + + /* Remove from the registry */ + path_name = parse_key (key_name, self->base_path, &value_name); + + result = RegOpenKeyExA (HKEY_CURRENT_USER, path_name, 0, KEY_SET_VALUE, &hpath); + if (result != ERROR_SUCCESS) + { + g_message_win32_error (result, "Registry: resetting key '%s'", path_name); + g_free (path_name); + return; + } + + result = RegDeleteValueA (hpath, value_name); + RegCloseKey (hpath); + + if (result != ERROR_SUCCESS) + { + g_message_win32_error (result, "Registry: resetting key '%s'", path_name); + g_free (path_name); + return; + } + + g_free (path_name); + + + g_settings_backend_changed (backend, key_name, origin_tag); +} + +/* Not implemented and probably beyond the scope of this backend */ +static gboolean +g_registry_backend_get_writable (GSettingsBackend *backend, + const gchar *key_name) +{ + return TRUE; +} + +static GPermission * +g_registry_backend_get_permission (GSettingsBackend *backend, + const gchar *key_name) +{ + return g_simple_permission_new (TRUE); +} + + +/******************************************************************************** + * Spot-the-difference engine + ********************************************************************************/ + +static void +_free_watch (WatchThreadState *self, + gint index, + GNode *cache_node); + +static void +registry_cache_item_reset_touched (GNode *node, + gpointer data) +{ + RegistryCacheItem *item = node->data; + item->touched = FALSE; +} + +/* Delete a node and any children, for when it has been deleted from the registry */ +static void +registry_cache_destroy_tree (GNode *node, + WatchThreadState *self) +{ + RegistryCacheItem *item = node->data; + + g_node_children_foreach (node, G_TRAVERSE_ALL, + (GNodeForeachFunc)registry_cache_destroy_tree, self); + + if (item->subscription_count > 0) + { + gint i; + /* There must be some watches active if this node is a watch point */ + g_warn_if_fail (self->cache_nodes->len > 1); + + /* This is a watch point that has been deleted. Let's free the watch! */ + for (i=1; icache_nodes->len; i++) + if (g_ptr_array_index (self->cache_nodes, i) == node) + break; + if (i >= self->cache_nodes->len) + g_warning ("watch thread: a watch point was deleted, but unable to " + "find '%s' in the list of %i watch nodes\n", item->name, + self->cache_nodes->len-1); + else + { + _free_watch (self, i, node); + g_atomic_int_inc (&self->watches_remaining); + } + } + _free_cache_item (node->data); + g_node_destroy (node); +} + +static void +registry_cache_remove_deleted (GNode *node, + gpointer data) +{ + RegistryCacheItem *item = node->data; + + if (!item->touched) + registry_cache_destroy_tree (node, data); +} + +/* Update cache from registry, and optionally report on the changes. + * + * This function is sometimes called from the watch thread, with no locking. It + * does call g_registry_backend functions, but this is okay because they only + * access self->base which is constant. + * + * When looking at this code bear in mind the terminology: in the registry, keys + * are containers that contain values, and other keys. Keys have a 'default' + * value which we always ignore. + * + * n_parent_watches: a counter used to set the reference count of any new nodes + * that are created - they should have as many references as + * there are notifications that are watching them. + */ +static void +registry_cache_update (GRegistryBackend *self, + HKEY hpath, + const gchar *prefix, + const gchar *partial_key_name, + GNode *cache_node, + int n_watches, + GPtrArray *changes) +{ + gchar buffer[MAX_KEY_NAME_LENGTH + 1]; + gchar *key_name; + gint i; + LONG result; + + RegistryCacheItem *item = cache_node->data; + + if (item->subscription_count > 0) + n_watches ++; + + /* prefix is the level that all changes occur below; partial_key_name should + * be NULL on the first call to this function */ + key_name = g_build_path ("/", prefix, partial_key_name, NULL); + + trace ("registry cache update: %s. Node %x has %i children\n", key_name, + cache_node, g_node_n_children (cache_node)); + + /* Start by zeroing 'touched' flag. When the registry traversal is done, any untouched nodes + * must have been deleted from the registry. + */ + g_node_children_foreach (cache_node, G_TRAVERSE_ALL, + registry_cache_item_reset_touched, NULL); + + /* Recurse into each subpath at the current level, if any */ + i = 0; + while (1) + { + DWORD buffer_size = MAX_KEY_NAME_LENGTH; + HKEY hsubpath; + + result = RegEnumKeyEx (hpath, i++, buffer, &buffer_size, NULL, NULL, NULL, NULL); + if (result != ERROR_SUCCESS) + break; + + result = RegOpenKeyEx (hpath, buffer, 0, KEY_READ, &hsubpath); + if (result == ERROR_SUCCESS) + { + GNode *subkey_node; + RegistryCacheItem *child_item; + + subkey_node = registry_cache_find_immediate_child (cache_node, buffer); + if (subkey_node == NULL) + { + RegistryValue null_value = {REG_NONE, {0}}; + subkey_node = registry_cache_add_item (cache_node, buffer, + null_value, n_watches); + } + + + registry_cache_update (self, hsubpath, prefix, buffer, subkey_node, + n_watches, changes); + child_item = subkey_node->data; + child_item->touched = TRUE; + } + RegCloseKey (hsubpath); + } + + if (result != ERROR_NO_MORE_ITEMS) + g_message_win32_error (result, "gregistrybackend: error enumerating subkeys for cache."); + + /* Enumerate each value at 'path' and check if it has changed */ + i = 0; + while (1) + { + DWORD buffer_size = MAX_KEY_NAME_LENGTH; + GNode *cache_child_node; + RegistryCacheItem *child_item; + RegistryValue value; + gboolean changed = FALSE; + + result = RegEnumValue (hpath, i++, buffer, &buffer_size, NULL, NULL, NULL, NULL); + if (result != ERROR_SUCCESS) + break; + + if (buffer[0]==0) + /* This is the key's 'default' value, for which we have no use. */ + continue; + + cache_child_node = registry_cache_find_immediate_child (cache_node, buffer); + + if (!registry_read (hpath, key_name, buffer, &value)) + continue; + + trace ("\tgot value %s for %s, node %x\n", registry_value_dump (value), buffer, cache_child_node); + + if (cache_child_node == NULL) + { + /* This is a new value */ + cache_child_node = registry_cache_add_item (cache_node, buffer, value, + n_watches); + changed = TRUE; + } + else + { + /* For efficiency, instead of converting every value back to a GVariant to + * compare it, we compare them as registry values (integers, or string + * representations of the variant). The spurious change notifications that may + * result should not be a big issue. + * + * Note that 'value' is swallowed or freed. + */ + changed = registry_cache_update_node (cache_child_node, value); + } + + child_item = cache_child_node->data; + child_item->touched = TRUE; + if (changed == TRUE && changes != NULL) + { + gchar *item; + if (partial_key_name == NULL) + item = g_strdup (buffer); + else + item = g_build_path ("/", partial_key_name, buffer, NULL); + g_ptr_array_add (changes, item); + } + } + + if (result != ERROR_NO_MORE_ITEMS) + g_message_win32_error (result, "gregistrybackend: error enumerating values for cache"); + + /* Any nodes now left untouched must have been deleted, remove them from cache */ + g_node_children_foreach (cache_node, G_TRAVERSE_ALL, + registry_cache_remove_deleted, self->watch); + + trace ("registry cache update complete.\n"); + g_free (key_name); +}; + + + +/*********************************************************************************** + * Thread to watch for registry change events + ***********************************************************************************/ + +/* Called by watch thread. Apply for notifications on a registry key and its subkeys. */ +static DWORD +registry_watch_key (HKEY hpath, HANDLE event) +{ + return RegNotifyChangeKeyValue (hpath, TRUE, + REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET, + event, TRUE); +} + + +/* One of these is sent down the pipe when something happens in the registry. */ +typedef struct +{ + GRegistryBackend *self; + gchar *prefix; /* prefix is a gsettings path, all items are subkeys of this. */ + GPtrArray *items; /* each item is a subkey below prefix that has changed. */ +} RegistryEvent; + +/* This handler runs in the main thread to emit the changed signals */ +static gboolean +watch_handler (RegistryEvent *event) +{ + gint i; + trace ("Watch handler: got event in %s, items %i.\n", event->prefix, event->items->len); + + /* GSettings requires us to NULL-terminate the array. */ + g_ptr_array_add (event->items, NULL); + g_settings_backend_keys_changed (G_SETTINGS_BACKEND (event->self), event->prefix, + (gchar const **)event->items->pdata, NULL); + + for (i=0; iitems->len; i++) + g_free (g_ptr_array_index (event->items, i)); + g_ptr_array_free (event->items, TRUE); + + g_free (event->prefix); + g_object_unref (event->self); + + g_slice_free (RegistryEvent, event); + return G_SOURCE_REMOVE; +}; + + +static void +_free_watch (WatchThreadState *self, + gint index, + GNode *cache_node) +{ + HKEY hpath; + HANDLE cond; + gchar *prefix; + + g_return_if_fail (index > 0 && index < self->events->len); + + cond = g_ptr_array_index (self->events, index); + hpath = g_ptr_array_index (self->handles, index); + prefix = g_ptr_array_index (self->prefixes, index); + + trace ("Freeing watch %i [%s]\n", index, prefix); + + /* These can be NULL if the watch was already dead, this can happen when eg. + * a key is deleted but GSettings is still subscribed to it - the watch is + * kept alive so that the unsubscribe function works properly, but does not + * do anything. + */ + if (hpath != NULL) + RegCloseKey (hpath); + + if (cache_node != NULL) + { + //registry_cache_dump (G_REGISTRY_BACKEND (self->owner)->cache_root, NULL); + registry_cache_unref_tree (cache_node); + } + + CloseHandle (cond); + g_free (prefix); + + /* As long as we remove from each array at the same time, it doesn't matter that + * their orders get messed up - they all get messed up the same. + */ + g_ptr_array_remove_index_fast (self->handles, index); + g_ptr_array_remove_index_fast (self->events, index); + g_ptr_array_remove_index_fast (self->prefixes, index); + g_ptr_array_remove_index_fast (self->cache_nodes, index); +} + +static void +watch_thread_handle_message (WatchThreadState *self) +{ + switch (self->message.type) + { + case WATCH_THREAD_NONE: + trace ("watch thread: you woke me up for nothin', man!"); + break; + + case WATCH_THREAD_ADD_WATCH: + { + RegistryWatch *watch = &self->message.watch; + LONG result; + result = registry_watch_key (watch->hpath, watch->event); + if (result == ERROR_SUCCESS) + { + g_ptr_array_add (self->events, watch->event); + g_ptr_array_add (self->handles, watch->hpath); + g_ptr_array_add (self->prefixes, watch->prefix); + g_ptr_array_add (self->cache_nodes, watch->cache_node); + trace ("watch thread: new watch on %s, %i total\n", watch->prefix, + self->events->len); + } + else + { + g_message_win32_error (result, "watch thread: could not watch %s", watch->prefix); + CloseHandle (watch->event); + RegCloseKey (watch->hpath); + g_free (watch->prefix); + registry_cache_unref_tree (watch->cache_node); + } + break; + } + + case WATCH_THREAD_REMOVE_WATCH: + { + GNode *cache_node; + RegistryCacheItem *cache_item; + gint i; + + for (i=1; iprefixes->len; i++) + if (strcmp (g_ptr_array_index (self->prefixes, i), + self->message.watch.prefix) == 0) + break; + + if (i >= self->prefixes->len) + { + /* Don't make a fuss if the prefix is not being watched because + * maybe the path was deleted so we removed the watch. + */ + trace ("unsubscribe: prefix %s is not being watched [%i things are]!\n", + self->message.watch.prefix, self->prefixes->len); + g_free (self->message.watch.prefix); + break; + } + + cache_node = g_ptr_array_index (self->cache_nodes, i); + + trace ("watch thread: unsubscribe: freeing node %x, prefix %s, index %i\n", + (guint)cache_node, self->message.watch.prefix, i); + if (cache_node != NULL) + { + cache_item = cache_node->data; + + /* There may be more than one GSettings object subscribed to this + * path, only free the watch when the last one unsubscribes. + */ + cache_item->subscription_count --; + if (cache_item->subscription_count > 0) + break; + } + + _free_watch (self, i, cache_node); + g_free (self->message.watch.prefix); + + g_atomic_int_inc (&self->watches_remaining); + break; + } + + case WATCH_THREAD_STOP: + { + gint i; + + /* Free any remaining cache and watch handles */ + for (i=1; ievents->len; i++) + _free_watch (self, i, g_ptr_array_index (self->cache_nodes, i)); + + SetEvent (self->message_received_event); + ExitThread (0); + } + } + + self->message.type = WATCH_THREAD_NONE; + SetEvent (self->message_received_event); +} + + +/* Thread which watches for win32 registry events */ +static DWORD WINAPI +watch_thread_function (LPVOID parameter) +{ + WatchThreadState *self = (WatchThreadState *)parameter; + DWORD result; + + self->events = g_ptr_array_new (); + self->handles = g_ptr_array_new (); + self->prefixes = g_ptr_array_new (); + self->cache_nodes = g_ptr_array_new (); + g_ptr_array_add (self->events, self->message_sent_event); + g_ptr_array_add (self->handles, NULL); + g_ptr_array_add (self->prefixes, NULL); + g_ptr_array_add (self->cache_nodes, NULL); + + while (1) + { + trace ("watch thread: going to sleep; %i events watched.\n", self->events->len); + result = WaitForMultipleObjects (self->events->len, self->events->pdata, FALSE, INFINITE); + + if (result == WAIT_OBJECT_0) + { + /* A message to you. The sender (main thread) will block until we signal the received + * event, so there should be no danger of it sending another before we receive the + * first. + */ + watch_thread_handle_message (self); + } + else if (result > WAIT_OBJECT_0 && result <= WAIT_OBJECT_0 + self->events->len) + { + HKEY hpath; + HANDLE cond; + gchar *prefix; + GNode *cache_node; + RegistryCacheItem *cache_item; + RegistryEvent *event; + + /* One of our notifications has triggered. All we know is which one, and which key + * this is for. We do most of the processing here, because we may as well. If the + * registry changes further while we are processing it doesn't matter - we will then + * receive another change notification from the OS anyway. + */ + gint notify_index = result - WAIT_OBJECT_0; + hpath = g_ptr_array_index (self->handles, notify_index); + cond = g_ptr_array_index (self->events, notify_index); + prefix = g_ptr_array_index (self->prefixes, notify_index); + cache_node = g_ptr_array_index (self->cache_nodes, notify_index); + + trace ("Watch thread: notify received on prefix %i: %s.\n", notify_index, prefix); + + if (cache_node == NULL) + { + /* This path has been deleted */ + trace ("Notify received on a path that was deleted :(\n"); + continue; + } + + /* Firstly we need to reapply for the notification, because (what a + * sensible API) we won't receive any more. MSDN is pretty + * inconsistent on this matter: + * http://msdn.microsoft.com/en-us/library/ms724892%28VS.85%29.aspx + * http://support.microsoft.com/kb/236570 + * But my tests (on Windows XP SP3) show that we need to reapply + * each time. + */ + result = registry_watch_key (hpath, cond); + + if (result != ERROR_SUCCESS) + { + /* Watch failed, most likely because the key has just been + * deleted. Free the watch and unref the cache nodes. + */ + if (result != ERROR_KEY_DELETED) + g_message_win32_error (result, "watch thread: failed to watch %s", prefix); + _free_watch (self, notify_index, cache_node); + g_atomic_int_inc (&self->watches_remaining); + continue; + } + + /* The notification may have been blocked because we just changed + * some data ourselves. + */ + cache_item = cache_node->data; + if (cache_item->block_count) + { + cache_item->block_count --; + trace ("Watch thread: notify blocked at %s\n", prefix); + continue; + } + + /* Now we update our stored cache from registry data, and find which keys have + * actually changed. If more changes happen while we are processing, we will get + * another event because we have reapplied for change notifications already. + * + * Working here rather than in the main thread is preferable because the UI is less + * likely to block (only when changing notification subscriptions). + */ + event = g_slice_new (RegistryEvent); + + event->self = G_REGISTRY_BACKEND (self->owner); + g_object_ref (self->owner); + + event->items = g_ptr_array_new (); + + EnterCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock); + registry_cache_update (G_REGISTRY_BACKEND (self->owner), hpath, + prefix, NULL, cache_node, 0, event->items); + LeaveCriticalSection (G_REGISTRY_BACKEND (self->owner)->cache_lock); + + if (event->items->len > 0) + { + event->prefix = g_strdup (prefix); + g_idle_add ((GSourceFunc) watch_handler, event); + } + else + { + g_ptr_array_free (event->items, TRUE); + g_slice_free (RegistryEvent, event); + } + } + else + { + /* God knows what has happened */ + g_message_win32_error (GetLastError(), "watch thread: WaitForMultipleObjects error"); + } + } + + return -1; +} + +static gboolean +watch_start (GRegistryBackend *self) +{ + WatchThreadState *watch; + + g_return_val_if_fail (self->watch == NULL, FALSE); + + self->cache_lock = g_slice_new (CRITICAL_SECTION); + InitializeCriticalSection (self->cache_lock); + + watch = g_slice_new (WatchThreadState); + watch->owner = G_SETTINGS_BACKEND (self); + + watch->watches_remaining = MAX_WATCHES; + + watch->message_lock = g_slice_new (CRITICAL_SECTION); + InitializeCriticalSection (watch->message_lock); + watch->message_sent_event = CreateEvent (NULL, FALSE, FALSE, NULL); + watch->message_received_event = CreateEvent (NULL, FALSE, FALSE, NULL); + if (watch->message_sent_event == NULL || watch->message_received_event == NULL) + { + g_message_win32_error (0, "gregistrybackend: Failed to create sync objects."); + goto fail_1; + } + + /* Use a small stack to make the thread more lightweight. */ + watch->thread = CreateThread (NULL, 1024, watch_thread_function, watch, 0, NULL); + if (watch->thread == NULL) + { + g_message_win32_error (0, "gregistrybackend: Failed to create notify watch thread."); + goto fail_2; + } + + self->watch = watch; + + return TRUE; + +fail_2: + DeleteCriticalSection (self->cache_lock); + g_slice_free (CRITICAL_SECTION, self->cache_lock); + DeleteCriticalSection (watch->message_lock); + g_slice_free (CRITICAL_SECTION, watch->message_lock); + CloseHandle (watch->message_sent_event); + CloseHandle (watch->message_received_event); +fail_1: + g_slice_free (WatchThreadState, watch); + return FALSE; +} + +/* This function assumes you hold the message lock! */ +static void +watch_stop_unlocked (GRegistryBackend *self) +{ + WatchThreadState *watch = self->watch; + DWORD result; + g_return_if_fail (watch != NULL); + + watch->message.type = WATCH_THREAD_STOP; + SetEvent (watch->message_sent_event); + + /* This is signalled as soon as the message is received. We must not return + * while the watch thread is still firing off callbacks. Freeing all of the + * memory is done in the watch thread after this is signalled. + */ + result = WaitForSingleObject (watch->message_received_event, INFINITE); + if (result != WAIT_OBJECT_0) + { + g_warning ("gregistrybackend: unable to stop watch thread."); + return; + } + + LeaveCriticalSection (watch->message_lock); + DeleteCriticalSection (watch->message_lock); + DeleteCriticalSection (self->cache_lock); + g_slice_free (CRITICAL_SECTION, watch->message_lock); + g_slice_free (CRITICAL_SECTION, self->cache_lock); + CloseHandle (watch->message_sent_event); + CloseHandle (watch->message_received_event); + CloseHandle (watch->thread); + g_slice_free (WatchThreadState, watch); + + trace ("\nwatch thread: %x: all data freed.\n", self); + self->watch = NULL; +}; + +static gboolean +watch_add_notify (GRegistryBackend *self, + HANDLE event, + HKEY hpath, + gchar *gsettings_prefix) +{ + WatchThreadState *watch = self->watch; + GNode *cache_node; + RegistryCacheItem *cache_item; +#ifdef TRACE + DWORD result; +#endif + + g_return_val_if_fail (watch != NULL, FALSE); + trace ("watch_add_notify: prefix %s.\n", gsettings_prefix); + + /* Duplicate tree into the cache in the main thread, before we add the notify: if we do it in the + * thread we can miss changes while we are caching. + */ + EnterCriticalSection (self->cache_lock); + cache_node = registry_cache_get_node_for_key (self->cache_root, gsettings_prefix, TRUE); + + g_return_val_if_fail (cache_node != NULL, FALSE); + g_return_val_if_fail (cache_node->data != NULL, FALSE); + + cache_item = cache_node->data; + + cache_item->subscription_count ++; + if (cache_item->subscription_count > 1) + { + trace ("watch_add_notify: prefix %s already watched, %i subscribers.\n", + gsettings_prefix, cache_item->subscription_count); + return FALSE; + } + + registry_cache_ref_tree (cache_node); + registry_cache_update (self, hpath, gsettings_prefix, NULL, cache_node, 0, NULL); + //registry_cache_dump (self->cache_root, NULL); + LeaveCriticalSection (self->cache_lock); + + EnterCriticalSection (watch->message_lock); + watch->message.type = WATCH_THREAD_ADD_WATCH; + watch->message.watch.event = event; + watch->message.watch.hpath = hpath; + watch->message.watch.prefix = gsettings_prefix; + watch->message.watch.cache_node = cache_node; + + SetEvent (watch->message_sent_event); + + /* Wait for the received event in return, to avoid sending another message before the first + * one was received. If it takes > 200ms there is a possible race but the worst outcome is + * a notification is ignored. + */ +#ifdef TRACE + result = +#endif + WaitForSingleObject (watch->message_received_event, 200); +#ifdef TRACE + if (result != WAIT_OBJECT_0) + trace ("watch thread is slow to respond - notification may not be added."); +#endif + + LeaveCriticalSection (watch->message_lock); + + return TRUE; +}; + + +static void +watch_remove_notify (GRegistryBackend *self, + const gchar *key_name) +{ + WatchThreadState *watch = self->watch; + LONG result; + + if (self->watch == NULL) + /* Here we assume that the unsubscribe message is for somewhere that was + * deleted, and so it has already been removed and the watch thread has + * stopped. + */ + return; + + EnterCriticalSection (watch->message_lock); + watch->message.type = WATCH_THREAD_REMOVE_WATCH; + watch->message.watch.prefix = g_strdup (key_name); + + SetEvent (watch->message_sent_event); + + /* Wait for the received event in return, to avoid sending another message before the first + * one was received. + */ + result = WaitForSingleObject (watch->message_received_event, INFINITE); + + if (result != ERROR_SUCCESS) + g_warning ("unsubscribe from %s: message not acknowledged\n", key_name); + + if (g_atomic_int_get (&watch->watches_remaining) >= MAX_WATCHES) + /* Stop it before any new ones can get added and confuse things */ + watch_stop_unlocked (self); + else + LeaveCriticalSection (watch->message_lock); +} + +/* dconf semantics are: if the key ends in /, watch the keys underneath it - if not, watch that + * key. Our job is easier because keys and values are separate. + */ +static void +g_registry_backend_subscribe (GSettingsBackend *backend, + const char *key_name) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (backend); + gchar *path_name, *value_name = NULL; + HKEY hpath; + HANDLE event; + LONG result; + + if (self->watch == NULL) + if (!watch_start (self)) + return; + + if (g_atomic_int_dec_and_test (&self->watch->watches_remaining)) + { + g_atomic_int_inc (&self->watch->watches_remaining); + g_warning ("subscribe() failed: only %i different paths may be watched.\n", MAX_WATCHES); + return; + } + + path_name = parse_key (key_name, self->base_path, &value_name); + + /* Must check for this, otherwise strange crashes occur because the cache + * node that is being watched gets freed. All path names to subscribe must + * end in a slash! + */ + if (value_name != NULL && *value_name != 0) + g_warning ("subscribe() failed: path must end in a /, got %s\n", key_name); + + trace ("Subscribing to %s [registry %s / %s] - watch %x\n", key_name, path_name, value_name, self->watch); + + + /* Give the caller the benefit of the doubt if the key doesn't exist and create it. The caller + * is almost certainly a new g_settings with this path as base path. */ + result = RegCreateKeyExA (HKEY_CURRENT_USER, path_name, 0, NULL, 0, KEY_READ, NULL, &hpath, + NULL); + g_free (path_name); + + if (result != ERROR_SUCCESS) + { + g_message_win32_error (result, "gregistrybackend: Unable to subscribe to key %s.", key_name); + g_atomic_int_inc (&self->watch->watches_remaining); + return; + } + + event = CreateEvent (NULL, FALSE, FALSE, NULL); + if (event == NULL) + { + g_message_win32_error (result, "gregistrybackend: CreateEvent failed.\n"); + g_atomic_int_inc (&self->watch->watches_remaining); + RegCloseKey (hpath); + return; + } + + /* The actual watch is added by the thread, which has to re-subscribe each time it + * receives a change. */ + if (!watch_add_notify (self, event, hpath, g_strdup (key_name))) + g_atomic_int_inc (&self->watch->watches_remaining); +} + +static void +g_registry_backend_unsubscribe (GSettingsBackend *backend, + const char *key_name) +{ + trace ("unsubscribe: %s.\n", key_name); + + watch_remove_notify (G_REGISTRY_BACKEND (backend), key_name); +} + + +/******************************************************************************** + * Object management junk + ********************************************************************************/ + +static void +g_registry_backend_finalize (GObject *object) +{ + GRegistryBackend *self = G_REGISTRY_BACKEND (object); + RegistryCacheItem *item; + + item = self->cache_root->data; + g_warn_if_fail (item->ref_count == 1); + + _free_cache_item (item); + g_node_destroy (self->cache_root); + + if (self->watch != NULL) + { + EnterCriticalSection (self->watch->message_lock); + watch_stop_unlocked (self); + } + + g_free (self->base_path); +} + +static void +g_registry_backend_class_init (GRegistryBackendClass *class) +{ + GSettingsBackendClass *backend_class = G_SETTINGS_BACKEND_CLASS (class); + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_registry_backend_finalize; + + backend_class->read = g_registry_backend_read; + backend_class->write = g_registry_backend_write; + backend_class->write_tree = g_registry_backend_write_tree; + backend_class->reset = g_registry_backend_reset; + backend_class->get_writable = g_registry_backend_get_writable; + backend_class->get_permission = g_registry_backend_get_permission; + backend_class->subscribe = g_registry_backend_subscribe; + backend_class->unsubscribe = g_registry_backend_unsubscribe; +} + +static void +g_registry_backend_init (GRegistryBackend *self) +{ + RegistryCacheItem *item; + self->base_path = g_strdup_printf ("Software\\GSettings"); + + item = g_slice_new (RegistryCacheItem); + item->value.type = REG_NONE; + item->value.ptr = NULL; + item->name = g_strdup (""); + item->ref_count = 1; + self->cache_root = g_node_new (item); + + self->watch = NULL; +} diff --git a/gio/gregistrysettingsbackend.h b/gio/gregistrysettingsbackend.h new file mode 100644 index 0000000..faba639 --- /dev/null +++ b/gio/gregistrysettingsbackend.h @@ -0,0 +1,30 @@ +/* + * Copyright © 2009-10 Sam Thursfield + * + * This library is free software; you can redistribute it and/or + * 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: Sam Thursfield + */ + +#ifndef __G_REGISTRY_SETTINGS_BACKEND_H__ +#define __G_REGISTRY_SETTINGS_BACKEND_H__ + +#include + +GType g_registry_backend_get_type (void); + + +#endif /* __G_REGISTRY_SETTINGS_BACKEND_H__ */ diff --git a/gio/gremoteactiongroup.c b/gio/gremoteactiongroup.c new file mode 100644 index 0000000..1b6f342 --- /dev/null +++ b/gio/gremoteactiongroup.c @@ -0,0 +1,136 @@ +/* + * 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 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 + */ + +#include "config.h" + +#include "gsimpleaction.h" +#include "gactiongroup.h" +#include "gactionmap.h" +#include "gaction.h" + +/** + * SECTION:gremoteactiongroup + * @title: GRemoteActionGroup + * @short_description: a #GActionGroup that interacts with other processes + * + * The GRemoteActionGroup interface is implemented by #GActionGroup + * instances that either transmit action invocations to other processes + * or receive action invocations in the local process from other + * processes. + * + * The interface has _full variants of the two + * methods on #GActionGroup used to activate actions: + * g_action_group_activate_action() and + * g_action_group_change_action_state(). These variants allow a + * "platform data" #GVariant to be specified: a dictionary providing + * context for the action invocation (for example: timestamps, startup + * notification IDs, etc). + * + * #GDBusActionGroup implements #GRemoteActionGroup. This provides a + * mechanism to send platform data for action invocations over D-Bus. + * + * Additionally, g_dbus_connection_export_action_group() will check if + * the exported #GActionGroup implements #GRemoteActionGroup and use the + * _full variants of the calls if available. This + * provides a mechanism by which to receive platform data for action + * invocations that arrive by way of D-Bus. + * + * Since: 2.32 + **/ + +/** + * GRemoteActionGroupInterface: + * @activate_action_full: the virtual function pointer for g_remote_action_group_activate_action_full() + * @change_action_state_full: the virtual function pointer for g_remote_action_group_change_action_state_full() + * + * The virtual function table for #GRemoteActionGroup. + * + * Since: 2.32 + **/ + +#include "config.h" + +#include "gremoteactiongroup.h" + +G_DEFINE_INTERFACE (GRemoteActionGroup, g_remote_action_group, G_TYPE_ACTION_GROUP) + +static void +g_remote_action_group_default_init (GRemoteActionGroupInterface *iface) +{ +} + +/** + * g_remote_action_group_activate_action_full: + * @remote: a #GDBusActionGroup + * @action_name: the name of the action to activate + * @parameter: (allow-none): the optional parameter to the activation + * @platform_data: the platform data to send + * + * Activates the remote action. + * + * This is the same as g_action_group_activate_action() except that it + * allows for provision of "platform data" to be sent along with the + * activation request. This typically contains details such as the user + * interaction timestamp or startup notification information. + * + * @platform_data must be non-%NULL and must have the type + * %G_VARIANT_TYPE_VARDICT. If it is floating, it will be consumed. + * + * Since: 2.32 + **/ +void +g_remote_action_group_activate_action_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *parameter, + GVariant *platform_data) +{ + G_REMOTE_ACTION_GROUP_GET_IFACE (remote) + ->activate_action_full (remote, action_name, parameter, platform_data); +} + +/** + * g_remote_action_group_change_action_state_full: + * @remote: a #GRemoteActionGroup + * @action_name: the name of the action to change the state of + * @value: the new requested value for the state + * @platform_data: the platform data to send + * + * Changes the state of a remote action. + * + * This is the same as g_action_group_change_action_state() except that + * it allows for provision of "platform data" to be sent along with the + * state change request. This typically contains details such as the + * user interaction timestamp or startup notification information. + * + * @platform_data must be non-%NULL and must have the type + * %G_VARIANT_TYPE_VARDICT. If it is floating, it will be consumed. + * + * Since: 2.32 + **/ +void +g_remote_action_group_change_action_state_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *value, + GVariant *platform_data) +{ + G_REMOTE_ACTION_GROUP_GET_IFACE (remote) + ->change_action_state_full (remote, action_name, value, platform_data); +} diff --git a/gio/gremoteactiongroup.h b/gio/gremoteactiongroup.h new file mode 100644 index 0000000..a9926ee --- /dev/null +++ b/gio/gremoteactiongroup.h @@ -0,0 +1,77 @@ +/* + * Copyright © 2011 Canonical 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_REMOTE_ACTION_GROUP_H__ +#define __G_REMOTE_ACTION_GROUP_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +#define G_TYPE_REMOTE_ACTION_GROUP (g_remote_action_group_get_type ()) +#define G_REMOTE_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_REMOTE_ACTION_GROUP, GRemoteActionGroup)) +#define G_IS_REMOTE_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_REMOTE_ACTION_GROUP)) +#define G_REMOTE_ACTION_GROUP_GET_IFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), \ + G_TYPE_REMOTE_ACTION_GROUP, \ + GRemoteActionGroupInterface)) + +typedef struct _GRemoteActionGroupInterface GRemoteActionGroupInterface; + +struct _GRemoteActionGroupInterface +{ + GTypeInterface g_iface; + + void (* activate_action_full) (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *parameter, + GVariant *platform_data); + + void (* change_action_state_full) (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *value, + GVariant *platform_data); +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_remote_action_group_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +void g_remote_action_group_activate_action_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *parameter, + GVariant *platform_data); + +GLIB_AVAILABLE_IN_2_32 +void g_remote_action_group_change_action_state_full (GRemoteActionGroup *remote, + const gchar *action_name, + GVariant *value, + GVariant *platform_data); + +G_END_DECLS + +#endif /* __G_REMOTE_ACTION_GROUP_H__ */ diff --git a/gio/gresolver.c b/gio/gresolver.c new file mode 100644 index 0000000..589e324 --- /dev/null +++ b/gio/gresolver.c @@ -0,0 +1,858 @@ +/* -*- 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 "gsimpleasyncresult.h" +#include "gtask.h" +#include "gsrvtarget.h" +#include "gthreadedresolver.h" + +#ifdef G_OS_UNIX +#include +#endif + +#include + + +/** + * 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_WITH_CODE (GResolver, g_resolver, G_TYPE_OBJECT, + g_networking_init ();) + +static GList * +srv_records_to_targets (GList *records) +{ + const gchar *hostname; + guint16 port, priority, weight; + GSrvTarget *target; + GList *l; + + for (l = records; l != NULL; l = g_list_next (l)) + { + g_variant_get (l->data, "(qqq&s)", &priority, &weight, &port, &hostname); + target = g_srv_target_new (hostname, port, priority, weight); + g_variant_unref (l->data); + l->data = target; + } + + return g_srv_target_list_sort (records); +} + +static GList * +g_resolver_real_lookup_service (GResolver *resolver, + const gchar *rrname, + GCancellable *cancellable, + GError **error) +{ + GList *records; + + records = G_RESOLVER_GET_CLASS (resolver)->lookup_records (resolver, + rrname, + G_RESOLVER_RECORD_SRV, + cancellable, + error); + + return srv_records_to_targets (records); +} + +static void +g_resolver_real_lookup_service_async (GResolver *resolver, + const gchar *rrname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + G_RESOLVER_GET_CLASS (resolver)->lookup_records_async (resolver, + rrname, + G_RESOLVER_RECORD_SRV, + cancellable, + callback, + user_data); +} + +static GList * +g_resolver_real_lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + GList *records; + + records = G_RESOLVER_GET_CLASS (resolver)->lookup_records_finish (resolver, + result, + error); + + return srv_records_to_targets (records); +} + +static void +g_resolver_class_init (GResolverClass *resolver_class) +{ + /* Automatically pass these over to the lookup_records methods */ + resolver_class->lookup_service = g_resolver_real_lookup_service; + resolver_class->lookup_service_async = g_resolver_real_lookup_service_async; + resolver_class->lookup_service_finish = g_resolver_real_lookup_service_finish; + + g_type_class_add_private (resolver_class, sizeof (GResolverPrivate)); + + /** + * 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 it should allocate for concurrent DNS resolutions. + * + * Return value: (transfer full): the default #GResolver. + * + * Since: 2.22 + */ +GResolver * +g_resolver_get_default (void) +{ + if (!default_resolver) + default_resolver = g_object_new (G_TYPE_THREADED_RESOLVER, NULL); + + 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 +} + +/* filter out duplicates, cf. https://bugzilla.gnome.org/show_bug.cgi?id=631379 */ +static void +remove_duplicates (GList *addrs) +{ + GList *l; + GList *ll; + GList *lll; + + /* TODO: if this is too slow (it's O(n^2) but n is typically really + * small), we can do something more clever but note that we must not + * change the order of elements... + */ + for (l = addrs; l != NULL; l = l->next) + { + GInetAddress *address = G_INET_ADDRESS (l->data); + for (ll = l->next; ll != NULL; ll = lll) + { + GInetAddress *other_address = G_INET_ADDRESS (ll->data); + lll = ll->next; + if (g_inet_address_equal (address, other_address)) + { + g_object_unref (other_address); + /* we never return the first element */ + g_warn_if_fail (g_list_delete_link (addrs, ll) == addrs); + } + } + } +} + + +/** + * g_resolver_lookup_by_name: + * @resolver: a #GResolver + * @hostname: the hostname to look up + * @cancellable: (allow-none): 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 and guaranteed to not + * contain duplicates. That is, if using the result to connect to + * @hostname, you should attempt to connect to the first address + * first, then the second if the first fails, etc. If you are using + * the result to listen on a socket, it is appropriate to add each + * result using e.g. g_socket_listener_add_address(). + * + * 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: (element-type GInetAddress) (transfer full): 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); + + remove_duplicates (addrs); + + 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: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): callback to call after resolution completes + * @user_data: (closure): 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) + { + GTask *task; + + task = g_task_new (resolver, cancellable, callback, user_data); + g_task_set_source_tag (task, g_resolver_lookup_by_name_async); + g_task_return_pointer (task, g_list_append (NULL, addr), + (GDestroyNotify) g_resolver_free_addresses); + g_object_unref (task); + 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: (element-type GInetAddress) (transfer full): 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) +{ + GList *addrs; + + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + + if (g_async_result_legacy_propagate_error (result, error)) + return NULL; + else if (g_async_result_is_tagged (result, g_resolver_lookup_by_name_async)) + { + /* Handle the stringified-IP-addr case */ + return g_task_propagate_pointer (G_TASK (result), error); + } + + addrs = G_RESOLVER_GET_CLASS (resolver)-> + lookup_by_name_finish (resolver, result, error); + + remove_duplicates (addrs); + + return addrs; +} + +/** + * g_resolver_free_addresses: (skip) + * @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: (allow-none): 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: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): callback to call after resolution completes + * @user_data: (closure): 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_async_result_legacy_propagate_error (result, 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: (allow-none): 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: (element-type GSrvTarget) (transfer full): 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: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): callback to call after resolution completes + * @user_data: (closure): 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: (element-type GSrvTarget) (transfer full): 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_async_result_legacy_propagate_error (result, error)) + return NULL; + + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_service_finish (resolver, result, error); +} + +/** + * g_resolver_free_targets: (skip) + * @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_lookup_records: + * @resolver: a #GResolver + * @rrname: the DNS name to lookup the record for + * @record_type: the type of DNS record to lookup + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: return location for a #GError, or %NULL + * + * Synchronously performs a DNS record lookup for the given @rrname and returns + * a list of records as #GVariant tuples. See #GResolverRecordType for + * information on what the records contain for each @record_type. + * + * 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: (element-type GVariant) (transfer full): a #GList of #GVariant, + * or %NULL on error. You must free each of the records and the list when you are + * done with it. (You can use g_list_free_full() with g_variant_unref() to do this.) + * + * Since: 2.34 + */ +GList * +g_resolver_lookup_records (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GError **error) +{ + GList *records; + + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + g_return_val_if_fail (rrname != NULL, NULL); + + g_resolver_maybe_reload (resolver); + records = G_RESOLVER_GET_CLASS (resolver)-> + lookup_records (resolver, rrname, record_type, cancellable, error); + + return records; +} + +/** + * g_resolver_lookup_records_async: + * @resolver: a #GResolver + * @rrname: the DNS name to lookup the record for + * @record_type: the type of DNS record to lookup + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): callback to call after resolution completes + * @user_data: (closure): data for @callback + * + * Begins asynchronously performing a DNS lookup for the given + * @rrname, and eventually calls @callback, which must call + * g_resolver_lookup_records_finish() to get the final result. See + * g_resolver_lookup_records() for more details. + * + * Since: 2.34 + */ +void +g_resolver_lookup_records_async (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_RESOLVER (resolver)); + g_return_if_fail (rrname != NULL); + + g_resolver_maybe_reload (resolver); + G_RESOLVER_GET_CLASS (resolver)-> + lookup_records_async (resolver, rrname, record_type, cancellable, callback, user_data); +} + +/** + * g_resolver_lookup_records_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_records_async(). Returns a list of records as #GVariant + * tuples. See #GResolverRecordType for information on what the records contain. + * + * 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: (element-type GVariant) (transfer full): a #GList of #GVariant, + * or %NULL on error. You must free each of the records and the list when you are + * done with it. (You can use g_list_free_full() with g_variant_unref() to do this.) + * + * Since: 2.34 + */ +GList * +g_resolver_lookup_records_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_RESOLVER (resolver), NULL); + return G_RESOLVER_GET_CLASS (resolver)-> + lookup_records_finish (resolver, result, error); +} + +/** + * g_resolver_error_quark: + * + * Gets the #GResolver Error Quark. + * + * Return value: a #GQuark. + * + * Since: 2.22 + */ +G_DEFINE_QUARK (g-resolver-error-quark, g_resolver_error) diff --git a/gio/gresolver.h b/gio/gresolver.h new file mode 100644 index 0000000..454896c --- /dev/null +++ b/gio/gresolver.h @@ -0,0 +1,214 @@ +/* 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_RESOLVER_H__ +#define __G_RESOLVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); + + GList * ( *lookup_records) (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GError **error); + + void ( *lookup_records_async) (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GList * ( *lookup_records_finish) (GResolver *resolver, + GAsyncResult *result, + GError **error); + + /* Padding for future expansion */ + void (*_g_reserved4) (void); + void (*_g_reserved5) (void); + void (*_g_reserved6) (void); + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_resolver_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GResolver *g_resolver_get_default (void); +GLIB_AVAILABLE_IN_ALL +void g_resolver_set_default (GResolver *resolver); + +GLIB_AVAILABLE_IN_ALL +GList *g_resolver_lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_resolver_lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GList *g_resolver_lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_resolver_free_addresses (GList *addresses); + +GLIB_AVAILABLE_IN_ALL +gchar *g_resolver_lookup_by_address (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_resolver_lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gchar *g_resolver_lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GList *g_resolver_lookup_service (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_resolver_lookup_service_async (GResolver *resolver, + const gchar *service, + const gchar *protocol, + const gchar *domain, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GList *g_resolver_lookup_service_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_2_34 +GList *g_resolver_lookup_records (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_34 +void g_resolver_lookup_records_async (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +GList *g_resolver_lookup_records_finish (GResolver *resolver, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +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 ()) +GLIB_AVAILABLE_IN_ALL +GQuark g_resolver_error_quark (void); + +G_END_DECLS + +#endif /* __G_RESOLVER_H__ */ diff --git a/gio/gresource-tool.c b/gio/gresource-tool.c new file mode 100644 index 0000000..d4e5699 --- /dev/null +++ b/gio/gresource-tool.c @@ -0,0 +1,645 @@ +/* + * Copyright © 2012 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 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: Matthias Clasen + */ + +#include "config.h" + +#include +#include + +#include +#include +#include +#include +#include + +#ifdef HAVE_LIBELF +#include +#include +#include +#endif + +#include +#include +#include + +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + +/* GResource functions {{{1 */ +static GResource * +get_resource (const gchar *file) +{ + gchar *content; + gsize size; + GResource *resource; + GBytes *data; + + resource = NULL; + + if (g_file_get_contents (file, &content, &size, NULL)) + { + data = g_bytes_new_take (content, size); + resource = g_resource_new_from_data (data, NULL); + g_bytes_unref (data); + } + + return resource; +} + +static void +list_resource (GResource *resource, + const gchar *path, + const gchar *section, + const gchar *prefix, + gboolean details) +{ + gchar **children; + gsize size; + guint32 flags; + gint i; + gchar *child; + GError *error = NULL; + gint len; + + children = g_resource_enumerate_children (resource, path, 0, &error); + if (error) + { + g_printerr ("%s\n", error->message); + g_error_free (error); + return; + } + for (i = 0; children[i]; i++) + { + child = g_strconcat (path, children[i], NULL); + + len = MIN (strlen (child), strlen (prefix)); + if (strncmp (child, prefix, len) != 0) + continue; + + if (g_resource_get_info (resource, child, 0, &size, &flags, NULL)) + { + if (details) + g_print ("%s%s%6"G_GSIZE_FORMAT " %s %s\n", section, section[0] ? " " : "", size, flags & G_RESOURCE_FLAGS_COMPRESSED ? "c" : "u", child); + else + g_print ("%s\n", child); + } + else + list_resource (resource, child, section, prefix, details); + + g_free (child); + } + g_strfreev (children); +} + +static void +extract_resource (GResource *resource, + const gchar *path) +{ + GBytes *bytes; + + bytes = g_resource_lookup_data (resource, path, 0, NULL); + if (bytes != NULL) + { + gconstpointer data; + gsize size, written; + + data = g_bytes_get_data (bytes, &size); + written = fwrite (data, 1, size, stdout); + if (written < size) + g_printerr ("Data truncated\n"); + g_bytes_unref (bytes); + } + else + { + g_printerr ("Can't find resource path %s\n", path); + } +} + +/* Elf functions {{{1 */ + +#ifdef HAVE_LIBELF + +static Elf * +get_elf (const gchar *file, + gint *fd) +{ + Elf *elf; + + if (elf_version (EV_CURRENT) == EV_NONE ) + return NULL; + + *fd = g_open (file, O_RDONLY, 0); + if (*fd < 0) + return NULL; + + elf = elf_begin (*fd, ELF_C_READ, NULL); + if (elf == NULL) + return NULL; + + if (elf_kind (elf) != ELF_K_ELF) + return NULL; + + return elf; +} + +typedef gboolean (*SectionCallback) (GElf_Shdr *shdr, + const gchar *name, + gpointer data); + +static void +elf_foreach_resource_section (Elf *elf, + SectionCallback callback, + gpointer data) +{ + size_t shstrndx, shnum; + size_t scnidx; + Elf_Scn *scn; + GElf_Shdr *shdr, shdr_mem; + const gchar *section_name; + + elf_getshdrstrndx (elf, &shstrndx); + g_assert (shstrndx >= 0); + + elf_getshdrnum (elf, &shnum); + g_assert (shnum >= 0); + + for (scnidx = 1; scnidx < shnum; scnidx++) + { + scn = elf_getscn (elf, scnidx); + if (scn == NULL) + continue; + + shdr = gelf_getshdr (scn, &shdr_mem); + if (shdr == NULL) + continue; + + if (shdr->sh_type != SHT_PROGBITS) + continue; + + section_name = elf_strptr (elf, shstrndx, shdr->sh_name); + if (section_name == NULL || + !g_str_has_prefix (section_name, ".gresource.")) + continue; + + if (!callback (shdr, section_name + strlen (".gresource."), data)) + break; + } +} + +static GResource * +resource_from_section (GElf_Shdr *shdr, + int fd) +{ + gsize page_size, page_offset; + char *contents; + GResource *resource; + + resource = NULL; + + page_size = sysconf(_SC_PAGE_SIZE); + page_offset = shdr->sh_offset % page_size; + contents = mmap (NULL, shdr->sh_size + page_offset, + PROT_READ, MAP_PRIVATE, fd, shdr->sh_offset - page_offset); + if (contents != MAP_FAILED) + { + GBytes *bytes; + + bytes = g_bytes_new_static (contents + page_offset, shdr->sh_size); + resource = g_resource_new_from_data (bytes, NULL); + g_bytes_unref (bytes); + } + else + { + g_printerr ("Can't mmap resource section"); + } + + return resource; +} + +typedef struct +{ + int fd; + const gchar *section; + const gchar *path; + gboolean details; + gboolean found; +} CallbackData; + +static gboolean +list_resources_cb (GElf_Shdr *shdr, + const gchar *section, + gpointer data) +{ + CallbackData *d = data; + GResource *resource; + + if (d->section && strcmp (section, d->section) != 0) + return TRUE; + + d->found = TRUE; + + resource = resource_from_section (shdr, d->fd); + list_resource (resource, "/", + d->section ? "" : section, + d->path, + d->details); + g_resource_unref (resource); + + if (d->section) + return FALSE; + + return TRUE; +} + +static void +elf_list_resources (Elf *elf, + int fd, + const gchar *section, + const gchar *path, + gboolean details) +{ + CallbackData data; + + data.fd = fd; + data.section = section; + data.path = path; + data.details = details; + data.found = FALSE; + + elf_foreach_resource_section (elf, list_resources_cb, &data); + + if (!data.found) + g_printerr ("Can't find resource section %s\n", section); +} + +static gboolean +extract_resource_cb (GElf_Shdr *shdr, + const gchar *section, + gpointer data) +{ + CallbackData *d = data; + GResource *resource; + + if (d->section && strcmp (section, d->section) != 0) + return TRUE; + + d->found = TRUE; + + resource = resource_from_section (shdr, d->fd); + extract_resource (resource, d->path); + g_resource_unref (resource); + + return FALSE; +} + +static void +elf_extract_resource (Elf *elf, + int fd, + const gchar *section, + const gchar *path) +{ + CallbackData data; + + data.fd = fd; + data.section = section; + data.path = path; + data.found = FALSE; + + elf_foreach_resource_section (elf, extract_resource_cb, &data); + + if (!data.found) + g_printerr ("Can't find resource section %s\n", section); +} + +static gboolean +print_section_name (GElf_Shdr *shdr, + const gchar *name, + gpointer data) +{ + g_print ("%s\n", name); + return TRUE; +} + +#endif /* HAVE_LIBELF */ + + /* Toplevel commands {{{1 */ + +static void +cmd_sections (const gchar *file, + const gchar *section, + const gchar *path, + gboolean details) +{ + GResource *resource; + +#ifdef HAVE_LIBELF + + Elf *elf; + gint fd; + + if ((elf = get_elf (file, &fd))) + { + elf_foreach_resource_section (elf, print_section_name, NULL); + elf_end (elf); + close (fd); + } + else + +#endif + + if ((resource = get_resource (file))) + { + /* No sections */ + g_resource_unref (resource); + } + else + { + g_printerr ("Don't know how to handle %s\n", file); +#ifndef HAVE_LIBELF + g_printerr ("gresource is built without elf support\n"); +#endif + } +} + +static void +cmd_list (const gchar *file, + const gchar *section, + const gchar *path, + gboolean details) +{ + GResource *resource; + +#ifdef HAVE_LIBELF + + Elf *elf; + int fd; + + if ((elf = get_elf (file, &fd))) + { + elf_list_resources (elf, fd, section, path ? path : "", details); + elf_end (elf); + close (fd); + } + else + +#endif + + if ((resource = get_resource (file))) + { + list_resource (resource, "/", "", path ? path : "", details); + g_resource_unref (resource); + } + else + { + g_printerr ("Don't know how to handle %s\n", file); +#ifndef HAVE_LIBELF + g_printerr ("gresource is built without elf support\n"); +#endif + } +} + +static void +cmd_extract (const gchar *file, + const gchar *section, + const gchar *path, + gboolean details) +{ + GResource *resource; + +#ifdef HAVE_LIBELF + + Elf *elf; + int fd; + + if ((elf = get_elf (file, &fd))) + { + elf_extract_resource (elf, fd, section, path); + elf_end (elf); + close (fd); + } + else + +#endif + + if ((resource = get_resource (file))) + { + extract_resource (resource, path); + g_resource_unref (resource); + } + else + { + g_printerr ("Don't know how to handle %s\n", file); +#ifndef HAVE_LIBELF + g_printerr ("gresource is built without elf support\n"); +#endif + } +} + +static gint +cmd_help (gboolean requested, + const gchar *command) +{ + const gchar *description; + const gchar *synopsis; + gchar *option; + GString *string; + + option = NULL; + + string = g_string_new (NULL); + + if (command == NULL) + ; + + else if (strcmp (command, "help") == 0) + { + description = _("Print help"); + synopsis = _("[COMMAND]"); + } + + else if (strcmp (command, "sections") == 0) + { + description = _("List sections containing resources in an elf FILE"); + synopsis = _("FILE"); + } + + else if (strcmp (command, "list") == 0) + { + description = _("List resources\n" + "If SECTION is given, only list resources in this section\n" + "If PATH is given, only list matching resources"); + synopsis = _("FILE [PATH]"); + option = g_strdup_printf ("[--section %s]", _("SECTION")); + } + + else if (strcmp (command, "details") == 0) + { + description = _("List resources with details\n" + "If SECTION is given, only list resources in this section\n" + "If PATH is given, only list matching resources\n" + "Details include the section, size and compression"); + synopsis = _("FILE [PATH]"); + option = g_strdup_printf ("[--section %s]", _("SECTION")); + } + + else if (strcmp (command, "extract") == 0) + { + description = _("Extract a resource file to stdout"); + synopsis = _("FILE PATH"); + option = g_strdup_printf ("[--section %s]", _("SECTION")); + } + + else + { + g_string_printf (string, _("Unknown command %s\n\n"), command); + requested = FALSE; + command = NULL; + } + + if (command == NULL) + { + g_string_append (string, + _("Usage:\n" + " gresource [--section SECTION] COMMAND [ARGS...]\n" + "\n" + "Commands:\n" + " help Show this information\n" + " sections List resource sections\n" + " list List resources\n" + " details List resources with details\n" + " extract Extract a resource\n" + "\n" + "Use 'gresource help COMMAND' to get detailed help.\n\n")); + } + else + { + g_string_append_printf (string, _("Usage:\n gresource %s%s%s %s\n\n%s\n\n"), + option ? option : "", option ? " " : "", command, synopsis[0] ? synopsis : "", description); + + g_string_append (string, _("Arguments:\n")); + + if (option) + g_string_append (string, + _(" SECTION An (optional) elf section name\n")); + + if (strstr (synopsis, _("[COMMAND]"))) + g_string_append (string, + _(" COMMAND The (optional) command to explain\n")); + + if (strstr (synopsis, _("FILE"))) + { + if (strcmp (command, "sections") == 0) + g_string_append (string, + _(" FILE An elf file (a binary or a shared library)\n")); + else + g_string_append (string, + _(" FILE An elf file (a binary or a shared library)\n" + " or a compiled resource file\n")); + } + + if (strstr (synopsis, _("[PATH]"))) + g_string_append (string, + _(" PATH An (optional) resource path (may be partial)\n")); + else if (strstr (synopsis, _("PATH"))) + g_string_append (string, + _(" PATH A resource path\n")); + + g_string_append (string, "\n"); + } + + if (requested) + g_print ("%s", string->str); + else + g_printerr ("%s\n", string->str); + + g_free (option); + g_string_free (string, TRUE); + + return requested ? 0 : 1; +} + +/* main {{{1 */ + +int +main (int argc, char *argv[]) +{ + gchar *section = NULL; + gboolean details = FALSE; + void (* function) (const gchar *, const gchar *, const gchar *, gboolean); + +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + 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 + + if (argc < 2) + return cmd_help (FALSE, NULL); + + if (argc > 3 && strcmp (argv[1], "--section") == 0) + { + section = argv[2]; + argv = argv + 2; + argc -= 2; + } + + if (strcmp (argv[1], "help") == 0) + return cmd_help (TRUE, argv[2]); + + else if (argc == 4 && strcmp (argv[1], "extract") == 0) + function = cmd_extract; + + else if (argc == 3 && strcmp (argv[1], "sections") == 0) + function = cmd_sections; + + else if ((argc == 3 || argc == 4) && strcmp (argv[1], "list") == 0) + { + function = cmd_list; + details = FALSE; + } + else if ((argc == 3 || argc == 4) && strcmp (argv[1], "details") == 0) + { + function = cmd_list; + details = TRUE; + } + else + return cmd_help (FALSE, argv[1]); + + (* function) (argv[2], section, argc > 3 ? argv[3] : NULL, details); + + return 0; +} + +/* vim:set foldmethod=marker: */ diff --git a/gio/gresource.c b/gio/gresource.c new file mode 100644 index 0000000..ad40a78 --- /dev/null +++ b/gio/gresource.c @@ -0,0 +1,1028 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2011 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 + */ + +#include "config.h" + +#include + +#include "gresource.h" +#include +#include +#include +#include +#include + +struct _GResource +{ + int ref_count; + + GvdbTable *table; +}; + +static void register_lazy_static_resources (void); + +G_DEFINE_BOXED_TYPE (GResource, g_resource, g_resource_ref, g_resource_unref) + +/** + * SECTION:gresource + * @short_description: Resource framework + * @include: gio/gio.h + * + * Applications and libraries often contain binary or textual data that is really part of the + * application, rather than user data. For instance #GtkBuilder .ui files, splashscreen images, + * GMenu markup xml, CSS files, icons, etc. These are often shipped as files in $datadir/appname, or + * manually included as literal strings in the code. + * + * The #GResource API and the glib-compile-resources program + * provide a convenient and efficient alternative to this which has some nice properties. You + * maintain the files as normal files, so its easy to edit them, but during the build the files + * are combined into a binary bundle that is linked into the executable. This means that loading + * the resource files are efficient (as they are already in memory, shared with other instances) and + * simple (no need to check for things like I/O errors or locate the files in the filesystem). It + * also makes it easier to create relocatable applications. + * + * Resource files can also be marked as compressed. Such files will be included in the resource bundle + * in a compressed form, but will be automatically uncompressed when the resource is used. This + * is very useful e.g. for larger text files that are parsed once (or rarely) and then thrown away. + * + * Resource files can also be marked to be preprocessed, by setting the value of the + * preprocess attribute to a comma-separated list of preprocessing options. + * The only options currently supported are: + * + * xml-stripblanks which will use xmllint to strip + * ignorable whitespace from the xml file. For this to work, the XMLLINT + * environment variable must be set to the full path to the xmllint executable, or xmllint + * must be in the PATH; otherwise the preprocessing step is skipped. + * + * to-pixdata which will use gdk-pixbuf-pixdata to convert + * images to the GdkPixdata format, which allows you to create pixbufs directly using the data inside + * the resource file, rather than an (uncompressed) copy if it. For this, the gdk-pixbuf-pixdata + * program must be in the PATH, or the GDK_PIXBUF_PIXDATA environment variable must be + * set to the full path to the gdk-pixbuf-pixdata executable; otherwise the resource compiler will + * abort. + * + * Resource bundles are created by the glib-compile-resources program + * which takes an xml file that describes the bundle, and a set of files that the xml references. These + * are combined into a binary resource bundle. + * + * Example resource description + * + * + * + * data/splashscreen.png + * dialog.ui + * menumarkup.xml + * + * + * ]]> + * + * This will create a resource bundle with the following files: + * + * + * Note that all resources in the process share the same namespace, so use java-style + * path prefixes (like in the above example) to avoid conflicts. + * + * You can then use glib-compile-resources to compile the xml to a + * binary bundle that you can load with g_resource_load(). However, its more common to use the --generate-source and + * --generate-header arguments to create a source file and header to link directly into your application. + * + * Once a #GResource has been created and registered all the data in it can be accessed globally in the process by + * using API calls like g_resources_open_stream() to stream the data or g_resources_lookup_data() to get a direct pointer + * to the data. You can also use uris like "resource:///org/gtk/Example/data/splashscreen.png" with #GFile to access + * the resource data. + * + * There are two forms of the generated source, the default version uses the compiler support for constructor + * and destructor functions (where available) to automatically create and register the #GResource on startup + * or library load time. If you pass --manual-register two functions to register/unregister the resource is instead + * created. This requires an explicit initialization call in your application/library, but it works on all platforms, + * even on the minor ones where this is not available. (Constructor support is available for at least Win32, MacOS and Linux.) + * + * Note that resource data can point directly into the data segment of e.g. a library, so if you are unloading libraries + * during runtime you need to be very careful with keeping around pointers to data from a resource, as this goes away + * when the library is unloaded. However, in practice this is not generally a problem, since most resource accesses + * is for your own resources, and resource data is often used once, during parsing, and then released. + * + * Since: 2.32 + */ + +/** + * g_resource_error_quark: + * + * Gets the #GResource Error Quark. + * + * Return value: a #GQuark + * + * Since: 2.32 + */ +G_DEFINE_QUARK (g-resource-error-quark, g_resource_error) + +/** + * g_resource_ref: + * @resource: A #GResource + * + * 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 #GResource + * + * Since: 2.32 + **/ +GResource * +g_resource_ref (GResource *resource) +{ + g_atomic_int_inc (&resource->ref_count); + return resource; +} + +/** + * g_resource_unref: + * @resource: A #GResource + * + * Atomically decrements the reference count of @resource 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.32 + **/ +void +g_resource_unref (GResource *resource) +{ + if (g_atomic_int_dec_and_test (&resource->ref_count)) + { + gvdb_table_unref (resource->table); + g_free (resource); + } +} + +/* + * g_resource_new_from_table: + * @table: (transfer full): a GvdbTable + * + * Returns: (transfer full): a new #GResource for @table + */ +static GResource * +g_resource_new_from_table (GvdbTable *table) +{ + GResource *resource; + + resource = g_new (GResource, 1); + resource->ref_count = 1; + resource->table = table; + + return resource; +} + +/** + * g_resource_new_from_data: + * @data: A #GBytes + * @error: return location for a #GError, or %NULL + * + * Creates a GResource from a reference to the binary resource bundle. + * This will keep a reference to @data while the resource lives, so + * the data should not be modified or freed. + * + * If you want to use this resource in the global resource namespace you need + * to register it with g_resources_register(). + * + * Return value: (transfer full): a new #GResource, or %NULL on error + * + * Since: 2.32 + **/ +GResource * +g_resource_new_from_data (GBytes *data, + GError **error) +{ + GvdbTable *table; + + table = gvdb_table_new_from_data (g_bytes_get_data (data, NULL), + g_bytes_get_size (data), + TRUE, + g_bytes_ref (data), + (GvdbRefFunc)g_bytes_ref, + (GDestroyNotify)g_bytes_unref, + error); + + if (table == NULL) + return NULL; + + return g_resource_new_from_table (table); +} + +/** + * g_resource_load: + * @filename: (type filename): the path of a filename to load, in the GLib filename encoding + * @error: return location for a #GError, or %NULL + * + * Loads a binary resource bundle and creates a #GResource representation of it, allowing + * you to query it for data. + * + * If you want to use this resource in the global resource namespace you need + * to register it with g_resources_register(). + * + * Return value: (transfer full): a new #GResource, or %NULL on error + * + * Since: 2.32 + **/ +GResource * +g_resource_load (const gchar *filename, + GError **error) +{ + GvdbTable *table; + + table = gvdb_table_new (filename, FALSE, error); + if (table == NULL) + return NULL; + + return g_resource_new_from_table (table); +} + +static +gboolean do_lookup (GResource *resource, + const gchar *path, + GResourceLookupFlags lookup_flags, + gsize *size, + guint32 *flags, + const void **data, + gsize *data_size, + GError **error) +{ + char *free_path = NULL; + gsize path_len; + gboolean res = FALSE; + GVariant *value; + + path_len = strlen (path); + if (path[path_len-1] == '/') + { + path = free_path = g_strdup (path); + free_path[path_len-1] = 0; + } + + value = gvdb_table_get_raw_value (resource->table, path); + + if (value == NULL) + { + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + } + else + { + guint32 _size, _flags; + GVariant *array; + + g_variant_get (value, "(uu@ay)", + &_size, + &_flags, + &array); + + _size = GUINT32_FROM_LE (_size); + _flags = GUINT32_FROM_LE (_flags); + + if (size) + *size = _size; + if (flags) + *flags = _flags; + if (data) + *data = g_variant_get_data (array); + if (data_size) + { + /* Don't report trailing newline that non-compressed files has */ + if (_flags & G_RESOURCE_FLAGS_COMPRESSED) + *data_size = g_variant_get_size (array); + else + *data_size = g_variant_get_size (array) - 1; + } + g_variant_unref (array); + g_variant_unref (value); + + res = TRUE; + } + + g_free (free_path); + return res; +} + +/** + * g_resource_open_stream: + * @resource: A #GResource + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the resource and + * returns a #GInputStream that lets you read the data. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (transfer full): #GInputStream or %NULL on error. + * Free the returned object with g_object_unref() + * + * Since: 2.32 + **/ +GInputStream * +g_resource_open_stream (GResource *resource, + const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + const void *data; + gsize data_size; + guint32 flags; + GInputStream *stream, *stream2; + + if (!do_lookup (resource, path, lookup_flags, NULL, &flags, &data, &data_size, error)) + return NULL; + + stream = g_memory_input_stream_new_from_data (data, data_size, NULL); + g_object_set_data_full (G_OBJECT (stream), "g-resource", + g_resource_ref (resource), + (GDestroyNotify)g_resource_unref); + + if (flags & G_RESOURCE_FLAGS_COMPRESSED) + { + GZlibDecompressor *decompressor = + g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_ZLIB); + + stream2 = g_converter_input_stream_new (stream, G_CONVERTER (decompressor)); + g_object_unref (decompressor); + g_object_unref (stream); + stream = stream2; + } + + return stream; +} + +/** + * g_resource_lookup_data: + * @resource: A #GResource + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the resource and + * returns a #GBytes that lets you directly access the data in + * memory. + * + * The data is always followed by a zero byte, so you + * can safely use the data as a C string. However, that byte + * is not included in the size of the GBytes. + * + * For uncompressed resource files this is a pointer directly into + * the resource bundle, which is typically in some readonly data section + * in the program binary. For compressed files we allocate memory on + * the heap and automatically uncompress the data. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (transfer full): #GBytes or %NULL on error. + * Free the returned object with g_bytes_unref() + * + * Since: 2.32 + **/ +GBytes * +g_resource_lookup_data (GResource *resource, + const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + const void *data; + guint32 flags; + gsize data_size; + gsize size; + + if (!do_lookup (resource, path, lookup_flags, &size, &flags, &data, &data_size, error)) + return NULL; + + if (flags & G_RESOURCE_FLAGS_COMPRESSED) + { + char *uncompressed, *d; + const char *s; + GConverterResult res; + gsize d_size, s_size; + gsize bytes_read, bytes_written; + + + GZlibDecompressor *decompressor = + g_zlib_decompressor_new (G_ZLIB_COMPRESSOR_FORMAT_ZLIB); + + uncompressed = g_malloc (size + 1); + + s = data; + s_size = data_size; + d = uncompressed; + d_size = size; + + do + { + res = g_converter_convert (G_CONVERTER (decompressor), + s, s_size, + d, d_size, + G_CONVERTER_INPUT_AT_END, + &bytes_read, + &bytes_written, + NULL); + if (res == G_CONVERTER_ERROR) + { + g_free (uncompressed); + g_object_unref (decompressor); + + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_INTERNAL, + _("The resource at '%s' failed to decompress"), + path); + return NULL; + + } + s += bytes_read; + s_size -= bytes_read; + d += bytes_written; + d_size -= bytes_written; + } + while (res != G_CONVERTER_FINISHED); + + uncompressed[size] = 0; /* Zero terminate */ + + g_object_unref (decompressor); + + return g_bytes_new_take (uncompressed, size); + } + else + return g_bytes_new_with_free_func (data, data_size, (GDestroyNotify)g_resource_unref, g_resource_ref (resource)); +} + +/** + * g_resource_get_info: + * @resource: A #GResource + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @size: (out) (allow-none): a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @flags: (out) (allow-none): a location to place the flags about the file, + * or %NULL if the length is not needed + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the resource and + * if found returns information about it. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: %TRUE if the file was found. %FALSE if there were errors + * + * Since: 2.32 + **/ +gboolean +g_resource_get_info (GResource *resource, + const gchar *path, + GResourceLookupFlags lookup_flags, + gsize *size, + guint32 *flags, + GError **error) +{ + return do_lookup (resource, path, lookup_flags, size, flags, NULL, NULL, error); +} + +/** + * g_resource_enumerate_children: + * @resource: A #GResource + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Returns all the names of children at the specified @path in the resource. + * The return result is a %NULL terminated list of strings which should + * be released with g_strfreev(). + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (array zero-terminated=1) (transfer full): an array of constant strings + * + * Since: 2.32 + **/ +gchar ** +g_resource_enumerate_children (GResource *resource, + const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + gchar **children; + gsize path_len; + char *path_with_slash; + + if (*path == 0) + { + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + return NULL; + } + + path_len = strlen (path); + if (path[path_len-1] != '/') + path_with_slash = g_strconcat (path, "/", NULL); + else + path_with_slash = g_strdup (path); + + children = gvdb_table_list (resource->table, path_with_slash); + g_free (path_with_slash); + + if (children == NULL) + { + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + return NULL; + } + + return children; +} + +static GRWLock resources_lock; +static GList *registered_resources; + +/* This is updated atomically, so we can append to it and check for NULL outside the + lock, but all other accesses are done under the write lock */ +static GStaticResource *lazy_register_resources; + +static void +g_resources_register_unlocked (GResource *resource) +{ + registered_resources = g_list_prepend (registered_resources, g_resource_ref (resource)); +} + +static void +g_resources_unregister_unlocked (GResource *resource) +{ + if (g_list_find (registered_resources, resource) == NULL) + { + g_warning ("Tried to remove not registered resource"); + } + else + { + registered_resources = g_list_remove (registered_resources, resource); + g_resource_unref (resource); + } +} + +/** + * g_resources_register: + * @resource: A #GResource + * + * Registers the resource with the process-global set of resources. + * Once a resource is registered the files in it can be accessed + * with the global resource lookup functions like g_resources_lookup_data(). + * + * Since: 2.32 + **/ +void +g_resources_register (GResource *resource) +{ + g_rw_lock_writer_lock (&resources_lock); + g_resources_register_unlocked (resource); + g_rw_lock_writer_unlock (&resources_lock); +} + +/** + * g_resources_unregister: + * @resource: A #GResource + * + * Unregisters the resource from the process-global set of resources. + * + * Since: 2.32 + **/ +void +g_resources_unregister (GResource *resource) +{ + g_rw_lock_writer_lock (&resources_lock); + g_resources_unregister_unlocked (resource); + g_rw_lock_writer_unlock (&resources_lock); +} + +/** + * g_resources_open_stream: + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the set of + * globally registered resources and returns a #GInputStream + * that lets you read the data. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (transfer full): #GInputStream or %NULL on error. + * Free the returned object with g_object_unref() + * + * Since: 2.32 + **/ +GInputStream * +g_resources_open_stream (const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + GInputStream *res = NULL; + GList *l; + GInputStream *stream; + + register_lazy_static_resources (); + + g_rw_lock_reader_lock (&resources_lock); + + for (l = registered_resources; l != NULL; l = l->next) + { + GResource *r = l->data; + GError *my_error = NULL; + + stream = g_resource_open_stream (r, path, lookup_flags, &my_error); + if (stream == NULL && + g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) + { + g_clear_error (&my_error); + } + else + { + if (stream == NULL) + g_propagate_error (error, my_error); + res = stream; + break; + } + } + + if (l == NULL) + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + + g_rw_lock_reader_unlock (&resources_lock); + + return res; +} + +/** + * g_resources_lookup_data: + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the set of + * globally registered resources and returns a #GBytes that + * lets you directly access the data in memory. + * + * The data is always followed by a zero byte, so you + * can safely use the data as a C string. However, that byte + * is not included in the size of the GBytes. + * + * For uncompressed resource files this is a pointer directly into + * the resource bundle, which is typically in some readonly data section + * in the program binary. For compressed files we allocate memory on + * the heap and automatically uncompress the data. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (transfer full): #GBytes or %NULL on error. + * Free the returned object with g_bytes_unref() + * + * Since: 2.32 + **/ +GBytes * +g_resources_lookup_data (const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + GBytes *res = NULL; + GList *l; + GBytes *data; + + register_lazy_static_resources (); + + g_rw_lock_reader_lock (&resources_lock); + + for (l = registered_resources; l != NULL; l = l->next) + { + GResource *r = l->data; + GError *my_error = NULL; + + data = g_resource_lookup_data (r, path, lookup_flags, &my_error); + if (data == NULL && + g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) + { + g_clear_error (&my_error); + } + else + { + if (data == NULL) + g_propagate_error (error, my_error); + res = data; + break; + } + } + + if (l == NULL) + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + + g_rw_lock_reader_unlock (&resources_lock); + + return res; +} + +/** + * g_resources_enumerate_children: + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @error: return location for a #GError, or %NULL + * + * Returns all the names of children at the specified @path in the set of + * globally registered resources. + * The return result is a %NULL terminated list of strings which should + * be released with g_strfreev(). + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: (array zero-terminated=1) (transfer full): an array of constant strings + * + * Since: 2.32 + **/ +gchar ** +g_resources_enumerate_children (const gchar *path, + GResourceLookupFlags lookup_flags, + GError **error) +{ + GHashTable *hash = NULL; + GList *l; + char **children; + int i; + + register_lazy_static_resources (); + + g_rw_lock_reader_lock (&resources_lock); + + for (l = registered_resources; l != NULL; l = l->next) + { + GResource *r = l->data; + + children = g_resource_enumerate_children (r, path, 0, NULL); + + if (children != NULL) + { + if (hash == NULL) + hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + for (i = 0; children[i] != NULL; i++) + g_hash_table_insert (hash, children[i], children[i]); + g_free (children); + } + } + + g_rw_lock_reader_unlock (&resources_lock); + + if (hash == NULL) + { + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + return NULL; + } + else + { + GHashTableIter iter; + const char *key; + guint n_children; + n_children = g_hash_table_size (hash); + children = g_new (char *, n_children + 1); + i = 0; + + g_hash_table_iter_init (&iter, hash); + while (g_hash_table_iter_next (&iter, (gpointer *)&key, NULL)) + children[i++] = g_strdup (key); + children[i++] = NULL; + + g_hash_table_destroy (hash); + + return children; + } +} + +/** + * g_resources_get_info: + * @path: A pathname inside the resource + * @lookup_flags: A #GResourceLookupFlags + * @size: (out) (allow-none): a location to place the length of the contents of the file, + * or %NULL if the length is not needed + * @flags: (out) (allow-none): a location to place the flags about the file, + * or %NULL if the length is not needed + * @error: return location for a #GError, or %NULL + * + * Looks for a file at the specified @path in the set of + * globally registered resources and if found returns information about it. + * + * @lookup_flags controls the behaviour of the lookup. + * + * Returns: %TRUE if the file was found. %FALSE if there were errors + * + * Since: 2.32 + **/ +gboolean +g_resources_get_info (const gchar *path, + GResourceLookupFlags lookup_flags, + gsize *size, + guint32 *flags, + GError **error) +{ + gboolean res = FALSE; + GList *l; + gboolean r_res; + + register_lazy_static_resources (); + + g_rw_lock_reader_lock (&resources_lock); + + for (l = registered_resources; l != NULL; l = l->next) + { + GResource *r = l->data; + GError *my_error = NULL; + + r_res = g_resource_get_info (r, path, lookup_flags, size, flags, &my_error); + if (!r_res && + g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) + { + g_clear_error (&my_error); + } + else + { + if (!r_res) + g_propagate_error (error, my_error); + res = r_res; + break; + } + } + + if (l == NULL) + g_set_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + path); + + g_rw_lock_reader_unlock (&resources_lock); + + return res; +} + +/* This code is to handle registration of resources very early, from a constructor. + * At that point we'd like to do minimal work, to avoid ordering issues. For instance, + * we're not allowed to use g_malloc, as the user need to be able to call g_mem_set_vtable + * before the first call to g_malloc. + * + * So, what we do at construction time is that we just register a static structure on + * a list of resources that need to be initialized, and then later, when doing any lookups + * in the global list of registered resources, or when getting a reference to the + * lazily initialized resource we lazily create and register all the GResources on + * the lazy list. + * + * To avoid having to use locks in the constructor, and having to grab the writer lock + * when checking the lazy registering list we update lazy_register_resources in + * a lock-less fashion (atomic prepend-only, atomic replace with NULL). However, all + * operations except: + * * check if there are any resources to lazily initialize + * * Add a static resource to the lazy init list + * Do use the full writer lock for protection. + */ + +static void +register_lazy_static_resources_unlocked (void) +{ + GStaticResource *list; + + do + list = lazy_register_resources; + while (!g_atomic_pointer_compare_and_exchange (&lazy_register_resources, list, NULL)); + + while (list != NULL) + { + GBytes *bytes = g_bytes_new_static (list->data, list->data_len); + GResource *resource = g_resource_new_from_data (bytes, NULL); + if (resource) + { + g_resources_register_unlocked (resource); + g_atomic_pointer_set (&list->resource, resource); + } + g_bytes_unref (bytes); + + list = list->next; + } +} + +static void +register_lazy_static_resources (void) +{ + if (g_atomic_pointer_get (&lazy_register_resources) == NULL) + return; + + g_rw_lock_writer_lock (&resources_lock); + register_lazy_static_resources_unlocked (); + g_rw_lock_writer_unlock (&resources_lock); +} + +/** + * g_static_resource_init: + * @static_resource: pointer to a static #GStaticResource + * + * Initializes a GResource from static data using a + * GStaticResource. + * + * This is normally used by code generated by + * glib-compile-resources + * and is not typically used by other code. + * + * Since: 2.32 + **/ +void +g_static_resource_init (GStaticResource *static_resource) +{ + gpointer next; + + do + { + next = lazy_register_resources; + static_resource->next = next; + } + while (!g_atomic_pointer_compare_and_exchange (&lazy_register_resources, next, static_resource)); +} + +/** + * g_static_resource_fini: + * @static_resource: pointer to a static #GStaticResource + * + * Finalized a GResource initialized by g_static_resource_init(). + * + * This is normally used by code generated by + * glib-compile-resources + * and is not typically used by other code. + * + * Since: 2.32 + **/ +void +g_static_resource_fini (GStaticResource *static_resource) +{ + GResource *resource; + + g_rw_lock_writer_lock (&resources_lock); + + register_lazy_static_resources_unlocked (); + + resource = g_atomic_pointer_get (&static_resource->resource); + if (resource) + { + g_atomic_pointer_set (&static_resource->resource, NULL); + g_resources_unregister_unlocked (resource); + g_resource_unref (resource); + } + + g_rw_lock_writer_unlock (&resources_lock); +} + +/** + * g_static_resource_get_resource: + * @static_resource: pointer to a static #GStaticResource + * + * Gets the GResource that was registered by a call to g_static_resource_init(). + * + * This is normally used by code generated by + * glib-compile-resources + * and is not typically used by other code. + * + * Return value: (transfer none): a #GResource + * + * Since: 2.32 + **/ +GResource * +g_static_resource_get_resource (GStaticResource *static_resource) +{ + register_lazy_static_resources (); + + return g_atomic_pointer_get (&static_resource->resource); +} diff --git a/gio/gresource.h b/gio/gresource.h new file mode 100644 index 0000000..2db343c --- /dev/null +++ b/gio/gresource.h @@ -0,0 +1,131 @@ +/* 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_RESOURCE_H__ +#define __G_RESOURCE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_TYPE_RESOURCE: + * + * The #GType for #GResource. + */ +#define G_TYPE_RESOURCE (g_resource_get_type ()) + + +/** + * G_RESOURCE_ERROR: + * + * Error domain for #GResource. Errors in this domain will be from the + * #GResourceError enumeration. See #GError for more information on + * error domains. + */ +#define G_RESOURCE_ERROR (g_resource_error_quark ()) +GLIB_AVAILABLE_IN_2_32 +GQuark g_resource_error_quark (void); + +typedef struct _GStaticResource GStaticResource; + +struct _GStaticResource { + const guint8 *data; + gsize data_len; + GResource *resource; + GStaticResource *next; + gpointer padding; +}; + +GLIB_AVAILABLE_IN_2_32 +GType g_resource_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_32 +GResource * g_resource_new_from_data (GBytes *data, + GError **error); +GLIB_AVAILABLE_IN_2_32 +GResource * g_resource_ref (GResource *resource); +GLIB_AVAILABLE_IN_2_32 +void g_resource_unref (GResource *resource); +GLIB_AVAILABLE_IN_2_32 +GResource * g_resource_load (const gchar *filename, + GError **error); +GLIB_AVAILABLE_IN_2_32 +GInputStream *g_resource_open_stream (GResource *resource, + const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +GBytes * g_resource_lookup_data (GResource *resource, + const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +char ** g_resource_enumerate_children (GResource *resource, + const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gboolean g_resource_get_info (GResource *resource, + const char *path, + GResourceLookupFlags lookup_flags, + gsize *size, + guint32 *flags, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +void g_resources_register (GResource *resource); +GLIB_AVAILABLE_IN_2_32 +void g_resources_unregister (GResource *resource); +GLIB_AVAILABLE_IN_2_32 +GInputStream *g_resources_open_stream (const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +GBytes * g_resources_lookup_data (const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +char ** g_resources_enumerate_children (const char *path, + GResourceLookupFlags lookup_flags, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gboolean g_resources_get_info (const char *path, + GResourceLookupFlags lookup_flags, + gsize *size, + guint32 *flags, + GError **error); + + +GLIB_AVAILABLE_IN_2_32 +void g_static_resource_init (GStaticResource *static_resource); +GLIB_AVAILABLE_IN_2_32 +void g_static_resource_fini (GStaticResource *static_resource); +GLIB_AVAILABLE_IN_2_32 +GResource *g_static_resource_get_resource (GStaticResource *static_resource); + +G_END_DECLS + +#endif /* __G_RESOURCE_H__ */ diff --git a/gio/gresourcefile.c b/gio/gresourcefile.c new file mode 100644 index 0000000..de26246 --- /dev/null +++ b/gio/gresourcefile.c @@ -0,0 +1,878 @@ +/* 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 "gresource.h" +#include "gresourcefile.h" +#include "gfileattribute.h" +#include +#include +#include "gfile.h" +#include "gseekable.h" +#include "gfileinputstream.h" +#include "gfileinfo.h" +#include "gfileenumerator.h" +#include "gcontenttype.h" +#include "gioerror.h" +#include +#include "glibintl.h" + +struct _GResourceFile +{ + GObject parent_instance; + + char *path; +}; + +struct _GResourceFileEnumerator +{ + GFileEnumerator parent; + + GFileAttributeMatcher *matcher; + char *path; + char *attributes; + GFileQueryInfoFlags flags; + int index; + + char **children; +}; + +struct _GResourceFileEnumeratorClass +{ + GFileEnumeratorClass parent_class; +}; + +typedef struct _GResourceFileEnumerator GResourceFileEnumerator; +typedef struct _GResourceFileEnumeratorClass GResourceFileEnumeratorClass; + +static void g_resource_file_file_iface_init (GFileIface *iface); + +static GFileAttributeInfoList *resource_writable_attributes = NULL; +static GFileAttributeInfoList *resource_writable_namespaces = NULL; + +static GType _g_resource_file_enumerator_get_type (void); + +#define G_TYPE_RESOURCE_FILE_ENUMERATOR (_g_resource_file_enumerator_get_type ()) +#define G_RESOURCE_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_RESOURCE_FILE_ENUMERATOR, GResourceFileEnumerator)) +#define G_RESOURCE_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_RESOURCE_FILE_ENUMERATOR, GResourceFileEnumeratorClass)) +#define G_IS_RESOURCE_FILE_ENUMERATOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_RESOURCE_FILE_ENUMERATOR)) +#define G_IS_RESOURCE_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_RESOURCE_FILE_ENUMERATOR)) +#define G_RESOURCE_FILE_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_RESOURCE_FILE_ENUMERATOR, GResourceFileEnumeratorClass)) + +#define G_TYPE_RESOURCE_FILE_INPUT_STREAM (_g_resource_file_input_stream_get_type ()) +#define G_RESOURCE_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_RESOURCE_FILE_INPUT_STREAM, GResourceFileInputStream)) +#define G_RESOURCE_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_RESOURCE_FILE_INPUT_STREAM, GResourceFileInputStreamClass)) +#define G_IS_RESOURCE_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_RESOURCE_FILE_INPUT_STREAM)) +#define G_IS_RESOURCE_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_RESOURCE_FILE_INPUT_STREAM)) +#define G_RESOURCE_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_RESOURCE_FILE_INPUT_STREAM, GResourceFileInputStreamClass)) + +typedef struct _GResourceFileInputStream GResourceFileInputStream; +typedef struct _GResourceFileInputStreamClass GResourceFileInputStreamClass; + +#define g_resource_file_get_type _g_resource_file_get_type +G_DEFINE_TYPE_WITH_CODE (GResourceFile, g_resource_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_FILE, + g_resource_file_file_iface_init)) + +#define g_resource_file_enumerator_get_type _g_resource_file_enumerator_get_type +G_DEFINE_TYPE (GResourceFileEnumerator, g_resource_file_enumerator, G_TYPE_FILE_ENUMERATOR); + +static GFileEnumerator *_g_resource_file_enumerator_new (GResourceFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error); + + +static GType _g_resource_file_input_stream_get_type (void) G_GNUC_CONST; + +static GFileInputStream *_g_resource_file_input_stream_new (GInputStream *stream, GFile *file); + + +static void +g_resource_file_finalize (GObject *object) +{ + GResourceFile *resource; + + resource = G_RESOURCE_FILE (object); + + g_free (resource->path); + + G_OBJECT_CLASS (g_resource_file_parent_class)->finalize (object); +} + +static void +g_resource_file_class_init (GResourceFileClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_resource_file_finalize; + + resource_writable_attributes = g_file_attribute_info_list_new (); + resource_writable_namespaces = g_file_attribute_info_list_new (); +} + +static void +g_resource_file_init (GResourceFile *resource) +{ +} + +static char * +canonicalize_filename (const char *filename) +{ + char *canon, *start, *p, *q; + + /* Skip multiple inital slashes */ + while (filename[0] == '/' && filename[1] == '/') + filename++; + + if (*filename != '/') + canon = g_strconcat ("/", filename, NULL); + else + canon = g_strdup (filename); + + start = canon + 1; + + p = start; + while (*p != 0) + { + if (p[0] == '.' && (p[1] == 0 || p[1] == '/')) + { + memmove (p, p+1, strlen (p+1)+1); + } + else if (p[0] == '.' && p[1] == '.' && (p[2] == 0 || p[2] == '/')) + { + q = p + 2; + /* Skip previous separator */ + p = p - 2; + if (p < start) + p = start; + while (p > start && *p != '/') + p--; + if (*p == '/') + *p++ = '/'; + memmove (p, q, strlen (q)+1); + } + else + { + /* Skip until next separator */ + while (*p != 0 && *p != '/') + p++; + + if (*p != 0) + { + /* Canonicalize one separator */ + *p++ = '/'; + } + } + + /* Remove additional separators */ + q = p; + while (*q && *q == '/') + q++; + + if (p != q) + memmove (p, q, strlen (q)+1); + } + + /* Remove trailing slashes */ + if (p > start && *(p-1) == '/') + *(p-1) = 0; + + return canon; +} + +static GFile * +g_resource_file_new_for_path (const char *path) +{ + GResourceFile *resource = g_object_new (G_TYPE_RESOURCE_FILE, NULL); + + resource->path = canonicalize_filename (path); + + return G_FILE (resource); +} + +GFile * +_g_resource_file_new (const char *uri) +{ + GFile *resource; + char *path; + + path = g_uri_unescape_string (uri + strlen ("resource:"), NULL); + resource = g_resource_file_new_for_path (path); + g_free (path); + + return G_FILE (resource); +} + +static gboolean +g_resource_file_is_native (GFile *file) +{ + return FALSE; +} + +static gboolean +g_resource_file_has_uri_scheme (GFile *file, + const char *uri_scheme) +{ + return g_ascii_strcasecmp (uri_scheme, "resource") == 0; +} + +static char * +g_resource_file_get_uri_scheme (GFile *file) +{ + return g_strdup ("resource"); +} + +static char * +g_resource_file_get_basename (GFile *file) +{ + gchar *base; + + base = strrchr (G_RESOURCE_FILE (file)->path, '/'); + return g_strdup (base + 1); +} + +static char * +g_resource_file_get_path (GFile *file) +{ + return NULL; +} + +static char * +g_resource_file_get_uri (GFile *file) +{ + char *escaped, *res; + escaped = g_uri_escape_string (G_RESOURCE_FILE (file)->path, G_URI_RESERVED_CHARS_ALLOWED_IN_PATH, FALSE); + res = g_strconcat ("resource://", escaped, NULL); + g_free (escaped); + return res; +} + +static char * +g_resource_file_get_parse_name (GFile *file) +{ + return g_resource_file_get_uri (file); +} + +static GFile * +g_resource_file_get_parent (GFile *file) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + GResourceFile *parent; + gchar *end; + + end = strrchr (resource->path, '/'); + + if (end == G_RESOURCE_FILE (file)->path) + return NULL; + + parent = g_object_new (G_TYPE_RESOURCE_FILE, NULL); + parent->path = g_strndup (resource->path, + end - resource->path); + + return G_FILE (parent); +} + +static GFile * +g_resource_file_dup (GFile *file) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + + return g_resource_file_new_for_path (resource->path); +} + +static guint +g_resource_file_hash (GFile *file) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + + return g_str_hash (resource->path); +} + +static gboolean +g_resource_file_equal (GFile *file1, + GFile *file2) +{ + GResourceFile *resource1 = G_RESOURCE_FILE (file1); + GResourceFile *resource2 = G_RESOURCE_FILE (file2); + + return g_str_equal (resource1->path, resource2->path); +} + +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 && + prefix[prefix_len-1] == '/') + prefix_len--; + + return path + prefix_len; +} + +static gboolean +g_resource_file_prefix_matches (GFile *parent, + GFile *descendant) +{ + GResourceFile *parent_resource = G_RESOURCE_FILE (parent); + GResourceFile *descendant_resource = G_RESOURCE_FILE (descendant); + const char *remainder; + + remainder = match_prefix (descendant_resource->path, parent_resource->path); + if (remainder != NULL && *remainder == '/') + return TRUE; + return FALSE; +} + +static char * +g_resource_file_get_relative_path (GFile *parent, + GFile *descendant) +{ + GResourceFile *parent_resource = G_RESOURCE_FILE (parent); + GResourceFile *descendant_resource = G_RESOURCE_FILE (descendant); + const char *remainder; + + remainder = match_prefix (descendant_resource->path, parent_resource->path); + + if (remainder != NULL && *remainder == '/') + return g_strdup (remainder + 1); + return NULL; +} + +static GFile * +g_resource_file_resolve_relative_path (GFile *file, + const char *relative_path) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + char *filename; + GFile *child; + + if (relative_path[0] == '/') + return g_resource_file_new_for_path (relative_path); + + filename = g_build_path ("/", resource->path, relative_path, NULL); + child = g_resource_file_new_for_path (filename); + g_free (filename); + + return child; +} + +static GFileEnumerator * +g_resource_file_enumerate_children (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + return _g_resource_file_enumerator_new (resource, + attributes, flags, + cancellable, error); +} + +static GFile * +g_resource_file_get_child_for_display_name (GFile *file, + const char *display_name, + GError **error) +{ + GFile *new_file; + + new_file = g_file_get_child (file, display_name); + + return new_file; +} + +static GFileInfo * +g_resource_file_query_info (GFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + GError *my_error = NULL; + GFileInfo *info; + GFileAttributeMatcher *matcher; + gboolean res; + gsize size; + guint32 resource_flags; + char **children; + gboolean is_dir; + char *base; + + is_dir = FALSE; + children = g_resources_enumerate_children (resource->path, 0, NULL); + if (children != NULL) + { + g_strfreev (children); + is_dir = TRUE; + } + + /* root is always there */ + if (strcmp ("/", resource->path) == 0) + is_dir = TRUE; + + if (!is_dir) + { + res = g_resources_get_info (resource->path, 0, &size, &resource_flags, &my_error); + if (!res) + { + if (g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + resource->path); + } + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + my_error->message); + g_clear_error (&my_error); + return FALSE; + } + } + + matcher = g_file_attribute_matcher_new (attributes); + + info = g_file_info_new (); + base = g_resource_file_get_basename (file); + g_file_info_set_name (info, base); + g_file_info_set_display_name (info, base); + + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_READ, TRUE); + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_WRITE, FALSE); + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_EXECUTE, FALSE); + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_RENAME, FALSE); + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_DELETE, FALSE); + _g_file_info_set_attribute_boolean_by_id (info, G_FILE_ATTRIBUTE_ID_ACCESS_CAN_TRASH, FALSE); + + if (is_dir) + { + g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY); + } + else + { + GBytes *bytes; + char *content_type; + + g_file_info_set_file_type (info, G_FILE_TYPE_REGULAR); + g_file_info_set_size (info, size); + + if ((_g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) || + ((~resource_flags & G_RESOURCE_FLAGS_COMPRESSED) && + _g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_STANDARD_FAST_CONTENT_TYPE))) && + (bytes = g_resources_lookup_data (resource->path, 0, NULL))) + { + const guchar *data; + gsize data_size; + + data = g_bytes_get_data (bytes, &data_size); + content_type = g_content_type_guess (base, data, data_size, NULL); + + g_bytes_unref (bytes); + } + else + content_type = NULL; + + if (content_type) + { + _g_file_info_set_attribute_string_by_id (info, G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE, 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); + } + } + + g_free (base); + g_file_attribute_matcher_unref (matcher); + + return info; +} + +static GFileAttributeInfoList * +g_resource_file_query_settable_attributes (GFile *file, + GCancellable *cancellable, + GError **error) +{ + return g_file_attribute_info_list_ref (resource_writable_attributes); +} + +static GFileAttributeInfoList * +g_resource_file_query_writable_namespaces (GFile *file, + GCancellable *cancellable, + GError **error) +{ + return g_file_attribute_info_list_ref (resource_writable_namespaces); +} + +static GFileInputStream * +g_resource_file_read (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GResourceFile *resource = G_RESOURCE_FILE (file); + GError *my_error = NULL; + GInputStream *stream; + GFileInputStream *res; + + stream = g_resources_open_stream (resource->path, 0, &my_error); + + if (stream == NULL) + { + if (g_error_matches (my_error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + resource->path); + } + else + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + my_error->message); + g_clear_error (&my_error); + return NULL; + } + + res = _g_resource_file_input_stream_new (stream, file); + g_object_unref (stream); + return res; +} + +static void +g_resource_file_file_iface_init (GFileIface *iface) +{ + iface->dup = g_resource_file_dup; + iface->hash = g_resource_file_hash; + iface->equal = g_resource_file_equal; + iface->is_native = g_resource_file_is_native; + iface->has_uri_scheme = g_resource_file_has_uri_scheme; + iface->get_uri_scheme = g_resource_file_get_uri_scheme; + iface->get_basename = g_resource_file_get_basename; + iface->get_path = g_resource_file_get_path; + iface->get_uri = g_resource_file_get_uri; + iface->get_parse_name = g_resource_file_get_parse_name; + iface->get_parent = g_resource_file_get_parent; + iface->prefix_matches = g_resource_file_prefix_matches; + iface->get_relative_path = g_resource_file_get_relative_path; + iface->resolve_relative_path = g_resource_file_resolve_relative_path; + iface->get_child_for_display_name = g_resource_file_get_child_for_display_name; + iface->enumerate_children = g_resource_file_enumerate_children; + iface->query_info = g_resource_file_query_info; + iface->query_settable_attributes = g_resource_file_query_settable_attributes; + iface->query_writable_namespaces = g_resource_file_query_writable_namespaces; + iface->read_fn = g_resource_file_read; + + iface->supports_thread_contexts = TRUE; +} + +static GFileInfo *g_resource_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); +static gboolean g_resource_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + +static void +g_resource_file_enumerator_finalize (GObject *object) +{ + GResourceFileEnumerator *resource; + + resource = G_RESOURCE_FILE_ENUMERATOR (object); + + g_strfreev (resource->children); + g_free (resource->path); + g_free (resource->attributes); + + G_OBJECT_CLASS (g_resource_file_enumerator_parent_class)->finalize (object); +} + +static void +g_resource_file_enumerator_class_init (GResourceFileEnumeratorClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GFileEnumeratorClass *enumerator_class = G_FILE_ENUMERATOR_CLASS (klass); + + gobject_class->finalize = g_resource_file_enumerator_finalize; + + enumerator_class->next_file = g_resource_file_enumerator_next_file; + enumerator_class->close_fn = g_resource_file_enumerator_close; +} + +static void +g_resource_file_enumerator_init (GResourceFileEnumerator *resource) +{ +} + +static GFileEnumerator * +_g_resource_file_enumerator_new (GResourceFile *file, + const char *attributes, + GFileQueryInfoFlags flags, + GCancellable *cancellable, + GError **error) +{ + GResourceFileEnumerator *resource; + char **children; + gboolean res; + + children = g_resources_enumerate_children (file->path, 0, NULL); + if (children == NULL && + strcmp ("/", file->path) != 0) + { + res = g_resources_get_info (file->path, 0, NULL, NULL, NULL); + if (res) + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY, + _("The resource at '%s' is not a directory"), + file->path); + else + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, + _("The resource at '%s' does not exist"), + file->path); + return NULL; + } + + resource = g_object_new (G_TYPE_RESOURCE_FILE_ENUMERATOR, + "container", file, + NULL); + + resource->children = children; + resource->path = g_strdup (file->path); + resource->attributes = g_strdup (attributes); + resource->flags = flags; + + return G_FILE_ENUMERATOR (resource); +} + +static GFileInfo * +g_resource_file_enumerator_next_file (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + GResourceFileEnumerator *resource = G_RESOURCE_FILE_ENUMERATOR (enumerator); + char *path; + GFileInfo *info; + GFile *file; + + if (resource->children == NULL || + resource->children[resource->index] == NULL) + return NULL; + + path = g_build_path ("/", resource->path, resource->children[resource->index++], NULL); + file = g_resource_file_new_for_path (path); + g_free (path); + + info = g_file_query_info (file, + resource->attributes, + resource->flags, + cancellable, + error); + + g_object_unref (file); + + return info; +} + +static gboolean +g_resource_file_enumerator_close (GFileEnumerator *enumerator, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + + +struct _GResourceFileInputStream +{ + GFileInputStream parent_instance; + GInputStream *stream; + GFile *file; +}; + +struct _GResourceFileInputStreamClass +{ + GFileInputStreamClass parent_class; +}; + +#define g_resource_file_input_stream_get_type _g_resource_file_input_stream_get_type +G_DEFINE_TYPE (GResourceFileInputStream, g_resource_file_input_stream, G_TYPE_FILE_INPUT_STREAM); + +static gssize g_resource_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gssize g_resource_file_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_resource_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); +static goffset g_resource_file_input_stream_tell (GFileInputStream *stream); +static gboolean g_resource_file_input_stream_can_seek (GFileInputStream *stream); +static gboolean g_resource_file_input_stream_seek (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +static GFileInfo *g_resource_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error); + +static void +g_resource_file_input_stream_finalize (GObject *object) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (object); + + g_object_unref (file->stream); + g_object_unref (file->file); + G_OBJECT_CLASS (g_resource_file_input_stream_parent_class)->finalize (object); +} + +static void +g_resource_file_input_stream_class_init (GResourceFileInputStreamClass *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); + + gobject_class->finalize = g_resource_file_input_stream_finalize; + + stream_class->read_fn = g_resource_file_input_stream_read; + stream_class->skip = g_resource_file_input_stream_skip; + stream_class->close_fn = g_resource_file_input_stream_close; + file_stream_class->tell = g_resource_file_input_stream_tell; + file_stream_class->can_seek = g_resource_file_input_stream_can_seek; + file_stream_class->seek = g_resource_file_input_stream_seek; + file_stream_class->query_info = g_resource_file_input_stream_query_info; +} + +static void +g_resource_file_input_stream_init (GResourceFileInputStream *info) +{ +} + +static GFileInputStream * +_g_resource_file_input_stream_new (GInputStream *in_stream, GFile *file) +{ + GResourceFileInputStream *stream; + + stream = g_object_new (G_TYPE_RESOURCE_FILE_INPUT_STREAM, NULL); + stream->stream = g_object_ref (in_stream); + stream->file = g_object_ref (file); + + return G_FILE_INPUT_STREAM (stream); +} + +static gssize +g_resource_file_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + return g_input_stream_read (file->stream, + buffer, count, cancellable, error); +} + +static gssize +g_resource_file_input_stream_skip (GInputStream *stream, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + return g_input_stream_skip (file->stream, + count, cancellable, error); +} + +static gboolean +g_resource_file_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + return g_input_stream_close (file->stream, + cancellable, error); +} + + +static goffset +g_resource_file_input_stream_tell (GFileInputStream *stream) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + + if (!G_IS_SEEKABLE (file->stream)) + return 0; + + return g_seekable_tell (G_SEEKABLE (file->stream)); +} + +static gboolean +g_resource_file_input_stream_can_seek (GFileInputStream *stream) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + + return G_IS_SEEKABLE (file->stream) && g_seekable_can_seek (G_SEEKABLE (file->stream)); +} + +static gboolean +g_resource_file_input_stream_seek (GFileInputStream *stream, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + + if (!G_IS_SEEKABLE (file->stream)) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Input stream doesn't implement seek")); + return FALSE; + } + + return g_seekable_seek (G_SEEKABLE (file->stream), + offset, type, cancellable, error); +} + +static GFileInfo * +g_resource_file_input_stream_query_info (GFileInputStream *stream, + const char *attributes, + GCancellable *cancellable, + GError **error) +{ + GResourceFileInputStream *file = G_RESOURCE_FILE_INPUT_STREAM (stream); + + return g_file_query_info (file->file, attributes, 0, cancellable, error); +} diff --git a/gio/gresourcefile.h b/gio/gresourcefile.h new file mode 100644 index 0000000..2c792b0 --- /dev/null +++ b/gio/gresourcefile.h @@ -0,0 +1,51 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 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_RESOURCE_FILE_H__ +#define __G_RESOURCE_FILE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_RESOURCE_FILE (_g_resource_file_get_type ()) +#define G_RESOURCE_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_RESOURCE_FILE, GResourceFile)) +#define G_RESOURCE_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_RESOURCE_FILE, GResourceFileClass)) +#define G_IS_RESOURCE_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_RESOURCE_FILE)) +#define G_IS_RESOURCE_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_RESOURCE_FILE)) +#define G_RESOURCE_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_RESOURCE_FILE, GResourceFileClass)) + +typedef struct _GResourceFile GResourceFile; +typedef struct _GResourceFileClass GResourceFileClass; + +struct _GResourceFileClass +{ + GObjectClass parent_class; +}; + +GType _g_resource_file_get_type (void) G_GNUC_CONST; + +GFile * _g_resource_file_new (const char *uri); + +G_END_DECLS + +#endif /* __G_RESOURCE_FILE_H__ */ diff --git a/gio/gschema.dtd b/gio/gschema.dtd new file mode 100644 index 0000000..00e3a16 --- /dev/null +++ b/gio/gschema.dtd @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gio/gseekable.c b/gio/gseekable.c new file mode 100644 index 0000000..ac77b12 --- /dev/null +++ b/gio/gseekable.c @@ -0,0 +1,176 @@ +/* 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" + + +/** + * 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: a #GError location to store the error occurring, 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. + * + * Virtual: truncate_fn + * 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); +} diff --git a/gio/gseekable.h b/gio/gseekable.h new file mode 100644 index 0000000..245eb07 --- /dev/null +++ b/gio/gseekable.h @@ -0,0 +1,105 @@ +/* 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_SEEKABLE_H__ +#define __G_SEEKABLE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: Checks if truncation is supported 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 */ +}; + +GLIB_AVAILABLE_IN_ALL +GType g_seekable_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +goffset g_seekable_tell (GSeekable *seekable); +GLIB_AVAILABLE_IN_ALL +gboolean g_seekable_can_seek (GSeekable *seekable); +GLIB_AVAILABLE_IN_ALL +gboolean g_seekable_seek (GSeekable *seekable, + goffset offset, + GSeekType type, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_seekable_can_truncate (GSeekable *seekable); +GLIB_AVAILABLE_IN_ALL +gboolean g_seekable_truncate (GSeekable *seekable, + goffset offset, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + + +#endif /* __G_SEEKABLE_H__ */ diff --git a/gio/gsettings-mapping.c b/gio/gsettings-mapping.c new file mode 100644 index 0000000..6a9c41b --- /dev/null +++ b/gio/gsettings-mapping.c @@ -0,0 +1,594 @@ +/* + * Copyright © 2010 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 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: Vincent Untz + */ + +#include "config.h" + +#include "gsettings-mapping.h" + +static GVariant * +g_settings_set_mapping_int (const GValue *value, + const GVariantType *expected_type) +{ + GVariant *variant = NULL; + gint64 l; + + if (G_VALUE_HOLDS_INT (value)) + l = g_value_get_int (value); + else if (G_VALUE_HOLDS_INT64 (value)) + l = g_value_get_int64 (value); + else + return NULL; + + if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16)) + { + if (G_MININT16 <= l && l <= G_MAXINT16) + variant = g_variant_new_int16 ((gint16) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16)) + { + if (0 <= l && l <= G_MAXUINT16) + variant = g_variant_new_uint16 ((guint16) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32)) + { + if (G_MININT32 <= l && l <= G_MAXINT32) + variant = g_variant_new_int32 ((gint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32)) + { + if (0 <= l && l <= G_MAXUINT32) + variant = g_variant_new_uint32 ((guint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64)) + { + if (G_MININT64 <= l && l <= G_MAXINT64) + variant = g_variant_new_int64 ((gint64) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64)) + { + if (0 <= l && l <= G_MAXUINT64) + variant = g_variant_new_uint64 ((guint64) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE)) + { + if (0 <= l && l <= G_MAXUINT32) + variant = g_variant_new_handle ((guint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE)) + variant = g_variant_new_double ((gdouble) l); + + return variant; +} + +static GVariant * +g_settings_set_mapping_float (const GValue *value, + const GVariantType *expected_type) +{ + GVariant *variant = NULL; + gdouble d; + gint64 l; + + if (G_VALUE_HOLDS_DOUBLE (value)) + d = g_value_get_double (value); + else + return NULL; + + l = (gint64) d; + if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16)) + { + if (G_MININT16 <= l && l <= G_MAXINT16) + variant = g_variant_new_int16 ((gint16) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16)) + { + if (0 <= l && l <= G_MAXUINT16) + variant = g_variant_new_uint16 ((guint16) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32)) + { + if (G_MININT32 <= l && l <= G_MAXINT32) + variant = g_variant_new_int32 ((gint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32)) + { + if (0 <= l && l <= G_MAXUINT32) + variant = g_variant_new_uint32 ((guint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64)) + { + if (G_MININT64 <= l && l <= G_MAXINT64) + variant = g_variant_new_int64 ((gint64) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64)) + { + if (0 <= l && l <= G_MAXUINT64) + variant = g_variant_new_uint64 ((guint64) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE)) + { + if (0 <= l && l <= G_MAXUINT32) + variant = g_variant_new_handle ((guint) l); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE)) + variant = g_variant_new_double ((gdouble) d); + + return variant; +} +static GVariant * +g_settings_set_mapping_unsigned_int (const GValue *value, + const GVariantType *expected_type) +{ + GVariant *variant = NULL; + guint64 u; + + if (G_VALUE_HOLDS_UINT (value)) + u = g_value_get_uint (value); + else if (G_VALUE_HOLDS_UINT64 (value)) + u = g_value_get_uint64 (value); + else + return NULL; + + if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16)) + { + if (u <= G_MAXINT16) + variant = g_variant_new_int16 ((gint16) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16)) + { + if (u <= G_MAXUINT16) + variant = g_variant_new_uint16 ((guint16) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32)) + { + if (u <= G_MAXINT32) + variant = g_variant_new_int32 ((gint) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32)) + { + if (u <= G_MAXUINT32) + variant = g_variant_new_uint32 ((guint) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64)) + { + if (u <= G_MAXINT64) + variant = g_variant_new_int64 ((gint64) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64)) + { + if (u <= G_MAXUINT64) + variant = g_variant_new_uint64 ((guint64) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE)) + { + if (u <= G_MAXUINT32) + variant = g_variant_new_handle ((guint) u); + } + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE)) + variant = g_variant_new_double ((gdouble) u); + + return variant; +} + +static gboolean +g_settings_get_mapping_int (GValue *value, + GVariant *variant) +{ + const GVariantType *type; + gint64 l; + + type = g_variant_get_type (variant); + + if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16)) + l = g_variant_get_int16 (variant); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32)) + l = g_variant_get_int32 (variant); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64)) + l = g_variant_get_int64 (variant); + else + return FALSE; + + if (G_VALUE_HOLDS_INT (value)) + { + g_value_set_int (value, l); + return (G_MININT32 <= l && l <= G_MAXINT32); + } + else if (G_VALUE_HOLDS_UINT (value)) + { + g_value_set_uint (value, l); + return (0 <= l && l <= G_MAXUINT32); + } + else if (G_VALUE_HOLDS_INT64 (value)) + { + g_value_set_int64 (value, l); + return (G_MININT64 <= l && l <= G_MAXINT64); + } + else if (G_VALUE_HOLDS_UINT64 (value)) + { + g_value_set_uint64 (value, l); + return (0 <= l && l <= G_MAXUINT64); + } + else if (G_VALUE_HOLDS_DOUBLE (value)) + { + g_value_set_double (value, l); + return TRUE; + } + + return FALSE; +} + +static gboolean +g_settings_get_mapping_float (GValue *value, + GVariant *variant) +{ + const GVariantType *type; + gdouble d; + gint64 l; + + type = g_variant_get_type (variant); + + if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + d = g_variant_get_double (variant); + else + return FALSE; + + l = (gint64)d; + if (G_VALUE_HOLDS_INT (value)) + { + g_value_set_int (value, l); + return (G_MININT32 <= l && l <= G_MAXINT32); + } + else if (G_VALUE_HOLDS_UINT (value)) + { + g_value_set_uint (value, l); + return (0 <= l && l <= G_MAXUINT32); + } + else if (G_VALUE_HOLDS_INT64 (value)) + { + g_value_set_int64 (value, l); + return (G_MININT64 <= l && l <= G_MAXINT64); + } + else if (G_VALUE_HOLDS_UINT64 (value)) + { + g_value_set_uint64 (value, l); + return (0 <= l && l <= G_MAXUINT64); + } + else if (G_VALUE_HOLDS_DOUBLE (value)) + { + g_value_set_double (value, d); + return TRUE; + } + + return FALSE; +} +static gboolean +g_settings_get_mapping_unsigned_int (GValue *value, + GVariant *variant) +{ + const GVariantType *type; + guint64 u; + + type = g_variant_get_type (variant); + + if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16)) + u = g_variant_get_uint16 (variant); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32)) + u = g_variant_get_uint32 (variant); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64)) + u = g_variant_get_uint64 (variant); + else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE)) + u = g_variant_get_handle (variant); + else + return FALSE; + + if (G_VALUE_HOLDS_INT (value)) + { + g_value_set_int (value, u); + return (u <= G_MAXINT32); + } + else if (G_VALUE_HOLDS_UINT (value)) + { + g_value_set_uint (value, u); + return (u <= G_MAXUINT32); + } + else if (G_VALUE_HOLDS_INT64 (value)) + { + g_value_set_int64 (value, u); + return (u <= G_MAXINT64); + } + else if (G_VALUE_HOLDS_UINT64 (value)) + { + g_value_set_uint64 (value, u); + return (u <= G_MAXUINT64); + } + else if (G_VALUE_HOLDS_DOUBLE (value)) + { + g_value_set_double (value, u); + return TRUE; + } + + return FALSE; +} + +GVariant * +g_settings_set_mapping (const GValue *value, + const GVariantType *expected_type, + gpointer user_data) +{ + gchar *type_string; + + if (G_VALUE_HOLDS_BOOLEAN (value)) + { + if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BOOLEAN)) + return g_variant_new_boolean (g_value_get_boolean (value)); + } + + else if (G_VALUE_HOLDS_CHAR (value) || + G_VALUE_HOLDS_UCHAR (value)) + { + if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTE)) + { + if (G_VALUE_HOLDS_CHAR (value)) + return g_variant_new_byte (g_value_get_schar (value)); + else + return g_variant_new_byte (g_value_get_uchar (value)); + } + } + + else if (G_VALUE_HOLDS_INT (value) || + G_VALUE_HOLDS_INT64 (value)) + return g_settings_set_mapping_int (value, expected_type); + + else if (G_VALUE_HOLDS_DOUBLE (value)) + return g_settings_set_mapping_float (value, expected_type); + + else if (G_VALUE_HOLDS_UINT (value) || + G_VALUE_HOLDS_UINT64 (value)) + return g_settings_set_mapping_unsigned_int (value, expected_type); + + else if (G_VALUE_HOLDS_STRING (value)) + { + if (g_value_get_string (value) == NULL) + return NULL; + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_STRING)) + return g_variant_new_string (g_value_get_string (value)); + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTESTRING)) + return g_variant_new_bytestring (g_value_get_string (value)); + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_OBJECT_PATH)) + return g_variant_new_object_path (g_value_get_string (value)); + else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_SIGNATURE)) + return g_variant_new_signature (g_value_get_string (value)); + } + + else if (G_VALUE_HOLDS (value, G_TYPE_STRV)) + { + if (g_value_get_boxed (value) == NULL) + return NULL; + return g_variant_new_strv ((const gchar **) g_value_get_boxed (value), + -1); + } + + else if (G_VALUE_HOLDS_ENUM (value)) + { + GEnumValue *enumval; + GEnumClass *eclass; + + /* GParamSpecEnum holds a ref on the class so we just peek... */ + eclass = g_type_class_peek (G_VALUE_TYPE (value)); + enumval = g_enum_get_value (eclass, g_value_get_enum (value)); + + if (enumval) + return g_variant_new_string (enumval->value_nick); + else + return NULL; + } + + else if (G_VALUE_HOLDS_FLAGS (value)) + { + GVariantBuilder builder; + GFlagsValue *flagsval; + GFlagsClass *fclass; + guint flags; + + fclass = g_type_class_peek (G_VALUE_TYPE (value)); + flags = g_value_get_flags (value); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); + while (flags) + { + flagsval = g_flags_get_first_value (fclass, flags); + + if (flagsval == NULL) + { + g_variant_builder_clear (&builder); + return NULL; + } + + g_variant_builder_add (&builder, "s", flagsval->value_nick); + flags &= ~flagsval->value; + } + + return g_variant_builder_end (&builder); + } + + type_string = g_variant_type_dup_string (expected_type); + g_critical ("No GSettings bind handler for type \"%s\".", type_string); + g_free (type_string); + + return NULL; +} + +gboolean +g_settings_get_mapping (GValue *value, + GVariant *variant, + gpointer user_data) +{ + if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) + { + if (!G_VALUE_HOLDS_BOOLEAN (value)) + return FALSE; + g_value_set_boolean (value, g_variant_get_boolean (variant)); + return TRUE; + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTE)) + { + if (G_VALUE_HOLDS_UCHAR (value)) + g_value_set_uchar (value, g_variant_get_byte (variant)); + else if (G_VALUE_HOLDS_CHAR (value)) + g_value_set_schar (value, (gint8)g_variant_get_byte (variant)); + else + return FALSE; + return TRUE; + } + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64)) + return g_settings_get_mapping_int (value, variant); + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE)) + return g_settings_get_mapping_float (value, variant); + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_HANDLE)) + return g_settings_get_mapping_unsigned_int (value, variant); + + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH) || + g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE)) + { + if (G_VALUE_HOLDS_STRING (value)) + { + g_value_set_string (value, g_variant_get_string (variant, NULL)); + return TRUE; + } + + else if (G_VALUE_HOLDS_ENUM (value)) + { + GEnumClass *eclass; + GEnumValue *evalue; + const gchar *nick; + + /* GParamSpecEnum holds a ref on the class so we just peek... */ + eclass = g_type_class_peek (G_VALUE_TYPE (value)); + nick = g_variant_get_string (variant, NULL); + evalue = g_enum_get_value_by_nick (eclass, nick); + + if (evalue) + { + g_value_set_enum (value, evalue->value); + return TRUE; + } + + g_warning ("Unable to lookup enum nick '%s' via GType\n", nick); + return FALSE; + } + } + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as"))) + { + if (G_VALUE_HOLDS (value, G_TYPE_STRV)) + { + g_value_take_boxed (value, g_variant_dup_strv (variant, NULL)); + return TRUE; + } + + else if (G_VALUE_HOLDS_FLAGS (value)) + { + GFlagsClass *fclass; + GFlagsValue *fvalue; + const gchar *nick; + GVariantIter iter; + guint flags = 0; + + fclass = g_type_class_peek (G_VALUE_TYPE (value)); + + g_variant_iter_init (&iter, variant); + while (g_variant_iter_next (&iter, "&s", &nick)) + { + fvalue = g_flags_get_value_by_nick (fclass, nick); + + if (fvalue) + flags |= fvalue->value; + + else + { + g_warning ("Unable to lookup flags nick '%s' via GType\n", + nick); + return FALSE; + } + } + + g_value_set_flags (value, flags); + return TRUE; + } + } + else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTESTRING)) + { + g_value_set_string (value, g_variant_get_bytestring (variant)); + return TRUE; + } + + g_critical ("No GSettings bind handler for type \"%s\".", + g_variant_get_type_string (variant)); + + return FALSE; +} + +gboolean +g_settings_mapping_is_compatible (GType gvalue_type, + const GVariantType *variant_type) +{ + gboolean ok = FALSE; + + if (gvalue_type == G_TYPE_BOOLEAN) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BOOLEAN); + else if (gvalue_type == G_TYPE_CHAR || + gvalue_type == G_TYPE_UCHAR) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BYTE); + else if (gvalue_type == G_TYPE_INT || + gvalue_type == G_TYPE_UINT || + gvalue_type == G_TYPE_INT64 || + gvalue_type == G_TYPE_UINT64 || + gvalue_type == G_TYPE_DOUBLE) + ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT16) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT16) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT32) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT32) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT64) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT64) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_HANDLE) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_DOUBLE)); + else if (gvalue_type == G_TYPE_STRING) + ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) || + g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE)); + else if (gvalue_type == G_TYPE_STRV) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as")); + else if (G_TYPE_IS_ENUM (gvalue_type)) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING); + else if (G_TYPE_IS_FLAGS (gvalue_type)) + ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as")); + + return ok; +} diff --git a/gio/gsettings-mapping.h b/gio/gsettings-mapping.h new file mode 100644 index 0000000..ad8f59e --- /dev/null +++ b/gio/gsettings-mapping.h @@ -0,0 +1,36 @@ +/* + * Copyright © 2010 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 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: Vincent Untz + */ + +#ifndef __G_SETTINGS_MAPPING_H__ +#define __G_SETTINGS_MAPPING_H__ + +#include + +GVariant * g_settings_set_mapping (const GValue *value, + const GVariantType *expected_type, + gpointer user_data); +gboolean g_settings_get_mapping (GValue *value, + GVariant *variant, + gpointer user_data); +gboolean g_settings_mapping_is_compatible (GType gvalue_type, + const GVariantType *variant_type); + +#endif /* __G_SETTINGS_MAPPING_H__ */ diff --git a/gio/gsettings-tool.c b/gio/gsettings-tool.c new file mode 100644 index 0000000..c049ce0 --- /dev/null +++ b/gio/gsettings-tool.c @@ -0,0 +1,834 @@ +/* + * 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 "config.h" + +#include +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include "glib/glib-private.h" +#endif + +static gboolean +contained (const gchar * const *items, + const gchar *item) +{ + while (*items) + if (strcmp (*items++, item) == 0) + return TRUE; + + return FALSE; +} + +static gboolean +is_relocatable_schema (GSettingsSchema *schema) +{ + return g_settings_schema_get_path (schema) == NULL; +} + +static gboolean +check_relocatable_schema (GSettingsSchema *schema, + const gchar *schema_id) +{ + if (schema == NULL) + { + g_printerr (_("No such schema '%s'\n"), schema_id); + return FALSE; + } + + if (!is_relocatable_schema (schema)) + { + g_printerr (_("Schema '%s' is not relocatable " + "(path must not be specified)\n"), + schema_id); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_schema (GSettingsSchema *schema, + const gchar *schema_id) +{ + if (schema == NULL) + { + g_printerr (_("No such schema '%s'\n"), schema_id); + return FALSE; + } + + if (is_relocatable_schema (schema)) + { + g_printerr (_("Schema '%s' is relocatable " + "(path must be specified)\n"), + schema_id); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_path (const gchar *path) +{ + if (path[0] == '\0') + { + g_printerr (_("Empty path given.\n")); + return FALSE; + } + + if (path[0] != '/') + { + g_printerr (_("Path must begin with a slash (/)\n")); + return FALSE; + } + + if (!g_str_has_suffix (path, "/")) + { + g_printerr (_("Path must end with a slash (/)\n")); + return FALSE; + } + + if (strstr (path, "//")) + { + g_printerr (_("Path must not contain two adjacent slashes (//)\n")); + return FALSE; + } + + return TRUE; +} + +static gboolean +check_key (GSettings *settings, + const gchar *key) +{ + gboolean good; + gchar **keys; + + keys = g_settings_list_keys (settings); + good = contained ((const gchar **) keys, key); + g_strfreev (keys); + + if (good) + return TRUE; + + g_printerr (_("No such key '%s'\n"), key); + + return FALSE; +} + +static void +output_list (const gchar * const *list) +{ + gint i; + + for (i = 0; list[i]; i++) + g_print ("%s\n", list[i]); +} + +static void +gsettings_list_schemas (GSettings *settings, + const gchar *key, + const gchar *value) +{ + output_list (g_settings_list_schemas ()); +} + +static void +gsettings_list_relocatable_schemas (GSettings *settings, + const gchar *key, + const gchar *value) +{ + output_list (g_settings_list_relocatable_schemas ()); +} + +static void +gsettings_list_keys (GSettings *settings, + const gchar *key, + const gchar *value) +{ + gchar **keys; + + keys = g_settings_list_keys (settings); + output_list ((const gchar **) keys); + g_strfreev (keys); +} + +static void +gsettings_list_children (GSettings *settings, + const gchar *key, + const gchar *value) +{ + gchar **children; + gint max = 0; + gint i; + + children = g_settings_list_children (settings); + for (i = 0; children[i]; i++) + if (strlen (children[i]) > max) + max = strlen (children[i]); + + for (i = 0; children[i]; i++) + { + GSettings *child; + GSettingsSchema *schema; + gchar *path; + + child = g_settings_get_child (settings, children[i]); + g_object_get (child, + "settings-schema", &schema, + "path", &path, + NULL); + + if (g_settings_schema_get_path (schema) != NULL) + g_print ("%-*s %s\n", max, children[i], g_settings_schema_get_id (schema)); + else + g_print ("%-*s %s:%s\n", max, children[i], g_settings_schema_get_id (schema), path); + + g_object_unref (child); + g_settings_schema_unref (schema); + g_free (path); + } + + g_strfreev (children); +} + +static void +enumerate (GSettings *settings) +{ + gchar **keys; + gchar *schema; + gint i; + + g_object_get (settings, "schema-id", &schema, NULL); + + keys = g_settings_list_keys (settings); + for (i = 0; keys[i]; i++) + { + GVariant *value; + gchar *printed; + + value = g_settings_get_value (settings, keys[i]); + printed = g_variant_print (value, TRUE); + g_print ("%s %s %s\n", schema, keys[i], printed); + g_variant_unref (value); + g_free (printed); + } + + g_free (schema); + g_strfreev (keys); +} + +static void +gsettings_list_recursively (GSettings *settings, + const gchar *key, + const gchar *value) +{ + if (settings) + { + gchar **children; + gint i; + + enumerate (settings); + children = g_settings_list_children (settings); + for (i = 0; children[i]; i++) + { + GSettings *child; + + child = g_settings_get_child (settings, children[i]); + gsettings_list_recursively (child, NULL, NULL); + g_object_unref (child); + } + + g_strfreev (children); + } + else + { + const gchar * const *schemas; + gint i; + + schemas = g_settings_list_schemas (); + + for (i = 0; schemas[i]; i++) + { + settings = g_settings_new (schemas[i]); + gsettings_list_recursively (settings, NULL, NULL); + g_object_unref (settings); + } + } +} + +static void +gsettings_range (GSettings *settings, + const gchar *key, + const gchar *value) +{ + GVariant *range, *detail; + const gchar *type; + + range = g_settings_get_range (settings, key); + g_variant_get (range, "(&sv)", &type, &detail); + + if (strcmp (type, "type") == 0) + g_print ("type %s\n", g_variant_get_type_string (detail) + 1); + + else if (strcmp (type, "range") == 0) + { + GVariant *min, *max; + gchar *smin, *smax; + + g_variant_get (detail, "(**)", &min, &max); + smin = g_variant_print (min, FALSE); + smax = g_variant_print (max, FALSE); + + g_print ("range %s %s %s\n", + g_variant_get_type_string (min), smin, smax); + g_variant_unref (min); + g_variant_unref (max); + g_free (smin); + g_free (smax); + } + + else if (strcmp (type, "enum") == 0 || strcmp (type, "flags") == 0) + { + GVariantIter iter; + GVariant *item; + + g_print ("%s\n", type); + + g_variant_iter_init (&iter, detail); + while (g_variant_iter_loop (&iter, "*", &item)) + { + gchar *printed; + + printed = g_variant_print (item, FALSE); + g_print ("%s\n", printed); + g_free (printed); + } + } + + g_variant_unref (detail); + g_variant_unref (range); +} + +static void +gsettings_get (GSettings *settings, + const gchar *key, + const gchar *value_) +{ + GVariant *value; + gchar *printed; + + value = g_settings_get_value (settings, key); + printed = g_variant_print (value, TRUE); + g_print ("%s\n", printed); + g_variant_unref (value); + g_free (printed); +} + +static void +gsettings_reset (GSettings *settings, + const gchar *key, + const gchar *value) +{ + g_settings_reset (settings, key); + g_settings_sync (); +} + +static void +reset_all_keys (GSettings *settings) +{ + gchar **keys; + gint i; + + keys = g_settings_list_keys (settings); + for (i = 0; keys[i]; i++) + { + g_settings_reset (settings, keys[i]); + } + + g_strfreev (keys); +} + +static void +gsettings_reset_recursively (GSettings *settings, + const gchar *key, + const gchar *value) +{ + gchar **children; + gint i; + + g_settings_delay (settings); + + reset_all_keys (settings); + children = g_settings_list_children (settings); + for (i = 0; children[i]; i++) + { + GSettings *child; + child = g_settings_get_child (settings, children[i]); + + reset_all_keys (child); + + g_object_unref (child); + } + + g_strfreev (children); + + g_settings_apply (settings); + g_settings_sync (); +} + +static void +gsettings_writable (GSettings *settings, + const gchar *key, + const gchar *value) +{ + g_print ("%s\n", + g_settings_is_writable (settings, key) ? + "true" : "false"); +} + +static void +value_changed (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GVariant *value; + gchar *printed; + + value = g_settings_get_value (settings, key); + printed = g_variant_print (value, TRUE); + g_print ("%s: %s\n", key, printed); + g_variant_unref (value); + g_free (printed); +} + +static void +gsettings_monitor (GSettings *settings, + const gchar *key, + const gchar *value) +{ + if (key) + { + gchar *name; + + name = g_strdup_printf ("changed::%s", key); + g_signal_connect (settings, name, G_CALLBACK (value_changed), NULL); + } + else + g_signal_connect (settings, "changed", G_CALLBACK (value_changed), NULL); + + g_main_loop_run (g_main_loop_new (NULL, FALSE)); +} + +static void +gsettings_set (GSettings *settings, + const gchar *key, + const gchar *value) +{ + const GVariantType *type; + GError *error = NULL; + GVariant *existing; + GVariant *new; + gchar *freeme = NULL; + + existing = g_settings_get_value (settings, key); + type = g_variant_get_type (existing); + + new = g_variant_parse (type, value, NULL, NULL, &error); + + /* If that didn't work and the type is string then we should assume + * that the user is just trying to set a string directly and forgot + * the quotes (or had them consumed by the shell). + * + * If the user started with a quote then we assume that some deeper + * problem is at play and we want the failure in that case. + * + * Consider: + * + * gsettings set x.y.z key "'i don't expect this to work'" + * + * Note that we should not just add quotes and try parsing again, but + * rather assume that the user is providing us with a bare string. + * Assume we added single quotes, then consider this case: + * + * gsettings set x.y.z key "i'd expect this to work" + * + * A similar example could be given for double quotes. + * + * Avoid that whole mess by just using g_variant_new_string(). + */ + if (new == NULL && + g_variant_type_equal (type, G_VARIANT_TYPE_STRING) && + value[0] != '\'' && value[0] != '"') + { + g_clear_error (&error); + new = g_variant_new_string (value); + } + + /* we're done with 'type' now, so we can free 'existing' */ + g_variant_unref (existing); + + if (new == NULL) + { + g_printerr ("%s\n", error->message); + exit (1); + } + + if (!g_settings_range_check (settings, key, new)) + { + g_printerr (_("The provided value is outside of the valid range\n")); + g_variant_unref (new); + exit (1); + } + + g_settings_set_value (settings, key, new); + + g_settings_sync (); + + g_free (freeme); +} + +static int +gsettings_help (gboolean requested, + const gchar *command) +{ + const gchar *description; + const gchar *synopsis; + GString *string; + + string = g_string_new (NULL); + + if (command == NULL) + ; + + else if (strcmp (command, "help") == 0) + { + description = _("Print help"); + synopsis = "[COMMAND]"; + } + + else if (strcmp (command, "list-schemas") == 0) + { + description = _("List the installed (non-relocatable) schemas"); + synopsis = ""; + } + + else if (strcmp (command, "list-relocatable-schemas") == 0) + { + description = _("List the installed relocatable schemas"); + synopsis = ""; + } + + else if (strcmp (command, "list-keys") == 0) + { + description = _("List the keys in SCHEMA"); + synopsis = N_("SCHEMA[:PATH]"); + } + + else if (strcmp (command, "list-children") == 0) + { + description = _("List the children of SCHEMA"); + synopsis = N_("SCHEMA[:PATH]"); + } + + else if (strcmp (command, "list-recursively") == 0) + { + description = _("List keys and values, recursively\n" + "If no SCHEMA is given, list all keys\n"); + synopsis = N_("[SCHEMA[:PATH]]"); + } + + else if (strcmp (command, "get") == 0) + { + description = _("Get the value of KEY"); + synopsis = N_("SCHEMA[:PATH] KEY"); + } + + else if (strcmp (command, "range") == 0) + { + description = _("Query the range of valid values for KEY"); + synopsis = N_("SCHEMA[:PATH] KEY"); + } + + else if (strcmp (command, "set") == 0) + { + description = _("Set the value of KEY to VALUE"); + synopsis = N_("SCHEMA[:PATH] KEY VALUE"); + } + + else if (strcmp (command, "reset") == 0) + { + description = _("Reset KEY to its default value"); + synopsis = N_("SCHEMA[:PATH] KEY"); + } + + else if (strcmp (command, "reset-recursively") == 0) + { + description = _("Reset all keys in SCHEMA to their defaults"); + synopsis = N_("SCHEMA[:PATH]"); + } + + else if (strcmp (command, "writable") == 0) + { + description = _("Check if KEY is writable"); + synopsis = N_("SCHEMA[:PATH] KEY"); + } + + else if (strcmp (command, "monitor") == 0) + { + description = _("Monitor KEY for changes.\n" + "If no KEY is specified, monitor all keys in SCHEMA.\n" + "Use ^C to stop monitoring.\n"); + synopsis = N_("SCHEMA[:PATH] [KEY]"); + } + else + { + g_string_printf (string, _("Unknown command %s\n\n"), command); + requested = FALSE; + command = NULL; + } + + if (command == NULL) + { + g_string_append (string, + _("Usage:\n" + " gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" + "\n" + "Commands:\n" + " help Show this information\n" + " list-schemas List installed schemas\n" + " list-relocatable-schemas List relocatable schemas\n" + " list-keys List keys in a schema\n" + " list-children List children of a schema\n" + " list-recursively List keys and values, recursively\n" + " range Queries the range of a key\n" + " get Get the value of a key\n" + " set Set the value of a key\n" + " reset Reset the value of a key\n" + " reset-recursively Reset all values in a given schema\n" + " writable Check if a key is writable\n" + " monitor Watch for changes\n" + "\n" + "Use 'gsettings help COMMAND' to get detailed help.\n\n")); + } + else + { + g_string_append_printf (string, _("Usage:\n gsettings [--schemadir SCHEMADIR] %s %s\n\n%s\n\n"), + command, synopsis[0] ? _(synopsis) : "", description); + + g_string_append (string, _("Arguments:\n")); + + g_string_append (string, + _(" SCHEMADIR A directory to search for additional schemas\n")); + + if (strstr (synopsis, "[COMMAND]")) + g_string_append (string, + _(" COMMAND The (optional) command to explain\n")); + + else if (strstr (synopsis, "SCHEMA")) + g_string_append (string, + _(" SCHEMA The name of the schema\n" + " PATH The path, for relocatable schemas\n")); + + if (strstr (synopsis, "[KEY]")) + g_string_append (string, + _(" KEY The (optional) key within the schema\n")); + + else if (strstr (synopsis, "KEY")) + g_string_append (string, + _(" KEY The key within the schema\n")); + + if (strstr (synopsis, "VALUE")) + g_string_append (string, + _(" VALUE The value to set\n")); + + g_string_append (string, "\n"); + } + + if (requested) + g_print ("%s", string->str); + else + g_printerr ("%s\n", string->str); + + g_string_free (string, TRUE); + + return requested ? 0 : 1; +} + + +int +main (int argc, char **argv) +{ + void (* function) (GSettings *, const gchar *, const gchar *); + GSettingsSchemaSource *schema_source; + GSettingsSchema *schema; + GSettings *settings; + const gchar *key; + +#ifdef G_OS_WIN32 + gchar *tmp; +#endif + + setlocale (LC_ALL, ""); + textdomain (GETTEXT_PACKAGE); + +#ifdef G_OS_WIN32 + 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 + + if (argc < 2) + return gsettings_help (FALSE, NULL); + + schema_source = g_settings_schema_source_ref (g_settings_schema_source_get_default ()); + + if (argc > 3 && g_str_equal (argv[1], "--schemadir")) + { + GSettingsSchemaSource *parent = schema_source; + GError *error = NULL; + + schema_source = g_settings_schema_source_new_from_directory (argv[2], parent, FALSE, &error); + g_settings_schema_source_unref (parent); + + if (schema_source == NULL) + { + g_printerr ("Could not load schemas from %s: %s\n", argv[2], error->message); + g_clear_error (&error); + + return 1; + } + + /* shift remaining arguments (not correct wrt argv[0], but doesn't matter) */ + argv = argv + 2; + argc -= 2; + } + + if (strcmp (argv[1], "help") == 0) + return gsettings_help (TRUE, argv[2]); + + else if (argc == 2 && strcmp (argv[1], "list-schemas") == 0) + function = gsettings_list_schemas; + + else if (argc == 2 && strcmp (argv[1], "list-relocatable-schemas") == 0) + function = gsettings_list_relocatable_schemas; + + else if (argc == 3 && strcmp (argv[1], "list-keys") == 0) + function = gsettings_list_keys; + + else if (argc == 3 && strcmp (argv[1], "list-children") == 0) + function = gsettings_list_children; + + else if ((argc == 2 || argc == 3) && strcmp (argv[1], "list-recursively") == 0) + function = gsettings_list_recursively; + + else if (argc == 4 && strcmp (argv[1], "range") == 0) + function = gsettings_range; + + else if (argc == 4 && strcmp (argv[1], "get") == 0) + function = gsettings_get; + + else if (argc == 5 && strcmp (argv[1], "set") == 0) + function = gsettings_set; + + else if (argc == 4 && strcmp (argv[1], "reset") == 0) + function = gsettings_reset; + + else if (argc == 3 && strcmp (argv[1], "reset-recursively") == 0) + function = gsettings_reset_recursively; + + else if (argc == 4 && strcmp (argv[1], "writable") == 0) + function = gsettings_writable; + + else if ((argc == 3 || argc == 4) && strcmp (argv[1], "monitor") == 0) + function = gsettings_monitor; + + else + return gsettings_help (FALSE, argv[1]); + + if (argc > 2) + { + gchar **parts; + + if (argv[2][0] == '\0') + { + g_printerr (_("Empty schema name given\n")); + return 1; + } + + parts = g_strsplit (argv[2], ":", 2); + + schema = g_settings_schema_source_lookup (schema_source, parts[0], TRUE); + if (parts[1]) + { + if (!check_relocatable_schema (schema, parts[0]) || !check_path (parts[1])) + return 1; + + settings = g_settings_new_full (schema, NULL, parts[1]); + } + else + { + if (!check_schema (schema, parts[0])) + return 1; + + settings = g_settings_new_full (schema, NULL, NULL); + } + + g_strfreev (parts); + } + else + { + settings = NULL; + schema = NULL; + } + + if (argc > 3) + { + if (!check_key (settings, argv[3])) + return 1; + + key = argv[3]; + } + else + key = NULL; + + (* function) (settings, key, argc > 4 ? argv[4] : NULL); + + if (settings != NULL) + g_object_unref (settings); + if (schema != NULL) + g_settings_schema_unref (schema); + + g_settings_schema_source_unref (schema_source); + + return 0; +} diff --git a/gio/gsettings.c b/gio/gsettings.c new file mode 100644 index 0000000..407a5a0 --- /dev/null +++ b/gio/gsettings.c @@ -0,0 +1,3130 @@ +/* + * 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 + */ + +/* Prelude {{{1 */ +#include "config.h" + +#include +#include + +#include "gsettings.h" + +#include "gdelayedsettingsbackend.h" +#include "gsettingsbackendinternal.h" +#include "gsettings-mapping.h" +#include "gsettingsschema-internal.h" +#include "gaction.h" + +#include "strinfo.c" + +/** + * SECTION:gsettings + * @short_description: High-level API for application settings + * + * The #GSettings class provides a convenient API for storing and retrieving + * application settings. + * + * Reads and writes can be considered to be non-blocking. Reading + * settings with #GSettings is typically extremely fast: on + * approximately the same order of magnitude (but slower than) a + * #GHashTable lookup. Writing settings is also extremely fast in terms + * of time to return to your application, but can be extremely expensive + * for other threads and other processes. Many settings backends + * (including dconf) have lazy initialisation which means in the common + * case of the user using their computer without modifying any settings + * a lot of work can be avoided. For dconf, the D-Bus service doesn't + * even need to be started in this case. For this reason, you should + * only ever modify #GSettings keys in response to explicit user action. + * Particular care should be paid to ensure that modifications are not + * made during startup -- for example, when setting the initial value + * of preferences widgets. The built-in g_settings_bind() functionality + * is careful not to write settings in response to notify signals as a + * result of modifications that it makes to widgets. + * + * When creating a GSettings instance, you have to specify a schema + * that describes the keys in your settings and their types and default + * values, as well as some other information. + * + * Normally, a schema has as fixed path that determines where the settings + * are stored in the conceptual global tree of settings. However, schemas + * can also be 'relocatable', i.e. not equipped with a fixed path. This is + * useful e.g. when the schema describes an 'account', and you want to be + * able to store a arbitrary number of accounts. + * + * Paths must start with and end with a forward slash character ('/') + * and must not contain two sequential slash characters. Paths should + * be chosen based on a domain name associated with the program or + * library to which the settings belong. Examples of paths are + * "/org/gtk/settings/file-chooser/" and "/ca/desrt/dconf-editor/". + * Paths should not start with "/apps/", "/desktop/" or "/system/" as + * they often did in GConf. + * + * Unlike other configuration systems (like GConf), GSettings does not + * restrict keys to basic types like strings and numbers. GSettings stores + * values as #GVariant, and allows any #GVariantType for keys. Key names + * are restricted to lowercase characters, numbers and '-'. Furthermore, + * the names must begin with a lowercase character, must not end + * with a '-', and must not contain consecutive dashes. + * + * Similar to GConf, the default values in GSettings schemas can be + * localized, but the localized values are stored in gettext catalogs + * and looked up with the domain that is specified in the + * gettext-domain attribute of the + * schemalist or schema + * elements and the category that is specified in the l10n attribute of the + * key element. + * + * GSettings uses schemas in a compact binary form that is created + * by the glib-compile-schemas + * utility. The input is a schema description in an XML format that can be + * described by the following DTD: + * |[FIXME: MISSING XINCLUDE CONTENT]| + * + * glib-compile-schemas expects schema files to have the extension .gschema.xml + * + * At runtime, schemas are identified by their id (as specified + * in the id attribute of the + * schema element). The + * convention for schema ids is to use a dotted name, similar in + * style to a D-Bus bus name, e.g. "org.gnome.SessionManager". In particular, + * if the settings are for a specific service that owns a D-Bus bus name, + * the D-Bus bus name and schema id should match. For schemas which deal + * with settings not associated with one named application, the id should + * not use StudlyCaps, e.g. "org.gnome.font-rendering". + * + * In addition to #GVariant types, keys can have types that have enumerated + * types. These can be described by a choice, + * enum or flags element, see + * . The underlying type of + * such a key is string, but you can use g_settings_get_enum(), + * g_settings_set_enum(), g_settings_get_flags(), g_settings_set_flags() + * access the numeric values corresponding to the string value of enum + * and flags keys. + * + * Default values + * + * + * + * + * "Hello, earthlings" + * A greeting + * + * Greeting of the invading martians + * + * + * + * + * (20,30) + * + * + * + *
+ * ]]>
+ * + * Ranges, choices and enumerated types + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * 10 + * + * + * + * + * + * + * + * + * + * + * + * + * 'Joe' + * + * + * + * 'first' + * + * + * + * ["flag1",flag2"] + * + * + * + * ]]> + * + * + * Vendor overrides + * + * Default values are defined in the schemas that get installed by + * an application. Sometimes, it is necessary for a vendor or distributor + * to adjust these defaults. Since patching the XML source for the schema + * is inconvenient and error-prone, + * glib-compile-schemas reads + * so-called 'vendor override' files. These are keyfiles in the same + * directory as the XML schema sources which can override default values. + * The schema id serves as the group name in the key file, and the values + * are expected in serialized GVariant form, as in the following example: + * + * [org.gtk.Example] + * key1='string' + * key2=1.5 + * + * + * + * glib-compile-schemas expects schema files to have the extension + * .gschema.override + * + * + * + * + * Binding + * + * A very convenient feature of GSettings lets you bind #GObject properties + * directly to settings, using g_settings_bind(). Once a GObject property + * has been bound to a setting, changes on either side are automatically + * propagated to the other side. GSettings handles details like + * mapping between GObject and GVariant types, and preventing infinite + * cycles. + * + * + * This makes it very easy to hook up a preferences dialog to the + * underlying settings. To make this even more convenient, GSettings + * looks for a boolean property with the name "sensitivity" and + * automatically binds it to the writability of the bound setting. + * If this 'magic' gets in the way, it can be suppressed with the + * #G_SETTINGS_BIND_NO_SENSITIVITY flag. + * + * + **/ + +struct _GSettingsPrivate +{ + /* where the signals go... */ + GMainContext *main_context; + + GSettingsBackend *backend; + GSettingsSchema *schema; + gchar *path; + + GDelayedSettingsBackend *delayed; +}; + +enum +{ + PROP_0, + PROP_SCHEMA, + PROP_SCHEMA_ID, + PROP_BACKEND, + PROP_PATH, + PROP_HAS_UNAPPLIED, + PROP_DELAY_APPLY +}; + +enum +{ + SIGNAL_WRITABLE_CHANGE_EVENT, + SIGNAL_WRITABLE_CHANGED, + SIGNAL_CHANGE_EVENT, + SIGNAL_CHANGED, + N_SIGNALS +}; + +static guint g_settings_signals[N_SIGNALS]; + +G_DEFINE_TYPE (GSettings, g_settings, G_TYPE_OBJECT) + +/* Signals {{{1 */ +static gboolean +g_settings_real_change_event (GSettings *settings, + const GQuark *keys, + gint n_keys) +{ + gint i; + + if (keys == NULL) + keys = g_settings_schema_list (settings->priv->schema, &n_keys); + + for (i = 0; i < n_keys; i++) + { + const gchar *key = g_quark_to_string (keys[i]); + + if (g_str_has_suffix (key, "/")) + continue; + + g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGED], keys[i], key); + } + + return FALSE; +} + +static gboolean +g_settings_real_writable_change_event (GSettings *settings, + GQuark key) +{ + const GQuark *keys = &key; + gint n_keys = 1; + gint i; + + if (key == 0) + keys = g_settings_schema_list (settings->priv->schema, &n_keys); + + for (i = 0; i < n_keys; i++) + { + const gchar *key = g_quark_to_string (keys[i]); + + if (g_str_has_suffix (key, "/")) + continue; + + g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGED], keys[i], key); + } + + return FALSE; +} + +static void +settings_backend_changed (GObject *target, + GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + GSettings *settings = G_SETTINGS (target); + gboolean ignore_this; + gint i; + + /* We used to assert here: + * + * settings->priv->backend == backend + * + * but it could be the case that a notification is queued for delivery + * while someone calls g_settings_delay() (which changes the backend). + * + * Since the delay backend would just pass that straight through + * anyway, it doesn't make sense to try to detect this case. + * Therefore, we just accept it. + */ + + for (i = 0; key[i] == settings->priv->path[i]; i++); + + if (settings->priv->path[i] == '\0' && + g_settings_schema_has_key (settings->priv->schema, key + i)) + { + GQuark quark; + + quark = g_quark_from_string (key + i); + g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT], + 0, &quark, 1, &ignore_this); + } +} + +static void +settings_backend_path_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path, + gpointer origin_tag) +{ + GSettings *settings = G_SETTINGS (target); + gboolean ignore_this; + + if (g_str_has_prefix (settings->priv->path, path)) + g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT], + 0, NULL, 0, &ignore_this); +} + +static void +settings_backend_keys_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path, + const gchar * const *items, + gpointer origin_tag) +{ + GSettings *settings = G_SETTINGS (target); + gboolean ignore_this; + gint i; + + for (i = 0; settings->priv->path[i] && + settings->priv->path[i] == path[i]; i++); + + if (path[i] == '\0') + { + GQuark quarks[256]; + gint j, l = 0; + + for (j = 0; items[j]; j++) + { + const gchar *item = items[j]; + gint k; + + for (k = 0; item[k] == settings->priv->path[i + k]; k++); + + if (settings->priv->path[i + k] == '\0' && + g_settings_schema_has_key (settings->priv->schema, item + k)) + quarks[l++] = g_quark_from_string (item + k); + + /* "256 quarks ought to be enough for anybody!" + * If this bites you, I'm sorry. Please file a bug. + */ + g_assert (l < 256); + } + + if (l > 0) + g_signal_emit (settings, g_settings_signals[SIGNAL_CHANGE_EVENT], + 0, quarks, l, &ignore_this); + } +} + +static void +settings_backend_writable_changed (GObject *target, + GSettingsBackend *backend, + const gchar *key) +{ + GSettings *settings = G_SETTINGS (target); + gboolean ignore_this; + gint i; + + for (i = 0; key[i] == settings->priv->path[i]; i++); + + if (settings->priv->path[i] == '\0' && + g_settings_schema_has_key (settings->priv->schema, key + i)) + g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT], + 0, g_quark_from_string (key + i), &ignore_this); +} + +static void +settings_backend_path_writable_changed (GObject *target, + GSettingsBackend *backend, + const gchar *path) +{ + GSettings *settings = G_SETTINGS (target); + gboolean ignore_this; + + if (g_str_has_prefix (settings->priv->path, path)) + g_signal_emit (settings, g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT], + 0, (GQuark) 0, &ignore_this); +} + +/* Properties, Construction, Destruction {{{1 */ +static void +g_settings_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSettings *settings = G_SETTINGS (object); + + switch (prop_id) + { + case PROP_SCHEMA: + { + GSettingsSchema *schema; + + schema = g_value_dup_boxed (value); + + /* we receive a set_property() call for "settings-schema" even + * if it was not specified (ie: with NULL value). ->schema + * could already be set at this point (ie: via "schema-id"). + * check for NULL to avoid clobbering the existing value. + */ + if (schema != NULL) + { + g_assert (settings->priv->schema == NULL); + settings->priv->schema = schema; + } + } + break; + + case PROP_SCHEMA_ID: + { + const gchar *schema_id; + + schema_id = g_value_get_string (value); + + /* we receive a set_property() call for both "schema" and + * "schema-id", even if they are not set. Hopefully only one of + * them is non-NULL. + */ + if (schema_id != NULL) + { + GSettingsSchemaSource *default_source; + + g_assert (settings->priv->schema == NULL); + default_source = g_settings_schema_source_get_default (); + + if (default_source == NULL) + g_error ("No GSettings schemas are installed on the system"); + + settings->priv->schema = g_settings_schema_source_lookup (default_source, schema_id, TRUE); + + if (settings->priv->schema == NULL) + g_error ("Settings schema '%s' is not installed\n", schema_id); + } + } + break; + + case PROP_PATH: + settings->priv->path = g_value_dup_string (value); + break; + + case PROP_BACKEND: + settings->priv->backend = g_value_dup_object (value); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_settings_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSettings *settings = G_SETTINGS (object); + + switch (prop_id) + { + case PROP_SCHEMA: + g_value_set_boxed (value, settings->priv->schema); + break; + + case PROP_SCHEMA_ID: + g_value_set_string (value, g_settings_schema_get_id (settings->priv->schema)); + break; + + case PROP_BACKEND: + g_value_set_object (value, settings->priv->backend); + break; + + case PROP_PATH: + g_value_set_string (value, settings->priv->path); + break; + + case PROP_HAS_UNAPPLIED: + g_value_set_boolean (value, g_settings_get_has_unapplied (settings)); + break; + + case PROP_DELAY_APPLY: + g_value_set_boolean (value, settings->priv->delayed != NULL); + break; + + default: + g_assert_not_reached (); + } +} + +static const GSettingsListenerVTable listener_vtable = { + settings_backend_changed, + settings_backend_path_changed, + settings_backend_keys_changed, + settings_backend_writable_changed, + settings_backend_path_writable_changed +}; + +static void +g_settings_constructed (GObject *object) +{ + GSettings *settings = G_SETTINGS (object); + const gchar *schema_path; + + schema_path = g_settings_schema_get_path (settings->priv->schema); + + if (settings->priv->path && schema_path && strcmp (settings->priv->path, schema_path) != 0) + g_error ("settings object created with schema '%s' and path '%s', but path '%s' is specified by schema", + g_settings_schema_get_id (settings->priv->schema), settings->priv->path, schema_path); + + if (settings->priv->path == NULL) + { + if (schema_path == NULL) + g_error ("attempting to create schema '%s' without a path", + g_settings_schema_get_id (settings->priv->schema)); + + settings->priv->path = g_strdup (schema_path); + } + + if (settings->priv->backend == NULL) + settings->priv->backend = g_settings_backend_get_default (); + + g_settings_backend_watch (settings->priv->backend, + &listener_vtable, G_OBJECT (settings), + settings->priv->main_context); + g_settings_backend_subscribe (settings->priv->backend, + settings->priv->path); +} + +static void +g_settings_finalize (GObject *object) +{ + GSettings *settings = G_SETTINGS (object); + + g_settings_backend_unsubscribe (settings->priv->backend, + settings->priv->path); + g_main_context_unref (settings->priv->main_context); + g_object_unref (settings->priv->backend); + g_settings_schema_unref (settings->priv->schema); + g_free (settings->priv->path); + + G_OBJECT_CLASS (g_settings_parent_class)->finalize (object); +} + +static void +g_settings_init (GSettings *settings) +{ + settings->priv = G_TYPE_INSTANCE_GET_PRIVATE (settings, + G_TYPE_SETTINGS, + GSettingsPrivate); + + settings->priv->main_context = g_main_context_ref_thread_default (); +} + +static void +g_settings_class_init (GSettingsClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + class->writable_change_event = g_settings_real_writable_change_event; + class->change_event = g_settings_real_change_event; + + object_class->set_property = g_settings_set_property; + object_class->get_property = g_settings_get_property; + object_class->constructed = g_settings_constructed; + object_class->finalize = g_settings_finalize; + + g_type_class_add_private (object_class, sizeof (GSettingsPrivate)); + + /** + * GSettings::changed: + * @settings: the object on which the signal was emitted + * @key: the name of the key that changed + * + * The "changed" signal is emitted when a key has potentially changed. + * You should call one of the g_settings_get() calls to check the new + * value. + * + * This signal supports detailed connections. You can connect to the + * detailed signal "changed::x" in order to only receive callbacks + * when key "x" changes. + */ + g_settings_signals[SIGNAL_CHANGED] = + g_signal_new ("changed", G_TYPE_SETTINGS, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (GSettingsClass, changed), + NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** + * GSettings::change-event: + * @settings: the object on which the signal was emitted + * @keys: (array length=n_keys) (element-type GQuark) (allow-none): + * an array of #GQuarks for the changed keys, or %NULL + * @n_keys: the length of the @keys array, or 0 + * + * The "change-event" signal is emitted once per change event that + * affects this settings object. You should connect to this signal + * only if you are interested in viewing groups of changes before they + * are split out into multiple emissions of the "changed" signal. + * For most use cases it is more appropriate to use the "changed" signal. + * + * In the event that the change event applies to one or more specified + * keys, @keys will be an array of #GQuark of length @n_keys. In the + * event that the change event applies to the #GSettings object as a + * whole (ie: potentially every key has been changed) then @keys will + * be %NULL and @n_keys will be 0. + * + * The default handler for this signal invokes the "changed" signal + * for each affected key. If any other connected handler returns + * %TRUE then this default functionality will be suppressed. + * + * Returns: %TRUE to stop other handlers from being invoked for the + * event. FALSE to propagate the event further. + */ + g_settings_signals[SIGNAL_CHANGE_EVENT] = + g_signal_new ("change-event", G_TYPE_SETTINGS, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GSettingsClass, change_event), + g_signal_accumulator_true_handled, NULL, + NULL, + G_TYPE_BOOLEAN, 2, G_TYPE_POINTER, G_TYPE_INT); + + /** + * GSettings::writable-changed: + * @settings: the object on which the signal was emitted + * @key: the key + * + * The "writable-changed" signal is emitted when the writability of a + * key has potentially changed. You should call + * g_settings_is_writable() in order to determine the new status. + * + * This signal supports detailed connections. You can connect to the + * detailed signal "writable-changed::x" in order to only receive + * callbacks when the writability of "x" changes. + */ + g_settings_signals[SIGNAL_WRITABLE_CHANGED] = + g_signal_new ("writable-changed", G_TYPE_SETTINGS, + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + G_STRUCT_OFFSET (GSettingsClass, writable_changed), + NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** + * GSettings::writable-change-event: + * @settings: the object on which the signal was emitted + * @key: the quark of the key, or 0 + * + * The "writable-change-event" signal is emitted once per writability + * change event that affects this settings object. You should connect + * to this signal if you are interested in viewing groups of changes + * before they are split out into multiple emissions of the + * "writable-changed" signal. For most use cases it is more + * appropriate to use the "writable-changed" signal. + * + * In the event that the writability change applies only to a single + * key, @key will be set to the #GQuark for that key. In the event + * that the writability change affects the entire settings object, + * @key will be 0. + * + * The default handler for this signal invokes the "writable-changed" + * and "changed" signals for each affected key. This is done because + * changes in writability might also imply changes in value (if for + * example, a new mandatory setting is introduced). If any other + * connected handler returns %TRUE then this default functionality + * will be suppressed. + * + * Returns: %TRUE to stop other handlers from being invoked for the + * event. FALSE to propagate the event further. + */ + g_settings_signals[SIGNAL_WRITABLE_CHANGE_EVENT] = + g_signal_new ("writable-change-event", G_TYPE_SETTINGS, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GSettingsClass, writable_change_event), + g_signal_accumulator_true_handled, NULL, + NULL, G_TYPE_BOOLEAN, 1, G_TYPE_UINT); + + /** + * GSettings:context: + * + * The name of the context that the settings are stored in. + */ + g_object_class_install_property (object_class, PROP_BACKEND, + g_param_spec_object ("backend", + P_("GSettingsBackend"), + P_("The GSettingsBackend for this settings object"), + G_TYPE_SETTINGS_BACKEND, G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:settings-schema: + * + * The #GSettingsSchema describing the types of keys for this + * #GSettings object. + * + * Ideally, this property would be called 'schema'. #GSettingsSchema + * has only existed since version 2.32, however, and before then the + * 'schema' property was used to refer to the ID of the schema rather + * than the schema itself. Take care. + */ + g_object_class_install_property (object_class, PROP_SCHEMA, + g_param_spec_boxed ("settings-schema", + P_("schema"), + P_("The GSettingsSchema for this settings object"), + G_TYPE_SETTINGS_SCHEMA, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:schema: + * + * The name of the schema that describes the types of keys + * for this #GSettings object. + * + * The type of this property is *not* #GSettingsSchema. + * #GSettingsSchema has only existed since version 2.32 and + * unfortunately this name was used in previous versions to refer to + * the schema ID rather than the schema itself. Take care to use the + * 'settings-schema' property if you wish to pass in a + * #GSettingsSchema. + * + * Deprecated:2.32:Use the 'schema-id' property instead. In a future + * version, this property may instead refer to a #GSettingsSchema. + */ + g_object_class_install_property (object_class, PROP_SCHEMA_ID, + g_param_spec_string ("schema", + P_("Schema name"), + P_("The name of the schema for this settings object"), + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_DEPRECATED | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:schema-id: + * + * The name of the schema that describes the types of keys + * for this #GSettings object. + */ + g_object_class_install_property (object_class, PROP_SCHEMA_ID, + g_param_spec_string ("schema-id", + P_("Schema name"), + P_("The name of the schema for this settings object"), + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:path: + * + * The path within the backend where the settings are stored. + */ + g_object_class_install_property (object_class, PROP_PATH, + g_param_spec_string ("path", + P_("Base path"), + P_("The path within the backend where the settings are"), + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:has-unapplied: + * + * If this property is %TRUE, the #GSettings object has outstanding + * changes that will be applied when g_settings_apply() is called. + */ + g_object_class_install_property (object_class, PROP_HAS_UNAPPLIED, + g_param_spec_boolean ("has-unapplied", + P_("Has unapplied changes"), + P_("TRUE if there are outstanding changes to apply()"), + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GSettings:delay-apply: + * + * Whether the #GSettings object is in 'delay-apply' mode. See + * g_settings_delay() for details. + * + * Since: 2.28 + */ + g_object_class_install_property (object_class, PROP_DELAY_APPLY, + g_param_spec_boolean ("delay-apply", + P_("Delay-apply mode"), + P_("Whether this settings object is in 'delay-apply' mode"), + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +} + +/* Construction (new, new_with_path, etc.) {{{1 */ +/** + * g_settings_new: + * @schema_id: the id of the schema + * + * Creates a new #GSettings object with the schema specified by + * @schema_id. + * + * Signals on the newly created #GSettings object will be dispatched + * via the thread-default #GMainContext in effect at the time of the + * call to g_settings_new(). The new #GSettings will hold a reference + * on the context. See g_main_context_push_thread_default(). + * + * Returns: a new #GSettings object + * + * Since: 2.26 + */ +GSettings * +g_settings_new (const gchar *schema_id) +{ + g_return_val_if_fail (schema_id != NULL, NULL); + + return g_object_new (G_TYPE_SETTINGS, + "schema-id", schema_id, + NULL); +} + +/** + * g_settings_new_with_path: + * @schema_id: the id of the schema + * @path: the path to use + * + * Creates a new #GSettings object with the relocatable schema specified + * by @schema_id and a given path. + * + * You only need to do this if you want to directly create a settings + * object with a schema that doesn't have a specified path of its own. + * That's quite rare. + * + * It is a programmer error to call this function for a schema that + * has an explicitly specified path. + * + * Returns: a new #GSettings object + * + * Since: 2.26 + */ +GSettings * +g_settings_new_with_path (const gchar *schema_id, + const gchar *path) +{ + g_return_val_if_fail (schema_id != NULL, NULL); + g_return_val_if_fail (path != NULL, NULL); + + return g_object_new (G_TYPE_SETTINGS, + "schema-id", schema_id, + "path", path, + NULL); +} + +/** + * g_settings_new_with_backend: + * @schema_id: the id of the schema + * @backend: the #GSettingsBackend to use + * + * Creates a new #GSettings object with the schema specified by + * @schema_id and a given #GSettingsBackend. + * + * Creating a #GSettings object with a different backend allows accessing + * settings from a database other than the usual one. For example, it may make + * sense to pass a backend corresponding to the "defaults" settings database on + * the system to get a settings object that modifies the system default + * settings instead of the settings for this user. + * + * Returns: a new #GSettings object + * + * Since: 2.26 + */ +GSettings * +g_settings_new_with_backend (const gchar *schema_id, + GSettingsBackend *backend) +{ + g_return_val_if_fail (schema_id != NULL, NULL); + g_return_val_if_fail (G_IS_SETTINGS_BACKEND (backend), NULL); + + return g_object_new (G_TYPE_SETTINGS, + "schema-id", schema_id, + "backend", backend, + NULL); +} + +/** + * g_settings_new_with_backend_and_path: + * @schema_id: the id of the schema + * @backend: the #GSettingsBackend to use + * @path: the path to use + * + * Creates a new #GSettings object with the schema specified by + * @schema_id and a given #GSettingsBackend and path. + * + * This is a mix of g_settings_new_with_backend() and + * g_settings_new_with_path(). + * + * Returns: a new #GSettings object + * + * Since: 2.26 + */ +GSettings * +g_settings_new_with_backend_and_path (const gchar *schema_id, + GSettingsBackend *backend, + const gchar *path) +{ + g_return_val_if_fail (schema_id != NULL, NULL); + g_return_val_if_fail (G_IS_SETTINGS_BACKEND (backend), NULL); + g_return_val_if_fail (path != NULL, NULL); + + return g_object_new (G_TYPE_SETTINGS, + "schema-id", schema_id, + "backend", backend, + "path", path, + NULL); +} + +/** + * g_settings_new_full: + * @schema: a #GSettingsSchema + * @backend: (allow-none): a #GSettingsBackend + * @path: (allow-none): the path to use + * + * Creates a new #GSettings object with a given schema, backend and + * path. + * + * It should be extremely rare that you ever want to use this function. + * It is made available for advanced use-cases (such as plugin systems + * that want to provide access to schemas loaded from custom locations, + * etc). + * + * At the most basic level, a #GSettings object is a pure composition of + * 4 things: a #GSettingsSchema, a #GSettingsBackend, a path within that + * backend, and a #GMainContext to which signals are dispatched. + * + * This constructor therefore gives you full control over constructing + * #GSettings instances. The first 4 parameters are given directly as + * @schema, @backend and @path, and the main context is taken from the + * thread-default (as per g_settings_new()). + * + * If @backend is %NULL then the default backend is used. + * + * If @path is %NULL then the path from the schema is used. It is an + * error f @path is %NULL and the schema has no path of its own or if + * @path is non-%NULL and not equal to the path that the schema does + * have. + * + * Returns: a new #GSettings object + * + * Since: 2.32 + */ +GSettings * +g_settings_new_full (GSettingsSchema *schema, + GSettingsBackend *backend, + const gchar *path) +{ + return g_object_new (G_TYPE_SETTINGS, + "settings-schema", schema, + "backend", backend, + "path", path, + NULL); +} + +/* Internal read/write utilities {{{1 */ +static gboolean +g_settings_write_to_backend (GSettings *settings, + GSettingsSchemaKey *key, + GVariant *value) +{ + gboolean success; + gchar *path; + + path = g_strconcat (settings->priv->path, key->name, NULL); + success = g_settings_backend_write (settings->priv->backend, path, value, NULL); + g_free (path); + + return success; +} + +static GVariant * +g_settings_read_from_backend (GSettings *settings, + GSettingsSchemaKey *key) +{ + GVariant *value; + GVariant *fixup; + gchar *path; + + path = g_strconcat (settings->priv->path, key->name, NULL); + value = g_settings_backend_read (settings->priv->backend, path, key->type, FALSE); + g_free (path); + + if (value != NULL) + { + fixup = g_settings_schema_key_range_fixup (key, value); + g_variant_unref (value); + } + else + fixup = NULL; + + return fixup; +} + +/* Public Get/Set API {{{1 (get, get_value, set, set_value, get_mapped) */ +/** + * g_settings_get_value: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored in @settings for @key. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings. + * + * Returns: a new #GVariant + * + * Since: 2.26 + */ +GVariant * +g_settings_get_value (GSettings *settings, + const gchar *key) +{ + GSettingsSchemaKey skey; + GVariant *value; + + g_return_val_if_fail (G_IS_SETTINGS (settings), NULL); + g_return_val_if_fail (key != NULL, NULL); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + value = g_settings_read_from_backend (settings, &skey); + + if (value == NULL) + value = g_settings_schema_key_get_translated_default (&skey); + + if (value == NULL) + value = g_variant_ref (skey.default_value); + + g_settings_schema_key_clear (&skey); + + return value; +} + +/** + * g_settings_get_enum: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored in @settings for @key and converts it + * to the enum value that it represents. + * + * In order to use this function the type of the value must be a string + * and it must be marked in the schema file as an enumerated type. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or is not marked as an enumerated type. + * + * If the value stored in the configuration database is not a valid + * value for the enumerated type then this function will return the + * default value. + * + * Returns: the enum value + * + * Since: 2.26 + **/ +gint +g_settings_get_enum (GSettings *settings, + const gchar *key) +{ + GSettingsSchemaKey skey; + GVariant *value; + gint result; + + g_return_val_if_fail (G_IS_SETTINGS (settings), -1); + g_return_val_if_fail (key != NULL, -1); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (!skey.is_enum) + { + g_critical ("g_settings_get_enum() called on key `%s' which is not " + "associated with an enumerated type", skey.name); + g_settings_schema_key_clear (&skey); + return -1; + } + + value = g_settings_read_from_backend (settings, &skey); + + if (value == NULL) + value = g_settings_schema_key_get_translated_default (&skey); + + if (value == NULL) + value = g_variant_ref (skey.default_value); + + result = g_settings_schema_key_to_enum (&skey, value); + g_settings_schema_key_clear (&skey); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_enum: + * @settings: a #GSettings object + * @key: a key, within @settings + * @value: an enumerated value + * + * Looks up the enumerated type nick for @value and writes it to @key, + * within @settings. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or is not marked as an enumerated type, or for + * @value not to be a valid value for the named type. + * + * After performing the write, accessing @key directly with + * g_settings_get_string() will return the 'nick' associated with + * @value. + * + * Returns: %TRUE, if the set succeeds + **/ +gboolean +g_settings_set_enum (GSettings *settings, + const gchar *key, + gint value) +{ + GSettingsSchemaKey skey; + GVariant *variant; + gboolean success; + + g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (!skey.is_enum) + { + g_critical ("g_settings_set_enum() called on key `%s' which is not " + "associated with an enumerated type", skey.name); + return FALSE; + } + + if (!(variant = g_settings_schema_key_from_enum (&skey, value))) + { + g_critical ("g_settings_set_enum(): invalid enum value %d for key `%s' " + "in schema `%s'. Doing nothing.", value, skey.name, + g_settings_schema_get_id (skey.schema)); + g_settings_schema_key_clear (&skey); + return FALSE; + } + + success = g_settings_write_to_backend (settings, &skey, variant); + g_settings_schema_key_clear (&skey); + + return success; +} + +/** + * g_settings_get_flags: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored in @settings for @key and converts it + * to the flags value that it represents. + * + * In order to use this function the type of the value must be an array + * of strings and it must be marked in the schema file as an flags type. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or is not marked as a flags type. + * + * If the value stored in the configuration database is not a valid + * value for the flags type then this function will return the default + * value. + * + * Returns: the flags value + * + * Since: 2.26 + **/ +guint +g_settings_get_flags (GSettings *settings, + const gchar *key) +{ + GSettingsSchemaKey skey; + GVariant *value; + guint result; + + g_return_val_if_fail (G_IS_SETTINGS (settings), -1); + g_return_val_if_fail (key != NULL, -1); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (!skey.is_flags) + { + g_critical ("g_settings_get_flags() called on key `%s' which is not " + "associated with a flags type", skey.name); + g_settings_schema_key_clear (&skey); + return -1; + } + + value = g_settings_read_from_backend (settings, &skey); + + if (value == NULL) + value = g_settings_schema_key_get_translated_default (&skey); + + if (value == NULL) + value = g_variant_ref (skey.default_value); + + result = g_settings_schema_key_to_flags (&skey, value); + g_settings_schema_key_clear (&skey); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_flags: + * @settings: a #GSettings object + * @key: a key, within @settings + * @value: a flags value + * + * Looks up the flags type nicks for the bits specified by @value, puts + * them in an array of strings and writes the array to @key, within + * @settings. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or is not marked as a flags type, or for @value + * to contain any bits that are not value for the named type. + * + * After performing the write, accessing @key directly with + * g_settings_get_strv() will return an array of 'nicks'; one for each + * bit in @value. + * + * Returns: %TRUE, if the set succeeds + **/ +gboolean +g_settings_set_flags (GSettings *settings, + const gchar *key, + guint value) +{ + GSettingsSchemaKey skey; + GVariant *variant; + gboolean success; + + g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (!skey.is_flags) + { + g_critical ("g_settings_set_flags() called on key `%s' which is not " + "associated with a flags type", skey.name); + return FALSE; + } + + if (!(variant = g_settings_schema_key_from_flags (&skey, value))) + { + g_critical ("g_settings_set_flags(): invalid flags value 0x%08x " + "for key `%s' in schema `%s'. Doing nothing.", + value, skey.name, g_settings_schema_get_id (skey.schema)); + g_settings_schema_key_clear (&skey); + return FALSE; + } + + success = g_settings_write_to_backend (settings, &skey, variant); + g_settings_schema_key_clear (&skey); + + return success; +} + +/** + * g_settings_set_value: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: a #GVariant of the correct type + * + * Sets @key in @settings to @value. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or for @value to have the incorrect type, per + * the schema. + * + * If @value is floating then this function consumes the reference. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + **/ +gboolean +g_settings_set_value (GSettings *settings, + const gchar *key, + GVariant *value) +{ + GSettingsSchemaKey skey; + gboolean success; + + g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (!g_settings_schema_key_type_check (&skey, value)) + { + g_critical ("g_settings_set_value: key '%s' in '%s' expects type '%s', but a GVariant of type '%s' was given", + key, + g_settings_schema_get_id (settings->priv->schema), + g_variant_type_peek_string (skey.type), + g_variant_get_type_string (value)); + + return FALSE; + } + + if (!g_settings_schema_key_range_check (&skey, value)) + { + g_warning ("g_settings_set_value: value for key '%s' in schema '%s' " + "is outside of valid range", + key, + g_settings_schema_get_id (settings->priv->schema)); + + return FALSE; + } + + success = g_settings_write_to_backend (settings, &skey, value); + g_settings_schema_key_clear (&skey); + + return success; +} + +/** + * g_settings_get: + * @settings: a #GSettings object + * @key: the key to get the value for + * @format: a #GVariant format string + * @...: arguments as per @format + * + * Gets the value that is stored at @key in @settings. + * + * A convenience function that combines g_settings_get_value() with + * g_variant_get(). + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or for the #GVariantType of @format to mismatch + * the type given in the schema. + * + * Since: 2.26 + */ +void +g_settings_get (GSettings *settings, + const gchar *key, + const gchar *format, + ...) +{ + GVariant *value; + va_list ap; + + value = g_settings_get_value (settings, key); + + va_start (ap, format); + g_variant_get_va (value, format, NULL, &ap); + va_end (ap); + + g_variant_unref (value); +} + +/** + * g_settings_set: + * @settings: a #GSettings object + * @key: the name of the key to set + * @format: a #GVariant format string + * @...: arguments as per @format + * + * Sets @key in @settings to @value. + * + * A convenience function that combines g_settings_set_value() with + * g_variant_new(). + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings or for the #GVariantType of @format to mismatch + * the type given in the schema. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set (GSettings *settings, + const gchar *key, + const gchar *format, + ...) +{ + GVariant *value; + va_list ap; + + va_start (ap, format); + value = g_variant_new_va (format, NULL, &ap); + va_end (ap); + + return g_settings_set_value (settings, key, value); +} + +/** + * g_settings_get_mapped: + * @settings: a #GSettings object + * @key: the key to get the value for + * @mapping: (scope call): the function to map the value in the + * settings database to the value used by the application + * @user_data: user data for @mapping + * + * Gets the value that is stored at @key in @settings, subject to + * application-level validation/mapping. + * + * You should use this function when the application needs to perform + * some processing on the value of the key (for example, parsing). The + * @mapping function performs that processing. If the function + * indicates that the processing was unsuccessful (due to a parse error, + * for example) then the mapping is tried again with another value. + * + * This allows a robust 'fall back to defaults' behaviour to be + * implemented somewhat automatically. + * + * The first value that is tried is the user's setting for the key. If + * the mapping function fails to map this value, other values may be + * tried in an unspecified order (system or site defaults, translated + * schema default values, untranslated schema default values, etc). + * + * If the mapping function fails for all possible values, one additional + * attempt is made: the mapping function is called with a %NULL value. + * If the mapping function still indicates failure at this point then + * the application will be aborted. + * + * The result parameter for the @mapping function is pointed to a + * #gpointer which is initially set to %NULL. The same pointer is given + * to each invocation of @mapping. The final value of that #gpointer is + * what is returned by this function. %NULL is valid; it is returned + * just as any other value would be. + * + * Returns: (transfer full): the result, which may be %NULL + **/ +gpointer +g_settings_get_mapped (GSettings *settings, + const gchar *key, + GSettingsGetMapping mapping, + gpointer user_data) +{ + gpointer result = NULL; + GSettingsSchemaKey skey; + GVariant *value; + gboolean okay; + + g_return_val_if_fail (G_IS_SETTINGS (settings), NULL); + g_return_val_if_fail (key != NULL, NULL); + g_return_val_if_fail (mapping != NULL, NULL); + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if ((value = g_settings_read_from_backend (settings, &skey))) + { + okay = mapping (value, &result, user_data); + g_variant_unref (value); + if (okay) goto okay; + } + + if ((value = g_settings_schema_key_get_translated_default (&skey))) + { + okay = mapping (value, &result, user_data); + g_variant_unref (value); + if (okay) goto okay; + } + + if (mapping (skey.default_value, &result, user_data)) + goto okay; + + if (!mapping (NULL, &result, user_data)) + g_error ("The mapping function given to g_settings_get_mapped() for key " + "`%s' in schema `%s' returned FALSE when given a NULL value.", + key, g_settings_schema_get_id (settings->priv->schema)); + + okay: + g_settings_schema_key_clear (&skey); + + return result; +} + +/* Convenience API (get, set_string, int, double, boolean, strv) {{{1 */ +/** + * g_settings_get_string: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored at @key in @settings. + * + * A convenience variant of g_settings_get() for strings. + * + * It is a programmer error to give a @key that isn't specified as + * having a string type in the schema for @settings. + * + * Returns: a newly-allocated string + * + * Since: 2.26 + */ +gchar * +g_settings_get_string (GSettings *settings, + const gchar *key) +{ + GVariant *value; + gchar *result; + + value = g_settings_get_value (settings, key); + result = g_variant_dup_string (value, NULL); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_string: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: the value to set it to + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for strings. + * + * It is a programmer error to give a @key that isn't specified as + * having a string type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set_string (GSettings *settings, + const gchar *key, + const gchar *value) +{ + return g_settings_set_value (settings, key, g_variant_new_string (value)); +} + +/** + * g_settings_get_int: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored at @key in @settings. + * + * A convenience variant of g_settings_get() for 32-bit integers. + * + * It is a programmer error to give a @key that isn't specified as + * having a int32 type in the schema for @settings. + * + * Returns: an integer + * + * Since: 2.26 + */ +gint +g_settings_get_int (GSettings *settings, + const gchar *key) +{ + GVariant *value; + gint result; + + value = g_settings_get_value (settings, key); + result = g_variant_get_int32 (value); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_int: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: the value to set it to + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for 32-bit integers. + * + * It is a programmer error to give a @key that isn't specified as + * having a int32 type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set_int (GSettings *settings, + const gchar *key, + gint value) +{ + return g_settings_set_value (settings, key, g_variant_new_int32 (value)); +} + +/** + * g_settings_get_uint: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored at @key in @settings. + * + * A convenience variant of g_settings_get() for 32-bit unsigned + * integers. + * + * It is a programmer error to give a @key that isn't specified as + * having a uint32 type in the schema for @settings. + * + * Returns: an unsigned integer + * + * Since: 2.30 + */ +guint +g_settings_get_uint (GSettings *settings, + const gchar *key) +{ + GVariant *value; + guint result; + + value = g_settings_get_value (settings, key); + result = g_variant_get_uint32 (value); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_uint: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: the value to set it to + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for 32-bit unsigned + * integers. + * + * It is a programmer error to give a @key that isn't specified as + * having a uint32 type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.30 + */ +gboolean +g_settings_set_uint (GSettings *settings, + const gchar *key, + guint value) +{ + return g_settings_set_value (settings, key, g_variant_new_uint32 (value)); +} + +/** + * g_settings_get_double: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored at @key in @settings. + * + * A convenience variant of g_settings_get() for doubles. + * + * It is a programmer error to give a @key that isn't specified as + * having a 'double' type in the schema for @settings. + * + * Returns: a double + * + * Since: 2.26 + */ +gdouble +g_settings_get_double (GSettings *settings, + const gchar *key) +{ + GVariant *value; + gdouble result; + + value = g_settings_get_value (settings, key); + result = g_variant_get_double (value); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_double: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: the value to set it to + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for doubles. + * + * It is a programmer error to give a @key that isn't specified as + * having a 'double' type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set_double (GSettings *settings, + const gchar *key, + gdouble value) +{ + return g_settings_set_value (settings, key, g_variant_new_double (value)); +} + +/** + * g_settings_get_boolean: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * Gets the value that is stored at @key in @settings. + * + * A convenience variant of g_settings_get() for booleans. + * + * It is a programmer error to give a @key that isn't specified as + * having a boolean type in the schema for @settings. + * + * Returns: a boolean + * + * Since: 2.26 + */ +gboolean +g_settings_get_boolean (GSettings *settings, + const gchar *key) +{ + GVariant *value; + gboolean result; + + value = g_settings_get_value (settings, key); + result = g_variant_get_boolean (value); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_boolean: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: the value to set it to + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for booleans. + * + * It is a programmer error to give a @key that isn't specified as + * having a boolean type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set_boolean (GSettings *settings, + const gchar *key, + gboolean value) +{ + return g_settings_set_value (settings, key, g_variant_new_boolean (value)); +} + +/** + * g_settings_get_strv: + * @settings: a #GSettings object + * @key: the key to get the value for + * + * A convenience variant of g_settings_get() for string arrays. + * + * It is a programmer error to give a @key that isn't specified as + * having an array of strings type in the schema for @settings. + * + * Returns: (array zero-terminated=1) (transfer full): a + * newly-allocated, %NULL-terminated array of strings, the value that + * is stored at @key in @settings. + * + * Since: 2.26 + */ +gchar ** +g_settings_get_strv (GSettings *settings, + const gchar *key) +{ + GVariant *value; + gchar **result; + + value = g_settings_get_value (settings, key); + result = g_variant_dup_strv (value, NULL); + g_variant_unref (value); + + return result; +} + +/** + * g_settings_set_strv: + * @settings: a #GSettings object + * @key: the name of the key to set + * @value: (allow-none) (array zero-terminated=1): the value to set it to, or %NULL + * + * Sets @key in @settings to @value. + * + * A convenience variant of g_settings_set() for string arrays. If + * @value is %NULL, then @key is set to be the empty array. + * + * It is a programmer error to give a @key that isn't specified as + * having an array of strings type in the schema for @settings. + * + * Returns: %TRUE if setting the key succeeded, + * %FALSE if the key was not writable + * + * Since: 2.26 + */ +gboolean +g_settings_set_strv (GSettings *settings, + const gchar *key, + const gchar * const *value) +{ + GVariant *array; + + if (value != NULL) + array = g_variant_new_strv (value, -1); + else + array = g_variant_new_strv (NULL, 0); + + return g_settings_set_value (settings, key, array); +} + +/* Delayed apply (delay, apply, revert, get_has_unapplied) {{{1 */ +/** + * g_settings_delay: + * @settings: a #GSettings object + * + * Changes the #GSettings object into 'delay-apply' mode. In this + * mode, changes to @settings are not immediately propagated to the + * backend, but kept locally until g_settings_apply() is called. + * + * Since: 2.26 + */ +void +g_settings_delay (GSettings *settings) +{ + g_return_if_fail (G_IS_SETTINGS (settings)); + + if (settings->priv->delayed) + return; + + settings->priv->delayed = + g_delayed_settings_backend_new (settings->priv->backend, + settings, + settings->priv->main_context); + g_settings_backend_unwatch (settings->priv->backend, G_OBJECT (settings)); + g_object_unref (settings->priv->backend); + + settings->priv->backend = G_SETTINGS_BACKEND (settings->priv->delayed); + g_settings_backend_watch (settings->priv->backend, + &listener_vtable, G_OBJECT (settings), + settings->priv->main_context); + + g_object_notify (G_OBJECT (settings), "delay-apply"); +} + +/** + * g_settings_apply: + * @settings: a #GSettings instance + * + * Applies any changes that have been made to the settings. This + * function does nothing unless @settings is in 'delay-apply' mode; + * see g_settings_delay(). In the normal case settings are always + * applied immediately. + **/ +void +g_settings_apply (GSettings *settings) +{ + if (settings->priv->delayed) + { + GDelayedSettingsBackend *delayed; + + delayed = G_DELAYED_SETTINGS_BACKEND (settings->priv->backend); + g_delayed_settings_backend_apply (delayed); + } +} + +/** + * g_settings_revert: + * @settings: a #GSettings instance + * + * Reverts all non-applied changes to the settings. This function + * does nothing unless @settings is in 'delay-apply' mode; see + * g_settings_delay(). In the normal case settings are always applied + * immediately. + * + * Change notifications will be emitted for affected keys. + **/ +void +g_settings_revert (GSettings *settings) +{ + if (settings->priv->delayed) + { + GDelayedSettingsBackend *delayed; + + delayed = G_DELAYED_SETTINGS_BACKEND (settings->priv->backend); + g_delayed_settings_backend_revert (delayed); + } +} + +/** + * g_settings_get_has_unapplied: + * @settings: a #GSettings object + * + * Returns whether the #GSettings object has any unapplied + * changes. This can only be the case if it is in 'delayed-apply' mode. + * + * Returns: %TRUE if @settings has unapplied changes + * + * Since: 2.26 + */ +gboolean +g_settings_get_has_unapplied (GSettings *settings) +{ + g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE); + + return settings->priv->delayed && + g_delayed_settings_backend_get_has_unapplied ( + G_DELAYED_SETTINGS_BACKEND (settings->priv->backend)); +} + +/* Extra API (reset, sync, get_child, is_writable, list_*, ranges) {{{1 */ +/** + * g_settings_reset: + * @settings: a #GSettings object + * @key: the name of a key + * + * Resets @key to its default value. + * + * This call resets the key, as much as possible, to its default value. + * That might the value specified in the schema or the one set by the + * administrator. + **/ +void +g_settings_reset (GSettings *settings, + const gchar *key) +{ + gchar *path; + + path = g_strconcat (settings->priv->path, key, NULL); + g_settings_backend_reset (settings->priv->backend, path, NULL); + g_free (path); +} + +/** + * g_settings_sync: + * + * Ensures that all pending operations for the given are complete for + * the default backend. + * + * Writes made to a #GSettings are handled asynchronously. For this + * reason, it is very unlikely that the changes have it to disk by the + * time g_settings_set() returns. + * + * This call will block until all of the writes have made it to the + * backend. Since the mainloop is not running, no change notifications + * will be dispatched during this call (but some may be queued by the + * time the call is done). + **/ +void +g_settings_sync (void) +{ + g_settings_backend_sync_default (); +} + +/** + * g_settings_is_writable: + * @settings: a #GSettings object + * @name: the name of a key + * + * Finds out if a key can be written or not + * + * Returns: %TRUE if the key @name is writable + * + * Since: 2.26 + */ +gboolean +g_settings_is_writable (GSettings *settings, + const gchar *name) +{ + gboolean writable; + gchar *path; + + g_return_val_if_fail (G_IS_SETTINGS (settings), FALSE); + + path = g_strconcat (settings->priv->path, name, NULL); + writable = g_settings_backend_get_writable (settings->priv->backend, path); + g_free (path); + + return writable; +} + +/** + * g_settings_get_child: + * @settings: a #GSettings object + * @name: the name of the 'child' schema + * + * Creates a 'child' settings object which has a base path of + * base-path/@name, where + * base-path is the base path of @settings. + * + * The schema for the child settings object must have been declared + * in the schema of @settings using a child element. + * + * Returns: (transfer full): a 'child' settings object + * + * Since: 2.26 + */ +GSettings * +g_settings_get_child (GSettings *settings, + const gchar *name) +{ + const gchar *child_schema; + gchar *child_path; + gchar *child_name; + GSettings *child; + + g_return_val_if_fail (G_IS_SETTINGS (settings), NULL); + + child_name = g_strconcat (name, "/", NULL); + child_schema = g_settings_schema_get_string (settings->priv->schema, + child_name); + if (child_schema == NULL) + g_error ("Schema '%s' has no child '%s'", + g_settings_schema_get_id (settings->priv->schema), name); + + child_path = g_strconcat (settings->priv->path, child_name, NULL); + child = g_object_new (G_TYPE_SETTINGS, + "schema-id", child_schema, + "path", child_path, + NULL); + g_free (child_path); + g_free (child_name); + + return child; +} + +/** + * g_settings_list_keys: + * @settings: a #GSettings object + * + * Introspects the list of keys on @settings. + * + * You should probably not be calling this function from "normal" code + * (since you should already know what keys are in your schema). This + * function is intended for introspection reasons. + * + * You should free the return value with g_strfreev() when you are done + * with it. + * + * Returns: (transfer full) (element-type utf8): a list of the keys on @settings + */ +gchar ** +g_settings_list_keys (GSettings *settings) +{ + const GQuark *keys; + gchar **strv; + gint n_keys; + gint i, j; + + keys = g_settings_schema_list (settings->priv->schema, &n_keys); + strv = g_new (gchar *, n_keys + 1); + for (i = j = 0; i < n_keys; i++) + { + const gchar *key = g_quark_to_string (keys[i]); + + if (!g_str_has_suffix (key, "/")) + strv[j++] = g_strdup (key); + } + strv[j] = NULL; + + return strv; +} + +/** + * g_settings_list_children: + * @settings: a #GSettings object + * + * Gets the list of children on @settings. + * + * The list is exactly the list of strings for which it is not an error + * to call g_settings_get_child(). + * + * For GSettings objects that are lists, this value can change at any + * time and you should connect to the "children-changed" signal to watch + * for those changes. Note that there is a race condition here: you may + * request a child after listing it only for it to have been destroyed + * in the meantime. For this reason, g_settings_get_child() may return + * %NULL even for a child that was listed by this function. + * + * For GSettings objects that are not lists, you should probably not be + * calling this function from "normal" code (since you should already + * know what children are in your schema). This function may still be + * useful there for introspection reasons, however. + * + * You should free the return value with g_strfreev() when you are done + * with it. + * + * Returns: (transfer full) (element-type utf8): a list of the children on @settings + */ +gchar ** +g_settings_list_children (GSettings *settings) +{ + const GQuark *keys; + gchar **strv; + gint n_keys; + gint i, j; + + keys = g_settings_schema_list (settings->priv->schema, &n_keys); + strv = g_new (gchar *, n_keys + 1); + for (i = j = 0; i < n_keys; i++) + { + const gchar *key = g_quark_to_string (keys[i]); + + if (g_str_has_suffix (key, "/")) + { + gint length = strlen (key); + + strv[j] = g_memdup (key, length); + strv[j][length - 1] = '\0'; + j++; + } + } + strv[j] = NULL; + + return strv; +} + +/** + * g_settings_get_range: + * @settings: a #GSettings + * @key: the key to query the range of + * + * Queries the range of a key. + * + * This function will return a #GVariant that fully describes the range + * of values that are valid for @key. + * + * The type of #GVariant returned is (sv). The + * string describes the type of range restriction in effect. The type + * and meaning of the value contained in the variant depends on the + * string. + * + * If the string is 'type' then the variant contains + * an empty array. The element type of that empty array is the expected + * type of value and all values of that type are valid. + * + * If the string is 'enum' then the variant contains + * an array enumerating the possible values. Each item in the array is + * a possible valid value and no other values are valid. + * + * If the string is 'flags' then the variant contains + * an array. Each item in the array is a value that may appear zero or + * one times in an array to be used as the value for this key. For + * example, if the variant contained the array ['x', + * 'y'] then the valid values for the key would be + * [], ['x'], + * ['y'], ['x', 'y'] and + * ['y', 'x']. + * + * Finally, if the string is 'range' then the variant + * contains a pair of like-typed values -- the minimum and maximum + * permissible values for this key. + * + * This information should not be used by normal programs. It is + * considered to be a hint for introspection purposes. Normal programs + * should already know what is permitted by their own schema. The + * format may change in any way in the future -- but particularly, new + * forms may be added to the possibilities described above. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings. + * + * You should free the returned value with g_variant_unref() when it is + * no longer needed. + * + * Returns: a #GVariant describing the range + * + * Since: 2.28 + **/ +GVariant * +g_settings_get_range (GSettings *settings, + const gchar *key) +{ + GSettingsSchemaKey skey; + const gchar *type; + GVariant *range; + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + + if (skey.minimum) + { + range = g_variant_new ("(**)", skey.minimum, skey.maximum); + type = "range"; + } + else if (skey.strinfo) + { + range = strinfo_enumerate (skey.strinfo, skey.strinfo_length); + type = skey.is_flags ? "flags" : "enum"; + } + else + { + range = g_variant_new_array (skey.type, NULL, 0); + type = "type"; + } + + g_settings_schema_key_clear (&skey); + + return g_variant_ref_sink (g_variant_new ("(sv)", type, range)); +} + +/** + * g_settings_range_check: + * @settings: a #GSettings + * @key: the key to check + * @value: the value to check + * + * Checks if the given @value is of the correct type and within the + * permitted range for @key. + * + * This API is not intended to be used by normal programs -- they should + * already know what is permitted by their own schemas. This API is + * meant to be used by programs such as editors or commandline tools. + * + * It is a programmer error to give a @key that isn't contained in the + * schema for @settings. + * + * Returns: %TRUE if @value is valid for @key + * + * Since: 2.28 + **/ +gboolean +g_settings_range_check (GSettings *settings, + const gchar *key, + GVariant *value) +{ + GSettingsSchemaKey skey; + gboolean good; + + g_settings_schema_key_init (&skey, settings->priv->schema, key); + good = g_settings_schema_key_type_check (&skey, value) && + g_settings_schema_key_range_check (&skey, value); + g_settings_schema_key_clear (&skey); + + return good; +} + +/* Binding {{{1 */ +typedef struct +{ + GSettingsSchemaKey key; + GSettings *settings; + GObject *object; + + GSettingsBindGetMapping get_mapping; + GSettingsBindSetMapping set_mapping; + gpointer user_data; + GDestroyNotify destroy; + + guint writable_handler_id; + guint property_handler_id; + const GParamSpec *property; + guint key_handler_id; + + /* prevent recursion */ + gboolean running; +} GSettingsBinding; + +static void +g_settings_binding_free (gpointer data) +{ + GSettingsBinding *binding = data; + + g_assert (!binding->running); + + if (binding->writable_handler_id) + g_signal_handler_disconnect (binding->settings, + binding->writable_handler_id); + + if (binding->key_handler_id) + g_signal_handler_disconnect (binding->settings, + binding->key_handler_id); + + if (g_signal_handler_is_connected (binding->object, + binding->property_handler_id)) + g_signal_handler_disconnect (binding->object, + binding->property_handler_id); + + g_settings_schema_key_clear (&binding->key); + + if (binding->destroy) + binding->destroy (binding->user_data); + + g_object_unref (binding->settings); + + g_slice_free (GSettingsBinding, binding); +} + +static GQuark +g_settings_binding_quark (const char *property) +{ + GQuark quark; + gchar *tmp; + + tmp = g_strdup_printf ("gsettingsbinding-%s", property); + quark = g_quark_from_string (tmp); + g_free (tmp); + + return quark; +} + +static void +g_settings_binding_key_changed (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GSettingsBinding *binding = user_data; + GValue value = G_VALUE_INIT; + GVariant *variant; + + g_assert (settings == binding->settings); + g_assert (key == binding->key.name); + + if (binding->running) + return; + + binding->running = TRUE; + + g_value_init (&value, binding->property->value_type); + + variant = g_settings_read_from_backend (binding->settings, &binding->key); + if (variant && !binding->get_mapping (&value, variant, binding->user_data)) + { + /* silently ignore errors in the user's config database */ + g_variant_unref (variant); + variant = NULL; + } + + if (variant == NULL) + { + variant = g_settings_schema_key_get_translated_default (&binding->key); + if (variant && + !binding->get_mapping (&value, variant, binding->user_data)) + { + /* flag translation errors with a warning */ + g_warning ("Translated default `%s' for key `%s' in schema `%s' " + "was rejected by the binding mapping function", + binding->key.unparsed, binding->key.name, + g_settings_schema_get_id (binding->key.schema)); + g_variant_unref (variant); + variant = NULL; + } + } + + if (variant == NULL) + { + variant = g_variant_ref (binding->key.default_value); + if (!binding->get_mapping (&value, variant, binding->user_data)) + g_error ("The schema default value for key `%s' in schema `%s' " + "was rejected by the binding mapping function.", + binding->key.name, g_settings_schema_get_id (binding->key.schema)); + } + + g_object_set_property (binding->object, binding->property->name, &value); + g_variant_unref (variant); + g_value_unset (&value); + + binding->running = FALSE; +} + +static void +g_settings_binding_property_changed (GObject *object, + const GParamSpec *pspec, + gpointer user_data) +{ + GSettingsBinding *binding = user_data; + GValue value = G_VALUE_INIT; + GVariant *variant; + + g_assert (object == binding->object); + g_assert (pspec == binding->property); + + if (binding->running) + return; + + binding->running = TRUE; + + g_value_init (&value, pspec->value_type); + g_object_get_property (object, pspec->name, &value); + if ((variant = binding->set_mapping (&value, binding->key.type, + binding->user_data))) + { + g_variant_take_ref (variant); + + if (!g_settings_schema_key_type_check (&binding->key, variant)) + { + g_critical ("binding mapping function for key `%s' returned " + "GVariant of type `%s' when type `%s' was requested", + binding->key.name, g_variant_get_type_string (variant), + g_variant_type_dup_string (binding->key.type)); + return; + } + + if (!g_settings_schema_key_range_check (&binding->key, variant)) + { + g_critical ("GObject property `%s' on a `%s' object is out of " + "schema-specified range for key `%s' of `%s': %s", + binding->property->name, g_type_name (binding->property->owner_type), + binding->key.name, g_settings_schema_get_id (binding->key.schema), + g_variant_print (variant, TRUE)); + return; + } + + g_settings_write_to_backend (binding->settings, &binding->key, variant); + g_variant_unref (variant); + } + g_value_unset (&value); + + binding->running = FALSE; +} + +static gboolean +g_settings_bind_invert_boolean_get_mapping (GValue *value, + GVariant *variant, + gpointer user_data) +{ + g_value_set_boolean (value, !g_variant_get_boolean (variant)); + return TRUE; +} + +static GVariant * +g_settings_bind_invert_boolean_set_mapping (const GValue *value, + const GVariantType *expected_type, + gpointer user_data) +{ + return g_variant_new_boolean (!g_value_get_boolean (value)); +} + +/** + * g_settings_bind: + * @settings: a #GSettings object + * @key: the key to bind + * @object: (type GObject.Object): a #GObject + * @property: the name of the property to bind + * @flags: flags for the binding + * + * Create a binding between the @key in the @settings object + * and the property @property of @object. + * + * The binding uses the default GIO mapping functions to map + * between the settings and property values. These functions + * handle booleans, numeric types and string types in a + * straightforward way. Use g_settings_bind_with_mapping() if + * you need a custom mapping, or map between types that are not + * supported by the default mapping functions. + * + * Unless the @flags include %G_SETTINGS_BIND_NO_SENSITIVITY, this + * function also establishes a binding between the writability of + * @key and the "sensitive" property of @object (if @object has + * a boolean property by that name). See g_settings_bind_writable() + * for more details about writable bindings. + * + * Note that the lifecycle of the binding is tied to the object, + * and that you can have only one binding per object property. + * If you bind the same property twice on the same object, the second + * binding overrides the first one. + * + * Since: 2.26 + */ +void +g_settings_bind (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + GSettingsBindFlags flags) +{ + GSettingsBindGetMapping get_mapping = NULL; + GSettingsBindSetMapping set_mapping = NULL; + + if (flags & G_SETTINGS_BIND_INVERT_BOOLEAN) + { + get_mapping = g_settings_bind_invert_boolean_get_mapping; + set_mapping = g_settings_bind_invert_boolean_set_mapping; + + /* can't pass this flag to g_settings_bind_with_mapping() */ + flags &= ~G_SETTINGS_BIND_INVERT_BOOLEAN; + } + + g_settings_bind_with_mapping (settings, key, object, property, flags, + get_mapping, set_mapping, NULL, NULL); +} + +/** + * g_settings_bind_with_mapping: (skip) + * @settings: a #GSettings object + * @key: the key to bind + * @object: (type GObject.Object): a #GObject + * @property: the name of the property to bind + * @flags: flags for the binding + * @get_mapping: a function that gets called to convert values + * from @settings to @object, or %NULL to use the default GIO mapping + * @set_mapping: a function that gets called to convert values + * from @object to @settings, or %NULL to use the default GIO mapping + * @user_data: data that gets passed to @get_mapping and @set_mapping + * @destroy: #GDestroyNotify function for @user_data + * + * Create a binding between the @key in the @settings object + * and the property @property of @object. + * + * The binding uses the provided mapping functions to map between + * settings and property values. + * + * Note that the lifecycle of the binding is tied to the object, + * and that you can have only one binding per object property. + * If you bind the same property twice on the same object, the second + * binding overrides the first one. + * + * Since: 2.26 + */ +void +g_settings_bind_with_mapping (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + GSettingsBindFlags flags, + GSettingsBindGetMapping get_mapping, + GSettingsBindSetMapping set_mapping, + gpointer user_data, + GDestroyNotify destroy) +{ + GSettingsBinding *binding; + GObjectClass *objectclass; + gchar *detailed_signal; + GQuark binding_quark; + + g_return_if_fail (G_IS_SETTINGS (settings)); + g_return_if_fail (key != NULL); + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (property != NULL); + g_return_if_fail (~flags & G_SETTINGS_BIND_INVERT_BOOLEAN); + + objectclass = G_OBJECT_GET_CLASS (object); + + binding = g_slice_new0 (GSettingsBinding); + g_settings_schema_key_init (&binding->key, settings->priv->schema, key); + binding->settings = g_object_ref (settings); + binding->object = object; + binding->property = g_object_class_find_property (objectclass, property); + binding->user_data = user_data; + binding->destroy = destroy; + binding->get_mapping = get_mapping ? get_mapping : g_settings_get_mapping; + binding->set_mapping = set_mapping ? set_mapping : g_settings_set_mapping; + + if (!(flags & (G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET))) + flags |= G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET; + + if (binding->property == NULL) + { + g_critical ("g_settings_bind: no property '%s' on class '%s'", + property, G_OBJECT_TYPE_NAME (object)); + return; + } + + if ((flags & G_SETTINGS_BIND_GET) && + (binding->property->flags & G_PARAM_WRITABLE) == 0) + { + g_critical ("g_settings_bind: property '%s' on class '%s' is not " + "writable", binding->property->name, G_OBJECT_TYPE_NAME (object)); + return; + } + if ((flags & G_SETTINGS_BIND_SET) && + (binding->property->flags & G_PARAM_READABLE) == 0) + { + g_critical ("g_settings_bind: property '%s' on class '%s' is not " + "readable", binding->property->name, G_OBJECT_TYPE_NAME (object)); + return; + } + + if (get_mapping == g_settings_bind_invert_boolean_get_mapping) + { + /* g_settings_bind_invert_boolean_get_mapping() is a private + * function, so if we are here it means that g_settings_bind() was + * called with G_SETTINGS_BIND_INVERT_BOOLEAN. + * + * Ensure that both sides are boolean. + */ + + if (binding->property->value_type != G_TYPE_BOOLEAN) + { + g_critical ("g_settings_bind: G_SETTINGS_BIND_INVERT_BOOLEAN " + "was specified, but property `%s' on type `%s' has " + "type `%s'", binding->property->name, G_OBJECT_TYPE_NAME (object), + g_type_name ((binding->property->value_type))); + return; + } + + if (!g_variant_type_equal (binding->key.type, G_VARIANT_TYPE_BOOLEAN)) + { + g_critical ("g_settings_bind: G_SETTINGS_BIND_INVERT_BOOLEAN " + "was specified, but key `%s' on schema `%s' has " + "type `%s'", key, g_settings_schema_get_id (settings->priv->schema), + g_variant_type_dup_string (binding->key.type)); + return; + } + + } + + else if (((get_mapping == NULL && (flags & G_SETTINGS_BIND_GET)) || + (set_mapping == NULL && (flags & G_SETTINGS_BIND_SET))) && + !g_settings_mapping_is_compatible (binding->property->value_type, + binding->key.type)) + { + g_critical ("g_settings_bind: property '%s' on class '%s' has type " + "'%s' which is not compatible with type '%s' of key '%s' " + "on schema '%s'", binding->property->name, G_OBJECT_TYPE_NAME (object), + g_type_name (binding->property->value_type), + g_variant_type_dup_string (binding->key.type), key, + g_settings_schema_get_id (settings->priv->schema)); + return; + } + + if ((flags & G_SETTINGS_BIND_SET) && + (~flags & G_SETTINGS_BIND_NO_SENSITIVITY)) + { + GParamSpec *sensitive; + + sensitive = g_object_class_find_property (objectclass, "sensitive"); + + if (sensitive && sensitive->value_type == G_TYPE_BOOLEAN && + (sensitive->flags & G_PARAM_WRITABLE)) + g_settings_bind_writable (settings, binding->key.name, object, "sensitive", FALSE); + } + + if (flags & G_SETTINGS_BIND_SET) + { + detailed_signal = g_strdup_printf ("notify::%s", binding->property->name); + binding->property_handler_id = + g_signal_connect (object, detailed_signal, + G_CALLBACK (g_settings_binding_property_changed), + binding); + g_free (detailed_signal); + + if (~flags & G_SETTINGS_BIND_GET) + g_settings_binding_property_changed (object, + binding->property, + binding); + } + + if (flags & G_SETTINGS_BIND_GET) + { + if (~flags & G_SETTINGS_BIND_GET_NO_CHANGES) + { + detailed_signal = g_strdup_printf ("changed::%s", key); + binding->key_handler_id = + g_signal_connect (settings, detailed_signal, + G_CALLBACK (g_settings_binding_key_changed), + binding); + g_free (detailed_signal); + } + + g_settings_binding_key_changed (settings, binding->key.name, binding); + } + + binding_quark = g_settings_binding_quark (binding->property->name); + g_object_set_qdata_full (object, binding_quark, + binding, g_settings_binding_free); +} + +/* Writability binding {{{1 */ +typedef struct +{ + GSettings *settings; + gpointer object; + const gchar *key; + const gchar *property; + gboolean inverted; + gulong handler_id; +} GSettingsWritableBinding; + +static void +g_settings_writable_binding_free (gpointer data) +{ + GSettingsWritableBinding *binding = data; + + g_signal_handler_disconnect (binding->settings, binding->handler_id); + g_object_unref (binding->settings); + g_slice_free (GSettingsWritableBinding, binding); +} + +static void +g_settings_binding_writable_changed (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + GSettingsWritableBinding *binding = user_data; + gboolean writable; + + g_assert (settings == binding->settings); + g_assert (key == binding->key); + + writable = g_settings_is_writable (settings, key); + + if (binding->inverted) + writable = !writable; + + g_object_set (binding->object, binding->property, writable, NULL); +} + +/** + * g_settings_bind_writable: + * @settings: a #GSettings object + * @key: the key to bind + * @object: (type GObject.Object):a #GObject + * @property: the name of a boolean property to bind + * @inverted: whether to 'invert' the value + * + * Create a binding between the writability of @key in the + * @settings object and the property @property of @object. + * The property must be boolean; "sensitive" or "visible" + * properties of widgets are the most likely candidates. + * + * Writable bindings are always uni-directional; changes of the + * writability of the setting will be propagated to the object + * property, not the other way. + * + * When the @inverted argument is %TRUE, the binding inverts the + * value as it passes from the setting to the object, i.e. @property + * will be set to %TRUE if the key is not + * writable. + * + * Note that the lifecycle of the binding is tied to the object, + * and that you can have only one binding per object property. + * If you bind the same property twice on the same object, the second + * binding overrides the first one. + * + * Since: 2.26 + */ +void +g_settings_bind_writable (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + gboolean inverted) +{ + GSettingsWritableBinding *binding; + gchar *detailed_signal; + GParamSpec *pspec; + + g_return_if_fail (G_IS_SETTINGS (settings)); + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), property); + if (pspec == NULL) + { + g_critical ("g_settings_bind_writable: no property '%s' on class '%s'", + property, G_OBJECT_TYPE_NAME (object)); + return; + } + if ((pspec->flags & G_PARAM_WRITABLE) == 0) + { + g_critical ("g_settings_bind_writable: property '%s' on class '%s' is not writable", + property, G_OBJECT_TYPE_NAME (object)); + return; + } + + binding = g_slice_new (GSettingsWritableBinding); + binding->settings = g_object_ref (settings); + binding->object = object; + binding->key = g_intern_string (key); + binding->property = g_intern_string (property); + binding->inverted = inverted; + + detailed_signal = g_strdup_printf ("writable-changed::%s", key); + binding->handler_id = + g_signal_connect (settings, detailed_signal, + G_CALLBACK (g_settings_binding_writable_changed), + binding); + g_free (detailed_signal); + + g_object_set_qdata_full (object, g_settings_binding_quark (property), + binding, g_settings_writable_binding_free); + + g_settings_binding_writable_changed (settings, binding->key, binding); +} + +/** + * g_settings_unbind: + * @object: the object + * @property: the property whose binding is removed + * + * Removes an existing binding for @property on @object. + * + * Note that bindings are automatically removed when the + * object is finalized, so it is rarely necessary to call this + * function. + * + * Since: 2.26 + */ +void +g_settings_unbind (gpointer object, + const gchar *property) +{ + GQuark binding_quark; + + binding_quark = g_settings_binding_quark (property); + g_object_set_qdata (object, binding_quark, NULL); +} + +/* GAction {{{1 */ + +typedef struct +{ + GObject parent_instance; + + GSettingsSchemaKey key; + GSettings *settings; +} GSettingsAction; + +typedef GObjectClass GSettingsActionClass; + +static GType g_settings_action_get_type (void); +static void g_settings_action_iface_init (GActionInterface *iface); +G_DEFINE_TYPE_WITH_CODE (GSettingsAction, g_settings_action, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION, g_settings_action_iface_init)) + +enum +{ + ACTION_PROP_0, + ACTION_PROP_NAME, + ACTION_PROP_PARAMETER_TYPE, + ACTION_PROP_ENABLED, + ACTION_PROP_STATE_TYPE, + ACTION_PROP_STATE +}; + +static const gchar * +g_settings_action_get_name (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + return gsa->key.name; +} + +static const GVariantType * +g_settings_action_get_parameter_type (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + const GVariantType *type; + + type = g_variant_get_type (gsa->key.default_value); + if (g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) + type = NULL; + + return type; +} + +static gboolean +g_settings_action_get_enabled (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + return g_settings_is_writable (gsa->settings, gsa->key.name); +} + +static const GVariantType * +g_settings_action_get_state_type (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + return g_variant_get_type (gsa->key.default_value); +} + +static GVariant * +g_settings_action_get_state (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + GVariant *value; + + value = g_settings_read_from_backend (gsa->settings, &gsa->key); + + if (value == NULL) + value = g_settings_schema_key_get_translated_default (&gsa->key); + + if (value == NULL) + value = g_variant_ref (gsa->key.default_value); + + return value; +} + +static GVariant * +g_settings_action_get_state_hint (GAction *action) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + /* no point in reimplementing this... */ + return g_settings_get_range (gsa->settings, gsa->key.name); +} + +static void +g_settings_action_change_state (GAction *action, + GVariant *value) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + if (g_settings_schema_key_type_check (&gsa->key, value) && g_settings_schema_key_range_check (&gsa->key, value)) + g_settings_write_to_backend (gsa->settings, &gsa->key, value); +} + +static void +g_settings_action_activate (GAction *action, + GVariant *parameter) +{ + GSettingsAction *gsa = (GSettingsAction *) action; + + if (g_variant_is_of_type (gsa->key.default_value, G_VARIANT_TYPE_BOOLEAN)) + { + GVariant *old; + + if (parameter != NULL) + return; + + old = g_settings_action_get_state (action); + parameter = g_variant_new_boolean (!g_variant_get_boolean (old)); + g_variant_unref (old); + } + + g_action_change_state (action, parameter); +} + +static void +g_settings_action_get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + GAction *action = G_ACTION (object); + + switch (prop_id) + { + case ACTION_PROP_NAME: + g_value_set_string (value, g_settings_action_get_name (action)); + break; + + case ACTION_PROP_PARAMETER_TYPE: + g_value_set_boxed (value, g_settings_action_get_parameter_type (action)); + break; + + case ACTION_PROP_ENABLED: + g_value_set_boolean (value, g_settings_action_get_enabled (action)); + break; + + case ACTION_PROP_STATE_TYPE: + g_value_set_boxed (value, g_settings_action_get_state_type (action)); + break; + + case ACTION_PROP_STATE: + g_value_set_variant (value, g_settings_action_get_state (action)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_settings_action_finalize (GObject *object) +{ + GSettingsAction *gsa = (GSettingsAction *) object; + + g_signal_handlers_disconnect_by_data (gsa->settings, gsa); + g_object_unref (gsa->settings); + + G_OBJECT_CLASS (g_settings_action_parent_class) + ->finalize (object); +} + +static void +g_settings_action_init (GSettingsAction *gsa) +{ +} + +static void +g_settings_action_iface_init (GActionInterface *iface) +{ + iface->get_name = g_settings_action_get_name; + iface->get_parameter_type = g_settings_action_get_parameter_type; + iface->get_enabled = g_settings_action_get_enabled; + iface->get_state_type = g_settings_action_get_state_type; + iface->get_state = g_settings_action_get_state; + iface->get_state_hint = g_settings_action_get_state_hint; + iface->change_state = g_settings_action_change_state; + iface->activate = g_settings_action_activate; +} + +static void +g_settings_action_class_init (GSettingsActionClass *class) +{ + class->get_property = g_settings_action_get_property; + class->finalize = g_settings_action_finalize; + + g_object_class_override_property (class, ACTION_PROP_NAME, "name"); + g_object_class_override_property (class, ACTION_PROP_PARAMETER_TYPE, "parameter-type"); + g_object_class_override_property (class, ACTION_PROP_ENABLED, "enabled"); + g_object_class_override_property (class, ACTION_PROP_STATE_TYPE, "state-type"); + g_object_class_override_property (class, ACTION_PROP_STATE, "state"); +} + +static void +g_settings_action_changed (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + g_object_notify (user_data, "state"); +} + +static void +g_settings_action_enabled_changed (GSettings *settings, + const gchar *key, + gpointer user_data) +{ + g_object_notify (user_data, "enabled"); +} + +/** + * g_settings_create_action: + * @settings: a #GSettings + * @key: the name of a key in @settings + * + * Creates a #GAction corresponding to a given #GSettings key. + * + * The action has the same name as the key. + * + * The value of the key becomes the state of the action and the action + * is enabled when the key is writable. Changing the state of the + * action results in the key being written to. Changes to the value or + * writability of the key cause appropriate change notifications to be + * emitted for the action. + * + * For boolean-valued keys, action activations take no parameter and + * result in the toggling of the value. For all other types, + * activations take the new value for the key (which must have the + * correct type). + * + * Returns: (transfer full): a new #GAction + * + * Since: 2.32 + **/ +GAction * +g_settings_create_action (GSettings *settings, + const gchar *key) +{ + GSettingsAction *gsa; + gchar *detailed_signal; + + g_return_val_if_fail (G_IS_SETTINGS (settings), NULL); + g_return_val_if_fail (key != NULL, NULL); + + gsa = g_object_new (g_settings_action_get_type (), NULL); + gsa->settings = g_object_ref (settings); + g_settings_schema_key_init (&gsa->key, settings->priv->schema, key); + + detailed_signal = g_strdup_printf ("changed::%s", key); + g_signal_connect (settings, detailed_signal, G_CALLBACK (g_settings_action_changed), gsa); + g_free (detailed_signal); + detailed_signal = g_strdup_printf ("writable-changed::%s", key); + g_signal_connect (settings, detailed_signal, G_CALLBACK (g_settings_action_enabled_changed), gsa); + g_free (detailed_signal); + + return G_ACTION (gsa); +} + +/* Epilogue {{{1 */ + +/* vim:set foldmethod=marker: */ diff --git a/gio/gsettings.h b/gio/gsettings.h new file mode 100644 index 0000000..ad19623 --- /dev/null +++ b/gio/gsettings.h @@ -0,0 +1,326 @@ +/* + * 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_SETTINGS_H__ +#define __G_SETTINGS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_SETTINGS (g_settings_get_type ()) +#define G_SETTINGS(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SETTINGS, GSettings)) +#define G_SETTINGS_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SETTINGS, GSettingsClass)) +#define G_IS_SETTINGS(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_SETTINGS)) +#define G_IS_SETTINGS_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_SETTINGS)) +#define G_SETTINGS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SETTINGS, GSettingsClass)) + +typedef struct _GSettingsPrivate GSettingsPrivate; +typedef struct _GSettingsClass GSettingsClass; + +struct _GSettingsClass +{ + GObjectClass parent_class; + + /* Signals */ + void (*writable_changed) (GSettings *settings, + const gchar *key); + void (*changed) (GSettings *settings, + const gchar *key); + gboolean (*writable_change_event) (GSettings *settings, + GQuark key); + gboolean (*change_event) (GSettings *settings, + const GQuark *keys, + gint n_keys); + + gpointer padding[20]; +}; + +struct _GSettings +{ + GObject parent_instance; + GSettingsPrivate *priv; +}; + + +GLIB_AVAILABLE_IN_ALL +GType g_settings_get_type (void); + +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_settings_list_schemas (void); +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_settings_list_relocatable_schemas (void); +GLIB_AVAILABLE_IN_ALL +GSettings * g_settings_new (const gchar *schema_id); +GLIB_AVAILABLE_IN_ALL +GSettings * g_settings_new_with_path (const gchar *schema_id, + const gchar *path); +GLIB_AVAILABLE_IN_ALL +GSettings * g_settings_new_with_backend (const gchar *schema_id, + GSettingsBackend *backend); +GLIB_AVAILABLE_IN_ALL +GSettings * g_settings_new_with_backend_and_path (const gchar *schema_id, + GSettingsBackend *backend, + const gchar *path); +GLIB_AVAILABLE_IN_2_32 +GSettings * g_settings_new_full (GSettingsSchema *schema, + GSettingsBackend *backend, + const gchar *path); +GLIB_AVAILABLE_IN_ALL +gchar ** g_settings_list_children (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +gchar ** g_settings_list_keys (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +GVariant * g_settings_get_range (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_range_check (GSettings *settings, + const gchar *key, + GVariant *value); + +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_value (GSettings *settings, + const gchar *key, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_settings_get_value (GSettings *settings, + const gchar *key); + +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set (GSettings *settings, + const gchar *key, + const gchar *format, + ...); +GLIB_AVAILABLE_IN_ALL +void g_settings_get (GSettings *settings, + const gchar *key, + const gchar *format, + ...); +GLIB_AVAILABLE_IN_ALL +void g_settings_reset (GSettings *settings, + const gchar *key); + +GLIB_AVAILABLE_IN_ALL +gint g_settings_get_int (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_int (GSettings *settings, + const gchar *key, + gint value); +GLIB_AVAILABLE_IN_ALL +guint g_settings_get_uint (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_uint (GSettings *settings, + const gchar *key, + guint value); +GLIB_AVAILABLE_IN_ALL +gchar * g_settings_get_string (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_string (GSettings *settings, + const gchar *key, + const gchar *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_get_boolean (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_boolean (GSettings *settings, + const gchar *key, + gboolean value); +GLIB_AVAILABLE_IN_ALL +gdouble g_settings_get_double (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_double (GSettings *settings, + const gchar *key, + gdouble value); +GLIB_AVAILABLE_IN_ALL +gchar ** g_settings_get_strv (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_strv (GSettings *settings, + const gchar *key, + const gchar *const *value); +GLIB_AVAILABLE_IN_ALL +gint g_settings_get_enum (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_enum (GSettings *settings, + const gchar *key, + gint value); +GLIB_AVAILABLE_IN_ALL +guint g_settings_get_flags (GSettings *settings, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_set_flags (GSettings *settings, + const gchar *key, + guint value); +GLIB_AVAILABLE_IN_ALL +GSettings * g_settings_get_child (GSettings *settings, + const gchar *name); + +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_is_writable (GSettings *settings, + const gchar *name); + +GLIB_AVAILABLE_IN_ALL +void g_settings_delay (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +void g_settings_apply (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +void g_settings_revert (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +gboolean g_settings_get_has_unapplied (GSettings *settings); +GLIB_AVAILABLE_IN_ALL +void g_settings_sync (void); + +/** + * GSettingsBindSetMapping: + * @value: a #GValue containing the property value to map + * @expected_type: the #GVariantType to create + * @user_data: user data that was specified when the binding was created + * + * The type for the function that is used to convert an object property + * value to a #GVariant for storing it in #GSettings. + * + * Returns: a new #GVariant holding the data from @value, + * or %NULL in case of an error + */ +typedef GVariant * (*GSettingsBindSetMapping) (const GValue *value, + const GVariantType *expected_type, + gpointer user_data); + +/** + * GSettingsBindGetMapping: + * @value: return location for the property value + * @variant: the #GVariant + * @user_data: user data that was specified when the binding was created + * + * The type for the function that is used to convert from #GSettings to + * an object property. The @value is already initialized to hold values + * of the appropriate type. + * + * Returns: %TRUE if the conversion succeeded, %FALSE in case of an error + */ +typedef gboolean (*GSettingsBindGetMapping) (GValue *value, + GVariant *variant, + gpointer user_data); + +/** + * GSettingsGetMapping: + * @value: the #GVariant to map, or %NULL + * @result: (out): the result of the mapping + * @user_data: (closure): the user data that was passed to + * g_settings_get_mapped() + * + * The type of the function that is used to convert from a value stored + * in a #GSettings to a value that is useful to the application. + * + * If the value is successfully mapped, the result should be stored at + * @result and %TRUE returned. If mapping fails (for example, if @value + * is not in the right format) then %FALSE should be returned. + * + * If @value is %NULL then it means that the mapping function is being + * given a "last chance" to successfully return a valid value. %TRUE + * must be returned in this case. + * + * Returns: %TRUE if the conversion succeeded, %FALSE in case of an error + **/ +typedef gboolean (*GSettingsGetMapping) (GVariant *value, + gpointer *result, + gpointer user_data); + +/** + * GSettingsBindFlags: + * @G_SETTINGS_BIND_DEFAULT: Equivalent to G_SETTINGS_BIND_GET|G_SETTINGS_BIND_SET + * @G_SETTINGS_BIND_GET: Update the #GObject property when the setting changes. + * It is an error to use this flag if the property is not writable. + * @G_SETTINGS_BIND_SET: Update the setting when the #GObject property changes. + * It is an error to use this flag if the property is not readable. + * @G_SETTINGS_BIND_NO_SENSITIVITY: Do not try to bind a "sensitivity" property to the writability of the setting + * @G_SETTINGS_BIND_GET_NO_CHANGES: When set in addition to #G_SETTINGS_BIND_GET, set the #GObject property + * value initially from the setting, but do not listen for changes of the setting + * @G_SETTINGS_BIND_INVERT_BOOLEAN: When passed to g_settings_bind(), uses a pair of mapping functions that invert + * the boolean value when mapping between the setting and the property. The setting and property must both + * be booleans. You cannot pass this flag to g_settings_bind_with_mapping(). + * + * Flags used when creating a binding. These flags determine in which + * direction the binding works. The default is to synchronize in both + * directions. + */ +typedef enum +{ + G_SETTINGS_BIND_DEFAULT, + G_SETTINGS_BIND_GET = (1<<0), + G_SETTINGS_BIND_SET = (1<<1), + G_SETTINGS_BIND_NO_SENSITIVITY = (1<<2), + G_SETTINGS_BIND_GET_NO_CHANGES = (1<<3), + G_SETTINGS_BIND_INVERT_BOOLEAN = (1<<4) +} GSettingsBindFlags; + +GLIB_AVAILABLE_IN_ALL +void g_settings_bind (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + GSettingsBindFlags flags); +GLIB_AVAILABLE_IN_ALL +void g_settings_bind_with_mapping (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + GSettingsBindFlags flags, + GSettingsBindGetMapping get_mapping, + GSettingsBindSetMapping set_mapping, + gpointer user_data, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_ALL +void g_settings_bind_writable (GSettings *settings, + const gchar *key, + gpointer object, + const gchar *property, + gboolean inverted); +GLIB_AVAILABLE_IN_ALL +void g_settings_unbind (gpointer object, + const gchar *property); + +GLIB_AVAILABLE_IN_2_32 +GAction * g_settings_create_action (GSettings *settings, + const gchar *key); + +GLIB_AVAILABLE_IN_ALL +gpointer g_settings_get_mapped (GSettings *settings, + const gchar *key, + GSettingsGetMapping mapping, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_SETTINGS_H__ */ diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c new file mode 100644 index 0000000..c89531a --- /dev/null +++ b/gio/gsettingsbackend.c @@ -0,0 +1,1035 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * Copyright © 2010 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 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 + * Matthias Clasen + */ + +#include "config.h" + +#include "gsettingsbackendinternal.h" +#include "gsimplepermission.h" +#include "giomodule-priv.h" + +#include +#include +#include +#include + + +G_DEFINE_ABSTRACT_TYPE (GSettingsBackend, g_settings_backend, G_TYPE_OBJECT) + +typedef struct _GSettingsBackendClosure GSettingsBackendClosure; +typedef struct _GSettingsBackendWatch GSettingsBackendWatch; + +struct _GSettingsBackendPrivate +{ + GSettingsBackendWatch *watches; + GMutex lock; +}; + +/* For g_settings_backend_sync_default(), we only want to actually do + * the sync if the backend already exists. This avoids us creating an + * entire GSettingsBackend in order to call a do-nothing sync() + * operation on it. This variable lets us avoid that. + */ +static gboolean g_settings_has_backend; + +/** + * SECTION:gsettingsbackend + * @title: GSettingsBackend + * @short_description: Interface for settings backend implementations + * @include: gio/gsettingsbackend.h + * @see_also: #GSettings, #GIOExtensionPoint + * + * The #GSettingsBackend interface defines a generic interface for + * non-strictly-typed data that is stored in a hierarchy. To implement + * an alternative storage backend for #GSettings, you need to implement + * the #GSettingsBackend interface and then make it implement the + * extension point #G_SETTINGS_BACKEND_EXTENSION_POINT_NAME. + * + * The interface defines methods for reading and writing values, a + * method for determining if writing of certain values will fail + * (lockdown) and a change notification mechanism. + * + * The semantics of the interface are very precisely defined and + * implementations must carefully adhere to the expectations of + * callers that are documented on each of the interface methods. + * + * Some of the GSettingsBackend functions accept or return a #GTree. + * These trees always have strings as keys and #GVariant as values. + * g_settings_backend_create_tree() is a convenience function to create + * suitable trees. + * + * + * The #GSettingsBackend API is exported to allow third-party + * implementations, but does not carry the same stability guarantees + * as the public GIO API. For this reason, you have to define the + * C preprocessor symbol #G_SETTINGS_ENABLE_BACKEND before including + * gio/gsettingsbackend.h + * + **/ + +static gboolean +is_key (const gchar *key) +{ + gint length; + gint i; + + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (key[0] == '/', FALSE); + + for (i = 1; key[i]; i++) + g_return_val_if_fail (key[i] != '/' || key[i + 1] != '/', FALSE); + + length = i; + + g_return_val_if_fail (key[length - 1] != '/', FALSE); + + return TRUE; +} + +static gboolean +is_path (const gchar *path) +{ + gint length; + gint i; + + g_return_val_if_fail (path != NULL, FALSE); + g_return_val_if_fail (path[0] == '/', FALSE); + + for (i = 1; path[i]; i++) + g_return_val_if_fail (path[i] != '/' || path[i + 1] != '/', FALSE); + + length = i; + + g_return_val_if_fail (path[length - 1] == '/', FALSE); + + return TRUE; +} + +struct _GSettingsBackendWatch +{ + GObject *target; + const GSettingsListenerVTable *vtable; + GMainContext *context; + GSettingsBackendWatch *next; +}; + +struct _GSettingsBackendClosure +{ + void (*function) (GObject *target, + GSettingsBackend *backend, + const gchar *name, + gpointer data1, + gpointer data2); + + GSettingsBackend *backend; + GObject *target; + gchar *name; + gpointer data1; + GBoxedFreeFunc data1_free; + gpointer data2; +}; + +static void +g_settings_backend_watch_weak_notify (gpointer data, + GObject *where_the_object_was) +{ + GSettingsBackend *backend = data; + GSettingsBackendWatch **ptr; + + /* search and remove */ + g_mutex_lock (&backend->priv->lock); + for (ptr = &backend->priv->watches; *ptr; ptr = &(*ptr)->next) + if ((*ptr)->target == where_the_object_was) + { + GSettingsBackendWatch *tmp = *ptr; + + *ptr = tmp->next; + g_slice_free (GSettingsBackendWatch, tmp); + + g_mutex_unlock (&backend->priv->lock); + return; + } + + /* we didn't find it. that shouldn't happen. */ + g_assert_not_reached (); +} + +/*< private > + * g_settings_backend_watch: + * @backend: a #GSettingsBackend + * @target: the GObject (typically GSettings instance) to call back to + * @context: (allow-none): a #GMainContext, or %NULL + * ...: callbacks... + * + * Registers a new watch on a #GSettingsBackend. + * + * note: %NULL @context does not mean "default main context" but rather, + * "it is okay to dispatch in any context". If the default main context + * is specifically desired then it must be given. + * + * note also: if you want to get meaningful values for the @origin_tag + * that appears as an argument to some of the callbacks, you *must* have + * @context as %NULL. Otherwise, you are subject to cross-thread + * dispatching and whatever owned @origin_tag at the time that the event + * occurred may no longer own it. This is a problem if you consider that + * you may now be the new owner of that address and mistakenly think + * that the event in question originated from yourself. + * + * tl;dr: If you give a non-%NULL @context then you must ignore the + * value of @origin_tag given to any callbacks. + **/ +void +g_settings_backend_watch (GSettingsBackend *backend, + const GSettingsListenerVTable *vtable, + GObject *target, + GMainContext *context) +{ + GSettingsBackendWatch *watch; + + /* For purposes of discussion, we assume that our target is a + * GSettings instance. + * + * Our strategy to defend against the final reference dropping on the + * GSettings object in a thread other than the one that is doing the + * dispatching is as follows: + * + * 1) hold a GObject reference on the GSettings during an outstanding + * dispatch. This ensures that the delivery is always possible. + * + * 2) hold a weak reference on the GSettings at other times. This + * allows us to receive early notification of pending destruction + * of the object. At this point, it is still safe to obtain a + * reference on the GObject to keep it alive, so #1 will work up + * to that point. After that point, we'll have been able to drop + * the watch from the list. + * + * Note, in particular, that it's not possible to simply have an + * "unwatch" function that gets called from the finalize function of + * the GSettings instance because, by that point it is no longer + * possible to keep the object alive using g_object_ref() and we would + * have no way of knowing this. + * + * Note also that we do not need to hold a reference on the main + * context here since the GSettings instance does that for us and we + * will receive the weak notify long before it is dropped. We don't + * even need to hold it during dispatches because our reference on the + * GSettings will prevent the finalize from running and dropping the + * ref on the context. + * + * All access to the list holds a mutex. We have some strategies to + * avoid some of the pain that would be associated with that. + */ + + watch = g_slice_new (GSettingsBackendWatch); + watch->context = context; + watch->vtable = vtable; + watch->target = target; + g_object_weak_ref (target, g_settings_backend_watch_weak_notify, backend); + + /* linked list prepend */ + g_mutex_lock (&backend->priv->lock); + watch->next = backend->priv->watches; + backend->priv->watches = watch; + g_mutex_unlock (&backend->priv->lock); +} + +void +g_settings_backend_unwatch (GSettingsBackend *backend, + GObject *target) +{ + /* Our caller surely owns a reference on 'target', so the order of + * these two calls is unimportant. + */ + g_object_weak_unref (target, g_settings_backend_watch_weak_notify, backend); + g_settings_backend_watch_weak_notify (backend, target); +} + +static gboolean +g_settings_backend_invoke_closure (gpointer user_data) +{ + GSettingsBackendClosure *closure = user_data; + + closure->function (closure->target, closure->backend, closure->name, + closure->data1, closure->data2); + + closure->data1_free (closure->data1); + g_object_unref (closure->backend); + g_object_unref (closure->target); + g_free (closure->name); + + g_slice_free (GSettingsBackendClosure, closure); + + return FALSE; +} + +static gpointer +pointer_id (gpointer a) +{ + return a; +} + +static void +pointer_ignore (gpointer a) +{ +} + +static void +g_settings_backend_dispatch_signal (GSettingsBackend *backend, + gsize function_offset, + const gchar *name, + gpointer data1, + GBoxedCopyFunc data1_copy, + GBoxedFreeFunc data1_free, + gpointer data2) +{ + GSettingsBackendWatch *suffix, *watch, *next; + + if (data1_copy == NULL) + data1_copy = pointer_id; + + if (data1_free == NULL) + data1_free = pointer_ignore; + + /* We're in a little bit of a tricky situation here. We need to hold + * a lock while traversing the list, but we don't want to hold the + * lock while calling back into user code. + * + * Since we're not holding the lock while we call user code, we can't + * render the list immutable. We can, however, store a pointer to a + * given suffix of the list and render that suffix immutable. + * + * Adds will never modify the suffix since adds always come in the + * form of prepends. We can also prevent removes from modifying the + * suffix since removes only happen in response to the last reference + * count dropping -- so just add a reference to everything in the + * suffix. + */ + g_mutex_lock (&backend->priv->lock); + suffix = backend->priv->watches; + for (watch = suffix; watch; watch = watch->next) + g_object_ref (watch->target); + g_mutex_unlock (&backend->priv->lock); + + /* The suffix is now immutable, so this is safe. */ + for (watch = suffix; watch; watch = next) + { + GSettingsBackendClosure *closure; + + closure = g_slice_new (GSettingsBackendClosure); + closure->backend = g_object_ref (backend); + closure->target = watch->target; /* we took our ref above */ + closure->function = G_STRUCT_MEMBER (void *, watch->vtable, + function_offset); + closure->name = g_strdup (name); + closure->data1 = data1_copy (data1); + closure->data1_free = data1_free; + closure->data2 = data2; + + /* we do this here because 'watch' may not live to the end of this + * iteration of the loop (since we may unref the target below). + */ + next = watch->next; + + if (watch->context) + g_main_context_invoke (watch->context, + g_settings_backend_invoke_closure, + closure); + else + g_settings_backend_invoke_closure (closure); + } +} + +/** + * g_settings_backend_changed: + * @backend: a #GSettingsBackend implementation + * @key: the name of the key + * @origin_tag: the origin tag + * + * Signals that a single key has possibly changed. Backend + * implementations should call this if a key has possibly changed its + * value. + * + * @key must be a valid key (ie starting with a slash, not containing + * '//', and not ending with a slash). + * + * The implementation must call this function during any call to + * g_settings_backend_write(), before the call returns (except in the + * case that no keys are actually changed and it cares to detect this + * fact). It may not rely on the existence of a mainloop for + * dispatching the signal later. + * + * The implementation may call this function at any other time it likes + * in response to other events (such as changes occurring outside of the + * program). These calls may originate from a mainloop or may originate + * in response to any other action (including from calls to + * g_settings_backend_write()). + * + * In the case that this call is in response to a call to + * g_settings_backend_write() then @origin_tag must be set to the same + * value that was passed to that call. + * + * Since: 2.26 + **/ +void +g_settings_backend_changed (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + g_return_if_fail (is_key (key)); + + g_settings_backend_dispatch_signal (backend, + G_STRUCT_OFFSET (GSettingsListenerVTable, + changed), + key, origin_tag, NULL, NULL, NULL); +} + +/** + * g_settings_backend_keys_changed: + * @backend: a #GSettingsBackend implementation + * @path: the path containing the changes + * @items: (array zero-terminated=1): the %NULL-terminated list of changed keys + * @origin_tag: the origin tag + * + * Signals that a list of keys have possibly changed. Backend + * implementations should call this if keys have possibly changed their + * values. + * + * @path must be a valid path (ie starting and ending with a slash and + * not containing '//'). Each string in @items must form a valid key + * name when @path is prefixed to it (ie: each item must not start or + * end with '/' and must not contain '//'). + * + * The meaning of this signal is that any of the key names resulting + * from the contatenation of @path with each item in @items may have + * changed. + * + * The same rules for when notifications must occur apply as per + * g_settings_backend_changed(). These two calls can be used + * interchangeably if exactly one item has changed (although in that + * case g_settings_backend_changed() is definitely preferred). + * + * For efficiency reasons, the implementation should strive for @path to + * be as long as possible (ie: the longest common prefix of all of the + * keys that were changed) but this is not strictly required. + * + * Since: 2.26 + */ +void +g_settings_backend_keys_changed (GSettingsBackend *backend, + const gchar *path, + gchar const * const *items, + gpointer origin_tag) +{ + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + g_return_if_fail (is_path (path)); + + /* XXX: should do stricter checking (ie: inspect each item) */ + g_return_if_fail (items != NULL); + + g_settings_backend_dispatch_signal (backend, + G_STRUCT_OFFSET (GSettingsListenerVTable, + keys_changed), + path, (gpointer) items, + (GBoxedCopyFunc) g_strdupv, + (GBoxedFreeFunc) g_strfreev, + origin_tag); +} + +/** + * g_settings_backend_path_changed: + * @backend: a #GSettingsBackend implementation + * @path: the path containing the changes + * @origin_tag: the origin tag + * + * Signals that all keys below a given path may have possibly changed. + * Backend implementations should call this if an entire path of keys + * have possibly changed their values. + * + * @path must be a valid path (ie starting and ending with a slash and + * not containing '//'). + * + * The meaning of this signal is that any of the key which has a name + * starting with @path may have changed. + * + * The same rules for when notifications must occur apply as per + * g_settings_backend_changed(). This call might be an appropriate + * reasponse to a 'reset' call but implementations are also free to + * explicitly list the keys that were affected by that call if they can + * easily do so. + * + * For efficiency reasons, the implementation should strive for @path to + * be as long as possible (ie: the longest common prefix of all of the + * keys that were changed) but this is not strictly required. As an + * example, if this function is called with the path of "/" then every + * single key in the application will be notified of a possible change. + * + * Since: 2.26 + */ +void +g_settings_backend_path_changed (GSettingsBackend *backend, + const gchar *path, + gpointer origin_tag) +{ + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + g_return_if_fail (is_path (path)); + + g_settings_backend_dispatch_signal (backend, + G_STRUCT_OFFSET (GSettingsListenerVTable, + path_changed), + path, origin_tag, NULL, NULL, NULL); +} + +/** + * g_settings_backend_writable_changed: + * @backend: a #GSettingsBackend implementation + * @key: the name of the key + * + * Signals that the writability of a single key has possibly changed. + * + * Since GSettings performs no locking operations for itself, this call + * will always be made in response to external events. + * + * Since: 2.26 + **/ +void +g_settings_backend_writable_changed (GSettingsBackend *backend, + const gchar *key) +{ + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + g_return_if_fail (is_key (key)); + + g_settings_backend_dispatch_signal (backend, + G_STRUCT_OFFSET (GSettingsListenerVTable, + writable_changed), + key, NULL, NULL, NULL, NULL); +} + +/** + * g_settings_backend_path_writable_changed: + * @backend: a #GSettingsBackend implementation + * @path: the name of the path + * + * Signals that the writability of all keys below a given path may have + * changed. + * + * Since GSettings performs no locking operations for itself, this call + * will always be made in response to external events. + * + * Since: 2.26 + **/ +void +g_settings_backend_path_writable_changed (GSettingsBackend *backend, + const gchar *path) +{ + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + g_return_if_fail (is_path (path)); + + g_settings_backend_dispatch_signal (backend, + G_STRUCT_OFFSET (GSettingsListenerVTable, + path_writable_changed), + path, NULL, NULL, NULL, NULL); +} + +typedef struct +{ + const gchar **keys; + GVariant **values; + gint prefix_len; + gchar *prefix; +} FlattenState; + +static gboolean +g_settings_backend_flatten_one (gpointer key, + gpointer value, + gpointer user_data) +{ + FlattenState *state = user_data; + const gchar *skey = key; + gint i; + + g_return_val_if_fail (is_key (key), TRUE); + + /* calculate longest common prefix */ + if (state->prefix == NULL) + { + gchar *last_byte; + + /* first key? just take the prefix up to the last '/' */ + state->prefix = g_strdup (skey); + last_byte = strrchr (state->prefix, '/') + 1; + state->prefix_len = last_byte - state->prefix; + *last_byte = '\0'; + } + else + { + /* find the first character that does not match. we will + * definitely find one because the prefix ends in '/' and the key + * does not. also: no two keys in the tree are the same. + */ + for (i = 0; state->prefix[i] == skey[i]; i++); + + /* check if we need to shorten the prefix */ + if (state->prefix[i] != '\0') + { + /* find the nearest '/', terminate after it */ + while (state->prefix[i - 1] != '/') + i--; + + state->prefix[i] = '\0'; + state->prefix_len = i; + } + } + + + /* save the entire item into the array. + * the prefixes will be removed later. + */ + *state->keys++ = key; + + if (state->values) + *state->values++ = value; + + return FALSE; +} + +/** + * g_settings_backend_flatten_tree: + * @tree: a #GTree containing the changes + * @path: (out): the location to save the path + * @keys: (out) (transfer container) (array zero-terminated=1): the + * location to save the relative keys + * @values: (out) (allow-none) (transfer container) (array zero-terminated=1): + * the location to save the values, or %NULL + * + * Calculate the longest common prefix of all keys in a tree and write + * out an array of the key names relative to that prefix and, + * optionally, the value to store at each of those keys. + * + * You must free the value returned in @path, @keys and @values using + * g_free(). You should not attempt to free or unref the contents of + * @keys or @values. + * + * Since: 2.26 + **/ +void +g_settings_backend_flatten_tree (GTree *tree, + gchar **path, + const gchar ***keys, + GVariant ***values) +{ + FlattenState state = { 0, }; + gsize nnodes; + + nnodes = g_tree_nnodes (tree); + + *keys = state.keys = g_new (const gchar *, nnodes + 1); + state.keys[nnodes] = NULL; + + if (values != NULL) + { + *values = state.values = g_new (GVariant *, nnodes + 1); + state.values[nnodes] = NULL; + } + + g_tree_foreach (tree, g_settings_backend_flatten_one, &state); + g_return_if_fail (*keys + nnodes == state.keys); + + *path = state.prefix; + while (nnodes--) + *--state.keys += state.prefix_len; +} + +/** + * g_settings_backend_changed_tree: + * @backend: a #GSettingsBackend implementation + * @tree: a #GTree containing the changes + * @origin_tag: the origin tag + * + * This call is a convenience wrapper. It gets the list of changes from + * @tree, computes the longest common prefix and calls + * g_settings_backend_changed(). + * + * Since: 2.26 + **/ +void +g_settings_backend_changed_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + const gchar **keys; + gchar *path; + + g_return_if_fail (G_IS_SETTINGS_BACKEND (backend)); + + g_settings_backend_flatten_tree (tree, &path, &keys, NULL); + +#ifdef DEBUG_CHANGES + { + gint i; + + g_print ("----\n"); + g_print ("changed_tree(): prefix %s\n", path); + for (i = 0; keys[i]; i++) + g_print (" %s\n", keys[i]); + g_print ("----\n"); + } +#endif + + g_settings_backend_keys_changed (backend, path, keys, origin_tag); + g_free (path); + g_free (keys); +} + +/*< private > + * g_settings_backend_read: + * @backend: a #GSettingsBackend implementation + * @key: the key to read + * @expected_type: a #GVariantType + * @default_value: if the default value should be returned + * + * Reads a key. This call will never block. + * + * If the key exists, the value associated with it will be returned. + * If the key does not exist, %NULL will be returned. + * + * The returned value will be of the type given in @expected_type. If + * the backend stored a value of a different type then %NULL will be + * returned. + * + * If @default_value is %TRUE then this gets the default value from the + * backend (ie: the one that the backend would contain if + * g_settings_reset() were called). + * + * Returns: the value that was read, or %NULL + */ +GVariant * +g_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value) +{ + GVariant *value; + + value = G_SETTINGS_BACKEND_GET_CLASS (backend) + ->read (backend, key, expected_type, default_value); + + if (value != NULL) + value = g_variant_take_ref (value); + + if G_UNLIKELY (value && !g_variant_is_of_type (value, expected_type)) + { + g_variant_unref (value); + value = NULL; + } + + return value; +} + +/*< private > + * g_settings_backend_write: + * @backend: a #GSettingsBackend implementation + * @key: the name of the key + * @value: a #GVariant value to write to this key + * @origin_tag: the origin tag + * + * Writes exactly one key. + * + * This call does not fail. During this call a + * #GSettingsBackend::changed signal will be emitted if the value of the + * key has changed. The updated key value will be visible to any signal + * callbacks. + * + * One possible method that an implementation might deal with failures is + * to emit a second "changed" signal (either during this call, or later) + * to indicate that the affected keys have suddenly "changed back" to their + * old values. + * + * Returns: %TRUE if the write succeeded, %FALSE if the key was not writable + */ +gboolean +g_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag) +{ + gboolean success; + + g_variant_ref_sink (value); + success = G_SETTINGS_BACKEND_GET_CLASS (backend) + ->write (backend, key, value, origin_tag); + g_variant_unref (value); + + return success; +} + +/*< private > + * g_settings_backend_write_keys: + * @backend: a #GSettingsBackend implementation + * @values: a #GTree containing key-value pairs to write + * @origin_tag: the origin tag + * + * Writes one or more keys. This call will never block. + * + * The key of each item in the tree is the key name to write to and the + * value is a #GVariant to write. The proper type of #GTree for this + * call can be created with g_settings_backend_create_tree(). This call + * might take a reference to the tree; you must not modified the #GTree + * after passing it to this call. + * + * This call does not fail. During this call a #GSettingsBackend::changed + * signal will be emitted if any keys have been changed. The new values of + * all updated keys will be visible to any signal callbacks. + * + * One possible method that an implementation might deal with failures is + * to emit a second "changed" signal (either during this call, or later) + * to indicate that the affected keys have suddenly "changed back" to their + * old values. + */ +gboolean +g_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag) +{ + return G_SETTINGS_BACKEND_GET_CLASS (backend) + ->write_tree (backend, tree, origin_tag); +} + +/*< private > + * g_settings_backend_reset: + * @backend: a #GSettingsBackend implementation + * @key: the name of a key + * @origin_tag: the origin tag + * + * "Resets" the named key to its "default" value (ie: after system-wide + * defaults, mandatory keys, etc. have been taken into account) or possibly + * unsets it. + */ +void +g_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag) +{ + G_SETTINGS_BACKEND_GET_CLASS (backend) + ->reset (backend, key, origin_tag); +} + +/*< private > + * g_settings_backend_get_writable: + * @backend: a #GSettingsBackend implementation + * @key: the name of a key + * + * Finds out if a key is available for writing to. This is the + * interface through which 'lockdown' is implemented. Locked down + * keys will have %FALSE returned by this call. + * + * You should not write to locked-down keys, but if you do, the + * implementation will deal with it. + * + * Returns: %TRUE if the key is writable + */ +gboolean +g_settings_backend_get_writable (GSettingsBackend *backend, + const gchar *key) +{ + return G_SETTINGS_BACKEND_GET_CLASS (backend) + ->get_writable (backend, key); +} + +/*< private > + * g_settings_backend_unsubscribe: + * @backend: a #GSettingsBackend + * @name: a key or path to subscribe to + * + * Reverses the effect of a previous call to + * g_settings_backend_subscribe(). + */ +void +g_settings_backend_unsubscribe (GSettingsBackend *backend, + const char *name) +{ + G_SETTINGS_BACKEND_GET_CLASS (backend) + ->unsubscribe (backend, name); +} + +/*< private > + * g_settings_backend_subscribe: + * @backend: a #GSettingsBackend + * @name: a key or path to subscribe to + * + * Requests that change signals be emitted for events on @name. + */ +void +g_settings_backend_subscribe (GSettingsBackend *backend, + const gchar *name) +{ + G_SETTINGS_BACKEND_GET_CLASS (backend) + ->subscribe (backend, name); +} + +static void +g_settings_backend_finalize (GObject *object) +{ + GSettingsBackend *backend = G_SETTINGS_BACKEND (object); + + g_mutex_clear (&backend->priv->lock); + + G_OBJECT_CLASS (g_settings_backend_parent_class) + ->finalize (object); +} + +static void +ignore_subscription (GSettingsBackend *backend, + const gchar *key) +{ +} + +static void +g_settings_backend_init (GSettingsBackend *backend) +{ + backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (backend, + G_TYPE_SETTINGS_BACKEND, + GSettingsBackendPrivate); + g_mutex_init (&backend->priv->lock); +} + +static void +g_settings_backend_class_init (GSettingsBackendClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + class->subscribe = ignore_subscription; + class->unsubscribe = ignore_subscription; + + gobject_class->finalize = g_settings_backend_finalize; + + g_type_class_add_private (class, sizeof (GSettingsBackendPrivate)); +} + +static void +g_settings_backend_variant_unref0 (gpointer data) +{ + if (data != NULL) + g_variant_unref (data); +} + +/*< private > + * g_settings_backend_create_tree: + * + * This is a convenience function for creating a tree that is compatible + * with g_settings_backend_write(). It merely calls g_tree_new_full() + * with strcmp(), g_free() and g_variant_unref(). + * + * Returns: a new #GTree + */ +GTree * +g_settings_backend_create_tree (void) +{ + return g_tree_new_full ((GCompareDataFunc) strcmp, NULL, + g_free, g_settings_backend_variant_unref0); +} + +static gboolean +g_settings_backend_verify (gpointer impl) +{ + GSettingsBackend *backend = impl; + + if (strcmp (G_OBJECT_TYPE_NAME (backend), "GMemorySettingsBackend") == 0 && + g_strcmp0 (g_getenv ("GSETTINGS_BACKEND"), "memory") != 0) + { + g_message ("Using the 'memory' GSettings backend. Your settings " + "will not be saved or shared with other applications."); + } + + g_settings_has_backend = TRUE; + return TRUE; +} + +/** + * g_settings_backend_get_default: + * + * Returns the default #GSettingsBackend. It is possible to override + * the default by setting the GSETTINGS_BACKEND + * environment variable to the name of a settings backend. + * + * The user gets a reference to the backend. + * + * Returns: (transfer full): the default #GSettingsBackend + * + * Since: 2.28 + */ +GSettingsBackend * +g_settings_backend_get_default (void) +{ + GSettingsBackend *backend; + + backend = _g_io_module_get_default (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME, + "GSETTINGS_BACKEND", + g_settings_backend_verify); + return g_object_ref (backend); +} + +/*< private > + * g_settings_backend_get_permission: + * @backend: a #GSettingsBackend + * @path: a path + * + * Gets the permission object associated with writing to keys below + * @path on @backend. + * + * If this is not implemented in the backend, then a %TRUE + * #GSimplePermission is returned. + * + * Returns: a non-%NULL #GPermission. Free with g_object_unref() + */ +GPermission * +g_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path) +{ + GSettingsBackendClass *class = G_SETTINGS_BACKEND_GET_CLASS (backend); + + if (class->get_permission) + return class->get_permission (backend, path); + + return g_simple_permission_new (TRUE); +} + +/*< private > + * g_settings_backend_sync_default: + * + * Syncs the default backend. + */ +void +g_settings_backend_sync_default (void) +{ + if (g_settings_has_backend) + { + GSettingsBackendClass *class; + GSettingsBackend *backend; + + backend = g_settings_backend_get_default (); + class = G_SETTINGS_BACKEND_GET_CLASS (backend); + + if (class->sync) + class->sync (backend); + } +} diff --git a/gio/gsettingsbackend.h b/gio/gsettingsbackend.h new file mode 100644 index 0000000..293ca65 --- /dev/null +++ b/gio/gsettingsbackend.h @@ -0,0 +1,156 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * Copyright © 2010 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 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 + * Matthias Clasen + */ + +#ifndef __G_SETTINGS_BACKEND_H__ +#define __G_SETTINGS_BACKEND_H__ + +#if !defined (G_SETTINGS_ENABLE_BACKEND) && !defined (GIO_COMPILATION) +#error "You must define G_SETTINGS_ENABLE_BACKEND before including ." +#endif + +#define __GIO_GIO_H_INSIDE__ +#include +#undef __GIO_GIO_H_INSIDE__ + +G_BEGIN_DECLS + +#define G_TYPE_SETTINGS_BACKEND (g_settings_backend_get_type ()) +#define G_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SETTINGS_BACKEND, GSettingsBackend)) +#define G_SETTINGS_BACKEND_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SETTINGS_BACKEND, GSettingsBackendClass)) +#define G_IS_SETTINGS_BACKEND(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SETTINGS_BACKEND)) +#define G_IS_SETTINGS_BACKEND_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SETTINGS_BACKEND)) +#define G_SETTINGS_BACKEND_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SETTINGS_BACKEND, GSettingsBackendClass)) + +/** + * G_SETTINGS_BACKEND_EXTENSION_POINT_NAME: + * + * Extension point for #GSettingsBackend functionality. + **/ +#define G_SETTINGS_BACKEND_EXTENSION_POINT_NAME "gsettings-backend" + +/** + * GSettingsBackend: + * + * An implementation of a settings storage repository. + **/ +typedef struct _GSettingsBackendPrivate GSettingsBackendPrivate; +typedef struct _GSettingsBackendClass GSettingsBackendClass; + +struct _GSettingsBackendClass +{ + GObjectClass parent_class; + + GVariant * (*read) (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value); + + gboolean (*get_writable) (GSettingsBackend *backend, + const gchar *key); + + gboolean (*write) (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag); + gboolean (*write_tree) (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag); + void (*reset) (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag); + + void (*subscribe) (GSettingsBackend *backend, + const gchar *name); + void (*unsubscribe) (GSettingsBackend *backend, + const gchar *name); + void (*sync) (GSettingsBackend *backend); + + GPermission * (*get_permission) (GSettingsBackend *backend, + const gchar *path); + + gpointer padding[24]; +}; + +struct _GSettingsBackend +{ + GObject parent_instance; + + /*< private >*/ + GSettingsBackendPrivate *priv; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_settings_backend_get_type (void); + +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_changed (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag); +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_path_changed (GSettingsBackend *backend, + const gchar *path, + gpointer origin_tag); +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_flatten_tree (GTree *tree, + gchar **path, + const gchar ***keys, + GVariant ***values); +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_keys_changed (GSettingsBackend *backend, + const gchar *path, + gchar const * const *items, + gpointer origin_tag); + +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_path_writable_changed (GSettingsBackend *backend, + const gchar *path); +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_writable_changed (GSettingsBackend *backend, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +void g_settings_backend_changed_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag); + +GLIB_AVAILABLE_IN_ALL +GSettingsBackend * g_settings_backend_get_default (void); + +GLIB_AVAILABLE_IN_ALL +GSettingsBackend * g_keyfile_settings_backend_new (const gchar *filename, + const gchar *root_path, + const gchar *root_group); + +GLIB_AVAILABLE_IN_ALL +GSettingsBackend * g_null_settings_backend_new (void); + +GLIB_AVAILABLE_IN_ALL +GSettingsBackend * g_memory_settings_backend_new (void); + +G_END_DECLS + +#endif /* __G_SETTINGS_BACKEND_H__ */ diff --git a/gio/gsettingsbackendinternal.h b/gio/gsettingsbackendinternal.h new file mode 100644 index 0000000..f782c7c --- /dev/null +++ b/gio/gsettingsbackendinternal.h @@ -0,0 +1,93 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * Copyright © 2010 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 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 + * Matthias Clasen + */ + +#ifndef __G_SETTINGS_BACKEND_INTERNAL_H__ +#define __G_SETTINGS_BACKEND_INTERNAL_H__ + +#include "gsettingsbackend.h" + +typedef struct +{ + void (* changed) (GObject *target, + GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag); + void (* path_changed) (GObject *target, + GSettingsBackend *backend, + const gchar *path, + gpointer origin_tag); + void (* keys_changed) (GObject *target, + GSettingsBackend *backend, + const gchar *prefix, + const gchar * const *names, + gpointer origin_tag); + void (* writable_changed) (GObject *target, + GSettingsBackend *backend, + const gchar *key); + void (* path_writable_changed) (GObject *target, + GSettingsBackend *backend, + const gchar *path); +} GSettingsListenerVTable; + +void g_settings_backend_watch (GSettingsBackend *backend, + const GSettingsListenerVTable *vtable, + GObject *target, + GMainContext *context); +void g_settings_backend_unwatch (GSettingsBackend *backend, + GObject *target); + +GTree * g_settings_backend_create_tree (void); + +GVariant * g_settings_backend_read (GSettingsBackend *backend, + const gchar *key, + const GVariantType *expected_type, + gboolean default_value); +gboolean g_settings_backend_write (GSettingsBackend *backend, + const gchar *key, + GVariant *value, + gpointer origin_tag); +gboolean g_settings_backend_write_tree (GSettingsBackend *backend, + GTree *tree, + gpointer origin_tag); +void g_settings_backend_reset (GSettingsBackend *backend, + const gchar *key, + gpointer origin_tag); +gboolean g_settings_backend_get_writable (GSettingsBackend *backend, + const char *key); +void g_settings_backend_unsubscribe (GSettingsBackend *backend, + const char *name); +void g_settings_backend_subscribe (GSettingsBackend *backend, + const char *name); +GPermission * g_settings_backend_get_permission (GSettingsBackend *backend, + const gchar *path); +void g_settings_backend_sync_default (void); + +GType g_null_settings_backend_get_type (void); + +GType g_memory_settings_backend_get_type (void); + +#ifdef HAVE_COCOA +GType g_nextstep_settings_backend_get_type (void); +#endif + +#endif /* __G_SETTINGS_BACKEND_INTERNAL_H__ */ diff --git a/gio/gsettingsschema-internal.h b/gio/gsettingsschema-internal.h new file mode 100644 index 0000000..7b002c2 --- /dev/null +++ b/gio/gsettingsschema-internal.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +#ifndef __G_SETTINGS_SCHEMA_INTERNAL_H__ +#define __G_SETTINGS_SCHEMA_INTERNAL_H__ + +#include "gsettingsschema.h" + +typedef struct +{ + GSettingsSchema *schema; + const gchar *name; + + guint is_flags : 1; + guint is_enum : 1; + + const guint32 *strinfo; + gsize strinfo_length; + + const gchar *unparsed; + gchar lc_char; + + const GVariantType *type; + GVariant *minimum, *maximum; + GVariant *default_value; +} GSettingsSchemaKey; + +const gchar * g_settings_schema_get_gettext_domain (GSettingsSchema *schema); +GVariantIter * g_settings_schema_get_value (GSettingsSchema *schema, + const gchar *key); +gboolean g_settings_schema_has_key (GSettingsSchema *schema, + const gchar *key); +const GQuark * g_settings_schema_list (GSettingsSchema *schema, + gint *n_items); +const gchar * g_settings_schema_get_string (GSettingsSchema *schema, + const gchar *key); + +void g_settings_schema_key_init (GSettingsSchemaKey *key, + GSettingsSchema *schema, + const gchar *name); +void g_settings_schema_key_clear (GSettingsSchemaKey *key); +gboolean g_settings_schema_key_type_check (GSettingsSchemaKey *key, + GVariant *value); +gboolean g_settings_schema_key_range_check (GSettingsSchemaKey *key, + GVariant *value); +GVariant * g_settings_schema_key_range_fixup (GSettingsSchemaKey *key, + GVariant *value); +GVariant * g_settings_schema_key_get_translated_default (GSettingsSchemaKey *key); + +gint g_settings_schema_key_to_enum (GSettingsSchemaKey *key, + GVariant *value); +GVariant * g_settings_schema_key_from_enum (GSettingsSchemaKey *key, + gint value); +guint g_settings_schema_key_to_flags (GSettingsSchemaKey *key, + GVariant *value); +GVariant * g_settings_schema_key_from_flags (GSettingsSchemaKey *key, + guint value); + +#endif /* __G_SETTINGS_SCHEMA_INTERNAL_H__ */ diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c new file mode 100644 index 0000000..7ee807f --- /dev/null +++ b/gio/gsettingsschema.c @@ -0,0 +1,1036 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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. + */ + +#include "config.h" + +#include "gsettingsschema-internal.h" +#include "gsettings.h" + +#include "gvdb/gvdb-reader.h" +#include "strinfo.c" + +#include +#include +#include + +/** + * SECTION:gsettingsschema + * @short_description: introspecting and controlling the loading of + * GSettings schemas + * + * The #GSettingsSchemaSource and #GSettingsSchema APIs provide a + * mechanism for advanced control over the loading of schemas and a + * mechanism for introspecting their content. + * + * Plugin loading systems that wish to provide plugins a way to access + * settings face the problem of how to make the schemas for these + * settings visible to GSettings. Typically, a plugin will want to ship + * the schema along with itself and it won't be installed into the + * standard system directories for schemas. + * + * #GSettingsSchemaSource provides a mechanism for dealing with this by + * allowing the creation of a new 'schema source' from which schemas can + * be acquired. This schema source can then become part of the metadata + * associated with the plugin and queried whenever the plugin requires + * access to some settings. + * + * Consider the following example: + * + * |[ + * typedef struct + * { + * ... + * GSettingsSchemaSource *schema_source; + * ... + * } Plugin; + * + * Plugin * + * initialise_plugin (const gchar *dir) + * { + * Plugin *plugin; + * + * ... + * + * plugin->schema_source = + * g_settings_new_schema_source_from_directory (dir, + * g_settings_schema_source_get_default (), FALSE, NULL); + * + * ... + * + * return plugin; + * } + * + * ... + * + * GSettings * + * plugin_get_settings (Plugin *plugin, + * const gchar *schema_id) + * { + * GSettingsSchema *schema; + * + * if (schema_id == NULL) + * schema_id = plugin->identifier; + * + * schema = g_settings_schema_source_lookup (plugin->schema_source, + * schema_id, FALSE); + * + * if (schema == NULL) + * { + * ... disable the plugin or abort, etc ... + * } + * + * return g_settings_new_full (schema, NULL, NULL); + * } + * ]| + * + * The code above shows how hooks should be added to the code that + * initialises (or enables) the plugin to create the schema source and + * how an API can be added to the plugin system to provide a convenient + * way for the plugin to access its settings, using the schemas that it + * ships. + * + * From the standpoint of the plugin, it would need to ensure that it + * ships a gschemas.compiled file as part of itself, and then simply do + * the following: + * + * |[ + * { + * GSettings *settings; + * gint some_value; + * + * settings = plugin_get_settings (self, NULL); + * some_value = g_settings_get_int (settings, "some-value"); + * ... + * } + * ]| + * + * It's also possible that the plugin system expects the schema source + * files (ie: .gschema.xml files) instead of a gschemas.compiled file. + * In that case, the plugin loading system must compile the schemas for + * itself before attempting to create the settings source. + * + * Since: 2.32 + **/ + +/** + * GSettingsSchema: + * + * This is an opaque structure type. You may not access it directly. + * + * Since: 2.32 + **/ +struct _GSettingsSchema +{ + const gchar *gettext_domain; + const gchar *path; + GQuark *items; + gint n_items; + GvdbTable *table; + gchar *id; + + gint ref_count; +}; + +/** + * G_TYPE_SETTINGS_SCHEMA_SOURCE: + * + * A boxed #GType corresponding to #GSettingsSchemaSource. + * + * Since: 2.32 + **/ +G_DEFINE_BOXED_TYPE (GSettingsSchemaSource, g_settings_schema_source, g_settings_schema_source_ref, g_settings_schema_source_unref) + +/** + * G_TYPE_SETTINGS_SCHEMA: + * + * A boxed #GType corresponding to #GSettingsSchema. + * + * Since: 2.32 + **/ +G_DEFINE_BOXED_TYPE (GSettingsSchema, g_settings_schema, g_settings_schema_ref, g_settings_schema_unref) + +/** + * GSettingsSchemaSource: + * + * This is an opaque structure type. You may not access it directly. + * + * Since: 2.32 + **/ +struct _GSettingsSchemaSource +{ + GSettingsSchemaSource *parent; + GvdbTable *table; + + gint ref_count; +}; + +static GSettingsSchemaSource *schema_sources; + +static void +prepend_schema_table (GvdbTable *table) +{ + GSettingsSchemaSource *source; + + /* we steal the reference from 'schema_sources' for our ->parent */ + source = g_slice_new (GSettingsSchemaSource); + source->parent = schema_sources; + source->table = table; + source->ref_count = 1; + + schema_sources = source; +} + +/** + * g_settings_schema_source_ref: + * @source: a #GSettingsSchemaSource + * + * Increase the reference count of @source, returning a new reference. + * + * Returns: a new reference to @source + * + * Since: 2.32 + **/ +GSettingsSchemaSource * +g_settings_schema_source_ref (GSettingsSchemaSource *source) +{ + g_atomic_int_inc (&source->ref_count); + + return source; +} + +/** + * g_settings_schema_source_unref: + * @source: a #GSettingsSchemaSource + * + * Decrease the reference count of @source, possibly freeing it. + * + * Since: 2.32 + **/ +void +g_settings_schema_source_unref (GSettingsSchemaSource *source) +{ + if (g_atomic_int_dec_and_test (&source->ref_count)) + { + if (source == schema_sources) + g_error ("g_settings_schema_source_unref() called too many times on the default schema source"); + + if (source->parent) + g_settings_schema_source_unref (source->parent); + gvdb_table_unref (source->table); + + g_slice_free (GSettingsSchemaSource, source); + } +} + +/** + * g_settings_schema_source_new_from_directory: + * @directory: the filename of a directory + * @parent: (allow-none): a #GSettingsSchemaSource, or %NULL + * @trusted: %TRUE, if the directory is trusted + * @error: a pointer to a #GError pointer set to %NULL, or %NULL + * + * Attempts to create a new schema source corresponding to the contents + * of the given directory. + * + * This function is not required for normal uses of #GSettings but it + * may be useful to authors of plugin management systems. + * + * The directory should contain a file called + * gschemas.compiled as produced by + * glib-compile-schemas. + * + * If @trusted is %TRUE then gschemas.compiled is + * trusted not to be corrupted. This assumption has a performance + * advantage, but can result in crashes or inconsistent behaviour in the + * case of a corrupted file. Generally, you should set @trusted to + * %TRUE for files installed by the system and to %FALSE for files in + * the home directory. + * + * If @parent is non-%NULL then there are two effects. + * + * First, if g_settings_schema_source_lookup() is called with the + * @recursive flag set to %TRUE and the schema can not be found in the + * source, the lookup will recurse to the parent. + * + * Second, any references to other schemas specified within this + * source (ie: child or extends) + * references may be resolved from the @parent. + * + * For this second reason, except in very unusual situations, the + * @parent should probably be given as the default schema source, as + * returned by g_settings_schema_source_get_default(). + * + * Since: 2.32 + **/ +GSettingsSchemaSource * +g_settings_schema_source_new_from_directory (const gchar *directory, + GSettingsSchemaSource *parent, + gboolean trusted, + GError **error) +{ + GSettingsSchemaSource *source; + GvdbTable *table; + gchar *filename; + + filename = g_build_filename (directory, "gschemas.compiled", NULL); + table = gvdb_table_new (filename, trusted, error); + g_free (filename); + + if (table == NULL) + return NULL; + + source = g_slice_new (GSettingsSchemaSource); + source->parent = parent ? g_settings_schema_source_ref (parent) : NULL; + source->table = table; + source->ref_count = 1; + + return source; +} + +static void +initialise_schema_sources (void) +{ + static gsize initialised; + + /* need a separate variable because 'schema_sources' may legitimately + * be null if we have zero valid schema sources + */ + if G_UNLIKELY (g_once_init_enter (&initialised)) + { + const gchar * const *dirs; + const gchar *path; + gint i; + + /* iterate in reverse: count up, then count down */ + dirs = g_get_system_data_dirs (); + for (i = 0; dirs[i]; i++); + + while (i--) + { + gchar *filename; + GvdbTable *table; + + filename = g_build_filename (dirs[i], "glib-2.0", "schemas", "gschemas.compiled", NULL); + table = gvdb_table_new (filename, TRUE, NULL); + + if (table != NULL) + prepend_schema_table (table); + + g_free (filename); + } + + if ((path = g_getenv ("GSETTINGS_SCHEMA_DIR")) != NULL) + { + gchar *filename; + GvdbTable *table; + + filename = g_build_filename (path, "gschemas.compiled", NULL); + table = gvdb_table_new (filename, TRUE, NULL); + + if (table != NULL) + prepend_schema_table (table); + + g_free (filename); + } + + g_once_init_leave (&initialised, TRUE); + } +} + +/** + * g_settings_schema_source_get_default: + * + * Gets the default system schema source. + * + * This function is not required for normal uses of #GSettings but it + * may be useful to authors of plugin management systems or to those who + * want to introspect the content of schemas. + * + * If no schemas are installed, %NULL will be returned. + * + * The returned source may actually consist of multiple schema sources + * from different directories, depending on which directories were given + * in XDG_DATA_DIRS and + * GSETTINGS_SCHEMA_DIR. For this reason, all lookups + * performed against the default source should probably be done + * recursively. + * + * Returns: (transfer none): the default schema source + * + * Since: 2.32 + **/ + GSettingsSchemaSource * +g_settings_schema_source_get_default (void) +{ + initialise_schema_sources (); + + return schema_sources; +} + +/** + * g_settings_schema_source_lookup: + * @source: a #GSettingsSchemaSource + * @schema_id: a schema ID + * @recursive: %TRUE if the lookup should be recursive + * + * Looks up a schema with the identifier @schema_id in @source. + * + * This function is not required for normal uses of #GSettings but it + * may be useful to authors of plugin management systems or to those who + * want to introspect the content of schemas. + * + * If the schema isn't found directly in @source and @recursive is %TRUE + * then the parent sources will also be checked. + * + * If the schema isn't found, %NULL is returned. + * + * Returns: (transfer full): a new #GSettingsSchema + * + * Since: 2.32 + **/ +GSettingsSchema * +g_settings_schema_source_lookup (GSettingsSchemaSource *source, + const gchar *schema_id, + gboolean recursive) +{ + GSettingsSchema *schema; + GvdbTable *table; + + g_return_val_if_fail (source != NULL, NULL); + g_return_val_if_fail (schema_id != NULL, NULL); + + table = gvdb_table_get_table (source->table, schema_id); + + if (table == NULL && recursive) + for (source = source->parent; source; source = source->parent) + if ((table = gvdb_table_get_table (source->table, schema_id))) + break; + + if (table == NULL) + return NULL; + + schema = g_slice_new0 (GSettingsSchema); + schema->ref_count = 1; + schema->id = g_strdup (schema_id); + schema->table = table; + schema->path = g_settings_schema_get_string (schema, ".path"); + schema->gettext_domain = g_settings_schema_get_string (schema, ".gettext-domain"); + + if (schema->gettext_domain) + bind_textdomain_codeset (schema->gettext_domain, "UTF-8"); + + return schema; +} + +static gboolean +steal_item (gpointer key, + gpointer value, + gpointer user_data) +{ + gchar ***ptr = user_data; + + *(*ptr)++ = (gchar *) key; + + return TRUE; +} + +static const gchar * const *non_relocatable_schema_list; +static const gchar * const *relocatable_schema_list; +static gsize schema_lists_initialised; + +static void +ensure_schema_lists (void) +{ + if (g_once_init_enter (&schema_lists_initialised)) + { + GSettingsSchemaSource *source; + GHashTable *single, *reloc; + const gchar **ptr; + gchar **list; + gint i; + + initialise_schema_sources (); + + /* We use hash tables to avoid duplicate listings for schemas that + * appear in more than one file. + */ + single = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + reloc = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + + for (source = schema_sources; source; source = source->parent) + { + list = gvdb_table_list (source->table, ""); + + /* empty schema cache file? */ + if (list == NULL) + continue; + + for (i = 0; list[i]; i++) + { + if (!g_hash_table_lookup (single, list[i]) && + !g_hash_table_lookup (reloc, list[i])) + { + GvdbTable *table; + + table = gvdb_table_get_table (source->table, list[i]); + g_assert (table != NULL); + + if (gvdb_table_has_value (table, ".path")) + g_hash_table_insert (single, g_strdup (list[i]), NULL); + else + g_hash_table_insert (reloc, g_strdup (list[i]), NULL); + + gvdb_table_unref (table); + } + } + + g_strfreev (list); + } + + ptr = g_new (const gchar *, g_hash_table_size (single) + 1); + non_relocatable_schema_list = ptr; + g_hash_table_foreach_steal (single, steal_item, &ptr); + g_hash_table_unref (single); + *ptr = NULL; + + ptr = g_new (const gchar *, g_hash_table_size (reloc) + 1); + relocatable_schema_list = ptr; + g_hash_table_foreach_steal (reloc, steal_item, &ptr); + g_hash_table_unref (reloc); + *ptr = NULL; + + g_once_init_leave (&schema_lists_initialised, TRUE); + } +} + +/** + * g_settings_list_schemas: + * + * Gets a list of the #GSettings schemas installed on the system. The + * returned list is exactly the list of schemas for which you may call + * g_settings_new() without adverse effects. + * + * This function does not list the schemas that do not provide their own + * paths (ie: schemas for which you must use + * g_settings_new_with_path()). See + * g_settings_list_relocatable_schemas() for that. + * + * Returns: (element-type utf8) (transfer none): a list of #GSettings + * schemas that are available. The list must not be modified or + * freed. + * + * Since: 2.26 + **/ +const gchar * const * +g_settings_list_schemas (void) +{ + ensure_schema_lists (); + + return non_relocatable_schema_list; +} + +/** + * g_settings_list_relocatable_schemas: + * + * Gets a list of the relocatable #GSettings schemas installed on the + * system. These are schemas that do not provide their own path. It is + * usual to instantiate these schemas directly, but if you want to you + * can use g_settings_new_with_path() to specify the path. + * + * The output of this function, taken together with the output of + * g_settings_list_schemas() represents the complete list of all + * installed schemas. + * + * Returns: (element-type utf8) (transfer none): a list of relocatable + * #GSettings schemas that are available. The list must not be + * modified or freed. + * + * Since: 2.28 + **/ +const gchar * const * +g_settings_list_relocatable_schemas (void) +{ + ensure_schema_lists (); + + return relocatable_schema_list; +} + +/** + * g_settings_schema_ref: + * @schema: a #GSettingsSchema + * + * Increase the reference count of @schema, returning a new reference. + * + * Returns: a new reference to @schema + * + * Since: 2.32 + **/ +GSettingsSchema * +g_settings_schema_ref (GSettingsSchema *schema) +{ + g_atomic_int_inc (&schema->ref_count); + + return schema; +} + +/** + * g_settings_schema_unref: + * @schema: a #GSettingsSchema + * + * Decrease the reference count of @schema, possibly freeing it. + * + * Since: 2.32 + **/ +void +g_settings_schema_unref (GSettingsSchema *schema) +{ + if (g_atomic_int_dec_and_test (&schema->ref_count)) + { + gvdb_table_unref (schema->table); + g_free (schema->items); + g_free (schema->id); + + g_slice_free (GSettingsSchema, schema); + } +} + +const gchar * +g_settings_schema_get_string (GSettingsSchema *schema, + const gchar *key) +{ + const gchar *result = NULL; + GVariant *value; + + if ((value = gvdb_table_get_raw_value (schema->table, key))) + { + result = g_variant_get_string (value, NULL); + g_variant_unref (value); + } + + return result; +} + +GVariantIter * +g_settings_schema_get_value (GSettingsSchema *schema, + const gchar *key) +{ + GVariantIter *iter; + GVariant *value; + + value = gvdb_table_get_raw_value (schema->table, key); + + if G_UNLIKELY (value == NULL || !g_variant_is_of_type (value, G_VARIANT_TYPE_TUPLE)) + g_error ("Settings schema '%s' does not contain a key named '%s'", schema->id, key); + + iter = g_variant_iter_new (value); + g_variant_unref (value); + + return iter; +} + +/** + * g_settings_schema_get_path: + * @schema: a #GSettingsSchema + * + * Gets the path associated with @schema, or %NULL. + * + * Schemas may be single-instance or relocatable. Single-instance + * schemas correspond to exactly one set of keys in the backend + * database: those located at the path returned by this function. + * + * Relocatable schemas can be referenced by other schemas and can + * threfore describe multiple sets of keys at different locations. For + * relocatable schemas, this function will return %NULL. + * + * Returns: (transfer none): the path of the schema, or %NULL + * + * Since: 2.32 + **/ +const gchar * +g_settings_schema_get_path (GSettingsSchema *schema) +{ + return schema->path; +} + +const gchar * +g_settings_schema_get_gettext_domain (GSettingsSchema *schema) +{ + return schema->gettext_domain; +} + +gboolean +g_settings_schema_has_key (GSettingsSchema *schema, + const gchar *key) +{ + return gvdb_table_has_value (schema->table, key); +} + +const GQuark * +g_settings_schema_list (GSettingsSchema *schema, + gint *n_items) +{ + gint i, j; + + if (schema->items == NULL) + { + gchar **list; + gint len; + + list = gvdb_table_list (schema->table, ""); + len = list ? g_strv_length (list) : 0; + + schema->items = g_new (GQuark, len); + j = 0; + + for (i = 0; i < len; i++) + if (list[i][0] != '.') + schema->items[j++] = g_quark_from_string (list[i]); + schema->n_items = j; + + g_strfreev (list); + } + + *n_items = schema->n_items; + return schema->items; +} + +/** + * g_settings_schema_get_id: + * @schema: a #GSettingsSchema + * + * Get the ID of @schema. + * + * Returns: (transfer none): the ID + **/ +const gchar * +g_settings_schema_get_id (GSettingsSchema *schema) +{ + return schema->id; +} + +static inline void +endian_fixup (GVariant **value) +{ +#if G_BYTE_ORDER == G_BIG_ENDIAN + GVariant *tmp; + + tmp = g_variant_byteswap (*value); + g_variant_unref (*value); + *value = tmp; +#endif +} + +void +g_settings_schema_key_init (GSettingsSchemaKey *key, + GSettingsSchema *schema, + const gchar *name) +{ + GVariantIter *iter; + GVariant *data; + guchar code; + + memset (key, 0, sizeof *key); + + iter = g_settings_schema_get_value (schema, name); + + key->schema = g_settings_schema_ref (schema); + key->default_value = g_variant_iter_next_value (iter); + endian_fixup (&key->default_value); + key->type = g_variant_get_type (key->default_value); + key->name = g_intern_string (name); + + while (g_variant_iter_next (iter, "(y*)", &code, &data)) + { + switch (code) + { + case 'l': + /* translation requested */ + g_variant_get (data, "(y&s)", &key->lc_char, &key->unparsed); + break; + + case 'e': + /* enumerated types... */ + key->is_enum = TRUE; + goto choice; + + case 'f': + /* flags... */ + key->is_flags = TRUE; + goto choice; + + choice: case 'c': + /* ..., choices, aliases */ + key->strinfo = g_variant_get_fixed_array (data, &key->strinfo_length, sizeof (guint32)); + break; + + case 'r': + g_variant_get (data, "(**)", &key->minimum, &key->maximum); + endian_fixup (&key->minimum); + endian_fixup (&key->maximum); + break; + + default: + g_warning ("unknown schema extension '%c'", code); + break; + } + + g_variant_unref (data); + } + + g_variant_iter_free (iter); +} + +void +g_settings_schema_key_clear (GSettingsSchemaKey *key) +{ + if (key->minimum) + g_variant_unref (key->minimum); + + if (key->maximum) + g_variant_unref (key->maximum); + + g_variant_unref (key->default_value); + + g_settings_schema_unref (key->schema); +} + +gboolean +g_settings_schema_key_type_check (GSettingsSchemaKey *key, + GVariant *value) +{ + g_return_val_if_fail (value != NULL, FALSE); + + return g_variant_is_of_type (value, key->type); +} + +gboolean +g_settings_schema_key_range_check (GSettingsSchemaKey *key, + GVariant *value) +{ + if (key->minimum == NULL && key->strinfo == NULL) + return TRUE; + + if (g_variant_is_container (value)) + { + gboolean ok = TRUE; + GVariantIter iter; + GVariant *child; + + g_variant_iter_init (&iter, value); + while (ok && (child = g_variant_iter_next_value (&iter))) + { + ok = g_settings_schema_key_range_check (key, child); + g_variant_unref (child); + } + + return ok; + } + + if (key->minimum) + { + return g_variant_compare (key->minimum, value) <= 0 && + g_variant_compare (value, key->maximum) <= 0; + } + + return strinfo_is_string_valid (key->strinfo, key->strinfo_length, + g_variant_get_string (value, NULL)); +} + +GVariant * +g_settings_schema_key_range_fixup (GSettingsSchemaKey *key, + GVariant *value) +{ + const gchar *target; + + if (g_settings_schema_key_range_check (key, value)) + return g_variant_ref (value); + + if (key->strinfo == NULL) + return NULL; + + if (g_variant_is_container (value)) + { + GVariantBuilder builder; + GVariantIter iter; + GVariant *child; + + g_variant_iter_init (&iter, value); + g_variant_builder_init (&builder, g_variant_get_type (value)); + + while ((child = g_variant_iter_next_value (&iter))) + { + GVariant *fixed; + + fixed = g_settings_schema_key_range_fixup (key, child); + g_variant_unref (child); + + if (fixed == NULL) + { + g_variant_builder_clear (&builder); + return NULL; + } + + g_variant_builder_add_value (&builder, fixed); + g_variant_unref (fixed); + } + + return g_variant_ref_sink (g_variant_builder_end (&builder)); + } + + target = strinfo_string_from_alias (key->strinfo, key->strinfo_length, + g_variant_get_string (value, NULL)); + return target ? g_variant_ref_sink (g_variant_new_string (target)) : NULL; +} + + +GVariant * +g_settings_schema_key_get_translated_default (GSettingsSchemaKey *key) +{ + const gchar *translated; + GError *error = NULL; + const gchar *domain; + GVariant *value; + + domain = g_settings_schema_get_gettext_domain (key->schema); + + if (key->lc_char == '\0') + /* translation not requested for this key */ + return NULL; + + if (key->lc_char == 't') + translated = g_dcgettext (domain, key->unparsed, LC_TIME); + else + translated = g_dgettext (domain, key->unparsed); + + if (translated == key->unparsed) + /* the default value was not translated */ + return NULL; + + /* try to parse the translation of the unparsed default */ + value = g_variant_parse (key->type, translated, NULL, NULL, &error); + + if (value == NULL) + { + g_warning ("Failed to parse translated string `%s' for " + "key `%s' in schema `%s': %s", key->unparsed, key->name, + g_settings_schema_get_id (key->schema), error->message); + g_warning ("Using untranslated default instead."); + g_error_free (error); + } + + else if (!g_settings_schema_key_range_check (key, value)) + { + g_warning ("Translated default `%s' for key `%s' in schema `%s' " + "is outside of valid range", key->unparsed, key->name, + g_settings_schema_get_id (key->schema)); + g_variant_unref (value); + value = NULL; + } + + return value; +} + +gint +g_settings_schema_key_to_enum (GSettingsSchemaKey *key, + GVariant *value) +{ + gboolean it_worked; + guint result; + + it_worked = strinfo_enum_from_string (key->strinfo, key->strinfo_length, + g_variant_get_string (value, NULL), + &result); + + /* 'value' can only come from the backend after being filtered for validity, + * from the translation after being filtered for validity, or from the schema + * itself (which the schema compiler checks for validity). If this assertion + * fails then it's really a bug in GSettings or the schema compiler... + */ + g_assert (it_worked); + + return result; +} + +GVariant * +g_settings_schema_key_from_enum (GSettingsSchemaKey *key, + gint value) +{ + const gchar *string; + + string = strinfo_string_from_enum (key->strinfo, key->strinfo_length, value); + + if (string == NULL) + return NULL; + + return g_variant_new_string (string); +} + +guint +g_settings_schema_key_to_flags (GSettingsSchemaKey *key, + GVariant *value) +{ + GVariantIter iter; + const gchar *flag; + guint result; + + result = 0; + g_variant_iter_init (&iter, value); + while (g_variant_iter_next (&iter, "&s", &flag)) + { + gboolean it_worked; + guint flag_value; + + it_worked = strinfo_enum_from_string (key->strinfo, key->strinfo_length, flag, &flag_value); + /* as in g_settings_to_enum() */ + g_assert (it_worked); + + result |= flag_value; + } + + return result; +} + +GVariant * +g_settings_schema_key_from_flags (GSettingsSchemaKey *key, + guint value) +{ + GVariantBuilder builder; + gint i; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("as")); + + for (i = 0; i < 32; i++) + if (value & (1u << i)) + { + const gchar *string; + + string = strinfo_string_from_enum (key->strinfo, key->strinfo_length, 1u << i); + + if (string == NULL) + { + g_variant_builder_clear (&builder); + return NULL; + } + + g_variant_builder_add (&builder, "s", string); + } + + return g_variant_builder_end (&builder); +} diff --git a/gio/gsettingsschema.h b/gio/gsettingsschema.h new file mode 100644 index 0000000..a857758 --- /dev/null +++ b/gio/gsettingsschema.h @@ -0,0 +1,65 @@ +/* + * Copyright © 2010 Codethink Limited + * Copyright © 2011 Canonical 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. + */ + +#ifndef __G_SETTINGS_SCHEMA_H__ +#define __G_SETTINGS_SCHEMA_H__ + +#include + +typedef struct _GSettingsSchemaSource GSettingsSchemaSource; +typedef struct _GSettingsSchema GSettingsSchema; + +#define G_TYPE_SETTINGS_SCHEMA_SOURCE (g_settings_schema_source_get_type ()) +GLIB_AVAILABLE_IN_2_32 +GType g_settings_schema_source_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +GSettingsSchemaSource * g_settings_schema_source_get_default (void); +GLIB_AVAILABLE_IN_2_32 +GSettingsSchemaSource * g_settings_schema_source_ref (GSettingsSchemaSource *source); +GLIB_AVAILABLE_IN_2_32 +void g_settings_schema_source_unref (GSettingsSchemaSource *source); + +GLIB_AVAILABLE_IN_2_32 +GSettingsSchemaSource * g_settings_schema_source_new_from_directory (const gchar *directory, + GSettingsSchemaSource *parent, + gboolean trusted, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +GSettingsSchema * g_settings_schema_source_lookup (GSettingsSchemaSource *source, + const gchar *schema_id, + gboolean recursive); + +#define G_TYPE_SETTINGS_SCHEMA (g_settings_schema_get_type ()) +GLIB_AVAILABLE_IN_2_32 +GType g_settings_schema_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +GSettingsSchema * g_settings_schema_ref (GSettingsSchema *schema); +GLIB_AVAILABLE_IN_2_32 +void g_settings_schema_unref (GSettingsSchema *schema); + +GLIB_AVAILABLE_IN_2_32 +const gchar * g_settings_schema_get_id (GSettingsSchema *schema); +GLIB_AVAILABLE_IN_2_32 +const gchar * g_settings_schema_get_path (GSettingsSchema *schema); + +#endif /* __G_SETTINGS_SCHEMA_H__ */ diff --git a/gio/gsimpleaction.c b/gio/gsimpleaction.c new file mode 100644 index 0000000..64dacfd --- /dev/null +++ b/gio/gsimpleaction.c @@ -0,0 +1,554 @@ +/* + * 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 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 + */ + +#include "config.h" + +#include "gsimpleaction.h" + +#include "gaction.h" +#include "glibintl.h" + +/** + * SECTION:gsimpleaction + * @title: GSimpleAction + * @short_description: A simple GAction implementation + * + * A #GSimpleAction is the obvious simple implementation of the #GAction + * interface. This is the easiest way to create an action for purposes of + * adding it to a #GSimpleActionGroup. + * + * See also #GtkAction. + */ +struct _GSimpleAction +{ + GObject parent_instance; + + gchar *name; + GVariantType *parameter_type; + gboolean enabled; + GVariant *state; +}; + +typedef GObjectClass GSimpleActionClass; + +static void g_simple_action_iface_init (GActionInterface *iface); +G_DEFINE_TYPE_WITH_CODE (GSimpleAction, g_simple_action, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION, g_simple_action_iface_init)) + +enum +{ + PROP_NONE, + PROP_NAME, + PROP_PARAMETER_TYPE, + PROP_ENABLED, + PROP_STATE_TYPE, + PROP_STATE +}; + +enum +{ + SIGNAL_CHANGE_STATE, + SIGNAL_ACTIVATE, + NR_SIGNALS +}; + +static guint g_simple_action_signals[NR_SIGNALS]; + +static const gchar * +g_simple_action_get_name (GAction *action) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + return simple->name; +} + +static const GVariantType * +g_simple_action_get_parameter_type (GAction *action) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + return simple->parameter_type; +} + +static const GVariantType * +g_simple_action_get_state_type (GAction *action) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + if (simple->state != NULL) + return g_variant_get_type (simple->state); + else + return NULL; +} + +static GVariant * +g_simple_action_get_state_hint (GAction *action) +{ + return NULL; +} + +static gboolean +g_simple_action_get_enabled (GAction *action) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + return simple->enabled; +} + +static void +g_simple_action_change_state (GAction *action, + GVariant *value) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + /* If the user connected a signal handler then they are responsible + * for handling state changes. + */ + if (g_signal_has_handler_pending (action, g_simple_action_signals[SIGNAL_CHANGE_STATE], 0, TRUE)) + g_signal_emit (action, g_simple_action_signals[SIGNAL_CHANGE_STATE], 0, value); + + /* If not, then the default behaviour is to just set the state. */ + else + g_simple_action_set_state (simple, value); +} + +/** + * g_simple_action_set_state: + * @simple: a #GSimpleAction + * @value: the new #GVariant for the state + * + * Sets the state of the action. + * + * This directly updates the 'state' property to the given value. + * + * This should only be called by the implementor of the action. Users + * of the action should not attempt to directly modify the 'state' + * property. Instead, they should call g_action_change_state() to + * request the change. + * + * Since: 2.30 + **/ +void +g_simple_action_set_state (GSimpleAction *simple, + GVariant *value) +{ + g_return_if_fail (G_IS_SIMPLE_ACTION (simple)); + g_return_if_fail (value != NULL); + + { + const GVariantType *state_type; + + state_type = simple->state ? + g_variant_get_type (simple->state) : NULL; + g_return_if_fail (state_type != NULL); + g_return_if_fail (g_variant_is_of_type (value, state_type)); + } + + g_variant_ref_sink (value); + + if (!simple->state || !g_variant_equal (simple->state, value)) + { + if (simple->state) + g_variant_unref (simple->state); + + simple->state = g_variant_ref (value); + + g_object_notify (G_OBJECT (simple), "state"); + } + + g_variant_unref (value); +} + +static GVariant * +g_simple_action_get_state (GAction *action) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + return simple->state ? g_variant_ref (simple->state) : NULL; +} + +static void +g_simple_action_activate (GAction *action, + GVariant *parameter) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (action); + + g_return_if_fail (simple->parameter_type == NULL ? + parameter == NULL : + (parameter != NULL && + g_variant_is_of_type (parameter, + simple->parameter_type))); + + if (parameter != NULL) + g_variant_ref_sink (parameter); + + if (simple->enabled) + g_signal_emit (simple, g_simple_action_signals[SIGNAL_ACTIVATE], 0, parameter); + + if (parameter != NULL) + g_variant_unref (parameter); +} + +static void +g_simple_action_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSimpleAction *action = G_SIMPLE_ACTION (object); + + switch (prop_id) + { + case PROP_NAME: + action->name = g_strdup (g_value_get_string (value)); + break; + + case PROP_PARAMETER_TYPE: + action->parameter_type = g_value_dup_boxed (value); + break; + + case PROP_ENABLED: + action->enabled = g_value_get_boolean (value); + break; + + case PROP_STATE: + action->state = g_value_dup_variant (value); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_simple_action_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GAction *action = G_ACTION (object); + + switch (prop_id) + { + case PROP_NAME: + g_value_set_string (value, g_simple_action_get_name (action)); + break; + + case PROP_PARAMETER_TYPE: + g_value_set_boxed (value, g_simple_action_get_parameter_type (action)); + break; + + case PROP_ENABLED: + g_value_set_boolean (value, g_simple_action_get_enabled (action)); + break; + + case PROP_STATE_TYPE: + g_value_set_boxed (value, g_simple_action_get_state_type (action)); + break; + + case PROP_STATE: + g_value_take_variant (value, g_simple_action_get_state (action)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +g_simple_action_finalize (GObject *object) +{ + GSimpleAction *simple = G_SIMPLE_ACTION (object); + + g_free (simple->name); + if (simple->parameter_type) + g_variant_type_free (simple->parameter_type); + if (simple->state) + g_variant_unref (simple->state); + + G_OBJECT_CLASS (g_simple_action_parent_class) + ->finalize (object); +} + +void +g_simple_action_init (GSimpleAction *simple) +{ + simple->enabled = TRUE; +} + +void +g_simple_action_iface_init (GActionInterface *iface) +{ + iface->get_name = g_simple_action_get_name; + iface->get_parameter_type = g_simple_action_get_parameter_type; + iface->get_state_type = g_simple_action_get_state_type; + iface->get_state_hint = g_simple_action_get_state_hint; + iface->get_enabled = g_simple_action_get_enabled; + iface->get_state = g_simple_action_get_state; + iface->change_state = g_simple_action_change_state; + iface->activate = g_simple_action_activate; +} + +void +g_simple_action_class_init (GSimpleActionClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = g_simple_action_set_property; + object_class->get_property = g_simple_action_get_property; + object_class->finalize = g_simple_action_finalize; + + /** + * GSimpleAction::activate: + * @simple: the #GSimpleAction + * @parameter: (allow-none): the parameter to the activation + * + * Indicates that the action was just activated. + * + * @parameter will always be of the expected type. In the event that + * an incorrect type was given, no signal will be emitted. + * + * Since: 2.28 + */ + g_simple_action_signals[SIGNAL_ACTIVATE] = + g_signal_new (I_("activate"), + G_TYPE_SIMPLE_ACTION, + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VARIANT, + G_TYPE_NONE, 1, + G_TYPE_VARIANT); + + /** + * GSimpleAction::change-state: + * @simple: the #GSimpleAction + * @value: (allow-none): the requested value for the state + * + * Indicates that the action just received a request to change its + * state. + * + * @value will always be of the correct state type. In the event that + * an incorrect type was given, no signal will be emitted. + * + * If no handler is connected to this signal then the default + * behaviour is to call g_simple_action_set_state() to set the state + * to the requested value. If you connect a signal handler then no + * default action is taken. If the state should change then you must + * call g_simple_action_set_state() from the handler. + * + * + * Example 'change-state' handler + * + * static void + * change_volume_state (GSimpleAction *action, + * GVariant *value, + * gpointer user_data) + * { + * gint requested; + * + * requested = g_variant_get_int32 (value); + * + * // Volume only goes from 0 to 10 + * if (0 <= requested && requested <= 10) + * g_simple_action_set_state (action, value); + * } + * + * + * + * The handler need not set the state to the requested value. It + * could set it to any value at all, or take some other action. + * + * Since: 2.30 + */ + g_simple_action_signals[SIGNAL_CHANGE_STATE] = + g_signal_new (I_("change-state"), + G_TYPE_SIMPLE_ACTION, + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VARIANT, + G_TYPE_NONE, 1, + G_TYPE_VARIANT); + + /** + * GSimpleAction:name: + * + * The name of the action. This is mostly meaningful for identifying + * the action once it has been added to a #GSimpleActionGroup. + * + * Since: 2.28 + **/ + g_object_class_install_property (object_class, PROP_NAME, + g_param_spec_string ("name", + P_("Action Name"), + P_("The name used to invoke the action"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GSimpleAction:parameter-type: + * + * The type of the parameter that must be given when activating the + * action. + * + * Since: 2.28 + **/ + g_object_class_install_property (object_class, PROP_PARAMETER_TYPE, + g_param_spec_boxed ("parameter-type", + P_("Parameter Type"), + P_("The type of GVariant passed to activate()"), + G_TYPE_VARIANT_TYPE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + + /** + * GSimpleAction:enabled: + * + * If @action is currently enabled. + * + * If the action is disabled then calls to g_action_activate() and + * g_action_change_state() have no effect. + * + * Since: 2.28 + **/ + g_object_class_install_property (object_class, PROP_ENABLED, + g_param_spec_boolean ("enabled", + P_("Enabled"), + P_("If the action can be activated"), + TRUE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSimpleAction:state-type: + * + * The #GVariantType of the state that the action has, or %NULL if the + * action is stateless. + * + * Since: 2.28 + **/ + g_object_class_install_property (object_class, PROP_STATE_TYPE, + g_param_spec_boxed ("state-type", + P_("State Type"), + P_("The type of the state kept by the action"), + G_TYPE_VARIANT_TYPE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSimpleAction:state: + * + * The state of the action, or %NULL if the action is stateless. + * + * Since: 2.28 + **/ + g_object_class_install_property (object_class, PROP_STATE, + g_param_spec_variant ("state", + P_("State"), + P_("The state the action is in"), + G_VARIANT_TYPE_ANY, + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_simple_action_set_enabled: + * @simple: a #GSimpleAction + * @enabled: whether the action is enabled + * + * Sets the action as enabled or not. + * + * An action must be enabled in order to be activated or in order to + * have its state changed from outside callers. + * + * This should only be called by the implementor of the action. Users + * of the action should not attempt to modify its enabled flag. + * + * Since: 2.28 + **/ +void +g_simple_action_set_enabled (GSimpleAction *simple, + gboolean enabled) +{ + g_return_if_fail (G_IS_SIMPLE_ACTION (simple)); + + enabled = !!enabled; + + if (simple->enabled != enabled) + { + simple->enabled = enabled; + g_object_notify (G_OBJECT (simple), "enabled"); + } +} +/** + * g_simple_action_new: + * @name: the name of the action + * @parameter_type: (allow-none): the type of parameter to the activate function + * + * Creates a new action. + * + * The created action is stateless. See g_simple_action_new_stateful(). + * + * Returns: a new #GSimpleAction + * + * Since: 2.28 + **/ +GSimpleAction * +g_simple_action_new (const gchar *name, + const GVariantType *parameter_type) +{ + return g_object_new (G_TYPE_SIMPLE_ACTION, + "name", name, + "parameter-type", parameter_type, + NULL); +} + +/** + * g_simple_action_new_stateful: + * @name: the name of the action + * @parameter_type: (allow-none): the type of the parameter to the activate function + * @state: the initial state of the action + * + * Creates a new stateful action. + * + * @state is the initial state of the action. All future state values + * must have the same #GVariantType as the initial state. + * + * If the @state GVariant is floating, it is consumed. + * + * Returns: a new #GSimpleAction + * + * Since: 2.28 + **/ +GSimpleAction * +g_simple_action_new_stateful (const gchar *name, + const GVariantType *parameter_type, + GVariant *state) +{ + return g_object_new (G_TYPE_SIMPLE_ACTION, + "name", name, + "parameter-type", parameter_type, + "state", state, + NULL); +} diff --git a/gio/gsimpleaction.h b/gio/gsimpleaction.h new file mode 100644 index 0000000..b89b1a9 --- /dev/null +++ b/gio/gsimpleaction.h @@ -0,0 +1,61 @@ +/* + * 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 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_SIMPLE_ACTION_H__ +#define __G_SIMPLE_ACTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SIMPLE_ACTION (g_simple_action_get_type ()) +#define G_SIMPLE_ACTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SIMPLE_ACTION, GSimpleAction)) +#define G_IS_SIMPLE_ACTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SIMPLE_ACTION)) + +GLIB_AVAILABLE_IN_ALL +GType g_simple_action_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSimpleAction * g_simple_action_new (const gchar *name, + const GVariantType *parameter_type); + +GLIB_AVAILABLE_IN_ALL +GSimpleAction * g_simple_action_new_stateful (const gchar *name, + const GVariantType *parameter_type, + GVariant *state); + +GLIB_AVAILABLE_IN_ALL +void g_simple_action_set_enabled (GSimpleAction *simple, + gboolean enabled); + +GLIB_AVAILABLE_IN_2_30 +void g_simple_action_set_state (GSimpleAction *simple, + GVariant *value); + +G_END_DECLS + +#endif /* __G_SIMPLE_ACTION_H__ */ diff --git a/gio/gsimpleactiongroup.c b/gio/gsimpleactiongroup.c new file mode 100644 index 0000000..b4e422a --- /dev/null +++ b/gio/gsimpleactiongroup.c @@ -0,0 +1,389 @@ +/* + * 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 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 + */ + +#include "config.h" + +#include "gsimpleactiongroup.h" + +#include "gsimpleaction.h" +#include "gactionmap.h" +#include "gaction.h" + +/** + * SECTION:gsimpleactiongroup + * @title: GSimpleActionGroup + * @short_description: A simple GActionGroup implementation + * + * #GSimpleActionGroup is a hash table filled with #GAction objects, + * implementing the #GActionGroup and #GActionMap interfaces. + **/ + +struct _GSimpleActionGroupPrivate +{ + GHashTable *table; /* string -> GAction */ +}; + +static void g_simple_action_group_iface_init (GActionGroupInterface *); +static void g_simple_action_group_map_iface_init (GActionMapInterface *); +G_DEFINE_TYPE_WITH_CODE (GSimpleActionGroup, + g_simple_action_group, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, + g_simple_action_group_iface_init); + G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_MAP, + g_simple_action_group_map_iface_init)) + +static gchar ** +g_simple_action_group_list_actions (GActionGroup *group) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (group); + GHashTableIter iter; + gint n, i = 0; + gchar **keys; + gpointer key; + + n = g_hash_table_size (simple->priv->table); + keys = g_new (gchar *, n + 1); + + g_hash_table_iter_init (&iter, simple->priv->table); + while (g_hash_table_iter_next (&iter, &key, NULL)) + keys[i++] = g_strdup (key); + g_assert_cmpint (i, ==, n); + keys[n] = NULL; + + return keys; +} + +static gboolean +g_simple_action_group_query_action (GActionGroup *group, + const gchar *action_name, + gboolean *enabled, + const GVariantType **parameter_type, + const GVariantType **state_type, + GVariant **state_hint, + GVariant **state) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (group); + GAction *action; + + action = g_hash_table_lookup (simple->priv->table, action_name); + + if (action == NULL) + return FALSE; + + if (enabled) + *enabled = g_action_get_enabled (action); + + if (parameter_type) + *parameter_type = g_action_get_parameter_type (action); + + if (state_type) + *state_type = g_action_get_state_type (action); + + if (state_hint) + *state_hint = g_action_get_state_hint (action); + + if (state) + *state = g_action_get_state (action); + + return TRUE; +} + +static void +g_simple_action_group_change_state (GActionGroup *group, + const gchar *action_name, + GVariant *value) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (group); + GAction *action; + + action = g_hash_table_lookup (simple->priv->table, action_name); + + if (action == NULL) + return; + + g_action_change_state (action, value); +} + +static void +g_simple_action_group_activate (GActionGroup *group, + const gchar *action_name, + GVariant *parameter) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (group); + GAction *action; + + action = g_hash_table_lookup (simple->priv->table, action_name); + + if (action == NULL) + return; + + g_action_activate (action, parameter); +} + +static void +action_enabled_notify (GAction *action, + GParamSpec *pspec, + gpointer user_data) +{ + g_action_group_action_enabled_changed (user_data, + g_action_get_name (action), + g_action_get_enabled (action)); +} + +static void +action_state_notify (GAction *action, + GParamSpec *pspec, + gpointer user_data) +{ + GVariant *value; + + value = g_action_get_state (action); + g_action_group_action_state_changed (user_data, + g_action_get_name (action), + value); + g_variant_unref (value); +} + +static void +g_simple_action_group_disconnect (gpointer key, + gpointer value, + gpointer user_data) +{ + g_signal_handlers_disconnect_by_func (value, action_enabled_notify, + user_data); + g_signal_handlers_disconnect_by_func (value, action_state_notify, + user_data); +} + +static GAction * +g_simple_action_group_lookup_action (GActionMap *action_map, + const gchar *action_name) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (action_map); + + return g_hash_table_lookup (simple->priv->table, action_name); +} + +static void +g_simple_action_group_add_action (GActionMap *action_map, + GAction *action) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (action_map); + const gchar *action_name; + GAction *old_action; + + action_name = g_action_get_name (action); + old_action = g_hash_table_lookup (simple->priv->table, action_name); + + if (old_action != action) + { + if (old_action != NULL) + { + g_action_group_action_removed (G_ACTION_GROUP (simple), + action_name); + g_simple_action_group_disconnect (NULL, old_action, simple); + } + + g_signal_connect (action, "notify::enabled", + G_CALLBACK (action_enabled_notify), simple); + + if (g_action_get_state_type (action) != NULL) + g_signal_connect (action, "notify::state", + G_CALLBACK (action_state_notify), simple); + + g_hash_table_insert (simple->priv->table, + g_strdup (action_name), + g_object_ref (action)); + + g_action_group_action_added (G_ACTION_GROUP (simple), action_name); + } +} + +static void +g_simple_action_group_remove_action (GActionMap *action_map, + const gchar *action_name) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (action_map); + GAction *action; + + action = g_hash_table_lookup (simple->priv->table, action_name); + + if (action != NULL) + { + g_action_group_action_removed (G_ACTION_GROUP (simple), action_name); + g_simple_action_group_disconnect (NULL, action, simple); + g_hash_table_remove (simple->priv->table, action_name); + } +} + +static void +g_simple_action_group_finalize (GObject *object) +{ + GSimpleActionGroup *simple = G_SIMPLE_ACTION_GROUP (object); + + g_hash_table_foreach (simple->priv->table, + g_simple_action_group_disconnect, + simple); + g_hash_table_unref (simple->priv->table); + + G_OBJECT_CLASS (g_simple_action_group_parent_class) + ->finalize (object); +} + +static void +g_simple_action_group_init (GSimpleActionGroup *simple) +{ + simple->priv = G_TYPE_INSTANCE_GET_PRIVATE (simple, + G_TYPE_SIMPLE_ACTION_GROUP, + GSimpleActionGroupPrivate); + simple->priv->table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_object_unref); +} + +static void +g_simple_action_group_class_init (GSimpleActionGroupClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->finalize = g_simple_action_group_finalize; + + g_type_class_add_private (class, sizeof (GSimpleActionGroupPrivate)); +} + +static void +g_simple_action_group_iface_init (GActionGroupInterface *iface) +{ + iface->list_actions = g_simple_action_group_list_actions; + iface->query_action = g_simple_action_group_query_action; + iface->change_action_state = g_simple_action_group_change_state; + iface->activate_action = g_simple_action_group_activate; +} + +static void +g_simple_action_group_map_iface_init (GActionMapInterface *iface) +{ + iface->add_action = g_simple_action_group_add_action; + iface->remove_action = g_simple_action_group_remove_action; + iface->lookup_action = g_simple_action_group_lookup_action; +} + +/** + * g_simple_action_group_new: + * + * Creates a new, empty, #GSimpleActionGroup. + * + * Returns: a new #GSimpleActionGroup + * + * Since: 2.28 + **/ +GSimpleActionGroup * +g_simple_action_group_new (void) +{ + return g_object_new (G_TYPE_SIMPLE_ACTION_GROUP, NULL); +} + +/** + * g_simple_action_group_lookup: + * @simple: a #GSimpleActionGroup + * @action_name: the name of an action + * + * Looks up the action with the name @action_name in the group. + * + * If no such action exists, returns %NULL. + * + * Returns: (transfer none): a #GAction, or %NULL + * + * Since: 2.28 + */ +GAction * +g_simple_action_group_lookup (GSimpleActionGroup *simple, + const gchar *action_name) +{ + g_return_val_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple), NULL); + + return g_action_map_lookup_action (G_ACTION_MAP (simple), action_name); +} + +/** + * g_simple_action_group_insert: + * @simple: a #GSimpleActionGroup + * @action: a #GAction + * + * Adds an action to the action group. + * + * If the action group already contains an action with the same name as + * @action then the old action is dropped from the group. + * + * The action group takes its own reference on @action. + * + * Since: 2.28 + **/ +void +g_simple_action_group_insert (GSimpleActionGroup *simple, + GAction *action) +{ + g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple)); + + g_action_map_add_action (G_ACTION_MAP (simple), action); +} + +/** + * g_simple_action_group_remove: + * @simple: a #GSimpleActionGroup + * @action_name: the name of the action + * + * Removes the named action from the action group. + * + * If no action of this name is in the group then nothing happens. + * + * Since: 2.28 + **/ +void +g_simple_action_group_remove (GSimpleActionGroup *simple, + const gchar *action_name) +{ + g_return_if_fail (G_IS_SIMPLE_ACTION_GROUP (simple)); + + g_action_map_remove_action (G_ACTION_MAP (simple), action_name); +} + + +/** + * g_simple_action_group_add_entries: + * @simple: a #GSimpleActionGroup + * @entries: (array length=n_entries): a pointer to the first item in + * an array of #GActionEntry structs + * @n_entries: the length of @entries, or -1 + * @user_data: the user data for signal connections + * + * A convenience function for creating multiple #GSimpleAction instances + * and adding them to the action group. + * + * Since: 2.30 + **/ +void +g_simple_action_group_add_entries (GSimpleActionGroup *simple, + const GActionEntry *entries, + gint n_entries, + gpointer user_data) +{ + g_action_map_add_action_entries (G_ACTION_MAP (simple), entries, n_entries, user_data); +} diff --git a/gio/gsimpleactiongroup.h b/gio/gsimpleactiongroup.h new file mode 100644 index 0000000..5f17626 --- /dev/null +++ b/gio/gsimpleactiongroup.h @@ -0,0 +1,99 @@ +/* + * 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 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_SIMPLE_ACTION_GROUP_H__ +#define __G_SIMPLE_ACTION_GROUP_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include "gactiongroup.h" +#include "gactionmap.h" + +G_BEGIN_DECLS + +#define G_TYPE_SIMPLE_ACTION_GROUP (g_simple_action_group_get_type ()) +#define G_SIMPLE_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SIMPLE_ACTION_GROUP, GSimpleActionGroup)) +#define G_SIMPLE_ACTION_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_SIMPLE_ACTION_GROUP, GSimpleActionGroupClass)) +#define G_IS_SIMPLE_ACTION_GROUP(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SIMPLE_ACTION_GROUP)) +#define G_IS_SIMPLE_ACTION_GROUP_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_SIMPLE_ACTION_GROUP)) +#define G_SIMPLE_ACTION_GROUP_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_SIMPLE_ACTION_GROUP, GSimpleActionGroupClass)) + +typedef struct _GSimpleActionGroupPrivate GSimpleActionGroupPrivate; +typedef struct _GSimpleActionGroupClass GSimpleActionGroupClass; + +/** + * GSimpleActionGroup: + * + * The #GSimpleActionGroup structure contains private data and should only be accessed using the provided API. + * + * Since: 2.28 + */ +struct _GSimpleActionGroup +{ + /*< private >*/ + GObject parent_instance; + + GSimpleActionGroupPrivate *priv; +}; + +struct _GSimpleActionGroupClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< private >*/ + gpointer padding[12]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_simple_action_group_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSimpleActionGroup * g_simple_action_group_new (void); + +GLIB_AVAILABLE_IN_ALL +GAction * g_simple_action_group_lookup (GSimpleActionGroup *simple, + const gchar *action_name); + +GLIB_AVAILABLE_IN_ALL +void g_simple_action_group_insert (GSimpleActionGroup *simple, + GAction *action); + +GLIB_AVAILABLE_IN_ALL +void g_simple_action_group_remove (GSimpleActionGroup *simple, + const gchar *action_name); + +GLIB_AVAILABLE_IN_2_30 +void g_simple_action_group_add_entries (GSimpleActionGroup *simple, + const GActionEntry *entries, + gint n_entries, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_SIMPLE_ACTION_GROUP_H__ */ diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c new file mode 100644 index 0000000..c5d8103 --- /dev/null +++ b/gio/gsimpleasyncresult.c @@ -0,0 +1,1106 @@ +/* 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" + + +/** + * SECTION:gsimpleasyncresult + * @short_description: Simple asynchronous results implementation + * @include: gio/gio.h + * @see_also: #GAsyncResult + * + * + * As of GLib 2.36, #GSimpleAsyncResult is deprecated in favor of + * #GTask, which provides a simpler API. + * + * + * #GSimpleAsyncResult implements #GAsyncResult. + * + * 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() or + * g_simple_async_result_new_take_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. + * 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. + * + * For the details of the requirements implementations must respect, see + * #GAsyncResult. A typical implementation of an asynchronous operation + * using GSimpleAsyncResult looks something like this: + * + * |[ + * static void + * baked_cb (Cake *cake, + * gpointer user_data) + * { + * /* In this example, this callback is not given a reference to the cake, so + * * the GSimpleAsyncResult has to take a reference to it. + * */ + * GSimpleAsyncResult *result = user_data; + * + * if (cake == NULL) + * g_simple_async_result_set_error (result, + * BAKER_ERRORS, + * BAKER_ERROR_NO_FLOUR, + * "Go to the supermarket"); + * else + * g_simple_async_result_set_op_res_gpointer (result, + * g_object_ref (cake), + * g_object_unref); + * + * + * /* In this example, we assume that baked_cb is called as a callback from + * * the mainloop, so it's safe to complete the operation synchronously here. + * * If, however, _baker_prepare_cake () might call its callback without + * * first returning to the mainloop — inadvisable, but some APIs do so — + * * we would need to use g_simple_async_result_complete_in_idle(). + * */ + * g_simple_async_result_complete (result); + * g_object_unref (result); + * } + * + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * GSimpleAsyncResult *simple; + * Cake *cake; + * + * if (radius < 3) + * { + * g_simple_async_report_error_in_idle (G_OBJECT (self), + * callback, + * user_data, + * BAKER_ERRORS, + * BAKER_ERROR_TOO_SMALL, + * "%ucm radius cakes are silly", + * radius); + * return; + * } + * + * simple = g_simple_async_result_new (G_OBJECT (self), + * callback, + * user_data, + * baker_bake_cake_async); + * cake = _baker_get_cached_cake (self, radius); + * + * if (cake != NULL) + * { + * g_simple_async_result_set_op_res_gpointer (simple, + * g_object_ref (cake), + * g_object_unref); + * g_simple_async_result_complete_in_idle (simple); + * g_object_unref (simple); + * /* Drop the reference returned by _baker_get_cached_cake(); the + * * GSimpleAsyncResult has taken its own reference. + * */ + * g_object_unref (cake); + * return; + * } + * + * _baker_prepare_cake (self, radius, baked_cb, simple); + * } + * + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * GSimpleAsyncResult *simple; + * Cake *cake; + * + * g_return_val_if_fail (g_simple_async_result_is_valid (result, + * G_OBJECT (self), + * baker_bake_cake_async), + * NULL); + * + * simple = (GSimpleAsyncResult *) result; + * + * if (g_simple_async_result_propagate_error (simple, error)) + * return NULL; + * + * cake = CAKE (g_simple_async_result_get_op_res_gpointer (simple)); + * return g_object_ref (cake); + * } + * ]| + */ + +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; + GCancellable *check_cancellable; + + 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->check_cancellable) + g_object_unref (simple->check_cancellable); + + 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_ref_thread_default (); +} + +/** + * g_simple_async_result_new: + * @source_object: (allow-none): a #GObject, or %NULL. + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): user data passed to @callback. + * @source_tag: the asynchronous function. + * + * Creates a #GSimpleAsyncResult. + * + * The common convention is to create the #GSimpleAsyncResult in the + * function that starts the asynchronous operation and use that same + * function as the @source_tag. + * + * If your operation supports cancellation with #GCancellable (which it + * probably should) then you should provide the user's cancellable to + * g_simple_async_result_set_check_cancellable() immediately after + * this function returns. + * + * 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: (allow-none): a #GObject, or %NULL. + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): user data passed to @callback. + * @error: a #GError + * + * 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, + const 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_take_error: (skip) + * @source_object: (allow-none): a #GObject, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): user data passed to @callback + * @error: a #GError + * + * Creates a #GSimpleAsyncResult from an error condition, and takes over the + * caller's ownership of @error, so the caller does not need to free it anymore. + * + * Returns: a #GSimpleAsyncResult + * + * Since: 2.28 + **/ +GSimpleAsyncResult * +g_simple_async_result_new_take_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_take_error (simple, error); + + return simple; +} + +/** + * g_simple_async_result_new_error: + * @source_object: (allow-none): a #GObject, or %NULL. + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): 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 gboolean +g_simple_async_result_is_tagged (GAsyncResult *res, + gpointer source_tag) +{ + return G_SIMPLE_ASYNC_RESULT (res)->source_tag == source_tag; +} + +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; + iface->is_tagged = g_simple_async_result_is_tagged; +} + +/** + * g_simple_async_result_set_handle_cancellation: + * @simple: a #GSimpleAsyncResult. + * @handle_cancellation: a #gboolean. + * + * Sets whether to handle cancellation within the asynchronous operation. + * + * This function has nothing to do with + * g_simple_async_result_set_check_cancellable(). It only refers to the + * #GCancellable passed to g_simple_async_result_run_in_thread(). + **/ +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: (skip) + * @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: (out): a location to propagate the error to. + * + * Propagates an error from within the simple asynchronous result to + * a given destination. + * + * If the #GCancellable given to a prior call to + * g_simple_async_result_set_check_cancellable() is cancelled then this + * function will return %TRUE with @dest set appropriately. + * + * 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 (g_cancellable_set_error_if_cancelled (simple->check_cancellable, dest)) + return TRUE; + + if (simple->failed) + { + g_propagate_error (dest, simple->error); + simple->error = NULL; + return TRUE; + } + + return FALSE; +} + +/** + * g_simple_async_result_set_op_res_gpointer: (skip) + * @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: (skip) + * @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_take_error: (skip) + * @simple: a #GSimpleAsyncResult + * @error: a #GError + * + * Sets the result from @error, and takes over the caller's ownership + * of @error, so the caller does not need to free it any more. + * + * Since: 2.28 + **/ +void +g_simple_async_result_take_error (GSimpleAsyncResult *simple, + 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 = error; + simple->failed = TRUE; +} + +/** + * g_simple_async_result_set_error_va: (skip) + * @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: (skip) + * @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(). + * + * Calling this function takes a reference to @simple for as long as + * is needed to complete the call. + **/ +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 (simple->context != current_context) + g_warning ("g_simple_async_result_complete() called from wrong context!"); + } +#endif + + if (simple->callback) + { + g_main_context_push_thread_default (simple->context); + simple->callback (simple->source_object, + G_ASYNC_RESULT (simple), + simple->user_data); + g_main_context_pop_thread_default (simple->context); + } +} + +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 + * (and re-pushes that context around the invocation of the callback). + * + * 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: (skip) + * @simple: a #GSimpleAsyncResult. + * @func: a #GSimpleAsyncThreadFunc. + * @io_priority: the io priority of the request. + * @cancellable: (allow-none): 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_GNUC_BEGIN_IGNORE_DEPRECATIONS; + g_io_scheduler_push_job (run_in_thread, data, NULL, io_priority, cancellable); + G_GNUC_END_IGNORE_DEPRECATIONS; +} + +/** + * 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 either %NULL (as it is when the result was + * created by g_simple_async_report_error_in_idle() or + * g_simple_async_report_gerror_in_idle()) or 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. + * + * Since: 2.20 + **/ +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) + { + if (cmp_source != NULL) + g_object_unref (cmp_source); + return FALSE; + } + if (cmp_source != NULL) + g_object_unref (cmp_source); + + return source_tag == NULL || + source_tag == g_simple_async_result_get_source_tag (simple); +} + +/** + * g_simple_async_report_error_in_idle: (skip) + * @object: (allow-none): a #GObject, or %NULL. + * @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 (!object || 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: (allow-none): a #GObject, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback. + * @user_data: (closure): 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, + const GError *error) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (!object || 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); +} + +/** + * g_simple_async_report_take_gerror_in_idle: (skip) + * @object: (allow-none): a #GObject, or %NULL + * @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_gerror_in_idle(), but takes over the caller's + * ownership of @error, so the caller does not have to free it any more. + * + * Since: 2.28 + **/ +void +g_simple_async_report_take_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error) +{ + GSimpleAsyncResult *simple; + + g_return_if_fail (!object || G_IS_OBJECT (object)); + g_return_if_fail (error != NULL); + + simple = g_simple_async_result_new_take_error (object, + callback, + user_data, + error); + g_simple_async_result_complete_in_idle (simple); + g_object_unref (simple); +} + +/** + * g_simple_async_result_set_check_cancellable: + * @simple: a #GSimpleAsyncResult + * @check_cancellable: (allow-none): a #GCancellable to check, or %NULL to unset + * + * Sets a #GCancellable to check before dispatching results. + * + * This function has one very specific purpose: the provided cancellable + * is checked at the time of g_simple_async_result_propagate_error() If + * it is cancelled, these functions will return an "Operation was + * cancelled" error (%G_IO_ERROR_CANCELLED). + * + * Implementors of cancellable asynchronous functions should use this in + * order to provide a guarantee to their callers that cancelling an + * async operation will reliably result in an error being returned for + * that operation (even if a positive result for the operation has + * already been sent as an idle to the main context to be dispatched). + * + * The checking described above is done regardless of any call to the + * unrelated g_simple_async_result_set_handle_cancellation() function. + * + * Since: 2.32 + **/ +void +g_simple_async_result_set_check_cancellable (GSimpleAsyncResult *simple, + GCancellable *check_cancellable) +{ + g_return_if_fail (G_IS_SIMPLE_ASYNC_RESULT (simple)); + g_return_if_fail (check_cancellable == NULL || G_IS_CANCELLABLE (check_cancellable)); + + g_clear_object (&simple->check_cancellable); + if (check_cancellable) + simple->check_cancellable = g_object_ref (check_cancellable); +} diff --git a/gio/gsimpleasyncresult.h b/gio/gsimpleasyncresult.h new file mode 100644 index 0000000..7134f84 --- /dev/null +++ b/gio/gsimpleasyncresult.h @@ -0,0 +1,164 @@ +/* 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_SIMPLE_ASYNC_RESULT_H__ +#define __G_SIMPLE_ASYNC_RESULT_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + + +GLIB_AVAILABLE_IN_ALL +GType g_simple_async_result_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSimpleAsyncResult *g_simple_async_result_new (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + gpointer source_tag); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +GSimpleAsyncResult *g_simple_async_result_new_from_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + const GError *error); +GLIB_AVAILABLE_IN_ALL +GSimpleAsyncResult *g_simple_async_result_new_take_error (GObject *source_object, + GAsyncReadyCallback callback, + gpointer user_data, + GError *error); + +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_op_res_gpointer (GSimpleAsyncResult *simple, + gpointer op_res, + GDestroyNotify destroy_op_res); +GLIB_AVAILABLE_IN_ALL +gpointer g_simple_async_result_get_op_res_gpointer (GSimpleAsyncResult *simple); + +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_op_res_gssize (GSimpleAsyncResult *simple, + gssize op_res); +GLIB_AVAILABLE_IN_ALL +gssize g_simple_async_result_get_op_res_gssize (GSimpleAsyncResult *simple); + +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_op_res_gboolean (GSimpleAsyncResult *simple, + gboolean op_res); +GLIB_AVAILABLE_IN_ALL +gboolean g_simple_async_result_get_op_res_gboolean (GSimpleAsyncResult *simple); + + + +GLIB_AVAILABLE_IN_2_32 +void g_simple_async_result_set_check_cancellable (GSimpleAsyncResult *simple, + GCancellable *check_cancellable); +GLIB_AVAILABLE_IN_ALL +gpointer g_simple_async_result_get_source_tag (GSimpleAsyncResult *simple); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_handle_cancellation (GSimpleAsyncResult *simple, + gboolean handle_cancellation); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_complete (GSimpleAsyncResult *simple); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_complete_in_idle (GSimpleAsyncResult *simple); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_run_in_thread (GSimpleAsyncResult *simple, + GSimpleAsyncThreadFunc func, + int io_priority, + GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_from_error (GSimpleAsyncResult *simple, + const GError *error); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_take_error (GSimpleAsyncResult *simple, + GError *error); +GLIB_AVAILABLE_IN_ALL +gboolean g_simple_async_result_propagate_error (GSimpleAsyncResult *simple, + GError **dest); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_error (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF (4, 5); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_result_set_error_va (GSimpleAsyncResult *simple, + GQuark domain, + gint code, + const char *format, + va_list args) + G_GNUC_PRINTF(4, 0); +GLIB_AVAILABLE_IN_ALL +gboolean g_simple_async_result_is_valid (GAsyncResult *result, + GObject *source, + gpointer source_tag); + +GLIB_AVAILABLE_IN_ALL +void g_simple_async_report_error_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF(6, 7); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_report_gerror_in_idle (GObject *object, + GAsyncReadyCallback callback, + gpointer user_data, + const GError *error); +GLIB_AVAILABLE_IN_ALL +void g_simple_async_report_take_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/gsimplepermission.c b/gio/gsimplepermission.c new file mode 100644 index 0000000..9eee4f4 --- /dev/null +++ b/gio/gsimplepermission.c @@ -0,0 +1,85 @@ +/* + * 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 "config.h" + +#include "gsimplepermission.h" +#include "gpermission.h" + + +/** + * SECTION:gsimplepermission + * @title: GSimplePermission + * @short_description: A GPermission that doesn't change value + * + * #GSimplePermission is a trivial implementation of #GPermission that + * represents a permission that is either always or never allowed. The + * value is given at construction and doesn't change. + * + * Calling request or release will result in errors. + **/ + +/** + * GSimplePermission: + * + * #GSimplePermission is an opaque data structure. There are no methods + * except for those defined by #GPermission. + **/ + +typedef GPermissionClass GSimplePermissionClass; + +struct _GSimplePermission +{ + GPermission parent_instance; +}; + +G_DEFINE_TYPE (GSimplePermission, g_simple_permission, G_TYPE_PERMISSION) + +static void +g_simple_permission_init (GSimplePermission *simple) +{ +} + +static void +g_simple_permission_class_init (GSimplePermissionClass *class) +{ +} + +/** + * g_simple_permission_new: + * @allowed: %TRUE if the action is allowed + * + * Creates a new #GPermission instance that represents an action that is + * either always or never allowed. + * + * Returns: the #GSimplePermission, as a #GPermission + * + * Since: 2.26 + **/ +GPermission * +g_simple_permission_new (gboolean allowed) +{ + GPermission *permission = g_object_new (G_TYPE_SIMPLE_PERMISSION, NULL); + + g_permission_impl_update (permission, allowed, FALSE, FALSE); + + return permission; +} diff --git a/gio/gsimplepermission.h b/gio/gsimplepermission.h new file mode 100644 index 0000000..4cc336b --- /dev/null +++ b/gio/gsimplepermission.h @@ -0,0 +1,47 @@ +/* + * 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_SIMPLE_PERMISSION_H__ +#define __G_SIMPLE_PERMISSION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SIMPLE_PERMISSION (g_simple_permission_get_type ()) +#define G_SIMPLE_PERMISSION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_SIMPLE_PERMISSION, \ + GSimplePermission)) +#define G_IS_SIMPLE_PERMISSION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_SIMPLE_PERMISSION)) + +GLIB_AVAILABLE_IN_ALL +GType g_simple_permission_get_type (void); +GLIB_AVAILABLE_IN_ALL +GPermission * g_simple_permission_new (gboolean allowed); + +G_END_DECLS + +#endif /* __G_SIMPLE_PERMISSION_H__ */ diff --git a/gio/gsimpleproxyresolver.c b/gio/gsimpleproxyresolver.c new file mode 100644 index 0000000..24f41a4 --- /dev/null +++ b/gio/gsimpleproxyresolver.c @@ -0,0 +1,596 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2010, 2013 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, see + * . + */ + +#include "config.h" + +#include +#include + +#include "gsimpleproxyresolver.h" +#include "ginetaddress.h" +#include "ginetaddressmask.h" +#include "gnetworkingprivate.h" +#include "gtask.h" + +#include "glibintl.h" + +/** + * SECTION:gsimpleproxyresolver + * @short_description: Simple proxy resolver implementation + * @include: gio/gio.h + * @see_also: g_socket_client_set_proxy_resolver() + * + * #GSimpleProxyResolver is a simple #GProxyResolver implementation + * that handles a single default proxy, multiple URI-scheme-specific + * proxies, and a list of hosts that proxies should not be used for. + * + * #GSimpleProxyResolver is never the default proxy resolver, but it + * can be used as the base class for another proxy resolver + * implementation, or it can be created and used manually, such as + * with g_socket_client_set_proxy_resolver(). + * + * Since: 2.36 + */ + +typedef struct { + gchar *name; + gint length; + gushort port; +} GSimpleProxyResolverDomain; + +struct _GSimpleProxyResolverPrivate { + gchar *default_proxy, **ignore_hosts; + GHashTable *uri_proxies; + + GPtrArray *ignore_ips; + GSimpleProxyResolverDomain *ignore_domains; +}; + +static void g_simple_proxy_resolver_iface_init (GProxyResolverInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (GSimpleProxyResolver, g_simple_proxy_resolver, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY_RESOLVER, + g_simple_proxy_resolver_iface_init)) + +enum +{ + PROP_0, + PROP_DEFAULT_PROXY, + PROP_IGNORE_HOSTS +}; + +static void reparse_ignore_hosts (GSimpleProxyResolver *resolver); + +static void +g_simple_proxy_resolver_finalize (GObject *object) +{ + GSimpleProxyResolver *resolver = G_SIMPLE_PROXY_RESOLVER (object); + GSimpleProxyResolverPrivate *priv = resolver->priv; + + g_free (priv->default_proxy); + g_hash_table_destroy (priv->uri_proxies); + + g_clear_pointer (&priv->ignore_hosts, g_strfreev); + /* This will free ignore_ips and ignore_domains */ + reparse_ignore_hosts (resolver); + + G_OBJECT_CLASS (g_simple_proxy_resolver_parent_class)->finalize (object); +} + +static void +g_simple_proxy_resolver_init (GSimpleProxyResolver *resolver) +{ + resolver->priv = G_TYPE_INSTANCE_GET_PRIVATE (resolver, + G_TYPE_SIMPLE_PROXY_RESOLVER, + GSimpleProxyResolverPrivate); + resolver->priv->uri_proxies = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); +} + +static void +g_simple_proxy_resolver_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GSimpleProxyResolver *resolver = G_SIMPLE_PROXY_RESOLVER (object); + + switch (prop_id) + { + case PROP_DEFAULT_PROXY: + g_simple_proxy_resolver_set_default_proxy (resolver, g_value_get_string (value)); + break; + + case PROP_IGNORE_HOSTS: + g_simple_proxy_resolver_set_ignore_hosts (resolver, g_value_get_boxed (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_simple_proxy_resolver_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GSimpleProxyResolver *resolver = G_SIMPLE_PROXY_RESOLVER (object); + + switch (prop_id) + { + case PROP_DEFAULT_PROXY: + g_value_set_string (value, resolver->priv->default_proxy); + break; + + case PROP_IGNORE_HOSTS: + g_value_set_boxed (value, resolver->priv->ignore_hosts); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +reparse_ignore_hosts (GSimpleProxyResolver *resolver) +{ + GSimpleProxyResolverPrivate *priv = resolver->priv; + GPtrArray *ignore_ips; + GArray *ignore_domains; + gchar *host, *tmp, *colon, *bracket; + GInetAddress *iaddr; + GInetAddressMask *mask; + GSimpleProxyResolverDomain domain; + gushort port; + int i; + + if (priv->ignore_ips) + g_ptr_array_free (priv->ignore_ips, TRUE); + if (priv->ignore_domains) + { + for (i = 0; priv->ignore_domains[i].name; i++) + g_free (priv->ignore_domains[i].name); + g_free (priv->ignore_domains); + } + priv->ignore_ips = NULL; + priv->ignore_domains = NULL; + + if (!priv->ignore_hosts || !priv->ignore_hosts[0]) + return; + + ignore_ips = g_ptr_array_new_with_free_func (g_object_unref); + ignore_domains = g_array_new (TRUE, FALSE, sizeof (GSimpleProxyResolverDomain)); + + for (i = 0; priv->ignore_hosts[i]; i++) + { + host = g_strchomp (priv->ignore_hosts[i]); + + /* See if it's an IP address or IP/length mask */ + mask = g_inet_address_mask_new_from_string (host, NULL); + if (mask) + { + g_ptr_array_add (ignore_ips, mask); + continue; + } + + port = 0; + + if (*host == '[') + { + /* [IPv6]:port */ + host++; + bracket = strchr (host, ']'); + if (!bracket || !bracket[1] || bracket[1] != ':') + goto bad; + + port = strtoul (bracket + 2, &tmp, 10); + if (*tmp) + goto bad; + + *bracket = '\0'; + } + else + { + colon = strchr (host, ':'); + if (colon && !strchr (colon + 1, ':')) + { + /* hostname:port or IPv4:port */ + port = strtoul (colon + 1, &tmp, 10); + if (*tmp) + goto bad; + *colon = '\0'; + } + } + + iaddr = g_inet_address_new_from_string (host); + if (iaddr) + g_object_unref (iaddr); + else + { + if (g_str_has_prefix (host, "*.")) + host += 2; + else if (*host == '.') + host++; + } + + memset (&domain, 0, sizeof (domain)); + domain.name = g_strdup (host); + domain.length = strlen (domain.name); + domain.port = port; + g_array_append_val (ignore_domains, domain); + continue; + + bad: + g_warning ("Ignoring invalid ignore_hosts value '%s'", host); + } + + if (ignore_ips->len) + priv->ignore_ips = ignore_ips; + else + g_ptr_array_free (ignore_ips, TRUE); + + if (ignore_domains->len) + priv->ignore_domains = (GSimpleProxyResolverDomain *)ignore_domains->data; + g_array_free (ignore_domains, ignore_domains->len == 0); +} + +static gboolean +ignore_host (GSimpleProxyResolver *resolver, + const gchar *host, + gushort port) +{ + GSimpleProxyResolverPrivate *priv = resolver->priv; + gchar *ascii_host = NULL; + gboolean ignore = FALSE; + gint i, length, offset; + + if (priv->ignore_ips) + { + GInetAddress *iaddr; + + iaddr = g_inet_address_new_from_string (host); + if (iaddr) + { + for (i = 0; i < priv->ignore_ips->len; i++) + { + GInetAddressMask *mask = priv->ignore_ips->pdata[i]; + + if (g_inet_address_mask_matches (mask, iaddr)) + { + ignore = TRUE; + break; + } + } + + g_object_unref (iaddr); + if (ignore) + return TRUE; + } + } + + if (priv->ignore_domains) + { + if (g_hostname_is_non_ascii (host)) + host = ascii_host = g_hostname_to_ascii (host); + length = strlen (host); + + for (i = 0; priv->ignore_domains[i].length; i++) + { + GSimpleProxyResolverDomain *domain = &priv->ignore_domains[i]; + + offset = length - domain->length; + if ((domain->port == 0 || domain->port == port) && + (offset == 0 || (offset > 0 && host[offset - 1] == '.')) && + (g_ascii_strcasecmp (domain->name, host + offset) == 0)) + { + ignore = TRUE; + break; + } + } + + g_free (ascii_host); + } + + return ignore; +} + +static gchar ** +g_simple_proxy_resolver_lookup (GProxyResolver *proxy_resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error) +{ + GSimpleProxyResolver *resolver = G_SIMPLE_PROXY_RESOLVER (proxy_resolver); + GSimpleProxyResolverPrivate *priv = resolver->priv; + const gchar *proxy = NULL; + gchar **proxies; + + if (priv->ignore_ips || priv->ignore_domains) + { + gchar *host = NULL; + gushort port; + + if (_g_uri_parse_authority (uri, &host, &port, NULL) && + ignore_host (resolver, host, port)) + proxy = "direct://"; + + g_free (host); + } + + if (!proxy && g_hash_table_size (priv->uri_proxies)) + { + gchar *scheme = g_ascii_strdown (uri, strcspn (uri, ":")); + + proxy = g_hash_table_lookup (priv->uri_proxies, scheme); + g_free (scheme); + } + + if (!proxy) + proxy = priv->default_proxy; + if (!proxy) + proxy = "direct://"; + + if (!strncmp (proxy, "socks://", 8)) + { + proxies = g_new0 (gchar *, 4); + proxies[0] = g_strdup_printf ("socks5://%s", proxy + 8); + proxies[1] = g_strdup_printf ("socks4a://%s", proxy + 8); + proxies[2] = g_strdup_printf ("socks4://%s", proxy + 8); + proxies[3] = NULL; + } + else + { + proxies = g_new0 (gchar *, 2); + proxies[0] = g_strdup (proxy); + } + + return proxies; +} + +static void +g_simple_proxy_resolver_lookup_async (GProxyResolver *proxy_resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleProxyResolver *resolver = G_SIMPLE_PROXY_RESOLVER (proxy_resolver); + GTask *task; + GError *error = NULL; + char **proxies; + + task = g_task_new (resolver, cancellable, callback, user_data); + + proxies = g_simple_proxy_resolver_lookup (proxy_resolver, uri, + cancellable, &error); + if (proxies) + g_task_return_pointer (task, proxies, (GDestroyNotify)g_strfreev); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +static gchar ** +g_simple_proxy_resolver_lookup_finish (GProxyResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, resolver), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_simple_proxy_resolver_class_init (GSimpleProxyResolverClass *resolver_class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (resolver_class); + + g_type_class_add_private (resolver_class, sizeof (GSimpleProxyResolverPrivate)); + + object_class->get_property = g_simple_proxy_resolver_get_property; + object_class->set_property = g_simple_proxy_resolver_set_property; + object_class->finalize = g_simple_proxy_resolver_finalize; + + /** + * GSimpleProxyResolver:default-proxy: + * + * The default proxy URI that will be used for any URI that doesn't + * match #GSimpleProxyResolver:ignore-hosts, and doesn't match any + * of the schemes set with g_simple_proxy_resolver_set_uri_proxy(). + * + * Note that as a special case, if this URI starts with + * "socks://", #GSimpleProxyResolver will treat + * it as referring to all three of the socks5, + * socks4a, and socks4 proxy + * types. + */ + g_object_class_install_property (object_class, PROP_DEFAULT_PROXY, + g_param_spec_string ("default-proxy", + P_("Default proxy"), + P_("The default proxy URI"), + NULL, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSimpleProxyResolver:ignore-hosts: + * + * A list of hostnames and IP addresses that the resolver should + * allow direct connections to. + * + * Entries can be in one of 4 formats: + * + * + * + * A hostname, such as "example.com", + * ".example.com", or + * "*.example.com", any of which match + * "example.com" or any subdomain of it. + * + * + * An IPv4 or IPv6 address, such as + * "192.168.1.1", which matches only + * that address. + * + * + * A hostname or IP address followed by a port, such as + * "example.com:80", which matches whatever + * the hostname or IP address would match, but only for URLs + * with the (explicitly) indicated port. In the case of an IPv6 + * address, the address part must appear in brackets: + * "[::1]:443" + * + * + * An IP address range, given by a base address and prefix length, + * such as "fe80::/10", which matches any + * address in that range. + * + * + * + * Note that when dealing with Unicode hostnames, the matching is + * done against the ASCII form of the name. + * + * Also note that hostname exclusions apply only to connections made + * to hosts identified by name, and IP address exclusions apply only + * to connections made to hosts identified by address. That is, if + * example.com has an address of + * 192.168.1.1, and the :ignore-hosts list + * contains only "192.168.1.1", then a connection + * to "example.com" (eg, via a #GNetworkAddress) + * will use the proxy, and a connection to + * "192.168.1.1" (eg, via a #GInetSocketAddress) + * will not. + * + * These rules match the "ignore-hosts"/"noproxy" rules most + * commonly used by other applications. + */ + g_object_class_install_property (object_class, PROP_IGNORE_HOSTS, + g_param_spec_boxed ("ignore-hosts", + P_("Ignore hosts"), + P_("Hosts that will not use the proxy"), + G_TYPE_STRV, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + +} + +static void +g_simple_proxy_resolver_iface_init (GProxyResolverInterface *iface) +{ + iface->lookup = g_simple_proxy_resolver_lookup; + iface->lookup_async = g_simple_proxy_resolver_lookup_async; + iface->lookup_finish = g_simple_proxy_resolver_lookup_finish; +} + +/** + * g_simple_proxy_resolver_new: + * @default_proxy: (allow-none): the default proxy to use, eg + * "socks://192.168.1.1" + * @ignore_hosts: (allow-none): an optional list of hosts/IP addresses + * to not use a proxy for. + * + * Creates a new #GSimpleProxyResolver. See + * #GSimpleProxyResolver:default-proxy and + * #GSimpleProxyResolver:ignore-hosts for more details on how the + * arguments are interpreted. + * + * Returns: a new #GSimpleProxyResolver + * + * Since: 2.36 + */ +GProxyResolver * +g_simple_proxy_resolver_new (const gchar *default_proxy, + gchar **ignore_hosts) +{ + return g_object_new (G_TYPE_SIMPLE_PROXY_RESOLVER, + "default-proxy", default_proxy, + "ignore-hosts", ignore_hosts, + NULL); +} + +/** + * g_simple_proxy_resolver_set_default_proxy: + * @resolver: a #GSimpleProxyResolver + * @default_proxy: the default proxy to use + * + * Sets the default proxy on @resolver, to be used for any URIs that + * don't match #GSimpleProxyResolver:ignore-hosts or a proxy set + * via g_simple_proxy_resolver_set_uri_proxy(). + * + * If @default_proxy starts with "socks://", + * #GSimpleProxyResolver will treat it as referring to all three of + * the socks5, socks4a, and + * socks4 proxy types. + * + * Since: 2.36 + */ +void +g_simple_proxy_resolver_set_default_proxy (GSimpleProxyResolver *resolver, + const gchar *default_proxy) +{ + g_return_if_fail (G_IS_SIMPLE_PROXY_RESOLVER (resolver)); + + g_free (resolver->priv->default_proxy); + resolver->priv->default_proxy = g_strdup (default_proxy); + g_object_notify (G_OBJECT (resolver), "default-proxy"); +} + +void +g_simple_proxy_resolver_set_ignore_hosts (GSimpleProxyResolver *resolver, + gchar **ignore_hosts) +{ + g_return_if_fail (G_IS_SIMPLE_PROXY_RESOLVER (resolver)); + + g_strfreev (resolver->priv->ignore_hosts); + resolver->priv->ignore_hosts = g_strdupv (ignore_hosts); + reparse_ignore_hosts (resolver); + g_object_notify (G_OBJECT (resolver), "ignore-hosts"); +} + +/** + * g_simple_proxy_resolver_set_uri_proxy: + * @resolver: a #GSimpleProxyResolver + * @uri_scheme: the URI scheme to add a proxy for + * @proxy: the proxy to use for @uri_scheme + * + * Adds a URI-scheme-specific proxy to @resolver; URIs whose scheme + * matches @uri_scheme (and which don't match + * #GSimpleProxyResolver:ignore-hosts) will be proxied via @proxy. + * + * As with #GSimpleProxyResolver:default-proxy, if @proxy starts with + * "socks://", #GSimpleProxyResolver will treat it + * as referring to all three of the socks5, + * socks4a, and socks4 proxy + * types. + * + * Since: 2.36 + */ +void +g_simple_proxy_resolver_set_uri_proxy (GSimpleProxyResolver *resolver, + const gchar *uri_scheme, + const gchar *proxy) +{ + g_return_if_fail (G_IS_SIMPLE_PROXY_RESOLVER (resolver)); + + g_hash_table_replace (resolver->priv->uri_proxies, + g_ascii_strdown (uri_scheme, -1), + g_strdup (proxy)); +} diff --git a/gio/gsimpleproxyresolver.h b/gio/gsimpleproxyresolver.h new file mode 100644 index 0000000..a451f99 --- /dev/null +++ b/gio/gsimpleproxyresolver.h @@ -0,0 +1,91 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2010, 2013 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_SIMPLE_PROXY_RESOLVER_H__ +#define __G_SIMPLE_PROXY_RESOLVER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SIMPLE_PROXY_RESOLVER (g_simple_proxy_resolver_get_type ()) +#define G_SIMPLE_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SIMPLE_PROXY_RESOLVER, GSimpleProxyResolver)) +#define G_SIMPLE_PROXY_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SIMPLE_PROXY_RESOLVER, GSimpleProxyResolverClass)) +#define G_IS_SIMPLE_PROXY_RESOLVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SIMPLE_PROXY_RESOLVER)) +#define G_IS_SIMPLE_PROXY_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SIMPLE_PROXY_RESOLVER)) +#define G_SIMPLE_PROXY_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SIMPLE_PROXY_RESOLVER, GSimpleProxyResolverClass)) + +/** + * GSimpleProxyResolver: + * + * A #GProxyResolver implementation for using a fixed set of proxies. + **/ +typedef struct _GSimpleProxyResolver GSimpleProxyResolver; +typedef struct _GSimpleProxyResolverPrivate GSimpleProxyResolverPrivate; +typedef struct _GSimpleProxyResolverClass GSimpleProxyResolverClass; + +struct _GSimpleProxyResolver +{ + GObject parent_instance; + + /*< private >*/ + GSimpleProxyResolverPrivate *priv; +}; + +struct _GSimpleProxyResolverClass +{ + 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); +}; + +GLIB_AVAILABLE_IN_2_36 +GType g_simple_proxy_resolver_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_36 +GProxyResolver *g_simple_proxy_resolver_new (const gchar *default_proxy, + gchar **ignore_hosts); + +GLIB_AVAILABLE_IN_2_36 +void g_simple_proxy_resolver_set_default_proxy (GSimpleProxyResolver *resolver, + const gchar *default_proxy); + +GLIB_AVAILABLE_IN_2_36 +void g_simple_proxy_resolver_set_ignore_hosts (GSimpleProxyResolver *resolver, + gchar **ignore_hosts); + +GLIB_AVAILABLE_IN_2_36 +void g_simple_proxy_resolver_set_uri_proxy (GSimpleProxyResolver *resolver, + const gchar *uri_scheme, + const gchar *proxy); + +G_END_DECLS + +#endif /* __G_SIMPLE_PROXY_RESOLVER_H__ */ diff --git a/gio/gsocket.c b/gio/gsocket.c new file mode 100644 index 0000000..5c524a4 --- /dev/null +++ b/gio/gsocket.c @@ -0,0 +1,4531 @@ +/* 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 "gsocket.h" + +#ifdef G_OS_UNIX +#include "glib-unix.h" +#endif + +#include +#include +#include +#include + +#ifndef G_OS_WIN32 +# include +# include +# include +#endif + +#ifdef HAVE_SYS_FILIO_H +# include +#endif + +#ifdef HAVE_SYS_UIO_H +#include +#endif + +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "ginetaddress.h" +#include "ginitable.h" +#include "gioerror.h" +#include "gioenums.h" +#include "gioerror.h" +#include "gnetworkingprivate.h" +#include "gsocketaddress.h" +#include "gsocketcontrolmessage.h" +#include "gcredentials.h" +#include "glibintl.h" + +/** + * SECTION:gsocket + * @short_description: Low-level socket object + * @include: gio/gio.h + * @see_also: #GInitable, gnetworking.h + * + * 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_networking_init (); + 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, + PROP_TIMEOUT, + PROP_TTL, + PROP_BROADCAST, + PROP_MULTICAST_LOOPBACK, + PROP_MULTICAST_TTL +}; + +/* Size of the receiver cache for g_socket_receive_from() */ +#define RECV_ADDR_CACHE_SIZE 8 + +struct _GSocketPrivate +{ + GSocketFamily family; + GSocketType type; + GSocketProtocol protocol; + gint fd; + gint listen_backlog; + guint timeout; + GError *construct_error; + GSocketAddress *remote_address; + guint inited : 1; + guint blocking : 1; + guint keepalive : 1; + guint closed : 1; + guint connected : 1; + guint listening : 1; + guint timed_out : 1; + guint connect_pending : 1; +#ifdef G_OS_WIN32 + WSAEVENT event; + int current_events; + int current_errors; + int selected_events; + GList *requested_conditions; /* list of requested GIOCondition * */ +#endif + + struct { + GSocketAddress *addr; + struct sockaddr *native; + gint native_len; + guint64 last_used; + } recv_addr_cache[RECV_ADDR_CACHE_SIZE]; +}; + +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 + const char *msg_ret; + char *msg; + + msg = g_win32_error_message (err); + + msg_ret = g_intern_string (msg); + g_free (msg); + + return msg_ret; +#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 + +/* Windows has broken prototypes... */ +#ifdef G_OS_WIN32 +#define getsockopt(sockfd, level, optname, optval, optlen) \ + getsockopt (sockfd, level, optname, (gpointer) optval, (int*) optlen) +#define setsockopt(sockfd, level, optname, optval, optlen) \ + setsockopt (sockfd, level, optname, (gpointer) optval, optlen) +#define getsockname(sockfd, addr, addrlen) \ + getsockname (sockfd, addr, (int *)addrlen) +#define getpeername(sockfd, addr, addrlen) \ + getpeername (sockfd, addr, (int *)addrlen) +#define recv(sockfd, buf, len, flags) \ + recv (sockfd, (gpointer)buf, len, flags) +#endif + +static void +set_fd_nonblocking (int fd) +{ +#ifndef G_OS_WIN32 + GError *error = NULL; +#else + gulong arg; +#endif + +#ifndef G_OS_WIN32 + if (!g_unix_set_fd_nonblocking (fd, TRUE, &error)) + { + g_warning ("Error setting socket nonblocking: %s", error->message); + g_clear_error (&error); + } +#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; + } + + if (socket->priv->timed_out) + { + socket->priv->timed_out = FALSE; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT, + _("Socket I/O timed out")); + return FALSE; + } + + return TRUE; +} + +static void +g_socket_details_from_fd (GSocket *socket) +{ + struct sockaddr_storage address; + gint fd; + guint addrlen; + int value, family; + int errsv; + + fd = socket->priv->fd; + if (!g_socket_get_option (socket, SOL_SOCKET, SO_TYPE, &value, NULL)) + { + errsv = get_socket_errno (); + + switch (errsv) + { +#ifdef ENOTSOCK + case ENOTSOCK: +#else +#ifdef WSAENOTSOCK + case WSAENOTSOCK: +#endif +#endif + case EBADF: + /* programmer error */ + g_error ("creating GSocket from fd %d: %s\n", + fd, socket_strerror (errsv)); + default: + break; + } + + goto err; + } + + 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; + } + + if (addrlen > 0) + { + g_assert (G_STRUCT_OFFSET (struct sockaddr, sa_family) + + sizeof address.ss_family <= addrlen); + family = address.ss_family; + } + else + { + /* On Solaris, this happens if the socket is not yet connected. + * But we can use SO_DOMAIN as a workaround there. + */ +#ifdef SO_DOMAIN + if (!g_socket_get_option (socket, SOL_SOCKET, SO_DOMAIN, &family, NULL)) + { + errsv = get_socket_errno (); + goto err; + } +#else + /* This will translate to G_IO_ERROR_FAILED on either unix or windows */ + errsv = -1; + goto err; +#endif + } + + switch (family) + { + case G_SOCKET_FAMILY_IPV4: + case G_SOCKET_FAMILY_IPV6: + socket->priv->family = address.ss_family; + switch (socket->priv->type) + { + case G_SOCKET_TYPE_STREAM: + socket->priv->protocol = G_SOCKET_PROTOCOL_TCP; + break; + + case G_SOCKET_TYPE_DATAGRAM: + socket->priv->protocol = G_SOCKET_PROTOCOL_UDP; + break; + + case G_SOCKET_TYPE_SEQPACKET: + socket->priv->protocol = G_SOCKET_PROTOCOL_SCTP; + break; + + default: + break; + } + break; + + case G_SOCKET_FAMILY_UNIX: + socket->priv->family = G_SOCKET_FAMILY_UNIX; + socket->priv->protocol = G_SOCKET_PROTOCOL_DEFAULT; + 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; + } + + if (g_socket_get_option (socket, SOL_SOCKET, SO_KEEPALIVE, &value, NULL)) + { + socket->priv->keepalive = !!value; + } + 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)); +} + +/* Wrapper around socket() that is shared with gnetworkmonitornetlink.c */ +gint +g_socket (gint domain, + gint type, + gint protocol, + GError **error) +{ + int fd; + +#ifdef SOCK_CLOEXEC + fd = socket (domain, type | SOCK_CLOEXEC, protocol); + if (fd != -1) + return fd; + + /* It's possible that libc has SOCK_CLOEXEC but the kernel does not */ + if (fd < 0 && errno == EINVAL) +#endif + fd = socket (domain, 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)); + errno = errsv; + return -1; + } + +#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 gint +g_socket_create_socket (GSocketFamily family, + GSocketType type, + int protocol, + GError **error) +{ + gint native_type; + + 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 (family <= 0) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + _("Unable to create socket: %s"), _("Unknown family was specified")); + return -1; + } + + 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; + } + + return g_socket (family, native_type, protocol, error); +} + +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; + + case PROP_TIMEOUT: + g_value_set_uint (value, socket->priv->timeout); + break; + + case PROP_TTL: + g_value_set_uint (value, g_socket_get_ttl (socket)); + break; + + case PROP_BROADCAST: + g_value_set_boolean (value, g_socket_get_broadcast (socket)); + break; + + case PROP_MULTICAST_LOOPBACK: + g_value_set_boolean (value, g_socket_get_multicast_loopback (socket)); + break; + + case PROP_MULTICAST_TTL: + g_value_set_uint (value, g_socket_get_multicast_ttl (socket)); + 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; + + case PROP_TIMEOUT: + g_socket_set_timeout (socket, g_value_get_uint (value)); + break; + + case PROP_TTL: + g_socket_set_ttl (socket, g_value_get_uint (value)); + break; + + case PROP_BROADCAST: + g_socket_set_broadcast (socket, g_value_get_boolean (value)); + break; + + case PROP_MULTICAST_LOOPBACK: + g_socket_set_multicast_loopback (socket, g_value_get_boolean (value)); + break; + + case PROP_MULTICAST_TTL: + g_socket_set_multicast_ttl (socket, g_value_get_uint (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); + gint i; + + g_clear_error (&socket->priv->construct_error); + + if (socket->priv->fd != -1 && + !socket->priv->closed) + g_socket_close (socket, NULL); + + if (socket->priv->remote_address) + g_object_unref (socket->priv->remote_address); + +#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 + + for (i = 0; i < RECV_ADDR_CACHE_SIZE; i++) + { + if (socket->priv->recv_addr_cache[i].addr) + { + g_object_unref (socket->priv->recv_addr_cache[i].addr); + g_free (socket->priv->recv_addr_cache[i].native); + } + } + + 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); + +#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)); + + /** + * GSocket:timeout: + * + * The timeout in seconds on socket I/O + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_TIMEOUT, + g_param_spec_uint ("timeout", + P_("Timeout"), + P_("The timeout in seconds on socket I/O"), + 0, + G_MAXUINT, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSocket:broadcast: + * + * Whether the socket should allow sending to and receiving from broadcast addresses. + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_BROADCAST, + g_param_spec_boolean ("broadcast", + P_("Broadcast"), + P_("Whether to allow sending to and receiving from broadcast addresses"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSocket:ttl: + * + * Time-to-live for outgoing unicast packets + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_TTL, + g_param_spec_uint ("ttl", + P_("TTL"), + P_("Time-to-live of outgoing unicast packets"), + 0, G_MAXUINT, 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSocket:multicast-loopback: + * + * Whether outgoing multicast packets loop back to the local host. + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_MULTICAST_LOOPBACK, + g_param_spec_boolean ("multicast-loopback", + P_("Multicast loopback"), + P_("Whether outgoing multicast packets loop back to the local host"), + TRUE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSocket:multicast-ttl: + * + * Time-to-live out outgoing multicast packets + * + * Since: 2.32 + */ + g_object_class_install_property (gobject_class, PROP_MULTICAST_TTL, + g_param_spec_uint ("multicast-ttl", + P_("Multicast TTL"), + P_("Time-to-live of outgoing multicast packets"), + 0, G_MAXUINT, 1, + G_PARAM_READWRITE | + 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) +{ + GError *error = NULL; + + g_return_if_fail (G_IS_SOCKET (socket)); + + keepalive = !!keepalive; + if (socket->priv->keepalive == keepalive) + return; + + if (!g_socket_set_option (socket, SOL_SOCKET, SO_KEEPALIVE, + keepalive, &error)) + { + g_warning ("error setting keepalive: %s", error->message); + g_error_free (error); + 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_timeout: + * @socket: a #GSocket. + * + * Gets the timeout setting of the socket. For details on this, see + * g_socket_set_timeout(). + * + * Returns: the timeout in seconds + * + * Since: 2.26 + */ +guint +g_socket_get_timeout (GSocket *socket) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + + return socket->priv->timeout; +} + +/** + * g_socket_set_timeout: + * @socket: a #GSocket. + * @timeout: the timeout for @socket, in seconds, or 0 for none + * + * Sets the time in seconds after which I/O operations on @socket will + * time out if they have not yet completed. + * + * On a blocking socket, this means that any blocking #GSocket + * operation will time out after @timeout seconds of inactivity, + * returning %G_IO_ERROR_TIMED_OUT. + * + * On a non-blocking socket, calls to g_socket_condition_wait() will + * also fail with %G_IO_ERROR_TIMED_OUT after the given time. Sources + * created with g_socket_create_source() will trigger after + * @timeout seconds of inactivity, with the requested condition + * set, at which point calling g_socket_receive(), g_socket_send(), + * g_socket_check_connect_result(), etc, will fail with + * %G_IO_ERROR_TIMED_OUT. + * + * If @timeout is 0 (the default), operations will never time out + * on their own. + * + * Note that if an I/O operation is interrupted by a signal, this may + * cause the timeout to be reset. + * + * Since: 2.26 + */ +void +g_socket_set_timeout (GSocket *socket, + guint timeout) +{ + g_return_if_fail (G_IS_SOCKET (socket)); + + if (timeout != socket->priv->timeout) + { + socket->priv->timeout = timeout; + g_object_notify (G_OBJECT (socket), "timeout"); + } +} + +/** + * g_socket_get_ttl: + * @socket: a #GSocket. + * + * Gets the unicast time-to-live setting on @socket; see + * g_socket_set_ttl() for more details. + * + * Returns: the time-to-live setting on @socket + * + * Since: 2.32 + */ +guint +g_socket_get_ttl (GSocket *socket) +{ + GError *error = NULL; + gint value; + + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_TTL, + &value, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_get_option (socket, IPPROTO_IPV6, IPV6_UNICAST_HOPS, + &value, &error); + } + else + g_return_val_if_reached (0); + + if (error) + { + g_warning ("error getting unicast ttl: %s", error->message); + g_error_free (error); + return 0; + } + + return value; +} + +/** + * g_socket_set_ttl: + * @socket: a #GSocket. + * @ttl: the time-to-live value for all unicast packets on @socket + * + * Sets the time-to-live for outgoing unicast packets on @socket. + * By default the platform-specific default value is used. + * + * Since: 2.32 + */ +void +g_socket_set_ttl (GSocket *socket, + guint ttl) +{ + GError *error = NULL; + + g_return_if_fail (G_IS_SOCKET (socket)); + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_TTL, + ttl, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_set_option (socket, IPPROTO_IP, IP_TTL, + ttl, NULL); + g_socket_set_option (socket, IPPROTO_IPV6, IPV6_UNICAST_HOPS, + ttl, &error); + } + else + g_return_if_reached (); + + if (error) + { + g_warning ("error setting unicast ttl: %s", error->message); + g_error_free (error); + return; + } + + g_object_notify (G_OBJECT (socket), "ttl"); +} + +/** + * g_socket_get_broadcast: + * @socket: a #GSocket. + * + * Gets the broadcast setting on @socket; if %TRUE, + * it is possible to send packets to broadcast + * addresses or receive from broadcast addresses. + * + * Returns: the broadcast setting on @socket + * + * Since: 2.32 + */ +gboolean +g_socket_get_broadcast (GSocket *socket) +{ + GError *error = NULL; + gint value; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (!g_socket_get_option (socket, SOL_SOCKET, SO_BROADCAST, + &value, &error)) + { + g_warning ("error getting broadcast: %s", error->message); + g_error_free (error); + return FALSE; + } + + return !!value; +} + +/** + * g_socket_set_broadcast: + * @socket: a #GSocket. + * @broadcast: whether @socket should allow sending to and receiving + * from broadcast addresses + * + * Sets whether @socket should allow sending to and receiving from + * broadcast addresses. This is %FALSE by default. + * + * Since: 2.32 + */ +void +g_socket_set_broadcast (GSocket *socket, + gboolean broadcast) +{ + GError *error = NULL; + + g_return_if_fail (G_IS_SOCKET (socket)); + + broadcast = !!broadcast; + + if (!g_socket_set_option (socket, SOL_SOCKET, SO_BROADCAST, + broadcast, &error)) + { + g_warning ("error setting broadcast: %s", error->message); + g_error_free (error); + return; + } + + g_object_notify (G_OBJECT (socket), "broadcast"); +} + +/** + * g_socket_get_multicast_loopback: + * @socket: a #GSocket. + * + * Gets the multicast loopback setting on @socket; if %TRUE (the + * default), outgoing multicast packets will be looped back to + * multicast listeners on the same host. + * + * Returns: the multicast loopback setting on @socket + * + * Since: 2.32 + */ +gboolean +g_socket_get_multicast_loopback (GSocket *socket) +{ + GError *error = NULL; + gint value; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_MULTICAST_LOOP, + &value, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_get_option (socket, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, + &value, &error); + } + else + g_return_val_if_reached (FALSE); + + if (error) + { + g_warning ("error getting multicast loopback: %s", error->message); + g_error_free (error); + return FALSE; + } + + return !!value; +} + +/** + * g_socket_set_multicast_loopback: + * @socket: a #GSocket. + * @loopback: whether @socket should receive messages sent to its + * multicast groups from the local host + * + * Sets whether outgoing multicast packets will be received by sockets + * listening on that multicast address on the same host. This is %TRUE + * by default. + * + * Since: 2.32 + */ +void +g_socket_set_multicast_loopback (GSocket *socket, + gboolean loopback) +{ + GError *error = NULL; + + g_return_if_fail (G_IS_SOCKET (socket)); + + loopback = !!loopback; + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_LOOP, + loopback, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_LOOP, + loopback, NULL); + g_socket_set_option (socket, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, + loopback, &error); + } + else + g_return_if_reached (); + + if (error) + { + g_warning ("error setting multicast loopback: %s", error->message); + g_error_free (error); + return; + } + + g_object_notify (G_OBJECT (socket), "multicast-loopback"); +} + +/** + * g_socket_get_multicast_ttl: + * @socket: a #GSocket. + * + * Gets the multicast time-to-live setting on @socket; see + * g_socket_set_multicast_ttl() for more details. + * + * Returns: the multicast time-to-live setting on @socket + * + * Since: 2.32 + */ +guint +g_socket_get_multicast_ttl (GSocket *socket) +{ + GError *error = NULL; + gint value; + + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_get_option (socket, IPPROTO_IP, IP_MULTICAST_TTL, + &value, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_get_option (socket, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, + &value, &error); + } + else + g_return_val_if_reached (FALSE); + + if (error) + { + g_warning ("error getting multicast ttl: %s", error->message); + g_error_free (error); + return FALSE; + } + + return value; +} + +/** + * g_socket_set_multicast_ttl: + * @socket: a #GSocket. + * @ttl: the time-to-live value for all multicast datagrams on @socket + * + * Sets the time-to-live for outgoing multicast datagrams on @socket. + * By default, this is 1, meaning that multicast packets will not leave + * the local network. + * + * Since: 2.32 + */ +void +g_socket_set_multicast_ttl (GSocket *socket, + guint ttl) +{ + GError *error = NULL; + + g_return_if_fail (G_IS_SOCKET (socket)); + + if (socket->priv->family == G_SOCKET_FAMILY_IPV4) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_TTL, + ttl, &error); + } + else if (socket->priv->family == G_SOCKET_FAMILY_IPV6) + { + g_socket_set_option (socket, IPPROTO_IP, IP_MULTICAST_TTL, + ttl, NULL); + g_socket_set_option (socket, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, + ttl, &error); + } + else + g_return_if_reached (); + + if (error) + { + g_warning ("error setting multicast ttl: %s", error->message); + g_error_free (error); + return; + } + + g_object_notify (G_OBJECT (socket), "multicast-ttl"); +} + +/** + * 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: (transfer full): 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; + guint 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: (transfer full): 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; + guint len = sizeof (buffer); + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + + if (socket->priv->connect_pending) + { + if (!g_socket_check_connect_result (socket, error)) + return NULL; + else + socket->priv->connect_pending = FALSE; + } + + if (!socket->priv->remote_address) + { + 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; + } + + socket->priv->remote_address = g_socket_address_new_from_native (&buffer, len); + } + + return g_object_ref (socket->priv->remote_address); +} + +/** + * 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 + { + reuse_address = !!reuse_address; + /* Ignore errors here, the only likely error is "not supported", and + this is a "best effort" thing mainly */ + g_socket_set_option (socket, SOL_SOCKET, SO_REUSEADDR, + reuse_address, NULL); + } +#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; +} + +static gboolean +g_socket_multicast_group_operation (GSocket *socket, + GInetAddress *group, + gboolean source_specific, + const gchar *iface, + gboolean join_group, + GError **error) +{ + const guint8 *native_addr; + gint optname, result; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + g_return_val_if_fail (socket->priv->type == G_SOCKET_TYPE_DATAGRAM, FALSE); + g_return_val_if_fail (G_IS_INET_ADDRESS (group), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + native_addr = g_inet_address_to_bytes (group); + if (g_inet_address_get_family (group) == G_SOCKET_FAMILY_IPV4) + { +#ifdef HAVE_IP_MREQN + struct ip_mreqn mc_req; +#else + struct ip_mreq mc_req; +#endif + + memset (&mc_req, 0, sizeof (mc_req)); + memcpy (&mc_req.imr_multiaddr, native_addr, sizeof (struct in_addr)); + +#ifdef HAVE_IP_MREQN + if (iface) + mc_req.imr_ifindex = if_nametoindex (iface); + else + mc_req.imr_ifindex = 0; /* Pick any. */ +#else + mc_req.imr_interface.s_addr = g_htonl (INADDR_ANY); +#endif + + if (source_specific) + { +#ifdef IP_ADD_SOURCE_MEMBERSHIP + optname = join_group ? IP_ADD_SOURCE_MEMBERSHIP : IP_DROP_SOURCE_MEMBERSHIP; +#else + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + join_group ? + _("Error joining multicast group: %s") : + _("Error leaving multicast group: %s"), + _("No support for source-specific multicast")); + return FALSE; +#endif + } + else + optname = join_group ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP; + result = setsockopt (socket->priv->fd, IPPROTO_IP, optname, + &mc_req, sizeof (mc_req)); + } + else if (g_inet_address_get_family (group) == G_SOCKET_FAMILY_IPV6) + { + struct ipv6_mreq mc_req_ipv6; + + memset (&mc_req_ipv6, 0, sizeof (mc_req_ipv6)); + memcpy (&mc_req_ipv6.ipv6mr_multiaddr, native_addr, sizeof (struct in6_addr)); +#ifdef HAVE_IF_NAMETOINDEX + if (iface) + mc_req_ipv6.ipv6mr_interface = if_nametoindex (iface); + else +#endif + mc_req_ipv6.ipv6mr_interface = 0; + + optname = join_group ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP; + result = setsockopt (socket->priv->fd, IPPROTO_IPV6, optname, + &mc_req_ipv6, sizeof (mc_req_ipv6)); + } + else + g_return_val_if_reached (FALSE); + + if (result < 0) + { + int errsv = get_socket_errno (); + + g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv), + join_group ? + _("Error joining multicast group: %s") : + _("Error leaving multicast group: %s"), + socket_strerror (errsv)); + return FALSE; + } + + return TRUE; +} + +/** + * g_socket_join_multicast_group: + * @socket: a #GSocket. + * @group: a #GInetAddress specifying the group address to join. + * @iface: (allow-none): Name of the interface to use, or %NULL + * @source_specific: %TRUE if source-specific multicast should be used + * @error: #GError for error reporting, or %NULL to ignore. + * + * Registers @socket to receive multicast messages sent to @group. + * @socket must be a %G_SOCKET_TYPE_DATAGRAM socket, and must have + * been bound to an appropriate interface and port with + * g_socket_bind(). + * + * If @iface is %NULL, the system will automatically pick an interface + * to bind to based on @group. + * + * If @source_specific is %TRUE, source-specific multicast as defined + * in RFC 4604 is used. Note that on older platforms this may fail + * with a %G_IO_ERROR_NOT_SUPPORTED error. + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.32 + */ +gboolean +g_socket_join_multicast_group (GSocket *socket, + GInetAddress *group, + gboolean source_specific, + const gchar *iface, + GError **error) +{ + return g_socket_multicast_group_operation (socket, group, source_specific, iface, TRUE, error); +} + +/** + * g_socket_leave_multicast_group: + * @socket: a #GSocket. + * @group: a #GInetAddress specifying the group address to leave. + * @iface: (allow-none): Interface used + * @source_specific: %TRUE if source-specific multicast was used + * @error: #GError for error reporting, or %NULL to ignore. + * + * Removes @socket from the multicast group defined by @group, @iface, + * and @source_specific (which must all have the same values they had + * when you joined the group). + * + * @socket remains bound to its address and port, and can still receive + * unicast messages after calling this. + * + * Returns: %TRUE on success, %FALSE on error. + * + * Since: 2.32 + */ +gboolean +g_socket_leave_multicast_group (GSocket *socket, + GInetAddress *group, + gboolean source_specific, + const gchar *iface, + GError **error) +{ + return g_socket_multicast_group_operation (socket, group, source_specific, iface, FALSE, error); +} + +/** + * 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) + { + gint v6_only; + + if (!g_socket_get_option (socket, + IPPROTO_IPV6, IPV6_V6ONLY, + &v6_only, NULL)) + return FALSE; + + return !v6_only; + } +#else + return FALSE; +#endif + + default: + return FALSE; + } +} + +/** + * g_socket_accept: + * @socket: a #GSocket. + * @cancellable: (allow-none): 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: (transfer full): 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: (allow-none): 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 must 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; + + if (socket->priv->remote_address) + g_object_unref (socket->priv->remote_address); + socket->priv->remote_address = g_object_ref (address); + + 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; + } + } + else + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PENDING, + _("Connection in progress")); + socket->priv->connect_pending = TRUE; + } + } + else + g_set_error_literal (error, G_IO_ERROR, + socket_io_error_from_errno (errsv), + 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) +{ + int value; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + if (!g_socket_get_option (socket, SOL_SOCKET, SO_ERROR, &value, error)) + { + g_prefix_error (error, _("Unable to get pending error: ")); + return FALSE; + } + + if (value != 0) + { + g_set_error_literal (error, G_IO_ERROR, socket_io_error_from_errno (value), + socket_strerror (value)); + if (socket->priv->remote_address) + { + g_object_unref (socket->priv->remote_address); + socket->priv->remote_address = NULL; + } + return FALSE; + } + + socket->priv->connected = TRUE; + return TRUE; +} + +/** + * g_socket_get_available_bytes: + * @socket: a #GSocket + * + * Get the amount of data pending in the OS input buffer. + * + * Returns: the number of bytes that can be read from the socket + * without blocking or -1 on error. + * + * Since: 2.32 + */ +gssize +g_socket_get_available_bytes (GSocket *socket) +{ + gulong avail = 0; + + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + +#ifndef G_OS_WIN32 + if (ioctl (socket->priv->fd, FIONREAD, &avail) < 0) + return -1; +#else + if (ioctlsocket (socket->priv->fd, FIONREAD, &avail) == SOCKET_ERROR) + return -1; +#endif + + return avail; +} + +/** + * g_socket_receive: + * @socket: a #GSocket + * @buffer: (array length=size) (element-type guint8): 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: (allow-none): 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, the connection is closed, 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 0 if the connection was closed by + * the peer, or -1 on error + * + * Since: 2.22 + */ +gssize +g_socket_receive (GSocket *socket, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error) +{ + return g_socket_receive_with_blocking (socket, buffer, size, + socket->priv->blocking, + cancellable, error); +} + +/** + * g_socket_receive_with_blocking: + * @socket: a #GSocket + * @buffer: (array length=size) (element-type guint8): 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 + * @blocking: whether to do blocking or non-blocking I/O + * @cancellable: (allow-none): a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * This behaves exactly the same as g_socket_receive(), except that + * the choice of blocking or non-blocking behavior is determined by + * the @blocking argument rather than by @socket's properties. + * + * Returns: Number of bytes read, or 0 if the connection was closed by + * the peer, or -1 on error + * + * Since: 2.26 + */ +gssize +g_socket_receive_with_blocking (GSocket *socket, + gchar *buffer, + gsize size, + gboolean blocking, + GCancellable *cancellable, + GError **error) +{ + gssize ret; + + g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, -1); + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + while (1) + { + if (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 (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: (out) (allow-none): a pointer to a #GSocketAddress + * pointer, or %NULL + * @buffer: (array length=size) (element-type guint8): 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: (allow-none): 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 0 if the connection was closed by + * the peer, 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: (array length=size) (element-type guint8): the buffer + * containing the data to send. + * @size: the number of bytes to send + * @cancellable: (allow-none): 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) +{ + return g_socket_send_with_blocking (socket, buffer, size, + socket->priv->blocking, + cancellable, error); +} + +/** + * g_socket_send_with_blocking: + * @socket: a #GSocket + * @buffer: (array length=size) (element-type guint8): the buffer + * containing the data to send. + * @size: the number of bytes to send + * @blocking: whether to do blocking or non-blocking I/O + * @cancellable: (allow-none): a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * This behaves exactly the same as g_socket_send(), except that + * the choice of blocking or non-blocking behavior is determined by + * the @blocking argument rather than by @socket's properties. + * + * Returns: Number of bytes written (which may be less than @size), or -1 + * on error + * + * Since: 2.26 + */ +gssize +g_socket_send_with_blocking (GSocket *socket, + const gchar *buffer, + gsize size, + gboolean blocking, + GCancellable *cancellable, + GError **error) +{ + gssize ret; + + g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, -1); + + if (!check_socket (socket, error)) + return -1; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + while (1) + { + if (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 (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: (allow-none): a #GSocketAddress, or %NULL + * @buffer: (array length=size) (element-type guint8): the buffer + * containing the data to send. + * @size: the number of bytes to send + * @cancellable: (allow-none): 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 receiving 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, error)) + 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 shutdown 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, error)) + 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; + if (socket->priv->remote_address) + { + g_object_unref (socket->priv->remote_address); + socket->priv->remote_address = NULL; + } + + 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) + { + int r, errsv, buffer; + + r = recv (socket->priv->fd, &buffer, sizeof (buffer), MSG_PEEK); + if (r < 0) + errsv = get_socket_errno (); + + if (r > 0 || + (r < 0 && errsv == WSAENOTCONN)) + condition |= G_IO_IN; + else if (r == 0 || + (r < 0 && (errsv == WSAESHUTDOWN || errsv == WSAECONNRESET || + errsv == WSAECONNABORTED || errsv == WSAENETRESET))) + condition |= G_IO_HUP; + else + condition |= G_IO_ERR; + } + + if (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; +} +#endif + +typedef struct { + GSource source; + GPollFD pollfd; + GSocket *socket; + GIOCondition condition; + GCancellable *cancellable; + GPollFD cancel_pollfd; + gint64 timeout_time; +} GSocketSource; + +static gboolean +socket_source_prepare (GSource *source, + gint *timeout) +{ + GSocketSource *socket_source = (GSocketSource *)source; + + if (g_cancellable_is_cancelled (socket_source->cancellable)) + return TRUE; + + if (socket_source->timeout_time) + { + gint64 now; + + now = g_source_get_time (source); + /* Round up to ensure that we don't try again too early */ + *timeout = (socket_source->timeout_time - now + 999) / 1000; + if (*timeout < 0) + { + socket_source->socket->priv->timed_out = TRUE; + *timeout = 0; + return TRUE; + } + } + else + *timeout = -1; + +#ifdef G_OS_WIN32 + socket_source->pollfd.revents = update_condition (socket_source->socket); +#endif + + if ((socket_source->condition & socket_source->pollfd.revents) != 0) + return TRUE; + + return FALSE; +} + +static gboolean +socket_source_check (GSource *source) +{ + int timeout; + + return socket_source_prepare (source, &timeout); +} + +static gboolean +socket_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GSocketSourceFunc func = (GSocketSourceFunc)callback; + GSocketSource *socket_source = (GSocketSource *)source; + GSocket *socket = socket_source->socket; + gboolean ret; + +#ifdef G_OS_WIN32 + socket_source->pollfd.revents = update_condition (socket_source->socket); +#endif + if (socket_source->socket->priv->timed_out) + socket_source->pollfd.revents |= socket_source->condition & (G_IO_IN | G_IO_OUT); + + ret = (*func) (socket, + socket_source->pollfd.revents & socket_source->condition, + user_data); + + if (socket->priv->timeout) + socket_source->timeout_time = g_get_monotonic_time () + + socket->priv->timeout * 1000000; + + else + socket_source->timeout_time = 0; + + return ret; +} + +static void +socket_source_finalize (GSource *source) +{ + GSocketSource *socket_source = (GSocketSource *)source; + GSocket *socket; + + socket = socket_source->socket; + +#ifdef G_OS_WIN32 + remove_condition_watch (socket, &socket_source->condition); +#endif + + g_object_unref (socket); + + if (socket_source->cancellable) + { + g_cancellable_release_fd (socket_source->cancellable); + g_object_unref (socket_source->cancellable); + } +} + +static gboolean +socket_source_closure_callback (GSocket *socket, + GIOCondition condition, + gpointer data) +{ + GClosure *closure = data; + + GValue params[2] = { G_VALUE_INIT, G_VALUE_INIT }; + GValue result_value = G_VALUE_INIT; + gboolean result; + + g_value_init (&result_value, G_TYPE_BOOLEAN); + + g_value_init (¶ms[0], G_TYPE_SOCKET); + g_value_set_object (¶ms[0], socket); + 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 GSourceFuncs socket_source_funcs = +{ + socket_source_prepare, + socket_source_check, + socket_source_dispatch, + socket_source_finalize, + (GSourceFunc)socket_source_closure_callback, + (GSourceDummyMarshal)g_cclosure_marshal_generic, +}; + +static GSource * +socket_source_new (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable) +{ + GSource *source; + GSocketSource *socket_source; + +#ifdef G_OS_WIN32 + ensure_event (socket); + + if (socket->priv->event == WSA_INVALID_EVENT) + { + g_warning ("Failed to create WSAEvent"); + return g_source_new (&broken_funcs, sizeof (GSource)); + } +#endif + + condition |= G_IO_HUP | G_IO_ERR; + + source = g_source_new (&socket_source_funcs, sizeof (GSocketSource)); + g_source_set_name (source, "GSocket"); + socket_source = (GSocketSource *)source; + + socket_source->socket = g_object_ref (socket); + socket_source->condition = condition; + + if (g_cancellable_make_pollfd (cancellable, + &socket_source->cancel_pollfd)) + { + socket_source->cancellable = g_object_ref (cancellable); + g_source_add_poll (source, &socket_source->cancel_pollfd); + } + +#ifdef G_OS_WIN32 + add_condition_watch (socket, &socket_source->condition); + socket_source->pollfd.fd = (gintptr) socket->priv->event; +#else + socket_source->pollfd.fd = socket->priv->fd; +#endif + + socket_source->pollfd.events = condition; + socket_source->pollfd.revents = 0; + g_source_add_poll (source, &socket_source->pollfd); + + if (socket->priv->timeout) + socket_source->timeout_time = g_get_monotonic_time () + + socket->priv->timeout * 1000000; + + else + socket_source->timeout_time = 0; + + return source; +} + +/** + * g_socket_create_source: (skip) + * @socket: a #GSocket + * @condition: a #GIOCondition mask to monitor + * @cancellable: (allow-none): 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(). + * + * If @socket has a timeout set, and it is reached before @condition + * occurs, the source will then trigger anyway, reporting %G_IO_IN or + * %G_IO_OUT depending on @condition. However, @socket will have been + * marked as having had a timeout, and so the next #GSocket I/O method + * you call will then fail with a %G_IO_ERROR_TIMED_OUT. + * + * Returns: (transfer full): a newly allocated %GSource, free with g_source_unref(). + * + * Since: 2.22 + */ +GSource * +g_socket_create_source (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable) +{ + g_return_val_if_fail (G_IS_SOCKET (socket) && (cancellable == NULL || G_IS_CANCELLABLE (cancellable)), NULL); + + return socket_source_new (socket, condition, cancellable); +} + +/** + * 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. + * + * Note that on Windows, it is possible for an operation to return + * %G_IO_ERROR_WOULD_BLOCK even immediately after + * g_socket_condition_check() has claimed that the socket is ready for + * writing. Rather than calling g_socket_condition_check() and then + * writing to the socket if it succeeds, it is generally better to + * simply try writing to the socket right away, and try again later if + * the initial attempt returns %G_IO_ERROR_WOULD_BLOCK. + * + * 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) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), 0); + + 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; + poll_fd.revents = 0; + + 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: (allow-none): 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, or if the + * socket has a timeout set and it is reached before the condition is + * met, then %FALSE is returned and @error, if non-%NULL, is set to + * the appropriate value (%G_IO_ERROR_CANCELLED or + * %G_IO_ERROR_TIMED_OUT). + * + * See also g_socket_condition_timed_wait(). + * + * 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) +{ + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + return g_socket_condition_timed_wait (socket, condition, -1, + cancellable, error); +} + +/** + * g_socket_condition_timed_wait: + * @socket: a #GSocket + * @condition: a #GIOCondition mask to wait for + * @timeout: the maximum time (in microseconds) to wait, or -1 + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: a #GError pointer, or %NULL + * + * Waits for up to @timeout microseconds for @condition to become true + * on @socket. If the condition is met, %TRUE is returned. + * + * If @cancellable is cancelled before the condition is met, or if + * @timeout (or the socket's #GSocket:timeout) is reached before the + * condition is met, then %FALSE is returned and @error, if non-%NULL, + * is set to the appropriate value (%G_IO_ERROR_CANCELLED or + * %G_IO_ERROR_TIMED_OUT). + * + * If you don't want a timeout, use g_socket_condition_wait(). + * (Alternatively, you can pass -1 for @timeout.) + * + * Note that although @timeout is in microseconds for consistency with + * other GLib APIs, this function actually only has millisecond + * resolution, and the behavior is undefined if @timeout is not an + * exact number of milliseconds. + * + * Returns: %TRUE if the condition was met, %FALSE otherwise + * + * Since: 2.32 + */ +gboolean +g_socket_condition_timed_wait (GSocket *socket, + GIOCondition condition, + gint64 timeout, + GCancellable *cancellable, + GError **error) +{ + gint64 start_time; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (!check_socket (socket, error)) + return FALSE; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + if (socket->priv->timeout && + (timeout < 0 || socket->priv->timeout < timeout / G_USEC_PER_SEC)) + timeout = socket->priv->timeout * 1000; + else if (timeout != -1) + timeout = timeout / 1000; + + start_time = g_get_monotonic_time (); + +#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; + + if (timeout == -1) + timeout = WSA_INFINITE; + + current_condition = update_condition (socket); + while ((condition & current_condition) == 0) + { + res = WSAWaitForMultipleEvents (num_events, events, + FALSE, timeout, 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; + } + else if (res == WSA_WAIT_TIMEOUT) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT, + _("Socket I/O timed out")); + break; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + + current_condition = update_condition (socket); + + if (timeout != WSA_INFINITE) + { + timeout -= (g_get_monotonic_time () - start_time) * 1000; + if (timeout < 0) + timeout = 0; + } + } + 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++; + + while (TRUE) + { + result = g_poll (poll_fd, num, timeout); + if (result != -1 || errno != EINTR) + break; + + if (timeout != -1) + { + timeout -= (g_get_monotonic_time () - start_time) * 1000; + if (timeout < 0) + timeout = 0; + } + } + + if (num > 1) + g_cancellable_release_fd (cancellable); + + if (result == 0) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT, + _("Socket I/O timed out")); + return FALSE; + } + + return !g_cancellable_set_error_if_cancelled (cancellable, error); + } + #endif +} + +/** + * g_socket_send_message: + * @socket: a #GSocket + * @address: (allow-none): a #GSocketAddress, or %NULL + * @vectors: (array length=num_vectors): an array of #GOutputVector structs + * @num_vectors: the number of elements in @vectors, or -1 + * @messages: (array length=num_messages) (allow-none): 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: (allow-none): 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; + + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + + 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; + + msg.msg_flags = 0; + + /* 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])); + + if (msg.msg_controllen == 0) + msg.msg_control = NULL; + else + { + msg.msg_control = g_alloca (msg.msg_controllen); + memset (msg.msg_control, '\0', 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 +} + +static GSocketAddress * +cache_recv_address (GSocket *socket, struct sockaddr *native, int native_len) +{ + GSocketAddress *saddr; + gint i; + guint64 oldest_time = G_MAXUINT64; + gint oldest_index = 0; + + if (native_len <= 0) + return NULL; + + saddr = NULL; + for (i = 0; i < RECV_ADDR_CACHE_SIZE; i++) + { + GSocketAddress *tmp = socket->priv->recv_addr_cache[i].addr; + gpointer tmp_native = socket->priv->recv_addr_cache[i].native; + gint tmp_native_len = socket->priv->recv_addr_cache[i].native_len; + + if (!tmp) + continue; + + if (tmp_native_len != native_len) + continue; + + if (memcmp (tmp_native, native, native_len) == 0) + { + saddr = g_object_ref (tmp); + socket->priv->recv_addr_cache[i].last_used = g_get_monotonic_time (); + return saddr; + } + + if (socket->priv->recv_addr_cache[i].last_used < oldest_time) + { + oldest_time = socket->priv->recv_addr_cache[i].last_used; + oldest_index = i; + } + } + + saddr = g_socket_address_new_from_native (native, native_len); + + if (socket->priv->recv_addr_cache[oldest_index].addr) + { + g_object_unref (socket->priv->recv_addr_cache[oldest_index].addr); + g_free (socket->priv->recv_addr_cache[oldest_index].native); + } + + socket->priv->recv_addr_cache[oldest_index].native = g_memdup (native, native_len); + socket->priv->recv_addr_cache[oldest_index].native_len = native_len; + socket->priv->recv_addr_cache[oldest_index].addr = g_object_ref (saddr); + socket->priv->recv_addr_cache[oldest_index].last_used = g_get_monotonic_time (); + + return saddr; +} + +/** + * g_socket_receive_message: + * @socket: a #GSocket + * @address: (out) (allow-none): a pointer to a #GSocketAddress + * pointer, or %NULL + * @vectors: (array length=num_vectors): an array of #GInputVector structs + * @num_vectors: the number of elements in @vectors, or -1 + * @messages: (array length=num_messages) (allow-none): a pointer which + * may 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: (allow-none): 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 or %NULL if no such + * messages was received. 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() after calling g_object_unref() on each + * element. 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, the connection is closed, 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 0 if the connection was closed by + * the peer, 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; + + g_return_val_if_fail (G_IS_SOCKET (socket), -1); + + 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; + + /* We always set the close-on-exec flag so we don't leak file + * descriptors into child processes. Note that gunixfdmessage.c + * will later call fcntl (fd, FD_CLOEXEC), but that isn't atomic. + */ +#ifdef MSG_CMSG_CLOEXEC + msg.msg_flags |= MSG_CMSG_CLOEXEC; +#endif + + /* 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); +#ifdef MSG_CMSG_CLOEXEC + if (result < 0 && get_socket_errno () == EINVAL) + { + /* We must be running on an old kernel. Call without the flag. */ + msg.msg_flags &= ~(MSG_CMSG_CLOEXEC); + result = recvmsg (socket->priv->fd, &msg, msg.msg_flags); + } +#endif + + 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) + { + *address = cache_recv_address (socket, msg.msg_name, msg.msg_namelen); + } + + /* decode control messages */ + { + GPtrArray *my_messages = NULL; + struct cmsghdr *cmsg; + + if (msg.msg_controllen >= sizeof (struct cmsghdr)) + { + 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 (messages == NULL) + { + /* we have to do it this way if the user ignores the + * messages so that we will close any received fds. + */ + g_object_unref (message); + } + else + { + if (my_messages == NULL) + my_messages = g_ptr_array_new (); + g_ptr_array_add (my_messages, message); + } + } + } + + if (num_messages) + *num_messages = my_messages != NULL ? my_messages->len : 0; + + if (messages) + { + if (my_messages == NULL) + { + *messages = NULL; + } + else + { + g_ptr_array_add (my_messages, NULL); + *messages = (GSocketControlMessage **) g_ptr_array_free (my_messages, FALSE); + } + } + else + { + g_assert (my_messages == NULL); + } + } + + /* 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) + { + *address = cache_recv_address (socket, (struct sockaddr *)&addr, addrlen); + } + + /* capture the flags */ + if (flags != NULL) + *flags = win_flags; + + if (messages != NULL) + *messages = NULL; + if (num_messages != NULL) + *num_messages = 0; + + return bytes_received; + } +#endif +} + +/** + * g_socket_get_credentials: + * @socket: a #GSocket. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Returns the credentials of the foreign process connected to this + * socket, if any (e.g. it is only supported for %G_SOCKET_FAMILY_UNIX + * sockets). + * + * If this operation isn't supported on the OS, the method fails with + * the %G_IO_ERROR_NOT_SUPPORTED error. On Linux this is implemented + * by reading the %SO_PEERCRED option on the underlying socket. + * + * Other ways to obtain credentials from a foreign peer includes the + * #GUnixCredentialsMessage type and + * g_unix_connection_send_credentials() / + * g_unix_connection_receive_credentials() functions. + * + * Returns: (transfer full): %NULL if @error is set, otherwise a #GCredentials object + * that must be freed with g_object_unref(). + * + * Since: 2.26 + */ +GCredentials * +g_socket_get_credentials (GSocket *socket, + GError **error) +{ + GCredentials *ret; + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = NULL; + +#if defined(__linux__) || defined(__OpenBSD__) + { + socklen_t optlen; +#if defined(__linux__) + struct ucred native_creds; + optlen = sizeof (struct ucred); +#elif defined(__OpenBSD__) + struct sockpeercred native_creds; + optlen = sizeof (struct sockpeercred); +#endif + if (getsockopt (socket->priv->fd, + SOL_SOCKET, + SO_PEERCRED, + (void *)&native_creds, + &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)); + } + else + { + ret = g_credentials_new (); + g_credentials_set_native (ret, +#if defined(__linux__) + G_CREDENTIALS_TYPE_LINUX_UCRED, +#elif defined(__OpenBSD__) + G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED, +#endif + &native_creds); + } + } +#else + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("g_socket_get_credentials not implemented for this OS")); +#endif + + return ret; +} + +/** + * g_socket_get_option: + * @socket: a #GSocket + * @level: the "API level" of the option (eg, SOL_SOCKET) + * @optname: the "name" of the option (eg, SO_BROADCAST) + * @value: (out): return location for the option value + * @error: #GError for error reporting, or %NULL to ignore. + * + * Gets the value of an integer-valued option on @socket, as with + * getsockopt (). (If you need to fetch a + * non-integer-valued option, you will need to call + * getsockopt () directly.) + * + * The <gio/gnetworking.h> + * header pulls in system headers that will define most of the + * standard/portable socket options. For unusual socket protocols or + * platform-dependent options, you may need to include additional + * headers. + * + * Note that even for socket options that are a single byte in size, + * @value is still a pointer to a #gint variable, not a #guchar; + * g_socket_get_option() will handle the conversion internally. + * + * Returns: success or failure. On failure, @error will be set, and + * the system error value (errno or + * WSAGetLastError ()) will still be set to the + * result of the getsockopt () call. + * + * Since: 2.36 + */ +gboolean +g_socket_get_option (GSocket *socket, + gint level, + gint optname, + gint *value, + GError **error) +{ + guint size; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + *value = 0; + size = sizeof (gint); + if (getsockopt (socket->priv->fd, level, optname, value, &size) != 0) + { + int errsv = get_socket_errno (); + + g_set_error_literal (error, + G_IO_ERROR, + socket_io_error_from_errno (errsv), + socket_strerror (errsv)); +#ifndef G_OS_WIN32 + /* Reset errno in case the caller wants to look at it */ + errno = errsv; +#endif + return FALSE; + } + +#if G_BYTE_ORDER == G_BIG_ENDIAN + /* If the returned value is smaller than an int then we need to + * slide it over into the low-order bytes of *value. + */ + if (size != sizeof (gint)) + *value = *value >> (8 * (sizeof (gint) - size)); +#endif + + return TRUE; +} + +/** + * g_socket_set_option: + * @socket: a #GSocket + * @level: the "API level" of the option (eg, SOL_SOCKET) + * @optname: the "name" of the option (eg, SO_BROADCAST) + * @value: the value to set the option to + * @error: #GError for error reporting, or %NULL to ignore. + * + * Sets the value of an integer-valued option on @socket, as with + * setsockopt (). (If you need to set a + * non-integer-valued option, you will need to call + * setsockopt () directly.) + * + * The <gio/gnetworking.h> + * header pulls in system headers that will define most of the + * standard/portable socket options. For unusual socket protocols or + * platform-dependent options, you may need to include additional + * headers. + * + * Returns: success or failure. On failure, @error will be set, and + * the system error value (errno or + * WSAGetLastError ()) will still be set to the + * result of the setsockopt () call. + * + * Since: 2.36 + */ +gboolean +g_socket_set_option (GSocket *socket, + gint level, + gint optname, + gint value, + GError **error) +{ + gint errsv; + + g_return_val_if_fail (G_IS_SOCKET (socket), FALSE); + + if (setsockopt (socket->priv->fd, level, optname, &value, sizeof (gint)) == 0) + return TRUE; + +#if !defined (__linux__) && !defined (G_OS_WIN32) + /* Linux and Windows let you set a single-byte value from an int, + * but most other platforms don't. + */ + if (errno == EINVAL && value >= SCHAR_MIN && value <= CHAR_MAX) + { +#if G_BYTE_ORDER == G_BIG_ENDIAN + value = value << (8 * (sizeof (gint) - 1)); +#endif + if (setsockopt (socket->priv->fd, level, optname, &value, 1) == 0) + return TRUE; + } +#endif + + errsv = get_socket_errno (); + + g_set_error_literal (error, + G_IO_ERROR, + socket_io_error_from_errno (errsv), + socket_strerror (errsv)); +#ifndef G_OS_WIN32 + errno = errsv; +#endif + return FALSE; +} + diff --git a/gio/gsocket.h b/gio/gsocket.h new file mode 100644 index 0000000..edc0292 --- /dev/null +++ b/gio/gsocket.h @@ -0,0 +1,291 @@ +/* + * 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 + */ + +#ifndef __G_SOCKET_H__ +#define __G_SOCKET_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GSocket * g_socket_new (GSocketFamily family, + GSocketType type, + GSocketProtocol protocol, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocket * g_socket_new_from_fd (gint fd, + GError **error); +GLIB_AVAILABLE_IN_ALL +int g_socket_get_fd (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GSocketFamily g_socket_get_family (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GSocketType g_socket_get_socket_type (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GSocketProtocol g_socket_get_protocol (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GSocketAddress * g_socket_get_local_address (GSocket *socket, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketAddress * g_socket_get_remote_address (GSocket *socket, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_socket_set_blocking (GSocket *socket, + gboolean blocking); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_get_blocking (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +void g_socket_set_keepalive (GSocket *socket, + gboolean keepalive); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_get_keepalive (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +gint g_socket_get_listen_backlog (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +void g_socket_set_listen_backlog (GSocket *socket, + gint backlog); +GLIB_AVAILABLE_IN_ALL +guint g_socket_get_timeout (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +void g_socket_set_timeout (GSocket *socket, + guint timeout); + +GLIB_AVAILABLE_IN_2_32 +guint g_socket_get_ttl (GSocket *socket); +GLIB_AVAILABLE_IN_2_32 +void g_socket_set_ttl (GSocket *socket, + guint ttl); + +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_get_broadcast (GSocket *socket); +GLIB_AVAILABLE_IN_2_32 +void g_socket_set_broadcast (GSocket *socket, + gboolean broadcast); + +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_get_multicast_loopback (GSocket *socket); +GLIB_AVAILABLE_IN_2_32 +void g_socket_set_multicast_loopback (GSocket *socket, + gboolean loopback); +GLIB_AVAILABLE_IN_2_32 +guint g_socket_get_multicast_ttl (GSocket *socket); +GLIB_AVAILABLE_IN_2_32 +void g_socket_set_multicast_ttl (GSocket *socket, + guint ttl); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_is_connected (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_bind (GSocket *socket, + GSocketAddress *address, + gboolean allow_reuse, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_join_multicast_group (GSocket *socket, + GInetAddress *group, + gboolean source_specific, + const gchar *iface, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_leave_multicast_group (GSocket *socket, + GInetAddress *group, + gboolean source_specific, + const gchar *iface, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_connect (GSocket *socket, + GSocketAddress *address, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_check_connect_result (GSocket *socket, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gssize g_socket_get_available_bytes (GSocket *socket); + +GLIB_AVAILABLE_IN_ALL +GIOCondition g_socket_condition_check (GSocket *socket, + GIOCondition condition); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_condition_wait (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_condition_timed_wait (GSocket *socket, + GIOCondition condition, + gint64 timeout, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocket * g_socket_accept (GSocket *socket, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_listen (GSocket *socket, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_socket_receive (GSocket *socket, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_socket_receive_from (GSocket *socket, + GSocketAddress **address, + gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_socket_send (GSocket *socket, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_socket_send_to (GSocket *socket, + GSocketAddress *address, + const gchar *buffer, + gsize size, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_close (GSocket *socket, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_shutdown (GSocket *socket, + gboolean shutdown_read, + gboolean shutdown_write, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_is_closed (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GSource * g_socket_create_source (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_speaks_ipv4 (GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GCredentials *g_socket_get_credentials (GSocket *socket, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gssize g_socket_receive_with_blocking (GSocket *socket, + gchar *buffer, + gsize size, + gboolean blocking, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gssize g_socket_send_with_blocking (GSocket *socket, + const gchar *buffer, + gsize size, + gboolean blocking, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_2_36 +gboolean g_socket_get_option (GSocket *socket, + gint level, + gint optname, + gint *value, + GError **error); +GLIB_AVAILABLE_IN_2_36 +gboolean g_socket_set_option (GSocket *socket, + gint level, + gint optname, + gint value, + GError **error); + +G_END_DECLS + +#endif /* __G_SOCKET_H__ */ diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c new file mode 100644 index 0000000..03c8ac0 --- /dev/null +++ b/gio/gsocketaddress.c @@ -0,0 +1,417 @@ +/* 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 "gsocketaddress.h" +#include "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gnetworkingprivate.h" +#include "gproxyaddress.h" +#include "gproxyaddressenumerator.h" +#include "gsocketaddressenumerator.h" +#include "gsocketconnectable.h" +#include "glibintl.h" +#include "gioenumtypes.h" + +#ifdef G_OS_UNIX +#include "gunixsocketaddress.h" +#endif + + +/** + * 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); +static GSocketAddressEnumerator *g_socket_address_connectable_proxy_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; + connectable_iface->proxy_enumerate = g_socket_address_connectable_proxy_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 available, 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; + GSocketAddress *sockaddr; + + if (len < sizeof (*addr)) + return NULL; + + iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin_addr), AF_INET); + 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; + GSocketAddress *sockaddr; + + if (len < sizeof (*addr)) + return NULL; + + if (IN6_IS_ADDR_V4MAPPED (&(addr->sin6_addr))) + { + struct sockaddr_in sin_addr; + + sin_addr.sin_family = AF_INET; + sin_addr.sin_port = addr->sin6_port; + memcpy (&(sin_addr.sin_addr.s_addr), addr->sin6_addr.s6_addr + 12, 4); + iaddr = g_inet_address_new_from_bytes ((guint8 *) &(sin_addr.sin_addr), AF_INET); + } + else + { + iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin6_addr), AF_INET6); + } + + sockaddr = g_object_new (G_TYPE_INET_SOCKET_ADDRESS, + "address", iaddr, + "port", g_ntohs (addr->sin6_port), + "flowinfo", addr->sin6_flowinfo, + "scope_id", addr->sin6_scope_id, + NULL); + g_object_unref (iaddr); + return sockaddr; + } + +#ifdef G_OS_UNIX + if (family == AF_UNIX) + { + struct sockaddr_un *addr = (struct sockaddr_un *) native; + gint path_len = len - G_STRUCT_OFFSET (struct sockaddr_un, sun_path); + + if (path_len == 0) + { + return g_unix_socket_address_new_with_type ("", 0, + G_UNIX_SOCKET_ADDRESS_ANONYMOUS); + } + else if (addr->sun_path[0] == 0) + { + if (!g_unix_socket_address_abstract_names_supported ()) + { + return g_unix_socket_address_new_with_type ("", 0, + G_UNIX_SOCKET_ADDRESS_ANONYMOUS); + } + else if (len < sizeof (*addr)) + { + return g_unix_socket_address_new_with_type (addr->sun_path + 1, + path_len - 1, + G_UNIX_SOCKET_ADDRESS_ABSTRACT); + } + else + { + return g_unix_socket_address_new_with_type (addr->sun_path + 1, + path_len - 1, + G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED); + } + } + else + 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; + +static GType _g_socket_address_address_enumerator_get_type (void); +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; +} + +static GSocketAddressEnumerator * +g_socket_address_connectable_proxy_enumerate (GSocketConnectable *connectable) +{ + GSocketAddressEnumerator *addr_enum = NULL; + + if (G_IS_INET_SOCKET_ADDRESS (connectable) && + !G_IS_PROXY_ADDRESS (connectable)) + { + GInetAddress *addr; + guint port; + gchar *uri; + gchar *ip; + + g_object_get (connectable, "address", &addr, "port", &port, NULL); + + ip = g_inet_address_to_string (addr); + uri = _g_uri_from_authority ("none", ip, port, NULL); + + addr_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR, + "connectable", connectable, + "uri", uri, + NULL); + + g_object_unref (addr); + g_free (ip); + g_free (uri); + } + else + { + addr_enum = g_socket_address_connectable_enumerate (connectable); + } + + return addr_enum; +} diff --git a/gio/gsocketaddress.h b/gio/gsocketaddress.h new file mode 100644 index 0000000..dce3139 --- /dev/null +++ b/gio/gsocketaddress.h @@ -0,0 +1,84 @@ +/* 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_SOCKET_ADDRESS_H__ +#define __G_SOCKET_ADDRESS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketFamily g_socket_address_get_family (GSocketAddress *address); + +GLIB_AVAILABLE_IN_ALL +GSocketAddress * g_socket_address_new_from_native (gpointer native, + gsize len); + +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_address_to_native (GSocketAddress *address, + gpointer dest, + gsize destlen, + GError **error); + +GLIB_AVAILABLE_IN_ALL +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..35462af --- /dev/null +++ b/gio/gsocketaddressenumerator.c @@ -0,0 +1,177 @@ +/* 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 "gtask.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: (allow-none): 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: (transfer full): 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) +{ + GTask *task; + GSocketAddress *address; + GError *error = NULL; + + task = g_task_new (enumerator, NULL, callback, user_data); + + address = g_socket_address_enumerator_next (enumerator, cancellable, &error); + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, address, g_object_unref); + + g_object_unref (task); +} + +/** + * g_socket_address_enumerator_next_async: + * @enumerator: a #GSocketAddressEnumerator + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request + * is satisfied + * @user_data: (closure): 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) +{ + g_return_val_if_fail (g_task_is_valid (result, enumerator), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +/** + * 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: (transfer full): 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); +} diff --git a/gio/gsocketaddressenumerator.h b/gio/gsocketaddressenumerator.h new file mode 100644 index 0000000..bf415d1 --- /dev/null +++ b/gio/gsocketaddressenumerator.h @@ -0,0 +1,93 @@ +/* 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_SOCKET_ADDRESS_ENUMERATOR_H__ +#define __G_SOCKET_ADDRESS_ENUMERATOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_address_enumerator_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_socket_address_enumerator_next (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_socket_address_enumerator_next_async (GSocketAddressEnumerator *enumerator, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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..f499611 --- /dev/null +++ b/gio/gsocketclient.c @@ -0,0 +1,1962 @@ +/* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "glibintl.h" + + +/** + * SECTION:gsocketclient + * @short_description: Helper for connecting to a network service + * @include: gio/gio.h + * @see_also: #GSocketConnection, #GSocketListener + * + * #GSocketClient is a lightweight 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, and 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. + * + * As #GSocketClient is a lightweight object, you don't need to cache it. You + * can just create a new one any time you need one. + * + * Since: 2.22 + */ + + +G_DEFINE_TYPE (GSocketClient, g_socket_client, G_TYPE_OBJECT); + +enum +{ + EVENT, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +enum +{ + PROP_NONE, + PROP_FAMILY, + PROP_TYPE, + PROP_PROTOCOL, + PROP_LOCAL_ADDRESS, + PROP_TIMEOUT, + PROP_ENABLE_PROXY, + PROP_TLS, + PROP_TLS_VALIDATION_FLAGS, + PROP_PROXY_RESOLVER +}; + +struct _GSocketClientPrivate +{ + GSocketFamily family; + GSocketType type; + GSocketProtocol protocol; + GSocketAddress *local_address; + guint timeout; + gboolean enable_proxy; + GHashTable *app_proxies; + gboolean tls; + GTlsCertificateFlags tls_validation_flags; + GProxyResolver *proxy_resolver; +}; + +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; + } + } + + if (client->priv->timeout) + g_socket_set_timeout (socket, client->priv->timeout); + + return socket; +} + +static gboolean +can_use_proxy (GSocketClient *client) +{ + GSocketClientPrivate *priv = client->priv; + + return priv->enable_proxy + && priv->type == G_SOCKET_TYPE_STREAM; +} + +static void +clarify_connect_error (GError *error, + GSocketConnectable *connectable, + GSocketAddress *address) +{ + const char *name; + char *tmp_name = NULL; + + if (G_IS_PROXY_ADDRESS (address)) + { + name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))); + + g_prefix_error (&error, _("Could not connect to proxy server %s: "), name); + } + else + { + if (G_IS_NETWORK_ADDRESS (connectable)) + name = g_network_address_get_hostname (G_NETWORK_ADDRESS (connectable)); + else if (G_IS_NETWORK_SERVICE (connectable)) + name = g_network_service_get_domain (G_NETWORK_SERVICE (connectable)); + else if (G_IS_INET_SOCKET_ADDRESS (connectable)) + name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (connectable))); + else + name = NULL; + + if (name) + g_prefix_error (&error, _("Could not connect to %s: "), name); + else + g_prefix_error (&error, _("Could not connect: ")); + } + + g_free (tmp_name); +} + +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; + client->priv->app_proxies = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + NULL); +} + +/** + * 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); + + g_clear_object (&client->priv->local_address); + g_clear_object (&client->priv->proxy_resolver); + + if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) + (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object); + + g_hash_table_unref (client->priv->app_proxies); +} + +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; + + case PROP_TIMEOUT: + g_value_set_uint (value, client->priv->timeout); + break; + + case PROP_ENABLE_PROXY: + g_value_set_boolean (value, client->priv->enable_proxy); + break; + + case PROP_TLS: + g_value_set_boolean (value, g_socket_client_get_tls (client)); + break; + + case PROP_TLS_VALIDATION_FLAGS: + g_value_set_flags (value, g_socket_client_get_tls_validation_flags (client)); + break; + + case PROP_PROXY_RESOLVER: + g_value_set_object (value, g_socket_client_get_proxy_resolver (client)); + 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; + + case PROP_TIMEOUT: + g_socket_client_set_timeout (client, g_value_get_uint (value)); + break; + + case PROP_ENABLE_PROXY: + g_socket_client_set_enable_proxy (client, g_value_get_boolean (value)); + break; + + case PROP_TLS: + g_socket_client_set_tls (client, g_value_get_boolean (value)); + break; + + case PROP_TLS_VALIDATION_FLAGS: + g_socket_client_set_tls_validation_flags (client, g_value_get_flags (value)); + break; + + case PROP_PROXY_RESOLVER: + g_socket_client_set_proxy_resolver (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: (transfer none): a #GSocketAddress or %NULL. Do not 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: (allow-none): 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 that 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"); +} + +/** + * g_socket_client_get_timeout: + * @client: a #GSocketClient + * + * Gets the I/O timeout time for sockets created by @client. + * + * See g_socket_client_set_timeout() for details. + * + * Returns: the timeout in seconds + * + * Since: 2.26 + */ +guint +g_socket_client_get_timeout (GSocketClient *client) +{ + return client->priv->timeout; +} + + +/** + * g_socket_client_set_timeout: + * @client: a #GSocketClient. + * @timeout: the timeout + * + * Sets the I/O timeout for sockets created by @client. @timeout is a + * time in seconds, or 0 for no timeout (the default). + * + * The timeout value affects the initial connection attempt as well, + * so setting this may cause calls to g_socket_client_connect(), etc, + * to fail with %G_IO_ERROR_TIMED_OUT. + * + * Since: 2.26 + */ +void +g_socket_client_set_timeout (GSocketClient *client, + guint timeout) +{ + if (client->priv->timeout == timeout) + return; + + client->priv->timeout = timeout; + g_object_notify (G_OBJECT (client), "timeout"); +} + +/** + * g_socket_client_get_enable_proxy: + * @client: a #GSocketClient. + * + * Gets the proxy enable state; see g_socket_client_set_enable_proxy() + * + * Returns: whether proxying is enabled + * + * Since: 2.26 + */ +gboolean +g_socket_client_get_enable_proxy (GSocketClient *client) +{ + return client->priv->enable_proxy; +} + +/** + * g_socket_client_set_enable_proxy: + * @client: a #GSocketClient. + * @enable: whether to enable proxies + * + * Sets whether or not @client attempts to make connections via a + * proxy server. When enabled (the default), #GSocketClient will use a + * #GProxyResolver to determine if a proxy protocol such as SOCKS is + * needed, and automatically do the necessary proxy negotiation. + * + * See also g_socket_client_set_proxy_resolver(). + * + * Since: 2.26 + */ +void +g_socket_client_set_enable_proxy (GSocketClient *client, + gboolean enable) +{ + enable = !!enable; + if (client->priv->enable_proxy == enable) + return; + + client->priv->enable_proxy = enable; + g_object_notify (G_OBJECT (client), "enable-proxy"); +} + +/** + * g_socket_client_get_tls: + * @client: a #GSocketClient. + * + * Gets whether @client creates TLS connections. See + * g_socket_client_set_tls() for details. + * + * Returns: whether @client uses TLS + * + * Since: 2.28 + */ +gboolean +g_socket_client_get_tls (GSocketClient *client) +{ + return client->priv->tls; +} + +/** + * g_socket_client_set_tls: + * @client: a #GSocketClient. + * @tls: whether to use TLS + * + * Sets whether @client creates TLS (aka SSL) connections. If @tls is + * %TRUE, @client will wrap its connections in a #GTlsClientConnection + * and perform a TLS handshake when connecting. + * + * Note that since #GSocketClient must return a #GSocketConnection, + * but #GTlsClientConnection is not a #GSocketConnection, this + * actually wraps the resulting #GTlsClientConnection in a + * #GTcpWrapperConnection when returning it. You can use + * g_tcp_wrapper_connection_get_base_io_stream() on the return value + * to extract the #GTlsClientConnection. + * + * If you need to modify the behavior of the TLS handshake (eg, by + * setting a client-side certificate to use, or connecting to the + * #GTlsConnection::accept-certificate signal), you can connect to + * @client's #GSocketClient::event signal and wait for it to be + * emitted with %G_SOCKET_CLIENT_TLS_HANDSHAKING, which will give you + * a chance to see the #GTlsClientConnection before the handshake + * starts. + * + * Since: 2.28 + */ +void +g_socket_client_set_tls (GSocketClient *client, + gboolean tls) +{ + tls = !!tls; + if (tls == client->priv->tls) + return; + + client->priv->tls = tls; + g_object_notify (G_OBJECT (client), "tls"); +} + +/** + * g_socket_client_get_tls_validation_flags: + * @client: a #GSocketClient. + * + * Gets the TLS validation flags used creating TLS connections via + * @client. + * + * Returns: the TLS validation flags + * + * Since: 2.28 + */ +GTlsCertificateFlags +g_socket_client_get_tls_validation_flags (GSocketClient *client) +{ + return client->priv->tls_validation_flags; +} + +/** + * g_socket_client_set_tls_validation_flags: + * @client: a #GSocketClient. + * @flags: the validation flags + * + * Sets the TLS validation flags used when creating TLS connections + * via @client. The default value is %G_TLS_CERTIFICATE_VALIDATE_ALL. + * + * Since: 2.28 + */ +void +g_socket_client_set_tls_validation_flags (GSocketClient *client, + GTlsCertificateFlags flags) +{ + if (client->priv->tls_validation_flags != flags) + { + client->priv->tls_validation_flags = flags; + g_object_notify (G_OBJECT (client), "tls-validation-flags"); + } +} + +/** + * g_socket_client_get_proxy_resolver: + * @client: a #GSocketClient. + * + * Gets the #GProxyResolver being used by @client. Normally, this will + * be the resolver returned by g_proxy_resolver_get_default(), but you + * can override it with g_socket_client_set_proxy_resolver(). + * + * Returns: (transfer none): The #GProxyResolver being used by + * @client. + * + * Since: 2.36 + */ +GProxyResolver * +g_socket_client_get_proxy_resolver (GSocketClient *client) +{ + if (client->priv->proxy_resolver) + return client->priv->proxy_resolver; + else + return g_proxy_resolver_get_default (); +} + +/** + * g_socket_client_set_proxy_resolver: + * @client: a #GSocketClient. + * @proxy_resolver: (allow-none): a #GProxyResolver, or %NULL for the + * default. + * + * Overrides the #GProxyResolver used by @client. You can call this if + * you want to use specific proxies, rather than using the system + * default proxy settings. + * + * Note that whether or not the proxy resolver is actually used + * depends on the setting of #GSocketClient:enable-proxy, which is not + * changed by this function (but which is %TRUE by default) + * + * Since: 2.36 + */ +void +g_socket_client_set_proxy_resolver (GSocketClient *client, + GProxyResolver *proxy_resolver) +{ + /* We have to be careful to avoid calling + * g_proxy_resolver_get_default() until we're sure we need it, + * because trying to load the default proxy resolver module will + * break some test programs that aren't expecting it (eg, + * tests/gsettings). + */ + + if (client->priv->proxy_resolver) + g_object_unref (client->priv->proxy_resolver); + + client->priv->proxy_resolver = proxy_resolver; + + if (client->priv->proxy_resolver) + g_object_ref (client->priv->proxy_resolver); +} + +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; + + /** + * GSocketClient::event: + * @client: the #GSocketClient + * @event: the event that is occurring + * @connectable: the #GSocketConnectable that @event is occurring on + * @connection: the current representation of the connection + * + * Emitted when @client's activity on @connectable changes state. + * Among other things, this can be used to provide progress + * information about a network connection in the UI. The meanings of + * the different @event values are as follows: + * + * + * + * %G_SOCKET_CLIENT_RESOLVING: + * + * @client is about to look up @connectable in DNS. + * @connection will be %NULL. + * + * + * + * %G_SOCKET_CLIENT_RESOLVED: + * + * @client has successfully resolved @connectable in DNS. + * @connection will be %NULL. + * + * + * + * %G_SOCKET_CLIENT_CONNECTING: + * + * @client is about to make a connection to a remote host; + * either a proxy server or the destination server itself. + * @connection is the #GSocketConnection, which is not yet + * connected. + * + * + * + * %G_SOCKET_CLIENT_CONNECTED: + * + * @client has successfully connected to a remote host. + * @connection is the connected #GSocketConnection. + * + * + * + * %G_SOCKET_CLIENT_PROXY_NEGOTIATING: + * + * @client is about to negotiate with a proxy to get it to + * connect to @connectable. @connection is the + * #GSocketConnection to the proxy server. + * + * + * + * %G_SOCKET_CLIENT_PROXY_NEGOTIATED: + * + * @client has negotiated a connection to @connectable through + * a proxy server. @connection is the stream returned from + * g_proxy_connect(), which may or may not be a + * #GSocketConnection. + * + * + * + * %G_SOCKET_CLIENT_TLS_HANDSHAKING: + * + * @client is about to begin a TLS handshake. @connection is a + * #GTlsClientConnection. + * + * + * + * %G_SOCKET_CLIENT_TLS_HANDSHAKED: + * + * @client has successfully completed the TLS handshake. + * @connection is a #GTlsClientConnection. + * + * + * + * %G_SOCKET_CLIENT_COMPLETE: + * + * @client has either successfully connected to @connectable + * (in which case @connection is the #GSocketConnection that + * it will be returning to the caller) or has failed (in which + * case @connection is %NULL and the client is about to return + * an error). + * + * + * + * + * Each event except %G_SOCKET_CLIENT_COMPLETE may be emitted + * multiple times (or not at all) for a given connectable (in + * particular, if @client ends up attempting to connect to more than + * one address). However, if @client emits the #GSocketClient::event + * signal at all for a given connectable, that it will always emit + * it with %G_SOCKET_CLIENT_COMPLETE when it is done. + * + * Note that there may be additional #GSocketClientEvent values in + * the future; unrecognized @event values should be ignored. + * + * Since: 2.32 + */ + signals[EVENT] = + g_signal_new (I_("event"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GSocketClientClass, event), + NULL, NULL, + NULL, + G_TYPE_NONE, 3, + G_TYPE_SOCKET_CLIENT_EVENT, + G_TYPE_SOCKET_CONNECTABLE, + G_TYPE_IO_STREAM); + + 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_object_class_install_property (gobject_class, PROP_TIMEOUT, + g_param_spec_uint ("timeout", + P_("Socket timeout"), + P_("The I/O timeout for sockets, or 0 for none"), + 0, G_MAXUINT, 0, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_ENABLE_PROXY, + g_param_spec_boolean ("enable-proxy", + P_("Enable proxy"), + P_("Enable proxy support"), + TRUE, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TLS, + g_param_spec_boolean ("tls", + P_("TLS"), + P_("Whether to create TLS connections"), + FALSE, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_TLS_VALIDATION_FLAGS, + g_param_spec_flags ("tls-validation-flags", + P_("TLS validation flags"), + P_("TLS validation flags to use"), + G_TYPE_TLS_CERTIFICATE_FLAGS, + G_TLS_CERTIFICATE_VALIDATE_ALL, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + /** + * GSocketClient:proxy-resolver: + * + * The proxy resolver to use + * + * Since: 2.36 + */ + g_object_class_install_property (gobject_class, PROP_PROXY_RESOLVER, + g_param_spec_object ("proxy-resolver", + P_("Proxy resolver"), + P_("The proxy resolver to use"), + G_TYPE_PROXY_RESOLVER, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_socket_client_emit_event (GSocketClient *client, + GSocketClientEvent event, + GSocketConnectable *connectable, + GIOStream *connection) +{ + g_signal_emit (client, signals[EVENT], 0, + event, connectable, connection); +} + +/** + * g_socket_client_connect: + * @client: a #GSocketClient. + * @connectable: a #GSocketConnectable specifying the remote address. + * @cancellable: (allow-none): 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 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: (transfer full): a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error) +{ + GIOStream *connection = NULL; + GSocketAddressEnumerator *enumerator = NULL; + GError *last_error, *tmp_error; + + last_error = NULL; + + if (can_use_proxy (client)) + { + enumerator = g_socket_connectable_proxy_enumerate (connectable); + if (client->priv->proxy_resolver && + G_IS_PROXY_ADDRESS_ENUMERATOR (enumerator)) + { + g_object_set (G_OBJECT (enumerator), + "proxy-resolver", client->priv->proxy_resolver, + NULL); + } + } + else + enumerator = g_socket_connectable_enumerate (connectable); + + while (connection == NULL) + { + GSocketAddress *address = NULL; + gboolean application_proxy = FALSE; + GSocket *socket; + gboolean using_proxy; + + if (g_cancellable_is_cancelled (cancellable)) + { + g_clear_error (error); + g_cancellable_set_error_if_cancelled (cancellable, error); + break; + } + + tmp_error = NULL; + g_socket_client_emit_event (client, G_SOCKET_CLIENT_RESOLVING, + connectable, 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; + } + g_socket_client_emit_event (client, G_SOCKET_CLIENT_RESOLVED, + connectable, NULL); + + using_proxy = (G_IS_PROXY_ADDRESS (address) && + client->priv->enable_proxy); + + /* clear error from previous attempt */ + g_clear_error (&last_error); + + socket = create_socket (client, address, &last_error); + if (socket == NULL) + { + g_object_unref (address); + continue; + } + + connection = (GIOStream *)g_socket_connection_factory_create_connection (socket); + g_socket_client_emit_event (client, G_SOCKET_CLIENT_CONNECTING, connectable, connection); + + if (g_socket_connection_connect (G_SOCKET_CONNECTION (connection), + address, cancellable, &last_error)) + { + g_socket_client_emit_event (client, G_SOCKET_CLIENT_CONNECTED, connectable, connection); + } + else + { + clarify_connect_error (last_error, connectable, address); + g_object_unref (connection); + connection = NULL; + } + + if (connection && using_proxy) + { + GProxyAddress *proxy_addr = G_PROXY_ADDRESS (address); + const gchar *protocol; + GProxy *proxy; + + protocol = g_proxy_address_get_protocol (proxy_addr); + proxy = g_proxy_get_default_for_protocol (protocol); + + /* The connection should not be anything else then TCP Connection, + * but let's put a safety guard in case + */ + if (!G_IS_TCP_CONNECTION (connection)) + { + g_critical ("Trying to proxy over non-TCP connection, this is " + "most likely a bug in GLib IO library."); + + g_set_error_literal (&last_error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Proxying over a non-TCP connection is not supported.")); + + g_object_unref (connection); + connection = NULL; + } + else if (proxy) + { + GIOStream *proxy_connection; + + g_socket_client_emit_event (client, G_SOCKET_CLIENT_PROXY_NEGOTIATING, connectable, connection); + proxy_connection = g_proxy_connect (proxy, + connection, + proxy_addr, + cancellable, + &last_error); + g_object_unref (connection); + connection = proxy_connection; + g_object_unref (proxy); + + if (connection) + g_socket_client_emit_event (client, G_SOCKET_CLIENT_PROXY_NEGOTIATED, connectable, connection); + } + else if (!g_hash_table_lookup_extended (client->priv->app_proxies, + protocol, NULL, NULL)) + { + g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Proxy protocol '%s' is not supported."), + protocol); + g_object_unref (connection); + connection = NULL; + } + else + { + application_proxy = TRUE; + } + } + + if (!application_proxy && connection && client->priv->tls) + { + GIOStream *tlsconn; + + tlsconn = g_tls_client_connection_new (connection, connectable, &last_error); + g_object_unref (connection); + connection = tlsconn; + + if (tlsconn) + { + g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), + client->priv->tls_validation_flags); + g_socket_client_emit_event (client, G_SOCKET_CLIENT_TLS_HANDSHAKING, connectable, connection); + if (g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), + cancellable, &last_error)) + { + g_socket_client_emit_event (client, G_SOCKET_CLIENT_TLS_HANDSHAKED, connectable, connection); + } + else + { + g_object_unref (tlsconn); + connection = NULL; + } + } + } + + if (connection && !G_IS_SOCKET_CONNECTION (connection)) + { + GSocketConnection *wrapper_connection; + + wrapper_connection = g_tcp_wrapper_connection_new (connection, socket); + g_object_unref (connection); + connection = (GIOStream *)wrapper_connection; + } + + g_object_unref (socket); + g_object_unref (address); + } + g_object_unref (enumerator); + + g_socket_client_emit_event (client, G_SOCKET_CLIENT_COMPLETE, connectable, connection); + return G_SOCKET_CONNECTION (connection); +} + +/** + * g_socket_client_connect_to_host: + * @client: a #GSocketClient + * @host_and_port: the name and optionally port of the host to connect to + * @default_port: the default port to connect to + * @cancellable: (allow-none): 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 recognized 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 override 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: (transfer full): 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: (allow-none): a #GCancellable, or %NULL + * @error: a pointer to a #GError, or %NULL + * + * 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. + * + * Returns: (transfer full): a #GSocketConnection if successful, or %NULL on error + */ +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; +} + +/** + * g_socket_client_connect_to_uri: + * @client: a #GSocketClient + * @uri: A network URI + * @default_port: the default port to connect to + * @cancellable: (allow-none): 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 with a network URI. + * + * @uri may be any valid URI containing an "authority" (hostname/port) + * component. If a port is not specified in the URI, @default_port + * will be used. TLS will be negotiated if #GSocketClient:tls is %TRUE. + * (#GSocketClient does not know to automatically assume TLS for + * certain URI schemes.) + * + * Using this rather than g_socket_client_connect() or + * g_socket_client_connect_to_host() allows #GSocketClient to + * determine when to use application-specific proxy protocols. + * + * 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: (transfer full): a #GSocketConnection on success, %NULL on error. + * + * Since: 2.26 + */ +GSocketConnection * +g_socket_client_connect_to_uri (GSocketClient *client, + const gchar *uri, + guint16 default_port, + GCancellable *cancellable, + GError **error) +{ + GSocketConnectable *connectable; + GSocketConnection *connection; + + connectable = g_network_address_parse_uri (uri, default_port, error); + if (connectable == NULL) + return NULL; + + connection = g_socket_client_connect (client, connectable, + cancellable, error); + g_object_unref (connectable); + + return connection; +} + +typedef struct +{ + GTask *task; + GSocketClient *client; + + GSocketConnectable *connectable; + GSocketAddressEnumerator *enumerator; + GProxyAddress *proxy_addr; + GSocketAddress *current_addr; + GSocket *current_socket; + GIOStream *connection; + + GError *last_error; +} GSocketClientAsyncConnectData; + +static void +g_socket_client_async_connect_data_free (GSocketClientAsyncConnectData *data) +{ + g_clear_object (&data->connectable); + g_clear_object (&data->enumerator); + g_clear_object (&data->proxy_addr); + g_clear_object (&data->current_addr); + g_clear_object (&data->current_socket); + g_clear_object (&data->connection); + + g_clear_error (&data->last_error); + + g_slice_free (GSocketClientAsyncConnectData, data); +} + +static void +g_socket_client_async_connect_complete (GSocketClientAsyncConnectData *data) +{ + g_assert (data->connection); + + if (!G_IS_SOCKET_CONNECTION (data->connection)) + { + GSocketConnection *wrapper_connection; + + wrapper_connection = g_tcp_wrapper_connection_new (data->connection, + data->current_socket); + g_object_unref (data->connection); + data->connection = (GIOStream *)wrapper_connection; + } + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, data->connection); + g_task_return_pointer (data->task, data->connection, g_object_unref); + data->connection = NULL; + g_object_unref (data->task); +} + + +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 void +enumerator_next_async (GSocketClientAsyncConnectData *data) +{ + /* We need to cleanup the state */ + g_clear_object (&data->current_socket); + g_clear_object (&data->current_addr); + g_clear_object (&data->proxy_addr); + g_clear_object (&data->connection); + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_RESOLVING, data->connectable, NULL); + g_socket_address_enumerator_next_async (data->enumerator, + g_task_get_cancellable (data->task), + g_socket_client_enumerator_callback, + data); +} + +static void +g_socket_client_tls_handshake_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data = user_data; + + if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (object), + result, + &data->last_error)) + { + g_object_unref (data->connection); + data->connection = G_IO_STREAM (object); + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_TLS_HANDSHAKED, data->connectable, data->connection); + g_socket_client_async_connect_complete (data); + } + else + { + g_object_unref (object); + enumerator_next_async (data); + } +} + +static void +g_socket_client_tls_handshake (GSocketClientAsyncConnectData *data) +{ + GIOStream *tlsconn; + + if (!data->client->priv->tls) + { + g_socket_client_async_connect_complete (data); + return; + } + + tlsconn = g_tls_client_connection_new (data->connection, + data->connectable, + &data->last_error); + if (tlsconn) + { + g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), + data->client->priv->tls_validation_flags); + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_TLS_HANDSHAKING, data->connectable, G_IO_STREAM (tlsconn)); + g_tls_connection_handshake_async (G_TLS_CONNECTION (tlsconn), + G_PRIORITY_DEFAULT, + g_task_get_cancellable (data->task), + g_socket_client_tls_handshake_callback, + data); + } + else + { + enumerator_next_async (data); + } +} + +static void +g_socket_client_proxy_connect_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data = user_data; + + g_object_unref (data->connection); + data->connection = g_proxy_connect_finish (G_PROXY (object), + result, + &data->last_error); + if (data->connection) + { + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_PROXY_NEGOTIATED, data->connectable, data->connection); + } + else + { + enumerator_next_async (data); + return; + } + + g_socket_client_tls_handshake (data); +} + +static void +g_socket_client_connected_callback (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data = user_data; + GError *error = NULL; + GProxy *proxy; + const gchar *protocol; + + if (!g_socket_connection_connect_finish (G_SOCKET_CONNECTION (source), + result, &error)) + { + clarify_connect_error (error, data->connectable, + data->current_addr); + set_last_error (data, error); + + /* try next one */ + enumerator_next_async (data); + return; + } + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_CONNECTED, data->connectable, data->connection); + + /* wrong, but backward compatible */ + g_socket_set_blocking (data->current_socket, TRUE); + + if (!data->proxy_addr) + { + g_socket_client_tls_handshake (data); + return; + } + + protocol = g_proxy_address_get_protocol (data->proxy_addr); + proxy = g_proxy_get_default_for_protocol (protocol); + + /* The connection should not be anything other than TCP, + * but let's put a safety guard in case + */ + if (!G_IS_TCP_CONNECTION (data->connection)) + { + g_critical ("Trying to proxy over non-TCP connection, this is " + "most likely a bug in GLib IO library."); + + g_set_error_literal (&data->last_error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Proxying over a non-TCP connection is not supported.")); + + enumerator_next_async (data); + } + else if (proxy) + { + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_PROXY_NEGOTIATING, data->connectable, data->connection); + g_proxy_connect_async (proxy, + data->connection, + data->proxy_addr, + g_task_get_cancellable (data->task), + g_socket_client_proxy_connect_callback, + data); + g_object_unref (proxy); + } + else if (!g_hash_table_lookup_extended (data->client->priv->app_proxies, + protocol, NULL, NULL)) + { + g_clear_error (&data->last_error); + + g_set_error (&data->last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Proxy protocol '%s' is not supported."), + protocol); + + enumerator_next_async (data); + } + else + { + /* Simply complete the connection, we don't want to do TLS handshake + * as the application proxy handling may need proxy handshake first */ + g_socket_client_async_connect_complete (data); + } +} + +static void +g_socket_client_enumerator_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClientAsyncConnectData *data = user_data; + GSocketAddress *address = NULL; + GSocket *socket; + GError *error = NULL; + + if (g_task_return_error_if_cancelled (data->task)) + return; + + address = g_socket_address_enumerator_next_finish (data->enumerator, + result, &error); + if (address == NULL) + { + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_COMPLETE, data->connectable, NULL); + if (!error) + { + if (data->last_error) + { + error = data->last_error; + data->last_error = NULL; + } + else + { + g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unknown error on connect")); + } + } + g_task_return_error (data->task, error); + g_object_unref (data->task); + return; + } + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_RESOLVED, + data->connectable, NULL); + + if (G_IS_PROXY_ADDRESS (address) && + data->client->priv->enable_proxy) + data->proxy_addr = g_object_ref (G_PROXY_ADDRESS (address)); + + g_clear_error (&data->last_error); + + socket = create_socket (data->client, address, &data->last_error); + if (socket == NULL) + { + g_object_unref (address); + enumerator_next_async (data); + return; + } + + data->current_socket = socket; + data->current_addr = address; + data->connection = (GIOStream *) g_socket_connection_factory_create_connection (socket); + + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_CONNECTING, data->connectable, data->connection); + g_socket_connection_connect_async (G_SOCKET_CONNECTION (data->connection), + address, + g_task_get_cancellable (data->task), + g_socket_client_connected_callback, data); +} + +/** + * g_socket_client_connect_async: + * @client: a #GSocketClient + * @connectable: a #GSocketConnectable specifying the remote address. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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_new0 (GSocketClientAsyncConnectData); + data->client = client; + data->connectable = g_object_ref (connectable); + + if (can_use_proxy (client)) + { + data->enumerator = g_socket_connectable_proxy_enumerate (connectable); + if (client->priv->proxy_resolver && + G_IS_PROXY_ADDRESS_ENUMERATOR (data->enumerator)) + { + g_object_set (G_OBJECT (data->enumerator), + "proxy-resolver", client->priv->proxy_resolver, + NULL); + } + } + else + data->enumerator = g_socket_connectable_enumerate (connectable); + + data->task = g_task_new (client, cancellable, callback, user_data); + g_task_set_task_data (data->task, data, (GDestroyNotify)g_socket_client_async_connect_data_free); + + enumerator_next_async (data); +} + +/** + * g_socket_client_connect_to_host_async: + * @client: a #GSocketClient + * @host_and_port: the name and optionally the port of the host to connect to + * @default_port: the default port to connect to + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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_task_report_error (client, callback, user_data, + g_socket_client_connect_to_host_async, + 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: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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_to_uri_async: + * @client: a #GSocketClient + * @uri: a network uri + * @default_port: the default port to connect to + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): user data for the callback + * + * This is the asynchronous version of g_socket_client_connect_to_uri(). + * + * When the operation is finished @callback will be + * called. You can then call g_socket_client_connect_to_uri_finish() to get + * the result of the operation. + * + * Since: 2.26 + */ +void +g_socket_client_connect_to_uri_async (GSocketClient *client, + const gchar *uri, + guint16 default_port, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSocketConnectable *connectable; + GError *error; + + error = NULL; + connectable = g_network_address_parse_uri (uri, default_port, &error); + if (connectable == NULL) + { + g_task_report_error (client, callback, user_data, + g_socket_client_connect_to_uri_async, + error); + } + else + { + 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 occurring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_async() + * + * Returns: (transfer full): a #GSocketConnection on success, %NULL on error. + * + * Since: 2.22 + */ +GSocketConnection * +g_socket_client_connect_finish (GSocketClient *client, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, client), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +/** + * g_socket_client_connect_to_host_finish: + * @client: a #GSocketClient. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_to_host_async() + * + * Returns: (transfer full): 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 occurring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_to_service_async() + * + * Returns: (transfer full): 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); +} + +/** + * g_socket_client_connect_to_uri_finish: + * @client: a #GSocketClient. + * @result: a #GAsyncResult. + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an async connect operation. See g_socket_client_connect_to_uri_async() + * + * Returns: (transfer full): a #GSocketConnection on success, %NULL on error. + * + * Since: 2.26 + */ +GSocketConnection * +g_socket_client_connect_to_uri_finish (GSocketClient *client, + GAsyncResult *result, + GError **error) +{ + return g_socket_client_connect_finish (client, result, error); +} + +/** + * g_socket_client_add_application_proxy: + * @client: a #GSocketClient + * @protocol: The proxy protocol + * + * Enable proxy protocols to be handled by the application. When the + * indicated proxy protocol is returned by the #GProxyResolver, + * #GSocketClient will consider this protocol as supported but will + * not try to find a #GProxy instance to handle handshaking. The + * application must check for this case by calling + * g_socket_connection_get_remote_address() on the returned + * #GSocketConnection, and seeing if it's a #GProxyAddress of the + * appropriate type, to determine whether or not it needs to handle + * the proxy handshaking itself. + * + * This should be used for proxy protocols that are dialects of + * another protocol such as HTTP proxy. It also allows cohabitation of + * proxy protocols that are reused between protocols. A good example + * is HTTP. It can be used to proxy HTTP, FTP and Gopher and can also + * be use as generic socket proxy through the HTTP CONNECT method. + * + * When the proxy is detected as being an application proxy, TLS handshake + * will be skipped. This is required to let the application do the proxy + * specific handshake. + */ +void +g_socket_client_add_application_proxy (GSocketClient *client, + const gchar *protocol) +{ + g_hash_table_insert (client->priv->app_proxies, g_strdup (protocol), NULL); +} diff --git a/gio/gsocketclient.h b/gio/gsocketclient.h new file mode 100644 index 0000000..0cf6bf5 --- /dev/null +++ b/gio/gsocketclient.h @@ -0,0 +1,199 @@ +/* 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 + */ + +#ifndef __G_SOCKET_CLIENT_H__ +#define __G_SOCKET_CLIENT_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + + void (* event) (GSocketClient *client, + GSocketClientEvent event, + GSocketConnectable *connectable, + GIOStream *connection); + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); + void (*_g_reserved3) (void); + void (*_g_reserved4) (void); +}; + +struct _GSocketClient +{ + GObject parent_instance; + GSocketClientPrivate *priv; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_client_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketClient *g_socket_client_new (void); + +GLIB_AVAILABLE_IN_ALL +GSocketFamily g_socket_client_get_family (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_family (GSocketClient *client, + GSocketFamily family); +GLIB_AVAILABLE_IN_ALL +GSocketType g_socket_client_get_socket_type (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_socket_type (GSocketClient *client, + GSocketType type); +GLIB_AVAILABLE_IN_ALL +GSocketProtocol g_socket_client_get_protocol (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_protocol (GSocketClient *client, + GSocketProtocol protocol); +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_socket_client_get_local_address (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_local_address (GSocketClient *client, + GSocketAddress *address); +GLIB_AVAILABLE_IN_ALL +guint g_socket_client_get_timeout (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_timeout (GSocketClient *client, + guint timeout); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_client_get_enable_proxy (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_enable_proxy (GSocketClient *client, + gboolean enable); + +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_client_get_tls (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_tls (GSocketClient *client, + gboolean tls); +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_socket_client_get_tls_validation_flags (GSocketClient *client); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_set_tls_validation_flags (GSocketClient *client, + GTlsCertificateFlags flags); +GLIB_AVAILABLE_IN_2_36 +GProxyResolver *g_socket_client_get_proxy_resolver (GSocketClient *client); +GLIB_AVAILABLE_IN_2_36 +void g_socket_client_set_proxy_resolver (GSocketClient *client, + GProxyResolver *proxy_resolver); + +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_host (GSocketClient *client, + const gchar *host_and_port, + guint16 default_port, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_service (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_uri (GSocketClient *client, + const gchar *uri, + guint16 default_port, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_connect_async (GSocketClient *client, + GSocketConnectable *connectable, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_host_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_socket_client_connect_to_service_async (GSocketClient *client, + const gchar *domain, + const gchar *service, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_service_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_connect_to_uri_async (GSocketClient *client, + const gchar *uri, + guint16 default_port, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_client_connect_to_uri_finish (GSocketClient *client, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_socket_client_add_application_proxy (GSocketClient *client, + const gchar *protocol); + +G_END_DECLS + +#endif /* __G_SOCKET_CLIENT_H___ */ diff --git a/gio/gsocketconnectable.c b/gio/gsocketconnectable.c new file mode 100644 index 0000000..3bad099 --- /dev/null +++ b/gio/gsocketconnectable.c @@ -0,0 +1,153 @@ +/* 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" + + +/** + * 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; + * } + * } + * ]| + */ + + +typedef GSocketConnectableIface GSocketConnectableInterface; +G_DEFINE_INTERFACE (GSocketConnectable, g_socket_connectable, G_TYPE_OBJECT) + +static void +g_socket_connectable_default_init (GSocketConnectableInterface *iface) +{ +} + +/** + * g_socket_connectable_enumerate: + * @connectable: a #GSocketConnectable + * + * Creates a #GSocketAddressEnumerator for @connectable. + * + * Return value: (transfer full): 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); +} + +/** + * g_socket_connectable_proxy_enumerate: + * @connectable: a #GSocketConnectable + * + * Creates a #GSocketAddressEnumerator for @connectable that will + * return #GProxyAddresses for addresses that you must connect + * to via a proxy. + * + * If @connectable does not implement + * g_socket_connectable_proxy_enumerate(), this will fall back to + * calling g_socket_connectable_enumerate(). + * + * Return value: (transfer full): a new #GSocketAddressEnumerator. + * + * Since: 2.26 + */ +GSocketAddressEnumerator * +g_socket_connectable_proxy_enumerate (GSocketConnectable *connectable) +{ + GSocketConnectableIface *iface; + + g_return_val_if_fail (G_IS_SOCKET_CONNECTABLE (connectable), NULL); + + iface = G_SOCKET_CONNECTABLE_GET_IFACE (connectable); + + if (iface->proxy_enumerate) + return (* iface->proxy_enumerate) (connectable); + else + return (* iface->enumerate) (connectable); +} diff --git a/gio/gsocketconnectable.h b/gio/gsocketconnectable.h new file mode 100644 index 0000000..5a80ea8 --- /dev/null +++ b/gio/gsocketconnectable.h @@ -0,0 +1,77 @@ +/* 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_SOCKET_CONNECTABLE_H__ +#define __G_SOCKET_CONNECTABLE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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 + * @proxy_enumerate: Creates a #GProxyAddressEnumerator + * + * Provides an interface for returning a #GSocketAddressEnumerator + * and #GProxyAddressEnumerator + */ +struct _GSocketConnectableIface +{ + GTypeInterface g_iface; + + /* Virtual Table */ + + GSocketAddressEnumerator * (* enumerate) (GSocketConnectable *connectable); + + GSocketAddressEnumerator * (* proxy_enumerate) (GSocketConnectable *connectable); + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_connectable_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketAddressEnumerator *g_socket_connectable_enumerate (GSocketConnectable *connectable); + +GLIB_AVAILABLE_IN_ALL +GSocketAddressEnumerator *g_socket_connectable_proxy_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..d60f198 --- /dev/null +++ b/gio/gsocketconnection.c @@ -0,0 +1,657 @@ +/* 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" + + +/** + * 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. + * + * Choosing 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; + + gboolean in_dispose; +}; + +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_is_connected: + * @connection: a #GSocketConnection + * + * Checks if @connection is connected. This is equivalent to calling + * g_socket_is_connected() on @connection's underlying #GSocket. + * + * Returns: whether @connection is connected + * + * Since: 2.32 + */ +gboolean +g_socket_connection_is_connected (GSocketConnection *connection) +{ + return g_socket_is_connected (connection->priv->socket); +} + +/** + * g_socket_connection_connect: + * @connection: a #GSocketConnection + * @address: a #GSocketAddress specifying the remote address. + * @cancellable: (allow-none): a %GCancellable or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Connect @connection to the specified remote address. + * + * Returns: %TRUE if the connection succeeded, %FALSE on error + * + * Since: 2.32 + */ +gboolean +g_socket_connection_connect (GSocketConnection *connection, + GSocketAddress *address, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_SOCKET_CONNECTION (connection), FALSE); + g_return_val_if_fail (G_IS_SOCKET_ADDRESS (address), FALSE); + + return g_socket_connect (connection->priv->socket, address, + cancellable, error); +} + +static gboolean g_socket_connection_connect_callback (GSocket *socket, + GIOCondition condition, + gpointer user_data); + +/** + * g_socket_connection_connect_async: + * @connection: a #GSocketConnection + * @address: a #GSocketAddress specifying the remote address. + * @cancellable: (allow-none): a %GCancellable or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): user data for the callback + * + * Asynchronously connect @connection to the specified remote address. + * + * This clears the #GSocket:blocking flag on @connection's underlying + * socket if it is currently set. + * + * Use g_socket_connection_connect_finish() to retrieve the result. + * + * Since: 2.32 + */ +void +g_socket_connection_connect_async (GSocketConnection *connection, + GSocketAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *tmp_error = NULL; + + g_return_if_fail (G_IS_SOCKET_CONNECTION (connection)); + g_return_if_fail (G_IS_SOCKET_ADDRESS (address)); + + task = g_task_new (connection, cancellable, callback, user_data); + + g_socket_set_blocking (connection->priv->socket, FALSE); + + if (g_socket_connect (connection->priv->socket, address, + cancellable, &tmp_error)) + { + g_task_return_boolean (task, TRUE); + g_object_unref (task); + } + else if (g_error_matches (tmp_error, G_IO_ERROR, G_IO_ERROR_PENDING)) + { + GSource *source; + + g_error_free (tmp_error); + source = g_socket_create_source (connection->priv->socket, + G_IO_OUT, cancellable); + g_task_attach_source (task, source, + (GSourceFunc) g_socket_connection_connect_callback); + g_source_unref (source); + } + else + { + g_task_return_error (task, tmp_error); + g_object_unref (task); + } +} + +static gboolean +g_socket_connection_connect_callback (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + GTask *task = user_data; + GSocketConnection *connection = g_task_get_source_object (task); + GError *error = NULL; + + if (g_socket_check_connect_result (connection->priv->socket, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + + g_object_unref (task); + return FALSE; +} + +/** + * g_socket_connection_connect_finish: + * @connection: a #GSocketConnection + * @result: the #GAsyncResult + * @error: #GError for error reporting, or %NULL to ignore. + * + * Gets the result of a g_socket_connection_connect_async() call. + * + * Returns: %TRUE if the connection succeeded, %FALSE on error + * + * Since: 2.32 + */ +gboolean +g_socket_connection_connect_finish (GSocketConnection *connection, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_SOCKET_CONNECTION (connection), FALSE); + g_return_val_if_fail (g_task_is_valid (result, connection), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * 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: (transfer none): 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: (transfer full): 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: (transfer full): 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_dispose (GObject *object) +{ + GSocketConnection *connection = G_SOCKET_CONNECTION (object); + + connection->priv->in_dispose = TRUE; + + G_OBJECT_CLASS (g_socket_connection_parent_class) + ->dispose (object); + + connection->priv->in_dispose = FALSE; +} + +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; + gobject_class->dispose = g_socket_connection_dispose; + + 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); + + /* Don't close the underlying socket if this is being called + * as part of dispose(); when destroying the GSocketConnection, + * we only want to close the socket if we're holding the last + * reference on it, and in that case it will close itself when + * we unref it in finalize(). + */ + if (connection->priv->in_dispose) + return TRUE; + + 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) +{ + GTask *task; + GIOStreamClass *class; + GError *error; + + class = G_IO_STREAM_GET_CLASS (stream); + + task = g_task_new (stream, cancellable, callback, user_data); + + /* socket close is not blocked, just do it! */ + error = NULL; + if (class->close_fn && + !class->close_fn (stream, cancellable, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + + g_object_unref (task); +} + +static gboolean +g_socket_connection_close_finish (GIOStream *stream, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (result), error); +} + +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) +{ +#ifndef G_OS_WIN32 + g_type_ensure (G_TYPE_UNIX_CONNECTION); +#endif + g_type_ensure (G_TYPE_TCP_CONNECTION); +} + +/** + * 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: (transfer full): 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); +} diff --git a/gio/gsocketconnection.h b/gio/gsocketconnection.h new file mode 100644 index 0000000..b93201f --- /dev/null +++ b/gio/gsocketconnection.h @@ -0,0 +1,117 @@ +/* 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 + */ + +#ifndef __G_SOCKET_CONNECTION_H__ +#define __G_SOCKET_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_connection_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_connection_is_connected (GSocketConnection *connection); +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_connection_connect (GSocketConnection *connection, + GSocketAddress *address, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_32 +void g_socket_connection_connect_async (GSocketConnection *connection, + GSocketAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_32 +gboolean g_socket_connection_connect_finish (GSocketConnection *connection, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GSocket *g_socket_connection_get_socket (GSocketConnection *connection); +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_socket_connection_get_local_address (GSocketConnection *connection, + GError **error); +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_socket_connection_get_remote_address (GSocketConnection *connection, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_socket_connection_factory_register_type (GType g_type, + GSocketFamily family, + GSocketType type, + gint protocol); +GLIB_AVAILABLE_IN_ALL +GType g_socket_connection_factory_lookup_type (GSocketFamily family, + GSocketType type, + gint protocol_id); +GLIB_AVAILABLE_IN_ALL +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..4cd3ed8 --- /dev/null +++ b/gio/gsocketcontrolmessage.c @@ -0,0 +1,215 @@ +/* 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 "gunixcredentialsmessage.h" +#include "gunixfdmessage.h" +#endif + + +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: (array length=size) (element-type guint8): 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: (transfer full): the deserialized message or %NULL + * + * Since: 2.22 + */ +GSocketControlMessage * +g_socket_control_message_deserialize (int level, + int type, + gsize size, + gpointer data) +{ + GSocketControlMessage *message; + GType *message_types; + guint n_message_types; + int i; + + /* Ensure we know about the built in types */ +#ifndef G_OS_WIN32 + g_type_ensure (G_TYPE_UNIX_CREDENTIALS_MESSAGE); + g_type_ensure (G_TYPE_UNIX_FD_MESSAGE); +#endif + + message_types = g_type_children (G_TYPE_SOCKET_CONTROL_MESSAGE, &n_message_types); + + message = NULL; + for (i = 0; i < n_message_types; i++) + { + GSocketControlMessageClass *class; + + class = g_type_class_ref (message_types[i]); + message = class->deserialize (level, type, size, data); + g_type_class_unref (class); + + if (message != NULL) + break; + } + + g_free (message_types); + + /* It's not a bug if we can't deserialize the control message - for + * example, the control message may be be discarded if it is deemed + * empty, see e.g. + * + * http://git.gnome.org/browse/glib/commit/?id=ec91ed00f14c70cca9749347b8ebc19d72d9885b + * + * Therefore, it's not appropriate to print a warning about not + * being able to deserialize the message. + */ + + return message; +} diff --git a/gio/gsocketcontrolmessage.h b/gio/gsocketcontrolmessage.h new file mode 100644 index 0000000..aaa7c93 --- /dev/null +++ b/gio/gsocketcontrolmessage.h @@ -0,0 +1,111 @@ +/* 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_SOCKET_CONTROL_MESSAGE_H__ +#define __G_SOCKET_CONTROL_MESSAGE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_control_message_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gsize g_socket_control_message_get_size (GSocketControlMessage *message); +GLIB_AVAILABLE_IN_ALL +int g_socket_control_message_get_level (GSocketControlMessage *message); +GLIB_AVAILABLE_IN_ALL +int g_socket_control_message_get_msg_type (GSocketControlMessage *message); +GLIB_AVAILABLE_IN_ALL +void g_socket_control_message_serialize (GSocketControlMessage *message, + gpointer data); +GLIB_AVAILABLE_IN_ALL +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..66d0bff --- /dev/null +++ b/gio/gsocketinputstream.c @@ -0,0 +1,228 @@ +/* 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 "gcancellable.h" +#include "gpollableinputstream.h" +#include "gioerror.h" +#include "gfiledescriptorbased.h" + +static void g_socket_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface); +#ifdef G_OS_UNIX +static void g_socket_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#endif + +#define g_socket_input_stream_get_type _g_socket_input_stream_get_type + +#ifdef G_OS_UNIX +G_DEFINE_TYPE_WITH_CODE (GSocketInputStream, g_socket_input_stream, G_TYPE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, g_socket_input_stream_pollable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, g_socket_input_stream_file_descriptor_based_iface_init) + ) +#else +G_DEFINE_TYPE_WITH_CODE (GSocketInputStream, g_socket_input_stream, G_TYPE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, g_socket_input_stream_pollable_iface_init) + ) +#endif + +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GSocketInputStreamPrivate +{ + GSocket *socket; + + /* pending operation metadata */ + 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_with_blocking (input_stream->priv->socket, + buffer, count, TRUE, + cancellable, error); +} + +static gboolean +g_socket_input_stream_pollable_is_readable (GPollableInputStream *pollable) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (pollable); + + return g_socket_condition_check (input_stream->priv->socket, G_IO_IN); +} + +static GSource * +g_socket_input_stream_pollable_create_source (GPollableInputStream *pollable, + GCancellable *cancellable) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (pollable); + GSource *socket_source, *pollable_source; + + pollable_source = g_pollable_source_new (G_OBJECT (input_stream)); + socket_source = g_socket_create_source (input_stream->priv->socket, + G_IO_IN, cancellable); + g_source_set_dummy_callback (socket_source); + g_source_add_child_source (pollable_source, socket_source); + g_source_unref (socket_source); + + return pollable_source; +} + +static gssize +g_socket_input_stream_pollable_read_nonblocking (GPollableInputStream *pollable, + void *buffer, + gsize size, + GError **error) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (pollable); + + return g_socket_receive_with_blocking (input_stream->priv->socket, + buffer, size, FALSE, + NULL, error); +} + +#ifdef G_OS_UNIX +static int +g_socket_input_stream_get_fd (GFileDescriptorBased *fd_based) +{ + GSocketInputStream *input_stream = G_SOCKET_INPUT_STREAM (fd_based); + + return g_socket_get_fd (input_stream->priv->socket); +} +#endif + +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; + + 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)); +} + +#ifdef G_OS_UNIX +static void +g_socket_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_socket_input_stream_get_fd; +} +#endif + +static void +g_socket_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface) +{ + iface->is_readable = g_socket_input_stream_pollable_is_readable; + iface->create_source = g_socket_input_stream_pollable_create_source; + iface->read_nonblocking = g_socket_input_stream_pollable_read_nonblocking; +} + +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)); +} 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..7af0d14 --- /dev/null +++ b/gio/gsocketlistener.c @@ -0,0 +1,1126 @@ +/* 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" + + +/** + * 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: (allow-none): 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: (allow-none): Optional #GObject identifying this source + * @effective_address: (out) (allow-none): 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 deterministic behavior, 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 occurred 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: (allow-none): 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: (out) (transfer none) (allow-none): location where #GObject pointer will be stored, or %NULL. + * @cancellable: (allow-none): 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: (transfer full): 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: (out) (transfer none) (allow-none): location where #GObject pointer will be stored, or %NULL + * @cancellable: (allow-none): 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: (transfer full): 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; +} + +static gboolean +accept_ready (GSocket *accept_socket, + GIOCondition condition, + gpointer user_data) +{ + GTask *task = user_data; + GError *error = NULL; + GSocket *socket; + GObject *source_object; + + socket = g_socket_accept (accept_socket, g_task_get_cancellable (task), &error); + if (socket) + { + source_object = g_object_get_qdata (G_OBJECT (accept_socket), source_quark); + if (source_object) + g_object_set_qdata_full (G_OBJECT (task), + source_quark, + g_object_ref (source_object), g_object_unref); + g_task_return_pointer (task, socket, g_object_unref); + } + else + { + g_task_return_error (task, error); + } + + g_object_unref (task); + return FALSE; +} + +/** + * g_socket_listener_accept_socket_async: + * @listener: a #GSocketListener + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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) +{ + GTask *task; + GList *sources; + GError *error = NULL; + + task = g_task_new (listener, cancellable, callback, user_data); + + if (!check_listener (listener, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + sources = add_sources (listener, + accept_ready, + task, + cancellable, + g_main_context_get_thread_default ()); + g_task_set_task_data (task, sources, (GDestroyNotify) free_sources); +} + +/** + * g_socket_listener_accept_socket_finish: + * @listener: a #GSocketListener + * @result: a #GAsyncResult. + * @source_object: (out) (transfer none) (allow-none): Optional #GObject identifying this source + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an async accept operation. See g_socket_listener_accept_socket_async() + * + * Returns: (transfer full): 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) +{ + g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener), NULL); + g_return_val_if_fail (g_task_is_valid (result, listener), NULL); + + if (source_object) + *source_object = g_object_get_qdata (G_OBJECT (result), source_quark); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +/** + * g_socket_listener_accept_async: + * @listener: a #GSocketListener + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: (scope async): a #GAsyncReadyCallback + * @user_data: (closure): 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: (out) (transfer none) (allow-none): Optional #GObject identifying this source + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Finishes an async accept operation. See g_socket_listener_accept_async() + * + * Returns: (transfer full): 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: (allow-none): Optional #GObject identifying this source + * @error: a #GError location to store the error occurring, or %NULL to + * ignore. + * + * Listens for TCP connections on any available port number for both + * IPv6 and IPv4 (if each is 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; +} diff --git a/gio/gsocketlistener.h b/gio/gsocketlistener.h new file mode 100644 index 0000000..09f3985 --- /dev/null +++ b/gio/gsocketlistener.h @@ -0,0 +1,152 @@ +/* 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 + */ + +#ifndef __G_SOCKET_LISTENER_H__ +#define __G_SOCKET_LISTENER_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_listener_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketListener * g_socket_listener_new (void); + +GLIB_AVAILABLE_IN_ALL +void g_socket_listener_set_backlog (GSocketListener *listener, + int listen_backlog); + +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_listener_add_socket (GSocketListener *listener, + GSocket *socket, + GObject *source_object, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_listener_add_address (GSocketListener *listener, + GSocketAddress *address, + GSocketType type, + GSocketProtocol protocol, + GObject *source_object, + GSocketAddress **effective_address, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_listener_add_inet_port (GSocketListener *listener, + guint16 port, + GObject *source_object, + GError **error); +GLIB_AVAILABLE_IN_ALL +guint16 g_socket_listener_add_any_inet_port (GSocketListener *listener, + GObject *source_object, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GSocket * g_socket_listener_accept_socket (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_socket_listener_accept_socket_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GSocket * g_socket_listener_accept_socket_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error); + + +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_listener_accept (GSocketListener *listener, + GObject **source_object, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_socket_listener_accept_async (GSocketListener *listener, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GSocketConnection * g_socket_listener_accept_finish (GSocketListener *listener, + GAsyncResult *result, + GObject **source_object, + GError **error); + +GLIB_AVAILABLE_IN_ALL +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..6168758 --- /dev/null +++ b/gio/gsocketoutputstream.c @@ -0,0 +1,232 @@ +/* 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 "glibintl.h" + +#include "gcancellable.h" +#include "gpollableinputstream.h" +#include "gpollableoutputstream.h" +#include "gioerror.h" +#include "glibintl.h" +#include "gfiledescriptorbased.h" + +static void g_socket_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface); +#ifdef G_OS_UNIX +static void g_socket_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); +#endif + +#define g_socket_output_stream_get_type _g_socket_output_stream_get_type + +#ifdef G_OS_UNIX +G_DEFINE_TYPE_WITH_CODE (GSocketOutputStream, g_socket_output_stream, G_TYPE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, g_socket_output_stream_pollable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, g_socket_output_stream_file_descriptor_based_iface_init) + ) +#else +G_DEFINE_TYPE_WITH_CODE (GSocketOutputStream, g_socket_output_stream, G_TYPE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, g_socket_output_stream_pollable_iface_init) + ) +#endif + +enum +{ + PROP_0, + PROP_SOCKET +}; + +struct _GSocketOutputStreamPrivate +{ + GSocket *socket; + + /* pending operation metadata */ + 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_with_blocking (onput_stream->priv->socket, + buffer, count, TRUE, + cancellable, error); +} + +static gboolean +g_socket_output_stream_pollable_is_writable (GPollableOutputStream *pollable) +{ + GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (pollable); + + return g_socket_condition_check (output_stream->priv->socket, G_IO_OUT); +} + +static gssize +g_socket_output_stream_pollable_write_nonblocking (GPollableOutputStream *pollable, + const void *buffer, + gsize size, + GError **error) +{ + GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (pollable); + + return g_socket_send_with_blocking (output_stream->priv->socket, + buffer, size, FALSE, + NULL, error); +} + +static GSource * +g_socket_output_stream_pollable_create_source (GPollableOutputStream *pollable, + GCancellable *cancellable) +{ + GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (pollable); + GSource *socket_source, *pollable_source; + + pollable_source = g_pollable_source_new (G_OBJECT (output_stream)); + socket_source = g_socket_create_source (output_stream->priv->socket, + G_IO_OUT, cancellable); + g_source_set_dummy_callback (socket_source); + g_source_add_child_source (pollable_source, socket_source); + g_source_unref (socket_source); + + return pollable_source; +} + +#ifdef G_OS_UNIX +static int +g_socket_output_stream_get_fd (GFileDescriptorBased *fd_based) +{ + GSocketOutputStream *output_stream = G_SOCKET_OUTPUT_STREAM (fd_based); + + return g_socket_get_fd (output_stream->priv->socket); +} +#endif + +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; + + 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)); +} + +#ifdef G_OS_UNIX +static void +g_socket_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = g_socket_output_stream_get_fd; +} +#endif + +static void +g_socket_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface) +{ + iface->is_writable = g_socket_output_stream_pollable_is_writable; + iface->create_source = g_socket_output_stream_pollable_create_source; + iface->write_nonblocking = g_socket_output_stream_pollable_write_nonblocking; +} + +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)); +} 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..026e64a --- /dev/null +++ b/gio/gsocketservice.c @@ -0,0 +1,332 @@ +/* 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 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 of the thread-default + * context of the thread it is created in, and is not + * threadsafe in general. However, the calls to start and stop the + * service are thread-safe so these can be used from threads that + * handle incoming clients. + * + * Since: 2.22 + */ + +#include "config.h" +#include "gsocketservice.h" + +#include +#include "gsocketlistener.h" +#include "gsocketconnection.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 thread-safe, so it may be called from a thread + * handling an incoming 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 thread-safe, so it may be called from a thread + * handling an incoming 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: (allow-none): 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. + * + * @connection will be unreffed once the signal handler returns, + * so you need to ref it yourself if you are planning to use it. + * + * 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, + NULL, 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); +} diff --git a/gio/gsocketservice.h b/gio/gsocketservice.h new file mode 100644 index 0000000..d10b566 --- /dev/null +++ b/gio/gsocketservice.h @@ -0,0 +1,93 @@ +/* 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 + */ + +#ifndef __G_SOCKET_SERVICE_H__ +#define __G_SOCKET_SERVICE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_socket_service_get_type (void); + +GLIB_AVAILABLE_IN_ALL +GSocketService *g_socket_service_new (void); +GLIB_AVAILABLE_IN_ALL +void g_socket_service_start (GSocketService *service); +GLIB_AVAILABLE_IN_ALL +void g_socket_service_stop (GSocketService *service); +GLIB_AVAILABLE_IN_ALL +gboolean g_socket_service_is_active (GSocketService *service); + + +G_END_DECLS + +#endif /* __G_SOCKET_SERVICE_H__ */ diff --git a/gio/gsocks4aproxy.c b/gio/gsocks4aproxy.c new file mode 100644 index 0000000..e9b00f3 --- /dev/null +++ b/gio/gsocks4aproxy.c @@ -0,0 +1,459 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include "gsocks4aproxy.h" + +#include + +#include "giomodule.h" +#include "giomodule-priv.h" +#include "giostream.h" +#include "ginetaddress.h" +#include "ginputstream.h" +#include "glibintl.h" +#include "goutputstream.h" +#include "gproxy.h" +#include "gproxyaddress.h" +#include "gtask.h" + +#define SOCKS4_VERSION 4 + +#define SOCKS4_CMD_CONNECT 1 +#define SOCKS4_CMD_BIND 2 + +#define SOCKS4_MAX_LEN 255 + +#define SOCKS4_REP_VERSION 0 +#define SOCKS4_REP_GRANTED 90 +#define SOCKS4_REP_REJECTED 91 +#define SOCKS4_REP_NO_IDENT 92 +#define SOCKS4_REP_BAD_IDENT 93 + +static void g_socks4a_proxy_iface_init (GProxyInterface *proxy_iface); + +#define g_socks4a_proxy_get_type _g_socks4a_proxy_get_type +G_DEFINE_TYPE_WITH_CODE (GSocks4aProxy, g_socks4a_proxy, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, + g_socks4a_proxy_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, + g_define_type_id, + "socks4a", + 0)) + +static void +g_socks4a_proxy_finalize (GObject *object) +{ + /* must chain up */ + G_OBJECT_CLASS (g_socks4a_proxy_parent_class)->finalize (object); +} + +static void +g_socks4a_proxy_init (GSocks4aProxy *proxy) +{ + proxy->supports_hostname = TRUE; +} + +/* |-> SOCKSv4a only + * +----+----+----+----+----+----+----+----+----+----+....+----+------+....+------+ + * | VN | CD | DSTPORT | DSTIP | USERID |NULL| HOST | | NULL | + * +----+----+----+----+----+----+----+----+----+----+....+----+------+....+------+ + * 1 1 2 4 variable 1 variable + */ +#define SOCKS4_CONN_MSG_LEN (9 + SOCKS4_MAX_LEN * 2) +static gint +set_connect_msg (guint8 *msg, + const gchar *hostname, + guint16 port, + const char *username, + GError **error) +{ + GInetAddress *addr; + guint len = 0; + gsize addr_len; + gboolean is_ip; + const gchar *ip; + + msg[len++] = SOCKS4_VERSION; + msg[len++] = SOCKS4_CMD_CONNECT; + + { + guint16 hp = g_htons (port); + memcpy (msg + len, &hp, 2); + len += 2; + } + + is_ip = g_hostname_is_ip_address (hostname); + + if (is_ip) + ip = hostname; + else + ip = "0.0.0.1"; + + addr = g_inet_address_new_from_string (ip); + addr_len = g_inet_address_get_native_size (addr); + + if (addr_len != 4) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("SOCKSv4 does not support IPv6 address '%s'"), + ip); + g_object_unref (addr); + return -1; + } + + memcpy (msg + len, g_inet_address_to_bytes (addr), addr_len); + len += addr_len; + + g_object_unref (addr); + + if (username) + { + gsize user_len = strlen (username); + + if (user_len > SOCKS4_MAX_LEN) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Username is too long for SOCKSv4 protocol")); + return -1; + } + + memcpy (msg + len, username, user_len); + len += user_len; + } + + msg[len++] = '\0'; + + if (!is_ip) + { + gsize host_len = strlen (hostname); + + if (host_len > SOCKS4_MAX_LEN) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Hostname '%s' is too long for SOCKSv4 protocol"), + hostname); + return -1; + } + + memcpy (msg + len, hostname, host_len); + len += host_len; + msg[len++] = '\0'; + } + + return len; +} + +/* + * +----+----+----+----+----+----+----+----+ + * | VN | CD | DSTPORT | DSTIP | + * +----+----+----+----+----+----+----+----+ + * 1 1 2 4 + */ +#define SOCKS4_CONN_REP_LEN 8 +static gboolean +parse_connect_reply (const guint8 *data, GError **error) +{ + if (data[0] != SOCKS4_REP_VERSION) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("The server is not a SOCKSv4 proxy server.")); + return FALSE; + } + + if (data[1] != SOCKS4_REP_GRANTED) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Connection through SOCKSv4 server was rejected")); + return FALSE; + } + + return TRUE; +} + +static GIOStream * +g_socks4a_proxy_connect (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error) +{ + GInputStream *in; + GOutputStream *out; + const gchar *hostname; + guint16 port; + const gchar *username; + + hostname = g_proxy_address_get_destination_hostname (proxy_address); + port = g_proxy_address_get_destination_port (proxy_address); + username = g_proxy_address_get_username (proxy_address); + + in = g_io_stream_get_input_stream (io_stream); + out = g_io_stream_get_output_stream (io_stream); + + /* Send SOCKS4 connection request */ + { + guint8 msg[SOCKS4_CONN_MSG_LEN]; + gint len; + + len = set_connect_msg (msg, hostname, port, username, error); + + if (len < 0) + goto error; + + if (!g_output_stream_write_all (out, msg, len, NULL, + cancellable, error)) + goto error; + } + + /* Read SOCKS4 response */ + { + guint8 data[SOCKS4_CONN_REP_LEN]; + + if (!g_input_stream_read_all (in, data, SOCKS4_CONN_REP_LEN, NULL, + cancellable, error)) + goto error; + + if (!parse_connect_reply (data, error)) + goto error; + } + + return g_object_ref (io_stream); + +error: + return NULL; +} + + +typedef struct +{ + GIOStream *io_stream; + + /* For connecting */ + guint8 *buffer; + gssize length; + gssize offset; + +} ConnectAsyncData; + +static void connect_msg_write_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); +static void connect_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); + +static void +free_connect_data (ConnectAsyncData *data) +{ + g_object_unref (data->io_stream); + g_slice_free (ConnectAsyncData, data); +} + +static void +do_read (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) +{ + GInputStream *in; + in = g_io_stream_get_input_stream (data->io_stream); + g_input_stream_read_async (in, + data->buffer + data->offset, + data->length - data->offset, + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); +} + +static void +do_write (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) +{ + GOutputStream *out; + out = g_io_stream_get_output_stream (data->io_stream); + g_output_stream_write_async (out, + data->buffer + data->offset, + data->length - data->offset, + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); +} + + + +static void +g_socks4a_proxy_connect_async (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GError *error = NULL; + GTask *task; + ConnectAsyncData *data; + const gchar *hostname; + guint16 port; + const gchar *username; + + data = g_slice_new0 (ConnectAsyncData); + data->io_stream = g_object_ref (io_stream); + + task = g_task_new (proxy, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify) free_connect_data); + + hostname = g_proxy_address_get_destination_hostname (proxy_address); + port = g_proxy_address_get_destination_port (proxy_address); + username = g_proxy_address_get_username (proxy_address); + + data->buffer = g_malloc0 (SOCKS4_CONN_MSG_LEN); + data->length = set_connect_msg (data->buffer, + hostname, port, username, + &error); + data->offset = 0; + + if (data->length < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + } + else + { + do_write (connect_msg_write_cb, task, data); + } +} + +static void +connect_msg_write_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize written; + + written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), + result, &error); + + if (written < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += written; + + if (data->offset == data->length) + { + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS4_CONN_REP_LEN); + data->length = SOCKS4_CONN_REP_LEN; + data->offset = 0; + + do_read (connect_reply_read_cb, task, data); + } + else + { + do_write (connect_msg_write_cb, task, data); + } +} + +static void +connect_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + result, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += read; + + if (data->offset == data->length) + { + if (!parse_connect_reply (data->buffer, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + else + { + g_task_return_pointer (task, g_object_ref (data->io_stream), g_object_unref); + g_object_unref (task); + return; + } + } + else + { + do_read (connect_reply_read_cb, task, data); + } +} + +static GIOStream *g_socks4a_proxy_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error); + +static GIOStream * +g_socks4a_proxy_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean +g_socks4a_proxy_supports_hostname (GProxy *proxy) +{ + return G_SOCKS4A_PROXY (proxy)->supports_hostname; +} + +static void +g_socks4a_proxy_class_init (GSocks4aProxyClass *class) +{ + GObjectClass *object_class; + + object_class = (GObjectClass *) class; + object_class->finalize = g_socks4a_proxy_finalize; +} + +static void +g_socks4a_proxy_iface_init (GProxyInterface *proxy_iface) +{ + proxy_iface->connect = g_socks4a_proxy_connect; + proxy_iface->connect_async = g_socks4a_proxy_connect_async; + proxy_iface->connect_finish = g_socks4a_proxy_connect_finish; + proxy_iface->supports_hostname = g_socks4a_proxy_supports_hostname; +} diff --git a/gio/gsocks4aproxy.h b/gio/gsocks4aproxy.h new file mode 100644 index 0000000..e6c7b04 --- /dev/null +++ b/gio/gsocks4aproxy.h @@ -0,0 +1,55 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_SOCKS4A_PROXY_H__ +#define __G_SOCKS4A_PROXY_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKS4A_PROXY (_g_socks4a_proxy_get_type ()) +#define G_SOCKS4A_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SOCKS4A_PROXY, GSocks4aProxy)) +#define G_SOCKS4A_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SOCKS4A_PROXY, GSocks4aProxyClass)) +#define G_IS_SOCKS4A_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SOCKS4A_PROXY)) +#define G_IS_SOCKS4A_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKS4A_PROXY)) +#define G_SOCKS4A_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKS4A_PROXY, GSocks4aProxyClass)) + +typedef struct _GSocks4aProxy GSocks4aProxy; +typedef struct _GSocks4aProxyClass GSocks4aProxyClass; + +struct _GSocks4aProxy +{ + GObject parent; + gboolean supports_hostname; +}; + +struct _GSocks4aProxyClass +{ + GObjectClass parent_class; +}; + +GType _g_socks4a_proxy_get_type (void); + +G_END_DECLS + +#endif /* __SOCKS5_PROXY_H__ */ diff --git a/gio/gsocks4proxy.c b/gio/gsocks4proxy.c new file mode 100644 index 0000000..05c74c8 --- /dev/null +++ b/gio/gsocks4proxy.c @@ -0,0 +1,71 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include "gsocks4proxy.h" + +#include "giomodule.h" +#include "giomodule-priv.h" +#include "gproxy.h" +#include "gsocks4aproxy.h" + +struct _GSocks4Proxy +{ + GSocks4aProxy parent; +}; + +struct _GSocks4ProxyClass +{ + GSocks4aProxyClass parent_class; +}; + +#define g_socks4_proxy_get_type _g_socks4_proxy_get_type +G_DEFINE_TYPE_WITH_CODE (GSocks4Proxy, g_socks4_proxy, G_TYPE_SOCKS4A_PROXY, + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, + g_define_type_id, + "socks4", + 0)) + +static void +g_socks4_proxy_finalize (GObject *object) +{ + /* must chain up */ + G_OBJECT_CLASS (g_socks4_proxy_parent_class)->finalize (object); +} + +static void +g_socks4_proxy_init (GSocks4Proxy *proxy) +{ + G_SOCKS4A_PROXY (proxy)->supports_hostname = FALSE; +} + + +static void +g_socks4_proxy_class_init (GSocks4ProxyClass *class) +{ + GObjectClass *object_class; + + object_class = (GObjectClass *) class; + object_class->finalize = g_socks4_proxy_finalize; +} diff --git a/gio/gsocks4proxy.h b/gio/gsocks4proxy.h new file mode 100644 index 0000000..5b89d2d --- /dev/null +++ b/gio/gsocks4proxy.h @@ -0,0 +1,44 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#ifndef __G_SOCKS4_PROXY_H__ +#define __G_SOCKS4_PROXY_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKS4_PROXY (_g_socks4_proxy_get_type ()) +#define G_SOCKS4_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SOCKS4_PROXY, GSocks4Proxy)) +#define G_SOCKS4_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SOCKS4_PROXY, GSocks4ProxyClass)) +#define G_IS_SOCKS4_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SOCKS4_PROXY)) +#define G_IS_SOCKS4_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKS4_PROXY)) +#define G_SOCKS4_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKS4_PROXY, GSocks4ProxyClass)) + +typedef struct _GSocks4Proxy GSocks4Proxy; +typedef struct _GSocks4ProxyClass GSocks4ProxyClass; + +GType _g_socks4_proxy_get_type (void); + +G_END_DECLS + +#endif /* __SOCKS5_PROXY_H__ */ diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c new file mode 100644 index 0000000..9d9055f --- /dev/null +++ b/gio/gsocks5proxy.c @@ -0,0 +1,1043 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008, 2010 Collabora, Ltd. + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Youness Alaoui + */ + +#include "config.h" + +#include "gsocks5proxy.h" + +#include + +#include "giomodule.h" +#include "giomodule-priv.h" +#include "giostream.h" +#include "ginetaddress.h" +#include "ginputstream.h" +#include "glibintl.h" +#include "goutputstream.h" +#include "gproxy.h" +#include "gproxyaddress.h" +#include "gtask.h" + +#define SOCKS5_VERSION 0x05 + +#define SOCKS5_CMD_CONNECT 0x01 +#define SOCKS5_CMD_BIND 0x02 +#define SOCKS5_CMD_UDP_ASSOCIATE 0x03 + +#define SOCKS5_ATYP_IPV4 0x01 +#define SOCKS5_ATYP_DOMAINNAME 0x03 +#define SOCKS5_ATYP_IPV6 0x04 + +#define SOCKS5_AUTH_VERSION 0x01 + +#define SOCKS5_AUTH_NONE 0x00 +#define SOCKS5_AUTH_GSSAPI 0x01 +#define SOCKS5_AUTH_USR_PASS 0x02 +#define SOCKS5_AUTH_NO_ACCEPT 0xff + +#define SOCKS5_MAX_LEN 255 +#define SOCKS5_RESERVED 0x00 + +#define SOCKS5_REP_SUCCEEDED 0x00 +#define SOCKS5_REP_SRV_FAILURE 0x01 +#define SOCKS5_REP_NOT_ALLOWED 0x02 +#define SOCKS5_REP_NET_UNREACH 0x03 +#define SOCKS5_REP_HOST_UNREACH 0x04 +#define SOCKS5_REP_REFUSED 0x05 +#define SOCKS5_REP_TTL_EXPIRED 0x06 +#define SOCKS5_REP_CMD_NOT_SUP 0x07 +#define SOCKS5_REP_ATYPE_NOT_SUP 0x08 + + +struct _GSocks5Proxy +{ + GObject parent; +}; + +struct _GSocks5ProxyClass +{ + GObjectClass parent_class; +}; + +static void g_socks5_proxy_iface_init (GProxyInterface *proxy_iface); + +#define g_socks5_proxy_get_type _g_socks5_proxy_get_type +G_DEFINE_TYPE_WITH_CODE (GSocks5Proxy, g_socks5_proxy, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, + g_socks5_proxy_iface_init) + _g_io_modules_ensure_extension_points_registered (); + g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, + g_define_type_id, + "socks5", + 0)) + +static void +g_socks5_proxy_finalize (GObject *object) +{ + /* must chain up */ + G_OBJECT_CLASS (g_socks5_proxy_parent_class)->finalize (object); +} + +static void +g_socks5_proxy_init (GSocks5Proxy *proxy) +{ +} + +/* + * +----+----------+----------+ + * |VER | NMETHODS | METHODS | + * +----+----------+----------+ + * | 1 | 1 | 1 to 255 | + * +----+----------+----------+ + */ +#define SOCKS5_NEGO_MSG_LEN 4 +static gint +set_nego_msg (guint8 *msg, gboolean has_auth) +{ + gint len = 3; + + msg[0] = SOCKS5_VERSION; + msg[1] = 0x01; /* number of methods supported */ + msg[2] = SOCKS5_AUTH_NONE; + + /* add support for authentication method */ + if (has_auth) + { + msg[1] = 0x02; /* number of methods supported */ + msg[3] = SOCKS5_AUTH_USR_PASS; + len++; + } + + return len; +} + + +/* + * +----+--------+ + * |VER | METHOD | + * +----+--------+ + * | 1 | 1 | + * +----+--------+ + */ +#define SOCKS5_NEGO_REP_LEN 2 +static gboolean +parse_nego_reply (const guint8 *data, + gboolean has_auth, + gboolean *must_auth, + GError **error) +{ + if (data[0] != SOCKS5_VERSION) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("The server is not a SOCKSv5 proxy server.")); + return FALSE; + } + + switch (data[1]) + { + case SOCKS5_AUTH_NONE: + *must_auth = FALSE; + break; + + case SOCKS5_AUTH_USR_PASS: + if (!has_auth) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_NEED_AUTH, + _("The SOCKSv5 proxy requires authentication.")); + return FALSE; + } + *must_auth = TRUE; + break; + + case SOCKS5_AUTH_GSSAPI: + case SOCKS5_AUTH_NO_ACCEPT: + default: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_AUTH_FAILED, + _("The SOCKSv5 proxy requires an authentication " + "method that is not supported by GLib.")); + return FALSE; + break; + } + + return TRUE; +} + +#define SOCKS5_AUTH_MSG_LEN 515 +static gint +set_auth_msg (guint8 *msg, + const gchar *username, + const gchar *password, + GError **error) +{ + gint len = 0; + gint ulen = 0; /* username length */ + gint plen = 0; /* Password length */ + + if (username) + ulen = strlen (username); + + if (password) + plen = strlen (password); + + if (ulen > SOCKS5_MAX_LEN || plen > SOCKS5_MAX_LEN) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Username or password is too long for SOCKSv5 " + "protocol.")); + return FALSE; + } + + msg[len++] = SOCKS5_AUTH_VERSION; + msg[len++] = ulen; + + if (ulen > 0) + memcpy (msg + len, username, ulen); + + len += ulen; + msg[len++] = plen; + + if (plen > 0) + memcpy (msg + len, password, plen); + + len += plen; + + return len; +} + + +static gboolean +check_auth_status (const guint8 *data, GError **error) +{ + if (data[0] != SOCKS5_VERSION + || data[1] != SOCKS5_REP_SUCCEEDED) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_AUTH_FAILED, + _("SOCKSv5 authentication failed due to wrong " + "username or password.")); + return FALSE; + } + return TRUE; +} + +/* + * +----+-----+-------+------+----------+----------+ + * |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | + * +----+-----+-------+------+----------+----------+ + * | 1 | 1 | X'00' | 1 | Variable | 2 | + * +----+-----+-------+------+----------+----------+ + * DST.ADDR is a string with first byte being the size. So DST.ADDR may not be + * longer then 256 bytes. + */ +#define SOCKS5_CONN_MSG_LEN 262 +static gint +set_connect_msg (guint8 *msg, + const gchar *hostname, + guint16 port, + GError **error) +{ + guint len = 0; + + msg[len++] = SOCKS5_VERSION; + msg[len++] = SOCKS5_CMD_CONNECT; + msg[len++] = SOCKS5_RESERVED; + + if (g_hostname_is_ip_address (hostname)) + { + GInetAddress *addr = g_inet_address_new_from_string (hostname); + gsize addr_len = g_inet_address_get_native_size (addr); + + /* We are cheating for simplicity, here's the logic: + * 1 = IPV4 = 4 bytes / 4 + * 4 = IPV6 = 16 bytes / 4 */ + msg[len++] = addr_len / 4; + memcpy (msg + len, g_inet_address_to_bytes (addr), addr_len); + len += addr_len; + + g_object_unref (addr); + } + else + { + gsize host_len = strlen (hostname); + + if (host_len > SOCKS5_MAX_LEN) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Hostname '%s' is too long for SOCKSv5 protocol"), + hostname); + return -1; + } + + msg[len++] = SOCKS5_ATYP_DOMAINNAME; + msg[len++] = (guint8) host_len; + memcpy (msg + len, hostname, host_len); + len += host_len; + } + + { + guint16 hp = g_htons (port); + memcpy (msg + len, &hp, 2); + len += 2; + } + + return len; +} + +/* + * +----+-----+-------+------+----------+----------+ + * |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | + * +----+-----+-------+------+----------+----------+ + * | 1 | 1 | X'00' | 1 | Variable | 2 | + * +----+-----+-------+------+----------+----------+ + * This reply need to be read by small part to determin size. Buffer + * size is determined in function of the biggest part to read. + * + * The parser only requires 4 bytes. + */ +#define SOCKS5_CONN_REP_LEN 255 +static gboolean +parse_connect_reply (const guint8 *data, gint *atype, GError **error) +{ + if (data[0] != SOCKS5_VERSION) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("The server is not a SOCKSv5 proxy server.")); + return FALSE; + } + + switch (data[1]) + { + case SOCKS5_REP_SUCCEEDED: + if (data[2] != SOCKS5_RESERVED) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("The server is not a SOCKSv5 proxy server.")); + return FALSE; + } + + switch (data[3]) + { + case SOCKS5_ATYP_IPV4: + case SOCKS5_ATYP_IPV6: + case SOCKS5_ATYP_DOMAINNAME: + *atype = data[3]; + break; + + default: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("The SOCKSv5 proxy server uses unknown address type.")); + return FALSE; + } + break; + + case SOCKS5_REP_SRV_FAILURE: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Internal SOCKSv5 proxy server error.")); + return FALSE; + break; + + case SOCKS5_REP_NOT_ALLOWED: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_NOT_ALLOWED, + _("SOCKSv5 connection not allowed by ruleset.")); + return FALSE; + break; + + case SOCKS5_REP_TTL_EXPIRED: + case SOCKS5_REP_HOST_UNREACH: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE, + _("Host unreachable through SOCKSv5 server.")); + return FALSE; + break; + + case SOCKS5_REP_NET_UNREACH: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NETWORK_UNREACHABLE, + _("Network unreachable through SOCKSv5 proxy.")); + return FALSE; + break; + + case SOCKS5_REP_REFUSED: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CONNECTION_REFUSED, + _("Connection refused through SOCKSv5 proxy.")); + return FALSE; + break; + + case SOCKS5_REP_CMD_NOT_SUP: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("SOCKSv5 proxy does not support 'connect' command.")); + return FALSE; + break; + + case SOCKS5_REP_ATYPE_NOT_SUP: + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("SOCKSv5 proxy does not support provided address type.")); + return FALSE; + break; + + default: /* Unknown error */ + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Unknown SOCKSv5 proxy error.")); + return FALSE; + break; + } + + return TRUE; +} + +static GIOStream * +g_socks5_proxy_connect (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error) +{ + gboolean has_auth; + GInputStream *in; + GOutputStream *out; + const gchar *hostname; + guint16 port; + const gchar *username; + const gchar *password; + + hostname = g_proxy_address_get_destination_hostname (proxy_address); + port = g_proxy_address_get_destination_port (proxy_address); + username = g_proxy_address_get_username (proxy_address); + password = g_proxy_address_get_password (proxy_address); + + has_auth = username || password; + + in = g_io_stream_get_input_stream (io_stream); + out = g_io_stream_get_output_stream (io_stream); + + /* Send SOCKS5 handshake */ + { + guint8 msg[SOCKS5_NEGO_MSG_LEN]; + gint len; + + len = set_nego_msg (msg, has_auth); + + if (!g_output_stream_write_all (out, msg, len, NULL, + cancellable, error)) + goto error; + } + + /* Receive SOCKS5 response and reply with authentication if required */ + { + guint8 data[SOCKS5_NEGO_REP_LEN]; + gboolean must_auth = FALSE; + + if (!g_input_stream_read_all (in, data, sizeof (data), NULL, + cancellable, error)) + goto error; + + if (!parse_nego_reply (data, has_auth, &must_auth, error)) + goto error; + + if (must_auth) + { + guint8 msg[SOCKS5_AUTH_MSG_LEN]; + gint len; + + len = set_auth_msg (msg, username, password, error); + + if (len < 0) + goto error; + + if (!g_output_stream_write_all (out, msg, len, NULL, + cancellable, error)) + goto error; + + if (!g_input_stream_read_all (in, data, sizeof (data), NULL, + cancellable, error)) + goto error; + + if (!check_auth_status (data, error)) + goto error; + } + } + + /* Send SOCKS5 connection request */ + { + guint8 msg[SOCKS5_CONN_MSG_LEN]; + gint len; + + len = set_connect_msg (msg, hostname, port, error); + + if (len < 0) + goto error; + + if (!g_output_stream_write_all (out, msg, len, NULL, + cancellable, error)) + goto error; + } + + /* Read SOCKS5 response */ + { + guint8 data[SOCKS5_CONN_REP_LEN]; + gint atype; + + if (!g_input_stream_read_all (in, data, 4, NULL, + cancellable, error)) + goto error; + + if (!parse_connect_reply (data, &atype, error)) + goto error; + + switch (atype) + { + case SOCKS5_ATYP_IPV4: + if (!g_input_stream_read_all (in, data, 6, NULL, + cancellable, error)) + goto error; + break; + + case SOCKS5_ATYP_IPV6: + if (!g_input_stream_read_all (in, data, 18, NULL, + cancellable, error)) + goto error; + break; + + case SOCKS5_ATYP_DOMAINNAME: + if (!g_input_stream_read_all (in, data, 1, NULL, + cancellable, error)) + goto error; + if (!g_input_stream_read_all (in, data, data[0] + 2, NULL, + cancellable, error)) + goto error; + break; + } + } + + return g_object_ref (io_stream); + +error: + return NULL; +} + + +typedef struct +{ + GIOStream *io_stream; + gchar *hostname; + guint16 port; + gchar *username; + gchar *password; + guint8 *buffer; + gssize length; + gssize offset; +} ConnectAsyncData; + +static void nego_msg_write_cb (GObject *source, + GAsyncResult *res, + gpointer user_data); +static void nego_reply_read_cb (GObject *source, + GAsyncResult *res, + gpointer user_data); +static void auth_msg_write_cb (GObject *source, + GAsyncResult *res, + gpointer user_data); +static void auth_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); +static void send_connect_msg (GTask *task); +static void connect_msg_write_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); +static void connect_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); +static void connect_addr_len_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); +static void connect_addr_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data); + +static void +free_connect_data (ConnectAsyncData *data) +{ + g_object_unref (data->io_stream); + + g_free (data->hostname); + g_free (data->username); + g_free (data->password); + g_free (data->buffer); + + g_slice_free (ConnectAsyncData, data); +} + +static void +do_read (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) +{ + GInputStream *in; + in = g_io_stream_get_input_stream (data->io_stream); + g_input_stream_read_async (in, + data->buffer + data->offset, + data->length - data->offset, + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); +} + +static void +do_write (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) +{ + GOutputStream *out; + out = g_io_stream_get_output_stream (data->io_stream); + g_output_stream_write_async (out, + data->buffer + data->offset, + data->length - data->offset, + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); +} + +static void +g_socks5_proxy_connect_async (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + ConnectAsyncData *data; + + data = g_slice_new0 (ConnectAsyncData); + data->io_stream = g_object_ref (io_stream); + + task = g_task_new (proxy, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify) free_connect_data); + + g_object_get (G_OBJECT (proxy_address), + "destination-hostname", &data->hostname, + "destination-port", &data->port, + "username", &data->username, + "password", &data->password, + NULL); + + data->buffer = g_malloc0 (SOCKS5_NEGO_MSG_LEN); + data->length = set_nego_msg (data->buffer, + data->username || data->password); + data->offset = 0; + + do_write (nego_msg_write_cb, task, data); +} + + +static void +nego_msg_write_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize written; + + written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), + res, &error); + + if (written < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += written; + + if (data->offset == data->length) + { + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS5_NEGO_REP_LEN); + data->length = SOCKS5_NEGO_REP_LEN; + data->offset = 0; + + do_read (nego_reply_read_cb, task, data); + } + else + { + do_write (nego_msg_write_cb, task, data); + } +} + +static void +nego_reply_read_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + res, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += read; + + if (data->offset == data->length) + { + GError *error; + gboolean must_auth = FALSE; + gboolean has_auth = data->username || data->password; + + if (!parse_nego_reply (data->buffer, has_auth, &must_auth, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + if (must_auth) + { + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS5_AUTH_MSG_LEN); + data->length = set_auth_msg (data->buffer, + data->username, + data->password, + &error); + data->offset = 0; + + if (data->length < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + do_write (auth_msg_write_cb, task, data); + } + else + { + send_connect_msg (task); + } + } + else + { + do_read (nego_reply_read_cb, task, data); + } +} + +static void +auth_msg_write_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize written; + + written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), + result, &error); + + if (written < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += written; + + if (data->offset == data->length) + { + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS5_NEGO_REP_LEN); + data->length = SOCKS5_NEGO_REP_LEN; + data->offset = 0; + + do_read (auth_reply_read_cb, task, data); + } + else + { + do_write (auth_msg_write_cb, task, data); + } +} + +static void +auth_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + result, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += read; + + if (data->offset == data->length) + { + if (!check_auth_status (data->buffer, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + send_connect_msg (task); + } + else + { + do_read (auth_reply_read_cb, task, data); + } +} + +static void +send_connect_msg (GTask *task) +{ + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS5_CONN_MSG_LEN); + data->length = set_connect_msg (data->buffer, + data->hostname, + data->port, + &error); + data->offset = 0; + + if (data->length < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + do_write (connect_msg_write_cb, task, data); +} + +static void +connect_msg_write_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize written; + + written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), + result, &error); + + if (written < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += written; + + if (data->offset == data->length) + { + g_free (data->buffer); + + data->buffer = g_malloc0 (SOCKS5_CONN_REP_LEN); + data->length = 4; + data->offset = 0; + + do_read (connect_reply_read_cb, task, data); + } + else + { + do_write (connect_msg_write_cb, task, data); + } +} + +static void +connect_reply_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + result, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += read; + + if (data->offset == data->length) + { + gint atype; + + if (!parse_connect_reply (data->buffer, &atype, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + switch (atype) + { + case SOCKS5_ATYP_IPV4: + data->length = 6; + data->offset = 0; + do_read (connect_addr_read_cb, task, data); + break; + + case SOCKS5_ATYP_IPV6: + data->length = 18; + data->offset = 0; + do_read (connect_addr_read_cb, task, data); + break; + + case SOCKS5_ATYP_DOMAINNAME: + data->length = 1; + data->offset = 0; + do_read (connect_addr_len_read_cb, task, data); + break; + } + } + else + { + do_read (connect_reply_read_cb, task, data); + } +} + +static void +connect_addr_len_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + result, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->length = data->buffer[0] + 2; + data->offset = 0; + + do_read (connect_addr_read_cb, task, data); +} + +static void +connect_addr_read_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); + GError *error = NULL; + gssize read; + + read = g_input_stream_read_finish (G_INPUT_STREAM (source), + result, &error); + + if (read < 0) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + data->offset += read; + + if (data->offset == data->length) + { + g_task_return_pointer (task, g_object_ref (data->io_stream), g_object_unref); + g_object_unref (task); + return; + } + else + { + do_read (connect_reply_read_cb, task, data); + } +} + +static GIOStream * +g_socks5_proxy_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static gboolean +g_socks5_proxy_supports_hostname (GProxy *proxy) +{ + return TRUE; +} + +static void +g_socks5_proxy_class_init (GSocks5ProxyClass *class) +{ + GObjectClass *object_class; + + object_class = (GObjectClass *) class; + object_class->finalize = g_socks5_proxy_finalize; +} + +static void +g_socks5_proxy_iface_init (GProxyInterface *proxy_iface) +{ + proxy_iface->connect = g_socks5_proxy_connect; + proxy_iface->connect_async = g_socks5_proxy_connect_async; + proxy_iface->connect_finish = g_socks5_proxy_connect_finish; + proxy_iface->supports_hostname = g_socks5_proxy_supports_hostname; +} diff --git a/gio/gsocks5proxy.h b/gio/gsocks5proxy.h new file mode 100644 index 0000000..c55d603 --- /dev/null +++ b/gio/gsocks5proxy.h @@ -0,0 +1,48 @@ + /* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008, 2010 Collabora, Ltd. + * Copyright (C) 2008 Nokia Corporation. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Youness Alaoui + */ + +#ifndef __G_SOCKS5_PROXY_H__ +#define __G_SOCKS5_PROXY_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_SOCKS5_PROXY (_g_socks5_proxy_get_type ()) +#define G_SOCKS5_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_SOCKS5_PROXY, GSocks5Proxy)) +#define G_SOCKS5_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_SOCKS5_PROXY, GSocks5ProxyClass)) +#define G_IS_SOCKS5_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_SOCKS5_PROXY)) +#define G_IS_SOCKS5_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKS5_PROXY)) +#define G_SOCKS5_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKS5_PROXY, GSocks5ProxyClass)) + +typedef struct _GSocks5Proxy GSocks5Proxy; +typedef struct _GSocks5ProxyClass GSocks5ProxyClass; + +GType _g_socks5_proxy_get_type (void); + +G_END_DECLS + +#endif /* __SOCKS5_PROXY_H__ */ diff --git a/gio/gsrvtarget.c b/gio/gsrvtarget.c new file mode 100644 index 0000000..3422750 --- /dev/null +++ b/gio/gsrvtarget.c @@ -0,0 +1,314 @@ +/* -*- 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 + + +/** + * 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. + */ + +G_DEFINE_BOXED_TYPE (GSrvTarget, g_srv_target, + g_srv_target_copy, g_srv_target_free) + +/** + * 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; +} + +static 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: (skip) + * @targets: a #GList of #GSrvTarget + * + * Sorts @targets in place according to the algorithm in RFC 2782. + * + * Return value: (transfer full): 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; +} diff --git a/gio/gsrvtarget.h b/gio/gsrvtarget.h new file mode 100644 index 0000000..6135ef2 --- /dev/null +++ b/gio/gsrvtarget.h @@ -0,0 +1,61 @@ +/* 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_SRV_TARGET_H__ +#define __G_SRV_TARGET_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +GType g_srv_target_get_type (void) G_GNUC_CONST; +#define G_TYPE_SRV_TARGET (g_srv_target_get_type ()) + +GLIB_AVAILABLE_IN_ALL +GSrvTarget *g_srv_target_new (const gchar *hostname, + guint16 port, + guint16 priority, + guint16 weight); +GLIB_AVAILABLE_IN_ALL +GSrvTarget *g_srv_target_copy (GSrvTarget *target); +GLIB_AVAILABLE_IN_ALL +void g_srv_target_free (GSrvTarget *target); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_srv_target_get_hostname (GSrvTarget *target); +GLIB_AVAILABLE_IN_ALL +guint16 g_srv_target_get_port (GSrvTarget *target); +GLIB_AVAILABLE_IN_ALL +guint16 g_srv_target_get_priority (GSrvTarget *target); +GLIB_AVAILABLE_IN_ALL +guint16 g_srv_target_get_weight (GSrvTarget *target); + +GLIB_AVAILABLE_IN_ALL +GList *g_srv_target_list_sort (GList *targets); + +G_END_DECLS + +#endif /* __G_SRV_TARGET_H__ */ + diff --git a/gio/gtask.c b/gio/gtask.c new file mode 100644 index 0000000..bdef1f4 --- /dev/null +++ b/gio/gtask.c @@ -0,0 +1,1843 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "gtask.h" + +#include "gasyncresult.h" +#include "gcancellable.h" + +/** + * SECTION:gtask + * @short_description: Cancellable synchronous or asynchronous task and result + * @include: gio/gio.h + * @see_also: #GAsyncResult + * + * + * A #GTask represents and manages a cancellable "task". + * + * + * Asynchronous operations + * + * The most common usage of #GTask is as a #GAsyncResult, to + * manage data during an asynchronous operation. You call + * g_task_new() in the "start" method, followed by + * g_task_set_task_data() and the like if you need to keep some + * additional data associated with the task, and then pass the + * task object around through your asynchronous operation. + * Eventually, you will call a method such as + * g_task_return_pointer() or g_task_return_error(), which will + * save the value you give it and then invoke the task's callback + * function (waiting until the next next iteration of the main + * loop first, if necessary). The caller will pass the #GTask back + * to the operation's finish function (as a #GAsyncResult), and + * you can use g_task_propagate_pointer() or the like to extract + * the return value. + * + * GTask as a GAsyncResult + * + * typedef struct { + * CakeFrostingType frosting; + * char *message; + * } DecorationData; + * + * static void + * decoration_data_free (DecorationData *decoration) + * { + * g_free (decoration->message); + * g_slice_free (DecorationData, decoration); + * } + * + * static void + * baked_cb (Cake *cake, + * gpointer user_data) + * { + * GTask *task = user_data; + * DecorationData *decoration = g_task_get_task_data (task); + * GError *error = NULL; + * + * if (cake == NULL) + * { + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, + * "Go to the supermarket"); + * g_object_unref (task); + * return; + * } + * + * if (!cake_decorate (cake, decoration->frosting, decoration->message, &error)) + * { + * g_object_unref (cake); + * /* g_task_return_error() takes ownership of error */ + * g_task_return_error (task, error); + * g_object_unref (task); + * return; + * } + * + * g_task_return_pointer (result, cake, g_object_unref); + * g_object_unref (task); + * } + * + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * GTask *task; + * DecorationData *decoration; + * Cake *cake; + * + * task = g_task_new (self, cancellable, callback, user_data); + * if (radius < 3) + * { + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_TOO_SMALL, + * "%ucm radius cakes are silly", + * radius); + * g_object_unref (task); + * return; + * } + * + * cake = _baker_get_cached_cake (self, radius, flavor, frosting, message); + * if (cake != NULL) + * { + * /* _baker_get_cached_cake() returns a reffed cake */ + * g_task_return_pointer (task, cake, g_object_unref); + * g_object_unref (task); + * return; + * } + * + * decoration = g_slice_new (DecorationData); + * decoration->frosting = frosting; + * decoration->message = g_strdup (message); + * g_task_set_task_data (task, decoration, (GDestroyNotify) decoration_data_free); + * + * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); + * } + * + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * + * + * + * + * Chained asynchronous operations + * + * #GTask also tries to simplify asynchronous operations that + * internally chain together several smaller asynchronous + * operations. g_task_get_cancellable(), g_task_get_context(), and + * g_task_get_priority() allow you to get back the task's + * #GCancellable, #GMainContext, and I/O priority when starting a new + * subtask, so you don't have to keep track of them yourself. + * g_task_attach_source() simplifies the case of waiting for a + * source to fire (automatically using the correct #GMainContext + * and priority). + * + * Chained asynchronous operations + * + * typedef struct { + * Cake *cake; + * CakeFrostingType frosting; + * char *message; + * } BakingData; + * + * static void + * decoration_data_free (BakingData *bd) + * { + * if (bd->cake) + * g_object_unref (bd->cake); + * g_free (bd->message); + * g_slice_free (BakingData, bd); + * } + * + * static void + * decorated_cb (Cake *cake, + * GAsyncResult *result, + * gpointer user_data) + * { + * GTask *task = user_data; + * GError *error = NULL; + * + * if (!cake_decorate_finish (cake, result, &error)) + * { + * g_object_unref (cake); + * g_task_return_error (task, error); + * g_object_unref (task); + * return; + * } + * + * /* baking_data_free() will drop its ref on the cake, so + * * we have to take another here to give to the caller. + * */ + * g_task_return_pointer (result, g_object_ref (cake), g_object_unref); + * g_object_unref (task); + * } + * + * static void + * decorator_ready (gpointer user_data) + * { + * GTask *task = user_data; + * BakingData *bd = g_task_get_task_data (task); + * + * cake_decorate_async (bd->cake, bd->frosting, bd->message, + * g_task_get_cancellable (task), + * decorated_cb, task); + * } + * + * static void + * baked_cb (Cake *cake, + * gpointer user_data) + * { + * GTask *task = user_data; + * BakingData *bd = g_task_get_task_data (task); + * GError *error = NULL; + * + * if (cake == NULL) + * { + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, + * "Go to the supermarket"); + * g_object_unref (task); + * return; + * } + * + * bd->cake = cake; + * + * /* Bail out now if the user has already cancelled */ + * if (g_task_return_error_if_cancelled (g_task_get_cancellable (task))) + * { + * g_object_unref (task); + * return; + * } + * + * if (cake_decorator_available (cake)) + * decorator_ready (task); + * else + * { + * GSource *source; + * + * source = cake_decorator_wait_source_new (cake); + * /* Attach @source to @task's GMainContext and have it call + * * decorator_ready() when it is ready. + * */ + * g_task_attach_source (task, source, + * G_CALLBACK (decorator_ready)); + * g_source_unref (source); + * } + * } + * + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * gint priority, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * GTask *task; + * BakingData *bd; + * + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_priority (task, priority); + * + * bd = g_slice_new0 (BakingData); + * bd->frosting = frosting; + * bd->message = g_strdup (message); + * g_task_set_task_data (task, bd, (GDestroyNotify) baking_data_free); + * + * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); + * } + * + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * + * + * + * + * Asynchronous operations from synchronous ones + * + * You can use g_task_run_in_thread() to turn a synchronous + * operation into an asynchronous one, by running it in a thread + * which will then dispatch the result back to the caller's + * #GMainContext when it completes. + * + * g_task_run_in_thread() + * + * typedef struct { + * guint radius; + * CakeFlavor flavor; + * CakeFrostingType frosting; + * char *message; + * } CakeData; + * + * static void + * cake_data_free (CakeData *cake_data) + * { + * g_free (cake_data->message); + * g_slice_free (CakeData, cake_data); + * } + * + * static void + * bake_cake_thread (GTask *task, + * gpointer source_object, + * gpointer task_data, + * GCancellable *cancellable) + * { + * Baker *self = source_object; + * CakeData *cake_data = task_data; + * Cake *cake; + * GError *error = NULL; + * + * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, + * cake_data->frosting, cake_data->message, + * cancellable, &error); + * if (cake) + * g_task_return_pointer (task, cake, g_object_unref); + * else + * g_task_return_error (task, error); + * } + * + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * CakeData *cake_data; + * GTask *task; + * + * cake_data = g_slice_new (CakeData); + * cake_data->radius = radius; + * cake_data->flavor = flavor; + * cake_data->frosting = frosting; + * cake_data->message = g_strdup (message); + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_run_in_thread (task, bake_cake_thread); + * } + * + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * + * + * + * + * Adding cancellability to uncancellable tasks + * + * Finally, g_task_run_in_thread() and g_task_run_in_thread_sync() + * can be used to turn an uncancellable operation into a + * cancellable one. If you call g_task_set_return_on_cancel(), + * passing %TRUE, then if the task's #GCancellable is cancelled, + * it will return control back to the caller immediately, while + * allowing the task thread to continue running in the background + * (and simply discarding its result when it finally does finish). + * Provided that the task thread is careful about how it uses + * locks and other externally-visible resources, this allows you + * to make "GLib-friendly" asynchronous and cancellable + * synchronous variants of blocking APIs. + * + * g_task_set_return_on_cancel() + * + * static void + * bake_cake_thread (GTask *task, + * gpointer source_object, + * gpointer task_data, + * GCancellable *cancellable) + * { + * Baker *self = source_object; + * CakeData *cake_data = task_data; + * Cake *cake; + * GError *error = NULL; + * + * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, + * cake_data->frosting, cake_data->message, + * &error); + * if (error) + * { + * g_task_return_error (task, error); + * return; + * } + * + * /* If the task has already been cancelled, then we don't + * * want to add the cake to the cake cache. Likewise, we don't + * * want to have the task get cancelled in the middle of + * * updating the cache. g_task_set_return_on_cancel() will + * * return %TRUE here if it managed to disable return-on-cancel, + * * or %FALSE if the task was cancelled before it could. + * */ + * if (g_task_set_return_on_cancel (task, FALSE)) + * { + * /* If the caller cancels at this point, their + * * GAsyncReadyCallback won't be invoked until we return, + * * so we don't have to worry that this code will run at + * * the same time as that code does. But if there were + * * other functions that might look at the cake cache, + * * then we'd probably need a GMutex here as well. + * */ + * baker_add_cake_to_cache (baker, cake); + * g_task_return_pointer (task, cake, g_object_unref); + * } + * } + * + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * CakeData *cake_data; + * GTask *task; + * + * cake_data = g_slice_new (CakeData); + * /* ... */ + * + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_set_return_on_cancel (task, TRUE); + * g_task_run_in_thread (task, bake_cake_thread); + * } + * + * Cake * + * baker_bake_cake_sync (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GError **error) + * { + * CakeData *cake_data; + * GTask *task; + * Cake *cake; + * + * cake_data = g_slice_new (CakeData); + * /* ... */ + * + * task = g_task_new (self, cancellable, NULL, NULL); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_set_return_on_cancel (task, TRUE); + * g_task_run_in_thread_sync (task, bake_cake_thread); + * + * cake = g_task_propagate_pointer (task, error); + * g_object_unref (task); + * return cake; + * } + * + * + * + * + * Porting from <literal>GSimpleAsyncResult</literal> + * + * #GTask's API attempts to be simpler than #GSimpleAsyncResult's + * in several ways: + * + * + * + * You can save task-specific data with g_task_set_task_data(), and + * retrieve it later with g_task_get_task_data(). This replaces the + * abuse of g_simple_async_result_set_op_res_gpointer() for the same + * purpose with #GSimpleAsyncResult. + * + * + * In addition to the task data, #GTask also keeps track of the + * priority, #GCancellable, and + * #GMainContext associated with the task, so tasks that consist of + * a chain of simpler asynchronous operations will have easy access + * to those values when starting each sub-task. + * + * + * g_task_return_error_if_cancelled() provides simplified + * handling for cancellation. In addition, cancellation + * overrides any other #GTask return value by default, like + * #GSimpleAsyncResult does when + * g_simple_async_result_set_check_cancellable() is called. + * (You can use g_task_set_check_cancellable() to turn off that + * behavior.) On the other hand, g_task_run_in_thread() + * guarantees that it will always run your + * task_func, even if the task's #GCancellable + * is already cancelled before the task gets a chance to run; + * you can start your task_func with a + * g_task_return_error_if_cancelled() check if you need the + * old behavior. + * + * + * The "return" methods (eg, g_task_return_pointer()) + * automatically cause the task to be "completed" as well, and + * there is no need to worry about the "complete" vs "complete + * in idle" distinction. (#GTask automatically figures out + * whether the task's callback can be invoked directly, or + * if it needs to be sent to another #GMainContext, or delayed + * until the next iteration of the current #GMainContext.) + * + * + * The "finish" functions for #GTask-based operations are generally + * much simpler than #GSimpleAsyncResult ones, normally consisting + * of only a single call to g_task_propagate_pointer() or the like. + * Since g_task_propagate_pointer() "steals" the return value from + * the #GTask, it is not necessary to juggle pointers around to + * prevent it from being freed twice. + * + * + * With #GSimpleAsyncResult, it was common to call + * g_simple_async_result_propagate_error() from the + * _finish() wrapper function, and have + * virtual method implementations only deal with successful + * returns. This behavior is deprecated, because it makes it + * difficult for a subclass to chain to a parent class's async + * methods. Instead, the wrapper function should just be a + * simple wrapper, and the virtual method should call an + * appropriate g_task_propagate_ function. + * Note that wrapper methods can now use + * g_async_result_legacy_propagate_error() to do old-style + * #GSimpleAsyncResult error-returning behavior, and + * g_async_result_is_tagged() to check if a result is tagged as + * having come from the _async() wrapper + * function (for "short-circuit" results, such as when passing + * 0 to g_input_stream_read_async()). + * + * + * + */ + +/** + * GTask: + * + * The opaque object representing a synchronous or asynchronous task + * and its result. + */ + +struct _GTask { + GObject parent_instance; + + gpointer source_object; + gpointer source_tag; + + gpointer task_data; + GDestroyNotify task_data_destroy; + + GMainContext *context; + guint64 creation_time; + gint priority; + GCancellable *cancellable; + gboolean check_cancellable; + + GAsyncReadyCallback callback; + gpointer callback_data; + + GTaskThreadFunc task_func; + GMutex lock; + GCond cond; + gboolean return_on_cancel; + gboolean thread_cancelled; + gboolean synchronous; + gboolean thread_complete; + gboolean blocking_other_task; + + GError *error; + union { + gpointer pointer; + gssize size; + gboolean boolean; + } result; + GDestroyNotify result_destroy; + gboolean result_set; +}; + +#define G_TASK_IS_THREADED(task) ((task)->task_func != NULL) + +struct _GTaskClass +{ + GObjectClass parent_class; +}; + +static void g_task_thread_pool_resort (void); + +static void g_task_async_result_iface_init (GAsyncResultIface *iface); +static void g_task_thread_pool_init (void); + +G_DEFINE_TYPE_WITH_CODE (GTask, g_task, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, + g_task_async_result_iface_init); + g_task_thread_pool_init ();) + +static GThreadPool *task_pool; +static GMutex task_pool_mutex; +static GPrivate task_private = G_PRIVATE_INIT (NULL); + +static void +g_task_init (GTask *task) +{ + task->check_cancellable = TRUE; +} + +static void +g_task_finalize (GObject *object) +{ + GTask *task = G_TASK (object); + + g_clear_object (&task->source_object); + g_clear_object (&task->cancellable); + + if (task->context) + g_main_context_unref (task->context); + + if (task->task_data_destroy) + task->task_data_destroy (task->task_data); + + if (task->result_destroy && task->result.pointer) + task->result_destroy (task->result.pointer); + + if (G_TASK_IS_THREADED (task)) + { + g_mutex_clear (&task->lock); + g_cond_clear (&task->cond); + } + + G_OBJECT_CLASS (g_task_parent_class)->finalize (object); +} + +/** + * g_task_new: + * @source_object: (allow-none) (type GObject): the #GObject that owns + * this task, or %NULL. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback. + * @callback_data: (closure): user data passed to @callback. + * + * Creates a #GTask acting on @source_object, which will eventually be + * used to invoke @callback in the current thread-default main + * context. + * + * Call this in the "start" method of your asynchronous method, and + * pass the #GTask around throughout the asynchronous operation. You + * can use g_task_set_task_data() to attach task-specific data to the + * object, which you can retrieve later via g_task_get_task_data(). + * + * By default, if @cancellable is cancelled, then the return value of + * the task will always be %G_IO_ERROR_CANCELLED, even if the task had + * already completed before the cancellation. This allows for + * simplified handling in cases where cancellation may imply that + * other objects that the task depends on have been destroyed. If you + * do not want this behavior, you can use + * g_task_set_check_cancellable() to change it. + * + * Returns: a #GTask. + * + * Since: 2.36 + */ +GTask * +g_task_new (gpointer source_object, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer callback_data) +{ + GTask *task; + GSource *source; + + task = g_object_new (G_TYPE_TASK, NULL); + task->source_object = source_object ? g_object_ref (source_object) : NULL; + task->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + task->callback = callback; + task->callback_data = callback_data; + task->context = g_main_context_ref_thread_default (); + + source = g_main_current_source (); + if (source) + task->creation_time = g_source_get_time (source); + + return task; +} + +/** + * g_task_report_error: + * @source_object: (allow-none) (type GObject): the #GObject that owns + * this task, or %NULL. + * @callback: (scope async): a #GAsyncReadyCallback. + * @callback_data: (closure): user data passed to @callback. + * @source_tag: an opaque pointer indicating the source of this task + * @error: (transfer full): error to report + * + * Creates a #GTask and then immediately calls g_task_return_error() + * on it. Use this in the wrapper function of an asynchronous method + * when you want to avoid even calling the virtual method. You can + * then use g_async_result_is_tagged() in the finish method wrapper to + * check if the result there is tagged as having been created by the + * wrapper method, and deal with it appropriately if so. + * + * See also g_task_report_new_error(). + * + * Since: 2.36 + */ +void +g_task_report_error (gpointer source_object, + GAsyncReadyCallback callback, + gpointer callback_data, + gpointer source_tag, + GError *error) +{ + GTask *task; + + task = g_task_new (source_object, NULL, callback, callback_data); + g_task_set_source_tag (task, source_tag); + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_task_report_new_error: + * @source_object: (allow-none) (type GObject): the #GObject that owns + * this task, or %NULL. + * @callback: (scope async): a #GAsyncReadyCallback. + * @callback_data: (closure): user data passed to @callback. + * @source_tag: an opaque pointer indicating the source of this task + * @domain: a #GQuark. + * @code: an error code. + * @format: a string with format characters. + * @...: a list of values to insert into @format. + * + * Creates a #GTask and then immediately calls + * g_task_return_new_error() on it. Use this in the wrapper function + * of an asynchronous method when you want to avoid even calling the + * virtual method. You can then use g_async_result_is_tagged() in the + * finish method wrapper to check if the result there is tagged as + * having been created by the wrapper method, and deal with it + * appropriately if so. + * + * See also g_task_report_error(). + * + * Since: 2.36 + */ +void +g_task_report_new_error (gpointer source_object, + GAsyncReadyCallback callback, + gpointer callback_data, + gpointer source_tag, + GQuark domain, + gint code, + const char *format, + ...) +{ + GError *error; + va_list ap; + + va_start (ap, format); + error = g_error_new_valist (domain, code, format, ap); + va_end (ap); + + g_task_report_error (source_object, callback, callback_data, + source_tag, error); +} + +/** + * g_task_set_task_data: + * @task: the #GTask + * @task_data: (allow-none): task-specific data + * @task_data_destroy: (allow-none): #GDestroyNotify for @task_data + * + * Sets @task's task data (freeing the existing task data, if any). + * + * Since: 2.36 + */ +void +g_task_set_task_data (GTask *task, + gpointer task_data, + GDestroyNotify task_data_destroy) +{ + if (task->task_data_destroy) + task->task_data_destroy (task->task_data); + + task->task_data = task_data; + task->task_data_destroy = task_data_destroy; +} + +/** + * g_task_set_priority: + * @task: the #GTask + * @priority: the priority + * of the request. + * + * Sets @task's priority. If you do not call this, it will default to + * %G_PRIORITY_DEFAULT. + * + * This will affect the priority of #GSources created with + * g_task_attach_source() and the scheduling of tasks run in threads, + * and can also be explicitly retrieved later via + * g_task_get_priority(). + * + * Since: 2.36 + */ +void +g_task_set_priority (GTask *task, + gint priority) +{ + task->priority = priority; +} + +/** + * g_task_set_check_cancellable: + * @task: the #GTask + * @check_cancellable: whether #GTask will check the state of + * its #GCancellable for you. + * + * Sets or clears @task's check-cancellable flag. If this is %TRUE + * (the default), then g_task_propagate_pointer(), etc, and + * g_task_had_error() will check the task's #GCancellable first, and + * if it has been cancelled, then they will consider the task to have + * returned an "Operation was cancelled" error + * (%G_IO_ERROR_CANCELLED), regardless of any other error or return + * value the task may have had. + * + * If @check_cancellable is %FALSE, then the #GTask will not check the + * cancellable itself, and it is up to @task's owner to do this (eg, + * via g_task_return_error_if_cancelled()). + * + * If you are using g_task_set_return_on_cancel() as well, then + * you must leave check-cancellable set %TRUE. + * + * Since: 2.36 + */ +void +g_task_set_check_cancellable (GTask *task, + gboolean check_cancellable) +{ + g_return_if_fail (check_cancellable || !task->return_on_cancel); + + task->check_cancellable = check_cancellable; +} + +static void g_task_thread_complete (GTask *task); + +/** + * g_task_set_return_on_cancel: + * @task: the #GTask + * @return_on_cancel: whether the task returns automatically when + * it is cancelled. + * + * Sets or clears @task's return-on-cancel flag. This is only + * meaningful for tasks run via g_task_run_in_thread() or + * g_task_run_in_thread_sync(). + * + * If @return_on_cancel is %TRUE, then cancelling @task's + * #GCancellable will immediately cause it to return, as though the + * task's #GTaskThreadFunc had called + * g_task_return_error_if_cancelled() and then returned. + * + * This allows you to create a cancellable wrapper around an + * uninterruptable function. The #GTaskThreadFunc just needs to be + * careful that it does not modify any externally-visible state after + * it has been cancelled. To do that, the thread should call + * g_task_set_return_on_cancel() again to (atomically) set + * return-on-cancel %FALSE before making externally-visible changes; + * if the task gets cancelled before the return-on-cancel flag could + * be changed, g_task_set_return_on_cancel() will indicate this by + * returning %FALSE. + * + * You can disable and re-enable this flag multiple times if you wish. + * If the task's #GCancellable is cancelled while return-on-cancel is + * %FALSE, then calling g_task_set_return_on_cancel() to set it %TRUE + * again will cause the task to be cancelled at that point. + * + * If the task's #GCancellable is already cancelled before you call + * g_task_run_in_thread()/g_task_run_in_thread_sync(), then the + * #GTaskThreadFunc will still be run (for consistency), but the task + * will also be completed right away. + * + * Returns: %TRUE if @task's return-on-cancel flag was changed to + * match @return_on_cancel. %FALSE if @task has already been + * cancelled. + * + * Since: 2.36 + */ +gboolean +g_task_set_return_on_cancel (GTask *task, + gboolean return_on_cancel) +{ + g_return_val_if_fail (task->check_cancellable || !return_on_cancel, FALSE); + + if (!G_TASK_IS_THREADED (task)) + { + task->return_on_cancel = return_on_cancel; + return TRUE; + } + + g_mutex_lock (&task->lock); + if (task->thread_cancelled) + { + if (return_on_cancel && !task->return_on_cancel) + { + g_mutex_unlock (&task->lock); + g_task_thread_complete (task); + } + else + g_mutex_unlock (&task->lock); + return FALSE; + } + task->return_on_cancel = return_on_cancel; + g_mutex_unlock (&task->lock); + + return TRUE; +} + +/** + * g_task_set_source_tag: + * @task: the #GTask + * @source_tag: an opaque pointer indicating the source of this task + * + * Sets @task's source tag. You can use this to tag a task return + * value with a particular pointer (usually a pointer to the function + * doing the tagging) and then later check it using + * g_task_get_source_tag() (or g_async_result_is_tagged()) in the + * task's "finish" function, to figure out if the response came from a + * particular place. + * + * Since: 2.36 + */ +void +g_task_set_source_tag (GTask *task, + gpointer source_tag) +{ + task->source_tag = source_tag; +} + +/** + * g_task_get_source_object: + * @task: a #GTask + * + * Gets the source object from @task. Like + * g_async_result_get_source_object(), but does not ref the object. + * + * Returns: (transfer none) (type GObject): @task's source object, or %NULL + * + * Since: 2.36 + */ +gpointer +g_task_get_source_object (GTask *task) +{ + return task->source_object; +} + +static GObject * +g_task_ref_source_object (GAsyncResult *res) +{ + GTask *task = G_TASK (res); + + if (task->source_object) + return g_object_ref (task->source_object); + else + return NULL; +} + +/** + * g_task_get_task_data: + * @task: a #GTask + * + * Gets @task's task_data. + * + * Returns: (transfer none): @task's task_data. + * + * Since: 2.36 + */ +gpointer +g_task_get_task_data (GTask *task) +{ + return task->task_data; +} + +/** + * g_task_get_priority: + * @task: a #GTask + * + * Gets @task's priority + * + * Returns: @task's priority + * + * Since: 2.36 + */ +gint +g_task_get_priority (GTask *task) +{ + return task->priority; +} + +/** + * g_task_get_context: + * @task: a #GTask + * + * Gets the #GMainContext that @task will return its result in (that + * is, the context that was the thread-default main + * context at the point when @task was created). + * + * This will always return a non-%NULL value, even if the task's + * context is the default #GMainContext. + * + * Returns: (transfer none): @task's #GMainContext + * + * Since: 2.36 + */ +GMainContext * +g_task_get_context (GTask *task) +{ + return task->context; +} + +/** + * g_task_get_cancellable: + * @task: a #GTask + * + * Gets @task's #GCancellable + * + * Returns: (transfer none): @task's #GCancellable + * + * Since: 2.36 + */ +GCancellable * +g_task_get_cancellable (GTask *task) +{ + return task->cancellable; +} + +/** + * g_task_get_check_cancellable: + * @task: the #GTask + * + * Gets @task's check-cancellable flag. See + * g_task_set_check_cancellable() for more details. + * + * Since: 2.36 + */ +gboolean +g_task_get_check_cancellable (GTask *task) +{ + return task->check_cancellable; +} + +/** + * g_task_get_return_on_cancel: + * @task: the #GTask + * + * Gets @task's return-on-cancel flag. See + * g_task_set_return_on_cancel() for more details. + * + * Since: 2.36 + */ +gboolean +g_task_get_return_on_cancel (GTask *task) +{ + return task->return_on_cancel; +} + +/** + * g_task_get_source_tag: + * @task: a #GTask + * + * Gets @task's source tag. See g_task_set_source_tag(). + * + * Return value: (transfer none): @task's source tag + * + * Since: 2.36 + */ +gpointer +g_task_get_source_tag (GTask *task) +{ + return task->source_tag; +} + + +static void +g_task_return_now (GTask *task) +{ + g_main_context_push_thread_default (task->context); + task->callback (task->source_object, + G_ASYNC_RESULT (task), + task->callback_data); + g_main_context_pop_thread_default (task->context); +} + +static gboolean +complete_in_idle_cb (gpointer task) +{ + g_task_return_now (task); + g_object_unref (task); + return FALSE; +} + +typedef enum { + G_TASK_RETURN_SUCCESS, + G_TASK_RETURN_ERROR, + G_TASK_RETURN_FROM_THREAD +} GTaskReturnType; + +static void +g_task_return (GTask *task, + GTaskReturnType type) +{ + GSource *source; + + if (type == G_TASK_RETURN_SUCCESS) + task->result_set = TRUE; + + if (task->synchronous || !task->callback) + return; + + /* Normally we want to invoke the task's callback when its return + * value is set. But if the task is running in a thread, then we + * want to wait until after the task_func returns, to simplify + * locking/refcounting/etc. + */ + if (G_TASK_IS_THREADED (task) && type != G_TASK_RETURN_FROM_THREAD) + return; + + g_object_ref (task); + + /* See if we can complete the task immediately. First, we have to be + * running inside the task's thread/GMainContext. + */ + source = g_main_current_source (); + if (source && g_source_get_context (source) == task->context) + { + /* Second, we can only complete immediately if this is not the + * same iteration of the main loop that the task was created in. + */ + if (g_source_get_time (source) > task->creation_time) + { + g_task_return_now (task); + g_object_unref (task); + return; + } + } + + /* Otherwise, complete in the next iteration */ + source = g_idle_source_new (); + g_task_attach_source (task, source, complete_in_idle_cb); + g_source_unref (source); +} + + +/** + * GTaskThreadFunc: + * @task: the #GTask + * @source_object: (type GObject): @task's source object + * @task_data: @task's task data + * @cancellable: @task's #GCancellable, or %NULL + * + * The prototype for a task function to be run in a thread via + * g_task_run_in_thread() or g_task_run_in_thread_sync(). + * + * If the return-on-cancel flag is set on @task, and @cancellable gets + * cancelled, then the #GTask will be completed immediately (as though + * g_task_return_error_if_cancelled() had been called), without + * waiting for the task function to complete. However, the task + * function will continue running in its thread in the background. The + * function therefore needs to be careful about how it uses + * externally-visible state in this case. See + * g_task_set_return_on_cancel() for more details. + * + * Other than in that case, @task will be completed when the + * #GTaskThreadFunc returns, not when it calls + * a g_task_return_ function. + * + * Since: 2.36 + */ + +static void task_thread_cancelled (GCancellable *cancellable, + gpointer user_data); + +static void +g_task_thread_complete (GTask *task) +{ + g_mutex_lock (&task->lock); + if (task->thread_complete) + { + /* The task belatedly completed after having been cancelled + * (or was cancelled in the midst of being completed). + */ + g_mutex_unlock (&task->lock); + return; + } + + task->thread_complete = TRUE; + + if (task->blocking_other_task) + { + g_mutex_lock (&task_pool_mutex); + g_thread_pool_set_max_threads (task_pool, + g_thread_pool_get_max_threads (task_pool) - 1, + NULL); + g_mutex_unlock (&task_pool_mutex); + } + g_mutex_unlock (&task->lock); + + if (task->cancellable) + g_signal_handlers_disconnect_by_func (task->cancellable, task_thread_cancelled, task); + + if (task->synchronous) + g_cond_signal (&task->cond); + else + g_task_return (task, G_TASK_RETURN_FROM_THREAD); +} + +static void +g_task_thread_pool_thread (gpointer thread_data, + gpointer pool_data) +{ + GTask *task = thread_data; + + g_private_set (&task_private, task); + + task->task_func (task, task->source_object, task->task_data, + task->cancellable); + g_task_thread_complete (task); + + g_private_set (&task_private, NULL); + g_object_unref (task); +} + +static void +task_thread_cancelled (GCancellable *cancellable, + gpointer user_data) +{ + GTask *task = user_data; + + g_task_thread_pool_resort (); + + g_mutex_lock (&task->lock); + task->thread_cancelled = TRUE; + + if (!task->return_on_cancel) + { + g_mutex_unlock (&task->lock); + return; + } + + /* We don't actually set task->error; g_task_return_error() doesn't + * use a lock, and g_task_propagate_error() will call + * g_cancellable_set_error_if_cancelled() anyway. + */ + g_mutex_unlock (&task->lock); + g_task_thread_complete (task); +} + +static void +task_thread_cancelled_disconnect_notify (gpointer task, + GClosure *closure) +{ + g_object_unref (task); +} + +static void +g_task_start_task_thread (GTask *task, + GTaskThreadFunc task_func) +{ + g_mutex_init (&task->lock); + g_cond_init (&task->cond); + + g_mutex_lock (&task->lock); + + task->task_func = task_func; + + if (task->cancellable) + { + if (task->return_on_cancel && + g_cancellable_set_error_if_cancelled (task->cancellable, + &task->error)) + { + task->thread_cancelled = task->thread_complete = TRUE; + g_thread_pool_push (task_pool, g_object_ref (task), NULL); + return; + } + + g_signal_connect_data (task->cancellable, "cancelled", + G_CALLBACK (task_thread_cancelled), + g_object_ref (task), + task_thread_cancelled_disconnect_notify, 0); + } + + g_thread_pool_push (task_pool, g_object_ref (task), &task->error); + if (task->error) + task->thread_complete = TRUE; + else if (g_private_get (&task_private)) + { + /* This thread is being spawned from another GTask thread, so + * bump up max-threads so we don't starve. + */ + g_mutex_lock (&task_pool_mutex); + if (g_thread_pool_set_max_threads (task_pool, + g_thread_pool_get_max_threads (task_pool) + 1, + NULL)) + task->blocking_other_task = TRUE; + g_mutex_unlock (&task_pool_mutex); + } +} + +/** + * g_task_run_in_thread: + * @task: a #GTask + * @task_func: a #GTaskThreadFunc + * + * Runs @task_func in another thread. When @task_func returns, @task's + * #GAsyncReadyCallback will be invoked in @task's #GMainContext. + * + * This takes a ref on @task until the task completes. + * + * See #GTaskThreadFunc for more details about how @task_func is handled. + * + * Since: 2.36 + */ +void +g_task_run_in_thread (GTask *task, + GTaskThreadFunc task_func) +{ + g_return_if_fail (G_IS_TASK (task)); + + g_object_ref (task); + g_task_start_task_thread (task, task_func); + + /* The task may already be cancelled, or g_thread_pool_push() may + * have failed. + */ + if (task->thread_complete) + { + g_mutex_unlock (&task->lock); + g_task_return (task, G_TASK_RETURN_FROM_THREAD); + } + else + g_mutex_unlock (&task->lock); + + g_object_unref (task); +} + +/** + * g_task_run_in_thread_sync: + * @task: a #GTask + * @task_func: a #GTaskThreadFunc + * + * Runs @task_func in another thread, and waits for it to return or be + * cancelled. You can use g_task_propagate_pointer(), etc, afterward + * to get the result of @task_func. + * + * See #GTaskThreadFunc for more details about how @task_func is handled. + * + * Normally this is used with tasks created with a %NULL + * callback, but note that even if the task does + * have a callback, it will not be invoked when @task_func returns. + * + * Since: 2.36 + */ +void +g_task_run_in_thread_sync (GTask *task, + GTaskThreadFunc task_func) +{ + g_return_if_fail (G_IS_TASK (task)); + + g_object_ref (task); + + task->synchronous = TRUE; + g_task_start_task_thread (task, task_func); + + while (!task->thread_complete) + g_cond_wait (&task->cond, &task->lock); + + g_mutex_unlock (&task->lock); + g_object_unref (task); +} + +/** + * g_task_attach_source: + * @task: a #GTask + * @source: the source to attach + * @callback: the callback to invoke when @source triggers + * + * A utility function for dealing with async operations where you need + * to wait for a #GSource to trigger. Attaches @source to @task's + * #GMainContext with @task's priority, and sets @source's callback + * to @callback, with @task as the callback's + * user_data. + * + * This takes a reference on @task until @source is destroyed. + * + * Since: 2.36 + */ +void +g_task_attach_source (GTask *task, + GSource *source, + GSourceFunc callback) +{ + g_source_set_callback (source, callback, + g_object_ref (task), g_object_unref); + g_source_set_priority (source, task->priority); + g_source_attach (source, task->context); +} + + +static gboolean +g_task_propagate_error (GTask *task, + GError **error) +{ + if (task->check_cancellable && + g_cancellable_set_error_if_cancelled (task->cancellable, error)) + return TRUE; + else if (task->error) + { + g_propagate_error (error, task->error); + task->error = NULL; + return TRUE; + } + else + return FALSE; +} + +/** + * g_task_return_pointer: + * @task: a #GTask + * @result: (allow-none) (transfer full): the pointer result of a task + * function + * @result_destroy: (allow-none): a #GDestroyNotify function. + * + * Sets @task's result to @result and completes the task. If @result + * is not %NULL, then @result_destroy will be used to free @result if + * the caller does not take ownership of it with + * g_task_propagate_pointer(). + * + * "Completes the task" means that for an ordinary asynchronous task + * it will either invoke the task's callback, or else queue that + * callback to be invoked in the proper #GMainContext, or in the next + * iteration of the current #GMainContext. For a task run via + * g_task_run_in_thread() or g_task_run_in_thread_sync(), calling this + * method will save @result to be returned to the caller later, but + * the task will not actually be completed until the #GTaskThreadFunc + * exits. + * + * Note that since the task may be completed before returning from + * g_task_return_pointer(), you cannot assume that @result is still + * valid after calling this, unless you are still holding another + * reference on it. + * + * Since: 2.36 + */ +void +g_task_return_pointer (GTask *task, + gpointer result, + GDestroyNotify result_destroy) +{ + g_return_if_fail (task->result_set == FALSE); + + task->result.pointer = result; + task->result_destroy = result_destroy; + + g_task_return (task, G_TASK_RETURN_SUCCESS); +} + +/** + * g_task_propagate_pointer: + * @task: a #GTask + * @error: return location for a #GError + * + * Gets the result of @task as a pointer, and transfers ownership + * of that value to the caller. + * + * If the task resulted in an error, or was cancelled, then this will + * instead return %NULL and set @error. + * + * Since this method transfers ownership of the return value (or + * error) to the caller, you may only call it once. + * + * Returns: (transfer full): the task result, or %NULL on error + * + * Since: 2.36 + */ +gpointer +g_task_propagate_pointer (GTask *task, + GError **error) +{ + if (g_task_propagate_error (task, error)) + return NULL; + + g_return_val_if_fail (task->result_set == TRUE, NULL); + + task->result_destroy = NULL; + task->result_set = FALSE; + return task->result.pointer; +} + +/** + * g_task_return_int: + * @task: a #GTask. + * @result: the integer (#gssize) result of a task function. + * + * Sets @task's result to @result and completes the task (see + * g_task_return_pointer() for more discussion of exactly what this + * means). + * + * Since: 2.36 + */ +void +g_task_return_int (GTask *task, + gssize result) +{ + g_return_if_fail (task->result_set == FALSE); + + task->result.size = result; + + g_task_return (task, G_TASK_RETURN_SUCCESS); +} + +/** + * g_task_propagate_int: + * @task: a #GTask. + * @error: return location for a #GError + * + * Gets the result of @task as an integer (#gssize). + * + * If the task resulted in an error, or was cancelled, then this will + * instead return -1 and set @error. + * + * Since this method transfers ownership of the return value (or + * error) to the caller, you may only call it once. + * + * Returns: the task result, or -1 on error + * + * Since: 2.36 + */ +gssize +g_task_propagate_int (GTask *task, + GError **error) +{ + if (g_task_propagate_error (task, error)) + return -1; + + g_return_val_if_fail (task->result_set == TRUE, -1); + + task->result_set = FALSE; + return task->result.size; +} + +/** + * g_task_return_boolean: + * @task: a #GTask. + * @result: the #gboolean result of a task function. + * + * Sets @task's result to @result and completes the task (see + * g_task_return_pointer() for more discussion of exactly what this + * means). + * + * Since: 2.36 + */ +void +g_task_return_boolean (GTask *task, + gboolean result) +{ + g_return_if_fail (task->result_set == FALSE); + + task->result.boolean = result; + + g_task_return (task, G_TASK_RETURN_SUCCESS); +} + +/** + * g_task_propagate_boolean: + * @task: a #GTask. + * @error: return location for a #GError + * + * Gets the result of @task as a #gboolean. + * + * If the task resulted in an error, or was cancelled, then this will + * instead return %FALSE and set @error. + * + * Since this method transfers ownership of the return value (or + * error) to the caller, you may only call it once. + * + * Returns: the task result, or %FALSE on error + * + * Since: 2.36 + */ +gboolean +g_task_propagate_boolean (GTask *task, + GError **error) +{ + if (g_task_propagate_error (task, error)) + return FALSE; + + g_return_val_if_fail (task->result_set == TRUE, FALSE); + + task->result_set = FALSE; + return task->result.boolean; +} + +/** + * g_task_return_error: + * @task: a #GTask. + * @error: (transfer full): the #GError result of a task function. + * + * Sets @task's result to @error (which @task assumes ownership of) + * and completes the task (see g_task_return_pointer() for more + * discussion of exactly what this means). + * + * Note that since the task takes ownership of @error, and since the + * task may be completed before returning from g_task_return_error(), + * you cannot assume that @error is still valid after calling this. + * Call g_error_copy() on the error if you need to keep a local copy + * as well. + * + * See also g_task_return_new_error(). + * + * Since: 2.36 + */ +void +g_task_return_error (GTask *task, + GError *error) +{ + g_return_if_fail (task->result_set == FALSE); + g_return_if_fail (error != NULL); + + task->error = error; + + g_task_return (task, G_TASK_RETURN_ERROR); +} + +/** + * g_task_return_new_error: + * @task: a #GTask. + * @domain: a #GQuark. + * @code: an error code. + * @format: a string with format characters. + * @...: a list of values to insert into @format. + * + * Sets @task's result to a new #GError created from @domain, @code, + * @format, and the remaining arguments, and completes the task (see + * g_task_return_pointer() for more discussion of exactly what this + * means). + * + * See also g_task_return_error(). + * + * Since: 2.36 + */ +void +g_task_return_new_error (GTask *task, + GQuark domain, + gint code, + const char *format, + ...) +{ + GError *error; + va_list args; + + va_start (args, format); + error = g_error_new_valist (domain, code, format, args); + va_end (args); + + g_task_return_error (task, error); +} + +/** + * g_task_return_error_if_cancelled: + * @task: a #GTask + * + * Checks if @task's #GCancellable has been cancelled, and if so, sets + * @task's error accordingly and completes the task (see + * g_task_return_pointer() for more discussion of exactly what this + * means). + * + * Return value: %TRUE if @task has been cancelled, %FALSE if not + * + * Since: 2.36 + */ +gboolean +g_task_return_error_if_cancelled (GTask *task) +{ + GError *error = NULL; + + g_return_val_if_fail (task->result_set == FALSE, FALSE); + + if (g_cancellable_set_error_if_cancelled (task->cancellable, &error)) + { + /* We explicitly set task->error so this works even when + * check-cancellable is not set. + */ + g_clear_error (&task->error); + task->error = error; + + g_task_return (task, G_TASK_RETURN_ERROR); + return TRUE; + } + else + return FALSE; +} + +/** + * g_task_had_error: + * @task: a #GTask. + * + * Tests if @task resulted in an error. + * + * Returns: %TRUE if the task resulted in an error, %FALSE otherwise. + * + * Since: 2.36 + */ +gboolean +g_task_had_error (GTask *task) +{ + if (task->error != NULL) + return TRUE; + + if (task->check_cancellable && g_cancellable_is_cancelled (task->cancellable)) + return TRUE; + + return FALSE; +} + +/** + * g_task_is_valid: + * @result: (type Gio.AsyncResult): A #GAsyncResult + * @source_object: (allow-none) (type GObject): the source object + * expected to be associated with the task + * + * Checks that @result is a #GTask, and that @source_object is its + * source object (or that @source_object is %NULL and @result has no + * source object). This can be used in g_return_if_fail() checks. + * + * Return value: %TRUE if @result and @source_object are valid, %FALSE + * if not + * + * Since: 2.36 + */ +gboolean +g_task_is_valid (gpointer result, + gpointer source_object) +{ + if (!G_IS_TASK (result)) + return FALSE; + + return G_TASK (result)->source_object == source_object; +} + +static gint +g_task_compare_priority (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const GTask *ta = a; + const GTask *tb = b; + gboolean a_cancelled, b_cancelled; + + /* Tasks that are causing other tasks to block have higher + * priority. + */ + if (ta->blocking_other_task && !tb->blocking_other_task) + return -1; + else if (tb->blocking_other_task && !ta->blocking_other_task) + return 1; + + /* Let already-cancelled tasks finish right away */ + a_cancelled = (ta->check_cancellable && + g_cancellable_is_cancelled (ta->cancellable)); + b_cancelled = (tb->check_cancellable && + g_cancellable_is_cancelled (tb->cancellable)); + if (a_cancelled && !b_cancelled) + return -1; + else if (b_cancelled && !a_cancelled) + return 1; + + /* Lower priority == run sooner == negative return value */ + return ta->priority - tb->priority; +} + +static void +g_task_thread_pool_init (void) +{ + task_pool = g_thread_pool_new (g_task_thread_pool_thread, NULL, + 10, FALSE, NULL); + g_assert (task_pool != NULL); + + g_thread_pool_set_sort_function (task_pool, g_task_compare_priority, NULL); +} + +static void +g_task_thread_pool_resort (void) +{ + g_thread_pool_set_sort_function (task_pool, g_task_compare_priority, NULL); +} + +static void +g_task_class_init (GTaskClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_task_finalize; +} + +static gpointer +g_task_get_user_data (GAsyncResult *res) +{ + return G_TASK (res)->callback_data; +} + +static gboolean +g_task_is_tagged (GAsyncResult *res, + gpointer source_tag) +{ + return G_TASK (res)->source_tag == source_tag; +} + +static void +g_task_async_result_iface_init (GAsyncResultIface *iface) +{ + iface->get_user_data = g_task_get_user_data; + iface->get_source_object = g_task_ref_source_object; + iface->is_tagged = g_task_is_tagged; +} diff --git a/gio/gtask.h b/gio/gtask.h new file mode 100644 index 0000000..d5a2d77 --- /dev/null +++ b/gio/gtask.h @@ -0,0 +1,160 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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_TASK_H__ +#define __G_TASK_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TASK (g_task_get_type ()) +#define G_TASK(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TASK, GTask)) +#define G_TASK_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TASK, GTaskClass)) +#define G_IS_TASK(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TASK)) +#define G_IS_TASK_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TASK)) +#define G_TASK_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TASK, GTaskClass)) + +typedef struct _GTaskClass GTaskClass; + +GLIB_AVAILABLE_IN_2_36 +GType g_task_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_36 +GTask *g_task_new (gpointer source_object, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer callback_data); + +GLIB_AVAILABLE_IN_2_36 +void g_task_report_error (gpointer source_object, + GAsyncReadyCallback callback, + gpointer callback_data, + gpointer source_tag, + GError *error); +GLIB_AVAILABLE_IN_2_36 +void g_task_report_new_error (gpointer source_object, + GAsyncReadyCallback callback, + gpointer callback_data, + gpointer source_tag, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF(7, 8); + +GLIB_AVAILABLE_IN_2_36 +void g_task_set_task_data (GTask *task, + gpointer task_data, + GDestroyNotify task_data_destroy); +GLIB_AVAILABLE_IN_2_36 +void g_task_set_priority (GTask *task, + gint priority); +GLIB_AVAILABLE_IN_2_36 +void g_task_set_check_cancellable (GTask *task, + gboolean check_cancellable); +GLIB_AVAILABLE_IN_2_36 +void g_task_set_source_tag (GTask *task, + gpointer source_tag); + +GLIB_AVAILABLE_IN_2_36 +gpointer g_task_get_source_object (GTask *task); +GLIB_AVAILABLE_IN_2_36 +gpointer g_task_get_task_data (GTask *task); +GLIB_AVAILABLE_IN_2_36 +gint g_task_get_priority (GTask *task); +GLIB_AVAILABLE_IN_2_36 +GMainContext *g_task_get_context (GTask *task); +GLIB_AVAILABLE_IN_2_36 +GCancellable *g_task_get_cancellable (GTask *task); +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_get_check_cancellable (GTask *task); +GLIB_AVAILABLE_IN_2_36 +gpointer g_task_get_source_tag (GTask *task); + +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_is_valid (gpointer result, + gpointer source_object); + + +typedef void (*GTaskThreadFunc) (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable); +GLIB_AVAILABLE_IN_2_36 +void g_task_run_in_thread (GTask *task, + GTaskThreadFunc task_func); +GLIB_AVAILABLE_IN_2_36 +void g_task_run_in_thread_sync (GTask *task, + GTaskThreadFunc task_func); +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_set_return_on_cancel (GTask *task, + gboolean return_on_cancel); +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_get_return_on_cancel (GTask *task); + +GLIB_AVAILABLE_IN_2_36 +void g_task_attach_source (GTask *task, + GSource *source, + GSourceFunc callback); + + +GLIB_AVAILABLE_IN_2_36 +void g_task_return_pointer (GTask *task, + gpointer result, + GDestroyNotify result_destroy); +GLIB_AVAILABLE_IN_2_36 +void g_task_return_boolean (GTask *task, + gboolean result); +GLIB_AVAILABLE_IN_2_36 +void g_task_return_int (GTask *task, + gssize result); + +GLIB_AVAILABLE_IN_2_36 +void g_task_return_error (GTask *task, + GError *error); +GLIB_AVAILABLE_IN_2_36 +void g_task_return_new_error (GTask *task, + GQuark domain, + gint code, + const char *format, + ...) G_GNUC_PRINTF (4, 5); + +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_return_error_if_cancelled (GTask *task); + +GLIB_AVAILABLE_IN_2_36 +gpointer g_task_propagate_pointer (GTask *task, + GError **error); +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_propagate_boolean (GTask *task, + GError **error); +GLIB_AVAILABLE_IN_2_36 +gssize g_task_propagate_int (GTask *task, + GError **error); +GLIB_AVAILABLE_IN_2_36 +gboolean g_task_had_error (GTask *task); + +G_END_DECLS + +#endif /* __G_TASK_H__ */ diff --git a/gio/gtcpconnection.c b/gio/gtcpconnection.c new file mode 100644 index 0000000..00fb059 --- /dev/null +++ b/gio/gtcpconnection.c @@ -0,0 +1,334 @@ +/* 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. + * + * Since: 2.22 + */ + +#include "config.h" +#include "gtcpconnection.h" +#include "gasyncresult.h" +#include "gtask.h" +#include "giostream.h" +#include "glibintl.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; + 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) + { + ret = g_socket_receive_with_blocking (socket, buffer, sizeof (buffer), + TRUE, cancellable, error); + if (ret < 0) + { + had_error = TRUE; + error = NULL; + break; + } + if (ret == 0) + break; + } + } + } + + return G_IO_STREAM_CLASS (g_tcp_connection_parent_class) + ->close_fn (stream, cancellable, error) && !had_error; +} + +/* consumes @error */ +static void +async_close_finish (GTask *task, + GError *error) +{ + GIOStreamClass *parent = G_IO_STREAM_CLASS (g_tcp_connection_parent_class); + GIOStream *stream = g_task_get_source_object (task); + GCancellable *cancellable = g_task_get_cancellable (task); + + /* Close underlying stream, ignoring further errors if we already + * have one. + */ + if (error) + parent->close_fn (stream, cancellable, NULL); + else + parent->close_fn (stream, cancellable, &error); + + if (error) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); +} + + +static gboolean +close_read_ready (GSocket *socket, + GIOCondition condition, + GTask *task) +{ + GError *error = NULL; + char buffer[1024]; + gssize ret; + + ret = g_socket_receive_with_blocking (socket, buffer, sizeof (buffer), + FALSE, g_task_get_cancellable (task), + &error); + if (ret < 0) + { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK)) + { + g_error_free (error); + return TRUE; + } + else + { + async_close_finish (task, error); + g_object_unref (task); + return FALSE; + } + } + + if (ret == 0) + { + async_close_finish (task, NULL); + 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); + GSocket *socket; + GSource *source; + GError *error; + GTask *task; + + if (connection->priv->graceful_disconnect && + !g_cancellable_is_cancelled (cancellable) /* Cancelled -> close fast */) + { + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (stream)); + + error = NULL; + if (!g_socket_shutdown (socket, FALSE, TRUE, &error)) + { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + + source = g_socket_create_source (socket, G_IO_IN, cancellable); + g_task_attach_source (task, source, (GSourceFunc) close_read_ready); + 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 receiving 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; +} diff --git a/gio/gtcpconnection.h b/gio/gtcpconnection.h new file mode 100644 index 0000000..3d02f3a --- /dev/null +++ b/gio/gtcpconnection.h @@ -0,0 +1,71 @@ +/* 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 + */ + +#ifndef __G_TCP_CONNECTION_H__ +#define __G_TCP_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tcp_connection_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +void g_tcp_connection_set_graceful_disconnect (GTcpConnection *connection, + gboolean graceful_disconnect); +GLIB_AVAILABLE_IN_ALL +gboolean g_tcp_connection_get_graceful_disconnect (GTcpConnection *connection); + +G_END_DECLS + +#endif /* __G_TCP_CONNECTION_H__ */ diff --git a/gio/gtcpwrapperconnection.c b/gio/gtcpwrapperconnection.c new file mode 100644 index 0000000..deab98f --- /dev/null +++ b/gio/gtcpwrapperconnection.c @@ -0,0 +1,199 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +/** + * SECTION:gtcpwrapperconnection + * @title: GTcpWrapperConnection + * @short_description: wrapper for non-GSocketConnection-based, GSocket-based GIOStreams + * @see_also: #GSocketConnection. + * + * A #GTcpWrapperConnection can be used to wrap a #GIOStream that is + * based on a #GSocket, but which is not actually a + * #GSocketConnection. This is used by #GSocketClient so that it can + * always return a #GSocketConnection, even when the connection it has + * actually created is not directly a #GSocketConnection. + * + * Since: 2.28 + */ + +#include "config.h" + +#include "gtcpwrapperconnection.h" + +#include "gtcpconnection.h" +#include "glibintl.h" + +G_DEFINE_TYPE (GTcpWrapperConnection, + g_tcp_wrapper_connection, G_TYPE_TCP_CONNECTION); + +enum +{ + PROP_NONE, + PROP_BASE_IO_STREAM +}; + +struct _GTcpWrapperConnectionPrivate +{ + GIOStream *base_io_stream; +}; + +static GInputStream * +g_tcp_wrapper_connection_get_input_stream (GIOStream *io_stream) +{ + GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (io_stream); + + return g_io_stream_get_input_stream (connection->priv->base_io_stream); +} + +static GOutputStream * +g_tcp_wrapper_connection_get_output_stream (GIOStream *io_stream) +{ + GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (io_stream); + + return g_io_stream_get_output_stream (connection->priv->base_io_stream); +} + +static void +g_tcp_wrapper_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object); + + switch (prop_id) + { + case PROP_BASE_IO_STREAM: + g_value_set_object (value, connection->priv->base_io_stream); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_tcp_wrapper_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object); + + switch (prop_id) + { + case PROP_BASE_IO_STREAM: + connection->priv->base_io_stream = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_tcp_wrapper_connection_finalize (GObject *object) +{ + GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object); + + if (connection->priv->base_io_stream) + g_object_unref (connection->priv->base_io_stream); + + G_OBJECT_CLASS (g_tcp_wrapper_connection_parent_class)->finalize (object); +} + +static void +g_tcp_wrapper_connection_class_init (GTcpWrapperConnectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GTcpWrapperConnectionPrivate)); + + gobject_class->set_property = g_tcp_wrapper_connection_set_property; + gobject_class->get_property = g_tcp_wrapper_connection_get_property; + gobject_class->finalize = g_tcp_wrapper_connection_finalize; + + stream_class->get_input_stream = g_tcp_wrapper_connection_get_input_stream; + stream_class->get_output_stream = g_tcp_wrapper_connection_get_output_stream; + + g_object_class_install_property (gobject_class, + PROP_BASE_IO_STREAM, + g_param_spec_object ("base-io-stream", + P_("Base IO Stream"), + P_("The wrapped GIOStream"), + G_TYPE_IO_STREAM, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_tcp_wrapper_connection_init (GTcpWrapperConnection *connection) +{ + connection->priv = G_TYPE_INSTANCE_GET_PRIVATE (connection, + G_TYPE_TCP_WRAPPER_CONNECTION, + GTcpWrapperConnectionPrivate); +} + +/** + * g_tcp_wrapper_connection_new: + * @base_io_stream: the #GIOStream to wrap + * @socket: the #GSocket associated with @base_io_stream + * + * Wraps @base_io_stream and @socket together as a #GSocketConnection. + * + * Return value: the new #GSocketConnection. + * + * Since: 2.28 + */ +GSocketConnection * +g_tcp_wrapper_connection_new (GIOStream *base_io_stream, + GSocket *socket) +{ + g_return_val_if_fail (G_IS_IO_STREAM (base_io_stream), NULL); + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + g_return_val_if_fail (g_socket_get_family (socket) == G_SOCKET_FAMILY_IPV4 || + g_socket_get_family (socket) == G_SOCKET_FAMILY_IPV6, NULL); + g_return_val_if_fail (g_socket_get_socket_type (socket) == G_SOCKET_TYPE_STREAM, NULL); + + return g_object_new (G_TYPE_TCP_WRAPPER_CONNECTION, + "base-io-stream", base_io_stream, + "socket", socket, + NULL); +} + +/** + * g_tcp_wrapper_connection_get_base_io_stream: + * @conn: a #GTcpWrapperConnection + * + * Get's @conn's base #GIOStream + * + * Return value: (transfer none): @conn's base #GIOStream + */ +GIOStream * +g_tcp_wrapper_connection_get_base_io_stream (GTcpWrapperConnection *conn) +{ + g_return_val_if_fail (G_IS_TCP_WRAPPER_CONNECTION (conn), NULL); + + return conn->priv->base_io_stream; +} diff --git a/gio/gtcpwrapperconnection.h b/gio/gtcpwrapperconnection.h new file mode 100644 index 0000000..43b1e3e --- /dev/null +++ b/gio/gtcpwrapperconnection.h @@ -0,0 +1,71 @@ +/* GIO - GLib Input, Output and Streaming Library + * Copyright © 2010 Collabora Ltd. + * + * 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: Nicolas Dufresne + * + */ + +#ifndef __G_TCP_WRAPPER_CONNECTION_H__ +#define __G_TCP_WRAPPER_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TCP_WRAPPER_CONNECTION (g_tcp_wrapper_connection_get_type ()) +#define G_TCP_WRAPPER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_TCP_WRAPPER_CONNECTION, GTcpWrapperConnection)) +#define G_TCP_WRAPPER_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_TCP_WRAPPER_CONNECTION, GTcpWrapperConnectionClass)) +#define G_IS_TCP_WRAPPER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_TCP_WRAPPER_CONNECTION)) +#define G_IS_TCP_WRAPPER_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_TCP_WRAPPER_CONNECTION)) +#define G_TCP_WRAPPER_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_TCP_WRAPPER_CONNECTION, GTcpWrapperConnectionClass)) + +typedef struct _GTcpWrapperConnectionPrivate GTcpWrapperConnectionPrivate; +typedef struct _GTcpWrapperConnectionClass GTcpWrapperConnectionClass; + +struct _GTcpWrapperConnectionClass +{ + GTcpConnectionClass parent_class; +}; + +struct _GTcpWrapperConnection +{ + GTcpConnection parent_instance; + GTcpWrapperConnectionPrivate *priv; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tcp_wrapper_connection_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketConnection *g_tcp_wrapper_connection_new (GIOStream *base_io_stream, + GSocket *socket); +GLIB_AVAILABLE_IN_ALL +GIOStream *g_tcp_wrapper_connection_get_base_io_stream (GTcpWrapperConnection *conn); + +G_END_DECLS + +#endif /* __G_TCP_WRAPPER_CONNECTION_H__ */ diff --git a/gio/gtestdbus.c b/gio/gtestdbus.c new file mode 100644 index 0000000..2315451 --- /dev/null +++ b/gio/gtestdbus.c @@ -0,0 +1,762 @@ +/* GIO testing utilities + * + * Copyright (C) 2008-2010 Red Hat, Inc. + * Copyright (C) 2012 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: David Zeuthen + * Xavier Claessens + */ + +#include "config.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef G_OS_WIN32 +#include +#endif + +#include + +#include "gdbusconnection.h" +#include "gdbusprivate.h" +#include "gfile.h" +#include "gioenumtypes.h" +#include "gtestdbus.h" + +#include "glibintl.h" + +#ifdef G_OS_WIN32 +#include +#endif + +/* -------------------------------------------------------------------------- */ +/* Utility: Wait until object has a single ref */ + +typedef struct +{ + GMainLoop *loop; + gboolean timed_out; +} WeakNotifyData; + +static gboolean +on_weak_notify_timeout (gpointer user_data) +{ + WeakNotifyData *data = user_data; + data->timed_out = TRUE; + g_main_loop_quit (data->loop); + return FALSE; +} + +static gboolean +unref_on_idle (gpointer object) +{ + g_object_unref (object); + return FALSE; +} + +static gboolean +_g_object_unref_and_wait_weak_notify (gpointer object) +{ + WeakNotifyData data; + guint timeout_id; + + data.loop = g_main_loop_new (NULL, FALSE); + data.timed_out = FALSE; + + g_object_weak_ref (object, (GWeakNotify) g_main_loop_quit, data.loop); + + /* Drop the ref in an idle callback, this is to make sure the mainloop + * is already running when weak notify happens */ + g_idle_add (unref_on_idle, object); + + /* Make sure we don't block forever */ + timeout_id = g_timeout_add (30 * 1000, on_weak_notify_timeout, &data); + + g_main_loop_run (data.loop); + + g_source_remove (timeout_id); + + if (data.timed_out) + { + g_warning ("Weak notify timeout, object ref_count=%d\n", + G_OBJECT (object)->ref_count); + } + + return data.timed_out; +} + +/* -------------------------------------------------------------------------- */ +/* Utilities to cleanup the mess in the case unit test process crash */ + +#ifdef G_OS_WIN32 + +/* This could be interesting to expose in public API */ +static void +_g_test_watcher_add_pid (GPid pid) +{ + static gsize started = 0; + HANDLE job; + + if (g_once_init_enter (&started)) + { + JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; + + job = CreateJobObjectW (NULL, NULL); + memset (&info, 0, sizeof (info)); + info.BasicLimitInformation.LimitFlags = 0x2000 /* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE */; + + if (!SetInformationJobObject(job, JobObjectExtendedLimitInformation, &info, sizeof (info))) + g_warning ("Can't enable JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: %s", g_win32_error_message (GetLastError())); + + g_once_init_leave (&started,(gsize)job); + } + + job = (HANDLE)started; + + if (!AssignProcessToJobObject(job, pid)) + g_warning ("Can't assign process to job: %s", g_win32_error_message (GetLastError())); +} + +static void +_g_test_watcher_remove_pid (GPid pid) +{ + /* No need to unassign the process from the job object as the process + will be killed anyway */ +} + +#else + +#define ADD_PID_FORMAT "add pid %d\n" +#define REMOVE_PID_FORMAT "remove pid %d\n" + +static void +watch_parent (gint fd) +{ + GIOChannel *channel; + GPollFD fds[1]; + GArray *pids_to_kill; + + channel = g_io_channel_unix_new (fd); + + fds[0].fd = fd; + fds[0].events = G_IO_HUP | G_IO_IN; + fds[0].revents = 0; + + pids_to_kill = g_array_new (FALSE, FALSE, sizeof (guint)); + + do + { + gint num_events; + gchar *command = NULL; + guint pid; + guint n; + GError *error = NULL; + + num_events = g_poll (fds, 1, -1); + if (num_events == 0) + continue; + + if (fds[0].revents == G_IO_HUP) + { + /* Parent quit, cleanup the mess and exit */ + for (n = 0; n < pids_to_kill->len; n++) + { + pid = g_array_index (pids_to_kill, guint, n); + g_print ("cleaning up pid %d\n", pid); + kill (pid, SIGTERM); + } + + g_array_unref (pids_to_kill); + g_io_channel_shutdown (channel, FALSE, &error); + g_assert_no_error (error); + g_io_channel_unref (channel); + + exit (0); + } + + /* Read the command from the input */ + g_io_channel_read_line (channel, &command, NULL, NULL, &error); + g_assert_no_error (error); + + /* Check for known commands */ + if (sscanf (command, ADD_PID_FORMAT, &pid) == 1) + { + g_array_append_val (pids_to_kill, pid); + } + else if (sscanf (command, REMOVE_PID_FORMAT, &pid) == 1) + { + for (n = 0; n < pids_to_kill->len; n++) + { + if (g_array_index (pids_to_kill, guint, n) == pid) + { + g_array_remove_index (pids_to_kill, n); + pid = 0; + break; + } + } + if (pid != 0) + { + g_warning ("unknown pid %d to remove", pid); + } + } + else + { + g_warning ("unknown command from parent '%s'", command); + } + + g_free (command); + } + while (TRUE); +} + +static GIOChannel * +watcher_init (void) +{ + static gsize started = 0; + static GIOChannel *channel = NULL; + + if (g_once_init_enter (&started)) + { + gint pipe_fds[2]; + + /* fork a child to clean up when we are killed */ + if (pipe (pipe_fds) != 0) + { + g_warning ("pipe() failed: %m"); + g_assert_not_reached (); + } + + switch (fork ()) + { + case -1: + g_warning ("fork() failed: %m"); + g_assert_not_reached (); + break; + + case 0: + /* child */ + close (pipe_fds[1]); + watch_parent (pipe_fds[0]); + break; + + default: + /* parent */ + close (pipe_fds[0]); + channel = g_io_channel_unix_new (pipe_fds[1]); + } + + g_once_init_leave (&started, 1); + } + + return channel; +} + +static void +watcher_send_command (const gchar *command) +{ + GIOChannel *channel; + GError *error = NULL; + + channel = watcher_init (); + + g_io_channel_write_chars (channel, command, -1, NULL, &error); + g_assert_no_error (error); + + g_io_channel_flush (channel, &error); + g_assert_no_error (error); +} + +/* This could be interesting to expose in public API */ +static void +_g_test_watcher_add_pid (GPid pid) +{ + gchar *command; + + command = g_strdup_printf (ADD_PID_FORMAT, (guint) pid); + watcher_send_command (command); + g_free (command); +} + +static void +_g_test_watcher_remove_pid (GPid pid) +{ + gchar *command; + + command = g_strdup_printf (REMOVE_PID_FORMAT, (guint) pid); + watcher_send_command (command); + g_free (command); +} + +#endif + +/* -------------------------------------------------------------------------- */ +/* GTestDBus object implementation */ + +/** + * SECTION:gtestdbus + * @short_description: D-Bus testing helper + * @include: gio/gio.h + * + * A helper class for testing code which uses D-Bus without touching the user's + * session bus. + */ + +typedef struct _GTestDBusClass GTestDBusClass; +typedef struct _GTestDBusPrivate GTestDBusPrivate; + +/** + * GTestDBus: + * + * The #GTestDBus structure contains only private data and + * should only be accessed using the provided API. + * + * Since: 2.34 + */ +struct _GTestDBus { + GObject parent; + + GTestDBusPrivate *priv; +}; + +struct _GTestDBusClass { + GObjectClass parent_class; +}; + +struct _GTestDBusPrivate +{ + GTestDBusFlags flags; + GPtrArray *service_dirs; + GPid bus_pid; + gchar *bus_address; + gboolean up; +}; + +enum +{ + PROP_0, + PROP_FLAGS, +}; + +G_DEFINE_TYPE (GTestDBus, g_test_dbus, G_TYPE_OBJECT) + +static void +g_test_dbus_init (GTestDBus *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), G_TYPE_TEST_DBUS, + GTestDBusPrivate); + + self->priv->service_dirs = g_ptr_array_new_with_free_func (g_free); +} + +static void +g_test_dbus_dispose (GObject *object) +{ + GTestDBus *self = (GTestDBus *) object; + + if (self->priv->up) + g_test_dbus_down (self); + + G_OBJECT_CLASS (g_test_dbus_parent_class)->dispose (object); +} + +static void +g_test_dbus_finalize (GObject *object) +{ + GTestDBus *self = (GTestDBus *) object; + + g_ptr_array_unref (self->priv->service_dirs); + g_free (self->priv->bus_address); + + G_OBJECT_CLASS (g_test_dbus_parent_class)->finalize (object); +} + +static void +g_test_dbus_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + GTestDBus *self = (GTestDBus *) object; + + switch (property_id) + { + case PROP_FLAGS: + g_value_set_flags (value, g_test_dbus_get_flags (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_test_dbus_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + GTestDBus *self = (GTestDBus *) object; + + switch (property_id) + { + case PROP_FLAGS: + self->priv->flags = g_value_get_flags (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +g_test_dbus_class_init (GTestDBusClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = g_test_dbus_dispose; + object_class->finalize = g_test_dbus_finalize; + object_class->get_property = g_test_dbus_get_property; + object_class->set_property = g_test_dbus_set_property; + + g_type_class_add_private (object_class, sizeof (GTestDBusPrivate)); + + /** + * GTestDBus:flags: + * + * #GTestDBusFlags specifying the behaviour of the dbus session + * + * Since: 2.34 + */ + g_object_class_install_property (object_class, PROP_FLAGS, + g_param_spec_flags ("flags", + P_("dbus session flags"), + P_("Flags specifying the behaviour of the dbus session"), + G_TYPE_TEST_DBUS_FLAGS, G_TEST_DBUS_NONE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + +} + +static gchar * +write_config_file (GTestDBus *self) +{ + GString *contents; + gint fd; + guint i; + GError *error = NULL; + gchar *path = NULL; + + fd = g_file_open_tmp ("g-test-dbus-XXXXXX", &path, &error); + g_assert_no_error (error); + + contents = g_string_new (NULL); + g_string_append (contents, + "\n" + " session\n" +#ifdef G_OS_WIN32 + " nonce-tcp:\n" +#else + " unix:tmpdir=/tmp\n" +#endif + ); + + for (i = 0; i < self->priv->service_dirs->len; i++) + { + const gchar *path = g_ptr_array_index (self->priv->service_dirs, i); + + g_string_append_printf (contents, + " %s\n", path); + } + + g_string_append (contents, + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"); + + g_file_set_contents (path, contents->str, contents->len, &error); + g_assert_no_error (error); + + g_string_free (contents, TRUE); + + close (fd); + + return path; +} + +static void +start_daemon (GTestDBus *self) +{ + gchar *argv[] = {"dbus-daemon", "--print-address", "--config-file=foo", NULL}; + gchar *config_path; + gchar *config_arg; + gint stdout_fd; + GIOChannel *channel; + gsize termpos; + GError *error = NULL; + + if (g_getenv ("G_TEST_DBUS_DAEMON") != NULL) + argv[0] = (gchar *)g_getenv ("G_TEST_DBUS_DAEMON"); + + /* Write config file and set its path in argv */ + config_path = write_config_file (self); + config_arg = g_strdup_printf ("--config-file=%s", config_path); + argv[2] = config_arg; + + /* Spawn dbus-daemon */ + g_spawn_async_with_pipes (NULL, + argv, + NULL, +#ifdef G_OS_WIN32 + /* We Need this to get the pid returned on win32 */ + G_SPAWN_DO_NOT_REAP_CHILD | +#endif + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + &self->priv->bus_pid, + NULL, + &stdout_fd, + NULL, + &error); + g_assert_no_error (error); + + _g_test_watcher_add_pid (self->priv->bus_pid); + + /* Read bus address from daemon' stdout */ + channel = g_io_channel_unix_new (stdout_fd); + g_io_channel_read_line (channel, &self->priv->bus_address, NULL, + &termpos, &error); + g_assert_no_error (error); + self->priv->bus_address[termpos] = '\0'; + + /* start dbus-monitor */ + if (g_getenv ("G_DBUS_MONITOR") != NULL) + { + gchar *command; + + command = g_strdup_printf ("dbus-monitor --address %s", + self->priv->bus_address); + g_spawn_command_line_async (command, NULL); + g_free (command); + + g_usleep (500 * 1000); + } + + /* Cleanup */ + g_io_channel_shutdown (channel, FALSE, &error); + g_assert_no_error (error); + g_io_channel_unref (channel); + + /* Don't use g_file_delete since it calls into gvfs */ + if (g_unlink (config_path) != 0) + g_assert_not_reached (); + + g_free (config_path); + g_free (config_arg); +} + +static void +stop_daemon (GTestDBus *self) +{ +#ifdef G_OS_WIN32 + if (!TerminateProcess (self->priv->bus_pid, 0)) + g_warning ("Can't terminate process: %s", g_win32_error_message (GetLastError())); +#else + kill (self->priv->bus_pid, SIGTERM); +#endif + _g_test_watcher_remove_pid (self->priv->bus_pid); + g_spawn_close_pid (self->priv->bus_pid); + self->priv->bus_pid = 0; + + g_free (self->priv->bus_address); + self->priv->bus_address = NULL; +} + +/** + * g_test_dbus_new: + * @flags: a #GTestDBusFlags + * + * Create a new #GTestDBus object. + * + * Returns: (transfer full): a new #GTestDBus. + */ +GTestDBus * +g_test_dbus_new (GTestDBusFlags flags) +{ + return g_object_new (G_TYPE_TEST_DBUS, + "flags", flags, + NULL); +} + +/** + * g_test_dbus_get_flags: + * @self: a #GTestDBus + * + * Gets the flags of the #GTestDBus object. + * + * Returns: the value of #GTestDBus:flags property + */ +GTestDBusFlags +g_test_dbus_get_flags (GTestDBus *self) +{ + g_return_val_if_fail (G_IS_TEST_DBUS (self), G_TEST_DBUS_NONE); + + return self->priv->flags; +} + +/** + * g_test_dbus_get_bus_address: + * @self: a #GTestDBus + * + * Get the address on which dbus-daemon is running. if g_test_dbus_up() has not + * been called yet, %NULL is returned. This can be used with + * g_dbus_connection_new_for_address() + * + * Returns: the address of the bus, or %NULL. + */ +const gchar * +g_test_dbus_get_bus_address (GTestDBus *self) +{ + g_return_val_if_fail (G_IS_TEST_DBUS (self), NULL); + + return self->priv->bus_address; +} + +/** + * g_test_dbus_add_service_dir: + * @self: a #GTestDBus + * @path: path to a directory containing .service files + * + * Add a path where dbus-daemon will lookup for .services files. This can't be + * called after g_test_dbus_up(). + */ +void +g_test_dbus_add_service_dir (GTestDBus *self, + const gchar *path) +{ + g_return_if_fail (G_IS_TEST_DBUS (self)); + g_return_if_fail (self->priv->bus_address == NULL); + + g_ptr_array_add (self->priv->service_dirs, g_strdup (path)); +} + +/** + * g_test_dbus_up: + * @self: a #GTestDBus + * + * Start a dbus-daemon instance and set DBUS_SESSION_BUS_ADDRESS. After this + * call, it is safe for unit tests to start sending messages on the session bus. + * + * If this function is called from setup callback of g_test_add(), + * g_test_dbus_down() must be called in its teardown callback. + * + * If this function is called from unit test's main(), then g_test_dbus_down() + * must be called after g_test_run(). + */ +void +g_test_dbus_up (GTestDBus *self) +{ + g_return_if_fail (G_IS_TEST_DBUS (self)); + g_return_if_fail (self->priv->bus_address == NULL); + g_return_if_fail (!self->priv->up); + + start_daemon (self); + + g_setenv ("DBUS_SESSION_BUS_ADDRESS", self->priv->bus_address, TRUE); + self->priv->up = TRUE; +} + + +/** + * g_test_dbus_stop: + * @self: a #GTestDBus + * + * Stop the session bus started by g_test_dbus_up(). + * + * Unlike g_test_dbus_down(), this won't verify the #GDBusConnection + * singleton returned by g_bus_get() or g_bus_get_sync() is destroyed. Unit + * tests wanting to verify behaviour after the session bus has been stopped + * can use this function but should still call g_test_dbus_down() when done. + */ +void +g_test_dbus_stop (GTestDBus *self) +{ + g_return_if_fail (G_IS_TEST_DBUS (self)); + g_return_if_fail (self->priv->bus_address != NULL); + + stop_daemon (self); +} + +/** + * g_test_dbus_down: + * @self: a #GTestDBus + * + * Stop the session bus started by g_test_dbus_up(). + * + * This will wait for the singleton returned by g_bus_get() or g_bus_get_sync() + * is destroyed. This is done to ensure that the next unit test won't get a + * leaked singleton from this test. + */ +void +g_test_dbus_down (GTestDBus *self) +{ + GDBusConnection *connection; + + g_return_if_fail (G_IS_TEST_DBUS (self)); + g_return_if_fail (self->priv->up); + + connection = _g_bus_get_singleton_if_exists (G_BUS_TYPE_SESSION); + if (connection != NULL) + g_dbus_connection_set_exit_on_close (connection, FALSE); + + if (self->priv->bus_address != NULL) + stop_daemon (self); + + if (connection != NULL) + _g_object_unref_and_wait_weak_notify (connection); + + g_unsetenv ("DBUS_SESSION_BUS_ADDRESS"); + self->priv->up = FALSE; +} + +/** + * g_test_dbus_unset: + * + * Unset DISPLAY and DBUS_SESSION_BUS_ADDRESS env variables to ensure the test + * won't use user's session bus. + * + * This is useful for unit tests that want to verify behaviour when no session + * bus is running. It is not necessary to call this if unit test already calls + * g_test_dbus_up() before acquiring the session bus. + */ +void +g_test_dbus_unset (void) +{ + g_unsetenv ("DISPLAY"); + g_unsetenv ("DBUS_SESSION_BUS_ADDRESS"); +} diff --git a/gio/gtestdbus.h b/gio/gtestdbus.h new file mode 100644 index 0000000..00644d6 --- /dev/null +++ b/gio/gtestdbus.h @@ -0,0 +1,74 @@ +/* GIO testing utilities + * + * Copyright (C) 2008-2010 Red Hat, Inc. + * Copyright (C) 2012 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: David Zeuthen + * Xavier Claessens + */ + +#ifndef __G_TEST_DBUS_H__ +#define __G_TEST_DBUS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TEST_DBUS \ + (g_test_dbus_get_type ()) +#define G_TEST_DBUS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_TEST_DBUS, \ + GTestDBus)) +#define G_IS_TEST_DBUS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_TEST_DBUS)) + +GLIB_AVAILABLE_IN_2_34 +GType g_test_dbus_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_2_34 +GTestDBus * g_test_dbus_new (GTestDBusFlags flags); + +GLIB_AVAILABLE_IN_2_34 +GTestDBusFlags g_test_dbus_get_flags (GTestDBus *self); + +GLIB_AVAILABLE_IN_2_34 +const gchar * g_test_dbus_get_bus_address (GTestDBus *self); + +GLIB_AVAILABLE_IN_2_34 +void g_test_dbus_add_service_dir (GTestDBus *self, + const gchar *path); + +GLIB_AVAILABLE_IN_2_34 +void g_test_dbus_up (GTestDBus *self); + +GLIB_AVAILABLE_IN_2_34 +void g_test_dbus_stop (GTestDBus *self); + +GLIB_AVAILABLE_IN_2_34 +void g_test_dbus_down (GTestDBus *self); + +GLIB_AVAILABLE_IN_2_34 +void g_test_dbus_unset (void); + +G_END_DECLS + +#endif /* __G_TEST_DBUS_H__ */ diff --git a/gio/gthemedicon.c b/gio/gthemedicon.c new file mode 100644 index 0000000..bb53bbd --- /dev/null +++ b/gio/gthemedicon.c @@ -0,0 +1,522 @@ +/* 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" + + +/** + * 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: (transfer full) (type GThemedIcon): 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: (array length=len): 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: (transfer full) (type GThemedIcon): 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: (transfer full) (type GThemedIcon): 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: (transfer none): 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; +} diff --git a/gio/gthemedicon.h b/gio/gthemedicon.h new file mode 100644 index 0000000..4cbd29b --- /dev/null +++ b/gio/gthemedicon.h @@ -0,0 +1,70 @@ +/* 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_THEMED_ICON_H__ +#define __G_THEMED_ICON_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +GType g_themed_icon_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GIcon *g_themed_icon_new (const char *iconname); +GLIB_AVAILABLE_IN_ALL +GIcon *g_themed_icon_new_with_default_fallbacks (const char *iconname); +GLIB_AVAILABLE_IN_ALL +GIcon *g_themed_icon_new_from_names (char **iconnames, + int len); +GLIB_AVAILABLE_IN_ALL +void g_themed_icon_prepend_name (GThemedIcon *icon, + const char *iconname); +GLIB_AVAILABLE_IN_ALL +void g_themed_icon_append_name (GThemedIcon *icon, + const char *iconname); + +GLIB_AVAILABLE_IN_ALL +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..def85b8 --- /dev/null +++ b/gio/gthreadedresolver.c @@ -0,0 +1,784 @@ +/* -*- 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 "ginetaddress.h" +#include "ginetsocketaddress.h" +#include "gtask.h" +#include "gsocketaddress.h" +#include "gsrvtarget.h" + + +G_DEFINE_TYPE (GThreadedResolver, g_threaded_resolver, G_TYPE_RESOLVER) + +static void +g_threaded_resolver_init (GThreadedResolver *gtr) +{ +} + +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; + } +} + +static struct addrinfo addrinfo_hints; + +static void +do_lookup_by_name (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + const char *hostname = task_data; + struct addrinfo *res = NULL; + GList *addresses; + gint retval; + + retval = getaddrinfo (hostname, NULL, &addrinfo_hints, &res); + + if (retval == 0) + { + struct addrinfo *ai; + GSocketAddress *sockaddr; + GInetAddress *addr; + + addresses = 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)); + addresses = g_list_prepend (addresses, addr); + g_object_unref (sockaddr); + } + + addresses = g_list_reverse (addresses); + g_task_return_pointer (task, addresses, + (GDestroyNotify)g_resolver_free_addresses); + } + else + { + g_task_return_new_error (task, + G_RESOLVER_ERROR, + g_resolver_error_from_addrinfo_error (retval), + _("Error resolving '%s': %s"), + hostname, gai_strerror (retval)); + } + + if (res) + freeaddrinfo (res); +} + +static GList * +lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error) +{ + GTask *task; + GList *addresses; + + task = g_task_new (resolver, cancellable, NULL, NULL); + g_task_set_task_data (task, g_strdup (hostname), g_free); + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread_sync (task, do_lookup_by_name); + addresses = g_task_propagate_pointer (task, error); + g_object_unref (task); + + return addresses; +} + +static void +lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (resolver, cancellable, callback, user_data); + g_task_set_task_data (task, g_strdup (hostname), g_free); + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread (task, do_lookup_by_name); + g_object_unref (task); +} + +static GList * +lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, resolver), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + + +static void +do_lookup_by_address (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GInetAddress *address = task_data; + struct sockaddr_storage sockaddr; + gsize sockaddr_size; + GSocketAddress *gsockaddr; + gchar name[NI_MAXHOST]; + gint retval; + + gsockaddr = g_inet_socket_address_new (address, 0); + g_socket_address_to_native (gsockaddr, (struct sockaddr *)&sockaddr, + sizeof (sockaddr), NULL); + sockaddr_size = g_socket_address_get_native_size (gsockaddr); + g_object_unref (gsockaddr); + + retval = getnameinfo ((struct sockaddr *)&sockaddr, sockaddr_size, + name, sizeof (name), NULL, 0, NI_NAMEREQD); + if (retval == 0) + g_task_return_pointer (task, g_strdup (name), g_free); + else + { + gchar *phys; + + phys = g_inet_address_to_string (address); + g_task_return_new_error (task, + G_RESOLVER_ERROR, + g_resolver_error_from_addrinfo_error (retval), + _("Error reverse-resolving '%s': %s"), + phys ? phys : "(unknown)", + gai_strerror (retval)); + g_free (phys); + } +} + +static gchar * +lookup_by_address (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GError **error) +{ + GTask *task; + gchar *name; + + task = g_task_new (resolver, cancellable, NULL, NULL); + g_task_set_task_data (task, g_object_ref (address), g_object_unref); + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread_sync (task, do_lookup_by_address); + name = g_task_propagate_pointer (task, error); + g_object_unref (task); + + return name; +} + +static void +lookup_by_address_async (GResolver *resolver, + GInetAddress *address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (resolver, cancellable, callback, user_data); + g_task_set_task_data (task, g_object_ref (address), g_object_unref); + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread (task, do_lookup_by_address); + g_object_unref (task); +} + +static gchar * +lookup_by_address_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, resolver), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + + +#if defined(G_OS_UNIX) +static GVariant * +parse_res_srv (guchar *answer, + guchar *end, + guchar **p) +{ + gchar namebuf[1024]; + guint16 priority, weight, port; + + GETSHORT (priority, *p); + GETSHORT (weight, *p); + GETSHORT (port, *p); + *p += dn_expand (answer, end, *p, namebuf, sizeof (namebuf)); + + return g_variant_new ("(qqqs)", + priority, + weight, + port, + namebuf); +} + +static GVariant * +parse_res_soa (guchar *answer, + guchar *end, + guchar **p) +{ + gchar mnamebuf[1024]; + gchar rnamebuf[1024]; + guint32 serial, refresh, retry, expire, ttl; + + *p += dn_expand (answer, end, *p, mnamebuf, sizeof (mnamebuf)); + *p += dn_expand (answer, end, *p, rnamebuf, sizeof (rnamebuf)); + + GETLONG (serial, *p); + GETLONG (refresh, *p); + GETLONG (retry, *p); + GETLONG (expire, *p); + GETLONG (ttl, *p); + + return g_variant_new ("(ssuuuuu)", + mnamebuf, + rnamebuf, + serial, + refresh, + retry, + expire, + ttl); +} + +static GVariant * +parse_res_ns (guchar *answer, + guchar *end, + guchar **p) +{ + gchar namebuf[1024]; + + *p += dn_expand (answer, end, *p, namebuf, sizeof (namebuf)); + + return g_variant_new ("(s)", namebuf); +} + +static GVariant * +parse_res_mx (guchar *answer, + guchar *end, + guchar **p) +{ + gchar namebuf[1024]; + guint16 preference; + + GETSHORT (preference, *p); + + *p += dn_expand (answer, end, *p, namebuf, sizeof (namebuf)); + + return g_variant_new ("(qs)", + preference, + namebuf); +} + +static GVariant * +parse_res_txt (guchar *answer, + guchar *end, + guchar **p) +{ + GVariant *record; + GPtrArray *array; + guchar *at = *p; + gsize len; + + array = g_ptr_array_new_with_free_func (g_free); + while (at < end) + { + len = *(at++); + if (len > at - end) + break; + g_ptr_array_add (array, g_strndup ((gchar *)at, len)); + at += len; + } + + *p = at; + record = g_variant_new ("(@as)", + g_variant_new_strv ((const gchar **)array->pdata, array->len)); + g_ptr_array_free (array, TRUE); + return record; +} + +static gint +g_resolver_record_type_to_rrtype (GResolverRecordType type) +{ + switch (type) + { + case G_RESOLVER_RECORD_SRV: + return T_SRV; + case G_RESOLVER_RECORD_TXT: + return T_TXT; + case G_RESOLVER_RECORD_SOA: + return T_SOA; + case G_RESOLVER_RECORD_NS: + return T_NS; + case G_RESOLVER_RECORD_MX: + return T_MX; + } + g_return_val_if_reached (-1); +} + +static GList * +g_resolver_records_from_res_query (const gchar *rrname, + gint rrtype, + guchar *answer, + gint len, + gint herr, + GError **error) +{ + gint count; + gchar namebuf[1024]; + guchar *end, *p; + guint16 type, qclass, rdlength; + guint32 ttl; + HEADER *header; + GList *records; + GVariant *record; + + 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 DNS record of the requested type 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; + } + + records = 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; + + /* To silence gcc warnings */ + namebuf[0] = namebuf[1]; + } + + /* 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); + ttl = ttl; /* To avoid -Wunused-but-set-variable */ + GETSHORT (rdlength, p); + + if (type != rrtype || qclass != C_IN) + { + p += rdlength; + continue; + } + + switch (rrtype) + { + case T_SRV: + record = parse_res_srv (answer, end, &p); + break; + case T_MX: + record = parse_res_mx (answer, end, &p); + break; + case T_SOA: + record = parse_res_soa (answer, end, &p); + break; + case T_NS: + record = parse_res_ns (answer, end, &p); + break; + case T_TXT: + record = parse_res_txt (answer, p + rdlength, &p); + break; + default: + g_warn_if_reached (); + record = NULL; + break; + } + + if (record != NULL) + records = g_list_prepend (records, record); + } + + return records; +} + +#elif defined(G_OS_WIN32) + +static GVariant * +parse_dns_srv (DNS_RECORD *rec) +{ + return g_variant_new ("(qqqs)", + (guint16)rec->Data.SRV.wPriority, + (guint16)rec->Data.SRV.wWeight, + (guint16)rec->Data.SRV.wPort, + rec->Data.SRV.pNameTarget); +} + +static GVariant * +parse_dns_soa (DNS_RECORD *rec) +{ + return g_variant_new ("(ssuuuuu)", + rec->Data.SOA.pNamePrimaryServer, + rec->Data.SOA.pNameAdministrator, + (guint32)rec->Data.SOA.dwSerialNo, + (guint32)rec->Data.SOA.dwRefresh, + (guint32)rec->Data.SOA.dwRetry, + (guint32)rec->Data.SOA.dwExpire, + (guint32)rec->Data.SOA.dwDefaultTtl); +} + +static GVariant * +parse_dns_ns (DNS_RECORD *rec) +{ + return g_variant_new ("(s)", rec->Data.NS.pNameHost); +} + +static GVariant * +parse_dns_mx (DNS_RECORD *rec) +{ + return g_variant_new ("(qs)", + (guint16)rec->Data.MX.wPreference, + rec->Data.MX.pNameExchange); +} + +static GVariant * +parse_dns_txt (DNS_RECORD *rec) +{ + GVariant *record; + GPtrArray *array; + DWORD i; + + array = g_ptr_array_new (); + for (i = 0; i < rec->Data.TXT.dwStringCount; i++) + g_ptr_array_add (array, rec->Data.TXT.pStringArray[i]); + record = g_variant_new ("(@as)", + g_variant_new_strv ((const gchar **)array->pdata, array->len)); + g_ptr_array_free (array, TRUE); + return record; +} + +static WORD +g_resolver_record_type_to_dnstype (GResolverRecordType type) +{ + switch (type) + { + case G_RESOLVER_RECORD_SRV: + return DNS_TYPE_SRV; + case G_RESOLVER_RECORD_TXT: + return DNS_TYPE_TEXT; + case G_RESOLVER_RECORD_SOA: + return DNS_TYPE_SOA; + case G_RESOLVER_RECORD_NS: + return DNS_TYPE_NS; + case G_RESOLVER_RECORD_MX: + return DNS_TYPE_MX; + } + g_return_val_if_reached (-1); +} + +static GList * +g_resolver_records_from_DnsQuery (const gchar *rrname, + WORD dnstype, + DNS_STATUS status, + DNS_RECORD *results, + GError **error) +{ + DNS_RECORD *rec; + gpointer record; + GList *records; + + if (status != ERROR_SUCCESS) + { + GResolverError errnum; + const gchar *format; + + if (status == DNS_ERROR_RCODE_NAME_ERROR) + { + errnum = G_RESOLVER_ERROR_NOT_FOUND; + format = _("No DNS record of the requested type 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; + } + + records = NULL; + for (rec = results; rec; rec = rec->pNext) + { + if (rec->wType != dnstype) + continue; + switch (dnstype) + { + case DNS_TYPE_SRV: + record = parse_dns_srv (rec); + break; + case DNS_TYPE_SOA: + record = parse_dns_soa (rec); + break; + case DNS_TYPE_NS: + record = parse_dns_ns (rec); + break; + case DNS_TYPE_MX: + record = parse_dns_mx (rec); + break; + case DNS_TYPE_TEXT: + record = parse_dns_txt (rec); + break; + default: + g_warn_if_reached (); + record = NULL; + break; + } + if (record != NULL) + records = g_list_prepend (records, g_variant_ref_sink (record)); + } + + return records; +} + +#endif + +typedef struct { + char *rrname; + GResolverRecordType record_type; +} LookupRecordsData; + +static void +free_lookup_records_data (LookupRecordsData *lrd) +{ + g_free (lrd->rrname); + g_slice_free (LookupRecordsData, lrd); +} + +static void +free_records (GList *records) +{ + g_list_free_full (records, (GDestroyNotify) g_variant_unref); +} + +static void +do_lookup_records (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + LookupRecordsData *lrd = task_data; + GList *records; + GError *error = NULL; + +#if defined(G_OS_UNIX) + gint len = 512; + gint herr; + GByteArray *answer; + gint rrtype; + + rrtype = g_resolver_record_type_to_rrtype (lrd->record_type); + answer = g_byte_array_new (); + for (;;) + { + g_byte_array_set_size (answer, len * 2); + len = res_query (lrd->rrname, C_IN, rrtype, answer->data, answer->len); + + /* If answer fit in the buffer then we're done */ + if (len < 0 || len < (gint)answer->len) + break; + + /* + * On overflow some res_query's return the length needed, others + * return the full length entered. This code works in either case. + */ + } + + herr = h_errno; + records = g_resolver_records_from_res_query (lrd->rrname, rrtype, answer->data, len, herr, &error); + g_byte_array_free (answer, TRUE); + +#else + + DNS_STATUS status; + DNS_RECORD *results = NULL; + WORD dnstype; + + dnstype = g_resolver_record_type_to_dnstype (lrd->record_type); + status = DnsQuery_A (lrd->rrname, dnstype, DNS_QUERY_STANDARD, NULL, &results, NULL); + records = g_resolver_records_from_DnsQuery (lrd->rrname, dnstype, status, results, &error); + if (results != NULL) + DnsRecordListFree (results, DnsFreeRecordList); + +#endif + + if (records) + g_task_return_pointer (task, records, (GDestroyNotify) free_records); + else + g_task_return_error (task, error); +} + +static GList * +lookup_records (GResolver *resolver, + const gchar *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GError **error) +{ + GTask *task; + GList *records; + LookupRecordsData *lrd; + + task = g_task_new (resolver, cancellable, NULL, NULL); + + lrd = g_slice_new (LookupRecordsData); + lrd->rrname = g_strdup (rrname); + lrd->record_type = record_type; + g_task_set_task_data (task, lrd, (GDestroyNotify) free_lookup_records_data); + + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread_sync (task, do_lookup_records); + records = g_task_propagate_pointer (task, error); + g_object_unref (task); + + return records; +} + +static void +lookup_records_async (GResolver *resolver, + const char *rrname, + GResolverRecordType record_type, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + LookupRecordsData *lrd; + + task = g_task_new (resolver, cancellable, callback, user_data); + + lrd = g_slice_new (LookupRecordsData); + lrd->rrname = g_strdup (rrname); + lrd->record_type = record_type; + g_task_set_task_data (task, lrd, (GDestroyNotify) free_lookup_records_data); + + g_task_set_return_on_cancel (task, TRUE); + g_task_run_in_thread (task, do_lookup_records); + g_object_unref (task); +} + +static GList * +lookup_records_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, resolver), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + + +static void +g_threaded_resolver_class_init (GThreadedResolverClass *threaded_class) +{ + GResolverClass *resolver_class = G_RESOLVER_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_records = lookup_records; + resolver_class->lookup_records_async = lookup_records_async; + resolver_class->lookup_records_finish = lookup_records_finish; + + /* Initialize _g_resolver_addrinfo_hints */ +#ifdef AI_ADDRCONFIG + 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. + */ + addrinfo_hints.ai_socktype = SOCK_STREAM; + addrinfo_hints.ai_protocol = IPPROTO_TCP; +} diff --git a/gio/gthreadedresolver.h b/gio/gthreadedresolver.h new file mode 100644 index 0000000..f11c76e --- /dev/null +++ b/gio/gthreadedresolver.h @@ -0,0 +1,51 @@ +/* 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; + +GLIB_AVAILABLE_IN_ALL +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..475c1e1 --- /dev/null +++ b/gio/gthreadedsocketservice.c @@ -0,0 +1,272 @@ +/* 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 + * #GThreadedSocketService::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 available to serve incoming 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" + + +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 stop 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, + NULL, 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 one of the #GSocketListener "add" methods. + * + * 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); +} diff --git a/gio/gthreadedsocketservice.h b/gio/gthreadedsocketservice.h new file mode 100644 index 0000000..229be7e --- /dev/null +++ b/gio/gthreadedsocketservice.h @@ -0,0 +1,83 @@ +/* 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 + */ + +#ifndef __G_THREADED_SOCKET_SERVICE_H__ +#define __G_THREADED_SOCKET_SERVICE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_threaded_socket_service_get_type (void); +GLIB_AVAILABLE_IN_ALL +GSocketService * g_threaded_socket_service_new (int max_threads); + +G_END_DECLS + +#endif /* __G_THREADED_SOCKET_SERVICE_H__ */ diff --git a/gio/gtlsbackend.c b/gio/gtlsbackend.c new file mode 100644 index 0000000..c77293d --- /dev/null +++ b/gio/gtlsbackend.c @@ -0,0 +1,216 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 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 "gtlsbackend.h" +#include "gdummytlsbackend.h" +#include "gioenumtypes.h" +#include "giomodule-priv.h" + +/** + * SECTION:gtls + * @title: TLS Overview + * @short_description: TLS (aka SSL) support for GSocketConnection + * @include: gio/gio.h + * + * #GTlsConnection and related classes provide TLS (Transport Layer + * Security, previously known as SSL, Secure Sockets Layer) support for + * gio-based network streams. + * + * In the simplest case, for a client connection, you can just set the + * #GSocketClient:tls flag on a #GSocketClient, and then any + * connections created by that client will have TLS negotiated + * automatically, using appropriate default settings, and rejecting + * any invalid or self-signed certificates (unless you change that + * default by setting the #GSocketClient:tls-validation-flags + * property). The returned object will be a #GTcpWrapperConnection, + * which wraps the underlying #GTlsClientConnection. + * + * For greater control, you can create your own #GTlsClientConnection, + * wrapping a #GSocketConnection (or an arbitrary #GIOStream with + * pollable input and output streams) and then connect to its signals, + * such as #GTlsConnection::accept-certificate, before starting the + * handshake. + * + * Server-side TLS is similar, using #GTlsServerConnection. At the + * moment, there is no support for automatically wrapping server-side + * connections in the way #GSocketClient does for client-side + * connections. + */ + +/** + * SECTION:gtlsbackend + * @title: GTlsBackend + * @short_description: TLS backend implementation + * @include: gio/gio.h + */ + +/** + * GTlsBackend: + * + * TLS (Transport Layer Security, aka SSL) backend. This is an + * internal type used to coordinate the different classes implemented + * by a TLS backend. + * + * Since: 2.28 + */ + +G_DEFINE_INTERFACE (GTlsBackend, g_tls_backend, G_TYPE_OBJECT); + +static void +g_tls_backend_default_init (GTlsBackendInterface *iface) +{ +} + +/** + * g_tls_backend_get_default: + * + * Gets the default #GTlsBackend for the system. + * + * Returns: (transfer none): a #GTlsBackend + * + * Since: 2.28 + */ +GTlsBackend * +g_tls_backend_get_default (void) +{ + return _g_io_module_get_default (G_TLS_BACKEND_EXTENSION_POINT_NAME, + "GIO_USE_TLS", NULL); +} + +/** + * g_tls_backend_supports_tls: + * @backend: the #GTlsBackend + * + * Checks if TLS is supported; if this returns %FALSE for the default + * #GTlsBackend, it means no "real" TLS backend is available. + * + * Return value: whether or not TLS is supported + * + * Since: 2.28 + */ +gboolean +g_tls_backend_supports_tls (GTlsBackend *backend) +{ + if (G_TLS_BACKEND_GET_INTERFACE (backend)->supports_tls) + return G_TLS_BACKEND_GET_INTERFACE (backend)->supports_tls (backend); + else if (G_IS_DUMMY_TLS_BACKEND (backend)) + return FALSE; + else + return TRUE; +} + +/** + * g_tls_backend_get_default_database: + * @backend: the #GTlsBackend + * + * Gets the default #GTlsDatabase used to verify TLS connections. + * + * Return value: (transfer full): the default database, which should be + * unreffed when done. + * + * Since: 2.30 + */ +GTlsDatabase * +g_tls_backend_get_default_database (GTlsBackend *backend) +{ + g_return_val_if_fail (G_IS_TLS_BACKEND (backend), NULL); + + /* This method was added later, so accept the (remote) possibility it can be NULL */ + if (!G_TLS_BACKEND_GET_INTERFACE (backend)->get_default_database) + return NULL; + + return G_TLS_BACKEND_GET_INTERFACE (backend)->get_default_database (backend); +} + +/** + * g_tls_backend_get_certificate_type: + * @backend: the #GTlsBackend + * + * Gets the #GType of @backend's #GTlsCertificate implementation. + * + * Return value: the #GType of @backend's #GTlsCertificate + * implementation. + * + * Since: 2.28 + */ +GType +g_tls_backend_get_certificate_type (GTlsBackend *backend) +{ + return G_TLS_BACKEND_GET_INTERFACE (backend)->get_certificate_type (); +} + +/** + * g_tls_backend_get_client_connection_type: + * @backend: the #GTlsBackend + * + * Gets the #GType of @backend's #GTlsClientConnection implementation. + * + * Return value: the #GType of @backend's #GTlsClientConnection + * implementation. + * + * Since: 2.28 + */ +GType +g_tls_backend_get_client_connection_type (GTlsBackend *backend) +{ + return G_TLS_BACKEND_GET_INTERFACE (backend)->get_client_connection_type (); +} + +/** + * g_tls_backend_get_server_connection_type: + * @backend: the #GTlsBackend + * + * Gets the #GType of @backend's #GTlsServerConnection implementation. + * + * Return value: the #GType of @backend's #GTlsServerConnection + * implementation. + * + * Since: 2.28 + */ +GType +g_tls_backend_get_server_connection_type (GTlsBackend *backend) +{ + return G_TLS_BACKEND_GET_INTERFACE (backend)->get_server_connection_type (); +} + +/** + * g_tls_backend_get_file_database_type: + * @backend: the #GTlsBackend + * + * Gets the #GType of @backend's #GTlsFileDatabase implementation. + * + * Return value: the #GType of backend's #GTlsFileDatabase implementation. + * + * Since: 2.30 + */ +GType +g_tls_backend_get_file_database_type (GTlsBackend *backend) +{ + g_return_val_if_fail (G_IS_TLS_BACKEND (backend), 0); + + /* This method was added later, so accept the (remote) possibility it can be NULL */ + if (!G_TLS_BACKEND_GET_INTERFACE (backend)->get_file_database_type) + return 0; + + return G_TLS_BACKEND_GET_INTERFACE (backend)->get_file_database_type (); +} diff --git a/gio/gtlsbackend.h b/gio/gtlsbackend.h new file mode 100644 index 0000000..19f08ad --- /dev/null +++ b/gio/gtlsbackend.h @@ -0,0 +1,98 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_TLS_BACKEND_H__ +#define __G_TLS_BACKEND_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_TLS_BACKEND_EXTENSION_POINT_NAME: + * + * Extension point for TLS functionality via #GTlsBackend. + * See Extending GIO. + */ +#define G_TLS_BACKEND_EXTENSION_POINT_NAME "gio-tls-backend" + +#define G_TYPE_TLS_BACKEND (g_tls_backend_get_type ()) +#define G_TLS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_TLS_BACKEND, GTlsBackend)) +#define G_IS_TLS_BACKEND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_TLS_BACKEND)) +#define G_TLS_BACKEND_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_TLS_BACKEND, GTlsBackendInterface)) + +typedef struct _GTlsBackend GTlsBackend; +typedef struct _GTlsBackendInterface GTlsBackendInterface; + +/** + * GTlsBackendInterface: + * @g_iface: The parent interface. + * @supports_tls: returns whether the backend supports TLS. + * @get_default_database: returns a default #GTlsDatabase instance. + * @get_certificate_type: returns the #GTlsCertificate implementation type + * @get_client_connection_type: returns the #GTlsClientConnection implementation type + * @get_server_connection_type: returns the #GTlsServerConnection implementation type + * @get_file_database_type: returns the #GTlsFileDatabase implementation type. + * + * Provides an interface for describing TLS-related types. + * + * Since: 2.28 + */ +struct _GTlsBackendInterface +{ + GTypeInterface g_iface; + + /* methods */ + gboolean ( *supports_tls) (GTlsBackend *backend); + GType ( *get_certificate_type) (void); + GType ( *get_client_connection_type) (void); + GType ( *get_server_connection_type) (void); + GType ( *get_file_database_type) (void); + GTlsDatabase * ( *get_default_database) (GTlsBackend *backend); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_backend_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsBackend * g_tls_backend_get_default (void); + +GLIB_AVAILABLE_IN_ALL +GTlsDatabase * g_tls_backend_get_default_database (GTlsBackend *backend); + +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_backend_supports_tls (GTlsBackend *backend); + +GLIB_AVAILABLE_IN_ALL +GType g_tls_backend_get_certificate_type (GTlsBackend *backend); +GLIB_AVAILABLE_IN_ALL +GType g_tls_backend_get_client_connection_type (GTlsBackend *backend); +GLIB_AVAILABLE_IN_ALL +GType g_tls_backend_get_server_connection_type (GTlsBackend *backend); +GLIB_AVAILABLE_IN_ALL +GType g_tls_backend_get_file_database_type (GTlsBackend *backend); + +G_END_DECLS + +#endif /* __G_TLS_BACKEND_H__ */ diff --git a/gio/gtlscertificate.c b/gio/gtlscertificate.c new file mode 100644 index 0000000..ea5f1df --- /dev/null +++ b/gio/gtlscertificate.c @@ -0,0 +1,598 @@ +/* GIO - GLib Input, Output and Certificateing Library + * + * Copyright (C) 2010 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 "gtlscertificate.h" + +#include +#include "ginitable.h" +#include "gtlsbackend.h" +#include "gtlsconnection.h" +#include "glibintl.h" + +/** + * SECTION:gtlscertificate + * @title: GTlsCertificate + * @short_description: TLS certificate + * @see_also: #GTlsConnection + * + * A certificate used for TLS authentication and encryption. + * This can represent either a certificate only (eg, the certificate + * received by a client from a server), or the combination of + * a certificate and a private key (which is needed when acting as a + * #GTlsServerConnection). + * + * Since: 2.28 + */ + +/** + * GTlsCertificate: + * + * Abstract base class for TLS certificate types. + * + * Since: 2.28 + */ + +G_DEFINE_ABSTRACT_TYPE (GTlsCertificate, g_tls_certificate, G_TYPE_OBJECT); + +enum +{ + PROP_0, + + PROP_CERTIFICATE, + PROP_CERTIFICATE_PEM, + PROP_PRIVATE_KEY, + PROP_PRIVATE_KEY_PEM, + PROP_ISSUER +}; + +static void +g_tls_certificate_init (GTlsCertificate *cert) +{ +} + +static void +g_tls_certificate_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +g_tls_certificate_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +g_tls_certificate_class_init (GTlsCertificateClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + gobject_class->set_property = g_tls_certificate_set_property; + gobject_class->get_property = g_tls_certificate_get_property; + + /** + * GTlsCertificate:certificate: + * + * The DER (binary) encoded representation of the certificate. + * This property and the #GTlsCertificate:certificate-pem property + * represent the same data, just in different forms. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_CERTIFICATE, + g_param_spec_boxed ("certificate", + P_("Certificate"), + P_("The DER representation of the certificate"), + G_TYPE_BYTE_ARRAY, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsCertificate:certificate-pem: + * + * The PEM (ASCII) encoded representation of the certificate. + * This property and the #GTlsCertificate:certificate + * property represent the same data, just in different forms. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_CERTIFICATE_PEM, + g_param_spec_string ("certificate-pem", + P_("Certificate (PEM)"), + P_("The PEM representation of the certificate"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsCertificate:private-key: + * + * The DER (binary) encoded representation of the certificate's + * private key, in either PKCS#1 format or unencrypted PKCS#8 + * format. This property (or the #GTlsCertificate:private-key-pem + * property) can be set when constructing a key (eg, from a file), + * but cannot be read. + * + * PKCS#8 format is supported since 2.32; earlier releases only + * support PKCS#1. You can use the openssl rsa + * tool to convert PKCS#8 keys to PKCS#1. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY, + g_param_spec_boxed ("private-key", + P_("Private key"), + P_("The DER representation of the certificate's private key"), + G_TYPE_BYTE_ARRAY, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsCertificate:private-key-pem: + * + * The PEM (ASCII) encoded representation of the certificate's + * private key in either PKCS#1 format ("BEGIN RSA PRIVATE + * KEY") or unencrypted PKCS#8 format ("BEGIN + * PRIVATE KEY"). This property (or the + * #GTlsCertificate:private-key property) can be set when + * constructing a key (eg, from a file), but cannot be read. + * + * PKCS#8 format is supported since 2.32; earlier releases only + * support PKCS#1. You can use the openssl rsa + * tool to convert PKCS#8 keys to PKCS#1. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY_PEM, + g_param_spec_string ("private-key-pem", + P_("Private key (PEM)"), + P_("The PEM representation of the certificate's private key"), + NULL, + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsCertificate:issuer: + * + * A #GTlsCertificate representing the entity that issued this + * certificate. If %NULL, this means that the certificate is either + * self-signed, or else the certificate of the issuer is not + * available. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_ISSUER, + g_param_spec_object ("issuer", + P_("Issuer"), + P_("The certificate for the issuing entity"), + G_TYPE_TLS_CERTIFICATE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); +} + +static GTlsCertificate * +g_tls_certificate_new_internal (const gchar *certificate_pem, + const gchar *private_key_pem, + GError **error) +{ + GObject *cert; + GTlsBackend *backend; + + backend = g_tls_backend_get_default (); + + cert = g_initable_new (g_tls_backend_get_certificate_type (backend), + NULL, error, + "certificate-pem", certificate_pem, + "private-key-pem", private_key_pem, + NULL); + return G_TLS_CERTIFICATE (cert); +} + +#define PEM_CERTIFICATE_HEADER "-----BEGIN CERTIFICATE-----" +#define PEM_CERTIFICATE_FOOTER "-----END CERTIFICATE-----" +#define PEM_PKCS1_PRIVKEY_HEADER "-----BEGIN RSA PRIVATE KEY-----" +#define PEM_PKCS1_PRIVKEY_FOOTER "-----END RSA PRIVATE KEY-----" +#define PEM_PKCS8_PRIVKEY_HEADER "-----BEGIN PRIVATE KEY-----" +#define PEM_PKCS8_PRIVKEY_FOOTER "-----END PRIVATE KEY-----" +#define PEM_PKCS8_ENCRYPTED_HEADER "-----BEGIN ENCRYPTED PRIVATE KEY-----" +#define PEM_PKCS8_ENCRYPTED_FOOTER "-----END ENCRYPTED PRIVATE KEY-----" + +static gchar * +parse_private_key (const gchar *data, + gsize data_len, + gboolean required, + GError **error) +{ + const gchar *start, *end, *footer; + + start = g_strstr_len (data, data_len, PEM_PKCS1_PRIVKEY_HEADER); + if (start) + footer = PEM_PKCS1_PRIVKEY_FOOTER; + else + { + start = g_strstr_len (data, data_len, PEM_PKCS8_PRIVKEY_HEADER); + if (start) + footer = PEM_PKCS8_PRIVKEY_FOOTER; + else + { + start = g_strstr_len (data, data_len, PEM_PKCS8_ENCRYPTED_HEADER); + if (start) + { + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE, + _("Cannot decrypt PEM-encoded private key")); + } + else if (required) + { + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE, + _("No PEM-encoded private key found")); + } + return NULL; + } + } + + end = g_strstr_len (start, data_len - (data - start), footer); + if (!end) + { + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE, + _("Could not parse PEM-encoded private key")); + return NULL; + } + end += strlen (footer); + while (*end == '\r' || *end == '\n') + end++; + + return g_strndup (start, end - start); +} + + +static gchar * +parse_next_pem_certificate (const gchar **data, + const gchar *data_end, + gboolean required, + GError **error) +{ + const gchar *start, *end; + + start = g_strstr_len (*data, data_end - *data, PEM_CERTIFICATE_HEADER); + if (!start) + { + if (required) + { + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE, + _("No PEM-encoded certificate found")); + } + return NULL; + } + + end = g_strstr_len (start, data_end - start, PEM_CERTIFICATE_FOOTER); + if (!end) + { + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE, + _("Could not parse PEM-encoded certificate")); + return NULL; + } + end += strlen (PEM_CERTIFICATE_FOOTER); + while (*end == '\r' || *end == '\n') + end++; + + *data = end; + + return g_strndup (start, end - start); +} + +/** + * g_tls_certificate_new_from_pem: + * @data: PEM-encoded certificate data + * @length: the length of @data, or -1 if it's 0-terminated. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GTlsCertificate from the PEM-encoded data in @data. + * If @data includes both a certificate and a private key, then the + * returned certificate will include the private key data as well. (See + * the #GTlsCertificate:private-key-pem property for information about + * supported formats.) + * + * If @data includes multiple certificates, only the first one will be + * parsed. + * + * Return value: the new certificate, or %NULL if @data is invalid + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_certificate_new_from_pem (const gchar *data, + gssize length, + GError **error) +{ + const gchar *data_end; + gchar *key_pem, *cert_pem; + GTlsCertificate *cert; + + g_return_val_if_fail (data != NULL, NULL); + + if (length == -1) + length = strlen (data); + + data_end = data + length; + + key_pem = parse_private_key (data, length, FALSE, error); + if (error && *error) + return NULL; + + cert_pem = parse_next_pem_certificate (&data, data_end, TRUE, error); + if (error && *error) + { + g_free (key_pem); + return NULL; + } + + cert = g_tls_certificate_new_internal (cert_pem, key_pem, error); + g_free (key_pem); + g_free (cert_pem); + + return cert; +} + +/** + * g_tls_certificate_new_from_file: + * @file: file containing a PEM-encoded certificate to import + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a #GTlsCertificate from the PEM-encoded data in @file. If + * @file cannot be read or parsed, the function will return %NULL and + * set @error. Otherwise, this behaves like + * g_tls_certificate_new_from_pem(). + * + * Return value: the new certificate, or %NULL on error + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_certificate_new_from_file (const gchar *file, + GError **error) +{ + GTlsCertificate *cert; + gchar *contents; + gsize length; + + if (!g_file_get_contents (file, &contents, &length, error)) + return NULL; + + cert = g_tls_certificate_new_from_pem (contents, length, error); + g_free (contents); + return cert; +} + +/** + * g_tls_certificate_new_from_files: + * @cert_file: file containing a PEM-encoded certificate to import + * @key_file: file containing a PEM-encoded private key to import + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a #GTlsCertificate from the PEM-encoded data in @cert_file + * and @key_file. If either file cannot be read or parsed, the + * function will return %NULL and set @error. Otherwise, this behaves + * like g_tls_certificate_new_from_pem(). + * + * Return value: the new certificate, or %NULL on error + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_certificate_new_from_files (const gchar *cert_file, + const gchar *key_file, + GError **error) +{ + GTlsCertificate *cert; + gchar *cert_data, *key_data; + gsize cert_len, key_len; + gchar *cert_pem, *key_pem; + const gchar *p; + + if (!g_file_get_contents (cert_file, &cert_data, &cert_len, error)) + return NULL; + p = cert_data; + cert_pem = parse_next_pem_certificate (&p, p + cert_len, TRUE, error); + g_free (cert_data); + if (error && *error) + return NULL; + + if (!g_file_get_contents (key_file, &key_data, &key_len, error)) + { + g_free (cert_pem); + return NULL; + } + key_pem = parse_private_key (key_data, key_len, TRUE, error); + g_free (key_data); + if (error && *error) + { + g_free (cert_pem); + return NULL; + } + + cert = g_tls_certificate_new_internal (cert_pem, key_pem, error); + g_free (cert_pem); + g_free (key_pem); + return cert; +} + +/** + * g_tls_certificate_list_new_from_file: + * @file: file containing PEM-encoded certificates to import + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates one or more #GTlsCertificates from the PEM-encoded + * data in @file. If @file cannot be read or parsed, the function will + * return %NULL and set @error. If @file does not contain any + * PEM-encoded certificates, this will return an empty list and not + * set @error. + * + * Return value: (element-type Gio.TlsCertificate) (transfer full): a + * #GList containing #GTlsCertificate objects. You must free the list + * and its contents when you are done with it. + * + * Since: 2.28 + */ +GList * +g_tls_certificate_list_new_from_file (const gchar *file, + GError **error) +{ + GQueue queue = G_QUEUE_INIT; + gchar *contents, *end; + const gchar *p; + gsize length; + + if (!g_file_get_contents (file, &contents, &length, error)) + return NULL; + + end = contents + length; + p = contents; + while (p && *p) + { + gchar *cert_pem; + GTlsCertificate *cert = NULL; + + cert_pem = parse_next_pem_certificate (&p, end, FALSE, error); + if (cert_pem) + { + cert = g_tls_certificate_new_internal (cert_pem, NULL, error); + g_free (cert_pem); + } + if (!cert) + { + g_list_free_full (queue.head, g_object_unref); + queue.head = NULL; + break; + } + g_queue_push_tail (&queue, cert); + } + + g_free (contents); + return queue.head; +} + + +/** + * g_tls_certificate_get_issuer: + * @cert: a #GTlsCertificate + * + * Gets the #GTlsCertificate representing @cert's issuer, if known + * + * Return value: (transfer none): The certificate of @cert's issuer, + * or %NULL if @cert is self-signed or signed with an unknown + * certificate. + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_certificate_get_issuer (GTlsCertificate *cert) +{ + GTlsCertificate *issuer; + + g_object_get (G_OBJECT (cert), "issuer", &issuer, NULL); + if (issuer) + g_object_unref (issuer); + + return issuer; +} + +/** + * g_tls_certificate_verify: + * @cert: a #GTlsCertificate + * @identity: (allow-none): the expected peer identity + * @trusted_ca: (allow-none): the certificate of a trusted authority + * + * This verifies @cert and returns a set of #GTlsCertificateFlags + * indicating any problems found with it. This can be used to verify a + * certificate outside the context of making a connection, or to + * check a certificate against a CA that is not part of the system + * CA database. + * + * If @identity is not %NULL, @cert's name(s) will be compared against + * it, and %G_TLS_CERTIFICATE_BAD_IDENTITY will be set in the return + * value if it does not match. If @identity is %NULL, that bit will + * never be set in the return value. + * + * If @trusted_ca is not %NULL, then @cert (or one of the certificates + * in its chain) must be signed by it, or else + * %G_TLS_CERTIFICATE_UNKNOWN_CA will be set in the return value. If + * @trusted_ca is %NULL, that bit will never be set in the return + * value. + * + * (All other #GTlsCertificateFlags values will always be set or unset + * as appropriate.) + * + * Return value: the appropriate #GTlsCertificateFlags + * + * Since: 2.28 + */ +GTlsCertificateFlags +g_tls_certificate_verify (GTlsCertificate *cert, + GSocketConnectable *identity, + GTlsCertificate *trusted_ca) +{ + return G_TLS_CERTIFICATE_GET_CLASS (cert)->verify (cert, identity, trusted_ca); +} + +/** + * g_tls_certificate_is_same: + * @cert_one: first certificate to compare + * @cert_two: second certificate to compare + * + * Check if two #GTlsCertificate objects represent the same certificate. + * The raw DER byte data of the two certificates are checked for equality. + * This has the effect that two certificates may compare equal even if + * their #GTlsCertificate:issuer, #GTlsCertificate:private-key, or + * #GTlsCertificate:private-key-pem properties differ. + * + * Return value: whether the same or not + * + * Since: 2.34 + */ +gboolean +g_tls_certificate_is_same (GTlsCertificate *cert_one, + GTlsCertificate *cert_two) +{ + GByteArray *b1, *b2; + gboolean equal; + + g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert_one), FALSE); + g_return_val_if_fail (G_IS_TLS_CERTIFICATE (cert_two), FALSE); + + g_object_get (cert_one, "certificate", &b1, NULL); + g_object_get (cert_two, "certificate", &b2, NULL); + + equal = (b1->len == b2->len && + memcmp (b1->data, b2->data, b1->len) == 0); + + g_byte_array_unref (b1); + g_byte_array_unref (b2); + + return equal; +} diff --git a/gio/gtlscertificate.h b/gio/gtlscertificate.h new file mode 100644 index 0000000..dd6c3a1 --- /dev/null +++ b/gio/gtlscertificate.h @@ -0,0 +1,94 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_TLS_CERTIFICATE_H__ +#define __G_TLS_CERTIFICATE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_CERTIFICATE (g_tls_certificate_get_type ()) +#define G_TLS_CERTIFICATE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_CERTIFICATE, GTlsCertificate)) +#define G_TLS_CERTIFICATE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TLS_CERTIFICATE, GTlsCertificateClass)) +#define G_IS_TLS_CERTIFICATE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_CERTIFICATE)) +#define G_IS_TLS_CERTIFICATE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TLS_CERTIFICATE)) +#define G_TLS_CERTIFICATE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), G_TYPE_TLS_CERTIFICATE, GTlsCertificateClass)) + +typedef struct _GTlsCertificateClass GTlsCertificateClass; +typedef struct _GTlsCertificatePrivate GTlsCertificatePrivate; + +struct _GTlsCertificate { + GObject parent_instance; + + GTlsCertificatePrivate *priv; +}; + +struct _GTlsCertificateClass +{ + GObjectClass parent_class; + + GTlsCertificateFlags (* verify) (GTlsCertificate *cert, + GSocketConnectable *identity, + GTlsCertificate *trusted_ca); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_certificate_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_certificate_new_from_pem (const gchar *data, + gssize length, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_certificate_new_from_file (const gchar *file, + GError **error); +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_certificate_new_from_files (const gchar *cert_file, + const gchar *key_file, + GError **error); +GLIB_AVAILABLE_IN_ALL +GList *g_tls_certificate_list_new_from_file (const gchar *file, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_certificate_get_issuer (GTlsCertificate *cert); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_tls_certificate_verify (GTlsCertificate *cert, + GSocketConnectable *identity, + GTlsCertificate *trusted_ca); + +GLIB_AVAILABLE_IN_2_34 +gboolean g_tls_certificate_is_same (GTlsCertificate *cert_one, + GTlsCertificate *cert_two); + +G_END_DECLS + +#endif /* __G_TLS_CERTIFICATE_H__ */ diff --git a/gio/gtlsclientconnection.c b/gio/gtlsclientconnection.c new file mode 100644 index 0000000..8dbae1e --- /dev/null +++ b/gio/gtlsclientconnection.c @@ -0,0 +1,337 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 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 "gtlsclientconnection.h" +#include "ginitable.h" +#include "gioenumtypes.h" +#include "gsocket.h" +#include "gsocketconnectable.h" +#include "gtlsbackend.h" +#include "gtlscertificate.h" +#include "glibintl.h" + +/** + * SECTION:gtlsclientconnection + * @short_description: TLS client-side connection + * @include: gio/gio.h + * + * #GTlsClientConnection is the client-side subclass of + * #GTlsConnection, representing a client-side TLS connection. + */ + +/** + * GTlsClientConnection: + * + * Abstract base class for the backend-specific client connection + * type. + * + * Since: 2.28 + */ + +G_DEFINE_INTERFACE (GTlsClientConnection, g_tls_client_connection, G_TYPE_TLS_CONNECTION) + +static void +g_tls_client_connection_default_init (GTlsClientConnectionInterface *iface) +{ + /** + * GTlsClientConnection:validation-flags: + * + * What steps to perform when validating a certificate received from + * a server. Server certificates that fail to validate in all of the + * ways indicated here will be rejected unless the application + * overrides the default via #GTlsConnection::accept-certificate. + * + * Since: 2.28 + */ + g_object_interface_install_property (iface, + g_param_spec_flags ("validation-flags", + P_("Validation flags"), + P_("What certificate validation to perform"), + G_TYPE_TLS_CERTIFICATE_FLAGS, + G_TLS_CERTIFICATE_VALIDATE_ALL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + /** + * GTlsClientConnection:server-identity: + * + * A #GSocketConnectable describing the identity of the server that + * is expected on the other end of the connection. + * + * If the %G_TLS_CERTIFICATE_BAD_IDENTITY flag is set in + * #GTlsClientConnection:validation-flags, this object will be used + * to determine the expected identify of the remote end of the + * connection; if #GTlsClientConnection:server-identity is not set, + * or does not match the identity presented by the server, then the + * %G_TLS_CERTIFICATE_BAD_IDENTITY validation will fail. + * + * In addition to its use in verifying the server certificate, + * this is also used to give a hint to the server about what + * certificate we expect, which is useful for servers that serve + * virtual hosts. + * + * Since: 2.28 + */ + g_object_interface_install_property (iface, + g_param_spec_object ("server-identity", + P_("Server identity"), + P_("GSocketConnectable identifying the server"), + G_TYPE_SOCKET_CONNECTABLE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + /** + * GTlsClientConnection:use-ssl3: + * + * If %TRUE, tells the connection to use SSL 3.0 rather than trying + * to negotiate the best version of TLS or SSL to use. This can be + * used when talking to servers that don't implement version + * negotiation correctly and therefore refuse to handshake at all with + * a "modern" TLS handshake. + * + * Since: 2.28 + */ + g_object_interface_install_property (iface, + g_param_spec_boolean ("use-ssl3", + P_("Use SSL3"), + P_("Use SSL 3.0 rather than trying to use TLS 1.x"), + FALSE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + + /** + * GTlsClientConnection:accepted-cas: + * + * A list of the distinguished names of the Certificate Authorities + * that the server will accept client certificates signed by. If the + * server requests a client certificate during the handshake, then + * this property will be set after the handshake completes. + * + * Each item in the list is a #GByteArray which contains the complete + * subject DN of the certificate authority. + * + * Since: 2.28 + */ + g_object_interface_install_property (iface, + g_param_spec_pointer ("accepted-cas", + P_("Accepted CAs"), + P_("Distinguished names of the CAs the server accepts certificates from"), + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_tls_client_connection_new: + * @base_io_stream: the #GIOStream to wrap + * @server_identity: (allow-none): the expected identity of the server + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GTlsClientConnection wrapping @base_io_stream (which + * must have pollable input and output streams) which is assumed to + * communicate with the server identified by @server_identity. + * + * Return value: (transfer full) (type GTlsClientConnection): the new + * #GTlsClientConnection, or %NULL on error + * + * Since: 2.28 + */ +GIOStream * +g_tls_client_connection_new (GIOStream *base_io_stream, + GSocketConnectable *server_identity, + GError **error) +{ + GObject *conn; + GTlsBackend *backend; + + backend = g_tls_backend_get_default (); + conn = g_initable_new (g_tls_backend_get_client_connection_type (backend), + NULL, error, + "base-io-stream", base_io_stream, + "server-identity", server_identity, + NULL); + return G_IO_STREAM (conn); +} + +/** + * g_tls_client_connection_get_validation_flags: + * @conn: the #GTlsClientConnection + * + * Gets @conn's validation flags + * + * Return value: the validation flags + * + * Since: 2.28 + */ +GTlsCertificateFlags +g_tls_client_connection_get_validation_flags (GTlsClientConnection *conn) +{ + GTlsCertificateFlags flags = 0; + + g_return_val_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn), 0); + + g_object_get (G_OBJECT (conn), "validation-flags", &flags, NULL); + return flags; +} + +/** + * g_tls_client_connection_set_validation_flags: + * @conn: the #GTlsClientConnection + * @flags: the #GTlsCertificateFlags to use + * + * Sets @conn's validation flags, to override the default set of + * checks performed when validating a server certificate. By default, + * %G_TLS_CERTIFICATE_VALIDATE_ALL is used. + * + * Since: 2.28 + */ +void +g_tls_client_connection_set_validation_flags (GTlsClientConnection *conn, + GTlsCertificateFlags flags) +{ + g_return_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), "validation-flags", flags, NULL); +} + +/** + * g_tls_client_connection_get_server_identity: + * @conn: the #GTlsClientConnection + * + * Gets @conn's expected server identity + * + * Return value: (transfer none): a #GSocketConnectable describing the + * expected server identity, or %NULL if the expected identity is not + * known. + * + * Since: 2.28 + */ +GSocketConnectable * +g_tls_client_connection_get_server_identity (GTlsClientConnection *conn) +{ + GSocketConnectable *identity = NULL; + + g_return_val_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn), 0); + + g_object_get (G_OBJECT (conn), "server-identity", &identity, NULL); + if (identity) + g_object_unref (identity); + return identity; +} + +/** + * g_tls_client_connection_set_server_identity: + * @conn: the #GTlsClientConnection + * @identity: a #GSocketConnectable describing the expected server identity + * + * Sets @conn's expected server identity, which is used both to tell + * servers on virtual hosts which certificate to present, and also + * to let @conn know what name to look for in the certificate when + * performing %G_TLS_CERTIFICATE_BAD_IDENTITY validation, if enabled. + * + * Since: 2.28 + */ +void +g_tls_client_connection_set_server_identity (GTlsClientConnection *conn, + GSocketConnectable *identity) +{ + g_return_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), "server-identity", identity, NULL); +} + +/** + * g_tls_client_connection_get_use_ssl3: + * @conn: the #GTlsClientConnection + * + * Gets whether @conn will use SSL 3.0 rather than the + * highest-supported version of TLS; see + * g_tls_client_connection_set_use_ssl3(). + * + * Return value: whether @conn will use SSL 3.0 + * + * Since: 2.28 + */ +gboolean +g_tls_client_connection_get_use_ssl3 (GTlsClientConnection *conn) +{ + gboolean use_ssl3 = FALSE; + + g_return_val_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn), 0); + + g_object_get (G_OBJECT (conn), "use-ssl3", &use_ssl3, NULL); + return use_ssl3; +} + +/** + * g_tls_client_connection_set_use_ssl3: + * @conn: the #GTlsClientConnection + * @use_ssl3: whether to use SSL 3.0 + * + * If @use_ssl3 is %TRUE, this forces @conn to use SSL 3.0 rather than + * trying to properly negotiate the right version of TLS or SSL to use. + * This can be used when talking to servers that do not implement the + * fallbacks correctly and which will therefore fail to handshake with + * a "modern" TLS handshake attempt. + * + * Since: 2.28 + */ +void +g_tls_client_connection_set_use_ssl3 (GTlsClientConnection *conn, + gboolean use_ssl3) +{ + g_return_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), "use-ssl3", use_ssl3, NULL); +} + +/** + * g_tls_client_connection_get_accepted_cas: + * @conn: the #GTlsClientConnection + * + * Gets the list of distinguished names of the Certificate Authorities + * that the server will accept certificates from. This will be set + * during the TLS handshake if the server requests a certificate. + * Otherwise, it will be %NULL. + * + * Each item in the list is a #GByteArray which contains the complete + * subject DN of the certificate authority. + * + * Return value: (element-type GByteArray) (transfer full): the list of + * CA DNs. You should unref each element with g_byte_array_unref() and then + * the free the list with g_list_free(). + * + * Since: 2.28 + */ +GList * +g_tls_client_connection_get_accepted_cas (GTlsClientConnection *conn) +{ + GList *accepted_cas = NULL; + + g_return_val_if_fail (G_IS_TLS_CLIENT_CONNECTION (conn), NULL); + + g_object_get (G_OBJECT (conn), "accepted-cas", &accepted_cas, NULL); + return accepted_cas; +} diff --git a/gio/gtlsclientconnection.h b/gio/gtlsclientconnection.h new file mode 100644 index 0000000..aa216f4 --- /dev/null +++ b/gio/gtlsclientconnection.h @@ -0,0 +1,73 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_TLS_CLIENT_CONNECTION_H__ +#define __G_TLS_CLIENT_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_CLIENT_CONNECTION (g_tls_client_connection_get_type ()) +#define G_TLS_CLIENT_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_CLIENT_CONNECTION, GTlsClientConnection)) +#define G_IS_TLS_CLIENT_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_CLIENT_CONNECTION)) +#define G_TLS_CLIENT_CONNECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TLS_CLIENT_CONNECTION, GTlsClientConnectionInterface)) + +typedef struct _GTlsClientConnectionInterface GTlsClientConnectionInterface; + +struct _GTlsClientConnectionInterface +{ + GTypeInterface g_iface; + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_client_connection_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GIOStream * g_tls_client_connection_new (GIOStream *base_io_stream, + GSocketConnectable *server_identity, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_tls_client_connection_get_validation_flags (GTlsClientConnection *conn); +GLIB_AVAILABLE_IN_ALL +void g_tls_client_connection_set_validation_flags (GTlsClientConnection *conn, + GTlsCertificateFlags flags); +GLIB_AVAILABLE_IN_ALL +GSocketConnectable *g_tls_client_connection_get_server_identity (GTlsClientConnection *conn); +GLIB_AVAILABLE_IN_ALL +void g_tls_client_connection_set_server_identity (GTlsClientConnection *conn, + GSocketConnectable *identity); +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_client_connection_get_use_ssl3 (GTlsClientConnection *conn); +GLIB_AVAILABLE_IN_ALL +void g_tls_client_connection_set_use_ssl3 (GTlsClientConnection *conn, + gboolean use_ssl3); +GLIB_AVAILABLE_IN_ALL +GList * g_tls_client_connection_get_accepted_cas (GTlsClientConnection *conn); + +G_END_DECLS + +#endif /* __G_TLS_CLIENT_CONNECTION_H__ */ diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c new file mode 100644 index 0000000..b6da848 --- /dev/null +++ b/gio/gtlsconnection.c @@ -0,0 +1,860 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 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 "gtlsconnection.h" +#include "gcancellable.h" +#include "gioenumtypes.h" +#include "gsocket.h" +#include "gtlsbackend.h" +#include "gtlscertificate.h" +#include "gtlsclientconnection.h" +#include "gtlsdatabase.h" +#include "gtlsinteraction.h" +#include "glibintl.h" + +/** + * SECTION:gtlsconnection + * @short_description: TLS connection type + * @include: gio/gio.h + * + * #GTlsConnection is the base TLS connection class type, which wraps + * a #GIOStream and provides TLS encryption on top of it. Its + * subclasses, #GTlsClientConnection and #GTlsServerConnection, + * implement client-side and server-side TLS, respectively. + * + * Since: 2.28 + */ + +/** + * GTlsConnection: + * + * Abstract base class for the backend-specific #GTlsClientConnection + * and #GTlsServerConnection types. + * + * Since: 2.28 + */ + +G_DEFINE_ABSTRACT_TYPE (GTlsConnection, g_tls_connection, G_TYPE_IO_STREAM) + +static void g_tls_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void g_tls_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +enum { + ACCEPT_CERTIFICATE, + + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +enum { + PROP_0, + PROP_BASE_IO_STREAM, + PROP_REQUIRE_CLOSE_NOTIFY, + PROP_REHANDSHAKE_MODE, + PROP_USE_SYSTEM_CERTDB, + PROP_DATABASE, + PROP_INTERACTION, + PROP_CERTIFICATE, + PROP_PEER_CERTIFICATE, + PROP_PEER_CERTIFICATE_ERRORS +}; + +static void +g_tls_connection_class_init (GTlsConnectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->get_property = g_tls_connection_get_property; + gobject_class->set_property = g_tls_connection_set_property; + + /** + * GTlsConnection:base-io-stream: + * + * The #GIOStream that the connection wraps + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_BASE_IO_STREAM, + g_param_spec_object ("base-io-stream", + P_("Base IOStream"), + P_("The GIOStream that the connection wraps"), + G_TYPE_IO_STREAM, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:use-system-certdb: + * + * Whether or not the system certificate database will be used to + * verify peer certificates. See + * g_tls_connection_set_use_system_certdb(). + * + * Deprecated: 2.30: Use GTlsConnection:database instead + */ + g_object_class_install_property (gobject_class, PROP_USE_SYSTEM_CERTDB, + g_param_spec_boolean ("use-system-certdb", + P_("Use system certificate database"), + P_("Whether to verify peer certificates against the system certificate database"), + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:database: + * + * The certificate database to use when verifying this TLS connection. + * If no cerificate database is set, then the default database will be + * used. See g_tls_backend_get_default_database(). + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, PROP_DATABASE, + g_param_spec_object ("database", + P_("Database"), + P_("Certificate database to use for looking up or verifying certificates"), + G_TYPE_TLS_DATABASE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:interaction: + * + * A #GTlsInteraction object to be used when the connection or certificate + * database need to interact with the user. This will be used to prompt the + * user for passwords where necessary. + * + * Since: 2.30 + */ + g_object_class_install_property (gobject_class, PROP_INTERACTION, + g_param_spec_object ("interaction", + P_("Interaction"), + P_("Optional object for user interaction"), + G_TYPE_TLS_INTERACTION, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:require-close-notify: + * + * Whether or not proper TLS close notification is required. + * See g_tls_connection_set_require_close_notify(). + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_REQUIRE_CLOSE_NOTIFY, + g_param_spec_boolean ("require-close-notify", + P_("Require close notify"), + P_("Whether to require proper TLS close notification"), + TRUE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:rehandshake-mode: + * + * The rehandshaking mode. See + * g_tls_connection_set_rehandshake_mode(). + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_REHANDSHAKE_MODE, + g_param_spec_enum ("rehandshake-mode", + P_("Rehandshake mode"), + P_("When to allow rehandshaking"), + G_TYPE_TLS_REHANDSHAKE_MODE, + G_TLS_REHANDSHAKE_SAFELY, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:certificate: + * + * The connection's certificate; see + * g_tls_connection_set_certificate(). + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_CERTIFICATE, + g_param_spec_object ("certificate", + P_("Certificate"), + P_("The connection's certificate"), + G_TYPE_TLS_CERTIFICATE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:peer-certificate: + * + * The connection's peer's certificate, after the TLS handshake has + * completed and the certificate has been accepted. Note in + * particular that this is not yet set during the emission of + * #GTlsConnection::accept-certificate. + * + * (You can watch for a #GObject::notify signal on this property to + * detect when a handshake has occurred.) + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_PEER_CERTIFICATE, + g_param_spec_object ("peer-certificate", + P_("Peer Certificate"), + P_("The connection's peer's certificate"), + G_TYPE_TLS_CERTIFICATE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + /** + * GTlsConnection:peer-certificate-errors: + * + * The errors noticed-and-ignored while verifying + * #GTlsConnection:peer-certificate. Normally this should be 0, but + * it may not be if #GTlsClientConnection:validation-flags is not + * %G_TLS_CERTIFICATE_VALIDATE_ALL, or if + * #GTlsConnection::accept-certificate overrode the default + * behavior. + * + * Since: 2.28 + */ + g_object_class_install_property (gobject_class, PROP_PEER_CERTIFICATE_ERRORS, + g_param_spec_flags ("peer-certificate-errors", + P_("Peer Certificate Errors"), + P_("Errors found with the peer's certificate"), + G_TYPE_TLS_CERTIFICATE_FLAGS, + 0, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + /** + * GTlsConnection::accept-certificate: + * @conn: a #GTlsConnection + * @peer_cert: the peer's #GTlsCertificate + * @errors: the problems with @peer_cert. + * + * Emitted during the TLS handshake after the peer certificate has + * been received. You can examine @peer_cert's certification path by + * calling g_tls_certificate_get_issuer() on it. + * + * For a client-side connection, @peer_cert is the server's + * certificate, and the signal will only be emitted if the + * certificate was not acceptable according to @conn's + * #GTlsClientConnection:validation_flags. If you would like the + * certificate to be accepted despite @errors, return %TRUE from the + * signal handler. Otherwise, if no handler accepts the certificate, + * the handshake will fail with %G_TLS_ERROR_BAD_CERTIFICATE. + * + * For a server-side connection, @peer_cert is the certificate + * presented by the client, if this was requested via the server's + * #GTlsServerConnection:authentication_mode. On the server side, + * the signal is always emitted when the client presents a + * certificate, and the certificate will only be accepted if a + * handler returns %TRUE. + * + * Note that if this signal is emitted as part of asynchronous I/O + * in the main thread, then you should not attempt to interact with + * the user before returning from the signal handler. If you want to + * let the user decide whether or not to accept the certificate, you + * would have to return %FALSE from the signal handler on the first + * attempt, and then after the connection attempt returns a + * %G_TLS_ERROR_HANDSHAKE, you can interact with the user, and if + * the user decides to accept the certificate, remember that fact, + * create a new connection, and return %TRUE from the signal handler + * the next time. + * + * If you are doing I/O in another thread, you do not + * need to worry about this, and can simply block in the signal + * handler until the UI thread returns an answer. + * + * Return value: %TRUE to accept @peer_cert (which will also + * immediately end the signal emission). %FALSE to allow the signal + * emission to continue, which will cause the handshake to fail if + * no one else overrides it. + * + * Since: 2.28 + */ + signals[ACCEPT_CERTIFICATE] = + g_signal_new (I_("accept-certificate"), + G_TYPE_TLS_CONNECTION, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GTlsConnectionClass, accept_certificate), + g_signal_accumulator_true_handled, NULL, + NULL, + G_TYPE_BOOLEAN, 2, + G_TYPE_TLS_CERTIFICATE, + G_TYPE_TLS_CERTIFICATE_FLAGS); +} + +static void +g_tls_connection_init (GTlsConnection *conn) +{ +} + +static void +g_tls_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +static void +g_tls_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +} + +/** + * g_tls_connection_set_use_system_certdb: + * @conn: a #GTlsConnection + * @use_system_certdb: whether to use the system certificate database + * + * Sets whether @conn uses the system certificate database to verify + * peer certificates. This is %TRUE by default. If set to %FALSE, then + * peer certificate validation will always set the + * %G_TLS_CERTIFICATE_UNKNOWN_CA error (meaning + * #GTlsConnection::accept-certificate will always be emitted on + * client-side connections, unless that bit is not set in + * #GTlsClientConnection:validation-flags). + * + * Deprecated: 2.30: Use g_tls_connection_set_database() instead + */ +void +g_tls_connection_set_use_system_certdb (GTlsConnection *conn, + gboolean use_system_certdb) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), + "use-system-certdb", use_system_certdb, + NULL); +} + +/** + * g_tls_connection_get_use_system_certdb: + * @conn: a #GTlsConnection + * + * Gets whether @conn uses the system certificate database to verify + * peer certificates. See g_tls_connection_set_use_system_certdb(). + * + * Return value: whether @conn uses the system certificate database + * + * Deprecated: 2.30: Use g_tls_connection_get_database() instead + */ +gboolean +g_tls_connection_get_use_system_certdb (GTlsConnection *conn) +{ + gboolean use_system_certdb; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), TRUE); + + g_object_get (G_OBJECT (conn), + "use-system-certdb", &use_system_certdb, + NULL); + return use_system_certdb; +} + +/** + * g_tls_connection_set_database: + * @conn: a #GTlsConnection + * @database: a #GTlsDatabase + * + * Sets the certificate database that is used to verify peer certificates. + * This is set to the default database by default. See + * g_tls_backend_get_default_database(). If set to %NULL, then + * peer certificate validation will always set the + * %G_TLS_CERTIFICATE_UNKNOWN_CA error (meaning + * #GTlsConnection::accept-certificate will always be emitted on + * client-side connections, unless that bit is not set in + * #GTlsClientConnection:validation-flags). + * + * Since: 2.30 + */ +void +g_tls_connection_set_database (GTlsConnection *conn, + GTlsDatabase *database) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + g_return_if_fail (database == NULL || G_IS_TLS_DATABASE (database)); + + g_object_set (G_OBJECT (conn), + "database", database, + NULL); +} + +/** + * g_tls_connection_get_database: + * @conn: a #GTlsConnection + * + * Gets the certificate database that @conn uses to verify + * peer certificates. See g_tls_connection_set_database(). + * + * Return value: (transfer none): the certificate database that @conn uses or %NULL + * + * Since: 2.30 + */ +GTlsDatabase* +g_tls_connection_get_database (GTlsConnection *conn) +{ + GTlsDatabase *database = NULL; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL); + + g_object_get (G_OBJECT (conn), + "database", &database, + NULL); + if (database) + g_object_unref (database); + return database; +} + +/** + * g_tls_connection_set_certificate: + * @conn: a #GTlsConnection + * @certificate: the certificate to use for @conn + * + * This sets the certificate that @conn will present to its peer + * during the TLS handshake. For a #GTlsServerConnection, it is + * mandatory to set this, and that will normally be done at construct + * time. + * + * For a #GTlsClientConnection, this is optional. If a handshake fails + * with %G_TLS_ERROR_CERTIFICATE_REQUIRED, that means that the server + * requires a certificate, and if you try connecting again, you should + * call this method first. You can call + * g_tls_client_connection_get_accepted_cas() on the failed connection + * to get a list of Certificate Authorities that the server will + * accept certificates from. + * + * (It is also possible that a server will allow the connection with + * or without a certificate; in that case, if you don't provide a + * certificate, you can tell that the server requested one by the fact + * that g_tls_client_connection_get_accepted_cas() will return + * non-%NULL.) + * + * Since: 2.28 + */ +void +g_tls_connection_set_certificate (GTlsConnection *conn, + GTlsCertificate *certificate) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + g_return_if_fail (G_IS_TLS_CERTIFICATE (certificate)); + + g_object_set (G_OBJECT (conn), "certificate", certificate, NULL); +} + +/** + * g_tls_connection_get_certificate: + * @conn: a #GTlsConnection + * + * Gets @conn's certificate, as set by + * g_tls_connection_set_certificate(). + * + * Return value: (transfer none): @conn's certificate, or %NULL + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_connection_get_certificate (GTlsConnection *conn) +{ + GTlsCertificate *certificate; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL); + + g_object_get (G_OBJECT (conn), "certificate", &certificate, NULL); + if (certificate) + g_object_unref (certificate); + + return certificate; +} + +/** + * g_tls_connection_set_interaction: + * @conn: a connection + * @interaction: (allow-none): an interaction object, or %NULL + * + * Set the object that will be used to interact with the user. It will be used + * for things like prompting the user for passwords. + * + * The @interaction argument will normally be a derived subclass of + * #GTlsInteraction. %NULL can also be provided if no user interaction + * should occur for this connection. + * + * Since: 2.30 + */ +void +g_tls_connection_set_interaction (GTlsConnection *conn, + GTlsInteraction *interaction) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + + g_object_set (G_OBJECT (conn), "interaction", interaction, NULL); +} + +/** + * g_tls_connection_get_interaction: + * @conn: a connection + * + * Get the object that will be used to interact with the user. It will be used + * for things like prompting the user for passwords. If %NULL is returned, then + * no user interaction will occur for this connection. + * + * Returns: (transfer none): The interaction object. + * + * Since: 2.30 + */ +GTlsInteraction * +g_tls_connection_get_interaction (GTlsConnection *conn) +{ + GTlsInteraction *interaction = NULL; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL); + + g_object_get (G_OBJECT (conn), "interaction", &interaction, NULL); + if (interaction) + g_object_unref (interaction); + + return interaction; +} + +/** + * g_tls_connection_get_peer_certificate: + * @conn: a #GTlsConnection + * + * Gets @conn's peer's certificate after the handshake has completed. + * (It is not set during the emission of + * #GTlsConnection::accept-certificate.) + * + * Return value: (transfer none): @conn's peer's certificate, or %NULL + * + * Since: 2.28 + */ +GTlsCertificate * +g_tls_connection_get_peer_certificate (GTlsConnection *conn) +{ + GTlsCertificate *peer_certificate; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), NULL); + + g_object_get (G_OBJECT (conn), "peer-certificate", &peer_certificate, NULL); + if (peer_certificate) + g_object_unref (peer_certificate); + + return peer_certificate; +} + +/** + * g_tls_connection_get_peer_certificate_errors: + * @conn: a #GTlsConnection + * + * Gets the errors associated with validating @conn's peer's + * certificate, after the handshake has completed. (It is not set + * during the emission of #GTlsConnection::accept-certificate.) + * + * Return value: @conn's peer's certificate errors + * + * Since: 2.28 + */ +GTlsCertificateFlags +g_tls_connection_get_peer_certificate_errors (GTlsConnection *conn) +{ + GTlsCertificateFlags errors; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), 0); + + g_object_get (G_OBJECT (conn), "peer-certificate-errors", &errors, NULL); + return errors; +} + +/** + * g_tls_connection_set_require_close_notify: + * @conn: a #GTlsConnection + * @require_close_notify: whether or not to require close notification + * + * Sets whether or not @conn expects a proper TLS close notification + * before the connection is closed. If this is %TRUE (the default), + * then @conn will expect to receive a TLS close notification from its + * peer before the connection is closed, and will return a + * %G_TLS_ERROR_EOF error if the connection is closed without proper + * notification (since this may indicate a network error, or + * man-in-the-middle attack). + * + * In some protocols, the application will know whether or not the + * connection was closed cleanly based on application-level data + * (because the application-level data includes a length field, or is + * somehow self-delimiting); in this case, the close notify is + * redundant and sometimes omitted. (TLS 1.1 explicitly allows this; + * in TLS 1.0 it is technically an error, but often done anyway.) You + * can use g_tls_connection_set_require_close_notify() to tell @conn + * to allow an "unannounced" connection close, in which case the close + * will show up as a 0-length read, as in a non-TLS + * #GSocketConnection, and it is up to the application to check that + * the data has been fully received. + * + * Note that this only affects the behavior when the peer closes the + * connection; when the application calls g_io_stream_close() itself + * on @conn, this will send a close notification regardless of the + * setting of this property. If you explicitly want to do an unclean + * close, you can close @conn's #GTlsConnection:base-io-stream rather + * than closing @conn itself. + * + * Since: 2.28 + */ +void +g_tls_connection_set_require_close_notify (GTlsConnection *conn, + gboolean require_close_notify) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), + "require-close-notify", require_close_notify, + NULL); +} + +/** + * g_tls_connection_get_require_close_notify: + * @conn: a #GTlsConnection + * + * Tests whether or not @conn expects a proper TLS close notification + * when the connection is closed. See + * g_tls_connection_set_require_close_notify() for details. + * + * Return value: %TRUE if @conn requires a proper TLS close + * notification. + * + * Since: 2.28 + */ +gboolean +g_tls_connection_get_require_close_notify (GTlsConnection *conn) +{ + gboolean require_close_notify; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), TRUE); + + g_object_get (G_OBJECT (conn), + "require-close-notify", &require_close_notify, + NULL); + return require_close_notify; +} + +/** + * g_tls_connection_set_rehandshake_mode: + * @conn: a #GTlsConnection + * @mode: the rehandshaking mode + * + * Sets how @conn behaves with respect to rehandshaking requests. + * + * %G_TLS_REHANDSHAKE_NEVER means that it will never agree to + * rehandshake after the initial handshake is complete. (For a client, + * this means it will refuse rehandshake requests from the server, and + * for a server, this means it will close the connection with an error + * if the client attempts to rehandshake.) + * + * %G_TLS_REHANDSHAKE_SAFELY means that the connection will allow a + * rehandshake only if the other end of the connection supports the + * TLS renegotiation_info extension. This is the + * default behavior, but means that rehandshaking will not work + * against older implementations that do not support that extension. + * + * %G_TLS_REHANDSHAKE_UNSAFELY means that the connection will allow + * rehandshaking even without the + * renegotiation_info extension. On the server side + * in particular, this is not recommended, since it leaves the server + * open to certain attacks. However, this mode is necessary if you + * need to allow renegotiation with older client software. + * + * Since: 2.28 + */ +void +g_tls_connection_set_rehandshake_mode (GTlsConnection *conn, + GTlsRehandshakeMode mode) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + + g_object_set (G_OBJECT (conn), + "rehandshake-mode", mode, + NULL); +} + +/** + * g_tls_connection_get_rehandshake_mode: + * @conn: a #GTlsConnection + * + * Gets @conn rehandshaking mode. See + * g_tls_connection_set_rehandshake_mode() for details. + * + * Return value: @conn's rehandshaking mode + * + * Since: 2.28 + */ +GTlsRehandshakeMode +g_tls_connection_get_rehandshake_mode (GTlsConnection *conn) +{ + GTlsRehandshakeMode mode; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), G_TLS_REHANDSHAKE_NEVER); + + g_object_get (G_OBJECT (conn), + "rehandshake-mode", &mode, + NULL); + return mode; +} + +/** + * g_tls_connection_handshake: + * @conn: a #GTlsConnection + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: a #GError, or %NULL + * + * Attempts a TLS handshake on @conn. + * + * On the client side, it is never necessary to call this method; + * although the connection needs to perform a handshake after + * connecting (or after sending a "STARTTLS"-type command) and may + * need to rehandshake later if the server requests it, + * #GTlsConnection will handle this for you automatically when you try + * to send or receive data on the connection. However, you can call + * g_tls_connection_handshake() manually if you want to know for sure + * whether the initial handshake succeeded or failed (as opposed to + * just immediately trying to write to @conn's output stream, in which + * case if it fails, it may not be possible to tell if it failed + * before or after completing the handshake). + * + * Likewise, on the server side, although a handshake is necessary at + * the beginning of the communication, you do not need to call this + * function explicitly unless you want clearer error reporting. + * However, you may call g_tls_connection_handshake() later on to + * renegotiate parameters (encryption methods, etc) with the client. + * + * #GTlsConnection::accept_certificate may be emitted during the + * handshake. + * + * Return value: success or failure + * + * Since: 2.28 + */ +gboolean +g_tls_connection_handshake (GTlsConnection *conn, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), FALSE); + + return G_TLS_CONNECTION_GET_CLASS (conn)->handshake (conn, cancellable, error); +} + +/** + * g_tls_connection_handshake_async: + * @conn: a #GTlsConnection + * @io_priority: the I/O priority + * of the request. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: callback to call when the handshake is complete + * @user_data: the data to pass to the callback function + * + * Asynchronously performs a TLS handshake on @conn. See + * g_tls_connection_handshake() for more information. + * + * Since: 2.28 + */ +void +g_tls_connection_handshake_async (GTlsConnection *conn, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_TLS_CONNECTION (conn)); + + G_TLS_CONNECTION_GET_CLASS (conn)->handshake_async (conn, io_priority, + cancellable, + callback, user_data); +} + +/** + * g_tls_connection_handshake_finish: + * @conn: a #GTlsConnection + * @result: a #GAsyncResult. + * @error: a #GError pointer, or %NULL + * + * Finish an asynchronous TLS handshake operation. See + * g_tls_connection_handshake() for more information. + * + * Return value: %TRUE on success, %FALSE on failure, in which + * case @error will be set. + * + * Since: 2.28 + */ +gboolean +g_tls_connection_handshake_finish (GTlsConnection *conn, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), FALSE); + + return G_TLS_CONNECTION_GET_CLASS (conn)->handshake_finish (conn, result, error); +} + +/** + * g_tls_error_quark: + * + * Gets the TLS error quark. + * + * Return value: a #GQuark. + * + * Since: 2.28 + */ +G_DEFINE_QUARK (g-tls-error-quark, g_tls_error) + +/** + * g_tls_connection_emit_accept_certificate: + * @conn: a #GTlsConnection + * @peer_cert: the peer's #GTlsCertificate + * @errors: the problems with @peer_cert + * + * Used by #GTlsConnection implementations to emit the + * #GTlsConnection::accept-certificate signal. + * + * Return value: %TRUE if one of the signal handlers has returned + * %TRUE to accept @peer_cert + * + * Since: 2.28 + */ +gboolean +g_tls_connection_emit_accept_certificate (GTlsConnection *conn, + GTlsCertificate *peer_cert, + GTlsCertificateFlags errors) +{ + gboolean accept = FALSE; + + g_signal_emit (conn, signals[ACCEPT_CERTIFICATE], 0, + peer_cert, errors, &accept); + return accept; +} diff --git a/gio/gtlsconnection.h b/gio/gtlsconnection.h new file mode 100644 index 0000000..465c936 --- /dev/null +++ b/gio/gtlsconnection.h @@ -0,0 +1,156 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_TLS_CONNECTION_H__ +#define __G_TLS_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_CONNECTION (g_tls_connection_get_type ()) +#define G_TLS_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_CONNECTION, GTlsConnection)) +#define G_TLS_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TLS_CONNECTION, GTlsConnectionClass)) +#define G_IS_TLS_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_CONNECTION)) +#define G_IS_TLS_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TLS_CONNECTION)) +#define G_TLS_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), G_TYPE_TLS_CONNECTION, GTlsConnectionClass)) + +typedef struct _GTlsConnectionClass GTlsConnectionClass; +typedef struct _GTlsConnectionPrivate GTlsConnectionPrivate; + +struct _GTlsConnection { + GIOStream parent_instance; + + GTlsConnectionPrivate *priv; +}; + +struct _GTlsConnectionClass +{ + GIOStreamClass parent_class; + + /* signals */ + gboolean ( *accept_certificate) (GTlsConnection *connection, + GTlsCertificate *peer_cert, + GTlsCertificateFlags errors); + + /* methods */ + gboolean ( *handshake ) (GTlsConnection *conn, + GCancellable *cancellable, + GError **error); + + void ( *handshake_async ) (GTlsConnection *conn, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean ( *handshake_finish ) (GTlsConnection *conn, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_connection_get_type (void) G_GNUC_CONST; + +GLIB_DEPRECATED +void g_tls_connection_set_use_system_certdb (GTlsConnection *conn, + gboolean use_system_certdb); +GLIB_DEPRECATED +gboolean g_tls_connection_get_use_system_certdb (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_set_database (GTlsConnection *conn, + GTlsDatabase *database); +GLIB_AVAILABLE_IN_ALL +GTlsDatabase * g_tls_connection_get_database (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_set_certificate (GTlsConnection *conn, + GTlsCertificate *certificate); +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_connection_get_certificate (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_set_interaction (GTlsConnection *conn, + GTlsInteraction *interaction); +GLIB_AVAILABLE_IN_ALL +GTlsInteraction * g_tls_connection_get_interaction (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate *g_tls_connection_get_peer_certificate (GTlsConnection *conn); +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_tls_connection_get_peer_certificate_errors (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_set_require_close_notify (GTlsConnection *conn, + gboolean require_close_notify); +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_connection_get_require_close_notify (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_set_rehandshake_mode (GTlsConnection *conn, + GTlsRehandshakeMode mode); +GLIB_AVAILABLE_IN_ALL +GTlsRehandshakeMode g_tls_connection_get_rehandshake_mode (GTlsConnection *conn); + +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_connection_handshake (GTlsConnection *conn, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_connection_handshake_async (GTlsConnection *conn, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_connection_handshake_finish (GTlsConnection *conn, + GAsyncResult *result, + GError **error); + +/** + * G_TLS_ERROR: + * + * Error domain for TLS. Errors in this domain will be from the + * #GTlsError enumeration. See #GError for more information on error + * domains. + */ +#define G_TLS_ERROR (g_tls_error_quark ()) +GLIB_AVAILABLE_IN_ALL +GQuark g_tls_error_quark (void); + + +/*< protected >*/ +GLIB_AVAILABLE_IN_ALL +gboolean g_tls_connection_emit_accept_certificate (GTlsConnection *conn, + GTlsCertificate *peer_cert, + GTlsCertificateFlags errors); + +G_END_DECLS + +#endif /* __G_TLS_CONNECTION_H__ */ diff --git a/gio/gtlsdatabase.c b/gio/gtlsdatabase.c new file mode 100644 index 0000000..538a013 --- /dev/null +++ b/gio/gtlsdatabase.c @@ -0,0 +1,928 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" + +#include "gtlsdatabase.h" + +#include "gasyncresult.h" +#include "gcancellable.h" +#include "glibintl.h" +#include "gsocketconnectable.h" +#include "gtask.h" +#include "gtlscertificate.h" +#include "gtlsinteraction.h" + +/** + * SECTION:gtlsdatabase + * @short_description: TLS database type + * @include: gio/gio.h + * + * #GTlsDatabase is used to lookup certificates and other information + * from a certificate or key store. It is an abstract base class which + * TLS library specific subtypes override. + * + * Most common client applications will not directly interact with + * #GTlsDatabase. It is used internally by #GTlsConnection. + * + * Since: 2.30 + */ + +/** + * GTlsDatabase: + * + * Abstract base class for the backend-specific database types. + * + * Since: 2.30 + */ + +G_DEFINE_ABSTRACT_TYPE (GTlsDatabase, g_tls_database, G_TYPE_OBJECT); + +enum { + UNLOCK_REQUIRED, + + LAST_SIGNAL +}; + +/** + * G_TLS_DATABASE_PURPOSE_AUTHENTICATE_SERVER: + * + * The purpose used to verify the server certificate in a TLS connection. This + * is the most common purpose in use. Used by TLS clients. + */ + +/** + * G_TLS_DATABASE_PURPOSE_AUTHENTICATE_CLIENT: + * + * The purpose used to verify the client certificate in a TLS connection. + * Used by TLS servers. + */ + +static void +g_tls_database_init (GTlsDatabase *cert) +{ + +} + +typedef struct _AsyncVerifyChain { + GTlsCertificate *chain; + gchar *purpose; + GSocketConnectable *identity; + GTlsInteraction *interaction; + GTlsDatabaseVerifyFlags flags; +} AsyncVerifyChain; + +static void +async_verify_chain_free (gpointer data) +{ + AsyncVerifyChain *args = data; + g_clear_object (&args->chain); + g_free (args->purpose); + g_clear_object (&args->identity); + g_clear_object (&args->interaction); + g_slice_free (AsyncVerifyChain, args); +} + +static void +async_verify_chain_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + AsyncVerifyChain *args = task_data; + GTlsCertificateFlags verify_result; + GError *error = NULL; + + verify_result = g_tls_database_verify_chain (G_TLS_DATABASE (object), + args->chain, + args->purpose, + args->identity, + args->interaction, + args->flags, + cancellable, + &error); + if (error) + g_task_return_error (task, error); + else + g_task_return_int (task, (gssize)verify_result); +} + +static void +g_tls_database_real_verify_chain_async (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + AsyncVerifyChain *args; + + args = g_slice_new0 (AsyncVerifyChain); + args->chain = g_object_ref (chain); + args->purpose = g_strdup (purpose); + args->identity = identity ? g_object_ref (identity) : NULL; + args->interaction = interaction ? g_object_ref (interaction) : NULL; + args->flags = flags; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, args, async_verify_chain_free); + g_task_run_in_thread (task, async_verify_chain_thread); + g_object_unref (task); +} + +static GTlsCertificateFlags +g_tls_database_real_verify_chain_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + GTlsCertificateFlags ret; + + g_return_val_if_fail (g_task_is_valid (result, self), G_TLS_CERTIFICATE_GENERIC_ERROR); + + ret = (GTlsCertificateFlags)g_task_propagate_int (G_TASK (result), error); + if (ret == (GTlsCertificateFlags)-1) + return G_TLS_CERTIFICATE_GENERIC_ERROR; + else + return ret; +} + +typedef struct { + gchar *handle; + GTlsInteraction *interaction; + GTlsDatabaseLookupFlags flags; +} AsyncLookupCertificateForHandle; + +static void +async_lookup_certificate_for_handle_free (gpointer data) +{ + AsyncLookupCertificateForHandle *args = data; + + g_free (args->handle); + g_clear_object (&args->interaction); + g_slice_free (AsyncLookupCertificateForHandle, args); +} + +static void +async_lookup_certificate_for_handle_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + AsyncLookupCertificateForHandle *args = task_data; + GTlsCertificate *result; + GError *error = NULL; + + result = g_tls_database_lookup_certificate_for_handle (G_TLS_DATABASE (object), + args->handle, + args->interaction, + args->flags, + cancellable, + &error); + if (result) + g_task_return_pointer (task, result, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +g_tls_database_real_lookup_certificate_for_handle_async (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + AsyncLookupCertificateForHandle *args; + + args = g_slice_new0 (AsyncLookupCertificateForHandle); + args->handle = g_strdup (handle); + args->interaction = interaction ? g_object_ref (interaction) : NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, args, async_lookup_certificate_for_handle_free); + g_task_run_in_thread (task, async_lookup_certificate_for_handle_thread); + g_object_unref (task); +} + +static GTlsCertificate* +g_tls_database_real_lookup_certificate_for_handle_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, self), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + + +typedef struct { + GTlsCertificate *certificate; + GTlsInteraction *interaction; + GTlsDatabaseLookupFlags flags; +} AsyncLookupCertificateIssuer; + +static void +async_lookup_certificate_issuer_free (gpointer data) +{ + AsyncLookupCertificateIssuer *args = data; + + g_clear_object (&args->certificate); + g_clear_object (&args->interaction); + g_slice_free (AsyncLookupCertificateIssuer, args); +} + +static void +async_lookup_certificate_issuer_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + AsyncLookupCertificateIssuer *args = task_data; + GTlsCertificate *issuer; + GError *error = NULL; + + issuer = g_tls_database_lookup_certificate_issuer (G_TLS_DATABASE (object), + args->certificate, + args->interaction, + args->flags, + cancellable, + &error); + if (issuer) + g_task_return_pointer (task, issuer, g_object_unref); + else + g_task_return_error (task, error); +} + +static void +g_tls_database_real_lookup_certificate_issuer_async (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + AsyncLookupCertificateIssuer *args; + + args = g_slice_new0 (AsyncLookupCertificateIssuer); + args->certificate = g_object_ref (certificate); + args->flags = flags; + args->interaction = interaction ? g_object_ref (interaction) : NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, args, async_lookup_certificate_issuer_free); + g_task_run_in_thread (task, async_lookup_certificate_issuer_thread); + g_object_unref (task); +} + +static GTlsCertificate * +g_tls_database_real_lookup_certificate_issuer_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, self), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +typedef struct { + GByteArray *issuer; + GTlsInteraction *interaction; + GTlsDatabaseLookupFlags flags; +} AsyncLookupCertificatesIssuedBy; + +static void +async_lookup_certificates_issued_by_free (gpointer data) +{ + AsyncLookupCertificatesIssuedBy *args = data; + + g_byte_array_unref (args->issuer); + g_clear_object (&args->interaction); + g_slice_free (AsyncLookupCertificatesIssuedBy, args); +} + +static void +async_lookup_certificates_free_certificates (gpointer data) +{ + GList *list = data; + + g_list_free_full (list, g_object_unref); +} + +static void +async_lookup_certificates_issued_by_thread (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + AsyncLookupCertificatesIssuedBy *args = task_data; + GList *results; + GError *error = NULL; + + results = g_tls_database_lookup_certificates_issued_by (G_TLS_DATABASE (object), + args->issuer, + args->interaction, + args->flags, + cancellable, + &error); + if (results) + g_task_return_pointer (task, results, async_lookup_certificates_free_certificates); + else + g_task_return_error (task, error); +} + +static void +g_tls_database_real_lookup_certificates_issued_by_async (GTlsDatabase *self, + GByteArray *issuer, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + AsyncLookupCertificatesIssuedBy *args; + + args = g_slice_new0 (AsyncLookupCertificatesIssuedBy); + args->issuer = g_byte_array_ref (issuer); + args->flags = flags; + args->interaction = interaction ? g_object_ref (interaction) : NULL; + + task = g_task_new (self, cancellable, callback, user_data); + g_task_set_task_data (task, args, async_lookup_certificates_issued_by_free); + g_task_run_in_thread (task, async_lookup_certificates_issued_by_thread); + g_object_unref (task); +} + +static GList * +g_tls_database_real_lookup_certificates_issued_by_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, self), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_tls_database_class_init (GTlsDatabaseClass *klass) +{ + klass->verify_chain_async = g_tls_database_real_verify_chain_async; + klass->verify_chain_finish = g_tls_database_real_verify_chain_finish; + klass->lookup_certificate_for_handle_async = g_tls_database_real_lookup_certificate_for_handle_async; + klass->lookup_certificate_for_handle_finish = g_tls_database_real_lookup_certificate_for_handle_finish; + klass->lookup_certificate_issuer_async = g_tls_database_real_lookup_certificate_issuer_async; + klass->lookup_certificate_issuer_finish = g_tls_database_real_lookup_certificate_issuer_finish; + klass->lookup_certificates_issued_by_async = g_tls_database_real_lookup_certificates_issued_by_async; + klass->lookup_certificates_issued_by_finish = g_tls_database_real_lookup_certificates_issued_by_finish; +} + +/** + * g_tls_database_verify_chain: + * @self: a #GTlsDatabase + * @chain: a #GTlsCertificate chain + * @purpose: the purpose that this certificate chain will be used for. + * @identity: (allow-none): the expected peer identity + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: additional verify flags + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: (allow-none): a #GError, or %NULL + * + * Verify's a certificate chain after looking up and adding any missing + * certificates to the chain. + * + * @chain is a chain of #GTlsCertificate objects each pointing to the next + * certificate in the chain by its %issuer property. The chain may initially + * consist of one or more certificates. After the verification process is + * complete, @chain may be modified by adding missing certificates, or removing + * extra certificates. If a certificate anchor was found, then it is added to + * the @chain. + * + * @purpose describes the purpose (or usage) for which the certificate + * is being used. Typically @purpose will be set to #G_TLS_DATABASE_PURPOSE_AUTHENTICATE_SERVER + * which means that the certificate is being used to authenticate a server + * (and we are acting as the client). + * + * The @identity is used to check for pinned certificates (trust exceptions) + * in the database. These will override the normal verification process on a + * host by host basis. + * + * Currently there are no @flags, and %G_TLS_DATABASE_VERIFY_NONE should be + * used. + * + * This function can block, use g_tls_database_verify_chain_async() to perform + * the verification operation asynchronously. + * + * Return value: the appropriate #GTlsCertificateFlags which represents the + * result of verification. + * + * Since: 2.30 + */ +GTlsCertificateFlags +g_tls_database_verify_chain (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (G_IS_TLS_DATABASE (self), + G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (G_IS_TLS_CERTIFICATE (chain), + G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (purpose, G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), + G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (identity == NULL || G_IS_SOCKET_CONNECTABLE (identity), + G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_CERTIFICATE_GENERIC_ERROR); + + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->verify_chain, + G_TLS_CERTIFICATE_GENERIC_ERROR); + + return G_TLS_DATABASE_GET_CLASS (self)->verify_chain (self, + chain, + purpose, + identity, + interaction, + flags, + cancellable, + error); +} + +/** + * g_tls_database_verify_chain_async: + * @self: a #GTlsDatabase + * @chain: a #GTlsCertificate chain + * @purpose: the purpose that this certificate chain will be used for. + * @identity: (allow-none): the expected peer identity + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: additional verify flags + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: callback to call when the operation completes + * @user_data: the data to pass to the callback function + * + * Asynchronously verify's a certificate chain after looking up and adding + * any missing certificates to the chain. See g_tls_database_verify_chain() + * for more information. + * + * Since: 2.30 + */ +void +g_tls_database_verify_chain_async (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_TLS_DATABASE (self)); + g_return_if_fail (G_IS_TLS_CERTIFICATE (chain)); + g_return_if_fail (purpose != NULL); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (identity == NULL || G_IS_SOCKET_CONNECTABLE (identity)); + g_return_if_fail (callback != NULL); + + g_return_if_fail (G_TLS_DATABASE_GET_CLASS (self)->verify_chain_async); + G_TLS_DATABASE_GET_CLASS (self)->verify_chain_async (self, + chain, + purpose, + identity, + interaction, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_tls_database_verify_chain_finish: + * @self: a #GTlsDatabase + * @result: a #GAsyncResult. + * @error: a #GError pointer, or %NULL + * + * Finish an asynchronous verify chain operation. See + * g_tls_database_verify_chain() for more information. * + * Return value: the appropriate #GTlsCertificateFlags which represents the + * result of verification. + * + * Since: 2.30 + */ +GTlsCertificateFlags +g_tls_database_verify_chain_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_CERTIFICATE_GENERIC_ERROR); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->verify_chain_finish, + G_TLS_CERTIFICATE_GENERIC_ERROR); + return G_TLS_DATABASE_GET_CLASS (self)->verify_chain_finish (self, + result, + error); +} + +/** + * g_tls_database_create_certificate_handle: + * @self: a #GTlsDatabase + * @certificate: certificate for which to create a handle. + * + * Create a handle string for the certificate. The database will only be able + * to create a handle for certificates that originate from the database. In + * cases where the database cannot create a handle for a certificate, %NULL + * will be returned. + * + * This handle should be stable across various instances of the application, + * and between applications. If a certificate is modified in the database, + * then it is not guaranteed that this handle will continue to point to it. + * + * Returns: (allow-none): a newly allocated string containing the handle. + * Since: 2.30 + */ +gchar* +g_tls_database_create_certificate_handle (GTlsDatabase *self, + GTlsCertificate *certificate) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (G_IS_TLS_CERTIFICATE (certificate), NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->create_certificate_handle, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->create_certificate_handle (self, + certificate); +} + +/** + * g_tls_database_lookup_certificate_for_handle: + * @self: a #GTlsDatabase + * @handle: a certificate handle + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: Flags which affect the lookup. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: (allow-none): a #GError, or %NULL + * + * Lookup a certificate by its handle. + * + * The handle should have been created by calling + * g_tls_database_create_certificate_handle() on a #GTlsDatabase object of + * the same TLS backend. The handle is designed to remain valid across + * instantiations of the database. + * + * If the handle is no longer valid, or does not point to a certificate in + * this database, then %NULL will be returned. + * + * This function can block, use g_tls_database_lookup_certificate_for_handle_async() to perform + * the lookup operation asynchronously. + * + * Return value: (transfer full) (allow-none): a newly allocated + * #GTlsCertificate, or %NULL. Use g_object_unref() to release the certificate. + * + * Since: 2.30 + */ +GTlsCertificate* +g_tls_database_lookup_certificate_for_handle (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (handle != NULL, NULL); + g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle (self, + handle, + interaction, + flags, + cancellable, + error); +} + + +/** + * g_tls_database_lookup_certificate_for_handle_async: + * @self: a #GTlsDatabase + * @handle: a certificate handle + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: Flags which affect the lookup. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: callback to call when the operation completes + * @user_data: the data to pass to the callback function + * + * Asynchronously lookup a certificate by its handle in the database. See + * g_tls_database_lookup_certificate_for_handle() for more information. + * + * Since: 2.30 + */ +void +g_tls_database_lookup_certificate_for_handle_async (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_TLS_DATABASE (self)); + g_return_if_fail (handle != NULL); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle_async); + G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle_async (self, + handle, + interaction, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_tls_database_lookup_certificate_for_handle_finish: + * @self: a #GTlsDatabase + * @result: a #GAsyncResult. + * @error: a #GError pointer, or %NULL + * + * Finish an asynchronous lookup of a certificate by its handle. See + * g_tls_database_lookup_certificate_handle() for more information. + * + * If the handle is no longer valid, or does not point to a certificate in + * this database, then %NULL will be returned. + * + * Return value: (transfer full): a newly allocated #GTlsCertificate object. + * Use g_object_unref() to release the certificate. + * + * Since: 2.30 + */ +GTlsCertificate* +g_tls_database_lookup_certificate_for_handle_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle_finish, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_for_handle_finish (self, + result, + error); +} + +/** + * g_tls_database_lookup_certificate_issuer: + * @self: a #GTlsDatabase + * @certificate: a #GTlsCertificate + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: flags which affect the lookup operation + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: (allow-none): a #GError, or %NULL + * + * Lookup the issuer of @certificate in the database. + * + * The %issuer property + * of @certificate is not modified, and the two certificates are not hooked + * into a chain. + * + * This function can block, use g_tls_database_lookup_certificate_issuer_async() to perform + * the lookup operation asynchronously. + * + * Return value: (transfer full): a newly allocated issuer #GTlsCertificate, + * or %NULL. Use g_object_unref() to release the certificate. + * + * Since: 2.30 + */ +GTlsCertificate* +g_tls_database_lookup_certificate_issuer (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (G_IS_TLS_CERTIFICATE (certificate), NULL); + g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer (self, + certificate, + interaction, + flags, + cancellable, + error); +} + +/** + * g_tls_database_lookup_certificate_issuer_async: + * @self: a #GTlsDatabase + * @certificate: a #GTlsCertificate + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: flags which affect the lookup operation + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: callback to call when the operation completes + * @user_data: the data to pass to the callback function + * + * Asynchronously lookup the issuer of @certificate in the database. See + * g_tls_database_lookup_certificate_issuer() for more information. + * + * Since: 2.30 + */ +void +g_tls_database_lookup_certificate_issuer_async (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_TLS_DATABASE (self)); + g_return_if_fail (G_IS_TLS_CERTIFICATE (certificate)); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (callback != NULL); + g_return_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer_async); + G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer_async (self, + certificate, + interaction, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_tls_database_lookup_certificate_issuer_finish: + * @self: a #GTlsDatabase + * @result: a #GAsyncResult. + * @error: a #GError pointer, or %NULL + * + * Finish an asynchronous lookup issuer operation. See + * g_tls_database_lookup_certificate_issuer() for more information. + * + * Return value: (transfer full): a newly allocated issuer #GTlsCertificate, + * or %NULL. Use g_object_unref() to release the certificate. + * + * Since: 2.30 + */ +GTlsCertificate* +g_tls_database_lookup_certificate_issuer_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer_finish, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificate_issuer_finish (self, + result, + error); +} + +/** + * g_tls_database_lookup_certificates_issued_by: + * @self: a #GTlsDatabase + * @issuer_raw_dn: a #GByteArray which holds the DER encoded issuer DN. + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: Flags which affect the lookup operation. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @error: (allow-none): a #GError, or %NULL + * + * Lookup certificates issued by this issuer in the database. + * + * This function can block, use g_tls_database_lookup_certificates_issued_by_async() to perform + * the lookup operation asynchronously. + * + * Return value: (transfer full) (element-type GTlsCertificate): a newly allocated list of #GTlsCertificate + * objects. Use g_object_unref() on each certificate, and g_list_free() on the release the list. + * + * Since: 2.30 + */ +GList* +g_tls_database_lookup_certificates_issued_by (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (issuer_raw_dn, NULL); + g_return_val_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by (self, + issuer_raw_dn, + interaction, + flags, + cancellable, + error); +} + +/** + * g_tls_database_lookup_certificates_issued_by_async: + * @self: a #GTlsDatabase + * @issuer_raw_dn: a #GByteArray which holds the DER encoded issuer DN. + * @interaction: (allow-none): used to interact with the user if necessary + * @flags: Flags which affect the lookup operation. + * @cancellable: (allow-none): a #GCancellable, or %NULL + * @callback: callback to call when the operation completes + * @user_data: the data to pass to the callback function + * + * Asynchronously lookup certificates issued by this issuer in the database. See + * g_tls_database_lookup_certificates_issued_by() for more information. + * + * The database may choose to hold a reference to the issuer byte array for the duration + * of of this asynchronous operation. The byte array should not be modified during + * this time. + * + * Since: 2.30 + */ +void +g_tls_database_lookup_certificates_issued_by_async (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (G_IS_TLS_DATABASE (self)); + g_return_if_fail (issuer_raw_dn != NULL); + g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_return_if_fail (callback != NULL); + g_return_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by_async); + G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by_async (self, + issuer_raw_dn, + interaction, + flags, + cancellable, + callback, + user_data); +} + +/** + * g_tls_database_lookup_certificates_issued_by_finish: + * @self: a #GTlsDatabase + * @result: a #GAsyncResult. + * @error: a #GError pointer, or %NULL + * + * Finish an asynchronous lookup of certificates. See + * g_tls_database_lookup_certificates_issued_by() for more information. + * + * Return value: (transfer full) (element-type GTlsCertificate): a newly allocated list of #GTlsCertificate + * objects. Use g_object_unref() on each certificate, and g_list_free() on the release the list. + * + * Since: 2.30 + */ +GList* +g_tls_database_lookup_certificates_issued_by_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (G_IS_TLS_DATABASE (self), NULL); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by_finish, NULL); + return G_TLS_DATABASE_GET_CLASS (self)->lookup_certificates_issued_by_finish (self, + result, + error); +} diff --git a/gio/gtlsdatabase.h b/gio/gtlsdatabase.h new file mode 100644 index 0000000..c11ca7a --- /dev/null +++ b/gio/gtlsdatabase.h @@ -0,0 +1,249 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#ifndef __G_TLS_DATABASE_H__ +#define __G_TLS_DATABASE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TLS_DATABASE_PURPOSE_AUTHENTICATE_SERVER "1.3.6.1.5.5.7.3.1" +#define G_TLS_DATABASE_PURPOSE_AUTHENTICATE_CLIENT "1.3.6.1.5.5.7.3.2" + +#define G_TYPE_TLS_DATABASE (g_tls_database_get_type ()) +#define G_TLS_DATABASE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_DATABASE, GTlsDatabase)) +#define G_TLS_DATABASE_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), G_TYPE_TLS_DATABASE, GTlsDatabaseClass)) +#define G_IS_TLS_DATABASE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_DATABASE)) +#define G_IS_TLS_DATABASE_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), G_TYPE_TLS_DATABASE)) +#define G_TLS_DATABASE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), G_TYPE_TLS_DATABASE, GTlsDatabaseClass)) + +typedef struct _GTlsDatabaseClass GTlsDatabaseClass; +typedef struct _GTlsDatabasePrivate GTlsDatabasePrivate; + +struct _GTlsDatabase +{ + GObject parent_instance; + + GTlsDatabasePrivate *priv; +}; + +struct _GTlsDatabaseClass +{ + GObjectClass parent_class; + + /* virtual methods */ + + GTlsCertificateFlags (*verify_chain) (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GError **error); + + void (*verify_chain_async) (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GTlsCertificateFlags (*verify_chain_finish) (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + + gchar* (*create_certificate_handle) (GTlsDatabase *self, + GTlsCertificate *certificate); + + GTlsCertificate* (*lookup_certificate_for_handle) (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + + void (*lookup_certificate_for_handle_async) (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GTlsCertificate* (*lookup_certificate_for_handle_finish) (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + + GTlsCertificate* (*lookup_certificate_issuer) (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + + void (*lookup_certificate_issuer_async) (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GTlsCertificate* (*lookup_certificate_issuer_finish) (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + + GList* (*lookup_certificates_issued_by) (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + + void (*lookup_certificates_issued_by_async) (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GList* (*lookup_certificates_issued_by_finish) (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[16]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_database_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_tls_database_verify_chain (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_database_verify_chain_async (GTlsDatabase *self, + GTlsCertificate *chain, + const gchar *purpose, + GSocketConnectable *identity, + GTlsInteraction *interaction, + GTlsDatabaseVerifyFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificateFlags g_tls_database_verify_chain_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gchar* g_tls_database_create_certificate_handle (GTlsDatabase *self, + GTlsCertificate *certificate); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate* g_tls_database_lookup_certificate_for_handle (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_database_lookup_certificate_for_handle_async (GTlsDatabase *self, + const gchar *handle, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate* g_tls_database_lookup_certificate_for_handle_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate* g_tls_database_lookup_certificate_issuer (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_database_lookup_certificate_issuer_async (GTlsDatabase *self, + GTlsCertificate *certificate, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GTlsCertificate* g_tls_database_lookup_certificate_issuer_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_ALL +GList* g_tls_database_lookup_certificates_issued_by (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_database_lookup_certificates_issued_by_async (GTlsDatabase *self, + GByteArray *issuer_raw_dn, + GTlsInteraction *interaction, + GTlsDatabaseLookupFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GList* g_tls_database_lookup_certificates_issued_by_finish (GTlsDatabase *self, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_TLS_DATABASE_H__ */ diff --git a/gio/gtlsfiledatabase.c b/gio/gtlsfiledatabase.c new file mode 100644 index 0000000..4d7c6d4 --- /dev/null +++ b/gio/gtlsfiledatabase.c @@ -0,0 +1,105 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 Collabora, Ltd + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" + +#include "gtlsfiledatabase.h" + +#include "ginitable.h" +#include "gtlsbackend.h" +#include "gtlsdatabase.h" +#include "glibintl.h" + +/** + * SECTION:gtlsfiledatabase + * @short_description: TLS file based database type + * @include: gio/gio.h + * + * #GTlsFileDatabase is implemented by #GTlsDatabase objects which load + * their certificate information from a file. It is in interface which + * TLS library specific subtypes implement. + * + * Since: 2.30 + */ + +/** + * GTlsFileDatabase: + * + * Implemented by a #GTlsDatabase which allows you to load certificates + * from a file. + * + * Since: 2.30 + */ +G_DEFINE_INTERFACE (GTlsFileDatabase, g_tls_file_database, G_TYPE_TLS_DATABASE) + +static void +g_tls_file_database_default_init (GTlsFileDatabaseInterface *iface) +{ + /** + * GTlsFileDatabase:anchors: + * + * The path to a file containing PEM encoded certificate authority + * root anchors. The certificates in this file will be treated as + * root authorities for the purpose of verifying other certificates + * via the g_tls_database_verify_chain() operation. + * + * Since: 2.30 + */ + g_object_interface_install_property (iface, + g_param_spec_string ("anchors", + P_("Anchors"), + P_("The certificate authority anchor file"), + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_tls_file_database_new: + * @anchors: filename of anchor certificate authorities. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GTlsFileDatabase which uses anchor certificate authorities + * in @anchors to verify certificate chains. + * + * The certificates in @anchors must be PEM encoded. + * + * Return value: (transfer full) (type GTlsFileDatabase): the new + * #GTlsFileDatabase, or %NULL on error + * + * Since: 2.30 + */ +GTlsDatabase* +g_tls_file_database_new (const gchar *anchors, + GError **error) +{ + GObject *database; + GTlsBackend *backend; + + backend = g_tls_backend_get_default (); + database = g_initable_new (g_tls_backend_get_file_database_type (backend), + NULL, error, + "anchors", anchors, + NULL); + return G_TLS_DATABASE (database); +} diff --git a/gio/gtlsfiledatabase.h b/gio/gtlsfiledatabase.h new file mode 100644 index 0000000..5024949 --- /dev/null +++ b/gio/gtlsfiledatabase.h @@ -0,0 +1,58 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 Collabora, Ltd. + * + * 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: Stef Walter + */ + +#ifndef __G_TLS_FILE_DATABASE_H__ +#define __G_TLS_FILE_DATABASE_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_FILE_DATABASE (g_tls_file_database_get_type ()) +#define G_TLS_FILE_DATABASE(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_FILE_DATABASE, GTlsFileDatabase)) +#define G_IS_TLS_FILE_DATABASE(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_FILE_DATABASE)) +#define G_TLS_FILE_DATABASE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TLS_FILE_DATABASE, GTlsFileDatabaseInterface)) + +typedef struct _GTlsFileDatabaseInterface GTlsFileDatabaseInterface; + +/** + * GTlsFileDatabaseInterface: + * @g_iface: The parent interface. + * + * Provides an interface for #GTlsFileDatabase implementations. + * + */ +struct _GTlsFileDatabaseInterface +{ + GTypeInterface g_iface; + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[8]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_file_database_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsDatabase* g_tls_file_database_new (const gchar *anchors, + GError **error); + +G_END_DECLS + +#endif /* __G_TLS_FILE_DATABASE_H___ */ diff --git a/gio/gtlsinteraction.c b/gio/gtlsinteraction.c new file mode 100644 index 0000000..75d4bab --- /dev/null +++ b/gio/gtlsinteraction.c @@ -0,0 +1,536 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" + +#include + +#include "gtlsinteraction.h" +#include "gtlspassword.h" +#include "gasyncresult.h" +#include "gcancellable.h" +#include "gtask.h" +#include "gioenumtypes.h" +#include "glibintl.h" + + +/** + * SECTION:gtlsinteraction + * @short_description: Interaction with the user during TLS operations. + * @include: gio/gio.h + * + * #GTlsInteraction provides a mechanism for the TLS connection and database + * code to interact with the user. It can be used to ask the user for passwords. + * + * To use a #GTlsInteraction with a TLS connection use + * g_tls_connection_set_interaction(). + * + * Callers should instantiate a derived class that implements the various + * interaction methods to show the required dialogs. + * + * Callers should use the 'invoke' functions like + * g_tls_interaction_invoke_ask_password() to run interaction methods. These + * functions make sure that the interaction is invoked in the main loop + * and not in the current thread, if the current thread is not running the + * main loop. + * + * Derived classes can choose to implement whichever interactions methods they'd + * like to support by overriding those virtual methods in their class + * initialization function. Any interactions not implemented will return + * %G_TLS_INTERACTION_UNHANDLED. If a derived class implements an async method, + * it must also implement the corresponding finish method. + */ + +/** + * GTlsInteraction: + * + * An object representing interaction that the TLS connection and database + * might have with the user. + * + * Since: 2.30 + */ + +/** + * GTlsInteractionClass: + * @ask_password: ask for a password synchronously. If the implementation + * returns %G_TLS_INTERACTION_HANDLED, then the password argument should + * have been filled in by using g_tls_password_set_value() or a similar + * function. + * @ask_password_async: ask for a password asynchronously. + * @ask_password_finish: complete operation to ask for a password asynchronously. + * If the implementation returns %G_TLS_INTERACTION_HANDLED, then the + * password argument of the async method should have been filled in by using + * g_tls_password_set_value() or a similar function. + * + * The class for #GTlsInteraction. Derived classes implement the various + * virtual interaction methods to handle TLS interactions. + * + * Derived classes can choose to implement whichever interactions methods they'd + * like to support by overriding those virtual methods in their class + * initialization function. If a derived class implements an async method, + * it must also implement the corresponding finish method. + * + * The synchronous interaction methods should implement to display modal dialogs, + * and the asynchronous methods to display modeless dialogs. + * + * If the user cancels an interaction, then the result should be + * %G_TLS_INTERACTION_FAILED and the error should be set with a domain of + * %G_IO_ERROR and code of %G_IO_ERROR_CANCELLED. + * + * Since: 2.30 + */ + +struct _GTlsInteractionPrivate { + GMainContext *context; +}; + +G_DEFINE_TYPE (GTlsInteraction, g_tls_interaction, G_TYPE_OBJECT); + +typedef struct { + GMutex mutex; + + /* Input arguments */ + GTlsInteraction *interaction; + GObject *argument; + GCancellable *cancellable; + + /* Used when we're invoking async interactions */ + GAsyncReadyCallback callback; + gpointer user_data; + + /* Used when we expect results */ + GTlsInteractionResult result; + GError *error; + gboolean complete; + GCond cond; +} InvokeClosure; + +static void +invoke_closure_free (gpointer data) +{ + InvokeClosure *closure = data; + g_assert (closure); + g_object_unref (closure->interaction); + g_clear_object (&closure->argument); + g_clear_object (&closure->cancellable); + g_cond_clear (&closure->cond); + g_mutex_clear (&closure->mutex); + g_clear_error (&closure->error); + + /* Insurance that we've actually used these before freeing */ + g_assert (closure->callback == NULL); + g_assert (closure->user_data == NULL); + + g_free (closure); +} + +static InvokeClosure * +invoke_closure_new (GTlsInteraction *interaction, + GObject *argument, + GCancellable *cancellable) +{ + InvokeClosure *closure = g_new0 (InvokeClosure, 1); + closure->interaction = g_object_ref (interaction); + closure->argument = argument ? g_object_ref (argument) : NULL; + closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL; + g_mutex_init (&closure->mutex); + g_cond_init (&closure->cond); + closure->result = G_TLS_INTERACTION_UNHANDLED; + return closure; +} + +static GTlsInteractionResult +invoke_closure_wait_and_free (InvokeClosure *closure, + GError **error) +{ + GTlsInteractionResult result; + + g_mutex_lock (&closure->mutex); + + while (!closure->complete) + g_cond_wait (&closure->cond, &closure->mutex); + + g_mutex_unlock (&closure->mutex); + + if (closure->error) + { + g_propagate_error (error, closure->error); + closure->error = NULL; + } + result = closure->result; + + invoke_closure_free (closure); + return result; +} + +static void +g_tls_interaction_init (GTlsInteraction *interaction) +{ + interaction->priv = G_TYPE_INSTANCE_GET_PRIVATE (interaction, G_TYPE_TLS_INTERACTION, + GTlsInteractionPrivate); + interaction->priv->context = g_main_context_ref_thread_default (); +} + +static void +g_tls_interaction_finalize (GObject *object) +{ + GTlsInteraction *interaction = G_TLS_INTERACTION (object); + + g_main_context_unref (interaction->priv->context); + + G_OBJECT_CLASS (g_tls_interaction_parent_class)->finalize (object); +} + +static void +g_tls_interaction_class_init (GTlsInteractionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->finalize = g_tls_interaction_finalize; + + g_type_class_add_private (klass, sizeof (GTlsInteractionPrivate)); +} + +static gboolean +on_invoke_ask_password_sync (gpointer user_data) +{ + InvokeClosure *closure = user_data; + GTlsInteractionClass *klass; + + g_mutex_lock (&closure->mutex); + + klass = G_TLS_INTERACTION_GET_CLASS (closure->interaction); + g_assert (klass->ask_password); + + closure->result = klass->ask_password (closure->interaction, + G_TLS_PASSWORD (closure->argument), + closure->cancellable, + &closure->error); + + closure->complete = TRUE; + g_cond_signal (&closure->cond); + g_mutex_unlock (&closure->mutex); + + return FALSE; /* don't call again */ +} + +static void +on_async_as_sync_complete (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + InvokeClosure *closure = user_data; + GTlsInteractionClass *klass; + + g_mutex_lock (&closure->mutex); + + klass = G_TLS_INTERACTION_GET_CLASS (closure->interaction); + g_assert (klass->ask_password_finish); + + closure->result = klass->ask_password_finish (closure->interaction, + result, + &closure->error); + + closure->complete = TRUE; + g_cond_signal (&closure->cond); + g_mutex_unlock (&closure->mutex); +} + +static gboolean +on_invoke_ask_password_async_as_sync (gpointer user_data) +{ + InvokeClosure *closure = user_data; + GTlsInteractionClass *klass; + + g_mutex_lock (&closure->mutex); + + klass = G_TLS_INTERACTION_GET_CLASS (closure->interaction); + g_assert (klass->ask_password_async); + + klass->ask_password_async (closure->interaction, + G_TLS_PASSWORD (closure->argument), + closure->cancellable, + on_async_as_sync_complete, + closure); + + /* Note that we've used these */ + closure->callback = NULL; + closure->user_data = NULL; + + g_mutex_unlock (&closure->mutex); + + return FALSE; /* don't call again */ +} + +/** + * g_tls_interaction_invoke_ask_password: + * @interaction: a #GTlsInteraction object + * @password: a #GTlsPassword object + * @cancellable: an optional #GCancellable cancellation object + * @error: an optional location to place an error on failure + * + * Invoke the interaction to ask the user for a password. It invokes this + * interaction in the main loop, specifically the #GMainContext returned by + * g_main_context_get_thread_default() when the interaction is created. This + * is called by called by #GTlsConnection or #GTlsDatabase to ask the user + * for a password. + * + * Derived subclasses usually implement a password prompt, although they may + * also choose to provide a password from elsewhere. The @password value will + * be filled in and then @callback will be called. Alternatively the user may + * abort this password request, which will usually abort the TLS connection. + * + * The implementation can either be a synchronous (eg: modal dialog) or an + * asynchronous one (eg: modeless dialog). This function will take care of + * calling which ever one correctly. + * + * If the interaction is cancelled by the cancellation object, or by the + * user then %G_TLS_INTERACTION_FAILED will be returned with an error that + * contains a %G_IO_ERROR_CANCELLED error code. Certain implementations may + * not support immediate cancellation. + * + * Returns: The status of the ask password interaction. + * + * Since: 2.30 + */ +GTlsInteractionResult +g_tls_interaction_invoke_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + GTlsInteractionResult result; + InvokeClosure *closure; + GTlsInteractionClass *klass; + gboolean complete; + + g_return_val_if_fail (G_IS_TLS_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), G_TLS_INTERACTION_UNHANDLED); + + closure = invoke_closure_new (interaction, G_OBJECT (password), cancellable); + + klass = G_TLS_INTERACTION_GET_CLASS (interaction); + if (klass->ask_password) + { + g_main_context_invoke (interaction->priv->context, + on_invoke_ask_password_sync, closure); + result = invoke_closure_wait_and_free (closure, error); + } + else if (klass->ask_password_async) + { + g_return_val_if_fail (klass->ask_password_finish, G_TLS_INTERACTION_UNHANDLED); + g_main_context_invoke (interaction->priv->context, + on_invoke_ask_password_async_as_sync, closure); + + /* + * Handle the case where we've been called from within the main context + * or in the case where the main context is not running. This approximates + * the behavior of a modal dialog. + */ + if (g_main_context_acquire (interaction->priv->context)) + { + for (;;) + { + g_mutex_lock (&closure->mutex); + complete = closure->complete; + g_mutex_unlock (&closure->mutex); + if (complete) + break; + g_main_context_iteration (interaction->priv->context, TRUE); + } + + g_main_context_release (interaction->priv->context); + + if (closure->error) + { + g_propagate_error (error, closure->error); + closure->error = NULL; + } + + result = closure->result; + invoke_closure_free (closure); + } + + /* + * Handle the case where we're in a different thread than the main + * context and a main loop is running. + */ + else + { + result = invoke_closure_wait_and_free (closure, error); + } + } + else + { + result = G_TLS_INTERACTION_UNHANDLED; + invoke_closure_free (closure); + } + + return result; +} + + +/** + * g_tls_interaction_ask_password: + * @interaction: a #GTlsInteraction object + * @password: a #GTlsPassword object + * @cancellable: an optional #GCancellable cancellation object + * @error: an optional location to place an error on failure + * + * Run synchronous interaction to ask the user for a password. In general, + * g_tls_interaction_invoke_ask_password() should be used instead of this + * function. + * + * Derived subclasses usually implement a password prompt, although they may + * also choose to provide a password from elsewhere. The @password value will + * be filled in and then @callback will be called. Alternatively the user may + * abort this password request, which will usually abort the TLS connection. + * + * If the interaction is cancelled by the cancellation object, or by the + * user then %G_TLS_INTERACTION_FAILED will be returned with an error that + * contains a %G_IO_ERROR_CANCELLED error code. Certain implementations may + * not support immediate cancellation. + * + * Returns: The status of the ask password interaction. + * + * Since: 2.30 + */ +GTlsInteractionResult +g_tls_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + GTlsInteractionClass *klass; + + g_return_val_if_fail (G_IS_TLS_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), G_TLS_INTERACTION_UNHANDLED); + + klass = G_TLS_INTERACTION_GET_CLASS (interaction); + if (klass->ask_password) + return (klass->ask_password) (interaction, password, cancellable, error); + else + return G_TLS_INTERACTION_UNHANDLED; +} + +/** + * g_tls_interaction_ask_password_async: + * @interaction: a #GTlsInteraction object + * @password: a #GTlsPassword object + * @cancellable: an optional #GCancellable cancellation object + * @callback: (allow-none): will be called when the interaction completes + * @user_data: (allow-none): data to pass to the @callback + * + * Run asynchronous interaction to ask the user for a password. In general, + * g_tls_interaction_invoke_ask_password() should be used instead of this + * function. + * + * Derived subclasses usually implement a password prompt, although they may + * also choose to provide a password from elsewhere. The @password value will + * be filled in and then @callback will be called. Alternatively the user may + * abort this password request, which will usually abort the TLS connection. + * + * If the interaction is cancelled by the cancellation object, or by the + * user then %G_TLS_INTERACTION_FAILED will be returned with an error that + * contains a %G_IO_ERROR_CANCELLED error code. Certain implementations may + * not support immediate cancellation. + * + * Certain implementations may not support immediate cancellation. + * + * Since: 2.30 + */ +void +g_tls_interaction_ask_password_async (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTlsInteractionClass *klass; + GTask *task; + + g_return_if_fail (G_IS_TLS_INTERACTION (interaction)); + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + klass = G_TLS_INTERACTION_GET_CLASS (interaction); + if (klass->ask_password_async) + { + g_return_if_fail (klass->ask_password_finish); + (klass->ask_password_async) (interaction, password, cancellable, + callback, user_data); + } + else + { + task = g_task_new (interaction, cancellable, callback, user_data); + g_task_set_source_tag (task, g_tls_interaction_ask_password_async); + g_task_return_int (task, G_TLS_INTERACTION_UNHANDLED); + g_object_unref (task); + } +} + +/** + * g_tls_interaction_ask_password_finish: + * @interaction: a #GTlsInteraction object + * @result: the result passed to the callback + * @error: an optional location to place an error on failure + * + * Complete an ask password user interaction request. This should be once + * the g_tls_interaction_ask_password_async() completion callback is called. + * + * If %G_TLS_INTERACTION_HANDLED is returned, then the #GTlsPassword passed + * to g_tls_interaction_ask_password() will have its password filled in. + * + * If the interaction is cancelled by the cancellation object, or by the + * user then %G_TLS_INTERACTION_FAILED will be returned with an error that + * contains a %G_IO_ERROR_CANCELLED error code. + * + * Returns: The status of the ask password interaction. + * + * Since: 2.30 + */ +GTlsInteractionResult +g_tls_interaction_ask_password_finish (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + GTlsInteractionClass *klass; + + g_return_val_if_fail (G_IS_TLS_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); + g_return_val_if_fail (G_IS_ASYNC_RESULT (result), G_TLS_INTERACTION_UNHANDLED); + + klass = G_TLS_INTERACTION_GET_CLASS (interaction); + if (klass->ask_password_finish) + { + g_return_val_if_fail (klass->ask_password_async != NULL, G_TLS_INTERACTION_UNHANDLED); + + return (klass->ask_password_finish) (interaction, result, error); + } + else + { + g_return_val_if_fail (g_async_result_is_tagged (result, g_tls_interaction_ask_password_async), G_TLS_INTERACTION_UNHANDLED); + + return g_task_propagate_int (G_TASK (result), error); + } +} diff --git a/gio/gtlsinteraction.h b/gio/gtlsinteraction.h new file mode 100644 index 0000000..283464e --- /dev/null +++ b/gio/gtlsinteraction.h @@ -0,0 +1,107 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#ifndef __G_TLS_INTERACTION_H__ +#define __G_TLS_INTERACTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_INTERACTION (g_tls_interaction_get_type ()) +#define G_TLS_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TLS_INTERACTION, GTlsInteraction)) +#define G_TLS_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TLS_INTERACTION, GTlsInteractionClass)) +#define G_IS_TLS_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TLS_INTERACTION)) +#define G_IS_TLS_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TLS_INTERACTION)) +#define G_TLS_INTERACTION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TLS_INTERACTION, GTlsInteractionClass)) + +typedef struct _GTlsInteractionClass GTlsInteractionClass; +typedef struct _GTlsInteractionPrivate GTlsInteractionPrivate; + +struct _GTlsInteraction +{ + /*< private >*/ + GObject parent_instance; + GTlsInteractionPrivate *priv; +}; + +struct _GTlsInteractionClass +{ + /*< private >*/ + GObjectClass parent_class; + + /*< public >*/ + GTlsInteractionResult (* ask_password) (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error); + + void (* ask_password_async) (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + GTlsInteractionResult (* ask_password_finish) (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[24]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_interaction_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsInteractionResult g_tls_interaction_invoke_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error); + + +GLIB_AVAILABLE_IN_ALL +GTlsInteractionResult g_tls_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_tls_interaction_ask_password_async (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GTlsInteractionResult g_tls_interaction_ask_password_finish (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_TLS_INTERACTION_H__ */ diff --git a/gio/gtlspassword.c b/gio/gtlspassword.c new file mode 100644 index 0000000..ad55ad4 --- /dev/null +++ b/gio/gtlspassword.c @@ -0,0 +1,454 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" +#include "glib.h" +#include "glibintl.h" + +#include "gioenumtypes.h" +#include "gtlspassword.h" + +#include + +/** + * SECTION:gtlspassword + * @title: GTlsPassword + * @short_description: TLS Passwords for prompting + * @include: gio/gio.h + * + * Holds a password used in TLS. + */ + +/** + * GTlsPassword: + * + * An abstract interface representing a password used in TLS. Often used in + * user interaction such as unlocking a key storage token. + * + * Since: 2.30 + */ + +enum +{ + PROP_0, + PROP_FLAGS, + PROP_DESCRIPTION, + PROP_WARNING +}; + +struct _GTlsPasswordPrivate +{ + guchar *value; + gsize length; + GDestroyNotify destroy; + GTlsPasswordFlags flags; + gchar *description; + gchar *warning; +}; + +G_DEFINE_TYPE (GTlsPassword, g_tls_password, G_TYPE_OBJECT); + +static void +g_tls_password_init (GTlsPassword *password) +{ + password->priv = G_TYPE_INSTANCE_GET_PRIVATE (password, G_TYPE_TLS_PASSWORD, + GTlsPasswordPrivate); +} + +static const guchar * +g_tls_password_real_get_value (GTlsPassword *password, + gsize *length) +{ + if (length) + *length = password->priv->length; + return password->priv->value; +} + +static void +g_tls_password_real_set_value (GTlsPassword *password, + guchar *value, + gssize length, + GDestroyNotify destroy) +{ + if (password->priv->destroy) + (password->priv->destroy) (password->priv->value); + password->priv->destroy = NULL; + password->priv->value = NULL; + password->priv->length = 0; + + if (length < 0) + length = strlen ((gchar*) value); + + password->priv->value = value; + password->priv->length = length; + password->priv->destroy = destroy; +} + +static const gchar* +g_tls_password_real_get_default_warning (GTlsPassword *password) +{ + GTlsPasswordFlags flags; + + flags = g_tls_password_get_flags (password); + + if (flags & G_TLS_PASSWORD_FINAL_TRY) + return _("This is the last chance to enter the password correctly before your access is locked out."); + if (flags & G_TLS_PASSWORD_MANY_TRIES) + return _("Several password entered have been incorrect, and your access will be locked out after further failures."); + if (flags & G_TLS_PASSWORD_RETRY) + return _("The password entered is incorrect."); + + return NULL; +} + +static void +g_tls_password_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTlsPassword *password = G_TLS_PASSWORD (object); + + switch (prop_id) + { + case PROP_FLAGS: + g_value_set_flags (value, g_tls_password_get_flags (password)); + break; + case PROP_WARNING: + g_value_set_string (value, g_tls_password_get_warning (password)); + break; + case PROP_DESCRIPTION: + g_value_set_string (value, g_tls_password_get_description (password)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_tls_password_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTlsPassword *password = G_TLS_PASSWORD (object); + + switch (prop_id) + { + case PROP_FLAGS: + g_tls_password_set_flags (password, g_value_get_flags (value)); + break; + case PROP_WARNING: + g_tls_password_set_warning (password, g_value_get_string (value)); + break; + case PROP_DESCRIPTION: + g_tls_password_set_description (password, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_tls_password_finalize (GObject *object) +{ + GTlsPassword *password = G_TLS_PASSWORD (object); + + g_tls_password_real_set_value (password, NULL, 0, NULL); + g_free (password->priv->warning); + g_free (password->priv->description); + + G_OBJECT_CLASS (g_tls_password_parent_class)->finalize (object); +} + +static void +g_tls_password_class_init (GTlsPasswordClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + klass->get_value = g_tls_password_real_get_value; + klass->set_value = g_tls_password_real_set_value; + klass->get_default_warning = g_tls_password_real_get_default_warning; + + gobject_class->get_property = g_tls_password_get_property; + gobject_class->set_property = g_tls_password_set_property; + gobject_class->finalize = g_tls_password_finalize; + + g_type_class_add_private (klass, sizeof (GTlsPasswordPrivate)); + + g_object_class_install_property (gobject_class, PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Flags"), + P_("Flags about the password"), + G_TYPE_TLS_PASSWORD_FLAGS, + G_TLS_PASSWORD_NONE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_DESCRIPTION, + g_param_spec_string ("description", + P_("Description"), + P_("Description of what the password is for"), + "", + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_WARNING, + g_param_spec_string ("warning", + P_("Warning"), + P_("Warning about the password"), + "", + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + +} + +/** + * g_tls_password_new: + * @flags: the password flags + * @description: description of what the password is for + * + * Create a new #GTlsPassword object. + * + * Returns: (transfer full): The newly allocated password object + */ +GTlsPassword * +g_tls_password_new (GTlsPasswordFlags flags, + const gchar *description) +{ + return g_object_new (G_TYPE_TLS_PASSWORD, + "flags", flags, + "description", description, + NULL); +} + +/** + * g_tls_password_get_value: + * @password: a #GTlsPassword object + * @length: (allow-none): location to place the length of the password. + * + * Get the password value. If @length is not %NULL then it will be + * filled in with the length of the password value. (Note that the + * password value is not nul-terminated, so you can only pass %NULL + * for @length in contexts where you know the password will have a + * certain fixed length.) + * + * Returns: The password value (owned by the password object). + * + * Since: 2.30 + */ +const guchar * +g_tls_password_get_value (GTlsPassword *password, + gsize *length) +{ + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), NULL); + return G_TLS_PASSWORD_GET_CLASS (password)->get_value (password, length); +} + +/** + * g_tls_password_set_value: + * @password: a #GTlsPassword object + * @value: the new password value + * @length: the length of the password, or -1 + * + * Set the value for this password. The @value will be copied by the password + * object. + * + * Specify the @length, for a non-nul-terminated password. Pass -1 as + * @length if using a nul-terminated password, and @length will be + * calculated automatically. (Note that the terminating nul is not + * considered part of the password in this case.) + * + * Since: 2.30 + */ +void +g_tls_password_set_value (GTlsPassword *password, + const guchar *value, + gssize length) +{ + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + + if (length < 0) + length = strlen ((gchar *)value); + + g_tls_password_set_value_full (password, g_memdup (value, length), length, g_free); +} + +/** + * g_tls_password_set_value_full: + * @password: a #GTlsPassword object + * @value: the value for the password + * @length: the length of the password, or -1 + * @destroy: (allow-none): a function to use to free the password. + * + * Provide the value for this password. + * + * The @value will be owned by the password object, and later freed using + * the @destroy function callback. + * + * Specify the @length, for a non-nul-terminated password. Pass -1 as + * @length if using a nul-terminated password, and @length will be + * calculated automatically. (Note that the terminating nul is not + * considered part of the password in this case.) + * + * Virtual: set_value + * Since: 2.30 + */ +void +g_tls_password_set_value_full (GTlsPassword *password, + guchar *value, + gssize length, + GDestroyNotify destroy) +{ + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + G_TLS_PASSWORD_GET_CLASS (password)->set_value (password, value, + length, destroy); +} + +/** + * g_tls_password_get_flags: + * @password: a #GTlsPassword object + * + * Get flags about the password. + * + * Return value: The flags about the password. + * + * Since: 2.30 + */ +GTlsPasswordFlags +g_tls_password_get_flags (GTlsPassword *password) +{ + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_PASSWORD_NONE); + return password->priv->flags; +} + +/** + * g_tls_password_set_flags: + * @password: a #GTlsPassword object + * @flags: The flags about the password + * + * Set flags about the password. + * + * Since: 2.30 + */ +void +g_tls_password_set_flags (GTlsPassword *password, + GTlsPasswordFlags flags) +{ + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + + password->priv->flags = flags; + + g_object_notify (G_OBJECT (password), "flags"); +} + +/** + * g_tls_password_get_description: + * @password: a #GTlsPassword object + * + * Get a description string about what the password will be used for. + * + * Return value: The description of the password. + * + * Since: 2.30 + */ +const gchar* +g_tls_password_get_description (GTlsPassword *password) +{ + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), NULL); + return password->priv->description; +} + +/** + * g_tls_password_set_description: + * @password: a #GTlsPassword object + * @description: The description of the password + * + * Set a description string about what the password will be used for. + * + * Since: 2.30 + */ +void +g_tls_password_set_description (GTlsPassword *password, + const gchar *description) +{ + gchar *copy; + + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + + copy = g_strdup (description); + g_free (password->priv->description); + password->priv->description = copy; + + g_object_notify (G_OBJECT (password), "description"); +} + +/** + * g_tls_password_get_warning: + * @password: a #GTlsPassword object + * + * Get a user readable translated warning. Usually this warning is a + * representation of the password flags returned from + * g_tls_password_get_flags(). + * + * Return value: The warning. + * + * Since: 2.30 + */ +const gchar * +g_tls_password_get_warning (GTlsPassword *password) +{ + g_return_val_if_fail (G_IS_TLS_PASSWORD (password), NULL); + + if (password->priv->warning == NULL) + return G_TLS_PASSWORD_GET_CLASS (password)->get_default_warning (password); + + return password->priv->warning; +} + +/** + * g_tls_password_set_warning: + * @password: a #GTlsPassword object + * @warning: The user readable warning + * + * Set a user readable translated warning. Usually this warning is a + * representation of the password flags returned from + * g_tls_password_get_flags(). + * + * Since: 2.30 + */ +void +g_tls_password_set_warning (GTlsPassword *password, + const gchar *warning) +{ + gchar *copy; + + g_return_if_fail (G_IS_TLS_PASSWORD (password)); + + copy = g_strdup (warning); + g_free (password->priv->warning); + password->priv->warning = copy; + + g_object_notify (G_OBJECT (password), "warning"); +} diff --git a/gio/gtlspassword.h b/gio/gtlspassword.h new file mode 100644 index 0000000..3db365d --- /dev/null +++ b/gio/gtlspassword.h @@ -0,0 +1,112 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#ifndef __G_TLS_PASSWORD_H__ +#define __G_TLS_PASSWORD_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_PASSWORD (g_tls_password_get_type ()) +#define G_TLS_PASSWORD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TLS_PASSWORD, GTlsPassword)) +#define G_TLS_PASSWORD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TLS_PASSWORD, GTlsPasswordClass)) +#define G_IS_TLS_PASSWORD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TLS_PASSWORD)) +#define G_IS_TLS_PASSWORD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TLS_PASSWORD)) +#define G_TLS_PASSWORD_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TLS_PASSWORD, GTlsPasswordClass)) + +typedef struct _GTlsPasswordClass GTlsPasswordClass; +typedef struct _GTlsPasswordPrivate GTlsPasswordPrivate; + +struct _GTlsPassword +{ + GObject parent_instance; + + GTlsPasswordPrivate *priv; +}; + +struct _GTlsPasswordClass +{ + GObjectClass parent_class; + + /* methods */ + + const guchar * ( *get_value) (GTlsPassword *password, + gsize *length); + + void ( *set_value) (GTlsPassword *password, + guchar *value, + gssize length, + GDestroyNotify destroy); + + const gchar* ( *get_default_warning) (GTlsPassword *password); + + /*< private >*/ + /* Padding for future expansion */ + gpointer padding[4]; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_password_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GTlsPassword * g_tls_password_new (GTlsPasswordFlags flags, + const gchar *description); + +GLIB_AVAILABLE_IN_ALL +const guchar * g_tls_password_get_value (GTlsPassword *password, + gsize *length); +GLIB_AVAILABLE_IN_ALL +void g_tls_password_set_value (GTlsPassword *password, + const guchar *value, + gssize length); +GLIB_AVAILABLE_IN_ALL +void g_tls_password_set_value_full (GTlsPassword *password, + guchar *value, + gssize length, + GDestroyNotify destroy); + +GLIB_AVAILABLE_IN_ALL +GTlsPasswordFlags g_tls_password_get_flags (GTlsPassword *password); +GLIB_AVAILABLE_IN_ALL +void g_tls_password_set_flags (GTlsPassword *password, + GTlsPasswordFlags flags); + +GLIB_AVAILABLE_IN_ALL +const gchar* g_tls_password_get_description (GTlsPassword *password); +GLIB_AVAILABLE_IN_ALL +void g_tls_password_set_description (GTlsPassword *password, + const gchar *description); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_tls_password_get_warning (GTlsPassword *password); +GLIB_AVAILABLE_IN_ALL +void g_tls_password_set_warning (GTlsPassword *password, + const gchar *warning); + +G_END_DECLS + +#endif /* __G_TLS_PASSWORD_H__ */ diff --git a/gio/gtlsserverconnection.c b/gio/gtlsserverconnection.c new file mode 100644 index 0000000..55af49a --- /dev/null +++ b/gio/gtlsserverconnection.c @@ -0,0 +1,96 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 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 "gtlsserverconnection.h" +#include "ginitable.h" +#include "gioenumtypes.h" +#include "gsocket.h" +#include "gtlsbackend.h" +#include "gtlscertificate.h" +#include "glibintl.h" + +/** + * SECTION:gtlsserverconnection + * @short_description: TLS server-side connection + * @include: gio/gio.h + * + * #GTlsServerConnection is the server-side subclass of #GTlsConnection, + * representing a server-side TLS connection. + * + * Since: 2.28 + */ + +G_DEFINE_INTERFACE (GTlsServerConnection, g_tls_server_connection, G_TYPE_TLS_CONNECTION) + +static void +g_tls_server_connection_default_init (GTlsServerConnectionInterface *iface) +{ + /** + * GTlsServerConnection:authentication-mode: + * + * The #GTlsAuthenticationMode for the server. This can be changed + * before calling g_tls_connection_handshake() if you want to + * rehandshake with a different mode from the initial handshake. + * + * Since: 2.28 + */ + g_object_interface_install_property (iface, + g_param_spec_enum ("authentication-mode", + P_("Authentication Mode"), + P_("The client authentication mode"), + G_TYPE_TLS_AUTHENTICATION_MODE, + G_TLS_AUTHENTICATION_NONE, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +/** + * g_tls_server_connection_new: + * @base_io_stream: the #GIOStream to wrap + * @certificate: (allow-none): the default server certificate, or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Creates a new #GTlsServerConnection wrapping @base_io_stream (which + * must have pollable input and output streams). + * + * Return value: (transfer full) (type GTlsServerConnection): the new + * #GTlsServerConnection, or %NULL on error + * + * Since: 2.28 + */ +GIOStream * +g_tls_server_connection_new (GIOStream *base_io_stream, + GTlsCertificate *certificate, + GError **error) +{ + GObject *conn; + GTlsBackend *backend; + + backend = g_tls_backend_get_default (); + conn = g_initable_new (g_tls_backend_get_server_connection_type (backend), + NULL, error, + "base-io-stream", base_io_stream, + "certificate", certificate, + NULL); + return G_IO_STREAM (conn); +} diff --git a/gio/gtlsserverconnection.h b/gio/gtlsserverconnection.h new file mode 100644 index 0000000..6550d19 --- /dev/null +++ b/gio/gtlsserverconnection.h @@ -0,0 +1,63 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 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_TLS_SERVER_CONNECTION_H__ +#define __G_TLS_SERVER_CONNECTION_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_SERVER_CONNECTION (g_tls_server_connection_get_type ()) +#define G_TLS_SERVER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_TLS_SERVER_CONNECTION, GTlsServerConnection)) +#define G_IS_TLS_SERVER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_SERVER_CONNECTION)) +#define G_TLS_SERVER_CONNECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TLS_SERVER_CONNECTION, GTlsServerConnectionInterface)) + +/** + * GTlsServerConnection: + * + * TLS server-side connection. This is the server-side implementation + * of a #GTlsConnection. + * + * Since: 2.28 + */ +typedef struct _GTlsServerConnectionInterface GTlsServerConnectionInterface; + +struct _GTlsServerConnectionInterface +{ + GTypeInterface g_iface; + +}; + +GLIB_AVAILABLE_IN_ALL +GType g_tls_server_connection_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GIOStream * g_tls_server_connection_new (GIOStream *base_io_stream, + GTlsCertificate *certificate, + GError **error); + +G_END_DECLS + +#endif /* __G_TLS_SERVER_CONNECTION_H__ */ diff --git a/gio/gunionvolumemonitor.c b/gio/gunionvolumemonitor.c new file mode 100644 index 0000000..cd814ad --- /dev/null +++ b/gio/gunionvolumemonitor.c @@ -0,0 +1,690 @@ +/* -*- 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" + + +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 GRecMutex the_volume_monitor_mutex; + +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_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_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_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_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_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_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_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_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_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_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_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_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: (transfer full): 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_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_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_rec_mutex_lock (&the_volume_monitor_mutex); + mount = klass->get_mount_for_mount_path (mount_path, cancellable); + g_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 + * associated 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: (transfer full): 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_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_rec_mutex_unlock (&the_volume_monitor_mutex); + + return volume; +} 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..1c94051 --- /dev/null +++ b/gio/gunixconnection.c @@ -0,0 +1,684 @@ +/* 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 "gnetworking.h" +#include "gsocket.h" +#include "gsocketcontrolmessage.h" +#include "gunixcredentialsmessage.h" +#include "gunixfdmessage.h" +#include "glibintl.h" + +#include +#include +#include + +/** + * SECTION:gunixconnection + * @title: GUnixConnection + * @short_description: A UNIX domain GSocketConnection + * @include: gio/gunixconnection.h + * @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 + * functionality like passing file descriptors. + * + * Note that <gio/gunixconnection.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. + * + * Since: 2.22 + */ + +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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @error: (allow-none): #GError for error reporting, or %NULL to ignore. + * + * Passes a file descriptor to the receiving side of the + * connection. The receiving 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: (allow-none): optional #GCancellable object, %NULL to ignore + * @error: (allow-none): #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_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_create_pair (GUnixConnection **one, + GUnixConnection **two, + GError **error); +*/ + + +/** + * g_unix_connection_send_credentials: + * @connection: A #GUnixConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Passes the credentials of the current user the receiving side + * of the connection. The receiving end has to call + * g_unix_connection_receive_credentials() (or similar) to accept the + * credentials. + * + * As well as sending the credentials this also writes a single NUL + * byte to the stream, as this is required for credentials passing to + * work on some implementations. + * + * Other ways to exchange credentials with a foreign peer includes the + * #GUnixCredentialsMessage type and g_socket_get_credentials() function. + * + * Returns: %TRUE on success, %FALSE if @error is set. + * + * Since: 2.26 + */ +gboolean +g_unix_connection_send_credentials (GUnixConnection *connection, + GCancellable *cancellable, + GError **error) +{ + GCredentials *credentials; + GSocketControlMessage *scm; + GSocket *socket; + gboolean ret; + GOutputVector vector; + guchar nul_byte[1] = {'\0'}; + gint num_messages; + + g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + ret = FALSE; + + credentials = g_credentials_new (); + + vector.buffer = &nul_byte; + vector.size = 1; + + if (g_unix_credentials_message_is_supported ()) + { + scm = g_unix_credentials_message_new_with_credentials (credentials); + num_messages = 1; + } + else + { + scm = NULL; + num_messages = 0; + } + + g_object_get (connection, "socket", &socket, NULL); + if (g_socket_send_message (socket, + NULL, /* address */ + &vector, + 1, + &scm, + num_messages, + G_SOCKET_MSG_NONE, + cancellable, + error) != 1) + { + g_prefix_error (error, _("Error sending credentials: ")); + goto out; + } + + ret = TRUE; + + out: + g_object_unref (socket); + if (scm != NULL) + g_object_unref (scm); + g_object_unref (credentials); + return ret; +} + +static void +send_credentials_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GError *error = NULL; + + if (g_unix_connection_send_credentials (G_UNIX_CONNECTION (source_object), + cancellable, + &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_unix_connection_send_credentials_async: + * @connection: A #GUnixConnection. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Asynchronously send credentials. + * + * For more details, see g_unix_connection_send_credentials() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_unix_connection_send_credentials_finish() to get the result of the operation. + * + * Since: 2.32 + **/ +void +g_unix_connection_send_credentials_async (GUnixConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (connection, cancellable, callback, user_data); + + g_task_run_in_thread (task, send_credentials_async_thread); +} + +/** + * g_unix_connection_send_credentials_finish: + * @connection: A #GUnixConnection. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous send credentials operation started with + * g_unix_connection_send_credentials_async(). + * + * Returns: %TRUE if the operation was successful, otherwise %FALSE. + * + * Since: 2.32 + **/ +gboolean +g_unix_connection_send_credentials_finish (GUnixConnection *connection, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, connection), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +/** + * g_unix_connection_receive_credentials: + * @connection: A #GUnixConnection. + * @cancellable: (allow-none): A #GCancellable or %NULL. + * @error: Return location for error or %NULL. + * + * Receives credentials from the sending end of the connection. The + * sending end has to call g_unix_connection_send_credentials() (or + * similar) for this to work. + * + * As well as reading the credentials this also reads (and discards) a + * single byte from the stream, as this is required for credentials + * passing to work on some implementations. + * + * Other ways to exchange credentials with a foreign peer includes the + * #GUnixCredentialsMessage type and g_socket_get_credentials() function. + * + * Returns: (transfer full): Received credentials on success (free with + * g_object_unref()), %NULL if @error is set. + * + * Since: 2.26 + */ +GCredentials * +g_unix_connection_receive_credentials (GUnixConnection *connection, + GCancellable *cancellable, + GError **error) +{ + GCredentials *ret; + GSocketControlMessage **scms; + gint nscm; + GSocket *socket; + gint n; + gssize num_bytes_read; +#ifdef __linux__ + gboolean turn_off_so_passcreds; +#endif + + g_return_val_if_fail (G_IS_UNIX_CONNECTION (connection), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + ret = NULL; + scms = NULL; + + g_object_get (connection, "socket", &socket, NULL); + + /* On Linux, we need to turn on SO_PASSCRED if it isn't enabled + * already. We also need to turn it off when we're done. See + * #617483 for more discussion. + */ +#ifdef __linux__ + { + gint opt_val; + + turn_off_so_passcreds = FALSE; + opt_val = 0; + if (!g_socket_get_option (socket, + SOL_SOCKET, + SO_PASSCRED, + &opt_val, + NULL)) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error checking if SO_PASSCRED is enabled for socket: %s"), + strerror (errno)); + goto out; + } + if (opt_val == 0) + { + if (!g_socket_set_option (socket, + SOL_SOCKET, + SO_PASSCRED, + TRUE, + NULL)) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error enabling SO_PASSCRED: %s"), + strerror (errno)); + goto out; + } + turn_off_so_passcreds = TRUE; + } + } +#endif + + g_type_ensure (G_TYPE_UNIX_CREDENTIALS_MESSAGE); + num_bytes_read = g_socket_receive_message (socket, + NULL, /* GSocketAddress **address */ + NULL, + 0, + &scms, + &nscm, + NULL, + cancellable, + error); + if (num_bytes_read != 1) + { + /* Handle situation where g_socket_receive_message() returns + * 0 bytes and not setting @error + */ + if (num_bytes_read == 0 && error != NULL && *error == NULL) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Expecting to read a single byte for receiving credentials but read zero bytes")); + } + goto out; + } + + if (g_unix_credentials_message_is_supported () && + /* Fall back on get_credentials if the other side didn't send the credentials */ + nscm > 0) + { + if (nscm != 1) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Expecting 1 control message, got %d"), + nscm); + goto out; + } + + if (!G_IS_UNIX_CREDENTIALS_MESSAGE (scms[0])) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Unexpected type of ancillary data")); + goto out; + } + + ret = g_unix_credentials_message_get_credentials (G_UNIX_CREDENTIALS_MESSAGE (scms[0])); + g_object_ref (ret); + } + else + { + if (nscm != 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + _("Not expecting control message, but got %d"), + nscm); + goto out; + } + else + { + ret = g_socket_get_credentials (socket, error); + } + } + + out: + +#ifdef __linux__ + if (turn_off_so_passcreds) + { + if (!g_socket_set_option (socket, + SOL_SOCKET, + SO_PASSCRED, + FALSE, + NULL)) + { + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + _("Error while disabling SO_PASSCRED: %s"), + strerror (errno)); + goto out; + } + } +#endif + + if (scms != NULL) + { + for (n = 0; n < nscm; n++) + g_object_unref (scms[n]); + g_free (scms); + } + g_object_unref (socket); + return ret; +} + +static void +receive_credentials_async_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GCredentials *creds; + GError *error = NULL; + + creds = g_unix_connection_receive_credentials (G_UNIX_CONNECTION (source_object), + cancellable, + &error); + if (creds) + g_task_return_pointer (task, creds, g_object_unref); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +/** + * g_unix_connection_receive_credentials_async: + * @connection: A #GUnixConnection. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: (closure): the data to pass to callback function + * + * Asynchronously receive credentials. + * + * For more details, see g_unix_connection_receive_credentials() which is + * the synchronous version of this call. + * + * When the operation is finished, @callback will be called. You can then call + * g_unix_connection_receive_credentials_finish() to get the result of the operation. + * + * Since: 2.32 + **/ +void +g_unix_connection_receive_credentials_async (GUnixConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (connection, cancellable, callback, user_data); + + g_task_run_in_thread (task, receive_credentials_async_thread); +} + +/** + * g_unix_connection_receive_credentials_finish: + * @connection: A #GUnixConnection. + * @result: a #GAsyncResult. + * @error: a #GError, or %NULL + * + * Finishes an asynchronous receive credentials operation started with + * g_unix_connection_receive_credentials_async(). + * + * Returns: (transfer full): a #GCredentials, or %NULL on error. + * Free the returned object with g_object_unref(). + * + * Since: 2.32 + **/ +GCredentials * +g_unix_connection_receive_credentials_finish (GUnixConnection *connection, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, connection), NULL); + + return g_task_propagate_pointer (G_TASK (result), error); +} diff --git a/gio/gunixconnection.h b/gio/gunixconnection.h new file mode 100644 index 0000000..bd87374 --- /dev/null +++ b/gio/gunixconnection.h @@ -0,0 +1,100 @@ +/* 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)) + +typedef struct _GUnixConnection GUnixConnection; +typedef struct _GUnixConnectionPrivate GUnixConnectionPrivate; +typedef struct _GUnixConnectionClass GUnixConnectionClass; + +struct _GUnixConnectionClass +{ + GSocketConnectionClass parent_class; +}; + +struct _GUnixConnection +{ + GSocketConnection parent_instance; + GUnixConnectionPrivate *priv; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_connection_get_type (void); + +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_connection_send_fd (GUnixConnection *connection, + gint fd, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint g_unix_connection_receive_fd (GUnixConnection *connection, + GCancellable *cancellable, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_connection_send_credentials (GUnixConnection *connection, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_32 +void g_unix_connection_send_credentials_async (GUnixConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_2_32 +gboolean g_unix_connection_send_credentials_finish (GUnixConnection *connection, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +GCredentials *g_unix_connection_receive_credentials (GUnixConnection *connection, + GCancellable *cancellable, + GError **error); +GLIB_AVAILABLE_IN_2_32 +void g_unix_connection_receive_credentials_async (GUnixConnection *connection, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GCredentials *g_unix_connection_receive_credentials_finish (GUnixConnection *connection, + GAsyncResult *result, + GError **error); + +G_END_DECLS + +#endif /* __G_UNIX_CONNECTION_H__ */ diff --git a/gio/gunixcredentialsmessage.c b/gio/gunixcredentialsmessage.c new file mode 100644 index 0000000..541b58c --- /dev/null +++ b/gio/gunixcredentialsmessage.c @@ -0,0 +1,389 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Red Hat, Inc. + * Copyright (C) 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: David Zeuthen + */ + +/** + * SECTION:gunixcredentialsmessage + * @title: GUnixCredentialsMessage + * @short_description: A GSocketControlMessage containing credentials + * @include: gio/gunixcredentialsmessage.h + * @see_also: #GUnixConnection, #GSocketControlMessage + * + * This #GSocketControlMessage contains a #GCredentials instance. 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_FAMILY_UNIX family). + * + * For an easier way to send and receive credentials over + * stream-oriented UNIX sockets, see + * g_unix_connection_send_credentials() and + * g_unix_connection_receive_credentials(). To receive credentials of + * a foreign process connected to a socket, use + * g_socket_get_credentials(). + */ + +#include "config.h" + +/* ---------------------------------------------------------------------------------------------------- */ +#ifdef __linux__ +#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1 +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) +#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 1 +#else +/* TODO: please add support for your UNIX flavor */ +#define G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED 0 +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "gunixcredentialsmessage.h" +#include "gcredentials.h" +#include "gnetworking.h" + +#include "glibintl.h" + +struct _GUnixCredentialsMessagePrivate +{ + GCredentials *credentials; +}; + +enum +{ + PROP_0, + PROP_CREDENTIALS +}; + +G_DEFINE_TYPE (GUnixCredentialsMessage, g_unix_credentials_message, G_TYPE_SOCKET_CONTROL_MESSAGE); + +static gsize +g_unix_credentials_message_get_size (GSocketControlMessage *message) +{ +#ifdef __linux__ + return sizeof (struct ucred); +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + return sizeof (struct cmsgcred); +#else + return 0; +#endif +} + +static int +g_unix_credentials_message_get_level (GSocketControlMessage *message) +{ +#ifdef __linux__ + return SOL_SOCKET; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + return SOL_SOCKET; +#else + return 0; +#endif +} + +static int +g_unix_credentials_message_get_msg_type (GSocketControlMessage *message) +{ +#ifdef __linux__ + return SCM_CREDENTIALS; +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + return SCM_CREDS; +#else + return 0; +#endif +} + +static GSocketControlMessage * +g_unix_credentials_message_deserialize (gint level, + gint type, + gsize size, + gpointer data) +{ + GSocketControlMessage *message; + + message = NULL; + +#ifdef __linux__ + { + GCredentials *credentials; + struct ucred *ucred; + + if (level != SOL_SOCKET || type != SCM_CREDENTIALS) + goto out; + + if (size != sizeof (struct ucred)) + { + g_warning ("Expected a struct ucred (%" G_GSIZE_FORMAT " bytes) but " + "got %" G_GSIZE_FORMAT " bytes of data", + sizeof (struct ucred), + size); + goto out; + } + + ucred = data; + + if (ucred->uid == (uid_t)-1 && + ucred->gid == (gid_t)-1) + { + /* This happens if the remote side didn't pass the credentials */ + goto out; + } + + credentials = g_credentials_new (); + g_credentials_set_native (credentials, G_CREDENTIALS_TYPE_LINUX_UCRED, ucred); + message = g_unix_credentials_message_new_with_credentials (credentials); + g_object_unref (credentials); + out: + ; + } +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + { + GCredentials *credentials; + struct cmsgcred *cred; + + if (level != SOL_SOCKET || type != SCM_CREDS) + { + goto out; + } + if (size < sizeof *cred) + { + g_warning ("Expected a struct cmsgcred (%" G_GSIZE_FORMAT " bytes) but " + "got %" G_GSIZE_FORMAT " bytes of data", + CMSG_LEN (sizeof *cred), + size); + goto out; + } + + cred = data; + + credentials = g_credentials_new (); + g_credentials_set_native (credentials, G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED, cred); + message = g_unix_credentials_message_new_with_credentials (credentials); + g_object_unref (credentials); + out: + ; + } +#endif + + return message; +} + +static void +g_unix_credentials_message_serialize (GSocketControlMessage *_message, + gpointer data) +{ + GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (_message); +#ifdef __linux__ + memcpy (data, + g_credentials_get_native (message->priv->credentials, + G_CREDENTIALS_TYPE_LINUX_UCRED), + sizeof (struct ucred)); +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + memcpy (data, + g_credentials_get_native (message->priv->credentials, + G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED), + sizeof (struct cmsgcred)); + +#endif +} + +static void +g_unix_credentials_message_finalize (GObject *object) +{ + GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (object); + + if (message->priv->credentials != NULL) + g_object_unref (message->priv->credentials); + + G_OBJECT_CLASS (g_unix_credentials_message_parent_class)->finalize (object); +} + +static void +g_unix_credentials_message_init (GUnixCredentialsMessage *message) +{ + message->priv = G_TYPE_INSTANCE_GET_PRIVATE (message, + G_TYPE_UNIX_CREDENTIALS_MESSAGE, + GUnixCredentialsMessagePrivate); +} + +static void +g_unix_credentials_message_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (object); + + switch (prop_id) + { + case PROP_CREDENTIALS: + g_value_set_object (value, message->priv->credentials); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_credentials_message_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (object); + + switch (prop_id) + { + case PROP_CREDENTIALS: + message->priv->credentials = g_value_dup_object (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_credentials_message_constructed (GObject *object) +{ + GUnixCredentialsMessage *message = G_UNIX_CREDENTIALS_MESSAGE (object); + + if (message->priv->credentials == NULL) + message->priv->credentials = g_credentials_new (); + + if (G_OBJECT_CLASS (g_unix_credentials_message_parent_class)->constructed != NULL) + G_OBJECT_CLASS (g_unix_credentials_message_parent_class)->constructed (object); +} + +static void +g_unix_credentials_message_class_init (GUnixCredentialsMessageClass *class) +{ + GSocketControlMessageClass *scm_class; + GObjectClass *gobject_class; + + g_type_class_add_private (class, sizeof (GUnixCredentialsMessagePrivate)); + + gobject_class = G_OBJECT_CLASS (class); + gobject_class->get_property = g_unix_credentials_message_get_property; + gobject_class->set_property = g_unix_credentials_message_set_property; + gobject_class->finalize = g_unix_credentials_message_finalize; + gobject_class->constructed = g_unix_credentials_message_constructed; + + scm_class = G_SOCKET_CONTROL_MESSAGE_CLASS (class); + scm_class->get_size = g_unix_credentials_message_get_size; + scm_class->get_level = g_unix_credentials_message_get_level; + scm_class->get_type = g_unix_credentials_message_get_msg_type; + scm_class->serialize = g_unix_credentials_message_serialize; + scm_class->deserialize = g_unix_credentials_message_deserialize; + + /** + * GUnixCredentialsMessage:credentials: + * + * The credentials stored in the message. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CREDENTIALS, + g_param_spec_object ("credentials", + P_("Credentials"), + P_("The credentials stored in the message"), + G_TYPE_CREDENTIALS, + G_PARAM_READABLE | + G_PARAM_WRITABLE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NAME | + G_PARAM_STATIC_BLURB | + G_PARAM_STATIC_NICK)); + +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_unix_credentials_message_is_supported: + * + * Checks if passing #GCredentials on a #GSocket is supported on this platform. + * + * Returns: %TRUE if supported, %FALSE otherwise + * + * Since: 2.26 + */ +gboolean +g_unix_credentials_message_is_supported (void) +{ + return G_UNIX_CREDENTIALS_MESSAGE_SUPPORTED; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/** + * g_unix_credentials_message_new: + * + * Creates a new #GUnixCredentialsMessage with credentials matching the current processes. + * + * Returns: a new #GUnixCredentialsMessage + * + * Since: 2.26 + */ +GSocketControlMessage * +g_unix_credentials_message_new (void) +{ + g_return_val_if_fail (g_unix_credentials_message_is_supported (), NULL); + return g_object_new (G_TYPE_UNIX_CREDENTIALS_MESSAGE, + NULL); +} + +/** + * g_unix_credentials_message_new_with_credentials: + * @credentials: A #GCredentials object. + * + * Creates a new #GUnixCredentialsMessage holding @credentials. + * + * Returns: a new #GUnixCredentialsMessage + * + * Since: 2.26 + */ +GSocketControlMessage * +g_unix_credentials_message_new_with_credentials (GCredentials *credentials) +{ + g_return_val_if_fail (G_IS_CREDENTIALS (credentials), NULL); + g_return_val_if_fail (g_unix_credentials_message_is_supported (), NULL); + return g_object_new (G_TYPE_UNIX_CREDENTIALS_MESSAGE, + "credentials", credentials, + NULL); +} + +/** + * g_unix_credentials_message_get_credentials: + * @message: A #GUnixCredentialsMessage. + * + * Gets the credentials stored in @message. + * + * Returns: (transfer none): A #GCredentials instance. Do not free, it is owned by @message. + * + * Since: 2.26 + */ +GCredentials * +g_unix_credentials_message_get_credentials (GUnixCredentialsMessage *message) +{ + g_return_val_if_fail (G_IS_UNIX_CREDENTIALS_MESSAGE (message), NULL); + return message->priv->credentials; +} diff --git a/gio/gunixcredentialsmessage.h b/gio/gunixcredentialsmessage.h new file mode 100644 index 0000000..17b4a31 --- /dev/null +++ b/gio/gunixcredentialsmessage.h @@ -0,0 +1,87 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2010 Red Hat, Inc. + * Copyright (C) 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: David Zeuthen + */ + +#ifndef __G_UNIX_CREDENTIALS_MESSAGE_H__ +#define __G_UNIX_CREDENTIALS_MESSAGE_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_UNIX_CREDENTIALS_MESSAGE (g_unix_credentials_message_get_type ()) +#define G_UNIX_CREDENTIALS_MESSAGE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_UNIX_CREDENTIALS_MESSAGE, GUnixCredentialsMessage)) +#define G_UNIX_CREDENTIALS_MESSAGE_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), G_TYPE_UNIX_CREDENTIALS_MESSAGE, GUnixCredentialsMessageClass)) +#define G_IS_UNIX_CREDENTIALS_MESSAGE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_UNIX_CREDENTIALS_MESSAGE)) +#define G_IS_UNIX_CREDENTIALS_MESSAGE_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), G_TYPE_UNIX_CREDENTIALS_MESSAGE)) +#define G_UNIX_CREDENTIALS_MESSAGE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_CREDENTIALS_MESSAGE, GUnixCredentialsMessageClass)) + +typedef struct _GUnixCredentialsMessagePrivate GUnixCredentialsMessagePrivate; +typedef struct _GUnixCredentialsMessageClass GUnixCredentialsMessageClass; + +/** + * GUnixCredentialsMessageClass: + * + * Class structure for #GUnixCredentialsMessage. + * + * Since: 2.26 + */ +struct _GUnixCredentialsMessageClass +{ + GSocketControlMessageClass parent_class; + + /*< private >*/ + + /* Padding for future expansion */ + void (*_g_reserved1) (void); + void (*_g_reserved2) (void); +}; + +/** + * GUnixCredentialsMessage: + * + * The #GUnixCredentialsMessage structure contains only private data + * and should only be accessed using the provided API. + * + * Since: 2.26 + */ +struct _GUnixCredentialsMessage +{ + GSocketControlMessage parent_instance; + GUnixCredentialsMessagePrivate *priv; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_credentials_message_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GSocketControlMessage *g_unix_credentials_message_new (void); +GLIB_AVAILABLE_IN_ALL +GSocketControlMessage *g_unix_credentials_message_new_with_credentials (GCredentials *credentials); +GLIB_AVAILABLE_IN_ALL +GCredentials *g_unix_credentials_message_get_credentials (GUnixCredentialsMessage *message); + +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_credentials_message_is_supported (void); + +G_END_DECLS + +#endif /* __G_UNIX_CREDENTIALS_MESSAGE_H__ */ diff --git a/gio/gunixfdlist.c b/gio/gunixfdlist.c new file mode 100644 index 0000000..628d95c --- /dev/null +++ b/gio/gunixfdlist.c @@ -0,0 +1,397 @@ +/* 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 UNIX file descriptors + * @include: gio/gunixfdlist.h + * @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(). + * + * Note that <gio/gunixfdlist.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. + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "gunixfdlist.h" +#include "gnetworking.h" +#include "gioerror.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)); + + 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: (array length=n_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: (out) (allow-none): 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: (array length=length) (transfer full): 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: (out) (allow-none): 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: (array length=length) (transfer none): 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; +} diff --git a/gio/gunixfdlist.h b/gio/gunixfdlist.h new file mode 100644 index 0000000..6bbfb48 --- /dev/null +++ b/gio/gunixfdlist.h @@ -0,0 +1,96 @@ +/* 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; + +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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_fd_list_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GUnixFDList * g_unix_fd_list_new (void); +GLIB_AVAILABLE_IN_ALL +GUnixFDList * g_unix_fd_list_new_from_array (const gint *fds, + gint n_fds); + +GLIB_AVAILABLE_IN_ALL +gint g_unix_fd_list_append (GUnixFDList *list, + gint fd, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gint g_unix_fd_list_get_length (GUnixFDList *list); + +GLIB_AVAILABLE_IN_ALL +gint g_unix_fd_list_get (GUnixFDList *list, + gint index_, + GError **error); + +GLIB_AVAILABLE_IN_ALL +const gint * g_unix_fd_list_peek_fds (GUnixFDList *list, + gint *length); + +GLIB_AVAILABLE_IN_ALL +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..4e7f494 --- /dev/null +++ b/gio/gunixfdmessage.c @@ -0,0 +1,325 @@ +/* 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 + * @include: gio/gunixfdmessage.h + * @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(). + * + * Note that <gio/gunixfdmessage.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. + **/ + +#include "config.h" + +#include +#include +#include +#include + +#include "gunixfdmessage.h" +#include "gunixfdlist.h" +#include "gnetworking.h" +#include "gioerror.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); + + /* Note we probably handled this in gsocket.c already if we're on + * Linux and have MSG_CMSG_CLOEXEC, but this code remains as a fallback + * in case the kernel is too old for MSG_CMSG_CLOEXEC. + */ + 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: (transfer none): 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: (out) (allow-none): 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: (array length=length) (transfer full): 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), NULL); + + 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; +} diff --git a/gio/gunixfdmessage.h b/gio/gunixfdmessage.h new file mode 100644 index 0000000..41f9b0a --- /dev/null +++ b/gio/gunixfdmessage.h @@ -0,0 +1,84 @@ +/* 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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_fd_message_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GSocketControlMessage * g_unix_fd_message_new_with_fd_list (GUnixFDList *fd_list); +GLIB_AVAILABLE_IN_ALL +GSocketControlMessage * g_unix_fd_message_new (void); + +GLIB_AVAILABLE_IN_ALL +GUnixFDList * g_unix_fd_message_get_fd_list (GUnixFDMessage *message); + +GLIB_AVAILABLE_IN_ALL +gint * g_unix_fd_message_steal_fds (GUnixFDMessage *message, + gint *length); +GLIB_AVAILABLE_IN_ALL +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..5ed5cd8 --- /dev/null +++ b/gio/gunixinputstream.c @@ -0,0 +1,534 @@ +/* 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 "gfiledescriptorbased.h" +#include "glibintl.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. (If the file + * descriptor refers to a socket or pipe, this will use poll() to do + * asynchronous I/O. If it refers to a regular file, it will fall back + * to doing asynchronous I/O in another thread.) + * + * 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 +}; + +static void g_unix_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface); +static void g_unix_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GUnixInputStream, g_unix_input_stream, G_TYPE_INPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, + g_unix_input_stream_pollable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, + g_unix_input_stream_file_descriptor_based_iface_init) + ) + +struct _GUnixInputStreamPrivate { + int fd; + guint close_fd : 1; + guint is_pipe_or_socket : 1; +}; + +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_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 gboolean g_unix_input_stream_pollable_can_poll (GPollableInputStream *stream); +static gboolean g_unix_input_stream_pollable_is_readable (GPollableInputStream *stream); +static GSource *g_unix_input_stream_pollable_create_source (GPollableInputStream *stream, + GCancellable *cancellable); + +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; + 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_pollable_iface_init (GPollableInputStreamInterface *iface) +{ + iface->can_poll = g_unix_input_stream_pollable_can_poll; + iface->is_readable = g_unix_input_stream_pollable_is_readable; + iface->create_source = g_unix_input_stream_pollable_create_source; +} + +static void +g_unix_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = (int (*) (GFileDescriptorBased *))g_unix_input_stream_get_fd; +} + +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); + if (lseek (unix_stream->priv->fd, 0, SEEK_CUR) == -1 && errno == ESPIPE) + unix_stream->priv->is_pipe_or_socket = TRUE; + else + unix_stream->priv->is_pipe_or_socket = FALSE; + 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 = -1; + GPollFD poll_fds[2]; + int nfds; + int poll_ret; + + unix_stream = G_UNIX_INPUT_STREAM (stream); + + poll_fds[0].fd = unix_stream->priv->fd; + poll_fds[0].events = G_IO_IN; + if (unix_stream->priv->is_pipe_or_socket && + g_cancellable_make_pollfd (cancellable, &poll_fds[1])) + nfds = 2; + else + nfds = 1; + + while (1) + { + poll_fds[0].revents = poll_fds[1].revents = 0; + do + poll_ret = g_poll (poll_fds, nfds, -1); + while (poll_ret == -1 && errno == EINTR); + + if (poll_ret == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from file descriptor: %s"), + g_strerror (errsv)); + break; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + + if (!poll_fds[0].revents) + continue; + + res = read (unix_stream->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR || errsv == EAGAIN) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error reading from file descriptor: %s"), + g_strerror (errsv)); + } + + break; + } + + if (nfds == 2) + g_cancellable_release_fd (cancellable); + 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; + + /* 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 file descriptor: %s"), + g_strerror (errsv)); + } + + return res != -1; +} + +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 */ +} + +static void +g_unix_input_stream_close_async (GInputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *error = NULL; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + if (g_unix_input_stream_close (stream, cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +static gboolean +g_unix_input_stream_close_finish (GInputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +g_unix_input_stream_pollable_can_poll (GPollableInputStream *stream) +{ + return G_UNIX_INPUT_STREAM (stream)->priv->is_pipe_or_socket; +} + +static gboolean +g_unix_input_stream_pollable_is_readable (GPollableInputStream *stream) +{ + GUnixInputStream *unix_stream = G_UNIX_INPUT_STREAM (stream); + GPollFD poll_fd; + gint result; + + poll_fd.fd = unix_stream->priv->fd; + poll_fd.events = G_IO_IN; + poll_fd.revents = 0; + + do + result = g_poll (&poll_fd, 1, 0); + while (result == -1 && errno == EINTR); + + return poll_fd.revents != 0; +} + +static GSource * +g_unix_input_stream_pollable_create_source (GPollableInputStream *stream, + GCancellable *cancellable) +{ + GUnixInputStream *unix_stream = G_UNIX_INPUT_STREAM (stream); + GSource *inner_source, *pollable_source; + + pollable_source = g_pollable_source_new (G_OBJECT (stream)); + + inner_source = _g_fd_source_new (unix_stream->priv->fd, G_IO_IN, cancellable); + g_source_set_dummy_callback (inner_source); + g_source_add_child_source (pollable_source, inner_source); + g_source_unref (inner_source); + + return pollable_source; +} diff --git a/gio/gunixinputstream.h b/gio/gunixinputstream.h new file mode 100644 index 0000000..a8beb88 --- /dev/null +++ b/gio/gunixinputstream.h @@ -0,0 +1,83 @@ +/* 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_input_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GInputStream * g_unix_input_stream_new (gint fd, + gboolean close_fd); +GLIB_AVAILABLE_IN_ALL +void g_unix_input_stream_set_close_fd (GUnixInputStream *stream, + gboolean close_fd); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_input_stream_get_close_fd (GUnixInputStream *stream); +GLIB_AVAILABLE_IN_ALL +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..3f79714 --- /dev/null +++ b/gio/gunixmount.c @@ -0,0 +1,486 @@ +/* -*- 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 + + +struct _GUnixMount { + GObject parent; + + GVolumeMonitor *volume_monitor; + + GUnixVolume *volume; /* owned by volume monitor */ + + char *name; + GIcon *icon; + GIcon *symbolic_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_object_unref (mount->symbolic_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); + mount->symbolic_icon = g_unix_mount_guess_symbolic_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 GIcon * +g_unix_mount_get_symbolic_icon (GMount *mount) +{ + GUnixMount *unix_mount = G_UNIX_MOUNT (mount); + + return g_object_ref (unix_mount->symbolic_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; + int error_fd; + GIOChannel *error_channel; + GSource *error_channel_source; + GString *error_string; + gchar **argv; +} UnmountEjectOp; + +static void +unmount_eject_op_free (UnmountEjectOp *data) +{ + 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_free (data); +} + +static void +eject_unmount_cb (GPid pid, gint status, gpointer user_data) +{ + GTask *task = user_data; + UnmountEjectOp *data = g_task_get_task_data (task); + + if (g_task_return_error_if_cancelled (task)) + return; + + g_spawn_close_pid (pid); + + if (WEXITSTATUS (status) != 0) + { + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "%s", data->error_string->str); + } + else + g_task_return_boolean (task, TRUE); + + g_object_unref (task); +} + +static gboolean +eject_unmount_read_error (GIOChannel *channel, + GIOCondition condition, + gpointer user_data) +{ + GTask *task = user_data; + UnmountEjectOp *data = g_task_get_task_data (task); + char buf[BUFSIZ]; + gsize bytes_read; + GError *error; + GIOStatus status; + + if (g_task_return_error_if_cancelled (task)) + return FALSE; + + 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) +{ + GTask *task = user_data; + UnmountEjectOp *data = g_task_get_task_data (task); + GPid child_pid; + GSource *child_watch; + GError *error = NULL; + + if (g_task_return_error_if_cancelled (task)) + return G_SOURCE_REMOVE; + + 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_task_attach_source (task, data->error_channel_source, + (GSourceFunc) eject_unmount_read_error); + + child_watch = g_child_watch_source_new (child_pid); + g_task_attach_source (task, data->error_channel_source, + (GSourceFunc) eject_unmount_cb); + g_source_unref (child_watch); + +handle_error: + if (error != NULL) + { + g_task_return_error (task, error); + g_object_unref (task); + } + + return G_SOURCE_REMOVE; +} + +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; + GTask *task; + GSource *timeout; + + data = g_new0 (UnmountEjectOp, 1); + data->argv = g_strdupv (argv); + + task = g_task_new (mount, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify)unmount_eject_op_free); + + 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); + + timeout = g_timeout_source_new (500); + g_task_attach_source (task, timeout, (GSourceFunc) eject_unmount_do_cb); + g_source_unref (timeout); +} + +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 g_task_propagate_boolean (G_TASK (result), error); +} + +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 g_task_propagate_boolean (G_TASK (result), error); +} + +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_symbolic_icon = g_unix_mount_get_symbolic_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..96ebaea --- /dev/null +++ b/gio/gunixmounts.c @@ -0,0 +1,2376 @@ +/* -*- 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + +#include "gunixmounts.h" +#include "gfile.h" +#include "gfilemonitor.h" +#include "glibintl.h" +#include "gthemedicon.h" + + +#ifdef HAVE_MNTENT_H +static const char *_resolve_dev_root (void); +#endif + +/** + * 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; + char *options; + 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; + + GSource *proc_mounts_watch_source; +}; + +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_GETVFSSTAT) || defined(HAVE_GETFSSTAT)) && 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", + "/live/cow", + "/live/image", + "/media", + "/mnt", + "/opt", + "/root", + "/sbin", + "/srv", + "/tmp", + "/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", + "/net", + "/sys", + 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 (g_str_has_suffix (mount_path, "/.gvfs")) + 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 +# ifdef __linux__ + return "/proc/mounts"; +# else + return _PATH_MOUNTED; +# endif +#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_GETVFSSTAT) || defined(HAVE_GETFSSTAT)) && 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) +{ +#if defined(HAVE_GETVFSSTAT) + struct statvfs *mntent = NULL; +#elif defined(HAVE_GETFSSTAT) + struct statfs *mntent = NULL; +#else + #error statfs juggling failed +#endif + size_t bufsize; + int num_mounts, i; + GUnixMountEntry *mount_entry; + GList *return_list; + + /* Pass NOWAIT to avoid blocking trying to update NFS mounts. */ +#if defined(HAVE_GETVFSSTAT) + num_mounts = getvfsstat (NULL, 0, ST_NOWAIT); +#elif defined(HAVE_GETFSSTAT) + num_mounts = getfsstat (NULL, 0, MNT_NOWAIT); +#endif + if (num_mounts == -1) + return NULL; + + bufsize = num_mounts * sizeof (*mntent); + mntent = g_malloc (bufsize); +#if defined(HAVE_GETVFSSTAT) + num_mounts = getvfsstat (mntent, bufsize, ST_NOWAIT); +#elif defined(HAVE_GETFSSTAT) + num_mounts = getfsstat (mntent, bufsize, MNT_NOWAIT); +#endif + if (num_mounts == -1) + 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 defined(HAVE_GETVFSSTAT) + if (mntent[i].f_flag & ST_RDONLY) +#elif defined(HAVE_GETFSSTAT) + if (mntent[i].f_flags & MNT_RDONLY) +#endif + 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); + } + + g_free (mntent); + + 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) || + (strcmp (mntent->mnt_dir, "none") == 0)) + continue; + + /* We ignore bind fstab entries, as we ignore bind mounts anyway */ + if (hasmntopt (mntent, "bind")) + 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); + mount_entry->options = g_strdup (mntent->mnt_opts); + +#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) || + (strcmp (mntent.mnt_mountp, "none") == 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); + mount_entry->options = g_strdup (mntent.mnt_mntopts); + +#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->options = g_strdup (mntent.mnt_options); + 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_GETVFSSTAT) || defined(HAVE_GETFSSTAT)) && 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); + mount_entry->options = g_strdup (fstab->fs_mntops); + + 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: (skip) + * @time_read: (out) (allow-none): guint64 to contain a timestamp, or %NULL + * + * Gets a #GList of #GUnixMountEntry 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: (element-type GUnixMountEntry) (transfer full): + * 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: (skip) + * @mount_path: path for a possible unix mount. + * @time_read: (out) (allow-none): 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: (transfer full): a #GUnixMountEntry. + **/ +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: (skip) + * @time_read: (out) (allow-none): guint64 to contain a timestamp. + * + * Gets a #GList of #GUnixMountPoint 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_mount_points_changed_since(). + * + * Returns: (element-type GUnixMountPoint) (transfer full): + * 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->proc_mounts_watch_source != NULL) + g_source_destroy (monitor->proc_mounts_watch_source); + + 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 gboolean +proc_mounts_changed (GIOChannel *channel, + GIOCondition cond, + gpointer user_data) +{ + GUnixMountMonitor *mount_monitor = G_UNIX_MOUNT_MONITOR (user_data); + if (cond & G_IO_ERR) + g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0); + return TRUE; +} + +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) + { + const gchar *mtab_path; + + mtab_path = get_mtab_monitor_file (); + /* /proc/mounts monitoring is special - can't just use GFileMonitor. + * See 'man proc' for more details. + */ + if (g_strcmp0 (mtab_path, "/proc/mounts") == 0) + { + GIOChannel *proc_mounts_channel; + GError *error = NULL; + proc_mounts_channel = g_io_channel_new_file ("/proc/mounts", "r", &error); + if (proc_mounts_channel == NULL) + { + g_warning ("Error creating IO channel for /proc/mounts: %s (%s, %d)", + error->message, g_quark_to_string (error->domain), error->code); + g_error_free (error); + } + else + { + monitor->proc_mounts_watch_source = g_io_create_watch (proc_mounts_channel, G_IO_ERR); + g_source_set_callback (monitor->proc_mounts_watch_source, + (GSourceFunc) proc_mounts_changed, + monitor, + NULL); + g_source_attach (monitor->proc_mounts_watch_source, + g_main_context_get_thread_default ()); + g_source_unref (monitor->proc_mounts_watch_source); + g_io_channel_unref (proc_mounts_channel); + } + } + else + { + file = g_file_new_for_path (mtab_path); + 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 #GUnixMountEntry. + * + * 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->options); + 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 = g_strcmp0 (mount1->options, mount2->options); + 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_get_options: + * @mount_point: a #GUnixMountPoint. + * + * Gets the options for the mount point. + * + * Returns: a string containing the options. + * + * Since: 2.32 + */ +const gchar * +g_unix_mount_point_get_options (GUnixMountPoint *mount_point) +{ + g_return_val_if_fail (mount_point != NULL, NULL); + + return mount_point->options; +} + +/** + * 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, gboolean use_symbolic) +{ + const char *icon_name; + + switch (type) + { + case G_UNIX_MOUNT_TYPE_HD: + if (is_mount_point) + icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "drive-harddisk-symbolic" : "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 = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "media-removable-symbolic" : "media-floppy"; + break; + case G_UNIX_MOUNT_TYPE_CDROM: + if (is_mount_point) + icon_name = use_symbolic ? "drive-optical-symbolic" : "drive-optical"; + else + icon_name = use_symbolic ? "media-optical-symbolic" : "media-optical"; + break; + case G_UNIX_MOUNT_TYPE_NFS: + icon_name = use_symbolic ? "folder-remote-symbolic" : "folder-remote"; + break; + case G_UNIX_MOUNT_TYPE_MEMSTICK: + if (is_mount_point) + icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "media-removable-symbolic" : "media-flash"; + break; + case G_UNIX_MOUNT_TYPE_CAMERA: + if (is_mount_point) + icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "camera-photo-symbolic" : "camera-photo"; + break; + case G_UNIX_MOUNT_TYPE_IPOD: + if (is_mount_point) + icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "multimedia-player-symbolic" : "multimedia-player"; + break; + case G_UNIX_MOUNT_TYPE_UNKNOWN: + default: + if (is_mount_point) + icon_name = use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + else + icon_name = use_symbolic ? "drive-harddisk-symbolic" : "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: (transfer full): 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, FALSE)); +} + +/** + * g_unix_mount_guess_symbolic_icon: + * @mount_entry: a #GUnixMountEntry + * + * Guesses the symbolic icon of a Unix mount. + * + * Returns: (transfer full): a #GIcon + * + * Since: 2.34 + */ +GIcon * +g_unix_mount_guess_symbolic_icon (GUnixMountEntry *mount_entry) +{ + return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_guess_type (mount_entry), FALSE, TRUE)); +} + +/** + * 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: (transfer full): 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, FALSE)); +} + +/** + * g_unix_mount_point_guess_symbolic_icon: + * @mount_point: a #GUnixMountPoint + * + * Guesses the symbolic icon of a Unix mount point. + * + * Returns: (transfer full): a #GIcon + * + * Since: 2.34 + */ +GIcon * +g_unix_mount_point_guess_symbolic_icon (GUnixMountPoint *mount_point) +{ + return g_themed_icon_new_with_default_fallbacks (type_to_icon (g_unix_mount_point_guess_type (mount_point), TRUE, 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; + const gchar *user_name; + gsize user_name_len; + + /* 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) and /run/media/$USER */ + mount_path = mount_entry->mount_path; + if (mount_path != NULL) + { + gboolean is_in_runtime_dir = FALSE; + /* Hide mounts within a dot path, suppose it was a purpose to hide this mount */ + if (g_strstr_len (mount_path, -1, "/.") != NULL) + return FALSE; + + /* Check /run/media/$USER/ */ + user_name = g_get_user_name (); + user_name_len = strlen (user_name); + if (strncmp (mount_path, "/run/media/", sizeof ("/run/media/") - 1) == 0 && + strncmp (mount_path + sizeof ("/run/media/") - 1, user_name, user_name_len) == 0 && + mount_path[sizeof ("/run/media/") - 1 + user_name_len] == '/') + is_in_runtime_dir = TRUE; + + if (is_in_runtime_dir || 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; +} + +#ifdef HAVE_MNTENT_H +/* 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; +} + +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 diff --git a/gio/gunixmounts.h b/gio/gunixmounts.h new file mode 100644 index 0000000..bd269a3 --- /dev/null +++ b/gio/gunixmounts.h @@ -0,0 +1,141 @@ +/* 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)) + +GLIB_AVAILABLE_IN_ALL +void g_unix_mount_free (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +void g_unix_mount_point_free (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +gint g_unix_mount_compare (GUnixMountEntry *mount1, + GUnixMountEntry *mount2); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_get_mount_path (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_get_device_path (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_get_fs_type (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_is_readonly (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_is_system_internal (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_guess_can_eject (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_guess_should_display (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +char * g_unix_mount_guess_name (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +GIcon * g_unix_mount_guess_icon (GUnixMountEntry *mount_entry); +GLIB_AVAILABLE_IN_ALL +GIcon * g_unix_mount_guess_symbolic_icon (GUnixMountEntry *mount_entry); + + +GLIB_AVAILABLE_IN_ALL +gint g_unix_mount_point_compare (GUnixMountPoint *mount1, + GUnixMountPoint *mount2); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_point_get_mount_path (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_point_get_device_path (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_mount_point_get_fs_type (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_2_32 +const char * g_unix_mount_point_get_options (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_point_is_readonly (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_point_is_user_mountable (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_point_is_loopback (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_point_guess_can_eject (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +char * g_unix_mount_point_guess_name (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +GIcon * g_unix_mount_point_guess_icon (GUnixMountPoint *mount_point); +GLIB_AVAILABLE_IN_ALL +GIcon * g_unix_mount_point_guess_symbolic_icon (GUnixMountPoint *mount_point); + + +GLIB_AVAILABLE_IN_ALL +GList * g_unix_mount_points_get (guint64 *time_read); +GLIB_AVAILABLE_IN_ALL +GList * g_unix_mounts_get (guint64 *time_read); +GLIB_AVAILABLE_IN_ALL +GUnixMountEntry *g_unix_mount_at (const char *mount_path, + guint64 *time_read); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mounts_changed_since (guint64 time); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_mount_points_changed_since (guint64 time); + +GLIB_AVAILABLE_IN_ALL +GType g_unix_mount_monitor_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GUnixMountMonitor *g_unix_mount_monitor_new (void); +GLIB_AVAILABLE_IN_ALL +void g_unix_mount_monitor_set_rate_limit (GUnixMountMonitor *mount_monitor, + int limit_msec); + +GLIB_AVAILABLE_IN_ALL +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..6baebe9 --- /dev/null +++ b/gio/gunixoutputstream.c @@ -0,0 +1,498 @@ +/* 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 "gfiledescriptorbased.h" +#include "glibintl.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. (If the file + * descriptor refers to a socket or pipe, this will use poll() to do + * asynchronous I/O. If it refers to a regular file, it will fall back + * to doing asynchronous I/O in another thread.) + * + * 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 +}; + +static void g_unix_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface); +static void g_unix_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GUnixOutputStream, g_unix_output_stream, G_TYPE_OUTPUT_STREAM, + G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, + g_unix_output_stream_pollable_iface_init) + G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, + g_unix_output_stream_file_descriptor_based_iface_init) + ) + +struct _GUnixOutputStreamPrivate { + int fd; + guint close_fd : 1; + guint is_pipe_or_socket : 1; +}; + +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_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 gboolean g_unix_output_stream_pollable_can_poll (GPollableOutputStream *stream); +static gboolean g_unix_output_stream_pollable_is_writable (GPollableOutputStream *stream); +static GSource *g_unix_output_stream_pollable_create_source (GPollableOutputStream *stream, + GCancellable *cancellable); + +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->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_pollable_iface_init (GPollableOutputStreamInterface *iface) +{ + iface->can_poll = g_unix_output_stream_pollable_can_poll; + iface->is_writable = g_unix_output_stream_pollable_is_writable; + iface->create_source = g_unix_output_stream_pollable_create_source; +} + +static void +g_unix_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) +{ + iface->get_fd = (int (*) (GFileDescriptorBased *))g_unix_output_stream_get_fd; +} + +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); + if (lseek (unix_stream->priv->fd, 0, SEEK_CUR) == -1 && errno == ESPIPE) + unix_stream->priv->is_pipe_or_socket = TRUE; + else + unix_stream->priv->is_pipe_or_socket = FALSE; + 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 = -1; + GPollFD poll_fds[2]; + int nfds; + int poll_ret; + + unix_stream = G_UNIX_OUTPUT_STREAM (stream); + + poll_fds[0].fd = unix_stream->priv->fd; + poll_fds[0].events = G_IO_OUT; + + if (unix_stream->priv->is_pipe_or_socket && + g_cancellable_make_pollfd (cancellable, &poll_fds[1])) + nfds = 2; + else + nfds = 1; + + while (1) + { + poll_fds[0].revents = poll_fds[1].revents = 0; + do + poll_ret = g_poll (poll_fds, nfds, -1); + while (poll_ret == -1 && errno == EINTR); + + if (poll_ret == -1) + { + int errsv = errno; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to file descriptor: %s"), + g_strerror (errsv)); + break; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + break; + + if (!poll_fds[0].revents) + continue; + + res = write (unix_stream->priv->fd, buffer, count); + if (res == -1) + { + int errsv = errno; + + if (errsv == EINTR || errsv == EAGAIN) + continue; + + g_set_error (error, G_IO_ERROR, + g_io_error_from_errno (errsv), + _("Error writing to file descriptor: %s"), + g_strerror (errsv)); + } + + break; + } + + if (nfds == 2) + g_cancellable_release_fd (cancellable); + 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; + + /* 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 file descriptor: %s"), + g_strerror (errsv)); + } + + return res != -1; +} + +static void +g_unix_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + GError *error = NULL; + + task = g_task_new (stream, cancellable, callback, user_data); + g_task_set_priority (task, io_priority); + + if (g_unix_output_stream_close (stream, cancellable, &error)) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +static gboolean +g_unix_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + g_return_val_if_fail (g_task_is_valid (result, stream), FALSE); + + return g_task_propagate_boolean (G_TASK (result), error); +} + +static gboolean +g_unix_output_stream_pollable_can_poll (GPollableOutputStream *stream) +{ + return G_UNIX_OUTPUT_STREAM (stream)->priv->is_pipe_or_socket; +} + +static gboolean +g_unix_output_stream_pollable_is_writable (GPollableOutputStream *stream) +{ + GUnixOutputStream *unix_stream = G_UNIX_OUTPUT_STREAM (stream); + GPollFD poll_fd; + gint result; + + poll_fd.fd = unix_stream->priv->fd; + poll_fd.events = G_IO_OUT; + poll_fd.revents = 0; + + do + result = g_poll (&poll_fd, 1, 0); + while (result == -1 && errno == EINTR); + + return poll_fd.revents != 0; +} + +static GSource * +g_unix_output_stream_pollable_create_source (GPollableOutputStream *stream, + GCancellable *cancellable) +{ + GUnixOutputStream *unix_stream = G_UNIX_OUTPUT_STREAM (stream); + GSource *inner_source, *pollable_source; + + pollable_source = g_pollable_source_new (G_OBJECT (stream)); + + inner_source = _g_fd_source_new (unix_stream->priv->fd, G_IO_OUT, cancellable); + g_source_set_dummy_callback (inner_source); + g_source_add_child_source (pollable_source, inner_source); + g_source_unref (inner_source); + + return pollable_source; +} diff --git a/gio/gunixoutputstream.h b/gio/gunixoutputstream.h new file mode 100644 index 0000000..9ef2e52 --- /dev/null +++ b/gio/gunixoutputstream.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: 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_output_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GOutputStream * g_unix_output_stream_new (gint fd, + gboolean close_fd); +GLIB_AVAILABLE_IN_ALL +void g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, + gboolean close_fd); +GLIB_AVAILABLE_IN_ALL +gboolean g_unix_output_stream_get_close_fd (GUnixOutputStream *stream); +GLIB_AVAILABLE_IN_ALL +gint g_unix_output_stream_get_fd (GUnixOutputStream *stream); +G_END_DECLS + +#endif /* __G_UNIX_OUTPUT_STREAM_H__ */ diff --git a/gio/gunixsocketaddress.c b/gio/gunixsocketaddress.c new file mode 100644 index 0000000..31615cf --- /dev/null +++ b/gio/gunixsocketaddress.c @@ -0,0 +1,527 @@ +/* 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 "gnetworking.h" + + +/** + * SECTION:gunixsocketaddress + * @short_description: UNIX GSocketAddress + * @include: gio/gunixsocketaddress.h + * + * Support for UNIX-domain (also known as local) sockets. + * + * UNIX domain sockets are generally visible in the filesystem. + * However, some systems support abstract socket names which are not + * visible in the filesystem and not affected by the filesystem + * permissions, visibility, etc. Currently this is only supported + * under Linux. If you attempt to use abstract sockets 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. + * + * Note that <gio/gunixsocketaddress.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. + */ + +/** + * 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, + PROP_ADDRESS_TYPE +}; + +#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 */ + GUnixSocketAddressType address_type; +}; + +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); + + memcpy (address->priv->path, array->data, len); + address->priv->path[len] = 0; /* Ensure null-terminated */ + address->priv->path_len = len; + } + break; + + case PROP_ABSTRACT: + /* If the caller already set PROP_ADDRESS_TYPE, don't let the + * default value of PROP_ABSTRACT overwrite it. + */ + if (address->priv->address_type != G_UNIX_SOCKET_ADDRESS_INVALID) + return; + + if (g_value_get_boolean (value)) + address->priv->address_type = G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED; + else + address->priv->address_type = G_UNIX_SOCKET_ADDRESS_PATH; + break; + + case PROP_ADDRESS_TYPE: + /* If the caller already set PROP_ABSTRACT, don't let the + * default value of PROP_ADDRESS_TYPE overwrite it. + */ + if (address->priv->address_type != G_UNIX_SOCKET_ADDRESS_INVALID) + return; + + address->priv->address_type = g_value_get_enum (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->address_type == G_UNIX_SOCKET_ADDRESS_ABSTRACT || + address->priv->address_type == G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED)); + + break; + + case PROP_ADDRESS_TYPE: + g_value_set_enum (value, address->priv->address_type); + 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) +{ + GUnixSocketAddress *addr = G_UNIX_SOCKET_ADDRESS (address); + + switch (addr->priv->address_type) + { + case G_UNIX_SOCKET_ADDRESS_ANONYMOUS: + return G_STRUCT_OFFSET(struct sockaddr_un, sun_path); + case G_UNIX_SOCKET_ADDRESS_ABSTRACT: + return G_STRUCT_OFFSET(struct sockaddr_un, sun_path) + addr->priv->path_len + 1; + default: + 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; + gssize socklen; + + socklen = g_unix_socket_address_get_native_size (address); + if (destlen < socklen) + { + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NO_SPACE, + _("Not enough space for socket address")); + return FALSE; + } + + sock = (struct sockaddr_un *) dest; + memset (sock, 0, socklen); + sock->sun_family = AF_UNIX; + + switch (addr->priv->address_type) + { + case G_UNIX_SOCKET_ADDRESS_INVALID: + case G_UNIX_SOCKET_ADDRESS_ANONYMOUS: + break; + + case G_UNIX_SOCKET_ADDRESS_PATH: + strcpy (sock->sun_path, addr->priv->path); + break; + + case G_UNIX_SOCKET_ADDRESS_ABSTRACT: + case G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED: + if (!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->sun_path[0] = 0; + memcpy (sock->sun_path+1, addr->priv->path, addr->priv->path_len); + break; + } + + 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)); + /** + * GUnixSocketAddress:abstract: + * + * Whether or not this is an abstract address + * + * Deprecated: Use #GUnixSocketAddress:address-type, which + * distinguishes between zero-padded and non-zero-padded + * abstract addresses. + */ + 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)); + g_object_class_install_property (gobject_class, PROP_ADDRESS_TYPE, + g_param_spec_enum ("address-type", + P_("Address type"), + P_("The type of UNIX socket address"), + G_TYPE_UNIX_SOCKET_ADDRESS_TYPE, + G_UNIX_SOCKET_ADDRESS_PATH, + 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; + address->priv->address_type = G_UNIX_SOCKET_ADDRESS_INVALID; +} + +/** + * 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: (array length=path_len) (element-type gchar): the abstract name + * @path_len: the length of @path, or -1 + * + * Creates a new %G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED + * #GUnixSocketAddress for @path. + * + * Returns: a new #GUnixSocketAddress + * + * Deprecated: Use g_unix_socket_address_new_with_type(). + */ +GSocketAddress * +g_unix_socket_address_new_abstract (const gchar *path, + gint path_len) +{ + return g_unix_socket_address_new_with_type (path, path_len, + G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED); +} + +/** + * g_unix_socket_address_new_with_type: + * @path: (array length=path_len) (element-type gchar): the name + * @path_len: the length of @path, or -1 + * @type: a #GUnixSocketAddressType + * + * Creates a new #GUnixSocketAddress of type @type with name @path. + * + * If @type is %G_UNIX_SOCKET_ADDRESS_PATH, this is equivalent to + * calling g_unix_socket_address_new(). + * + * If @path_type is %G_UNIX_SOCKET_ADDRESS_ABSTRACT, then @path_len + * bytes of @path will be copied to the socket's path, and only those + * bytes will be considered part of the name. (If @path_len is -1, + * then @path is assumed to be NUL-terminated.) For example, if @path + * was "test", then calling g_socket_address_get_native_size() on the + * returned socket would return 7 (2 bytes of overhead, 1 byte for the + * abstract-socket indicator byte, and 4 bytes for the name "test"). + * + * If @path_type is %G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED, then + * @path_len bytes of @path will be copied to the socket's path, the + * rest of the path will be padded with 0 bytes, and the entire + * zero-padded buffer will be considered the name. (As above, if + * @path_len is -1, then @path is assumed to be NUL-terminated.) In + * this case, g_socket_address_get_native_size() will always return + * the full size of a struct sockaddr_un, although + * g_unix_socket_address_get_path_len() will still return just the + * length of @path. + * + * %G_UNIX_SOCKET_ADDRESS_ABSTRACT is preferred over + * %G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED for new programs. Of course, + * when connecting to a server created by another process, you must + * use the appropriate type corresponding to how that process created + * its listening socket. + * + * Returns: a new #GUnixSocketAddress + * + * Since: 2.26 + */ +GSocketAddress * +g_unix_socket_address_new_with_type (const gchar *path, + gint path_len, + GUnixSocketAddressType type) +{ + GSocketAddress *address; + GByteArray *array; + + if (type == G_UNIX_SOCKET_ADDRESS_ANONYMOUS) + path_len = 0; + else 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, + "address-type", type, + 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_address_type: + * @address: a #GInetSocketAddress + * + * Gets @address's type. + * + * Returns: a #GUnixSocketAddressType + * + * Since: 2.26 + */ +GUnixSocketAddressType +g_unix_socket_address_get_address_type (GUnixSocketAddress *address) +{ + return address->priv->address_type; +} + +/** + * g_unix_socket_address_get_is_abstract: + * @address: a #GInetSocketAddress + * + * Tests if @address is abstract. + * + * Returns: %TRUE if the address is abstract, %FALSE otherwise + * + * Since: 2.22 + * + * Deprecated: Use g_unix_socket_address_get_address_type() + */ +gboolean +g_unix_socket_address_get_is_abstract (GUnixSocketAddress *address) +{ + return (address->priv->address_type == G_UNIX_SOCKET_ADDRESS_ABSTRACT || + address->priv->address_type == G_UNIX_SOCKET_ADDRESS_ABSTRACT_PADDED); +} + +/** + * 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 +} diff --git a/gio/gunixsocketaddress.h b/gio/gunixsocketaddress.h new file mode 100644 index 0000000..39d5821 --- /dev/null +++ b/gio/gunixsocketaddress.h @@ -0,0 +1,81 @@ +/* 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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_unix_socket_address_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_unix_socket_address_new (const gchar *path); +GLIB_DEPRECATED_FOR(g_unix_socket_address_new_with_type) +GSocketAddress *g_unix_socket_address_new_abstract (const gchar *path, + gint path_len); +GLIB_AVAILABLE_IN_ALL +GSocketAddress *g_unix_socket_address_new_with_type (const gchar *path, + gint path_len, + GUnixSocketAddressType type); +GLIB_AVAILABLE_IN_ALL +const char * g_unix_socket_address_get_path (GUnixSocketAddress *address); +GLIB_AVAILABLE_IN_ALL +gsize g_unix_socket_address_get_path_len (GUnixSocketAddress *address); +GLIB_AVAILABLE_IN_ALL +GUnixSocketAddressType g_unix_socket_address_get_address_type (GUnixSocketAddress *address); +GLIB_DEPRECATED +gboolean g_unix_socket_address_get_is_abstract (GUnixSocketAddress *address); + +GLIB_AVAILABLE_IN_ALL +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..24f14d5 --- /dev/null +++ b/gio/gunixvolume.c @@ -0,0 +1,526 @@ +/* -*- 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 "gtask.h" +#include "gioerror.h" +#include "glibintl.h" +/* for BUFSIZ */ +#include + + +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; + GIcon *symbolic_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_object_unref (volume->symbolic_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); + volume->symbolic_icon = g_unix_mount_point_guess_symbolic_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 GIcon * +g_unix_volume_get_symbolic_icon (GVolume *volume) +{ + GUnixVolume *unix_volume = G_UNIX_VOLUME (volume); + return g_object_ref (unix_volume->symbolic_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; + int error_fd; + GIOChannel *error_channel; + GSource *error_channel_source; + GString *error_string; +} EjectMountOp; + +static void +eject_mount_op_free (EjectMountOp *data) +{ + if (data->error_string != NULL) + g_string_free (data->error_string, TRUE); + + if (data->error_channel != NULL) + g_io_channel_unref (data->error_channel); + + if (data->error_channel_source) + { + g_source_destroy (data->error_channel_source); + g_source_unref (data->error_channel_source); + } + + if (data->error_fd != -1) + close (data->error_fd); + + g_free (data); +} + +static void +eject_mount_cb (GPid pid, + gint status, + gpointer user_data) +{ + GTask *task = user_data; + EjectMountOp *data = g_task_get_task_data (task); + + if (WEXITSTATUS (status) != 0) + { + g_task_return_new_error (task, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "%s", data->error_string->str); + } + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static gboolean +eject_mount_read_error (GIOChannel *channel, + GIOCondition condition, + gpointer user_data) +{ + GTask *task = user_data; + EjectMountOp *data = g_task_get_task_data (task); + 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); + GTask *task; + EjectMountOp *data; + GPid child_pid; + GSource *child_watch; + GError *error; + + data = g_new0 (EjectMountOp, 1); + data->unix_volume = unix_volume; + data->error_fd = -1; + + task = g_task_new (unix_volume, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify) eject_mount_op_free); + + 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_task_attach_source (task, data->error_channel_source, + (GSourceFunc) eject_mount_read_error); + + child_watch = g_child_watch_source_new (child_pid); + g_task_attach_source (task, child_watch, (GSourceFunc) eject_mount_cb); + g_source_unref (child_watch); + +handle_error: + if (error != NULL) + { + g_task_return_error (task, error); + g_object_unref (task); + } +} + + +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_symbolic_icon = g_unix_volume_get_symbolic_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..0a48486 --- /dev/null +++ b/gio/gunixvolumemonitor.c @@ -0,0 +1,418 @@ +/* -*- 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" + + +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_free_full (monitor->last_mountpoints, (GDestroyNotify) g_unix_mount_point_free); + g_list_free_full (monitor->last_mounts, (GDestroyNotify) g_unix_mount_free); + + g_list_free_full (monitor->volumes, g_object_unref); + g_list_free_full (monitor->mounts, g_object_unref); + + 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_free_full (monitor->volumes, g_object_unref); + monitor->volumes = NULL; + + g_list_free_full (monitor->mounts, g_object_unref); + monitor->mounts = NULL; + + G_OBJECT_CLASS (g_unix_volume_monitor_parent_class)->dispose (object); +} + +static GList * +get_mounts (GVolumeMonitor *volume_monitor) +{ + GUnixVolumeMonitor *monitor; + + monitor = G_UNIX_VOLUME_MONITOR (volume_monitor); + + return g_list_copy_deep (monitor->mounts, (GCopyFunc) g_object_ref, NULL); +} + +static GList * +get_volumes (GVolumeMonitor *volume_monitor) +{ + GUnixVolumeMonitor *monitor; + + monitor = G_UNIX_VOLUME_MONITOR (volume_monitor); + + return g_list_copy_deep (monitor->volumes, (GCopyFunc) g_object_ref, NULL); +} + +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_free_full (monitor->last_mountpoints, (GDestroyNotify) g_unix_mount_point_free); + 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_free_full (monitor->last_mounts, (GDestroyNotify) g_unix_mount_free); + 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/gvdb/gvdb-builder.c b/gio/gvdb/gvdb-builder.c new file mode 100644 index 0000000..91adec6 --- /dev/null +++ b/gio/gvdb/gvdb-builder.c @@ -0,0 +1,516 @@ +/* + * 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 "gvdb-builder.h" +#include "gvdb-format.h" + +#include +#include +#if !defined(G_OS_WIN32) || !defined(_MSC_VER) +#include +#endif +#include + + +struct _GvdbItem +{ + gchar *key; + guint32 hash_value; + guint32_le assigned_index; + GvdbItem *parent; + GvdbItem *sibling; + GvdbItem *next; + + /* one of: + * this: + */ + GVariant *value; + + /* this: */ + GHashTable *table; + + /* or this: */ + GvdbItem *child; +}; + +static void +gvdb_item_free (gpointer data) +{ + GvdbItem *item = data; + + g_free (item->key); + + if (item->value) + g_variant_unref (item->value); + + if (item->table) + g_hash_table_unref (item->table); + + g_slice_free (GvdbItem, item); +} + +GHashTable * +gvdb_hash_table_new (GHashTable *parent, + const gchar *name_in_parent) +{ + GHashTable *table; + + table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, gvdb_item_free); + + if (parent) + { + GvdbItem *item; + + item = gvdb_hash_table_insert (parent, name_in_parent); + gvdb_item_set_hash_table (item, table); + } + + return table; +} + +static guint32 +djb_hash (const gchar *key) +{ + guint32 hash_value = 5381; + + while (*key) + hash_value = hash_value * 33 + *(signed char *)key++; + + return hash_value; +} + +GvdbItem * +gvdb_hash_table_insert (GHashTable *table, + const gchar *key) +{ + GvdbItem *item; + + item = g_slice_new0 (GvdbItem); + item->key = g_strdup (key); + item->hash_value = djb_hash (key); + + g_hash_table_insert (table, g_strdup (key), item); + + return item; +} + +void +gvdb_hash_table_insert_string (GHashTable *table, + const gchar *key, + const gchar *value) +{ + GvdbItem *item; + + item = gvdb_hash_table_insert (table, key); + gvdb_item_set_value (item, g_variant_new_string (value)); +} + +void +gvdb_item_set_value (GvdbItem *item, + GVariant *value) +{ + g_return_if_fail (!item->value && !item->table && !item->child); + + item->value = g_variant_ref_sink (value); +} + +void +gvdb_item_set_hash_table (GvdbItem *item, + GHashTable *table) +{ + g_return_if_fail (!item->value && !item->table && !item->child); + + item->table = g_hash_table_ref (table); +} + +void +gvdb_item_set_parent (GvdbItem *item, + GvdbItem *parent) +{ + GvdbItem **node; + + g_return_if_fail (g_str_has_prefix (item->key, parent->key)); + g_return_if_fail (!parent->value && !parent->table); + g_return_if_fail (!item->parent && !item->sibling); + + for (node = &parent->child; *node; node = &(*node)->sibling) + if (strcmp ((*node)->key, item->key) > 0) + break; + + item->parent = parent; + item->sibling = *node; + *node = item; +} + +typedef struct +{ + GvdbItem **buckets; + gint n_buckets; +} HashTable; + +static HashTable * +hash_table_new (gint n_buckets) +{ + HashTable *table; + + table = g_slice_new (HashTable); + table->buckets = g_new0 (GvdbItem *, n_buckets); + table->n_buckets = n_buckets; + + return table; +} + +static void +hash_table_free (HashTable *table) +{ + g_free (table->buckets); + + g_slice_free (HashTable, table); +} + +static void +hash_table_insert (gpointer key, + gpointer value, + gpointer data) +{ + guint32 hash_value, bucket; + HashTable *table = data; + GvdbItem *item = value; + + hash_value = djb_hash (key); + bucket = hash_value % table->n_buckets; + item->next = table->buckets[bucket]; + table->buckets[bucket] = item; +} + +static guint32_le +item_to_index (GvdbItem *item) +{ + if (item != NULL) + return item->assigned_index; + + return guint32_to_le (-1u); +} + +typedef struct +{ + GQueue *chunks; + guint64 offset; + gboolean byteswap; +} FileBuilder; + +typedef struct +{ + gsize offset; + gsize size; + gpointer data; +} FileChunk; + +static gpointer +file_builder_allocate (FileBuilder *fb, + guint alignment, + gsize size, + struct gvdb_pointer *pointer) +{ + FileChunk *chunk; + + if (size == 0) + return NULL; + + fb->offset += (-fb->offset) & (alignment - 1); + chunk = g_slice_new (FileChunk); + chunk->offset = fb->offset; + chunk->size = size; + chunk->data = g_malloc (size); + + pointer->start = guint32_to_le (fb->offset); + fb->offset += size; + pointer->end = guint32_to_le (fb->offset); + + g_queue_push_tail (fb->chunks, chunk); + + return chunk->data; +} + +static void +file_builder_add_value (FileBuilder *fb, + GVariant *value, + struct gvdb_pointer *pointer) +{ + GVariant *variant, *normal; + gpointer data; + gsize size; + + if (fb->byteswap) + { + value = g_variant_byteswap (value); + variant = g_variant_new_variant (value); + g_variant_unref (value); + } + else + variant = g_variant_new_variant (value); + + normal = g_variant_get_normal_form (variant); + g_variant_unref (variant); + + size = g_variant_get_size (normal); + data = file_builder_allocate (fb, 8, size, pointer); + g_variant_store (normal, data); + g_variant_unref (normal); +} + +static void +file_builder_add_string (FileBuilder *fb, + const gchar *string, + guint32_le *start, + guint16_le *size) +{ + FileChunk *chunk; + gsize length; + + length = strlen (string); + + chunk = g_slice_new (FileChunk); + chunk->offset = fb->offset; + chunk->size = length; + chunk->data = g_malloc (length); + memcpy (chunk->data, string, length); + + *start = guint32_to_le (fb->offset); + *size = guint16_to_le (length); + fb->offset += length; + + g_queue_push_tail (fb->chunks, chunk); +} + +static void +file_builder_allocate_for_hash (FileBuilder *fb, + gsize n_buckets, + gsize n_items, + guint bloom_shift, + gsize n_bloom_words, + guint32_le **bloom_filter, + guint32_le **hash_buckets, + struct gvdb_hash_item **hash_items, + struct gvdb_pointer *pointer) +{ + guint32_le bloom_hdr, table_hdr; + guchar *data; + gsize size; + + g_assert (n_bloom_words < (1u << 27)); + + bloom_hdr = guint32_to_le (bloom_shift << 27 | n_bloom_words); + table_hdr = guint32_to_le (n_buckets); + + size = sizeof bloom_hdr + sizeof table_hdr + + n_bloom_words * sizeof (guint32_le) + + n_buckets * sizeof (guint32_le) + + n_items * sizeof (struct gvdb_hash_item); + + data = file_builder_allocate (fb, 4, size, pointer); + +#define chunk(s) (size -= (s), data += (s), data - (s)) + memcpy (chunk (sizeof bloom_hdr), &bloom_hdr, sizeof bloom_hdr); + memcpy (chunk (sizeof table_hdr), &table_hdr, sizeof table_hdr); + *bloom_filter = (guint32_le *) chunk (n_bloom_words * sizeof (guint32_le)); + *hash_buckets = (guint32_le *) chunk (n_buckets * sizeof (guint32_le)); + *hash_items = (struct gvdb_hash_item *) chunk (n_items * + sizeof (struct gvdb_hash_item)); + g_assert (size == 0); +#undef chunk + + memset (*bloom_filter, 0, n_bloom_words * sizeof (guint32_le)); +} + +static void +file_builder_add_hash (FileBuilder *fb, + GHashTable *table, + struct gvdb_pointer *pointer) +{ + guint32_le *buckets, *bloom_filter; + struct gvdb_hash_item *items; + HashTable *mytable; + GvdbItem *item; + guint32 index; + gint bucket; + + mytable = hash_table_new (g_hash_table_size (table)); + g_hash_table_foreach (table, hash_table_insert, mytable); + index = 0; + + for (bucket = 0; bucket < mytable->n_buckets; bucket++) + for (item = mytable->buckets[bucket]; item; item = item->next) + item->assigned_index = guint32_to_le (index++); + + file_builder_allocate_for_hash (fb, mytable->n_buckets, index, 5, 0, + &bloom_filter, &buckets, &items, pointer); + + index = 0; + for (bucket = 0; bucket < mytable->n_buckets; bucket++) + { + buckets[bucket] = guint32_to_le (index); + + for (item = mytable->buckets[bucket]; item; item = item->next) + { + struct gvdb_hash_item *entry = items++; + const gchar *basename; + + g_assert (index == guint32_from_le (item->assigned_index)); + entry->hash_value = guint32_to_le (item->hash_value); + entry->parent = item_to_index (item->parent); + entry->unused = 0; + + if (item->parent != NULL) + basename = item->key + strlen (item->parent->key); + else + basename = item->key; + + file_builder_add_string (fb, basename, + &entry->key_start, + &entry->key_size); + + if (item->value != NULL) + { + g_assert (item->child == NULL && item->table == NULL); + + file_builder_add_value (fb, item->value, &entry->value.pointer); + entry->type = 'v'; + } + + if (item->child != NULL) + { + guint32 children = 0, i = 0; + guint32_le *offsets; + GvdbItem *child; + + g_assert (item->table == NULL); + + for (child = item->child; child; child = child->sibling) + children++; + + offsets = file_builder_allocate (fb, 4, 4 * children, + &entry->value.pointer); + entry->type = 'L'; + + for (child = item->child; child; child = child->sibling) + offsets[i++] = child->assigned_index; + + g_assert (children == i); + } + + if (item->table != NULL) + { + entry->type = 'H'; + file_builder_add_hash (fb, item->table, &entry->value.pointer); + } + + index++; + } + } + + hash_table_free (mytable); +} + +static FileBuilder * +file_builder_new (gboolean byteswap) +{ + FileBuilder *builder; + + builder = g_slice_new (FileBuilder); + builder->chunks = g_queue_new (); + builder->offset = sizeof (struct gvdb_header); + builder->byteswap = byteswap; + + return builder; +} + +static GString * +file_builder_serialise (FileBuilder *fb, + struct gvdb_pointer root) +{ + struct gvdb_header header = { { 0, }, }; + GString *result; + + if (fb->byteswap) + { + header.signature[0] = GVDB_SWAPPED_SIGNATURE0; + header.signature[1] = GVDB_SWAPPED_SIGNATURE1; + } + else + { + header.signature[0] = GVDB_SIGNATURE0; + header.signature[1] = GVDB_SIGNATURE1; + } + + result = g_string_new (NULL); + + header.root = root; + g_string_append_len (result, (gpointer) &header, sizeof header); + + while (!g_queue_is_empty (fb->chunks)) + { + FileChunk *chunk = g_queue_pop_head (fb->chunks); + + if (result->len != chunk->offset) + { + gchar zero[8] = { 0, }; + + g_assert (chunk->offset > result->len); + g_assert (chunk->offset - result->len < 8); + + g_string_append_len (result, zero, chunk->offset - result->len); + g_assert (result->len == chunk->offset); + } + + g_string_append_len (result, chunk->data, chunk->size); + g_free (chunk->data); + + g_slice_free (FileChunk, chunk); + } + + g_queue_free (fb->chunks); + g_slice_free (FileBuilder, fb); + + return result; +} + +gboolean +gvdb_table_write_contents (GHashTable *table, + const gchar *filename, + gboolean byteswap, + GError **error) +{ + struct gvdb_pointer root; + gboolean status; + FileBuilder *fb; + GString *str; + + fb = file_builder_new (byteswap); + file_builder_add_hash (fb, table, &root); + str = file_builder_serialise (fb, root); + + status = g_file_set_contents (filename, str->str, str->len, error); + g_string_free (str, TRUE); + + return status; +} diff --git a/gio/gvdb/gvdb-builder.h b/gio/gvdb/gvdb-builder.h new file mode 100644 index 0000000..797626e --- /dev/null +++ b/gio/gvdb/gvdb-builder.h @@ -0,0 +1,57 @@ +/* + * 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 __gvdb_builder_h__ +#define __gvdb_builder_h__ + +#include + +typedef struct _GvdbItem GvdbItem; + +G_GNUC_INTERNAL +GHashTable * gvdb_hash_table_new (GHashTable *parent, + const gchar *key); + +G_GNUC_INTERNAL +GvdbItem * gvdb_hash_table_insert (GHashTable *table, + const gchar *key); +G_GNUC_INTERNAL +void gvdb_hash_table_insert_string (GHashTable *table, + const gchar *key, + const gchar *value); + +G_GNUC_INTERNAL +void gvdb_item_set_value (GvdbItem *item, + GVariant *value); +G_GNUC_INTERNAL +void gvdb_item_set_hash_table (GvdbItem *item, + GHashTable *table); +G_GNUC_INTERNAL +void gvdb_item_set_parent (GvdbItem *item, + GvdbItem *parent); + +G_GNUC_INTERNAL +gboolean gvdb_table_write_contents (GHashTable *table, + const gchar *filename, + gboolean byteswap, + GError **error); + +#endif /* __gvdb_builder_h__ */ diff --git a/gio/gvdb/gvdb-format.h b/gio/gvdb/gvdb-format.h new file mode 100644 index 0000000..886aa56 --- /dev/null +++ b/gio/gvdb/gvdb-format.h @@ -0,0 +1,87 @@ +/* + * 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 __gvdb_format_h__ +#define __gvdb_format_h__ + +#include + +typedef struct { guint16 value; } guint16_le; +typedef struct { guint32 value; } guint32_le; + +struct gvdb_pointer { + guint32_le start; + guint32_le end; +}; + +struct gvdb_hash_header { + guint32_le n_bloom_words; + guint32_le n_buckets; +}; + +struct gvdb_hash_item { + guint32_le hash_value; + guint32_le parent; + + guint32_le key_start; + guint16_le key_size; + gchar type; + gchar unused; + + union + { + struct gvdb_pointer pointer; + gchar direct[8]; + } value; +}; + +struct gvdb_header { + guint32 signature[2]; + guint32_le version; + guint32_le options; + + struct gvdb_pointer root; +}; + +static inline guint32_le guint32_to_le (guint32 value) { + guint32_le result = { GUINT32_TO_LE (value) }; + return result; +} + +static inline guint32 guint32_from_le (guint32_le value) { + return GUINT32_FROM_LE (value.value); +} + +static inline guint16_le guint16_to_le (guint16 value) { + guint16_le result = { GUINT16_TO_LE (value) }; + return result; +} + +static inline guint16 guint16_from_le (guint16_le value) { + return GUINT16_FROM_LE (value.value); +} + +#define GVDB_SIGNATURE0 1918981703 +#define GVDB_SIGNATURE1 1953390953 +#define GVDB_SWAPPED_SIGNATURE0 GUINT32_SWAP_LE_BE (GVDB_SIGNATURE0) +#define GVDB_SWAPPED_SIGNATURE1 GUINT32_SWAP_LE_BE (GVDB_SIGNATURE1) + +#endif /* __gvdb_format_h__ */ diff --git a/gio/gvdb/gvdb-reader.c b/gio/gvdb/gvdb-reader.c new file mode 100644 index 0000000..44594bf --- /dev/null +++ b/gio/gvdb/gvdb-reader.c @@ -0,0 +1,752 @@ +/* + * 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 "gvdb-reader.h" +#include "gvdb-format.h" + +#include + +struct _GvdbTable { + gint ref_count; + + const gchar *data; + gsize size; + + gpointer user_data; + GvdbRefFunc ref_user_data; + GDestroyNotify unref_user_data; + + gboolean byteswapped; + gboolean trusted; + + const guint32_le *bloom_words; + guint32 n_bloom_words; + guint bloom_shift; + + const guint32_le *hash_buckets; + guint32 n_buckets; + + struct gvdb_hash_item *hash_items; + guint32 n_hash_items; +}; + +static const gchar * +gvdb_table_item_get_key (GvdbTable *file, + const struct gvdb_hash_item *item, + gsize *size) +{ + guint32 start, end; + + start = guint32_from_le (item->key_start); + *size = guint16_from_le (item->key_size); + end = start + *size; + + if G_UNLIKELY (start > end || end > file->size) + return NULL; + + return file->data + start; +} + +static gconstpointer +gvdb_table_dereference (GvdbTable *file, + const struct gvdb_pointer *pointer, + gint alignment, + gsize *size) +{ + guint32 start, end; + + start = guint32_from_le (pointer->start); + end = guint32_from_le (pointer->end); + + if G_UNLIKELY (start > end || end > file->size || start & (alignment - 1)) + return NULL; + + *size = end - start; + + return file->data + start; +} + +static void +gvdb_table_setup_root (GvdbTable *file, + const struct gvdb_pointer *pointer) +{ + const struct gvdb_hash_header *header; + guint32 n_bloom_words; + guint32 n_buckets; + gsize size; + + header = gvdb_table_dereference (file, pointer, 4, &size); + + if G_UNLIKELY (header == NULL || size < sizeof *header) + return; + + size -= sizeof *header; + + n_bloom_words = guint32_from_le (header->n_bloom_words); + n_buckets = guint32_from_le (header->n_buckets); + n_bloom_words &= (1u << 27) - 1; + + if G_UNLIKELY (n_bloom_words * sizeof (guint32_le) > size) + return; + + file->bloom_words = (gpointer) (header + 1); + size -= n_bloom_words * sizeof (guint32_le); + file->n_bloom_words = n_bloom_words; + + if G_UNLIKELY (n_buckets > G_MAXUINT / sizeof (guint32_le) || + n_buckets * sizeof (guint32_le) > size) + return; + + file->hash_buckets = file->bloom_words + file->n_bloom_words; + size -= n_buckets * sizeof (guint32_le); + file->n_buckets = n_buckets; + + if G_UNLIKELY (size % sizeof (struct gvdb_hash_item)) + return; + + file->hash_items = (gpointer) (file->hash_buckets + n_buckets); + file->n_hash_items = size / sizeof (struct gvdb_hash_item); +} + +static GvdbTable * +new_from_data (const void *data, + gsize data_len, + gboolean trusted, + gpointer user_data, + GvdbRefFunc ref, + GDestroyNotify unref, + const char *filename, + GError **error) +{ + GvdbTable *file; + + file = g_slice_new0 (GvdbTable); + file->data = data; + file->size = data_len; + file->trusted = trusted; + file->ref_count = 1; + file->ref_user_data = ref; + file->unref_user_data = unref; + file->user_data = user_data; + + if (sizeof (struct gvdb_header) <= file->size) + { + const struct gvdb_header *header = (gpointer) file->data; + + if (header->signature[0] == GVDB_SIGNATURE0 && + header->signature[1] == GVDB_SIGNATURE1 && + guint32_from_le (header->version) == 0) + file->byteswapped = FALSE; + + else if (header->signature[0] == GVDB_SWAPPED_SIGNATURE0 && + header->signature[1] == GVDB_SWAPPED_SIGNATURE1 && + guint32_from_le (header->version) == 0) + file->byteswapped = TRUE; + + else + { + if (filename) + g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, + "%s: invalid header", filename); + else + g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL, + "invalid gvdb header"); + g_slice_free (GvdbTable, file); + if (unref) + unref (user_data); + + return NULL; + } + + gvdb_table_setup_root (file, &header->root); + } + + return file; +} + +/** + * gvdb_table_new: + * @filename: the path to the hash file + * @trusted: if the contents of @filename are trusted + * @error: %NULL, or a pointer to a %NULL #GError + * + * Creates a new #GvdbTable from the contents of the file found at + * @filename. + * + * The only time this function fails is if the file cannot be opened. + * In that case, the #GError that is returned will be an error from + * g_mapped_file_new(). + * + * An empty or otherwise corrupted file is considered to be a valid + * #GvdbTable with no entries. + * + * You should call gvdb_table_unref() on the return result when you no + * longer require it. + * + * Returns: a new #GvdbTable + **/ +GvdbTable * +gvdb_table_new (const gchar *filename, + gboolean trusted, + GError **error) +{ + GMappedFile *mapped; + + if ((mapped = g_mapped_file_new (filename, FALSE, error)) == NULL) + return NULL; + + return new_from_data (g_mapped_file_get_contents (mapped), + g_mapped_file_get_length (mapped), + trusted, + mapped, + (GvdbRefFunc)g_mapped_file_ref, + (GDestroyNotify)g_mapped_file_unref, + filename, + error); +} + +/** + * gvdb_table_new_from_data: + * @data: the data + * @data_len: the length of @data in bytes + * @trusted: if the contents of @data are trusted + * @user_data: User supplied data that owns @data + * @ref: Ref function for @user_data + * @unref: Unref function for @user_data + * + * Creates a new #GvdbTable from the data in @data. + * + * An empty or otherwise corrupted data is considered to be a valid + * #GvdbTable with no entries. + * + * You should call gvdb_table_unref() on the return result when you no + * longer require it. + * + * Returns: a new #GvdbTable + **/ +GvdbTable * +gvdb_table_new_from_data (const void *data, + gsize data_len, + gboolean trusted, + gpointer user_data, + GvdbRefFunc ref, + GDestroyNotify unref, + GError **error) +{ + return new_from_data (data, data_len, + trusted, + user_data, ref, unref, + NULL, + error); +} + +static gboolean +gvdb_table_bloom_filter (GvdbTable *file, + guint32 hash_value) +{ + guint32 word, mask; + + if (file->n_bloom_words == 0) + return TRUE; + + word = (hash_value / 32) % file->n_bloom_words; + mask = 1 << (hash_value & 31); + mask |= 1 << ((hash_value >> file->bloom_shift) & 31); + + return (guint32_from_le (file->bloom_words[word]) & mask) == mask; +} + +static gboolean +gvdb_table_check_name (GvdbTable *file, + struct gvdb_hash_item *item, + const gchar *key, + guint key_length) +{ + const gchar *this_key; + gsize this_size; + guint32 parent; + + this_key = gvdb_table_item_get_key (file, item, &this_size); + + if G_UNLIKELY (this_key == NULL || this_size > key_length) + return FALSE; + + key_length -= this_size; + + if G_UNLIKELY (memcmp (this_key, key + key_length, this_size) != 0) + return FALSE; + + parent = guint32_from_le (item->parent); + if (key_length == 0 && parent == 0xffffffffu) + return TRUE; + + if G_LIKELY (parent < file->n_hash_items && this_size > 0) + return gvdb_table_check_name (file, + &file->hash_items[parent], + key, key_length); + + return FALSE; +} + +static const struct gvdb_hash_item * +gvdb_table_lookup (GvdbTable *file, + const gchar *key, + gchar type) +{ + guint32 hash_value = 5381; + guint key_length; + guint32 bucket; + guint32 lastno; + guint32 itemno; + + if G_UNLIKELY (file->n_buckets == 0 || file->n_hash_items == 0) + return NULL; + + for (key_length = 0; key[key_length]; key_length++) + hash_value = (hash_value * 33) + ((signed char *) key)[key_length]; + + if (!gvdb_table_bloom_filter (file, hash_value)) + return NULL; + + bucket = hash_value % file->n_buckets; + itemno = guint32_from_le (file->hash_buckets[bucket]); + + if (bucket == file->n_buckets - 1 || + (lastno = guint32_from_le(file->hash_buckets[bucket + 1])) > file->n_hash_items) + lastno = file->n_hash_items; + + while G_LIKELY (itemno < lastno) + { + struct gvdb_hash_item *item = &file->hash_items[itemno]; + + if (hash_value == guint32_from_le (item->hash_value)) + if G_LIKELY (gvdb_table_check_name (file, item, key, key_length)) + if G_LIKELY (item->type == type) + return item; + + itemno++; + } + + return NULL; +} + +static const struct gvdb_hash_item * +gvdb_table_get_item (GvdbTable *table, + guint32_le item_no) +{ + guint32 item_no_native = guint32_from_le (item_no); + + if G_LIKELY (item_no_native < table->n_hash_items) + return table->hash_items + item_no_native; + + return NULL; +} + +static gboolean +gvdb_table_list_from_item (GvdbTable *table, + const struct gvdb_hash_item *item, + const guint32_le **list, + guint *length) +{ + gsize size; + + *list = gvdb_table_dereference (table, &item->value.pointer, 4, &size); + + if G_LIKELY (*list == NULL || size % 4) + return FALSE; + + *length = size / 4; + + return TRUE; +} + + +/** + * gvdb_table_list: + * @file: a #GvdbTable + * @key: a string + * + * List all of the keys that appear below @key. The nesting of keys + * within the hash file is defined by the program that created the hash + * file. One thing is constant: each item in the returned array can be + * concatenated to @key to obtain the full name of that key. + * + * It is not possible to tell from this function if a given key is + * itself a path, a value, or another hash table; you are expected to + * know this for yourself. + * + * You should call g_strfreev() on the return result when you no longer + * require it. + * + * Returns: a %NULL-terminated string array + **/ +gchar ** +gvdb_table_list (GvdbTable *file, + const gchar *key) +{ + const struct gvdb_hash_item *item; + const guint32_le *list; + gchar **strv; + guint length; + guint i; + + if ((item = gvdb_table_lookup (file, key, 'L')) == NULL) + return NULL; + + if (!gvdb_table_list_from_item (file, item, &list, &length)) + return NULL; + + strv = g_new (gchar *, length + 1); + for (i = 0; i < length; i++) + { + guint32 itemno = guint32_from_le (list[i]); + + if (itemno < file->n_hash_items) + { + const struct gvdb_hash_item *item; + const gchar *string; + gsize strsize; + + item = file->hash_items + itemno; + + string = gvdb_table_item_get_key (file, item, &strsize); + + if (string != NULL) + strv[i] = g_strndup (string, strsize); + else + strv[i] = g_malloc0 (1); + } + else + strv[i] = g_malloc0 (1); + } + + strv[i] = NULL; + + return strv; +} + +/** + * gvdb_table_has_value: + * @file: a #GvdbTable + * @key: a string + * + * Checks for a value named @key in @file. + * + * Note: this function does not consider non-value nodes (other hash + * tables, for example). + * + * Returns: %TRUE if @key is in the table + **/ +gboolean +gvdb_table_has_value (GvdbTable *file, + const gchar *key) +{ + return gvdb_table_lookup (file, key, 'v') != NULL; +} + +static GVariant * +gvdb_table_value_from_item (GvdbTable *table, + const struct gvdb_hash_item *item) +{ + GVariant *variant, *value; + gconstpointer data; + gsize size; + + data = gvdb_table_dereference (table, &item->value.pointer, 8, &size); + + if G_UNLIKELY (data == NULL) + return NULL; + + variant = g_variant_new_from_data (G_VARIANT_TYPE_VARIANT, + data, size, table->trusted, + table->unref_user_data, + table->ref_user_data ? table->ref_user_data (table->user_data) : table->user_data); + value = g_variant_get_variant (variant); + g_variant_unref (variant); + + return value; +} + +/** + * gvdb_table_get_value: + * @file: a #GvdbTable + * @key: a string + * + * Looks up a value named @key in @file. + * + * If the value is not found then %NULL is returned. Otherwise, a new + * #GVariant instance is returned. The #GVariant does not depend on the + * continued existence of @file. + * + * You should call g_variant_unref() on the return result when you no + * longer require it. + * + * Returns: a #GVariant, or %NULL + **/ +GVariant * +gvdb_table_get_value (GvdbTable *file, + const gchar *key) +{ + const struct gvdb_hash_item *item; + GVariant *value; + + if ((item = gvdb_table_lookup (file, key, 'v')) == NULL) + return NULL; + + value = gvdb_table_value_from_item (file, item); + + if (value && file->byteswapped) + { + GVariant *tmp; + + tmp = g_variant_byteswap (value); + g_variant_unref (value); + value = tmp; + } + + return value; +} + +/** + * gvdb_table_get_raw_value: + * @table: a #GvdbTable + * @key: a string + * + * Looks up a value named @key in @file. + * + * This call is equivalent to gvdb_table_get_value() except that it + * never byteswaps the value. + * + * Returns: a #GVariant, or %NULL + **/ +GVariant * +gvdb_table_get_raw_value (GvdbTable *table, + const gchar *key) +{ + const struct gvdb_hash_item *item; + + if ((item = gvdb_table_lookup (table, key, 'v')) == NULL) + return NULL; + + return gvdb_table_value_from_item (table, item); +} + +/** + * gvdb_table_get_table: + * @file: a #GvdbTable + * @key: a string + * + * Looks up the hash table named @key in @file. + * + * The toplevel hash table in a #GvdbTable can contain reference to + * child hash tables (and those can contain further references...). + * + * If @key is not found in @file then %NULL is returned. Otherwise, a + * new #GvdbTable is returned, referring to the child hashtable as + * contained in the file. This newly-created #GvdbTable does not depend + * on the continued existence of @file. + * + * You should call gvdb_table_unref() on the return result when you no + * longer require it. + * + * Returns: a new #GvdbTable, or %NULL + **/ +GvdbTable * +gvdb_table_get_table (GvdbTable *file, + const gchar *key) +{ + const struct gvdb_hash_item *item; + GvdbTable *new; + + item = gvdb_table_lookup (file, key, 'H'); + + if (item == NULL) + return NULL; + + new = g_slice_new0 (GvdbTable); + new->user_data = file->ref_user_data ? file->ref_user_data (file->user_data) : file->user_data; + new->ref_user_data = file->ref_user_data; + new->unref_user_data = file->unref_user_data; + new->byteswapped = file->byteswapped; + new->trusted = file->trusted; + new->data = file->data; + new->size = file->size; + new->ref_count = 1; + + gvdb_table_setup_root (new, &item->value.pointer); + + return new; +} + +/** + * gvdb_table_ref: + * @file: a #GvdbTable + * + * Increases the reference count on @file. + * + * Returns: a new reference on @file + **/ +GvdbTable * +gvdb_table_ref (GvdbTable *file) +{ + g_atomic_int_inc (&file->ref_count); + + return file; +} + +/** + * gvdb_table_unref: + * @file: a #GvdbTable + * + * Decreases the reference count on @file, possibly freeing it. + * + * Since: 2.26 + **/ +void +gvdb_table_unref (GvdbTable *file) +{ + if (g_atomic_int_dec_and_test (&file->ref_count)) + { + if (file->unref_user_data) + file->unref_user_data (file->user_data); + g_slice_free (GvdbTable, file); + } +} + +/** + * gvdb_table_is_valid: + * @table: a #GvdbTable + * + * Checks if the table is still valid. + * + * An on-disk GVDB can be marked as invalid. This happens when the file + * has been replaced. The appropriate action is typically to reopen the + * file. + * + * Returns: %TRUE if @table is still valid + **/ +gboolean +gvdb_table_is_valid (GvdbTable *table) +{ + return !!*table->data; +} + +/** + * gvdb_table_walk: + * @table: a #GvdbTable + * @key: a key corresponding to a list + * @open_func: the #GvdbWalkOpenFunc + * @value_func: the #GvdbWalkValueFunc + * @close_func: the #GvdbWalkCloseFunc + * @user_data: data to pass to the callbacks + * + * Looks up the list at @key and iterate over the items in it. + * + * First, @open_func is called to signal that we are starting to iterate over + * the list. Then the list is iterated. When all items in the list have been + * iterated over, the @close_func is called. + * + * When iterating, if a given item in the list is a value then @value_func is + * called. + * + * If a given item in the list is itself a list then @open_func is called. If + * that function returns %TRUE then the walk begins iterating the items in the + * sublist, until there are no more items, at which point a matching + * @close_func call is made. If @open_func returns %FALSE then no iteration of + * the sublist occurs and no corresponding @close_func call is made. + **/ +void +gvdb_table_walk (GvdbTable *table, + const gchar *key, + GvdbWalkOpenFunc open_func, + GvdbWalkValueFunc value_func, + GvdbWalkCloseFunc close_func, + gpointer user_data) +{ + const struct gvdb_hash_item *item; + const guint32_le *pointers[64]; + const guint32_le *enders[64]; + gsize name_lengths[64]; + gint index = 0; + + item = gvdb_table_lookup (table, key, 'L'); + name_lengths[0] = 0; + pointers[0] = NULL; + enders[0] = NULL; + goto start_here; + + while (index) + { + close_func (name_lengths[index], user_data); + index--; + + while (pointers[index] < enders[index]) + { + const gchar *name; + gsize name_len; + + item = gvdb_table_get_item (table, *pointers[index]++); + start_here: + + if (item != NULL && + (name = gvdb_table_item_get_key (table, item, &name_len))) + { + if (item->type == 'L') + { + if (open_func (name, name_len, user_data)) + { + guint length = 0; + + index++; + g_assert (index < 64); + + gvdb_table_list_from_item (table, item, + &pointers[index], + &length); + enders[index] = pointers[index] + length; + name_lengths[index] = name_len; + } + } + else if (item->type == 'v') + { + GVariant *value; + + value = gvdb_table_value_from_item (table, item); + + if (value != NULL) + { + if (table->byteswapped) + { + GVariant *tmp; + + tmp = g_variant_byteswap (value); + g_variant_unref (value); + value = tmp; + } + + value_func (name, name_len, value, user_data); + g_variant_unref (value); + } + } + } + } + } +} diff --git a/gio/gvdb/gvdb-reader.h b/gio/gvdb/gvdb-reader.h new file mode 100644 index 0000000..e6878c3 --- /dev/null +++ b/gio/gvdb/gvdb-reader.h @@ -0,0 +1,90 @@ +/* + * 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 __gvdb_reader_h__ +#define __gvdb_reader_h__ + +#include + +typedef struct _GvdbTable GvdbTable; + +typedef gpointer (*GvdbRefFunc) (gpointer data); + +G_BEGIN_DECLS + +G_GNUC_INTERNAL +GvdbTable * gvdb_table_new (const gchar *filename, + gboolean trusted, + GError **error); +G_GNUC_INTERNAL +GvdbTable * gvdb_table_new_from_data (const void *data, + gsize data_len, + gboolean trusted, + gpointer user_data, + GvdbRefFunc ref, + GDestroyNotify unref, + GError **error); +G_GNUC_INTERNAL +GvdbTable * gvdb_table_ref (GvdbTable *table); +G_GNUC_INTERNAL +void gvdb_table_unref (GvdbTable *table); + +G_GNUC_INTERNAL +gchar ** gvdb_table_list (GvdbTable *table, + const gchar *key); +G_GNUC_INTERNAL +GvdbTable * gvdb_table_get_table (GvdbTable *table, + const gchar *key); +G_GNUC_INTERNAL +GVariant * gvdb_table_get_raw_value (GvdbTable *table, + const gchar *key); +G_GNUC_INTERNAL +GVariant * gvdb_table_get_value (GvdbTable *table, + const gchar *key); + +G_GNUC_INTERNAL +gboolean gvdb_table_has_value (GvdbTable *table, + const gchar *key); + +G_GNUC_INTERNAL +gboolean gvdb_table_is_valid (GvdbTable *table); + +typedef void (*GvdbWalkValueFunc) (const gchar *name, + gsize name_len, + GVariant *value, + gpointer user_data); +typedef gboolean (*GvdbWalkOpenFunc) (const gchar *name, + gsize name_len, + gpointer user_data); +typedef void (*GvdbWalkCloseFunc) (gsize name_len, + gpointer user_data); + +G_GNUC_INTERNAL +void gvdb_table_walk (GvdbTable *table, + const gchar *key, + GvdbWalkOpenFunc open_func, + GvdbWalkValueFunc value_func, + GvdbWalkCloseFunc close_func, + gpointer user_data); + +G_END_DECLS + +#endif /* __gvdb_reader_h__ */ diff --git a/gio/gvdb/gvdb.doap b/gio/gvdb/gvdb.doap new file mode 100644 index 0000000..b4ae60c --- /dev/null +++ b/gio/gvdb/gvdb.doap @@ -0,0 +1,32 @@ + + + + + gvdb + GVariant Database file + + A simple database file format that stores a mapping from strings to + GVariant values in a way that is extremely efficient for lookups. + + The database is written once and can not be modified. + + Included here is reader code and a first-pass implementation of a + writer (that does not currently produce particularly optimised + output). + + It is intended that this code be used by copy-pasting into your + project or by making use of git-merge(1). + + + + + Ryan Lortie + + ryanl + + + + diff --git a/gio/gvfs.c b/gio/gvfs.c new file mode 100644 index 0000000..d08c49e --- /dev/null +++ b/gio/gvfs.c @@ -0,0 +1,220 @@ +/* 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 "glib-private.h" +#include "glocalvfs.h" +#include "gresourcefile.h" +#include "giomodule-priv.h" +#include "glibintl.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: (transfer full): 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: (transfer full): 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); + + /* This is an unfortunate placement, but we really + * need to check this before chaining to the vfs, + * because we want to support resource uris for + * all vfs:es, even those that predate resources. + */ + if (g_str_has_prefix (uri, "resource:")) + return _g_resource_file_new (uri); + + 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: (transfer none): 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: (transfer full): 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); + + if (g_str_has_prefix (parse_name, "resource:")) + return _g_resource_file_new (parse_name); + + return (* class->parse_name) (vfs, parse_name); +} + +/** + * g_vfs_get_default: + * + * Gets the default #GVfs for the system. + * + * Returns: (transfer none): a #GVfs. + */ +GVfs * +g_vfs_get_default (void) +{ + if (GLIB_PRIVATE_CALL (g_check_setuid) ()) + return g_vfs_get_local (); + return _g_io_module_get_default (G_VFS_EXTENSION_POINT_NAME, + "GIO_USE_VFS", + (GIOModuleVerifyFunc)g_vfs_is_active); +} + +/** + * g_vfs_get_local: + * + * Gets the local #GVfs for the system. + * + * Returns: (transfer none): 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); +} diff --git a/gio/gvfs.h b/gio/gvfs.h new file mode 100644 index 0000000..30ff1bf --- /dev/null +++ b/gio/gvfs.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 + */ + +#ifndef __G_VFS_H__ +#define __G_VFS_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_vfs_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_vfs_is_active (GVfs *vfs); +GLIB_AVAILABLE_IN_ALL +GFile * g_vfs_get_file_for_path (GVfs *vfs, + const char *path); +GLIB_AVAILABLE_IN_ALL +GFile * g_vfs_get_file_for_uri (GVfs *vfs, + const char *uri); +GLIB_AVAILABLE_IN_ALL +const gchar* const * g_vfs_get_supported_uri_schemes (GVfs *vfs); + +GLIB_AVAILABLE_IN_ALL +GFile * g_vfs_parse_name (GVfs *vfs, + const char *parse_name); + +GLIB_AVAILABLE_IN_ALL +GVfs * g_vfs_get_default (void); +GLIB_AVAILABLE_IN_ALL +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..aa5e40e --- /dev/null +++ b/gio/gvolume.c @@ -0,0 +1,693 @@ +/* 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 "gthemedicon.h" +#include "gasyncresult.h" +#include "gtask.h" +#include "gioerror.h" +#include "glibintl.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 #GAsyncResult and + * #GTask. 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_manager_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: (transfer full): 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_symbolic_icon: + * @volume: a #GVolume. + * + * Gets the symbolic icon for @volume. + * + * Returns: (transfer full): a #GIcon. + * The returned object should be unreffed with g_object_unref() + * when no longer needed. + * + * Since: 2.34 + **/ +GIcon * +g_volume_get_symbolic_icon (GVolume *volume) +{ + GVolumeIface *iface; + GIcon *ret; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + + if (iface->get_symbolic_icon != NULL) + ret = iface->get_symbolic_icon (volume); + else + ret = g_themed_icon_new_with_default_fallbacks ("folder-remote-symbolic"); + + return ret; + +} + +/** + * 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: (transfer full): 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: (transfer full): 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: (allow-none): a #GMountOperation or %NULL to avoid user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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. + * + * Virtual: mount_fn + **/ +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_task_report_new_error (volume, callback, user_data, + g_volume_mount, + 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 occurred 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_volume_mount)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (volume, callback, user_data, + g_volume_eject_with_operation, + 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 occurred 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + if (g_async_result_is_tagged (result, g_volume_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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: (allow-none): a #GMountOperation or %NULL to + * avoid user interaction. + * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore. + * @callback: (allow-none): 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_task_report_new_error (volume, callback, user_data, + g_volume_eject_with_operation, + 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 occurring, 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_async_result_legacy_propagate_error (result, error)) + return FALSE; + else if (g_async_result_is_tagged (result, g_volume_eject_with_operation)) + return g_task_propagate_boolean (G_TASK (result), error); + + 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_identifier() to obtain + * the identifiers themselves. + * + * Returns: (array zero-terminated=1) (transfer full): 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: (transfer full): 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); +} + +/** + * g_volume_get_sort_key: + * @volume: A #GVolume. + * + * Gets the sort key for @volume, if any. + * + * Returns: Sorting key for @volume or %NULL if no such key is available. + * + * Since: 2.32 + */ +const gchar * +g_volume_get_sort_key (GVolume *volume) +{ + const gchar *ret = NULL; + GVolumeIface *iface; + + g_return_val_if_fail (G_IS_VOLUME (volume), NULL); + + iface = G_VOLUME_GET_IFACE (volume); + if (iface->get_sort_key != NULL) + ret = iface->get_sort_key (volume); + + return ret; +} diff --git a/gio/gvolume.h b/gio/gvolume.h new file mode 100644 index 0000000..0a4abe0 --- /dev/null +++ b/gio/gvolume.h @@ -0,0 +1,256 @@ +/* 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_VOLUME_H__ +#define __G_VOLUME_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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" + +/** + * G_VOLUME_IDENTIFIER_KIND_CLASS: + * + * The string used to obtain the volume class + * with g_volume_get_identifier(). + * + * Known volume classes include device and + * network. Other classes may be added in the + * future. + * + * This is intended to be used by applications to classify #GVolume + * instances into different sections - for example a file manager or + * file chooser can use this information to show + * network volumes under a "Network" heading and + * device volumes under a "Devices" heading. + */ +#define G_VOLUME_IDENTIFIER_KIND_CLASS "class" + + +#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. + * @get_sort_key: Gets a key used for sorting #GVolume instance or %NULL if no such key exists. Since 2.32. + * @get_symbolic_icon: Gets a symbolic #GIcon for the #GVolume. Since 2.34. + * + * 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); + + const gchar * (* get_sort_key) (GVolume *volume); + GIcon * (* get_symbolic_icon) (GVolume *volume); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_volume_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +char * g_volume_get_name (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +GIcon * g_volume_get_icon (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +GIcon * g_volume_get_symbolic_icon (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +char * g_volume_get_uuid (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +GDrive * g_volume_get_drive (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +GMount * g_volume_get_mount (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +gboolean g_volume_can_mount (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +gboolean g_volume_can_eject (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +gboolean g_volume_should_automount (GVolume *volume); +GLIB_AVAILABLE_IN_ALL +void g_volume_mount (GVolume *volume, + GMountMountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_volume_mount_finish (GVolume *volume, + GAsyncResult *result, + GError **error); +GLIB_DEPRECATED_FOR(g_volume_eject_with_operation) +void g_volume_eject (GVolume *volume, + GMountUnmountFlags flags, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_volume_eject_with_operation_finish) +gboolean g_volume_eject_finish (GVolume *volume, + GAsyncResult *result, + GError **error); +GLIB_AVAILABLE_IN_ALL +char * g_volume_get_identifier (GVolume *volume, + const char *kind); +GLIB_AVAILABLE_IN_ALL +char ** g_volume_enumerate_identifiers (GVolume *volume); + +GLIB_AVAILABLE_IN_ALL +GFile * g_volume_get_activation_root (GVolume *volume); + +GLIB_AVAILABLE_IN_ALL +void g_volume_eject_with_operation (GVolume *volume, + GMountUnmountFlags flags, + GMountOperation *mount_operation, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_volume_eject_with_operation_finish (GVolume *volume, + GAsyncResult *result, + GError **error); + +GLIB_AVAILABLE_IN_2_32 +const gchar *g_volume_get_sort_key (GVolume *volume); + +G_END_DECLS + +#endif /* __G_VOLUME_H__ */ diff --git a/gio/gvolumemonitor.c b/gio/gvolumemonitor.c new file mode 100644 index 0000000..bb0fd35 --- /dev/null +++ b/gio/gvolumemonitor.c @@ -0,0 +1,391 @@ +/* -*- 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" + + +/** + * 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: (element-type GDrive) (transfer full): 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: (element-type GVolume) (transfer full): 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: (element-type GMount) (transfer full): 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: (transfer full): 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: (transfer full): 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); +} diff --git a/gio/gvolumemonitor.h b/gio/gvolumemonitor.h new file mode 100644 index 0000000..0a37e12 --- /dev/null +++ b/gio/gvolumemonitor.h @@ -0,0 +1,156 @@ +/* -*- 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 + */ + +#ifndef __G_VOLUME_MONITOR_H__ +#define __G_VOLUME_MONITOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + * + * 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_volume_monitor_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GVolumeMonitor *g_volume_monitor_get (void); +GLIB_AVAILABLE_IN_ALL +GList * g_volume_monitor_get_connected_drives (GVolumeMonitor *volume_monitor); +GLIB_AVAILABLE_IN_ALL +GList * g_volume_monitor_get_volumes (GVolumeMonitor *volume_monitor); +GLIB_AVAILABLE_IN_ALL +GList * g_volume_monitor_get_mounts (GVolumeMonitor *volume_monitor); +GLIB_AVAILABLE_IN_ALL +GVolume * g_volume_monitor_get_volume_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid); +GLIB_AVAILABLE_IN_ALL +GMount * g_volume_monitor_get_mount_for_uuid (GVolumeMonitor *volume_monitor, + const char *uuid); + +GLIB_DEPRECATED +GVolume * g_volume_monitor_adopt_orphan_mount (GMount *mount); + +G_END_DECLS + +#endif /* __G_VOLUME_MONITOR_H__ */ diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c new file mode 100644 index 0000000..40e59ef --- /dev/null +++ b/gio/gwin32appinfo.c @@ -0,0 +1,699 @@ +/* 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 "gcontenttype.h" +#include "gwin32appinfo.h" +#include "gappinfo.h" +#include "gioerror.h" +#include "gfile.h" +#include +#include "glibintl.h" + +#include +#include + + +#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 + + /* FIXME: Need to do something with + * g_app_launch_context_get_environment()... ShellExecuteExW() + * doesn't have any way to pass an environment though. We need to + * either (a) update environment, ShellExecuteExW(), revert + * environment; or (b) find an API to figure out what app + * ShellExecuteExW() would launch, and then use g_spawn_async() + * instead. + */ + + 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); +} + +GList * +g_app_info_get_recommended_for_type (const char *content_type) +{ + /* FIXME: this should generate a list of applications that are registered + * as direct handlers for the given content type, without using MIME subclassing. + * See g_app_info_get_recommended_for_type() in gdesktopappinfo.c for a reference + * UNIX implementation. + */ + return g_app_info_get_all_for_type (content_type); +} + +GList * +g_app_info_get_fallback_for_type (const char *content_type) +{ + /* FIXME: this should generate a list of applications that are registered + * as handlers for a superclass of the given content type, but are not + * direct handlers for the content type itself. See g_app_info_get_fallback_for_type() + * in gdesktopappinfo.c for a reference UNIX implementation. + */ + return g_app_info_get_all_for_type (content_type); +} + +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/gwin32inputstream.c b/gio/gwin32inputstream.c new file mode 100644 index 0000000..21af468 --- /dev/null +++ b/gio/gwin32inputstream.c @@ -0,0 +1,394 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2010 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 + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include + +#include + +#include +#include "gioerror.h" +#include "gsimpleasyncresult.h" +#include "gwin32inputstream.h" +#include "gcancellable.h" +#include "gasynchelper.h" +#include "glibintl.h" + + +/** + * SECTION:gwin32inputstream + * @short_description: Streaming input operations for Windows file handles + * @include: gio/gwin32inputstream.h + * @see_also: #GInputStream + * + * #GWin32InputStream implements #GInputStream for reading from a + * Windows file handle. + * + * Note that <gio/gwin32inputstream.h> belongs + * to the Windows-specific GIO interfaces, thus you have to use the + * gio-windows-2.0.pc pkg-config file when using it. + */ + +enum { + PROP_0, + PROP_HANDLE, + PROP_CLOSE_HANDLE +}; + +G_DEFINE_TYPE (GWin32InputStream, g_win32_input_stream, G_TYPE_INPUT_STREAM); + +struct _GWin32InputStreamPrivate { + HANDLE handle; + gboolean close_handle; +}; + +static void g_win32_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_win32_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static gssize g_win32_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_win32_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error); + +static void +g_win32_input_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_win32_input_stream_parent_class)->finalize (object); +} + +static void +g_win32_input_stream_class_init (GWin32InputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GWin32InputStreamPrivate)); + + gobject_class->get_property = g_win32_input_stream_get_property; + gobject_class->set_property = g_win32_input_stream_set_property; + gobject_class->finalize = g_win32_input_stream_finalize; + + stream_class->read_fn = g_win32_input_stream_read; + stream_class->close_fn = g_win32_input_stream_close; + + /** + * GWin32InputStream:handle: + * + * The handle that the stream reads from. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_HANDLE, + g_param_spec_pointer ("handle", + P_("File handle"), + P_("The file handle to read from"), + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GWin32InputStream:close-handle: + * + * Whether to close the file handle when the stream is closed. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_HANDLE, + g_param_spec_boolean ("close-handle", + P_("Close file handle"), + P_("Whether to close the file handle 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_win32_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GWin32InputStream *win32_stream; + + win32_stream = G_WIN32_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_HANDLE: + win32_stream->priv->handle = g_value_get_pointer (value); + break; + case PROP_CLOSE_HANDLE: + win32_stream->priv->close_handle = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_win32_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GWin32InputStream *win32_stream; + + win32_stream = G_WIN32_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_HANDLE: + g_value_set_pointer (value, win32_stream->priv->handle); + break; + case PROP_CLOSE_HANDLE: + g_value_set_boolean (value, win32_stream->priv->close_handle); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_win32_input_stream_init (GWin32InputStream *win32_stream) +{ + win32_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (win32_stream, + G_TYPE_WIN32_INPUT_STREAM, + GWin32InputStreamPrivate); + + win32_stream->priv->handle = NULL; + win32_stream->priv->close_handle = TRUE; +} + +/** + * g_win32_input_stream_new: + * @handle: a Win32 file handle + * @close_handle: %TRUE to close the handle when done + * + * Creates a new #GWin32InputStream for the given @handle. + * + * If @close_handle is %TRUE, the handle will be closed + * when the stream is closed. + * + * Note that "handle" here means a Win32 HANDLE, not a "file descriptor" + * as used in the Windows C libraries. + * + * Returns: a new #GWin32InputStream + **/ +GInputStream * +g_win32_input_stream_new (void *handle, + gboolean close_handle) +{ + GWin32InputStream *stream; + + g_return_val_if_fail (handle != NULL, NULL); + + stream = g_object_new (G_TYPE_WIN32_INPUT_STREAM, + "handle", handle, + "close-handle", close_handle, + NULL); + + return G_INPUT_STREAM (stream); +} + +/** + * g_win32_input_stream_set_close_handle: + * @stream: a #GWin32InputStream + * @close_handle: %TRUE to close the handle when done + * + * Sets whether the handle of @stream shall be closed + * when the stream is closed. + * + * Since: 2.26 + */ +void +g_win32_input_stream_set_close_handle (GWin32InputStream *stream, + gboolean close_handle) +{ + g_return_if_fail (G_IS_WIN32_INPUT_STREAM (stream)); + + close_handle = close_handle != FALSE; + if (stream->priv->close_handle != close_handle) + { + stream->priv->close_handle = close_handle; + g_object_notify (G_OBJECT (stream), "close-handle"); + } +} + +/** + * g_win32_input_stream_get_close_handle: + * @stream: a #GWin32InputStream + * + * Returns whether the handle of @stream will be + * closed when the stream is closed. + * + * Return value: %TRUE if the handle is closed when done + * + * Since: 2.26 + */ +gboolean +g_win32_input_stream_get_close_handle (GWin32InputStream *stream) +{ + g_return_val_if_fail (G_IS_WIN32_INPUT_STREAM (stream), FALSE); + + return stream->priv->close_handle; +} + +/** + * g_win32_input_stream_get_handle: + * @stream: a #GWin32InputStream + * + * Return the Windows file handle that the stream reads from. + * + * Return value: The file handle of @stream + * + * Since: 2.26 + */ +void * +g_win32_input_stream_get_handle (GWin32InputStream *stream) +{ + g_return_val_if_fail (G_IS_WIN32_INPUT_STREAM (stream), NULL); + + return stream->priv->handle; +} + +static gssize +g_win32_input_stream_read (GInputStream *stream, + void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GWin32InputStream *win32_stream; + BOOL res; + DWORD nbytes, nread; + OVERLAPPED overlap = { 0, }; + gssize retval = -1; + + win32_stream = G_WIN32_INPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + if (count > G_MAXINT) + nbytes = G_MAXINT; + else + nbytes = count; + + overlap.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); + g_return_val_if_fail (overlap.hEvent != NULL, -1); + + res = ReadFile (win32_stream->priv->handle, buffer, nbytes, &nread, &overlap); + if (res) + retval = nread; + else + { + int errsv = GetLastError (); + + if (errsv == ERROR_IO_PENDING && + _g_win32_overlap_wait_result (win32_stream->priv->handle, + &overlap, &nread, cancellable)) + { + retval = nread; + goto end; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto end; + + errsv = GetLastError (); + if (errsv == ERROR_MORE_DATA) + { + /* If a named pipe is being read in message mode and the + * next message is longer than the nNumberOfBytesToRead + * parameter specifies, ReadFile returns FALSE and + * GetLastError returns ERROR_MORE_DATA */ + retval = nread; + goto end; + } + else if (errsv == ERROR_HANDLE_EOF || + errsv == ERROR_BROKEN_PIPE) + { + /* TODO: the other end of a pipe may call the WriteFile + * function with nNumberOfBytesToWrite set to zero. In this + * case, it's not possible for the caller to know if it's + * broken pipe or a read of 0. Perhaps we should add a + * is_broken flag for this win32 case.. */ + retval = 0; + } + else + { + gchar *emsg; + + emsg = g_win32_error_message (errsv); + g_set_error (error, G_IO_ERROR, + g_io_error_from_win32_error (errsv), + _("Error reading from handle: %s"), + emsg); + g_free (emsg); + } + } + +end: + CloseHandle (overlap.hEvent); + return retval; +} + +static gboolean +g_win32_input_stream_close (GInputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GWin32InputStream *win32_stream; + BOOL res; + + win32_stream = G_WIN32_INPUT_STREAM (stream); + + if (!win32_stream->priv->close_handle) + return TRUE; + + res = CloseHandle (win32_stream->priv->handle); + if (!res) + { + int errsv = GetLastError (); + gchar *emsg = g_win32_error_message (errsv); + + g_set_error (error, G_IO_ERROR, + g_io_error_from_win32_error (errsv), + _("Error closing handle: %s"), + emsg); + g_free (emsg); + return FALSE; + } + + return TRUE; +} diff --git a/gio/gwin32inputstream.h b/gio/gwin32inputstream.h new file mode 100644 index 0000000..27fa7e1 --- /dev/null +++ b/gio/gwin32inputstream.h @@ -0,0 +1,84 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2010 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 + * Author: Tor Lillqvist + */ + +#ifndef __G_WIN32_INPUT_STREAM_H__ +#define __G_WIN32_INPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_INPUT_STREAM (g_win32_input_stream_get_type ()) +#define G_WIN32_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_INPUT_STREAM, GWin32InputStream)) +#define G_WIN32_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_INPUT_STREAM, GWin32InputStreamClass)) +#define G_IS_WIN32_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_INPUT_STREAM)) +#define G_IS_WIN32_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_INPUT_STREAM)) +#define G_WIN32_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_INPUT_STREAM, GWin32InputStreamClass)) + +/** + * GWin32InputStream: + * + * Implements #GInputStream for reading from selectable Windows file handles + **/ +typedef struct _GWin32InputStream GWin32InputStream; +typedef struct _GWin32InputStreamClass GWin32InputStreamClass; +typedef struct _GWin32InputStreamPrivate GWin32InputStreamPrivate; + +struct _GWin32InputStream +{ + GInputStream parent_instance; + + /*< private >*/ + GWin32InputStreamPrivate *priv; +}; + +struct _GWin32InputStreamClass +{ + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_win32_input_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GInputStream * g_win32_input_stream_new (void *handle, + gboolean close_handle); +GLIB_AVAILABLE_IN_ALL +void g_win32_input_stream_set_close_handle (GWin32InputStream *stream, + gboolean close_handle); +GLIB_AVAILABLE_IN_ALL +gboolean g_win32_input_stream_get_close_handle (GWin32InputStream *stream); +GLIB_AVAILABLE_IN_ALL +void *g_win32_input_stream_get_handle (GWin32InputStream *stream); + +G_END_DECLS + +#endif /* __G_WIN32_INPUT_STREAM_H__ */ diff --git a/gio/gwin32mount.c b/gio/gwin32mount.c new file mode 100644 index 0000000..39931ef --- /dev/null +++ b/gio/gwin32mount.c @@ -0,0 +1,367 @@ +/* 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" + + +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; + GIcon *symbolic_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); + if (mount->symbolic_icon != NULL) + g_object_unref (mount->symbolic_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) +{ +} + +static 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: usually 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); +} + +static const char * +_win32_drive_type_to_icon (int type, gboolean use_symbolic) +{ + switch (type) + { + case DRIVE_REMOVABLE : return use_symbolic ? "drive-removable-media-symbolic" : "drive-removable-media"; + case DRIVE_FIXED : return use_symbolic ? "drive-harddisk-symbolic" : "drive-harddisk"; + case DRIVE_REMOTE : return use_symbolic ? "folder-remote-symbolic" : "folder-remote"; + case DRIVE_CDROM : return use_symbolic ? "drive-optical-symbolic" : "drive-optical"; + default : return use_symbolic ? "folder-symbolic" : "folder"; + } +} + +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, FALSE)); + } + } + + return g_object_ref (win32_mount->icon); +} + +static GIcon * +g_win32_mount_get_symbolic_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->symbolic_icon) + { + win32_mount->symbolic_icon = g_themed_icon_new_with_default_fallbacks (_win32_drive_type_to_icon (win32_mount->drive_type, TRUE)); + } + + return g_object_ref (win32_mount->symbolic_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_symbolic_icon = g_win32_mount_get_symbolic_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/gwin32outputstream.c b/gio/gwin32outputstream.c new file mode 100644 index 0000000..5a6798b --- /dev/null +++ b/gio/gwin32outputstream.c @@ -0,0 +1,382 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2010 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 + * Author: Tor Lillqvist + */ + +#include "config.h" + +#include + +#include + +#include +#include +#include "gioerror.h" +#include "gwin32outputstream.h" +#include "gcancellable.h" +#include "gsimpleasyncresult.h" +#include "gasynchelper.h" +#include "glibintl.h" + + +/** + * SECTION:gwin32outputstream + * @short_description: Streaming output operations for Windows file handles + * @include: gio/gwin32outputstream.h + * @see_also: #GOutputStream + * + * #GWin32OutputStream implements #GOutputStream for writing to a + * Windows file handle. + * + * Note that <gio/gwin32outputstream.h> belongs + * to the Windows-specific GIO interfaces, thus you have to use the + * gio-windows-2.0.pc pkg-config file when using it. + */ + +enum { + PROP_0, + PROP_HANDLE, + PROP_CLOSE_HANDLE +}; + +G_DEFINE_TYPE (GWin32OutputStream, g_win32_output_stream, G_TYPE_OUTPUT_STREAM); + + +struct _GWin32OutputStreamPrivate { + HANDLE handle; + gboolean close_handle; +}; + +static void g_win32_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_win32_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static gssize g_win32_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error); +static gboolean g_win32_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error); + + +static void +g_win32_output_stream_finalize (GObject *object) +{ + G_OBJECT_CLASS (g_win32_output_stream_parent_class)->finalize (object); +} + +static void +g_win32_output_stream_class_init (GWin32OutputStreamClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GWin32OutputStreamPrivate)); + + gobject_class->get_property = g_win32_output_stream_get_property; + gobject_class->set_property = g_win32_output_stream_set_property; + gobject_class->finalize = g_win32_output_stream_finalize; + + stream_class->write_fn = g_win32_output_stream_write; + stream_class->close_fn = g_win32_output_stream_close; + + /** + * GWin32OutputStream:handle: + * + * The file handle that the stream writes to. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_HANDLE, + g_param_spec_pointer ("handle", + P_("File handle"), + P_("The file handle to write to"), + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GWin32OutputStream:close-handle: + * + * Whether to close the file handle when the stream is closed. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_HANDLE, + g_param_spec_boolean ("close-handle", + P_("Close file handle"), + P_("Whether to close the file handle 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_win32_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GWin32OutputStream *win32_stream; + + win32_stream = G_WIN32_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_HANDLE: + win32_stream->priv->handle = g_value_get_pointer (value); + break; + case PROP_CLOSE_HANDLE: + win32_stream->priv->close_handle = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_win32_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GWin32OutputStream *win32_stream; + + win32_stream = G_WIN32_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_HANDLE: + g_value_set_pointer (value, win32_stream->priv->handle); + break; + case PROP_CLOSE_HANDLE: + g_value_set_boolean (value, win32_stream->priv->close_handle); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_win32_output_stream_init (GWin32OutputStream *win32_stream) +{ + win32_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (win32_stream, + G_TYPE_WIN32_OUTPUT_STREAM, + GWin32OutputStreamPrivate); + + win32_stream->priv->handle = NULL; + win32_stream->priv->close_handle = TRUE; +} + +/** + * g_win32_output_stream_new: + * @handle: a Win32 file handle + * @close_handle: %TRUE to close the handle when done + * + * Creates a new #GWin32OutputStream for the given @handle. + * + * If @close_handle, is %TRUE, the handle will be closed when the + * output stream is destroyed. + * + * Returns: a new #GOutputStream + * + * Since: 2.26 +**/ +GOutputStream * +g_win32_output_stream_new (void *handle, + gboolean close_handle) +{ + GWin32OutputStream *stream; + + g_return_val_if_fail (handle != NULL, NULL); + + stream = g_object_new (G_TYPE_WIN32_OUTPUT_STREAM, + "handle", handle, + "close-handle", close_handle, + NULL); + + return G_OUTPUT_STREAM (stream); +} + +/** + * g_win32_output_stream_set_close_handle: + * @stream: a #GWin32OutputStream + * @close_handle: %TRUE to close the handle when done + * + * Sets whether the handle of @stream shall be closed when the stream + * is closed. + * + * Since: 2.26 + */ +void +g_win32_output_stream_set_close_handle (GWin32OutputStream *stream, + gboolean close_handle) +{ + g_return_if_fail (G_IS_WIN32_OUTPUT_STREAM (stream)); + + close_handle = close_handle != FALSE; + if (stream->priv->close_handle != close_handle) + { + stream->priv->close_handle = close_handle; + g_object_notify (G_OBJECT (stream), "close-handle"); + } +} + +/** + * g_win32_output_stream_get_close_handle: + * @stream: a #GWin32OutputStream + * + * Returns whether the handle of @stream will be closed when the + * stream is closed. + * + * Return value: %TRUE if the handle is closed when done + * + * Since: 2.26 + */ +gboolean +g_win32_output_stream_get_close_handle (GWin32OutputStream *stream) +{ + g_return_val_if_fail (G_IS_WIN32_OUTPUT_STREAM (stream), FALSE); + + return stream->priv->close_handle; +} + +/** + * g_win32_output_stream_get_handle: + * @stream: a #GWin32OutputStream + * + * Return the Windows handle that the stream writes to. + * + * Return value: The handle descriptor of @stream + * + * Since: 2.26 + */ +void * +g_win32_output_stream_get_handle (GWin32OutputStream *stream) +{ + g_return_val_if_fail (G_IS_WIN32_OUTPUT_STREAM (stream), NULL); + + return stream->priv->handle; +} + +static gssize +g_win32_output_stream_write (GOutputStream *stream, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + GWin32OutputStream *win32_stream; + BOOL res; + DWORD nbytes, nwritten; + OVERLAPPED overlap = { 0, }; + gssize retval = -1; + + win32_stream = G_WIN32_OUTPUT_STREAM (stream); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return -1; + + if (count > G_MAXINT) + nbytes = G_MAXINT; + else + nbytes = count; + + overlap.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); + g_return_val_if_fail (overlap.hEvent != NULL, -1); + + res = WriteFile (win32_stream->priv->handle, buffer, nbytes, &nwritten, &overlap); + if (res) + retval = nwritten; + else + { + int errsv = GetLastError (); + + if (errsv == ERROR_IO_PENDING && + _g_win32_overlap_wait_result (win32_stream->priv->handle, + &overlap, &nwritten, cancellable)) + { + retval = nwritten; + goto end; + } + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + goto end; + + errsv = GetLastError (); + if (errsv == ERROR_HANDLE_EOF || + errsv == ERROR_BROKEN_PIPE) + { + retval = 0; + } + else + { + gchar *emsg; + + emsg = g_win32_error_message (errsv); + g_set_error (error, G_IO_ERROR, + g_io_error_from_win32_error (errsv), + _("Error writing to handle: %s"), + emsg); + g_free (emsg); + } + } + +end: + CloseHandle (overlap.hEvent); + return retval; +} + +static gboolean +g_win32_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + GWin32OutputStream *win32_stream; + BOOL res; + + win32_stream = G_WIN32_OUTPUT_STREAM (stream); + + if (!win32_stream->priv->close_handle) + return TRUE; + + res = CloseHandle (win32_stream->priv->handle); + if (!res) + { + int errsv = GetLastError (); + gchar *emsg = g_win32_error_message (errsv); + + g_set_error (error, G_IO_ERROR, + g_io_error_from_win32_error (errsv), + _("Error closing handle: %s"), + emsg); + g_free (emsg); + return FALSE; + } + + return TRUE; +} diff --git a/gio/gwin32outputstream.h b/gio/gwin32outputstream.h new file mode 100644 index 0000000..9e441d9 --- /dev/null +++ b/gio/gwin32outputstream.h @@ -0,0 +1,83 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2006-2010 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 + * Author: Tor Lillqvist + */ + +#ifndef __G_WIN32_OUTPUT_STREAM_H__ +#define __G_WIN32_OUTPUT_STREAM_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_WIN32_OUTPUT_STREAM (g_win32_output_stream_get_type ()) +#define G_WIN32_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_WIN32_OUTPUT_STREAM, GWin32OutputStream)) +#define G_WIN32_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_WIN32_OUTPUT_STREAM, GWin32OutputStreamClass)) +#define G_IS_WIN32_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_WIN32_OUTPUT_STREAM)) +#define G_IS_WIN32_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_OUTPUT_STREAM)) +#define G_WIN32_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_OUTPUT_STREAM, GWin32OutputStreamClass)) + +/** + * GWin32OutputStream: + * + * Implements #GOutputStream for outputting to Windows file handles + **/ +typedef struct _GWin32OutputStream GWin32OutputStream; +typedef struct _GWin32OutputStreamClass GWin32OutputStreamClass; +typedef struct _GWin32OutputStreamPrivate GWin32OutputStreamPrivate; + +struct _GWin32OutputStream +{ + GOutputStream parent_instance; + + /*< private >*/ + GWin32OutputStreamPrivate *priv; +}; + +struct _GWin32OutputStreamClass +{ + 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); +}; + +GLIB_AVAILABLE_IN_ALL +GType g_win32_output_stream_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GOutputStream * g_win32_output_stream_new (void *handle, + gboolean close_handle); +GLIB_AVAILABLE_IN_ALL +void g_win32_output_stream_set_close_handle (GWin32OutputStream *stream, + gboolean close_handle); +GLIB_AVAILABLE_IN_ALL +gboolean g_win32_output_stream_get_close_handle (GWin32OutputStream *stream); +GLIB_AVAILABLE_IN_ALL +void *g_win32_output_stream_get_handle (GWin32OutputStream *stream); +G_END_DECLS + +#endif /* __G_WIN32_OUTPUT_STREAM_H__ */ diff --git a/gio/gwin32volumemonitor.c b/gio/gwin32volumemonitor.c new file mode 100644 index 0000000..286d1ca --- /dev/null +++ b/gio/gwin32volumemonitor.c @@ -0,0 +1,257 @@ +/* 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 + +struct _GWin32VolumeMonitor { + GNativeVolumeMonitor parent; +}; + +#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)); + +/* + * 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) +{ + DWORD drives; + gchar drive[4] = "A:\\"; + GList *list = NULL; + + 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) +{ + return NULL; +} + +/* real hardware */ +static GList * +get_connected_drives (GVolumeMonitor *volume_monitor) +{ + GList *list = NULL; + +#if 0 + HANDLE find_handle; + BOOL found; + wchar_t wc_name[MAX_PATH+1]; + + 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) +{ + GVolumeMonitorClass *monitor_class = G_VOLUME_MONITOR_CLASS (klass); + GNativeVolumeMonitorClass *native_class = G_NATIVE_VOLUME_MONITOR_CLASS (klass); + + 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..51092e8 --- /dev/null +++ b/gio/gzlibcompressor.c @@ -0,0 +1,438 @@ +/* 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 "gzlibcompressor.h" + +#include +#include +#include + +#include "gfileinfo.h" +#include "gioerror.h" +#include "gioenums.h" +#include "gioenumtypes.h" +#include "glibintl.h" + + +enum { + PROP_0, + PROP_FORMAT, + PROP_LEVEL, + PROP_FILE_INFO +}; + +/** + * 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; + gz_header gzheader; + GFileInfo *file_info; +}; + +static void +g_zlib_compressor_set_gzheader (GZlibCompressor *compressor) +{ + /* On win32, these functions were not exported before 1.2.4 */ +#if !defined (G_OS_WIN32) || ZLIB_VERNUM >= 0x1240 + const gchar *filename; + + if (compressor->format != G_ZLIB_COMPRESSOR_FORMAT_GZIP || + compressor->file_info == NULL) + return; + + memset (&compressor->gzheader, 0, sizeof (gz_header)); + compressor->gzheader.os = 0x03; /* Unix */ + + filename = g_file_info_get_name (compressor->file_info); + compressor->gzheader.name = (Bytef *) filename; + compressor->gzheader.name_max = filename ? strlen (filename) + 1 : 0; + + compressor->gzheader.time = + (uLong) g_file_info_get_attribute_uint64 (compressor->file_info, + G_FILE_ATTRIBUTE_TIME_MODIFIED); + + if (deflateSetHeader (&compressor->zstream, &compressor->gzheader) != Z_OK) + g_warning ("unexpected zlib error: %s\n", compressor->zstream.msg); +#endif /* !G_OS_WIN32 || ZLIB >= 1.2.4 */ +} + +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); + + if (compressor->file_info) + g_object_unref (compressor->file_info); + + 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; + + case PROP_FILE_INFO: + g_zlib_compressor_set_file_info (compressor, g_value_get_object (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; + + case PROP_FILE_INFO: + g_value_set_object (value, compressor->file_info); + 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); + + g_zlib_compressor_set_gzheader (compressor); +} + +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)); + + /** + * GZlibCompressor:file-info: + * + * If set to a non-%NULL #GFileInfo object, and #GZlibCompressor:format is + * %G_ZLIB_COMPRESSOR_FORMAT_GZIP, the compressor will write the file name + * and modification time from the file info to the GZIP header. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_FILE_INFO, + g_param_spec_object ("file-info", + P_("file info"), + P_("File info"), + G_TYPE_FILE_INFO, + G_PARAM_READWRITE | + 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; +} + +/** + * g_zlib_compressor_get_file_info: + * @compressor: a #GZlibCompressor + * + * Returns the #GZlibCompressor:file-info property. + * + * Returns: (transfer none): a #GFileInfo, or %NULL + * + * Since: 2.26 + */ +GFileInfo * +g_zlib_compressor_get_file_info (GZlibCompressor *compressor) +{ + g_return_val_if_fail (G_IS_ZLIB_COMPRESSOR (compressor), NULL); + + return compressor->file_info; +} + +/** + * g_zlib_compressor_set_file_info: + * @compressor: a #GZlibCompressor + * @file_info: (allow-none): a #GFileInfo + * + * Sets @file_info in @compressor. If non-%NULL, and @compressor's + * #GZlibCompressor:format property is %G_ZLIB_COMPRESSOR_FORMAT_GZIP, + * it will be used to set the file name and modification time in + * the GZIP header of the compressed data. + * + * Note: it is an error to call this function while a compression is in + * progress; it may only be called immediately after creation of @compressor, + * or after resetting it with g_converter_reset(). + * + * Since: 2.26 + */ +void +g_zlib_compressor_set_file_info (GZlibCompressor *compressor, + GFileInfo *file_info) +{ + g_return_if_fail (G_IS_ZLIB_COMPRESSOR (compressor)); + + if (file_info == compressor->file_info) + return; + + if (compressor->file_info) + g_object_unref (compressor->file_info); + if (file_info) + g_object_ref (file_info); + compressor->file_info = file_info; + g_object_notify (G_OBJECT (compressor), "file-info"); + + g_zlib_compressor_set_gzheader (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); + + /* deflateReset reset the header too, so re-set it */ + g_zlib_compressor_set_gzheader (compressor); +} + +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; +} diff --git a/gio/gzlibcompressor.h b/gio/gzlibcompressor.h new file mode 100644 index 0000000..609e42f --- /dev/null +++ b/gio/gzlibcompressor.h @@ -0,0 +1,64 @@ +/* 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 + */ + +#ifndef __G_ZLIB_COMPRESSOR_H__ +#define __G_ZLIB_COMPRESSOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_zlib_compressor_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GZlibCompressor *g_zlib_compressor_new (GZlibCompressorFormat format, + int level); + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_zlib_compressor_get_file_info (GZlibCompressor *compressor); +GLIB_AVAILABLE_IN_ALL +void g_zlib_compressor_set_file_info (GZlibCompressor *compressor, + GFileInfo *file_info); + +G_END_DECLS + +#endif /* __G_ZLIB_COMPRESSOR_H__ */ diff --git a/gio/gzlibdecompressor.c b/gio/gzlibdecompressor.c new file mode 100644 index 0000000..a868255 --- /dev/null +++ b/gio/gzlibdecompressor.c @@ -0,0 +1,415 @@ +/* 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 "gzlibdecompressor.h" + +#include +#include +#include + +#include "gfileinfo.h" +#include "gioerror.h" +#include "gioenums.h" +#include "gioenumtypes.h" +#include "glibintl.h" + + +enum { + PROP_0, + PROP_FORMAT, + PROP_FILE_INFO +}; + +/** + * 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); + +typedef struct { + gz_header gzheader; + char filename[257]; + GFileInfo *file_info; +} HeaderData; + +/** + * GZlibDecompressor: + * + * Zlib decompression + */ +struct _GZlibDecompressor +{ + GObject parent_instance; + + GZlibCompressorFormat format; + z_stream zstream; + HeaderData *header_data; +}; + +static void +g_zlib_decompressor_set_gzheader (GZlibDecompressor *decompressor) +{ + /* On win32, these functions were not exported before 1.2.4 */ +#if !defined (G_OS_WIN32) || ZLIB_VERNUM >= 0x1240 + if (decompressor->format != G_ZLIB_COMPRESSOR_FORMAT_GZIP) + return; + + if (decompressor->header_data != NULL) + { + if (decompressor->header_data->file_info) + g_object_unref (decompressor->header_data->file_info); + + memset (decompressor->header_data, 0, sizeof (HeaderData)); + } + else + { + decompressor->header_data = g_new0 (HeaderData, 1); + } + + decompressor->header_data->gzheader.name = (Bytef*) &decompressor->header_data->filename; + /* We keep one byte to guarantee the string is 0-terminated */ + decompressor->header_data->gzheader.name_max = 256; + + if (inflateGetHeader (&decompressor->zstream, &decompressor->header_data->gzheader) != Z_OK) + g_warning ("unexpected zlib error: %s\n", decompressor->zstream.msg); +#endif /* !G_OS_WIN32 || ZLIB >= 1.2.4 */ +} + +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); + + if (decompressor->header_data != NULL) + { + if (decompressor->header_data->file_info) + g_object_unref (decompressor->header_data->file_info); + g_free (decompressor->header_data); + } + + 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; + + case PROP_FILE_INFO: + if (decompressor->header_data) + g_value_set_object (value, decompressor->header_data->file_info); + else + g_value_set_object (value, NULL); + 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 raw */ + 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); + + g_zlib_decompressor_set_gzheader (decompressor); +} + +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)); + + /** + * GZlibDecompressor:file-info: + * + * A #GFileInfo containing the information found in the GZIP header + * of the data stream processed, or %NULL if the header was not yet + * fully processed, is not present at all, or the compressor's + * #GZlibDecompressor:format property is not %G_ZLIB_COMPRESSOR_FORMAT_GZIP. + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, + PROP_FILE_INFO, + g_param_spec_object ("file-info", + P_("file info"), + P_("File info"), + G_TYPE_FILE_INFO, + G_PARAM_READABLE | + 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; +} + +/** + * g_zlib_decompressor_get_file_info: + * @decompressor: a #GZlibDecompressor + * + * Retrieves the #GFileInfo constructed from the GZIP header data + * of compressed data processed by @compressor, or %NULL if @decompressor's + * #GZlibDecompressor:format property is not %G_ZLIB_COMPRESSOR_FORMAT_GZIP, + * or the header data was not fully processed yet, or it not present in the + * data stream at all. + * + * Returns: (transfer none): a #GFileInfo, or %NULL + * + * Since: 2.26 + */ +GFileInfo * +g_zlib_decompressor_get_file_info (GZlibDecompressor *decompressor) +{ + g_return_val_if_fail (G_IS_ZLIB_DECOMPRESSOR (decompressor), NULL); + + if (decompressor->header_data) + return decompressor->header_data->file_info; + + return NULL; +} + +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); + + g_zlib_decompressor_set_gzheader (decompressor); +} + +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; + } + + g_assert (res == Z_OK || res == Z_STREAM_END); + + *bytes_read = inbuf_size - decompressor->zstream.avail_in; + *bytes_written = outbuf_size - decompressor->zstream.avail_out; + +#if !defined (G_OS_WIN32) || ZLIB_VERNUM >= 0x1240 + if (decompressor->header_data != NULL && + decompressor->header_data->gzheader.done == 1) + { + HeaderData *data = decompressor->header_data; + + /* So we don't notify again */ + data->gzheader.done = 2; + + data->file_info = g_file_info_new (); + g_file_info_set_attribute_uint64 (data->file_info, + G_FILE_ATTRIBUTE_TIME_MODIFIED, + data->gzheader.time); + g_file_info_set_attribute_uint32 (data->file_info, + G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, + 0); + + if (data->filename[0] != '\0') + g_file_info_set_attribute_byte_string (data->file_info, + G_FILE_ATTRIBUTE_STANDARD_NAME, + data->filename); + + g_object_notify (G_OBJECT (decompressor), "file-info"); + } +#endif /* !G_OS_WIN32 || ZLIB >= 1.2.4 */ + + if (res == Z_STREAM_END) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; +} + +static void +g_zlib_decompressor_iface_init (GConverterIface *iface) +{ + iface->convert = g_zlib_decompressor_convert; + iface->reset = g_zlib_decompressor_reset; +} diff --git a/gio/gzlibdecompressor.h b/gio/gzlibdecompressor.h new file mode 100644 index 0000000..ecc4f4e --- /dev/null +++ b/gio/gzlibdecompressor.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 + */ + +#ifndef __G_ZLIB_DECOMPRESSOR_H__ +#define __G_ZLIB_DECOMPRESSOR_H__ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GType g_zlib_decompressor_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GZlibDecompressor *g_zlib_decompressor_new (GZlibCompressorFormat format); + +GLIB_AVAILABLE_IN_ALL +GFileInfo *g_zlib_decompressor_get_file_info (GZlibDecompressor *decompressor); + +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..b51a0a9 --- /dev/null +++ b/gio/inotify/Makefile.am @@ -0,0 +1,32 @@ +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-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 = \ + $(GLIB_HIDDEN_VISIBILITY_CFLAGS) \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED + diff --git a/gio/inotify/ginotifydirectorymonitor.c b/gio/inotify/ginotifydirectorymonitor.c new file mode 100644 index 0000000..89c818c --- /dev/null +++ b/gio/inotify/ginotifydirectorymonitor.c @@ -0,0 +1,156 @@ +/* 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 + +#define USE_INOTIFY 1 +#include "inotify-helper.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, FALSE, 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..c8cb9ca --- /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 +#include + +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..5d300bb --- /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" + +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; + gboolean watch_hardlinks; + 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; + watch_hardlinks = G_LOCAL_FILE_MONITOR (obj)->flags & G_FILE_MONITOR_WATCH_HARD_LINKS; + + sub = _ih_sub_new (inotify_monitor->dirname, + inotify_monitor->filename, + pair_moves, + watch_hardlinks, + 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-helper.c b/gio/inotify/inotify-helper.c new file mode 100644 index 0000000..f4ef8a4 --- /dev/null +++ b/gio/inotify/inotify-helper.c @@ -0,0 +1,294 @@ +/* -*- 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" + +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, + gboolean file_event); +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_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_UNLOCK (inotify_lock); + return FALSE; + } + _im_startup (ih_not_missing_callback); + + 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, + const char *dirname, + const char *filename) +{ + char *fullpath; + + if (filename) + fullpath = g_strdup_printf ("%s/%s", dirname, filename); + else 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, + gboolean file_event) +{ + gchar *fullpath; + GFileMonitorEvent eflags; + GFile* child; + GFile* other; + + eflags = ih_mask_to_EventFlags (event->mask); + fullpath = _ih_fullpath_from_event (event, sub->dirname, + file_event ? sub->filename : NULL); + child = g_file_new_for_path (fullpath); + g_free (fullpath); + + if (ih_event_is_paired_move (event) && sub->pair_moves) + { + const char *parent_dir = (char *) _ip_get_path_for_wd (event->pair->wd); + fullpath = _ih_fullpath_from_event (event->pair, parent_dir, NULL); + 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); + + /* For paired moves or moves whose mask has been changed from IN_MOVED_TO to + * IN_CREATE, notify also that it's probably the last change to the file, + * emitting CHANGES_DONE_HINT. + * The first (first part of the if's guard below) is the case of a normal + * move within the monitored tree and in the same mounted volume. + * The latter (second part of the guard) is the case of a move within the + * same mounted volume, but from a not monitored directory. + * + * It's not needed in cases like moves across mounted volumes as the IN_CREATE + * will be followed by a IN_MODIFY and IN_CLOSE_WRITE events. + * Also not needed if sub->pair_moves is set as EVENT_MOVED will be emitted + * instead of EVENT_CREATED which implies no further modification will be + * applied to the file + * See: https://bugzilla.gnome.org/show_bug.cgi?id=640077 + */ + if ((!sub->pair_moves && + event->is_second_in_pair && (event->mask & IN_MOVED_TO)) || + (!ih_event_is_paired_move (event) && + (event->original_mask & IN_MOVED_TO) && (event->mask & IN_CREATE))) + { + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, NULL, G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT); + } + + g_object_unref (child); + if (other) + g_object_unref (other); +} + +static void +ih_not_missing_callback (inotify_sub *sub) +{ + gchar *fullpath; + GFileMonitorEvent eflags; + guint32 mask; + GFile* child; + + 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); +} + +/* 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..5cfb692 --- /dev/null +++ b/gio/inotify/inotify-kernel.c @@ -0,0 +1,683 @@ +/* + 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 /* 1000 milliseconds (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_set_name (source, "GIO Inotify"); + 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; + event2->event->is_second_in_pair = TRUE; + + 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 */ + event->event->original_mask = event->event->mask; + + 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..104a189 --- /dev/null +++ b/gio/inotify/inotify-kernel.h @@ -0,0 +1,63 @@ +/* + 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 original_mask; + guint32 cookie; + guint32 len; + char * name; + /* TRUE if this event is the last element of a pair + * (e.g., MOVE_TO in a pair of MOVE_FROM, MOVE_TO events) */ + gboolean is_second_in_pair; + /* if event1 and event2 are two paired events + * (e.g., MOVE_FROM and MOVE_TO events related to the same file move), + * then event1->pair == event2 and event2->pair == NULL. + * It will result also in event1->pair->is_second_in_pair == TRUE */ + 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..4025837 --- /dev/null +++ b/gio/inotify/inotify-path.c @@ -0,0 +1,664 @@ +/* -*- 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 + Copyright (C) 2009 Codethink Limited + + 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 + Ryan Lortie +*/ + +#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_DIR_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) + +#define IP_INOTIFY_FILE_MASK (IN_MODIFY|IN_ATTRIB|IN_CLOSE_WRITE) + +/* Older libcs don't have this */ +#ifndef IN_ONLYDIR +#define IN_ONLYDIR 0 +#endif + +typedef struct ip_watched_file_s { + gchar *filename; + gchar *path; + gint32 wd; + + GList *subs; +} ip_watched_file_t; + +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; + + /* basename -> ip_watched_file_t + * Maps basename to a ip_watched_file_t if the file is currently + * being directly watched for changes (ie: 'hardlinks' mode). + */ + GHashTable *files_hash; + + /* 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; +/* This hash holds GLists of ip_watched_file_t *'s + * We need to hold a list because links can share + * the same wd + */ +static GHashTable * wd_file_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 file_event); + +gboolean +_ip_startup (void (*cb)(ik_event_t *event, inotify_sub *sub, gboolean file_event)) +{ + 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); + wd_file_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); +} + +static void +ip_map_wd_file (gint32 wd, + ip_watched_file_t *file) +{ + GList *file_list; + + g_assert (wd >= 0 && file); + file_list = g_hash_table_lookup (wd_file_hash, GINT_TO_POINTER (wd)); + file_list = g_list_prepend (file_list, file); + g_hash_table_replace (wd_file_hash, GINT_TO_POINTER (wd), file_list); +} + +static void +ip_unmap_wd_file (gint32 wd, + ip_watched_file_t *file) +{ + GList *file_list = g_hash_table_lookup (wd_file_hash, GINT_TO_POINTER (wd)); + + if (!file_list) + return; + + g_assert (wd >= 0 && file); + file_list = g_list_remove (file_list, file); + if (file_list == NULL) + g_hash_table_remove (wd_file_hash, GINT_TO_POINTER (wd)); + else + g_hash_table_replace (wd_file_hash, GINT_TO_POINTER (wd), file_list); +} + + +static ip_watched_file_t * +ip_watched_file_new (const gchar *dirname, + const gchar *filename) +{ + ip_watched_file_t *file; + + file = g_new0 (ip_watched_file_t, 1); + file->path = g_strjoin ("/", dirname, filename, NULL); + file->filename = g_strdup (filename); + file->wd = -1; + + return file; +} + +static void +ip_watched_file_free (ip_watched_file_t *file) +{ + g_assert (file->subs == NULL); + g_free (file->filename); + g_free (file->path); +} + +static void +ip_watched_file_add_sub (ip_watched_file_t *file, + inotify_sub *sub) +{ + file->subs = g_list_prepend (file->subs, sub); +} + +static void +ip_watched_file_start (ip_watched_file_t *file) +{ + if (file->wd < 0) + { + gint err; + + file->wd = _ik_watch (file->path, + IP_INOTIFY_FILE_MASK, + &err); + + if (file->wd >= 0) + ip_map_wd_file (file->wd, file); + } +} + +static void +ip_watched_file_stop (ip_watched_file_t *file) +{ + if (file->wd >= 0) + { + _ik_ignore (file->path, file->wd); + ip_unmap_wd_file (file->wd, file); + file->wd = -1; + } +} + +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 == NULL) + { + IP_W ("Trying to add inotify watch "); + wd = _ik_watch (sub->dirname, IP_INOTIFY_DIR_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); + } + } + else + IP_W ("Already watching\n"); + + if (sub->hardlinks) + { + ip_watched_file_t *file; + + file = g_hash_table_lookup (dir->files_hash, sub->filename); + + if (file == NULL) + { + file = ip_watched_file_new (sub->dirname, sub->filename); + g_hash_table_insert (dir->files_hash, file->filename, file); + } + + ip_watched_file_add_sub (file, sub); + ip_watched_file_start (file); + } + + 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); + + if (sub->hardlinks) + { + ip_watched_file_t *file; + + file = g_hash_table_lookup (dir->files_hash, sub->filename); + file->subs = g_list_remove (file->subs, sub); + + if (file->subs == NULL) + { + g_hash_table_remove (dir->files_hash, sub->filename); + ip_watched_file_stop (file); + ip_watched_file_free (file); + } + } + } + +static void +ip_unmap_all_subs (ip_watched_dir_t *dir) +{ + while (dir->subs != NULL) + ip_unmap_sub_dir (dir->subs->data, dir); +} + +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->files_hash = g_hash_table_new (g_str_hash, g_str_equal); + dir->wd = wd; + + return dir; +} + +static void +ip_watched_dir_free (ip_watched_dir_t *dir) +{ + g_assert_cmpint (g_hash_table_size (dir->files_hash), ==, 0); + g_assert (dir->subs == NULL); + g_free (dir->path); + g_hash_table_unref (dir->files_hash); + 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, + GList *file_list, + GList *pair_file_list, + ik_event_t *event) +{ + GList *l; + + if (!event) + return; + + for (l = dir_list; l; l = l->next) + { + GList *subl; + ip_watched_dir_t *dir = l->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 + * deliver this event. + */ + if (sub->filename && !event->name) + continue; + + /* If we're also watching the file directly + * don't report events that will also be + * reported on the file itself. + */ + if (sub->hardlinks) + { + event->mask &= ~IP_INOTIFY_FILE_MASK; + if (!event->mask) + continue; + } + + /* FIXME: We might need to synthesize + * DELETE/UNMOUNT events when + * the filename doesn't match + */ + + event_callback (event, sub, FALSE); + + if (sub->hardlinks) + { + ip_watched_file_t *file; + + file = g_hash_table_lookup (dir->files_hash, sub->filename); + + if (file != NULL) + { + if (event->mask & (IN_MOVED_FROM | IN_DELETE)) + ip_watched_file_stop (file); + + if (event->mask & (IN_MOVED_TO | IN_CREATE)) + ip_watched_file_start (file); + } + } + } + } + + for (l = file_list; l; l = l->next) + { + ip_watched_file_t *file = l->data; + GList *subl; + + for (subl = file->subs; subl; subl = subl->next) + { + inotify_sub *sub = subl->data; + + event_callback (event, sub, TRUE); + } + } + + if (!event->pair) + return; + + for (l = pair_dir_list; l; l = l->next) + { + GList *subl; + ip_watched_dir_t *dir = l->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 + * deliver this event. + */ + if (sub->filename && !event->pair->name) + continue; + + /* If we're also watching the file directly + * don't report events that will also be + * reported on the file itself. + */ + if (sub->hardlinks) + { + event->mask &= ~IP_INOTIFY_FILE_MASK; + if (!event->mask) + continue; + } + + /* FIXME: We might need to synthesize + * DELETE/UNMOUNT events when + * the filename doesn't match + */ + + event_callback (event->pair, sub, FALSE); + + if (sub->hardlinks) + { + ip_watched_file_t *file; + + file = g_hash_table_lookup (dir->files_hash, sub->filename); + + if (file != NULL) + { + if (event->pair->mask & (IN_MOVED_FROM | IN_DELETE)) + ip_watched_file_stop (file); + + if (event->pair->mask & (IN_MOVED_TO | IN_CREATE)) + ip_watched_file_start (file); + } + } + } + } + + for (l = pair_file_list; l; l = l->next) + { + ip_watched_file_t *file = l->data; + GList *subl; + + for (subl = file->subs; subl; subl = subl->next) + { + inotify_sub *sub = subl->data; + + event_callback (event->pair, sub, TRUE); + } + } +} + +static void +ip_event_callback (ik_event_t *event) +{ + GList* dir_list = NULL; + GList* pair_dir_list = NULL; + GList *file_list = NULL; + GList *pair_file_list = NULL; + + /* We can ignore the IGNORED events */ + if (event->mask & IN_IGNORED) + { + _ik_event_free (event); + return; + } + + dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (event->wd)); + file_list = g_hash_table_lookup (wd_file_hash, GINT_TO_POINTER (event->wd)); + + if (event->pair) + { + pair_dir_list = g_hash_table_lookup (wd_dir_hash, GINT_TO_POINTER (event->pair->wd)); + pair_file_list = g_hash_table_lookup (wd_file_hash, GINT_TO_POINTER (event->pair->wd)); + } + + if (event->mask & IP_INOTIFY_DIR_MASK) + ip_event_dispatch (dir_list, pair_dir_list, file_list, pair_file_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..0027260 --- /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 file_event)); +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..a4edc99 --- /dev/null +++ b/gio/inotify/inotify-sub.c @@ -0,0 +1,74 @@ +/* -*- 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, + gboolean watch_hardlinks, + 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->hardlinks = watch_hardlinks; + 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..8c9593a --- /dev/null +++ b/gio/inotify/inotify-sub.h @@ -0,0 +1,44 @@ +/* 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; + gboolean hardlinks; +} inotify_sub; + +inotify_sub *_ih_sub_new (const gchar *dirname, + const gchar *filename, + gboolean pair_moves, + gboolean watch_hardlinks, + gpointer user_data); +void _ih_sub_free (inotify_sub *sub); + +#endif /* __INOTIFY_SUB_H */ diff --git a/gio/kqueue/Makefile.am b/gio/kqueue/Makefile.am new file mode 100644 index 0000000..652c43e --- /dev/null +++ b/gio/kqueue/Makefile.am @@ -0,0 +1,35 @@ +include $(top_srcdir)/Makefile.decl + +NULL = + +noinst_LTLIBRARIES = libkqueue.la + +libkqueue_la_SOURCES = \ + gkqueuefilemonitor.c \ + gkqueuefilemonitor.h \ + gkqueuedirectorymonitor.c \ + gkqueuedirectorymonitor.h \ + kqueue-helper.c \ + kqueue-helper.h \ + kqueue-thread.c \ + kqueue-thread.h \ + kqueue-sub.c \ + kqueue-sub.h \ + kqueue-missing.c \ + kqueue-missing.h \ + kqueue-utils.c \ + kqueue-utils.h \ + kqueue-exclusions.c \ + kqueue-exclusions.h \ + dep-list.c \ + dep-list.h \ + $(NULL) + +libkqueue_la_CFLAGS = \ + $(GLIB_HIDDEN_VISIBILITY_CFLAGS) \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED diff --git a/gio/kqueue/dep-list.c b/gio/kqueue/dep-list.c new file mode 100644 index 0000000..092036f --- /dev/null +++ b/gio/kqueue/dep-list.c @@ -0,0 +1,521 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include + +#include /* calloc */ +#include /* printf */ +#include /* opendir, readdir, closedir */ +#include /* strcmp */ +#include + +#include "dep-list.h" + +static gboolean kdl_debug_enabled = FALSE; +#define perror_msg if (kdl_debug_enabled) g_warning + + +/** + * Print a list to stdout. + * + * @param[in] dl A pointer to a list. + **/ +void +dl_print (const dep_list *dl) +{ + while (dl != NULL) { + printf ("%lld:%s ", (long long int) dl->inode, dl->path); + dl = dl->next; + } + printf ("\n"); +} + +/** + * Create a new list item. + * + * Create a new list item and initialize its fields. + * + * @param[in] path A name of a file (the string is not copied!). + * @param[in] inode A file's inode number. + * @return A pointer to a new item or NULL in the case of error. + **/ +dep_list* dl_create (char *path, ino_t inode) +{ + dep_list *dl = calloc (1, sizeof (dep_list)); + if (dl == NULL) { + perror_msg ("Failed to create a new dep-list item"); + return NULL; + } + + dl->path = path; + dl->inode = inode; + return dl; +} + +/** + * Create a shallow copy of a list. + * + * A shallow copy is a copy of a structure, but not the copy of the + * contents. All data pointers (`path' in our case) of a list and its + * shallow copy will point to the same memory. + * + * @param[in] dl A pointer to list to make a copy. May be NULL. + * @return A shallow copy of the list. + **/ +dep_list* +dl_shallow_copy (const dep_list *dl) +{ + if (dl == NULL) { + return NULL; + } + + dep_list *head = calloc (1, sizeof (dep_list)); + if (head == NULL) { + perror_msg ("Failed to allocate head during shallow copy"); + return NULL; + } + + dep_list *cp = head; + const dep_list *it = dl; + + while (it != NULL) { + cp->path = it->path; + cp->inode = it->inode; + if (it->next) { + cp->next = calloc (1, sizeof (dep_list)); + if (cp->next == NULL) { + perror_msg ("Failed to allocate a new element during shallow copy"); + dl_shallow_free (head); + return NULL; + } + cp = cp->next; + } + it = it->next; + } + + return head; +} + +/** + * Free the memory allocated for shallow copy. + * + * This function will free the memory used by a list structure, but + * the list data will remain in the heap. + * + * @param[in] dl A pointer to a list. May be NULL. + **/ +void +dl_shallow_free (dep_list *dl) +{ + while (dl != NULL) { + dep_list *ptr = dl; + dl = dl->next; + free (ptr); + } +} + +/** + * Free the memory allocated for a list. + * + * This function will free all the memory used by a list: both + * list structure and the list data. + * + * @param[in] dl A pointer to a list. May be NULL. + **/ +void +dl_free (dep_list *dl) +{ + while (dl != NULL) { + dep_list *ptr = dl; + dl = dl->next; + + free (ptr->path); + free (ptr); + } +} + +/** + * Create a directory listing and return it as a list. + * + * @param[in] path A path to a directory. + * @return A pointer to a list. May return NULL, check errno in this case. + **/ +dep_list* +dl_listing (const char *path) +{ + assert (path != NULL); + + dep_list *head = NULL; + dep_list *prev = NULL; + DIR *dir = opendir (path); + if (dir != NULL) { + struct dirent *ent; + + while ((ent = readdir (dir)) != NULL) { + if (!strcmp (ent->d_name, ".") || !strcmp (ent->d_name, "..")) { + continue; + } + + if (head == NULL) { + head = calloc (1, sizeof (dep_list)); + if (head == NULL) { + perror_msg ("Failed to allocate head during listing"); + goto error; + } + } + + dep_list *iter = (prev == NULL) ? head : calloc (1, sizeof (dep_list)); + if (iter == NULL) { + perror_msg ("Failed to allocate a new element during listing"); + goto error; + } + + iter->path = strdup (ent->d_name); + if (iter->path == NULL) { + perror_msg ("Failed to copy a string during listing"); + goto error; + } + + iter->inode = ent->d_ino; + iter->next = NULL; + if (prev) { + prev->next = iter; + } + prev = iter; + } + + closedir (dir); + } + return head; + +error: + if (dir != NULL) { + closedir (dir); + } + dl_free (head); + return NULL; +} + +/** + * Perform a diff on lists. + * + * This function performs something like a set intersection. The same items + * will be removed from the both lists. Items are comapred by a filename. + * + * @param[in,out] before A pointer to a pointer to a list. Will contain items + * which were not found in the `after' list. + * @param[in,out] after A pointer to a pointer to a list. Will containt items + * which were not found in the `before' list. + **/ +void +dl_diff (dep_list **before, dep_list **after) +{ + assert (before != NULL); + assert (after != NULL); + + if (*before == NULL || *after == NULL) { + return; + } + + dep_list *before_iter = *before; + dep_list *before_prev = NULL; + + while (before_iter != NULL) { + dep_list *after_iter = *after; + dep_list *after_prev = NULL; + + int matched = 0; + while (after_iter != NULL) { + if (strcmp (before_iter->path, after_iter->path) == 0) { + matched = 1; + /* removing the entry from the both lists */ + if (before_prev) { + before_prev->next = before_iter->next; + } else { + *before = before_iter->next; + } + + if (after_prev) { + after_prev->next = after_iter->next; + } else { + *after = after_iter->next; + } + free (after_iter); + break; + } + after_prev = after_iter; + after_iter = after_iter->next; + } + + dep_list *oldptr = before_iter; + before_iter = before_iter->next; + if (matched == 0) { + before_prev = oldptr; + } else { + free (oldptr); + } + } +} + + +/** + * Traverses two lists. Compares items with a supplied expression + * and performs the passed code on a match. Removes the matched entries + * from the both lists. + **/ +#define EXCLUDE_SIMILAR(removed_list, added_list, match_expr, matched_code) \ + assert (removed_list != NULL); \ + assert (added_list != NULL); \ + \ + dep_list *removed_list##_iter = *removed_list; \ + dep_list *removed_list##_prev = NULL; \ + \ + int productive = 0; \ + \ + while (removed_list##_iter != NULL) { \ + dep_list *added_list##_iter = *added_list; \ + dep_list *added_list##_prev = NULL; \ + \ + int matched = 0; \ + while (added_list##_iter != NULL) { \ + if (match_expr) { \ + matched = 1; \ + ++productive; \ + matched_code; \ + \ + if (removed_list##_prev) { \ + removed_list##_prev->next = removed_list##_iter->next; \ + } else { \ + *removed_list = removed_list##_iter->next; \ + } \ + if (added_list##_prev) { \ + added_list##_prev->next = added_list##_iter->next; \ + } else { \ + *added_list = added_list##_iter->next; \ + } \ + free (added_list##_iter); \ + break; \ + } \ + added_list##_iter = added_list##_iter->next; \ + } \ + dep_list *oldptr = removed_list##_iter; \ + removed_list##_iter = removed_list##_iter->next; \ + if (matched == 0) { \ + removed_list##_prev = oldptr; \ + } else { \ + free (oldptr); \ + } \ + } \ + return (productive > 0); + + +#define cb_invoke(cbs, name, udata, ...) \ + do { \ + if (cbs->name) { \ + (cbs->name) (udata, ## __VA_ARGS__); \ + } \ + } while (0) + +/** + * Detect and notify about moves in the watched directory. + * + * A move is what happens when you rename a file in a directory, and + * a new name is unique, i.e. you didnt overwrite any existing files + * with this one. + * + * @param[in,out] removed A list of the removed files in the directory. + * @param[in,out] added A list of the added files of the directory. + * @param[in] cbs A pointer to #traverse_cbs, an user-defined set of + * traverse callbacks. + * @param[in] udata A pointer to the user-defined data. + * @return 0 if no files were renamed, >0 otherwise. +**/ +static int +dl_detect_moves (dep_list **removed, + dep_list **added, + const traverse_cbs *cbs, + void *udata) +{ + assert (cbs != NULL); + + EXCLUDE_SIMILAR + (removed, added, + (removed_iter->inode == added_iter->inode), + { + cb_invoke (cbs, moved, udata, + removed_iter->path, removed_iter->inode, + added_iter->path, added_iter->inode); + }); +} + +/** + * Detect and notify about replacements in the watched directory. + * + * Consider you are watching a directory foo with the folloing files + * insinde: + * + * foo/bar + * foo/baz + * + * A replacement in a watched directory is what happens when you invoke + * + * mv /foo/bar /foo/bar + * + * i.e. when you replace a file in a watched directory with another file + * from the same directory. + * + * @param[in,out] removed A list of the removed files in the directory. + * @param[in,out] current A list with the current contents of the directory. + * @param[in] cbs A pointer to #traverse_cbs, an user-defined set of + * traverse callbacks. + * @param[in] udata A pointer to the user-defined data. + * @return 0 if no files were renamed, >0 otherwise. + **/ +static int +dl_detect_replacements (dep_list **removed, + dep_list **current, + const traverse_cbs *cbs, + void *udata) +{ + assert (cbs != NULL); + + EXCLUDE_SIMILAR + (removed, current, + (removed_iter->inode == current_iter->inode), + { + cb_invoke (cbs, replaced, udata, + removed_iter->path, removed_iter->inode, + current_iter->path, current_iter->inode); + }); +} + +/** + * Detect and notify about overwrites in the watched directory. + * + * Consider you are watching a directory foo with a file inside: + * + * foo/bar + * + * And you also have a directory tmp with a file 1: + * + * tmp/1 + * + * You do not watching directory tmp. + * + * An overwrite in a watched directory is what happens when you invoke + * + * mv /tmp/1 /foo/bar + * + * i.e. when you overwrite a file in a watched directory with another file + * from the another directory. + * + * @param[in,out] previous A list with the previous contents of the directory. + * @param[in,out] current A list with the current contents of the directory. + * @param[in] cbs A pointer to #traverse_cbs, an user-defined set of + * traverse callbacks. + * @param[in] udata A pointer to the user-defined data. + * @return 0 if no files were renamed, >0 otherwise. + **/ +static int +dl_detect_overwrites (dep_list **previous, + dep_list **current, + const traverse_cbs *cbs, + void *udata) +{ + assert (cbs != NULL); + + EXCLUDE_SIMILAR + (previous, current, + (strcmp (previous_iter->path, current_iter->path) == 0 + && previous_iter->inode != current_iter->inode), + { + cb_invoke (cbs, overwritten, udata, current_iter->path, current_iter->inode); + }); +} + + +/** + * Traverse a list and invoke a callback for each item. + * + * @param[in] list A #dep_list. + * @param[in] cb A #single_entry_cb callback function. + * @param[in] udata A pointer to the user-defined data. + **/ +static void +dl_emit_single_cb_on (dep_list *list, + single_entry_cb cb, + void *udata) +{ + while (cb && list != NULL) { + (cb) (udata, list->path, list->inode); + list = list->next; + } +} + + +/** + * Recognize all the changes in the directory, invoke the appropriate callbacks. + * + * This is the core function of directory diffing submodule. + * + * @param[in] before The previous contents of the directory. + * @param[in] after The current contents of the directory. + * @param[in] cbs A pointer to user callbacks (#traverse_callbacks). + * @param[in] udata A pointer to user data. + **/ +void +dl_calculate (dep_list *before, + dep_list *after, + const traverse_cbs *cbs, + void *udata) +{ + assert (cbs != NULL); + + int need_update = 0; + + dep_list *was = dl_shallow_copy (before); + dep_list *pre = dl_shallow_copy (before); + dep_list *now = dl_shallow_copy (after); + dep_list *lst = dl_shallow_copy (after); + + dl_diff (&was, &now); + + need_update += dl_detect_moves (&was, &now, cbs, udata); + need_update += dl_detect_replacements (&was, &lst, cbs, udata); + dl_detect_overwrites (&pre, &lst, cbs, udata); + + if (need_update) { + cb_invoke (cbs, names_updated, udata); + } + + dl_emit_single_cb_on (was, cbs->removed, udata); + dl_emit_single_cb_on (now, cbs->added, udata); + + cb_invoke (cbs, many_added, udata, now); + cb_invoke (cbs, many_removed, udata, was); + + dl_shallow_free (lst); + dl_shallow_free (now); + dl_shallow_free (pre); + dl_shallow_free (was); +} + diff --git a/gio/kqueue/dep-list.h b/gio/kqueue/dep-list.h new file mode 100644 index 0000000..b12802d --- /dev/null +++ b/gio/kqueue/dep-list.h @@ -0,0 +1,69 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __DEP_LIST_H__ +#define __DEP_LIST_H__ + +#include /* ino_t */ + +typedef struct dep_list { + struct dep_list *next; + + char *path; + ino_t inode; +} dep_list; + +typedef void (* no_entry_cb) (void *udata); +typedef void (* single_entry_cb) (void *udata, const char *path, ino_t inode); +typedef void (* dual_entry_cb) (void *udata, + const char *from_path, ino_t from_inode, + const char *to_path, ino_t to_inode); +typedef void (* list_cb) (void *udata, const dep_list *list); + + +typedef struct traverse_cbs { + single_entry_cb added; + single_entry_cb removed; + dual_entry_cb replaced; + single_entry_cb overwritten; + dual_entry_cb moved; + list_cb many_added; + list_cb many_removed; + no_entry_cb names_updated; +} traverse_cbs; + +dep_list* dl_create (char *path, ino_t inode); +void dl_print (const dep_list *dl); +dep_list* dl_shallow_copy (const dep_list *dl); +void dl_shallow_free (dep_list *dl); +void dl_free (dep_list *dl); +dep_list* dl_listing (const char *path); +void dl_diff (dep_list **before, dep_list **after); + +void +dl_calculate (dep_list *before, + dep_list *after, + const traverse_cbs *cbs, + void *udata); + + +#endif /* __DEP_LIST_H__ */ diff --git a/gio/kqueue/gkqueuedirectorymonitor.c b/gio/kqueue/gkqueuedirectorymonitor.c new file mode 100644 index 0000000..ee0cf3a --- /dev/null +++ b/gio/kqueue/gkqueuedirectorymonitor.c @@ -0,0 +1,205 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include "config.h" + +#include "gkqueuedirectorymonitor.h" +#include "kqueue-helper.h" +#include "kqueue-exclusions.h" +#include +#include +#include + + +struct _GKqueueDirectoryMonitor +{ + GLocalDirectoryMonitor parent_instance; + kqueue_sub *sub; + + GFileMonitor *fallback; + GFile *fbfile; + + gboolean pair_moves; +}; + +static gboolean g_kqueue_directory_monitor_cancel (GFileMonitor *monitor); + +#define g_kqueue_directory_monitor_get_type _g_kqueue_directory_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GKqueueDirectoryMonitor, g_kqueue_directory_monitor, G_TYPE_LOCAL_DIRECTORY_MONITOR, + g_io_extension_point_implement (G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "kqueue", + 20)) + + +static void +_fallback_callback (GFileMonitor *unused, + GFile *first, + GFile *second, + GFileMonitorEvent event, + gpointer udata) +{ + GKqueueDirectoryMonitor *kq_mon = G_KQUEUE_DIRECTORY_MONITOR (udata); + GFileMonitor *mon = G_FILE_MONITOR (kq_mon); + g_assert (kq_mon != NULL); + g_assert (mon != NULL); + (void) unused; + + if (event == G_FILE_MONITOR_EVENT_CHANGED) + { + _kh_dir_diff (kq_mon->sub, mon); + } + else + g_file_monitor_emit_event (mon, first, second, event); +} + + +static void +g_kqueue_directory_monitor_finalize (GObject *object) +{ + GKqueueDirectoryMonitor *kqueue_monitor = G_KQUEUE_DIRECTORY_MONITOR (object); + + if (kqueue_monitor->sub) + { + _kh_cancel_sub (kqueue_monitor->sub); + _kh_sub_free (kqueue_monitor->sub); + kqueue_monitor->sub = NULL; + } + + if (kqueue_monitor->fallback) + g_object_unref (kqueue_monitor->fallback); + + if (kqueue_monitor->fbfile) + g_object_unref (kqueue_monitor->fbfile); + + if (G_OBJECT_CLASS (g_kqueue_directory_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_kqueue_directory_monitor_parent_class)->finalize) (object); +} + +static GObject* +g_kqueue_directory_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GKqueueDirectoryMonitorClass *klass; + GObjectClass *parent_class; + GKqueueDirectoryMonitor *kqueue_monitor; + kqueue_sub *sub = NULL; + gboolean ret_kh_startup; + const gchar *path = NULL; + + klass = G_KQUEUE_DIRECTORY_MONITOR_CLASS (g_type_class_peek (G_TYPE_KQUEUE_DIRECTORY_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + kqueue_monitor = G_KQUEUE_DIRECTORY_MONITOR (obj); + + ret_kh_startup = _kh_startup (); + g_assert (ret_kh_startup); + + kqueue_monitor->pair_moves = (G_LOCAL_DIRECTORY_MONITOR (obj)->flags & G_FILE_MONITOR_SEND_MOVED) + ? TRUE : FALSE; + + kqueue_monitor->sub = NULL; + kqueue_monitor->fallback = NULL; + kqueue_monitor->fbfile = NULL; + + path = G_LOCAL_DIRECTORY_MONITOR (obj)->dirname; + + /* For a directory monitor, create a subscription object anyway. + * It will be used for directory diff calculation routines. */ + + sub = _kh_sub_new (path, + kqueue_monitor->pair_moves, + kqueue_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 (same issue as in + * the inotify backend) */ + g_assert (sub != NULL); + kqueue_monitor->sub = sub; + + if (!_ke_is_excluded (path)) + _kh_add_sub (sub); + else + { + GFile *file = g_file_new_for_path (path); + kqueue_monitor->fbfile = file; + kqueue_monitor->fallback = _g_poll_file_monitor_new (file); + g_signal_connect (kqueue_monitor->fallback, + "changed", + G_CALLBACK (_fallback_callback), + kqueue_monitor); + } + + return obj; +} + +static gboolean +g_kqueue_directory_monitor_is_supported (void) +{ + return _kh_startup (); +} + +static void +g_kqueue_directory_monitor_class_init (GKqueueDirectoryMonitorClass *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_kqueue_directory_monitor_finalize; + gobject_class->constructor = g_kqueue_directory_monitor_constructor; + directory_monitor_class->cancel = g_kqueue_directory_monitor_cancel; + + local_directory_monitor_class->mount_notify = TRUE; /* TODO: ??? */ + local_directory_monitor_class->is_supported = g_kqueue_directory_monitor_is_supported; +} + +static void +g_kqueue_directory_monitor_init (GKqueueDirectoryMonitor *monitor) +{ +} + +static gboolean +g_kqueue_directory_monitor_cancel (GFileMonitor *monitor) +{ + GKqueueDirectoryMonitor *kqueue_monitor = G_KQUEUE_DIRECTORY_MONITOR (monitor); + + if (kqueue_monitor->sub) + { + _kh_cancel_sub (kqueue_monitor->sub); + _kh_sub_free (kqueue_monitor->sub); + kqueue_monitor->sub = NULL; + } + else if (kqueue_monitor->fallback) + g_file_monitor_cancel (kqueue_monitor->fallback); + + + if (G_FILE_MONITOR_CLASS (g_kqueue_directory_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_kqueue_directory_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} diff --git a/gio/kqueue/gkqueuedirectorymonitor.h b/gio/kqueue/gkqueuedirectorymonitor.h new file mode 100644 index 0000000..7bd6a64 --- /dev/null +++ b/gio/kqueue/gkqueuedirectorymonitor.h @@ -0,0 +1,49 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __G_KQUEUE_DIRECTORY_MONITOR_H__ +#define __G_KQUEUE_DIRECTORY_MONITOR_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_KQUEUE_DIRECTORY_MONITOR (_g_kqueue_directory_monitor_get_type ()) +#define G_KQUEUE_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_KQUEUE_DIRECTORY_MONITOR, GKqueueDirectoryMonitor)) +#define G_KQUEUE_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_KQUEUE_DIRECTORY_MONITOR, GKqueueDirectoryMonitorClass)) +#define G_IS_KQUEUE_DIRECTORY_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_KQUEUE_DIRECTORY_MONITOR)) +#define G_IS_KQUEUE_DIRECTORY_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_KQUEUE_DIRECTORY_MONITOR)) + +typedef struct _GKqueueDirectoryMonitor GKqueueDirectoryMonitor; +typedef struct _GKqueueDirectoryMonitorClass GKqueueDirectoryMonitorClass; + +struct _GKqueueDirectoryMonitorClass { + GLocalDirectoryMonitorClass parent_class; +}; + +GType _g_kqueue_directory_monitor_get_type (void); + +G_END_DECLS + +#endif /* __G_KQUEUE_DIRECTORY_MONITOR_H__ */ diff --git a/gio/kqueue/gkqueuefilemonitor.c b/gio/kqueue/gkqueuefilemonitor.c new file mode 100644 index 0000000..d2d51a9 --- /dev/null +++ b/gio/kqueue/gkqueuefilemonitor.c @@ -0,0 +1,209 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include "config.h" + +#include "gkqueuefilemonitor.h" +#include "kqueue-helper.h" +#include "kqueue-exclusions.h" +#include +#include +#include + + +struct _GKqueueFileMonitor +{ + GLocalFileMonitor parent_instance; + + kqueue_sub *sub; + + GFileMonitor *fallback; + GFile *fbfile; + + gboolean pair_moves; +}; + +static gboolean g_kqueue_file_monitor_cancel (GFileMonitor* monitor); + +#define g_kqueue_file_monitor_get_type _g_kqueue_file_monitor_get_type +G_DEFINE_TYPE_WITH_CODE (GKqueueFileMonitor, g_kqueue_file_monitor, G_TYPE_LOCAL_FILE_MONITOR, + g_io_extension_point_implement (G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME, + g_define_type_id, + "kqueue", + 20)) + + +static void +_fallback_callback (GFileMonitor *unused, + GFile *first, + GFile *second, + GFileMonitorEvent event, + gpointer udata) +{ + GKqueueFileMonitor *kq_mon = G_KQUEUE_FILE_MONITOR (udata); + GFileMonitor *mon = G_FILE_MONITOR (kq_mon); + g_assert (kq_mon != NULL); + g_assert (mon != NULL); + (void) unused; + + if (event == G_FILE_MONITOR_EVENT_CHANGED) + { + _kh_dir_diff (kq_mon->sub, mon); + } + else + g_file_monitor_emit_event (mon, first, second, event); +} + + +static void +g_kqueue_file_monitor_finalize (GObject *object) +{ + GKqueueFileMonitor *kqueue_monitor = G_KQUEUE_FILE_MONITOR (object); + + if (kqueue_monitor->sub) + { + _kh_cancel_sub (kqueue_monitor->sub); + _kh_sub_free (kqueue_monitor->sub); + kqueue_monitor->sub = NULL; + } + + if (kqueue_monitor->fallback) + g_object_unref (kqueue_monitor->fallback); + + if (kqueue_monitor->fbfile) + g_object_unref (kqueue_monitor->fbfile); + + if (G_OBJECT_CLASS (g_kqueue_file_monitor_parent_class)->finalize) + (*G_OBJECT_CLASS (g_kqueue_file_monitor_parent_class)->finalize) (object); +} + +static GObject* +g_kqueue_file_monitor_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_properties) +{ + GObject *obj; + GKqueueFileMonitorClass *klass; + GObjectClass *parent_class; + GKqueueFileMonitor *kqueue_monitor; + kqueue_sub *sub = NULL; + gboolean ret_kh_startup = FALSE; + const gchar *path = NULL; + + klass = G_KQUEUE_FILE_MONITOR_CLASS (g_type_class_peek (G_TYPE_KQUEUE_FILE_MONITOR)); + parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass)); + obj = parent_class->constructor (type, + n_construct_properties, + construct_properties); + + kqueue_monitor = G_KQUEUE_FILE_MONITOR (obj); + + ret_kh_startup = _kh_startup (); + g_assert (ret_kh_startup); + + kqueue_monitor->pair_moves = G_LOCAL_FILE_MONITOR (obj)->flags & G_FILE_MONITOR_SEND_MOVED + ? TRUE : FALSE; + + kqueue_monitor->sub = NULL; + kqueue_monitor->fallback = NULL; + kqueue_monitor->fbfile = NULL; + + path = G_LOCAL_FILE_MONITOR (obj)->filename; + + /* For a directory monitor, create a subscription object anyway. + * It will be used for directory diff calculation routines. + * Wait, directory diff in a GKqueueFileMonitor? + * Yes, it is. When a file monitor is started on an non-existent + * file, GIO uses a GKqueueFileMonitor object for that. If a directory + * will be created under that path, GKqueueFileMonitor will have to + * handle the directory notifications. */ + + sub = _kh_sub_new (path, + kqueue_monitor->pair_moves, + kqueue_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 (same issue as in + * the inotify backend) */ + g_assert (sub != NULL); + kqueue_monitor->sub = sub; + + if (!_ke_is_excluded (path)) + _kh_add_sub (sub); + else + { + GFile *file = g_file_new_for_path (path); + kqueue_monitor->fbfile = file; + kqueue_monitor->fallback = _g_poll_file_monitor_new (file); + g_signal_connect (kqueue_monitor->fallback, + "changed", + G_CALLBACK (_fallback_callback), + kqueue_monitor); + } + + return obj; +} + +static gboolean +g_kqueue_file_monitor_is_supported (void) +{ + return _kh_startup (); +} + +static void +g_kqueue_file_monitor_class_init (GKqueueFileMonitorClass *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_kqueue_file_monitor_finalize; + gobject_class->constructor = g_kqueue_file_monitor_constructor; + file_monitor_class->cancel = g_kqueue_file_monitor_cancel; + + local_file_monitor_class->is_supported = g_kqueue_file_monitor_is_supported; +} + +static void +g_kqueue_file_monitor_init (GKqueueFileMonitor *monitor) +{ +} + +static gboolean +g_kqueue_file_monitor_cancel (GFileMonitor *monitor) +{ + GKqueueFileMonitor *kqueue_monitor = G_KQUEUE_FILE_MONITOR (monitor); + + if (kqueue_monitor->sub) + { + _kh_cancel_sub (kqueue_monitor->sub); + _kh_sub_free (kqueue_monitor->sub); + kqueue_monitor->sub = NULL; + } + else if (kqueue_monitor->fallback) + g_file_monitor_cancel (kqueue_monitor->fallback); + + if (G_FILE_MONITOR_CLASS (g_kqueue_file_monitor_parent_class)->cancel) + (*G_FILE_MONITOR_CLASS (g_kqueue_file_monitor_parent_class)->cancel) (monitor); + + return TRUE; +} diff --git a/gio/kqueue/gkqueuefilemonitor.h b/gio/kqueue/gkqueuefilemonitor.h new file mode 100644 index 0000000..3c47377 --- /dev/null +++ b/gio/kqueue/gkqueuefilemonitor.h @@ -0,0 +1,51 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __G_KQUEUE_FILE_MONITOR_H__ +#define __G_KQUEUE_FILE_MONITOR_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_KQUEUE_FILE_MONITOR (_g_kqueue_file_monitor_get_type ()) +#define G_KQUEUE_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_KQUEUE_FILE_MONITOR, GKqueueFileMonitor)) +#define G_KQUEUE_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), G_TYPE_KQUEUE_FILE_MONITOR, GKqueueFileMonitorClass)) +#define G_IS_KQUEUE_FILE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_KQUEUE_FILE_MONITOR)) +#define G_IS_KQUEUE_FILE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_KQUEUE_FILE_MONITOR)) + +typedef struct _GKqueueFileMonitor GKqueueFileMonitor; +typedef struct _GKqueueFileMonitorClass GKqueueFileMonitorClass; + +struct _GKqueueFileMonitorClass { + GLocalFileMonitorClass parent_class; +}; + +GType _g_kqueue_file_monitor_get_type (void); + +G_END_DECLS + +#endif /* __G_KQUEUE_FILE_MONITOR_H__ */ diff --git a/gio/kqueue/kqueue-exclusions.c b/gio/kqueue/kqueue-exclusions.c new file mode 100644 index 0000000..6be0e73 --- /dev/null +++ b/gio/kqueue/kqueue-exclusions.c @@ -0,0 +1,65 @@ +/******************************************************************************* + Copyright (c) 2012 Dmitry Matveev + Copyright (c) 2012 Antoine Jacoutot + + 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. +*******************************************************************************/ + +#include +#include +#include +#include "kqueue-exclusions.h" + +static gboolean ke_debug_enabled = FALSE; +#define KE_W if (ke_debug_enabled) g_warning + +/** + * _ke_is_excluded: + * @full_path - a path to file to check. + * + * Returns: TRUE if the file should be excluded from the kqueue-powered + * monitoring, FALSE otherwise. + **/ +gboolean +_ke_is_excluded (const char *full_path) +{ +#if defined (O_EVTONLY) + return FALSE; +#else + GFile *f = NULL; + GMount *mount = NULL; + + f = g_file_new_for_path (full_path); + + if (f != NULL) { + mount = g_file_find_enclosing_mount (f, NULL, NULL); + g_object_unref (f); + } + + if ((mount != NULL && (g_mount_can_unmount (mount))) || g_str_has_prefix (full_path, "/mnt/")) + { + KE_W ("Excluding %s from kernel notification, falling back to poll", full_path); + if (mount) + g_object_unref (mount); + return TRUE; + } + else + return FALSE; +#endif +} diff --git a/gio/kqueue/kqueue-exclusions.h b/gio/kqueue/kqueue-exclusions.h new file mode 100644 index 0000000..f1dad0e --- /dev/null +++ b/gio/kqueue/kqueue-exclusions.h @@ -0,0 +1,28 @@ +/******************************************************************************* + Copyright (c) 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __KQUEUE_EXCLUSIONS_H +#define __KQUEUE_EXCLUSIONS_H + +gboolean _ke_is_excluded (const char *full_path); + +#endif /* __KQUEUE_EXCLUDES_H */ diff --git a/gio/kqueue/kqueue-helper.c b/gio/kqueue/kqueue-helper.c new file mode 100644 index 0000000..1a95b83 --- /dev/null +++ b/gio/kqueue/kqueue-helper.c @@ -0,0 +1,646 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "kqueue-helper.h" +#include "kqueue-utils.h" +#include "kqueue-thread.h" +#include "kqueue-missing.h" +#include "kqueue-exclusions.h" + +#include "gkqueuedirectorymonitor.h" + +static gboolean kh_debug_enabled = FALSE; +#define KH_W if (kh_debug_enabled) g_warning + +static GHashTable *subs_hash_table = NULL; +G_LOCK_DEFINE_STATIC (hash_lock); + +static int kqueue_descriptor = -1; +static int kqueue_socket_pair[] = {-1, -1}; +static pthread_t kqueue_thread; + + +void _kh_file_appeared_cb (kqueue_sub *sub); + +/** + * accessor function for kqueue_descriptor + **/ +int +get_kqueue_descriptor() +{ + return kqueue_descriptor; +} + +/** + * convert_kqueue_events_to_gio: + * @flags: a set of kqueue filter flags + * @done: a pointer to #gboolean indicating that the + * conversion has been done (out) + * + * Translates kqueue filter flags into GIO event flags. + * + * Returns: a #GFileMonitorEvent + **/ +static GFileMonitorEvent +convert_kqueue_events_to_gio (uint32_t flags, gboolean *done) +{ + g_assert (done != NULL); + *done = FALSE; + + /* TODO: The following notifications should be emulated, if possible: + * - G_FILE_MONITOR_EVENT_PRE_UNMOUNT + */ + if (flags & NOTE_DELETE) + { + *done = TRUE; + return G_FILE_MONITOR_EVENT_DELETED; + } + if (flags & NOTE_ATTRIB) + { + *done = TRUE; + return G_FILE_MONITOR_EVENT_ATTRIBUTE_CHANGED; + } + if (flags & (NOTE_WRITE | NOTE_EXTEND)) + { + *done = TRUE; + return G_FILE_MONITOR_EVENT_CHANGED; + } + if (flags & NOTE_RENAME) + { + *done = TRUE; + return G_FILE_MONITOR_EVENT_MOVED; + } + if (flags & NOTE_REVOKE) + { + *done = TRUE; + return G_FILE_MONITOR_EVENT_UNMOUNTED; + } + + /* done is FALSE */ + return 0; +} + +typedef struct { + kqueue_sub *sub; + GFileMonitor *monitor; +} handle_ctx; + +/** + * handle_created: + * @udata: a pointer to user data (#handle_context). + * @path: file name of a new file. + * @inode: inode number of a new file. + * + * A callback function for the directory diff calculation routine, + * produces G_FILE_MONITOR_EVENT_CREATED event for a created file. + **/ +static void +handle_created (void *udata, const char *path, ino_t inode) +{ + handle_ctx *ctx = NULL; + GFile *file = NULL; + gchar *fpath = NULL; + + (void) inode; + ctx = (handle_ctx *) udata; + g_assert (udata != NULL); + g_assert (ctx->sub != NULL); + g_assert (ctx->monitor != NULL); + + fpath = _ku_path_concat (ctx->sub->filename, path); + if (fpath == NULL) + { + KH_W ("Failed to allocate a string for a new event"); + return; + } + + file = g_file_new_for_path (fpath); + g_file_monitor_emit_event (ctx->monitor, + file, + NULL, + G_FILE_MONITOR_EVENT_CREATED); + g_free (fpath); + g_object_unref (file); +} + +/** + * handle_deleted: + * @udata: a pointer to user data (#handle_context). + * @path: file name of the removed file. + * @inode: inode number of the removed file. + * + * A callback function for the directory diff calculation routine, + * produces G_FILE_MONITOR_EVENT_DELETED event for a deleted file. + **/ +static void +handle_deleted (void *udata, const char *path, ino_t inode) +{ + handle_ctx *ctx = NULL; + GFile *file = NULL; + gchar *fpath = NULL; + + (void) inode; + ctx = (handle_ctx *) udata; + g_assert (udata != NULL); + g_assert (ctx->sub != NULL); + g_assert (ctx->monitor != NULL); + + fpath = _ku_path_concat (ctx->sub->filename, path); + if (fpath == NULL) + { + KH_W ("Failed to allocate a string for a new event"); + return; + } + + file = g_file_new_for_path (fpath); + g_file_monitor_emit_event (ctx->monitor, + file, + NULL, + G_FILE_MONITOR_EVENT_DELETED); + g_free (fpath); + g_object_unref (file); +} + +/** + * handle_moved: + * @udata: a pointer to user data (#handle_context). + * @from_path: file name of the source file. + * @from_inode: inode number of the source file. + * @to_path: file name of the replaced file. + * @to_inode: inode number of the replaced file. + * + * A callback function for the directory diff calculation routine, + * produces G_FILE_MONITOR_EVENT_MOVED event on a move. + **/ +static void +handle_moved (void *udata, + const char *from_path, + ino_t from_inode, + const char *to_path, + ino_t to_inode) +{ + handle_ctx *ctx = NULL; + GFile *file = NULL; + GFile *other = NULL; + gchar *path = NULL; + gchar *npath = NULL; + + (void) from_inode; + (void) to_inode; + + ctx = (handle_ctx *) udata; + g_assert (udata != NULL); + g_assert (ctx->sub != NULL); + g_assert (ctx->monitor != NULL); + + + path = _ku_path_concat (ctx->sub->filename, from_path); + npath = _ku_path_concat (ctx->sub->filename, to_path); + if (path == NULL || npath == NULL) + { + KH_W ("Failed to allocate strings for event"); + return; + } + + file = g_file_new_for_path (path); + other = g_file_new_for_path (npath); + + if (ctx->sub->pair_moves) + { + g_file_monitor_emit_event (ctx->monitor, + file, + other, + G_FILE_MONITOR_EVENT_MOVED); + } + else + { + g_file_monitor_emit_event (ctx->monitor, + file, + NULL, + G_FILE_MONITOR_EVENT_DELETED); + g_file_monitor_emit_event (ctx->monitor, + other, + NULL, + G_FILE_MONITOR_EVENT_CREATED); + } + + g_free (path); + g_free (npath); + + g_object_unref (file); + g_object_unref (other); +} + + +/** + * handle_overwritten: + * @data: a pointer to user data (#handle_context). + * @path: file name of the overwritten file. + * @node: inode number of the overwritten file. + * + * A callback function for the directory diff calculation routine, + * produces G_FILE_MONITOR_EVENT_DELETED/CREATED event pair when + * an overwrite occurs in the directory (see dep-list for details). + **/ +static void +handle_overwritten (void *udata, const char *path, ino_t inode) +{ + handle_ctx *ctx = NULL; + GFile *file = NULL; + gchar *fpath = NULL; + + (void) inode; + ctx = (handle_ctx *) udata; + g_assert (udata != NULL); + g_assert (ctx->sub != NULL); + g_assert (ctx->monitor != NULL); + + fpath = _ku_path_concat (ctx->sub->filename, path); + if (fpath == NULL) + { + KH_W ("Failed to allocate a string for a new event"); + return; + } + + file = g_file_new_for_path (fpath); + g_file_monitor_emit_event (ctx->monitor, + file, + NULL, + G_FILE_MONITOR_EVENT_DELETED); + g_file_monitor_emit_event (ctx->monitor, + file, + NULL, + G_FILE_MONITOR_EVENT_CREATED); + + g_free (fpath); + g_object_unref (file); +} + +static const traverse_cbs cbs = { + handle_created, + handle_deleted, + handle_moved, + handle_overwritten, + handle_moved, + NULL, /* many added */ + NULL, /* many removed */ + NULL, /* names updated */ +}; + + +void +_kh_dir_diff (kqueue_sub *sub, GFileMonitor *monitor) +{ + dep_list *was; + handle_ctx ctx; + + g_assert (sub != NULL); + g_assert (monitor != NULL); + + memset (&ctx, 0, sizeof (handle_ctx)); + ctx.sub = sub; + ctx.monitor = monitor; + + was = sub->deps; + sub->deps = dl_listing (sub->filename); + + dl_calculate (was, sub->deps, &cbs, &ctx); + + dl_free (was); +} + + +/** + * process_kqueue_notifications: + * @gioc: unused. + * @cond: unused. + * @data: unused. + * + * Processes notifications, coming from the kqueue thread. + * + * Reads notifications from the command file descriptor, emits the + * "changed" event on the appropriate monitor. + * + * A typical GIO Channel callback function. + * + * Returns: %TRUE + **/ +static gboolean +process_kqueue_notifications (GIOChannel *gioc, + GIOCondition cond, + gpointer data) +{ + struct kqueue_notification n; + kqueue_sub *sub = NULL; + GFileMonitor *monitor = NULL; + GFileMonitorEvent mask = 0; + + g_assert (kqueue_socket_pair[0] != -1); + if (!_ku_read (kqueue_socket_pair[0], &n, sizeof (struct kqueue_notification))) + { + KH_W ("Failed to read a kqueue notification, error %d", errno); + return TRUE; + } + + G_LOCK (hash_lock); + sub = (kqueue_sub *) g_hash_table_lookup (subs_hash_table, GINT_TO_POINTER (n.fd)); + G_UNLOCK (hash_lock); + + if (sub == NULL) + { + KH_W ("Got a notification for a deleted or non-existing subscription %d", + n.fd); + return TRUE; + } + + monitor = G_FILE_MONITOR (sub->user_data); + g_assert (monitor != NULL); + + if (n.flags & (NOTE_DELETE | NOTE_REVOKE)) + { + if (sub->deps) + { + dl_free (sub->deps); + sub->deps = NULL; + } + _km_add_missing (sub); + + if (!(n.flags & NOTE_REVOKE)) + { + /* Note that NOTE_REVOKE is issued by the kqueue thread + * on EV_ERROR kevent. In this case, a file descriptor is + * already closed from the kqueue thread, no need to close + * it manually */ + _kh_cancel_sub (sub); + } + } + + if (sub->is_dir && n.flags & (NOTE_WRITE | NOTE_EXTEND)) + { + _kh_dir_diff (sub, monitor); + n.flags &= ~(NOTE_WRITE | NOTE_EXTEND); + } + + if (n.flags) + { + gboolean done = FALSE; + mask = convert_kqueue_events_to_gio (n.flags, &done); + if (done == TRUE) + { + GFile *file = g_file_new_for_path (sub->filename); + g_file_monitor_emit_event (monitor, file, NULL, mask); + g_object_unref (file); + } + } + + return TRUE; +} + + +/** + * _kh_startup_impl: + * @unused: unused + * + * Kqueue backend startup code. Should be called only once. + * + * Returns: %TRUE on success, %FALSE otherwise. + **/ +static gpointer +_kh_startup_impl (gpointer unused) +{ + GIOChannel *channel = NULL; + gboolean result = FALSE; + + kqueue_descriptor = kqueue (); + result = (kqueue_descriptor != -1); + if (!result) + { + KH_W ("Failed to initialize kqueue\n!"); + return GINT_TO_POINTER (FALSE); + } + + result = socketpair (AF_UNIX, SOCK_STREAM, 0, kqueue_socket_pair); + if (result != 0) + { + KH_W ("Failed to create socket pair\n!"); + return GINT_TO_POINTER (FALSE) ; + } + + result = pthread_create (&kqueue_thread, + NULL, + _kqueue_thread_func, + &kqueue_socket_pair[1]); + if (result != 0) + { + KH_W ("Failed to run kqueue thread\n!"); + return GINT_TO_POINTER (FALSE); + } + + _km_init (_kh_file_appeared_cb); + + channel = g_io_channel_unix_new (kqueue_socket_pair[0]); + g_io_add_watch (channel, G_IO_IN, process_kqueue_notifications, NULL); + + subs_hash_table = g_hash_table_new (g_direct_hash, g_direct_equal); + + KH_W ("started gio kqueue backend\n"); + return GINT_TO_POINTER (TRUE); +} + + +/** + * _kh_startup: + * Kqueue backend initialization. + * + * Returns: %TRUE on success, %FALSE otherwise. + **/ +gboolean +_kh_startup (void) +{ + static GOnce init_once = G_ONCE_INIT; + g_once (&init_once, _kh_startup_impl, NULL); + return GPOINTER_TO_INT (init_once.retval); +} + + +/** + * _kh_start_watching: + * @sub: a #kqueue_sub + * + * Starts watching on a subscription. + * + * Returns: %TRUE on success, %FALSE otherwise. + **/ +gboolean +_kh_start_watching (kqueue_sub *sub) +{ + g_assert (kqueue_socket_pair[0] != -1); + g_assert (sub != NULL); + g_assert (sub->filename != NULL); + + /* kqueue requires a file descriptor to monitor. Sad but true */ +#if defined (O_EVTONLY) + sub->fd = open (sub->filename, O_EVTONLY); +#else + sub->fd = open (sub->filename, O_RDONLY); +#endif + + if (sub->fd == -1) + { + KH_W ("failed to open file %s (error %d)", sub->filename, errno); + return FALSE; + } + + _ku_file_information (sub->fd, &sub->is_dir, NULL); + if (sub->is_dir) + { + /* I know, it is very bad to make such decisions in this way and here. + * We already do have an user_data at the #kqueue_sub, and it may point to + * GKqueueFileMonitor or GKqueueDirectoryMonitor. For a directory case, + * we need to scan in contents for the further diffs. Ideally this process + * should be delegated to the GKqueueDirectoryMonitor, but for now I will + * do it in a dirty way right here. */ + if (sub->deps) + dl_free (sub->deps); + + sub->deps = dl_listing (sub->filename); + } + + G_LOCK (hash_lock); + g_hash_table_insert (subs_hash_table, GINT_TO_POINTER (sub->fd), sub); + G_UNLOCK (hash_lock); + + _kqueue_thread_push_fd (sub->fd); + + /* Bump the kqueue thread. It will pick up a new sub entry to monitor */ + if (!_ku_write (kqueue_socket_pair[0], "A", 1)) + KH_W ("Failed to bump the kqueue thread (add fd, error %d)", errno); + return TRUE; +} + + +/** + * _kh_add_sub: + * @sub: a #kqueue_sub + * + * Adds a subscription for monitoring. + * + * This funciton tries to start watching a subscription with + * _kh_start_watching(). On failure, i.e. when a file does not exist yet, + * the subscription will be added to a list of missing files to continue + * watching when the file will appear. + * + * Returns: %TRUE + **/ +gboolean +_kh_add_sub (kqueue_sub *sub) +{ + g_assert (sub != NULL); + + if (!_kh_start_watching (sub)) + _km_add_missing (sub); + + return TRUE; +} + + +/** + * _kh_cancel_sub: + * @sub a #kqueue_sub + * + * Stops monitoring on a subscription. + * + * Returns: %TRUE + **/ +gboolean +_kh_cancel_sub (kqueue_sub *sub) +{ + gboolean missing = FALSE; + g_assert (kqueue_socket_pair[0] != -1); + g_assert (sub != NULL); + + G_LOCK (hash_lock); + missing = !g_hash_table_remove (subs_hash_table, GINT_TO_POINTER (sub->fd)); + G_UNLOCK (hash_lock); + + if (missing) + { + /* If there were no fd for this subscription, file is still + * missing. */ + KH_W ("Removing subscription from missing"); + _km_remove (sub); + } + else + { + /* fd will be closed in the kqueue thread */ + _kqueue_thread_remove_fd (sub->fd); + + /* Bump the kqueue thread. It will pick up a new sub entry to remove*/ + if (!_ku_write (kqueue_socket_pair[0], "R", 1)) + KH_W ("Failed to bump the kqueue thread (remove fd, error %d)", errno); + } + + return TRUE; +} + + +/** + * _kh_file_appeared_cb: + * @sub: a #kqueue_sub + * + * A callback function for kqueue-missing subsystem. + * + * Signals that a missing file has finally appeared in the filesystem. + * Emits %G_FILE_MONITOR_EVENT_CREATED. + **/ +void +_kh_file_appeared_cb (kqueue_sub *sub) +{ + GFile* child; + + g_assert (sub != NULL); + g_assert (sub->filename); + + if (!g_file_test (sub->filename, G_FILE_TEST_EXISTS)) + return; + + child = g_file_new_for_path (sub->filename); + + g_file_monitor_emit_event (G_FILE_MONITOR (sub->user_data), + child, + NULL, + G_FILE_MONITOR_EVENT_CREATED); + + g_object_unref (child); +} diff --git a/gio/kqueue/kqueue-helper.h b/gio/kqueue/kqueue-helper.h new file mode 100644 index 0000000..fc33a8d --- /dev/null +++ b/gio/kqueue/kqueue-helper.h @@ -0,0 +1,37 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __KQUEUE_HELPER_H +#define __KQUEUE_HELPER_H + +#include "kqueue-sub.h" +#include + +gboolean _kh_startup (void); +gboolean _kh_add_sub (kqueue_sub *sub); +gboolean _kh_cancel_sub (kqueue_sub *sub); + +gboolean _kh_start_watching (kqueue_sub *sub); + +void _kh_dir_diff (kqueue_sub *sub, GFileMonitor *monitor); + +#endif /* __KQUEUE_HELPER_H */ diff --git a/gio/kqueue/kqueue-missing.c b/gio/kqueue/kqueue-missing.c new file mode 100644 index 0000000..9ea3c3e --- /dev/null +++ b/gio/kqueue/kqueue-missing.c @@ -0,0 +1,157 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include + +#include "kqueue-helper.h" +#include "kqueue-sub.h" +#include "kqueue-missing.h" + + +#define SCAN_MISSING_TIME 4 /* 1/4 Hz */ + +static gboolean km_scan_missing (gpointer user_data); + +static gboolean km_debug_enabled = FALSE; +#define KM_W if (km_debug_enabled) g_warning + +static GSList *missing_subs_list = NULL; +G_LOCK_DEFINE_STATIC (missing_lock); + +static volatile gboolean scan_missing_running = FALSE; +static on_create_cb file_appeared_callback; + + +/** + * _km_init: + * @cb: a callback function. It will be called when a watched file + * will appear. + * + * Initialize the kqueue-missing module (optional). + **/ +void +_km_init (on_create_cb cb) +{ + file_appeared_callback = cb; +} + + +/** + * _km_add_missing: + * @sub: a #kqueue_sub + * + * Adds a subscription to the missing files list. + **/ +void +_km_add_missing (kqueue_sub *sub) +{ + G_LOCK (missing_lock); + if (g_slist_find (missing_subs_list, sub)) + { + KM_W ("asked to add %s to missing list but it's already on the list!\n", sub->filename); + return; + } + + KM_W ("adding %s to missing list\n", sub->filename); + missing_subs_list = g_slist_prepend (missing_subs_list, sub); + G_UNLOCK (missing_lock); + + if (!scan_missing_running) + { + scan_missing_running = TRUE; + g_timeout_add_seconds (SCAN_MISSING_TIME, km_scan_missing, NULL); + } +} + + +/** + * km_scan_missing: + * @user_data: unused + * + * The core missing files watching routine. + * + * Traverses through a list of missing files, tries to start watching each with + * kqueue, removes the appropriate entry and invokes a user callback if the file + * has appeared. + * + * Returns: %FALSE if no missing files left, %TRUE otherwise. + **/ +static gboolean +km_scan_missing (gpointer user_data) +{ + GSList *head; + GSList *not_missing = NULL; + gboolean retval = FALSE; + + G_LOCK (missing_lock); + + if (missing_subs_list) + KM_W ("we have a job"); + + for (head = missing_subs_list; head; head = head->next) + { + kqueue_sub *sub = (kqueue_sub *) head->data; + g_assert (sub != NULL); + g_assert (sub->filename != NULL); + + if (_kh_start_watching (sub)) + { + KM_W ("file %s now exists, starting watching", sub->filename); + if (file_appeared_callback) + file_appeared_callback (sub); + not_missing = g_slist_prepend (not_missing, head); + } + } + + for (head = not_missing; head; head = head->next) + { + GSList *link = (GSList *) head->data; + missing_subs_list = g_slist_remove_link (missing_subs_list, link); + } + g_slist_free (not_missing); + + if (missing_subs_list == NULL) + { + scan_missing_running = FALSE; + retval = FALSE; + } + else + retval = TRUE; + + G_UNLOCK (missing_lock); + return retval; +} + + +/** + * _km_remove: + * @sub: a #kqueue_sub + * + * Removes a subscription from a list of missing files. + **/ +void +_km_remove (kqueue_sub *sub) +{ + G_LOCK (missing_lock); + missing_subs_list = g_slist_remove (missing_subs_list, sub); + G_UNLOCK (missing_lock); +} diff --git a/gio/kqueue/kqueue-missing.h b/gio/kqueue/kqueue-missing.h new file mode 100644 index 0000000..704a6f3 --- /dev/null +++ b/gio/kqueue/kqueue-missing.h @@ -0,0 +1,32 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __G_KQUEUE_MISSING_H +#define __G_KQUEUE_MISSING_H + +typedef void (*on_create_cb) (kqueue_sub *); + +void _km_init (on_create_cb cb); +void _km_add_missing (kqueue_sub *sub); +void _km_remove (kqueue_sub *sub); + +#endif /* __G_KQUEUE_MISSING_H */ diff --git a/gio/kqueue/kqueue-sub.c b/gio/kqueue/kqueue-sub.c new file mode 100644 index 0000000..8b864ba --- /dev/null +++ b/gio/kqueue/kqueue-sub.c @@ -0,0 +1,79 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include + +#include "kqueue-sub.h" + +static gboolean ks_debug_enabled = FALSE; +#define KS_W if (ks_debug_enabled) g_warning + +/** + * _kh_sub_new: + * @filename: a file path to monitor (will be copied) + * @pair_moves: pair moves flag. Refer to #GFileMonitorFlags documentation. + * @user_data: user-supplied poiner. + * + * Creates a new subscription object. + * + * Returns: a pointer to a created subscription object. + **/ +kqueue_sub* +_kh_sub_new (const gchar *filename, + gboolean pair_moves, + gpointer user_data) +{ + kqueue_sub *sub = g_slice_new (kqueue_sub); + g_assert (sub != NULL); + + sub->filename = g_strdup (filename); + sub->pair_moves = pair_moves; + sub->user_data = user_data; + sub->fd = -1; + sub->deps = NULL; + /* I think that having such flag in the subscription is not good */ + sub->is_dir = 0; + + KS_W ("new subscription for %s being setup\n", sub->filename); + + return sub; +} + + +/** + * _kh_sub_free: + * @sub: a #kqueue_sub + * + * Frees a subscription object and all its associated memory. + **/ +void +_kh_sub_free (kqueue_sub *sub) +{ + if (sub->deps) + { + dl_free (sub->deps); + sub->deps = NULL; + } + + g_free (sub->filename); + g_slice_free (kqueue_sub, sub); +} diff --git a/gio/kqueue/kqueue-sub.h b/gio/kqueue/kqueue-sub.h new file mode 100644 index 0000000..215c491 --- /dev/null +++ b/gio/kqueue/kqueue-sub.h @@ -0,0 +1,50 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __KQUEUE_SUB_H +#define __KQUEUE_SUB_H + +#include "dep-list.h" + +/** + * kqueue_sub: + * @filename: a name of the file to monitor + * @user_data: the pointer to user data + * @pair_moves: unused (currently not implemented) + * @fd: the associated file descriptor (used by kqueue) + * + * Represents a subscription on a file or directory. + */ +typedef struct +{ + gchar* filename; + gpointer user_data; + gboolean pair_moves; + int fd; + dep_list* deps; + int is_dir; +} kqueue_sub; + +kqueue_sub* _kh_sub_new (const gchar* filename, gboolean pair_moves, gpointer user_data); +void _kh_sub_free (kqueue_sub* sub); + +#endif /* __KQUEUE_SUB_H */ diff --git a/gio/kqueue/kqueue-thread.c b/gio/kqueue/kqueue-thread.c new file mode 100644 index 0000000..c335ae5 --- /dev/null +++ b/gio/kqueue/kqueue-thread.c @@ -0,0 +1,310 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include "config.h" +#include +#include +#include +#include +#include +#include + +#include "kqueue-thread.h" +#include "kqueue-sub.h" +#include "kqueue-utils.h" + +static gboolean kt_debug_enabled = FALSE; +#define KT_W if (kt_debug_enabled) g_warning + +static GQueue pick_up_fds_queue = G_QUEUE_INIT; +G_LOCK_DEFINE_STATIC (pick_up_lock); + +static GSList *remove_fds_list = NULL; +G_LOCK_DEFINE_STATIC (remove_lock); + +/* GIO does not have analogues for NOTE_LINK and(?) NOTE_REVOKE, so + * we do not ask kqueue() to watch for these events for now. */ +const uint32_t KQUEUE_VNODE_FLAGS = + NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_RENAME; + +extern int get_kqueue_descriptor(void); + +/** + * _kqueue_thread_collect_fds: + * @events: a #kevents - the list of events to monitor. Will be extended + * with new items. + * + * Picks up new file descriptors for monitoring from a global queue. + * + * To add new items to the list, use _kqueue_thread_push_fd(). + **/ +static void +_kqueue_thread_collect_fds (kevents *events) +{ + g_assert (events != NULL); + gint length = 0; + + G_LOCK (pick_up_lock); + if ((length = g_queue_get_length (&pick_up_fds_queue)) != 0) + { + gpointer fdp = NULL; + kevents_extend_sz (events, length); + + while ((fdp = g_queue_pop_head (&pick_up_fds_queue)) != NULL) + { + struct kevent *pevent = &events->memory[events->kq_size++]; + EV_SET (pevent, + GPOINTER_TO_INT (fdp), + EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_ONESHOT, + KQUEUE_VNODE_FLAGS, + 0, + 0); + } + } + G_UNLOCK (pick_up_lock); +} + + +/** + * _kqueue_thread_cleanup_fds: + * @events: a #kevents -- list of events to monitor. Cancelled + * subscriptions will be removed from it, and its size + * probably will be reduced. + * + * Removes file descriptors from monitoring. + * + * This function will pick up file descriptors from a global list + * to cancel monitoring on them. The list will be freed then. + * + * To add new items to the list, use _kqueue_thread_remove_fd(). + **/ +static void +_kqueue_thread_cleanup_fds (kevents *events) +{ + g_assert (events != NULL); + + G_LOCK (remove_lock); + if (remove_fds_list) + { + size_t oldsize = events->kq_size; + int i, j; + + for (i = 1, j = 1; i < oldsize; i++) + { + int fd = events->memory[i].ident; + GSList *elem = g_slist_find (remove_fds_list, GINT_TO_POINTER (fd)); + if (elem == NULL) + { + if (i != j) + events->memory[j] = events->memory[i]; + ++j; + } + else if (close (fd) == -1) + KT_W ("Failed to close fd %d, error %d", fd, errno); + } + + KT_W ("FD Clean up complete, kq_size now %d\n", j); + events->kq_size = j; + kevents_reduce (events); + g_slist_free (remove_fds_list); + remove_fds_list = NULL; + } + G_UNLOCK (remove_lock); +} + + +/** + * _kqueue_thread_drop_fd: + * @events: a #kevents -- list of events to monitor. Cancelled + * subscriptions will be removed from it, and its size + * probably will be reduced. + * + * Removes a concrete file descriptor from monitoring. + **/ +static void +_kqueue_thread_drop_fd (kevents *events, int fd) +{ + g_assert (events != NULL); + + int i; + for (i = 1; i < events->kq_size; i++) + { + if (events->memory[i].ident == fd) + { + if (close (fd) == -1) + KT_W ("Failed to close fd %d, error %d", fd, errno); + + events->memory[i] = events->memory[--events->kq_size]; + return; + } + } +} + +/** + * _kqueue_thread_func: + * @arg: a pointer to int -- control file descriptor. + * + * The thread communicates with the outside world through a so-called + * command file descriptor. The thread reads control commands from it + * and writes the notifications into it. + * + * Control commands are single-byte characters: + * + * + * 'A' - pick up new file descriptors to monitor + * + * + * 'R' - remove some descriptors from monitoring. + * + * + * + * For details, see _kqueue_thread_collect_fds() and + * _kqueue_thread_cleanup_fds(). + * + * Notifications, that thread writes into the command file descriptor, + * are represented with #kqueue_notification objects. + * + * Returns: %NULL + **/ +void* +_kqueue_thread_func (void *arg) +{ + int fd, kqueue_descriptor; + kevents waiting; + + g_assert (arg != NULL); + kevents_init_sz (&waiting, 1); + + fd = *(int *) arg; + + kqueue_descriptor = get_kqueue_descriptor(); + if (kqueue_descriptor == -1) + { + KT_W ("fatal: kqueue is not initialized!\n"); + return NULL; + } + + EV_SET (&waiting.memory[0], + fd, + EVFILT_READ, + EV_ADD | EV_ENABLE | EV_ONESHOT, + NOTE_LOWAT, + 1, + 0); + waiting.kq_size = 1; + + for (;;) + { + /* TODO: Provide more items in the `eventlist' to kqueue(2). + * Currently the backend takes notifications from the kernel one + * by one, i.e. there will be a lot of system calls and context + * switches when the application will monitor a lot of files with + * high filesystem activity on each. */ + + struct kevent received; + KT_W ("Watching for %zi items", waiting.kq_size); + int ret = kevent (kqueue_descriptor, waiting.memory, waiting.kq_size, &received, 1, NULL); + int kevent_errno = errno; + KT_W ("Awoken."); + + if (ret == -1) + { + KT_W ("kevent failed: %d", kevent_errno); + if (kevent_errno == EINTR) + continue; + else + return NULL; + } + + if (received.ident == fd) + { + char c; + if (!_ku_read (fd, &c, 1)) + { + KT_W ("Failed to read command, error %d", errno); + continue; + } + if (c == 'A') + _kqueue_thread_collect_fds (&waiting); + else if (c == 'R') + _kqueue_thread_cleanup_fds (&waiting); + } + else + { + struct kqueue_notification kn; + kn.fd = received.ident; + + if (received.flags & EV_ERROR) + { + kn.flags = NOTE_REVOKE; + _kqueue_thread_drop_fd (&waiting, received.ident); + } + else + kn.flags = (received.fflags & ~NOTE_REVOKE); + + if (!_ku_write (fd, &kn, sizeof (struct kqueue_notification))) + KT_W ("Failed to write a kqueue notification, error %d", errno); + } + } + kevents_free (&waiting); + return NULL; +} + + +/** + * _kqueue_thread_push_fd: + * @fd: a file descriptor + * + * Puts a new file descriptor into the pick up list for monitroing. + * + * The kqueue thread will not start monitoring on it immediately, it + * should be bumped via its command file descriptor manually. + * See kqueue_thread() and _kqueue_thread_collect_fds() for details. + **/ +void +_kqueue_thread_push_fd (int fd) +{ + G_LOCK (pick_up_lock); + g_queue_push_tail (&pick_up_fds_queue, GINT_TO_POINTER (fd)); + G_UNLOCK (pick_up_lock); +} + + +/** + * _kqueue_thread_remove_fd: + * @fd: a file descriptor + * + * Puts a new file descriptor into the remove list to cancel monitoring + * on it. + * + * The kqueue thread will not stop monitoring on it immediately, it + * should be bumped via its command file descriptor manually. + * See kqueue_thread() and _kqueue_thread_collect_fds() for details. + **/ +void +_kqueue_thread_remove_fd (int fd) +{ + G_LOCK (remove_lock); + remove_fds_list = g_slist_prepend (remove_fds_list, GINT_TO_POINTER (fd)); + G_UNLOCK (remove_lock); +} diff --git a/gio/kqueue/kqueue-thread.h b/gio/kqueue/kqueue-thread.h new file mode 100644 index 0000000..0e46a0d --- /dev/null +++ b/gio/kqueue/kqueue-thread.h @@ -0,0 +1,45 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __KQUEUE_THREAD_H +#define __KQUEUE_THREAD_H + +/** + * kqueue_notification: + * @fd: file descriptor, on which an activity has occured. + * @flags: kqueue event flags, see man kevent(2). + * + * Represents an event occured on a file descriptor. Used for marshalling from + * kqueue thread to its subscribers. + */ +struct kqueue_notification { + /*< public >*/ + int fd; + uint32_t flags; +}; + + +void* _kqueue_thread_func (void *arg); +void _kqueue_thread_push_fd (int fd); +void _kqueue_thread_remove_fd (int fd); + +#endif /* __KQUEUE_SUB_H */ diff --git a/gio/kqueue/kqueue-utils.c b/gio/kqueue/kqueue-utils.c new file mode 100644 index 0000000..00b5c26 --- /dev/null +++ b/gio/kqueue/kqueue-utils.c @@ -0,0 +1,242 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + 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. +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "kqueue-utils.h" + +static gboolean ku_debug_enabled = FALSE; +#define KU_W if (ku_debug_enabled) g_warning + + + +#define KEVENTS_EXTEND_COUNT 10 + + +/** + * kevents_init_sz: + * @kv: a #kevents + * @n_initial: the initial preallocated memory size. If it is less than + * %KEVENTS_EXTEND_COUNT, this value will be used instead. + * + * Initializes a #kevents object. + **/ +void +kevents_init_sz (kevents *kv, gsize n_initial) +{ + g_assert (kv != NULL); + + memset (kv, 0, sizeof (kevents)); + + if (n_initial < KEVENTS_EXTEND_COUNT) + n_initial = KEVENTS_EXTEND_COUNT; + + kv->memory = g_new0 (struct kevent, n_initial); + kv->kq_allocated = n_initial; +} + + +/** + * kevents_extend_sz: + * @kv: a #kevents + * @n_new: the number of new objects to be added + * + * Extends the allocated memory, if needed. + **/ +void +kevents_extend_sz (kevents *kv, gsize n_new) +{ + g_assert (kv != NULL); + + if (kv->kq_size + n_new <= kv->kq_allocated) + return; + + kv->kq_allocated += (n_new + KEVENTS_EXTEND_COUNT); + kv->memory = g_renew (struct kevent, kv->memory, kv->kq_allocated); +} + + +/** + * kevents_reduce: + * @kv: a #kevents + * + * Reduces the allocated heap size, if needed. + * + * If the allocated heap size is >= 3*used + * and 2*used >= %KEVENTS_EXTEND_COUNT, reduce it to 2*used. + **/ +void +kevents_reduce (kevents *kv) +{ + g_assert (kv != NULL); + gsize candidate_sz; + + if (kv->kq_size == 0 || kv->kq_allocated == 0 || kv->memory == NULL) + return; + + candidate_sz = 2 * kv->kq_size; + + if (((double) kv->kq_allocated / kv->kq_size) >= 3 && + candidate_sz >= KEVENTS_EXTEND_COUNT) + { + kv->kq_allocated = candidate_sz; + kv->memory = g_renew (struct kevent, kv->memory, kv->kq_allocated); + } +} + + +/** + * kevents_free: + * @kv: a #kevents + * + * Resets the kevents object and frees all the associated memory. + **/ +void +kevents_free (kevents *kv) +{ + g_assert (kv != NULL); + + g_free (kv->memory); + memset (kv, 0, sizeof (kevents)); +} + + +#define SAFE_GENERIC_OP(fcn, fd, data, size) \ + while (size > 0) \ + { \ + gsize retval = fcn (fd, data, size); \ + if (retval == -1) \ + { \ + if (errno == EINTR) \ + continue; \ + else \ + return FALSE; \ + } \ + size -= retval; \ + data += retval; \ + } \ + return TRUE; + + +/** + * _ku_read: + * @fd: a file descriptor + * @data: the destination buffer + * @size: how many bytes to read + * + * A ready-to-EINTR version of read(). + * + * This function expects to work with a blocking socket. + * + * Returns: %TRUE on success, %FALSE otherwise + **/ +gboolean +_ku_read (int fd, gpointer data, gsize size) +{ + SAFE_GENERIC_OP (read, fd, data, size); +} + + +/** + * _ku_write: + * @fd: a file descriptor + * @data: the buffer to write + * @size: how many bytes to write + * + * A ready-to-EINTR version of write(). + * + * This function expects to work with a blocking socket. + * + * Returns: %TRUE on success, %FALSE otherwise + **/ +gboolean +_ku_write (int fd, gconstpointer data, gsize size) +{ + SAFE_GENERIC_OP (write, fd, data, size); +} + + +/** + * Get some file information by its file descriptor. + * + * @param[in] fd A file descriptor. + * @param[out] is_dir A flag indicating directory. + * @param[out] inode A file's inode number. + **/ +void +_ku_file_information (int fd, int *is_dir, ino_t *inode) +{ + g_assert (fd != -1); + + struct stat st; + memset (&st, 0, sizeof (struct stat)); + + if (fstat (fd, &st) == -1) + { + KU_W ("fstat failed, assuming it is just a file"); + is_dir = NULL; + return; + } + + if (is_dir != NULL) + *is_dir = ((st.st_mode & S_IFDIR) == S_IFDIR) ? 1 : 0; + + if (inode != NULL) + *inode = st.st_ino; +} + +/** + * Create a file path using its name and a path to its directory. + * + * @param[in] dir A path to a file directory. May end with a '/'. + * @param[in] file File name. + * @return A concatenated path. Should be freed with free(). + **/ +gchar* +_ku_path_concat (const gchar *dir, const gchar *file) +{ + int dir_len = strlen (dir); + int file_len = strlen (file); + + char *path = g_malloc (dir_len + file_len + 2); + if (path == NULL) + { + KU_W ("Failed to allocate memory path for concatenation"); + return NULL; + } + + strcpy (path, dir); + + if (dir[dir_len - 1] != '/') { + ++dir_len; + path[dir_len - 1] = '/'; + } + + strcpy (path + dir_len, file); + return path; +} + diff --git a/gio/kqueue/kqueue-utils.h b/gio/kqueue/kqueue-utils.h new file mode 100644 index 0000000..2c4f2c3 --- /dev/null +++ b/gio/kqueue/kqueue-utils.h @@ -0,0 +1,57 @@ +/******************************************************************************* + Copyright (c) 2011, 2012 Dmitry Matveev + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*******************************************************************************/ + +#ifndef __KQUEUE_UTILS_H +#define __KQUEUE_UTILS_H + +#include /* ino_t */ + +/** + * kqueue_notification: + * @memory: a pointer to the allocated memory + * @kq_size: the number of used items + * @kq_allocated: the number of allocated items + * + * Represents a pool of (struct kevent) objects. + */ +typedef struct { + struct kevent *memory; + gsize kq_size; + gsize kq_allocated; +} kevents; + +void kevents_init_sz (kevents *kv, gsize n_initial); +void kevents_extend_sz (kevents *kv, gsize n_new); +void kevents_reduce (kevents *kv); +void kevents_free (kevents *kv); + + +gboolean _ku_read (int fd, gpointer data, gsize size); +gboolean _ku_write (int fd, gconstpointer data, gsize size); + +void _ku_file_information (int fd, int *is_dir, ino_t *inode); + +gchar* _ku_path_concat (const gchar *dir, const gchar *file); + + + +#endif /* __KQUEUE_UTILS_H */ diff --git a/gio/makefile.msc b/gio/makefile.msc new file mode 100644 index 0000000..c545578 --- /dev/null +++ b/gio/makefile.msc @@ -0,0 +1,259 @@ +# 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 \ + 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 + +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/strinfo.c b/gio/strinfo.c new file mode 100644 index 0000000..777f23a --- /dev/null +++ b/gio/strinfo.c @@ -0,0 +1,350 @@ +/* + * 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 +#include + +/* + * The string info map is an efficient data structure designed to be + * used with a small set of items. It is used by GSettings schemas for + * three purposes: + * + * 1) Implement with a list of valid strings + * + * 2) Implement by mapping one string to another + * + * 3) Implement enumerated types by mapping strings to integer values + * (and back). + * + * The map is made out of an array of uint32s. Each entry in the array + * is an integer value, followed by a specially formatted string value: + * + * The string starts with the byte 0xff or 0xfe, followed by the + * content of the string, followed by a nul byte, followed by + * additional nul bytes for padding, followed by a 0xff byte. + * + * Padding is added so that the entire formatted string takes up a + * multiple of 4 bytes, and not less than 8 bytes. The requirement + * for a string to take up 8 bytes is so that the scanner doesn't lose + * synch and mistake a string for an integer value. + * + * The first byte of the formatted string depends on if the integer is + * an enum value (0xff) or an alias (0xfe). If it is an alias then the + * number refers to the word offset within the info map at which the + * integer corresponding to the "target" value is stored. + * + * For example, consider the case of the string info map representing an + * enumerated type of 'foo' (value 1) and 'bar' (value 2) and 'baz' + * (alias for 'bar'). Note that string info maps are always little + * endian. + * + * x01 x00 x00 x00 xff 'f' 'o' 'o' x00 x00 x00 xff x02 x00 x00 x00 + * xff 'b' 'a' 'r' x00 x00 x00 xff x03 x00 x00 x00 xfe 'b' 'a' 'z' + * x00 x00 x00 xff + * + * + * The operations that someone may want to perform with the map: + * + * - lookup if a string is valid (and not an alias) + * - lookup the integer value for a enum 'nick' + * - lookup the integer value for the target of an alias + * - lookup an alias and convert it to its target string + * - lookup the enum nick for a given value + * + * In order to lookup if a string is valid, it is padded on either side + * (as described) and scanned for in the array. For example, you might + * look for "foo": + * + * xff 'f' 'o' 'o' x00 x00 x00 xff + * + * In order to lookup the integer value for a nick, the string is padded + * on either side and scanned for in the array, as above. Instead of + * merely succeeding, we look at the integer value to the left of the + * match. This is the enum value. + * + * In order to lookup an alias and convert it to its target enum value, + * the string is padded on either side (as described, with 0xfe) and + * scanned for. For example, you might look for "baz": + * + * xfe 'b' 'a' 'z' x00 x00 x00 xff + * + * The integer immediately preceding the match then contains the offset + * of the integer value of the target. In our example, that's '3'. + * This index is dereferenced to find the enum value of '2'. + * + * To convert the alias to its target string, 5 bytes just need to be + * added past the start of the integer value to find the start of the + * string. + * + * To lookup the enum nick for a given value, the value is searched for + * in the array. To ensure that the value isn't matching the inside of a + * string, we must check that it is either the first item in the array or + * immediately preceded by the byte 0xff. It must also be immediately + * followed by the byte 0xff. + * + * Because strings always take up a minimum of 2 words, because 0xff or + * 0xfe never appear inside of a utf-8 string and because no two integer + * values ever appear in sequence, the only way we can have the + * sequence: + * + * xff __ __ __ __ xff (or 0xfe) + * + * is in the event of an integer nested between two strings. + * + * For implementation simplicity/efficiency, strings may not be more + * than 65 characters in length (ie: 17 32bit words after padding). + * + * In the event that we are doing (ie: not an enum type) then + * the value of each choice is set to zero and ignored. + */ + +#define STRINFO_MAX_WORDS 17 +G_GNUC_UNUSED static guint +strinfo_string_to_words (const gchar *string, + guint32 *words, + gboolean alias) +{ + guint n_words; + gsize size; + + size = strlen (string); + + n_words = MAX (2, (size + 6) >> 2); + + if (n_words > STRINFO_MAX_WORDS) + return FALSE; + + words[0] = GUINT32_TO_LE (alias ? 0xfe : 0xff); + words[n_words - 1] = GUINT32_TO_BE (0xff); + memcpy (((gchar *) words) + 1, string, size + 1); + + return n_words; +} + +G_GNUC_UNUSED static gint +strinfo_scan (const guint32 *strinfo, + guint length, + const guint32 *words, + guint n_words) +{ + guint i = 0; + + if (length < n_words) + return -1; + + while (i <= length - n_words) + { + guint j = 0; + + for (j = 0; j < n_words; j++) + if (strinfo[i + j] != words[j]) + break; + + if (j == n_words) + return i; /* match */ + + /* skip at least one word, continue */ + i += j ? j : 1; + } + + return -1; +} + +G_GNUC_UNUSED static gint +strinfo_find_string (const guint32 *strinfo, + guint length, + const gchar *string, + gboolean alias) +{ + guint32 words[STRINFO_MAX_WORDS]; + guint n_words; + + if (length == 0) + return -1; + + n_words = strinfo_string_to_words (string, words, alias); + + return strinfo_scan (strinfo + 1, length - 1, words, n_words); +} + +G_GNUC_UNUSED static gint +strinfo_find_integer (const guint32 *strinfo, + guint length, + guint32 value) +{ + guint i; + + for (i = 0; i < length; i++) + if (strinfo[i] == GUINT32_TO_LE (value)) + { + const guchar *charinfo = (const guchar *) &strinfo[i]; + + /* make sure it has 0xff on either side */ + if ((i == 0 || charinfo[-1] == 0xff) && charinfo[4] == 0xff) + return i; + } + + return -1; +} + +G_GNUC_UNUSED static gboolean +strinfo_is_string_valid (const guint32 *strinfo, + guint length, + const gchar *string) +{ + return strinfo_find_string (strinfo, length, string, FALSE) != -1; +} + +G_GNUC_UNUSED static gboolean +strinfo_enum_from_string (const guint32 *strinfo, + guint length, + const gchar *string, + guint *result) +{ + gint index; + + index = strinfo_find_string (strinfo, length, string, FALSE); + + if (index < 0) + return FALSE; + + *result = GUINT32_FROM_LE (strinfo[index]); + return TRUE; +} + +G_GNUC_UNUSED static const gchar * +strinfo_string_from_enum (const guint32 *strinfo, + guint length, + guint value) +{ + gint index; + + index = strinfo_find_integer (strinfo, length, value); + + if (index < 0) + return NULL; + + return 1 + (const gchar *) &strinfo[index + 1]; +} + +G_GNUC_UNUSED static const gchar * +strinfo_string_from_alias (const guint32 *strinfo, + guint length, + const gchar *alias) +{ + gint index; + + index = strinfo_find_string (strinfo, length, alias, TRUE); + + if (index < 0) + return NULL; + + return 1 + (const gchar *) &strinfo[GUINT32_TO_LE (strinfo[index]) + 1]; +} + +G_GNUC_UNUSED static GVariant * +strinfo_enumerate (const guint32 *strinfo, + guint length) +{ + GVariantBuilder builder; + const gchar *ptr, *end; + + ptr = (gpointer) strinfo; + end = ptr + 4 * length; + + ptr += 4; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY); + + while (ptr < end) + { + /* don't include aliases */ + if (*ptr == '\xff') + g_variant_builder_add (&builder, "s", ptr + 1); + + /* find the end of this string */ + ptr = memchr (ptr, '\xff', end - ptr); + g_assert (ptr != NULL); + + /* skip over the int to the next string */ + ptr += 5; + } + + return g_variant_builder_end (&builder); +} + +G_GNUC_UNUSED static void +strinfo_builder_append_item (GString *builder, + const gchar *string, + guint value) +{ + guint32 words[STRINFO_MAX_WORDS]; + guint n_words; + + value = GUINT32_TO_LE (value); + + n_words = strinfo_string_to_words (string, words, FALSE); + g_string_append_len (builder, (void *) &value, sizeof value); + g_string_append_len (builder, (void *) words, 4 * n_words); +} + +G_GNUC_UNUSED static gboolean +strinfo_builder_append_alias (GString *builder, + const gchar *alias, + const gchar *target) +{ + guint32 words[STRINFO_MAX_WORDS]; + guint n_words; + guint value; + gint index; + + index = strinfo_find_string ((const guint32 *) builder->str, + builder->len / 4, target, FALSE); + + if (index == -1) + return FALSE; + + value = GUINT32_TO_LE (index); + + n_words = strinfo_string_to_words (alias, words, TRUE); + g_string_append_len (builder, (void *) &value, sizeof value); + g_string_append_len (builder, (void *) words, 4 * n_words); + + return TRUE; +} + +G_GNUC_UNUSED static gboolean +strinfo_builder_contains (GString *builder, + const gchar *string) +{ + return strinfo_find_string ((const guint32 *) builder->str, + builder->len / 4, string, FALSE) != -1 || + strinfo_find_string ((const guint32 *) builder->str, + builder->len / 4, string, TRUE) != -1; +} + +G_GNUC_UNUSED static gboolean +strinfo_builder_contains_value (GString *builder, + guint value) +{ + return strinfo_string_from_enum ((const guint32 *) builder->str, + builder->len / 4, value) != NULL; +} diff --git a/gio/tests/.gitignore b/gio/tests/.gitignore new file mode 100644 index 0000000..4e172ae --- /dev/null +++ b/gio/tests/.gitignore @@ -0,0 +1,118 @@ +actions +appinfo +appinfo-test +async-close-output-stream +basic-application +buffered-input-stream +buffered-output-stream +cancellable +connectable +contenttype +contexts +converter-stream +credentials +data-input-stream +data-output-stream +de/ +desktop-app-info +echo-server +file +fileattributematcher +filter-cat +filter-streams +gapplication +gapplication-example-actions +gapplication-example-cmdline +gapplication-example-cmdline2 +gapplication-example-cmdline3 +gapplication-example-dbushooks +gapplication-example-menu +gapplication-example-open +gdbus-addresses +gdbus-auth +gdbus-bz627724 +gdbus-close-pending +gdbus-connection +gdbus-connection-flush +gdbus-connection-flush-helper +gdbus-connection-loss +gdbus-connection-slow +gdbus-daemon +gdbus-error +gdbus-example-export +gdbus-example-objectmanager-client +gdbus-example-objectmanager-server +gdbus-example-own-name +gdbus-example-peer +gdbus-example-proxy-subclass +gdbus-example-server +gdbus-example-subtree +gdbus-example-unix-fd-client +gdbus-example-watch-name +gdbus-example-watch-proxy +gdbus-exit-on-close +gdbus-export +gdbus-introspection +gdbus-message +gdbus-names +gdbus-non-socket +gdbus-peer +gdbus-peer-object-manager +gdbus-proxy +gdbus-proxy-threads +gdbus-proxy-well-known-name +gdbus-serialization +gdbus-test-codegen +gdbus-test-codegen-generated* +gdbus-test-fixture +gdbus-testserver +gdbus-threading +g-file +g-file-info +g-icon +gmenumodel +gschemas.compiled +gsettings +gsettings.store +httpd +icons +inet-address +io-stream +live-g-file +memory-input-stream +memory-output-stream +mimeapps +network-address +network-monitor +org.gtk.test.enums.xml +permission +pollable +plugin_resources.c +proxy +proxy-test +readwrite +resolver +resources +send-data +services/org.gtk.GDBus.Examples.ObjectManager.service +simple-async-result +simple-proxy +sleepy-stream +socket +socket-client +socket-server +srvtarget +task +test.mo +test.gresource +test_resources.c +test_resources2.c +test_resources2.h +tls-certificate +tls-interaction +unix-fd +unix-streams +vfs +volumemonitor +xdgdatadir +xdgdatahome diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am new file mode 100644 index 0000000..a6c56e1 --- /dev/null +++ b/gio/tests/Makefile.am @@ -0,0 +1,467 @@ + +NULL = +BUILT_SOURCES = + +include $(top_srcdir)/Makefile.decl + +SUBDIRS = gdbus-object-manager-example services + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -I$(top_builddir)/gio \ + -I$(top_srcdir)/gio \ + $(DBUS1_CFLAGS) \ + -DSRCDIR=\""$(srcdir)"\" \ + -DTEST_SERVICES=\""$(abs_top_builddir)/gio/tests/services"\" + + +noinst_PROGRAMS = $(TEST_PROGS) $(SAMPLE_PROGS) +noinst_DATA = $(MISC_STUFF) + +LDADD = \ + $(top_builddir)/glib/libglib-2.0.la \ + $(top_builddir)/gthread/libgthread-2.0.la \ + $(top_builddir)/gobject/libgobject-2.0.la \ + $(top_builddir)/gmodule/libgmodule-2.0.la \ + $(top_builddir)/gio/libgio-2.0.la + +TEST_PROGS += \ + io-stream \ + memory-input-stream \ + memory-output-stream \ + readwrite \ + g-file \ + g-file-info \ + converter-stream \ + data-input-stream \ + data-output-stream \ + g-icon \ + buffered-input-stream \ + buffered-output-stream \ + sleepy-stream \ + filter-streams \ + volumemonitor \ + simple-async-result \ + srvtarget \ + contexts \ + gsettings \ + gschema-compile \ + async-close-output-stream \ + gdbus-addresses \ + network-address \ + gdbus-message \ + socket \ + pollable \ + tls-certificate \ + tls-interaction \ + cancellable \ + vfs \ + network-monitor \ + fileattributematcher \ + resources \ + proxy-test \ + simple-proxy \ + inet-address \ + permission \ + task \ + credentials \ + $(NULL) + +if HAVE_DBUS_DAEMON +TEST_PROGS += \ + actions \ + gdbus-connection \ + gdbus-connection-loss \ + gdbus-connection-slow \ + gdbus-names \ + gdbus-proxy \ + gdbus-proxy-threads \ + gdbus-proxy-well-known-name \ + gdbus-introspection \ + gdbus-threading \ + gdbus-export \ + gdbus-error \ + gdbus-bz627724 \ + gmenumodel \ + $(NULL) +endif + + +if OS_UNIX +TEST_PROGS += \ + gdbus-close-pending \ + gdbus-connection-flush \ + gdbus-peer \ + gdbus-exit-on-close \ + gdbus-non-socket \ + gdbus-peer-object-manager \ + appinfo \ + contenttype \ + mimeapps \ + file \ + $(NULL) +endif + +SAMPLE_PROGS = \ + resolver \ + socket-server \ + socket-client \ + echo-server \ + httpd \ + send-data \ + filter-cat \ + gdbus-example-export \ + gdbus-example-own-name \ + gdbus-example-watch-name \ + gdbus-example-watch-proxy \ + gdbus-example-server \ + gdbus-example-subtree \ + gdbus-example-peer \ + gdbus-example-proxy-subclass \ + gdbus-connection-flush-helper \ + proxy \ + gapplication-example-open \ + gapplication-example-cmdline \ + gapplication-example-cmdline2 \ + gapplication-example-cmdline3 \ + gapplication-example-actions \ + gapplication-example-dbushooks \ + gdbus-daemon \ + gdbus-testserver \ + $(NULL) + +if OS_UNIX +TEST_PROGS += \ + live-g-file \ + desktop-app-info \ + unix-fd \ + unix-streams \ + gapplication \ + basic-application \ + gdbus-test-codegen \ + $(NULL) +SAMPLE_PROGS += \ + gdbus-example-unix-fd-client \ + gdbus-example-objectmanager-server \ + gdbus-example-objectmanager-client \ + gdbus-test-fixture \ + appinfo-test \ + $(NULL) +endif + +if OS_WIN32 +TEST_PROGS += win32-streams +endif + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +actions_SOURCES = actions.c gdbus-sessionbus.c gdbus-sessionbus.h + +unix_streams_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +win32_streams_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +resolver_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +socket_server_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +socket_client_SOURCES = socket-client.c \ + gtlsconsoleinteraction.c \ + gtlsconsoleinteraction.h +socket_client_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +echo_server_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +httpd_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +send_data_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +contexts_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +gdbus_daemon_SOURCES = gdbus-daemon.c $(top_srcdir)/gio/gdbusdaemon.c $(top_builddir)/gio/gdbus-daemon-generated.c + +gdbus_testserver_SOURCES = gdbus-testserver.c + +if HAVE_DBUS1 +TEST_PROGS += gdbus-serialization +gdbus_serialization_SOURCES = gdbus-serialization.c gdbus-tests.h gdbus-tests.c +gdbus_serialization_CFLAGS = $(DBUS1_CFLAGS) +gdbus_serialization_LDADD = $(LDADD) $(DBUS1_LIBS) +endif + +TEST_PROGS += gdbus-auth +gdbus_auth_SOURCES = gdbus-auth.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c +gdbus_auth_LDADD = $(LDADD) + +gdbus_bz627724_SOURCES = gdbus-bz627724.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_close_pending_SOURCES = gdbus-close-pending.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +if OS_UNIX +gdbus-test-codegen-generated.h gdbus-test-codegen-generated.c : test-codegen.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen + $(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \ + UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \ + $(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \ + --interface-prefix org.project. \ + --generate-c-code gdbus-test-codegen-generated \ + --c-generate-object-manager \ + --c-namespace Foo_iGen \ + --generate-docbook gdbus-test-codegen-generated-doc \ + --annotate "org.project.Bar" Key1 Value1 \ + --annotate "org.project.Bar" org.gtk.GDBus.Internal Value2 \ + --annotate "org.project.Bar.HelloWorld()" Key3 Value3 \ + --annotate "org.project.Bar::TestSignal" Key4 Value4 \ + --annotate "org.project.Bar:ay" Key5 Value5 \ + --annotate "org.project.Bar.TestPrimitiveTypes()[val_int32]" Key6 Value6 \ + --annotate "org.project.Bar.TestPrimitiveTypes()[ret_uint32]" Key7 Value7 \ + --annotate "org.project.Bar::TestSignal[array_of_strings]" Key8 Value8 \ + $(srcdir)/test-codegen.xml \ + $(NULL) + +BUILT_SOURCES += gdbus-test-codegen-generated.c gdbus-test-codegen-generated.h + +gdbus_test_codegen_SOURCES = gdbus-test-codegen.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c +gdbus_test_codegen_SOURCES += gdbus-test-codegen-generated.c gdbus-test-codegen-generated.h + +endif # OS_UNIX + +gdbus_connection_SOURCES = gdbus-connection.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_connection_flush_SOURCES = \ + gdbus-connection-flush.c \ + test-io-stream.c \ + test-io-stream.h \ + test-pipe-unix.c \ + test-pipe-unix.h \ + $(NULL) + +gdbus_connection_loss_SOURCES = gdbus-connection-loss.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_connection_slow_SOURCES = gdbus-connection-slow.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_names_SOURCES = gdbus-names.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_proxy_SOURCES = gdbus-proxy.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_proxy_threads_SOURCES = gdbus-proxy-threads.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_proxy_well_known_name_SOURCES = gdbus-proxy-well-known-name.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_introspection_SOURCES = gdbus-introspection.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_threading_SOURCES = gdbus-threading.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_export_SOURCES = gdbus-export.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_error_SOURCES = gdbus-error.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +gdbus_non_socket_SOURCES = \ + gdbus-non-socket.c \ + gdbus-tests.c \ + gdbus-tests.h \ + test-io-stream.c \ + test-io-stream.h \ + test-pipe-unix.c \ + test-pipe-unix.h \ + $(NULL) + +gdbus_exit_on_close_SOURCES = gdbus-exit-on-close.c gdbus-sessionbus.c gdbus-sessionbus.h gdbus-tests.h gdbus-tests.c + +resources_SOURCES = resources.c test_resources.c test_resources2.c test_resources2.h +resources_DEPENDENCIES = test.gresource + +gapplication_SOURCES = gapplication.c gdbus-sessionbus.h gdbus-sessionbus.c gdbus-tests.h gdbus-tests.c + +gmenumodel_SOURCES = gmenumodel.c gdbus-sessionbus.h gdbus-sessionbus.c + +schema_tests = \ + schema-tests/array-default-not-in-choices.gschema.xml \ + schema-tests/bad-choice.gschema.xml \ + schema-tests/bad-key.gschema.xml \ + schema-tests/bad-key2.gschema.xml \ + schema-tests/bad-key3.gschema.xml \ + schema-tests/bad-key4.gschema.xml \ + schema-tests/bad-type.gschema.xml \ + schema-tests/bare-alias.gschema.xml \ + schema-tests/choice-alias.gschema.xml \ + schema-tests/choice-bad.gschema.xml \ + schema-tests/choice-badtype.gschema.xml \ + schema-tests/choice-invalid-alias.gschema.xml \ + schema-tests/choice-missing-value.gschema.xml \ + schema-tests/choice-shadowed-alias.gschema.xml \ + schema-tests/choice-upside-down.gschema.xml \ + schema-tests/choice.gschema.xml \ + schema-tests/choices-wrong-type.gschema.xml \ + schema-tests/default-in-aliases.gschema.xml \ + schema-tests/default-not-in-choices.gschema.xml \ + schema-tests/default-out-of-range.gschema.xml \ + schema-tests/empty-key.gschema.xml \ + schema-tests/enum-with-aliases.gschema.xml \ + schema-tests/enum-with-bad-default.gschema.xml \ + schema-tests/enum-with-chained-alias.gschema.xml \ + schema-tests/enum-with-choice.gschema.xml \ + schema-tests/enum-with-invalid-alias.gschema.xml \ + schema-tests/enum-with-repeated-alias.gschema.xml \ + schema-tests/enum-with-repeated-nick.gschema.xml \ + schema-tests/enum-with-repeated-value.gschema.xml \ + schema-tests/enum-with-shadow-alias.gschema.xml \ + schema-tests/enum.gschema.xml \ + schema-tests/flags-aliased-default.gschema.xml \ + schema-tests/flags-bad-default.gschema.xml \ + schema-tests/flags-more-than-one-bit.gschema.xml \ + schema-tests/flags-with-enum-attr.gschema.xml \ + schema-tests/flags-with-enum-tag.gschema.xml \ + schema-tests/extend-and-shadow-indirect.gschema.xml \ + schema-tests/extend-and-shadow.gschema.xml \ + schema-tests/extend-missing.gschema.xml \ + schema-tests/extend-nonlist.gschema.xml \ + schema-tests/extend-self.gschema.xml \ + schema-tests/extend-wrong-list-indirect.gschema.xml \ + schema-tests/extend-wrong-list.gschema.xml \ + schema-tests/extending.gschema.xml \ + schema-tests/from-docs.gschema.xml \ + schema-tests/incomplete-list.gschema.xml \ + schema-tests/inherit-gettext-domain.gschema.xml \ + schema-tests/invalid-path.gschema.xml \ + schema-tests/key-in-list-indirect.gschema.xml \ + schema-tests/key-in-list.gschema.xml \ + schema-tests/list-of-missing.gschema.xml \ + schema-tests/missing-quotes.gschema.xml \ + schema-tests/no-default.gschema.xml \ + schema-tests/overflow.gschema.xml \ + schema-tests/override-missing.gschema.xml \ + schema-tests/override-range-error.gschema.xml \ + schema-tests/override-then-key.gschema.xml \ + schema-tests/override-twice.gschema.xml \ + schema-tests/override-type-error.gschema.xml \ + schema-tests/override.gschema.xml \ + schema-tests/range-badtype.gschema.xml \ + schema-tests/range-default-high.gschema.xml \ + schema-tests/range-default-low.gschema.xml \ + schema-tests/range-high-default.gschema.xml \ + schema-tests/range-low-default.gschema.xml \ + schema-tests/range-missing-max.gschema.xml \ + schema-tests/range-missing-min.gschema.xml \ + schema-tests/range-parse-error.gschema.xml \ + schema-tests/range-wrong-type.gschema.xml \ + schema-tests/range.gschema.xml \ + schema-tests/wrong-category.gschema.xml + +proxy_LDADD = $(LDADD) \ + $(top_builddir)/gthread/libgthread-2.0.la + +tls_certificate_SOURCES = tls-certificate.c gtesttlsbackend.c gtesttlsbackend.h + +# ----------------------------------------------------------------------------- + +if OS_UNIX +gdbus_example_objectmanager_server_CFLAGS = -I$(top_builddir)/gio/tests/gdbus-object-manager-example +gdbus_example_objectmanager_server_LDADD = $(top_builddir)/gio/tests/gdbus-object-manager-example/libgdbus-example-objectmanager.la $(LDADD) + +gdbus_example_objectmanager_client_CFLAGS = -I$(top_builddir)/gio/tests/gdbus-object-manager-example +gdbus_example_objectmanager_client_LDADD = $(top_builddir)/gio/tests/gdbus-object-manager-example/libgdbus-example-objectmanager.la $(LDADD) + +gdbus_peer_SOURCES = gdbus-peer.c gdbus-tests.h gdbus-tests.c +gdbus_peer_CFLAGS = -I$(top_builddir)/gio/tests/gdbus-object-manager-example +gdbus_peer_LDADD = $(top_builddir)/gio/tests/gdbus-object-manager-example/libgdbus-example-objectmanager.la $(LDADD) + +gdbus_test_fixture_SOURCES = gdbus-test-fixture.c +gdbus_test_fixture_CFLAGS = -I$(top_builddir)/gio/tests/gdbus-object-manager-example +gdbus_test_fixture_LDADD = $(top_builddir)/gio/tests/gdbus-object-manager-example/libgdbus-example-objectmanager.la $(LDADD) + +endif OS_UNIX + +# ----------------------------------------------------------------------------- + +EXTRA_DIST += \ + socket-common.c \ + org.gtk.test.gschema \ + org.gtk.test.gschema.xml \ + testenum.h \ + enums.xml.template \ + de.po \ + $(schema_tests) \ + org.gtk.schemasourcecheck.gschema.xml \ + appinfo-test.desktop \ + appinfo-test2.desktop \ + appinfo-test-gnome.desktop \ + appinfo-test-notgnome.desktop \ + test-codegen.xml \ + cert1.pem \ + cert2.pem \ + cert3.pem \ + key.pem \ + key8.pem \ + key-cert.pem \ + cert-key.pem \ + cert-list.pem \ + nothing.pem \ + test.gresource.xml \ + test1.txt \ + test2.gresource.xml \ + test2.txt \ + test3.gresource.xml \ + test3.txt \ + test4.gresource.xml \ + $(NULL) + +MISC_STUFF = test.mo test.gresource + +test.mo: de.po + $(MSGFMT) -o test.mo $(srcdir)/de.po; \ + $(MKDIR_P) de/LC_MESSAGES; \ + cp -f test.mo de/LC_MESSAGES + +if CROSS_COMPILING + glib_compile_resources=$(GLIB_COMPILE_RESOURCES) +else + glib_compile_resources=$(top_builddir)/gio/glib-compile-resources +endif + +BUILT_SOURCES += test_resources.c test_resources2.c test_resources2.h +test_resources.c: test2.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test2.gresource.xml) + $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate-source --c-name _g_test1 $< + +test_resources2.h test_resources2.c: test3.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test3.gresource.xml) + $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate --c-name _g_test2 --manual-register $< + +plugin_resources.c: test4.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test4.gresource.xml) + $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) --generate-source --c-name _g_plugin $< + +test.gresource: test.gresource.xml Makefile $(shell $(glib_compile_resources) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/test.gresource.xml) + $(AM_V_GEN) $(glib_compile_resources) --target=$@ --sourcedir=$(srcdir) $< + +noinst_LTLIBRARIES = libresourceplugin.la + +libresourceplugin_la_SOURCES = resourceplugin.c plugin_resources.c +libresourceplugin_la_LDFLAGS = -avoid-version -module $(no_undefined) -rpath $(libdir) +libresourceplugin_la_LIBADD = $(LDADD) + +CLEANFILES = gdbus-test-codegen-generated.[ch] gdbus-test-codegen-generated-doc-*.xml test_resources2.[ch] plugin_resources.c + +DISTCLEANFILES = \ + applications/mimeinfo.cache \ + org.gtk.test.enums.xml \ + de/LC_MESSAGES/test.mo \ + test.mo \ + test.gresource \ + test_resources.c \ + gsettings.store \ + gschemas.compiled \ + schema-source/gschemas.compiled + +distclean-local: + rm -rf xdgdatahome xdgdatadir diff --git a/gio/tests/actions.c b/gio/tests/actions.c new file mode 100644 index 0000000..74bcd9a --- /dev/null +++ b/gio/tests/actions.c @@ -0,0 +1,847 @@ +#include +#include + +#include "gdbus-sessionbus.h" + +typedef struct +{ + GVariant *params; + gboolean did_run; +} Activation; + +static void +activate (GAction *action, + GVariant *parameter, + gpointer user_data) +{ + Activation *activation = user_data; + + if (parameter) + activation->params = g_variant_ref (parameter); + else + activation->params = NULL; + activation->did_run = TRUE; +} + +static void +test_basic (void) +{ + Activation a = { 0, }; + GSimpleAction *action; + gchar *name; + GVariantType *parameter_type; + gboolean enabled; + GVariantType *state_type; + GVariant *state; + + action = g_simple_action_new ("foo", NULL); + g_assert (g_action_get_enabled (G_ACTION (action))); + g_assert (g_action_get_parameter_type (G_ACTION (action)) == NULL); + g_assert (g_action_get_state_type (G_ACTION (action)) == NULL); + g_assert (g_action_get_state_hint (G_ACTION (action)) == NULL); + g_assert (g_action_get_state (G_ACTION (action)) == NULL); + g_object_get (action, + "name", &name, + "parameter-type", ¶meter_type, + "enabled", &enabled, + "state-type", &state_type, + "state", &state, + NULL); + g_assert_cmpstr (name, ==, "foo"); + g_assert (parameter_type == NULL); + g_assert (enabled); + g_assert (state_type == NULL); + g_assert (state == NULL); + g_free (name); + + g_signal_connect (action, "activate", G_CALLBACK (activate), &a); + g_assert (!a.did_run); + g_action_activate (G_ACTION (action), NULL); + g_assert (a.did_run); + a.did_run = FALSE; + + g_simple_action_set_enabled (action, FALSE); + g_action_activate (G_ACTION (action), NULL); + g_assert (!a.did_run); + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*g_variant_is_of_type*failed*"); + g_action_activate (G_ACTION (action), g_variant_new_string ("xxx")); + g_test_assert_expected_messages (); + } + + g_object_unref (action); + g_assert (!a.did_run); + + action = g_simple_action_new ("foo", G_VARIANT_TYPE_STRING); + g_assert (g_action_get_enabled (G_ACTION (action))); + g_assert (g_variant_type_equal (g_action_get_parameter_type (G_ACTION (action)), G_VARIANT_TYPE_STRING)); + g_assert (g_action_get_state_type (G_ACTION (action)) == NULL); + g_assert (g_action_get_state_hint (G_ACTION (action)) == NULL); + g_assert (g_action_get_state (G_ACTION (action)) == NULL); + + g_signal_connect (action, "activate", G_CALLBACK (activate), &a); + g_assert (!a.did_run); + g_action_activate (G_ACTION (action), g_variant_new_string ("Hello world")); + g_assert (a.did_run); + g_assert_cmpstr (g_variant_get_string (a.params, NULL), ==, "Hello world"); + g_variant_unref (a.params); + a.did_run = FALSE; + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*failed*"); + g_action_activate (G_ACTION (action), NULL); + g_test_assert_expected_messages (); + } + + g_object_unref (action); + g_assert (!a.did_run); +} + +static gboolean +strv_has_string (gchar **haystack, + const gchar *needle) +{ + guint n; + + for (n = 0; haystack != NULL && haystack[n] != NULL; n++) + { + if (g_strcmp0 (haystack[n], needle) == 0) + return TRUE; + } + return FALSE; +} + +static gboolean +strv_strv_cmp (gchar **a, gchar **b) +{ + guint n; + + for (n = 0; a[n] != NULL; n++) + { + if (!strv_has_string (b, a[n])) + return FALSE; + } + + for (n = 0; b[n] != NULL; n++) + { + if (!strv_has_string (a, b[n])) + return FALSE; + } + + return TRUE; +} + +static gboolean +strv_set_equal (gchar **strv, ...) +{ + gint count; + va_list list; + const gchar *str; + gboolean res; + + res = TRUE; + count = 0; + va_start (list, strv); + while (1) + { + str = va_arg (list, const gchar *); + if (str == NULL) + break; + if (!strv_has_string (strv, str)) + { + res = FALSE; + break; + } + count++; + } + va_end (list); + + if (res) + res = g_strv_length ((gchar**)strv) == count; + + return res; +} + +static void +test_simple_group (void) +{ + GSimpleActionGroup *group; + Activation a = { 0, }; + GSimpleAction *simple; + GAction *action; + gchar **actions; + GVariant *state; + + simple = g_simple_action_new ("foo", NULL); + g_signal_connect (simple, "activate", G_CALLBACK (activate), &a); + g_assert (!a.did_run); + g_action_activate (G_ACTION (simple), NULL); + g_assert (a.did_run); + a.did_run = FALSE; + + group = g_simple_action_group_new (); + g_simple_action_group_insert (group, G_ACTION (simple)); + g_object_unref (simple); + + g_assert (!a.did_run); + g_action_group_activate_action (G_ACTION_GROUP (group), "foo", NULL); + g_assert (a.did_run); + + simple = g_simple_action_new_stateful ("bar", G_VARIANT_TYPE_STRING, g_variant_new_string ("hihi")); + g_simple_action_group_insert (group, G_ACTION (simple)); + g_object_unref (simple); + + g_assert (g_action_group_has_action (G_ACTION_GROUP (group), "foo")); + g_assert (g_action_group_has_action (G_ACTION_GROUP (group), "bar")); + g_assert (!g_action_group_has_action (G_ACTION_GROUP (group), "baz")); + actions = g_action_group_list_actions (G_ACTION_GROUP (group)); + g_assert_cmpint (g_strv_length (actions), ==, 2); + g_assert (strv_set_equal (actions, "foo", "bar", NULL)); + g_strfreev (actions); + g_assert (g_action_group_get_action_enabled (G_ACTION_GROUP (group), "foo")); + g_assert (g_action_group_get_action_enabled (G_ACTION_GROUP (group), "bar")); + g_assert (g_action_group_get_action_parameter_type (G_ACTION_GROUP (group), "foo") == NULL); + g_assert (g_variant_type_equal (g_action_group_get_action_parameter_type (G_ACTION_GROUP (group), "bar"), G_VARIANT_TYPE_STRING)); + g_assert (g_action_group_get_action_state_type (G_ACTION_GROUP (group), "foo") == NULL); + g_assert (g_variant_type_equal (g_action_group_get_action_state_type (G_ACTION_GROUP (group), "bar"), G_VARIANT_TYPE_STRING)); + g_assert (g_action_group_get_action_state_hint (G_ACTION_GROUP (group), "foo") == NULL); + g_assert (g_action_group_get_action_state_hint (G_ACTION_GROUP (group), "bar") == NULL); + g_assert (g_action_group_get_action_state (G_ACTION_GROUP (group), "foo") == NULL); + state = g_action_group_get_action_state (G_ACTION_GROUP (group), "bar"); + g_assert (g_variant_type_equal (g_variant_get_type (state), G_VARIANT_TYPE_STRING)); + g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "hihi"); + g_variant_unref (state); + + g_action_group_change_action_state (G_ACTION_GROUP (group), "bar", g_variant_new_string ("boo")); + state = g_action_group_get_action_state (G_ACTION_GROUP (group), "bar"); + g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "boo"); + g_variant_unref (state); + + action = g_simple_action_group_lookup (group, "bar"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + g_assert (!g_action_group_get_action_enabled (G_ACTION_GROUP (group), "bar")); + + g_simple_action_group_remove (group, "bar"); + action = g_simple_action_group_lookup (group, "foo"); + g_assert_cmpstr (g_action_get_name (action), ==, "foo"); + action = g_simple_action_group_lookup (group, "bar"); + g_assert (action == NULL); + + a.did_run = FALSE; + g_object_unref (group); + g_assert (!a.did_run); +} + +static void +test_stateful (void) +{ + GSimpleAction *action; + GVariant *state; + + action = g_simple_action_new_stateful ("foo", NULL, g_variant_new_string ("hihi")); + g_assert (g_action_get_enabled (G_ACTION (action))); + g_assert (g_action_get_parameter_type (G_ACTION (action)) == NULL); + g_assert (g_action_get_state_hint (G_ACTION (action)) == NULL); + g_assert (g_variant_type_equal (g_action_get_state_type (G_ACTION (action)), + G_VARIANT_TYPE_STRING)); + state = g_action_get_state (G_ACTION (action)); + g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "hihi"); + g_variant_unref (state); + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*g_variant_is_of_type*failed*"); + g_simple_action_set_state (action, g_variant_new_int32 (123)); + g_test_assert_expected_messages (); + } + + g_simple_action_set_state (action, g_variant_new_string ("hello")); + state = g_action_get_state (G_ACTION (action)); + g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "hello"); + g_variant_unref (state); + + g_object_unref (action); + + action = g_simple_action_new ("foo", NULL); + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*failed*"); + g_simple_action_set_state (action, g_variant_new_int32 (123)); + g_test_assert_expected_messages (); + } + + g_object_unref (action); +} + +static gboolean foo_activated = FALSE; +static gboolean bar_activated = FALSE; + +static void +activate_foo (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + g_assert (user_data == GINT_TO_POINTER (123)); + g_assert (parameter == NULL); + foo_activated = TRUE; +} + +static void +activate_bar (GSimpleAction *simple, + GVariant *parameter, + gpointer user_data) +{ + g_assert (user_data == GINT_TO_POINTER (123)); + g_assert_cmpstr (g_variant_get_string (parameter, NULL), ==, "param"); + bar_activated = TRUE; +} + +static void +change_volume_state (GSimpleAction *action, + GVariant *value, + gpointer user_data) +{ + gint requested; + + requested = g_variant_get_int32 (value); + + /* Volume only goes from 0 to 10 */ + if (0 <= requested && requested <= 10) + g_simple_action_set_state (action, value); +} + +static void +test_entries (void) +{ + const GActionEntry entries[] = { + { "foo", activate_foo }, + { "bar", activate_bar, "s" }, + { "toggle", NULL, NULL, "false" }, + { "volume", NULL, NULL, "0", change_volume_state } + }; + GSimpleActionGroup *actions; + GVariant *state; + + actions = g_simple_action_group_new (); + g_simple_action_group_add_entries (actions, entries, + G_N_ELEMENTS (entries), + GINT_TO_POINTER (123)); + + g_assert (!foo_activated); + g_action_group_activate_action (G_ACTION_GROUP (actions), "foo", NULL); + g_assert (foo_activated); + foo_activated = FALSE; + + g_assert (!bar_activated); + g_action_group_activate_action (G_ACTION_GROUP (actions), "bar", + g_variant_new_string ("param")); + g_assert (bar_activated); + g_assert (!foo_activated); + + if (g_test_undefined ()) + { + const GActionEntry bad_type = { + "bad-type", NULL, "ss" + }; + const GActionEntry bad_state = { + "bad-state", NULL, NULL, "flse" + }; + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*not a valid GVariant type string*"); + g_simple_action_group_add_entries (actions, &bad_type, 1, NULL); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*could not parse*"); + g_simple_action_group_add_entries (actions, &bad_state, 1, NULL); + g_test_assert_expected_messages (); + } + + state = g_action_group_get_action_state (G_ACTION_GROUP (actions), "volume"); + g_assert_cmpint (g_variant_get_int32 (state), ==, 0); + g_variant_unref (state); + + /* should change */ + g_action_group_change_action_state (G_ACTION_GROUP (actions), "volume", + g_variant_new_int32 (7)); + state = g_action_group_get_action_state (G_ACTION_GROUP (actions), "volume"); + g_assert_cmpint (g_variant_get_int32 (state), ==, 7); + g_variant_unref (state); + + /* should not change */ + g_action_group_change_action_state (G_ACTION_GROUP (actions), "volume", + g_variant_new_int32 (11)); + state = g_action_group_get_action_state (G_ACTION_GROUP (actions), "volume"); + g_assert_cmpint (g_variant_get_int32 (state), ==, 7); + g_variant_unref (state); + + g_object_unref (actions); +} + + +GHashTable *activation_counts; + +static void +count_activation (const gchar *action) +{ + gint count; + + if (activation_counts == NULL) + activation_counts = g_hash_table_new (g_str_hash, g_str_equal); + count = GPOINTER_TO_INT (g_hash_table_lookup (activation_counts, action)); + count++; + g_hash_table_insert (activation_counts, (gpointer)action, GINT_TO_POINTER (count)); +} + +static gint +activation_count (const gchar *action) +{ + if (activation_counts == NULL) + return 0; + + return GPOINTER_TO_INT (g_hash_table_lookup (activation_counts, action)); +} + +static void +activate_action (GSimpleAction *action, GVariant *parameter, gpointer user_data) +{ + count_activation (g_action_get_name (G_ACTION (action))); +} + +static void +activate_toggle (GSimpleAction *action, GVariant *parameter, gpointer user_data) +{ + GVariant *old_state, *new_state; + + count_activation (g_action_get_name (G_ACTION (action))); + + old_state = g_action_get_state (G_ACTION (action)); + new_state = g_variant_new_boolean (!g_variant_get_boolean (old_state)); + g_simple_action_set_state (action, new_state); + g_variant_unref (old_state); +} + +static void +activate_radio (GSimpleAction *action, GVariant *parameter, gpointer user_data) +{ + GVariant *new_state; + + count_activation (g_action_get_name (G_ACTION (action))); + + new_state = g_variant_new_string (g_variant_get_string (parameter, NULL)); + g_simple_action_set_state (action, new_state); +} + +static gboolean +compare_action_groups (GActionGroup *a, GActionGroup *b) +{ + gchar **alist; + gchar **blist; + gint i; + gboolean equal; + gboolean ares, bres; + gboolean aenabled, benabled; + const GVariantType *aparameter_type, *bparameter_type; + const GVariantType *astate_type, *bstate_type; + GVariant *astate_hint, *bstate_hint; + GVariant *astate, *bstate; + + alist = g_action_group_list_actions (a); + blist = g_action_group_list_actions (b); + equal = strv_strv_cmp (alist, blist); + + for (i = 0; equal && alist[i]; i++) + { + ares = g_action_group_query_action (a, alist[i], &aenabled, &aparameter_type, &astate_type, &astate_hint, &astate); + bres = g_action_group_query_action (b, alist[i], &benabled, &bparameter_type, &bstate_type, &bstate_hint, &bstate); + + if (ares && bres) + { + equal = equal && (aenabled == benabled); + equal = equal && ((!aparameter_type && !bparameter_type) || g_variant_type_equal (aparameter_type, bparameter_type)); + equal = equal && ((!astate_type && !bstate_type) || g_variant_type_equal (astate_type, bstate_type)); + equal = equal && ((!astate_hint && !bstate_hint) || g_variant_equal (astate_hint, bstate_hint)); + equal = equal && ((!astate && !bstate) || g_variant_equal (astate, bstate)); + + if (astate_hint) + g_variant_unref (astate_hint); + if (bstate_hint) + g_variant_unref (bstate_hint); + if (astate) + g_variant_unref (astate); + if (bstate) + g_variant_unref (bstate); + } + else + equal = FALSE; + } + + g_strfreev (alist); + g_strfreev (blist); + + return equal; +} + +static gboolean +stop_loop (gpointer data) +{ + GMainLoop *loop = data; + + g_main_loop_quit (loop); + + return G_SOURCE_REMOVE; +} + +static GActionEntry exported_entries[] = { + { "undo", activate_action, NULL, NULL, NULL }, + { "redo", activate_action, NULL, NULL, NULL }, + { "cut", activate_action, NULL, NULL, NULL }, + { "copy", activate_action, NULL, NULL, NULL }, + { "paste", activate_action, NULL, NULL, NULL }, + { "bold", activate_toggle, NULL, "true", NULL }, + { "lang", activate_radio, "s", "'latin'", NULL }, +}; + +static void +list_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *bus = G_DBUS_CONNECTION (source); + GMainLoop *loop = user_data; + GError *error = NULL; + GVariant *v; + gchar **actions; + + v = g_dbus_connection_call_finish (bus, res, &error); + g_assert (v); + g_variant_get (v, "(^a&s)", &actions); + g_assert_cmpint (g_strv_length (actions), ==, G_N_ELEMENTS (exported_entries)); + g_free (actions); + g_variant_unref (v); + g_main_loop_quit (loop); +} + +static gboolean +call_list (gpointer user_data) +{ + GDBusConnection *bus; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_dbus_connection_call (bus, + g_dbus_connection_get_unique_name (bus), + "/", + "org.gtk.Actions", + "List", + NULL, + NULL, + 0, + G_MAXINT, + NULL, + list_cb, + user_data); + g_object_unref (bus); + + return G_SOURCE_REMOVE; +} + +static void +describe_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *bus = G_DBUS_CONNECTION (source); + GMainLoop *loop = user_data; + GError *error = NULL; + GVariant *v; + gboolean enabled; + gchar *param; + GVariantIter *iter; + + v = g_dbus_connection_call_finish (bus, res, &error); + g_assert (v); + /* FIXME: there's an extra level of tuplelization in here */ + g_variant_get (v, "((bgav))", &enabled, ¶m, &iter); + g_assert (enabled == TRUE); + g_assert_cmpstr (param, ==, ""); + g_assert_cmpint (g_variant_iter_n_children (iter), ==, 0); + g_free (param); + g_variant_iter_free (iter); + g_variant_unref (v); + + g_main_loop_quit (loop); +} + +static gboolean +call_describe (gpointer user_data) +{ + GDBusConnection *bus; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_dbus_connection_call (bus, + g_dbus_connection_get_unique_name (bus), + "/", + "org.gtk.Actions", + "Describe", + g_variant_new ("(s)", "copy"), + NULL, + 0, + G_MAXINT, + NULL, + describe_cb, + user_data); + g_object_unref (bus); + + return G_SOURCE_REMOVE; +} + +static void +test_dbus_export (void) +{ + GDBusConnection *bus; + GSimpleActionGroup *group; + GDBusActionGroup *proxy; + GSimpleAction *action; + GMainLoop *loop; + GError *error = NULL; + GVariant *v; + guint id; + gchar **actions; + + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + group = g_simple_action_group_new (); + g_simple_action_group_add_entries (group, + exported_entries, + G_N_ELEMENTS (exported_entries), + NULL); + + id = g_dbus_connection_export_action_group (bus, "/", G_ACTION_GROUP (group), &error); + g_assert_no_error (error); + + proxy = g_dbus_action_group_get (bus, g_dbus_connection_get_unique_name (bus), "/"); + + actions = g_action_group_list_actions (G_ACTION_GROUP (proxy)); + g_assert_cmpint (g_strv_length (actions), ==, 0); + g_strfreev (actions); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + actions = g_action_group_list_actions (G_ACTION_GROUP (proxy)); + g_assert_cmpint (g_strv_length (actions), ==, G_N_ELEMENTS (exported_entries)); + g_strfreev (actions); + + /* check that calling "List" works too */ + g_idle_add (call_list, loop); + g_main_loop_run (loop); + + /* check that calling "Describe" works */ + g_idle_add (call_describe, loop); + g_main_loop_run (loop); + + /* test that the initial transfer works */ + g_assert (G_IS_DBUS_ACTION_GROUP (proxy)); + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + /* test that various changes get propagated from group to proxy */ + action = g_simple_action_new_stateful ("italic", NULL, g_variant_new_boolean (FALSE)); + g_simple_action_group_insert (group, G_ACTION (action)); + g_object_unref (action); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + action = G_SIMPLE_ACTION (g_simple_action_group_lookup (group, "cut")); + g_simple_action_set_enabled (action, FALSE); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + action = G_SIMPLE_ACTION (g_simple_action_group_lookup (group, "bold")); + g_simple_action_set_state (action, g_variant_new_boolean (FALSE)); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + g_simple_action_group_remove (group, "italic"); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + /* test that activations and state changes propagate the other way */ + + g_assert_cmpint (activation_count ("copy"), ==, 0); + g_action_group_activate_action (G_ACTION_GROUP (proxy), "copy", NULL); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (activation_count ("copy"), ==, 1); + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + + g_assert_cmpint (activation_count ("bold"), ==, 0); + g_action_group_activate_action (G_ACTION_GROUP (proxy), "bold", NULL); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (activation_count ("bold"), ==, 1); + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + v = g_action_group_get_action_state (G_ACTION_GROUP (group), "bold"); + g_assert (g_variant_get_boolean (v)); + g_variant_unref (v); + + g_action_group_change_action_state (G_ACTION_GROUP (proxy), "bold", g_variant_new_boolean (FALSE)); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (activation_count ("bold"), ==, 1); + g_assert (compare_action_groups (G_ACTION_GROUP (group), G_ACTION_GROUP (proxy))); + v = g_action_group_get_action_state (G_ACTION_GROUP (group), "bold"); + g_assert (!g_variant_get_boolean (v)); + g_variant_unref (v); + + g_dbus_connection_unexport_action_group (bus, id); + + g_object_unref (proxy); + g_object_unref (group); + g_main_loop_unref (loop); + g_object_unref (bus); + + session_bus_down (); +} + +static gpointer +do_export (gpointer data) +{ + GActionGroup *group = data; + GMainContext *ctx; + gint i; + GError *error = NULL; + guint id; + GDBusConnection *bus; + GAction *action; + gchar *path; + + ctx = g_main_context_new (); + + g_main_context_push_thread_default (ctx); + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + path = g_strdup_printf("/%p", data); + + for (i = 0; i < 100000; i++) + { + id = g_dbus_connection_export_action_group (bus, path, G_ACTION_GROUP (group), &error); + g_assert_no_error (error); + + action = g_simple_action_group_lookup (G_SIMPLE_ACTION_GROUP (group), "a"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + !g_action_get_enabled (action)); + + g_dbus_connection_unexport_action_group (bus, id); + + while (g_main_context_iteration (ctx, FALSE)); + } + + g_free (path); + g_object_unref (bus); + + g_main_context_pop_thread_default (ctx); + + g_main_context_unref (ctx); + + return NULL; +} + +static void +test_dbus_threaded (void) +{ + GSimpleActionGroup *group[10]; + GThread *export[10]; + static GActionEntry entries[] = { + { "a", activate_action, NULL, NULL, NULL }, + { "b", activate_action, NULL, NULL, NULL }, + }; + gint i; + + session_bus_up (); + + for (i = 0; i < 10; i++) + { + group[i] = g_simple_action_group_new (); + g_simple_action_group_add_entries (group[i], entries, G_N_ELEMENTS (entries), NULL); + export[i] = g_thread_new ("export", do_export, group[i]); + } + + for (i = 0; i < 10; i++) + g_thread_join (export[i]); + + for (i = 0; i < 10; i++) + g_object_unref (group[i]); + + session_bus_down (); +} + +static void +test_bug679509 (void) +{ + GDBusConnection *bus; + GDBusActionGroup *proxy; + GMainLoop *loop; + + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + proxy = g_dbus_action_group_get (bus, g_dbus_connection_get_unique_name (bus), "/"); + g_strfreev (g_action_group_list_actions (G_ACTION_GROUP (proxy))); + g_object_unref (proxy); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_main_loop_unref (loop); + g_object_unref (bus); + + session_bus_down (); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/actions/basic", test_basic); + g_test_add_func ("/actions/simplegroup", test_simple_group); + g_test_add_func ("/actions/stateful", test_stateful); + g_test_add_func ("/actions/entries", test_entries); + g_test_add_func ("/actions/dbus/export", test_dbus_export); + g_test_add_func ("/actions/dbus/threaded", test_dbus_threaded); + g_test_add_func ("/actions/dbus/bug679509", test_bug679509); + + return g_test_run (); +} diff --git a/gio/tests/appinfo-test-gnome.desktop b/gio/tests/appinfo-test-gnome.desktop new file mode 100644 index 0000000..9e3b428 --- /dev/null +++ b/gio/tests/appinfo-test-gnome.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=appinfo-test +Exec=./appinfo-test --option +OnlyShowIn=GNOME;KDE; +NotShowIn=ROX; diff --git a/gio/tests/appinfo-test-notgnome.desktop b/gio/tests/appinfo-test-notgnome.desktop new file mode 100644 index 0000000..2f7c11d --- /dev/null +++ b/gio/tests/appinfo-test-notgnome.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=appinfo-test +Exec=./appinfo-test --option +OnlyShowIn=KDE; +NotShowIn=GNOME; diff --git a/gio/tests/appinfo-test.c b/gio/tests/appinfo-test.c new file mode 100644 index 0000000..9d6a5ff --- /dev/null +++ b/gio/tests/appinfo-test.c @@ -0,0 +1,20 @@ +#include +#include + +int +main (int argc, char *argv[]) +{ + const gchar *envvar; + gint pid_from_env; + + envvar = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE_PID"); + g_assert (envvar != NULL); + pid_from_env = atoi (envvar); + g_assert_cmpint (pid_from_env, ==, getpid ()); + + envvar = g_getenv ("GIO_LAUNCHED_DESKTOP_FILE"); + g_assert_cmpstr (envvar, ==, SRCDIR "/appinfo-test.desktop"); + + return 0; +} + diff --git a/gio/tests/appinfo-test.desktop b/gio/tests/appinfo-test.desktop new file mode 100644 index 0000000..6c9a85c --- /dev/null +++ b/gio/tests/appinfo-test.desktop @@ -0,0 +1,17 @@ +[Desktop Entry] +Type=Application +GenericName=generic-appinfo-test +Name=appinfo-test +Name[de]=appinfo-test-de +X-GNOME-FullName=example +X-GNOME-FullName[de]=Beispiel +Comment=GAppInfo example +Comment[de]=GAppInfo Beispiel +Exec=./appinfo-test --option %U %i --name %c --filename %k %m %% +Icon=testicon.svg +Terminal=true +StartupNotify=true +StartupWMClass=appinfo-class +MimeType=image/png;image/jpeg; +Keywords=keyword1;test keyword; +Categories=GNOME;GTK; diff --git a/gio/tests/appinfo-test2.desktop b/gio/tests/appinfo-test2.desktop new file mode 100644 index 0000000..1f55393 --- /dev/null +++ b/gio/tests/appinfo-test2.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=appinfo-test +Name[de]=appinfo-test-de +X-GNOME-FullName=example +X-GNOME-FullName[de]=Beispiel +Comment=GAppInfo example +Comment[de]=GAppInfo Beispiel +Exec=./appinfo-test --option +TryExec=does-not-exist +Icon=testicon diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c new file mode 100644 index 0000000..8c53212 --- /dev/null +++ b/gio/tests/appinfo.c @@ -0,0 +1,449 @@ + +#include + +#include +#include + +static void +test_launch (void) +{ + GAppInfo *appinfo; + GError *error; + GFile *file; + GList *l; + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + g_assert (appinfo != NULL); + + error = NULL; + g_assert (g_app_info_launch (appinfo, NULL, NULL, &error)); + g_assert_no_error (error); + + g_assert (g_app_info_launch_uris (appinfo, NULL, NULL, &error)); + g_assert_no_error (error); + + file = g_file_new_for_path (SRCDIR "/appinfo-test.desktop"); + l = NULL; + l = g_list_append (l, file); + + g_assert (g_app_info_launch (appinfo, l, NULL, &error)); + g_assert_no_error (error); + g_list_free (l); + g_object_unref (file); + + l = NULL; + l = g_list_append (l, "file://" SRCDIR "/appinfo-test.desktop"); + l = g_list_append (l, "file:///etc/group#adm"); + + g_assert (g_app_info_launch_uris (appinfo, l, NULL, &error)); + g_assert_no_error (error); + g_list_free (l); + + g_object_unref (appinfo); +} + +static void +test_locale (const char *locale) +{ + GAppInfo *appinfo; + const gchar *orig; + + orig = setlocale (LC_ALL, NULL); + g_setenv ("LANGUAGE", locale, TRUE); + setlocale (LC_ALL, ""); + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + + if (g_strcmp0 (locale, "C") == 0) + { + g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test"); + g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo example"); + g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "example"); + } + else if (g_str_has_prefix (locale, "en")) + { + g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test"); + g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo example"); + g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "example"); + } + else if (g_str_has_prefix (locale, "de")) + { + g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test-de"); + g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo Beispiel"); + g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "Beispiel"); + } + + g_object_unref (appinfo); + + g_setenv ("LANGUAGE", orig, TRUE); + setlocale (LC_ALL, ""); +} + +static void +test_text (void) +{ + test_locale ("C"); + test_locale ("en_US"); + test_locale ("de"); + test_locale ("de_DE.UTF-8"); +} + +static void +test_basic (void) +{ + GAppInfo *appinfo; + GAppInfo *appinfo2; + GIcon *icon, *icon2; + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + + g_assert (g_app_info_get_id (appinfo) == NULL); + g_assert_cmpstr (g_app_info_get_executable (appinfo), ==, "./appinfo-test"); + + icon = g_app_info_get_icon (appinfo); + g_assert (G_IS_THEMED_ICON (icon)); + icon2 = g_themed_icon_new ("testicon"); + g_assert (g_icon_equal (icon, icon2)); + g_object_unref (icon2); + + appinfo2 = g_app_info_dup (appinfo); + g_assert (g_app_info_get_id (appinfo) == g_app_info_get_id (appinfo2)); + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); + + g_object_unref (appinfo); + g_object_unref (appinfo2); +} + +static void +test_show_in (void) +{ + GAppInfo *appinfo; + + g_desktop_app_info_set_desktop_env ("GNOME"); + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + g_assert (g_app_info_should_show (appinfo)); + g_object_unref (appinfo); + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test-gnome.desktop"); + g_assert (g_app_info_should_show (appinfo)); + g_object_unref (appinfo); + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test-notgnome.desktop"); + g_assert (!g_app_info_should_show (appinfo)); + g_object_unref (appinfo); +} + +static void +test_commandline (void) +{ + GAppInfo *appinfo; + GError *error; + + error = NULL; + appinfo = g_app_info_create_from_commandline ("./appinfo-test --option", + "cmdline-app-test", + G_APP_INFO_CREATE_SUPPORTS_URIS, + &error); + g_assert (appinfo != NULL); + g_assert_no_error (error); + g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "cmdline-app-test"); + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, "./appinfo-test --option %u"); + g_assert (g_app_info_supports_uris (appinfo)); + g_assert (!g_app_info_supports_files (appinfo)); + + g_object_unref (appinfo); + + error = NULL; + appinfo = g_app_info_create_from_commandline ("./appinfo-test --option", + "cmdline-app-test", + G_APP_INFO_CREATE_NONE, + &error); + g_assert (appinfo != NULL); + g_assert_no_error (error); + g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "cmdline-app-test"); + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, "./appinfo-test --option %f"); + g_assert (!g_app_info_supports_uris (appinfo)); + g_assert (g_app_info_supports_files (appinfo)); + + g_object_unref (appinfo); +} + +static void +test_launch_context (void) +{ + GAppLaunchContext *context; + GAppInfo *appinfo; + gchar *str; + + context = g_app_launch_context_new (); + appinfo = g_app_info_create_from_commandline ("./appinfo-test --option", + "cmdline-app-test", + G_APP_INFO_CREATE_SUPPORTS_URIS, + NULL); + + str = g_app_launch_context_get_display (context, appinfo, NULL); + g_assert (str == NULL); + + str = g_app_launch_context_get_startup_notify_id (context, appinfo, NULL); + g_assert (str == NULL); + + g_object_unref (appinfo); + g_object_unref (context); +} + +static gboolean launched_reached; + +static void +launched (GAppLaunchContext *context, + GAppInfo *info, + GVariant *platform_data, + gpointer user_data) +{ + gint pid; + + pid = 0; + g_assert (g_variant_lookup (platform_data, "pid", "i", &pid)); + g_assert (pid != 0); + + launched_reached = TRUE; +} + +static void +launch_failed (GAppLaunchContext *context, + const gchar *startup_notify_id) +{ + g_assert_not_reached (); +} + +static void +test_launch_context_signals (void) +{ + GAppLaunchContext *context; + GAppInfo *appinfo; + GError *error = NULL; + + context = g_app_launch_context_new (); + g_signal_connect (context, "launched", G_CALLBACK (launched), NULL); + g_signal_connect (context, "launch_failed", G_CALLBACK (launch_failed), NULL); + appinfo = g_app_info_create_from_commandline ("./appinfo-test --option", + "cmdline-app-test", + G_APP_INFO_CREATE_SUPPORTS_URIS, + NULL); + + error = NULL; + g_assert (g_app_info_launch (appinfo, NULL, context, &error)); + g_assert_no_error (error); + + g_assert (launched_reached); + + g_object_unref (appinfo); + g_object_unref (context); +} + +static void +test_tryexec (void) +{ + GAppInfo *appinfo; + + appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test2.desktop"); + + g_assert (appinfo == NULL); +} + +/* Test that we can set an appinfo as default for a mime type or + * file extension, and also add and remove handled mime types. + */ +static void +test_associations (void) +{ + GAppInfo *appinfo; + GAppInfo *appinfo2; + GError *error; + gboolean result; + GList *list; + + appinfo = g_app_info_create_from_commandline ("./appinfo-test --option", + "cmdline-app-test", + G_APP_INFO_CREATE_SUPPORTS_URIS, + NULL); + + error = NULL; + result = g_app_info_set_as_default_for_type (appinfo, "application/x-glib-test", &error); + + g_assert (result); + g_assert_no_error (error); + + appinfo2 = g_app_info_get_default_for_type ("application/x-glib-test", FALSE); + + g_assert (appinfo2); + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); + + g_object_unref (appinfo2); + + result = g_app_info_set_as_default_for_extension (appinfo, "gio-tests", &error); + g_assert (result); + g_assert_no_error (error); + + appinfo2 = g_app_info_get_default_for_type ("application/x-extension-gio-tests", FALSE); + + g_assert (appinfo2); + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); + + g_object_unref (appinfo2); + + result = g_app_info_add_supports_type (appinfo, "application/x-gio-test", &error); + g_assert (result); + g_assert_no_error (error); + + list = g_app_info_get_all_for_type ("application/x-gio-test"); + g_assert_cmpint (g_list_length (list), ==, 1); + appinfo2 = list->data; + g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); + g_object_unref (appinfo2); + g_list_free (list); + + g_assert (g_app_info_can_remove_supports_type (appinfo)); + g_assert (g_app_info_remove_supports_type (appinfo, "application/x-gio-test", &error)); + g_assert_no_error (error); + + g_assert (g_app_info_can_delete (appinfo)); + g_assert (g_app_info_delete (appinfo)); + g_object_unref (appinfo); +} + +static void +test_environment (void) +{ + GAppLaunchContext *ctx; + gchar **env; + const gchar *path; + + g_unsetenv ("FOO"); + g_unsetenv ("BLA"); + path = g_getenv ("PATH"); + + ctx = g_app_launch_context_new (); + + env = g_app_launch_context_get_environment (ctx); + + g_assert (g_environ_getenv (env, "FOO") == NULL); + g_assert (g_environ_getenv (env, "BAR") == NULL); + g_assert_cmpstr (g_environ_getenv (env, "PATH"), ==, path); + + g_strfreev (env); + + g_app_launch_context_setenv (ctx, "FOO", "bar"); + g_app_launch_context_setenv (ctx, "BLA", "bla"); + + env = g_app_launch_context_get_environment (ctx); + + g_assert_cmpstr (g_environ_getenv (env, "FOO"), ==, "bar"); + g_assert_cmpstr (g_environ_getenv (env, "BLA"), ==, "bla"); + g_assert_cmpstr (g_environ_getenv (env, "PATH"), ==, path); + + g_strfreev (env); + + g_app_launch_context_setenv (ctx, "FOO", "baz"); + g_app_launch_context_unsetenv (ctx, "BLA"); + + env = g_app_launch_context_get_environment (ctx); + + g_assert_cmpstr (g_environ_getenv (env, "FOO"), ==, "baz"); + g_assert (g_environ_getenv (env, "BLA") == NULL); + + g_strfreev (env); + + g_object_unref (ctx); +} + +static void +test_startup_wm_class (void) +{ + GDesktopAppInfo *appinfo; + const char *wm_class; + + appinfo = g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + wm_class = g_desktop_app_info_get_startup_wm_class (appinfo); + + g_assert_cmpstr (wm_class, ==, "appinfo-class"); + + g_object_unref (appinfo); +} + +static void +test_supported_types (void) +{ + GAppInfo *appinfo; + const char * const *content_types; + + appinfo = G_APP_INFO (g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop")); + content_types = g_app_info_get_supported_types (appinfo); + + g_assert_cmpint (g_strv_length ((char**)content_types), ==, 2); + g_assert_cmpstr (content_types[0], ==, "image/png"); + + g_object_unref (appinfo); +} + +static void +test_from_keyfile (void) +{ + GDesktopAppInfo *info; + GKeyFile *kf; + GError *error = NULL; + const gchar *categories; + gchar **keywords; + const gchar *file; + const gchar *name; + + kf = g_key_file_new (); + g_key_file_load_from_file (kf, + SRCDIR "/appinfo-test.desktop", + G_KEY_FILE_NONE, + &error); + g_assert_no_error (error); + info = g_desktop_app_info_new_from_keyfile (kf); + g_key_file_free (kf); + g_assert (info != NULL); + + g_object_get (info, "filename", &file, NULL); + g_assert (file == NULL); + + file = g_desktop_app_info_get_filename (info); + g_assert (file == NULL); + categories = g_desktop_app_info_get_categories (info); + g_assert_cmpstr (categories, ==, "GNOME;GTK;"); + keywords = (gchar **)g_desktop_app_info_get_keywords (info); + g_assert_cmpint (g_strv_length (keywords), ==, 2); + g_assert_cmpstr (keywords[0], ==, "keyword1"); + g_assert_cmpstr (keywords[1], ==, "test keyword"); + name = g_desktop_app_info_get_generic_name (info); + g_assert_cmpstr (name, ==, "generic-appinfo-test"); + g_assert (!g_desktop_app_info_get_nodisplay (info)); + + g_object_unref (info); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/appinfo/basic", test_basic); + g_test_add_func ("/appinfo/text", test_text); + g_test_add_func ("/appinfo/launch", test_launch); + g_test_add_func ("/appinfo/show-in", test_show_in); + g_test_add_func ("/appinfo/commandline", test_commandline); + g_test_add_func ("/appinfo/launch-context", test_launch_context); + g_test_add_func ("/appinfo/launch-context-signals", test_launch_context_signals); + g_test_add_func ("/appinfo/tryexec", test_tryexec); + g_test_add_func ("/appinfo/associations", test_associations); + g_test_add_func ("/appinfo/environment", test_environment); + g_test_add_func ("/appinfo/startup-wm-class", test_startup_wm_class); + g_test_add_func ("/appinfo/supported-types", test_supported_types); + g_test_add_func ("/appinfo/from-keyfile", test_from_keyfile); + + return g_test_run (); +} + diff --git a/gio/tests/async-close-output-stream.c b/gio/tests/async-close-output-stream.c new file mode 100644 index 0000000..507214c --- /dev/null +++ b/gio/tests/async-close-output-stream.c @@ -0,0 +1,283 @@ +/* GLib testing framework examples and tests + * Authors: Jesse van den Kieboom + * + * 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 DATA_TO_WRITE "Hello world\n" + +typedef struct +{ + GOutputStream *conv_stream; + GOutputStream *data_stream; + gchar *expected_output; + gsize expected_size; + GMainLoop *main_loop; +} SetupData; + +static void +create_streams (SetupData *data) +{ + GConverter *converter; + + converter = G_CONVERTER (g_zlib_compressor_new (G_ZLIB_COMPRESSOR_FORMAT_GZIP, -1)); + + data->data_stream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + data->conv_stream = g_converter_output_stream_new (data->data_stream, + converter); + + g_object_unref (converter); +} + +static void +destroy_streams (SetupData *data) +{ + g_object_unref (data->data_stream); + g_object_unref (data->conv_stream); +} + +static void +write_data_to_stream (SetupData *data) +{ + gsize bytes_written; + GError *error = NULL; + + /* just write the data synchronously */ + g_output_stream_write_all (data->conv_stream, + DATA_TO_WRITE, + sizeof (DATA_TO_WRITE), + &bytes_written, + NULL, + &error); + + g_assert_no_error (error); + g_assert_cmpint (sizeof (DATA_TO_WRITE), ==, bytes_written); +} + +static void +setup_data (SetupData *data, + gconstpointer user_data) +{ + data->main_loop = g_main_loop_new (NULL, FALSE); + create_streams (data); +} + +static void +teardown_data (SetupData *data, + gconstpointer user_data) +{ + /* cleanup */ + g_main_loop_unref (data->main_loop); + + destroy_streams (data); + + g_free (data->expected_output); +} + +static void +compare_output (SetupData *data) +{ + gsize size; + gpointer written; + + size = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (data->data_stream)); + + /* compare the size of the data */ + g_assert_cmpint (size, ==, data->expected_size); + + written = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->data_stream)); + + /* compare the data itself */ + g_assert (memcmp (written, data->expected_output, size) == 0); +} + +static void +async_close_ready (GOutputStream *stream, + GAsyncResult *result, + SetupData *data) +{ + GError *error = NULL; + + /* finish the close */ + g_output_stream_close_finish (stream, result, &error); + + g_assert_no_error (error); + + /* compare the output with the desired output */ + compare_output (data); + + g_main_loop_quit (data->main_loop); +} + +static void +prepare_data (SetupData *data, + gboolean manual_flush) +{ + GError *error = NULL; + gpointer written; + + write_data_to_stream (data); + + if (manual_flush) + { + g_output_stream_flush (data->conv_stream, NULL, &error); + g_assert_no_error (error); + } + + g_output_stream_close (data->conv_stream, NULL, &error); + + g_assert_no_error (error); + + written = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (data->data_stream)); + + data->expected_size = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (data->data_stream)); + + g_assert_cmpint (data->expected_size, >, 0); + + data->expected_output = g_memdup (written, (guint)data->expected_size); + + /* then recreate the streams and prepare them for the asynchronous close */ + destroy_streams (data); + create_streams (data); + + write_data_to_stream (data); +} + +static void +test_without_flush (SetupData *data, + gconstpointer user_data) +{ + prepare_data (data, FALSE); + + g_test_bug ("617937"); + + /* just close asynchronously */ + g_output_stream_close_async (data->conv_stream, + G_PRIORITY_DEFAULT, + NULL, + (GAsyncReadyCallback)async_close_ready, + data); + + g_main_loop_run (data->main_loop); +} + +static void +test_with_flush (SetupData *data, gconstpointer user_data) +{ + GError *error = NULL; + + g_test_bug ("617937"); + + prepare_data (data, TRUE); + + g_output_stream_flush (data->conv_stream, NULL, &error); + + g_assert_no_error (error); + + /* then close asynchronously */ + g_output_stream_close_async (data->conv_stream, + G_PRIORITY_DEFAULT, + NULL, + (GAsyncReadyCallback)async_close_ready, + data); + + g_main_loop_run (data->main_loop); +} + +static void +async_flush_ready (GOutputStream *stream, + GAsyncResult *result, + SetupData *data) +{ + GError *error = NULL; + + g_output_stream_flush_finish (stream, result, &error); + + g_assert_no_error (error); + + /* then close async after the flush */ + g_output_stream_close_async (data->conv_stream, + G_PRIORITY_DEFAULT, + NULL, + (GAsyncReadyCallback)async_close_ready, + data); +} + +static void +test_with_async_flush (SetupData *data, + gconstpointer user_data) +{ + g_test_bug ("617937"); + + prepare_data (data, TRUE); + + /* first flush async */ + g_output_stream_flush_async (data->conv_stream, + G_PRIORITY_DEFAULT, + NULL, + (GAsyncReadyCallback)async_flush_ready, + data); + + g_main_loop_run (data->main_loop); +} + +int +main (int argc, + char *argv[]) +{ + SetupData *data; + + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + data = g_slice_new (SetupData); + + /* test closing asynchronously without flushing manually */ + g_test_add ("/close-async/without-flush", + SetupData, + data, + setup_data, + test_without_flush, + teardown_data); + + /* test closing asynchronously with a synchronous manually flush */ + g_test_add ("/close-async/with-flush", + SetupData, + data, + setup_data, + test_with_flush, + teardown_data); + + /* test closing asynchronously with an asynchronous manually flush */ + g_test_add ("/close-async/with-async-flush", + SetupData, + data, + setup_data, + test_with_async_flush, + teardown_data); + + g_slice_free (SetupData, data); + + return g_test_run(); +} diff --git a/gio/tests/basic-application.c b/gio/tests/basic-application.c new file mode 100644 index 0000000..60c979d --- /dev/null +++ b/gio/tests/basic-application.c @@ -0,0 +1,83 @@ +#include +#include + +static void +activate (GApplication *application) +{ + g_application_hold (application); + g_print ("activated\n"); + g_application_release (application); +} + +static void +open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint) +{ + gint i; + + g_application_hold (application); + g_print ("open"); + + for (i = 0; i < n_files; i++) + { + gchar *uri = g_file_get_uri (files[i]); + g_print (" %s", uri); + g_free (uri); + } + g_application_release (application); + + g_print ("\n"); +} + +static int +command_line (GApplication *application, + GApplicationCommandLine *cmdline) +{ + gchar **argv; + gint argc; + + argv = g_application_command_line_get_arguments (cmdline, &argc); + + g_application_command_line_print (cmdline, "%d + %d = %d\n", 40, 2, 42); + + g_assert_cmpint (argc, ==, 3); + g_assert_cmpstr (argv[0], ==, "./cmd"); + g_assert_cmpstr (argv[1], ==, "40 +"); + g_assert_cmpstr (argv[2], ==, "2"); + g_assert (argv[3] == NULL); + g_print ("cmdline '%s' '%s'\n", argv[1], argv[2]); + g_strfreev (argv); + + return 42; +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = g_application_new ("org.gtk.TestApplication", + G_APPLICATION_SEND_ENVIRONMENT | + G_APPLICATION_HANDLES_OPEN | + (g_strcmp0 (argv[1], "./cmd") == 0 ? + G_APPLICATION_HANDLES_COMMAND_LINE + : 0)); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + g_signal_connect (app, "open", G_CALLBACK (open), NULL); + g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL); +#ifdef STANDALONE + g_application_set_inactivity_timeout (app, 10000); +#else + g_application_set_inactivity_timeout (app, 1000); +#endif + status = g_application_run (app, argc - 1, argv + 1); + + g_object_unref (app); + + g_print ("exit status: %d\n", status); + + return 0; +} diff --git a/gio/tests/buffered-input-stream.c b/gio/tests/buffered-input-stream.c new file mode 100644 index 0000000..ef865fc --- /dev/null +++ b/gio/tests/buffered-input-stream.c @@ -0,0 +1,553 @@ +/* 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), 5, NULL, NULL); + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 5); + g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), -1, NULL, NULL); + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, strlen ("abcdefjhijk")); + + 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); + g_object_unref (base); +} + +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); + g_object_unref (base); +} + +static void +test_set_buffer_size (void) +{ + GInputStream *base; + GInputStream *in; + guint bufsize_prop; + gsize size, bufsize; + + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + in = g_buffered_input_stream_new (base); + size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in)); + g_assert_cmpint (size, ==, 4096); + + 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_get (in, "buffer-size", &bufsize_prop, NULL); + g_assert_cmpint (bufsize_prop, ==, bufsize); + + g_object_unref (in); + + in = g_buffered_input_stream_new_sized (base, 64); + size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in)); + g_assert_cmpint (size, ==, 64); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_read_byte (void) +{ + GInputStream *base; + GInputStream *in; + GError *error; + + g_test_bug ("562393"); + + base = g_memory_input_stream_new_from_data ("abcdefgh", -1, NULL); + in = g_buffered_input_stream_new (base); + + error = NULL; + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c'); + g_assert_no_error (error); + + g_assert_cmpint (g_input_stream_skip (in, 3, NULL, &error), ==, 3); + g_assert_no_error (error); + + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'g'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'h'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1); + g_assert_no_error (error); + + g_assert (g_input_stream_close (in, NULL, &error)); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + g_error_free (error); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_read (void) +{ + GInputStream *base; + GInputStream *in; + gchar buffer[20]; + GError *error; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 8); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0); + + error = NULL; + g_assert_cmpint (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 8, NULL, &error), ==, 8); + g_assert_no_error (error); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8); + + memset (buffer, 0, 20); + g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "abcdefghijklmnop"); + g_assert_no_error (error); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0); + + memset (buffer, 0, 20); + g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF"); + g_assert_no_error (error); + + memset (buffer, 0, 20); + g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV"); + g_assert_no_error (error); + + memset (buffer, 0, 20); + g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 4); + g_assert_cmpstr (buffer, ==, "WXYZ"); + g_assert_no_error (error); + + memset (buffer, 0, 20); + g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 0); + g_assert_no_error (error); + + g_object_unref (in); + g_object_unref (base); +} + +static void +return_result_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **ret = user_data; + + *ret = g_object_ref (result); +} + +static void +test_read_async (void) +{ + GInputStream *base; + GInputStream *in; + gchar buffer[20]; + GError *error; + GAsyncResult *result; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 8); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0); + + error = NULL; + result = NULL; + g_buffered_input_stream_fill_async (G_BUFFERED_INPUT_STREAM (in), 8, + G_PRIORITY_DEFAULT, NULL, + return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_buffered_input_stream_fill_finish (G_BUFFERED_INPUT_STREAM (in), result, &error), ==, 8); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8); + + memset (buffer, 0, 20); + g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "abcdefghijklmnop"); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0); + + memset (buffer, 0, 20); + g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF"); + g_assert_no_error (error); + g_clear_object (&result); + + memset (buffer, 0, 20); + g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16); + g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV"); + g_assert_no_error (error); + g_clear_object (&result); + + memset (buffer, 0, 20); + g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 4); + g_assert_cmpstr (buffer, ==, "WXYZ"); + g_assert_no_error (error); + g_clear_object (&result); + + memset (buffer, 0, 20); + g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 0); + g_assert_no_error (error); + g_clear_object (&result); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_skip (void) +{ + GInputStream *base; + GInputStream *in; + GError *error; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 5); + + error = NULL; + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c'); + g_assert_no_error (error); + + g_assert_cmpint (g_input_stream_skip (in, 7, NULL, &error), ==, 7); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k'); + g_assert_no_error (error); + + g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 10); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v'); + g_assert_no_error (error); + + g_assert_cmpint (g_input_stream_skip (in, 20, NULL, &error), ==, 20); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q'); + g_assert_no_error (error); + + g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 8); + g_assert_no_error (error); + g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 0); + g_assert_no_error (error); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_skip_async (void) +{ + GInputStream *base; + GInputStream *in; + GError *error; + GAsyncResult *result; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 5); + + error = NULL; + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b'); + g_assert_no_error (error); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c'); + g_assert_no_error (error); + + result = NULL; + g_input_stream_skip_async (in, 7, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 7); + g_assert_no_error (error); + g_clear_object (&result); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k'); + g_assert_no_error (error); + + g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 10); + g_assert_no_error (error); + g_clear_object (&result); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v'); + g_assert_no_error (error); + + g_input_stream_skip_async (in, 20, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 20); + g_assert_no_error (error); + g_clear_object (&result); + g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q'); + g_assert_no_error (error); + + g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 8); + g_clear_object (&result); + g_assert_no_error (error); + + g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + while (!result) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 0); + g_clear_object (&result); + g_assert_no_error (error); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_close (void) +{ + GInputStream *base; + GInputStream *in; + GError *error; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL); + in = g_buffered_input_stream_new (base); + + g_assert (g_filter_input_stream_get_close_base_stream (G_FILTER_INPUT_STREAM (in))); + + error = NULL; + g_assert (g_input_stream_close (in, NULL, &error)); + g_assert_no_error (error); + g_assert (g_input_stream_is_closed (base)); + + g_object_unref (in); + g_object_unref (base); + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL); + in = g_buffered_input_stream_new (base); + + g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE); + + error = NULL; + g_assert (g_input_stream_close (in, NULL, &error)); + g_assert_no_error (error); + g_assert (!g_input_stream_is_closed (base)); + + g_object_unref (in); + g_object_unref (base); +} + +static void +test_seek (void) +{ + GInputStream *base; + GInputStream *in; + GError *error; + gint byte; + gboolean ret; + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL); + in = g_buffered_input_stream_new_sized (base, 4); + error = NULL; + + /* Seek by read */ + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 0); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'a'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1); + + /* Seek forward (in buffer) */ + ret = g_seekable_seek (G_SEEKABLE (in), 1, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'c'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3); + + /* Seek backward (in buffer) */ + ret = g_seekable_seek (G_SEEKABLE (in), -2, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'b'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2); + + /* Seek forward (outside buffer) */ + ret = g_seekable_seek (G_SEEKABLE (in), 6, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'i'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9); + + /* Seek backward (outside buffer) */ + ret = g_seekable_seek (G_SEEKABLE (in), -6, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'd'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 4); + + /* Seek from beginning */ + ret = g_seekable_seek (G_SEEKABLE (in), 8, G_SEEK_SET, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'i'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9); + + /* Seek from end */ + ret = g_seekable_seek (G_SEEKABLE (in), -1, G_SEEK_END, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 50); + byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (byte, ==, 'Z'); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 51); + + /* Cleanup */ + g_object_unref (in); + 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_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); + g_test_add_func ("/buffered-input-stream/read", test_read); + g_test_add_func ("/buffered-input-stream/read-async", test_read_async); + g_test_add_func ("/buffered-input-stream/skip", test_skip); + g_test_add_func ("/buffered-input-stream/skip-async", test_skip_async); + g_test_add_func ("/buffered-input-stream/seek", test_seek); + g_test_add_func ("/filter-input-stream/close", test_close); + + return g_test_run(); +} diff --git a/gio/tests/buffered-output-stream.c b/gio/tests/buffered-output-stream.c new file mode 100644 index 0000000..c510a12 --- /dev/null +++ b/gio/tests/buffered-output-stream.c @@ -0,0 +1,319 @@ +#include + +static void +test_write (void) +{ + GOutputStream *base; + GOutputStream *out; + GError *error; + const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; + + base = g_memory_output_stream_new (g_malloc0 (20), 20, g_realloc, g_free); + out = g_buffered_output_stream_new (base); + + g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 4096); + g_assert (!g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out))); + g_buffered_output_stream_set_buffer_size (G_BUFFERED_OUTPUT_STREAM (out), 16); + g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16); + + error = NULL; + g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10); + g_assert_no_error (error); + + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); + + g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 6); + g_assert_no_error (error); + + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); + g_assert (g_output_stream_flush (out, NULL, &error)); + g_assert_no_error (error); + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 16); + + g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnop"); + + g_object_unref (out); + g_object_unref (base); +} + +static void +test_grow (void) +{ + GOutputStream *base; + GOutputStream *out; + GError *error; + const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; + gint size; + gboolean grow; + + base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); + out = g_buffered_output_stream_new_sized (base, 16); + + g_buffered_output_stream_set_auto_grow (G_BUFFERED_OUTPUT_STREAM (out), TRUE); + + g_object_get (out, "buffer-size", &size, "auto-grow", &grow, NULL); + g_assert_cmpint (size, ==, 16); + g_assert (grow); + + error = NULL; + g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10); + g_assert_no_error (error); + + g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16); + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); + + g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 10); + g_assert_no_error (error); + + g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), >=, 20); + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); + + g_assert (g_output_stream_flush (out, NULL, &error)); + g_assert_no_error (error); + + g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnopqrst"); + + g_object_unref (out); + g_object_unref (base); +} + +static void +test_close (void) +{ + GOutputStream *base; + GOutputStream *out; + GError *error; + + base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); + out = g_buffered_output_stream_new (base); + + g_assert (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (out))); + + error = NULL; + g_assert (g_output_stream_close (out, NULL, &error)); + g_assert_no_error (error); + g_assert (g_output_stream_is_closed (base)); + + g_object_unref (out); + g_object_unref (base); + + base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); + out = g_buffered_output_stream_new (base); + + g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (out), FALSE); + + error = NULL; + g_assert (g_output_stream_close (out, NULL, &error)); + g_assert_no_error (error); + g_assert (!g_output_stream_is_closed (base)); + + g_object_unref (out); + g_object_unref (base); +} + +static void +test_seek (void) +{ + GMemoryOutputStream *base; + GOutputStream *out; + GSeekable *seekable; + GError *error; + gsize bytes_written; + gboolean ret; + const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; + + base = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free)); + out = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), 8); + seekable = G_SEEKABLE (out); + error = NULL; + + /* Write data */ + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 0); + ret = g_output_stream_write_all (out, buffer, 4, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (bytes_written, ==, 4); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); + g_assert_cmpint (g_memory_output_stream_get_data_size (base), ==, 0); + + /* Forward relative seek */ + ret = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); + g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); + g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); + ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (bytes_written, ==, 2); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); + + /* Backward relative seek */ + ret = g_seekable_seek (seekable, -4, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); + g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); + g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); + ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (bytes_written, ==, 2); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); + + /* From start */ + ret = g_seekable_seek (seekable, 2, G_SEEK_SET, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 2); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); + g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); + g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); + ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (bytes_written, ==, 2); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); + + /* From end */ + ret = g_seekable_seek (seekable, 6 - 30, G_SEEK_END, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); + ret = g_output_stream_write_all (out, buffer + 2, 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (bytes_written, ==, 2); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); + + /* Check flush */ + ret = g_output_stream_flush (out, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); + g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); + g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); + g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); + g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); + + g_object_unref (out); + g_object_unref (base); +} + +static void +test_truncate(void) +{ + GMemoryOutputStream *base_stream; + GOutputStream *stream; + GSeekable *seekable; + GError *error; + gsize bytes_written; + guchar *stream_data; + gsize len; + gboolean res; + + len = 8; + + /* Create objects */ + stream_data = g_malloc0 (len); + base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free)); + stream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base_stream), 8); + seekable = G_SEEKABLE (stream); + + g_assert (g_seekable_can_truncate (seekable)); + + /* Write */ + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0); + + error = NULL; + res = g_output_stream_write_all (stream, "ab", 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (res); + res = g_output_stream_write_all (stream, "cd", 2, &bytes_written, NULL, &error); + g_assert_no_error (error); + g_assert (res); + + res = g_output_stream_flush (stream, NULL, &error); + g_assert_no_error (error); + g_assert (res); + + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 'a'); + g_assert_cmpint (stream_data[1], ==, 'b'); + g_assert_cmpint (stream_data[2], ==, 'c'); + g_assert_cmpint (stream_data[3], ==, 'd'); + + /* Truncate at position */ + res = g_seekable_truncate (seekable, 4, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 'a'); + g_assert_cmpint (stream_data[1], ==, 'b'); + g_assert_cmpint (stream_data[2], ==, 'c'); + g_assert_cmpint (stream_data[3], ==, 'd'); + + /* Truncate beyond position */ + res = g_seekable_truncate (seekable, 6, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 'a'); + g_assert_cmpint (stream_data[1], ==, 'b'); + g_assert_cmpint (stream_data[2], ==, 'c'); + g_assert_cmpint (stream_data[3], ==, 'd'); + + /* Truncate before position */ + res = g_seekable_truncate (seekable, 2, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2); + g_assert_cmpint (stream_data[0], ==, 'a'); + g_assert_cmpint (stream_data[1], ==, 'b'); + + g_object_unref (stream); + g_object_unref (base_stream); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/buffered-output-stream/write", test_write); + g_test_add_func ("/buffered-output-stream/grow", test_grow); + g_test_add_func ("/buffered-output-stream/seek", test_seek); + g_test_add_func ("/buffered-output-stream/truncate", test_truncate); + g_test_add_func ("/filter-output-stream/close", test_close); + + return g_test_run (); +} diff --git a/gio/tests/cancellable.c b/gio/tests/cancellable.c new file mode 100644 index 0000000..deadb38 --- /dev/null +++ b/gio/tests/cancellable.c @@ -0,0 +1,229 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include + +#include + +/* How long to wait in ms for each iteration */ +#define WAIT_ITERATION (10) + +static gint num_async_operations = 0; + +typedef struct +{ + guint iterations_requested; + guint iterations_done; +} MockOperationData; + +static void +mock_operation_free (gpointer user_data) +{ + MockOperationData *data = user_data; + g_free (data); +} + +static void +mock_operation_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + MockOperationData *data = task_data; + guint i; + + for (i = 0; i < data->iterations_requested; i++) + { + if (g_cancellable_is_cancelled (cancellable)) + break; + if (g_test_verbose ()) + g_printerr ("THRD: %u iteration %u\n", data->iterations_requested, i); + g_usleep (WAIT_ITERATION * 1000); + } + + if (g_test_verbose ()) + g_printerr ("THRD: %u stopped at %u\n", data->iterations_requested, i); + data->iterations_done = i; + + g_task_return_boolean (task, TRUE); +} + +static gboolean +mock_operation_timeout (gpointer user_data) +{ + GTask *task; + MockOperationData *data; + gboolean done = FALSE; + + task = G_TASK (user_data); + data = g_task_get_task_data (task); + + if (data->iterations_done >= data->iterations_requested) + done = TRUE; + + if (g_cancellable_is_cancelled (g_task_get_cancellable (task))) + done = TRUE; + + if (done) + { + if (g_test_verbose ()) + g_printerr ("LOOP: %u stopped at %u\n", data->iterations_requested,\ + data->iterations_done); + g_task_return_boolean (task, TRUE); + return FALSE; /* don't call timeout again */ + } + else + { + data->iterations_done++; + if (g_test_verbose ()) + g_printerr ("LOOP: %u iteration %u\n", data->iterations_requested, + data->iterations_done); + return TRUE; /* call timeout */ + } +} + +static void +mock_operation_async (guint wait_iterations, + gboolean run_in_thread, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + MockOperationData *data; + + task = g_task_new (NULL, cancellable, callback, user_data); + data = g_new0 (MockOperationData, 1); + data->iterations_requested = wait_iterations; + g_task_set_task_data (task, data, mock_operation_free); + + if (run_in_thread) + { + g_task_run_in_thread (task, mock_operation_thread); + if (g_test_verbose ()) + g_printerr ("THRD: %d started\n", wait_iterations); + } + else + { + g_timeout_add_full (G_PRIORITY_DEFAULT, WAIT_ITERATION, mock_operation_timeout, + g_object_ref (task), g_object_unref); + if (g_test_verbose ()) + g_printerr ("LOOP: %d started\n", wait_iterations); + } + + g_object_unref (task); +} + +static guint +mock_operation_finish (GAsyncResult *result, + GError **error) +{ + MockOperationData *data; + GTask *task; + + g_assert (g_task_is_valid (result, NULL)); + + /* This test expects the return value to be iterations_done even + * when an error is set. + */ + task = G_TASK (result); + data = g_task_get_task_data (task); + + g_task_propagate_boolean (task, error); + return data->iterations_done; +} + +GMainLoop *loop; + +static void +on_mock_operation_ready (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + guint iterations_requested; + guint iterations_done; + GError *error = NULL; + + iterations_requested = GPOINTER_TO_UINT (user_data); + iterations_done = mock_operation_finish (result, &error); + + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (error); + + g_assert_cmpint (iterations_requested, >, iterations_done); + num_async_operations--; + + if (!num_async_operations) + g_main_loop_quit (loop); +} + +static gboolean +on_main_loop_timeout_quit (gpointer user_data) +{ + GMainLoop *loop = user_data; + g_main_loop_quit (loop); + return FALSE; +} + +static void +test_cancel_multiple_concurrent (void) +{ + GCancellable *cancellable; + guint i, iterations; + + cancellable = g_cancellable_new (); + loop = g_main_loop_new (NULL, FALSE); + + for (i = 0; i < 45; i++) + { + iterations = i + 10; + mock_operation_async (iterations, g_random_boolean (), cancellable, + on_mock_operation_ready, GUINT_TO_POINTER (iterations)); + num_async_operations++; + } + + /* Wait for two iterations, to give threads a chance to start up */ + g_timeout_add (WAIT_ITERATION * 2, on_main_loop_timeout_quit, loop); + g_main_loop_run (loop); + g_assert_cmpint (num_async_operations, ==, 45); + if (g_test_verbose ()) + g_printerr ("CANCEL: %d operations\n", num_async_operations); + g_cancellable_cancel (cancellable); + g_assert (g_cancellable_is_cancelled (cancellable)); + + /* Wait for all operations to be cancelled */ + g_main_loop_run (loop); + g_assert_cmpint (num_async_operations, ==, 0); + + g_object_unref (cancellable); + g_main_loop_unref (loop); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/cancellable/multiple-concurrent", test_cancel_multiple_concurrent); + + return g_test_run (); +} diff --git a/gio/tests/cert-key.pem b/gio/tests/cert-key.pem new file mode 100644 index 0000000..5babba3 --- /dev/null +++ b/gio/tests/cert-key.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCMmwFMUPAJYzANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NDkzNFoXDTEyMDcyNDE4NDkzNFowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCaaBfCfCiw +BJ/2pzZOjoFQcMqwPWufJ+F7hv8AK0zaEhsYW/JPPNpVVjM4Rf9dhMFG513GQ6IR +q3K+okin/2H6XyLD1eyAxAreuyMZPwOsTdgkVROhl+NJEfZKnFZSxK9wkiQRnNhS ++5L8/na5o3vsgGerggQi8pj2JjfVE0R/aQ== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCslrTl+gp3lQsEGMegjhQMow5yhinpQ7yji36soGuUpUynQPs7 +P5tm3ojZPeQGNmYof3Csc2yTrMLrCidt8xFkcgtZydOJ9sQSEgwc2of4nlvffIZb +dIR+13WOPVRmS5tBVkQWFrlSFtQ70BDhNK3SZfkAb4+QmLSR1MJFaUPWrQIDAQAB +AoGAUTnskYAIhRdEQ/1Vlp7HmNr05bl26C3VDjOMvroRZ7gUR3MxykS5YsTBK10R +gEsB8XVpFgCMzUO1yODShdCsEg9kCB3fzSWkunK8+TF2TKOM5uWlQwifKJvcNisR +Nbg3r8WygMMXaWSFA3xWoRuZ5It0jOX18v+x5RHHon/kaRECQQDl6FSwgJLeNAkR +pMNQGdRhmMesHWmNNBv3Wozqm6Wpkwo5ZXPsLt3pprd0GN5jX0IG7clT1/eMD9/G ++3UGqTj3AkEAwC0M2gv+QUhbaB+KSlOZDOi4gsnhnsnaM7HQGDJJ5no4y2EvnYI3 +Y5rPJWedeYlCV3ccMitjnjcIJHInRZBIewJBANgsamVDn9Ua7GQQni1U/COAek7V +oQfKNXmRROrbyxr1TSnGwQcU0kf+IIUjVQfu67CEKUeSzAqAapM4oULQHuUCQQC9 +J9qdiO6DXXAzRdA9pplgHnT2rzV3sSEoft3f4yfgRu8+KHPQqkpQrSE1pQ5YgWUe +aGwFabXNFkfab839562fAkBl8jPidQdKWEgSa6h5pm4++sXLdWl7p6jiyetH64W7 +HnhRryE3ptrRGO0hSV1v4bx3DKzeJiJRlWUWiSl7828t +-----END RSA PRIVATE KEY----- diff --git a/gio/tests/cert-list.pem b/gio/tests/cert-list.pem new file mode 100644 index 0000000..bf2fb31 --- /dev/null +++ b/gio/tests/cert-list.pem @@ -0,0 +1,52 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCMmwFMUPAJYzANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NDkzNFoXDTEyMDcyNDE4NDkzNFowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCaaBfCfCiw +BJ/2pzZOjoFQcMqwPWufJ+F7hv8AK0zaEhsYW/JPPNpVVjM4Rf9dhMFG513GQ6IR +q3K+okin/2H6XyLD1eyAxAreuyMZPwOsTdgkVROhl+NJEfZKnFZSxK9wkiQRnNhS ++5L8/na5o3vsgGerggQi8pj2JjfVE0R/aQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCVO34vew4kvTANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NTI1M1oXDTEyMDcyNDE4NTI1M1owgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAiaJ6bO5NJ +pyS8p//UVQM/T+exyZxznULwqCuVKv7uwss2QiKiQGJPfVc0iy650cTegtoc4ki5 +Zfg/Cllxj2KAmbkWGlzVw7IvuBouruxdojm+0y60DzWr1rQUkL6VX/VBZXL51VPp +zCdTCzI3v4ztFStbUyC99xx1hdHOSleLOQ== +-----END CERTIFICATE----- +>>>> Garbage to be ignore <<<< +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQD9ny7saeYnDDANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NTMwMVoXDTEyMDcyNDE4NTMwMVowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAGBjOlcmD6 +E6GlY2rvjCf0BpW0t4zKL/wvA5tBmuOWYg93psHgIdSNgkmfbA1kvD6kXehQlt1F +5yZJP91/VND5LHvXf5TcAmr/KeQAPYvqfiGYXuvHDLA9y9OOyTBMURLYfWuo9HZt +xeI14sZ9udXwtUhgcvXrBFzlRfkbojuMZw== +-----END CERTIFICATE----- diff --git a/gio/tests/cert1.pem b/gio/tests/cert1.pem new file mode 100644 index 0000000..b21bb8b --- /dev/null +++ b/gio/tests/cert1.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCMmwFMUPAJYzANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NDkzNFoXDTEyMDcyNDE4NDkzNFowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCaaBfCfCiw +BJ/2pzZOjoFQcMqwPWufJ+F7hv8AK0zaEhsYW/JPPNpVVjM4Rf9dhMFG513GQ6IR +q3K+okin/2H6XyLD1eyAxAreuyMZPwOsTdgkVROhl+NJEfZKnFZSxK9wkiQRnNhS ++5L8/na5o3vsgGerggQi8pj2JjfVE0R/aQ== +-----END CERTIFICATE----- diff --git a/gio/tests/cert2.pem b/gio/tests/cert2.pem new file mode 100644 index 0000000..ba1df45 --- /dev/null +++ b/gio/tests/cert2.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCVO34vew4kvTANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NTI1M1oXDTEyMDcyNDE4NTI1M1owgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAiaJ6bO5NJ +pyS8p//UVQM/T+exyZxznULwqCuVKv7uwss2QiKiQGJPfVc0iy650cTegtoc4ki5 +Zfg/Cllxj2KAmbkWGlzVw7IvuBouruxdojm+0y60DzWr1rQUkL6VX/VBZXL51VPp +zCdTCzI3v4ztFStbUyC99xx1hdHOSleLOQ== +-----END CERTIFICATE----- diff --git a/gio/tests/cert3.pem b/gio/tests/cert3.pem new file mode 100644 index 0000000..57d6e6b --- /dev/null +++ b/gio/tests/cert3.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQD9ny7saeYnDDANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NTMwMVoXDTEyMDcyNDE4NTMwMVowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAGBjOlcmD6 +E6GlY2rvjCf0BpW0t4zKL/wvA5tBmuOWYg93psHgIdSNgkmfbA1kvD6kXehQlt1F +5yZJP91/VND5LHvXf5TcAmr/KeQAPYvqfiGYXuvHDLA9y9OOyTBMURLYfWuo9HZt +xeI14sZ9udXwtUhgcvXrBFzlRfkbojuMZw== +-----END CERTIFICATE----- diff --git a/gio/tests/contenttype.c b/gio/tests/contenttype.c new file mode 100644 index 0000000..ec46be4 --- /dev/null +++ b/gio/tests/contenttype.c @@ -0,0 +1,217 @@ +#include +#include + +static void +test_guess (void) +{ + gchar *res; + gchar *expected; + gboolean uncertain; + guchar data[] = + "[Desktop Entry]\n" + "Type=Application\n" + "Name=appinfo-test\n" + "Exec=./appinfo-test --option\n"; + + res = g_content_type_guess ("/etc/", NULL, 0, &uncertain); + expected = g_content_type_from_mime_type ("inode/directory"); + g_assert (g_content_type_equals (expected, res)); + g_assert (uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("foo.txt", NULL, 0, &uncertain); + expected = g_content_type_from_mime_type ("text/plain"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("foo.desktop", data, sizeof (data) - 1, &uncertain); + expected = g_content_type_from_mime_type ("application/x-desktop"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("foo.txt", data, sizeof (data) - 1, &uncertain); + expected = g_content_type_from_mime_type ("text/plain"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("foo", data, sizeof (data) - 1, &uncertain); + expected = g_content_type_from_mime_type ("text/plain"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess (NULL, data, sizeof (data) - 1, &uncertain); + expected = g_content_type_from_mime_type ("application/x-desktop"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + /* this is potentially ambiguous: it does not match the PO template format, + * but looks like text so it can't be Powerpoint */ + res = g_content_type_guess ("test.pot", (guchar *)"ABC abc", 7, &uncertain); + expected = g_content_type_from_mime_type ("text/x-gettext-translation-template"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("test.pot", (guchar *)"msgid \"", 7, &uncertain); + expected = g_content_type_from_mime_type ("text/x-gettext-translation-template"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); + + res = g_content_type_guess ("test.pot", (guchar *)"\xCF\xD0\xE0\x11", 4, &uncertain); + expected = g_content_type_from_mime_type ("application/vnd.ms-powerpoint"); + g_assert (g_content_type_equals (expected, res)); + /* we cannot reliably detect binary powerpoint files as long as there is no + * defined MIME magic, so do not check uncertain here */ + g_free (res); + g_free (expected); + + res = g_content_type_guess ("test.otf", (guchar *)"OTTO", 4, &uncertain); + expected = g_content_type_from_mime_type ("application/x-font-otf"); + g_assert (g_content_type_equals (expected, res)); + g_assert (!uncertain); + g_free (res); + g_free (expected); +} + +static void +test_unknown (void) +{ + gchar *unknown; + gchar *str; + + unknown = g_content_type_from_mime_type ("application/octet-stream"); + g_assert (g_content_type_is_unknown (unknown)); + str = g_content_type_get_mime_type (unknown); + g_assert_cmpstr (str, ==, "application/octet-stream"); + g_free (str); + g_free (unknown); +} + +static void +test_subtype (void) +{ + gchar *plain; + gchar *xml; + + plain = g_content_type_from_mime_type ("text/plain"); + xml = g_content_type_from_mime_type ("application/xml"); + + g_assert (g_content_type_is_a (xml, plain)); + + g_free (plain); + g_free (xml); +} + +static gint +find_mime (gconstpointer a, gconstpointer b) +{ + if (g_content_type_equals (a, b)) + return 0; + return 1; +} + +static void +test_list (void) +{ + GList *types; + gchar *plain; + gchar *xml; + + plain = g_content_type_from_mime_type ("text/plain"); + xml = g_content_type_from_mime_type ("application/xml"); + + types = g_content_types_get_registered (); + + g_assert (g_list_length (types) > 1); + + /* just check that some types are in the list */ + g_assert (g_list_find_custom (types, plain, find_mime) != NULL); + g_assert (g_list_find_custom (types, xml, find_mime) != NULL); + + g_list_free_full (types, g_free); + + g_free (plain); + g_free (xml); +} + +static void +test_executable (void) +{ + gchar *type; + + type = g_content_type_from_mime_type ("application/x-executable"); + g_assert (g_content_type_can_be_executable (type)); + g_free (type); + + type = g_content_type_from_mime_type ("text/plain"); + g_assert (g_content_type_can_be_executable (type)); + g_free (type); + + type = g_content_type_from_mime_type ("image/png"); + g_assert (!g_content_type_can_be_executable (type)); + g_free (type); +} + +static void +test_description (void) +{ + gchar *type; + gchar *desc; + + type = g_content_type_from_mime_type ("text/plain"); + desc = g_content_type_get_description (type); + g_assert (desc != NULL); + + g_free (desc); + g_free (type); +} + +static void +test_icon (void) +{ + gchar *type; + GIcon *icon; + + type = g_content_type_from_mime_type ("text/plain"); + icon = g_content_type_get_icon (type); + g_assert (G_IS_ICON (icon)); + g_object_unref (icon); + g_free (type); + + type = g_content_type_from_mime_type ("application/rtf"); + icon = g_content_type_get_icon (type); + g_assert (G_IS_ICON (icon)); + g_object_unref (icon); + g_free (type); +} + + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/contenttype/guess", test_guess); + g_test_add_func ("/contenttype/unknown", test_unknown); + g_test_add_func ("/contenttype/subtype", test_subtype); + g_test_add_func ("/contenttype/list", test_list); + g_test_add_func ("/contenttype/executable", test_executable); + g_test_add_func ("/contenttype/description", test_description); + g_test_add_func ("/contenttype/icon", test_icon); + + return g_test_run (); +} diff --git a/gio/tests/contexts.c b/gio/tests/contexts.c new file mode 100644 index 0000000..14175b4 --- /dev/null +++ b/gio/tests/contexts.c @@ -0,0 +1,202 @@ +#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); + + g_object_unref (in); +} + +/* 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 gboolean test1_done; +static GCond test1_cond; +static GMutex test1_mutex; + +static void +test_thread_independence (void) +{ + GMainLoop *loop; + + 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); +} + +static gboolean +idle_start_test1_thread (gpointer loop) +{ + gint64 time; + GThread *thread; + gboolean io_completed; + + g_mutex_lock (&test1_mutex); + thread = g_thread_new ("test1", test1_thread, NULL); + + time = g_get_monotonic_time () + 2 * G_TIME_SPAN_SECOND; + while (!test1_done) + { + io_completed = g_cond_wait_until (&test1_cond, &test1_mutex, time); + g_assert (io_completed); + } + g_thread_join (thread); + + g_mutex_unlock (&test1_mutex); + g_main_loop_quit (loop); + return G_SOURCE_REMOVE; +} + +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); + + 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_object_unref (file); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + test1_done = TRUE; + g_cond_signal (&test1_cond); + g_mutex_unlock (&test1_mutex); + + g_main_context_pop_thread_default (context); + g_main_context_unref (context); + + 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_object_unref (file); + 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); + + g_main_context_pop_thread_default (context); + g_main_context_unref (context); +} + +static gboolean +test2_fail (gpointer user_data) +{ + g_assert_not_reached (); + return FALSE; +} + +int +main (int argc, char **argv) +{ + GError *error = NULL; + int ret; + + 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); + + ret = g_test_run(); + + g_free (test_file_buffer); + + return ret; +} diff --git a/gio/tests/converter-stream.c b/gio/tests/converter-stream.c new file mode 100644 index 0000000..7c58f03 --- /dev/null +++ b/gio/tests/converter-stream.c @@ -0,0 +1,1201 @@ +/* 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) +{ + const guint8 *in, *in_end; + guint8 v, *out; + int i; + gsize block_size; + + 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) +{ + const guint8 *in, *in_end; + guint8 v, *out; + int i; + gsize block_size; + + 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; + GConverter *converter; + 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_assert (g_converter_input_stream_get_converter (G_CONVERTER_INPUT_STREAM (cstream)) == expander); + g_object_get (cstream, "converter", &converter, NULL); + g_assert (converter == expander); + g_object_unref (converter); + 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_assert (g_converter_output_stream_get_converter (G_CONVERTER_OUTPUT_STREAM (cstream_out)) == expander); + g_object_get (cstream_out, "converter", &converter, NULL); + g_assert (converter == expander); + g_object_unref (converter); + 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); + + g_object_unref (cstream); + + 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); + g_error_free (error); + 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); +} + +#define LEFTOVER_SHORT_READ_SIZE 512 + +#define G_TYPE_LEFTOVER_CONVERTER (g_leftover_converter_get_type ()) +#define G_LEFTOVER_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_LEFTOVER_CONVERTER, GLeftoverConverter)) +#define G_LEFTOVER_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_LEFTOVER_CONVERTER, GLeftoverConverterClass)) +#define G_IS_LEFTOVER_CONVERTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_LEFTOVER_CONVERTER)) +#define G_IS_LEFTOVER_CONVERTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_LEFTOVER_CONVERTER)) +#define G_LEFTOVER_CONVERTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_LEFTOVER_CONVERTER, GLeftoverConverterClass)) + +typedef struct _GLeftoverConverter GLeftoverConverter; +typedef struct _GLeftoverConverterClass GLeftoverConverterClass; + +struct _GLeftoverConverterClass +{ + GObjectClass parent_class; +}; + +GType g_leftover_converter_get_type (void) G_GNUC_CONST; +GConverter *g_leftover_converter_new (void); + + + +static void g_leftover_converter_iface_init (GConverterIface *iface); + +struct _GLeftoverConverter +{ + GObject parent_instance; +}; + +G_DEFINE_TYPE_WITH_CODE (GLeftoverConverter, g_leftover_converter, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_CONVERTER, + g_leftover_converter_iface_init)) + +static void +g_leftover_converter_class_init (GLeftoverConverterClass *klass) +{ +} + +static void +g_leftover_converter_init (GLeftoverConverter *local) +{ +} + +GConverter * +g_leftover_converter_new (void) +{ + GConverter *conv; + + conv = g_object_new (G_TYPE_LEFTOVER_CONVERTER, NULL); + + return conv; +} + +static void +g_leftover_converter_reset (GConverter *converter) +{ +} + +static GConverterResult +g_leftover_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) +{ + if (outbuf_size == LEFTOVER_SHORT_READ_SIZE) + { + g_set_error_literal (error, + G_IO_ERROR, + G_IO_ERROR_PARTIAL_INPUT, + "partial input"); + return G_CONVERTER_ERROR; + } + + if (inbuf_size < 100) + *bytes_read = *bytes_written = MIN (inbuf_size, outbuf_size); + else + *bytes_read = *bytes_written = MIN (inbuf_size - 10, outbuf_size); + memcpy (outbuf, inbuf, *bytes_written); + + if (*bytes_read == inbuf_size && (flags & G_CONVERTER_INPUT_AT_END)) + return G_CONVERTER_FINISHED; + return G_CONVERTER_CONVERTED; +} + +static void +g_leftover_converter_iface_init (GConverterIface *iface) +{ + iface->convert = g_leftover_converter_convert; + iface->reset = g_leftover_converter_reset; +} + +#define LEFTOVER_BUFSIZE 8192 +#define INTERNAL_BUFSIZE 4096 + +static void +test_converter_leftover (void) +{ + gchar *orig, *converted; + gsize total_read; + gssize res; + goffset offset; + GInputStream *mem, *cstream; + GConverter *converter; + GError *error; + int i; + + converter = g_leftover_converter_new (); + + orig = g_malloc (LEFTOVER_BUFSIZE); + converted = g_malloc (LEFTOVER_BUFSIZE); + for (i = 0; i < LEFTOVER_BUFSIZE; i++) + orig[i] = i % 64 + 32; + + mem = g_memory_input_stream_new_from_data (orig, LEFTOVER_BUFSIZE, NULL); + cstream = g_converter_input_stream_new (mem, G_CONVERTER (converter)); + g_object_unref (mem); + + total_read = 0; + + error = NULL; + res = g_input_stream_read (cstream, + converted, LEFTOVER_SHORT_READ_SIZE, + NULL, &error); + g_assert_cmpint (res, ==, LEFTOVER_SHORT_READ_SIZE); + total_read += res; + + offset = g_seekable_tell (G_SEEKABLE (mem)); + g_assert_cmpint (offset, >, LEFTOVER_SHORT_READ_SIZE); + g_assert_cmpint (offset, <, LEFTOVER_BUFSIZE); + + /* At this point, @cstream has both a non-empty input_buffer + * and a non-empty converted_buffer, which is the case + * we want to test. + */ + + while (TRUE) + { + error = NULL; + res = g_input_stream_read (cstream, + converted + total_read, + LEFTOVER_BUFSIZE - total_read, + NULL, &error); + g_assert (res >= 0); + if (res == 0) + break; + total_read += res; + } + + g_assert_cmpint (total_read, ==, LEFTOVER_BUFSIZE); + g_assert (memcmp (converted, orig, LEFTOVER_BUFSIZE) == 0); + + g_object_unref (cstream); + g_free (orig); + g_free (converted); + g_object_unref (converter); +} + +#define DATA_LENGTH 1000000 + +typedef struct { + const gchar *path; + GZlibCompressorFormat format; + gint level; +} CompressorTest; + +static void +test_roundtrip (gconstpointer data) +{ + const CompressorTest *test = data; + GError *error = NULL; + guint32 *data0, *data1; + gsize data1_size; + gint i; + GInputStream *istream0, *istream1, *cistream1; + GOutputStream *ostream1, *ostream2, *costream1; + GConverter *compressor, *decompressor; + GZlibCompressorFormat fmt; + gint lvl; + + g_test_bug ("619945"); + + data0 = g_malloc (DATA_LENGTH * sizeof (guint32)); + for (i = 0; i < DATA_LENGTH; i++) + data0[i] = g_random_int (); + + istream0 = g_memory_input_stream_new_from_data (data0, + DATA_LENGTH * sizeof (guint32), NULL); + + ostream1 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + compressor = G_CONVERTER (g_zlib_compressor_new (test->format, test->level)); + costream1 = g_converter_output_stream_new (ostream1, compressor); + g_assert (g_converter_output_stream_get_converter (G_CONVERTER_OUTPUT_STREAM (costream1)) == compressor); + + g_output_stream_splice (costream1, istream0, 0, NULL, &error); + g_assert_no_error (error); + + g_object_unref (costream1); + + g_converter_reset (compressor); + g_object_get (compressor, "format", &fmt, "level", &lvl, NULL); + g_assert_cmpint (fmt, ==, test->format); + g_assert_cmpint (lvl, ==, test->level); + g_object_unref (compressor); + data1 = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (ostream1)); + data1_size = g_memory_output_stream_get_data_size ( + G_MEMORY_OUTPUT_STREAM (ostream1)); + g_object_unref (ostream1); + g_object_unref (istream0); + + istream1 = g_memory_input_stream_new_from_data (data1, data1_size, g_free); + decompressor = G_CONVERTER (g_zlib_decompressor_new (test->format)); + cistream1 = g_converter_input_stream_new (istream1, decompressor); + + ostream2 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + + g_output_stream_splice (ostream2, cistream1, 0, NULL, &error); + g_assert_no_error (error); + + g_assert_cmpuint (DATA_LENGTH * sizeof (guint32), ==, + g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (ostream2))); + g_assert (memcmp (data0, g_memory_output_stream_get_data ( + G_MEMORY_OUTPUT_STREAM (ostream2)), DATA_LENGTH * sizeof (guint32)) == 0); + g_object_unref (istream1); + g_converter_reset (decompressor); + g_object_get (decompressor, "format", &fmt, NULL); + g_assert_cmpint (fmt, ==, test->format); + g_object_unref (decompressor); + g_object_unref (cistream1); + g_object_unref (ostream2); + g_free (data0); +} + +typedef struct { + const gchar *path; + const gchar *charset_in; + const gchar *text_in; + const gchar *charset_out; + const gchar *text_out; + gint n_fallbacks; +} CharsetTest; + +static void +test_charset (gconstpointer data) +{ + const CharsetTest *test = data; + GInputStream *in, *in2; + GConverter *conv; + gchar *buffer; + gsize count; + gsize bytes_read; + GError *error; + gboolean fallback; + + conv = (GConverter *)g_charset_converter_new (test->charset_out, test->charset_in, NULL); + g_object_get (conv, "use-fallback", &fallback, NULL); + g_assert (!fallback); + + in = g_memory_input_stream_new_from_data (test->text_in, -1, NULL); + in2 = g_converter_input_stream_new (in, conv); + + count = 2 * strlen (test->text_out); + buffer = g_malloc0 (count); + error = NULL; + g_input_stream_read_all (in2, buffer, count, &bytes_read, NULL, &error); + if (test->n_fallbacks == 0) + { + g_assert_no_error (error); + g_assert_cmpint (bytes_read, ==, strlen (test->text_out)); + g_assert_cmpstr (buffer, ==, test->text_out); + } + else + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_DATA); + g_error_free (error); + } + + g_free (buffer); + g_object_unref (in2); + g_object_unref (in); + + if (test->n_fallbacks == 0) + { + g_object_unref (conv); + return; + } + + g_converter_reset (conv); + + g_assert (!g_charset_converter_get_use_fallback (G_CHARSET_CONVERTER (conv))); + g_charset_converter_set_use_fallback (G_CHARSET_CONVERTER (conv), TRUE); + + in = g_memory_input_stream_new_from_data (test->text_in, -1, NULL); + in2 = g_converter_input_stream_new (in, conv); + + count = 2 * strlen (test->text_out); + buffer = g_malloc0 (count); + error = NULL; + g_input_stream_read_all (in2, buffer, count, &bytes_read, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (buffer, ==, test->text_out); + g_assert_cmpint (bytes_read, ==, strlen (test->text_out)); + g_assert_cmpint (test->n_fallbacks, ==, g_charset_converter_get_num_fallbacks (G_CHARSET_CONVERTER (conv))); + + g_free (buffer); + g_object_unref (in2); + g_object_unref (in); + + g_object_unref (conv); +} + + +static void +client_connected (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClient *client = G_SOCKET_CLIENT (source); + GSocketConnection **conn = user_data; + GError *error = NULL; + + *conn = g_socket_client_connect_finish (client, result, &error); + g_assert_no_error (error); +} + +static void +server_connected (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketListener *listener = G_SOCKET_LISTENER (source); + GSocketConnection **conn = user_data; + GError *error = NULL; + + *conn = g_socket_listener_accept_finish (listener, result, NULL, &error); + g_assert_no_error (error); +} + +static void +make_socketpair (GIOStream **left, + GIOStream **right) +{ + GInetAddress *iaddr; + GSocketAddress *saddr, *effective_address; + GSocketListener *listener; + GSocketClient *client; + GError *error = NULL; + GSocketConnection *client_conn = NULL, *server_conn = NULL; + + iaddr = g_inet_address_new_loopback (G_SOCKET_FAMILY_IPV4); + saddr = g_inet_socket_address_new (iaddr, 0); + g_object_unref (iaddr); + + listener = g_socket_listener_new (); + g_socket_listener_add_address (listener, saddr, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_TCP, + NULL, + &effective_address, + &error); + g_assert_no_error (error); + g_object_unref (saddr); + + client = g_socket_client_new (); + + g_socket_client_connect_async (client, + G_SOCKET_CONNECTABLE (effective_address), + NULL, client_connected, &client_conn); + g_socket_listener_accept_async (listener, NULL, + server_connected, &server_conn); + + while (!client_conn || !server_conn) + g_main_context_iteration (NULL, TRUE); + + g_object_unref (client); + g_object_unref (listener); + g_object_unref (effective_address); + + *left = G_IO_STREAM (client_conn); + *right = G_IO_STREAM (server_conn); +} + +static void +test_converter_pollable (void) +{ + GIOStream *left, *right; + guint8 *converted, *inptr; + guint8 *expanded, *outptr, *expanded_end; + gsize n_read, expanded_size; + gsize total_read; + gssize res; + gboolean is_readable; + GConverterResult cres; + GInputStream *cstream; + GPollableInputStream *pollable_in; + GOutputStream *socket_out, *mem_out, *cstream_out; + GPollableOutputStream *pollable_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); + expanded_end = expanded + expanded_size; + + make_socketpair (&left, &right); + + compressor = g_compressor_converter_new (); + + converted = g_malloc (100*1000); /* Large enough */ + + cstream = g_converter_input_stream_new (g_io_stream_get_input_stream (left), + compressor); + pollable_in = G_POLLABLE_INPUT_STREAM (cstream); + g_assert (g_pollable_input_stream_can_poll (pollable_in)); + + socket_out = g_io_stream_get_output_stream (right); + + total_read = 0; + outptr = expanded; + inptr = converted; + while (TRUE) + { + error = NULL; + + if (outptr < expanded_end) + { + res = g_output_stream_write (socket_out, + outptr, + MIN (1000, (expanded_end - outptr)), + NULL, &error); + g_assert_cmpint (res, >, 0); + outptr += res; + } + else if (socket_out) + { + g_object_unref (right); + socket_out = NULL; + } + + /* Wait a few ticks to check for the pipe to propagate the + * write. Finesses the race condition in the following test, + * where is_readable fails because the write hasn't propagated, + * but the read then succeeds because it has. */ + g_usleep (80L); + + is_readable = g_pollable_input_stream_is_readable (pollable_in); + res = g_pollable_input_stream_read_nonblocking (pollable_in, + inptr, 1, + NULL, &error); + + /* is_readable can be a false positive, but not a false negative */ + if (!is_readable) + g_assert_cmpint (res, ==, -1); + + /* After closing the write end, we can't get WOULD_BLOCK any more */ + if (!socket_out) + g_assert_cmpint (res, !=, -1); + + if (res == -1) + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK); + g_error_free (error); + + continue; + } + + if (res == 0) + break; + inptr += 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_object_unref (left); + + g_converter_reset (compressor); + + /* This doesn't actually test the behavior on + * G_IO_ERROR_WOULD_BLOCK; to do that we'd need to implement a + * custom GOutputStream that we could control blocking on. + */ + + 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); + pollable_out = G_POLLABLE_OUTPUT_STREAM (cstream_out); + + for (i = 0; i < expanded_size; i++) + { + error = NULL; + res = g_pollable_output_stream_write_nonblocking (pollable_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_free (expanded); + g_free (converted); + g_object_unref (expander); + g_object_unref (compressor); +} + +static void +test_truncation (gconstpointer data) +{ + const CompressorTest *test = data; + GError *error = NULL; + guint32 *data0, *data1; + gsize data1_size; + gint i; + GInputStream *istream0, *istream1, *cistream1; + GOutputStream *ostream1, *ostream2, *costream1; + GConverter *compressor, *decompressor; + + data0 = g_malloc (DATA_LENGTH * sizeof (guint32)); + for (i = 0; i < DATA_LENGTH; i++) + data0[i] = g_random_int (); + + istream0 = g_memory_input_stream_new_from_data (data0, + DATA_LENGTH * sizeof (guint32), NULL); + + ostream1 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + compressor = G_CONVERTER (g_zlib_compressor_new (test->format, -1)); + costream1 = g_converter_output_stream_new (ostream1, compressor); + g_assert (g_converter_output_stream_get_converter (G_CONVERTER_OUTPUT_STREAM (costream1)) == compressor); + + g_output_stream_splice (costream1, istream0, 0, NULL, &error); + g_assert_no_error (error); + + g_object_unref (costream1); + g_object_unref (compressor); + + data1 = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (ostream1)); + data1_size = g_memory_output_stream_get_data_size ( + G_MEMORY_OUTPUT_STREAM (ostream1)); + g_object_unref (ostream1); + g_object_unref (istream0); + + /* truncate */ + data1_size /= 2; + + istream1 = g_memory_input_stream_new_from_data (data1, data1_size, g_free); + decompressor = G_CONVERTER (g_zlib_decompressor_new (test->format)); + cistream1 = g_converter_input_stream_new (istream1, decompressor); + + ostream2 = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + + g_output_stream_splice (ostream2, cistream1, 0, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PARTIAL_INPUT); + g_error_free (error); + + g_object_unref (istream1); + g_object_unref (decompressor); + g_object_unref (cistream1); + g_object_unref (ostream2); + g_free (data0); +} + +int +main (int argc, + char *argv[]) +{ + CompressorTest compressor_tests[] = { + { "/converter-output-stream/roundtrip/zlib-0", G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 0 }, + { "/converter-output-stream/roundtrip/zlib-9", G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 9 }, + { "/converter-output-stream/roundtrip/gzip-0", G_ZLIB_COMPRESSOR_FORMAT_GZIP, 0 }, + { "/converter-output-stream/roundtrip/gzip-9", G_ZLIB_COMPRESSOR_FORMAT_GZIP, 9 }, + { "/converter-output-stream/roundtrip/raw-0", G_ZLIB_COMPRESSOR_FORMAT_RAW, 0 }, + { "/converter-output-stream/roundtrip/raw-9", G_ZLIB_COMPRESSOR_FORMAT_RAW, 9 }, + }; + CompressorTest truncation_tests[] = { + { "/converter-input-stream/truncation/zlib", G_ZLIB_COMPRESSOR_FORMAT_ZLIB, 0 }, + { "/converter-input-stream/truncation/gzip", G_ZLIB_COMPRESSOR_FORMAT_GZIP, 0 }, + { "/converter-input-stream/truncation/raw", G_ZLIB_COMPRESSOR_FORMAT_RAW, 0 }, + }; + CharsetTest charset_tests[] = { + { "/converter-input-stream/charset/utf8->latin1", "UTF-8", "\303\205rr Sant\303\251", "ISO-8859-1", "\305rr Sant\351", 0 }, + { "/converter-input-stream/charset/latin1->utf8", "ISO-8859-1", "\305rr Sant\351", "UTF-8", "\303\205rr Sant\303\251", 0 }, + { "/converter-input-stream/charset/fallbacks", "UTF-8", "Some characters just don't fit into latin1: πא", "ISO-8859-1", "Some characters just don't fit into latin1: \\CF\\80\\D7\\90", 4 }, + }; + + gint i; + + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/converter-input-stream/expander", test_expander); + g_test_add_func ("/converter-input-stream/compressor", test_compressor); + + for (i = 0; i < G_N_ELEMENTS (compressor_tests); i++) + g_test_add_data_func (compressor_tests[i].path, &compressor_tests[i], test_roundtrip); + + for (i = 0; i < G_N_ELEMENTS (truncation_tests); i++) + g_test_add_data_func (truncation_tests[i].path, &truncation_tests[i], test_truncation); + + for (i = 0; i < G_N_ELEMENTS (charset_tests); i++) + g_test_add_data_func (charset_tests[i].path, &charset_tests[i], test_charset); + + g_test_add_func ("/converter-stream/pollable", test_converter_pollable); + g_test_add_func ("/converter-stream/leftover", test_converter_leftover); + + return g_test_run(); +} diff --git a/gio/tests/credentials.c b/gio/tests/credentials.c new file mode 100644 index 0000000..20cfcb9 --- /dev/null +++ b/gio/tests/credentials.c @@ -0,0 +1,127 @@ +/* GLib testing framework examples and tests + * + * Copyright © 2012 Collabora Ltd. + * + * 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 "config.h" + +#include + +#ifdef G_OS_UNIX +# include "gio/gnetworkingprivate.h" + +# if (defined(__linux__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__OpenBSD__)) +# define SHOULD_HAVE_CREDENTIALS +# endif +#endif + +static void +test_basic (void) +{ + GCredentials *creds = g_credentials_new (); + GCredentials *other = g_credentials_new (); +#ifdef SHOULD_HAVE_CREDENTIALS + GError *error = NULL; + gboolean set; + pid_t not_me; + gchar *stringified; +#endif + + /* You can always get a credentials object, but it might not work. */ + g_assert (creds != NULL); + g_assert (other != NULL); + +#ifdef SHOULD_HAVE_CREDENTIALS + g_assert (g_credentials_is_same_user (creds, other, &error)); + g_assert_no_error (error); + + if (geteuid () == 0) + not_me = 65534; /* traditionally 'nobody' */ + else + not_me = 0; + + g_assert_cmpuint (g_credentials_get_unix_user (creds, &error), ==, + geteuid ()); + g_assert_no_error (error); + g_assert_cmpuint (g_credentials_get_unix_pid (creds, &error), ==, + getpid ()); + g_assert_no_error (error); + + set = g_credentials_set_unix_user (other, not_me, &error); + g_assert_no_error (error); + g_assert (set); + + g_assert_cmpuint (g_credentials_get_unix_user (other, &error), ==, not_me); + g_assert (!g_credentials_is_same_user (creds, other, &error)); + g_assert_no_error (error); + + stringified = g_credentials_to_string (creds); + g_test_message ("%s", stringified); + g_free (stringified); + + stringified = g_credentials_to_string (other); + g_test_message ("%s", stringified); + g_free (stringified); + +#if defined(__linux__) + { + struct ucred *native = g_credentials_get_native (creds, + G_CREDENTIALS_TYPE_LINUX_UCRED); + + g_assert_cmpuint (native->uid, ==, geteuid ()); + g_assert_cmpuint (native->pid, ==, getpid ()); + } +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + { + struct cmsgcred *native = g_credentials_get_native (creds, + G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED); + + g_assert_cmpuint (native->cmcred_euid, ==, geteuid ()); + g_assert_cmpuint (native->cmcred_pid, ==, getpid ()); + } +#elif defined(__OpenBSD__) + { + struct sockpeercred *native = g_credentials_get_native (creds, + G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED); + + g_assert_cmpuint (native->uid, ==, geteuid ()); + g_assert_cmpuint (native->pid, ==, getpid ()); + } +#endif + +#endif + + g_object_unref (creds); + g_object_unref (other); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/credentials/basic", test_basic); + + 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..58a3b3a --- /dev/null +++ b/gio/tests/data-input-stream.c @@ -0,0 +1,502 @@ +/* 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_basic (void) +{ + GInputStream *stream; + GInputStream *base_stream; + gint val; + + base_stream = g_memory_input_stream_new (); + stream = G_INPUT_STREAM (g_data_input_stream_new (base_stream)); + + g_object_get (stream, "byte-order", &val, NULL); + g_assert_cmpint (val, ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_object_set (stream, "byte-order", G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, NULL); + g_assert_cmpint (g_data_input_stream_get_byte_order (G_DATA_INPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + + g_object_get (stream, "newline-type", &val, NULL); + g_assert_cmpint (val, ==, G_DATA_STREAM_NEWLINE_TYPE_LF); + g_object_set (stream, "newline-type", G_DATA_STREAM_NEWLINE_TYPE_CR_LF, NULL); + g_assert_cmpint (g_data_input_stream_get_newline_type (G_DATA_INPUT_STREAM (stream)), ==, G_DATA_STREAM_NEWLINE_TYPE_CR_LF); + + g_object_unref (stream); + g_object_unref (base_stream); +} + +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, g_free); + + /* 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_free (data); + g_assert_no_error (error); + line++; + } + if (error) + g_error_free (error); + } + 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_lines_any (void) +{ + test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_ANY); +} + +static void +test_read_lines_LF_valid_utf8 (void) +{ + GInputStream *stream; + GInputStream *base_stream; + GError *error = NULL; + char *line; + guint n_lines = 0; + + 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), + "foo\nthis is valid UTF-8 ☺!\nbar\n", -1, NULL); + + /* Test read line */ + error = NULL; + while (TRUE) + { + gsize length = -1; + line = g_data_input_stream_read_line_utf8 (G_DATA_INPUT_STREAM (stream), &length, NULL, &error); + g_assert_no_error (error); + if (line == NULL) + break; + n_lines++; + g_free (line); + } + g_assert_cmpint (n_lines, ==, 3); + + g_object_unref (base_stream); + g_object_unref (stream); +} + +static void +test_read_lines_LF_invalid_utf8 (void) +{ + GInputStream *stream; + GInputStream *base_stream; + GError *error = NULL; + char *line; + guint n_lines = 0; + + 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), + "foo\nthis is not valid UTF-8 \xE5 =(\nbar\n", -1, NULL); + + /* Test read line */ + error = NULL; + while (TRUE) + { + gsize length = -1; + line = g_data_input_stream_read_line_utf8 (G_DATA_INPUT_STREAM (stream), &length, NULL, &error); + if (n_lines == 0) + g_assert_no_error (error); + else + { + g_assert (error != NULL); + g_clear_error (&error); + g_free (line); + break; + } + n_lines++; + g_free (line); + } + g_assert_cmpint (n_lines, ==, 1); + + g_object_unref (base_stream); + g_object_unref (stream); +} + +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 "#$%^" +#define DATA_SEP_LEN 4 + const int DATA_PARTS_NUM = DATA_SEP_LEN * 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_free (data); + 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); +} + +static void +test_read_upto (void) +{ + GInputStream *stream; + GInputStream *base_stream; + GError *error = NULL; + char *data; + int line; + int i; + guchar stop_char; + +#undef REPEATS +#undef DATA_STRING +#undef DATA_PART_LEN +#undef DATA_SEP +#undef DATA_SEP_LEN +#define REPEATS 10 /* number of rounds */ +#define DATA_STRING " part1 # part2 $ part3 \0 part4 ^" +#define DATA_PART_LEN 7 /* number of characters between separators */ +#define DATA_SEP "#$\0^" +#define DATA_SEP_LEN 4 + const int DATA_PARTS_NUM = DATA_SEP_LEN * 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, 32, NULL); + + /* Test stop characters */ + error = NULL; + data = (char*)1; + line = 0; + while (data) + { + gsize length = -1; + data = g_data_input_stream_read_upto (G_DATA_INPUT_STREAM (stream), DATA_SEP, DATA_SEP_LEN, &length, NULL, &error); + if (data) + { + g_assert_cmpint (strlen (data), ==, DATA_PART_LEN); + g_assert_no_error (error); + line++; + + stop_char = g_data_input_stream_read_byte (G_DATA_INPUT_STREAM (stream), NULL, &error); + g_assert (memchr (DATA_SEP, stop_char, DATA_SEP_LEN) != NULL); + g_assert_no_error (error); + } + g_free (data); + } + 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 (!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); + if (error) + g_error_free (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_test_init (&argc, &argv, NULL); + + g_test_add_func ("/data-input-stream/basic", test_basic); + g_test_add_func ("/data-input-stream/read-lines-LF", test_read_lines_LF); + g_test_add_func ("/data-input-stream/read-lines-LF-valid-utf8", test_read_lines_LF_valid_utf8); + g_test_add_func ("/data-input-stream/read-lines-LF-invalid-utf8", test_read_lines_LF_invalid_utf8); + 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-lines-any", test_read_lines_any); + g_test_add_func ("/data-input-stream/read-until", test_read_until); + g_test_add_func ("/data-input-stream/read-upto", test_read_upto); + 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..2ea0cb7 --- /dev/null +++ b/gio/tests/data-output-stream.c @@ -0,0 +1,508 @@ +/* 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_basic (void) +{ + GOutputStream *stream; + GOutputStream *base_stream; + gpointer data; + gint val; + + data = g_malloc0 (MAX_LINES_BUFF); + + /* 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)); + + g_object_get (stream, "byte-order", &val, NULL); + g_assert_cmpint (val, ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + g_object_set (stream, "byte-order", G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN, NULL); + g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN); + + g_object_unref (stream); + g_object_unref (base_stream); + g_free (data); +} + +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); + g_free (s); + } + + /* 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); +} + +static void +test_seek (void) +{ + GDataOutputStream *stream; + GMemoryOutputStream *base_stream; + GSeekable *seekable; + GError *error; + guchar *stream_data; + gsize len; + gboolean res; + + len = 8; + + /* create objects */ + stream_data = g_malloc0 (len); + base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, NULL, NULL)); + stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream)); + g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + seekable = G_SEEKABLE (stream); + g_assert (!g_seekable_can_truncate (seekable)); + error = NULL; + + /* Write */ + g_assert_cmpint (g_seekable_tell (seekable), ==, 0); + res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL); + g_assert_cmpint (g_seekable_tell (seekable), ==, 4); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + + /* Forward relative seek */ + res = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 6); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + res = g_data_output_stream_put_uint16 (stream, 0x89AB, NULL, &error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 8); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + g_assert_cmpint (stream_data[4], ==, 0x00); + g_assert_cmpint (stream_data[5], ==, 0x00); + g_assert_cmpint (stream_data[6], ==, 0x89); + g_assert_cmpint (stream_data[7], ==, 0xAB); + + /* Backward relative seek */ + res = g_seekable_seek (seekable, -3, G_SEEK_CUR, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 5); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + res = g_data_output_stream_put_uint16 (stream, 0xCDEF, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 7); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + g_assert_cmpint (stream_data[4], ==, 0x00); + g_assert_cmpint (stream_data[5], ==, 0xCD); + g_assert_cmpint (stream_data[6], ==, 0xEF); + g_assert_cmpint (stream_data[7], ==, 0xAB); + + /* From start */ + res = g_seekable_seek (seekable, 4, G_SEEK_SET, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 4); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + res = g_data_output_stream_put_uint16 (stream, 0xFEDC, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 6); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + g_assert_cmpint (stream_data[4], ==, 0xFE); + g_assert_cmpint (stream_data[5], ==, 0xDC); + g_assert_cmpint (stream_data[6], ==, 0xEF); + g_assert_cmpint (stream_data[7], ==, 0xAB); + + /* From end */ + res = g_seekable_seek (seekable, -4, G_SEEK_END, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 4); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + res = g_data_output_stream_put_uint16 (stream, 0xBA87, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_seekable_tell (seekable), ==, 6); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 8); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + g_assert_cmpint (stream_data[4], ==, 0xBA); + g_assert_cmpint (stream_data[5], ==, 0x87); + g_assert_cmpint (stream_data[6], ==, 0xEF); + g_assert_cmpint (stream_data[7], ==, 0xAB); + + g_object_unref (stream); + g_object_unref (base_stream); + g_free (stream_data); +} + +static void +test_truncate (void) +{ + GDataOutputStream *stream; + GMemoryOutputStream *base_stream; + GSeekable *seekable; + GError *error; + guchar *stream_data; + gsize len; + gboolean res; + + len = 8; + + /* Create objects */ + stream_data = g_malloc0 (len); + base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free)); + stream = g_data_output_stream_new (G_OUTPUT_STREAM (base_stream)); + g_data_output_stream_set_byte_order (stream, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN); + seekable = G_SEEKABLE (stream); + error = NULL; + g_assert (g_seekable_can_truncate (seekable)); + + /* Write */ + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0); + res = g_data_output_stream_put_uint16 (stream, 0x0123, NULL, &error); + g_assert_no_error (error); + g_assert (res); + res = g_data_output_stream_put_uint16 (stream, 0x4567, NULL, NULL); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + + /* Truncate at position */ + res = g_seekable_truncate (seekable, 4, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + + /* Truncate beyond position */ + res = g_seekable_truncate (seekable, 6, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + g_assert_cmpint (stream_data[2], ==, 0x45); + g_assert_cmpint (stream_data[3], ==, 0x67); + + /* Truncate before position */ + res = g_seekable_truncate (seekable, 2, NULL, &error); + g_assert_no_error (error); + g_assert (res); + g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2); + g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2); + g_assert_cmpint (stream_data[0], ==, 0x01); + g_assert_cmpint (stream_data[1], ==, 0x23); + + g_object_unref (stream); + g_object_unref (base_stream); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/data-output-stream/basic", test_basic); + g_test_add_func ("/data-output-stream/write-lines-LF", test_read_lines_LF); + g_test_add_func ("/data-output-stream/write-lines-CR", test_read_lines_CR); + g_test_add_func ("/data-output-stream/write-lines-CR-LF", test_read_lines_CR_LF); + g_test_add_func ("/data-output-stream/write-int", test_read_int); + g_test_add_func ("/data-output-stream/seek", test_seek); + g_test_add_func ("/data-output-stream/truncate", test_truncate); + + return g_test_run(); +} diff --git a/gio/tests/de.po b/gio/tests/de.po new file mode 100644 index 0000000..eed161c --- /dev/null +++ b/gio/tests/de.po @@ -0,0 +1,17 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: \n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgid "\"Unnamed\"" +msgstr "\"Unbenannt\"" + +msgctxt "keyboard label" +msgid "\"BackSpace\"" +msgstr "\"Löschen\"" diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c new file mode 100644 index 0000000..05dda7c --- /dev/null +++ b/gio/tests/desktop-app-info.c @@ -0,0 +1,399 @@ +/* + * 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_from_filename ("/usr/share/applications/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_free_full (list, g_object_unref); + + /* 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_free_full (list, g_object_unref); + + /* 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_free_full (list, g_object_unref); + + /* 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 +test_fallback (void) +{ + GAppInfo *info1, *info2, *app; + GList *apps, *recomm, *fallback, *list, *l, *m; + GError *error = NULL; + gint old_length; + + info1 = create_app_info ("Test1"); + info2 = create_app_info ("Test2"); + + g_assert (g_content_type_is_a ("text/x-python", "text/plain")); + + apps = g_app_info_get_all_for_type ("text/x-python"); + old_length = g_list_length (apps); + g_list_free_full (apps, g_object_unref); + + g_app_info_set_as_default_for_type (info1, "text/x-python", &error); + g_assert (error == NULL); + + g_app_info_set_as_default_for_type (info2, "text/plain", &error); + g_assert (error == NULL); + + /* check that both apps are registered */ + apps = g_app_info_get_all_for_type ("text/x-python"); + g_assert (g_list_length (apps) == old_length + 2); + + /* check the ordering */ + app = g_list_nth_data (apps, 0); + g_assert (g_app_info_equal (info1, app)); + + /* check that Test1 is the first recommended app */ + recomm = g_app_info_get_recommended_for_type ("text/x-python"); + g_assert (recomm != NULL); + app = g_list_nth_data (recomm, 0); + g_assert (g_app_info_equal (info1, app)); + + /* and that Test2 is the first fallback */ + fallback = g_app_info_get_fallback_for_type ("text/x-python"); + g_assert (fallback != NULL); + app = g_list_nth_data (fallback, 0); + g_assert (g_app_info_equal (info2, app)); + + /* check that recomm + fallback = all applications */ + list = g_list_concat (g_list_copy (recomm), g_list_copy (fallback)); + g_assert (g_list_length (list) == g_list_length (apps)); + + for (l = list, m = apps; l != NULL && m != NULL; l = l->next, m = m->next) + { + g_assert (g_app_info_equal (l->data, m->data)); + } + + g_list_free (list); + + g_list_free_full (apps, g_object_unref); + g_list_free_full (recomm, g_object_unref); + g_list_free_full (fallback, g_object_unref); + + g_app_info_reset_type_associations ("text/x-python"); + g_app_info_reset_type_associations ("text/plain"); + + g_app_info_delete (info1); + g_app_info_delete (info2); + + g_object_unref (info1); + g_object_unref (info2); +} + +static void +test_last_used (void) +{ + GList *applications; + GAppInfo *info1, *info2, *default_app; + GError *error = NULL; + + info1 = create_app_info ("Test1"); + info2 = create_app_info ("Test2"); + + g_app_info_set_as_default_for_type (info1, "application/x-test", &error); + g_assert (error == NULL); + + g_app_info_add_supports_type (info2, "application/x-test", &error); + g_assert (error == NULL); + + applications = g_app_info_get_recommended_for_type ("application/x-test"); + g_assert (g_list_length (applications) == 2); + + /* the first should be the default app now */ + g_assert (g_app_info_equal (g_list_nth_data (applications, 0), info1)); + g_assert (g_app_info_equal (g_list_nth_data (applications, 1), info2)); + + g_list_free_full (applications, g_object_unref); + + g_app_info_set_as_last_used_for_type (info2, "application/x-test", &error); + g_assert (error == NULL); + + applications = g_app_info_get_recommended_for_type ("application/x-test"); + g_assert (g_list_length (applications) == 2); + + default_app = g_app_info_get_default_for_type ("application/x-test", FALSE); + g_assert (g_app_info_equal (default_app, info1)); + + /* the first should be the other app now */ + g_assert (g_app_info_equal (g_list_nth_data (applications, 0), info2)); + g_assert (g_app_info_equal (g_list_nth_data (applications, 1), info1)); + + g_list_free_full (applications, g_object_unref); + + g_app_info_reset_type_associations ("application/x-test"); + + g_app_info_delete (info1); + g_app_info_delete (info2); + + g_object_unref (info1); + g_object_unref (info2); + g_object_unref (default_app); +} + +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); +} + +static void +test_extra_getters (void) +{ + GDesktopAppInfo *appinfo; + gchar *s; + gboolean b; + + appinfo = g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop"); + g_assert (appinfo != NULL); + + g_assert (g_desktop_app_info_has_key (appinfo, "Terminal")); + g_assert (!g_desktop_app_info_has_key (appinfo, "Bratwurst")); + + s = g_desktop_app_info_get_string (appinfo, "StartupWMClass"); + g_assert_cmpstr (s, ==, "appinfo-class"); + g_free (s); + + b = g_desktop_app_info_get_boolean (appinfo, "Terminal"); + g_assert (b); + + g_object_unref (appinfo); +} + +int +main (int argc, + char *argv[]) +{ + gint result; + + 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); + g_test_add_func ("/desktop-app-info/fallback", test_fallback); + g_test_add_func ("/desktop-app-info/lastused", test_last_used); + g_test_add_func ("/desktop-app-info/extra-getters", test_extra_getters); + + 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..7634b5b --- /dev/null +++ b/gio/tests/echo-server.c @@ -0,0 +1,70 @@ +#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; + + 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/enums.xml.template b/gio/tests/enums.xml.template new file mode 100644 index 0000000..67d07b5 --- /dev/null +++ b/gio/tests/enums.xml.template @@ -0,0 +1,18 @@ +/*** BEGIN comment ***/ + +/*** END comment ***/ +/*** BEGIN file-header ***/ + +/*** END file-header ***/ +/*** BEGIN value-header ***/ + <@type@ id='org.gtk.test.@EnumName@'> +/*** END value-header ***/ +/*** BEGIN value-production ***/ + +/*** END value-production ***/ +/*** BEGIN value-tail ***/ + +/*** END value-tail ***/ +/*** BEGIN file-tail ***/ + +/*** END file-tail ***/ diff --git a/gio/tests/file.c b/gio/tests/file.c new file mode 100644 index 0000000..7106d89 --- /dev/null +++ b/gio/tests/file.c @@ -0,0 +1,751 @@ +#include +#include +#include +#include +#include + +static void +test_basic (void) +{ + GFile *file; + gchar *s; + + file = g_file_new_for_path ("./some/directory/testfile"); + + s = g_file_get_basename (file); + g_assert_cmpstr (s, ==, "testfile"); + g_free (s); + + s = g_file_get_uri (file); + g_assert (g_str_has_prefix (s, "file://")); + g_assert (g_str_has_suffix (s, "/some/directory/testfile")); + g_free (s); + + g_assert (g_file_has_uri_scheme (file, "file")); + s = g_file_get_uri_scheme (file); + g_assert_cmpstr (s, ==, "file"); + g_free (s); + + g_object_unref (file); +} + +static void +test_parent (void) +{ + GFile *file; + GFile *file2; + GFile *parent; + GFile *root; + + file = g_file_new_for_path ("./some/directory/testfile"); + file2 = g_file_new_for_path ("./some/directory"); + root = g_file_new_for_path ("/"); + + g_assert (g_file_has_parent (file, file2)); + + parent = g_file_get_parent (file); + g_assert (g_file_equal (parent, file2)); + g_object_unref (parent); + + g_assert (g_file_get_parent (root) == NULL); + + g_object_unref (file); + g_object_unref (file2); + g_object_unref (root); +} + +static void +test_child (void) +{ + GFile *file; + GFile *child; + GFile *child2; + + file = g_file_new_for_path ("./some/directory"); + child = g_file_get_child (file, "child"); + g_assert (g_file_has_parent (child, file)); + + child2 = g_file_get_child_for_display_name (file, "child2", NULL); + g_assert (g_file_has_parent (child2, file)); + + g_object_unref (child); + g_object_unref (child2); + g_object_unref (file); +} + +static void +test_type (void) +{ + GFile *file; + GFileType type; + GError *error = NULL; + + file = g_file_new_for_path (SRCDIR "/file.c"); + type = g_file_query_file_type (file, 0, NULL); + g_assert_cmpint (type, ==, G_FILE_TYPE_REGULAR); + g_object_unref (file); + + file = g_file_new_for_path (SRCDIR "/schema-tests"); + type = g_file_query_file_type (file, 0, NULL); + g_assert_cmpint (type, ==, G_FILE_TYPE_DIRECTORY); + + g_file_read (file, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_IS_DIRECTORY); + g_error_free (error); + g_object_unref (file); +} + + +typedef struct +{ + GFile *file; + GFileMonitor *monitor; + GOutputStream *ostream; + GInputStream *istream; + GMainLoop *loop; + gint buffersize; + gint monitor_created; + gint monitor_deleted; + gint monitor_changed; + gchar *monitor_path; + gint pos; + gchar *data; + gchar *buffer; + guint timeout; +} CreateDeleteData; + +static void +monitor_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + gchar *path; + + path = g_file_get_path (file); + g_assert_cmpstr (data->monitor_path, ==, path); + g_free (path); + + if (event_type == G_FILE_MONITOR_EVENT_CREATED) + data->monitor_created++; + if (event_type == G_FILE_MONITOR_EVENT_DELETED) + data->monitor_deleted++; + if (event_type == G_FILE_MONITOR_EVENT_CHANGED) + data->monitor_changed++; +} + + +static gboolean +quit_idle (gpointer user_data) +{ + CreateDeleteData *data = user_data; + + g_source_remove (data->timeout); + g_main_loop_quit (data->loop); + + return FALSE; +} + +static void +iclosed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + gboolean ret; + + error = NULL; + ret = g_input_stream_close_finish (data->istream, res, &error); + g_assert_no_error (error); + g_assert (ret); + + g_assert (g_input_stream_is_closed (data->istream)); + + ret = g_file_delete (data->file, NULL, &error); + g_assert (ret); + g_assert_no_error (error); + + /* work around file monitor bug: + * inotify events are only processed every 1000 ms, regardless + * of the rate limit set on the file monitor + */ + g_timeout_add (2000, quit_idle, data); +} + +static void +read_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + gssize size; + + error = NULL; + size = g_input_stream_read_finish (data->istream, res, &error); + g_assert_no_error (error); + + data->pos += size; + if (data->pos < strlen (data->data)) + { + g_input_stream_read_async (data->istream, + data->buffer + data->pos, + strlen (data->data) - data->pos, + 0, + NULL, + read_cb, + data); + } + else + { + g_assert_cmpstr (data->buffer, ==, data->data); + g_assert (!g_input_stream_is_closed (data->istream)); + g_input_stream_close_async (data->istream, 0, NULL, iclosed_cb, data); + } +} + +static void +ipending_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + + error = NULL; + g_input_stream_read_finish (data->istream, res, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING); + g_error_free (error); +} + +static void +skipped_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + gssize size; + + error = NULL; + size = g_input_stream_skip_finish (data->istream, res, &error); + g_assert_no_error (error); + g_assert_cmpint (size, ==, data->pos); + + g_input_stream_read_async (data->istream, + data->buffer + data->pos, + strlen (data->data) - data->pos, + 0, + NULL, + read_cb, + data); + /* check that we get a pending error */ + g_input_stream_read_async (data->istream, + data->buffer + data->pos, + strlen (data->data) - data->pos, + 0, + NULL, + ipending_cb, + data); +} + +static void +opened_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GFileInputStream *base; + CreateDeleteData *data = user_data; + GError *error; + + error = NULL; + base = g_file_read_finish (data->file, res, &error); + g_assert_no_error (error); + + if (data->buffersize == 0) + data->istream = G_INPUT_STREAM (g_object_ref (base)); + else + data->istream = g_buffered_input_stream_new_sized (G_INPUT_STREAM (base), data->buffersize); + g_object_unref (base); + + data->buffer = g_new0 (gchar, strlen (data->data) + 1); + + /* copy initial segment directly, then skip */ + memcpy (data->buffer, data->data, 10); + data->pos = 10; + + g_input_stream_skip_async (data->istream, + 10, + 0, + NULL, + skipped_cb, + data); +} + +static void +oclosed_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + gboolean ret; + + error = NULL; + ret = g_output_stream_close_finish (data->ostream, res, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert (g_output_stream_is_closed (data->ostream)); + + g_file_read_async (data->file, 0, NULL, opened_cb, data); +} + +static void +written_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + gssize size; + GError *error; + + error = NULL; + size = g_output_stream_write_finish (data->ostream, res, &error); + g_assert_no_error (error); + + data->pos += size; + if (data->pos < strlen (data->data)) + { + g_output_stream_write_async (data->ostream, + data->data + data->pos, + strlen (data->data) - data->pos, + 0, + NULL, + written_cb, + data); + } + else + { + g_assert (!g_output_stream_is_closed (data->ostream)); + g_output_stream_close_async (data->ostream, 0, NULL, oclosed_cb, data); + } +} + +static void +opending_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + CreateDeleteData *data = user_data; + GError *error; + + error = NULL; + g_output_stream_write_finish (data->ostream, res, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING); + g_error_free (error); +} + +static void +created_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GFileOutputStream *base; + CreateDeleteData *data = user_data; + GError *error; + + error = NULL; + base = g_file_create_finish (G_FILE (source), res, &error); + g_assert_no_error (error); + g_assert (g_file_query_exists (data->file, NULL)); + + if (data->buffersize == 0) + data->ostream = G_OUTPUT_STREAM (g_object_ref (base)); + else + data->ostream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), data->buffersize); + g_object_unref (base); + + g_output_stream_write_async (data->ostream, + data->data, + strlen (data->data), + 0, + NULL, + written_cb, + data); + /* check that we get a pending error */ + g_output_stream_write_async (data->ostream, + data->data, + strlen (data->data), + 0, + NULL, + opending_cb, + data); +} + +static gboolean +stop_timeout (gpointer data) +{ + g_assert_not_reached (); + + return FALSE; +} + +/* + * This test does a fully async create-write-read-delete. + * Callbackistan. + */ +static void +test_create_delete (gconstpointer d) +{ + GError *error; + CreateDeleteData *data; + GFileIOStream *iostream; + + data = g_new0 (CreateDeleteData, 1); + + data->buffersize = GPOINTER_TO_INT (d); + data->data = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789"; + data->pos = 0; + + data->file = g_file_new_tmp ("g_file_create_delete_XXXXXX", + &iostream, NULL); + g_assert (data->file != NULL); + g_object_unref (iostream); + + data->monitor_path = g_file_get_path (data->file); + remove (data->monitor_path); + + g_assert (!g_file_query_exists (data->file, NULL)); + + error = NULL; + data->monitor = g_file_monitor_file (data->file, 0, NULL, &error); + g_assert_no_error (error); + + /* This test doesn't work with GPollFileMonitor, because it assumes + * that the monitor will notice a create immediately followed by a + * delete, rather than coalescing them into nothing. + */ + if (!strcmp (G_OBJECT_TYPE_NAME (data->monitor), "GPollFileMonitor")) + { + g_print ("skipping test for this GFileMonitor implementation"); + goto skip; + } + + g_file_monitor_set_rate_limit (data->monitor, 100); + + g_signal_connect (data->monitor, "changed", G_CALLBACK (monitor_changed), data); + + data->loop = g_main_loop_new (NULL, FALSE); + + data->timeout = g_timeout_add (5000, stop_timeout, NULL); + + g_file_create_async (data->file, 0, 0, NULL, created_cb, data); + + g_main_loop_run (data->loop); + + g_assert_cmpint (data->monitor_created, ==, 1); + g_assert_cmpint (data->monitor_deleted, ==, 1); + g_assert_cmpint (data->monitor_changed, >, 0); + + g_assert (!g_file_monitor_is_cancelled (data->monitor)); + g_file_monitor_cancel (data->monitor); + g_assert (g_file_monitor_is_cancelled (data->monitor)); + + g_main_loop_unref (data->loop); + g_object_unref (data->ostream); + g_object_unref (data->istream); + + skip: + g_object_unref (data->monitor); + g_object_unref (data->file); + free (data->monitor_path); + g_free (data->buffer); + g_free (data); +} + +static const gchar *replace_data = + "/**\n" + " * g_file_replace_contents_async:\n" + " * @file: input #GFile.\n" + " * @contents: string of contents to replace the file with.\n" + " * @length: the length of @contents in bytes.\n" + " * @etag: (allow-none): a new entity tag for the @file, or %NULL\n" + " * @make_backup: %TRUE if a backup should be created.\n" + " * @flags: a set of #GFileCreateFlags.\n" + " * @cancellable: optional #GCancellable object, %NULL to ignore.\n" + " * @callback: a #GAsyncReadyCallback to call when the request is satisfied\n" + " * @user_data: the data to pass to callback function\n" + " * \n" + " * Starts an asynchronous replacement of @file with the given \n" + " * @contents of @length bytes. @etag will replace the document's\n" + " * current entity tag.\n" + " * \n" + " * When this operation has completed, @callback will be called with\n" + " * @user_user data, and the operation can be finalized with \n" + " * g_file_replace_contents_finish().\n" + " * \n" + " * If @cancellable is not %NULL, then the operation can be cancelled by\n" + " * triggering the cancellable object from another thread. If the operation\n" + " * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. \n" + " * \n" + " * If @make_backup is %TRUE, this function will attempt to \n" + " * make a backup of @file.\n" + " **/\n"; + +typedef struct +{ + GFile *file; + const gchar *data; + GMainLoop *loop; + gboolean again; +} ReplaceLoadData; + +static void replaced_cb (GObject *source, + GAsyncResult *res, + gpointer user_data); + +static void +loaded_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + ReplaceLoadData *data = user_data; + gboolean ret; + GError *error; + gchar *contents; + gsize length; + + error = NULL; + ret = g_file_load_contents_finish (data->file, res, &contents, &length, NULL, &error); + g_assert (ret); + g_assert_no_error (error); + g_assert_cmpint (length, ==, strlen (data->data)); + g_assert_cmpstr (contents, ==, data->data); + + g_free (contents); + + if (data->again) + { + data->again = FALSE; + data->data = "pi pa po"; + + g_file_replace_contents_async (data->file, + data->data, + strlen (data->data), + NULL, + FALSE, + 0, + NULL, + replaced_cb, + data); + } + else + { + error = NULL; + ret = g_file_delete (data->file, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_assert (!g_file_query_exists (data->file, NULL)); + + g_main_loop_quit (data->loop); + } +} + +static void +replaced_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + ReplaceLoadData *data = user_data; + GError *error; + + error = NULL; + g_file_replace_contents_finish (data->file, res, NULL, &error); + g_assert_no_error (error); + + g_file_load_contents_async (data->file, NULL, loaded_cb, data); +} + +static void +test_replace_load (void) +{ + ReplaceLoadData *data; + gchar *path; + GFileIOStream *iostream; + + data = g_new0 (ReplaceLoadData, 1); + data->again = TRUE; + data->data = replace_data; + + data->file = g_file_new_tmp ("g_file_replace_load_XXXXXX", + &iostream, NULL); + g_assert (data->file != NULL); + g_object_unref (iostream); + + path = g_file_get_path (data->file); + remove (path); + + g_assert (!g_file_query_exists (data->file, NULL)); + + data->loop = g_main_loop_new (NULL, FALSE); + + g_file_replace_contents_async (data->file, + data->data, + strlen (data->data), + NULL, + FALSE, + 0, + NULL, + replaced_cb, + data); + + g_main_loop_run (data->loop); + + g_main_loop_unref (data->loop); + g_object_unref (data->file); + g_free (data); + free (path); +} + +static void +test_replace_cancel (void) +{ + GFile *tmpdir, *file; + GFileOutputStream *ostream; + GFileEnumerator *fenum; + GFileInfo *info; + GCancellable *cancellable; + gchar *path; + gsize nwrote; + GError *error = NULL; + + g_test_bug ("629301"); + + path = g_dir_make_tmp ("g_file_replace_cancel_XXXXXX", &error); + g_assert_no_error (error); + tmpdir = g_file_new_for_path (path); + g_free (path); + + file = g_file_get_child (tmpdir, "file"); + g_file_replace_contents (file, + replace_data, + strlen (replace_data), + NULL, FALSE, 0, NULL, + NULL, &error); + g_assert_no_error (error); + + ostream = g_file_replace (file, NULL, TRUE, 0, NULL, &error); + g_assert_no_error (error); + + g_output_stream_write_all (G_OUTPUT_STREAM (ostream), + replace_data, strlen (replace_data), + &nwrote, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, strlen (replace_data)); + + /* At this point there should be two files; the original and the + * temporary. + */ + fenum = g_file_enumerate_children (tmpdir, NULL, 0, NULL, &error); + g_assert_no_error (error); + + info = g_file_enumerator_next_file (fenum, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_object_unref (info); + info = g_file_enumerator_next_file (fenum, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_object_unref (info); + + g_file_enumerator_close (fenum, NULL, &error); + g_assert_no_error (error); + g_object_unref (fenum); + + /* Make sure the temporary gets deleted even if we cancel. */ + cancellable = g_cancellable_new (); + g_cancellable_cancel (cancellable); + g_output_stream_close (G_OUTPUT_STREAM (ostream), cancellable, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + + g_object_unref (cancellable); + g_object_unref (ostream); + + g_file_delete (file, NULL, &error); + g_assert_no_error (error); + g_object_unref (file); + + /* This will only succeed if the temp file was deleted. */ + g_file_delete (tmpdir, NULL, &error); + g_assert_no_error (error); + g_object_unref (tmpdir); +} + +static void +on_file_deleted (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *local_error = NULL; + GMainLoop *loop = user_data; + + (void) g_file_delete_finish ((GFile*)object, result, &local_error); + g_assert_no_error (local_error); + + g_main_loop_quit (loop); +} + +static void +test_async_delete (void) +{ + GFile *file; + GFileIOStream *iostream; + GError *local_error = NULL; + GError **error = &local_error; + GMainLoop *loop; + + file = g_file_new_tmp ("g_file_delete_XXXXXX", + &iostream, error); + g_assert_no_error (local_error); + g_object_unref (iostream); + + g_assert (g_file_query_exists (file, NULL)); + + loop = g_main_loop_new (NULL, TRUE); + + g_file_delete_async (file, G_PRIORITY_DEFAULT, NULL, on_file_deleted, loop); + + g_main_loop_run (loop); + + g_assert (!g_file_query_exists (file, NULL)); + + g_main_loop_unref (loop); + g_object_unref (file); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/file/basic", test_basic); + g_test_add_func ("/file/parent", test_parent); + g_test_add_func ("/file/child", test_child); + g_test_add_func ("/file/type", test_type); + g_test_add_data_func ("/file/async-create-delete/0", GINT_TO_POINTER (0), test_create_delete); + g_test_add_data_func ("/file/async-create-delete/1", GINT_TO_POINTER (1), test_create_delete); + g_test_add_data_func ("/file/async-create-delete/10", GINT_TO_POINTER (10), test_create_delete); + g_test_add_data_func ("/file/async-create-delete/25", GINT_TO_POINTER (25), test_create_delete); + g_test_add_data_func ("/file/async-create-delete/4096", GINT_TO_POINTER (4096), test_create_delete); + g_test_add_func ("/file/replace-load", test_replace_load); + g_test_add_func ("/file/replace-cancel", test_replace_cancel); + g_test_add_func ("/file/async-delete", test_async_delete); + + return g_test_run (); +} diff --git a/gio/tests/fileattributematcher.c b/gio/tests/fileattributematcher.c new file mode 100644 index 0000000..95b78ec --- /dev/null +++ b/gio/tests/fileattributematcher.c @@ -0,0 +1,176 @@ +#include + +static void +test_exact (void) +{ + char *exact_matches[] = { + "*", + "a::*", + "a::*,b::*", + "a::a,a::b", + "a::a,a::b,b::*" + }; + + GFileAttributeMatcher *matcher; + char *s; + guint i; + + for (i = 0; i < G_N_ELEMENTS (exact_matches); i++) + { + matcher = g_file_attribute_matcher_new (exact_matches[i]); + s = g_file_attribute_matcher_to_string (matcher); + if (! g_str_equal (exact_matches[i], s)) + { + g_test_fail (); + g_test_message ("matcher should be %s, but is %s", exact_matches[i], s); + } + g_free (s); + g_file_attribute_matcher_unref (matcher); + } +} + +static void +test_equality (void) +{ + struct { + char *expected; + char *actual; + } equals[] = { + /* star makes everything else go away */ + { "*", "*,*" }, + { "*", "*,a::*" }, + { "*", "*,a::b" }, + { "*", "a::*,*" }, + { "*", "a::b,*" }, + { "*", "a::b,*,a::*" }, + /* a::* makes a:: go away */ + { "a::*", "a::*,a::*" }, + { "a::*", "a::*,a::b" }, + { "a::*", "a::b,a::*" }, + { "a::*", "a::b,a::*,a::c" }, + /* a::b does not allow duplicates */ + { "a::b", "a::b,a::b" }, + { "a::b,a::c", "a::b,a::c,a::b" }, + /* stuff gets ordered in registration order */ + { "a::b,a::c", "a::c,a::b" }, + { "a::*,b::*", "b::*,a::*" }, + }; + + GFileAttributeMatcher *matcher; + char *s; + guint i; + + for (i = 0; i < G_N_ELEMENTS (equals); i++) + { + matcher = g_file_attribute_matcher_new (equals[i].actual); + s = g_file_attribute_matcher_to_string (matcher); + if (! g_str_equal (equals[i].expected, s)) + { + g_test_fail (); + g_test_message ("matcher for %s should be %s, but is %s", equals[i].actual, equals[i].expected, s); + } + g_free (s); + g_file_attribute_matcher_unref (matcher); + } +} + +static void +test_subtract (void) +{ + struct { + char *attributes; + char *subtract; + char *result; + } subtractions[] = { + /* * subtracts everything */ + { "*", "*", NULL }, + { "a::*", "*", NULL }, + { "a::b", "*", NULL }, + { "a::b,a::c", "*", NULL }, + { "a::*,b::*", "*", NULL }, + { "a::*,b::c", "*", NULL }, + { "a::b,b::*", "*", NULL }, + { "a::b,b::c", "*", NULL }, + { "a::b,a::c,b::*", "*", NULL }, + { "a::b,a::c,b::c", "*", NULL }, + /* a::* subtracts all a's */ + { "*", "a::*", "*" }, + { "a::*", "a::*", NULL }, + { "a::b", "a::*", NULL }, + { "a::b,a::c", "a::*", NULL }, + { "a::*,b::*", "a::*", "b::*" }, + { "a::*,b::c", "a::*", "b::c" }, + { "a::b,b::*", "a::*", "b::*" }, + { "a::b,b::c", "a::*", "b::c" }, + { "a::b,a::c,b::*", "a::*", "b::*" }, + { "a::b,a::c,b::c", "a::*", "b::c" }, + /* a::b subtracts exactly that */ + { "*", "a::b", "*" }, + { "a::*", "a::b", "a::*" }, + { "a::b", "a::b", NULL }, + { "a::b,a::c", "a::b", "a::c" }, + { "a::*,b::*", "a::b", "a::*,b::*" }, + { "a::*,b::c", "a::b", "a::*,b::c" }, + { "a::b,b::*", "a::b", "b::*" }, + { "a::b,b::c", "a::b", "b::c" }, + { "a::b,a::c,b::*", "a::b", "a::c,b::*" }, + { "a::b,a::c,b::c", "a::b", "a::c,b::c" }, + /* a::b,b::* subtracts both of those */ + { "*", "a::b,b::*", "*" }, + { "a::*", "a::b,b::*", "a::*" }, + { "a::b", "a::b,b::*", NULL }, + { "a::b,a::c", "a::b,b::*", "a::c" }, + { "a::*,b::*", "a::b,b::*", "a::*" }, + { "a::*,b::c", "a::b,b::*", "a::*" }, + { "a::b,b::*", "a::b,b::*", NULL }, + { "a::b,b::c", "a::b,b::*", NULL }, + { "a::b,a::c,b::*", "a::b,b::*", "a::c" }, + { "a::b,a::c,b::c", "a::b,b::*", "a::c" }, + /* a::b,b::c should work, too */ + { "*", "a::b,b::c", "*" }, + { "a::*", "a::b,b::c", "a::*" }, + { "a::b", "a::b,b::c", NULL }, + { "a::b,a::c", "a::b,b::c", "a::c" }, + { "a::*,b::*", "a::b,b::c", "a::*,b::*" }, + { "a::*,b::c", "a::b,b::c", "a::*" }, + { "a::b,b::*", "a::b,b::c", "b::*" }, + { "a::b,b::c", "a::b,b::c", NULL }, + { "a::b,a::c,b::*", "a::b,b::c", "a::c,b::*" }, + { "a::b,a::c,b::c", "a::b,b::c", "a::c" }, + }; + + GFileAttributeMatcher *matcher, *subtract, *result; + char *s; + guint i; + + for (i = 0; i < G_N_ELEMENTS (subtractions); i++) + { + matcher = g_file_attribute_matcher_new (subtractions[i].attributes); + subtract = g_file_attribute_matcher_new (subtractions[i].subtract); + result = g_file_attribute_matcher_subtract (matcher, subtract); + s = g_file_attribute_matcher_to_string (result); + if (g_strcmp0 (subtractions[i].result, s)) + { + g_test_fail (); + g_test_message ("matcher for %s - %s should be %s, but is %s", + subtractions[i].attributes, subtractions[i].subtract, + subtractions[i].result, s); + } + g_free (s); + g_file_attribute_matcher_unref (matcher); + g_file_attribute_matcher_unref (subtract); + g_file_attribute_matcher_unref (result); + } +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/fileattributematcher/exact", test_exact); + g_test_add_func ("/fileattributematcher/equality", test_equality); + g_test_add_func ("/fileattributematcher/subtract", test_subtract); + + return g_test_run (); +} diff --git a/gio/tests/filter-cat.c b/gio/tests/filter-cat.c new file mode 100644 index 0000000..a367461 --- /dev/null +++ b/gio/tests/filter-cat.c @@ -0,0 +1,261 @@ +/* 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 +decompressor_file_info_notify_cb (GZlibDecompressor *decompressor, + GParamSpec *pspec, + gpointer data) +{ + GFileInfo *file_info; + const gchar *filename; + + file_info = g_zlib_decompressor_get_file_info (decompressor); + if (file_info == NULL) + return; + + filename = g_file_info_get_name (file_info); + if (filename) + g_printerr ("Decompressor filename: %s\n", filename); +} + +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_signal_connect (conv, "notify::file-info", G_CALLBACK (decompressor_file_info_notify_cb), NULL); + 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; + GFileInfo *in_file_info; + + in_file_info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_NAME "," + G_FILE_ATTRIBUTE_TIME_MODIFIED, + G_FILE_QUERY_INFO_NONE, + NULL, + &error); + if (in_file_info == NULL) + { + g_printerr ("%s: %s: error reading file info: %s\n", + g_get_prgname (), g_file_get_uri (file), error->message); + g_error_free (error); + return; + } + + conv = (GConverter *)g_zlib_compressor_new(gzip?G_ZLIB_COMPRESSOR_FORMAT_GZIP:G_ZLIB_COMPRESSOR_FORMAT_ZLIB, -1); + g_zlib_compressor_set_file_info (G_ZLIB_COMPRESSOR (conv), in_file_info); + old = in; + in = (GInputStream *) g_converter_input_stream_new (in, conv); + g_object_unref (conv); + g_object_unref (old); + g_object_unref (in_file_info); + } + + 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; + + 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..5ec23ae --- /dev/null +++ b/gio/tests/filter-streams.c @@ -0,0 +1,392 @@ +/* + * 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 +#include + +/* GFilterInputStream and GFilterOutputStream are abstract, so define + * minimal subclasses for testing. (This used to use + * GBufferedInputStream and GBufferedOutputStream, but those have + * their own test program, and they override some methods, meaning the + * core filter stream functionality wasn't getting fully tested.) + */ + +GType test_filter_input_stream_get_type (void); +GType test_filter_output_stream_get_type (void); + +#define TEST_TYPE_FILTER_INPUT_STREAM (test_filter_input_stream_get_type ()) +#define TEST_FILTER_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TEST_TYPE_FILTER_INPUT_STREAM, TestFilterInputStream)) +#define TEST_TYPE_FILTER_OUTPUT_STREAM (test_filter_output_stream_get_type ()) +#define TEST_FILTER_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TEST_TYPE_FILTER_OUTPUT_STREAM, TestFilterOutputStream)) + +typedef GFilterInputStream TestFilterInputStream; +typedef GFilterInputStreamClass TestFilterInputStreamClass; +typedef GFilterOutputStream TestFilterOutputStream; +typedef GFilterOutputStreamClass TestFilterOutputStreamClass; + +G_DEFINE_TYPE (TestFilterInputStream, test_filter_input_stream, G_TYPE_FILTER_INPUT_STREAM); +G_DEFINE_TYPE (TestFilterOutputStream, test_filter_output_stream, G_TYPE_FILTER_OUTPUT_STREAM); + +static void +test_filter_input_stream_init (TestFilterInputStream *stream) +{ +} + +static void +test_filter_input_stream_class_init (TestFilterInputStreamClass *klass) +{ +} + +static void +test_filter_output_stream_init (TestFilterOutputStream *stream) +{ +} + +static void +test_filter_output_stream_class_init (TestFilterOutputStreamClass *klass) +{ +} + +/* Now the tests */ + +static void +test_input_filter (void) +{ + GInputStream *base, *f1, *f2, *s; + gboolean close_base; + gchar buf[1024]; + GError *error = NULL; + + g_test_bug ("568394"); + base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL); + f1 = g_object_new (TEST_TYPE_FILTER_INPUT_STREAM, + "base-stream", base, + "close-base-stream", FALSE, + NULL); + f2 = g_object_new (TEST_TYPE_FILTER_INPUT_STREAM, + "base-stream", base, + NULL); + + 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_get (f1, + "close-base-stream", &close_base, + "base-stream", &s, + NULL); + g_assert (!close_base); + g_assert (s == base); + g_object_unref (s); + + g_object_unref (f1); + + g_assert (!g_input_stream_is_closed (base)); + g_assert (!g_input_stream_is_closed (f2)); + + g_input_stream_skip (f2, 3, NULL, &error); + g_assert_no_error (error); + + memset (buf, 0, 1024); + g_input_stream_read_all (f2, buf, 1024, NULL, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (buf, ==, "defghijk"); + + 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_object_new (TEST_TYPE_FILTER_OUTPUT_STREAM, + "base-stream", base, + "close-base-stream", FALSE, + NULL); + f2 = g_object_new (TEST_TYPE_FILTER_OUTPUT_STREAM, + "base-stream", base, + NULL); + + 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; +GMainLoop *loop; + +static void +return_result_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GAsyncResult **ret = user_data; + + *ret = g_object_ref (result); + g_main_loop_quit (loop); +} + +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; + g_main_loop_quit (loop); +} + +static void +test_input_async (void) +{ + GInputStream *base, *f1, *f2; + char buf[20]; + GAsyncResult *result = NULL; + GError *error = NULL; + + loop = g_main_loop_new (NULL, FALSE); + + base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyz", -1, NULL); + f1 = g_object_new (TEST_TYPE_FILTER_INPUT_STREAM, + "base-stream", base, + "close-base-stream", FALSE, + NULL); + f2 = g_object_new (TEST_TYPE_FILTER_INPUT_STREAM, + "base-stream", base, + NULL); + + 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); + + + memset (buf, 0, sizeof (buf)); + g_input_stream_read_async (f1, buf, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + g_main_loop_run (loop); + g_assert_cmpint (g_input_stream_read_finish (f1, result, &error), ==, 10); + g_assert_cmpstr (buf, ==, "abcdefghij"); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (base)), ==, 10); + + g_input_stream_skip_async (f2, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + g_main_loop_run (loop); + g_assert_cmpint (g_input_stream_skip_finish (f2, result, &error), ==, 10); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (base)), ==, 20); + + memset (buf, 0, sizeof (buf)); + g_input_stream_read_async (f1, buf, 10, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + g_main_loop_run (loop); + g_assert_cmpint (g_input_stream_read_finish (f1, result, &error), ==, 6); + g_assert_cmpstr (buf, ==, "uvwxyz"); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (base)), ==, 26); + + + 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); + g_main_loop_run (loop); + 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); + g_main_loop_run (loop); + 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); + g_main_loop_unref (loop); +} + +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; + g_main_loop_quit (loop); +} + +static void +test_output_async (void) +{ + GOutputStream *base, *f1, *f2; + GAsyncResult *result = NULL; + GError *error = NULL; + + loop = g_main_loop_new (NULL, FALSE); + + base = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + f1 = g_object_new (TEST_TYPE_FILTER_OUTPUT_STREAM, + "base-stream", base, + "close-base-stream", FALSE, + NULL); + f2 = g_object_new (TEST_TYPE_FILTER_OUTPUT_STREAM, + "base-stream", base, + NULL); + + 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_output_stream_write_async (f1, "abcdefghijklm", 13, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + g_main_loop_run (loop); + g_assert_cmpint (g_output_stream_write_finish (f1, result, &error), ==, 13); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (base)), ==, 13); + + g_output_stream_write_async (f2, "nopqrstuvwxyz", 13, G_PRIORITY_DEFAULT, + NULL, return_result_cb, &result); + g_main_loop_run (loop); + g_assert_cmpint (g_output_stream_write_finish (f2, result, &error), ==, 13); + g_assert_no_error (error); + g_clear_object (&result); + + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (base)), ==, 26); + + g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 26); + g_output_stream_write (base, "\0", 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnopqrstuvwxyz"); + + + 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); + g_main_loop_run (loop); + 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); + g_main_loop_run (loop); + 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); + g_main_loop_unref (loop); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/filter-stream/input", test_input_filter); + g_test_add_func ("/filter-stream/output", test_output_filter); + g_test_add_func ("/filter-stream/async-input", test_input_async); + g_test_add_func ("/filter-stream/async-output", test_output_async); + + 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..85fc9f3 --- /dev/null +++ b/gio/tests/g-file-info.c @@ -0,0 +1,126 @@ +/* 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_strfreev (attr_list); + + 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); + g_strfreev (attr_list); + + 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_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..9e3a633 --- /dev/null +++ b/gio/tests/g-file.c @@ -0,0 +1,537 @@ +/* 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[] = + { + {G_DIR_SEPARATOR_S, 0, FALSE, G_DIR_SEPARATOR_S}, + {"file:///", 0, TRUE, G_DIR_SEPARATOR_S}, + {"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" G_DIR_SEPARATOR_S "dir3"}, + {"/dir1/", TRUE, FALSE, "/dir1/dir2/dir3/", "dir2" G_DIR_SEPARATOR_S "dir3"}, + {"/dir1", TRUE, FALSE, "/dir1/dir2/dir3", "dir2" G_DIR_SEPARATOR_S "dir3"}, + {"/dir1/", TRUE, FALSE, "/dir1/dir2/dir3", "dir2" G_DIR_SEPARATOR_S "dir3"}, + {"/tmp/", FALSE, FALSE, "/something/", NULL}, + {"/dir1/dir2", FALSE, FALSE, "/dir1/", NULL}, + {"//dir1/new", TRUE, FALSE, "//dir1/new/dir2/dir3", "dir2" G_DIR_SEPARATOR_S "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" G_DIR_SEPARATOR_S "dir3"}, + {"file:///dir1/", TRUE, TRUE, "file:///dir1/dir2/dir3/", "dir2" G_DIR_SEPARATOR_S "dir3"}, + {"file:///dir1", TRUE, TRUE, "file:///dir1/dir2/dir3", "dir2" G_DIR_SEPARATOR_S "dir3"}, + {"file:///dir1/", TRUE, TRUE, "file:///dir1/dir2/dir3", "dir2" G_DIR_SEPARATOR_S "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" G_DIR_SEPARATOR_S "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_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..8431135 --- /dev/null +++ b/gio/tests/g-icon.c @@ -0,0 +1,382 @@ +/* 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; + gint origin; + GIcon *i; + GFile *file; + + 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); + + g_object_get (icon, "file", &file, NULL); + g_assert (file == location); + g_object_unref (file); + + data = g_icon_to_string (icon); + g_assert_cmpstr (data, ==, G_DIR_SEPARATOR_S "some" G_DIR_SEPARATOR_S "native" G_DIR_SEPARATOR_S "path" G_DIR_SEPARATOR_S "to" G_DIR_SEPARATOR_S "an" G_DIR_SEPARATOR_S "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, ==, G_DIR_SEPARATOR_S "some" G_DIR_SEPARATOR_S "native" G_DIR_SEPARATOR_S "path" G_DIR_SEPARATOR_S "to" G_DIR_SEPARATOR_S "an" G_DIR_SEPARATOR_S "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, ==, G_DIR_SEPARATOR_S "path" G_DIR_SEPARATOR_S "to" G_DIR_SEPARATOR_S "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_get (emblem1, "origin", &origin, "icon", &i, NULL); + g_assert (origin == G_EMBLEM_ORIGIN_DEVICE); + g_assert (i == icon2); + g_object_unref (i); + + 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); + g_free (data); +} + +static void +test_themed_icon (void) +{ + GIcon *icon1, *icon2, *icon3; + const gchar *const *names; + const gchar *names2[] = { "first", "testicon", "last", NULL }; + gchar *str; + gboolean fallbacks; + + icon1 = g_themed_icon_new ("testicon"); + + g_object_get (icon1, "use-default-fallbacks", &fallbacks, NULL); + g_assert (!fallbacks); + + names = g_themed_icon_get_names (G_THEMED_ICON (icon1)); + g_assert_cmpint (g_strv_length ((gchar **)names), ==, 1); + g_assert_cmpstr (names[0], ==, "testicon"); + + g_themed_icon_prepend_name (G_THEMED_ICON (icon1), "first"); + g_themed_icon_append_name (G_THEMED_ICON (icon1), "last"); + names = g_themed_icon_get_names (G_THEMED_ICON (icon1)); + g_assert_cmpint (g_strv_length ((gchar **)names), ==, 3); + g_assert_cmpstr (names[0], ==, "first"); + g_assert_cmpstr (names[1], ==, "testicon"); + g_assert_cmpstr (names[2], ==, "last"); + g_assert_cmpuint (g_icon_hash (icon1), ==, 2400773466U); + + icon2 = g_themed_icon_new_from_names ((gchar**)names2, -1); + g_assert (g_icon_equal (icon1, icon2)); + + str = g_icon_to_string (icon2); + icon3 = g_icon_new_for_string (str, NULL); + g_assert (g_icon_equal (icon2, icon3)); + g_free (str); + + g_object_unref (icon1); + g_object_unref (icon2); + g_object_unref (icon3); +} + +static void +test_emblemed_icon (void) +{ + GIcon *icon1, *icon2, *icon3, *icon4; + GEmblem *emblem, *emblem1, *emblem2; + GList *emblems; + GIcon *icon; + + icon1 = g_themed_icon_new ("testicon"); + icon2 = g_themed_icon_new ("testemblem"); + emblem1 = g_emblem_new (icon2); + emblem2 = g_emblem_new_with_origin (icon2, G_EMBLEM_ORIGIN_TAG); + + icon3 = g_emblemed_icon_new (icon1, emblem1); + emblems = g_emblemed_icon_get_emblems (G_EMBLEMED_ICON (icon3)); + g_assert_cmpint (g_list_length (emblems), ==, 1); + g_assert (g_emblemed_icon_get_icon (G_EMBLEMED_ICON (icon3)) == icon1); + + icon4 = g_emblemed_icon_new (icon1, emblem1); + g_emblemed_icon_add_emblem (G_EMBLEMED_ICON (icon4), emblem2); + emblems = g_emblemed_icon_get_emblems (G_EMBLEMED_ICON (icon4)); + g_assert_cmpint (g_list_length (emblems), ==, 2); + + g_assert (!g_icon_equal (icon3, icon4)); + + emblem = emblems->data; + g_assert (g_emblem_get_icon (emblem) == icon2); + g_assert (g_emblem_get_origin (emblem) == G_EMBLEM_ORIGIN_TAG); + + emblem = emblems->next->data; + g_assert (g_emblem_get_icon (emblem) == icon2); + g_assert (g_emblem_get_origin (emblem) == G_EMBLEM_ORIGIN_UNKNOWN); + + g_emblemed_icon_clear_emblems (G_EMBLEMED_ICON (icon4)); + g_assert (g_emblemed_icon_get_emblems (G_EMBLEMED_ICON (icon4)) == NULL); + + g_assert (g_icon_hash (icon4) != g_icon_hash (icon2)); + g_object_get (icon4, "gicon", &icon, NULL); + g_assert (icon == icon1); + g_object_unref (icon); + + g_object_unref (icon1); + g_object_unref (icon2); + g_object_unref (icon3); + g_object_unref (icon4); + + g_object_unref (emblem1); + g_object_unref (emblem2); +} + +static void +test_file_icon (void) +{ + GFile *file; + GIcon *icon; + GIcon *icon2; + GError *error; + GInputStream *stream; + gchar *str; + + file = g_file_new_for_path (SRCDIR "/g-icon.c"); + icon = g_file_icon_new (file); + g_object_unref (file); + + error = NULL; + stream = g_loadable_icon_load (G_LOADABLE_ICON (icon), 20, NULL, NULL, &error); + g_assert (stream != NULL); + g_assert_no_error (error); + + g_object_unref (stream); + + str = g_icon_to_string (icon); + icon2 = g_icon_new_for_string (str, NULL); + g_assert (g_icon_equal (icon, icon2)); + g_free (str); + + g_object_unref (icon); + g_object_unref (icon2); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/icons/serialize", test_g_icon_serialize); + g_test_add_func ("/icons/themed", test_themed_icon); + g_test_add_func ("/icons/emblemed", test_emblemed_icon); + g_test_add_func ("/icons/file", test_file_icon); + + return g_test_run(); +} diff --git a/gio/tests/gapplication-example-actions.c b/gio/tests/gapplication-example-actions.c new file mode 100644 index 0000000..7aaa41e --- /dev/null +++ b/gio/tests/gapplication-example-actions.c @@ -0,0 +1,122 @@ +#include +#include +#include + +static void +activate (GApplication *application) +{ + g_application_hold (application); + g_print ("activated\n"); + g_application_release (application); +} + +static void +activate_action (GAction *action, + GVariant *parameter, + gpointer data) +{ + GApplication *application = G_APPLICATION (data); + + g_application_hold (application); + g_print ("action %s activated\n", g_action_get_name (action)); + g_application_release (application); +} + +static void +activate_toggle_action (GSimpleAction *action, + GVariant *parameter, + gpointer data) +{ + GApplication *application = G_APPLICATION (data); + GVariant *state; + gboolean b; + + g_print ("action %s activated\n", g_action_get_name (G_ACTION (action))); + + g_application_hold (application); + state = g_action_get_state (G_ACTION (action)); + b = g_variant_get_boolean (state); + g_variant_unref (state); + g_simple_action_set_state (action, g_variant_new_boolean (!b)); + g_print ("state change %d -> %d\n", b, !b); + g_application_release (application); +} + +static void +add_actions (GApplication *app) +{ + GSimpleAction *action; + + action = g_simple_action_new ("simple-action", NULL); + g_signal_connect (action, "activate", G_CALLBACK (activate_action), app); + g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (action)); + g_object_unref (action); + + action = g_simple_action_new_stateful ("toggle-action", NULL, + g_variant_new_boolean (FALSE)); + g_signal_connect (action, "activate", G_CALLBACK (activate_toggle_action), app); + g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (action)); + g_object_unref (action); +} + +static void +describe_and_activate_action (GActionGroup *group, + const gchar *name) +{ + const GVariantType *param_type; + GVariant *state; + gboolean enabled; + gchar *tmp; + + param_type = g_action_group_get_action_parameter_type (group, name); + state = g_action_group_get_action_state (group, name); + enabled = g_action_group_get_action_enabled (group, name); + + g_print ("action name: %s\n", name); + tmp = param_type ? g_variant_type_dup_string (param_type) : NULL; + g_print ("parameter type: %s\n", tmp ? tmp : ""); + g_free (tmp); + g_print ("state type: %s\n", + state ? g_variant_get_type_string (state) : ""); + tmp = state ? g_variant_print (state, FALSE) : NULL; + g_print ("state: %s\n", tmp ? tmp : ""); + g_free (tmp); + g_print ("enabled: %s\n", enabled ? "true" : "false"); + + if (state != NULL) + g_variant_unref (state); + + g_action_group_activate_action (group, name, NULL); +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = g_application_new ("org.gtk.TestApplication", 0); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + g_application_set_inactivity_timeout (app, 10000); + + add_actions (app); + + if (argc > 1 && strcmp (argv[1], "--simple-action") == 0) + { + g_application_register (app, NULL, NULL); + describe_and_activate_action (G_ACTION_GROUP (app), "simple-action"); + exit (0); + } + else if (argc > 1 && strcmp (argv[1], "--toggle-action") == 0) + { + g_application_register (app, NULL, NULL); + describe_and_activate_action (G_ACTION_GROUP (app), "toggle-action"); + exit (0); + } + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication-example-cmdline.c b/gio/tests/gapplication-example-cmdline.c new file mode 100644 index 0000000..99380cd --- /dev/null +++ b/gio/tests/gapplication-example-cmdline.c @@ -0,0 +1,43 @@ +#include +#include +#include + +static int +command_line (GApplication *application, + GApplicationCommandLine *cmdline) +{ + gchar **argv; + gint argc; + gint i; + + argv = g_application_command_line_get_arguments (cmdline, &argc); + + g_application_command_line_print (cmdline, + "This text is written back\n" + "to stdout of the caller\n"); + + for (i = 0; i < argc; i++) + g_print ("argument %d: %s\n", i, argv[i]); + + g_strfreev (argv); + + return 0; +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = g_application_new ("org.gtk.TestApplication", + G_APPLICATION_HANDLES_COMMAND_LINE); + g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL); + g_application_set_inactivity_timeout (app, 10000); + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication-example-cmdline2.c b/gio/tests/gapplication-example-cmdline2.c new file mode 100644 index 0000000..dc25e95 --- /dev/null +++ b/gio/tests/gapplication-example-cmdline2.c @@ -0,0 +1,106 @@ +#include +#include +#include + +static int +command_line (GApplication *application, + GApplicationCommandLine *cmdline) +{ + gchar **argv; + gint argc; + gint i; + + argv = g_application_command_line_get_arguments (cmdline, &argc); + + for (i = 0; i < argc; i++) + g_print ("handling argument %s remotely\n", argv[i]); + + g_strfreev (argv); + + return 0; +} + +static gboolean +test_local_cmdline (GApplication *application, + gchar ***arguments, + gint *exit_status) +{ + gint i, j; + gchar **argv; + + argv = *arguments; + + i = 1; + while (argv[i]) + { + if (g_str_has_prefix (argv[i], "--local-")) + { + g_print ("handling argument %s locally\n", argv[i]); + g_free (argv[i]); + for (j = i; argv[j]; j++) + argv[j] = argv[j + 1]; + } + else + { + g_print ("not handling argument %s locally\n", argv[i]); + i++; + } + } + + *exit_status = 0; + + return FALSE; +} + +typedef GApplication TestApplication; +typedef GApplicationClass TestApplicationClass; + +static GType test_application_get_type (void); +G_DEFINE_TYPE (TestApplication, test_application, G_TYPE_APPLICATION) + +static void +test_application_finalize (GObject *object) +{ + G_OBJECT_CLASS (test_application_parent_class)->finalize (object); +} + +static void +test_application_init (TestApplication *app) +{ +} + +static void +test_application_class_init (TestApplicationClass *class) +{ + G_OBJECT_CLASS (class)->finalize = test_application_finalize; + G_APPLICATION_CLASS (class)->local_command_line = test_local_cmdline; +} + +static GApplication * +test_application_new (const gchar *application_id, + GApplicationFlags flags) +{ + g_return_val_if_fail (g_application_id_is_valid (application_id), NULL); + + return g_object_new (test_application_get_type (), + "application-id", application_id, + "flags", flags, + NULL); +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = test_application_new ("org.gtk.TestApplication", 0); + g_application_set_inactivity_timeout (app, 10000); + g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL); + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication-example-cmdline3.c b/gio/tests/gapplication-example-cmdline3.c new file mode 100644 index 0000000..b95e0cb --- /dev/null +++ b/gio/tests/gapplication-example-cmdline3.c @@ -0,0 +1,106 @@ +#include +#include +#include + +static gboolean +my_cmdline_handler (gpointer data) +{ + GApplicationCommandLine *cmdline = data; + gchar **args; + gchar **argv; + gint argc; + gint arg1; + gboolean arg2; + gboolean help; + GOptionContext *context; + GOptionEntry entries[] = { + { "arg1", 0, 0, G_OPTION_ARG_INT, &arg1, NULL, NULL }, + { "arg2", 0, 0, G_OPTION_ARG_NONE, &arg2, NULL, NULL }, + { "help", '?', 0, G_OPTION_ARG_NONE, &help, NULL, NULL }, + { NULL } + }; + GError *error; + gint i; + + args = g_application_command_line_get_arguments (cmdline, &argc); + + /* We have to make an extra copy of the array, since g_option_context_parse() + * assumes that it can remove strings from the array without freeing them. + */ + argv = g_new (gchar*, argc + 1); + for (i = 0; i <= argc; i++) + argv[i] = args[i]; + + context = g_option_context_new (NULL); + g_option_context_set_help_enabled (context, FALSE); + g_option_context_add_main_entries (context, entries, NULL); + + arg1 = 0; + arg2 = FALSE; + help = FALSE; + error = NULL; + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_application_command_line_printerr (cmdline, "%s\n", error->message); + g_error_free (error); + g_application_command_line_set_exit_status (cmdline, 1); + } + else if (help) + { + gchar *text; + text = g_option_context_get_help (context, FALSE, NULL); + g_application_command_line_print (cmdline, "%s", text); + g_free (text); + } + else + { + g_application_command_line_print (cmdline, "arg1 is %d and arg2 is %s\n", + arg1, arg2 ? "TRUE" : "FALSE"); + g_application_command_line_set_exit_status (cmdline, 0); + } + + g_free (argv); + g_strfreev (args); + + g_option_context_free (context); + + /* we are done handling this commandline */ + g_object_unref (cmdline); + + return G_SOURCE_REMOVE; +} + +static int +command_line (GApplication *application, + GApplicationCommandLine *cmdline) +{ + /* keep the application running until we are done with this commandline */ + g_application_hold (application); + + g_object_set_data_full (G_OBJECT (cmdline), + "application", application, + (GDestroyNotify)g_application_release); + + g_object_ref (cmdline); + g_idle_add (my_cmdline_handler, cmdline); + + return 0; +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = g_application_new ("org.gtk.TestApplication", + G_APPLICATION_HANDLES_COMMAND_LINE); + g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL); + g_application_set_inactivity_timeout (app, 10000); + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication-example-dbushooks.c b/gio/tests/gapplication-example-dbushooks.c new file mode 100644 index 0000000..e93cf08 --- /dev/null +++ b/gio/tests/gapplication-example-dbushooks.c @@ -0,0 +1,97 @@ +#include +#include +#include + +static void +activate (GApplication *application) +{ + g_print ("activated\n"); + + /* Note: when doing a longer-lasting action here that returns + * to the mainloop, you should use g_application_hold() and + * g_application_release() to keep the application alive until + * the action is completed. + */ +} + +typedef GApplication TestApplication; +typedef GApplicationClass TestApplicationClass; + +static GType test_application_get_type (void); +G_DEFINE_TYPE (TestApplication, test_application, G_TYPE_APPLICATION) + +static gboolean +test_application_dbus_register (GApplication *application, + GDBusConnection *connection, + const gchar *object_path, + GError **error) +{ + /* We must chain up to the parent class */ + if (!G_APPLICATION_CLASS (test_application_parent_class)->dbus_register (application, + connection, + object_path, + error)) + return FALSE; + + /* Now we can do our own stuff here. For example, we could export some D-Bus objects */ + return TRUE; +} + +static void +test_application_dbus_unregister (GApplication *application, + GDBusConnection *connection, + const gchar *object_path) +{ + /* Do our own stuff here, e.g. unexport any D-Bus objects we exported in the dbus_register + * hook above. Be sure to check that we actually did export them, since the hook + * above might have returned early due to the parent class' hook returning FALSE! + */ + + /* Lastly, we must chain up to the parent class */ + G_APPLICATION_CLASS (test_application_parent_class)->dbus_unregister (application, + connection, + object_path); +} + +static void +test_application_init (TestApplication *app) +{ +} + +static void +test_application_class_init (TestApplicationClass *class) +{ + GApplicationClass *g_application_class = G_APPLICATION_CLASS (class); + + g_application_class->dbus_register = test_application_dbus_register; + g_application_class->dbus_unregister = test_application_dbus_unregister; +} + +static GApplication * +test_application_new (const gchar *application_id, + GApplicationFlags flags) +{ + g_return_val_if_fail (g_application_id_is_valid (application_id), NULL); + + return g_object_new (test_application_get_type (), + "application-id", application_id, + "flags", flags, + NULL); +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = test_application_new ("org.gtk.TestApplication", 0); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + g_application_set_inactivity_timeout (app, 10000); + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication-example-open.c b/gio/tests/gapplication-example-open.c new file mode 100644 index 0000000..6dcf53c --- /dev/null +++ b/gio/tests/gapplication-example-open.c @@ -0,0 +1,56 @@ +#include +#include +#include + +static void +activate (GApplication *application) +{ + g_print ("activated\n"); + + /* Note: when doing a longer-lasting action here that returns + * to the mainloop, you should use g_application_hold() and + * g_application_release() to keep the application alive until + * the action is completed. + */ +} + +static void +open (GApplication *application, + GFile **files, + gint n_files, + const gchar *hint) +{ + gint i; + + for (i = 0; i < n_files; i++) + { + gchar *uri = g_file_get_uri (files[i]); + g_print ("open %s\n", uri); + g_free (uri); + } + + /* Note: when doing a longer-lasting action here that returns + * to the mainloop, you should use g_application_hold() and + * g_application_release() to keep the application alive until + * the action is completed. + */ +} + +int +main (int argc, char **argv) +{ + GApplication *app; + int status; + + app = g_application_new ("org.gtk.TestApplication", + G_APPLICATION_HANDLES_OPEN); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + g_signal_connect (app, "open", G_CALLBACK (open), NULL); + g_application_set_inactivity_timeout (app, 10000); + + status = g_application_run (app, argc, argv); + + g_object_unref (app); + + return status; +} diff --git a/gio/tests/gapplication.c b/gio/tests/gapplication.c new file mode 100644 index 0000000..8769693 --- /dev/null +++ b/gio/tests/gapplication.c @@ -0,0 +1,527 @@ +#include +#include +#include +#include + +#include "gdbus-tests.h" +#include "gdbus-sessionbus.h" + +static gint outstanding_watches; +static GMainLoop *main_loop; + +typedef struct +{ + const gchar *expected_stdout; + gint stdout_pipe; +} ChildData; + +static void +child_quit (GPid pid, + gint status, + gpointer data) +{ + ChildData *child = data; + gssize expected, actual; + gchar *buffer; + + g_assert_cmpint (status, ==, 0); + + if (--outstanding_watches == 0) + g_main_loop_quit (main_loop); + + expected = strlen (child->expected_stdout); + buffer = g_alloca (expected + 100); + actual = read (child->stdout_pipe, buffer, expected + 100); + close (child->stdout_pipe); + + g_assert_cmpint (actual, >=, 0); + + if (actual != expected || + memcmp (buffer, child->expected_stdout, expected) != 0) + { + buffer[MIN(expected + 100, actual)] = '\0'; + + g_error ("\nExpected\n-----\n%s-----\nGot (%s)\n-----\n%s-----\n", + child->expected_stdout, + (actual > expected) ? "truncated" : "full", buffer); + } + + g_slice_free (ChildData, child); +} + +static void +spawn (const gchar *expected_stdout, + const gchar *first_arg, + ...) +{ + GError *error = NULL; + const gchar *arg; + GPtrArray *array; + ChildData *data; + gchar **args; + va_list ap; + GPid pid; + GPollFD fd; + + va_start (ap, first_arg); + array = g_ptr_array_new (); + g_ptr_array_add (array, g_strdup ("./basic-application")); + for (arg = first_arg; arg; arg = va_arg (ap, const gchar *)) + g_ptr_array_add (array, g_strdup (arg)); + g_ptr_array_add (array, NULL); + args = (gchar **) g_ptr_array_free (array, FALSE); + + va_end (ap); + + data = g_slice_new (ChildData); + data->expected_stdout = expected_stdout; + + g_spawn_async_with_pipes (NULL, args, NULL, + G_SPAWN_DO_NOT_REAP_CHILD, + NULL, NULL, &pid, NULL, + &data->stdout_pipe, NULL, &error); + g_assert_no_error (error); + + g_child_watch_add (pid, child_quit, data); + outstanding_watches++; + + /* we block until the children write to stdout to make sure + * they have started, as they need to be executed in order; + * see https://bugzilla.gnome.org/show_bug.cgi?id=664627 + */ + fd.fd = data->stdout_pipe; + fd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; + g_poll (&fd, 1, -1); +} + +static void +basic (void) +{ + GDBusConnection *c; + + session_bus_up (); + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + main_loop = g_main_loop_new (NULL, 0); + + /* spawn the master */ + spawn ("activated\n" + "open file:///a file:///b\n" + "cmdline '40 +' '2'\n" + "exit status: 0\n", + "./app", NULL); + + /* send it some files */ + spawn ("exit status: 0\n", + "./app", "/a", "/b", NULL); + + spawn ("40 + 2 = 42\n" + "exit status: 42\n", + "./cmd", "40 +", "2", NULL); + + g_main_loop_run (main_loop); + + g_object_unref (c); + session_bus_down (); +} + + +#if 0 +/* Now that we register non-unique apps on the bus we need to fix the + * following test not to assume that it's safe to create multiple instances + * of the same app in one process. + * + * See https://bugzilla.gnome.org/show_bug.cgi?id=647986 for the patch that + * introduced this problem. + */ + +static GApplication *recently_activated; +static GMainLoop *loop; + +static void +nonunique_activate (GApplication *application) +{ + recently_activated = application; + + if (loop != NULL) + g_main_loop_quit (loop); +} + +static GApplication * +make_app (gboolean non_unique) +{ + GApplication *app; + gboolean ok; + + app = g_application_new ("org.gtk.Test-Application", + non_unique ? G_APPLICATION_NON_UNIQUE : 0); + g_signal_connect (app, "activate", G_CALLBACK (nonunique_activate), NULL); + ok = g_application_register (app, NULL, NULL); + if (!ok) + { + g_object_unref (app); + return NULL; + } + + g_application_activate (app); + + return app; +} + +static void +test_nonunique (void) +{ + GApplication *first, *second, *third, *fourth; + + session_bus_up (); + + first = make_app (TRUE); + /* non-remote because it is non-unique */ + g_assert (!g_application_get_is_remote (first)); + g_assert (recently_activated == first); + recently_activated = NULL; + + second = make_app (FALSE); + /* non-remote because it is first */ + g_assert (!g_application_get_is_remote (second)); + g_assert (recently_activated == second); + recently_activated = NULL; + + third = make_app (TRUE); + /* non-remote because it is non-unique */ + g_assert (!g_application_get_is_remote (third)); + g_assert (recently_activated == third); + recently_activated = NULL; + + fourth = make_app (FALSE); + /* should have failed to register due to being + * unable to register the object paths + */ + g_assert (fourth == NULL); + g_assert (recently_activated == NULL); + + g_object_unref (first); + g_object_unref (second); + g_object_unref (third); + + session_bus_down (); +} +#endif + +static void +properties (void) +{ + GDBusConnection *c; + GObject *app; + gchar *id; + GApplicationFlags flags; + gboolean registered; + guint timeout; + gboolean remote; + gboolean ret; + GError *error = NULL; + + session_bus_up (); + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + app = g_object_new (G_TYPE_APPLICATION, + "application-id", "org.gtk.TestApplication", + NULL); + + g_object_get (app, + "application-id", &id, + "flags", &flags, + "is-registered", ®istered, + "inactivity-timeout", &timeout, + NULL); + + g_assert_cmpstr (id, ==, "org.gtk.TestApplication"); + g_assert_cmpint (flags, ==, G_APPLICATION_FLAGS_NONE); + g_assert (!registered); + g_assert_cmpint (timeout, ==, 0); + + ret = g_application_register (G_APPLICATION (app), NULL, &error); + g_assert (ret); + g_assert_no_error (error); + + g_object_get (app, + "is-registered", ®istered, + "is-remote", &remote, + NULL); + + g_assert (registered); + g_assert (!remote); + + g_object_set (app, + "inactivity-timeout", 1000, + NULL); + + g_application_quit (G_APPLICATION (app)); + + g_object_unref (c); + g_object_unref (app); + g_free (id); + + session_bus_down (); +} + +static void +appid (void) +{ + gchar *id; + + g_assert (!g_application_id_is_valid ("")); + g_assert (!g_application_id_is_valid (".")); + g_assert (!g_application_id_is_valid ("a")); + g_assert (!g_application_id_is_valid ("abc")); + g_assert (!g_application_id_is_valid (".abc")); + g_assert (!g_application_id_is_valid ("abc.")); + g_assert (!g_application_id_is_valid ("a..b")); + g_assert (!g_application_id_is_valid ("a/b")); + g_assert (!g_application_id_is_valid ("a\nb")); + g_assert (!g_application_id_is_valid ("a\nb")); + g_assert (!g_application_id_is_valid ("_a.b")); + g_assert (!g_application_id_is_valid ("-a.b")); + id = g_new0 (gchar, 261); + memset (id, 'a', 260); + id[1] = '.'; + id[260] = 0; + g_assert (!g_application_id_is_valid (id)); + g_free (id); + + g_assert (g_application_id_is_valid ("a.b")); + g_assert (g_application_id_is_valid ("A.B")); + g_assert (g_application_id_is_valid ("A-.B")); + g_assert (g_application_id_is_valid ("a_b.c-d")); + g_assert (g_application_id_is_valid ("org.gnome.SessionManager")); +} + +static gboolean nodbus_activated; + +static gboolean +release_app (gpointer user_data) +{ + g_application_release (user_data); + return G_SOURCE_REMOVE; +} + +static void +nodbus_activate (GApplication *app) +{ + nodbus_activated = TRUE; + g_application_hold (app); + + g_assert (g_application_get_dbus_connection (app) == NULL); + g_assert (g_application_get_dbus_object_path (app) == NULL); + + g_idle_add (release_app, app); +} + +static void +test_nodbus (void) +{ + gchar *argv[] = { "./unimportant", NULL }; + GApplication *app; + + app = g_application_new ("org.gtk.Unimportant", G_APPLICATION_FLAGS_NONE); + g_signal_connect (app, "activate", G_CALLBACK (nodbus_activate), NULL); + g_application_run (app, 1, argv); + g_object_unref (app); + + g_assert (nodbus_activated); +} + +static gboolean noappid_activated; + +static void +noappid_activate (GApplication *app) +{ + noappid_activated = TRUE; + g_application_hold (app); + + g_assert (g_application_get_flags (app) & G_APPLICATION_NON_UNIQUE); + + g_idle_add (release_app, app); +} + +/* test that no appid -> non-unique */ +static void +test_noappid (void) +{ + gchar *argv[] = { "./unimportant", NULL }; + GApplication *app; + + app = g_application_new (NULL, G_APPLICATION_FLAGS_NONE); + g_signal_connect (app, "activate", G_CALLBACK (noappid_activate), NULL); + g_application_run (app, 1, argv); + g_object_unref (app); + + g_assert (noappid_activated); +} + + +static gboolean +quit_app (gpointer user_data) +{ + g_application_quit (user_data); + return G_SOURCE_REMOVE; +} + +static gboolean quit_activated; + +static void +quit_activate (GApplication *app) +{ + quit_activated = TRUE; + g_application_hold (app); + + g_assert (g_application_get_dbus_connection (app) != NULL); + g_assert (g_application_get_dbus_object_path (app) != NULL); + + g_idle_add (quit_app, app); +} + +static void +test_quit (void) +{ + GDBusConnection *c; + gchar *argv[] = { "./unimportant", NULL }; + GApplication *app; + + session_bus_up (); + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + app = g_application_new ("org.gtk.Unimportant", + G_APPLICATION_FLAGS_NONE); + g_signal_connect (app, "activate", G_CALLBACK (quit_activate), NULL); + g_application_run (app, 1, argv); + g_object_unref (app); + g_object_unref (c); + + g_assert (quit_activated); + + session_bus_down (); +} + +static void +on_activate (GApplication *app) +{ + gchar **actions; + GAction *action; + GVariant *state; + + g_assert (!g_application_get_is_remote (app)); + + actions = g_action_group_list_actions (G_ACTION_GROUP (app)); + g_assert (g_strv_length (actions) == 0); + g_strfreev (actions); + + action = (GAction*)g_simple_action_new_stateful ("test", G_VARIANT_TYPE_BOOLEAN, g_variant_new_boolean (FALSE)); + g_action_map_add_action (G_ACTION_MAP (app), action); + + actions = g_action_group_list_actions (G_ACTION_GROUP (app)); + g_assert (g_strv_length (actions) == 1); + g_strfreev (actions); + + g_action_group_change_action_state (G_ACTION_GROUP (app), "test", g_variant_new_boolean (TRUE)); + state = g_action_group_get_action_state (G_ACTION_GROUP (app), "test"); + g_assert (g_variant_get_boolean (state) == TRUE); + + g_action_map_remove_action (G_ACTION_MAP (app), "test"); + + actions = g_action_group_list_actions (G_ACTION_GROUP (app)); + g_assert (g_strv_length (actions) == 0); + g_strfreev (actions); + + g_idle_add (quit_app, app); +} + +static void +test_actions (void) +{ + gchar *argv[] = { "./unimportant", NULL }; + GApplication *app; + + g_unsetenv ("DBUS_SESSION_BUS_ADDRESS"); + + app = g_application_new ("org.gtk.Unimportant", + G_APPLICATION_FLAGS_NONE); + g_signal_connect (app, "activate", G_CALLBACK (on_activate), NULL); + g_application_run (app, 1, argv); + g_object_unref (app); +} + +typedef GApplication TestLocCmdApp; +typedef GApplicationClass TestLocCmdAppClass; + +static GType test_loc_cmd_app_get_type (void); +G_DEFINE_TYPE (TestLocCmdApp, test_loc_cmd_app, G_TYPE_APPLICATION) + +static void +test_loc_cmd_app_init (TestLocCmdApp *app) +{ +} + +static void +test_loc_cmd_app_startup (GApplication *app) +{ + g_assert_not_reached (); +} + +static void +test_loc_cmd_app_shutdown (GApplication *app) +{ + g_assert_not_reached (); +} + +static gboolean +test_loc_cmd_app_local_command_line (GApplication *application, + gchar ***arguments, + gint *exit_status) +{ + return TRUE; +} + +static void +test_loc_cmd_app_class_init (TestLocCmdAppClass *klass) +{ + G_APPLICATION_CLASS (klass)->startup = test_loc_cmd_app_startup; + G_APPLICATION_CLASS (klass)->shutdown = test_loc_cmd_app_shutdown; + G_APPLICATION_CLASS (klass)->local_command_line = test_loc_cmd_app_local_command_line; +} + +static void +test_local_command_line (void) +{ + gchar *argv[] = { "./unimportant", "-invalid", NULL }; + GApplication *app; + + g_unsetenv ("DBUS_SESSION_BUS_ADDRESS"); + + app = g_object_new (test_loc_cmd_app_get_type (), + "application-id", "org.gtk.Unimportant", + "flags", G_APPLICATION_FLAGS_NONE, + NULL); + g_application_run (app, 1, argv); + g_object_unref (app); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_dbus_unset (); + + g_test_add_func ("/gapplication/no-dbus", test_nodbus); + g_test_add_func ("/gapplication/basic", basic); + g_test_add_func ("/gapplication/no-appid", test_noappid); +/* g_test_add_func ("/gapplication/non-unique", test_nonunique); */ + g_test_add_func ("/gapplication/properties", properties); + g_test_add_func ("/gapplication/app-id", appid); + g_test_add_func ("/gapplication/quit", test_quit); + g_test_add_func ("/gapplication/actions", test_actions); + g_test_add_func ("/gapplication/local-command-line", test_local_command_line); + + return g_test_run (); +} diff --git a/gio/tests/gdbus-addresses.c b/gio/tests/gdbus-addresses.c new file mode 100644 index 0000000..c5a237d --- /dev/null +++ b/gio/tests/gdbus-addresses.c @@ -0,0 +1,146 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include + +#ifdef G_OS_UNIX +#include +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_empty_address (void) +{ + GError *error; + error = NULL; + g_dbus_address_get_stream_sync ("", + NULL, + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); +} + +#ifdef G_OS_UNIX +static void +test_unix_address (void) +{ + g_assert (!g_dbus_is_supported_address ("some-imaginary-transport:foo=bar", NULL)); + g_assert (g_dbus_is_supported_address ("unix:path=/tmp/dbus-test", NULL)); + g_assert (g_dbus_is_supported_address ("unix:abstract=/tmp/dbus-another-test", NULL)); + g_assert (g_dbus_is_address ("unix:foo=bar")); + g_assert (!g_dbus_is_supported_address ("unix:foo=bar", NULL)); + g_assert (!g_dbus_is_address ("unix:path=/foo;abstract=/bar")); + g_assert (!g_dbus_is_supported_address ("unix:path=/foo;abstract=/bar", NULL)); + g_assert (g_dbus_is_supported_address ("unix:path=/tmp/concrete;unix:abstract=/tmp/abstract", NULL)); + g_assert (g_dbus_is_address ("some-imaginary-transport:foo=bar")); + + g_assert (g_dbus_is_address ("some-imaginary-transport:foo=bar;unix:path=/this/is/valid")); + g_assert (!g_dbus_is_supported_address ("some-imaginary-transport:foo=bar;unix:path=/this/is/valid", NULL)); +} +#endif + +static void +test_nonce_tcp_address (void) +{ + g_assert (g_dbus_is_supported_address ("nonce-tcp:host=localhost,port=42,noncefile=/foo/bar", NULL)); + g_assert (g_dbus_is_supported_address ("nonce-tcp:host=localhost,port=42,noncefile=/foo/bar,family=ipv6", NULL)); + g_assert (g_dbus_is_supported_address ("nonce-tcp:host=localhost,port=42,noncefile=/foo/bar,family=ipv4", NULL)); + + g_assert (!g_dbus_is_supported_address ("nonce-tcp:host=localhost,port=42,noncefile=/foo/bar,family=blah", NULL)); + g_assert (!g_dbus_is_supported_address ("nonce-tcp:host=localhost,port=420000,noncefile=/foo/bar,family=ipv4", NULL)); + g_assert (!g_dbus_is_supported_address ("nonce-tcp:host=,port=x42,noncefile=/foo/bar,family=ipv4", NULL)); + g_assert (!g_dbus_is_supported_address ("nonce-tcp:host=,port=42x,noncefile=/foo/bar,family=ipv4", NULL)); + g_assert (!g_dbus_is_supported_address ("nonce-tcp:host=,port=420000,noncefile=/foo/bar,family=ipv4", NULL)); +} + +static void +test_tcp_address (void) +{ + g_assert (g_dbus_is_supported_address ("tcp:host=localhost", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,noncefile=/tmp/foo", NULL)); + g_assert (g_dbus_is_supported_address ("tcp:host=localhost,port=42", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,port=-1", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,port=420000", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,port=42x", NULL)); + g_assert (g_dbus_is_supported_address ("tcp:host=localhost,port=42,family=ipv4", NULL)); + g_assert (g_dbus_is_supported_address ("tcp:host=localhost,port=42,family=ipv6", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,port=42,family=sopranos", NULL)); +} + +static void +test_autolaunch_address (void) +{ + g_assert (g_dbus_is_supported_address ("autolaunch:", NULL)); +} + +static void +test_mixed_address (void) +{ + g_assert (g_dbus_is_supported_address ("unix:path=/tmp/dbus1;unix:path=/tmp/dbus2", NULL)); + g_assert (g_dbus_is_supported_address ("tcp:host=localhost,port=42;autolaunch:", NULL)); + g_assert (!g_dbus_is_supported_address ("tcp:host=localhost,port=42;tcp:family=bla", NULL)); +} + +static const struct { const char *before; const char *after; } escaping[] = { + { "foo", "foo" }, + { "/.\\-_", "/.\\-_" }, + { "<=>", "%3C%3D%3E" }, + { "/foo~1", "/foo%7E1" }, + { "\xe2\x98\xad\xff", "%E2%98%AD%FF" }, + { NULL, NULL } +}; + +static void +test_escape_address (void) +{ + gsize i; + + for (i = 0; escaping[i].before != NULL; i++) + { + gchar *s = g_dbus_address_escape_value (escaping[i].before); + + g_assert_cmpstr (s, ==, escaping[i].after); + g_free (s); + } +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gdbus/empty-address", test_empty_address); +#ifdef G_OS_UNIX + g_test_add_func ("/gdbus/unix-address", test_unix_address); +#endif + g_test_add_func ("/gdbus/nonce-tcp-address", test_nonce_tcp_address); + g_test_add_func ("/gdbus/tcp-address", test_tcp_address); + g_test_add_func ("/gdbus/autolaunch-address", test_autolaunch_address); + g_test_add_func ("/gdbus/mixed-address", test_mixed_address); + g_test_add_func ("/gdbus/escape-address", test_escape_address); + + return g_test_run(); +} + diff --git a/gio/tests/gdbus-auth.c b/gio/tests/gdbus-auth.c new file mode 100644 index 0000000..0aba9ca --- /dev/null +++ b/gio/tests/gdbus-auth.c @@ -0,0 +1,311 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2013 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: David Zeuthen + */ + +#include +#include + +#include +#include + +#include "gdbus-tests.h" + +#ifdef G_OS_UNIX +#include +#include +#include +#include +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +server_on_allow_mechanism (GDBusAuthObserver *observer, + const gchar *mechanism, + gpointer user_data) +{ + const gchar *allowed_mechanism = user_data; + if (allowed_mechanism == NULL || g_strcmp0 (mechanism, allowed_mechanism) == 0) + return TRUE; + else + return FALSE; +} + +/* pass NULL to allow any mechanism */ +static GDBusServer * +server_new_for_mechanism (const gchar *allowed_mechanism) +{ + gchar *addr; + gchar *guid; + GDBusServer *server; + GDBusAuthObserver *auth_observer; + GError *error; + GDBusServerFlags flags; + + guid = g_dbus_generate_guid (); + +#ifdef G_OS_UNIX + if (g_unix_socket_address_abstract_names_supported ()) + { + addr = g_strdup ("unix:tmpdir=/tmp/gdbus-test-"); + } + else + { + gchar *tmpdir; + tmpdir = g_dir_make_tmp ("gdbus-test-XXXXXX", NULL); + addr = g_strdup_printf ("unix:tmpdir=%s", tmpdir); + g_free (tmpdir); + } +#else + addr = g_strdup ("nonce-tcp:"); +#endif + + auth_observer = g_dbus_auth_observer_new (); + + flags = G_DBUS_SERVER_FLAGS_NONE; + if (g_strcmp0 (allowed_mechanism, "ANONYMOUS") == 0) + flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS; + + error = NULL; + server = g_dbus_server_new_sync (addr, + flags, + guid, + auth_observer, + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (server != NULL); + + g_signal_connect (auth_observer, + "allow-mechanism", + G_CALLBACK (server_on_allow_mechanism), + (gpointer) allowed_mechanism); + + g_free (addr); + g_free (guid); + g_object_unref (auth_observer); + + return server; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +test_auth_on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + GMainLoop *loop = user_data; + g_main_loop_quit (loop); + return FALSE; +} + +static gboolean +test_auth_on_timeout (gpointer user_data) +{ + g_error ("Timeout waiting for client"); + g_assert_not_reached (); + return FALSE; +} + + +typedef struct +{ + const gchar *address; + const gchar *allowed_client_mechanism; + const gchar *allowed_server_mechanism; +} TestAuthData; + +static gpointer +test_auth_client_thread_func (gpointer user_data) +{ + TestAuthData *data = user_data; + GDBusConnection *c = NULL; + GError *error = NULL; + GDBusAuthObserver *auth_observer = NULL; + + auth_observer = g_dbus_auth_observer_new (); + + g_signal_connect (auth_observer, + "allow-mechanism", + G_CALLBACK (server_on_allow_mechanism), + (gpointer) data->allowed_client_mechanism); + + c = g_dbus_connection_new_for_address_sync (data->address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + auth_observer, + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_assert (c != NULL); + g_clear_object (&c); + g_clear_object (&auth_observer); + return NULL; +} + +static void +test_auth_mechanism (const gchar *allowed_client_mechanism, + const gchar *allowed_server_mechanism) +{ + GDBusServer *server; + GMainLoop *loop; + GThread *client_thread; + TestAuthData data; + + server = server_new_for_mechanism (allowed_server_mechanism); + + loop = g_main_loop_new (NULL, FALSE); + + g_signal_connect (server, + "new-connection", + G_CALLBACK (test_auth_on_new_connection), + loop); + + g_timeout_add_seconds (5, test_auth_on_timeout, NULL); + + data.allowed_client_mechanism = allowed_client_mechanism; + data.allowed_server_mechanism = allowed_server_mechanism; + data.address = g_dbus_server_get_client_address (server); + + /* run the D-Bus client in a thread */ + client_thread = g_thread_new ("gdbus-client-thread", + test_auth_client_thread_func, + &data); + + g_dbus_server_start (server); + + g_main_loop_run (loop); + + g_dbus_server_stop (server); + + g_thread_join (client_thread); + + g_object_unref (server); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +auth_client_external (void) +{ + test_auth_mechanism ("EXTERNAL", NULL); +} + +static void +auth_client_dbus_cookie_sha1 (void) +{ + test_auth_mechanism ("DBUS_COOKIE_SHA1", NULL); +} + +static void +auth_server_anonymous (void) +{ + test_auth_mechanism (NULL, "ANONYMOUS"); +} + +static void +auth_server_external (void) +{ + test_auth_mechanism (NULL, "EXTERNAL"); +} + +static void +auth_server_dbus_cookie_sha1 (void) +{ + test_auth_mechanism (NULL, "DBUS_COOKIE_SHA1"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar *temp_dbus_keyrings_dir = NULL; + +static void +temp_dbus_keyrings_setup (void) +{ + GError *error = NULL; + + g_assert (temp_dbus_keyrings_dir == NULL); + temp_dbus_keyrings_dir = g_dir_make_tmp ("gdbus-test-dbus-keyrings-XXXXXX", &error); + g_assert_no_error (error); + g_assert (temp_dbus_keyrings_dir != NULL); + g_setenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR", temp_dbus_keyrings_dir, TRUE); + g_setenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION", "1", TRUE); +} + +static void +temp_dbus_keyrings_teardown (void) +{ + GDir *dir; + GError *error = NULL; + const gchar *name; + + g_assert (temp_dbus_keyrings_dir != NULL); + + dir = g_dir_open (temp_dbus_keyrings_dir, 0, &error); + g_assert_no_error (error); + g_assert (dir != NULL); + while ((name = g_dir_read_name (dir)) != NULL) + { + gchar *path = g_build_filename (temp_dbus_keyrings_dir, name, NULL); + g_assert (unlink (path) == 0); + g_free (path); + } + g_dir_close (dir); + g_assert (rmdir (temp_dbus_keyrings_dir) == 0); + + temp_dbus_keyrings_dir = NULL; + g_unsetenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR"); + g_unsetenv ("G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + setlocale (LC_ALL, "C"); + + temp_dbus_keyrings_setup (); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gdbus/auth/client/EXTERNAL", auth_client_external); + g_test_add_func ("/gdbus/auth/client/DBUS_COOKIE_SHA1", auth_client_dbus_cookie_sha1); + g_test_add_func ("/gdbus/auth/server/ANONYMOUS", auth_server_anonymous); + g_test_add_func ("/gdbus/auth/server/EXTERNAL", auth_server_external); + g_test_add_func ("/gdbus/auth/server/DBUS_COOKIE_SHA1", auth_server_dbus_cookie_sha1); + + /* TODO: we currently don't have tests for + * + * - DBUS_COOKIE_SHA1 timeouts (and clock changes etc) + * - interoperability with libdbus-1 implementations of authentication methods (both client and server) + */ + + ret = g_test_run(); + + temp_dbus_keyrings_teardown (); + + return ret; +} + diff --git a/gio/tests/gdbus-bz627724.c b/gio/tests/gdbus-bz627724.c new file mode 100644 index 0000000..d3d8cac --- /dev/null +++ b/gio/tests/gdbus-bz627724.c @@ -0,0 +1,89 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +static GDBusConnection *the_connection = NULL; + +#define MY_TYPE_OBJECT (my_object_get_type ()) +#define MY_OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MY_TYPE_OBJECT, MyObject)) +#define MY_IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_OBJECT)) + +typedef struct { + GObject parent_instance; +} MyObject; + +typedef struct { + GObjectClass parent_class; +} MyObjectClass; + +GType my_object_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT); + +static void +my_object_init (MyObject *object) +{ +} + +static void +my_object_class_init (MyObjectClass *klass) +{ + GError *error; + error = NULL; + the_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + g_assert (G_IS_DBUS_CONNECTION (the_connection)); +} + +static void +test_bz627724 (void) +{ + MyObject *object; + + session_bus_up (); + g_assert (the_connection == NULL); + object = g_object_new (MY_TYPE_OBJECT, NULL); + g_assert (the_connection != NULL); + g_object_unref (the_connection); + g_object_unref (object); + session_bus_down (); +} + + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/bz627724", test_bz627724); + return g_test_run(); +} diff --git a/gio/tests/gdbus-close-pending.c b/gio/tests/gdbus-close-pending.c new file mode 100644 index 0000000..a707e08 --- /dev/null +++ b/gio/tests/gdbus-close-pending.c @@ -0,0 +1,395 @@ +/* GDBus regression test - close a stream when a message remains to be written + * + * Copyright © 2006-2010 Red Hat, Inc. + * Copyright © 2011 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. + * + * Author: Simon McVittie + */ + +#include + +#include +#include + +#include + +#ifdef G_OS_UNIX +# include + +# include +# include +# include +# include +#else +# error This test is currently Unix-specific due to use of g_unix_open_pipe() +#endif + +#include "gdbus-tests.h" + +#define CLOSE_TIME_MS 1 +#define N_REPEATS_SLOW 5000 +#define N_REPEATS 100 + +/* ---------- MyIOStream ------------------------------------------------- */ + +#define MY_TYPE_IO_STREAM (my_io_stream_get_type ()) +#define MY_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MY_TYPE_IO_STREAM, MyIOStream)) +#define MY_IS_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_IO_STREAM)) + +typedef struct +{ + GIOStream parent_instance; + GInputStream *input_stream; + GOutputStream *output_stream; +} MyIOStream; + +typedef struct +{ + GIOStreamClass parent_class; +} MyIOStreamClass; + +static GType my_io_stream_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (MyIOStream, my_io_stream, G_TYPE_IO_STREAM) + +static void +my_io_stream_finalize (GObject *object) +{ + MyIOStream *stream = MY_IO_STREAM (object); + g_object_unref (stream->input_stream); + g_object_unref (stream->output_stream); + G_OBJECT_CLASS (my_io_stream_parent_class)->finalize (object); +} + +static void +my_io_stream_init (MyIOStream *stream) +{ +} + +static GInputStream * +my_io_stream_get_input_stream (GIOStream *_stream) +{ + MyIOStream *stream = MY_IO_STREAM (_stream); + return stream->input_stream; +} + +static GOutputStream * +my_io_stream_get_output_stream (GIOStream *_stream) +{ + MyIOStream *stream = MY_IO_STREAM (_stream); + return stream->output_stream; +} + +static void +my_io_stream_class_init (MyIOStreamClass *klass) +{ + GObjectClass *gobject_class; + GIOStreamClass *giostream_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = my_io_stream_finalize; + + giostream_class = G_IO_STREAM_CLASS (klass); + giostream_class->get_input_stream = my_io_stream_get_input_stream; + giostream_class->get_output_stream = my_io_stream_get_output_stream; +} + +static GIOStream * +my_io_stream_new (GInputStream *input_stream, + GOutputStream *output_stream) +{ + MyIOStream *stream; + g_return_val_if_fail (G_IS_INPUT_STREAM (input_stream), NULL); + g_return_val_if_fail (G_IS_OUTPUT_STREAM (output_stream), NULL); + stream = MY_IO_STREAM (g_object_new (MY_TYPE_IO_STREAM, NULL)); + stream->input_stream = g_object_ref (input_stream); + stream->output_stream = g_object_ref (output_stream); + return G_IO_STREAM (stream); +} + +/* ---------- MySlowCloseOutputStream ------------------------------------ */ + +typedef struct +{ + GFilterOutputStream parent_instance; +} MySlowCloseOutputStream; + +typedef struct +{ + GFilterOutputStreamClass parent_class; +} MySlowCloseOutputStreamClass; + +#define MY_TYPE_SLOW_CLOSE_OUTPUT_STREAM \ + (my_slow_close_output_stream_get_type ()) +#define MY_OUTPUT_STREAM(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), MY_TYPE_SLOW_CLOSE_OUTPUT_STREAM, \ + MySlowCloseOutputStream)) +#define MY_IS_SLOW_CLOSE_OUTPUT_STREAM(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_SLOW_CLOSE_OUTPUT_STREAM)) + +static GType my_slow_close_output_stream_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (MySlowCloseOutputStream, my_slow_close_output_stream, + G_TYPE_FILTER_OUTPUT_STREAM) + +static void +my_slow_close_output_stream_init (MySlowCloseOutputStream *stream) +{ +} + +static gboolean +my_slow_close_output_stream_close (GOutputStream *stream, + GCancellable *cancellable, + GError **error) +{ + g_usleep (CLOSE_TIME_MS * 1000); + return G_OUTPUT_STREAM_CLASS (my_slow_close_output_stream_parent_class)-> + close_fn (stream, cancellable, error); +} + +typedef struct { + GOutputStream *stream; + gint io_priority; + GCancellable *cancellable; + GAsyncReadyCallback callback; + gpointer user_data; +} DelayedClose; + +static void +delayed_close_free (gpointer data) +{ + DelayedClose *df = data; + + g_object_unref (df->stream); + g_object_unref (df->cancellable); + g_free (df); +} + +static gboolean +delayed_close_cb (gpointer data) +{ + DelayedClose *df = data; + + G_OUTPUT_STREAM_CLASS (my_slow_close_output_stream_parent_class)-> + close_async (df->stream, df->io_priority, df->cancellable, df->callback, + df->user_data); + + return FALSE; +} + +static void +my_slow_close_output_stream_close_async (GOutputStream *stream, + int io_priority, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSource *later; + DelayedClose *df; + + df = g_new0 (DelayedClose, 1); + df->stream = g_object_ref (stream); + df->io_priority = io_priority; + df->cancellable = (cancellable != NULL ? g_object_ref (cancellable) : NULL); + df->callback = callback; + df->user_data = user_data; + + later = g_timeout_source_new (CLOSE_TIME_MS); + g_source_set_callback (later, delayed_close_cb, df, delayed_close_free); + g_source_attach (later, g_main_context_get_thread_default ()); +} + +static gboolean +my_slow_close_output_stream_close_finish (GOutputStream *stream, + GAsyncResult *result, + GError **error) +{ + return G_OUTPUT_STREAM_CLASS (my_slow_close_output_stream_parent_class)-> + close_finish (stream, result, error); +} + +static void +my_slow_close_output_stream_class_init (MySlowCloseOutputStreamClass *klass) +{ + GOutputStreamClass *ostream_class; + + ostream_class = G_OUTPUT_STREAM_CLASS (klass); + ostream_class->close_fn = my_slow_close_output_stream_close; + ostream_class->close_async = my_slow_close_output_stream_close_async; + ostream_class->close_finish = my_slow_close_output_stream_close_finish; +} + +static GIOStream * +my_io_stream_new_for_fds (gint fd_in, gint fd_out) +{ + GIOStream *stream; + GInputStream *input_stream; + GOutputStream *real_output_stream; + GOutputStream *output_stream; + + input_stream = g_unix_input_stream_new (fd_in, TRUE); + real_output_stream = g_unix_output_stream_new (fd_out, TRUE); + output_stream = g_object_new (MY_TYPE_SLOW_CLOSE_OUTPUT_STREAM, + "base-stream", real_output_stream, + NULL); + stream = my_io_stream_new (input_stream, output_stream); + g_object_unref (input_stream); + g_object_unref (output_stream); + g_object_unref (real_output_stream); + return stream; +} + +/* ---------- Tests ------------------------------------------------------ */ + +typedef struct { + gint server_to_client[2]; + gint client_to_server[2]; + GIOStream *server_iostream; + GDBusConnection *server_conn; + GIOStream *iostream; + GDBusConnection *connection; + gchar *guid; + GError *error; +} Fixture; + +static void +setup (Fixture *f, + gconstpointer context) +{ + f->guid = g_dbus_generate_guid (); +} + +static void +teardown (Fixture *f, + gconstpointer context) +{ + g_clear_object (&f->server_iostream); + g_clear_object (&f->server_conn); + g_clear_object (&f->iostream); + g_clear_object (&f->connection); + g_clear_error (&f->error); + g_free (f->guid); +} + +static void +on_new_conn (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection **connection = user_data; + GError *error = NULL; + + *connection = g_dbus_connection_new_for_address_finish (res, &error); + g_assert_no_error (error); +} + +static void +test_once (Fixture *f, + gconstpointer context) +{ + GDBusMessage *message; + gboolean pipe_res; + + pipe_res = g_unix_open_pipe (f->server_to_client, FD_CLOEXEC, &f->error); + g_assert (pipe_res); + pipe_res = g_unix_open_pipe (f->client_to_server, FD_CLOEXEC, &f->error); + g_assert (pipe_res); + + f->server_iostream = my_io_stream_new_for_fds (f->client_to_server[0], + f->server_to_client[1]); + f->iostream = my_io_stream_new_for_fds (f->server_to_client[0], + f->client_to_server[1]); + + g_dbus_connection_new (f->server_iostream, + f->guid, + (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER | + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS), + NULL /* auth observer */, + NULL /* cancellable */, + on_new_conn, &f->server_conn); + + g_dbus_connection_new (f->iostream, + NULL, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL /* auth observer */, + NULL /* cancellable */, + on_new_conn, &f->connection); + + while (f->server_conn == NULL || f->connection == NULL) + g_main_context_iteration (NULL, TRUE); + + /* + * queue a message - it'll sometimes be sent while the close is pending, + * triggering the bug + */ + message = g_dbus_message_new_signal ("/", "com.example.Foo", "Bar"); + g_dbus_connection_send_message (f->connection, message, 0, NULL, &f->error); + g_assert_no_error (f->error); + g_object_unref (message); + + /* close the connection (deliberately or via last-unref) */ + if (g_strcmp0 (context, "unref") == 0) + { + g_clear_object (&f->connection); + } + else + { + g_dbus_connection_close_sync (f->connection, NULL, &f->error); + g_assert_no_error (f->error); + } + + /* either way, wait for the connection to close */ + while (!g_dbus_connection_is_closed (f->server_conn)) + g_main_context_iteration (NULL, TRUE); + + /* clean up before the next run */ + g_clear_object (&f->iostream); + g_clear_object (&f->server_iostream); + g_clear_object (&f->connection); + g_clear_object (&f->server_conn); + g_clear_error (&f->error); +} + +static void +test_many_times (Fixture *f, + gconstpointer context) +{ + guint i, n_repeats; + + if (g_test_slow ()) + n_repeats = N_REPEATS_SLOW; + else + n_repeats = N_REPEATS; + + for (i = 0; i < n_repeats; i++) + test_once (f, context); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gdbus/close-pending", Fixture, "close", + setup, test_many_times, teardown); + g_test_add ("/gdbus/unref-pending", Fixture, "unref", + setup, test_many_times, teardown); + + return g_test_run(); +} diff --git a/gio/tests/gdbus-connection-flush-helper.c b/gio/tests/gdbus-connection-flush-helper.c new file mode 100644 index 0000000..dd9f4a7 --- /dev/null +++ b/gio/tests/gdbus-connection-flush-helper.c @@ -0,0 +1,58 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include + +int +main (int argc, + char *argv[]) +{ + GDBusConnection *c; + GError *error; + gboolean ret; + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + + error = NULL; + g_dbus_connection_emit_signal (c, + NULL, /* const gchar *destination_bus_name */ + "/org/gtk/GDBus/FlushObject", + "org.gtk.GDBus.FlushInterface", + "SomeSignal", + NULL, /* GVariant *parameters */ + &error); + g_assert_no_error (error); + + error = NULL; + ret = g_dbus_connection_flush_sync (c, + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + g_assert (ret); + + /* and now exit immediately! */ + return 0; +} diff --git a/gio/tests/gdbus-connection-flush.c b/gio/tests/gdbus-connection-flush.c new file mode 100644 index 0000000..b331e4b --- /dev/null +++ b/gio/tests/gdbus-connection-flush.c @@ -0,0 +1,383 @@ +/* Test case for GNOME #662395 + * + * Copyright (C) 2008-2010 Red Hat, Inc. + * Copyright (C) 2011 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. + * + * Author: Simon McVittie + */ + +#include + +#include +#include + +#include + +#include "test-io-stream.h" +#include "test-pipe-unix.h" + +#define MY_TYPE_OUTPUT_STREAM \ + (my_output_stream_get_type ()) +#define MY_OUTPUT_STREAM(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + MY_TYPE_OUTPUT_STREAM, \ + MyOutputStream)) +#define MY_IS_OUTPUT_STREAM(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), MY_TYPE_OUTPUT_STREAM)) + +G_LOCK_DEFINE_STATIC (write); + +typedef struct { + GFilterOutputStream parent; + + volatile gint started; + volatile gint finished; + volatile gint flushed; + + GOutputStream *real_output; +} MyOutputStream; + +typedef struct { + GFilterOutputStreamClass parent; +} MyOutputStreamClass; + +static GType my_output_stream_get_type (void) G_GNUC_CONST; + +G_DEFINE_TYPE (MyOutputStream, my_output_stream, G_TYPE_FILTER_OUTPUT_STREAM) + +/* Called from GDBusWorker thread */ +static gssize +my_output_stream_write (GOutputStream *os, + const void *buffer, + gsize count, + GCancellable *cancellable, + GError **error) +{ + MyOutputStream *self = MY_OUTPUT_STREAM (os); + GFilterOutputStream *filter = G_FILTER_OUTPUT_STREAM (os); + GOutputStream *real = g_filter_output_stream_get_base_stream (filter); + gssize ret; + + g_atomic_int_add (&self->started, count); + /* Other threads can make writing block forever by taking this lock */ + G_LOCK (write); + ret = g_output_stream_write (real, buffer, count, cancellable, error); + G_UNLOCK (write); + g_atomic_int_add (&self->finished, count); + return ret; +} + +/* Called from GDBusWorker thread */ +static gboolean +my_output_stream_flush (GOutputStream *os, + GCancellable *cancellable, + GError **error) +{ + MyOutputStream *self = MY_OUTPUT_STREAM (os); + GFilterOutputStream *filter = G_FILTER_OUTPUT_STREAM (os); + GOutputStream *real = g_filter_output_stream_get_base_stream (filter); + gint started, finished; + gboolean ret; + + /* These should be equal because you're not allowed to flush with a + * write pending, and GOutputStream enforces that for its subclasses + */ + started = g_atomic_int_get (&self->started); + finished = g_atomic_int_get (&self->finished); + g_assert_cmpint (started, ==, finished); + + ret = g_output_stream_flush (real, cancellable, error); + + /* As above, this shouldn't have changed during the flush */ + finished = g_atomic_int_get (&self->finished); + g_assert_cmpint (started, ==, finished); + + /* Checkpoint reached */ + g_atomic_int_set (&self->flushed, finished); + return ret; +} + +/* Called from any thread; thread-safe */ +static gint +my_output_stream_get_bytes_started (GOutputStream *os) +{ + MyOutputStream *self = MY_OUTPUT_STREAM (os); + + return g_atomic_int_get (&self->started); +} + +/* Called from any thread; thread-safe */ +static gint +my_output_stream_get_bytes_finished (GOutputStream *os) +{ + MyOutputStream *self = MY_OUTPUT_STREAM (os); + + return g_atomic_int_get (&self->finished); +} + +/* Called from any thread; thread-safe */ +static gint +my_output_stream_get_bytes_flushed (GOutputStream *os) +{ + MyOutputStream *self = MY_OUTPUT_STREAM (os); + + return g_atomic_int_get (&self->flushed); +} + +static void +my_output_stream_init (MyOutputStream *self) +{ +} + +static void +my_output_stream_class_init (MyOutputStreamClass *cls) +{ + GOutputStreamClass *ostream_class = (GOutputStreamClass *) cls; + + ostream_class->write_fn = my_output_stream_write; + ostream_class->flush = my_output_stream_flush; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + GError *error; + gchar *guid; + gboolean flushed; + + GIOStream *client_stream; + GInputStream *client_istream; + GOutputStream *client_ostream; + GOutputStream *client_real_ostream; + GDBusConnection *client_conn; + + GIOStream *server_stream; + GInputStream *server_istream; + GOutputStream *server_ostream; + GDBusConnection *server_conn; +} Fixture; + +static void +setup_client_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + Fixture *f = user_data; + + f->client_conn = g_dbus_connection_new_finish (res, &f->error); + g_assert_no_error (f->error); + g_assert (G_IS_DBUS_CONNECTION (f->client_conn)); + g_assert (f->client_conn == G_DBUS_CONNECTION (source)); +} + +static void +setup_server_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + Fixture *f = user_data; + + f->server_conn = g_dbus_connection_new_finish (res, &f->error); + g_assert_no_error (f->error); + g_assert (G_IS_DBUS_CONNECTION (f->server_conn)); + g_assert (f->server_conn == G_DBUS_CONNECTION (source)); +} + +static void +setup (Fixture *f, + gconstpointer test_data G_GNUC_UNUSED) +{ + gboolean ok; + + f->guid = g_dbus_generate_guid (); + + ok = test_pipe (&f->server_istream, &f->client_real_ostream, &f->error); + g_assert_no_error (f->error); + g_assert (G_IS_OUTPUT_STREAM (f->client_real_ostream)); + g_assert (G_IS_INPUT_STREAM (f->server_istream)); + g_assert (ok); + + f->client_ostream = g_object_new (MY_TYPE_OUTPUT_STREAM, + "base-stream", f->client_real_ostream, + "close-base-stream", TRUE, + NULL); + g_assert (G_IS_OUTPUT_STREAM (f->client_ostream)); + + ok = test_pipe (&f->client_istream, &f->server_ostream, &f->error); + g_assert_no_error (f->error); + g_assert (G_IS_OUTPUT_STREAM (f->server_ostream)); + g_assert (G_IS_INPUT_STREAM (f->client_istream)); + g_assert (ok); + + f->client_stream = test_io_stream_new (f->client_istream, f->client_ostream); + f->server_stream = test_io_stream_new (f->server_istream, f->server_ostream); + + g_dbus_connection_new (f->client_stream, NULL, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, NULL, setup_client_cb, f); + g_dbus_connection_new (f->server_stream, f->guid, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER, + NULL, NULL, setup_server_cb, f); + + while (f->client_conn == NULL || f->server_conn == NULL) + g_main_context_iteration (NULL, TRUE); +} + +static void +flush_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + Fixture *f = user_data; + gboolean ok; + + g_assert (G_IS_DBUS_CONNECTION (source)); + g_assert (G_IS_DBUS_CONNECTION (f->client_conn)); + g_assert_cmpuint ((guintptr) f->client_conn, ==, (guintptr) G_DBUS_CONNECTION (source)); + + ok = g_dbus_connection_flush_finish (f->client_conn, res, &f->error); + g_assert_no_error (f->error); + g_assert (ok); + + f->flushed = TRUE; +} + +static void +test_flush_busy (Fixture *f, + gconstpointer test_data G_GNUC_UNUSED) +{ + gint initial, started; + gboolean ok; + + initial = my_output_stream_get_bytes_started (f->client_ostream); + /* make sure the actual write will block */ + G_LOCK (write); + + ok = g_dbus_connection_emit_signal (f->client_conn, NULL, "/", + "com.example.Foo", "SomeSignal", NULL, + &f->error); + g_assert_no_error (f->error); + g_assert (ok); + + /* wait for at least part of the message to have started writing - + * the write will block indefinitely in the worker thread + */ + do { + started = my_output_stream_get_bytes_started (f->client_ostream); + g_thread_yield (); + } while (initial >= started); + + /* we haven't flushed anything */ + g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream), + <=, initial); + + /* start to flush: it can't happen til the write finishes */ + g_dbus_connection_flush (f->client_conn, NULL, flush_cb, f); + + /* we still haven't actually flushed anything */ + g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream), + <=, initial); + + /* let the write finish */ + G_UNLOCK (write); + + /* wait for the flush to happen */ + while (!f->flushed) + g_main_context_iteration (NULL, TRUE); + + /* now we have flushed at least what we'd written - but before fixing + * GNOME#662395 this assertion would fail + */ + g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream), + >=, started); +} + +static void +test_flush_idle (Fixture *f, + gconstpointer test_data G_GNUC_UNUSED) +{ + gint initial, finished; + gboolean ok; + + initial = my_output_stream_get_bytes_finished (f->client_ostream); + + ok = g_dbus_connection_emit_signal (f->client_conn, NULL, "/", + "com.example.Foo", "SomeSignal", NULL, + &f->error); + g_assert_no_error (f->error); + g_assert (ok); + + /* wait for at least part of the message to have been written */ + do { + finished = my_output_stream_get_bytes_finished (f->client_ostream); + g_thread_yield (); + } while (initial >= finished); + + /* we haven't flushed anything */ + g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream), + <=, initial); + + /* flush with fully-written, but unflushed, messages */ + ok = g_dbus_connection_flush_sync (f->client_conn, NULL, &f->error); + + /* now we have flushed at least what we'd written - but before fixing + * GNOME#662395 this assertion would fail + */ + g_assert_cmpint (my_output_stream_get_bytes_flushed (f->client_ostream), + >=, finished); +} + +static void +teardown (Fixture *f, + gconstpointer test_data G_GNUC_UNUSED) +{ + g_clear_error (&f->error); + + g_clear_object (&f->client_stream); + g_clear_object (&f->client_istream); + g_clear_object (&f->client_ostream); + g_clear_object (&f->client_real_ostream); + g_clear_object (&f->client_conn); + + g_clear_object (&f->server_stream); + g_clear_object (&f->server_istream); + g_clear_object (&f->server_ostream); + g_clear_object (&f->server_conn); + + g_free (f->guid); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gdbus/connection/flush/busy", Fixture, NULL, + setup, test_flush_busy, teardown); + g_test_add ("/gdbus/connection/flush/idle", Fixture, NULL, + setup, test_flush_idle, teardown); + + ret = g_test_run(); + + return ret; +} diff --git a/gio/tests/gdbus-connection-loss.c b/gio/tests/gdbus-connection-loss.c new file mode 100644 index 0000000..2f99ff5 --- /dev/null +++ b/gio/tests/gdbus-connection-loss.c @@ -0,0 +1,142 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a global connection */ +static GDBusConnection *c = NULL; + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Check that pending calls fail with G_IO_ERROR_CLOSED if the connection is closed */ +/* See https://bugzilla.gnome.org/show_bug.cgi?id=660637 */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +sleep_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GError **error = user_data; + GVariant *result; + + result = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, error); + g_assert (result == NULL); + g_main_loop_quit (loop); +} + +static gboolean +on_timeout (gpointer user_data) +{ + /* tear down bus */ + session_bus_stop (); + return FALSE; /* remove source */ +} + +static void +test_connection_loss (void) +{ + GDBusProxy *proxy; + GError *error; + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + error = NULL; + g_dbus_proxy_call (proxy, + "Sleep", + g_variant_new ("(i)", 100 * 1000 /* msec */), + G_DBUS_CALL_FLAGS_NONE, + 10 * 1000 /* msec */, + NULL, /* GCancellable */ + sleep_cb, + &error); + + /* Make sure we don't exit when the bus goes away */ + g_dbus_connection_set_exit_on_close (c, FALSE); + + /* Nuke the connection to the bus */ + g_timeout_add (100 /* ms */, on_timeout, NULL); + + g_main_loop_run (loop); + + /* If we didn't act on connection-loss we'd be getting G_IO_ERROR_TIMEOUT + * generated locally. So if we get G_IO_ERROR_CLOSED it means that we + * are acting correctly on connection loss. + */ + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + g_assert (!g_dbus_error_is_remote_error (error)); + g_clear_error (&error); + + g_object_unref (proxy); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + GError *error; + gint ret; + + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + /* wait for the service to come up */ + usleep (500 * 1000); + + /* Create the connection in the main thread */ + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + g_test_add_func ("/gdbus/connection-loss", test_connection_loss); + + ret = g_test_run(); + + g_object_unref (c); + + return ret; +} diff --git a/gio/tests/gdbus-connection-slow.c b/gio/tests/gdbus-connection-slow.c new file mode 100644 index 0000000..302cee9 --- /dev/null +++ b/gio/tests/gdbus-connection-slow.c @@ -0,0 +1,207 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_connection_flush_signal_handler (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + g_main_loop_quit (loop); +} + +static gboolean +test_connection_flush_on_timeout (gpointer user_data) +{ + guint iteration = GPOINTER_TO_UINT (user_data); + g_printerr ("Timeout waiting 1000 msec on iteration %d\n", iteration); + g_assert_not_reached (); + return FALSE; +} + +static void +test_connection_flush (void) +{ + GDBusConnection *connection; + GError *error; + guint n; + guint signal_handler_id; + + session_bus_up (); + + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (connection != NULL); + + signal_handler_id = g_dbus_connection_signal_subscribe (connection, + NULL, /* sender */ + "org.gtk.GDBus.FlushInterface", + "SomeSignal", + "/org/gtk/GDBus/FlushObject", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_flush_signal_handler, + NULL, + NULL); + g_assert_cmpint (signal_handler_id, !=, 0); + + for (n = 0; n < 50; n++) + { + gboolean ret; + gint exit_status; + guint timeout_mainloop_id; + + error = NULL; + ret = g_spawn_command_line_sync ("./gdbus-connection-flush-helper", + NULL, /* stdout */ + NULL, /* stderr */ + &exit_status, + &error); + g_assert_no_error (error); + g_spawn_check_exit_status (exit_status, &error); + g_assert_no_error (error); + g_assert (ret); + + timeout_mainloop_id = g_timeout_add (1000, test_connection_flush_on_timeout, GUINT_TO_POINTER (n)); + g_main_loop_run (loop); + g_source_remove (timeout_mainloop_id); + } + + g_dbus_connection_signal_unsubscribe (connection, signal_handler_id); + g_object_unref (connection); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +/* Message size > 20MiB ... should be enough to make sure the message + * is fragmented when shoved across any transport + */ +#define LARGE_MESSAGE_STRING_LENGTH (20*1024*1024) + +static void +large_message_on_name_appeared (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + GError *error; + gchar *request; + const gchar *reply; + GVariant *result; + guint n; + + request = g_new (gchar, LARGE_MESSAGE_STRING_LENGTH + 1); + for (n = 0; n < LARGE_MESSAGE_STRING_LENGTH; n++) + request[n] = '0' + (n%10); + request[n] = '\0'; + + error = NULL; + result = g_dbus_connection_call_sync (connection, + "com.example.TestService", /* bus name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + "HelloWorld", /* method name */ + g_variant_new ("(s)", request), /* parameters */ + G_VARIANT_TYPE ("(s)"), /* return type */ + G_DBUS_CALL_FLAGS_NONE, + G_MAXINT, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(&s)", &reply); + g_assert_cmpint (strlen (reply), >, LARGE_MESSAGE_STRING_LENGTH); + g_assert (g_str_has_prefix (reply, "You greeted me with '01234567890123456789012")); + g_assert (g_str_has_suffix (reply, "6789'. Thanks!")); + g_variant_unref (result); + + g_free (request); + + g_main_loop_quit (loop); +} + +static void +large_message_on_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +test_connection_large_message (void) +{ + guint watcher_id; + + session_bus_up (); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + watcher_id = g_bus_watch_name (G_BUS_TYPE_SESSION, + "com.example.TestService", + G_BUS_NAME_WATCHER_FLAGS_NONE, + large_message_on_name_appeared, + large_message_on_name_vanished, + NULL, /* user_data */ + NULL); /* GDestroyNotify */ + g_main_loop_run (loop); + g_bus_unwatch_name (watcher_id); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/connection/flush", test_connection_flush); + g_test_add_func ("/gdbus/connection/large_message", test_connection_large_message); + return g_test_run(); +} diff --git a/gio/tests/gdbus-connection.c b/gio/tests/gdbus-connection.c new file mode 100644 index 0000000..e48d61f --- /dev/null +++ b/gio/tests/gdbus-connection.c @@ -0,0 +1,1159 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +#if 0 +G_GNUC_UNUSED static void +_log (const gchar *format, ...) +{ + GTimeVal now; + time_t now_time; + struct tm *now_tm; + gchar time_buf[128]; + gchar *str; + va_list var_args; + + va_start (var_args, format); + str = g_strdup_vprintf (format, var_args); + va_end (var_args); + + g_get_current_time (&now); + now_time = (time_t) now.tv_sec; + now_tm = localtime (&now_time); + strftime (time_buf, sizeof time_buf, "%H:%M:%S", now_tm); + + g_print ("%s.%06d: %s\n", + time_buf, (gint) now.tv_usec / 1000, + str); + g_free (str); +} +#else +#define _log(...) +#endif + +static gboolean +test_connection_quit_mainloop (gpointer user_data) +{ + volatile gboolean *quit_mainloop_fired = user_data; + _log ("quit_mainloop_fired"); + *quit_mainloop_fired = TRUE; + g_main_loop_quit (loop); + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Connection life-cycle testing */ +/* ---------------------------------------------------------------------------------------------------- */ + +static const GDBusInterfaceInfo boo_interface_info = +{ + -1, + "org.example.Boo", + (GDBusMethodInfo **) NULL, + (GDBusSignalInfo **) NULL, + (GDBusPropertyInfo **) NULL, + NULL, +}; + +static const GDBusInterfaceVTable boo_vtable = +{ + NULL, /* _method_call */ + NULL, /* _get_property */ + NULL /* _set_property */ +}; + +static GDBusMessage * +some_filter_func (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data) +{ + return message; +} + +static void +on_name_owner_changed (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ +} + +static void +a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop (gpointer user_data) +{ + volatile gboolean *val = user_data; + *val = TRUE; + _log ("destroynotify fired for %p", val); + g_main_loop_quit (loop); +} + +static void +test_connection_life_cycle (void) +{ + gboolean ret; + GDBusConnection *c; + GDBusConnection *c2; + GError *error; + volatile gboolean on_signal_registration_freed_called; + volatile gboolean on_filter_freed_called; + volatile gboolean on_register_object_freed_called; + volatile gboolean quit_mainloop_fired; + guint quit_mainloop_id; + guint registration_id; + + error = NULL; + + /* + * Check for correct behavior when no bus is present + * + */ + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert (error != NULL); + g_assert (!g_dbus_error_is_remote_error (error)); + g_assert (c == NULL); + g_error_free (error); + + /* + * Check for correct behavior when a bus is present + */ + session_bus_up (); + /* case 1 */ + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + g_assert (!g_dbus_connection_is_closed (c)); + + /* + * Check that singleton handling work + */ + error = NULL; + c2 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c2 != NULL); + g_assert (c == c2); + g_object_unref (c2); + + /* + * Check that private connections work + */ + c2 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c2 != NULL); + g_assert (c != c2); + g_object_unref (c2); + + c2 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c2 != NULL); + g_assert (!g_dbus_connection_is_closed (c2)); + ret = g_dbus_connection_close_sync (c2, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + _g_assert_signal_received (c2, "closed"); + g_assert (g_dbus_connection_is_closed (c2)); + ret = g_dbus_connection_close_sync (c2, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + g_error_free (error); + g_assert (!ret); + g_object_unref (c2); + + /* + * Check that the finalization code works + * + * (and that the GDestroyNotify for filters and objects and signal + * registrations are run as expected) + */ + error = NULL; + c2 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c2 != NULL); + /* signal registration */ + on_signal_registration_freed_called = FALSE; + g_dbus_connection_signal_subscribe (c2, + "org.freedesktop.DBus", /* bus name */ + "org.freedesktop.DBus", /* interface */ + "NameOwnerChanged", /* member */ + "/org/freesktop/DBus", /* path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + on_name_owner_changed, + (gpointer) &on_signal_registration_freed_called, + a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop); + /* filter func */ + on_filter_freed_called = FALSE; + g_dbus_connection_add_filter (c2, + some_filter_func, + (gpointer) &on_filter_freed_called, + a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop); + /* object registration */ + on_register_object_freed_called = FALSE; + error = NULL; + registration_id = g_dbus_connection_register_object (c2, + "/foo", + (GDBusInterfaceInfo *) &boo_interface_info, + &boo_vtable, + (gpointer) &on_register_object_freed_called, + a_gdestroynotify_that_sets_a_gboolean_to_true_and_quits_loop, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + /* ok, finalize the connection and check that all the GDestroyNotify functions are invoked as expected */ + g_object_unref (c2); + quit_mainloop_fired = FALSE; + quit_mainloop_id = g_timeout_add (30000, test_connection_quit_mainloop, (gpointer) &quit_mainloop_fired); + _log ("destroynotifies for\n" + " register_object %p\n" + " filter %p\n" + " signal %p", + &on_register_object_freed_called, + &on_filter_freed_called, + &on_signal_registration_freed_called); + while (TRUE) + { + if (on_signal_registration_freed_called && + on_filter_freed_called && + on_register_object_freed_called) + break; + if (quit_mainloop_fired) + break; + _log ("entering loop"); + g_main_loop_run (loop); + _log ("exiting loop"); + } + g_source_remove (quit_mainloop_id); + g_assert (on_signal_registration_freed_called); + g_assert (on_filter_freed_called); + g_assert (on_register_object_freed_called); + g_assert (!quit_mainloop_fired); + + /* + * Check for correct behavior when the bus goes away + * + */ + g_assert (!g_dbus_connection_is_closed (c)); + g_dbus_connection_set_exit_on_close (c, FALSE); + session_bus_stop (); + _g_assert_signal_received (c, "closed"); + g_assert (g_dbus_connection_is_closed (c)); + g_object_unref (c); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that sending and receiving messages work as expected */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +msg_cb_expect_error_disconnected (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + g_assert (result == NULL); + + g_main_loop_quit (loop); +} + +static void +msg_cb_expect_error_unknown_method (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_assert (g_dbus_error_is_remote_error (error)); + g_error_free (error); + g_assert (result == NULL); + + g_main_loop_quit (loop); +} + +static void +msg_cb_expect_success (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_unref (result); + + g_main_loop_quit (loop); +} + +static void +msg_cb_expect_error_cancelled (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + g_assert (result == NULL); + + g_main_loop_quit (loop); +} + +static void +msg_cb_expect_error_cancelled_2 (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + g_assert (result == NULL); + + g_main_loop_quit (loop); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_connection_send (void) +{ + GDBusConnection *c; + GCancellable *ca; + + session_bus_up (); + + /* First, get an unopened connection */ + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c != NULL); + g_assert (!g_dbus_connection_is_closed (c)); + + /* + * Check that we never actually send a message if the GCancellable + * is already cancelled - i.e. we should get #G_IO_ERROR_CANCELLED + * when the actual connection is not up. + */ + ca = g_cancellable_new (); + g_cancellable_cancel (ca); + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + ca, + (GAsyncReadyCallback) msg_cb_expect_error_cancelled, + NULL); + g_main_loop_run (loop); + g_object_unref (ca); + + /* + * Check that we get a reply to the GetId() method call. + */ + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) msg_cb_expect_success, + NULL); + g_main_loop_run (loop); + + /* + * Check that we get an error reply to the NonExistantMethod() method call. + */ + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "NonExistantMethod", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) msg_cb_expect_error_unknown_method, + NULL); + g_main_loop_run (loop); + + /* + * Check that cancellation works when the message is already in flight. + */ + ca = g_cancellable_new (); + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + ca, + (GAsyncReadyCallback) msg_cb_expect_error_cancelled_2, + NULL); + g_cancellable_cancel (ca); + g_main_loop_run (loop); + g_object_unref (ca); + + /* + * Check that we get an error when sending to a connection that is disconnected. + */ + g_dbus_connection_set_exit_on_close (c, FALSE); + session_bus_stop (); + _g_assert_signal_received (c, "closed"); + g_assert (g_dbus_connection_is_closed (c)); + + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) msg_cb_expect_error_disconnected, + NULL); + g_main_loop_run (loop); + + g_object_unref (c); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Connection signal tests */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_connection_signal_handler (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + gint *counter = user_data; + *counter += 1; + + /*g_debug ("in test_connection_signal_handler (sender=%s path=%s interface=%s member=%s)", + sender_name, + object_path, + interface_name, + signal_name);*/ + + g_main_loop_quit (loop); +} + +static void +test_connection_signals (void) +{ + GDBusConnection *c1; + GDBusConnection *c2; + GDBusConnection *c3; + guint s1; + guint s1b; + guint s2; + guint s3; + gint count_s1; + gint count_s1b; + gint count_s2; + gint count_name_owner_changed; + GError *error; + gboolean ret; + GVariant *result; + gboolean quit_mainloop_fired; + guint quit_mainloop_id; + + error = NULL; + + /* + * Bring up first separate connections + */ + session_bus_up (); + /* if running with dbus-monitor, it claims the name :1.0 - so if we don't run with the monitor + * emulate this + */ + if (g_getenv ("G_DBUS_MONITOR") == NULL) + { + c1 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c1 != NULL); + g_assert (!g_dbus_connection_is_closed (c1)); + g_object_unref (c1); + } + c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c1 != NULL); + g_assert (!g_dbus_connection_is_closed (c1)); + g_assert_cmpstr (g_dbus_connection_get_unique_name (c1), ==, ":1.1"); + + /* + * Install two signal handlers for the first connection + * + * - Listen to the signal "Foo" from :1.2 (e.g. c2) + * - Listen to the signal "Foo" from anyone (e.g. both c2 and c3) + * + * and then count how many times this signal handler was invoked. + */ + s1 = g_dbus_connection_signal_subscribe (c1, + ":1.2", + "org.gtk.GDBus.ExampleInterface", + "Foo", + "/org/gtk/GDBus/ExampleInterface", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_signal_handler, + &count_s1, + NULL); + s2 = g_dbus_connection_signal_subscribe (c1, + NULL, /* match any sender */ + "org.gtk.GDBus.ExampleInterface", + "Foo", + "/org/gtk/GDBus/ExampleInterface", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_signal_handler, + &count_s2, + NULL); + s3 = g_dbus_connection_signal_subscribe (c1, + "org.freedesktop.DBus", /* sender */ + "org.freedesktop.DBus", /* interface */ + "NameOwnerChanged", /* member */ + "/org/freedesktop/DBus", /* path */ + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_signal_handler, + &count_name_owner_changed, + NULL); + /* Note that s1b is *just like* s1 - this is to catch a bug where N + * subscriptions of the same rule causes N calls to each of the N + * subscriptions instead of just 1 call to each of the N subscriptions. + */ + s1b = g_dbus_connection_signal_subscribe (c1, + ":1.2", + "org.gtk.GDBus.ExampleInterface", + "Foo", + "/org/gtk/GDBus/ExampleInterface", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_signal_handler, + &count_s1b, + NULL); + g_assert (s1 != 0); + g_assert (s1b != 0); + g_assert (s2 != 0); + g_assert (s3 != 0); + + count_s1 = 0; + count_s1b = 0; + count_s2 = 0; + count_name_owner_changed = 0; + + /* + * Make c2 emit "Foo" - we should catch it twice + * + * Note that there is no way to be sure that the signal subscriptions + * on c1 are effective yet - for all we know, the AddMatch() messages + * could sit waiting in a buffer somewhere between this process and + * the message bus. And emitting signals on c2 (a completely other + * socket!) will not necessarily change this. + * + * To ensure this is not the case, do a synchronous call on c1. + */ + result = g_dbus_connection_call_sync (c1, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, /* parameters */ + NULL, /* return type */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_unref (result); + + /* + * Bring up two other connections + */ + c2 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c2 != NULL); + g_assert (!g_dbus_connection_is_closed (c2)); + g_assert_cmpstr (g_dbus_connection_get_unique_name (c2), ==, ":1.2"); + c3 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c3 != NULL); + g_assert (!g_dbus_connection_is_closed (c3)); + g_assert_cmpstr (g_dbus_connection_get_unique_name (c3), ==, ":1.3"); + + /* now, emit the signal on c2 */ + ret = g_dbus_connection_emit_signal (c2, + NULL, /* destination bus name */ + "/org/gtk/GDBus/ExampleInterface", + "org.gtk.GDBus.ExampleInterface", + "Foo", + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + while (!(count_s1 >= 1 && count_s2 >= 1)) + g_main_loop_run (loop); + g_assert_cmpint (count_s1, ==, 1); + g_assert_cmpint (count_s2, ==, 1); + + /* + * Make c3 emit "Foo" - we should catch it only once + */ + ret = g_dbus_connection_emit_signal (c3, + NULL, /* destination bus name */ + "/org/gtk/GDBus/ExampleInterface", + "org.gtk.GDBus.ExampleInterface", + "Foo", + NULL, + &error); + g_assert_no_error (error); + g_assert (ret); + while (!(count_s1 == 1 && count_s2 == 2)) + g_main_loop_run (loop); + g_assert_cmpint (count_s1, ==, 1); + g_assert_cmpint (count_s2, ==, 2); + + /* + * Also to check the total amount of NameOwnerChanged signals - use a 5 second ceiling + * to avoid spinning forever + */ + quit_mainloop_fired = FALSE; + quit_mainloop_id = g_timeout_add (30000, test_connection_quit_mainloop, &quit_mainloop_fired); + while (count_name_owner_changed < 2 && !quit_mainloop_fired) + g_main_loop_run (loop); + g_source_remove (quit_mainloop_id); + g_assert_cmpint (count_s1, ==, 1); + g_assert_cmpint (count_s2, ==, 2); + g_assert_cmpint (count_name_owner_changed, ==, 2); + + g_dbus_connection_signal_unsubscribe (c1, s1); + g_dbus_connection_signal_unsubscribe (c1, s2); + g_dbus_connection_signal_unsubscribe (c1, s3); + g_dbus_connection_signal_unsubscribe (c1, s1b); + + g_object_unref (c1); + g_object_unref (c2); + g_object_unref (c3); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + guint num_handled; + guint num_outgoing; + guint32 serial; +} FilterData; + +static GDBusMessage * +filter_func (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data) +{ + FilterData *data = user_data; + guint32 reply_serial; + + if (incoming) + { + reply_serial = g_dbus_message_get_reply_serial (message); + if (reply_serial == data->serial) + data->num_handled += 1; + } + else + { + data->num_outgoing += 1; + } + + return message; +} + + +typedef struct +{ + gboolean alter_incoming; + gboolean alter_outgoing; +} FilterEffects; + +static GDBusMessage * +other_filter_func (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data) +{ + FilterEffects *effects = user_data; + GDBusMessage *ret; + gboolean alter; + + if (incoming) + alter = effects->alter_incoming; + else + alter = effects->alter_outgoing; + + if (alter) + { + GDBusMessage *copy; + GVariant *body; + gchar *s; + gchar *s2; + + copy = g_dbus_message_copy (message, NULL); + g_object_unref (message); + + body = g_dbus_message_get_body (copy); + g_variant_get (body, "(s)", &s); + s2 = g_strdup_printf ("MOD: %s", s); + g_dbus_message_set_body (copy, g_variant_new ("(s)", s2)); + g_free (s2); + g_free (s); + + ret = copy; + } + else + { + ret = message; + } + + return ret; +} + +static void +test_connection_filter_name_owner_changed_signal_handler (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + const gchar *name; + const gchar *old_owner; + const gchar *new_owner; + + g_variant_get (parameters, + "(&s&s&s)", + &name, + &old_owner, + &new_owner); + + if (g_strcmp0 (name, "com.example.TestService") == 0 && strlen (new_owner) > 0) + { + g_main_loop_quit (loop); + } +} + +static gboolean +test_connection_filter_on_timeout (gpointer user_data) +{ + g_printerr ("Timeout waiting 30 sec on service\n"); + g_assert_not_reached (); + return FALSE; +} + +static void +test_connection_filter (void) +{ + GDBusConnection *c; + FilterData data; + GDBusMessage *m; + GDBusMessage *m2; + GDBusMessage *r; + GError *error; + guint filter_id; + guint timeout_mainloop_id; + guint signal_handler_id; + FilterEffects effects; + GVariant *result; + const gchar *s; + + memset (&data, '\0', sizeof (FilterData)); + + session_bus_up (); + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + filter_id = g_dbus_connection_add_filter (c, + filter_func, + &data, + NULL); + + m = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* path */ + "org.freedesktop.DBus", /* interface */ + "GetNameOwner"); + g_dbus_message_set_body (m, g_variant_new ("(s)", "org.freedesktop.DBus")); + error = NULL; + g_dbus_connection_send_message (c, m, G_DBUS_SEND_MESSAGE_FLAGS_NONE, &data.serial, &error); + g_assert_no_error (error); + + while (data.num_handled == 0) + g_thread_yield (); + + m2 = g_dbus_message_copy (m, &error); + g_assert_no_error (error); + g_dbus_connection_send_message (c, m2, G_DBUS_SEND_MESSAGE_FLAGS_NONE, &data.serial, &error); + g_object_unref (m2); + g_assert_no_error (error); + + while (data.num_handled == 1) + g_thread_yield (); + + m2 = g_dbus_message_copy (m, &error); + g_assert_no_error (error); + g_dbus_message_set_serial (m2, data.serial); + /* lock the message to test PRESERVE_SERIAL flag. */ + g_dbus_message_lock (m2); + g_dbus_connection_send_message (c, m2, G_DBUS_SEND_MESSAGE_FLAGS_PRESERVE_SERIAL, &data.serial, &error); + g_object_unref (m2); + g_assert_no_error (error); + + while (data.num_handled == 2) + g_thread_yield (); + + m2 = g_dbus_message_copy (m, &error); + g_assert_no_error (error); + r = g_dbus_connection_send_message_with_reply_sync (c, + m2, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + &data.serial, + NULL, /* GCancellable */ + &error); + g_object_unref (m2); + g_assert_no_error (error); + g_assert (r != NULL); + g_object_unref (r); + g_assert_cmpint (data.num_handled, ==, 4); + + g_dbus_connection_remove_filter (c, filter_id); + + m2 = g_dbus_message_copy (m, &error); + g_assert_no_error (error); + r = g_dbus_connection_send_message_with_reply_sync (c, + m2, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + &data.serial, + NULL, /* GCancellable */ + &error); + g_object_unref (m2); + g_assert_no_error (error); + g_assert (r != NULL); + g_object_unref (r); + g_assert_cmpint (data.num_handled, ==, 4); + g_assert_cmpint (data.num_outgoing, ==, 4); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + /* wait for service to be available */ + signal_handler_id = g_dbus_connection_signal_subscribe (c, + "org.freedesktop.DBus", /* sender */ + "org.freedesktop.DBus", + "NameOwnerChanged", + "/org/freedesktop/DBus", + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + test_connection_filter_name_owner_changed_signal_handler, + NULL, + NULL); + g_assert_cmpint (signal_handler_id, !=, 0); + timeout_mainloop_id = g_timeout_add (30000, test_connection_filter_on_timeout, NULL); + g_main_loop_run (loop); + g_source_remove (timeout_mainloop_id); + g_dbus_connection_signal_unsubscribe (c, signal_handler_id); + + /* now test some combinations... */ + filter_id = g_dbus_connection_add_filter (c, + other_filter_func, + &effects, + NULL); + /* -- */ + effects.alter_incoming = FALSE; + effects.alter_outgoing = FALSE; + error = NULL; + result = g_dbus_connection_call_sync (c, + "com.example.TestService", /* bus name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + "HelloWorld", /* method name */ + g_variant_new ("(s)", "Cat"), /* parameters */ + G_VARIANT_TYPE ("(s)"), /* return type */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_variant_get (result, "(&s)", &s); + g_assert_cmpstr (s, ==, "You greeted me with 'Cat'. Thanks!"); + g_variant_unref (result); + /* -- */ + effects.alter_incoming = TRUE; + effects.alter_outgoing = TRUE; + error = NULL; + result = g_dbus_connection_call_sync (c, + "com.example.TestService", /* bus name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + "HelloWorld", /* method name */ + g_variant_new ("(s)", "Cat"), /* parameters */ + G_VARIANT_TYPE ("(s)"), /* return type */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_variant_get (result, "(&s)", &s); + g_assert_cmpstr (s, ==, "MOD: You greeted me with 'MOD: Cat'. Thanks!"); + g_variant_unref (result); + + + g_dbus_connection_remove_filter (c, filter_id); + + g_object_unref (c); + g_object_unref (m); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#define NUM_THREADS 50 + +static void +send_bogus_message (GDBusConnection *c, guint32 *out_serial) +{ + GDBusMessage *m; + GError *error; + + m = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */ + "/org/freedesktop/DBus", /* path */ + "org.freedesktop.DBus", /* interface */ + "GetNameOwner"); + g_dbus_message_set_body (m, g_variant_new ("(s)", "org.freedesktop.DBus")); + error = NULL; + g_dbus_connection_send_message (c, m, G_DBUS_SEND_MESSAGE_FLAGS_NONE, out_serial, &error); + g_assert_no_error (error); +} + +static gpointer +serials_thread_func (GDBusConnection *c) +{ + guint32 message_serial; + + /* No calls on this thread yet */ + g_assert_cmpint (g_dbus_connection_get_last_serial(c), ==, 0); + + /* Send a bogus message and store its serial */ + message_serial = 0; + send_bogus_message (c, &message_serial); + + /* Give it some time to actually send the message out */ + g_usleep (250000); + + g_assert_cmpint (g_dbus_connection_get_last_serial(c), !=, 0); + g_assert_cmpint (g_dbus_connection_get_last_serial(c), ==, message_serial); + + return NULL; +} + +static void +test_connection_serials (void) +{ + GDBusConnection *c; + GError *error; + GThread *pool[NUM_THREADS]; + int i; + + session_bus_up (); + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + /* Status after initialization */ + g_assert_cmpint (g_dbus_connection_get_last_serial (c), ==, 1); + + /* Send a bogus message */ + send_bogus_message (c, NULL); + g_assert_cmpint (g_dbus_connection_get_last_serial (c), ==, 2); + + /* Start the threads */ + for (i = 0; i < NUM_THREADS; i++) + pool[i] = g_thread_new (NULL, (GThreadFunc) serials_thread_func, c); + + /* Wait until threads are finished */ + for (i = 0; i < NUM_THREADS; i++) + { + g_thread_join (pool[i]); + g_thread_unref (pool[i]); + } + + /* No calls in between on this thread, should be the last value */ + g_assert_cmpint (g_dbus_connection_get_last_serial (c), ==, 2); + + send_bogus_message (c, NULL); + + /* All above calls + calls in threads */ + g_assert_cmpint (g_dbus_connection_get_last_serial (c), ==, 3 + NUM_THREADS); + + g_object_unref (c); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_connection_basic (void) +{ + GDBusConnection *connection; + GError *error; + GDBusCapabilityFlags flags; + gchar *guid; + gchar *name; + gboolean closed; + gboolean exit_on_close; + GIOStream *stream; + GCredentials *credentials; + + session_bus_up (); + + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (connection != NULL); + + flags = g_dbus_connection_get_capabilities (connection); + g_assert (flags == G_DBUS_CAPABILITY_FLAGS_NONE || + flags == G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + + credentials = g_dbus_connection_get_peer_credentials (connection); + g_assert (credentials == NULL); + + g_object_get (connection, + "stream", &stream, + "guid", &guid, + "unique-name", &name, + "closed", &closed, + "exit-on-close", &exit_on_close, + "capabilities", &flags, + NULL); + + g_assert (G_IS_IO_STREAM (stream)); + g_assert (g_dbus_is_guid (guid)); + g_assert (g_dbus_is_unique_name (name)); + g_assert (!closed); + g_assert (exit_on_close); + g_assert (flags == G_DBUS_CAPABILITY_FLAGS_NONE || + flags == G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + g_object_unref (stream); + g_free (name); + g_free (guid); + + g_object_unref (connection); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/connection/basic", test_connection_basic); + g_test_add_func ("/gdbus/connection/life-cycle", test_connection_life_cycle); + g_test_add_func ("/gdbus/connection/send", test_connection_send); + g_test_add_func ("/gdbus/connection/signals", test_connection_signals); + g_test_add_func ("/gdbus/connection/filter", test_connection_filter); + g_test_add_func ("/gdbus/connection/serials", test_connection_serials); + return g_test_run(); +} diff --git a/gio/tests/gdbus-daemon.c b/gio/tests/gdbus-daemon.c new file mode 100644 index 0000000..a332699 --- /dev/null +++ b/gio/tests/gdbus-daemon.c @@ -0,0 +1,70 @@ +#include "config.h" + +#include "gdbusdaemon.h" +#include + +int +main (int argc, char *argv[]) +{ + GDBusDaemon *daemon; + GMainLoop *loop; + const char *address = NULL; + const char *config_file = NULL; + GError *error = NULL; + gboolean print_address = FALSE; + gboolean print_env = FALSE; + GOptionContext *context; + GOptionEntry entries[] = { + { "address", 0, 0, G_OPTION_ARG_STRING, &address, N_("Address to listen on"), NULL }, + { "config-file", 0, 0, G_OPTION_ARG_STRING, &config_file, N_("Ignored, for compat with GTestDbus"), NULL }, + { "print-address", 0, 0, G_OPTION_ARG_NONE, &print_address, N_("Print address"), NULL }, + { "print-env", 0, 0, G_OPTION_ARG_NONE, &print_env, N_("Print address in shell mode"), NULL }, + { NULL } + }; + + context = g_option_context_new (""); + g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); + g_option_context_set_summary (context, + N_("Run a dbus service")); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + + error = NULL; + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s\n", error->message); + return 1; + } + + g_option_context_free (context); + + if (argc != 1) + { + g_printerr (_("Wrong args\n")); + return 1; + } + + + loop = g_main_loop_new (NULL, FALSE); + + if (argc >= 2) + address = argv[1]; + + daemon = _g_dbus_daemon_new (address, NULL, &error); + if (daemon == NULL) + { + g_printerr ("Can't init bus: %s\n", error->message); + return 1; + } + + if (print_env) + g_print ("export DBUS_SESSION_BUS_ADDRESS=\"%s\"\n", _g_dbus_daemon_get_address (daemon)); + + if (print_address) + g_print ("%s\n", _g_dbus_daemon_get_address (daemon)); + + g_main_loop_run (loop); + + g_main_loop_unref (loop); + + return 0; +} diff --git a/gio/tests/gdbus-error.c b/gio/tests/gdbus-error.c new file mode 100644 index 0000000..96f3a76 --- /dev/null +++ b/gio/tests/gdbus-error.c @@ -0,0 +1,268 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that registered errors are properly mapped */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +check_registered_error (const gchar *given_dbus_error_name, + GQuark error_domain, + gint error_code) +{ + GError *error; + gchar *dbus_error_name; + + error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message"); + g_assert_error (error, error_domain, error_code); + g_assert (g_dbus_error_is_remote_error (error)); + g_assert (g_dbus_error_strip_remote_error (error)); + g_assert_cmpstr (error->message, ==, "test message"); + dbus_error_name = g_dbus_error_get_remote_error (error); + g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name); + g_free (dbus_error_name); + g_error_free (error); +} + +static void +test_registered_errors (void) +{ + /* Here we check that we are able to map to GError and back for registered + * errors. + * + * For example, if "org.freedesktop.DBus.Error.AddressInUse" is + * associated with (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED), check + * that + * + * - Creating a GError for e.g. "org.freedesktop.DBus.Error.AddressInUse" + * has (error_domain, code) == (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED) + * + * - That it is possible to recover e.g. "org.freedesktop.DBus.Error.AddressInUse" + * as the D-Bus error name when dealing with an error with (error_domain, code) == + * (G_DBUS_ERROR, G_DBUS_ERROR_DBUS_FAILED) + * + * We just check a couple of well-known errors. + */ + check_registered_error ("org.freedesktop.DBus.Error.Failed", + G_DBUS_ERROR, + G_DBUS_ERROR_FAILED); + check_registered_error ("org.freedesktop.DBus.Error.AddressInUse", + G_DBUS_ERROR, + G_DBUS_ERROR_ADDRESS_IN_USE); + check_registered_error ("org.freedesktop.DBus.Error.UnknownMethod", + G_DBUS_ERROR, + G_DBUS_ERROR_UNKNOWN_METHOD); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +check_unregistered_error (const gchar *given_dbus_error_name) +{ + GError *error; + gchar *dbus_error_name; + + error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message"); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR); + g_assert (g_dbus_error_is_remote_error (error)); + dbus_error_name = g_dbus_error_get_remote_error (error); + g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name); + g_free (dbus_error_name); + + /* strip the message */ + g_assert (g_dbus_error_strip_remote_error (error)); + g_assert_cmpstr (error->message, ==, "test message"); + + /* check that we can no longer recover the D-Bus error name */ + g_assert (g_dbus_error_get_remote_error (error) == NULL); + + g_error_free (error); + +} + +static void +test_unregistered_errors (void) +{ + /* Here we check that we are able to map to GError and back for unregistered + * errors. + * + * For example, if "com.example.Error.Failed" is not registered, then check + * + * - Creating a GError for e.g. "com.example.Error.Failed" has (error_domain, code) == + * (G_IO_ERROR, G_IO_ERROR_DBUS_ERROR) + * + * - That it is possible to recover e.g. "com.example.Error.Failed" from that + * GError. + * + * We just check a couple of random errors. + */ + + check_unregistered_error ("com.example.Error.Failed"); + check_unregistered_error ("foobar.buh"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +check_transparent_gerror (GQuark error_domain, + gint error_code) +{ + GError *error; + gchar *given_dbus_error_name; + gchar *dbus_error_name; + + error = g_error_new (error_domain, error_code, "test message"); + given_dbus_error_name = g_dbus_error_encode_gerror (error); + g_assert (g_str_has_prefix (given_dbus_error_name, "org.gtk.GDBus.UnmappedGError.Quark")); + g_error_free (error); + + error = g_dbus_error_new_for_dbus_error (given_dbus_error_name, "test message"); + g_assert_error (error, error_domain, error_code); + g_assert (g_dbus_error_is_remote_error (error)); + dbus_error_name = g_dbus_error_get_remote_error (error); + g_assert_cmpstr (dbus_error_name, ==, given_dbus_error_name); + g_free (dbus_error_name); + g_free (given_dbus_error_name); + + /* strip the message */ + g_assert (g_dbus_error_strip_remote_error (error)); + g_assert_cmpstr (error->message, ==, "test message"); + + /* check that we can no longer recover the D-Bus error name */ + g_assert (g_dbus_error_get_remote_error (error) == NULL); + + g_error_free (error); +} + +static void +test_transparent_gerror (void) +{ + /* Here we check that we are able to transparent pass unregistered GError's + * over the wire. + * + * For example, if G_IO_ERROR_FAILED is not registered, then check + * + * - g_dbus_error_encode_gerror() returns something of the form + * org.gtk.GDBus.UnmappedGError.Quark_HEXENCODED_QUARK_NAME_.Code_ERROR_CODE + * + * - mapping back the D-Bus error name gives us G_IO_ERROR_FAILED + * + * - That it is possible to recover the D-Bus error name from the + * GError. + * + * We just check a couple of random errors. + */ + + check_transparent_gerror (G_IO_ERROR, G_IO_ERROR_FAILED); + check_transparent_gerror (G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE); +} + +typedef enum +{ + TEST_ERROR_FAILED, + TEST_ERROR_BLA +} TestError; + +GDBusErrorEntry test_error_entries[] = +{ + { TEST_ERROR_FAILED, "org.gtk.test.Error.Failed" }, + { TEST_ERROR_BLA, "org.gtk.test.Error.Bla" } +}; + +static void +test_register_error (void) +{ + gsize test_error_quark = 0; + gboolean res; + gchar *msg; + GError *error; + + g_dbus_error_register_error_domain ("test-error-quark", + &test_error_quark, + test_error_entries, + G_N_ELEMENTS (test_error_entries)); + g_assert_cmpint (test_error_quark, !=, 0); + + error = g_dbus_error_new_for_dbus_error ("org.gtk.test.Error.Failed", "Failed"); + g_assert_error (error, test_error_quark, TEST_ERROR_FAILED); + res = g_dbus_error_is_remote_error (error); + msg = g_dbus_error_get_remote_error (error); + g_assert (res); + g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Failed"); + res = g_dbus_error_strip_remote_error (error); + g_assert (res); + g_assert_cmpstr (error->message, ==, "Failed"); + g_clear_error (&error); + g_free (msg); + + g_dbus_error_set_dbus_error (&error, "org.gtk.test.Error.Failed", "Failed again", "Prefix %d", 1); + res = g_dbus_error_is_remote_error (error); + msg = g_dbus_error_get_remote_error (error); + g_assert (res); + g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Failed"); + res = g_dbus_error_strip_remote_error (error); + g_assert (res); + g_assert_cmpstr (error->message, ==, "Prefix 1: Failed again"); + g_clear_error (&error); + g_free (msg); + + error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_NOT_EMPTY, "Not Empty"); + res = g_dbus_error_is_remote_error (error); + msg = g_dbus_error_get_remote_error (error); + g_assert (!res); + g_assert_cmpstr (msg, ==, NULL); + res = g_dbus_error_strip_remote_error (error); + g_assert (!res); + g_assert_cmpstr (error->message, ==, "Not Empty"); + g_clear_error (&error); + + error = g_error_new_literal (test_error_quark, TEST_ERROR_BLA, "Bla"); + msg = g_dbus_error_encode_gerror (error); + g_assert_cmpstr (msg, ==, "org.gtk.test.Error.Bla"); + g_free (msg); + g_clear_error (&error); + + res = g_dbus_error_unregister_error (test_error_quark, + TEST_ERROR_BLA, "org.gtk.test.Error.Bla"); + g_assert (res); +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gdbus/registered-errors", test_registered_errors); + g_test_add_func ("/gdbus/unregistered-errors", test_unregistered_errors); + g_test_add_func ("/gdbus/transparent-gerror", test_transparent_gerror); + g_test_add_func ("/gdbus/register-error", test_register_error); + + return g_test_run(); +} diff --git a/gio/tests/gdbus-example-export.c b/gio/tests/gdbus-example-export.c new file mode 100644 index 0000000..341ce60 --- /dev/null +++ b/gio/tests/gdbus-example-export.c @@ -0,0 +1,334 @@ +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ + +/* The object we want to export */ +typedef struct _MyObjectClass MyObjectClass; +typedef struct _MyObject MyObject; + +struct _MyObjectClass +{ + GObjectClass parent_class; +}; + +struct _MyObject +{ + GObject parent_instance; + + gint count; + gchar *name; +}; + +enum +{ + PROP_0, + PROP_COUNT, + PROP_NAME +}; + +static GType my_object_get_type (void); +G_DEFINE_TYPE (MyObject, my_object, G_TYPE_OBJECT); + +static void +my_object_finalize (GObject *object) +{ + MyObject *myobj = (MyObject*)object; + + g_free (myobj->name); + + G_OBJECT_CLASS (my_object_parent_class)->finalize (object); +} + +static void +my_object_init (MyObject *object) +{ + object->count = 0; + object->name = NULL; +} + +static void +my_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MyObject *myobj = (MyObject*)object; + + switch (prop_id) + { + case PROP_COUNT: + g_value_set_int (value, myobj->count); + break; + + case PROP_NAME: + g_value_set_string (value, myobj->name); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +my_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MyObject *myobj = (MyObject*)object; + + switch (prop_id) + { + case PROP_COUNT: + myobj->count = g_value_get_int (value); + break; + + case PROP_NAME: + g_free (myobj->name); + myobj->name = g_value_dup_string (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +my_object_class_init (MyObjectClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + gobject_class->finalize = my_object_finalize; + gobject_class->set_property = my_object_set_property; + gobject_class->get_property = my_object_get_property; + + g_object_class_install_property (gobject_class, + PROP_COUNT, + g_param_spec_int ("count", + "Count", + "Count", + 0, 99999, 0, + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_NAME, + g_param_spec_string ("name", + "Name", + "Name", + NULL, + G_PARAM_READWRITE)); +} + +/* A method that we want to export */ +static void +my_object_change_count (MyObject *myobj, + gint change) +{ + myobj->count = 2 * myobj->count + change; + + g_object_notify (G_OBJECT (myobj), "count"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusNodeInfo *introspection_data = NULL; + +/* Introspection data for the service we are exporting */ +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + ""; + + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MyObject *myobj = user_data; + + if (g_strcmp0 (method_name, "ChangeCount") == 0) + { + gint change; + g_variant_get (parameters, "(i)", &change); + + my_object_change_count (myobj, change); + + g_dbus_method_invocation_return_value (invocation, NULL); + } +} + +static GVariant * +handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GVariant *ret; + MyObject *myobj = user_data; + + ret = NULL; + if (g_strcmp0 (property_name, "Count") == 0) + { + ret = g_variant_new_int32 (myobj->count); + } + else if (g_strcmp0 (property_name, "Name") == 0) + { + ret = g_variant_new_string (myobj->name ? myobj->name : ""); + } + + return ret; +} + +static gboolean +handle_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + MyObject *myobj = user_data; + + if (g_strcmp0 (property_name, "Count") == 0) + { + g_object_set (myobj, "count", g_variant_get_int32 (value), NULL); + } + else if (g_strcmp0 (property_name, "Name") == 0) + { + g_object_set (myobj, "name", g_variant_get_string (value, NULL), NULL); + } + + return TRUE; +} + + +/* for now */ +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + handle_get_property, + handle_set_property +}; + +static void +send_property_change (GObject *obj, + GParamSpec *pspec, + GDBusConnection *connection) +{ + GVariantBuilder *builder; + GVariantBuilder *invalidated_builder; + MyObject *myobj = (MyObject *)obj; + + builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); + + if (g_strcmp0 (pspec->name, "count") == 0) + g_variant_builder_add (builder, + "{sv}", + "Count", g_variant_new_int32 (myobj->count)); + else if (g_strcmp0 (pspec->name, "name") == 0) + g_variant_builder_add (builder, + "{sv}", + "Name", g_variant_new_string (myobj->name ? myobj->name : "")); + + g_dbus_connection_emit_signal (connection, + NULL, + "/org/myorg/MyObject", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + "org.myorg.MyObject", + builder, + invalidated_builder), + NULL); +} + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + MyObject *myobj = user_data; + guint registration_id; + + g_signal_connect (myobj, "notify", + G_CALLBACK (send_property_change), connection); + registration_id = g_dbus_connection_register_object (connection, + "/org/myorg/MyObject", + introspection_data->interfaces[0], + &interface_vtable, + myobj, + NULL, /* user_data_free_func */ + NULL); /* GError** */ + g_assert (registration_id > 0); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + exit (1); +} + +int +main (int argc, char *argv[]) +{ + guint owner_id; + GMainLoop *loop; + MyObject *myobj; + + /* We are lazy here - we don't want to manually provide + * the introspection data structures - so we just build + * them from XML. + */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + myobj = g_object_new (my_object_get_type (), NULL); + + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.myorg.MyObject", + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + myobj, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); + + g_dbus_node_info_unref (introspection_data); + + g_object_unref (myobj); + + return 0; +} diff --git a/gio/tests/gdbus-example-objectmanager-client.c b/gio/tests/gdbus-example-objectmanager-client.c new file mode 100644 index 0000000..a993996 --- /dev/null +++ b/gio/tests/gdbus-example-objectmanager-client.c @@ -0,0 +1,168 @@ + +#include "gdbus-example-objectmanager-generated.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +print_objects (GDBusObjectManager *manager) +{ + GList *objects; + GList *l; + + g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager)); + objects = g_dbus_object_manager_get_objects (manager); + for (l = objects; l != NULL; l = l->next) + { + ExampleObject *object = EXAMPLE_OBJECT (l->data); + GList *interfaces; + GList *ll; + g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); + + interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); + for (ll = interfaces; ll != NULL; ll = ll->next) + { + GDBusInterface *interface = G_DBUS_INTERFACE (ll->data); + g_print (" - Interface %s\n", g_dbus_interface_get_info (interface)->name); + + /* Note that @interface is really a GDBusProxy instance - and additionally also + * an ExampleAnimal or ExampleCat instance - either of these can be used to + * invoke methods on the remote object. For example, the generated function + * + * void example_animal_call_poke_sync (ExampleAnimal *proxy, + * gboolean make_sad, + * gboolean make_happy, + * GCancellable *cancellable, + * GError **error); + * + * can be used to call the Poke() D-Bus method on the .Animal interface. + * Additionally, the generated function + * + * const gchar *example_animal_get_mood (ExampleAnimal *object); + * + * can be used to get the value of the :Mood property. + */ + } + g_list_free_full (interfaces, g_object_unref); + } + g_list_free_full (objects, g_object_unref); +} + +static void +on_object_added (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + gchar *owner; + owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); + g_free (owner); +} + +static void +on_object_removed (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + gchar *owner; + owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); + g_free (owner); +} + +static void +on_notify_name_owner (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object); + gchar *name_owner; + + name_owner = g_dbus_object_manager_client_get_name_owner (manager); + g_print ("name-owner: %s\n", name_owner); + g_free (name_owner); +} + +static void +on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties, + gpointer user_data) +{ + GVariantIter iter; + const gchar *key; + GVariant *value; + gchar *s; + + g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy))); + g_variant_iter_init (&iter, changed_properties); + while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) + { + s = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, s); + g_variant_unref (value); + g_free (s); + } +} + +gint +main (gint argc, gchar *argv[]) +{ + GDBusObjectManager *manager; + GMainLoop *loop; + GError *error; + gchar *name_owner; + + manager = NULL; + loop = NULL; + + loop = g_main_loop_new (NULL, FALSE); + + error = NULL; + manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + "org.gtk.GDBus.Examples.ObjectManager", + "/example/Animals", + NULL, /* GCancellable */ + &error); + if (manager == NULL) + { + g_printerr ("Error getting object manager client: %s", error->message); + g_error_free (error); + goto out; + } + + name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("name-owner: %s\n", name_owner); + g_free (name_owner); + + print_objects (manager); + + g_signal_connect (manager, + "notify::name-owner", + G_CALLBACK (on_notify_name_owner), + NULL); + g_signal_connect (manager, + "object-added", + G_CALLBACK (on_object_added), + NULL); + g_signal_connect (manager, + "object-removed", + G_CALLBACK (on_object_removed), + NULL); + g_signal_connect (manager, + "interface-proxy-properties-changed", + G_CALLBACK (on_interface_proxy_properties_changed), + NULL); + + g_main_loop_run (loop); + + out: + if (manager != NULL) + g_object_unref (manager); + if (loop != NULL) + g_main_loop_unref (loop); + + return 0; +} diff --git a/gio/tests/gdbus-example-objectmanager-server.c b/gio/tests/gdbus-example-objectmanager-server.c new file mode 100644 index 0000000..1233958 --- /dev/null +++ b/gio/tests/gdbus-example-objectmanager-server.c @@ -0,0 +1,160 @@ + +#include "gdbus-example-objectmanager-generated.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusObjectManagerServer *manager = NULL; + +static gboolean +on_animal_poke (ExampleAnimal *animal, + GDBusMethodInvocation *invocation, + gboolean make_sad, + gboolean make_happy, + gpointer user_data) +{ + if ((make_sad && make_happy) || (!make_sad && !make_happy)) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.Failed", + "Exactly one of make_sad or make_happy must be TRUE"); + goto out; + } + + if (make_sad) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad", + "Sad animal is already sad"); + goto out; + } + + example_animal_set_mood (animal, "Sad"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + if (make_happy) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy", + "Happy animal is already happy"); + goto out; + } + + example_animal_set_mood (animal, "Happy"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + g_assert_not_reached (); + + out: + return TRUE; /* to indicate that the method was handled */ +} + + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + ExampleObjectSkeleton *object; + guint n; + + g_print ("Acquired a message bus connection\n"); + + /* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */ + manager = g_dbus_object_manager_server_new ("/example/Animals"); + + for (n = 0; n < 10; n++) + { + gchar *s; + ExampleAnimal *animal; + + /* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */ + s = g_strdup_printf ("/example/Animals/%03d", n); + object = example_object_skeleton_new (s); + g_free (s); + + /* Make the newly created object export the interface + * org.gtk.GDBus.Example.ObjectManager.Animal (note + * that @object takes its own reference to @animal). + */ + animal = example_animal_skeleton_new (); + example_animal_set_mood (animal, "Happy"); + example_object_skeleton_set_animal (object, animal); + g_object_unref (animal); + + /* Cats are odd animals - so some of our objects implement the + * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition + * to the .Animal interface + */ + if (n % 2 == 1) + { + ExampleCat *cat; + cat = example_cat_skeleton_new (); + example_object_skeleton_set_cat (object, cat); + g_object_unref (cat); + } + + /* Handle Poke() D-Bus method invocations on the .Animal interface */ + g_signal_connect (animal, + "handle-poke", + G_CALLBACK (on_animal_poke), + NULL); /* user_data */ + + /* Export the object (@manager takes its own reference to @object) */ + g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); + g_object_unref (object); + } + + /* Export all objects */ + g_dbus_object_manager_server_set_connection (manager, connection); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Acquired the name %s\n", name); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Lost the name %s\n", name); +} + + +gint +main (gint argc, gchar *argv[]) +{ + GMainLoop *loop; + guint id; + + loop = g_main_loop_new (NULL, FALSE); + + id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Examples.ObjectManager", + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + loop, + NULL); + + g_main_loop_run (loop); + + g_bus_unown_name (id); + g_main_loop_unref (loop); + + return 0; +} diff --git a/gio/tests/gdbus-example-own-name.c b/gio/tests/gdbus-example-own-name.c new file mode 100644 index 0000000..74d3920 --- /dev/null +++ b/gio/tests/gdbus-example-own-name.c @@ -0,0 +1,84 @@ +#include + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + /* This is where we'd export some objects on the bus */ +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Acquired the name %s on the session bus\n", name); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Lost the name %s on the session bus\n", name); +} + +int +main (int argc, char *argv[]) +{ + guint owner_id; + GMainLoop *loop; + GBusNameOwnerFlags flags; + gboolean opt_replace; + gboolean opt_allow_replacement; + gchar *opt_name; + GOptionContext *opt_context; + GError *error; + GOptionEntry opt_entries[] = + { + { "replace", 'r', 0, G_OPTION_ARG_NONE, &opt_replace, "Replace existing name if possible", NULL }, + { "allow-replacement", 'a', 0, G_OPTION_ARG_NONE, &opt_allow_replacement, "Allow replacement", NULL }, + { "name", 'n', 0, G_OPTION_ARG_STRING, &opt_name, "Name to acquire", NULL }, + { NULL} + }; + + error = NULL; + opt_name = NULL; + opt_replace = FALSE; + opt_allow_replacement = FALSE; + opt_context = g_option_context_new ("g_bus_own_name() example"); + g_option_context_add_main_entries (opt_context, opt_entries, NULL); + if (!g_option_context_parse (opt_context, &argc, &argv, &error)) + { + g_printerr ("Error parsing options: %s", error->message); + return 1; + } + if (opt_name == NULL) + { + g_printerr ("Incorrect usage, try --help.\n"); + return 1; + } + + flags = G_BUS_NAME_OWNER_FLAGS_NONE; + if (opt_replace) + flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE; + if (opt_allow_replacement) + flags |= G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT; + + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + opt_name, + flags, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); + + return 0; +} diff --git a/gio/tests/gdbus-example-peer.c b/gio/tests/gdbus-example-peer.c new file mode 100644 index 0000000..b954f74 --- /dev/null +++ b/gio/tests/gdbus-example-peer.c @@ -0,0 +1,306 @@ +/* + +Usage examples (modulo addresses / credentials). + +UNIX domain socket transport: + + Server: + $ ./gdbus-example-peer --server --address unix:abstract=myaddr + Server is listening at: unix:abstract=myaddr + Client connected. + Peer credentials: GCredentials:unix-user=500,unix-group=500,unix-process=13378 + Negotiated capabilities: unix-fd-passing=1 + Client said: Hey, it's 1273093080 already! + + Client: + $ ./gdbus-example-peer --address unix:abstract=myaddr + Connected. + Negotiated capabilities: unix-fd-passing=1 + Server said: You said 'Hey, it's 1273093080 already!'. KTHXBYE! + +Nonce-secured TCP transport on the same host: + + Server: + $ ./gdbus-example-peer --server --address nonce-tcp: + Server is listening at: nonce-tcp:host=localhost,port=43077,noncefile=/tmp/gdbus-nonce-file-X1ZNCV + Client connected. + Peer credentials: (no credentials received) + Negotiated capabilities: unix-fd-passing=0 + Client said: Hey, it's 1273093206 already! + + Client: + $ ./gdbus-example-peer -address nonce-tcp:host=localhost,port=43077,noncefile=/tmp/gdbus-nonce-file-X1ZNCV + Connected. + Negotiated capabilities: unix-fd-passing=0 + Server said: You said 'Hey, it's 1273093206 already!'. KTHXBYE! + +TCP transport on two different hosts with a shared home directory: + + Server: + host1 $ ./gdbus-example-peer --server --address tcp:host=0.0.0.0 + Server is listening at: tcp:host=0.0.0.0,port=46314 + Client connected. + Peer credentials: (no credentials received) + Negotiated capabilities: unix-fd-passing=0 + Client said: Hey, it's 1273093337 already! + + Client: + host2 $ ./gdbus-example-peer -a tcp:host=host1,port=46314 + Connected. + Negotiated capabilities: unix-fd-passing=0 + Server said: You said 'Hey, it's 1273093337 already!'. KTHXBYE! + +TCP transport on two different hosts without authentication: + + Server: + host1 $ ./gdbus-example-peer --server --address tcp:host=0.0.0.0 --allow-anonymous + Server is listening at: tcp:host=0.0.0.0,port=59556 + Client connected. + Peer credentials: (no credentials received) + Negotiated capabilities: unix-fd-passing=0 + Client said: Hey, it's 1273093652 already! + + Client: + host2 $ ./gdbus-example-peer -a tcp:host=host1,port=59556 + Connected. + Negotiated capabilities: unix-fd-passing=0 + Server said: You said 'Hey, it's 1273093652 already!'. KTHXBYE! + + */ + +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusNodeInfo *introspection_data = NULL; + +/* Introspection data for the service we are exporting */ +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + ""; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "HelloWorld") == 0) + { + const gchar *greeting; + gchar *response; + + g_variant_get (parameters, "(&s)", &greeting); + response = g_strdup_printf ("You said '%s'. KTHXBYE!", greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); + g_print ("Client said: %s\n", greeting); + } +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + NULL, + NULL, +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + guint registration_id; + GCredentials *credentials; + gchar *s; + + credentials = g_dbus_connection_get_peer_credentials (connection); + if (credentials == NULL) + s = g_strdup ("(no credentials received)"); + else + s = g_credentials_to_string (credentials); + + + g_print ("Client connected.\n" + "Peer credentials: %s\n" + "Negotiated capabilities: unix-fd-passing=%d\n", + s, + g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + + g_object_ref (connection); + registration_id = g_dbus_connection_register_object (connection, + "/org/gtk/GDBus/TestObject", + introspection_data->interfaces[0], + &interface_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ + g_assert (registration_id > 0); + + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, char *argv[]) +{ + gint ret; + gboolean opt_server; + gchar *opt_address; + GOptionContext *opt_context; + gboolean opt_allow_anonymous; + GError *error; + GOptionEntry opt_entries[] = + { + { "server", 's', 0, G_OPTION_ARG_NONE, &opt_server, "Start a server instead of a client", NULL }, + { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, "D-Bus address to use", NULL }, + { "allow-anonymous", 'n', 0, G_OPTION_ARG_NONE, &opt_allow_anonymous, "Allow anonymous authentication", NULL }, + { NULL} + }; + + ret = 1; + + opt_address = NULL; + opt_server = FALSE; + opt_allow_anonymous = FALSE; + + opt_context = g_option_context_new ("peer-to-peer example"); + error = NULL; + g_option_context_add_main_entries (opt_context, opt_entries, NULL); + if (!g_option_context_parse (opt_context, &argc, &argv, &error)) + { + g_printerr ("Error parsing options: %s\n", error->message); + g_error_free (error); + goto out; + } + if (opt_address == NULL) + { + g_printerr ("Incorrect usage, try --help.\n"); + goto out; + } + if (!opt_server && opt_allow_anonymous) + { + g_printerr ("The --allow-anonymous option only makes sense when used with --server.\n"); + goto out; + } + + /* We are lazy here - we don't want to manually provide + * the introspection data structures - so we just build + * them from XML. + */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + if (opt_server) + { + GDBusServer *server; + gchar *guid; + GMainLoop *loop; + GDBusServerFlags server_flags; + + guid = g_dbus_generate_guid (); + + server_flags = G_DBUS_SERVER_FLAGS_NONE; + if (opt_allow_anonymous) + server_flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS; + + error = NULL; + server = g_dbus_server_new_sync (opt_address, + server_flags, + guid, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + g_dbus_server_start (server); + g_free (guid); + + if (server == NULL) + { + g_printerr ("Error creating server at address %s: %s\n", opt_address, error->message); + g_error_free (error); + goto out; + } + g_print ("Server is listening at: %s\n", g_dbus_server_get_client_address (server)); + g_signal_connect (server, + "new-connection", + G_CALLBACK (on_new_connection), + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_object_unref (server); + g_main_loop_unref (loop); + } + else + { + GDBusConnection *connection; + const gchar *greeting_response; + GVariant *value; + gchar *greeting; + + error = NULL; + connection = g_dbus_connection_new_for_address_sync (opt_address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + if (connection == NULL) + { + g_printerr ("Error connecting to D-Bus address %s: %s\n", opt_address, error->message); + g_error_free (error); + goto out; + } + + g_print ("Connected.\n" + "Negotiated capabilities: unix-fd-passing=%d\n", + g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + + greeting = g_strdup_printf ("Hey, it's %" G_GUINT64_FORMAT " already!", (guint64) time (NULL)); + value = g_dbus_connection_call_sync (connection, + NULL, /* bus_name */ + "/org/gtk/GDBus/TestObject", + "org.gtk.GDBus.TestPeerInterface", + "HelloWorld", + g_variant_new ("(s)", greeting), + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (value == NULL) + { + g_printerr ("Error invoking HelloWorld(): %s\n", error->message); + g_error_free (error); + goto out; + } + g_variant_get (value, "(&s)", &greeting_response); + g_print ("Server said: %s\n", greeting_response); + g_variant_unref (value); + + g_object_unref (connection); + } + g_dbus_node_info_unref (introspection_data); + + ret = 0; + + out: + return ret; +} diff --git a/gio/tests/gdbus-example-proxy-subclass.c b/gio/tests/gdbus-example-proxy-subclass.c new file mode 100644 index 0000000..fb1a528 --- /dev/null +++ b/gio/tests/gdbus-example-proxy-subclass.c @@ -0,0 +1,358 @@ + +#include + +/* ---------------------------------------------------------------------------------------------------- */ +/* The D-Bus interface definition we want to create a GDBusProxy-derived type for: */ +/* ---------------------------------------------------------------------------------------------------- */ + +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Definition of the AccountsUser type */ +/* ---------------------------------------------------------------------------------------------------- */ + +#define ACCOUNTS_TYPE_USER (accounts_user_get_type ()) +#define ACCOUNTS_USER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ACCOUNTS_TYPE_USER, AccountsUser)) +#define ACCOUNTS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), ACCOUNTS_TYPE_USER, AccountsUserClass)) +#define ACCOUNTS_USER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ACCOUNTS_TYPE_USER, AccountsUserClass)) +#define ACCOUNTS_IS_USER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ACCOUNTS_TYPE_USER)) +#define ACCOUNTS_IS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ACCOUNTS_TYPE_USER)) + +typedef struct _AccountsUser AccountsUser; +typedef struct _AccountsUserClass AccountsUserClass; +typedef struct _AccountsUserPrivate AccountsUserPrivate; + +struct _AccountsUser +{ + /*< private >*/ + GDBusProxy parent_instance; + AccountsUserPrivate *priv; +}; + +struct _AccountsUserClass +{ + /*< private >*/ + GDBusProxyClass parent_class; + void (*changed) (AccountsUser *user); +}; + +GType accounts_user_get_type (void) G_GNUC_CONST; + +const gchar *accounts_user_get_user_name (AccountsUser *user); +const gchar *accounts_user_get_real_name (AccountsUser *user); +gboolean accounts_user_get_automatic_login (AccountsUser *user); + +void accounts_user_frobnicate (AccountsUser *user, + const gchar *flux, + gint baz, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gchar *accounts_user_frobnicate_finish (AccountsUser *user, + GAsyncResult *res, + GError **error); +gchar *accounts_user_frobnicate_sync (AccountsUser *user, + const gchar *flux, + gint baz, + GCancellable *cancellable, + GError **error); + +/* ---------------------------------------------------------------------------------------------------- */ +/* Implementation of the AccountsUser type */ +/* ---------------------------------------------------------------------------------------------------- */ + +/* A more efficient approach than parsing XML is to use const static + * GDBusInterfaceInfo, GDBusMethodInfo, ... structures + */ +static GDBusInterfaceInfo * +accounts_user_get_interface_info (void) +{ + static gsize has_info = 0; + static GDBusInterfaceInfo *info = NULL; + if (g_once_init_enter (&has_info)) + { + GDBusNodeInfo *introspection_data; + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + info = introspection_data->interfaces[0]; + g_once_init_leave (&has_info, 1); + } + return info; +} + +enum +{ + PROP_0, + PROP_USER_NAME, + PROP_REAL_NAME, + PROP_AUTOMATIC_LOGIN, +}; + +enum +{ + CHANGED_SIGNAL, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = {0}; + +G_DEFINE_TYPE (AccountsUser, accounts_user, G_TYPE_DBUS_PROXY); + +static void +accounts_user_finalize (GObject *object) +{ + G_GNUC_UNUSED AccountsUser *user = ACCOUNTS_USER (object); + + if (G_OBJECT_CLASS (accounts_user_parent_class)->finalize != NULL) + G_OBJECT_CLASS (accounts_user_parent_class)->finalize (object); +} + +static void +accounts_user_init (AccountsUser *user) +{ + /* Sets the expected interface */ + g_dbus_proxy_set_interface_info (G_DBUS_PROXY (user), accounts_user_get_interface_info ()); +} + +static void +accounts_user_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + AccountsUser *user = ACCOUNTS_USER (object); + + switch (prop_id) + { + case PROP_USER_NAME: + g_value_set_string (value, accounts_user_get_user_name (user)); + break; + + case PROP_REAL_NAME: + g_value_set_string (value, accounts_user_get_real_name (user)); + break; + + case PROP_AUTOMATIC_LOGIN: + g_value_set_boolean (value, accounts_user_get_automatic_login (user)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +const gchar * +accounts_user_get_user_name (AccountsUser *user) +{ + GVariant *value; + const gchar *ret; + g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL); + value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "UserName"); + ret = g_variant_get_string (value, NULL); + g_variant_unref (value); + return ret; +} + +const gchar * +accounts_user_get_real_name (AccountsUser *user) +{ + GVariant *value; + const gchar *ret; + g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL); + value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "RealName"); + ret = g_variant_get_string (value, NULL); + g_variant_unref (value); + return ret; +} + +gboolean +accounts_user_get_automatic_login (AccountsUser *user) +{ + GVariant *value; + gboolean ret; + g_return_val_if_fail (ACCOUNTS_IS_USER (user), FALSE); + value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "AutomaticLogin"); + ret = g_variant_get_boolean (value); + g_variant_unref (value); + return ret; +} + +static void +accounts_user_g_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters) +{ + AccountsUser *user = ACCOUNTS_USER (proxy); + if (g_strcmp0 (signal_name, "Changed") == 0) + g_signal_emit (user, signals[CHANGED_SIGNAL], 0); +} + +static void +accounts_user_g_properties_changed (GDBusProxy *proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties) +{ + AccountsUser *user = ACCOUNTS_USER (proxy); + GVariantIter *iter; + const gchar *key; + + if (changed_properties != NULL) + { + g_variant_get (changed_properties, "a{sv}", &iter); + while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) + { + if (g_strcmp0 (key, "AutomaticLogin") == 0) + g_object_notify (G_OBJECT (user), "automatic-login"); + else if (g_strcmp0 (key, "RealName") == 0) + g_object_notify (G_OBJECT (user), "real-name"); + else if (g_strcmp0 (key, "UserName") == 0) + g_object_notify (G_OBJECT (user), "user-name"); + } + g_variant_iter_free (iter); + } +} + +static void +accounts_user_class_init (AccountsUserClass *klass) +{ + GObjectClass *gobject_class; + GDBusProxyClass *proxy_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->get_property = accounts_user_get_property; + gobject_class->finalize = accounts_user_finalize; + + proxy_class = G_DBUS_PROXY_CLASS (klass); + proxy_class->g_signal = accounts_user_g_signal; + proxy_class->g_properties_changed = accounts_user_g_properties_changed; + + g_object_class_install_property (gobject_class, + PROP_USER_NAME, + g_param_spec_string ("user-name", + "User Name", + "The user name of the user", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_REAL_NAME, + g_param_spec_string ("real-name", + "Real Name", + "The real name of the user", + NULL, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, + PROP_AUTOMATIC_LOGIN, + g_param_spec_boolean ("automatic-login", + "Automatic Login", + "Whether the user is automatically logged in", + FALSE, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); + + signals[CHANGED_SIGNAL] = g_signal_new ("changed", + ACCOUNTS_TYPE_USER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (AccountsUserClass, changed), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); +} + +gchar * +accounts_user_frobnicate_sync (AccountsUser *user, + const gchar *flux, + gint baz, + GCancellable *cancellable, + GError **error) +{ + gchar *ret; + GVariant *value; + + g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL); + + ret = NULL; + + value = g_dbus_proxy_call_sync (G_DBUS_PROXY (user), + "Frobnicate", + g_variant_new ("(si)", + flux, + baz), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + error); + if (value != NULL) + { + g_variant_get (value, "(s)", &ret); + g_variant_unref (value); + } + return ret; +} + +void +accounts_user_frobnicate (AccountsUser *user, + const gchar *flux, + gint baz, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (ACCOUNTS_IS_USER (user)); + g_dbus_proxy_call (G_DBUS_PROXY (user), + "Frobnicate", + g_variant_new ("(si)", + flux, + baz), + G_DBUS_CALL_FLAGS_NONE, + -1, + cancellable, + callback, + user_data); +} + + +gchar * +accounts_user_frobnicate_finish (AccountsUser *user, + GAsyncResult *res, + GError **error) +{ + gchar *ret; + GVariant *value; + + ret = NULL; + value = g_dbus_proxy_call_finish (G_DBUS_PROXY (user), res, error); + if (value != NULL) + { + g_variant_get (value, "(s)", &ret); + g_variant_unref (value); + } + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +gint +main (gint argc, gchar *argv[]) +{ + return 0; +} diff --git a/gio/tests/gdbus-example-server.c b/gio/tests/gdbus-example-server.c new file mode 100644 index 0000000..6f1123d --- /dev/null +++ b/gio/tests/gdbus-example-server.c @@ -0,0 +1,390 @@ +#include +#include + +#ifdef G_OS_UNIX +#include +/* For STDOUT_FILENO */ +#include +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusNodeInfo *introspection_data = NULL; + +/* Introspection data for the service we are exporting */ +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "HelloWorld") == 0) + { + const gchar *greeting; + + g_variant_get (parameters, "(&s)", &greeting); + + if (g_strcmp0 (greeting, "Return Unregistered") == 0) + { + g_dbus_method_invocation_return_error (invocation, + G_IO_ERROR, + G_IO_ERROR_FAILED_HANDLED, + "As requested, here's a GError not registered (G_IO_ERROR_FAILED_HANDLED)"); + } + else if (g_strcmp0 (greeting, "Return Registered") == 0) + { + g_dbus_method_invocation_return_error (invocation, + G_DBUS_ERROR, + G_DBUS_ERROR_MATCH_RULE_NOT_FOUND, + "As requested, here's a GError that is registered (G_DBUS_ERROR_MATCH_RULE_NOT_FOUND)"); + } + else if (g_strcmp0 (greeting, "Return Raw") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.SomeErrorName", + "As requested, here's a raw D-Bus error"); + } + else + { + gchar *response; + response = g_strdup_printf ("You greeted me with '%s'. Thanks!", greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); + } + } + else if (g_strcmp0 (method_name, "EmitSignal") == 0) + { + GError *local_error; + gdouble speed_in_mph; + gchar *speed_as_string; + + g_variant_get (parameters, "(d)", &speed_in_mph); + speed_as_string = g_strdup_printf ("%g mph!", speed_in_mph); + + local_error = NULL; + g_dbus_connection_emit_signal (connection, + NULL, + object_path, + interface_name, + "VelocityChanged", + g_variant_new ("(ds)", + speed_in_mph, + speed_as_string), + &local_error); + g_assert_no_error (local_error); + g_free (speed_as_string); + + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "GimmeStdout") == 0) + { +#ifdef G_OS_UNIX + if (g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING) + { + GDBusMessage *reply; + GUnixFDList *fd_list; + GError *error; + + fd_list = g_unix_fd_list_new (); + error = NULL; + g_unix_fd_list_append (fd_list, STDOUT_FILENO, &error); + g_assert_no_error (error); + + reply = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation)); + g_dbus_message_set_unix_fd_list (reply, fd_list); + + error = NULL; + g_dbus_connection_send_message (connection, + reply, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + NULL, /* out_serial */ + &error); + g_assert_no_error (error); + + g_object_unref (invocation); + g_object_unref (fd_list); + g_object_unref (reply); + } + else + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Failed", + "Your message bus daemon does not support file descriptor passing (need D-Bus >= 1.3.0)"); + } +#else + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.NotOnUnix", + "Your OS does not support file descriptor passing"); +#endif + } +} + +static gchar *_global_title = NULL; + +static gboolean swap_a_and_b = FALSE; + +static GVariant * +handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GVariant *ret; + + ret = NULL; + if (g_strcmp0 (property_name, "FluxCapicitorName") == 0) + { + ret = g_variant_new_string ("DeLorean"); + } + else if (g_strcmp0 (property_name, "Title") == 0) + { + if (_global_title == NULL) + _global_title = g_strdup ("Back To C!"); + ret = g_variant_new_string (_global_title); + } + else if (g_strcmp0 (property_name, "ReadingAlwaysThrowsError") == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Hello %s. I thought I said reading this property " + "always results in an error. kthxbye", + sender); + } + else if (g_strcmp0 (property_name, "WritingAlwaysThrowsError") == 0) + { + ret = g_variant_new_string ("There's no home like home"); + } + else if (g_strcmp0 (property_name, "Foo") == 0) + { + ret = g_variant_new_string (swap_a_and_b ? "Tock" : "Tick"); + } + else if (g_strcmp0 (property_name, "Bar") == 0) + { + ret = g_variant_new_string (swap_a_and_b ? "Tick" : "Tock"); + } + + return ret; +} + +static gboolean +handle_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + if (g_strcmp0 (property_name, "Title") == 0) + { + if (g_strcmp0 (_global_title, g_variant_get_string (value, NULL)) != 0) + { + GVariantBuilder *builder; + GError *local_error; + + g_free (_global_title); + _global_title = g_variant_dup_string (value, NULL); + + local_error = NULL; + builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + g_variant_builder_add (builder, + "{sv}", + "Title", + g_variant_new_string (_global_title)); + g_dbus_connection_emit_signal (connection, + NULL, + object_path, + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + interface_name, + builder, + NULL), + &local_error); + g_assert_no_error (local_error); + } + } + else if (g_strcmp0 (property_name, "ReadingAlwaysThrowsError") == 0) + { + /* do nothing - they can't read it after all! */ + } + else if (g_strcmp0 (property_name, "WritingAlwaysThrowsError") == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Hello AGAIN %s. I thought I said writing this property " + "always results in an error. kthxbye", + sender); + } + + return *error == NULL; +} + + +/* for now */ +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + handle_get_property, + handle_set_property +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_timeout_cb (gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (user_data); + GVariantBuilder *builder; + GVariantBuilder *invalidated_builder; + GError *error; + + swap_a_and_b = !swap_a_and_b; + + error = NULL; + builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY); + invalidated_builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); + g_variant_builder_add (builder, + "{sv}", + "Foo", + g_variant_new_string (swap_a_and_b ? "Tock" : "Tick")); + g_variant_builder_add (builder, + "{sv}", + "Bar", + g_variant_new_string (swap_a_and_b ? "Tick" : "Tock")); + g_dbus_connection_emit_signal (connection, + NULL, + "/org/gtk/GDBus/TestObject", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new ("(sa{sv}as)", + "org.gtk.GDBus.TestInterface", + builder, + invalidated_builder), + &error); + g_assert_no_error (error); + + + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + guint registration_id; + + registration_id = g_dbus_connection_register_object (connection, + "/org/gtk/GDBus/TestObject", + introspection_data->interfaces[0], + &interface_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ + g_assert (registration_id > 0); + + /* swap value of properties Foo and Bar every two seconds */ + g_timeout_add_seconds (2, + on_timeout_cb, + connection); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + exit (1); +} + +int +main (int argc, char *argv[]) +{ + guint owner_id; + GMainLoop *loop; + + /* We are lazy here - we don't want to manually provide + * the introspection data structures - so we just build + * them from XML. + */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.TestServer", + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); + + g_dbus_node_info_unref (introspection_data); + + return 0; +} diff --git a/gio/tests/gdbus-example-subtree.c b/gio/tests/gdbus-example-subtree.c new file mode 100644 index 0000000..e921070 --- /dev/null +++ b/gio/tests/gdbus-example-subtree.c @@ -0,0 +1,398 @@ +#include +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusNodeInfo *introspection_data = NULL; +static GDBusInterfaceInfo *manager_interface_info = NULL; +static GDBusInterfaceInfo *block_interface_info = NULL; +static GDBusInterfaceInfo *partition_interface_info = NULL; + +/* Introspection data for the service we are exporting */ +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +manager_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *greeting; + gchar *response; + + g_assert_cmpstr (interface_name, ==, "org.gtk.GDBus.Example.Manager"); + g_assert_cmpstr (method_name, ==, "Hello"); + + g_variant_get (parameters, "(&s)", &greeting); + + response = g_strdup_printf ("Method %s.%s with user_data `%s' on object path %s called with arg '%s'", + interface_name, + method_name, + (const gchar *) user_data, + object_path, + greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); +} + +const GDBusInterfaceVTable manager_vtable = +{ + manager_method_call, + NULL, /* get_property */ + NULL /* set_property */ +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +block_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + g_assert_cmpstr (interface_name, ==, "org.gtk.GDBus.Example.Block"); + + if (g_strcmp0 (method_name, "Hello") == 0) + { + const gchar *greeting; + gchar *response; + + g_variant_get (parameters, "(&s)", &greeting); + + response = g_strdup_printf ("Method %s.%s with user_data `%s' on object path %s called with arg '%s'", + interface_name, + method_name, + (const gchar *) user_data, + object_path, + greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); + } + else if (g_strcmp0 (method_name, "DoStuff") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.TestSubtree.Error.Failed", + "This method intentionally always fails"); + } + else + { + g_assert_not_reached (); + } +} + +static GVariant * +block_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GVariant *ret; + const gchar *node; + gint major; + gint minor; + + node = strrchr (object_path, '/') + 1; + if (g_str_has_prefix (node, "sda")) + major = 8; + else + major = 9; + if (strlen (node) == 4) + minor = node[3] - '0'; + else + minor = 0; + + ret = NULL; + if (g_strcmp0 (property_name, "Major") == 0) + { + ret = g_variant_new_int32 (major); + } + else if (g_strcmp0 (property_name, "Minor") == 0) + { + ret = g_variant_new_int32 (minor); + } + else if (g_strcmp0 (property_name, "Notes") == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Hello %s. I thought I said reading this property " + "always results in an error. kthxbye", + sender); + } + else + { + g_assert_not_reached (); + } + + return ret; +} + +static gboolean +block_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + /* TODO */ + g_assert_not_reached (); +} + +const GDBusInterfaceVTable block_vtable = +{ + block_method_call, + block_get_property, + block_set_property, +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +partition_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *greeting; + gchar *response; + + g_assert_cmpstr (interface_name, ==, "org.gtk.GDBus.Example.Partition"); + g_assert_cmpstr (method_name, ==, "Hello"); + + g_variant_get (parameters, "(&s)", &greeting); + + response = g_strdup_printf ("Method %s.%s with user_data `%s' on object path %s called with arg '%s'", + interface_name, + method_name, + (const gchar *) user_data, + object_path, + greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); +} + +const GDBusInterfaceVTable partition_vtable = +{ + partition_method_call, + //partition_get_property, + //partition_set_property +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar ** +subtree_enumerate (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + gpointer user_data) +{ + gchar **nodes; + GPtrArray *p; + + p = g_ptr_array_new (); + g_ptr_array_add (p, g_strdup ("sda")); + g_ptr_array_add (p, g_strdup ("sda1")); + g_ptr_array_add (p, g_strdup ("sda2")); + g_ptr_array_add (p, g_strdup ("sda3")); + g_ptr_array_add (p, g_strdup ("sdb")); + g_ptr_array_add (p, g_strdup ("sdb1")); + g_ptr_array_add (p, g_strdup ("sdc")); + g_ptr_array_add (p, g_strdup ("sdc1")); + g_ptr_array_add (p, NULL); + nodes = (gchar **) g_ptr_array_free (p, FALSE); + + return nodes; +} + +static GDBusInterfaceInfo ** +subtree_introspect (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *node, + gpointer user_data) +{ + GPtrArray *p; + + p = g_ptr_array_new (); + if (node == NULL) + { + g_ptr_array_add (p, g_dbus_interface_info_ref (manager_interface_info)); + } + else + { + g_ptr_array_add (p, g_dbus_interface_info_ref (block_interface_info)); + if (strlen (node) == 4) + g_ptr_array_add (p, + g_dbus_interface_info_ref (partition_interface_info)); + } + + g_ptr_array_add (p, NULL); + + return (GDBusInterfaceInfo **) g_ptr_array_free (p, FALSE); +} + +static const GDBusInterfaceVTable * +subtree_dispatch (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *node, + gpointer *out_user_data, + gpointer user_data) +{ + const GDBusInterfaceVTable *vtable_to_return; + gpointer user_data_to_return; + + if (g_strcmp0 (interface_name, "org.gtk.GDBus.Example.Manager") == 0) + { + user_data_to_return = "The Root"; + vtable_to_return = &manager_vtable; + } + else + { + if (strlen (node) == 4) + user_data_to_return = "A partition"; + else + user_data_to_return = "A block device"; + + if (g_strcmp0 (interface_name, "org.gtk.GDBus.Example.Block") == 0) + vtable_to_return = &block_vtable; + else if (g_strcmp0 (interface_name, "org.gtk.GDBus.Example.Partition") == 0) + vtable_to_return = &partition_vtable; + else + g_assert_not_reached (); + } + + *out_user_data = user_data_to_return; + + return vtable_to_return; +} + +const GDBusSubtreeVTable subtree_vtable = +{ + subtree_enumerate, + subtree_introspect, + subtree_dispatch +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + guint registration_id; + + registration_id = g_dbus_connection_register_subtree (connection, + "/org/gtk/GDBus/TestSubtree/Devices", + &subtree_vtable, + G_DBUS_SUBTREE_FLAGS_NONE, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + NULL); /* GError** */ + g_assert (registration_id > 0); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + exit (1); +} + +int +main (int argc, char *argv[]) +{ + guint owner_id; + GMainLoop *loop; + + /* We are lazy here - we don't want to manually provide + * the introspection data structures - so we just build + * them from XML. + */ + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + g_assert (introspection_data != NULL); + + manager_interface_info = g_dbus_node_info_lookup_interface (introspection_data, "org.gtk.GDBus.Example.Manager"); + block_interface_info = g_dbus_node_info_lookup_interface (introspection_data, "org.gtk.GDBus.Example.Block"); + partition_interface_info = g_dbus_node_info_lookup_interface (introspection_data, "org.gtk.GDBus.Example.Partition"); + g_assert (manager_interface_info != NULL); + g_assert (block_interface_info != NULL); + g_assert (partition_interface_info != NULL); + + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.TestSubtree", + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); + + g_dbus_node_info_unref (introspection_data); + + return 0; +} diff --git a/gio/tests/gdbus-example-unix-fd-client.c b/gio/tests/gdbus-example-unix-fd-client.c new file mode 100644 index 0000000..e3ab015 --- /dev/null +++ b/gio/tests/gdbus-example-unix-fd-client.c @@ -0,0 +1,132 @@ +#include +#include + +#include +#include + +#include + +#include +#include + +/* see gdbus-example-server.c for the server implementation */ +static gint +get_server_stdout (GDBusConnection *connection, + const gchar *name_owner, + GError **error) +{ + GDBusMessage *method_call_message; + GDBusMessage *method_reply_message; + GUnixFDList *fd_list; + gint fd; + + fd = -1; + method_call_message = NULL; + method_reply_message = NULL; + + method_call_message = g_dbus_message_new_method_call (name_owner, + "/org/gtk/GDBus/TestObject", + "org.gtk.GDBus.TestInterface", + "GimmeStdout"); + method_reply_message = g_dbus_connection_send_message_with_reply_sync (connection, + method_call_message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + NULL, /* out_serial */ + NULL, /* cancellable */ + error); + if (method_reply_message == NULL) + goto out; + + if (g_dbus_message_get_message_type (method_reply_message) == G_DBUS_MESSAGE_TYPE_ERROR) + { + g_dbus_message_to_gerror (method_reply_message, error); + goto out; + } + + fd_list = g_dbus_message_get_unix_fd_list (method_reply_message); + fd = g_unix_fd_list_get (fd_list, 0, error); + + out: + g_object_unref (method_call_message); + g_object_unref (method_reply_message); + + return fd; +} + +static void +on_name_appeared (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + gint fd; + GError *error; + + error = NULL; + fd = get_server_stdout (connection, name_owner, &error); + if (fd == -1) + { + g_printerr ("Error invoking GimmeStdout(): %s\n", + error->message); + g_error_free (error); + exit (1); + } + else + { + gchar now_buf[256]; + time_t now; + gssize len; + gchar *str; + + now = time (NULL); + strftime (now_buf, + sizeof now_buf, + "%c", + localtime (&now)); + + str = g_strdup_printf ("On %s, gdbus-example-unix-fd-client with pid %d was here!\n", + now_buf, + (gint) getpid ()); + len = strlen (str); + g_warn_if_fail (write (fd, str, len) == len); + close (fd); + + g_print ("Wrote the following on server's stdout:\n%s", str); + + g_free (str); + exit (0); + } +} + +static void +on_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_printerr ("Failed to get name owner for %s\n" + "Is ./gdbus-example-server running?\n", + name); + exit (1); +} + +int +main (int argc, char *argv[]) +{ + guint watcher_id; + GMainLoop *loop; + + watcher_id = g_bus_watch_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.TestServer", + G_BUS_NAME_WATCHER_FLAGS_NONE, + on_name_appeared, + on_name_vanished, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unwatch_name (watcher_id); + return 0; +} diff --git a/gio/tests/gdbus-example-watch-name.c b/gio/tests/gdbus-example-watch-name.c new file mode 100644 index 0000000..caec6ec --- /dev/null +++ b/gio/tests/gdbus-example-watch-name.c @@ -0,0 +1,86 @@ +#include + +static gchar *opt_name = NULL; +static gboolean opt_system_bus = FALSE; +static gboolean opt_auto_start = FALSE; + +static GOptionEntry opt_entries[] = +{ + { "name", 'n', 0, G_OPTION_ARG_STRING, &opt_name, "Name to watch", NULL }, + { "system-bus", 's', 0, G_OPTION_ARG_NONE, &opt_system_bus, "Use the system-bus instead of the session-bus", NULL }, + { "auto-start", 'a', 0, G_OPTION_ARG_NONE, &opt_auto_start, "Instruct the bus to launch an owner for the name", NULL}, + { NULL} +}; + +static void +on_name_appeared (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + g_print ("Name %s on %s is owned by %s\n", + name, + opt_system_bus ? "the system bus" : "the session bus", + name_owner); +} + +static void +on_name_vanished (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Name %s does not exist on %s\n", + name, + opt_system_bus ? "the system bus" : "the session bus"); +} + +int +main (int argc, char *argv[]) +{ + guint watcher_id; + GMainLoop *loop; + GOptionContext *opt_context; + GError *error; + GBusNameWatcherFlags flags; + + error = NULL; + opt_context = g_option_context_new ("g_bus_watch_name() example"); + g_option_context_set_summary (opt_context, + "Example: to watch the power manager on the session bus, use:\n" + "\n" + " ./example-watch-name -n org.gnome.PowerManager"); + g_option_context_add_main_entries (opt_context, opt_entries, NULL); + if (!g_option_context_parse (opt_context, &argc, &argv, &error)) + { + g_printerr ("Error parsing options: %s", error->message); + goto out; + } + if (opt_name == NULL) + { + g_printerr ("Incorrect usage, try --help.\n"); + goto out; + } + + flags = G_BUS_NAME_WATCHER_FLAGS_NONE; + if (opt_auto_start) + flags |= G_BUS_NAME_WATCHER_FLAGS_AUTO_START; + + watcher_id = g_bus_watch_name (opt_system_bus ? G_BUS_TYPE_SYSTEM : G_BUS_TYPE_SESSION, + opt_name, + flags, + on_name_appeared, + on_name_vanished, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unwatch_name (watcher_id); + + out: + g_option_context_free (opt_context); + g_free (opt_name); + + return 0; +} diff --git a/gio/tests/gdbus-example-watch-proxy.c b/gio/tests/gdbus-example-watch-proxy.c new file mode 100644 index 0000000..51132e3 --- /dev/null +++ b/gio/tests/gdbus-example-watch-proxy.c @@ -0,0 +1,230 @@ +#include + +static gchar *opt_name = NULL; +static gchar *opt_object_path = NULL; +static gchar *opt_interface = NULL; +static gboolean opt_system_bus = FALSE; +static gboolean opt_no_auto_start = FALSE; +static gboolean opt_no_properties = FALSE; + +static GOptionEntry opt_entries[] = +{ + { "name", 'n', 0, G_OPTION_ARG_STRING, &opt_name, "Name of the remote object to watch", NULL }, + { "object-path", 'o', 0, G_OPTION_ARG_STRING, &opt_object_path, "Object path of the remote object", NULL }, + { "interface", 'i', 0, G_OPTION_ARG_STRING, &opt_interface, "D-Bus interface of remote object", NULL }, + { "system-bus", 's', 0, G_OPTION_ARG_NONE, &opt_system_bus, "Use the system-bus instead of the session-bus", NULL }, + { "no-auto-start", 'a', 0, G_OPTION_ARG_NONE, &opt_no_auto_start, "Don't instruct the bus to launch an owner for the name", NULL}, + { "no-properties", 'p', 0, G_OPTION_ARG_NONE, &opt_no_properties, "Do not load properties", NULL}, + { NULL} +}; + +static GMainLoop *loop = NULL; + +static void +print_properties (GDBusProxy *proxy) +{ + gchar **property_names; + guint n; + + g_print (" properties:\n"); + + property_names = g_dbus_proxy_get_cached_property_names (proxy); + for (n = 0; property_names != NULL && property_names[n] != NULL; n++) + { + const gchar *key = property_names[n]; + GVariant *value; + gchar *value_str; + value = g_dbus_proxy_get_cached_property (proxy, key); + value_str = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, value_str); + g_variant_unref (value); + g_free (value_str); + } + g_strfreev (property_names); +} + +static void +on_properties_changed (GDBusProxy *proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties, + gpointer user_data) +{ + /* Note that we are guaranteed that changed_properties and + * invalidated_properties are never NULL + */ + + if (g_variant_n_children (changed_properties) > 0) + { + GVariantIter *iter; + const gchar *key; + GVariant *value; + + g_print (" *** Properties Changed:\n"); + g_variant_get (changed_properties, + "a{sv}", + &iter); + while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) + { + gchar *value_str; + value_str = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, value_str); + g_free (value_str); + } + g_variant_iter_free (iter); + } + + if (g_strv_length ((GStrv) invalidated_properties) > 0) + { + guint n; + g_print (" *** Properties Invalidated:\n"); + for (n = 0; invalidated_properties[n] != NULL; n++) + { + const gchar *key = invalidated_properties[n]; + g_print (" %s\n", key); + } + } +} + +static void +on_signal (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + gchar *parameters_str; + + parameters_str = g_variant_print (parameters, TRUE); + g_print (" *** Received Signal: %s: %s\n", + signal_name, + parameters_str); + g_free (parameters_str); +} + +static void +print_proxy (GDBusProxy *proxy) +{ + gchar *name_owner; + + name_owner = g_dbus_proxy_get_name_owner (proxy); + if (name_owner != NULL) + { + g_print ("+++ Proxy object points to remote object owned by %s\n" + " bus: %s\n" + " name: %s\n" + " object path: %s\n" + " interface: %s\n", + name_owner, + opt_system_bus ? "System Bus" : "Session Bus", + opt_name, + opt_object_path, + opt_interface); + print_properties (proxy); + } + else + { + g_print ("--- Proxy object is inert - there is no name owner for the name\n" + " bus: %s\n" + " name: %s\n" + " object path: %s\n" + " interface: %s\n", + opt_system_bus ? "System Bus" : "Session Bus", + opt_name, + opt_object_path, + opt_interface); + } + g_free (name_owner); +} + +static void +on_name_owner_notify (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY (object); + print_proxy (proxy); +} + +int +main (int argc, char *argv[]) +{ + GOptionContext *opt_context; + GError *error; + GDBusProxyFlags flags; + GDBusProxy *proxy; + + loop = NULL; + proxy = NULL; + + opt_context = g_option_context_new ("g_bus_watch_proxy() example"); + g_option_context_set_summary (opt_context, + "Example: to watch the object of gdbus-example-server, use:\n" + "\n" + " ./gdbus-example-watch-proxy -n org.gtk.GDBus.TestServer \\\n" + " -o /org/gtk/GDBus/TestObject \\\n" + " -i org.gtk.GDBus.TestInterface"); + g_option_context_add_main_entries (opt_context, opt_entries, NULL); + error = NULL; + if (!g_option_context_parse (opt_context, &argc, &argv, &error)) + { + g_printerr ("Error parsing options: %s\n", error->message); + goto out; + } + if (opt_name == NULL || opt_object_path == NULL || opt_interface == NULL) + { + g_printerr ("Incorrect usage, try --help.\n"); + goto out; + } + + flags = G_DBUS_PROXY_FLAGS_NONE; + if (opt_no_properties) + flags |= G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES; + if (opt_no_auto_start) + flags |= G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; + + loop = g_main_loop_new (NULL, FALSE); + + error = NULL; + proxy = g_dbus_proxy_new_for_bus_sync (opt_system_bus ? G_BUS_TYPE_SYSTEM : G_BUS_TYPE_SESSION, + flags, + NULL, /* GDBusInterfaceInfo */ + opt_name, + opt_object_path, + opt_interface, + NULL, /* GCancellable */ + &error); + if (proxy == NULL) + { + g_printerr ("Error creating proxy: %s\n", error->message); + g_error_free (error); + goto out; + } + + g_signal_connect (proxy, + "g-properties-changed", + G_CALLBACK (on_properties_changed), + NULL); + g_signal_connect (proxy, + "g-signal", + G_CALLBACK (on_signal), + NULL); + g_signal_connect (proxy, + "notify::g-name-owner", + G_CALLBACK (on_name_owner_notify), + NULL); + print_proxy (proxy); + + g_main_loop_run (loop); + + out: + if (proxy != NULL) + g_object_unref (proxy); + if (loop != NULL) + g_main_loop_unref (loop); + g_option_context_free (opt_context); + g_free (opt_name); + g_free (opt_object_path); + g_free (opt_interface); + + return 0; +} diff --git a/gio/tests/gdbus-exit-on-close.c b/gio/tests/gdbus-exit-on-close.c new file mode 100644 index 0000000..08338c4 --- /dev/null +++ b/gio/tests/gdbus-exit-on-close.c @@ -0,0 +1,217 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + const gchar *name; + const gchar *bug; + enum { + EXPLICITLY_FALSE = FALSE, + EXPLICITLY_TRUE = TRUE, + IMPLICITLY_TRUE + } exit_on_close; + enum { + LOCAL, + REMOTE + } who_closes; +} TestData; + +static const TestData cases[] = { + { "default", NULL, IMPLICITLY_TRUE, REMOTE }, + { "true", NULL, EXPLICITLY_TRUE, REMOTE }, + { "false", NULL, EXPLICITLY_FALSE, REMOTE }, + { "we-close", "662100", EXPLICITLY_TRUE, LOCAL }, + { NULL } +}; + +static gboolean +quit_later_cb (gpointer data G_GNUC_UNUSED) +{ + g_main_loop_quit (loop); + + return FALSE; +} + +#define VANISHED_PATTERN "*Remote peer vanished with error: Underlying GIOStream returned 0 bytes on an async read (g-io-error-quark, 0). Exiting.*" + +static void +closed_cb (GDBusConnection *c G_GNUC_UNUSED, + gboolean remote_peer_vanished, + GError *error, + gpointer test_data) +{ + const TestData *td = test_data; + + if (error == NULL) + g_debug ("closed (%d, no error)", remote_peer_vanished); + else + g_debug ("closed (%d, %s %d \"%s\")", remote_peer_vanished, + g_quark_to_string (error->domain), error->code, error->message); + + g_assert_cmpint (remote_peer_vanished, ==, (td->who_closes == REMOTE)); + g_assert_cmpint ((error == NULL), ==, (td->who_closes == LOCAL)); + + /* we delay this so that if exit-on-close was going to happen, it will + * win the race + */ + g_timeout_add (50, quit_later_cb, NULL); +} + +static void +close_async_cb (GObject *source G_GNUC_UNUSED, + GAsyncResult *res G_GNUC_UNUSED, + gpointer nil G_GNUC_UNUSED) +{ + GError *error = NULL; + + if (g_dbus_connection_close_finish (G_DBUS_CONNECTION (source), + res, + &error)) + { + g_debug ("closed connection"); + } + else + { + g_warning ("failed to close connection: %s (%s #%d)", + error->message, g_quark_to_string (error->domain), + error->code); + } +} + +static void +test_exit_on_close (gconstpointer test_data) +{ + const TestData *td = test_data; + GTestTrapFlags silence; + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + g_test_dbus_unset (); + + if (g_test_verbose ()) + silence = 0; + else + silence = G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR; + + if (g_test_trap_fork (0, silence)) + { + GDBusConnection *c; + + session_bus_up (); + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + g_assert (c != NULL); + + /* the default is meant to be TRUE */ + if (td->exit_on_close != IMPLICITLY_TRUE) + g_dbus_connection_set_exit_on_close (c, td->exit_on_close); + + g_assert_cmpint (g_dbus_connection_get_exit_on_close (c), ==, + (td->exit_on_close != EXPLICITLY_FALSE)); + g_assert (!g_dbus_connection_is_closed (c)); + + g_timeout_add (50, quit_later_cb, NULL); + g_main_loop_run (loop); + + g_signal_connect (c, "closed", G_CALLBACK (closed_cb), (gpointer) td); + + if (td->who_closes == LOCAL) + { + GVariant *v; + GError *error = NULL; + + v = g_dbus_connection_call_sync (c, "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "ListNames", + NULL, + G_VARIANT_TYPE ("(as)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (v != NULL); + g_variant_unref (v); + + g_dbus_connection_close (c, NULL, close_async_cb, NULL); + } + else + { + session_bus_stop (); + } + + g_main_loop_run (loop); + /* this is only reached when we turn off exit-on-close */ + g_main_loop_unref (loop); + g_object_unref (c); + + session_bus_down (); + + exit (0); + } + + if (td->exit_on_close == EXPLICITLY_FALSE || + td->who_closes == LOCAL) + { + g_test_trap_assert_stdout_unmatched (VANISHED_PATTERN); + g_test_trap_assert_passed (); + } + else + { + g_test_trap_assert_stdout (VANISHED_PATTERN); + g_test_trap_assert_failed(); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint i; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; cases[i].name != NULL; i++) + { + gchar *name = g_strdup_printf ("/gdbus/exit-on-close/%s", cases[i].name); + + g_test_add_data_func (name, &cases[i], test_exit_on_close); + g_free (name); + } + + return g_test_run(); +} diff --git a/gio/tests/gdbus-export.c b/gio/tests/gdbus-export.c new file mode 100644 index 0000000..f053d53 --- /dev/null +++ b/gio/tests/gdbus-export.c @@ -0,0 +1,1554 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +static GDBusConnection *c = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that we can export objects, the hierarchy is correct and the right handlers are invoked */ +/* ---------------------------------------------------------------------------------------------------- */ + +static const GDBusArgInfo foo_method1_in_args = +{ + -1, + "an_input_string", + "s", + NULL +}; +static const GDBusArgInfo * const foo_method1_in_arg_pointers[] = {&foo_method1_in_args, NULL}; + +static const GDBusArgInfo foo_method1_out_args = +{ + -1, + "an_output_string", + "s", + NULL +}; +static const GDBusArgInfo * const foo_method1_out_arg_pointers[] = {&foo_method1_out_args, NULL}; + +static const GDBusMethodInfo foo_method_info_method1 = +{ + -1, + "Method1", + (GDBusArgInfo **) &foo_method1_in_arg_pointers, + (GDBusArgInfo **) &foo_method1_out_arg_pointers, + NULL +}; +static const GDBusMethodInfo foo_method_info_method2 = +{ + -1, + "Method2", + NULL, + NULL, + NULL +}; +static const GDBusMethodInfo * const foo_method_info_pointers[] = {&foo_method_info_method1, &foo_method_info_method2, NULL}; + +static const GDBusSignalInfo foo_signal_info = +{ + -1, + "SignalAlpha", + NULL, + NULL +}; +static const GDBusSignalInfo * const foo_signal_info_pointers[] = {&foo_signal_info, NULL}; + +static const GDBusPropertyInfo foo_property_info[] = +{ + { + -1, + "PropertyUno", + "s", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, + NULL + }, + { + -1, + "NotWritable", + "s", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL + }, + { + -1, + "NotReadable", + "s", + G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, + NULL + } +}; +static const GDBusPropertyInfo * const foo_property_info_pointers[] = +{ + &foo_property_info[0], + &foo_property_info[1], + &foo_property_info[2], + NULL +}; + +static const GDBusInterfaceInfo foo_interface_info = +{ + -1, + "org.example.Foo", + (GDBusMethodInfo **) &foo_method_info_pointers, + (GDBusSignalInfo **) &foo_signal_info_pointers, + (GDBusPropertyInfo **)&foo_property_info_pointers, + NULL, +}; + +static void +foo_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "Method1") == 0) + { + const gchar *input; + gchar *output; + g_variant_get (parameters, "(&s)", &input); + output = g_strdup_printf ("You passed the string `%s'. Jolly good!", input); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", output)); + g_free (output); + } + else + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.example.SomeError", + "How do you like them apples, buddy!"); + } +} + +static GVariant * +foo_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GVariant *ret; + gchar *s; + s = g_strdup_printf ("Property `%s' Is What It Is!", property_name); + ret = g_variant_new_string (s); + g_free (s); + return ret; +} + +static gboolean +foo_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + gchar *s; + s = g_variant_print (value, TRUE); + g_set_error (error, + G_DBUS_ERROR, + G_DBUS_ERROR_SPAWN_FILE_INVALID, + "Returning some error instead of writing the value `%s' to the property `%s'", + property_name, s); + g_free (s); + return FALSE; +} + +static const GDBusInterfaceVTable foo_vtable = +{ + foo_method_call, + foo_get_property, + foo_set_property +}; + +/* -------------------- */ + +static const GDBusMethodInfo bar_method_info[] = +{ + { + -1, + "MethodA", + NULL, + NULL, + NULL + }, + { + -1, + "MethodB", + NULL, + NULL, + NULL + } +}; +static const GDBusMethodInfo * const bar_method_info_pointers[] = {&bar_method_info[0], &bar_method_info[1], NULL}; + +static const GDBusSignalInfo bar_signal_info[] = +{ + { + -1, + "SignalMars", + NULL, + NULL + } +}; +static const GDBusSignalInfo * const bar_signal_info_pointers[] = {&bar_signal_info[0], NULL}; + +static const GDBusPropertyInfo bar_property_info[] = +{ + { + -1, + "PropertyDuo", + "s", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL + } +}; +static const GDBusPropertyInfo * const bar_property_info_pointers[] = {&bar_property_info[0], NULL}; + +static const GDBusInterfaceInfo bar_interface_info = +{ + -1, + "org.example.Bar", + (GDBusMethodInfo **) bar_method_info_pointers, + (GDBusSignalInfo **) bar_signal_info_pointers, + (GDBusPropertyInfo **) bar_property_info_pointers, + NULL, +}; + +/* -------------------- */ + +static const GDBusMethodInfo dyna_method_info[] = +{ + { + -1, + "DynaCyber", + NULL, + NULL, + NULL + } +}; +static const GDBusMethodInfo * const dyna_method_info_pointers[] = {&dyna_method_info[0], NULL}; + +static const GDBusInterfaceInfo dyna_interface_info = +{ + -1, + "org.example.Dyna", + (GDBusMethodInfo **) dyna_method_info_pointers, + NULL, /* no signals */ + NULL, /* no properties */ + NULL, +}; + +static void +dyna_cyber (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + GPtrArray *data = user_data; + gchar *node_name; + guint n; + + node_name = strrchr (object_path, '/') + 1; + + /* Add new node if it is not already known */ + for (n = 0; n < data->len ; n++) + { + if (g_strcmp0 (g_ptr_array_index (data, n), node_name) == 0) + goto out; + } + g_ptr_array_add (data, g_strdup(node_name)); + + out: + g_dbus_method_invocation_return_value (invocation, NULL); +} + +static const GDBusInterfaceVTable dyna_interface_vtable = +{ + dyna_cyber, + NULL, + NULL +}; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +introspect_callback (GDBusProxy *proxy, + GAsyncResult *res, + gpointer user_data) +{ + gchar **xml_data = user_data; + GVariant *result; + GError *error; + + error = NULL; + result = g_dbus_proxy_call_finish (proxy, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(s)", xml_data); + g_variant_unref (result); + + g_main_loop_quit (loop); +} + +static gchar ** +get_nodes_at (GDBusConnection *c, + const gchar *object_path) +{ + GError *error; + GDBusProxy *proxy; + gchar *xml_data; + GPtrArray *p; + GDBusNodeInfo *node_info; + guint n; + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.freedesktop.DBus.Introspectable", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + /* do this async to avoid libdbus-1 deadlocks */ + xml_data = NULL; + g_dbus_proxy_call (proxy, + "Introspect", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) introspect_callback, + &xml_data); + g_main_loop_run (loop); + g_assert (xml_data != NULL); + + node_info = g_dbus_node_info_new_for_xml (xml_data, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + + p = g_ptr_array_new (); + for (n = 0; node_info->nodes != NULL && node_info->nodes[n] != NULL; n++) + { + const GDBusNodeInfo *sub_node_info = node_info->nodes[n]; + g_ptr_array_add (p, g_strdup (sub_node_info->path)); + } + g_ptr_array_add (p, NULL); + + g_object_unref (proxy); + g_free (xml_data); + g_dbus_node_info_unref (node_info); + + return (gchar **) g_ptr_array_free (p, FALSE); +} + +static gboolean +has_interface (GDBusConnection *c, + const gchar *object_path, + const gchar *interface_name) +{ + GError *error; + GDBusProxy *proxy; + gchar *xml_data; + GDBusNodeInfo *node_info; + gboolean ret; + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.freedesktop.DBus.Introspectable", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + /* do this async to avoid libdbus-1 deadlocks */ + xml_data = NULL; + g_dbus_proxy_call (proxy, + "Introspect", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) introspect_callback, + &xml_data); + g_main_loop_run (loop); + g_assert (xml_data != NULL); + + node_info = g_dbus_node_info_new_for_xml (xml_data, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + + ret = (g_dbus_node_info_lookup_interface (node_info, interface_name) != NULL); + + g_object_unref (proxy); + g_free (xml_data); + g_dbus_node_info_unref (node_info); + + return ret; +} + +static guint +count_interfaces (GDBusConnection *c, + const gchar *object_path) +{ + GError *error; + GDBusProxy *proxy; + gchar *xml_data; + GDBusNodeInfo *node_info; + guint ret; + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.freedesktop.DBus.Introspectable", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + /* do this async to avoid libdbus-1 deadlocks */ + xml_data = NULL; + g_dbus_proxy_call (proxy, + "Introspect", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) introspect_callback, + &xml_data); + g_main_loop_run (loop); + g_assert (xml_data != NULL); + + node_info = g_dbus_node_info_new_for_xml (xml_data, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + + ret = 0; + while (node_info->interfaces != NULL && node_info->interfaces[ret] != NULL) + ret++; + + g_object_unref (proxy); + g_free (xml_data); + g_dbus_node_info_unref (node_info); + + return ret; +} + +static void +dyna_create_callback (GDBusProxy *proxy, + GAsyncResult *res, + gpointer user_data) +{ + GVariant *result; + GError *error; + + error = NULL; + result = g_dbus_proxy_call_finish (proxy, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_unref (result); + + g_main_loop_quit (loop); +} + +/* Dynamically create @object_name under /foo/dyna */ +static void +dyna_create (GDBusConnection *c, + const gchar *object_name) +{ + GError *error; + GDBusProxy *proxy; + gchar *object_path; + + object_path = g_strconcat ("/foo/dyna/", object_name, NULL); + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.example.Dyna", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + /* do this async to avoid libdbus-1 deadlocks */ + g_dbus_proxy_call (proxy, + "DynaCyber", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) dyna_create_callback, + NULL); + g_main_loop_run (loop); + + g_assert_no_error (error); + + g_object_unref (proxy); + g_free (object_path); + + return; +} + +typedef struct +{ + guint num_unregistered_calls; + guint num_unregistered_subtree_calls; + guint num_subtree_nodes; +} ObjectRegistrationData; + +static void +on_object_unregistered (gpointer user_data) +{ + ObjectRegistrationData *data = user_data; + + data->num_unregistered_calls++; +} + +static void +on_subtree_unregistered (gpointer user_data) +{ + ObjectRegistrationData *data = user_data; + + data->num_unregistered_subtree_calls++; +} + +static gboolean +_g_strv_has_string (const gchar* const * haystack, + const gchar *needle) +{ + guint n; + + for (n = 0; haystack != NULL && haystack[n] != NULL; n++) + { + if (g_strcmp0 (haystack[n], needle) == 0) + return TRUE; + } + return FALSE; +} + +/* -------------------- */ + +static gchar ** +subtree_enumerate (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + gpointer user_data) +{ + ObjectRegistrationData *data = user_data; + GPtrArray *p; + gchar **nodes; + guint n; + + p = g_ptr_array_new (); + + for (n = 0; n < data->num_subtree_nodes; n++) + { + g_ptr_array_add (p, g_strdup_printf ("vp%d", n)); + g_ptr_array_add (p, g_strdup_printf ("evp%d", n)); + } + g_ptr_array_add (p, NULL); + + nodes = (gchar **) g_ptr_array_free (p, FALSE); + + return nodes; +} + +/* Only allows certain objects, and aborts on unknowns */ +static GDBusInterfaceInfo ** +subtree_introspect (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *node, + gpointer user_data) +{ + const GDBusInterfaceInfo *interfaces[2] = { + NULL /* filled in below */, NULL + }; + + /* VPs implement the Foo interface, EVPs implement the Bar interface. The root + * does not implement any interfaces + */ + if (node == NULL) + { + return NULL; + } + else if (g_str_has_prefix (node, "vp")) + { + interfaces[0] = &foo_interface_info; + } + else if (g_str_has_prefix (node, "evp")) + { + interfaces[0] = &bar_interface_info; + } + else + { + g_assert_not_reached (); + } + + return g_memdup (interfaces, 2 * sizeof (void *)); +} + +static const GDBusInterfaceVTable * +subtree_dispatch (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *node, + gpointer *out_user_data, + gpointer user_data) +{ + if (g_strcmp0 (interface_name, "org.example.Foo") == 0) + return &foo_vtable; + else + return NULL; +} + +static const GDBusSubtreeVTable subtree_vtable = +{ + subtree_enumerate, + subtree_introspect, + subtree_dispatch +}; + +/* -------------------- */ + +static gchar ** +dynamic_subtree_enumerate (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + gpointer user_data) +{ + GPtrArray *data = user_data; + gchar **nodes = g_new (gchar*, data->len + 1); + guint n; + + for (n = 0; n < data->len; n++) + { + nodes[n] = g_strdup (g_ptr_array_index (data, n)); + } + nodes[data->len] = NULL; + + return nodes; +} + +/* Allow all objects to be introspected */ +static GDBusInterfaceInfo ** +dynamic_subtree_introspect (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *node, + gpointer user_data) +{ + const GDBusInterfaceInfo *interfaces[2] = { &dyna_interface_info, NULL }; + + return g_memdup (interfaces, 2 * sizeof (void *)); +} + +static const GDBusInterfaceVTable * +dynamic_subtree_dispatch (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *node, + gpointer *out_user_data, + gpointer user_data) +{ + *out_user_data = user_data; + return &dyna_interface_vtable; +} + +static const GDBusSubtreeVTable dynamic_subtree_vtable = +{ + dynamic_subtree_enumerate, + dynamic_subtree_introspect, + dynamic_subtree_dispatch +}; + +/* -------------------- */ + +static gpointer +test_dispatch_thread_func (gpointer user_data) +{ + const gchar *object_path = user_data; + GDBusProxy *foo_proxy; + GVariant *value; + GVariant *inner; + GError *error; + gchar *s; + const gchar *value_str; + + foo_proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS | + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.example.Foo", + NULL, + &error); + g_assert (foo_proxy != NULL); + + /* generic interfaces */ + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Peer.Ping", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_variant_unref (value); + + /* user methods */ + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "Method1", + g_variant_new ("(s)", "winwinwin"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("(s)"))); + g_variant_get (value, "(&s)", &value_str); + g_assert_cmpstr (value_str, ==, "You passed the string `winwinwin'. Jolly good!"); + g_variant_unref (value); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "Method2", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.example.SomeError: How do you like them apples, buddy!"); + g_error_free (error); + g_assert (value == NULL); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "Method2", + g_variant_new ("(s)", "failfailfail"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Type of message, `(s)', does not match expected type `()'"); + g_error_free (error); + g_assert (value == NULL); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "NonExistantMethod", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such method `NonExistantMethod'"); + g_error_free (error); + g_assert (value == NULL); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.example.FooXYZ.NonExistant", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_error_free (error); + g_assert (value == NULL); + + /* user properties */ + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.Get", + g_variant_new ("(ss)", + "org.example.Foo", + "PropertyUno"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("(v)"))); + g_variant_get (value, "(v)", &inner); + g_assert (g_variant_is_of_type (inner, G_VARIANT_TYPE_STRING)); + g_assert_cmpstr (g_variant_get_string (inner, NULL), ==, "Property `PropertyUno' Is What It Is!"); + g_variant_unref (value); + g_variant_unref (inner); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.Get", + g_variant_new ("(ss)", + "org.example.Foo", + "ThisDoesntExist"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert (value == NULL); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: No such property `ThisDoesntExist'"); + g_error_free (error); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.Get", + g_variant_new ("(ss)", + "org.example.Foo", + "NotReadable"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert (value == NULL); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Property `NotReadable' is not readable"); + g_error_free (error); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.Set", + g_variant_new ("(ssv)", + "org.example.Foo", + "NotReadable", + g_variant_new_string ("But Writable you are!")), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert (value == NULL); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_SPAWN_FILE_INVALID); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.Spawn.FileInvalid: Returning some error instead of writing the value `NotReadable' to the property `'But Writable you are!''"); + g_error_free (error); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.Set", + g_variant_new ("(ssv)", + "org.example.Foo", + "NotWritable", + g_variant_new_uint32 (42)), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert (value == NULL); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS); + g_assert_cmpstr (error->message, ==, "GDBus.Error:org.freedesktop.DBus.Error.InvalidArgs: Property `NotWritable' is not writable"); + g_error_free (error); + + error = NULL; + value = g_dbus_proxy_call_sync (foo_proxy, + "org.freedesktop.DBus.Properties.GetAll", + g_variant_new ("(s)", + "org.example.Foo"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE ("(a{sv})"))); + s = g_variant_print (value, TRUE); + g_assert_cmpstr (s, ==, "({'PropertyUno': <\"Property `PropertyUno' Is What It Is!\">, 'NotWritable': <\"Property `NotWritable' Is What It Is!\">},)"); + g_free (s); + g_variant_unref (value); + + g_object_unref (foo_proxy); + + g_main_loop_quit (loop); + return NULL; +} + +static void +test_dispatch (const gchar *object_path) +{ + GThread *thread; + + /* run this in a thread to avoid deadlocks */ + thread = g_thread_new ("test_dispatch", + test_dispatch_thread_func, + (gpointer) object_path); + g_main_loop_run (loop); + g_thread_join (thread); +} + +static void +test_object_registration (void) +{ + GError *error; + ObjectRegistrationData data; + GPtrArray *dyna_data; + gchar **nodes; + guint boss_foo_reg_id; + guint boss_bar_reg_id; + guint worker1_foo_reg_id; + guint worker1p1_foo_reg_id; + guint worker2_bar_reg_id; + guint intern1_foo_reg_id; + guint intern2_bar_reg_id; + guint intern2_foo_reg_id; + guint intern3_bar_reg_id; + guint registration_id; + guint subtree_registration_id; + guint non_subtree_object_path_foo_reg_id; + guint non_subtree_object_path_bar_reg_id; + guint dyna_subtree_registration_id; + guint num_successful_registrations; + + data.num_unregistered_calls = 0; + data.num_unregistered_subtree_calls = 0; + data.num_subtree_nodes = 0; + + num_successful_registrations = 0; + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss", + (GDBusInterfaceInfo *) &foo_interface_info, + &foo_vtable, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + boss_foo_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + boss_bar_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/worker1", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + worker1_foo_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/worker1p1", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + worker1p1_foo_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/worker2", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + worker2_bar_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern1", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + intern1_foo_reg_id = registration_id; + num_successful_registrations++; + + /* ... and try again at another path */ + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern2", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + intern2_bar_reg_id = registration_id; + num_successful_registrations++; + + /* register at the same path/interface - this should fail */ + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern2", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + error = NULL; + g_assert (registration_id == 0); + + /* register at different interface - shouldn't fail */ + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern2", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + intern2_foo_reg_id = registration_id; + num_successful_registrations++; + + /* unregister it via the id */ + g_assert (g_dbus_connection_unregister_object (c, registration_id)); + g_main_context_iteration (NULL, FALSE); + g_assert_cmpint (data.num_unregistered_calls, ==, 1); + intern2_foo_reg_id = 0; + + /* register it back */ + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern2", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + intern2_foo_reg_id = registration_id; + num_successful_registrations++; + + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/interns/intern3", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + intern3_bar_reg_id = registration_id; + num_successful_registrations++; + + /* now register a whole subtree at /foo/boss/executives */ + subtree_registration_id = g_dbus_connection_register_subtree (c, + "/foo/boss/executives", + &subtree_vtable, + G_DBUS_SUBTREE_FLAGS_NONE, + &data, + on_subtree_unregistered, + &error); + g_assert_no_error (error); + g_assert (subtree_registration_id > 0); + /* try registering it again.. this should fail */ + registration_id = g_dbus_connection_register_subtree (c, + "/foo/boss/executives", + &subtree_vtable, + G_DBUS_SUBTREE_FLAGS_NONE, + &data, + on_subtree_unregistered, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + error = NULL; + g_assert (registration_id == 0); + + /* unregister it, then register it again */ + g_assert_cmpint (data.num_unregistered_subtree_calls, ==, 0); + g_assert (g_dbus_connection_unregister_subtree (c, subtree_registration_id)); + g_main_context_iteration (NULL, FALSE); + g_assert_cmpint (data.num_unregistered_subtree_calls, ==, 1); + subtree_registration_id = g_dbus_connection_register_subtree (c, + "/foo/boss/executives", + &subtree_vtable, + G_DBUS_SUBTREE_FLAGS_NONE, + &data, + on_subtree_unregistered, + &error); + g_assert_no_error (error); + g_assert (subtree_registration_id > 0); + + /* try to register something under /foo/boss/executives - this should work + * because registered subtrees and registered objects can coexist. + * + * Make the exported object implement *two* interfaces so we can check + * that the right introspection handler is invoked. + */ + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/executives/non_subtree_object", + (GDBusInterfaceInfo *) &bar_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + non_subtree_object_path_bar_reg_id = registration_id; + num_successful_registrations++; + registration_id = g_dbus_connection_register_object (c, + "/foo/boss/executives/non_subtree_object", + (GDBusInterfaceInfo *) &foo_interface_info, + NULL, + &data, + on_object_unregistered, + &error); + g_assert_no_error (error); + g_assert (registration_id > 0); + non_subtree_object_path_foo_reg_id = registration_id; + num_successful_registrations++; + + /* now register a dynamic subtree, spawning objects as they are called */ + dyna_data = g_ptr_array_new (); + dyna_subtree_registration_id = g_dbus_connection_register_subtree (c, + "/foo/dyna", + &dynamic_subtree_vtable, + G_DBUS_SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES, + dyna_data, + (GDestroyNotify)g_ptr_array_unref, + &error); + g_assert_no_error (error); + g_assert (dyna_subtree_registration_id > 0); + + /* First assert that we have no nodes in the dynamic subtree */ + nodes = get_nodes_at (c, "/foo/dyna"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 0); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/foo/dyna"), ==, 4); + + /* Install three nodes in the dynamic subtree via the dyna_data backdoor and + * assert that they show up correctly in the introspection data */ + g_ptr_array_add (dyna_data, "lol"); + g_ptr_array_add (dyna_data, "cat"); + g_ptr_array_add (dyna_data, "cheezburger"); + nodes = get_nodes_at (c, "/foo/dyna"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 3); + g_assert_cmpstr (nodes[0], ==, "lol"); + g_assert_cmpstr (nodes[1], ==, "cat"); + g_assert_cmpstr (nodes[2], ==, "cheezburger"); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/foo/dyna/lol"), ==, 4); + g_assert_cmpint (count_interfaces (c, "/foo/dyna/cat"), ==, 4); + g_assert_cmpint (count_interfaces (c, "/foo/dyna/cheezburger"), ==, 4); + + /* Call a non-existing object path and assert that it has been created */ + dyna_create (c, "dynamicallycreated"); + nodes = get_nodes_at (c, "/foo/dyna"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 4); + g_assert_cmpstr (nodes[0], ==, "lol"); + g_assert_cmpstr (nodes[1], ==, "cat"); + g_assert_cmpstr (nodes[2], ==, "cheezburger"); + g_assert_cmpstr (nodes[3], ==, "dynamicallycreated"); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/foo/dyna/dynamicallycreated"), ==, 4); + + /* now check that the object hierarachy is properly generated... yes, it's a bit + * perverse that we round-trip to the bus to introspect ourselves ;-) + */ + nodes = get_nodes_at (c, "/"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 1); + g_assert_cmpstr (nodes[0], ==, "foo"); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/"), ==, 0); + + nodes = get_nodes_at (c, "/foo"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 2); + g_assert_cmpstr (nodes[0], ==, "boss"); + g_assert_cmpstr (nodes[1], ==, "dyna"); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/foo"), ==, 0); + + nodes = get_nodes_at (c, "/foo/boss"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 5); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "worker1")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "worker1p1")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "worker2")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "interns")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "executives")); + g_strfreev (nodes); + /* any registered object always implement org.freedesktop.DBus.[Peer,Introspectable,Properties] */ + g_assert_cmpint (count_interfaces (c, "/foo/boss"), ==, 5); + g_assert (has_interface (c, "/foo/boss", foo_interface_info.name)); + g_assert (has_interface (c, "/foo/boss", bar_interface_info.name)); + + /* check subtree nodes - we should have only non_subtree_object in /foo/boss/executives + * because data.num_subtree_nodes is 0 + */ + nodes = get_nodes_at (c, "/foo/boss/executives"); + g_assert (nodes != NULL); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "non_subtree_object")); + g_assert_cmpint (g_strv_length (nodes), ==, 1); + g_strfreev (nodes); + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives"), ==, 0); + + /* now change data.num_subtree_nodes and check */ + data.num_subtree_nodes = 2; + nodes = get_nodes_at (c, "/foo/boss/executives"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 5); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "non_subtree_object")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "vp0")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "vp1")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "evp0")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "evp1")); + /* check that /foo/boss/executives/non_subtree_object is not handled by the + * subtree handlers - we can do this because objects from subtree handlers + * has exactly one interface and non_subtree_object has two + */ + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives/non_subtree_object"), ==, 5); + g_assert (has_interface (c, "/foo/boss/executives/non_subtree_object", foo_interface_info.name)); + g_assert (has_interface (c, "/foo/boss/executives/non_subtree_object", bar_interface_info.name)); + /* check that the vp and evp objects are handled by the subtree handlers */ + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives/vp0"), ==, 4); + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives/vp1"), ==, 4); + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives/evp0"), ==, 4); + g_assert_cmpint (count_interfaces (c, "/foo/boss/executives/evp1"), ==, 4); + g_assert (has_interface (c, "/foo/boss/executives/vp0", foo_interface_info.name)); + g_assert (has_interface (c, "/foo/boss/executives/vp1", foo_interface_info.name)); + g_assert (has_interface (c, "/foo/boss/executives/evp0", bar_interface_info.name)); + g_assert (has_interface (c, "/foo/boss/executives/evp1", bar_interface_info.name)); + g_strfreev (nodes); + data.num_subtree_nodes = 3; + nodes = get_nodes_at (c, "/foo/boss/executives"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 7); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "non_subtree_object")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "vp0")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "vp1")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "vp2")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "evp0")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "evp1")); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "evp2")); + g_strfreev (nodes); + + /* This is to check that a bug (rather, class of bugs) in gdbusconnection.c's + * + * g_dbus_connection_list_registered_unlocked() + * + * where /foo/boss/worker1 reported a child '1', is now fixed. + */ + nodes = get_nodes_at (c, "/foo/boss/worker1"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 0); + g_strfreev (nodes); + + /* check that calls are properly dispatched to the functions in foo_vtable for objects + * implementing the org.example.Foo interface + * + * We do this for both a regular registered object (/foo/boss) and also for an object + * registered through the subtree mechanism. + */ + test_dispatch ("/foo/boss"); + test_dispatch ("/foo/boss/executives/vp0"); + + /* To prevent from exiting and attaching a D-Bus tool like D-Feet; uncomment: */ +#if 0 + g_debug ("Point D-feet or other tool at: %s", g_test_dbus_get_temporary_address()); + g_main_loop_run (loop); +#endif + + /* check that unregistering the subtree handler works */ + g_assert_cmpint (data.num_unregistered_subtree_calls, ==, 1); + g_assert (g_dbus_connection_unregister_subtree (c, subtree_registration_id)); + g_main_context_iteration (NULL, FALSE); + g_assert_cmpint (data.num_unregistered_subtree_calls, ==, 2); + nodes = get_nodes_at (c, "/foo/boss/executives"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 1); + g_assert (_g_strv_has_string ((const gchar* const *) nodes, "non_subtree_object")); + g_strfreev (nodes); + + g_assert (g_dbus_connection_unregister_object (c, boss_foo_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, boss_bar_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, worker1_foo_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, worker1p1_foo_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, worker2_bar_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, intern1_foo_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, intern2_bar_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, intern2_foo_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, intern3_bar_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, non_subtree_object_path_bar_reg_id)); + g_assert (g_dbus_connection_unregister_object (c, non_subtree_object_path_foo_reg_id)); + + g_main_context_iteration (NULL, FALSE); + g_assert_cmpint (data.num_unregistered_calls, ==, num_successful_registrations); + + /* check that we no longer export any objects - TODO: it looks like there's a bug in + * libdbus-1 here: libdbus still reports the '/foo' object; so disable the test for now + */ +#if 0 + nodes = get_nodes_at (c, "/"); + g_assert (nodes != NULL); + g_assert_cmpint (g_strv_length (nodes), ==, 0); + g_strfreev (nodes); +#endif + + g_object_unref (c); +} + +static const GDBusInterfaceInfo test_interface_info1 = +{ + -1, + "org.example.Foo", + (GDBusMethodInfo **) NULL, + (GDBusSignalInfo **) NULL, + (GDBusPropertyInfo **) NULL, + NULL, +}; + +static const GDBusInterfaceInfo test_interface_info2 = +{ + -1, + "org.freedesktop.DBus.Properties", + (GDBusMethodInfo **) NULL, + (GDBusSignalInfo **) NULL, + (GDBusPropertyInfo **) NULL, + NULL, +}; + +static void +check_interfaces (GDBusConnection *c, + const gchar *object_path, + const gchar **interfaces) +{ + GError *error; + GDBusProxy *proxy; + gchar *xml_data; + GDBusNodeInfo *node_info; + gint i, j; + + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + NULL, + g_dbus_connection_get_unique_name (c), + object_path, + "org.freedesktop.DBus.Introspectable", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + /* do this async to avoid libdbus-1 deadlocks */ + xml_data = NULL; + g_dbus_proxy_call (proxy, + "Introspect", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) introspect_callback, + &xml_data); + g_main_loop_run (loop); + g_assert (xml_data != NULL); + + node_info = g_dbus_node_info_new_for_xml (xml_data, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + + g_assert (node_info->interfaces != NULL); + for (i = 0; node_info->interfaces[i]; i++) ; +#if 0 + if (g_strv_length ((gchar**)interfaces) != i - 1) + { + g_print ("expected "); + for (i = 0; interfaces[i]; i++) + g_print ("%s ", interfaces[i]); + g_print ("\ngot "); + for (i = 0; node_info->interfaces[i]; i++) + g_print ("%s ", node_info->interfaces[i]->name); + g_print ("\n"); + } +#endif + g_assert_cmpint (g_strv_length ((gchar**)interfaces), ==, i - 1); + + for (i = 0; interfaces[i]; i++) + { + for (j = 0; node_info->interfaces[j]; j++) + { + if (strcmp (interfaces[i], node_info->interfaces[j]->name) == 0) + goto found; + } + + g_assert_not_reached (); + + found: ; + } + + g_object_unref (proxy); + g_free (xml_data); + g_dbus_node_info_unref (node_info); +} + +static void +test_registered_interfaces (void) +{ + GError *error; + guint id1, id2; + const gchar *interfaces[] = { + "org.example.Foo", + "org.freedesktop.DBus.Properties", + "org.freedesktop.DBus.Introspectable", + NULL, + }; + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + id1 = g_dbus_connection_register_object (c, + "/test", + (GDBusInterfaceInfo *) &test_interface_info1, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (id1 > 0); + id2 = g_dbus_connection_register_object (c, + "/test", + (GDBusInterfaceInfo *) &test_interface_info2, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert (id2 > 0); + + check_interfaces (c, "/test", interfaces); + + g_assert (g_dbus_connection_unregister_object (c, id1)); + g_assert (g_dbus_connection_unregister_object (c, id2)); + g_object_unref (c); +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + + g_test_add_func ("/gdbus/object-registration", test_object_registration); + g_test_add_func ("/gdbus/registered-interfaces", test_registered_interfaces); + + /* TODO: check that we spit out correct introspection data */ + /* TODO: check that registering a whole subtree works */ + + ret = g_test_run(); + + /* tear down bus */ + session_bus_down (); + + return ret; +} diff --git a/gio/tests/gdbus-introspection.c b/gio/tests/gdbus-introspection.c new file mode 100644 index 0000000..95d81ec --- /dev/null +++ b/gio/tests/gdbus-introspection.c @@ -0,0 +1,326 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test introspection parser */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_introspection (GDBusProxy *proxy) +{ + GError *error; + const gchar *xml_data; + GDBusNodeInfo *node_info; + GDBusInterfaceInfo *interface_info; + GDBusMethodInfo *method_info; + GDBusSignalInfo *signal_info; + GVariant *result; + + error = NULL; + + /* + * Invoke Introspect(), then parse the output. + */ + result = g_dbus_proxy_call_sync (proxy, + "org.freedesktop.DBus.Introspectable.Introspect", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(&s)", &xml_data); + + node_info = g_dbus_node_info_new_for_xml (xml_data, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + + /* for now we only check a couple of things. TODO: check more things */ + + interface_info = g_dbus_node_info_lookup_interface (node_info, "com.example.NonExistantInterface"); + g_assert (interface_info == NULL); + + interface_info = g_dbus_node_info_lookup_interface (node_info, "org.freedesktop.DBus.Introspectable"); + g_assert (interface_info != NULL); + method_info = g_dbus_interface_info_lookup_method (interface_info, "NonExistantMethod"); + g_assert (method_info == NULL); + method_info = g_dbus_interface_info_lookup_method (interface_info, "Introspect"); + g_assert (method_info != NULL); + g_assert (method_info->in_args != NULL); + g_assert (method_info->in_args[0] == NULL); + g_assert (method_info->out_args != NULL); + g_assert (method_info->out_args[0] != NULL); + g_assert (method_info->out_args[1] == NULL); + g_assert_cmpstr (method_info->out_args[0]->signature, ==, "s"); + + interface_info = g_dbus_node_info_lookup_interface (node_info, "com.example.Frob"); + g_assert (interface_info != NULL); + signal_info = g_dbus_interface_info_lookup_signal (interface_info, "TestSignal"); + g_assert (signal_info != NULL); + g_assert (signal_info->args != NULL); + g_assert (signal_info->args[0] != NULL); + g_assert_cmpstr (signal_info->args[0]->signature, ==, "s"); + g_assert (signal_info->args[1] != NULL); + g_assert_cmpstr (signal_info->args[1]->signature, ==, "o"); + g_assert (signal_info->args[2] != NULL); + g_assert_cmpstr (signal_info->args[2]->signature, ==, "v"); + g_assert (signal_info->args[3] == NULL); + + g_dbus_node_info_unref (node_info); + g_variant_unref (result); + + g_main_loop_quit (loop); +} + +static void +test_introspection_parser (void) +{ + GDBusProxy *proxy; + GDBusConnection *connection; + GError *error; + + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, + &error); + g_assert_no_error (error); + error = NULL; + proxy = g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + _g_assert_property_notify (proxy, "g-name-owner"); + + test_introspection (proxy); + + g_object_unref (proxy); + g_object_unref (connection); +} + +/* check that a parse-generate roundtrip produces identical results + */ +static void +test_generate (void) +{ + GDBusNodeInfo *info; + GDBusNodeInfo *info2; + GDBusInterfaceInfo *iinfo; + GDBusMethodInfo *minfo; + GDBusSignalInfo *sinfo; + GDBusArgInfo *arginfo; + GDBusPropertyInfo *pinfo; + GDBusAnnotationInfo *aninfo; + const gchar *data = + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "; + + GString *string; + GString *string2; + GError *error; + + error = NULL; + info = g_dbus_node_info_new_for_xml (data, &error); + g_assert_no_error (error); + + iinfo = g_dbus_node_info_lookup_interface (info, "com.example.Frob"); + aninfo = iinfo->annotations[0]; + g_assert_cmpstr (aninfo->key, ==, "foo"); + g_assert_cmpstr (aninfo->value, ==, "bar"); + g_assert (iinfo->annotations[1] == NULL); + minfo = g_dbus_interface_info_lookup_method (iinfo, "PairReturn"); + g_assert_cmpstr (g_dbus_annotation_info_lookup (minfo->annotations, "org.freedesktop.DBus.GLib.Async"), ==, ""); + arginfo = minfo->in_args[0]; + g_assert_cmpstr (arginfo->name, ==, "somenumber"); + g_assert_cmpstr (arginfo->signature, ==, "u"); + g_assert (minfo->in_args[1] == NULL); + arginfo = minfo->out_args[0]; + g_assert_cmpstr (arginfo->name, ==, "somestring"); + g_assert_cmpstr (arginfo->signature, ==, "s"); + g_assert (minfo->out_args[1] == NULL); + sinfo = g_dbus_interface_info_lookup_signal (iinfo, "HelloWorld"); + arginfo = sinfo->args[0]; + g_assert_cmpstr (arginfo->name, ==, "greeting"); + g_assert_cmpstr (arginfo->signature, ==, "s"); + g_assert (sinfo->args[1] == NULL); + pinfo = g_dbus_interface_info_lookup_property (iinfo, "y"); + g_assert_cmpstr (pinfo->signature, ==, "y"); + g_assert_cmpint (pinfo->flags, ==, G_DBUS_PROPERTY_INFO_FLAGS_READABLE | + G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE); + + string = g_string_new (""); + g_dbus_node_info_generate_xml (info, 2, string); + + info2 = g_dbus_node_info_new_for_xml (string->str, &error); + string2 = g_string_new (""); + g_dbus_node_info_generate_xml (info2, 2, string2); + + g_assert_cmpstr (string->str, ==, string2->str); + g_string_free (string, TRUE); + g_string_free (string2, TRUE); + + g_dbus_node_info_unref (info); + g_dbus_node_info_unref (info2); +} + +/* test that omitted direction attributes default to 'out' for signals, + * and 'in' for methods. + */ +static void +test_default_direction (void) +{ + GDBusNodeInfo *info; + GDBusInterfaceInfo *iinfo; + GDBusMethodInfo *minfo; + GDBusSignalInfo *sinfo; + GDBusArgInfo *arginfo; + const gchar *data = + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "; + + GError *error; + + error = NULL; + info = g_dbus_node_info_new_for_xml (data, &error); + g_assert_no_error (error); + + iinfo = g_dbus_node_info_lookup_interface (info, "com.example.Frob"); + sinfo = g_dbus_interface_info_lookup_signal (iinfo, "HelloWorld"); + g_assert (sinfo->args != NULL); + arginfo = sinfo->args[0]; + g_assert_cmpstr (arginfo->name, ==, "greeting"); + g_assert (sinfo->args[1] == NULL); + minfo = g_dbus_interface_info_lookup_method (iinfo, "Sleep"); + g_assert (minfo->in_args != NULL); + arginfo = minfo->in_args[0]; + g_assert_cmpstr (arginfo->name, ==, "timeout"); + g_assert (minfo->in_args[1] == NULL); + + g_dbus_node_info_unref (info); +} + +#if 0 +/* XXX: need to figure out how generous we want to be here */ +/* test that extraneous attributes are ignored + */ +static void +test_extra_data (void) +{ + GDBusNodeInfo *info; + const gchar *data = + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "; + GError *error; + + error = NULL; + info = g_dbus_node_info_new_for_xml (data, &error); + g_assert_no_error (error); + + g_dbus_node_info_unref (info); +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + + g_test_add_func ("/gdbus/introspection-parser", test_introspection_parser); + g_test_add_func ("/gdbus/introspection-generate", test_generate); + g_test_add_func ("/gdbus/introspection-default-direction", test_default_direction); +#if 0 + /* XXX: need to figure out how generous we want to be here */ + g_test_add_func ("/gdbus/introspection-extra-data", test_extra_data); +#endif + + ret = g_test_run (); + + session_bus_down (); + + return ret; +} diff --git a/gio/tests/gdbus-message.c b/gio/tests/gdbus-message.c new file mode 100644 index 0000000..36ffc41 --- /dev/null +++ b/gio/tests/gdbus-message.c @@ -0,0 +1,158 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_notify_locked (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + gint *count = user_data; + *count += 1; +} + +static void +message_lock (void) +{ + GDBusMessage *m; + gint count; + + count = 0; + m = g_dbus_message_new (); + g_signal_connect (m, + "notify::locked", + G_CALLBACK (on_notify_locked), + &count); + g_assert (!g_dbus_message_get_locked (m)); + g_dbus_message_lock (m); + g_assert (g_dbus_message_get_locked (m)); + g_assert_cmpint (count, ==, 1); + g_dbus_message_lock (m); + g_assert (g_dbus_message_get_locked (m)); + g_assert_cmpint (count, ==, 1); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_serial (m, 42); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_byte_order (m, G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_message_type (m, G_DBUS_MESSAGE_TYPE_METHOD_CALL); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_flags (m, G_DBUS_MESSAGE_FLAGS_NONE); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_body (m, NULL); + g_test_assert_expected_messages (); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*Attempted to modify a locked message*"); + g_dbus_message_set_header (m, 0, NULL); + g_test_assert_expected_messages (); + + g_object_unref (m); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +message_copy (void) +{ + GDBusMessage *m; + GDBusMessage *copy; + GError *error; + guchar *m_headers; + guchar *copy_headers; + guint n; + + m = g_dbus_message_new_method_call ("org.example.Name", + "/org/example/Object", + "org.example.Interface", + "Method"); + g_dbus_message_set_serial (m, 42); + g_dbus_message_set_byte_order (m, G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN); + + error = NULL; + copy = g_dbus_message_copy (m, &error); + g_assert_no_error (error); + g_assert (G_IS_DBUS_MESSAGE (copy)); + g_assert (m != copy); + g_assert_cmpint (G_OBJECT (m)->ref_count, ==, 1); + g_assert_cmpint (G_OBJECT (copy)->ref_count, ==, 1); + + g_assert_cmpint (g_dbus_message_get_serial (copy), ==, g_dbus_message_get_serial (m)); + g_assert_cmpint (g_dbus_message_get_byte_order (copy), ==, g_dbus_message_get_byte_order (m)); + g_assert_cmpint (g_dbus_message_get_flags (copy), ==, g_dbus_message_get_flags (m)); + g_assert_cmpint (g_dbus_message_get_message_type (copy), ==, g_dbus_message_get_message_type (m)); + m_headers = g_dbus_message_get_header_fields (m); + copy_headers = g_dbus_message_get_header_fields (copy); + g_assert (m_headers != NULL); + g_assert (copy_headers != NULL); + for (n = 0; m_headers[n] != 0; n++) + { + GVariant *m_val; + GVariant *copy_val; + m_val = g_dbus_message_get_header (m, m_headers[n]); + copy_val = g_dbus_message_get_header (m, m_headers[n]); + g_assert (m_val != NULL); + g_assert (copy_val != NULL); + g_assert (g_variant_equal (m_val, copy_val)); + } + g_assert_cmpint (n, >, 0); /* make sure we actually compared headers etc. */ + g_assert_cmpint (copy_headers[n], ==, 0); + g_free (m_headers); + g_free (copy_headers); + + g_object_unref (copy); + g_object_unref (m); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + setlocale (LC_ALL, "C"); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gdbus/message/lock", message_lock); + g_test_add_func ("/gdbus/message/copy", message_copy); + return g_test_run(); +} + diff --git a/gio/tests/gdbus-names.c b/gio/tests/gdbus-names.c new file mode 100644 index 0000000..b478c6f --- /dev/null +++ b/gio/tests/gdbus-names.c @@ -0,0 +1,787 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that g_bus_own_name() works correctly */ +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMainLoop *loop; + gboolean expect_null_connection; + guint num_bus_acquired; + guint num_acquired; + guint num_lost; + guint num_free_func; +} OwnNameData; + +static void +own_name_data_free_func (OwnNameData *data) +{ + data->num_free_func++; + g_main_loop_quit (loop); +} + +static void +bus_acquired_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + g_dbus_connection_set_exit_on_close (connection, FALSE); + data->num_bus_acquired += 1; + g_main_loop_quit (loop); +} + +static void +name_acquired_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + data->num_acquired += 1; + g_main_loop_quit (loop); +} + +static void +name_lost_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + OwnNameData *data = user_data; + if (data->expect_null_connection) + { + g_assert (connection == NULL); + } + else + { + g_assert (connection != NULL); + g_dbus_connection_set_exit_on_close (connection, FALSE); + } + data->num_lost += 1; + g_main_loop_quit (loop); +} + +static void +test_bus_own_name (void) +{ + guint id; + guint id2; + OwnNameData data; + OwnNameData data2; + const gchar *name; + GDBusConnection *c; + GError *error; + gboolean name_has_owner_reply; + GDBusConnection *c2; + GVariant *result; + + error = NULL; + name = "org.gtk.GDBus.Name1"; + + /* + * First check that name_lost_handler() is invoked if there is no bus. + * + * Also make sure name_lost_handler() isn't invoked when unowning the name. + */ + data.num_bus_acquired = 0; + data.num_free_func = 0; + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = TRUE; + id = g_bus_own_name (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_handler, + name_acquired_handler, + name_lost_handler, + &data, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data.num_bus_acquired, ==, 0); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 0); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 1); + g_bus_unown_name (id); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 1); + g_assert_cmpint (data.num_free_func, ==, 1); + + /* + * Bring up a bus, then own a name and check bus_acquired_handler() then name_acquired_handler() is invoked. + */ + session_bus_up (); + data.num_bus_acquired = 0; + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = FALSE; + id = g_bus_own_name (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_handler, + name_acquired_handler, + name_lost_handler, + &data, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data.num_bus_acquired, ==, 0); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + + /* + * Check that the name was actually acquired. + */ + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c != NULL); + g_assert (!g_dbus_connection_is_closed (c)); + result = g_dbus_connection_call_sync (c, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "NameHasOwner", /* method name */ + g_variant_new ("(s)", name), + G_VARIANT_TYPE ("(b)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(b)", &name_has_owner_reply); + g_assert (name_has_owner_reply); + g_variant_unref (result); + + /* + * Stop owning the name - this should invoke our free func + */ + g_bus_unown_name (id); + g_assert_cmpint (data.num_free_func, ==, 2); + + /* + * Check that the name was actually released. + */ + result = g_dbus_connection_call_sync (c, + "org.freedesktop.DBus", /* bus name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "NameHasOwner", /* method name */ + g_variant_new ("(s)", name), + G_VARIANT_TYPE ("(b)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(b)", &name_has_owner_reply); + g_assert (!name_has_owner_reply); + g_variant_unref (result); + + /* Now try owning the name and then immediately decide to unown the name */ + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + g_assert_cmpint (data.num_free_func, ==, 2); + id = g_bus_own_name (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_handler, + name_acquired_handler, + name_lost_handler, + &data, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + g_assert_cmpint (data.num_free_func, ==, 2); + g_bus_unown_name (id); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + g_assert_cmpint (data.num_free_func, ==, 2); + g_main_loop_run (loop); /* the GDestroyNotify is called in idle because the bus is acquired in idle */ + g_assert_cmpint (data.num_free_func, ==, 3); + + /* + * Own the name again. + */ + data.num_bus_acquired = 0; + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = FALSE; + id = g_bus_own_name_with_closures (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + g_cclosure_new (G_CALLBACK (bus_acquired_handler), + &data, + NULL), + g_cclosure_new (G_CALLBACK (name_acquired_handler), + &data, + NULL), + g_cclosure_new (G_CALLBACK (name_lost_handler), + &data, + (GClosureNotify) own_name_data_free_func)); + g_assert_cmpint (data.num_bus_acquired, ==, 0); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + + /* + * Try owning the name with another object on the same connection - this should + * fail because we already own the name. + */ + data2.num_free_func = 0; + data2.num_bus_acquired = 0; + data2.num_acquired = 0; + data2.num_lost = 0; + data2.expect_null_connection = FALSE; + id2 = g_bus_own_name (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_handler, + name_acquired_handler, + name_lost_handler, + &data2, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data2.num_bus_acquired, ==, 1); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data2.num_bus_acquired, ==, 1); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_bus_unown_name (id2); + g_assert_cmpint (data2.num_bus_acquired, ==, 1); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_assert_cmpint (data2.num_free_func, ==, 1); + + /* + * Create a secondary (e.g. private) connection and try owning the name on that + * connection. This should fail both with and without _REPLACE because we + * didn't specify ALLOW_REPLACEMENT. + */ + c2 = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (c2 != NULL); + g_assert (!g_dbus_connection_is_closed (c2)); + /* first without _REPLACE */ + data2.num_bus_acquired = 0; + data2.num_acquired = 0; + data2.num_lost = 0; + data2.expect_null_connection = FALSE; + data2.num_free_func = 0; + id2 = g_bus_own_name_on_connection (c2, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + name_acquired_handler, + name_lost_handler, + &data2, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_bus_unown_name (id2); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_assert_cmpint (data2.num_free_func, ==, 1); + /* then with _REPLACE */ + data2.num_bus_acquired = 0; + data2.num_acquired = 0; + data2.num_lost = 0; + data2.expect_null_connection = FALSE; + data2.num_free_func = 0; + id2 = g_bus_own_name_on_connection (c2, + name, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + name_acquired_handler, + name_lost_handler, + &data2, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_bus_unown_name (id2); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_assert_cmpint (data2.num_free_func, ==, 1); + + /* + * Stop owning the name and grab it again with _ALLOW_REPLACEMENT. + */ + data.expect_null_connection = FALSE; + g_bus_unown_name (id); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_free_func, ==, 4); + /* grab it again */ + data.num_bus_acquired = 0; + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = FALSE; + id = g_bus_own_name (G_BUS_TYPE_SESSION, + name, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT, + bus_acquired_handler, + name_acquired_handler, + name_lost_handler, + &data, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data.num_bus_acquired, ==, 0); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 0); + g_assert_cmpint (data.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_bus_acquired, ==, 1); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + + /* + * Now try to grab the name from the secondary connection. + * + */ + /* first without _REPLACE - this won't make us acquire the name */ + data2.num_bus_acquired = 0; + data2.num_acquired = 0; + data2.num_lost = 0; + data2.expect_null_connection = FALSE; + data2.num_free_func = 0; + id2 = g_bus_own_name_on_connection (c2, + name, + G_BUS_NAME_OWNER_FLAGS_NONE, + name_acquired_handler, + name_lost_handler, + &data2, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_bus_unown_name (id2); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 1); + g_assert_cmpint (data2.num_free_func, ==, 1); + /* then with _REPLACE - here we should acquire the name - e.g. owner should lose it + * and owner2 should acquire it */ + data2.num_bus_acquired = 0; + data2.num_acquired = 0; + data2.num_lost = 0; + data2.expect_null_connection = FALSE; + data2.num_free_func = 0; + id2 = g_bus_own_name_on_connection (c2, + name, + G_BUS_NAME_OWNER_FLAGS_REPLACE, + name_acquired_handler, + name_lost_handler, + &data2, + (GDestroyNotify) own_name_data_free_func); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + g_assert_cmpint (data2.num_acquired, ==, 0); + g_assert_cmpint (data2.num_lost, ==, 0); + /* wait for handlers for both owner and owner2 to fire */ + while (data.num_lost == 0 || data2.num_acquired == 0) + g_main_loop_run (loop); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 1); + g_assert_cmpint (data2.num_acquired, ==, 1); + g_assert_cmpint (data2.num_lost, ==, 0); + g_assert_cmpint (data2.num_bus_acquired, ==, 0); + /* ok, make owner2 release the name - then wait for owner to automagically reacquire it */ + g_bus_unown_name (id2); + g_assert_cmpint (data2.num_free_func, ==, 1); + g_main_loop_run (loop); + g_assert_cmpint (data.num_acquired, ==, 2); + g_assert_cmpint (data.num_lost, ==, 1); + + /* + * Finally, nuke the bus and check name_lost_handler() is invoked. + * + */ + data.expect_null_connection = TRUE; + session_bus_stop (); + while (data.num_lost != 2) + g_main_loop_run (loop); + g_assert_cmpint (data.num_acquired, ==, 2); + g_assert_cmpint (data.num_lost, ==, 2); + g_bus_unown_name (id); + g_assert_cmpint (data.num_free_func, ==, 5); + + g_object_unref (c); + g_object_unref (c2); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that g_bus_watch_name() works correctly */ +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + gboolean expect_null_connection; + guint num_acquired; + guint num_lost; + guint num_appeared; + guint num_vanished; + guint num_free_func; +} WatchNameData; + +static void +watch_name_data_free_func (WatchNameData *data) +{ + data->num_free_func++; + g_main_loop_quit (loop); +} + +static void +w_bus_acquired_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +w_name_acquired_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + WatchNameData *data = user_data; + data->num_acquired += 1; + g_main_loop_quit (loop); +} + +static void +w_name_lost_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + WatchNameData *data = user_data; + data->num_lost += 1; + g_main_loop_quit (loop); +} + +static void +name_appeared_handler (GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + WatchNameData *data = user_data; + if (data->expect_null_connection) + { + g_assert (connection == NULL); + } + else + { + g_assert (connection != NULL); + g_dbus_connection_set_exit_on_close (connection, FALSE); + } + data->num_appeared += 1; + g_main_loop_quit (loop); +} + +static void +name_vanished_handler (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + WatchNameData *data = user_data; + if (data->expect_null_connection) + { + g_assert (connection == NULL); + } + else + { + g_assert (connection != NULL); + g_dbus_connection_set_exit_on_close (connection, FALSE); + } + data->num_vanished += 1; + g_main_loop_quit (loop); +} + +static void +test_bus_watch_name (void) +{ + WatchNameData data; + guint id; + guint owner_id; + GDBusConnection *connection; + + /* + * First check that name_vanished_handler() is invoked if there is no bus. + * + * Also make sure name_vanished_handler() isn't invoked when unwatching the name. + */ + data.num_free_func = 0; + data.num_appeared = 0; + data.num_vanished = 0; + data.expect_null_connection = TRUE; + id = g_bus_watch_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Name1", + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_handler, + name_vanished_handler, + &data, + (GDestroyNotify) watch_name_data_free_func); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 1); + g_bus_unwatch_name (id); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 1); + g_assert_cmpint (data.num_free_func, ==, 1); + + /* + * Now bring up a bus, own a name, and then start watching it. + */ + session_bus_up (); + /* own the name */ + data.num_free_func = 0; + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = FALSE; + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Name1", + G_BUS_NAME_OWNER_FLAGS_NONE, + w_bus_acquired_handler, + w_name_acquired_handler, + w_name_lost_handler, + &data, + (GDestroyNotify) watch_name_data_free_func); + g_main_loop_run (loop); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + g_assert (connection != NULL); + + /* now watch the name */ + data.num_appeared = 0; + data.num_vanished = 0; + id = g_bus_watch_name_on_connection (connection, + "org.gtk.GDBus.Name1", + G_BUS_NAME_WATCHER_FLAGS_NONE, + name_appeared_handler, + name_vanished_handler, + &data, + (GDestroyNotify) watch_name_data_free_func); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_appeared, ==, 1); + g_assert_cmpint (data.num_vanished, ==, 0); + + /* + * Unwatch the name. + */ + g_bus_unwatch_name (id); + g_assert_cmpint (data.num_free_func, ==, 1); + + g_object_unref (connection); + + /* unown the name */ + g_bus_unown_name (owner_id); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_free_func, ==, 2); + + /* + * Create a watcher and then make a name be owned. + * + * This should trigger name_appeared_handler() ... + */ + /* watch the name */ + data.num_appeared = 0; + data.num_vanished = 0; + data.num_free_func = 0; + id = g_bus_watch_name_with_closures (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Name1", + G_BUS_NAME_WATCHER_FLAGS_NONE, + g_cclosure_new (G_CALLBACK (name_appeared_handler), + &data, + NULL), + g_cclosure_new (G_CALLBACK (name_vanished_handler), + &data, + (GClosureNotify) watch_name_data_free_func)); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 0); + g_main_loop_run (loop); + g_assert_cmpint (data.num_appeared, ==, 0); + g_assert_cmpint (data.num_vanished, ==, 1); + + /* own the name */ + data.num_acquired = 0; + data.num_lost = 0; + data.expect_null_connection = FALSE; + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Name1", + G_BUS_NAME_OWNER_FLAGS_NONE, + w_bus_acquired_handler, + w_name_acquired_handler, + w_name_lost_handler, + &data, + (GDestroyNotify) watch_name_data_free_func); + while (data.num_acquired == 0 || data.num_appeared == 0) + g_main_loop_run (loop); + g_assert_cmpint (data.num_acquired, ==, 1); + g_assert_cmpint (data.num_lost, ==, 0); + g_assert_cmpint (data.num_appeared, ==, 1); + g_assert_cmpint (data.num_vanished, ==, 1); + + /* + * Nuke the bus and check that the name vanishes and is lost. + */ + data.expect_null_connection = TRUE; + session_bus_stop (); + g_main_loop_run (loop); + g_assert_cmpint (data.num_lost, ==, 1); + g_assert_cmpint (data.num_vanished, ==, 2); + + g_bus_unwatch_name (id); + g_assert_cmpint (data.num_free_func, ==, 1); + + g_bus_unown_name (owner_id); + g_assert_cmpint (data.num_free_func, ==, 2); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_validate_names (void) +{ + guint n; + static const struct + { + gboolean name; + gboolean unique; + gboolean interface; + const gchar *string; + } names[] = { + { 1, 0, 1, "valid.well_known.name"}, + { 1, 0, 0, "valid.well-known.name"}, + { 1, 1, 0, ":valid.unique.name"}, + { 0, 0, 0, "invalid.5well_known.name"}, + { 0, 0, 0, "4invalid.5well_known.name"}, + { 1, 1, 0, ":4valid.5unique.name"}, + { 0, 0, 0, ""}, + { 1, 0, 1, "very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.name1"}, /* 255 */ + { 0, 0, 0, "very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.very.long.name12"}, /* 256 - too long! */ + { 0, 0, 0, ".starts.with.a.dot"}, + { 0, 0, 0, "contains.invalid;.characters"}, + { 0, 0, 0, "contains.inva/lid.characters"}, + { 0, 0, 0, "contains.inva[lid.characters"}, + { 0, 0, 0, "contains.inva]lid.characters"}, + { 0, 0, 0, "contains.inva_æøå_lid.characters"}, + { 1, 1, 0, ":1.1"}, + }; + + for (n = 0; n < G_N_ELEMENTS (names); n++) + { + if (names[n].name) + g_assert (g_dbus_is_name (names[n].string)); + else + g_assert (!g_dbus_is_name (names[n].string)); + + if (names[n].unique) + g_assert (g_dbus_is_unique_name (names[n].string)); + else + g_assert (!g_dbus_is_unique_name (names[n].string)); + + if (names[n].interface) + g_assert (g_dbus_is_interface_name (names[n].string)); + else + g_assert (!g_dbus_is_interface_name (names[n].string)); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + loop = g_main_loop_new (NULL, FALSE); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/validate-names", test_validate_names); + g_test_add_func ("/gdbus/bus-own-name", test_bus_own_name); + g_test_add_func ("/gdbus/bus-watch-name", test_bus_watch_name); + + ret = g_test_run(); + + g_main_loop_unref (loop); + + return ret; +} diff --git a/gio/tests/gdbus-non-socket.c b/gio/tests/gdbus-non-socket.c new file mode 100644 index 0000000..77c814d --- /dev/null +++ b/gio/tests/gdbus-non-socket.c @@ -0,0 +1,301 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include + +#ifdef G_OS_UNIX +#include +#include +#include +#endif + +#include "gdbus-tests.h" + +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +#ifdef G_OS_UNIX + +#include "test-pipe-unix.h" +#include "test-io-stream.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static const GDBusArgInfo pokee_method_poke_out_arg0 = { + -1, /* ref_count */ + "result", + "s", + NULL /* annotations */ +}; + +static const GDBusArgInfo *pokee_method_poke_out_args[2] = { + &pokee_method_poke_out_arg0, + NULL, +}; + +static const GDBusArgInfo pokee_method_poke_in_arg0 = { + -1, /* ref_count */ + "value", + "s", + NULL /* annotations */ +}; + +static const GDBusArgInfo *pokee_method_poke_in_args[2] = { + &pokee_method_poke_in_arg0, + NULL, +}; + +static const GDBusMethodInfo pokee_method_poke = { + -1, /* ref_count */ + "Poke", + (GDBusArgInfo**) pokee_method_poke_in_args, + (GDBusArgInfo**) pokee_method_poke_out_args, + NULL /* annotations */ +}; + +static const GDBusMethodInfo *pokee_methods[2] = { + &pokee_method_poke, + NULL +}; + +static const GDBusInterfaceInfo pokee_object_info = { + -1, /* ref_count */ + "org.gtk.GDBus.Pokee", + (GDBusMethodInfo**) pokee_methods, + NULL, /* signals */ + NULL, /* properties */ + NULL /* annotations */ +}; + +static void +pokee_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *str; + gchar *ret; + + g_assert_cmpstr (method_name, ==, "Poke"); + + g_variant_get (parameters, "(&s)", &str); + ret = g_strdup_printf ("You poked me with: `%s'", str); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", ret)); + g_free (ret); +} + +static const GDBusInterfaceVTable pokee_vtable = { + pokee_method_call, + NULL, /* get_property */ + NULL /* set_property */ +}; + +/* Processes: + * + * parent + * \- first child (via fork()) is the pokee + * \- second child (via g_test_trap_fork()) is the poker + * + * The second child only exists to avoid sharing a main context between several + * second-children if we run a test resembling this one multiple times. + * See https://bugzilla.gnome.org/show_bug.cgi?id=658999 for why that's bad. + */ +static void +test_non_socket (void) +{ + GIOStream *streams[2]; + GDBusConnection *connection; + GError *error; + gchar *guid; + pid_t first_child; + GVariant *ret; + const gchar *str; + gboolean ok; + + error = NULL; + + ok = test_bidi_pipe (&streams[0], &streams[1], &error); + g_assert_no_error (error); + g_assert (ok); + g_assert (G_IS_IO_STREAM (streams[0])); + g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[0]))); + g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[0]))); + g_assert (G_IS_IO_STREAM (streams[1])); + g_assert (G_IS_INPUT_STREAM (g_io_stream_get_input_stream (streams[1]))); + g_assert (G_IS_OUTPUT_STREAM (g_io_stream_get_output_stream (streams[1]))); + + switch ((first_child = fork ())) + { + case -1: + g_assert_not_reached (); + break; + + case 0: + /* first child */ + + /* we shouldn't do this in the parent, because we shouldn't use a + * GMainContext both before and after fork + */ + loop = g_main_loop_new (NULL, FALSE); + + ok = g_io_stream_close (streams[1], NULL, &error); + g_assert_no_error (error); + g_assert (ok); + g_object_unref (streams[1]); + + guid = g_dbus_generate_guid (); + error = NULL; + /* We need to delay message processing to avoid the race + * described in + * + * https://bugzilla.gnome.org/show_bug.cgi?id=627188 + * + * This is because (early) dispatching is done on the IO thread + * (method_call() isn't called until we're in the right thread + * though) so in rare cases the parent sends the message before + * we (the first child) register the object + */ + connection = g_dbus_connection_new_sync (streams[0], + guid, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER | + G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, + NULL, /* GDBusAuthObserver */ + NULL, + &error); + g_free (guid); + g_assert_no_error (error); + g_object_unref (streams[0]); + + /* make sure we exit along with the parent */ + g_dbus_connection_set_exit_on_close (connection, TRUE); + + error = NULL; + g_dbus_connection_register_object (connection, + "/pokee", + (GDBusInterfaceInfo *) &pokee_object_info, + &pokee_vtable, + NULL, /* user_data */ + NULL, /* user_data_free_func */ + &error); + g_assert_no_error (error); + + /* and now start message processing */ + g_dbus_connection_start_message_processing (connection); + + g_main_loop_run (loop); + + g_assert_not_reached (); + break; + + default: + /* parent continues below */ + break; + } + + if (!g_test_trap_fork (0, 0)) + { + /* parent */ + g_object_unref (streams[0]); + g_object_unref (streams[1]); + + g_test_trap_assert_passed (); + g_assert_cmpint (kill (first_child, SIGTERM), ==, 0); + return; + } + + /* second child */ + + /* we shouldn't do this in the parent, because we shouldn't use a + * GMainContext both before and after fork + */ + loop = g_main_loop_new (NULL, FALSE); + + ok = g_io_stream_close (streams[0], NULL, &error); + g_assert_no_error (error); + g_assert (ok); + g_object_unref (streams[0]); + + connection = g_dbus_connection_new_sync (streams[1], + NULL, /* guid */ + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, + &error); + g_assert_no_error (error); + g_object_unref (streams[1]); + + /* poke the first child */ + error = NULL; + ret = g_dbus_connection_call_sync (connection, + NULL, /* name */ + "/pokee", + "org.gtk.GDBus.Pokee", + "Poke", + g_variant_new ("(s)", "I am the POKER!"), + G_VARIANT_TYPE ("(s)"), /* return type */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_variant_get (ret, "(&s)", &str); + g_assert_cmpstr (str, ==, "You poked me with: `I am the POKER!'"); + g_variant_unref (ret); + + g_object_unref (connection); + g_main_loop_unref (loop); + exit (0); +} + +#else /* G_OS_UNIX */ + +static void +test_non_socket (void) +{ + /* TODO: test this with e.g. GWin32InputStream/GWin32OutputStream */ +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gdbus/non-socket", test_non_socket); + + ret = g_test_run(); + + return ret; +} diff --git a/gio/tests/gdbus-object-manager-example/Makefile.am b/gio/tests/gdbus-object-manager-example/Makefile.am new file mode 100644 index 0000000..6875210 --- /dev/null +++ b/gio/tests/gdbus-object-manager-example/Makefile.am @@ -0,0 +1,50 @@ +NULL = +BUILT_SOURCES = +CLEANFILES = + +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + -g \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -I$(top_builddir)/gio \ + -I$(top_srcdir)/gio \ + -DSRCDIR=\""$(srcdir)"\" + +# ------------------------------------------------------------------------ + +GDBUS_GENERATED = \ + gdbus-example-objectmanager-generated.h \ + gdbus-example-objectmanager-generated.c \ + gdbus-example-objectmanager-generated-org.gtk.GDBus.Example.ObjectManager.Animal.xml \ + gdbus-example-objectmanager-generated-org.gtk.GDBus.Example.ObjectManager.Cat.xml \ + $(NULL) + +$(GDBUS_GENERATED) : gdbus-example-objectmanager.xml Makefile $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen + $(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) \ + UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) \ + $(PYTHON) $(top_builddir)/gio/gdbus-2.0/codegen/gdbus-codegen \ + --interface-prefix org.gtk.GDBus.Example.ObjectManager. \ + --c-namespace Example \ + --c-generate-object-manager \ + --generate-c-code gdbus-example-objectmanager-generated \ + --generate-docbook gdbus-example-objectmanager-generated \ + $< \ + $(NULL) + +BUILT_SOURCES += $(GDBUS_GENERATED) + +noinst_LTLIBRARIES = libgdbus-example-objectmanager.la +libgdbus_example_objectmanager_la_SOURCES = gdbus-example-objectmanager-generated.h gdbus-example-objectmanager-generated.c +libgdbus_example_objectmanager_la_LIBADD = \ + $(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_DIST += gdbus-example-objectmanager.xml + +CLEANFILES += $(GDBUS_GENERATED) + diff --git a/gio/tests/gdbus-object-manager-example/gdbus-example-objectmanager.xml b/gio/tests/gdbus-object-manager-example/gdbus-example-objectmanager.xml new file mode 100644 index 0000000..472b257 --- /dev/null +++ b/gio/tests/gdbus-object-manager-example/gdbus-example-objectmanager.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gio/tests/gdbus-peer-object-manager.c b/gio/tests/gdbus-peer-object-manager.c new file mode 100644 index 0000000..7a19c71 --- /dev/null +++ b/gio/tests/gdbus-peer-object-manager.c @@ -0,0 +1,365 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2012 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: Stef Walter + */ + +#include "config.h" + +#include + +#include + +#include +#include +#include + +typedef struct { + GDBusInterfaceSkeleton parent; + gint number; +} MockInterface; + +typedef struct { + GDBusInterfaceSkeletonClass parent_class; +} MockInterfaceClass; + +static GType mock_interface_get_type (void); +G_DEFINE_TYPE (MockInterface, mock_interface, G_TYPE_DBUS_INTERFACE_SKELETON); + +static void +mock_interface_init (MockInterface *self) +{ + +} + +static GDBusInterfaceInfo * +mock_interface_get_info (GDBusInterfaceSkeleton *skeleton) +{ + static GDBusPropertyInfo path_info = { + -1, + "Path", + "o", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL, + }; + + static GDBusPropertyInfo number_info = { + -1, + "Number", + "i", + G_DBUS_PROPERTY_INFO_FLAGS_READABLE, + NULL, + }; + + static GDBusPropertyInfo *property_info[] = { + &path_info, + &number_info, + NULL + }; + + static GDBusInterfaceInfo interface_info = { + -1, + (gchar *) "org.mock.Interface", + NULL, + NULL, + (GDBusPropertyInfo **) &property_info, + NULL + }; + + return &interface_info; +} + +static GVariant * +mock_interface_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + MockInterface *self = user_data; + if (g_str_equal (property_name, "Path")) + return g_variant_new_object_path (object_path); + else if (g_str_equal (property_name, "Number")) + return g_variant_new_int32 (self->number); + else + return NULL; +} + +static GDBusInterfaceVTable * +mock_interface_get_vtable (GDBusInterfaceSkeleton *interface) +{ + static GDBusInterfaceVTable vtable = { + NULL, + mock_interface_get_property, + NULL, + }; + + return &vtable; +} + +static GVariant * +mock_interface_get_properties (GDBusInterfaceSkeleton *interface) +{ + GVariantBuilder builder; + GDBusInterfaceInfo *info; + GDBusInterfaceVTable *vtable; + guint n; + + /* Groan, this is completely generic code and should be in gdbus */ + + info = g_dbus_interface_skeleton_get_info (interface); + vtable = g_dbus_interface_skeleton_get_vtable (interface); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + for (n = 0; info->properties[n] != NULL; n++) + { + if (info->properties[n]->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE) + { + GVariant *value; + g_return_val_if_fail (vtable->get_property != NULL, NULL); + value = (vtable->get_property) (g_dbus_interface_skeleton_get_connection (interface), NULL, + g_dbus_interface_skeleton_get_object_path (interface), + info->name, info->properties[n]->name, + NULL, interface); + if (value != NULL) + { + g_variant_take_ref (value); + g_variant_builder_add (&builder, "{sv}", info->properties[n]->name, value); + g_variant_unref (value); + } + } + } + + return g_variant_builder_end (&builder); +} + +static void +mock_interface_flush (GDBusInterfaceSkeleton *skeleton) +{ + +} + +static void +mock_interface_class_init (MockInterfaceClass *klass) +{ + GDBusInterfaceSkeletonClass *skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass); + skeleton_class->get_info = mock_interface_get_info; + skeleton_class->get_properties = mock_interface_get_properties; + skeleton_class->flush = mock_interface_flush; + skeleton_class->get_vtable = mock_interface_get_vtable; +} +typedef struct { + GDBusConnection *server; + GDBusConnection *client; + GMainLoop *loop; + GAsyncResult *result; +} Test; + +static void +on_server_connection (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + Test *test = user_data; + GError *error = NULL; + + g_assert (test->server == NULL); + test->server = g_dbus_connection_new_finish (result, &error); + g_assert_no_error (error); + g_assert (test->server != NULL); + + if (test->server && test->client) + g_main_loop_quit (test->loop); +} + +static void +on_client_connection (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + Test *test = user_data; + GError *error = NULL; + + g_assert (test->client == NULL); + test->client = g_dbus_connection_new_finish (result, &error); + g_assert_no_error (error); + g_assert (test->client != NULL); + + if (test->server && test->client) + g_main_loop_quit (test->loop); +} + +static void +setup (Test *test, + gconstpointer unused) +{ + GError *error = NULL; + GSocket *socket; + GSocketConnection *stream; + gchar *guid; + int pair[2]; + + test->loop = g_main_loop_new (NULL, FALSE); + + if (socketpair (AF_UNIX, SOCK_STREAM, 0, pair) < 0) + { + g_set_error (&error, G_IO_ERROR, g_io_error_from_errno (errno), + "%s", g_strerror (errno)); + g_assert_no_error (error); + } + + /* Build up the server stuff */ + socket = g_socket_new_from_fd (pair[1], &error); + g_assert_no_error (error); + + stream = g_socket_connection_factory_create_connection (socket); + g_assert (stream != NULL); + g_object_unref (socket); + + guid = g_dbus_generate_guid (); + g_dbus_connection_new (G_IO_STREAM (stream), guid, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER | + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS, + NULL, NULL, on_server_connection, test); + g_object_unref (stream); + g_free (guid); + + /* Build up the client stuff */ + socket = g_socket_new_from_fd (pair[0], &error); + g_assert_no_error (error); + + stream = g_socket_connection_factory_create_connection (socket); + g_assert (stream != NULL); + g_object_unref (socket); + + g_dbus_connection_new (G_IO_STREAM (stream), NULL, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS, + NULL, NULL, on_client_connection, test); + + g_main_loop_run (test->loop); + + g_assert (test->server); + g_assert (test->client); +} + +static void +teardown (Test *test, + gconstpointer unused) +{ + g_clear_object (&test->client); + g_clear_object (&test->server); + g_main_loop_unref (test->loop); +} + +static void +on_result (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + Test *test = user_data; + g_assert (test->result == NULL); + test->result = g_object_ref (result); + g_main_loop_quit (test->loop); + +} + +static void +test_object_manager (Test *test, + gconstpointer unused) +{ + GDBusObjectManager *client; + GDBusObjectManagerServer *server; + MockInterface *mock; + GDBusObjectSkeleton *skeleton; + const gchar *dbus_name; + GError *error = NULL; + GDBusInterface *proxy; + GVariant *prop; + + server = g_dbus_object_manager_server_new ("/objects"); + + mock = g_object_new (mock_interface_get_type (), NULL); + mock->number = 1; + skeleton = g_dbus_object_skeleton_new ("/objects/number_1"); + g_dbus_object_skeleton_add_interface (skeleton, G_DBUS_INTERFACE_SKELETON (mock)); + g_dbus_object_manager_server_export (server, skeleton); + + mock = g_object_new (mock_interface_get_type (), NULL); + mock->number = 2; + skeleton = g_dbus_object_skeleton_new ("/objects/number_2"); + g_dbus_object_skeleton_add_interface (skeleton, G_DBUS_INTERFACE_SKELETON (mock)); + g_dbus_object_manager_server_export (server, skeleton); + + g_dbus_object_manager_server_set_connection (server, test->server); + + dbus_name = NULL; + + g_dbus_object_manager_client_new (test->client, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START, + dbus_name, "/objects", NULL, NULL, NULL, NULL, on_result, test); + + g_main_loop_run (test->loop); + client = g_dbus_object_manager_client_new_finish (test->result, &error); + g_assert_no_error (error); + g_clear_object (&test->result); + + proxy = g_dbus_object_manager_get_interface (client, "/objects/number_1", "org.mock.Interface"); + g_assert (proxy != NULL); + prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Path"); + g_assert (prop != NULL); + g_assert_cmpstr ((gchar *)g_variant_get_type (prop), ==, (gchar *)G_VARIANT_TYPE_OBJECT_PATH); + g_assert_cmpstr (g_variant_get_string (prop, NULL), ==, "/objects/number_1"); + g_variant_unref (prop); + prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Number"); + g_assert (prop != NULL); + g_assert_cmpstr ((gchar *)g_variant_get_type (prop), ==, (gchar *)G_VARIANT_TYPE_INT32); + g_assert_cmpint (g_variant_get_int32 (prop), ==, 1); + g_variant_unref (prop); + g_object_unref (proxy); + + proxy = g_dbus_object_manager_get_interface (client, "/objects/number_2", "org.mock.Interface"); + g_assert (proxy != NULL); + prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Path"); + g_assert (prop != NULL); + g_assert_cmpstr ((gchar *)g_variant_get_type (prop), ==, (gchar *)G_VARIANT_TYPE_OBJECT_PATH); + g_assert_cmpstr (g_variant_get_string (prop, NULL), ==, "/objects/number_2"); + g_variant_unref (prop); + prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Number"); + g_assert (prop != NULL); + g_assert_cmpstr ((gchar *)g_variant_get_type (prop), ==, (gchar *)G_VARIANT_TYPE_INT32); + g_assert_cmpint (g_variant_get_int32 (prop), ==, 2); + g_variant_unref (prop); + g_object_unref (proxy); + + g_object_unref (server); + g_object_unref (client); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/gdbus/peer-object-manager", Test, NULL, setup, test_object_manager, teardown); + + return g_test_run(); +} diff --git a/gio/tests/gdbus-peer.c b/gio/tests/gdbus-peer.c new file mode 100644 index 0000000..799c673 --- /dev/null +++ b/gio/tests/gdbus-peer.c @@ -0,0 +1,1871 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include "config.h" + +#include +#include +#include + +/* for open(2) */ +#include +#include +#include +#include + +/* for g_unlink() */ +#include + +#include +#include +#include + +/* used in test_overflow */ +#ifdef G_OS_UNIX +#include +#include +#endif + +#if (defined(__linux__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__OpenBSD__)) +#define SHOULD_HAVE_CREDENTIALS_PASSING +#endif + +#include "gdbus-tests.h" + +#include "gdbus-example-objectmanager-generated.h" + +#ifdef G_OS_UNIX +static gboolean is_unix = TRUE; +#else +static gboolean is_unix = FALSE; +#endif + +static gchar *tmp_address = NULL; +static gchar *test_guid = NULL; +static GMainLoop *service_loop = NULL; +static GDBusServer *server = NULL; +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that peer-to-peer connections work */ +/* ---------------------------------------------------------------------------------------------------- */ + + +typedef struct +{ + gboolean accept_connection; + gint num_connection_attempts; + GPtrArray *current_connections; + guint num_method_calls; + gboolean signal_received; +} PeerData; + +static const gchar *test_interface_introspection_xml = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; +static GDBusInterfaceInfo *test_interface_introspection_data = NULL; + +static void +test_interface_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + PeerData *data = user_data; + const GDBusMethodInfo *info; + + data->num_method_calls++; + + g_assert_cmpstr (object_path, ==, "/org/gtk/GDBus/PeerTestObject"); + g_assert_cmpstr (interface_name, ==, "org.gtk.GDBus.PeerTestInterface"); + + info = g_dbus_method_invocation_get_method_info (invocation); + g_assert_cmpstr (info->name, ==, method_name); + + if (g_strcmp0 (method_name, "HelloPeer") == 0) + { + const gchar *greeting; + gchar *response; + + g_variant_get (parameters, "(&s)", &greeting); + + response = g_strdup_printf ("You greeted me with '%s'.", + greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free (response); + } + else if (g_strcmp0 (method_name, "EmitSignal") == 0) + { + GError *error; + + error = NULL; + g_dbus_connection_emit_signal (connection, + NULL, + "/org/gtk/GDBus/PeerTestObject", + "org.gtk.GDBus.PeerTestInterface", + "PeerSignal", + NULL, + &error); + g_assert_no_error (error); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "EmitSignalWithNameSet") == 0) + { + GError *error; + gboolean ret; + GDBusMessage *message; + + message = g_dbus_message_new_signal ("/org/gtk/GDBus/PeerTestObject", + "org.gtk.GDBus.PeerTestInterface", + "PeerSignalWithNameSet"); + g_dbus_message_set_sender (message, ":1.42"); + + error = NULL; + ret = g_dbus_connection_send_message (connection, message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_object_unref (message); + + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "OpenFile") == 0) + { +#ifdef G_OS_UNIX + const gchar *path; + GDBusMessage *reply; + GError *error; + gint fd; + GUnixFDList *fd_list; + + g_variant_get (parameters, "(&s)", &path); + + fd_list = g_unix_fd_list_new (); + + error = NULL; + + fd = g_open (path, O_RDONLY, 0); + g_unix_fd_list_append (fd_list, fd, &error); + g_assert_no_error (error); + close (fd); + + reply = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation)); + g_dbus_message_set_unix_fd_list (reply, fd_list); + g_object_unref (fd_list); + g_object_unref (invocation); + + error = NULL; + g_dbus_connection_send_message (connection, + reply, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + NULL, /* out_serial */ + &error); + g_assert_no_error (error); + g_object_unref (reply); +#else + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.NotOnUnix", + "Your OS does not support file descriptor passing"); +#endif + } + else + { + g_assert_not_reached (); + } +} + +static GVariant * +test_interface_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + g_assert_cmpstr (object_path, ==, "/org/gtk/GDBus/PeerTestObject"); + g_assert_cmpstr (interface_name, ==, "org.gtk.GDBus.PeerTestInterface"); + g_assert_cmpstr (property_name, ==, "PeerProperty"); + + return g_variant_new_string ("ThePropertyValue"); +} + + +static const GDBusInterfaceVTable test_interface_vtable = +{ + test_interface_method_call, + test_interface_get_property, + NULL /* set_property */ +}; + +static void +on_proxy_signal_received (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + PeerData *data = user_data; + + data->signal_received = TRUE; + + g_assert (sender_name == NULL); + g_assert_cmpstr (signal_name, ==, "PeerSignal"); + g_main_loop_quit (loop); +} + +static void +on_proxy_signal_received_with_name_set (GDBusProxy *proxy, + gchar *sender_name, + gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + PeerData *data = user_data; + + data->signal_received = TRUE; + + g_assert_cmpstr (sender_name, ==, ":1.42"); + g_assert_cmpstr (signal_name, ==, "PeerSignalWithNameSet"); + g_main_loop_quit (loop); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_authorize_authenticated_peer (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials, + gpointer user_data) +{ + PeerData *data = user_data; + gboolean authorized; + + data->num_connection_attempts++; + + authorized = TRUE; + if (!data->accept_connection) + { + authorized = FALSE; + g_main_loop_quit (loop); + } + + return authorized; +} + +/* Runs in thread we created GDBusServer in (since we didn't pass G_DBUS_SERVER_FLAGS_RUN_IN_THREAD) */ +static gboolean +on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + PeerData *data = user_data; + GError *error; + guint reg_id; + + //g_print ("Client connected.\n" + // "Negotiated capabilities: unix-fd-passing=%d\n", + // g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); + + g_ptr_array_add (data->current_connections, g_object_ref (connection)); + +#ifdef SHOULD_HAVE_CREDENTIALS_PASSING + { + GCredentials *credentials; + + credentials = g_dbus_connection_get_peer_credentials (connection); + + g_assert (credentials != NULL); + g_assert_cmpuint (g_credentials_get_unix_user (credentials, NULL), ==, + getuid ()); + g_assert_cmpuint (g_credentials_get_unix_pid (credentials, NULL), ==, + getpid ()); + } +#endif + + /* export object on the newly established connection */ + error = NULL; + reg_id = g_dbus_connection_register_object (connection, + "/org/gtk/GDBus/PeerTestObject", + test_interface_introspection_data, + &test_interface_vtable, + data, + NULL, /* GDestroyNotify for data */ + &error); + g_assert_no_error (error); + g_assert (reg_id > 0); + + g_main_loop_quit (loop); + + return TRUE; +} + +static gpointer +service_thread_func (gpointer user_data) +{ + PeerData *data = user_data; + GMainContext *service_context; + GDBusAuthObserver *observer, *o; + GError *error; + GDBusServerFlags f; + gchar *a, *g; + gboolean b; + + service_context = g_main_context_new (); + g_main_context_push_thread_default (service_context); + + error = NULL; + observer = g_dbus_auth_observer_new (); + server = g_dbus_server_new_sync (tmp_address, + G_DBUS_SERVER_FLAGS_NONE, + test_guid, + observer, + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + + g_signal_connect (server, + "new-connection", + G_CALLBACK (on_new_connection), + data); + g_signal_connect (observer, + "authorize-authenticated-peer", + G_CALLBACK (on_authorize_authenticated_peer), + data); + + g_assert_cmpint (g_dbus_server_get_flags (server), ==, G_DBUS_SERVER_FLAGS_NONE); + g_assert_cmpstr (g_dbus_server_get_guid (server), ==, test_guid); + g_object_get (server, + "flags", &f, + "address", &a, + "guid", &g, + "active", &b, + "authentication-observer", &o, + NULL); + g_assert_cmpint (f, ==, G_DBUS_SERVER_FLAGS_NONE); + g_assert_cmpstr (a, ==, tmp_address); + g_assert_cmpstr (g, ==, test_guid); + g_assert (!b); + g_assert (o == observer); + g_free (a); + g_free (g); + g_object_unref (o); + + g_object_unref (observer); + + g_dbus_server_start (server); + + service_loop = g_main_loop_new (service_context, FALSE); + g_main_loop_run (service_loop); + + g_main_context_pop_thread_default (service_context); + + g_main_loop_unref (service_loop); + g_main_context_unref (service_context); + + /* test code specifically unrefs the server - see below */ + g_assert (server == NULL); + + return NULL; +} + +#if 0 +static gboolean +on_incoming_connection (GSocketService *service, + GSocketConnection *socket_connection, + GObject *source_object, + gpointer user_data) +{ + PeerData *data = user_data; + + if (data->accept_connection) + { + GError *error; + guint reg_id; + GDBusConnection *connection; + + error = NULL; + connection = g_dbus_connection_new_sync (G_IO_STREAM (socket_connection), + test_guid, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER, + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + + g_ptr_array_add (data->current_connections, connection); + + /* export object on the newly established connection */ + error = NULL; + reg_id = g_dbus_connection_register_object (connection, + "/org/gtk/GDBus/PeerTestObject", + &test_interface_introspection_data, + &test_interface_vtable, + data, + NULL, /* GDestroyNotify for data */ + &error); + g_assert_no_error (error); + g_assert (reg_id > 0); + + } + else + { + /* don't do anything */ + } + + data->num_connection_attempts++; + + g_main_loop_quit (loop); + + /* stops other signal handlers from being invoked */ + return TRUE; +} + +static gpointer +service_thread_func (gpointer data) +{ + GMainContext *service_context; + gchar *socket_path; + GSocketAddress *address; + GError *error; + + service_context = g_main_context_new (); + g_main_context_push_thread_default (service_context); + + socket_path = g_strdup_printf ("/tmp/gdbus-test-pid-%d", getpid ()); + address = g_unix_socket_address_new (socket_path); + + service = g_socket_service_new (); + error = NULL; + g_socket_listener_add_address (G_SOCKET_LISTENER (service), + address, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + NULL, /* source_object */ + NULL, /* effective_address */ + &error); + g_assert_no_error (error); + g_signal_connect (service, + "incoming", + G_CALLBACK (on_incoming_connection), + data); + g_socket_service_start (service); + + service_loop = g_main_loop_new (service_context, FALSE); + g_main_loop_run (service_loop); + + g_main_context_pop_thread_default (service_context); + + g_main_loop_unref (service_loop); + g_main_context_unref (service_context); + + g_object_unref (address); + g_free (socket_path); + return NULL; +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +#if 0 +static gboolean +check_connection (gpointer user_data) +{ + PeerData *data = user_data; + guint n; + + for (n = 0; n < data->current_connections->len; n++) + { + GDBusConnection *c; + GIOStream *stream; + + c = G_DBUS_CONNECTION (data->current_connections->pdata[n]); + stream = g_dbus_connection_get_stream (c); + + g_debug ("In check_connection for %d: connection %p, stream %p", n, c, stream); + g_debug ("closed = %d", g_io_stream_is_closed (stream)); + + GSocket *socket; + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (stream)); + g_debug ("socket_closed = %d", g_socket_is_closed (socket)); + g_debug ("socket_condition_check = %d", g_socket_condition_check (socket, G_IO_IN|G_IO_OUT|G_IO_ERR|G_IO_HUP)); + + gchar buf[128]; + GError *error; + gssize num_read; + error = NULL; + num_read = g_input_stream_read (g_io_stream_get_input_stream (stream), + buf, + 128, + NULL, + &error); + if (num_read < 0) + { + g_debug ("error: %s", error->message); + g_error_free (error); + } + else + { + g_debug ("no error, read %d bytes", (gint) num_read); + } + } + + return FALSE; +} + +static gboolean +on_do_disconnect_in_idle (gpointer data) +{ + GDBusConnection *c = G_DBUS_CONNECTION (data); + g_debug ("GDC %p has ref_count %d", c, G_OBJECT (c)->ref_count); + g_dbus_connection_disconnect (c); + g_object_unref (c); + return FALSE; +} +#endif + +#ifdef G_OS_UNIX +static gchar * +read_all_from_fd (gint fd, gsize *out_len, GError **error) +{ + GString *str; + gchar buf[64]; + gssize num_read; + + str = g_string_new (NULL); + + do + { + num_read = read (fd, buf, sizeof (buf)); + if (num_read == -1) + { + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + g_set_error (error, + G_IO_ERROR, + g_io_error_from_errno (errno), + "Failed reading %d bytes into offset %d: %s", + (gint) sizeof (buf), + (gint) str->len, + strerror (errno)); + goto error; + } + else if (num_read > 0) + { + g_string_append_len (str, buf, num_read); + } + else if (num_read == 0) + { + break; + } + } + while (TRUE); + + if (out_len != NULL) + *out_len = str->len; + return g_string_free (str, FALSE); + + error: + if (out_len != NULL) + out_len = 0; + g_string_free (str, TRUE); + return NULL; +} +#endif + +static void +test_peer (void) +{ + GDBusConnection *c; + GDBusConnection *c2; + GDBusProxy *proxy; + GError *error; + PeerData data; + GVariant *value; + GVariant *result; + const gchar *s; + GThread *service_thread; + gulong signal_handler_id; + + memset (&data, '\0', sizeof (PeerData)); + data.current_connections = g_ptr_array_new_with_free_func (g_object_unref); + + /* first try to connect when there is no server */ + error = NULL; + c = g_dbus_connection_new_for_address_sync (is_unix ? "unix:path=/tmp/gdbus-test-does-not-exist-pid" : + /* NOTE: Even if something is listening on port 12345 the connection + * will fail because the nonce file doesn't exist */ + "nonce-tcp:host=localhost,port=12345,noncefile=this-does-not-exist-gdbus", + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + _g_assert_error_domain (error, G_IO_ERROR); + g_assert (!g_dbus_error_is_remote_error (error)); + g_clear_error (&error); + g_assert (c == NULL); + + /* bring up a server - we run the server in a different thread to avoid deadlocks */ + service_loop = NULL; + service_thread = g_thread_new ("test_peer", + service_thread_func, + &data); + while (service_loop == NULL) + g_thread_yield (); + g_assert (server != NULL); + + /* bring up a connection and accept it */ + data.accept_connection = TRUE; + error = NULL; + c = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (c != NULL); + while (data.current_connections->len < 1) + g_main_loop_run (loop); + g_assert_cmpint (data.current_connections->len, ==, 1); + g_assert_cmpint (data.num_connection_attempts, ==, 1); + g_assert (g_dbus_connection_get_unique_name (c) == NULL); + g_assert_cmpstr (g_dbus_connection_get_guid (c), ==, test_guid); + + /* check that we create a proxy, read properties, receive signals and invoke + * the HelloPeer() method. Since the server runs in another thread it's fine + * to use synchronous blocking API here. + */ + error = NULL; + proxy = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + NULL, /* bus_name */ + "/org/gtk/GDBus/PeerTestObject", + "org.gtk.GDBus.PeerTestInterface", + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + error = NULL; + value = g_dbus_proxy_get_cached_property (proxy, "PeerProperty"); + g_assert_cmpstr (g_variant_get_string (value, NULL), ==, "ThePropertyValue"); + + /* try invoking a method */ + error = NULL; + result = g_dbus_proxy_call_sync (proxy, + "HelloPeer", + g_variant_new ("(s)", "Hey Peer!"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_variant_get (result, "(&s)", &s); + g_assert_cmpstr (s, ==, "You greeted me with 'Hey Peer!'."); + g_variant_unref (result); + g_assert_cmpint (data.num_method_calls, ==, 1); + + /* make the other peer emit a signal - catch it */ + signal_handler_id = g_signal_connect (proxy, + "g-signal", + G_CALLBACK (on_proxy_signal_received), + &data); + g_assert (!data.signal_received); + g_dbus_proxy_call (proxy, + "EmitSignal", + NULL, /* no arguments */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* GCancellable */ + NULL, /* GAsyncReadyCallback - we don't care about the result */ + NULL); /* user_data */ + g_main_loop_run (loop); + g_assert (data.signal_received); + g_assert_cmpint (data.num_method_calls, ==, 2); + g_signal_handler_disconnect (proxy, signal_handler_id); + + /* Also ensure that messages with the sender header-field set gets + * delivered to the proxy - note that this doesn't really make sense + * e.g. names are meaning-less in a peer-to-peer case... but we + * support it because it makes sense in certain bridging + * applications - see e.g. #623815. + */ + signal_handler_id = g_signal_connect (proxy, + "g-signal", + G_CALLBACK (on_proxy_signal_received_with_name_set), + &data); + data.signal_received = FALSE; + g_dbus_proxy_call (proxy, + "EmitSignalWithNameSet", + NULL, /* no arguments */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* GCancellable */ + NULL, /* GAsyncReadyCallback - we don't care about the result */ + NULL); /* user_data */ + g_main_loop_run (loop); + g_assert (data.signal_received); + g_assert_cmpint (data.num_method_calls, ==, 3); + g_signal_handler_disconnect (proxy, signal_handler_id); + + /* check for UNIX fd passing */ +#ifdef G_OS_UNIX + { + GDBusMessage *method_call_message; + GDBusMessage *method_reply_message; + GUnixFDList *fd_list; + gint fd; + gchar *buf; + gsize len; + gchar *buf2; + gsize len2; + + method_call_message = g_dbus_message_new_method_call (NULL, /* name */ + "/org/gtk/GDBus/PeerTestObject", + "org.gtk.GDBus.PeerTestInterface", + "OpenFile"); + g_dbus_message_set_body (method_call_message, g_variant_new ("(s)", "/etc/hosts")); + error = NULL; + method_reply_message = g_dbus_connection_send_message_with_reply_sync (c, + method_call_message, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + NULL, /* out_serial */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (g_dbus_message_get_message_type (method_reply_message) == G_DBUS_MESSAGE_TYPE_METHOD_RETURN); + fd_list = g_dbus_message_get_unix_fd_list (method_reply_message); + g_assert (fd_list != NULL); + g_assert_cmpint (g_unix_fd_list_get_length (fd_list), ==, 1); + error = NULL; + fd = g_unix_fd_list_get (fd_list, 0, &error); + g_assert_no_error (error); + g_object_unref (method_call_message); + g_object_unref (method_reply_message); + + error = NULL; + len = 0; + buf = read_all_from_fd (fd, &len, &error); + g_assert_no_error (error); + g_assert (buf != NULL); + close (fd); + + error = NULL; + g_file_get_contents ("/etc/hosts", + &buf2, + &len2, + &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, len2); + g_assert (memcmp (buf, buf2, len) == 0); + g_free (buf2); + g_free (buf); + } +#else + error = NULL; + result = g_dbus_proxy_call_sync (proxy, + "OpenFile", + g_variant_new ("(s)", "boo"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* GCancellable */ + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR); + g_assert (result == NULL); + g_error_free (error); +#endif /* G_OS_UNIX */ + + /* Check that g_socket_get_credentials() work - this really should + * be in a GSocket-specific test suite but no such test suite exists + * right now. + */ + { + GSocket *socket; + GCredentials *credentials; + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (g_dbus_connection_get_stream (c))); + g_assert (G_IS_SOCKET (socket)); + error = NULL; + credentials = g_socket_get_credentials (socket, &error); +#ifdef __linux__ + { + struct ucred *native_creds; + g_assert_no_error (error); + g_assert (G_IS_CREDENTIALS (credentials)); + native_creds = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_LINUX_UCRED); + g_assert (native_creds != NULL); + g_assert (native_creds->uid == getuid ()); + g_assert (native_creds->gid == getgid ()); + g_assert (native_creds->pid == getpid ()); + } + g_object_unref (credentials); +#elif defined (__OpenBSD__) + { + struct sockpeercred *native_creds; + g_assert_no_error (error); + g_assert (G_IS_CREDENTIALS (credentials)); + native_creds = g_credentials_get_native (credentials, G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED); + g_assert (native_creds != NULL); + g_assert (native_creds->uid == getuid ()); + g_assert (native_creds->gid == getgid ()); + g_assert (native_creds->pid == getpid ()); + } + g_object_unref (credentials); +#else + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_assert (credentials == NULL); +#endif + } + + + /* bring up a connection - don't accept it - this should fail + */ + data.accept_connection = FALSE; + error = NULL; + c2 = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + _g_assert_error_domain (error, G_IO_ERROR); + g_error_free (error); + g_assert (c2 == NULL); + +#if 0 + /* TODO: THIS TEST DOESN'T WORK YET */ + + /* bring up a connection - accept it.. then disconnect from the client side - check + * that the server side gets the disconnect signal. + */ + error = NULL; + data.accept_connection = TRUE; + c2 = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (c2 != NULL); + g_assert (!g_dbus_connection_get_is_disconnected (c2)); + while (data.num_connection_attempts < 3) + g_main_loop_run (loop); + g_assert_cmpint (data.current_connections->len, ==, 2); + g_assert_cmpint (data.num_connection_attempts, ==, 3); + g_assert (!g_dbus_connection_get_is_disconnected (G_DBUS_CONNECTION (data.current_connections->pdata[1]))); + g_idle_add (on_do_disconnect_in_idle, c2); + g_debug ("=================================================="); + g_debug ("=================================================="); + g_debug ("=================================================="); + g_debug ("waiting for disconnect on connection %p, stream %p", + data.current_connections->pdata[1], + g_dbus_connection_get_stream (data.current_connections->pdata[1])); + + g_timeout_add (2000, check_connection, &data); + //_g_assert_signal_received (G_DBUS_CONNECTION (data.current_connections->pdata[1]), "closed"); + g_main_loop_run (loop); + g_assert (g_dbus_connection_get_is_disconnected (G_DBUS_CONNECTION (data.current_connections->pdata[1]))); + g_ptr_array_set_size (data.current_connections, 1); /* remove disconnected connection object */ +#endif + + /* unref the server and stop listening for new connections + * + * This won't bring down the established connections - check that c is still connected + * by invoking a method + */ + //g_socket_service_stop (service); + //g_object_unref (service); + g_dbus_server_stop (server); + g_object_unref (server); + server = NULL; + + error = NULL; + result = g_dbus_proxy_call_sync (proxy, + "HelloPeer", + g_variant_new ("(s)", "Hey Again Peer!"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_variant_get (result, "(&s)", &s); + g_assert_cmpstr (s, ==, "You greeted me with 'Hey Again Peer!'."); + g_variant_unref (result); + g_assert_cmpint (data.num_method_calls, ==, 5); + +#if 0 + /* TODO: THIS TEST DOESN'T WORK YET */ + + /* now disconnect from the server side - check that the client side gets the signal */ + g_assert_cmpint (data.current_connections->len, ==, 1); + g_assert (G_DBUS_CONNECTION (data.current_connections->pdata[0]) != c); + g_dbus_connection_disconnect (G_DBUS_CONNECTION (data.current_connections->pdata[0])); + if (!g_dbus_connection_get_is_disconnected (c)) + _g_assert_signal_received (c, "closed"); + g_assert (g_dbus_connection_get_is_disconnected (c)); +#endif + + g_object_unref (c); + g_ptr_array_unref (data.current_connections); + g_object_unref (proxy); + + g_main_loop_quit (service_loop); + g_thread_join (service_thread); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GDBusServer *server; + GMainContext *context; + GMainLoop *loop; + + GList *connections; +} DmpData; + +static void +dmp_data_free (DmpData *data) +{ + g_main_loop_unref (data->loop); + g_main_context_unref (data->context); + g_object_unref (data->server); + g_list_free_full (data->connections, g_object_unref); + g_free (data); +} + +static void +dmp_on_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + //DmpData *data = user_data; + gint32 first; + gint32 second; + g_variant_get (parameters, + "(ii)", + &first, + &second); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(i)", first + second)); +} + +static const GDBusInterfaceVTable dmp_interface_vtable = +{ + dmp_on_method_call, + NULL, /* get_property */ + NULL /* set_property */ +}; + + +/* Runs in thread we created GDBusServer in (since we didn't pass G_DBUS_SERVER_FLAGS_RUN_IN_THREAD) */ +static gboolean +dmp_on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + DmpData *data = user_data; + GDBusNodeInfo *node; + GError *error; + + /* accept the connection */ + data->connections = g_list_prepend (data->connections, g_object_ref (connection)); + + error = NULL; + node = g_dbus_node_info_new_for_xml ("" + " " + " " + " " + " " + " " + " " + " " + "", + &error); + g_assert_no_error (error); + + /* sleep 100ms before exporting an object - this is to test that + * G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING really works + * (GDBusServer uses this feature). + */ + usleep (100 * 1000); + + /* export an object */ + error = NULL; + g_dbus_connection_register_object (connection, + "/dmp/test", + node->interfaces[0], + &dmp_interface_vtable, + data, + NULL, + &error); + g_dbus_node_info_unref (node); + + return TRUE; +} + +static gpointer +dmp_thread_func (gpointer user_data) +{ + DmpData *data = user_data; + GError *error; + gchar *guid; + + data->context = g_main_context_new (); + g_main_context_push_thread_default (data->context); + + error = NULL; + guid = g_dbus_generate_guid (); + data->server = g_dbus_server_new_sync (tmp_address, + G_DBUS_SERVER_FLAGS_NONE, + guid, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_signal_connect (data->server, + "new-connection", + G_CALLBACK (dmp_on_new_connection), + data); + + g_dbus_server_start (data->server); + + data->loop = g_main_loop_new (data->context, FALSE); + g_main_loop_run (data->loop); + + g_main_context_pop_thread_default (data->context); + + g_free (guid); + return NULL; +} + +static void +delayed_message_processing (void) +{ + GError *error; + DmpData *data; + GThread *service_thread; + guint n; + + data = g_new0 (DmpData, 1); + + service_thread = g_thread_new ("dmp", + dmp_thread_func, + data); + while (data->server == NULL || !g_dbus_server_is_active (data->server)) + g_thread_yield (); + + for (n = 0; n < 5; n++) + { + GDBusConnection *c; + GVariant *res; + gint32 val; + + error = NULL; + c = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (data->server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + error = NULL; + res = g_dbus_connection_call_sync (c, + NULL, /* bus name */ + "/dmp/test", + "org.gtk.GDBus.DmpInterface", + "AddPair", + g_variant_new ("(ii)", 2, n), + G_VARIANT_TYPE ("(i)"), + G_DBUS_CALL_FLAGS_NONE, + -1, /* timeout_msec */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_variant_get (res, "(i)", &val); + g_assert_cmpint (val, ==, 2 + n); + g_variant_unref (res); + g_object_unref (c); + } + + g_main_loop_quit (data->loop); + g_thread_join (service_thread); + dmp_data_free (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +nonce_tcp_on_authorize_authenticated_peer (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials, + gpointer user_data) +{ + PeerData *data = user_data; + gboolean authorized; + + data->num_connection_attempts++; + + authorized = TRUE; + if (!data->accept_connection) + { + authorized = FALSE; + g_main_loop_quit (loop); + } + + return authorized; +} + +/* Runs in thread we created GDBusServer in (since we didn't pass G_DBUS_SERVER_FLAGS_RUN_IN_THREAD) */ +static gboolean +nonce_tcp_on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + PeerData *data = user_data; + + g_ptr_array_add (data->current_connections, g_object_ref (connection)); + + g_main_loop_quit (loop); + + return TRUE; +} + +static gpointer +nonce_tcp_service_thread_func (gpointer user_data) +{ + PeerData *data = user_data; + GMainContext *service_context; + GDBusAuthObserver *observer; + GError *error; + + service_context = g_main_context_new (); + g_main_context_push_thread_default (service_context); + + error = NULL; + observer = g_dbus_auth_observer_new (); + server = g_dbus_server_new_sync ("nonce-tcp:", + G_DBUS_SERVER_FLAGS_NONE, + test_guid, + observer, + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + + g_signal_connect (server, + "new-connection", + G_CALLBACK (nonce_tcp_on_new_connection), + data); + g_signal_connect (observer, + "authorize-authenticated-peer", + G_CALLBACK (nonce_tcp_on_authorize_authenticated_peer), + data); + g_object_unref (observer); + + g_dbus_server_start (server); + + service_loop = g_main_loop_new (service_context, FALSE); + g_main_loop_run (service_loop); + + g_main_context_pop_thread_default (service_context); + + g_main_loop_unref (service_loop); + g_main_context_unref (service_context); + + /* test code specifically unrefs the server - see below */ + g_assert (server == NULL); + + return NULL; +} + +static void +test_nonce_tcp (void) +{ + PeerData data; + GError *error; + GThread *service_thread; + GDBusConnection *c; + gchar *s; + gchar *nonce_file; + gboolean res; + const gchar *address; + + memset (&data, '\0', sizeof (PeerData)); + data.current_connections = g_ptr_array_new_with_free_func (g_object_unref); + + error = NULL; + server = NULL; + service_loop = NULL; + service_thread = g_thread_new ("nonce-tcp-service", + nonce_tcp_service_thread_func, + &data); + while (service_loop == NULL) + g_thread_yield (); + g_assert (server != NULL); + + + /* bring up a connection and accept it */ + data.accept_connection = TRUE; + error = NULL; + c = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (c != NULL); + while (data.current_connections->len < 1) + g_thread_yield (); + g_assert_cmpint (data.current_connections->len, ==, 1); + g_assert_cmpint (data.num_connection_attempts, ==, 1); + g_assert (g_dbus_connection_get_unique_name (c) == NULL); + g_assert_cmpstr (g_dbus_connection_get_guid (c), ==, test_guid); + g_object_unref (c); + + /* now, try to subvert the nonce file (this assumes noncefile is the last key/value pair) + */ + + address = g_dbus_server_get_client_address (server); + + s = strstr (address, "noncefile="); + g_assert (s != NULL); + s += sizeof "noncefile=" - 1; + nonce_file = g_strdup (s); + + /* First try invalid data in the nonce file - this will actually + * make the client send this and the server will reject it. The way + * it works is that if the nonce doesn't match, the server will + * simply close the connection. So, from the client point of view, + * we can see a variety of errors. + */ + error = NULL; + res = g_file_set_contents (nonce_file, + "0123456789012345", + -1, + &error); + g_assert_no_error (error); + g_assert (res); + c = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + _g_assert_error_domain (error, G_IO_ERROR); + g_error_free (error); + g_assert (c == NULL); + + /* Then try with a nonce-file of incorrect length - this will make + * the client complain - we won't even try connecting to the server + * for this + */ + error = NULL; + res = g_file_set_contents (nonce_file, + "0123456789012345_", + -1, + &error); + g_assert_no_error (error); + g_assert (res); + c = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + g_assert (c == NULL); + + /* Finally try with no nonce-file at all */ + g_assert_cmpint (g_unlink (nonce_file), ==, 0); + error = NULL; + c = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + g_assert (c == NULL); + + g_free (nonce_file); + + g_dbus_server_stop (server); + g_object_unref (server); + server = NULL; + + g_main_loop_quit (service_loop); + g_thread_join (service_thread); +} + +static void +test_credentials (void) +{ + GCredentials *c1, *c2; + GError *error; + gchar *desc; + + c1 = g_credentials_new (); + c2 = g_credentials_new (); + + error = NULL; + if (g_credentials_set_unix_user (c2, getuid (), &error)) + g_assert_no_error (error); + + g_clear_error (&error); + g_assert (g_credentials_is_same_user (c1, c2, &error)); + g_assert_no_error (error); + + desc = g_credentials_to_string (c1); + g_assert (desc != NULL); + g_free (desc); + + g_object_unref (c1); + g_object_unref (c2); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +#ifdef G_OS_UNIX + +/* Chosen to be big enough to overflow the socket buffer */ +#define OVERFLOW_NUM_SIGNALS 5000 +#define OVERFLOW_TIMEOUT_SEC 10 + +static GDBusMessage * +overflow_filter_func (GDBusConnection *connection, + GDBusMessage *message, + gboolean incoming, + gpointer user_data) +{ + volatile gint *counter = user_data; + *counter += 1; + return message; +} + +static gboolean +overflow_on_500ms_later_func (gpointer user_data) +{ + g_main_loop_quit (loop); + return FALSE; /* don't keep the idle */ +} + +static void +test_overflow (void) +{ + gint sv[2]; + gint n; + GSocket *socket; + GSocketConnection *socket_connection; + GDBusConnection *producer, *consumer; + GError *error; + GTimer *timer; + volatile gint n_messages_received; + volatile gint n_messages_sent; + + g_assert_cmpint (socketpair (AF_UNIX, SOCK_STREAM, 0, sv), ==, 0); + + error = NULL; + socket = g_socket_new_from_fd (sv[0], &error); + g_assert_no_error (error); + socket_connection = g_socket_connection_factory_create_connection (socket); + g_assert (socket_connection != NULL); + g_object_unref (socket); + producer = g_dbus_connection_new_sync (G_IO_STREAM (socket_connection), + NULL, /* guid */ + G_DBUS_CONNECTION_FLAGS_NONE, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + g_dbus_connection_set_exit_on_close (producer, TRUE); + g_assert_no_error (error); + g_object_unref (socket_connection); + n_messages_sent = 0; + g_dbus_connection_add_filter (producer, overflow_filter_func, (gpointer) &n_messages_sent, NULL); + + /* send enough data that we get an EAGAIN */ + for (n = 0; n < OVERFLOW_NUM_SIGNALS; n++) + { + error = NULL; + g_dbus_connection_emit_signal (producer, + NULL, /* destination */ + "/org/foo/Object", + "org.foo.Interface", + "Member", + g_variant_new ("(s)", "a string"), + &error); + g_assert_no_error (error); + } + + /* sleep for 0.5 sec (to allow the GDBus IO thread to fill up the + * kernel buffers) and verify that n_messages_sent < + * OVERFLOW_NUM_SIGNALS + * + * This is to verify that not all the submitted messages have been + * sent to the underlying transport. + */ + g_timeout_add (500, overflow_on_500ms_later_func, NULL); + g_main_loop_run (loop); + g_assert_cmpint (n_messages_sent, <, OVERFLOW_NUM_SIGNALS); + + /* now suck it all out as a client, and add it up */ + socket = g_socket_new_from_fd (sv[1], &error); + g_assert_no_error (error); + socket_connection = g_socket_connection_factory_create_connection (socket); + g_assert (socket_connection != NULL); + g_object_unref (socket); + consumer = g_dbus_connection_new_sync (G_IO_STREAM (socket_connection), + NULL, /* guid */ + G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, + NULL, /* GDBusAuthObserver */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_object_unref (socket_connection); + n_messages_received = 0; + g_dbus_connection_add_filter (consumer, overflow_filter_func, (gpointer) &n_messages_received, NULL); + g_dbus_connection_start_message_processing (consumer); + + timer = g_timer_new (); + g_timer_start (timer); + + while (n_messages_received < OVERFLOW_NUM_SIGNALS && g_timer_elapsed (timer, NULL) < OVERFLOW_TIMEOUT_SEC) + g_main_context_iteration (NULL, FALSE); + + g_assert_cmpint (n_messages_sent, ==, OVERFLOW_NUM_SIGNALS); + g_assert_cmpint (n_messages_received, ==, OVERFLOW_NUM_SIGNALS); + + g_timer_destroy (timer); + g_object_unref (consumer); + g_object_unref (producer); +} +#else +static void +test_overflow (void) +{ + /* TODO: test this with e.g. GWin32InputStream/GWin32OutputStream */ +} +#endif + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +tcp_anonymous_on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + gboolean *seen_connection = user_data; + *seen_connection = TRUE; + return TRUE; +} + +static gpointer +tcp_anonymous_service_thread_func (gpointer user_data) +{ + gboolean *seen_connection = user_data; + GMainContext *service_context; + GError *error; + + service_context = g_main_context_new (); + g_main_context_push_thread_default (service_context); + + error = NULL; + server = g_dbus_server_new_sync ("tcp:", + G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS, + test_guid, + NULL, /* GDBusObserver* */ + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + + g_signal_connect (server, + "new-connection", + G_CALLBACK (tcp_anonymous_on_new_connection), + seen_connection); + + g_dbus_server_start (server); + + service_loop = g_main_loop_new (service_context, FALSE); + g_main_loop_run (service_loop); + + g_main_context_pop_thread_default (service_context); + + g_main_loop_unref (service_loop); + g_main_context_unref (service_context); + + return NULL; +} + +static void +test_tcp_anonymous (void) +{ + gboolean seen_connection; + GThread *service_thread; + GDBusConnection *connection; + GError *error; + + seen_connection = FALSE; + service_loop = NULL; + service_thread = g_thread_new ("tcp-anon-service", + tcp_anonymous_service_thread_func, + &seen_connection); + while (service_loop == NULL) + g_thread_yield (); + g_assert (server != NULL); + + error = NULL; + connection = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver* */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_assert (connection != NULL); + + while (!seen_connection) + g_thread_yield (); + + g_object_unref (connection); + + g_main_loop_quit (service_loop); + g_dbus_server_stop (server); + g_object_unref (server); + server = NULL; + + g_thread_join (service_thread); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusServer *codegen_server = NULL; + +static gboolean +codegen_on_animal_poke (ExampleAnimal *animal, + GDBusMethodInvocation *invocation, + gboolean make_sad, + gboolean make_happy, + gpointer user_data) +{ + if ((make_sad && make_happy) || (!make_sad && !make_happy)) + { + g_main_loop_quit (service_loop); + + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.Failed", + "Exactly one of make_sad or make_happy must be TRUE"); + goto out; + } + + if (make_sad) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad", + "Sad animal is already sad"); + goto out; + } + + example_animal_set_mood (animal, "Sad"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + if (make_happy) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy", + "Happy animal is already happy"); + goto out; + } + + example_animal_set_mood (animal, "Happy"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + g_assert_not_reached (); + + out: + return TRUE; /* to indicate that the method was handled */ +} + +/* Runs in thread we created GDBusServer in (since we didn't pass G_DBUS_SERVER_FLAGS_RUN_IN_THREAD) */ +static gboolean +codegen_on_new_connection (GDBusServer *server, + GDBusConnection *connection, + gpointer user_data) +{ + ExampleAnimal *animal = user_data; + GError *error = NULL; + + /* g_print ("Client connected.\n" */ + /* "Negotiated capabilities: unix-fd-passing=%d\n", */ + /* g_dbus_connection_get_capabilities (connection) & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING); */ + + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (animal), connection, + "/Example/Animals/000", &error); + g_assert_no_error (error); + + return TRUE; +} + +static gpointer +codegen_service_thread_func (gpointer user_data) +{ + GMainContext *service_context; + ExampleAnimal *animal; + GError *error = NULL; + + service_context = g_main_context_new (); + g_main_context_push_thread_default (service_context); + + /* Create the animal in the right thread context */ + animal = example_animal_skeleton_new (); + + /* Handle Poke() D-Bus method invocations on the .Animal interface */ + g_signal_connect (animal, "handle-poke", + G_CALLBACK (codegen_on_animal_poke), + NULL); /* user_data */ + + codegen_server = g_dbus_server_new_sync (tmp_address, + G_DBUS_SERVER_FLAGS_NONE, + test_guid, + NULL, /* observer */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_dbus_server_start (codegen_server); + + g_signal_connect (codegen_server, "new-connection", + G_CALLBACK (codegen_on_new_connection), + animal); + + service_loop = g_main_loop_new (service_context, FALSE); + g_main_loop_run (service_loop); + + g_object_unref (animal); + + g_main_context_pop_thread_default (service_context); + + g_main_loop_unref (service_loop); + g_main_context_unref (service_context); + + g_dbus_server_stop (codegen_server); + g_object_unref (codegen_server); + codegen_server = NULL; + + return NULL; +} + + +static gboolean +codegen_quit_mainloop_timeout (gpointer data) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static void +codegen_test_peer (void) +{ + GDBusConnection *connection; + ExampleAnimal *animal1, *animal2; + GThread *service_thread; + GError *error = NULL; + GVariant *value; + + /* bring up a server - we run the server in a different thread to avoid deadlocks */ + service_loop = NULL; + service_thread = g_thread_new ("codegen_test_peer", + codegen_service_thread_func, + NULL); + while (service_loop == NULL) + g_thread_yield (); + g_assert (codegen_server != NULL); + + /* Get an animal 1 ... */ + connection = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (codegen_server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (connection != NULL); + + animal1 = example_animal_proxy_new_sync (connection, 0, NULL, + "/Example/Animals/000", NULL, &error); + g_assert_no_error (error); + g_assert (animal1 != NULL); + g_object_unref (connection); + + /* Get animal 2 ... */ + connection = g_dbus_connection_new_for_address_sync (g_dbus_server_get_client_address (codegen_server), + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, /* GDBusAuthObserver */ + NULL, /* cancellable */ + &error); + g_assert_no_error (error); + g_assert (connection != NULL); + + animal2 = example_animal_proxy_new_sync (connection, 0, NULL, + "/Example/Animals/000", NULL, &error); + g_assert_no_error (error); + g_assert (animal2 != NULL); + g_object_unref (connection); + + /* Make animal sad via animal1 */ + example_animal_call_poke_sync (animal1, TRUE, FALSE, NULL, &error); + g_assert_no_error (error); + + /* Poke server and make sure animal is updated */ + value = g_dbus_proxy_call_sync (G_DBUS_PROXY (animal1), + "org.freedesktop.DBus.Peer.Ping", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_variant_unref (value); + + /* Give the proxies a chance to refresh in the defaul main loop */ + g_timeout_add (100, codegen_quit_mainloop_timeout, NULL); + g_main_loop_run (loop); + + /* Assert animals are sad */ + g_assert_cmpstr (example_animal_get_mood (animal1), ==, "Sad"); + g_assert_cmpstr (example_animal_get_mood (animal2), ==, "Sad"); + + /* Make animal happy via animal2 */ + example_animal_call_poke_sync (animal2, FALSE, TRUE, NULL, &error); + g_assert_no_error (error); + + /* Poke server and make sure animal is updated */ + value = g_dbus_proxy_call_sync (G_DBUS_PROXY (animal2), + "org.freedesktop.DBus.Peer.Ping", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, + NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_variant_unref (value); + + /* Give the proxies a chance to refresh in the defaul main loop */ + g_timeout_add (1000, codegen_quit_mainloop_timeout, NULL); + g_main_loop_run (loop); + + /* Assert animals are happy */ + g_assert_cmpstr (example_animal_get_mood (animal1), ==, "Happy"); + g_assert_cmpstr (example_animal_get_mood (animal2), ==, "Happy"); + + /* This final call making the animal happy and sad will cause + * the server to quit, when the server quits we dont get property + * change notifications anyway because those are done from an idle handler + */ + example_animal_call_poke_sync (animal2, TRUE, TRUE, NULL, &error); + + g_object_unref (animal1); + g_object_unref (animal2); + g_thread_join (service_thread); +} + +/* ---------------------------------------------------------------------------------------------------- */ + + +int +main (int argc, + char *argv[]) +{ + gint ret; + GDBusNodeInfo *introspection_data = NULL; + gchar *tmpdir = NULL; + + g_test_init (&argc, &argv, NULL); + + introspection_data = g_dbus_node_info_new_for_xml (test_interface_introspection_xml, NULL); + g_assert (introspection_data != NULL); + test_interface_introspection_data = introspection_data->interfaces[0]; + + test_guid = g_dbus_generate_guid (); + + if (is_unix) + { + if (g_unix_socket_address_abstract_names_supported ()) + tmp_address = g_strdup ("unix:tmpdir=/tmp/gdbus-test-"); + else + { + tmpdir = g_dir_make_tmp ("gdbus-test-XXXXXX", NULL); + tmp_address = g_strdup_printf ("unix:tmpdir=%s", tmpdir); + } + } + else + tmp_address = g_strdup ("nonce-tcp:"); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + g_test_add_func ("/gdbus/peer-to-peer", test_peer); + g_test_add_func ("/gdbus/delayed-message-processing", delayed_message_processing); + g_test_add_func ("/gdbus/nonce-tcp", test_nonce_tcp); + g_test_add_func ("/gdbus/tcp-anonymous", test_tcp_anonymous); + g_test_add_func ("/gdbus/credentials", test_credentials); + g_test_add_func ("/gdbus/overflow", test_overflow); + g_test_add_func ("/gdbus/codegen-peer-to-peer", codegen_test_peer); + + ret = g_test_run(); + + g_main_loop_unref (loop); + g_free (test_guid); + g_dbus_node_info_unref (introspection_data); + if (is_unix) + g_free (tmp_address); + if (tmpdir) + { + g_rmdir (tmpdir); + g_free (tmpdir); + } + + return ret; +} diff --git a/gio/tests/gdbus-proxy-threads.c b/gio/tests/gdbus-proxy-threads.c new file mode 100644 index 0000000..c74c05c --- /dev/null +++ b/gio/tests/gdbus-proxy-threads.c @@ -0,0 +1,249 @@ +/* Test case for GNOME #651133 + * + * Copyright (C) 2008-2010 Red Hat, Inc. + * Copyright (C) 2011 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. + * + * Author: Simon McVittie + */ + +#include + +#include +#include + +#include + +#include "gdbus-tests.h" + +#ifdef HAVE_DBUS1 +# include +#else +# define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" +# define DBUS_PATH_DBUS "/org/freedesktop/DBus" +# define DBUS_SERVICE_DBUS "org.freedesktop.DBus" +# define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1 +# define DBUS_RELEASE_NAME_REPLY_RELEASED 1 +#endif + +#define MY_NAME "com.example.Test.Myself" +/* This many threads create and destroy GDBusProxy instances, in addition + * to the main thread processing their NameOwnerChanged signals. + * N_THREADS_MAX is used with "-m slow", N_THREADS otherwise. + */ +#define N_THREADS_MAX 10 +#define N_THREADS 2 +/* This many GDBusProxy instances are created by each thread. */ +#define N_REPEATS 100 +/* The main thread requests/releases a name this many times as rapidly as + * possible, before performing one "slow" cycle that waits for each method + * call result (and therefore, due to D-Bus total ordering, all previous + * method calls) to prevent requests from piling up infinitely. The more calls + * are made rapidly, the better we reproduce bugs. + */ +#define N_RAPID_CYCLES 50 + +static GMainLoop *loop; + +static gpointer +run_proxy_thread (gpointer data) +{ + GDBusConnection *connection = data; + int i; + + g_assert (g_main_context_get_thread_default () == NULL); + + for (i = 0; i < N_REPEATS; i++) + { + GDBusProxy *proxy; + GError *error = NULL; + GVariant *ret; + + g_print ("."); + + proxy = g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START | + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, + MY_NAME, + "/com/example/TestObject", + "com.example.Frob", + NULL, + &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + g_dbus_proxy_set_default_timeout (proxy, G_MAXINT); + + ret = g_dbus_proxy_call_sync (proxy, "StupidMethod", NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, -1, + NULL, NULL); + /* + * we expect this to fail - if we have the name at the moment, we called + * an unimplemented method, and if not, there was nothing to call + */ + g_assert (ret == NULL); + + /* + * this races with the NameOwnerChanged signal being emitted in an + * idle + */ + g_object_unref (proxy); + } + + g_main_loop_quit (loop); + return NULL; +} + +static void release_name (GDBusConnection *connection, gboolean wait); + +static void +request_name_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (source); + GError *error = NULL; + GVariant *var; + + var = g_dbus_connection_call_finish (connection, res, &error); + g_assert_no_error (error); + g_assert_cmpuint (g_variant_get_uint32 (g_variant_get_child_value (var, 0)), + ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER); + + release_name (connection, TRUE); +} + +static void +request_name (GDBusConnection *connection, + gboolean wait) +{ + g_dbus_connection_call (connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "RequestName", + g_variant_new ("(su)", MY_NAME, 0), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + wait ? request_name_cb : NULL, + NULL); +} + +static void +release_name_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (source); + GError *error = NULL; + GVariant *var; + int i; + + var = g_dbus_connection_call_finish (connection, res, &error); + g_assert_no_error (error); + g_assert_cmpuint (g_variant_get_uint32 (g_variant_get_child_value (var, 0)), + ==, DBUS_RELEASE_NAME_REPLY_RELEASED); + + /* generate some rapid NameOwnerChanged signals to try to trigger crashes */ + for (i = 0; i < N_RAPID_CYCLES; i++) + { + request_name (connection, FALSE); + release_name (connection, FALSE); + } + + /* wait for dbus-daemon to catch up */ + request_name (connection, TRUE); +} + +static void +release_name (GDBusConnection *connection, + gboolean wait) +{ + g_dbus_connection_call (connection, + DBUS_SERVICE_DBUS, + DBUS_PATH_DBUS, + DBUS_INTERFACE_DBUS, + "ReleaseName", + g_variant_new ("(s)", MY_NAME), + G_VARIANT_TYPE ("(u)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + wait ? release_name_cb : NULL, + NULL); +} + +static void +test_proxy (void) +{ + GDBusConnection *connection; + GError *error = NULL; + GThread *proxy_threads[N_THREADS_MAX]; + int i; + int n_threads; + + if (g_test_slow ()) + n_threads = N_THREADS_MAX; + else + n_threads = N_THREADS; + + session_bus_up (); + + loop = g_main_loop_new (NULL, TRUE); + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, + &error); + g_assert_no_error (error); + + request_name (connection, TRUE); + + for (i = 0; i < n_threads; i++) + { + proxy_threads[i] = g_thread_new ("run-proxy", + run_proxy_thread, connection); + } + + g_main_loop_run (loop); + + for (i = 0; i < n_threads; i++) + { + g_thread_join (proxy_threads[i]); + } + + g_object_unref (connection); + g_main_loop_unref (loop); + + /* TODO: should call session_bus_down() but that requires waiting + * for all the oustanding method calls to complete... + */ +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/proxy/vs-threads", test_proxy); + + return g_test_run(); +} diff --git a/gio/tests/gdbus-proxy-well-known-name.c b/gio/tests/gdbus-proxy-well-known-name.c new file mode 100644 index 0000000..d0b7591 --- /dev/null +++ b/gio/tests/gdbus-proxy-well-known-name.c @@ -0,0 +1,273 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +proxy_new_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusProxy **ret = user_data; + GError *error; + + error = NULL; + *ret = g_dbus_proxy_new_finish (res, &error); + g_assert_no_error (error); + g_assert (ret != NULL); + + g_main_loop_quit (loop); +} + +static void +test_proxy_well_known_name (void) +{ + GDBusProxy *p; + GDBusProxy *p2; + GDBusProxy *ap; + GDBusProxy *ap2; + GDBusConnection *c; + GError *error; + gchar *name_owner; + gchar **property_names; + GVariant *variant; + GVariant *result; + + session_bus_up (); + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + error = NULL; + p = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo* */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + /* we shouldn't have a name owner nor any cached properties */ + g_assert_cmpstr (g_dbus_proxy_get_name_owner (p), ==, NULL); + g_assert (g_dbus_proxy_get_cached_property_names (p) == NULL); + + /* also for async: we shouldn't have a name owner nor any cached properties */ + g_dbus_proxy_new (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo* */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + NULL, /* GCancellable */ + (GAsyncReadyCallback) proxy_new_cb, + &ap); + g_main_loop_run (loop); + g_assert_cmpstr (g_dbus_proxy_get_name_owner (ap), ==, NULL); + g_assert (g_dbus_proxy_get_cached_property_names (ap) == NULL); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + /* check that we get the notify::g-name-owner signal */ + _g_assert_property_notify (p, "g-name-owner"); + + /* Now we should have a name owner as well as properties */ + name_owner = g_dbus_proxy_get_name_owner (p); + property_names = g_dbus_proxy_get_cached_property_names (p); + g_assert (g_dbus_is_unique_name (name_owner)); + g_assert (property_names != NULL && g_strv_length (property_names) > 0); + g_free (name_owner); + g_strfreev (property_names); + + /* if we create another proxy with the service being available, check that + * it has a name owner and properties + */ + error = NULL; + p2 = g_dbus_proxy_new_sync (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo* */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + name_owner = g_dbus_proxy_get_name_owner (p2); + property_names = g_dbus_proxy_get_cached_property_names (p2); + g_assert (g_dbus_is_unique_name (name_owner)); + g_assert (property_names != NULL && g_strv_length (property_names) > 0); + g_free (name_owner); + g_strfreev (property_names); + + /* also for async: we should have a name owner and cached properties */ + g_dbus_proxy_new (c, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo* */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface name */ + NULL, /* GCancellable */ + (GAsyncReadyCallback) proxy_new_cb, + &ap2); + g_main_loop_run (loop); + name_owner = g_dbus_proxy_get_name_owner (ap2); + property_names = g_dbus_proxy_get_cached_property_names (ap2); + g_assert (g_dbus_is_unique_name (name_owner)); + g_assert (property_names != NULL && g_strv_length (property_names) > 0); + g_free (name_owner); + g_strfreev (property_names); + + /* Check property value is the initial value */ + variant = g_dbus_proxy_get_cached_property (p, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (p2, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (ap, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (ap2, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + + /* Check that properties are updated on both p and p2 */ + result = g_dbus_proxy_call_sync (p, + "FrobSetProperty", + g_variant_new ("(sv)", + "y", + g_variant_new_byte (42)), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + _g_assert_signal_received (p, "g-properties-changed"); + variant = g_dbus_proxy_get_cached_property (p, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 42); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (p2, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 42); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (ap, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 42); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (ap2, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 42); + g_variant_unref (variant); + + /* Nuke the service and check that we get the signal and then don't + * have a name owner nor any cached properties + */ + result = g_dbus_proxy_call_sync (p, + "Quit", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + /* and wait... */ + _g_assert_property_notify (p, "g-name-owner"); + /* now we shouldn't have a name owner nor any cached properties */ + g_assert_cmpstr (g_dbus_proxy_get_name_owner (p), ==, NULL); + g_assert (g_dbus_proxy_get_cached_property_names (p) == NULL); + g_assert (g_dbus_proxy_get_cached_property (p, "y") == NULL); + + /* now bring back the server and wait for the proxy to be updated.. now + * the 'y' property should be back at 1... + */ + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + /* check that we get the notify::g-name-owner signal */ + _g_assert_property_notify (p, "g-name-owner"); + /* Now we should have a name owner as well as properties */ + name_owner = g_dbus_proxy_get_name_owner (p); + property_names = g_dbus_proxy_get_cached_property_names (p); + g_assert (g_dbus_is_unique_name (name_owner)); + g_assert (property_names != NULL && g_strv_length (property_names) > 0); + g_free (name_owner); + g_strfreev (property_names); + /* and finally check the 'y' property */ + variant = g_dbus_proxy_get_cached_property (p, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + + g_object_unref (p2); + g_object_unref (p); + g_object_unref (ap2); + g_object_unref (ap); + + g_object_unref (c); + + /* tear down bus */ + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + g_test_dbus_unset (); + + g_test_add_func ("/gdbus/proxy-well-known-name", test_proxy_well_known_name); + + ret = g_test_run(); + return ret; +} diff --git a/gio/tests/gdbus-proxy.c b/gio/tests/gdbus-proxy.c new file mode 100644 index 0000000..e9d94c4 --- /dev/null +++ b/gio/tests/gdbus-proxy.c @@ -0,0 +1,941 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a shared mainloop */ +static GMainLoop *loop = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that the method aspects of GDBusProxy works */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_methods (GDBusProxy *proxy) +{ + GVariant *result; + GError *error; + const gchar *str; + gchar *dbus_error_name; + + /* check that we can invoke a method */ + error = NULL; + result = g_dbus_proxy_call_sync (proxy, + "HelloWorld", + g_variant_new ("(s)", "Hey"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "(s)"); + g_variant_get (result, "(&s)", &str); + g_assert_cmpstr (str, ==, "You greeted me with 'Hey'. Thanks!"); + g_variant_unref (result); + + /* Check that we can completely recover the returned error */ + result = g_dbus_proxy_call_sync (proxy, + "HelloWorld", + g_variant_new ("(s)", "Yo"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DBUS_ERROR); + g_assert (g_dbus_error_is_remote_error (error)); + g_assert (g_dbus_error_is_remote_error (error)); + g_assert (result == NULL); + dbus_error_name = g_dbus_error_get_remote_error (error); + g_assert_cmpstr (dbus_error_name, ==, "com.example.TestException"); + g_free (dbus_error_name); + g_assert (g_dbus_error_strip_remote_error (error)); + g_assert_cmpstr (error->message, ==, "Yo is not a proper greeting"); + g_clear_error (&error); + + /* Check that we get a timeout if the method handling is taking longer than timeout */ + error = NULL; + result = g_dbus_proxy_call_sync (proxy, + "Sleep", + g_variant_new ("(i)", 500 /* msec */), + G_DBUS_CALL_FLAGS_NONE, + 100 /* msec */, + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_assert (!g_dbus_error_is_remote_error (error)); + g_assert (result == NULL); + g_clear_error (&error); + + /* Check that proxy-default timeouts work. */ + g_assert_cmpint (g_dbus_proxy_get_default_timeout (proxy), ==, -1); + + /* the default timeout is 25000 msec so this should work */ + result = g_dbus_proxy_call_sync (proxy, + "Sleep", + g_variant_new ("(i)", 500 /* msec */), + G_DBUS_CALL_FLAGS_NONE, + -1, /* use proxy default (e.g. -1 -> e.g. 25000 msec) */ + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + /* now set the proxy-default timeout to 250 msec and try the 500 msec call - this should FAIL */ + g_dbus_proxy_set_default_timeout (proxy, 250); + g_assert_cmpint (g_dbus_proxy_get_default_timeout (proxy), ==, 250); + result = g_dbus_proxy_call_sync (proxy, + "Sleep", + g_variant_new ("(i)", 500 /* msec */), + G_DBUS_CALL_FLAGS_NONE, + -1, /* use proxy default (e.g. 250 msec) */ + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_assert (!g_dbus_error_is_remote_error (error)); + g_assert (result == NULL); + g_clear_error (&error); + + /* clean up after ourselves */ + g_dbus_proxy_set_default_timeout (proxy, -1); +} + +static gboolean +strv_equal (gchar **strv, ...) +{ + gint count; + va_list list; + const gchar *str; + gboolean res; + + res = TRUE; + count = 0; + va_start (list, strv); + while (1) + { + str = va_arg (list, const gchar *); + if (str == NULL) + break; + if (g_strcmp0 (str, strv[count]) != 0) + { + res = FALSE; + break; + } + count++; + } + va_end (list); + + if (res) + res = g_strv_length (strv) == count; + + return res; +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that the property aspects of GDBusProxy works */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_properties (GDBusProxy *proxy) +{ + GError *error; + GVariant *variant; + GVariant *variant2; + GVariant *result; + gchar **names; + gchar *name_owner; + GDBusProxy *proxy2; + + error = NULL; + + if (g_dbus_proxy_get_flags (proxy) & G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES) + { + g_assert (g_dbus_proxy_get_cached_property_names (proxy) == NULL); + return; + } + + /* + * Check that we can list all cached properties. + */ + names = g_dbus_proxy_get_cached_property_names (proxy); + + g_assert (strv_equal (names, + "PropertyThatWillBeInvalidated", + "ab", + "ad", + "ai", + "an", + "ao", + "aq", + "as", + "at", + "au", + "ax", + "ay", + "b", + "d", + "foo", + "i", + "n", + "o", + "q", + "s", + "t", + "u", + "x", + "y", + NULL)); + + g_strfreev (names); + + /* + * Check that we can read cached properties. + * + * No need to test all properties - GVariant has already been tested + */ + variant = g_dbus_proxy_get_cached_property (proxy, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 1); + g_variant_unref (variant); + variant = g_dbus_proxy_get_cached_property (proxy, "o"); + g_assert (variant != NULL); + g_assert_cmpstr (g_variant_get_string (variant, NULL), ==, "/some/path"); + g_variant_unref (variant); + + /* + * Now ask the service to change a property and check that #GDBusProxy::g-property-changed + * is received. Also check that the cache is updated. + */ + variant2 = g_variant_new_byte (42); + result = g_dbus_proxy_call_sync (proxy, + "FrobSetProperty", + g_variant_new ("(sv)", + "y", + variant2), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + _g_assert_signal_received (proxy, "g-properties-changed"); + variant = g_dbus_proxy_get_cached_property (proxy, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 42); + g_variant_unref (variant); + + g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_byte (142)); + variant = g_dbus_proxy_get_cached_property (proxy, "y"); + g_assert (variant != NULL); + g_assert_cmpint (g_variant_get_byte (variant), ==, 142); + g_variant_unref (variant); + + g_dbus_proxy_set_cached_property (proxy, "y", NULL); + variant = g_dbus_proxy_get_cached_property (proxy, "y"); + g_assert (variant == NULL); + + /* Check that the invalidation feature of the PropertiesChanged() + * signal works... First, check that we have a cached value of the + * property (from the initial GetAll() call) + */ + variant = g_dbus_proxy_get_cached_property (proxy, "PropertyThatWillBeInvalidated"); + g_assert (variant != NULL); + g_assert_cmpstr (g_variant_get_string (variant, NULL), ==, "InitialValue"); + g_variant_unref (variant); + /* now ask to invalidate the property - this causes a + * + * PropertiesChanaged("com.example.Frob", + * {}, + * ["PropertyThatWillBeInvalidated") + * + * signal to be emitted. This is received before the method reply + * for FrobInvalidateProperty *but* since the proxy was created in + * the same thread as we're doing this synchronous call, we'll get + * the method reply before... + */ + result = g_dbus_proxy_call_sync (proxy, + "FrobInvalidateProperty", + g_variant_new ("(s)", "OMGInvalidated"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + /* ... hence we wait for the g-properties-changed signal to be delivered */ + _g_assert_signal_received (proxy, "g-properties-changed"); + /* ... and now we finally, check that the cached value has been invalidated */ + variant = g_dbus_proxy_get_cached_property (proxy, "PropertyThatWillBeInvalidated"); + g_assert (variant == NULL); + + /* Now test that G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES works - we need a new proxy for that */ + error = NULL; + proxy2 = g_dbus_proxy_new_sync (g_dbus_proxy_get_connection (proxy), + G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + name_owner = g_dbus_proxy_get_name_owner (proxy2); + g_assert (name_owner != NULL); + g_free (name_owner); + + variant = g_dbus_proxy_get_cached_property (proxy2, "PropertyThatWillBeInvalidated"); + g_assert (variant != NULL); + g_assert_cmpstr (g_variant_get_string (variant, NULL), ==, "OMGInvalidated"); /* from previous test */ + g_variant_unref (variant); + + result = g_dbus_proxy_call_sync (proxy2, + "FrobInvalidateProperty", + g_variant_new ("(s)", "OMGInvalidated2"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + /* this time we should get the ::g-properties-changed _with_ the value */ + _g_assert_signal_received (proxy2, "g-properties-changed"); + + variant = g_dbus_proxy_get_cached_property (proxy2, "PropertyThatWillBeInvalidated"); + g_assert (variant != NULL); + g_assert_cmpstr (g_variant_get_string (variant, NULL), ==, "OMGInvalidated2"); + g_variant_unref (variant); + + g_object_unref (proxy2); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* Test that the signal aspects of GDBusProxy works */ +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_proxy_signals_on_signal (GDBusProxy *proxy, + const gchar *sender_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GString *s = user_data; + + g_assert_cmpstr (signal_name, ==, "TestSignal"); + g_assert_cmpstr (g_variant_get_type_string (parameters), ==, "(sov)"); + + g_variant_print_string (parameters, s, TRUE); +} + +typedef struct +{ + GMainLoop *internal_loop; + GString *s; +} TestSignalData; + +static void +test_proxy_signals_on_emit_signal_cb (GDBusProxy *proxy, + GAsyncResult *res, + gpointer user_data) +{ + TestSignalData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_proxy_call_finish (proxy, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + /* check that the signal was recieved before we got the method result */ + g_assert (strlen (data->s->str) > 0); + + /* break out of the loop */ + g_main_loop_quit (data->internal_loop); +} + +static void +test_signals (GDBusProxy *proxy) +{ + GError *error; + GString *s; + gulong signal_handler_id; + TestSignalData data; + GVariant *result; + + error = NULL; + + /* + * Ask the service to emit a signal and check that we receive it. + * + * Note that blocking calls don't block in the mainloop so wait for the signal (which + * is dispatched before the method reply) + */ + s = g_string_new (NULL); + signal_handler_id = g_signal_connect (proxy, + "g-signal", + G_CALLBACK (test_proxy_signals_on_signal), + s); + + result = g_dbus_proxy_call_sync (proxy, + "EmitSignal", + g_variant_new ("(so)", + "Accept the next proposition you hear", + "/some/path"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + /* check that we haven't received the signal just yet */ + g_assert (strlen (s->str) == 0); + /* and now wait for the signal */ + _g_assert_signal_received (proxy, "g-signal"); + g_assert_cmpstr (s->str, + ==, + "('Accept the next proposition you hear .. in bed!', objectpath '/some/path/in/bed', <'a variant'>)"); + g_signal_handler_disconnect (proxy, signal_handler_id); + g_string_free (s, TRUE); + + /* + * Now do this async to check the signal is received before the method returns. + */ + s = g_string_new (NULL); + data.internal_loop = g_main_loop_new (NULL, FALSE); + data.s = s; + signal_handler_id = g_signal_connect (proxy, + "g-signal", + G_CALLBACK (test_proxy_signals_on_signal), + s); + g_dbus_proxy_call (proxy, + "EmitSignal", + g_variant_new ("(so)", + "You will make a great programmer", + "/some/other/path"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) test_proxy_signals_on_emit_signal_cb, + &data); + g_main_loop_run (data.internal_loop); + g_main_loop_unref (data.internal_loop); + g_assert_cmpstr (s->str, + ==, + "('You will make a great programmer .. in bed!', objectpath '/some/other/path/in/bed', <'a variant'>)"); + g_signal_handler_disconnect (proxy, signal_handler_id); + g_string_free (s, TRUE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_bogus_method_return (GDBusProxy *proxy) +{ + GError *error = NULL; + GVariant *result; + + result = g_dbus_proxy_call_sync (proxy, + "PairReturn", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + g_assert (result == NULL); +} + +#if 0 /* Disabled: see https://bugzilla.gnome.org/show_bug.cgi?id=658999 */ +static void +test_bogus_signal (GDBusProxy *proxy) +{ + GError *error = NULL; + GVariant *result; + GDBusInterfaceInfo *old_iface_info; + + result = g_dbus_proxy_call_sync (proxy, + "EmitSignal2", + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + /* and now wait for the signal that will never arrive */ + _g_assert_signal_received (proxy, "g-signal"); + } + g_test_trap_assert_stderr ("*Dropping signal TestSignal2 of type (i) since the type from the expected interface is (u)*"); + g_test_trap_assert_failed(); + + /* Our main branch will also do g_warning() when running the mainloop so + * temporarily remove the expected interface + */ + old_iface_info = g_dbus_proxy_get_interface_info (proxy); + g_dbus_proxy_set_interface_info (proxy, NULL); + _g_assert_signal_received (proxy, "g-signal"); + g_dbus_proxy_set_interface_info (proxy, old_iface_info); +} + +static void +test_bogus_property (GDBusProxy *proxy) +{ + GError *error = NULL; + GVariant *result; + GDBusInterfaceInfo *old_iface_info; + + /* Make the service emit a PropertiesChanged signal for property 'i' of type 'i' - since + * our introspection data has this as type 'u' we should get a warning on stderr. + */ + result = g_dbus_proxy_call_sync (proxy, + "FrobSetProperty", + g_variant_new ("(sv)", + "i", g_variant_new_int32 (42)), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + /* and now wait for the signal that will never arrive */ + _g_assert_signal_received (proxy, "g-properties-changed"); + } + g_test_trap_assert_stderr ("*Received property i with type i does not match expected type u in the expected interface*"); + g_test_trap_assert_failed(); + + /* Our main branch will also do g_warning() when running the mainloop so + * temporarily remove the expected interface + */ + old_iface_info = g_dbus_proxy_get_interface_info (proxy); + g_dbus_proxy_set_interface_info (proxy, NULL); + _g_assert_signal_received (proxy, "g-properties-changed"); + g_dbus_proxy_set_interface_info (proxy, old_iface_info); +} +#endif /* Disabled: see https://bugzilla.gnome.org/show_bug.cgi?id=658999 */ + +/* ---------------------------------------------------------------------------------------------------- */ + +static const gchar *frob_dbus_interface_xml = + "" + " " + /* PairReturn() is deliberately different from gdbus-testserver's definition */ + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + /* We deliberately only mention a single property here */ + " " + /* The 'i' property is deliberately different from gdbus-testserver's definition */ + " " + /* ::TestSignal2 is deliberately different from gdbus-testserver's definition */ + " " + " " + " " + " " + ""; +static GDBusInterfaceInfo *frob_dbus_interface_info; + +static void +test_expected_interface (GDBusProxy *proxy) +{ + GVariant *value; + GError *error; + + /* This is obviously wrong but expected interface is not set so we don't fail... */ + g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_string ("error_me_out!")); + g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_byte (42)); + g_dbus_proxy_set_cached_property (proxy, "does-not-exist", g_variant_new_string ("something")); + g_dbus_proxy_set_cached_property (proxy, "does-not-exist", NULL); + + /* Now repeat the method tests, with an expected interface set */ + g_dbus_proxy_set_interface_info (proxy, frob_dbus_interface_info); + test_methods (proxy); + test_signals (proxy); + + /* And also where we deliberately set the expected interface definition incorrectly */ + test_bogus_method_return (proxy); + /* Disabled: see https://bugzilla.gnome.org/show_bug.cgi?id=658999 + test_bogus_signal (proxy); + test_bogus_property (proxy); + */ + + if (g_test_undefined ()) + { + /* Also check that we complain if setting a cached property of the wrong type */ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_string ("error_me_out!")); + } + g_test_trap_assert_stderr ("*Trying to set property y of type s but according to the expected interface the type is y*"); + g_test_trap_assert_failed(); + } + + /* this should work, however (since the type is correct) */ + g_dbus_proxy_set_cached_property (proxy, "y", g_variant_new_byte (42)); + + if (g_test_undefined ()) + { + /* Try to get the value of a property where the type we expect is different from + * what we have in our cache (e.g. what the service returned) + */ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT | G_TEST_TRAP_SILENCE_STDERR)) + { + value = g_dbus_proxy_get_cached_property (proxy, "i"); + } + g_test_trap_assert_stderr ("*Trying to get property i with type i but according to the expected interface the type is u*"); + g_test_trap_assert_failed(); + } + + /* Even if a property does not exist in expected_interface, looking it + * up, or setting it, should never fail. Because it could be that the + * property has been added to the service but the GDBusInterfaceInfo* + * passed to g_dbus_proxy_set_interface_info() just haven't been updated. + * + * See https://bugzilla.gnome.org/show_bug.cgi?id=660886 + */ + value = g_dbus_proxy_get_cached_property (proxy, "d"); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)); + g_assert_cmpfloat (g_variant_get_double (value), ==, 7.5); + g_variant_unref (value); + /* update it via the cached property... */ + g_dbus_proxy_set_cached_property (proxy, "d", g_variant_new_double (75.0)); + /* ... and finally check that it has changed */ + value = g_dbus_proxy_get_cached_property (proxy, "d"); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)); + g_assert_cmpfloat (g_variant_get_double (value), ==, 75.0); + g_variant_unref (value); + /* now update it via the D-Bus interface... */ + error = NULL; + value = g_dbus_proxy_call_sync (proxy, "FrobSetProperty", + g_variant_new ("(sv)", "d", g_variant_new_double (85.0)), + G_DBUS_CALL_FLAGS_NONE, + -1, NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + g_assert_cmpstr (g_variant_get_type_string (value), ==, "()"); + g_variant_unref (value); + /* ...ensure we receive the ::PropertiesChanged signal... */ + _g_assert_signal_received (proxy, "g-properties-changed"); + /* ... and finally check that it has changed */ + value = g_dbus_proxy_get_cached_property (proxy, "d"); + g_assert (value != NULL); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE_DOUBLE)); + g_assert_cmpfloat (g_variant_get_double (value), ==, 85.0); + g_variant_unref (value); +} + +static void +test_basic (GDBusProxy *proxy) +{ + GDBusConnection *connection; + GDBusConnection *conn; + GDBusProxyFlags flags; + GDBusInterfaceInfo *info; + gchar *name; + gchar *path; + gchar *interface; + gint timeout; + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + g_assert (g_dbus_proxy_get_connection (proxy) == connection); + g_assert (g_dbus_proxy_get_flags (proxy) == G_DBUS_PROXY_FLAGS_NONE); + g_assert (g_dbus_proxy_get_interface_info (proxy) == NULL); + g_assert_cmpstr (g_dbus_proxy_get_name (proxy), ==, "com.example.TestService"); + g_assert_cmpstr (g_dbus_proxy_get_object_path (proxy), ==, "/com/example/TestObject"); + g_assert_cmpstr (g_dbus_proxy_get_interface_name (proxy), ==, "com.example.Frob"); + g_assert_cmpint (g_dbus_proxy_get_default_timeout (proxy), ==, -1); + + g_object_get (proxy, + "g-connection", &conn, + "g-interface-info", &info, + "g-flags", &flags, + "g-name", &name, + "g-object-path", &path, + "g-interface-name", &interface, + "g-default-timeout", &timeout, + NULL); + + g_assert (conn == connection); + g_assert (info == NULL); + g_assert_cmpint (flags, ==, G_DBUS_PROXY_FLAGS_NONE); + g_assert_cmpstr (name, ==, "com.example.TestService"); + g_assert_cmpstr (path, ==, "/com/example/TestObject"); + g_assert_cmpstr (interface, ==, "com.example.Frob"); + g_assert_cmpint (timeout, ==, -1); + + g_object_unref (conn); + g_free (name); + g_free (path); + g_free (interface); + + g_object_unref (connection); +} + +static void +kill_test_service (GDBusConnection *connection) +{ +#ifdef G_OS_UNIX + guint pid; + GVariant *ret; + GError *error = NULL; + const gchar *name = "com.example.TestService"; + + ret = g_dbus_connection_call_sync (connection, + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "GetConnectionUnixProcessID", + g_variant_new ("(s)", name), + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_variant_get (ret, "(u)", &pid); + g_variant_unref (ret); + kill (pid, SIGTERM); +#else + g_warning ("Can't kill com.example.TestService"); +#endif +} + +static void +test_proxy (void) +{ + GDBusProxy *proxy; + GDBusConnection *connection; + GError *error; + + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, + &error); + g_assert_no_error (error); + error = NULL; + proxy = g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + _g_assert_property_notify (proxy, "g-name-owner"); + + test_basic (proxy); + test_methods (proxy); + test_properties (proxy); + test_signals (proxy); + test_expected_interface (proxy); + + g_object_unref (proxy); + kill_test_service (connection); + g_object_unref (connection); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +proxy_ready (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GDBusProxy *proxy; + GError *error; + + error = NULL; + proxy = g_dbus_proxy_new_for_bus_finish (result, &error); + g_assert_no_error (error); + + _g_assert_property_notify (proxy, "g-name-owner"); + + test_basic (proxy); + test_methods (proxy); + test_properties (proxy); + test_signals (proxy); + test_expected_interface (proxy); + + kill_test_service (g_dbus_proxy_get_connection (proxy)); + g_object_unref (proxy); + g_main_loop_quit (loop); +} + +static gboolean +fail_test (gpointer user_data) +{ + g_assert_not_reached (); +} + +static void +test_async (void) +{ + g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + proxy_ready, + NULL); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + g_timeout_add (10000, fail_test, NULL); + g_main_loop_run (loop); +} + +static void +test_no_properties (void) +{ + GDBusProxy *proxy; + GError *error; + + error = NULL; + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + test_properties (proxy); + + g_object_unref (proxy); +} + +static void +check_error (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + GVariant *reply; + + reply = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), result, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + g_assert (reply == NULL); + g_error_free (error); + + g_main_loop_quit (loop); +} + +static void +test_wellknown_noauto (void) +{ + GError *error = NULL; + GDBusProxy *proxy; + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + NULL, "some.name.that.does.not.exist", + "/", "some.interface", NULL, &error); + g_assert_no_error (error); + g_assert (proxy != NULL); + + g_dbus_proxy_call (proxy, "method", NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, check_error, NULL); + g_timeout_add (10000, fail_test, NULL); + g_main_loop_run (loop); + g_object_unref (proxy); +} + +int +main (int argc, + char *argv[]) +{ + gint ret; + GDBusNodeInfo *introspection_data = NULL; + + g_test_init (&argc, &argv, NULL); + + introspection_data = g_dbus_node_info_new_for_xml (frob_dbus_interface_xml, NULL); + g_assert (introspection_data != NULL); + frob_dbus_interface_info = introspection_data->interfaces[0]; + + /* all the tests rely on a shared main loop */ + loop = g_main_loop_new (NULL, FALSE); + + session_bus_up (); + + g_test_add_func ("/gdbus/proxy", test_proxy); + g_test_add_func ("/gdbus/proxy/no-properties", test_no_properties); + g_test_add_func ("/gdbus/proxy/wellknown-noauto", test_wellknown_noauto); + g_test_add_func ("/gdbus/proxy/async", test_async); + + ret = g_test_run(); + + g_dbus_node_info_unref (introspection_data); + + session_bus_down (); + return ret; +} diff --git a/gio/tests/gdbus-serialization.c b/gio/tests/gdbus-serialization.c new file mode 100644 index 0000000..e94fc4d --- /dev/null +++ b/gio/tests/gdbus-serialization.c @@ -0,0 +1,1072 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include + +#include +#include +#include + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +hexdump (const guchar *str, gsize len) +{ + const guchar *data = (const guchar *) str; + guint n, m; + + for (n = 0; n < len; n += 16) + { + g_printerr ("%04x: ", n); + + for (m = n; m < n + 16; m++) + { + if (m > n && (m%4) == 0) + g_printerr (" "); + if (m < len) + g_printerr ("%02x ", data[m]); + else + g_printerr (" "); + } + + g_printerr (" "); + + for (m = n; m < len && m < n + 16; m++) + g_printerr ("%c", g_ascii_isprint (data[m]) ? data[m] : '.'); + + g_printerr ("\n"); + } +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +append_gv_to_dbus_iter (DBusMessageIter *iter, + GVariant *value, + GError **error) +{ + const GVariantType *type; + + type = g_variant_get_type (value); + if (g_variant_type_equal (type, G_VARIANT_TYPE_BOOLEAN)) + { + dbus_bool_t v = g_variant_get_boolean (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_BOOLEAN, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_BYTE)) + { + guint8 v = g_variant_get_byte (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_BYTE, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16)) + { + gint16 v = g_variant_get_int16 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT16, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16)) + { + guint16 v = g_variant_get_uint16 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT16, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32)) + { + gint32 v = g_variant_get_int32 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT32, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32)) + { + guint32 v = g_variant_get_uint32 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT32, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64)) + { + gint64 v = g_variant_get_int64 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_INT64, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64)) + { + guint64 v = g_variant_get_uint64 (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_UINT64, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE)) + { + gdouble v = g_variant_get_double (value); + dbus_message_iter_append_basic (iter, DBUS_TYPE_DOUBLE, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) + { + const gchar *v = g_variant_get_string (value, NULL); + dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH)) + { + const gchar *v = g_variant_get_string (value, NULL); + dbus_message_iter_append_basic (iter, DBUS_TYPE_OBJECT_PATH, &v); + } + else if (g_variant_type_equal (type, G_VARIANT_TYPE_SIGNATURE)) + { + const gchar *v = g_variant_get_string (value, NULL); + dbus_message_iter_append_basic (iter, DBUS_TYPE_SIGNATURE, &v); + } + else if (g_variant_type_is_variant (type)) + { + DBusMessageIter sub; + GVariant *child; + + child = g_variant_get_child_value (value, 0); + dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, + g_variant_get_type_string (child), + &sub); + if (!append_gv_to_dbus_iter (&sub, child, error)) + { + g_variant_unref (child); + goto fail; + } + dbus_message_iter_close_container (iter, &sub); + g_variant_unref (child); + } + else if (g_variant_type_is_array (type)) + { + DBusMessageIter dbus_iter; + const gchar *type_string; + GVariantIter gv_iter; + GVariant *item; + + type_string = g_variant_get_type_string (value); + type_string++; /* skip the 'a' */ + + dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY, + type_string, &dbus_iter); + g_variant_iter_init (&gv_iter, value); + + while ((item = g_variant_iter_next_value (&gv_iter))) + { + if (!append_gv_to_dbus_iter (&dbus_iter, item, error)) + { + goto fail; + } + } + + dbus_message_iter_close_container (iter, &dbus_iter); + } + else if (g_variant_type_is_tuple (type)) + { + DBusMessageIter dbus_iter; + GVariantIter gv_iter; + GVariant *item; + + dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, + NULL, &dbus_iter); + g_variant_iter_init (&gv_iter, value); + + while ((item = g_variant_iter_next_value (&gv_iter))) + { + if (!append_gv_to_dbus_iter (&dbus_iter, item, error)) + goto fail; + } + + dbus_message_iter_close_container (iter, &dbus_iter); + } + else if (g_variant_type_is_dict_entry (type)) + { + DBusMessageIter dbus_iter; + GVariant *key, *val; + + dbus_message_iter_open_container (iter, DBUS_TYPE_DICT_ENTRY, + NULL, &dbus_iter); + key = g_variant_get_child_value (value, 0); + if (!append_gv_to_dbus_iter (&dbus_iter, key, error)) + { + g_variant_unref (key); + goto fail; + } + g_variant_unref (key); + + val = g_variant_get_child_value (value, 1); + if (!append_gv_to_dbus_iter (&dbus_iter, val, error)) + { + g_variant_unref (val); + goto fail; + } + g_variant_unref (val); + + dbus_message_iter_close_container (iter, &dbus_iter); + } + else + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + "Error serializing GVariant with type-string `%s' to a D-Bus message", + g_variant_get_type_string (value)); + goto fail; + } + + return TRUE; + + fail: + return FALSE; +} + +static gboolean +append_gv_to_dbus_message (DBusMessage *message, + GVariant *value, + GError **error) +{ + gboolean ret; + guint n; + + ret = FALSE; + + if (value != NULL) + { + DBusMessageIter iter; + GVariantIter gv_iter; + GVariant *item; + + dbus_message_iter_init_append (message, &iter); + + g_variant_iter_init (&gv_iter, value); + n = 0; + while ((item = g_variant_iter_next_value (&gv_iter))) + { + if (!append_gv_to_dbus_iter (&iter, item, error)) + { + g_prefix_error (error, + "Error encoding in-arg %d: ", + n); + goto out; + } + n++; + } + } + + ret = TRUE; + + out: + return ret; +} + +static void +print_gv_dbus_message (GVariant *value) +{ + DBusMessage *message; + char *blob; + int blob_len; + GError *error; + + message = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL); + dbus_message_set_serial (message, 0x41); + dbus_message_set_path (message, "/foo/bar"); + dbus_message_set_member (message, "Member"); + + error = NULL; + if (!append_gv_to_dbus_message (message, value, &error)) + { + g_printerr ("Error printing GVariant as DBusMessage: %s", error->message); + g_error_free (error); + goto out; + } + + dbus_message_marshal (message, &blob, &blob_len); + g_printerr ("\n"); + hexdump ((guchar *) blob, blob_len); + out: + dbus_message_unref (message); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +dbus_1_message_append (GString *s, + guint indent, + DBusMessageIter *iter) +{ + gint arg_type; + DBusMessageIter sub; + + g_string_append_printf (s, "%*s", indent, ""); + + arg_type = dbus_message_iter_get_arg_type (iter); + switch (arg_type) + { + case DBUS_TYPE_BOOLEAN: + { + dbus_bool_t value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "bool: %s\n", value ? "true" : "false"); + break; + } + + case DBUS_TYPE_BYTE: + { + guchar value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "byte: 0x%02x\n", (guint) value); + break; + } + + case DBUS_TYPE_INT16: + { + gint16 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "int16: %" G_GINT16_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_UINT16: + { + guint16 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "uint16: %" G_GUINT16_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_INT32: + { + gint32 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "int32: %" G_GINT32_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_UINT32: + { + guint32 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "uint32: %" G_GUINT32_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_INT64: + { + gint64 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "int64: %" G_GINT64_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_UINT64: + { + guint64 value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "uint64: %" G_GUINT64_FORMAT "\n", value); + break; + } + + case DBUS_TYPE_DOUBLE: + { + gdouble value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "double: %f\n", value); + break; + } + + case DBUS_TYPE_STRING: + { + const gchar *value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "string: `%s'\n", value); + break; + } + + case DBUS_TYPE_OBJECT_PATH: + { + const gchar *value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "object_path: `%s'\n", value); + break; + } + + case DBUS_TYPE_SIGNATURE: + { + const gchar *value; + dbus_message_iter_get_basic (iter, &value); + g_string_append_printf (s, "signature: `%s'\n", value); + break; + } + +#ifdef DBUS_TYPE_UNIX_FD + case DBUS_TYPE_UNIX_FD: + { + /* unfortunately there's currently no way to get just the + * protocol value, since dbus_message_iter_get_basic() wants + * to be 'helpful' and dup the fd for the user... + */ + g_string_append (s, "unix-fd: (not extracted)\n"); + break; + } +#endif + + case DBUS_TYPE_VARIANT: + g_string_append_printf (s, "variant:\n"); + dbus_message_iter_recurse (iter, &sub); + while (dbus_message_iter_get_arg_type (&sub)) + { + dbus_1_message_append (s, indent + 2, &sub); + dbus_message_iter_next (&sub); + } + break; + + case DBUS_TYPE_ARRAY: + g_string_append_printf (s, "array:\n"); + dbus_message_iter_recurse (iter, &sub); + while (dbus_message_iter_get_arg_type (&sub)) + { + dbus_1_message_append (s, indent + 2, &sub); + dbus_message_iter_next (&sub); + } + break; + + case DBUS_TYPE_STRUCT: + g_string_append_printf (s, "struct:\n"); + dbus_message_iter_recurse (iter, &sub); + while (dbus_message_iter_get_arg_type (&sub)) + { + dbus_1_message_append (s, indent + 2, &sub); + dbus_message_iter_next (&sub); + } + break; + + case DBUS_TYPE_DICT_ENTRY: + g_string_append_printf (s, "dict_entry:\n"); + dbus_message_iter_recurse (iter, &sub); + while (dbus_message_iter_get_arg_type (&sub)) + { + dbus_1_message_append (s, indent + 2, &sub); + dbus_message_iter_next (&sub); + } + break; + + default: + g_printerr ("Error serializing D-Bus message to GVariant. Unsupported arg type `%c' (%d)", + arg_type, + arg_type); + g_assert_not_reached (); + break; + } +} + +static gchar * +dbus_1_message_print (DBusMessage *message) +{ + GString *s; + guint n; + DBusMessageIter iter; + + s = g_string_new (NULL); + n = 0; + dbus_message_iter_init (message, &iter); + while (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_INVALID) + { + g_string_append_printf (s, "value %d: ", n); + dbus_1_message_append (s, 2, &iter); + dbus_message_iter_next (&iter); + n++; + } + + return g_string_free (s, FALSE); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gchar * +get_body_signature (GVariant *value) +{ + const gchar *s; + gsize len; + gchar *ret; + + if (value == NULL) + { + ret = g_strdup (""); + goto out; + } + + s = g_variant_get_type_string (value); + len = strlen (s); + g_assert (len >= 2); + + ret = g_strndup (s + 1, len - 2); + + out: + return ret; +} + +static void +check_serialization (GVariant *value, + const gchar *expected_dbus_1_output) +{ + guchar *blob; + gsize blob_size; + DBusMessage *dbus_1_message; + GDBusMessage *message; + GDBusMessage *recovered_message; + GError *error; + DBusError dbus_error; + gchar *s; + gchar *s1; + guint n; + + message = g_dbus_message_new (); + g_dbus_message_set_body (message, value); + g_dbus_message_set_message_type (message, G_DBUS_MESSAGE_TYPE_METHOD_CALL); + g_dbus_message_set_serial (message, 0x41); + s = get_body_signature (value); + g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH, g_variant_new_object_path ("/foo/bar")); + g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, g_variant_new_string ("Member")); + g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE, g_variant_new_signature (s)); + g_free (s); + + /* First check that the serialization to the D-Bus wire format is correct - do this for both byte orders */ + for (n = 0; n < 2; n++) + { + GDBusMessageByteOrder byte_order; + switch (n) + { + case 0: + byte_order = G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN; + break; + case 1: + byte_order = G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN; + break; + case 2: + g_assert_not_reached (); + break; + } + g_dbus_message_set_byte_order (message, byte_order); + + error = NULL; + blob = g_dbus_message_to_blob (message, + &blob_size, + G_DBUS_CAPABILITY_FLAGS_NONE, + &error); + g_assert_no_error (error); + g_assert (blob != NULL); + + switch (byte_order) + { + case G_DBUS_MESSAGE_BYTE_ORDER_BIG_ENDIAN: + g_assert_cmpint (blob[0], ==, 'B'); + break; + case G_DBUS_MESSAGE_BYTE_ORDER_LITTLE_ENDIAN: + g_assert_cmpint (blob[0], ==, 'l'); + break; + } + + dbus_error_init (&dbus_error); + dbus_1_message = dbus_message_demarshal ((char *) blob, blob_size, &dbus_error); + if (dbus_error_is_set (&dbus_error)) + { + g_printerr ("Error calling dbus_message_demarshal() on this blob: %s: %s\n", + dbus_error.name, + dbus_error.message); + hexdump (blob, blob_size); + dbus_error_free (&dbus_error); + + s = g_variant_print (value, TRUE); + g_printerr ("\nThe blob was generated from the following GVariant value:\n%s\n\n", s); + g_free (s); + + g_printerr ("If the blob was encoded using DBusMessageIter, the payload would have been:\n"); + print_gv_dbus_message (value); + + g_assert_not_reached (); + } + + s = dbus_1_message_print (dbus_1_message); + dbus_message_unref (dbus_1_message); + + g_assert_cmpstr (s, ==, expected_dbus_1_output); + g_free (s); + + /* Then serialize back and check that the body is identical */ + + error = NULL; + recovered_message = g_dbus_message_new_from_blob (blob, + blob_size, + G_DBUS_CAPABILITY_FLAGS_NONE, + &error); + g_assert_no_error (error); + g_assert (recovered_message != NULL); + + if (value == NULL) + { + g_assert (g_dbus_message_get_body (recovered_message) == NULL); + } + else + { + g_assert (g_dbus_message_get_body (recovered_message) != NULL); + if (!g_variant_equal (g_dbus_message_get_body (recovered_message), value)) + { + s = g_variant_print (g_dbus_message_get_body (recovered_message), TRUE); + s1 = g_variant_print (value, TRUE); + g_printerr ("Recovered value:\n%s\ndoes not match given value\n%s\n", + s, + s1); + g_free (s); + g_free (s1); + g_assert_not_reached (); + } + } + g_object_unref (recovered_message); + } + + g_object_unref (message); +} + +static void +message_serialize_basic (void) +{ + check_serialization (NULL, ""); + + check_serialization (g_variant_new ("(sogybnqiuxtd)", + "this is a string", + "/this/is/a/path", + "sad", + 42, + TRUE, + -42, + 60000, + -44, + 100000, + -G_GINT64_CONSTANT(2)<<34, + G_GUINT64_CONSTANT(0xffffffffffffffff), + 42.5), + "value 0: string: `this is a string'\n" + "value 1: object_path: `/this/is/a/path'\n" + "value 2: signature: `sad'\n" + "value 3: byte: 0x2a\n" + "value 4: bool: true\n" + "value 5: int16: -42\n" + "value 6: uint16: 60000\n" + "value 7: int32: -44\n" + "value 8: uint32: 100000\n" + "value 9: int64: -34359738368\n" + "value 10: uint64: 18446744073709551615\n" + "value 11: double: 42.500000\n"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +message_serialize_complex (void) +{ + GError *error; + GVariant *value; + + error = NULL; + + value = g_variant_parse (G_VARIANT_TYPE ("(aia{ss})"), + "([1, 2, 3], {'one': 'white', 'two': 'black'})", + NULL, NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + check_serialization (value, + "value 0: array:\n" + " int32: 1\n" + " int32: 2\n" + " int32: 3\n" + "value 1: array:\n" + " dict_entry:\n" + " string: `one'\n" + " string: `white'\n" + " dict_entry:\n" + " string: `two'\n" + " string: `black'\n"); + + value = g_variant_parse (G_VARIANT_TYPE ("(sa{sv}as)"), + "('01234567890123456', {}, ['Something'])", + NULL, NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + check_serialization (value, + "value 0: string: `01234567890123456'\n" + "value 1: array:\n" + "value 2: array:\n" + " string: `Something'\n"); + + /* https://bugzilla.gnome.org/show_bug.cgi?id=621838 */ + check_serialization (g_variant_new_parsed ("(@aay [], {'cwd': <'/home/davidz/Hacking/glib/gio/tests'>})"), + "value 0: array:\n" + "value 1: array:\n" + " dict_entry:\n" + " string: `cwd'\n" + " variant:\n" + " string: `/home/davidz/Hacking/glib/gio/tests'\n"); + +#ifdef DBUS_TYPE_UNIX_FD + value = g_variant_parse (G_VARIANT_TYPE ("(hah)"), + "(42, [43, 44])", + NULL, NULL, &error); + g_assert_no_error (error); + g_assert (value != NULL); + /* about (not extracted), see comment in DBUS_TYPE_UNIX_FD case in + * dbus_1_message_append() above. + */ + check_serialization (value, + "value 0: unix-fd: (not extracted)\n" + "value 1: array:\n" + " unix-fd: (not extracted)\n" + " unix-fd: (not extracted)\n"); +#endif +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +replace (char *blob, + gsize len, + const char *before, + const char *after) +{ + gsize i; + gsize slen = strlen (before) + 1; + + g_assert_cmpuint (strlen (before), ==, strlen (after)); + g_assert_cmpuint (len, >=, slen); + + for (i = 0; i < (len - slen + 1); i++) + { + if (memcmp (blob + i, before, slen) == 0) + memcpy (blob + i, after, slen); + } +} + +static void +message_serialize_invalid (void) +{ + guint n; + + /* Other things we could check (note that GDBus _does_ check for all + * these things - we just don't have test-suit coverage for it) + * + * - array exceeding 64 MiB (2^26 bytes) - unfortunately libdbus-1 checks + * this, e.g. + * + * process 19620: arguments to dbus_message_iter_append_fixed_array() were incorrect, + * assertion "n_elements <= DBUS_MAXIMUM_ARRAY_LENGTH / _dbus_type_get_alignment (element_type)" + * failed in file dbus-message.c line 2344. + * This is normally a bug in some application using the D-Bus library. + * D-Bus not built with -rdynamic so unable to print a backtrace + * Aborted (core dumped) + * + * - message exceeding 128 MiB (2^27 bytes) + * + * - endianness, message type, flags, protocol version + */ + + for (n = 0; n < 3; n++) + { + GDBusMessage *message; + GError *error; + DBusMessage *dbus_message; + char *blob; + int blob_len; + /* these are in pairs with matching length */ + const gchar *valid_utf8_str = "this is valid..."; + const gchar *invalid_utf8_str = "this is invalid\xff"; + const gchar *valid_signature = "a{sv}a{sv}a{sv}aiai"; + const gchar *invalid_signature = "not valid signature"; + const gchar *valid_object_path = "/this/is/a/valid/dbus/object/path"; + const gchar *invalid_object_path = "/this/is/not a valid object path!"; + + dbus_message = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL); + dbus_message_set_serial (dbus_message, 0x41); + dbus_message_set_path (dbus_message, "/foo/bar"); + dbus_message_set_member (dbus_message, "Member"); + switch (n) + { + case 0: + /* invalid UTF-8 */ + dbus_message_append_args (dbus_message, + DBUS_TYPE_STRING, &valid_utf8_str, + DBUS_TYPE_INVALID); + break; + + case 1: + /* invalid object path */ + dbus_message_append_args (dbus_message, + DBUS_TYPE_OBJECT_PATH, &valid_object_path, + DBUS_TYPE_INVALID); + break; + + case 2: + /* invalid signature */ + dbus_message_append_args (dbus_message, + DBUS_TYPE_SIGNATURE, &valid_signature, + DBUS_TYPE_INVALID); + break; + + default: + g_assert_not_reached (); + break; + } + dbus_message_marshal (dbus_message, &blob, &blob_len); + /* hack up the message to be invalid by replacing each valid string + * with its invalid counterpart */ + replace (blob, blob_len, valid_utf8_str, invalid_utf8_str); + replace (blob, blob_len, valid_object_path, invalid_object_path); + replace (blob, blob_len, valid_signature, invalid_signature); + + error = NULL; + message = g_dbus_message_new_from_blob ((guchar *) blob, + blob_len, + G_DBUS_CAPABILITY_FLAGS_NONE, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + g_assert (message == NULL); + + dbus_free (blob); + } + +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +message_serialize_header_checks (void) +{ + GDBusMessage *message; + GDBusMessage *reply; + GError *error; + guchar *blob; + gsize blob_size; + + /* + * check we can't serialize messages with INVALID type + */ + message = g_dbus_message_new (); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: type is INVALID"); + g_error_free (error); + g_assert (blob == NULL); + g_object_unref (message); + + /* + * check we can't serialize signal messages with INTERFACE, PATH or MEMBER unset / set to reserved value + */ + message = g_dbus_message_new_signal ("/the/path", "The.Interface", "TheMember"); + /* ----- */ + /* interface NULL => error */ + g_dbus_message_set_interface (message, NULL); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* interface reserved value => error */ + g_dbus_message_set_interface (message, "org.freedesktop.DBus.Local"); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local"); + g_error_free (error); + g_assert (blob == NULL); + /* reset interface */ + g_dbus_message_set_interface (message, "The.Interface"); + /* ----- */ + /* path NULL => error */ + g_dbus_message_set_path (message, NULL); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* path reserved value => error */ + g_dbus_message_set_path (message, "/org/freedesktop/DBus/Local"); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local"); + g_error_free (error); + g_assert (blob == NULL); + /* reset path */ + g_dbus_message_set_path (message, "/the/path"); + /* ----- */ + /* member NULL => error */ + g_dbus_message_set_member (message, NULL); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* reset member */ + g_dbus_message_set_member (message, "TheMember"); + /* ----- */ + /* done */ + g_object_unref (message); + + /* + * check that we can't serialize method call messages with PATH or MEMBER unset + */ + message = g_dbus_message_new_method_call (NULL, "/the/path", NULL, "TheMember"); + /* ----- */ + /* path NULL => error */ + g_dbus_message_set_path (message, NULL); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* reset path */ + g_dbus_message_set_path (message, "/the/path"); + /* ----- */ + /* member NULL => error */ + g_dbus_message_set_member (message, NULL); + error = NULL; + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* reset member */ + g_dbus_message_set_member (message, "TheMember"); + /* ----- */ + /* done */ + g_object_unref (message); + + /* + * check that we can't serialize method reply messages with REPLY_SERIAL unset + */ + message = g_dbus_message_new_method_call (NULL, "/the/path", NULL, "TheMember"); + g_dbus_message_set_serial (message, 42); + /* method reply */ + reply = g_dbus_message_new_method_reply (message); + g_assert_cmpint (g_dbus_message_get_reply_serial (reply), ==, 42); + g_dbus_message_set_header (reply, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, NULL); + error = NULL; + blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_RETURN message: REPLY_SERIAL header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + g_object_unref (reply); + /* method error - first nuke ERROR_NAME, then REPLY_SERIAL */ + reply = g_dbus_message_new_method_error (message, "Some.Error.Name", "the message"); + g_assert_cmpint (g_dbus_message_get_reply_serial (reply), ==, 42); + /* nuke ERROR_NAME */ + g_dbus_message_set_error_name (reply, NULL); + error = NULL; + blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + /* reset ERROR_NAME */ + g_dbus_message_set_error_name (reply, "Some.Error.Name"); + /* nuke REPLY_SERIAL */ + g_dbus_message_set_header (reply, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, NULL); + error = NULL; + blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"); + g_error_free (error); + g_assert (blob == NULL); + g_object_unref (reply); + g_object_unref (message); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +message_parse_empty_arrays_of_arrays (void) +{ + GVariant *body; + GError *error = NULL; + + g_test_bug ("673612"); + /* These three-element array of empty arrays were previously read back as a + * two-element array of empty arrays, due to sometimes erroneously skipping + * four bytes to align for the eight-byte-aligned grandchild types (x and + * dict_entry). + */ + body = g_variant_parse (G_VARIANT_TYPE ("(aaax)"), + "([@aax [], [], []],)", NULL, NULL, &error); + g_assert_no_error (error); + check_serialization (body, + "value 0: array:\n" + " array:\n" + " array:\n" + " array:\n"); + + body = g_variant_parse (G_VARIANT_TYPE ("(aaa{uu})"), + "([@aa{uu} [], [], []],)", NULL, NULL, &error); + g_assert_no_error (error); + check_serialization (body, + "value 0: array:\n" + " array:\n" + " array:\n" + " array:\n"); + + /* Due to the same bug, g_dbus_message_new_from_blob() would fail for this + * message because it would try to read past the end of the string. Hence, + * sending this to an application would make it fall off the bus. */ + body = g_variant_parse (G_VARIANT_TYPE ("(a(aa{sv}as))"), + "([ ([], [])," + " ([], [])," + " ([], [])],)", NULL, NULL, &error); + g_assert_no_error (error); + check_serialization (body, + "value 0: array:\n" + " struct:\n" + " array:\n" + " array:\n" + " struct:\n" + " array:\n" + " array:\n" + " struct:\n" + " array:\n" + " array:\n"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + setlocale (LC_ALL, "C"); + + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("https://bugzilla.gnome.org/show_bug.cgi?id="); + + g_test_add_func ("/gdbus/message-serialize-basic", message_serialize_basic); + g_test_add_func ("/gdbus/message-serialize-complex", message_serialize_complex); + g_test_add_func ("/gdbus/message-serialize-invalid", message_serialize_invalid); + g_test_add_func ("/gdbus/message-serialize-header-checks", message_serialize_header_checks); + + g_test_add_func ("/gdbus/message-parse-empty-arrays-of-arrays", + message_parse_empty_arrays_of_arrays); + + return g_test_run(); +} + diff --git a/gio/tests/gdbus-sessionbus.c b/gio/tests/gdbus-sessionbus.c new file mode 100644 index 0000000..68c4449 --- /dev/null +++ b/gio/tests/gdbus-sessionbus.c @@ -0,0 +1,49 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2012 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Xavier Claessens + */ + +#include "gdbus-sessionbus.h" + +static GTestDBus *singleton = NULL; + +void +session_bus_up (void) +{ + g_assert (singleton == NULL); + singleton = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (singleton); +} + +void +session_bus_stop (void) +{ + g_assert (singleton != NULL); + g_test_dbus_stop (singleton); +} + +void +session_bus_down (void) +{ + g_assert (singleton != NULL); + g_test_dbus_down (singleton); + g_clear_object (&singleton); +} + diff --git a/gio/tests/gdbus-sessionbus.h b/gio/tests/gdbus-sessionbus.h new file mode 100644 index 0000000..7ef3abd --- /dev/null +++ b/gio/tests/gdbus-sessionbus.h @@ -0,0 +1,36 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2012 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Xavier Claessens + */ + +#ifndef __SESSION_BUS_H__ +#define __SESSION_BUS_H__ + +#include + +G_BEGIN_DECLS + +void session_bus_up (void); +void session_bus_stop (void); +void session_bus_down (void); + +G_END_DECLS + +#endif /* __SESSION_BUS_H__ */ diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c new file mode 100644 index 0000000..4e8383a --- /dev/null +++ b/gio/tests/gdbus-test-codegen.c @@ -0,0 +1,2372 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2011 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: David Zeuthen + */ + +#include +#include +#include +#include + +#include "gdbus-tests.h" + +#include "gdbus-test-codegen-generated.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static guint +count_annotations (GDBusAnnotationInfo **annotations) +{ + guint ret; + ret = 0; + while (annotations != NULL && annotations[ret] != NULL) + ret++; + return ret; +} + +/* checks that + * + * - non-internal annotations are written out correctly; and + * - injection via --annotation --key --value works + */ +static void +test_annotations (void) +{ + GDBusInterfaceInfo *iface; + GDBusMethodInfo *method; + GDBusSignalInfo *signal; + GDBusPropertyInfo *property; + + iface = foo_igen_bar_interface_info (); + g_assert (iface != NULL); + + /* see Makefile.am for where these annotations are injected */ + g_assert_cmpint (count_annotations (iface->annotations), ==, 1); + g_assert_cmpstr (g_dbus_annotation_info_lookup (iface->annotations, "Key1"), ==, "Value1"); + + method = g_dbus_interface_info_lookup_method (iface, "HelloWorld"); + g_assert (method != NULL); + g_assert_cmpint (count_annotations (method->annotations), ==, 2); + g_assert_cmpstr (g_dbus_annotation_info_lookup (method->annotations, "ExistingAnnotation"), ==, "blah"); + g_assert_cmpstr (g_dbus_annotation_info_lookup (method->annotations, "Key3"), ==, "Value3"); + + signal = g_dbus_interface_info_lookup_signal (iface, "TestSignal"); + g_assert (signal != NULL); + g_assert_cmpint (count_annotations (signal->annotations), ==, 1); + g_assert_cmpstr (g_dbus_annotation_info_lookup (signal->annotations, "Key4"), ==, "Value4"); + g_assert_cmpstr (g_dbus_annotation_info_lookup (signal->args[1]->annotations, "Key8"), ==, "Value8"); + + property = g_dbus_interface_info_lookup_property (iface, "ay"); + g_assert (property != NULL); + g_assert_cmpint (count_annotations (property->annotations), ==, 1); + g_assert_cmpstr (g_dbus_annotation_info_lookup (property->annotations, "Key5"), ==, "Value5"); + + method = g_dbus_interface_info_lookup_method (iface, "TestPrimitiveTypes"); + g_assert (method != NULL); + g_assert_cmpstr (g_dbus_annotation_info_lookup (method->in_args[4]->annotations, "Key6"), ==, "Value6"); + g_assert_cmpstr (g_dbus_annotation_info_lookup (method->out_args[5]->annotations, "Key7"), ==, "Value7"); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_handle_hello_world (FooiGenBar *object, + GDBusMethodInvocation *invocation, + const gchar *greeting, + gpointer user_data) +{ + gchar *response; + response = g_strdup_printf ("Word! You said `%s'. I'm Skeleton, btw!", greeting); + foo_igen_bar_complete_hello_world (object, invocation, response); + g_free (response); + return TRUE; +} + +static gboolean +on_handle_test_primitive_types (FooiGenBar *object, + GDBusMethodInvocation *invocation, + guchar val_byte, + gboolean val_boolean, + gint16 val_int16, + guint16 val_uint16, + gint val_int32, + guint val_uint32, + gint64 val_int64, + guint64 val_uint64, + gdouble val_double, + const gchar *val_string, + const gchar *val_objpath, + const gchar *val_signature, + const gchar *val_bytestring, + gpointer user_data) +{ + gchar *s1; + gchar *s2; + gchar *s3; + s1 = g_strdup_printf ("Word! You said `%s'. Rock'n'roll!", val_string); + s2 = g_strdup_printf ("/modified%s", val_objpath); + s3 = g_strdup_printf ("assgit%s", val_signature); + foo_igen_bar_complete_test_primitive_types (object, + invocation, + 10 + val_byte, + !val_boolean, + 100 + val_int16, + 1000 + val_uint16, + 10000 + val_int32, + 100000 + val_uint32, + 1000000 + val_int64, + 10000000 + val_uint64, + val_double / G_PI, + s1, + s2, + s3, + "bytestring!\xff"); + g_free (s1); + g_free (s2); + g_free (s3); + return TRUE; +} + +static gboolean +on_handle_test_non_primitive_types (FooiGenBar *object, + GDBusMethodInvocation *invocation, + GVariant *dict_s_to_s, + GVariant *dict_s_to_pairs, + GVariant *a_struct, + const gchar* const *array_of_strings, + const gchar* const *array_of_objpaths, + GVariant *array_of_signatures, + const gchar* const *array_of_bytestrings, + gpointer user_data) +{ + gchar *s; + GString *str; + str = g_string_new (NULL); + s = g_variant_print (dict_s_to_s, TRUE); g_string_append (str, s); g_free (s); + s = g_variant_print (dict_s_to_pairs, TRUE); g_string_append (str, s); g_free (s); + s = g_variant_print (a_struct, TRUE); g_string_append (str, s); g_free (s); + s = g_strjoinv (", ", (gchar **) array_of_strings); + g_string_append_printf (str, "array_of_strings: [%s] ", s); + g_free (s); + s = g_strjoinv (", ", (gchar **) array_of_objpaths); + g_string_append_printf (str, "array_of_objpaths: [%s] ", s); + g_free (s); + s = g_variant_print (array_of_signatures, TRUE); + g_string_append_printf (str, "array_of_signatures: %s ", s); + g_free (s); + s = g_strjoinv (", ", (gchar **) array_of_bytestrings); + g_string_append_printf (str, "array_of_bytestrings: [%s] ", s); + g_free (s); + foo_igen_bar_complete_test_non_primitive_types (object, invocation, str->str); + g_string_free (str, TRUE); + return TRUE; +} + +static gboolean +on_handle_request_signal_emission (FooiGenBar *object, + GDBusMethodInvocation *invocation, + gint which_one, + gpointer user_data) +{ + if (which_one == 0) + { + const gchar *a_strv[] = {"foo", "bar", NULL}; + const gchar *a_bytestring_array[] = {"foo\xff", "bar\xff", NULL}; + GVariant *a_variant = g_variant_new_parsed ("{'first': (42, 42), 'second': (43, 43)}"); + foo_igen_bar_emit_test_signal (object, 43, a_strv, a_bytestring_array, a_variant); /* consumes a_variant */ + foo_igen_bar_complete_request_signal_emission (object, invocation); + } + return TRUE; +} + +static gboolean +on_handle_request_multi_property_mods (FooiGenBar *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1); + foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1); + foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1); + foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1); + g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (object)); + foo_igen_bar_set_y (object, foo_igen_bar_get_y (object) + 1); + foo_igen_bar_set_i (object, foo_igen_bar_get_i (object) + 1); + foo_igen_bar_complete_request_multi_property_mods (object, invocation); + return TRUE; +} + +static gboolean +on_handle_property_cancellation (FooiGenBar *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + guint n; + n = foo_igen_bar_get_n (object); + /* This queues up a PropertiesChange event */ + foo_igen_bar_set_n (object, n + 1); + /* this modifies the queued up event */ + foo_igen_bar_set_n (object, n); + /* this flushes all PropertiesChanges event (sends the D-Bus message right + * away, if any - there should not be any) + */ + g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (object)); + /* this makes us return the reply D-Bus method */ + foo_igen_bar_complete_property_cancellation (object, invocation); + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_handle_force_method (FooiGenBat *object, + GDBusMethodInvocation *invocation, + GVariant *force_in_i, + GVariant *force_in_s, + GVariant *force_in_ay, + GVariant *force_in_struct, + gpointer user_data) +{ + GVariant *ret_i; + GVariant *ret_s; + GVariant *ret_ay; + GVariant *ret_struct; + gint32 val; + gchar *s; + + ret_i = g_variant_new_int32 (g_variant_get_int32 (force_in_i) + 10); + s = g_strdup_printf ("%s_foo", g_variant_get_string (force_in_s, NULL)); + ret_s = g_variant_new_string (s); + g_free (s); + s = g_strdup_printf ("%s_foo\xff", g_variant_get_bytestring (force_in_ay)); + ret_ay = g_variant_new_bytestring (s); + g_free (s); + + g_variant_get (force_in_struct, "(i)", &val); + ret_struct = g_variant_new ("(i)", val + 10); + + g_variant_ref_sink (ret_i); + g_variant_ref_sink (ret_s); + g_variant_ref_sink (ret_ay); + g_variant_ref_sink (ret_struct); + + foo_igen_bat_emit_force_signal (object, + ret_i, + ret_s, + ret_ay, + ret_struct); + + foo_igen_bat_complete_force_method (object, + invocation, + ret_i, + ret_s, + ret_ay, + ret_struct); + + g_variant_unref (ret_i); + g_variant_unref (ret_s); + g_variant_unref (ret_ay); + g_variant_unref (ret_struct); + + return TRUE; +} + + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +my_g_authorize_method_handler (GDBusInterfaceSkeleton *interface, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *method_name; + gboolean authorized; + + authorized = FALSE; + + method_name = g_dbus_method_invocation_get_method_name (invocation); + if (g_strcmp0 (method_name, "CheckNotAuthorized") == 0) + { + authorized = FALSE; + } + else if (g_strcmp0 (method_name, "CheckAuthorized") == 0) + { + authorized = TRUE; + } + else if (g_strcmp0 (method_name, "CheckNotAuthorizedFromObject") == 0) + { + authorized = TRUE; + } + else + { + g_assert_not_reached (); + } + + if (!authorized) + { + g_dbus_method_invocation_return_error (invocation, + G_IO_ERROR, + G_IO_ERROR_PERMISSION_DENIED, + "not authorized..."); + } + return authorized; +} + +static gboolean +my_object_authorize_method_handler (GDBusObjectSkeleton *object, + GDBusInterfaceSkeleton *interface, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + const gchar *method_name; + gboolean authorized; + + authorized = FALSE; + + method_name = g_dbus_method_invocation_get_method_name (invocation); + if (g_strcmp0 (method_name, "CheckNotAuthorized") == 0) + { + authorized = TRUE; + } + else if (g_strcmp0 (method_name, "CheckAuthorized") == 0) + { + authorized = TRUE; + } + else if (g_strcmp0 (method_name, "CheckNotAuthorizedFromObject") == 0) + { + authorized = FALSE; + } + else + { + g_assert_not_reached (); + } + + if (!authorized) + { + g_dbus_method_invocation_return_error (invocation, + G_IO_ERROR, + G_IO_ERROR_PENDING, + "not authorized (from object)..."); + } + return authorized; +} + +static gboolean +on_handle_check_not_authorized (FooiGenAuthorize *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + foo_igen_authorize_complete_check_not_authorized (object, invocation); + return TRUE; +} + +static gboolean +on_handle_check_authorized (FooiGenAuthorize *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + foo_igen_authorize_complete_check_authorized (object, invocation); + return TRUE; +} + +static gboolean +on_handle_check_not_authorized_from_object (FooiGenAuthorize *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + foo_igen_authorize_complete_check_not_authorized_from_object (object, invocation); + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gboolean +on_handle_get_self (FooiGenMethodThreads *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + gchar *s; + s = g_strdup_printf ("%p", g_thread_self ()); + foo_igen_method_threads_complete_get_self (object, invocation, s); + g_free (s); + return TRUE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GThread *method_handler_thread = NULL; + +static FooiGenBar *exported_bar_object = NULL; +static FooiGenBat *exported_bat_object = NULL; +static FooiGenAuthorize *exported_authorize_object = NULL; +static GDBusObjectSkeleton *authorize_enclosing_object = NULL; +static FooiGenMethodThreads *exported_thread_object_1 = NULL; +static FooiGenMethodThreads *exported_thread_object_2 = NULL; + +static void +unexport_objects (void) +{ + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bar_object)); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bat_object)); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_authorize_object)); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1)); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2)); +} + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GError *error; + + /* Test that we can export an object using the generated + * FooiGenBarSkeleton subclass. Notes: + * + * 1. We handle methods by simply connecting to the appropriate + * GObject signal. + * + * 2. Property storage is taken care of by the class; we can + * use g_object_get()/g_object_set() (and the generated + * C bindings at will) + */ + error = NULL; + exported_bar_object = foo_igen_bar_skeleton_new (); + foo_igen_bar_set_ay (exported_bar_object, "ABCabc"); + foo_igen_bar_set_y (exported_bar_object, 42); + foo_igen_bar_set_d (exported_bar_object, 43.0); + foo_igen_bar_set_finally_normal_name (exported_bar_object, "There aint no place like home"); + foo_igen_bar_set_writeonly_property (exported_bar_object, "Mr. Burns"); + + /* The following works because it's on the Skeleton object - it will + * fail (at run-time) on a Proxy (see on_proxy_appeared() below) + */ + foo_igen_bar_set_readonly_property (exported_bar_object, "blah"); + g_assert_cmpstr (foo_igen_bar_get_writeonly_property (exported_bar_object), ==, "Mr. Burns"); + + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_bar_object), + connection, + "/bar", + &error); + g_assert_no_error (error); + g_signal_connect (exported_bar_object, + "handle-hello-world", + G_CALLBACK (on_handle_hello_world), + NULL); + g_signal_connect (exported_bar_object, + "handle-test-primitive-types", + G_CALLBACK (on_handle_test_primitive_types), + NULL); + g_signal_connect (exported_bar_object, + "handle-test-non-primitive-types", + G_CALLBACK (on_handle_test_non_primitive_types), + NULL); + g_signal_connect (exported_bar_object, + "handle-request-signal-emission", + G_CALLBACK (on_handle_request_signal_emission), + NULL); + g_signal_connect (exported_bar_object, + "handle-request-multi-property-mods", + G_CALLBACK (on_handle_request_multi_property_mods), + NULL); + g_signal_connect (exported_bar_object, + "handle-property-cancellation", + G_CALLBACK (on_handle_property_cancellation), + NULL); + + exported_bat_object = foo_igen_bat_skeleton_new (); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_bat_object), + connection, + "/bat", + &error); + g_assert_no_error (error); + g_signal_connect (exported_bat_object, + "handle-force-method", + G_CALLBACK (on_handle_force_method), + NULL); + g_object_set (exported_bat_object, + "force-i", g_variant_new_int32 (43), + "force-s", g_variant_new_string ("prop string"), + "force-ay", g_variant_new_bytestring ("prop bytestring\xff"), + "force-struct", g_variant_new ("(i)", 4300), + NULL); + + authorize_enclosing_object = g_dbus_object_skeleton_new ("/authorize"); + g_signal_connect (authorize_enclosing_object, + "authorize-method", + G_CALLBACK (my_object_authorize_method_handler), + NULL); + exported_authorize_object = foo_igen_authorize_skeleton_new (); + g_dbus_object_skeleton_add_interface (authorize_enclosing_object, + G_DBUS_INTERFACE_SKELETON (exported_authorize_object)); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_authorize_object), + connection, + "/authorize", + &error); + g_assert_no_error (error); + g_signal_connect (exported_authorize_object, + "g-authorize-method", + G_CALLBACK (my_g_authorize_method_handler), + NULL); + g_signal_connect (exported_authorize_object, + "handle-check-not-authorized", + G_CALLBACK (on_handle_check_not_authorized), + NULL); + g_signal_connect (exported_authorize_object, + "handle-check-authorized", + G_CALLBACK (on_handle_check_authorized), + NULL); + g_signal_connect (exported_authorize_object, + "handle-check-not-authorized-from-object", + G_CALLBACK (on_handle_check_not_authorized_from_object), + NULL); + + + /* only object 1 has the G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD flag set */ + exported_thread_object_1 = foo_igen_method_threads_skeleton_new (); + g_dbus_interface_skeleton_set_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1), + G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD); + + g_assert (!g_dbus_interface_skeleton_has_connection (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1), connection)); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1), + connection, + "/method_threads_1", + &error); + g_assert_no_error (error); + g_signal_connect (exported_thread_object_1, + "handle-get-self", + G_CALLBACK (on_handle_get_self), + NULL); + g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD); + + exported_thread_object_2 = foo_igen_method_threads_skeleton_new (); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2), + connection, + "/method_threads_2", + &error); + g_assert_no_error (error); + g_signal_connect (exported_thread_object_2, + "handle-get-self", + G_CALLBACK (on_handle_get_self), + NULL); + + g_assert_cmpint (g_dbus_interface_skeleton_get_flags (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2)), ==, G_DBUS_INTERFACE_SKELETON_FLAGS_NONE); + + method_handler_thread = g_thread_self (); +} + +static gpointer check_proxies_in_thread (gpointer user_data); + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + GMainLoop *loop = user_data; + + g_thread_new ("check-proxies", + check_proxies_in_thread, + loop); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_assert_not_reached (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMainLoop *thread_loop; + gint initial_y; + gint initial_i; + guint num_g_properties_changed; + gboolean received_test_signal; + guint num_notify_u; + guint num_notify_n; +} ClientData; + +static void +on_notify_u (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + ClientData *data = user_data; + g_assert_cmpstr (pspec->name, ==, "u"); + data->num_notify_u += 1; +} + +static void +on_notify_n (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + ClientData *data = user_data; + g_assert_cmpstr (pspec->name, ==, "n"); + data->num_notify_n += 1; +} + +static void +on_g_properties_changed (GDBusProxy *_proxy, + GVariant *changed_properties, + const gchar* const *invalidated_properties, + gpointer user_data) +{ + ClientData *data = user_data; + FooiGenBar *proxy = FOO_IGEN_BAR (_proxy); + + g_assert_cmpint (g_variant_n_children (changed_properties), ==, 2); + + if (data->num_g_properties_changed == 0) + { + g_assert_cmpint (data->initial_y, ==, foo_igen_bar_get_y (proxy) - 2); + g_assert_cmpint (data->initial_i, ==, foo_igen_bar_get_i (proxy) - 2); + } + else if (data->num_g_properties_changed == 1) + { + g_assert_cmpint (data->initial_y, ==, foo_igen_bar_get_y (proxy) - 3); + g_assert_cmpint (data->initial_i, ==, foo_igen_bar_get_i (proxy) - 3); + } + else + g_assert_not_reached (); + + data->num_g_properties_changed++; + + if (data->num_g_properties_changed == 2) + g_main_loop_quit (data->thread_loop); +} + +static void +on_test_signal (FooiGenBar *proxy, + gint val_int32, + const gchar* const *array_of_strings, + const gchar* const *array_of_bytestrings, + GVariant *dict_s_to_pairs, + gpointer user_data) +{ + ClientData *data = user_data; + + g_assert_cmpint (val_int32, ==, 43); + g_assert_cmpstr (array_of_strings[0], ==, "foo"); + g_assert_cmpstr (array_of_strings[1], ==, "bar"); + g_assert (array_of_strings[2] == NULL); + g_assert_cmpstr (array_of_bytestrings[0], ==, "foo\xff"); + g_assert_cmpstr (array_of_bytestrings[1], ==, "bar\xff"); + g_assert (array_of_bytestrings[2] == NULL); + + data->received_test_signal = TRUE; + g_main_loop_quit (data->thread_loop); +} + +static void +on_property_cancellation_cb (FooiGenBar *proxy, + GAsyncResult *res, + gpointer user_data) +{ + ClientData *data = user_data; + gboolean ret; + GError *error = NULL; + + error = NULL; + ret = foo_igen_bar_call_property_cancellation_finish (proxy, res, &error); + g_assert_no_error (error); + g_assert (ret); + + g_main_loop_quit (data->thread_loop); +} + +static void +check_bar_proxy (FooiGenBar *proxy, + GMainLoop *thread_loop) +{ + const gchar *array_of_strings[3] = {"one", "two", NULL}; + const gchar *array_of_strings_2[3] = {"one2", "two2", NULL}; + const gchar *array_of_objpaths[3] = {"/one", "/one/two", NULL}; + const gchar *array_of_bytestrings[3] = {"one\xff", "two\xff", NULL}; + guchar ret_val_byte; + gboolean ret_val_boolean; + gint16 ret_val_int16; + guint16 ret_val_uint16; + gint ret_val_int32; + guint ret_val_uint32; + gint64 ret_val_int64; + guint64 ret_val_uint64; + gdouble ret_val_double; + gchar *ret_val_string; + gchar *ret_val_objpath; + gchar *ret_val_signature; + gchar *ret_val_bytestring; + gboolean ret; + GError *error; + ClientData *data; + guchar val_y; + gboolean val_b; + gint val_n; + guint val_q; + gint val_i; + guint val_u; + gint64 val_x; + guint64 val_t; + gdouble val_d; + gchar *val_s; + gchar *val_o; + gchar *val_g; + gchar *val_ay; + gchar **val_as; + gchar **val_ao; + GVariant *val_ag; + gint32 val_unset_i; + gdouble val_unset_d; + gchar *val_unset_s; + gchar *val_unset_o; + gchar *val_unset_g; + gchar *val_unset_ay; + gchar **val_unset_as; + gchar **val_unset_ao; + GVariant *val_unset_ag; + GVariant *val_unset_struct; + gchar *val_finally_normal_name; + GVariant *v; + gchar *s; + const gchar *const *read_as; + const gchar *const *read_as2; + const gchar *const *read_as3; + + data = g_new0 (ClientData, 1); + data->thread_loop = thread_loop; + + v = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "y"); + g_assert (v != NULL); + g_variant_unref (v); + + /* set empty values to non-empty */ + val_unset_i = 42; + val_unset_d = 42.0; + val_unset_s = "42"; + val_unset_o = "42"; + val_unset_g = "42"; + val_unset_ay = NULL; + val_unset_as = NULL; + val_unset_ao = NULL; + val_unset_ag = NULL; + val_unset_struct = NULL; + /* check properties */ + g_object_get (proxy, + "y", &val_y, + "b", &val_b, + "n", &val_n, + "q", &val_q, + "i", &val_i, + "u", &val_u, + "x", &val_x, + "t", &val_t, + "d", &val_d, + "s", &val_s, + "o", &val_o, + "g", &val_g, + "ay", &val_ay, + "as", &val_as, + "ao", &val_ao, + "ag", &val_ag, + "unset_i", &val_unset_i, + "unset_d", &val_unset_d, + "unset_s", &val_unset_s, + "unset_o", &val_unset_o, + "unset_g", &val_unset_g, + "unset_ay", &val_unset_ay, + "unset_as", &val_unset_as, + "unset_ao", &val_unset_ao, + "unset_ag", &val_unset_ag, + "unset_struct", &val_unset_struct, + "finally-normal-name", &val_finally_normal_name, + NULL); + g_assert_cmpint (val_y, ==, 42); + g_assert_cmpstr (val_finally_normal_name, ==, "There aint no place like home"); + g_free (val_s); + g_free (val_o); + g_free (val_g); + g_assert_cmpstr (val_ay, ==, "ABCabc"); + g_free (val_ay); + g_strfreev (val_as); + g_strfreev (val_ao); + g_variant_unref (val_ag); + g_free (val_finally_normal_name); + /* check empty values */ + g_assert_cmpint (val_unset_i, ==, 0); + g_assert_cmpfloat (val_unset_d, ==, 0.0); + g_assert_cmpstr (val_unset_s, ==, ""); + g_assert_cmpstr (val_unset_o, ==, "/"); + g_assert_cmpstr (val_unset_g, ==, ""); + g_free (val_unset_s); + g_free (val_unset_o); + g_free (val_unset_g); + g_assert_cmpstr (val_unset_ay, ==, ""); + g_assert (val_unset_as[0] == NULL); + g_assert (val_unset_ao[0] == NULL); + g_assert (g_variant_is_of_type (val_unset_ag, G_VARIANT_TYPE ("ag"))); + g_assert (g_variant_is_of_type (val_unset_struct, G_VARIANT_TYPE ("(idsogayasaoag)"))); + s = g_variant_print (val_unset_struct, TRUE); + g_assert_cmpstr (s, ==, "(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])"); + g_free (s); + g_free (val_unset_ay); + g_strfreev (val_unset_as); + g_strfreev (val_unset_ao); + g_variant_unref (val_unset_ag); + g_variant_unref (val_unset_struct); + + /* Try setting a property. This causes the generated glue to invoke + * the org.fd.DBus.Properties.Set() method asynchronously. So we + * have to wait for properties-changed... + */ + foo_igen_bar_set_finally_normal_name (proxy, "foo!"); + _g_assert_property_notify (proxy, "finally-normal-name"); + g_assert_cmpstr (foo_igen_bar_get_finally_normal_name (proxy), ==, "foo!"); + + /* Try setting properties that requires memory management. This + * is to exercise the paths that frees the references. + */ + + g_object_set (proxy, + "s", "a string", + "o", "/a/path", + "g", "asig", + "ay", g_variant_new_parsed ("[byte 0x65, 0x67]"), + "as", array_of_strings, + "ao", array_of_objpaths, + "ag", g_variant_new_parsed ("[@g 'ass', 'git']"), + NULL); + + error = NULL; + ret = foo_igen_bar_call_test_primitive_types_sync (proxy, + 10, + TRUE, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + "a string", + "/a/path", + "asig", + "bytestring\xff", + &ret_val_byte, + &ret_val_boolean, + &ret_val_int16, + &ret_val_uint16, + &ret_val_int32, + &ret_val_uint32, + &ret_val_int64, + &ret_val_uint64, + &ret_val_double, + &ret_val_string, + &ret_val_objpath, + &ret_val_signature, + &ret_val_bytestring, + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + g_assert (ret); + + error = NULL; + ret = foo_igen_bar_call_test_non_primitive_types_sync (proxy, + g_variant_new_parsed ("{'one': 'red'," + " 'two': 'blue'}"), + g_variant_new_parsed ("{'first': (42, 42), " + "'second': (43, 43)}"), + g_variant_new_parsed ("(42, 'foo', 'bar')"), + array_of_strings, + array_of_objpaths, + g_variant_new_parsed ("[@g 'ass', 'git']"), + array_of_bytestrings, + &s, + NULL, /* GCancellable */ + &error); + + g_assert_no_error (error); + g_assert (ret); + + /* Check that org.freedesktop.DBus.Error.UnknownMethod is returned on + * unimplemented methods. + */ + error = NULL; + ret = foo_igen_bar_call_unimplemented_method_sync (proxy, NULL /* GCancellable */, &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_error_free (error); + error = NULL; + g_assert (!ret); + + g_signal_connect (proxy, + "test-signal", + G_CALLBACK (on_test_signal), + data); + error = NULL; + ret = foo_igen_bar_call_request_signal_emission_sync (proxy, 0, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + g_assert (!data->received_test_signal); + g_main_loop_run (thread_loop); + g_assert (data->received_test_signal); + + /* Try setting a property. This causes the generated glue to invoke + * the org.fd.DBus.Properties.Set() method asynchronously. So we + * have to wait for properties-changed... + */ + foo_igen_bar_set_finally_normal_name (proxy, "hey back!"); + _g_assert_property_notify (proxy, "finally-normal-name"); + g_assert_cmpstr (foo_igen_bar_get_finally_normal_name (proxy), ==, "hey back!"); + + /* Check that multiple calls to a strv getter works... and that + * updates on them works as well (See comment for "property vfuncs" + * in gio/gdbus-codegen/codegen.py for details) + */ + read_as = foo_igen_bar_get_as (proxy); + read_as2 = foo_igen_bar_get_as (proxy); + g_assert_cmpint (g_strv_length ((gchar **) read_as), ==, 2); + g_assert_cmpstr (read_as[0], ==, "one"); + g_assert_cmpstr (read_as[1], ==, "two"); + g_assert (read_as == read_as2); /* this is more testing an implementation detail */ + g_object_set (proxy, + "as", array_of_strings_2, + NULL); + _g_assert_property_notify (proxy, "as"); + read_as3 = foo_igen_bar_get_as (proxy); + g_assert_cmpint (g_strv_length ((gchar **) read_as3), ==, 2); + g_assert_cmpstr (read_as3[0], ==, "one2"); + g_assert_cmpstr (read_as3[1], ==, "two2"); + + /* Check that grouping changes in idle works. + * + * See on_handle_request_multi_property_mods(). The server should + * emit exactly two PropertiesChanged signals each containing two + * properties. + * + * On the first reception, y and i should both be increased by + * two. On the second reception, only by one. The signal handler + * checks this. + * + * This also checks that _drain_notify() works. + */ + data->initial_y = foo_igen_bar_get_y (proxy); + data->initial_i = foo_igen_bar_get_i (proxy); + g_signal_connect (proxy, + "g-properties-changed", + G_CALLBACK (on_g_properties_changed), + data); + error = NULL; + ret = foo_igen_bar_call_request_multi_property_mods_sync (proxy, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + g_main_loop_run (thread_loop); + g_assert_cmpint (data->num_g_properties_changed, ==, 2); + g_signal_handlers_disconnect_by_func (proxy, + G_CALLBACK (on_g_properties_changed), + data); + + /* Check that we don't emit PropertiesChanged() if the property + * didn't change... we actually get two notifies.. one for the + * local set (without a value change) and one when receiving + * the PropertiesChanged() signal generated from the remote end. + */ + g_assert_cmpint (data->num_notify_u, ==, 0); + g_signal_connect (proxy, + "notify::u", + G_CALLBACK (on_notify_u), + data); + foo_igen_bar_set_u (proxy, 1042); + g_assert_cmpint (data->num_notify_u, ==, 1); + g_assert_cmpint (foo_igen_bar_get_u (proxy), ==, 0); + _g_assert_property_notify (proxy, "u"); + g_assert_cmpint (foo_igen_bar_get_u (proxy), ==, 1042); + g_assert_cmpint (data->num_notify_u, ==, 2); + + /* Now change u again to the same value.. this will cause a + * local notify:: notify and the usual Properties.Set() call + * + * (Btw, why also the Set() call if the value in the cache is + * the same? Because someone else might have changed it + * in the mean time and we're just waiting to receive the + * PropertiesChanged() signal...) + * + * More tricky - how do we check for the *absence* of the + * notification that u changed? Simple: we change another + * property and wait for that PropertiesChanged() message + * to arrive. + */ + foo_igen_bar_set_u (proxy, 1042); + g_assert_cmpint (data->num_notify_u, ==, 3); + + g_assert_cmpint (data->num_notify_n, ==, 0); + g_signal_connect (proxy, + "notify::n", + G_CALLBACK (on_notify_n), + data); + foo_igen_bar_set_n (proxy, 10042); + g_assert_cmpint (data->num_notify_n, ==, 1); + g_assert_cmpint (foo_igen_bar_get_n (proxy), ==, 0); + _g_assert_property_notify (proxy, "n"); + g_assert_cmpint (foo_igen_bar_get_n (proxy), ==, 10042); + g_assert_cmpint (data->num_notify_n, ==, 2); + /* Checks that u didn't change at all */ + g_assert_cmpint (data->num_notify_u, ==, 3); + + /* Now we check that if the service does + * + * guint n = foo_igen_bar_get_n (foo); + * foo_igen_bar_set_n (foo, n + 1); + * foo_igen_bar_set_n (foo, n); + * + * then no PropertiesChanged() signal is emitted! + */ + error = NULL; + foo_igen_bar_call_property_cancellation (proxy, + NULL, /* GCancellable */ + (GAsyncReadyCallback) on_property_cancellation_cb, + data); + g_main_loop_run (thread_loop); + /* Checks that n didn't change at all */ + g_assert_cmpint (data->num_notify_n, ==, 2); + + /* cleanup */ + g_free (data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +on_force_signal (FooiGenBat *proxy, + GVariant *force_i, + GVariant *force_s, + GVariant *force_ay, + GVariant *force_struct, + gpointer user_data) +{ + gboolean *signal_received = user_data; + gint val; + + g_assert (!(*signal_received)); + + g_assert_cmpint (g_variant_get_int32 (force_i), ==, 42 + 10); + g_assert_cmpstr (g_variant_get_string (force_s, NULL), ==, "a string_foo"); + g_assert_cmpstr (g_variant_get_bytestring (force_ay), ==, "a bytestring\xff_foo\xff"); + g_variant_get (force_struct, "(i)", &val); + g_assert_cmpint (val, ==, 4200 + 10); + + *signal_received = TRUE; +} + +static void +check_bat_proxy (FooiGenBat *proxy, + GMainLoop *thread_loop) +{ + GError *error; + GVariant *ret_i; + GVariant *ret_s; + GVariant *ret_ay; + GVariant *ret_struct; + gint val; + gboolean force_signal_received; + + /* --------------------------------------------------- */ + /* Check type-mapping where we force use of a GVariant */ + /* --------------------------------------------------- */ + + /* check properties */ + g_object_get (proxy, + "force-i", &ret_i, + "force-s", &ret_s, + "force-ay", &ret_ay, + "force-struct", &ret_struct, + NULL); + g_assert_cmpint (g_variant_get_int32 (ret_i), ==, 43); + g_assert_cmpstr (g_variant_get_string (ret_s, NULL), ==, "prop string"); + g_assert_cmpstr (g_variant_get_bytestring (ret_ay), ==, "prop bytestring\xff"); + g_variant_get (ret_struct, "(i)", &val); + g_assert_cmpint (val, ==, 4300); + g_variant_unref (ret_i); + g_variant_unref (ret_s); + g_variant_unref (ret_ay); + g_variant_unref (ret_struct); + + /* check method and signal */ + force_signal_received = FALSE; + g_signal_connect (proxy, + "force-signal", + G_CALLBACK (on_force_signal), + &force_signal_received); + + error = NULL; + foo_igen_bat_call_force_method_sync (proxy, + g_variant_new_int32 (42), + g_variant_new_string ("a string"), + g_variant_new_bytestring ("a bytestring\xff"), + g_variant_new ("(i)", 4200), + &ret_i, + &ret_s, + &ret_ay, + &ret_struct, + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + g_assert_cmpint (g_variant_get_int32 (ret_i), ==, 42 + 10); + g_assert_cmpstr (g_variant_get_string (ret_s, NULL), ==, "a string_foo"); + g_assert_cmpstr (g_variant_get_bytestring (ret_ay), ==, "a bytestring\xff_foo\xff"); + g_variant_get (ret_struct, "(i)", &val); + g_assert_cmpint (val, ==, 4200 + 10); + g_variant_unref (ret_i); + g_variant_unref (ret_s); + g_variant_unref (ret_ay); + g_variant_unref (ret_struct); + _g_assert_signal_received (proxy, "force-signal"); + g_assert (force_signal_received); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +check_authorize_proxy (FooiGenAuthorize *proxy, + GMainLoop *thread_loop) +{ + GError *error; + gboolean ret; + + /* Check that g-authorize-method works as intended */ + + error = NULL; + ret = foo_igen_authorize_call_check_not_authorized_sync (proxy, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED); + g_error_free (error); + g_assert (!ret); + + error = NULL; + ret = foo_igen_authorize_call_check_authorized_sync (proxy, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + error = NULL; + ret = foo_igen_authorize_call_check_not_authorized_from_object_sync (proxy, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING); + g_error_free (error); + g_assert (!ret); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static GThread * +get_self_via_proxy (FooiGenMethodThreads *proxy_1) +{ + GError *error; + gchar *self_str; + gboolean ret; + gpointer self; + + error = NULL; + ret = foo_igen_method_threads_call_get_self_sync (proxy_1, &self_str, NULL, &error); + g_assert_no_error (error); + g_assert (ret); + + g_assert_cmpint (sscanf (self_str, "%p", &self), ==, 1); + + g_free (self_str); + + return self; +} + +static void +check_thread_proxies (FooiGenMethodThreads *proxy_1, + FooiGenMethodThreads *proxy_2, + GMainLoop *thread_loop) +{ + /* proxy_1 is indeed using threads so should never get the handler thread */ + g_assert (get_self_via_proxy (proxy_1) != method_handler_thread); + + /* proxy_2 is not using threads so should get the handler thread */ + g_assert (get_self_via_proxy (proxy_2) == method_handler_thread); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static gpointer +check_proxies_in_thread (gpointer user_data) +{ + GMainLoop *loop = user_data; + GMainContext *thread_context; + GMainLoop *thread_loop; + GError *error; + FooiGenBar *bar_proxy; + FooiGenBat *bat_proxy; + FooiGenAuthorize *authorize_proxy; + FooiGenMethodThreads *thread_proxy_1; + FooiGenMethodThreads *thread_proxy_2; + + thread_context = g_main_context_new (); + thread_loop = g_main_loop_new (thread_context, FALSE); + g_main_context_push_thread_default (thread_context); + + /* Check the object */ + error = NULL; + bar_proxy = foo_igen_bar_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "org.gtk.GDBus.BindingsTool.Test", + "/bar", + NULL, /* GCancellable* */ + &error); + check_bar_proxy (bar_proxy, thread_loop); + g_assert_no_error (error); + g_object_unref (bar_proxy); + + error = NULL; + bat_proxy = foo_igen_bat_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "org.gtk.GDBus.BindingsTool.Test", + "/bat", + NULL, /* GCancellable* */ + &error); + check_bat_proxy (bat_proxy, thread_loop); + g_assert_no_error (error); + g_object_unref (bat_proxy); + + error = NULL; + authorize_proxy = foo_igen_authorize_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "org.gtk.GDBus.BindingsTool.Test", + "/authorize", + NULL, /* GCancellable* */ + &error); + check_authorize_proxy (authorize_proxy, thread_loop); + g_assert_no_error (error); + g_object_unref (authorize_proxy); + + error = NULL; + thread_proxy_1 = foo_igen_method_threads_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "org.gtk.GDBus.BindingsTool.Test", + "/method_threads_1", + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + thread_proxy_2 = foo_igen_method_threads_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "org.gtk.GDBus.BindingsTool.Test", + "/method_threads_2", + NULL, /* GCancellable* */ + &error); + g_assert_no_error (error); + check_thread_proxies (thread_proxy_1, thread_proxy_2, thread_loop); + g_object_unref (thread_proxy_1); + g_object_unref (thread_proxy_2); + + g_main_loop_unref (thread_loop); + g_main_context_unref (thread_context); + + /* this breaks out of the loop in main() (below) */ + g_main_loop_quit (loop); + return NULL; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + gchar *xml; + GMainLoop *loop; +} IntrospectData; + +static void +introspect_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + IntrospectData *data = user_data; + GVariant *result; + GError *error; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_get (result, "(s)", &data->xml); + g_variant_unref (result); + + g_main_loop_quit (data->loop); +} + +static GDBusNodeInfo * +introspect (GDBusConnection *connection, + const gchar *name, + const gchar *object_path, + GMainLoop *loop) +{ + GError *error; + GDBusNodeInfo *node_info; + IntrospectData *data; + + data = g_new0 (IntrospectData, 1); + data->xml = NULL; + data->loop = loop; + + /* do this async to avoid deadlocks */ + g_dbus_connection_call (connection, + name, + object_path, + "org.freedesktop.DBus.Introspectable", + "Introspect", + NULL, /* params */ + G_VARIANT_TYPE ("(s)"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) introspect_cb, + data); + g_main_loop_run (loop); + g_assert (data->xml != NULL); + + error = NULL; + node_info = g_dbus_node_info_new_for_xml (data->xml, &error); + g_assert_no_error (error); + g_assert (node_info != NULL); + g_free (data->xml); + g_free (data); + + return node_info; +} + +static guint +count_interfaces (GDBusNodeInfo *info) +{ + guint n; + for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++) + ; + return n; +} + +static guint +count_nodes (GDBusNodeInfo *info) +{ + guint n; + for (n = 0; info->nodes != NULL && info->nodes[n] != NULL; n++) + ; + return n; +} + +static guint +has_interface (GDBusNodeInfo *info, + const gchar *name) +{ + guint n; + for (n = 0; info->interfaces != NULL && info->interfaces[n] != NULL; n++) + { + if (g_strcmp0 (info->interfaces[n]->name, name) == 0) + return TRUE; + } + return FALSE; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + GMainLoop *loop; + GVariant *result; +} OMGetManagedObjectsData; + +static void +om_get_all_cb (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + OMGetManagedObjectsData *data = user_data; + GError *error; + + error = NULL; + data->result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_no_error (error); + g_assert (data->result != NULL); + g_main_loop_quit (data->loop); +} + +static void +om_check_get_all (GDBusConnection *c, + GMainLoop *loop, + const gchar *str) +{ + OMGetManagedObjectsData data; + gchar *s; + + data.loop = loop; + data.result = NULL; + + /* do this async to avoid deadlocks */ + g_dbus_connection_call (c, + g_dbus_connection_get_unique_name (c), + "/managed", + "org.freedesktop.DBus.ObjectManager", + "GetManagedObjects", + NULL, /* params */ + G_VARIANT_TYPE ("(a{oa{sa{sv}}})"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) om_get_all_cb, + &data); + g_main_loop_run (loop); + g_assert (data.result != NULL); + s = g_variant_print (data.result, TRUE); + g_assert_cmpstr (s, ==, str); + g_free (s); + g_variant_unref (data.result); +} + +typedef struct +{ + GMainLoop *loop; + guint state; + + guint num_object_proxy_added_signals; + guint num_object_proxy_removed_signals; + guint num_interface_added_signals; + guint num_interface_removed_signals; +} OMData; + +static gint +my_pstrcmp (const gchar **a, const gchar **b) +{ + return g_strcmp0 (*a, *b); +} + +static void +om_check_interfaces_added (const gchar *signal_name, + GVariant *parameters, + const gchar *object_path, + const gchar *first_interface_name, + ...) +{ + const gchar *path; + GVariant *array; + guint n; + GPtrArray *interfaces; + GPtrArray *interfaces_in_message; + va_list var_args; + const gchar *str; + + interfaces = g_ptr_array_new (); + g_ptr_array_add (interfaces, (gpointer) first_interface_name); + va_start (var_args, first_interface_name); + do + { + str = va_arg (var_args, const gchar *); + if (str == NULL) + break; + g_ptr_array_add (interfaces, (gpointer) str); + } + while (TRUE); + va_end (var_args); + + g_variant_get (parameters, "(&o*)", &path, &array); + g_assert_cmpstr (signal_name, ==, "InterfacesAdded"); + g_assert_cmpstr (path, ==, object_path); + g_assert_cmpint (g_variant_n_children (array), ==, interfaces->len); + interfaces_in_message = g_ptr_array_new (); + for (n = 0; n < interfaces->len; n++) + { + const gchar *iface_name; + g_variant_get_child (array, n, "{&sa{sv}}", &iface_name, NULL); + g_ptr_array_add (interfaces_in_message, (gpointer) iface_name); + } + g_assert_cmpint (interfaces_in_message->len, ==, interfaces->len); + g_ptr_array_sort (interfaces, (GCompareFunc) my_pstrcmp); + g_ptr_array_sort (interfaces_in_message, (GCompareFunc) my_pstrcmp); + for (n = 0; n < interfaces->len; n++) + g_assert_cmpstr (interfaces->pdata[n], ==, interfaces_in_message->pdata[n]); + g_ptr_array_unref (interfaces_in_message); + g_ptr_array_unref (interfaces); + g_variant_unref (array); +} + +static void +om_check_interfaces_removed (const gchar *signal_name, + GVariant *parameters, + const gchar *object_path, + const gchar *first_interface_name, + ...) +{ + const gchar *path; + GVariant *array; + guint n; + GPtrArray *interfaces; + GPtrArray *interfaces_in_message; + va_list var_args; + const gchar *str; + + interfaces = g_ptr_array_new (); + g_ptr_array_add (interfaces, (gpointer) first_interface_name); + va_start (var_args, first_interface_name); + do + { + str = va_arg (var_args, const gchar *); + if (str == NULL) + break; + g_ptr_array_add (interfaces, (gpointer) str); + } + while (TRUE); + va_end (var_args); + + g_variant_get (parameters, "(&o*)", &path, &array); + g_assert_cmpstr (signal_name, ==, "InterfacesRemoved"); + g_assert_cmpstr (path, ==, object_path); + g_assert_cmpint (g_variant_n_children (array), ==, interfaces->len); + interfaces_in_message = g_ptr_array_new (); + for (n = 0; n < interfaces->len; n++) + { + const gchar *iface_name; + g_variant_get_child (array, n, "&s", &iface_name, NULL); + g_ptr_array_add (interfaces_in_message, (gpointer) iface_name); + } + g_assert_cmpint (interfaces_in_message->len, ==, interfaces->len); + g_ptr_array_sort (interfaces, (GCompareFunc) my_pstrcmp); + g_ptr_array_sort (interfaces_in_message, (GCompareFunc) my_pstrcmp); + for (n = 0; n < interfaces->len; n++) + g_assert_cmpstr (interfaces->pdata[n], ==, interfaces_in_message->pdata[n]); + g_ptr_array_unref (interfaces_in_message); + g_ptr_array_unref (interfaces); + g_variant_unref (array); +} + +static void +om_on_signal (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + OMData *om_data = user_data; + + //g_debug ("foo: %s", g_variant_print (parameters, TRUE)); + + switch (om_data->state) + { + default: + case 0: + g_print ("failing and om_data->state=%d on signal %s, params=%s\n", + om_data->state, + signal_name, + g_variant_print (parameters, TRUE)); + g_assert_not_reached (); + break; + + case 1: + om_check_interfaces_added (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 2; + g_main_loop_quit (om_data->loop); + break; + + case 3: + om_check_interfaces_removed (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 5; + /* keep running the loop */ + break; + + case 5: + om_check_interfaces_added (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 6; + g_main_loop_quit (om_data->loop); + break; + + case 7: + om_check_interfaces_removed (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 9; + /* keep running the loop */ + break; + + case 9: + om_check_interfaces_added (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 10; + g_main_loop_quit (om_data->loop); + break; + + case 11: + om_check_interfaces_added (signal_name, parameters, "/managed/first", + "org.project.Bat", NULL); + om_data->state = 12; + g_main_loop_quit (om_data->loop); + break; + + case 13: + om_check_interfaces_removed (signal_name, parameters, "/managed/first", + "org.project.Bar", NULL); + om_data->state = 14; + g_main_loop_quit (om_data->loop); + break; + + case 15: + om_check_interfaces_removed (signal_name, parameters, "/managed/first", + "org.project.Bat", NULL); + om_data->state = 16; + g_main_loop_quit (om_data->loop); + break; + + case 17: + om_check_interfaces_added (signal_name, parameters, "/managed/first", + "com.acme.Coyote", NULL); + om_data->state = 18; + g_main_loop_quit (om_data->loop); + break; + + case 101: + om_check_interfaces_added (signal_name, parameters, "/managed/second", + "org.project.Bat", "org.project.Bar", NULL); + om_data->state = 102; + g_main_loop_quit (om_data->loop); + break; + + case 103: + om_check_interfaces_removed (signal_name, parameters, "/managed/second", + "org.project.Bat", "org.project.Bar", NULL); + om_data->state = 104; + g_main_loop_quit (om_data->loop); + break; + + case 200: + om_check_interfaces_added (signal_name, parameters, "/managed/first_1", + "com.acme.Coyote", NULL); + om_data->state = 201; + g_main_loop_quit (om_data->loop); + break; + } +} + +static GAsyncResult *om_res = NULL; + +static void +om_pm_start_cb (FooiGenObjectManagerClient *manager, + GAsyncResult *res, + gpointer user_data) +{ + GMainLoop *loop = user_data; + om_res = g_object_ref (res); + g_main_loop_quit (loop); +} + +static void +on_interface_added (GDBusObject *object, + GDBusInterface *interface, + gpointer user_data) +{ + OMData *om_data = user_data; + om_data->num_interface_added_signals += 1; +} + +static void +on_interface_removed (GDBusObject *object, + GDBusInterface *interface, + gpointer user_data) +{ + OMData *om_data = user_data; + om_data->num_interface_removed_signals += 1; +} + +static void +on_object_proxy_added (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + gpointer user_data) +{ + OMData *om_data = user_data; + om_data->num_object_proxy_added_signals += 1; + g_signal_connect (object_proxy, + "interface-added", + G_CALLBACK (on_interface_added), + om_data); + g_signal_connect (object_proxy, + "interface-removed", + G_CALLBACK (on_interface_removed), + om_data); +} + +static void +on_object_proxy_removed (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + gpointer user_data) +{ + OMData *om_data = user_data; + om_data->num_object_proxy_removed_signals += 1; + g_assert_cmpint (g_signal_handlers_disconnect_by_func (object_proxy, + G_CALLBACK (on_interface_added), + om_data), ==, 1); + g_assert_cmpint (g_signal_handlers_disconnect_by_func (object_proxy, + G_CALLBACK (on_interface_removed), + om_data), ==, 1); +} + +static void +property_d_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + gboolean *changed = user_data; + + *changed = TRUE; +} + +static void +om_check_property_and_signal_emission (GMainLoop *loop, + FooiGenBar *skeleton, + FooiGenBar *proxy) +{ + gboolean d_changed = FALSE; + guint handler; + + /* First PropertiesChanged */ + g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 0); + g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 0); + foo_igen_bar_set_i (skeleton, 1); + _g_assert_property_notify (proxy, "i"); + g_assert_cmpint (foo_igen_bar_get_i (skeleton), ==, 1); + g_assert_cmpint (foo_igen_bar_get_i (proxy), ==, 1); + + /* Double-check the gdouble case */ + g_assert_cmpfloat (foo_igen_bar_get_d (skeleton), ==, 0.0); + g_assert_cmpfloat (foo_igen_bar_get_d (proxy), ==, 0.0); + foo_igen_bar_set_d (skeleton, 1.0); + _g_assert_property_notify (proxy, "d"); + + /* Verify that re-setting it to the same value doesn't cause a + * notify on the proxy, by taking advantage of the fact that + * notifications are serialized. + */ + handler = g_signal_connect (proxy, "notify::d", + G_CALLBACK (property_d_changed), &d_changed); + foo_igen_bar_set_d (skeleton, 1.0); + foo_igen_bar_set_i (skeleton, 2); + _g_assert_property_notify (proxy, "i"); + g_assert (d_changed == FALSE); + g_signal_handler_disconnect (proxy, handler); + + /* Then just a regular signal */ + foo_igen_bar_emit_another_signal (skeleton, "word"); + _g_assert_signal_received (proxy, "another-signal"); +} + +static void +check_object_manager (void) +{ + FooiGenObjectSkeleton *o = NULL; + FooiGenObjectSkeleton *o2 = NULL; + FooiGenObjectSkeleton *o3 = NULL; + GDBusInterfaceSkeleton *i; + GDBusConnection *c; + GDBusObjectManagerServer *manager = NULL; + GDBusNodeInfo *info; + GError *error; + GMainLoop *loop; + OMData *om_data = NULL; + guint om_signal_id = -1; + GDBusObjectManager *pm = NULL; + GList *object_proxies; + GList *proxies; + GDBusObject *op; + GDBusProxy *p; + FooiGenBar *bar_skeleton; + GDBusInterface *iface; + gchar *path, *name, *name_owner; + GDBusConnection *c2; + GDBusObjectManagerClientFlags flags; + + loop = g_main_loop_new (NULL, FALSE); + + om_data = g_new0 (OMData, 1); + om_data->loop = loop; + om_data->state = 0; + + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + om_signal_id = g_dbus_connection_signal_subscribe (c, + NULL, /* sender */ + "org.freedesktop.DBus.ObjectManager", + NULL, /* member */ + NULL, /* object_path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + om_on_signal, + om_data, + NULL); /* user_data_free_func */ + + /* Our GDBusObjectManagerClient tests are simple - we basically just count the + * number of times the various signals have been emitted (we don't check + * that the right objects/interfaces are passed though - that's checked + * in the lower-level tests in om_on_signal()...) + * + * Note that these tests rely on the D-Bus signal handlers used by + * GDBusObjectManagerClient firing before om_on_signal(). + */ + error = NULL; + pm = foo_igen_object_manager_client_new_sync (c, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + g_dbus_connection_get_unique_name (c), + "/managed", + NULL, /* GCancellable */ + &error); + g_assert_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD); + g_error_free (error); + g_assert (pm == NULL); + + manager = g_dbus_object_manager_server_new ("/managed"); + + g_assert (g_dbus_object_manager_server_get_connection (manager) == NULL); + + g_dbus_object_manager_server_set_connection (manager, c); + + g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (manager)), ==, "/managed"); + g_object_get (manager, "object-path", &path, "connection", &c2, NULL); + g_assert_cmpstr (path, ==, "/managed"); + g_assert (c2 == c); + g_free (path); + g_clear_object (&c2); + + /* Check that the manager object is visible */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* ObjectManager + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.freedesktop.DBus.ObjectManager")); + g_assert_cmpint (count_nodes (info), ==, 0); + g_dbus_node_info_unref (info); + + /* Check GetManagedObjects() - should be empty since we have no objects */ + om_check_get_all (c, loop, + "(@a{oa{sa{sv}}} {},)"); + + /* Now try to create the proxy manager again - this time it should work */ + error = NULL; + foo_igen_object_manager_client_new (c, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + g_dbus_connection_get_unique_name (c), + "/managed", + NULL, /* GCancellable */ + (GAsyncReadyCallback) om_pm_start_cb, + loop); + g_main_loop_run (loop); + error = NULL; + pm = foo_igen_object_manager_client_new_finish (om_res, &error); + g_clear_object (&om_res); + g_assert_no_error (error); + g_assert (pm != NULL); + g_signal_connect (pm, + "object-added", + G_CALLBACK (on_object_proxy_added), + om_data); + g_signal_connect (pm, + "object-removed", + G_CALLBACK (on_object_proxy_removed), + om_data); + + g_assert_cmpstr (g_dbus_object_manager_get_object_path (G_DBUS_OBJECT_MANAGER (pm)), ==, "/managed"); + g_object_get (pm, + "object-path", &path, + "connection", &c2, + "name", &name, + "name-owner", &name_owner, + "flags", &flags, + NULL); + g_assert_cmpstr (path, ==, "/managed"); + g_assert_cmpstr (name, ==, g_dbus_connection_get_unique_name (c)); + g_assert_cmpstr (name_owner, ==, g_dbus_connection_get_unique_name (c)); + g_assert_cmpint (flags, ==, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE); + g_assert (c2 == c); + g_free (path); + g_clear_object (&c2); + g_free (name); + g_free (name_owner); + + /* ... check there are no object proxies yet */ + object_proxies = g_dbus_object_manager_get_objects (pm); + g_assert (object_proxies == NULL); + + /* First, export an object with a single interface (also check that + * g_dbus_interface_get_object() works and that the object isn't reffed) + */ + o = foo_igen_object_skeleton_new ("/managed/first"); + i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ()); + g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == NULL); + g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1); + foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i)); + g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1); + g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o)); + g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1); + foo_igen_object_skeleton_set_bar (o, NULL); + g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == NULL); + g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1); + foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i)); + g_assert (g_dbus_interface_get_object (G_DBUS_INTERFACE (i)) == G_DBUS_OBJECT (o)); + g_assert_cmpint (G_OBJECT (o)->ref_count, ==, 1); + + o2 = FOO_IGEN_OBJECT_SKELETON (g_dbus_interface_dup_object (G_DBUS_INTERFACE (i))); + g_assert (G_DBUS_OBJECT (o2) == G_DBUS_OBJECT (o)); + g_assert_cmpint (G_OBJECT (o2)->ref_count, ==, 2); + g_clear_object (&o2); + + g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o)); + + /* ... check we get the InterfacesAdded signal */ + om_data->state = 1; + + g_main_loop_run (om_data->loop); + + g_assert_cmpint (om_data->state, ==, 2); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 1); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 0); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 0); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0); + /* ... check there's one non-standard interfaces */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bar")); + g_dbus_node_info_unref (info); + + /* Also check g_dbus_object_manager_get_interface */ + iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bar"); + g_assert (iface != NULL); + g_clear_object (&iface); + iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bat"); + g_assert (iface == NULL); + iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bar"); + g_assert (iface != NULL); + g_clear_object (&iface); + iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bat"); + g_assert (iface == NULL); + + /* Now, check adding the same interface replaces the existing one */ + foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i)); + /* ... check we get the InterfacesRemoved */ + om_data->state = 3; + g_main_loop_run (om_data->loop); + /* ... and then check we get the InterfacesAdded */ + g_assert_cmpint (om_data->state, ==, 6); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 2); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 0); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bar")); + g_dbus_node_info_unref (info); + g_clear_object (&i); + + /* check adding an interface of same type (but not same object) replaces the existing one */ + i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ()); + foo_igen_object_skeleton_set_bar (o, FOO_IGEN_BAR (i)); + /* ... check we get the InterfacesRemoved and then InterfacesAdded */ + om_data->state = 7; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 10); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 0); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bar")); + g_dbus_node_info_unref (info); + g_clear_object (&i); + + /* check adding an interface of another type doesn't replace the existing one */ + i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ()); + foo_igen_object_skeleton_set_bat (o, FOO_IGEN_BAT (i)); + g_clear_object (&i); + /* ... check we get the InterfacesAdded */ + om_data->state = 11; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 12); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 0); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 5); /* Bar,Bat + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bar")); + g_assert (has_interface (info, "org.project.Bat")); + g_dbus_node_info_unref (info); + + /* check we can remove an interface */ + foo_igen_object_skeleton_set_bar (o, NULL); + /* ... check we get the InterfacesRemoved */ + om_data->state = 13; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 14); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 2); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* Bat + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bat")); + g_dbus_node_info_unref (info); + /* also and that the call only has effect if the interface actually exists + * + * (Note: if a signal was emitted we'd assert in the signal handler + * because we're in state 14) + */ + foo_igen_object_skeleton_set_bar (o, NULL); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* Bat + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "org.project.Bat")); + g_dbus_node_info_unref (info); + + /* remove the last interface */ + foo_igen_object_skeleton_set_bat (o, NULL); + /* ... check we get the InterfacesRemoved */ + om_data->state = 15; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 16); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 3); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */ + g_dbus_node_info_unref (info); + + /* and add an interface again */ + i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ()); + foo_igen_object_skeleton_set_com_acme_coyote (o, FOO_IGEN_COM_ACME_COYOTE (i)); + g_clear_object (&i); + /* ... check we get the InterfacesAdded */ + om_data->state = 17; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 18); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 4); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1); + /* ... check introspection data */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/first", loop); + g_assert_cmpint (count_interfaces (info), ==, 4); /* com.acme.Coyote + Properties,Introspectable,Peer */ + g_assert (has_interface (info, "com.acme.Coyote")); + g_dbus_node_info_unref (info); + + /* Check GetManagedObjects() - should be just the Coyote */ + om_check_get_all (c, loop, + "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)"); + + /* -------------------------------------------------- */ + + /* create a new object with two interfaces */ + o2 = foo_igen_object_skeleton_new ("/managed/second"); + i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ()); + bar_skeleton = FOO_IGEN_BAR (i); /* save for later test */ + foo_igen_object_skeleton_set_bar (o2, FOO_IGEN_BAR (i)); + g_clear_object (&i); + i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ()); + foo_igen_object_skeleton_set_bat (o2, FOO_IGEN_BAT (i)); + g_clear_object (&i); + /* ... add it */ + g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o2)); + /* ... check we get the InterfacesAdded with _two_ interfaces */ + om_data->state = 101; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 102); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 5); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 3); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1); + + /* -------------------------------------------------- */ + + /* Now that we have a couple of objects with interfaces, check + * that ObjectManager.GetManagedObjects() works + */ + om_check_get_all (c, loop, + "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': , 'b': , 'n': , 'q': , 'i': <0>, 'u': , 'x': , 't': , 'd': <0.0>, 's': <''>, 'o': , 'g': , 'ay': , 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': , 'unset_g': , 'unset_ay': , 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)"); + + /* Set connection to NULL, causing everything to be unexported.. verify this.. and + * then set the connection back.. and then check things still work + */ + g_dbus_object_manager_server_set_connection (manager, NULL); + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop); + g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */ + g_dbus_node_info_unref (info); + + g_dbus_object_manager_server_set_connection (manager, c); + om_check_get_all (c, loop, + "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': , 'b': , 'n': , 'q': , 'i': <0>, 'u': , 'x': , 't': , 'd': <0.0>, 's': <''>, 'o': , 'g': , 'ay': , 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': , 'unset_g': , 'unset_ay': , 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)"); + + /* Also check that the ObjectManagerClient returns these objects - and + * that they are of the right GType cf. what was requested via + * the generated ::get-proxy-type signal handler + */ + object_proxies = g_dbus_object_manager_get_objects (pm); + g_assert (g_list_length (object_proxies) == 2); + g_list_free_full (object_proxies, g_object_unref); + op = g_dbus_object_manager_get_object (pm, "/managed/first"); + g_assert (op != NULL); + g_assert (FOO_IGEN_IS_OBJECT_PROXY (op)); + g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/first"); + proxies = g_dbus_object_get_interfaces (op); + g_assert (g_list_length (proxies) == 1); + g_list_free_full (proxies, g_object_unref); + p = G_DBUS_PROXY (foo_igen_object_get_com_acme_coyote (FOO_IGEN_OBJECT (op))); + g_assert (p != NULL); + g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_COM_ACME_COYOTE_PROXY); + g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_COM_ACME_COYOTE)); + g_clear_object (&p); + p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting"); + g_assert (p == NULL); + g_clear_object (&op); + + /* -- */ + op = g_dbus_object_manager_get_object (pm, "/managed/second"); + g_assert (op != NULL); + g_assert (FOO_IGEN_IS_OBJECT_PROXY (op)); + g_assert_cmpstr (g_dbus_object_get_object_path (op), ==, "/managed/second"); + proxies = g_dbus_object_get_interfaces (op); + g_assert (g_list_length (proxies) == 2); + g_list_free_full (proxies, g_object_unref); + p = G_DBUS_PROXY (foo_igen_object_get_bat (FOO_IGEN_OBJECT (op))); + g_assert (p != NULL); + g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAT_PROXY); + g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAT)); + g_clear_object (&p); + p = G_DBUS_PROXY (foo_igen_object_get_bar (FOO_IGEN_OBJECT (op))); + g_assert (p != NULL); + g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAR_PROXY); + g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAR)); + /* ... now that we have a Bar instance around, also check that we get signals + * and property changes... + */ + om_check_property_and_signal_emission (loop, bar_skeleton, FOO_IGEN_BAR (p)); + g_clear_object (&p); + p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting"); + g_assert (p == NULL); + g_clear_object (&op); + + /* -------------------------------------------------- */ + + /* Now remove the second object added above */ + g_dbus_object_manager_server_unexport (manager, "/managed/second"); + /* ... check we get InterfacesRemoved with both interfaces */ + om_data->state = 103; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 104); + g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 5); + g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 4); + g_assert_cmpint (om_data->num_interface_added_signals, ==, 1); + g_assert_cmpint (om_data->num_interface_removed_signals, ==, 1); + /* ... check introspection data (there should be nothing) */ + info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed/second", loop); + g_assert_cmpint (count_nodes (info), ==, 0); + g_assert_cmpint (count_interfaces (info), ==, 0); + g_dbus_node_info_unref (info); + + /* Check GetManagedObjects() again */ + om_check_get_all (c, loop, + "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)"); + /* -------------------------------------------------- */ + + /* Check that export_uniquely() works */ + + o3 = foo_igen_object_skeleton_new ("/managed/first"); + i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ()); + foo_igen_com_acme_coyote_set_mood (FOO_IGEN_COM_ACME_COYOTE (i), "indifferent"); + foo_igen_object_skeleton_set_com_acme_coyote (o3, FOO_IGEN_COM_ACME_COYOTE (i)); + g_clear_object (&i); + g_dbus_object_manager_server_export_uniquely (manager, G_DBUS_OBJECT_SKELETON (o3)); + /* ... check we get the InterfacesAdded signal */ + om_data->state = 200; + g_main_loop_run (om_data->loop); + g_assert_cmpint (om_data->state, ==, 201); + + om_check_get_all (c, loop, + "({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/first_1': {'com.acme.Coyote': {'Mood': <'indifferent'>}}},)"); + + //g_main_loop_run (loop); /* TODO: tmp */ + + /* Clean up objects */ + g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first_1")); + //g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/second")); + g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first")); + g_assert_cmpint (g_list_length (g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager))), ==, 0); + + if (loop != NULL) + g_main_loop_unref (loop); + + if (om_signal_id != -1) + g_dbus_connection_signal_unsubscribe (c, om_signal_id); + g_clear_object (&o3); + g_clear_object (&o2); + g_clear_object (&o); + g_clear_object (&manager); + if (pm != NULL) + { + g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm, + G_CALLBACK (on_object_proxy_added), + om_data), ==, 1); + g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm, + G_CALLBACK (on_object_proxy_removed), + om_data), ==, 1); + g_clear_object (&pm); + } + g_clear_object (&c); + + g_free (om_data); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +test_object_manager (void) +{ + GMainLoop *loop; + guint id; + + loop = g_main_loop_new (NULL, FALSE); + + id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.BindingsTool.Test", + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + loop, + NULL); + + g_main_loop_run (loop); + + check_object_manager (); + + /* uncomment to keep the service around (to e.g. introspect it) */ + /* g_main_loop_run (loop); */ + + unexport_objects (); + + g_bus_unown_name (id); + g_main_loop_unref (loop); +} + +/* ---------------------------------------------------------------------------------------------------- */ +/* This checks that forcing names via org.gtk.GDBus.Name works (see test-codegen.xml) */ + +extern gpointer name_forcing_1; +extern gpointer name_forcing_2; +extern gpointer name_forcing_3; +extern gpointer name_forcing_4; +extern gpointer name_forcing_5; +extern gpointer name_forcing_6; +extern gpointer name_forcing_7; +gpointer name_forcing_1 = foo_igen_rocket123_get_type; +gpointer name_forcing_2 = foo_igen_rocket123_call_ignite_xyz; +gpointer name_forcing_3 = foo_igen_rocket123_emit_exploded_xyz; +gpointer name_forcing_4 = foo_igen_rocket123_get_speed_xyz; +gpointer name_forcing_5 = foo_igen_test_ugly_case_interface_call_get_iscsi_servers; +gpointer name_forcing_6 = foo_igen_test_ugly_case_interface_emit_servers_updated_now; +gpointer name_forcing_7 = foo_igen_test_ugly_case_interface_get_ugly_name; + +/* ---------------------------------------------------------------------------------------------------- */ + +/* See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5 for details */ + +#define CHECK_FIELD(name, v1, v2) g_assert_cmpint (G_STRUCT_OFFSET (FooiGenChangingInterface##v1##Iface, name), ==, G_STRUCT_OFFSET (FooiGenChangingInterface##v2##Iface, name)); + +static void +test_interface_stability (void) +{ + CHECK_FIELD(handle_foo_method, V1, V2); + CHECK_FIELD(handle_bar_method, V1, V2); + CHECK_FIELD(handle_baz_method, V1, V2); + CHECK_FIELD(foo_signal, V1, V2); + CHECK_FIELD(bar_signal, V1, V2); + CHECK_FIELD(baz_signal, V1, V2); + CHECK_FIELD(handle_new_method_in2, V2, V10); + CHECK_FIELD(new_signal_in2, V2, V10); +} + +#undef CHECK_FIELD + +/* ---------------------------------------------------------------------------------------------------- */ + +/* property naming + * + * - check that a property with name "Type" is mapped into g-name "type" + * with C accessors get_type_ (to avoid clashing with the GType accessor) + * and set_type_ (for symmetri) + * (see https://bugzilla.gnome.org/show_bug.cgi?id=679473 for details) + * + * - (could add more tests here) + */ + +static void +test_property_naming (void) +{ + gpointer c_getter_name = foo_igen_naming_get_type_; + gpointer c_setter_name = foo_igen_naming_set_type_; + FooiGenNaming *skel; + + (void) c_getter_name; + (void) c_setter_name; + + skel = foo_igen_naming_skeleton_new (); + g_assert (g_object_class_find_property (G_OBJECT_GET_CLASS (skel), "type") != NULL); + g_object_unref (skel); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + gint ret; + + g_test_init (&argc, &argv, NULL); + + session_bus_up (); + + g_test_add_func ("/gdbus/codegen/annotations", test_annotations); + g_test_add_func ("/gdbus/codegen/interface_stability", test_interface_stability); + g_test_add_func ("/gdbus/codegen/object-manager", test_object_manager); + g_test_add_func ("/gdbus/codegen/property-naming", test_property_naming); + + ret = g_test_run(); + + /* tear down bus */ + session_bus_down (); + + return ret; +} diff --git a/gio/tests/gdbus-test-fixture.c b/gio/tests/gdbus-test-fixture.c new file mode 100644 index 0000000..ef1f6c5 --- /dev/null +++ b/gio/tests/gdbus-test-fixture.c @@ -0,0 +1,112 @@ +/* gdbus-test-fixture.c - Test covering activation of in-tree servers. + * + * Copyright (C) 2012 Intel Corporation + * + * 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) version 3. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see + * + * Authors: Tristan Van Berkom + */ + +#include +#include "gdbus-example-objectmanager-generated.h" + +typedef struct { + GTestDBus *dbus; + GDBusObjectManager *manager; +} TestFixture; + +static void +fixture_setup (TestFixture *fixture, gconstpointer unused) +{ + /* Create the global dbus-daemon for this test suite */ + fixture->dbus = g_test_dbus_new (G_TEST_DBUS_NONE); + + /* Add the private directory with our in-tree service files */ + g_test_dbus_add_service_dir (fixture->dbus, TEST_SERVICES); + + /* Start the private D-Bus daemon */ + g_test_dbus_up (fixture->dbus); +} + +static void +fixture_teardown (TestFixture *fixture, gconstpointer unused) +{ + if (fixture->manager) + g_object_unref (fixture->manager); + + /* Stop the private D-Bus daemon */ + g_test_dbus_down (fixture->dbus); + + g_object_unref (fixture->dbus); +} + +/* The gdbus-example-objectmanager-server exports 10 objects, + * to test the server has actually activated, let's ensure + * that 10 objects exist. + */ +static void +assert_ten_objects (GDBusObjectManager *manager) +{ + GList *objects; + + objects = g_dbus_object_manager_get_objects (manager); + + g_assert_cmpint (g_list_length (objects), ==, 10); + g_list_free_full (objects, g_object_unref); +} + +static void +test_gtest_dbus (TestFixture *fixture, gconstpointer unused) +{ + + GError *error = NULL; + + fixture->manager = + example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + "org.gtk.GDBus.Examples.ObjectManager", + "/example/Animals", + NULL, /* GCancellable */ + &error); + if (fixture->manager == NULL) + g_error ("Error getting object manager client: %s", error->message); + + assert_ten_objects (fixture->manager); +} + +int +main (int argc, + char *argv[]) +{ +#if !GLIB_CHECK_VERSION (2, 35, 1) + g_type_init (); +#endif + g_test_init (&argc, &argv, NULL); + + /* Ensure that we can bring the GTestDBus up and down a hand full of times + * in a row, each time successfully activating the in-tree service + */ + g_test_add ("/GTestDBus/Cycle1", TestFixture, NULL, + fixture_setup, test_gtest_dbus, fixture_teardown); + g_test_add ("/GTestDBus/Cycle2", TestFixture, NULL, + fixture_setup, test_gtest_dbus, fixture_teardown); + g_test_add ("/GTestDBus/Cycle3", TestFixture, NULL, + fixture_setup, test_gtest_dbus, fixture_teardown); + g_test_add ("/GTestDBus/Cycle4", TestFixture, NULL, + fixture_setup, test_gtest_dbus, fixture_teardown); + g_test_add ("/GTestDBus/Cycle5", TestFixture, NULL, + fixture_setup, test_gtest_dbus, fixture_teardown); + + return g_test_run (); +} diff --git a/gio/tests/gdbus-tests.c b/gio/tests/gdbus-tests.c new file mode 100644 index 0000000..77d6235 --- /dev/null +++ b/gio/tests/gdbus-tests.c @@ -0,0 +1,159 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include + +#include "gdbus-tests.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMainLoop *loop; + gboolean timed_out; +} PropertyNotifyData; + +static void +on_property_notify (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + PropertyNotifyData *data = user_data; + g_main_loop_quit (data->loop); +} + +static gboolean +on_property_notify_timeout (gpointer user_data) +{ + PropertyNotifyData *data = user_data; + data->timed_out = TRUE; + g_main_loop_quit (data->loop); + return TRUE; +} + +gboolean +_g_assert_property_notify_run (gpointer object, + const gchar *property_name) +{ + gchar *s; + gulong handler_id; + guint timeout_id; + PropertyNotifyData data; + + data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); + data.timed_out = FALSE; + s = g_strdup_printf ("notify::%s", property_name); + handler_id = g_signal_connect (object, + s, + G_CALLBACK (on_property_notify), + &data); + g_free (s); + timeout_id = g_timeout_add_seconds (30, + on_property_notify_timeout, + &data); + g_main_loop_run (data.loop); + g_signal_handler_disconnect (object, handler_id); + g_source_remove (timeout_id); + g_main_loop_unref (data.loop); + + return data.timed_out; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct +{ + GMainLoop *loop; + gboolean timed_out; +} SignalReceivedData; + +static void +on_signal_received (gpointer user_data) +{ + SignalReceivedData *data = user_data; + g_main_loop_quit (data->loop); +} + +static gboolean +on_signal_received_timeout (gpointer user_data) +{ + SignalReceivedData *data = user_data; + data->timed_out = TRUE; + g_main_loop_quit (data->loop); + return TRUE; +} + +gboolean +_g_assert_signal_received_run (gpointer object, + const gchar *signal_name) +{ + gulong handler_id; + guint timeout_id; + SignalReceivedData data; + + data.loop = g_main_loop_new (g_main_context_get_thread_default (), FALSE); + data.timed_out = FALSE; + handler_id = g_signal_connect_swapped (object, + signal_name, + G_CALLBACK (on_signal_received), + &data); + timeout_id = g_timeout_add_seconds (30, + on_signal_received_timeout, + &data); + g_main_loop_run (data.loop); + g_signal_handler_disconnect (object, handler_id); + g_source_remove (timeout_id); + g_main_loop_unref (data.loop); + + return data.timed_out; +} + +/* ---------------------------------------------------------------------------------------------------- */ + +GDBusConnection * +_g_bus_get_priv (GBusType bus_type, + GCancellable *cancellable, + GError **error) +{ + gchar *address; + GDBusConnection *ret; + + ret = NULL; + + address = g_dbus_address_get_for_bus_sync (bus_type, cancellable, error); + if (address == NULL) + goto out; + + ret = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, + NULL, /* GDBusAuthObserver */ + cancellable, + error); + g_free (address); + + out: + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ diff --git a/gio/tests/gdbus-tests.h b/gio/tests/gdbus-tests.h new file mode 100644 index 0000000..b2782bf --- /dev/null +++ b/gio/tests/gdbus-tests.h @@ -0,0 +1,121 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-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: David Zeuthen + */ + +#ifndef __TESTS_H__ +#define __TESTS_H__ + +#include +#include "gdbus-sessionbus.h" + +G_BEGIN_DECLS + +/* TODO: clean up and move to gtestutils.c + * + * This is needed because libdbus-1 does not give predictable error messages - e.g. you + * get a different error message on connecting to a bus if the socket file is there vs + * if the socket file is missing. + */ + +#define _g_assert_error_domain(err, dom) do { if (!err || (err)->domain != dom) \ + g_assertion_message_error (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \ + #err, err, dom, -1); } while (0) + +#define _g_assert_property_notify(object, property_name) \ + do \ + { \ + if (!G_IS_OBJECT (object)) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Not a GObject instance"); \ + } \ + if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), \ + property_name) == NULL) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Property " property_name " does not " \ + "exist on object"); \ + } \ + if (_g_assert_property_notify_run (object, property_name)) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Timed out waiting for notification " \ + "on property " property_name); \ + } \ + } \ + while (FALSE) + +#define _g_assert_signal_received(object, signal_name) \ + do \ + { \ + if (!G_IS_OBJECT (object)) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Not a GObject instance"); \ + } \ + if (g_signal_lookup (signal_name, \ + G_TYPE_FROM_INSTANCE (object)) == 0) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Signal `" signal_name "' does not " \ + "exist on object"); \ + } \ + if (_g_assert_signal_received_run (object, signal_name)) \ + { \ + g_assertion_message (G_LOG_DOMAIN, \ + __FILE__, \ + __LINE__, \ + G_STRFUNC, \ + "Timed out waiting for signal `" \ + signal_name "'"); \ + } \ + } \ + while (FALSE) + +gboolean _g_assert_property_notify_run (gpointer object, + const gchar *property_name); + + +gboolean _g_assert_signal_received_run (gpointer object, + const gchar *signal_name); + +GDBusConnection *_g_bus_get_priv (GBusType bus_type, + GCancellable *cancellable, + GError **error); + +G_END_DECLS + +#endif /* __TESTS_H__ */ diff --git a/gio/tests/gdbus-testserver.c b/gio/tests/gdbus-testserver.c new file mode 100644 index 0000000..7f99a19 --- /dev/null +++ b/gio/tests/gdbus-testserver.c @@ -0,0 +1,889 @@ +#include +#include + +static GDBusNodeInfo *introspection_data = NULL; +static GMainLoop *loop = NULL; +static GHashTable *properties = NULL; + +static const gchar introspection_xml[] = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +static gboolean +end_sleep (gpointer data) +{ + GDBusMethodInvocation *invocation = data; + + g_dbus_method_invocation_return_value (invocation, NULL); + g_object_unref (invocation); + + return G_SOURCE_REMOVE; +} + +static void +handle_method_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (g_strcmp0 (method_name, "HelloWorld") == 0) + { + const gchar *greeting; + + g_variant_get (parameters, "(&s)", &greeting); + if (g_strcmp0 (greeting, "Yo") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "com.example.TestException", + "Yo is not a proper greeting"); + } + else + { + gchar *response; + response = g_strdup_printf ("You greeted me with '%s'. Thanks!", greeting); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(s)", response)); + g_free ( response); + } + } + else if (g_strcmp0 (method_name, "DoubleHelloWorld") == 0) + { + const gchar *hello1, *hello2; + gchar *reply1, *reply2; + + g_variant_get (parameters, "(&s&s)", &hello1, &hello2); + reply1 = g_strdup_printf ("You greeted me with '%s'. Thanks!", hello1); + reply2 = g_strdup_printf ("Yo dawg, you uttered '%s'. Thanks!", hello2); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(ss)", reply1, reply2)); + g_free (reply1); + g_free (reply2); + } + else if (g_strcmp0 (method_name, "PairReturn") == 0) + { + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(su)", "foo", 42)); + } + else if (g_strcmp0 (method_name, "TestPrimitiveTypes") == 0) + { + guchar val_byte; + gboolean val_boolean; + gint16 val_int16; + guint16 val_uint16; + gint32 val_int32; + guint32 val_uint32; + gint64 val_int64; + guint64 val_uint64; + gdouble val_double; + const gchar *val_string; + const gchar *val_objpath; + const gchar *val_signature; + gchar *ret_string; + gchar *ret_objpath; + gchar *ret_signature; + + g_variant_get (parameters, "(ybnqiuxtd&s&o&g)", + &val_byte, + &val_boolean, + &val_int16, + &val_uint16, + &val_int32, + &val_uint32, + &val_int64, + &val_uint64, + &val_double, + &val_string, + &val_objpath, + &val_signature); + + ret_string = g_strconcat (val_string, val_string, NULL); + ret_objpath = g_strconcat (val_objpath, "/modified", NULL); + ret_signature = g_strconcat (val_signature, val_signature, NULL); + + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(ybnqiuxtdsog)", + val_byte + 1, + !val_boolean, + val_int16 + 1, + val_uint16 + 1, + val_int32 + 1, + val_uint32 + 1, + val_int64 + 1, + val_uint64 + 1, + - val_double + 0.123, + ret_string, + ret_objpath, + ret_signature)); + + g_free (ret_string); + g_free (ret_objpath); + g_free (ret_signature); + } + else if (g_strcmp0 (method_name, "TestArrayOfPrimitiveTypes") == 0) + { + GVariant *v; + const guchar *bytes; + const gint16 *int16s; + const guint16 *uint16s; + const gint32 *int32s; + const guint32 *uint32s; + const gint64 *int64s; + const guint64 *uint64s; + const gdouble *doubles; + gsize n_elts; + gint i, j; + GVariantBuilder ret; + + g_variant_builder_init (&ret, G_VARIANT_TYPE ("(ayabanaqaiauaxatad)")); + + v = g_variant_get_child_value (parameters, 0); + bytes = g_variant_get_fixed_array (v, &n_elts, 1); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ay")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "y", bytes[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 1); + bytes = g_variant_get_fixed_array (v, &n_elts, 1); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ab")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "b", (gboolean)bytes[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 2); + int16s = g_variant_get_fixed_array (v, &n_elts, 2); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("an")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "n", int16s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 3); + uint16s = g_variant_get_fixed_array (v, &n_elts, 2); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("aq")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "q", uint16s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 4); + int32s = g_variant_get_fixed_array (v, &n_elts, 4); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ai")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "i", int32s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 5); + uint32s = g_variant_get_fixed_array (v, &n_elts, 4); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("au")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "u", uint32s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 6); + int64s = g_variant_get_fixed_array (v, &n_elts, 8); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ax")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "x", int64s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 7); + uint64s = g_variant_get_fixed_array (v, &n_elts, 8); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("at")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "t", uint64s[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + v = g_variant_get_child_value (parameters, 8); + doubles = g_variant_get_fixed_array (v, &n_elts, sizeof (gdouble)); + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ad")); + for (j = 0; j < 2; j++) + for (i = 0; i < n_elts; i++) + g_variant_builder_add (&ret, "d", doubles[i]); + g_variant_builder_close (&ret); + g_variant_unref (v); + + g_dbus_method_invocation_return_value (invocation, + g_variant_builder_end (&ret)); + } + else if (g_strcmp0 (method_name, "TestArrayOfStringTypes") == 0) + { + GVariantIter *iter1; + GVariantIter *iter2; + GVariantIter *iter3; + GVariantIter *iter; + GVariantBuilder ret; + const gchar *s; + gint i; + + g_variant_builder_init (&ret, G_VARIANT_TYPE ("(asaoag)")); + g_variant_get (parameters, "(asaoag)", &iter1, &iter2, &iter3); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("as")); + for (i = 0; i < 2; i++) + { + iter = g_variant_iter_copy (iter1); + while (g_variant_iter_loop (iter, "s", &s)) + g_variant_builder_add (&ret, "s", s); + g_variant_iter_free (iter); + } + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ao")); + for (i = 0; i < 2; i++) + { + iter = g_variant_iter_copy (iter1); + while (g_variant_iter_loop (iter, "o", &s)) + g_variant_builder_add (&ret, "o", s); + g_variant_iter_free (iter); + } + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("ag")); + for (i = 0; i < 2; i++) + { + iter = g_variant_iter_copy (iter1); + while (g_variant_iter_loop (iter, "g", &s)) + g_variant_builder_add (&ret, "g", s); + g_variant_iter_free (iter); + } + g_variant_builder_close (&ret); + + g_variant_iter_free (iter1); + g_variant_iter_free (iter2); + g_variant_iter_free (iter3); + + g_dbus_method_invocation_return_value (invocation, + g_variant_builder_end (&ret)); + } + else if (g_strcmp0 (method_name, "TestHashTables") == 0) + { + GVariant *v; + GVariantIter iter; + GVariantBuilder ret; + guint8 y1, y2; + gboolean b1, b2; + gint16 n1, n2; + guint16 q1, q2; + gint i1, i2; + guint u1, u2; + gint64 x1, x2; + guint64 t1, t2; + gdouble d1, d2; + gchar *s1, *s2; + + g_variant_builder_init (&ret, G_VARIANT_TYPE ("(a{yy}a{bb}a{nn}a{qq}a{ii}a{uu}a{xx}a{tt}a{dd}a{ss}a{oo}a{gg})")); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{yy}")); + v = g_variant_get_child_value (parameters, 0); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "yy", &y1, &y2)) + g_variant_builder_add (&ret, "{yy}", y1 * 2, (y2 * 3) & 255); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{bb}")); + v = g_variant_get_child_value (parameters, 1); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "bb", &b1, &b2)) + g_variant_builder_add (&ret, "{bb}", b1, TRUE); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{nn}")); + v = g_variant_get_child_value (parameters, 2); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "nn", &n1, &n2)) + g_variant_builder_add (&ret, "{nn}", n1 * 2, n2 * 3); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{qq}")); + v = g_variant_get_child_value (parameters, 3); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "qq", &q1, &q2)) + g_variant_builder_add (&ret, "{qq}", q1 * 2, q2 * 3); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{ii}")); + v = g_variant_get_child_value (parameters, 4); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "ii", &i1, &i2)) + g_variant_builder_add (&ret, "{ii}", i1 * 2, i2 * 3); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{uu}")); + v = g_variant_get_child_value (parameters, 5); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "uu", &u1, &u2)) + g_variant_builder_add (&ret, "{uu}", u1 * 2, u2 * 3); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{xx}")); + v = g_variant_get_child_value (parameters, 6); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "xx", &x1, &x2)) + g_variant_builder_add (&ret, "{xx}", x1 + 2, x2 + 1); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{tt}")); + v = g_variant_get_child_value (parameters, 7); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "tt", &t1, &t2)) + g_variant_builder_add (&ret, "{tt}", t1 + 2, t2 + 1); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{dd}")); + v = g_variant_get_child_value (parameters, 8); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "dd", &d1, &d2)) + g_variant_builder_add (&ret, "{dd}", d1 + 2.5, d2 + 5.0); + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{ss}")); + v = g_variant_get_child_value (parameters, 9); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "ss", &s1, &s2)) + { + gchar *tmp1, *tmp2; + tmp1 = g_strconcat (s1, "mod", NULL); + tmp2 = g_strconcat (s2, s2, NULL); + g_variant_builder_add (&ret, "{ss}", tmp1, tmp2); + g_free (tmp1); + g_free (tmp2); + } + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{oo}")); + v = g_variant_get_child_value (parameters, 10); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "oo", &s1, &s2)) + { + gchar *tmp1, *tmp2; + tmp1 = g_strconcat (s1, "/mod", NULL); + tmp2 = g_strconcat (s2, "/mod2", NULL); + g_variant_builder_add (&ret, "{oo}", tmp1, tmp2); + g_free (tmp1); + g_free (tmp2); + } + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_variant_builder_open (&ret, G_VARIANT_TYPE ("a{gg}")); + v = g_variant_get_child_value (parameters, 11); + g_variant_iter_init (&iter, v); + while (g_variant_iter_loop (&iter, "gg", &s1, &s2)) + { + gchar *tmp1, *tmp2; + tmp1 = g_strconcat (s1, "assgit", NULL); + tmp2 = g_strconcat (s2, s2, NULL); + g_variant_builder_add (&ret, "{gg}", tmp1, tmp2); + g_free (tmp1); + g_free (tmp2); + } + g_variant_unref (v); + g_variant_builder_close (&ret); + + g_dbus_method_invocation_return_value (invocation, + g_variant_builder_end (&ret)); + } + else if (g_strcmp0 (method_name, "TestStructureTypes") == 0) + { + gint x, y, x1, y1; + const gchar *desc; + GVariantIter *iter1, *iter2; + gchar *desc_ret; + GVariantBuilder ret1, ret2; + GVariantIter *iter; + GVariant *v; + gchar *s1, *s2; + + g_variant_get (parameters, "((ii)(&s(ii)aya{ss}))", + &x, &y, &desc, &x1, &y1, &iter1, &iter2); + + desc_ret = g_strconcat (desc, "... in bed!", NULL); + + g_variant_builder_init (&ret1, G_VARIANT_TYPE ("ay")); + iter = g_variant_iter_copy (iter1); + while (g_variant_iter_loop (iter1, "y", &v)) + g_variant_builder_add (&ret1, "y", v); + while (g_variant_iter_loop (iter, "y", &v)) + g_variant_builder_add (&ret1, "y", v); + g_variant_iter_free (iter); + g_variant_iter_free (iter1); + + g_variant_builder_init (&ret2, G_VARIANT_TYPE ("a{ss}")); + while (g_variant_iter_loop (iter1, "ss", &s1, &s2)) + { + gchar *tmp; + tmp = g_strconcat (s2, " ... in bed!", NULL); + g_variant_builder_add (&ret1, "{ss}", s1, tmp); + g_free (tmp); + } + g_variant_iter_free (iter2); + + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("((ii)(&s(ii)aya{ss}))", + x + 1, y + 1, desc_ret, x1 + 2, y1 + 2, + &ret1, &ret2)); + + g_free (desc_ret); + } + else if (g_strcmp0 (method_name, "TestVariant") == 0) + { + GVariant *v; + gboolean modify; + GVariant *ret; + + g_variant_get (parameters, "(vb)", &v, &modify); + + /* FIXME handle more cases */ + if (modify) + { + if (g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) + { + ret = g_variant_new_boolean (FALSE); + } + else if (g_variant_is_of_type (v, G_VARIANT_TYPE_TUPLE)) + { + ret = g_variant_new ("(si)", "other struct", 100); + } + else + g_assert_not_reached (); + } + else + ret = v; + + g_dbus_method_invocation_return_value (invocation, ret); + g_variant_unref (v); + } + else if (g_strcmp0 (method_name, "TestComplexArrays") == 0) + { + /* FIXME */ + g_dbus_method_invocation_return_value (invocation, parameters); + } + else if (g_strcmp0 (method_name, "TestComplexHashTables") == 0) + { + /* FIXME */ + g_dbus_method_invocation_return_value (invocation, parameters); + } + else if (g_strcmp0 (method_name, "FrobSetProperty") == 0) + { + gchar *name; + GVariant *value; + g_variant_get (parameters, "(sv)", &name, &value); + g_hash_table_replace (properties, name, value); + g_dbus_connection_emit_signal (connection, + NULL, + "/com/example/TestObject", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new_parsed ("('com.example.Frob', [{%s, %v}], @as [])", name, value), + NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "FrobInvalidateProperty") == 0) + { + const gchar *value; + g_variant_get (parameters, "(&s)", &value); + g_hash_table_replace (properties, g_strdup ("PropertyThatWillBeInvalidated"), g_variant_ref_sink (g_variant_new_string (value))); + + g_dbus_connection_emit_signal (connection, + NULL, + "/com/example/TestObject", + "org.freedesktop.DBus.Properties", + "PropertiesChanged", + g_variant_new_parsed ("('com.example.Frob', @a{sv} [], ['PropertyThatWillBeInvalidated'])"), + NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "EmitSignal") == 0) + { + const gchar *str; + const gchar *path; + gchar *str_ret; + gchar *path_ret; + g_variant_get (parameters, "(&s&o)", &str, &path); + str_ret = g_strconcat (str, " .. in bed!", NULL); + path_ret = g_strconcat (path, "/in/bed", NULL); + g_dbus_connection_emit_signal (connection, + NULL, + "/com/example/TestObject", + "com.example.Frob", + "TestSignal", + g_variant_new_parsed ("(%s, %o, <'a variant'>)", str_ret, path_ret), + NULL); + g_free (str_ret); + g_free (path_ret); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "EmitSignal2") == 0) + { + g_dbus_connection_emit_signal (connection, + NULL, + "/com/example/TestObject", + "com.example.Frob", + "TestSignal2", + g_variant_new_parsed ("(42, )"), + NULL); + g_dbus_method_invocation_return_value (invocation, NULL); + } + else if (g_strcmp0 (method_name, "Sleep") == 0) + { + gint msec; + + g_variant_get (parameters, "(i)", &msec); + + g_timeout_add ((guint)msec, end_sleep, g_object_ref (invocation)); + } + else if (g_strcmp0 (method_name, "Quit") == 0) + { + g_dbus_method_invocation_return_value (invocation, NULL); + g_main_loop_quit (loop); + } +} + +static GVariant * +handle_get_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GError **error, + gpointer user_data) +{ + GVariant *ret; + + ret = g_hash_table_lookup (properties, property_name); + if (ret) + { + g_assert (!g_variant_is_floating (ret)); + g_variant_ref (ret); + } + else + { + g_set_error (error, + G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "no such property: %s", property_name); + } + + return ret; +} + +static gboolean +handle_set_property (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *property_name, + GVariant *value, + GError **error, + gpointer user_data) +{ + g_set_error (error, + G_DBUS_ERROR, G_DBUS_ERROR_FAILED, + "SetProperty not implemented"); + return FALSE; +} + +static const GDBusInterfaceVTable interface_vtable = +{ + handle_method_call, + handle_get_property, + handle_set_property +}; + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + guint id; + + id = g_dbus_connection_register_object (connection, + "/com/example/TestObject", + introspection_data->interfaces[0], + &interface_vtable, + NULL, + NULL, + NULL); + g_assert (id > 0); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + exit (1); +} + +int +main (int argc, char *argv[]) +{ + guint owner_id; + + introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); + properties = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); + g_hash_table_insert (properties, g_strdup ("y"), g_variant_ref_sink (g_variant_new_byte (1))); + g_hash_table_insert (properties, g_strdup ("b"), g_variant_ref_sink (g_variant_new_boolean (TRUE))); + g_hash_table_insert (properties, g_strdup ("n"), g_variant_ref_sink (g_variant_new_int16 (2))); + g_hash_table_insert (properties, g_strdup ("q"), g_variant_ref_sink (g_variant_new_uint16 (3))); + g_hash_table_insert (properties, g_strdup ("i"), g_variant_ref_sink (g_variant_new_int32 (4))); + g_hash_table_insert (properties, g_strdup ("u"), g_variant_ref_sink (g_variant_new_uint32 (5))); + g_hash_table_insert (properties, g_strdup ("x"), g_variant_ref_sink (g_variant_new_int64 (6))); + g_hash_table_insert (properties, g_strdup ("t"), g_variant_ref_sink (g_variant_new_uint64 (7))); + g_hash_table_insert (properties, g_strdup ("d"), g_variant_ref_sink (g_variant_new_double (7.5))); + g_hash_table_insert (properties, g_strdup ("s"), g_variant_ref_sink (g_variant_new_string ("a string"))); + g_hash_table_insert (properties, g_strdup ("o"), g_variant_ref_sink (g_variant_new_object_path ("/some/path"))); + g_hash_table_insert (properties, g_strdup ("ay"), g_variant_ref_sink (g_variant_new_parsed ("[@y 1, @y 11]"))); + g_hash_table_insert (properties, g_strdup ("ab"), g_variant_ref_sink (g_variant_new_parsed ("[true, false]"))); + g_hash_table_insert (properties, g_strdup ("an"), g_variant_ref_sink (g_variant_new_parsed ("[@n 2, @n 12]"))); + g_hash_table_insert (properties, g_strdup ("aq"), g_variant_ref_sink (g_variant_new_parsed ("[@q 3, @q 13]"))); + g_hash_table_insert (properties, g_strdup ("ai"), g_variant_ref_sink (g_variant_new_parsed ("[@i 4, @i 14]"))); + g_hash_table_insert (properties, g_strdup ("au"), g_variant_ref_sink (g_variant_new_parsed ("[@u 5, @u 15]"))); + g_hash_table_insert (properties, g_strdup ("ax"), g_variant_ref_sink (g_variant_new_parsed ("[@x 6, @x 16]"))); + g_hash_table_insert (properties, g_strdup ("at"), g_variant_ref_sink (g_variant_new_parsed ("[@t 7, @t 17]"))); + g_hash_table_insert (properties, g_strdup ("ad"), g_variant_ref_sink (g_variant_new_parsed ("[7.5, 17.5]"))); + g_hash_table_insert (properties, g_strdup ("as"), g_variant_ref_sink (g_variant_new_parsed ("['a string', 'another string']"))); + g_hash_table_insert (properties, g_strdup ("ao"), g_variant_ref_sink (g_variant_new_parsed ("[@o '/some/path', @o '/another/path']"))); + g_hash_table_insert (properties, g_strdup ("foo"), g_variant_ref_sink (g_variant_new_string ("a frobbed string"))); + g_hash_table_insert (properties, g_strdup ("PropertyThatWillBeInvalidated"), g_variant_ref_sink (g_variant_new_string ("InitialValue"))); + + owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "com.example.TestService", + G_BUS_NAME_OWNER_FLAGS_NONE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); + + g_dbus_node_info_unref (introspection_data); + + return 0; +} diff --git a/gio/tests/gdbus-threading.c b/gio/tests/gdbus-threading.c new file mode 100644 index 0000000..1f0fc52 --- /dev/null +++ b/gio/tests/gdbus-threading.c @@ -0,0 +1,613 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2010 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: David Zeuthen + */ + +#include +#include +#include + +#include "gdbus-tests.h" + +/* all tests rely on a global connection */ +static GDBusConnection *c = NULL; + +/* ---------------------------------------------------------------------------------------------------- */ +/* Ensure that signal and method replies are delivered in the right thread */ +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + GThread *thread; + GMainLoop *thread_loop; + guint signal_count; +} DeliveryData; + +static void +msg_cb_expect_success (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + DeliveryData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_variant_unref (result); + + g_assert (g_thread_self () == data->thread); + + g_main_loop_quit (data->thread_loop); +} + +static void +msg_cb_expect_error_cancelled (GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + DeliveryData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_connection_call_finish (connection, + res, + &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert (!g_dbus_error_is_remote_error (error)); + g_error_free (error); + g_assert (result == NULL); + + g_assert (g_thread_self () == data->thread); + + g_main_loop_quit (data->thread_loop); +} + +static void +signal_handler (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + DeliveryData *data = user_data; + + g_assert (g_thread_self () == data->thread); + + data->signal_count++; + + g_main_loop_quit (data->thread_loop); +} + +static gpointer +test_delivery_in_thread_func (gpointer _data) +{ + GMainLoop *thread_loop; + GMainContext *thread_context; + DeliveryData data; + GCancellable *ca; + guint subscription_id; + GDBusConnection *priv_c; + GError *error; + + error = NULL; + + thread_context = g_main_context_new (); + thread_loop = g_main_loop_new (thread_context, FALSE); + g_main_context_push_thread_default (thread_context); + + data.thread = g_thread_self (); + data.thread_loop = thread_loop; + data.signal_count = 0; + + /* ---------------------------------------------------------------------------------------------------- */ + + /* + * Check that we get a reply to the GetId() method call. + */ + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) msg_cb_expect_success, + &data); + g_main_loop_run (thread_loop); + + /* + * Check that we never actually send a message if the GCancellable + * is already cancelled - i.e. we should get #G_IO_ERROR_CANCELLED + * when the actual connection is not up. + */ + ca = g_cancellable_new (); + g_cancellable_cancel (ca); + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + ca, + (GAsyncReadyCallback) msg_cb_expect_error_cancelled, + &data); + g_main_loop_run (thread_loop); + g_object_unref (ca); + + /* + * Check that cancellation works when the message is already in flight. + */ + ca = g_cancellable_new (); + g_dbus_connection_call (c, + "org.freedesktop.DBus", /* bus_name */ + "/org/freedesktop/DBus", /* object path */ + "org.freedesktop.DBus", /* interface name */ + "GetId", /* method name */ + NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + ca, + (GAsyncReadyCallback) msg_cb_expect_error_cancelled, + &data); + g_cancellable_cancel (ca); + g_main_loop_run (thread_loop); + g_object_unref (ca); + + /* + * Check that signals are delivered to the correct thread. + * + * First we subscribe to the signal, then we create a a private + * connection. This should cause a NameOwnerChanged message from + * the message bus. + */ + subscription_id = g_dbus_connection_signal_subscribe (c, + "org.freedesktop.DBus", /* sender */ + "org.freedesktop.DBus", /* interface */ + "NameOwnerChanged", /* member */ + "/org/freedesktop/DBus", /* path */ + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + signal_handler, + &data, + NULL); + g_assert (subscription_id != 0); + g_assert (data.signal_count == 0); + + priv_c = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (priv_c != NULL); + + g_main_loop_run (thread_loop); + g_assert (data.signal_count == 1); + + g_object_unref (priv_c); + + g_dbus_connection_signal_unsubscribe (c, subscription_id); + + /* ---------------------------------------------------------------------------------------------------- */ + + g_main_context_pop_thread_default (thread_context); + g_main_loop_unref (thread_loop); + g_main_context_unref (thread_context); + + return NULL; +} + +static void +test_delivery_in_thread (void) +{ + GThread *thread; + + thread = g_thread_new ("deliver", + test_delivery_in_thread_func, + NULL); + + g_thread_join (thread); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +typedef struct { + GDBusProxy *proxy; + gint msec; + guint num; + gboolean async; + + GMainLoop *thread_loop; + GThread *thread; +} SyncThreadData; + +static void +sleep_cb (GDBusProxy *proxy, + GAsyncResult *res, + gpointer user_data) +{ + SyncThreadData *data = user_data; + GError *error; + GVariant *result; + + error = NULL; + result = g_dbus_proxy_call_finish (proxy, + res, + &error); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + + g_assert (data->thread == g_thread_self ()); + + g_main_loop_quit (data->thread_loop); + + //g_debug ("async cb (%p)", g_thread_self ()); +} + +static gpointer +test_sleep_in_thread_func (gpointer _data) +{ + SyncThreadData *data = _data; + GMainContext *thread_context; + guint n; + + thread_context = g_main_context_new (); + data->thread_loop = g_main_loop_new (thread_context, FALSE); + g_main_context_push_thread_default (thread_context); + + data->thread = g_thread_self (); + + for (n = 0; n < data->num; n++) + { + if (data->async) + { + //g_debug ("invoking async (%p)", g_thread_self ()); + g_dbus_proxy_call (data->proxy, + "Sleep", + g_variant_new ("(i)", data->msec), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + (GAsyncReadyCallback) sleep_cb, + data); + g_main_loop_run (data->thread_loop); + g_print ("A"); + //g_debug ("done invoking async (%p)", g_thread_self ()); + } + else + { + GError *error; + GVariant *result; + + error = NULL; + //g_debug ("invoking sync (%p)", g_thread_self ()); + result = g_dbus_proxy_call_sync (data->proxy, + "Sleep", + g_variant_new ("(i)", data->msec), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + g_print ("S"); + //g_debug ("done invoking sync (%p)", g_thread_self ()); + g_assert_no_error (error); + g_assert (result != NULL); + g_assert_cmpstr (g_variant_get_type_string (result), ==, "()"); + g_variant_unref (result); + } + } + + g_main_context_pop_thread_default (thread_context); + g_main_loop_unref (data->thread_loop); + g_main_context_unref (thread_context); + + return NULL; +} + +static void +test_method_calls_on_proxy (GDBusProxy *proxy) +{ + guint n; + + /* + * Check that multiple threads can do calls without interferring with + * each other. We do this by creating three threads that call the + * Sleep() method on the server (which handles it asynchronously, e.g. + * it won't block other requests) with different sleep durations and + * a number of times. We do this so each set of calls add up to 4000 + * milliseconds. + * + * The dbus test server that this code calls into uses glib timeouts + * to do the sleeping which have only a granularity of 1ms. It is + * therefore possible to lose as much as 40ms; the test could finish + * in slightly less than 4 seconds. + * + * We run this test twice - first with async calls in each thread, then + * again with sync calls + */ + + for (n = 0; n < 2; n++) + { + gboolean do_async; + GThread *thread1; + GThread *thread2; + GThread *thread3; + SyncThreadData data1; + SyncThreadData data2; + SyncThreadData data3; + GTimeVal start_time; + GTimeVal end_time; + guint elapsed_msec; + + do_async = (n == 0); + + g_get_current_time (&start_time); + + data1.proxy = proxy; + data1.msec = 40; + data1.num = 100; + data1.async = do_async; + thread1 = g_thread_new ("sleep", + test_sleep_in_thread_func, + &data1); + + data2.proxy = proxy; + data2.msec = 20; + data2.num = 200; + data2.async = do_async; + thread2 = g_thread_new ("sleep2", + test_sleep_in_thread_func, + &data2); + + data3.proxy = proxy; + data3.msec = 100; + data3.num = 40; + data3.async = do_async; + thread3 = g_thread_new ("sleep3", + test_sleep_in_thread_func, + &data3); + + g_thread_join (thread1); + g_thread_join (thread2); + g_thread_join (thread3); + + g_get_current_time (&end_time); + + elapsed_msec = ((end_time.tv_sec * G_USEC_PER_SEC + end_time.tv_usec) - + (start_time.tv_sec * G_USEC_PER_SEC + start_time.tv_usec)) / 1000; + + //g_debug ("Elapsed time for %s = %d msec", n == 0 ? "async" : "sync", elapsed_msec); + + /* elapsed_msec should be 4000 msec +/- change for overhead/inaccuracy */ + g_assert_cmpint (elapsed_msec, >=, 3950); + g_assert_cmpint (elapsed_msec, <, 8000); + + g_print (" "); + } +} + +static void +test_method_calls_in_thread (void) +{ + GDBusProxy *proxy; + GDBusConnection *connection; + GError *error; + gchar *name_owner; + + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, + NULL, + &error); + g_assert_no_error (error); + error = NULL; + proxy = g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "com.example.TestService", /* name */ + "/com/example/TestObject", /* object path */ + "com.example.Frob", /* interface */ + NULL, /* GCancellable */ + &error); + g_assert_no_error (error); + + name_owner = g_dbus_proxy_get_name_owner (proxy); + g_assert_cmpstr (name_owner, !=, NULL); + g_free (name_owner); + + test_method_calls_on_proxy (proxy); + + g_object_unref (proxy); + g_object_unref (connection); +} + +#define SLEEP_MIN_USEC 1 +#define SLEEP_MAX_USEC 10 + +/* Can run in any thread */ +static void +ensure_connection_works (GDBusConnection *conn) +{ + GVariant *v; + GError *error = NULL; + + v = g_dbus_connection_call_sync (conn, "org.freedesktop.DBus", + "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetId", NULL, NULL, 0, -1, + NULL, &error); + g_assert_no_error (error); + g_assert (v != NULL); + g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE ("(s)"))); + g_variant_unref (v); +} + +/* + * get_sync_in_thread: + * @data: (type guint): delay in microseconds + * + * Sleep for a short time, then get a session bus connection and call + * a method on it. + * + * Runs in a non-main thread. + * + * Returns: (transfer full): the connection + */ +static gpointer +get_sync_in_thread (gpointer data) +{ + guint delay = GPOINTER_TO_UINT (data); + GError *error = NULL; + GDBusConnection *conn; + + g_usleep (delay); + + conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + + ensure_connection_works (conn); + + return conn; +} + +static void +test_threaded_singleton (void) +{ + guint i, n; + guint unref_wins = 0; + guint get_wins = 0; + + if (g_test_thorough ()) + n = 100000; + else + n = 5000; + + for (i = 0; i < n; i++) + { + GThread *thread; + guint j; + guint unref_delay, get_delay; + GDBusConnection *new_conn; + + /* We want to be the last ref, so let it finish setting up */ + for (j = 0; j < 100; j++) + { + guint r = g_atomic_int_get (&G_OBJECT (c)->ref_count); + + if (r == 1) + break; + + g_debug ("run %u: refcount is %u, sleeping", i, r); + g_usleep (1000); + } + + if (j == 100) + g_error ("connection had too many refs"); + + if (g_test_verbose () && (i % (n/50)) == 0) + g_print ("%u%%\n", ((i * 100) / n)); + + /* Delay for a random time on each side of the race, to perturb the + * timing. Ideally, we want each side to win half the races; these + * timings are about right on smcv's laptop. + */ + unref_delay = g_random_int_range (SLEEP_MIN_USEC, SLEEP_MAX_USEC); + get_delay = g_random_int_range (SLEEP_MIN_USEC / 2, SLEEP_MAX_USEC / 2); + + /* One half of the race is to call g_bus_get_sync... */ + thread = g_thread_new ("get_sync_in_thread", get_sync_in_thread, + GUINT_TO_POINTER (get_delay)); + + /* ... and the other half is to unref the shared connection, which must + * have exactly one ref at this point + */ + g_usleep (unref_delay); + g_object_unref (c); + + /* Wait for the thread to run; see what it got */ + new_conn = g_thread_join (thread); + + /* If the thread won the race, it will have kept the same connection, + * and it'll have one ref + */ + if (new_conn == c) + { + get_wins++; + } + else + { + unref_wins++; + /* c is invalid now, but new_conn is suitable for the + * next round + */ + c = new_conn; + } + + ensure_connection_works (c); + } + + if (g_test_verbose ()) + g_print ("Unref won %u races; Get won %u races\n", unref_wins, get_wins); +} + +/* ---------------------------------------------------------------------------------------------------- */ + +int +main (int argc, + char *argv[]) +{ + GError *error; + gint ret; + + g_test_init (&argc, &argv, NULL); + + session_bus_up (); + + /* this is safe; testserver will exit once the bus goes away */ + g_assert (g_spawn_command_line_async ("./gdbus-testserver", NULL)); + + /* wait for the service to come up */ + usleep (500 * 1000); + + /* Create the connection in the main thread */ + error = NULL; + c = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + g_assert_no_error (error); + g_assert (c != NULL); + + g_test_add_func ("/gdbus/delivery-in-thread", test_delivery_in_thread); + g_test_add_func ("/gdbus/method-calls-in-thread", test_method_calls_in_thread); + g_test_add_func ("/gdbus/threaded-singleton", test_threaded_singleton); + + ret = g_test_run(); + + g_object_unref (c); + + /* tear down bus */ + session_bus_down (); + + return ret; +} diff --git a/gio/tests/gmenumodel.c b/gio/tests/gmenumodel.c new file mode 100644 index 0000000..b5bdac2 --- /dev/null +++ b/gio/tests/gmenumodel.c @@ -0,0 +1,1164 @@ +#include + +#include "gdbus-sessionbus.h" + +/* Markup printing {{{1 */ + +/* This used to be part of GLib, but it was removed before the stable + * release because it wasn't generally useful. We want it here, though. + */ +static void +indent_string (GString *string, + gint indent) +{ + while (indent--) + g_string_append_c (string, ' '); +} + +static GString * +g_menu_markup_print_string (GString *string, + GMenuModel *model, + gint indent, + gint tabstop) +{ + gboolean need_nl = FALSE; + gint i, n; + + if G_UNLIKELY (string == NULL) + string = g_string_new (NULL); + + n = g_menu_model_get_n_items (model); + + for (i = 0; i < n; i++) + { + GMenuAttributeIter *attr_iter; + GMenuLinkIter *link_iter; + GString *contents; + GString *attrs; + + attr_iter = g_menu_model_iterate_item_attributes (model, i); + link_iter = g_menu_model_iterate_item_links (model, i); + contents = g_string_new (NULL); + attrs = g_string_new (NULL); + + while (g_menu_attribute_iter_next (attr_iter)) + { + const char *name = g_menu_attribute_iter_get_name (attr_iter); + GVariant *value = g_menu_attribute_iter_get_value (attr_iter); + + if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)) + { + gchar *str; + str = g_markup_printf_escaped (" %s='%s'", name, g_variant_get_string (value, NULL)); + g_string_append (attrs, str); + g_free (str); + } + + else + { + gchar *printed; + gchar *str; + const gchar *type; + + printed = g_variant_print (value, TRUE); + type = g_variant_type_peek_string (g_variant_get_type (value)); + str = g_markup_printf_escaped ("%s\n", name, type, printed); + indent_string (contents, indent + tabstop); + g_string_append (contents, str); + g_free (printed); + g_free (str); + } + + g_variant_unref (value); + } + g_object_unref (attr_iter); + + while (g_menu_link_iter_next (link_iter)) + { + const gchar *name = g_menu_link_iter_get_name (link_iter); + GMenuModel *menu = g_menu_link_iter_get_value (link_iter); + gchar *str; + + if (contents->str[0]) + g_string_append_c (contents, '\n'); + + str = g_markup_printf_escaped ("\n", name); + indent_string (contents, indent + tabstop); + g_string_append (contents, str); + g_free (str); + + g_menu_markup_print_string (contents, menu, indent + 2 * tabstop, tabstop); + + indent_string (contents, indent + tabstop); + g_string_append (contents, "\n"); + g_object_unref (menu); + } + g_object_unref (link_iter); + + if (contents->str[0]) + { + indent_string (string, indent); + g_string_append_printf (string, "\n", attrs->str); + g_string_append (string, contents->str); + indent_string (string, indent); + g_string_append (string, "\n"); + need_nl = TRUE; + } + + else + { + if (need_nl) + g_string_append_c (string, '\n'); + + indent_string (string, indent); + g_string_append_printf (string, "\n", attrs->str); + need_nl = FALSE; + } + + g_string_free (contents, TRUE); + g_string_free (attrs, TRUE); + } + + return string; +} + +/* TestItem {{{1 */ + +/* This utility struct is used by both the RandomMenu and MirrorMenu + * class implementations below. + */ +typedef struct { + GHashTable *attributes; + GHashTable *links; +} TestItem; + +static TestItem * +test_item_new (GHashTable *attributes, + GHashTable *links) +{ + TestItem *item; + + item = g_slice_new (TestItem); + item->attributes = g_hash_table_ref (attributes); + item->links = g_hash_table_ref (links); + + return item; +} + +static void +test_item_free (gpointer data) +{ + TestItem *item = data; + + g_hash_table_unref (item->attributes); + g_hash_table_unref (item->links); + + g_slice_free (TestItem, item); +} + +/* RandomMenu {{{1 */ +#define MAX_ITEMS 5 +#define TOP_ORDER 4 + +typedef struct { + GMenuModel parent_instance; + + GSequence *items; + gint order; +} RandomMenu; + +typedef GMenuModelClass RandomMenuClass; + +static GType random_menu_get_type (void); +G_DEFINE_TYPE (RandomMenu, random_menu, G_TYPE_MENU_MODEL); + +static gboolean +random_menu_is_mutable (GMenuModel *model) +{ + return TRUE; +} + +static gint +random_menu_get_n_items (GMenuModel *model) +{ + RandomMenu *menu = (RandomMenu *) model; + + return g_sequence_get_length (menu->items); +} + +static void +random_menu_get_item_attributes (GMenuModel *model, + gint position, + GHashTable **table) +{ + RandomMenu *menu = (RandomMenu *) model; + TestItem *item; + + item = g_sequence_get (g_sequence_get_iter_at_pos (menu->items, position)); + *table = g_hash_table_ref (item->attributes); +} + +static void +random_menu_get_item_links (GMenuModel *model, + gint position, + GHashTable **table) +{ + RandomMenu *menu = (RandomMenu *) model; + TestItem *item; + + item = g_sequence_get (g_sequence_get_iter_at_pos (menu->items, position)); + *table = g_hash_table_ref (item->links); +} + +static void +random_menu_finalize (GObject *object) +{ + RandomMenu *menu = (RandomMenu *) object; + + g_sequence_free (menu->items); + + G_OBJECT_CLASS (random_menu_parent_class) + ->finalize (object); +} + +static void +random_menu_init (RandomMenu *menu) +{ +} + +static void +random_menu_class_init (GMenuModelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + class->is_mutable = random_menu_is_mutable; + class->get_n_items = random_menu_get_n_items; + class->get_item_attributes = random_menu_get_item_attributes; + class->get_item_links = random_menu_get_item_links; + + object_class->finalize = random_menu_finalize; +} + +static RandomMenu * random_menu_new (GRand *rand, gint order); + +static void +random_menu_change (RandomMenu *menu, + GRand *rand) +{ + gint position, removes, adds; + GSequenceIter *point; + gint n_items; + gint i; + + n_items = g_sequence_get_length (menu->items); + + do + { + position = g_rand_int_range (rand, 0, n_items + 1); + removes = g_rand_int_range (rand, 0, n_items - position + 1); + adds = g_rand_int_range (rand, 0, MAX_ITEMS - (n_items - removes) + 1); + } + while (removes == 0 && adds == 0); + + point = g_sequence_get_iter_at_pos (menu->items, position + removes); + + if (removes) + { + GSequenceIter *start; + + start = g_sequence_get_iter_at_pos (menu->items, position); + g_sequence_remove_range (start, point); + } + + for (i = 0; i < adds; i++) + { + const gchar *label; + GHashTable *links; + GHashTable *attributes; + + attributes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); + + if (menu->order > 0 && g_rand_boolean (rand)) + { + RandomMenu *child; + const gchar *subtype; + + child = random_menu_new (rand, menu->order - 1); + + if (g_rand_boolean (rand)) + { + subtype = G_MENU_LINK_SECTION; + /* label some section headers */ + if (g_rand_boolean (rand)) + label = "Section"; + else + label = NULL; + } + else + { + /* label all submenus */ + subtype = G_MENU_LINK_SUBMENU; + label = "Submenu"; + } + + g_hash_table_insert (links, g_strdup (subtype), child); + } + else + /* label all terminals */ + label = "Menu Item"; + + if (label) + g_hash_table_insert (attributes, g_strdup ("label"), g_variant_ref_sink (g_variant_new_string (label))); + + g_sequence_insert_before (point, test_item_new (attributes, links)); + g_hash_table_unref (links); + g_hash_table_unref (attributes); + } + + g_menu_model_items_changed (G_MENU_MODEL (menu), position, removes, adds); +} + +static RandomMenu * +random_menu_new (GRand *rand, + gint order) +{ + RandomMenu *menu; + + menu = g_object_new (random_menu_get_type (), NULL); + menu->items = g_sequence_new (test_item_free); + menu->order = order; + + random_menu_change (menu, rand); + + return menu; +} + +/* MirrorMenu {{{1 */ +typedef struct { + GMenuModel parent_instance; + + GMenuModel *clone_of; + GSequence *items; + gulong handler_id; +} MirrorMenu; + +typedef GMenuModelClass MirrorMenuClass; + +static GType mirror_menu_get_type (void); +G_DEFINE_TYPE (MirrorMenu, mirror_menu, G_TYPE_MENU_MODEL); + +static gboolean +mirror_menu_is_mutable (GMenuModel *model) +{ + MirrorMenu *menu = (MirrorMenu *) model; + + return menu->handler_id != 0; +} + +static gint +mirror_menu_get_n_items (GMenuModel *model) +{ + MirrorMenu *menu = (MirrorMenu *) model; + + return g_sequence_get_length (menu->items); +} + +static void +mirror_menu_get_item_attributes (GMenuModel *model, + gint position, + GHashTable **table) +{ + MirrorMenu *menu = (MirrorMenu *) model; + TestItem *item; + + item = g_sequence_get (g_sequence_get_iter_at_pos (menu->items, position)); + *table = g_hash_table_ref (item->attributes); +} + +static void +mirror_menu_get_item_links (GMenuModel *model, + gint position, + GHashTable **table) +{ + MirrorMenu *menu = (MirrorMenu *) model; + TestItem *item; + + item = g_sequence_get (g_sequence_get_iter_at_pos (menu->items, position)); + *table = g_hash_table_ref (item->links); +} + +static void +mirror_menu_finalize (GObject *object) +{ + MirrorMenu *menu = (MirrorMenu *) object; + + if (menu->handler_id) + g_signal_handler_disconnect (menu->clone_of, menu->handler_id); + + g_sequence_free (menu->items); + g_object_unref (menu->clone_of); + + G_OBJECT_CLASS (mirror_menu_parent_class) + ->finalize (object); +} + +static void +mirror_menu_init (MirrorMenu *menu) +{ +} + +static void +mirror_menu_class_init (GMenuModelClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + class->is_mutable = mirror_menu_is_mutable; + class->get_n_items = mirror_menu_get_n_items; + class->get_item_attributes = mirror_menu_get_item_attributes; + class->get_item_links = mirror_menu_get_item_links; + + object_class->finalize = mirror_menu_finalize; +} + +static MirrorMenu * mirror_menu_new (GMenuModel *clone_of); + +static void +mirror_menu_changed (GMenuModel *model, + gint position, + gint removed, + gint added, + gpointer user_data) +{ + MirrorMenu *menu = user_data; + GSequenceIter *point; + gint i; + + g_assert (model == menu->clone_of); + + point = g_sequence_get_iter_at_pos (menu->items, position + removed); + + if (removed) + { + GSequenceIter *start; + + start = g_sequence_get_iter_at_pos (menu->items, position); + g_sequence_remove_range (start, point); + } + + for (i = position; i < position + added; i++) + { + GMenuAttributeIter *attr_iter; + GMenuLinkIter *link_iter; + GHashTable *links; + GHashTable *attributes; + const gchar *name; + GMenuModel *child; + GVariant *value; + + attributes = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); + links = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref); + + attr_iter = g_menu_model_iterate_item_attributes (model, i); + while (g_menu_attribute_iter_get_next (attr_iter, &name, &value)) + { + g_hash_table_insert (attributes, g_strdup (name), value); + } + g_object_unref (attr_iter); + + link_iter = g_menu_model_iterate_item_links (model, i); + while (g_menu_link_iter_get_next (link_iter, &name, &child)) + { + g_hash_table_insert (links, g_strdup (name), mirror_menu_new (child)); + g_object_unref (child); + } + g_object_unref (link_iter); + + g_sequence_insert_before (point, test_item_new (attributes, links)); + g_hash_table_unref (attributes); + g_hash_table_unref (links); + } + + g_menu_model_items_changed (G_MENU_MODEL (menu), position, removed, added); +} + +static MirrorMenu * +mirror_menu_new (GMenuModel *clone_of) +{ + MirrorMenu *menu; + + menu = g_object_new (mirror_menu_get_type (), NULL); + menu->items = g_sequence_new (test_item_free); + menu->clone_of = g_object_ref (clone_of); + + if (g_menu_model_is_mutable (clone_of)) + menu->handler_id = g_signal_connect (clone_of, "items-changed", G_CALLBACK (mirror_menu_changed), menu); + mirror_menu_changed (clone_of, 0, 0, g_menu_model_get_n_items (clone_of), menu); + + return menu; +} + +/* check_menus_equal(), assert_menus_equal() {{{1 */ +static gboolean +check_menus_equal (GMenuModel *a, + GMenuModel *b) +{ + gboolean equal = TRUE; + gint a_n, b_n; + gint i; + + a_n = g_menu_model_get_n_items (a); + b_n = g_menu_model_get_n_items (b); + + if (a_n != b_n) + return FALSE; + + for (i = 0; i < a_n; i++) + { + GMenuAttributeIter *attr_iter; + GVariant *a_value, *b_value; + GMenuLinkIter *link_iter; + GMenuModel *a_menu, *b_menu; + const gchar *name; + + attr_iter = g_menu_model_iterate_item_attributes (a, i); + while (g_menu_attribute_iter_get_next (attr_iter, &name, &a_value)) + { + b_value = g_menu_model_get_item_attribute_value (b, i, name, NULL); + equal &= b_value && g_variant_equal (a_value, b_value); + if (b_value) + g_variant_unref (b_value); + g_variant_unref (a_value); + } + g_object_unref (attr_iter); + + attr_iter = g_menu_model_iterate_item_attributes (b, i); + while (g_menu_attribute_iter_get_next (attr_iter, &name, &b_value)) + { + a_value = g_menu_model_get_item_attribute_value (a, i, name, NULL); + equal &= a_value && g_variant_equal (a_value, b_value); + if (a_value) + g_variant_unref (a_value); + g_variant_unref (b_value); + } + g_object_unref (attr_iter); + + link_iter = g_menu_model_iterate_item_links (a, i); + while (g_menu_link_iter_get_next (link_iter, &name, &a_menu)) + { + b_menu = g_menu_model_get_item_link (b, i, name); + equal &= b_menu && check_menus_equal (a_menu, b_menu); + if (b_menu) + g_object_unref (b_menu); + g_object_unref (a_menu); + } + g_object_unref (link_iter); + + link_iter = g_menu_model_iterate_item_links (b, i); + while (g_menu_link_iter_get_next (link_iter, &name, &b_menu)) + { + a_menu = g_menu_model_get_item_link (a, i, name); + equal &= a_menu && check_menus_equal (a_menu, b_menu); + if (a_menu) + g_object_unref (a_menu); + g_object_unref (b_menu); + } + g_object_unref (link_iter); + } + + return equal; +} + +static void +assert_menus_equal (GMenuModel *a, + GMenuModel *b) +{ + if (!check_menus_equal (a, b)) + { + GString *string; + + string = g_string_new ("\n \n"); + g_menu_markup_print_string (string, G_MENU_MODEL (a), 4, 2); + g_string_append (string, " \n\n-------------\n \n"); + g_menu_markup_print_string (string, G_MENU_MODEL (b), 4, 2); + g_string_append (string, " \n"); + g_error ("%s", string->str); + } +} + +static void +assert_menuitem_equal (GMenuItem *item, + GMenuModel *model, + gint index) +{ + GMenuAttributeIter *attr_iter; + GMenuLinkIter *link_iter; + const gchar *name; + GVariant *value; + GMenuModel *linked_model; + + /* NOTE we can't yet test whether item has attributes or links that + * are not in the model, because there's no iterator API for menu + * items */ + + attr_iter = g_menu_model_iterate_item_attributes (model, index); + while (g_menu_attribute_iter_get_next (attr_iter, &name, &value)) + { + GVariant *item_value; + + item_value = g_menu_item_get_attribute_value (item, name, g_variant_get_type (value)); + g_assert (item_value && g_variant_equal (item_value, value)); + + g_variant_unref (item_value); + g_variant_unref (value); + } + + link_iter = g_menu_model_iterate_item_links (model, index); + while (g_menu_link_iter_get_next (link_iter, &name, &linked_model)) + { + GMenuModel *item_linked_model; + + item_linked_model = g_menu_item_get_link (item, name); + g_assert (linked_model == item_linked_model); + + g_object_unref (item_linked_model); + g_object_unref (linked_model); + } + + g_object_unref (attr_iter); + g_object_unref (link_iter); +} + +/* Test cases {{{1 */ +static void +test_equality (void) +{ + GRand *randa, *randb; + guint32 seed; + gint i; + + seed = g_test_rand_int (); + + randa = g_rand_new_with_seed (seed); + randb = g_rand_new_with_seed (seed); + + for (i = 0; i < 500; i++) + { + RandomMenu *a, *b; + + a = random_menu_new (randa, TOP_ORDER); + b = random_menu_new (randb, TOP_ORDER); + assert_menus_equal (G_MENU_MODEL (a), G_MENU_MODEL (b)); + g_object_unref (b); + g_object_unref (a); + } + + g_rand_int (randa); + + for (i = 0; i < 500;) + { + RandomMenu *a, *b; + + a = random_menu_new (randa, TOP_ORDER); + b = random_menu_new (randb, TOP_ORDER); + if (check_menus_equal (G_MENU_MODEL (a), G_MENU_MODEL (b))) + { + /* by chance, they may really be equal. double check. */ + GString *as, *bs; + + as = g_menu_markup_print_string (NULL, G_MENU_MODEL (a), 4, 2); + bs = g_menu_markup_print_string (NULL, G_MENU_MODEL (b), 4, 2); + g_assert_cmpstr (as->str, ==, bs->str); + g_string_free (bs, TRUE); + g_string_free (as, TRUE); + + /* we're here because randa and randb just generated equal + * menus. they may do it again, so throw away randb and make + * a fresh one. + */ + g_rand_free (randb); + randb = g_rand_new_with_seed (g_rand_int (randa)); + } + else + /* make sure we get enough unequals (ie: no GRand failure) */ + i++; + + g_object_unref (b); + g_object_unref (a); + } + + g_rand_free (randb); + g_rand_free (randa); +} + +static void +test_random (void) +{ + RandomMenu *random; + MirrorMenu *mirror; + GRand *rand; + gint i; + + rand = g_rand_new_with_seed (g_test_rand_int ()); + random = random_menu_new (rand, TOP_ORDER); + mirror = mirror_menu_new (G_MENU_MODEL (random)); + + for (i = 0; i < 500; i++) + { + assert_menus_equal (G_MENU_MODEL (random), G_MENU_MODEL (mirror)); + random_menu_change (random, rand); + } + + g_object_unref (mirror); + g_object_unref (random); + + g_rand_free (rand); +} + +struct roundtrip_state +{ + RandomMenu *random; + MirrorMenu *proxy_mirror; + GDBusMenuModel *proxy; + GMainLoop *loop; + GRand *rand; + gint success; + gint count; +}; + +static gboolean +roundtrip_step (gpointer data) +{ + struct roundtrip_state *state = data; + + if (check_menus_equal (G_MENU_MODEL (state->random), G_MENU_MODEL (state->proxy)) && + check_menus_equal (G_MENU_MODEL (state->random), G_MENU_MODEL (state->proxy_mirror))) + { + state->success++; + state->count = 0; + + if (state->success < 100) + random_menu_change (state->random, state->rand); + else + g_main_loop_quit (state->loop); + } + else if (state->count == 100) + { + assert_menus_equal (G_MENU_MODEL (state->random), G_MENU_MODEL (state->proxy)); + g_assert_not_reached (); + } + else + state->count++; + + return G_SOURCE_CONTINUE; +} + +static void +test_dbus_roundtrip (void) +{ + struct roundtrip_state state; + GDBusConnection *bus; + guint export_id; + guint id; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + state.rand = g_rand_new_with_seed (g_test_rand_int ()); + + state.random = random_menu_new (state.rand, 2); + export_id = g_dbus_connection_export_menu_model (bus, "/", G_MENU_MODEL (state.random), NULL); + state.proxy = g_dbus_menu_model_get (bus, g_dbus_connection_get_unique_name (bus), "/"); + state.proxy_mirror = mirror_menu_new (G_MENU_MODEL (state.proxy)); + state.count = 0; + state.success = 0; + + id = g_timeout_add (10, roundtrip_step, &state); + + state.loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (state.loop); + + g_main_loop_unref (state.loop); + g_source_remove (id); + g_object_unref (state.proxy); + g_dbus_connection_unexport_menu_model (bus, export_id); + g_object_unref (state.random); + g_object_unref (state.proxy_mirror); + g_rand_free (state.rand); + g_object_unref (bus); +} + +static gint items_changed_count; + +static void +items_changed (GMenuModel *model, + gint position, + gint removed, + gint added, + gpointer data) +{ + items_changed_count++; +} + +static gboolean +stop_loop (gpointer data) +{ + GMainLoop *loop = data; + + g_main_loop_quit (loop); + + return G_SOURCE_REMOVE; +} + +static void +test_dbus_subscriptions (void) +{ + GDBusConnection *bus; + GMenu *menu; + GDBusMenuModel *proxy; + GMainLoop *loop; + GError *error = NULL; + guint export_id; + + loop = g_main_loop_new (NULL, FALSE); + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + + menu = g_menu_new (); + + export_id = g_dbus_connection_export_menu_model (bus, "/", G_MENU_MODEL (menu), &error); + g_assert_no_error (error); + + proxy = g_dbus_menu_model_get (bus, g_dbus_connection_get_unique_name (bus), "/"); + items_changed_count = 0; + g_signal_connect (proxy, "items-changed", + G_CALLBACK (items_changed), NULL); + + g_menu_append (menu, "item1", NULL); + g_menu_append (menu, "item2", NULL); + g_menu_append (menu, "item3", NULL); + + g_assert_cmpint (items_changed_count, ==, 0); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_menu_model_get_n_items (G_MENU_MODEL (proxy)); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (items_changed_count, ==, 1); + g_assert_cmpint (g_menu_model_get_n_items (G_MENU_MODEL (proxy)), ==, 3); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_menu_append (menu, "item4", NULL); + g_menu_append (menu, "item5", NULL); + g_menu_append (menu, "item6", NULL); + g_menu_remove (menu, 0); + g_menu_remove (menu, 0); + + g_timeout_add (200, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (items_changed_count, ==, 6); + + g_assert_cmpint (g_menu_model_get_n_items (G_MENU_MODEL (proxy)), ==, 4); + g_object_unref (proxy); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_menu_remove (menu, 0); + g_menu_remove (menu, 0); + + g_timeout_add (100, stop_loop, loop); + g_main_loop_run (loop); + + g_assert_cmpint (items_changed_count, ==, 6); + + g_dbus_connection_unexport_menu_model (bus, export_id); + g_object_unref (menu); + + g_main_loop_unref (loop); + g_object_unref (bus); +} + +static gpointer +do_modify (gpointer data) +{ + RandomMenu *menu = data; + GRand *rand; + gint i; + + rand = g_rand_new_with_seed (g_test_rand_int ()); + + for (i = 0; i < 10000; i++) + { + random_menu_change (menu, rand); + } + + return NULL; +} + +static gpointer +do_export (gpointer data) +{ + GMenuModel *menu = data; + gint i; + GDBusConnection *bus; + gchar *path; + GError *error = NULL; + guint id; + + bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + path = g_strdup_printf ("/%p", data); + + for (i = 0; i < 10000; i++) + { + id = g_dbus_connection_export_menu_model (bus, path, menu, &error); + g_assert_no_error (error); + g_dbus_connection_unexport_menu_model (bus, id); + while (g_main_context_iteration (NULL, FALSE)); + } + + g_free (path); + + g_object_unref (bus); + + return NULL; +} + +static void +test_dbus_threaded (void) +{ + RandomMenu *menu[10]; + GThread *call[10]; + GThread *export[10]; + gint i; + + for (i = 0; i < 10; i++) + { + menu[i] = random_menu_new (g_rand_new_with_seed (g_test_rand_int ()), 2); + call[i] = g_thread_new ("call", do_modify, menu[i]); + export[i] = g_thread_new ("export", do_export, menu[i]); + } + + for (i = 0; i < 10; i++) + { + g_thread_join (call[i]); + g_thread_join (export[i]); + } + + for (i = 0; i < 10; i++) + g_object_unref (menu[i]); +} + +static void +test_attributes (void) +{ + GMenu *menu; + GMenuItem *item; + GVariant *v; + + menu = g_menu_new (); + + item = g_menu_item_new ("test", NULL); + g_menu_item_set_attribute_value (item, "boolean", g_variant_new_boolean (FALSE)); + g_menu_item_set_attribute_value (item, "string", g_variant_new_string ("bla")); + + g_menu_item_set_attribute (item, "double", "d", 1.5); + v = g_variant_new_parsed ("[('one', 1), ('two', %i), (%s, 3)]", 2, "three"); + g_menu_item_set_attribute_value (item, "complex", v); + g_menu_item_set_attribute_value (item, "test-123", g_variant_new_string ("test-123")); + + g_menu_append_item (menu, item); + + g_menu_item_set_attribute (item, "double", "d", G_PI); + + g_assert_cmpint (g_menu_model_get_n_items (G_MENU_MODEL (menu)), ==, 1); + + v = g_menu_model_get_item_attribute_value (G_MENU_MODEL (menu), 0, "boolean", NULL); + g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)); + g_variant_unref (v); + + v = g_menu_model_get_item_attribute_value (G_MENU_MODEL (menu), 0, "string", NULL); + g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE_STRING)); + g_variant_unref (v); + + v = g_menu_model_get_item_attribute_value (G_MENU_MODEL (menu), 0, "double", NULL); + g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE_DOUBLE)); + g_variant_unref (v); + + v = g_menu_model_get_item_attribute_value (G_MENU_MODEL (menu), 0, "complex", NULL); + g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE("a(si)"))); + g_variant_unref (v); + + g_object_unref (menu); + g_object_unref (item); +} + +static void +test_links (void) +{ + GMenu *menu; + GMenuModel *m; + GMenuModel *x; + GMenuItem *item; + + m = G_MENU_MODEL (g_menu_new ()); + g_menu_append (G_MENU (m), "test", NULL); + + menu = g_menu_new (); + + item = g_menu_item_new ("test2", NULL); + g_menu_item_set_link (item, "submenu", m); + g_menu_prepend_item (menu, item); + + item = g_menu_item_new ("test1", NULL); + g_menu_item_set_link (item, "section", m); + g_menu_insert_item (menu, 0, item); + + item = g_menu_item_new ("test3", NULL); + g_menu_item_set_link (item, "wallet", m); + g_menu_insert_item (menu, 1000, item); + + item = g_menu_item_new ("test4", NULL); + g_menu_item_set_link (item, "purse", m); + g_menu_item_set_link (item, "purse", NULL); + g_menu_append_item (menu, item); + + g_assert_cmpint (g_menu_model_get_n_items (G_MENU_MODEL (menu)), ==, 4); + + x = g_menu_model_get_item_link (G_MENU_MODEL (menu), 0, "section"); + g_assert (x == m); + g_object_unref (x); + + x = g_menu_model_get_item_link (G_MENU_MODEL (menu), 1, "submenu"); + g_assert (x == m); + g_object_unref (x); + + x = g_menu_model_get_item_link (G_MENU_MODEL (menu), 2, "wallet"); + g_assert (x == m); + g_object_unref (x); + + x = g_menu_model_get_item_link (G_MENU_MODEL (menu), 3, "purse"); + g_assert (x == NULL); + + g_object_unref (m); + g_object_unref (menu); +} + +static void +test_mutable (void) +{ + GMenu *menu; + + menu = g_menu_new (); + g_menu_append (menu, "test", "test"); + + g_assert (g_menu_model_is_mutable (G_MENU_MODEL (menu))); + g_menu_freeze (menu); + g_assert (!g_menu_model_is_mutable (G_MENU_MODEL (menu))); + + g_object_unref (menu); +} + +static void +test_convenience (void) +{ + GMenu *m1, *m2; + GMenu *sub; + GMenuItem *item; + + m1 = g_menu_new (); + m2 = g_menu_new (); + sub = g_menu_new (); + + g_menu_prepend (m1, "label1", "do::something"); + g_menu_insert (m2, 0, "label1", "do::something"); + + g_menu_append (m1, "label2", "do::somethingelse"); + g_menu_insert (m2, -1, "label2", "do::somethingelse"); + + g_menu_insert_section (m1, 10, "label3", G_MENU_MODEL (sub)); + item = g_menu_item_new_section ("label3", G_MENU_MODEL (sub)); + g_menu_insert_item (m2, 10, item); + g_object_unref (item); + + g_menu_prepend_section (m1, "label4", G_MENU_MODEL (sub)); + g_menu_insert_section (m2, 0, "label4", G_MENU_MODEL (sub)); + + g_menu_append_section (m1, "label5", G_MENU_MODEL (sub)); + g_menu_insert_section (m2, -1, "label5", G_MENU_MODEL (sub)); + + g_menu_insert_submenu (m1, 5, "label6", G_MENU_MODEL (sub)); + item = g_menu_item_new_submenu ("label6", G_MENU_MODEL (sub)); + g_menu_insert_item (m2, 5, item); + g_object_unref (item); + + g_menu_prepend_submenu (m1, "label7", G_MENU_MODEL (sub)); + g_menu_insert_submenu (m2, 0, "label7", G_MENU_MODEL (sub)); + + g_menu_append_submenu (m1, "label8", G_MENU_MODEL (sub)); + g_menu_insert_submenu (m2, -1, "label8", G_MENU_MODEL (sub)); + + assert_menus_equal (G_MENU_MODEL (m1), G_MENU_MODEL (m2)); + + g_object_unref (m1); + g_object_unref (m2); +} + +static void +test_menuitem (void) +{ + GMenu *menu; + GMenu *submenu; + GMenuItem *item; + + menu = g_menu_new (); + submenu = g_menu_new (); + + item = g_menu_item_new ("label", "action"); + g_menu_item_set_attribute (item, "attribute", "b", TRUE); + g_menu_item_set_link (item, G_MENU_LINK_SUBMENU, G_MENU_MODEL (submenu)); + g_menu_append_item (menu, item); + g_object_unref (item); + + item = g_menu_item_new_from_model (G_MENU_MODEL (menu), 0); + assert_menuitem_equal (item, G_MENU_MODEL (menu), 0); + g_object_unref (item); + + g_object_unref (menu); + g_object_unref (submenu); +} + +/* Epilogue {{{1 */ +int +main (int argc, char **argv) +{ + gboolean ret; + + g_test_init (&argc, &argv, NULL); + + session_bus_up (); + + g_test_add_func ("/gmenu/equality", test_equality); + g_test_add_func ("/gmenu/random", test_random); + g_test_add_func ("/gmenu/dbus/roundtrip", test_dbus_roundtrip); + g_test_add_func ("/gmenu/dbus/subscriptions", test_dbus_subscriptions); + g_test_add_func ("/gmenu/dbus/threaded", test_dbus_threaded); + g_test_add_func ("/gmenu/attributes", test_attributes); + g_test_add_func ("/gmenu/links", test_links); + g_test_add_func ("/gmenu/mutable", test_mutable); + g_test_add_func ("/gmenu/convenience", test_convenience); + g_test_add_func ("/gmenu/menuitem", test_menuitem); + + ret = g_test_run (); + + session_bus_down (); + + return ret; +} +/* vim:set foldmethod=marker: */ diff --git a/gio/tests/gschema-compile.c b/gio/tests/gschema-compile.c new file mode 100644 index 0000000..a5ce10a --- /dev/null +++ b/gio/tests/gschema-compile.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include +#include + +typedef struct { + const gchar *name; + const gchar *opt; + const gchar *err; +} SchemaTest; + +static void +test_schema (gpointer data) +{ + SchemaTest *test = (SchemaTest *) data; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + gchar *filename = g_strconcat (test->name, ".gschema.xml", NULL); + gchar *path = g_build_filename (SRCDIR, "schema-tests", filename, NULL); + gchar *argv[] = { + "../glib-compile-schemas", + "--strict", + "--dry-run", + "--schema-file", path, + (gchar *)test->opt, + NULL + }; + gchar *envp[] = { NULL }; + execve (argv[0], argv, envp); + g_free (filename); + g_free (path); + } + if (test->err) + { + g_test_trap_assert_failed (); + g_test_trap_assert_stderr (test->err); + } + else + g_test_trap_assert_passed(); +} + +static const SchemaTest tests[] = { + { "no-default", NULL, "* is required in *" }, + { "missing-quotes", NULL, "*unknown keyword*" }, + { "incomplete-list", NULL, "*to follow array element*" }, + { "wrong-category", NULL, "*unsupported l10n category*" }, + { "bad-type", NULL, "*invalid GVariant type string*" }, + { "overflow", NULL, "*out of range*" }, + { "range-wrong-type", NULL, "* not allowed for keys of type*" }, + { "range-missing-min", NULL, NULL }, + { "range-missing-max", NULL, NULL }, + { "default-out-of-range", NULL, "* is not contained in the specified range*" }, + { "choices-wrong-type", NULL, "* not allowed for keys of type*" }, + { "choice-missing-value", NULL, "*element 'choice' requires attribute 'value'*" }, + { "default-not-in-choices", NULL, "* contains string not in *" }, + { "array-default-not-in-choices", NULL, "* contains string not in *" }, + { "bad-key", NULL, "*invalid name*" }, + { "invalid-path", NULL, "*must begin and end with a slash*" }, + { "bad-key", "--allow-any-name", NULL }, + { "bad-key2", NULL, "*invalid name*" }, + { "bad-key2", "--allow-any-name", NULL }, + { "bad-key3", NULL, "*invalid name*" }, + { "bad-key3", "--allow-any-name", NULL }, + { "bad-key4", NULL, "*invalid name*" }, + { "bad-key4", "--allow-any-name", NULL }, + { "empty-key", NULL, "*empty names*" }, + { "empty-key", "--allow-any-name", "*empty names*" }, + { "enum", NULL, NULL }, + { "enum-with-aliases", NULL, NULL }, + { "enum-with-invalid-alias", NULL, "*'banger' is not in enumerated type*" }, + { "enum-with-repeated-alias", NULL, "* already specified*" }, + { "enum-with-repeated-nick", NULL, "* already specified*" }, + { "enum-with-repeated-value", NULL, "*value='1' already specified*" }, + { "enum-with-chained-alias", NULL, "*'sausages' is not in enumerated type*" }, + { "enum-with-shadow-alias", NULL, "*'mash' is already a member of the enum*" }, + { "enum-with-choice", NULL, "* cannot be specified*" }, + { "enum-with-bad-default", NULL, "* is not a valid member*" }, + { "choice", NULL, NULL }, + { "choice-upside-down", NULL, NULL }, + { "bad-choice", NULL, "* contains string not in *" }, + { "choice-bad", NULL, "* contains string not in *" }, + { "choice-badtype", NULL, "* not allowed for keys of type 'i'*" }, + { "bare-alias", NULL, "*enumerated or flags types or after *" }, + { "choice-alias", NULL, NULL }, + { "default-in-aliases", NULL, "* contains string not in *" }, + { "choice-invalid-alias", NULL, "*'befor' is not in *" }, + { "choice-shadowed-alias", NULL, "*given when was already*" }, + { "range", NULL, NULL }, + { "range-badtype", NULL, "* not allowed for keys of type 's'*" }, + { "range-low-default", NULL, "* is not contained in the specified range*" }, + { "range-high-default", NULL, "* is not contained in the specified range*" }, + { "range-default-low", NULL, "* is not contained in the specified range*" }, + { "range-default-high", NULL, "* is not contained in the specified range*" }, + { "range-parse-error", NULL, "*invalid character in number*" }, + { "from-docs", NULL, NULL }, + { "extending", NULL, NULL }, + { "extend-missing", NULL, "*extends not-yet-existing schema*" }, + { "extend-nonlist", NULL, "*which is not a list*" }, + { "extend-self", NULL, "*not-yet-existing*" }, + { "extend-wrong-list-indirect", NULL, "*'y' does not extend 'x'*" }, + { "extend-wrong-list", NULL, "*'y' does not extend 'x'*" }, + { "key-in-list-indirect", NULL, "*cannot add keys to a 'list*" }, + { "key-in-list", NULL, "*cannot add keys to a 'list*" }, + { "list-of-missing", NULL, "*is list of not-yet-existing schema*" }, + { "extend-and-shadow", NULL, "*shadows*use *" }, + { "extend-and-shadow-indirect", NULL, "*shadows*use *" }, + { "override", NULL, NULL }, + { "override-missing", NULL, "*no to override*" }, + { "override-range-error", NULL, "* is not contained in the specified range*"}, + { "override-then-key", NULL, "*shadows in *" }, + { "override-twice", NULL, "* already specified*" }, + { "override-type-error", NULL, "*invalid character in number*" }, + { "flags-aliased-default", NULL, "* * not in the specified flags type*" }, + { "flags-bad-default", NULL, "* * not in the specified flags type*" }, + { "flags-more-than-one-bit", NULL, "*flags values must have at most 1 bit set*" }, + { "flags-with-enum-attr", NULL, "* not (yet) defined*" }, + { "flags-with-enum-tag", NULL, "* not (yet) defined*" }, + { "inherit-gettext-domain", NULL, NULL }, + { "range-type-test", NULL, NULL }, + { "cdata", NULL, NULL } +}; + + +int +main (int argc, char *argv[]) +{ + guint i; + + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (tests); ++i) + { + gchar *name = g_strdup_printf ("/gschema/%s%s", tests[i].name, tests[i].opt ? "/opt" : ""); + g_test_add_data_func (name, &tests[i], (gpointer) test_schema); + g_free (name); + } + + return g_test_run (); +} diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c new file mode 100644 index 0000000..515fad2 --- /dev/null +++ b/gio/tests/gsettings.c @@ -0,0 +1,2226 @@ +#include +#include +#include +#include +#include +#define G_SETTINGS_ENABLE_BACKEND +#include + +#include "testenum.h" + +static gboolean backend_set; + +/* These tests rely on the schemas in org.gtk.test.gschema.xml + * to be compiled and installed in the same directory. + */ + +static void +check_and_free (GVariant *value, + const gchar *expected) +{ + gchar *printed; + + printed = g_variant_print (value, TRUE); + g_assert_cmpstr (printed, ==, expected); + g_free (printed); + + g_variant_unref (value); +} + + +/* Just to get warmed up: Read and set a string, and + * verify that can read the changed string back + */ +static void +test_basic (void) +{ + gchar *str = NULL; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test"); + + g_object_get (settings, "schema", &str, NULL); + g_assert_cmpstr (str, ==, "org.gtk.test"); + g_free (str); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "Hello, earthlings"); + g_free (str); + + g_settings_set (settings, "greeting", "s", "goodbye world"); + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "goodbye world"); + g_free (str); + str = NULL; + + if (!backend_set && g_test_undefined ()) + { + GSettings *tmp_settings = g_settings_new ("org.gtk.test"); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*g_settings_set_value*expects type*"); + g_settings_set (tmp_settings, "greeting", "i", 555); + g_test_assert_expected_messages (); + + g_object_unref (tmp_settings); + } + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "goodbye world"); + g_free (str); + str = NULL; + + g_settings_reset (settings, "greeting"); + str = g_settings_get_string (settings, "greeting"); + g_assert_cmpstr (str, ==, "Hello, earthlings"); + g_free (str); + + g_settings_set (settings, "greeting", "s", "this is the end"); + g_object_unref (settings); +} + +/* Check that we get an error when getting a key + * that is not in the schema + */ +static void +test_unknown_key (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GSettings *settings; + GVariant *value; + + settings = g_settings_new ("org.gtk.test"); + value = g_settings_get_value (settings, "no_such_key"); + + g_assert (value == NULL); + + g_object_unref (settings); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*does not contain*"); +} + +/* Check that we get an error when the schema + * has not been installed + */ +static void +test_no_schema (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GSettings *settings; + + settings = g_settings_new ("no.such.schema"); + + g_assert (settings == NULL); + } + + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*Settings schema 'no.such.schema' is not installed*"); +} + +/* Check that we get an error when passing a type string + * that does not match the schema + */ +static void +test_wrong_type (void) +{ + GSettings *settings; + gchar *str = NULL; + + if (!g_test_undefined ()) + return; + + settings = g_settings_new ("org.gtk.test"); + + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, + "*given value has a type of*"); + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, + "*valid_format_string*"); + g_settings_get (settings, "greeting", "o", &str); + g_test_assert_expected_messages (); + + g_assert (str == NULL); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*expects type 's'*"); + g_settings_set (settings, "greeting", "o", "/a/path"); + g_test_assert_expected_messages (); + + g_object_unref (settings); +} + +/* Check errors with explicit paths */ +static void +test_wrong_path (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GSettings *settings G_GNUC_UNUSED; + + settings = g_settings_new_with_path ("org.gtk.test", "/wrong-path/"); + } + + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*but path * specified by schema*"); +} + +static void +test_no_path (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GSettings *settings G_GNUC_UNUSED; + + settings = g_settings_new ("org.gtk.test.no-path"); + } + + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*attempting to create schema * without a path**"); +} + + +/* Check that we can successfully read and set the full + * range of all basic types + */ +static void +test_basic_types (void) +{ + GSettings *settings; + gboolean b; + guint8 byte; + gint16 i16; + guint16 u16; + gint32 i32; + guint32 u32; + gint64 i64; + guint64 u64; + gdouble d; + gchar *str; + + settings = g_settings_new ("org.gtk.test.basic-types"); + + g_settings_get (settings, "test-boolean", "b", &b); + g_assert_cmpint (b, ==, 1); + + g_settings_set (settings, "test-boolean", "b", 0); + g_settings_get (settings, "test-boolean", "b", &b); + g_assert_cmpint (b, ==, 0); + + g_settings_get (settings, "test-byte", "y", &byte); + g_assert_cmpint (byte, ==, 25); + + g_settings_set (settings, "test-byte", "y", G_MAXUINT8); + g_settings_get (settings, "test-byte", "y", &byte); + g_assert_cmpint (byte, ==, G_MAXUINT8); + + g_settings_get (settings, "test-int16", "n", &i16); + g_assert_cmpint (i16, ==, -1234); + + g_settings_set (settings, "test-int16", "n", G_MININT16); + g_settings_get (settings, "test-int16", "n", &i16); + g_assert_cmpint (i16, ==, G_MININT16); + + g_settings_set (settings, "test-int16", "n", G_MAXINT16); + g_settings_get (settings, "test-int16", "n", &i16); + g_assert_cmpint (i16, ==, G_MAXINT16); + + g_settings_get (settings, "test-uint16", "q", &u16); + g_assert_cmpuint (u16, ==, 1234); + + g_settings_set (settings, "test-uint16", "q", G_MAXUINT16); + g_settings_get (settings, "test-uint16", "q", &u16); + g_assert_cmpuint (u16, ==, G_MAXUINT16); + + g_settings_get (settings, "test-int32", "i", &i32); + g_assert_cmpint (i32, ==, -123456); + + g_settings_set (settings, "test-int32", "i", G_MININT32); + g_settings_get (settings, "test-int32", "i", &i32); + g_assert_cmpint (i32, ==, G_MININT32); + + g_settings_set (settings, "test-int32", "i", G_MAXINT32); + g_settings_get (settings, "test-int32", "i", &i32); + g_assert_cmpint (i32, ==, G_MAXINT32); + + g_settings_get (settings, "test-uint32", "u", &u32); + g_assert_cmpuint (u32, ==, 123456); + + g_settings_set (settings, "test-uint32", "u", G_MAXUINT32); + g_settings_get (settings, "test-uint32", "u", &u32); + g_assert_cmpuint (u32, ==, G_MAXUINT32); + + g_settings_get (settings, "test-int64", "x", &i64); + g_assert_cmpuint (i64, ==, -123456789); + + g_settings_set (settings, "test-int64", "x", G_MININT64); + g_settings_get (settings, "test-int64", "x", &i64); + g_assert_cmpuint (i64, ==, G_MININT64); + + g_settings_set (settings, "test-int64", "x", G_MAXINT64); + g_settings_get (settings, "test-int64", "x", &i64); + g_assert_cmpuint (i64, ==, G_MAXINT64); + + g_settings_get (settings, "test-uint64", "t", &u64); + g_assert_cmpuint (u64, ==, 123456789); + + g_settings_set (settings, "test-uint64", "t", G_MAXUINT64); + g_settings_get (settings, "test-uint64", "t", &u64); + g_assert_cmpuint (u64, ==, G_MAXUINT64); + + g_settings_get (settings, "test-double", "d", &d); + g_assert_cmpfloat (d, ==, 123.456); + + g_settings_set (settings, "test-double", "d", G_MINDOUBLE); + g_settings_get (settings, "test-double", "d", &d); + g_assert_cmpfloat (d, ==, G_MINDOUBLE); + + g_settings_set (settings, "test-double", "d", G_MAXDOUBLE); + g_settings_get (settings, "test-double", "d", &d); + g_assert_cmpfloat (d, ==, G_MAXDOUBLE); + + g_settings_get (settings, "test-string", "s", &str); + g_assert_cmpstr (str, ==, "a string, it seems"); + g_free (str); + str = NULL; + + g_settings_get (settings, "test-objectpath", "o", &str); + g_assert_cmpstr (str, ==, "/a/object/path"); + g_object_unref (settings); + g_free (str); + str = NULL; +} + +/* Check that we can read an set complex types like + * tuples, arrays and dictionaries + */ +static void +test_complex_types (void) +{ + GSettings *settings; + gchar *s; + gint i1, i2; + GVariantIter *iter = NULL; + + settings = g_settings_new ("org.gtk.test.complex-types"); + + g_settings_get (settings, "test-tuple", "(s(ii))", &s, &i1, &i2); + g_assert_cmpstr (s, ==, "one"); + g_assert_cmpint (i1,==, 2); + g_assert_cmpint (i2,==, 3); + g_free (s) ; + s = NULL; + + g_settings_set (settings, "test-tuple", "(s(ii))", "none", 0, 0); + g_settings_get (settings, "test-tuple", "(s(ii))", &s, &i1, &i2); + g_assert_cmpstr (s, ==, "none"); + g_assert_cmpint (i1,==, 0); + g_assert_cmpint (i2,==, 0); + g_free (s); + s = NULL; + + g_settings_get (settings, "test-array", "ai", &iter); + g_assert_cmpint (g_variant_iter_n_children (iter), ==, 6); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 0); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 1); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 2); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 3); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 4); + g_assert (g_variant_iter_next (iter, "i", &i1)); + g_assert_cmpint (i1, ==, 5); + g_assert (!g_variant_iter_next (iter, "i", &i1)); + g_variant_iter_free (iter); + + g_object_unref (settings); +} + +static gboolean changed_cb_called; + +static void +changed_cb (GSettings *settings, + const gchar *key, + gpointer data) +{ + changed_cb_called = TRUE; + + g_assert_cmpstr (key, ==, data); +} + +/* Test that basic change notification with the changed signal works. + */ +static void +test_changes (void) +{ + GSettings *settings; + GSettings *settings2; + + settings = g_settings_new ("org.gtk.test"); + + g_signal_connect (settings, "changed", + G_CALLBACK (changed_cb), "greeting"); + + changed_cb_called = FALSE; + + g_settings_set (settings, "greeting", "s", "new greeting"); + g_assert (changed_cb_called); + + settings2 = g_settings_new ("org.gtk.test"); + + changed_cb_called = FALSE; + + g_settings_set (settings2, "greeting", "s", "hi"); + g_assert (changed_cb_called); + + g_object_unref (settings2); + g_object_unref (settings); +} + +static gboolean changed_cb_called2; + +static void +changed_cb2 (GSettings *settings, + const gchar *key, + gpointer data) +{ + gboolean *p = data; + + *p = TRUE; +} + +/* Test that changes done to a delay-mode instance + * don't appear to the outside world until apply. Also + * check that we get change notification when they are + * applied. + * Also test that the has-unapplied property is properly + * maintained. + */ +static void +test_delay_apply (void) +{ + GSettings *settings; + GSettings *settings2; + gchar *str; + + settings = g_settings_new ("org.gtk.test"); + settings2 = g_settings_new ("org.gtk.test"); + + g_settings_set (settings2, "greeting", "s", "top o' the morning"); + + changed_cb_called = FALSE; + changed_cb_called2 = FALSE; + + g_signal_connect (settings, "changed", + G_CALLBACK (changed_cb2), &changed_cb_called); + g_signal_connect (settings2, "changed", + G_CALLBACK (changed_cb2), &changed_cb_called2); + + g_settings_delay (settings); + + g_settings_set (settings, "greeting", "s", "greetings from test_delay_apply"); + + g_assert (changed_cb_called); + g_assert (!changed_cb_called2); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_delay_apply"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "top o' the morning"); + g_free (str); + str = NULL; + + g_assert (g_settings_get_has_unapplied (settings)); + g_assert (!g_settings_get_has_unapplied (settings2)); + + changed_cb_called = FALSE; + changed_cb_called2 = FALSE; + + g_settings_apply (settings); + + g_assert (!changed_cb_called); + g_assert (changed_cb_called2); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_delay_apply"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_delay_apply"); + g_free (str); + str = NULL; + + g_assert (!g_settings_get_has_unapplied (settings)); + g_assert (!g_settings_get_has_unapplied (settings2)); + + g_object_unref (settings2); + g_object_unref (settings); +} + +/* Test that reverting unapplied changes in a delay-apply + * settings instance works. + */ +static void +test_delay_revert (void) +{ + GSettings *settings; + GSettings *settings2; + gchar *str; + + settings = g_settings_new ("org.gtk.test"); + settings2 = g_settings_new ("org.gtk.test"); + + g_settings_set (settings2, "greeting", "s", "top o' the morning"); + + g_settings_delay (settings); + + g_settings_set (settings, "greeting", "s", "greetings from test_delay_revert"); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_delay_revert"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "top o' the morning"); + g_free (str); + str = NULL; + + g_assert (g_settings_get_has_unapplied (settings)); + + g_settings_revert (settings); + + g_assert (!g_settings_get_has_unapplied (settings)); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "top o' the morning"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "top o' the morning"); + g_free (str); + str = NULL; + + g_object_unref (settings2); + g_object_unref (settings); +} + +static void +keys_changed_cb (GSettings *settings, + const GQuark *keys, + gint n_keys) +{ + gchar *str; + + g_assert_cmpint (n_keys, ==, 2); + + g_assert ((keys[0] == g_quark_from_static_string ("greeting") && + keys[1] == g_quark_from_static_string ("farewell")) || + (keys[1] == g_quark_from_static_string ("greeting") && + keys[0] == g_quark_from_static_string ("farewell"))); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_atomic"); + g_free (str); + str = NULL; + + g_settings_get (settings, "farewell", "s", &str); + g_assert_cmpstr (str, ==, "atomic bye-bye"); + g_free (str); + str = NULL; +} + +/* Check that delay-applied changes appear atomically. + * More specifically, verify that all changed keys appear + * with their new value while handling the change-event signal. + */ +static void +test_atomic (void) +{ + GSettings *settings; + GSettings *settings2; + gchar *str; + + settings = g_settings_new ("org.gtk.test"); + settings2 = g_settings_new ("org.gtk.test"); + + g_settings_set (settings2, "greeting", "s", "top o' the morning"); + + changed_cb_called = FALSE; + changed_cb_called2 = FALSE; + + g_signal_connect (settings2, "change-event", + G_CALLBACK (keys_changed_cb), NULL); + + g_settings_delay (settings); + + g_settings_set (settings, "greeting", "s", "greetings from test_atomic"); + g_settings_set (settings, "farewell", "s", "atomic bye-bye"); + + g_settings_apply (settings); + + g_settings_get (settings, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_atomic"); + g_free (str); + str = NULL; + + g_settings_get (settings, "farewell", "s", &str); + g_assert_cmpstr (str, ==, "atomic bye-bye"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "greeting", "s", &str); + g_assert_cmpstr (str, ==, "greetings from test_atomic"); + g_free (str); + str = NULL; + + g_settings_get (settings2, "farewell", "s", &str); + g_assert_cmpstr (str, ==, "atomic bye-bye"); + g_free (str); + str = NULL; + + g_object_unref (settings2); + g_object_unref (settings); +} + +/* On Windows the interaction between the C library locale and libintl + * (from GNU gettext) is not like on POSIX, so just skip these tests + * for now. + * + * There are several issues: + * + * 1) The C library doesn't use LC_MESSAGES, that is implemented only + * in libintl (defined in its ). + * + * 2) The locale names that setlocale() accepts and returns aren't in + * the "de_DE" style, but like "German_Germany". + * + * 3) libintl looks at the Win32 thread locale and not the C library + * locale. (And even if libintl would use the C library's locale, as + * there are several alternative C library DLLs, libintl might be + * linked to a different one than the application code, so they + * wouldn't have the same C library locale anyway.) + */ + +/* Test that translations work for schema defaults. + * + * This test relies on the de.po file in the same directory + * to be compiled into ./de/LC_MESSAGES/test.mo + */ +static void +test_l10n (void) +{ + GSettings *settings; + gchar *str; + gchar *locale; + + bindtextdomain ("test", "."); + bind_textdomain_codeset ("test", "UTF-8"); + + locale = g_strdup (setlocale (LC_MESSAGES, NULL)); + + settings = g_settings_new ("org.gtk.test.localized"); + + setlocale (LC_MESSAGES, "C"); + str = g_settings_get_string (settings, "error-message"); + setlocale (LC_MESSAGES, locale); + + g_assert_cmpstr (str, ==, "Unnamed"); + g_free (str); + str = NULL; + + setlocale (LC_MESSAGES, "de_DE"); + str = g_settings_get_string (settings, "error-message"); + setlocale (LC_MESSAGES, locale); + + g_assert_cmpstr (str, ==, "Unbenannt"); + g_object_unref (settings); + g_free (str); + str = NULL; + + g_free (locale); +} + +/* Test that message context works as expected with translated + * schema defaults. Also, verify that non-ASCII UTF-8 content + * works. + * + * This test relies on the de.po file in the same directory + * to be compiled into ./de/LC_MESSAGES/test.mo + */ +static void +test_l10n_context (void) +{ + GSettings *settings; + gchar *str; + gchar *locale; + + bindtextdomain ("test", "."); + bind_textdomain_codeset ("test", "UTF-8"); + + locale = g_strdup (setlocale (LC_MESSAGES, NULL)); + + settings = g_settings_new ("org.gtk.test.localized"); + + setlocale (LC_MESSAGES, "C"); + g_settings_get (settings, "backspace", "s", &str); + setlocale (LC_MESSAGES, locale); + + g_assert_cmpstr (str, ==, "BackSpace"); + g_free (str); + str = NULL; + + setlocale (LC_MESSAGES, "de_DE"); + g_settings_get (settings, "backspace", "s", &str); + setlocale (LC_MESSAGES, locale); + + g_assert_cmpstr (str, ==, "Löschen"); + g_object_unref (settings); + g_free (str); + str = NULL; + + g_free (locale); +} + +enum +{ + PROP_0, + PROP_BOOL, + PROP_ANTI_BOOL, + PROP_BYTE, + PROP_INT16, + PROP_UINT16, + PROP_INT, + PROP_UINT, + PROP_INT64, + PROP_UINT64, + PROP_DOUBLE, + PROP_STRING, + PROP_NO_READ, + PROP_NO_WRITE, + PROP_STRV, + PROP_ENUM, + PROP_FLAGS +}; + +typedef struct +{ + GObject parent_instance; + + gboolean bool_prop; + gboolean anti_bool_prop; + gint8 byte_prop; + gint int16_prop; + guint16 uint16_prop; + gint int_prop; + guint uint_prop; + gint64 int64_prop; + guint64 uint64_prop; + gdouble double_prop; + gchar *string_prop; + gchar *no_read_prop; + gchar *no_write_prop; + gchar **strv_prop; + guint enum_prop; + guint flags_prop; +} TestObject; + +typedef struct +{ + GObjectClass parent_class; +} TestObjectClass; + +static GType test_object_get_type (void); +G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT) + +static void +test_object_init (TestObject *object) +{ +} + +static void +test_object_finalize (GObject *object) +{ + TestObject *testo = (TestObject*)object; + g_strfreev (testo->strv_prop); + g_free (testo->string_prop); + G_OBJECT_CLASS (test_object_parent_class)->finalize (object); +} + +static void +test_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + TestObject *test_object = (TestObject *)object; + + switch (prop_id) + { + case PROP_BOOL: + g_value_set_boolean (value, test_object->bool_prop); + break; + case PROP_ANTI_BOOL: + g_value_set_boolean (value, test_object->anti_bool_prop); + break; + case PROP_BYTE: + g_value_set_schar (value, test_object->byte_prop); + break; + case PROP_UINT16: + g_value_set_uint (value, test_object->uint16_prop); + break; + case PROP_INT16: + g_value_set_int (value, test_object->int16_prop); + break; + case PROP_INT: + g_value_set_int (value, test_object->int_prop); + break; + case PROP_UINT: + g_value_set_uint (value, test_object->uint_prop); + break; + case PROP_INT64: + g_value_set_int64 (value, test_object->int64_prop); + break; + case PROP_UINT64: + g_value_set_uint64 (value, test_object->uint64_prop); + break; + case PROP_DOUBLE: + g_value_set_double (value, test_object->double_prop); + break; + case PROP_STRING: + g_value_set_string (value, test_object->string_prop); + break; + case PROP_NO_WRITE: + g_value_set_string (value, test_object->no_write_prop); + break; + case PROP_STRV: + g_value_set_boxed (value, test_object->strv_prop); + break; + case PROP_ENUM: + g_value_set_enum (value, test_object->enum_prop); + break; + case PROP_FLAGS: + g_value_set_flags (value, test_object->flags_prop); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +test_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + TestObject *test_object = (TestObject *)object; + + switch (prop_id) + { + case PROP_BOOL: + test_object->bool_prop = g_value_get_boolean (value); + break; + case PROP_ANTI_BOOL: + test_object->anti_bool_prop = g_value_get_boolean (value); + break; + case PROP_BYTE: + test_object->byte_prop = g_value_get_schar (value); + break; + case PROP_INT16: + test_object->int16_prop = g_value_get_int (value); + break; + case PROP_UINT16: + test_object->uint16_prop = g_value_get_uint (value); + break; + case PROP_INT: + test_object->int_prop = g_value_get_int (value); + break; + case PROP_UINT: + test_object->uint_prop = g_value_get_uint (value); + break; + case PROP_INT64: + test_object->int64_prop = g_value_get_int64 (value); + break; + case PROP_UINT64: + test_object->uint64_prop = g_value_get_uint64 (value); + break; + case PROP_DOUBLE: + test_object->double_prop = g_value_get_double (value); + break; + case PROP_STRING: + g_free (test_object->string_prop); + test_object->string_prop = g_value_dup_string (value); + break; + case PROP_NO_READ: + g_free (test_object->no_read_prop); + test_object->no_read_prop = g_value_dup_string (value); + break; + case PROP_STRV: + g_strfreev (test_object->strv_prop); + test_object->strv_prop = g_value_dup_boxed (value); + break; + case PROP_ENUM: + test_object->enum_prop = g_value_get_enum (value); + break; + case PROP_FLAGS: + test_object->flags_prop = g_value_get_flags (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GType +test_enum_get_type (void) +{ + static volatile gsize define_type_id = 0; + + if (g_once_init_enter (&define_type_id)) + { + static const GEnumValue values[] = { + { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" }, + { TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" }, + { TEST_ENUM_BAZ, "TEST_ENUM_BAZ", "baz" }, + { TEST_ENUM_QUUX, "TEST_ENUM_QUUX", "quux" }, + { 0, NULL, NULL } + }; + + GType type_id = g_enum_register_static ("TestEnum", values); + g_once_init_leave (&define_type_id, type_id); + } + + return define_type_id; +} + +static GType +test_flags_get_type (void) +{ + static volatile gsize define_type_id = 0; + + if (g_once_init_enter (&define_type_id)) + { + static const GFlagsValue values[] = { + { TEST_FLAGS_NONE, "TEST_FLAGS_NONE", "none" }, + { TEST_FLAGS_MOURNING, "TEST_FLAGS_MOURNING", "mourning" }, + { TEST_FLAGS_LAUGHING, "TEST_FLAGS_LAUGHING", "laughing" }, + { TEST_FLAGS_WALKING, "TEST_FLAGS_WALKING", "walking" }, + { 0, NULL, NULL } + }; + + GType type_id = g_flags_register_static ("TestFlags", values); + g_once_init_leave (&define_type_id, type_id); + } + + return define_type_id; +} + +static void +test_object_class_init (TestObjectClass *class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + + gobject_class->get_property = test_object_get_property; + gobject_class->set_property = test_object_set_property; + gobject_class->finalize = test_object_finalize; + + g_object_class_install_property (gobject_class, PROP_BOOL, + g_param_spec_boolean ("bool", "", "", FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_ANTI_BOOL, + g_param_spec_boolean ("anti-bool", "", "", FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_BYTE, + g_param_spec_char ("byte", "", "", G_MININT8, G_MAXINT8, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_INT16, + g_param_spec_int ("int16", "", "", -G_MAXINT16, G_MAXINT16, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_UINT16, + g_param_spec_uint ("uint16", "", "", 0, G_MAXUINT16, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_INT, + g_param_spec_int ("int", "", "", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_UINT, + g_param_spec_uint ("uint", "", "", 0, G_MAXUINT, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_INT64, + g_param_spec_int64 ("int64", "", "", G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_UINT64, + g_param_spec_uint64 ("uint64", "", "", 0, G_MAXUINT64, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_DOUBLE, + g_param_spec_double ("double", "", "", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_STRING, + g_param_spec_string ("string", "", "", NULL, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_NO_WRITE, + g_param_spec_string ("no-write", "", "", NULL, G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, PROP_NO_READ, + g_param_spec_string ("no-read", "", "", NULL, G_PARAM_WRITABLE)); + g_object_class_install_property (gobject_class, PROP_STRV, + g_param_spec_boxed ("strv", "", "", G_TYPE_STRV, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_ENUM, + g_param_spec_enum ("enum", "", "", test_enum_get_type (), TEST_ENUM_FOO, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_FLAGS, + g_param_spec_flags ("flags", "", "", test_flags_get_type (), TEST_FLAGS_NONE, G_PARAM_READWRITE)); +} + +static TestObject * +test_object_new (void) +{ + return (TestObject*)g_object_new (test_object_get_type (), NULL); +} + +/* Test basic binding functionality for simple types. + * Verify that with bidirectional bindings, changes on either side + * are notified on the other end. + */ +static void +test_simple_binding (void) +{ + TestObject *obj; + GSettings *settings; + gboolean b; + gchar y; + gint i; + guint u; + gint16 n; + guint16 q; + gint n2; + guint q2; + gint64 i64; + guint64 u64; + gdouble d; + gchar *s; + GVariant *value; + gchar **strv; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "bool", obj, "bool", G_SETTINGS_BIND_DEFAULT); + g_object_set (obj, "bool", TRUE, NULL); + g_assert_cmpint (g_settings_get_boolean (settings, "bool"), ==, TRUE); + + g_settings_set_boolean (settings, "bool", FALSE); + b = TRUE; + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, FALSE); + + g_settings_bind (settings, "anti-bool", obj, "anti-bool", + G_SETTINGS_BIND_INVERT_BOOLEAN); + g_object_set (obj, "anti-bool", FALSE, NULL); + g_assert_cmpint (g_settings_get_boolean (settings, "anti-bool"), ==, TRUE); + + g_settings_set_boolean (settings, "anti-bool", FALSE); + b = FALSE; + g_object_get (obj, "anti-bool", &b, NULL); + g_assert_cmpint (b, ==, TRUE); + + g_settings_bind (settings, "byte", obj, "byte", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "byte", 123, NULL); + y = 'c'; + g_settings_get (settings, "byte", "y", &y); + g_assert_cmpint (y, ==, 123); + + g_settings_set (settings, "byte", "y", 54); + y = 'c'; + g_object_get (obj, "byte", &y, NULL); + g_assert_cmpint (y, ==, 54); + + g_settings_bind (settings, "int16", obj, "int16", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "int16", 1234, NULL); + n = 4321; + g_settings_get (settings, "int16", "n", &n); + g_assert_cmpint (n, ==, 1234); + + g_settings_set (settings, "int16", "n", 4321); + n2 = 1111; + g_object_get (obj, "int16", &n2, NULL); + g_assert_cmpint (n2, ==, 4321); + + g_settings_bind (settings, "uint16", obj, "uint16", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "uint16", (guint16) G_MAXUINT16, NULL); + q = 1111; + g_settings_get (settings, "uint16", "q", &q); + g_assert_cmpuint (q, ==, G_MAXUINT16); + + g_settings_set (settings, "uint16", "q", (guint16) G_MAXINT16); + q2 = 1111; + g_object_get (obj, "uint16", &q2, NULL); + g_assert_cmpuint (q2, ==, (guint16) G_MAXINT16); + + g_settings_bind (settings, "int", obj, "int", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "int", 12345, NULL); + g_assert_cmpint (g_settings_get_int (settings, "int"), ==, 12345); + + g_settings_set_int (settings, "int", 54321); + i = 1111; + g_object_get (obj, "int", &i, NULL); + g_assert_cmpint (i, ==, 54321); + + g_settings_bind (settings, "uint", obj, "uint", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "uint", 12345, NULL); + g_assert_cmpuint (g_settings_get_uint (settings, "uint"), ==, 12345); + + g_settings_set_uint (settings, "uint", 54321); + u = 1111; + g_object_get (obj, "uint", &u, NULL); + g_assert_cmpuint (u, ==, 54321); + + g_settings_bind (settings, "int64", obj, "int64", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "int64", (gint64) G_MAXINT64, NULL); + i64 = 1111; + g_settings_get (settings, "int64", "x", &i64); + g_assert_cmpint (i64, ==, G_MAXINT64); + + g_settings_set (settings, "int64", "x", (gint64) G_MININT64); + i64 = 1111; + g_object_get (obj, "int64", &i64, NULL); + g_assert_cmpint (i64, ==, G_MININT64); + + g_settings_bind (settings, "uint64", obj, "uint64", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "uint64", (guint64) G_MAXUINT64, NULL); + u64 = 1111; + g_settings_get (settings, "uint64", "t", &u64); + g_assert_cmpuint (u64, ==, G_MAXUINT64); + + g_settings_set (settings, "uint64", "t", (guint64) G_MAXINT64); + u64 = 1111; + g_object_get (obj, "uint64", &u64, NULL); + g_assert_cmpuint (u64, ==, (guint64) G_MAXINT64); + + g_settings_bind (settings, "string", obj, "string", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "string", "bu ba", NULL); + s = g_settings_get_string (settings, "string"); + g_assert_cmpstr (s, ==, "bu ba"); + g_free (s); + + g_settings_set_string (settings, "string", "bla bla"); + g_object_get (obj, "string", &s, NULL); + g_assert_cmpstr (s, ==, "bla bla"); + g_free (s); + + g_settings_bind (settings, "chararray", obj, "string", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "string", "non-unicode:\315", NULL); + value = g_settings_get_value (settings, "chararray"); + g_assert_cmpstr (g_variant_get_bytestring (value), ==, "non-unicode:\315"); + g_variant_unref (value); + + g_settings_bind (settings, "double", obj, "double", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "double", G_MAXFLOAT, NULL); + g_assert_cmpfloat (g_settings_get_double (settings, "double"), ==, G_MAXFLOAT); + + g_settings_set_double (settings, "double", G_MINFLOAT); + d = 1.0; + g_object_get (obj, "double", &d, NULL); + g_assert_cmpfloat (d, ==, G_MINFLOAT); + + g_object_set (obj, "double", G_MAXDOUBLE, NULL); + g_assert_cmpfloat (g_settings_get_double (settings, "double"), ==, G_MAXDOUBLE); + + g_settings_set_double (settings, "double", -G_MINDOUBLE); + d = 1.0; + g_object_get (obj, "double", &d, NULL); + g_assert_cmpfloat (d, ==, -G_MINDOUBLE); + + strv = g_strsplit ("plastic bag,middle class,polyethylene", ",", 0); + g_settings_bind (settings, "strv", obj, "strv", G_SETTINGS_BIND_DEFAULT); + g_object_set (obj, "strv", strv, NULL); + g_strfreev (strv); + strv = g_settings_get_strv (settings, "strv"); + s = g_strjoinv (",", strv); + g_assert_cmpstr (s, ==, "plastic bag,middle class,polyethylene"); + g_strfreev (strv); + g_free (s); + strv = g_strsplit ("decaffeinate,unleaded,keep all surfaces clean", ",", 0); + g_settings_set_strv (settings, "strv", (const gchar **) strv); + g_strfreev (strv); + g_object_get (obj, "strv", &strv, NULL); + s = g_strjoinv (",", strv); + g_assert_cmpstr (s, ==, "decaffeinate,unleaded,keep all surfaces clean"); + g_strfreev (strv); + g_free (s); + + g_settings_bind (settings, "enum", obj, "enum", G_SETTINGS_BIND_DEFAULT); + g_object_set (obj, "enum", TEST_ENUM_BAZ, NULL); + s = g_settings_get_string (settings, "enum"); + g_assert_cmpstr (s, ==, "baz"); + g_free (s); + g_assert_cmpint (g_settings_get_enum (settings, "enum"), ==, TEST_ENUM_BAZ); + + g_settings_set_enum (settings, "enum", TEST_ENUM_QUUX); + i = 230; + g_object_get (obj, "enum", &i, NULL); + g_assert_cmpint (i, ==, TEST_ENUM_QUUX); + + g_settings_set_string (settings, "enum", "baz"); + i = 230; + g_object_get (obj, "enum", &i, NULL); + g_assert_cmpint (i, ==, TEST_ENUM_BAZ); + + g_settings_bind (settings, "flags", obj, "flags", G_SETTINGS_BIND_DEFAULT); + g_object_set (obj, "flags", TEST_FLAGS_MOURNING, NULL); + strv = g_settings_get_strv (settings, "flags"); + g_assert_cmpint (g_strv_length (strv), ==, 1); + g_assert_cmpstr (strv[0], ==, "mourning"); + g_strfreev (strv); + + g_assert_cmpint (g_settings_get_flags (settings, "flags"), ==, TEST_FLAGS_MOURNING); + + g_settings_set_flags (settings, "flags", TEST_FLAGS_MOURNING | TEST_FLAGS_WALKING); + i = 230; + g_object_get (obj, "flags", &i, NULL); + g_assert_cmpint (i, ==, TEST_FLAGS_MOURNING | TEST_FLAGS_WALKING); + + g_object_unref (obj); + g_object_unref (settings); +} + +static void +test_unbind (void) +{ + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "int", obj, "int", G_SETTINGS_BIND_DEFAULT); + + g_object_set (obj, "int", 12345, NULL); + g_assert_cmpint (g_settings_get_int (settings, "int"), ==, 12345); + + g_settings_unbind (obj, "int"); + + g_object_set (obj, "int", 54321, NULL); + g_assert_cmpint (g_settings_get_int (settings, "int"), ==, 12345); + + g_object_unref (obj); + g_object_unref (settings); +} + +static void +test_bind_writable (void) +{ + TestObject *obj; + GSettings *settings; + gboolean b; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_object_set (obj, "bool", FALSE, NULL); + + g_settings_bind_writable (settings, "int", obj, "bool", FALSE); + + g_object_get (obj, "bool", &b, NULL); + g_assert (b); + + g_settings_unbind (obj, "bool"); + + g_settings_bind_writable (settings, "int", obj, "bool", TRUE); + + g_object_get (obj, "bool", &b, NULL); + g_assert (!b); + + g_object_unref (obj); + g_object_unref (settings); +} + +/* Test one-way bindings. + * Verify that changes on one side show up on the other, + * but not vice versa + */ +static void +test_directional_binding (void) +{ + TestObject *obj; + GSettings *settings; + gboolean b; + gint i; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_object_set (obj, "bool", FALSE, NULL); + g_settings_set_boolean (settings, "bool", FALSE); + + g_settings_bind (settings, "bool", obj, "bool", G_SETTINGS_BIND_GET); + + g_settings_set_boolean (settings, "bool", TRUE); + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, TRUE); + + g_object_set (obj, "bool", FALSE, NULL); + g_assert_cmpint (g_settings_get_boolean (settings, "bool"), ==, TRUE); + + g_object_set (obj, "int", 20, NULL); + g_settings_set_int (settings, "int", 20); + + g_settings_bind (settings, "int", obj, "int", G_SETTINGS_BIND_SET); + + g_object_set (obj, "int", 32, NULL); + g_assert_cmpint (g_settings_get_int (settings, "int"), ==, 32); + + g_settings_set_int (settings, "int", 20); + g_object_get (obj, "int", &i, NULL); + g_assert_cmpint (i, ==, 32); + + g_object_unref (obj); + g_object_unref (settings); +} + +/* Test that type mismatch is caught when creating a binding + */ +static void +test_typesafe_binding (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "string", obj, "int", G_SETTINGS_BIND_DEFAULT); + + g_object_unref (obj); + g_object_unref (settings); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not compatible*"); +} + +static gboolean +string_to_bool (GValue *value, + GVariant *variant, + gpointer user_data) +{ + const gchar *s; + + s = g_variant_get_string (variant, NULL); + g_value_set_boolean (value, g_strcmp0 (s, "true") == 0); + + return TRUE; +} + +static GVariant * +bool_to_string (const GValue *value, + const GVariantType *expected_type, + gpointer user_data) +{ + if (g_value_get_boolean (value)) + return g_variant_new_string ("true"); + else + return g_variant_new_string ("false"); +} + +/* Test custom bindings. + * Translate strings to booleans and back + */ +static void +test_custom_binding (void) +{ + TestObject *obj; + GSettings *settings; + gchar *s; + gboolean b; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_set_string (settings, "string", "true"); + + g_settings_bind_with_mapping (settings, "string", + obj, "bool", + G_SETTINGS_BIND_DEFAULT, + string_to_bool, + bool_to_string, + NULL, NULL); + + g_settings_set_string (settings, "string", "false"); + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, FALSE); + + g_settings_set_string (settings, "string", "not true"); + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, FALSE); + + g_object_set (obj, "bool", TRUE, NULL); + s = g_settings_get_string (settings, "string"); + g_assert_cmpstr (s, ==, "true"); + g_free (s); + + g_object_unref (obj); + g_object_unref (settings); +} + +/* Test that with G_SETTINGS_BIND_NO_CHANGES, the + * initial settings value is transported to the object + * side, but later settings changes do not affect the + * object + */ +static void +test_no_change_binding (void) +{ + TestObject *obj; + GSettings *settings; + gboolean b; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_object_set (obj, "bool", TRUE, NULL); + g_settings_set_boolean (settings, "bool", FALSE); + + g_settings_bind (settings, "bool", obj, "bool", G_SETTINGS_BIND_GET_NO_CHANGES); + + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, FALSE); + + g_settings_set_boolean (settings, "bool", TRUE); + g_object_get (obj, "bool", &b, NULL); + g_assert_cmpint (b, ==, FALSE); + + g_settings_set_boolean (settings, "bool", FALSE); + g_object_set (obj, "bool", TRUE, NULL); + b = g_settings_get_boolean (settings, "bool"); + g_assert_cmpint (b, ==, TRUE); + + g_object_unref (obj); + g_object_unref (settings); +} + +/* Test that binding a non-readable property only + * works in 'GET' mode. + */ +static void +test_no_read_binding (void) +{ + if (g_test_undefined ()) + { + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "string", obj, "no-read", 0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*property*is not readable*"); + } + + if (g_test_trap_fork (0, 0)) + { + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "string", obj, "no-read", G_SETTINGS_BIND_GET); + + exit (0); + } + g_test_trap_assert_passed (); +} + +/* Test that binding a non-writable property only + * works in 'SET' mode. + */ +static void +test_no_write_binding (void) +{ + if (g_test_undefined ()) + { + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "string", obj, "no-write", 0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*property*is not writable*"); + } + + if (g_test_trap_fork (0, 0)) + { + TestObject *obj; + GSettings *settings; + + settings = g_settings_new ("org.gtk.test.binding"); + obj = test_object_new (); + + g_settings_bind (settings, "string", obj, "no-write", G_SETTINGS_BIND_SET); + + exit (0); + } + g_test_trap_assert_passed (); +} + +/* + * Test that using a keyfile works + */ +static void +test_keyfile (void) +{ + GSettingsBackend *kf_backend; + GSettings *settings; + GKeyFile *keyfile; + gchar *str; + + g_remove ("gsettings.store"); + + kf_backend = g_keyfile_settings_backend_new ("gsettings.store", "/", "root"); + settings = g_settings_new_with_backend ("org.gtk.test", kf_backend); + g_object_unref (kf_backend); + + g_settings_set (settings, "greeting", "s", "see if this works"); + + keyfile = g_key_file_new (); + g_assert (g_key_file_load_from_file (keyfile, "gsettings.store", 0, NULL)); + + str = g_key_file_get_string (keyfile, "tests", "greeting", NULL); + g_assert_cmpstr (str, ==, "'see if this works'"); + + g_free (str); + g_key_file_free (keyfile); + g_object_unref (settings); +} + +/* Test that getting child schemas works + */ +static void +test_child_schema (void) +{ + GSettings *settings; + GSettings *child; + guint8 byte; + + /* first establish some known conditions */ + settings = g_settings_new ("org.gtk.test.basic-types"); + g_settings_set (settings, "test-byte", "y", 36); + + g_settings_get (settings, "test-byte", "y", &byte); + g_assert_cmpint (byte, ==, 36); + + g_object_unref (settings); + + settings = g_settings_new ("org.gtk.test"); + child = g_settings_get_child (settings, "basic-types"); + g_assert (child != NULL); + + g_settings_get (child, "test-byte", "y", &byte); + g_assert_cmpint (byte, ==, 36); + + g_object_unref (child); + g_object_unref (settings); +} + +static gboolean +glib_translations_work (void) +{ + gboolean works; + gchar *locale; + gchar *orig = "Unnamed"; + + locale = g_strdup (setlocale (LC_MESSAGES, NULL)); + if (!setlocale (LC_MESSAGES, "de")) + works = FALSE; + else + works = dgettext ("glib20", orig) != orig; + setlocale (LC_MESSAGES, locale); + g_free (locale); + + return works; +} + +#include "../strinfo.c" + +static void +test_strinfo (void) +{ + /* "foo" has a value of 1 + * "bar" has a value of 2 + * "baz" is an alias for "bar" + */ + gchar array[] = + "\1\0\0\0" "\xff""foo" "\0\0\0\xff" "\2\0\0\0" + "\xff" "bar" "\0\0\0\xff" "\3\0\0\0" "\xfe""baz" + "\0\0\0\xff"; + const guint32 *strinfo = (guint32 *) array; + guint length = sizeof array / 4; + guint result; + + { + /* build it and compare */ + GString *builder; + + builder = g_string_new (NULL); + strinfo_builder_append_item (builder, "foo", 1); + strinfo_builder_append_item (builder, "bar", 2); + g_assert (strinfo_builder_append_alias (builder, "baz", "bar")); + g_assert_cmpint (builder->len % 4, ==, 0); + g_assert_cmpint (builder->len / 4, ==, length); + g_assert (memcmp (builder->str, strinfo, length * 4) == 0); + g_string_free (builder, TRUE); + } + + g_assert_cmpstr (strinfo_string_from_alias (strinfo, length, "foo"), + ==, NULL); + g_assert_cmpstr (strinfo_string_from_alias (strinfo, length, "bar"), + ==, NULL); + g_assert_cmpstr (strinfo_string_from_alias (strinfo, length, "baz"), + ==, "bar"); + g_assert_cmpstr (strinfo_string_from_alias (strinfo, length, "quux"), + ==, NULL); + + g_assert (strinfo_enum_from_string (strinfo, length, "foo", &result)); + g_assert_cmpint (result, ==, 1); + g_assert (strinfo_enum_from_string (strinfo, length, "bar", &result)); + g_assert_cmpint (result, ==, 2); + g_assert (!strinfo_enum_from_string (strinfo, length, "baz", &result)); + g_assert (!strinfo_enum_from_string (strinfo, length, "quux", &result)); + + g_assert_cmpstr (strinfo_string_from_enum (strinfo, length, 0), ==, NULL); + g_assert_cmpstr (strinfo_string_from_enum (strinfo, length, 1), ==, "foo"); + g_assert_cmpstr (strinfo_string_from_enum (strinfo, length, 2), ==, "bar"); + g_assert_cmpstr (strinfo_string_from_enum (strinfo, length, 3), ==, NULL); + + g_assert (strinfo_is_string_valid (strinfo, length, "foo")); + g_assert (strinfo_is_string_valid (strinfo, length, "bar")); + g_assert (!strinfo_is_string_valid (strinfo, length, "baz")); + g_assert (!strinfo_is_string_valid (strinfo, length, "quux")); +} + +static void +test_enums (void) +{ + GSettings *settings, *direct; + gchar *str; + + settings = g_settings_new ("org.gtk.test.enums"); + direct = g_settings_new ("org.gtk.test.enums.direct"); + + if (g_test_undefined () && !backend_set) + { + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_get_enum (direct, "test"); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not associated with an enum*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_enum (settings, "test", 42); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*invalid enum value 42*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_string (settings, "test", "qux"); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*g_settings_set_value*valid range*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_get_flags (settings, "test"); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not associated with a flags*"); + } + + str = g_settings_get_string (settings, "test"); + g_assert_cmpstr (str, ==, "bar"); + g_free (str); + + g_settings_set_enum (settings, "test", TEST_ENUM_FOO); + + str = g_settings_get_string (settings, "test"); + g_assert_cmpstr (str, ==, "foo"); + g_free (str); + + g_assert_cmpint (g_settings_get_enum (settings, "test"), ==, TEST_ENUM_FOO); + + g_settings_set_string (direct, "test", "qux"); + + str = g_settings_get_string (direct, "test"); + g_assert_cmpstr (str, ==, "qux"); + g_free (str); + + str = g_settings_get_string (settings, "test"); + g_assert_cmpstr (str, ==, "quux"); + g_free (str); + + g_assert_cmpint (g_settings_get_enum (settings, "test"), ==, TEST_ENUM_QUUX); +} + +static void +test_flags (void) +{ + GSettings *settings, *direct; + gchar **strv; + gchar *str; + + settings = g_settings_new ("org.gtk.test.enums"); + direct = g_settings_new ("org.gtk.test.enums.direct"); + + if (g_test_undefined () && !backend_set) + { + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_get_flags (direct, "test"); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not associated with a flags*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_flags (settings, "f-test", 0x42); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*invalid flags value 0x00000042*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_strv (settings, "f-test", + (const gchar **) g_strsplit ("rock", ",", 0)); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*g_settings_set_value*valid range*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_get_enum (settings, "f-test"); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*not associated with an enum*"); + } + + strv = g_settings_get_strv (settings, "f-test"); + str = g_strjoinv (",", strv); + g_assert_cmpstr (str, ==, ""); + g_strfreev (strv); + g_free (str); + + g_settings_set_flags (settings, "f-test", + TEST_FLAGS_WALKING | TEST_FLAGS_TALKING); + + strv = g_settings_get_strv (settings, "f-test"); + str = g_strjoinv (",", strv); + g_assert_cmpstr (str, ==, "talking,walking"); + g_strfreev (strv); + g_free (str); + + g_assert_cmpint (g_settings_get_flags (settings, "f-test"), ==, + TEST_FLAGS_WALKING | TEST_FLAGS_TALKING); + + strv = g_strsplit ("speaking,laughing", ",", 0); + g_settings_set_strv (direct, "f-test", (const gchar **) strv); + g_strfreev (strv); + + strv = g_settings_get_strv (direct, "f-test"); + str = g_strjoinv (",", strv); + g_assert_cmpstr (str, ==, "speaking,laughing"); + g_strfreev (strv); + g_free (str); + + strv = g_settings_get_strv (settings, "f-test"); + str = g_strjoinv (",", strv); + g_assert_cmpstr (str, ==, "talking,laughing"); + g_strfreev (strv); + g_free (str); + + g_assert_cmpint (g_settings_get_flags (settings, "f-test"), ==, + TEST_FLAGS_TALKING | TEST_FLAGS_LAUGHING); +} + +static void +test_range (void) +{ + GSettings *settings, *direct; + GVariant *value; + + settings = g_settings_new ("org.gtk.test.range"); + direct = g_settings_new ("org.gtk.test.range.direct"); + + if (g_test_undefined () && !backend_set) + { + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_int (settings, "val", 45); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*g_settings_set_value*valid range*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_settings_set_int (settings, "val", 1); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*g_settings_set_value*valid range*"); + } + + g_assert_cmpint (g_settings_get_int (settings, "val"), ==, 33); + g_settings_set_int (direct, "val", 22); + g_assert_cmpint (g_settings_get_int (direct, "val"), ==, 22); + g_assert_cmpint (g_settings_get_int (settings, "val"), ==, 22); + g_settings_set_int (direct, "val", 45); + g_assert_cmpint (g_settings_get_int (direct, "val"), ==, 45); + g_assert_cmpint (g_settings_get_int (settings, "val"), ==, 33); + g_settings_set_int (direct, "val", 1); + g_assert_cmpint (g_settings_get_int (direct, "val"), ==, 1); + g_assert_cmpint (g_settings_get_int (settings, "val"), ==, 33); + + value = g_variant_new_int32 (1); + g_assert (!g_settings_range_check (settings, "val", value)); + g_variant_unref (value); + value = g_variant_new_int32 (33); + g_assert (g_settings_range_check (settings, "val", value)); + g_variant_unref (value); + value = g_variant_new_int32 (45); + g_assert (!g_settings_range_check (settings, "val", value)); + g_variant_unref (value); +} + +static gboolean +strv_has_string (gchar **haystack, + const gchar *needle) +{ + guint n; + + for (n = 0; haystack != NULL && haystack[n] != NULL; n++) + { + if (g_strcmp0 (haystack[n], needle) == 0) + return TRUE; + } + return FALSE; +} + +static gboolean +strv_set_equal (gchar **strv, ...) +{ + gint count; + va_list list; + const gchar *str; + gboolean res; + + res = TRUE; + count = 0; + va_start (list, strv); + while (1) + { + str = va_arg (list, const gchar *); + if (str == NULL) + break; + if (!strv_has_string (strv, str)) + { + res = FALSE; + break; + } + count++; + } + va_end (list); + + if (res) + res = g_strv_length ((gchar**)strv) == count; + + return res; +} + +static void +test_list_items (void) +{ + GSettings *settings; + gchar **children; + gchar **keys; + + settings = g_settings_new ("org.gtk.test"); + children = g_settings_list_children (settings); + keys = g_settings_list_keys (settings); + + g_assert (strv_set_equal (children, "basic-types", "complex-types", "localized", NULL)); + g_assert (strv_set_equal (keys, "greeting", "farewell", NULL)); + + g_strfreev (children); + g_strfreev (keys); + + g_object_unref (settings); +} + +static void +test_list_schemas (void) +{ + const gchar * const *schemas; + const gchar * const *relocs; + + relocs = g_settings_list_relocatable_schemas (); + schemas = g_settings_list_schemas (); + + g_assert (strv_set_equal ((gchar **)relocs, + "org.gtk.test.no-path", + NULL)); + + g_assert (strv_set_equal ((gchar **)schemas, + "org.gtk.test", + "org.gtk.test.basic-types", + "org.gtk.test.complex-types", + "org.gtk.test.localized", + "org.gtk.test.binding", + "org.gtk.test.enums", + "org.gtk.test.enums.direct", + "org.gtk.test.range", + "org.gtk.test.range.direct", + "org.gtk.test.mapped", + NULL)); +} + +static gboolean +map_func (GVariant *value, + gpointer *result, + gpointer user_data) +{ + gint *state = user_data; + gint v; + + if (value) + v = g_variant_get_int32 (value); + else + v = -1; + + if (*state == 0) + { + g_assert_cmpint (v, ==, 1); + (*state)++; + return FALSE; + } + else if (*state == 1) + { + g_assert_cmpint (v, ==, 0); + (*state)++; + return FALSE; + } + else + { + g_assert (value == NULL); + *result = g_variant_new_int32 (5); + return TRUE; + } +} + +static void +test_get_mapped (void) +{ + GSettings *settings; + gint state; + gpointer p; + gint val; + + settings = g_settings_new ("org.gtk.test.mapped"); + g_settings_set_int (settings, "val", 1); + + state = 0; + p = g_settings_get_mapped (settings, "val", map_func, &state); + val = g_variant_get_int32 ((GVariant*)p); + g_assert_cmpint (val, ==, 5); + + g_variant_unref (p); + g_object_unref (settings); +} + +static void +test_get_range (void) +{ + GSettings *settings; + GVariant *range; + + settings = g_settings_new ("org.gtk.test.range"); + range = g_settings_get_range (settings, "val"); + check_and_free (range, "('range', <(2, 44)>)"); + g_object_unref (settings); + + settings = g_settings_new ("org.gtk.test.enums"); + range = g_settings_get_range (settings, "test"); + check_and_free (range, "('enum', <['foo', 'bar', 'baz', 'quux']>)"); + g_object_unref (settings); + + settings = g_settings_new ("org.gtk.test.enums"); + range = g_settings_get_range (settings, "f-test"); + check_and_free (range, "('flags', " + "<['mourning', 'laughing', 'talking', 'walking']>)"); + g_object_unref (settings); + + settings = g_settings_new ("org.gtk.test"); + range = g_settings_get_range (settings, "greeting"); + check_and_free (range, "('type', <@as []>)"); + g_object_unref (settings); +} + +static void +test_schema_source (void) +{ + GSettingsSchemaSource *parent; + GSettingsSchemaSource *source; + GSettingsBackend *backend; + GSettingsSchema *schema; + GError *error = NULL; + GSettings *settings; + gboolean enabled; + + backend = g_settings_backend_get_default (); + + /* make sure it fails properly */ + parent = g_settings_schema_source_get_default (); + source = g_settings_schema_source_new_from_directory ("/path/that/does/not/exist", parent, TRUE, &error); + g_assert (source == NULL); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + g_clear_error (&error); + + /* create a source with the parent */ + source = g_settings_schema_source_new_from_directory ("schema-source", parent, TRUE, &error); + g_assert_no_error (error); + g_assert (source != NULL); + + /* check recursive lookups are working */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", TRUE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + /* check recursive lookups for non-existent schemas */ + schema = g_settings_schema_source_lookup (source, "org.gtk.doesnotexist", TRUE); + g_assert (schema == NULL); + + /* check non-recursive for schema that only exists in lower layers */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", FALSE); + g_assert (schema == NULL); + + /* check non-recursive lookup for non-existent */ + schema = g_settings_schema_source_lookup (source, "org.gtk.doesnotexist", FALSE); + g_assert (schema == NULL); + + /* check non-recursive for schema that exists in toplevel */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", FALSE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + /* check recursive for schema that exists in toplevel */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", TRUE); + g_assert (schema != NULL); + + /* try to use it for something */ + settings = g_settings_new_full (schema, backend, g_settings_schema_get_path (schema)); + g_settings_schema_unref (schema); + enabled = FALSE; + g_settings_get (settings, "enabled", "b", &enabled); + g_assert (enabled); + g_object_unref (settings); + + g_settings_schema_source_unref (source); + + /* try again, but with no parent */ + source = g_settings_schema_source_new_from_directory ("schema-source", NULL, FALSE, NULL); + g_assert (source != NULL); + + /* should not find it this time, even if recursive... */ + schema = g_settings_schema_source_lookup (source, "org.gtk.test", FALSE); + g_assert (schema == NULL); + schema = g_settings_schema_source_lookup (source, "org.gtk.test", TRUE); + g_assert (schema == NULL); + + /* should still find our own... */ + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", TRUE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + schema = g_settings_schema_source_lookup (source, "org.gtk.schemasourcecheck", FALSE); + g_assert (schema != NULL); + g_settings_schema_unref (schema); + + g_settings_schema_source_unref (source); +} + +static void +test_actions (void) +{ + GAction *string, *toggle; + gboolean c1, c2, c3; + GSettings *settings; + gchar *name; + GVariantType *param_type; + gboolean enabled; + GVariantType *state_type; + GVariant *state; + + settings = g_settings_new ("org.gtk.test.basic-types"); + string = g_settings_create_action (settings, "test-string"); + toggle = g_settings_create_action (settings, "test-boolean"); + g_object_unref (settings); /* should be held by the actions */ + + g_signal_connect (settings, "changed", G_CALLBACK (changed_cb2), &c1); + g_signal_connect (string, "notify::state", G_CALLBACK (changed_cb2), &c2); + g_signal_connect (toggle, "notify::state", G_CALLBACK (changed_cb2), &c3); + + c1 = c2 = c3 = FALSE; + g_settings_set_string (settings, "test-string", "hello world"); + check_and_free (g_action_get_state (string), "'hello world'"); + g_assert (c1 && c2 && !c3); + c1 = c2 = c3 = FALSE; + + g_action_activate (string, g_variant_new_string ("hihi")); + check_and_free (g_settings_get_value (settings, "test-string"), "'hihi'"); + g_assert (c1 && c2 && !c3); + c1 = c2 = c3 = FALSE; + + g_action_change_state (string, g_variant_new_string ("kthxbye")); + check_and_free (g_settings_get_value (settings, "test-string"), "'kthxbye'"); + g_assert (c1 && c2 && !c3); + c1 = c2 = c3 = FALSE; + + g_action_change_state (toggle, g_variant_new_boolean (TRUE)); + g_assert (g_settings_get_boolean (settings, "test-boolean")); + g_assert (c1 && !c2 && c3); + c1 = c2 = c3 = FALSE; + + g_action_activate (toggle, NULL); + g_assert (!g_settings_get_boolean (settings, "test-boolean")); + g_assert (c1 && !c2 && c3); + + g_object_get (string, + "name", &name, + "parameter-type", ¶m_type, + "enabled", &enabled, + "state-type", &state_type, + "state", &state, + NULL); + + g_assert_cmpstr (name, ==, "test-string"); + g_assert (g_variant_type_equal (param_type, G_VARIANT_TYPE_STRING)); + g_assert (enabled); + g_assert (g_variant_type_equal (state_type, G_VARIANT_TYPE_STRING)); + g_assert_cmpstr (g_variant_get_string (state, NULL), ==, "kthxbye"); + + g_free (name); + g_variant_unref (state); + + g_object_unref (string); + g_object_unref (toggle); +} + +int +main (int argc, char *argv[]) +{ + gchar *enums; + gint result; + + setlocale (LC_ALL, ""); + + backend_set = g_getenv ("GSETTINGS_BACKEND") != NULL; + + g_setenv ("XDG_DATA_DIRS", ".", TRUE); + g_setenv ("GSETTINGS_SCHEMA_DIR", ".", TRUE); + + if (!backend_set) + g_setenv ("GSETTINGS_BACKEND", "memory", TRUE); + + g_test_init (&argc, &argv, NULL); + + g_remove ("org.gtk.test.enums.xml"); + g_assert (g_spawn_command_line_sync ("../../gobject/glib-mkenums " + "--template " SRCDIR "/enums.xml.template " + SRCDIR "/testenum.h", + &enums, NULL, &result, NULL)); + g_assert (result == 0); + g_assert (g_file_set_contents ("org.gtk.test.enums.xml", enums, -1, NULL)); + g_free (enums); + + g_remove ("gschemas.compiled"); + g_assert (g_spawn_command_line_sync ("../glib-compile-schemas --targetdir=. " + "--schema-file=org.gtk.test.enums.xml " + "--schema-file=" SRCDIR "/org.gtk.test.gschema.xml", + NULL, NULL, &result, NULL)); + g_assert (result == 0); + + g_remove ("schema-source/gschemas.compiled"); + g_mkdir ("schema-source", 0777); + g_assert (g_spawn_command_line_sync ("../glib-compile-schemas --targetdir=schema-source " + "--schema-file=" SRCDIR "/org.gtk.schemasourcecheck.gschema.xml", + NULL, NULL, &result, NULL)); + g_assert (result == 0); + + g_test_add_func ("/gsettings/basic", test_basic); + + if (!backend_set) + { + g_test_add_func ("/gsettings/no-schema", test_no_schema); + g_test_add_func ("/gsettings/unknown-key", test_unknown_key); + g_test_add_func ("/gsettings/wrong-type", test_wrong_type); + g_test_add_func ("/gsettings/wrong-path", test_wrong_path); + g_test_add_func ("/gsettings/no-path", test_no_path); + } + + g_test_add_func ("/gsettings/basic-types", test_basic_types); + g_test_add_func ("/gsettings/complex-types", test_complex_types); + g_test_add_func ("/gsettings/changes", test_changes); + + if (glib_translations_work ()) + { + g_test_add_func ("/gsettings/l10n", test_l10n); + g_test_add_func ("/gsettings/l10n-context", test_l10n_context); + } + + g_test_add_func ("/gsettings/delay-apply", test_delay_apply); + g_test_add_func ("/gsettings/delay-revert", test_delay_revert); + g_test_add_func ("/gsettings/atomic", test_atomic); + + g_test_add_func ("/gsettings/simple-binding", test_simple_binding); + g_test_add_func ("/gsettings/directional-binding", test_directional_binding); + g_test_add_func ("/gsettings/custom-binding", test_custom_binding); + g_test_add_func ("/gsettings/no-change-binding", test_no_change_binding); + g_test_add_func ("/gsettings/unbinding", test_unbind); + g_test_add_func ("/gsettings/writable-binding", test_bind_writable); + + if (!backend_set) + { + g_test_add_func ("/gsettings/typesafe-binding", test_typesafe_binding); + g_test_add_func ("/gsettings/no-read-binding", test_no_read_binding); + g_test_add_func ("/gsettings/no-write-binding", test_no_write_binding); + } + + g_test_add_func ("/gsettings/keyfile", test_keyfile); + g_test_add_func ("/gsettings/child-schema", test_child_schema); + g_test_add_func ("/gsettings/strinfo", test_strinfo); + g_test_add_func ("/gsettings/enums", test_enums); + g_test_add_func ("/gsettings/flags", test_flags); + g_test_add_func ("/gsettings/range", test_range); + g_test_add_func ("/gsettings/list-items", test_list_items); + g_test_add_func ("/gsettings/list-schemas", test_list_schemas); + g_test_add_func ("/gsettings/mapped", test_get_mapped); + g_test_add_func ("/gsettings/get-range", test_get_range); + g_test_add_func ("/gsettings/schema-source", test_schema_source); + g_test_add_func ("/gsettings/actions", test_actions); + + result = g_test_run (); + + g_settings_sync (); + + return result; +} diff --git a/gio/tests/gtesttlsbackend.c b/gio/tests/gtesttlsbackend.c new file mode 100644 index 0000000..d951bdf --- /dev/null +++ b/gio/tests/gtesttlsbackend.c @@ -0,0 +1,312 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 "gtesttlsbackend.h" + +#include + +static GType _g_test_tls_certificate_get_type (void); +static GType _g_test_tls_connection_get_type (void); + +struct _GTestTlsBackend { + GObject parent_instance; +}; + +static void g_test_tls_backend_iface_init (GTlsBackendInterface *iface); + +#define g_test_tls_backend_get_type _g_test_tls_backend_get_type +G_DEFINE_TYPE_WITH_CODE (GTestTlsBackend, g_test_tls_backend, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_BACKEND, + g_test_tls_backend_iface_init) + g_io_extension_point_set_required_type ( + g_io_extension_point_register (G_TLS_BACKEND_EXTENSION_POINT_NAME), + G_TYPE_TLS_BACKEND); + g_io_extension_point_implement (G_TLS_BACKEND_EXTENSION_POINT_NAME, + g_define_type_id, + "test", + 999)) + +static void +g_test_tls_backend_init (GTestTlsBackend *backend) +{ +} + +static void +g_test_tls_backend_class_init (GTestTlsBackendClass *backend_class) +{ +} + +static void +g_test_tls_backend_iface_init (GTlsBackendInterface *iface) +{ + iface->get_certificate_type = _g_test_tls_certificate_get_type; + iface->get_client_connection_type = _g_test_tls_connection_get_type; + iface->get_server_connection_type = _g_test_tls_connection_get_type; +} + +/* Test certificate type */ + +typedef struct _GTestTlsCertificate GTestTlsCertificate; +typedef struct _GTestTlsCertificateClass GTestTlsCertificateClass; + +struct _GTestTlsCertificate { + GTlsCertificate parent_instance; + gchar *key_pem; + gchar *cert_pem; +}; + +struct _GTestTlsCertificateClass { + GTlsCertificateClass parent_class; +}; + +enum +{ + PROP_CERTIFICATE_0, + + PROP_CERT_CERTIFICATE, + PROP_CERT_CERTIFICATE_PEM, + PROP_CERT_PRIVATE_KEY, + PROP_CERT_PRIVATE_KEY_PEM, + PROP_CERT_ISSUER +}; + +static void g_test_tls_certificate_initable_iface_init (GInitableIface *iface); + +#define g_test_tls_certificate_get_type _g_test_tls_certificate_get_type +G_DEFINE_TYPE_WITH_CODE (GTestTlsCertificate, g_test_tls_certificate, G_TYPE_TLS_CERTIFICATE, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_test_tls_certificate_initable_iface_init);) + +static void +g_test_tls_certificate_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GTestTlsCertificate *cert = (GTestTlsCertificate *) object; + + switch (prop_id) + { + case PROP_CERT_CERTIFICATE_PEM: + g_value_set_string (value, cert->cert_pem); + break; + case PROP_CERT_PRIVATE_KEY_PEM: + g_value_set_string (value, cert->key_pem); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +g_test_tls_certificate_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GTestTlsCertificate *cert = (GTestTlsCertificate *) object; + + switch (prop_id) + { + case PROP_CERT_CERTIFICATE_PEM: + cert->cert_pem = g_value_dup_string (value); + break; + case PROP_CERT_PRIVATE_KEY_PEM: + cert->key_pem = g_value_dup_string (value); + break; + case PROP_CERT_CERTIFICATE: + case PROP_CERT_PRIVATE_KEY: + case PROP_CERT_ISSUER: + /* ignore */ + break; + default: + g_assert_not_reached (); + break; + } +} + +static void +g_test_tls_certificate_finalize (GObject *object) +{ + GTestTlsCertificate *cert = (GTestTlsCertificate *) object; + + g_free (cert->cert_pem); + g_free (cert->key_pem); +} + +static void +g_test_tls_certificate_class_init (GTestTlsCertificateClass *certificate_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (certificate_class); + + gobject_class->get_property = g_test_tls_certificate_get_property; + gobject_class->set_property = g_test_tls_certificate_set_property; + gobject_class->finalize = g_test_tls_certificate_finalize; + + g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE, "certificate"); + g_object_class_override_property (gobject_class, PROP_CERT_CERTIFICATE_PEM, "certificate-pem"); + g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY, "private-key"); + g_object_class_override_property (gobject_class, PROP_CERT_PRIVATE_KEY_PEM, "private-key-pem"); + g_object_class_override_property (gobject_class, PROP_CERT_ISSUER, "issuer"); +} + +static void +g_test_tls_certificate_init (GTestTlsCertificate *certificate) +{ +} + +static gboolean +g_test_tls_certificate_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_test_tls_certificate_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_test_tls_certificate_initable_init; +} + +/* Dummy connection type; since GTlsClientConnection and + * GTlsServerConnection are just interfaces, we can implement them + * both on a single object. + */ + +typedef struct _GTestTlsConnection GTestTlsConnection; +typedef struct _GTestTlsConnectionClass GTestTlsConnectionClass; + +struct _GTestTlsConnection { + GTlsConnection parent_instance; +}; + +struct _GTestTlsConnectionClass { + GTlsConnectionClass parent_class; +}; + +enum +{ + PROP_CONNECTION_0, + + PROP_CONN_BASE_IO_STREAM, + PROP_CONN_USE_SYSTEM_CERTDB, + PROP_CONN_REQUIRE_CLOSE_NOTIFY, + PROP_CONN_REHANDSHAKE_MODE, + PROP_CONN_CERTIFICATE, + PROP_CONN_PEER_CERTIFICATE, + PROP_CONN_PEER_CERTIFICATE_ERRORS, + PROP_CONN_VALIDATION_FLAGS, + PROP_CONN_SERVER_IDENTITY, + PROP_CONN_USE_SSL3, + PROP_CONN_ACCEPTED_CAS, + PROP_CONN_AUTHENTICATION_MODE +}; + +static void g_test_tls_connection_initable_iface_init (GInitableIface *iface); + +#define g_test_tls_connection_get_type _g_test_tls_connection_get_type +G_DEFINE_TYPE_WITH_CODE (GTestTlsConnection, g_test_tls_connection, G_TYPE_TLS_CONNECTION, + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_CLIENT_CONNECTION, NULL); + G_IMPLEMENT_INTERFACE (G_TYPE_TLS_SERVER_CONNECTION, NULL); + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, + g_test_tls_connection_initable_iface_init);) + +static void +g_test_tls_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ +} + +static void +g_test_tls_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ +} + +static gboolean +g_test_tls_connection_close (GIOStream *stream, + GCancellable *cancellable, + GError **error) +{ + return TRUE; +} + +static void +g_test_tls_connection_class_init (GTestTlsConnectionClass *connection_class) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (connection_class); + GIOStreamClass *io_stream_class = G_IO_STREAM_CLASS (connection_class); + + gobject_class->get_property = g_test_tls_connection_get_property; + gobject_class->set_property = g_test_tls_connection_set_property; + + /* Need to override this because when initable_init fails it will + * dispose the connection, which will close it, which would + * otherwise try to close its input/output streams, which don't + * exist. + */ + io_stream_class->close_fn = g_test_tls_connection_close; + + g_object_class_override_property (gobject_class, PROP_CONN_BASE_IO_STREAM, "base-io-stream"); + g_object_class_override_property (gobject_class, PROP_CONN_USE_SYSTEM_CERTDB, "use-system-certdb"); + g_object_class_override_property (gobject_class, PROP_CONN_REQUIRE_CLOSE_NOTIFY, "require-close-notify"); + g_object_class_override_property (gobject_class, PROP_CONN_REHANDSHAKE_MODE, "rehandshake-mode"); + g_object_class_override_property (gobject_class, PROP_CONN_CERTIFICATE, "certificate"); + g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE, "peer-certificate"); + g_object_class_override_property (gobject_class, PROP_CONN_PEER_CERTIFICATE_ERRORS, "peer-certificate-errors"); + g_object_class_override_property (gobject_class, PROP_CONN_VALIDATION_FLAGS, "validation-flags"); + g_object_class_override_property (gobject_class, PROP_CONN_SERVER_IDENTITY, "server-identity"); + g_object_class_override_property (gobject_class, PROP_CONN_USE_SSL3, "use-ssl3"); + g_object_class_override_property (gobject_class, PROP_CONN_ACCEPTED_CAS, "accepted-cas"); + g_object_class_override_property (gobject_class, PROP_CONN_AUTHENTICATION_MODE, "authentication-mode"); +} + +static void +g_test_tls_connection_init (GTestTlsConnection *connection) +{ +} + +static gboolean +g_test_tls_connection_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_UNAVAILABLE, + "TLS Connection support is not available"); + return FALSE; +} + +static void +g_test_tls_connection_initable_iface_init (GInitableIface *iface) +{ + iface->init = g_test_tls_connection_initable_init; +} + +const gchar * +g_test_tls_connection_get_private_key_pem (GTlsCertificate *cert) +{ + return ((GTestTlsCertificate *)cert)->key_pem; +} diff --git a/gio/tests/gtesttlsbackend.h b/gio/tests/gtesttlsbackend.h new file mode 100644 index 0000000..c745fb9 --- /dev/null +++ b/gio/tests/gtesttlsbackend.h @@ -0,0 +1,49 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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_TEST_TLS_BACKEND_H__ +#define __G_TEST_TLS_BACKEND_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TEST_TLS_BACKEND (_g_test_tls_backend_get_type ()) +#define G_TEST_TLS_BACKEND(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TEST_TLS_BACKEND, GTestTlsBackend)) +#define G_TEST_TLS_BACKEND_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TEST_TLS_BACKEND, GTestTlsBackendClass)) +#define G_IS_TEST_TLS_BACKEND(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TEST_TLS_BACKEND)) +#define G_IS_TEST_TLS_BACKEND_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TEST_TLS_BACKEND)) +#define G_TEST_TLS_BACKEND_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TEST_TLS_BACKEND, GTestTlsBackendClass)) + +typedef struct _GTestTlsBackend GTestTlsBackend; +typedef struct _GTestTlsBackendClass GTestTlsBackendClass; + +struct _GTestTlsBackendClass { + GObjectClass parent_class; +}; + +GType _g_test_tls_backend_get_type (void); + +const gchar *g_test_tls_connection_get_private_key_pem (GTlsCertificate *cert); + + +G_END_DECLS + +#endif /* __G_TEST_TLS_BACKEND_H__ */ diff --git a/gio/tests/gtlsconsoleinteraction.c b/gio/tests/gtlsconsoleinteraction.c new file mode 100644 index 0000000..717a83c --- /dev/null +++ b/gio/tests/gtlsconsoleinteraction.c @@ -0,0 +1,156 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" + +#include +#include + +#ifdef G_OS_WIN32 +#include +#include +#endif + +#include "gtlsconsoleinteraction.h" + +/* + * WARNING: This is not the example you're looking for [slow hand wave]. This + * is not industrial strength, it's just for testing. It uses embarassing + * functions like getpass() and does lazy things with threads. + */ + +G_DEFINE_TYPE (GTlsConsoleInteraction, g_tls_console_interaction, G_TYPE_TLS_INTERACTION); + +#ifdef G_OS_WIN32 +/* win32 doesn't have getpass() */ +static gchar * +getpass (const gchar *prompt) +{ + static gchar buf[BUFSIZ]; + gint i; + + g_printf ("%s", prompt); + fflush (stdout); + + for (i = 0; i < BUFSIZ - 1; ++i) + { + buf[i] = _getch (); + if (buf[i] == '\r') + break; + } + buf[i] = '\0'; + + g_printf ("\n"); + + return &buf[0]; +} +#endif + +static GTlsInteractionResult +g_tls_console_interaction_ask_password (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + const gchar *value; + gchar *prompt; + + prompt = g_strdup_printf ("Password \"%s\"': ", g_tls_password_get_description (password)); + value = getpass (prompt); + g_free (prompt); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return G_TLS_INTERACTION_FAILED; + + g_tls_password_set_value (password, (guchar *)value, -1); + return G_TLS_INTERACTION_HANDLED; +} + +static void +ask_password_with_getpass (GTask *task, + gpointer object, + gpointer task_data, + GCancellable *cancellable) +{ + GTlsPassword *password = task_data; + GError *error = NULL; + + g_tls_console_interaction_ask_password (G_TLS_INTERACTION (object), password, + cancellable, &error); + if (error != NULL) + g_task_return_error (task, error); + else + g_task_return_int (task, G_TLS_INTERACTION_HANDLED); +} + +static void +g_tls_console_interaction_ask_password_async (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (interaction, cancellable, callback, user_data); + g_task_set_task_data (task, g_object_ref (password), g_object_unref); + g_task_run_in_thread (task, ask_password_with_getpass); + g_object_unref (task); +} + +static GTlsInteractionResult +g_tls_console_interaction_ask_password_finish (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + GTlsInteractionResult ret; + + g_return_val_if_fail (g_task_is_valid (result, interaction), + G_TLS_INTERACTION_FAILED); + + ret = g_task_propagate_int (G_TASK (result), error); + if (ret == (GTlsInteractionResult)-1) + return G_TLS_INTERACTION_FAILED; + else + return ret; +} + +static void +g_tls_console_interaction_init (GTlsConsoleInteraction *interaction) +{ + +} + +static void +g_tls_console_interaction_class_init (GTlsConsoleInteractionClass *klass) +{ + GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); + interaction_class->ask_password = g_tls_console_interaction_ask_password; + interaction_class->ask_password_async = g_tls_console_interaction_ask_password_async; + interaction_class->ask_password_finish = g_tls_console_interaction_ask_password_finish; +} + +GTlsInteraction * +g_tls_console_interaction_new (void) +{ + return g_object_new (G_TYPE_TLS_CONSOLE_INTERACTION, NULL); +} diff --git a/gio/tests/gtlsconsoleinteraction.h b/gio/tests/gtlsconsoleinteraction.h new file mode 100644 index 0000000..eaf4d18 --- /dev/null +++ b/gio/tests/gtlsconsoleinteraction.h @@ -0,0 +1,56 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2011 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#ifndef __G_TLS_CONSOLE_INTERACTION_H__ +#define __G_TLS_CONSOLE_INTERACTION_H__ + +#include + +G_BEGIN_DECLS + +#define G_TYPE_TLS_CONSOLE_INTERACTION (g_tls_console_interaction_get_type ()) +#define G_TLS_CONSOLE_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_TLS_CONSOLE_INTERACTION, GTlsConsoleInteraction)) +#define G_TLS_CONSOLE_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_TLS_CONSOLE_INTERACTION, GTlsConsoleInteractionClass)) +#define G_IS_TLS_CONSOLE_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_TLS_CONSOLE_INTERACTION)) +#define G_IS_TLS_CONSOLE_INTERACTION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_TLS_CONSOLE_INTERACTION)) +#define G_TLS_CONSOLE_INTERACTION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_TLS_CONSOLE_INTERACTION, GTlsConsoleInteractionClass)) + +typedef struct _GTlsConsoleInteraction GTlsConsoleInteraction; +typedef struct _GTlsConsoleInteractionClass GTlsConsoleInteractionClass; + +struct _GTlsConsoleInteraction +{ + GTlsInteraction parent_instance; +}; + +struct _GTlsConsoleInteractionClass +{ + GTlsInteractionClass parent_class; +}; + +GType g_tls_console_interaction_get_type (void) G_GNUC_CONST; + +GTlsInteraction * g_tls_console_interaction_new (void); + +G_END_DECLS + +#endif /* __G_TLS_CONSOLE_INTERACTION_H__ */ diff --git a/gio/tests/httpd.c b/gio/tests/httpd.c new file mode 100644 index 0000000..41bc6c8 --- /dev/null +++ b/gio/tests/httpd.c @@ -0,0 +1,181 @@ +#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; + } + version = version; /* To avoid -Wunused-but-set-variable */ + + 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; + + 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/inet-address.c b/gio/tests/inet-address.c new file mode 100644 index 0000000..0e82b06 --- /dev/null +++ b/gio/tests/inet-address.c @@ -0,0 +1,402 @@ +/* Unit tests for GInetAddress + * Copyright (C) 2012 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 + +static void +test_parse (void) +{ + GInetAddress *addr; + + addr = g_inet_address_new_from_string ("0:0:0:0:0:0:0:0"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("1:0:0:0:0:0:0:8"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("0:0:0:0:0:FFFF:204.152.189.116"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("::1"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("::"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("::FFFF:204.152.189.116"); + g_assert (addr != NULL); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("204.152.189.116"); + g_assert (addr != NULL); + g_object_unref (addr); + + addr = g_inet_address_new_from_string ("::1::2"); + g_assert (addr == NULL); + addr = g_inet_address_new_from_string ("0:1:2:3:4:5:6:7:8:9"); + g_assert (addr == NULL); + addr = g_inet_address_new_from_string ("::FFFFFFF"); + g_assert (addr == NULL); +} + +static void +test_any (void) +{ + GInetAddress *addr; + GSocketFamily family[2] = { G_SOCKET_FAMILY_IPV4, G_SOCKET_FAMILY_IPV6 }; + gsize size[2] = { 4, 16 }; + gint i; + + for (i = 0; i < 2; i++) + { + addr = g_inet_address_new_any (family[i]); + + g_assert (g_inet_address_get_is_any (addr)); + g_assert (g_inet_address_get_family (addr) == family[i]); + g_assert (g_inet_address_get_native_size (addr) == size[i]); + g_assert (!g_inet_address_get_is_loopback (addr)); + g_assert (!g_inet_address_get_is_link_local (addr)); + g_assert (!g_inet_address_get_is_site_local (addr)); + g_assert (!g_inet_address_get_is_multicast (addr)); + g_assert (!g_inet_address_get_is_mc_global (addr)); + g_assert (!g_inet_address_get_is_mc_link_local (addr)); + g_assert (!g_inet_address_get_is_mc_node_local (addr)); + g_assert (!g_inet_address_get_is_mc_org_local (addr)); + g_assert (!g_inet_address_get_is_mc_site_local (addr)); + + g_object_unref (addr); + } +} + +static void +test_loopback (void) +{ + GInetAddress *addr; + + addr = g_inet_address_new_from_string ("::1"); + g_assert (g_inet_address_get_family (addr) == G_SOCKET_FAMILY_IPV6); + g_assert (g_inet_address_get_is_loopback (addr)); + g_object_unref (addr); + + addr = g_inet_address_new_from_string ("127.0.0.0"); + g_assert (g_inet_address_get_family (addr) == G_SOCKET_FAMILY_IPV4); + g_assert (g_inet_address_get_is_loopback (addr)); + g_object_unref (addr); +} + +static void +test_bytes (void) +{ + GInetAddress *addr1, *addr2, *addr3; + const guint8 *bytes; + + addr1 = g_inet_address_new_from_string ("192.168.0.100"); + addr2 = g_inet_address_new_from_string ("192.168.0.101"); + bytes = g_inet_address_to_bytes (addr1); + addr3 = g_inet_address_new_from_bytes (bytes, G_SOCKET_FAMILY_IPV4); + + g_assert (!g_inet_address_equal (addr1, addr2)); + g_assert (g_inet_address_equal (addr1, addr3)); + + g_object_unref (addr1); + g_object_unref (addr2); + g_object_unref (addr3); +} + +static void +test_property (void) +{ + GInetAddress *addr; + GSocketFamily family; + const guint8 *bytes; + gboolean any; + gboolean loopback; + gboolean link_local; + gboolean site_local; + gboolean multicast; + gboolean mc_global; + gboolean mc_link_local; + gboolean mc_node_local; + gboolean mc_org_local; + gboolean mc_site_local; + + addr = g_inet_address_new_from_string ("ff85::"); + g_object_get (addr, + "family", &family, + "bytes", &bytes, + "is-any", &any, + "is-loopback", &loopback, + "is-link-local", &link_local, + "is-site-local", &site_local, + "is-multicast", &multicast, + "is-mc-global", &mc_global, + "is-mc-link-local", &mc_link_local, + "is-mc-node-local", &mc_node_local, + "is-mc-org-local", &mc_org_local, + "is-mc-site-local", &mc_site_local, + NULL); + + g_assert (family == G_SOCKET_FAMILY_IPV6); + g_assert (!any); + g_assert (!loopback); + g_assert (!link_local); + g_assert (!site_local); + g_assert (multicast); + g_assert (!mc_global); + g_assert (!mc_link_local); + g_assert (!mc_node_local); + g_assert (!mc_org_local); + g_assert (mc_site_local); + + g_object_unref (addr); +} + +static void +test_socket_address (void) +{ + GInetAddress *addr; + GInetSocketAddress *saddr; + guint port; + guint32 flowinfo; + guint32 scope_id; + GSocketFamily family; + + addr = g_inet_address_new_from_string ("::ffff:125.1.15.5"); + saddr = G_INET_SOCKET_ADDRESS (g_inet_socket_address_new (addr, 308)); + + g_assert (g_inet_address_equal (addr, g_inet_socket_address_get_address (saddr))); + g_object_unref (addr); + + g_assert (g_inet_socket_address_get_port (saddr) == 308); + g_assert (g_inet_socket_address_get_flowinfo (saddr) == 0); + g_assert (g_inet_socket_address_get_scope_id (saddr) == 0); + + g_object_unref (saddr); + + addr = g_inet_address_new_from_string ("::1"); + saddr = G_INET_SOCKET_ADDRESS (g_object_new (G_TYPE_INET_SOCKET_ADDRESS, + "address", addr, + "port", 308, + "flowinfo", 10, + "scope-id", 25, + NULL)); + g_object_unref (addr); + + g_assert (g_inet_socket_address_get_port (saddr) == 308); + g_assert (g_inet_socket_address_get_flowinfo (saddr) == 10); + g_assert (g_inet_socket_address_get_scope_id (saddr) == 25); + + g_object_get (saddr, + "family", &family, + "address", &addr, + "port", &port, + "flowinfo", &flowinfo, + "scope-id", &scope_id, + NULL); + + g_assert (family == G_SOCKET_FAMILY_IPV6); + g_assert (addr != NULL); + g_assert (port == 308); + g_assert (flowinfo == 10); + g_assert (scope_id == 25); + + g_object_unref (addr); + g_object_unref (saddr); +} + +static void +test_scope_id (void) +{ + GSocketConnectable *addr; + GSocketAddressEnumerator *addr_enum; + GSocketAddress *saddr; + GInetSocketAddress *isaddr; + GInetAddress *iaddr; + char *tostring; + GError *error = NULL; + + addr = g_network_address_new ("fe80::42%1", 99); + addr_enum = g_socket_connectable_enumerate (addr); + saddr = g_socket_address_enumerator_next (addr_enum, NULL, &error); + g_assert_no_error (error); + + g_assert (saddr != NULL); + g_assert (G_IS_INET_SOCKET_ADDRESS (saddr)); + + isaddr = G_INET_SOCKET_ADDRESS (saddr); + g_assert_cmpint (g_inet_socket_address_get_scope_id (isaddr), ==, 1); + g_assert_cmpint (g_inet_socket_address_get_port (isaddr), ==, 99); + + iaddr = g_inet_socket_address_get_address (isaddr); + tostring = g_inet_address_to_string (iaddr); + g_assert_cmpstr (tostring, ==, "fe80::42"); + g_free (tostring); + + g_object_unref (saddr); + saddr = g_socket_address_enumerator_next (addr_enum, NULL, &error); + g_assert_no_error (error); + g_assert (saddr == NULL); + + g_object_unref (addr_enum); + g_object_unref (addr); +} + +static void +test_mask_parse (void) +{ + GInetAddressMask *mask; + GError *error = NULL; + + mask = g_inet_address_mask_new_from_string ("10.0.0.0/8", &error); + g_assert_no_error (error); + g_assert (mask != NULL); + g_object_unref (mask); + + mask = g_inet_address_mask_new_from_string ("fe80::/10", &error); + g_assert_no_error (error); + g_assert (mask != NULL); + g_object_unref (mask); + + mask = g_inet_address_mask_new_from_string ("::", &error); + g_assert_no_error (error); + g_assert (mask != NULL); + g_object_unref (mask); + + mask = g_inet_address_mask_new_from_string ("::/abc", &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert (mask == NULL); + g_clear_error (&error); + + mask = g_inet_address_mask_new_from_string ("127.0.0.1/128", &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert (mask == NULL); + g_clear_error (&error); +} + +static void +test_mask_property (void) +{ + GInetAddressMask *mask; + GInetAddress *addr; + GSocketFamily family; + guint len; + + addr = g_inet_address_new_from_string ("fe80::"); + mask = g_inet_address_mask_new_from_string ("fe80::/10", NULL); + g_assert (g_inet_address_mask_get_family (mask) == G_SOCKET_FAMILY_IPV6); + g_assert (g_inet_address_equal (addr, g_inet_address_mask_get_address (mask))); + g_assert (g_inet_address_mask_get_length (mask) == 10); + g_object_unref (addr); + + g_object_get (mask, + "family", &family, + "address", &addr, + "length", &len, + NULL); + g_assert (family == G_SOCKET_FAMILY_IPV6); + g_assert (addr != NULL); + g_assert (len == 10); + g_object_unref (addr); + + g_object_unref (mask); +} + +static void +test_mask_equal (void) +{ + GInetAddressMask *mask; + GInetAddressMask *mask2; + gchar *str; + + mask = g_inet_address_mask_new_from_string ("fe80:0:0::/10", NULL); + str = g_inet_address_mask_to_string (mask); + g_assert_cmpstr (str, ==, "fe80::/10"); + mask2 = g_inet_address_mask_new_from_string (str, NULL); + g_assert (g_inet_address_mask_equal (mask, mask2)); + g_object_unref (mask2); + g_free (str); + + mask2 = g_inet_address_mask_new_from_string ("fe80::/12", NULL); + g_assert (!g_inet_address_mask_equal (mask, mask2)); + g_object_unref (mask2); + + mask2 = g_inet_address_mask_new_from_string ("ff80::/10", NULL); + g_assert (!g_inet_address_mask_equal (mask, mask2)); + g_object_unref (mask2); + + g_object_unref (mask); +} + +static void +test_mask_match (void) +{ + GInetAddressMask *mask; + GInetAddress *addr; + + mask = g_inet_address_mask_new_from_string ("1.2.0.0/16", NULL); + + addr = g_inet_address_new_from_string ("1.2.0.0"); + g_assert (g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("1.2.3.4"); + g_assert (g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("1.3.1.1"); + g_assert (!g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + + g_object_unref (mask); + + mask = g_inet_address_mask_new_from_string ("1.2.0.0/24", NULL); + + addr = g_inet_address_new_from_string ("1.2.0.0"); + g_assert (g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("1.2.3.4"); + g_assert (!g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + addr = g_inet_address_new_from_string ("1.2.0.24"); + g_assert (g_inet_address_mask_matches (mask, addr)); + g_object_unref (addr); + + g_object_unref (mask); + +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/inet-address/parse", test_parse); + g_test_add_func ("/inet-address/any", test_any); + g_test_add_func ("/inet-address/loopback", test_loopback); + g_test_add_func ("/inet-address/bytes", test_bytes); + g_test_add_func ("/inet-address/property", test_property); + g_test_add_func ("/socket-address/basic", test_socket_address); + g_test_add_func ("/socket-address/scope-id", test_scope_id); + g_test_add_func ("/address-mask/parse", test_mask_parse); + g_test_add_func ("/address-mask/property", test_mask_property); + g_test_add_func ("/address-mask/equal", test_mask_equal); + g_test_add_func ("/address-mask/match", test_mask_match); + + return g_test_run (); +} diff --git a/gio/tests/io-stream.c b/gio/tests/io-stream.c new file mode 100644 index 0000000..59b1c26 --- /dev/null +++ b/gio/tests/io-stream.c @@ -0,0 +1,185 @@ +/* GLib testing framework examples and tests + * Copyright (C) 2010 Collabora Ltd. + * Authors: Xavier Claessens + * + * 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 + +typedef struct +{ + GIOStream parent; + GInputStream *input_stream; + GOutputStream *output_stream; +} GTestIOStream; + +typedef struct +{ + GIOStreamClass parent_class; +} GTestIOStreamClass; + +static GType g_test_io_stream_get_type (void); +G_DEFINE_TYPE (GTestIOStream, g_test_io_stream, G_TYPE_IO_STREAM); + + +static GInputStream * +get_input_stream (GIOStream *io_stream) +{ + GTestIOStream *self = (GTestIOStream *) io_stream; + + return self->input_stream; +} + +static GOutputStream * +get_output_stream (GIOStream *io_stream) +{ + GTestIOStream *self = (GTestIOStream *) io_stream; + + return self->output_stream; +} + +static void +finalize (GObject *object) +{ + GTestIOStream *self = (GTestIOStream *) object; + + if (self->input_stream != NULL) + g_object_unref (self->input_stream); + + if (self->output_stream != NULL) + g_object_unref (self->output_stream); + + G_OBJECT_CLASS (g_test_io_stream_parent_class)->finalize (object); +} + +static void +g_test_io_stream_class_init (GTestIOStreamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GIOStreamClass *io_class = G_IO_STREAM_CLASS (klass); + + object_class->finalize = finalize; + + io_class->get_input_stream = get_input_stream; + io_class->get_output_stream = get_output_stream; +} + +static void +g_test_io_stream_init (GTestIOStream *self) +{ +} + +static GIOStream * +g_test_io_stream_new (GInputStream *input, GOutputStream *output) +{ + GTestIOStream *self; + + self = g_object_new (g_test_io_stream_get_type (), NULL); + self->input_stream = g_object_ref (input); + self->output_stream = g_object_ref (output); + + return G_IO_STREAM (self); +} + +typedef struct +{ + GMainLoop *main_loop; + const gchar *data1; + const gchar *data2; + GIOStream *iostream1; + GIOStream *iostream2; +} TestCopyChunksData; + +static void +test_copy_chunks_splice_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + TestCopyChunksData *data = user_data; + GMemoryOutputStream *ostream; + gchar *received_data; + GError *error = NULL; + + g_io_stream_splice_finish (res, &error); + g_assert_no_error (error); + + ostream = G_MEMORY_OUTPUT_STREAM (((GTestIOStream *) data->iostream1)->output_stream); + received_data = g_memory_output_stream_get_data (ostream); + g_assert_cmpstr (received_data, ==, data->data2); + + ostream = G_MEMORY_OUTPUT_STREAM (((GTestIOStream *) data->iostream2)->output_stream); + received_data = g_memory_output_stream_get_data (ostream); + g_assert_cmpstr (received_data, ==, data->data1); + + g_assert (g_io_stream_is_closed (data->iostream1)); + g_assert (g_io_stream_is_closed (data->iostream2)); + + g_main_loop_quit (data->main_loop); +} + +static void +test_copy_chunks (void) +{ + TestCopyChunksData data; + GInputStream *istream; + GOutputStream *ostream; + + data.main_loop = g_main_loop_new (NULL, FALSE); + data.data1 = "abcdefghijklmnopqrstuvwxyz"; + data.data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + istream = g_memory_input_stream_new_from_data (data.data1, -1, NULL); + ostream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + data.iostream1 = g_test_io_stream_new (istream, ostream); + g_object_unref (istream); + g_object_unref (ostream); + + istream = g_memory_input_stream_new_from_data (data.data2, -1, NULL); + ostream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free); + data.iostream2 = g_test_io_stream_new (istream, ostream); + g_object_unref (istream); + g_object_unref (ostream); + + g_io_stream_splice_async (data.iostream1, data.iostream2, + G_IO_STREAM_SPLICE_CLOSE_STREAM1 | G_IO_STREAM_SPLICE_CLOSE_STREAM2 | + G_IO_STREAM_SPLICE_WAIT_FOR_BOTH, G_PRIORITY_DEFAULT, + NULL, test_copy_chunks_splice_cb, &data); + + /* We do not hold a ref in data struct, this is to make sure the operation + * keeps the iostream objects alive until it finishes */ + g_object_unref (data.iostream1); + g_object_unref (data.iostream2); + + g_main_loop_run (data.main_loop); + g_main_loop_unref (data.main_loop); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/io-stream/copy-chunks", test_copy_chunks); + + return g_test_run(); +} diff --git a/gio/tests/key-cert.pem b/gio/tests/key-cert.pem new file mode 100644 index 0000000..5f3992f --- /dev/null +++ b/gio/tests/key-cert.pem @@ -0,0 +1,32 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCslrTl+gp3lQsEGMegjhQMow5yhinpQ7yji36soGuUpUynQPs7 +P5tm3ojZPeQGNmYof3Csc2yTrMLrCidt8xFkcgtZydOJ9sQSEgwc2of4nlvffIZb +dIR+13WOPVRmS5tBVkQWFrlSFtQ70BDhNK3SZfkAb4+QmLSR1MJFaUPWrQIDAQAB +AoGAUTnskYAIhRdEQ/1Vlp7HmNr05bl26C3VDjOMvroRZ7gUR3MxykS5YsTBK10R +gEsB8XVpFgCMzUO1yODShdCsEg9kCB3fzSWkunK8+TF2TKOM5uWlQwifKJvcNisR +Nbg3r8WygMMXaWSFA3xWoRuZ5It0jOX18v+x5RHHon/kaRECQQDl6FSwgJLeNAkR +pMNQGdRhmMesHWmNNBv3Wozqm6Wpkwo5ZXPsLt3pprd0GN5jX0IG7clT1/eMD9/G ++3UGqTj3AkEAwC0M2gv+QUhbaB+KSlOZDOi4gsnhnsnaM7HQGDJJ5no4y2EvnYI3 +Y5rPJWedeYlCV3ccMitjnjcIJHInRZBIewJBANgsamVDn9Ua7GQQni1U/COAek7V +oQfKNXmRROrbyxr1TSnGwQcU0kf+IIUjVQfu67CEKUeSzAqAapM4oULQHuUCQQC9 +J9qdiO6DXXAzRdA9pplgHnT2rzV3sSEoft3f4yfgRu8+KHPQqkpQrSE1pQ5YgWUe +aGwFabXNFkfab839562fAkBl8jPidQdKWEgSa6h5pm4++sXLdWl7p6jiyetH64W7 +HnhRryE3ptrRGO0hSV1v4bx3DKzeJiJRlWUWiSl7828t +-----END RSA PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIICtTCCAh4CCQCMmwFMUPAJYzANBgkqhkiG9w0BAQUFADCBnjELMAkGA1UEBhMC +Q0ExDzANBgNVBAgMBlF1ZWJlYzERMA8GA1UEBwwITW9udHJlYWwxFzAVBgNVBAoM +DkNvbGxhYm9yYSBMdGQuMQ8wDQYDVQQLDAZDYW5hZGExEjAQBgNVBAMMCTEyNy4w +LjAuMTEtMCsGCSqGSIb3DQEJARYebmljb2xhcy5kdWZyZXNuZUBjb2xsYWJvcmEu +Y29tMB4XDTExMDcyNTE4NDkzNFoXDTEyMDcyNDE4NDkzNFowgZ4xCzAJBgNVBAYT +AkNBMQ8wDQYDVQQIDAZRdWViZWMxETAPBgNVBAcMCE1vbnRyZWFsMRcwFQYDVQQK +DA5Db2xsYWJvcmEgTHRkLjEPMA0GA1UECwwGQ2FuYWRhMRIwEAYDVQQDDAkxMjcu +MC4wLjExLTArBgkqhkiG9w0BCQEWHm5pY29sYXMuZHVmcmVzbmVAY29sbGFib3Jh +LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArJa05foKd5ULBBjHoI4U +DKMOcoYp6UO8o4t+rKBrlKVMp0D7Oz+bZt6I2T3kBjZmKH9wrHNsk6zC6wonbfMR +ZHILWcnTifbEEhIMHNqH+J5b33yGW3SEftd1jj1UZkubQVZEFha5UhbUO9AQ4TSt +0mX5AG+PkJi0kdTCRWlD1q0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCaaBfCfCiw +BJ/2pzZOjoFQcMqwPWufJ+F7hv8AK0zaEhsYW/JPPNpVVjM4Rf9dhMFG513GQ6IR +q3K+okin/2H6XyLD1eyAxAreuyMZPwOsTdgkVROhl+NJEfZKnFZSxK9wkiQRnNhS ++5L8/na5o3vsgGerggQi8pj2JjfVE0R/aQ== +-----END CERTIFICATE----- diff --git a/gio/tests/key.pem b/gio/tests/key.pem new file mode 100644 index 0000000..b9c6e82 --- /dev/null +++ b/gio/tests/key.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCslrTl+gp3lQsEGMegjhQMow5yhinpQ7yji36soGuUpUynQPs7 +P5tm3ojZPeQGNmYof3Csc2yTrMLrCidt8xFkcgtZydOJ9sQSEgwc2of4nlvffIZb +dIR+13WOPVRmS5tBVkQWFrlSFtQ70BDhNK3SZfkAb4+QmLSR1MJFaUPWrQIDAQAB +AoGAUTnskYAIhRdEQ/1Vlp7HmNr05bl26C3VDjOMvroRZ7gUR3MxykS5YsTBK10R +gEsB8XVpFgCMzUO1yODShdCsEg9kCB3fzSWkunK8+TF2TKOM5uWlQwifKJvcNisR +Nbg3r8WygMMXaWSFA3xWoRuZ5It0jOX18v+x5RHHon/kaRECQQDl6FSwgJLeNAkR +pMNQGdRhmMesHWmNNBv3Wozqm6Wpkwo5ZXPsLt3pprd0GN5jX0IG7clT1/eMD9/G ++3UGqTj3AkEAwC0M2gv+QUhbaB+KSlOZDOi4gsnhnsnaM7HQGDJJ5no4y2EvnYI3 +Y5rPJWedeYlCV3ccMitjnjcIJHInRZBIewJBANgsamVDn9Ua7GQQni1U/COAek7V +oQfKNXmRROrbyxr1TSnGwQcU0kf+IIUjVQfu67CEKUeSzAqAapM4oULQHuUCQQC9 +J9qdiO6DXXAzRdA9pplgHnT2rzV3sSEoft3f4yfgRu8+KHPQqkpQrSE1pQ5YgWUe +aGwFabXNFkfab839562fAkBl8jPidQdKWEgSa6h5pm4++sXLdWl7p6jiyetH64W7 +HnhRryE3ptrRGO0hSV1v4bx3DKzeJiJRlWUWiSl7828t +-----END RSA PRIVATE KEY----- diff --git a/gio/tests/key8.pem b/gio/tests/key8.pem new file mode 100644 index 0000000..e607f16 --- /dev/null +++ b/gio/tests/key8.pem @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKyWtOX6CneVCwQY +x6COFAyjDnKGKelDvKOLfqyga5SlTKdA+zs/m2beiNk95AY2Zih/cKxzbJOswusK +J23zEWRyC1nJ04n2xBISDBzah/ieW998hlt0hH7XdY49VGZLm0FWRBYWuVIW1DvQ +EOE0rdJl+QBvj5CYtJHUwkVpQ9atAgMBAAECgYBROeyRgAiFF0RD/VWWnseY2vTl +uXboLdUOM4y+uhFnuBRHczHKRLlixMErXRGASwHxdWkWAIzNQ7XI4NKF0KwSD2QI +Hd/NJaS6crz5MXZMo4zm5aVDCJ8om9w2KxE1uDevxbKAwxdpZIUDfFahG5nki3SM +5fXy/7HlEceif+RpEQJBAOXoVLCAkt40CRGkw1AZ1GGYx6wdaY00G/dajOqbpamT +Cjllc+wu3emmt3QY3mNfQgbtyVPX94wP38b7dQapOPcCQQDALQzaC/5BSFtoH4pK +U5kM6LiCyeGeydozsdAYMknmejjLYS+dgjdjms8lZ515iUJXdxwyK2OeNwgkcidF +kEh7AkEA2CxqZUOf1RrsZBCeLVT8I4B6TtWhB8o1eZFE6tvLGvVNKcbBBxTSR/4g +hSNVB+7rsIQpR5LMCoBqkzihQtAe5QJBAL0n2p2I7oNdcDNF0D2mmWAedPavNXex +ISh+3d/jJ+BG7z4oc9CqSlCtITWlDliBZR5obAVptc0WR9pvzf3nrZ8CQGXyM+J1 +B0pYSBJrqHmmbj76xct1aXunqOLJ60frhbseeFGvITem2tEY7SFJXW/hvHcMrN4m +IlGVZRaJKXvzby0= +-----END PRIVATE KEY----- diff --git a/gio/tests/live-g-file.c b/gio/tests/live-g-file.c new file mode 100644 index 0000000..a9a9c03 --- /dev/null +++ b/gio/tests/live-g-file.c @@ -0,0 +1,1335 @@ +/* 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; + 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; + 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); + g_object_unref (info); + } + + /* 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); + g_object_unref (info); + + 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); + + g_assert (g_file_enumerator_get_container (enumerator) == parent); + + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + while ((info) && (!error)) + { + descend = g_file_enumerator_get_child (enumerator, 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; + g_object_unref (info); + g_free (relative_path); + + 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); + g_assert (g_file_enumerator_is_closed (enumerator)); + + g_object_unref (enumerator); +} + +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 (enumerator); + } + 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); + 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 (os); + } + 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 (input_stream); + } + 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; + gchar *path; + + 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 */ + + path = g_file_get_path (child); + log (" Deleting %s, path = %s\n", item.filename, path); + g_free (path); + + 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 +test_make_directory_with_parents (gconstpointer test_data) +{ + GFile *root, *child, *grandchild, *greatgrandchild; + gboolean res; + GError *error = NULL; + + 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); + + child = g_file_get_child (root, "a"); + grandchild = g_file_get_child (child, "b"); + greatgrandchild = g_file_get_child (grandchild, "c"); + + /* Check that we can successfully make directory hierarchies of + * depth 1, 2, or 3 + */ + res = g_file_make_directory_with_parents (child, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + res = g_file_query_exists (child, NULL); + g_assert_cmpint (res, ==, TRUE); + + g_file_delete (child, NULL, NULL); + + res = g_file_make_directory_with_parents (grandchild, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + res = g_file_query_exists (grandchild, NULL); + g_assert_cmpint (res, ==, TRUE); + + g_file_delete (grandchild, NULL, NULL); + g_file_delete (child, NULL, NULL); + + res = g_file_make_directory_with_parents (greatgrandchild, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + res = g_file_query_exists (greatgrandchild, NULL); + g_assert_cmpint (res, ==, TRUE); + + g_file_delete (greatgrandchild, NULL, NULL); + g_file_delete (grandchild, NULL, NULL); + g_file_delete (child, NULL, NULL); + + /* Now test failure by trying to create a directory hierarchy + * where a ancestor exists but is read-only + */ + + /* No obvious way to do this on Windows */ + if (!posix_compat) + goto out; + +#ifndef G_PLATFORM_WIN32 + if (getuid() == 0) /* permissions are ignored for root */ + goto out; +#endif + + g_file_make_directory (child, NULL, NULL); + g_assert_cmpint (res, ==, TRUE); + + res = g_file_set_attribute_uint32 (child, + G_FILE_ATTRIBUTE_UNIX_MODE, + S_IRUSR + S_IXUSR, /* -r-x------ */ + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, NULL); + g_assert_cmpint (res, ==, TRUE); + + res = g_file_make_directory_with_parents (grandchild, NULL, &error); + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED); + g_clear_error (&error); + + res = g_file_make_directory_with_parents (greatgrandchild, NULL, &error); + g_assert_cmpint (res, ==, FALSE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED); + g_clear_error (&error); + +out: + g_object_unref (greatgrandchild); + g_object_unref (grandchild); + 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); + + enumerator = + g_file_enumerate_children (parent, "*", + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, + NULL); + if (! enumerator) + return; + + error = NULL; + info = g_file_enumerator_next_file (enumerator, NULL, &error); + while ((info) && (!error)) + { + descend = g_file_enumerator_get_child (enumerator, info); + g_assert (descend != NULL); + relative_path = g_file_get_relative_path (root, descend); + g_assert (relative_path != NULL); + g_free (relative_path); + + 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; + g_object_unref (info); + + 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); + + g_object_unref (enumerator); +} + +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_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 (); + } + + g_option_context_free (context); + + /* 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); + + /* Write test - make_directory_with_parents */ + if (write_test && (!only_create_struct)) + g_test_add_data_func ("/live-g-file/test_make_directory_with_parents", target_path, + test_make_directory_with_parents); + + 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/live-g-file.txt b/gio/tests/live-g-file.txt new file mode 100644 index 0000000..95da0e0 --- /dev/null +++ b/gio/tests/live-g-file.txt @@ -0,0 +1,27 @@ +Before you start testing it would be good to explain how it works. + +The script works in three modes: + 1. read-only (no special arguments) - suitable for read-only backends. Just + create the sample structure using the second mode, pack it (tar -p is + preffered to preserve unix modes) and put it on a reachable place. + 2. create-structure - only creates reference structure for later testing + in read-only mode + 3. write mode - full test suite, creates testing structure and performs all + read and write tests. Please note the delete/move tests are included + in this mode and target directory structure is unusable after the script + is finished. + + +To see the list of available parameters just run 'live-g-file --help' + + +Notes: + - it's advised to clean target directory first, otherwise some tests might fail + (i.e. the tests creating testing structure) + + +Tested: + - local filesystem (/tmp/...) + - file:// uri (file:///tmp/...) + - locatest:// gvfs backend (localtest:///tmp/...) + - FAT16 filesystem (no POSIX extensions) diff --git a/gio/tests/memory-input-stream.c b/gio/tests/memory-input-stream.c new file mode 100644 index 0000000..48fa3c7 --- /dev/null +++ b/gio/tests/memory-input-stream.c @@ -0,0 +1,279 @@ +/* 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); + } + + g_object_unref (stream); +} + +GMainLoop *loop; + +static void +async_read_chunk (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gsize *bytes_read = user_data; + GError *error = NULL; + + *bytes_read = g_input_stream_read_finish (G_INPUT_STREAM (object), + result, &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static void +async_skipped_chunk (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gsize *bytes_skipped = user_data; + GError *error = NULL; + + *bytes_skipped = g_input_stream_skip_finish (G_INPUT_STREAM (object), + result, &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static void +test_async (void) +{ + const char *data1 = "abcdefghijklmnopqrstuvwxyz"; + const char *data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const char *result = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char buffer[128]; + gsize bytes_read, bytes_skipped; + gsize pos, len, chunk_size; + GError *error = NULL; + GInputStream *stream; + gboolean res; + + loop = g_main_loop_new (NULL, FALSE); + + 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) + { + g_input_stream_read_async (stream, buffer, chunk_size, + G_PRIORITY_DEFAULT, NULL, + async_read_chunk, &bytes_read); + g_main_loop_run (loop); + + 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); + + pos = 0; + while (pos + chunk_size + 1 < len) + { + g_input_stream_skip_async (stream, chunk_size, + G_PRIORITY_DEFAULT, NULL, + async_skipped_chunk, &bytes_skipped); + g_main_loop_run (loop); + + g_assert_cmpint (bytes_skipped, ==, MIN (chunk_size, len - pos)); + + pos += bytes_skipped; + } + + g_input_stream_read_async (stream, buffer, len - pos, + G_PRIORITY_DEFAULT, NULL, + async_read_chunk, &bytes_read); + g_main_loop_run (loop); + + g_assert_cmpint (bytes_read, ==, len - pos); + g_assert (strncmp (buffer, result + pos, bytes_read) == 0); + + res = g_seekable_seek (G_SEEKABLE (stream), 0, G_SEEK_SET, NULL, &error); + g_assert_cmpint (res, ==, TRUE); + g_assert_no_error (error); + } + + g_object_unref (stream); + g_main_loop_unref (loop); +} + +static void +test_seek (void) +{ + const char *data1 = "abcdefghijklmnopqrstuvwxyz"; + const char *data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + GInputStream *stream; + GError *error; + char buffer[10]; + + 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); + + g_assert (G_IS_SEEKABLE (stream)); + g_assert (g_seekable_can_seek (G_SEEKABLE (stream))); + + error = NULL; + g_assert (g_seekable_seek (G_SEEKABLE (stream), 26, G_SEEK_SET, NULL, &error)); + g_assert_no_error (error); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (stream)), ==, 26); + + g_assert (g_input_stream_read (stream, buffer, 1, NULL, &error) == 1); + g_assert_no_error (error); + + g_assert (buffer[0] == 'A'); + + g_assert (!g_seekable_seek (G_SEEKABLE (stream), 26, G_SEEK_CUR, NULL, &error)); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + + g_object_unref (stream); +} + +static void +test_truncate (void) +{ + const char *data1 = "abcdefghijklmnopqrstuvwxyz"; + const char *data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + GInputStream *stream; + GError *error; + + 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); + + g_assert (G_IS_SEEKABLE (stream)); + g_assert (!g_seekable_can_truncate (G_SEEKABLE (stream))); + + error = NULL; + g_assert (!g_seekable_truncate (G_SEEKABLE (stream), 26, NULL, &error)); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_error_free (error); + + g_object_unref (stream); +} + +static void +test_read_bytes (void) +{ + const char *data1 = "abcdefghijklmnopqrstuvwxyz"; + const char *data2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + GInputStream *stream; + GError *error = NULL; + GBytes *bytes; + gsize size; + gconstpointer data; + + 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); + + bytes = g_input_stream_read_bytes (stream, 26, NULL, &error); + g_assert_no_error (error); + + data = g_bytes_get_data (bytes, &size); + g_assert_cmpint (size, ==, 26); + g_assert (strncmp (data, data1, 26) == 0); + + g_bytes_unref (bytes); + g_object_unref (stream); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/memory-input-stream/read-chunks", test_read_chunks); + g_test_add_func ("/memory-input-stream/async", test_async); + g_test_add_func ("/memory-input-stream/seek", test_seek); + g_test_add_func ("/memory-input-stream/truncate", test_truncate); + g_test_add_func ("/memory-input-stream/read-bytes", test_read_bytes); + + 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..3399bbe --- /dev/null +++ b/gio/tests/memory-output-stream.c @@ -0,0 +1,230 @@ +/* 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_resizable (); + g_assert (g_seekable_can_truncate (G_SEEKABLE (mo))); + 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_seek (void) +{ + GOutputStream *mo; + GError *error; + + mo = g_memory_output_stream_new (g_new (gchar, 100), 100, g_realloc, g_free); + + g_assert (G_IS_SEEKABLE (mo)); + g_assert (g_seekable_can_seek (G_SEEKABLE (mo))); + + error = NULL; + g_assert (g_seekable_seek (G_SEEKABLE (mo), 26, G_SEEK_SET, NULL, &error)); + g_assert_no_error (error); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (mo)), ==, 26); + + g_assert (!g_seekable_seek (G_SEEKABLE (mo), 200, G_SEEK_CUR, NULL, &error)); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_error_free (error); + + 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_resizable (); + 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_assert_cmpint (g_memory_output_stream_get_size (G_MEMORY_OUTPUT_STREAM (mo)), ==, 16); + + g_object_unref (o); + g_object_unref (mo); +} + +static void +test_properties (void) +{ + GOutputStream *mo; + GDataOutputStream *o; + int i; + GError *error = NULL; + gsize data_size_fun; + gsize data_size_prop; + gpointer data_fun; + gpointer data_prop; + + 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); + } + + data_size_fun = g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (mo)); + g_object_get (mo, "data-size", &data_size_prop, NULL); + g_assert_cmpint (data_size_fun, ==, data_size_prop); + + data_fun = g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (mo)); + g_object_get (mo, "data", &data_prop, NULL); + g_assert_cmphex (GPOINTER_TO_SIZE (data_fun), ==, GPOINTER_TO_SIZE (data_prop)); + + g_object_unref (o); + g_object_unref (mo); +} + +static void +test_write_bytes (void) +{ + GOutputStream *mo; + GBytes *bytes, *bytes2; + GError *error = NULL; + + mo = (GOutputStream*) g_object_new (G_TYPE_MEMORY_OUTPUT_STREAM, + "realloc-function", g_realloc, + "destroy-function", g_free, + NULL); + bytes = g_bytes_new_static ("hello world!", strlen ("hello world!") + 1); + g_output_stream_write_bytes (mo, bytes, NULL, &error); + g_assert_no_error (error); + + g_output_stream_close (mo, NULL, &error); + g_assert_no_error (error); + + bytes2 = g_memory_output_stream_steal_as_bytes (G_MEMORY_OUTPUT_STREAM (mo)); + g_object_unref (mo); + g_assert (g_bytes_equal (bytes, bytes2)); + + g_bytes_unref (bytes); + g_bytes_unref (bytes2); +} + +static void +test_steal_as_bytes (void) +{ + GOutputStream *mo; + GDataOutputStream *o; + GError *error = NULL; + GBytes *bytes; + gsize size; + + 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); + + g_data_output_stream_put_string (o, "hello ", NULL, &error); + g_assert_no_error (error); + + g_data_output_stream_put_string (o, "world!", NULL, &error); + g_assert_no_error (error); + + g_data_output_stream_put_byte (o, '\0', NULL, &error); + g_assert_no_error (error); + + g_output_stream_close ((GOutputStream*) o, NULL, &error); + g_assert_no_error (error); + + bytes = g_memory_output_stream_steal_as_bytes ((GMemoryOutputStream*)mo); + g_object_unref (mo); + + g_assert_cmpint (g_bytes_get_size (bytes), ==, strlen ("hello world!") + 1); + g_assert_cmpstr (g_bytes_get_data (bytes, &size), ==, "hello world!"); + + g_bytes_unref (bytes); + g_object_unref (o); +} + +int +main (int argc, + char *argv[]) +{ + 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/seek", test_seek); + g_test_add_func ("/memory-output-stream/get-data-size", test_data_size); + g_test_add_func ("/memory-output-stream/properties", test_properties); + g_test_add_func ("/memory-output-stream/write-bytes", test_write_bytes); + g_test_add_func ("/memory-output-stream/steal_as_bytes", test_steal_as_bytes); + + return g_test_run(); +} diff --git a/gio/tests/mimeapps.c b/gio/tests/mimeapps.c new file mode 100644 index 0000000..9bc22ba --- /dev/null +++ b/gio/tests/mimeapps.c @@ -0,0 +1,594 @@ +#include +#include +#include + +static gboolean +strv_equal (gchar **strv, ...) +{ + gint count; + va_list list; + const gchar *str; + gboolean res; + + res = TRUE; + count = 0; + va_start (list, strv); + while (1) + { + str = va_arg (list, const gchar *); + if (str == NULL) + break; + if (g_strcmp0 (str, strv[count]) != 0) + { + res = FALSE; + break; + } + count++; + } + va_end (list); + + if (res) + res = g_strv_length (strv) == count; + + return res; +} + +const gchar *myapp_data = + "[Desktop Entry]\n" + "Encoding=UTF-8\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=my_app %f\n" + "Name=my app\n"; + +const gchar *myapp2_data = + "[Desktop Entry]\n" + "Encoding=UTF-8\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=my_app2 %f\n" + "Name=my app 2\n"; + +const gchar *myapp3_data = + "[Desktop Entry]\n" + "Encoding=UTF-8\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=my_app3 %f\n" + "Name=my app 3\n"; + +const gchar *myapp4_data = + "[Desktop Entry]\n" + "Encoding=UTF-8\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=my_app4 %f\n" + "Name=my app 4\n" + "MimeType=image/bmp;"; + +const gchar *myapp5_data = + "[Desktop Entry]\n" + "Encoding=UTF-8\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=my_app5 %f\n" + "Name=my app 5\n" + "MimeType=image/bmp;x-scheme-handler/ftp;"; + +const gchar *defaults_data = + "[Default Applications]\n" + "image/bmp=myapp4.desktop;\n" + "image/png=myapp3.desktop;\n" + "x-scheme-handler/ftp=myapp5.desktop;\n"; + +const gchar *mimecache_data = + "[MIME Cache]\n" + "image/bmp=myapp4.desktop;myapp5.desktop;\n"; + +/* Set up XDG_DATA_HOME and XDG_DATA_DIRS. + * XDG_DATA_DIRS/applications will contain defaults.list + * XDG_DATA_HOME/applications will contain myapp.desktop + * and myapp2.desktop, and no mimeapps.list + */ +static void +setup (void) +{ + gchar *dir; + gchar *xdgdatahome; + gchar *xdgdatadir; + gchar *appdir; + gchar *apphome; + gchar *mimeapps; + gchar *name; + gboolean res; + GError *error = NULL; + + dir = g_get_current_dir (); + xdgdatahome = g_build_filename (dir, "xdgdatahome", NULL); + xdgdatadir = g_build_filename (dir, "xdgdatadir", NULL); + g_test_message ("setting XDG_DATA_HOME to '%s'\n", xdgdatahome); + g_setenv ("XDG_DATA_HOME", xdgdatahome, TRUE); + g_test_message ("setting XDG_DATA_DIRS to '%s'\n", xdgdatadir); + g_setenv ("XDG_DATA_DIRS", xdgdatadir, TRUE); + + appdir = g_build_filename (xdgdatadir, "applications", NULL); + g_test_message ("creating '%s'\n", appdir); + res = g_mkdir_with_parents (appdir, 0700); + g_assert (res == 0); + + name = g_build_filename (appdir, "defaults.list", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, defaults_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + apphome = g_build_filename (xdgdatahome, "applications", NULL); + g_test_message ("creating '%s'\n", apphome); + res = g_mkdir_with_parents (apphome, 0700); + g_assert (res == 0); + + name = g_build_filename (apphome, "myapp.desktop", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, myapp_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + name = g_build_filename (apphome, "myapp2.desktop", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, myapp2_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + name = g_build_filename (apphome, "myapp3.desktop", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, myapp3_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + name = g_build_filename (apphome, "myapp4.desktop", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, myapp4_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + name = g_build_filename (apphome, "myapp5.desktop", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, myapp5_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + mimeapps = g_build_filename (apphome, "mimeapps.list", NULL); + g_test_message ("removing '%s'\n", mimeapps); + g_remove (mimeapps); + + name = g_build_filename (apphome, "mimeinfo.cache", NULL); + g_test_message ("creating '%s'\n", name); + g_file_set_contents (name, mimecache_data, -1, &error); + g_assert_no_error (error); + g_free (name); + + g_free (dir); + g_free (xdgdatahome); + g_free (xdgdatadir); + g_free (apphome); + g_free (appdir); + g_free (mimeapps); +} + +static void +test_mime_api (void) +{ + GAppInfo *appinfo; + GAppInfo *appinfo2; + GError *error = NULL; + GAppInfo *def; + GList *list; + const gchar *contenttype = "application/pdf"; + + /* clear things out */ + g_app_info_reset_type_associations (contenttype); + + appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop"); + appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop"); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (def == NULL); + g_assert (list == NULL); + + /* 1. add a non-default association */ + g_app_info_add_supports_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo)); + g_assert_cmpint (g_list_length (list), ==, 1); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 2. add another non-default association */ + g_app_info_add_supports_type (appinfo2, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 3. make the first app the default */ + g_app_info_set_as_default_for_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 4. make the second app the last used one */ + g_app_info_set_as_last_used_for_type (appinfo2, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo2)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 5. reset everything */ + g_app_info_reset_type_associations (contenttype); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (def == NULL); + g_assert (list == NULL); + + g_object_unref (appinfo); + g_object_unref (appinfo2); +} + +/* Repeat the same tests, this time checking that we handle + * mimeapps.list as expected. These tests are different from + * the ones in test_mime_api() in that we directly parse + * mimeapps.list to verify the results. + */ +static void +test_mime_file (void) +{ + gchar **assoc; + GAppInfo *appinfo; + GAppInfo *appinfo2; + GError *error = NULL; + GKeyFile *keyfile; + gchar *str; + gboolean res; + GAppInfo *def; + GList *list; + gchar *mimeapps; + gchar *dir; + const gchar *contenttype = "application/pdf"; + + dir = g_get_current_dir (); + mimeapps = g_build_filename (dir, "xdgdatahome", "applications", "mimeapps.list", NULL); + + /* clear things out */ + g_app_info_reset_type_associations (contenttype); + + appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop"); + appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop"); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (def == NULL); + g_assert (list == NULL); + + /* 1. add a non-default association */ + g_app_info_add_supports_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + keyfile = g_key_file_new (); + g_key_file_load_from_file (keyfile, mimeapps, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error); + g_assert_no_error (error); + g_assert (strv_equal (assoc, "myapp.desktop", NULL)); + g_strfreev (assoc); + + /* we've unset XDG_DATA_DIRS so there should be no default */ + assoc = g_key_file_get_string_list (keyfile, "Default Applications", contenttype, NULL, &error); + g_assert (error != NULL); + g_clear_error (&error); + + g_key_file_free (keyfile); + + /* 2. add another non-default association */ + g_app_info_add_supports_type (appinfo2, contenttype, &error); + g_assert_no_error (error); + + keyfile = g_key_file_new (); + g_key_file_load_from_file (keyfile, mimeapps, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error); + g_assert_no_error (error); + g_assert (strv_equal (assoc, "myapp.desktop", "myapp2.desktop", NULL)); + g_strfreev (assoc); + + assoc = g_key_file_get_string_list (keyfile, "Default Applications", contenttype, NULL, &error); + g_assert (error != NULL); + g_clear_error (&error); + + g_key_file_free (keyfile); + + /* 3. make the first app the default */ + g_app_info_set_as_default_for_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + keyfile = g_key_file_new (); + g_key_file_load_from_file (keyfile, mimeapps, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error); + g_assert_no_error (error); + g_assert (strv_equal (assoc, "myapp.desktop", "myapp2.desktop", NULL)); + g_strfreev (assoc); + + str = g_key_file_get_string (keyfile, "Default Applications", contenttype, &error); + g_assert_no_error (error); + g_assert_cmpstr (str, ==, "myapp.desktop"); + g_free (str); + + g_key_file_free (keyfile); + + /* 4. make the second app the last used one */ + g_app_info_set_as_last_used_for_type (appinfo2, contenttype, &error); + g_assert_no_error (error); + + keyfile = g_key_file_new (); + g_key_file_load_from_file (keyfile, mimeapps, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error); + g_assert_no_error (error); + g_assert (strv_equal (assoc, "myapp2.desktop", "myapp.desktop", NULL)); + g_strfreev (assoc); + + g_key_file_free (keyfile); + + /* 5. reset everything */ + g_app_info_reset_type_associations (contenttype); + + keyfile = g_key_file_new (); + g_key_file_load_from_file (keyfile, mimeapps, G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + res = g_key_file_has_key (keyfile, "Added Associations", contenttype, NULL); + g_assert (!res); + + res = g_key_file_has_key (keyfile, "Default Applications", contenttype, NULL); + g_assert (!res); + + g_key_file_free (keyfile); + + g_object_unref (appinfo); + g_object_unref (appinfo2); + + g_free (mimeapps); + g_free (dir); +} + +/* test interaction between defaults.list and mimeapps.list */ +static void +test_mime_default (void) +{ + GAppInfo *appinfo; + GAppInfo *appinfo2; + GAppInfo *appinfo3; + GError *error = NULL; + GAppInfo *def; + GList *list; + const gchar *contenttype = "image/png"; + + /* clear things out */ + g_app_info_reset_type_associations (contenttype); + + appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop"); + appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop"); + appinfo3 = (GAppInfo*)g_desktop_app_info_new ("myapp3.desktop"); + + /* myapp3 is set as the default in defaults.list */ + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo3)); + g_assert_cmpint (g_list_length (list), ==, 1); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo3)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 1. add a non-default association */ + g_app_info_add_supports_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo3)); /* default is unaffected */ + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo3)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 2. add another non-default association */ + g_app_info_add_supports_type (appinfo2, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo3)); + g_assert_cmpint (g_list_length (list), ==, 3); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->next->data, appinfo3)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 3. make the first app the default */ + g_app_info_set_as_default_for_type (appinfo, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo)); + g_assert_cmpint (g_list_length (list), ==, 3); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->next->data, appinfo3)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + g_object_unref (appinfo); + g_object_unref (appinfo2); + g_object_unref (appinfo3); +} + +/* test interaction between mimeinfo.cache, defaults.list and mimeapps.list + * to ensure g_app_info_set_as_last_used_for_type doesn't incorrectly + * change the default + */ +static void +test_mime_default_last_used (void) +{ + GAppInfo *appinfo4; + GAppInfo *appinfo5; + GError *error = NULL; + GAppInfo *def; + GList *list; + const gchar *contenttype = "image/bmp"; + + /* clear things out */ + g_app_info_reset_type_associations (contenttype); + + appinfo4 = (GAppInfo*)g_desktop_app_info_new ("myapp4.desktop"); + appinfo5 = (GAppInfo*)g_desktop_app_info_new ("myapp5.desktop"); + + /* myapp4 is set as the default in defaults.list */ + /* myapp4 and myapp5 can both handle image/bmp */ + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo4)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo4)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 1. set default (myapp4) as last used */ + g_app_info_set_as_last_used_for_type (appinfo4, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo4)); /* default is unaffected */ + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo4)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 2. set other (myapp5) as last used */ + g_app_info_set_as_last_used_for_type (appinfo5, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo4)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo5)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 3. change the default to myapp5 */ + g_app_info_set_as_default_for_type (appinfo5, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo5)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo5)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 4. set myapp4 as last used */ + g_app_info_set_as_last_used_for_type (appinfo4, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo5)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo4)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + /* 5. set myapp5 as last used again */ + g_app_info_set_as_last_used_for_type (appinfo5, contenttype, &error); + g_assert_no_error (error); + + def = g_app_info_get_default_for_type (contenttype, FALSE); + list = g_app_info_get_recommended_for_type (contenttype); + g_assert (g_app_info_equal (def, appinfo5)); + g_assert_cmpint (g_list_length (list), ==, 2); + g_assert (g_app_info_equal ((GAppInfo*)list->data, appinfo5)); + g_assert (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4)); + g_object_unref (def); + g_list_free_full (list, g_object_unref); + + g_object_unref (appinfo4); + g_object_unref (appinfo5); +} + +static void +test_scheme_handler (void) +{ + GAppInfo *info, *info5; + + info5 = (GAppInfo*)g_desktop_app_info_new ("myapp5.desktop"); + info = g_app_info_get_default_for_uri_scheme ("ftp"); + g_assert (g_app_info_equal (info, info5)); + + g_object_unref (info); + g_object_unref (info5); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + setup (); + + g_test_add_func ("/appinfo/mime/api", test_mime_api); + g_test_add_func ("/appinfo/mime/default", test_mime_default); + g_test_add_func ("/appinfo/mime/file", test_mime_file); + g_test_add_func ("/appinfo/mime/scheme-handler", test_scheme_handler); + g_test_add_func ("/appinfo/mime/default-last-used", test_mime_default_last_used); + + return g_test_run (); +} diff --git a/gio/tests/network-address.c b/gio/tests/network-address.c new file mode 100644 index 0000000..7a419c2 --- /dev/null +++ b/gio/tests/network-address.c @@ -0,0 +1,127 @@ +#include + +static void +test_basic (void) +{ + GNetworkAddress *address; + guint port; + gchar *hostname; + gchar *scheme; + + address = (GNetworkAddress*)g_network_address_new ("www.gnome.org", 8080); + + g_assert_cmpstr (g_network_address_get_hostname (address), ==, "www.gnome.org"); + g_assert_cmpint (g_network_address_get_port (address), ==, 8080); + + g_object_get (address, "hostname", &hostname, "port", &port, "scheme", &scheme, NULL); + g_assert_cmpstr (hostname, ==, "www.gnome.org"); + g_assert_cmpint (port, ==, 8080); + g_assert (scheme == NULL); + g_free (hostname); + + g_object_unref (address); +} + +static void +test_parse_uri (void) +{ + GNetworkAddress *address; + GError *error = NULL; + + address = (GNetworkAddress*)g_network_address_parse_uri ("http://www.gnome.org:2020/start", 8080, &error); + g_assert_no_error (error); + g_assert_cmpstr (g_network_address_get_scheme (address), ==, "http"); + g_assert_cmpstr (g_network_address_get_hostname (address), ==, "www.gnome.org"); + g_assert_cmpint (g_network_address_get_port (address), ==, 2020); + g_object_unref (address); + + address = (GNetworkAddress*)g_network_address_parse_uri ("ftp://joe~:(*)%46@ftp.gnome.org:2020/start", 8080, &error); + g_assert_no_error (error); + g_assert_cmpstr (g_network_address_get_scheme (address), ==, "ftp"); + g_assert_cmpstr (g_network_address_get_hostname (address), ==, "ftp.gnome.org"); + g_assert_cmpint (g_network_address_get_port (address), ==, 2020); + g_object_unref (address); + + address = (GNetworkAddress*)g_network_address_parse_uri ("ftp://[fec0::abcd]/start", 8080, &error); + g_assert_no_error (error); + g_assert_cmpstr (g_network_address_get_scheme (address), ==, "ftp"); + g_assert_cmpstr (g_network_address_get_hostname (address), ==, "fec0::abcd"); + g_assert_cmpint (g_network_address_get_port (address), ==, 8080); + g_object_unref (address); + + address = (GNetworkAddress*)g_network_address_parse_uri ("ftp://joe%x-@ftp.gnome.org:2020/start", 8080, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert (address == NULL); + g_error_free (error); +} + +typedef struct _ParseTest ParseTest; + +struct _ParseTest +{ + const gchar *input; + const gchar *hostname; + guint16 port; + gint error_code; +}; + +static ParseTest tests[] = +{ + { "www.gnome.org", "www.gnome.org", 1234, -1 }, + { "www.gnome.org:8080", "www.gnome.org", 8080, -1 }, + { "[2001:db8::1]", "2001:db8::1", 1234, -1 }, + { "[2001:db8::1]:888", "2001:db8::1", 888, -1 }, + { "[hostname", NULL, 0, G_IO_ERROR_INVALID_ARGUMENT }, + { "[hostnam]e", NULL, 0, G_IO_ERROR_INVALID_ARGUMENT }, + { "hostname:", NULL, 0, G_IO_ERROR_INVALID_ARGUMENT }, + { "hostname:-1", NULL, 0, G_IO_ERROR_INVALID_ARGUMENT }, + { "hostname:9999999", NULL, 0, G_IO_ERROR_INVALID_ARGUMENT } +}; + +static void +test_parse (gconstpointer d) +{ + const ParseTest *test = d; + GNetworkAddress *address; + GError *error; + + error = NULL; + address = (GNetworkAddress*)g_network_address_parse (test->input, 1234, &error); + + if (address) + { + g_assert_cmpstr (g_network_address_get_hostname (address), ==, test->hostname); + g_assert_cmpint (g_network_address_get_port (address), ==, test->port); + g_assert_no_error (error); + } + else + { + g_assert_error (error, G_IO_ERROR, test->error_code); + } + + if (address) + g_object_unref (address); + if (error) + g_error_free (error); +} + +int +main (int argc, char *argv[]) +{ + gint i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/network-address/basic", test_basic); + g_test_add_func ("/network-address/parse/uri", test_parse_uri); + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + path = g_strdup_printf ("/network-address/parse/%d", i); + g_test_add_data_func (path, &tests[i], test_parse); + g_free (path); + } + + return g_test_run (); +} diff --git a/gio/tests/network-monitor.c b/gio/tests/network-monitor.c new file mode 100644 index 0000000..618b5e0 --- /dev/null +++ b/gio/tests/network-monitor.c @@ -0,0 +1,549 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright 2011 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 "gio.h" + +/* hack */ +#define GIO_COMPILATION +#include "gnetworkmonitorbase.h" + +#include + +/* Test data; the GInetAddresses and GInetAddressMasks get filled in + * in main(). Each address in a TestAddress matches the mask in its + * corresponding TestMask, and none of them match any of the other + * masks. The addresses in unmatched don't match any of the masks. + */ + +typedef struct { + const char *string; + GInetAddress *address; +} TestAddress; + +typedef struct { + const char *mask_string; + GInetAddressMask *mask; + TestAddress *addresses; +} TestMask; + +TestAddress net127addrs[] = { + { "127.0.0.1", NULL }, + { "127.0.0.2", NULL }, + { "127.0.0.255", NULL }, + { "127.0.1.0", NULL }, + { "127.0.255.0", NULL }, + { "127.0.255.0", NULL }, + { "127.255.255.255", NULL }, + { NULL, NULL } +}; +TestMask net127 = { "127.0.0.0/8", NULL, net127addrs }; + +TestAddress net10addrs[] = { + { "10.0.0.1", NULL }, + { "10.0.0.2", NULL }, + { "10.0.0.255", NULL }, + { NULL, NULL } +}; +TestMask net10 = { "10.0.0.0/24", NULL, net10addrs }; + +TestAddress net192addrs[] = { + { "192.168.0.1", NULL }, + { "192.168.0.2", NULL }, + { "192.168.0.255", NULL }, + { "192.168.1.0", NULL }, + { "192.168.15.0", NULL }, + { NULL, NULL } +}; +TestMask net192 = { "192.168.0.0/20", NULL, net192addrs }; + +TestAddress netlocal6addrs[] = { + { "::1", NULL }, + { NULL, NULL } +}; +TestMask netlocal6 = { "::1/128", NULL, netlocal6addrs }; + +TestAddress netfe80addrs[] = { + { "fe80::", NULL }, + { "fe80::1", NULL }, + { "fe80::21b:77ff:fea2:972a", NULL }, + { NULL, NULL } +}; +TestMask netfe80 = { "fe80::/64", NULL, netfe80addrs }; + +TestAddress unmatched[] = { + { "10.0.1.0", NULL }, + { "10.0.255.0", NULL }, + { "10.255.255.255", NULL }, + { "192.168.16.0", NULL }, + { "192.168.255.0", NULL }, + { "192.169.0.0", NULL }, + { "192.255.255.255", NULL }, + { "::2", NULL }, + { "1::1", NULL }, + { "fe80::1:0:0:0:0", NULL }, + { "fe80:8000::0:0:0:0", NULL }, + { NULL, NULL } +}; + +GInetAddressMask *ip4_default, *ip6_default; + +static void +notify_handler (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + gboolean *emitted = user_data; + + *emitted = TRUE; +} + +static void +network_changed_handler (GNetworkMonitor *monitor, + gboolean available, + gpointer user_data) +{ + gboolean *emitted = user_data; + + *emitted = TRUE; +} + +static void +assert_signals (GNetworkMonitor *monitor, + gboolean should_emit_notify, + gboolean should_emit_network_changed, + gboolean expected_network_available) +{ + gboolean emitted_notify = FALSE, emitted_network_changed = FALSE; + guint h1, h2; + + h1 = g_signal_connect (monitor, "notify::network-available", + G_CALLBACK (notify_handler), + &emitted_notify); + h2 = g_signal_connect (monitor, "network-changed", + G_CALLBACK (network_changed_handler), + &emitted_network_changed); + + g_main_context_iteration (NULL, FALSE); + + g_signal_handler_disconnect (monitor, h1); + g_signal_handler_disconnect (monitor, h2); + + g_assert (emitted_notify == should_emit_notify); + g_assert (emitted_network_changed == should_emit_network_changed); + + g_assert (g_network_monitor_get_network_available (monitor) == expected_network_available); +} + +typedef struct { + GNetworkMonitor *monitor; + GMainLoop *loop; + GSocketAddress *sockaddr; + gboolean should_be_reachable; +} CanReachData; + +static void +reach_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GError *error = NULL; + gboolean reachable; + CanReachData *data = user_data; + + reachable = g_network_monitor_can_reach_finish (data->monitor, res, &error); + + if (data->should_be_reachable) + g_assert_no_error (error); + else + { + g_assert (error != NULL); + g_clear_error (&error); + } + g_assert (reachable == data->should_be_reachable); + + g_main_loop_quit (data->loop); +} + +static gboolean +test_reach_async (gpointer user_data) +{ + CanReachData *data = user_data; + + g_network_monitor_can_reach_async (data->monitor, + G_SOCKET_CONNECTABLE (data->sockaddr), + NULL, + reach_cb, + data); + return G_SOURCE_REMOVE; +} + +static void +run_tests (GNetworkMonitor *monitor, + TestAddress *addresses, + gboolean should_be_reachable) +{ + GError *error = NULL; + int i; + gboolean reachable; + GSocketAddress *sockaddr; + CanReachData data; + + data.monitor = monitor; + data.loop = g_main_loop_new (NULL, FALSE); + + for (i = 0; addresses[i].address; i++) + { + sockaddr = g_inet_socket_address_new (addresses[i].address, 0); + reachable = g_network_monitor_can_reach (monitor, + G_SOCKET_CONNECTABLE (sockaddr), + NULL, &error); + data.sockaddr = sockaddr; + data.should_be_reachable = should_be_reachable; + + g_idle_add (test_reach_async, &data); + g_main_loop_run (data.loop); + + g_object_unref (sockaddr); + g_assert_cmpint (reachable, ==, should_be_reachable); + if (should_be_reachable) + g_assert_no_error (error); + else + { + g_assert (error != NULL); + g_clear_error (&error); + } + } + + g_main_loop_unref (data.loop); +} + +static void +test_default (void) +{ + GNetworkMonitor *monitor, *m; + GError *error = NULL; + + m = g_network_monitor_get_default (); + g_assert (G_IS_NETWORK_MONITOR (m)); + + monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL); + g_assert_no_error (error); + + /* In the default configuration, all addresses are reachable */ + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, TRUE); + + assert_signals (monitor, FALSE, FALSE, TRUE); + + g_object_unref (monitor); +} + +static void +test_remove_default (void) +{ + GNetworkMonitor *monitor; + GError *error = NULL; + + monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL); + g_assert_no_error (error); + assert_signals (monitor, FALSE, FALSE, TRUE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip4_default); + assert_signals (monitor, FALSE, TRUE, TRUE); + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip6_default); + assert_signals (monitor, TRUE, TRUE, FALSE); + + /* Now nothing should be reachable */ + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_object_unref (monitor); +} + +static void +test_add_networks (void) +{ + GNetworkMonitor *monitor; + GError *error = NULL; + + monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL); + g_assert_no_error (error); + assert_signals (monitor, FALSE, FALSE, TRUE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip4_default); + assert_signals (monitor, FALSE, TRUE, TRUE); + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip6_default); + assert_signals (monitor, TRUE, TRUE, FALSE); + + /* Now add the masks one by one */ + + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net127.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net10.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net192.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + netlocal6.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + netfe80.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + g_object_unref (monitor); +} + +static void +test_remove_networks (void) +{ + GNetworkMonitor *monitor; + GError *error = NULL; + + monitor = g_initable_new (G_TYPE_NETWORK_MONITOR_BASE, NULL, &error, NULL); + g_assert_no_error (error); + assert_signals (monitor, FALSE, FALSE, TRUE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip4_default); + assert_signals (monitor, FALSE, TRUE, TRUE); + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + ip6_default); + assert_signals (monitor, TRUE, TRUE, FALSE); + + /* First add them */ + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net127.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net10.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + net192.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + netlocal6.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + g_network_monitor_base_add_network (G_NETWORK_MONITOR_BASE (monitor), + netfe80.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + + run_tests (monitor, net127.addresses, TRUE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + /* Now remove them one by one */ + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + net127.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, TRUE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + net10.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, TRUE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + net192.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, TRUE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + netlocal6.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, TRUE); + run_tests (monitor, unmatched, FALSE); + + g_network_monitor_base_remove_network (G_NETWORK_MONITOR_BASE (monitor), + netfe80.mask); + assert_signals (monitor, FALSE, TRUE, FALSE); + run_tests (monitor, net127.addresses, FALSE); + run_tests (monitor, net10.addresses, FALSE); + run_tests (monitor, net192.addresses, FALSE); + run_tests (monitor, netlocal6.addresses, FALSE); + run_tests (monitor, netfe80.addresses, FALSE); + run_tests (monitor, unmatched, FALSE); + + g_object_unref (monitor); +} + + +static void +init_test (TestMask *test) +{ + GError *error = NULL; + int i; + + test->mask = g_inet_address_mask_new_from_string (test->mask_string, &error); + g_assert_no_error (error); + + for (i = 0; test->addresses[i].string; i++) + { + test->addresses[i].address = g_inet_address_new_from_string (test->addresses[i].string); + if (strchr (test->addresses[i].string, ':')) + g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV6); + else + g_assert_cmpint (g_inet_address_get_family (test->addresses[i].address), ==, G_SOCKET_FAMILY_IPV4); + } +} + +static void +cleanup_test (TestMask *test) +{ + int i; + + g_object_unref (test->mask); + for (i = 0; test->addresses[i].string; i++) + g_object_unref (test->addresses[i].address); +} + +static void +watch_network_changed (GNetworkMonitor *monitor, + gboolean available, + gpointer user_data) +{ + g_print ("Network is %s\n", available ? "up" : "down"); +} + +static void +do_watch_network (void) +{ + GNetworkMonitor *monitor = g_network_monitor_get_default (); + GMainLoop *loop; + + g_print ("Monitoring via %s\n", g_type_name_from_instance ((GTypeInstance *) monitor)); + + g_signal_connect (monitor, "network-changed", + G_CALLBACK (watch_network_changed), NULL); + watch_network_changed (monitor, g_network_monitor_get_network_available (monitor), NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); +} + +int +main (int argc, char **argv) +{ + int ret; + + if (argc == 2 && !strcmp (argv[1], "--watch")) + { + do_watch_network (); + return 0; + } + + g_test_init (&argc, &argv, NULL); + + init_test (&net127); + init_test (&net10); + init_test (&net192); + init_test (&netlocal6); + init_test (&netfe80); + ip4_default = g_inet_address_mask_new_from_string ("0.0.0.0/0", NULL); + ip6_default = g_inet_address_mask_new_from_string ("::/0", NULL); + + g_test_add_func ("/network-monitor/default", test_default); + g_test_add_func ("/network-monitor/remove_default", test_remove_default); + g_test_add_func ("/network-monitor/add_networks", test_add_networks); + g_test_add_func ("/network-monitor/remove_networks", test_remove_networks); + + ret = g_test_run (); + + cleanup_test (&net127); + cleanup_test (&net10); + cleanup_test (&net192); + cleanup_test (&netlocal6); + cleanup_test (&netfe80); + g_object_unref (ip4_default); + g_object_unref (ip6_default); + + return ret; +} diff --git a/gio/tests/nothing.pem b/gio/tests/nothing.pem new file mode 100644 index 0000000..e69de29 diff --git a/gio/tests/org.gtk.schemasourcecheck.gschema.xml b/gio/tests/org.gtk.schemasourcecheck.gschema.xml new file mode 100644 index 0000000..42c9c51 --- /dev/null +++ b/gio/tests/org.gtk.schemasourcecheck.gschema.xml @@ -0,0 +1,7 @@ + + + + true + + + diff --git a/gio/tests/org.gtk.test.gschema b/gio/tests/org.gtk.test.gschema new file mode 100644 index 0000000..291b3e8 --- /dev/null +++ b/gio/tests/org.gtk.test.gschema @@ -0,0 +1,39 @@ +schema org.gtk.test: + gettext-domain: test + path: /tests/ + + key greeting = @s "Hello, earthlings" + l10n: messages + summary: A greeting + description: Greeting of the invading martians + key farewell = @s "So long" + l10n: messages + + child basic-types: + key test-boolean = @b true + key test-byte = @y 25 + key test-int16 = @n -1234 + key test-uint16 = @q 1234 + key test-int32 = @i -123456 + key test-uint32 = @u 123456 + key test-int64 = @x -123456789 + key test-uint64 = @t 123456789 + key test-double = @d 123.456 + key test-string = @s "a string, it seems" + key test-objectpath = @o "/a/object/path" + + child complex-types: + key test-tuple = @(s(ii)) ("one",(2,3)) + key test-array = @ai [0,1,2,3,4,5] + + child localized: + gettext-domain: glib20 + + key error-message = @s "Unnamed" + l10n: messages + + child binding: + key bool = @b false + key int = @i 0 + key double = @d 0 + key string = @s "" diff --git a/gio/tests/org.gtk.test.gschema.xml b/gio/tests/org.gtk.test.gschema.xml new file mode 100644 index 0000000..02b127f --- /dev/null +++ b/gio/tests/org.gtk.test.gschema.xml @@ -0,0 +1,170 @@ + + + + + "Hello, earthlings" + A greeting + + Greeting of the invading martians + + + + "So long" + + + + + + + + + + true + + + + + + true + + + 25 + + + -1234 + + + 1234 + + + -123456 + + + 123456 + + + -123456789 + + + 123456789 + + + 123.456 + + + "a string, it seems" + + + "/a/object/path" + + + + + + ("one",(2,3)) + + + [0,1,2,3,4,5] + + + + + + "Unnamed" + + + "BackSpace" + + + + + + false + + + false + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + "" + + + [48, 49] + + + [] + + + 'foo' + + + ['mourning', 'laughing'] + + + + + + 'bar' + + + + + + [] + + + + + + + + + [] + + + 'bar' + + + + + + 33 + + + + + + + 33 + + + + + + 0 + + + diff --git a/gio/tests/permission.c b/gio/tests/permission.c new file mode 100644 index 0000000..14094a0 --- /dev/null +++ b/gio/tests/permission.c @@ -0,0 +1,117 @@ +/* Unit tests for GPermission + * Copyright (C) 2012 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 + +static void +acquired (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GPermission *p = G_PERMISSION (source); + GMainLoop *loop = user_data; + GError *error = NULL; + gboolean ret; + + ret = g_permission_acquire_finish (p, res, &error); + g_assert (!ret); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + + g_main_loop_quit (loop); +} + +static void +released (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GPermission *p = G_PERMISSION (source); + GMainLoop *loop = user_data; + GError *error = NULL; + gboolean ret; + + ret = g_permission_release_finish (p, res, &error); + g_assert (!ret); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + + g_main_loop_quit (loop); +} + +static void +test_simple (void) +{ + GPermission *p; + gboolean allowed; + gboolean can_acquire; + gboolean can_release; + gboolean ret; + GError *error = NULL; + GMainLoop *loop; + + p = g_simple_permission_new (TRUE); + + g_assert (g_permission_get_allowed (p)); + g_assert (!g_permission_get_can_acquire (p)); + g_assert (!g_permission_get_can_release (p)); + + g_object_get (p, + "allowed", &allowed, + "can-acquire", &can_acquire, + "can-release", &can_release, + NULL); + + g_assert (allowed); + g_assert (!can_acquire); + g_assert (!can_release); + + ret = g_permission_acquire (p, NULL, &error); + g_assert (!ret); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + + ret = g_permission_release (p, NULL, &error); + g_assert (!ret); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + + loop = g_main_loop_new (NULL, FALSE); + g_permission_acquire_async (p, NULL, acquired, loop); + g_main_loop_run (loop); + g_permission_release_async (p, NULL, released, loop); + g_main_loop_run (loop); + + g_main_loop_unref (loop); + + g_object_unref (p); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/permission/simple", test_simple); + + return g_test_run (); +} diff --git a/gio/tests/pollable.c b/gio/tests/pollable.c new file mode 100644 index 0000000..9cd79b0 --- /dev/null +++ b/gio/tests/pollable.c @@ -0,0 +1,290 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2010 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 + +#ifdef G_OS_UNIX +#include +#include +#include +#endif + +GMainLoop *loop; +GPollableInputStream *in; +GOutputStream *out; + +static gboolean +poll_source_callback (GPollableInputStream *in, + gpointer user_data) +{ + GError *error = NULL; + char buf[2]; + gssize nread; + gboolean *success = user_data; + + nread = g_pollable_input_stream_read_nonblocking (in, buf, 2, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nread, ==, 2); + g_assert_cmpstr (buf, ==, "x"); + + *success = TRUE; + return G_SOURCE_REMOVE; +} + +static gboolean +check_source_readability_callback (gpointer user_data) +{ + gboolean expected = GPOINTER_TO_INT (user_data); + gboolean readable; + + readable = g_pollable_input_stream_is_readable (in); + g_assert_cmpint (readable, ==, expected); + return G_SOURCE_REMOVE; +} + +static gboolean +write_callback (gpointer user_data) +{ + char *buf = "x"; + gssize nwrote; + GError *error = NULL; + + nwrote = g_output_stream_write (out, buf, 2, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, 2); +/* Give the pipe a few ticks to propagate the write for sockets. On my + * iMac i7, 40 works, 30 doesn't. */ + g_usleep (80L); + + check_source_readability_callback (GINT_TO_POINTER (TRUE)); + + return G_SOURCE_REMOVE; +} + +static gboolean +check_source_and_quit_callback (gpointer user_data) +{ + check_source_readability_callback (user_data); + g_main_loop_quit (loop); + return G_SOURCE_REMOVE; +} + +static void +test_streams (void) +{ + gboolean readable; + GError *error = NULL; + char buf[1]; + gssize nread; + GSource *poll_source; + gboolean success = FALSE; + + g_assert (g_pollable_input_stream_can_poll (in)); + g_assert (g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (out))); + + readable = g_pollable_input_stream_is_readable (in); + g_assert (!readable); + + nread = g_pollable_input_stream_read_nonblocking (in, buf, 1, NULL, &error); + g_assert_cmpint (nread, ==, -1); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK); + g_clear_error (&error); + + /* Create 4 sources, in decreasing order of priority: + * 1. poll source on @in + * 2. idle source that checks if @in is readable once + * (it won't be) and then removes itself + * 3. idle source that writes a byte to @out, checks that + * @in is now readable, and removes itself + * 4. idle source that checks if @in is readable once + * (it won't be, since the poll source will fire before + * this one does) and then quits the loop. + * + * If the poll source triggers before it should, then it will get a + * %G_IO_ERROR_WOULD_BLOCK, and if check() fails in either + * direction, we will catch it at some point. + */ + + poll_source = g_pollable_input_stream_create_source (in, NULL); + g_source_set_priority (poll_source, 1); + g_source_set_callback (poll_source, (GSourceFunc) poll_source_callback, &success, NULL); + g_source_attach (poll_source, NULL); + g_source_unref (poll_source); + + g_idle_add_full (2, check_source_readability_callback, GINT_TO_POINTER (FALSE), NULL); + g_idle_add_full (3, write_callback, NULL, NULL); + g_idle_add_full (4, check_source_and_quit_callback, GINT_TO_POINTER (FALSE), NULL); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_assert_cmpint (success, ==, TRUE); +} + +#ifdef G_OS_UNIX +static void +test_pollable_unix (void) +{ + int pipefds[2], status, fd; + + status = pipe (pipefds); + g_assert_cmpint (status, ==, 0); + + in = G_POLLABLE_INPUT_STREAM (g_unix_input_stream_new (pipefds[0], TRUE)); + out = g_unix_output_stream_new (pipefds[1], TRUE); + + test_streams (); + + g_object_unref (in); + g_object_unref (out); + + /* Non-pipe/socket unix streams are not pollable */ + fd = g_open ("/dev/null", O_RDWR, 0); + g_assert_cmpint (fd, !=, -1); + in = G_POLLABLE_INPUT_STREAM (g_unix_input_stream_new (fd, FALSE)); + out = g_unix_output_stream_new (fd, FALSE); + + g_assert (!g_pollable_input_stream_can_poll (in)); + g_assert (!g_pollable_output_stream_can_poll (G_POLLABLE_OUTPUT_STREAM (out))); + + g_object_unref (in); + g_object_unref (out); + close (fd); +} + +static void +test_pollable_converter (void) +{ + GConverter *converter; + GError *error = NULL; + GInputStream *ibase; + int pipefds[2], status; + + status = pipe (pipefds); + g_assert_cmpint (status, ==, 0); + + ibase = G_INPUT_STREAM (g_unix_input_stream_new (pipefds[0], TRUE)); + converter = G_CONVERTER (g_charset_converter_new ("UTF-8", "UTF-8", &error)); + g_assert_no_error (error); + + in = G_POLLABLE_INPUT_STREAM (g_converter_input_stream_new (ibase, converter)); + g_object_unref (converter); + g_object_unref (ibase); + + out = g_unix_output_stream_new (pipefds[1], TRUE); + + test_streams (); + + g_object_unref (in); + g_object_unref (out); +} + +#endif + +static void +client_connected (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketClient *client = G_SOCKET_CLIENT (source); + GSocketConnection **conn = user_data; + GError *error = NULL; + + *conn = g_socket_client_connect_finish (client, result, &error); + g_assert_no_error (error); +} + +static void +server_connected (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketListener *listener = G_SOCKET_LISTENER (source); + GSocketConnection **conn = user_data; + GError *error = NULL; + + *conn = g_socket_listener_accept_finish (listener, result, NULL, &error); + g_assert_no_error (error); +} + +static void +test_pollable_socket (void) +{ + GInetAddress *iaddr; + GSocketAddress *saddr, *effective_address; + GSocketListener *listener; + GSocketClient *client; + GError *error = NULL; + GSocketConnection *client_conn = NULL, *server_conn = NULL; + + iaddr = g_inet_address_new_loopback (G_SOCKET_FAMILY_IPV4); + saddr = g_inet_socket_address_new (iaddr, 0); + g_object_unref (iaddr); + + listener = g_socket_listener_new (); + g_socket_listener_add_address (listener, saddr, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_TCP, + NULL, + &effective_address, + &error); + g_assert_no_error (error); + g_object_unref (saddr); + + client = g_socket_client_new (); + + g_socket_client_connect_async (client, + G_SOCKET_CONNECTABLE (effective_address), + NULL, client_connected, &client_conn); + g_socket_listener_accept_async (listener, NULL, + server_connected, &server_conn); + + while (!client_conn || !server_conn) + g_main_context_iteration (NULL, TRUE); + + in = G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (G_IO_STREAM (client_conn))); + out = g_io_stream_get_output_stream (G_IO_STREAM (server_conn)); + + test_streams (); + + g_object_unref (client_conn); + g_object_unref (server_conn); + g_object_unref (client); + g_object_unref (listener); + g_object_unref (effective_address); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + +#ifdef G_OS_UNIX + g_test_add_func ("/pollable/unix", test_pollable_unix); + g_test_add_func ("/pollable/converter", test_pollable_converter); +#endif + g_test_add_func ("/pollable/socket", test_pollable_socket); + + return g_test_run(); +} + diff --git a/gio/tests/proxy-test.c b/gio/tests/proxy-test.c new file mode 100644 index 0000000..2ab27aa --- /dev/null +++ b/gio/tests/proxy-test.c @@ -0,0 +1,1293 @@ +/* GLib testing framework examples and tests + * + * Copyright 2012 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 + +#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_34 +#include + +/* Overview: + * + * We have an echo server, two proxy servers, two GProxy + * implementations, and two GProxyResolver implementations. + * + * The echo server runs at @server.server_addr (on + * @server.server_port). + * + * The two proxy servers, A and B, run on @proxy_a.port and + * @proxy_b.port, with @proxy_a.uri and @proxy_b.uri pointing to them. + * The "negotiation" with the two proxies is just sending the single + * letter "a" or "b" and receiving it back in uppercase; the proxy + * then connects to @server_addr. + * + * Proxy A supports "alpha://" URIs, and does not support hostname + * resolution, and Proxy B supports "beta://" URIs, and does support + * hostname resolution (but it just ignores the hostname and always + * connects to @server_addr anyway). + * + * The default GProxyResolver (GTestProxyResolver) looks at its URI + * and returns [ "direct://" ] for "simple://" URIs, and [ + * proxy_a.uri, proxy_b.uri ] for other URIs. The other GProxyResolver + * (GTestAltProxyResolver) always returns [ proxy_a.uri ]. + */ + +typedef struct { + gchar *proxy_command; + gchar *supported_protocol; + + GSocket *server; + GThread *thread; + GCancellable *cancellable; + gchar *uri; + gushort port; + + GSocket *client_sock, *server_sock; + GMainLoop *loop; + + GError *last_error; +} ProxyData; + +static ProxyData proxy_a, proxy_b; + +typedef struct { + GSocket *server; + GThread *server_thread; + GCancellable *cancellable; + GSocketAddress *server_addr; + gushort server_port; +} ServerData; + +static ServerData server; + +static gchar **last_proxies; + +static GSocketClient *client; + + +/**************************************/ +/* Test GProxyResolver implementation */ +/**************************************/ + +typedef struct { + GObject parent_instance; +} GTestProxyResolver; + +typedef struct { + GObjectClass parent_class; +} GTestProxyResolverClass; + +static void g_test_proxy_resolver_iface_init (GProxyResolverInterface *iface); + +static GType _g_test_proxy_resolver_get_type (void); +#define g_test_proxy_resolver_get_type _g_test_proxy_resolver_get_type +G_DEFINE_TYPE_WITH_CODE (GTestProxyResolver, g_test_proxy_resolver, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY_RESOLVER, + g_test_proxy_resolver_iface_init) + g_io_extension_point_implement (G_PROXY_RESOLVER_EXTENSION_POINT_NAME, + g_define_type_id, + "test", + 0)) + +static void +g_test_proxy_resolver_init (GTestProxyResolver *resolver) +{ +} + +static gboolean +g_test_proxy_resolver_is_supported (GProxyResolver *resolver) +{ + return TRUE; +} + +static gchar ** +g_test_proxy_resolver_lookup (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error) +{ + gchar **proxies; + + g_assert (last_proxies == NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + + proxies = g_new (gchar *, 3); + + if (!strncmp (uri, "simple://", 4)) + { + proxies[0] = g_strdup ("direct://"); + proxies[1] = NULL; + } + else + { + /* Proxy A can only deal with "alpha://" URIs, not + * "beta://", but we always return both URIs + * anyway so we can test error handling when the first + * fails. + */ + proxies[0] = g_strdup (proxy_a.uri); + proxies[1] = g_strdup (proxy_b.uri); + proxies[2] = NULL; + } + + last_proxies = g_strdupv (proxies); + + return proxies; +} + +static void +g_test_proxy_resolver_lookup_async (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GError *error = NULL; + GTask *task; + gchar **proxies; + + proxies = g_proxy_resolver_lookup (resolver, uri, cancellable, &error); + + task = g_task_new (resolver, NULL, callback, user_data); + if (proxies == NULL) + g_task_return_error (task, error); + else + g_task_return_pointer (task, proxies, (GDestroyNotify) g_strfreev); + + g_object_unref (task); +} + +static gchar ** +g_test_proxy_resolver_lookup_finish (GProxyResolver *resolver, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_test_proxy_resolver_class_init (GTestProxyResolverClass *resolver_class) +{ +} + +static void +g_test_proxy_resolver_iface_init (GProxyResolverInterface *iface) +{ + iface->is_supported = g_test_proxy_resolver_is_supported; + iface->lookup = g_test_proxy_resolver_lookup; + iface->lookup_async = g_test_proxy_resolver_lookup_async; + iface->lookup_finish = g_test_proxy_resolver_lookup_finish; +} + +/****************************/ +/* Alternate GProxyResolver */ +/****************************/ + +typedef GTestProxyResolver GTestAltProxyResolver; +typedef GTestProxyResolverClass GTestAltProxyResolverClass; + +static void g_test_alt_proxy_resolver_iface_init (GProxyResolverInterface *iface); + +static GType _g_test_alt_proxy_resolver_get_type (void); +#define g_test_alt_proxy_resolver_get_type _g_test_alt_proxy_resolver_get_type +G_DEFINE_TYPE_WITH_CODE (GTestAltProxyResolver, g_test_alt_proxy_resolver, g_test_proxy_resolver_get_type (), + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY_RESOLVER, + g_test_alt_proxy_resolver_iface_init); + ) + +static void +g_test_alt_proxy_resolver_init (GTestProxyResolver *resolver) +{ +} + +static gchar ** +g_test_alt_proxy_resolver_lookup (GProxyResolver *resolver, + const gchar *uri, + GCancellable *cancellable, + GError **error) +{ + gchar **proxies; + + proxies = g_new (gchar *, 2); + + proxies[0] = g_strdup (proxy_a.uri); + proxies[1] = NULL; + + last_proxies = g_strdupv (proxies); + + return proxies; +} + +static void +g_test_alt_proxy_resolver_class_init (GTestProxyResolverClass *resolver_class) +{ +} + +static void +g_test_alt_proxy_resolver_iface_init (GProxyResolverInterface *iface) +{ + iface->lookup = g_test_alt_proxy_resolver_lookup; +} + + +/****************************************/ +/* Test proxy implementation base class */ +/****************************************/ + +typedef struct { + GObject parent; + + ProxyData *proxy_data; +} GProxyBase; + +typedef struct { + GObjectClass parent_class; +} GProxyBaseClass; + +static GType _g_proxy_base_get_type (void); +#define g_proxy_base_get_type _g_proxy_base_get_type +G_DEFINE_ABSTRACT_TYPE (GProxyBase, g_proxy_base, G_TYPE_OBJECT) + +static void +g_proxy_base_init (GProxyBase *proxy) +{ +} + +static GIOStream * +g_proxy_base_connect (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error) +{ + ProxyData *data = ((GProxyBase *) proxy)->proxy_data; + const gchar *protocol; + GOutputStream *ostream; + GInputStream *istream; + gchar response; + + g_assert_no_error (data->last_error); + + protocol = g_proxy_address_get_destination_protocol (proxy_address); + if (strcmp (protocol, data->supported_protocol) != 0) + { + g_set_error_literal (&data->last_error, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Unsupported protocol"); + goto fail; + } + + ostream = g_io_stream_get_output_stream (io_stream); + if (g_output_stream_write (ostream, data->proxy_command, 1, cancellable, + &data->last_error) != 1) + goto fail; + + istream = g_io_stream_get_input_stream (io_stream); + if (g_input_stream_read (istream, &response, 1, cancellable, + &data->last_error) != 1) + goto fail; + + if (response != g_ascii_toupper (*data->proxy_command)) + { + g_set_error_literal (&data->last_error, + G_IO_ERROR, G_IO_ERROR_FAILED, + "Failed"); + goto fail; + } + + return g_object_ref (io_stream); + + fail: + g_propagate_error (error, g_error_copy (data->last_error)); + return NULL; +} + +static void +g_proxy_base_connect_async (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GError *error = NULL; + GTask *task; + GIOStream *proxy_io_stream; + + task = g_task_new (proxy, NULL, callback, user_data); + + proxy_io_stream = g_proxy_connect (proxy, io_stream, proxy_address, + cancellable, &error); + if (proxy_io_stream) + g_task_return_pointer (task, proxy_io_stream, g_object_unref); + else + g_task_return_error (task, error); + g_object_unref (task); +} + +static GIOStream * +g_proxy_base_connect_finish (GProxy *proxy, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_proxy_base_class_init (GProxyBaseClass *class) +{ +} + + +/********************************************/ +/* Test proxy implementation #1 ("Proxy A") */ +/********************************************/ + +typedef GProxyBase GProxyA; +typedef GProxyBaseClass GProxyAClass; + +static void g_proxy_a_iface_init (GProxyInterface *proxy_iface); + +static GType _g_proxy_a_get_type (void); +#define g_proxy_a_get_type _g_proxy_a_get_type +G_DEFINE_TYPE_WITH_CODE (GProxyA, g_proxy_a, g_proxy_base_get_type (), + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, + g_proxy_a_iface_init) + g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, + g_define_type_id, + "proxy-a", + 0)) + +static void +g_proxy_a_init (GProxyA *proxy) +{ + ((GProxyBase *) proxy)->proxy_data = &proxy_a; +} + +static gboolean +g_proxy_a_supports_hostname (GProxy *proxy) +{ + return FALSE; +} + +static void +g_proxy_a_class_init (GProxyAClass *class) +{ +} + +static void +g_proxy_a_iface_init (GProxyInterface *proxy_iface) +{ + proxy_iface->connect = g_proxy_base_connect; + proxy_iface->connect_async = g_proxy_base_connect_async; + proxy_iface->connect_finish = g_proxy_base_connect_finish; + proxy_iface->supports_hostname = g_proxy_a_supports_hostname; +} + +/********************************************/ +/* Test proxy implementation #2 ("Proxy B") */ +/********************************************/ + +typedef GProxyBase GProxyB; +typedef GProxyBaseClass GProxyBClass; + +static void g_proxy_b_iface_init (GProxyInterface *proxy_iface); + +static GType _g_proxy_b_get_type (void); +#define g_proxy_b_get_type _g_proxy_b_get_type +G_DEFINE_TYPE_WITH_CODE (GProxyB, g_proxy_b, g_proxy_base_get_type (), + G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, + g_proxy_b_iface_init) + g_io_extension_point_implement (G_PROXY_EXTENSION_POINT_NAME, + g_define_type_id, + "proxy-b", + 0)) + +static void +g_proxy_b_init (GProxyB *proxy) +{ + ((GProxyBase *) proxy)->proxy_data = &proxy_b; +} + +static gboolean +g_proxy_b_supports_hostname (GProxy *proxy) +{ + return TRUE; +} + +static void +g_proxy_b_class_init (GProxyBClass *class) +{ +} + +static void +g_proxy_b_iface_init (GProxyInterface *proxy_iface) +{ + proxy_iface->connect = g_proxy_base_connect; + proxy_iface->connect_async = g_proxy_base_connect_async; + proxy_iface->connect_finish = g_proxy_base_connect_finish; + proxy_iface->supports_hostname = g_proxy_b_supports_hostname; +} + + +/***********************************/ +/* The proxy server implementation */ +/***********************************/ + +static gboolean +proxy_bytes (GSocket *socket, + GIOCondition condition, + gpointer user_data) +{ + ProxyData *proxy = user_data; + gssize nread, nwrote, total; + gchar buffer[8]; + GSocket *out_socket; + GError *error = NULL; + + nread = g_socket_receive_with_blocking (socket, buffer, sizeof (buffer), + TRUE, NULL, &error); + if (nread == -1) + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + return FALSE; + } + else + g_assert_no_error (error); + + if (nread == 0) + { + g_main_loop_quit (proxy->loop); + return FALSE; + } + + if (socket == proxy->client_sock) + out_socket = proxy->server_sock; + else + out_socket = proxy->client_sock; + + for (total = 0; total < nread; total += nwrote) + { + nwrote = g_socket_send_with_blocking (out_socket, + buffer + total, nread - total, + TRUE, NULL, &error); + g_assert_no_error (error); + } + + return TRUE; +} + +static gpointer +proxy_thread (gpointer user_data) +{ + ProxyData *proxy = user_data; + GError *error = NULL; + gssize nread, nwrote; + gchar command[2] = { 0, 0 }; + GMainContext *context; + GSource *read_source, *write_source; + + context = g_main_context_new (); + proxy->loop = g_main_loop_new (context, FALSE); + + while (TRUE) + { + proxy->client_sock = g_socket_accept (proxy->server, proxy->cancellable, &error); + if (!proxy->client_sock) + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (error); + break; + } + else + g_assert_no_error (error); + + nread = g_socket_receive (proxy->client_sock, command, 1, NULL, &error); + g_assert_no_error (error); + + if (nread == 0) + { + g_clear_object (&proxy->client_sock); + continue; + } + + g_assert_cmpint (nread, ==, 1); + g_assert_cmpstr (command, ==, proxy->proxy_command); + + *command = g_ascii_toupper (*command); + nwrote = g_socket_send (proxy->client_sock, command, 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, 1); + + proxy->server_sock = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + g_socket_connect (proxy->server_sock, server.server_addr, NULL, &error); + g_assert_no_error (error); + + read_source = g_socket_create_source (proxy->client_sock, G_IO_IN, NULL); + g_source_set_callback (read_source, (GSourceFunc)proxy_bytes, proxy, NULL); + g_source_attach (read_source, context); + + write_source = g_socket_create_source (proxy->server_sock, G_IO_IN, NULL); + g_source_set_callback (write_source, (GSourceFunc)proxy_bytes, proxy, NULL); + g_source_attach (write_source, context); + + g_main_loop_run (proxy->loop); + + g_socket_close (proxy->client_sock, &error); + g_assert_no_error (error); + g_clear_object (&proxy->client_sock); + + g_socket_close (proxy->server_sock, &error); + g_assert_no_error (error); + g_clear_object (&proxy->server_sock); + + g_source_destroy (read_source); + g_source_unref (read_source); + g_source_destroy (write_source); + g_source_unref (write_source); + } + + g_main_loop_unref (proxy->loop); + g_main_context_unref (context); + + g_object_unref (proxy->server); + g_object_unref (proxy->cancellable); + + g_free (proxy->proxy_command); + g_free (proxy->supported_protocol); + g_free (proxy->uri); + + return NULL; +} + +static void +create_proxy (ProxyData *proxy, + gchar proxy_protocol, + const gchar *destination_protocol, + GCancellable *cancellable) +{ + GError *error = NULL; + GSocketAddress *addr; + GInetAddress *iaddr; + + proxy->proxy_command = g_strdup_printf ("%c", proxy_protocol); + proxy->supported_protocol = g_strdup (destination_protocol); + proxy->cancellable = g_object_ref (cancellable); + + proxy->server = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + iaddr = g_inet_address_new_loopback (G_SOCKET_FAMILY_IPV4); + addr = g_inet_socket_address_new (iaddr, 0); + g_object_unref (iaddr); + + g_socket_bind (proxy->server, addr, TRUE, &error); + g_assert_no_error (error); + g_object_unref (addr); + + addr = g_socket_get_local_address (proxy->server, &error); + proxy->port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr)); + proxy->uri = g_strdup_printf ("proxy-%c://127.0.0.1:%u", + g_ascii_tolower (proxy_protocol), + proxy->port); + g_object_unref (addr); + + g_socket_listen (proxy->server, &error); + g_assert_no_error (error); + + proxy->thread = g_thread_new ("proxy", proxy_thread, proxy); +} + + + +/**************************/ +/* The actual echo server */ +/**************************/ + +static gpointer +echo_server_thread (gpointer user_data) +{ + ServerData *data = user_data; + GSocket *sock; + GError *error = NULL; + gssize nread, nwrote; + gchar buf[128]; + + while (TRUE) + { + sock = g_socket_accept (data->server, data->cancellable, &error); + if (!sock) + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (error); + break; + } + else + g_assert_no_error (error); + + while (TRUE) + { + nread = g_socket_receive (sock, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nread, >=, 0); + + if (nread == 0) + break; + + nwrote = g_socket_send (sock, buf, nread, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, nread); + } + + g_socket_close (sock, &error); + g_assert_no_error (error); + g_object_unref (sock); + } + + g_object_unref (data->server); + g_object_unref (data->server_addr); + g_object_unref (data->cancellable); + + return NULL; +} + +static void +create_server (ServerData *data, GCancellable *cancellable) +{ + GError *error = NULL; + GSocketAddress *addr; + GInetAddress *iaddr; + + data->cancellable = g_object_ref (cancellable); + + data->server = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_socket_set_blocking (data->server, TRUE); + iaddr = g_inet_address_new_loopback (G_SOCKET_FAMILY_IPV4); + addr = g_inet_socket_address_new (iaddr, 0); + g_object_unref (iaddr); + + g_socket_bind (data->server, addr, TRUE, &error); + g_assert_no_error (error); + g_object_unref (addr); + + data->server_addr = g_socket_get_local_address (data->server, &error); + g_assert_no_error (error); + + data->server_port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (data->server_addr)); + + g_socket_listen (data->server, &error); + g_assert_no_error (error); + + data->server_thread = g_thread_new ("server", echo_server_thread, data); +} + + +/******************************************************************/ +/* Now a GResolver implementation, so the can't-resolve test will */ +/* pass even if you have an evil DNS-faking ISP. */ +/******************************************************************/ + +typedef GResolver GFakeResolver; +typedef GResolverClass GFakeResolverClass; + +static GType g_fake_resolver_get_type (void); +G_DEFINE_TYPE (GFakeResolver, g_fake_resolver, G_TYPE_RESOLVER) + +static void +g_fake_resolver_init (GFakeResolver *gtr) +{ +} + +static GList * +g_fake_resolver_lookup_by_name (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GError **error) +{ + /* This is only ever called with lookups that are expected to + * fail. + */ + g_set_error (error, + G_RESOLVER_ERROR, + G_RESOLVER_ERROR_NOT_FOUND, + "Not found"); + return NULL; +} + +static void +g_fake_resolver_lookup_by_name_async (GResolver *resolver, + const gchar *hostname, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_task_report_new_error (resolver, callback, user_data, + g_fake_resolver_lookup_by_name_async, + G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, + "Not found"); +} + +static GList * +g_fake_resolver_lookup_by_name_finish (GResolver *resolver, + GAsyncResult *result, + GError **error) +{ + return g_task_propagate_pointer (G_TASK (result), error); +} + +static void +g_fake_resolver_class_init (GFakeResolverClass *fake_class) +{ + GResolverClass *resolver_class = G_RESOLVER_CLASS (fake_class); + + resolver_class->lookup_by_name = g_fake_resolver_lookup_by_name; + resolver_class->lookup_by_name_async = g_fake_resolver_lookup_by_name_async; + resolver_class->lookup_by_name_finish = g_fake_resolver_lookup_by_name_finish; +} + + + +/****************************************/ +/* We made it! Now for the actual test! */ +/****************************************/ + +static void +setup_test (gpointer fixture, + gconstpointer user_data) +{ +} + +static void +teardown_test (gpointer fixture, + gconstpointer user_data) +{ + if (last_proxies) + { + g_strfreev (last_proxies); + last_proxies = NULL; + } + g_clear_error (&proxy_a.last_error); + g_clear_error (&proxy_b.last_error); +} + + +static const gchar *testbuf = "0123456789abcdef"; + +static void +do_echo_test (GSocketConnection *conn) +{ + GIOStream *iostream = G_IO_STREAM (conn); + GInputStream *istream = g_io_stream_get_input_stream (iostream); + GOutputStream *ostream = g_io_stream_get_output_stream (iostream); + gssize nread, total; + gsize nwrote; + gchar buf[128]; + GError *error = NULL; + + g_output_stream_write_all (ostream, testbuf, strlen (testbuf), + &nwrote, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, strlen (testbuf)); + + for (total = 0; total < nwrote; total += nread) + { + nread = g_input_stream_read (istream, + buf + total, sizeof (buf) - total, + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nread, >, 0); + } + + buf[total] = '\0'; + g_assert_cmpstr (buf, ==, testbuf); +} + +static void +async_got_conn (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GSocketConnection **conn = user_data; + GError *error = NULL; + + *conn = g_socket_client_connect_finish (G_SOCKET_CLIENT (source), + result, &error); + g_assert_no_error (error); +} + +static void +async_got_error (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + GError **error = user_data; + + g_assert (error != NULL && *error == NULL); + g_socket_client_connect_finish (G_SOCKET_CLIENT (source), + result, error); + g_assert (*error != NULL); +} + + +static void +assert_direct (GSocketConnection *conn) +{ + GSocketAddress *addr; + GError *error = NULL; + + g_assert_cmpint (g_strv_length (last_proxies), ==, 1); + g_assert_cmpstr (last_proxies[0], ==, "direct://"); + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + + addr = g_socket_connection_get_remote_address (conn, &error); + g_assert_no_error (error); + g_assert (!G_IS_PROXY_ADDRESS (addr)); + g_object_unref (addr); + + addr = g_socket_connection_get_local_address (conn, &error); + g_assert_no_error (error); + g_object_unref (addr); + + g_assert (g_socket_connection_is_connected (conn)); +} + +static void +test_direct_sync (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + gchar *uri; + GError *error = NULL; + + /* The simple:// URI should not require any proxy. */ + + uri = g_strdup_printf ("simple://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_free (uri); + g_assert_no_error (error); + + assert_direct (conn); + do_echo_test (conn); + g_object_unref (conn); +} + +static void +test_direct_async (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + gchar *uri; + + /* The simple:// URI should not require any proxy. */ + uri = g_strdup_printf ("simple://127.0.0.1:%u", server.server_port); + conn = NULL; + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_conn, &conn); + g_free (uri); + while (conn == NULL) + g_main_context_iteration (NULL, TRUE); + + assert_direct (conn); + do_echo_test (conn); + g_object_unref (conn); +} + +static void +assert_single (GSocketConnection *conn) +{ + GSocketAddress *addr; + const gchar *proxy_uri; + gushort proxy_port; + GError *error = NULL; + + g_assert_cmpint (g_strv_length (last_proxies), ==, 2); + g_assert_cmpstr (last_proxies[0], ==, proxy_a.uri); + g_assert_cmpstr (last_proxies[1], ==, proxy_b.uri); + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + + addr = g_socket_connection_get_remote_address (conn, &error); + g_assert_no_error (error); + g_assert (G_IS_PROXY_ADDRESS (addr)); + proxy_uri = g_proxy_address_get_uri (G_PROXY_ADDRESS (addr)); + g_assert_cmpstr (proxy_uri, ==, proxy_a.uri); + proxy_port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr)); + g_assert_cmpint (proxy_port, ==, proxy_a.port); + + g_object_unref (addr); +} + +static void +test_single_sync (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + GError *error = NULL; + gchar *uri; + + /* The alpha:// URI should be proxied via Proxy A */ + uri = g_strdup_printf ("alpha://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_free (uri); + g_assert_no_error (error); + + assert_single (conn); + + do_echo_test (conn); + g_object_unref (conn); +} + +static void +test_single_async (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + gchar *uri; + + /* The alpha:// URI should be proxied via Proxy A */ + uri = g_strdup_printf ("alpha://127.0.0.1:%u", server.server_port); + conn = NULL; + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_conn, &conn); + g_free (uri); + while (conn == NULL) + g_main_context_iteration (NULL, TRUE); + + assert_single (conn); + do_echo_test (conn); + g_object_unref (conn); +} + +static void +assert_multiple (GSocketConnection *conn) +{ + GSocketAddress *addr; + const gchar *proxy_uri; + gushort proxy_port; + GError *error = NULL; + + g_assert_cmpint (g_strv_length (last_proxies), ==, 2); + g_assert_cmpstr (last_proxies[0], ==, proxy_a.uri); + g_assert_cmpstr (last_proxies[1], ==, proxy_b.uri); + g_assert_error (proxy_a.last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_assert_no_error (proxy_b.last_error); + + addr = g_socket_connection_get_remote_address (conn, &error); + g_assert_no_error (error); + g_assert (G_IS_PROXY_ADDRESS (addr)); + proxy_uri = g_proxy_address_get_uri (G_PROXY_ADDRESS (addr)); + g_assert_cmpstr (proxy_uri, ==, proxy_b.uri); + proxy_port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr)); + g_assert_cmpint (proxy_port, ==, proxy_b.port); + + g_object_unref (addr); +} + +static void +test_multiple_sync (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + GError *error = NULL; + gchar *uri; + + /* The beta:// URI should be proxied via Proxy B, after failing + * via Proxy A. + */ + uri = g_strdup_printf ("beta://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_free (uri); + g_assert_no_error (error); + + assert_multiple (conn); + do_echo_test (conn); + g_object_unref (conn); +} + +static void +test_multiple_async (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + gchar *uri; + + /* The beta:// URI should be proxied via Proxy B, after failing + * via Proxy A. + */ + uri = g_strdup_printf ("beta://127.0.0.1:%u", server.server_port); + conn = NULL; + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_conn, &conn); + g_free (uri); + while (conn == NULL) + g_main_context_iteration (NULL, TRUE); + + assert_multiple (conn); + do_echo_test (conn); + g_object_unref (conn); +} + +static void +test_dns (gpointer fixture, + gconstpointer user_data) +{ + GSocketConnection *conn; + GError *error = NULL; + gchar *uri; + + /* The simple:// and alpha:// URIs should fail with a DNS error, + * but the beta:// URI should succeed, because we pass it to + * Proxy B without trying to resolve it first + */ + + /* simple */ + uri = g_strdup_printf ("simple://no-such-host.xx:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_assert_error (error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND); + g_clear_error (&error); + + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + teardown_test (NULL, NULL); + + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_error, &error); + while (error == NULL) + g_main_context_iteration (NULL, TRUE); + g_assert_error (error, G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND); + g_clear_error (&error); + g_free (uri); + + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + teardown_test (NULL, NULL); + + /* alpha */ + uri = g_strdup_printf ("alpha://no-such-host.xx:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + /* Since Proxy A fails, @client will try Proxy B too, which won't + * load an alpha:// URI. + */ + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + + g_assert_no_error (proxy_a.last_error); + g_assert_error (proxy_b.last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + teardown_test (NULL, NULL); + + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_error, &error); + while (error == NULL) + g_main_context_iteration (NULL, TRUE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + g_free (uri); + + g_assert_no_error (proxy_a.last_error); + g_assert_error (proxy_b.last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + teardown_test (NULL, NULL); + + /* beta */ + uri = g_strdup_printf ("beta://no-such-host.xx:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_assert_no_error (error); + + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + + do_echo_test (conn); + g_clear_object (&conn); + teardown_test (NULL, NULL); + + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_conn, &conn); + while (conn == NULL) + g_main_context_iteration (NULL, TRUE); + g_free (uri); + + g_assert_no_error (proxy_a.last_error); + g_assert_no_error (proxy_b.last_error); + + do_echo_test (conn); + g_clear_object (&conn); + teardown_test (NULL, NULL); +} + +static void +assert_override (GSocketConnection *conn) +{ + g_assert_cmpint (g_strv_length (last_proxies), ==, 1); + g_assert_cmpstr (last_proxies[0], ==, proxy_a.uri); + + if (conn) + g_assert_no_error (proxy_a.last_error); + else + g_assert_error (proxy_a.last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); +} + +static void +test_override (gpointer fixture, + gconstpointer user_data) +{ + GProxyResolver *alt_resolver; + GSocketConnection *conn; + GError *error = NULL; + gchar *uri; + + g_assert (g_socket_client_get_proxy_resolver (client) == g_proxy_resolver_get_default ()); + alt_resolver = g_object_new (g_test_alt_proxy_resolver_get_type (), NULL); + g_socket_client_set_proxy_resolver (client, alt_resolver); + g_assert (g_socket_client_get_proxy_resolver (client) == alt_resolver); + + /* Alt proxy resolver always returns Proxy A, so alpha:// should + * succeed, and simple:// and beta:// should fail. + */ + + /* simple */ + uri = g_strdup_printf ("simple://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + assert_override (conn); + teardown_test (NULL, NULL); + + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_error, &error); + while (error == NULL) + g_main_context_iteration (NULL, TRUE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + assert_override (conn); + g_free (uri); + teardown_test (NULL, NULL); + + /* alpha */ + uri = g_strdup_printf ("alpha://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_assert_no_error (error); + assert_override (conn); + do_echo_test (conn); + g_clear_object (&conn); + teardown_test (NULL, NULL); + + conn = NULL; + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_conn, &conn); + while (conn == NULL) + g_main_context_iteration (NULL, TRUE); + assert_override (conn); + do_echo_test (conn); + g_clear_object (&conn); + g_free (uri); + teardown_test (NULL, NULL); + + /* beta */ + uri = g_strdup_printf ("beta://127.0.0.1:%u", server.server_port); + conn = g_socket_client_connect_to_uri (client, uri, 0, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + assert_override (conn); + teardown_test (NULL, NULL); + + g_socket_client_connect_to_uri_async (client, uri, 0, NULL, + async_got_error, &error); + while (error == NULL) + g_main_context_iteration (NULL, TRUE); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED); + g_clear_error (&error); + assert_override (conn); + g_free (uri); + teardown_test (NULL, NULL); + + g_assert (g_socket_client_get_proxy_resolver (client) == alt_resolver); + g_socket_client_set_proxy_resolver (client, NULL); + g_assert (g_socket_client_get_proxy_resolver (client) == g_proxy_resolver_get_default ()); + g_object_unref (alt_resolver); +} + +int +main (int argc, + char *argv[]) +{ + GResolver *fake_resolver; + GCancellable *cancellable; + gint result; + + g_test_init (&argc, &argv, NULL); + + /* Register stuff. The dummy g_proxy_get_default_for_protocol() call + * is to force _g_io_modules_ensure_extension_points_registered() to + * get called, so we can then register a proxy resolver extension + * point. + */ + g_proxy_get_default_for_protocol ("foo"); + g_test_proxy_resolver_get_type (); + g_proxy_a_get_type (); + g_proxy_b_get_type (); + g_setenv ("GIO_USE_PROXY_RESOLVER", "test", TRUE); + + fake_resolver = g_object_new (g_fake_resolver_get_type (), NULL); + g_resolver_set_default (fake_resolver); + + cancellable = g_cancellable_new (); + create_server (&server, cancellable); + create_proxy (&proxy_a, 'a', "alpha", cancellable); + create_proxy (&proxy_b, 'b', "beta", cancellable); + + client = g_socket_client_new (); + g_assert_cmpint (g_socket_client_get_enable_proxy (client), ==, TRUE); + + g_test_add_vtable ("/proxy/direct_sync", 0, NULL, setup_test, test_direct_sync, teardown_test); + g_test_add_vtable ("/proxy/direct_async", 0, NULL, setup_test, test_direct_async, teardown_test); + g_test_add_vtable ("/proxy/single_sync", 0, NULL, setup_test, test_single_sync, teardown_test); + g_test_add_vtable ("/proxy/single_async", 0, NULL, setup_test, test_single_async, teardown_test); + g_test_add_vtable ("/proxy/multiple_sync", 0, NULL, setup_test, test_multiple_sync, teardown_test); + g_test_add_vtable ("/proxy/multiple_async", 0, NULL, setup_test, test_multiple_async, teardown_test); + g_test_add_vtable ("/proxy/dns", 0, NULL, setup_test, test_dns, teardown_test); + g_test_add_vtable ("/proxy/override", 0, NULL, setup_test, test_override, teardown_test); + + result = g_test_run(); + + g_object_unref (client); + + g_cancellable_cancel (cancellable); + g_thread_join (proxy_a.thread); + g_thread_join (proxy_b.thread); + g_thread_join (server.server_thread); + + g_object_unref (cancellable); + + return result; +} + diff --git a/gio/tests/proxy.c b/gio/tests/proxy.c new file mode 100644 index 0000000..5738300 --- /dev/null +++ b/gio/tests/proxy.c @@ -0,0 +1,660 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2010 Collabora, Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include +#include +#include + +#include +#include + +#include "glibintl.h" + +#ifdef G_OS_UNIX +#include "gio/gunixsocketaddress.h" +#endif + +static const gchar *info = NULL; +static GCancellable *cancellable = NULL; +static gint return_value = 0; + +static void G_GNUC_NORETURN +usage (void) +{ + fprintf (stderr, "Usage: proxy [-s] (uri|host:port|ip:port|path|srv/protocol/domain)\n"); + fprintf (stderr, " Use -t to enable threading.\n"); + fprintf (stderr, " Use -s to do synchronous lookups.\n"); + fprintf (stderr, " Use -c to cancel operation.\n"); + fprintf (stderr, " Use -e to use enumerator.\n"); + fprintf (stderr, " Use -inet to use GInetSocketAddress enumerator (ip:port).\n"); +#ifdef G_OS_UNIX + fprintf (stderr, " Use -unix to use GUnixSocketAddress enumerator (path).\n"); +#endif + fprintf (stderr, " Use -proxyaddr tp use GProxyAddress enumerator " + "(ip:port:protocol:dest_host:dest_port[:username[:password]]).\n"); + fprintf (stderr, " Use -netaddr to use GNetworkAddress enumerator (host:port).\n"); + fprintf (stderr, " Use -neturi to use GNetworkAddress enumerator (uri).\n"); + fprintf (stderr, " Use -netsrv to use GNetworkService enumerator (srv/protocol/domain).\n"); + fprintf (stderr, " Use -connect to create a connection using GSocketClient object (uri).\n"); + exit (1); +} + +static void +print_and_free_error (GError *error) +{ + fprintf (stderr, "Failed to obtain proxies: %s\n", error->message); + g_error_free (error); + return_value = 1; +} + +static void +print_proxies (const gchar *info, gchar **proxies) +{ + printf ("Proxies for URI '%s' are:\n", info); + + if (proxies == NULL || proxies[0] == NULL) + printf ("\tnone\n"); + else + for (; proxies[0]; proxies++) + printf ("\t%s\n", proxies[0]); +} + +static void +_proxy_lookup_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + gchar **proxies; + GMainLoop *loop = user_data; + + proxies = g_proxy_resolver_lookup_finish (G_PROXY_RESOLVER (source_object), + result, + &error); + if (error) + { + print_and_free_error (error); + } + else + { + print_proxies (info, proxies); + g_strfreev (proxies); + } + + g_main_loop_quit (loop); +} + +static void +use_resolver (gboolean synchronous) +{ + GProxyResolver *resolver; + + resolver = g_proxy_resolver_get_default (); + + if (synchronous) + { + GError *error = NULL; + gchar **proxies; + + proxies = g_proxy_resolver_lookup (resolver, info, cancellable, &error); + + if (error) + print_and_free_error (error); + else + print_proxies (info, proxies); + + g_strfreev (proxies); + } + else + { + GMainLoop *loop = g_main_loop_new (NULL, FALSE); + + g_proxy_resolver_lookup_async (resolver, + info, + cancellable, + _proxy_lookup_cb, + loop); + + g_main_loop_run (loop); + g_main_loop_unref (loop); + } +} + +static void +print_proxy_address (GSocketAddress *sockaddr) +{ + GProxyAddress *proxy = NULL; + + if (sockaddr == NULL) + { + printf ("\tdirect://\n"); + return; + } + + if (G_IS_PROXY_ADDRESS (sockaddr)) + { + proxy = G_PROXY_ADDRESS (sockaddr); + printf ("\t%s://", g_proxy_address_get_protocol(proxy)); + } + else + { + printf ("\tdirect://"); + } + + if (G_IS_INET_SOCKET_ADDRESS (sockaddr)) + { + GInetAddress *inetaddr; + guint port; + gchar *addr; + + g_object_get (sockaddr, + "address", &inetaddr, + "port", &port, + NULL); + + addr = g_inet_address_to_string (inetaddr); + + printf ("%s:%u", addr, port); + + g_free (addr); + } + + if (proxy) + { + if (g_proxy_address_get_username(proxy)) + printf (" (Username: %s Password: %s)", + g_proxy_address_get_username(proxy), + g_proxy_address_get_password(proxy)); + printf (" (Hostname: %s, Port: %i)", + g_proxy_address_get_destination_hostname (proxy), + g_proxy_address_get_destination_port (proxy)); + } + + printf ("\n"); +} + +static void +_proxy_enumerate_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + GMainLoop *loop = user_data; + GSocketAddressEnumerator *enumerator = G_SOCKET_ADDRESS_ENUMERATOR (object); + GSocketAddress *sockaddr; + + sockaddr = g_socket_address_enumerator_next_finish (enumerator, + result, + &error); + if (sockaddr) + { + print_proxy_address (sockaddr); + g_socket_address_enumerator_next_async (enumerator, + cancellable, + _proxy_enumerate_cb, + loop); + g_object_unref (sockaddr); + } + else + { + if (error) + print_and_free_error (error); + + g_main_loop_quit (loop); + } +} + +static void +run_with_enumerator (gboolean synchronous, GSocketAddressEnumerator *enumerator) +{ + GError *error = NULL; + + if (synchronous) + { + GSocketAddress *sockaddr; + + while ((sockaddr = g_socket_address_enumerator_next (enumerator, + cancellable, + &error))) + { + print_proxy_address (sockaddr); + g_object_unref (sockaddr); + } + + if (error) + print_and_free_error (error); + } + else + { + GMainLoop *loop = g_main_loop_new (NULL, FALSE); + + g_socket_address_enumerator_next_async (enumerator, + cancellable, + _proxy_enumerate_cb, + loop); + g_main_loop_run (loop); + g_main_loop_unref (loop); + } +} + +static void +use_enumerator (gboolean synchronous) +{ + GSocketAddressEnumerator *enumerator; + + enumerator = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR, + "uri", info, + NULL); + + printf ("Proxies for URI '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +static void +use_inet_address (gboolean synchronous) +{ + GSocketAddressEnumerator *enumerator; + GSocketAddress *sockaddr; + GInetAddress *addr = NULL; + guint port = 0; + gchar **ip_and_port; + + ip_and_port = g_strsplit (info, ":", 2); + + if (ip_and_port[0]) + { + addr = g_inet_address_new_from_string (ip_and_port[0]); + if (ip_and_port [1]) + port = strtoul (ip_and_port [1], NULL, 10); + } + + g_strfreev (ip_and_port); + + if (addr == NULL || port <= 0 || port >= 65535) + { + fprintf (stderr, "Bad 'ip:port' parameter '%s'\n", info); + if (addr) + g_object_unref (addr); + return_value = 1; + return; + } + + sockaddr = g_inet_socket_address_new (addr, port); + g_object_unref (addr); + + enumerator = + g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr)); + g_object_unref (sockaddr); + + printf ("Proxies for ip and port '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +#ifdef G_OS_UNIX +static void +use_unix_address (gboolean synchronous) +{ + GSocketAddressEnumerator *enumerator; + GSocketAddress *sockaddr; + + sockaddr = g_unix_socket_address_new_with_type (info, -1, G_UNIX_SOCKET_ADDRESS_ABSTRACT); + + if (sockaddr == NULL) + { + fprintf (stderr, "Failed to create unix socket with name '%s'\n", info); + return_value = 1; + return; + } + + enumerator = + g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr)); + g_object_unref (sockaddr); + + printf ("Proxies for path '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} +#endif + +static void +use_proxy_address (gboolean synchronous) +{ + GSocketAddressEnumerator *enumerator; + GSocketAddress *sockaddr; + GInetAddress *addr; + guint port = 0; + gchar *protocol; + gchar *dest_host; + guint dest_port; + gchar *username = NULL; + gchar *password = NULL; + gchar **split_info; + + split_info = g_strsplit (info, ":", 7); + + if (!split_info[0] + || !split_info[1] + || !split_info[2] + || !split_info[3] + || !split_info[4]) + { + fprintf (stderr, "Bad 'ip:port:protocol:dest_host:dest_port' parameter '%s'\n", info); + return_value = 1; + return; + } + + addr = g_inet_address_new_from_string (split_info[0]); + port = strtoul (split_info [1], NULL, 10); + protocol = g_strdup (split_info[2]); + dest_host = g_strdup (split_info[3]); + dest_port = strtoul (split_info[4], NULL, 10); + + if (split_info[5]) + { + username = g_strdup (split_info[5]); + if (split_info[6]) + password = g_strdup (split_info[6]); + } + + g_strfreev (split_info); + + sockaddr = g_proxy_address_new (addr, port, + protocol, dest_host, dest_port, + username, password); + + g_object_unref (addr); + g_free (protocol); + g_free (dest_host); + g_free (username); + g_free (password); + + enumerator = + g_socket_connectable_proxy_enumerate (G_SOCKET_CONNECTABLE (sockaddr)); + g_object_unref (sockaddr); + + printf ("Proxies for ip and port '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +static void +use_network_address (gboolean synchronous) +{ + GError *error = NULL; + GSocketAddressEnumerator *enumerator; + GSocketConnectable *connectable; + + connectable = g_network_address_parse (info, -1, &error); + + if (error) + { + print_and_free_error (error); + return; + } + + enumerator = g_socket_connectable_proxy_enumerate (connectable); + g_object_unref (connectable); + + printf ("Proxies for hostname and port '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +static void +use_network_uri (gboolean synchronous) +{ + GError *error = NULL; + GSocketAddressEnumerator *enumerator; + GSocketConnectable *connectable; + + connectable = g_network_address_parse_uri (info, 0, &error); + + if (error) + { + print_and_free_error (error); + return; + } + + enumerator = g_socket_connectable_proxy_enumerate (connectable); + g_object_unref (connectable); + + printf ("Proxies for URI '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +static void +use_network_service (gboolean synchronous) +{ + GSocketAddressEnumerator *enumerator; + GSocketConnectable *connectable = NULL; + gchar **split; + + split = g_strsplit (info, "/", 3); + + if (split[0] && split[1] && split[2]) + connectable = g_network_service_new (split[0], split[1], split[2]); + + g_strfreev (split); + + if (connectable == NULL) + { + fprintf (stderr, "Bad 'srv/protocol/domain' parameter '%s'\n", info); + return_value = 1; + return; + } + + enumerator = g_socket_connectable_proxy_enumerate (connectable); + g_object_unref (connectable); + + printf ("Proxies for hostname and port '%s' are:\n", info); + run_with_enumerator (synchronous, enumerator); + + g_object_unref (enumerator); +} + +static void +_socket_connect_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + GMainLoop *loop = user_data; + GSocketClient *client = G_SOCKET_CLIENT (object); + GSocketConnection *connection; + + connection = g_socket_client_connect_to_uri_finish (client, + result, + &error); + if (connection) + { + GSocketAddress *proxy_addr; + proxy_addr = g_socket_connection_get_remote_address (connection, NULL); + print_proxy_address (proxy_addr); + } + else + { + print_and_free_error (error); + } + + g_main_loop_quit (loop); +} + +static void +use_socket_client (gboolean synchronous) +{ + GError *error = NULL; + GSocketClient *client; + + client = g_socket_client_new (); + + printf ("Proxies for URI '%s' are:\n", info); + + if (synchronous) + { + GSocketConnection *connection; + GSocketAddress *proxy_addr; + + connection = g_socket_client_connect_to_uri (client, + info, + 0, + cancellable, + &error); + + if (connection) + { + proxy_addr = g_socket_connection_get_remote_address (connection, NULL); + print_proxy_address (proxy_addr); + } + else + { + print_and_free_error (error); + } + } + else + { + GMainLoop *loop = g_main_loop_new (NULL, FALSE); + + g_socket_client_connect_to_uri_async (client, + info, + 0, + cancellable, + _socket_connect_cb, + loop); + + g_main_loop_run (loop); + g_main_loop_unref (loop); + } + + g_object_unref (client); +} + +typedef enum +{ + USE_RESOLVER, + USE_ENUMERATOR, +#ifdef G_OS_UNIX + USE_UNIX_SOCKET_ADDRESS, +#endif + USE_INET_SOCKET_ADDRESS, + USE_PROXY_ADDRESS, + USE_NETWORK_ADDRESS, + USE_NETWORK_URI, + USE_NETWORK_SERVICE, + USE_SOCKET_CLIENT, +} ProxyTestType; + +gint +main (gint argc, gchar **argv) +{ + gboolean synchronous = FALSE; + gboolean cancel = FALSE; + ProxyTestType type = USE_RESOLVER; + + while (argc >= 2 && argv[1][0] == '-') + { + if (!strcmp (argv[1], "-s")) + synchronous = TRUE; + else if (!strcmp (argv[1], "-c")) + cancel = TRUE; + else if (!strcmp (argv[1], "-e")) + type = USE_ENUMERATOR; + else if (!strcmp (argv[1], "-inet")) + type = USE_INET_SOCKET_ADDRESS; +#ifdef G_OS_UNIX + else if (!strcmp (argv[1], "-unix")) + type = USE_UNIX_SOCKET_ADDRESS; +#endif + else if (!strcmp (argv[1], "-proxyaddr")) + type = USE_PROXY_ADDRESS; + else if (!strcmp (argv[1], "-netaddr")) + type = USE_NETWORK_ADDRESS; + else if (!strcmp (argv[1], "-neturi")) + type = USE_NETWORK_URI; + else if (!strcmp (argv[1], "-netsrv")) + type = USE_NETWORK_SERVICE; + else if (!strcmp (argv[1], "-connect")) + type = USE_SOCKET_CLIENT; + else + usage (); + + argv++; + argc--; + } + + if (argc != 2) + usage (); + + /* Save URI for asynchronous callback */ + info = argv[1]; + + if (cancel) + { + cancellable = g_cancellable_new (); + g_cancellable_cancel (cancellable); + } + + switch (type) + { + case USE_RESOLVER: + use_resolver (synchronous); + break; + case USE_ENUMERATOR: + use_enumerator (synchronous); + break; + case USE_INET_SOCKET_ADDRESS: + use_inet_address (synchronous); + break; +#ifdef G_OS_UNIX + case USE_UNIX_SOCKET_ADDRESS: + use_unix_address (synchronous); + break; +#endif + case USE_PROXY_ADDRESS: + use_proxy_address (synchronous); + break; + case USE_NETWORK_ADDRESS: + use_network_address (synchronous); + break; + case USE_NETWORK_URI: + use_network_uri (synchronous); + break; + case USE_NETWORK_SERVICE: + use_network_service (synchronous); + break; + case USE_SOCKET_CLIENT: + use_socket_client (synchronous); + break; + } + + return return_value; +} diff --git a/gio/tests/readwrite.c b/gio/tests/readwrite.c new file mode 100644 index 0000000..0484d18 --- /dev/null +++ b/gio/tests/readwrite.c @@ -0,0 +1,297 @@ +#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 (error, G_IO_ERROR, G_IO_ERROR_CLOSED); + g_error_free (error); + + error = NULL; + res = g_io_stream_close (iostream, NULL, &error); + g_assert (res); + g_assert_no_error (error); + + 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); + g_object_unref (file); + + 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_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS); + g_error_free (error); + + 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_object_unref (file); + + 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); + g_object_unref (file); + + 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_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..02aa0c8 --- /dev/null +++ b/gio/tests/resolver.c @@ -0,0 +1,744 @@ +/* -*- 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 gboolean synchronous = FALSE; +static guint connectable_count = 0; +static GResolverRecordType record_type = 0; + +static void G_GNUC_NORETURN +usage (void) +{ + fprintf (stderr, "Usage: resolver [-s] [hostname | IP | service/protocol/domain ] ...\n"); + fprintf (stderr, "Usage: resolver [-s] [-t MX|TXT|NS|SOA] rrname ...\n"); + fprintf (stderr, " resolver [-s] -c NUMBER [hostname | IP | service/protocol/domain ]\n"); + fprintf (stderr, " Use -s to do synchronous lookups.\n"); + fprintf (stderr, " Use -c NUMBER (and only a single resolvable argument) to test GSocketConnectable.\n"); + fprintf (stderr, " The given NUMBER determines how many times the connectable will be enumerated.\n"); + fprintf (stderr, " Use -t with MX, TXT, NS or SOA to lookup DNS records of those types.\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), + (guint)g_srv_target_get_port (t->data), + (guint)g_srv_target_get_priority (t->data), + (guint)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 +print_resolved_mx (const char *rrname, + GList *records, + GError *error) +{ + const gchar *hostname; + guint16 priority; + GList *t; + + G_LOCK (response); + printf ("Domain: %s\n", rrname); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else if (!records) + { + printf ("no MX records\n"); + } + else + { + for (t = records; t; t = t->next) + { + g_variant_get (t->data, "(q&s)", &priority, &hostname); + printf ("%s (pri %u)\n", hostname, (guint)priority); + g_variant_unref (t->data); + } + g_list_free (records); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +print_resolved_txt (const char *rrname, + GList *records, + GError *error) +{ + const gchar **contents; + GList *t; + gint i; + + G_LOCK (response); + printf ("Domain: %s\n", rrname); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else if (!records) + { + printf ("no TXT records\n"); + } + else + { + for (t = records; t; t = t->next) + { + if (t != records) + printf ("\n"); + g_variant_get (t->data, "(^a&s)", &contents); + for (i = 0; contents[i] != NULL; i++) + printf ("%s\n", contents[i]); + g_variant_unref (t->data); + } + g_list_free (records); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +print_resolved_soa (const char *rrname, + GList *records, + GError *error) +{ + GList *t; + const gchar *primary_ns; + const gchar *administrator; + guint32 serial, refresh, retry, expire, ttl; + + G_LOCK (response); + printf ("Zone: %s\n", rrname); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else if (!records) + { + printf ("no SOA records\n"); + } + else + { + for (t = records; t; t = t->next) + { + g_variant_get (t->data, "(&s&suuuuu)", &primary_ns, &administrator, + &serial, &refresh, &retry, &expire, &ttl); + printf ("%s %s (serial %u, refresh %u, retry %u, expire %u, ttl %u)\n", + primary_ns, administrator, (guint)serial, (guint)refresh, + (guint)retry, (guint)expire, (guint)ttl); + g_variant_unref (t->data); + } + g_list_free (records); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +print_resolved_ns (const char *rrname, + GList *records, + GError *error) +{ + GList *t; + const gchar *hostname; + + G_LOCK (response); + printf ("Zone: %s\n", rrname); + if (error) + { + printf ("Error: %s\n", error->message); + g_error_free (error); + } + else if (!records) + { + printf ("no NS records\n"); + } + else + { + for (t = records; t; t = t->next) + { + g_variant_get (t->data, "(&s)", &hostname); + printf ("%s\n", hostname); + g_variant_unref (t->data); + } + g_list_free (records); + } + printf ("\n"); + + done_lookup (); + G_UNLOCK (response); +} + +static void +lookup_one_sync (const char *arg) +{ + GError *error = NULL; + + if (record_type != 0) + { + GList *records; + + records = g_resolver_lookup_records (resolver, arg, record_type, cancellable, &error); + switch (record_type) + { + case G_RESOLVER_RECORD_MX: + print_resolved_mx (arg, records, error); + break; + case G_RESOLVER_RECORD_SOA: + print_resolved_soa (arg, records, error); + break; + case G_RESOLVER_RECORD_NS: + print_resolved_ns (arg, records, error); + break; + case G_RESOLVER_RECORD_TXT: + print_resolved_txt (arg, records, error); + break; + default: + g_warn_if_reached (); + break; + } + } + else 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_sync_lookups (char **argv, int argc) +{ + int i; + + for (i = 0; i < argc; i++) + { + GThread *thread; + thread = g_thread_new ("lookup", lookup_thread, argv[i]); + g_thread_unref (thread); + } +} + +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 +lookup_records_callback (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + const char *arg = user_data; + GError *error = NULL; + GList *records; + + records = g_resolver_lookup_records_finish (resolver, result, &error); + + switch (record_type) + { + case G_RESOLVER_RECORD_MX: + print_resolved_mx (arg, records, error); + break; + case G_RESOLVER_RECORD_SOA: + print_resolved_soa (arg, records, error); + break; + case G_RESOLVER_RECORD_NS: + print_resolved_ns (arg, records, error); + break; + case G_RESOLVER_RECORD_TXT: + print_resolved_txt (arg, records, error); + break; + default: + g_warn_if_reached (); + break; + } +} + +static void +start_async_lookups (char **argv, int argc) +{ + int i; + + for (i = 0; i < argc; i++) + { + if (record_type != 0) + { + g_resolver_lookup_records_async (resolver, argv[i], record_type, + cancellable, lookup_records_callback, argv[i]); + } + else 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, guint count) +{ + 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); + } + + while (count--) + { + enumerator = g_socket_connectable_enumerate (connectable); + + if (synchronous) + do_sync_connectable (enumerator); + else + do_async_connectable (enumerator); + } + + g_object_unref (connectable); +} + +#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 + + +static gboolean +record_type_arg (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + if (g_ascii_strcasecmp (value, "MX") == 0) { + record_type = G_RESOLVER_RECORD_MX; + } else if (g_ascii_strcasecmp (value, "TXT") == 0) { + record_type = G_RESOLVER_RECORD_TXT; + } else if (g_ascii_strcasecmp (value, "SOA") == 0) { + record_type = G_RESOLVER_RECORD_SOA; + } else if (g_ascii_strcasecmp (value, "NS") == 0) { + record_type = G_RESOLVER_RECORD_NS; + } else { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Specify MX, TXT, NS or SOA for the special record lookup types"); + return FALSE; + } + + return TRUE; +} + +static const GOptionEntry option_entries[] = { + { "synchronous", 's', 0, G_OPTION_ARG_NONE, &synchronous, "Synchronous connections", NULL }, + { "connectable", 'c', 0, G_OPTION_ARG_INT, &connectable_count, "Connectable count", "C" }, + { "special-type", 't', 0, G_OPTION_ARG_CALLBACK, record_type_arg, "Record type like MX, TXT, NS or SOA", "RR" }, + { NULL }, +}; + +int +main (int argc, char **argv) +{ + GOptionContext *context; + GError *error = NULL; +#ifdef G_OS_UNIX + GIOChannel *chan; + guint watch; +#endif + + context = g_option_context_new ("lookups ..."); + g_option_context_add_main_entries (context, option_entries, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_printerr ("%s\n", error->message); + g_error_free (error); + usage(); + } + + if (argc < 2 || (argc > 2 && connectable_count)) + 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 (connectable_count) + { + nlookups = connectable_count; + do_connectable (argv[1], synchronous, connectable_count); + } + 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/resourceplugin.c b/gio/tests/resourceplugin.c new file mode 100644 index 0000000..b66d541 --- /dev/null +++ b/gio/tests/resourceplugin.c @@ -0,0 +1,18 @@ +#include + +void +g_io_module_load (GIOModule *module) +{ +} + +void +g_io_module_unload (GIOModule *module) +{ +} + +char ** +g_io_module_query (void) +{ + return NULL; +} + diff --git a/gio/tests/resources.c b/gio/tests/resources.c new file mode 100644 index 0000000..f7a7e83 --- /dev/null +++ b/gio/tests/resources.c @@ -0,0 +1,651 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2011 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 "gconstructor.h" +#include "test_resources2.h" + +static void +test_resource (GResource *resource) +{ + GError *error = NULL; + gboolean found, success; + gsize size; + guint32 flags; + GBytes *data; + char **children; + GInputStream *in; + char buffer[128]; + + found = g_resource_get_info (resource, + "/not/there", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (!found); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + + found = g_resource_get_info (resource, + "/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, G_RESOURCE_FLAGS_COMPRESSED); + + found = g_resource_get_info (resource, + "/a_prefix/test2.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, 0); + + found = g_resource_get_info (resource, + "/a_prefix/test2-alias.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, 0); + + data = g_resource_lookup_data (resource, + "/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_assert_no_error (error); + g_bytes_unref (data); + + in = g_resource_open_stream (resource, + "/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (in != NULL); + g_assert_no_error (error); + + success = g_input_stream_read_all (in, buffer, sizeof (buffer) - 1, + &size, + NULL, &error); + g_assert (success); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + buffer[size] = 0; + g_assert_cmpstr (buffer, ==, "test1\n"); + + g_input_stream_close (in, NULL, &error); + g_assert_no_error (error); + g_clear_object (&in); + + data = g_resource_lookup_data (resource, + "/a_prefix/test2.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test2\n"); + g_bytes_unref (data); + + data = g_resource_lookup_data (resource, + "/a_prefix/test2-alias.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test2\n"); + g_bytes_unref (data); + + children = g_resource_enumerate_children (resource, + "/not/here", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (children == NULL); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + + children = g_resource_enumerate_children (resource, + "/a_prefix", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (children != NULL); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (children), ==, 2); + g_strfreev (children); +} + +static void +test_resource_file (void) +{ + GResource *resource; + GError *error = NULL; + + resource = g_resource_load ("not-there", &error); + g_assert (resource == NULL); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + g_clear_error (&error); + + resource = g_resource_load ("test.gresource", &error); + g_assert (resource != NULL); + g_assert_no_error (error); + + test_resource (resource); + g_resource_unref (resource); +} + +static void +test_resource_data (void) +{ + GResource *resource; + GError *error = NULL; + gboolean loaded_file; + char *content; + gsize content_size; + GBytes *data; + + loaded_file = g_file_get_contents ("test.gresource", &content, &content_size, + NULL); + g_assert (loaded_file); + + data = g_bytes_new_take (content, content_size); + resource = g_resource_new_from_data (data, &error); + g_bytes_unref (data); + g_assert (resource != NULL); + g_assert_no_error (error); + + test_resource (resource); + + g_resource_unref (resource); +} + +static void +test_resource_registered (void) +{ + GResource *resource; + GError *error = NULL; + gboolean found, success; + gsize size; + guint32 flags; + GBytes *data; + char **children; + GInputStream *in; + char buffer[128]; + + resource = g_resource_load ("test.gresource", &error); + g_assert (resource != NULL); + g_assert_no_error (error); + + found = g_resources_get_info ("/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (!found); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + + g_resources_register (resource); + + found = g_resources_get_info ("/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert (flags == (G_RESOURCE_FLAGS_COMPRESSED)); + + found = g_resources_get_info ("/a_prefix/test2.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpint (flags, ==, 0); + + found = g_resources_get_info ("/a_prefix/test2-alias.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, 0); + + data = g_resources_lookup_data ("/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_assert_no_error (error); + g_bytes_unref (data); + + in = g_resources_open_stream ("/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (in != NULL); + g_assert_no_error (error); + + success = g_input_stream_read_all (in, buffer, sizeof (buffer) - 1, + &size, + NULL, &error); + g_assert (success); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + buffer[size] = 0; + g_assert_cmpstr (buffer, ==, "test1\n"); + + g_input_stream_close (in, NULL, &error); + g_assert_no_error (error); + g_clear_object (&in); + + data = g_resources_lookup_data ("/a_prefix/test2.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test2\n"); + g_bytes_unref (data); + + data = g_resources_lookup_data ("/a_prefix/test2-alias.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test2\n"); + g_bytes_unref (data); + + children = g_resources_enumerate_children ("/not/here", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (children == NULL); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + + children = g_resources_enumerate_children ("/a_prefix", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (children != NULL); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (children), ==, 2); + g_strfreev (children); + + g_resources_unregister (resource); + g_resource_unref (resource); + + found = g_resources_get_info ("/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (!found); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); +} + +static void +test_resource_automatic (void) +{ + GError *error = NULL; + gboolean found; + gsize size; + guint32 flags; + GBytes *data; + + found = g_resources_get_info ("/auto_loaded/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpint (flags, ==, 0); + + data = g_resources_lookup_data ("/auto_loaded/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_bytes_unref (data); +} + +static void +test_resource_manual (void) +{ + GError *error = NULL; + gboolean found; + gsize size; + guint32 flags; + GBytes *data; + + found = g_resources_get_info ("/manual_loaded/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, 0); + + data = g_resources_lookup_data ("/manual_loaded/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_bytes_unref (data); +} + +static void +test_resource_manual2 (void) +{ + GResource *resource; + GBytes *data; + gsize size; + GError *error = NULL; + + resource = _g_test2_get_resource (); + + data = g_resource_lookup_data (resource, + "/manual_loaded/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_bytes_unref (data); + + g_resource_unref (resource); +} + +static void +test_resource_module (void) +{ + GIOModule *module; + gboolean found; + gsize size; + guint32 flags; + GBytes *data; + GError *error; + + if (g_module_supported ()) + { + char *dir, *path; + + dir = g_get_current_dir (); + + path = g_strconcat (dir, G_DIR_SEPARATOR_S "libresourceplugin", NULL); + module = g_io_module_new (path); + g_free (path); + g_free (dir); + + error = NULL; + + found = g_resources_get_info ("/resourceplugin/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (!found); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + + g_type_module_use (G_TYPE_MODULE (module)); + + found = g_resources_get_info ("/resourceplugin/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (found); + g_assert_no_error (error); + g_assert_cmpint (size, ==, 6); + g_assert_cmpuint (flags, ==, 0); + + data = g_resources_lookup_data ("/resourceplugin/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &error); + g_assert (data != NULL); + g_assert_no_error (error); + size = g_bytes_get_size (data); + g_assert_cmpint (size, ==, 6); + g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); + g_bytes_unref (data); + + g_type_module_unuse (G_TYPE_MODULE (module)); + + found = g_resources_get_info ("/resourceplugin/test1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, + &size, &flags, &error); + g_assert (!found); + g_assert_error (error, G_RESOURCE_ERROR, G_RESOURCE_ERROR_NOT_FOUND); + g_clear_error (&error); + } +} + +static void +test_uri_query_info (void) +{ + GResource *resource; + GError *error = NULL; + gboolean loaded_file; + char *content; + gsize content_size; + GBytes *data; + GFile *file; + GFileInfo *info; + const char *content_type; + + loaded_file = g_file_get_contents ("test.gresource", &content, &content_size, + NULL); + g_assert (loaded_file); + + data = g_bytes_new_take (content, content_size); + resource = g_resource_new_from_data (data, &error); + g_bytes_unref (data); + g_assert (resource != NULL); + g_assert_no_error (error); + + g_resources_register (resource); + + file = g_file_new_for_uri ("resource://" "/a_prefix/test2-alias.txt"); + + info = g_file_query_info (file, "*", 0, NULL, &error); + g_assert_no_error (error); + + content_type = g_file_info_get_content_type (info); + g_assert (content_type); + g_assert_cmpstr (content_type, ==, "text/plain"); + + g_object_unref (info); + + g_object_unref (file); + + g_resources_unregister (resource); + g_resource_unref (resource); +} + +static void +test_uri_file (void) +{ + GResource *resource; + GError *error = NULL; + gboolean loaded_file; + char *content; + gsize content_size; + GBytes *data; + GFile *file; + GFileInfo *info; + gchar *name; + GFile *file2, *parent; + GFileEnumerator *enumerator; + gchar *scheme; + GFileAttributeInfoList *attrs; + GInputStream *stream; + gchar buf[1024]; + gboolean ret; + gssize skipped; + + loaded_file = g_file_get_contents ("test.gresource", &content, &content_size, + NULL); + g_assert (loaded_file); + + data = g_bytes_new_take (content, content_size); + resource = g_resource_new_from_data (data, &error); + g_bytes_unref (data); + g_assert (resource != NULL); + g_assert_no_error (error); + + g_resources_register (resource); + + file = g_file_new_for_uri ("resource://" "/a_prefix/test2-alias.txt"); + + g_assert (g_file_get_path (file) == NULL); + + name = g_file_get_parse_name (file); + g_assert_cmpstr (name, ==, "resource:///a_prefix/test2-alias.txt"); + g_free (name); + + name = g_file_get_uri (file); + g_assert_cmpstr (name, ==, "resource:///a_prefix/test2-alias.txt"); + g_free (name); + + g_assert (!g_file_is_native (file)); + g_assert (!g_file_has_uri_scheme (file, "http")); + g_assert (g_file_has_uri_scheme (file, "resource")); + scheme = g_file_get_uri_scheme (file); + g_assert_cmpstr (scheme, ==, "resource"); + g_free (scheme); + + file2 = g_file_dup (file); + g_assert (g_file_equal (file, file2)); + g_object_unref (file2); + + parent = g_file_get_parent (file); + enumerator = g_file_enumerate_children (parent, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, &error); + g_assert_no_error (error); + + file2 = g_file_get_child_for_display_name (parent, "test2-alias.txt", &error); + g_assert_no_error (error); + g_assert (g_file_equal (file, file2)); + g_object_unref (file2); + + info = g_file_enumerator_next_file (enumerator, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_object_unref (info); + + info = g_file_enumerator_next_file (enumerator, NULL, &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_object_unref (info); + + info = g_file_enumerator_next_file (enumerator, NULL, &error); + g_assert_no_error (error); + g_assert (info == NULL); + + g_file_enumerator_close (enumerator, NULL, &error); + g_assert_no_error (error); + g_object_unref (enumerator); + + file2 = g_file_new_for_uri ("resource://" "a_prefix/../a_prefix//test2-alias.txt"); + g_assert (g_file_equal (file, file2)); + + g_assert (g_file_has_prefix (file, parent)); + + name = g_file_get_relative_path (parent, file); + g_assert_cmpstr (name, ==, "test2-alias.txt"); + g_free (name); + + g_object_unref (parent); + + attrs = g_file_query_settable_attributes (file, NULL, &error); + g_assert_no_error (error); + g_file_attribute_info_list_unref (attrs); + + attrs = g_file_query_writable_namespaces (file, NULL, &error); + g_assert_no_error (error); + g_file_attribute_info_list_unref (attrs); + + stream = G_INPUT_STREAM (g_file_read (file, NULL, &error)); + g_assert_no_error (error); + g_assert_cmpint (g_seekable_tell (G_SEEKABLE (stream)), ==, 0); + g_assert (g_seekable_can_seek (G_SEEKABLE (G_SEEKABLE (stream)))); + ret = g_seekable_seek (G_SEEKABLE (stream), 1, G_SEEK_SET, NULL, &error); + g_assert (ret); + g_assert_no_error (error); + skipped = g_input_stream_skip (stream, 1, NULL, &error); + g_assert_cmpint (skipped, ==, 1); + g_assert_no_error (error); + + memset (buf, 0, 1024); + ret = g_input_stream_read_all (stream, &buf, 1024, NULL, NULL, &error); + g_assert (ret); + g_assert_no_error (error); + g_assert_cmpstr (buf, ==, "st2\n"); + info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (stream), + G_FILE_ATTRIBUTE_STANDARD_SIZE, + NULL, + &error); + g_assert_no_error (error); + g_assert (info != NULL); + g_assert_cmpint (g_file_info_get_size (info), ==, 6); + g_object_unref (info); + + ret = g_input_stream_close (stream, NULL, &error); + g_assert (ret); + g_assert_no_error (error); + g_object_unref (stream); + + g_object_unref (file); + g_object_unref (file2); + + g_resources_unregister (resource); + g_resource_unref (resource); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + _g_test2_register_resource (); + + g_test_add_func ("/resource/file", test_resource_file); + g_test_add_func ("/resource/data", test_resource_data); + g_test_add_func ("/resource/registered", test_resource_registered); + g_test_add_func ("/resource/manual", test_resource_manual); + g_test_add_func ("/resource/manual2", test_resource_manual2); +#ifdef G_HAS_CONSTRUCTORS + g_test_add_func ("/resource/automatic", test_resource_automatic); + /* This only uses automatic resources too, so it tests the constructors and destructors */ + g_test_add_func ("/resource/module", test_resource_module); +#endif + g_test_add_func ("/resource/uri/query-info", test_uri_query_info); + g_test_add_func ("/resource/uri/file", test_uri_file); + + return g_test_run(); +} diff --git a/gio/tests/schema-tests/array-default-not-in-choices.gschema.xml b/gio/tests/schema-tests/array-default-not-in-choices.gschema.xml new file mode 100644 index 0000000..b6fffc6 --- /dev/null +++ b/gio/tests/schema-tests/array-default-not-in-choices.gschema.xml @@ -0,0 +1,11 @@ + + + + + + + + ["first","last","second"] + + + diff --git a/gio/tests/schema-tests/bad-choice.gschema.xml b/gio/tests/schema-tests/bad-choice.gschema.xml new file mode 100644 index 0000000..07640d5 --- /dev/null +++ b/gio/tests/schema-tests/bad-choice.gschema.xml @@ -0,0 +1,14 @@ + + + + 'how' + + + + + + + + + + diff --git a/gio/tests/schema-tests/bad-key.gschema.xml b/gio/tests/schema-tests/bad-key.gschema.xml new file mode 100644 index 0000000..f98cc7c --- /dev/null +++ b/gio/tests/schema-tests/bad-key.gschema.xml @@ -0,0 +1,7 @@ + + + + '' + + + diff --git a/gio/tests/schema-tests/bad-key2.gschema.xml b/gio/tests/schema-tests/bad-key2.gschema.xml new file mode 100644 index 0000000..b7c4e7b --- /dev/null +++ b/gio/tests/schema-tests/bad-key2.gschema.xml @@ -0,0 +1,7 @@ + + + + '' + + + diff --git a/gio/tests/schema-tests/bad-key3.gschema.xml b/gio/tests/schema-tests/bad-key3.gschema.xml new file mode 100644 index 0000000..208a02d --- /dev/null +++ b/gio/tests/schema-tests/bad-key3.gschema.xml @@ -0,0 +1,7 @@ + + + + '' + + + diff --git a/gio/tests/schema-tests/bad-key4.gschema.xml b/gio/tests/schema-tests/bad-key4.gschema.xml new file mode 100644 index 0000000..6a3777c --- /dev/null +++ b/gio/tests/schema-tests/bad-key4.gschema.xml @@ -0,0 +1,7 @@ + + + + '' + + + diff --git a/gio/tests/schema-tests/bad-type.gschema.xml b/gio/tests/schema-tests/bad-type.gschema.xml new file mode 100644 index 0000000..9b74684 --- /dev/null +++ b/gio/tests/schema-tests/bad-type.gschema.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gio/tests/schema-tests/bare-alias.gschema.xml b/gio/tests/schema-tests/bare-alias.gschema.xml new file mode 100644 index 0000000..52184cd --- /dev/null +++ b/gio/tests/schema-tests/bare-alias.gschema.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gio/tests/schema-tests/cdata.gschema.xml b/gio/tests/schema-tests/cdata.gschema.xml new file mode 100644 index 0000000..be2aac8 --- /dev/null +++ b/gio/tests/schema-tests/cdata.gschema.xml @@ -0,0 +1,7 @@ + + + + ','']]]> + + + diff --git a/gio/tests/schema-tests/choice-alias.gschema.xml b/gio/tests/schema-tests/choice-alias.gschema.xml new file mode 100644 index 0000000..d5c9279 --- /dev/null +++ b/gio/tests/schema-tests/choice-alias.gschema.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + 'after' + + + diff --git a/gio/tests/schema-tests/choice-bad.gschema.xml b/gio/tests/schema-tests/choice-bad.gschema.xml new file mode 100644 index 0000000..4a2dbc2 --- /dev/null +++ b/gio/tests/schema-tests/choice-bad.gschema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + 'how' + + + diff --git a/gio/tests/schema-tests/choice-badtype.gschema.xml b/gio/tests/schema-tests/choice-badtype.gschema.xml new file mode 100644 index 0000000..88104c5 --- /dev/null +++ b/gio/tests/schema-tests/choice-badtype.gschema.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gio/tests/schema-tests/choice-invalid-alias.gschema.xml b/gio/tests/schema-tests/choice-invalid-alias.gschema.xml new file mode 100644 index 0000000..ae5bcd3 --- /dev/null +++ b/gio/tests/schema-tests/choice-invalid-alias.gschema.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + 'after' + + + diff --git a/gio/tests/schema-tests/choice-missing-value.gschema.xml b/gio/tests/schema-tests/choice-missing-value.gschema.xml new file mode 100644 index 0000000..d900fc5 --- /dev/null +++ b/gio/tests/schema-tests/choice-missing-value.gschema.xml @@ -0,0 +1,10 @@ + + + + + + + "a" + + + diff --git a/gio/tests/schema-tests/choice-shadowed-alias.gschema.xml b/gio/tests/schema-tests/choice-shadowed-alias.gschema.xml new file mode 100644 index 0000000..fb68e32 --- /dev/null +++ b/gio/tests/schema-tests/choice-shadowed-alias.gschema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + 'after' + + + diff --git a/gio/tests/schema-tests/choice-upside-down.gschema.xml b/gio/tests/schema-tests/choice-upside-down.gschema.xml new file mode 100644 index 0000000..ea6f532 --- /dev/null +++ b/gio/tests/schema-tests/choice-upside-down.gschema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + 'who' + + + diff --git a/gio/tests/schema-tests/choice.gschema.xml b/gio/tests/schema-tests/choice.gschema.xml new file mode 100644 index 0000000..c9d7426 --- /dev/null +++ b/gio/tests/schema-tests/choice.gschema.xml @@ -0,0 +1,14 @@ + + + + 'who' + + + + + + + + + + diff --git a/gio/tests/schema-tests/choices-wrong-type.gschema.xml b/gio/tests/schema-tests/choices-wrong-type.gschema.xml new file mode 100644 index 0000000..7e6f14c --- /dev/null +++ b/gio/tests/schema-tests/choices-wrong-type.gschema.xml @@ -0,0 +1,8 @@ + + + + + (1,"a") + + + diff --git a/gio/tests/schema-tests/default-in-aliases.gschema.xml b/gio/tests/schema-tests/default-in-aliases.gschema.xml new file mode 100644 index 0000000..81d639f --- /dev/null +++ b/gio/tests/schema-tests/default-in-aliases.gschema.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + 'pre' + + + diff --git a/gio/tests/schema-tests/default-not-in-choices.gschema.xml b/gio/tests/schema-tests/default-not-in-choices.gschema.xml new file mode 100644 index 0000000..ec4a08d --- /dev/null +++ b/gio/tests/schema-tests/default-not-in-choices.gschema.xml @@ -0,0 +1,11 @@ + + + + + + + + "next-to-last" + + + diff --git a/gio/tests/schema-tests/default-out-of-range.gschema.xml b/gio/tests/schema-tests/default-out-of-range.gschema.xml new file mode 100644 index 0000000..8b3cbd3 --- /dev/null +++ b/gio/tests/schema-tests/default-out-of-range.gschema.xml @@ -0,0 +1,8 @@ + + + + + -1 + + + diff --git a/gio/tests/schema-tests/empty-key.gschema.xml b/gio/tests/schema-tests/empty-key.gschema.xml new file mode 100644 index 0000000..3c5c05c --- /dev/null +++ b/gio/tests/schema-tests/empty-key.gschema.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-aliases.gschema.xml b/gio/tests/schema-tests/enum-with-aliases.gschema.xml new file mode 100644 index 0000000..e8c1e68 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-aliases.gschema.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + 'spam' + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-bad-default.gschema.xml b/gio/tests/schema-tests/enum-with-bad-default.gschema.xml new file mode 100644 index 0000000..aee0867 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-bad-default.gschema.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + 'nie' + + + diff --git a/gio/tests/schema-tests/enum-with-chained-alias.gschema.xml b/gio/tests/schema-tests/enum-with-chained-alias.gschema.xml new file mode 100644 index 0000000..65c31e3 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-chained-alias.gschema.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + 'spam' + + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-choice.gschema.xml b/gio/tests/schema-tests/enum-with-choice.gschema.xml new file mode 100644 index 0000000..50caf21 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-choice.gschema.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + 'spam' + + + + diff --git a/gio/tests/schema-tests/enum-with-invalid-alias.gschema.xml b/gio/tests/schema-tests/enum-with-invalid-alias.gschema.xml new file mode 100644 index 0000000..51a51fd --- /dev/null +++ b/gio/tests/schema-tests/enum-with-invalid-alias.gschema.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + 'spam' + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-repeated-alias.gschema.xml b/gio/tests/schema-tests/enum-with-repeated-alias.gschema.xml new file mode 100644 index 0000000..a13ef89 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-repeated-alias.gschema.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + 'spam' + + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-repeated-nick.gschema.xml b/gio/tests/schema-tests/enum-with-repeated-nick.gschema.xml new file mode 100644 index 0000000..8910711 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-repeated-nick.gschema.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-repeated-value.gschema.xml b/gio/tests/schema-tests/enum-with-repeated-value.gschema.xml new file mode 100644 index 0000000..a357d11 --- /dev/null +++ b/gio/tests/schema-tests/enum-with-repeated-value.gschema.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gio/tests/schema-tests/enum-with-shadow-alias.gschema.xml b/gio/tests/schema-tests/enum-with-shadow-alias.gschema.xml new file mode 100644 index 0000000..52e30ee --- /dev/null +++ b/gio/tests/schema-tests/enum-with-shadow-alias.gschema.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + 'spam' + + + + + + + diff --git a/gio/tests/schema-tests/enum.gschema.xml b/gio/tests/schema-tests/enum.gschema.xml new file mode 100644 index 0000000..8cf5879 --- /dev/null +++ b/gio/tests/schema-tests/enum.gschema.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + 'spam' + + + diff --git a/gio/tests/schema-tests/extend-and-shadow-indirect.gschema.xml b/gio/tests/schema-tests/extend-and-shadow-indirect.gschema.xml new file mode 100644 index 0000000..dc066dd --- /dev/null +++ b/gio/tests/schema-tests/extend-and-shadow-indirect.gschema.xml @@ -0,0 +1,17 @@ + + + + '' + + + + + + '' + + + + + + + diff --git a/gio/tests/schema-tests/extend-and-shadow.gschema.xml b/gio/tests/schema-tests/extend-and-shadow.gschema.xml new file mode 100644 index 0000000..79935b4 --- /dev/null +++ b/gio/tests/schema-tests/extend-and-shadow.gschema.xml @@ -0,0 +1,17 @@ + + + + '' + + + + + + '' + + + + + + + diff --git a/gio/tests/schema-tests/extend-missing.gschema.xml b/gio/tests/schema-tests/extend-missing.gschema.xml new file mode 100644 index 0000000..675803a --- /dev/null +++ b/gio/tests/schema-tests/extend-missing.gschema.xml @@ -0,0 +1,3 @@ + + + diff --git a/gio/tests/schema-tests/extend-nonlist.gschema.xml b/gio/tests/schema-tests/extend-nonlist.gschema.xml new file mode 100644 index 0000000..7008cee --- /dev/null +++ b/gio/tests/schema-tests/extend-nonlist.gschema.xml @@ -0,0 +1,4 @@ + + + + diff --git a/gio/tests/schema-tests/extend-self.gschema.xml b/gio/tests/schema-tests/extend-self.gschema.xml new file mode 100644 index 0000000..f5b0c3d --- /dev/null +++ b/gio/tests/schema-tests/extend-self.gschema.xml @@ -0,0 +1,3 @@ + + + diff --git a/gio/tests/schema-tests/extend-wrong-list-indirect.gschema.xml b/gio/tests/schema-tests/extend-wrong-list-indirect.gschema.xml new file mode 100644 index 0000000..a336db7 --- /dev/null +++ b/gio/tests/schema-tests/extend-wrong-list-indirect.gschema.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/gio/tests/schema-tests/extend-wrong-list.gschema.xml b/gio/tests/schema-tests/extend-wrong-list.gschema.xml new file mode 100644 index 0000000..4232dc2 --- /dev/null +++ b/gio/tests/schema-tests/extend-wrong-list.gschema.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/gio/tests/schema-tests/extending.gschema.xml b/gio/tests/schema-tests/extending.gschema.xml new file mode 100644 index 0000000..98882c7 --- /dev/null +++ b/gio/tests/schema-tests/extending.gschema.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/gio/tests/schema-tests/flags-aliased-default.gschema.xml b/gio/tests/schema-tests/flags-aliased-default.gschema.xml new file mode 100644 index 0000000..c36bd62 --- /dev/null +++ b/gio/tests/schema-tests/flags-aliased-default.gschema.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + ['speaking'] + + + + diff --git a/gio/tests/schema-tests/flags-bad-default.gschema.xml b/gio/tests/schema-tests/flags-bad-default.gschema.xml new file mode 100644 index 0000000..d412057 --- /dev/null +++ b/gio/tests/schema-tests/flags-bad-default.gschema.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + ['speaking'] + + + + diff --git a/gio/tests/schema-tests/flags-more-than-one-bit.gschema.xml b/gio/tests/schema-tests/flags-more-than-one-bit.gschema.xml new file mode 100644 index 0000000..ce2faaf --- /dev/null +++ b/gio/tests/schema-tests/flags-more-than-one-bit.gschema.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/gio/tests/schema-tests/flags-with-enum-attr.gschema.xml b/gio/tests/schema-tests/flags-with-enum-attr.gschema.xml new file mode 100644 index 0000000..a48547f --- /dev/null +++ b/gio/tests/schema-tests/flags-with-enum-attr.gschema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gio/tests/schema-tests/flags-with-enum-tag.gschema.xml b/gio/tests/schema-tests/flags-with-enum-tag.gschema.xml new file mode 100644 index 0000000..4b2fb90 --- /dev/null +++ b/gio/tests/schema-tests/flags-with-enum-tag.gschema.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/gio/tests/schema-tests/from-docs.gschema.xml b/gio/tests/schema-tests/from-docs.gschema.xml new file mode 100644 index 0000000..4fe45c7 --- /dev/null +++ b/gio/tests/schema-tests/from-docs.gschema.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + 10 + + + + + + + + + + + + + 'Joe' + + + + 'first' + + + + diff --git a/gio/tests/schema-tests/incomplete-list.gschema.xml b/gio/tests/schema-tests/incomplete-list.gschema.xml new file mode 100644 index 0000000..df33e84 --- /dev/null +++ b/gio/tests/schema-tests/incomplete-list.gschema.xml @@ -0,0 +1,7 @@ + + + + [1,2,3 + + + diff --git a/gio/tests/schema-tests/inherit-gettext-domain.gschema.xml b/gio/tests/schema-tests/inherit-gettext-domain.gschema.xml new file mode 100644 index 0000000..1f0ca89 --- /dev/null +++ b/gio/tests/schema-tests/inherit-gettext-domain.gschema.xml @@ -0,0 +1,8 @@ + + + + + 'value' + + + diff --git a/gio/tests/schema-tests/invalid-path.gschema.xml b/gio/tests/schema-tests/invalid-path.gschema.xml new file mode 100644 index 0000000..85ecd4c --- /dev/null +++ b/gio/tests/schema-tests/invalid-path.gschema.xml @@ -0,0 +1,3 @@ + + + diff --git a/gio/tests/schema-tests/key-in-list-indirect.gschema.xml b/gio/tests/schema-tests/key-in-list-indirect.gschema.xml new file mode 100644 index 0000000..6f0bea1 --- /dev/null +++ b/gio/tests/schema-tests/key-in-list-indirect.gschema.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/gio/tests/schema-tests/key-in-list.gschema.xml b/gio/tests/schema-tests/key-in-list.gschema.xml new file mode 100644 index 0000000..e2a967a --- /dev/null +++ b/gio/tests/schema-tests/key-in-list.gschema.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/gio/tests/schema-tests/list-of-missing.gschema.xml b/gio/tests/schema-tests/list-of-missing.gschema.xml new file mode 100644 index 0000000..f5ef476 --- /dev/null +++ b/gio/tests/schema-tests/list-of-missing.gschema.xml @@ -0,0 +1,3 @@ + + + diff --git a/gio/tests/schema-tests/missing-quotes.gschema.xml b/gio/tests/schema-tests/missing-quotes.gschema.xml new file mode 100644 index 0000000..4400a62 --- /dev/null +++ b/gio/tests/schema-tests/missing-quotes.gschema.xml @@ -0,0 +1,7 @@ + + + + foo + + + diff --git a/gio/tests/schema-tests/no-default.gschema.xml b/gio/tests/schema-tests/no-default.gschema.xml new file mode 100644 index 0000000..5496ce3 --- /dev/null +++ b/gio/tests/schema-tests/no-default.gschema.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/gio/tests/schema-tests/overflow.gschema.xml b/gio/tests/schema-tests/overflow.gschema.xml new file mode 100644 index 0000000..19d4176 --- /dev/null +++ b/gio/tests/schema-tests/overflow.gschema.xml @@ -0,0 +1,7 @@ + + + + 512 + + + diff --git a/gio/tests/schema-tests/override-missing.gschema.xml b/gio/tests/schema-tests/override-missing.gschema.xml new file mode 100644 index 0000000..9a3c781 --- /dev/null +++ b/gio/tests/schema-tests/override-missing.gschema.xml @@ -0,0 +1,11 @@ + + + + 'bar' + + + + + 'baz' + + diff --git a/gio/tests/schema-tests/override-range-error.gschema.xml b/gio/tests/schema-tests/override-range-error.gschema.xml new file mode 100644 index 0000000..4887ac3 --- /dev/null +++ b/gio/tests/schema-tests/override-range-error.gschema.xml @@ -0,0 +1,12 @@ + + + + + 10 + + + + + 77 + + diff --git a/gio/tests/schema-tests/override-then-key.gschema.xml b/gio/tests/schema-tests/override-then-key.gschema.xml new file mode 100644 index 0000000..85b70bd --- /dev/null +++ b/gio/tests/schema-tests/override-then-key.gschema.xml @@ -0,0 +1,15 @@ + + + + 'bar' + + + + + 'baz' + + + + + + diff --git a/gio/tests/schema-tests/override-twice.gschema.xml b/gio/tests/schema-tests/override-twice.gschema.xml new file mode 100644 index 0000000..fe6bb64 --- /dev/null +++ b/gio/tests/schema-tests/override-twice.gschema.xml @@ -0,0 +1,12 @@ + + + + 'bar' + + + + + 'baz' + 'baz' + + diff --git a/gio/tests/schema-tests/override-type-error.gschema.xml b/gio/tests/schema-tests/override-type-error.gschema.xml new file mode 100644 index 0000000..a16ec02 --- /dev/null +++ b/gio/tests/schema-tests/override-type-error.gschema.xml @@ -0,0 +1,11 @@ + + + + 10 + + + + + 37.5 + + diff --git a/gio/tests/schema-tests/override.gschema.xml b/gio/tests/schema-tests/override.gschema.xml new file mode 100644 index 0000000..6309884 --- /dev/null +++ b/gio/tests/schema-tests/override.gschema.xml @@ -0,0 +1,34 @@ + + + + 'bar' + + + + + 10 + + + + + + + + + 'aaaaa' + + + + + + + + 'baz' + 0 + 'aaa' + + + + 'foo' + + diff --git a/gio/tests/schema-tests/range-badtype.gschema.xml b/gio/tests/schema-tests/range-badtype.gschema.xml new file mode 100644 index 0000000..14a7217 --- /dev/null +++ b/gio/tests/schema-tests/range-badtype.gschema.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/gio/tests/schema-tests/range-default-high.gschema.xml b/gio/tests/schema-tests/range-default-high.gschema.xml new file mode 100644 index 0000000..b5feb3e --- /dev/null +++ b/gio/tests/schema-tests/range-default-high.gschema.xml @@ -0,0 +1,8 @@ + + + + 28 + + + + diff --git a/gio/tests/schema-tests/range-default-low.gschema.xml b/gio/tests/schema-tests/range-default-low.gschema.xml new file mode 100644 index 0000000..f8fb9ef --- /dev/null +++ b/gio/tests/schema-tests/range-default-low.gschema.xml @@ -0,0 +1,8 @@ + + + + 21 + + + + diff --git a/gio/tests/schema-tests/range-high-default.gschema.xml b/gio/tests/schema-tests/range-high-default.gschema.xml new file mode 100644 index 0000000..0f01fc8 --- /dev/null +++ b/gio/tests/schema-tests/range-high-default.gschema.xml @@ -0,0 +1,8 @@ + + + + + 28 + + + diff --git a/gio/tests/schema-tests/range-low-default.gschema.xml b/gio/tests/schema-tests/range-low-default.gschema.xml new file mode 100644 index 0000000..49db491 --- /dev/null +++ b/gio/tests/schema-tests/range-low-default.gschema.xml @@ -0,0 +1,8 @@ + + + + + 21 + + + diff --git a/gio/tests/schema-tests/range-missing-max.gschema.xml b/gio/tests/schema-tests/range-missing-max.gschema.xml new file mode 100644 index 0000000..c5c43b9 --- /dev/null +++ b/gio/tests/schema-tests/range-missing-max.gschema.xml @@ -0,0 +1,8 @@ + + + + + 200 + + + diff --git a/gio/tests/schema-tests/range-missing-min.gschema.xml b/gio/tests/schema-tests/range-missing-min.gschema.xml new file mode 100644 index 0000000..f4de90c --- /dev/null +++ b/gio/tests/schema-tests/range-missing-min.gschema.xml @@ -0,0 +1,8 @@ + + + + + 2 + + + diff --git a/gio/tests/schema-tests/range-parse-error.gschema.xml b/gio/tests/schema-tests/range-parse-error.gschema.xml new file mode 100644 index 0000000..58ddb50 --- /dev/null +++ b/gio/tests/schema-tests/range-parse-error.gschema.xml @@ -0,0 +1,8 @@ + + + + + 25 + + + diff --git a/gio/tests/schema-tests/range-type-test.gschema.xml b/gio/tests/schema-tests/range-type-test.gschema.xml new file mode 100644 index 0000000..80072bb --- /dev/null +++ b/gio/tests/schema-tests/range-type-test.gschema.xml @@ -0,0 +1,76 @@ + + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + + + 0 + + + + 0 + + + diff --git a/gio/tests/schema-tests/range-wrong-type.gschema.xml b/gio/tests/schema-tests/range-wrong-type.gschema.xml new file mode 100644 index 0000000..033767f --- /dev/null +++ b/gio/tests/schema-tests/range-wrong-type.gschema.xml @@ -0,0 +1,8 @@ + + + + + "a" + + + diff --git a/gio/tests/schema-tests/range.gschema.xml b/gio/tests/schema-tests/range.gschema.xml new file mode 100644 index 0000000..59118bd --- /dev/null +++ b/gio/tests/schema-tests/range.gschema.xml @@ -0,0 +1,8 @@ + + + + + 25 + + + diff --git a/gio/tests/schema-tests/wrong-category.gschema.xml b/gio/tests/schema-tests/wrong-category.gschema.xml new file mode 100644 index 0000000..c548248 --- /dev/null +++ b/gio/tests/schema-tests/wrong-category.gschema.xml @@ -0,0 +1,7 @@ + + + + 'foo' + + + diff --git a/gio/tests/send-data.c b/gio/tests/send-data.c new file mode 100644 index 0000000..a30bdca --- /dev/null +++ b/gio/tests/send-data.c @@ -0,0 +1,207 @@ +#include +#include +#include + +GMainLoop *loop; + +int cancel_timeout = 0; +int io_timeout = 0; +gboolean async = FALSE; +gboolean graceful = FALSE; +gboolean verbose = 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}, + {"timeout", 't', 0, G_OPTION_ARG_INT, &io_timeout, + "Time out socket I/O after the specified number of seconds", NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + "Verbose debugging output", 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); +} + +static void +socket_client_event (GSocketClient *client, + GSocketClientEvent event, + GSocketConnectable *connectable, + GSocketConnection *connection) +{ + static GEnumClass *event_class; + GTimeVal tv; + + if (!event_class) + event_class = g_type_class_ref (G_TYPE_SOCKET_CLIENT_EVENT); + + g_get_current_time (&tv); + printf ("% 12ld.%06ld GSocketClient => %s [%s]\n", + tv.tv_sec, tv.tv_usec, + g_enum_get_value (event_class, event)->value_nick, + connection ? G_OBJECT_TYPE_NAME (connection) : ""); +} + +int +main (int argc, char *argv[]) +{ + GOptionContext *context; + GSocketClient *client; + GSocketConnection *connection; + GSocketAddress *address; + GCancellable *cancellable; + GOutputStream *out; + GError *error = NULL; + char buffer[1000]; + + 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) + { + GThread *thread; + cancellable = g_cancellable_new (); + thread = g_thread_new ("cancel", cancel_thread, cancellable); + g_thread_unref (thread); + } + else + { + cancellable = NULL; + } + + client = g_socket_client_new (); + if (io_timeout) + g_socket_client_set_timeout (client, io_timeout); + if (verbose) + g_signal_connect (client, "event", G_CALLBACK (socket_client_event), NULL); + + 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/services/Makefile.am b/gio/tests/services/Makefile.am new file mode 100644 index 0000000..7ab7864 --- /dev/null +++ b/gio/tests/services/Makefile.am @@ -0,0 +1,2 @@ +EXTRA_DIST = \ + org.gtk.GDBus.Examples.ObjectManager.service.in diff --git a/gio/tests/services/org.gtk.GDBus.Examples.ObjectManager.service.in b/gio/tests/services/org.gtk.GDBus.Examples.ObjectManager.service.in new file mode 100644 index 0000000..5820b1a --- /dev/null +++ b/gio/tests/services/org.gtk.GDBus.Examples.ObjectManager.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.gtk.GDBus.Examples.ObjectManager +Exec=@abs_top_builddir@/gio/tests/gdbus-example-objectmanager-server diff --git a/gio/tests/simple-async-result.c b/gio/tests/simple-async-result.c new file mode 100644 index 0000000..e9b089e --- /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); + g_assert (g_async_result_get_user_data (G_ASYNC_RESULT (result)) == b); + 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 G_SOURCE_REMOVE; +} + +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_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/simple-proxy.c b/gio/tests/simple-proxy.c new file mode 100644 index 0000000..306ebdd --- /dev/null +++ b/gio/tests/simple-proxy.c @@ -0,0 +1,236 @@ +/* GStaticProxyResolver tests + * + * Copyright 2011, 2013 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, see + * . + */ + +#include + +static void +test_uris (void) +{ + GProxyResolver *resolver; + gchar *ignore_hosts[2] = { "127.0.0.1", NULL }; + gchar **proxies; + GError *error = NULL; + + resolver = g_simple_proxy_resolver_new ("default://", ignore_hosts); + g_simple_proxy_resolver_set_uri_proxy (G_SIMPLE_PROXY_RESOLVER (resolver), + "http", "http://proxy.example.com"); + g_simple_proxy_resolver_set_uri_proxy (G_SIMPLE_PROXY_RESOLVER (resolver), + "ftp", "ftp://proxy.example.com"); + + proxies = g_proxy_resolver_lookup (resolver, "http://one.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "http://proxy.example.com"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "HTTP://uppercase.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "http://proxy.example.com"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "htt://missing-letter.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "default://"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "https://extra-letter.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "default://"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "ftp://five.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "ftp://proxy.example.com"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "http://127.0.0.1/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "direct://"); + g_strfreev (proxies); + + g_object_unref (resolver); +} + +static void +test_socks (void) +{ + GProxyResolver *resolver; + gchar *ignore_hosts[2] = { "127.0.0.1", NULL }; + gchar **proxies; + GError *error = NULL; + + resolver = g_simple_proxy_resolver_new ("socks://proxy.example.com", ignore_hosts); + + proxies = g_proxy_resolver_lookup (resolver, "http://one.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 3); + g_assert_cmpstr (proxies[0], ==, "socks5://proxy.example.com"); + g_assert_cmpstr (proxies[1], ==, "socks4a://proxy.example.com"); + g_assert_cmpstr (proxies[2], ==, "socks4://proxy.example.com"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "http://127.0.0.1/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "direct://"); + g_strfreev (proxies); + + g_object_unref (resolver); + + resolver = g_simple_proxy_resolver_new ("default-proxy://", ignore_hosts); + g_simple_proxy_resolver_set_uri_proxy (G_SIMPLE_PROXY_RESOLVER (resolver), + "http", "socks://proxy.example.com"); + + proxies = g_proxy_resolver_lookup (resolver, "http://one.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 3); + g_assert_cmpstr (proxies[0], ==, "socks5://proxy.example.com"); + g_assert_cmpstr (proxies[1], ==, "socks4a://proxy.example.com"); + g_assert_cmpstr (proxies[2], ==, "socks4://proxy.example.com"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "ftp://two.example.com/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "default-proxy://"); + g_strfreev (proxies); + + proxies = g_proxy_resolver_lookup (resolver, "http://127.0.0.1/", + NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (g_strv_length (proxies), ==, 1); + g_assert_cmpstr (proxies[0], ==, "direct://"); + g_strfreev (proxies); + + g_object_unref (resolver); +} + +static const char *ignore_hosts[] = { + ".bbb.xx", + "*.ccc.xx", + "ddd.xx", + "*.eee.xx:8000", + "127.0.0.0/24", + "10.0.0.1:8000", + "::1", + "fe80::/10", + NULL +}; + +static const struct { + const char *uri; + const char *proxy; +} ignore_tests[] = { + { "http://aaa.xx/", "http://localhost:8080" }, + { "http://aaa.xx:8000/", "http://localhost:8080" }, + { "http://www.aaa.xx/", "http://localhost:8080" }, + { "http://www.aaa.xx:8000/", "http://localhost:8080" }, + { "https://aaa.xx/", "http://localhost:8080" }, + { "http://bbb.xx/", "direct://" }, + { "http://www.bbb.xx/", "direct://" }, + { "http://bbb.xx:8000/", "direct://" }, + { "http://www.bbb.xx:8000/", "direct://" }, + { "https://bbb.xx/", "direct://" }, + { "http://nobbb.xx/", "http://localhost:8080" }, + { "http://www.nobbb.xx/", "http://localhost:8080" }, + { "http://nobbb.xx:8000/", "http://localhost:8080" }, + { "http://www.nobbb.xx:8000/", "http://localhost:8080" }, + { "https://nobbb.xx/", "http://localhost:8080" }, + { "http://ccc.xx/", "direct://" }, + { "http://www.ccc.xx/", "direct://" }, + { "http://ccc.xx:8000/", "direct://" }, + { "http://www.ccc.xx:8000/", "direct://" }, + { "https://ccc.xx/", "direct://" }, + { "http://ddd.xx/", "direct://" }, + { "http://ddd.xx:8000/", "direct://" }, + { "http://www.ddd.xx/", "direct://" }, + { "http://www.ddd.xx:8000/", "direct://" }, + { "https://ddd.xx/", "direct://" }, + { "http://eee.xx/", "http://localhost:8080" }, + { "http://eee.xx:8000/", "direct://" }, + { "http://www.eee.xx/", "http://localhost:8080" }, + { "http://www.eee.xx:8000/", "direct://" }, + { "https://eee.xx/", "http://localhost:8080" }, + { "http://1.2.3.4/", "http://localhost:8080" }, + { "http://127.0.0.1/", "direct://" }, + { "http://127.0.0.2/", "direct://" }, + { "http://127.0.0.255/", "direct://" }, + { "http://127.0.1.0/", "http://localhost:8080" }, + { "http://10.0.0.1/", "http://localhost:8080" }, + { "http://10.0.0.1:8000/", "direct://" }, + { "http://[::1]/", "direct://" }, + { "http://[::1]:80/", "direct://" }, + { "http://[::1:1]/", "http://localhost:8080" }, + { "http://[::1:1]:80/", "http://localhost:8080" }, + { "http://[fe80::1]/", "direct://" }, + { "http://[fe80::1]:80/", "direct://" }, + { "http://[fec0::1]/", "http://localhost:8080" }, + { "http://[fec0::1]:80/", "http://localhost:8080" } +}; +static const int n_ignore_tests = G_N_ELEMENTS (ignore_tests); + +static void +test_ignore (void) +{ + GProxyResolver *resolver; + GError *error = NULL; + char **proxies; + int i; + + resolver = g_simple_proxy_resolver_new ("http://localhost:8080", + (char **)ignore_hosts); + + for (i = 0; i < n_ignore_tests; i++) + { + proxies = g_proxy_resolver_lookup (resolver, ignore_tests[i].uri, + NULL, &error); + g_assert_no_error (error); + + g_assert_cmpstr (proxies[0], ==, ignore_tests[i].proxy); + g_strfreev (proxies); + } +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/static-proxy/uri", test_uris); + g_test_add_func ("/static-proxy/socks", test_socks); + g_test_add_func ("/static-proxy/ignore", test_ignore); + + return g_test_run(); +} diff --git a/gio/tests/sleepy-stream.c b/gio/tests/sleepy-stream.c new file mode 100644 index 0000000..4d3ca1d --- /dev/null +++ b/gio/tests/sleepy-stream.c @@ -0,0 +1,292 @@ +/* + * 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, G_IO_ERROR, G_IO_ERROR_FAILED, "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; + char *str; + + 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_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..62dda89 --- /dev/null +++ b/gio/tests/socket-client.c @@ -0,0 +1,444 @@ +#include +#include +#include +#include +#include +#include + +#include "gtlsconsoleinteraction.h" + +GMainLoop *loop; + +gboolean verbose = FALSE; +gboolean non_blocking = FALSE; +gboolean use_udp = FALSE; +int cancel_timeout = 0; +int read_timeout = 0; +gboolean unix_socket = FALSE; +gboolean tls = FALSE; + +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}, +#ifdef G_OS_UNIX + {"unix", 'U', 0, G_OPTION_ARG_NONE, &unix_socket, + "Use a unix socket instead of IP", NULL}, +#endif + {"timeout", 't', 0, G_OPTION_ARG_INT, &read_timeout, + "Time out reads after the specified number of seconds", NULL}, + {"tls", 'T', 0, G_OPTION_ARG_NONE, &tls, + "Use TLS (SSL)", NULL}, + {NULL} +}; + +#include "socket-common.c" + +static gboolean +accept_certificate (GTlsClientConnection *conn, + GTlsCertificate *cert, + GTlsCertificateFlags errors, + gpointer user_data) +{ + g_print ("Certificate would have been rejected ( "); + if (errors & G_TLS_CERTIFICATE_UNKNOWN_CA) + g_print ("unknown-ca "); + if (errors & G_TLS_CERTIFICATE_BAD_IDENTITY) + g_print ("bad-identity "); + if (errors & G_TLS_CERTIFICATE_NOT_ACTIVATED) + g_print ("not-activated "); + if (errors & G_TLS_CERTIFICATE_EXPIRED) + g_print ("expired "); + if (errors & G_TLS_CERTIFICATE_REVOKED) + g_print ("revoked "); + if (errors & G_TLS_CERTIFICATE_INSECURE) + g_print ("insecure "); + g_print (") but accepting anyway.\n"); + + return TRUE; +} + +static GTlsCertificate * +lookup_client_certificate (GTlsClientConnection *conn, + GError **error) +{ + GList *l, *accepted; + GList *c, *certificates; + GTlsDatabase *database; + GTlsCertificate *certificate = NULL; + GTlsConnection *base; + + accepted = g_tls_client_connection_get_accepted_cas (conn); + for (l = accepted; l != NULL; l = g_list_next (l)) + { + base = G_TLS_CONNECTION (conn); + database = g_tls_connection_get_database (base); + certificates = g_tls_database_lookup_certificates_issued_by (database, l->data, + g_tls_connection_get_interaction (base), + G_TLS_DATABASE_LOOKUP_KEYPAIR, + NULL, error); + if (error && *error) + break; + + if (certificates) + certificate = g_object_ref (certificates->data); + + for (c = certificates; c != NULL; c = g_list_next (c)) + g_object_unref (c->data); + g_list_free (certificates); + } + + for (l = accepted; l != NULL; l = g_list_next (l)) + g_byte_array_unref (l->data); + g_list_free (accepted); + + if (certificate == NULL && error && !*error) + g_set_error_literal (error, G_TLS_ERROR, G_TLS_ERROR_CERTIFICATE_REQUIRED, + "Server requested a certificate, but could not find relevant certificate in database."); + return certificate; +} + +static gboolean +make_connection (const char *argument, + GTlsCertificate *certificate, + GCancellable *cancellable, + GSocket **socket, + GSocketAddress **address, + GIOStream **connection, + GInputStream **istream, + GOutputStream **ostream, + GError **error) +{ + GSocketType socket_type; + GSocketFamily socket_family; + GSocketAddressEnumerator *enumerator; + GSocketConnectable *connectable; + GSocketAddress *src_address; + GTlsInteraction *interaction; + GError *err = NULL; + + if (use_udp) + socket_type = G_SOCKET_TYPE_DATAGRAM; + else + socket_type = G_SOCKET_TYPE_STREAM; + + if (unix_socket) + socket_family = G_SOCKET_FAMILY_UNIX; + else + socket_family = G_SOCKET_FAMILY_IPV4; + + *socket = g_socket_new (socket_family, socket_type, 0, error); + if (*socket == NULL) + return FALSE; + + if (read_timeout) + g_socket_set_timeout (*socket, read_timeout); + + if (unix_socket) + { + GSocketAddress *addr; + + addr = socket_address_from_string (argument); + if (addr == NULL) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Could not parse '%s' as unix socket name", argument); + return FALSE; + } + connectable = G_SOCKET_CONNECTABLE (addr); + } + else + { + connectable = g_network_address_parse (argument, 7777, error); + if (connectable == NULL) + return FALSE; + } + + enumerator = g_socket_connectable_enumerate (connectable); + while (TRUE) + { + *address = g_socket_address_enumerator_next (enumerator, cancellable, error); + if (*address == NULL) + { + if (error != NULL && *error == NULL) + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "No more addresses to try"); + return FALSE; + } + + if (g_socket_connect (*socket, *address, cancellable, &err)) + break; + g_message ("Connection to %s failed: %s, trying next\n", socket_address_to_string (*address), err->message); + g_clear_error (&err); + + g_object_unref (*address); + } + g_object_unref (enumerator); + + g_print ("Connected to %s\n", + socket_address_to_string (*address)); + + src_address = g_socket_get_local_address (*socket, error); + if (!src_address) + { + g_prefix_error (error, "Error getting local address: "); + return FALSE; + } + + g_print ("local address: %s\n", + socket_address_to_string (src_address)); + g_object_unref (src_address); + + if (use_udp) + { + *connection = NULL; + *istream = NULL; + *ostream = NULL; + } + else + *connection = G_IO_STREAM (g_socket_connection_factory_create_connection (*socket)); + + if (tls) + { + GIOStream *tls_conn; + + tls_conn = g_tls_client_connection_new (*connection, connectable, error); + if (!tls_conn) + { + g_prefix_error (error, "Could not create TLS connection: "); + return FALSE; + } + + g_signal_connect (tls_conn, "accept-certificate", + G_CALLBACK (accept_certificate), NULL); + + interaction = g_tls_console_interaction_new (); + g_tls_connection_set_interaction (G_TLS_CONNECTION (tls_conn), interaction); + g_object_unref (interaction); + + if (certificate) + g_tls_connection_set_certificate (G_TLS_CONNECTION (tls_conn), certificate); + + g_object_unref (*connection); + *connection = G_IO_STREAM (tls_conn); + + if (!g_tls_connection_handshake (G_TLS_CONNECTION (tls_conn), + cancellable, error)) + { + g_prefix_error (error, "Error during TLS handshake: "); + return FALSE; + } + } + g_object_unref (connectable); + + if (*connection) + { + *istream = g_io_stream_get_input_stream (*connection); + *ostream = g_io_stream_get_output_stream (*connection); + } + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + GSocket *socket; + GSocketAddress *address; + GError *error = NULL; + GOptionContext *context; + GCancellable *cancellable; + GIOStream *connection; + GInputStream *istream; + GOutputStream *ostream; + GSocketAddress *src_address; + GTlsCertificate *certificate = NULL; + gint i; + + address = NULL; + connection = NULL; + + 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 / unix socket name"); + return 1; + } + + if (use_udp && tls) + { + g_printerr ("DTLS (TLS over UDP) is not supported"); + return 1; + } + + if (cancel_timeout) + { + GThread *thread; + cancellable = g_cancellable_new (); + thread = g_thread_new ("cancel", cancel_thread, cancellable); + g_thread_unref (thread); + } + else + { + cancellable = NULL; + } + + loop = g_main_loop_new (NULL, FALSE); + + for (i = 0; i < 2; i++) + { + if (make_connection (argv[1], certificate, cancellable, &socket, &address, + &connection, &istream, &ostream, &error)) + break; + + if (g_error_matches (error, G_TLS_ERROR, G_TLS_ERROR_CERTIFICATE_REQUIRED)) + { + g_clear_error (&error); + certificate = lookup_client_certificate (G_TLS_CLIENT_CONNECTION (connection), &error); + if (certificate != NULL) + continue; + } + + g_printerr ("%s: %s", argv[0], error->message); + return 1; + } + + /* TODO: Test non-blocking connect/handshake */ + if (non_blocking) + g_socket_set_blocking (socket, FALSE); + + 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) + { + if (use_udp) + { + ensure_socket_condition (socket, G_IO_OUT, cancellable); + size = g_socket_send_to (socket, address, + buffer, to_send, + cancellable, &error); + } + else + { + ensure_connection_condition (connection, G_IO_OUT, cancellable); + size = g_output_stream_write (ostream, + 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; + } + + if (use_udp) + { + ensure_socket_condition (socket, G_IO_IN, cancellable); + size = g_socket_receive_from (socket, &src_address, + buffer, sizeof buffer, + cancellable, &error); + } + else + { + ensure_connection_condition (connection, G_IO_IN, cancellable); + size = g_input_stream_read (istream, + 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 (connection) + { + if (!g_io_stream_close (connection, cancellable, &error)) + { + g_printerr ("Error closing connection: %s\n", + error->message); + return 1; + } + g_object_unref (connection); + } + else + { + if (!g_socket_close (socket, &error)) + { + g_printerr ("Error closing master socket: %s\n", + error->message); + return 1; + } + } + + g_object_unref (socket); + g_object_unref (address); + + return 0; +} diff --git a/gio/tests/socket-common.c b/gio/tests/socket-common.c new file mode 100644 index 0000000..e59fa9c --- /dev/null +++ b/gio/tests/socket-common.c @@ -0,0 +1,123 @@ +/* #included into both socket-client.c and socket-server.c */ + +#ifdef G_OS_UNIX +static const char *unix_socket_address_types[] = { + "invalid", + "anonymous", + "path", + "abstract", + "padded" +}; +#endif + +static char * +socket_address_to_string (GSocketAddress *address) +{ + char *res = NULL; + + if (G_IS_INET_SOCKET_ADDRESS (address)) + { + GInetAddress *inet_address; + char *str; + 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); + } +#ifdef G_OS_UNIX + else if (G_IS_UNIX_SOCKET_ADDRESS (address)) + { + GUnixSocketAddress *uaddr = G_UNIX_SOCKET_ADDRESS (address); + + res = g_strdup_printf ("%s:%s", + unix_socket_address_types[g_unix_socket_address_get_address_type (uaddr)], + g_unix_socket_address_get_path (uaddr)); + } +#endif + + return res; +} + +static GSocketAddress * +socket_address_from_string (const char *name) +{ +#ifdef G_OS_UNIX + int i, len; + + for (i = 0; i < G_N_ELEMENTS (unix_socket_address_types); i++) + { + len = strlen (unix_socket_address_types[i]); + if (!strncmp (name, unix_socket_address_types[i], len) && + name[len] == ':') + { + return g_unix_socket_address_new_with_type (name + len + 1, -1, + (GUnixSocketAddressType)i); + } + } +#endif + return NULL; +} + +static gboolean +source_ready (GPollableInputStream *stream, + gpointer data) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static void +ensure_socket_condition (GSocket *socket, + GIOCondition condition, + GCancellable *cancellable) +{ + GSource *source; + + if (!non_blocking) + return; + + 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); +} + +static void +ensure_connection_condition (GIOStream *stream, + GIOCondition condition, + GCancellable *cancellable) +{ + GSource *source; + + if (!non_blocking) + return; + + if (condition & G_IO_IN) + source = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (stream)), cancellable); + else + source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (g_io_stream_get_output_stream (stream)), 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); +} + +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; +} diff --git a/gio/tests/socket-server.c b/gio/tests/socket-server.c new file mode 100644 index 0000000..decf3ec --- /dev/null +++ b/gio/tests/socket-server.c @@ -0,0 +1,366 @@ +#include +#include +#include +#include +#include + +GMainLoop *loop; + +int port = 7777; +gboolean verbose = FALSE; +gboolean dont_reuse_address = FALSE; +gboolean non_blocking = FALSE; +gboolean use_udp = FALSE; +int cancel_timeout = 0; +int read_timeout = 0; +int delay = 0; +gboolean unix_socket = FALSE; +const char *tls_cert_file = NULL; + +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}, +#ifdef G_OS_UNIX + {"unix", 'U', 0, G_OPTION_ARG_NONE, &unix_socket, + "Use a unix socket instead of IP", NULL}, +#endif + {"delay", 'd', 0, G_OPTION_ARG_INT, &delay, + "Delay responses by the specified number of seconds", NULL}, + {"timeout", 't', 0, G_OPTION_ARG_INT, &read_timeout, + "Time out reads after the specified number of seconds", NULL}, + {"tls", 'T', 0, G_OPTION_ARG_STRING, &tls_cert_file, + "Use TLS (SSL) with indicated server certificate", "CERTFILE"}, + {NULL} +}; + +#include "socket-common.c" + +int +main (int argc, + char *argv[]) +{ + GSocket *socket, *new_socket, *recv_socket; + GSocketAddress *src_address; + GSocketAddress *address; + GSocketType socket_type; + GSocketFamily socket_family; + GError *error = NULL; + GOptionContext *context; + GCancellable *cancellable; + char *display_addr; + GTlsCertificate *tlscert = NULL; + GIOStream *connection; + GInputStream *istream; + GOutputStream *ostream; + + 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 (unix_socket && argc != 2) + { + g_printerr ("%s: %s\n", argv[0], "Need to specify unix socket name"); + return 1; + } + + if (cancel_timeout) + { + GThread *thread; + cancellable = g_cancellable_new (); + thread = g_thread_new ("cancel", cancel_thread, cancellable); + g_thread_unref (thread); + } + else + { + cancellable = NULL; + } + + if (tls_cert_file) + { + if (use_udp) + { + g_printerr ("DTLS (TLS over UDP) is not supported"); + return 1; + } + + tlscert = g_tls_certificate_new_from_file (tls_cert_file, &error); + if (!tlscert) + { + g_printerr ("Could not read server certificate '%s': %s\n", + tls_cert_file, error->message); + return 1; + } + } + + loop = g_main_loop_new (NULL, FALSE); + + if (use_udp) + socket_type = G_SOCKET_TYPE_DATAGRAM; + else + socket_type = G_SOCKET_TYPE_STREAM; + + if (unix_socket) + socket_family = G_SOCKET_FAMILY_UNIX; + else + socket_family = G_SOCKET_FAMILY_IPV4; + + socket = g_socket_new (socket_family, 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); + + if (unix_socket) + { + src_address = socket_address_from_string (argv[1]); + if (src_address == NULL) + { + g_printerr ("%s: Could not parse '%s' as unix socket name\n", argv[0], argv[1]); + return 1; + } + } + else + { + 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; + } + + address = g_socket_get_local_address (socket, &error); + if (!address) + { + g_printerr ("Error getting local address: %s\n", + error->message); + return 1; + } + display_addr = socket_address_to_string (address); + g_print ("listening on %s...\n", display_addr); + g_free (display_addr); + + ensure_socket_condition (socket, G_IO_IN, cancellable); + 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); + if (read_timeout) + g_socket_set_timeout (new_socket, read_timeout); + + address = g_socket_get_remote_address (new_socket, &error); + if (!address) + { + g_printerr ("Error getting remote address: %s\n", + error->message); + return 1; + } + + display_addr = socket_address_to_string (address); + g_print ("got a new connection from %s\n", display_addr); + g_free(display_addr); + g_object_unref (address); + + recv_socket = new_socket; + + connection = G_IO_STREAM (g_socket_connection_factory_create_connection (recv_socket)); + g_object_unref (new_socket); + } + else + { + recv_socket = socket; + connection = NULL; + } + + if (tlscert) + { + GIOStream *tls_conn; + + tls_conn = g_tls_server_connection_new (connection, tlscert, &error); + if (!tls_conn) + { + g_printerr ("Could not create TLS connection: %s\n", + error->message); + return 1; + } + + if (!g_tls_connection_handshake (G_TLS_CONNECTION (tls_conn), + cancellable, &error)) + { + g_printerr ("Error during TLS handshake: %s\n", + error->message); + return 1; + } + + g_object_unref (connection); + connection = tls_conn; + } + + if (connection) + { + istream = g_io_stream_get_input_stream (connection); + ostream = g_io_stream_get_output_stream (connection); + } + else + { + g_assert (use_udp); + istream = NULL; + ostream = NULL; + } + + while (TRUE) + { + gchar buffer[4096]; + gssize size; + gsize to_send; + + if (use_udp) + { + ensure_socket_condition (recv_socket, G_IO_IN, cancellable); + size = g_socket_receive_from (recv_socket, &address, + buffer, sizeof buffer, + cancellable, &error); + } + else + { + ensure_connection_condition (connection, G_IO_IN, cancellable); + size = g_input_stream_read (istream, + 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; + + if (delay) + { + if (verbose) + g_print ("delaying %d seconds before response\n", delay); + g_usleep (1000 * 1000 * delay); + } + + while (to_send > 0) + { + if (use_udp) + { + ensure_socket_condition (recv_socket, G_IO_OUT, cancellable); + size = g_socket_send_to (recv_socket, address, + buffer, to_send, cancellable, &error); + } + else + { + ensure_connection_condition (connection, G_IO_OUT, cancellable); + size = g_output_stream_write (ostream, + 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 (connection) + { + if (!g_io_stream_close (connection, NULL, &error)) + { + g_printerr ("Error closing connection stream: %s\n", + error->message); + return 1; + } + g_object_unref (connection); + } + + if (!g_socket_close (socket, &error)) + { + g_printerr ("Error closing master socket: %s\n", + error->message); + return 1; + } + g_object_unref (socket); + + return 0; +} diff --git a/gio/tests/socket.c b/gio/tests/socket.c new file mode 100644 index 0000000..8ae80a1 --- /dev/null +++ b/gio/tests/socket.c @@ -0,0 +1,851 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2008-2011 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 + +#ifdef G_OS_UNIX +#include +#include +#include +#include +#include +#include +#endif + +#include "gnetworkingprivate.h" + +typedef struct { + GSocket *server; + GSocket *client; + GSocketFamily family; + GThread *thread; + GMainLoop *loop; +} IPTestData; + +static gpointer +echo_server_thread (gpointer user_data) +{ + IPTestData *data = user_data; + GSocket *sock; + GError *error = NULL; + gssize nread, nwrote; + gchar buf[128]; + + sock = g_socket_accept (data->server, NULL, &error); + g_assert_no_error (error); + + while (TRUE) + { + nread = g_socket_receive (sock, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nread, >=, 0); + + if (nread == 0) + break; + + nwrote = g_socket_send (sock, buf, nread, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (nwrote, ==, nread); + } + + g_socket_close (sock, &error); + g_assert_no_error (error); + g_object_unref (sock); + return NULL; +} + +static IPTestData * +create_server (GSocketFamily family, + GThreadFunc server_thread, + gboolean v4mapped) +{ + IPTestData *data; + GSocket *server; + GError *error = NULL; + GSocketAddress *addr; + GInetAddress *iaddr; + + data = g_slice_new (IPTestData); + data->family = family; + + data->server = server = g_socket_new (family, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_assert_cmpint (g_socket_get_family (server), ==, family); + g_assert_cmpint (g_socket_get_socket_type (server), ==, G_SOCKET_TYPE_STREAM); + g_assert_cmpint (g_socket_get_protocol (server), ==, G_SOCKET_PROTOCOL_DEFAULT); + + g_socket_set_blocking (server, TRUE); + +#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY) + if (v4mapped) + { + int fd, v6_only; + + fd = g_socket_get_fd (server); + v6_only = 0; + setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &v6_only, sizeof (v6_only)); + if (! g_socket_speaks_ipv4 (data->server)) + { + g_object_unref (data->server); + g_slice_free (IPTestData, data); + return NULL; + } + } +#endif + + if (v4mapped) + iaddr = g_inet_address_new_any (family); + else + iaddr = g_inet_address_new_loopback (family); + addr = g_inet_socket_address_new (iaddr, 0); + g_object_unref (iaddr); + + g_assert_cmpint (g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr)), ==, 0); + g_socket_bind (server, addr, TRUE, &error); + g_assert_no_error (error); + g_object_unref (addr); + + addr = g_socket_get_local_address (server, &error); + g_assert_no_error (error); + g_assert_cmpint (g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr)), !=, 0); + g_object_unref (addr); + + g_socket_listen (server, &error); + g_assert_no_error (error); + + data->thread = g_thread_new ("server", server_thread, data); + + return data; +} + +static const gchar *testbuf = "0123456789abcdef"; + +static gboolean +test_ip_async_read_ready (GSocket *client, + GIOCondition cond, + gpointer user_data) +{ + IPTestData *data = user_data; + GError *error = NULL; + gssize len; + gchar buf[128]; + + g_assert_cmpint (cond, ==, G_IO_IN); + + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + g_assert_cmpstr (testbuf, ==, buf); + + g_main_loop_quit (data->loop); + + return FALSE; +} + +static gboolean +test_ip_async_write_ready (GSocket *client, + GIOCondition cond, + gpointer user_data) +{ + IPTestData *data = user_data; + GError *error = NULL; + GSource *source; + gssize len; + + g_assert_cmpint (cond, ==, G_IO_OUT); + + len = g_socket_send (client, testbuf, strlen (testbuf) + 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + source = g_socket_create_source (client, G_IO_IN, NULL); + g_source_set_callback (source, (GSourceFunc)test_ip_async_read_ready, + data, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + + return FALSE; +} + +static gboolean +test_ip_async_timed_out (GSocket *client, + GIOCondition cond, + gpointer user_data) +{ + IPTestData *data = user_data; + GError *error = NULL; + GSource *source; + gssize len; + gchar buf[128]; + + if (data->family == G_SOCKET_FAMILY_IPV4) + { + g_assert_cmpint (cond, ==, G_IO_IN); + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_cmpint (len, ==, -1); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_clear_error (&error); + } + + source = g_socket_create_source (client, G_IO_OUT, NULL); + g_source_set_callback (source, (GSourceFunc)test_ip_async_write_ready, + data, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + + return FALSE; +} + +static gboolean +test_ip_async_connected (GSocket *client, + GIOCondition cond, + gpointer user_data) +{ + IPTestData *data = user_data; + GError *error = NULL; + GSource *source; + gssize len; + gchar buf[128]; + + g_socket_check_connect_result (client, &error); + g_assert_no_error (error); + /* We do this after the check_connect_result, since that will give a + * more useful assertion in case of error. + */ + g_assert_cmpint (cond, ==, G_IO_OUT); + + g_assert (g_socket_is_connected (client)); + + /* This adds 1 second to "make check", so let's just only do it once. */ + if (data->family == G_SOCKET_FAMILY_IPV4) + { + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_cmpint (len, ==, -1); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK); + g_clear_error (&error); + + source = g_socket_create_source (client, G_IO_IN, NULL); + g_source_set_callback (source, (GSourceFunc)test_ip_async_timed_out, + data, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + } + else + test_ip_async_timed_out (client, 0, data); + + return FALSE; +} + +static gboolean +idle_test_ip_async_connected (gpointer user_data) +{ + IPTestData *data = user_data; + + return test_ip_async_connected (data->client, G_IO_OUT, data); +} + +static void +test_ip_async (GSocketFamily family) +{ + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *addr; + GSource *source; + gssize len; + gchar buf[128]; + + data = create_server (family, echo_server_thread, FALSE); + addr = g_socket_get_local_address (data->server, &error); + + client = g_socket_new (family, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + data->client = client; + + g_assert_cmpint (g_socket_get_family (client), ==, family); + g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_STREAM); + g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); + + g_socket_set_blocking (client, FALSE); + g_socket_set_timeout (client, 1); + + if (g_socket_connect (client, addr, NULL, &error)) + { + g_assert_no_error (error); + g_idle_add (idle_test_ip_async_connected, data); + } + else + { + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING); + g_clear_error (&error); + source = g_socket_create_source (client, G_IO_OUT, NULL); + g_source_set_callback (source, (GSourceFunc)test_ip_async_connected, + data, NULL); + g_source_attach (source, NULL); + g_source_unref (source); + } + g_object_unref (addr); + + data->loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (data->loop); + g_main_loop_unref (data->loop); + + g_socket_shutdown (client, FALSE, TRUE, &error); + g_assert_no_error (error); + + g_thread_join (data->thread); + + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, 0); + + g_socket_close (client, &error); + g_assert_no_error (error); + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (data->server); + g_object_unref (client); + + g_slice_free (IPTestData, data); +} + +static void +test_ipv4_async (void) +{ + test_ip_async (G_SOCKET_FAMILY_IPV4); +} + +static void +test_ipv6_async (void) +{ + test_ip_async (G_SOCKET_FAMILY_IPV6); +} + +static void +test_ip_sync (GSocketFamily family) +{ + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *addr; + gssize len; + gchar buf[128]; + + data = create_server (family, echo_server_thread, FALSE); + addr = g_socket_get_local_address (data->server, &error); + + client = g_socket_new (family, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_assert_cmpint (g_socket_get_family (client), ==, family); + g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_STREAM); + g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 1); + + g_socket_connect (client, addr, NULL, &error); + g_assert_no_error (error); + g_assert (g_socket_is_connected (client)); + g_object_unref (addr); + + /* This adds 1 second to "make check", so let's just only do it once. */ + if (family == G_SOCKET_FAMILY_IPV4) + { + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_cmpint (len, ==, -1); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_clear_error (&error); + } + + len = g_socket_send (client, testbuf, strlen (testbuf) + 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + g_assert_cmpstr (testbuf, ==, buf); + + g_socket_shutdown (client, FALSE, TRUE, &error); + g_assert_no_error (error); + + g_thread_join (data->thread); + + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, 0); + + g_socket_close (client, &error); + g_assert_no_error (error); + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (data->server); + g_object_unref (client); + + g_slice_free (IPTestData, data); +} + +static void +test_ipv4_sync (void) +{ + test_ip_sync (G_SOCKET_FAMILY_IPV4); +} + +static void +test_ipv6_sync (void) +{ + test_ip_sync (G_SOCKET_FAMILY_IPV6); +} + +static gpointer +graceful_server_thread (gpointer user_data) +{ + IPTestData *data = user_data; + GSocket *sock; + GError *error = NULL; + gssize len; + + sock = g_socket_accept (data->server, NULL, &error); + g_assert_no_error (error); + + len = g_socket_send (sock, testbuf, strlen (testbuf) + 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + return sock; +} + +static void +test_close_graceful (void) +{ + GSocketFamily family = G_SOCKET_FAMILY_IPV4; + IPTestData *data; + GError *error = NULL; + GSocket *client, *server; + GSocketAddress *addr; + gssize len; + gchar buf[128]; + + data = create_server (family, graceful_server_thread, FALSE); + addr = g_socket_get_local_address (data->server, &error); + + client = g_socket_new (family, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_assert_cmpint (g_socket_get_family (client), ==, family); + g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_STREAM); + g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 1); + + g_socket_connect (client, addr, NULL, &error); + g_assert_no_error (error); + g_assert (g_socket_is_connected (client)); + g_object_unref (addr); + + server = g_thread_join (data->thread); + + /* similar to g_tcp_connection_set_graceful_disconnect(), but explicit */ + g_socket_shutdown (server, FALSE, TRUE, &error); + g_assert_no_error (error); + + /* we must timeout */ + g_socket_condition_wait (client, G_IO_HUP, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_clear_error (&error); + + /* check that the remaining data is received */ + len = g_socket_receive (client, buf, strlen (testbuf) + 1, NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen (testbuf) + 1); + + /* and only then the connection is closed */ + len = g_socket_receive (client, buf, sizeof (buf), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, 0); + + g_socket_close (server, &error); + g_assert_no_error (error); + + g_socket_close (client, &error); + g_assert_no_error (error); + + g_object_unref (server); + g_object_unref (data->server); + g_object_unref (client); + + g_slice_free (IPTestData, data); +} + +#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY) +static gpointer +v4mapped_server_thread (gpointer user_data) +{ + IPTestData *data = user_data; + GSocket *sock; + GError *error = NULL; + GSocketAddress *addr; + + sock = g_socket_accept (data->server, NULL, &error); + g_assert_no_error (error); + + g_assert_cmpint (g_socket_get_family (sock), ==, G_SOCKET_FAMILY_IPV6); + + addr = g_socket_get_local_address (sock, &error); + g_assert_no_error (error); + g_assert_cmpint (g_socket_address_get_family (addr), ==, G_SOCKET_FAMILY_IPV4); + g_object_unref (addr); + + addr = g_socket_get_remote_address (sock, &error); + g_assert_no_error (error); + g_assert_cmpint (g_socket_address_get_family (addr), ==, G_SOCKET_FAMILY_IPV4); + g_object_unref (addr); + + g_socket_close (sock, &error); + g_assert_no_error (error); + g_object_unref (sock); + return NULL; +} + +static void +test_ipv6_v4mapped (void) +{ + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *addr, *v4addr; + GInetAddress *iaddr; + + data = create_server (G_SOCKET_FAMILY_IPV6, v4mapped_server_thread, TRUE); + + if (data == NULL) + { + g_test_message ("Test not run: not supported by the OS"); + return; + } + + client = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 1); + + addr = g_socket_get_local_address (data->server, &error); + iaddr = g_inet_address_new_loopback (G_SOCKET_FAMILY_IPV4); + v4addr = g_inet_socket_address_new (iaddr, g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (addr))); + g_object_unref (iaddr); + g_object_unref (addr); + + g_socket_connect (client, v4addr, NULL, &error); + g_assert_no_error (error); + g_assert (g_socket_is_connected (client)); + + g_thread_join (data->thread); + + g_socket_close (client, &error); + g_assert_no_error (error); + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (data->server); + g_object_unref (client); + g_object_unref (v4addr); + + g_slice_free (IPTestData, data); +} +#endif + +static void +test_timed_wait (void) +{ + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *addr; + gint64 start_time; + gint poll_duration; + + data = create_server (G_SOCKET_FAMILY_IPV4, echo_server_thread, FALSE); + addr = g_socket_get_local_address (data->server, &error); + + client = g_socket_new (G_SOCKET_FAMILY_IPV4, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 1); + + g_socket_connect (client, addr, NULL, &error); + g_assert_no_error (error); + g_object_unref (addr); + + start_time = g_get_monotonic_time (); + g_socket_condition_timed_wait (client, G_IO_IN, 100000 /* 100 ms */, + NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_clear_error (&error); + poll_duration = g_get_monotonic_time () - start_time; + + g_assert_cmpint (poll_duration, >=, 98000); + g_assert_cmpint (poll_duration, <, 112000); + + g_socket_close (client, &error); + g_assert_no_error (error); + + g_thread_join (data->thread); + + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (data->server); + g_object_unref (client); + + g_slice_free (IPTestData, data); +} + +static void +test_sockaddr (void) +{ + struct sockaddr_in6 sin6, gsin6; + GSocketAddress *saddr; + GInetSocketAddress *isaddr; + GInetAddress *iaddr; + GError *error = NULL; + + memset (&sin6, 0, sizeof (sin6)); + sin6.sin6_family = AF_INET6; + sin6.sin6_addr = in6addr_loopback; + sin6.sin6_port = g_htons (42); + sin6.sin6_scope_id = 17; + sin6.sin6_flowinfo = 1729; + + saddr = g_socket_address_new_from_native (&sin6, sizeof (sin6)); + g_assert (G_IS_INET_SOCKET_ADDRESS (saddr)); + + isaddr = G_INET_SOCKET_ADDRESS (saddr); + iaddr = g_inet_socket_address_get_address (isaddr); + g_assert_cmpint (g_inet_address_get_family (iaddr), ==, G_SOCKET_FAMILY_IPV6); + g_assert (g_inet_address_get_is_loopback (iaddr)); + + g_assert_cmpint (g_inet_socket_address_get_port (isaddr), ==, 42); + g_assert_cmpint (g_inet_socket_address_get_scope_id (isaddr), ==, 17); + g_assert_cmpint (g_inet_socket_address_get_flowinfo (isaddr), ==, 1729); + + g_socket_address_to_native (saddr, &gsin6, sizeof (gsin6), &error); + g_assert_no_error (error); + + g_assert (memcmp (&sin6.sin6_addr, &gsin6.sin6_addr, sizeof (struct in6_addr)) == 0); + g_assert_cmpint (sin6.sin6_port, ==, gsin6.sin6_port); + g_assert_cmpint (sin6.sin6_scope_id, ==, gsin6.sin6_scope_id); + g_assert_cmpint (sin6.sin6_flowinfo, ==, gsin6.sin6_flowinfo); + + g_object_unref (saddr); +} + +#ifdef G_OS_UNIX +static void +test_unix_from_fd (void) +{ + gint fd; + GError *error; + GSocket *s; + + fd = socket (AF_UNIX, SOCK_STREAM, 0); + g_assert_cmpint (fd, !=, -1); + + error = NULL; + s = g_socket_new_from_fd (fd, &error); + g_assert_no_error (error); + g_assert_cmpint (g_socket_get_family (s), ==, G_SOCKET_FAMILY_UNIX); + g_assert_cmpint (g_socket_get_socket_type (s), ==, G_SOCKET_TYPE_STREAM); + g_assert_cmpint (g_socket_get_protocol (s), ==, G_SOCKET_PROTOCOL_DEFAULT); + g_object_unref (s); +} + +static void +test_unix_connection (void) +{ + gint fd; + GError *error; + GSocket *s; + GSocketConnection *c; + + fd = socket (AF_UNIX, SOCK_STREAM, 0); + g_assert_cmpint (fd, !=, -1); + + error = NULL; + s = g_socket_new_from_fd (fd, &error); + g_assert_no_error (error); + c = g_socket_connection_factory_create_connection (s); + g_assert (G_IS_UNIX_CONNECTION (c)); + g_object_unref (c); + g_object_unref (s); +} + +static GSocketConnection * +create_connection_for_fd (int fd) +{ + GError *err = NULL; + GSocket *socket; + GSocketConnection *connection; + + socket = g_socket_new_from_fd (fd, &err); + g_assert_no_error (err); + g_assert (G_IS_SOCKET (socket)); + connection = g_socket_connection_factory_create_connection (socket); + g_assert (G_IS_UNIX_CONNECTION (connection)); + g_object_unref (socket); + return connection; +} + +#define TEST_DATA "failure to say failure to say 'i love gnome-panel!'." + +static void +test_unix_connection_ancillary_data (void) +{ + GError *err = NULL; + gint pv[2], sv[3]; + gint status, fd, len; + char buffer[1024]; + pid_t pid; + + status = pipe (pv); + g_assert_cmpint (status, ==, 0); + + status = socketpair (PF_UNIX, SOCK_STREAM, 0, sv); + g_assert_cmpint (status, ==, 0); + + pid = fork (); + g_assert_cmpint (pid, >=, 0); + + /* Child: close its copy of the write end of the pipe, receive it + * again from the parent over the socket, and write some text to it. + * + * Parent: send the write end of the pipe (still open for the + * parent) over the socket, close it, and read some text from the + * read end of the pipe. + */ + if (pid == 0) + { + GSocketConnection *connection; + + close (sv[1]); + connection = create_connection_for_fd (sv[0]); + + status = close (pv[1]); + g_assert_cmpint (status, ==, 0); + + err = NULL; + fd = g_unix_connection_receive_fd (G_UNIX_CONNECTION (connection), NULL, + &err); + g_assert_no_error (err); + g_assert_cmpint (fd, >, -1); + g_object_unref (connection); + + do + len = write (fd, TEST_DATA, sizeof (TEST_DATA)); + while (len == -1 && errno == EINTR); + g_assert_cmpint (len, ==, sizeof (TEST_DATA)); + exit (0); + } + else + { + GSocketConnection *connection; + + close (sv[0]); + connection = create_connection_for_fd (sv[1]); + + err = NULL; + g_unix_connection_send_fd (G_UNIX_CONNECTION (connection), pv[1], NULL, + &err); + g_assert_no_error (err); + g_object_unref (connection); + + status = close (pv[1]); + g_assert_cmpint (status, ==, 0); + + memset (buffer, 0xff, sizeof buffer); + do + len = read (pv[0], buffer, sizeof buffer); + while (len == -1 && errno == EINTR); + + g_assert_cmpint (len, ==, sizeof (TEST_DATA)); + g_assert_cmpstr (buffer, ==, TEST_DATA); + + waitpid (pid, &status, 0); + g_assert (WIFEXITED (status)); + g_assert_cmpint (WEXITSTATUS (status), ==, 0); + } + + /* TODO: add test for g_unix_connection_send_credentials() and + * g_unix_connection_receive_credentials(). + */ +} +#endif /* G_OS_UNIX */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/socket/ipv4_sync", test_ipv4_sync); + g_test_add_func ("/socket/ipv4_async", test_ipv4_async); + g_test_add_func ("/socket/ipv6_sync", test_ipv6_sync); + g_test_add_func ("/socket/ipv6_async", test_ipv6_async); +#if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY) + g_test_add_func ("/socket/ipv6_v4mapped", test_ipv6_v4mapped); +#endif + g_test_add_func ("/socket/close_graceful", test_close_graceful); + g_test_add_func ("/socket/timed_wait", test_timed_wait); + g_test_add_func ("/socket/address", test_sockaddr); +#ifdef G_OS_UNIX + g_test_add_func ("/socket/unix-from-fd", test_unix_from_fd); + g_test_add_func ("/socket/unix-connection", test_unix_connection); + g_test_add_func ("/socket/unix-connection-ancillary-data", test_unix_connection_ancillary_data); +#endif + + return g_test_run(); +} + diff --git a/gio/tests/srvtarget.c b/gio/tests/srvtarget.c new file mode 100644 index 0000000..84f803e --- /dev/null +++ b/gio/tests/srvtarget.c @@ -0,0 +1,157 @@ +/* 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_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/task.c b/gio/tests/task.c new file mode 100644 index 0000000..6dbff5c --- /dev/null +++ b/gio/tests/task.c @@ -0,0 +1,1736 @@ +/* + * Copyright 2012 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. + */ + +#include + +static GMainLoop *loop; +static GThread *main_thread; +static gssize magic; + +/* We need objects for a few tests where we don't care what type + * they are, just that they're GObjects. + */ +#define g_dummy_object_new g_socket_client_new + +/* test_basic */ + +static void +basic_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + *result_out = g_task_propagate_int (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static gboolean +basic_return (gpointer user_data) +{ + GTask *task = user_data; + + g_task_return_int (task, magic); + g_object_unref (task); + + return FALSE; +} + +static void +basic_destroy_notify (gpointer user_data) +{ + gboolean *destroyed = user_data; + + *destroyed = TRUE; +} + +static void +test_basic (void) +{ + GTask *task; + gssize result; + gboolean task_data_destroyed = FALSE; + + task = g_task_new (NULL, NULL, basic_callback, &result); + g_task_set_task_data (task, &task_data_destroyed, basic_destroy_notify); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_idle_add (basic_return, task); + g_main_loop_run (loop); + + g_assert_cmpint (result, ==, magic); + g_assert (task_data_destroyed == TRUE); + g_assert (task == NULL); +} + +/* test_error */ + +static void +error_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (g_task_had_error (G_TASK (result))); + + *result_out = g_task_propagate_int (G_TASK (result), &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + g_error_free (error); + + g_main_loop_quit (loop); +} + +static gboolean +error_return (gpointer user_data) +{ + GTask *task = user_data; + + g_task_return_new_error (task, + G_IO_ERROR, G_IO_ERROR_FAILED, + "Failed"); + g_object_unref (task); + + return FALSE; +} + +static void +error_destroy_notify (gpointer user_data) +{ + gboolean *destroyed = user_data; + + *destroyed = TRUE; +} + +static void +test_error (void) +{ + GTask *task; + gssize result; + gboolean first_task_data_destroyed = FALSE; + gboolean second_task_data_destroyed = FALSE; + + task = g_task_new (NULL, NULL, error_callback, &result); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_assert (first_task_data_destroyed == FALSE); + g_task_set_task_data (task, &first_task_data_destroyed, error_destroy_notify); + g_assert (first_task_data_destroyed == FALSE); + + /* Calling g_task_set_task_data() again will destroy the first data */ + g_task_set_task_data (task, &second_task_data_destroyed, error_destroy_notify); + g_assert (first_task_data_destroyed == TRUE); + g_assert (second_task_data_destroyed == FALSE); + + g_idle_add (error_return, task); + g_main_loop_run (loop); + + g_assert_cmpint (result, ==, -1); + g_assert (second_task_data_destroyed == TRUE); + g_assert (task == NULL); +} + +/* test_return_from_same_iteration: calling g_task_return_* from the + * loop iteration the task was created in defers completion until the + * next iteration. + */ +gboolean same_result = FALSE; + +static void +same_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + *result_out = g_task_propagate_boolean (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static gboolean +same_start (gpointer user_data) +{ + gpointer *weak_pointer = user_data; + GTask *task; + + task = g_task_new (NULL, NULL, same_callback, &same_result); + *weak_pointer = task; + g_object_add_weak_pointer (G_OBJECT (task), weak_pointer); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); + + /* same_callback should not have been invoked yet */ + g_assert (same_result == FALSE); + g_assert (*weak_pointer == task); + + return FALSE; +} + +static void +test_return_from_same_iteration (void) +{ + gpointer weak_pointer; + + g_idle_add (same_start, &weak_pointer); + g_main_loop_run (loop); + + g_assert (same_result == TRUE); + g_assert (weak_pointer == NULL); +} + +/* test_return_from_toplevel: calling g_task_return_* from outside any + * main loop completes the task inside the main loop. + */ + +static void +toplevel_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + *result_out = g_task_propagate_boolean (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static void +test_return_from_toplevel (void) +{ + GTask *task; + gboolean result = FALSE; + + task = g_task_new (NULL, NULL, toplevel_callback, &result); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); + + /* toplevel_callback should not have been invoked yet */ + g_assert (result == FALSE); + g_assert (task != NULL); + + g_main_loop_run (loop); + + g_assert (result == TRUE); + g_assert (task == NULL); +} + +/* test_return_from_anon_thread: calling g_task_return_* from a + * thread with no thread-default main context will complete the + * task in the task's context/thread. + */ + +GThread *anon_thread; + +static void +anon_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + g_assert (g_thread_self () == main_thread); + + *result_out = g_task_propagate_int (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static gpointer +anon_thread_func (gpointer user_data) +{ + GTask *task = user_data; + + g_task_return_int (task, magic); + g_object_unref (task); + + return NULL; +} + +static gboolean +anon_start (gpointer user_data) +{ + GTask *task = user_data; + + anon_thread = g_thread_new ("test_return_from_anon_thread", + anon_thread_func, task); + return FALSE; +} + +static void +test_return_from_anon_thread (void) +{ + GTask *task; + gssize result = 0; + + task = g_task_new (NULL, NULL, anon_callback, &result); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_idle_add (anon_start, task); + g_main_loop_run (loop); + + g_thread_join (anon_thread); + + g_assert_cmpint (result, ==, magic); + g_assert (task == NULL); +} + +/* test_return_from_wrong_thread: calling g_task_return_* from a + * thread with its own thread-default main context will complete the + * task in the task's context/thread. + */ + +GThread *wrong_thread; + +static void +wrong_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + g_assert (g_thread_self () == main_thread); + + *result_out = g_task_propagate_int (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static gpointer +wrong_thread_func (gpointer user_data) +{ + GTask *task = user_data; + GMainContext *context; + + context = g_main_context_new (); + g_main_context_push_thread_default (context); + + g_assert (g_task_get_context (task) != context); + + g_task_return_int (task, magic); + g_object_unref (task); + + g_main_context_pop_thread_default (context); + g_main_context_unref (context); + + return NULL; +} + +static gboolean +wrong_start (gpointer user_data) +{ + GTask *task = user_data; + + wrong_thread = g_thread_new ("test_return_from_anon_thread", + wrong_thread_func, task); + return FALSE; +} + +static void +test_return_from_wrong_thread (void) +{ + GTask *task; + gssize result = 0; + + task = g_task_new (NULL, NULL, wrong_callback, &result); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_idle_add (wrong_start, task); + g_main_loop_run (loop); + + g_thread_join (wrong_thread); + + g_assert_cmpint (result, ==, magic); + g_assert (task == NULL); +} + +/* test_no_callback */ + +static void +test_no_callback (void) +{ + GTask *task; + + task = g_task_new (NULL, NULL, NULL, NULL); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_task_return_boolean (task, TRUE); + g_object_unref (task); + + /* Since there's no callback, g_task_return_boolean() will + * not have queued an idle source and taken a ref on task, + * so we just dropped the last ref. + */ + g_assert (task == NULL); +} + +/* test_report_error */ + +static void test_report_error (void); + +static void +report_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gpointer *weak_pointer = user_data; + GError *error = NULL; + gssize ret; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (g_async_result_is_tagged (result, test_report_error)); + g_assert (g_task_get_source_tag (G_TASK (result)) == test_report_error); + g_assert (g_task_had_error (G_TASK (result))); + + ret = g_task_propagate_int (G_TASK (result), &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + g_assert_cmpint (ret, ==, -1); + g_error_free (error); + + *weak_pointer = result; + g_object_add_weak_pointer (G_OBJECT (result), weak_pointer); + + g_main_loop_quit (loop); +} + +static void +test_report_error (void) +{ + gpointer weak_pointer = (gpointer)-1; + + g_task_report_new_error (NULL, report_callback, &weak_pointer, + test_report_error, + G_IO_ERROR, G_IO_ERROR_FAILED, + "Failed"); + g_main_loop_run (loop); + + g_assert (weak_pointer == NULL); +} + +/* test_priority: tasks complete in priority order */ + +static int counter = 0; + +static void +priority_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *ret_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + g_task_propagate_boolean (G_TASK (result), &error); + g_assert_no_error (error); + + *ret_out = ++counter; + + if (counter == 3) + g_main_loop_quit (loop); +} + +static void +test_priority (void) +{ + GTask *t1, *t2, *t3; + gssize ret1, ret2, ret3; + + /* t2 has higher priority than either t1 or t3, so we can't + * accidentally pass the test just by completing the tasks in the + * order they were created (or in reverse order). + */ + + t1 = g_task_new (NULL, NULL, priority_callback, &ret1); + g_task_set_priority (t1, G_PRIORITY_DEFAULT); + g_task_return_boolean (t1, TRUE); + g_object_unref (t1); + + t2 = g_task_new (NULL, NULL, priority_callback, &ret2); + g_task_set_priority (t2, G_PRIORITY_HIGH); + g_task_return_boolean (t2, TRUE); + g_object_unref (t2); + + t3 = g_task_new (NULL, NULL, priority_callback, &ret3); + g_task_set_priority (t3, G_PRIORITY_LOW); + g_task_return_boolean (t3, TRUE); + g_object_unref (t3); + + g_main_loop_run (loop); + + g_assert_cmpint (ret2, ==, 1); + g_assert_cmpint (ret1, ==, 2); + g_assert_cmpint (ret3, ==, 3); +} + +/* test_check_cancellable: cancellation overrides return value */ + +enum { + CANCEL_BEFORE = (1 << 1), + CANCEL_AFTER = (1 << 2), + CHECK_CANCELLABLE = (1 << 3) +}; +#define NUM_CANCEL_TESTS (CANCEL_BEFORE | CANCEL_AFTER | CHECK_CANCELLABLE) + +static void +cancel_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + int state = GPOINTER_TO_INT (user_data); + GTask *task; + GCancellable *cancellable; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + + task = G_TASK (result); + cancellable = g_task_get_cancellable (task); + g_assert (G_IS_CANCELLABLE (cancellable)); + + if (state & (CANCEL_BEFORE | CANCEL_AFTER)) + g_assert (g_cancellable_is_cancelled (cancellable)); + else + g_assert (!g_cancellable_is_cancelled (cancellable)); + + if (state & CHECK_CANCELLABLE) + g_assert (g_task_get_check_cancellable (task)); + else + g_assert (!g_task_get_check_cancellable (task)); + + if (g_task_propagate_boolean (task, &error)) + { + g_assert (!g_cancellable_is_cancelled (cancellable) || + !g_task_get_check_cancellable (task)); + } + else + { + g_assert (g_cancellable_is_cancelled (cancellable) && + g_task_get_check_cancellable (task)); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (error); + } + + g_main_loop_quit (loop); +} + +static void +test_check_cancellable (void) +{ + GTask *task; + GCancellable *cancellable; + int state; + + cancellable = g_cancellable_new (); + + for (state = 0; state <= NUM_CANCEL_TESTS; state++) + { + task = g_task_new (NULL, cancellable, cancel_callback, + GINT_TO_POINTER (state)); + g_task_set_check_cancellable (task, (state & CHECK_CANCELLABLE) != 0); + + if (state & CANCEL_BEFORE) + g_cancellable_cancel (cancellable); + g_task_return_boolean (task, TRUE); + if (state & CANCEL_AFTER) + g_cancellable_cancel (cancellable); + + g_main_loop_run (loop); + g_object_unref (task); + g_cancellable_reset (cancellable); + } + + g_object_unref (cancellable); +} + +/* test_return_if_cancelled */ + +static void +return_if_cancelled_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (g_task_had_error (G_TASK (result))); + + g_task_propagate_boolean (G_TASK (result), &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + + g_main_loop_quit (loop); +} + +static void +test_return_if_cancelled (void) +{ + GTask *task; + GCancellable *cancellable; + gboolean cancelled; + + cancellable = g_cancellable_new (); + + task = g_task_new (NULL, cancellable, return_if_cancelled_callback, NULL); + g_cancellable_cancel (cancellable); + cancelled = g_task_return_error_if_cancelled (task); + g_assert (cancelled); + g_main_loop_run (loop); + g_object_unref (task); + g_cancellable_reset (cancellable); + + task = g_task_new (NULL, cancellable, return_if_cancelled_callback, NULL); + g_task_set_check_cancellable (task, FALSE); + g_cancellable_cancel (cancellable); + cancelled = g_task_return_error_if_cancelled (task); + g_assert (cancelled); + g_main_loop_run (loop); + g_object_unref (task); + g_object_unref (cancellable); +} + +/* test_run_in_thread */ + +static void +run_in_thread_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean *done = user_data; + GError *error = NULL; + gssize ret; + + g_assert (g_thread_self () == main_thread); + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + ret = g_task_propagate_int (G_TASK (result), &error); + g_assert_no_error (error); + g_assert_cmpint (ret, ==, magic); + + *done = TRUE; + g_main_loop_quit (loop); +} + +static void +run_in_thread_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + gboolean *thread_ran = task_data; + + g_assert (source_object == g_task_get_source_object (task)); + g_assert (task_data == g_task_get_task_data (task)); + g_assert (cancellable == g_task_get_cancellable (task)); + + g_assert (g_thread_self () != main_thread); + + *thread_ran = TRUE; + g_task_return_int (task, magic); +} + +static void +test_run_in_thread (void) +{ + GTask *task; + volatile gboolean thread_ran = FALSE; + gboolean done = FALSE; + + task = g_task_new (NULL, NULL, run_in_thread_callback, &done); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_task_set_task_data (task, (gpointer)&thread_ran, NULL); + g_task_run_in_thread (task, run_in_thread_thread); + g_object_unref (task); + + while (!thread_ran) + g_usleep (100); + + g_assert (done == FALSE); + g_assert (task != NULL); + + g_main_loop_run (loop); + + g_assert (done == TRUE); + g_assert (task == NULL); +} + +/* test_run_in_thread_sync */ + +static void +run_in_thread_sync_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + /* g_task_run_in_thread_sync() does not invoke the task's callback */ + g_assert_not_reached (); +} + +static void +run_in_thread_sync_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + gboolean *thread_ran = task_data; + + g_assert (source_object == g_task_get_source_object (task)); + g_assert (task_data == g_task_get_task_data (task)); + g_assert (cancellable == g_task_get_cancellable (task)); + + g_assert (g_thread_self () != main_thread); + + *thread_ran = TRUE; + g_task_return_int (task, magic); +} + +static void +test_run_in_thread_sync (void) +{ + GTask *task; + gboolean thread_ran = FALSE; + gssize ret; + GError *error = NULL; + + task = g_task_new (NULL, NULL, run_in_thread_sync_callback, NULL); + + g_task_set_task_data (task, &thread_ran, NULL); + g_task_run_in_thread_sync (task, run_in_thread_sync_thread); + + g_assert (thread_ran == TRUE); + g_assert (task != NULL); + g_assert (!g_task_had_error (task)); + + ret = g_task_propagate_int (task, &error); + g_assert_no_error (error); + g_assert_cmpint (ret, ==, magic); + + g_object_unref (task); +} + +/* test_run_in_thread_priority */ + +static GMutex fake_task_mutex, last_fake_task_mutex; +static gint sequence_number = 0; + +static void +quit_main_loop_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + gboolean ret; + + g_assert (g_thread_self () == main_thread); + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + ret = g_task_propagate_boolean (G_TASK (result), &error); + g_assert_no_error (error); + g_assert_cmpint (ret, ==, TRUE); + + g_main_loop_quit (loop); +} + +static void +set_sequence_number_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + gint *seq_no_p = task_data; + + *seq_no_p = ++sequence_number; + g_task_return_boolean (task, TRUE); +} + +static void +fake_task_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GMutex *mutex = task_data; + + g_mutex_lock (mutex); + g_mutex_unlock (mutex); + g_task_return_boolean (task, TRUE); +} + +#define G_TASK_THREAD_POOL_SIZE 10 +static int fake_tasks_running; + +static void +fake_task_callback (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + if (--fake_tasks_running == 0) + g_main_loop_quit (loop); +} + +static void +clog_up_thread_pool (void) +{ + GTask *task; + int i; + + g_thread_pool_stop_unused_threads (); + + g_mutex_lock (&fake_task_mutex); + for (i = 0; i < G_TASK_THREAD_POOL_SIZE - 1; i++) + { + task = g_task_new (NULL, NULL, fake_task_callback, NULL); + g_task_set_task_data (task, &fake_task_mutex, NULL); + g_assert_cmpint (g_task_get_priority (task), ==, G_PRIORITY_DEFAULT); + g_task_set_priority (task, G_PRIORITY_HIGH * 2); + g_assert_cmpint (g_task_get_priority (task), ==, G_PRIORITY_HIGH * 2); + g_task_run_in_thread (task, fake_task_thread); + g_object_unref (task); + fake_tasks_running++; + } + + g_mutex_lock (&last_fake_task_mutex); + task = g_task_new (NULL, NULL, NULL, NULL); + g_task_set_task_data (task, &last_fake_task_mutex, NULL); + g_task_set_priority (task, G_PRIORITY_HIGH * 2); + g_task_run_in_thread (task, fake_task_thread); + g_object_unref (task); +} + +static void +unclog_thread_pool (void) +{ + g_mutex_unlock (&fake_task_mutex); + g_main_loop_run (loop); +} + +static void +test_run_in_thread_priority (void) +{ + GTask *task; + GCancellable *cancellable; + int seq_a, seq_b, seq_c, seq_d; + + clog_up_thread_pool (); + + /* Queue three more tasks that we'll arrange to have run serially */ + task = g_task_new (NULL, NULL, NULL, NULL); + g_task_set_task_data (task, &seq_a, NULL); + g_task_run_in_thread (task, set_sequence_number_thread); + g_object_unref (task); + + task = g_task_new (NULL, NULL, quit_main_loop_callback, NULL); + g_task_set_task_data (task, &seq_b, NULL); + g_task_set_priority (task, G_PRIORITY_LOW); + g_task_run_in_thread (task, set_sequence_number_thread); + g_object_unref (task); + + task = g_task_new (NULL, NULL, NULL, NULL); + g_task_set_task_data (task, &seq_c, NULL); + g_task_set_priority (task, G_PRIORITY_HIGH); + g_task_run_in_thread (task, set_sequence_number_thread); + g_object_unref (task); + + cancellable = g_cancellable_new (); + task = g_task_new (NULL, cancellable, NULL, NULL); + g_task_set_task_data (task, &seq_d, NULL); + g_task_run_in_thread (task, set_sequence_number_thread); + g_cancellable_cancel (cancellable); + g_object_unref (cancellable); + g_object_unref (task); + + /* Let the last fake task complete; the four other tasks will then + * complete serially, in the order D, C, A, B, and B will quit the + * main loop. + */ + g_mutex_unlock (&last_fake_task_mutex); + g_main_loop_run (loop); + + g_assert_cmpint (seq_d, ==, 1); + g_assert_cmpint (seq_c, ==, 2); + g_assert_cmpint (seq_a, ==, 3); + g_assert_cmpint (seq_b, ==, 4); + + unclog_thread_pool (); +} + +/* test_run_in_thread_nested: task threads that block waiting on + * other task threads will not cause the thread pool to starve. + */ + +static void +run_nested_task_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + GTask *nested; + int *nested_tasks_left = task_data; + + if ((*nested_tasks_left)--) + { + nested = g_task_new (NULL, NULL, NULL, NULL); + g_task_set_task_data (nested, nested_tasks_left, NULL); + g_task_run_in_thread_sync (nested, run_nested_task_thread); + g_object_unref (nested); + } + + g_task_return_boolean (task, TRUE); +} + +static void +test_run_in_thread_nested (void) +{ + GTask *task; + int nested_tasks_left = 2; + + clog_up_thread_pool (); + + task = g_task_new (NULL, NULL, quit_main_loop_callback, NULL); + g_task_set_task_data (task, &nested_tasks_left, NULL); + g_task_run_in_thread (task, run_nested_task_thread); + g_object_unref (task); + + g_mutex_unlock (&last_fake_task_mutex); + g_main_loop_run (loop); + + unclog_thread_pool (); +} + +/* test_return_on_cancel */ + +GMutex roc_init_mutex, roc_finish_mutex; +GCond roc_init_cond, roc_finish_cond; + +typedef enum { + THREAD_STARTING, + THREAD_RUNNING, + THREAD_CANCELLED, + THREAD_COMPLETED +} ThreadState; + +static void +return_on_cancel_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean *callback_ran = user_data; + GError *error = NULL; + gssize ret; + + g_assert (g_thread_self () == main_thread); + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (g_task_had_error (G_TASK (result))); + + ret = g_task_propagate_int (G_TASK (result), &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (ret, ==, -1); + + *callback_ran = TRUE; + g_main_loop_quit (loop); +} + +static void +return_on_cancel_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + ThreadState *state = task_data; + + g_assert (source_object == g_task_get_source_object (task)); + g_assert (task_data == g_task_get_task_data (task)); + g_assert (cancellable == g_task_get_cancellable (task)); + + g_assert (g_thread_self () != main_thread); + + g_mutex_lock (&roc_init_mutex); + *state = THREAD_RUNNING; + g_cond_signal (&roc_init_cond); + g_mutex_unlock (&roc_init_mutex); + + g_mutex_lock (&roc_finish_mutex); + + if (!g_task_get_return_on_cancel (task) || + g_task_set_return_on_cancel (task, FALSE)) + { + *state = THREAD_COMPLETED; + g_task_return_int (task, magic); + } + else + *state = THREAD_CANCELLED; + + g_cond_signal (&roc_finish_cond); + g_mutex_unlock (&roc_finish_mutex); +} + +static void +test_return_on_cancel (void) +{ + GTask *task; + GCancellable *cancellable; + volatile ThreadState thread_state; + gboolean callback_ran; + + cancellable = g_cancellable_new (); + + /* If return-on-cancel is FALSE (default), the task does not return + * early. + */ + callback_ran = FALSE; + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + g_task_run_in_thread (task, return_on_cancel_thread); + g_object_unref (task); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + g_assert (callback_ran == FALSE); + + g_cancellable_cancel (cancellable); + g_mutex_unlock (&roc_finish_mutex); + g_main_loop_run (loop); + + g_assert (thread_state == THREAD_COMPLETED); + g_assert (callback_ran == TRUE); + + g_cancellable_reset (cancellable); + + /* If return-on-cancel is TRUE, it does return early */ + callback_ran = FALSE; + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran); + g_task_set_return_on_cancel (task, TRUE); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + g_task_run_in_thread (task, return_on_cancel_thread); + g_object_unref (task); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + g_assert (callback_ran == FALSE); + + g_cancellable_cancel (cancellable); + g_main_loop_run (loop); + g_assert (thread_state == THREAD_RUNNING); + g_assert (callback_ran == TRUE); + + while (thread_state == THREAD_RUNNING) + g_cond_wait (&roc_finish_cond, &roc_finish_mutex); + g_mutex_unlock (&roc_finish_mutex); + + g_assert (thread_state == THREAD_CANCELLED); + /* We can't g_assert (task == NULL) here because it won't become NULL + * until a little bit after roc_finish_cond is signaled. + */ + + g_cancellable_reset (cancellable); + + /* If the task is already cancelled before it starts, it returns + * immediately, but the thread func still runs. + */ + callback_ran = FALSE; + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, return_on_cancel_callback, &callback_ran); + g_task_set_return_on_cancel (task, TRUE); + + g_cancellable_cancel (cancellable); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + g_task_run_in_thread (task, return_on_cancel_thread); + g_object_unref (task); + + g_main_loop_run (loop); + g_assert (callback_ran == TRUE); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + + while (thread_state == THREAD_RUNNING) + g_cond_wait (&roc_finish_cond, &roc_finish_mutex); + g_mutex_unlock (&roc_finish_mutex); + + g_assert (thread_state == THREAD_CANCELLED); + + g_object_unref (cancellable); +} + +/* test_return_on_cancel_sync */ + +static gpointer +cancel_sync_runner_thread (gpointer task) +{ + g_task_run_in_thread_sync (task, return_on_cancel_thread); + return NULL; +} + +static void +test_return_on_cancel_sync (void) +{ + GTask *task; + GCancellable *cancellable; + volatile ThreadState thread_state; + GThread *runner_thread; + gssize ret; + GError *error = NULL; + + cancellable = g_cancellable_new (); + + /* If return-on-cancel is FALSE, the task does not return early. + */ + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + runner_thread = g_thread_new ("return-on-cancel-sync runner thread", + cancel_sync_runner_thread, task); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + + g_cancellable_cancel (cancellable); + g_mutex_unlock (&roc_finish_mutex); + g_thread_join (runner_thread); + g_assert (thread_state == THREAD_COMPLETED); + + ret = g_task_propagate_int (task, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (ret, ==, -1); + + g_object_unref (task); + + g_cancellable_reset (cancellable); + + /* If return-on-cancel is TRUE, it does return early */ + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL); + g_task_set_return_on_cancel (task, TRUE); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + runner_thread = g_thread_new ("return-on-cancel-sync runner thread", + cancel_sync_runner_thread, task); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + + g_cancellable_cancel (cancellable); + g_thread_join (runner_thread); + g_assert (thread_state == THREAD_RUNNING); + + ret = g_task_propagate_int (task, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (ret, ==, -1); + + g_object_unref (task); + + while (thread_state == THREAD_RUNNING) + g_cond_wait (&roc_finish_cond, &roc_finish_mutex); + g_mutex_unlock (&roc_finish_mutex); + + g_assert (thread_state == THREAD_CANCELLED); + + g_cancellable_reset (cancellable); + + /* If the task is already cancelled before it starts, it returns + * immediately, but the thread func still runs. + */ + thread_state = THREAD_STARTING; + task = g_task_new (NULL, cancellable, run_in_thread_sync_callback, NULL); + g_task_set_return_on_cancel (task, TRUE); + + g_cancellable_cancel (cancellable); + + g_task_set_task_data (task, (gpointer)&thread_state, NULL); + g_mutex_lock (&roc_init_mutex); + g_mutex_lock (&roc_finish_mutex); + runner_thread = g_thread_new ("return-on-cancel-sync runner thread", + cancel_sync_runner_thread, task); + + g_thread_join (runner_thread); + g_assert (thread_state == THREAD_STARTING); + + ret = g_task_propagate_int (task, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (ret, ==, -1); + + g_object_unref (task); + + while (thread_state == THREAD_STARTING) + g_cond_wait (&roc_init_cond, &roc_init_mutex); + g_mutex_unlock (&roc_init_mutex); + + g_assert (thread_state == THREAD_RUNNING); + + while (thread_state == THREAD_RUNNING) + g_cond_wait (&roc_finish_cond, &roc_finish_mutex); + g_mutex_unlock (&roc_finish_mutex); + + g_assert (thread_state == THREAD_CANCELLED); + + g_object_unref (cancellable); +} + +/* test_return_on_cancel_atomic: turning return-on-cancel on/off is + * non-racy + */ + +GMutex roca_mutex_1, roca_mutex_2; +GCond roca_cond_1, roca_cond_2; + +static void +return_on_cancel_atomic_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gboolean *callback_ran = user_data; + GError *error = NULL; + gssize ret; + + g_assert (g_thread_self () == main_thread); + + g_assert (object == NULL); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (g_task_had_error (G_TASK (result))); + + ret = g_task_propagate_int (G_TASK (result), &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (ret, ==, -1); + + *callback_ran = TRUE; + g_main_loop_quit (loop); +} + +static gboolean +idle_quit_loop (gpointer user_data) +{ + g_main_loop_quit (loop); + return FALSE; +} + +static void +return_on_cancel_atomic_thread (GTask *task, + gpointer source_object, + gpointer task_data, + GCancellable *cancellable) +{ + gint *state = task_data; + + g_assert (source_object == g_task_get_source_object (task)); + g_assert (task_data == g_task_get_task_data (task)); + g_assert (cancellable == g_task_get_cancellable (task)); + + g_assert (g_thread_self () != main_thread); + g_assert_cmpint (*state, ==, 0); + + g_mutex_lock (&roca_mutex_1); + *state = 1; + g_cond_signal (&roca_cond_1); + g_mutex_unlock (&roca_mutex_1); + + g_mutex_lock (&roca_mutex_2); + if (g_task_set_return_on_cancel (task, FALSE)) + *state = 2; + else + *state = 3; + g_cond_signal (&roca_cond_2); + g_mutex_unlock (&roca_mutex_2); + + g_mutex_lock (&roca_mutex_1); + if (g_task_set_return_on_cancel (task, TRUE)) + *state = 4; + else + *state = 5; + g_cond_signal (&roca_cond_1); + g_mutex_unlock (&roca_mutex_1); + + g_mutex_lock (&roca_mutex_2); + if (g_task_set_return_on_cancel (task, TRUE)) + *state = 6; + else + *state = 7; + g_cond_signal (&roca_cond_2); + g_mutex_unlock (&roca_mutex_2); + + g_task_return_int (task, magic); +} + +static void +test_return_on_cancel_atomic (void) +{ + GTask *task; + GCancellable *cancellable; + volatile gint state; + gboolean callback_ran; + + cancellable = g_cancellable_new (); + g_mutex_lock (&roca_mutex_1); + g_mutex_lock (&roca_mutex_2); + + /* If we don't cancel it, each set_return_on_cancel() call will succeed */ + state = 0; + callback_ran = FALSE; + task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran); + g_task_set_return_on_cancel (task, TRUE); + + g_task_set_task_data (task, (gpointer)&state, NULL); + g_task_run_in_thread (task, return_on_cancel_atomic_thread); + g_object_unref (task); + + g_assert_cmpint (state, ==, 0); + + while (state == 0) + g_cond_wait (&roca_cond_1, &roca_mutex_1); + g_assert (state == 1); + + while (state == 1) + g_cond_wait (&roca_cond_2, &roca_mutex_2); + g_assert (state == 2); + + while (state == 2) + g_cond_wait (&roca_cond_1, &roca_mutex_1); + g_assert (state == 4); + + while (state == 4) + g_cond_wait (&roca_cond_2, &roca_mutex_2); + g_assert (state == 6); + + /* callback assumes there'll be a cancelled error */ + g_cancellable_cancel (cancellable); + + g_assert (callback_ran == FALSE); + g_main_loop_run (loop); + g_assert (callback_ran == TRUE); + + g_cancellable_reset (cancellable); + + + /* If we cancel while it's temporarily not return-on-cancel, the + * task won't complete right away, and further + * g_task_set_return_on_cancel() calls will return FALSE. + */ + state = 0; + callback_ran = FALSE; + task = g_task_new (NULL, cancellable, return_on_cancel_atomic_callback, &callback_ran); + g_task_set_return_on_cancel (task, TRUE); + + g_task_set_task_data (task, (gpointer)&state, NULL); + g_task_run_in_thread (task, return_on_cancel_atomic_thread); + g_object_unref (task); + + g_assert_cmpint (state, ==, 0); + + while (state == 0) + g_cond_wait (&roca_cond_1, &roca_mutex_1); + g_assert (state == 1); + g_assert (g_task_get_return_on_cancel (task)); + + while (state == 1) + g_cond_wait (&roca_cond_2, &roca_mutex_2); + g_assert (state == 2); + g_assert (!g_task_get_return_on_cancel (task)); + + g_cancellable_cancel (cancellable); + g_idle_add (idle_quit_loop, NULL); + g_main_loop_run (loop); + g_assert (callback_ran == FALSE); + + while (state == 2) + g_cond_wait (&roca_cond_1, &roca_mutex_1); + g_assert (state == 5); + g_assert (!g_task_get_return_on_cancel (task)); + + g_main_loop_run (loop); + g_assert (callback_ran == TRUE); + + while (state == 5) + g_cond_wait (&roca_cond_2, &roca_mutex_2); + g_assert (state == 7); + + g_object_unref (cancellable); + g_mutex_unlock (&roca_mutex_1); + g_mutex_unlock (&roca_mutex_2); +} + +/* test_return_pointer: memory management of pointer returns */ + +static void +test_return_pointer (void) +{ + GObject *object, *ret; + GTask *task; + GCancellable *cancellable; + GError *error = NULL; + + /* If we don't read back the return value, the task will + * run its destroy notify. + */ + object = (GObject *)g_dummy_object_new (); + g_assert_cmpint (object->ref_count, ==, 1); + g_object_add_weak_pointer (object, (gpointer *)&object); + + task = g_task_new (NULL, NULL, NULL, NULL); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + g_task_return_pointer (task, object, g_object_unref); + g_assert_cmpint (object->ref_count, ==, 1); + + g_object_unref (task); + g_assert (task == NULL); + g_assert (object == NULL); + + /* Likewise, if the return value is overwritten by an error */ + object = (GObject *)g_dummy_object_new (); + g_assert_cmpint (object->ref_count, ==, 1); + g_object_add_weak_pointer (object, (gpointer *)&object); + + cancellable = g_cancellable_new (); + task = g_task_new (NULL, cancellable, NULL, NULL); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + g_task_return_pointer (task, object, g_object_unref); + g_assert_cmpint (object->ref_count, ==, 1); + g_cancellable_cancel (cancellable); + g_assert_cmpint (object->ref_count, ==, 1); + + ret = g_task_propagate_pointer (task, &error); + g_assert (ret == NULL); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_clear_error (&error); + g_assert_cmpint (object->ref_count, ==, 1); + + g_object_unref (task); + g_object_unref (cancellable); + g_assert (task == NULL); + g_assert (object == NULL); + + /* If we read back the return value, we steal its ref */ + object = (GObject *)g_dummy_object_new (); + g_assert_cmpint (object->ref_count, ==, 1); + g_object_add_weak_pointer (object, (gpointer *)&object); + + task = g_task_new (NULL, NULL, NULL, NULL); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + g_task_return_pointer (task, object, g_object_unref); + g_assert_cmpint (object->ref_count, ==, 1); + + ret = g_task_propagate_pointer (task, &error); + g_assert_no_error (error); + g_assert (ret == object); + g_assert_cmpint (object->ref_count, ==, 1); + + g_object_unref (task); + g_assert (task == NULL); + g_assert_cmpint (object->ref_count, ==, 1); + g_object_unref (object); + g_assert (object == NULL); +} + +/* test_object_keepalive: GTask takes a ref on its source object */ + +static GObject *keepalive_object; + +static void +keepalive_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == keepalive_object); + g_assert (g_task_is_valid (result, object)); + g_assert (g_async_result_get_user_data (result) == user_data); + g_assert (!g_task_had_error (G_TASK (result))); + + *result_out = g_task_propagate_int (G_TASK (result), &error); + g_assert_no_error (error); + + g_main_loop_quit (loop); +} + +static void +test_object_keepalive (void) +{ + GObject *object; + GTask *task; + gssize result; + int ref_count; + + keepalive_object = object = (GObject *)g_dummy_object_new (); + g_object_add_weak_pointer (object, (gpointer *)&object); + + task = g_task_new (object, NULL, keepalive_callback, &result); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + ref_count = object->ref_count; + g_assert_cmpint (ref_count, >, 1); + + g_assert (g_task_get_source_object (task) == object); + g_assert (g_async_result_get_source_object (G_ASYNC_RESULT (task)) == object); + g_assert_cmpint (object->ref_count, ==, ref_count + 1); + g_object_unref (object); + + g_object_unref (object); + g_assert (object != NULL); + + g_task_return_int (task, magic); + g_main_loop_run (loop); + + g_assert (object != NULL); + g_assert_cmpint (result, ==, magic); + + g_object_unref (task); + g_assert (task == NULL); + g_assert (object == NULL); +} + +/* test_legacy_error: legacy GSimpleAsyncResult handling */ +static void test_legacy_error (void); + +static void +legacy_error_callback (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + gssize *result_out = user_data; + GError *error = NULL; + + g_assert (object == NULL); + g_assert (g_async_result_is_tagged (result, test_legacy_error)); + g_assert (g_async_result_get_user_data (result) == user_data); + + if (g_async_result_legacy_propagate_error (result, &error)) + { + g_assert (!g_task_is_valid (result, object)); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + g_assert (g_simple_async_result_is_valid (result, object, test_legacy_error)); + G_GNUC_END_IGNORE_DEPRECATIONS; + + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + *result_out = -2; + } + else + { + g_assert (g_task_is_valid (result, object)); + + *result_out = g_task_propagate_int (G_TASK (result), NULL); + /* Might be error, might not */ + } + + g_main_loop_quit (loop); +} + +static gboolean +legacy_error_return (gpointer user_data) +{ + if (G_IS_TASK (user_data)) + { + GTask *task = user_data; + + g_task_return_int (task, magic); + g_object_unref (task); + } + else + { + GSimpleAsyncResult *simple = user_data; + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + g_simple_async_result_set_error (simple, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Failed"); + g_simple_async_result_complete (simple); + G_GNUC_END_IGNORE_DEPRECATIONS; + g_object_unref (simple); + } + + return FALSE; +} + +static void +test_legacy_error (void) +{ + GTask *task; + GSimpleAsyncResult *simple; + gssize result; + + /* GTask success */ + task = g_task_new (NULL, NULL, legacy_error_callback, &result); + g_task_set_source_tag (task, test_legacy_error); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_idle_add (legacy_error_return, task); + g_main_loop_run (loop); + + g_assert_cmpint (result, ==, magic); + g_assert (task == NULL); + + /* GTask error */ + task = g_task_new (NULL, NULL, legacy_error_callback, &result); + g_task_set_source_tag (task, test_legacy_error); + g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); + + g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, + "Failed"); + g_object_unref (task); + g_main_loop_run (loop); + + g_assert_cmpint (result, ==, -1); + g_assert (task == NULL); + + /* GSimpleAsyncResult error */ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + simple = g_simple_async_result_new (NULL, legacy_error_callback, &result, + test_legacy_error); + G_GNUC_END_IGNORE_DEPRECATIONS; + g_object_add_weak_pointer (G_OBJECT (simple), (gpointer *)&simple); + + g_idle_add (legacy_error_return, simple); + g_main_loop_run (loop); + + g_assert_cmpint (result, ==, -2); + g_assert (simple == NULL); +} + + +int +main (int argc, char **argv) +{ + int ret; + + g_test_init (&argc, &argv, NULL); + + loop = g_main_loop_new (NULL, FALSE); + main_thread = g_thread_self (); + magic = g_get_monotonic_time (); + + g_test_add_func ("/gtask/basic", test_basic); + g_test_add_func ("/gtask/error", test_error); + g_test_add_func ("/gtask/return-from-same-iteration", test_return_from_same_iteration); + g_test_add_func ("/gtask/return-from-toplevel", test_return_from_toplevel); + g_test_add_func ("/gtask/return-from-anon-thread", test_return_from_anon_thread); + g_test_add_func ("/gtask/return-from-wrong-thread", test_return_from_wrong_thread); + g_test_add_func ("/gtask/no-callback", test_no_callback); + g_test_add_func ("/gtask/report-error", test_report_error); + g_test_add_func ("/gtask/priority", test_priority); + g_test_add_func ("/gtask/check-cancellable", test_check_cancellable); + g_test_add_func ("/gtask/return-if-cancelled", test_return_if_cancelled); + g_test_add_func ("/gtask/run-in-thread", test_run_in_thread); + g_test_add_func ("/gtask/run-in-thread-sync", test_run_in_thread_sync); + g_test_add_func ("/gtask/run-in-thread-priority", test_run_in_thread_priority); + g_test_add_func ("/gtask/run-in-thread-nested", test_run_in_thread_nested); + g_test_add_func ("/gtask/return-on-cancel", test_return_on_cancel); + g_test_add_func ("/gtask/return-on-cancel-sync", test_return_on_cancel_sync); + g_test_add_func ("/gtask/return-on-cancel-atomic", test_return_on_cancel_atomic); + g_test_add_func ("/gtask/return-pointer", test_return_pointer); + g_test_add_func ("/gtask/object-keepalive", test_object_keepalive); + g_test_add_func ("/gtask/legacy-error", test_legacy_error); + + ret = g_test_run(); + + g_main_loop_unref (loop); + + return ret; +} diff --git a/gio/tests/test-codegen.xml b/gio/tests/test-codegen.xml new file mode 100644 index 0000000..505ae5c --- /dev/null +++ b/gio/tests/test-codegen.xml @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + yadaydaydaydayda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gio/tests/test-io-stream.c b/gio/tests/test-io-stream.c new file mode 100644 index 0000000..3338a9d --- /dev/null +++ b/gio/tests/test-io-stream.c @@ -0,0 +1,104 @@ +/* Simple I/O stream. This is a utility class for tests, not a test. + * + * Copyright © 2008-2010 Red Hat, Inc. + * Copyright © 2011 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. + * + * Author: David Zeuthen + * Author: Simon McVittie + */ + +#include + +#include "test-io-stream.h" + +G_DEFINE_TYPE (TestIOStream, test_io_stream, G_TYPE_IO_STREAM) + +static void +test_io_stream_finalize (GObject *object) +{ + TestIOStream *stream = TEST_IO_STREAM (object); + + /* strictly speaking we should unref these in dispose, but + * g_io_stream_dispose() wants them to still exist + */ + g_clear_object (&stream->input_stream); + g_clear_object (&stream->output_stream); + + G_OBJECT_CLASS (test_io_stream_parent_class)->finalize (object); +} + +static void +test_io_stream_init (TestIOStream *stream) +{ +} + +static GInputStream * +test_io_stream_get_input_stream (GIOStream *_stream) +{ + TestIOStream *stream = TEST_IO_STREAM (_stream); + + return stream->input_stream; +} + +static GOutputStream * +test_io_stream_get_output_stream (GIOStream *_stream) +{ + TestIOStream *stream = TEST_IO_STREAM (_stream); + + return stream->output_stream; +} + +static void +test_io_stream_class_init (TestIOStreamClass *klass) +{ + GObjectClass *gobject_class; + GIOStreamClass *giostream_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = test_io_stream_finalize; + + giostream_class = G_IO_STREAM_CLASS (klass); + giostream_class->get_input_stream = test_io_stream_get_input_stream; + giostream_class->get_output_stream = test_io_stream_get_output_stream; +} + +/* + * test_io_stream_new: + * @input_stream: an input stream + * @output_stream: an output stream + * + * Return a simple #GIOStream binding together @input_stream and + * @output_stream. They have no additional semantics as a result of being + * part of this I/O stream: in particular, closing one does not close + * the other (although closing the #GIOStream will close both sub-streams). + * + * Returns: (transfer full): a new #GIOStream + */ +GIOStream * +test_io_stream_new (GInputStream *input_stream, + GOutputStream *output_stream) +{ + TestIOStream *stream; + + g_return_val_if_fail (G_IS_INPUT_STREAM (input_stream), NULL); + g_return_val_if_fail (G_IS_OUTPUT_STREAM (output_stream), NULL); + stream = TEST_IO_STREAM (g_object_new (TEST_TYPE_IO_STREAM, NULL)); + stream->input_stream = g_object_ref (input_stream); + stream->output_stream = g_object_ref (output_stream); + return G_IO_STREAM (stream); +} diff --git a/gio/tests/test-io-stream.h b/gio/tests/test-io-stream.h new file mode 100644 index 0000000..60feceb --- /dev/null +++ b/gio/tests/test-io-stream.h @@ -0,0 +1,53 @@ +/* Simple I/O stream. This is a utility module for tests, not a test. + * + * Copyright © 2008-2010 Red Hat, Inc. + * Copyright © 2011 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. + * + * Author: David Zeuthen + * Author: Simon McVittie + */ + +#ifndef TEST_IO_STREAM_H +#define TEST_IO_STREAM_H + +#include + +typedef struct +{ + GIOStream parent_instance; + GInputStream *input_stream; + GOutputStream *output_stream; +} TestIOStream; + +typedef struct +{ + GIOStreamClass parent_class; +} TestIOStreamClass; + +GType test_io_stream_get_type (void) G_GNUC_CONST; + +#define TEST_TYPE_IO_STREAM (test_io_stream_get_type ()) +#define TEST_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TEST_TYPE_IO_STREAM, TestIOStream)) +#define TEST_IS_IO_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TEST_TYPE_IO_STREAM)) + +GIOStream *test_io_stream_new (GInputStream *input_stream, + GOutputStream *output_stream); + +#endif /* guard */ diff --git a/gio/tests/test-pipe-unix.c b/gio/tests/test-pipe-unix.c new file mode 100644 index 0000000..4b348db --- /dev/null +++ b/gio/tests/test-pipe-unix.c @@ -0,0 +1,131 @@ +/* Unix pipe-to-self. This is a utility module for tests, not a test. + * + * Copyright © 2008-2010 Red Hat, Inc. + * Copyright © 2011 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. + * + * Author: Simon McVittie + */ + +#include +#include + +#include + +#include "test-io-stream.h" +#include "test-pipe-unix.h" + +#ifdef G_OS_UNIX +# include +# include +#else +# error This module only exists on Unix +#endif + +/* + * test_pipe: + * @is: (out) (allow-none): used to return a #GInputStream + * @os: (out) (allow-none): used to return a #GOutputStream + * @error: used to raise an error + * + * Return a "pipe to self" connecting @is to @os. This can be used + * as a unidirectional pipe to or from a child process, for instance. + * + * See test_bidi_pipe() if you want to emulate a bidirectional pipe + * via a pair of unidirectional pipes. + * + * Returns: %TRUE on success + */ +gboolean +test_pipe (GInputStream **is, + GOutputStream **os, + GError **error) +{ + int pipefd[2]; + int ret; + + ret = pipe (pipefd); + + if (ret != 0) + { + int e = errno; + + g_set_error (error, G_IO_ERROR, g_io_error_from_errno (e), + "%s", g_strerror (e)); + return FALSE; + } + + if (is != NULL) + *is = g_unix_input_stream_new (pipefd[0], TRUE); + else + close (pipefd[0]); + + if (os != NULL) + *os = g_unix_output_stream_new (pipefd[1], TRUE); + else + close (pipefd[1]); + + return TRUE; +} + +/* + * test_bidi_pipe: + * @left: (out) (allow-none): used to return one #GIOStream + * @right: (out) (allow-none): used to return the other #GIOStream + * @error: used to raise an error + * + * Return two #GIOStreams connected to each other with pipes. + * The "left" input stream is connected by a unidirectional pipe + * to the "right" output stream, and vice versa. This can be used + * as a bidirectional pipe to a child process, for instance. + * + * See test_pipe() if you only need a one-way pipe. + * + * Returns: %TRUE on success + */ +gboolean +test_bidi_pipe (GIOStream **left, + GIOStream **right, + GError **error) +{ + GInputStream *left_in = NULL; + GOutputStream *left_out = NULL; + GInputStream *right_in = NULL; + GOutputStream *right_out = NULL; + gboolean ret = FALSE; + + if (!test_pipe (&left_in, &right_out, error)) + goto out; + + if (!test_pipe (&right_in, &left_out, error)) + goto out; + + if (left != NULL) + *left = test_io_stream_new (left_in, left_out); + + if (right != NULL) + *right = test_io_stream_new (right_in, right_out); + + ret = TRUE; + +out: + g_clear_object (&left_in); + g_clear_object (&left_out); + g_clear_object (&right_in); + g_clear_object (&right_out); + return ret; +} diff --git a/gio/tests/test-pipe-unix.h b/gio/tests/test-pipe-unix.h new file mode 100644 index 0000000..37a5a48 --- /dev/null +++ b/gio/tests/test-pipe-unix.h @@ -0,0 +1,37 @@ +/* Unix pipe-to-self. This is a utility module for tests, not a test. + * + * Copyright © 2008-2010 Red Hat, Inc. + * Copyright © 2011 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. + * + * Author: Simon McVittie + */ + +#ifndef TEST_PIPE_UNIX_H +#define TEST_PIPE_UNIX_H + +#include + +gboolean test_pipe (GInputStream **is, + GOutputStream **os, + GError **error); + +gboolean test_bidi_pipe (GIOStream **left, + GIOStream **right, + GError **error); + +#endif /* guard */ diff --git a/gio/tests/test.gresource.xml b/gio/tests/test.gresource.xml new file mode 100644 index 0000000..15361e6 --- /dev/null +++ b/gio/tests/test.gresource.xml @@ -0,0 +1,11 @@ + + + + test1.txt + test.gresource.xml + + + test2.txt + test2.txt + + diff --git a/gio/tests/test1.txt b/gio/tests/test1.txt new file mode 100644 index 0000000..a5bce3f --- /dev/null +++ b/gio/tests/test1.txt @@ -0,0 +1 @@ +test1 diff --git a/gio/tests/test2.gresource.xml b/gio/tests/test2.gresource.xml new file mode 100644 index 0000000..6876280 --- /dev/null +++ b/gio/tests/test2.gresource.xml @@ -0,0 +1,6 @@ + + + + test1.txt + + diff --git a/gio/tests/test2.txt b/gio/tests/test2.txt new file mode 100644 index 0000000..180cf83 --- /dev/null +++ b/gio/tests/test2.txt @@ -0,0 +1 @@ +test2 diff --git a/gio/tests/test3.gresource.xml b/gio/tests/test3.gresource.xml new file mode 100644 index 0000000..fdf26fa --- /dev/null +++ b/gio/tests/test3.gresource.xml @@ -0,0 +1,6 @@ + + + + test1.txt + + diff --git a/gio/tests/test3.txt b/gio/tests/test3.txt new file mode 100644 index 0000000..df6b0d2 --- /dev/null +++ b/gio/tests/test3.txt @@ -0,0 +1 @@ +test3 diff --git a/gio/tests/test4.gresource.xml b/gio/tests/test4.gresource.xml new file mode 100644 index 0000000..ddd7304 --- /dev/null +++ b/gio/tests/test4.gresource.xml @@ -0,0 +1,6 @@ + + + + test1.txt + + diff --git a/gio/tests/testenum.h b/gio/tests/testenum.h new file mode 100644 index 0000000..def8713 --- /dev/null +++ b/gio/tests/testenum.h @@ -0,0 +1,16 @@ +typedef enum +{ + TEST_ENUM_FOO, + TEST_ENUM_BAR, + TEST_ENUM_BAZ, + TEST_ENUM_QUUX +} TestEnum; + +typedef enum +{ + TEST_FLAGS_NONE = 0, + TEST_FLAGS_MOURNING = (1 << 0), + TEST_FLAGS_LAUGHING = (1 << 1), + TEST_FLAGS_TALKING = (1 << 2), + TEST_FLAGS_WALKING = (1 << 3) +} TestFlags; diff --git a/gio/tests/tls-certificate.c b/gio/tests/tls-certificate.c new file mode 100644 index 0000000..4db07b3 --- /dev/null +++ b/gio/tests/tls-certificate.c @@ -0,0 +1,313 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Nicolas Dufresne + */ + +#include "config.h" + +#include + +#include "gtesttlsbackend.h" + +typedef struct +{ + gchar *cert_pems[3]; + gchar *key_pem; + gchar *key8_pem; +} Reference; + +static void +pem_parser (const Reference *ref) +{ + GTlsCertificate *cert; + gchar *pem; + gchar *parsed_cert_pem = NULL; + const gchar *parsed_key_pem = NULL; + GError *error = NULL; + + /* Check PEM parsing in certificate, private key order. */ + g_file_get_contents (SRCDIR "/cert-key.pem", &pem, NULL, &error); + g_assert_no_error (error); + g_assert (pem); + + cert = g_tls_certificate_new_from_pem (pem, -1, &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert_cmpstr (parsed_key_pem, ==, ref->key_pem); + parsed_key_pem = NULL; + + g_object_unref (cert); + + /* Make sure length is respected and parser detect invalid (truncated) PEM. */ + cert = g_tls_certificate_new_from_pem (pem, 10, &error); + g_assert_error (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE); + g_clear_error (&error); + g_free (pem); + + /* Check PEM parsing in private key, certificate order */ + g_file_get_contents (SRCDIR "/key-cert.pem", &pem, NULL, &error); + g_assert_no_error (error); + g_assert (pem); + + cert = g_tls_certificate_new_from_pem (pem, -1, &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert_cmpstr (parsed_key_pem, ==, ref->key_pem); + parsed_key_pem = NULL; + + g_free (pem); + g_object_unref (cert); + + /* Check certificate only PEM */ + g_file_get_contents (SRCDIR "/cert1.pem", &pem, NULL, &error); + g_assert_no_error (error); + g_assert (pem); + + cert = g_tls_certificate_new_from_pem (pem, -1, &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert (parsed_key_pem == NULL); + + g_free (pem); + g_object_unref (cert); + + /* Check error with private key only PEM */ + g_file_get_contents (SRCDIR "/key.pem", &pem, NULL, &error); + g_assert_no_error (error); + g_assert (pem); + + cert = g_tls_certificate_new_from_pem (pem, -1, &error); + g_assert_error (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE); + g_clear_error (&error); + g_assert (cert == NULL); + g_free (pem); +} + +static void +from_file (const Reference *ref) +{ + GTlsCertificate *cert; + gchar *parsed_cert_pem = NULL; + const gchar *parsed_key_pem = NULL; + GError *error = NULL; + + cert = g_tls_certificate_new_from_file (SRCDIR "/key-cert.pem", &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert_cmpstr (parsed_key_pem, ==, ref->key_pem); + parsed_key_pem = NULL; + + g_object_unref (cert); +} + +static void +from_files (const Reference *ref) +{ + GTlsCertificate *cert; + gchar *parsed_cert_pem = NULL; + const gchar *parsed_key_pem = NULL; + GError *error = NULL; + + cert = g_tls_certificate_new_from_files (SRCDIR "/cert1.pem", + SRCDIR "/key.pem", + &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert_cmpstr (parsed_key_pem, ==, ref->key_pem); + parsed_key_pem = NULL; + + g_object_unref (cert); + + /* Missing private key */ + cert = g_tls_certificate_new_from_files (SRCDIR "/cert1.pem", + SRCDIR "/cert2.pem", + &error); + g_assert_error (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE); + g_clear_error (&error); + g_assert (cert == NULL); + + /* Missing certificate */ + cert = g_tls_certificate_new_from_files (SRCDIR "/key.pem", + SRCDIR "/key.pem", + &error); + g_assert_error (error, G_TLS_ERROR, G_TLS_ERROR_BAD_CERTIFICATE); + g_clear_error (&error); + g_assert (cert == NULL); + + /* Using this method twice with a file containing both private key and + * certificate as a way to inforce private key presence is a fair use */ + cert = g_tls_certificate_new_from_files (SRCDIR "/key-cert.pem", + SRCDIR "/key-cert.pem", + &error); + g_assert_no_error (error); + g_assert (cert); + g_object_unref (cert); +} + + +static void +from_files_pkcs8 (const Reference *ref) +{ + GTlsCertificate *cert; + gchar *parsed_cert_pem = NULL; + const gchar *parsed_key_pem = NULL; + GError *error = NULL; + + cert = g_tls_certificate_new_from_files (SRCDIR "/cert1.pem", + SRCDIR "/key8.pem", + &error); + g_assert_no_error (error); + g_assert (cert); + + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]); + g_free (parsed_cert_pem); + parsed_cert_pem = NULL; + g_assert_cmpstr (parsed_key_pem, ==, ref->key8_pem); + parsed_key_pem = NULL; + + g_object_unref (cert); +} + +static void +list_from_file (const Reference *ref) +{ + GList *list, *l; + GError *error = NULL; + int i; + + list = g_tls_certificate_list_new_from_file (SRCDIR "/cert-list.pem", &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (list), ==, 3); + + l = list; + for (i = 0; i < 3; i++) + { + GTlsCertificate *cert = l->data; + gchar *parsed_cert_pem = NULL; + g_object_get (cert, + "certificate-pem", &parsed_cert_pem, + NULL); + g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[i]); + g_free (parsed_cert_pem); + l = g_list_next (l); + } + + g_list_free_full (list, g_object_unref); + + /* Empty list is not an error */ + list = g_tls_certificate_list_new_from_file (SRCDIR "/nothing.pem", &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (list), ==, 0); +} + +int +main (int argc, + char *argv[]) +{ + int rtv; + Reference ref; + GError *error = NULL; + + g_test_init (&argc, &argv, NULL); + + _g_test_tls_backend_get_type (); + + /* Load reference PEM */ + g_file_get_contents (SRCDIR "/cert1.pem", &ref.cert_pems[0], NULL, &error); + g_assert_no_error (error); + g_assert (ref.cert_pems[0]); + g_file_get_contents (SRCDIR "/cert2.pem", &ref.cert_pems[1], NULL, &error); + g_assert_no_error (error); + g_assert (ref.cert_pems[1]); + g_file_get_contents (SRCDIR "/cert3.pem", &ref.cert_pems[2], NULL, &error); + g_assert_no_error (error); + g_assert (ref.cert_pems[2]); + g_file_get_contents (SRCDIR "/key.pem", &ref.key_pem, NULL, &error); + g_assert_no_error (error); + g_assert (ref.key_pem); + g_file_get_contents (SRCDIR "/key8.pem", &ref.key8_pem, NULL, &error); + g_assert_no_error (error); + g_assert (ref.key8_pem); + + g_test_add_data_func ("/tls-certificate/pem-parser", + &ref, (GTestDataFunc)pem_parser); + g_test_add_data_func ("/tls-certificate/from_file", + &ref, (GTestDataFunc)from_file); + g_test_add_data_func ("/tls-certificate/from_files", + &ref, (GTestDataFunc)from_files); + g_test_add_data_func ("/tls-certificate/from_files_pkcs8", + &ref, (GTestDataFunc)from_files_pkcs8); + g_test_add_data_func ("/tls-certificate/list_from_file", + &ref, (GTestDataFunc)list_from_file); + + rtv = g_test_run(); + + g_free (ref.cert_pems[0]); + g_free (ref.cert_pems[1]); + g_free (ref.cert_pems[2]); + g_free (ref.key_pem); + g_free (ref.key8_pem); + + return rtv; +} diff --git a/gio/tests/tls-interaction.c b/gio/tests/tls-interaction.c new file mode 100644 index 0000000..a34ff29 --- /dev/null +++ b/gio/tests/tls-interaction.c @@ -0,0 +1,664 @@ +/* GLib testing framework examples and tests + * + * Copyright (C) 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Stef Walter + */ + +#include "config.h" + +#include + +typedef struct { + /* Class virtual interaction methods */ + gpointer ask_password_func; + gpointer ask_password_async_func; + gpointer ask_password_finish_func; + + /* Expected results */ + GTlsInteractionResult result; + GQuark error_domain; + gint error_code; + const gchar *error_message; +} Fixture; + +typedef struct { + GTlsInteraction *interaction; + GTlsPassword *password; + GMainLoop *loop; + GThread *interaction_thread; + GThread *test_thread; + GThread *loop_thread; + const Fixture *fixture; +} Test; + +typedef struct { + GTlsInteraction parent; + Test *test; +} TestInteraction; + +typedef struct { + GTlsInteractionClass parent; +} TestInteractionClass; + +static GType test_interaction_get_type (void); +G_DEFINE_TYPE (TestInteraction, test_interaction, G_TYPE_TLS_INTERACTION); + +#define TEST_TYPE_INTERACTION (test_interaction_get_type ()) +#define TEST_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TEST_TYPE_INTERACTION, TestInteraction)) +#define TEST_IS_INTERACTION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TEST_TYPE_INTERACTION)) + +static void +test_interaction_init (TestInteraction *self) +{ + +} + +static void +test_interaction_class_init (TestInteractionClass *klass) +{ + /* By default no virtual methods */ +} + +static void +test_interaction_ask_password_async_success (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (G_IS_TLS_PASSWORD (password)); + g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (self, cancellable, callback, user_data); + + /* Don't do this in real life. Include a null terminator for testing */ + g_tls_password_set_value (password, (const guchar *)"the password", 13); + g_task_return_int (task, G_TLS_INTERACTION_HANDLED); + g_object_unref (task); +} + + +static GTlsInteractionResult +test_interaction_ask_password_finish_success (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (g_task_is_valid (result, interaction)); + g_assert (error != NULL); + g_assert (*error == NULL); + + return g_task_propagate_int (G_TASK (result), error); +} + +static void +test_interaction_ask_password_async_failure (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (G_IS_TLS_PASSWORD (password)); + g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + + task = g_task_new (self, cancellable, callback, user_data); + + g_task_return_new_error (task, G_FILE_ERROR, G_FILE_ERROR_ACCES, "The message"); + g_object_unref (task); +} + +static GTlsInteractionResult +test_interaction_ask_password_finish_failure (GTlsInteraction *interaction, + GAsyncResult *result, + GError **error) +{ + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (g_task_is_valid (result, interaction)); + g_assert (error != NULL); + g_assert (*error == NULL); + + if (g_task_propagate_int (G_TASK (result), error) != -1) + g_assert_not_reached (); + + return G_TLS_INTERACTION_FAILED; +} + + +static GTlsInteractionResult +test_interaction_ask_password_sync_success (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (G_IS_TLS_PASSWORD (password)); + g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_assert (error != NULL); + g_assert (*error == NULL); + + /* Don't do this in real life. Include a null terminator for testing */ + g_tls_password_set_value (password, (const guchar *)"the password", 13); + return G_TLS_INTERACTION_HANDLED; +} + +static GTlsInteractionResult +test_interaction_ask_password_sync_failure (GTlsInteraction *interaction, + GTlsPassword *password, + GCancellable *cancellable, + GError **error) +{ + TestInteraction *self; + + g_assert (TEST_IS_INTERACTION (interaction)); + self = TEST_INTERACTION (interaction); + + g_assert (g_thread_self () == self->test->interaction_thread); + + g_assert (G_IS_TLS_PASSWORD (password)); + g_assert (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); + g_assert (error != NULL); + g_assert (*error == NULL); + + g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_ACCES, "The message"); + return G_TLS_INTERACTION_FAILED; +} + +/* ---------------------------------------------------------------------------- + * ACTUAL TESTS + */ + +static void +on_ask_password_async_call (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + Test *test = user_data; + GTlsInteractionResult res; + GError *error = NULL; + + g_assert (G_IS_TLS_INTERACTION (source)); + g_assert (G_TLS_INTERACTION (source) == test->interaction); + + /* Check that this callback is being run in the right place */ + g_assert (g_thread_self () == test->interaction_thread); + + res = g_tls_interaction_ask_password_finish (test->interaction, result, + &error); + + /* Check that the results match the fixture */ + g_assert_cmpuint (test->fixture->result, ==, res); + switch (test->fixture->result) + { + case G_TLS_INTERACTION_HANDLED: + g_assert_no_error (error); + g_assert_cmpstr ((const gchar *)g_tls_password_get_value (test->password, NULL), ==, "the password"); + break; + case G_TLS_INTERACTION_FAILED: + g_assert_error (error, test->fixture->error_domain, test->fixture->error_code); + g_assert_cmpstr (error->message, ==, test->fixture->error_message); + g_clear_error (&error); + break; + case G_TLS_INTERACTION_UNHANDLED: + g_assert_no_error (error); + break; + default: + g_assert_not_reached (); + } + + /* Signal the end of the test */ + g_main_loop_quit (test->loop); +} + +static void +test_ask_password_async (Test *test, + gconstpointer unused) +{ + /* This test only works with a main loop */ + g_assert (test->loop); + + g_tls_interaction_ask_password_async (test->interaction, + test->password, NULL, + on_ask_password_async_call, + test); + + /* teardown waits until g_main_loop_quit(). called from callback */ +} + +static void +test_invoke_ask_password (Test *test, + gconstpointer unused) +{ + GTlsInteractionResult res; + GError *error = NULL; + + res = g_tls_interaction_invoke_ask_password (test->interaction, test->password, + NULL, &error); + + /* Check that the results match the fixture */ + g_assert_cmpuint (test->fixture->result, ==, res); + switch (test->fixture->result) + { + case G_TLS_INTERACTION_HANDLED: + g_assert_no_error (error); + g_assert_cmpstr ((const gchar *)g_tls_password_get_value (test->password, NULL), ==, "the password"); + break; + case G_TLS_INTERACTION_FAILED: + g_assert_error (error, test->fixture->error_domain, test->fixture->error_code); + g_assert_cmpstr (error->message, ==, test->fixture->error_message); + g_clear_error (&error); + break; + case G_TLS_INTERACTION_UNHANDLED: + g_assert_no_error (error); + break; + default: + g_assert_not_reached (); + } + + /* This allows teardown to stop if running with loop */ + if (test->loop) + g_main_loop_quit (test->loop); +} + +static void +test_ask_password (Test *test, + gconstpointer unused) +{ + GTlsInteractionResult res; + GError *error = NULL; + + res = g_tls_interaction_ask_password (test->interaction, test->password, + NULL, &error); + + /* Check that the results match the fixture */ + g_assert_cmpuint (test->fixture->result, ==, res); + switch (test->fixture->result) + { + case G_TLS_INTERACTION_HANDLED: + g_assert_no_error (error); + g_assert_cmpstr ((const gchar *)g_tls_password_get_value (test->password, NULL), ==, "the password"); + break; + case G_TLS_INTERACTION_FAILED: + g_assert_error (error, test->fixture->error_domain, test->fixture->error_code); + g_assert_cmpstr (error->message, ==, test->fixture->error_message); + g_clear_error (&error); + break; + case G_TLS_INTERACTION_UNHANDLED: + g_assert_no_error (error); + break; + default: + g_assert_not_reached (); + } + + /* This allows teardown to stop if running with loop */ + if (test->loop) + g_main_loop_quit (test->loop); +} + +/* ---------------------------------------------------------------------------- + * TEST SETUP + */ + +static void +setup_without_loop (Test *test, + gconstpointer user_data) +{ + const Fixture *fixture = user_data; + GTlsInteractionClass *klass; + test->fixture = fixture; + + test->interaction = g_object_new (TEST_TYPE_INTERACTION, NULL); + g_assert (TEST_IS_INTERACTION (test->interaction)); + + TEST_INTERACTION (test->interaction)->test = test; + + klass = G_TLS_INTERACTION_GET_CLASS (test->interaction); + klass->ask_password = fixture->ask_password_func; + klass->ask_password_async = fixture->ask_password_async_func; + klass->ask_password_finish = fixture->ask_password_finish_func; + + test->password = g_tls_password_new (0, "Description"); + test->test_thread = g_thread_self (); + + /* + * If no loop is running then interaction should happen in the same + * thread that the tests are running in. + */ + test->interaction_thread = test->test_thread; +} + +static void +teardown_without_loop (Test *test, + gconstpointer unused) +{ + gpointer weak_pointer = test->interaction; + + g_object_add_weak_pointer (weak_pointer, &weak_pointer); + + g_object_unref (test->password); + + g_object_unref (test->interaction); + + g_assert (weak_pointer == NULL); + +} + +typedef struct { + GMutex loop_mutex; + GCond loop_started; + gboolean started; + Test *test; +} ThreadLoop; + +static gpointer +thread_loop (gpointer user_data) +{ + GMainContext *context = g_main_context_default (); + ThreadLoop *closure = user_data; + Test *test = closure->test; + + g_mutex_lock (&closure->loop_mutex); + + g_assert (test->loop_thread == g_thread_self ()); + g_assert (test->loop == NULL); + test->loop = g_main_loop_new (context, TRUE); + + g_main_context_acquire (context); + closure->started = TRUE; + g_cond_signal (&closure->loop_started); + g_mutex_unlock (&closure->loop_mutex); + + while (g_main_loop_is_running (test->loop)) + g_main_context_iteration (context, TRUE); + + g_main_context_release (context); + return test; +} + +static void +setup_with_thread_loop (Test *test, + gconstpointer user_data) +{ + ThreadLoop closure; + + setup_without_loop (test, user_data); + + g_mutex_init (&closure.loop_mutex); + g_cond_init (&closure.loop_started); + closure.started = FALSE; + closure.test = test; + + g_mutex_lock (&closure.loop_mutex); + test->loop_thread = g_thread_new ("loop", thread_loop, &closure); + while (!closure.started) + g_cond_wait (&closure.loop_started, &closure.loop_mutex); + g_mutex_unlock (&closure.loop_mutex); + + /* + * When a loop is running then interaction should always occur in the main + * context of that loop. + */ + test->interaction_thread = test->loop_thread; + + g_mutex_clear (&closure.loop_mutex); + g_cond_clear (&closure.loop_started); +} + +static void +teardown_with_thread_loop (Test *test, + gconstpointer unused) +{ + gpointer check; + + g_assert (test->loop_thread); + check = g_thread_join (test->loop_thread); + g_assert (check == test); + test->loop_thread = NULL; + + g_main_loop_unref (test->loop); + + teardown_without_loop (test, unused); +} + +static void +setup_with_normal_loop (Test *test, + gconstpointer user_data) +{ + GMainContext *context; + + setup_without_loop (test, user_data); + + context = g_main_context_default (); + if (!g_main_context_acquire (context)) + g_assert_not_reached (); + + test->loop = g_main_loop_new (context, TRUE); + g_assert (g_main_loop_is_running (test->loop)); +} + +static void +teardown_with_normal_loop (Test *test, + gconstpointer unused) +{ + GMainContext *context; + + context = g_main_context_default (); + while (g_main_loop_is_running (test->loop)) + g_main_context_iteration (context, TRUE); + + g_main_context_release (context); + + /* Run test until complete */ + g_main_loop_unref (test->loop); + test->loop = NULL; + + teardown_without_loop (test, unused); +} + +typedef void (*TestFunc) (Test *test, gconstpointer data); + +static void +test_with_async_ask_password_implementations (const gchar *name, + TestFunc setup, + TestFunc func, + TestFunc teardown, + GPtrArray *fixtures) +{ + gchar *test_name; + Fixture *fixture; + + /* Async implementation that succeeds */ + fixture = g_new0 (Fixture, 1); + fixture->ask_password_async_func = test_interaction_ask_password_async_success; + fixture->ask_password_finish_func = test_interaction_ask_password_finish_success; + fixture->ask_password_func = NULL; + fixture->result = G_TLS_INTERACTION_HANDLED; + test_name = g_strdup_printf ("%s/async-implementation-success", name); + g_test_add (test_name, Test, fixture, setup, func, teardown); + g_free (test_name); + g_ptr_array_add (fixtures, fixture); + + /* Async implementation that fails */ + fixture = g_new0 (Fixture, 1); + fixture->ask_password_async_func = test_interaction_ask_password_async_failure; + fixture->ask_password_finish_func = test_interaction_ask_password_finish_failure; + fixture->ask_password_func = NULL; + fixture->result = G_TLS_INTERACTION_FAILED; + fixture->error_domain = G_FILE_ERROR; + fixture->error_code = G_FILE_ERROR_ACCES; + fixture->error_message = "The message"; + test_name = g_strdup_printf ("%s/async-implementation-failure", name); + g_test_add (test_name, Test, fixture, setup, func, teardown); + g_free (test_name); + g_ptr_array_add (fixtures, fixture); +} +static void +test_with_unhandled_ask_password_implementations (const gchar *name, + TestFunc setup, + TestFunc func, + TestFunc teardown, + GPtrArray *fixtures) +{ + gchar *test_name; + Fixture *fixture; + + /* Unhandled implementation */ + fixture = g_new0 (Fixture, 1); + fixture->ask_password_async_func = NULL; + fixture->ask_password_finish_func = NULL; + fixture->ask_password_func = NULL; + fixture->result = G_TLS_INTERACTION_UNHANDLED; + test_name = g_strdup_printf ("%s/unhandled-implementation", name); + g_test_add (test_name, Test, fixture, setup, func, teardown); + g_free (test_name); + g_ptr_array_add (fixtures, fixture); +} + +static void +test_with_sync_ask_password_implementations (const gchar *name, + TestFunc setup, + TestFunc func, + TestFunc teardown, + GPtrArray *fixtures) +{ + gchar *test_name; + Fixture *fixture; + + /* Sync implementation that succeeds */ + fixture = g_new0 (Fixture, 1); + fixture->ask_password_async_func = NULL; + fixture->ask_password_finish_func = NULL; + fixture->ask_password_func = test_interaction_ask_password_sync_success; + fixture->result = G_TLS_INTERACTION_HANDLED; + test_name = g_strdup_printf ("%s/sync-implementation-success", name); + g_test_add (test_name, Test, fixture, setup, func, teardown); + g_free (test_name); + g_ptr_array_add (fixtures, fixture); + + /* Async implementation that fails */ + fixture = g_new0 (Fixture, 1); + fixture->ask_password_async_func = NULL; + fixture->ask_password_finish_func = NULL; + fixture->ask_password_func = test_interaction_ask_password_sync_failure; + fixture->result = G_TLS_INTERACTION_FAILED; + fixture->error_domain = G_FILE_ERROR; + fixture->error_code = G_FILE_ERROR_ACCES; + fixture->error_message = "The message"; + test_name = g_strdup_printf ("%s/sync-implementation-failure", name); + g_test_add (test_name, Test, fixture, setup, func, teardown); + g_free (test_name); + g_ptr_array_add (fixtures, fixture); +} + +int +main (int argc, + char *argv[]) +{ + GPtrArray *fixtures; + gint ret; + + g_test_init (&argc, &argv, NULL); + + fixtures = g_ptr_array_new_with_free_func (g_free); + + /* Tests for g_tls_interaction_invoke_ask_password */ + + test_with_unhandled_ask_password_implementations ("/tls-interaction/ask-password/invoke-with-loop", + setup_with_thread_loop, test_invoke_ask_password, + teardown_with_thread_loop, fixtures); + test_with_async_ask_password_implementations ("/tls-interaction/ask-password/invoke-with-loop", + setup_with_thread_loop, test_invoke_ask_password, + teardown_with_thread_loop, fixtures); + test_with_sync_ask_password_implementations ("/tls-interaction/ask-password/invoke-with-loop", + setup_with_thread_loop, test_invoke_ask_password, + teardown_with_thread_loop, fixtures); + + test_with_unhandled_ask_password_implementations ("/tls-interaction/ask-password/invoke-without-loop", + setup_without_loop, test_invoke_ask_password, + teardown_without_loop, fixtures); + test_with_async_ask_password_implementations ("/tls-interaction/ask-password/invoke-without-loop", + setup_without_loop, test_invoke_ask_password, + teardown_without_loop, fixtures); + test_with_sync_ask_password_implementations ("/tls-interaction/ask-password/invoke-without-loop", + setup_without_loop, test_invoke_ask_password, + teardown_without_loop, fixtures); + + test_with_unhandled_ask_password_implementations ("/tls-interaction/ask-password/invoke-in-loop", + setup_with_normal_loop, test_invoke_ask_password, + teardown_with_normal_loop, fixtures); + test_with_async_ask_password_implementations ("/tls-interaction/ask-password/invoke-in-loop", + setup_with_normal_loop, test_invoke_ask_password, + teardown_with_normal_loop, fixtures); + test_with_sync_ask_password_implementations ("/tls-interaction/ask-password/invoke-in-loop", + setup_with_normal_loop, test_invoke_ask_password, + teardown_with_normal_loop, fixtures); + + /* Tests for g_tls_interaction_ask_password */ + test_with_unhandled_ask_password_implementations ("/tls-interaction/ask-password/sync", + setup_without_loop, test_ask_password, + teardown_without_loop, fixtures); + test_with_sync_ask_password_implementations ("/tls-interaction/ask-password/sync", + setup_without_loop, test_ask_password, + teardown_without_loop, fixtures); + + /* Tests for g_tls_interaction_ask_password_async */ + test_with_unhandled_ask_password_implementations ("/tls-interaction/ask-password/async", + setup_with_normal_loop, test_ask_password_async, + teardown_with_normal_loop, fixtures); + test_with_async_ask_password_implementations ("/tls-interaction/ask-password/async", + setup_with_normal_loop, test_ask_password_async, + teardown_with_normal_loop, fixtures); + + ret = g_test_run(); + g_ptr_array_free (fixtures, TRUE); + return ret; +} diff --git a/gio/tests/unix-fd.c b/gio/tests/unix-fd.c new file mode 100644 index 0000000..4d984df --- /dev/null +++ b/gio/tests/unix-fd.c @@ -0,0 +1,242 @@ +#include +#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) +{ + GError *err = NULL; + GUnixFDMessage *message; + GUnixFDMessage **mv; + GUnixFDList *list, *l2; + GSocket *sockets[2]; + GSocketAddress *addr; + 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; + gchar *path; + GByteArray *array; + gboolean abstract; + GUnixSocketAddressType type; + + 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], &err); + g_assert_no_error (err); + s = close (sv[0]); + g_assert_cmpint (s, ==, 0); + g_unix_fd_message_append_fd (message, sv[1], &err); + g_assert_no_error (err); + s = close (sv[1]); + g_assert_cmpint (s, ==, 0); + + s = close (g_unix_fd_list_get (list, 0, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 0, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 0, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, &err)); + g_assert_no_error (err); + 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], &err); + g_assert_no_error (err); + g_assert_cmpint (s, >=, 0); + s = g_unix_fd_list_append (list, sv[1], &err); + g_assert_no_error (err); + 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, &err)); + g_assert_no_error (err); + g_assert_cmpint (s, ==, 0); + s = close (g_unix_fd_list_get (list, 1, &err)); + g_assert_no_error (err); + 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], &err); + g_assert_no_error (err); + g_assert (G_IS_SOCKET (sockets[0])); + sockets[1] = g_socket_new_from_fd (sv[1], &err); + g_assert_no_error (err); + g_assert (G_IS_SOCKET (sockets[1])); + + addr = g_socket_get_local_address (sockets[0], &err); + g_assert_no_error (err); + g_assert (G_IS_UNIX_SOCKET_ADDRESS (addr)); + g_assert_cmpint (g_unix_socket_address_get_address_type (G_UNIX_SOCKET_ADDRESS (addr)), ==, G_UNIX_SOCKET_ADDRESS_ANONYMOUS); + g_assert_cmpint (g_unix_socket_address_get_path_len (G_UNIX_SOCKET_ADDRESS (addr)), ==, 0); + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_assert (!g_unix_socket_address_get_is_abstract (G_UNIX_SOCKET_ADDRESS (addr))); +G_GNUC_END_IGNORE_DEPRECATIONS + + g_object_get (addr, + "path", &path, + "path-as-array", &array, + "abstract", &abstract, + "address-type", &type, + NULL); + g_assert_cmpstr (path, ==, ""); + g_assert_cmpint (array->len, ==, 0); + g_assert (!abstract); + g_assert (type == G_UNIX_SOCKET_ADDRESS_ANONYMOUS); + g_free (path); + g_byte_array_free (array, TRUE); + + g_object_unref (addr); + + buffer[0] = 0xff; + ov.buffer = buffer; + ov.size = 1; + s = g_socket_send_message (sockets[0], NULL, &ov, 1, + (GSocketControlMessage **) &message, + 1, 0, NULL, &err); + g_assert_no_error (err); + 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, &err); + g_assert_no_error (err); + 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, &err); + g_assert_no_error (err); + + 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_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..79a5711 --- /dev/null +++ b/gio/tests/unix-streams.c @@ -0,0 +1,363 @@ +/* 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_clear_error (&err); + 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 main_thread_read (GObject *source, GAsyncResult *res, gpointer user_data); +static void main_thread_skipped (GObject *source, GAsyncResult *res, gpointer user_data); +static void main_thread_wrote (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 +main_thread_skipped (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + GOutputStream *out = user_data; + GError *err = NULL; + gssize nskipped; + + nskipped = g_input_stream_skip_finish (in, res, &err); + + if (g_cancellable_is_cancelled (main_cancel)) + { + do_main_cancel (out); + return; + } + + g_assert_no_error (err); + + main_offset += nskipped; + if (main_offset == main_len) + { + main_offset = 0; + g_output_stream_write_async (out, main_buf, main_len, + G_PRIORITY_DEFAULT, main_cancel, + main_thread_wrote, in); + } + else + { + g_input_stream_skip_async (in, main_len - main_offset, + G_PRIORITY_DEFAULT, main_cancel, + main_thread_skipped, out); + } +} + +static void +main_thread_read (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + GOutputStream *out = user_data; + GError *err = NULL; + gssize nread; + + nread = g_input_stream_read_finish (in, res, &err); + + if (g_cancellable_is_cancelled (main_cancel)) + { + do_main_cancel (out); + return; + } + + g_assert_no_error (err); + + main_offset += nread; + if (main_offset == sizeof (DATA)) + { + main_len = main_offset; + main_offset = 0; + /* Now skip the same amount */ + g_input_stream_skip_async (in, main_len, + G_PRIORITY_DEFAULT, main_cancel, + main_thread_skipped, out); + } + else + { + g_input_stream_read_async (in, main_buf, sizeof (main_buf), + G_PRIORITY_DEFAULT, main_cancel, + main_thread_read, out); + } +} + +static void +main_thread_wrote (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_no_error (err); + g_assert_cmpint (nwrote, <=, main_len - main_offset); + + main_offset += nwrote; + if (main_offset == main_len) + { + main_offset = 0; + g_input_stream_read_async (in, main_buf, sizeof (main_buf), + G_PRIORITY_DEFAULT, main_cancel, + main_thread_read, out); + } + else + { + g_output_stream_write_async (out, main_buf + main_offset, + main_len - main_offset, + G_PRIORITY_DEFAULT, main_cancel, + main_thread_wrote, in); + } +} + +static gboolean +timeout (gpointer cancellable) +{ + g_cancellable_cancel (cancellable); + return FALSE; +} + +static void +test_pipe_io (gconstpointer nonblocking) +{ + 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 alternately read and skipped asynchronously by the + * main thread and then (if not skipped) 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); + + if (nonblocking) + { + GError *error = NULL; + + g_unix_set_fd_nonblocking (writer_pipe[0], TRUE, &error); + g_assert_no_error (error); + g_unix_set_fd_nonblocking (writer_pipe[1], TRUE, &error); + g_assert_no_error (error); + g_unix_set_fd_nonblocking (reader_pipe[0], TRUE, &error); + g_assert_no_error (error); + g_unix_set_fd_nonblocking (reader_pipe[1], TRUE, &error); + g_assert_no_error (error); + } + + writer_cancel = g_cancellable_new (); + reader_cancel = g_cancellable_new (); + main_cancel = g_cancellable_new (); + + writer = g_thread_new ("writer", writer_thread, NULL); + reader = g_thread_new ("reader", reader_thread, 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, + main_thread_read, 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); +} + +static void +test_basic (void) +{ + GUnixInputStream *is; + GUnixOutputStream *os; + gint fd; + gboolean close_fd; + + is = G_UNIX_INPUT_STREAM (g_unix_input_stream_new (0, TRUE)); + g_object_get (is, + "fd", &fd, + "close-fd", &close_fd, + NULL); + g_assert_cmpint (fd, ==, 0); + g_assert (close_fd); + + g_unix_input_stream_set_close_fd (is, FALSE); + g_assert (!g_unix_input_stream_get_close_fd (is)); + g_assert_cmpint (g_unix_input_stream_get_fd (is), ==, 0); + + g_object_unref (is); + + os = G_UNIX_OUTPUT_STREAM (g_unix_output_stream_new (1, TRUE)); + g_object_get (os, + "fd", &fd, + "close-fd", &close_fd, + NULL); + g_assert_cmpint (fd, ==, 1); + g_assert (close_fd); + + g_unix_output_stream_set_close_fd (os, FALSE); + g_assert (!g_unix_output_stream_get_close_fd (os)); + g_assert_cmpint (g_unix_output_stream_get_fd (os), ==, 1); + + g_object_unref (os); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/unix-streams/basic", test_basic); + g_test_add_data_func ("/unix-streams/pipe-io-test", + GINT_TO_POINTER (FALSE), + test_pipe_io); + g_test_add_data_func ("/unix-streams/nonblocking-io-test", + GINT_TO_POINTER (TRUE), + test_pipe_io); + + return g_test_run(); +} diff --git a/gio/tests/vfs.c b/gio/tests/vfs.c new file mode 100644 index 0000000..47ba3c0 --- /dev/null +++ b/gio/tests/vfs.c @@ -0,0 +1,54 @@ + +/* Unit tests for GVfs + * Copyright (C) 2011 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 + +static void +test_local (void) +{ + GVfs *vfs; + GFile *file; + gchar **schemes; + + vfs = g_vfs_get_local (); + g_assert (g_vfs_is_active (vfs)); + + file = g_vfs_get_file_for_uri (vfs, "not a good uri"); + g_assert (G_IS_FILE (file)); + g_object_unref (file); + + schemes = (gchar **)g_vfs_get_supported_uri_schemes (vfs); + + g_assert (g_strv_length (schemes) > 0); + g_assert_cmpstr (schemes[0], ==, "file"); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gvfs/local", test_local); + + return g_test_run (); +} diff --git a/gio/tests/volumemonitor.c b/gio/tests/volumemonitor.c new file mode 100644 index 0000000..6b61c30 --- /dev/null +++ b/gio/tests/volumemonitor.c @@ -0,0 +1,181 @@ +#include + +static GVolumeMonitor *monitor; + +static void +do_mount_tests (GDrive *drive, GVolume *volume, GMount *mount) +{ + GDrive *d; + GVolume *v; + gchar *name; + gchar *uuid; + + name = g_mount_get_name (mount); + g_assert (name != NULL); + g_free (name); + + v = g_mount_get_volume (mount); + g_assert (v == volume); + if (v != NULL) + g_object_unref (v); + + d = g_mount_get_drive (mount); + g_assert (d == drive); + if (d != NULL) + g_object_unref (d); + + uuid = g_mount_get_uuid (mount); + if (uuid) + { + GMount *m; + m = g_volume_monitor_get_mount_for_uuid (monitor, uuid); + g_assert (m == mount); + g_object_unref (m); + g_free (uuid); + } +} + +static void +do_volume_tests (GDrive *drive, GVolume *volume) +{ + GDrive *d; + gchar *name; + GMount *mount; + gchar *uuid; + + name = g_volume_get_name (volume); + g_assert (name != NULL); + g_free (name); + + d = g_volume_get_drive (volume); + g_assert (d == drive); + if (d != NULL) + g_object_unref (d); + + mount = g_volume_get_mount (volume); + if (mount != NULL) + { + do_mount_tests (drive, volume, mount); + g_object_unref (mount); + } + + uuid = g_volume_get_uuid (volume); + if (uuid) + { + GVolume *v; + v = g_volume_monitor_get_volume_for_uuid (monitor, uuid); + g_assert (v == volume); + g_object_unref (v); + g_free (uuid); + } +} + +static void +do_drive_tests (GDrive *drive) +{ + GList *volumes, *l; + gchar *name; + gboolean has_volumes; + + g_assert (G_IS_DRIVE (drive)); + name = g_drive_get_name (drive); + g_assert (name != NULL); + g_free (name); + + has_volumes = g_drive_has_volumes (drive); + volumes = g_drive_get_volumes (drive); + g_assert (has_volumes == (volumes != NULL)); + for (l = volumes; l; l = l->next) + { + GVolume *volume = l->data; + do_volume_tests (drive, volume); + } + + g_list_free_full (volumes, g_object_unref); +} + +static void +test_connected_drives (void) +{ + GList *drives; + GList *l; + + drives = g_volume_monitor_get_connected_drives (monitor); + + for (l = drives; l; l = l->next) + { + GDrive *drive = l->data; + do_drive_tests (drive); + } + + g_list_free_full (drives, g_object_unref); +} + +static void +test_volumes (void) +{ + GList *volumes, *l; + + volumes = g_volume_monitor_get_volumes (monitor); + + for (l = volumes; l; l = l->next) + { + GVolume *volume = l->data; + GDrive *drive; + + drive = g_volume_get_drive (volume); + do_volume_tests (drive, volume); + if (drive != NULL) + g_object_unref (drive); + } + + g_list_free_full (volumes, g_object_unref); +} + +static void +test_mounts (void) +{ + GList *mounts, *l; + + mounts = g_volume_monitor_get_mounts (monitor); + + for (l = mounts; l; l = l->next) + { + GMount *mount = l->data; + GVolume *volume; + GDrive *drive; + + drive = g_mount_get_drive (mount); + volume = g_mount_get_volume (mount); + do_mount_tests (drive, volume, mount); + + if (drive != NULL) + g_object_unref (drive); + if (volume != NULL) + g_object_unref (volume); + } + + g_list_free_full (mounts, g_object_unref); +} +int +main (int argc, char *argv[]) +{ + gboolean ret; + + g_setenv ("GIO_USE_VFS", "local", FALSE); + + g_test_init (&argc, &argv, NULL); + + monitor = g_volume_monitor_get (); + + g_test_add_func ("/volumemonitor/connected_drives", test_connected_drives); + g_test_add_func ("/volumemonitor/volumes", test_volumes); + g_test_add_func ("/volumemonitor/mounts", test_mounts); + + ret = g_test_run (); + + g_object_unref (monitor); + + return ret; +} + diff --git a/gio/tests/win32-streams.c b/gio/tests/win32-streams.c new file mode 100644 index 0000000..b7ff0b3 --- /dev/null +++ b/gio/tests/win32-streams.c @@ -0,0 +1,536 @@ +/* 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 +#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; + HANDLE out_handle; + + g_assert (DuplicateHandle (GetCurrentProcess (), + (HANDLE) (gintptr) _get_osfhandle (writer_pipe[1]), + GetCurrentProcess (), + &out_handle, + 0, FALSE, + DUPLICATE_SAME_ACCESS)); + close (writer_pipe[1]); + + out = g_win32_output_stream_new (out_handle, 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)]; + HANDLE in_handle; + + g_assert (DuplicateHandle (GetCurrentProcess (), + (HANDLE) (gintptr) _get_osfhandle (reader_pipe[0]), + GetCurrentProcess (), + &in_handle, + 0, FALSE, + DUPLICATE_SAME_ACCESS)); + close (reader_pipe[0]); + + in = g_win32_input_stream_new (in_handle, 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; + HANDLE in_handle, out_handle; + + /* 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, 10, _O_BINARY) == 0 && _pipe (reader_pipe, 10, _O_BINARY) == 0); + + writer_cancel = g_cancellable_new (); + reader_cancel = g_cancellable_new (); + main_cancel = g_cancellable_new (); + + writer = g_thread_new ("writer", writer_thread, NULL); + reader = g_thread_new ("reader", reader_thread, NULL); + + g_assert (DuplicateHandle (GetCurrentProcess (), + (HANDLE) (gintptr) _get_osfhandle (writer_pipe[0]), + GetCurrentProcess (), + &in_handle, + 0, FALSE, + DUPLICATE_SAME_ACCESS)); + close (writer_pipe[0]); + + g_assert (DuplicateHandle (GetCurrentProcess (), + (HANDLE) (gintptr) _get_osfhandle (reader_pipe[1]), + GetCurrentProcess (), + &out_handle, + 0, FALSE, + DUPLICATE_SAME_ACCESS)); + close (reader_pipe[1]); + + in = g_win32_input_stream_new (in_handle, TRUE); + out = g_win32_output_stream_new (out_handle, 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); +} + +typedef struct _PipeIOOverlapReader +{ + char buf[sizeof (DATA)]; + GInputStream *in; + GThread *thread; + GCancellable *cancellable; + gboolean success; +} PipeIOOverlapReader; + +#define TEST_PIPE_IO_OVERLAP (1024 * 4) + +static gpointer +pipe_io_overlap_reader_thread (gpointer user_data) +{ + PipeIOOverlapReader *p = user_data; + GError *err = NULL; + gsize read; + guint i; + + for (i = 0; i < TEST_PIPE_IO_OVERLAP; ++i) { + memset (p->buf, 0, sizeof (p->buf)); + g_input_stream_read_all (p->in, p->buf, sizeof (p->buf), + &read, NULL, &err); + + g_assert_cmpuint (read, ==, sizeof (p->buf)); + g_assert_no_error (err); + g_assert_cmpstr (p->buf, ==, DATA); + } + + return NULL; +} + +static gpointer +pipe_io_overlap_writer_thread (gpointer user_data) +{ + GOutputStream *out = user_data; + GError *err = NULL; + gsize bytes_written; + guint i; + + for (i = 0; i < TEST_PIPE_IO_OVERLAP; ++i) { + g_output_stream_write_all (out, DATA, sizeof (DATA), + &bytes_written, NULL, &err); + + g_assert_cmpuint (bytes_written, ==, sizeof (DATA)); + g_assert_no_error (err); + } + + return NULL; +} + +static void +test_pipe_io_overlap (void) +{ + GOutputStream *out_server, *out_client; + GThread *writer_server, *writer_client; + PipeIOOverlapReader rs, rc; + HANDLE server, client; + gchar name[256]; + + g_snprintf (name, sizeof (name), + "\\\\.\\pipe\\gtest-io-overlap-%u", (guint) getpid ()); + + server = CreateNamedPipe (name, + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_READMODE_BYTE | PIPE_WAIT, + 1, 0, 0, 0, NULL); + g_assert (server != INVALID_HANDLE_VALUE); + + client = CreateFile (name, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + g_assert (client != INVALID_HANDLE_VALUE); + + out_server = g_win32_output_stream_new (server, TRUE); + writer_server = g_thread_new ("writer_server", pipe_io_overlap_writer_thread, out_server); + rs.in = g_win32_input_stream_new (server, TRUE); + rs.thread = g_thread_new ("reader_server", pipe_io_overlap_reader_thread, &rs); + + out_client = g_win32_output_stream_new (client, TRUE); + writer_client = g_thread_new ("writer_client", pipe_io_overlap_writer_thread, out_client); + rc.in = g_win32_input_stream_new (client, TRUE); + rc.thread = g_thread_new ("reader_client", pipe_io_overlap_reader_thread, &rc); + + g_thread_join (writer_client); + g_thread_join (writer_server); + g_thread_join (rc.thread); + g_thread_join (rs.thread); + + g_object_unref (rs.in); + g_object_unref (rc.in); + g_object_unref (out_server); + g_object_unref (out_client); +} + +static gpointer +pipe_io_concurrent_writer_thread (gpointer user_data) +{ + GOutputStream *out = user_data; + GError *err = NULL; + gsize bytes_written; + + g_output_stream_write_all (out, DATA, 1, &bytes_written, NULL, &err); + + g_assert_cmpuint (bytes_written, ==, 1); + g_assert_no_error (err); + + return NULL; +} + +static gpointer +pipe_io_concurrent_reader_thread (gpointer user_data) +{ + PipeIOOverlapReader *p = user_data; + GError *err = NULL; + gsize read; + + memset (p->buf, 0, sizeof (p->buf)); + p->success = g_input_stream_read_all (p->in, p->buf, 1, &read, p->cancellable, &err); + + /* only one thread will succeed, the other will be cancelled */ + if (p->success) + { + /* continue the main thread */ + write (writer_pipe[1], "", 1); + g_assert_cmpuint (read, ==, 1); + g_assert_no_error (err); + } + + return NULL; +} + +static void +test_pipe_io_concurrent (void) +{ + GOutputStream *out_server; + GThread *writer_server; + PipeIOOverlapReader rc1, rc2; + HANDLE server, client; + gchar name[256], c; + + g_snprintf (name, sizeof (name), + "\\\\.\\pipe\\gtest-io-concurrent-%u", (guint) getpid ()); + + server = CreateNamedPipe (name, + PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_READMODE_BYTE | PIPE_WAIT, + 1, 0, 0, 0, NULL); + g_assert (server != INVALID_HANDLE_VALUE); + g_assert (_pipe (writer_pipe, 10, _O_BINARY) == 0); + + client = CreateFile (name, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + g_assert (client != INVALID_HANDLE_VALUE); + + rc1.in = g_win32_input_stream_new (client, TRUE); + rc1.success = FALSE; + rc1.cancellable = g_cancellable_new (); + rc1.thread = g_thread_new ("reader_client", pipe_io_concurrent_reader_thread, &rc1); + + rc2.in = g_win32_input_stream_new (client, TRUE); + rc2.success = FALSE; + rc2.cancellable = g_cancellable_new (); + rc2.thread = g_thread_new ("reader_client", pipe_io_concurrent_reader_thread, &rc2); + + /* FIXME: how to synchronize on both reader thread waiting in read, + before starting the writer thread? */ + g_usleep (G_USEC_PER_SEC / 10); + + out_server = g_win32_output_stream_new (server, TRUE); + writer_server = g_thread_new ("writer_server", pipe_io_concurrent_writer_thread, out_server); + + read (writer_pipe[0], &c, 1); + + g_assert (rc1.success ^ rc2.success); + + g_cancellable_cancel (rc1.cancellable); + g_cancellable_cancel (rc2.cancellable); + + g_thread_join (writer_server); + g_thread_join (rc1.thread); + g_thread_join (rc2.thread); + + g_object_unref (rc1.in); + g_object_unref (rc2.in); + g_object_unref (out_server); + + close (writer_pipe[0]); + close (writer_pipe[1]); +} + +static void +readable_cancel (GObject *source, GAsyncResult *res, gpointer user_data) +{ + GInputStream *in = G_INPUT_STREAM (source); + GError *err = NULL; + gssize len; + + len = g_input_stream_read_finish (in, res, &err); + g_assert_cmpint (len, ==, -1); + g_assert_error (err, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_error_free (err); + + g_main_loop_quit (loop); +} + +static void +test_pipe_io_cancel (void) +{ + GInputStream *in; + GOutputStream *out; + HANDLE in_handle, out_handle; + gchar name[256]; + + g_snprintf (name, sizeof (name), + "\\\\.\\pipe\\gtest-io-cancel-%u", (guint) getpid ()); + + in_handle = CreateNamedPipe (name, + PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, + PIPE_READMODE_BYTE | PIPE_WAIT, + 1, 0, 0, 0, NULL); + g_assert (in_handle != INVALID_HANDLE_VALUE); + + out_handle = CreateFile (name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + g_assert (out_handle != INVALID_HANDLE_VALUE); + + in = g_win32_input_stream_new (in_handle, TRUE); + out = g_win32_output_stream_new (out_handle, TRUE); + + reader_cancel = g_cancellable_new (); + g_input_stream_read_async (in, main_buf, sizeof (main_buf), + G_PRIORITY_DEFAULT, reader_cancel, + readable_cancel, out); + + g_timeout_add (500, timeout, reader_cancel); + + loop = g_main_loop_new (NULL, TRUE); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_object_unref (reader_cancel); + g_object_unref (in); + g_object_unref (out); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/win32-streams/pipe-io-test", test_pipe_io); + g_test_add_func ("/win32-streams/pipe-io-cancel-test", test_pipe_io_cancel); + g_test_add_func ("/win32-streams/pipe-io-overlap-test", test_pipe_io_overlap); + g_test_add_func ("/win32-streams/pipe-io-concurrent-test", test_pipe_io_concurrent); + + return g_test_run(); +} diff --git a/gio/win32/Makefile.am b/gio/win32/Makefile.am new file mode 100644 index 0000000..b75bc36 --- /dev/null +++ b/gio/win32/Makefile.am @@ -0,0 +1,28 @@ +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 = \ + $(GLIB_HIDDEN_VISIBILITY_CFLAGS) \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + $(gio_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGIO_MODULE_DIR=\"$(GIO_MODULE_DIR)\" \ + -DGIO_COMPILATION \ + -DG_DISABLE_DEPRECATED diff --git a/gio/win32/gwin32directorymonitor.c b/gio/win32/gwin32directorymonitor.c new file mode 100644 index 0000000..ded076a --- /dev/null +++ b/gio/win32/gwin32directorymonitor.c @@ -0,0 +1,246 @@ +/* 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 + * + */ + +#include "config.h" +#include "gwin32directorymonitor.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; + + 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; + } + + 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..810f797 --- /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 "gio/glocaldirectorymonitor.h" +#include "gio/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..84d5d77 --- /dev/null +++ b/gio/win32/gwinhttpfile.c @@ -0,0 +1,785 @@ +/* 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 "gio/gfile.h" +#include "gio/gfileattribute.h" +#include "gio/gfileinfo.h" +#include "gwinhttpfile.h" +#include "gwinhttpfileinputstream.h" +#include "gwinhttpfileoutputstream.h" +#include "gio/gioerror.h" + +#include "glibintl.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..1d1d2a3 --- /dev/null +++ b/gio/win32/gwinhttpfileinputstream.c @@ -0,0 +1,177 @@ +/* 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 "gio/gcancellable.h" +#include "gio/gioerror.h" +#include "gwinhttpfileinputstream.h" +#include "glibintl.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..1c6888c --- /dev/null +++ b/gio/win32/gwinhttpfileoutputstream.c @@ -0,0 +1,185 @@ +/* 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 "gio/gcancellable.h" +#include "gio/gioerror.h" +#include "gwinhttpfileoutputstream.h" +#include "glibintl.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..1fcc167 --- /dev/null +++ b/gio/win32/gwinhttpvfs.c @@ -0,0 +1,470 @@ +/* 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 "gio/gioerror.h" +#include "gio/giomodule.h" +#include "gio/gvfs.h" + +#include "gwinhttpfile.h" +#include "gwinhttpvfs.h" + +static gboolean lookup_done = FALSE; +static gboolean funcs_found = FALSE; +static GWinHttpDllFuncs funcs; + +static void +lookup_funcs (void) +{ + HMODULE winhttp = NULL; + char winhttp_dll[MAX_PATH + 100]; + int n; + + if (lookup_done) + return; + + n = GetSystemDirectory (winhttp_dll, MAX_PATH); + if (n > 0 && n < MAX_PATH) + { + if (winhttp_dll[n-1] != '\\' && + winhttp_dll[n-1] != '/') + strcat (winhttp_dll, "\\"); + strcat (winhttp_dll, "winhttp.dll"); + 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_free (wagent); +} + +/* + * 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..f515168 --- /dev/null +++ b/gio/win32/gwinhttpvfs.h @@ -0,0 +1,108 @@ +/* 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 + +#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/makefile.msc b/gio/win32/makefile.msc new file mode 100644 index 0000000..d3946a2 --- /dev/null +++ b/gio/win32/makefile.msc @@ -0,0 +1,35 @@ +TOP = ..\..\.. +PRJ_TOP = ..\.. +PACKAGE = giowin32 +PKG_VER = 2.0 +!INCLUDE $(TOP)\glib\build\win32\make.msc + +INCLUDES = \ + -FImsvc_recommended_pragmas.h \ + -I .. -I ..\.. -I ..\..\glib -I ..\..\gmodule -I . \ + $(INTL_CFLAGS) + +DEFINES = \ + -DG_LOG_DOMAIN=\"GLib-GIO\" \ + -DGIO_MODULE_DIR=\"$(libdir)/gio/modules\" \ + -DGIO_COMPILATION + +OBJECTS = \ + gwin32directorymonitor.obj \ + gwinhttpfile.obj \ + gwinhttpfileinputstream.obj \ + gwinhttpfileoutputstream.obj \ + gwinhttpvfs.obj \ + +all : \ + $(PRJ_TOP)\config.h \ + $(PACKAGE).lib + +$(PRJ_TOP)\config.h: $(PRJ_TOP)\config.h.win32 + copy $(PRJ_TOP)\config.h.win32 $(PRJ_TOP)\config.h + +$(PACKAGE).lib : $(OBJECTS) + lib /out:$(PACKAGE).lib $(OBJECTS) + +.c.obj : + $(CC) $(CFLAGS) -c $(PKG_CFLAGS) $< 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/.gitignore b/gio/xdgmime/.gitignore new file mode 100644 index 0000000..56e6945 --- /dev/null +++ b/gio/xdgmime/.gitignore @@ -0,0 +1 @@ +test-mime diff --git a/gio/xdgmime/Makefile.am b/gio/xdgmime/Makefile.am new file mode 100644 index 0000000..fa39d05 --- /dev/null +++ b/gio/xdgmime/Makefile.am @@ -0,0 +1,24 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = -DXDG_PREFIX=_gio_xdg + +noinst_LTLIBRARIES = libxdgmime.la + +libxdgmime_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +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/xdgmime.c b/gio/xdgmime/xdgmime.c new file mode 100644 index 0000000..846be39 --- /dev/null +++ b/gio/xdgmime/xdgmime.c @@ -0,0 +1,946 @@ +/* -*- 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; +} + +#ifdef NOT_USED_IN_GIO + +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; +} + +#endif + +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); +} + +#ifdef NOT_USED_IN_GIO + +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); +} + +#endif + +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 *umime; + const char **parents; + char **result; + int i, n; + + xdg_mime_init (); + + if (_caches) + return _xdg_mime_cache_list_mime_parents (mime); + + umime = _xdg_mime_unalias_mime_type (mime); + + parents = _xdg_mime_parent_list_lookup (parent_list, umime); + + 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; +} + +#ifdef NOT_USED_IN_GIO + +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 (); +} + +#endif + +/* 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; +} + +#ifdef NOT_USED_IN_GIO + +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; + } + } +} + +#endif + +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..fadf59d --- /dev/null +++ b/gio/xdgmime/xdgmime.h @@ -0,0 +1,137 @@ +/* -*- 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_subclass XDG_RESERVED_ENTRY(mime_type_subclass) +#define _xdg_mime_mime_type_equal XDG_RESERVED_ENTRY(mime_type_equal) +#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); +#ifdef NOT_USED_IN_GIO +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); +#endif +int xdg_mime_get_mime_types_from_file_name(const char *file_name, + const char *mime_types[], + int n_mime_types); +#ifdef NOT_USED_IN_GIO +int xdg_mime_is_valid_mime_type (const char *mime_type); +#endif +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. + */ +#ifdef NOT_USED_IN_GIO +const char **xdg_mime_get_mime_parents (const char *mime); +#endif +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); +#ifdef NOT_USED_IN_GIO +void xdg_mime_dump (void); +#endif +int xdg_mime_register_reload_callback (XdgMimeCallback callback, + void *data, + XdgMimeDestroy destroy); +#ifdef NOT_USED_IN_GIO +void xdg_mime_remove_callback (int callback_id); +#endif + + /* 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..8740c3f --- /dev/null +++ b/gio/xdgmime/xdgmimealias.c @@ -0,0 +1,186 @@ +/* -*- 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); +} + + +#ifdef NOT_USED_IN_GIO + +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); + } + } +} + +#endif diff --git a/gio/xdgmime/xdgmimealias.h b/gio/xdgmime/xdgmimealias.h new file mode 100644 index 0000000..06fc0c3 --- /dev/null +++ b/gio/xdgmime/xdgmimealias.h @@ -0,0 +1,52 @@ +/* -*- 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); +#ifdef NOT_USED_IN_GIO +void _xdg_mime_alias_list_dump (XdgAliasList *list); +#endif +#endif /* __XDG_MIME_ALIAS_H__ */ diff --git a/gio/xdgmime/xdgmimecache.c b/gio/xdgmime/xdgmimecache.c new file mode 100644 index 0000000..87a3cd0 --- /dev/null +++ b/gio/xdgmime/xdgmimecache.c @@ -0,0 +1,1094 @@ +/* -*- 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 + +#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 */ + do + fd = open (file_name, O_RDONLY|_O_BINARY, 0); + while (fd == -1 && errno == EINTR); + + 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); +} + +#ifdef NOT_USED_IN_GIO + +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; +} + +#endif + +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); +} + +#ifdef NOT_USED_IN_GIO + +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); + } +} + +#endif diff --git a/gio/xdgmime/xdgmimecache.h b/gio/xdgmime/xdgmimecache.h new file mode 100644 index 0000000..48756ad --- /dev/null +++ b/gio/xdgmime/xdgmimecache.h @@ -0,0 +1,87 @@ +/* -*- 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); +#ifdef NOT_USED_IN_GIO +const char *_xdg_mime_cache_get_mime_type_for_file (const char *file_name, + struct stat *statbuf); +#endif +int _xdg_mime_cache_get_mime_types_from_file_name (const char *file_name, + const char *mime_types[], + int n_mime_types); +#ifdef NOT_USED_IN_GIO +const char *_xdg_mime_cache_get_mime_type_from_file_name (const char *file_name); +#endif +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); +#ifdef NOT_USED_IN_GIO +void _xdg_mime_cache_glob_dump (void); +#endif + +#endif /* __XDG_MIME_CACHE_H__ */ diff --git a/gio/xdgmime/xdgmimeglob.c b/gio/xdgmime/xdgmimeglob.c new file mode 100644 index 0000000..eeda2a5 --- /dev/null +++ b/gio/xdgmime/xdgmimeglob.c @@ -0,0 +1,732 @@ +/* -*- 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; +} + +#ifdef NOT_USED_IN_GIO + +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); +} + +#endif + +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; + } +} + +#ifdef NOT_USED_IN_GIO + +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); + } +} + +#endif + +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..d826434 --- /dev/null +++ b/gio/xdgmime/xdgmimeglob.h @@ -0,0 +1,72 @@ +/* -*- 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); +#ifdef NOT_USED_IN_GIO +void _xdg_glob_hash_dump (XdgGlobHash *glob_hash); +#endif + +#endif /* __XDG_MIME_GLOB_H__ */ diff --git a/gio/xdgmime/xdgmimeicon.c b/gio/xdgmime/xdgmimeicon.c new file mode 100644 index 0000000..9658bd4 --- /dev/null +++ b/gio/xdgmime/xdgmimeicon.c @@ -0,0 +1,185 @@ +/* -*- 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); +} + +#ifdef NOT_USED_IN_GIO + +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); + } + } +} + +#endif + diff --git a/gio/xdgmime/xdgmimeicon.h b/gio/xdgmime/xdgmimeicon.h new file mode 100644 index 0000000..4f604c1 --- /dev/null +++ b/gio/xdgmime/xdgmimeicon.h @@ -0,0 +1,52 @@ +/* -*- 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); +#ifdef NOT_USED_IN_GIO +void _xdg_mime_icon_list_dump (XdgIconList *list); +#endif + +#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..744eb5a --- /dev/null +++ b/gio/xdgmime/xdgmimemagic.c @@ -0,0 +1,818 @@ +/* -*- 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) + { + free (buffer); + 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) + { +#if LITTLE_ENDIAN + int i; +#endif + 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..6c4cde0 --- /dev/null +++ b/gio/xdgmime/xdgmimeparent.c @@ -0,0 +1,222 @@ +/* -*- 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; + key.n_parents = 0; + + 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); +} + +#ifdef NOT_USED_IN_GIO + +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); + } + } +} + +#endif + diff --git a/gio/xdgmime/xdgmimeparent.h b/gio/xdgmime/xdgmimeparent.h new file mode 100644 index 0000000..fbc927e --- /dev/null +++ b/gio/xdgmime/xdgmimeparent.h @@ -0,0 +1,53 @@ +/* -*- 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); +#ifdef NOT_USED_IN_GIO +void _xdg_mime_parent_list_dump (XdgParentList *list); +#endif + +#endif /* __XDG_MIME_PARENT_H__ */ diff --git a/glib-2.0.pc.in b/glib-2.0.pc.in new file mode 100644 index 0000000..4a8898e --- /dev/null +++ b/glib-2.0.pc.in @@ -0,0 +1,16 @@ +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@ +Requires.private: @PCRE_REQUIRES@ +Libs: -L${libdir} -lglib-2.0 @INTLLIBS@ +Libs.private: @G_THREAD_LIBS@ @G_LIBS_EXTRA@ @PCRE_LIBS@ @INTLLIBS@ @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..7166cf7 --- /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 + +datarootdir=@datarootdir@ +datadir=@datadir@ + +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..40d3c67 --- /dev/null +++ b/glib-zip.in @@ -0,0 +1,94 @@ +#!/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 + glib + + Low level core library + + 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. + + + + + + + + + C + + + + Matthias Clasen + + matthiasc + + + + + + Ryan Lortie + + ryanl + + + + + + + + + + + diff --git a/glib/.gitignore b/glib/.gitignore new file mode 100644 index 0000000..bdecc0b --- /dev/null +++ b/glib/.gitignore @@ -0,0 +1,12 @@ +glibconfig.h +glibconfig.h.win32 +glibconfig-stamp + +gtester +libglib-gdb.py +makefile.msc +gspawn-win32-helper-console.c +gspawn-win64-helper-console.c +gspawn-win64-helper.c +glib_probes.h +glib-public-headers.txt diff --git a/glib/Makefile.am b/glib/Makefile.am new file mode 100644 index 0000000..657978d --- /dev/null +++ b/glib/Makefile.am @@ -0,0 +1,504 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +BUILT_SOURCES = +DISTCLEANFILES = +CLEANFILES = + +# +# Generate glibconfig.h +# +# The timestamp of the stamp file is used to indicate if glibconfig.h is +# up to date with respect to config.status. In the usual case, changes +# to config.status will not result in changes to glibconfig.h so we +# avoid touching its timestamp (in order not to rebuild the whole tree). +# +DISTCLEANFILES += glibconfig-stamp glibconfig.h +BUILT_SOURCES += glibconfig-stamp +configexecincludedir = $(libdir)/glib-2.0/include +nodist_configexecinclude_HEADERS = glibconfig.h +glibconfig-stamp: ../config.status + $(AM_V_GEN) cd $(top_builddir) && \ + $(SHELL) ./config.status glib/glibconfig.h + @touch glibconfig-stamp + + + +if HAVE_GOOD_PRINTF +else +PRINTF_SUBDIR = gnulib +printf_la = gnulib/libgnulib.la +endif + +if USE_SYSTEM_PCRE +else +MAYBE_PCRE = pcre +endif + +SUBDIRS = libcharset $(PRINTF_SUBDIR) $(MAYBE_PCRE) update-pcre . +DIST_SUBDIRS = libcharset gnulib pcre update-pcre tests +if BUILD_MODULAR_TESTS +SUBDIRS += tests +endif + +AM_CPPFLAGS = \ + $(glib_INCLUDES) \ + $(pcre_inc) \ + -DG_LOG_DOMAIN=\"GLib\" \ + $(GLIB_DEBUG_FLAGS) \ + -DGLIB_COMPILATION \ + -DPCRE_STATIC + +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-iswide-table.py \ + gen-unicode-tables.pl \ + gen-script-table.pl \ + glibconfig.h.win32.in \ + gregex.c \ + gregex.h \ + win_iconv.c \ + libglib-gdb.py.in \ + docs.c \ + gconstructor.h \ + $(MIRRORING_TAB_SOURCE) + +CLEANFILES += libglib-gdb.py + +# These may be in the builddir too +BUILT_EXTRA_DIST = \ + makefile.msc \ + glibconfig.h.win32 \ + glib.rc + +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) + +deprecated_sources = \ + deprecated/gallocator.c \ + deprecated/gcache.c \ + deprecated/gcompletion.c \ + deprecated/grel.c \ + deprecated/gthread-deprecated.c + +libglib_2_0_la_SOURCES = \ + $(deprecated_sources) \ + glib_probes.d \ + garray.c \ + gasyncqueue.c \ + gasyncqueueprivate.h \ + gatomic.c \ + gbacktrace.c \ + gbase64.c \ + gbitlock.c \ + gbookmarkfile.c \ + gbsearcharray.h \ + gbytes.c \ + gbytes.h \ + gcharset.c \ + gcharsetprivate.h \ + gchecksum.c \ + gconvert.c \ + gdataset.c \ + gdatasetprivate.h \ + gdate.c \ + gdatetime.c \ + gdir.c \ + genviron.c \ + gerror.c \ + gfileutils.c \ + ggettext.c \ + ghash.c \ + ghmac.c \ + ghook.c \ + ghostutils.c \ + giochannel.c \ + gkeyfile.c \ + glibintl.h \ + glib_trace.h \ + glib-init.h \ + glib-init.c \ + glib-private.h \ + glib-private.c \ + glist.c \ + gmain-internal.h \ + gmain.c \ + gmappedfile.c \ + gmarkup.c \ + gmem.c \ + gmessages.c \ + gmirroringtable.h \ + gnode.c \ + goption.c \ + gpattern.c \ + gpoll.c \ + gprimes.c \ + gqsort.c \ + gquark.c \ + gqueue.c \ + grand.c \ + gregex.c \ + gscanner.c \ + gscripttable.h \ + gsequence.c \ + gshell.c \ + gslice.c \ + gslist.c \ + gstdio.c \ + gstrfuncs.c \ + gstring.c \ + gstringchunk.c \ + gtestutils.c \ + gthread.c \ + gthreadprivate.h \ + gthreadpool.c \ + gtimer.c \ + gtimezone.c \ + gtrashstack.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 \ + gversion.c \ + gwakeup.h \ + gwakeup.c \ + gprintf.c \ + gprintfint.h + +if OS_UNIX +libglib_2_0_la_SOURCES += glib-unix.c +endif + +if OS_WIN32 +libglib_2_0_la_SOURCES += gthread-win32.c +else +libglib_2_0_la_SOURCES += gthread-posix.c +endif + +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-unix.h \ + glib-object.h \ + glib.h + +deprecatedincludedir=$(includedir)/glib-2.0/glib/deprecated +deprecatedinclude_HEADERS = \ + deprecated/gallocator.h \ + deprecated/gcache.h \ + deprecated/gcompletion.h \ + deprecated/gmain.h \ + deprecated/grel.h \ + deprecated/gthread.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 \ + gbytes.h \ + gcharset.h \ + gchecksum.h \ + gconvert.h \ + gdataset.h \ + gdate.h \ + gdatetime.h \ + gdir.h \ + genviron.h \ + gerror.h \ + gfileutils.h \ + ggettext.h \ + ghash.h \ + ghmac.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 \ + gscanner.h \ + gsequence.h \ + gshell.h \ + gslice.h \ + gslist.h \ + gspawn.h \ + gstdio.h \ + gstrfuncs.h \ + gtestutils.h \ + gstring.h \ + gstringchunk.h \ + gthread.h \ + gthreadpool.h \ + gtimer.h \ + gtimezone.h \ + gtrashstack.h \ + gtree.h \ + gtypes.h \ + gunicode.h \ + gurifuncs.h \ + gutils.h \ + gvarianttype.h \ + gvariant.h \ + gversion.h \ + gversionmacros.h \ + gwin32.h \ + gprintf.h + +# This is read by gobject-introspection/misc/ and gtk-doc +glib-public-headers.txt: Makefile + echo $(glibinclude_HEADERS) $(glibsubinclude_HEADERS) > $@.tmp && mv $@.tmp $@ + +CLEANFILES += glib-public-headers.txt + +all-local: glib-public-headers.txt + +install-data-local: install-ms-lib + @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-gdb + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32_AND_DLL_COMPILATION +glib_win32_res = glib-win32-res.o +glib_win32_res_ldflag = -Wl,$(glib_win32_res) +endif + +if USE_SYSTEM_PCRE +pcre_lib = $(PCRE_LIBS) +pcre_inc = $(PCRE_CFLAGS) +else +pcre_lib = pcre/libpcre.la +pcre_inc = +endif + +libglib_2_0_la_CFLAGS = $(AM_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @ICONV_LIBS@ @G_LIBS_EXTRA@ $(pcre_lib) $(G_THREAD_LIBS_EXTRA) $(G_THREAD_LIBS_FOR_GTHREAD) +libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ $(glib_win32_res) $(glib_def) + +libglib_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \ + $(glib_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +INSTALL_PROGS= + +if ENABLE_DTRACE +glib_probes.h: glib_probes.d Makefile + $(AM_V_GEN) $(DTRACE) -C -h -s $< -o $@.tmp + @$(SED) -e "s,define STAP_HAS_SEMAPHORES 1,undef STAP_HAS_SEMAPHORES," < $@.tmp > $@ && rm -f $@.tmp +glib_probes.o: glib_probes.d Makefile + $(AM_V_GEN) $(DTRACE) -G -s $< -o $@ +BUILT_SOURCES += glib_probes.h glib_probes.o +CLEANFILES += glib_probes.h glib_probes.h.tmp +libglib_2_0_la_LIBADD += glib_probes.o +endif + +if ENABLE_SYSTEMTAP +tapset_in_files = glib.stp.in +tapsetdir = @ABS_TAPSET_DIR@ +tapset_DATA = $(tapset_in_files:.stp.in=.stp) +EXTRA_DIST += $(tapset_in_files) +endif + +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 $$? ; \ + chmod a+x $(DESTDIR)$(bindir)/$$sf ; \ + 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:$(builddir)/glib.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/glib.vcproj ../build/win32/vs10/glib.vcxproj ../build/win32/vs10/glib.vcxproj.filters + 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 `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ + case $$F in \ + *-unix.c|gthread-*.c) \ + ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libglib.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs9/glib.vcprojin >$@ + rm libglib.sourcefiles + +../build/win32/vs10/glib.vcxproj: $(top_srcdir)/build/win32/vs10/glib.vcxprojin + for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ + case $$F in \ + *-unix.c|gthread-*.c) \ + ;; \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libglib.vs10.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxprojin >$@ + rm libglib.vs10.sourcefiles + +../build/win32/vs10/glib.vcxproj.filters: $(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin + for F in `echo $(libglib_2_0_la_SOURCES) | tr '/' '\\'`; do \ + case $$F in \ + *-unix.c|gthread-*.c) \ + ;; \ + *.c) echo ' Source Files' \ + ;; \ + esac; \ + done >libglib.vs10.sourcefiles.filters + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/glib.vcxproj.filtersin >$@ + rm libglib.vs10.sourcefiles.filters + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = glib.py + +libglib-gdb.py: libglib-gdb.py.in + $(AM_V_GEN) $(SED) -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libglib-gdb.py.in > $(builddir)/libglib-gdb.py + + +install-data-hook: libglib-gdb.py + mkdir -p $(DESTDIR)$(datadir)/gdb/auto-load$(ABS_GLIB_RUNTIME_LIBDIR) + $(INSTALL) $(builddir)/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 + +uninstall-gdb: + -rm -r $(DESTDIR)$(datadir)/gdb diff --git a/glib/deprecated/gallocator.c b/glib/deprecated/gallocator.c new file mode 100644 index 0000000..a191eb6 --- /dev/null +++ b/glib/deprecated/gallocator.c @@ -0,0 +1,104 @@ +/* + * This library is free software; you can redistribute it and/or + * 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. + */ + +#include "config.h" + +/* we know we are deprecated here, no need for warnings */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gallocator.h" + +#include +#include + +struct _GMemChunk { + guint alloc_size; /* the size of an atom */ +}; + +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; +} + +void +g_mem_chunk_destroy (GMemChunk *mem_chunk) +{ + g_return_if_fail (mem_chunk != NULL); + + g_slice_free (GMemChunk, mem_chunk); +} + +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); +} + +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); +} + +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); +} + +GAllocator* +g_allocator_new (const gchar *name, + guint n_preallocs) +{ + /* some (broken) GAllocator uses depend on non-NULL allocators */ + return (void *) 1; +} + +void g_allocator_free (GAllocator *allocator) { } + +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) { } + +void g_list_push_allocator (GAllocator *allocator) { } +void g_list_pop_allocator (void) { } + +void g_slist_push_allocator (GAllocator *allocator) { } +void g_slist_pop_allocator (void) { } + +void g_node_push_allocator (GAllocator *allocator) { } +void g_node_pop_allocator (void) { } diff --git a/glib/deprecated/gallocator.h b/glib/deprecated/gallocator.h new file mode 100644 index 0000000..a3dc2a1 --- /dev/null +++ b/glib/deprecated/gallocator.h @@ -0,0 +1,90 @@ +/* + * This library is free software; you can redistribute it and/or + * 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. + */ + +#ifndef __G_ALLOCATOR_H__ +#define __G_ALLOCATOR_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GAllocator GAllocator; +typedef struct _GMemChunk GMemChunk; + +#define G_ALLOC_ONLY 1 +#define G_ALLOC_AND_FREE 2 +#define G_ALLOCATOR_LIST 1 +#define G_ALLOCATOR_SLIST 2 +#define G_ALLOCATOR_NODE 3 + +#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_mem_chunk_free (mem_chunk, mem)) +#define g_mem_chunk_create(type, x, y) (g_mem_chunk_new (NULL, sizeof (type), 0, 0)) + + +GLIB_DEPRECATED +GMemChunk * g_mem_chunk_new (const gchar *name, + gint atom_size, + gsize area_size, + gint type); +GLIB_DEPRECATED +void g_mem_chunk_destroy (GMemChunk *mem_chunk); +GLIB_DEPRECATED +gpointer g_mem_chunk_alloc (GMemChunk *mem_chunk); +GLIB_DEPRECATED +gpointer g_mem_chunk_alloc0 (GMemChunk *mem_chunk); +GLIB_DEPRECATED +void g_mem_chunk_free (GMemChunk *mem_chunk, + gpointer mem); +GLIB_DEPRECATED +void g_mem_chunk_clean (GMemChunk *mem_chunk); +GLIB_DEPRECATED +void g_mem_chunk_reset (GMemChunk *mem_chunk); +GLIB_DEPRECATED +void g_mem_chunk_print (GMemChunk *mem_chunk); +GLIB_DEPRECATED +void g_mem_chunk_info (void); +GLIB_DEPRECATED +void g_blow_chunks (void); + + +GLIB_DEPRECATED +GAllocator * g_allocator_new (const gchar *name, + guint n_preallocs); +GLIB_DEPRECATED +void g_allocator_free (GAllocator *allocator); +GLIB_DEPRECATED +void g_list_push_allocator (GAllocator *allocator); +GLIB_DEPRECATED +void g_list_pop_allocator (void); +GLIB_DEPRECATED +void g_slist_push_allocator (GAllocator *allocator); +GLIB_DEPRECATED +void g_slist_pop_allocator (void); +GLIB_DEPRECATED +void g_node_push_allocator (GAllocator *allocator); +GLIB_DEPRECATED +void g_node_pop_allocator (void); + +G_END_DECLS + +#endif /* __G_ALLOCATOR_H__ */ diff --git a/glib/deprecated/gcache.c b/glib/deprecated/gcache.c new file mode 100644 index 0000000..5a59365 --- /dev/null +++ b/glib/deprecated/gcache.c @@ -0,0 +1,347 @@ +/* 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 "gcache.h" + +#include "gslice.h" +#include "ghash.h" +#include "gtestutils.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. + * + * GCache uses keys and values. A GCache key describes the properties + * of a particular resource. A GCache value is the actual resource. + * + * GCache has been marked as deprecated, since this API is rarely + * used and not very actively maintained. + */ + +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. + * + * Deprecated:2.32: Use a #GHashTable instead + */ +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 + * + * Creates a new #GCache. + * + * Returns: a new #GCache + * + * Deprecated:2.32: Use a #GHashTable instead + */ + +/** + * GCacheNewFunc: + * @key: a #GCache 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. + * + * Returns: a new #GCache 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) + * + * 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. + * + * Returns: a copy of the #GCache 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. + * + * Deprecated:2.32: Use a #GHashTable instead + */ +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 + * + * 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. + * + * Returns: a pointer to a #GCache value + * + * Deprecated:2.32: Use a #GHashTable instead + */ +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(). + * + * Deprecated:2.32: Use a #GHashTable instead + */ +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 ! + * + * Deprecated:2.32: Use a #GHashTable instead + */ +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); +} diff --git a/glib/deprecated/gcache.h b/glib/deprecated/gcache.h new file mode 100644 index 0000000..a7854e0 --- /dev/null +++ b/glib/deprecated/gcache.h @@ -0,0 +1,73 @@ +/* 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_CACHE_H__ +#define __G_CACHE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GCache GCache; + +typedef gpointer (*GCacheNewFunc) (gpointer key); +typedef gpointer (*GCacheDupFunc) (gpointer value); +typedef void (*GCacheDestroyFunc) (gpointer value); + +/* Caches + */ +GLIB_DEPRECATED +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); +GLIB_DEPRECATED +void g_cache_destroy (GCache *cache); +GLIB_DEPRECATED +gpointer g_cache_insert (GCache *cache, + gpointer key); +GLIB_DEPRECATED +void g_cache_remove (GCache *cache, + gconstpointer value); +GLIB_DEPRECATED +void g_cache_key_foreach (GCache *cache, + GHFunc func, + gpointer user_data); +GLIB_DEPRECATED +void g_cache_value_foreach (GCache *cache, + GHFunc func, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_CACHE_H__ */ diff --git a/glib/deprecated/gcompletion.c b/glib/deprecated/gcompletion.c new file mode 100644 index 0000000..fb5ab61 --- /dev/null +++ b/glib/deprecated/gcompletion.c @@ -0,0 +1,502 @@ +/* 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" + +/* we know we are deprecated here, no need for warnings */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gcompletion.h" + +#include +#include +#include + +#include + +/** + * 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 has been marked as deprecated, since this API is rarely + * used and not very actively maintained. + **/ + +/** + * 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. + * + * 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. + * + * Returns: the string corresponding to the item. + **/ + +/** + * GCompletionStrncmpFunc: + * @s1: string to compare with @s2. + * @s2: string to compare with @s1. + * @n: maximal number of bytes to compare. + * + * Specifies the type of the function passed to + * g_completion_set_compare(). This is used when you use strings as + * #GCompletion items. + * + * 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. + **/ + +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. + * + * Creates a new #GCompletion. + * + * Returns: the 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: (transfer none): the list of items to add. + * + * Adds items to the #GCompletion. + * + * Deprecated: 2.26: Rarely used API + **/ +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: (transfer none): the items to remove. + * + * Removes items from a #GCompletion. The items are not freed, so if the memory + * was dynamically allocated, free @items with g_list_free_full() after calling + * this function. + * + * Deprecated: 2.26: Rarely used API + **/ +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. The items are not freed, so if the + * memory was dynamically allocated, it should be freed after calling this + * function. + * + * Deprecated: 2.26: Rarely used API + **/ +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: (element-type utf8) (transfer none): the list of items whose strings begin with @prefix. This should + * not be changed. + * + * Since: 2.4 + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Attempts to complete the string @prefix using the #GCompletion + * target items. + * + * Returns: (transfer none): the list of items whose strings begin with + * @prefix. This should not be changed. + * + * Deprecated: 2.26: Rarely used API + **/ +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. The items are not freed, so if + * the memory was dynamically allocated, it should be freed after calling this + * function. + * + * Deprecated: 2.26: Rarely used API + **/ +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(). + * + * Deprecated: 2.26: Rarely used API + **/ +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 diff --git a/glib/deprecated/gcompletion.h b/glib/deprecated/gcompletion.h new file mode 100644 index 0000000..fa77596 --- /dev/null +++ b/glib/deprecated/gcompletion.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/. + */ + +#ifndef __G_COMPLETION_H__ +#define __G_COMPLETION_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_DEPRECATED_IN_2_26 +GCompletion* g_completion_new (GCompletionFunc func); +GLIB_DEPRECATED_IN_2_26 +void g_completion_add_items (GCompletion* cmp, + GList* items); +GLIB_DEPRECATED_IN_2_26 +void g_completion_remove_items (GCompletion* cmp, + GList* items); +GLIB_DEPRECATED_IN_2_26 +void g_completion_clear_items (GCompletion* cmp); +GLIB_DEPRECATED_IN_2_26 +GList* g_completion_complete (GCompletion* cmp, + const gchar* prefix, + gchar** new_prefix); +GLIB_DEPRECATED_IN_2_26 +GList* g_completion_complete_utf8 (GCompletion *cmp, + const gchar* prefix, + gchar** new_prefix); +GLIB_DEPRECATED_IN_2_26 +void g_completion_set_compare (GCompletion *cmp, + GCompletionStrncmpFunc strncmp_func); +GLIB_DEPRECATED_IN_2_26 +void g_completion_free (GCompletion* cmp); + +G_END_DECLS + +#endif /* __G_COMPLETION_H__ */ diff --git a/glib/deprecated/gmain.h b/glib/deprecated/gmain.h new file mode 100644 index 0000000..bb62240 --- /dev/null +++ b/glib/deprecated/gmain.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/. + */ + +#ifndef __G_DEPRECATED_MAIN_H__ +#define __G_DEPRECATED_MAIN_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/* ============== Compat main loop stuff ================== */ + +/** + * g_main_new: + * @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. + * + * Creates a new #GMainLoop for th default main context. + * + * Returns: a new #GMainLoop + * + * Deprecated: 2.2: Use g_main_loop_new() instead + */ +#define g_main_new(is_running) g_main_loop_new (NULL, is_running) + +/** + * g_main_run: + * @loop: a #GMainLoop + * + * Runs a main loop until it stops running. + * + * Deprecated: 2.2: Use g_main_loop_run() instead + */ +#define g_main_run(loop) g_main_loop_run(loop) + +/** + * g_main_quit: + * @loop: a #GMainLoop + * + * Stops the #GMainLoop. + * If g_main_run() was called to run the #GMainLoop, it will now return. + * + * Deprecated: 2.2: Use g_main_loop_quit() instead + */ +#define g_main_quit(loop) g_main_loop_quit(loop) + +/** + * g_main_destroy: + * @loop: a #GMainLoop + * + * Frees the memory allocated for the #GMainLoop. + * + * Deprecated: 2.2: Use g_main_loop_unref() instead + */ +#define g_main_destroy(loop) g_main_loop_unref(loop) + +/** + * g_main_is_running: + * @loop: a #GMainLoop + * + * Checks if the main loop is running. + * + * Returns: %TRUE if the main loop is running + * + * Deprecated: 2.2: Use g_main_loop_is_running() instead + */ +#define g_main_is_running(loop) g_main_loop_is_running(loop) + +/** + * g_main_iteration: + * @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. + * + * Runs a single iteration for the default #GMainContext. + * + * Returns: %TRUE if more events are pending. + * + * Deprecated: 2.2: Use g_main_context_iteration() instead. + */ +#define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block) + +/** + * g_main_pending: + * + * Checks if any events are pending for the default #GMainContext + * (i.e. ready to be processed). + * + * Returns: %TRUE if any events are pending. + * + * Deprected: 2.2: Use g_main_context_pending() instead. + */ +#define g_main_pending() g_main_context_pending (NULL) + +/** + * g_main_set_poll_func: + * @func: the function to call to poll all file descriptors + * + * Sets the function to use for the handle polling of file descriptors + * for the default main context. + * + * Deprecated: 2.2: Use g_main_context_set_poll_func() again + */ +#define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func) + + +G_END_DECLS + +#endif /* __G_DEPRECATED_MAIN_H__ */ diff --git a/glib/deprecated/grel.c b/glib/deprecated/grel.c new file mode 100644 index 0000000..7f6fdff --- /dev/null +++ b/glib/deprecated/grel.c @@ -0,0 +1,683 @@ +/* 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" + +/* we know we are deprecated here, no need for warnings */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "grel.h" + +#include +#include +#include +#include +#include + +#include +#include + +/** + * 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(). + * + * GRelation has been marked as deprecated, since this API has never + * been fully implemented, is not very actively maintained and rarely + * used. + **/ + +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. + * + * Creates a new #GRelation with the given number of fields. Note that + * currently the number of fields must be 2. + * + * Returns: a new #GRelation. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * @...: 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. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Deletes any records from a #GRelation that have the given key value + * in the given field. + * + * Returns: the number of records deleted. + * + * Deprecated: 2.26: Rarely used API + **/ +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 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(). + * + * Returns: the records (tuples) that matched. + * + * Deprecated: 2.26: Rarely used API + **/ +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 tuples in a #GRelation that have the given + * value in the given field. + * + * Returns: the number of matches. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * @...: the fields of the record to compare. The number must match + * the number of fields in the #GRelation. + * + * 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. + * + * Returns: %TRUE if a record matches. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * 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. + * + * Returns: the field of the record. + * + * Deprecated: 2.26: Rarely used API + **/ +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. + * + * Deprecated: 2.26: Rarely used API + **/ +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); + } + +} diff --git a/glib/deprecated/grel.h b/glib/deprecated/grel.h new file mode 100644 index 0000000..b76e006 --- /dev/null +++ b/glib/deprecated/grel.h @@ -0,0 +1,107 @@ +/* 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_REL_H__ +#define __G_REL_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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 ... + */ + +GLIB_DEPRECATED_IN_2_26 +GRelation* g_relation_new (gint fields); +GLIB_DEPRECATED_IN_2_26 +void g_relation_destroy (GRelation *relation); +GLIB_DEPRECATED_IN_2_26 +void g_relation_index (GRelation *relation, + gint field, + GHashFunc hash_func, + GEqualFunc key_equal_func); +GLIB_DEPRECATED_IN_2_26 +void g_relation_insert (GRelation *relation, + ...); +GLIB_DEPRECATED_IN_2_26 +gint g_relation_delete (GRelation *relation, + gconstpointer key, + gint field); +GLIB_DEPRECATED_IN_2_26 +GTuples* g_relation_select (GRelation *relation, + gconstpointer key, + gint field); +GLIB_DEPRECATED_IN_2_26 +gint g_relation_count (GRelation *relation, + gconstpointer key, + gint field); +GLIB_DEPRECATED_IN_2_26 +gboolean g_relation_exists (GRelation *relation, + ...); +GLIB_DEPRECATED_IN_2_26 +void g_relation_print (GRelation *relation); +GLIB_DEPRECATED_IN_2_26 +void g_tuples_destroy (GTuples *tuples); +GLIB_DEPRECATED_IN_2_26 +gpointer g_tuples_index (GTuples *tuples, + gint index_, + gint field); + +G_END_DECLS + +#endif /* __G_REL_H__ */ diff --git a/glib/deprecated/gthread-deprecated.c b/glib/deprecated/gthread-deprecated.c new file mode 100644 index 0000000..c89d22a --- /dev/null +++ b/glib/deprecated/gthread-deprecated.c @@ -0,0 +1,1600 @@ +/* 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. + */ + +#include "config.h" + +/* we know we are deprecated here, no need for warnings */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gmessages.h" +#include "gslice.h" +#include "gmain.h" +#include "gthread.h" +#include "gthreadprivate.h" +#include "deprecated/gthread.h" +#include "garray.h" + +#include "gutils.h" + +/* {{{1 Documentation */ + +/** + * SECTION:threads-deprecated + * @title: Deprecated thread API + * @short_description: old thread APIs (for reference only) + * @see_also: #GThread + * + * These APIs are deprecated. You should not use them in new code. + * This section remains only to assist with understanding code that was + * written to use these APIs at some point in the past. + **/ + +/** + * 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 + * + * Deprecated:2.32: Thread priorities no longer have any effect. + */ + +/** + * 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 no longer used by g_thread_init() + * to initialize the thread system. + */ + +/** + * G_THREADS_IMPL_POSIX: + * + * This macro is defined if POSIX style threads are used. + * + * Deprecated:2.32:POSIX threads are in use on all non-Windows systems. + * Use G_OS_WIN32 to detect Windows. + */ + +/** + * G_THREADS_IMPL_WIN32: + * + * This macro is defined if Windows style threads are used. + * + * Deprecated:2.32:Use G_OS_WIN32 to detect Windows. + */ + + +/* {{{1 Exported Variables */ + +/* Set this FALSE to have previously-compiled GStaticMutex code use the + * slow path (ie: call into us) to avoid compatibility problems. + */ +gboolean g_thread_use_default_impl = FALSE; + +GThreadFunctions g_thread_functions_for_glib_use = +{ + g_mutex_new, + g_mutex_lock, + g_mutex_trylock, + g_mutex_unlock, + g_mutex_free, + g_cond_new, + g_cond_signal, + g_cond_broadcast, + g_cond_wait, + g_cond_timed_wait, + g_cond_free, + g_private_new, + g_private_get, + g_private_set, + NULL, + g_thread_yield, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + +static guint64 +gettime (void) +{ + return g_get_monotonic_time () * 1000; +} + +guint64 (*g_thread_gettime) (void) = gettime; + +/* Initialisation {{{1 ---------------------------------------------------- */ +gboolean g_threads_got_initialized = TRUE; + +/** + * g_thread_init: + * @vtable: a function table of type #GThreadFunctions, that provides + * the entry points to the thread system to be used. Since 2.32, + * this parameter is ignored and should always be %NULL + * + * If you use GLib from more than one thread, you must initialize the + * thread system by calling g_thread_init(). + * + * Since version 2.24, calling g_thread_init() multiple times is allowed, + * but nothing happens except for the first call. + * + * Since version 2.32, GLib does not support custom thread implementations + * anymore and the @vtable parameter is ignored and you should pass %NULL. + * + * g_thread_init() must not be called directly or indirectly + * in a callback from GLib. Also no mutexes may be currently locked while + * calling g_thread_init(). + * + * 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. + * + * Deprecated:2.32: This function is no longer necessary. The GLib + * threading system is automatically initialized at the start + * of your program. + */ + +/** + * 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 (void) +{ + return g_thread_supported (); +} + +/* We need this for ABI compatibility */ +GLIB_AVAILABLE_IN_ALL +void g_thread_init_glib (void); +void g_thread_init_glib (void) { } + +/* Internal variables {{{1 */ + +static GSList *g_thread_all_threads = NULL; +static GSList *g_thread_free_indices = NULL; + +/* Protects g_thread_all_threads and g_thread_free_indices */ +G_LOCK_DEFINE_STATIC (g_static_mutex); +G_LOCK_DEFINE_STATIC (g_thread); + +/* Misc. GThread functions {{{1 */ + +/** + * g_thread_set_priority: + * @thread: a #GThread. + * @priority: ignored + * + * This function does nothing. + * + * Deprecated:2.32: Thread priorities no longer have any effect. + */ +void +g_thread_set_priority (GThread *thread, + GThreadPriority priority) +{ +} + +/** + * g_thread_foreach: + * @thread_func: function to call for all #GThread structures + * @user_data: second argument to @thread_func + * + * Call @thread_func on all #GThreads that have been + * created with g_thread_create(). + * + * 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 + * + * Deprecated:2.32: There aren't many things you can do with a #GThread, + * except comparing it with one that was returned from g_thread_create(). + * There are better ways to find out if your thread is still alive. + */ +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); + slist = g_slist_copy (g_thread_all_threads); + G_UNLOCK (g_thread); + /* walk the list, skipping non-existent threads */ + while (slist) + { + GSList *node = slist; + slist = node->next; + /* check whether the current thread still exists */ + G_LOCK (g_thread); + if (g_slist_find (g_thread_all_threads, node->data)) + thread = node->data; + else + thread = NULL; + G_UNLOCK (g_thread); + if (thread) + thread_func (thread, user_data); + g_slist_free_1 (node); + } +} + +static void +g_enumerable_thread_remove (gpointer data) +{ + GRealThread *thread = data; + + G_LOCK (g_thread); + g_thread_all_threads = g_slist_remove (g_thread_all_threads, thread); + G_UNLOCK (g_thread); +} + +GPrivate enumerable_thread_private = G_PRIVATE_INIT (g_enumerable_thread_remove); + +static void +g_enumerable_thread_add (GRealThread *thread) +{ + G_LOCK (g_thread); + g_thread_all_threads = g_slist_prepend (g_thread_all_threads, thread); + G_UNLOCK (g_thread); + + g_private_set (&enumerable_thread_private, thread); +} + +static gpointer +g_deprecated_thread_proxy (gpointer data) +{ + GRealThread *real = data; + + g_enumerable_thread_add (real); + + return g_thread_proxy (data); +} + +/** + * 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, or %NULL + * + * This function creates a new thread. + * + * 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. + * + * This function returns a reference to the created thread only if + * @joinable is %TRUE. In that case, you must free this reference by + * calling g_thread_unref() or g_thread_join(). If @joinable is %FALSE + * then you should probably not touch the return value. + * + * Returns: the new #GThread on success + * + * Deprecated:2.32: Use g_thread_new() instead + */ +GThread * +g_thread_create (GThreadFunc func, + gpointer data, + gboolean joinable, + GError **error) +{ + return g_thread_create_full (func, data, 0, joinable, 0, 0, error); +} + +/** + * 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: ignored + * @priority: ignored + * @error: return location for error. + * + * This function creates a new thread. + * + * Returns: the new #GThread on success. + * + * Deprecated:2.32: The @bound and @priority arguments are now ignored. + * Use g_thread_new(). + */ +GThread * +g_thread_create_full (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + GError **error) +{ + GThread *thread; + + thread = g_thread_new_internal (NULL, g_deprecated_thread_proxy, + func, data, stack_size, error); + + if (!joinable) + { + thread->joinable = FALSE; + g_thread_unref (thread); + } + + return thread; +} + +/* GOnce {{{1 ------------------------------------------------------------- */ +gboolean +g_once_init_enter_impl (volatile gsize *location) +{ + return (g_once_init_enter) (location); +} + +/* GStaticMutex {{{1 ------------------------------------------------------ */ + +/** + * GStaticMutex: + * + * A #GStaticMutex works like a #GMutex. + * + * Prior to GLib 2.32, GStaticMutex had the significant advantage + * that it doesn't need to be created at run-time, but can be defined + * at compile-time. Since 2.32, #GMutex can be statically allocated + * as well, and GStaticMutex has been deprecated. + * + * Here is a version of our give_me_next_number() example using + * a GStaticMutex. + * + * + * + * 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. + * + * Deprecated: 2.32: Use g_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.ac writes macros into glibconfig.h to determine if + * g_static_mutex_get_mutex() accesses the structure 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. + * + * 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. + * + * Returns: the #GMutex corresponding to @mutex. + * + * Deprecated: 2.32: Just use a #GMutex + */ +GMutex * +g_static_mutex_get_mutex_impl (GStaticMutex* mutex) +{ + GMutex *result; + + if (!g_thread_supported ()) + return NULL; + + result = g_atomic_pointer_get (&mutex->mutex); + + if (!result) + { + G_LOCK (g_static_mutex); + + result = mutex->mutex; + if (!result) + { + result = g_mutex_new (); + g_atomic_pointer_set (&mutex->mutex, result); + } + + G_UNLOCK (g_static_mutex); + } + + return result; +} + +/* 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. + * + * Deprecated: 2.32: Use g_mutex_lock() + */ + +/** + * g_static_mutex_trylock: + * @mutex: a #GStaticMutex. + * + * Works like g_mutex_trylock(), but for a #GStaticMutex. + * + * Returns: %TRUE, if the #GStaticMutex could be locked. + * + * Deprecated: 2.32: Use g_mutex_trylock() + */ + +/** + * g_static_mutex_unlock: + * @mutex: a #GStaticMutex. + * + * Works like g_mutex_unlock(), but for a #GStaticMutex. + * + * Deprecated: 2.32: Use g_mutex_unlock() + */ + +/** + * 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. + * + * Deprecated: 2.32: Use g_mutex_clear() + */ +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.ac. 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; +} + +/* {{{1 GStaticRecMutex */ + +/** + * 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(). In GLib 2.32, #GStaticRecMutex has + * been deprecated in favor of #GRecMutex. + * + * 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. + * + * Deprecated: 2.32: Use g_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; +} + +static GRecMutex * +g_static_rec_mutex_get_rec_mutex_impl (GStaticRecMutex* mutex) +{ + GRecMutex *result; + + if (!g_thread_supported ()) + return NULL; + + result = g_atomic_pointer_get (&mutex->mutex.mutex); + + if (!result) + { + G_LOCK (g_static_mutex); + + result = (GRecMutex *) mutex->mutex.mutex; + if (!result) + { + result = g_slice_new (GRecMutex); + g_rec_mutex_init (result); + g_atomic_pointer_set (&mutex->mutex.mutex, result); + } + + G_UNLOCK (g_static_mutex); + } + + return result; +} + +/** + * 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. + * + * Deprecated: 2.32: Use g_rec_mutex_lock() + */ +void +g_static_rec_mutex_lock (GStaticRecMutex* mutex) +{ + GRecMutex *rm; + rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); + g_rec_mutex_lock (rm); + mutex->depth++; +} + +/** + * g_static_rec_mutex_trylock: + * @mutex: a #GStaticRecMutex to lock. + * + * 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. + * + * Returns: %TRUE, if @mutex could be locked. + * + * Deprecated: 2.32: Use g_rec_mutex_trylock() + */ +gboolean +g_static_rec_mutex_trylock (GStaticRecMutex* mutex) +{ + GRecMutex *rm; + rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); + + if (g_rec_mutex_trylock (rm)) + { + mutex->depth++; + return TRUE; + } + else + return FALSE; +} + +/** + * 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. + * + * Deprecated: 2.32: Use g_rec_mutex_unlock() + */ +void +g_static_rec_mutex_unlock (GStaticRecMutex* mutex) +{ + GRecMutex *rm; + rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); + mutex->depth--; + g_rec_mutex_unlock (rm); +} + +/** + * 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. + * + * Deprecated: 2.32: Use g_rec_mutex_lock() + */ +void +g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, + guint depth) +{ + GRecMutex *rm; + + rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); + while (depth--) + { + g_rec_mutex_lock (rm); + mutex->depth++; + } +} + +/** + * g_static_rec_mutex_unlock_full: + * @mutex: a #GStaticRecMutex to completely unlock. + * + * 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. + * + * Returns: number of times @mutex has been locked by the current + * thread. + * + * Deprecated: 2.32: Use g_rec_mutex_unlock() + */ +guint +g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex) +{ + GRecMutex *rm; + gint depth; + gint i; + + rm = g_static_rec_mutex_get_rec_mutex_impl (mutex); + + /* all access to mutex->depth done while still holding the lock */ + depth = mutex->depth; + i = mutex->depth; + mutex->depth = 0; + + while (i--) + g_rec_mutex_unlock (rm); + + 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. + * + * Deprecated: 2.32: Use g_rec_mutex_clear() + */ +void +g_static_rec_mutex_free (GStaticRecMutex *mutex) +{ + g_return_if_fail (mutex); + + if (mutex->mutex.mutex) + { + GRecMutex *rm = (GRecMutex *) mutex->mutex.mutex; + + g_rec_mutex_clear (rm); + g_slice_free (GRecMutex, rm); + } +} + +/* 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. + * + * Deprecated: 2.32: Use a #GRWLock instead + **/ + +/** + * 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. + * + * Deprecated: 2.32: Use g_rw_lock_init() instead + */ +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. + * + * Deprecated: 2.32: Use g_rw_lock_reader_lock() instead + */ +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. + * + * 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(). + * + * Returns: %TRUE, if @lock could be locked for reading. + * + * Deprectated: 2.32: Use g_rw_lock_reader_trylock() instead + */ +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. + * + * Deprectated: 2.32: Use g_rw_lock_reader_unlock() instead + */ +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(). + * + * Deprectated: 2.32: Use g_rw_lock_writer_lock() instead + */ +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. + * + * 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(). + * + * Returns: %TRUE, if @lock could be locked for writing. + * + * Deprectated: 2.32: Use g_rw_lock_writer_trylock() instead + */ +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. + * + * Deprectated: 2.32: Use g_rw_lock_writer_unlock() instead + */ +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. + * + * Deprecated: 2.32: Use a #GRWLock instead + */ +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); +} + +/* GPrivate {{{1 ------------------------------------------------------ */ + +/** + * g_private_new: + * @notify: a #GDestroyNotify + * + * Creates a new #GPrivate. + * + * Deprecated:2.32: dynamic allocation of #GPrivate is a bad idea. Use + * static storage and G_PRIVATE_INIT() instead. + * + * Returns: a newly allocated #GPrivate (which can never be destroyed) + */ +GPrivate * +g_private_new (GDestroyNotify notify) +{ + GPrivate tmp = G_PRIVATE_INIT (notify); + GPrivate *key; + + key = g_slice_new (GPrivate); + *key = tmp; + + return key; +} + +/* {{{1 GStaticPrivate */ + +typedef struct _GStaticPrivateNode GStaticPrivateNode; +struct _GStaticPrivateNode +{ + gpointer data; + GDestroyNotify destroy; + GStaticPrivate *owner; +}; + +static void +g_static_private_cleanup (gpointer data) +{ + GArray *array = 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); +} + +GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup); + +/** + * 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 + * + * Works like g_private_get() only for a #GStaticPrivate. + * + * This function works even if g_thread_init() has not yet been called. + * + * Returns: the corresponding pointer + */ +gpointer +g_static_private_get (GStaticPrivate *private_key) +{ + GArray *array; + gpointer ret = NULL; + + array = g_private_get (&static_private_private); + + if (array && private_key->index != 0 && private_key->index <= array->len) + { + GStaticPrivateNode *node; + + node = &g_array_index (array, GStaticPrivateNode, private_key->index - 1); + + /* Deal with the possibility that the GStaticPrivate which used + * to have this index got freed and the index got allocated to + * a new one. In this case, the data in the node is stale, so + * free it and return NULL. + */ + if (G_UNLIKELY (node->owner != private_key)) + { + if (node->destroy) + node->destroy (node->data); + node->destroy = NULL; + node->data = NULL; + node->owner = NULL; + } + ret = node->data; + } + + return ret; +} + +/** + * 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) +{ + GArray *array; + static guint next_index = 0; + GStaticPrivateNode *node; + + if (!private_key->index) + { + G_LOCK (g_thread); + + if (!private_key->index) + { + if (g_thread_free_indices) + { + private_key->index = GPOINTER_TO_UINT (g_thread_free_indices->data); + g_thread_free_indices = g_slist_delete_link (g_thread_free_indices, + g_thread_free_indices); + } + else + private_key->index = ++next_index; + } + + G_UNLOCK (g_thread); + } + + array = g_private_get (&static_private_private); + if (!array) + { + array = g_array_new (FALSE, TRUE, sizeof (GStaticPrivateNode)); + g_private_set (&static_private_private, array); + } + 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) + node->destroy (node->data); + + node->data = data; + node->destroy = notify; + node->owner = private_key; +} + +/** + * 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; + + if (!idx) + return; + + private_key->index = 0; + + /* Freeing the per-thread data is deferred to either the + * thread end or the next g_static_private_get() call for + * the same index. + */ + G_LOCK (g_thread); + g_thread_free_indices = g_slist_prepend (g_thread_free_indices, + GUINT_TO_POINTER (idx)); + G_UNLOCK (g_thread); +} + +/* GMutex {{{1 ------------------------------------------------------ */ + +/** + * g_mutex_new: + * + * Allocates and initializes a new #GMutex. + * + * Returns: a newly allocated #GMutex. Use g_mutex_free() to free + * + * Deprecated: 2.32: GMutex can now be statically allocated, or embedded + * in structures and initialised with g_mutex_init(). + */ +GMutex * +g_mutex_new (void) +{ + GMutex *mutex; + + mutex = g_slice_new (GMutex); + g_mutex_init (mutex); + + return mutex; +} + +/** + * g_mutex_free: + * @mutex: a #GMutex + * + * Destroys a @mutex that has been created with g_mutex_new(). + * + * Calling g_mutex_free() on a locked mutex may result + * in undefined behaviour. + * + * Deprecated: 2.32: GMutex can now be statically allocated, or embedded + * in structures and initialised with g_mutex_init(). + */ +void +g_mutex_free (GMutex *mutex) +{ + g_mutex_clear (mutex); + g_slice_free (GMutex, mutex); +} + +/* GCond {{{1 ------------------------------------------------------ */ + +/** + * g_cond_new: + * + * Allocates and initializes a new #GCond. + * + * Returns: a newly allocated #GCond. Free with g_cond_free() + * + * Deprecated: 2.32: GCond can now be statically allocated, or embedded + * in structures and initialised with g_cond_init(). + */ +GCond * +g_cond_new (void) +{ + GCond *cond; + + cond = g_slice_new (GCond); + g_cond_init (cond); + + return cond; +} + +/** + * g_cond_free: + * @cond: a #GCond + * + * Destroys a #GCond that has been created with g_cond_new(). + * + * Calling g_cond_free() for a #GCond on which threads are + * blocking leads to undefined behaviour. + * + * Deprecated: 2.32: GCond can now be statically allocated, or embedded + * in structures and initialised with g_cond_init(). + */ +void +g_cond_free (GCond *cond) +{ + g_cond_clear (cond); + g_slice_free (GCond, cond); +} + +/** + * g_cond_timed_wait: + * @cond: a #GCond + * @mutex: a #GMutex that is currently locked + * @abs_time: a #GTimeVal, determining the final 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. + * + * Returns: %TRUE if @cond was signalled, or %FALSE on timeout + * Deprecated:2.32: Use g_cond_wait_until() instead. + */ +gboolean +g_cond_timed_wait (GCond *cond, + GMutex *mutex, + GTimeVal *abs_time) +{ + gint64 end_time; + + if (abs_time == NULL) + { + g_cond_wait (cond, mutex); + return TRUE; + } + + end_time = abs_time->tv_sec; + end_time *= 1000000; + end_time += abs_time->tv_usec; + +#ifdef CLOCK_MONOTONIC + /* would be nice if we had clock_rtoffset, but that didn't seem to + * make it into the kernel yet... + */ + end_time += g_get_monotonic_time () - g_get_real_time (); +#else + /* if CLOCK_MONOTONIC is not defined then g_get_montonic_time() and + * g_get_real_time() are returning the same clock, so don't bother... + */ +#endif + + return g_cond_wait_until (cond, mutex, end_time); +} + +/* {{{1 Epilogue */ +/* vim: set foldmethod=marker: */ diff --git a/glib/deprecated/gthread.h b/glib/deprecated/gthread.h new file mode 100644 index 0000000..462bb8f --- /dev/null +++ b/glib/deprecated/gthread.h @@ -0,0 +1,286 @@ +/* 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_DEPRECATED_THREAD_H__ +#define __G_DEPRECATED_THREAD_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef enum +{ + G_THREAD_PRIORITY_LOW, + G_THREAD_PRIORITY_NORMAL, + G_THREAD_PRIORITY_HIGH, + G_THREAD_PRIORITY_URGENT +} GThreadPriority; + +struct _GThread +{ + /*< private >*/ + GThreadFunc func; + gpointer data; + gboolean joinable; + GThreadPriority priority; +}; + +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 guint64 (*g_thread_gettime) (void); + +GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new) +GThread *g_thread_create (GThreadFunc func, + gpointer data, + gboolean joinable, + GError **error); + +GLIB_DEPRECATED_IN_2_32_FOR(g_thread_new) +GThread *g_thread_create_full (GThreadFunc func, + gpointer data, + gulong stack_size, + gboolean joinable, + gboolean bound, + GThreadPriority priority, + GError **error); + +GLIB_DEPRECATED_IN_2_32 +void g_thread_set_priority (GThread *thread, + GThreadPriority priority); + +GLIB_DEPRECATED_IN_2_32 +void g_thread_foreach (GFunc thread_func, + gpointer user_data); + +#ifndef G_OS_WIN32 +#include +#endif + +#define g_static_mutex_get_mutex g_static_mutex_get_mutex_impl +#define G_STATIC_MUTEX_INIT { NULL } +typedef struct +{ + GMutex *mutex; +#ifndef G_OS_WIN32 + /* only for ABI compatibility reasons */ + pthread_mutex_t unused; +#endif +} GStaticMutex; + +#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)) + +GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_init) +void g_static_mutex_init (GStaticMutex *mutex); +GLIB_DEPRECATED_IN_2_32_FOR(g_mutex_clear) +void g_static_mutex_free (GStaticMutex *mutex); +GLIB_DEPRECATED_IN_2_32_FOR(GMutex) +GMutex *g_static_mutex_get_mutex_impl (GStaticMutex *mutex); + +typedef struct _GStaticRecMutex GStaticRecMutex; +struct _GStaticRecMutex +{ + /*< private >*/ + GStaticMutex mutex; + guint depth; + + /* ABI compat only */ + union { +#ifdef G_OS_WIN32 + void *owner; +#else + pthread_t owner; +#endif + gdouble dummy; + } unused; +}; + +#define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT } +GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_init) +void g_static_rec_mutex_init (GStaticRecMutex *mutex); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_lock) +void g_static_rec_mutex_lock (GStaticRecMutex *mutex); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_try_lock) +gboolean g_static_rec_mutex_trylock (GStaticRecMutex *mutex); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_unlock) +void g_static_rec_mutex_unlock (GStaticRecMutex *mutex); + +GLIB_DEPRECATED_IN_2_32 +void g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, + guint depth); + +GLIB_DEPRECATED_IN_2_32 +guint g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rec_mutex_free) +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 } + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_init) +void g_static_rw_lock_init (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_lock) +void g_static_rw_lock_reader_lock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_trylock) +gboolean g_static_rw_lock_reader_trylock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_reader_unlock) +void g_static_rw_lock_reader_unlock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_lock) +void g_static_rw_lock_writer_lock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_trylock) +gboolean g_static_rw_lock_writer_trylock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_writer_unlock) +void g_static_rw_lock_writer_unlock (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32_FOR(g_rw_lock_free) +void g_static_rw_lock_free (GStaticRWLock *lock); + +GLIB_DEPRECATED_IN_2_32 +GPrivate * g_private_new (GDestroyNotify notify); + +typedef struct _GStaticPrivate GStaticPrivate; +struct _GStaticPrivate +{ + /*< private >*/ + guint index; +}; + +#define G_STATIC_PRIVATE_INIT { 0 } +GLIB_DEPRECATED_IN_2_32 +void g_static_private_init (GStaticPrivate *private_key); + +GLIB_DEPRECATED_IN_2_32_FOR(g_private_get) +gpointer g_static_private_get (GStaticPrivate *private_key); + +GLIB_DEPRECATED_IN_2_32_FOR(g_private_set) +void g_static_private_set (GStaticPrivate *private_key, + gpointer data, + GDestroyNotify notify); + +GLIB_DEPRECATED_IN_2_32 +void g_static_private_free (GStaticPrivate *private_key); + +GLIB_DEPRECATED_IN_2_32 +gboolean g_once_init_enter_impl (volatile gsize *location); + +GLIB_DEPRECATED_IN_2_32 +void g_thread_init (gpointer vtable); +GLIB_DEPRECATED_IN_2_32 +void g_thread_init_with_errorcheck_mutexes (gpointer vtable); + +GLIB_DEPRECATED_IN_2_32 +gboolean g_thread_get_initialized (void); + +GLIB_VAR gboolean g_threads_got_initialized; + +#define g_thread_supported() (1) + +GLIB_DEPRECATED_IN_2_32 +GMutex * g_mutex_new (void); +GLIB_DEPRECATED_IN_2_32 +void g_mutex_free (GMutex *mutex); +GLIB_DEPRECATED_IN_2_32 +GCond * g_cond_new (void); +GLIB_DEPRECATED_IN_2_32 +void g_cond_free (GCond *cond); +GLIB_DEPRECATED_IN_2_32 +gboolean g_cond_timed_wait (GCond *cond, + GMutex *mutex, + GTimeVal *timeval); + +G_END_DECLS + +#endif /* __G_DEPRECATED_THREAD_H__ */ diff --git a/glib/docs.c b/glib/docs.c new file mode 100644 index 0000000..74a97e8 --- /dev/null +++ b/glib/docs.c @@ -0,0 +1,2397 @@ +/* + * Copyright © 2011 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 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: Matthias Clasen + */ + + +/* This file collects documentation for macros, typedefs and + * the like, which have no good home in any of the 'real' source + * files. + */ + +/* Basic types {{{1 */ + +/** + * SECTION:types + * @title: Basic Types + * @short_description: 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. + * + * GLib also defines macros for the limits of some of the standard + * integer and floating point types, as well as macros for suitable + * printf() formats for these types. + */ + +/** + * gboolean: + * + * A standard boolean type. + * Variables of this type should only contain the value + * %TRUE or %FALSE. + */ + +/** + * gpointer: + * + * An untyped pointer. + * #gpointer looks better and is easier to use + * than 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: + * + * Corresponds to the standard C char type. + */ + +/** + * guchar: + * + * Corresponds to the standard C unsigned char type. + */ + +/** + * gint: + * + * Corresponds to the standard C int type. + * Values of this type can range from #G_MININT to #G_MAXINT. + */ + +/** + * G_MININT: + * + * The minimum value which can be held in a #gint. + */ + +/** + * G_MAXINT: + * + * The maximum value which can be held in a #gint. + */ + +/** + * guint: + * + * Corresponds to the standard C unsigned int type. + * Values of this type can range from 0 to #G_MAXUINT. + */ + +/** + * G_MAXUINT: + * + * The maximum value which can be held in a #guint. + */ + +/** + * gshort: + * + * Corresponds to the standard C short type. + * Values of this type can range from #G_MINSHORT to #G_MAXSHORT. + */ + +/** + * G_MINSHORT: + * + * The minimum value which can be held in a #gshort. + */ + +/** + * G_MAXSHORT: + * + * The maximum value which can be held in a #gshort. + */ + +/** + * gushort: + * + * Corresponds to the standard C unsigned short type. + * Values of this type can range from 0 to #G_MAXUSHORT. + */ + +/** + * G_MAXUSHORT: + * + * The maximum value which can be held in a #gushort. + */ + +/** + * glong: + * + * Corresponds to the standard C long type. + * Values of this type can range from #G_MINLONG to #G_MAXLONG. + */ + +/** + * G_MINLONG: + * + * The minimum value which can be held in a #glong. + */ + +/** + * G_MAXLONG: + * + * The maximum value which can be held in a #glong. + */ + +/** + * gulong: + * + * Corresponds to the standard C unsigned long type. + * Values of this type can range from 0 to #G_MAXULONG. + */ + +/** + * G_MAXULONG: + * + * The maximum value which can be held in a #gulong. + */ + +/** + * 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). + */ + +/** + * G_MININT8: + * + * The minimum value which can be held in a #gint8. + * + * Since: 2.4 + */ + +/** + * G_MAXINT8: + * + * The maximum value which can be held in a #gint8. + * + * Since: 2.4 + */ + +/** + * guint8: + * + * An unsigned integer guaranteed to be 8 bits on all platforms. + * Values of this type can range from 0 to #G_MAXUINT8 (= 255). + */ + +/** + * G_MAXUINT8: + * + * The maximum value which can be held in a #guint8. + * + * Since: 2.4 + */ + +/** + * 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. + */ + +/** + * G_MININT16: + * + * The minimum value which can be held in a #gint16. + * + * Since: 2.4 + */ + +/** + * G_MAXINT16: + * + * The maximum value which can be held in a #gint16. + * + * Since: 2.4 + */ + +/** + * G_GINT16_MODIFIER: + * + * 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: + * + * 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); + * ]| + */ + +/** + * 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. + */ + +/** + * G_MAXUINT16: + * + * The maximum value which can be held in a #guint16. + * + * Since: 2.4 + */ + +/** + * G_GUINT16_FORMAT: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #guint16. See also #G_GINT16_FORMAT + */ + +/** + * 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. + */ + +/** + * G_MININT32: + * + * The minimum value which can be held in a #gint32. + * + * Since: 2.4 + */ + +/** + * G_MAXINT32: + * + * The maximum value which can be held in a #gint32. + * + * Since: 2.4 + */ + +/** + * 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: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #gint32. See also #G_GINT16_FORMAT. + */ + +/** + * 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_MAXUINT32: + * + * The maximum value which can be held in a #guint32. + * + * Since: 2.4 + */ + +/** + * G_GUINT32_FORMAT: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #guint32. See also #G_GINT16_FORMAT. + */ + +/** + * 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. + */ + +/** + * G_MININT64: + * + * The minimum value which can be held in a #gint64. + */ + +/** + * G_MAXINT64: + * + * The maximum value which can be held in a #gint64. + */ + +/** + * G_GINT64_MODIFIER: + * + * 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 + */ + +/** + * G_GINT64_FORMAT: + * + * 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. + * + */ + +/** + * 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_MAXUINT64: + * + * The maximum value which can be held in a #guint64. + */ + +/** + * G_GUINT64_FORMAT: + * + * 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_ascii_strtoull() + * instead. + * + */ + +/** + * G_GINT64_CONSTANT: + * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 + * + * This macro is used to insert 64-bit integer literals + * into the source code. + */ + +/** + * G_GUINT64_CONSTANT: + * @val: a literal integer value, e.g. 0x1d636b02300a7aa7U + * + * This macro is used to insert 64-bit unsigned integer + * literals into the source code. + * + * Since: 2.10 + */ + +/** + * gfloat: + * + * Corresponds to the standard C float type. + * Values of this type can range from -#G_MAXFLOAT to #G_MAXFLOAT. + */ + +/** + * G_MINFLOAT: + * + * 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_MAXFLOAT. + */ + +/** + * G_MAXFLOAT: + * + * The maximum value which can be held in a #gfloat. + */ + +/** + * gdouble: + * + * Corresponds to the standard C double type. + * Values of this type can range from -#G_MAXDOUBLE to #G_MAXDOUBLE. + */ + +/** + * G_MINDOUBLE: + * + * 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: + * + * The maximum value which can be held in a #gdouble. + */ + +/** + * 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. + */ + +/** + * G_MAXSIZE: + * + * The maximum value which can be held in a #gsize. + * + * Since: 2.4 + */ + +/** + * G_GSIZE_MODIFIER: + * + * 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: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #gsize. See also #G_GINT16_FORMAT. + * + * Since: 2.6 + */ + +/** + * 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. + */ + +/** + * G_MINSSIZE: + * + * The minimum value which can be held in a #gssize. + * + * Since: 2.14 + */ + +/** + * G_MAXSSIZE: + * + * The maximum value which can be held in a #gssize. + * + * Since: 2.14 + */ + +/** + * G_GSSIZE_FORMAT: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #gssize. See also #G_GINT16_FORMAT. + * + * Since: 2.6 + */ + +/** + * 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_MINOFFSET: + * + * The minimum value which can be held in a #goffset. + */ + +/** + * G_MAXOFFSET: + * + * The maximum value which can be held in a #goffset. + */ + +/** + * G_GOFFSET_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: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #goffset. See also #G_GINT64_FORMAT. + * + * Since: 2.20 + */ + +/** + * G_GOFFSET_CONSTANT: + * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 + * + * This macro is used to insert #goffset 64-bit integer literals + * into the source code. + * + * See also #G_GINT64_CONSTANT. + * + * Since: 2.20 + */ + +/** + * 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 + */ + +/** + * G_GINTPTR_MODIFIER: + * + * 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: + * + * This is the platform dependent conversion specifier for scanning + * and printing values of type #gintptr. + * + * Since: 2.22 + */ + +/** + * 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 + */ + +/** + * G_GUINTPTR_FORMAT: + * + * This is the platform dependent conversion specifier + * for scanning and printing values of type #guintptr. + * + * Since: 2.22 + */ + +/* Type conversion {{{1 */ + +/** + * SECTION:type_conversion + * @title: Type Conversion Macros + * @short_description: 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; + * ]| + * The GLib macros GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. take care + * to do the right thing on the every 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. + * + */ + +/** + * GINT_TO_POINTER: + * @i: integer to stuff into a pointer + * + * 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. + */ + +/** + * GPOINTER_TO_INT: + * @p: pointer containing an integer + * + * 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. + */ + +/** + * GUINT_TO_POINTER: + * @u: unsigned integer to stuff into the pointer + * + * Stuffs an unsigned integer into a pointer type. + */ + +/** + * GPOINTER_TO_UINT: + * @p: pointer to extract an unsigned integer from + * + * Extracts an unsigned integer from a pointer. The integer must have + * been stored in the pointer with GUINT_TO_POINTER(). + */ + +/** + * GSIZE_TO_POINTER: + * @s: #gsize to stuff into the pointer + * + * Stuffs a #gsize into a pointer type. + */ + +/** + * GPOINTER_TO_SIZE: + * @p: pointer to extract a #gsize from + * + * Extracts a #gsize from a pointer. The #gsize must have + * been stored in the pointer with GSIZE_TO_POINTER(). + */ + +/* Byte order {{{1 */ + +/** + * SECTION:byte_order + * @title: Byte Order Macros + * @short_description: 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. + */ + +/** + * G_BYTE_ORDER: + * + * 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: + * + * Specifies one of the possible types of byte order. + * See #G_BYTE_ORDER. + */ + +/** + * G_BIG_ENDIAN: + * + * Specifies one of the possible types of byte order. + * See #G_BYTE_ORDER. + */ + +/** + * G_PDP_ENDIAN: + * + * Specifies one of the possible types of byte order + * (currently unused). See #G_BYTE_ORDER. + */ + +/** + * g_htonl: + * @val: a 32-bit integer value in host byte order + * + * Converts a 32-bit integer value from host to network byte order. + * + * Returns: @val converted to network byte order + */ + +/** + * g_htons: + * @val: a 16-bit integer value in host byte order + * + * Converts a 16-bit integer value from host to network byte order. + * + * Returns: @val converted to network byte order + */ + +/** + * g_ntohl: + * @val: a 32-bit integer value in network byte order + * + * Converts a 32-bit integer value from network to host byte order. + * + * Returns: @val converted to host byte order. + */ + +/** + * g_ntohs: + * @val: a 16-bit integer value in network byte order + * + * Converts a 16-bit integer value from network to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT_FROM_BE: + * @val: a #gint value in big-endian byte order + * + * Converts a #gint value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT_FROM_LE: + * @val: a #gint value in little-endian byte order + * + * Converts a #gint value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT_TO_BE: + * @val: a #gint value in host byte order + * + * Converts a #gint value from host byte order to big-endian. + * + * Returns: @val converted to big-endian byte order + */ + +/** + * GINT_TO_LE: + * @val: a #gint value in host byte order + * + * Converts a #gint value from host byte order to little-endian. + * + * Returns: @val converted to little-endian byte order + */ + +/** + * GUINT_FROM_BE: + * @val: a #guint value in big-endian byte order + * + * Converts a #guint value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT_FROM_LE: + * @val: a #guint value in little-endian byte order + * + * Converts a #guint value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT_TO_BE: + * @val: a #guint value in host byte order + * + * Converts a #guint value from host byte order to big-endian. + * + * Returns: @val converted to big-endian byte order + */ + +/** + * GUINT_TO_LE: + * @val: a #guint value in host byte order + * + * Converts a #guint value from host byte order to little-endian. + * + * Returns: @val converted to little-endian byte order. + */ + +/** + * GLONG_FROM_BE: + * @val: a #glong value in big-endian byte order + * + * Converts a #glong value from big-endian to the host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GLONG_FROM_LE: + * @val: a #glong value in little-endian byte order + * + * Converts a #glong value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GLONG_TO_BE: + * @val: a #glong value in host byte order + * + * Converts a #glong value from host byte order to big-endian. + * + * Returns: @val converted to big-endian byte order + */ + +/** + * GLONG_TO_LE: + * @val: a #glong value in host byte order + * + * Converts a #glong value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GULONG_FROM_BE: + * @val: a #gulong value in big-endian byte order + * + * Converts a #gulong value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GULONG_FROM_LE: + * @val: a #gulong value in little-endian byte order + * + * Converts a #gulong value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GULONG_TO_BE: + * @val: a #gulong value in host byte order + * + * Converts a #gulong value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GULONG_TO_LE: + * @val: a #gulong value in host byte order + * + * Converts a #gulong value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GSIZE_FROM_BE: + * @val: a #gsize value in big-endian byte order + * + * Converts a #gsize value from big-endian to the host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GSIZE_FROM_LE: + * @val: a #gsize value in little-endian byte order + * + * Converts a #gsize value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GSIZE_TO_BE: + * @val: a #gsize value in host byte order + * + * Converts a #gsize value from host byte order to big-endian. + * + * Returns: @val converted to big-endian byte order + */ + +/** + * GSIZE_TO_LE: + * @val: a #gsize value in host byte order + * + * Converts a #gsize value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GSSIZE_FROM_BE: + * @val: a #gssize value in big-endian byte order + * + * Converts a #gssize value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GSSIZE_FROM_LE: + * @val: a #gssize value in little-endian byte order + * + * Converts a #gssize value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GSSIZE_TO_BE: + * @val: a #gssize value in host byte order + * + * Converts a #gssize value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GSSIZE_TO_LE: + * @val: a #gssize value in host byte order + * + * Converts a #gssize value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GINT16_FROM_BE: + * @val: a #gint16 value in big-endian byte order + * + * Converts a #gint16 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT16_FROM_LE: + * @val: a #gint16 value in little-endian byte order + * + * Converts a #gint16 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT16_TO_BE: + * @val: a #gint16 value in host byte order + * + * Converts a #gint16 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GINT16_TO_LE: + * @val: a #gint16 value in host byte order + * + * Converts a #gint16 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GUINT16_FROM_BE: + * @val: a #guint16 value in big-endian byte order + * + * Converts a #guint16 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT16_FROM_LE: + * @val: a #guint16 value in little-endian byte order + * + * Converts a #guint16 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT16_TO_BE: + * @val: a #guint16 value in host byte order + * + * Converts a #guint16 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GUINT16_TO_LE: + * @val: a #guint16 value in host byte order + * + * Converts a #guint16 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GINT32_FROM_BE: + * @val: a #gint32 value in big-endian byte order + * + * Converts a #gint32 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT32_FROM_LE: + * @val: a #gint32 value in little-endian byte order + * + * Converts a #gint32 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT32_TO_BE: + * @val: a #gint32 value in host byte order + * + * Converts a #gint32 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GINT32_TO_LE: + * @val: a #gint32 value in host byte order + * + * Converts a #gint32 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GUINT32_FROM_BE: + * @val: a #guint32 value in big-endian byte order + * + * Converts a #guint32 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT32_FROM_LE: + * @val: a #guint32 value in little-endian byte order + * + * Converts a #guint32 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT32_TO_BE: + * @val: a #guint32 value in host byte order + * + * Converts a #guint32 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GUINT32_TO_LE: + * @val: a #guint32 value in host byte order + * + * Converts a #guint32 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GINT64_FROM_BE: + * @val: a #gint64 value in big-endian byte order + * + * Converts a #gint64 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT64_FROM_LE: + * @val: a #gint64 value in little-endian byte order + * + * Converts a #gint64 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GINT64_TO_BE: + * @val: a #gint64 value in host byte order + * + * Converts a #gint64 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GINT64_TO_LE: + * @val: a #gint64 value in host byte order + * + * Converts a #gint64 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GUINT64_FROM_BE: + * @val: a #guint64 value in big-endian byte order + * + * Converts a #guint64 value from big-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT64_FROM_LE: + * @val: a #guint64 value in little-endian byte order + * + * Converts a #guint64 value from little-endian to host byte order. + * + * Returns: @val converted to host byte order + */ + +/** + * GUINT64_TO_BE: + * @val: a #guint64 value in host byte order + * + * Converts a #guint64 value from host byte order to big-endian. + * + * Returns: @val converted to big-endian + */ + +/** + * GUINT64_TO_LE: + * @val: a #guint64 value in host byte order + * + * Converts a #guint64 value from host byte order to little-endian. + * + * Returns: @val converted to little-endian + */ + +/** + * GUINT16_SWAP_BE_PDP: + * @val: a #guint16 value in big-endian or pdp-endian byte order + * + * Converts a #guint16 value between big-endian and pdp-endian byte order. + * The conversion is symmetric so it can be used both ways. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT16_SWAP_LE_BE: + * @val: a #guint16 value in little-endian or big-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT16_SWAP_LE_PDP: + * @val: a #guint16 value in little-endian or pdp-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT32_SWAP_BE_PDP: + * @val: a #guint32 value in big-endian or pdp-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT32_SWAP_LE_BE: + * @val: a #guint32 value in little-endian or big-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT32_SWAP_LE_PDP: + * @val: a #guint32 value in little-endian or pdp-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/** + * GUINT64_SWAP_LE_BE: + * @val: a #guint64 value in little-endian or big-endian 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. + * + * Returns: @val converted to the opposite byte order + */ + +/* Numerical Definitions {{{1 */ + +/** + * SECTION:numerical + * @title: Numerical Definitions + * @short_description: 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. See + * IEEE 754-2008 + * for more information about IEEE number formats. + */ + +/** + * G_IEEE754_FLOAT_BIAS: + * + * The bias by which exponents in single-precision floats are offset. + */ + +/** + * G_IEEE754_DOUBLE_BIAS: + * + * The bias by which exponents in double-precision floats are offset. + */ + +/** + * GFloatIEEE754: + * @v_float: the double value + * + * 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. + */ + +/** + * GDoubleIEEE754: + * @v_double: the double value + * + * 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. + */ + +/** + * G_E: + * + * The base of natural logarithms. + */ + +/** + * G_LN2: + * + * The natural logarithm of 2. + */ + +/** + * G_LN10: + * + * The natural logarithm of 10. + */ + +/** + * G_PI: + * + * The value of pi (ratio of circle's circumference to its diameter). + */ + +/** + * G_PI_2: + * + * Pi divided by 2. + */ + +/** + * G_PI_4: + * + * Pi divided by 4. + */ + +/** + * G_SQRT2: + * + * The square root of two. + */ + +/** + * G_LOG_2_BASE_10: + * + * Multiplying the base 2 exponent by this number yields the base 10 exponent. + */ + +/* Macros {{{1 */ + +/** + * SECTION:macros + * @title: Standard Macros + * @short_description: commonly-used macros + * + * These macros provide a few commonly-used features. + */ + +/** + * 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: + * + * This macro is defined only on BeOS. So you can bracket + * BeOS-specific code in "#ifdef G_OS_BEOS". + */ + +/** + * 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: + * + * The directory separator character. + * This is '/' on UNIX machines and '\' under Windows. + */ + +/** + * G_DIR_SEPARATOR_S: + * + * The directory separator as a string. + * This is "/" on UNIX machines and "\" under Windows. + */ + +/** + * G_IS_DIR_SEPARATOR: + * @c: a character + * + * Checks whether a character is a directory + * separator. It returns %TRUE for '/' on UNIX + * machines and for '\' or '/' under Windows. + * + * Since: 2.6 + */ + +/** + * G_SEARCHPATH_SEPARATOR: + * + * The search path separator character. + * This is ':' on UNIX machines and ';' under Windows. + */ + +/** + * G_SEARCHPATH_SEPARATOR_S: + * + * The search path separator as a string. + * This is ":" on UNIX machines and ";" under Windows. + */ + +/** + * TRUE: + * + * Defines the %TRUE value for the #gboolean type. + */ + +/** + * FALSE: + * + * Defines the %FALSE value for the #gboolean type. + */ + +/** + * NULL: + * + * Defines the standard %NULL pointer. + */ + +/** + * MIN: + * @a: a numeric value + * @b: a numeric value + * + * Calculates the minimum of @a and @b. + * + * Returns: the minimum of @a and @b. + */ + +/** + * MAX: + * @a: a numeric value + * @b: a numeric value + * + * Calculates the maximum of @a and @b. + * + * Returns: the maximum of @a and @b. + */ + +/** + * ABS: + * @a: a numeric value + * + * 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. + * + * Returns: the absolute value of @a. + */ + +/** + * CLAMP: + * @x: the value to clamp + * @low: the minimum value allowed + * @high: the maximum value allowed + * + * 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. + * + * Returns: the value of @x clamped to the range between @low and @high + */ + +/** + * G_STRUCT_MEMBER: + * @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 a member of a structure at a given offset, using the given type. + * + * Returns: the struct member + */ + +/** + * G_STRUCT_MEMBER_P: + * @struct_p: a pointer to a struct + * @struct_offset: the offset from the start of the struct, in bytes + * + * Returns an untyped pointer to a given offset of a struct. + * + * Returns: an untyped pointer to @struct_p plus @struct_offset bytes + */ + +/** + * G_STRUCT_OFFSET: + * @struct_type: a structure type, e.g. GtkWidget + * @member: a field in the structure, e.g. window + * + * Returns the offset, in bytes, of a member of a struct. + * + * Returns: the offset of @member from the start of @struct_type + */ + +/** + * 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. + * + * Deprecated: 2.30: API providers should replace all existing uses with + * const and API consumers should adjust their code + * accordingly + */ + +/** + * G_N_ELEMENTS: + * @arr: the array + * + * 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. + */ + +/* Miscellaneous Macros {{{1 */ + +/** + * SECTION:macros_misc + * @title: Miscellaneous Macros + * @short_description: specialized macros which are not used often + * + * These macros provide more specialized features which are not + * needed so often by application programmers. + */ + +/** + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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_VA_COPY: + * @ap1: the va_list variable to place a copy of @ap2 in + * @ap2: a va_list + * + * 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. + */ + +/** + * G_STRINGIFY: + * @macro_or_string: a macro or a string + * + * Accepts a macro or a string and converts it into a string after + * preprocessor argument expansion. For example, the following code: + * + * |[ + * #define AGE 27 + * const gchar *greeting = G_STRINGIFY (AGE) " today!"; + * ]| + * + * is transformed by the preprocessor into (code equivalent to): + * + * |[ + * const gchar *greeting = "27 today!"; + * ]| + */ + +/** + * G_PASTE: + * @identifier1: an identifier + * @identifier2: an identifier + * + * Yields a new preprocessor pasted identifier + * identifier1identifier2 from its expanded + * arguments @identifier1 and @identifier2. For example, + * the following code: + * |[ + * #define GET(traveller,method) G_PASTE(traveller_get_, method) (traveller) + * const gchar *name = GET (traveller, name); + * const gchar *quest = GET (traveller, quest); + * GdkColor *favourite = GET (traveller, favourite_colour); + * ]| + * + * is transformed by the preprocessor into: + * |[ + * const gchar *name = traveller_get_name (traveller); + * const gchar *quest = traveller_get_quest (traveller); + * GdkColor *favourite = traveller_get_favourite_colour (traveller); + * ]| + * + * Since: 2.20 + */ + +/** + * G_STATIC_ASSERT: + * @expr: a constant expression + * + * 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. + * + * + * A typedef is generally allowed in + * exactly the same places that a variable declaration is + * allowed. For this reason, you should not use + * G_STATIC_ASSERT in the middle of + * blocks of code. + * + * + * The macro should only be used once per source code line. + * + * Since: 2.20 + */ + +/** + * G_STATIC_ASSERT_EXPR: + * @expr: a constant expression + * + * The G_STATIC_ASSERT_EXPR macro lets the programmer check + * a condition at compile time. The condition needs to be + * compile time computable. + * + * Unlike G_STATIC_ASSERT, this macro + * evaluates to an expression and, as such, can be used in + * the middle of other expressions. Its value should be + * ignored. This can be accomplished by placing it as + * the first argument of a comma expression. + * + * |[ + * #define ADD_ONE_TO_INT(x) \ + * (G_STATIC_ASSERT_EXPR(sizeof (x) == sizeof (int)), ((x) + 1)) + * ]| + * + * Since: 2.30 + */ + +/** + * 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 + * option. + */ + +/** + * 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. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more 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. + * + */ + +/** + * 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. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + */ + +/** + * 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). + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.6 + */ + +/** + * G_GNUC_ALLOC_SIZE: + * @x: the index of the argument specifying the allocation size + * + * 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. + * + * Place the attribute after the function declaration, just before the + * semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.18 + */ + +/** + * G_GNUC_ALLOC_SIZE2: + * @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 + * + * 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. + * + * Place the attribute after the function declaration, just before the + * semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.18 + */ + +/** + * 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 + * option, the compiler will + * generate warnings when deprecated interfaces are used. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.2 + */ + +/** + * G_GNUC_DEPRECATED_FOR: + * @f: the intended replacement for the deprecated symbol, + * such as the name of a function + * + * Like %G_GNUC_DEPRECATED, but names the intended replacement for the + * deprecated symbol if the version of gcc in use is + * new enough to support custom deprecation messages. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + * + * Note that if @f is a macro, it will be expanded in the warning message. + * You can enclose it in quotes to prevent this. (The quotes will show up + * in the warning, but it's better than showing the macro expansion.) + * + * Since: 2.26 + */ + +/** + * G_GNUC_BEGIN_IGNORE_DEPRECATIONS: + * + * Tells gcc (if it is a new enough version) to + * temporarily stop emitting warnings when functions marked with + * %G_GNUC_DEPRECATED or %G_GNUC_DEPRECATED_FOR are called. This is + * useful for when you have one deprecated function calling another + * one, or when you still have regression tests for deprecated + * functions. + * + * Use %G_GNUC_END_IGNORE_DEPRECATIONS to begin warning again. (If you + * are not compiling with -Wdeprecated-declarations + * then neither macro has any effect.) + * + * This macro can be used either inside or outside of a function body, + * but must appear on a line by itself. + * + * Since: 2.32 + */ + +/** + * G_GNUC_END_IGNORE_DEPRECATIONS: + * + * Undoes the effect of %G_GNUC_BEGIN_IGNORE_DEPRECATIONS, telling + * gcc to begin outputting warnings again + * (assuming those warnings had been enabled to begin with). + * + * This macro can be used either inside or outside of a function body, + * but must appear on a line by itself. + * + * Since: 2.32 + */ + +/** + * G_DEPRECATED: + * + * This macro is similar to %G_GNUC_DEPRECATED, and can be used to mark + * functions declarations as deprecated. Unlike %G_GNUC_DEPRECATED, it is + * meant to be portable across different compilers and must be placed + * before the function declaration. + * + * Since: 2.32 + */ + +/** + * G_DEPRECATED_FOR: + * @f: the name of the function that this function was deprecated for + * + * This macro is similar to %G_GNUC_DEPRECATED_FOR, and can be used to mark + * functions declarations as deprecated. Unlike %G_GNUC_DEPRECATED_FOR, it is + * meant to be portable across different compilers and must be placed + * before the function declaration. + * + * Since: 2.32 + */ + +/** + * G_UNAVAILABLE: + * @maj: the major version that introduced the symbol + * @min: the minor version that introduced the symbol + * + * This macro can be used to mark a function declaration as unavailable. + * It must be placed before the function declaration. Use of a function + * that has been annotated with this macros will produce a compiler warning. + * + * Since: 2.32 + */ + +/** + * GLIB_DISABLE_DEPRECATION_WARNINGS: + * + * A macro that should be defined before including the glib.h header. + * If it is defined, no compiler warnings will be produced for uses + * of deprecated GLib APIs. + */ + +/** + * 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. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + */ + +/** + * G_GNUC_UNUSED: + * + * Expands to the GNU C unused function attribute if + * the compiler is gcc. It is used for declaring + * functions and arguments which may never be used. It avoids possible compiler + * warnings. + * + * For functions, place the attribute after the declaration, just before the + * semicolon. For arguments, place the attribute at the beginning of the + * argument declaration. + * + * |[ + * void my_unused_function (G_GNUC_UNUSED gint unused_argument, + * gint other_argument) G_GNUC_UNUSED; + * ]| + * + * See the GNU C documentation for more details. + */ + +/** + * G_GNUC_PRINTF: + * @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 printf(). It allows the compiler to type-check the arguments + * passed to the function. + * + * Place the attribute after the function declaration, just before the + * semicolon. + * + * See the GNU C documentation for more details. + * + * |[ + * gint g_snprintf (gchar *string, + * gulong n, + * gchar const *format, + * ...) G_GNUC_PRINTF (3, 4); + * ]| + */ + +/** + * G_GNUC_SCANF: + * @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. + */ + +/** + * G_GNUC_FORMAT: + * @arg_idx: the index of the argument + * + * 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). + * + * Place the attribute after the function declaration, just after the + * semicolon. + * + * See the GNU C documentation for more details. + * + * |[ + * gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2); + * ]| + */ + +/** + * 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. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.8 + */ + +/** + * 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. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + * + * Since: 2.10 + */ + +/** + * G_GNUC_FUNCTION: + * + * 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 + */ + +/** + * G_GNUC_PRETTY_FUNCTION: + * + * 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 + */ + +/** + * 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 option. + * + * Place the attribute after the declaration, just before the semicolon. + * + * See the GNU C documentation for more details. + */ + +/** + * 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: + * + * 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: + * @expr: the expression + * + * 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"); + * ]| + * + * Returns: the value of @expr + * + * Since: 2.2 + */ + +/** + * G_UNLIKELY: + * @expr: the expression + * + * 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"); + * ]| + * + * Returns: the value of @expr + * + * Since: 2.2 + */ + +/** + * G_STRLOC: + * + * Expands to a string identifying the current code position. + */ + +/** + * G_STRFUNC: + * + * Expands to a string identifying the current function. + * + * Since: 2.4 + */ + +/* Windows Compatibility Functions {{{1 */ + +/** + * SECTION:windows + * @title: Windows Compatibility Functions + * @short_description: 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. + */ + +/** + * MAXPATHLEN: + * + * Provided for UNIX emulation on Windows; equivalent to UNIX + * macro %MAXPATHLEN, which is the maximum length of a filename + * (including full path). + */ + +/** + * G_WIN32_DLLMAIN_FOR_DLL_NAME: + * @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 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. + */ + +/** + * G_WIN32_HAVE_WIDECHAR_API: + * + * 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 character + * 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: + * + * 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 + */ + +/* Epilogue {{{1 */ +/* vim: set foldmethod=marker: */ diff --git a/glib/galloca.h b/glib/galloca.h new file mode 100644 index 0000000..63c080f --- /dev/null +++ b/glib/galloca.h @@ -0,0 +1,110 @@ +/* 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_ALLOCA_H__ +#define __G_ALLOCA_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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 */ + +/** + * g_alloca: + * @size: number of bytes to allocate. + * + * 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. + * + * + * + * Returns: space for @size bytes, allocated on the stack + */ +#define g_alloca(size) alloca (size) +/** + * g_newa: + * @struct_type: Type of memory chunks to be allocated + * @n_structs: Number of chunks to be allocated + * + * Wraps g_alloca() in a more typesafe manner. + * + * Returns: Pointer to stack space for @n_structs chunks of type @struct_type + */ +#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..3bfbe9d --- /dev/null +++ b/glib/garray.c @@ -0,0 +1,1808 @@ +/* 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 "gbytes.h" +#include "gslice.h" +#include "gmem.h" +#include "gtestutils.h" +#include "gthread.h" +#include "gmessages.h" +#include "gqsort.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; + gint ref_count; + GDestroyNotify clear_func; +}; + +/** + * g_array_index: + * @a: a #GArray. + * @t: the type of the elements. + * @i: the index of the element to return. + * + * 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); + * + * + * + * Returns: the element of the #GArray at the index given by @i. + **/ + +#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. + * + * Creates a new #GArray with a reference count of 1. + * + * Returns: the new #GArray. + **/ +GArray* +g_array_new (gboolean zero_terminated, + gboolean clear, + guint elt_size) +{ + g_return_val_if_fail (elt_size > 0, NULL); + + return 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. + * + * 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. + * + * Returns: the new #GArray. + **/ +GArray* g_array_sized_new (gboolean zero_terminated, + gboolean clear, + guint elt_size, + guint reserved_size) +{ + GRealArray *array; + + g_return_val_if_fail (elt_size > 0, NULL); + + 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; + array->clear_func = NULL; + + if (array->zero_terminated || reserved_size != 0) + { + g_array_maybe_expand (array, reserved_size); + g_array_zero_terminate(array); + } + + return (GArray*) array; +} + +/** + * g_array_set_clear_func: + * @array: A #GArray + * @clear_func: a function to clear an element of @array + * + * Sets a function to clear an element of @array. + * + * The @clear_func will be called when an element in the array + * data segment is removed and when the array is freed and data + * segment is deallocated as well. + * + * Note that in contrast with other uses of #GDestroyNotify + * functions, @clear_func is expected to clear the contents of + * the array element it is given, but not free the element itself. + * + * Since: 2.32 + */ +void +g_array_set_clear_func (GArray *array, + GDestroyNotify clear_func) +{ + GRealArray *rarray = (GRealArray *) array; + + g_return_if_fail (array != NULL); + + rarray->clear_func = clear_func; +} + +/** + * 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_atomic_int_inc (&rarray->ref_count); + + return array; +} + +typedef enum +{ + FREE_SEGMENT = 1 << 0, + PRESERVE_WRAPPER = 1 << 1 +} ArrayFreeFlags; + +static gchar *array_free (GRealArray *, ArrayFreeFlags); + +/** + * 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); + + if (g_atomic_int_dec_and_test (&rarray->ref_count)) + array_free (rarray, FREE_SEGMENT); +} + +/** + * 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. + * + * 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. + * + * Returns: the element data if @free_segment is %FALSE, otherwise + * %NULL. The element data should be freed using g_free(). + **/ +gchar* +g_array_free (GArray *farray, + gboolean free_segment) +{ + GRealArray *array = (GRealArray*) farray; + ArrayFreeFlags flags; + + g_return_val_if_fail (array, NULL); + + flags = (free_segment ? FREE_SEGMENT : 0); + + /* if others are holding a reference, preserve the wrapper but do free/return the data */ + if (!g_atomic_int_dec_and_test (&array->ref_count)) + flags |= PRESERVE_WRAPPER; + + return array_free (array, flags); +} + +static gchar * +array_free (GRealArray *array, + ArrayFreeFlags flags) +{ + gchar *segment; + + if (flags & FREE_SEGMENT) + { + if (array->clear_func != NULL) + { + guint i; + + for (i = 0; i < array->len; i++) + array->clear_func (g_array_elt_pos (array, i)); + } + + g_free (array->data); + segment = NULL; + } + else + segment = (gchar*) array->data; + + if (flags & 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. + * + * Adds @len elements onto the end of the array. + * + * Returns: the #GArray. + **/ +/** + * g_array_append_val: + * @a: a #GArray. + * @v: the value to append to 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. + * + * Returns: the #GArray. + **/ +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. + * + * 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. + * + * Returns: the #GArray. + **/ +/** + * g_array_prepend_val: + * @a: a #GArray. + * @v: the value to prepend to 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. + * + * Returns: the #GArray. + **/ +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. + * + * Inserts @len elements into a #GArray at the given index. + * + * Returns: the #GArray. + **/ +/** + * g_array_insert_val: + * @a: a #GArray. + * @i: the index to place the element at. + * @v: the value to insert into the array. + * + * 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. + * + * Returns: the #GArray. + **/ +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. + * + * 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. + * + * Returns: the #GArray. + **/ +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 (length < array->len) + g_array_remove_range (farray, 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. + * + * Removes the element at the given index from a #GArray. The following + * elements are moved down one place. + * + * Returns: the #GArray. + **/ +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 (array->clear_func != NULL) + array->clear_func (g_array_elt_pos (array, index_)); + + 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. + * + * 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(). + * + * Returns: the #GArray. + **/ +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 (array->clear_func != NULL) + array->clear_func (g_array_elt_pos (array, index_)); + + 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. + * + * Removes the given number of elements starting at the given index + * from a #GArray. The following elements are moved to close the gap. + * + * Returns: the #GArray. + * + * 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 (array->clear_func != NULL) + { + guint i; + + for (i = 0; i < length; i++) + array->clear_func (g_array_elt_pos (array, index_ + i)); + } + + 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). + * + * This is guaranteed to be a stable sort since version 2.32. + **/ +void +g_array_sort (GArray *farray, + GCompareFunc compare_func) +{ + GRealArray *array = (GRealArray*) farray; + + g_return_if_fail (array != NULL); + + /* Don't use qsort as we want a guaranteed stable sort */ + g_qsort_with_data (array->data, + array->len, + array->elt_size, + (GCompareDataFunc)compare_func, + NULL); +} + +/** + * 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. + * + * This is guaranteed to be a stable sort since version 2.32. + * + * There used to be a comment here about making the sort stable by + * using the addresses of the elements in the comparison function. + * This did not actually work, so any such code should be removed. + **/ +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; + } +} + +/** + * 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; + 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 of the pointer array. + * + * Returns: the pointer at the given index. + **/ + +static void g_ptr_array_maybe_expand (GRealPtrArray *array, + gint len); + +/** + * g_ptr_array_new: + * + * Creates a new #GPtrArray with a reference count of 1. + * + * Returns: the new #GPtrArray. + **/ +GPtrArray* +g_ptr_array_new (void) +{ + return g_ptr_array_sized_new (0); +} + +/** + * g_ptr_array_sized_new: + * @reserved_size: number of pointers preallocated. + * + * 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. + * + * Returns: the new #GPtrArray. + **/ +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: (allow-none): 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_new_full: + * @reserved_size: number of pointers preallocated. + * @element_free_func: (allow-none): A function to free elements with destroy @array or %NULL. + * + * 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. It also set @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.30 + **/ +GPtrArray * +g_ptr_array_new_full (guint reserved_size, + GDestroyNotify element_free_func) +{ + GPtrArray *array; + + array = g_ptr_array_sized_new (reserved_size); + g_ptr_array_set_free_func (array, element_free_func); + return array; +} + +/** + * g_ptr_array_set_free_func: + * @array: A #GPtrArray. + * @element_free_func: (allow-none): 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 #GPtrArray + * + * Atomically increments the reference count of @array by one. + * This function is thread-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_atomic_int_inc (&rarray->ref_count); + + return array; +} + +static gpointer *ptr_array_free (GPtrArray *, ArrayFreeFlags); + +/** + * 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); + + if (g_atomic_int_dec_and_test (&rarray->ref_count)) + ptr_array_free (array, FREE_SEGMENT); +} + +/** + * g_ptr_array_free: + * @array: a #GPtrArray. + * @free_seg: if %TRUE the actual pointer array is freed as well. + * + * 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. + * + * Returns: the pointer array if @free_seg is %FALSE, otherwise %NULL. + * The pointer array should be freed using g_free(). + **/ +gpointer* +g_ptr_array_free (GPtrArray *farray, + gboolean free_segment) +{ + GRealPtrArray *array = (GRealPtrArray*) farray; + ArrayFreeFlags flags; + + g_return_val_if_fail (array, NULL); + + flags = (free_segment ? FREE_SEGMENT : 0); + + /* if others are holding a reference, preserve the wrapper but do free/return the data */ + if (!g_atomic_int_dec_and_test (&array->ref_count)) + flags |= PRESERVE_WRAPPER; + + return ptr_array_free (farray, flags); +} + +static gpointer * +ptr_array_free (GPtrArray *farray, + ArrayFreeFlags flags) +{ + GRealPtrArray *array = (GRealPtrArray*) farray; + gpointer *segment; + + if (flags & 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 (flags & 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. + * + * 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. + * + * Returns: the pointer which was removed. + **/ +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. + * + * 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. + * + * Returns: the pointer which was removed. + **/ +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 (array->element_free_func != NULL) + array->element_free_func (array->pdata[index_]); + + if (index_ != array->len - 1) + 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. + * + * 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. + * + * Returns: %TRUE if the pointer is removed. %FALSE if the pointer is + * not found in the array. + **/ +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. + * + * 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. + * + * Returns: %TRUE if the pointer was found in the array. + **/ +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). + * + * 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. + * + * This is guaranteed to be a stable sort since version 2.32. + **/ +void +g_ptr_array_sort (GPtrArray *array, + GCompareFunc compare_func) +{ + g_return_if_fail (array != NULL); + + /* Don't use qsort as we want a guaranteed stable sort */ + g_qsort_with_data (array->pdata, + array->len, + sizeof (gpointer), + (GCompareDataFunc)compare_func, + NULL); +} + +/** + * 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. + * + * This is guaranteed to be a stable sort since version 2.32. + **/ +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); +} + +/** + * SECTION:arrays_byte + * @title: Byte Arrays + * @short_description: arrays of bytes + * + * #GByteArray is a mutable array of bytes 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); + * + * + * + * See #GBytes if you are interested in an immutable object representing a + * sequence of bytes. + **/ + +/** + * 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: + * + * Creates a new #GByteArray with a reference count of 1. + * + * Returns: (transfer full): the new #GByteArray. + **/ +GByteArray* g_byte_array_new (void) +{ + return (GByteArray*) g_array_sized_new (FALSE, FALSE, 1, 0); +} + +/** + * g_byte_array_new_take: + * @data: (transfer full) (array length=len): byte data for the array + * @len: length of @data + * + * Create byte array containing the data. The data will be owned by the array + * and will be freed with g_free(), i.e. it could be allocated using g_strdup(). + * + * Since: 2.32 + * + * Returns: (transfer full): a new #GByteArray + */ +GByteArray * +g_byte_array_new_take (guint8 *data, + gsize len) +{ + GByteArray *array; + GRealArray *real; + + array = g_byte_array_new (); + real = (GRealArray *)array; + g_assert (real->data == NULL); + g_assert (real->len == 0); + + real->data = data; + real->len = len; + + return array; +} + +/** + * g_byte_array_sized_new: + * @reserved_size: number of bytes preallocated. + * + * 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. + * + * Returns: the new #GByteArray. + **/ +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. + * + * 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. + * + * Returns: the element data if @free_segment is %FALSE, otherwise + * %NULL. The element data should be freed using g_free(). + **/ +guint8* g_byte_array_free (GByteArray *array, + gboolean free_segment) +{ + return (guint8*) g_array_free ((GArray*) array, free_segment); +} + +/** + * g_byte_array_free_to_bytes: + * @array: (transfer full): a #GByteArray + * + * Transfers the data from the #GByteArray into a new immutable #GBytes. + * + * The #GByteArray is freed unless the reference count of @array is greater + * than one, the #GByteArray wrapper is preserved but the size of @array + * will be set to zero. + * + * This is identical to using g_bytes_new_take() and g_byte_array_free() + * together. + * + * Since: 2.32 + * + * Returns: (transfer full): a new immutable #GBytes representing same byte + * data that was in the array + */ +GBytes * +g_byte_array_free_to_bytes (GByteArray *array) +{ + gsize length; + + g_return_val_if_fail (array != NULL, NULL); + + length = array->len; + return g_bytes_new_take (g_byte_array_free (array, FALSE), length); +} + +/** + * 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. + * + * Adds the given bytes to the end of the #GByteArray. The array will + * grow in size automatically if necessary. + * + * Returns: the #GByteArray. + **/ +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. + * + * Adds the given data to the start of the #GByteArray. The array will + * grow in size automatically if necessary. + * + * Returns: the #GByteArray. + **/ +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. + * + * Sets the size of the #GByteArray, expanding it if necessary. + * + * Returns: the #GByteArray. + **/ +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. + * + * Removes the byte at the given index from a #GByteArray. The + * following bytes are moved down one place. + * + * Returns: the #GByteArray. + **/ +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. + * + * 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(). + * + * Returns: the #GByteArray. + **/ +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. + * + * Removes the given number of bytes starting at the given index from a + * #GByteArray. The following elements are moved to close the gap. + * + * Returns: the #GByteArray. + * + * 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. If you want equal elements to keep their order (i.e. + * you want a stable sort) you can write a comparison function that, + * if two elements would otherwise compare equal, compares them by + * their addresses. + **/ +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); +} diff --git a/glib/garray.h b/glib/garray.h new file mode 100644 index 0000000..f3d7cee --- /dev/null +++ b/glib/garray.h @@ -0,0 +1,236 @@ +/* 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_ARRAY_H__ +#define __G_ARRAY_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GBytes GBytes; +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)]) + +GLIB_AVAILABLE_IN_ALL +GArray* g_array_new (gboolean zero_terminated, + gboolean clear_, + guint element_size); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_sized_new (gboolean zero_terminated, + gboolean clear_, + guint element_size, + guint reserved_size); +GLIB_AVAILABLE_IN_ALL +gchar* g_array_free (GArray *array, + gboolean free_segment); +GLIB_AVAILABLE_IN_ALL +GArray *g_array_ref (GArray *array); +GLIB_AVAILABLE_IN_ALL +void g_array_unref (GArray *array); +GLIB_AVAILABLE_IN_ALL +guint g_array_get_element_size (GArray *array); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_append_vals (GArray *array, + gconstpointer data, + guint len); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_prepend_vals (GArray *array, + gconstpointer data, + guint len); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_insert_vals (GArray *array, + guint index_, + gconstpointer data, + guint len); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_set_size (GArray *array, + guint length); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_remove_index (GArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_remove_index_fast (GArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +GArray* g_array_remove_range (GArray *array, + guint index_, + guint length); +GLIB_AVAILABLE_IN_ALL +void g_array_sort (GArray *array, + GCompareFunc compare_func); +GLIB_AVAILABLE_IN_ALL +void g_array_sort_with_data (GArray *array, + GCompareDataFunc compare_func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +void g_array_set_clear_func (GArray *array, + GDestroyNotify clear_func); + +/* 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_] +GLIB_AVAILABLE_IN_ALL +GPtrArray* g_ptr_array_new (void); +GLIB_AVAILABLE_IN_ALL +GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func); +GLIB_AVAILABLE_IN_ALL +GPtrArray* g_ptr_array_sized_new (guint reserved_size); +GLIB_AVAILABLE_IN_ALL +GPtrArray* g_ptr_array_new_full (guint reserved_size, + GDestroyNotify element_free_func); +GLIB_AVAILABLE_IN_ALL +gpointer* g_ptr_array_free (GPtrArray *array, + gboolean free_seg); +GLIB_AVAILABLE_IN_ALL +GPtrArray* g_ptr_array_ref (GPtrArray *array); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_unref (GPtrArray *array); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_set_free_func (GPtrArray *array, + GDestroyNotify element_free_func); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_set_size (GPtrArray *array, + gint length); +GLIB_AVAILABLE_IN_ALL +gpointer g_ptr_array_remove_index (GPtrArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +gpointer g_ptr_array_remove_index_fast (GPtrArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +gboolean g_ptr_array_remove (GPtrArray *array, + gpointer data); +GLIB_AVAILABLE_IN_ALL +gboolean g_ptr_array_remove_fast (GPtrArray *array, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_remove_range (GPtrArray *array, + guint index_, + guint length); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_add (GPtrArray *array, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_sort (GPtrArray *array, + GCompareFunc compare_func); +GLIB_AVAILABLE_IN_ALL +void g_ptr_array_sort_with_data (GPtrArray *array, + GCompareDataFunc compare_func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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. + */ + +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_new (void); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_new_take (guint8 *data, + gsize len); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_sized_new (guint reserved_size); +GLIB_AVAILABLE_IN_ALL +guint8* g_byte_array_free (GByteArray *array, + gboolean free_segment); +GLIB_AVAILABLE_IN_ALL +GBytes* g_byte_array_free_to_bytes (GByteArray *array); +GLIB_AVAILABLE_IN_ALL +GByteArray *g_byte_array_ref (GByteArray *array); +GLIB_AVAILABLE_IN_ALL +void g_byte_array_unref (GByteArray *array); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_append (GByteArray *array, + const guint8 *data, + guint len); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_prepend (GByteArray *array, + const guint8 *data, + guint len); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_set_size (GByteArray *array, + guint length); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_remove_index (GByteArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_remove_index_fast (GByteArray *array, + guint index_); +GLIB_AVAILABLE_IN_ALL +GByteArray* g_byte_array_remove_range (GByteArray *array, + guint index_, + guint length); +GLIB_AVAILABLE_IN_ALL +void g_byte_array_sort (GByteArray *array, + GCompareFunc compare_func); +GLIB_AVAILABLE_IN_ALL +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..075266f --- /dev/null +++ b/glib/gasyncqueue.c @@ -0,0 +1,802 @@ +/* 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 "gasyncqueue.h" +#include "gasyncqueueprivate.h" + +#include "gmain.h" +#include "gmem.h" +#include "gqueue.h" +#include "gtestutils.h" +#include "gtimer.h" +#include "gthread.h" +#include "deprecated/gthread.h" + + +/** + * SECTION:async_queues + * @title: Asynchronous Queues + * @short_description: asynchronous communication between threads + * @see_also: #GThreadPool + * + * 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(). #GAsyncQueue structs are reference counted, + * use g_async_queue_ref() and g_async_queue_unref() to manage your + * references. + * + * 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_timeout_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 _unlocked suffix). + * + * In many cases, it may be more convenient to use #GThreadPool when + * you need to distribute work to a set of worker threads instead of + * using #GAsyncQueue manually. #GThreadPool uses a GAsyncQueue + * internally. + */ + +/** + * 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. + */ +struct _GAsyncQueue +{ + GMutex mutex; + GCond cond; + GQueue queue; + GDestroyNotify item_free_func; + guint waiting_threads; + gint ref_count; +}; + +typedef struct +{ + GCompareDataFunc func; + gpointer user_data; +} SortData; + +/** + * g_async_queue_new: + * + * Creates a new asynchronous queue. + * + * Return value: a new #GAsyncQueue. Free with g_async_queue_unref() + */ +GAsyncQueue * +g_async_queue_new (void) +{ + return g_async_queue_new_full (NULL); +} + +/** + * g_async_queue_new_full: + * @item_free_func: function to free queue elements + * + * Creates a new asynchronous queue 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: a new #GAsyncQueue. Free with g_async_queue_unref() + * + * Since: 2.16 + */ +GAsyncQueue * +g_async_queue_new_full (GDestroyNotify item_free_func) +{ + GAsyncQueue *queue; + + queue = g_new (GAsyncQueue, 1); + g_mutex_init (&queue->mutex); + g_cond_init (&queue->cond); + g_queue_init (&queue->queue); + queue->waiting_threads = 0; + queue->ref_count = 1; + queue->item_free_func = item_free_func; + + return 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_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: 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_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: 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_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); + + if (g_atomic_int_dec_and_test (&queue->ref_count)) + { + g_return_if_fail (queue->waiting_threads == 0); + g_mutex_clear (&queue->mutex); + g_cond_clear (&queue->cond); + if (queue->item_free_func) + g_queue_foreach (&queue->queue, (GFunc) queue->item_free_func, NULL); + g_queue_clear (&queue->queue); + g_free (queue); + } +} + +/** + * g_async_queue_lock: + * @queue: a #GAsyncQueue + * + * Acquires the @queue's lock. If another thread is already + * holding the lock, this call will block until the lock + * becomes available. + * + * Call g_async_queue_unlock() to drop the lock again. + * + * While holding the lock, you can only call the + * g_async_queue_*_unlocked() functions + * on @queue. Otherwise, deadlock may occur. + */ +void +g_async_queue_lock (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + + g_mutex_lock (&queue->mutex); +} + +/** + * g_async_queue_unlock: + * @queue: a #GAsyncQueue + * + * Releases the queue's lock. + * + * Calling this function when you have not acquired + * the with g_async_queue_lock() leads to undefined + * behaviour. + */ +void +g_async_queue_unlock (GAsyncQueue *queue) +{ + g_return_if_fail (queue); + + 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 (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 (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 + * @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, see g_async_queue_sort(). + * + * 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 + * @user_data: user data passed to @func. + * + * Inserts @data into @queue using @func to determine the new + * position. + * + * The sort function @func is passed two elements of the @queue. + * It 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. + * + * This function requires that the @queue is sorted before pushing on + * new elements, see g_async_queue_sort(). + * + * This function must be 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 wait, + gint64 end_time) +{ + gpointer retval; + + if (!g_queue_peek_tail_link (&queue->queue) && wait) + { + queue->waiting_threads++; + while (!g_queue_peek_tail_link (&queue->queue)) + { + if (end_time == -1) + g_cond_wait (&queue->cond, &queue->mutex); + else + { + if (!g_cond_wait_until (&queue->cond, &queue->mutex, end_time)) + break; + } + } + queue->waiting_threads--; + } + + retval = g_queue_pop_tail (&queue->queue); + + g_assert (retval || !wait || end_time > 0); + + return retval; +} + +/** + * g_async_queue_pop: + * @queue: a #GAsyncQueue + * + * Pops data from the @queue. If @queue is empty, this function + * blocks until data becomes available. + * + * Return value: data from the queue + */ +gpointer +g_async_queue_pop (GAsyncQueue *queue) +{ + gpointer retval; + + g_return_val_if_fail (queue, NULL); + + g_mutex_lock (&queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, TRUE, -1); + g_mutex_unlock (&queue->mutex); + + return retval; +} + +/** + * g_async_queue_pop_unlocked: + * @queue: a #GAsyncQueue + * + * Pops data from the @queue. If @queue is empty, this function + * blocks until data becomes 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); + + return g_async_queue_pop_intern_unlocked (queue, TRUE, -1); +} + +/** + * 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_mutex_lock (&queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, FALSE, -1); + 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); + + return g_async_queue_pop_intern_unlocked (queue, FALSE, -1); +} + +/** + * g_async_queue_timeout_pop: + * @queue: a #GAsyncQueue + * @timeout: the number of microseconds to wait + * + * Pops data from the @queue. If the queue is empty, blocks for + * @timeout microseconds, or until data becomes available. + * + * If no data is received before the timeout, %NULL is returned. + * + * Return value: data from the queue or %NULL, when no data is + * received before the timeout. + */ +gpointer +g_async_queue_timeout_pop (GAsyncQueue *queue, + guint64 timeout) +{ + gint64 end_time = g_get_monotonic_time () + timeout; + gpointer retval; + + g_mutex_lock (&queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, TRUE, end_time); + g_mutex_unlock (&queue->mutex); + + return retval; +} + +/** + * g_async_queue_timeout_pop_unlocked: + * @queue: a #GAsyncQueue + * @timeout: the number of microseconds to wait + * + * Pops data from the @queue. If the queue is empty, blocks for + * @timeout microseconds, or until data becomes available. + * + * If no data is received before the timeout, %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 + * received before the timeout. + */ +gpointer +g_async_queue_timeout_pop_unlocked (GAsyncQueue *queue, + guint64 timeout) +{ + gint64 end_time = g_get_monotonic_time () + timeout; + + return g_async_queue_pop_intern_unlocked (queue, TRUE, end_time); +} + +/** + * g_async_queue_timed_pop: + * @queue: a #GAsyncQueue + * @end_time: a #GTimeVal, determining the final time + * + * Pops data from the @queue. If the queue is empty, blocks until + * @end_time or until data becomes available. + * + * 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. + * + * Deprecated: use g_async_queue_timeout_pop(). + */ +gpointer +g_async_queue_timed_pop (GAsyncQueue *queue, + GTimeVal *end_time) +{ + gint64 m_end_time; + gpointer retval; + + g_return_val_if_fail (queue, NULL); + + if (end_time != NULL) + { + m_end_time = g_get_monotonic_time () + + ((gint64)end_time->tv_sec * G_USEC_PER_SEC + end_time->tv_usec - + g_get_real_time ()); + } + else + m_end_time = -1; + + g_mutex_lock (&queue->mutex); + retval = g_async_queue_pop_intern_unlocked (queue, TRUE, m_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 the queue is empty, blocks until + * @end_time or until data becomes available. + * + * 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. + * + * This function must be called while holding the @queue's lock. + * + * Return value: data from the queue or %NULL, when no data is + * received before @end_time. + * + * Deprecated: use g_async_queue_timeout_pop_unlocked(). + */ +gpointer +g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, + GTimeVal *end_time) +{ + gint64 m_end_time; + + g_return_val_if_fail (queue, NULL); + + if (end_time != NULL) + { + m_end_time = g_get_monotonic_time () + + (end_time->tv_sec * G_USEC_PER_SEC + end_time->tv_usec - + g_get_real_time ()); + } + else + m_end_time = -1; + + return g_async_queue_pop_intern_unlocked (queue, TRUE, m_end_time); +} + +/** + * g_async_queue_length: + * @queue: a #GAsyncQueue. + * + * Returns the length of the queue. + * + * Actually this function returns the number of data items in + * the queue minus the number of waiting threads, so a negative + * value means waiting threads, and a positive value means available + * entries in the @queue. A return value of 0 could mean n entries + * in the queue and n threads waiting. This 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_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. + * + * Actually this function returns the number of data items in + * the queue minus the number of waiting threads, so a negative + * value means waiting threads, and a positive value means available + * entries in the @queue. A return value of 0 could mean n entries + * in the queue and n threads waiting. This 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); + + return queue->queue.length - queue->waiting_threads; +} + +/** + * g_async_queue_sort: + * @queue: a #GAsyncQueue + * @func: the #GCompareDataFunc is used to sort @queue + * @user_data: user data passed to @func + * + * Sorts @queue using @func. + * + * The sort function @func is passed two elements of the @queue. + * It 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. + * + * 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 + * @user_data: user data passed to @func + * + * Sorts @queue using @func. + * + * The sort function @func is passed two elements of the @queue. + * It 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. + * + * This function must be 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); + + return &queue->mutex; +} diff --git a/glib/gasyncqueue.h b/glib/gasyncqueue.h new file mode 100644 index 0000000..3d4b38f --- /dev/null +++ b/glib/gasyncqueue.h @@ -0,0 +1,111 @@ +/* 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_ASYNCQUEUE_H__ +#define __G_ASYNCQUEUE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GAsyncQueue GAsyncQueue; + +GLIB_AVAILABLE_IN_ALL +GAsyncQueue *g_async_queue_new (void); +GLIB_AVAILABLE_IN_ALL +GAsyncQueue *g_async_queue_new_full (GDestroyNotify item_free_func); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_lock (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_unlock (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +GAsyncQueue *g_async_queue_ref (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_unref (GAsyncQueue *queue); + +GLIB_DEPRECATED_FOR(g_async_queue_ref) +void g_async_queue_ref_unlocked (GAsyncQueue *queue); + +GLIB_DEPRECATED_FOR(g_async_queue_unref) +void g_async_queue_unref_and_unlock (GAsyncQueue *queue); + +GLIB_AVAILABLE_IN_ALL +void g_async_queue_push (GAsyncQueue *queue, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_push_unlocked (GAsyncQueue *queue, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_push_sorted (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_push_sorted_unlocked (GAsyncQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_pop (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_pop_unlocked (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_try_pop (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_try_pop_unlocked (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_timeout_pop (GAsyncQueue *queue, + guint64 timeout); +GLIB_AVAILABLE_IN_ALL +gpointer g_async_queue_timeout_pop_unlocked (GAsyncQueue *queue, + guint64 timeout); +GLIB_AVAILABLE_IN_ALL +gint g_async_queue_length (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +gint g_async_queue_length_unlocked (GAsyncQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_sort (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +void g_async_queue_sort_unlocked (GAsyncQueue *queue, + GCompareDataFunc func, + gpointer user_data); + +GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop) +gpointer g_async_queue_timed_pop (GAsyncQueue *queue, + GTimeVal *end_time); +GLIB_DEPRECATED_FOR(g_async_queue_timeout_pop_unlocked) +gpointer g_async_queue_timed_pop_unlocked (GAsyncQueue *queue, + GTimeVal *end_time); + +G_END_DECLS + +#endif /* __G_ASYNCQUEUE_H__ */ diff --git a/glib/gasyncqueueprivate.h b/glib/gasyncqueueprivate.h new file mode 100644 index 0000000..3ecb29a --- /dev/null +++ b/glib/gasyncqueueprivate.h @@ -0,0 +1,31 @@ +/* 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. + */ + +#ifndef __G_ASYNCQUEUEPRIVATE_H__ +#define __G_ASYNCQUEUEPRIVATE_H__ + +#include "gasyncqueue.h" + +G_BEGIN_DECLS + +GMutex *_g_async_queue_get_mutex (GAsyncQueue *queue); + +G_END_DECLS + +#endif /* __G_ASYNCQUEUEPRIVATE_H__ */ diff --git a/glib/gatomic.c b/glib/gatomic.c new file mode 100644 index 0000000..2fc4f4a --- /dev/null +++ b/glib/gatomic.c @@ -0,0 +1,871 @@ +/* + * Copyright © 2011 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 + * 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 "gatomic.h" + +/** + * SECTION:atomic_operations + * @title: Atomic Operations + * @short_description: basic atomic integer and pointer operations + * @see_also: #GMutex + * + * The following is a collection of compiler macros to provide atomic + * access to integer and pointer-sized values. + * + * The macros that have 'int' in the name will operate on pointers to + * #gint and #guint. The macros with 'pointer' in the name will operate + * on pointers to any pointer-sized value, including #gsize. There is + * no support for 64bit operations on platforms with 32bit pointers + * because it is not generally possible to perform these operations + * atomically. + * + * The get, set and exchange operations for integers and pointers + * nominally operate on #gint and #gpointer, respectively. Of the + * arithmetic operations, the 'add' operation operates on (and returns) + * signed integer values (#gint and #gssize) and the 'and', 'or', and + * 'xor' operations operate on (and return) unsigned integer values + * (#guint and #gsize). + * + * All of the operations act as a full compiler and (where appropriate) + * hardware memory barrier. Acquire and release or producer and + * consumer barrier semantics are not available through this API. + * + * It is very important that all accesses to a particular integer or + * pointer be performed using only this API and that different sizes of + * operation are not mixed or used on overlapping memory regions. Never + * read or assign directly from or to a value -- always use this API. + * + * For simple reference counting purposes you should use + * g_atomic_int_inc() and g_atomic_int_dec_and_test(). Other uses that + * fall outside of simple reference counting patterns are prone to + * subtle bugs and occasionally undefined behaviour. It is also worth + * noting that since all of these operations require global + * synchronisation of the entire machine, they can be quite slow. In + * the case of performing multiple atomic operations it can often be + * faster to simply acquire a mutex lock around the critical area, + * perform the operations normally and then release the lock. + **/ + +/** + * G_ATOMIC_LOCK_FREE: + * + * This macro is defined if the atomic operations of GLib are + * implemented using real hardware atomic operations. This means that + * the GLib atomic API can be used between processes and safely mixed + * with other (hardware) atomic APIs. + * + * If this macro is not defined, the atomic operations may be + * emulated using a mutex. In that case, the GLib atomic operations are + * only atomic relative to themselves and within a single process. + **/ + +/* NOTE CAREFULLY: + * + * This file is the lowest-level part of GLib. + * + * Other lowlevel parts of GLib (threads, slice allocator, g_malloc, + * messages, etc) call into these functions and macros to get work done. + * + * As such, these functions can not call back into any part of GLib + * without risking recursion. + */ + +#ifdef G_ATOMIC_LOCK_FREE + +/* if G_ATOMIC_LOCK_FREE was defined by ./configure then we MUST + * implement the atomic operations in a lock-free manner. + */ + +#if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) +/** + * g_atomic_int_get: + * @atomic: a pointer to a #gint or #guint + * + * Gets the current value of @atomic. + * + * This call acts as a full compiler and hardware + * memory barrier (before the get). + * + * Returns: the value of the integer + * + * Since: 2.4 + **/ +gint +(g_atomic_int_get) (const volatile gint *atomic) +{ + return g_atomic_int_get (atomic); +} + +/** + * g_atomic_int_set: + * @atomic: a pointer to a #gint or #guint + * @newval: a new value to store + * + * Sets the value of @atomic to @newval. + * + * This call acts as a full compiler and hardware + * memory barrier (after the set). + * + * Since: 2.4 + */ +void +(g_atomic_int_set) (volatile gint *atomic, + gint newval) +{ + g_atomic_int_set (atomic, newval); +} + +/** + * g_atomic_int_inc: + * @atomic: a pointer to a #gint or #guint + * + * Increments the value of @atomic by 1. + * + * Think of this operation as an atomic version of + * { *@atomic += 1; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Since: 2.4 + **/ +void +(g_atomic_int_inc) (volatile gint *atomic) +{ + g_atomic_int_inc (atomic); +} + +/** + * g_atomic_int_dec_and_test: + * @atomic: a pointer to a #gint or #guint + * + * Decrements the value of @atomic by 1. + * + * Think of this operation as an atomic version of + * { *@atomic -= 1; return (*@atomic == 0); } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: %TRUE if the resultant value is zero + * + * Since: 2.4 + **/ +gboolean +(g_atomic_int_dec_and_test) (volatile gint *atomic) +{ + return g_atomic_int_dec_and_test (atomic); +} + +/** + * g_atomic_int_compare_and_exchange: + * @atomic: a pointer to a #gint or #guint + * @oldval: the value to compare with + * @newval: the value to conditionally replace with + * + * Compares @atomic to @oldval and, if equal, sets it to @newval. + * If @atomic was not equal to @oldval then no change occurs. + * + * This compare and exchange is done atomically. + * + * Think of this operation as an atomic version of + * { if (*@atomic == @oldval) { *@atomic = @newval; return TRUE; } else return FALSE; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: %TRUE if the exchange took place + * + * Since: 2.4 + **/ +gboolean +(g_atomic_int_compare_and_exchange) (volatile gint *atomic, + gint oldval, + gint newval) +{ + return g_atomic_int_compare_and_exchange (atomic, oldval, newval); +} + +/** + * g_atomic_int_add: + * @atomic: a pointer to a #gint or #guint + * @val: the value to add + * + * Atomically adds @val to the value of @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic += @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Before version 2.30, this function did not return a value + * (but g_atomic_int_exchange_and_add() did, and had the same meaning). + * + * Returns: the value of @atomic before the add, signed + * + * Since: 2.4 + **/ +gint +(g_atomic_int_add) (volatile gint *atomic, + gint val) +{ + return g_atomic_int_add (atomic, val); +} + +/** + * g_atomic_int_and: + * @atomic: a pointer to a #gint or #guint + * @val: the value to 'and' + * + * Performs an atomic bitwise 'and' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * This call acts as a full compiler and hardware memory barrier. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic &= @val; return tmp; } + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +guint +(g_atomic_int_and) (volatile guint *atomic, + guint val) +{ + return g_atomic_int_and (atomic, val); +} + +/** + * g_atomic_int_or: + * @atomic: a pointer to a #gint or #guint + * @val: the value to 'or' + * + * Performs an atomic bitwise 'or' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic |= @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +guint +(g_atomic_int_or) (volatile guint *atomic, + guint val) +{ + return g_atomic_int_or (atomic, val); +} + +/** + * g_atomic_int_xor: + * @atomic: a pointer to a #gint or #guint + * @val: the value to 'xor' + * + * Performs an atomic bitwise 'xor' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic ^= @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +guint +(g_atomic_int_xor) (volatile guint *atomic, + guint val) +{ + return g_atomic_int_xor (atomic, val); +} + + +/** + * g_atomic_pointer_get: + * @atomic: a pointer to a #gpointer-sized value + * + * Gets the current value of @atomic. + * + * This call acts as a full compiler and hardware + * memory barrier (before the get). + * + * Returns: the value of the pointer + * + * Since: 2.4 + **/ +gpointer +(g_atomic_pointer_get) (const volatile void *atomic) +{ + return g_atomic_pointer_get ((const volatile gpointer *) atomic); +} + +/** + * g_atomic_pointer_set: + * @atomic: a pointer to a #gpointer-sized value + * @newval: a new value to store + * + * Sets the value of @atomic to @newval. + * + * This call acts as a full compiler and hardware + * memory barrier (after the set). + * + * Since: 2.4 + **/ +void +(g_atomic_pointer_set) (volatile void *atomic, + gpointer newval) +{ + g_atomic_pointer_set ((volatile gpointer *) atomic, newval); +} + +/** + * g_atomic_pointer_compare_and_exchange: + * @atomic: a pointer to a #gpointer-sized value + * @oldval: the value to compare with + * @newval: the value to conditionally replace with + * + * Compares @atomic to @oldval and, if equal, sets it to @newval. + * If @atomic was not equal to @oldval then no change occurs. + * + * This compare and exchange is done atomically. + * + * Think of this operation as an atomic version of + * { if (*@atomic == @oldval) { *@atomic = @newval; return TRUE; } else return FALSE; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: %TRUE if the exchange took place + * + * Since: 2.4 + **/ +gboolean +(g_atomic_pointer_compare_and_exchange) (volatile void *atomic, + gpointer oldval, + gpointer newval) +{ + return g_atomic_pointer_compare_and_exchange ((volatile gpointer *) atomic, + oldval, newval); +} + +/** + * g_atomic_pointer_add: + * @atomic: a pointer to a #gpointer-sized value + * @val: the value to add + * + * Atomically adds @val to the value of @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic += @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the add, signed + * + * Since: 2.30 + **/ +gssize +(g_atomic_pointer_add) (volatile void *atomic, + gssize val) +{ + return g_atomic_pointer_add ((volatile gpointer *) atomic, val); +} + +/** + * g_atomic_pointer_and: + * @atomic: a pointer to a #gpointer-sized value + * @val: the value to 'and' + * + * Performs an atomic bitwise 'and' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic &= @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +gsize +(g_atomic_pointer_and) (volatile void *atomic, + gsize val) +{ + return g_atomic_pointer_and ((volatile gpointer *) atomic, val); +} + +/** + * g_atomic_pointer_or: + * @atomic: a pointer to a #gpointer-sized value + * @val: the value to 'or' + * + * Performs an atomic bitwise 'or' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic |= @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +gsize +(g_atomic_pointer_or) (volatile void *atomic, + gsize val) +{ + return g_atomic_pointer_or ((volatile gpointer *) atomic, val); +} + +/** + * g_atomic_pointer_xor: + * @atomic: a pointer to a #gpointer-sized value + * @val: the value to 'xor' + * + * Performs an atomic bitwise 'xor' of the value of @atomic and @val, + * storing the result back in @atomic. + * + * Think of this operation as an atomic version of + * { tmp = *atomic; *@atomic ^= @val; return tmp; } + * + * This call acts as a full compiler and hardware memory barrier. + * + * Returns: the value of @atomic before the operation, unsigned + * + * Since: 2.30 + **/ +gsize +(g_atomic_pointer_xor) (volatile void *atomic, + gsize val) +{ + return g_atomic_pointer_xor ((volatile gpointer *) atomic, val); +} + +#elif defined (G_PLATFORM_WIN32) + +#include +#if !defined(_M_AMD64) && !defined (_M_IA64) && !defined(_M_X64) +#define InterlockedAnd _InterlockedAnd +#define InterlockedOr _InterlockedOr +#define InterlockedXor _InterlockedXor +#endif + +/* + * http://msdn.microsoft.com/en-us/library/ms684122(v=vs.85).aspx + */ +gint +(g_atomic_int_get) (const volatile gint *atomic) +{ + MemoryBarrier (); + return *atomic; +} + +void +(g_atomic_int_set) (volatile gint *atomic, + gint newval) +{ + *atomic = newval; + MemoryBarrier (); +} + +void +(g_atomic_int_inc) (volatile gint *atomic) +{ + InterlockedIncrement (atomic); +} + +gboolean +(g_atomic_int_dec_and_test) (volatile gint *atomic) +{ + return InterlockedDecrement (atomic) == 0; +} + +gboolean +(g_atomic_int_compare_and_exchange) (volatile gint *atomic, + gint oldval, + gint newval) +{ + return InterlockedCompareExchange (atomic, newval, oldval) == oldval; +} + +gint +(g_atomic_int_add) (volatile gint *atomic, + gint val) +{ + return InterlockedExchangeAdd (atomic, val); +} + +guint +(g_atomic_int_and) (volatile guint *atomic, + guint val) +{ + return InterlockedAnd (atomic, val); +} + +guint +(g_atomic_int_or) (volatile guint *atomic, + guint val) +{ + return InterlockedOr (atomic, val); +} + +guint +(g_atomic_int_xor) (volatile guint *atomic, + guint val) +{ + return InterlockedXor (atomic, val); +} + + +gpointer +(g_atomic_pointer_get) (const volatile void *atomic) +{ + const volatile gpointer *ptr = atomic; + + MemoryBarrier (); + return *ptr; +} + +void +(g_atomic_pointer_set) (volatile void *atomic, + gpointer newval) +{ + volatile gpointer *ptr = atomic; + + *ptr = newval; + MemoryBarrier (); +} + +gboolean +(g_atomic_pointer_compare_and_exchange) (volatile void *atomic, + gpointer oldval, + gpointer newval) +{ + return InterlockedCompareExchangePointer (atomic, newval, oldval) == oldval; +} + +gssize +(g_atomic_pointer_add) (volatile void *atomic, + gssize val) +{ +#if GLIB_SIZEOF_VOID_P == 8 + return InterlockedExchangeAdd64 (atomic, val); +#else + return InterlockedExchangeAdd (atomic, val); +#endif +} + +gsize +(g_atomic_pointer_and) (volatile void *atomic, + gsize val) +{ +#if GLIB_SIZEOF_VOID_P == 8 + return InterlockedAnd64 (atomic, val); +#else + return InterlockedAnd (atomic, val); +#endif +} + +gsize +(g_atomic_pointer_or) (volatile void *atomic, + gsize val) +{ +#if GLIB_SIZEOF_VOID_P == 8 + return InterlockedOr64 (atomic, val); +#else + return InterlockedOr (atomic, val); +#endif +} + +gsize +(g_atomic_pointer_xor) (volatile void *atomic, + gsize val) +{ +#if GLIB_SIZEOF_VOID_P == 8 + return InterlockedXor64 (atomic, val); +#else + return InterlockedXor (atomic, val); +#endif +} +#else + +/* This error occurs when ./configure decided that we should be capable + * of lock-free atomics but we find at compile-time that we are not. + */ +#error G_ATOMIC_LOCK_FREE defined, but incapable of lock-free atomics. + +#endif /* defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) */ + +#else /* G_ATOMIC_LOCK_FREE */ + +/* We are not permitted to call into any GLib functions from here, so we + * can not use GMutex. + * + * Fortunately, we already take care of the Windows case above, and all + * non-Windows platforms on which glib runs have pthreads. Use those. + */ +#include + +static pthread_mutex_t g_atomic_lock = PTHREAD_MUTEX_INITIALIZER; + +gint +(g_atomic_int_get) (volatile gint *atomic) +{ + gint value; + + pthread_mutex_lock (&g_atomic_lock); + value = *atomic; + pthread_mutex_unlock (&g_atomic_lock); + + return value; +} + +void +(g_atomic_int_set) (volatile gint *atomic, + gint value) +{ + pthread_mutex_lock (&g_atomic_lock); + *atomic = value; + pthread_mutex_unlock (&g_atomic_lock); +} + +void +(g_atomic_int_inc) (volatile gint *atomic) +{ + pthread_mutex_lock (&g_atomic_lock); + (*atomic)++; + pthread_mutex_unlock (&g_atomic_lock); +} + +gboolean +(g_atomic_int_dec_and_test) (volatile gint *atomic) +{ + gboolean is_zero; + + pthread_mutex_lock (&g_atomic_lock); + is_zero = --(*atomic) == 0; + pthread_mutex_unlock (&g_atomic_lock); + + return is_zero; +} + +gboolean +(g_atomic_int_compare_and_exchange) (volatile gint *atomic, + gint oldval, + gint newval) +{ + gboolean success; + + pthread_mutex_lock (&g_atomic_lock); + + if ((success = (*atomic == oldval))) + *atomic = newval; + + pthread_mutex_unlock (&g_atomic_lock); + + return success; +} + +gint +(g_atomic_int_add) (volatile gint *atomic, + gint val) +{ + gint oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *atomic; + *atomic = oldval + val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +guint +(g_atomic_int_and) (volatile guint *atomic, + guint val) +{ + guint oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *atomic; + *atomic = oldval & val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +guint +(g_atomic_int_or) (volatile guint *atomic, + guint val) +{ + guint oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *atomic; + *atomic = oldval | val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +guint +(g_atomic_int_xor) (volatile guint *atomic, + guint val) +{ + guint oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *atomic; + *atomic = oldval ^ val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + + +gpointer +(g_atomic_pointer_get) (volatile void *atomic) +{ + volatile gpointer *ptr = atomic; + gpointer value; + + pthread_mutex_lock (&g_atomic_lock); + value = *ptr; + pthread_mutex_unlock (&g_atomic_lock); + + return value; +} + +void +(g_atomic_pointer_set) (volatile void *atomic, + gpointer newval) +{ + volatile gpointer *ptr = atomic; + + pthread_mutex_lock (&g_atomic_lock); + *ptr = newval; + pthread_mutex_unlock (&g_atomic_lock); +} + +gboolean +(g_atomic_pointer_compare_and_exchange) (volatile void *atomic, + gpointer oldval, + gpointer newval) +{ + volatile gpointer *ptr = atomic; + gboolean success; + + pthread_mutex_lock (&g_atomic_lock); + + if ((success = (*ptr == oldval))) + *ptr = newval; + + pthread_mutex_unlock (&g_atomic_lock); + + return success; +} + +gssize +(g_atomic_pointer_add) (volatile void *atomic, + gssize val) +{ + volatile gssize *ptr = atomic; + gssize oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *ptr; + *ptr = oldval + val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +gsize +(g_atomic_pointer_and) (volatile void *atomic, + gsize val) +{ + volatile gsize *ptr = atomic; + gsize oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *ptr; + *ptr = oldval & val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +gsize +(g_atomic_pointer_or) (volatile void *atomic, + gsize val) +{ + volatile gsize *ptr = atomic; + gsize oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *ptr; + *ptr = oldval | val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +gsize +(g_atomic_pointer_xor) (volatile void *atomic, + gsize val) +{ + volatile gsize *ptr = atomic; + gsize oldval; + + pthread_mutex_lock (&g_atomic_lock); + oldval = *ptr; + *ptr = oldval ^ val; + pthread_mutex_unlock (&g_atomic_lock); + + return oldval; +} + +#endif + +/** + * g_atomic_int_exchange_and_add: + * @atomic: a pointer to a #gint + * @val: the value to add + * + * This function existed before g_atomic_int_add() returned the prior + * value of the integer (which it now does). It is retained only for + * compatibility reasons. Don't use this function in new code. + * + * Returns: the value of @atomic before the add, signed + * Since: 2.4 + * Deprecated: 2.30: Use g_atomic_int_add() instead. + **/ +gint +g_atomic_int_exchange_and_add (volatile gint *atomic, + gint val) +{ + return (g_atomic_int_add) (atomic, val); +} diff --git a/glib/gatomic.h b/glib/gatomic.h new file mode 100644 index 0000000..e7fd1f2 --- /dev/null +++ b/glib/gatomic.h @@ -0,0 +1,232 @@ +/* + * Copyright © 2011 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 + * 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_ATOMIC_H__ +#define __G_ATOMIC_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gint g_atomic_int_get (const volatile gint *atomic); +GLIB_AVAILABLE_IN_ALL +void g_atomic_int_set (volatile gint *atomic, + gint newval); +GLIB_AVAILABLE_IN_ALL +void g_atomic_int_inc (volatile gint *atomic); +GLIB_AVAILABLE_IN_ALL +gboolean g_atomic_int_dec_and_test (volatile gint *atomic); +GLIB_AVAILABLE_IN_ALL +gboolean g_atomic_int_compare_and_exchange (volatile gint *atomic, + gint oldval, + gint newval); +GLIB_AVAILABLE_IN_ALL +gint g_atomic_int_add (volatile gint *atomic, + gint val); +GLIB_AVAILABLE_IN_2_30 +guint g_atomic_int_and (volatile guint *atomic, + guint val); +GLIB_AVAILABLE_IN_2_30 +guint g_atomic_int_or (volatile guint *atomic, + guint val); +GLIB_AVAILABLE_IN_ALL +guint g_atomic_int_xor (volatile guint *atomic, + guint val); + +GLIB_AVAILABLE_IN_ALL +gpointer g_atomic_pointer_get (const volatile void *atomic); +GLIB_AVAILABLE_IN_ALL +void g_atomic_pointer_set (volatile void *atomic, + gpointer newval); +GLIB_AVAILABLE_IN_ALL +gboolean g_atomic_pointer_compare_and_exchange (volatile void *atomic, + gpointer oldval, + gpointer newval); +GLIB_AVAILABLE_IN_ALL +gssize g_atomic_pointer_add (volatile void *atomic, + gssize val); +GLIB_AVAILABLE_IN_2_30 +gsize g_atomic_pointer_and (volatile void *atomic, + gsize val); +GLIB_AVAILABLE_IN_2_30 +gsize g_atomic_pointer_or (volatile void *atomic, + gsize val); +GLIB_AVAILABLE_IN_ALL +gsize g_atomic_pointer_xor (volatile void *atomic, + gsize val); + +GLIB_DEPRECATED_IN_2_30_FOR(g_atomic_add) +gint g_atomic_int_exchange_and_add (volatile gint *atomic, + gint val); + +G_END_DECLS + +#if defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + +#define g_atomic_int_get(atomic) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ *(atomic) : 0); \ + __sync_synchronize (); \ + (gint) *(atomic); \ + })) +#define g_atomic_int_set(atomic, newval) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (newval) : 0); \ + *(atomic) = (newval); \ + __sync_synchronize (); \ + })) +#define g_atomic_int_inc(atomic) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ *(atomic) : 0); \ + (void) __sync_fetch_and_add ((atomic), 1); \ + })) +#define g_atomic_int_dec_and_test(atomic) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ *(atomic) : 0); \ + __sync_fetch_and_sub ((atomic), 1) == 1; \ + })) +#define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (newval) ^ (oldval) : 0); \ + (gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \ + })) +#define g_atomic_int_add(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (val) : 0); \ + (gint) __sync_fetch_and_add ((atomic), (val)); \ + })) +#define g_atomic_int_and(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (val) : 0); \ + (guint) __sync_fetch_and_and ((atomic), (val)); \ + })) +#define g_atomic_int_or(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (val) : 0); \ + (guint) __sync_fetch_and_or ((atomic), (val)); \ + })) +#define g_atomic_int_xor(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gint)); \ + (void) (0 ? *(atomic) ^ (val) : 0); \ + (guint) __sync_fetch_and_xor ((atomic), (val)); \ + })) + +#define g_atomic_pointer_get(atomic) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + __sync_synchronize (); \ + (gpointer) *(atomic); \ + })) +#define g_atomic_pointer_set(atomic, newval) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + *(atomic) = (__typeof__ (*(atomic))) (gsize) (newval); \ + __sync_synchronize (); \ + })) +#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + (gboolean) __sync_bool_compare_and_swap ((atomic), (oldval), (newval)); \ + })) +#define g_atomic_pointer_add(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + (void) (0 ? (val) ^ (val) : 0); \ + (gssize) __sync_fetch_and_add ((atomic), (val)); \ + })) +#define g_atomic_pointer_and(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + (void) (0 ? (val) ^ (val) : 0); \ + (gsize) __sync_fetch_and_and ((atomic), (val)); \ + })) +#define g_atomic_pointer_or(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + (void) (0 ? (val) ^ (val) : 0); \ + (gsize) __sync_fetch_and_or ((atomic), (val)); \ + })) +#define g_atomic_pointer_xor(atomic, val) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(atomic) : 0); \ + (void) (0 ? (val) ^ (val) : 0); \ + (gsize) __sync_fetch_and_xor ((atomic), (val)); \ + })) + +#else /* defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) */ + +#define g_atomic_int_get(atomic) \ + (g_atomic_int_get ((gint *) (atomic))) +#define g_atomic_int_set(atomic, newval) \ + (g_atomic_int_set ((gint *) (atomic), (gint) (newval))) +#define g_atomic_int_compare_and_exchange(atomic, oldval, newval) \ + (g_atomic_int_compare_and_exchange ((gint *) (atomic), (oldval), (newval))) +#define g_atomic_int_add(atomic, val) \ + (g_atomic_int_add ((gint *) (atomic), (val))) +#define g_atomic_int_and(atomic, val) \ + (g_atomic_int_and ((guint *) (atomic), (val))) +#define g_atomic_int_or(atomic, val) \ + (g_atomic_int_or ((guint *) (atomic), (val))) +#define g_atomic_int_xor(atomic, val) \ + (g_atomic_int_xor ((guint *) (atomic), (val))) +#define g_atomic_int_inc(atomic) \ + (g_atomic_int_inc ((gint *) (atomic))) +#define g_atomic_int_dec_and_test(atomic) \ + (g_atomic_int_dec_and_test ((gint *) (atomic))) + +#define g_atomic_pointer_get(atomic) \ + (g_atomic_pointer_get (atomic)) +#define g_atomic_pointer_set(atomic, newval) \ + (g_atomic_pointer_set ((atomic), (gpointer) (newval))) +#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \ + (g_atomic_pointer_compare_and_exchange ((atomic), (gpointer) (oldval), (gpointer) (newval))) +#define g_atomic_pointer_add(atomic, val) \ + (g_atomic_pointer_add ((atomic), (gssize) (val))) +#define g_atomic_pointer_and(atomic, val) \ + (g_atomic_pointer_and ((atomic), (gsize) (val))) +#define g_atomic_pointer_or(atomic, val) \ + (g_atomic_pointer_or ((atomic), (gsize) (val))) +#define g_atomic_pointer_xor(atomic, val) \ + (g_atomic_pointer_xor ((atomic), (gsize) (val))) + +#endif /* defined(__GNUC__) && defined(G_ATOMIC_OP_USE_GCC_BUILTINS) */ + +#endif /* __G_ATOMIC_H__ */ diff --git a/glib/gbacktrace.c b/glib/gbacktrace.c new file mode 100644 index 0000000..4d19d6f --- /dev/null +++ b/glib/gbacktrace.c @@ -0,0 +1,375 @@ +/* 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 "glibconfig.h" + +#include +#include +#include +#include + +#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 + +#include "gbacktrace.h" + +#include "gtypes.h" +#include "gmain.h" +#include "gprintfint.h" +#include "gutils.h" + + +#ifndef NO_FD_SET +# define SELECT_MASK fd_set +#else +# if defined(_IBMR2) +# define SELECT_MASK void +# else +# define SELECT_MASK int +# endif +#endif + + +#ifndef G_OS_WIN32 +static void stack_trace (char **args); +#endif + +/* People want to hit this from their debugger... */ +GLIB_AVAILABLE_IN_ALL volatile gboolean glib_on_error_halt; +volatile gboolean glib_on_error_halt = TRUE; + +/** + * g_on_error_query: + * @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) + * + * 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 [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. + */ +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 +} + +/** + * g_on_error_stack_trace: + * @prg_name: the program name, needed by gdb + * for the [S]tack trace option. + * + * 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. You can get the current + * process's "program name" with g_get_prgname(), assuming that you + * have called gtk_init() or gdk_init(). + * + * This function may cause different actions on non-UNIX platforms. + */ +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 */ diff --git a/glib/gbacktrace.h b/glib/gbacktrace.h new file mode 100644 index 0000000..47dd2ee --- /dev/null +++ b/glib/gbacktrace.h @@ -0,0 +1,66 @@ +/* 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_BACKTRACE_H__ +#define __G_BACKTRACE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +void g_on_error_query (const gchar *prg_name); +GLIB_AVAILABLE_IN_ALL +void g_on_error_stack_trace (const gchar *prg_name); + +/** + * 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. + */ +#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..d0ab0ea --- /dev/null +++ b/glib/gbase64.c @@ -0,0 +1,445 @@ +/* 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 "gtestutils.h" +#include "glibintl.h" + + +/** + * SECTION:base64 + * @title: 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: (array length=len) (element-type guint8): the binary data to encode + * @len: the length of @in + * @break_lines: whether to break long lines + * @out: (out) (array) (element-type guint8): pointer to destination buffer + * @state: (inout): Saved state between steps, initialize to 0 + * @save: (inout): 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. + * Note however that it breaks the lines with LF + * characters, not CR LF sequences, so the result cannot + * be passed directly to SMTP or certain other protocols. + * + * 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: (out) (array) (element-type guint8): pointer to destination buffer + * @state: (inout): Saved state from g_base64_encode_step() + * @save: (inout): 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: (array length=len) (element-type guint8): the binary data to encode + * @len: the length of @data + * + * Encode a sequence of binary data into its Base-64 stringified + * representation. + * + * Return value: (transfer full): 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 || 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: (array length=len) (element-type guint8): binary input data + * @len: max length of @in data to decode + * @out: (out) (array) (element-type guint8): output buffer + * @state: (inout): Saved state between steps, initialize to 0 + * @save: (inout): 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: (out): The length of the decoded data is written here + * + * Decode a sequence of Base-64 encoded text into binary data + * + * Return value: (transfer full) (array length=out_len) (element-type guint8): + * 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); + + /* 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 returning 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: (inout) (array length=out_len) (element-type guint8): zero-terminated + * string with base64 text to decode + * @out_len: (inout): 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: (transfer none): 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; +} diff --git a/glib/gbase64.h b/glib/gbase64.h new file mode 100644 index 0000000..b53fca5 --- /dev/null +++ b/glib/gbase64.h @@ -0,0 +1,63 @@ +/* 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. + */ + +#ifndef __G_BASE64_H__ +#define __G_BASE64_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gsize g_base64_encode_step (const guchar *in, + gsize len, + gboolean break_lines, + gchar *out, + gint *state, + gint *save); +GLIB_AVAILABLE_IN_ALL +gsize g_base64_encode_close (gboolean break_lines, + gchar *out, + gint *state, + gint *save); +GLIB_AVAILABLE_IN_ALL +gchar* g_base64_encode (const guchar *data, + gsize len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gsize g_base64_decode_step (const gchar *in, + gsize len, + guchar *out, + gint *state, + guint *save); +GLIB_AVAILABLE_IN_ALL +guchar *g_base64_decode (const gchar *text, + gsize *out_len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +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..89e0071 --- /dev/null +++ b/glib/gbitlock.c @@ -0,0 +1,537 @@ +/* + * 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 "config.h" + +#include "gbitlock.h" + +#include +#include +#include +#include +#include + +#include "gthreadprivate.h" + +#undef HAVE_FUTEX +#ifdef G_BIT_LOCK_FORCE_FUTEX_EMULATION +#endif + +#ifndef HAVE_FUTEX +static GMutex g_futex_mutex; +static GSList *g_futex_address_list = NULL; +#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 (__NR_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 (__NR_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; + g_cond_init (&waiter->wait_queue); + 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_clear (&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]; + +#if (defined (i386) || defined (__amd64__)) + #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + #define USE_ASM_GOTO 1 + #endif +#endif + +/** + * 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) +{ +#ifdef USE_ASM_GOTO + retry: + asm volatile goto ("lock bts %1, (%0)\n" + "jc %l[contended]" + : /* no output */ + : "r" (address), "r" (lock_bit) + : "cc", "memory" + : contended); + return; + + contended: + { + guint mask = 1u << lock_bit; + guint v; + + v = g_atomic_int_get (address); + if (v & mask) + { + 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; +#else + guint mask = 1u << lock_bit; + guint v; + + retry: + v = g_atomic_int_or (address, mask); + if (v & mask) + /* 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; + } +#endif +} + +/** + * g_bit_trylock: + * @address: a pointer to an integer + * @lock_bit: a bit value between 0 and 31 + * + * 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. + * + * Returns: %TRUE if the lock was acquired + * + * Since: 2.24 + **/ +gboolean +g_bit_trylock (volatile gint *address, + gint lock_bit) +{ +#ifdef USE_ASM_GOTO + gboolean result; + + asm volatile ("lock bts %2, (%1)\n" + "setnc %%al\n" + "movzx %%al, %0" + : "=r" (result) + : "r" (address), "r" (lock_bit) + : "cc", "memory"); + + return result; +#else + guint mask = 1u << lock_bit; + guint v; + + v = g_atomic_int_or (address, mask); + + return ~v & mask; +#endif +} + +/** + * 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) +{ +#ifdef USE_ASM_GOTO + asm volatile ("lock btr %1, (%0)" + : /* no output */ + : "r" (address), "r" (lock_bit) + : "cc", "memory"); +#else + guint mask = 1u << lock_bit; + + g_atomic_int_and (address, ~mask); +#endif + + { + guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); + + if (g_atomic_int_get (&g_bit_lock_contended[class])) + g_futex_wake (address); + } +} + + +/* We emulate pointer-sized futex(2) because the kernel API only + * supports integers. + * + * We assume that the 'interesting' part is always the lower order bits. + * This assumption holds because pointer bitlocks are restricted to + * using the low order bits of the pointer as the lock. + * + * On 32 bits, there is nothing to do since the pointer size is equal to + * the integer size. On little endian the lower-order bits don't move, + * so do nothing. Only on 64bit big endian do we need to do a bit of + * pointer arithmetic: the low order bits are shifted by 4 bytes. We + * have a helper function that always does the right thing here. + * + * Since we always consider the low-order bits of the integer value, a + * simple cast from (gsize) to (guint) always takes care of that. + * + * After that, pointer-sized futex becomes as simple as: + * + * g_futex_wait (g_futex_int_address (address), (guint) value); + * + * and + * + * g_futex_wake (g_futex_int_address (int_address)); + */ +static const volatile gint * +g_futex_int_address (const volatile void *address) +{ + const volatile gint *int_address = address; + + /* this implementation makes these (reasonable) assumptions: */ + G_STATIC_ASSERT (G_BYTE_ORDER == G_LITTLE_ENDIAN || + (G_BYTE_ORDER == G_BIG_ENDIAN && + sizeof (int) == 4 && + (sizeof (gpointer) == 4 || sizeof (gpointer) == 8))); + +#if G_BYTE_ORDER == G_BIG_ENDIAN && GLIB_SIZEOF_VOID_P == 8 + int_address++; +#endif + + return int_address; +} + +/** + * g_pointer_bit_lock: + * @address: a pointer to a #gpointer-sized value + * @lock_bit: a bit value between 0 and 31 + * + * This is equivalent to g_bit_lock, but working on pointers (or other + * pointer-sized values). + * + * For portability reasons, you may only lock on the bottom 32 bits of + * the pointer. + * + * Since: 2.30 + **/ +void +(g_pointer_bit_lock) (volatile void *address, + gint lock_bit) +{ + g_return_if_fail (lock_bit < 32); + + { +#ifdef USE_ASM_GOTO + retry: + asm volatile goto ("lock bts %1, (%0)\n" + "jc %l[contended]" + : /* no output */ + : "r" (address), "r" ((gsize) lock_bit) + : "cc", "memory" + : contended); + return; + + contended: + { + volatile gsize *pointer_address = address; + gsize mask = 1u << lock_bit; + gsize v; + + v = (gsize) g_atomic_pointer_get (pointer_address); + if (v & mask) + { + guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); + + g_atomic_int_add (&g_bit_lock_contended[class], +1); + g_futex_wait (g_futex_int_address (address), v); + g_atomic_int_add (&g_bit_lock_contended[class], -1); + } + } + goto retry; +#else + volatile gsize *pointer_address = address; + gsize mask = 1u << lock_bit; + gsize v; + + retry: + v = g_atomic_pointer_or (pointer_address, mask); + if (v & mask) + /* 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 (g_futex_int_address (address), (guint) v); + g_atomic_int_add (&g_bit_lock_contended[class], -1); + + goto retry; + } +#endif + } +} + +/** + * g_pointer_bit_trylock: + * @address: a pointer to a #gpointer-sized value + * @lock_bit: a bit value between 0 and 31 + * + * This is equivalent to g_bit_trylock, but working on pointers (or + * other pointer-sized values). + * + * For portability reasons, you may only lock on the bottom 32 bits of + * the pointer. + * + * Returns: %TRUE if the lock was acquired + * + * Since: 2.30 + **/ +gboolean +(g_pointer_bit_trylock) (volatile void *address, + gint lock_bit) +{ + g_return_val_if_fail (lock_bit < 32, FALSE); + + { +#ifdef USE_ASM_GOTO + gboolean result; + + asm volatile ("lock bts %2, (%1)\n" + "setnc %%al\n" + "movzx %%al, %0" + : "=r" (result) + : "r" (address), "r" ((gsize) lock_bit) + : "cc", "memory"); + + return result; +#else + volatile gsize *pointer_address = address; + gsize mask = 1u << lock_bit; + gsize v; + + g_return_val_if_fail (lock_bit < 32, FALSE); + + v = g_atomic_pointer_or (pointer_address, mask); + + return ~v & mask; +#endif + } +} + +/** + * g_pointer_bit_unlock: + * @address: a pointer to a #gpointer-sized value + * @lock_bit: a bit value between 0 and 31 + * + * This is equivalent to g_bit_unlock, but working on pointers (or other + * pointer-sized values). + * + * For portability reasons, you may only lock on the bottom 32 bits of + * the pointer. + * + * Since: 2.30 + **/ +void +(g_pointer_bit_unlock) (volatile void *address, + gint lock_bit) +{ + g_return_if_fail (lock_bit < 32); + + { +#ifdef USE_ASM_GOTO + asm volatile ("lock btr %1, (%0)" + : /* no output */ + : "r" (address), "r" ((gsize) lock_bit) + : "cc", "memory"); +#else + volatile gsize *pointer_address = address; + gsize mask = 1u << lock_bit; + + g_atomic_pointer_and (pointer_address, ~mask); +#endif + + { + guint class = ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); + if (g_atomic_int_get (&g_bit_lock_contended[class])) + g_futex_wake (g_futex_int_address (address)); + } + } +} diff --git a/glib/gbitlock.h b/glib/gbitlock.h new file mode 100644 index 0000000..7485dfa --- /dev/null +++ b/glib/gbitlock.h @@ -0,0 +1,78 @@ +/* + * 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 (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +void g_bit_lock (volatile gint *address, + gint lock_bit); +GLIB_AVAILABLE_IN_ALL +gboolean g_bit_trylock (volatile gint *address, + gint lock_bit); +GLIB_AVAILABLE_IN_ALL +void g_bit_unlock (volatile gint *address, + gint lock_bit); + +GLIB_AVAILABLE_IN_ALL +void g_pointer_bit_lock (volatile void *address, + gint lock_bit); +GLIB_AVAILABLE_IN_ALL +gboolean g_pointer_bit_trylock (volatile void *address, + gint lock_bit); +GLIB_AVAILABLE_IN_ALL +void g_pointer_bit_unlock (volatile void *address, + gint lock_bit); + +#ifdef __GNUC__ + +#define g_pointer_bit_lock(address, lock_bit) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ + g_pointer_bit_lock ((address), (lock_bit)); \ + })) + +#define g_pointer_bit_trylock(address, lock_bit) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ + g_pointer_bit_trylock ((address), (lock_bit)); \ + })) + +#define g_pointer_bit_unlock(address, lock_bit) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ + g_pointer_bit_unlock ((address), (lock_bit)); \ + })) + +#endif + +G_END_DECLS + +#endif /* __G_BITLOCK_H_ */ diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c new file mode 100644 index 0000000..2f50200 --- /dev/null +++ b/glib/gbookmarkfile.c @@ -0,0 +1,3708 @@ +/* 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" + + +/** + * SECTION:bookmarkfile + * @title: Bookmark file parser + * @short_description: 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. + * |[FIXME: MISSING XINCLUDE CONTENT]| + * + * 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. + */ + +/* 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); + + g_list_free_full (metadata->groups, g_free); + g_list_free_full (metadata->applications, (GDestroyNotify) bookmark_app_info_free); + + 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); + + g_list_free_full (bookmark->items, (GDestroyNotify) bookmark_item_free); + 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; + + parse_error = NULL; + end_error = NULL; + + 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); + + retval = g_markup_parse_context_parse (context, + buffer, + length, + &parse_error); + if (!retval) + g_propagate_error (error, parse_error); + else + { + retval = g_markup_parse_context_end_parse (context, &end_error); + if (!retval) + g_propagate_error (error, end_error); + } + + g_markup_parse_context_free (context); + + return retval; +} + +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; +} + +G_DEFINE_QUARK (g-bookmark-file-error-quark, g_bookmark_file_error) + +/******************** + * 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); + + 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 retval; +} + +/** + * 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: (allow-none): 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 otherwise + * + * 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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 (); + + g_list_free_full (item->metadata->groups, g_free); + 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: (allow-none): 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: (allow-none): the name of the application registering the bookmark + * or %NULL + * @exec: (allow-none): 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); + } + } + + if (!item->metadata) + item->metadata = bookmark_metadata_new (); + + 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: (allow-none): location for the command line of the application, or %NULL + * @count: (allow-none): return location for the registration count, or %NULL + * @stamp: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): return location for the icon's location or %NULL + * @mime_type: (allow-none): 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; +} diff --git a/glib/gbookmarkfile.h b/glib/gbookmarkfile.h new file mode 100644 index 0000000..4d94efe --- /dev/null +++ b/glib/gbookmarkfile.h @@ -0,0 +1,255 @@ +/* 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, + */ + +#ifndef __G_BOOKMARK_FILE_H__ +#define __G_BOOKMARK_FILE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +/** + * G_BOOKMARK_FILE_ERROR: + * + * Error domain for bookmark file parsing. + * Errors in this domain will be from the #GBookmarkFileError + * enumeration. See #GError for information on error domains. + */ +#define G_BOOKMARK_FILE_ERROR (g_bookmark_file_error_quark ()) + + +/** + * GBookmarkFileError: + * @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 + * + * Error codes returned by bookmark file parsing. + */ +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; + +GLIB_AVAILABLE_IN_ALL +GQuark g_bookmark_file_error_quark (void); + +/** + * GBookmarkFile: + * + * The GBookmarkFile struct contains only + * private data and should not be directly accessed. + */ +typedef struct _GBookmarkFile GBookmarkFile; + +GLIB_AVAILABLE_IN_ALL +GBookmarkFile *g_bookmark_file_new (void); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_free (GBookmarkFile *bookmark); + +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_load_from_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_load_from_data (GBookmarkFile *bookmark, + const gchar *data, + gsize length, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_load_from_data_dirs (GBookmarkFile *bookmark, + const gchar *file, + gchar **full_path, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar * g_bookmark_file_to_data (GBookmarkFile *bookmark, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_to_file (GBookmarkFile *bookmark, + const gchar *filename, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_title (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *title); +GLIB_AVAILABLE_IN_ALL +gchar * g_bookmark_file_get_title (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_description (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *description); +GLIB_AVAILABLE_IN_ALL +gchar * g_bookmark_file_get_description (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *mime_type); +GLIB_AVAILABLE_IN_ALL +gchar * g_bookmark_file_get_mime_type (GBookmarkFile *bookmark, + const gchar *uri, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_groups (GBookmarkFile *bookmark, + const gchar *uri, + const gchar **groups, + gsize length); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_add_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_has_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar ** g_bookmark_file_get_groups (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_add_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + const gchar *exec); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_has_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar ** g_bookmark_file_get_applications (GBookmarkFile *bookmark, + const gchar *uri, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_get_app_info (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + gchar **exec, + guint *count, + time_t *stamp, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_is_private (GBookmarkFile *bookmark, + const gchar *uri, + gboolean is_private); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_get_is_private (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_icon (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *href, + const gchar *mime_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_get_icon (GBookmarkFile *bookmark, + const gchar *uri, + gchar **href, + gchar **mime_type, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_added (GBookmarkFile *bookmark, + const gchar *uri, + time_t added); +GLIB_AVAILABLE_IN_ALL +time_t g_bookmark_file_get_added (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_modified (GBookmarkFile *bookmark, + const gchar *uri, + time_t modified); +GLIB_AVAILABLE_IN_ALL +time_t g_bookmark_file_get_modified (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_bookmark_file_set_visited (GBookmarkFile *bookmark, + const gchar *uri, + time_t visited); +GLIB_AVAILABLE_IN_ALL +time_t g_bookmark_file_get_visited (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_has_item (GBookmarkFile *bookmark, + const gchar *uri); +GLIB_AVAILABLE_IN_ALL +gint g_bookmark_file_get_size (GBookmarkFile *bookmark); +GLIB_AVAILABLE_IN_ALL +gchar ** g_bookmark_file_get_uris (GBookmarkFile *bookmark, + gsize *length) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_remove_group (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *group, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_remove_application (GBookmarkFile *bookmark, + const gchar *uri, + const gchar *name, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_bookmark_file_remove_item (GBookmarkFile *bookmark, + const gchar *uri, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..98822cb --- /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 comparisons */ +#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/gbytes.c b/glib/gbytes.c new file mode 100644 index 0000000..4d1f6c6 --- /dev/null +++ b/glib/gbytes.c @@ -0,0 +1,486 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * Copyright © 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * 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 + * Stef Walter + */ + +#include "config.h" + +#include "gbytes.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +/** + * GBytes: + * + * A simple refcounted data type representing an immutable byte sequence + * from an unspecified origin. + * + * The purpose of a #GBytes is to keep the memory region that it holds + * alive for as long as anyone holds a reference to the bytes. When + * the last reference count is dropped, the memory is released. Multiple + * unrelated callers can use byte data in the #GBytes without coordinating + * their activities, resting assured that the byte data will not change or + * move while they hold a reference. + * + * A #GBytes 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. + * + * #GBytes work well as keys in #GHashTable. Use g_bytes_equal() and + * g_bytes_hash() as parameters to g_hash_table_new() or g_hash_table_new_full(). + * #GBytes can also be used as keys in a #GTree by passing the g_bytes_compare() + * function to g_tree_new(). + * + * The data pointed to by this bytes must not be modified. For a mutable + * array of bytes see #GByteArray. Use g_bytes_unref_to_array() to create a + * mutable array for a #GBytes sequence. To create an immutable #GBytes from + * a mutable #GByteArray, use the g_byte_array_free_to_bytes() function. + * + * Since: 2.32 + **/ + +struct _GBytes +{ + gconstpointer data; + gsize size; + gint ref_count; + GDestroyNotify free_func; + gpointer user_data; +}; + +/** + * g_bytes_new: + * @data: (transfer none) (array length=size) (element-type guint8): + * the data to be used for the bytes + * @size: the size of @data + * + * Creates a new #GBytes from @data. + * + * @data is copied. + * + * Returns: (transfer full): a new #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_new (gconstpointer data, + gsize size) +{ + return g_bytes_new_take (g_memdup (data, size), size); +} + +/** + * g_bytes_new_take: + * @data: (transfer full) (array length=size) (element-type guint8): + the data to be used for the bytes + * @size: the size of @data + * + * Creates a new #GBytes from @data. + * + * After this call, @data belongs to the bytes and may no longer be + * modified by the caller. g_free() will be called on @data when the + * bytes is no longer in use. Because of this @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). + * + * For creating #GBytes with memory from other allocators, see + * g_bytes_new_with_free_func(). + * + * Returns: (transfer full): a new #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_new_take (gpointer data, + gsize size) +{ + return g_bytes_new_with_free_func (data, size, g_free, data); +} + + +/** + * g_bytes_new_static: (skip) + * @data: (transfer full) (array length=size) (element-type guint8): + the data to be used for the bytes + * @size: the size of @data + * + * Creates a new #GBytes from static data. + * + * @data must be static (ie: never modified or freed). + * + * Returns: (transfer full): a new #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_new_static (gconstpointer data, + gsize size) +{ + return g_bytes_new_with_free_func (data, size, NULL, NULL); +} + +/** + * g_bytes_new_with_free_func: + * @data: (array length=size): the data to be used for the bytes + * @size: the size of @data + * @free_func: the function to call to release the data + * @user_data: data to pass to @free_func + * + * Creates a #GBytes from @data. + * + * When the last reference is dropped, @free_func will be called with the + * @user_data argument. + * + * @data must not be modified after this call is made until @free_func has + * been called to indicate that the bytes is no longer in use. + * + * Returns: (transfer full): a new #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_new_with_free_func (gconstpointer data, + gsize size, + GDestroyNotify free_func, + gpointer user_data) +{ + GBytes *bytes; + + bytes = g_slice_new (GBytes); + bytes->data = data; + bytes->size = size; + bytes->free_func = free_func; + bytes->user_data = user_data; + bytes->ref_count = 1; + + return (GBytes *)bytes; +} + +/** + * g_bytes_new_from_bytes: + * @bytes: a #GBytes + * @offset: offset which subsection starts at + * @length: length of subsection + * + * Creates a #GBytes which is a subsection of another #GBytes. The @offset + + * @length may not be longer than the size of @bytes. + * + * A reference to @bytes will be held by the newly created #GBytes until + * the byte data is no longer needed. + * + * Returns: (transfer full): a new #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_new_from_bytes (GBytes *bytes, + gsize offset, + gsize length) +{ + g_return_val_if_fail (bytes != NULL, NULL); + g_return_val_if_fail (offset <= bytes->size, NULL); + g_return_val_if_fail (offset + length <= bytes->size, NULL); + + return g_bytes_new_with_free_func ((gchar *)bytes->data + offset, length, + (GDestroyNotify)g_bytes_unref, g_bytes_ref (bytes)); +} + +/** + * g_bytes_get_data: + * @bytes: a #GBytes + * @size: (out) (allow-none): location to return size of byte data + * + * Get the byte data in the #GBytes. This data should not be modified. + * + * This function will always return the same pointer for a given #GBytes. + * + * Returns: (transfer none) (array length=size) (type guint8): a pointer to the + * byte data + * + * Since: 2.32 + */ +gconstpointer +g_bytes_get_data (GBytes *bytes, + gsize *size) +{ + g_return_val_if_fail (bytes != NULL, NULL); + if (size) + *size = bytes->size; + return bytes->data; +} + +/** + * g_bytes_get_size: + * @bytes: a #GBytes + * + * Get the size of the byte data in the #GBytes. + * + * This function will always return the same value for a given #GBytes. + * + * Returns: the size + * + * Since: 2.32 + */ +gsize +g_bytes_get_size (GBytes *bytes) +{ + g_return_val_if_fail (bytes != NULL, 0); + return bytes->size; +} + + +/** + * g_bytes_ref: + * @bytes: a #GBytes + * + * Increase the reference count on @bytes. + * + * Returns: the #GBytes + * + * Since: 2.32 + */ +GBytes * +g_bytes_ref (GBytes *bytes) +{ + g_return_val_if_fail (bytes != NULL, NULL); + + g_atomic_int_inc (&bytes->ref_count); + + return bytes; +} + +/** + * g_bytes_unref: + * @bytes: (allow-none): a #GBytes + * + * Releases a reference on @bytes. This may result in the bytes being + * freed. + * + * Since: 2.32 + */ +void +g_bytes_unref (GBytes *bytes) +{ + if (bytes == NULL) + return; + + if (g_atomic_int_dec_and_test (&bytes->ref_count)) + { + if (bytes->free_func != NULL) + bytes->free_func (bytes->user_data); + g_slice_free (GBytes, bytes); + } +} + +/** + * g_bytes_equal: + * @bytes1: (type GLib.Bytes): a pointer to a #GBytes + * @bytes2: (type GLib.Bytes): a pointer to a #GBytes to compare with @bytes1 + * + * Compares the two #GBytes values being pointed to and returns + * %TRUE if they are equal. + * + * This function can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using non-%NULL #GBytes pointers as keys in a #GHashTable. + * + * Returns: %TRUE if the two keys match. + * + * Since: 2.32 + */ +gboolean +g_bytes_equal (gconstpointer bytes1, + gconstpointer bytes2) +{ + const GBytes *b1 = bytes1; + const GBytes *b2 = bytes2; + + g_return_val_if_fail (bytes1 != NULL, FALSE); + g_return_val_if_fail (bytes2 != NULL, FALSE); + + return b1->size == b2->size && + memcmp (b1->data, b2->data, b1->size) == 0; +} + +/** + * g_bytes_hash: + * @bytes: (type GLib.Bytes): a pointer to a #GBytes key + * + * Creates an integer hash code for the byte data in the #GBytes. + * + * This function can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using non-%NULL #GBytes pointers as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key. + * + * Since: 2.32 + */ +guint +g_bytes_hash (gconstpointer bytes) +{ + const GBytes *a = bytes; + const signed char *p, *e; + guint32 h = 5381; + + g_return_val_if_fail (bytes != NULL, 0); + + for (p = (signed char *)a->data, e = (signed char *)a->data + a->size; p != e; p++) + h = (h << 5) + h + *p; + + return h; +} + +/** + * g_bytes_compare: + * @bytes1: (type GLib.Bytes): a pointer to a #GBytes + * @bytes2: (type GLib.Bytes): a pointer to a #GBytes to compare with @bytes1 + * + * Compares the two #GBytes values. + * + * This function can be used to sort GBytes instances in lexographical order. + * + * Returns: a negative value if bytes2 is lesser, a positive value if bytes2 is + * greater, and zero if bytes2 is equal to bytes1 + * + * Since: 2.32 + */ +gint +g_bytes_compare (gconstpointer bytes1, + gconstpointer bytes2) +{ + const GBytes *b1 = bytes1; + const GBytes *b2 = bytes2; + gint ret; + + g_return_val_if_fail (bytes1 != NULL, 0); + g_return_val_if_fail (bytes2 != NULL, 0); + + ret = memcmp (b1->data, b2->data, MIN (b1->size, b2->size)); + if (ret == 0 && b1->size != b2->size) + ret = b1->size < b2->size ? -1 : 1; + return ret; +} + +static gpointer +try_steal_and_unref (GBytes *bytes, + GDestroyNotify free_func, + gsize *size) +{ + gpointer result; + + if (bytes->free_func != free_func || bytes->data == NULL) + return NULL; + + /* Are we the only reference? */ + if (g_atomic_int_get (&bytes->ref_count) == 1) + { + *size = bytes->size; + result = (gpointer)bytes->data; + g_slice_free (GBytes, bytes); + return result; + } + + return NULL; +} + + +/** + * g_bytes_unref_to_data: + * @bytes: (transfer full): a #GBytes + * @size: location to place the length of the returned data + * + * Unreferences the bytes, and returns a pointer the same byte data + * contents. + * + * As an optimization, the byte data is returned without copying if this was + * the last reference to bytes and bytes was created with g_bytes_new(), + * g_bytes_new_take() or g_byte_array_free_to_bytes(). In all other cases the + * data is copied. + * + * Returns: (transfer full): a pointer to the same byte data, which should + * be freed with g_free() + * + * Since: 2.32 + */ +gpointer +g_bytes_unref_to_data (GBytes *bytes, + gsize *size) +{ + gpointer result; + + g_return_val_if_fail (bytes != NULL, NULL); + g_return_val_if_fail (size != NULL, NULL); + + /* + * Optimal path: if this is was the last reference, then we can return + * the data from this GBytes without copying. + */ + + result = try_steal_and_unref (bytes, g_free, size); + if (result == NULL) + { + /* + * Copy: Non g_malloc (or compatible) allocator, or static memory, + * so we have to copy, and then unref. + */ + result = g_memdup (bytes->data, bytes->size); + *size = bytes->size; + g_bytes_unref (bytes); + } + + return result; +} + +/** + * g_bytes_unref_to_array: + * @bytes: (transfer full): a #GBytes + * + * Unreferences the bytes, and returns a new mutable #GByteArray containing + * the same byte data. + * + * As an optimization, the byte data is transferred to the array without copying + * if this was the last reference to bytes and bytes was created with + * g_bytes_new(), g_bytes_new_take() or g_byte_array_free_to_bytes(). In all + * other cases the data is copied. + * + * Returns: (transfer full): a new mutable #GByteArray containing the same byte data + * + * Since: 2.32 + */ +GByteArray * +g_bytes_unref_to_array (GBytes *bytes) +{ + gpointer data; + gsize size; + + g_return_val_if_fail (bytes != NULL, NULL); + + data = g_bytes_unref_to_data (bytes, &size); + return g_byte_array_new_take (data, size); +} diff --git a/glib/gbytes.h b/glib/gbytes.h new file mode 100644 index 0000000..c89f6eb --- /dev/null +++ b/glib/gbytes.h @@ -0,0 +1,92 @@ +/* + * Copyright © 2009, 2010 Codethink Limited + * Copyright © 2011 Collabora Ltd. + * + * This library is free software; you can redistribute it and/or + * 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 + * Stef Walter + */ + +#ifndef __G_BYTES_H__ +#define __G_BYTES_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_new (gconstpointer data, + gsize size); + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_new_take (gpointer data, + gsize size); + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_new_static (gconstpointer data, + gsize size); + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_new_with_free_func (gconstpointer data, + gsize size, + GDestroyNotify free_func, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_new_from_bytes (GBytes *bytes, + gsize offset, + gsize length); + +GLIB_AVAILABLE_IN_ALL +gconstpointer g_bytes_get_data (GBytes *bytes, + gsize *size); + +GLIB_AVAILABLE_IN_ALL +gsize g_bytes_get_size (GBytes *bytes); + +GLIB_AVAILABLE_IN_ALL +GBytes * g_bytes_ref (GBytes *bytes); + +GLIB_AVAILABLE_IN_ALL +void g_bytes_unref (GBytes *bytes); + +GLIB_AVAILABLE_IN_ALL +gpointer g_bytes_unref_to_data (GBytes *bytes, + gsize *size); + +GLIB_AVAILABLE_IN_ALL +GByteArray * g_bytes_unref_to_array (GBytes *bytes); + +GLIB_AVAILABLE_IN_ALL +guint g_bytes_hash (gconstpointer bytes); + +GLIB_AVAILABLE_IN_ALL +gboolean g_bytes_equal (gconstpointer bytes1, + gconstpointer bytes2); + +GLIB_AVAILABLE_IN_ALL +gint g_bytes_compare (gconstpointer bytes1, + gconstpointer bytes2); + +G_END_DECLS + +#endif /* __G_BYTES_H__ */ diff --git a/glib/gcharset.c b/glib/gcharset.c new file mode 100644 index 0000000..3fca455 --- /dev/null +++ b/glib/gcharset.c @@ -0,0 +1,592 @@ +/* gcharset.c - Charset information + * + * Copyright (C) 2011 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 "gcharsetprivate.h" + +#include "garray.h" +#include "genviron.h" +#include "ghash.h" +#include "gmessages.h" +#include "gstrfuncs.h" +#include "gthread.h" +#ifdef G_OS_WIN32 +#include "gwin32.h" +#endif + +#include "libcharset/libcharset.h" + +#include +#include + +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. + */ +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 = g_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 (const char **charset) +{ + static GPrivate cache_private = G_PRIVATE_INIT (charset_cache_free); + GCharsetCache *cache = g_private_get (&cache_private); + const gchar *raw; + + if (!cache) + { + cache = g_new0 (GCharsetCache, 1); + g_private_set (&cache_private, cache); + } + + G_LOCK (aliases); + raw = _g_locale_charset_raw (); + G_UNLOCK (aliases); + + 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; +} + +/** + * g_get_codeset: + * + * Gets the character set for the current locale. + * + * Return value: a newly allocated string containing the name + * of the character set. This string must be freed with g_free(). + */ +gchar * +g_get_codeset (void) +{ + const gchar *charset; + + g_get_charset (&charset); + + return g_strdup (charset); +} + +#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... + */ +static void +append_locale_variants (GPtrArray *array, + const gchar *locale) +{ + gchar *language = NULL; + gchar *territory = NULL; + gchar *codeset = NULL; + gchar *modifier = NULL; + + guint mask; + guint i, j; + + g_return_if_fail (locale != NULL); + + mask = explode_locale (locale, &language, &territory, &codeset, &modifier); + + /* Iterate through all possible combinations, from least attractive + * to most attractive. + */ + for (j = 0; j <= mask; ++j) + { + i = mask - j; + + if ((i & ~mask) == 0) + { + gchar *val = g_strconcat (language, + (i & COMPONENT_TERRITORY) ? territory : "", + (i & COMPONENT_CODESET) ? codeset : "", + (i & COMPONENT_MODIFIER) ? modifier : "", + NULL); + g_ptr_array_add (array, 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); +} + +/** + * g_get_locale_variants: + * @locale: a locale identifier + * + * Returns a list of derived variants of @locale, 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. + * This function handles territory, charset and extra locale modifiers. + * + * For example, if @locale is "fr_BE", then the returned list + * is "fr_BE", "fr". + * + * If you need the list of variants for the current locale, + * use g_get_language_names(). + * + * Returns: (transfer full) (array zero-terminated=1) (element-type utf8): a newly + * allocated array of newly allocated strings with the locale variants. Free with + * g_strfreev(). + * + * Since: 2.28 + */ +gchar ** +g_get_locale_variants (const gchar *locale) +{ + GPtrArray *array; + + g_return_val_if_fail (locale != NULL, NULL); + + array = g_ptr_array_sized_new (8); + append_locale_variants (array, locale); + g_ptr_array_add (array, NULL); + + return (gchar **) g_ptr_array_free (array, FALSE); +} + +/* 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. + */ + { + char *locale = g_win32_getlocale (); + retval = g_intern_string (locale); + g_free (locale); + 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: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib + * that must not be modified or freed. + * + * Since: 2.6 + **/ +const gchar * const * +g_get_language_names (void) +{ + static GPrivate cache_private = G_PRIVATE_INIT (language_names_cache_free); + GLanguageNamesCache *cache = g_private_get (&cache_private); + const gchar *value; + + if (!cache) + { + cache = g_new0 (GLanguageNamesCache, 1); + g_private_set (&cache_private, cache); + } + + value = guess_category_value ("LC_MESSAGES"); + if (!value) + value = "C"; + + if (!(cache->languages && strcmp (cache->languages, value) == 0)) + { + GPtrArray *array; + gchar **alist, **a; + + g_free (cache->languages); + g_strfreev (cache->language_names); + cache->languages = g_strdup (value); + + array = g_ptr_array_sized_new (8); + + alist = g_strsplit (value, ":", 0); + for (a = alist; *a; a++) + append_locale_variants (array, unalias_lang (*a)); + g_strfreev (alist); + g_ptr_array_add (array, g_strdup ("C")); + g_ptr_array_add (array, NULL); + + cache->language_names = (gchar **) g_ptr_array_free (array, FALSE); + } + + return (const gchar * const *) cache->language_names; +} diff --git a/glib/gcharset.h b/glib/gcharset.h new file mode 100644 index 0000000..f3b306d --- /dev/null +++ b/glib/gcharset.h @@ -0,0 +1,44 @@ +/* gcharset.h - Charset functions + * + * Copyright (C) 2011 Red Hat, Inc. + * + * The GLib Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 GLib Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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_CHARSET_H__ +#define __G_CHARSET_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gboolean g_get_charset (const char **charset); +GLIB_AVAILABLE_IN_ALL +gchar * g_get_codeset (void); + +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_get_language_names (void); +GLIB_AVAILABLE_IN_ALL +gchar ** g_get_locale_variants (const gchar *locale); + +G_END_DECLS + +#endif /* __G_CHARSET_H__ */ diff --git a/glib/gcharsetprivate.h b/glib/gcharsetprivate.h new file mode 100644 index 0000000..aea1384 --- /dev/null +++ b/glib/gcharsetprivate.h @@ -0,0 +1,32 @@ +/* gunicodeprivate.h + * + * Copyright (C) 2012 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_CHARSET_PRIVATE_H__ +#define __G_CHARSET_PRIVATE_H__ + +#include "gcharset.h" + +G_BEGIN_DECLS + +const char ** _g_charset_get_aliases (const char *canonical_name); + +G_END_DECLS + +#endif diff --git a/glib/gchecksum.c b/glib/gchecksum.c new file mode 100644 index 0000000..f5e9ba8 --- /dev/null +++ b/glib/gchecksum.c @@ -0,0 +1,1809 @@ +/* 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 "gchecksum.h" + +#include "gslice.h" +#include "gmem.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gtypes.h" +#include "glibintl.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_SHA512) + +/* 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]; + + union { + guchar data[MD5_DATASIZE]; + guint32 data32[MD5_DATASIZE / 4]; + } u; + + 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; + +#define SHA512_BLOCK_LEN 128 /* 1024 bits message block */ +#define SHA512_DIGEST_LEN 64 + +typedef struct +{ + guint64 H[8]; + + guint8 block[SHA512_BLOCK_LEN]; + guint8 block_len; + + guint64 data_len[2]; + + guchar digest[SHA512_DIGEST_LEN]; +} Sha512sum; + +struct _GChecksum +{ + GChecksumType type; + + gchar *digest_str; + + union { + Md5sum md5; + Sha1sum sha1; + Sha256sum sha256; + Sha512sum sha512; + } 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->u.data */ + bit = (bit >> 3) & 0x3f; + + /* handle any leading odd-sized chunks */ + if (bit) + { + guchar *p = md5->u.data + bit; + + bit = MD5_DATASIZE - bit; + if (length < bit) + { + memcpy (p, data, length); + return; + } + + memcpy (p, data, bit); + + md5_byte_reverse (md5->u.data, 16); + md5_transform (md5->buf, md5->u.data32); + + data += bit; + length -= bit; + } + + /* process data in 64-byte chunks */ + while (length >= MD5_DATASIZE) + { + memcpy (md5->u.data, data, MD5_DATASIZE); + + md5_byte_reverse (md5->u.data, 16); + md5_transform (md5->buf, md5->u.data32); + + data += MD5_DATASIZE; + length -= MD5_DATASIZE; + } + + /* handle any remaining bytes of data */ + memcpy (md5->u.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->u.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->u.data, 16); + md5_transform (md5->buf, md5->u.data32); + + /* Now fill the next block with 56 bytes */ + memset (md5->u.data, 0, MD5_DATASIZE - 8); + } + else + { + /* Pad block to 56 bytes */ + memset (p, 0, count - 8); + } + + md5_byte_reverse (md5->u.data, 14); + + /* Append length in bits and transform */ + md5->u.data32[14] = md5->bits[0]; + md5->u.data32[15] = md5->bits[1]; + + md5_transform (md5->buf, md5->u.data32); + 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->u.data, 0, sizeof (md5->u.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 iterations 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]; +} + +/* + * SHA-512 Checksum + * + * Implemented following FIPS-180-2 standard at + * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf. + * References in the form [§x.y.z] map to sections in that document. + * + * Author: Eduardo Lima Mitev + */ + +/* SHA-384 and SHA-512 functions [§4.1.3] */ +#define Ch(x,y,z) ((x & y) ^ (~x & z)) +#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z)) +#define SHR(n,x) (x >> n) +#define ROTR(n,x) (SHR (n, x) | (x << (64 - n))) +#define SIGMA0(x) (ROTR (28, x) ^ ROTR (34, x) ^ ROTR (39, x)) +#define SIGMA1(x) (ROTR (14, x) ^ ROTR (18, x) ^ ROTR (41, x)) +#define sigma0(x) (ROTR ( 1, x) ^ ROTR ( 8, x) ^ SHR ( 7, x)) +#define sigma1(x) (ROTR (19, x) ^ ROTR (61, x) ^ SHR ( 6, x)) + +#define PUT_UINT64(n,b,i) G_STMT_START{ \ + (b)[(i) ] = (guint8) (n >> 56); \ + (b)[(i) + 1] = (guint8) (n >> 48); \ + (b)[(i) + 2] = (guint8) (n >> 40); \ + (b)[(i) + 3] = (guint8) (n >> 32); \ + (b)[(i) + 4] = (guint8) (n >> 24); \ + (b)[(i) + 5] = (guint8) (n >> 16); \ + (b)[(i) + 6] = (guint8) (n >> 8); \ + (b)[(i) + 7] = (guint8) (n ); } G_STMT_END + +static void +sha512_sum_init (Sha512sum *sha512) +{ + /* Initial Hash Value [§5.3.4] */ + sha512->H[0] = 0x6a09e667f3bcc908; + sha512->H[1] = 0xbb67ae8584caa73b; + sha512->H[2] = 0x3c6ef372fe94f82b; + sha512->H[3] = 0xa54ff53a5f1d36f1; + sha512->H[4] = 0x510e527fade682d1; + sha512->H[5] = 0x9b05688c2b3e6c1f; + sha512->H[6] = 0x1f83d9abfb41bd6b; + sha512->H[7] = 0x5be0cd19137e2179; + + sha512->block_len = 0; + + sha512->data_len[0] = 0; + sha512->data_len[1] = 0; +} + +/* SHA-384 and SHA-512 constants [§4.2.3] */ +static const guint64 SHA512_K[80] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, + 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, + 0x3956c25bf348b538, 0x59f111f1b605d019, + 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, + 0xd807aa98a3030242, 0x12835b0145706fbe, + 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, + 0x9bdc06a725c71235, 0xc19bf174cf692694, + 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, + 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, + 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, + 0xb00327c898fb213f, 0xbf597fc7beef0ee4, + 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, + 0x27b70a8546d22ffc, 0x2e1b21385c26c926, + 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, + 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, + 0xc24b8b70d0f89791, 0xc76c51a30654be30, + 0xd192e819d6ef5218, 0xd69906245565a910, + 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, + 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, + 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, + 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, + 0x748f82ee5defb2fc, 0x78a5636f43172f60, + 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, + 0xbef9a3f7b2c67915, 0xc67178f2e372532b, + 0xca273eceea26619c, 0xd186b8c721c0c207, + 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, + 0x06f067aa72176fba, 0x0a637dc5a2c898a6, + 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, + 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, + 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, + 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 +}; + +static void +sha512_transform (guint64 H[8], + guint8 const data[SHA512_BLOCK_LEN]) +{ + gint i; + gint t; + guint64 a, b, c, d, e, f, g, h; + guint64 M[16]; + guint64 W[80]; + + /* SHA-512 hash computation [§6.3.2] */ + + /* prepare the message schedule */ + for (i = 0; i < 16; i++) + { + gint p = i * 8; + + M[i] = + ((guint64) data[p + 0] << 56) | + ((guint64) data[p + 1] << 48) | + ((guint64) data[p + 2] << 40) | + ((guint64) data[p + 3] << 32) | + ((guint64) data[p + 4] << 24) | + ((guint64) data[p + 5] << 16) | + ((guint64) data[p + 6] << 8) | + ((guint64) data[p + 7] ); + } + + for (t = 0; t < 80; t++) + if (t < 16) + W[t] = M[t]; + else + W[t] = sigma1 (W[t - 2]) + W[t - 7] + sigma0 (W[t - 15]) + W[t - 16]; + + /* initialize the eight working variables */ + a = H[0]; + b = H[1]; + c = H[2]; + d = H[3]; + e = H[4]; + f = H[5]; + g = H[6]; + h = H[7]; + + for (t = 0; t < 80; t++) + { + guint64 T1, T2; + + T1 = h + SIGMA1 (e) + Ch (e, f, g) + SHA512_K[t] + W[t]; + T2 = SIGMA0 (a) + Maj (a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + /* Compute the intermediate hash value H */ + H[0] += a; + H[1] += b; + H[2] += c; + H[3] += d; + H[4] += e; + H[5] += f; + H[6] += g; + H[7] += h; +} + +static void +sha512_sum_update (Sha512sum *sha512, + const guchar *buffer, + gsize length) +{ + gsize block_left, offset = 0; + + if (length == 0) + return; + + sha512->data_len[0] += length * 8; + if (sha512->data_len[0] < length) + sha512->data_len[1]++; + + /* try to fill current block */ + block_left = SHA512_BLOCK_LEN - sha512->block_len; + if (block_left > 0) + { + gsize fill_len; + + fill_len = MIN (block_left, length); + memcpy (sha512->block + sha512->block_len, buffer, fill_len); + sha512->block_len += fill_len; + length -= fill_len; + offset += fill_len; + + if (sha512->block_len == SHA512_BLOCK_LEN) + { + sha512_transform (sha512->H, sha512->block); + sha512->block_len = 0; + } + } + + /* process complete blocks */ + while (length >= SHA512_BLOCK_LEN) + { + memcpy (sha512->block, buffer + offset, SHA512_BLOCK_LEN); + + sha512_transform (sha512->H, sha512->block); + + length -= SHA512_BLOCK_LEN; + offset += SHA512_BLOCK_LEN; + } + + /* keep remaining data for next block */ + if (length > 0) + { + memcpy (sha512->block, buffer + offset, length); + sha512->block_len = length; + } +} + +static void +sha512_sum_close (Sha512sum *sha512) +{ + guint l; + gint zeros; + guint8 pad[SHA512_BLOCK_LEN * 2] = { 0, }; + guint pad_len = 0; + gint i; + + /* apply padding [§5.1.2] */ + l = sha512->block_len * 8; + zeros = 896 - (l + 1); + + if (zeros < 0) + zeros += 128 * 8; + + pad[0] = 0x80; /* 1000 0000 */ + zeros -= 7; + pad_len++; + + memset (pad + pad_len, 0x00, zeros / 8); + pad_len += zeros / 8; + zeros = zeros % 8; + + /* put message bit length at the end of padding */ + PUT_UINT64 (sha512->data_len[1], pad, pad_len); + pad_len += 8; + + PUT_UINT64 (sha512->data_len[0], pad, pad_len); + pad_len += 8; + + /* update checksum with the padded block */ + sha512_sum_update (sha512, pad, pad_len); + + /* copy resulting 64-bit words into digest */ + for (i = 0; i < 8; i++) + PUT_UINT64 (sha512->H[i], sha512->digest, i * 8); +} + +static gchar * +sha512_sum_to_string (Sha512sum *sha512) +{ + return digest_to_string (sha512->digest, SHA512_DIGEST_LEN); +} + +static void +sha512_sum_digest (Sha512sum *sha512, + guint8 *digest) +{ + memcpy (digest, sha512->digest, SHA512_DIGEST_LEN); +} + +#undef Ch +#undef Maj +#undef SHR +#undef ROTR +#undef SIGMA0 +#undef SIGMA1 +#undef sigma0 +#undef sigma1 + +#undef PUT_UINT64 + +/* + * 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; + case G_CHECKSUM_SHA512: + len = SHA512_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: (transfer full): 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; + case G_CHECKSUM_SHA512: + sha512_sum_init (&(checksum->sum.sha512)); + 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: (array length=length) (element-type guint8): 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 (length == 0 || 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; + case G_CHECKSUM_SHA512: + sha512_sum_update (&(checksum->sum.sha512), 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 + */ +const 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; + case G_CHECKSUM_SHA512: + sha512_sum_close (&(checksum->sum.sha512)); + str = sha512_sum_to_string (&(checksum->sum.sha512)); + break; + default: + g_assert_not_reached (); + break; + } + + checksum->digest_str = str; + + return checksum->digest_str; +} + +/** + * g_checksum_get_digest: (skip) + * @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; + case G_CHECKSUM_SHA512: + if (checksum_open) + { + sha512_sum_close (&(checksum->sum.sha512)); + str = sha512_sum_to_string (&(checksum->sum.sha512)); + } + sha512_sum_digest (&(checksum->sum.sha512), 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: (array length=length) (element-type guint8): 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 (length == 0 || 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 (length == 0 || str != NULL, NULL); + + if (length < 0) + length = strlen (str); + + return g_compute_checksum_for_data (checksum_type, (const guchar *) str, length); +} + +/** + * g_compute_checksum_for_bytes: + * @checksum_type: a #GChecksumType + * @data: binary blob to compute the digest of + * + * Computes the checksum for a binary @data. 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.34 + */ +gchar * +g_compute_checksum_for_bytes (GChecksumType checksum_type, + GBytes *data) +{ + gconstpointer byte_data; + gsize length; + + g_return_val_if_fail (IS_VALID_TYPE (checksum_type), NULL); + g_return_val_if_fail (data != NULL, NULL); + + byte_data = g_bytes_get_data (data, &length); + return g_compute_checksum_for_data (checksum_type, byte_data, length); +} diff --git a/glib/gchecksum.h b/glib/gchecksum.h new file mode 100644 index 0000000..ba500a2 --- /dev/null +++ b/glib/gchecksum.h @@ -0,0 +1,103 @@ +/* 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. + */ + +#ifndef __G_CHECKSUM_H__ +#define __G_CHECKSUM_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#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 + * @G_CHECKSUM_SHA512: Use the SHA-512 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, + G_CHECKSUM_SHA512 +} 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; + +GLIB_AVAILABLE_IN_ALL +gssize g_checksum_type_get_length (GChecksumType checksum_type); + +GLIB_AVAILABLE_IN_ALL +GChecksum * g_checksum_new (GChecksumType checksum_type); +GLIB_AVAILABLE_IN_ALL +void g_checksum_reset (GChecksum *checksum); +GLIB_AVAILABLE_IN_ALL +GChecksum * g_checksum_copy (const GChecksum *checksum); +GLIB_AVAILABLE_IN_ALL +void g_checksum_free (GChecksum *checksum); +GLIB_AVAILABLE_IN_ALL +void g_checksum_update (GChecksum *checksum, + const guchar *data, + gssize length); +GLIB_AVAILABLE_IN_ALL +const gchar * g_checksum_get_string (GChecksum *checksum); +GLIB_AVAILABLE_IN_ALL +void g_checksum_get_digest (GChecksum *checksum, + guint8 *buffer, + gsize *digest_len); + +GLIB_AVAILABLE_IN_ALL +gchar *g_compute_checksum_for_data (GChecksumType checksum_type, + const guchar *data, + gsize length); +GLIB_AVAILABLE_IN_ALL +gchar *g_compute_checksum_for_string (GChecksumType checksum_type, + const gchar *str, + gssize length); + +GLIB_AVAILABLE_IN_2_34 +gchar *g_compute_checksum_for_bytes (GChecksumType checksum_type, + GBytes *data); + +G_END_DECLS + +#endif /* __G_CHECKSUM_H__ */ diff --git a/glib/gconstructor.h b/glib/gconstructor.h new file mode 100644 index 0000000..c5cff19 --- /dev/null +++ b/glib/gconstructor.h @@ -0,0 +1,91 @@ +/* + If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and + destructors, in a sane way, including e.g. on library unload. If not you're on + your own. + + Some compilers need #pragma to handle this, which does not work with macros, + so the way you need to use this is (for constructors): + + #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA + #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) + #endif + G_DEFINE_CONSTRUCTOR(my_constructor) + static void my_constructor(void) { + ... + } + +*/ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); +#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); + +#elif defined (_MSC_VER) && (_MSC_VER >= 1500) +/* Visual studio 2008 and later has _Pragma */ + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper; + +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined (_MSC_VER) + +#define G_HAS_CONSTRUCTORS 1 + +/* Pre Visual studio 2008 must use #pragma section */ +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined(__SUNPRO_C) + +/* This is not tested, but i believe it should work, based on: + * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c + */ + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + init(_func) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + fini(_func) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); + +#else + +/* constructors not supported for this compiler */ + +#endif + diff --git a/glib/gconvert.c b/glib/gconvert.c new file mode 100644 index 0000000..3320a5e --- /dev/null +++ b/glib/gconvert.c @@ -0,0 +1,2247 @@ +/* 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 "glibconfig.h" + +#ifndef G_OS_WIN32 +#include +#endif +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include "win_iconv.c" +#endif + +#ifdef G_PLATFORM_WIN32 +#define STRICT +#include +#undef STRICT +#endif + +#include "gconvert.h" + +#include "gcharsetprivate.h" +#include "gslist.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gthread.h" +#include "gunicode.h" +#include "gfileutils.h" + +#ifdef NEED_ICONV_CACHE +#include "glist.h" +#include "ghash.h" +#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) \ + && !defined (__APPLE_CC__) && !defined (__LP_64__) +#error GNU libiconv not in use but included iconv.h is from libiconv +#endif + + +/** + * SECTION:conversions + * @title: Character Set Conversion + * @short_description: convert strings between different character sets + * + * The g_convert() family of function wraps the functionality of iconv(). In + * addition to pure character set conversions, GLib has functions to deal + * with the extra complications of encodings for file names. + * + * + * 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, + * + * + * 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. + * + * + * + *
+ */ + +/* 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 + +G_DEFINE_QUARK (g_convert_error, 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; +} + +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 occurring, 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: + 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) + { + 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: (out): 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: (out): the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occurring, 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 occurring, 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 occurring, 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 occurring, 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 (const gchar ***filename_charsets) +{ + static GPrivate cache_private = G_PRIVATE_INIT (filename_charset_cache_free); + GFilenameCharsetCache *cache = g_private_get (&cache_private); + const gchar *charset; + + if (!cache) + { + cache = g_new0 (GFilenameCharsetCache, 1); + g_private_set (&cache_private, cache); + } + + 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 (const 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; +} + +/** + * 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 occurring, 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; + + g_return_val_if_fail (opsysstring != NULL, NULL); + + 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; + + g_return_val_if_fail (opsysstring != NULL, NULL); + + 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: (out) (allow-none): 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: (out): the number of bytes stored in the output buffer (not + * including the terminating nul). + * @error: location to store the error occurring, 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: (array length=bytes_written) (element-type guint8) (transfer full): + * 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: (out) (allow-none): 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 occurring, 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: (type filename): 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: (allow-none): A UTF-8 encoded hostname, or %NULL for none. + * @error: location to store the error occurring, 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: (transfer full): 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 cannot 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 cannot 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; +} diff --git a/glib/gconvert.h b/glib/gconvert.h new file mode 100644 index 0000000..1945c07 --- /dev/null +++ b/glib/gconvert.h @@ -0,0 +1,200 @@ +/* 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_CONVERT_H__ +#define __G_CONVERT_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * GConvertError: + * @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. + * + * Error codes returned by character set conversion routines. + */ +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; + +/** + * G_CONVERT_ERROR: + * + * Error domain for character set conversions. Errors in this domain will + * be from the #GConvertError enumeration. See #GError for information on + * error domains. + */ +#define G_CONVERT_ERROR g_convert_error_quark() +GLIB_AVAILABLE_IN_ALL +GQuark g_convert_error_quark (void); + +/** + * GIconv: + * + * The GIConv struct wraps an + * iconv() conversion descriptor. It contains private data + * and should only be accessed using the following functions. + */ +typedef struct _GIConv *GIConv; + +GLIB_AVAILABLE_IN_ALL +GIConv g_iconv_open (const gchar *to_codeset, + const gchar *from_codeset); +GLIB_AVAILABLE_IN_ALL +gsize g_iconv (GIConv converter, + gchar **inbuf, + gsize *inbytes_left, + gchar **outbuf, + gsize *outbytes_left); +GLIB_AVAILABLE_IN_ALL +gint g_iconv_close (GIConv converter); + + +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +gchar* g_convert_with_iconv (const gchar *str, + gssize len, + GIConv converter, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_locale_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_filename_to_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_filename_from_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_from_uri (const gchar *uri, + gchar **hostname, + GError **error) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_to_uri (const gchar *filename, + const gchar *hostname, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_display_name (const gchar *filename) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gboolean g_get_filename_charsets (const gchar ***charsets); + +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_display_basename (const gchar *filename) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gchar **g_uri_list_extract_uris (const gchar *uri_list) G_GNUC_MALLOC; + +#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 + +GLIB_AVAILABLE_IN_ALL +gchar* g_filename_to_utf8_utf8 (const gchar *opsysstring, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_filename_from_utf8_utf8 (const gchar *utf8string, + gssize len, + gsize *bytes_read, + gsize *bytes_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_from_uri_utf8 (const gchar *uri, + gchar **hostname, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_filename_to_uri_utf8 (const gchar *filename, + const gchar *hostname, + GError **error) G_GNUC_MALLOC; +#endif + +G_END_DECLS + +#endif /* __G_CONVERT_H__ */ diff --git a/glib/gdataset.c b/glib/gdataset.c new file mode 100644 index 0000000..006bdc1 --- /dev/null +++ b/glib/gdataset.c @@ -0,0 +1,1244 @@ +/* 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 "gdataset.h" +#include "gbitlock.h" + +#include "gslice.h" +#include "gdatasetprivate.h" +#include "ghash.h" +#include "gquark.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gthread.h" +#include "glib_trace.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 (2048) + +#define G_DATALIST_FLAGS_MASK_INTERNAL 0x7 + +/* 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_INTERNAL)) + +#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_INTERNAL) | (gsize) pointer); \ + } while (!g_atomic_pointer_compare_and_exchange ((void**) datalist, _oldv, _newv)); \ +} G_STMT_END + +/* --- structures --- */ +typedef struct { + GQuark key; + gpointer data; + GDestroyNotify destroy; +} GDataElt; + +typedef struct _GDataset GDataset; +struct _GData +{ + guint32 len; /* Number of elements */ + guint32 alloc; /* Number of allocated elements */ + GDataElt data[1]; /* Flexible array */ +}; + +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); + +/* Locking model: + * Each standalone GDataList is protected by a bitlock in the datalist pointer, + * which protects that modification of the non-flags part of the datalist pointer + * and the contents of the datalist. + * + * For GDataSet we have a global lock g_dataset_global that protects + * the global dataset hash and cache, and additionally it protects the + * datalist such that we can avoid to use the bit lock in a few places + * where it is easy. + */ + +/* --- variables --- */ +G_LOCK_DEFINE_STATIC (g_dataset_global); +static GHashTable *g_dataset_location_ht = NULL; +static GDataset *g_dataset_cached = NULL; /* should this be + thread specific? */ + +/* --- functions --- */ + +#define DATALIST_LOCK_BIT 2 + +static void +g_datalist_lock (GData **datalist) +{ + g_pointer_bit_lock ((void **)datalist, DATALIST_LOCK_BIT); +} + +static void +g_datalist_unlock (GData **datalist) +{ + g_pointer_bit_unlock ((void **)datalist, DATALIST_LOCK_BIT); +} + +/* Called with the datalist lock held, or the dataset global + * lock for dataset lists + */ +static void +g_datalist_clear_i (GData **datalist) +{ + GData *data; + gint i; + + data = G_DATALIST_GET_POINTER (datalist); + G_DATALIST_SET_POINTER (datalist, NULL); + + if (data) + { + G_UNLOCK (g_dataset_global); + for (i = 0; i < data->len; i++) + { + if (data->data[i].data && data->data[i].destroy) + data->data[i].destroy (data->data[i].data); + } + G_LOCK (g_dataset_global); + + g_free (data); + } + +} + +/** + * 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) +{ + GData *data; + gint i; + + g_return_if_fail (datalist != NULL); + + g_datalist_lock (datalist); + + data = G_DATALIST_GET_POINTER (datalist); + G_DATALIST_SET_POINTER (datalist, NULL); + + g_datalist_unlock (datalist); + + if (data) + { + for (i = 0; i < data->len; i++) + { + if (data->data[i].data && data->data[i].destroy) + data->data[i].destroy (data->data[i].data); + } + + g_free (data); + } +} + +/* 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 (G_DATALIST_GET_POINTER(&dataset->datalist) == NULL) + { + 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 if dataset != null */ +static inline gpointer +g_data_set_internal (GData **datalist, + GQuark key_id, + gpointer new_data, + GDestroyNotify new_destroy_func, + GDataset *dataset) +{ + GData *d, *old_d; + GDataElt old, *data, *data_last, *data_end; + + g_datalist_lock (datalist); + + d = G_DATALIST_GET_POINTER (datalist); + + if (new_data == NULL) /* remove */ + { + if (d) + { + data = d->data; + data_last = data + d->len - 1; + while (data <= data_last) + { + if (data->key == key_id) + { + old = *data; + if (data != data_last) + *data = *data_last; + d->len--; + + /* We don't bother to shrink, but if all data are now gone + * we at least free the memory + */ + if (d->len == 0) + { + G_DATALIST_SET_POINTER (datalist, NULL); + g_free (d); + /* datalist may be situated in dataset, so must not be + * unlocked after we free it + */ + g_datalist_unlock (datalist); + + /* the dataset destruction *must* be done + * prior to invocation of the data destroy function + */ + if (dataset) + g_dataset_destroy_internal (dataset); + } + else + { + g_datalist_unlock (datalist); + } + + /* We found and removed an old value + * the GData struct *must* already be unlinked + * when invoking the destroy function. + * we use (new_data==NULL && new_destroy_func!=NULL) as + * a special hint combination to "steal" + * data without destroy notification + */ + if (old.destroy && !new_destroy_func) + { + if (dataset) + G_UNLOCK (g_dataset_global); + old.destroy (old.data); + if (dataset) + G_LOCK (g_dataset_global); + old.data = NULL; + } + + return old.data; + } + data++; + } + } + } + else + { + old.data = NULL; + if (d) + { + data = d->data; + data_end = data + d->len; + while (data < data_end) + { + if (data->key == key_id) + { + if (!data->destroy) + { + data->data = new_data; + data->destroy = new_destroy_func; + g_datalist_unlock (datalist); + } + else + { + old = *data; + data->data = new_data; + data->destroy = new_destroy_func; + + g_datalist_unlock (datalist); + + /* We found and replaced an old value + * the GData struct *must* already be unlinked + * when invoking the destroy function. + */ + if (dataset) + G_UNLOCK (g_dataset_global); + old.destroy (old.data); + if (dataset) + G_LOCK (g_dataset_global); + } + return NULL; + } + data++; + } + } + + /* The key was not found, insert it */ + old_d = d; + if (d == NULL) + { + d = g_malloc (sizeof (GData)); + d->len = 0; + d->alloc = 1; + } + else if (d->len == d->alloc) + { + d->alloc = d->alloc * 2; + d = g_realloc (d, sizeof (GData) + (d->alloc - 1) * sizeof (GDataElt)); + } + if (old_d != d) + G_DATALIST_SET_POINTER (datalist, d); + + d->data[d->len].key = key_id; + d->data[d->len].data = new_data; + d->data[d->len].destroy = new_destroy_func; + d->len++; + } + + g_datalist_unlock (datalist); + + 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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_data_set_internal (datalist, key_id, data, destroy_func, NULL); +} + +/** + * g_dataset_id_remove_no_notify: + * @dataset_location: the location identifying the dataset. + * @key_id: the #GQuark ID identifying the data element. + * + * Removes an element, without calling its destroy notification + * function. + * + * Returns: the data previously stored at @key_id, or %NULL if none. + **/ +/** + * 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. + * + * Removes an element, without calling its destroy notification + * function. + * + * Returns: the data previously stored at @key_id, or %NULL if none. + **/ +/** + * 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); + + if (key_id) + ret_data = g_data_set_internal (datalist, key_id, NULL, (GDestroyNotify) 42, NULL); + + 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. + * + * Gets the data element corresponding to a #GQuark. + * + * Returns: the data element corresponding to the #GQuark, or %NULL if + * it is not found. + **/ +/** + * g_dataset_get_data: + * @l: the location identifying the dataset. + * @k: the string identifying the data element. + * + * Gets the data element corresponding to a string. + * + * Returns: the data element corresponding to the string, or %NULL if + * it is not found. + **/ +gpointer +g_dataset_id_get_data (gconstpointer dataset_location, + GQuark key_id) +{ + gpointer retval = 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) + retval = g_datalist_id_get_data (&dataset->datalist, key_id); + } + G_UNLOCK (g_dataset_global); + + return retval; +} + +/** + * g_datalist_id_get_data: + * @datalist: a datalist. + * @key_id: the #GQuark identifying a data element. + * + * Retrieves the data element corresponding to @key_id. + * + * Returns: the data element, or %NULL if it is not found. + */ +gpointer +g_datalist_id_get_data (GData **datalist, + GQuark key_id) +{ + return g_datalist_id_dup_data (datalist, key_id, NULL, NULL); +} + +/** + * GDuplicateFunc: + * @data: the data to duplicate + * @user_data: user data that was specified in g_datalist_id_dup_data() + * + * The type of functions that are used to 'duplicate' an object. + * What this means depends on the context, it could just be + * incrementing the reference count, if @data is a ref-counted + * object. + * + * Returns: a duplicate of data + */ + +/** + * g_datalist_id_dup_data: + * @datalist: location of a datalist + * @key_id: the #GQuark identifying a data element + * @dup_func: (allow-none): function to duplicate the old value + * @user_data: (allow-none): passed as user_data to @dup_func + * + * This is a variant of g_datalist_id_get_data() which + * returns a 'duplicate' of the value. @dup_func defines the + * meaning of 'duplicate' in this context, it could e.g. + * take a reference on a ref-counted object. + * + * If the @key_id is not set in the datalist then @dup_func + * will be called with a %NULL argument. + * + * Note that @dup_func is called while the datalist is locked, so it + * is not allowed to read or modify the datalist. + * + * This function can be useful to avoid races when multiple + * threads are using the same datalist and the same key. + * + * Returns: the result of calling @dup_func on the value + * associated with @key_id in @datalist, or %NULL if not set. + * If @dup_func is %NULL, the value is returned unmodified. + * + * Since: 2.34 + */ +gpointer +g_datalist_id_dup_data (GData **datalist, + GQuark key_id, + GDuplicateFunc dup_func, + gpointer user_data) +{ + gpointer val = NULL; + gpointer retval = NULL; + GData *d; + GDataElt *data, *data_end; + + g_return_val_if_fail (datalist != NULL, NULL); + g_return_val_if_fail (key_id != 0, NULL); + + g_datalist_lock (datalist); + + d = G_DATALIST_GET_POINTER (datalist); + if (d) + { + data = d->data; + data_end = data + d->len - 1; + while (data <= data_end) + { + if (data->key == key_id) + { + val = data->data; + break; + } + data++; + } + } + + if (dup_func) + retval = dup_func (val, user_data); + else + retval = val; + + g_datalist_unlock (datalist); + + return retval; +} + +/** + * g_datalist_id_replace_data: + * @datalist: location of a datalist + * @key_id: the #GQuark identifying a data element + * @oldval: (allow-none): the old value to compare against + * @newval: (allow-none): the new value to replace it with + * @destroy: (allow-none): destroy notify for the new value + * @old_destroy: (allow-none): destroy notify for the existing value + * + * Compares the member that is associated with @key_id in + * @datalist to @oldval, and if they are the same, replace + * @oldval with @newval. + * + * This is like a typical atomic compare-and-exchange + * operation, for a member of @datalist. + * + * If the previous value was replaced then ownership of the + * old value (@oldval) is passed to the caller, including + * the registred destroy notify for it (passed out in @old_destroy). + * Its up to the caller to free this as he wishes, which may + * or may not include using @old_destroy as sometimes replacement + * should not destroy the object in the normal way. + * + * Return: %TRUE if the existing value for @key_id was replaced + * by @newval, %FALSE otherwise. + * + * Since: 2.34 + */ +gboolean +g_datalist_id_replace_data (GData **datalist, + GQuark key_id, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy) +{ + gpointer val = NULL; + GData *d; + GDataElt *data, *data_end; + + g_return_val_if_fail (datalist != NULL, FALSE); + g_return_val_if_fail (key_id != 0, FALSE); + + if (old_destroy) + *old_destroy = NULL; + + g_datalist_lock (datalist); + + d = G_DATALIST_GET_POINTER (datalist); + if (d) + { + data = d->data; + data_end = data + d->len - 1; + while (data <= data_end) + { + if (data->key == key_id) + { + val = data->data; + if (val == oldval) + { + if (old_destroy) + *old_destroy = data->destroy; + if (newval != NULL) + { + data->data = newval; + data->destroy = destroy; + } + else + { + if (data != data_end) + *data = *data_end; + d->len--; + + /* We don't bother to shrink, but if all data are now gone + * we at least free the memory + */ + if (d->len == 0) + { + G_DATALIST_SET_POINTER (datalist, NULL); + g_free (d); + } + } + } + break; + } + data++; + } + } + + if (val == NULL && oldval == NULL && newval != NULL) + { + GData *old_d; + + /* insert newval */ + old_d = d; + if (d == NULL) + { + d = g_malloc (sizeof (GData)); + d->len = 0; + d->alloc = 1; + } + else if (d->len == d->alloc) + { + d->alloc = d->alloc * 2; + d = g_realloc (d, sizeof (GData) + (d->alloc - 1) * sizeof (GDataElt)); + } + if (old_d != d) + G_DATALIST_SET_POINTER (datalist, d); + + d->data[d->len].key = key_id; + d->data[d->len].data = newval; + d->data[d->len].destroy = destroy; + d->len++; + } + + g_datalist_unlock (datalist); + + return val == oldval; +} + +/** + * g_datalist_get_data: + * @datalist: a datalist. + * @key: the string identifying a data element. + * + * Gets a data element, using its string identifier. This is slower than + * g_datalist_id_get_data() because it compares strings. + * + * Returns: the data element, or %NULL if it is not found. + **/ +gpointer +g_datalist_get_data (GData **datalist, + const gchar *key) +{ + gpointer res = NULL; + GData *d; + GDataElt *data, *data_end; + + g_return_val_if_fail (datalist != NULL, NULL); + + g_datalist_lock (datalist); + + d = G_DATALIST_GET_POINTER (datalist); + if (d) + { + data = d->data; + data_end = data + d->len; + while (data < data_end) + { + if (strcmp (g_quark_to_string (data->key), key) == 0) + { + res = data->data; + break; + } + data++; + } + } + + g_datalist_unlock (datalist); + + return res; +} + +/** + * 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) + g_datalist_foreach (&dataset->datalist, func, 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) +{ + GData *d; + int i, j, len; + GQuark *keys; + + g_return_if_fail (datalist != NULL); + g_return_if_fail (func != NULL); + + d = G_DATALIST_GET_POINTER (datalist); + if (d == NULL) + return; + + /* We make a copy of the keys so that we can handle it changing + in the callback */ + len = d->len; + keys = g_new (GQuark, len); + for (i = 0; i < len; i++) + keys[i] = d->data[i].key; + + for (i = 0; i < len; i++) + { + /* A previous callback might have removed a later item, so always check that + it still exists before calling */ + d = G_DATALIST_GET_POINTER (datalist); + + if (d == NULL) + break; + for (j = 0; j < d->len; j++) + { + if (d->data[j].key == keys[i]) { + func (d->data[i].key, d->data[i].data, user_data); + break; + } + } + } + g_free (keys); +} + +/** + * 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) +{ + g_return_if_fail (datalist != NULL); + g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); + + g_atomic_pointer_or (datalist, (gsize)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) +{ + g_return_if_fail (datalist != NULL); + g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0); + + g_atomic_pointer_and (datalist, ~(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; +} diff --git a/glib/gdataset.h b/glib/gdataset.h new file mode 100644 index 0000000..6d69e60 --- /dev/null +++ b/glib/gdataset.h @@ -0,0 +1,152 @@ +/* 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_DATASET_H__ +#define __G_DATASET_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GData GData; + +typedef void (*GDataForeachFunc) (GQuark key_id, + gpointer data, + gpointer user_data); + +/* Keyed Data List + */ +GLIB_AVAILABLE_IN_ALL +void g_datalist_init (GData **datalist); +GLIB_AVAILABLE_IN_ALL +void g_datalist_clear (GData **datalist); +GLIB_AVAILABLE_IN_ALL +gpointer g_datalist_id_get_data (GData **datalist, + GQuark key_id); +GLIB_AVAILABLE_IN_ALL +void g_datalist_id_set_data_full (GData **datalist, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func); + +typedef gpointer (*GDuplicateFunc) (gpointer data, gpointer user_data); + +GLIB_AVAILABLE_IN_2_34 +gpointer g_datalist_id_dup_data (GData **datalist, + GQuark key_id, + GDuplicateFunc dup_func, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +gboolean g_datalist_id_replace_data (GData **datalist, + GQuark key_id, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy); + +GLIB_AVAILABLE_IN_ALL +gpointer g_datalist_id_remove_no_notify (GData **datalist, + GQuark key_id); +GLIB_AVAILABLE_IN_ALL +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 + +GLIB_AVAILABLE_IN_ALL +void g_datalist_set_flags (GData **datalist, + guint flags); +GLIB_AVAILABLE_IN_ALL +void g_datalist_unset_flags (GData **datalist, + guint flags); +GLIB_AVAILABLE_IN_ALL +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_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 + */ +GLIB_AVAILABLE_IN_ALL +void g_dataset_destroy (gconstpointer dataset_location); +GLIB_AVAILABLE_IN_ALL +gpointer g_dataset_id_get_data (gconstpointer dataset_location, + GQuark key_id); +GLIB_AVAILABLE_IN_ALL +gpointer g_datalist_get_data (GData **datalist, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +void g_dataset_id_set_data_full (gconstpointer dataset_location, + GQuark key_id, + gpointer data, + GDestroyNotify destroy_func); +GLIB_AVAILABLE_IN_ALL +gpointer g_dataset_id_remove_no_notify (gconstpointer dataset_location, + GQuark key_id); +GLIB_AVAILABLE_IN_ALL +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..80d0ccf --- /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..d9b25f3 --- /dev/null +++ b/glib/gdate.c @@ -0,0 +1,2551 @@ +/* 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" + +#define DEBUG_MSG(x) /* */ +#ifdef G_ENABLE_DEBUG +/* #define DEBUG_MSG(args) g_message args ; */ +#endif + +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include +#endif + +#include "gdate.h" + +#include "gconvert.h" +#include "gmem.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gthread.h" +#include "gunicode.h" + +#ifdef G_OS_WIN32 +#include "garray.h" +#endif + +/** + * SECTION:date + * @title: Date and Time Functions + * @short_description: 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 also features #GDateTime which represents a precise time. + */ + +/** + * G_USEC_PER_SEC: + * + * Number of microseconds in one second (1 million). + * This macro is provided for code readability. + */ + +/** + * GTimeVal: + * @tv_sec: seconds + * @tv_usec: microseconds + * + * Represents a precise time, with seconds and microseconds. + * Similar to the struct timeval returned by + * the gettimeofday() UNIX system call. + * + * GLib is attempting to unify around the use of 64bit integers to + * represent microsecond-precision time. As such, this type will be + * removed from a future version of GLib. + */ + +/** + * GDate: + * @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 + * + * 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. + */ + +/** + * GTime: + * + * Simply a replacement for time_t. It has been deprecated + * 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; + * ]| + */ + +/** + * GDateDMY: + * @G_DATE_DAY: a day + * @G_DATE_MONTH: a month + * @G_DATE_YEAR: a year + * + * 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. + */ + +/** + * GDateDay: + * + * Integer representing a day of the month; between 1 and + * 31. #G_DATE_BAD_DAY represents an invalid day of the month. + */ + +/** + * GDateMonth: + * @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 + * + * Enumeration representing a month; values are #G_DATE_JANUARY, + * #G_DATE_FEBRUARY, etc. #G_DATE_BAD_MONTH is the invalid value. + */ + +/** + * 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. + */ + +/** + * GDateWeekday: + * @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 + * + * 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_DAY: + * + * Represents an invalid #GDateDay. + */ + +/** + * G_DATE_BAD_JULIAN: + * + * Represents an invalid Julian day number. + */ + +/** + * G_DATE_BAD_YEAR: + * + * Represents an invalid year. + */ + +/** + * g_date_new: + * + * 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 + */ +GDate* +g_date_new (void) +{ + GDate *d = g_new0 (GDate, 1); /* happily, 0 is the invalid flag for everything. */ + + return d; +} + +/** + * g_date_new_dmy: + * @day: day of the month + * @month: month of the year + * @year: 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. + * + * Returns: a newly-allocated #GDate initialized with @day, @month, and @year + */ +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; +} + +/** + * g_date_new_julian: + * @julian_day: days since January 1, Year 1 + * + * 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. + * + * Returns: a newly-allocated #GDate initialized with @julian_day + */ +GDate* +g_date_new_julian (guint32 julian_day) +{ + GDate *d; + g_return_val_if_fail (g_date_valid_julian (julian_day), NULL); + + d = g_new (GDate, 1); + + d->julian = TRUE; + d->dmy = FALSE; + + d->julian_days = julian_day; + + g_assert (g_date_valid (d)); + + return d; +} + +/** + * g_date_free: + * @date: a #GDate to free + * + * Frees a #GDate returned from g_date_new(). + */ +void +g_date_free (GDate *date) +{ + g_return_if_fail (date != NULL); + + g_free (date); +} + +/** + * g_date_valid: + * @date: a #GDate to check + * + * 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. + * + * Returns: Whether the date is valid + */ +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 } +}; + +/** + * g_date_valid_month: + * @month: month + * + * Returns %TRUE if the month value is valid. The 12 #GDateMonth + * enumeration values are the only valid months. + * + * Returns: %TRUE if the month is valid + */ +gboolean +g_date_valid_month (GDateMonth m) +{ + return ( (m > G_DATE_BAD_MONTH) && (m < 13) ); +} + +/** + * g_date_valid_year: + * @year: 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. + * + * Returns: %TRUE if the year is valid + */ +gboolean +g_date_valid_year (GDateYear y) +{ + return ( y > G_DATE_BAD_YEAR ); +} + +/** + * g_date_valid_day: + * @day: day to check + * + * Returns %TRUE if the day of the month is valid (a day is valid if it's + * between 1 and 31 inclusive). + * + * Returns: %TRUE if the day is valid + */ + +gboolean +g_date_valid_day (GDateDay d) +{ + return ( (d > G_DATE_BAD_DAY) && (d < 32) ); +} + +/** + * g_date_valid_weekday: + * @weekday: weekday + * + * Returns %TRUE if the weekday is valid. The seven #GDateWeekday enumeration + * values are the only valid weekdays. + * + * Returns: %TRUE if the weekday is valid + */ +gboolean +g_date_valid_weekday (GDateWeekday w) +{ + return ( (w > G_DATE_BAD_WEEKDAY) && (w < 8) ); +} + +/** + * g_date_valid_julian: + * @julian_date: Julian day to check + * + * Returns %TRUE if the Julian day is valid. Anything greater than zero + * is basically a valid Julian, though there is a 32-bit limit. + * + * Returns: %TRUE if the Julian day is valid + */ +gboolean +g_date_valid_julian (guint32 j) +{ + return (j > G_DATE_BAD_JULIAN); +} + +/** + * g_date_valid_dmy: + * @day: day + * @month: month + * @year: 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). + * + * Returns: %TRUE if the date is a valid one + */ +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; +} + +/** + * g_date_get_weekday: + * @date: a #GDate + * + * Returns the day of the week for a #GDate. The date must be valid. + * + * Returns: day of the week as a #GDateWeekday. + */ +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; +} + +/** + * g_date_get_month: + * @date: a #GDate to get the month from + * + * Returns the month of the year. The date must be valid. + * + * Returns: month of the year as a #GDateMonth + */ +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; +} + +/** + * g_date_get_year: + * @date: a #GDate + * + * Returns the year of a #GDate. The date must be valid. + * + * Returns: year in which the date falls + */ +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; +} + +/** + * g_date_get_day: + * @date: a #GDate to extract the day of the month from + * + * Returns the day of the month. The date must be valid. + * + * Returns: day of the month + */ +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; +} + +/** + * g_date_get_julian: + * @date: a #GDate to extract the Julian day from + * + * 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. + * + * Returns: Julian 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; +} + +/** + * g_date_get_day_of_year: + * @date: a #GDate to extract day of year from + * + * Returns the day of the year, where Jan 1 is the first day of the + * year. The date must be valid. + * + * Returns: day of the year + */ +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); +} + +/** + * g_date_get_monday_week_of_year: + * @date: a #GDate + * + * 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. + * + * Returns: week of the year + */ +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)); +} + +/** + * g_date_get_sunday_week_of_year: + * @date: a #GDate + * + * 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. + * + * Returns: week number + */ +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; +} + +/** + * g_date_days_between: + * @date1: the first date + * @date2: the second date + * + * Computes the number of days between two dates. + * If @date2 is prior to @date1, the returned value is negative. + * Both dates must be valid. + * + * Returns: the number of days between @date1 and @date2 + */ +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); +} + +/** + * g_date_clear: + * @date: pointer to one or more dates to clear + * @n_dates: number of dates to clear + * + * 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(). + */ +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; + } + +#if defined(G_ENABLE_DEBUG) && 0 + 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); +} + +/** + * g_date_set_parse: + * @date: a #GDate to fill in + * @str: string to parse + * + * 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). + */ +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. + * + * The time to date conversion is done using the user's current timezone. + * + * Since: 2.10 + */ +void +g_date_set_time_val (GDate *date, + GTimeVal *timeval) +{ + g_date_set_time_t (date, (time_t) timeval->tv_sec); +} + +/** + * g_date_set_month: + * @date: a #GDate + * @month: month 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. + */ +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; +} + +/** + * g_date_set_day: + * @date: a #GDate + * @day: day to set + * + * Sets the day of the month for a #GDate. If the resulting + * day-month-year triplet is invalid, the date will be invalid. + */ +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; +} + +/** + * g_date_set_year: + * @date: a #GDate + * @year: year to set + * + * Sets the year for a #GDate. If the resulting day-month-year + * triplet is invalid, the date will be invalid. + */ +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; +} + +/** + * g_date_set_dmy: + * @date: a #GDate + * @day: day + * @month: month + * @y: year + * + * 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. + */ +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; +} + +/** + * g_date_set_julian: + * @date: a #GDate + * @julian_date: Julian day number (days since January 1, Year 1) + * + * Sets the value of a #GDate from a Julian day number. + */ +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; +} + +/** + * g_date_is_first_of_month: + * @date: a #GDate to check + * + * Returns %TRUE if the date is on the first of a month. + * The date must be valid. + * + * Returns: %TRUE if the date is the first of the month + */ +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; +} + +/** + * g_date_is_last_of_month: + * @date: a #GDate to check + * + * Returns %TRUE if the date is the last day of the month. + * The date must be valid. + * + * Returns: %TRUE if the date is the last day of the month + */ +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; +} + +/** + * g_date_add_days: + * @date: a #GDate to increment + * @n_days: number of days to move the date forward + * + * Increments a date some number of days. + * To move forward by weeks, add weeks*7 days. + * The date must be valid. + */ +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; +} + +/** + * g_date_subtract_days: + * @date: a #GDate to decrement + * @n_days: number of days to move + * + * 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. + */ +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; +} + +/** + * g_date_add_months: + * @date: a #GDate to increment + * @n_months: number of months to move forward + * + * 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. + */ +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)); +} + +/** + * g_date_subtract_months: + * @date: a #GDate to decrement + * @n_months: number of months to move + * + * 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. + */ +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)); +} + +/** + * g_date_add_years: + * @date: a #GDate to increment + * @n_years: number of years to move forward + * + * 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. + */ +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; +} + +/** + * g_date_subtract_years: + * @date: a #GDate to decrement + * @n_years: number of years to move + * + * 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. + */ +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; +} + +/** + * g_date_is_leap_year: + * @year: year to check + * + * 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. + * + * Returns: %TRUE if the year is a leap year + */ +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 ); +} + +/** + * g_date_get_days_in_month: + * @month: month + * @year: year + * + * Returns the number of days in a month, taking leap + * years into account. + * + * Returns: number of days in @month during the @year + */ +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]; +} + +/** + * g_date_get_monday_weeks_in_year: + * @year: a 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.) + * + * Returns: number of Mondays in the year + */ +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; +} + +/** + * g_date_get_sunday_weeks_in_year: + * @year: year to count weeks in + * + * 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.) + * + * Returns: the number of weeks in @year + */ +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; +} + +/** + * g_date_compare: + * @lhs: first date to compare + * @rhs: second date to compare + * + * qsort()-style comparison function for dates. + * Both dates must be valid. + * + * Returns: 0 for equal, less than zero if @lhs is less than @rhs, + * greater than zero if @lhs is greater than @rhs + */ +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 */ +} + +/** + * g_date_to_struct_tm: + * @date: a #GDate to set the struct tm from + * @tm: struct tm to fill + * + * Fills in the date-related bits of a struct tm + * using the @date value. Initializes the non-date parts with something + * sane but meaningless. + */ +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" */ +} + +/** + * g_date_clamp: + * @date: a #GDate to clamp + * @min_date: minimum accepted value for @date + * @max_date: maximum accepted value for @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. + */ +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; +} + +/** + * g_date_order: + * @date1: the first date + * @date2: the second date + * + * Checks if @date1 is less than or equal to @date2, + * and swap the values if this is not the case. + */ +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 + +/** + * g_date_strftime: + * @s: destination buffer + * @slen: buffer size + * @format: format string + * @date: valid #GDate + * + * 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. + * + * Returns: number of characters written to the buffer, or 0 the buffer was too small + */ +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 +} diff --git a/glib/gdate.h b/glib/gdate.h new file mode 100644 index 0000000..ad02879 --- /dev/null +++ b/glib/gdate.h @@ -0,0 +1,311 @@ +/* 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_DATE_H__ +#define __G_DATE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + */ +GLIB_AVAILABLE_IN_ALL +GDate* g_date_new (void); +GLIB_AVAILABLE_IN_ALL +GDate* g_date_new_dmy (GDateDay day, + GDateMonth month, + GDateYear year); +GLIB_AVAILABLE_IN_ALL +GDate* g_date_new_julian (guint32 julian_day); +GLIB_AVAILABLE_IN_ALL +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). + */ +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid (const GDate *date); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_day (GDateDay day) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_month (GDateMonth month) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_year (GDateYear year) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_weekday (GDateWeekday weekday) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_julian (guint32 julian_date) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_date_valid_dmy (GDateDay day, + GDateMonth month, + GDateYear year) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GDateWeekday g_date_get_weekday (const GDate *date); +GLIB_AVAILABLE_IN_ALL +GDateMonth g_date_get_month (const GDate *date); +GLIB_AVAILABLE_IN_ALL +GDateYear g_date_get_year (const GDate *date); +GLIB_AVAILABLE_IN_ALL +GDateDay g_date_get_day (const GDate *date); +GLIB_AVAILABLE_IN_ALL +guint32 g_date_get_julian (const GDate *date); +GLIB_AVAILABLE_IN_ALL +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 + */ +GLIB_AVAILABLE_IN_ALL +guint g_date_get_monday_week_of_year (const GDate *date); +GLIB_AVAILABLE_IN_ALL +guint g_date_get_sunday_week_of_year (const GDate *date); +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +void g_date_set_parse (GDate *date, + const gchar *str); +GLIB_AVAILABLE_IN_ALL +void g_date_set_time_t (GDate *date, + time_t timet); +GLIB_AVAILABLE_IN_ALL +void g_date_set_time_val (GDate *date, + GTimeVal *timeval); +#ifndef G_DISABLE_DEPRECATED +GLIB_DEPRECATED_FOR(g_date_set_time_t) +void g_date_set_time (GDate *date, + GTime time_); +#endif +GLIB_AVAILABLE_IN_ALL +void g_date_set_month (GDate *date, + GDateMonth month); +GLIB_AVAILABLE_IN_ALL +void g_date_set_day (GDate *date, + GDateDay day); +GLIB_AVAILABLE_IN_ALL +void g_date_set_year (GDate *date, + GDateYear year); +GLIB_AVAILABLE_IN_ALL +void g_date_set_dmy (GDate *date, + GDateDay day, + GDateMonth month, + GDateYear y); +GLIB_AVAILABLE_IN_ALL +void g_date_set_julian (GDate *date, + guint32 julian_date); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_is_first_of_month (const GDate *date); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_is_last_of_month (const GDate *date); + +/* To go forward by some number of weeks just go forward weeks*7 days */ +GLIB_AVAILABLE_IN_ALL +void g_date_add_days (GDate *date, + guint n_days); +GLIB_AVAILABLE_IN_ALL +void g_date_subtract_days (GDate *date, + guint n_days); + +/* If you add/sub months while day > 28, the day might change */ +GLIB_AVAILABLE_IN_ALL +void g_date_add_months (GDate *date, + guint n_months); +GLIB_AVAILABLE_IN_ALL +void g_date_subtract_months (GDate *date, + guint n_months); + +/* If it's feb 29, changing years can move you to the 28th */ +GLIB_AVAILABLE_IN_ALL +void g_date_add_years (GDate *date, + guint n_years); +GLIB_AVAILABLE_IN_ALL +void g_date_subtract_years (GDate *date, + guint n_years); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_is_leap_year (GDateYear year) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +guint8 g_date_get_days_in_month (GDateMonth month, + GDateYear year) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +guint8 g_date_get_monday_weeks_in_year (GDateYear year) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +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. */ +GLIB_AVAILABLE_IN_ALL +gint g_date_days_between (const GDate *date1, + const GDate *date2); + +/* qsort-friendly (with a cast...) */ +GLIB_AVAILABLE_IN_ALL +gint g_date_compare (const GDate *lhs, + const GDate *rhs); +GLIB_AVAILABLE_IN_ALL +void g_date_to_struct_tm (const GDate *date, + struct tm *tm); + +GLIB_AVAILABLE_IN_ALL +void g_date_clamp (GDate *date, + const GDate *min_date, + const GDate *max_date); + +/* Swap date1 and date2's values if date1 > date2. */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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/gdatetime.c b/glib/gdatetime.c new file mode 100644 index 0000000..f64b281 --- /dev/null +++ b/glib/gdatetime.c @@ -0,0 +1,2754 @@ +/* gdatetime.c + * + * Copyright (C) 2009-2010 Christian Hergert + * Copyright (C) 2010 Thiago Santos + * Copyright (C) 2010 Emmanuele Bassi + * 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.1 of the + * licence, or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should 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. + * + * Authors: Christian Hergert + * Thiago Santos + * Emmanuele Bassi + * Ryan Lortie + */ + +/* Algorithms within this file are based on the Calendar FAQ by + * Claus Tondering. It can be found at + * http://www.tondering.dk/claus/cal/calendar29.txt + * + * Copyright and disclaimer + * ------------------------ + * This document is Copyright (C) 2008 by Claus Tondering. + * E-mail: claus@tondering.dk. (Please include the word + * "calendar" in the subject line.) + * The document may be freely distributed, provided this + * copyright notice is included and no money is charged for + * the document. + * + * This document is provided "as is". No warranties are made as + * to its correctness. + */ + +/* Prologue {{{1 */ + +#include "config.h" + +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_LANGINFO_TIME +#include +#endif + +#include "gdatetime.h" + +#include "gslice.h" +#include "gatomic.h" +#include "gcharset.h" +#include "gconvert.h" +#include "gfileutils.h" +#include "ghash.h" +#include "gmain.h" +#include "gmappedfile.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gthread.h" +#include "gtimezone.h" + +#include "glibintl.h" + +#ifndef G_OS_WIN32 +#include +#include +#endif /* !G_OS_WIN32 */ + +/** + * SECTION:date-time + * @title: GDateTime + * @short_description: a structure representing Date and Time + * @see_also: #GTimeZone + * + * #GDateTime is a structure that combines a Gregorian date and time + * into a single structure. It provides many conversion and methods to + * manipulate dates and times. Time precision is provided down to + * microseconds and the time can range (proleptically) from 0001-01-01 + * 00:00:00 to 9999-12-31 23:59:59.999999. #GDateTime follows POSIX + * time in the sense that it is oblivious to leap seconds. + * + * #GDateTime is an immutable object; once it has been created it cannot + * be modified further. All modifiers will create a new #GDateTime. + * Nearly all such functions can fail due to the date or time going out + * of range, in which case %NULL will be returned. + * + * #GDateTime is reference counted: the reference count is increased by calling + * g_date_time_ref() and decreased by calling g_date_time_unref(). When the + * reference count drops to 0, the resources allocated by the #GDateTime + * structure are released. + * + * Many parts of the API may produce non-obvious results. As an + * example, adding two months to January 31st will yield March 31st + * whereas adding one month and then one month again will yield either + * March 28th or March 29th. Also note that adding 24 hours is not + * always the same as adding one day (since days containing daylight + * savings time transitions are either 23 or 25 hours in length). + * + * #GDateTime is available since GLib 2.26. + */ + +struct _GDateTime +{ + /* Microsecond timekeeping within Day */ + guint64 usec; + + /* TimeZone information */ + GTimeZone *tz; + gint interval; + + /* 1 is 0001-01-01 in Proleptic Gregorian */ + gint32 days; + + volatile gint ref_count; +}; + +/* Time conversion {{{1 */ + +#define UNIX_EPOCH_START 719163 +#define INSTANT_TO_UNIX(instant) \ + ((instant)/USEC_PER_SECOND - UNIX_EPOCH_START * SEC_PER_DAY) +#define UNIX_TO_INSTANT(unix) \ + (((unix) + UNIX_EPOCH_START * SEC_PER_DAY) * USEC_PER_SECOND) + +#define DAYS_IN_4YEARS 1461 /* days in 4 years */ +#define DAYS_IN_100YEARS 36524 /* days in 100 years */ +#define DAYS_IN_400YEARS 146097 /* days in 400 years */ + +#define USEC_PER_SECOND (G_GINT64_CONSTANT (1000000)) +#define USEC_PER_MINUTE (G_GINT64_CONSTANT (60000000)) +#define USEC_PER_HOUR (G_GINT64_CONSTANT (3600000000)) +#define USEC_PER_MILLISECOND (G_GINT64_CONSTANT (1000)) +#define USEC_PER_DAY (G_GINT64_CONSTANT (86400000000)) +#define SEC_PER_DAY (G_GINT64_CONSTANT (86400)) + +#define SECS_PER_MINUTE (60) +#define SECS_PER_HOUR (60 * SECS_PER_MINUTE) +#define SECS_PER_DAY (24 * SECS_PER_HOUR) +#define SECS_PER_YEAR (365 * SECS_PER_DAY) +#define SECS_PER_JULIAN (DAYS_PER_PERIOD * SECS_PER_DAY) + +#define GREGORIAN_LEAP(y) ((((y) % 4) == 0) && (!((((y) % 100) == 0) && (((y) % 400) != 0)))) +#define JULIAN_YEAR(d) ((d)->julian / 365.25) +#define DAYS_PER_PERIOD (G_GINT64_CONSTANT (2914695)) + +static const guint16 days_in_months[2][13] = +{ + { 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 } +}; + +static const guint16 days_in_year[2][13] = +{ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } +}; + +#ifdef HAVE_LANGINFO_TIME + +#define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) ? \ + nl_langinfo (AM_STR) : \ + nl_langinfo (PM_STR)) + +#define PREFERRED_DATE_TIME_FMT nl_langinfo (D_T_FMT) +#define PREFERRED_DATE_FMT nl_langinfo (D_FMT) +#define PREFERRED_TIME_FMT nl_langinfo (T_FMT) +#define PREFERRED_TIME_FMT nl_langinfo (T_FMT) +#define PREFERRED_12HR_TIME_FMT nl_langinfo (T_FMT_AMPM) + +static const gint weekday_item[2][7] = +{ + { ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7, ABDAY_1 }, + { DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, DAY_1 } +}; + +static const gint month_item[2][12] = +{ + { ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12 }, + { MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, MON_9, MON_10, MON_11, MON_12 }, +}; + +#define WEEKDAY_ABBR(d) nl_langinfo (weekday_item[0][g_date_time_get_day_of_week (d) - 1]) +#define WEEKDAY_FULL(d) nl_langinfo (weekday_item[1][g_date_time_get_day_of_week (d) - 1]) +#define MONTH_ABBR(d) nl_langinfo (month_item[0][g_date_time_get_month (d) - 1]) +#define MONTH_FULL(d) nl_langinfo (month_item[1][g_date_time_get_month (d) - 1]) + +#else + +#define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) \ + /* Translators: 'before midday' indicator */ \ + ? C_("GDateTime", "AM") \ + /* Translators: 'after midday' indicator */ \ + : C_("GDateTime", "PM")) + +/* Translators: this is the preferred format for expressing the date and the time */ +#define PREFERRED_DATE_TIME_FMT C_("GDateTime", "%a %b %e %H:%M:%S %Y") + +/* Translators: this is the preferred format for expressing the date */ +#define PREFERRED_DATE_FMT C_("GDateTime", "%m/%d/%y") + +/* Translators: this is the preferred format for expressing the time */ +#define PREFERRED_TIME_FMT C_("GDateTime", "%H:%M:%S") + +/* Translators: this is the preferred format for expressing 12 hour time */ +#define PREFERRED_12HR_TIME_FMT C_("GDateTime", "%I:%M:%S %p") + +#define WEEKDAY_ABBR(d) (get_weekday_name_abbr (g_date_time_get_day_of_week (d))) +#define WEEKDAY_FULL(d) (get_weekday_name (g_date_time_get_day_of_week (d))) +#define MONTH_ABBR(d) (get_month_name_abbr (g_date_time_get_month (d))) +#define MONTH_FULL(d) (get_month_name (g_date_time_get_month (d))) + +static const gchar * +get_month_name (gint month) +{ + switch (month) + { + case 1: + return C_("full month name", "January"); + case 2: + return C_("full month name", "February"); + case 3: + return C_("full month name", "March"); + case 4: + return C_("full month name", "April"); + case 5: + return C_("full month name", "May"); + case 6: + return C_("full month name", "June"); + case 7: + return C_("full month name", "July"); + case 8: + return C_("full month name", "August"); + case 9: + return C_("full month name", "September"); + case 10: + return C_("full month name", "October"); + case 11: + return C_("full month name", "November"); + case 12: + return C_("full month name", "December"); + + default: + g_warning ("Invalid month number %d", month); + } + + return NULL; +} + +static const gchar * +get_month_name_abbr (gint month) +{ + switch (month) + { + case 1: + return C_("abbreviated month name", "Jan"); + case 2: + return C_("abbreviated month name", "Feb"); + case 3: + return C_("abbreviated month name", "Mar"); + case 4: + return C_("abbreviated month name", "Apr"); + case 5: + return C_("abbreviated month name", "May"); + case 6: + return C_("abbreviated month name", "Jun"); + case 7: + return C_("abbreviated month name", "Jul"); + case 8: + return C_("abbreviated month name", "Aug"); + case 9: + return C_("abbreviated month name", "Sep"); + case 10: + return C_("abbreviated month name", "Oct"); + case 11: + return C_("abbreviated month name", "Nov"); + case 12: + return C_("abbreviated month name", "Dec"); + + default: + g_warning ("Invalid month number %d", month); + } + + return NULL; +} + +static const gchar * +get_weekday_name (gint day) +{ + switch (day) + { + case 1: + return C_("full weekday name", "Monday"); + case 2: + return C_("full weekday name", "Tuesday"); + case 3: + return C_("full weekday name", "Wednesday"); + case 4: + return C_("full weekday name", "Thursday"); + case 5: + return C_("full weekday name", "Friday"); + case 6: + return C_("full weekday name", "Saturday"); + case 7: + return C_("full weekday name", "Sunday"); + + default: + g_warning ("Invalid week day number %d", day); + } + + return NULL; +} + +static const gchar * +get_weekday_name_abbr (gint day) +{ + switch (day) + { + case 1: + return C_("abbreviated weekday name", "Mon"); + case 2: + return C_("abbreviated weekday name", "Tue"); + case 3: + return C_("abbreviated weekday name", "Wed"); + case 4: + return C_("abbreviated weekday name", "Thu"); + case 5: + return C_("abbreviated weekday name", "Fri"); + case 6: + return C_("abbreviated weekday name", "Sat"); + case 7: + return C_("abbreviated weekday name", "Sun"); + + default: + g_warning ("Invalid week day number %d", day); + } + + return NULL; +} + +#endif /* HAVE_LANGINFO_TIME */ + +static inline gint +ymd_to_days (gint year, + gint month, + gint day) +{ + gint64 days; + + days = (year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + + ((year - 1) / 400); + + days += days_in_year[0][month - 1]; + if (GREGORIAN_LEAP (year) && month > 2) + day++; + + days += day; + + return days; +} + +static void +g_date_time_get_week_number (GDateTime *datetime, + gint *week_number, + gint *day_of_week, + gint *day_of_year) +{ + gint a, b, c, d, e, f, g, n, s, month, day, year; + + g_date_time_get_ymd (datetime, &year, &month, &day); + + if (month <= 2) + { + a = g_date_time_get_year (datetime) - 1; + b = (a / 4) - (a / 100) + (a / 400); + c = ((a - 1) / 4) - ((a - 1) / 100) + ((a - 1) / 400); + s = b - c; + e = 0; + f = day - 1 + (31 * (month - 1)); + } + else + { + a = year; + b = (a / 4) - (a / 100) + (a / 400); + c = ((a - 1) / 4) - ((a - 1) / 100) + ((a - 1) / 400); + s = b - c; + e = s + 1; + f = day + (((153 * (month - 3)) + 2) / 5) + 58 + s; + } + + g = (a + b) % 7; + d = (f + g - e) % 7; + n = f + 3 - d; + + if (week_number) + { + if (n < 0) + *week_number = 53 - ((g - s) / 5); + else if (n > 364 + s) + *week_number = 1; + else + *week_number = (n / 7) + 1; + } + + if (day_of_week) + *day_of_week = d + 1; + + if (day_of_year) + *day_of_year = f + 1; +} + +/* Lifecycle {{{1 */ + +static GDateTime * +g_date_time_alloc (GTimeZone *tz) +{ + GDateTime *datetime; + + datetime = g_slice_new0 (GDateTime); + datetime->tz = g_time_zone_ref (tz); + datetime->ref_count = 1; + + return datetime; +} + +/** + * g_date_time_ref: + * @datetime: a #GDateTime + * + * Atomically increments the reference count of @datetime by one. + * + * Return value: the #GDateTime with the reference count increased + * + * Since: 2.26 + */ +GDateTime * +g_date_time_ref (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, NULL); + g_return_val_if_fail (datetime->ref_count > 0, NULL); + + g_atomic_int_inc (&datetime->ref_count); + + return datetime; +} + +/** + * g_date_time_unref: + * @datetime: a #GDateTime + * + * Atomically decrements the reference count of @datetime by one. + * + * When the reference count reaches zero, the resources allocated by + * @datetime are freed + * + * Since: 2.26 + */ +void +g_date_time_unref (GDateTime *datetime) +{ + g_return_if_fail (datetime != NULL); + g_return_if_fail (datetime->ref_count > 0); + + if (g_atomic_int_dec_and_test (&datetime->ref_count)) + { + g_time_zone_unref (datetime->tz); + g_slice_free (GDateTime, datetime); + } +} + +/* Internal state transformers {{{1 */ +/*< internal > + * g_date_time_to_instant: + * @datetime: a #GDateTime + * + * Convert a @datetime into an instant. + * + * An instant is a number that uniquely describes a particular + * microsecond in time, taking time zone considerations into account. + * (ie: "03:00 -0400" is the same instant as "02:00 -0500"). + * + * An instant is always positive but we use a signed return value to + * avoid troubles with C. + */ +static gint64 +g_date_time_to_instant (GDateTime *datetime) +{ + gint64 offset; + + offset = g_time_zone_get_offset (datetime->tz, datetime->interval); + offset *= USEC_PER_SECOND; + + return datetime->days * USEC_PER_DAY + datetime->usec - offset; +} + +/*< internal > + * g_date_time_from_instant: + * @tz: a #GTimeZone + * @instant: a instant in time + * + * Creates a #GDateTime from a time zone and an instant. + * + * This might fail if the time ends up being out of range. + */ +static GDateTime * +g_date_time_from_instant (GTimeZone *tz, + gint64 instant) +{ + GDateTime *datetime; + gint64 offset; + + if (instant < 0 || instant > G_GINT64_CONSTANT (1000000000000000000)) + return NULL; + + datetime = g_date_time_alloc (tz); + datetime->interval = g_time_zone_find_interval (tz, + G_TIME_TYPE_UNIVERSAL, + INSTANT_TO_UNIX (instant)); + offset = g_time_zone_get_offset (datetime->tz, datetime->interval); + offset *= USEC_PER_SECOND; + + instant += offset; + + datetime->days = instant / USEC_PER_DAY; + datetime->usec = instant % USEC_PER_DAY; + + if (datetime->days < 1 || 3652059 < datetime->days) + { + g_date_time_unref (datetime); + datetime = NULL; + } + + return datetime; +} + + +/*< internal > + * g_date_time_deal_with_date_change: + * @datetime: a #GDateTime + * + * This function should be called whenever the date changes by adding + * days, months or years. It does three things. + * + * First, we ensure that the date falls between 0001-01-01 and + * 9999-12-31 and return %FALSE if it does not. + * + * Next we update the ->interval field. + * + * Finally, we ensure that the resulting date and time pair exists (by + * ensuring that our time zone has an interval containing it) and + * adjusting as required. For example, if we have the time 02:30:00 on + * March 13 2010 in Toronto and we add 1 day to it, we would end up with + * 2:30am on March 14th, which doesn't exist. In that case, we bump the + * time up to 3:00am. + */ +static gboolean +g_date_time_deal_with_date_change (GDateTime *datetime) +{ + GTimeType was_dst; + gint64 full_time; + gint64 usec; + + if (datetime->days < 1 || datetime->days > 3652059) + return FALSE; + + was_dst = g_time_zone_is_dst (datetime->tz, datetime->interval); + + full_time = datetime->days * USEC_PER_DAY + datetime->usec; + + + usec = full_time % USEC_PER_SECOND; + full_time /= USEC_PER_SECOND; + full_time -= UNIX_EPOCH_START * SEC_PER_DAY; + + datetime->interval = g_time_zone_adjust_time (datetime->tz, + was_dst, + &full_time); + full_time += UNIX_EPOCH_START * SEC_PER_DAY; + full_time *= USEC_PER_SECOND; + full_time += usec; + + datetime->days = full_time / USEC_PER_DAY; + datetime->usec = full_time % USEC_PER_DAY; + + /* maybe daylight time caused us to shift to a different day, + * but it definitely didn't push us into a different year */ + return TRUE; +} + +static GDateTime * +g_date_time_replace_days (GDateTime *datetime, + gint days) +{ + GDateTime *new; + + new = g_date_time_alloc (datetime->tz); + new->interval = datetime->interval; + new->usec = datetime->usec; + new->days = days; + + if (!g_date_time_deal_with_date_change (new)) + { + g_date_time_unref (new); + new = NULL; + } + + return new; +} + +/* now/unix/timeval Constructors {{{1 */ + +/*< internal > + * g_date_time_new_from_timeval: + * @tz: a #GTimeZone + * @tv: a #GTimeVal + * + * Creates a #GDateTime corresponding to the given #GTimeVal @tv in the + * given time zone @tz. + * + * The time contained in a #GTimeVal is always stored in the form of + * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the + * given time zone. + * + * This call can fail (returning %NULL) if @tv represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +static GDateTime * +g_date_time_new_from_timeval (GTimeZone *tz, + const GTimeVal *tv) +{ + return g_date_time_from_instant (tz, tv->tv_usec + + UNIX_TO_INSTANT (tv->tv_sec)); +} + +/*< internal > + * g_date_time_new_from_unix: + * @tz: a #GTimeZone + * @t: the Unix time + * + * Creates a #GDateTime corresponding to the given Unix time @t in the + * given time zone @tz. + * + * Unix time is the number of seconds that have elapsed since 1970-01-01 + * 00:00:00 UTC, regardless of the time zone given. + * + * This call can fail (returning %NULL) if @t represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +static GDateTime * +g_date_time_new_from_unix (GTimeZone *tz, + gint64 secs) +{ + return g_date_time_from_instant (tz, UNIX_TO_INSTANT (secs)); +} + +/** + * g_date_time_new_now: + * @tz: a #GTimeZone + * + * Creates a #GDateTime corresponding to this exact instant in the given + * time zone @tz. The time is as accurate as the system allows, to a + * maximum accuracy of 1 microsecond. + * + * This function will always succeed unless the system clock is set to + * truly insane values (or unless GLib is still being used after the + * year 9999). + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_now (GTimeZone *tz) +{ + GTimeVal tv; + + g_get_current_time (&tv); + + return g_date_time_new_from_timeval (tz, &tv); +} + +/** + * g_date_time_new_now_local: + * + * Creates a #GDateTime corresponding to this exact instant in the local + * time zone. + * + * This is equivalent to calling g_date_time_new_now() with the time + * zone returned by g_time_zone_new_local(). + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_now_local (void) +{ + GDateTime *datetime; + GTimeZone *local; + + local = g_time_zone_new_local (); + datetime = g_date_time_new_now (local); + g_time_zone_unref (local); + + return datetime; +} + +/** + * g_date_time_new_now_utc: + * + * Creates a #GDateTime corresponding to this exact instant in UTC. + * + * This is equivalent to calling g_date_time_new_now() with the time + * zone returned by g_time_zone_new_utc(). + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_now_utc (void) +{ + GDateTime *datetime; + GTimeZone *utc; + + utc = g_time_zone_new_utc (); + datetime = g_date_time_new_now (utc); + g_time_zone_unref (utc); + + return datetime; +} + +/** + * g_date_time_new_from_unix_local: + * @t: the Unix time + * + * Creates a #GDateTime corresponding to the given Unix time @t in the + * local time zone. + * + * Unix time is the number of seconds that have elapsed since 1970-01-01 + * 00:00:00 UTC, regardless of the local time offset. + * + * This call can fail (returning %NULL) if @t represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_from_unix_local (gint64 t) +{ + GDateTime *datetime; + GTimeZone *local; + + local = g_time_zone_new_local (); + datetime = g_date_time_new_from_unix (local, t); + g_time_zone_unref (local); + + return datetime; +} + +/** + * g_date_time_new_from_unix_utc: + * @t: the Unix time + * + * Creates a #GDateTime corresponding to the given Unix time @t in UTC. + * + * Unix time is the number of seconds that have elapsed since 1970-01-01 + * 00:00:00 UTC. + * + * This call can fail (returning %NULL) if @t represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_from_unix_utc (gint64 t) +{ + GDateTime *datetime; + GTimeZone *utc; + + utc = g_time_zone_new_utc (); + datetime = g_date_time_new_from_unix (utc, t); + g_time_zone_unref (utc); + + return datetime; +} + +/** + * g_date_time_new_from_timeval_local: + * @tv: a #GTimeVal + * + * Creates a #GDateTime corresponding to the given #GTimeVal @tv in the + * local time zone. + * + * The time contained in a #GTimeVal is always stored in the form of + * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the + * local time offset. + * + * This call can fail (returning %NULL) if @tv represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_from_timeval_local (const GTimeVal *tv) +{ + GDateTime *datetime; + GTimeZone *local; + + local = g_time_zone_new_local (); + datetime = g_date_time_new_from_timeval (local, tv); + g_time_zone_unref (local); + + return datetime; +} + +/** + * g_date_time_new_from_timeval_utc: + * @tv: a #GTimeVal + * + * Creates a #GDateTime corresponding to the given #GTimeVal @tv in UTC. + * + * The time contained in a #GTimeVal is always stored in the form of + * seconds elapsed since 1970-01-01 00:00:00 UTC. + * + * This call can fail (returning %NULL) if @tv represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_from_timeval_utc (const GTimeVal *tv) +{ + GDateTime *datetime; + GTimeZone *utc; + + utc = g_time_zone_new_utc (); + datetime = g_date_time_new_from_timeval (utc, tv); + g_time_zone_unref (utc); + + return datetime; +} + +/* full new functions {{{1 */ + +/** + * g_date_time_new: + * @tz: a #GTimeZone + * @year: the year component of the date + * @month: the month component of the date + * @day: the day component of the date + * @hour: the hour component of the date + * @minute: the minute component of the date + * @seconds: the number of seconds past the minute + * + * Creates a new #GDateTime corresponding to the given date and time in + * the time zone @tz. + * + * The @year must be between 1 and 9999, @month between 1 and 12 and @day + * between 1 and 28, 29, 30 or 31 depending on the month and the year. + * + * @hour must be between 0 and 23 and @minute must be between 0 and 59. + * + * @seconds must be at least 0.0 and must be strictly less than 60.0. + * It will be rounded down to the nearest microsecond. + * + * If the given time is not representable in the given time zone (for + * example, 02:30 on March 14th 2010 in Toronto, due to daylight savings + * time) then the time will be rounded up to the nearest existing time + * (in this case, 03:00). If this matters to you then you should verify + * the return value for containing the same as the numbers you gave. + * + * In the case that the given time is ambiguous in the given time zone + * (for example, 01:30 on November 7th 2010 in Toronto, due to daylight + * savings time) then the time falling within standard (ie: + * non-daylight) time is taken. + * + * It not considered a programmer error for the values to this function + * to be out of range, but in the case that they are, the function will + * return %NULL. + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new (GTimeZone *tz, + gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds) +{ + GDateTime *datetime; + gint64 full_time; + + datetime = g_date_time_alloc (tz); + datetime->days = ymd_to_days (year, month, day); + datetime->usec = (hour * USEC_PER_HOUR) + + (minute * USEC_PER_MINUTE) + + (gint64) (seconds * USEC_PER_SECOND); + + full_time = SEC_PER_DAY * + (ymd_to_days (year, month, day) - UNIX_EPOCH_START) + + SECS_PER_HOUR * hour + + SECS_PER_MINUTE * minute + + (int) seconds; + + datetime->interval = g_time_zone_adjust_time (datetime->tz, + G_TIME_TYPE_STANDARD, + &full_time); + + full_time += UNIX_EPOCH_START * SEC_PER_DAY; + datetime->days = full_time / SEC_PER_DAY; + datetime->usec = (full_time % SEC_PER_DAY) * USEC_PER_SECOND; + datetime->usec += ((int) (seconds * USEC_PER_SECOND)) % USEC_PER_SECOND; + + return datetime; +} + +/** + * g_date_time_new_local: + * @year: the year component of the date + * @month: the month component of the date + * @day: the day component of the date + * @hour: the hour component of the date + * @minute: the minute component of the date + * @seconds: the number of seconds past the minute + * + * Creates a new #GDateTime corresponding to the given date and time in + * the local time zone. + * + * This call is equivalent to calling g_date_time_new() with the time + * zone returned by g_time_zone_new_local(). + * + * Returns: a #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_local (gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds) +{ + GDateTime *datetime; + GTimeZone *local; + + local = g_time_zone_new_local (); + datetime = g_date_time_new (local, year, month, day, hour, minute, seconds); + g_time_zone_unref (local); + + return datetime; +} + +/** + * g_date_time_new_utc: + * @year: the year component of the date + * @month: the month component of the date + * @day: the day component of the date + * @hour: the hour component of the date + * @minute: the minute component of the date + * @seconds: the number of seconds past the minute + * + * Creates a new #GDateTime corresponding to the given date and time in + * UTC. + * + * This call is equivalent to calling g_date_time_new() with the time + * zone returned by g_time_zone_new_utc(). + * + * Returns: a #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_new_utc (gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds) +{ + GDateTime *datetime; + GTimeZone *utc; + + utc = g_time_zone_new_utc (); + datetime = g_date_time_new (utc, year, month, day, hour, minute, seconds); + g_time_zone_unref (utc); + + return datetime; +} + +/* Adders {{{1 */ + +/** + * g_date_time_add: + * @datetime: a #GDateTime + * @timespan: a #GTimeSpan + * + * Creates a copy of @datetime and adds the specified timespan to the copy. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add (GDateTime *datetime, + GTimeSpan timespan) +{ + return g_date_time_from_instant (datetime->tz, timespan + + g_date_time_to_instant (datetime)); +} + +/** + * g_date_time_add_years: + * @datetime: a #GDateTime + * @years: the number of years + * + * Creates a copy of @datetime and adds the specified number of years to the + * copy. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime * +g_date_time_add_years (GDateTime *datetime, + gint years) +{ + gint year, month, day; + + g_return_val_if_fail (datetime != NULL, NULL); + + if (years < -10000 || years > 10000) + return NULL; + + g_date_time_get_ymd (datetime, &year, &month, &day); + year += years; + + /* only possible issue is if we've entered a year with no February 29 + */ + if (month == 2 && day == 29 && !GREGORIAN_LEAP (year)) + day = 28; + + return g_date_time_replace_days (datetime, ymd_to_days (year, month, day)); +} + +/** + * g_date_time_add_months: + * @datetime: a #GDateTime + * @months: the number of months + * + * Creates a copy of @datetime and adds the specified number of months to the + * copy. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_months (GDateTime *datetime, + gint months) +{ + gint year, month, day; + + g_return_val_if_fail (datetime != NULL, NULL); + g_date_time_get_ymd (datetime, &year, &month, &day); + + if (months < -120000 || months > 120000) + return NULL; + + year += months / 12; + month += months % 12; + if (month < 1) + { + month += 12; + year--; + } + else if (month > 12) + { + month -= 12; + year++; + } + + day = MIN (day, days_in_months[GREGORIAN_LEAP (year)][month]); + + return g_date_time_replace_days (datetime, ymd_to_days (year, month, day)); +} + +/** + * g_date_time_add_weeks: + * @datetime: a #GDateTime + * @weeks: the number of weeks + * + * Creates a copy of @datetime and adds the specified number of weeks to the + * copy. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_weeks (GDateTime *datetime, + gint weeks) +{ + g_return_val_if_fail (datetime != NULL, NULL); + + return g_date_time_add_days (datetime, weeks * 7); +} + +/** + * g_date_time_add_days: + * @datetime: a #GDateTime + * @days: the number of days + * + * Creates a copy of @datetime and adds the specified number of days to the + * copy. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_days (GDateTime *datetime, + gint days) +{ + g_return_val_if_fail (datetime != NULL, NULL); + + if (days < -3660000 || days > 3660000) + return NULL; + + return g_date_time_replace_days (datetime, datetime->days + days); +} + +/** + * g_date_time_add_hours: + * @datetime: a #GDateTime + * @hours: the number of hours to add + * + * Creates a copy of @datetime and adds the specified number of hours + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_hours (GDateTime *datetime, + gint hours) +{ + return g_date_time_add (datetime, hours * USEC_PER_HOUR); +} + +/** + * g_date_time_add_minutes: + * @datetime: a #GDateTime + * @minutes: the number of minutes to add + * + * Creates a copy of @datetime adding the specified number of minutes. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_minutes (GDateTime *datetime, + gint minutes) +{ + return g_date_time_add (datetime, minutes * USEC_PER_MINUTE); +} + + +/** + * g_date_time_add_seconds: + * @datetime: a #GDateTime + * @seconds: the number of seconds to add + * + * Creates a copy of @datetime and adds the specified number of seconds. + * + * Return value: the newly created #GDateTime which should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime* +g_date_time_add_seconds (GDateTime *datetime, + gdouble seconds) +{ + return g_date_time_add (datetime, seconds * USEC_PER_SECOND); +} + +/** + * g_date_time_add_full: + * @datetime: a #GDateTime + * @years: the number of years to add + * @months: the number of months to add + * @days: the number of days to add + * @hours: the number of hours to add + * @minutes: the number of minutes to add + * @seconds: the number of seconds to add + * + * Creates a new #GDateTime adding the specified values to the current date and + * time in @datetime. + * + * Return value: the newly created #GDateTime that should be freed with + * g_date_time_unref(). + * + * Since: 2.26 + */ +GDateTime * +g_date_time_add_full (GDateTime *datetime, + gint years, + gint months, + gint days, + gint hours, + gint minutes, + gdouble seconds) +{ + gint year, month, day; + gint64 full_time; + GDateTime *new; + gint interval; + + g_return_val_if_fail (datetime != NULL, NULL); + g_date_time_get_ymd (datetime, &year, &month, &day); + + months += years * 12; + + if (months < -120000 || months > 120000) + return NULL; + + if (days < -3660000 || days > 3660000) + return NULL; + + year += months / 12; + month += months % 12; + if (month < 1) + { + month += 12; + year--; + } + else if (month > 12) + { + month -= 12; + year++; + } + + day = MIN (day, days_in_months[GREGORIAN_LEAP (year)][month]); + + /* full_time is now in unix (local) time */ + full_time = datetime->usec / USEC_PER_SECOND + SEC_PER_DAY * + (ymd_to_days (year, month, day) + days - UNIX_EPOCH_START); + + interval = g_time_zone_adjust_time (datetime->tz, + g_time_zone_is_dst (datetime->tz, + datetime->interval), + &full_time); + + /* move to UTC unix time */ + full_time -= g_time_zone_get_offset (datetime->tz, interval); + + /* convert back to an instant, add back fractional seconds */ + full_time += UNIX_EPOCH_START * SEC_PER_DAY; + full_time = full_time * USEC_PER_SECOND + + datetime->usec % USEC_PER_SECOND; + + /* do the actual addition now */ + full_time += (hours * USEC_PER_HOUR) + + (minutes * USEC_PER_MINUTE) + + (gint64) (seconds * USEC_PER_SECOND); + + /* find the new interval */ + interval = g_time_zone_find_interval (datetime->tz, + G_TIME_TYPE_UNIVERSAL, + INSTANT_TO_UNIX (full_time)); + + /* convert back into local time */ + full_time += USEC_PER_SECOND * + g_time_zone_get_offset (datetime->tz, interval); + + /* split into days and usec of a new datetime */ + new = g_date_time_alloc (datetime->tz); + new->interval = interval; + new->days = full_time / USEC_PER_DAY; + new->usec = full_time % USEC_PER_DAY; + + /* XXX validate */ + + return new; +} + +/* Compare, difference, hash, equal {{{1 */ +/** + * g_date_time_compare: + * @dt1: first #GDateTime to compare + * @dt2: second #GDateTime to compare + * + * A comparison function for #GDateTimes that is suitable + * as a #GCompareFunc. Both #GDateTimes must be non-%NULL. + * + * Return value: -1, 0 or 1 if @dt1 is less than, equal to or greater + * than @dt2. + * + * Since: 2.26 + */ +gint +g_date_time_compare (gconstpointer dt1, + gconstpointer dt2) +{ + gint64 difference; + + difference = g_date_time_difference ((GDateTime *) dt1, (GDateTime *) dt2); + + if (difference < 0) + return -1; + + else if (difference > 0) + return 1; + + else + return 0; +} + +/** + * g_date_time_difference: + * @end: a #GDateTime + * @begin: a #GDateTime + * + * Calculates the difference in time between @end and @begin. The + * #GTimeSpan that is returned is effectively @end - @begin (ie: + * positive if the first parameter is larger). + * + * Return value: the difference between the two #GDateTime, as a time + * span expressed in microseconds. + * + * Since: 2.26 + */ +GTimeSpan +g_date_time_difference (GDateTime *end, + GDateTime *begin) +{ + g_return_val_if_fail (begin != NULL, 0); + g_return_val_if_fail (end != NULL, 0); + + return g_date_time_to_instant (end) - + g_date_time_to_instant (begin); +} + +/** + * g_date_time_hash: + * @datetime: a #GDateTime + * + * Hashes @datetime into a #guint, suitable for use within #GHashTable. + * + * Return value: a #guint containing the hash + * + * Since: 2.26 + */ +guint +g_date_time_hash (gconstpointer datetime) +{ + return g_date_time_to_instant ((GDateTime *) datetime); +} + +/** + * g_date_time_equal: + * @dt1: a #GDateTime + * @dt2: a #GDateTime + * + * Checks to see if @dt1 and @dt2 are equal. + * + * Equal here means that they represent the same moment after converting + * them to the same time zone. + * + * Return value: %TRUE if @dt1 and @dt2 are equal + * + * Since: 2.26 + */ +gboolean +g_date_time_equal (gconstpointer dt1, + gconstpointer dt2) +{ + return g_date_time_difference ((GDateTime *) dt1, (GDateTime *) dt2) == 0; +} + +/* Year, Month, Day Getters {{{1 */ +/** + * g_date_time_get_ymd: + * @datetime: a #GDateTime. + * @year: (out) (allow-none): the return location for the gregorian year, or %NULL. + * @month: (out) (allow-none): the return location for the month of the year, or %NULL. + * @day: (out) (allow-none): the return location for the day of the month, or %NULL. + * + * Retrieves the Gregorian day, month, and year of a given #GDateTime. + * + * Since: 2.26 + **/ +void +g_date_time_get_ymd (GDateTime *datetime, + gint *year, + gint *month, + gint *day) +{ + gint the_year; + gint the_month; + gint the_day; + gint remaining_days; + gint y100_cycles; + gint y4_cycles; + gint y1_cycles; + gint preceding; + gboolean leap; + + g_return_if_fail (datetime != NULL); + + remaining_days = datetime->days; + + /* + * We need to convert an offset in days to its year/month/day representation. + * Leap years makes this a little trickier than it should be, so we use + * 400, 100 and 4 years cycles here to get to the correct year. + */ + + /* Our days offset starts sets 0001-01-01 as day 1, if it was day 0 our + * math would be simpler, so let's do it */ + remaining_days--; + + the_year = (remaining_days / DAYS_IN_400YEARS) * 400 + 1; + remaining_days = remaining_days % DAYS_IN_400YEARS; + + y100_cycles = remaining_days / DAYS_IN_100YEARS; + remaining_days = remaining_days % DAYS_IN_100YEARS; + the_year += y100_cycles * 100; + + y4_cycles = remaining_days / DAYS_IN_4YEARS; + remaining_days = remaining_days % DAYS_IN_4YEARS; + the_year += y4_cycles * 4; + + y1_cycles = remaining_days / 365; + the_year += y1_cycles; + remaining_days = remaining_days % 365; + + if (y1_cycles == 4 || y100_cycles == 4) { + g_assert (remaining_days == 0); + + /* special case that indicates that the date is actually one year before, + * in the 31th of December */ + the_year--; + the_month = 12; + the_day = 31; + goto end; + } + + /* now get the month and the day */ + leap = y1_cycles == 3 && (y4_cycles != 24 || y100_cycles == 3); + + g_assert (leap == GREGORIAN_LEAP(the_year)); + + the_month = (remaining_days + 50) >> 5; + preceding = (days_in_year[0][the_month - 1] + (the_month > 2 && leap)); + if (preceding > remaining_days) + { + /* estimate is too large */ + the_month -= 1; + preceding -= leap ? days_in_months[1][the_month] + : days_in_months[0][the_month]; + } + + remaining_days -= preceding; + g_assert(0 <= remaining_days); + + the_day = remaining_days + 1; + +end: + if (year) + *year = the_year; + if (month) + *month = the_month; + if (day) + *day = the_day; +} + +/** + * g_date_time_get_year: + * @datetime: A #GDateTime + * + * Retrieves the year represented by @datetime in the Gregorian calendar. + * + * Return value: the year represented by @datetime + * + * Since: 2.26 + */ +gint +g_date_time_get_year (GDateTime *datetime) +{ + gint year; + + g_return_val_if_fail (datetime != NULL, 0); + + g_date_time_get_ymd (datetime, &year, NULL, NULL); + + return year; +} + +/** + * g_date_time_get_month: + * @datetime: a #GDateTime + * + * Retrieves the month of the year represented by @datetime in the Gregorian + * calendar. + * + * Return value: the month represented by @datetime + * + * Since: 2.26 + */ +gint +g_date_time_get_month (GDateTime *datetime) +{ + gint month; + + g_return_val_if_fail (datetime != NULL, 0); + + g_date_time_get_ymd (datetime, NULL, &month, NULL); + + return month; +} + +/** + * g_date_time_get_day_of_month: + * @datetime: a #GDateTime + * + * Retrieves the day of the month represented by @datetime in the gregorian + * calendar. + * + * Return value: the day of the month + * + * Since: 2.26 + */ +gint +g_date_time_get_day_of_month (GDateTime *datetime) +{ + gint day_of_year, + i; + const guint16 *days; + guint16 last = 0; + + g_return_val_if_fail (datetime != NULL, 0); + + days = days_in_year[GREGORIAN_LEAP (g_date_time_get_year (datetime)) ? 1 : 0]; + g_date_time_get_week_number (datetime, NULL, NULL, &day_of_year); + + for (i = 1; i <= 12; i++) + { + if (days [i] >= day_of_year) + return day_of_year - last; + last = days [i]; + } + + g_warn_if_reached (); + return 0; +} + +/* Week of year / day of week getters {{{1 */ +/** + * g_date_time_get_week_numbering_year: + * @datetime: a #GDateTime + * + * Returns the ISO 8601 week-numbering year in which the week containing + * @datetime falls. + * + * This function, taken together with g_date_time_get_week_of_year() and + * g_date_time_get_day_of_week() can be used to determine the full ISO + * week date on which @datetime falls. + * + * This is usually equal to the normal Gregorian year (as returned by + * g_date_time_get_year()), except as detailed below: + * + * For Thursday, the week-numbering year is always equal to the usual + * calendar year. For other days, the number is such that every day + * within a complete week (Monday to Sunday) is contained within the + * same week-numbering year. + * + * For Monday, Tuesday and Wednesday occurring near the end of the year, + * this may mean that the week-numbering year is one greater than the + * calendar year (so that these days have the same week-numbering year + * as the Thursday occurring early in the next year). + * + * For Friday, Saturaday and Sunday occurring near the start of the year, + * this may mean that the week-numbering year is one less than the + * calendar year (so that these days have the same week-numbering year + * as the Thursday occurring late in the previous year). + * + * An equivalent description is that the week-numbering year is equal to + * the calendar year containing the majority of the days in the current + * week (Monday to Sunday). + * + * Note that January 1 0001 in the proleptic Gregorian calendar is a + * Monday, so this function never returns 0. + * + * Returns: the ISO 8601 week-numbering year for @datetime + * + * Since: 2.26 + **/ +gint +g_date_time_get_week_numbering_year (GDateTime *datetime) +{ + gint year, month, day, weekday; + + g_date_time_get_ymd (datetime, &year, &month, &day); + weekday = g_date_time_get_day_of_week (datetime); + + /* January 1, 2, 3 might be in the previous year if they occur after + * Thursday. + * + * Jan 1: Friday, Saturday, Sunday => day 1: weekday 5, 6, 7 + * Jan 2: Saturday, Sunday => day 2: weekday 6, 7 + * Jan 3: Sunday => day 3: weekday 7 + * + * So we have a special case if (day - weekday) <= -4 + */ + if (month == 1 && (day - weekday) <= -4) + return year - 1; + + /* December 29, 30, 31 might be in the next year if they occur before + * Thursday. + * + * Dec 31: Monday, Tuesday, Wednesday => day 31: weekday 1, 2, 3 + * Dec 30: Monday, Tuesday => day 30: weekday 1, 2 + * Dec 29: Monday => day 29: weekday 1 + * + * So we have a special case if (day - weekday) >= 28 + */ + else if (month == 12 && (day - weekday) >= 28) + return year + 1; + + else + return year; +} + +/** + * g_date_time_get_week_of_year: + * @datetime: a #GDateTime + * + * Returns the ISO 8601 week number for the week containing @datetime. + * The ISO 8601 week number is the same for every day of the week (from + * Moday through Sunday). That can produce some unusual results + * (described below). + * + * The first week of the year is week 1. This is the week that contains + * the first Thursday of the year. Equivalently, this is the first week + * that has more than 4 of its days falling within the calendar year. + * + * The value 0 is never returned by this function. Days contained + * within a year but occurring before the first ISO 8601 week of that + * year are considered as being contained in the last week of the + * previous year. Similarly, the final days of a calendar year may be + * considered as being part of the first ISO 8601 week of the next year + * if 4 or more days of that week are contained within the new year. + * + * Returns: the ISO 8601 week number for @datetime. + * + * Since: 2.26 + */ +gint +g_date_time_get_week_of_year (GDateTime *datetime) +{ + gint weeknum; + + g_return_val_if_fail (datetime != NULL, 0); + + g_date_time_get_week_number (datetime, &weeknum, NULL, NULL); + + return weeknum; +} + +/** + * g_date_time_get_day_of_week: + * @datetime: a #GDateTime + * + * Retrieves the ISO 8601 day of the week on which @datetime falls (1 is + * Monday, 2 is Tuesday... 7 is Sunday). + * + * Return value: the day of the week + * + * Since: 2.26 + */ +gint +g_date_time_get_day_of_week (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->days - 1) % 7 + 1; +} + +/* Day of year getter {{{1 */ +/** + * g_date_time_get_day_of_year: + * @datetime: a #GDateTime + * + * Retrieves the day of the year represented by @datetime in the Gregorian + * calendar. + * + * Return value: the day of the year + * + * Since: 2.26 + */ +gint +g_date_time_get_day_of_year (GDateTime *datetime) +{ + gint doy = 0; + + g_return_val_if_fail (datetime != NULL, 0); + + g_date_time_get_week_number (datetime, NULL, NULL, &doy); + return doy; +} + +/* Time component getters {{{1 */ + +/** + * g_date_time_get_hour: + * @datetime: a #GDateTime + * + * Retrieves the hour of the day represented by @datetime + * + * Return value: the hour of the day + * + * Since: 2.26 + */ +gint +g_date_time_get_hour (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->usec / USEC_PER_HOUR); +} + +/** + * g_date_time_get_minute: + * @datetime: a #GDateTime + * + * Retrieves the minute of the hour represented by @datetime + * + * Return value: the minute of the hour + * + * Since: 2.26 + */ +gint +g_date_time_get_minute (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->usec % USEC_PER_HOUR) / USEC_PER_MINUTE; +} + +/** + * g_date_time_get_second: + * @datetime: a #GDateTime + * + * Retrieves the second of the minute represented by @datetime + * + * Return value: the second represented by @datetime + * + * Since: 2.26 + */ +gint +g_date_time_get_second (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->usec % USEC_PER_MINUTE) / USEC_PER_SECOND; +} + +/** + * g_date_time_get_microsecond: + * @datetime: a #GDateTime + * + * Retrieves the microsecond of the date represented by @datetime + * + * Return value: the microsecond of the second + * + * Since: 2.26 + */ +gint +g_date_time_get_microsecond (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->usec % USEC_PER_SECOND); +} + +/** + * g_date_time_get_seconds: + * @datetime: a #GDateTime + * + * Retrieves the number of seconds since the start of the last minute, + * including the fractional part. + * + * Returns: the number of seconds + * + * Since: 2.26 + **/ +gdouble +g_date_time_get_seconds (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return (datetime->usec % USEC_PER_MINUTE) / 1000000.0; +} + +/* Exporters {{{1 */ +/** + * g_date_time_to_unix: + * @datetime: a #GDateTime + * + * Gives the Unix time corresponding to @datetime, rounding down to the + * nearest second. + * + * Unix time is the number of seconds that have elapsed since 1970-01-01 + * 00:00:00 UTC, regardless of the time zone associated with @datetime. + * + * Returns: the Unix time corresponding to @datetime + * + * Since: 2.26 + **/ +gint64 +g_date_time_to_unix (GDateTime *datetime) +{ + return INSTANT_TO_UNIX (g_date_time_to_instant (datetime)); +} + +/** + * g_date_time_to_timeval: + * @datetime: a #GDateTime + * @tv: a #GTimeVal to modify + * + * Stores the instant in time that @datetime represents into @tv. + * + * The time contained in a #GTimeVal is always stored in the form of + * seconds elapsed since 1970-01-01 00:00:00 UTC, regardless of the time + * zone associated with @datetime. + * + * On systems where 'long' is 32bit (ie: all 32bit systems and all + * Windows systems), a #GTimeVal is incapable of storing the entire + * range of values that #GDateTime is capable of expressing. On those + * systems, this function returns %FALSE to indicate that the time is + * out of range. + * + * On systems where 'long' is 64bit, this function never fails. + * + * Returns: %TRUE if successful, else %FALSE + * + * Since: 2.26 + **/ +gboolean +g_date_time_to_timeval (GDateTime *datetime, + GTimeVal *tv) +{ + tv->tv_sec = INSTANT_TO_UNIX (g_date_time_to_instant (datetime)); + tv->tv_usec = datetime->usec % USEC_PER_SECOND; + + return TRUE; +} + +/* Timezone queries {{{1 */ +/** + * g_date_time_get_utc_offset: + * @datetime: a #GDateTime + * + * Determines the offset to UTC in effect at the time and in the time + * zone of @datetime. + * + * The offset is the number of microseconds that you add to UTC time to + * arrive at local time for the time zone (ie: negative numbers for time + * zones west of GMT, positive numbers for east). + * + * If @datetime represents UTC time, then the offset is always zero. + * + * Returns: the number of microseconds that should be added to UTC to + * get the local time + * + * Since: 2.26 + **/ +GTimeSpan +g_date_time_get_utc_offset (GDateTime *datetime) +{ + gint offset; + + g_return_val_if_fail (datetime != NULL, 0); + + offset = g_time_zone_get_offset (datetime->tz, datetime->interval); + + return (gint64) offset * USEC_PER_SECOND; +} + +/** + * g_date_time_get_timezone_abbreviation: + * @datetime: a #GDateTime + * + * Determines the time zone abbreviation to be used at the time and in + * the time zone of @datetime. + * + * For example, in Toronto this is currently "EST" during the winter + * months and "EDT" during the summer months when daylight savings + * time is in effect. + * + * Returns: (transfer none): the time zone abbreviation. The returned + * string is owned by the #GDateTime and it should not be + * modified or freed + * + * Since: 2.26 + **/ +const gchar * +g_date_time_get_timezone_abbreviation (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, NULL); + + return g_time_zone_get_abbreviation (datetime->tz, datetime->interval); +} + +/** + * g_date_time_is_daylight_savings: + * @datetime: a #GDateTime + * + * Determines if daylight savings time is in effect at the time and in + * the time zone of @datetime. + * + * Returns: %TRUE if daylight savings time is in effect + * + * Since: 2.26 + **/ +gboolean +g_date_time_is_daylight_savings (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, FALSE); + + return g_time_zone_is_dst (datetime->tz, datetime->interval); +} + +/* Timezone convert {{{1 */ +/** + * g_date_time_to_timezone: + * @datetime: a #GDateTime + * @tz: the new #GTimeZone + * + * Create a new #GDateTime corresponding to the same instant in time as + * @datetime, but in the time zone @tz. + * + * This call can fail in the case that the time goes out of bounds. For + * example, converting 0001-01-01 00:00:00 UTC to a time zone west of + * Greenwich will fail (due to the year 0 being out of range). + * + * You should release the return value by calling g_date_time_unref() + * when you are done with it. + * + * Returns: a new #GDateTime, or %NULL + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_to_timezone (GDateTime *datetime, + GTimeZone *tz) +{ + return g_date_time_from_instant (tz, g_date_time_to_instant (datetime)); +} + +/** + * g_date_time_to_local: + * @datetime: a #GDateTime + * + * Creates a new #GDateTime corresponding to the same instant in time as + * @datetime, but in the local time zone. + * + * This call is equivalent to calling g_date_time_to_timezone() with the + * time zone returned by g_time_zone_new_local(). + * + * Returns: the newly created #GDateTime + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_to_local (GDateTime *datetime) +{ + GDateTime *new; + GTimeZone *local; + + local = g_time_zone_new_local (); + new = g_date_time_to_timezone (datetime, local); + g_time_zone_unref (local); + + return new; +} + +/** + * g_date_time_to_utc: + * @datetime: a #GDateTime + * + * Creates a new #GDateTime corresponding to the same instant in time as + * @datetime, but in UTC. + * + * This call is equivalent to calling g_date_time_to_timezone() with the + * time zone returned by g_time_zone_new_utc(). + * + * Returns: the newly created #GDateTime + * + * Since: 2.26 + **/ +GDateTime * +g_date_time_to_utc (GDateTime *datetime) +{ + GDateTime *new; + GTimeZone *utc; + + utc = g_time_zone_new_utc (); + new = g_date_time_to_timezone (datetime, utc); + g_time_zone_unref (utc); + + return new; +} + +/* Format {{{1 */ + +static void +format_number (GString *str, + gboolean use_alt_digits, + gchar *pad, + gint width, + guint32 number) +{ + const gchar *ascii_digits[10] = { + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" + }; + const gchar **digits = ascii_digits; + const gchar *tmp[10]; + gint i = 0; + + g_return_if_fail (width <= 10); + +#ifdef HAVE_LANGINFO_OUTDIGIT + if (use_alt_digits) + { + static const gchar *alt_digits[10]; + static gsize initialised; + /* 2^32 has 10 digits */ + + if G_UNLIKELY (g_once_init_enter (&initialised)) + { +#define DO_DIGIT(n) \ + alt_digits[n] = nl_langinfo (_NL_CTYPE_OUTDIGIT## n ##_MB) + DO_DIGIT(0); DO_DIGIT(1); DO_DIGIT(2); DO_DIGIT(3); DO_DIGIT(4); + DO_DIGIT(5); DO_DIGIT(6); DO_DIGIT(7); DO_DIGIT(8); DO_DIGIT(9); +#undef DO_DIGIT + g_once_init_leave (&initialised, TRUE); + } + + digits = alt_digits; + } +#endif /* HAVE_LANGINFO_OUTDIGIT */ + + do + { + tmp[i++] = digits[number % 10]; + number /= 10; + } + while (number); + + while (pad && i < width) + tmp[i++] = *pad == '0' ? digits[0] : pad; + + /* should really be impossible */ + g_assert (i <= 10); + + while (i) + g_string_append (str, tmp[--i]); +} + +static gboolean g_date_time_format_locale (GDateTime *datetime, + const gchar *format, + GString *outstr, + gboolean locale_is_utf8); + +/* g_date_time_format() subroutine that takes a locale-encoded format + * string and produces a locale-encoded date/time string. + */ +static gboolean +g_date_time_locale_format_locale (GDateTime *datetime, + const gchar *format, + GString *outstr, + gboolean locale_is_utf8) +{ + gchar *utf8_format; + gboolean success; + + if (locale_is_utf8) + return g_date_time_format_locale (datetime, format, outstr, + locale_is_utf8); + + utf8_format = g_locale_to_utf8 (format, -1, NULL, NULL, NULL); + if (!utf8_format) + return FALSE; + + success = g_date_time_format_locale (datetime, utf8_format, outstr, + locale_is_utf8); + g_free (utf8_format); + return success; +} + +/* g_date_time_format() subroutine that takes a UTF-8 format + * string and produces a locale-encoded date/time string. + */ +static gboolean +g_date_time_format_locale (GDateTime *datetime, + const gchar *format, + GString *outstr, + gboolean locale_is_utf8) +{ + guint len; + gchar *tmp; + gunichar c; + gboolean alt_digits = FALSE; + gboolean pad_set = FALSE; + gchar *pad = ""; + gchar *ampm; + const gchar *tz; + + while (*format) + { + len = strcspn (format, "%"); + if (len) + { + if (locale_is_utf8) + g_string_append_len (outstr, format, len); + else + { + tmp = g_locale_from_utf8 (format, len, NULL, NULL, NULL); + if (!tmp) + return FALSE; + g_string_append (outstr, tmp); + g_free (tmp); + } + } + + format += len; + if (!*format) + break; + + g_assert (*format == '%'); + format++; + if (!*format) + break; + + alt_digits = FALSE; + pad_set = FALSE; + + next_mod: + c = g_utf8_get_char (format); + format = g_utf8_next_char (format); + switch (c) + { + case 'a': + g_string_append (outstr, WEEKDAY_ABBR (datetime)); + break; + case 'A': + g_string_append (outstr, WEEKDAY_FULL (datetime)); + break; + case 'b': + g_string_append (outstr, MONTH_ABBR (datetime)); + break; + case 'B': + g_string_append (outstr, MONTH_FULL (datetime)); + break; + case 'c': + { + if (!g_date_time_locale_format_locale (datetime, PREFERRED_DATE_TIME_FMT, + outstr, locale_is_utf8)) + return FALSE; + } + break; + case 'C': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_year (datetime) / 100); + break; + case 'd': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_day_of_month (datetime)); + break; + case 'e': + format_number (outstr, alt_digits, pad_set ? pad : " ", 2, + g_date_time_get_day_of_month (datetime)); + break; + case 'F': + g_string_append_printf (outstr, "%d-%02d-%02d", + g_date_time_get_year (datetime), + g_date_time_get_month (datetime), + g_date_time_get_day_of_month (datetime)); + break; + case 'g': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_week_numbering_year (datetime) % 100); + break; + case 'G': + format_number (outstr, alt_digits, pad_set ? pad : 0, 0, + g_date_time_get_week_numbering_year (datetime)); + break; + case 'h': + g_string_append (outstr, MONTH_ABBR (datetime)); + break; + case 'H': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_hour (datetime)); + break; + case 'I': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + (g_date_time_get_hour (datetime) + 11) % 12 + 1); + break; + case 'j': + format_number (outstr, alt_digits, pad_set ? pad : "0", 3, + g_date_time_get_day_of_year (datetime)); + break; + case 'k': + format_number (outstr, alt_digits, pad_set ? pad : " ", 2, + g_date_time_get_hour (datetime)); + break; + case 'l': + format_number (outstr, alt_digits, pad_set ? pad : " ", 2, + (g_date_time_get_hour (datetime) + 11) % 12 + 1); + break; + case 'n': + g_string_append_c (outstr, '\n'); + break; + case 'm': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_month (datetime)); + break; + case 'M': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_minute (datetime)); + break; + case 'O': + alt_digits = TRUE; + goto next_mod; + case 'p': + ampm = (gchar *) GET_AMPM (datetime); + if (!locale_is_utf8) + { + ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL); + if (!tmp) + return FALSE; + } + ampm = g_utf8_strup (ampm, -1); + if (!locale_is_utf8) + { + g_free (tmp); + tmp = g_locale_from_utf8 (ampm, -1, NULL, NULL, NULL); + g_free (ampm); + if (!tmp) + return FALSE; + ampm = tmp; + } + g_string_append (outstr, ampm); + g_free (ampm); + break; + case 'P': + ampm = (gchar *) GET_AMPM (datetime); + if (!locale_is_utf8) + { + ampm = tmp = g_locale_to_utf8 (ampm, -1, NULL, NULL, NULL); + if (!tmp) + return FALSE; + } + ampm = g_utf8_strdown (ampm, -1); + if (!locale_is_utf8) + { + g_free (tmp); + tmp = g_locale_from_utf8 (ampm, -1, NULL, NULL, NULL); + g_free (ampm); + if (!tmp) + return FALSE; + ampm = tmp; + } + g_string_append (outstr, ampm); + g_free (ampm); + break; + case 'r': + { + if (!g_date_time_locale_format_locale (datetime, PREFERRED_12HR_TIME_FMT, + outstr, locale_is_utf8)) + return FALSE; + } + break; + case 'R': + g_string_append_printf (outstr, "%02d:%02d", + g_date_time_get_hour (datetime), + g_date_time_get_minute (datetime)); + break; + case 's': + g_string_append_printf (outstr, "%" G_GINT64_FORMAT, g_date_time_to_unix (datetime)); + break; + case 'S': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_second (datetime)); + break; + case 't': + g_string_append_c (outstr, '\t'); + break; + case 'T': + g_string_append_printf (outstr, "%02d:%02d:%02d", + g_date_time_get_hour (datetime), + g_date_time_get_minute (datetime), + g_date_time_get_second (datetime)); + break; + case 'u': + format_number (outstr, alt_digits, 0, 0, + g_date_time_get_day_of_week (datetime)); + break; + case 'V': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_week_of_year (datetime)); + break; + case 'w': + format_number (outstr, alt_digits, 0, 0, + g_date_time_get_day_of_week (datetime) % 7); + break; + case 'x': + { + if (!g_date_time_locale_format_locale (datetime, PREFERRED_DATE_FMT, + outstr, locale_is_utf8)) + return FALSE; + } + break; + case 'X': + { + if (!g_date_time_locale_format_locale (datetime, PREFERRED_TIME_FMT, + outstr, locale_is_utf8)) + return FALSE; + } + break; + case 'y': + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_year (datetime) % 100); + break; + case 'Y': + format_number (outstr, alt_digits, 0, 0, + g_date_time_get_year (datetime)); + break; + case 'z': + if (datetime->tz != NULL) + { + gint64 offset = g_date_time_get_utc_offset (datetime) + / USEC_PER_SECOND; + + g_string_append_printf (outstr, "%+03d%02d", + (int) offset / 3600, + (int) abs(offset) / 60 % 60); + } + else + g_string_append (outstr, "+0000"); + break; + case 'Z': + tz = g_date_time_get_timezone_abbreviation (datetime); + if (!locale_is_utf8) + { + tz = tmp = g_locale_from_utf8 (tz, -1, NULL, NULL, NULL); + if (!tmp) + return FALSE; + } + g_string_append (outstr, tz); + if (!locale_is_utf8) + g_free (tmp); + break; + case '%': + g_string_append_c (outstr, '%'); + break; + case '-': + pad_set = TRUE; + pad = ""; + goto next_mod; + case '_': + pad_set = TRUE; + pad = " "; + goto next_mod; + case '0': + pad_set = TRUE; + pad = "0"; + goto next_mod; + default: + return FALSE; + } + } + + return TRUE; +} + +/** + * g_date_time_format: + * @datetime: A #GDateTime + * @format: a valid UTF-8 string, containing the format for the + * #GDateTime + * + * Creates a newly allocated string representing the requested @format. + * + * The format strings understood by this function are a subset of the + * strftime() format language as specified by C99. The \%D, \%U and \%W + * conversions are not supported, nor is the 'E' modifier. The GNU + * extensions \%k, \%l, \%s and \%P are supported, however, as are the + * '0', '_' and '-' modifiers. + * + * In contrast to strftime(), this function always produces a UTF-8 + * string, regardless of the current locale. Note that the rendering of + * many formats is locale-dependent and may not match the strftime() + * output exactly. + * + * The following format specifiers are supported: + * + * + * + * \%a: + * + * the abbreviated weekday name according to the current locale + * + * + * \%A: + * + * the full weekday name according to the current locale + * + * + * \%b: + * + * the abbreviated month name according to the current locale + * + * + * \%B: + * + * the full month name according to the current locale + * + * + * \%c: + * + * the preferred date and time representation for the current locale + * + * + * \%C: + * + * The century number (year/100) as a 2-digit integer (00-99) + * + * + * \%d: + * + * the day of the month as a decimal number (range 01 to 31) + * + * + * \%e: + * + * the day of the month as a decimal number (range 1 to 31) + * + * + * \%F: + * + * equivalent to \%Y-\%m-\%d (the ISO 8601 date + * format) + * + * + * \%g: + * + * the last two digits of the ISO 8601 week-based year as a decimal + * number (00-99). This works well with \%V and \%u. + * + * + * \%G: + * + * the ISO 8601 week-based year as a decimal number. This works well + * with \%V and \%u. + * + * + * \%h: + * + * equivalent to \%b + * + * + * \%H: + * + * the hour as a decimal number using a 24-hour clock (range 00 to + * 23) + * + * + * \%I: + * + * the hour as a decimal number using a 12-hour clock (range 01 to + * 12) + * + * + * \%j: + * + * the day of the year as a decimal number (range 001 to 366) + * + * + * \%k: + * + * the hour (24-hour clock) as a decimal number (range 0 to 23); + * single digits are preceded by a blank + * + * + * \%l: + * + * the hour (12-hour clock) as a decimal number (range 1 to 12); + * single digits are preceded by a blank + * + * + * \%m: + * + * the month as a decimal number (range 01 to 12) + * + * + * \%M: + * + * the minute as a decimal number (range 00 to 59) + * + * + * \%p: + * + * either "AM" or "PM" according to the given time value, or the + * corresponding strings for the current locale. Noon is treated as + * "PM" and midnight as "AM". + * + * + * \%P: + * + * like \%p but lowercase: "am" or "pm" or a corresponding string for + * the current locale + * + * + * \%r: + * + * the time in a.m. or p.m. notation + * + * + * \%R: + * + * the time in 24-hour notation (\%H:\%M) + * + * + * \%s: + * + * the number of seconds since the Epoch, that is, since 1970-01-01 + * 00:00:00 UTC + * + * + * \%S: + * + * the second as a decimal number (range 00 to 60) + * + * + * \%t: + * + * a tab character + * + * + * \%T: + * + * the time in 24-hour notation with seconds (\%H:\%M:\%S) + * + * + * \%u: + * + * the ISO 8601 standard day of the week as a decimal, range 1 to 7, + * Monday being 1. This works well with \%G and \%V. + * + * + * \%V: + * + * the ISO 8601 standard week number of the current year as a decimal + * number, range 01 to 53, where week 1 is the first week that has at + * least 4 days in the new year. See g_date_time_get_week_of_year(). + * This works well with \%G and \%u. + * + * + * \%w: + * + * the day of the week as a decimal, range 0 to 6, Sunday being 0. + * This is not the ISO 8601 standard format -- use \%u instead. + * + * + * \%x: + * + * the preferred date representation for the current locale without + * the time + * + * + * \%X: + * + * the preferred time representation for the current locale without + * the date + * + * + * \%y: + * + * the year as a decimal number without the century + * + * + * \%Y: + * + * the year as a decimal number including the century + * + * + * \%z: + * + * the time-zone as hour offset from UTC + * + * + * \%Z: + * + * the time zone or name or abbreviation + * + * + * \%\%: + * + * a literal \% character + * + * + * + * Some conversion specifications can be modified by preceding the + * conversion specifier by one or more modifier characters. The + * following modifiers are supported for many of the numeric + * conversions: + * + * + * O + * + * Use alternative numeric symbols, if the current locale + * supports those. + * + * + * + * _ + * + * Pad a numeric result with spaces. + * This overrides the default padding for the specifier. + * + * + * + * - + * + * Do not pad a numeric result. + * This overrides the default padding for the specifier. + * + * + * + * 0 + * + * Pad a numeric result with zeros. + * This overrides the default padding for the specifier. + * + * + * + * + * Returns: a newly allocated string formatted to the requested format + * or %NULL in the case that there was an error. The string + * should be freed with g_free(). + * + * Since: 2.26 + */ +gchar * +g_date_time_format (GDateTime *datetime, + const gchar *format) +{ + GString *outstr; + gchar *utf8; + gboolean locale_is_utf8 = g_get_charset (NULL); + + g_return_val_if_fail (datetime != NULL, NULL); + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (g_utf8_validate (format, -1, NULL), NULL); + + outstr = g_string_sized_new (strlen (format) * 2); + + if (!g_date_time_format_locale (datetime, format, outstr, locale_is_utf8)) + { + g_string_free (outstr, TRUE); + return NULL; + } + + if (locale_is_utf8) + return g_string_free (outstr, FALSE); + + utf8 = g_locale_to_utf8 (outstr->str, outstr->len, NULL, NULL, NULL); + g_string_free (outstr, TRUE); + return utf8; +} + + +/* Epilogue {{{1 */ +/* vim:set foldmethod=marker: */ diff --git a/glib/gdatetime.h b/glib/gdatetime.h new file mode 100644 index 0000000..cbaf190 --- /dev/null +++ b/glib/gdatetime.h @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2009-2010 Christian Hergert + * 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.1 of the + * licence, or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should 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. + * + * Authors: Christian Hergert + * Thiago Santos + * Emmanuele Bassi + * Ryan Lortie + */ + +#ifndef __G_DATE_TIME_H__ +#define __G_DATE_TIME_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_TIME_SPAN_DAY: + * + * Evaluates to a time span of one day. + * + * Since: 2.26 + */ +#define G_TIME_SPAN_DAY (G_GINT64_CONSTANT (86400000000)) + +/** + * G_TIME_SPAN_HOUR: + * + * Evaluates to a time span of one hour. + * + * Since: 2.26 + */ +#define G_TIME_SPAN_HOUR (G_GINT64_CONSTANT (3600000000)) + +/** + * G_TIME_SPAN_MINUTE: + * + * Evaluates to a time span of one minute. + * + * Since: 2.26 + */ +#define G_TIME_SPAN_MINUTE (G_GINT64_CONSTANT (60000000)) + +/** + * G_TIME_SPAN_SECOND: + * + * Evaluates to a time span of one second. + * + * Since: 2.26 + */ +#define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT (1000000)) + +/** + * G_TIME_SPAN_MILLISECOND: + * + * Evaluates to a time span of one millisecond. + * + * Since: 2.26 + */ +#define G_TIME_SPAN_MILLISECOND (G_GINT64_CONSTANT (1000)) + +/** + * GTimeSpan: + * + * A value representing an interval of time, in microseconds. + * + * Since: 2.26 + */ +typedef gint64 GTimeSpan; + +/** + * GDateTime: + * + * GDateTime is an opaque structure whose members + * cannot be accessed directly. + * + * Since: 2.26 + */ +typedef struct _GDateTime GDateTime; + +GLIB_AVAILABLE_IN_ALL +void g_date_time_unref (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_ref (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_now (GTimeZone *tz); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_now_local (void); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_now_utc (void); + +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_from_unix_local (gint64 t); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_from_unix_utc (gint64 t); + +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_from_timeval_utc (const GTimeVal *tv); + +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new (GTimeZone *tz, + gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_local (gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_new_utc (gint year, + gint month, + gint day, + gint hour, + gint minute, + gdouble seconds); + +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add (GDateTime *datetime, + GTimeSpan timespan); + +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_years (GDateTime *datetime, + gint years); +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_months (GDateTime *datetime, + gint months); +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_weeks (GDateTime *datetime, + gint weeks); +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_days (GDateTime *datetime, + gint days); + +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_hours (GDateTime *datetime, + gint hours); +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_minutes (GDateTime *datetime, + gint minutes); +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_seconds (GDateTime *datetime, + gdouble seconds); + +GLIB_AVAILABLE_IN_ALL +G_GNUC_WARN_UNUSED_RESULT +GDateTime * g_date_time_add_full (GDateTime *datetime, + gint years, + gint months, + gint days, + gint hours, + gint minutes, + gdouble seconds); + +GLIB_AVAILABLE_IN_ALL +gint g_date_time_compare (gconstpointer dt1, + gconstpointer dt2); +GLIB_AVAILABLE_IN_ALL +GTimeSpan g_date_time_difference (GDateTime *end, + GDateTime *begin); +GLIB_AVAILABLE_IN_ALL +guint g_date_time_hash (gconstpointer datetime); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_time_equal (gconstpointer dt1, + gconstpointer dt2); + +GLIB_AVAILABLE_IN_ALL +void g_date_time_get_ymd (GDateTime *datetime, + gint *year, + gint *month, + gint *day); + +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_year (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_month (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_day_of_month (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_week_numbering_year (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_week_of_year (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_day_of_week (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_day_of_year (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_hour (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_minute (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_second (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gint g_date_time_get_microsecond (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gdouble g_date_time_get_seconds (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +gint64 g_date_time_to_unix (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_time_to_timeval (GDateTime *datetime, + GTimeVal *tv); + +GLIB_AVAILABLE_IN_ALL +GTimeSpan g_date_time_get_utc_offset (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +const gchar * g_date_time_get_timezone_abbreviation (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +gboolean g_date_time_is_daylight_savings (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_to_timezone (GDateTime *datetime, + GTimeZone *tz); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_to_local (GDateTime *datetime); +GLIB_AVAILABLE_IN_ALL +GDateTime * g_date_time_to_utc (GDateTime *datetime); + +GLIB_AVAILABLE_IN_ALL +gchar * g_date_time_format (GDateTime *datetime, + const gchar *format) G_GNUC_MALLOC; + +G_END_DECLS + +#endif /* __G_DATE_TIME_H__ */ diff --git a/glib/gdir.c b/glib/gdir.c new file mode 100644 index 0000000..0c304f6 --- /dev/null +++ b/glib/gdir.c @@ -0,0 +1,323 @@ +/* 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 "gdir.h" + +#include "gconvert.h" +#include "gfileutils.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "glibintl.h" + +#if defined (_MSC_VER) && !defined (HAVE_DIRENT_H) +#include "../build/win32/dirent/dirent.h" +#include "../build/win32/dirent/wdirent.c" +#endif + +/** + * GDir: + * + * An opaque structure representing an opened directory. + */ + +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(). Note + * that the ordering is not defined. + * + * 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 another entry in the directory, or %NULL. + * The order of entries returned from this function is not defined, + * and may vary by file system or other operating-system dependent + * factors. + * + * %NULL may also be returned in case of errors. On Unix, you can + * check errno to find out if %NULL was returned + * because of an error. + * + * On Unix, the '.' and '..' entries are omitted, and the returned + * name is in the on-disk encoding. + * + * On Windows, as is true of all GLib functions which operate on + * filenames, the returned name is in UTF-8. + * + * 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. + **/ +const 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. */ + +const 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); +} diff --git a/glib/gdir.h b/glib/gdir.h new file mode 100644 index 0000000..0b7c4af --- /dev/null +++ b/glib/gdir.h @@ -0,0 +1,62 @@ +/* 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. + */ + +#ifndef __G_DIR_H__ +#define __G_DIR_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GDir GDir; + +GLIB_AVAILABLE_IN_ALL +GDir * g_dir_open (const gchar *path, + guint flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +const gchar * g_dir_read_name (GDir *dir); +GLIB_AVAILABLE_IN_ALL +void g_dir_rewind (GDir *dir); +GLIB_AVAILABLE_IN_ALL +void g_dir_close (GDir *dir); + +#ifdef G_OS_WIN32 +#define g_dir_open g_dir_open_utf8 +#define g_dir_read_name g_dir_read_name_utf8 + +GLIB_AVAILABLE_IN_ALL +GDir *g_dir_open_utf8 (const gchar *path, + guint flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dir_read_name_utf8 (GDir *dir); +#endif /* G_OS_WIN32 */ + +G_END_DECLS + +#endif /* __G_DIR_H__ */ diff --git a/glib/gen-iswide-table.py b/glib/gen-iswide-table.py new file mode 100755 index 0000000..292addc --- /dev/null +++ b/glib/gen-iswide-table.py @@ -0,0 +1,58 @@ +#!/usr/bin/python + +import sys + +W = {} +W['A'] = [] +W['W'] = [] +W['F'] = W['W'] + +for line in sys.stdin: + i = line.find ('#') + if i >= 0: + line = line[:i] + line = line.strip () + if not len (line): + continue + + fields = [x.strip () for x in line.split (';')] + chars = fields[0] + width = fields[1] + + if width not in ['A', 'W', 'F']: + continue + + if chars.find ('..') > 0: + (start,end) = chars.split ('..') + else: + start = chars + end = chars + start, end = int(start,16), int(end,16) + + for i in range (start, end+1): + W[width].append (i) + + +def write_intervals (S): + S.sort () + start = S[0]; + end = start - 1 + for c in S: + if c == end+1: + end += 1 + continue + else: + print "{0x%04X, 0x%04X}, " % (start, end) + start = c + end = start + print "{0x%04X, 0x%04X} " % (start, end) + + + +print "table for g_unichar_iswide():" +print +write_intervals (W['W']) +print +print "table for g_unichar_iswide_cjk():" +print +write_intervals (W['A']) 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..d111d91 --- /dev/null +++ b/glib/gen-unicode-tables.pl @@ -0,0 +1,1340 @@ +#! /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 bytes; + +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_SPACING_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 = + ( + 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", + 'AL' => "G_UNICODE_BREAK_ALPHABETIC", + 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", + 'BA' => "G_UNICODE_BREAK_AFTER", + 'BB' => "G_UNICODE_BREAK_BEFORE", + 'BK' => "G_UNICODE_BREAK_MANDATORY", + 'CB' => "G_UNICODE_BREAK_CONTINGENT", + 'CJ' => "G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER", + 'CL' => "G_UNICODE_BREAK_CLOSE_PUNCTUATION", + 'CM' => "G_UNICODE_BREAK_COMBINING_MARK", + 'CP' => "G_UNICODE_BREAK_CLOSE_PARANTHESIS", + 'CR' => "G_UNICODE_BREAK_CARRIAGE_RETURN", + 'EX' => "G_UNICODE_BREAK_EXCLAMATION", + 'GL' => "G_UNICODE_BREAK_NON_BREAKING_GLUE", + 'H2' => "G_UNICODE_BREAK_HANGUL_LV_SYLLABLE", + 'H3' => "G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE", + 'HL' => "G_UNICODE_BREAK_HEBREW_LETTER", + 'HY' => "G_UNICODE_BREAK_HYPHEN", + 'ID' => "G_UNICODE_BREAK_IDEOGRAPHIC", + 'IN' => "G_UNICODE_BREAK_INSEPARABLE", + 'IS' => "G_UNICODE_BREAK_INFIX_SEPARATOR", + 'JL' => "G_UNICODE_BREAK_HANGUL_L_JAMO", + 'JT' => "G_UNICODE_BREAK_HANGUL_T_JAMO", + 'JV' => "G_UNICODE_BREAK_HANGUL_V_JAMO", + 'LF' => "G_UNICODE_BREAK_LINE_FEED", + 'NL' => "G_UNICODE_BREAK_NEXT_LINE", + 'NS' => "G_UNICODE_BREAK_NON_STARTER", + 'NU' => "G_UNICODE_BREAK_NUMERIC", + 'OP' => "G_UNICODE_BREAK_OPEN_PUNCTUATION", + 'PO' => "G_UNICODE_BREAK_POSTFIX", + 'PR' => "G_UNICODE_BREAK_PREFIX", + 'QU' => "G_UNICODE_BREAK_QUOTATION", + 'RI' => "G_UNICODE_BREAK_REGIONAL_INDICATOR", + 'SA' => "G_UNICODE_BREAK_COMPLEX_CONTEXT", + 'SG' => "G_UNICODE_BREAK_SURROGATE", + 'SP' => "G_UNICODE_BREAK_SPACE", + 'SY' => "G_UNICODE_BREAK_SYMBOL", + 'WJ' => "G_UNICODE_BREAK_WORD_JOINER", + 'XX' => "G_UNICODE_BREAK_UNKNOWN", + 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE" + ); + +# 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\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 /^#/; + 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) = @_; + + 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 "typedef struct\n{\n"; + print OUT " gunichar ch;\n"; + print OUT " gunichar a;\n"; + print OUT " gunichar b;\n"; + print OUT "} decomposition_step;\n\n"; + + # There's lots of room to optimize the following table... + print OUT "static const decomposition_step decomp_step_table[] =\n{\n"; + $first = 1; + my @steps = (); + for ($count = 0; $count <= $last; ++$count) + { + if ((defined $decompositions[$count]) && (!$decompose_compat[$count])) + { + print OUT ",\n" + if ! $first; + $first = 0; + my @list; + @list = (split(' ', $decompositions[$count]), "0"); + printf OUT qq( { 0x%05x, 0x%05x, 0x%05x }), $count, hex($list[0]), hex($list[1]); + # don't include 1:1 in the compose table + push @steps, [ ($count, hex($list[0]), hex($list[1])) ] + if hex($list[1]) + } + } + print OUT "\n};\n\n"; + + 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 "#include \n"; + print OUT "#include \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[$code]) { + delete $compositions{$code}; + next; + } + 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 gunichar compose_first_single[][2] = {\n"; + $i = 0; + for $record (@first_singletons) { + 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 < +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_CRT_EXTERNS_H +#include /* for _NSGetEnviron */ +#endif +#ifdef G_OS_WIN32 +#include +#endif + +#include "glib-private.h" +#include "gmem.h" +#include "gmessages.h" +#include "gstrfuncs.h" +#include "gunicode.h" +#include "gconvert.h" +#include "gquark.h" + +/* Environ array functions {{{1 */ +static gint +g_environ_find (gchar **envp, + const gchar *variable) +{ + gint len, i; + + if (envp == NULL) + return -1; + + len = strlen (variable); + + for (i = 0; envp[i]; i++) + { + if (strncmp (envp[i], variable, len) == 0 && + envp[i][len] == '=') + return i; + } + + return -1; +} + +/** + * g_environ_getenv: + * @envp: (allow-none) (array zero-terminated=1) (transfer none): an environment + * list (eg, as returned from g_get_environ()), or %NULL + * for an empty environment list + * @variable: the environment variable to get, in the GLib file name + * encoding + * + * Returns the value of the environment variable @variable in the + * provided list @envp. + * + * 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 set in @envp. The returned + * string is owned by @envp, and will be freed if @variable is + * set or unset again. + * + * Since: 2.32 + */ +const gchar * +g_environ_getenv (gchar **envp, + const gchar *variable) +{ + gint index; + + g_return_val_if_fail (variable != NULL, NULL); + + index = g_environ_find (envp, variable); + if (index != -1) + return envp[index] + strlen (variable) + 1; + else + return NULL; +} + +/** + * g_environ_setenv: + * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment + * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()), or %NULL + * for an empty environment list + * @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 the environment variable @variable in the provided list + * @envp to @value. + * + * Both the variable's name and value should be in the GLib + * file name encoding. On UNIX, this means that they can be + * arbitrary byte strings. On Windows, they should be in UTF-8. + * + * Return value: (array zero-terminated=1) (transfer full): the + * updated environment list. Free it using g_strfreev(). + * + * Since: 2.32 + */ +gchar ** +g_environ_setenv (gchar **envp, + const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + gint index; + + g_return_val_if_fail (variable != NULL, NULL); + g_return_val_if_fail (strchr (variable, '=') == NULL, NULL); + + index = g_environ_find (envp, variable); + if (index != -1) + { + if (overwrite) + { + g_free (envp[index]); + envp[index] = g_strdup_printf ("%s=%s", variable, value); + } + } + else + { + gint length; + + length = envp ? g_strv_length (envp) : 0; + envp = g_renew (gchar *, envp, length + 2); + envp[length] = g_strdup_printf ("%s=%s", variable, value); + envp[length + 1] = NULL; + } + + return envp; +} + +static gchar ** +g_environ_unsetenv_internal (gchar **envp, + const gchar *variable, + gboolean free_value) +{ + gint len; + gchar **e, **f; + + len = strlen (variable); + + /* Note that we remove *all* environment entries for + * the variable name, not just the first. + */ + e = f = envp; + while (*e != NULL) + { + if (strncmp (*e, variable, len) != 0 || (*e)[len] != '=') + { + *f = *e; + f++; + } + else + { + if (free_value) + g_free (*e); + } + + e++; + } + *f = NULL; + + return envp; +} + + +/** + * g_environ_unsetenv: + * @envp: (allow-none) (array zero-terminated=1) (transfer full): an environment + * list that can be freed using g_strfreev() (e.g., as returned from g_get_environ()), + * or %NULL for an empty environment list + * @variable: the environment variable to remove, must not contain '=' + * + * Removes the environment variable @variable from the provided + * environment @envp. + * + * Return value: (array zero-terminated=1) (transfer full): the + * updated environment list. Free it using g_strfreev(). + * + * Since: 2.32 + */ +gchar ** +g_environ_unsetenv (gchar **envp, + const gchar *variable) +{ + g_return_val_if_fail (variable != NULL, NULL); + g_return_val_if_fail (strchr (variable, '=') == NULL, NULL); + + if (envp == NULL) + return NULL; + + return g_environ_unsetenv_internal (envp, variable, TRUE); +} + +/* UNIX implemention {{{1 */ +#ifndef G_OS_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(). + */ +const gchar * +g_getenv (const gchar *variable) +{ + g_return_val_if_fail (variable != NULL, NULL); + + return getenv (variable); +} + +/** + * 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 arbitrary byte strings. 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. + * + * + * Environment variable handling in UNIX is not thread-safe, and your + * program may crash if one thread calls g_setenv() while another + * thread is calling getenv(). (And note that many functions, such as + * gettext(), call getenv() internally.) This function is only safe to + * use at the very start of your program, before creating any other + * threads (or creating objects that create worker threads of their + * own). + * + * If you need to set up the environment for a child process, you can + * use g_get_environ() to get an environment array, modify that with + * g_environ_setenv() and g_environ_unsetenv(), and then pass that + * array directly to execvpe(), g_spawn_async(), or the like. + * + * + * Returns: %FALSE if the environment variable couldn't be set. + * + * Since: 2.4 + */ +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + 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; +} + +#ifdef HAVE__NSGETENVIRON +#define environ (*_NSGetEnviron()) +#else +/* 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. + * + * + * Environment variable handling in UNIX is not thread-safe, and your + * program may crash if one thread calls g_unsetenv() while another + * thread is calling getenv(). (And note that many functions, such as + * gettext(), call getenv() internally.) This function is only safe + * to use at the very start of your program, before creating any other + * threads (or creating objects that create worker threads of their + * own). + * + * If you need to set up the environment for a child process, you can + * use g_get_environ() to get an environment array, modify that with + * g_environ_setenv() and g_environ_unsetenv(), and then pass that + * array directly to execvpe(), g_spawn_async(), or the like. + * + * + * Since: 2.4 + */ +void +g_unsetenv (const gchar *variable) +{ +#ifdef HAVE_UNSETENV + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + unsetenv (variable); +#else /* !HAVE_UNSETENV */ + g_return_if_fail (variable != NULL); + g_return_if_fail (strchr (variable, '=') == NULL); + + /* Mess directly with the environ array. + * This seems to be the only portable way to do this. + */ + g_environ_unsetenv_internal (environ, variable, FALSE); +#endif /* !HAVE_UNSETENV */ +} + +/** + * g_listenv: + * + * Gets the names of all variables set in the environment. + * + * 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. + * + * Returns: (array zero-terminated=1) (transfer full): a %NULL-terminated + * list of strings which must be freed with g_strfreev(). + * + * Since: 2.8 + */ +gchar ** +g_listenv (void) +{ + 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; +} + +/** + * g_get_environ: + * + * Gets the list of environment variables for the current process. + * + * The list is %NULL terminated and each item in the list is of the + * form 'NAME=VALUE'. + * + * This is equivalent to direct access to the 'environ' global variable, + * except portable. + * + * The return value is freshly allocated and it should be freed with + * g_strfreev() when it is no longer needed. + * + * Returns: (array zero-terminated=1) (transfer full): the list of + * environment variables + * + * Since: 2.28 + */ +gchar ** +g_get_environ (void) +{ + return g_strdupv (environ); +} + +/* Win32 implementation {{{1 */ +#else /* G_OS_WIN32 */ + +const gchar * +g_getenv (const gchar *variable) +{ + 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); + if (GetLastError () == ERROR_ENVVAR_NOT_FOUND) + return NULL; + + quark = g_quark_from_static_string (""); + return g_quark_to_string (quark); + } + 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); +} + +gboolean +g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite) +{ + 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; +} + +void +g_unsetenv (const gchar *variable) +{ + 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); +} + +gchar ** +g_listenv (void) +{ + 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; +} + +gchar ** +g_get_environ (void) +{ + gunichar2 *strings; + gchar **result; + gint i, n; + + strings = GetEnvironmentStringsW (); + for (n = 0, i = 0; strings[n]; i++) + n += wcslen (strings + n) + 1; + + result = g_new (char *, i + 1); + for (n = 0, i = 0; strings[n]; i++) + { + result[i] = g_utf16_to_utf8 (strings + n, -1, NULL, NULL, NULL); + n += wcslen (strings + n) + 1; + } + FreeEnvironmentStringsW (strings); + result[i] = NULL; + + return result; +} + +/* Win32 binary compatibility versions {{{1 */ +#ifndef _WIN64 + +#undef g_getenv + +const 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); +} + +#endif /* _WIN64 */ + +#endif /* G_OS_WIN32 */ + +/* Epilogue {{{1 */ +/* vim: set foldmethod=marker: */ diff --git a/glib/genviron.h b/glib/genviron.h new file mode 100644 index 0000000..1fcc225 --- /dev/null +++ b/glib/genviron.h @@ -0,0 +1,80 @@ +/* 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_ENVIRON_H__ +#define __G_ENVIRON_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +const gchar * g_getenv (const gchar *variable); +GLIB_AVAILABLE_IN_ALL +gboolean g_setenv (const gchar *variable, + const gchar *value, + gboolean overwrite); +GLIB_AVAILABLE_IN_ALL +void g_unsetenv (const gchar *variable); +GLIB_AVAILABLE_IN_ALL +gchar ** g_listenv (void); + +GLIB_AVAILABLE_IN_ALL +gchar ** g_get_environ (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_environ_getenv (gchar **envp, + const gchar *variable); +GLIB_AVAILABLE_IN_ALL +gchar ** g_environ_setenv (gchar **envp, + const gchar *variable, + const gchar *value, + gboolean overwrite) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +gchar ** g_environ_unsetenv (gchar **envp, + const gchar *variable) G_GNUC_WARN_UNUSED_RESULT; + +#ifdef G_OS_WIN32 +#define g_getenv g_getenv_utf8 +#define g_setenv g_setenv_utf8 +#define g_unsetenv g_unsetenv_utf8 + +GLIB_AVAILABLE_IN_ALL +const gchar *g_getenv_utf8 (const gchar *variable); +GLIB_AVAILABLE_IN_ALL +gboolean g_setenv_utf8 (const gchar *variable, + const gchar *value, + gboolean overwrite); +GLIB_AVAILABLE_IN_ALL +void g_unsetenv_utf8 (const gchar *variable); +#endif + +G_END_DECLS + +#endif /* __G_ENVIRON_H__ */ diff --git a/glib/gerror.c b/glib/gerror.c new file mode 100644 index 0000000..2adbdf8 --- /dev/null +++ b/glib/gerror.c @@ -0,0 +1,728 @@ +/* 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/. + */ + +/** + * SECTION:error_reporting + * @Title: Error Reporting + * @Short_description: 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 quark function for the error domain is called + * <namespace>_<module>_error_quark, + * for example g_spawn_error_quark() or g_thread_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. + * + * + * + * 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. + * + * + * If a #GError is reported, out parameters are not guaranteed to + * be set to any defined value. + * + * + * 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);). + * + * + */ + +#include "config.h" + +#include "gerror.h" + +#include "gslice.h" +#include "gstrfuncs.h" +#include "gtestutils.h" + +/** + * g_error_new_valist: + * @domain: error domain + * @code: error code + * @format: printf()-style format for error message + * @args: #va_list of parameters for the message format + * + * Creates a new #GError with the given @domain and @code, + * and a message formatted with @format. + * + * Returns: a new #GError + * + * Since: 2.22 + */ +GError* +g_error_new_valist (GQuark domain, + gint code, + const gchar *format, + va_list args) +{ + GError *error; + + /* Historically, GError allowed this (although it was never meant to work), + * and it has significant use in the wild, which g_return_val_if_fail + * would break. It should maybe g_return_val_if_fail in GLib 4. + * (GNOME#660371, GNOME#560482) + */ + g_warn_if_fail (domain != 0); + g_warn_if_fail (format != NULL); + + error = g_slice_new (GError); + + error->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 + * @...: 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); + /* See g_error_new_valist for why these don't return */ + g_warn_if_fail (error->domain != 0); + g_warn_if_fail (error->message != NULL); + + copy = g_slice_new (GError); + + *copy = *error; + + copy->message = g_strdup (error->message); + + return copy; +} + +/** + * g_error_matches: + * @error: (allow-none): 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: (allow-none): a return location for a #GError, or %NULL + * @domain: error domain + * @code: error code + * @format: printf()-style format + * @...: 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: (allow-none): 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; + } +} + +G_GNUC_PRINTF(2, 0) +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: (allow-none): 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); + } +} diff --git a/glib/gerror.h b/glib/gerror.h new file mode 100644 index 0000000..6224b87 --- /dev/null +++ b/glib/gerror.h @@ -0,0 +1,119 @@ +/* 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. + */ + +#ifndef __G_ERROR_H__ +#define __G_ERROR_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +#include + +G_BEGIN_DECLS + +/** + * GError: + * @domain: error domain, e.g. #G_FILE_ERROR + * @code: error code, e.g. %G_FILE_ERROR_NOENT + * @message: human-readable informative error message + * + * The GError structure contains + * information about an error that has occurred. + */ +typedef struct _GError GError; + +struct _GError +{ + GQuark domain; + gint code; + gchar *message; +}; + +GLIB_AVAILABLE_IN_ALL +GError* g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); + +GLIB_AVAILABLE_IN_ALL +GError* g_error_new_literal (GQuark domain, + gint code, + const gchar *message); +GLIB_AVAILABLE_IN_ALL +GError* g_error_new_valist (GQuark domain, + gint code, + const gchar *format, + va_list args) G_GNUC_PRINTF(3, 0); + +GLIB_AVAILABLE_IN_ALL +void g_error_free (GError *error); +GLIB_AVAILABLE_IN_ALL +GError* g_error_copy (const GError *error); + +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +void g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (4, 5); + +GLIB_AVAILABLE_IN_ALL +void g_set_error_literal (GError **err, + GQuark domain, + gint code, + const gchar *message); + +/* if (dest) *dest = src; also has some sanity checks. + */ +GLIB_AVAILABLE_IN_ALL +void g_propagate_error (GError **dest, + GError *src); + +/* if (err && *err) { g_error_free(*err); *err = NULL; } */ +GLIB_AVAILABLE_IN_ALL +void g_clear_error (GError **err); + +/* if (err) prefix the formatted string to the ->message */ +GLIB_AVAILABLE_IN_ALL +void g_prefix_error (GError **err, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); + +/* g_propagate_error then g_error_prefix on dest */ +GLIB_AVAILABLE_IN_ALL +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..3c1b135 --- /dev/null +++ b/glib/gfileutils.c @@ -0,0 +1,2671 @@ +/* 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 "glibconfig.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 "gfileutils.h" + +#include "gstdio.h" +#include "glibintl.h" + +#ifdef HAVE_LINUX_MAGIC_H /* for btrfs check */ +#include +#include +#endif + + +/** + * SECTION:fileutils + * @title: File Utilities + * @short_description: 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(). + */ + +/** + * GFileError: + * @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: The underlying file system of the specified file + * does not support memory 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. + * + * 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: + * + * Error domain for file operations. Errors in this domain will + * be from the #GFileError enumeration. See #GError for information + * on error domains. + */ + +/** + * GFileTest: + * @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. + * + * A test to perform on a file using g_file_test(). + */ + +/** + * 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 && errno != EEXIST) + { + 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 +} + +G_DEFINE_QUARK (g-file-error-quark, g_file_error) + +/** + * g_file_error_from_errno: + * @err_no: an "errno" value + * + * Gets a #GFileError constant based on the passed-in @err_no. + * 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, + g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file \"%s\"", "Could not allocate %lu bytes to read file \"%s\"", (gulong)total_allocated), + (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, + g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file \"%s\"", "Could not allocate %lu bytes to read file \"%s\"", (gulong)alloc_size), + (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: (type filename): name of a file to read contents from, in the GLib file name encoding + * @contents: (out) (array length=length) (element-type guint8): location to store an allocated string, use g_free() to free + * the returned string + * @length: (allow-none): 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)); + + fclose (file); + g_unlink (tmp_name); + + goto out; + } + +#ifdef BTRFS_SUPER_MAGIC + { + struct statfs buf; + + /* On Linux, on btrfs, skip the fsync since rename-over-existing is + * guaranteed to be atomic and this is the only case in which we + * would fsync() anyway. + */ + + if (fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC) + goto no_fsync; + } +#endif + +#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)); + + fclose (file); + g_unlink (tmp_name); + + goto out; + } + } +#endif + +#ifdef BTRFS_SUPER_MAGIC + no_fsync: +#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: (type filename): name of a file to write @contents to, in the GLib file name + * encoding + * @contents: (array length=length) (element-type guint8): 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 successful, 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. + * + * Note that the name for the temporary file is constructed by appending up + * to 7 characters to @filename. + * + * 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; +} + +/* + * get_tmp_file 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. + */ +typedef gint (*GTmpFileCallback) (const gchar *, gint, gint); + +static gint +get_tmp_file (gchar *tmpl, + GTmpFileCallback f, + 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]; + + fd = f (tmpl, flags, 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; +} + +/* Some GTmpFileCallback implementations. + * + * Note: we cannot use open() or g_open() directly because even though + * they appear compatible, they may be vararg functions and calling + * varargs functions through a non-varargs type is undefined. + */ +static gint +wrap_g_mkdir (const gchar *filename, + int flags G_GNUC_UNUSED, + int mode) +{ + /* tmpl is in UTF-8 on Windows, thus use g_mkdir() */ + return g_mkdir (filename, mode); +} + +static gint +wrap_g_open (const gchar *filename, + int flags, + int mode) +{ + return g_open (filename, flags, mode); +} + +/** + * g_mkdtemp_full: + * @tmpl: (type filename): template directory name + * @mode: permissions to create the temporary directory with + * + * Creates a temporary directory. See the mkdtemp() documentation + * on most UNIX-like systems. + * + * The parameter is a string that should follow the rules for + * mkdtemp() templates, i.e. contain the string "XXXXXX". + * g_mkdtemp() is slightly more flexible than mkdtemp() in that the + * sequence does not have to occur at the very end of the template + * and you can pass a @mode. The X string will be modified to form + * the name of a directory 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 pointer to @tmpl, which has been modified + * to hold the directory name. In case of errors, %NULL is + * returned, and %errno will be set. + * + * Since: 2.30 + */ +gchar * +g_mkdtemp_full (gchar *tmpl, + gint mode) +{ + if (get_tmp_file (tmpl, wrap_g_mkdir, 0, mode) == -1) + return NULL; + else + return tmpl; +} + +/** + * g_mkdtemp: + * @tmpl: (type filename): template directory name + * + * Creates a temporary directory. See the mkdtemp() documentation + * on most UNIX-like systems. + * + * The parameter is a string that should follow the rules for + * mkdtemp() templates, i.e. contain the string "XXXXXX". + * g_mkdtemp() is slightly more flexible than mkdtemp() 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 directory 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 pointer to @tmpl, which has been modified + * to hold the directory name. In case of errors, %NULL is + * returned and %errno will be set. + * + * Since: 2.30 + */ +gchar * +g_mkdtemp (gchar *tmpl) +{ + return g_mkdtemp_full (tmpl, 0700); +} + +/** + * g_mkstemp_full: + * @tmpl: (type filename): template filename + * @flags: flags to pass to an open() call in addition to O_EXCL + * and O_CREAT, which are passed automatically + * @mode: permissions 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 + * and %errno will be set. + * + * Since: 2.22 + */ +gint +g_mkstemp_full (gchar *tmpl, + gint flags, + gint mode) +{ + /* tmpl is in UTF-8 on Windows, thus use g_open() */ + return get_tmp_file (tmpl, wrap_g_open, + flags | O_CREAT | O_EXCL, mode); +} + +/** + * g_mkstemp: + * @tmpl: (type filename): 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 and %errno will be set. + */ +gint +g_mkstemp (gchar *tmpl) +{ + return g_mkstemp_full (tmpl, O_RDWR | O_BINARY, 0600); +} + +static gint +g_get_tmp_name (const gchar *tmpl, + gchar **name_used, + GTmpFileCallback f, + gint flags, + gint mode, + 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 = get_tmp_file (fulltemplate, f, flags, mode); + 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; + } + + *name_used = fulltemplate; + + return retval; +} + +/** + * g_file_open_tmp: + * @tmpl: (type filename) (allow-none): Template for file name, as in + * g_mkstemp(), basename only, or %NULL for a default template + * @name_used: (out) (type filename): 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. + * + * Upon success, and if @name_used is non-%NULL, the actual name used + * is returned in @name_used. 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) +{ + gchar *fulltemplate; + gint result; + + result = g_get_tmp_name (tmpl, &fulltemplate, + wrap_g_open, + O_CREAT | O_EXCL | O_RDWR | O_BINARY, + 0600, + error); + if (result != -1) + { + if (name_used) + *name_used = fulltemplate; + else + g_free (fulltemplate); + } + + return result; +} + +/** + * g_dir_make_tmp: + * @tmpl: (type filename) (allow-none): Template for directory name, + * as in g_mkdtemp(), basename only, or %NULL for a default template + * @error: return location for a #GError + * + * Creates a subdirectory 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_mkdtemp() (and mkdtemp()) @tmpl is not + * modified, and might thus be a read-only literal string. + * + * Return value: (type filename): The actual name used. This string + * should be freed with g_free() when not needed any longer and is + * is in the GLib file name encoding. In case of errors, %NULL is + * returned and @error will be set. + * + * Since: 2.30 + */ +gchar * +g_dir_make_tmp (const gchar *tmpl, + GError **error) +{ + gchar *fulltemplate; + + if (g_get_tmp_name (tmpl, &fulltemplate, wrap_g_mkdir, 0, 0700, error) == -1) + return NULL; + else + return fulltemplate; +} + +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: (array zero-terminated=1): %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 + * @...: 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: (array zero-terminated=1): %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 + * @...: 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; +} + +/** + * 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 +} + +/** + * g_path_is_absolute: + * @file_name: a file name + * + * Returns %TRUE if the given @file_name is an absolute file name. + * Note that this is a somewhat vague concept on Windows. + * + * On POSIX systems, an absolute file name is well-defined. It always + * starts from the single root directory. For example "/usr/local". + * + * On Windows, the concepts of current drive and drive-specific + * current directory introduce vagueness. This function interprets as + * an absolute file name one that either begins with a directory + * separator such as "\Users\tml" or begins with the root on a drive, + * for example "C:\Windows". The first case also includes UNC paths + * such as "\\myserver\docs\foo". In all cases, either slashes or + * backslashes are accepted. + * + * Note that a file name relative to the current drive root does not + * truly specify a file uniquely over time and across processes, as + * the current drive is a per-process value and can be changed. + * + * File names relative the current directory on some specific drive, + * such as "D:foo/bar", are not interpreted as absolute by this + * function, but they obviously are not relative to the normal current + * directory as returned by getcwd() or g_get_current_dir() + * either. Such paths should be avoided, or need to be handled using + * Windows-specific code. + * + * Returns: %TRUE if @file_name is absolute + */ +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 + + 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 + */ +const 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; + + 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_basename: + * @file_name: the name of the file + * + * Gets the name of the file without any leading directory + * components. It returns a pointer into the given file name + * string. + * + * Return value: the name of the file without any leading + * directory components + * + * Deprecated:2.2: 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. + */ +const gchar * +g_basename (const gchar *file_name) +{ + gchar *base; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, G_DIR_SEPARATOR); + +#ifdef G_OS_WIN32 + { + gchar *q; + q = strrchr (file_name, '/'); + if (base == NULL || (q != NULL && q > 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 + + 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) +{ + gssize base; + gssize last_nonslash; + gsize len; + gchar *retval; + + g_return_val_if_fail (file_name != NULL, NULL); + + if (file_name[0] == '\0') + 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 + 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_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 + * + * Deprecated: use g_path_get_dirname() instead + */ + +/** + * 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) +{ + gchar *base; + gsize len; + + g_return_val_if_fail (file_name != NULL, NULL); + + base = strrchr (file_name, G_DIR_SEPARATOR); + +#ifdef G_OS_WIN32 + { + gchar *q; + 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; +} + +#if defined(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 + +/** + * 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 + 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 /* !G_OS_WIN32 */ +} + + +/* NOTE : Keep this part last to ensure nothing in this file uses thn + * 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 + +static gint +wrap_libc_open (const gchar *filename, + int flags, + int mode) +{ + return open (filename, flags, mode); +} + +gint +g_mkstemp (gchar *tmpl) +{ + /* This is the backward compatibility system codepage version, + * thus use normal open(). + */ + return get_tmp_file (tmpl, wrap_libc_open, + O_RDWR | O_CREAT | O_EXCL, 0600); +} + +#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; +} + +#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; +} + +#endif + diff --git a/glib/gfileutils.h b/glib/gfileutils.h new file mode 100644 index 0000000..93dbde3 --- /dev/null +++ b/glib/gfileutils.h @@ -0,0 +1,208 @@ +/* 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. + */ + +#ifndef __G_FILEUTILS_H__ +#define __G_FILEUTILS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +GQuark g_file_error_quark (void); +/* So other code can generate a GFileError */ +GLIB_AVAILABLE_IN_ALL +GFileError g_file_error_from_errno (gint err_no); + +GLIB_AVAILABLE_IN_ALL +gboolean g_file_test (const gchar *filename, + GFileTest test); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_get_contents (const gchar *filename, + gchar **contents, + gsize *length, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_set_contents (const gchar *filename, + const gchar *contents, + gssize length, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_file_read_link (const gchar *filename, + GError **error); + +/* Wrapper / workalike for mkdtemp() */ +GLIB_AVAILABLE_IN_2_30 +gchar *g_mkdtemp (gchar *tmpl); +GLIB_AVAILABLE_IN_2_30 +gchar *g_mkdtemp_full (gchar *tmpl, + gint mode); + +/* Wrapper / workalike for mkstemp() */ +GLIB_AVAILABLE_IN_ALL +gint g_mkstemp (gchar *tmpl); +GLIB_AVAILABLE_IN_ALL +gint g_mkstemp_full (gchar *tmpl, + gint flags, + gint mode); + +/* Wrappers for g_mkstemp and g_mkdtemp() */ +GLIB_AVAILABLE_IN_ALL +gint g_file_open_tmp (const gchar *tmpl, + gchar **name_used, + GError **error); +GLIB_AVAILABLE_IN_2_30 +gchar *g_dir_make_tmp (const gchar *tmpl, + GError **error); + +GLIB_AVAILABLE_IN_ALL +gchar *g_build_path (const gchar *separator, + const gchar *first_element, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +gchar *g_build_pathv (const gchar *separator, + gchar **args) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gchar *g_build_filename (const gchar *first_element, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +gchar *g_build_filenamev (gchar **args) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gint g_mkdir_with_parents (const gchar *pathname, + gint mode); + +#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 */ + +#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 */ + +GLIB_AVAILABLE_IN_ALL +gboolean g_path_is_absolute (const gchar *file_name); +GLIB_AVAILABLE_IN_ALL +const gchar *g_path_skip_root (const gchar *file_name); + +GLIB_DEPRECATED_FOR(g_path_get_basename) +const gchar *g_basename (const gchar *file_name); +#ifndef G_DISABLE_DEPRECATED +#define g_dirname g_path_get_dirname +#endif + +GLIB_AVAILABLE_IN_ALL +gchar *g_get_current_dir (void); +GLIB_AVAILABLE_IN_ALL +gchar *g_path_get_basename (const gchar *file_name) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_path_get_dirname (const gchar *file_name) G_GNUC_MALLOC; + +#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 +#define g_get_current_dir g_get_current_dir_utf8 + +GLIB_AVAILABLE_IN_ALL +gboolean g_file_test_utf8 (const gchar *filename, + GFileTest test); +GLIB_AVAILABLE_IN_ALL +gboolean g_file_get_contents_utf8 (const gchar *filename, + gchar **contents, + gsize *length, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint g_mkstemp_utf8 (gchar *tmpl); +GLIB_AVAILABLE_IN_ALL +gint g_file_open_tmp_utf8 (const gchar *tmpl, + gchar **name_used, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_get_current_dir_utf8 (void); +#endif /* G_OS_WIN32 */ + +G_END_DECLS + +#endif /* __G_FILEUTILS_H__ */ diff --git a/glib/ggettext.c b/glib/ggettext.c new file mode 100644 index 0000000..79abf0c --- /dev/null +++ b/glib/ggettext.c @@ -0,0 +1,622 @@ +/* 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/. + */ + +#include "config.h" + +#include "ggettext.h" +#include "glibintl.h" +#include "glib-private.h" + +#include "galloca.h" +#include "gthread.h" +#include "gmem.h" +#ifdef G_OS_WIN32 +#include "gwin32.h" +#include "gfileutils.h" +#include "gstrfuncs.h" +#include "glib-init.h" +#endif + +#include +#include +#include + +#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. + */ +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 */ + + +static void +ensure_gettext_initialized (void) +{ + static gsize initialised; + + if (g_once_init_enter (&initialised)) + { +#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 + g_once_init_leave (&initialised, TRUE); + } +} + +/** + * 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 + */ +const gchar * +glib_gettext (const gchar *str) +{ + ensure_gettext_initialized (); + + return g_dgettext (GETTEXT_PACKAGE, str); +} + +/** + * glib_pgettext: + * @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 glib_gettext() which supports + * a disambiguating message context. See g_dpgettext() for full + * details. + * + * This is an internal function and should only be used by + * the internals of glib (such as libgio). + * + * Returns: the translation of @str to the current locale + */ +const gchar * +glib_pgettext (const gchar *msgctxtid, + gsize msgidoffset) +{ + ensure_gettext_initialized (); + + return g_dpgettext (GETTEXT_PACKAGE, msgctxtid, msgidoffset); +} + +/** + * 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 + */ +const 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_dpgettext: + * @domain: (allow-none): 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 + */ +const 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: (allow-none): 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 + */ +const gchar * +g_dpgettext2 (const gchar *domain, + const gchar *msgctxt, + const gchar *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 (!default_domain || !translator_comment || !translate_locale || + (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: (allow-none): 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 + */ +const gchar * +g_dgettext (const gchar *domain, + const gchar *msgid) +{ + if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) + return msgid; + + return dgettext (domain, msgid); +} + +/** + * g_dcgettext: + * @domain: (allow-none): the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgid: message to translate + * @category: a locale category + * + * This is a variant of g_dgettext() that allows specifying a locale + * category instead of always using LC_MESSAGES. See g_dgettext() for + * more information about how this functions differs from calling + * dcgettext() directly. + * + * Returns: the translated string for the given locale category + * + * Since: 2.26 + */ +const gchar * +g_dcgettext (const gchar *domain, + const gchar *msgid, + gint category) +{ + if (domain && G_UNLIKELY (!_g_dgettext_should_translate ())) + return msgid; + + return dcgettext (domain, msgid, category); +} + +/** + * g_dngettext: + * @domain: (allow-none): 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 + */ +const 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); +} + + +/** + * SECTION:i18n + * @title: Internationalization + * @short_description: gettext support macros + * @see_also: the gettext manual + * + * 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, you 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> + * ]| + * For an application, note that you also have to call bindtextdomain(), + * bind_textdomain_codeset(), textdomain() and setlocale() early on in your + * main() to make gettext() work. + * + * For a library, you only have to call bindtextdomain() and + * bind_textdomain_codeset() in your initialization function. If your library + * doesn't have an initialization function, you can call the functions before + * the first translated message. + * + * The gettext manual covers details of how to set up message extraction + * with xgettext. + */ + +/** + * _: + * @String: the string to be translated + * + * Marks a string for translation, gets replaced with the translated string + * at runtime. + * + * Since: 2.4 + */ + +/** + * Q_: + * @String: the string to be translated, with a '|'-separated prefix + * which must not be translated + * + * 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. + * + * Returns: the translated message + * + * Since: 2.4 + */ + +/** + * C_: + * @Context: a message context, must be a string literal + * @String: a message id, must be a string literal + * + * Uses gettext to get the translation for @String. @Context 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. + * + * Returns: the translated message + * + * Since: 2.16 + */ + +/** + * N_: + * @String: the string to be translated + * + * 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); + * ... + * } + * ]| + * + * Since: 2.4 + */ + +/** + * NC_: + * @Context: a message context, must be a string literal + * @String: a message id, must be a string literal + * + * 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. + * + * + * Since: 2.18 + */ + diff --git a/glib/ggettext.h b/glib/ggettext.h new file mode 100644 index 0000000..e1ef576 --- /dev/null +++ b/glib/ggettext.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/. + */ + +#ifndef __G_GETTEXT_H__ +#define __G_GETTEXT_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +const gchar *g_strip_context (const gchar *msgid, + const gchar *msgval) G_GNUC_FORMAT(1); + +GLIB_AVAILABLE_IN_ALL +const gchar *g_dgettext (const gchar *domain, + const gchar *msgid) G_GNUC_FORMAT(2); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dcgettext (const gchar *domain, + const gchar *msgid, + gint category) G_GNUC_FORMAT(2); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dngettext (const gchar *domain, + const gchar *msgid, + const gchar *msgid_plural, + gulong n) G_GNUC_FORMAT(3); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dpgettext (const gchar *domain, + const gchar *msgctxtid, + gsize msgidoffset) G_GNUC_FORMAT(2); +GLIB_AVAILABLE_IN_ALL +const gchar *g_dpgettext2 (const gchar *domain, + const gchar *context, + const gchar *msgid) G_GNUC_FORMAT(3); + +G_END_DECLS + +#endif /* __G_GETTEXT_H__ */ diff --git a/glib/ghash.c b/glib/ghash.c new file mode 100644 index 0000000..492aa20 --- /dev/null +++ b/glib/ghash.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" + +#include /* memset */ + +#include "ghash.h" + +#include "gstrfuncs.h" +#include "gatomic.h" +#include "gtestutils.h" +#include "gslice.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(). + * + * g_hash_table_lookup_extended() can also be used to simply + * check if a key is present in the hash table. + * + * 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(). + * + * A common use-case for hash tables is to store information about a + * set of keys, without associating any particular value with each + * key. GHashTable optimizes one way of doing so: If you store only + * key-value pairs where key == value, then GHashTable does not + * allocate memory to store the values, which can be a considerable + * space saving, if your set is large. The functions + * g_hash_table_add() and g_hash_table_contains() are designed to be + * used when using #GHashTable this way. + */ + +/** + * 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 + * + * 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. + * + * g_direct_hash() is also the appropriate hash function for keys + * of the form GINT_TO_POINTER (n) (or similar macros). + * + * A good hash functions should produce + * hash values that are 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. + * + * Note that the hash functions provided by GLib have these qualities, + * but are not particularly robust against manufactured keys that + * cause hash collisions. Therefore, you should consider choosing + * a more secure hash function when using a GHashTable with keys + * that originate in untrusted data (such as HTTP requests). + * Using g_str_hash() in that situation might make your application + * vulerable to Algorithmic Complexity Attacks. + * + * The key to choosing a good hash is unpredictability. Even + * cryptographic hashes are very easy to find collisions for when the + * remainder is taken modulo a somewhat predictable prime number. There + * must be an element of randomness that an attacker is unable to guess. + * + * Returns: the hash value corresponding to the key + */ + +/** + * 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() + * + * 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. + * + * Returns: %TRUE if the key/value pair should be removed from the + * #GHashTable + */ + +/** + * GEqualFunc: + * @a: a value + * @b: a value to compare with + * + * 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. + * + * Returns: %TRUE if @a = @b; %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(). + */ + +/** + * 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. + */ + +/** + * 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 HASH_TABLE_MIN_SHIFT 3 /* 1 << 3 == 8 buckets */ + +#define UNUSED_HASH_VALUE 0 +#define TOMBSTONE_HASH_VALUE 1 +#define HASH_IS_UNUSED(h_) ((h_) == UNUSED_HASH_VALUE) +#define HASH_IS_TOMBSTONE(h_) ((h_) == TOMBSTONE_HASH_VALUE) +#define HASH_IS_REAL(h_) ((h_) >= 2) + +struct _GHashTable +{ + gint size; + gint mod; + guint mask; + gint nnodes; + gint noccupied; /* nnodes + tombstones */ + + gpointer *keys; + guint *hashes; + gpointer *values; + + GHashFunc hash_func; + GEqualFunc key_equal_func; + 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: key hash return location + * + * 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. + * + * Returns: index of the described node + */ +static inline guint +g_hash_table_lookup_node (GHashTable *hash_table, + gconstpointer key, + guint *hash_return) +{ + guint node_index; + guint node_hash; + guint hash_value; + guint first_tombstone = 0; + gboolean have_tombstone = FALSE; + guint step = 0; + + hash_value = hash_table->hash_func (key); + if (G_UNLIKELY (!HASH_IS_REAL (hash_value))) + hash_value = 2; + + *hash_return = hash_value; + + node_index = hash_value % hash_table->mod; + node_hash = hash_table->hashes[node_index]; + + while (!HASH_IS_UNUSED (node_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_hash == hash_value) + { + gpointer node_key = hash_table->keys[node_index]; + + 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 (HASH_IS_TOMBSTONE (node_hash) && !have_tombstone) + { + first_tombstone = node_index; + have_tombstone = TRUE; + } + + step++; + node_index += step; + node_index &= hash_table->mask; + node_hash = hash_table->hashes[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, + gint i, + gboolean notify) +{ + gpointer key; + gpointer value; + + key = hash_table->keys[i]; + value = hash_table->values[i]; + + /* Erect tombstone */ + hash_table->hashes[i] = TOMBSTONE_HASH_VALUE; + + /* Be GC friendly */ + hash_table->keys[i] = NULL; + hash_table->values[i] = NULL; + + hash_table->nnodes--; + + if (notify && hash_table->key_destroy_func) + hash_table->key_destroy_func (key); + + if (notify && hash_table->value_destroy_func) + hash_table->value_destroy_func (value); + +} + +/* + * 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; + gpointer key; + gpointer value; + + hash_table->nnodes = 0; + hash_table->noccupied = 0; + + if (!notify || + (hash_table->key_destroy_func == NULL && + hash_table->value_destroy_func == NULL)) + { + memset (hash_table->hashes, 0, hash_table->size * sizeof (guint)); + memset (hash_table->keys, 0, hash_table->size * sizeof (gpointer)); + memset (hash_table->values, 0, hash_table->size * sizeof (gpointer)); + + return; + } + + for (i = 0; i < hash_table->size; i++) + { + if (HASH_IS_REAL (hash_table->hashes[i])) + { + key = hash_table->keys[i]; + value = hash_table->values[i]; + + hash_table->hashes[i] = UNUSED_HASH_VALUE; + hash_table->keys[i] = NULL; + hash_table->values[i] = NULL; + + if (hash_table->key_destroy_func != NULL) + hash_table->key_destroy_func (key); + + if (hash_table->value_destroy_func != NULL) + hash_table->value_destroy_func (value); + } + else if (HASH_IS_TOMBSTONE (hash_table->hashes[i])) + { + hash_table->hashes[i] = UNUSED_HASH_VALUE; + } + } +} + +/* + * 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) +{ + gpointer *new_keys; + gpointer *new_values; + guint *new_hashes; + gint old_size; + gint i; + + old_size = hash_table->size; + g_hash_table_set_shift_from_size (hash_table, hash_table->nnodes * 2); + + new_keys = g_new0 (gpointer, hash_table->size); + if (hash_table->keys == hash_table->values) + new_values = new_keys; + else + new_values = g_new0 (gpointer, hash_table->size); + new_hashes = g_new0 (guint, hash_table->size); + + for (i = 0; i < old_size; i++) + { + guint node_hash = hash_table->hashes[i]; + guint hash_val; + guint step = 0; + + if (!HASH_IS_REAL (node_hash)) + continue; + + hash_val = node_hash % hash_table->mod; + + while (!HASH_IS_UNUSED (new_hashes[hash_val])) + { + step++; + hash_val += step; + hash_val &= hash_table->mask; + } + + new_hashes[hash_val] = hash_table->hashes[i]; + new_keys[hash_val] = hash_table->keys[i]; + new_values[hash_val] = hash_table->values[i]; + } + + if (hash_table->keys != hash_table->values) + g_free (hash_table->values); + + g_free (hash_table->keys); + g_free (hash_table->hashes); + + hash_table->keys = new_keys; + hash_table->values = new_values; + hash_table->hashes = new_hashes; + + 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 + * @key_equal_func: a function to check two keys for equality + * + * Creates a new #GHashTable with a reference count of 1. + * + * Hash values returned by @hash_func 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 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. + * + * 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: (allow-none): 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: (allow-none): 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->keys = g_new0 (gpointer, hash_table->size); + hash_table->values = hash_table->keys; + hash_table->hashes = g_new0 (guint, 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: (allow-none): a location to store the key, or %NULL + * @value: (allow-none): 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; + 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; + } + } + while (!HASH_IS_REAL (ri->hash_table->hashes[position])); + + if (key != NULL) + *key = ri->hash_table->keys[position]; + if (value != NULL) + *value = ri->hash_table->values[position]; + + 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->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_insert_node: + * @hash_table: our #GHashTable + * @node_index: pointer to node to insert/replace + * @key_hash: key hash + * @key: (allow-none): key to replace with, or %NULL + * @value: value to replace with + * @keep_new_key: whether to replace the key in the node with @key + * @reusing_key: whether @key was taken out of the existing node + * + * Inserts a value at @node_index in the hash table and updates it. + * + * If @key has been taken out of the existing node (ie it is not + * passed in via a g_hash_table_insert/replace) call, then @reusing_key + * should be %TRUE. + */ +static void +g_hash_table_insert_node (GHashTable *hash_table, + guint node_index, + guint key_hash, + gpointer new_key, + gpointer new_value, + gboolean keep_new_key, + gboolean reusing_key) +{ + gboolean already_exists; + guint old_hash; + gpointer key_to_free; + gpointer value_to_free; + + old_hash = hash_table->hashes[node_index]; + already_exists = HASH_IS_REAL (old_hash); + + /* Proceed in three steps. First, deal with the key because it is the + * most complicated. Then consider if we need to split the table in + * two (because writing the value will result in the set invariant + * becoming broken). Then deal with the value. + * + * There are three cases for the key: + * + * - entry already exists in table, reusing key: + * free the just-passed-in new_key and use the existing value + * + * - entry already exists in table, not reusing key: + * free the entry in the table, use the new key + * + * - entry not already in table: + * use the new key, free nothing + * + * We update the hash at the same time... + */ + if (already_exists) + { + /* Note: we must record the old value before writing the new key + * because we might change the value in the event that the two + * arrays are shared. + */ + value_to_free = hash_table->values[node_index]; + + if (keep_new_key) + { + key_to_free = hash_table->keys[node_index]; + hash_table->keys[node_index] = new_key; + } + else + key_to_free = new_key; + } + else + { + hash_table->hashes[node_index] = key_hash; + hash_table->keys[node_index] = new_key; + } + + /* Step two: check if the value that we are about to write to the + * table is the same as the key in the same position. If it's not, + * split the table. + */ + if (G_UNLIKELY (hash_table->keys == hash_table->values && hash_table->keys[node_index] != new_value)) + hash_table->values = g_memdup (hash_table->keys, sizeof (gpointer) * hash_table->size); + + /* Step 3: Actually do the write */ + hash_table->values[node_index] = new_value; + + /* Now, the bookkeeping... */ + if (!already_exists) + { + hash_table->nnodes++; + + if (HASH_IS_UNUSED (old_hash)) + { + /* 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 + } + + if (already_exists) + { + if (hash_table->key_destroy_func && !reusing_key) + (* hash_table->key_destroy_func) (key_to_free); + if (hash_table->value_destroy_func) + (* hash_table->value_destroy_func) (value_to_free); + } +} + +/** + * g_hash_table_iter_replace: + * @iter: an initialized #GHashTableIter + * @value: the value to replace with + * + * Replaces the value currently pointed to by the iterator + * from its associated #GHashTable. Can only be called after + * g_hash_table_iter_next() returned %TRUE. + * + * If you supplied a @value_destroy_func when creating the + * #GHashTable, the old value is freed using that function. + * + * Since: 2.30 + */ +void +g_hash_table_iter_replace (GHashTableIter *iter, + gpointer value) +{ + RealIter *ri; + guint node_hash; + gpointer key; + + ri = (RealIter *) iter; + + 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); + + node_hash = ri->hash_table->hashes[ri->position]; + key = ri->hash_table->keys[ri->position]; + + g_hash_table_insert_node (ri->hash_table, ri->position, node_hash, key, value, TRUE, TRUE); + +#ifndef G_DISABLE_ASSERT + ri->version++; + ri->hash_table->version++; +#endif +} + +/** + * 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_atomic_int_inc (&hash_table->ref_count); + + 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); + + if (g_atomic_int_dec_and_test (&hash_table->ref_count)) + { + g_hash_table_remove_all_nodes (hash_table, TRUE); + if (hash_table->keys != hash_table->values) + g_free (hash_table->values); + g_free (hash_table->keys); + g_free (hash_table->hashes); + 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_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: (allow-none): the associated value, or %NULL if the key is not found + */ +gpointer +g_hash_table_lookup (GHashTable *hash_table, + gconstpointer key) +{ + guint node_index; + guint node_hash; + + g_return_val_if_fail (hash_table != NULL, NULL); + + node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); + + return HASH_IS_REAL (hash_table->hashes[node_index]) + ? hash_table->values[node_index] + : NULL; +} + +/** + * g_hash_table_lookup_extended: + * @hash_table: a #GHashTable + * @lookup_key: the key to look up + * @orig_key: (allow-none): return location for the original key, or %NULL + * @value: (allow-none): 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, provided the hash and equal functions + * of @hash_table are %NULL-safe. + * + * 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) +{ + guint node_index; + guint node_hash; + + g_return_val_if_fail (hash_table != NULL, FALSE); + + node_index = g_hash_table_lookup_node (hash_table, lookup_key, &node_hash); + + if (!HASH_IS_REAL (hash_table->hashes[node_index])) + return FALSE; + + if (orig_key) + *orig_key = hash_table->keys[node_index]; + + if (value) + *value = hash_table->values[node_index]; + + 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) +{ + guint key_hash; + guint node_index; + + g_return_if_fail (hash_table != NULL); + + node_index = g_hash_table_lookup_node (hash_table, key, &key_hash); + + g_hash_table_insert_node (hash_table, node_index, key_hash, key, value, keep_new_key, FALSE); +} + +/** + * 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_add: + * @hash_table: a #GHashTable + * @key: a key to insert + * + * This is a convenience function for using a #GHashTable as a set. It + * is equivalent to calling g_hash_table_replace() with @key as both the + * key and the value. + * + * When a hash table only ever contains keys that have themselves as the + * corresponding value it is able to be stored more efficiently. See + * the discussion in the section description. + * + * Since: 2.32 + **/ +void +g_hash_table_add (GHashTable *hash_table, + gpointer key) +{ + g_hash_table_insert_internal (hash_table, key, key, TRUE); +} + +/** + * g_hash_table_contains: + * @hash_table: a #GHashTable + * @key: a key to check + * + * Checks if @key is in @hash_table. + * + * Since: 2.32 + **/ +gboolean +g_hash_table_contains (GHashTable *hash_table, + gconstpointer key) +{ + guint node_index; + guint node_hash; + + g_return_val_if_fail (hash_table != NULL, FALSE); + + node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); + + return HASH_IS_REAL (hash_table->hashes[node_index]); +} + +/* + * 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) +{ + guint node_index; + guint node_hash; + + g_return_val_if_fail (hash_table != NULL, FALSE); + + node_index = g_hash_table_lookup_node (hash_table, key, &node_hash); + + if (!HASH_IS_REAL (hash_table->hashes[node_index])) + return FALSE; + + g_hash_table_remove_node (hash_table, node_index, 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. + * + * Returns: %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. + * + * Returns: %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: a #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; +#ifndef G_DISABLE_ASSERT + gint version = hash_table->version; +#endif + + for (i = 0; i < hash_table->size; i++) + { + guint node_hash = hash_table->hashes[i]; + gpointer node_key = hash_table->keys[i]; + gpointer node_value = hash_table->values[i]; + + if (HASH_IS_REAL (node_hash) && + (* func) (node_key, node_value, user_data)) + { + g_hash_table_remove_node (hash_table, i, notify); + deleted++; + } + +#ifndef G_DISABLE_ASSERT + g_return_val_if_fail (version == hash_table->version, 0); +#endif + } + + 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; +#ifndef G_DISABLE_ASSERT + gint version; +#endif + + g_return_if_fail (hash_table != NULL); + g_return_if_fail (func != NULL); + +#ifndef G_DISABLE_ASSERT + version = hash_table->version; +#endif + + for (i = 0; i < hash_table->size; i++) + { + guint node_hash = hash_table->hashes[i]; + gpointer node_key = hash_table->keys[i]; + gpointer node_value = hash_table->values[i]; + + if (HASH_IS_REAL (node_hash)) + (* func) (node_key, node_value, user_data); + +#ifndef G_DISABLE_ASSERT + g_return_if_fail (version == hash_table->version); +#endif + } +} + +/** + * 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: (allow-none): The value of the first key/value pair is returned, + * for which @predicate 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; +#ifndef G_DISABLE_ASSERT + gint version; +#endif + gboolean match; + + g_return_val_if_fail (hash_table != NULL, NULL); + g_return_val_if_fail (predicate != NULL, NULL); + +#ifndef G_DISABLE_ASSERT + version = hash_table->version; +#endif + + match = FALSE; + + for (i = 0; i < hash_table->size; i++) + { + guint node_hash = hash_table->hashes[i]; + gpointer node_key = hash_table->keys[i]; + gpointer node_value = hash_table->values[i]; + + if (HASH_IS_REAL (node_hash)) + match = predicate (node_key, node_value, user_data); + +#ifndef G_DISABLE_ASSERT + g_return_val_if_fail (version == hash_table->version, NULL); +#endif + + if (match) + 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++) + { + if (HASH_IS_REAL (hash_table->hashes[i])) + retval = g_list_prepend (retval, hash_table->keys[i]); + } + + 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++) + { + if (HASH_IS_REAL (hash_table->hashes[i])) + retval = g_list_prepend (retval, hash_table->values[i]); + } + + return retval; +} + +/* 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 non-%NULL 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. + * + * This function implements the widely used "djb" hash apparently posted + * by Daniel Bernstein to comp.lang.c some time ago. The 32 bit + * unsigned hash value starts at 5381 and for each byte 'c' in the + * string, is updated: hash = hash * 33 + c. This + * function uses the signed value of each byte. + * + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using non-%NULL strings as keys in a #GHashTable. + * + * Returns: a hash value corresponding to the key + */ +guint +g_str_hash (gconstpointer v) +{ + const signed char *p; + guint32 h = 5381; + + for (p = v; *p != '\0'; p++) + h = (h << 5) + h + *p; + + return h; +} + +/** + * g_direct_hash: + * @v: (allow-none): 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 opaque pointers compared by pointer value as keys in a + * #GHashTable. + * + * This hash function is also appropriate for keys that are integers stored + * in pointers, such as GINT_TO_POINTER (n). + * + * Returns: a hash value corresponding to the key. + */ +guint +g_direct_hash (gconstpointer v) +{ + return GPOINTER_TO_UINT (v); +} + +/** + * g_direct_equal: + * @v1: (allow-none): a key + * @v2: (allow-none): 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 opaque pointers compared by pointer value as keys + * in a #GHashTable. + * + * This equality function is also appropriate for keys that are integers stored + * in pointers, such as GINT_TO_POINTER (n). + * + * 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 non-%NULL pointers to integers as keys in a + * #GHashTable. + * + * Note that this function acts on pointers to #gint, not on #gint directly: + * if your hash table's keys are of the form + * GINT_TO_POINTER (n), use g_direct_equal() instead. + * + * 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 non-%NULL pointers to integer values as keys in a #GHashTable. + * + * Note that this function acts on pointers to #gint, not on #gint directly: + * if your hash table's keys are of the form + * GINT_TO_POINTER (n), use g_direct_hash() instead. + * + * 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 non-%NULL 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 non-%NULL pointers to 64-bit integer 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 non-%NULL 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, + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using non-%NULL 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; +} diff --git a/glib/ghash.h b/glib/ghash.h new file mode 100644 index 0000000..19054bb --- /dev/null +++ b/glib/ghash.h @@ -0,0 +1,184 @@ +/* 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_HASH_H__ +#define __G_HASH_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +}; + +GLIB_AVAILABLE_IN_ALL +GHashTable* g_hash_table_new (GHashFunc hash_func, + GEqualFunc key_equal_func); +GLIB_AVAILABLE_IN_ALL +GHashTable* g_hash_table_new_full (GHashFunc hash_func, + GEqualFunc key_equal_func, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_destroy (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_insert (GHashTable *hash_table, + gpointer key, + gpointer value); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_replace (GHashTable *hash_table, + gpointer key, + gpointer value); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_add (GHashTable *hash_table, + gpointer key); +GLIB_AVAILABLE_IN_ALL +gboolean g_hash_table_remove (GHashTable *hash_table, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_remove_all (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +gboolean g_hash_table_steal (GHashTable *hash_table, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_steal_all (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +gpointer g_hash_table_lookup (GHashTable *hash_table, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +gboolean g_hash_table_contains (GHashTable *hash_table, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +gboolean g_hash_table_lookup_extended (GHashTable *hash_table, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_foreach (GHashTable *hash_table, + GHFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gpointer g_hash_table_find (GHashTable *hash_table, + GHRFunc predicate, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +guint g_hash_table_foreach_remove (GHashTable *hash_table, + GHRFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +guint g_hash_table_foreach_steal (GHashTable *hash_table, + GHRFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +guint g_hash_table_size (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +GList * g_hash_table_get_keys (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +GList * g_hash_table_get_values (GHashTable *hash_table); + +GLIB_AVAILABLE_IN_ALL +void g_hash_table_iter_init (GHashTableIter *iter, + GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +gboolean g_hash_table_iter_next (GHashTableIter *iter, + gpointer *key, + gpointer *value); +GLIB_AVAILABLE_IN_ALL +GHashTable* g_hash_table_iter_get_hash_table (GHashTableIter *iter); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_iter_remove (GHashTableIter *iter); +GLIB_AVAILABLE_IN_2_30 +void g_hash_table_iter_replace (GHashTableIter *iter, + gpointer value); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_iter_steal (GHashTableIter *iter); + +GLIB_AVAILABLE_IN_ALL +GHashTable* g_hash_table_ref (GHashTable *hash_table); +GLIB_AVAILABLE_IN_ALL +void g_hash_table_unref (GHashTable *hash_table); + +#ifndef G_DISABLE_DEPRECATED +#define g_hash_table_freeze(hash_table) ((void)0) +#define g_hash_table_thaw(hash_table) ((void)0) +#endif + +/* Hash Functions + */ +GLIB_AVAILABLE_IN_ALL +gboolean g_str_equal (gconstpointer v1, + gconstpointer v2); +GLIB_AVAILABLE_IN_ALL +guint g_str_hash (gconstpointer v); + +GLIB_AVAILABLE_IN_ALL +gboolean g_int_equal (gconstpointer v1, + gconstpointer v2); +GLIB_AVAILABLE_IN_ALL +guint g_int_hash (gconstpointer v); + +GLIB_AVAILABLE_IN_ALL +gboolean g_int64_equal (gconstpointer v1, + gconstpointer v2); +GLIB_AVAILABLE_IN_ALL +guint g_int64_hash (gconstpointer v); + +GLIB_AVAILABLE_IN_ALL +gboolean g_double_equal (gconstpointer v1, + gconstpointer v2); +GLIB_AVAILABLE_IN_ALL +guint g_double_hash (gconstpointer v); + +GLIB_AVAILABLE_IN_ALL +guint g_direct_hash (gconstpointer v) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_direct_equal (gconstpointer v1, + gconstpointer v2) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_HASH_H__ */ diff --git a/glib/ghmac.c b/glib/ghmac.c new file mode 100644 index 0000000..1da1b7f --- /dev/null +++ b/glib/ghmac.c @@ -0,0 +1,400 @@ +/* ghmac.h - data hashing functions + * + * Copyright (C) 2011 Collabora Ltd. + * + * 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. + * + * Author: Stef Walter + */ + +#include "config.h" + +#include + +#include "ghmac.h" + +#include "glib/galloca.h" +#include "gatomic.h" +#include "gslice.h" +#include "gmem.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gtypes.h" +#include "glibintl.h" + + +/** + * SECTION:hmac + * @title: Secure HMAC Digests + * @short_description: computes the HMAC for data + * + * HMACs should be used when producing a cookie or hash based on data + * and a key. Simple mechanisms for using SHA1 and other algorithms to + * digest a key and data together are vulnerable to various security + * issues. HMAC + * uses algorithms like SHA1 in a secure way to produce a digest of a + * key and data. + * + * Both the key and data are arbitrary byte arrays of bytes or characters. + * + * Support for HMAC Digests has been added in GLib 2.30. + */ + +struct _GHmac +{ + int ref_count; + GChecksumType digest_type; + GChecksum *digesti; + GChecksum *digesto; +}; + +/** + * g_hmac_new: + * @digest_type: the desired type of digest + * @key: (array length=key_len): the key for the HMAC + * @key_len: the length of the keys + * + * Creates a new #GHmac, using the digest algorithm @digest_type. + * If the @digest_type is not known, %NULL is returned. + * A #GHmac can be used to compute the HMAC of a key and an + * arbitrary binary blob, using different hashing algorithms. + * + * A #GHmac works by feeding a binary blob through g_hmac_update() + * until the data is complete; the digest can then be extracted + * using g_hmac_get_string(), which will return the checksum as a + * hexadecimal string; or g_hmac_get_digest(), which will return a + * array of raw bytes. Once either g_hmac_get_string() or + * g_hmac_get_digest() have been called on a #GHmac, the HMAC + * will be closed and it won't be possible to call g_hmac_update() + * on it anymore. + * + * Return value: the newly created #GHmac, or %NULL. + * Use g_hmac_unref() to free the memory allocated by it. + * + * Since: 2.30 + */ +GHmac * +g_hmac_new (GChecksumType digest_type, + const guchar *key, + gsize key_len) +{ + GChecksum *checksum; + GHmac *hmac; + guchar *buffer; + guchar *pad; + gsize i, len; + gsize block_size; + + checksum = g_checksum_new (digest_type); + g_return_val_if_fail (checksum != NULL, NULL); + + switch (digest_type) + { + case G_CHECKSUM_MD5: + case G_CHECKSUM_SHA1: + block_size = 64; /* RFC 2104 */ + break; + case G_CHECKSUM_SHA256: + block_size = 64; /* RFC draft-kelly-ipsec-ciph-sha2-01 */ + break; + default: + g_return_val_if_reached (NULL); + } + + hmac = g_slice_new0 (GHmac); + hmac->ref_count = 1; + hmac->digest_type = digest_type; + hmac->digesti = checksum; + hmac->digesto = g_checksum_new (digest_type); + + buffer = g_alloca (block_size); + pad = g_alloca (block_size); + + memset (buffer, 0, block_size); + + /* If the key is too long, hash it */ + if (key_len > block_size) + { + len = block_size; + g_checksum_update (hmac->digesti, key, key_len); + g_checksum_get_digest (hmac->digesti, buffer, &len); + g_checksum_reset (hmac->digesti); + } + + /* Otherwise pad it with zeros */ + else + { + memcpy (buffer, key, key_len); + } + + /* First pad */ + for (i = 0; i < block_size; i++) + pad[i] = 0x36 ^ buffer[i]; /* ipad value */ + g_checksum_update (hmac->digesti, pad, block_size); + + /* Second pad */ + for (i = 0; i < block_size; i++) + pad[i] = 0x5c ^ buffer[i]; /* opad value */ + g_checksum_update (hmac->digesto, pad, block_size); + + return hmac; +} + +/** + * g_hmac_copy: + * @hmac: the #GHmac to copy + * + * Copies a #GHmac. If @hmac has been closed, by calling + * g_hmac_get_string() or g_hmac_get_digest(), the copied + * HMAC will be closed as well. + * + * Return value: the copy of the passed #GHmac. Use g_hmac_unref() + * when finished using it. + * + * Since: 2.30 + */ +GHmac * +g_hmac_copy (const GHmac *hmac) +{ + GHmac *copy; + + g_return_val_if_fail (hmac != NULL, NULL); + + copy = g_slice_new (GHmac); + copy->ref_count = 1; + copy->digest_type = hmac->digest_type; + copy->digesti = g_checksum_copy (hmac->digesti); + copy->digesto = g_checksum_copy (hmac->digesto); + + return copy; +} + +/** + * g_hmac_ref: + * @hmac: a valid #GHmac + * + * Atomically increments the reference count of @hmac by one. + * + * This function is MT-safe and may be called from any thread. + * + * Return value: the passed in #GHmac. + * + * Since: 2.30 + **/ +GHmac * +g_hmac_ref (GHmac *hmac) +{ + g_return_val_if_fail (hmac != NULL, NULL); + + g_atomic_int_inc (&hmac->ref_count); + + return hmac; +} + +/** + * g_hmac_unref: + * @hmac: a #GHmac + * + * Atomically decrements the reference count of @hmac 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. + * Frees the memory allocated for @hmac. + * + * Since: 2.30 + */ +void +g_hmac_unref (GHmac *hmac) +{ + g_return_if_fail (hmac != NULL); + + if (g_atomic_int_dec_and_test (&hmac->ref_count)) + { + g_checksum_free (hmac->digesti); + g_checksum_free (hmac->digesto); + g_slice_free (GHmac, hmac); + } +} + +/** + * g_hmac_update: + * @hmac: a #GHmac + * @data: (array length=length): buffer used to compute the checksum + * @length: size of the buffer, or -1 if it is a nul-terminated string + * + * Feeds @data into an existing #GHmac. + * + * The HMAC must still be open, that is g_hmac_get_string() or + * g_hmac_get_digest() must not have been called on @hmac. + * + * Since: 2.30 + */ +void +g_hmac_update (GHmac *hmac, + const guchar *data, + gssize length) +{ + g_return_if_fail (hmac != NULL); + g_return_if_fail (length == 0 || data != NULL); + + g_checksum_update (hmac->digesti, data, length); +} + +/** + * g_hmac_get_string: + * @hmac: a #GHmac + * + * Gets the HMAC as an hexadecimal string. + * + * Once this function has been called the #GHmac can no longer be + * updated with g_hmac_update(). + * + * The hexadecimal characters will be lower case. + * + * Return value: the hexadecimal representation of the HMAC. The + * returned string is owned by the HMAC and should not be modified + * or freed. + * + * Since: 2.30 + */ +const gchar * +g_hmac_get_string (GHmac *hmac) +{ + guint8 *buffer; + gsize digest_len; + + g_return_val_if_fail (hmac != NULL, NULL); + + digest_len = g_checksum_type_get_length (hmac->digest_type); + buffer = g_alloca (digest_len); + + /* This is only called for its side-effect of updating hmac->digesto... */ + g_hmac_get_digest (hmac, buffer, &digest_len); + /* ... because we get the string from the checksum rather than + * stringifying buffer ourselves + */ + return g_checksum_get_string (hmac->digesto); +} + +/** + * g_hmac_get_digest: + * @hmac: a #GHmac + * @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 array and places it + * into @buffer. The size of the digest depends on the type of checksum. + * + * Once this function has been called, the #GHmac is closed and can + * no longer be updated with g_checksum_update(). + * + * Since: 2.30 + */ +void +g_hmac_get_digest (GHmac *hmac, + guint8 *buffer, + gsize *digest_len) +{ + gsize len; + + g_return_if_fail (hmac != NULL); + + len = g_checksum_type_get_length (hmac->digest_type); + g_return_if_fail (*digest_len >= len); + + /* Use the same buffer, because we can :) */ + g_checksum_get_digest (hmac->digesti, buffer, &len); + g_checksum_update (hmac->digesto, buffer, len); + g_checksum_get_digest (hmac->digesto, buffer, digest_len); +} + +/** + * g_compute_hmac_for_data: + * @digest_type: a #GChecksumType to use for the HMAC + * @key: (array length=key_len): the key to use in the HMAC + * @key_len: the length of the key + * @data: binary blob to compute the HMAC of + * @length: length of @data + * + * Computes the HMAC for a binary @data of @length. This is a + * convenience wrapper for g_hmac_new(), g_hmac_get_string() + * and g_hmac_unref(). + * + * The hexadecimal string returned will be in lower case. + * + * Return value: the HMAC of the binary data as a string in hexadecimal. + * The returned string should be freed with g_free() when done using it. + * + * Since: 2.30 + */ +gchar * +g_compute_hmac_for_data (GChecksumType digest_type, + const guchar *key, + gsize key_len, + const guchar *data, + gsize length) +{ + GHmac *hmac; + gchar *retval; + + g_return_val_if_fail (length == 0 || data != NULL, NULL); + + hmac = g_hmac_new (digest_type, key, key_len); + if (!hmac) + return NULL; + + g_hmac_update (hmac, data, length); + retval = g_strdup (g_hmac_get_string (hmac)); + g_hmac_unref (hmac); + + return retval; +} + +/** + * g_compute_hmac_for_string: + * @digest_type: a #GChecksumType to use for the HMAC + * @key: (array length=key_len): the key to use in the HMAC + * @key_len: the length of the key + * @str: the string to compute the HMAC for + * @length: the length of the string, or -1 if the string is nul-terminated + * + * Computes the HMAC for a string. + * + * The hexadecimal string returned will be in lower case. + * + * Return value: the HMAC as a hexadecimal string. + * The returned string should be freed with g_free() + * when done using it. + * + * Since: 2.30 + */ +gchar * +g_compute_hmac_for_string (GChecksumType digest_type, + const guchar *key, + gsize key_len, + const gchar *str, + gssize length) +{ + g_return_val_if_fail (length == 0 || str != NULL, NULL); + + if (length < 0) + length = strlen (str); + + return g_compute_hmac_for_data (digest_type, key, key_len, + (const guchar *) str, length); +} diff --git a/glib/ghmac.h b/glib/ghmac.h new file mode 100644 index 0000000..94bc427 --- /dev/null +++ b/glib/ghmac.h @@ -0,0 +1,80 @@ +/* ghmac.h - secure data hashing + * + * Copyright (C) 2011 Stef Walter + * + * 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. + */ + +#ifndef __G_HMAC_H__ +#define __G_HMAC_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include "gchecksum.h" + +G_BEGIN_DECLS + +/** + * GHmac: + * + * An opaque structure representing a HMAC operation. + * To create a new GHmac, use g_hmac_new(). To free + * a GHmac, use g_hmac_unref(). + * + * Since: 2.30 + */ +typedef struct _GHmac GHmac; + +GLIB_AVAILABLE_IN_2_30 +GHmac * g_hmac_new (GChecksumType digest_type, + const guchar *key, + gsize key_len); +GLIB_AVAILABLE_IN_2_30 +GHmac * g_hmac_copy (const GHmac *hmac); +GLIB_AVAILABLE_IN_2_30 +GHmac * g_hmac_ref (GHmac *hmac); +GLIB_AVAILABLE_IN_2_30 +void g_hmac_unref (GHmac *hmac); +GLIB_AVAILABLE_IN_2_30 +void g_hmac_update (GHmac *hmac, + const guchar *data, + gssize length); +GLIB_AVAILABLE_IN_2_30 +const gchar * g_hmac_get_string (GHmac *hmac); +GLIB_AVAILABLE_IN_2_30 +void g_hmac_get_digest (GHmac *hmac, + guint8 *buffer, + gsize *digest_len); + +GLIB_AVAILABLE_IN_2_30 +gchar *g_compute_hmac_for_data (GChecksumType digest_type, + const guchar *key, + gsize key_len, + const guchar *data, + gsize length); +GLIB_AVAILABLE_IN_2_30 +gchar *g_compute_hmac_for_string (GChecksumType digest_type, + const guchar *key, + gsize key_len, + const gchar *str, + gssize length); + +G_END_DECLS + +#endif /* __G_CHECKSUM_H__ */ diff --git a/glib/ghook.c b/glib/ghook.c new file mode 100644 index 0000000..93ea846 --- /dev/null +++ b/glib/ghook.c @@ -0,0 +1,1054 @@ +/* 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 "ghook.h" + +#include "gtestutils.h" +#include "gslice.h" + +/** + * SECTION:hooks + * @title: Hook Functions + * @short_description: 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. + */ + +/** + * GHookList: + * @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 + * + * The GHookList struct represents a + * list of hook functions. + */ + +/** + * GHookFinalizeFunc: + * @hook_list: a #GHookList + * @hook: the hook in @hook_list that gets finalized + * + * Defines the type of function to be called when a hook in a + * list of hooks gets finalized. + */ + +/** + * GHookFlagMask: + * @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_FLAG_USER_SHIFT + * + * Flags used internally in the #GHook implementation. + */ + +/** + * G_HOOK_FLAGS: + * @hook: a #GHook + * + * Gets the flags of a hook. + */ + +/** + * G_HOOK_FLAG_USER_SHIFT: + * + * 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: + * @hook: a pointer + * + * Casts a pointer to a GHook*. + */ + +/** + * G_HOOK_IS_VALID: + * @hook: a #GHook + * + * Returns %TRUE if the #GHook is valid, i.e. it is in a #GHookList, + * it is active and it has not been destroyed. + * + * Returns: %TRUE if the #GHook is valid + */ + +/** + * G_HOOK_ACTIVE: + * @hook: a #GHook + * + * Returns %TRUE if the #GHook is active, which is normally the case + * until the #GHook is destroyed. + * + * Returns: %TRUE if the #GHook is active + */ + +/** + * G_HOOK_IN_CALL: + * @hook: a #GHook + * + * Returns %TRUE if the #GHook function is currently executing. + * + * Returns: %TRUE if the #GHook function is currently executing + */ + +/** + * G_HOOK_IS_UNLINKED: + * @hook: a #GHook + * + * Returns %TRUE if the #GHook is not in a #GHookList. + + * Returns: %TRUE if the #GHook is not in a #GHookList + */ + +/** + * GHook: + * @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 + * + * The GHook struct represents a single hook + * function in a #GHookList. + */ + +/** + * GHookFunc: + * @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(). + */ + +/** + * GHookCheckFunc: + * @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(). + * + * Returns: %FALSE if the #GHook should be destroyed + */ + +/* --- functions --- */ +static void +default_finalize_hook (GHookList *hook_list, + GHook *hook) +{ + GDestroyNotify destroy = hook->destroy; + + if (destroy) + { + hook->destroy = NULL; + destroy (hook->data); + } +} + +/** + * g_hook_list_init: + * @hook_list: a #GHookList + * @hook_size: the size of each element in the #GHookList, + * typically sizeof (GHook) + * + * Initializes a #GHookList. + * This must be called before the #GHookList is used. + */ +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; +} + +/** + * g_hook_list_clear: + * @hook_list: a #GHookList + * + * Removes all the #GHook elements from a #GHookList. + */ +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); + } +} + +/** + * g_hook_alloc: + * @hook_list: a #GHookList + * + * Allocates space for a #GHook and initializes it. + * + * Returns: a new #GHook + */ +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; +} +/** + * g_hook_free: + * @hook_list: a #GHookList + * @hook: the #GHook to free + * + * Calls the #GHookList @finalize_hook function if it exists, + * and frees the memory allocated for the #GHook. + */ +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); +} + +/** + * g_hook_destroy_link: + * @hook_list: a #GHookList + * @hook: the #GHook to remove + * + * Removes one #GHook from a #GHookList, marking it + * inactive and calling g_hook_unref() on it. + */ +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 */ + } +} + +/** + * g_hook_destroy: + * @hook_list: a #GHookList + * @hook_id: a hook ID + * + * Destroys a #GHook, given its ID. + * + * Returns: %TRUE if the #GHook was found in the #GHookList and destroyed + */ +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; +} + +/** + * g_hook_unref: + * @hook_list: a #GHookList + * @hook: the #GHook to unref + * + * 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. + */ +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); + } +} + +/** + * g_hook_ref: + * @hook_list: a #GHookList + * @hook: the #GHook to increment the reference count of + * + * Increments the reference count for a #GHook. + * + * Returns: the @hook that was passed in (since 2.6) + */ +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; +} + +/** + * g_hook_append: + * @hook_list: a #GHookList + * @hook: the #GHook to add to the end of @hook_list + * + * Appends a #GHook onto the end of a #GHookList. + */ + +/** + * g_hook_prepend: + * @hook_list: a #GHookList + * @hook: the #GHook to add to the start of @hook_list + * + * Prepends a #GHook on the start of a #GHookList. + */ +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); +} + +/** + * g_hook_insert_before: + * @hook_list: a #GHookList + * @sibling: the #GHook to insert the new #GHook before + * @hook: the #GHook to insert + * + * Inserts a #GHook into a #GHookList, before a given #GHook. + */ +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; + } +} + +/** + * g_hook_list_invoke: + * @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. + */ +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); + } +} + +/** + * g_hook_list_invoke_check: + * @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. + */ +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); + } +} + +/** + * GHookCheckMarshaller: + * @hook: a #GHook + * @marshal_data: user data + * + * Defines the type of function used by g_hook_list_marshal_check(). + * + * Returns: %FALSE if @hook should be destroyed + */ + +/** + * g_hook_list_marshal_check: + * @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 + * + * Calls a function on each valid #GHook and destroys it if the + * function returns %FALSE. + */ +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); + } +} + +/** + * GHookMarshaller: + * @hook: a #GHook + * @marshal_data: user data + * + * Defines the type of function used by g_hook_list_marshal(). + */ + +/** + * g_hook_list_marshal: + * @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 + * + * Calls a function on each valid #GHook. + */ +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); + } +} + +/** + * g_hook_first_valid: + * @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 #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.) + * + * Returns: the first valid #GHook, or %NULL if none are valid + */ +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; +} + +/** + * g_hook_next_valid: + * @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 #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.) + * + * Returns: the next valid #GHook, or %NULL if none are valid + */ +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; +} + +/** + * g_hook_get: + * @hook_list: a #GHookList + * @hook_id: a hook id + * + * Returns the #GHook with the given id, or %NULL if it is not found. + * + * Returns: the #GHook with the given id, or %NULL if it is not found + */ +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; +} + +/** + * GHookFindFunc: + * @hook: a #GHook + * @data: user data passed to g_hook_find_func() + * + * Defines the type of the function passed to g_hook_find(). + * + * Returns: %TRUE if the required #GHook has been found + */ + +/** + * g_hook_find: + * @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 + * + * Finds a #GHook in a #GHookList using the given function to + * test for a match. + * + * Returns: the found #GHook or %NULL if no matching #GHook is found + */ +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; +} + +/** + * g_hook_find_data: + * @hook_list: a #GHookList + * @need_valids: %TRUE if #GHook elements which have been destroyed + * should be skipped + * @data: the data to find + * + * Finds a #GHook in a #GHookList with the given data. + * + * Returns: the #GHook with the given @data or %NULL if no matching + * #GHook is found + */ +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; +} + +/** + * g_hook_find_func: + * @hook_list: a #GHookList + * @need_valids: %TRUE if #GHook elements which have been destroyed + * should be skipped + * @func: the function to find + * + * Finds a #GHook in a #GHookList with the given function. + * + * Returns: the #GHook with the given @func or %NULL if no matching + * #GHook is found + */ +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; +} + +/** + * g_hook_find_func_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 + * + * Finds a #GHook in a #GHookList with the given function and data. + * + * Returns: the #GHook with the given @func and @data or %NULL if + * no matching #GHook is found + */ +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; +} + +/** + * GHookCompareFunc: + * @new_hook: the #GHook being inserted + * @sibling: the #GHook to compare with @new_hook + * + * Defines the type of function used to compare #GHook elements in + * g_hook_insert_sorted(). + * + * Returns: a value <= 0 if @new_hook should be before @sibling + */ + +/** + * g_hook_insert_sorted: + * @hook_list: a #GHookList + * @hook: the #GHook to insert + * @func: the comparison function used to sort the #GHook elements + * + * Inserts a #GHook into a #GHookList, sorted by the given function. + */ +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); +} + +/** + * g_hook_compare_ids: + * @new_hook: a #GHook + * @sibling: a #GHook to compare with @new_hook + * + * Compares the ids of two #GHook elements, returning a negative value + * if the second id is greater than the first. + * + * Returns: a value <= 0 if the id of @sibling is >= the id of @new_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; +} diff --git a/glib/ghook.h b/glib/ghook.h new file mode 100644 index 0000000..45e1e27 --- /dev/null +++ b/glib/ghook.h @@ -0,0 +1,204 @@ +/* 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_HOOK_H__ +#define __G_HOOK_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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 */ +GLIB_AVAILABLE_IN_ALL +void g_hook_list_init (GHookList *hook_list, + guint hook_size); +GLIB_AVAILABLE_IN_ALL +void g_hook_list_clear (GHookList *hook_list); +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_alloc (GHookList *hook_list); +GLIB_AVAILABLE_IN_ALL +void g_hook_free (GHookList *hook_list, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +GHook * g_hook_ref (GHookList *hook_list, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +void g_hook_unref (GHookList *hook_list, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +gboolean g_hook_destroy (GHookList *hook_list, + gulong hook_id); +GLIB_AVAILABLE_IN_ALL +void g_hook_destroy_link (GHookList *hook_list, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +void g_hook_prepend (GHookList *hook_list, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +void g_hook_insert_before (GHookList *hook_list, + GHook *sibling, + GHook *hook); +GLIB_AVAILABLE_IN_ALL +void g_hook_insert_sorted (GHookList *hook_list, + GHook *hook, + GHookCompareFunc func); +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_get (GHookList *hook_list, + gulong hook_id); +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_find (GHookList *hook_list, + gboolean need_valids, + GHookFindFunc func, + gpointer data); +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_find_data (GHookList *hook_list, + gboolean need_valids, + gpointer data); +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_find_func (GHookList *hook_list, + gboolean need_valids, + gpointer func); +GLIB_AVAILABLE_IN_ALL +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 */ +GLIB_AVAILABLE_IN_ALL +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 + */ +GLIB_AVAILABLE_IN_ALL +GHook* g_hook_next_valid (GHookList *hook_list, + GHook *hook, + gboolean may_be_in_call); +/* GHookCompareFunc implementation to insert hooks sorted by their id */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +void g_hook_list_invoke_check (GHookList *hook_list, + gboolean may_recurse); +/* invoke a marshaller on all valid hooks. + */ +GLIB_AVAILABLE_IN_ALL +void g_hook_list_marshal (GHookList *hook_list, + gboolean may_recurse, + GHookMarshaller marshaller, + gpointer marshal_data); +GLIB_AVAILABLE_IN_ALL +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..99afe9a --- /dev/null +++ b/glib/ghostutils.c @@ -0,0 +1,800 @@ +/* -*- 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 + +#include "ghostutils.h" + +#include "garray.h" +#include "gmem.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "glibintl.h" + + +/** + * SECTION:ghostutils + * @short_description: Internet hostname utilities + * + * 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, + gboolean *is_unicode) +{ + 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)) + { + *is_unicode = FALSE; + if (name == (gchar *)hostname) + return len == -1 ? g_strdup (hostname) : g_strndup (hostname, len); + else + return name; + } + + *is_unicode = TRUE; + + /* 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; +} + +/* RFC 3490, section 3.1 says '.', 0x3002, 0xFF0E, and 0xFF61 count as + * label-separating dots. @str must be '\0'-terminated. + */ +#define idna_is_dot(str) ( \ + ((guchar)(str)[0] == '.') || \ + ((guchar)(str)[0] == 0xE3 && (guchar)(str)[1] == 0x80 && (guchar)(str)[2] == 0x82) || \ + ((guchar)(str)[0] == 0xEF && (guchar)(str)[1] == 0xBC && (guchar)(str)[2] == 0x8E) || \ + ((guchar)(str)[0] == 0xEF && (guchar)(str)[1] == 0xBD && (guchar)(str)[2] == 0xA1) ) + +static const gchar * +idna_end_of_label (const gchar *str) +{ + for (; *str; str = g_utf8_next_char (str)) + { + if (idna_is_dot (str)) + return str; + } + return str; +} + +/** + * 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, &unicode); + if (!name || !unicode) + return name; + + out = g_string_new (NULL); + + do + { + unicode = FALSE; + for (p = label; *p && !idna_is_dot (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_utf8_next_char (label); + if (*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 = idna_end_of_label (hostname) - 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 + { + gboolean unicode; + gchar *canonicalized = nameprep (hostname, llen, &unicode); + + if (!canonicalized) + { + g_string_free (out, TRUE); + return NULL; + } + g_string_append (out, canonicalized); + g_free (canonicalized); + } + + hostname += llen; + if (*hostname) + hostname = g_utf8_next_char (hostname); + if (*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 = idna_end_of_label (hostname); + if (*hostname) + hostname = g_utf8_next_char (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; +} diff --git a/glib/ghostutils.h b/glib/ghostutils.h new file mode 100644 index 0000000..dfb64e5 --- /dev/null +++ b/glib/ghostutils.h @@ -0,0 +1,45 @@ +/* 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_HOST_UTILS_H__ +#define __G_HOST_UTILS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +gboolean g_hostname_is_non_ascii (const gchar *hostname); +GLIB_AVAILABLE_IN_ALL +gboolean g_hostname_is_ascii_encoded (const gchar *hostname); +GLIB_AVAILABLE_IN_ALL +gboolean g_hostname_is_ip_address (const gchar *hostname); + +GLIB_AVAILABLE_IN_ALL +gchar *g_hostname_to_ascii (const gchar *hostname); +GLIB_AVAILABLE_IN_ALL +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..d345773 --- /dev/null +++ b/glib/giochannel.c @@ -0,0 +1,2588 @@ +/* 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 + +#include "giochannel.h" + +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "glibintl.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_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_GNUC_UNUSED; + + 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 manually if you need greater control. + * + * Returns: the event source id + * Rename to: g_io_add_watch + */ +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() + * + * 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. + * + * Returns: the function should return %FALSE if the event source + * should be removed + **/ +/** + * 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 +#if EOVERFLOW != EFBIG + case EOVERFLOW: + return G_IO_CHANNEL_ERROR_OVERFLOW; +#endif +#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: (allow-none): 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. + **/ +const 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_FLAG_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 cannot be changed. + * @G_IO_FLAG_IS_WRITABLE: indicates that the io channel is writable. + * This flag cannot 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 cannot 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(). + **/ +/** + * G_IO_FLAG_IS_WRITEABLE: + * + * This is a misspelled version of G_IO_FLAG_IS_WRITABLE that existed + * before the spelling was fixed in GLib 2.30. It is kept here for + * compatibility reasons. + * + * Deprecated:2.30:Use G_IO_FLAG_IS_WRITABLE instead. + **/ +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_WRITABLE + * 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_WRITABLE; + + 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: (allow-none): 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. + **/ +const 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: (out): 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: (allow-none) (out): location to store length of the read data, or %NULL + * @terminator_pos: (allow-none) (out): 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: (allow-none): 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: (out) (array length=length) (element-type guint8): 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: (out): 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: (out caller-allocates) (array length=count) (element-type guint8): + * a buffer to read data into + * @count: (in): 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: (allow-none) (out): 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) + { + if (bytes_read) + *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: (array) (element-type guint8): 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: (out): 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. + **/ + +G_DEFINE_QUARK (g-io-channel-error-quark, g_io_channel_error) diff --git a/glib/giochannel.h b/glib/giochannel.h new file mode 100644 index 0000000..a1578b1 --- /dev/null +++ b/glib/giochannel.h @@ -0,0 +1,415 @@ +/* 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_IOCHANNEL_H__ +#define __G_IOCHANNEL_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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_FLAG_APPEND = 1 << 0, + G_IO_FLAG_NONBLOCK = 1 << 1, + G_IO_FLAG_IS_READABLE = 1 << 2, /* Read only flag */ + G_IO_FLAG_IS_WRITABLE = 1 << 3, /* Read only flag */ + G_IO_FLAG_IS_WRITEABLE = 1 << 3, /* Misspelling in 2.29.10 and earlier */ + 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); +}; + +GLIB_AVAILABLE_IN_ALL +void g_io_channel_init (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +GIOChannel *g_io_channel_ref (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +void g_io_channel_unref (GIOChannel *channel); + +GLIB_DEPRECATED_FOR(g_io_channel_read_for) +GIOError g_io_channel_read (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read); + +GLIB_DEPRECATED_FOR(g_io_channel_write_chars) +GIOError g_io_channel_write (GIOChannel *channel, + const gchar *buf, + gsize count, + gsize *bytes_written); + +GLIB_DEPRECATED_FOR(g_io_channel_seek_position) +GIOError g_io_channel_seek (GIOChannel *channel, + gint64 offset, + GSeekType type); + +GLIB_DEPRECATED_FOR(g_io_channel_shutdown) +void g_io_channel_close (GIOChannel *channel); + +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_shutdown (GIOChannel *channel, + gboolean flush, + GError **err); +GLIB_AVAILABLE_IN_ALL +guint g_io_add_watch_full (GIOChannel *channel, + gint priority, + GIOCondition condition, + GIOFunc func, + gpointer user_data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +GSource * g_io_create_watch (GIOChannel *channel, + GIOCondition condition); +GLIB_AVAILABLE_IN_ALL +guint g_io_add_watch (GIOChannel *channel, + GIOCondition condition, + GIOFunc func, + gpointer user_data); + +/* character encoding conversion involved functions. + */ + +GLIB_AVAILABLE_IN_ALL +void g_io_channel_set_buffer_size (GIOChannel *channel, + gsize size); +GLIB_AVAILABLE_IN_ALL +gsize g_io_channel_get_buffer_size (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +GIOCondition g_io_channel_get_buffer_condition (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_set_flags (GIOChannel *channel, + GIOFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOFlags g_io_channel_get_flags (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +void g_io_channel_set_line_term (GIOChannel *channel, + const gchar *line_term, + gint length); +GLIB_AVAILABLE_IN_ALL +const gchar * g_io_channel_get_line_term (GIOChannel *channel, + gint *length); +GLIB_AVAILABLE_IN_ALL +void g_io_channel_set_buffered (GIOChannel *channel, + gboolean buffered); +GLIB_AVAILABLE_IN_ALL +gboolean g_io_channel_get_buffered (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_set_encoding (GIOChannel *channel, + const gchar *encoding, + GError **error); +GLIB_AVAILABLE_IN_ALL +const gchar * g_io_channel_get_encoding (GIOChannel *channel); +GLIB_AVAILABLE_IN_ALL +void g_io_channel_set_close_on_unref (GIOChannel *channel, + gboolean do_close); +GLIB_AVAILABLE_IN_ALL +gboolean g_io_channel_get_close_on_unref (GIOChannel *channel); + + +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_flush (GIOChannel *channel, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_read_line (GIOChannel *channel, + gchar **str_return, + gsize *length, + gsize *terminator_pos, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_read_line_string (GIOChannel *channel, + GString *buffer, + gsize *terminator_pos, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_read_to_end (GIOChannel *channel, + gchar **str_return, + gsize *length, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_read_chars (GIOChannel *channel, + gchar *buf, + gsize count, + gsize *bytes_read, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_read_unichar (GIOChannel *channel, + gunichar *thechar, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_write_chars (GIOChannel *channel, + const gchar *buf, + gssize count, + gsize *bytes_written, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_write_unichar (GIOChannel *channel, + gunichar thechar, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOStatus g_io_channel_seek_position (GIOChannel *channel, + gint64 offset, + GSeekType type, + GError **error); +GLIB_AVAILABLE_IN_ALL +GIOChannel* g_io_channel_new_file (const gchar *filename, + const gchar *mode, + GError **error); + +/* Error handling */ + +GLIB_AVAILABLE_IN_ALL +GQuark g_io_channel_error_quark (void); +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +GIOChannel* g_io_channel_unix_new (int fd); +GLIB_AVAILABLE_IN_ALL +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(). + */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +GIOChannel *g_io_channel_win32_new_messages (gsize hwnd); +#else +GLIB_AVAILABLE_IN_ALL +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(). + */ +GLIB_AVAILABLE_IN_ALL +GIOChannel* g_io_channel_win32_new_fd (gint fd); + +/* Get the C runtime file descriptor of a channel. */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +GIOChannel *g_io_channel_win32_new_socket (gint socket); + +GLIB_DEPRECATED_FOR(g_io_channel_win32_new_socket) +GIOChannel *g_io_channel_win32_new_stream_socket (gint socket); + +GLIB_AVAILABLE_IN_ALL +void g_io_channel_win32_set_debug (GIOChannel *channel, + gboolean flag); + +#endif + +#ifdef G_OS_WIN32 +#define g_io_channel_new_file g_io_channel_new_file_utf8 + +GLIB_AVAILABLE_IN_ALL +GIOChannel *g_io_channel_new_file_utf8 (const gchar *filename, + const gchar *mode, + GError **error); +#endif + +G_END_DECLS + +#endif /* __G_IOCHANNEL_H__ */ diff --git a/glib/giounix.c b/glib/giounix.c new file mode 100644 index 0000000..517e36b --- /dev/null +++ b/glib/giounix.c @@ -0,0 +1,656 @@ +/* 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 + +#include "giochannel.h" + +#include "gerror.h" +#include "gfileutils.h" +#include "gstrfuncs.h" +#include "gtestutils.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)); + g_source_set_name (source, "GIOChannel (Unix)"); + 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_R_PLUS = MODE_R | MODE_PLUS, + MODE_W_PLUS = MODE_W | MODE_PLUS, + MODE_A_PLUS = MODE_A | MODE_PLUS + } 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_PLUS: + flags = O_RDWR; + break; + case MODE_W_PLUS: + flags = O_RDWR | O_TRUNC | O_CREAT; + break; + case MODE_A_PLUS: + flags = O_RDWR | O_APPEND | O_CREAT; + break; + case MODE_PLUS: + default: + g_assert_not_reached (); + flags = 0; + } + + create_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + + fid = g_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_PLUS: + case MODE_W_PLUS: + case MODE_A_PLUS: + channel->is_readable = TRUE; + channel->is_writeable = TRUE; + break; + case MODE_PLUS: + 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. + * + * 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. + * + * Returns: a new #GIOChannel. + **/ +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. + * + * On Windows this function returns the file descriptor or socket of + * the #GIOChannel. + * + * Returns: the file descriptor of the #GIOChannel. + **/ +gint +g_io_channel_unix_get_fd (GIOChannel *channel) +{ + GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel; + return unix_channel->fd; +} diff --git a/glib/giowin32.c b/glib/giowin32.c new file mode 100644 index 0000000..72cd84b --- /dev/null +++ b/glib/giowin32.c @@ -0,0 +1,2245 @@ +/* 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" + + +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_WRITABLE) + g_print ("%sWRITABLE", 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)); + g_source_set_name (source, "GIOChannel (Win32)"); + 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, + }; + int 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. + * + * 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. + * + * Returns: a new #GIOChannel. + **/ +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. + * + * 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. + * + * Returns: a new #GIOChannel. + **/ +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 + * + * 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. + * + * Returns: a new #GIOChannel + **/ +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 diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c new file mode 100644 index 0000000..ae20689 --- /dev/null +++ b/glib/gkeyfile.c @@ -0,0 +1,4374 @@ +/* gkeyfile.c - key file parser + * + * Copyright 2004 Red Hat, Inc. + * Copyright 2009-2010 Collabora Ltd. + * Copyright 2009 Nokia Corporation + * + * 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 "gutils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef G_OS_WIN32 +#include + +#undef fstat +#define fstat(a,b) _fstati64(a,b) +#undef stat +#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" + + +/** + * SECTION:keyfile + * @title: Key-value file parser + * @short_description: 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 from + * [group]. + * .ini files don't have a strongly typed boolean entry type, + * they only have GetProfileInt(). In key files, 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. + */ + +/** + * G_KEY_FILE_ERROR: + * + * Error domain for key file parsing. Errors in this domain will + * be from the #GKeyFileError enumeration. + * + * See #GError for information on error domains. + */ + +/** + * GKeyFileError: + * @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 + * + * Error codes returned by key file parsing. + */ + +/** + * GKeyFileFlags: + * @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. + * + * Flags which influence the parsing. + */ + +/** + * G_KEY_FILE_DESKTOP_GROUP: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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: + * + * 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 : + * + * 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: + * + * 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: + * + * 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: + * + * The value of the #G_KEY_FILE_DESKTOP_KEY_TYPE, key for desktop + * entries representing directories. + * + * Since: 2.14 + */ + +typedef struct _GKeyFileGroup GKeyFileGroup; + +/** + * GKeyFile: + * + * The GKeyFile struct contains only private data + * and should not be accessed directly. + */ +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 */ + + gchar list_separator; + + GKeyFileFlags flags; + + gchar **locales; + + volatile gint ref_count; +}; + +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 */ + + 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_value_pair (GKeyFile *key_file, + GKeyFileGroup *group, + GKeyFileKeyValuePair *pair); +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); + +G_DEFINE_QUARK (g-key-file-error-quark, g_key_file_error) + +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->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); + } + + if (key_file->group_hash != NULL) + { + 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: (transfer full): an empty #GKeyFile. + * + * Since: 2.6 + **/ +GKeyFile * +g_key_file_new (void) +{ + GKeyFile *key_file; + + key_file = g_slice_new0 (GKeyFile); + key_file->ref_count = 1; + 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 == -1) + { + gchar *candidate_file, *sub_dir; + + candidate_file = (gchar *) file; + sub_dir = g_strdup (""); + while (candidate_file != NULL && fd == -1) + { + gchar *p; + + path = g_build_filename (data_dir, sub_dir, + candidate_file, NULL); + + fd = g_open (path, O_RDONLY, 0); + + if (fd == -1) + { + 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 == -1) + { + 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]; + gchar list_separator; + + 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; + } + + list_separator = key_file->list_separator; + g_key_file_clear (key_file); + g_key_file_init (key_file); + key_file->list_separator = list_separator; + 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: (type filename): 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 == -1) + { + 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 (or -1 if data is nul-terminated) + * @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; + gchar list_separator; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (data != NULL || length == 0, FALSE); + + if (length == (gsize)-1) + length = strlen (data); + + list_separator = key_file->list_separator; + g_key_file_clear (key_file); + g_key_file_init (key_file); + key_file->list_separator = list_separator; + 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: (type filename): a relative path to a filename to open and parse + * @search_dirs: (array zero-terminated=1) (element-type filename): %NULL-terminated array of directories to search + * @full_path: (out) (type filename) (allow-none): 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 == -1) + { + 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: (type filename): a relative path to a filename to open and parse + * @full_path: (out) (type filename) (allow-none): 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_ref: (skip) + * @key_file: a #GKeyFile + * + * Increases the reference count of @key_file. + * + * Returns: the same @key_file. + * + * Since: 2.32 + **/ +GKeyFile * +g_key_file_ref (GKeyFile *key_file) +{ + g_return_val_if_fail (key_file != NULL, NULL); + + g_atomic_int_inc (&key_file->ref_count); + + return key_file; +} + +/** + * g_key_file_free: (skip) + * @key_file: a #GKeyFile + * + * Clears all keys and groups from @key_file, and decreases the + * reference count by 1. If the reference count reaches zero, + * frees the key file and all its allocated memory. + * + * 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_key_file_unref (key_file); +} + +/** + * g_key_file_unref: + * @key_file: a #GKeyFile + * + * Decreases the reference count of @key_file by 1. If the reference count + * reaches zero, frees the key file and all its allocated memory. + * + * Since: 2.32 + **/ +void +g_key_file_unref (GKeyFile *key_file) +{ + g_return_if_fail (key_file != NULL); + + if (g_atomic_int_dec_and_test (&key_file->ref_count)) + { + 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); +} + +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)) + { + GKeyFileKeyValuePair *pair; + + pair = g_slice_new (GKeyFileKeyValuePair); + pair->key = key; + pair->value = value; + + g_key_file_add_key_value_pair (key_file, key_file->current_group, pair); + } + else + { + g_free (key); + g_free (value); + } + + g_free (locale); +} + +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 || length == 0); + + parse_error = NULL; + + i = 0; + while (i < length) + { + if (data[i] == '\n') + { + if (key_file->parse_buffer->len > 0 + && (key_file->parse_buffer->str[key_file->parse_buffer->len - 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; + } + i++; + } + else + { + const gchar *start_of_line; + const gchar *end_of_line; + gsize line_length; + + start_of_line = data + i; + end_of_line = memchr (start_of_line, '\n', length - i); + + if (end_of_line == NULL) + end_of_line = data + length; + + line_length = end_of_line - start_of_line; + + g_string_append_len (key_file->parse_buffer, start_of_line, line_length); + i += line_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: (out) (allow-none): 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; + + g_return_val_if_fail (key_file != NULL, NULL); + + data_string = g_string_new (NULL); + + 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 (data_string->len >= 2 && + data_string->str[data_string->len - 2] != '\n') + g_string_append_c (data_string, '\n'); + + 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: (out) (allow-none): 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: (array zero-terminated=1) (transfer full): 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: (out) (allow-none): 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: (array zero-terminated=1) (transfer full): 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 a 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: (out) (allow-none): 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: (array zero-terminated=1 length=length) (element-type utf8) (transfer full): + * 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); + + g_slist_free_full (pieces, g_free); + 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: (array zero-terminated=1 length=length) (element-type utf8): 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); +} + +/** + * g_key_file_get_locale_string: + * @key_file: a #GKeyFile + * @group_name: a group name + * @key: a key + * @locale: (allow-none): 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) + { + languages = g_get_locale_variants (locale); + 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: (allow-none): a locale identifier or %NULL + * @length: (out) (allow-none): 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: (array zero-terminated=1 length=length) (element-type utf8) (transfer full): 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: (array zero-terminated=1 length=length): 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 a 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: (out): 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: (array length=length) (element-type gboolean) (transfer container): + * the values associated with the key as a list of booleans, or %NULL if the + * key was not found or could not be parsed. The returned list of booleans + * should be freed with g_free() when no longer needed. + * + * 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: (array length=length): 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 a 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_int64: + * @key_file: a non-%NULL #GKeyFile + * @group_name: a non-%NULL group name + * @key: a non-%NULL key + * @error: return location for a #GError + * + * Returns the value associated with @key under @group_name as a signed + * 64-bit integer. This is similar to g_key_file_get_integer() but can return + * 64-bit results without truncation. + * + * Returns: the value associated with the key as a signed 64-bit integer, or + * 0 if the key was not found or could not be parsed. + * + * Since: 2.26 + */ +gint64 +g_key_file_get_int64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *s, *end; + gint64 v; + + 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); + + s = g_key_file_get_value (key_file, group_name, key, error); + + if (s == NULL) + return 0; + + v = g_ascii_strtoll (s, &end, 10); + + if (*s == '\0' || *end != '\0') + { + g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key '%s' in group '%s' has value '%s' " + "where %s was expected"), + key, group_name, s, "int64"); + return 0; + } + + g_free (s); + return v; +} + +/** + * g_key_file_set_int64: + * @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.26 + **/ +void +g_key_file_set_int64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint64 value) +{ + gchar *result; + + g_return_if_fail (key_file != NULL); + + result = g_strdup_printf ("%" G_GINT64_FORMAT, value); + g_key_file_set_value (key_file, group_name, key, result); + g_free (result); +} + +/** + * g_key_file_get_uint64: + * @key_file: a non-%NULL #GKeyFile + * @group_name: a non-%NULL group name + * @key: a non-%NULL key + * @error: return location for a #GError + * + * Returns the value associated with @key under @group_name as an unsigned + * 64-bit integer. This is similar to g_key_file_get_integer() but can return + * large positive results without truncation. + * + * Returns: the value associated with the key as an unsigned 64-bit integer, + * or 0 if the key was not found or could not be parsed. + * + * Since: 2.26 + */ +guint64 +g_key_file_get_uint64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) +{ + gchar *s, *end; + guint64 v; + + 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); + + s = g_key_file_get_value (key_file, group_name, key, error); + + if (s == NULL) + return 0; + + v = g_ascii_strtoull (s, &end, 10); + + if (*s == '\0' || *end != '\0') + { + g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, + _("Key '%s' in group '%s' has value '%s' " + "where %s was expected"), + key, group_name, s, "uint64"); + return 0; + } + + g_free (s); + return v; +} + +/** + * g_key_file_set_uint64: + * @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.26 + **/ +void +g_key_file_set_uint64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + guint64 value) +{ + gchar *result; + + g_return_if_fail (key_file != NULL); + + result = g_strdup_printf ("%" G_GUINT64_FORMAT, 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: (out): 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: (array length=length) (element-type gint) (transfer container): + * the values associated with the key as a list of integers, or %NULL if + * the key was not found or could not be parsed. The returned list of + * integers should be freed with g_free() when no longer needed. + * + * 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: (array length=length): 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 a 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: (out): 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: (array length=length) (element-type gdouble) (transfer container): + * the values associated with the key as a list of doubles, or %NULL if the + * key was not found or could not be parsed. The returned list of doubles + * should be freed with g_free() when no longer needed. + * + * 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: (array length=length): 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. + */ + g_list_free_full (group->key_value_pairs, (GDestroyNotify) g_key_file_key_value_pair_free); + 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: (allow-none): a group name, or %NULL + * @key: (allow-none): 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; + } + + 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: (allow-none): 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: (allow-none): a group name, or %NULL + * @key: (allow-none): 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; +} + +/* This code remains from a historical attempt to add a new public API + * which respects the GError rules. + */ +static gboolean +g_key_file_has_key_full (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean *has_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); + + if (has_key) + *has_key = pair != NULL; + return TRUE; +} + +/** + * g_key_file_has_key: (skip) + * @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. + * + * This function does not follow the rules for #GError strictly; + * the return value both carries meaning and signals an error. To use + * this function, you must pass a #GError pointer in @error, and check + * whether it is not %NULL to see if an error occurred. + * + * Language bindings should use g_key_file_get_value() to test whether + * or not a key exists. + * + * 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) +{ + GError *temp_error = NULL; + gboolean has_key; + + if (g_key_file_has_key_full (key_file, group_name, key, &has_key, &temp_error)) + { + return has_key; + } + else + { + g_propagate_error (error, temp_error); + return FALSE; + } +} + +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->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); + + g_warn_if_fail (pair->value != NULL); + + 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); + + 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->comment) + { + g_key_file_key_value_pair_free (group->comment); + group->comment = 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_value_pair (GKeyFile *key_file, + GKeyFileGroup *group, + GKeyFileKeyValuePair *pair) +{ + g_hash_table_replace (group->lookup_map, pair->key, pair); + group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair); +} + +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_key_file_add_key_value_pair (key_file, group, pair); +} + +/** + * 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; + } + + 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 *eof_int; + glong long_value; + gint int_value; + + errno = 0; + long_value = strtol (value, &eof_int, 10); + + if (*value == '\0' || (*eof_int != '\0' && !g_ascii_isspace(*eof_int))) + { + 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); +} diff --git a/glib/gkeyfile.h b/glib/gkeyfile.h new file mode 100644 index 0000000..a4a1d3d --- /dev/null +++ b/glib/gkeyfile.h @@ -0,0 +1,315 @@ +/* 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. + */ + +#ifndef __G_KEY_FILE_H__ +#define __G_KEY_FILE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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() + +GLIB_AVAILABLE_IN_ALL +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; + +GLIB_AVAILABLE_IN_ALL +GKeyFile *g_key_file_new (void); +GLIB_AVAILABLE_IN_ALL +GKeyFile *g_key_file_ref (GKeyFile *key_file); +GLIB_AVAILABLE_IN_ALL +void g_key_file_unref (GKeyFile *key_file); +GLIB_AVAILABLE_IN_ALL +void g_key_file_free (GKeyFile *key_file); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_list_separator (GKeyFile *key_file, + gchar separator); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_load_from_file (GKeyFile *key_file, + const gchar *file, + GKeyFileFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_load_from_data (GKeyFile *key_file, + const gchar *data, + gsize length, + GKeyFileFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_load_from_dirs (GKeyFile *key_file, + const gchar *file, + const gchar **search_dirs, + gchar **full_path, + GKeyFileFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_load_from_data_dirs (GKeyFile *key_file, + const gchar *file, + gchar **full_path, + GKeyFileFlags flags, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_key_file_to_data (GKeyFile *key_file, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_key_file_get_start_group (GKeyFile *key_file) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar **g_key_file_get_groups (GKeyFile *key_file, + gsize *length) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar **g_key_file_get_keys (GKeyFile *key_file, + const gchar *group_name, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_has_group (GKeyFile *key_file, + const gchar *group_name); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_has_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_key_file_get_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_value (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *value); +GLIB_AVAILABLE_IN_ALL +gchar *g_key_file_get_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *string); +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_locale_string (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *locale, + const gchar *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_get_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_boolean (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean value); +GLIB_AVAILABLE_IN_ALL +gint g_key_file_get_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_integer (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint value); +GLIB_AVAILABLE_IN_ALL +gint64 g_key_file_get_int64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_int64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint64 value); +GLIB_AVAILABLE_IN_ALL +guint64 g_key_file_get_uint64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_uint64 (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + guint64 value); +GLIB_AVAILABLE_IN_ALL +gdouble g_key_file_get_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_double (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble value); +GLIB_AVAILABLE_IN_ALL +gchar **g_key_file_get_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_string_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar * const list[], + gsize length); +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean *g_key_file_get_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_boolean_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gboolean list[], + gsize length); +GLIB_AVAILABLE_IN_ALL +gint *g_key_file_get_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gdouble list[], + gsize length); +GLIB_AVAILABLE_IN_ALL +gdouble *g_key_file_get_double_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gsize *length, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_key_file_set_integer_list (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + gint list[], + gsize length); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_set_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + const gchar *comment, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_key_file_get_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_remove_comment (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_key_file_remove_key (GKeyFile *key_file, + const gchar *group_name, + const gchar *key, + GError **error); +GLIB_AVAILABLE_IN_ALL +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-init.c b/glib/glib-init.c new file mode 100644 index 0000000..49c7f61 --- /dev/null +++ b/glib/glib-init.c @@ -0,0 +1,273 @@ +/* + * Copyright © 2011 Canonical 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 "glib-init.h" + +#include "gutils.h" /* for GDebugKey */ +#include "gconstructor.h" + +#include +#include +#include +#include + +/** + * g_mem_gc_friendly: + * + * This variable is %TRUE if the G_DEBUG environment variable + * includes the key gc-friendly. + */ +#ifdef ENABLE_GC_FRIENDLY_DEFAULT +gboolean g_mem_gc_friendly = TRUE; +#else +gboolean g_mem_gc_friendly = FALSE; +#endif +GLogLevelFlags g_log_msg_prefix = G_LOG_LEVEL_ERROR | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_DEBUG; +GLogLevelFlags g_log_always_fatal = G_LOG_FATAL_MASK; + +static gboolean +debug_key_matches (const gchar *key, + const gchar *token, + guint length) +{ + /* may not call GLib functions: see note in g_parse_debug_string() */ + 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: (allow-none): a list of debug options separated by colons, spaces, or + * commas, or %NULL. + * @keys: (array length=nkeys): 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. Any flags + * specified along with "all" in @string are inverted; thus, + * "all,foo,bar" or "foo,bar,all" sets all flags + * except those corresponding to "foo" and "bar". + * + * 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 during the initialisation of gmessages, gmem + * and gslice, so it may not do anything that causes memory to be + * allocated or risks messages being emitted. + * + * this means, more or less, that this code may not call anything + * inside GLib. + */ + + if (!strcasecmp (string, "help")) + { + /* using stdio directly for the reason stated above */ + fprintf (stderr, "Supported debug values:"); + for (i = 0; i < nkeys; i++) + fprintf (stderr, " %s", keys[i].key); + fprintf (stderr, " all help\n"); + } + else + { + const gchar *p = string; + const gchar *q; + gboolean invert = FALSE; + + while (*p) + { + q = strpbrk (p, ":;, \t"); + if (!q) + q = p + strlen (p); + + if (debug_key_matches ("all", p, q - p)) + { + invert = TRUE; + } + else + { + for (i = 0; i < nkeys; i++) + if (debug_key_matches (keys[i].key, p, q - p)) + result |= keys[i].value; + } + + p = q; + if (*p) + p++; + } + + if (invert) + { + guint all_flags = 0; + + for (i = 0; i < nkeys; i++) + all_flags |= keys[i].value; + + result = all_flags & (~result); + } + } + + return result; +} + +static guint +g_parse_debug_envvar (const gchar *envvar, + const GDebugKey *keys, + gint n_keys, + guint default_value) +{ + const gchar *value; + +#ifdef OS_WIN32 + /* "fatal-warnings,fatal-criticals,all,help" is pretty short */ + gchar buffer[100]; + + if (GetEnvironmentVariable (envvar, buffer, 100) < 100) + value = buffer; + else + return 0; +#else + value = getenv (envvar); +#endif + + if (value == NULL) + return default_value; + + return g_parse_debug_string (value, keys, n_keys); +} + +static void +g_messages_prefixed_init (void) +{ + 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_envvar ("G_MESSAGES_PREFIXED", keys, G_N_ELEMENTS (keys), g_log_msg_prefix); +} + +static void +g_debug_init (void) +{ + const GDebugKey keys[] = { + { "gc-friendly", 1 }, + {"fatal-warnings", G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL }, + {"fatal-criticals", G_LOG_LEVEL_CRITICAL } + }; + GLogLevelFlags flags; + + flags = g_parse_debug_envvar ("G_DEBUG", keys, G_N_ELEMENTS (keys), 0); + + g_log_always_fatal |= flags & G_LOG_LEVEL_MASK; + + g_mem_gc_friendly = flags & 1; +} + +static void +glib_init (void) +{ + g_messages_prefixed_init (); + g_debug_init (); +} + +#if defined (G_OS_WIN32) + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved); + +HMODULE glib_dll; + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + glib_dll = hinstDLL; + g_clock_win32_init (); + g_thread_win32_init (); + glib_init (); + break; + + case DLL_THREAD_DETACH: + g_thread_win32_thread_detach (); + break; + + default: + /* do nothing */ + ; + } + + return TRUE; +} + +#elif defined (G_HAS_CONSTRUCTORS) + +#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(glib_init_ctor) +#endif +G_DEFINE_CONSTRUCTOR(glib_init_ctor) + +static void +glib_init_ctor (void) +{ + glib_init (); +} + +#else +# error Your platform/compiler is missing constructor support +#endif diff --git a/glib/glib-init.h b/glib/glib-init.h new file mode 100644 index 0000000..016465f --- /dev/null +++ b/glib/glib-init.h @@ -0,0 +1,40 @@ +/* + * Copyright © 2011 Canonical 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 __GLIB_INIT_H__ +#define __GLIB_INIT_H__ + +#include "gmessages.h" + +extern GLogLevelFlags g_log_always_fatal; +extern GLogLevelFlags g_log_msg_prefix; +GLIB_VAR gboolean g_mem_gc_friendly; + +#ifdef G_OS_WIN32 +#include + +void g_thread_win32_thread_detach (void); +void g_thread_win32_init (void); +void g_clock_win32_init (void); +extern HMODULE glib_dll; +#endif + +#endif /* __GLIB_INIT_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..336ba93 --- /dev/null +++ b/glib/glib-object.h @@ -0,0 +1,42 @@ +/* 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 +#include + +#undef __GLIB_GOBJECT_H_INSIDE__ + +#endif /* __GLIB_GOBJECT_H__ */ diff --git a/glib/glib-private.c b/glib/glib-private.c new file mode 100644 index 0000000..d2da2cd --- /dev/null +++ b/glib/glib-private.c @@ -0,0 +1,51 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2011 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: Colin Walters + */ + +#include "config.h" + +#include "glib-private.h" + +/** + * glib__private__: + * @arg: Do not use this argument + * + * Do not call this function; it is used to share private + * API between glib, gobject, and gio. + */ +GLibPrivateVTable * +glib__private__ (void) +{ + static GLibPrivateVTable table = { + g_wakeup_new, + g_wakeup_free, + g_wakeup_get_pollfd, + g_wakeup_signal, + g_wakeup_acknowledge, + + g_get_worker_context, + + g_check_setuid, + g_main_context_new_with_next_id + }; + + return &table; +} + diff --git a/glib/glib-private.h b/glib/glib-private.h new file mode 100644 index 0000000..7e2e61e --- /dev/null +++ b/glib/glib-private.h @@ -0,0 +1,58 @@ +/* glib-private.h - GLib-internal private API, shared between glib, gobject, gio + * Copyright (C) 2011 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. + */ + +#ifndef __GLIB_PRIVATE_H__ +#define __GLIB_PRIVATE_H__ + +#include +#include "gwakeup.h" + +GMainContext * g_get_worker_context (void); +gboolean g_check_setuid (void); +GMainContext * g_main_context_new_with_next_id (guint next_id); + +#ifdef G_OS_WIN32 +gchar *_glib_get_dll_directory (void); +GLIB_AVAILABLE_IN_ALL +gchar *_glib_get_locale_dir (void); +#endif + +#define GLIB_PRIVATE_CALL(symbol) (glib__private__()->symbol) + +typedef struct { + /* See gwakeup.c */ + GWakeup * (* g_wakeup_new) (void); + void (* g_wakeup_free) (GWakeup *wakeup); + void (* g_wakeup_get_pollfd) (GWakeup *wakeup, + GPollFD *poll_fd); + void (* g_wakeup_signal) (GWakeup *wakeup); + void (* g_wakeup_acknowledge) (GWakeup *wakeup); + + /* See gmain.c */ + GMainContext * (* g_get_worker_context) (void); + + gboolean (* g_check_setuid) (void); + GMainContext * (* g_main_context_new_with_next_id) (guint next_id); + /* Add other private functions here, initialize them in glib-private.c */ +} GLibPrivateVTable; + +GLIB_AVAILABLE_IN_ALL +GLibPrivateVTable *glib__private__ (void); + +#endif /* __G_MAIN_H__ */ diff --git a/glib/glib-unix.c b/glib/glib-unix.c new file mode 100644 index 0000000..26f1509 --- /dev/null +++ b/glib/glib-unix.c @@ -0,0 +1,424 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 2011 Red Hat, Inc. + * + * glib-unix.c: UNIX specific API wrappers and convenience functions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * 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: Colin Walters + */ + +#include "config.h" + +#include "glib-unix.h" +#include "gmain-internal.h" + +#include + +/** + * SECTION:gunix + * @title: UNIX-specific utilities and integration + * @short_description: pipes, signal handling + * @include: glib-unix.h + * + * Most of GLib is intended to be portable; in contrast, this set of + * functions is designed for programs which explicitly target UNIX, + * or are using it to build higher level abstractions which would be + * conditionally compiled if the platform matches G_OS_UNIX. + * + * To use these functions, you must explicitly include the + * "glib-unix.h" header. + */ + +G_DEFINE_QUARK (g-unix-error-quark, g_unix_error) + +static gboolean +g_unix_set_error_from_errno (GError **error, + gint saved_errno) +{ + g_set_error_literal (error, + G_UNIX_ERROR, + 0, + g_strerror (saved_errno)); + errno = saved_errno; + return FALSE; +} + +/** + * g_unix_open_pipe: + * @fds: Array of two integers + * @flags: Bitfield of file descriptor flags, see "man 2 fcntl" + * @error: a #GError + * + * Similar to the UNIX pipe() call, but on modern systems like Linux + * uses the pipe2() system call, which atomically creates a pipe with + * the configured flags. The only supported flag currently is + * FD_CLOEXEC. If for example you want to configure + * O_NONBLOCK, that must still be done separately with + * fcntl(). + * + * This function does *not* take O_CLOEXEC, it takes + * FD_CLOEXEC as if for fcntl(); these are + * different on Linux/glibc. + * + * Returns: %TRUE on success, %FALSE if not (and errno will be set). + * + * Since: 2.30 + */ +gboolean +g_unix_open_pipe (int *fds, + int flags, + GError **error) +{ + int ecode; + + /* We only support FD_CLOEXEC */ + g_return_val_if_fail ((flags & (FD_CLOEXEC)) == flags, FALSE); + +#ifdef HAVE_PIPE2 + { + int pipe2_flags = 0; + if (flags & FD_CLOEXEC) + pipe2_flags |= O_CLOEXEC; + /* Atomic */ + ecode = pipe2 (fds, pipe2_flags); + if (ecode == -1 && errno != ENOSYS) + return g_unix_set_error_from_errno (error, errno); + else if (ecode == 0) + return TRUE; + /* Fall through on -ENOSYS, we must be running on an old kernel */ + } +#endif + ecode = pipe (fds); + if (ecode == -1) + return g_unix_set_error_from_errno (error, errno); + + if (flags == 0) + return TRUE; + + ecode = fcntl (fds[0], F_SETFD, flags); + if (ecode == -1) + { + int saved_errno = errno; + close (fds[0]); + close (fds[1]); + return g_unix_set_error_from_errno (error, saved_errno); + } + ecode = fcntl (fds[1], F_SETFD, flags); + if (ecode == -1) + { + int saved_errno = errno; + close (fds[0]); + close (fds[1]); + return g_unix_set_error_from_errno (error, saved_errno); + } + return TRUE; +} + +/** + * g_unix_set_fd_nonblocking: + * @fd: A file descriptor + * @nonblock: If %TRUE, set the descriptor to be non-blocking + * @error: a #GError + * + * Control the non-blocking state of the given file descriptor, + * according to @nonblock. On most systems this uses O_NONBLOCK, but + * on some older ones may use O_NDELAY. + * + * Returns: %TRUE if successful + * + * Since: 2.30 + */ +gboolean +g_unix_set_fd_nonblocking (gint fd, + gboolean nonblock, + GError **error) +{ +#ifdef F_GETFL + glong fcntl_flags; + fcntl_flags = fcntl (fd, F_GETFL); + + if (fcntl_flags == -1) + return g_unix_set_error_from_errno (error, errno); + + if (nonblock) + { +#ifdef O_NONBLOCK + fcntl_flags |= O_NONBLOCK; +#else + fcntl_flags |= O_NDELAY; +#endif + } + else + { +#ifdef O_NONBLOCK + fcntl_flags &= ~O_NONBLOCK; +#else + fcntl_flags &= ~O_NDELAY; +#endif + } + + if (fcntl (fd, F_SETFL, fcntl_flags) == -1) + return g_unix_set_error_from_errno (error, errno); + return TRUE; +#else + return g_unix_set_error_from_errno (error, EINVAL); +#endif +} + +/** + * g_unix_signal_source_new: + * @signum: A signal number + * + * Create a #GSource that will be dispatched upon delivery of the UNIX + * signal @signum. In GLib versions before 2.36, only + * SIGHUP, SIGINT, + * SIGTERM can be monitored. In GLib 2.36, + * SIGUSR1 and SIGUSR2 were + * added. + * + * Note that unlike the UNIX default, all sources which have created a + * watch will be dispatched, regardless of which underlying thread + * invoked g_unix_signal_source_new(). + * + * For example, an effective use of this function is to handle SIGTERM + * cleanly; flushing any outstanding files, and then calling + * g_main_loop_quit (). It is not safe to do any of this a regular + * UNIX signal handler; your handler may be invoked while malloc() or + * another library function is running, causing reentrancy if you + * attempt to use it from the handler. None of the GLib/GObject API + * is safe against this kind of reentrancy. + * + * The interaction of this source when combined with native UNIX + * functions like sigprocmask() is not defined. + * + * 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. + * + * Returns: A newly created #GSource + * + * Since: 2.30 + */ +GSource * +g_unix_signal_source_new (int signum) +{ + g_return_val_if_fail (signum == SIGHUP || signum == SIGINT || signum == SIGTERM || + signum == SIGUSR1 || signum == SIGUSR2, NULL); + + return _g_main_create_unix_signal_watch (signum); +} + +/** + * g_unix_signal_add_full: + * @priority: the priority of the signal source. Typically this will be in + * the range between #G_PRIORITY_DEFAULT and #G_PRIORITY_HIGH. + * @signum: Signal number + * @handler: Callback + * @user_data: Data for @handler + * @notify: #GDestroyNotify for @handler + * + * A convenience function for g_unix_signal_source_new(), which + * attaches to the default #GMainContext. You can remove the watch + * using g_source_remove(). + * + * Returns: An ID (greater than 0) for the event source + * + * Rename to: g_unix_signal_add + * Since: 2.30 + */ +guint +g_unix_signal_add_full (int priority, + int signum, + GSourceFunc handler, + gpointer user_data, + GDestroyNotify notify) +{ + guint id; + GSource *source; + + source = g_unix_signal_source_new (signum); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, handler, user_data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_unix_signal_add: + * @signum: Signal number + * @handler: Callback + * @user_data: Data for @handler + * + * A convenience function for g_unix_signal_source_new(), which + * attaches to the default #GMainContext. You can remove the watch + * using g_source_remove(). + * + * Returns: An ID (greater than 0) for the event source + * + * Since: 2.30 + */ +guint +g_unix_signal_add (int signum, + GSourceFunc handler, + gpointer user_data) +{ + return g_unix_signal_add_full (G_PRIORITY_DEFAULT, signum, handler, user_data, NULL); +} + +typedef struct +{ + GSource source; + + gint fd; + gpointer tag; +} GUnixFDSource; + +static gboolean +g_unix_fd_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GUnixFDSource *fd_source = (GUnixFDSource *) source; + GUnixFDSourceFunc func = (GUnixFDSourceFunc) callback; + + if (!callback) + { + g_warning ("GUnixFDSource dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + return (* func) (fd_source->fd, g_source_query_unix_fd (source, fd_source->tag), user_data); +} + + +/** + * g_unix_fd_source_new: + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * + * Creates a #GSource to watch for a particular IO condition on a file + * descriptor. + * + * The source will never close the fd -- you must do it yourself. + * + * Returns: the newly created #GSource + * + * Since: 2.36 + **/ +GSource * +g_unix_fd_source_new (gint fd, + GIOCondition condition) +{ + static GSourceFuncs source_funcs = { + NULL, NULL, g_unix_fd_source_dispatch, NULL + }; + GUnixFDSource *fd_source; + GSource *source; + + source = g_source_new (&source_funcs, sizeof (GUnixFDSource)); + fd_source = (GUnixFDSource *) source; + + fd_source->fd = fd; + fd_source->tag = g_source_add_unix_fd (source, fd, condition); + + return source; +} + +/** + * g_unix_fd_add_full: + * @priority: the priority of the source + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * @function: a #GUnixFDSourceFunc + * @user_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 IO condition, as specified by + * @condition becomes true for @fd. + * + * This is the same as g_unix_fd_add(), except that it allows you to + * specify a non-default priority and a provide a #GDestroyNotify for + * @user_data. + * + * Returns: the ID (greater than 0) of the event source + * + * Since: 2.36 + **/ +guint +g_unix_fd_add_full (gint priority, + gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data, + GDestroyNotify notify) +{ + GSource *source; + guint id; + + g_return_val_if_fail (function != NULL, 0); + + source = g_unix_fd_source_new (fd, condition); + + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + + g_source_set_callback (source, (GSourceFunc) function, user_data, notify); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; +} + +/** + * g_unix_fd_add: + * @fd: a file descriptor + * @condition: IO conditions to watch for on @fd + * @function: a #GPollFDFunc + * @user_data: data to pass to @function + * + * Sets a function to be called when the IO condition, as specified by + * @condition becomes true for @fd. + * + * @function will be called when the specified IO condition becomes + * %TRUE. The function is expected to clear whatever event caused the + * IO condition to become true and return %TRUE in order to be notified + * when it happens again. If @function returns %FALSE then the watch + * will be cancelled. + * + * The return value of this function can be passed to g_source_remove() + * to cancel the watch at any time that it exists. + * + * The source will never close the fd -- you must do it yourself. + * + * Returns: the ID (greater than 0) of the event source + * + * Since: 2.36 + **/ +guint +g_unix_fd_add (gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data) +{ + return g_unix_fd_add_full (G_PRIORITY_DEFAULT, fd, condition, function, user_data, NULL); +} diff --git a/glib/glib-unix.h b/glib/glib-unix.h new file mode 100644 index 0000000..66ccf74 --- /dev/null +++ b/glib/glib-unix.h @@ -0,0 +1,123 @@ +/* glib-unix.h - Unix specific integration + * Copyright (C) 2011 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. + */ + +#ifndef __G_UNIX_H__ +#define __G_UNIX_H__ + +/* We need to include the UNIX headers needed to use the APIs below, + * but we also take this opportunity to include a wide selection of + * other UNIX headers. If one of the headers below is broken on some + * system, work around it here (or better, fix the system or tell + * people to use a better one). + */ +#include +#include +#include +#include +#include + +#include + +#ifndef G_OS_UNIX +#error "This header may only be used on UNIX" +#endif + +G_BEGIN_DECLS + +/** + * G_UNIX_ERROR: + * + * Error domain for API in the "g_unix_" namespace. Note that there is + * no exported enumeration mapping %errno. Instead, all functions + * ensure that %errno is relevant. The code for all #G_UNIX_ERROR is + * always 0, and the error message is always + * generated via g_strerror(). + * + * It is expected that most code will not look at %errno from these + * APIs. Important cases where one would want to differentiate between + * errors are already covered by existing cross-platform GLib API, + * such as e.g. #GFile wrapping ENOENT. However, it is + * provided for completeness, at least. + */ +#define G_UNIX_ERROR (g_unix_error_quark()) + +GLIB_AVAILABLE_IN_2_30 +GQuark g_unix_error_quark (void); + +GLIB_AVAILABLE_IN_2_30 +gboolean g_unix_open_pipe (gint *fds, + gint flags, + GError **error); + +GLIB_AVAILABLE_IN_2_30 +gboolean g_unix_set_fd_nonblocking (gint fd, + gboolean nonblock, + GError **error); + +GLIB_AVAILABLE_IN_2_30 +GSource *g_unix_signal_source_new (gint signum); + +GLIB_AVAILABLE_IN_2_30 +guint g_unix_signal_add_full (gint priority, + gint signum, + GSourceFunc handler, + gpointer user_data, + GDestroyNotify notify); + +GLIB_AVAILABLE_IN_2_30 +guint g_unix_signal_add (gint signum, + GSourceFunc handler, + gpointer user_data); + +/** + * GUnixFDSourceFunc: + * @fd: the fd that triggered the event + * @condition: the IO conditions reported on @fd + * @user_data: user data passed to g_unix_fd_add() + * + * The type of functions to be called when a UNIX fd watch source + * triggers. + * + * Returns: %FALSE if the source should be removed + **/ +typedef gboolean (*GUnixFDSourceFunc) (gint fd, + GIOCondition condition, + gpointer user_data); + +GLIB_AVAILABLE_IN_2_36 +GSource *g_unix_fd_source_new (gint fd, + GIOCondition condition); + +GLIB_AVAILABLE_IN_2_36 +guint g_unix_fd_add_full (gint priority, + gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data, + GDestroyNotify notify); + +GLIB_AVAILABLE_IN_2_36 +guint g_unix_fd_add (gint fd, + GIOCondition condition, + GUnixFDSourceFunc function, + gpointer user_data); + +G_END_DECLS + +#endif /* __G_UNIX_H__ */ diff --git a/glib/glib.h b/glib/glib.h new file mode 100644 index 0000000..ce7447e --- /dev/null +++ b/glib/glib.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/. + */ + +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef G_PLATFORM_WIN32 +#include +#endif + +#ifndef G_DISABLE_DEPRECATED +#include +#include +#include +#include +#include +#include +#endif /* G_DISABLE_DEPRECATED */ + +#undef __GLIB_H_INSIDE__ + +#endif /* __G_LIB_H__ */ diff --git a/glib/glib.py b/glib/glib.py new file mode 100644 index 0000000..64459b3 --- /dev/null +++ b/glib/glib.py @@ -0,0 +1,253 @@ +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 + try: + val = read_global_var ("quarks") + max_q = long(read_global_var ("quark_seq_id")) + except: + try: + val = read_global_var ("g_quarks") + max_q = long(read_global_var ("g_quark_seq_id")) + except: + return None; + 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.keys = ht["keys"] + self.values = ht["values"] + self.hashes = ht["hashes"] + 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): + self.pos = self.pos + 1 + if long (self.hashes[self.pos]) >= 2: + key = self.keys[self.pos] + val = self.values[self.pos] + + 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: + 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): + # 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..a476718 --- /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-2011 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.stp.in b/glib/glib.stp.in new file mode 100644 index 0000000..95d3351 --- /dev/null +++ b/glib/glib.stp.in @@ -0,0 +1,84 @@ +global gquarks + +/* This is needed to keep track of gquark for use in other probes.*/ +probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("quark__new") +{ + gquarks[pid(), $arg2] = user_string($arg1) +} + +/** + * probe glib.quark_new - Called when a #GQuark is initially created + * @quark: integer value for the quark + * @str: string form of the quark + */ +probe glib.quark_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("quark__new") +{ + str = user_string ($arg1); + quark = $arg2; + probestr = sprintf("glib.quark_new(%s) -> %d", str, quark); +} + +/** + * probe glib.mem_alloc - Called when a malloc block is initially requested + * @mem: Raw memory pointer returned + * @n_bytes: number of bytes + * @zeroed: Boolean value, %TRUE if this block was filled with NUL bytes + * @failable: Boolean value, %TRUE if program execution can continue on allocation failure + */ +probe glib.mem_alloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__alloc") +{ + mem = $arg1; + n_bytes = $arg2; + zeroed = $arg3; + failable = $arg4; + probestr = sprintf("glib.mem_alloc(n_bytes=%d) -> %p", n_bytes, mem); +} + +/** + * probe glib.mem_free - Called when a malloc block freed + */ +probe glib.mem_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__free") +{ + mem = $arg1; /* ARG: @mem: Raw memory pointer */ + probestr = sprintf("glib.mem_free(mem=%p)", mem); +} + +/** + * probe glib.mem_realloc - Called when a malloc block is resized + * @mem: Raw memory pointer returned + * @old_mem: Original memory pointer + * @n_bytes: number of bytes + * @failable: Boolean value, %TRUE if program execution can continue on allocation failure + */ +probe glib.mem_realloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("mem__realloc") +{ + mem = $arg1; + old_mem = $arg2; + n_bytes = $arg3; + failable = $arg4; + probestr = sprintf("glib.mem_realloc(old_mem=%p, n_bytes=%d) -> %p", old_mem, n_bytes, mem); +} + +/** + * probe glib.slice_alloc - Called when g_slice_alloc() is used + * @mem: Raw memory pointer returned + * @n_bytes: number of bytes + */ +probe glib.slice_alloc = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("slice__alloc") +{ + mem = $arg1; + n_bytes = $arg2; + probestr = sprintf("glib.slice_alloc(n_bytes=%d) -> %p", n_bytes, mem); +} + +/** + * probe glib.slice_free - Called when memory slice is freed + * @mem: Raw memory pointer returned + * @n_bytes: Number of bytes + */ +probe glib.slice_free = process("@ABS_GLIB_RUNTIME_LIBDIR@/libglib-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("slice__free") +{ + mem = $arg1; + n_bytes = $arg2; + probestr = sprintf("glib.slice_free(n_bytes=%d) -> %p", n_bytes, mem); +} diff --git a/glib/glib_probes.d b/glib/glib_probes.d new file mode 100644 index 0000000..9232e1b --- /dev/null +++ b/glib/glib_probes.d @@ -0,0 +1,8 @@ +provider glib { + probe mem__alloc(void*, unsigned int, unsigned int, unsigned int); + probe mem__realloc(void*, void *, unsigned int, unsigned int); + probe mem__free(void*); + probe slice__alloc(void*, unsigned int); + probe slice__free(void*, unsigned int); + probe quark__new(char *, unsigned int); +}; diff --git a/glib/glib_trace.h b/glib/glib_trace.h new file mode 100644 index 0000000..789e88d --- /dev/null +++ b/glib/glib_trace.h @@ -0,0 +1,43 @@ +/* GLIB - Library of useful routines for C programming + * + * Copyright (C) 2009,2010 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 __GLIBTRACE_H__ +#define __GLIBTRACE_H__ + +#ifndef SIZEOF_CHAR +#error "config.h must be included prior to glib_trace.h" +#endif + +#ifdef HAVE_DTRACE + +/* include the generated probes header and put markers in code */ +#include "glib_probes.h" +#define TRACE(probe) probe + +#else + +/* Wrap the probe to allow it to be removed when no systemtap available */ +#define TRACE(probe) + +#endif + +#endif /* __GLIBTRACE_H__ */ diff --git a/glib/glibconfig.h.win32.in b/glib/glibconfig.h.win32.in new file mode 100644 index 0000000..ae65d78 --- /dev/null +++ b/glib/glibconfig.h.win32.in @@ -0,0 +1,266 @@ +/* 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 + +#define G_ATOMIC_LOCK_FREE + +#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/glib/glibintl.h b/glib/glibintl.h new file mode 100644 index 0000000..4f2e58b --- /dev/null +++ b/glib/glibintl.h @@ -0,0 +1,44 @@ +#ifndef __GLIBINTL_H__ +#define __GLIBINTL_H__ + +#ifndef SIZEOF_CHAR +#error "config.h must be included prior to glibintl.h" +#endif + +GLIB_AVAILABLE_IN_ALL +const gchar * glib_gettext (const gchar *str) G_GNUC_FORMAT(1); +GLIB_AVAILABLE_IN_ALL +const gchar * glib_pgettext (const gchar *msgctxtid, + gsize msgidoffset) 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) +#define C_(Context,String) glib_pgettext (Context "\004" String, strlen (Context) + 1) + +#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 C_(Context,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..f4905f3 --- /dev/null +++ b/glib/glist.c @@ -0,0 +1,1180 @@ +/* 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 "glist.h" +#include "gslice.h" + +#include "gtestutils.h" + +/** + * SECTION:linked_lists_double + * @title: Doubly-Linked Lists + * @short_description: linked lists that can be iterated over 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. + * + * A convenience macro to get the previous element in a #GList. + * + * Returns: the previous element, or %NULL if there are no previous + * elements. + **/ + +/** + * g_list_next: + * @list: an element in a #GList. + * + * A convenience macro to get the next element in a #GList. + * + * Returns: the next element, or %NULL if there are no more elements. + **/ + +#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: + * + * 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. + **/ +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, + * you should either use g_list_free_full() or free them manually + * 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_free_full: + * @list: a pointer to a #GList + * @free_func: the function to be called to free each element's data + * + * Convenience method, which frees all the memory used by a #GList, and + * calls the specified destroy function on every element's data. + * + * Since: 2.28 + */ +void +g_list_free_full (GList *list, + GDestroyNotify free_func) +{ + g_list_foreach (list, (GFunc) free_func, NULL); + g_list_free (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; + tmp_list->prev->next = new_list; + new_list->next = tmp_list; + tmp_list->prev = new_list; + + 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. See g_list_copy_deep() if you need + * to copy the data as well. + * + * + * Returns: a copy of @list + */ +GList* +g_list_copy (GList *list) +{ + return g_list_copy_deep (list, NULL, NULL); +} + +/** + * g_list_copy_deep: + * @list: a #GList + * @func: a copy function used to copy every element in the list + * @user_data: user data passed to the copy function @func, or #NULL + * + * Makes a full (deep) copy of a #GList. + * + * In contrast with g_list_copy(), this function uses @func to make a copy of + * each list element, in addition to copying the list container itself. + * + * @func, as a #GCopyFunc, takes two arguments, the data to be copied and a user + * pointer. It's safe to pass #NULL as user_data, if the copy function takes only + * one argument. + * + * For instance, if @list holds a list of GObjects, you can do: + * |[ + * another_list = g_list_copy_deep (list, (GCopyFunc) g_object_ref, NULL); + * ]| + * + * And, to entirely free the new list, you could do: + * |[ + * g_list_free_full (another_list, g_object_unref); + * ]| + * + * Returns: a full copy of @list, use #g_list_free_full to free it + * + * Since: 2.34 + */ +GList* +g_list_copy_deep (GList *list, GCopyFunc func, gpointer user_data) +{ + GList *new_list = NULL; + + if (list) + { + GList *last; + + new_list = _g_list_alloc (); + if (func) + new_list->data = func (list->data, user_data); + else + 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; + if (func) + last->data = func (list->data, user_data); + else + 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. The algorithm + * used is a stable sort. + * + * Returns: the start of the sorted #GList + */ +/** + * GCompareFunc: + * @a: a value. + * @b: a value to compare with. + * + * 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. + * + * Returns: negative value if @a < @b; zero if @a = @b; positive + * value if @a > @b. + **/ +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. + * + * 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. + * + * Returns: negative value if @a < @b; zero if @a = @b; positive + * value if @a > @b. + **/ +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); +} diff --git a/glib/glist.h b/glib/glist.h new file mode 100644 index 0000000..120e788 --- /dev/null +++ b/glib/glist.h @@ -0,0 +1,154 @@ +/* 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_LIST_H__ +#define __G_LIST_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GList GList; + +struct _GList +{ + gpointer data; + GList *next; + GList *prev; +}; + +/* Doubly linked lists + */ +GLIB_AVAILABLE_IN_ALL +GList* g_list_alloc (void) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +void g_list_free (GList *list); +GLIB_AVAILABLE_IN_ALL +void g_list_free_1 (GList *list); +#define g_list_free1 g_list_free_1 +GLIB_AVAILABLE_IN_ALL +void g_list_free_full (GList *list, + GDestroyNotify free_func); +GLIB_AVAILABLE_IN_ALL +GList* g_list_append (GList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_prepend (GList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_insert (GList *list, + gpointer data, + gint position) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_insert_sorted (GList *list, + gpointer data, + GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_insert_sorted_with_data (GList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_insert_before (GList *list, + GList *sibling, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_concat (GList *list1, + GList *list2) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_remove (GList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_remove_all (GList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_remove_link (GList *list, + GList *llink) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_delete_link (GList *list, + GList *link_) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_reverse (GList *list) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_copy (GList *list) G_GNUC_WARN_UNUSED_RESULT; + +GLIB_AVAILABLE_IN_2_34 +GList* g_list_copy_deep (GList *list, + GCopyFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; + +GLIB_AVAILABLE_IN_ALL +GList* g_list_nth (GList *list, + guint n); +GLIB_AVAILABLE_IN_ALL +GList* g_list_nth_prev (GList *list, + guint n); +GLIB_AVAILABLE_IN_ALL +GList* g_list_find (GList *list, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +GList* g_list_find_custom (GList *list, + gconstpointer data, + GCompareFunc func); +GLIB_AVAILABLE_IN_ALL +gint g_list_position (GList *list, + GList *llink); +GLIB_AVAILABLE_IN_ALL +gint g_list_index (GList *list, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +GList* g_list_last (GList *list); +GLIB_AVAILABLE_IN_ALL +GList* g_list_first (GList *list); +GLIB_AVAILABLE_IN_ALL +guint g_list_length (GList *list); +GLIB_AVAILABLE_IN_ALL +void g_list_foreach (GList *list, + GFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GList* g_list_sort (GList *list, + GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GList* g_list_sort_with_data (GList *list, + GCompareDataFunc compare_func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +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) + +G_END_DECLS + +#endif /* __G_LIST_H__ */ diff --git a/glib/gmacros.h b/glib/gmacros.h new file mode 100644 index 0000000..7c21717 --- /dev/null +++ b/glib/gmacros.h @@ -0,0 +1,347 @@ +/* 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 + */ + +#ifndef __G_MACROS_H__ +#define __G_MACROS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +/* 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__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define G_GNUC_DEPRECATED_FOR(f) \ + __attribute__((deprecated("Use " #f " instead"))) +#else +#define G_GNUC_DEPRECATED_FOR(f) G_GNUC_DEPRECATED +#endif /* __GNUC__ */ + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#define G_GNUC_END_IGNORE_DEPRECATIONS \ + _Pragma ("GCC diagnostic pop") +#else +#define G_GNUC_BEGIN_IGNORE_DEPRECATIONS +#define G_GNUC_END_IGNORE_DEPRECATIONS +#endif + +#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 + +#ifndef __GI_SCANNER__ /* The static assert macro really confuses the introspection parser */ +#define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2 +#define G_PASTE(identifier1,identifier2) G_PASTE_ARGS (identifier1, identifier2) +#ifdef __COUNTER__ +#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED +#else +#define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __LINE__)[(expr) ? 1 : -1] G_GNUC_UNUSED +#endif +#define G_STATIC_ASSERT_EXPR(expr) ((void) sizeof (char[(expr) ? 1 : -1])) +#endif + +/* 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__)) +#elif defined(_MSC_VER) && (_MSC_VER > 1300) +# define G_STRFUNC ((const char*) (__FUNCTION__)) +#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 + +/* Deprecated -- do not use. */ +#ifndef G_DISABLE_DEPRECATED +#ifdef G_DISABLE_CONST_RETURNS +#define G_CONST_RETURN +#else +#define G_CONST_RETURN const +#endif +#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) \ + G_GNUC_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 + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +#define G_DEPRECATED __attribute__((__deprecated__)) +#elif defined(_MSC_VER) && (_MSC_VER >= 1300) +#define G_DEPRECATED __declspec(deprecated) +#else +#define G_DEPRECATED +#endif + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define G_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead"))) +#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320) +#define G_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead")) +#else +#define G_DEPRECATED_FOR(f) G_DEPRECATED +#endif + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define G_UNAVAILABLE(maj,min) __attribute__((deprecated("Not available before " #maj "." #min))) +#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320) +#define G_UNAVAILABLE(maj,min) __declspec(deprecated("is not available before " #maj "." #min)) +#else +#define G_UNAVAILABLE(maj,min) +#endif + +#ifndef _GLIB_EXTERN +#define _GLIB_EXTERN extern +#endif + +/* These macros are used to mark deprecated functions in GLib headers, + * and thus have to be exposed in installed headers. But please + * do *not* use them in other projects. Instead, use G_DEPRECATED + * or define your own wrappers around it. + */ + +#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS +#define GLIB_DEPRECATED _GLIB_EXTERN +#define GLIB_DEPRECATED_FOR(f) _GLIB_EXTERN +#define GLIB_UNAVAILABLE(maj,min) _GLIB_EXTERN +#else +#define GLIB_DEPRECATED G_DEPRECATED _GLIB_EXTERN +#define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GLIB_EXTERN +#define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GLIB_EXTERN +#endif + +#endif /* __G_MACROS_H__ */ diff --git a/glib/gmain-internal.h b/glib/gmain-internal.h new file mode 100644 index 0000000..97775ca --- /dev/null +++ b/glib/gmain-internal.h @@ -0,0 +1,35 @@ +/* gmain-internal.h - GLib-internal mainloop API + * Copyright (C) 2011 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. + */ + +#ifndef __G_MAIN_INTERNAL_H__ +#define __G_MAIN_INTERNAL_H__ + +#if !defined (GLIB_COMPILATION) +#error "This is a private header" +#endif + +#include "gmain.h" + +G_BEGIN_DECLS + +GSource *_g_main_create_unix_signal_watch (int signum); + +G_END_DECLS + +#endif /* __G_MAIN_H__ */ diff --git a/glib/gmain.c b/glib/gmain.c new file mode 100644 index 0000000..68a7f8e --- /dev/null +++ b/glib/gmain.c @@ -0,0 +1,5462 @@ +/* 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" +#include "glibconfig.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 + +#ifdef G_OS_UNIX +#include "glib-unix.h" +#include +#ifdef HAVE_EVENTFD +#include +#endif +#endif + +#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 +#include + +#ifdef G_OS_WIN32 +#define STRICT +#include +#endif /* G_OS_WIN32 */ + +#ifdef G_OS_BEOS +#include +#include +#endif /* G_OS_BEOS */ + +#include "gmain.h" + +#include "garray.h" +#include "giochannel.h" +#include "ghash.h" +#include "ghook.h" +#include "gqueue.h" +#include "gstrfuncs.h" +#include "gtestutils.h" + +#ifdef G_OS_WIN32 +#include "gwin32.h" +#endif + +#ifdef G_MAIN_POLL_DEBUG +#include "gtimer.h" +#endif + +#include "gwakeup.h" +#include "gmain-internal.h" +#include "glib-init.h" +#include "glib-private.h" + +/** + * SECTION:main + * @title: The Main Event Loop + * @short_description: 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 source types + * One of the unusual features of the #GMainLoop 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 type. + * 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 + * + *
+ *
+ * + * On Unix, the GLib mainloop is incompatible with fork(). Any program + * using the mainloop must either exec() or exit() from the child + * without returning to the mainloop. + */ + +/* Types */ + +typedef struct _GTimeoutSource GTimeoutSource; +typedef struct _GChildWatchSource GChildWatchSource; +typedef struct _GUnixSignalWatchSource GUnixSignalWatchSource; +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), + G_SOURCE_BLOCKED = 1 << (G_HOOK_FLAG_USER_SHIFT + 2) +} GSourceFlags; + +typedef struct _GSourceList GSourceList; + +struct _GSourceList +{ + GSource *head, *tail; + gint priority; +}; + +typedef struct _GMainWaiter GMainWaiter; + +struct _GMainWaiter +{ + GCond *cond; + GMutex *mutex; +}; + +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 +{ + /* The following lock is used for both the list of sources + * and the list of poll records + */ + GMutex mutex; + GCond cond; + GThread *owner; + guint owner_count; + GSList *waiters; + + gint ref_count; + + GPtrArray *pending_dispatches; + gint timeout; /* Timeout for current iteration */ + + guint next_id; + GHashTable *overflow_used_source_ids; /* set */ + GList *source_lists; + gint in_check_or_prepare; + + GPollRec *poll_records, *poll_records_tail; + guint n_poll_records; + GPollFD *cached_poll_array; + guint cached_poll_array_size; + + GWakeup *wakeup; + + GPollFD wake_up_rec; + +/* Flag indicating whether the set of fd's changed during a poll */ + gboolean poll_changed; + + GPollFunc poll_func; + + gint64 time; + gboolean time_is_fresh; +}; + +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; + guint interval; + gboolean seconds; +}; + +struct _GChildWatchSource +{ + GSource source; + GPid pid; + gint child_status; +#ifdef G_OS_WIN32 + GPollFD poll; +#else /* G_OS_WIN32 */ + gboolean child_exited; +#endif /* G_OS_WIN32 */ +}; + +struct _GUnixSignalWatchSource +{ + GSource source; + int signum; + gboolean pending; +}; + +struct _GPollRec +{ + GPollFD *fd; + GPollRec *prev; + GPollRec *next; + gint priority; +}; + +struct _GSourcePrivate +{ + GSList *child_sources; + GSource *parent_source; + + gint64 ready_time; + + /* This is currently only used on UNIX, but we always declare it (and + * let it remain empty on Windows) to avoid #ifdef all over the place. + */ + GSList *fds; +}; + +typedef struct _GSourceIter +{ + GMainContext *context; + gboolean may_modify; + GList *current_list; + GSource *source; +} GSourceIter; + +#define LOCK_CONTEXT(context) g_mutex_lock (&context->mutex) +#define UNLOCK_CONTEXT(context) g_mutex_unlock (&context->mutex) +#define G_THREAD_SELF g_thread_self () + +#define SOURCE_DESTROYED(source) (((source)->flags & G_HOOK_FLAG_ACTIVE) == 0) +#define SOURCE_BLOCKED(source) (((source)->flags & G_SOURCE_BLOCKED) != 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_source_set_priority_unlocked (GSource *source, + GMainContext *context, + gint priority); +static void g_child_source_remove_internal (GSource *child_source, + GMainContext *context); + +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_source_iter_init (GSourceIter *iter, + GMainContext *context, + gboolean may_modify); +static gboolean g_source_iter_next (GSourceIter *iter, + GSource **source); +static void g_source_iter_clear (GSourceIter *iter); + +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 void g_child_watch_finalize (GSource *source); +#ifdef G_OS_UNIX +static void g_unix_signal_handler (int signum); +static gboolean g_unix_signal_watch_prepare (GSource *source, + gint *timeout); +static gboolean g_unix_signal_watch_check (GSource *source); +static gboolean g_unix_signal_watch_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data); +static void g_unix_signal_watch_finalize (GSource *source); +#endif +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); + +static void block_source (GSource *source); + +static GMainContext *glib_worker_context; + +G_LOCK_DEFINE_STATIC (main_loop); +static GMainContext *default_main_context; + +#ifndef G_OS_WIN32 + + +/* UNIX signals work by marking one of these variables then waking the + * worker context to check on them and dispatch accordingly. + */ +#ifdef HAVE_SIG_ATOMIC_T +static volatile sig_atomic_t unix_signal_pending[NSIG]; +static volatile sig_atomic_t any_unix_signal_pending; +#else +static volatile int unix_signal_pending[NSIG]; +static volatile int any_unix_signal_pending; +#endif + +/* Guards all the data below */ +G_LOCK_DEFINE_STATIC (unix_signal_lock); +static GSList *unix_signal_watches; +static GSList *unix_child_watches; + +static GSourceFuncs g_unix_signal_funcs = +{ + g_unix_signal_watch_prepare, + g_unix_signal_watch_check, + g_unix_signal_watch_dispatch, + g_unix_signal_watch_finalize +}; +#endif /* !G_OS_WIN32 */ +G_LOCK_DEFINE_STATIC (main_context_list); +static GSList *main_context_list = NULL; + +GSourceFuncs g_timeout_funcs = +{ + NULL, /* prepare */ + NULL, /* check */ + g_timeout_dispatch, + NULL +}; + +GSourceFuncs g_child_watch_funcs = +{ + g_child_watch_prepare, + g_child_watch_check, + g_child_watch_dispatch, + g_child_watch_finalize +}; + +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) +{ + GSourceIter iter; + GSource *source; + GList *sl_iter; + GSourceList *list; + + 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); + + g_source_iter_init (&iter, context, TRUE); + while (g_source_iter_next (&iter, &source)) + { + source->context = NULL; + g_source_destroy_internal (source, context, FALSE); + } + for (sl_iter = context->source_lists; sl_iter; sl_iter = sl_iter->next) + { + list = sl_iter->data; + g_slice_free (GSourceList, list); + } + g_list_free (context->source_lists); + + if (context->overflow_used_source_ids) + g_hash_table_destroy (context->overflow_used_source_ids); + + g_mutex_clear (&context->mutex); + + g_ptr_array_free (context->pending_dispatches, TRUE); + g_free (context->cached_poll_array); + + poll_rec_list_free (context, context->poll_records); + + g_wakeup_free (context->wakeup); + g_cond_clear (&context->cond); + + g_free (context); +} + +/* Helper function used by mainloop/overflow test. + */ +GMainContext * +g_main_context_new_with_next_id (guint next_id) +{ + GMainContext *ret = g_main_context_new (); + + ret->next_id = next_id; + + return ret; +} + +/** + * g_main_context_new: + * + * Creates a new #GMainContext structure. + * + * Return value: the new #GMainContext + **/ +GMainContext * +g_main_context_new (void) +{ + static gsize initialised; + GMainContext *context; + + if (g_once_init_enter (&initialised)) + { +#ifdef G_MAIN_POLL_DEBUG + if (getenv ("G_MAIN_POLL_DEBUG") != NULL) + _g_main_poll_debug = TRUE; +#endif + + g_once_init_leave (&initialised, TRUE); + } + + context = g_new0 (GMainContext, 1); + + g_mutex_init (&context->mutex); + g_cond_init (&context->cond); + + context->owner = NULL; + context->waiters = NULL; + + context->ref_count = 1; + + context->next_id = 1; + + context->source_lists = 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_fresh = FALSE; + + context->wakeup = g_wakeup_new (); + g_wakeup_get_pollfd (context->wakeup, &context->wake_up_rec); + g_main_context_add_poll_unlocked (context, 0, &context->wake_up_rec); + + 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: (transfer none): 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 void +free_context (gpointer data) +{ + GMainContext *context = data; + + g_main_context_release (context); + if (context) + g_main_context_unref (context); +} + +static void +free_context_stack (gpointer data) +{ + g_queue_free_full((GQueue *) data, (GDestroyNotify) free_context); +} + +static GPrivate thread_context_stack = G_PRIVATE_INIT (free_context_stack); + +/** + * g_main_context_push_thread_default: + * @context: (allow-none): 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_private_get (&thread_context_stack); + if (!stack) + { + stack = g_queue_new (); + g_private_set (&thread_context_stack, stack); + } + + g_queue_push_head (stack, context); +} + +/** + * g_main_context_pop_thread_default: + * @context: (allow-none): 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_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 or + * g_main_context_ref_thread_default() 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 you are running in the default thread.) + * + * If you need to hold a reference on the context, use + * g_main_context_ref_thread_default() instead. + * + * Returns: (transfer none): 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_private_get (&thread_context_stack); + if (stack) + return g_queue_peek_head (stack); + else + return NULL; +} + +/** + * g_main_context_ref_thread_default: + * + * Gets the thread-default #GMainContext for this thread, as with + * g_main_context_get_thread_default(), but also adds a reference to + * it with g_main_context_ref(). In addition, unlike + * g_main_context_get_thread_default(), if the thread-default context + * is the global default context, this will return that #GMainContext + * (with a ref added to it) rather than returning %NULL. + * + * Returns: (transfer full): the thread-default #GMainContext. Unref + * with g_main_context_unref() when you are done with it. + * + * Since: 2.32 + */ +GMainContext * +g_main_context_ref_thread_default (void) +{ + GMainContext *context; + + context = g_main_context_get_thread_default (); + if (!context) + context = g_main_context_default (); + return g_main_context_ref (context); +} + +/* 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->priv = g_slice_new0 (GSourcePrivate); + source->source_funcs = source_funcs; + source->ref_count = 1; + + source->priority = G_PRIORITY_DEFAULT; + + source->flags = G_HOOK_FLAG_ACTIVE; + + source->priv->ready_time = -1; + + /* NULL/0 initialization for all other fields */ + + return source; +} + +/* Holds context's lock */ +static void +g_source_iter_init (GSourceIter *iter, + GMainContext *context, + gboolean may_modify) +{ + iter->context = context; + iter->current_list = NULL; + iter->source = NULL; + iter->may_modify = may_modify; +} + +/* Holds context's lock */ +static gboolean +g_source_iter_next (GSourceIter *iter, GSource **source) +{ + GSource *next_source; + + if (iter->source) + next_source = iter->source->next; + else + next_source = NULL; + + if (!next_source) + { + if (iter->current_list) + iter->current_list = iter->current_list->next; + else + iter->current_list = iter->context->source_lists; + + if (iter->current_list) + { + GSourceList *source_list = iter->current_list->data; + + next_source = source_list->head; + } + } + + /* Note: unreffing iter->source could potentially cause its + * GSourceList to be removed from source_lists (if iter->source is + * the only source in its list, and it is destroyed), so we have to + * keep it reffed until after we advance iter->current_list, above. + */ + + if (iter->source && iter->may_modify) + SOURCE_UNREF (iter->source, iter->context); + iter->source = next_source; + if (iter->source && iter->may_modify) + iter->source->ref_count++; + + *source = iter->source; + return *source != NULL; +} + +/* Holds context's lock. Only necessary to call if you broke out of + * the g_source_iter_next() loop early. + */ +static void +g_source_iter_clear (GSourceIter *iter) +{ + if (iter->source && iter->may_modify) + { + SOURCE_UNREF (iter->source, iter->context); + iter->source = NULL; + } +} + +/* Holds context's lock + */ +static GSourceList * +find_source_list_for_priority (GMainContext *context, + gint priority, + gboolean create) +{ + GList *iter, *last; + GSourceList *source_list; + + last = NULL; + for (iter = context->source_lists; iter != NULL; last = iter, iter = iter->next) + { + source_list = iter->data; + + if (source_list->priority == priority) + return source_list; + + if (source_list->priority > priority) + { + if (!create) + return NULL; + + source_list = g_slice_new0 (GSourceList); + source_list->priority = priority; + context->source_lists = g_list_insert_before (context->source_lists, + iter, + source_list); + return source_list; + } + } + + if (!create) + return NULL; + + source_list = g_slice_new0 (GSourceList); + source_list->priority = priority; + + if (!last) + context->source_lists = g_list_append (NULL, source_list); + else + { + /* This just appends source_list to the end of + * context->source_lists without having to walk the list again. + */ + last = g_list_append (last, source_list); + } + return source_list; +} + +/* Holds context's lock + */ +static void +source_add_to_context (GSource *source, + GMainContext *context) +{ + GSourceList *source_list; + GSource *prev, *next; + + source_list = find_source_list_for_priority (context, source->priority, TRUE); + + if (source->priv->parent_source) + { + g_assert (source_list->head != NULL); + + /* Put the source immediately before its parent */ + prev = source->priv->parent_source->prev; + next = source->priv->parent_source; + } + else + { + prev = source_list->tail; + next = NULL; + } + + source->next = next; + if (next) + next->prev = source; + else + source_list->tail = source; + + source->prev = prev; + if (prev) + prev->next = source; + else + source_list->head = source; +} + +/* Holds context's lock + */ +static void +source_remove_from_context (GSource *source, + GMainContext *context) +{ + GSourceList *source_list; + + source_list = find_source_list_for_priority (context, source->priority, FALSE); + g_return_if_fail (source_list != NULL); + + if (source->prev) + source->prev->next = source->next; + else + source_list->head = source->next; + + if (source->next) + source->next->prev = source->prev; + else + source_list->tail = source->prev; + + source->prev = NULL; + source->next = NULL; + + if (source_list->head == NULL) + { + context->source_lists = g_list_remove (context->source_lists, source_list); + g_slice_free (GSourceList, source_list); + } + + if (context->overflow_used_source_ids) + g_hash_table_remove (context->overflow_used_source_ids, + GUINT_TO_POINTER (source->source_id)); + +} + +static void +assign_source_id_unlocked (GMainContext *context, + GSource *source) +{ + guint id; + + /* Are we about to overflow back to 0? + * See https://bugzilla.gnome.org/show_bug.cgi?id=687098 + */ + if (G_UNLIKELY (context->next_id == G_MAXUINT && + context->overflow_used_source_ids == NULL)) + { + GSourceIter iter; + GSource *source; + + context->overflow_used_source_ids = g_hash_table_new (NULL, NULL); + + g_source_iter_init (&iter, context, FALSE); + while (g_source_iter_next (&iter, &source)) + { + g_hash_table_add (context->overflow_used_source_ids, + GUINT_TO_POINTER (source->source_id)); + } + id = G_MAXUINT; + } + else if (context->overflow_used_source_ids == NULL) + { + id = context->next_id++; + } + else + { + /* + * If we overran G_MAXUINT, we fall back to randomly probing the + * source ids for the current context. This will be slower the more + * sources there are, but we're mainly concerned right now about + * correctness and code size. There's time for a more clever solution + * later. + */ + do + id = g_random_int (); + while (id == 0 || + g_hash_table_contains (context->overflow_used_source_ids, + GUINT_TO_POINTER (id))); + g_hash_table_add (context->overflow_used_source_ids, GUINT_TO_POINTER (id)); + } + + source->source_id = id; +} + +static guint +g_source_attach_unlocked (GSource *source, + GMainContext *context) +{ + GSList *tmp_list; + + source->context = context; + assign_source_id_unlocked (context, source); + source->ref_count++; + source_add_to_context (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; + } + + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + g_main_context_add_poll_unlocked (context, source->priority, tmp_list->data); + + tmp_list = source->priv->child_sources; + while (tmp_list) + { + g_source_attach_unlocked (tmp_list->data, context); + tmp_list = tmp_list->next; + } + + return source->source_id; +} + +/** + * g_source_attach: + * @source: a #GSource + * @context: (allow-none): 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; + + 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); + + result = g_source_attach_unlocked (source, context); + + /* If another thread has acquired the context, wake it up since it + * might be in poll() right now. + */ + if (context->owner && context->owner != G_THREAD_SELF) + g_wakeup_signal (context->wakeup); + + 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; + } + + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + g_main_context_remove_poll_unlocked (context, tmp_list->data); + } + + while (source->priv->child_sources) + g_child_source_remove_internal (source->priv->child_sources->data, context); + + if (source->priv->parent_source) + g_child_source_remove_internal (source, context); + + 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. + * + * You can call this on a source that has been destroyed, provided + * that the #GMainContext it was attached to still exists (in which + * case it will return that #GMainContext). In particular, you can + * always call this function on the source returned from + * g_main_current_source(). But calling this function on a source + * whose #GMainContext has been destroyed is an error. + * + * Return value: (transfer none) (allow-none): 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->context != NULL || !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. + * + * Using this API forces the linear scanning of event sources on each + * main loop iteration. Newly-written event sources should try to use + * g_source_add_unix_fd() instead of this API. + **/ +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_add_child_source: + * @source:a #GSource + * @child_source: a second #GSource that @source should "poll" + * + * Adds @child_source to @source as a "polled" source; when @source is + * added to a #GMainContext, @child_source will be automatically added + * with the same priority, when @child_source is triggered, it will + * cause @source to dispatch (in addition to calling its own + * callback), and when @source is destroyed, it will destroy + * @child_source as well. (@source will also still be dispatched if + * its own prepare/check functions indicate that it is ready.) + * + * If you don't need @child_source to do anything on its own when it + * triggers, you can call g_source_set_dummy_callback() on it to set a + * callback that does nothing (except return %TRUE if appropriate). + * + * @source will hold a reference on @child_source while @child_source + * is attached to it. + * + * Since: 2.28 + **/ +void +g_source_add_child_source (GSource *source, + GSource *child_source) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + g_return_if_fail (child_source != NULL); + g_return_if_fail (!SOURCE_DESTROYED (source)); + g_return_if_fail (!SOURCE_DESTROYED (child_source)); + g_return_if_fail (child_source->context == NULL); + g_return_if_fail (child_source->priv->parent_source == NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->priv->child_sources = g_slist_prepend (source->priv->child_sources, + g_source_ref (child_source)); + child_source->priv->parent_source = source; + g_source_set_priority_unlocked (child_source, NULL, source->priority); + if (SOURCE_BLOCKED (source)) + block_source (child_source); + + if (context) + { + UNLOCK_CONTEXT (context); + g_source_attach (child_source, context); + } +} + +static void +g_child_source_remove_internal (GSource *child_source, + GMainContext *context) +{ + GSource *parent_source = child_source->priv->parent_source; + + parent_source->priv->child_sources = + g_slist_remove (parent_source->priv->child_sources, child_source); + child_source->priv->parent_source = NULL; + + g_source_destroy_internal (child_source, context, TRUE); + g_source_unref_internal (child_source, context, TRUE); +} + +/** + * g_source_remove_child_source: + * @source:a #GSource + * @child_source: a #GSource previously passed to + * g_source_add_child_source(). + * + * Detaches @child_source from @source and destroys it. + * + * Since: 2.28 + **/ +void +g_source_remove_child_source (GSource *source, + GSource *child_source) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + g_return_if_fail (child_source != NULL); + g_return_if_fail (child_source->priv->parent_source == source); + g_return_if_fail (!SOURCE_DESTROYED (source)); + g_return_if_fail (!SOURCE_DESTROYED (child_source)); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + g_child_source_remove_internal (child_source, context); + + if (context) + 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: (allow-none): 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; +} + +static void +g_source_set_priority_unlocked (GSource *source, + GMainContext *context, + gint priority) +{ + GSList *tmp_list; + + g_return_if_fail (source->priv->parent_source == NULL || + source->priv->parent_source->priority == priority); + + if (context) + { + /* Remove the source from the context's source and then + * add it back after so it is sorted in the correct place + */ + source_remove_from_context (source, source->context); + } + + source->priority = priority; + + if (context) + { + source_add_to_context (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; + } + + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + { + g_main_context_remove_poll_unlocked (context, tmp_list->data); + g_main_context_add_poll_unlocked (context, priority, tmp_list->data); + } + } + } + + if (source->priv->child_sources) + { + tmp_list = source->priv->child_sources; + while (tmp_list) + { + g_source_set_priority_unlocked (tmp_list->data, context, priority); + tmp_list = tmp_list->next; + } + } +} + +/** + * 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) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + g_source_set_priority_unlocked (source, context, priority); + if (context) + 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_ready_time: + * @source: a #GSource + * @ready_time: the monotonic time at which the source will be ready, + * 0 for "immediately", -1 for "never" + * + * Sets a #GSource to be dispatched when the given monotonic time is + * reached (or passed). If the monotonic time is in the past (as it + * always will be if @ready_time is 0) then the source will be + * dispatched immediately. + * + * If @ready_time is -1 then the source is never woken up on the basis + * of the passage of time. + * + * Dispatching the source does not reset the ready time. You should do + * so yourself, from the source dispatch function. + * + * Note that if you have a pair of sources where the ready time of one + * suggests that it will be delivered first but the priority for the + * other suggests that it would be delivered first, and the ready time + * for both sources is reached during the same main context iteration + * then the order of dispatch is undefined. + * + * Since: 2.36 + **/ +void +g_source_set_ready_time (GSource *source, + gint64 ready_time) +{ + GMainContext *context; + + g_return_if_fail (source != NULL); + g_return_if_fail (source->ref_count > 0); + + if (source->priv->ready_time == ready_time) + return; + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->priv->ready_time = ready_time; + + if (context) + { + /* Quite likely that we need to change the timeout on the poll */ + if (!SOURCE_BLOCKED (source)) + g_wakeup_signal (context->wakeup); + UNLOCK_CONTEXT (context); + } +} + +/** + * g_source_get_ready_time: + * @source: a #GSource + * + * Gets the "ready time" of @source, as set by + * g_source_set_ready_time(). + * + * Any time before the current monotonic time (including 0) is an + * indication that the source will fire immediately. + * + * Returns: the monotonic ready time, -1 for "never" + **/ +gint64 +g_source_get_ready_time (GSource *source) +{ + g_return_val_if_fail (source != NULL, -1); + + return source->priv->ready_time; +} + +/** + * 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_set_name: + * @source: a #GSource + * @name: debug name for the source + * + * Sets a name for the source, used in debugging and profiling. + * The name defaults to #NULL. + * + * The source name should describe in a human-readable way + * what the source does. For example, "X11 event queue" + * or "GTK+ repaint idle handler" or whatever it is. + * + * It is permitted to call this function multiple times, but is not + * recommended due to the potential performance impact. For example, + * one could change the name in the "check" function of a #GSourceFuncs + * to include details like the event type in the source name. + * + * Since: 2.26 + **/ +void +g_source_set_name (GSource *source, + const char *name) +{ + g_return_if_fail (source != NULL); + + /* setting back to NULL is allowed, just because it's + * weird if get_name can return NULL but you can't + * set that. + */ + + g_free (source->name); + source->name = g_strdup (name); +} + +/** + * g_source_get_name: + * @source: a #GSource + * + * Gets a name for the source, used in debugging and profiling. + * The name may be #NULL if it has never been set with + * g_source_set_name(). + * + * Return value: the name of the source + * Since: 2.26 + **/ +const char * +g_source_get_name (GSource *source) +{ + g_return_val_if_fail (source != NULL, NULL); + + return source->name; +} + +/** + * g_source_set_name_by_id: + * @tag: a #GSource ID + * @name: debug name for the source + * + * Sets the name of a source using its ID. + * + * This is a convenience utility to set source names from the return + * value of g_idle_add(), g_timeout_add(), etc. + * + * Since: 2.26 + **/ +void +g_source_set_name_by_id (guint tag, + const char *name) +{ + GSource *source; + + g_return_if_fail (tag > 0); + + source = g_main_context_find_source_by_id (NULL, tag); + if (source == NULL) + return; + + g_source_set_name (source, name); +} + + +/** + * 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) + { + if (!SOURCE_DESTROYED (source)) + g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!"); + source_remove_from_context (source, context); + } + + if (source->source_funcs->finalize) + { + if (context) + UNLOCK_CONTEXT (context); + source->source_funcs->finalize (source); + if (context) + LOCK_CONTEXT (context); + } + + g_free (source->name); + source->name = NULL; + + g_slist_free (source->poll_fds); + source->poll_fds = NULL; + + g_slist_free_full (source->priv->fds, g_free); + + g_slice_free (GSourcePrivate, source->priv); + source->priv = 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: (allow-none): 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: (transfer none): the #GSource if found, otherwise, %NULL + **/ +GSource * +g_main_context_find_source_by_id (GMainContext *context, + guint source_id) +{ + GSourceIter iter; + GSource *source; + + g_return_val_if_fail (source_id > 0, NULL); + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + g_source_iter_init (&iter, context, FALSE); + while (g_source_iter_next (&iter, &source)) + { + if (!SOURCE_DESTROYED (source) && + source->source_id == source_id) + break; + } + g_source_iter_clear (&iter); + + UNLOCK_CONTEXT (context); + + return source; +} + +/** + * g_main_context_find_source_by_funcs_user_data: + * @context: (allow-none): 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: (transfer none): 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) +{ + GSourceIter iter; + GSource *source; + + g_return_val_if_fail (funcs != NULL, NULL); + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + g_source_iter_init (&iter, context, FALSE); + while (g_source_iter_next (&iter, &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; + } + } + g_source_iter_clear (&iter); + + 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: (transfer none): the source, if one was found, otherwise %NULL + **/ +GSource * +g_main_context_find_source_by_user_data (GMainContext *context, + gpointer user_data) +{ + GSourceIter iter; + GSource *source; + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + g_source_iter_init (&iter, context, FALSE); + while (g_source_iter_next (&iter, &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; + } + } + g_source_iter_clear (&iter); + + 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; +} + +#ifdef G_OS_UNIX +/** + * g_source_add_unix_fd: + * @source: a #GSource + * @fd: the fd to monitor + * @events: an event mask + * + * Monitors @fd for the IO events in @events. + * + * The tag returned by this function can be used to remove or modify the + * monitoring of the fd using g_source_remove_unix_fd() or + * g_source_modify_unix_fd(). + * + * It is not necessary to remove the fd before destroying the source; it + * will be cleaned up automatically. + * + * As the name suggests, this function is not available on Windows. + * + * Returns: an opaque tag + * + * Since: 2.36 + **/ +gpointer +g_source_add_unix_fd (GSource *source, + gint fd, + GIOCondition events) +{ + GMainContext *context; + GPollFD *poll_fd; + + g_return_val_if_fail (source != NULL, NULL); + g_return_val_if_fail (!SOURCE_DESTROYED (source), NULL); + + poll_fd = g_new (GPollFD, 1); + poll_fd->fd = fd; + poll_fd->events = events; + poll_fd->revents = 0; + + context = source->context; + + if (context) + LOCK_CONTEXT (context); + + source->priv->fds = g_slist_prepend (source->priv->fds, poll_fd); + + if (context) + { + if (!SOURCE_BLOCKED (source)) + g_main_context_add_poll_unlocked (context, source->priority, poll_fd); + UNLOCK_CONTEXT (context); + } + + return poll_fd; +} + +/** + * g_source_modify_unix_fd: + * @source: a #GSource + * @tag: the tag from g_source_add_unix_fd() + * @new_events: the new event mask to watch + * + * Updates the event mask to watch for the fd identified by @tag. + * + * @tag is the tag returned from g_source_add_unix_fd(). + * + * If you want to remove a fd, don't set its event mask to zero. + * Instead, call g_source_remove_unix_fd(). + * + * As the name suggests, this function is not available on Windows. + * + * Since: 2.36 + **/ +void +g_source_modify_unix_fd (GSource *source, + gpointer tag, + GIOCondition new_events) +{ + GMainContext *context; + GPollFD *poll_fd; + + g_return_if_fail (source != NULL); + g_return_if_fail (g_slist_find (source->priv->fds, tag)); + + context = source->context; + poll_fd = tag; + + poll_fd->events = new_events; + + if (context) + g_main_context_wakeup (context); +} + +/** + * g_source_remove_unix_fd: + * @source: a #GSource + * @tag: the tag from g_source_add_unix_fd() + * + * Reverses the effect of a previous call to g_source_add_unix_fd(). + * + * You only need to call this if you want to remove an fd from being + * watched while keeping the same source around. In the normal case you + * will just want to destroy the source. + * + * As the name suggests, this function is not available on Windows. + * + * Since: 2.36 + **/ +void +g_source_remove_unix_fd (GSource *source, + gpointer tag) +{ + GMainContext *context; + GPollFD *poll_fd; + + g_return_if_fail (source != NULL); + g_return_if_fail (g_slist_find (source->priv->fds, tag)); + + context = source->context; + poll_fd = tag; + + if (context) + LOCK_CONTEXT (context); + + source->priv->fds = g_slist_remove (source->priv->fds, poll_fd); + + if (context) + { + if (!SOURCE_BLOCKED (source)) + g_main_context_remove_poll_unlocked (context, poll_fd); + + UNLOCK_CONTEXT (context); + } + + g_free (poll_fd); +} + +/** + * g_source_query_unix_fd: + * @source: a #GSource + * @tag: the tag from g_source_add_unix_fd() + * + * Queries the events reported for the fd corresponding to @tag on + * @source during the last poll. + * + * The return value of this function is only defined when the function + * is called from the check or dispatch functions for @source. + * + * As the name suggests, this function is not available on Windows. + * + * Returns: the conditions reported on the fd + * + * Since: 2.36 + **/ +GIOCondition +g_source_query_unix_fd (GSource *source, + gpointer tag) +{ + GPollFD *poll_fd; + + g_return_val_if_fail (source != NULL, 0); + g_return_val_if_fail (g_slist_find (source->priv->fds, tag), 0); + + poll_fd = tag; + + return poll_fd->revents; +} +#endif /* G_OS_UNIX */ + +/** + * g_get_current_time: + * @result: #GTimeVal structure in which to store current time. + * + * Equivalent to the UNIX gettimeofday() function, but portable. + * + * You may find g_get_real_time() to be more convenient. + **/ +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 +} + +/** + * g_get_real_time: + * + * Queries the system wall-clock time. + * + * This call is functionally equivalent to g_get_current_time() except + * that the return value is often more convenient than dealing with a + * #GTimeVal. + * + * You should only use this call if you are actually interested in the real + * wall-clock time. g_get_monotonic_time() is probably more useful for + * measuring intervals. + * + * Returns: the number of microseconds since January 1, 1970 UTC. + * + * Since: 2.28 + **/ +gint64 +g_get_real_time (void) +{ + GTimeVal tv; + + g_get_current_time (&tv); + + return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; +} + +#ifdef G_OS_WIN32 +static ULONGLONG (*g_GetTickCount64) (void) = NULL; +static guint32 g_win32_tick_epoch = 0; + +void +g_clock_win32_init (void) +{ + HMODULE kernel32; + + g_GetTickCount64 = NULL; + kernel32 = GetModuleHandle ("KERNEL32.DLL"); + if (kernel32 != NULL) + g_GetTickCount64 = (void *) GetProcAddress (kernel32, "GetTickCount64"); + g_win32_tick_epoch = ((guint32)GetTickCount()) >> 31; +} +#endif + +/** + * g_get_monotonic_time: + * + * Queries the system monotonic time, if available. + * + * On POSIX systems with clock_gettime() and CLOCK_MONOTONIC this call + * is a very shallow wrapper for that. Otherwise, we make a best effort + * that probably involves returning the wall clock time (with at least + * microsecond accuracy, subject to the limitations of the OS kernel). + * + * It's important to note that POSIX CLOCK_MONOTONIC does + * not count time spent while the machine is suspended. + * + * On Windows, "limitations of the OS kernel" is a rather substantial + * statement. Depending on the configuration of the system, the wall + * clock time is updated as infrequently as 64 times a second (which + * is approximately every 16ms). Also, on XP (but not on Vista or later) + * the monotonic clock is locally monotonic, but may differ in exact + * value between processes due to timer wrap handling. + * + * Returns: the monotonic time, in microseconds + * + * Since: 2.28 + **/ +gint64 +g_get_monotonic_time (void) +{ +#ifdef HAVE_CLOCK_GETTIME + /* librt clock_gettime() is our first choice */ + struct timespec ts; + +#ifdef CLOCK_MONOTONIC + clock_gettime (CLOCK_MONOTONIC, &ts); +#else + clock_gettime (CLOCK_REALTIME, &ts); +#endif + + /* In theory monotonic time can have any epoch. + * + * glib presently assumes the following: + * + * 1) The epoch comes some time after the birth of Jesus of Nazareth, but + * not more than 10000 years later. + * + * 2) The current time also falls sometime within this range. + * + * These two reasonable assumptions leave us with a maximum deviation from + * the epoch of 10000 years, or 315569520000000000 seconds. + * + * If we restrict ourselves to this range then the number of microseconds + * will always fit well inside the constraints of a int64 (by a factor of + * about 29). + * + * If you actually hit the following assertion, probably you should file a + * bug against your operating system for being excessively silly. + **/ + g_assert (G_GINT64_CONSTANT (-315569520000000000) < ts.tv_sec && + ts.tv_sec < G_GINT64_CONSTANT (315569520000000000)); + + return (((gint64) ts.tv_sec) * 1000000) + (ts.tv_nsec / 1000); + +#elif defined (G_OS_WIN32) + guint64 ticks; + guint32 ticks32; + + /* There are four sources for the monotonic time on Windows: + * + * Three are based on a (1 msec accuracy, but only read periodically) clock chip: + * - GetTickCount (GTC) + * 32bit msec counter, updated each ~15msec, wraps in ~50 days + * - GetTickCount64 (GTC64) + * Same as GetTickCount, but extended to 64bit, so no wrap + * Only available in Vista or later + * - timeGetTime (TGT) + * similar to GetTickCount by default: 15msec, 50 day wrap. + * available in winmm.dll (thus known as the multimedia timers) + * However apps can raise the system timer clock frequency using timeBeginPeriod() + * increasing the accuracy up to 1 msec, at a cost in general system performance + * and battery use. + * + * One is based on high precision clocks: + * - QueryPrecisionCounter (QPC) + * This has much higher accuracy, but is not guaranteed monotonic, and + * has lots of complications like clock jumps and different times on different + * CPUs. It also has lower long term accuracy (i.e. it will drift compared to + * the low precision clocks. + * + * Additionally, the precision available in the timer-based wakeup such as + * MsgWaitForMultipleObjectsEx (which is what the mainloop is based on) is based + * on the TGT resolution, so by default it is ~15msec, but can be increased by apps. + * + * The QPC timer has too many issues to be used as is. The only way it could be used + * is to use it to interpolate the lower precision clocks. Firefox does something like + * this: + * https://bugzilla.mozilla.org/show_bug.cgi?id=363258 + * + * However this seems quite complicated, so we're not doing this right now. + * + * The approach we take instead is to use the TGT timer, extending it to 64bit + * either by using the GTC64 value, or if that is not available, a process local + * time epoch that we increment when we detect a timer wrap (assumes that we read + * the time at least once every 50 days). + * + * This means that: + * - We have a globally consistent monotonic clock on Vista and later + * - We have a locally monotonic clock on XP + * - Apps that need higher precision in timeouts and clock reads can call + * timeBeginPeriod() to increase it as much as they want + */ + + if (g_GetTickCount64 != NULL) + { + guint32 ticks_as_32bit; + + ticks = g_GetTickCount64 (); + ticks32 = timeGetTime(); + + /* GTC64 and TGT are sampled at different times, however they + * have the same base and source (msecs since system boot). + * They can differ by as much as -16 to +16 msecs. + * We can't just inject the low bits into the 64bit counter + * as one of the counters can have wrapped in 32bit space and + * the other not. Instead we calculate the signed difference + * in 32bit space and apply that difference to the 64bit counter. + */ + ticks_as_32bit = (guint32)ticks; + + /* We could do some 2's complement hack, but we play it safe */ + if (ticks32 - ticks_as_32bit <= G_MAXINT32) + ticks += ticks32 - ticks_as_32bit; + else + ticks -= ticks_as_32bit - ticks32; + } + else + { + guint32 epoch; + + epoch = g_atomic_int_get (&g_win32_tick_epoch); + + /* Must read ticks after the epoch. Then we're guaranteed + * that the ticks value we read is higher or equal to any + * previous ones that lead to the writing of the epoch. + */ + ticks32 = timeGetTime(); + + /* We store the MSB of the current time as the LSB + * of the epoch. Comparing these bits lets us detect when + * the 32bit counter has wrapped so we can increase the + * epoch. + * + * This will work as long as this function is called at + * least once every ~24 days, which is half the wrap time + * of a 32bit msec counter. I think this is pretty likely. + * + * Note that g_win32_tick_epoch is a process local state, + * so the monotonic clock will not be the same between + * processes. + */ + if ((ticks32 >> 31) != (epoch & 1)) + { + epoch++; + g_atomic_int_set (&g_win32_tick_epoch, epoch); + } + + + ticks = (guint64)ticks32 | ((guint64)epoch) << 31; + } + + return ticks * 1000; + +#else /* !HAVE_CLOCK_GETTIME && ! G_OS_WIN32*/ + + GTimeVal tv; + + g_get_current_time (&tv); + + return (((gint64) tv.tv_sec) * 1000000) + tv.tv_usec; +#endif +} + +static void +g_main_dispatch_free (gpointer dispatch) +{ + g_slice_free (GMainDispatch, dispatch); +} + +/* Running the main loop */ + +static GMainDispatch * +get_dispatch (void) +{ + static GPrivate depth_private = G_PRIVATE_INIT (g_main_dispatch_free); + GMainDispatch *dispatch; + + dispatch = g_private_get (&depth_private); + + if (!dispatch) + { + dispatch = g_slice_new0 (GMainDispatch); + g_private_set (&depth_private, dispatch); + } + + 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_iteration(), + * 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: (transfer none): 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 G_SOURCE_REMOVE; + * } + * + * 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)); + + source->flags |= G_SOURCE_BLOCKED; + + tmp_list = source->poll_fds; + while (tmp_list) + { + g_main_context_remove_poll_unlocked (source->context, tmp_list->data); + tmp_list = tmp_list->next; + } + + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + g_main_context_remove_poll_unlocked (source->context, tmp_list->data); + + if (source->priv && source->priv->child_sources) + { + tmp_list = source->priv->child_sources; + while (tmp_list) + { + block_source (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)); + + source->flags &= ~G_SOURCE_BLOCKED; + + 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; + } + + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + g_main_context_add_poll_unlocked (source->context, source->priority, tmp_list->data); + + if (source->priv && source->priv->child_sources) + { + tmp_list = source->priv->child_sources; + while (tmp_list) + { + unblock_source (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_BLOCKED (source) && !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); +} + +/** + * 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) +{ + 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; +} + +/** + * 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) +{ + 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 == &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); +} + +/** + * 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) +{ + gboolean result = FALSE; + GThread *self = G_THREAD_SELF; + gboolean loop_internal_waiter; + + if (context == NULL) + context = g_main_context_default (); + + loop_internal_waiter = (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; +} + +/** + * 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; + GSourceIter iter; + + if (context == NULL) + context = g_main_context_default (); + + LOCK_CONTEXT (context); + + context->time_is_fresh = 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; + } + +#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; + + g_source_iter_init (&iter, context, TRUE); + while (g_source_iter_next (&iter, &source)) + { + gint source_timeout = -1; + + if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source)) + continue; + if ((n_ready > 0) && (source->priority > current_priority)) + break; + + if (!(source->flags & G_SOURCE_READY)) + { + gboolean result; + gboolean (* prepare) (GSource *source, + gint *timeout); + + prepare = source->source_funcs->prepare; + + if (prepare) + { + context->in_check_or_prepare++; + UNLOCK_CONTEXT (context); + + result = (* prepare) (source, &source_timeout); + + LOCK_CONTEXT (context); + context->in_check_or_prepare--; + } + else + { + source_timeout = -1; + result = FALSE; + } + + if (result == FALSE && source->priv->ready_time != -1) + { + if (!context->time_is_fresh) + { + context->time = g_get_monotonic_time (); + context->time_is_fresh = TRUE; + } + + if (source->priv->ready_time <= context->time) + { + source_timeout = 0; + result = TRUE; + } + else + { + gint timeout; + + /* rounding down will lead to spinning, so always round up */ + timeout = (source->priv->ready_time - context->time + 999) / 1000; + + if (source_timeout < 0 || timeout < source_timeout) + source_timeout = timeout; + } + } + + if (result) + { + GSource *ready_source = source; + + while (ready_source) + { + ready_source->flags |= G_SOURCE_READY; + ready_source = ready_source->priv->parent_source; + } + } + } + + 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); + } + } + g_source_iter_clear (&iter); + + 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_: (out): location to store timeout to be used in polling + * @fds: (out caller-allocates) (array length=n_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++; + } + + context->poll_changed = FALSE; + + if (timeout) + { + *timeout = context->timeout; + if (*timeout != 0) + context->time_is_fresh = 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 length=n_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; + GSourceIter iter; + 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; + } + + if (context->wake_up_rec.revents) + g_wakeup_acknowledge (context->wakeup); + + /* 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; + } + + pollrec = context->poll_records; + i = 0; + while (i < n_fds) + { + if (pollrec->fd->events) + pollrec->fd->revents = fds[i].revents; + + pollrec = pollrec->next; + i++; + } + + g_source_iter_init (&iter, context, TRUE); + while (g_source_iter_next (&iter, &source)) + { + if (SOURCE_DESTROYED (source) || SOURCE_BLOCKED (source)) + continue; + if ((n_ready > 0) && (source->priority > max_priority)) + break; + + if (!(source->flags & G_SOURCE_READY)) + { + gboolean result; + gboolean (* check) (GSource *source); + + check = source->source_funcs->check; + + if (check) + { + /* If the check function is set, call it. */ + context->in_check_or_prepare++; + UNLOCK_CONTEXT (context); + + result = (* check) (source); + + LOCK_CONTEXT (context); + context->in_check_or_prepare--; + } + else + result = FALSE; + + if (result == FALSE) + { + GSList *tmp_list; + + /* If not already explicitly flagged ready by ->check() + * (or if we have no check) then we can still be ready if + * any of our fds poll as ready. + */ + for (tmp_list = source->priv->fds; tmp_list; tmp_list = tmp_list->next) + { + GPollFD *pollfd = tmp_list->data; + + if (pollfd->revents) + { + result = TRUE; + break; + } + } + } + + if (result == FALSE && source->priv->ready_time != -1) + { + if (!context->time_is_fresh) + { + context->time = g_get_monotonic_time (); + context->time_is_fresh = TRUE; + } + + if (source->priv->ready_time <= context->time) + result = TRUE; + } + + if (result) + { + GSource *ready_source = source; + + while (ready_source) + { + ready_source->flags |= G_SOURCE_READY; + ready_source = ready_source->priv->parent_source; + } + } + } + + 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; + } + } + g_source_iter_clear (&iter); + + 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); + + if (!g_main_context_acquire (context)) + { + gboolean got_ownership; + + LOCK_CONTEXT (context); + + if (!block) + return FALSE; + + got_ownership = g_main_context_wait (context, + &context->cond, + &context->mutex); + + if (!got_ownership) + return FALSE; + } + else + LOCK_CONTEXT (context); + + 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); + + g_main_context_release (context); + + LOCK_CONTEXT (context); + + return some_ready; +} + +/** + * g_main_context_pending: + * @context: (allow-none): 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: (allow-none): 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 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: (allow-none): 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); + + if (!g_main_context_acquire (loop->context)) + { + gboolean got_ownership = FALSE; + + /* Another thread owns this context */ + LOCK_CONTEXT (loop->context); + + g_atomic_int_inc (&loop->ref_count); + + if (!loop->is_running) + loop->is_running = TRUE; + + while (loop->is_running && !got_ownership) + got_ownership = g_main_context_wait (loop->context, + &loop->context->cond, + &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); + + 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); + + g_main_context_release (loop->context); + + 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_wakeup_signal (loop->context->wakeup); + + g_cond_broadcast (&loop->context->cond); + + 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: (transfer none): 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: (allow-none): 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 seldom be used directly. Instead + * a typical event source will use g_source_add_unix_fd() 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 *prevrec, *nextrec; + 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; + + prevrec = context->poll_records_tail; + nextrec = NULL; + while (prevrec && priority < prevrec->priority) + { + nextrec = prevrec; + prevrec = prevrec->prev; + } + + if (prevrec) + prevrec->next = newrec; + else + context->poll_records = newrec; + + newrec->prev = prevrec; + newrec->next = nextrec; + + if (nextrec) + nextrec->prev = newrec; + else + context->poll_records_tail = newrec; + + context->n_poll_records++; + + context->poll_changed = TRUE; + + /* Now wake up the main loop if it is waiting in the poll() */ + g_wakeup_signal (context->wakeup); +} + +/** + * 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, *prevrec, *nextrec; + + prevrec = NULL; + pollrec = context->poll_records; + + while (pollrec) + { + nextrec = pollrec->next; + if (pollrec->fd == fd) + { + if (prevrec != NULL) + prevrec->next = nextrec; + else + context->poll_records = nextrec; + + if (nextrec != NULL) + nextrec->prev = prevrec; + else + context->poll_records_tail = prevrec; + + g_slice_free (GPollRec, pollrec); + + context->n_poll_records--; + break; + } + prevrec = pollrec; + pollrec = nextrec; + } + + context->poll_changed = TRUE; + + /* Now wake up the main loop if it is waiting in the poll() */ + g_wakeup_signal (context->wakeup); +} + +/** + * g_source_get_current_time: + * @source: a #GSource + * @timeval: #GTimeVal structure in which to store current time. + * + * This function ignores @source and is otherwise the same as + * g_get_current_time(). + * + * Deprecated: 2.28: use g_source_get_time() instead + **/ +void +g_source_get_current_time (GSource *source, + GTimeVal *timeval) +{ + g_get_current_time (timeval); +} + +/** + * g_source_get_time: + * @source: a #GSource + * + * Gets the time to be used when checking this source. The advantage of + * calling this function over calling g_get_monotonic_time() directly is + * that when checking multiple sources, GLib can cache a single value + * instead of having to repeatedly get the system monotonic time. + * + * The time here is the system monotonic time, if available, or some + * other reasonable alternative otherwise. See g_get_monotonic_time(). + * + * Returns: the monotonic time in microseconds + * + * Since: 2.28 + **/ +gint64 +g_source_get_time (GSource *source) +{ + GMainContext *context; + gint64 result; + + g_return_val_if_fail (source->context != NULL, 0); + + context = source->context; + + LOCK_CONTEXT (context); + + if (!context->time_is_fresh) + { + context->time = g_get_monotonic_time (); + context->time_is_fresh = TRUE; + } + + result = context->time; + + UNLOCK_CONTEXT (context); + + return result; +} + +/** + * 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; +} + +/** + * 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); + + g_wakeup_signal (context->wakeup); +} + +/** + * 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 (); + + LOCK_CONTEXT (context); + is_owner = context->owner == G_THREAD_SELF; + UNLOCK_CONTEXT (context); + + return is_owner; +} + +/* Timeouts */ + +static void +g_timeout_set_expiration (GTimeoutSource *timeout_source, + gint64 current_time) +{ + gint64 expiration; + + expiration = current_time + (guint64) timeout_source->interval * 1000; + + if (timeout_source->seconds) + { + gint64 remainder; + static gint timer_perturb = -1; + + 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)) % 1000000; + else + timer_perturb = 0; + } + + /* We want the microseconds part of the timeout to land on the + * 'timer_perturb' mark, but we need to make sure we don't try to + * set the timeout in the past. We do this by ensuring that we + * always only *increase* the expiration time by adding a full + * second in the case that the microsecond portion decreases. + */ + expiration -= timer_perturb; + + remainder = expiration % 1000000; + if (remainder >= 1000000/4) + expiration += 1000000; + + expiration -= remainder; + expiration += timer_perturb; + } + + g_source_set_ready_time ((GSource *) timeout_source, expiration); +} + +static gboolean +g_timeout_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GTimeoutSource *timeout_source = (GTimeoutSource *)source; + gboolean again; + + if (!callback) + { + g_warning ("Timeout source dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + again = callback (user_data); + + if (again) + g_timeout_set_expiration (timeout_source, g_source_get_time (source)); + + return again; +} + +/** + * 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. + * + * The interval given is in terms of monotonic time, not wall clock + * time. See g_get_monotonic_time(). + * + * 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; + + timeout_source->interval = interval; + g_timeout_set_expiration (timeout_source, g_get_monotonic_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. + * + * The interval given in terms of monotonic time, not wall clock time. + * See g_get_monotonic_time(). + * + * 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; + + timeout_source->interval = 1000 * interval; + timeout_source->seconds = TRUE; + + g_timeout_set_expiration (timeout_source, g_get_monotonic_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: (allow-none): 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. + * + * The interval given in terms of monotonic time, not wall clock time. + * See g_get_monotonic_time(). + * + * Return value: the ID (greater than 0) of the event source. + * Rename to: g_timeout_add + **/ +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. + * + * The interval given is in terms of monotonic time, not wall clock + * time. See g_get_monotonic_time(). + * + * 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: (allow-none): 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. + * + * The interval given is in terms of monotonic time, not wall clock + * time. See g_get_monotonic_time(). + * + * Return value: the ID (greater than 0) of the event source. + * + * Rename to: g_timeout_add_seconds + * 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_timeout_add_seconds_full(). + * + * Note that the first call of the timer may not be precise for timeouts + * of one second. If you need finer precision and have such a timeout, + * you may want to use g_timeout_add() instead. + * + * The interval given is in terms of monotonic time, not wall clock + * time. See g_get_monotonic_time(). + * + * 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; +} + +static void +g_child_watch_finalize (GSource *source) +{ +} + +#else /* G_OS_WIN32 */ + +static void +wake_source (GSource *source) +{ + GMainContext *context; + + /* This should be thread-safe: + * + * - if the source is currently being added to a context, that + * context will be woken up anyway + * + * - if the source is currently being destroyed, we simply need not + * to crash: + * + * - the memory for the source will remain valid until after the + * source finalize function was called (which would remove the + * source from the global list which we are currently holding the + * lock for) + * + * - the GMainContext will either be NULL or point to a live + * GMainContext + * + * - the GMainContext will remain valid since we hold the + * main_context_list lock + * + * Since we are holding a lot of locks here, don't try to enter any + * more GMainContext functions for fear of dealock -- just hit the + * GWakeup and run. Even if that's safe now, it could easily become + * unsafe with some very minor changes in the future, and signal + * handling is not the most well-tested codepath. + */ + G_LOCK(main_context_list); + context = source->context; + if (context) + g_wakeup_signal (context->wakeup); + G_UNLOCK(main_context_list); +} + +static void +dispatch_unix_signals (void) +{ + GSList *node; + + /* clear this first incase another one arrives while we're processing */ + any_unix_signal_pending = FALSE; + + G_LOCK(unix_signal_lock); + + /* handle GChildWatchSource instances */ + if (unix_signal_pending[SIGCHLD]) + { + unix_signal_pending[SIGCHLD] = FALSE; + + /* The only way we can do this is to scan all of the children. + * + * The docs promise that we will not reap children that we are not + * explicitly watching, so that ties our hands from calling + * waitpid(-1). We also can't use siginfo's si_pid field since if + * multiple SIGCHLD arrive at the same time, one of them can be + * dropped (since a given UNIX signal can only be pending once). + */ + for (node = unix_child_watches; node; node = node->next) + { + GChildWatchSource *source = node->data; + + if (!source->child_exited) + { + pid_t pid; + do + { + pid = waitpid (source->pid, &source->child_status, WNOHANG); + if (pid > 0) + { + source->child_exited = TRUE; + wake_source ((GSource *) source); + } + else if (pid == -1 && errno == ECHILD) + { + g_warning ("GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). Most likely the process is ignoring SIGCHLD, or some other thread is invoking waitpid() with a nonpositive first argument; either behavior can break applications that use g_child_watch_add()/g_spawn_sync() either directly or indirectly."); + source->child_exited = TRUE; + source->child_status = 0; + wake_source ((GSource *) source); + } + } + while (pid == -1 && errno == EINTR); + } + } + } + + /* handle GUnixSignalWatchSource instances */ + for (node = unix_signal_watches; node; node = node->next) + { + GUnixSignalWatchSource *source = node->data; + + if (!source->pending) + { + if (unix_signal_pending[source->signum]) + { + unix_signal_pending[source->signum] = FALSE; + source->pending = TRUE; + + wake_source ((GSource *) source); + } + } + } + + G_UNLOCK(unix_signal_lock); +} + +static gboolean +g_child_watch_prepare (GSource *source, + gint *timeout) +{ + GChildWatchSource *child_watch_source; + + child_watch_source = (GChildWatchSource *) source; + + return child_watch_source->child_exited; +} + +static gboolean +g_child_watch_check (GSource *source) +{ + GChildWatchSource *child_watch_source; + + child_watch_source = (GChildWatchSource *) source; + + return child_watch_source->child_exited; +} + +static gboolean +g_unix_signal_watch_prepare (GSource *source, + gint *timeout) +{ + GUnixSignalWatchSource *unix_signal_source; + + unix_signal_source = (GUnixSignalWatchSource *) source; + + return unix_signal_source->pending; +} + +static gboolean +g_unix_signal_watch_check (GSource *source) +{ + GUnixSignalWatchSource *unix_signal_source; + + unix_signal_source = (GUnixSignalWatchSource *) source; + + return unix_signal_source->pending; +} + +static gboolean +g_unix_signal_watch_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + GUnixSignalWatchSource *unix_signal_source; + gboolean again; + + unix_signal_source = (GUnixSignalWatchSource *) source; + + if (!callback) + { + g_warning ("Unix signal source dispatched without callback\n" + "You must call g_source_set_callback()."); + return FALSE; + } + + again = (callback) (user_data); + + unix_signal_source->pending = FALSE; + + return again; +} + +static void +ensure_unix_signal_handler_installed_unlocked (int signum) +{ + static sigset_t installed_signal_mask; + static gboolean initialized; + struct sigaction action; + + if (!initialized) + { + sigemptyset (&installed_signal_mask); + g_get_worker_context (); + initialized = TRUE; + } + + if (sigismember (&installed_signal_mask, signum)) + return; + + sigaddset (&installed_signal_mask, signum); + + action.sa_handler = g_unix_signal_handler; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_RESTART | SA_NOCLDSTOP; + sigaction (signum, &action, NULL); +} + +GSource * +_g_main_create_unix_signal_watch (int signum) +{ + GSource *source; + GUnixSignalWatchSource *unix_signal_source; + + source = g_source_new (&g_unix_signal_funcs, sizeof (GUnixSignalWatchSource)); + unix_signal_source = (GUnixSignalWatchSource *) source; + + unix_signal_source->signum = signum; + unix_signal_source->pending = FALSE; + + G_LOCK (unix_signal_lock); + ensure_unix_signal_handler_installed_unlocked (signum); + unix_signal_watches = g_slist_prepend (unix_signal_watches, unix_signal_source); + if (unix_signal_pending[signum]) + unix_signal_source->pending = TRUE; + unix_signal_pending[signum] = FALSE; + G_UNLOCK (unix_signal_lock); + + return source; +} + +static void +g_unix_signal_watch_finalize (GSource *source) +{ + G_LOCK (unix_signal_lock); + unix_signal_watches = g_slist_remove (unix_signal_watches, source); + G_UNLOCK (unix_signal_lock); +} + +static void +g_child_watch_finalize (GSource *source) +{ + G_LOCK (unix_signal_lock); + unix_child_watches = g_slist_remove (unix_child_watches, source); + G_UNLOCK (unix_signal_lock); +} + +#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_unix_signal_handler (int signum) +{ + unix_signal_pending[signum] = TRUE; + any_unix_signal_pending = TRUE; + + g_wakeup_signal (glib_worker_context->wakeup); +} + +#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 with a + * nonpositive first argument 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; + + child_watch_source->pid = pid; + +#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_LOCK (unix_signal_lock); + ensure_unix_signal_handler_installed_unlocked (SIGCHLD); + unix_child_watches = g_slist_prepend (unix_child_watches, child_watch_source); + if (waitpid (pid, &child_watch_source->child_status, WNOHANG) > 0) + child_watch_source->child_exited = TRUE; + G_UNLOCK (unix_signal_lock); +#endif /* G_OS_WIN32 */ + + 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: (allow-none): 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. + * + * In many programs, you will want to call g_spawn_check_exit_status() + * in the callback to determine whether or not the child exited + * successfully. + * + * Also, 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 should invoke 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. + * + * Rename to: g_child_watch_add + * 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: (allow-none): 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. + * Rename to: g_idle_add + **/ +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); +} + +/** + * g_main_context_invoke: + * @context: (allow-none): a #GMainContext, or %NULL + * @function: function to call + * @data: data to pass to @function + * + * Invokes a function in such a way that @context is owned during the + * invocation of @function. + * + * If @context is %NULL then the global default main context — as + * returned by g_main_context_default() — is used. + * + * If @context is owned by the current thread, @function is called + * directly. Otherwise, if @context is the thread-default main context + * of the current thread and g_main_context_acquire() succeeds, then + * @function is called and g_main_context_release() is called + * afterwards. + * + * In any other case, an idle source is created to call @function and + * that source is attached to @context (presumably to be run in another + * thread). The idle source is attached with #G_PRIORITY_DEFAULT + * priority. If you want a different priority, use + * g_main_context_invoke_full(). + * + * Note that, as with normal idle functions, @function should probably + * return %FALSE. If it returns %TRUE, it will be continuously run in a + * loop (and may prevent this call from returning). + * + * Since: 2.28 + **/ +void +g_main_context_invoke (GMainContext *context, + GSourceFunc function, + gpointer data) +{ + g_main_context_invoke_full (context, + G_PRIORITY_DEFAULT, + function, data, NULL); +} + +/** + * g_main_context_invoke_full: + * @context: (allow-none): a #GMainContext, or %NULL + * @priority: the priority at which to run @function + * @function: function to call + * @data: data to pass to @function + * @notify: (allow-none): a function to call when @data is no longer in use, or %NULL. + * + * Invokes a function in such a way that @context is owned during the + * invocation of @function. + * + * This function is the same as g_main_context_invoke() except that it + * lets you specify the priority incase @function ends up being + * scheduled as an idle and also lets you give a #GDestroyNotify for @data. + * + * @notify should not assume that it is called from any particular + * thread or with any particular context acquired. + * + * Since: 2.28 + **/ +void +g_main_context_invoke_full (GMainContext *context, + gint priority, + GSourceFunc function, + gpointer data, + GDestroyNotify notify) +{ + g_return_if_fail (function != NULL); + + if (!context) + context = g_main_context_default (); + + if (g_main_context_is_owner (context)) + { + while (function (data)); + if (notify != NULL) + notify (data); + } + + else + { + GMainContext *thread_default; + + thread_default = g_main_context_get_thread_default (); + + if (!thread_default) + thread_default = g_main_context_default (); + + if (thread_default == context && g_main_context_acquire (context)) + { + while (function (data)); + + g_main_context_release (context); + + if (notify != NULL) + notify (data); + } + else + { + GSource *source; + + source = g_idle_source_new (); + g_source_set_priority (source, priority); + g_source_set_callback (source, function, data, notify); + g_source_attach (source, context); + g_source_unref (source); + } + } +} + +static gpointer +glib_worker_main (gpointer data) +{ + while (TRUE) + { + g_main_context_iteration (glib_worker_context, TRUE); + +#ifdef G_OS_UNIX + if (any_unix_signal_pending) + dispatch_unix_signals (); +#endif + } + + return NULL; /* worst GCC warning message ever... */ +} + +GMainContext * +g_get_worker_context (void) +{ + static gsize initialised; + + if (g_once_init_enter (&initialised)) + { + /* mask all signals in the worker thread */ +#ifdef G_OS_UNIX + sigset_t prev_mask; + sigset_t all; + + sigfillset (&all); + pthread_sigmask (SIG_SETMASK, &all, &prev_mask); +#endif + glib_worker_context = g_main_context_new (); + g_thread_new ("gmain", glib_worker_main, NULL); +#ifdef G_OS_UNIX + pthread_sigmask (SIG_SETMASK, &prev_mask, NULL); +#endif + g_once_init_leave (&initialised, TRUE); + } + + return glib_worker_context; +} diff --git a/glib/gmain.h b/glib/gmain.h new file mode 100644 index 0000000..47b4ecf --- /dev/null +++ b/glib/gmain.h @@ -0,0 +1,611 @@ +/* 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. + */ + +#ifndef __G_MAIN_H__ +#define __G_MAIN_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#include + +G_BEGIN_DECLS + +typedef enum /*< flags >*/ +{ + 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; + + +/** + * GMainContext: + * + * The GMainContext struct is an opaque data + * type representing a set of sources to be handled in a main loop. + */ +typedef struct _GMainContext GMainContext; + +/** + * GMainLoop: + * + * The GMainLoop struct is an opaque data type + * representing the main event loop of a GLib or GTK+ application. + */ +typedef struct _GMainLoop GMainLoop; + +/** + * GSource: + * + * The GSource struct is an opaque data type + * representing an event source. + */ +typedef struct _GSource GSource; +typedef struct _GSourcePrivate GSourcePrivate; + +/** + * GSourceCallbackFuncs: + * @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. + + * The GSourceCallbackFuncs struct contains + * functions for managing callback objects. + */ +typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs; + +/** + * GSourceFuncs: + * @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. Since 2.36 this may + * be %NULL, in which case the effect is as if the function always + * returns %FALSE with a timeout of -1. If @prepare returns a + * timeout and the source also has a 'ready time' set then the + * nearer of the two will be used. + * @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. Since 2.36 this may + * be %NULL, in which case the effect is as if the function always + * returns %FALSE. + * @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. + * + * 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. + */ +typedef struct _GSourceFuncs GSourceFuncs; + +/** + * 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). + * + * GPid is used in GLib only for descendant processes spawned with + * the g_spawn functions. + */ + +/** + * GSourceFunc: + * @user_data: data passed to the function, set when the source was + * created with one of the above functions + * + * Specifies the type of function passed to g_timeout_add(), + * g_timeout_add_full(), g_idle_add(), and g_idle_add_full(). + * + * Returns: %FALSE if the source should be removed + */ +typedef gboolean (*GSourceFunc) (gpointer user_data); + +/** + * GChildWatchFunc: + * @pid: the process id of the child process + * @status: Status information about the child process, encoded + * in a platform-specific manner + * @user_data: user data passed to g_child_watch_add() + * + * Prototype of a #GChildWatchSource callback, called when a child + * process has exited. To interpret @status, see the documentation + * for g_spawn_check_exit_status(). + */ +typedef void (*GChildWatchFunc) (GPid pid, + gint status, + gpointer user_data); +struct _GSource +{ + /*< private >*/ + gpointer callback_data; + GSourceCallbackFuncs *callback_funcs; + + const GSourceFuncs *source_funcs; + guint ref_count; + + GMainContext *context; + + gint priority; + guint flags; + guint source_id; + + GSList *poll_fds; + + GSource *prev; + GSource *next; + + char *name; + + GSourcePrivate *priv; +}; + +struct _GSourceCallbackFuncs +{ + void (*ref) (gpointer cb_data); + void (*unref) (gpointer cb_data); + void (*get) (gpointer cb_data, + GSource *source, + GSourceFunc *func, + gpointer *data); +}; + +/** + * GSourceDummyMarshal: + * + * This is just a placeholder for #GClosureMarshal, + * which cannot be used here for dependency reasons. + */ +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 */ + + /*< private >*/ + /* For use by g_source_set_closure */ + GSourceFunc closure_callback; + GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */ +}; + +/* Standard priorities */ + +/** + * G_PRIORITY_HIGH: + * + * Use this for high priority event sources. + * + * It is not used within GLib or GTK+. + */ +#define G_PRIORITY_HIGH -100 + +/** + * G_PRIORITY_DEFAULT: + * + * 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. + */ +#define G_PRIORITY_DEFAULT 0 + +/** + * G_PRIORITY_HIGH_IDLE: + * + * 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.) + */ +#define G_PRIORITY_HIGH_IDLE 100 + +/** + * G_PRIORITY_DEFAULT_IDLE: + * + * Use this for default priority idle functions. + * + * In GLib this priority is used when adding idle functions with + * g_idle_add(). + */ +#define G_PRIORITY_DEFAULT_IDLE 200 + +/** + * G_PRIORITY_LOW: + * + * Use this for very low priority background tasks. + * + * It is not used within GLib or GTK+. + */ +#define G_PRIORITY_LOW 300 + +/** + * G_SOURCE_REMOVE: + * + * Use this macro as the return value of a #GSourceFunc to remove + * the #GSource from the main loop. + * + * Since: 2.32 + */ +#define G_SOURCE_REMOVE FALSE + +/** + * G_SOURCE_CONTINUE: + * + * Use this macro as the return value of a #GSourceFunc to leave + * the #GSource in the main loop. + * + * Since: 2.32 + */ +#define G_SOURCE_CONTINUE TRUE + +/* GMainContext: */ + +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_context_new (void); +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_context_ref (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +void g_main_context_unref (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_context_default (void); + +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_iteration (GMainContext *context, + gboolean may_block); +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_pending (GMainContext *context); + +/* For implementation of legacy interfaces + */ +GLIB_AVAILABLE_IN_ALL +GSource *g_main_context_find_source_by_id (GMainContext *context, + guint source_id); +GLIB_AVAILABLE_IN_ALL +GSource *g_main_context_find_source_by_user_data (GMainContext *context, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +void g_main_context_wakeup (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_acquire (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +void g_main_context_release (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_is_owner (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_wait (GMainContext *context, + GCond *cond, + GMutex *mutex); + +GLIB_AVAILABLE_IN_ALL +gboolean g_main_context_prepare (GMainContext *context, + gint *priority); +GLIB_AVAILABLE_IN_ALL +gint g_main_context_query (GMainContext *context, + gint max_priority, + gint *timeout_, + GPollFD *fds, + gint n_fds); +GLIB_AVAILABLE_IN_ALL +gint g_main_context_check (GMainContext *context, + gint max_priority, + GPollFD *fds, + gint n_fds); +GLIB_AVAILABLE_IN_ALL +void g_main_context_dispatch (GMainContext *context); + +GLIB_AVAILABLE_IN_ALL +void g_main_context_set_poll_func (GMainContext *context, + GPollFunc func); +GLIB_AVAILABLE_IN_ALL +GPollFunc g_main_context_get_poll_func (GMainContext *context); + +/* Low level functions for use by source implementations + */ +GLIB_AVAILABLE_IN_ALL +void g_main_context_add_poll (GMainContext *context, + GPollFD *fd, + gint priority); +GLIB_AVAILABLE_IN_ALL +void g_main_context_remove_poll (GMainContext *context, + GPollFD *fd); + +GLIB_AVAILABLE_IN_ALL +gint g_main_depth (void); +GLIB_AVAILABLE_IN_ALL +GSource *g_main_current_source (void); + +/* GMainContexts for other threads + */ +GLIB_AVAILABLE_IN_ALL +void g_main_context_push_thread_default (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +void g_main_context_pop_thread_default (GMainContext *context); +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_context_get_thread_default (void); +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_context_ref_thread_default (void); + +/* GMainLoop: */ + +GLIB_AVAILABLE_IN_ALL +GMainLoop *g_main_loop_new (GMainContext *context, + gboolean is_running); +GLIB_AVAILABLE_IN_ALL +void g_main_loop_run (GMainLoop *loop); +GLIB_AVAILABLE_IN_ALL +void g_main_loop_quit (GMainLoop *loop); +GLIB_AVAILABLE_IN_ALL +GMainLoop *g_main_loop_ref (GMainLoop *loop); +GLIB_AVAILABLE_IN_ALL +void g_main_loop_unref (GMainLoop *loop); +GLIB_AVAILABLE_IN_ALL +gboolean g_main_loop_is_running (GMainLoop *loop); +GLIB_AVAILABLE_IN_ALL +GMainContext *g_main_loop_get_context (GMainLoop *loop); + +/* GSource: */ + +GLIB_AVAILABLE_IN_ALL +GSource *g_source_new (GSourceFuncs *source_funcs, + guint struct_size); +GLIB_AVAILABLE_IN_ALL +GSource *g_source_ref (GSource *source); +GLIB_AVAILABLE_IN_ALL +void g_source_unref (GSource *source); + +GLIB_AVAILABLE_IN_ALL +guint g_source_attach (GSource *source, + GMainContext *context); +GLIB_AVAILABLE_IN_ALL +void g_source_destroy (GSource *source); + +GLIB_AVAILABLE_IN_ALL +void g_source_set_priority (GSource *source, + gint priority); +GLIB_AVAILABLE_IN_ALL +gint g_source_get_priority (GSource *source); +GLIB_AVAILABLE_IN_ALL +void g_source_set_can_recurse (GSource *source, + gboolean can_recurse); +GLIB_AVAILABLE_IN_ALL +gboolean g_source_get_can_recurse (GSource *source); +GLIB_AVAILABLE_IN_ALL +guint g_source_get_id (GSource *source); + +GLIB_AVAILABLE_IN_ALL +GMainContext *g_source_get_context (GSource *source); + +GLIB_AVAILABLE_IN_ALL +void g_source_set_callback (GSource *source, + GSourceFunc func, + gpointer data, + GDestroyNotify notify); + +GLIB_AVAILABLE_IN_ALL +void g_source_set_funcs (GSource *source, + GSourceFuncs *funcs); +GLIB_AVAILABLE_IN_ALL +gboolean g_source_is_destroyed (GSource *source); + +GLIB_AVAILABLE_IN_ALL +void g_source_set_name (GSource *source, + const char *name); +GLIB_AVAILABLE_IN_ALL +const char * g_source_get_name (GSource *source); +GLIB_AVAILABLE_IN_ALL +void g_source_set_name_by_id (guint tag, + const char *name); + +GLIB_AVAILABLE_IN_2_36 +void g_source_set_ready_time (GSource *source, + gint64 ready_time); +GLIB_AVAILABLE_IN_2_36 +gint64 g_source_get_ready_time (GSource *source); + +#ifdef G_OS_UNIX +GLIB_AVAILABLE_IN_2_36 +gpointer g_source_add_unix_fd (GSource *source, + gint fd, + GIOCondition events); +GLIB_AVAILABLE_IN_2_36 +void g_source_modify_unix_fd (GSource *source, + gpointer tag, + GIOCondition new_events); +GLIB_AVAILABLE_IN_2_36 +void g_source_remove_unix_fd (GSource *source, + gpointer tag); +GLIB_AVAILABLE_IN_2_36 +GIOCondition g_source_query_unix_fd (GSource *source, + gpointer tag); +#endif + +/* Used to implement g_source_connect_closure and internally*/ +GLIB_AVAILABLE_IN_ALL +void g_source_set_callback_indirect (GSource *source, + gpointer callback_data, + GSourceCallbackFuncs *callback_funcs); + +GLIB_AVAILABLE_IN_ALL +void g_source_add_poll (GSource *source, + GPollFD *fd); +GLIB_AVAILABLE_IN_ALL +void g_source_remove_poll (GSource *source, + GPollFD *fd); + +GLIB_AVAILABLE_IN_ALL +void g_source_add_child_source (GSource *source, + GSource *child_source); +GLIB_AVAILABLE_IN_ALL +void g_source_remove_child_source (GSource *source, + GSource *child_source); + +GLIB_DEPRECATED_IN_2_28_FOR(g_source_get_time) +void g_source_get_current_time (GSource *source, + GTimeVal *timeval); + +GLIB_AVAILABLE_IN_ALL +gint64 g_source_get_time (GSource *source); + + /* void g_source_connect_closure (GSource *source, + GClosure *closure); + */ + +/* Specific source types + */ +GLIB_AVAILABLE_IN_ALL +GSource *g_idle_source_new (void); +GLIB_AVAILABLE_IN_ALL +GSource *g_child_watch_source_new (GPid pid); +GLIB_AVAILABLE_IN_ALL +GSource *g_timeout_source_new (guint interval); +GLIB_AVAILABLE_IN_ALL +GSource *g_timeout_source_new_seconds (guint interval); + +/* Miscellaneous functions + */ +GLIB_AVAILABLE_IN_ALL +void g_get_current_time (GTimeVal *result); +GLIB_AVAILABLE_IN_ALL +gint64 g_get_monotonic_time (void); +GLIB_AVAILABLE_IN_ALL +gint64 g_get_real_time (void); + + +/* Source manipulation by ID */ +GLIB_AVAILABLE_IN_ALL +gboolean g_source_remove (guint tag); +GLIB_AVAILABLE_IN_ALL +gboolean g_source_remove_by_user_data (gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, + gpointer user_data); + +/* Idles, child watchers and timeouts */ +GLIB_AVAILABLE_IN_ALL +guint g_timeout_add_full (gint priority, + guint interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +guint g_timeout_add (guint interval, + GSourceFunc function, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_timeout_add_seconds_full (gint priority, + guint interval, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +guint g_timeout_add_seconds (guint interval, + GSourceFunc function, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_child_watch_add_full (gint priority, + GPid pid, + GChildWatchFunc function, + gpointer data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +guint g_child_watch_add (GPid pid, + GChildWatchFunc function, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_idle_add (GSourceFunc function, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_idle_add_full (gint priority, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +gboolean g_idle_remove_by_data (gpointer data); + +GLIB_AVAILABLE_IN_ALL +void g_main_context_invoke_full (GMainContext *context, + gint priority, + GSourceFunc function, + gpointer data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +void g_main_context_invoke (GMainContext *context, + GSourceFunc function, + 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..7d241e7 --- /dev/null +++ b/glib/gmappedfile.c @@ -0,0 +1,428 @@ +/* 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 + +#undef fstat +#define fstat(a,b) _fstati64(a,b) +#undef stat +#define stat _stati64 + +#ifndef S_ISREG +#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG) +#endif + +#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 "glibintl.h" + + +#ifndef _O_BINARY +#define _O_BINARY 0 +#endif + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *) -1) +#endif + +/** + * GMappedFile: + * + * The #GMappedFile represents a file mapping created with + * g_mapped_file_new(). It has only private members and should + * not be accessed directly. + */ + +struct _GMappedFile +{ + gchar *contents; + gsize length; + gpointer free_func; + int ref_count; +#ifdef G_OS_WIN32 + HANDLE mapping; +#endif +}; + +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); +} + +static GMappedFile* +mapped_file_new_from_fd (int fd, + gboolean writable, + const gchar *filename, + GError **error) +{ + GMappedFile *file; + struct stat st; + + 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 = filename ? g_filename_display_name (filename) : NULL; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to get attributes of file '%s%s%s%s': fstat() failed: %s"), + display_filename ? display_filename : "fd", + display_filename ? "' " : "", + display_filename ? display_filename : "", + display_filename ? "'" : "", + g_strerror (save_errno)); + g_free (display_filename); + goto out; + } + + /* mmap() on size 0 will fail with EINVAL, so we avoid calling mmap() + * in that case -- but only if we have a regular file; we still want + * attempts to mmap a character device to fail, for example. + */ + if (st.st_size == 0 && S_ISREG (st.st_mode)) + { + file->length = 0; + file->contents = NULL; + 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 = filename ? g_filename_display_name (filename) : NULL; + + g_set_error (error, + G_FILE_ERROR, + g_file_error_from_errno (save_errno), + _("Failed to map %s%s%s%s: mmap() failed: %s"), + display_filename ? display_filename : "fd", + display_filename ? "' " : "", + display_filename ? display_filename : "", + display_filename ? "'" : "", + g_strerror (save_errno)); + g_free (display_filename); + goto out; + } + + return file; + + out: + g_slice_free (GMappedFile, file); + + return NULL; +} + +/** + * 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()). + * + * If @filename is the name of an empty, regular file, the function + * will successfully return an empty #GMappedFile. In other cases of + * size 0 (e.g. device files such as /dev/null), @error will be set + * to the #GFileError value #G_FILE_ERROR_INVAL. + * + * 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; + + 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 = mapped_file_new_from_fd (fd, writable, filename, error); + + close (fd); + + return file; +} + + +/** + * g_mapped_file_new_from_fd: + * @fd: The file descriptor of the file to load + * @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.32 + */ +GMappedFile * +g_mapped_file_new_from_fd (gint fd, + gboolean writable, + GError **error) +{ + return mapped_file_new_from_fd (fd, writable, NULL, error); +} + +/** + * 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_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); + + if (g_atomic_int_dec_and_test (&file->ref_count)) + g_mapped_file_destroy (file); +} + +/** + * g_mapped_file_get_bytes: + * @file: a #GMappedFile + * + * Creates a new #GBytes which references the data mapped from @file. + * The mapped contents of the file must not be modified after creating this + * bytes object, because a #GBytes should be immutable. + * + * Returns: (transfer full): A newly allocated #GBytes referencing data + * from @file + * + * Since: 2.34 + **/ +GBytes * +g_mapped_file_get_bytes (GMappedFile *file) +{ + g_return_val_if_fail (file != NULL, NULL); + + return g_bytes_new_with_free_func (file->contents, + file->length, + (GDestroyNotify) g_mapped_file_unref, + g_mapped_file_ref (file)); +} diff --git a/glib/gmappedfile.h b/glib/gmappedfile.h new file mode 100644 index 0000000..a1c7ac7 --- /dev/null +++ b/glib/gmappedfile.h @@ -0,0 +1,60 @@ +/* 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. + */ + +#ifndef __G_MAPPED_FILE_H__ +#define __G_MAPPED_FILE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GMappedFile GMappedFile; + +GLIB_AVAILABLE_IN_ALL +GMappedFile *g_mapped_file_new (const gchar *filename, + gboolean writable, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +GMappedFile *g_mapped_file_new_from_fd (gint fd, + gboolean writable, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gsize g_mapped_file_get_length (GMappedFile *file); +GLIB_AVAILABLE_IN_ALL +gchar *g_mapped_file_get_contents (GMappedFile *file); +GLIB_AVAILABLE_IN_2_34 +GBytes * g_mapped_file_get_bytes (GMappedFile *file); +GLIB_AVAILABLE_IN_ALL +GMappedFile *g_mapped_file_ref (GMappedFile *file); +GLIB_AVAILABLE_IN_ALL +void g_mapped_file_unref (GMappedFile *file); + +GLIB_DEPRECATED_FOR(g_mapped_file_unref) +void g_mapped_file_free (GMappedFile *file); + +G_END_DECLS + +#endif /* __G_MAPPED_FILE_H__ */ diff --git a/glib/gmarkup.c b/glib/gmarkup.c new file mode 100644 index 0000000..552773f --- /dev/null +++ b/glib/gmarkup.c @@ -0,0 +1,2867 @@ +/* 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 "gmarkup.h" + +#include "gatomic.h" +#include "gslice.h" +#include "galloca.h" +#include "gstrfuncs.h" +#include "gstring.h" +#include "gtestutils.h" +#include "glibintl.h" +#include "gthread.h" + +/** + * SECTION:markup + * @Title: Simple XML Subset Parser + * @Short_description: parses a subset of XML + * @See_also: XML + * Specification + * + * 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 + * + */ + +G_DEFINE_QUARK (g-markup-error-quark, g_markup_error) + +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; + + volatile gint ref_count; + + GMarkupParseFlags flags; + + gint line_number; + gint char_number; + + GMarkupParseState state; + + 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; + + 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->ref_count = 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; +} + +/** + * g_markup_parse_context_ref: + * @context: a #GMarkupParseContext + * + * Increases the reference count of @context. + * + * Returns: the same @context + * + * Since: 2.36 + **/ +GMarkupParseContext * +g_markup_parse_context_ref (GMarkupParseContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + g_return_val_if_fail (context->ref_count > 0, NULL); + + g_atomic_int_inc (&context->ref_count); + + return context; +} + +/** + * g_markup_parse_context_unref: + * @context: a #GMarkupParseContext + * + * Decreases the reference count of @context. When its reference count + * drops to 0, it is freed. + * + * Since: 2.36 + **/ +void +g_markup_parse_context_unref (GMarkupParseContext *context) +{ + g_return_if_fail (context != NULL); + g_return_if_fail (context->ref_count > 0); + + if (g_atomic_int_dec_and_test (&context->ref_count)) + g_markup_parse_context_free (context); +} + +static void +string_full_free (gpointer ptr) +{ + g_string_free (ptr, TRUE); +} + +static void clear_attributes (GMarkupParseContext *context); + +/** + * g_markup_parse_context_free: + * @context: a #GMarkupParseContext + * + * Frees a #GMarkupParseContext. + * + * This function can't be called from inside one of the + * #GMarkupParser functions or 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_free_full (context->tag_stack_gstr, string_full_free); + g_slist_free (context->tag_stack); + + g_slist_free_full (context->spare_chunks, string_full_free); + 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); +} + +G_GNUC_PRINTF(4, 5) +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 gchar *name, + GError **error) +{ + const gchar *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 gchar *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 gchar *p, + gint 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; +} + +G_GNUC_PRINTF(5, 6) +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"), + (int)(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"), + (int)(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"), + (int)(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; + + 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, "s, 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 +#include +#include +#include + +#if defined __OpenBSD__ +#include +#include +#include +#include +#endif + +#include "goption.h" + +#include "gprintf.h" +#include "glibintl.h" + +#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) +{ + glong len = 0; + g_return_val_if_fail (p != NULL, 0); + + while (*p) + { + len += _g_unichar_get_width (g_utf8_get_char (p)); + p = g_utf8_next_char (p); + } + + return len; +} + +G_DEFINE_QUARK (g-option-context-error-quark, g_option_error) + +/** + * 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_free_full (context->groups, (GDestroyNotify) g_option_group_free); + + 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: (allow-none): 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, + GHashTable *aliases) +{ + GOptionEntry *entry; + gint i, len, max_length; + const gchar *long_name; + + max_length = 0; + + for (i = 0; i < group->n_entries; i++) + { + entry = &group->entries[i]; + + if (entry->flags & G_OPTION_FLAG_HIDDEN) + continue; + + long_name = g_hash_table_lookup (aliases, &entry->long_name); + if (!long_name) + long_name = entry->long_name; + len = _g_utf8_strwidth (long_name); + + if (entry->short_name) + len += 4; + + if (!NO_ARG (entry) && entry->arg_description) + len += 1 + _g_utf8_strwidth (TRANSLATE (group, entry->arg_description)); + + max_length = MAX (max_length, len); + } + + return max_length; +} + +static void +print_entry (GOptionGroup *group, + gint max_length, + const GOptionEntry *entry, + GString *string, + GHashTable *aliases) +{ + GString *str; + const gchar *long_name; + + if (entry->flags & G_OPTION_FLAG_HIDDEN) + return; + + if (entry->long_name[0] == 0) + return; + + long_name = g_hash_table_lookup (aliases, &entry->long_name); + if (!long_name) + long_name = entry->long_name; + + str = g_string_new (NULL); + + if (entry->short_name) + g_string_append_printf (str, " -%c, --%s", entry->short_name, long_name); + else + g_string_append_printf (str, " --%s", 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)), "", + 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->long_name[0] == 0) /* ignore rest entry */ + continue; + if (!(entry->flags & reject_filter)) + return TRUE; + } + + return FALSE; +} + +static gboolean +group_list_has_visible_entries (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: (allow-none): 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; + GHashTable *aliases; + 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); + aliases = g_hash_table_new_full (NULL, NULL, NULL, g_free); + + 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)) + { + g_hash_table_insert (aliases, &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"); + + if (list) + { + len = _g_utf8_strwidth ("--help-all"); + max_length = MAX (max_length, len); + } + + if (context->main_group) + { + len = calculate_max_length (context->main_group, aliases); + max_length = MAX (max_length, len); + } + + while (list != NULL) + { + GOptionGroup *g = list->data; + + /* First, we check the --help- options */ + len = _g_utf8_strwidth ("--help-") + _g_utf8_strwidth (g->name); + max_length = MAX (max_length, len); + + /* Then we go through the entries */ + len = calculate_max_length (g, aliases); + 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, aliases); + 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, aliases); + + 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_entries (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, aliases); + + 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, aliases); + + list = list->next; + } + + g_string_append (string, "\n"); + } + + if (context->description) + { + g_string_append (string, TRANSLATE (context, context->description)); + g_string_append (string, "\n"); + } + + g_hash_table_destroy (aliases); + + 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 (!OPTIONAL_ARG (&group->entries[j])) + { + 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 && OPTIONAL_ARG (&group->entries[j])) + { + 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; +} + +/* Use a platform-specific mechanism to look up the first argument to + * the current process. + * Note if you implement this for other platforms, also add it to + * tests/option-argv0.c + */ +static char * +platform_get_argv0 (void) +{ +#if defined __linux + char *cmdline; + char *base_arg0; + gsize len; + + if (!g_file_get_contents ("/proc/self/cmdline", + &cmdline, + &len, + NULL)) + return NULL; + /* Sanity check for a NUL terminator. */ + if (!memchr (cmdline, 0, len)) + return NULL; + /* We could just return cmdline, but I think it's better + * to hold on to a smaller malloc block; the arguments + * could be large. + */ + base_arg0 = g_path_get_basename (cmdline); + g_free (cmdline); + return base_arg0; +#elif defined __OpenBSD__ + char **cmdline = NULL; + char *base_arg0; + gsize len = PATH_MAX; + + int mib[] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV }; + + cmdline = (char **) realloc (cmdline, len); + + if (sysctl (mib, G_N_ELEMENTS (mib), cmdline, &len, NULL, 0) == -1) + { + g_free (cmdline); + return NULL; + } + + /* We could just return cmdline, but I think it's better + * to hold on to a smaller malloc block; the arguments + * could be large. + */ + base_arg0 = g_path_get_basename (*cmdline); + g_free (cmdline); + return base_arg0; +#endif + + return NULL; +} + +/** + * g_option_context_parse: + * @context: a #GOptionContext + * @argc: (inout) (allow-none): a pointer to the number of command line arguments + * @argv: (inout) (array length=argc) (allow-none): 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()) + { + gchar *prgname; + + if (argc && argv && *argc) + prgname = g_path_get_basename ((*argv)[0]); + else + prgname = platform_get_argv0 (); + + if (prgname) + g_set_prgname (prgname); + else + g_set_prgname (""); + + g_free (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: (allow-none): 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: (allow-none): 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 == '-' || (c != 0 && !g_ascii_isprint (c))) + { + g_warning (G_STRLOC ": ignoring invalid short option '%c' (%d) in entry %s:%s", + c, c, group->name, group->entries[i].long_name); + group->entries[i].short_name = '\0'; + } + + if (group->entries[i].arg != G_OPTION_ARG_NONE && + (group->entries[i].flags & G_OPTION_FLAG_REVERSE) != 0) + { + g_warning (G_STRLOC ": ignoring reverse flag on option of arg-type %d in entry %s:%s", + group->entries[i].arg, group->name, group->entries[i].long_name); + + group->entries[i].flags &= ~G_OPTION_FLAG_REVERSE; + } + + if (group->entries[i].arg != G_OPTION_ARG_CALLBACK && + (group->entries[i].flags & (G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME)) != 0) + { + g_warning (G_STRLOC ": ignoring no-arg, optional-arg or filename flags (%d) on option of arg-type %d in entry %s:%s", + group->entries[i].flags, group->entries[i].arg, group->name, group->entries[i].long_name); + + group->entries[i].flags &= ~(G_OPTION_FLAG_NO_ARG|G_OPTION_FLAG_OPTIONAL_ARG|G_OPTION_FLAG_FILENAME); + } + } + + group->n_entries += n_entries; +} + +/** + * g_option_group_set_parse_hooks: + * @group: a #GOptionGroup + * @pre_parse_func: (allow-none): a function to call before parsing, or %NULL + * @post_parse_func: (allow-none): 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: (allow-none): the #GTranslateFunc, or %NULL + * @data: (allow-none): user data to pass to @func, or %NULL + * @destroy_notify: (allow-none): 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: (allow-none): the #GTranslateFunc, or %NULL + * @data: (allow-none): user data to pass to @func, or %NULL + * @destroy_notify: (allow-none): 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: (allow-none): 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 + */ +const 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: (allow-none): 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 + */ +const gchar * +g_option_context_get_description (GOptionContext *context) +{ + g_return_val_if_fail (context != NULL, NULL); + + return context->description; +} diff --git a/glib/goption.h b/glib/goption.h new file mode 100644 index 0000000..ee01377 --- /dev/null +++ b/glib/goption.h @@ -0,0 +1,396 @@ +/* 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. + */ + +#ifndef __G_OPTION_H__ +#define __G_OPTION_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +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 "" + +GLIB_AVAILABLE_IN_ALL +GOptionContext *g_option_context_new (const gchar *parameter_string); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_summary (GOptionContext *context, + const gchar *summary); +GLIB_AVAILABLE_IN_ALL +const gchar * g_option_context_get_summary (GOptionContext *context); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_description (GOptionContext *context, + const gchar *description); +GLIB_AVAILABLE_IN_ALL +const gchar * g_option_context_get_description (GOptionContext *context); +GLIB_AVAILABLE_IN_ALL +void g_option_context_free (GOptionContext *context); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_help_enabled (GOptionContext *context, + gboolean help_enabled); +GLIB_AVAILABLE_IN_ALL +gboolean g_option_context_get_help_enabled (GOptionContext *context); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_ignore_unknown_options (GOptionContext *context, + gboolean ignore_unknown); +GLIB_AVAILABLE_IN_ALL +gboolean g_option_context_get_ignore_unknown_options (GOptionContext *context); + +GLIB_AVAILABLE_IN_ALL +void g_option_context_add_main_entries (GOptionContext *context, + const GOptionEntry *entries, + const gchar *translation_domain); +GLIB_AVAILABLE_IN_ALL +gboolean g_option_context_parse (GOptionContext *context, + gint *argc, + gchar ***argv, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_translate_func (GOptionContext *context, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_translation_domain (GOptionContext *context, + const gchar *domain); + +GLIB_AVAILABLE_IN_ALL +void g_option_context_add_group (GOptionContext *context, + GOptionGroup *group); +GLIB_AVAILABLE_IN_ALL +void g_option_context_set_main_group (GOptionContext *context, + GOptionGroup *group); +GLIB_AVAILABLE_IN_ALL +GOptionGroup *g_option_context_get_main_group (GOptionContext *context); +GLIB_AVAILABLE_IN_ALL +gchar *g_option_context_get_help (GOptionContext *context, + gboolean main_help, + GOptionGroup *group); + +GLIB_AVAILABLE_IN_ALL +GOptionGroup *g_option_group_new (const gchar *name, + const gchar *description, + const gchar *help_description, + gpointer user_data, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_ALL +void g_option_group_set_parse_hooks (GOptionGroup *group, + GOptionParseFunc pre_parse_func, + GOptionParseFunc post_parse_func); +GLIB_AVAILABLE_IN_ALL +void g_option_group_set_error_hook (GOptionGroup *group, + GOptionErrorFunc error_func); +GLIB_AVAILABLE_IN_ALL +void g_option_group_free (GOptionGroup *group); +GLIB_AVAILABLE_IN_ALL +void g_option_group_add_entries (GOptionGroup *group, + const GOptionEntry *entries); +GLIB_AVAILABLE_IN_ALL +void g_option_group_set_translate_func (GOptionGroup *group, + GTranslateFunc func, + gpointer data, + GDestroyNotify destroy_notify); +GLIB_AVAILABLE_IN_ALL +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..c638086 --- /dev/null +++ b/glib/gpattern.c @@ -0,0 +1,447 @@ +/* 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" + +/** + * 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: (allow-none): the reverse of @string or %NULL + * + * 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. + * + * Returns: %TRUE if @string matches @pspec + **/ +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 + * + * Compiles a pattern to a #GPatternSpec. + * + * Returns: a newly-allocated #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 + * + * Compares two compiled pattern specs and returns whether they will + * match the same set of strings. + * + * Returns: Whether the compiled patterns are equal + **/ +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 + * + * 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. + * + * Returns: %TRUE if @string matches @pspec + **/ +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 + * + * 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. + * + * Returns: %TRUE if @string matches @pspec + **/ +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; +} diff --git a/glib/gpattern.h b/glib/gpattern.h new file mode 100644 index 0000000..956b003 --- /dev/null +++ b/glib/gpattern.h @@ -0,0 +1,55 @@ +/* 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. + */ + +#ifndef __G_PATTERN_H__ +#define __G_PATTERN_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +typedef struct _GPatternSpec GPatternSpec; + +GLIB_AVAILABLE_IN_ALL +GPatternSpec* g_pattern_spec_new (const gchar *pattern); +GLIB_AVAILABLE_IN_ALL +void g_pattern_spec_free (GPatternSpec *pspec); +GLIB_AVAILABLE_IN_ALL +gboolean g_pattern_spec_equal (GPatternSpec *pspec1, + GPatternSpec *pspec2); +GLIB_AVAILABLE_IN_ALL +gboolean g_pattern_match (GPatternSpec *pspec, + guint string_length, + const gchar *string, + const gchar *string_reversed); +GLIB_AVAILABLE_IN_ALL +gboolean g_pattern_match_string (GPatternSpec *pspec, + const gchar *string); +GLIB_AVAILABLE_IN_ALL +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..940abae --- /dev/null +++ b/glib/gpoll.c @@ -0,0 +1,432 @@ +/* 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" +#include "glibconfig.h" +#include "giochannel.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 +#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 "gpoll.h" + +#ifdef G_OS_WIN32 +#include "gprintf.h" +#endif + +#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 */ diff --git a/glib/gpoll.h b/glib/gpoll.h new file mode 100644 index 0000000..3ba8420 --- /dev/null +++ b/glib/gpoll.h @@ -0,0 +1,121 @@ +/* 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. + */ + +#ifndef __G_POLL_H__ +#define __G_POLL_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (__G_MAIN_H__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +/** + * GPollFunc: + * @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. + * + * 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. + * + * Returns: the number of #GPollFD elements which have events or errors + * reported, or -1 if an error occurred. + */ +typedef gint (*GPollFunc) (GPollFD *ufds, + guint nfsd, + gint timeout_); + +/** + * GPollFD: + * @fd: the file descriptor to poll (or a HANDLE on Win32) + * @events: a bitwise combination 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. + * @revents: a bitwise combination of flags from #GIOCondition, returned + * from the poll() function to indicate which events occurred. + * + * Represents a file descriptor, which events to poll for, and which events + * occurred. + */ +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 + +GLIB_AVAILABLE_IN_ALL +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..6e27343 --- /dev/null +++ b/glib/gprimes.c @@ -0,0 +1,98 @@ +/* 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 "gprimes.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, +}; + +/** + * g_spaced_primes_closest: + * @num: a #guint + * + * 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. + * + * Returns: the smallest prime number from a built-in array of primes + * which is larger than @num + */ +guint +g_spaced_primes_closest (guint num) +{ + gint i; + + for (i = 0; i < G_N_ELEMENTS (g_primes); i++) + if (g_primes[i] > num) + return g_primes[i]; + + return g_primes[G_N_ELEMENTS (g_primes) - 1]; +} diff --git a/glib/gprimes.h b/glib/gprimes.h new file mode 100644 index 0000000..536ace4 --- /dev/null +++ b/glib/gprimes.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/. + */ + +#ifndef __G_PRIMES_H__ +#define __G_PRIMES_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + */ +GLIB_AVAILABLE_IN_ALL +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..346fd95 --- /dev/null +++ b/glib/gprintf.c @@ -0,0 +1,340 @@ +/* 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" + +#include +#include +#include + +#include "gprintf.h" +#include "gprintfint.h" + + +/** + * g_printf: + * @format: a standard printf() format string, but notice + * string precision pitfalls. + * @...: 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. + * @...: 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. + * @...: 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. + * + * Note that it is usually better to use g_snprintf(), to avoid the + * risk of buffer overflow. + * + * See also g_strdup_printf(). + * + * 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. + * @...: 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; +} diff --git a/glib/gprintf.h b/glib/gprintf.h new file mode 100644 index 0000000..0b01cc4 --- /dev/null +++ b/glib/gprintf.h @@ -0,0 +1,59 @@ +/* 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 + +GLIB_AVAILABLE_IN_ALL +gint g_printf (gchar const *format, + ...) G_GNUC_PRINTF (1, 2); +GLIB_AVAILABLE_IN_ALL +gint g_fprintf (FILE *file, + gchar const *format, + ...) G_GNUC_PRINTF (2, 3); +GLIB_AVAILABLE_IN_ALL +gint g_sprintf (gchar *string, + gchar const *format, + ...) G_GNUC_PRINTF (2, 3); + +GLIB_AVAILABLE_IN_ALL +gint g_vprintf (gchar const *format, + va_list args) G_GNUC_PRINTF(1, 0); +GLIB_AVAILABLE_IN_ALL +gint g_vfprintf (FILE *file, + gchar const *format, + va_list args) G_GNUC_PRINTF(2, 0); +GLIB_AVAILABLE_IN_ALL +gint g_vsprintf (gchar *string, + gchar const *format, + va_list args) G_GNUC_PRINTF(2, 0); +GLIB_AVAILABLE_IN_ALL +gint g_vasprintf (gchar **string, + gchar const *format, + va_list args) G_GNUC_PRINTF(2, 0); + +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..fc699ea --- /dev/null +++ b/glib/gqsort.c @@ -0,0 +1,306 @@ +/* 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. + */ + +#include "config.h" + +#include +#include +#include +#include "galloca.h" +#include "gmem.h" + +#include "gqsort.h" + +#include "gtestutils.h" + +/* This file was originally from stdlib/msort.c in gnu libc, just changed + to build inside glib and to not fall back to an unstable quicksort + for large arrays. */ + +/* An alternative to qsort, with an identical interface. + This file is part of the GNU C Library. + Copyright (C) 1992,95-97,99,2000,01,02,04,07 Free Software Foundation, Inc. + Written by Mike Haertel, September 1988. + + The GNU C Library is free software; you can redistribute it 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. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 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 GNU C Library; if not, see + . */ + + +struct msort_param +{ + size_t s; + size_t var; + GCompareDataFunc cmp; + void *arg; + char *t; +}; + +static void msort_with_tmp (const struct msort_param *p, void *b, size_t n); + +static void +msort_with_tmp (const struct msort_param *p, void *b, size_t n) +{ + char *b1, *b2; + size_t n1, n2; + char *tmp = p->t; + const size_t s = p->s; + GCompareDataFunc cmp = p->cmp; + void *arg = p->arg; + + if (n <= 1) + return; + + n1 = n / 2; + n2 = n - n1; + b1 = b; + b2 = (char *) b + (n1 * p->s); + + msort_with_tmp (p, b1, n1); + msort_with_tmp (p, b2, n2); + + switch (p->var) + { + case 0: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + *(guint32 *) tmp = *(guint32 *) b1; + b1 += sizeof (guint32); + --n1; + } + else + { + *(guint32 *) tmp = *(guint32 *) b2; + b2 += sizeof (guint32); + --n2; + } + tmp += sizeof (guint32); + } + break; + case 1: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + *(guint64 *) tmp = *(guint64 *) b1; + b1 += sizeof (guint64); + --n1; + } + else + { + *(guint64 *) tmp = *(guint64 *) b2; + b2 += sizeof (guint64); + --n2; + } + tmp += sizeof (guint64); + } + break; + case 2: + while (n1 > 0 && n2 > 0) + { + unsigned long *tmpl = (unsigned long *) tmp; + unsigned long *bl; + + tmp += s; + if ((*cmp) (b1, b2, arg) <= 0) + { + bl = (unsigned long *) b1; + b1 += s; + --n1; + } + else + { + bl = (unsigned long *) b2; + b2 += s; + --n2; + } + while (tmpl < (unsigned long *) tmp) + *tmpl++ = *bl++; + } + break; + case 3: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (*(const void **) b1, *(const void **) b2, arg) <= 0) + { + *(void **) tmp = *(void **) b1; + b1 += sizeof (void *); + --n1; + } + else + { + *(void **) tmp = *(void **) b2; + b2 += sizeof (void *); + --n2; + } + tmp += sizeof (void *); + } + break; + default: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + memcpy (tmp, b1, s); + tmp += s; + b1 += s; + --n1; + } + else + { + memcpy (tmp, b2, s); + tmp += s; + b2 += s; + --n2; + } + } + break; + } + + if (n1 > 0) + memcpy (tmp, b1, n1 * s); + memcpy (b, p->t, (n - n2) * s); +} + + +static void +msort_r (void *b, size_t n, size_t s, GCompareDataFunc cmp, void *arg) +{ + size_t size = n * s; + char *tmp = NULL; + struct msort_param p; + + /* For large object sizes use indirect sorting. */ + if (s > 32) + size = 2 * n * sizeof (void *) + s; + + if (size < 1024) + /* The temporary array is small, so put it on the stack. */ + p.t = g_alloca (size); + else + { + /* It's large, so malloc it. */ + tmp = g_malloc (size); + p.t = tmp; + } + + p.s = s; + p.var = 4; + p.cmp = cmp; + p.arg = arg; + + if (s > 32) + { + /* Indirect sorting. */ + char *ip = (char *) b; + void **tp = (void **) (p.t + n * sizeof (void *)); + void **t = tp; + void *tmp_storage = (void *) (tp + n); + char *kp; + size_t i; + + while ((void *) t < tmp_storage) + { + *t++ = ip; + ip += s; + } + p.s = sizeof (void *); + p.var = 3; + msort_with_tmp (&p, p.t + n * sizeof (void *), n); + + /* tp[0] .. tp[n - 1] is now sorted, copy around entries of + the original array. Knuth vol. 3 (2nd ed.) exercise 5.2-10. */ + for (i = 0, ip = (char *) b; i < n; i++, ip += s) + if ((kp = tp[i]) != ip) + { + size_t j = i; + char *jp = ip; + memcpy (tmp_storage, ip, s); + + do + { + size_t k = (kp - (char *) b) / s; + tp[j] = jp; + memcpy (jp, kp, s); + j = k; + jp = kp; + kp = tp[k]; + } + while (kp != ip); + + tp[j] = jp; + memcpy (jp, tmp_storage, s); + } + } + else + { + if ((s & (sizeof (guint32) - 1)) == 0 + && ((char *) b - (char *) 0) % ALIGNOF_GUINT32 == 0) + { + if (s == sizeof (guint32)) + p.var = 0; + else if (s == sizeof (guint64) + && ((char *) b - (char *) 0) % ALIGNOF_GUINT64 == 0) + p.var = 1; + else if ((s & (sizeof (unsigned long) - 1)) == 0 + && ((char *) b - (char *) 0) + % ALIGNOF_UNSIGNED_LONG == 0) + p.var = 2; + } + msort_with_tmp (&p, b, n); + } + g_free (tmp); +} + +/** + * 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. + * + * This is guaranteed to be a stable sort since version 2.32. + */ +void +g_qsort_with_data (gconstpointer pbase, + gint total_elems, + gsize size, + GCompareDataFunc compare_func, + gpointer user_data) +{ + msort_r ((gpointer)pbase, total_elems, size, compare_func, user_data); +} diff --git a/glib/gqsort.h b/glib/gqsort.h new file mode 100644 index 0000000..c67d949 --- /dev/null +++ b/glib/gqsort.h @@ -0,0 +1,47 @@ + /* 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_QSORT_H__ +#define __G_QSORT_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +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.c b/glib/gquark.c new file mode 100644 index 0000000..9762dd6 --- /dev/null +++ b/glib/gquark.c @@ -0,0 +1,361 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * Copyright (C) 1998 Tim Janik + * + * gquark.c: Functions for dealing with quarks and interned strings + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * 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 "gslice.h" +#include "ghash.h" +#include "gquark.h" +#include "gstrfuncs.h" +#include "gthread.h" +#include "gtestutils.h" +#include "glib_trace.h" + +#define QUARK_BLOCK_SIZE 2048 +#define QUARK_STRING_BLOCK_SIZE (4096 - sizeof (gsize)) + +static inline GQuark quark_new (gchar *string); + +G_LOCK_DEFINE_STATIC (quark_global); +static GHashTable *quark_ht = NULL; +static gchar **quarks = NULL; +static gint quark_seq_id = 0; +static gchar *quark_block = NULL; +static gint quark_block_offset = 0; + +/** + * 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 comparison, 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_DEFINE_QUARK: + * @QN: the name to return a #GQuark for + * @q_n: prefix for the function name + * + * A convenience macro which defines a function returning the + * #GQuark for the name @QN. The function will be named + * @q_n_quark(). + * Note that the quark name will be stringified automatically in the + * macro, so you shouldn't use double quotes. + * + * Since: 2.34 + */ + +/** + * g_quark_try_string: + * @string: (allow-none): 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; + + if (string == NULL) + return 0; + + G_LOCK (quark_global); + if (quark_ht) + quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string)); + G_UNLOCK (quark_global); + + return quark; +} + +/* HOLDS: quark_global_lock */ +static char * +quark_strdup (const gchar *string) +{ + gchar *copy; + gsize len; + + len = strlen (string) + 1; + + /* For strings longer than half the block size, fall back + to strdup so that we fill our blocks at least 50%. */ + if (len > QUARK_STRING_BLOCK_SIZE / 2) + return g_strdup (string); + + if (quark_block == NULL || + QUARK_STRING_BLOCK_SIZE - quark_block_offset < len) + { + quark_block = g_malloc (QUARK_STRING_BLOCK_SIZE); + quark_block_offset = 0; + } + + copy = quark_block + quark_block_offset; + memcpy (copy, string, len); + quark_block_offset += len; + + return copy; +} + +/* HOLDS: quark_global_lock */ +static inline GQuark +quark_from_string (const gchar *string, + gboolean duplicate) +{ + GQuark quark = 0; + + if (quark_ht) + quark = GPOINTER_TO_UINT (g_hash_table_lookup (quark_ht, string)); + + if (!quark) + { + quark = quark_new (duplicate ? quark_strdup (string) : (gchar *)string); + TRACE(GLIB_QUARK_NEW(string, quark)); + } + + return quark; +} + +/** + * g_quark_from_string: + * @string: (allow-none): a 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. + * + * Returns: the #GQuark identifying the string, or 0 if @string is + * %NULL. + */ +GQuark +g_quark_from_string (const gchar *string) +{ + GQuark quark; + + if (!string) + return 0; + + G_LOCK (quark_global); + quark = quark_from_string (string, TRUE); + G_UNLOCK (quark_global); + + return quark; +} + +/** + * g_quark_from_static_string: + * @string: (allow-none): a 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). + * + * Returns: the #GQuark identifying the string, or 0 if @string is + * %NULL. + */ +GQuark +g_quark_from_static_string (const gchar *string) +{ + GQuark quark; + + if (!string) + return 0; + + G_LOCK (quark_global); + quark = quark_from_string (string, FALSE); + G_UNLOCK (quark_global); + + return quark; +} + +/** + * g_quark_to_string: + * @quark: a #GQuark. + * + * Gets the string associated with the given #GQuark. + * + * Returns: the string associated with the #GQuark + */ +const gchar * +g_quark_to_string (GQuark quark) +{ + gchar* result = NULL; + gchar **strings; + gint seq_id; + + seq_id = g_atomic_int_get (&quark_seq_id); + strings = g_atomic_pointer_get (&quarks); + + if (quark < seq_id) + result = strings[quark]; + + return result; +} + +/* HOLDS: g_quark_global_lock */ +static inline GQuark +quark_new (gchar *string) +{ + GQuark quark; + gchar **quarks_new; + + if (quark_seq_id % QUARK_BLOCK_SIZE == 0) + { + quarks_new = g_new (gchar*, quark_seq_id + QUARK_BLOCK_SIZE); + if (quark_seq_id != 0) + memcpy (quarks_new, quarks, sizeof (char *) * quark_seq_id); + memset (quarks_new + quark_seq_id, 0, sizeof (char *) * QUARK_BLOCK_SIZE); + /* This leaks the old quarks array. Its unfortunate, but it allows + * us to do lockless lookup of the arrays, and there shouldn't be that + * many quarks in an app + */ + g_atomic_pointer_set (&quarks, quarks_new); + } + if (!quark_ht) + { + g_assert (quark_seq_id == 0); + quark_ht = g_hash_table_new (g_str_hash, g_str_equal); + quarks[quark_seq_id] = NULL; + g_atomic_int_inc (&quark_seq_id); + } + + quark = quark_seq_id; + g_atomic_pointer_set (&quarks[quark], string); + g_hash_table_insert (quark_ht, string, GUINT_TO_POINTER (quark)); + g_atomic_int_inc (&quark_seq_id); + + return quark; +} + +/** + * g_intern_string: + * @string: (allow-none): 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 + */ +const gchar * +g_intern_string (const gchar *string) +{ + const gchar *result; + GQuark quark; + + if (!string) + return NULL; + + G_LOCK (quark_global); + quark = quark_from_string (string, TRUE); + result = quarks[quark]; + G_UNLOCK (quark_global); + + return result; +} + +/** + * g_intern_static_string: + * @string: (allow-none): 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 + */ +const gchar * +g_intern_static_string (const gchar *string) +{ + GQuark quark; + const gchar *result; + + if (!string) + return NULL; + + G_LOCK (quark_global); + quark = quark_from_string (string, FALSE); + result = quarks[quark]; + G_UNLOCK (quark_global); + + return result; +} diff --git a/glib/gquark.h b/glib/gquark.h new file mode 100644 index 0000000..617dbd2 --- /dev/null +++ b/glib/gquark.h @@ -0,0 +1,70 @@ +/* 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_QUARK_H__ +#define __G_QUARK_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef guint32 GQuark; + +/* Quarks (string<->id association) + */ +GLIB_AVAILABLE_IN_ALL +GQuark g_quark_try_string (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GQuark g_quark_from_static_string (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GQuark g_quark_from_string (const gchar *string); +GLIB_AVAILABLE_IN_ALL +const gchar * g_quark_to_string (GQuark quark) G_GNUC_CONST; + +#define G_DEFINE_QUARK(QN, q_n) \ +GQuark \ +q_n##_quark (void) \ +{ \ + static GQuark q; \ + \ + if G_UNLIKELY (q == 0) \ + q = g_quark_from_static_string (#QN); \ + \ + return q; \ +} + +GLIB_AVAILABLE_IN_ALL +const gchar * g_intern_string (const gchar *string); +GLIB_AVAILABLE_IN_ALL +const 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..64117eb --- /dev/null +++ b/glib/gqueue.c @@ -0,0 +1,1072 @@ +/* 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 + */ + +/** + * SECTION:queue + * @Title: Double-ended Queues + * @Short_description: 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(). + */ +#include "config.h" + +#include "gqueue.h" + +#include "gtestutils.h" +#include "gslice.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. + * + * + * If queue elements contain dynamically-allocated memory, + * you should either use g_queue_free_full() or free them manually + * 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_free_full: + * @queue: a pointer to a #GQueue + * @free_func: the function to be called to free each element's data + * + * Convenience method, which frees all the memory used by a #GQueue, and + * calls the specified destroy function on every element's data. + * + * Since: 2.32 + */ +void +g_queue_free_full (GQueue *queue, + GDestroyNotify free_func) +{ + g_queue_foreach (queue, (GFunc) free_func, NULL); + g_queue_free (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. + * + * Return value: %TRUE if @data was found and removed from @queue + * + * Since: 2.4 + **/ +gboolean +g_queue_remove (GQueue *queue, + gconstpointer data) +{ + GList *link; + + g_return_val_if_fail (queue != NULL, FALSE); + + link = g_list_find (queue->head, data); + + if (link) + g_queue_delete_link (queue, link); + + return (link != NULL); +} + +/** + * g_queue_remove_all: + * @queue: a #GQueue + * @data: data to remove + * + * Remove all elements whose data equals @data from @queue. + * + * Return value: the number of elements removed from @queue + * + * Since: 2.4 + **/ +guint +g_queue_remove_all (GQueue *queue, + gconstpointer data) +{ + GList *list; + guint old_length; + + g_return_val_if_fail (queue != NULL, 0); + + old_length = queue->length; + + list = queue->head; + while (list) + { + GList *next = list->next; + + if (list->data == data) + g_queue_delete_link (queue, list); + + list = next; + } + + return (old_length - queue->length); +} + +/** + * 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); +} diff --git a/glib/gqueue.h b/glib/gqueue.h new file mode 100644 index 0000000..23536a4 --- /dev/null +++ b/glib/gqueue.h @@ -0,0 +1,192 @@ +/* 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_QUEUE_H__ +#define __G_QUEUE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GQueue GQueue; + +/** + * GQueue: + * @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 + * + * Contains the public fields of a + * Queue. + */ +struct _GQueue +{ + GList *head; + GList *tail; + guint length; +}; + +/** + * G_QUEUE_INIT: + * + * 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 + */ +#define G_QUEUE_INIT { NULL, NULL, 0 } + +/* Queues + */ +GLIB_AVAILABLE_IN_ALL +GQueue* g_queue_new (void); +GLIB_AVAILABLE_IN_ALL +void g_queue_free (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_queue_free_full (GQueue *queue, + GDestroyNotify free_func); +GLIB_AVAILABLE_IN_ALL +void g_queue_init (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_queue_clear (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +gboolean g_queue_is_empty (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +guint g_queue_get_length (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_queue_reverse (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +GQueue * g_queue_copy (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +void g_queue_foreach (GQueue *queue, + GFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GList * g_queue_find (GQueue *queue, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +GList * g_queue_find_custom (GQueue *queue, + gconstpointer data, + GCompareFunc func); +GLIB_AVAILABLE_IN_ALL +void g_queue_sort (GQueue *queue, + GCompareDataFunc compare_func, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +void g_queue_push_head (GQueue *queue, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_queue_push_tail (GQueue *queue, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_queue_push_nth (GQueue *queue, + gpointer data, + gint n); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_pop_head (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_pop_tail (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_pop_nth (GQueue *queue, + guint n); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_peek_head (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_peek_tail (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +gpointer g_queue_peek_nth (GQueue *queue, + guint n); +GLIB_AVAILABLE_IN_ALL +gint g_queue_index (GQueue *queue, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +gboolean g_queue_remove (GQueue *queue, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_queue_remove_all (GQueue *queue, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +void g_queue_insert_before (GQueue *queue, + GList *sibling, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_queue_insert_after (GQueue *queue, + GList *sibling, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_queue_insert_sorted (GQueue *queue, + gpointer data, + GCompareDataFunc func, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +void g_queue_push_head_link (GQueue *queue, + GList *link_); +GLIB_AVAILABLE_IN_ALL +void g_queue_push_tail_link (GQueue *queue, + GList *link_); +GLIB_AVAILABLE_IN_ALL +void g_queue_push_nth_link (GQueue *queue, + gint n, + GList *link_); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_pop_head_link (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_pop_tail_link (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_pop_nth_link (GQueue *queue, + guint n); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_peek_head_link (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_peek_tail_link (GQueue *queue); +GLIB_AVAILABLE_IN_ALL +GList* g_queue_peek_nth_link (GQueue *queue, + guint n); +GLIB_AVAILABLE_IN_ALL +gint g_queue_link_index (GQueue *queue, + GList *link_); +GLIB_AVAILABLE_IN_ALL +void g_queue_unlink (GQueue *queue, + GList *link_); +GLIB_AVAILABLE_IN_ALL +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..1485c2e --- /dev/null +++ b/glib/grand.c @@ -0,0 +1,696 @@ +/* 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 "grand.h" + +#include "genviron.h" +#include "gmain.h" +#include "gmem.h" +#include "gtestutils.h" +#include "gthread.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 + * + * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/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 gsize initialized = FALSE; + static guint random_version; + + if (g_once_init_enter (&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; + } + g_once_init_leave (&initialized, TRUE); + } + + return 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 + { + dev_urandom = fopen("/dev/urandom", "rb"); + } + while G_UNLIKELY (dev_urandom == NULL && 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 produce 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 from @rand_. This corresponds to a + * unbiased coin toss. + * + * Returns: a random #gboolean. + **/ +/** + * 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) +{ + gdouble r; + + r = g_rand_double (rand); + + return r * end - (r - 1) * begin; +} + +/** + * g_random_boolean: + * + * Returns a random #gboolean. This corresponds to a unbiased coin toss. + * + * Returns: a random #gboolean. + **/ +/** + * 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); +} diff --git a/glib/grand.h b/glib/grand.h new file mode 100644 index 0000000..b121e50 --- /dev/null +++ b/glib/grand.h @@ -0,0 +1,101 @@ +/* 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_RAND_H__ +#define __G_RAND_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GRand GRand; + +/* GRand - a good and fast random number generator: Mersenne Twister + * see http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/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) + */ + +GLIB_AVAILABLE_IN_ALL +GRand* g_rand_new_with_seed (guint32 seed); +GLIB_AVAILABLE_IN_ALL +GRand* g_rand_new_with_seed_array (const guint32 *seed, + guint seed_length); +GLIB_AVAILABLE_IN_ALL +GRand* g_rand_new (void); +GLIB_AVAILABLE_IN_ALL +void g_rand_free (GRand *rand_); +GLIB_AVAILABLE_IN_ALL +GRand* g_rand_copy (GRand *rand_); +GLIB_AVAILABLE_IN_ALL +void g_rand_set_seed (GRand *rand_, + guint32 seed); +GLIB_AVAILABLE_IN_ALL +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) + +GLIB_AVAILABLE_IN_ALL +guint32 g_rand_int (GRand *rand_); +GLIB_AVAILABLE_IN_ALL +gint32 g_rand_int_range (GRand *rand_, + gint32 begin, + gint32 end); +GLIB_AVAILABLE_IN_ALL +gdouble g_rand_double (GRand *rand_); +GLIB_AVAILABLE_IN_ALL +gdouble g_rand_double_range (GRand *rand_, + gdouble begin, + gdouble end); +GLIB_AVAILABLE_IN_ALL +void g_random_set_seed (guint32 seed); + +#define g_random_boolean() ((g_random_int () & (1 << 15)) != 0) + +GLIB_AVAILABLE_IN_ALL +guint32 g_random_int (void); +GLIB_AVAILABLE_IN_ALL +gint32 g_random_int_range (gint32 begin, + gint32 end); +GLIB_AVAILABLE_IN_ALL +gdouble g_random_double (void); +GLIB_AVAILABLE_IN_ALL +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..1ae8e0a --- /dev/null +++ b/glib/gregex.c @@ -0,0 +1,3120 @@ +/* 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 + +#ifdef USE_SYSTEM_PCRE +#include +#else +#include "pcre/pcre.h" +#endif + +#include "gtypes.h" +#include "gregex.h" +#include "glibintl.h" +#include "glist.h" +#include "gmessages.h" +#include "gstrfuncs.h" +#include "gatomic.h" +#include "gthread.h" + +/** + * SECTION:gregex + * @title: Perl-compatible regular expressions + * @short_description: matches strings against regular expressions + * @see_also: + * + * 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. + * + * When setting the %G_REGEX_JAVASCRIPT_COMPAT flag, pattern syntax and pattern + * matching is changed to be compatible with the way that regular expressions + * work in JavaScript. More precisely, a lonely ']' character in the pattern + * is a syntax error; the '\x' escape only allows 0 to 2 hexadecimal digits, and + * you must use the '\u' escape sequence with 4 hex digits to specify a unicode + * codepoint instead of '\x' or 'x{....}'. If '\x' or '\u' are not followed by + * the specified number of hex digits, they match 'x' and 'u' literally; also + * '\U' always matches 'U' instead of being an error in the pattern. Finally, + * pattern matching is modified so that back references to an unset subpattern + * group produces a match with the empty string instead of an error. See + * man:pcreapi(3) for more information. + * + * 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. + */ + +/* 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_FIRSTLINE | \ + G_REGEX_DUPNAMES | \ + G_REGEX_NEWLINE_CR | \ + G_REGEX_NEWLINE_LF | \ + G_REGEX_NEWLINE_CRLF | \ + G_REGEX_NEWLINE_ANYCRLF | \ + G_REGEX_BSR_ANYCRLF | \ + G_REGEX_JAVASCRIPT_COMPAT) + +/* Mask of all GRegexCompileFlags values that are (not) passed trough to PCRE */ +#define G_REGEX_COMPILE_PCRE_MASK (G_REGEX_COMPILE_MASK & ~G_REGEX_COMPILE_NONPCRE_MASK) +#define G_REGEX_COMPILE_NONPCRE_MASK (G_REGEX_RAW | \ + G_REGEX_OPTIMIZE) + +/* 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 | \ + G_REGEX_MATCH_NEWLINE_ANYCRLF | \ + G_REGEX_MATCH_BSR_ANYCRLF | \ + G_REGEX_MATCH_BSR_ANY | \ + G_REGEX_MATCH_PARTIAL_SOFT | \ + G_REGEX_MATCH_PARTIAL_HARD | \ + G_REGEX_MATCH_NOTEMPTY_ATSTART) + +/* we rely on these flags having the same values */ +G_STATIC_ASSERT (G_REGEX_CASELESS == PCRE_CASELESS); +G_STATIC_ASSERT (G_REGEX_MULTILINE == PCRE_MULTILINE); +G_STATIC_ASSERT (G_REGEX_DOTALL == PCRE_DOTALL); +G_STATIC_ASSERT (G_REGEX_EXTENDED == PCRE_EXTENDED); +G_STATIC_ASSERT (G_REGEX_ANCHORED == PCRE_ANCHORED); +G_STATIC_ASSERT (G_REGEX_DOLLAR_ENDONLY == PCRE_DOLLAR_ENDONLY); +G_STATIC_ASSERT (G_REGEX_UNGREEDY == PCRE_UNGREEDY); +G_STATIC_ASSERT (G_REGEX_NO_AUTO_CAPTURE == PCRE_NO_AUTO_CAPTURE); +G_STATIC_ASSERT (G_REGEX_FIRSTLINE == PCRE_FIRSTLINE); +G_STATIC_ASSERT (G_REGEX_DUPNAMES == PCRE_DUPNAMES); +G_STATIC_ASSERT (G_REGEX_NEWLINE_CR == PCRE_NEWLINE_CR); +G_STATIC_ASSERT (G_REGEX_NEWLINE_LF == PCRE_NEWLINE_LF); +G_STATIC_ASSERT (G_REGEX_NEWLINE_CRLF == PCRE_NEWLINE_CRLF); +G_STATIC_ASSERT (G_REGEX_NEWLINE_ANYCRLF == PCRE_NEWLINE_ANYCRLF); +G_STATIC_ASSERT (G_REGEX_BSR_ANYCRLF == PCRE_BSR_ANYCRLF); +G_STATIC_ASSERT (G_REGEX_JAVASCRIPT_COMPAT == PCRE_JAVASCRIPT_COMPAT); + +G_STATIC_ASSERT (G_REGEX_MATCH_ANCHORED == PCRE_ANCHORED); +G_STATIC_ASSERT (G_REGEX_MATCH_NOTBOL == PCRE_NOTBOL); +G_STATIC_ASSERT (G_REGEX_MATCH_NOTEOL == PCRE_NOTEOL); +G_STATIC_ASSERT (G_REGEX_MATCH_NOTEMPTY == PCRE_NOTEMPTY); +G_STATIC_ASSERT (G_REGEX_MATCH_PARTIAL == PCRE_PARTIAL); +G_STATIC_ASSERT (G_REGEX_MATCH_NEWLINE_CR == PCRE_NEWLINE_CR); +G_STATIC_ASSERT (G_REGEX_MATCH_NEWLINE_LF == PCRE_NEWLINE_LF); +G_STATIC_ASSERT (G_REGEX_MATCH_NEWLINE_CRLF == PCRE_NEWLINE_CRLF); +G_STATIC_ASSERT (G_REGEX_MATCH_NEWLINE_ANY == PCRE_NEWLINE_ANY); +G_STATIC_ASSERT (G_REGEX_MATCH_NEWLINE_ANYCRLF == PCRE_NEWLINE_ANYCRLF); +G_STATIC_ASSERT (G_REGEX_MATCH_BSR_ANYCRLF == PCRE_BSR_ANYCRLF); +G_STATIC_ASSERT (G_REGEX_MATCH_BSR_ANY == PCRE_BSR_UNICODE); +G_STATIC_ASSERT (G_REGEX_MATCH_PARTIAL_SOFT == PCRE_PARTIAL_SOFT); +G_STATIC_ASSERT (G_REGEX_MATCH_PARTIAL_HARD == PCRE_PARTIAL_HARD); +G_STATIC_ASSERT (G_REGEX_MATCH_NOTEMPTY_ATSTART == PCRE_NOTEMPTY_ATSTART); + +/* These PCRE flags are unused or not exposed publically in GRegexFlags, so + * it should be ok to reuse them for different things. + */ +G_STATIC_ASSERT (G_REGEX_OPTIMIZE == PCRE_NO_UTF8_CHECK); +G_STATIC_ASSERT (G_REGEX_RAW == PCRE_UTF8); + +/* if the string is in UTF-8 use g_utf8_ functions, else use + * use just +/- 1. */ +#define NEXT_CHAR(re, s) (((re)->compile_opts & G_REGEX_RAW) ? \ + ((s) + 1) : \ + g_utf8_next_char (s)) +#define PREV_CHAR(re, s) (((re)->compile_opts & G_REGEX_RAW) ? \ + ((s) - 1) : \ + g_utf8_prev_char (s)) + +struct _GMatchInfo +{ + volatile gint ref_count; /* the ref count */ + 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 n_offsets; /* number of offsets */ + gint *offsets; /* array of offsets paired 0,1 ; 2,3 ; 3,4 etc */ + 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_BADNEWLINE: + return _("invalid combination of newline flags"); + case PCRE_ERROR_BADOFFSET: + return _("bad offset"); + case PCRE_ERROR_SHORTUTF8: + return _("short utf8"); + case PCRE_ERROR_RECURSELOOP: + return _("recursion loop"); + 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 following \\"); + 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 111: /* internal error: unexpected repeat */ + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("unexpected repeat"); + break; + case G_REGEX_ERROR_UNRECOGNIZED_CHARACTER: + *errmsg = _("unrecognized character after (? or (?-"); + 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 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 is too large"); + break; + case G_REGEX_ERROR_MEMORY_ERROR: + *errmsg = _("failed to get memory"); + break; + case 122: /* unmatched parentheses */ + *errcode = G_REGEX_ERROR_UNMATCHED_PARENTHESIS; + *errmsg = _(") without opening ("); + break; + case 123: /* internal error: code overflow */ + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("code overflow"); + break; + case 124: /* "unrecognized character after (?<\0 */ + *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER; + *errmsg = _("unrecognized character after (?<"); + 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 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_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 137: /* PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u\0 */ + /* A number of Perl escapes are not handled by PCRE. + * Therefore it explicitly raises ERR37. + */ + *errcode = G_REGEX_ERROR_UNRECOGNIZED_ESCAPE; + *errmsg = _("escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported"); + break; + case G_REGEX_ERROR_INFINITE_LOOP: + *errmsg = _("recursive call could loop indefinitely"); + break; + case 141: /* unrecognized character after (?P\0 */ + *errcode = G_REGEX_ERROR_UNRECOGNIZED_CHARACTER; + *errmsg = _("unrecognized character after (?P"); + 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 152: /* internal error: overran compiling workspace */ + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("overran compiling workspace"); + break; + case 153: /* internal error: previously-checked referenced subpattern not found */ + *errcode = G_REGEX_ERROR_INTERNAL; + *errmsg = _("previously-checked referenced subpattern not found"); + break; + case G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE: + *errmsg = _("DEFINE group contains more than one branch"); + 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, angle-bracketed, or quoted name or " + "number, or by a plain number"); + break; + case G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE: + *errmsg = _("a numbered reference must not be zero"); + break; + case G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN: + *errmsg = _("an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"); + break; + case G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB: + *errmsg = _("(*VERB) not recognized"); + break; + case G_REGEX_ERROR_NUMBER_TOO_BIG: + *errmsg = _("number is too big"); + break; + case G_REGEX_ERROR_MISSING_SUBPATTERN_NAME: + *errmsg = _("missing subpattern name after (?&"); + break; + case G_REGEX_ERROR_MISSING_DIGIT: + *errmsg = _("digit expected after (?+"); + break; + case G_REGEX_ERROR_INVALID_DATA_CHARACTER: + *errmsg = _("] is an invalid data character in JavaScript compatibility mode"); + break; + case G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME: + *errmsg = _("different names for subpatterns of the same number are not allowed"); + break; + case G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED: + *errmsg = _("(*MARK) must have an argument"); + break; + case G_REGEX_ERROR_INVALID_CONTROL_CHAR: + *errmsg = _( "\\c must be followed by an ASCII character"); + break; + case G_REGEX_ERROR_MISSING_NAME: + *errmsg = _("\\k is not followed by a braced, angle-bracketed, or quoted name"); + break; + case G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS: + *errmsg = _("\\N is not supported in a class"); + break; + case G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES: + *errmsg = _("too many forward references"); + break; + case G_REGEX_ERROR_NAME_TOO_LONG: + *errmsg = _("name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"); + break; + case G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE: + *errmsg = _("character value in \\u.... sequence is too large"); + break; + + case 116: /* erroffset passed as NULL */ + /* This should not happen as we never pass a NULL erroffset */ + g_warning ("erroffset passed as NULL"); + *errcode = G_REGEX_ERROR_COMPILE; + break; + case 117: /* unknown option bit(s) set */ + /* 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 132: /* this version of PCRE is compiled without UTF support */ + case 144: /* invalid UTF-8 string */ + case 145: /* support for \\P, \\p, and \\X has not been compiled */ + case 167: /* this version of PCRE is not compiled with Unicode property support */ + case 173: /* disallowed Unicode code point (>= 0xd800 && <= 0xdfff) */ + case 174: /* invalid UTF-16 string */ + /* These errors should not happen as we are using an UTF-8 and UCP-enabled PCRE + * and we do not check if strings are valid */ + case 170: /* internal error: unknown opcode in find_fixedlength() */ + *errcode = G_REGEX_ERROR_INTERNAL; + 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->ref_count = 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_ref: + * @match_info: a #GMatchInfo + * + * Increases reference count of @match_info by 1. + * + * Returns: @match_info + * + * Since: 2.30 + */ +GMatchInfo * +g_match_info_ref (GMatchInfo *match_info) +{ + g_return_val_if_fail (match_info != NULL, NULL); + g_atomic_int_inc (&match_info->ref_count); + return match_info; +} + +/** + * g_match_info_unref: + * @match_info: a #GMatchInfo + * + * Decreases reference count of @match_info by 1. When reference count drops + * to zero, it frees all the memory associated with the match_info structure. + * + * Since: 2.30 + */ +void +g_match_info_unref (GMatchInfo *match_info) +{ + if (g_atomic_int_dec_and_test (&match_info->ref_count)) + { + g_regex_unref (match_info->regex); + g_free (match_info->offsets); + g_free (match_info->workspace); + g_free (match_info); + } +} + +/** + * g_match_info_free: + * @match_info: (allow-none): a #GMatchInfo, or %NULL + * + * If @match_info is not %NULL, calls g_match_info_unref(); otherwise does + * nothing. + * + * Since: 2.14 + */ +void +g_match_info_free (GMatchInfo *match_info) +{ + if (match_info == NULL) + return; + + g_match_info_unref (match_info); +} + +/** + * g_match_info_next: + * @match_info: a #GMatchInfo structure + * @error: location to store the error occurring, 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]; + + 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->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 possible 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_SOFT and #G_REGEX_MATCH_PARTIAL_HARD flags. + * When they are used, 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(). + * + * The difference between #G_REGEX_MATCH_PARTIAL_SOFT and + * #G_REGEX_MATCH_PARTIAL_HARD is that when a partial match is encountered + * with #G_REGEX_MATCH_PARTIAL_SOFT, matching continues to search for a + * possible complete match, while with #G_REGEX_MATCH_PARTIAL_HARD matching + * stops at the partial match. + * When both #G_REGEX_MATCH_PARTIAL_SOFT and #G_REGEX_MATCH_PARTIAL_HARD + * are set, the latter takes precedence. + * See man:pcrepartial for more information on partial matching. + * + * 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 or + * #G_REGEX_MATCH_PARTIAL_HARD 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: (allow-none): a #GMatchInfo or %NULL + * @string_to_expand: the string to expand + * @error: location to store the error occurring, 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: (allow-none): 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_free_full (list, (GDestroyNotify) free_interpolation_data); + + 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: (allow-none): 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: (out) (allow-none): pointer to location where to store + * the start position, or %NULL + * @end_pos: (out) (allow-none): pointer to location where to store + * the end position, or %NULL + * + * 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: (allow-none): 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: (out) (allow-none): pointer to location where to store + * the start position, or %NULL + * @end_pos: (out) (allow-none): pointer to location where to store + * the end position, or %NULL + * + * 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: (transfer full): 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 */ + +G_DEFINE_QUARK (g-regex-error-quark, g_regex_error) + +/** + * 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_dec_and_test (®ex->ref_count)) + { + 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 volatile gsize initialised = 0; + unsigned long int pcre_compile_options; + GRegexCompileFlags nonpcre_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 (g_once_init_enter (&initialised)) + { + int supports_utf8, supports_ucp; + + pcre_config (PCRE_CONFIG_UTF8, &supports_utf8); + if (!supports_utf8) + g_critical (_("PCRE library is compiled without UTF8 support")); + + pcre_config (PCRE_CONFIG_UNICODE_PROPERTIES, &supports_ucp); + if (!supports_ucp) + g_critical (_("PCRE library is compiled without UTF8 properties support")); + + g_once_init_leave (&initialised, supports_utf8 && supports_ucp ? 1 : 2); + } + + if (G_UNLIKELY (initialised != 1)) + { + g_set_error_literal (error, G_REGEX_ERROR, G_REGEX_ERROR_COMPILE, + _("PCRE library is compiled with incompatible options")); + return NULL; + } + + nonpcre_compile_options = compile_options & G_REGEX_COMPILE_NONPCRE_MASK; + + /* 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_options |= PCRE_UCP; + + /* PCRE_BSR_UNICODE is the default for the internal PCRE but + * possibly not for the system one. + */ + if (~compile_options & G_REGEX_BSR_ANYCRLF) + compile_options |= PCRE_BSR_UNICODE; + + /* 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 & G_REGEX_COMPILE_PCRE_MASK; + + /* Don't leak PCRE_NEWLINE_ANY, which is part of PCRE_NEWLINE_ANYCRLF */ + if ((pcre_compile_options & PCRE_NEWLINE_ANYCRLF) != PCRE_NEWLINE_ANYCRLF) + compile_options &= ~PCRE_NEWLINE_ANY; + + compile_options |= nonpcre_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_get_has_cr_or_lf: + * @regex: a #GRegex structure + * + * Checks whether the pattern contains explicit CR or LF references. + * + * Returns: %TRUE if the pattern contains explicit CR or LF references + * + * Since: 2.34 + */ +gboolean +g_regex_get_has_cr_or_lf (const GRegex *regex) +{ + gint value; + + pcre_fullinfo (regex->pcre_re, regex->extra, + PCRE_INFO_HASCRORLF, &value); + + return !!value; +} + +/** + * g_regex_get_compile_flags: + * @regex: a #GRegex + * + * Returns the compile options that @regex was created with. + * + * Returns: flags from #GRegexCompileFlags + * + * Since: 2.26 + */ +GRegexCompileFlags +g_regex_get_compile_flags (const GRegex *regex) +{ + g_return_val_if_fail (regex != NULL, 0); + + return regex->compile_opts; +} + +/** + * g_regex_get_match_flags: + * @regex: a #GRegex + * + * Returns the match options that @regex was created with. + * + * Returns: flags from #GRegexMatchFlags + * + * Since: 2.26 + */ +GRegexMatchFlags +g_regex_get_match_flags (const GRegex *regex) +{ + g_return_val_if_fail (regex != NULL, 0); + + return regex->match_opts & G_REGEX_MATCH_MASK; +} + +/** + * 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: (out) (allow-none): 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: (array length=string_len): 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: (out) (allow-none): pointer to location where to store + * the #GMatchInfo, or %NULL if you do not need it + * @error: location to store the error occurring, 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: (out) (allow-none): 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: (array length=string_len): 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: (out) (allow-none): pointer to location where to store + * the #GMatchInfo, or %NULL if you do not need it + * @error: location to store the error occurring, 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 possible + * 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: (transfer full): 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: (transfer full): 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: (array length=string_len): 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: (transfer full): 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_free_full (list, g_free); + 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_free_full (list, (GDestroyNotify) free_interpolation_data); + 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: (array length=string_len): 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 occurring, 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_free_full (list, (GDestroyNotify) free_interpolation_data); + + 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: (array length=string_len): 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 occurring, 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: (array length=string_len): 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 occurring, 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: (out) (allow-none): 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_free_full (list, (GDestroyNotify) free_interpolation_data); + + return TRUE; +} + +/** + * g_regex_escape_nul: + * @string: the string to escape + * @length: the length of @string + * + * Escapes the nul characters in @string to "\x00". It can be used + * to compile a regex with embedded nul characters. + * + * For completeness, @length can be -1 for a nul-terminated string. + * In this case the output string will be of course equal to @string. + * + * Returns: a newly-allocated escaped string + * + * Since: 2.30 + */ +gchar * +g_regex_escape_nul (const gchar *string, + gint length) +{ + GString *escaped; + const gchar *p, *piece_start, *end; + gint backslashes; + + g_return_val_if_fail (string != NULL, NULL); + + if (length < 0) + return g_strdup (string); + + end = string + length; + p = piece_start = string; + escaped = g_string_sized_new (length + 1); + + backslashes = 0; + while (p < end) + { + switch (*p) + { + case '\0': + if (p != piece_start) + { + /* copy the previous piece. */ + g_string_append_len (escaped, piece_start, p - piece_start); + } + if ((backslashes & 1) == 0) + g_string_append_c (escaped, '\\'); + g_string_append_c (escaped, 'x'); + g_string_append_c (escaped, '0'); + g_string_append_c (escaped, '0'); + piece_start = ++p; + backslashes = 0; + break; + case '\\': + backslashes++; + ++p; + break; + default: + backslashes = 0; + 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); +} + +/** + * g_regex_escape_string: + * @string: (array length=length): 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); +} diff --git a/glib/gregex.h b/glib/gregex.h new file mode 100644 index 0000000..c232eac --- /dev/null +++ b/glib/gregex.h @@ -0,0 +1,601 @@ +/* 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 + */ + +#ifndef __G_REGEX_H__ +#define __G_REGEX_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +/** + * GRegexError: + * @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. + * This error is never raised. Since: 2.16 Deprecated: 2.34 + * @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, + * angle-bracketed, or quoted name or number, or by a plain number. Since: 2.16 + * @G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE: relative reference must not be zero. Since: 2.34 + * @G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN: the backtracing + * control verb used does not allow an argument. Since: 2.34 + * @G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB: unknown backtracing + * control verb. Since: 2.34 + * @G_REGEX_ERROR_NUMBER_TOO_BIG: number is too big in escape sequence. Since: 2.34 + * @G_REGEX_ERROR_MISSING_SUBPATTERN_NAME: Missing subpattern name. Since: 2.34 + * @G_REGEX_ERROR_MISSING_DIGIT: Missing digit. Since 2.34 + * @G_REGEX_ERROR_INVALID_DATA_CHARACTER: In JavaScript compatibility mode, + * "[" is an invalid data character. Since: 2.34 + * @G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME: different names for subpatterns of the + * same number are not allowed. Since: 2.34 + * @G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED: the backtracing control + * verb requires an argument. Since: 2.34 + * @G_REGEX_ERROR_INVALID_CONTROL_CHAR: "\\c" must be followed by an ASCII + * character. Since: 2.34 + * @G_REGEX_ERROR_MISSING_NAME: "\\k" is not followed by a braced, angle-bracketed, or + * quoted name. Since: 2.34 + * @G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS: "\\N" is not supported in a class. Since: 2.34 + * @G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES: too many forward references. Since: 2.34 + * @G_REGEX_ERROR_NAME_TOO_LONG: the name is too long in "(*MARK)", "(*PRUNE)", + * "(*SKIP)", or "(*THEN)". Since: 2.34 + * @G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE: the character value in the \\u sequence is + * too large. Since: 2.34 + * + * Error codes returned by regular expressions functions. + * + * Since: 2.14 + */ +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, + G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE = 158, + G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN = 159, + G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB = 160, + G_REGEX_ERROR_NUMBER_TOO_BIG = 161, + G_REGEX_ERROR_MISSING_SUBPATTERN_NAME = 162, + G_REGEX_ERROR_MISSING_DIGIT = 163, + G_REGEX_ERROR_INVALID_DATA_CHARACTER = 164, + G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME = 165, + G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED = 166, + G_REGEX_ERROR_INVALID_CONTROL_CHAR = 168, + G_REGEX_ERROR_MISSING_NAME = 169, + G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS = 171, + G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES = 172, + G_REGEX_ERROR_NAME_TOO_LONG = 175, + G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE = 176 +} GRegexError; + +/** + * G_REGEX_ERROR: + * + * 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 + */ +#define G_REGEX_ERROR g_regex_error_quark () + +GLIB_AVAILABLE_IN_ALL +GQuark g_regex_error_quark (void); + +/** + * GRegexCompileFlags: + * @G_REGEX_CASELESS: Letters in the pattern match both upper- and + * lowercase 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_FIRSTLINE: Limits an unanchored pattern to match before (or at) the + * first newline. Since: 2.34 + * @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 or character sequence is + * recognized. If this option is set, the only recognized newline character + * is '\r'. + * @G_REGEX_NEWLINE_LF: Usually any newline character or character sequence is + * recognized. If this option is set, the only recognized newline character + * is '\n'. + * @G_REGEX_NEWLINE_CRLF: Usually any newline character or character sequence is + * recognized. If this option is set, the only recognized newline character + * sequence is '\r\n'. + * @G_REGEX_NEWLINE_ANYCRLF: Usually any newline character or character sequence + * is recognized. If this option is set, the only recognized newline character + * sequences are '\r', '\n', and '\r\n'. Since: 2.34 + * @G_REGEX_BSR_ANYCRLF: Usually any newline character or character sequence + * is recognised. If this option is set, then "\R" only recognizes the newline + * characters '\r', '\n' and '\r\n'. Since: 2.34 + * @G_REGEX_JAVASCRIPT_COMPAT: Changes behaviour so that it is compatible with + * JavaScript rather than PCRE. Since: 2.34 + * + * Flags specifying compile-time options. + * + * Since: 2.14 + */ +/* 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_FIRSTLINE = 1 << 18, + 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, + G_REGEX_NEWLINE_ANYCRLF = G_REGEX_NEWLINE_CR | 1 << 22, + G_REGEX_BSR_ANYCRLF = 1 << 23, + G_REGEX_JAVASCRIPT_COMPAT = 1 << 25 +} GRegexCompileFlags; + +/** + * GRegexMatchFlags: + * @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 sequence as line terminator. + * @G_REGEX_MATCH_NEWLINE_ANY: Overrides the newline definition set when + * creating a new #GRegex, any Unicode newline sequence + * is recognised as a newline. These are '\r', '\n' and '\rn', and the + * single characters U+000B LINE TABULATION, U+000C FORM FEED (FF), + * U+0085 NEXT LINE (NEL), U+2028 LINE SEPARATOR and + * U+2029 PARAGRAPH SEPARATOR. + * @G_REGEX_MATCH_NEWLINE_ANYCRLF: Overrides the newline definition set when + * creating a new #GRegex; any '\r', '\n', or '\r\n' character sequence + * is recognized as a newline. Since: 2.34 + * @G_REGEX_MATCH_BSR_ANYCRLF: Overrides the newline definition for "\R" set when + * creating a new #GRegex; only '\r', '\n', or '\r\n' character sequences + * are recognized as a newline by "\R". Since: 2.34 + * @G_REGEX_MATCH_BSR_ANY: Overrides the newline definition for "\R" set when + * creating a new #GRegex; any Unicode newline character or character sequence + * are recognized as a newline by "\R". These are '\r', '\n' and '\rn', and the + * single characters U+000B LINE TABULATION, U+000C FORM FEED (FF), + * U+0085 NEXT LINE (NEL), U+2028 LINE SEPARATOR and + * U+2029 PARAGRAPH SEPARATOR. Since: 2.34 + * @G_REGEX_MATCH_PARTIAL_SOFT: An alias for #G_REGEX_MATCH_PARTIAL. Since: 2.34 + * @G_REGEX_MATCH_PARTIAL_HARD: Turns on the partial matching feature. In contrast to + * to #G_REGEX_MATCH_PARTIAL_SOFT, this stops matching as soon as a partial match + * is found, without continuing to search for a possible complete match. See + * see g_match_info_is_partial_match() for more information. Since: 2.34 + * @G_REGEX_MATCH_NOTEMPTY_ATSTART: Like #G_REGEX_MATCH_NOTEMPTY, but only applied to + * the start of the matched string. For anchored + * patterns this can only happen for pattern containing "\K". Since: 2.34 + * + * Flags specifying match-time options. + * + * Since: 2.14 + */ +/* 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, + G_REGEX_MATCH_NEWLINE_ANYCRLF = G_REGEX_MATCH_NEWLINE_CR | G_REGEX_MATCH_NEWLINE_ANY, + G_REGEX_MATCH_BSR_ANYCRLF = 1 << 23, + G_REGEX_MATCH_BSR_ANY = 1 << 24, + G_REGEX_MATCH_PARTIAL_SOFT = G_REGEX_MATCH_PARTIAL, + G_REGEX_MATCH_PARTIAL_HARD = 1 << 27, + G_REGEX_MATCH_NOTEMPTY_ATSTART = 1 << 28 +} GRegexMatchFlags; + +/** + * 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 + */ +typedef struct _GRegex GRegex; + + +typedef struct _GMatchInfo GMatchInfo; + +/** + * GRegexEvalCallback: + * @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() + * + * Specifies the type of the function passed to g_regex_replace_eval(). + * It is called for each occurrence of the pattern in the string passed + * to g_regex_replace_eval(), and it should append the replacement to + * @result. + * + * Returns: %FALSE to continue the replacement process, %TRUE to stop it + * + * Since: 2.14 + */ +typedef gboolean (*GRegexEvalCallback) (const GMatchInfo *match_info, + GString *result, + gpointer user_data); + + +GLIB_AVAILABLE_IN_ALL +GRegex *g_regex_new (const gchar *pattern, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options, + GError **error); +GLIB_AVAILABLE_IN_ALL +GRegex *g_regex_ref (GRegex *regex); +GLIB_AVAILABLE_IN_ALL +void g_regex_unref (GRegex *regex); +GLIB_AVAILABLE_IN_ALL +const gchar *g_regex_get_pattern (const GRegex *regex); +GLIB_AVAILABLE_IN_ALL +gint g_regex_get_max_backref (const GRegex *regex); +GLIB_AVAILABLE_IN_ALL +gint g_regex_get_capture_count (const GRegex *regex); +GLIB_AVAILABLE_IN_ALL +gboolean g_regex_get_has_cr_or_lf (const GRegex *regex); +GLIB_AVAILABLE_IN_ALL +gint g_regex_get_string_number (const GRegex *regex, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +gchar *g_regex_escape_string (const gchar *string, + gint length); +GLIB_AVAILABLE_IN_ALL +gchar *g_regex_escape_nul (const gchar *string, + gint length); + +GLIB_AVAILABLE_IN_ALL +GRegexCompileFlags g_regex_get_compile_flags (const GRegex *regex); +GLIB_AVAILABLE_IN_ALL +GRegexMatchFlags g_regex_get_match_flags (const GRegex *regex); + +/* Matching. */ +GLIB_AVAILABLE_IN_ALL +gboolean g_regex_match_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options); +GLIB_AVAILABLE_IN_ALL +gboolean g_regex_match (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_regex_match_all (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options, + GMatchInfo **match_info); +GLIB_AVAILABLE_IN_ALL +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. */ +GLIB_AVAILABLE_IN_ALL +gchar **g_regex_split_simple (const gchar *pattern, + const gchar *string, + GRegexCompileFlags compile_options, + GRegexMatchFlags match_options); +GLIB_AVAILABLE_IN_ALL +gchar **g_regex_split (const GRegex *regex, + const gchar *string, + GRegexMatchFlags match_options); +GLIB_AVAILABLE_IN_ALL +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. */ +GLIB_AVAILABLE_IN_ALL +gchar *g_regex_replace (const GRegex *regex, + const gchar *string, + gssize string_len, + gint start_position, + const gchar *replacement, + GRegexMatchFlags match_options, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +gboolean g_regex_check_replacement (const gchar *replacement, + gboolean *has_references, + GError **error); + +/* Match info */ +GLIB_AVAILABLE_IN_ALL +GRegex *g_match_info_get_regex (const GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +const gchar *g_match_info_get_string (const GMatchInfo *match_info); + +GLIB_AVAILABLE_IN_ALL +GMatchInfo *g_match_info_ref (GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +void g_match_info_unref (GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +void g_match_info_free (GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +gboolean g_match_info_next (GMatchInfo *match_info, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_match_info_matches (const GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +gint g_match_info_get_match_count (const GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +gboolean g_match_info_is_partial_match (const GMatchInfo *match_info); +GLIB_AVAILABLE_IN_ALL +gchar *g_match_info_expand_references(const GMatchInfo *match_info, + const gchar *string_to_expand, + GError **error); +GLIB_AVAILABLE_IN_ALL +gchar *g_match_info_fetch (const GMatchInfo *match_info, + gint match_num); +GLIB_AVAILABLE_IN_ALL +gboolean g_match_info_fetch_pos (const GMatchInfo *match_info, + gint match_num, + gint *start_pos, + gint *end_pos); +GLIB_AVAILABLE_IN_ALL +gchar *g_match_info_fetch_named (const GMatchInfo *match_info, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +gboolean g_match_info_fetch_named_pos (const GMatchInfo *match_info, + const gchar *name, + gint *start_pos, + gint *end_pos); +GLIB_AVAILABLE_IN_ALL +gchar **g_match_info_fetch_all (const GMatchInfo *match_info); + +G_END_DECLS + +#endif /* __G_REGEX_H__ */ diff --git a/glib/gscanner.c b/glib/gscanner.c new file mode 100644 index 0000000..ce56142 --- /dev/null +++ b/glib/gscanner.c @@ -0,0 +1,2260 @@ +/* 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 "gscanner.h" + +#include "gprintfint.h" +#include "gstrfuncs.h" +#include "gstring.h" +#include "gtestutils.h" + +#ifdef G_OS_WIN32 +#include /* For _read() */ +#endif + + +/** + * SECTION:scanner + * @title: Lexical Scanner + * @short_description: a general purpose lexical scanner + * + * The #GScanner and its associated functions provide a + * general purpose lexical scanner. + */ + +/** + * GScannerMsgFunc: + * @scanner: a #GScanner + * @message: the message + * @error: %TRUE if the message signals an error, + * %FALSE if it signals a warning. + * + * Specifies the type of the message handler function. + */ + +/** + * G_CSET_a_2_z: + * + * The set of lowercase ASCII alphabet characters. + * Used for specifying valid identifier characters + * in #GScannerConfig. + */ + +/** + * G_CSET_A_2_Z: + * + * The set of uppercase ASCII alphabet characters. + * Used for specifying valid identifier characters + * in #GScannerConfig. + */ + +/** + * 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: + * + * The set of lowercase ISO 8859-1 alphabet characters + * which are not ASCII characters. + * Used for specifying valid identifier characters + * in #GScannerConfig. + */ + +/** + * GTokenType: + * @G_TOKEN_EOF: the end of the file + * @G_TOKEN_LEFT_PAREN: a '(' character + * @G_TOKEN_LEFT_CURLY: a '{' character + * @G_TOKEN_LEFT_BRACE: a '[' character + * @G_TOKEN_RIGHT_CURLY: a '}' character + * @G_TOKEN_RIGHT_PAREN: a ')' character + * @G_TOKEN_RIGHT_BRACE: a ']' character + * @G_TOKEN_EQUAL_SIGN: a '=' character + * @G_TOKEN_COMMA: a ',' character + * @G_TOKEN_NONE: not a token + * @G_TOKEN_ERROR: an error occurred + * @G_TOKEN_CHAR: a character + * @G_TOKEN_BINARY: a binary integer + * @G_TOKEN_OCTAL: an octal integer + * @G_TOKEN_INT: an integer + * @G_TOKEN_HEX: a hex integer + * @G_TOKEN_FLOAT: a floating point number + * @G_TOKEN_STRING: a string + * @G_TOKEN_SYMBOL: a symbol + * @G_TOKEN_IDENTIFIER: an identifier + * @G_TOKEN_IDENTIFIER_NULL: a null identifier + * @G_TOKEN_COMMENT_SINGLE: one line comment + * @G_TOKEN_COMMENT_MULTI: multi line comment + * + * The possible types of token returned from each + * g_scanner_get_next_token() call. + */ + +/** + * GTokenValue: + * @v_symbol: token symbol value + * @v_identifier: token identifier value + * @v_binary: token binary integer value + * @v_octal: octal integer value + * @v_int: integer value + * @v_int64: 64-bit integer value + * @v_float: floating point value + * @v_hex: hex integer value + * @v_string: string value + * @v_comment: comment value + * @v_char: character value + * @v_error: error value + * + * A union holding the value of the token. + */ + +/** + * GErrorType: + * @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 + * + * The possible errors, used in the @v_error field + * of #GTokenValue, when the token is a %G_TOKEN_ERROR. + */ + +/** + * GScanner: + * @user_data: unused + * @max_parse_errors: unused + * @parse_errors: g_scanner_error() increments this field + * @input_name: name of input stream, featured by the default message handler + * @qdata: quarked data + * @config: link into the scanner configuration + * @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() + * @msg_handler: handler function for _warn and _error + * + * 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 filename + * 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. + */ + +/** + * GScannerConfig: + * @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). + * @store_int64: use value.v_int64 rather than v_int + * + * 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. + */ + +/* --- 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; +} + +/** + * g_scanner_new: + * @config_templ: the initial scanner settings + * + * 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. + * + * Returns: the new #GScanner + */ +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); +} + +/** + * g_scanner_destroy: + * @scanner: a #GScanner + * + * Frees all memory used by the #GScanner. + */ +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); +} + +/** + * g_scanner_error: + * @scanner: a #GScanner + * @format: the message format. See the printf() documentation + * @...: the parameters to insert into the format string + * + * Outputs an error message, via the #GScanner message handler. + */ +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); + } +} + +/** + * g_scanner_warn: + * @scanner: a #GScanner + * @format: the message format. See the printf() documentation + * @...: the parameters to insert into the format string + * + * Outputs a warning message, via the #GScanner message handler. + */ +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; +} + +/** + * g_scanner_add_symbol: + * @scanner: a #GScanner + * @symbol: the symbol to add + * @value: the value of the symbol + * + * Adds a symbol to the default scope. + * + * Deprecated: 2.2: Use g_scanner_scope_add_symbol() instead. + */ + +/** + * g_scanner_scope_add_symbol: + * @scanner: a #GScanner + * @scope_id: the scope id + * @symbol: the symbol to add + * @value: the value of the symbol + * + * Adds a symbol to the given scope. + */ +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; +} + +/** + * g_scanner_remove_symbol: + * @scanner: a #GScanner + * @symbol: the symbol to remove + * + * Removes a symbol from the default scope. + * + * Deprecated: 2.2: Use g_scanner_scope_remove_symbol() instead. + */ + +/** + * g_scanner_scope_remove_symbol: + * @scanner: a #GScanner + * @scope_id: the scope id + * @symbol: the symbol to remove + * + * Removes a symbol from a scope. + */ +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); + } +} + +/** + * g_scanner_freeze_symbol_table: + * @scanner: a #GScanner + * + * There is no reason to use this macro, since it does nothing. + * + * Deprecated: 2.2: This macro does nothing. + */ + +/** + * g_scanner_thaw_symbol_table: + * @scanner: a #GScanner + * + * There is no reason to use this macro, since it does nothing. + * + * Deprecated: 2.2: This macro does nothing. + */ + +/** + * g_scanner_lookup_symbol: + * @scanner: a #GScanner + * @symbol: the symbol to look up + * + * 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. + * + * Returns: the value of @symbol in the current scope, or %NULL + * if @symbol is not bound in the current scope + */ +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; +} + +/** + * g_scanner_scope_lookup_symbol: + * @scanner: a #GScanner + * @scope_id: the scope id + * @symbol: the symbol to look up + * + * Looks up a symbol in a scope and return its value. If the + * symbol is not bound in the scope, %NULL is returned. + * + * Returns: the value of @symbol in the given scope, or %NULL + * if @symbol is not bound in the given scope. + * + */ +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; +} + +/** + * g_scanner_set_scope: + * @scanner: a #GScanner + * @scope_id: the new scope id + * + * Sets the current scope. + * + * Returns: the old scope id + */ +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); +} + +/** + * g_scanner_foreach_symbol: + * @scanner: a #GScanner + * @func: the function to call with each symbol + * @data: data to pass to the function + * + * Calls a function for each symbol in the default scope. + * + * Deprecated: 2.2: Use g_scanner_scope_foreach_symbol() instead. + */ + +/** + * g_scanner_scope_foreach_symbol: + * @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 + * + * 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. + */ +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); +} + +/** + * g_scanner_peek_next_token: + * @scanner: a #GScanner + * + * 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. + * + * Returns: the type of the token + */ +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; +} + +/** + * g_scanner_get_next_token: + * @scanner: a #GScanner + * + * 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. + * + * Returns: the type of the 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; +} + +/** + * g_scanner_cur_token: + * @scanner: a #GScanner + * + * Gets the current token type. This is simply the @token + * field in the #GScanner structure. + * + * Returns: the current token type + */ +GTokenType +g_scanner_cur_token (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, G_TOKEN_EOF); + + return scanner->token; +} + +/** + * g_scanner_cur_value: + * @scanner: a #GScanner + * + * Gets the current token value. This is simply the @value + * field in the #GScanner structure. + * + * Returns: the current token value + */ +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; +} + +/** + * g_scanner_cur_line: + * @scanner: a #GScanner + * + * 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(). + * + * Returns: the current line + */ +guint +g_scanner_cur_line (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, 0); + + return scanner->line; +} + +/** + * g_scanner_cur_position: + * @scanner: a #GScanner + * + * 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(). + * + * Returns: the current position on the line + */ +guint +g_scanner_cur_position (GScanner *scanner) +{ + g_return_val_if_fail (scanner != NULL, 0); + + return scanner->position; +} + +/** + * g_scanner_eof: + * @scanner: a #GScanner + * + * Returns %TRUE if the scanner has reached the end of + * the file or text buffer. + * + * Returns: %TRUE if the scanner has reached the end of + * the file or text buffer + */ +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; +} + +/** + * g_scanner_input_file: + * @scanner: a #GScanner + * @input_fd: a file descriptor + * + * Prepares to scan a file. + */ +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); +} + +/** + * g_scanner_input_text: + * @scanner: a #GScanner + * @text: the text buffer to scan + * @text_len: the length of the text buffer + * + * Prepares to scan a text buffer. + */ +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; +} + +/** + * g_scanner_sync_file_offset: + * @scanner: a #GScanner + * + * 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. + */ +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; +} + +/** + * g_scanner_unexp_token: + * @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. + * + * 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. + */ +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; +} diff --git a/glib/gscanner.h b/glib/gscanner.h new file mode 100644 index 0000000..2ab531c --- /dev/null +++ b/glib/gscanner.h @@ -0,0 +1,305 @@ +/* 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_SCANNER_H__ +#define __G_SCANNER_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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, + + /*< private >*/ + 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 */ + + /*< private >*/ + 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; + + /*< private >*/ + /* to be considered private */ + GHashTable *symbol_table; + gint input_fd; + const gchar *text; + const gchar *text_end; + gchar *buffer; + guint scope_id; + + /*< public >*/ + /* handler function for _warn and _error */ + GScannerMsgFunc msg_handler; +}; + +GLIB_AVAILABLE_IN_ALL +GScanner* g_scanner_new (const GScannerConfig *config_templ); +GLIB_AVAILABLE_IN_ALL +void g_scanner_destroy (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +void g_scanner_input_file (GScanner *scanner, + gint input_fd); +GLIB_AVAILABLE_IN_ALL +void g_scanner_sync_file_offset (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +void g_scanner_input_text (GScanner *scanner, + const gchar *text, + guint text_len); +GLIB_AVAILABLE_IN_ALL +GTokenType g_scanner_get_next_token (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +GTokenType g_scanner_peek_next_token (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +GTokenType g_scanner_cur_token (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +GTokenValue g_scanner_cur_value (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +guint g_scanner_cur_line (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +guint g_scanner_cur_position (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +gboolean g_scanner_eof (GScanner *scanner); +GLIB_AVAILABLE_IN_ALL +guint g_scanner_set_scope (GScanner *scanner, + guint scope_id); +GLIB_AVAILABLE_IN_ALL +void g_scanner_scope_add_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol, + gpointer value); +GLIB_AVAILABLE_IN_ALL +void g_scanner_scope_remove_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol); +GLIB_AVAILABLE_IN_ALL +gpointer g_scanner_scope_lookup_symbol (GScanner *scanner, + guint scope_id, + const gchar *symbol); +GLIB_AVAILABLE_IN_ALL +void g_scanner_scope_foreach_symbol (GScanner *scanner, + guint scope_id, + GHFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gpointer g_scanner_lookup_symbol (GScanner *scanner, + const gchar *symbol); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_scanner_error (GScanner *scanner, + const gchar *format, + ...) G_GNUC_PRINTF (2,3); +GLIB_AVAILABLE_IN_ALL +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..087669c --- /dev/null +++ b/glib/gscripttable.h @@ -0,0 +1,3120 @@ +/* gscripttable.h: Generated by gen-script-table.pl + * + * Date: Fri Aug 31 18:19:29 2012 + * Source: Scripts-6.2.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_BOPOMOFO, + G_UNICODE_SCRIPT_BOPOMOFO, 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_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, G_UNICODE_SCRIPT_CYRILLIC, + G_UNICODE_SCRIPT_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_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_ARMENIAN, 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_ARABIC, G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, + G_UNICODE_SCRIPT_ARABIC, G_UNICODE_SCRIPT_ARABIC, 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_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_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_ARABIC, + 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_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, + G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_SAMARITAN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_MANDAIC, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_MANDAIC, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_ARABIC, 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_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + 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_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_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_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_INHERITED, G_UNICODE_SCRIPT_INHERITED, 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_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_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_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_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_BENGALI, + 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_GUJARATI, 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_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_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_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_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_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_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_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_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_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_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_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_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_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_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, 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_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_MYANMAR, + G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, G_UNICODE_SCRIPT_MYANMAR, + 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_GEORGIAN, + 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_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_GEORGIAN, + G_UNICODE_SCRIPT_GEORGIAN, G_UNICODE_SCRIPT_GEORGIAN, 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_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_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_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_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_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, G_UNICODE_SCRIPT_ETHIOPIC, + G_UNICODE_SCRIPT_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_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + 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_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, + G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, G_UNICODE_SCRIPT_CANADIAN_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_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_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_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_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_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, + G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_TAI_THAM, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_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_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_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, G_UNICODE_SCRIPT_UNKNOWN, + G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, G_UNICODE_SCRIPT_BATAK, + G_UNICODE_SCRIPT_BATAK, 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_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_INHERITED, + G_UNICODE_SCRIPT_INHERITED, G_UNICODE_SCRIPT_INHERITED, 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_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_COMMON, G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_COMMON, + G_UNICODE_SCRIPT_COMMON, G_UNICODE_SCRIPT_INHERITED, 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_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_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_LATIN, + G_UNICODE_SCRIPT_LATIN, G_UNICODE_SCRIPT_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_INHERITED, + G_UNICODE_SCRIPT_INHERITED, 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, 13, G_UNICODE_SCRIPT_LATIN }, + { 0x20a0, 27, 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, 17, G_UNICODE_SCRIPT_COMMON }, + { 0x2160, 41, G_UNICODE_SCRIPT_LATIN }, + { 0x2189, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x2190, 612, G_UNICODE_SCRIPT_COMMON }, + { 0x2400, 39, G_UNICODE_SCRIPT_COMMON }, + { 0x2440, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x2460, 672, G_UNICODE_SCRIPT_COMMON }, + { 0x2701, 255, G_UNICODE_SCRIPT_COMMON }, + { 0x2800, 256, G_UNICODE_SCRIPT_BRAILLE }, + { 0x2900, 589, G_UNICODE_SCRIPT_COMMON }, + { 0x2b50, 10, G_UNICODE_SCRIPT_COMMON }, + { 0x2c00, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, + { 0x2c30, 47, G_UNICODE_SCRIPT_GLAGOLITIC }, + { 0x2c60, 32, G_UNICODE_SCRIPT_LATIN }, + { 0x2c80, 116, G_UNICODE_SCRIPT_COPTIC }, + { 0x2cf9, 7, G_UNICODE_SCRIPT_COPTIC }, + { 0x2d00, 38, G_UNICODE_SCRIPT_GEORGIAN }, + { 0x2d27, 1, G_UNICODE_SCRIPT_GEORGIAN }, + { 0x2d2d, 1, G_UNICODE_SCRIPT_GEORGIAN }, + { 0x2d30, 56, G_UNICODE_SCRIPT_TIFINAGH }, + { 0x2d6f, 2, G_UNICODE_SCRIPT_TIFINAGH }, + { 0x2d7f, 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, 60, 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, 4, G_UNICODE_SCRIPT_INHERITED }, + { 0x302e, 2, G_UNICODE_SCRIPT_HANGUL }, + { 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, 27, G_UNICODE_SCRIPT_BOPOMOFO }, + { 0x31c0, 36, G_UNICODE_SCRIPT_COMMON }, + { 0x31f0, 16, G_UNICODE_SCRIPT_KATAKANA }, + { 0x3200, 31, G_UNICODE_SCRIPT_HANGUL }, + { 0x3220, 64, 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, 20941, G_UNICODE_SCRIPT_HAN }, + { 0xa000, 1165, G_UNICODE_SCRIPT_YI }, + { 0xa490, 55, G_UNICODE_SCRIPT_YI }, + { 0xa4d0, 48, G_UNICODE_SCRIPT_LISU }, + { 0xa500, 300, G_UNICODE_SCRIPT_VAI }, + { 0xa640, 88, G_UNICODE_SCRIPT_CYRILLIC }, + { 0xa69f, 1, G_UNICODE_SCRIPT_CYRILLIC }, + { 0xa6a0, 88, G_UNICODE_SCRIPT_BAMUM }, + { 0xa700, 34, G_UNICODE_SCRIPT_COMMON }, + { 0xa722, 102, G_UNICODE_SCRIPT_LATIN }, + { 0xa788, 3, G_UNICODE_SCRIPT_COMMON }, + { 0xa78b, 4, G_UNICODE_SCRIPT_LATIN }, + { 0xa790, 4, G_UNICODE_SCRIPT_LATIN }, + { 0xa7a0, 11, G_UNICODE_SCRIPT_LATIN }, + { 0xa7f8, 8, G_UNICODE_SCRIPT_LATIN }, + { 0xa800, 44, G_UNICODE_SCRIPT_SYLOTI_NAGRI }, + { 0xa830, 10, G_UNICODE_SCRIPT_COMMON }, + { 0xa840, 56, G_UNICODE_SCRIPT_PHAGS_PA }, + { 0xa880, 69, G_UNICODE_SCRIPT_SAURASHTRA }, + { 0xa8ce, 12, G_UNICODE_SCRIPT_SAURASHTRA }, + { 0xa8e0, 28, G_UNICODE_SCRIPT_DEVANAGARI }, + { 0xa900, 48, G_UNICODE_SCRIPT_KAYAH_LI }, + { 0xa930, 36, G_UNICODE_SCRIPT_REJANG }, + { 0xa95f, 1, G_UNICODE_SCRIPT_REJANG }, + { 0xa960, 29, G_UNICODE_SCRIPT_HANGUL }, + { 0xa980, 78, G_UNICODE_SCRIPT_JAVANESE }, + { 0xa9cf, 11, G_UNICODE_SCRIPT_JAVANESE }, + { 0xa9de, 2, G_UNICODE_SCRIPT_JAVANESE }, + { 0xaa00, 55, G_UNICODE_SCRIPT_CHAM }, + { 0xaa40, 14, G_UNICODE_SCRIPT_CHAM }, + { 0xaa50, 10, G_UNICODE_SCRIPT_CHAM }, + { 0xaa5c, 4, G_UNICODE_SCRIPT_CHAM }, + { 0xaa60, 28, G_UNICODE_SCRIPT_MYANMAR }, + { 0xaa80, 67, G_UNICODE_SCRIPT_TAI_VIET }, + { 0xaadb, 5, G_UNICODE_SCRIPT_TAI_VIET }, + { 0xaae0, 23, G_UNICODE_SCRIPT_MEETEI_MAYEK }, + { 0xab01, 6, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0xab09, 6, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0xab11, 6, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0xab20, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0xab28, 7, G_UNICODE_SCRIPT_ETHIOPIC }, + { 0xabc0, 46, G_UNICODE_SCRIPT_MEETEI_MAYEK }, + { 0xabf0, 10, G_UNICODE_SCRIPT_MEETEI_MAYEK }, + { 0xac00, 11172, G_UNICODE_SCRIPT_HANGUL }, + { 0xd7b0, 23, G_UNICODE_SCRIPT_HANGUL }, + { 0xd7cb, 49, G_UNICODE_SCRIPT_HANGUL }, + { 0xf900, 366, 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, 114, 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 }, + { 0x10840, 22, G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC }, + { 0x10857, 9, G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC }, + { 0x10900, 28, G_UNICODE_SCRIPT_PHOENICIAN }, + { 0x1091f, 1, G_UNICODE_SCRIPT_PHOENICIAN }, + { 0x10920, 26, G_UNICODE_SCRIPT_LYDIAN }, + { 0x1093f, 1, G_UNICODE_SCRIPT_LYDIAN }, + { 0x10980, 32, G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS }, + { 0x109a0, 24, G_UNICODE_SCRIPT_MEROITIC_CURSIVE }, + { 0x109be, 2, G_UNICODE_SCRIPT_MEROITIC_CURSIVE }, + { 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 }, + { 0x10a60, 32, G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN }, + { 0x10b00, 54, G_UNICODE_SCRIPT_AVESTAN }, + { 0x10b39, 7, G_UNICODE_SCRIPT_AVESTAN }, + { 0x10b40, 22, G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN }, + { 0x10b58, 8, G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN }, + { 0x10b60, 19, G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI }, + { 0x10b78, 8, G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI }, + { 0x10c00, 73, G_UNICODE_SCRIPT_OLD_TURKIC }, + { 0x10e60, 31, G_UNICODE_SCRIPT_ARABIC }, + { 0x11000, 78, G_UNICODE_SCRIPT_BRAHMI }, + { 0x11052, 30, G_UNICODE_SCRIPT_BRAHMI }, + { 0x11080, 66, G_UNICODE_SCRIPT_KAITHI }, + { 0x110d0, 25, G_UNICODE_SCRIPT_SORA_SOMPENG }, + { 0x110f0, 10, G_UNICODE_SCRIPT_SORA_SOMPENG }, + { 0x11100, 53, G_UNICODE_SCRIPT_CHAKMA }, + { 0x11136, 14, G_UNICODE_SCRIPT_CHAKMA }, + { 0x11180, 73, G_UNICODE_SCRIPT_SHARADA }, + { 0x111d0, 10, G_UNICODE_SCRIPT_SHARADA }, + { 0x11680, 56, G_UNICODE_SCRIPT_TAKRI }, + { 0x116c0, 10, G_UNICODE_SCRIPT_TAKRI }, + { 0x12000, 879, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x12400, 99, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x12470, 4, G_UNICODE_SCRIPT_CUNEIFORM }, + { 0x13000, 1071, G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS }, + { 0x16800, 569, G_UNICODE_SCRIPT_BAMUM }, + { 0x16f00, 69, G_UNICODE_SCRIPT_MIAO }, + { 0x16f50, 47, G_UNICODE_SCRIPT_MIAO }, + { 0x16f8f, 17, G_UNICODE_SCRIPT_MIAO }, + { 0x1b000, 1, G_UNICODE_SCRIPT_KATAKANA }, + { 0x1b001, 1, G_UNICODE_SCRIPT_HIRAGANA }, + { 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 }, + { 0x1ee00, 4, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee05, 27, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee21, 2, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee24, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee27, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee29, 10, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee34, 4, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee39, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee3b, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee42, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee47, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee49, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee4b, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee4d, 3, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee51, 2, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee54, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee57, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee59, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee5b, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee5d, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee5f, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee61, 2, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee64, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee67, 4, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee6c, 7, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee74, 4, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee79, 4, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee7e, 1, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee80, 10, G_UNICODE_SCRIPT_ARABIC }, + { 0x1ee8b, 17, G_UNICODE_SCRIPT_ARABIC }, + { 0x1eea1, 3, G_UNICODE_SCRIPT_ARABIC }, + { 0x1eea5, 5, G_UNICODE_SCRIPT_ARABIC }, + { 0x1eeab, 17, G_UNICODE_SCRIPT_ARABIC }, + { 0x1eef0, 2, G_UNICODE_SCRIPT_ARABIC }, + { 0x1f000, 44, G_UNICODE_SCRIPT_COMMON }, + { 0x1f030, 100, G_UNICODE_SCRIPT_COMMON }, + { 0x1f0a0, 15, G_UNICODE_SCRIPT_COMMON }, + { 0x1f0b1, 14, G_UNICODE_SCRIPT_COMMON }, + { 0x1f0c1, 15, G_UNICODE_SCRIPT_COMMON }, + { 0x1f0d1, 15, G_UNICODE_SCRIPT_COMMON }, + { 0x1f100, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x1f110, 31, G_UNICODE_SCRIPT_COMMON }, + { 0x1f130, 60, G_UNICODE_SCRIPT_COMMON }, + { 0x1f170, 43, G_UNICODE_SCRIPT_COMMON }, + { 0x1f1e6, 26, G_UNICODE_SCRIPT_COMMON }, + { 0x1f200, 1, G_UNICODE_SCRIPT_HIRAGANA }, + { 0x1f201, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x1f210, 43, G_UNICODE_SCRIPT_COMMON }, + { 0x1f240, 9, G_UNICODE_SCRIPT_COMMON }, + { 0x1f250, 2, G_UNICODE_SCRIPT_COMMON }, + { 0x1f300, 33, G_UNICODE_SCRIPT_COMMON }, + { 0x1f330, 6, G_UNICODE_SCRIPT_COMMON }, + { 0x1f337, 70, G_UNICODE_SCRIPT_COMMON }, + { 0x1f380, 20, G_UNICODE_SCRIPT_COMMON }, + { 0x1f3a0, 37, G_UNICODE_SCRIPT_COMMON }, + { 0x1f3c6, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x1f3e0, 17, G_UNICODE_SCRIPT_COMMON }, + { 0x1f400, 63, G_UNICODE_SCRIPT_COMMON }, + { 0x1f440, 1, G_UNICODE_SCRIPT_COMMON }, + { 0x1f442, 182, G_UNICODE_SCRIPT_COMMON }, + { 0x1f4f9, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x1f500, 62, G_UNICODE_SCRIPT_COMMON }, + { 0x1f540, 4, G_UNICODE_SCRIPT_COMMON }, + { 0x1f550, 24, G_UNICODE_SCRIPT_COMMON }, + { 0x1f5fb, 70, G_UNICODE_SCRIPT_COMMON }, + { 0x1f645, 11, G_UNICODE_SCRIPT_COMMON }, + { 0x1f680, 70, G_UNICODE_SCRIPT_COMMON }, + { 0x1f700, 116, G_UNICODE_SCRIPT_COMMON }, + { 0x20000, 42711, G_UNICODE_SCRIPT_HAN }, + { 0x2a700, 4149, G_UNICODE_SCRIPT_HAN }, + { 0x2b740, 222, 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..ec23aca --- /dev/null +++ b/glib/gsequence.c @@ -0,0 +1,2009 @@ +/* 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 "gsequence.h" + +#include "gmem.h" +#include "gtestutils.h" +#include "gslice.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 + * + * 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. + * + * Returns: zero if the iterators are 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 (GSequenceNode *haystack, + GSequenceNode *needle, + GSequenceNode *end, + GSequenceIterCompareFunc cmp, + gpointer user_data); +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: (allow-none): 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 #GSequence + * @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 sequence 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 function used to sort the sequence + * @cmp_data: user data passed to @cmp_func + * + * Sorts @seq using @cmp_func. + * + * @cmp_func 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. + * + * 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 function used to compare items in the sequence + * @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. + * + * @cmp_func 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. + * + * 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 function used to compare items in the sequence + * @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. + * + * @cmp_func 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. + * + * 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 function used to compare items in the sequence + * @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. + * + * @cmp_func 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. + * + * If you are simply searching for an existing element of the sequence, + * consider using g_sequence_lookup(). + * + * + * This function will fail if the data contained in the sequence is + * unsorted. Use g_sequence_insert_sorted() or + * g_sequence_insert_sorted_iter() to add data to your sequence or, if + * you want to add a large amount of data, call g_sequence_sort() after + * doing unsorted insertions. + * + * + * 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_lookup: + * @seq: a #GSequence + * @data: data to lookup + * @cmp_func: the function used to compare items in the sequence + * @cmp_data: user data passed to @cmp_func. + * + * Returns an iterator pointing to the position of the first item found + * equal to @data according to @cmp_func and @cmp_data. If more than one + * item is equal, it is not guaranteed that it is the first which is + * returned. In that case, you can use g_sequence_iter_next() and + * g_sequence_iter_prev() to get others. + * + * @cmp_func 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. + * + * + * This function will fail if the data contained in the sequence is + * unsorted. Use g_sequence_insert_sorted() or + * g_sequence_insert_sorted_iter() to add data to your sequence or, if + * you want to add a large amount of data, call g_sequence_sort() after + * doing unsorted insertions. + * + * + * Return value: an #GSequenceIter pointing to the position of the + * first item found equal to @data according to @cmp_func and + * @cmp_data, or %NULL if no such item exists. + * + * Since: 2.28 + **/ +GSequenceIter * +g_sequence_lookup (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_lookup_iter (seq, data, iter_compare, &info); +} + +/** + * g_sequence_sort_iter: + * @seq: a #GSequence + * @cmp_func: the function used to compare iterators in the sequence + * @cmp_data: user data passed to @cmp_func + * + * Like g_sequence_sort(), but uses a #GSequenceIterCompareFunc instead + * of a GCompareDataFunc as the compare function + * + * @cmp_func 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. + * + * 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 function used to compare iterators in the sequence + * @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. + * + * @iter_cmp 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. + * + * 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 function used to compare iterators in the sequence + * @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. + * + * @iter_cmp 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. + * + * 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. + * + * 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 function used to compare iterators in the sequence + * @cmp_data: user data passed to @iter_cmp + * + * Like g_sequence_search(), but uses a #GSequenceIterCompareFunc + * instead of a #GCompareDataFunc as the compare function. + * + * @iter_cmp 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. + * + * If you are simply searching for an existing element of the sequence, + * consider using g_sequence_lookup_iter(). + * + * + * This function will fail if the data contained in the sequence is + * unsorted. Use g_sequence_insert_sorted() or + * g_sequence_insert_sorted_iter() to add data to your sequence or, if + * you want to add a large amount of data, call g_sequence_sort() after + * doing unsorted insertions. + * + * + * 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_lookup_iter: + * @seq: a #GSequence + * @data: data to lookup + * @iter_cmp: the function used to compare iterators in the sequence + * @cmp_data: user data passed to @iter_cmp + * + * Like g_sequence_lookup(), but uses a #GSequenceIterCompareFunc + * instead of a #GCompareDataFunc as the compare function. + * + * @iter_cmp 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. + * + * + * This function will fail if the data contained in the sequence is + * unsorted. Use g_sequence_insert_sorted() or + * g_sequence_insert_sorted_iter() to add data to your sequence or, if + * you want to add a large amount of data, call g_sequence_sort() after + * doing unsorted insertions. + * + * + * Return value: an #GSequenceIter pointing to the position of + * the first item found equal to @data according to @cmp_func + * and @cmp_data, or %NULL if no such item exists. + * + * Since: 2.28 + **/ +GSequenceIter * +g_sequence_lookup_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 (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; + gint len; + + g_return_val_if_fail (iter != NULL, NULL); + + len = g_sequence_get_length (get_sequence (iter)); + + new_pos = node_get_pos (iter) + delta; + + if (new_pos < 0) + new_pos = 0; + else if (new_pos > len) + new_pos = len; + + 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 (GSequenceNode *haystack, + GSequenceNode *needle, + GSequenceNode *end, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data) +{ + gint c; + + haystack = find_root (haystack); + + do + { + /* 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); + + if (c == 0) + break; + + if (c > 0) + haystack = haystack->left; + else + haystack = haystack->right; + } + while (haystack != NULL); + + return haystack; +} + +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. Instead 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); +} diff --git a/glib/gsequence.h b/glib/gsequence.h new file mode 100644 index 0000000..81d06a2 --- /dev/null +++ b/glib/gsequence.h @@ -0,0 +1,173 @@ +/* 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. + */ + +#ifndef __G_SEQUENCE_H__ +#define __G_SEQUENCE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GSequence GSequence; +typedef struct _GSequenceNode GSequenceIter; + +typedef gint (* GSequenceIterCompareFunc) (GSequenceIter *a, + GSequenceIter *b, + gpointer data); + + +/* GSequence */ +GLIB_AVAILABLE_IN_ALL +GSequence * g_sequence_new (GDestroyNotify data_destroy); +GLIB_AVAILABLE_IN_ALL +void g_sequence_free (GSequence *seq); +GLIB_AVAILABLE_IN_ALL +gint g_sequence_get_length (GSequence *seq); +GLIB_AVAILABLE_IN_ALL +void g_sequence_foreach (GSequence *seq, + GFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_foreach_range (GSequenceIter *begin, + GSequenceIter *end, + GFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_sort (GSequence *seq, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_sort_iter (GSequence *seq, + GSequenceIterCompareFunc cmp_func, + gpointer cmp_data); + + +/* Getting iters */ +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_get_begin_iter (GSequence *seq); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_get_end_iter (GSequence *seq); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_get_iter_at_pos (GSequence *seq, + gint pos); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_append (GSequence *seq, + gpointer data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_prepend (GSequence *seq, + gpointer data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_insert_before (GSequenceIter *iter, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_move (GSequenceIter *src, + GSequenceIter *dest); +GLIB_AVAILABLE_IN_ALL +void g_sequence_swap (GSequenceIter *a, + GSequenceIter *b); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_insert_sorted (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_insert_sorted_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_sort_changed (GSequenceIter *iter, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_sort_changed_iter (GSequenceIter *iter, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +void g_sequence_remove (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +void g_sequence_remove_range (GSequenceIter *begin, + GSequenceIter *end); +GLIB_AVAILABLE_IN_ALL +void g_sequence_move_range (GSequenceIter *dest, + GSequenceIter *begin, + GSequenceIter *end); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_search (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_search_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_lookup (GSequence *seq, + gpointer data, + GCompareDataFunc cmp_func, + gpointer cmp_data); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_lookup_iter (GSequence *seq, + gpointer data, + GSequenceIterCompareFunc iter_cmp, + gpointer cmp_data); + + +/* Dereferencing */ +GLIB_AVAILABLE_IN_ALL +gpointer g_sequence_get (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +void g_sequence_set (GSequenceIter *iter, + gpointer data); + +/* Operations on GSequenceIter * */ +GLIB_AVAILABLE_IN_ALL +gboolean g_sequence_iter_is_begin (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +gboolean g_sequence_iter_is_end (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_iter_next (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_iter_prev (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +gint g_sequence_iter_get_position (GSequenceIter *iter); +GLIB_AVAILABLE_IN_ALL +GSequenceIter *g_sequence_iter_move (GSequenceIter *iter, + gint delta); +GLIB_AVAILABLE_IN_ALL +GSequence * g_sequence_iter_get_sequence (GSequenceIter *iter); + + +/* Search */ +GLIB_AVAILABLE_IN_ALL +gint g_sequence_iter_compare (GSequenceIter *a, + GSequenceIter *b); +GLIB_AVAILABLE_IN_ALL +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..2891206 --- /dev/null +++ b/glib/gshell.c @@ -0,0 +1,700 @@ +/* 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 "gshell.h" + +#include "gslist.h" +#include "gstrfuncs.h" +#include "gstring.h" +#include "gtestutils.h" +#include "glibintl.h" +#include "gthread.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. + **/ +G_DEFINE_QUARK (g-shell-error-quark, g_shell_error) + +/* 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 '\\': + current_quote = *p; + break; + + case '#': + if (p == command_line) + { /* '#' was the first char */ + current_quote = *p; + break; + } + switch(*(p-1)) + { + case ' ': + case '\n': + case '\0': + current_quote = *p; + break; + default: + ensure_token (¤t_token); + g_string_append_c (current_token, *p); + break; + } + 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); + + g_slist_free_full (retval, g_free); + + return NULL; +} + +/** + * g_shell_parse_argv: + * @command_line: command line to parse + * @argcp: (out): return location for number of args + * @argvp: (out) (array length=argcp zero-terminated=1): 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_free_full (tokens, g_free); + + 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_free_full (tokens, g_free); + + return FALSE; +} diff --git a/glib/gshell.h b/glib/gshell.h new file mode 100644 index 0000000..cff6c5c --- /dev/null +++ b/glib/gshell.h @@ -0,0 +1,59 @@ +/* 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. + */ + +#ifndef __G_SHELL_H__ +#define __G_SHELL_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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; + +GLIB_AVAILABLE_IN_ALL +GQuark g_shell_error_quark (void); + +GLIB_AVAILABLE_IN_ALL +gchar* g_shell_quote (const gchar *unquoted_string); +GLIB_AVAILABLE_IN_ALL +gchar* g_shell_unquote (const gchar *quoted_string, + GError **error); +GLIB_AVAILABLE_IN_ALL +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..b70724d --- /dev/null +++ b/glib/gslice.c @@ -0,0 +1,1718 @@ +/* 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 "glibconfig.h" + +#if defined HAVE_POSIX_MEMALIGN && defined POSIX_MEMALIGN_WITH_COMPLIANT_ALLOCS +# define HAVE_COMPLIANT_POSIX_MEMALIGN 1 +#endif + +#if defined(HAVE_COMPLIANT_POSIX_MEMALIGN) && !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 /* posix_memalign() */ +#endif +#include /* posix_memalign() */ +#include +#include + +#ifdef HAVE_UNISTD_H +#include /* sysconf() */ +#endif +#ifdef G_OS_WIN32 +#include +#include +#endif + +#include /* fputs/fprintf */ + +#include "gslice.h" + +#include "gmain.h" +#include "gmem.h" /* gslice.h */ +#include "gstrfuncs.h" +#include "gutils.h" +#include "gtrashstack.h" +#include "gtestutils.h" +#include "gthread.h" +#include "glib_trace.h" + +/** + * SECTION:memory_slices + * @title: Memory Slices + * @short_description: 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); + * + */ + +/* 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 = G_PRIVATE_INIT (private_thread_memory_cleanup); +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; /* mutex for G_SLICE=debug-blocks */ + +/* --- auxiliary 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) +{ + const gchar *val; + + *config = slice_config; + + val = getenv ("G_SLICE"); + if (val != NULL) + { + gint flags; + const GDebugKey keys[] = { + { "always-malloc", 1 << 0 }, + { "debug-blocks", 1 << 1 }, + }; + + flags = g_parse_debug_string (val, keys, G_N_ELEMENTS (keys)); + if (flags & (1 << 0)) + config->always_malloc = TRUE; + if (flags & (1 << 1)) + 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 increasing 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)); + } + + g_mutex_init (&allocator->magazine_mutex); + allocator->mutex_counter = 0; + allocator->stamp_counter = MAX_STAMP_COUNTER; /* force initial update */ + allocator->last_stamp = 0; + g_mutex_init (&allocator->slab_mutex); + 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 */ +} + +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 */ + + 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() */ +} + +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 GMutex init_mutex; + guint n_magazines; + + g_mutex_lock (&init_mutex); + if G_UNLIKELY (sys_page_size == 0) + g_slice_init_nomessage (); + g_mutex_unlock (&init_mutex); + + 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_set (&private_thread_memory, tmem); + } + 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 --- */ + +/** + * g_slice_new: + * @type: the type to allocate, typically a structure name + * + * 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. + * + * Returns: a pointer to the allocated block, cast to a pointer to @type + * + * Since: 2.10 + */ + +/** + * g_slice_new0: + * @type: the type to allocate, typically a structure name + * + * 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. + * + * Since: 2.10 + */ + +/** + * g_slice_dup: + * @type: the type to duplicate, typically a structure name + * @mem: the memory to copy into the allocated block + * + * 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. + * + * Returns: a pointer to the allocated block, cast to a pointer to @type + * + * Since: 2.14 + */ + +/** + * g_slice_free: + * @type: the type of the block to free, typically a structure name + * @mem: a pointer to the block to free + * + * 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. + * + * Since: 2.10 + */ + +/** + * g_slice_free_chain: + * @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 + * + * 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. + * + * Since: 2.10 + */ + +/** + * g_slice_alloc: + * @block_size: the number of bytes to allocate + * + * 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. + * + * Returns: a pointer to the allocated memory block + * + * Since: 2.10 + */ +gpointer +g_slice_alloc (gsize mem_size) +{ + ThreadMemory *tmem; + gsize chunk_size; + gpointer mem; + guint acat; + + /* This gets the private structure for this thread. If the private + * structure does not yet exist, it is created. + * + * This has a side effect of causing GSlice to be initialised, so it + * must come first. + */ + tmem = thread_memory_from_self (); + + chunk_size = P2ALIGN (mem_size); + acat = allocator_categorize (chunk_size); + if (G_LIKELY (acat == 1)) /* allocate through magazine layer */ + { + 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); + + TRACE (GLIB_SLICE_ALLOC((void*)mem, mem_size)); + + return mem; +} + +/** + * g_slice_alloc0: + * @block_size: the number of bytes to allocate + * + * Allocates a block of memory via g_slice_alloc() and initializes + * the returned memory to 0. Note that the underlying slice allocation + * mechanism can be changed with the + * G_SLICE=always-malloc + * environment variable. + * + * Returns: a pointer to the allocated block + * + * Since: 2.10 + */ +gpointer +g_slice_alloc0 (gsize mem_size) +{ + gpointer mem = g_slice_alloc (mem_size); + if (mem) + memset (mem, 0, mem_size); + return mem; +} + +/** + * g_slice_copy: + * @block_size: the number of bytes to allocate + * @mem_block: the memory to copy + * + * Allocates a block of memory from the slice allocator + * and copies @block_size bytes into it from @mem_block. + * + * Returns: a pointer to the allocated memory block + * + * Since: 2.14 + */ +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; +} + +/** + * g_slice_free1: + * @block_size: the size of the block + * @mem_block: a pointer to the block to free + * + * 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. + * + * Since: 2.10 + */ +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); + } + TRACE (GLIB_SLICE_FREE((void*)mem_block, mem_size)); +} + +/** + * g_slice_free_chain_with_offset: + * @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 + * + * 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. + * + * Since: 2.10 + */ +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 address */ + 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 address */ + 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 address 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 */ diff --git a/glib/gslice.h b/glib/gslice.h new file mode 100644 index 0000000..e1b6686 --- /dev/null +++ b/glib/gslice.h @@ -0,0 +1,100 @@ +/* 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. + */ + +#ifndef __G_SLICE_H__ +#define __G_SLICE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/* slices - fast allocation/release of small memory blocks + */ +GLIB_AVAILABLE_IN_ALL +gpointer g_slice_alloc (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +GLIB_AVAILABLE_IN_ALL +gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +GLIB_AVAILABLE_IN_ALL +gpointer g_slice_copy (gsize block_size, + gconstpointer mem_block) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); +GLIB_AVAILABLE_IN_ALL +void g_slice_free1 (gsize block_size, + gpointer mem_block); +GLIB_AVAILABLE_IN_ALL +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; + +GLIB_DEPRECATED_IN_2_34 +void g_slice_set_config (GSliceConfig ckey, gint64 value); +GLIB_DEPRECATED_IN_2_34 +gint64 g_slice_get_config (GSliceConfig ckey); +GLIB_DEPRECATED_IN_2_34 +gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values); + +#ifdef G_ENABLE_DEBUG +GLIB_AVAILABLE_IN_ALL +void g_slice_debug_tree_statistics (void); +#endif + +G_END_DECLS + +#endif /* __G_SLICE_H__ */ diff --git a/glib/gslist.c b/glib/gslist.c new file mode 100644 index 0000000..7cec285 --- /dev/null +++ b/glib/gslist.c @@ -0,0 +1,1098 @@ +/* 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 "gslist.h" + +#include "gtestutils.h" +#include "gslice.h" + +/** + * SECTION:linked_lists_single + * @title: Singly-Linked Lists + * @short_description: linked lists that can be iterated 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. + * + * A convenience macro to get the next element in a #GSList. + * + * Returns: the next element, or %NULL if there are no more elements. + **/ + +#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: + * + * 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. + **/ +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. + * + * + * If list elements contain dynamically-allocated memory, + * you should either use g_slist_free_full() or free them manually + * first. + * + */ +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_free_full: + * @list: a pointer to a #GSList + * @free_func: the function to be called to free each element's data + * + * Convenience method, which frees all the memory used by a #GSList, and + * calls the specified destroy function on every element's data. + * + * Since: 2.28 + **/ +void +g_slist_free_full (GSList *list, + GDestroyNotify free_func) +{ + g_slist_foreach (list, (GFunc) free_func, NULL); + g_slist_free (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; + } + + new_list->next = prev_list->next; + prev_list->next = 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. + * + * Removing arbitrary nodes from a singly-linked list + * requires time that is proportional to the length of the list + * (ie. O(n)). If you find yourself using g_slist_remove_link() + * frequently, you should consider a different data structure, such + * as the doubly-linked #GList. + * + * 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. + * + * Removing arbitrary nodes from a singly-linked list + * requires time that is proportional to the length of the list + * (ie. O(n)). If you find yourself using g_slist_delete_link() + * frequently, you should consider a different data structure, such + * as the doubly-linked #GList. + * + * 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. See g_slist_copy_deep() if you need + * to copy the data as well. + * + * + * Returns: a copy of @list + */ +GSList* +g_slist_copy (GSList *list) +{ + return g_slist_copy_deep (list, NULL, NULL); +} + +/** + * g_slist_copy_deep: + * @list: a #GSList + * @func: a copy function used to copy every element in the list + * @user_data: user data passed to the copy function @func, or #NULL + * + * Makes a full (deep) copy of a #GSList. + * + * In contrast with g_slist_copy(), this function uses @func to make a copy of + * each list element, in addition to copying the list container itself. + * + * @func, as a #GCopyFunc, takes two arguments, the data to be copied and a user + * pointer. It's safe to pass #NULL as user_data, if the copy function takes only + * one argument. + * + * For instance, if @list holds a list of GObjects, you can do: + * |[ + * another_list = g_slist_copy_deep (list, (GCopyFunc) g_object_ref, NULL); + * ]| + * + * And, to entirely free the new list, you could do: + * |[ + * g_slist_free_full (another_list, g_object_unref); + * ]| + * + * Returns: a full copy of @list, use #g_slist_free_full to free it + * + * Since: 2.34 + */ +GSList* +g_slist_copy_deep (GSList *list, GCopyFunc func, gpointer user_data) +{ + GSList *new_list = NULL; + + if (list) + { + GSList *last; + + new_list = _g_slist_alloc (); + if (func) + new_list->data = func (list->data, user_data); + else + new_list->data = list->data; + last = new_list; + list = list->next; + while (list) + { + last->next = _g_slist_alloc (); + last = last->next; + if (func) + last->data = func (list->data, user_data); + else + 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); +} diff --git a/glib/gslist.h b/glib/gslist.h new file mode 100644 index 0000000..55b91c6 --- /dev/null +++ b/glib/gslist.h @@ -0,0 +1,145 @@ +/* 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_SLIST_H__ +#define __G_SLIST_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GSList GSList; + +struct _GSList +{ + gpointer data; + GSList *next; +}; + +/* Singly linked lists + */ +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_alloc (void) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +void g_slist_free (GSList *list); +GLIB_AVAILABLE_IN_ALL +void g_slist_free_1 (GSList *list); +#define g_slist_free1 g_slist_free_1 +GLIB_AVAILABLE_IN_ALL +void g_slist_free_full (GSList *list, + GDestroyNotify free_func); +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_append (GSList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_prepend (GSList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_insert (GSList *list, + gpointer data, + gint position) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_insert_sorted (GSList *list, + gpointer data, + GCompareFunc func) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_insert_sorted_with_data (GSList *list, + gpointer data, + GCompareDataFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_insert_before (GSList *slist, + GSList *sibling, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_concat (GSList *list1, + GSList *list2) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_remove (GSList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_remove_all (GSList *list, + gconstpointer data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_remove_link (GSList *list, + GSList *link_) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_delete_link (GSList *list, + GSList *link_) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_reverse (GSList *list) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_copy (GSList *list) G_GNUC_WARN_UNUSED_RESULT; + +GLIB_AVAILABLE_IN_2_34 +GSList* g_slist_copy_deep (GSList *list, + GCopyFunc func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_nth (GSList *list, + guint n); +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_find (GSList *list, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_find_custom (GSList *list, + gconstpointer data, + GCompareFunc func); +GLIB_AVAILABLE_IN_ALL +gint g_slist_position (GSList *list, + GSList *llink); +GLIB_AVAILABLE_IN_ALL +gint g_slist_index (GSList *list, + gconstpointer data); +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_last (GSList *list); +GLIB_AVAILABLE_IN_ALL +guint g_slist_length (GSList *list); +GLIB_AVAILABLE_IN_ALL +void g_slist_foreach (GSList *list, + GFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_sort (GSList *list, + GCompareFunc compare_func) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +GSList* g_slist_sort_with_data (GSList *list, + GCompareDataFunc compare_func, + gpointer user_data) G_GNUC_WARN_UNUSED_RESULT; +GLIB_AVAILABLE_IN_ALL +gpointer g_slist_nth_data (GSList *list, + guint n); + +#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL) + +G_END_DECLS + +#endif /* __G_SLIST_H__ */ 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..2acbde3 --- /dev/null +++ b/glib/gspawn-win32.c @@ -0,0 +1,1512 @@ +/* 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 "glib-private.h" +#include "gprintfint.h" +#include "glibintl.h" +#include "gthread.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef GSPAWN_HELPER +#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 +#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; +} + +G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error) +G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error) + +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; + 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); +} + +gboolean +g_spawn_check_exit_status (gint exit_status, + GError **error) +{ + gboolean ret = FALSE; + + if (exit_status != 0) + { + g_set_error (error, G_SPAWN_EXIT_ERROR, exit_status, + _("Child process exited with code %ld"), + (long) exit_status); + goto out; + } + + ret = TRUE; + out: + return ret; +} + +#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 */ diff --git a/glib/gspawn.c b/glib/gspawn.c new file mode 100644 index 0000000..381ed5c --- /dev/null +++ b/glib/gspawn.c @@ -0,0 +1,1842 @@ +/* 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 "gspawn.h" +#include "gthread.h" +#include "glib/gstdio.h" + +#include "genviron.h" +#include "gmem.h" +#include "gmain.h" +#include "gshell.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gutils.h" +#include "glibintl.h" + + +/** + * SECTION:spawn + * @Short_description: process launching + * @Title: Spawning Processes + */ + + + +static gint g_execute (const gchar *file, + gchar **argv, + gchar **envp, + gboolean search_path, + gboolean search_path_from_envp); + +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 search_path_from_envp, + 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); + +G_DEFINE_QUARK (g-exec-error-quark, g_spawn_error) +G_DEFINE_QUARK (g-spawn-exit-error-quark, g_spawn_exit_error) + +/** + * g_spawn_async: + * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's + * @argv: (array zero-terminated=1): child's argument vector + * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: (scope async) (allow-none): function to run in the child just before exec() + * @user_data: (closure): user data for @child_setup + * @child_pid: (out) (allow-none): 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 void +close_and_invalidate (gint *fd) +{ + if (*fd < 0) + return; + else + { + (void) g_close (*fd, NULL); + *fd = -1; + } +} + +/* 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 (errno == EINTR) + goto again; + else + { + 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; + } +} + +typedef struct { + GMainLoop *loop; + gint *status_p; +} SyncWaitpidData; + +static void +on_sync_waitpid (GPid pid, + gint status, + gpointer user_data) +{ + SyncWaitpidData *data = user_data; + *(data->status_p) = status; + g_main_loop_quit (data->loop); +} + +/** + * g_spawn_sync: + * @working_directory: (allow-none): child's current working directory, or %NULL to inherit parent's + * @argv: (array zero-terminated=1): child's argument vector + * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: (scope async) (allow-none): function to run in the child just before exec() + * @user_data: (closure): user data for @child_setup + * @standard_output: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output, or %NULL + * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child error messages, or %NULL + * @exit_status: (out) (allow-none): 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 platform-specific exit status of + * the child is stored there; see the doucumentation of + * g_spawn_check_exit_status() for how to use and interpret this. + * Note that it is invalid to pass %G_SPAWN_DO_NOT_REAP_CHILD in + * @flags. + * + * 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; + SyncWaitpidData waitpid_data; + + 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_SEARCH_PATH_FROM_ENVP) != 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) + { + int errsv = errno; + + if (errno == EINTR) + continue; + + 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); + + /* Now create a temporary main context and loop, with just one + * waitpid source. We used to invoke waitpid() directly here, but + * this way we unify with the worker thread in gmain.c. + */ + { + GMainContext *context; + GMainLoop *loop; + GSource *source; + + context = g_main_context_new (); + loop = g_main_loop_new (context, TRUE); + + waitpid_data.loop = loop; + waitpid_data.status_p = &status; + + source = g_child_watch_source_new (pid); + g_source_set_callback (source, (GSourceFunc)on_sync_waitpid, &waitpid_data, NULL); + g_source_attach (source, context); + g_source_unref (source); + + g_main_loop_run (loop); + + g_main_context_unref (context); + g_main_loop_unref (loop); + } + + 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: (allow-none): child's current working directory, or %NULL to inherit parent's, in the GLib file name encoding + * @argv: (array zero-terminated=1): child's argument vector, in the GLib file name encoding + * @envp: (array zero-terminated=1) (allow-none): child's environment, or %NULL to inherit parent's, in the GLib file name encoding + * @flags: flags from #GSpawnFlags + * @child_setup: (scope async) (allow-none): function to run in the child just before exec() + * @user_data: (closure): user data for @child_setup + * @child_pid: (out) (allow-none): return location for child process ID, or %NULL + * @standard_input: (out) (allow-none): return location for file descriptor to write to child's stdin, or %NULL + * @standard_output: (out) (allow-none): return location for file descriptor to read child's stdout, or %NULL + * @standard_error: (out) (allow-none): 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. If @flags contains the + * %G_SPAWN_SEARCH_PATH flag, the PATH environment variable + * is used to search for the executable. If @flags contains the + * %G_SPAWN_SEARCH_PATH_FROM_ENVP flag, the PATH variable from + * @envp is used to search for the executable. + * If both the %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP + * flags are set, the PATH variable from @envp takes precedence + * over the environment variable. + * + * If the program name is not a full path and %G_SPAWN_SEARCH_PATH flag is not + * used, then the program will be run from the current directory (or + * @working_directory, if specified); this might be unexpected or even + * dangerous in some cases when the current directory is world-writable. + * + * 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 child watch 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 child watch 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). See g_child_watch_add(). + * + * %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 PATH environment variable. + * %G_SPAWN_SEARCH_PATH_FROM_ENVP means need not be an absolute path, it + * will be looked for in the PATH variable from @envp. If + * both %G_SPAWN_SEARCH_PATH and %G_SPAWN_SEARCH_PATH_FROM_ENVP are used, + * the value from @envp takes precedence over the environment. + * %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_SEARCH_PATH_FROM_ENVP) != 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: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child output + * @standard_error: (out) (array zero-terminated=1) (element-type guint8) (allow-none): return location for child errors + * @exit_status: (out) (allow-none): 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 platform-specific exit status of + * the child is stored there; see the documentation of + * g_spawn_check_exit_status() for how to use and interpret this. + * + * 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; +} + +/** + * g_spawn_check_exit_status: + * @exit_status: An exit code as returned from g_spawn_sync() + * @error: a #GError + * + * Set @error if @exit_status indicates the child exited abnormally + * (e.g. with a nonzero exit code, or via a fatal signal). + * + * The g_spawn_sync() and g_child_watch_add() family of APIs return an + * exit status for subprocesses encoded in a platform-specific way. + * On Unix, this is guaranteed to be in the same format + * waitpid(2) returns, and on Windows it is + * guaranteed to be the result of + * GetExitCodeProcess(). Prior to the introduction + * of this function in GLib 2.34, interpreting @exit_status required + * use of platform-specific APIs, which is problematic for software + * using GLib as a cross-platform layer. + * + * Additionally, many programs simply want to determine whether or not + * the child exited successfully, and either propagate a #GError or + * print a message to standard error. In that common case, this + * function can be used. Note that the error message in @error will + * contain human-readable information about the exit status. + * + * The domain and code of @error + * have special semantics in the case where the process has an "exit + * code", as opposed to being killed by a signal. On Unix, this + * happens if WIFEXITED would be true of + * @exit_status. On Windows, it is always the case. + * + * The special semantics are that the actual exit code will be the + * code set in @error, and the domain will be %G_SPAWN_EXIT_ERROR. + * This allows you to differentiate between different exit codes. + * + * If the process was terminated by some means other than an exit + * status, the domain will be %G_SPAWN_ERROR, and the code will be + * %G_SPAWN_ERROR_FAILED. + * + * This function just offers convenience; you can of course also check + * the available platform via a macro such as %G_OS_UNIX, and use + * WIFEXITED() and WEXITSTATUS() + * on @exit_status directly. Do not attempt to scan or parse the + * error message string; it may be translated and/or change in future + * versions of GLib. + * + * Returns: %TRUE if child exited successfully, %FALSE otherwise (and @error will be set) + * Since: 2.34 + */ +gboolean +g_spawn_check_exit_status (gint exit_status, + GError **error) +{ + gboolean ret = FALSE; + + if (WIFEXITED (exit_status)) + { + if (WEXITSTATUS (exit_status) != 0) + { + g_set_error (error, G_SPAWN_EXIT_ERROR, WEXITSTATUS (exit_status), + _("Child process exited with code %ld"), + (long) WEXITSTATUS (exit_status)); + goto out; + } + } + else if (WIFSIGNALED (exit_status)) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Child process killed by signal %ld"), + (long) WTERMSIG (exit_status)); + goto out; + } + else if (WIFSTOPPED (exit_status)) + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Child process stopped by signal %ld"), + (long) WSTOPSIG (exit_status)); + goto out; + } + else + { + g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, + _("Child process exited abnormally")); + goto out; + } + + ret = TRUE; + out: + return ret; +} + +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_TOO_BIG; + 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; +} + +static gint +sane_open (const char *path, gint mode) +{ + gint ret; + + retry: + ret = open (path, mode); + 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 search_path_from_envp, + 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); + g_assert (read_null != -1); + 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 = sane_open ("/dev/null", O_WRONLY); + g_assert (write_null != -1); + 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 = sane_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, search_path_from_envp); + + /* 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 search_path_from_envp, + 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. + */ + + /* Reset some signal handlers that we may use */ + signal (SIGCHLD, SIG_DFL); + signal (SIGINT, SIG_DFL); + signal (SIGTERM, SIG_DFL); + signal (SIGHUP, SIG_DFL); + + /* 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, + search_path_from_envp, + 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, + search_path_from_envp, + 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) +{ + /* 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, + gboolean search_path_from_envp) +{ + if (*file == '\0') + { + /* We check the simple case first. */ + errno = ENOENT; + return -1; + } + + if (!(search_path || search_path_from_envp) || 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); + } + else + { + gboolean got_eacces = 0; + const gchar *path, *p; + gchar *name, *freeme; + gsize len; + gsize pathlen; + + path = NULL; + if (search_path_from_envp) + path = g_environ_getenv (envp, "PATH"); + if (search_path && path == NULL) + 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); + + 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; + + case ENODEV: + case ETIMEDOUT: + /* Some strange filesystems like AFS return even + * stranger error numbers. They cannot reasonably mean anything + * else so ignore those, too. + */ + 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) +{ +} diff --git a/glib/gspawn.h b/glib/gspawn.h new file mode 100644 index 0000000..24bd521 --- /dev/null +++ b/glib/gspawn.h @@ -0,0 +1,305 @@ +/* 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. + */ + +#ifndef __G_SPAWN_H__ +#define __G_SPAWN_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + + +/* I'm not sure I remember our proposed naming convention here. */ +/** + * G_SPAWN_ERROR: + * + * Error domain for spawning processes. Errors in this domain will + * be from the #GSpawnError enumeration. See #GError for information on + * error domains. + */ +#define G_SPAWN_ERROR g_spawn_error_quark () + +/** + * GSpawnError: + * @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_TOO_BIG: execv() returned E2BIG + * @G_SPAWN_ERROR_2BIG: deprecated alias for %G_SPAWN_ERROR_TOO_BIG + * @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 codes returned by spawning processes. + */ +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_TOO_BIG,/* execv() returned E2BIG */ +#ifndef G_DISABLE_DEPRECATED + G_SPAWN_ERROR_2BIG = G_SPAWN_ERROR_TOO_BIG, +#endif + 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; + +/** + * G_SPAWN_EXIT_ERROR: + * + * Error domain used by g_spawn_check_exit_status(). The code + * will be the program exit code. + */ +#define G_SPAWN_EXIT_ERROR g_spawn_exit_error_quark () + +/** + * GSpawnChildSetupFunc: + * @user_data: user data to pass to the function. + * + * Specifies the type of the setup function passed to g_spawn_async(), + * g_spawn_sync() and g_spawn_async_with_pipes(), which can, in very + * limited ways, be used to affect the child's execution. + * + * On POSIX platforms, the function is called in the child after GLib + * has performed all the setup it plans to perform, but before calling + * exec(). Actions taken in this function will only affect the child, + * not the parent. + * + * 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. + * + * However, even on POSIX, you are extremely limited in what you can + * safely do from a #GSpawnChildSetupFunc, because any mutexes that + * were held by other threads in the parent process at the time of the + * fork() will still be locked in the child process, and they will + * never be unlocked (since the threads that held them don't exist in + * the child). POSIX allows only async-signal-safe functions (see + * signal7) + * to be called in the child between fork() and exec(), which + * drastically limits the usefulness of child setup functions. + * + * In particular, it is not safe to call any function which may + * call malloc(), which includes POSIX functions such as setenv(). + * If you need to set up the child environment differently from + * the parent, you should use g_get_environ(), g_environ_setenv(), + * and g_environ_unsetenv(), and then pass the complete environment + * list to the g_spawn... function. + */ +typedef void (* GSpawnChildSetupFunc) (gpointer user_data); + +/** + * GSpawnFlags: + * @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. + * @G_SPAWN_SEARCH_PATH_FROM_ENVP: if argv[0] is not an abolute path, + * it will be looked for in the PATH from the passed child + * environment. Since: 2.34 + * + * Flags passed to g_spawn_sync(), g_spawn_async() and g_spawn_async_with_pipes(). + */ +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, + G_SPAWN_SEARCH_PATH_FROM_ENVP = 1 << 7 +} GSpawnFlags; + +GLIB_AVAILABLE_IN_ALL +GQuark g_spawn_error_quark (void); +GLIB_AVAILABLE_IN_ALL +GQuark g_spawn_exit_error_quark (void); + +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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. + */ + +GLIB_AVAILABLE_IN_ALL +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); + +GLIB_AVAILABLE_IN_ALL +gboolean g_spawn_command_line_sync (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_spawn_command_line_async (const gchar *command_line, + GError **error); + +GLIB_AVAILABLE_IN_2_34 +gboolean g_spawn_check_exit_status (gint exit_status, + GError **error); + +GLIB_AVAILABLE_IN_ALL +void g_spawn_close_pid (GPid pid); + +#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 + +GLIB_AVAILABLE_IN_ALL +gboolean g_spawn_async_utf8 (const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + GPid *child_pid, + GError **error); +GLIB_AVAILABLE_IN_ALL +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_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error); +GLIB_AVAILABLE_IN_ALL +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); + +GLIB_AVAILABLE_IN_ALL +gboolean g_spawn_command_line_sync_utf8 (const gchar *command_line, + gchar **standard_output, + gchar **standard_error, + gint *exit_status, + GError **error); +GLIB_AVAILABLE_IN_ALL +gboolean g_spawn_command_line_async_utf8 (const gchar *command_line, + GError **error); +#endif + +G_END_DECLS + +#endif /* __G_SPAWN_H__ */ diff --git a/glib/gstdio.c b/glib/gstdio.c new file mode 100644 index 0000000..bbdad5b --- /dev/null +++ b/glib/gstdio.c @@ -0,0 +1,880 @@ +/* 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" +#include "glibconfig.h" + +#define G_STDIO_NO_WRAP_ON_UNIX + +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef G_OS_WIN32 +#include +#include +#include +#include +#include +#include +#else +#include +#include +#endif + +#include "gstdio.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 + int fd; + do + fd = open (filename, flags, mode); + while (G_UNLIKELY (fd == -1 && errno == EINTR)); + return fd; +#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 +} + +/** + * GStatBuf: + * + * A type corresponding to the appropriate struct type for the stat + * system call, depending on the platform and/or compiler being used. + * + * See g_stat() for more information. + **/ +/** + * 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. + * + * On Windows the Microsoft C libraries have several variants of the + * stat struct and stat() function with names + * like "_stat", "_stat32", "_stat32i64" and "_stat64i32". The one + * used here is for 32-bit code the one with 32-bit size and time + * fields, specifically called "_stat32". + * + * In Microsoft's compiler, by default "struct stat" means one with + * 64-bit time fields while in MinGW "struct stat" is the legacy one + * with 32-bit fields. To hopefully clear up this messs, the gstdio.h + * header defines a type GStatBuf which is the appropriate struct type + * depending on the platform and/or compiler being used. On POSIX it + * is just "struct stat", but note that even on POSIX platforms, + * "stat" might be a macro. + * + * 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, + GStatBuf *buf) +{ +#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, + GStatBuf *buf) +{ +#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: (allow-none): 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 +} + +/** + * g_close: + * @fd: A file descriptor + * @error: a #GError + * + * This wraps the close() call; in case of error, %errno will be + * preserved, but the error will also be stored as a #GError in @error. + * + * Besides using #GError, there is another major reason to prefer this + * function over the call provided by the system; on Unix, it will + * attempt to correctly handle %EINTR, which has platform-specific + * semantics. + */ +gboolean +g_close (gint fd, + GError **error) +{ + int res; + res = close (fd); + /* Just ignore EINTR for now; a retry loop is the wrong thing to do + * on Linux at least. Anyone who wants to add a conditional check + * for e.g. HP-UX is welcome to do so later... + * + * http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html + * https://bugzilla.gnome.org/show_bug.cgi?id=682819 + * http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR + * https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain + */ + if (G_UNLIKELY (res == -1 && errno == EINTR)) + return TRUE; + else if (res == -1) + { + int errsv = errno; + g_set_error_literal (error, G_FILE_ERROR, + g_file_error_from_errno (errsv), + g_strerror (errsv)); + errno = errsv; + return FALSE; + } + return TRUE; +} + diff --git a/glib/gstdio.h b/glib/gstdio.h new file mode 100644 index 0000000..90ee74e --- /dev/null +++ b/glib/gstdio.h @@ -0,0 +1,172 @@ +/* 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 (_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, to get file + * attributes just use the GIO API instead which doesn't use struct + * stat. + * + * Sure, it would be nicer to use a struct with 64-bit st_size and + * 64-bit st_*time fields, but changing that now would break ABI. And + * in MinGW, a plain "struct stat" is the one with 32-bit st_size and + * st_*time fields. + */ + +typedef struct _stat32 GStatBuf; + +#else + +typedef struct stat GStatBuf; + +#endif + +#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. + */ + +#ifndef __GTK_DOC_IGNORE__ +#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 +#endif + +GLIB_AVAILABLE_IN_ALL +int g_access (const gchar *filename, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_chdir (const gchar *path); + +GLIB_AVAILABLE_IN_ALL +int g_unlink (const gchar *filename); + +GLIB_AVAILABLE_IN_ALL +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, preferably 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. + */ + +GLIB_AVAILABLE_IN_ALL +int g_access (const gchar *filename, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_chmod (const gchar *filename, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_open (const gchar *filename, + int flags, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_creat (const gchar *filename, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_rename (const gchar *oldfilename, + const gchar *newfilename); + +GLIB_AVAILABLE_IN_ALL +int g_mkdir (const gchar *filename, + int mode); + +GLIB_AVAILABLE_IN_ALL +int g_chdir (const gchar *path); + +GLIB_AVAILABLE_IN_ALL +int g_stat (const gchar *filename, + GStatBuf *buf); + +GLIB_AVAILABLE_IN_ALL +int g_lstat (const gchar *filename, + GStatBuf *buf); + +GLIB_AVAILABLE_IN_ALL +int g_unlink (const gchar *filename); + +GLIB_AVAILABLE_IN_ALL +int g_remove (const gchar *filename); + +GLIB_AVAILABLE_IN_ALL +int g_rmdir (const gchar *filename); + +GLIB_AVAILABLE_IN_ALL +FILE *g_fopen (const gchar *filename, + const gchar *mode); + +GLIB_AVAILABLE_IN_ALL +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. + */ + +GLIB_AVAILABLE_IN_ALL +int g_utime (const gchar *filename, + struct utimbuf *utb); + +#endif /* G_OS_UNIX */ + +GLIB_AVAILABLE_IN_2_36 +gboolean g_close (gint fd, + GError **error); + +G_END_DECLS + +#endif /* __G_STDIO_H__ */ diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c new file mode 100644 index 0000000..9d192a3 --- /dev/null +++ b/glib/gstrfuncs.c @@ -0,0 +1,2813 @@ +/* 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 +#include +#include +#include +#include /* For tolower() */ + +#ifdef HAVE_XLOCALE_H +/* Needed on BSD/OS X for e.g. strtod_l */ +#include +#endif + +#ifdef G_OS_WIN32 +#include +#endif + +/* do not include here, it may interfere with g_strsignal() */ + +#include "gstrfuncs.h" + +#include "gprintf.h" +#include "gprintfint.h" +#include "glibintl.h" + + +/** + * SECTION:string_utils + * @title: String Utility Functions + * @short_description: 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. + * + */ + +/** + * g_ascii_isalnum: + * @c: any character + * + * 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. + * + * Returns: %TRUE if @c is an ASCII alphanumeric character + */ + +/** + * g_ascii_isalpha: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII alphabetic character + */ + +/** + * g_ascii_iscntrl: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII control character. + */ + +/** + * g_ascii_isdigit: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII digit. + */ + +/** + * g_ascii_isgraph: + * @c: any character + * + * 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. + * + * Returns: %TRUE if @c is an ASCII printing character other than space. + */ + +/** + * g_ascii_islower: + * @c: any character + * + * 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. + * + * Returns: %TRUE if @c is an ASCII lower case letter + */ + +/** + * g_ascii_isprint: + * @c: any character + * + * 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. + * + * Returns: %TRUE if @c is an ASCII printing character. + */ + +/** + * g_ascii_ispunct: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII punctuation character. + */ + +/** + * g_ascii_isspace: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII white-space character + */ + +/** + * g_ascii_isupper: + * @c: any 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. + * + * Returns: %TRUE if @c is an ASCII upper case letter + */ + +/** + * g_ascii_isxdigit: + * @c: any character + * + * 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. + * + * Returns: %TRUE if @c is an ASCII hexadecimal-digit character. + */ + +/** + * G_ASCII_DTOSTR_BUF_SIZE: + * + * 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_strstrip: + * @string: a string to remove the leading and trailing whitespace from + * + * Removes leading and trailing whitespace from a string. + * See g_strchomp() and g_strchug(). + * + * Returns: @string + */ + +/** + * G_STR_DELIMITERS: + * + * The standard delimiters, used in g_strdelimit(). + */ + +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; + +#if defined (HAVE_NEWLOCALE) && \ + defined (HAVE_USELOCALE) && \ + defined (HAVE_STRTOD_L) && \ + defined (HAVE_STRTOULL_L) && \ + defined (HAVE_STRTOLL_L) +#define USE_XLOCALE 1 +#endif + +#ifdef USE_XLOCALE +static locale_t +get_C_locale (void) +{ + static gsize initialized = FALSE; + static locale_t C_locale = NULL; + + if (g_once_init_enter (&initialized)) + { + C_locale = newlocale (LC_ALL_MASK, "C", NULL); + g_once_init_leave (&initialized, TRUE); + } + + return C_locale; +} +#endif + +/** + * 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; +} + +/** + * g_memdup: + * @mem: the memory to copy. + * @byte_size: the number of bytes to copy. + * + * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it + * from @mem. If @mem is %NULL it returns %NULL. + * + * Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem + * is %NULL. + */ +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 + * @...: 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 + * @...: 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. + * + * Note that this function is usually not the right function to use to + * assemble a translated message from pieces, since proper translation + * often requires the pieces to be reordered. + * + * 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 seldom 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) +{ +#ifdef USE_XLOCALE + + g_return_val_if_fail (nptr != NULL, 0); + + errno = 0; + + return strtod_l (nptr, endptr, get_C_locale ()); + +#else + + 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; +#endif +} + + +/** + * 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) +{ +#ifdef USE_XLOCALE + locale_t old_locale; + + old_locale = uselocale (get_C_locale ()); + _g_snprintf (buffer, buf_len, format, d); + uselocale (old_locale); + + return buffer; +#else + 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; +#endif +} + +#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)) + +#ifndef USE_XLOCALE + +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. + */ + 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; +} +#endif /* !USE_XLOCALE */ + +/** + * 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) +{ +#ifdef USE_XLOCALE + return strtoull_l (nptr, endptr, base, get_C_locale ()); +#else + 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; +#endif +} + +/** + * 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) +{ +#ifdef USE_XLOCALE + return strtoll_l (nptr, endptr, base, get_C_locale ()); +#else + 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; +#endif +} + +/** + * 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>)". + */ +const gchar * +g_strerror (gint errnum) +{ + gchar buf[64]; + gchar *msg; + gchar *tofree; + const gchar *ret; + gint saved_errno = errno; + + msg = tofree = NULL; + +#ifdef HAVE_STRERROR + msg = strerror (errnum); + if (!g_get_charset (NULL)) + msg = tofree = g_locale_to_utf8 (msg, -1, NULL, NULL, NULL); +#endif + + if (!msg) + { + msg = buf; + _g_sprintf (msg, "unknown error (%d)", errnum); + } + + ret = g_intern_string (msg); + g_free (tofree); + errno = saved_errno; + return ret; +} + +/** + * 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>)". + */ +const gchar * +g_strsignal (gint signum) +{ + gchar *msg; + gchar *tofree; + const gchar *ret; + + msg = tofree = NULL; + +#ifdef HAVE_STRSIGNAL + msg = strsignal (signum); + if (!g_get_charset (NULL)) + msg = tofree = g_locale_to_utf8 (msg, -1, NULL, NULL, NULL); +#endif + + if (!msg) + msg = tofree = g_strdup_printf ("unknown signal (%d)", signum); + ret = g_intern_string (msg); + g_free (tofree); + + return ret; +} + +/* Functions g_strlcpy and g_strlcat were originally developed by + * Todd C. Miller to simplify writing secure code. + * See http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy + * 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 +} + +/** + * g_strdelimit: + * @string: the string to convert + * @delimiters: (allow-none): a string containing the current delimiters, or %NULL + * to use the standard delimiters defined in #G_STR_DELIMITERS + * @new_delimiter: the new delimiter character + * + * 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", '?')) + * ]| + * + * Returns: @string + */ +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; +} + +/** + * g_strcanon: + * @string: a nul-terminated array of bytes + * @valid_chars: bytes permitted in @string + * @substitutor: replacement character for disallowed bytes + * + * 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", '?')) + * ]| + * + * Returns: @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; +} + +/** + * g_strcompress: + * @source: a string to compress + * + * Replaces all escaped characters with their one byte equivalent. + * + * This function does the reverse conversion of g_strescape(). + * + * Returns: a newly-allocated copy of @source with all escaped + * character compressed + */ +gchar * +g_strcompress (const gchar *source) +{ + const gchar *p = source, *octal; + gchar *dest; + gchar *q; + + g_return_val_if_fail (source != NULL, NULL); + + dest = g_malloc (strlen (source) + 1); + 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; + case 'v': + *q++ = '\v'; + break; + default: /* Also handles \" and \\ */ + *q++ = *p; + break; + } + } + else + *q++ = *p; + p++; + } +out: + *q = 0; + + return dest; +} + +/** + * g_strescape: + * @source: a string to escape + * @exceptions: a string of characters not to escape in @source + * + * Escapes the special characters '\b', '\f', '\n', '\r', '\t', '\v', '\' + * 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. + * + * Returns: a newly-allocated copy of @source with certain + * characters escaped. See above. + */ +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 '\v': + *q++ = '\\'; + *q++ = 'v'; + 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; +} + +/** + * g_strchug: + * @string: a string to remove the leading whitespace from + * + * 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(). + * + * Returns: @string + */ +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; +} + +/** + * g_strchomp: + * @string: a string to remove the trailing whitespace from + * + * 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(). + * + * Returns: @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: a %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: (allow-none): 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: (allow-none): a string to insert between each of the strings, or %NULL + * @...: 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_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; +} diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h new file mode 100644 index 0000000..510623a --- /dev/null +++ b/glib/gstrfuncs.h @@ -0,0 +1,293 @@ +/* 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_STRFUNCS_H__ +#define __G_STRFUNCS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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) + +GLIB_AVAILABLE_IN_ALL +gchar g_ascii_tolower (gchar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gchar g_ascii_toupper (gchar c) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gint g_ascii_digit_value (gchar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +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 "_-|> <." +GLIB_AVAILABLE_IN_ALL +gchar* g_strdelimit (gchar *string, + const gchar *delimiters, + gchar new_delimiter); +GLIB_AVAILABLE_IN_ALL +gchar* g_strcanon (gchar *string, + const gchar *valid_chars, + gchar substitutor); +GLIB_AVAILABLE_IN_ALL +const gchar * g_strerror (gint errnum) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +const gchar * g_strsignal (gint signum) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gchar * g_strreverse (gchar *string); +GLIB_AVAILABLE_IN_ALL +gsize g_strlcpy (gchar *dest, + const gchar *src, + gsize dest_size); +GLIB_AVAILABLE_IN_ALL +gsize g_strlcat (gchar *dest, + const gchar *src, + gsize dest_size); +GLIB_AVAILABLE_IN_ALL +gchar * g_strstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle); +GLIB_AVAILABLE_IN_ALL +gchar * g_strrstr (const gchar *haystack, + const gchar *needle); +GLIB_AVAILABLE_IN_ALL +gchar * g_strrstr_len (const gchar *haystack, + gssize haystack_len, + const gchar *needle); + +GLIB_AVAILABLE_IN_ALL +gboolean g_str_has_suffix (const gchar *str, + const gchar *suffix); +GLIB_AVAILABLE_IN_ALL +gboolean g_str_has_prefix (const gchar *str, + const gchar *prefix); + +/* String to/from double conversion functions */ + +GLIB_AVAILABLE_IN_ALL +gdouble g_strtod (const gchar *nptr, + gchar **endptr); +GLIB_AVAILABLE_IN_ALL +gdouble g_ascii_strtod (const gchar *nptr, + gchar **endptr); +GLIB_AVAILABLE_IN_ALL +guint64 g_ascii_strtoull (const gchar *nptr, + gchar **endptr, + guint base); +GLIB_AVAILABLE_IN_ALL +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) +GLIB_AVAILABLE_IN_ALL +gchar * g_ascii_dtostr (gchar *buffer, + gint buf_len, + gdouble d); +GLIB_AVAILABLE_IN_ALL +gchar * g_ascii_formatd (gchar *buffer, + gint buf_len, + const gchar *format, + gdouble d); + +/* removes leading spaces */ +GLIB_AVAILABLE_IN_ALL +gchar* g_strchug (gchar *string); +/* removes trailing spaces */ +GLIB_AVAILABLE_IN_ALL +gchar* g_strchomp (gchar *string); +/* removes leading & trailing spaces */ +#define g_strstrip( string ) g_strchomp (g_strchug (string)) + +GLIB_AVAILABLE_IN_ALL +gint g_ascii_strcasecmp (const gchar *s1, + const gchar *s2); +GLIB_AVAILABLE_IN_ALL +gint g_ascii_strncasecmp (const gchar *s1, + const gchar *s2, + gsize n); +GLIB_AVAILABLE_IN_ALL +gchar* g_ascii_strdown (const gchar *str, + gssize len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_ascii_strup (const gchar *str, + gssize len) G_GNUC_MALLOC; + + +GLIB_DEPRECATED +gint g_strcasecmp (const gchar *s1, + const gchar *s2); +GLIB_DEPRECATED +gint g_strncasecmp (const gchar *s1, + const gchar *s2, + guint n); +GLIB_DEPRECATED +gchar* g_strdown (gchar *string); +GLIB_DEPRECATED +gchar* g_strup (gchar *string); + + +/* String utility functions that return a newly allocated string which + * ought to be freed with g_free from the caller at some point. + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_strdup (const gchar *str) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strdup_printf (const gchar *format, + ...) G_GNUC_PRINTF (1, 2) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strdup_vprintf (const gchar *format, + va_list args) G_GNUC_PRINTF(1, 0) + G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strndup (const gchar *str, + gsize n) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strnfill (gsize length, + gchar fill_char) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strconcat (const gchar *string1, + ...) G_GNUC_MALLOC G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +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. + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_strescape (const gchar *source, + const gchar *exceptions) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +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 + */ +GLIB_AVAILABLE_IN_ALL +gchar** g_strsplit (const gchar *string, + const gchar *delimiter, + gint max_tokens) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar ** g_strsplit_set (const gchar *string, + const gchar *delimiters, + gint max_tokens) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_strjoinv (const gchar *separator, + gchar **str_array) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +void g_strfreev (gchar **str_array); +GLIB_AVAILABLE_IN_ALL +gchar** g_strdupv (gchar **str_array) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +guint g_strv_length (gchar **str_array); + +GLIB_AVAILABLE_IN_ALL +gchar* g_stpcpy (gchar *dest, + const char *src); + +G_END_DECLS + +#endif /* __G_STRFUNCS_H__ */ diff --git a/glib/gstring.c b/glib/gstring.c new file mode 100644 index 0000000..9473f01 --- /dev/null +++ b/glib/gstring.c @@ -0,0 +1,1270 @@ +/* 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 "gstring.h" + +#include "gprintf.h" + + +/** + * SECTION:strings + * @title: Strings + * @short_description: text buffers which grow automatically + * as text is added + * + * A #GString is an object that handles the memory management of a C + * string for you. The emphasis of #GString is on text, typically + * UTF-8. Crucially, the "str" member of a #GString is guaranteed to + * have a trailing nul character, and it is therefore always safe to + * call functions such as strchr() or g_strdup() on it. + * + * However, a #GString can also hold arbitrary binary data, because it + * has a "len" member, which includes any possible embedded nul + * characters in the data. Conceptually then, #GString is like a + * #GByteArray with the addition of many convenience methods for text, + * and a guaranteed nul terminator. + */ + +/** + * GString: + * @str: points to the character data. It may move as text is added. + * The @str field is null-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. + * + * The GString struct contains the public fields of a GString. + */ + + +#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; + } +} + +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. If + * it's %FALSE, the caller gains ownership of the buffer and must + * free it after use with g_free(). + * + * 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_free_to_bytes: + * @string: (transfer full): a #GString + * + * Transfers ownership of the contents of @string to a newly allocated + * #GBytes. The #GString structure itself is deallocated, and it is + * therefore invalid to use @string after invoking this function. + * + * Note that while #GString ensures that its buffer always has a + * trailing nul character (not reflected in its "len"), the returned + * #GBytes does not include this extra nul; i.e. it has length exactly + * equal to the "len" member. + * + * Returns: A newly allocated #GBytes containing contents of @string; @string itself is freed + * Since: 2.34 + */ +GBytes* +g_string_free_to_bytes (GString *string) +{ + gsize len; + gchar *buf; + + g_return_val_if_fail (string != NULL, NULL); + + len = string->len; + + buf = g_string_free (string, FALSE); + + return g_bytes_new_take (buf, len); +} + +/** + * 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 + */ +guint +g_string_hash (const GString *str) +{ + const gchar *p = str->str; + gsize n = str->len; + guint h = 0; + + /* 31 bit hash function */ + 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 reallocate. + */ + 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 (len == 0 || val != NULL, string); + + if (len == 0) + return 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, or %NULL + * @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 gchar *unescaped, + const gchar *reserved_chars_allowed, + gboolean allow_utf8) +{ + unsigned char c; + const gchar *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 (len == 0 || 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 uppercase ASCII letters to lowercase ASCII letters. + * + * Return value: passed-in @string pointer, with all the + * uppercase characters converted to lowercase 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 lowercase ASCII letters to uppercase ASCII letters. + * + * Return value: passed-in @string pointer, with all the + * lowercase characters converted to uppercase 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 + * @...: 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 + * @...: 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 + * @...: 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 + * @...: 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); +} diff --git a/glib/gstring.h b/glib/gstring.h new file mode 100644 index 0000000..0cbba5d --- /dev/null +++ b/glib/gstring.h @@ -0,0 +1,191 @@ +/* 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_STRING_H__ +#define __G_STRING_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#include +#include /* for G_CAN_INLINE */ + +G_BEGIN_DECLS + +typedef struct _GString GString; + +struct _GString +{ + gchar *str; + gsize len; + gsize allocated_len; +}; + +GLIB_AVAILABLE_IN_ALL +GString* g_string_new (const gchar *init); +GLIB_AVAILABLE_IN_ALL +GString* g_string_new_len (const gchar *init, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_sized_new (gsize dfl_size); +GLIB_AVAILABLE_IN_ALL +gchar* g_string_free (GString *string, + gboolean free_segment); +GLIB_AVAILABLE_IN_2_34 +GBytes* g_string_free_to_bytes (GString *string); +GLIB_AVAILABLE_IN_ALL +gboolean g_string_equal (const GString *v, + const GString *v2); +GLIB_AVAILABLE_IN_ALL +guint g_string_hash (const GString *str); +GLIB_AVAILABLE_IN_ALL +GString* g_string_assign (GString *string, + const gchar *rval); +GLIB_AVAILABLE_IN_ALL +GString* g_string_truncate (GString *string, + gsize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_set_size (GString *string, + gsize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_insert_len (GString *string, + gssize pos, + const gchar *val, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_append (GString *string, + const gchar *val); +GLIB_AVAILABLE_IN_ALL +GString* g_string_append_len (GString *string, + const gchar *val, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_append_c (GString *string, + gchar c); +GLIB_AVAILABLE_IN_ALL +GString* g_string_append_unichar (GString *string, + gunichar wc); +GLIB_AVAILABLE_IN_ALL +GString* g_string_prepend (GString *string, + const gchar *val); +GLIB_AVAILABLE_IN_ALL +GString* g_string_prepend_c (GString *string, + gchar c); +GLIB_AVAILABLE_IN_ALL +GString* g_string_prepend_unichar (GString *string, + gunichar wc); +GLIB_AVAILABLE_IN_ALL +GString* g_string_prepend_len (GString *string, + const gchar *val, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_insert (GString *string, + gssize pos, + const gchar *val); +GLIB_AVAILABLE_IN_ALL +GString* g_string_insert_c (GString *string, + gssize pos, + gchar c); +GLIB_AVAILABLE_IN_ALL +GString* g_string_insert_unichar (GString *string, + gssize pos, + gunichar wc); +GLIB_AVAILABLE_IN_ALL +GString* g_string_overwrite (GString *string, + gsize pos, + const gchar *val); +GLIB_AVAILABLE_IN_ALL +GString* g_string_overwrite_len (GString *string, + gsize pos, + const gchar *val, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_erase (GString *string, + gssize pos, + gssize len); +GLIB_AVAILABLE_IN_ALL +GString* g_string_ascii_down (GString *string); +GLIB_AVAILABLE_IN_ALL +GString* g_string_ascii_up (GString *string); +GLIB_AVAILABLE_IN_ALL +void g_string_vprintf (GString *string, + const gchar *format, + va_list args) + G_GNUC_PRINTF(2, 0); +GLIB_AVAILABLE_IN_ALL +void g_string_printf (GString *string, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); +GLIB_AVAILABLE_IN_ALL +void g_string_append_vprintf (GString *string, + const gchar *format, + va_list args) + G_GNUC_PRINTF(2, 0); +GLIB_AVAILABLE_IN_ALL +void g_string_append_printf (GString *string, + const gchar *format, + ...) G_GNUC_PRINTF (2, 3); +GLIB_AVAILABLE_IN_ALL +GString* g_string_append_uri_escaped (GString *string, + const gchar *unescaped, + const gchar *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 */ + + +GLIB_DEPRECATED +GString *g_string_down (GString *string); +GLIB_DEPRECATED +GString *g_string_up (GString *string); + +#ifndef G_DISABLE_DEPRECATED +#define g_string_sprintf g_string_printf +#define g_string_sprintfa g_string_append_printf +#endif + +G_END_DECLS + +#endif /* __G_STRING_H__ */ diff --git a/glib/gstringchunk.c b/glib/gstringchunk.c new file mode 100644 index 0000000..1c40a48 --- /dev/null +++ b/glib/gstringchunk.c @@ -0,0 +1,327 @@ +/* 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 "gstringchunk.h" + +#include "ghash.h" +#include "gslist.h" +#include "gmessages.h" + +#include "gutils.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; +}; + +#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; + } +} + +/** + * 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; +} diff --git a/glib/gstringchunk.h b/glib/gstringchunk.h new file mode 100644 index 0000000..79848e1 --- /dev/null +++ b/glib/gstringchunk.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 + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_STRINGCHUNK_H__ +#define __G_STRINGCHUNK_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GStringChunk GStringChunk; + +GLIB_AVAILABLE_IN_ALL +GStringChunk* g_string_chunk_new (gsize size); +GLIB_AVAILABLE_IN_ALL +void g_string_chunk_free (GStringChunk *chunk); +GLIB_AVAILABLE_IN_ALL +void g_string_chunk_clear (GStringChunk *chunk); +GLIB_AVAILABLE_IN_ALL +gchar* g_string_chunk_insert (GStringChunk *chunk, + const gchar *string); +GLIB_AVAILABLE_IN_ALL +gchar* g_string_chunk_insert_len (GStringChunk *chunk, + const gchar *string, + gssize len); +GLIB_AVAILABLE_IN_ALL +gchar* g_string_chunk_insert_const (GStringChunk *chunk, + const gchar *string); + +G_END_DECLS + +#endif /* __G_STRING_H__ */ diff --git a/glib/gtester-report b/glib/gtester-report new file mode 100755 index 0000000..0fcdd9a --- /dev/null +++ b/glib/gtester-report @@ -0,0 +1,492 @@ +#! /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 datetime +import optparse +import sys, re, xml.dom.minidom + +try: + import subunit + from subunit import iso8601 + from testtools.content import Content, ContentType + mime_utf8 = ContentType('text', 'plain', {'charset': 'utf8'}) +except ImportError: + subunit = None + + +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 + self.info = {} + def binary_list (self): + lst = [] + for name in self.binary_names: + lst += [ self.binaries[name] ] + return lst + def get_info (self): + return self.info + def handle_info (self, node): + dn = find_child (node, 'package') + self.info['package'] = node_as_text (dn) + dn = find_child (node, 'version') + self.info['version'] = node_as_text (dn) + dn = find_child (node, 'revision') + if dn is not None: + self.info['revision'] = node_as_text (dn) + 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) + + +class ReportWriter(object): + """Base class for reporting.""" + + def __init__(self, binary_list): + self.binaries = binary_list + + def _error_text(self, node): + """Get a string representing the error children of node.""" + rlist = list_children(node, 'error') + txt = '' + for enode in rlist: + txt += node_as_text (enode) + if txt and txt[-1] != '\n': + txt += '\n' + return txt + + +class HTMLReportWriter(ReportWriter): + # Javascript/CSS snippet to toggle element visibility + cssjs = r''' + + + ''' + def __init__ (self, info, binary_list): + ReportWriter.__init__(self, binary_list) + self.info = info + 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_info (self): + self.oprint ('

Package: %(package)s, version: %(version)s

\n' % self.info) + if self.info['revision']: + self.oprint ('
Report generated from: %(revision)s
\n' % self.info) + 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': + txt = self._error_text(node) + 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 + if real_cases != 0: + 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') + else: + self.oprint ('Empty\n') + self.oprint ('\n') + 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') + if self.total_tcounter != 0: + perc = (self.total_tcounter - self.total_fcounter) * 100.0 / self.total_tcounter + else: + perc = 0.0 + 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.handle_info () + 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') + + +class SubunitWriter(ReportWriter): + """Reporter to output a subunit stream.""" + + def printout(self): + reporter = subunit.TestProtocolClient(sys.stdout) + for binary in self.binaries: + for tc in binary.testcases: + test = GTestCase(tc, binary) + test.run(reporter) + + +class GTestCase(object): + """A representation of a gtester test result as a pyunit TestCase.""" + + def __init__(self, case, binary): + """Create a GTestCase for case `case` from binary program `binary`.""" + self._case = case + self._binary = binary + # the name of the case - e.g. /dbusmenu/glib/objects/menuitem/props_boolstr + self._path = attribute_as_text(self._case, 'path') + + def id(self): + """What test is this? Returns the gtester path for the testcase.""" + return self._path + + def _get_details(self): + """Calculate a details dict for the test - attachments etc.""" + details = {} + result = attribute_as_text(self._case, 'result', 'status') + details['filename'] = Content(mime_utf8, lambda:[self._binary.file]) + details['random_seed'] = Content(mime_utf8, + lambda:[self._binary.random_seed]) + if self._get_outcome() == 'addFailure': + # Extract the error details. Skips have no details because its not + # skip like unittest does, instead the runner just bypasses N test. + txt = self._error_text(self._case) + details['error'] = Content(mime_utf8, lambda:[txt]) + if self._get_outcome() == 'addSuccess': + # Sucessful tests may have performance metrics. + perflist = list_children(self._case, 'performance') + if 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 = 'Performance(' + (pmin and 'minimized' or 'maximized' + ) + '): ' + txt.strip() + '\n' + presults += [(pval, txt)] + presults.sort() + perf_details = [e[1] for e in presults] + details['performance'] = Content(mime_utf8, lambda:perf_details) + return details + + def _get_outcome(self): + if int(attribute_as_text(self._case, 'skipped') + '0'): + return 'addSkip' + outcome = attribute_as_text(self._case, 'result', 'status') + if outcome == 'success': + return 'addSuccess' + else: + return 'addFailure' + + def run(self, result): + time = datetime.datetime.utcnow().replace(tzinfo=iso8601.Utc()) + result.time(time) + result.startTest(self) + try: + outcome = self._get_outcome() + details = self._get_details() + # Only provide a duration IFF outcome == 'addSuccess' - the main + # parser claims bogus results otherwise: in that case emit time as + # zero perhaps. + if outcome == 'addSuccess': + duration = float(node_as_text(self._case, 'duration')) + duration = duration * 1000000 + timedelta = datetime.timedelta(0, 0, duration) + time = time + timedelta + result.time(time) + getattr(result, outcome)(self, details=details) + finally: + result.stopTest(self) + + + +# main program handling +def parse_opts(): + """Parse program options. + + :return: An options object and the program arguments. + """ + parser = optparse.OptionParser() + parser.version = pkginstall_configvars.get ('glib-version', '0.0-uninstalled') + parser.usage = "%prog [OPTIONS] " + parser.description = "Generate HTML reports from the XML log files generated by gtester." + parser.epilog = "gtester-report (GLib utils) version %s."% (parser.version,) + parser.add_option("-v", "--version", action="store_true", dest="version", default=False, + help="Show program version.") + parser.add_option("-s", "--subunit", action="store_true", dest="subunit", default=False, + help="Output subunit [See https://launchpad.net/subunit/" + " Needs python-subunit]") + options, files = parser.parse_args() + if options.version: + print parser.epilog + return None, None + if len(files) != 1: + parser.error("Must supply a log file to parse.") + if options.subunit and subunit is None: + parser.error("python-subunit is not installed.") + return options, files + + +def main(): + options, files = parse_opts() + if options is None: + return 0 + xd = xml.dom.minidom.parse (files[0]) + rr = ReportReader() + rr.trampoline (xd) + if not options.subunit: + HTMLReportWriter(rr.get_info(), rr.binary_list()).printout() + else: + SubunitWriter(rr.get_info(), rr.binary_list()).printout() + + +if __name__ == '__main__': + main() diff --git a/glib/gtester.c b/glib/gtester.c new file mode 100644 index 0000000..0a2feb2 --- /dev/null +++ b/glib/gtester.c @@ -0,0 +1,734 @@ +/* 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 "config.h" + +#include +#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 gboolean subtest_mode_undefined = TRUE; +static const gchar *subtest_seedstr = NULL; +static gchar *subtest_last_seed = NULL; +static GSList *subtest_paths = NULL; +static GSList *skipped_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 && exit_status) + 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 (!g_unix_open_pipe (report_pipe, FD_CLOEXEC, &error)) + { + if (subtest_mode_fatal) + g_error ("Failed to open pipe for test binary: %s: %s", binary, error->message); + else + g_warning ("Failed to open pipe for test binary: %s: %s", binary, error->message); + g_clear_error (&error); + 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 (!subtest_mode_undefined) + argc++; + if (gtester_list_tests) + argc++; + if (subtest_seedstr) + argc++; + argc++; + if (skip_tests) + argc++; + for (slist = subtest_paths; slist; slist = slist->next) + argc++; + for (slist = skipped_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 (!subtest_mode_undefined) + argv[i++] = "-m=no-undefined"; + 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)); + for (slist = skipped_paths; slist; slist = slist->next) + argv[i++] = queue_gfree (&free_list, g_strdup_printf ("-s=%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; + 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; + } + + /* count the inability to run a test as a failure */ + if (!success && testcase_count == 0) + testcase_fail_count++; + + if (!gtester_quiet) + g_print ("%s: %s\n", !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:\n"); + g_print ("gtester [OPTIONS] testprogram...\n\n"); + /* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */ + g_print ("Help Options:\n"); + g_print (" -h, --help Show this help message\n\n"); + g_print ("Utility Options:\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|slow|thorough|quick} Run test cases according to mode\n"); + g_print (" -m {undefined|no-undefined} Run test cases according to mode\n"); + g_print (" -p=TESTPATH Only start test cases matching TESTPATH\n"); + g_print (" -s=TESTPATH Skip test cases matching TESTPATH\n"); + g_print (" --seed=SEEDSTRING Start tests with random 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 ("-s", argv[i]) == 0 || strncmp ("-s=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + if (*equal == '=') + skipped_paths = g_slist_prepend (skipped_paths, equal + 1); + else if (i + 1 < argc) + { + argv[i++] = NULL; + skipped_paths = g_slist_prepend (skipped_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 if (strcmp (mode, "undefined") == 0) + subtest_mode_undefined = TRUE; + else if (strcmp (mode, "no-undefined") == 0) + subtest_mode_undefined = 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; + + 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 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +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 invocations */ + 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..4089758 --- /dev/null +++ b/glib/gtestutils.c @@ -0,0 +1,2625 @@ +/* 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 "gfileutils.h" + +#include +#ifdef G_OS_UNIX +#include +#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 */ + +#include "gmain.h" +#include "gpattern.h" +#include "grand.h" +#include "gstrfuncs.h" +#include "gtimer.h" +#include "gslice.h" + + +/** + * SECTION:testing + * @title: Testing + * @short_description: a test framework + * @see_also: gtester, + * gtester-report + * + * 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. + */ + +/** + * g_test_initialized: + * + * Returns %TRUE if g_test_init() has been called. + * + * Returns: %TRUE if g_test_init() has been called. + * + * Since: 2.36 + */ + +/** + * g_test_quick: + * + * Returns %TRUE if tests are run in quick mode. + * Exactly one of g_test_quick() and g_test_slow() is active in any run; + * there is no "medium speed". + * + * Returns: %TRUE if in quick mode + */ + +/** + * g_test_slow: + * + * Returns %TRUE if tests are run in slow mode. + * Exactly one of g_test_quick() and g_test_slow() is active in any run; + * there is no "medium speed". + * + * Returns: the opposite of g_test_quick() + */ + +/** + * g_test_thorough: + * + * Returns %TRUE if tests are run in thorough mode, equivalent to + * g_test_slow(). + * + * Returns: the same thing as g_test_slow() + */ + +/** + * g_test_perf: + * + * Returns %TRUE if tests are run in performance mode. + * + * Returns: %TRUE if in performance mode + */ + +/** + * g_test_undefined: + * + * Returns %TRUE if tests may provoke assertions and other formally-undefined + * behaviour under g_test_trap_fork(), to verify that appropriate warnings + * are given. It can be useful to turn this off if running tests under + * valgrind. + * + * Returns: %TRUE if tests may provoke programming errors + */ + +/** + * g_test_verbose: + * + * Returns %TRUE if tests are run in verbose mode. + * The default is neither g_test_verbose() nor g_test_quiet(). + * + * Returns: %TRUE if in verbose mode + */ + +/** + * g_test_quiet: + * + * Returns %TRUE if tests are run in quiet mode. + * The default is neither g_test_verbose() nor g_test_quiet(). + * + * Returns: %TRUE if in quiet mode + */ + +/** + * g_test_queue_unref: + * @gobject: the object to unref + * + * 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(). + * + * Since: 2.16 + */ + +/** + * GTestTrapFlags: + * @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. + * + * Test traps are guards around forked tests. + * These flags determine what traps to set. + */ + +/** + * 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: + * + * Assert that the last forked test failed. + * See g_test_trap_fork(). + * + * This is sometimes used to test situations that are formally considered to + * be undefined behaviour, like inputs that fail a g_return_if_fail() + * check. In these situations you should skip the entire test, including the + * call to g_test_trap_fork(), unless g_test_undefined() returns %TRUE + * to indicate that undefined behaviour may be tested. + * + * Since: 2.16 + */ + +/** + * g_test_trap_assert_stdout: + * @soutpattern: a glob-style + * pattern + * + * Assert that the stdout output of the last forked test matches + * @soutpattern. See g_test_trap_fork(). + * + * Since: 2.16 + */ + +/** + * g_test_trap_assert_stdout_unmatched: + * @soutpattern: a glob-style + * pattern + * + * Assert that the stdout output of the last forked test + * does not match @soutpattern. See g_test_trap_fork(). + * + * Since: 2.16 + */ + +/** + * g_test_trap_assert_stderr: + * @serrpattern: a glob-style + * pattern + * + * Assert that the stderr output of the last forked test + * matches @serrpattern. See g_test_trap_fork(). + * + * This is sometimes used to test situations that are formally considered to + * be undefined behaviour, like inputs that fail a g_return_if_fail() + * check. In these situations you should skip the entire test, including the + * call to g_test_trap_fork(), unless g_test_undefined() returns %TRUE + * to indicate that undefined behaviour may be tested. + * + * Since: 2.16 + */ + +/** + * g_test_trap_assert_stderr_unmatched: + * @serrpattern: a glob-style + * pattern + * + * Assert that the stderr output of the last forked test + * does not match @serrpattern. See g_test_trap_fork(). + * + * Since: 2.16 + */ + +/** + * 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_assert: + * @expr: the expression to check + * + * 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. + */ + +/** + * 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: + * @s1: a string (may be %NULL) + * @cmp: The comparison operator to use. + * One of ==, !=, <, >, <=, >=. + * @s2: another string (may be %NULL) + * + * 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"); + * ]| + * + * Since: 2.16 + */ + +/** + * g_assert_cmpint: + * @n1: an integer + * @cmp: The comparison operator to use. + * One of ==, !=, <, >, <=, >=. + * @n2: another integer + * + * 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. + * + * Since: 2.16 + */ + +/** + * g_assert_cmpuint: + * @n1: an unsigned integer + * @cmp: The comparison operator to use. + * One of ==, !=, <, >, <=, >=. + * @n2: another unsigned integer + * + * 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. + * + * Since: 2.16 + */ + +/** + * g_assert_cmphex: + * @n1: an unsigned integer + * @cmp: The comparison operator to use. + * One of ==, !=, <, >, <=, >=. + * @n2: another unsigned integer + * + * 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. + * + * Since: 2.16 + */ + +/** + * g_assert_cmpfloat: + * @n1: an floating point number + * @cmp: The comparison operator to use. + * One of ==, !=, <, >, <=, >=. + * @n2: another floating point number + * + * 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 macro is that it can produce a message that includes the + * actual values of @n1 and @n2. + * + * Since: 2.16 + */ + +/** + * g_assert_no_error: + * @err: a #GError, possibly %NULL + * + * 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. + * + * Since: 2.20 + */ + +/** + * g_assert_error: + * @err: a #GError, possibly %NULL + * @dom: the expected error domain (a #GQuark) + * @c: the expected error code + * + * 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) + * + * Since: 2.20 + */ + +/** + * GTestCase: + * + * An opaque structure representing a test case. + */ + +/** + * GTestSuite: + * + * An opaque structure representing a test suite. + */ + + +/* 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_run_success = FALSE; +static guint test_skip_count = 0; +static GTimer *test_user_timer = NULL; +static double test_user_stamp = 0; +static GSList *test_paths = NULL; +static GSList *test_paths_skipped = 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 */ + TRUE, /* test_undefined */ +}; +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++) + { + if ((long double) (long) msg->nums[ui] == msg->nums[ui]) + g_printerr ("%s%ld", ui ? ";" : "", (long) msg->nums[ui]); + else + g_printerr ("%s%.16g", ui ? ";" : "", (double) 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: + case G_TEST_LOG_ERROR: + 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 ("-s", argv[i]) == 0 || strncmp ("-s=", argv[i], 3) == 0) + { + gchar *equal = argv[i] + 2; + if (*equal == '=') + test_paths_skipped = g_slist_prepend (test_paths_skipped, equal + 1); + else if (i + 1 < argc) + { + argv[i++] = NULL; + test_paths_skipped = g_slist_prepend (test_paths_skipped, 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 if (strcmp (mode, "undefined") == 0) + mutable_test_config_vars.test_undefined = TRUE; + else if (strcmp (mode, "no-undefined") == 0) + mutable_test_config_vars.test_undefined = 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 ("-h", argv[i]) == 0 || + strcmp ("--help", argv[i]) == 0) + { + printf ("Usage:\n" + " %s [OPTION...]\n\n" + "Help Options:\n" + " -h, --help Show help options\n\n" + "Test Options:\n" + " --g-fatal-warnings Make all warnings fatal\n" + " -l List test cases available in a test executable\n" + " -m {perf|slow|thorough|quick} Execute tests according to mode\n" + " -m {undefined|no-undefined} Execute tests according to mode\n" + " -p TESTPATH Only start test cases matching TESTPATH\n" + " -s TESTPATH Skip all tests matching TESTPATH\n" + " -seed=SEEDSTRING Start tests with random seed SEEDSTRING\n" + " --debug-log debug test logging output\n" + " -q, --quiet Run tests quietly\n" + " --verbose Run tests verbosely\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. + * @...: 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. + * + * + * + * undefined + * + * Tests for undefined behaviour, may provoke programming errors + * under g_test_trap_fork() to check that appropriate assertions + * or warnings are given + * + * + * + * no-undefined + * + * Avoid tests for undefined behaviour + * + * + * + * + * + * + * + * Debug test logging output. + * + * + * + * 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 + * @...: 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 + * @...: 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, + GTestFixtureFunc data_setup, + GTestFixtureFunc data_test, + GTestFixtureFunc data_teardown) +{ + 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; +} + +static gint +find_suite (gconstpointer l, gconstpointer s) +{ + const GTestSuite *suite = l; + const gchar *str = s; + + return strcmp (suite->name, str); +} + +/** + * GTestFixtureFunc: + * @fixture: the test fixture + * @user_data: the data provided when registering the test + * + * The type used for functions that operate on test fixtures. This is + * used for the fixture setup and teardown functions as well as for the + * testcases themselves. + * + * @user_data is a pointer to the data that was given when registering + * the test case. + * + * @fixture will be a pointer to the area of memory allocated by the + * test framework, of the size requested. If the requested size was + * zero then @fixture will be equal to @user_data. + * + * Since: 2.28 + */ +void +g_test_add_vtable (const char *testpath, + gsize data_size, + gconstpointer test_data, + GTestFixtureFunc data_setup, + GTestFixtureFunc fixture_test_func, + GTestFixtureFunc data_teardown) +{ + gchar **segments; + guint ui; + GTestSuite *suite; + + g_return_if_fail (testpath != NULL); + g_return_if_fail (g_path_is_absolute (testpath)); + g_return_if_fail (fixture_test_func != NULL); + + if (g_slist_find_custom (test_paths_skipped, testpath, (GCompareFunc)g_strcmp0)) + return; + + 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) + { + GSList *l; + GTestSuite *csuite; + l = g_slist_find_custom (suite->suites, seg, find_suite); + if (l) + { + csuite = l->data; + } + else + { + 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_fail: + * + * Indicates that a test failed. This function can be called + * multiple times from the same test. You can use this function + * if your test failed in a recoverable way. + * + * Do not use this function if the failure of a test could cause + * other tests to malfunction. + * + * Calling this function will not stop the test from running, you + * need to return from the test function yourself. So you can + * produce additional diagnostic messages or even continue running + * the test. + * + * If not called from inside a test, this function does nothing. + * + * Since: 2.30 + **/ +void +g_test_fail (void) +{ + test_run_success = FALSE; +} + +/** + * GTestFunc: + * + * The type used for test case functions. + * + * Since: 2.28 + */ + +/** + * g_test_add_func: + * @testpath: /-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, + GTestFunc test_func) +{ + 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, (GTestFixtureFunc) test_func, NULL); +} + +/** + * GTestDataFunc: + * @user_data: the data provided when registering the test + * + * The type used for test case functions that take an extra pointer + * argument. + * + * Since: 2.28 + */ + +/** + * g_test_add_data_func: + * @testpath: /-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, + GTestDataFunc test_func) +{ + 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, (GTestFixtureFunc) test_func, NULL); +} + +/** + * g_test_add_data_func_full: + * @testpath: /-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. + * @data_free_func: #GDestroyNotify for @test_data. + * + * Create a new test case, as with g_test_add_data_func(), but freeing + * @test_data after the test run is complete. + * + * Since: 2.34 + */ +void +g_test_add_data_func_full (const char *testpath, + gpointer test_data, + GTestDataFunc test_func, + GDestroyNotify data_free_func) +{ + 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, + (GTestFixtureFunc) test_func, + (GTestFixtureFunc) data_free_func); +} + +/** + * 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 gboolean +test_case_run (GTestCase *tc) +{ + gchar *old_name = test_run_name, *old_base = g_strdup (test_uri_base); + gboolean success = TRUE; + + 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; + test_run_success = TRUE; + 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); + success = test_run_success; + test_run_success = FALSE; + largs[0] = success ? 0 : 1; /* 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 success; +} + +static int +g_test_run_suite_internal (GTestSuite *suite, + const char *path) +{ + guint n_bad = 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) + { + if (!test_case_run (tc)) + n_bad++; + } + } + 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) + n_bad += g_test_run_suite_internal (ts, rest ? rest : ""); + } + g_slist_free (reversed); + g_free (test_run_name); + test_run_name = old_name; + + return n_bad; +} + +/** + * 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 += 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 += 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]; + gboolean fatal = FALSE; + gchar *msg; + guint i = 0; + + if (log_domain) + { + strv[i++] = log_domain; + strv[i++] = "-"; + } + if (log_level & G_LOG_FLAG_FATAL) + { + strv[i++] = "FATAL-"; + fatal = TRUE; + } + 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 (fatal ? G_TEST_LOG_ERROR : G_TEST_LOG_MESSAGE, 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): (%" G_GINT64_MODIFIER "i %s %" G_GINT64_MODIFIER "i)", expr, (gint64) arg1, cmp, (gint64) 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): (%.9g %s %.9g)", expr, (double) arg1, cmp, (double) 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, + const 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: (allow-none): a C string or %NULL + * @str2: (allow-none): another C string or %NULL + * + * Compares @str1 and @str2 like strcmp(). Handles %NULL + * gracefully by sorting it before non-%NULL strings. + * Comparing two %NULL pointers returns 0. + * + * Returns: an integer less than, equal to, or greater than zero, 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 = g_open ("/dev/null", O_RDONLY, 0); + 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; + } + } + } + if (stdout_pipe[0] != -1) + close (stdout_pipe[0]); + if (stderr_pipe[0] != -1) + close (stderr_pipe[0]); + if (stdtst_pipe[0] != -1) + 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 --- */ diff --git a/glib/gtestutils.h b/glib/gtestutils.h new file mode 100644 index 0000000..c64433d --- /dev/null +++ b/glib/gtestutils.h @@ -0,0 +1,364 @@ +/* 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. + */ + +#ifndef __G_TEST_UTILS_H__ +#define __G_TEST_UTILS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct GTestCase GTestCase; +typedef struct GTestSuite GTestSuite; +typedef void (*GTestFunc) (void); +typedef void (*GTestDataFunc) (gconstpointer user_data); +typedef void (*GTestFixtureFunc) (gpointer fixture, + gconstpointer user_data); + +/* 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 */ + +GLIB_AVAILABLE_IN_ALL +int g_strcmp0 (const char *str1, + const char *str2); + +/* report performance results */ +GLIB_AVAILABLE_IN_ALL +void g_test_minimized_result (double minimized_quantity, + const char *format, + ...) G_GNUC_PRINTF (2, 3); +GLIB_AVAILABLE_IN_ALL +void g_test_maximized_result (double maximized_quantity, + const char *format, + ...) G_GNUC_PRINTF (2, 3); + +/* initialize testing framework */ +GLIB_AVAILABLE_IN_ALL +void g_test_init (int *argc, + char ***argv, + ...); +/* query testing framework config */ +#define g_test_initialized() (g_test_config_vars->test_initialized) +#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) +#define g_test_undefined() (g_test_config_vars->test_undefined) +/* run all tests under toplevel suite (path: /) */ +GLIB_AVAILABLE_IN_ALL +int g_test_run (void); +/* hook up a test functions under test path */ +GLIB_AVAILABLE_IN_ALL +void g_test_add_func (const char *testpath, + GTestFunc test_func); + +GLIB_AVAILABLE_IN_ALL +void g_test_add_data_func (const char *testpath, + gconstpointer test_data, + GTestDataFunc test_func); + +GLIB_AVAILABLE_IN_2_34 +void g_test_add_data_func_full (const char *testpath, + gpointer test_data, + GTestDataFunc test_func, + GDestroyNotify data_free_func); + +/* tell about failure */ +GLIB_AVAILABLE_IN_2_30 +void g_test_fail (void); + +/* 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 */ +GLIB_AVAILABLE_IN_ALL +void g_test_message (const char *format, + ...) G_GNUC_PRINTF (1, 2); +GLIB_AVAILABLE_IN_ALL +void g_test_bug_base (const char *uri_pattern); +GLIB_AVAILABLE_IN_ALL +void g_test_bug (const char *bug_uri_snippet); +/* measure test timings */ +GLIB_AVAILABLE_IN_ALL +void g_test_timer_start (void); +GLIB_AVAILABLE_IN_ALL +double g_test_timer_elapsed (void); /* elapsed seconds */ +GLIB_AVAILABLE_IN_ALL +double g_test_timer_last (void); /* repeat last elapsed() result */ + +/* automatically g_free or g_object_unref upon teardown */ +GLIB_AVAILABLE_IN_ALL +void g_test_queue_free (gpointer gfree_pointer); +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +gboolean g_test_trap_fork (guint64 usec_timeout, + GTestTrapFlags test_trap_flags); +GLIB_AVAILABLE_IN_ALL +gboolean g_test_trap_has_passed (void); +GLIB_AVAILABLE_IN_ALL +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))) +GLIB_AVAILABLE_IN_ALL +gint32 g_test_rand_int (void); +GLIB_AVAILABLE_IN_ALL +gint32 g_test_rand_int_range (gint32 begin, + gint32 end); +GLIB_AVAILABLE_IN_ALL +double g_test_rand_double (void); +GLIB_AVAILABLE_IN_ALL +double g_test_rand_double_range (double range_start, + double range_end); + +/* semi-internal API */ +GLIB_AVAILABLE_IN_ALL +GTestCase* g_test_create_case (const char *test_name, + gsize data_size, + gconstpointer test_data, + GTestFixtureFunc data_setup, + GTestFixtureFunc data_test, + GTestFixtureFunc data_teardown); +GLIB_AVAILABLE_IN_ALL +GTestSuite* g_test_create_suite (const char *suite_name); +GLIB_AVAILABLE_IN_ALL +GTestSuite* g_test_get_root (void); +GLIB_AVAILABLE_IN_ALL +void g_test_suite_add (GTestSuite *suite, + GTestCase *test_case); +GLIB_AVAILABLE_IN_ALL +void g_test_suite_add_suite (GTestSuite *suite, + GTestSuite *nestedsuite); +GLIB_AVAILABLE_IN_ALL +int g_test_run_suite (GTestSuite *suite); + +/* internal ABI */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_assertion_message (const char *domain, + const char *file, + int line, + const char *func, + const char *message) G_GNUC_NORETURN; +GLIB_AVAILABLE_IN_ALL +void g_assertion_message_expr (const char *domain, + const char *file, + int line, + const char *func, + const char *expr) G_GNUC_NORETURN; +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +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; +GLIB_AVAILABLE_IN_ALL +void g_assertion_message_error (const char *domain, + const char *file, + int line, + const char *func, + const char *expr, + const GError *error, + GQuark error_domain, + int error_code) G_GNUC_NORETURN; +GLIB_AVAILABLE_IN_ALL +void g_test_add_vtable (const char *testpath, + gsize data_size, + gconstpointer test_data, + GTestFixtureFunc data_setup, + GTestFixtureFunc data_test, + GTestFixtureFunc data_teardown); +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 */ + gboolean test_undefined; /* run tests that are meant to assert */ +} 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; + +GLIB_AVAILABLE_IN_ALL +const char* g_test_log_type_name (GTestLogType log_type); +GLIB_AVAILABLE_IN_ALL +GTestLogBuffer* g_test_log_buffer_new (void); +GLIB_AVAILABLE_IN_ALL +void g_test_log_buffer_free (GTestLogBuffer *tbuffer); +GLIB_AVAILABLE_IN_ALL +void g_test_log_buffer_push (GTestLogBuffer *tbuffer, + guint n_bytes, + const guint8 *bytes); +GLIB_AVAILABLE_IN_ALL +GTestLogMsg* g_test_log_buffer_pop (GTestLogBuffer *tbuffer); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void +g_test_log_set_fatal_handler (GTestLogFatalFunc log_func, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +void g_test_expect_message (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *pattern); +GLIB_AVAILABLE_IN_ALL +void g_test_assert_expected_messages_internal (const char *domain, + const char *file, + int line, + const char *func); + +#define g_test_assert_expected_messages() g_test_assert_expected_messages_internal (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC) + +G_END_DECLS + +#endif /* __G_TEST_UTILS_H__ */ diff --git a/glib/gthread-posix.c b/glib/gthread-posix.c new file mode 100644 index 0000000..e65e437 --- /dev/null +++ b/glib/gthread-posix.c @@ -0,0 +1,1186 @@ +/* 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/. + */ + +/* The GMutex, GCond and GPrivate implementations in this file are some + * of the lowest-level code in GLib. All other parts of GLib (messages, + * memory, slices, etc) assume that they can freely use these facilities + * without risking recursion. + * + * As such, these functions are NOT permitted to call any other part of + * GLib. + * + * The thread manipulation functions (create, exit, join, etc.) have + * more freedom -- they can do as they please. + */ + +#include "config.h" + +#include "gthread.h" + +#include "gthreadprivate.h" +#include "gslice.h" +#include "gmessages.h" +#include "gstrfuncs.h" + +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif +#ifdef HAVE_SCHED_H +#include +#endif +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +static void +g_thread_abort (gint status, + const gchar *function) +{ + fprintf (stderr, "GLib (gthread-posix.c): Unexpected error from C library during '%s': %s. Aborting.\n", + function, strerror (status)); + abort (); +} + +/* {{{1 GMutex */ + +static pthread_mutex_t * +g_mutex_impl_new (void) +{ + pthread_mutexattr_t *pattr = NULL; + pthread_mutex_t *mutex; + gint status; + + mutex = malloc (sizeof (pthread_mutex_t)); + if G_UNLIKELY (mutex == NULL) + g_thread_abort (errno, "malloc"); + +#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP + { + pthread_mutexattr_t attr; + pthread_mutexattr_init (&attr); + pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ADAPTIVE_NP); + pattr = &attr; + } +#endif + + if G_UNLIKELY ((status = pthread_mutex_init (mutex, pattr)) != 0) + g_thread_abort (status, "pthread_mutex_init"); + +#ifdef PTHREAD_ADAPTIVE_MUTEX_NP + pthread_mutexattr_destroy (&attr); +#endif + + return mutex; +} + +static void +g_mutex_impl_free (pthread_mutex_t *mutex) +{ + pthread_mutex_destroy (mutex); + free (mutex); +} + +static pthread_mutex_t * +g_mutex_get_impl (GMutex *mutex) +{ + pthread_mutex_t *impl = g_atomic_pointer_get (&mutex->p); + + if G_UNLIKELY (impl == NULL) + { + impl = g_mutex_impl_new (); + if (!g_atomic_pointer_compare_and_exchange (&mutex->p, NULL, impl)) + g_mutex_impl_free (impl); + impl = mutex->p; + } + + return impl; +} + + +/** + * g_mutex_init: + * @mutex: an uninitialized #GMutex + * + * Initializes a #GMutex so that it can be used. + * + * This function is useful to initialize a mutex that has been + * allocated on the stack, or as part of a larger structure. + * It is not necessary to initialize a mutex that has been + * statically allocated. + * + * |[ + * typedef struct { + * GMutex m; + * ... + * } Blob; + * + * Blob *b; + * + * b = g_new (Blob, 1); + * g_mutex_init (&b->m); + * ]| + * + * To undo the effect of g_mutex_init() when a mutex is no longer + * needed, use g_mutex_clear(). + * + * Calling g_mutex_init() on an already initialized #GMutex leads + * to undefined behaviour. + * + * Since: 2.32 + */ +void +g_mutex_init (GMutex *mutex) +{ + mutex->p = g_mutex_impl_new (); +} + +/** + * g_mutex_clear: + * @mutex: an initialized #GMutex + * + * Frees the resources allocated to a mutex with g_mutex_init(). + * + * This function should not be used with a #GMutex that has been + * statically allocated. + * + * Calling g_mutex_clear() on a locked mutex leads to undefined + * behaviour. + * + * Sine: 2.32 + */ +void +g_mutex_clear (GMutex *mutex) +{ + g_mutex_impl_free (mutex->p); +} + +/** + * 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. + * + * #GMutex is neither guaranteed to be recursive nor to be + * non-recursive. As such, calling g_mutex_lock() on a #GMutex that has + * already been locked by the same thread results in undefined behaviour + * (including but not limited to deadlocks). + */ +void +g_mutex_lock (GMutex *mutex) +{ + gint status; + + if G_UNLIKELY ((status = pthread_mutex_lock (g_mutex_get_impl (mutex))) != 0) + g_thread_abort (status, "pthread_mutex_lock"); +} + +/** + * g_mutex_unlock: + * @mutex: a #GMutex + * + * Unlocks @mutex. If another thread is blocked in a g_mutex_lock() + * call for @mutex, it will become unblocked and can lock @mutex itself. + * + * Calling g_mutex_unlock() on a mutex that is not locked by the + * current thread leads to undefined behaviour. + */ +void +g_mutex_unlock (GMutex *mutex) +{ + gint status; + + if G_UNLIKELY ((status = pthread_mutex_unlock (g_mutex_get_impl (mutex))) != 0) + g_thread_abort (status, "pthread_mutex_unlock"); +} + +/** + * g_mutex_trylock: + * @mutex: a #GMutex + * + * Tries to lock @mutex. If @mutex is already locked by another thread, + * it immediately returns %FALSE. Otherwise it locks @mutex and returns + * %TRUE. + * + * #GMutex is neither guaranteed to be recursive nor to be + * non-recursive. As such, calling g_mutex_lock() on a #GMutex that has + * already been locked by the same thread results in undefined behaviour + * (including but not limited to deadlocks or arbitrary return values). + * + + * Returns: %TRUE if @mutex could be locked + */ +gboolean +g_mutex_trylock (GMutex *mutex) +{ + gint status; + + if G_LIKELY ((status = pthread_mutex_trylock (g_mutex_get_impl (mutex))) == 0) + return TRUE; + + if G_UNLIKELY (status != EBUSY) + g_thread_abort (status, "pthread_mutex_trylock"); + + return FALSE; +} + +/* {{{1 GRecMutex */ + +static pthread_mutex_t * +g_rec_mutex_impl_new (void) +{ + pthread_mutexattr_t attr; + pthread_mutex_t *mutex; + + mutex = g_slice_new (pthread_mutex_t); + pthread_mutexattr_init (&attr); + pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init (mutex, &attr); + pthread_mutexattr_destroy (&attr); + + return mutex; +} + +static void +g_rec_mutex_impl_free (pthread_mutex_t *mutex) +{ + pthread_mutex_destroy (mutex); + g_slice_free (pthread_mutex_t, mutex); +} + +static pthread_mutex_t * +g_rec_mutex_get_impl (GRecMutex *rec_mutex) +{ + pthread_mutex_t *impl = g_atomic_pointer_get (&rec_mutex->p); + + if G_UNLIKELY (impl == NULL) + { + impl = g_rec_mutex_impl_new (); + if (!g_atomic_pointer_compare_and_exchange (&rec_mutex->p, NULL, impl)) + g_rec_mutex_impl_free (impl); + impl = rec_mutex->p; + } + + return impl; +} + +/** + * g_rec_mutex_init: + * @rec_mutex: an uninitialized #GRecMutex + * + * Initializes a #GRecMutex so that it can be used. + * + * This function is useful to initialize a recursive mutex + * that has been allocated on the stack, or as part of a larger + * structure. + * + * It is not necessary to initialise a recursive mutex that has been + * statically allocated. + * + * |[ + * typedef struct { + * GRecMutex m; + * ... + * } Blob; + * + * Blob *b; + * + * b = g_new (Blob, 1); + * g_rec_mutex_init (&b->m); + * ]| + * + * Calling g_rec_mutex_init() on an already initialized #GRecMutex + * leads to undefined behaviour. + * + * To undo the effect of g_rec_mutex_init() when a recursive mutex + * is no longer needed, use g_rec_mutex_clear(). + * + * Since: 2.32 + */ +void +g_rec_mutex_init (GRecMutex *rec_mutex) +{ + rec_mutex->p = g_rec_mutex_impl_new (); +} + +/** + * g_rec_mutex_clear: + * @rec_mutex: an initialized #GRecMutex + * + * Frees the resources allocated to a recursive mutex with + * g_rec_mutex_init(). + * + * This function should not be used with a #GRecMutex that has been + * statically allocated. + * + * Calling g_rec_mutex_clear() on a locked recursive mutex leads + * to undefined behaviour. + * + * Sine: 2.32 + */ +void +g_rec_mutex_clear (GRecMutex *rec_mutex) +{ + g_rec_mutex_impl_free (rec_mutex->p); +} + +/** + * g_rec_mutex_lock: + * @rec_mutex: a #GRecMutex + * + * Locks @rec_mutex. If @rec_mutex is already locked by another + * thread, the current thread will block until @rec_mutex is + * unlocked by the other thread. If @rec_mutex is already locked + * by the current thread, the 'lock count' of @rec_mutex is increased. + * The mutex will only become available again when it is unlocked + * as many times as it has been locked. + * + * Since: 2.32 + */ +void +g_rec_mutex_lock (GRecMutex *mutex) +{ + pthread_mutex_lock (g_rec_mutex_get_impl (mutex)); +} + +/** + * g_rec_mutex_unlock: + * @rec_mutex: a #GRecMutex + * + * Unlocks @rec_mutex. If another thread is blocked in a + * g_rec_mutex_lock() call for @rec_mutex, it will become unblocked + * and can lock @rec_mutex itself. + * + * Calling g_rec_mutex_unlock() on a recursive mutex that is not + * locked by the current thread leads to undefined behaviour. + * + * Since: 2.32 + */ +void +g_rec_mutex_unlock (GRecMutex *rec_mutex) +{ + pthread_mutex_unlock (rec_mutex->p); +} + +/** + * g_rec_mutex_trylock: + * @rec_mutex: a #GRecMutex + * + * Tries to lock @rec_mutex. If @rec_mutex is already locked + * by another thread, it immediately returns %FALSE. Otherwise + * it locks @rec_mutex and returns %TRUE. + * + * Returns: %TRUE if @rec_mutex could be locked + * + * Since: 2.32 + */ +gboolean +g_rec_mutex_trylock (GRecMutex *rec_mutex) +{ + if (pthread_mutex_trylock (g_rec_mutex_get_impl (rec_mutex)) != 0) + return FALSE; + + return TRUE; +} + +/* {{{1 GRWLock */ + +static pthread_rwlock_t * +g_rw_lock_impl_new (void) +{ + pthread_rwlock_t *rwlock; + gint status; + + rwlock = malloc (sizeof (pthread_rwlock_t)); + if G_UNLIKELY (rwlock == NULL) + g_thread_abort (errno, "malloc"); + + if G_UNLIKELY ((status = pthread_rwlock_init (rwlock, NULL)) != 0) + g_thread_abort (status, "pthread_rwlock_init"); + + return rwlock; +} + +static void +g_rw_lock_impl_free (pthread_rwlock_t *rwlock) +{ + pthread_rwlock_destroy (rwlock); + free (rwlock); +} + +static pthread_rwlock_t * +g_rw_lock_get_impl (GRWLock *lock) +{ + pthread_rwlock_t *impl = g_atomic_pointer_get (&lock->p); + + if G_UNLIKELY (impl == NULL) + { + impl = g_rw_lock_impl_new (); + if (!g_atomic_pointer_compare_and_exchange (&lock->p, NULL, impl)) + g_rw_lock_impl_free (impl); + impl = lock->p; + } + + return impl; +} + +/** + * g_rw_lock_init: + * @rw_lock: an uninitialized #GRWLock + * + * Initializes a #GRWLock so that it can be used. + * + * This function is useful to initialize a lock that has been + * allocated on the stack, or as part of a larger structure. It is not + * necessary to initialise a reader-writer lock that has been statically + * allocated. + * + * |[ + * typedef struct { + * GRWLock l; + * ... + * } Blob; + * + * Blob *b; + * + * b = g_new (Blob, 1); + * g_rw_lock_init (&b->l); + * ]| + * + * To undo the effect of g_rw_lock_init() when a lock is no longer + * needed, use g_rw_lock_clear(). + * + * Calling g_rw_lock_init() on an already initialized #GRWLock leads + * to undefined behaviour. + * + * Since: 2.32 + */ +void +g_rw_lock_init (GRWLock *rw_lock) +{ + rw_lock->p = g_rw_lock_impl_new (); +} + +/** + * g_rw_lock_clear: + * @rw_lock: an initialized #GRWLock + * + * Frees the resources allocated to a lock with g_rw_lock_init(). + * + * This function should not be used with a #GRWLock that has been + * statically allocated. + * + * Calling g_rw_lock_clear() when any thread holds the lock + * leads to undefined behaviour. + * + * Sine: 2.32 + */ +void +g_rw_lock_clear (GRWLock *rw_lock) +{ + g_rw_lock_impl_free (rw_lock->p); +} + +/** + * g_rw_lock_writer_lock: + * @rw_lock: a #GRWLock + * + * Obtain a write lock on @rw_lock. If any thread already holds + * a read or write lock on @rw_lock, the current thread will block + * until all other threads have dropped their locks on @rw_lock. + * + * Since: 2.32 + */ +void +g_rw_lock_writer_lock (GRWLock *rw_lock) +{ + pthread_rwlock_wrlock (g_rw_lock_get_impl (rw_lock)); +} + +/** + * g_rw_lock_writer_trylock: + * @rw_lock: a #GRWLock + * + * Tries to obtain a write lock on @rw_lock. If any other thread holds + * a read or write lock on @rw_lock, it immediately returns %FALSE. + * Otherwise it locks @rw_lock and returns %TRUE. + * + * Returns: %TRUE if @rw_lock could be locked + * + * Since: 2.32 + */ +gboolean +g_rw_lock_writer_trylock (GRWLock *rw_lock) +{ + if (pthread_rwlock_trywrlock (g_rw_lock_get_impl (rw_lock)) != 0) + return FALSE; + + return TRUE; +} + +/** + * g_rw_lock_writer_unlock: + * @rw_lock: a #GRWLock + * + * Release a write lock on @rw_lock. + * + * Calling g_rw_lock_writer_unlock() on a lock that is not held + * by the current thread leads to undefined behaviour. + * + * Since: 2.32 + */ +void +g_rw_lock_writer_unlock (GRWLock *rw_lock) +{ + pthread_rwlock_unlock (g_rw_lock_get_impl (rw_lock)); +} + +/** + * g_rw_lock_reader_lock: + * @rw_lock: a #GRWLock + * + * Obtain a read lock on @rw_lock. If another thread currently holds + * the write lock on @rw_lock or blocks waiting for it, the current + * thread will block. Read locks can be taken recursively. + * + * It is implementation-defined how many threads are allowed to + * hold read locks on the same lock simultaneously. + * + * Since: 2.32 + */ +void +g_rw_lock_reader_lock (GRWLock *rw_lock) +{ + pthread_rwlock_rdlock (g_rw_lock_get_impl (rw_lock)); +} + +/** + * g_rw_lock_reader_trylock: + * @rw_lock: a #GRWLock + * + * Tries to obtain a read lock on @rw_lock and returns %TRUE if + * the read lock was successfully obtained. Otherwise it + * returns %FALSE. + * + * Returns: %TRUE if @rw_lock could be locked + * + * Since: 2.32 + */ +gboolean +g_rw_lock_reader_trylock (GRWLock *rw_lock) +{ + if (pthread_rwlock_tryrdlock (g_rw_lock_get_impl (rw_lock)) != 0) + return FALSE; + + return TRUE; +} + +/** + * g_rw_lock_reader_unlock: + * @rw_lock: a #GRWLock + * + * Release a read lock on @rw_lock. + * + * Calling g_rw_lock_reader_unlock() on a lock that is not held + * by the current thread leads to undefined behaviour. + * + * Since: 2.32 + */ +void +g_rw_lock_reader_unlock (GRWLock *rw_lock) +{ + pthread_rwlock_unlock (g_rw_lock_get_impl (rw_lock)); +} + +/* {{{1 GCond */ + +static pthread_cond_t * +g_cond_impl_new (void) +{ + pthread_condattr_t attr; + pthread_cond_t *cond; + gint status; + + pthread_condattr_init (&attr); +#if defined (HAVE_PTHREAD_CONDATTR_SETCLOCK) && defined (CLOCK_MONOTONIC) + pthread_condattr_setclock (&attr, CLOCK_MONOTONIC); +#endif + + cond = malloc (sizeof (pthread_cond_t)); + if G_UNLIKELY (cond == NULL) + g_thread_abort (errno, "malloc"); + + if G_UNLIKELY ((status = pthread_cond_init (cond, &attr)) != 0) + g_thread_abort (status, "pthread_cond_init"); + + pthread_condattr_destroy (&attr); + + return cond; +} + +static void +g_cond_impl_free (pthread_cond_t *cond) +{ + pthread_cond_destroy (cond); + free (cond); +} + +static pthread_cond_t * +g_cond_get_impl (GCond *cond) +{ + pthread_cond_t *impl = g_atomic_pointer_get (&cond->p); + + if G_UNLIKELY (impl == NULL) + { + impl = g_cond_impl_new (); + if (!g_atomic_pointer_compare_and_exchange (&cond->p, NULL, impl)) + g_cond_impl_free (impl); + impl = cond->p; + } + + return impl; +} + +/** + * g_cond_init: + * @cond: an uninitialized #GCond + * + * Initialises a #GCond so that it can be used. + * + * This function is useful to initialise a #GCond that has been + * allocated as part of a larger structure. It is not necessary to + * initialise a #GCond that has been statically allocated. + * + * To undo the effect of g_cond_init() when a #GCond is no longer + * needed, use g_cond_clear(). + * + * Calling g_cond_init() on an already-initialised #GCond leads + * to undefined behaviour. + * + * Since: 2.32 + */ +void +g_cond_init (GCond *cond) +{ + cond->p = g_cond_impl_new (); +} + +/** + * g_cond_clear: + * @cond: an initialised #GCond + * + * Frees the resources allocated to a #GCond with g_cond_init(). + * + * This function should not be used with a #GCond that has been + * statically allocated. + * + * Calling g_cond_clear() for a #GCond on which threads are + * blocking leads to undefined behaviour. + * + * Since: 2.32 + */ +void +g_cond_clear (GCond *cond) +{ + g_cond_impl_free (cond->p); +} + +/** + * g_cond_wait: + * @cond: a #GCond + * @mutex: a #GMutex that is currently locked + * + * Atomically releases @mutex and waits until @cond is signalled. + * When this function returns, @mutex is locked again and owned by the + * calling thread. + * + * When using condition variables, it is possible that a spurious wakeup + * may occur (ie: g_cond_wait() returns even though g_cond_signal() was + * not called). It's also possible that a stolen wakeup may occur. + * This is when g_cond_signal() is called, but another thread acquires + * @mutex before this thread and modifies the state of the program in + * such a way that when g_cond_wait() is able to return, the expected + * condition is no longer met. + * + * For this reason, g_cond_wait() must always be used in a loop. See + * the documentation for #GCond for a complete example. + **/ +void +g_cond_wait (GCond *cond, + GMutex *mutex) +{ + gint status; + + if G_UNLIKELY ((status = pthread_cond_wait (g_cond_get_impl (cond), g_mutex_get_impl (mutex))) != 0) + g_thread_abort (status, "pthread_cond_wait"); +} + +/** + * g_cond_signal: + * @cond: a #GCond + * + * If threads are waiting for @cond, at least one of them is unblocked. + * If no threads are waiting for @cond, this function has no effect. + * It is good practice to hold the same lock as the waiting thread + * while calling this function, though not required. + */ +void +g_cond_signal (GCond *cond) +{ + gint status; + + if G_UNLIKELY ((status = pthread_cond_signal (g_cond_get_impl (cond))) != 0) + g_thread_abort (status, "pthread_cond_signal"); +} + +/** + * g_cond_broadcast: + * @cond: a #GCond + * + * If threads are waiting for @cond, all of them are unblocked. + * If no threads are waiting for @cond, this function has no effect. + * It is good practice to lock the same mutex as the waiting threads + * while calling this function, though not required. + */ +void +g_cond_broadcast (GCond *cond) +{ + gint status; + + if G_UNLIKELY ((status = pthread_cond_broadcast (g_cond_get_impl (cond))) != 0) + g_thread_abort (status, "pthread_cond_broadcast"); +} + +/** + * g_cond_wait_until: + * @cond: a #GCond + * @mutex: a #GMutex that is currently locked + * @end_time: the monotonic time to wait until + * + * Waits until either @cond is signalled or @end_time has passed. + * + * As with g_cond_wait() it is possible that a spurious or stolen wakeup + * could occur. For that reason, waiting on a condition variable should + * always be in a loop, based on an explicitly-checked predicate. + * + * %TRUE is returned if the condition variable was signalled (or in the + * case of a spurious wakeup). %FALSE is returned if @end_time has + * passed. + * + * The following code shows how to correctly perform a timed wait on a + * condition variable (extended the example presented in the + * documentation for #GCond): + * + * |[ + * gpointer + * pop_data_timed (void) + * { + * gint64 end_time; + * gpointer data; + * + * g_mutex_lock (&data_mutex); + * + * end_time = g_get_monotonic_time () + 5 * G_TIME_SPAN_SECOND; + * while (!current_data) + * if (!g_cond_wait_until (&data_cond, &data_mutex, end_time)) + * { + * // timeout has passed. + * g_mutex_unlock (&data_mutex); + * return NULL; + * } + * + * // there is data for us + * data = current_data; + * current_data = NULL; + * + * g_mutex_unlock (&data_mutex); + * + * return data; + * } + * ]| + * + * Notice that the end time is calculated once, before entering the + * loop and reused. This is the motivation behind the use of absolute + * time on this API -- if a relative time of 5 seconds were passed + * directly to the call and a spurious wakeup occurred, the program would + * have to start over waiting again (which would lead to a total wait + * time of more than 5 seconds). + * + * Returns: %TRUE on a signal, %FALSE on a timeout + * Since: 2.32 + **/ +gboolean +g_cond_wait_until (GCond *cond, + GMutex *mutex, + gint64 end_time) +{ + struct timespec ts; + gint status; + + ts.tv_sec = end_time / 1000000; + ts.tv_nsec = (end_time % 1000000) * 1000; + + if ((status = pthread_cond_timedwait (g_cond_get_impl (cond), g_mutex_get_impl (mutex), &ts)) == 0) + return TRUE; + + if G_UNLIKELY (status != ETIMEDOUT) + g_thread_abort (status, "pthread_cond_timedwait"); + + return FALSE; +} + +/* {{{1 GPrivate */ + +/** + * GPrivate: + * + * The #GPrivate struct is an opaque data structure to represent a + * thread-local data key. It is approximately equivalent to the + * pthread_setspecific()/pthread_getspecific() APIs on POSIX and to + * TlsSetValue()/TlsGetValue() on Windows. + * + * If you don't already know why you might want this functionality, + * then you probably don't need it. + * + * #GPrivate is a very limited resource (as far as 128 per program, + * shared between all libraries). It is also not possible to destroy a + * #GPrivate after it has been used. As such, it is only ever acceptable + * to use #GPrivate in static scope, and even then sparingly so. + * + * See G_PRIVATE_INIT() for a couple of examples. + * + * The #GPrivate structure should be considered opaque. It should only + * be accessed via the g_private_ functions. + */ + +/** + * G_PRIVATE_INIT: + * @notify: a #GDestroyNotify + * + * A macro to assist with the static initialisation of a #GPrivate. + * + * This macro is useful for the case that a #GDestroyNotify function + * should be associated the key. This is needed when the key will be + * used to point at memory that should be deallocated when the thread + * exits. + * + * Additionally, the #GDestroyNotify will also be called on the previous + * value stored in the key when g_private_replace() is used. + * + * If no #GDestroyNotify is needed, then use of this macro is not + * required -- if the #GPrivate is declared in static scope then it will + * be properly initialised by default (ie: to all zeros). See the + * examples below. + * + * |[ + * static GPrivate name_key = G_PRIVATE_INIT (g_free); + * + * // return value should not be freed + * const gchar * + * get_local_name (void) + * { + * return g_private_get (&name_key); + * } + * + * void + * set_local_name (const gchar *name) + * { + * g_private_replace (&name_key, g_strdup (name)); + * } + * + * + * static GPrivate count_key; // no free function + * + * gint + * get_local_count (void) + * { + * return GPOINTER_TO_INT (g_private_get (&count_key)); + * } + * + * void + * set_local_count (gint count) + * { + * g_private_set (&count_key, GINT_TO_POINTER (count)); + * } + * ]| + * + * Since: 2.32 + **/ + +static pthread_key_t * +g_private_impl_new (GDestroyNotify notify) +{ + pthread_key_t *key; + gint status; + + key = malloc (sizeof (pthread_key_t)); + if G_UNLIKELY (key == NULL) + g_thread_abort (errno, "malloc"); + status = pthread_key_create (key, notify); + if G_UNLIKELY (status != 0) + g_thread_abort (status, "pthread_key_create"); + + return key; +} + +static void +g_private_impl_free (pthread_key_t *key) +{ + gint status; + + status = pthread_key_delete (*key); + if G_UNLIKELY (status != 0) + g_thread_abort (status, "pthread_key_delete"); + free (key); +} + +static pthread_key_t * +g_private_get_impl (GPrivate *key) +{ + pthread_key_t *impl = g_atomic_pointer_get (&key->p); + + if G_UNLIKELY (impl == NULL) + { + impl = g_private_impl_new (key->notify); + if (!g_atomic_pointer_compare_and_exchange (&key->p, NULL, impl)) + { + g_private_impl_free (impl); + impl = key->p; + } + } + + return impl; +} + +/** + * g_private_get: + * @key: a #GPrivate + * + * Returns the current value of the thread local variable @key. + * + * If the value has not yet been set in this thread, %NULL is returned. + * Values are never copied between threads (when a new thread is + * created, for example). + * + * Returns: the thread-local value + */ +gpointer +g_private_get (GPrivate *key) +{ + /* quote POSIX: No errors are returned from pthread_getspecific(). */ + return pthread_getspecific (*g_private_get_impl (key)); +} + +/** + * g_private_set: + * @key: a #GPrivate + * @value: the new value + * + * Sets the thread local variable @key to have the value @value in the + * current thread. + * + * This function differs from g_private_replace() in the following way: + * the #GDestroyNotify for @key is not called on the old value. + */ +void +g_private_set (GPrivate *key, + gpointer value) +{ + gint status; + + if G_UNLIKELY ((status = pthread_setspecific (*g_private_get_impl (key), value)) != 0) + g_thread_abort (status, "pthread_setspecific"); +} + +/** + * g_private_replace: + * @key: a #GPrivate + * @value: the new value + * + * Sets the thread local variable @key to have the value @value in the + * current thread. + * + * This function differs from g_private_set() in the following way: if + * the previous value was non-%NULL then the #GDestroyNotify handler for + * @key is run on it. + * + * Since: 2.32 + **/ +void +g_private_replace (GPrivate *key, + gpointer value) +{ + pthread_key_t *impl = g_private_get_impl (key); + gpointer old; + gint status; + + old = pthread_getspecific (*impl); + if (old && key->notify) + key->notify (old); + + if G_UNLIKELY ((status = pthread_setspecific (*impl, value)) != 0) + g_thread_abort (status, "pthread_setspecific"); +} + +/* {{{1 GThread */ + +#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 (cmd, #cmd) + +typedef struct +{ + GRealThread thread; + + pthread_t system_thread; + gboolean joined; + GMutex lock; +} GThreadPosix; + +void +g_system_thread_free (GRealThread *thread) +{ + GThreadPosix *pt = (GThreadPosix *) thread; + + if (!pt->joined) + pthread_detach (pt->system_thread); + + g_mutex_clear (&pt->lock); + + g_slice_free (GThreadPosix, pt); +} + +GRealThread * +g_system_thread_new (GThreadFunc thread_func, + gulong stack_size, + GError **error) +{ + GThreadPosix *thread; + pthread_attr_t attr; + gint ret; + + thread = g_slice_new0 (GThreadPosix); + + posix_check_cmd (pthread_attr_init (&attr)); + +#ifdef HAVE_PTHREAD_ATTR_SETSTACKSIZE + if (stack_size) + { +#ifdef _SC_THREAD_STACK_MIN + stack_size = MAX (sysconf (_SC_THREAD_STACK_MIN), stack_size); +#endif /* _SC_THREAD_STACK_MIN */ + /* 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 */ + + ret = pthread_create (&thread->system_thread, &attr, (void* (*)(void*))thread_func, thread); + + 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)); + g_slice_free (GThreadPosix, thread); + return NULL; + } + + posix_check_err (ret, "pthread_create"); + + g_mutex_init (&thread->lock); + + return (GRealThread *) thread; +} + +/** + * g_thread_yield: + * + * Causes the calling thread to voluntarily relinquish the CPU, so + * that other threads can run. + * + * This function is often used as a method to make busy wait less evil. + */ +void +g_thread_yield (void) +{ + sched_yield (); +} + +void +g_system_thread_wait (GRealThread *thread) +{ + GThreadPosix *pt = (GThreadPosix *) thread; + + g_mutex_lock (&pt->lock); + + if (!pt->joined) + { + posix_check_cmd (pthread_join (pt->system_thread, NULL)); + pt->joined = TRUE; + } + + g_mutex_unlock (&pt->lock); +} + +void +g_system_thread_exit (void) +{ + pthread_exit (NULL); +} + +void +g_system_thread_set_name (const gchar *name) +{ +#ifdef HAVE_SYS_PRCTL_H +#ifdef PR_SET_NAME + prctl (PR_SET_NAME, name, 0, 0, 0, 0); +#endif +#endif +} + +/* {{{1 Epilogue */ +/* vim:set foldmethod=marker: */ diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c new file mode 100644 index 0000000..c54f2bd --- /dev/null +++ b/glib/gthread-win32.c @@ -0,0 +1,1033 @@ +/* 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/. + */ + +/* The GMutex and GCond implementations in this file are some of the + * lowest-level code in GLib. All other parts of GLib (messages, + * memory, slices, etc) assume that they can freely use these facilities + * without risking recursion. + * + * As such, these functions are NOT permitted to call any other part of + * GLib. + * + * The thread manipulation functions (create, exit, join, etc.) have + * more freedom -- they can do as they please. + */ + +#include "config.h" + +#include "glib.h" +#include "glib-init.h" +#include "gthread.h" +#include "gthreadprivate.h" +#include "gslice.h" + +#include + +#include +#include +#include + +static void +g_thread_abort (gint status, + const gchar *function) +{ + fprintf (stderr, "GLib (gthread-win32.c): Unexpected error from C library during '%s': %s. Aborting.\n", + strerror (status), function); + abort (); +} + +/* Starting with Vista and Windows 2008, we have access to the + * CONDITION_VARIABLE and SRWLock primatives on Windows, which are + * pretty reasonable approximations of the primatives specified in + * POSIX 2001 (pthread_cond_t and pthread_mutex_t respectively). + * + * Both of these types are structs containing a single pointer. That + * pointer is used as an atomic bitfield to support user-space mutexes + * that only get the kernel involved in cases of contention (similar + * to how futex()-based mutexes work on Linux). The biggest advantage + * of these new types is that they can be statically initialised to + * zero. That means that they are completely ABI compatible with our + * GMutex and GCond APIs. + * + * Unfortunately, Windows XP lacks these facilities and GLib still + * needs to support Windows XP. Our approach here is as follows: + * + * - avoid depending on structure declarations at compile-time by + * declaring our own GMutex and GCond strutures to be + * ABI-compatible with SRWLock and CONDITION_VARIABLE and using + * those instead + * + * - avoid a hard dependency on the symbols used to manipulate these + * structures by doing a dynamic lookup of those symbols at + * runtime + * + * - if the symbols are not available, emulate them using other + * primatives + * + * Using this approach also allows us to easily build a GLib that lacks + * support for Windows XP or to remove this code entirely when XP is no + * longer supported (end of line is currently April 8, 2014). + */ +typedef struct +{ + void (__stdcall * CallThisOnThreadExit) (void); /* fake */ + + void (__stdcall * InitializeSRWLock) (gpointer lock); + void (__stdcall * DeleteSRWLock) (gpointer lock); /* fake */ + void (__stdcall * AcquireSRWLockExclusive) (gpointer lock); + BOOLEAN (__stdcall * TryAcquireSRWLockExclusive) (gpointer lock); + void (__stdcall * ReleaseSRWLockExclusive) (gpointer lock); + void (__stdcall * AcquireSRWLockShared) (gpointer lock); + BOOLEAN (__stdcall * TryAcquireSRWLockShared) (gpointer lock); + void (__stdcall * ReleaseSRWLockShared) (gpointer lock); + + void (__stdcall * InitializeConditionVariable) (gpointer cond); + void (__stdcall * DeleteConditionVariable) (gpointer cond); /* fake */ + BOOL (__stdcall * SleepConditionVariableSRW) (gpointer cond, + gpointer lock, + DWORD timeout, + ULONG flags); + void (__stdcall * WakeAllConditionVariable) (gpointer cond); + void (__stdcall * WakeConditionVariable) (gpointer cond); +} GThreadImplVtable; + +static GThreadImplVtable g_thread_impl_vtable; + +/* {{{1 GMutex */ +void +g_mutex_init (GMutex *mutex) +{ + g_thread_impl_vtable.InitializeSRWLock (mutex); +} + +void +g_mutex_clear (GMutex *mutex) +{ + if (g_thread_impl_vtable.DeleteSRWLock != NULL) + g_thread_impl_vtable.DeleteSRWLock (mutex); +} + +void +g_mutex_lock (GMutex *mutex) +{ + g_thread_impl_vtable.AcquireSRWLockExclusive (mutex); +} + +gboolean +g_mutex_trylock (GMutex *mutex) +{ + return g_thread_impl_vtable.TryAcquireSRWLockExclusive (mutex); +} + +void +g_mutex_unlock (GMutex *mutex) +{ + g_thread_impl_vtable.ReleaseSRWLockExclusive (mutex); +} + +/* {{{1 GRecMutex */ + +static CRITICAL_SECTION * +g_rec_mutex_impl_new (void) +{ + CRITICAL_SECTION *cs; + + cs = g_slice_new (CRITICAL_SECTION); + InitializeCriticalSection (cs); + + return cs; +} + +static void +g_rec_mutex_impl_free (CRITICAL_SECTION *cs) +{ + DeleteCriticalSection (cs); + g_slice_free (CRITICAL_SECTION, cs); +} + +static CRITICAL_SECTION * +g_rec_mutex_get_impl (GRecMutex *mutex) +{ + CRITICAL_SECTION *impl = mutex->p; + + if G_UNLIKELY (mutex->p == NULL) + { + impl = g_rec_mutex_impl_new (); + if (InterlockedCompareExchangePointer (&mutex->p, impl, NULL) != NULL) + g_rec_mutex_impl_free (impl); + impl = mutex->p; + } + + return impl; +} + +void +g_rec_mutex_init (GRecMutex *mutex) +{ + mutex->p = g_rec_mutex_impl_new (); +} + +void +g_rec_mutex_clear (GRecMutex *mutex) +{ + g_rec_mutex_impl_free (mutex->p); +} + +void +g_rec_mutex_lock (GRecMutex *mutex) +{ + EnterCriticalSection (g_rec_mutex_get_impl (mutex)); +} + +void +g_rec_mutex_unlock (GRecMutex *mutex) +{ + LeaveCriticalSection (mutex->p); +} + +gboolean +g_rec_mutex_trylock (GRecMutex *mutex) +{ + return TryEnterCriticalSection (g_rec_mutex_get_impl (mutex)); +} + +/* {{{1 GRWLock */ + +void +g_rw_lock_init (GRWLock *lock) +{ + g_thread_impl_vtable.InitializeSRWLock (lock); +} + +void +g_rw_lock_clear (GRWLock *lock) +{ + if (g_thread_impl_vtable.DeleteSRWLock != NULL) + g_thread_impl_vtable.DeleteSRWLock (lock); +} + +void +g_rw_lock_writer_lock (GRWLock *lock) +{ + g_thread_impl_vtable.AcquireSRWLockExclusive (lock); +} + +gboolean +g_rw_lock_writer_trylock (GRWLock *lock) +{ + return g_thread_impl_vtable.TryAcquireSRWLockExclusive (lock); +} + +void +g_rw_lock_writer_unlock (GRWLock *lock) +{ + g_thread_impl_vtable.ReleaseSRWLockExclusive (lock); +} + +void +g_rw_lock_reader_lock (GRWLock *lock) +{ + g_thread_impl_vtable.AcquireSRWLockShared (lock); +} + +gboolean +g_rw_lock_reader_trylock (GRWLock *lock) +{ + return g_thread_impl_vtable.TryAcquireSRWLockShared (lock); +} + +void +g_rw_lock_reader_unlock (GRWLock *lock) +{ + g_thread_impl_vtable.ReleaseSRWLockShared (lock); +} + +/* {{{1 GCond */ +void +g_cond_init (GCond *cond) +{ + g_thread_impl_vtable.InitializeConditionVariable (cond); +} + +void +g_cond_clear (GCond *cond) +{ + if (g_thread_impl_vtable.DeleteConditionVariable) + g_thread_impl_vtable.DeleteConditionVariable (cond); +} + +void +g_cond_signal (GCond *cond) +{ + g_thread_impl_vtable.WakeConditionVariable (cond); +} + +void +g_cond_broadcast (GCond *cond) +{ + g_thread_impl_vtable.WakeAllConditionVariable (cond); +} + +void +g_cond_wait (GCond *cond, + GMutex *entered_mutex) +{ + g_thread_impl_vtable.SleepConditionVariableSRW (cond, entered_mutex, INFINITE, 0); +} + +gboolean +g_cond_wait_until (GCond *cond, + GMutex *entered_mutex, + gint64 end_time) +{ + gint64 span; + + span = end_time - g_get_monotonic_time (); + + if G_UNLIKELY (span < 0) + span = 0; + + if G_UNLIKELY (span > G_GINT64_CONSTANT (1000) * G_MAXINT32) + span = INFINITE; + + return g_thread_impl_vtable.SleepConditionVariableSRW (cond, entered_mutex, span / 1000, 0); +} + +/* {{{1 GPrivate */ + +typedef struct _GPrivateDestructor GPrivateDestructor; + +struct _GPrivateDestructor +{ + DWORD index; + GDestroyNotify notify; + GPrivateDestructor *next; +}; + +static GPrivateDestructor * volatile g_private_destructors; +static CRITICAL_SECTION g_private_lock; + +static DWORD +g_private_get_impl (GPrivate *key) +{ + DWORD impl = (DWORD) key->p; + + if G_UNLIKELY (impl == 0) + { + EnterCriticalSection (&g_private_lock); + impl = (DWORD) key->p; + if (impl == 0) + { + GPrivateDestructor *destructor; + + impl = TlsAlloc (); + + if (impl == TLS_OUT_OF_INDEXES) + g_thread_abort (0, "TlsAlloc"); + + if (key->notify != NULL) + { + destructor = malloc (sizeof (GPrivateDestructor)); + if G_UNLIKELY (destructor == NULL) + g_thread_abort (errno, "malloc"); + destructor->index = impl; + destructor->notify = key->notify; + destructor->next = g_private_destructors; + + /* We need to do an atomic store due to the unlocked + * access to the destructor list from the thread exit + * function. + * + * It can double as a sanity check... + */ + if (InterlockedCompareExchangePointer (&g_private_destructors, destructor, + destructor->next) != destructor->next) + g_thread_abort (0, "g_private_get_impl(1)"); + } + + /* Ditto, due to the unlocked access on the fast path */ + if (InterlockedCompareExchangePointer (&key->p, impl, NULL) != NULL) + g_thread_abort (0, "g_private_get_impl(2)"); + } + LeaveCriticalSection (&g_private_lock); + } + + return impl; +} + +gpointer +g_private_get (GPrivate *key) +{ + return TlsGetValue (g_private_get_impl (key)); +} + +void +g_private_set (GPrivate *key, + gpointer value) +{ + TlsSetValue (g_private_get_impl (key), value); +} + +void +g_private_replace (GPrivate *key, + gpointer value) +{ + DWORD impl = g_private_get_impl (key); + gpointer old; + + old = TlsGetValue (impl); + if (old && key->notify) + key->notify (old); + TlsSetValue (impl, value); +} + +/* {{{1 GThread */ + +#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)) + +typedef BOOL (__stdcall *GTryEnterCriticalSectionFunc) (CRITICAL_SECTION *); + +typedef struct +{ + GRealThread thread; + + GThreadFunc proxy; + HANDLE handle; +} GThreadWin32; + +void +g_system_thread_free (GRealThread *thread) +{ + GThreadWin32 *wt = (GThreadWin32 *) thread; + + win32_check_for_error (CloseHandle (wt->handle)); + g_slice_free (GThreadWin32, wt); +} + +void +g_system_thread_exit (void) +{ + _endthreadex (0); +} + +static guint __stdcall +g_thread_win32_proxy (gpointer data) +{ + GThreadWin32 *self = data; + + self->proxy (self); + + g_system_thread_exit (); + + g_assert_not_reached (); + + return 0; +} + +GRealThread * +g_system_thread_new (GThreadFunc func, + gulong stack_size, + GError **error) +{ + GThreadWin32 *thread; + guint ignore; + + thread = g_slice_new0 (GThreadWin32); + thread->proxy = func; + + thread->handle = (HANDLE) _beginthreadex (NULL, stack_size, g_thread_win32_proxy, thread, 0, &ignore); + + if (thread->handle == 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 (win_error); + g_slice_free (GThreadWin32, thread); + return NULL; + } + + return (GRealThread *) thread; +} + +void +g_thread_yield (void) +{ + Sleep(0); +} + +void +g_system_thread_wait (GRealThread *thread) +{ + GThreadWin32 *wt = (GThreadWin32 *) thread; + + win32_check_for_error (WAIT_FAILED != WaitForSingleObject (wt->handle, INFINITE)); +} + +void +g_system_thread_set_name (const gchar *name) +{ + /* FIXME: implement */ +} + +/* {{{1 SRWLock and CONDITION_VARIABLE emulation (for Windows XP) */ + +static CRITICAL_SECTION g_thread_xp_lock; +static DWORD g_thread_xp_waiter_tls; + +/* {{{2 GThreadWaiter utility class for CONDITION_VARIABLE emulation */ +typedef struct _GThreadXpWaiter GThreadXpWaiter; +struct _GThreadXpWaiter +{ + HANDLE event; + volatile GThreadXpWaiter *next; + volatile GThreadXpWaiter **my_owner; +}; + +static GThreadXpWaiter * +g_thread_xp_waiter_get (void) +{ + GThreadXpWaiter *waiter; + + waiter = TlsGetValue (g_thread_xp_waiter_tls); + + if G_UNLIKELY (waiter == NULL) + { + waiter = malloc (sizeof (GThreadXpWaiter)); + if (waiter == NULL) + g_thread_abort (GetLastError (), "malloc"); + waiter->event = CreateEvent (0, FALSE, FALSE, NULL); + if (waiter->event == NULL) + g_thread_abort (GetLastError (), "CreateEvent"); + waiter->my_owner = NULL; + + TlsSetValue (g_thread_xp_waiter_tls, waiter); + } + + return waiter; +} + +static void __stdcall +g_thread_xp_CallThisOnThreadExit (void) +{ + GThreadXpWaiter *waiter; + + waiter = TlsGetValue (g_thread_xp_waiter_tls); + + if (waiter != NULL) + { + TlsSetValue (g_thread_xp_waiter_tls, NULL); + CloseHandle (waiter->event); + free (waiter); + } +} + +/* {{{2 SRWLock emulation */ +typedef struct +{ + CRITICAL_SECTION writer_lock; + gboolean ever_shared; /* protected by writer_lock */ + gboolean writer_locked; /* protected by writer_lock */ + + /* below is only ever touched if ever_shared becomes true */ + CRITICAL_SECTION atomicity; + GThreadXpWaiter *queued_writer; /* protected by atomicity lock */ + gint num_readers; /* protected by atomicity lock */ +} GThreadSRWLock; + +static void __stdcall +g_thread_xp_InitializeSRWLock (gpointer mutex) +{ + *(GThreadSRWLock * volatile *) mutex = NULL; +} + +static void __stdcall +g_thread_xp_DeleteSRWLock (gpointer mutex) +{ + GThreadSRWLock *lock = *(GThreadSRWLock * volatile *) mutex; + + if (lock) + { + if (lock->ever_shared) + DeleteCriticalSection (&lock->atomicity); + + DeleteCriticalSection (&lock->writer_lock); + free (lock); + } +} + +static GThreadSRWLock * __stdcall +g_thread_xp_get_srwlock (GThreadSRWLock * volatile *lock) +{ + GThreadSRWLock *result; + + /* It looks like we're missing some barriers here, but this code only + * ever runs on Windows XP, which in turn only ever runs on hardware + * with a relatively rigid memory model. The 'volatile' will take + * care of the compiler. + */ + result = *lock; + + if G_UNLIKELY (result == NULL) + { + EnterCriticalSection (&g_thread_xp_lock); + + /* Check again */ + result = *lock; + if (result == NULL) + { + result = malloc (sizeof (GThreadSRWLock)); + + if (result == NULL) + g_thread_abort (errno, "malloc"); + + InitializeCriticalSection (&result->writer_lock); + result->writer_locked = FALSE; + result->ever_shared = FALSE; + *lock = result; + } + + LeaveCriticalSection (&g_thread_xp_lock); + } + + return result; +} + +static void __stdcall +g_thread_xp_AcquireSRWLockExclusive (gpointer mutex) +{ + GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); + + EnterCriticalSection (&lock->writer_lock); + + /* CRITICAL_SECTION is reentrant, but SRWLock is not. + * Detect the deadlock that would occur on later Windows version. + */ + g_assert (!lock->writer_locked); + lock->writer_locked = TRUE; + + if (lock->ever_shared) + { + GThreadXpWaiter *waiter = NULL; + + EnterCriticalSection (&lock->atomicity); + if (lock->num_readers > 0) + lock->queued_writer = waiter = g_thread_xp_waiter_get (); + LeaveCriticalSection (&lock->atomicity); + + if (waiter != NULL) + WaitForSingleObject (waiter->event, INFINITE); + + lock->queued_writer = NULL; + } +} + +static BOOLEAN __stdcall +g_thread_xp_TryAcquireSRWLockExclusive (gpointer mutex) +{ + GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); + + if (!TryEnterCriticalSection (&lock->writer_lock)) + return FALSE; + + /* CRITICAL_SECTION is reentrant, but SRWLock is not. + * Ensure that this properly returns FALSE (as SRWLock would). + */ + if G_UNLIKELY (lock->writer_locked) + { + LeaveCriticalSection (&lock->writer_lock); + return FALSE; + } + + lock->writer_locked = TRUE; + + if (lock->ever_shared) + { + gboolean available; + + EnterCriticalSection (&lock->atomicity); + available = lock->num_readers == 0; + LeaveCriticalSection (&lock->atomicity); + + if (!available) + { + LeaveCriticalSection (&lock->writer_lock); + return FALSE; + } + } + + return TRUE; +} + +static void __stdcall +g_thread_xp_ReleaseSRWLockExclusive (gpointer mutex) +{ + GThreadSRWLock *lock = *(GThreadSRWLock * volatile *) mutex; + + lock->writer_locked = FALSE; + + /* We need this until we fix some weird parts of GLib that try to + * unlock freshly-allocated mutexes. + */ + if (lock != NULL) + LeaveCriticalSection (&lock->writer_lock); +} + +static void +g_thread_xp_srwlock_become_reader (GThreadSRWLock *lock) +{ + if G_UNLIKELY (!lock->ever_shared) + { + InitializeCriticalSection (&lock->atomicity); + lock->queued_writer = NULL; + lock->num_readers = 0; + + lock->ever_shared = TRUE; + } + + EnterCriticalSection (&lock->atomicity); + lock->num_readers++; + LeaveCriticalSection (&lock->atomicity); +} + +static void __stdcall +g_thread_xp_AcquireSRWLockShared (gpointer mutex) +{ + GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); + + EnterCriticalSection (&lock->writer_lock); + + /* See g_thread_xp_AcquireSRWLockExclusive */ + g_assert (!lock->writer_locked); + + g_thread_xp_srwlock_become_reader (lock); + + LeaveCriticalSection (&lock->writer_lock); +} + +static BOOLEAN __stdcall +g_thread_xp_TryAcquireSRWLockShared (gpointer mutex) +{ + GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); + + if (!TryEnterCriticalSection (&lock->writer_lock)) + return FALSE; + + /* See g_thread_xp_AcquireSRWLockExclusive */ + if G_UNLIKELY (lock->writer_locked) + { + LeaveCriticalSection (&lock->writer_lock); + return FALSE; + } + + g_thread_xp_srwlock_become_reader (lock); + + LeaveCriticalSection (&lock->writer_lock); + + return TRUE; +} + +static void __stdcall +g_thread_xp_ReleaseSRWLockShared (gpointer mutex) +{ + GThreadSRWLock *lock = g_thread_xp_get_srwlock (mutex); + + EnterCriticalSection (&lock->atomicity); + + lock->num_readers--; + + if (lock->num_readers == 0 && lock->queued_writer) + SetEvent (lock->queued_writer->event); + + LeaveCriticalSection (&lock->atomicity); +} + +/* {{{2 CONDITION_VARIABLE emulation */ +typedef struct +{ + volatile GThreadXpWaiter *first; + volatile GThreadXpWaiter **last_ptr; +} GThreadXpCONDITION_VARIABLE; + +static void __stdcall +g_thread_xp_InitializeConditionVariable (gpointer cond) +{ + *(GThreadXpCONDITION_VARIABLE * volatile *) cond = NULL; +} + +static void __stdcall +g_thread_xp_DeleteConditionVariable (gpointer cond) +{ + GThreadXpCONDITION_VARIABLE *cv = *(GThreadXpCONDITION_VARIABLE * volatile *) cond; + + if (cv) + free (cv); +} + +static GThreadXpCONDITION_VARIABLE * __stdcall +g_thread_xp_get_condition_variable (GThreadXpCONDITION_VARIABLE * volatile *cond) +{ + GThreadXpCONDITION_VARIABLE *result; + + /* It looks like we're missing some barriers here, but this code only + * ever runs on Windows XP, which in turn only ever runs on hardware + * with a relatively rigid memory model. The 'volatile' will take + * care of the compiler. + */ + result = *cond; + + if G_UNLIKELY (result == NULL) + { + result = malloc (sizeof (GThreadXpCONDITION_VARIABLE)); + + if (result == NULL) + g_thread_abort (errno, "malloc"); + + result->first = NULL; + result->last_ptr = &result->first; + + if (InterlockedCompareExchangePointer (cond, result, NULL) != NULL) + { + free (result); + result = *cond; + } + } + + return result; +} + +static BOOL __stdcall +g_thread_xp_SleepConditionVariableSRW (gpointer cond, + gpointer mutex, + DWORD timeout, + ULONG flags) +{ + GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); + GThreadXpWaiter *waiter = g_thread_xp_waiter_get (); + DWORD status; + + waiter->next = NULL; + + EnterCriticalSection (&g_thread_xp_lock); + waiter->my_owner = cv->last_ptr; + *cv->last_ptr = waiter; + cv->last_ptr = &waiter->next; + LeaveCriticalSection (&g_thread_xp_lock); + + g_mutex_unlock (mutex); + status = WaitForSingleObject (waiter->event, timeout); + + if (status != WAIT_TIMEOUT && status != WAIT_OBJECT_0) + g_thread_abort (GetLastError (), "WaitForSingleObject"); + g_mutex_lock (mutex); + + if (status == WAIT_TIMEOUT) + { + EnterCriticalSection (&g_thread_xp_lock); + if (waiter->my_owner) + { + if (waiter->next) + waiter->next->my_owner = waiter->my_owner; + else + cv->last_ptr = waiter->my_owner; + *waiter->my_owner = waiter->next; + waiter->my_owner = NULL; + } + LeaveCriticalSection (&g_thread_xp_lock); + } + + return status == WAIT_OBJECT_0; +} + +static void __stdcall +g_thread_xp_WakeConditionVariable (gpointer cond) +{ + GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); + volatile GThreadXpWaiter *waiter; + + EnterCriticalSection (&g_thread_xp_lock); + + waiter = cv->first; + if (waiter != NULL) + { + waiter->my_owner = NULL; + cv->first = waiter->next; + if (cv->first != NULL) + cv->first->my_owner = &cv->first; + else + cv->last_ptr = &cv->first; + } + + if (waiter != NULL) + SetEvent (waiter->event); + + LeaveCriticalSection (&g_thread_xp_lock); +} + +static void __stdcall +g_thread_xp_WakeAllConditionVariable (gpointer cond) +{ + GThreadXpCONDITION_VARIABLE *cv = g_thread_xp_get_condition_variable (cond); + volatile GThreadXpWaiter *waiter; + + EnterCriticalSection (&g_thread_xp_lock); + + waiter = cv->first; + cv->first = NULL; + cv->last_ptr = &cv->first; + + while (waiter != NULL) + { + volatile GThreadXpWaiter *next; + + next = waiter->next; + SetEvent (waiter->event); + waiter->my_owner = NULL; + waiter = next; + } + + LeaveCriticalSection (&g_thread_xp_lock); +} + +/* {{{2 XP Setup */ +static void +g_thread_xp_init (void) +{ + static const GThreadImplVtable g_thread_xp_impl_vtable = { + g_thread_xp_CallThisOnThreadExit, + g_thread_xp_InitializeSRWLock, + g_thread_xp_DeleteSRWLock, + g_thread_xp_AcquireSRWLockExclusive, + g_thread_xp_TryAcquireSRWLockExclusive, + g_thread_xp_ReleaseSRWLockExclusive, + g_thread_xp_AcquireSRWLockShared, + g_thread_xp_TryAcquireSRWLockShared, + g_thread_xp_ReleaseSRWLockShared, + g_thread_xp_InitializeConditionVariable, + g_thread_xp_DeleteConditionVariable, + g_thread_xp_SleepConditionVariableSRW, + g_thread_xp_WakeAllConditionVariable, + g_thread_xp_WakeConditionVariable + }; + + InitializeCriticalSection (&g_thread_xp_lock); + g_thread_xp_waiter_tls = TlsAlloc (); + + g_thread_impl_vtable = g_thread_xp_impl_vtable; +} + +/* {{{1 Epilogue */ + +static gboolean +g_thread_lookup_native_funcs (void) +{ + GThreadImplVtable native_vtable = { 0, }; + HMODULE kernel32; + + kernel32 = GetModuleHandle ("KERNEL32.DLL"); + + if (kernel32 == NULL) + return FALSE; + +#define GET_FUNC(name) if ((native_vtable.name = (void *) GetProcAddress (kernel32, #name)) == NULL) return FALSE + GET_FUNC(InitializeSRWLock); + GET_FUNC(AcquireSRWLockExclusive); + GET_FUNC(TryAcquireSRWLockExclusive); + GET_FUNC(ReleaseSRWLockExclusive); + GET_FUNC(AcquireSRWLockShared); + GET_FUNC(TryAcquireSRWLockShared); + GET_FUNC(ReleaseSRWLockShared); + + GET_FUNC(InitializeConditionVariable); + GET_FUNC(SleepConditionVariableSRW); + GET_FUNC(WakeAllConditionVariable); + GET_FUNC(WakeConditionVariable); +#undef GET_FUNC + + g_thread_impl_vtable = native_vtable; + + return TRUE; +} + +void +g_thread_win32_init (void) +{ + if (!g_thread_lookup_native_funcs ()) + g_thread_xp_init (); + + InitializeCriticalSection (&g_private_lock); +} + +void +g_thread_win32_thread_detach (void) +{ + gboolean dtors_called; + + do + { + GPrivateDestructor *dtor; + + /* We go by the POSIX book on this one. + * + * If we call a destructor then there is a chance that some new + * TLS variables got set by code called in that destructor. + * + * Loop until nothing is left. + */ + dtors_called = FALSE; + + for (dtor = g_private_destructors; dtor; dtor = dtor->next) + { + gpointer value; + + value = TlsGetValue (dtor->index); + if (value != NULL && dtor->notify != NULL) + { + /* POSIX says to clear this before the call */ + TlsSetValue (dtor->index, NULL); + dtor->notify (value); + dtors_called = TRUE; + } + } + } + while (dtors_called); + + if (g_thread_impl_vtable.CallThisOnThreadExit) + g_thread_impl_vtable.CallThisOnThreadExit (); +} + +/* vim:set foldmethod=marker: */ diff --git a/glib/gthread.c b/glib/gthread.c new file mode 100644 index 0000000..c27bca6 --- /dev/null +++ b/glib/gthread.c @@ -0,0 +1,1067 @@ +/* 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 "gthread.h" +#include "gthreadprivate.h" + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifndef G_OS_WIN32 +#include +#include +#else +#include +#endif /* G_OS_WIN32 */ + +#include "gslice.h" +#include "gstrfuncs.h" +#include "gtestutils.h" + +/** + * SECTION:threads + * @title: Threads + * @short_description: portable support for threads, mutexes, locks, + * 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, #GRecMutex and #GRWLock). There is a facility to use + * individual bits for locks (g_bit_lock()). 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). There are facilities + * for one-time initialization (#GOnce, g_once_init_enter()). Finally, + * there are primitives to create and manage threads (#GThread). + * + * The GLib threading system used to be initialized with g_thread_init(). + * This is no longer necessary. Since version 2.32, the GLib threading + * system is automatically initialized at the start of your program, + * and all thread-creation functions and synchronization primitives + * are available right away. + * + * Note that it is not safe to assume that your program has no threads + * even if you don't call g_thread_new() yourself. GLib and GIO can + * and will create threads for their own purposes in some cases, such + * as when using g_unix_signal_source_new() or when using GDBus. + * + * Originally, UNIX did not have threads, and therefore some traditional + * UNIX APIs are problematic in threaded programs. Some notable examples + * are + * + * + * C library functions that return data in statically allocated + * buffers, such as strtok() or strerror(). For many of these, + * there are thread-safe variants with a _r suffix, or you can + * look at corresponding GLib APIs (like g_strsplit() or g_strerror()). + * + * + * setenv() and unsetenv() manipulate the process environment in + * a not thread-safe way, and may interfere with getenv() calls + * in other threads. Note that getenv() calls may be + * hidden behind other APIs. For example, GNU gettext() + * calls getenv() under the covers. In general, it is best to treat + * the environment as readonly. If you absolutely have to modify the + * environment, do it early in main(), when no other threads are around yet. + * + * + * setlocale() changes the locale for the entire process, affecting + * all threads. Temporary changes to the locale are often made to + * change the behavior of string scanning or formatting functions + * like scanf() or printf(). GLib offers a number of string APIs + * (like g_ascii_formatd() or g_ascii_strtod()) that can often be + * used as an alternative. Or you can use the uselocale() function + * to change the locale only for the current thread. + * + * + * fork() only takes the calling thread into the child's copy of the + * process image. If other threads were executing in critical + * sections they could have left mutexes locked which could easily + * cause deadlocks in the new child. For this reason, you should + * call exit() or exec() as soon as possible in the child and only + * make signal-safe library calls before that. + * + * + * daemon() uses fork() in a way contrary to what is described + * above. It should not be used with GLib programs. + * + * + * + * GLib itself is internally completely thread-safe (all global data is + * automatically locked), but individual data structure instances are + * not automatically locked for performance reasons. 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 thread-safe and + * need no further application-level locking to be accessed from + * multiple threads. Most refcounting functions such as g_object_ref() + * are also thread-safe. + */ + +/* G_LOCK Documentation {{{1 ---------------------------------------------- */ + +/** + * G_LOCK_DEFINE: + * @name: the name of the lock + * + * The G_LOCK_* macros provide a convenient interface to #GMutex. + * #G_LOCK_DEFINE defines a lock. It can appear in any place where + * 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 #GMutex. This means that you + * can use names of existing variables as the parameter - e.g. the name + * of the variable you intend to protect with the lock. Look at our + * give_me_next_number() example using the + * G_LOCK_* macros: + * + * + * Using the <literal>G_LOCK_*</literal> 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 + * + * Works like g_mutex_trylock(), but for a lock defined with + * #G_LOCK_DEFINE. + * + * Returns: %TRUE, if the lock could be locked. + */ + +/** + * G_UNLOCK: + * @name: the name of the lock + * + * Works like g_mutex_unlock(), but for a lock defined with + * #G_LOCK_DEFINE. + */ + +/* GMutex Documentation {{{1 ------------------------------------------ */ + +/** + * 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 #GMutex can be used as a solution to this problem: + * + * + * Using GMutex to protected a shared variable + * + * int + * give_me_next_number (void) + * { + * static GMutex mutex; + * static int current_number = 0; + * int ret_val; + * + * g_mutex_lock (&mutex); + * ret_val = current_number = calc_next_number (current_number); + * g_mutex_unlock (&mutex); + * + * return ret_val; + * } + * + * + * + * Notice that the #GMutex is not initialised to any particular value. + * Its placement in static storage ensures that it will be initialised + * to all-zeros, which is appropriate. + * + * If a #GMutex is placed in other contexts (eg: embedded in a struct) + * then it must be explicitly initialised using g_mutex_init(). + * + * A #GMutex should only be accessed via g_mutex_ + * functions. + */ + +/* GRecMutex Documentation {{{1 -------------------------------------- */ + +/** + * GRecMutex: + * + * The GRecMutex struct is an opaque data structure to represent a + * recursive mutex. It is similar to a #GMutex with the difference + * that it is possible to lock a GRecMutex multiple times in the same + * thread without deadlock. When doing so, care has to be taken to + * unlock the recursive mutex as often as it has been locked. + * + * If a #GRecMutex is allocated in static storage then it can be used + * without initialisation. Otherwise, you should call + * g_rec_mutex_init() on it and g_rec_mutex_clear() when done. + * + * A GRecMutex should only be accessed with the + * g_rec_mutex_ functions. + * + * Since: 2.32 + */ + +/* GRWLock Documentation {{{1 ---------------------------------------- */ + +/** + * GRWLock: + * + * The GRWLock struct is an opaque data structure to represent a + * reader-writer lock. It is similar to a #GMutex in that it allows + * multiple threads to coordinate access to a shared resource. + * + * The difference to a mutex is that a reader-writer lock discriminates + * between read-only ('reader') and full ('writer') access. While only + * one thread at a time is allowed write access (by holding the 'writer' + * lock via g_rw_lock_writer_lock()), multiple threads can gain + * simultaneous read-only access (by holding the 'reader' lock via + * g_rw_lock_reader_lock()). + * + * + * An array with access functions + * + * GRWLock lock; + * GPtrArray *array; + * + * gpointer + * my_array_get (guint index) + * { + * gpointer retval = NULL; + * + * if (!array) + * return NULL; + * + * g_rw_lock_reader_lock (&lock); + * if (index < array->len) + * retval = g_ptr_array_index (array, index); + * g_rw_lock_reader_unlock (&lock); + * + * return retval; + * } + * + * void + * my_array_set (guint index, gpointer data) + * { + * g_rw_lock_writer_lock (&lock); + * + * 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_rw_lock_writer_unlock (&lock); + * } + * + * + * 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. + * + * + * + * If a #GRWLock is allocated in static storage then it can be used + * without initialisation. Otherwise, you should call + * g_rw_lock_init() on it and g_rw_lock_clear() when done. + * + * A GRWLock should only be accessed with the + * g_rw_lock_ functions. + * + * Since: 2.32 + */ + +/* GCond Documentation {{{1 ------------------------------------------ */ + +/** + * 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. + * + * Consider the following example of a shared variable. One or more + * threads can wait for data to be published to the variable and when + * another thread publishes the data, it can signal one of the waiting + * threads to wake up to collect the data. + * + * + * + * Using GCond to block a thread until a condition is satisfied + * + * + * gpointer current_data = NULL; + * GMutex data_mutex; + * GCond data_cond; + * + * 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(). + * + * The example shows that use of a condition variable must always be + * paired with a mutex. Without the use of a mutex, there would be a + * race between the check of current_data by the + * while loop in pop_data and waiting. + * Specifically, another thread could set pop_data + * after the check, and signal the cond (with nobody waiting on it) + * before the first thread goes to sleep. #GCond is specifically useful + * for its ability to release the mutex and go to sleep atomically. + * + * It is also important to use the g_cond_wait() and g_cond_wait_until() + * functions only inside a loop which checks for the condition to be + * true. See g_cond_wait() for an explanation of why the condition may + * not be true even after it returns. + * + * If a #GCond is allocated in static storage then it can be used + * without initialisation. Otherwise, you should call g_cond_init() on + * it and g_cond_clear() when done. + * + * A #GCond should only be accessed via the g_cond_ + * functions. + */ + +/* GThread Documentation {{{1 ---------------------------------------- */ + +/** + * GThread: + * + * The #GThread struct represents a running thread. This struct + * is returned by g_thread_new() or g_thread_try_new(). You can + * obtain the #GThread struct representing the current thead by + * calling g_thread_self(). + * + * GThread is refcounted, see g_thread_ref() and g_thread_unref(). + * The thread represented by it holds a reference while it is running, + * and g_thread_join() consumes the reference that it is given, so + * it is normally not necessary to manage GThread references + * explicitly. + * + * The structure is opaque -- none of its fields may be directly + * accessed. + */ + +/** + * GThreadFunc: + * @data: data passed to the thread + * + * Specifies the type of the @func functions passed to g_thread_new() + * or g_thread_try_new(). + * + * Returns: the return value of the thread + */ + +/** + * g_thread_supported: + * + * This macro returns %TRUE if the thread system is initialized, + * and %FALSE if it is not. + * + * For language bindings, g_thread_get_initialized() provides + * the same functionality as a function. + * + * Returns: %TRUE, if the thread system is initialized + */ + +/* 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. + **/ +G_DEFINE_QUARK (g_thread_error, g_thread_error) + +/* Local Data {{{1 -------------------------------------------------------- */ + +static GMutex g_once_mutex; +static GCond g_once_cond; +static GSList *g_once_init_list = NULL; + +static void g_thread_cleanup (gpointer data); +static GPrivate g_thread_specific_private = G_PRIVATE_INIT (g_thread_cleanup); + +G_LOCK_DEFINE_STATIC (g_thread_new); + +/* 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: + * @location: location of a static initializable variable containing 0 + * + * Function to be called when starting a critical initialization + * section. The argument @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 **/ + * ]| + * + * Returns: %TRUE if the initialization section should be entered, + * %FALSE and blocks otherwise + * + * Since: 2.14 + */ +gboolean +(g_once_init_enter) (volatile void *location) +{ + volatile gsize *value_location = 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: + * @location: location of a static initializable variable containing 0 + * @result: 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 void *location, + gsize result) +{ + volatile gsize *value_location = location; + + g_return_if_fail (g_atomic_pointer_get (value_location) == NULL); + g_return_if_fail (result != 0); + g_return_if_fail (g_once_init_list != NULL); + + g_atomic_pointer_set (value_location, result); + 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); +} + +/* GThread {{{1 -------------------------------------------------------- */ + +/** + * g_thread_ref: + * @thread: a #GThread + * + * Increase the reference count on @thread. + * + * Returns: a new reference to @thread + * + * Since: 2.32 + */ +GThread * +g_thread_ref (GThread *thread) +{ + GRealThread *real = (GRealThread *) thread; + + g_atomic_int_inc (&real->ref_count); + + return thread; +} + +/** + * g_thread_unref: + * @thread: a #GThread + * + * Decrease the reference count on @thread, possibly freeing all + * resources associated with it. + * + * Note that each thread holds a reference to its #GThread while + * it is running, so it is safe to drop your own reference to it + * if you don't need it anymore. + * + * Since: 2.32 + */ +void +g_thread_unref (GThread *thread) +{ + GRealThread *real = (GRealThread *) thread; + + if (g_atomic_int_dec_and_test (&real->ref_count)) + { + if (real->ours) + g_system_thread_free (real); + else + g_slice_free (GRealThread, real); + } +} + +static void +g_thread_cleanup (gpointer data) +{ + g_thread_unref (data); +} + +gpointer +g_thread_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 g_thread_new_internal() has a chance to + * setup 'func' and 'data' before we make the call. + */ + G_LOCK (g_thread_new); + G_UNLOCK (g_thread_new); + + if (thread->name) + { + g_system_thread_set_name (thread->name); + g_free (thread->name); + thread->name = NULL; + } + + thread->retval = thread->thread.func (thread->thread.data); + + return NULL; +} + +/** + * g_thread_new: + * @name: a name for the new thread + * @func: a function to execute in the new thread + * @data: an argument to supply to the new thread + * + * This function creates a new thread. The new thread starts by invoking + * @func with the argument data. The thread will run until @func returns + * or until g_thread_exit() is called from the new thread. The return value + * of @func becomes the return value of the thread, which can be obtained + * with g_thread_join(). + * + * The @name can be useful for discriminating threads in a debugger. + * Some systems restrict the length of @name to 16 bytes. + * + * If the thread can not be created the program aborts. See + * g_thread_try_new() if you want to attempt to deal with failures. + * + * To free the struct returned by this function, use g_thread_unref(). + * Note that g_thread_join() implicitly unrefs the #GThread as well. + * + * Returns: the new #GThread + * + * Since: 2.32 + */ +GThread * +g_thread_new (const gchar *name, + GThreadFunc func, + gpointer data) +{ + GError *error = NULL; + GThread *thread; + + thread = g_thread_new_internal (name, g_thread_proxy, func, data, 0, &error); + + if G_UNLIKELY (thread == NULL) + g_error ("creating thread '%s': %s", name ? name : "", error->message); + + return thread; +} + +/** + * g_thread_try_new: + * @name: a name for the new thread + * @func: a function to execute in the new thread + * @data: an argument to supply to the new thread + * @error: return location for error, or %NULL + * + * This function is the same as g_thread_new() except that + * it allows for the possibility of failure. + * + * If a thread can not be created (due to resource limits), + * @error is set and %NULL is returned. + * + * Returns: the new #GThread, or %NULL if an error occurred + * + * Since: 2.32 + */ +GThread * +g_thread_try_new (const gchar *name, + GThreadFunc func, + gpointer data, + GError **error) +{ + return g_thread_new_internal (name, g_thread_proxy, func, data, 0, error); +} + +GThread * +g_thread_new_internal (const gchar *name, + GThreadFunc proxy, + GThreadFunc func, + gpointer data, + gsize stack_size, + GError **error) +{ + GRealThread *thread; + + g_return_val_if_fail (func != NULL, NULL); + + G_LOCK (g_thread_new); + thread = g_system_thread_new (proxy, stack_size, error); + if (thread) + { + thread->ref_count = 2; + thread->ours = TRUE; + thread->thread.joinable = TRUE; + thread->thread.func = func; + thread->thread.data = data; + thread->name = g_strdup (name); + } + G_UNLOCK (g_thread_new); + + return (GThread*) thread; +} + +/** + * g_thread_exit: + * @retval: the return value of this thread + * + * Terminates the current thread. + * + * If another thread is waiting for us using g_thread_join() then the + * waiting thread will be woken up and get @retval as the return value + * of g_thread_join(). + * + * Calling g_thread_exit (retval) is equivalent to + * returning @retval from the function @func, as given to g_thread_new(). + * + * + * You must only call g_thread_exit() from a thread that you created + * yourself with g_thread_new() or related APIs. You must not call + * this function from a thread created with another threading library + * or or from within a #GThreadPool. + * + */ +void +g_thread_exit (gpointer retval) +{ + GRealThread* real = (GRealThread*) g_thread_self (); + + if G_UNLIKELY (!real->ours) + g_error ("attempt to g_thread_exit() a thread not created by GLib"); + + real->retval = retval; + + g_system_thread_exit (); +} + +/** + * g_thread_join: + * @thread: a #GThread + * + * Waits until @thread finishes, i.e. the function @func, as + * given to g_thread_new(), returns or g_thread_exit() is called. + * If @thread has already terminated, then g_thread_join() + * returns immediately. + * + * Any thread can wait for any other thread by calling g_thread_join(), + * not just its 'creator'. Calling g_thread_join() from multiple threads + * for the same @thread leads to undefined behaviour. + * + * The value returned by @func or given to g_thread_exit() is + * returned by this function. + * + * g_thread_join() consumes the reference to the passed-in @thread. + * This will usually cause the #GThread struct and associated resources + * to be freed. Use g_thread_ref() to obtain an extra reference if you + * want to keep the GThread alive beyond the g_thread_join() call. + * + * Returns: the return value of the thread + */ +gpointer +g_thread_join (GThread *thread) +{ + GRealThread *real = (GRealThread*) thread; + gpointer retval; + + g_return_val_if_fail (thread, NULL); + g_return_val_if_fail (real->ours, NULL); + + g_system_thread_wait (real); + + retval = real->retval; + + /* Just to make sure, this isn't used any more */ + thread->joinable = 0; + + g_thread_unref (thread); + + return retval; +} + +/** + * g_thread_self: + * + * This functions returns the #GThread corresponding to the + * current thread. Note that this function does not increase + * the reference count of the returned struct. + * + * This function will return a #GThread even for threads that + * were not created by GLib (i.e. those created by other threading + * APIs). This may be useful for thread identification purposes + * (i.e. comparisons) but you must not use GLib functions (such + * as g_thread_join()) on these threads. + * + * Returns: the #GThread representing the current 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_slice_new0 (GRealThread); + thread->ref_count = 1; + + g_private_set (&g_thread_specific_private, thread); + } + + return (GThread*) thread; +} + +/** + * g_get_num_processors: + * + * Determine the approximate number of threads that the system will + * schedule simultaneously for this process. This is intended to be + * used as a parameter to g_thread_pool_new() for CPU bound tasks and + * similar cases. + * + * Returns: Number of schedulable threads, always greater than 0 + * + * Since: 2.36 + */ +guint +g_get_num_processors (void) +{ +#ifdef G_OS_WIN32 + DWORD_PTR process_cpus; + DWORD_PTR system_cpus; + + if (GetProcessAffinityMask (GetCurrentProcess (), + &process_cpus, &system_cpus)) + { + unsigned int count; + + for (count = 0; process_cpus != 0; process_cpus >>= 1) + if (process_cpus & 1) + count++; + + if (count > 0) + return count; + } +#elif defined(HAVE_UNISTD_H) && defined(_SC_NPROCESSORS_ONLN) + { + int count; + + count = sysconf (_SC_NPROCESSORS_ONLN); + if (count > 0) + return count; + } +#elif defined HW_NCPU + { + int mib[2], count = 0; + size_t len; + + mib[0] = CTL_HW; + mib[1] = HW_NCPU; + len = sizeof(count); + + if (sysctl (mib, 2, &count, &len, NULL, 0) == 0 && count > 0) + return count; + } +#endif + + return 1; /* Fallback */ +} + +/* Epilogue {{{1 */ +/* vim: set foldmethod=marker: */ diff --git a/glib/gthread.h b/glib/gthread.h new file mode 100644 index 0000000..43c7891 --- /dev/null +++ b/glib/gthread.h @@ -0,0 +1,273 @@ +/* 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 + * 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. + */ + +/* + * 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_THREAD_H__ +#define __G_THREAD_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_THREAD_ERROR g_thread_error_quark () +GLIB_AVAILABLE_IN_ALL +GQuark g_thread_error_quark (void); + +typedef enum +{ + G_THREAD_ERROR_AGAIN /* Resource temporarily unavailable */ +} GThreadError; + +typedef gpointer (*GThreadFunc) (gpointer data); + +typedef struct _GThread GThread; + +typedef union _GMutex GMutex; +typedef struct _GRecMutex GRecMutex; +typedef struct _GRWLock GRWLock; +typedef struct _GCond GCond; +typedef struct _GPrivate GPrivate; +typedef struct _GOnce GOnce; + +union _GMutex +{ + /*< private >*/ + gpointer p; + guint i[2]; +}; + +struct _GRWLock +{ + /*< private >*/ + gpointer p; + guint i[2]; +}; + +struct _GCond +{ + /*< private >*/ + gpointer p; + guint i[2]; +}; + +struct _GRecMutex +{ + /*< private >*/ + gpointer p; + guint i[2]; +}; + +#define G_PRIVATE_INIT(notify) { NULL, (notify), { NULL, NULL } } +struct _GPrivate +{ + /*< private >*/ + gpointer p; + GDestroyNotify notify; + gpointer future[2]; +}; + +typedef enum +{ + G_ONCE_STATUS_NOTCALLED, + G_ONCE_STATUS_PROGRESS, + G_ONCE_STATUS_READY +} GOnceStatus; + +#define G_ONCE_INIT { G_ONCE_STATUS_NOTCALLED, NULL } +struct _GOnce +{ + volatile GOnceStatus status; + volatile gpointer retval; +}; + +#define G_LOCK_NAME(name) g__ ## name ## _lock +#define G_LOCK_DEFINE_STATIC(name) static G_LOCK_DEFINE (name) +#define G_LOCK_DEFINE(name) GMutex G_LOCK_NAME (name) +#define G_LOCK_EXTERN(name) extern GMutex 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_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_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_mutex_trylock (&G_LOCK_NAME (name))) +#else /* !G_DEBUG_LOCKS */ +# define G_LOCK(name) g_mutex_lock (&G_LOCK_NAME (name)) +# define G_UNLOCK(name) g_mutex_unlock (&G_LOCK_NAME (name)) +# define G_TRYLOCK(name) g_mutex_trylock (&G_LOCK_NAME (name)) +#endif /* !G_DEBUG_LOCKS */ + +GLIB_AVAILABLE_IN_2_32 +GThread * g_thread_ref (GThread *thread); +GLIB_AVAILABLE_IN_2_32 +void g_thread_unref (GThread *thread); +GLIB_AVAILABLE_IN_2_32 +GThread * g_thread_new (const gchar *name, + GThreadFunc func, + gpointer data); +GLIB_AVAILABLE_IN_2_32 +GThread * g_thread_try_new (const gchar *name, + GThreadFunc func, + gpointer data, + GError **error); +GLIB_AVAILABLE_IN_ALL +GThread * g_thread_self (void); +GLIB_AVAILABLE_IN_ALL +void g_thread_exit (gpointer retval); +GLIB_AVAILABLE_IN_ALL +gpointer g_thread_join (GThread *thread); +GLIB_AVAILABLE_IN_ALL +void g_thread_yield (void); + + +GLIB_AVAILABLE_IN_2_32 +void g_mutex_init (GMutex *mutex); +GLIB_AVAILABLE_IN_2_32 +void g_mutex_clear (GMutex *mutex); +GLIB_AVAILABLE_IN_ALL +void g_mutex_lock (GMutex *mutex); +GLIB_AVAILABLE_IN_ALL +gboolean g_mutex_trylock (GMutex *mutex); +GLIB_AVAILABLE_IN_ALL +void g_mutex_unlock (GMutex *mutex); + +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_init (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_clear (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_writer_lock (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +gboolean g_rw_lock_writer_trylock (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_writer_unlock (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_reader_lock (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +gboolean g_rw_lock_reader_trylock (GRWLock *rw_lock); +GLIB_AVAILABLE_IN_2_32 +void g_rw_lock_reader_unlock (GRWLock *rw_lock); + +GLIB_AVAILABLE_IN_2_32 +void g_rec_mutex_init (GRecMutex *rec_mutex); +GLIB_AVAILABLE_IN_2_32 +void g_rec_mutex_clear (GRecMutex *rec_mutex); +GLIB_AVAILABLE_IN_2_32 +void g_rec_mutex_lock (GRecMutex *rec_mutex); +GLIB_AVAILABLE_IN_2_32 +gboolean g_rec_mutex_trylock (GRecMutex *rec_mutex); +GLIB_AVAILABLE_IN_2_32 +void g_rec_mutex_unlock (GRecMutex *rec_mutex); + +GLIB_AVAILABLE_IN_2_32 +void g_cond_init (GCond *cond); +GLIB_AVAILABLE_IN_2_32 +void g_cond_clear (GCond *cond); +GLIB_AVAILABLE_IN_ALL +void g_cond_wait (GCond *cond, + GMutex *mutex); +GLIB_AVAILABLE_IN_ALL +void g_cond_signal (GCond *cond); +GLIB_AVAILABLE_IN_ALL +void g_cond_broadcast (GCond *cond); +GLIB_AVAILABLE_IN_2_32 +gboolean g_cond_wait_until (GCond *cond, + GMutex *mutex, + gint64 end_time); + +GLIB_AVAILABLE_IN_ALL +gpointer g_private_get (GPrivate *key); +GLIB_AVAILABLE_IN_ALL +void g_private_set (GPrivate *key, + gpointer value); +GLIB_AVAILABLE_IN_2_32 +void g_private_replace (GPrivate *key, + gpointer value); + +GLIB_AVAILABLE_IN_ALL +gpointer g_once_impl (GOnce *once, + GThreadFunc func, + gpointer arg); +GLIB_AVAILABLE_IN_ALL +gboolean g_once_init_enter (volatile void *location); +GLIB_AVAILABLE_IN_ALL +void g_once_init_leave (volatile void *location, + gsize result); + +#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 */ + +#ifdef __GNUC__ +# define g_once_init_enter(location) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) *(location) : 0); \ + (!g_atomic_pointer_get (location) && \ + g_once_init_enter (location)); \ + })) +# define g_once_init_leave(location, result) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ + (void) (0 ? *(location) = (result) : 0); \ + g_once_init_leave ((location), (gsize) (result)); \ + })) +#else +# define g_once_init_enter(location) \ + (g_once_init_enter((location))) +# define g_once_init_leave(location, result) \ + (g_once_init_leave((location), (gsize) (result))) +#endif + +GLIB_AVAILABLE_IN_2_36 +guint g_get_num_processors (void); + +G_END_DECLS + +#endif /* __G_THREAD_H__ */ diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c new file mode 100644 index 0000000..78684ab --- /dev/null +++ b/glib/gthreadpool.c @@ -0,0 +1,1017 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * GThreadPool: 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 "gthreadpool.h" + +#include "gasyncqueue.h" +#include "gasyncqueueprivate.h" +#include "gmain.h" +#include "gtestutils.h" +#include "gtimer.h" + +/** + * SECTION:thread_pools + * @title: Thread Pools + * @short_description: pools of threads to execute work concurrently + * @see_also: #GThread + * + * 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 = 2; +static gint kill_unused_threads = 0; +static guint max_idle_time = 15 * 1000; + +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 gboolean 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. */ + DEBUG_MSG (("thread %p waiting in global pool for %f seconds.", + g_thread_self (), local_max_idle_time / 1000.0)); + + pool = g_async_queue_timeout_pop (unused_thread_queue, + local_max_idle_time * 1000); + } + 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_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. + */ + 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_timeout_pop_unlocked (pool->queue, + G_USEC_PER_SEC / 2); + } + } + 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 + * immediately, 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 gboolean +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 TRUE; + + 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) + { + GThread *thread; + + /* No thread was found, we have to start a new one */ + thread = g_thread_try_new ("pool", g_thread_pool_thread_proxy, pool, error); + + if (thread == NULL) + return FALSE; + + g_thread_unref (thread); + } + + /* See comment in g_thread_pool_thread_proxy as to why this is done + * here and not there + */ + pool->num_threads++; + + return TRUE; +} + +/** + * 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, or %NULL + * + * 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 shares them with other thread pools. + * 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); + + 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 (); + g_cond_init (&retval->cond); + retval->max_threads = max_threads; + retval->num_threads = 0; + retval->running = TRUE; + retval->immediate = FALSE; + retval->waiting = FALSE; + 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; + + if (!g_thread_pool_start_thread (retval, &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, or %NULL + * + * 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. + * + * Before version 2.32, this function did not return a success status. + * + * Return value: %TRUE on success, %FALSE if an error occurred + */ +gboolean +g_thread_pool_push (GThreadPool *pool, + gpointer data, + GError **error) +{ + GRealThreadPool *real; + gboolean result; + + real = (GRealThreadPool*) pool; + + g_return_val_if_fail (real, FALSE); + g_return_val_if_fail (real->running, FALSE); + + result = TRUE; + + g_async_queue_lock (real->queue); + + if (g_async_queue_length_unlocked (real->queue) >= 0) + { + /* No thread is waiting in the queue */ + GError *local_error = NULL; + + if (!g_thread_pool_start_thread (real, &local_error)) + { + g_propagate_error (error, local_error); + result = FALSE; + } + } + + g_thread_pool_queue_push_unlocked (real, data); + g_async_queue_unlock (real->queue); + + return result; +} + +/** + * g_thread_pool_set_max_threads: + * @pool: a #GThreadPool + * @max_threads: a new maximal number of threads for @pool, + * or -1 for unlimited + * @error: return location for error, or %NULL + * + * Sets the maximal allowed number of threads for @pool. + * A value of -1 means that the maximal number of threads + * is unlimited. If @pool is an exclusive thread pool, setting + * the maximal number of threads to -1 is not allowed. + * + * 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. + * + * Before version 2.32, this function did not return a success status. + * + * Return value: %TRUE on success, %FALSE if an error occurred + */ +gboolean +g_thread_pool_set_max_threads (GThreadPool *pool, + gint max_threads, + GError **error) +{ + GRealThreadPool *real; + gint to_start; + gboolean result; + + real = (GRealThreadPool*) pool; + + g_return_val_if_fail (real, FALSE); + g_return_val_if_fail (real->running, FALSE); + g_return_val_if_fail (!real->pool.exclusive || max_threads != -1, FALSE); + g_return_val_if_fail (max_threads >= -1, FALSE); + + result = TRUE; + + 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; + + if (!g_thread_pool_start_thread (real, &local_error)) + { + g_propagate_error (error, local_error); + result = FALSE; + break; + } + } + + g_async_queue_unlock (real->queue); + + return result; +} + +/** + * 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_) + { + 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); + g_cond_clear (&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. + * + * The default value is 2. + */ +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 cannot be guaranteed 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 (in milliseconds) + * 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. + * + * The default value is 15000 (15 seconds). + * + * 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 (milliseconds) to wait + * for new tasks in the thread pool before stopping the + * thread + * + * Since: 2.10 + */ +guint +g_thread_pool_get_max_idle_time (void) +{ + return g_atomic_int_get (&max_idle_time); +} diff --git a/glib/gthreadpool.h b/glib/gthreadpool.h new file mode 100644 index 0000000..c05d700 --- /dev/null +++ b/glib/gthreadpool.h @@ -0,0 +1,94 @@ +/* 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_THREADPOOL_H__ +#define __G_THREADPOOL_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GThreadPool GThreadPool; + +/* Thread Pools + */ + +struct _GThreadPool +{ + GFunc func; + gpointer user_data; + gboolean exclusive; +}; + +GLIB_AVAILABLE_IN_ALL +GThreadPool * g_thread_pool_new (GFunc func, + gpointer user_data, + gint max_threads, + gboolean exclusive, + GError **error); +GLIB_AVAILABLE_IN_ALL +void g_thread_pool_free (GThreadPool *pool, + gboolean immediate, + gboolean wait_); +GLIB_AVAILABLE_IN_ALL +gboolean g_thread_pool_push (GThreadPool *pool, + gpointer data, + GError **error); +GLIB_AVAILABLE_IN_ALL +guint g_thread_pool_unprocessed (GThreadPool *pool); +GLIB_AVAILABLE_IN_ALL +void g_thread_pool_set_sort_function (GThreadPool *pool, + GCompareDataFunc func, + gpointer user_data); +GLIB_AVAILABLE_IN_ALL +gboolean g_thread_pool_set_max_threads (GThreadPool *pool, + gint max_threads, + GError **error); +GLIB_AVAILABLE_IN_ALL +gint g_thread_pool_get_max_threads (GThreadPool *pool); +GLIB_AVAILABLE_IN_ALL +guint g_thread_pool_get_num_threads (GThreadPool *pool); + +GLIB_AVAILABLE_IN_ALL +void g_thread_pool_set_max_unused_threads (gint max_threads); +GLIB_AVAILABLE_IN_ALL +gint g_thread_pool_get_max_unused_threads (void); +GLIB_AVAILABLE_IN_ALL +guint g_thread_pool_get_num_unused_threads (void); +GLIB_AVAILABLE_IN_ALL +void g_thread_pool_stop_unused_threads (void); +GLIB_AVAILABLE_IN_ALL +void g_thread_pool_set_max_idle_time (guint interval); +GLIB_AVAILABLE_IN_ALL +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..15584f4 --- /dev/null +++ b/glib/gthreadprivate.h @@ -0,0 +1,61 @@ +/* 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__ + +#include "deprecated/gthread.h" + +typedef struct _GRealThread GRealThread; +struct _GRealThread +{ + GThread thread; + + gint ref_count; + gboolean ours; + gchar *name; + gpointer retval; +}; + +/* system thread implementation (gthread-posix.c, gthread-win32.c) */ +void g_system_thread_wait (GRealThread *thread); + +GRealThread * g_system_thread_new (GThreadFunc func, + gulong stack_size, + GError **error); +void g_system_thread_free (GRealThread *thread); + +void g_system_thread_exit (void); +void g_system_thread_set_name (const gchar *name); + + +/* gthread.c */ +GThread * g_thread_new_internal (const gchar *name, + GThreadFunc proxy, + GThreadFunc func, + gpointer data, + gsize stack_size, + GError **error); + +gpointer g_thread_proxy (gpointer thread); + +#endif /* __G_THREADPRIVATE_H__ */ diff --git a/glib/gtimer.c b/glib/gtimer.c new file mode 100644 index 0000000..a45c3cf --- /dev/null +++ b/glib/gtimer.c @@ -0,0 +1,557 @@ +/* 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 */ + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#ifndef G_OS_WIN32 +#include +#endif /* G_OS_WIN32 */ + +#ifdef G_OS_WIN32 +#include +#endif /* G_OS_WIN32 */ + +#include "gtimer.h" + +#include "gmem.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gmain.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: + * + * Opaque datatype that records a start time. + **/ +struct _GTimer +{ + guint64 start; + guint64 end; + + guint active : 1; +}; + +/** + * g_timer_new: + * + * Creates a new timer, and starts timing (i.e. g_timer_start() is + * implicitly called for you). + * + * Returns: a new #GTimer. + **/ +GTimer* +g_timer_new (void) +{ + GTimer *timer; + + timer = g_new (GTimer, 1); + timer->active = TRUE; + + timer->start = g_get_monotonic_time (); + + 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; + + timer->start = g_get_monotonic_time (); +} + +/** + * 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; + + timer->end = g_get_monotonic_time (); +} + +/** + * 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); + + timer->start = g_get_monotonic_time (); +} + +/** + * 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; + + timer->start = g_get_monotonic_time (); + + 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 + * + * 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. + * + * Returns: seconds elapsed as a floating point value, including any + * fractional part. + **/ +gdouble +g_timer_elapsed (GTimer *timer, + gulong *microseconds) +{ + gdouble total; + gint64 elapsed; + + g_return_val_if_fail (timer != NULL, 0); + + if (timer->active) + timer->end = g_get_monotonic_time (); + + elapsed = timer->end - timer->start; + + total = elapsed / 1e6; + + if (microseconds) + *microseconds = elapsed % 1000000; + + return total; +} + +/** + * g_usleep: + * @microseconds: number of microseconds to pause + * + * 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. + */ +void +g_usleep (gulong microseconds) +{ +#ifdef G_OS_WIN32 + Sleep (microseconds / 1000); +#else + 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; +#endif +} + +/** + * 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_: (out): a #GTimeVal + * + * Converts a string containing an ISO 8601 encoded date and time + * to a #GTimeVal and puts it into @time_. + * + * @iso_date must include year, month, day, hours, minutes, and + * seconds. It can optionally include fractions of a second and a time + * zone indicator. (In the absence of any time zone indication, the + * timestamp is assumed to be in local 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') + { + /* Date only */ + if (*iso_date == '\0') + return TRUE; + return FALSE; + } + + iso_date++; + + /* If there is a 'T' then there has to be a time */ + if (!g_ascii_isdigit (*iso_date)) + 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 RFC 3339 encoded string, relative to the + * Coordinated Universal Time (UTC). This is one of the many formats + * allowed by ISO 8601. + * + * ISO 8601 allows a large number of date/time formats, with or without + * punctuation and optional elements. The format returned by this function + * is a complete date and time, with optional punctuation included, the + * UTC time zone represented as "Z", and the @tv_usec part included if + * and only if it is nonzero, i.e. either + * "YYYY-MM-DDTHH:MM:SSZ" or "YYYY-MM-DDTHH:MM:SS.fffffZ". + * + * This corresponds to the Internet date/time format defined by + * RFC 3339, and + * to either of the two most-precise formats defined by + * the W3C Note + * "Date and Time Formats". Both of these documents are profiles of + * ISO 8601. + * + * Use g_date_time_format() or g_strdup_printf() if a different + * variation of ISO 8601 format is required. + * + * 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; +} diff --git a/glib/gtimer.h b/glib/gtimer.h new file mode 100644 index 0000000..702e002 --- /dev/null +++ b/glib/gtimer.h @@ -0,0 +1,76 @@ +/* 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_TIMER_H__ +#define __G_TIMER_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/* Timer + */ + +/* microseconds per second */ +typedef struct _GTimer GTimer; + +#define G_USEC_PER_SEC 1000000 + +GLIB_AVAILABLE_IN_ALL +GTimer* g_timer_new (void); +GLIB_AVAILABLE_IN_ALL +void g_timer_destroy (GTimer *timer); +GLIB_AVAILABLE_IN_ALL +void g_timer_start (GTimer *timer); +GLIB_AVAILABLE_IN_ALL +void g_timer_stop (GTimer *timer); +GLIB_AVAILABLE_IN_ALL +void g_timer_reset (GTimer *timer); +GLIB_AVAILABLE_IN_ALL +void g_timer_continue (GTimer *timer); +GLIB_AVAILABLE_IN_ALL +gdouble g_timer_elapsed (GTimer *timer, + gulong *microseconds); + +GLIB_AVAILABLE_IN_ALL +void g_usleep (gulong microseconds); + +GLIB_AVAILABLE_IN_ALL +void g_time_val_add (GTimeVal *time_, + glong microseconds); +GLIB_AVAILABLE_IN_ALL +gboolean g_time_val_from_iso8601 (const gchar *iso_date, + GTimeVal *time_); +GLIB_AVAILABLE_IN_ALL +gchar* g_time_val_to_iso8601 (GTimeVal *time_) G_GNUC_MALLOC; + +G_END_DECLS + +#endif /* __G_TIMER_H__ */ diff --git a/glib/gtimezone.c b/glib/gtimezone.c new file mode 100644 index 0000000..7bb48d2 --- /dev/null +++ b/glib/gtimezone.c @@ -0,0 +1,1876 @@ +/* + * 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 "gtimezone.h" + +#include +#include +#include + +#include "gmappedfile.h" +#include "gtestutils.h" +#include "gfileutils.h" +#include "gstrfuncs.h" +#include "ghash.h" +#include "gthread.h" +#include "gbytes.h" +#include "gslice.h" +#include "gdatetime.h" +#include "gdate.h" + +#ifdef G_OS_WIN32 +#define STRICT +#include +#endif + +/** + * SECTION:timezone + * @title: GTimeZone + * @short_description: a structure representing a time zone + * @see_also: #GDateTime + * + * #GTimeZone is a structure that represents a time zone, at no + * particular point in time. It is refcounted and immutable. + * + * A time zone contains a number of intervals. Each interval has + * an abbreviation to describe it, an offet to UTC and a flag indicating + * if the daylight savings time is in effect during that interval. A + * time zone always has at least one interval -- interval 0. + * + * Every UTC time is contained within exactly one interval, but a given + * local time may be contained within zero, one or two intervals (due to + * incontinuities associated with daylight savings time). + * + * An interval may refer to a specific period of time (eg: the duration + * of daylight savings time during 2010) or it may refer to many periods + * of time that share the same properties (eg: all periods of daylight + * savings time). It is also possible (usually for political reasons) + * that some properties (like the abbreviation) change between intervals + * without other properties changing. + * + * #GTimeZone is available since GLib 2.26. + */ + +/** + * GTimeZone: + * + * #GDateTime is an opaque structure whose members cannot be accessed + * directly. + * + * Since: 2.26 + **/ + +/* IANA zoneinfo file format {{{1 */ + +/* unaligned */ +typedef struct { gchar bytes[8]; } gint64_be; +typedef struct { gchar bytes[4]; } gint32_be; +typedef struct { gchar bytes[4]; } guint32_be; + +static inline gint64 gint64_from_be (const gint64_be be) { + gint64 tmp; memcpy (&tmp, &be, sizeof tmp); return GINT64_FROM_BE (tmp); +} + +static inline gint32 gint32_from_be (const gint32_be be) { + gint32 tmp; memcpy (&tmp, &be, sizeof tmp); return GINT32_FROM_BE (tmp); +} + +static inline guint32 guint32_from_be (const guint32_be be) { + guint32 tmp; memcpy (&tmp, &be, sizeof tmp); return GUINT32_FROM_BE (tmp); +} + +/* The layout of an IANA timezone file header */ +struct tzhead +{ + gchar tzh_magic[4]; + gchar tzh_version; + guchar tzh_reserved[15]; + + guint32_be tzh_ttisgmtcnt; + guint32_be tzh_ttisstdcnt; + guint32_be tzh_leapcnt; + guint32_be tzh_timecnt; + guint32_be tzh_typecnt; + guint32_be tzh_charcnt; +}; + +struct ttinfo +{ + gint32_be tt_gmtoff; + guint8 tt_isdst; + guint8 tt_abbrind; +}; + +/* A Transition Date structure for TZ Rules, an intermediate structure + for parsing MSWindows and Environment-variable time zones. It + Generalizes MSWindows's SYSTEMTIME struct. + */ +typedef struct +{ + gint year; + gint mon; + gint mday; + gint wday; + gint week; + gint hour; + gint min; + gint sec; +} TimeZoneDate; + +/* POSIX Timezone abbreviations are typically 3 or 4 characters, but + Microsoft uses 32-character names. We'll use one larger to ensure + we have room for the terminating \0. + */ +#define NAME_SIZE 33 + +/* A MSWindows-style time zone transition rule. Generalizes the + MSWindows TIME_ZONE_INFORMATION struct. Also used to compose time + zones from tzset-style identifiers. + */ +typedef struct +{ + gint start_year; + gint32 std_offset; + gint32 dlt_offset; + TimeZoneDate dlt_start; + TimeZoneDate dlt_end; + gchar std_name[NAME_SIZE]; + gchar dlt_name[NAME_SIZE]; +} TimeZoneRule; + +/* GTimeZone's internal representation of a Daylight Savings (Summer) + time interval. + */ +typedef struct +{ + gint32 gmt_offset; + gboolean is_dst; + gboolean is_standard; + gboolean is_gmt; + gchar *abbrev; +} TransitionInfo; + +/* GTimeZone's representation of a transition time to or from Daylight + Savings (Summer) time and Standard time for the zone. */ +typedef struct +{ + gint64 time; + gint info_index; +} Transition; + +/* GTimeZone structure */ +struct _GTimeZone +{ + gchar *name; + GArray *t_info; /* Array of TransitionInfo */ + GArray *transitions; /* Array of Transition */ + gint ref_count; +}; + +G_LOCK_DEFINE_STATIC (time_zones); +static GHashTable/**/ *time_zones; + +#define MIN_TZYEAR 1916 /* Daylight Savings started in WWI */ +#define MAX_TZYEAR 2999 /* And it's not likely ever to go away, but + there's no point in getting carried + away. */ + +/** + * g_time_zone_unref: + * @tz: a #GTimeZone + * + * Decreases the reference count on @tz. + * + * Since: 2.26 + **/ +void +g_time_zone_unref (GTimeZone *tz) +{ + int ref_count; + +again: + ref_count = g_atomic_int_get (&tz->ref_count); + + g_assert (ref_count > 0); + + if (ref_count == 1) + { + if (tz->name != NULL) + { + G_LOCK(time_zones); + + /* someone else might have grabbed a ref in the meantime */ + if G_UNLIKELY (g_atomic_int_get (&tz->ref_count) != 1) + { + G_UNLOCK(time_zones); + goto again; + } + + g_hash_table_remove (time_zones, tz->name); + G_UNLOCK(time_zones); + } + + if (tz->t_info != NULL) + { + gint idx; + for (idx = 0; idx < tz->t_info->len; idx++) + { + TransitionInfo *info = &g_array_index (tz->t_info, TransitionInfo, idx); + g_free (info->abbrev); + } + g_array_free (tz->t_info, TRUE); + } + if (tz->transitions != NULL) + g_array_free (tz->transitions, TRUE); + g_free (tz->name); + + g_slice_free (GTimeZone, tz); + } + + else if G_UNLIKELY (!g_atomic_int_compare_and_exchange (&tz->ref_count, + ref_count, + ref_count - 1)) + goto again; +} + +/** + * g_time_zone_ref: + * @tz: a #GTimeZone + * + * Increases the reference count on @tz. + * + * Returns: a new reference to @tz. + * + * Since: 2.26 + **/ +GTimeZone * +g_time_zone_ref (GTimeZone *tz) +{ + g_assert (tz->ref_count > 0); + + g_atomic_int_inc (&tz->ref_count); + + return tz; +} + +/* fake zoneinfo creation (for RFC3339/ISO 8601 timezones) {{{1 */ +/* + * parses strings of the form h or hh[[:]mm[[[:]ss]]] where: + * - h[h] is 0 to 23 + * - mm is 00 to 59 + * - ss is 00 to 59 + */ +static gboolean +parse_time (const gchar *time_, + gint32 *offset) +{ + if (*time_ < '0' || '9' < *time_) + return FALSE; + + *offset = 60 * 60 * (*time_++ - '0'); + + if (*time_ == '\0') + return TRUE; + + if (*time_ != ':') + { + if (*time_ < '0' || '9' < *time_) + return FALSE; + + *offset *= 10; + *offset += 60 * 60 * (*time_++ - '0'); + + if (*offset > 23 * 60 * 60) + return FALSE; + + if (*time_ == '\0') + return TRUE; + } + + if (*time_ == ':') + time_++; + + if (*time_ < '0' || '5' < *time_) + return FALSE; + + *offset += 10 * 60 * (*time_++ - '0'); + + if (*time_ < '0' || '9' < *time_) + return FALSE; + + *offset += 60 * (*time_++ - '0'); + + if (*time_ == '\0') + return TRUE; + + if (*time_ == ':') + time_++; + + if (*time_ < '0' || '5' < *time_) + return FALSE; + + *offset += 10 * (*time_++ - '0'); + + if (*time_ < '0' || '9' < *time_) + return FALSE; + + *offset += *time_++ - '0'; + + return *time_ == '\0'; +} + +static gboolean +parse_constant_offset (const gchar *name, + gint32 *offset) +{ + if (g_strcmp0 (name, "UTC") == 0) + { + *offset = 0; + return TRUE; + } + + if (*name >= '0' && '9' >= *name) + return parse_time (name, offset); + + switch (*name++) + { + case 'Z': + *offset = 0; + return !*name; + + case '+': + return parse_time (name, offset); + + case '-': + if (parse_time (name, offset)) + { + *offset = -*offset; + return TRUE; + } + + default: + return FALSE; + } +} + +static void +zone_for_constant_offset (GTimeZone *gtz, const gchar *name) +{ + gint32 offset; + TransitionInfo info; + + if (name == NULL || !parse_constant_offset (name, &offset)) + return; + + info.gmt_offset = offset; + info.is_dst = FALSE; + info.is_standard = TRUE; + info.is_gmt = TRUE; + info.abbrev = g_strdup (name); + + + gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), 1); + g_array_append_val (gtz->t_info, info); + + /* Constant offset, no transitions */ + gtz->transitions = NULL; +} + +#ifdef G_OS_UNIX +static GBytes* +zone_info_unix (const gchar *identifier) +{ + gchar *filename; + GMappedFile *file = NULL; + GBytes *zoneinfo = NULL; + + /* identifier can be a relative or absolute path name; + if relative, it is interpreted starting from /usr/share/zoneinfo + while the POSIX standard says it should start with :, + glibc allows both syntaxes, so we should too */ + if (identifier != NULL) + { + const gchar *tzdir; + + tzdir = getenv ("TZDIR"); + if (tzdir == NULL) + tzdir = "/usr/share/zoneinfo"; + + if (*identifier == ':') + identifier ++; + + if (g_path_is_absolute (identifier)) + filename = g_strdup (identifier); + else + filename = g_build_filename (tzdir, identifier, NULL); + } + else + filename = g_strdup ("/etc/localtime"); + + file = g_mapped_file_new (filename, FALSE, NULL); + if (file != NULL) + { + zoneinfo = g_bytes_new_with_free_func (g_mapped_file_get_contents (file), + g_mapped_file_get_length (file), + (GDestroyNotify)g_mapped_file_unref, + g_mapped_file_ref (file)); + g_mapped_file_unref (file); + } + g_free (filename); + return zoneinfo; +} + +static void +init_zone_from_iana_info (GTimeZone *gtz, GBytes *zoneinfo) +{ + gsize size; + guint index; + guint32 time_count, type_count, leap_count, isgmt_count; + guint32 isstd_count, char_count ; + guint8 *tz_transitions, *tz_type_index, *tz_ttinfo; + guint8 *tz_leaps, *tz_isgmt, *tz_isstd; + guint8 *tz_abbrs; + gsize timesize = sizeof (gint32), countsize = sizeof (gint32); + const struct tzhead *header = g_bytes_get_data (zoneinfo, &size); + + g_return_if_fail (size >= sizeof (struct tzhead) && + memcmp (header, "TZif", 4) == 0); + + if (header->tzh_version == '2') + { + /* Skip ahead to the newer 64-bit data if it's available. */ + header = (const struct tzhead *) + (((const gchar *) (header + 1)) + + guint32_from_be(header->tzh_ttisgmtcnt) + + guint32_from_be(header->tzh_ttisstdcnt) + + 8 * guint32_from_be(header->tzh_leapcnt) + + 5 * guint32_from_be(header->tzh_timecnt) + + 6 * guint32_from_be(header->tzh_typecnt) + + guint32_from_be(header->tzh_charcnt)); + timesize = sizeof (gint64); + } + time_count = guint32_from_be(header->tzh_timecnt); + type_count = guint32_from_be(header->tzh_typecnt); + leap_count = guint32_from_be(header->tzh_leapcnt); + isgmt_count = guint32_from_be(header->tzh_ttisgmtcnt); + isstd_count = guint32_from_be(header->tzh_ttisstdcnt); + char_count = guint32_from_be(header->tzh_charcnt); + + g_assert (type_count == isgmt_count); + g_assert (type_count == isstd_count); + + tz_transitions = ((guint8 *) (header) + sizeof (*header)); + tz_type_index = tz_transitions + timesize * time_count; + tz_ttinfo = tz_type_index + time_count; + tz_abbrs = tz_ttinfo + sizeof (struct ttinfo) * type_count; + tz_leaps = tz_abbrs + char_count; + tz_isstd = tz_leaps + (timesize + countsize) * leap_count; + tz_isgmt = tz_isstd + isstd_count; + + gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), + type_count); + gtz->transitions = g_array_sized_new (FALSE, TRUE, sizeof (Transition), + time_count); + + for (index = 0; index < type_count; index++) + { + TransitionInfo t_info; + struct ttinfo info = ((struct ttinfo*)tz_ttinfo)[index]; + t_info.gmt_offset = gint32_from_be (info.tt_gmtoff); + t_info.is_dst = info.tt_isdst ? TRUE : FALSE; + t_info.is_standard = tz_isstd[index] ? TRUE : FALSE; + t_info.is_gmt = tz_isgmt[index] ? TRUE : FALSE; + t_info.abbrev = g_strdup ((gchar *) &tz_abbrs[info.tt_abbrind]); + g_array_append_val (gtz->t_info, t_info); + } + + for (index = 0; index < time_count; index++) + { + Transition trans; + if (header->tzh_version == '2') + trans.time = gint64_from_be (((gint64_be*)tz_transitions)[index]); + else + trans.time = gint32_from_be (((gint32_be*)tz_transitions)[index]); + trans.info_index = tz_type_index[index]; + g_assert (trans.info_index >= 0); + g_assert (trans.info_index < gtz->t_info->len); + g_array_append_val (gtz->transitions, trans); + } +} + +#elif defined (G_OS_WIN32) + +static void +copy_windows_systemtime (SYSTEMTIME *s_time, TimeZoneDate *tzdate) +{ + tzdate->sec = s_time->wSecond; + tzdate->min = s_time->wMinute; + tzdate->hour = s_time->wHour; + tzdate->mon = s_time->wMonth; + tzdate->year = s_time->wYear; + tzdate->wday = s_time->wDayOfWeek ? s_time->wDayOfWeek : 7; + + if (s_time->wYear) + { + tzdate->mday = s_time->wDay; + tzdate->wday = 0; + } + else + tzdate->week = s_time->wDay; +} + +/* UTC = local time + bias while local time = UTC + offset */ +static void +rule_from_windows_time_zone_info (TimeZoneRule *rule, + TIME_ZONE_INFORMATION *tzi) +{ + /* Set offset */ + if (tzi->StandardDate.wMonth) + { + rule->std_offset = -(tzi->Bias + tzi->StandardBias) * 60; + rule->dlt_offset = -(tzi->Bias + tzi->DaylightBias) * 60; + copy_windows_systemtime (&(tzi->DaylightDate), &(rule->dlt_start)); + + copy_windows_systemtime (&(tzi->StandardDate), &(rule->dlt_end)); + + } + + else + { + rule->std_offset = -tzi->Bias * 60; + rule->dlt_start.mon = 0; + } + strncpy (rule->std_name, (gchar*)tzi->StandardName, NAME_SIZE - 1); + strncpy (rule->dlt_name, (gchar*)tzi->DaylightName, NAME_SIZE - 1); +} + +static gchar* +windows_default_tzname (void) +{ + const gchar *subkey = + "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation"; + HKEY key; + gchar *key_name = NULL; + if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0, + KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) + { + DWORD size = 0; + if (RegQueryValueExA (key, "TimeZoneKeyName", NULL, NULL, + NULL, &size) == ERROR_SUCCESS) + { + key_name = g_malloc ((gint)size); + if (RegQueryValueExA (key, "TimeZoneKeyName", NULL, NULL, + (LPBYTE)key_name, &size) != ERROR_SUCCESS) + { + g_free (key_name); + key_name = NULL; + } + } + RegCloseKey (key); + } + return key_name; +} + +typedef struct +{ + LONG Bias; + LONG StandardBias; + LONG DaylightBias; + SYSTEMTIME StandardDate; + SYSTEMTIME DaylightDate; +} RegTZI; + +static void +system_time_copy (SYSTEMTIME *orig, SYSTEMTIME *target) +{ + g_return_if_fail (orig != NULL); + g_return_if_fail (target != NULL); + + target->wYear = orig->wYear; + target->wMonth = orig->wMonth; + target->wDayOfWeek = orig->wDayOfWeek; + target->wDay = orig->wDay; + target->wHour = orig->wHour; + target->wMinute = orig->wMinute; + target->wSecond = orig->wSecond; + target->wMilliseconds = orig->wMilliseconds; +} + +static void +register_tzi_to_tzi (RegTZI *reg, TIME_ZONE_INFORMATION *tzi) +{ + g_return_if_fail (reg != NULL); + g_return_if_fail (tzi != NULL); + tzi->Bias = reg->Bias; + system_time_copy (&(reg->StandardDate), &(tzi->StandardDate)); + tzi->StandardBias = reg->StandardBias; + system_time_copy (&(reg->DaylightDate), &(tzi->DaylightDate)); + tzi->DaylightBias = reg->DaylightBias; +} + +static gint +rules_from_windows_time_zone (const gchar *identifier, TimeZoneRule **rules) +{ + HKEY key; + gchar *subkey, *subkey_dynamic; + gchar *key_name = NULL; + const gchar *reg_key = + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones\\"; + TIME_ZONE_INFORMATION tzi; + DWORD size; + gint rules_num = 0; + RegTZI regtzi, regtzi_prev; + + *rules = NULL; + key_name = NULL; + + if (!identifier) + key_name = windows_default_tzname (); + else + key_name = g_strdup (identifier); + + if (!key_name) + return 0; + + subkey = g_strconcat (reg_key, key_name, NULL); + subkey_dynamic = g_strconcat (subkey, "\\Dynamic DST", NULL); + + if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0, + KEY_QUERY_VALUE, &key) != ERROR_SUCCESS) + return 0; + size = sizeof tzi.StandardName; + if (RegQueryValueExA (key, "Std", NULL, NULL, + (LPBYTE)&(tzi.StandardName), &size) != ERROR_SUCCESS) + goto failed; + if (RegQueryValueExA (key, "Dlt", NULL, NULL, + (LPBYTE)&(tzi.DaylightName), &size) != ERROR_SUCCESS) + goto failed; + + RegCloseKey (key); + if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey_dynamic, 0, + KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) + { + DWORD first, last; + int year, i; + gchar *s; + + size = sizeof first; + if (RegQueryValueExA (key, "FirstEntry", NULL, NULL, + (LPBYTE) &first, &size) != ERROR_SUCCESS) + goto failed; + + size = sizeof last; + if (RegQueryValueExA (key, "LastEntry", NULL, NULL, + (LPBYTE) &last, &size) != ERROR_SUCCESS) + goto failed; + + rules_num = last - first + 2; + *rules = g_new0 (TimeZoneRule, rules_num); + + for (year = first, i = 0; year <= last; year++) + { + s = g_strdup_printf ("%d", year); + + size = sizeof regtzi; + if (RegQueryValueExA (key, s, NULL, NULL, + (LPBYTE) ®tzi, &size) != ERROR_SUCCESS) + { + g_free (*rules); + *rules = NULL; + break; + } + + g_free (s); + + if (year > first && memcmp (®tzi_prev, ®tzi, sizeof regtzi) == 0) + continue; + else + memcpy (®tzi_prev, ®tzi, sizeof regtzi); + + register_tzi_to_tzi (®tzi, &tzi); + rule_from_windows_time_zone_info (&(*rules)[i], &tzi); + (*rules)[i++].start_year = year; + } + + rules_num = i + 1; + +failed: + RegCloseKey (key); + } + else if (RegOpenKeyExA (HKEY_LOCAL_MACHINE, subkey, 0, + KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) + { + size = sizeof regtzi; + if (RegQueryValueExA (key, "TZI", NULL, NULL, + (LPBYTE) ®tzi, &size) == ERROR_SUCCESS) + { + rules_num = 2; + *rules = g_new0 (TimeZoneRule, 2); + register_tzi_to_tzi (®tzi, &tzi); + rule_from_windows_time_zone_info (&(*rules)[0], &tzi); + } + + RegCloseKey (key); + } + + g_free (subkey_dynamic); + g_free (subkey); + g_free (key_name); + + if (*rules) + { + (*rules)[0].start_year = MIN_TZYEAR; + if ((*rules)[rules_num - 2].start_year < MAX_TZYEAR) + (*rules)[rules_num - 1].start_year = MAX_TZYEAR; + else + (*rules)[rules_num - 1].start_year = (*rules)[rules_num - 2].start_year + 1; + + return rules_num; + } + else + return 0; +} + +#endif + +static void +find_relative_date (TimeZoneDate *buffer) +{ + gint wday; + GDate date; + g_date_clear (&date, 1); + wday = buffer->wday; + + /* Get last day if last is needed, first day otherwise */ + if (buffer->mon == 13 || buffer->mon == 14) /* Julian Date */ + { + g_date_set_dmy (&date, 1, 1, buffer->year); + if (wday >= 59 && buffer->mon == 13 && g_date_is_leap_year (buffer->year)) + g_date_add_days (&date, wday); + else + g_date_add_days (&date, wday - 1); + buffer->mon = (int) g_date_get_month (&date); + buffer->mday = (int) g_date_get_day (&date); + buffer->wday = 0; + } + else /* M.W.D */ + { + guint days; + guint days_in_month = g_date_days_in_month (buffer->mon, buffer->year); + GDateWeekday first_wday; + + g_date_set_dmy (&date, 1, buffer->mon, buffer->year); + first_wday = g_date_get_weekday (&date); + + if (first_wday > wday) + ++(buffer->week); + /* week is 1 <= w <= 5, we need 0-based */ + days = 7 * (buffer->week - 1) + wday - first_wday; + + while (days > days_in_month) + days -= 7; + + g_date_add_days (&date, days); + + buffer->mday = g_date_get_day (&date); + } +} + +/* Offset is previous offset of local time. Returns 0 if month is 0 */ +static gint64 +boundary_for_year (TimeZoneDate *boundary, + gint year, + gint32 offset) +{ + TimeZoneDate buffer; + GDate date; + const guint64 unix_epoch_start = 719163L; + const guint64 seconds_per_day = 86400L; + + if (!boundary->mon) + return 0; + buffer = *boundary; + + if (boundary->year == 0) + { + buffer.year = year; + + if (buffer.wday) + find_relative_date (&buffer); + } + + g_assert (buffer.year == year); + g_date_clear (&date, 1); + g_date_set_dmy (&date, buffer.mday, buffer.mon, buffer.year); + return ((g_date_get_julian (&date) - unix_epoch_start) * seconds_per_day + + buffer.hour * 3600 + buffer.min * 60 + buffer.sec - offset); +} + +static void +fill_transition_info_from_rule (TransitionInfo *info, + TimeZoneRule *rule, + gboolean is_dst) +{ + gint offset = is_dst ? rule->dlt_offset : rule->std_offset; + gchar *name = is_dst ? rule->dlt_name : rule->std_name; + + info->gmt_offset = offset; + info->is_dst = is_dst; + info->is_standard = FALSE; + info->is_gmt = FALSE; + + if (name) + info->abbrev = g_strdup (name); + + else + info->abbrev = g_strdup_printf ("%+03d%02d", + (int) offset / 3600, + (int) abs (offset / 60) % 60); +} + +static void +init_zone_from_rules (GTimeZone *gtz, + TimeZoneRule *rules, + gint rules_num) +{ + guint type_count = 0, trans_count = 0, info_index = 0; + guint ri; /* rule index */ + gboolean skip_first_std_trans = TRUE; + gint32 last_offset; + + type_count = 0; + trans_count = 0; + + /* Last rule only contains max year */ + for (ri = 0; ri < rules_num - 1; ri++) + { + if (rules[ri].dlt_start.mon || rules[ri].dlt_end.mon) + { + guint rulespan = (rules[ri + 1].start_year - rules[ri].start_year); + guint transitions = rules[ri].dlt_start.mon > 0 ? 1 : 0; + transitions += rules[ri].dlt_end.mon > 0 ? 1 : 0; + type_count += rules[ri].dlt_start.mon > 0 ? 2 : 1; + trans_count += transitions * rulespan; + } + else + type_count++; + } + + gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), type_count); + gtz->transitions = g_array_sized_new (FALSE, TRUE, sizeof (Transition), trans_count); + + last_offset = rules[0].std_offset; + + for (ri = 0; ri < rules_num - 1; ri++) + { + if ((rules[ri].std_offset || rules[ri].dlt_offset) && + rules[ri].dlt_start.mon == 0 && rules[ri].dlt_end.mon == 0) + { + TransitionInfo std_info; + /* Standard */ + fill_transition_info_from_rule (&std_info, &(rules[ri]), FALSE); + g_array_append_val (gtz->t_info, std_info); + + if (ri > 0 && + ((rules[ri - 1].dlt_start.mon > 12 && + rules[ri - 1].dlt_start.wday > rules[ri - 1].dlt_end.wday) || + rules[ri - 1].dlt_start.mon > rules[ri - 1].dlt_end.mon)) + { + /* The previous rule was a southern hemisphere rule that + starts the year with DST, so we need to add a + transition to return to standard time */ + guint year = rules[ri].start_year; + gint64 std_time = boundary_for_year (&rules[ri].dlt_end, + year, last_offset); + Transition std_trans = {std_time, info_index}; + g_array_append_val (gtz->transitions, std_trans); + + } + last_offset = rules[ri].std_offset; + ++info_index; + skip_first_std_trans = TRUE; + } + else if (rules[ri].std_offset || rules[ri].dlt_offset) + { + const guint start_year = rules[ri].start_year; + const guint end_year = rules[ri + 1].start_year; + gboolean dlt_first; + guint year; + TransitionInfo std_info, dlt_info; + if (rules[ri].dlt_start.mon > 12) + dlt_first = rules[ri].dlt_start.wday > rules[ri].dlt_end.wday; + else + dlt_first = rules[ri].dlt_start.mon > rules[ri].dlt_end.mon; + /* Standard rules are always even, because before the first + transition is always standard time, and 0 is even. */ + fill_transition_info_from_rule (&std_info, &(rules[ri]), FALSE); + fill_transition_info_from_rule (&dlt_info, &(rules[ri]), TRUE); + + g_array_append_val (gtz->t_info, std_info); + g_array_append_val (gtz->t_info, dlt_info); + + /* Transition dates. We hope that a year which ends daylight + time in a southern-hemisphere country (i.e., one that + begins the year in daylight time) will include a rule + which has only a dlt_end. */ + for (year = start_year; year < end_year; year++) + { + gint32 dlt_offset = (dlt_first ? last_offset : + rules[ri].dlt_offset); + gint32 std_offset = (dlt_first ? rules[ri].std_offset : + last_offset); + /* NB: boundary_for_year returns 0 if mon == 0 */ + gint64 std_time = boundary_for_year (&rules[ri].dlt_end, + year, dlt_offset); + gint64 dlt_time = boundary_for_year (&rules[ri].dlt_start, + year, std_offset); + Transition std_trans = {std_time, info_index}; + Transition dlt_trans = {dlt_time, info_index + 1}; + last_offset = (dlt_first ? rules[ri].dlt_offset : + rules[ri].std_offset); + if (dlt_first) + { + if (skip_first_std_trans) + skip_first_std_trans = FALSE; + else if (std_time) + g_array_append_val (gtz->transitions, std_trans); + if (dlt_time) + g_array_append_val (gtz->transitions, dlt_trans); + } + else + { + if (dlt_time) + g_array_append_val (gtz->transitions, dlt_trans); + if (std_time) + g_array_append_val (gtz->transitions, std_trans); + } + } + + info_index += 2; + } + } + if (ri > 0 && + ((rules[ri - 1].dlt_start.mon > 12 && + rules[ri - 1].dlt_start.wday > rules[ri - 1].dlt_end.wday) || + rules[ri - 1].dlt_start.mon > rules[ri - 1].dlt_end.mon)) + { + /* The previous rule was a southern hemisphere rule that + starts the year with DST, so we need to add a + transition to return to standard time */ + TransitionInfo info; + guint year = rules[ri].start_year; + Transition trans; + fill_transition_info_from_rule (&info, &(rules[ri - 1]), FALSE); + g_array_append_val (gtz->t_info, info); + trans.time = boundary_for_year (&rules[ri - 1].dlt_end, + year, last_offset); + trans.info_index = info_index; + g_array_append_val (gtz->transitions, trans); + } +} + +/* + * parses date[/time] for parsing TZ environment variable + * + * date is either Mm.w.d, Jn or N + * - m is 1 to 12 + * - w is 1 to 5 + * - d is 0 to 6 + * - n is 1 to 365 + * - N is 0 to 365 + * + * time is either h or hh[[:]mm[[[:]ss]]] + * - h[h] is 0 to 23 + * - mm is 00 to 59 + * - ss is 00 to 59 + */ +static gboolean +parse_mwd_boundary (gchar **pos, TimeZoneDate *boundary) +{ + gint month, week, day; + + if (**pos == '\0' || **pos < '0' || '9' < **pos) + return FALSE; + + month = *(*pos)++ - '0'; + + if ((month == 1 && **pos >= '0' && '2' >= **pos) || + (month == 0 && **pos >= '0' && '9' >= **pos)) + { + month *= 10; + month += *(*pos)++ - '0'; + } + + if (*(*pos)++ != '.' || month == 0) + return FALSE; + + if (**pos == '\0' || **pos < '1' || '5' < **pos) + return FALSE; + + week = *(*pos)++ - '0'; + + if (*(*pos)++ != '.') + return FALSE; + + if (**pos == '\0' || **pos < '0' || '6' < **pos) + return FALSE; + + day = *(*pos)++ - '0'; + + if (!day) + day += 7; + + boundary->year = 0; + boundary->mon = month; + boundary->week = week; + boundary->wday = day; + return TRUE; +} + +/* Different implementations of tzset interpret the Julian day field + differently. For example, Linux specifies that it should be 1-based + (1 Jan is JD 1) for both Jn and n formats, while zOS and BSD + specify that a Jn JD is 1-based while an n JD is 0-based. Rather + than trying to follow different specs, we will follow GDate's + practice thatIn order to keep it simple, we will follow Linux's + practice. */ + +static gboolean +parse_julian_boundary (gchar** pos, TimeZoneDate *boundary, + gboolean ignore_leap) +{ + gint day = 0; + GDate date; + + while (**pos >= '0' && '9' >= **pos) + { + day *= 10; + day += *(*pos)++ - '0'; + } + + if (day < 1 || 365 < day) + return FALSE; + + g_date_clear (&date, 1); + g_date_set_julian (&date, day); + boundary->year = 0; + boundary->mon = (int) g_date_get_month (&date); + boundary->mday = (int) g_date_get_day (&date); + boundary->wday = 0; + + if (!ignore_leap && day >= 59) + boundary->mday++; + + return TRUE; +} + +static gboolean +parse_tz_boundary (const gchar *identifier, + TimeZoneDate *boundary) +{ + gchar *pos; + + pos = (gchar*)identifier; + /* Month-week-weekday */ + if (*pos == 'M') + { + ++pos; + if (!parse_mwd_boundary (&pos, boundary)) + return FALSE; + } + /* Julian date which ignores Feb 29 in leap years */ + else if (*pos == 'J') + { + ++pos; + if (!parse_julian_boundary (&pos, boundary, FALSE)) + return FALSE ; + } + /* Julian date which counts Feb 29 in leap years */ + else if (*pos >= '0' && '9' >= *pos) + { + if (!parse_julian_boundary (&pos, boundary, TRUE)) + return FALSE; + } + else + return FALSE; + + /* Time */ + + if (*pos == '/') + { + gint32 offset; + + if (!parse_time (++pos, &offset)) + return FALSE; + + boundary->hour = offset / 3600; + boundary->min = (offset / 60) % 60; + boundary->sec = offset % 3600; + + return TRUE; + } + + else + { + boundary->hour = 2; + boundary->min = 0; + boundary->sec = 0; + + return *pos == '\0'; + } +} + +static gint +create_ruleset_from_rule (TimeZoneRule **rules, TimeZoneRule *rule) +{ + *rules = g_new0 (TimeZoneRule, 2); + + (*rules)[0].start_year = MIN_TZYEAR; + (*rules)[1].start_year = MAX_TZYEAR; + + (*rules)[0].std_offset = -rule->std_offset; + (*rules)[0].dlt_offset = -rule->dlt_offset; + (*rules)[0].dlt_start = rule->dlt_start; + (*rules)[0].dlt_end = rule->dlt_end; + strcpy ((*rules)[0].std_name, rule->std_name); + strcpy ((*rules)[0].dlt_name, rule->dlt_name); + return 2; +} + +static gboolean +parse_offset (gchar **pos, gint32 *target) +{ + gchar *buffer; + gchar *target_pos = *pos; + gboolean ret; + + while (**pos == '+' || **pos == '-' || **pos == ':' || + (**pos >= '0' && '9' >= **pos)) + ++(*pos); + + buffer = g_strndup (target_pos, *pos - target_pos); + ret = parse_constant_offset (buffer, target); + g_free (buffer); + + return ret; +} + +static gboolean +parse_identifier_boundary (gchar **pos, TimeZoneDate *target) +{ + gchar *buffer; + gchar *target_pos = *pos; + gboolean ret; + + while (**pos != ',' && **pos != '\0') + ++(*pos); + buffer = g_strndup (target_pos, *pos - target_pos); + ret = parse_tz_boundary (buffer, target); + g_free (buffer); + + return ret; +} + +static gboolean +set_tz_name (gchar **pos, gchar *buffer, guint size) +{ + gchar *name_pos = *pos; + guint len; + + /* Name is ASCII alpha (Is this necessarily true?) */ + while (g_ascii_isalpha (**pos)) + ++(*pos); + + /* Name should be three or more alphabetic characters */ + if (*pos - name_pos < 3) + return FALSE; + + memset (buffer, 0, NAME_SIZE); + /* name_pos isn't 0-terminated, so we have to limit the length expressly */ + len = *pos - name_pos > size - 1 ? size - 1 : *pos - name_pos; + strncpy (buffer, name_pos, len); + return TRUE; +} + +static gboolean +parse_identifier_boundaries (gchar **pos, TimeZoneRule *tzr) +{ + if (*(*pos)++ != ',') + return FALSE; + + /* Start date */ + if (!parse_identifier_boundary (pos, &(tzr->dlt_start)) || *(*pos)++ != ',') + return FALSE; + + /* End date */ + if (!parse_identifier_boundary (pos, &(tzr->dlt_end))) + return FALSE; + return TRUE; +} + +/* + * Creates an array of TimeZoneRule from a TZ environment variable + * type of identifier. Should free rules afterwards + */ +static gint +rules_from_identifier (const gchar *identifier, + TimeZoneRule **rules) +{ + gchar *pos; + TimeZoneRule tzr; + + if (!identifier) + return 0; + + pos = (gchar*)identifier; + memset (&tzr, 0, sizeof (tzr)); + /* Standard offset */ + if (!(set_tz_name (&pos, tzr.std_name, NAME_SIZE)) || + !parse_offset (&pos, &(tzr.std_offset))) + return 0; + + if (*pos == 0) + return create_ruleset_from_rule (rules, &tzr); + + /* Format 2 */ + if (!(set_tz_name (&pos, tzr.dlt_name, NAME_SIZE))) + return 0; + parse_offset (&pos, &(tzr.dlt_offset)); + if (tzr.dlt_offset == 0) /* No daylight offset given, assume it's 1 + hour earlier that standard */ + tzr.dlt_offset = tzr.std_offset - 3600; + if (*pos == '\0') +#ifdef G_OS_WIN32 + /* Windows allows us to use the US DST boundaries if they're not given */ + { + int i; + guint rules_num = 0; + + /* Use US rules, Windows' default is Pacific Standard Time */ + if ((rules_num = rules_from_windows_time_zone ("Pacific Standard Time", + rules))) + { + for (i = 0; i < rules_num - 1; i++) + { + (*rules)[i].std_offset = - tzr.std_offset; + (*rules)[i].dlt_offset = - tzr.dlt_offset; + strcpy ((*rules)[i].std_name, tzr.std_name); + strcpy ((*rules)[i].dlt_name, tzr.dlt_name); + } + + return rules_num; + } + else + return 0; + } +#else + return 0; +#endif + /* Start and end required (format 2) */ + if (!parse_identifier_boundaries (&pos, &tzr)) + return 0; + + return create_ruleset_from_rule (rules, &tzr); +} + +/* Construction {{{1 */ +/** + * g_time_zone_new: + * @identifier: (allow-none): a timezone identifier + * + * Creates a #GTimeZone corresponding to @identifier. + * + * @identifier can either be an RFC3339/ISO 8601 time offset or + * something that would pass as a valid value for the + * TZ environment variable (including %NULL). + * + * In Windows, @identifier can also be the unlocalized name of a time + * zone for standard time, for example "Pacific Standard Time". + * + * Valid RFC3339 time offsets are "Z" (for UTC) or + * "±hh:mm". ISO 8601 additionally specifies + * "±hhmm" and "±hh". Offsets are + * time values to be added to Coordinated Universal Time (UTC) to get + * the local time. + * + * In Unix, the TZ environment variable typically + * corresponds to the name of a file in the zoneinfo database, or + * string in "std offset [dst [offset],start[/time],end[/time]]" + * (POSIX) format. There are no spaces in the specification. The + * name of standard and daylight savings time zone must be three or more + * alphabetic characters. Offsets are time values to be added to local + * time to get Coordinated Universal Time (UTC) and should be + * "[±]hh[[:]mm[:ss]]". Dates are either + * "Jn" (Julian day with n between 1 and 365, leap + * years not counted), "n" (zero-based Julian day + * with n between 0 and 365) or "Mm.w.d" (day d + * (0 <= d <= 6) of week w (1 <= w <= 5) of month m (1 <= m <= 12), day + * 0 is a Sunday). Times are in local wall clock time, the default is + * 02:00:00. + * + * In Windows, the "tzn[+|–]hh[:mm[:ss]][dzn]" format is used, but also + * accepts POSIX format. The Windows format uses US rules for all time + * zones; daylight savings time is 60 minutes behind the standard time + * with date and time of change taken from Pacific Standard Time. + * Offsets are time values to be added to the local time to get + * Coordinated Universal Time (UTC). + * + * g_time_zone_new_local() calls this function with the value of the + * TZ environment variable. This function itself is + * independent of the value of TZ, but if @identifier + * is %NULL then /etc/localtime will be consulted + * to discover the correct time zone on Unix and the registry will be + * consulted or GetTimeZoneInformation() will be used to get the local + * time zone on Windows. + * + * If intervals are not available, only time zone rules from + * TZ environment variable or other means, then they + * will be computed from year 1900 to 2037. If the maximum year for the + * rules is available and it is greater than 2037, then it will followed + * instead. + * + * See RFC3339 + * §5.6 for a precise definition of valid RFC3339 time offsets + * (the time-offset expansion) and ISO 8601 for the + * full list of valid time offsets. See The + * GNU C Library manual for an explanation of the possible + * values of the TZ environment variable. See + * Microsoft Time Zone Index Values for the list of time zones + * on Windows. + * + * You should release the return value by calling g_time_zone_unref() + * when you are done with it. + * + * Returns: the requested timezone + * + * Since: 2.26 + **/ +GTimeZone * +g_time_zone_new (const gchar *identifier) +{ + GTimeZone *tz = NULL; + TimeZoneRule *rules; + gint rules_num; + + G_LOCK (time_zones); + if (time_zones == NULL) + time_zones = g_hash_table_new (g_str_hash, g_str_equal); + + if (identifier) + { + tz = g_hash_table_lookup (time_zones, identifier); + if (tz) + { + g_atomic_int_inc (&tz->ref_count); + G_UNLOCK (time_zones); + return tz; + } + } + + tz = g_slice_new0 (GTimeZone); + tz->name = g_strdup (identifier); + tz->ref_count = 0; + + zone_for_constant_offset (tz, identifier); + + if (tz->t_info == NULL && + (rules_num = rules_from_identifier (identifier, &rules))) + { + init_zone_from_rules (tz, rules, rules_num); + g_free (rules); + } + + if (tz->t_info == NULL) + { +#ifdef G_OS_UNIX + GBytes *zoneinfo = zone_info_unix (identifier); + if (!zoneinfo) + zone_for_constant_offset (tz, "UTC"); + else + { + init_zone_from_iana_info (tz, zoneinfo); + g_bytes_unref (zoneinfo); + } +#elif defined (G_OS_WIN32) + if ((rules_num = rules_from_windows_time_zone (identifier, &rules))) + { + init_zone_from_rules (tz, rules, rules_num); + g_free (rules); + } + } + + if (tz->t_info == NULL) + { + if (identifier) + zone_for_constant_offset (tz, "UTC"); + else + { + TIME_ZONE_INFORMATION tzi; + + if (GetTimeZoneInformation (&tzi) != TIME_ZONE_ID_INVALID) + { + rules = g_new0 (TimeZoneRule, 2); + + rule_from_windows_time_zone_info (&rules[0], &tzi); + + memset (rules[0].std_name, 0, NAME_SIZE); + memset (rules[0].dlt_name, 0, NAME_SIZE); + + rules[0].start_year = MIN_TZYEAR; + rules[1].start_year = MAX_TZYEAR; + + init_zone_from_rules (tz, rules, 2); + + g_free (rules); + } + } +#endif + } + + if (tz->t_info != NULL) + { + if (identifier) + g_hash_table_insert (time_zones, tz->name, tz); + } + g_atomic_int_inc (&tz->ref_count); + G_UNLOCK (time_zones); + + return tz; +} + +/** + * g_time_zone_new_utc: + * + * Creates a #GTimeZone corresponding to UTC. + * + * This is equivalent to calling g_time_zone_new() with a value like + * "Z", "UTC", "+00", etc. + * + * You should release the return value by calling g_time_zone_unref() + * when you are done with it. + * + * Returns: the universal timezone + * + * Since: 2.26 + **/ +GTimeZone * +g_time_zone_new_utc (void) +{ + return g_time_zone_new ("UTC"); +} + +/** + * g_time_zone_new_local: + * + * Creates a #GTimeZone corresponding to local time. The local time + * zone may change between invocations to this function; for example, + * if the system administrator changes it. + * + * This is equivalent to calling g_time_zone_new() with the value of the + * TZ environment variable (including the possibility + * of %NULL). + * + * You should release the return value by calling g_time_zone_unref() + * when you are done with it. + * + * Returns: the local timezone + * + * Since: 2.26 + **/ +GTimeZone * +g_time_zone_new_local (void) +{ + return g_time_zone_new (getenv ("TZ")); +} + +#define TRANSITION(n) g_array_index (tz->transitions, Transition, n) +#define TRANSITION_INFO(n) g_array_index (tz->t_info, TransitionInfo, n) + +/* Internal helpers {{{1 */ +/* NB: Interval 0 is before the first transition, so there's no + * transition structure to point to which TransitionInfo to + * use. Rule-based zones are set up so that TI 0 is always standard + * time (which is what's in effect before Daylight time got started + * in the early 20th century), but IANA tzfiles don't follow that + * convention. The tzfile documentation says to use the first + * standard-time (i.e., non-DST) tinfo, so that's what we do. + */ +inline static const TransitionInfo* +interval_info (GTimeZone *tz, + guint interval) +{ + guint index; + g_return_val_if_fail (tz->t_info != NULL, NULL); + if (interval && tz->transitions && interval <= tz->transitions->len) + index = (TRANSITION(interval - 1)).info_index; + else + { + for (index = 0; index < tz->t_info->len; index++) + { + TransitionInfo *tzinfo = &(TRANSITION_INFO(index)); + if (!tzinfo->is_dst) + return tzinfo; + } + index = 0; + } + + return &(TRANSITION_INFO(index)); +} + +inline static gint64 +interval_start (GTimeZone *tz, + guint interval) +{ + if (!interval || tz->transitions == NULL || tz->transitions->len == 0) + return G_MININT64; + if (interval > tz->transitions->len) + interval = tz->transitions->len; + return (TRANSITION(interval - 1)).time; +} + +inline static gint64 +interval_end (GTimeZone *tz, + guint interval) +{ + if (tz->transitions && interval < tz->transitions->len) + return (TRANSITION(interval)).time - 1; + return G_MAXINT64; +} + +inline static gint32 +interval_offset (GTimeZone *tz, + guint interval) +{ + g_return_val_if_fail (tz->t_info != NULL, 0); + return interval_info (tz, interval)->gmt_offset; +} + +inline static gboolean +interval_isdst (GTimeZone *tz, + guint interval) +{ + g_return_val_if_fail (tz->t_info != NULL, 0); + return interval_info (tz, interval)->is_dst; +} + + +inline static gboolean +interval_isgmt (GTimeZone *tz, + guint interval) +{ + g_return_val_if_fail (tz->t_info != NULL, 0); + return interval_info (tz, interval)->is_gmt; +} + +inline static gboolean +interval_isstandard (GTimeZone *tz, + guint interval) +{ + return interval_info (tz, interval)->is_standard; +} + +inline static gchar* +interval_abbrev (GTimeZone *tz, + guint interval) +{ + g_return_val_if_fail (tz->t_info != NULL, 0); + return interval_info (tz, interval)->abbrev; +} + +inline static gint64 +interval_local_start (GTimeZone *tz, + guint interval) +{ + if (interval) + return interval_start (tz, interval) + interval_offset (tz, interval); + + return G_MININT64; +} + +inline static gint64 +interval_local_end (GTimeZone *tz, + guint interval) +{ + if (tz->transitions && interval < tz->transitions->len) + return interval_end (tz, interval) + interval_offset (tz, interval); + + return G_MAXINT64; +} + +static gboolean +interval_valid (GTimeZone *tz, + guint interval) +{ + if ( tz->transitions == NULL) + return interval == 0; + return interval <= tz->transitions->len; +} + +/* g_time_zone_find_interval() {{{1 */ + +/** + * g_time_zone_adjust_time: + * @tz: a #GTimeZone + * @type: the #GTimeType of @time_ + * @time_: a pointer to a number of seconds since January 1, 1970 + * + * Finds an interval within @tz that corresponds to the given @time_, + * possibly adjusting @time_ if required to fit into an interval. + * The meaning of @time_ depends on @type. + * + * This function is similar to g_time_zone_find_interval(), with the + * difference that it always succeeds (by making the adjustments + * described below). + * + * In any of the cases where g_time_zone_find_interval() succeeds then + * this function returns the same value, without modifying @time_. + * + * This function may, however, modify @time_ in order to deal with + * non-existent times. If the non-existent local @time_ of 02:30 were + * requested on March 14th 2010 in Toronto then this function would + * adjust @time_ to be 03:00 and return the interval containing the + * adjusted time. + * + * Returns: the interval containing @time_, never -1 + * + * Since: 2.26 + **/ +gint +g_time_zone_adjust_time (GTimeZone *tz, + GTimeType type, + gint64 *time_) +{ + gint i; + guint intervals; + + if (tz->transitions == NULL) + return 0; + + intervals = tz->transitions->len; + + /* find the interval containing *time UTC + * TODO: this could be binary searched (or better) */ + for (i = 0; i <= intervals; i++) + if (*time_ <= interval_end (tz, i)) + break; + + g_assert (interval_start (tz, i) <= *time_ && *time_ <= interval_end (tz, i)); + + if (type != G_TIME_TYPE_UNIVERSAL) + { + if (*time_ < interval_local_start (tz, i)) + /* if time came before the start of this interval... */ + { + i--; + + /* if it's not in the previous interval... */ + if (*time_ > interval_local_end (tz, i)) + { + /* it doesn't exist. fast-forward it. */ + i++; + *time_ = interval_local_start (tz, i); + } + } + + else if (*time_ > interval_local_end (tz, i)) + /* if time came after the end of this interval... */ + { + i++; + + /* if it's not in the next interval... */ + if (*time_ < interval_local_start (tz, i)) + /* it doesn't exist. fast-forward it. */ + *time_ = interval_local_start (tz, i); + } + + else if (interval_isdst (tz, i) != type) + /* it's in this interval, but dst flag doesn't match. + * check neighbours for a better fit. */ + { + if (i && *time_ <= interval_local_end (tz, i - 1)) + i--; + + else if (i < intervals && + *time_ >= interval_local_start (tz, i + 1)) + i++; + } + } + + return i; +} + +/** + * g_time_zone_find_interval: + * @tz: a #GTimeZone + * @type: the #GTimeType of @time_ + * @time_: a number of seconds since January 1, 1970 + * + * Finds an the interval within @tz that corresponds to the given @time_. + * The meaning of @time_ depends on @type. + * + * If @type is %G_TIME_TYPE_UNIVERSAL then this function will always + * succeed (since universal time is monotonic and continuous). + * + * Otherwise @time_ is treated is local time. The distinction between + * %G_TIME_TYPE_STANDARD and %G_TIME_TYPE_DAYLIGHT is ignored except in + * the case that the given @time_ is ambiguous. In Toronto, for example, + * 01:30 on November 7th 2010 occurred twice (once inside of daylight + * savings time and the next, an hour later, outside of daylight savings + * time). In this case, the different value of @type would result in a + * different interval being returned. + * + * It is still possible for this function to fail. In Toronto, for + * example, 02:00 on March 14th 2010 does not exist (due to the leap + * forward to begin daylight savings time). -1 is returned in that + * case. + * + * Returns: the interval containing @time_, or -1 in case of failure + * + * Since: 2.26 + */ +gint +g_time_zone_find_interval (GTimeZone *tz, + GTimeType type, + gint64 time_) +{ + gint i; + guint intervals; + + if (tz->transitions == NULL) + return 0; + intervals = tz->transitions->len; + for (i = 0; i <= intervals; i++) + if (time_ <= interval_end (tz, i)) + break; + + if (type == G_TIME_TYPE_UNIVERSAL) + return i; + + if (time_ < interval_local_start (tz, i)) + { + if (time_ > interval_local_end (tz, --i)) + return -1; + } + + else if (time_ > interval_local_end (tz, i)) + { + if (time_ < interval_local_start (tz, ++i)) + return -1; + } + + else if (interval_isdst (tz, i) != type) + { + if (i && time_ <= interval_local_end (tz, i - 1)) + i--; + + else if (i < intervals && time_ >= interval_local_start (tz, i + 1)) + i++; + } + + return i; +} + +/* Public API accessors {{{1 */ + +/** + * g_time_zone_get_abbreviation: + * @tz: a #GTimeZone + * @interval: an interval within the timezone + * + * Determines the time zone abbreviation to be used during a particular + * @interval of time in the time zone @tz. + * + * For example, in Toronto this is currently "EST" during the winter + * months and "EDT" during the summer months when daylight savings time + * is in effect. + * + * Returns: the time zone abbreviation, which belongs to @tz + * + * Since: 2.26 + **/ +const gchar * +g_time_zone_get_abbreviation (GTimeZone *tz, + gint interval) +{ + g_return_val_if_fail (interval_valid (tz, (guint)interval), NULL); + + return interval_abbrev (tz, (guint)interval); +} + +/** + * g_time_zone_get_offset: + * @tz: a #GTimeZone + * @interval: an interval within the timezone + * + * Determines the offset to UTC in effect during a particular @interval + * of time in the time zone @tz. + * + * The offset is the number of seconds that you add to UTC time to + * arrive at local time for @tz (ie: negative numbers for time zones + * west of GMT, positive numbers for east). + * + * Returns: the number of seconds that should be added to UTC to get the + * local time in @tz + * + * Since: 2.26 + **/ +gint32 +g_time_zone_get_offset (GTimeZone *tz, + gint interval) +{ + g_return_val_if_fail (interval_valid (tz, (guint)interval), 0); + + return interval_offset (tz, (guint)interval); +} + +/** + * g_time_zone_is_dst: + * @tz: a #GTimeZone + * @interval: an interval within the timezone + * + * Determines if daylight savings time is in effect during a particular + * @interval of time in the time zone @tz. + * + * Returns: %TRUE if daylight savings time is in effect + * + * Since: 2.26 + **/ +gboolean +g_time_zone_is_dst (GTimeZone *tz, + gint interval) +{ + g_return_val_if_fail (interval_valid (tz, interval), FALSE); + + if (tz->transitions == NULL) + return FALSE; + + return interval_isdst (tz, (guint)interval); +} + +/* Epilogue {{{1 */ +/* vim:set foldmethod=marker: */ diff --git a/glib/gtimezone.h b/glib/gtimezone.h new file mode 100644 index 0000000..536acb1 --- /dev/null +++ b/glib/gtimezone.h @@ -0,0 +1,91 @@ +/* + * 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_TIME_ZONE_H__ +#define __G_TIME_ZONE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GTimeZone GTimeZone; + +/** + * GTimeType: + * @G_TIME_TYPE_STANDARD: the time is in local standard time + * @G_TIME_TYPE_DAYLIGHT: the time is in local daylight time + * @G_TIME_TYPE_UNIVERSAL: the time is in UTC + * + * Disambiguates a given time in two ways. + * + * First, specifies if the given time is in universal or local time. + * + * Second, if the time is in local time, specifies if it is local + * standard time or local daylight time. This is important for the case + * where the same local time occurs twice (during daylight savings time + * transitions, for example). + */ +typedef enum +{ + G_TIME_TYPE_STANDARD, + G_TIME_TYPE_DAYLIGHT, + G_TIME_TYPE_UNIVERSAL +} GTimeType; + +GLIB_AVAILABLE_IN_ALL +GTimeZone * g_time_zone_new (const gchar *identifier); +GLIB_AVAILABLE_IN_ALL +GTimeZone * g_time_zone_new_utc (void); +GLIB_AVAILABLE_IN_ALL +GTimeZone * g_time_zone_new_local (void); + +GLIB_AVAILABLE_IN_ALL +GTimeZone * g_time_zone_ref (GTimeZone *tz); +GLIB_AVAILABLE_IN_ALL +void g_time_zone_unref (GTimeZone *tz); + +GLIB_AVAILABLE_IN_ALL +gint g_time_zone_find_interval (GTimeZone *tz, + GTimeType type, + gint64 time_); + +GLIB_AVAILABLE_IN_ALL +gint g_time_zone_adjust_time (GTimeZone *tz, + GTimeType type, + gint64 *time_); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_time_zone_get_abbreviation (GTimeZone *tz, + gint interval); +GLIB_AVAILABLE_IN_ALL +gint32 g_time_zone_get_offset (GTimeZone *tz, + gint interval); +GLIB_AVAILABLE_IN_ALL +gboolean g_time_zone_is_dst (GTimeZone *tz, + gint interval); + +G_END_DECLS + +#endif /* __G_TIME_ZONE_H__ */ diff --git a/glib/gtrashstack.c b/glib/gtrashstack.c new file mode 100644 index 0000000..71eca13 --- /dev/null +++ b/glib/gtrashstack.c @@ -0,0 +1,94 @@ +/* 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/. + */ + +#include "config.h" + +/** + * SECTION:trash_stack + * @title: Trash Stacks + * @short_description: 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. + */ + +/** + * GTrashStack: + * @next: pointer to the previous element of the stack, + * gets stored in the first sizeof (gpointer) + * bytes of the element + * + * Each piece of memory that is pushed onto the stack + * is cast to a GTrashStack*. + */ + +/** + * g_trash_stack_push: + * @stack_p: a #GTrashStack + * @data_p: the piece of memory to push on the stack + * + * Pushes a piece of memory onto a #GTrashStack. + */ + +/** + * g_trash_stack_pop: + * @stack_p: a #GTrashStack + * + * Pops a piece of memory off a #GTrashStack. + * + * Returns: the element at the top of the stack + */ + +/** + * g_trash_stack_peek: + * @stack_p: a #GTrashStack + * + * Returns the element at the top of a #GTrashStack + * which may be %NULL. + * + * Returns: the element at the top of the stack + */ + +/** + * g_trash_stack_height: + * @stack_p: a #GTrashStack + * + * 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. + * + * Returns: the height of the stack + */ + +#define G_IMPLEMENT_INLINES 1 +#define __G_TRASH_STACK_C__ +#include "gtrashstack.h" diff --git a/glib/gtrashstack.h b/glib/gtrashstack.h new file mode 100644 index 0000000..bff504d --- /dev/null +++ b/glib/gtrashstack.h @@ -0,0 +1,103 @@ +/* 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_TRASH_STACK_H__ +#define __G_TRASH_STACK_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +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); + +#if defined (G_CAN_INLINE) || defined (__G_TRASH_STACK_C__) + +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_TRASH_STACK_C__ */ + +G_END_DECLS + +#endif /* __G_UTILS_H__ */ diff --git a/glib/gtree.c b/glib/gtree.c new file mode 100644 index 0000000..c6b3eea --- /dev/null +++ b/glib/gtree.c @@ -0,0 +1,1414 @@ +/* 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 "gtree.h" + +#include "gatomic.h" +#include "gtestutils.h" +#include "gslice.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 (right) - height (left) */ + 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(). + * + * 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. + * + * Returns: %TRUE to stop the traversal. + **/ +/** + * 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 @search_func + * + * 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 the corresponding value is returned as + * the result of g_tree_search(). 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; + 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; + 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 diff --git a/glib/gtree.h b/glib/gtree.h new file mode 100644 index 0000000..34cb8bb --- /dev/null +++ b/glib/gtree.h @@ -0,0 +1,106 @@ +/* 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_TREE_H__ +#define __G_TREE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +typedef struct _GTree GTree; + +typedef gboolean (*GTraverseFunc) (gpointer key, + gpointer value, + gpointer data); + +/* Balanced binary trees + */ +GLIB_AVAILABLE_IN_ALL +GTree* g_tree_new (GCompareFunc key_compare_func); +GLIB_AVAILABLE_IN_ALL +GTree* g_tree_new_with_data (GCompareDataFunc key_compare_func, + gpointer key_compare_data); +GLIB_AVAILABLE_IN_ALL +GTree* g_tree_new_full (GCompareDataFunc key_compare_func, + gpointer key_compare_data, + GDestroyNotify key_destroy_func, + GDestroyNotify value_destroy_func); +GLIB_AVAILABLE_IN_ALL +GTree* g_tree_ref (GTree *tree); +GLIB_AVAILABLE_IN_ALL +void g_tree_unref (GTree *tree); +GLIB_AVAILABLE_IN_ALL +void g_tree_destroy (GTree *tree); +GLIB_AVAILABLE_IN_ALL +void g_tree_insert (GTree *tree, + gpointer key, + gpointer value); +GLIB_AVAILABLE_IN_ALL +void g_tree_replace (GTree *tree, + gpointer key, + gpointer value); +GLIB_AVAILABLE_IN_ALL +gboolean g_tree_remove (GTree *tree, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +gboolean g_tree_steal (GTree *tree, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +gpointer g_tree_lookup (GTree *tree, + gconstpointer key); +GLIB_AVAILABLE_IN_ALL +gboolean g_tree_lookup_extended (GTree *tree, + gconstpointer lookup_key, + gpointer *orig_key, + gpointer *value); +GLIB_AVAILABLE_IN_ALL +void g_tree_foreach (GTree *tree, + GTraverseFunc func, + gpointer user_data); + +GLIB_DEPRECATED +void g_tree_traverse (GTree *tree, + GTraverseFunc traverse_func, + GTraverseType traverse_type, + gpointer user_data); + +GLIB_AVAILABLE_IN_ALL +gpointer g_tree_search (GTree *tree, + GCompareFunc search_func, + gconstpointer user_data); +GLIB_AVAILABLE_IN_ALL +gint g_tree_height (GTree *tree); +GLIB_AVAILABLE_IN_ALL +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..57829e2 --- /dev/null +++ b/glib/gtypes.h @@ -0,0 +1,484 @@ +/* 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_TYPES_H__ +#define __G_TYPES_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#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); + +/** + * GFreeFunc: + * @data: a data pointer + * + * 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+. + */ +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 __GNUC__ >= 4 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 3 +# define GUINT32_SWAP_LE_BE(val) ((guint32) __builtin_bswap32 ((gint32) val)) +# define GUINT64_SWAP_LE_BE(val) ((guint64) __builtin_bswap64 ((gint64) val)) +# endif + +# if defined (__i386__) +# define GUINT16_SWAP_LE_BE_IA32(val) \ + (G_GNUC_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) \ + (G_GNUC_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) \ + (G_GNUC_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) \ + (G_GNUC_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)) +# ifndef GUINT32_SWAP_LE_BE +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA32 (val)) +# endif +# ifndef GUINT64_SWAP_LE_BE +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA32 (val)) +# endif +# elif defined (__ia64__) +# define GUINT16_SWAP_LE_BE_IA64(val) \ + (G_GNUC_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) \ + (G_GNUC_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) \ + (G_GNUC_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)) +# ifndef GUINT32_SWAP_LE_BE +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_IA64 (val)) +# endif +# ifndef GUINT64_SWAP_LE_BE +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_IA64 (val)) +# endif +# elif defined (__x86_64__) +# define GUINT32_SWAP_LE_BE_X86_64(val) \ + (G_GNUC_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) \ + (G_GNUC_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)) +# ifndef GUINT32_SWAP_LE_BE +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_X86_64 (val)) +# endif +# ifndef GUINT64_SWAP_LE_BE +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_X86_64 (val)) +# endif +# else /* generic gcc */ +# define GUINT16_SWAP_LE_BE(val) (GUINT16_SWAP_LE_BE_CONSTANT (val)) +# ifndef GUINT32_SWAP_LE_BE +# define GUINT32_SWAP_LE_BE(val) (GUINT32_SWAP_LE_BE_CONSTANT (val)) +# endif +# ifndef GUINT64_SWAP_LE_BE +# define GUINT64_SWAP_LE_BE(val) (GUINT64_SWAP_LE_BE_CONSTANT (val)) +# endif +# 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 _GLIB_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..4b4f0e2 --- /dev/null +++ b/glib/gunibreak.c @@ -0,0 +1,61 @@ +/* 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 "gunibreak.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); +} diff --git a/glib/gunibreak.h b/glib/gunibreak.h new file mode 100644 index 0000000..86d0f55 --- /dev/null +++ b/glib/gunibreak.h @@ -0,0 +1,20548 @@ +/* This file is automatically generated. DO NOT EDIT! + Instead, edit gen-unicode-tables.pl and re-run. */ + +#ifndef BREAKTABLES_H +#define BREAKTABLES_H + +#include +#include + +#define G_UNICODE_DATA_VERSION "6.2.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_PARANTHESIS, + 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_PARANTHESIS, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_PREFIX, + 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_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, 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_ALPHABETIC, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_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_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 8, index 7 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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 + }, + { /* page 9, index 8 */ + 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_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_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_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_POSTFIX, + 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_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 10, 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_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_ALPHABETIC, 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 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_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_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_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 11 */ + 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 12 */ + 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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_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 13 */ + 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_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 + }, + { /* page 15, index 14 */ + 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_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_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NON_BREAKING_GLUE, + G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 15 */ + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_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_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, 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 17, index 16 */ + 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_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_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_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_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_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 + }, + { /* page 18, 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 18 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, 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 19 */ + 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 21 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 22 */ + 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 25, 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_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_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_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_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_COMPLEX_CONTEXT, 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 24 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_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_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_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_COMBINING_MARK, + 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_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_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 25 */ + G_UNICODE_BREAK_COMBINING_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_ALPHABETIC, 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_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, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC + }, + { /* page 28, 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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_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_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_UNKNOWN, 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 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK + }, + { /* page 31, index 28 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 29 */ + 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_POSTFIX, 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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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 30 */ + 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_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_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_AMBIGUOUS, + G_UNICODE_BREAK_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 31 */ + 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 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_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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 36, index 33 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 34 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_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 35 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + 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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + 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_IDEOGRAPHIC, 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_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + 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_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC + }, + { /* page 39, index 36 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_ALPHABETIC, + 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 40 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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 41 */ + 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_AFTER, G_UNICODE_BREAK_ALPHABETIC, + 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_BEFORE_AND_AFTER, G_UNICODE_BREAK_BEFORE_AND_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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 42 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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 43 */ + 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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_NON_STARTER, + G_UNICODE_BREAK_IDEOGRAPHIC + }, + { /* page 49, index 44 */ + 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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER + }, + { /* page 50, 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_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_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 + }, + { /* 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_UNKNOWN, G_UNICODE_BREAK_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_ALPHABETIC, G_UNICODE_BREAK_AFTER, 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 + }, + { /* 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_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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 + }, + { /* 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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, + 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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_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_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_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_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_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, 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_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 + }, + { /* 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_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_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_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_AFTER, + G_UNICODE_BREAK_AFTER, 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 + }, + { /* page 171, index 54 */ + 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_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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 + }, + { /* page 172, index 55 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 61 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 62 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 68 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 69 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 75 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 76 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 82 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 83 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 89 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 90 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 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_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 96 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 97 */ + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + 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 98 */ + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_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_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_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 + }, + { /* 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_HEBREW_LETTER, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_HEBREW_LETTER, G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 + }, + { /* page 267, 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_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, 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 268, 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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 270, index 113 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 272, index 114 */ + 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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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 + }, + { /* page 273, index 115 */ + 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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_AFTER, G_UNICODE_BREAK_AFTER, + 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_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 278, index 116 */ + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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_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 + }, + { /* page 291, 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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 306, 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_OPEN_PUNCTUATION, G_UNICODE_BREAK_OPEN_PUNCTUATION, + G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_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_CLOSE_PUNCTUATION, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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 307, 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_OPEN_PUNCTUATION, + G_UNICODE_BREAK_CLOSE_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 + }, + { /* page 308, 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_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, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 362, index 122 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 367, index 123 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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_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_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 432, index 124 */ + 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, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 125 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 126 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 127 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 128 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 129 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_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 130 */ + G_UNICODE_BREAK_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 131 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 132 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 494, index 133 */ + 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_UNKNOWN, 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_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_UNKNOWN, 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_ALPHABETIC, 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_UNKNOWN, 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_UNKNOWN, + 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_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_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_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_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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 496, index 134 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 497, index 135 */ + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, 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_ALPHABETIC, 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_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + 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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR, + G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR + }, + { /* page 498, index 136 */ + 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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 499, index 137 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_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_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + 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 500, index 138 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_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_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + }, + { /* page 501, index 139 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_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_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_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 + }, + { /* page 502, index 140 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_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_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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 + }, + { /* page 503, index 141 */ + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_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 + }, + { /* page 767, index 142 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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 + }, + { /* page 1023, index 143 */ + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_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 + }, + { /* page 3584, index 144 */ + 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 145 */ + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_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 */, + 7 /* page 8 */, + 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_BREAK_ALPHABETIC + 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 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 28 /* page 31 */, + 29 /* page 32 */, + 30 /* page 33 */, + 31 /* page 34 */, + 32 /* page 35 */, + 33 /* page 36 */, + 34 /* page 37 */, + 35 /* page 38 */, + 36 /* page 39 */, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 37 /* page 41 */, + G_UNICODE_BREAK_ALPHABETIC + 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_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_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 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, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 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 */, + 54 /* page 171 */, + 55 /* page 172 */, + 56 /* page 173 */, + 57 /* page 174 */, + 58 /* page 175 */, + 59 /* page 176 */, + 60 /* page 177 */, + 61 /* page 178 */, + 62 /* page 179 */, + 63 /* page 180 */, + 64 /* page 181 */, + 65 /* page 182 */, + 66 /* page 183 */, + 67 /* page 184 */, + 68 /* page 185 */, + 69 /* page 186 */, + 70 /* page 187 */, + 71 /* page 188 */, + 72 /* page 189 */, + 73 /* page 190 */, + 74 /* page 191 */, + 75 /* page 192 */, + 76 /* page 193 */, + 77 /* page 194 */, + 78 /* page 195 */, + 79 /* page 196 */, + 80 /* page 197 */, + 81 /* page 198 */, + 82 /* page 199 */, + 83 /* page 200 */, + 84 /* page 201 */, + 85 /* page 202 */, + 86 /* page 203 */, + 87 /* page 204 */, + 88 /* page 205 */, + 89 /* page 206 */, + 90 /* page 207 */, + 91 /* page 208 */, + 92 /* page 209 */, + 93 /* page 210 */, + 94 /* page 211 */, + 95 /* page 212 */, + 96 /* page 213 */, + 97 /* page 214 */, + 98 /* 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, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + 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 */, + 111 /* page 267 */, + 112 /* page 268 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 113 /* page 270 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 114 /* page 272 */, + 115 /* page 273 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 116 /* page 278 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_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, + 117 /* page 291 */, + 118 /* 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_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_ALPHABETIC + G_UNICODE_MAX_TABLE_INDEX, + 119 /* page 306 */, + 120 /* page 307 */, + 121 /* page 308 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_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, + 122 /* page 362 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 123 /* page 367 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 124 /* page 432 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 125 /* page 464 */, + 126 /* page 465 */, + 127 /* page 466 */, + 128 /* page 467 */, + 129 /* page 468 */, + 130 /* page 469 */, + 131 /* page 470 */, + 132 /* 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, + 133 /* page 494 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + 134 /* page 496 */, + 135 /* page 497 */, + 136 /* page 498 */, + 137 /* page 499 */, + 138 /* page 500 */, + 139 /* page 501 */, + 140 /* page 502 */, + 141 /* page 503 */, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_UNKNOWN + G_UNICODE_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, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_BREAK_IDEOGRAPHIC + G_UNICODE_MAX_TABLE_INDEX +}; + +/* U+E0000 through U+10FFFF */ +static const gint16 break_property_table_part2[768] = { + 144 /* page 3584 */, + 145 /* 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..e57f447 --- /dev/null +++ b/glib/gunichartables.h @@ -0,0 +1,15149 @@ +/* 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 "6.2.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_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_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_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_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_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_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_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_CURRENCY_SYMBOL, + 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_FORMAT, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_NON_SPACING_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_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_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_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 8, index 8 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_MODIFIER_LETTER, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, 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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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 + }, + { /* page 9, index 9 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, 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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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_SPACING_MARK, + G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_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_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_SPACING_MARK, G_UNICODE_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_SPACING_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_CURRENCY_SYMBOL, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED + }, + { /* page 10, index 10 */ + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_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_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_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_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_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_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_OTHER_PUNCTUATION, 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 11 */ + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_SPACING_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_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_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_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_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_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 12 */ + G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_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_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_SPACING_MARK, G_UNICODE_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_SPACING_MARK, G_UNICODE_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_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_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 + }, + { /* page 13, index 13 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_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_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_SPACING_MARK, G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_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_UNASSIGNED, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_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 14 */ + 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_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 + }, + { /* page 15, index 15 */ + 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_PUNCTUATION, + 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_SPACING_MARK, + G_UNICODE_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_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_SPACING_MARK, + G_UNICODE_NON_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_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_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_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + 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 + }, + { /* page 16, 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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_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_SPACING_MARK, + G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, + G_UNICODE_SPACING_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + 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_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_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_PUNCTUATION, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER + }, + { /* 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_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_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_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_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, 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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 + }, + { /* 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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_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_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_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + 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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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_NON_SPACING_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_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_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_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + 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_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_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_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_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_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION + }, + { /* 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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_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_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_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, 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 + }, + { /* 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_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_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_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, 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_MODIFIER_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_MODIFIER_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_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_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_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_MATH_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_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_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_OTHER_NUMBER, 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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 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_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, 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 39, index 36 */ + 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_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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_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_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 + }, + { /* 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_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_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_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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + 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_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_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_LOWERCASE_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_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_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_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_UNASSIGNED, G_UNICODE_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_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_DASH_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_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_SPACING_MARK, + G_UNICODE_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_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_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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 + }, + { /* 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 + }, + { /* 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_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_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_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_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_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_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_UPPERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, + 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_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_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_MODIFIER_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 + }, + { /* 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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_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_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_CURRENCY_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_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_SPACING_MARK, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_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_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_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_LETTER, + 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_SPACING_MARK, G_UNICODE_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_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_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_MODIFIER_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_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 + }, + { /* 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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_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_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_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_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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, + G_UNICODE_SPACING_MARK, 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_NON_SPACING_MARK, 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_OTHER_LETTER, 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_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, 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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_LETTER, G_UNICODE_MODIFIER_LETTER, + G_UNICODE_MODIFIER_LETTER, G_UNICODE_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 + }, + { /* page 171, index 55 */ + 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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_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_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_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 + }, + { /* page 215, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 + }, + { /* page 250, index 57 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 58 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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 59 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 60 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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 61 */ + 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 62 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 63 */ + 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_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 64 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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 65 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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 66 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_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 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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_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, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + 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 68 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_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 + }, + { /* page 266, index 69 */ + 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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_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_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 267, index 70 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_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 + }, + { /* page 268, index 71 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_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 + }, + { /* page 270, index 72 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_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_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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 272, index 73 */ + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_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_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_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_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_FORMAT, + 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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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 + }, + { /* page 273, index 74 */ + 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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_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_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_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, 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_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 278, index 75 */ + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_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_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 + }, + { /* page 291, index 76 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 77 */ + 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 308, index 78 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 + }, + { /* page 362, index 79 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 + }, + { /* page 367, 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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, 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 432, index 81 */ + 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, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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 82 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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 83 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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_SPACING_MARK, + G_UNICODE_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_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_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 84 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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 85 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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 86 */ + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_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 87 */ + 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 88 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_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 89 */ + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_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 494, index 90 */ + 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_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_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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_OTHER_LETTER, 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_UNASSIGNED, + 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_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, + 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_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_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_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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 496, index 91 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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 497, index 92 */ + 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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 + }, + { /* page 498, index 93 */ + 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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_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, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 499, index 94 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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_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_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_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_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_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_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_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 + }, + { /* page 500, index 95 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_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_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED + }, + { /* page 501, index 96 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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 + }, + { /* page 502, index 97 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_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, + G_UNICODE_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 + }, + { /* page 503, index 98 */ + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_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, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, 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 99 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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 695, index 100 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_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_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, 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 696, index 101 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 762, index 102 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_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 103 */ + 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 104 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_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 105 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_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 106 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_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 */, + 8 /* page 8 */, + 9 /* page 9 */, + 10 /* page 10 */, + 11 /* page 11 */, + 12 /* page 12 */, + 13 /* page 13 */, + 14 /* page 14 */, + 15 /* page 15 */, + 16 /* page 16 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 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 */, + 55 /* page 171 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 56 /* 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, + 57 /* page 250 */, + 58 /* page 251 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 59 /* page 253 */, + 60 /* page 254 */, + 61 /* page 255 */, + 62 /* page 256 */, + 63 /* page 257 */, + 64 /* page 258 */, + 65 /* page 259 */, + 66 /* 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, + 67 /* page 264 */, + 68 /* page 265 */, + 69 /* page 266 */, + 70 /* page 267 */, + 71 /* page 268 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 72 /* page 270 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 73 /* page 272 */, + 74 /* page 273 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 75 /* page 278 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_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, + 76 /* page 291 */, + 77 /* 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_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 78 /* page 308 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_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, + 79 /* page 362 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 80 /* page 367 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 81 /* page 432 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 82 /* page 464 */, + 83 /* page 465 */, + 84 /* page 466 */, + 85 /* page 467 */, + 86 /* page 468 */, + 87 /* page 469 */, + 88 /* page 470 */, + 89 /* 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, + 90 /* page 494 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + 91 /* page 496 */, + 92 /* page 497 */, + 93 /* page 498 */, + 94 /* page 499 */, + 95 /* page 500 */, + 96 /* page 501 */, + 97 /* page 502 */, + 98 /* page 503 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_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, + 99 /* page 678 */, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 100 /* page 695 */, + 101 /* page 696 */, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_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, + 102 /* page 762 */ +}; + +/* U+E0000 through U+10FFFF */ +static const gint16 type_table_part2[768] = { + 103 /* page 3584 */, + 104 /* 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, + 105 /* 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, + 106 /* 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, + 0x2c7e, 0x2c7f, 0x0242, 0x0241, 0x0180, 0x0289, 0x028c, 0x0247, 0x0246, + 0x0249, 0x0248, 0x024b, 0x024a, 0x024d, 0x024c, 0x024f, 0x024e, 0x2c6f, + 0x2c6d, 0x2c70, 0x0181, 0x0186, 0x0000, 0x0189, 0x018a, 0x0000, 0x018f, + 0x0000, 0x0190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0193, 0x0000, 0x0000, + 0x0194, 0x0000, 0xa78d, 0xa7aa, 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, + 0x0525, 0x0524, 0x0527, 0x0526, 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, 0x2d27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2d2d, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 26, 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, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 + }, + { /* page 27, 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, 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 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, 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 22 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 23 */ + 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 24 */ + 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 25 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 26 */ + 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, 0x0252, 0x0000, 0x2c73, 0x2c72, 0x0000, + 0x2c76, 0x2c75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x023f, 0x0240, 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, 0x2cec, 0x2ceb, 0x2cee, 0x2ced, 0x0000, 0x0000, 0x0000, 0x2cf3, + 0x2cf2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000 + }, + { /* page 45, index 27 */ + 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, 0x10c7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 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, 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, 0xa661, 0xa660, 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 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, 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, 0x0265, 0x0000, 0x0000, + 0xa791, 0xa790, 0xa793, 0xa792, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa7a1, 0xa7a0, + 0xa7a3, 0xa7a2, 0xa7a5, 0xa7a4, 0xa7a7, 0xa7a6, 0xa7a9, 0xa7a8, 0x0266, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 30 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 31 */ + 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, 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 170, index 32 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 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 171, index 33 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 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 251, index 34 */ + 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 35 */ + 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 36 */ + 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 272, index 37 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 + }, + { /* page 273, index 38 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 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, 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 278, index 39 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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 471, index 40 */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 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 */, + 19 /* page 26 */, + 20 /* page 27 */, + 21 /* page 28 */, + 22 /* page 29 */, + 23 /* page 30 */, + 24 /* page 31 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 25 /* 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, + 26 /* page 44 */, + 27 /* 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, + 28 /* page 166 */, + 29 /* page 167 */, + 30 /* page 168 */, + 31 /* page 169 */, + 32 /* page 170 */, + 33 /* page 171 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 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 251 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 35 /* 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, + 36 /* 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, + 37 /* page 272 */, + 38 /* page 273 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 39 /* page 278 */, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 0x0000 + G_UNICODE_MAX_TABLE_INDEX, + 40 /* 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..d51fa43 --- /dev/null +++ b/glib/gunicode.h @@ -0,0 +1,813 @@ +/* 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. + */ + +#ifndef __G_UNICODE_H__ +#define __G_UNICODE_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +/** + * 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); + * ]| + */ +typedef guint32 gunichar; + +/** + * gunichar2: + * + * 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. + */ +typedef guint16 gunichar2; + +/** + * GUnicodeType: + * @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_SPACING_MARK: General category "Mark, Spacing" (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) + * + * These are the possible character classifications from the + * Unicode specification. + * See http://www.unicode.org/Public/UNIDATA/UnicodeData.html. + */ +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_SPACING_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; + +/** + * G_UNICODE_COMBINING_MARK: + * + * Older name for %G_UNICODE_SPACING_MARK. + * + * Deprecated: 2.30: Use %G_UNICODE_SPACING_MARK. + */ +#ifndef G_DISABLE_DEPRECATED +#define G_UNICODE_COMBINING_MARK G_UNICODE_SPACING_MARK +#endif + +/** + * GUnicodeBreakType: + * @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_UNICODE_BREAK_CLOSE_PARANTHESIS: Closing Parenthesis (CP). Since 2.28 + * @G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER: Conditional Japanese Starter (CJ). Since: 2.32 + * @G_UNICODE_BREAK_HEBREW_LETTER: Hebrew Letter (HL). Since: 2.32 + * @G_UNICODE_BREAK_REGIONAL_INDICATOR: Regional Indicator (RI). Since: 2.36 + * + * These are the possible line break classifications. + * + * Since new unicode versions may add new types here, 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/. + */ +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, + G_UNICODE_BREAK_CLOSE_PARANTHESIS, + G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, + G_UNICODE_BREAK_HEBREW_LETTER, + G_UNICODE_BREAK_REGIONAL_INDICATOR +} GUnicodeBreakType; + +/** + * GUnicodeScript: + * @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 + * i 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_UNICODE_SCRIPT_AVESTAN: Avestan. Since 2.26 + * @G_UNICODE_SCRIPT_BAMUM: Bamum. Since 2.26 + * @G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS: + * Egyptian Hieroglpyhs. Since 2.26 + * @G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC: + * Imperial Aramaic. Since 2.26 + * @G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI: + * Inscriptional Pahlavi. Since 2.26 + * @G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN: + * Inscriptional Parthian. Since 2.26 + * @G_UNICODE_SCRIPT_JAVANESE: Javanese. Since 2.26 + * @G_UNICODE_SCRIPT_KAITHI: Kaithi. Since 2.26 + * @G_UNICODE_SCRIPT_LISU: Lisu. Since 2.26 + * @G_UNICODE_SCRIPT_MEETEI_MAYEK: + * Meetei Mayek. Since 2.26 + * @G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN: + * Old South Arabian. Since 2.26 + * @G_UNICODE_SCRIPT_OLD_TURKIC: Old Turkic. Since 2.28 + * @G_UNICODE_SCRIPT_SAMARITAN: Samaritan. Since 2.26 + * @G_UNICODE_SCRIPT_TAI_THAM: Tai Tham. Since 2.26 + * @G_UNICODE_SCRIPT_TAI_VIET: Tai Viet. Since 2.26 + * @G_UNICODE_SCRIPT_BATAK: Batak. Since 2.28 + * @G_UNICODE_SCRIPT_BRAHMI: Brahmi. Since 2.28 + * @G_UNICODE_SCRIPT_MANDAIC: Mandaic. Since 2.28 + * @G_UNICODE_SCRIPT_CHAKMA: Chakma. Since: 2.32 + * @G_UNICODE_SCRIPT_MEROITIC_CURSIVE: Meroitic Cursive. Since: 2.32 + * @G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS: Meroitic Hieroglyphs. Since: 2.32 + * @G_UNICODE_SCRIPT_MIAO: Miao. Since: 2.32 + * @G_UNICODE_SCRIPT_SHARADA: Sharada. Since: 2.32 + * @G_UNICODE_SCRIPT_SORA_SOMPENG: Sora Sompeng. Since: 2.32 + * @G_UNICODE_SCRIPT_TAKRI: Takri. Since: 2.32 + * + * 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. + */ +typedef enum +{ /* ISO 15924 code */ + G_UNICODE_SCRIPT_INVALID_CODE = -1, + G_UNICODE_SCRIPT_COMMON = 0, /* Zyyy */ + G_UNICODE_SCRIPT_INHERITED, /* Zinh (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, /* Copt (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 */ + + /* Unicode-5.2 additions */ + G_UNICODE_SCRIPT_AVESTAN, /* Avst */ + G_UNICODE_SCRIPT_BAMUM, /* Bamu */ + G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, /* Egyp */ + G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, /* Armi */ + G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, /* Phli */ + G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, /* Prti */ + G_UNICODE_SCRIPT_JAVANESE, /* Java */ + G_UNICODE_SCRIPT_KAITHI, /* Kthi */ + G_UNICODE_SCRIPT_LISU, /* Lisu */ + G_UNICODE_SCRIPT_MEETEI_MAYEK, /* Mtei */ + G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, /* Sarb */ + G_UNICODE_SCRIPT_OLD_TURKIC, /* Orkh */ + G_UNICODE_SCRIPT_SAMARITAN, /* Samr */ + G_UNICODE_SCRIPT_TAI_THAM, /* Lana */ + G_UNICODE_SCRIPT_TAI_VIET, /* Tavt */ + + /* Unicode-6.0 additions */ + G_UNICODE_SCRIPT_BATAK, /* Batk */ + G_UNICODE_SCRIPT_BRAHMI, /* Brah */ + G_UNICODE_SCRIPT_MANDAIC, /* Mand */ + + /* Unicode-6.1 additions */ + G_UNICODE_SCRIPT_CHAKMA, /* Cakm */ + G_UNICODE_SCRIPT_MEROITIC_CURSIVE, /* Merc */ + G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, /* Mero */ + G_UNICODE_SCRIPT_MIAO, /* Plrd */ + G_UNICODE_SCRIPT_SHARADA, /* Shrd */ + G_UNICODE_SCRIPT_SORA_SOMPENG, /* Sora */ + G_UNICODE_SCRIPT_TAKRI /* Takr */ +} GUnicodeScript; + +GLIB_AVAILABLE_IN_ALL +guint32 g_unicode_script_to_iso15924 (GUnicodeScript script); +GLIB_AVAILABLE_IN_ALL +GUnicodeScript g_unicode_script_from_iso15924 (guint32 iso15924); + +/* These are all analogs of the functions. + */ +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isalnum (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isalpha (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_iscntrl (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isdigit (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isgraph (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_islower (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isprint (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_ispunct (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isspace (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isupper (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isxdigit (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_istitle (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_isdefined (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_iswide (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_iswide_cjk(gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_iszerowidth(gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +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. */ +GLIB_AVAILABLE_IN_ALL +gunichar g_unichar_toupper (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gunichar g_unichar_tolower (gunichar c) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +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. */ +GLIB_AVAILABLE_IN_ALL +gint g_unichar_digit_value (gunichar c) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gint g_unichar_xdigit_value (gunichar c) G_GNUC_CONST; + +/* Return the Unicode character type of a given character. */ +GLIB_AVAILABLE_IN_ALL +GUnicodeType g_unichar_type (gunichar c) G_GNUC_CONST; + +/* Return the line break property for a given character */ +GLIB_AVAILABLE_IN_ALL +GUnicodeBreakType g_unichar_break_type (gunichar c) G_GNUC_CONST; + +/* Returns the combining class for a given character */ +GLIB_AVAILABLE_IN_ALL +gint g_unichar_combining_class (gunichar uc) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_get_mirror_char (gunichar ch, + gunichar *mirrored_ch); + +GLIB_AVAILABLE_IN_ALL +GUnicodeScript g_unichar_get_script (gunichar ch) G_GNUC_CONST; + +/* Validate a Unicode character */ +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_validate (gunichar ch) G_GNUC_CONST; + +/* Pairwise canonical compose/decompose */ +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_compose (gunichar a, + gunichar b, + gunichar *ch); +GLIB_AVAILABLE_IN_ALL +gboolean g_unichar_decompose (gunichar ch, + gunichar *a, + gunichar *b); + +GLIB_AVAILABLE_IN_ALL +gsize g_unichar_fully_decompose (gunichar ch, + gboolean compat, + gunichar *result, + gsize result_len); + +/** + * G_UNICHAR_MAX_DECOMPOSITION_LENGTH: + * + * The maximum length (in codepoints) of a compatibility or canonical + * decomposition of a single Unicode character. + * + * This is as defined by Unicode 6.1. + * + * Since: 2.32 + */ +#define G_UNICHAR_MAX_DECOMPOSITION_LENGTH 18 /* codepoints */ + +/* 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. */ +GLIB_AVAILABLE_IN_ALL +void g_unicode_canonical_ordering (gunichar *string, + gsize len); + + +GLIB_DEPRECATED_IN_2_30 +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; + +/** + * g_utf8_next_char: + * @p: Pointer to the start of a valid UTF-8 character + * + * 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. + */ +#define g_utf8_next_char(p) (char *)((p) + g_utf8_skip[*(const guchar *)(p)]) + +GLIB_AVAILABLE_IN_ALL +gunichar g_utf8_get_char (const gchar *p) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gunichar g_utf8_get_char_validated (const gchar *p, + gssize max_len) G_GNUC_PURE; + +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_offset_to_pointer (const gchar *str, + glong offset) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +glong g_utf8_pointer_to_offset (const gchar *str, + const gchar *pos) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_prev_char (const gchar *p) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_find_next_char (const gchar *p, + const gchar *end) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_find_prev_char (const gchar *str, + const gchar *p) G_GNUC_PURE; + +GLIB_AVAILABLE_IN_ALL +glong g_utf8_strlen (const gchar *p, + gssize max) G_GNUC_PURE; + +GLIB_AVAILABLE_IN_2_30 +gchar *g_utf8_substring (const gchar *str, + glong start_pos, + glong end_pos) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +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 */ +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_strchr (const gchar *p, + gssize len, + gunichar c); +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_strrchr (const gchar *p, + gssize len, + gunichar c); +GLIB_AVAILABLE_IN_ALL +gchar* g_utf8_strreverse (const gchar *str, + gssize len); + +GLIB_AVAILABLE_IN_ALL +gunichar2 *g_utf8_to_utf16 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gunichar * g_utf8_to_ucs4 (const gchar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gunichar * g_utf8_to_ucs4_fast (const gchar *str, + glong len, + glong *items_written) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gunichar * g_utf16_to_ucs4 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_utf16_to_utf8 (const gunichar2 *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gunichar2 *g_ucs4_to_utf16 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar* g_ucs4_to_utf8 (const gunichar *str, + glong len, + glong *items_read, + glong *items_written, + GError **error) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gint g_unichar_to_utf8 (gunichar c, + gchar *outbuf); + +GLIB_AVAILABLE_IN_ALL +gboolean g_utf8_validate (const gchar *str, + gssize max_len, + const gchar **end); + +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_strup (const gchar *str, + gssize len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_strdown (const gchar *str, + gssize len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_casefold (const gchar *str, + gssize len) G_GNUC_MALLOC; + +/** + * GNormalizeMode: + * @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 + * + * 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. + */ +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; + +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_normalize (const gchar *str, + gssize len, + GNormalizeMode mode) G_GNUC_MALLOC; + +GLIB_AVAILABLE_IN_ALL +gint g_utf8_collate (const gchar *str1, + const gchar *str2) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_collate_key (const gchar *str, + gssize len) G_GNUC_MALLOC; +GLIB_AVAILABLE_IN_ALL +gchar *g_utf8_collate_key_for_filename (const gchar *str, + gssize len) G_GNUC_MALLOC; + + +/* 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..c5af3b5 --- /dev/null +++ b/glib/gunicodeprivate.h @@ -0,0 +1,34 @@ +/* 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 "gtypes.h" + +G_BEGIN_DECLS + +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..050dd60 --- /dev/null +++ b/glib/gunicollate.c @@ -0,0 +1,682 @@ +/* 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 "gmem.h" +#include "gunicode.h" +#include "gunicodeprivate.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gcharset.h" +#ifndef __STDC_ISO_10646__ +#include "gconvert.h" +#endif + + +#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 = 0; + const gsize start = 2 * sizeof (void *) / sizeof (UCCollationValue); + gsize i; + + /* The first codes should be skipped: the same string on the same + * system can get different values at runtime in those positions, + * and they do not sort correctly. The exact size of the prefix + * depends on whether we are building 64 or 32 bit. + */ + if (key_len <= start) + return g_strdup (""); + + for (i = start; i < key_len; i++) + result_len += utf8_encode (NULL, g_htonl (key[i] + 1)); + + result = g_malloc (result_len + 1); + result_len = 0; + for (i = start; i < key_len; i++) + result_len += utf8_encode (result + result_len, g_htonl (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 +} diff --git a/glib/gunicomp.h b/glib/gunicomp.h new file mode 100644 index 0000000..f389279 --- /dev/null +++ b/glib/gunicomp.h @@ -0,0 +1,938 @@ +#define COMPOSE_FIRST_START 1 +#define COMPOSE_FIRST_SINGLE_START 147 +#define COMPOSE_SECOND_START 373 +#define COMPOSE_SECOND_SINGLE_START 404 + +#define COMPOSE_TABLE_LAST 273 + +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 */ + 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 384, 0, 0, 385, + 0, 386, 0, 387, 388, 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 390, + 391, 392, 393, 394, 395, 0, 0, 0, 0, 396, 397, 0, 398, 399, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 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, 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, 404, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 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 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, 409, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 0, 0, 0, 0, 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, 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, 412, 0, 0, 0, 0, 0, 0, 0, 102, 219, 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 + }, + { /* 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, 414, 0, 0, 0, 103, 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415, + 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, 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, 417, 0, 0, 0, 0, 0, 0, 0, 104, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 105, 0, 0, 224, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 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, 402, 403, + 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 + }, + { /* page 272, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 273, 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, 371, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 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 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 17 /* page 272 */, + 18 /* page 273 */ +}; + +static const gunichar 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 }, + { 0x110ba, 0x1109a }, + { 0x110ba, 0x1109c }, + { 0x110ba, 0x110ab }, + { 0x11127, 0x1112e }, + { 0x11127, 0x1112f } +}; +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..2ee9894 --- /dev/null +++ b/glib/gunidecomp.c @@ -0,0 +1,751 @@ +/* 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. + */ + +/** + * SECTION:unicode + * @Title: Unicode Manipulation + * @Short_description: functions operating on Unicode characters and + * UTF-8 strings + * @See_also: g_locale_to_utf8(), g_locale_from_utf8() + * + * 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, + * GLib 2.30 supports Unicode 6.0. + */ + +#include "config.h" + +#include + +#include "gunicode.h" +#include "gunidecomp.h" +#include "gmem.h" +#include "gunicomp.h" +#include "gunicodeprivate.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; + gint TIndex = SIndex % TCount; + + if (r) + { + r[0] = LBase + SIndex / NCount; + r[1] = VBase + (SIndex % NCount) / TCount; + } + + if (TIndex) + { + if (r) + r[2] = TBase + TIndex; + *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. + * + * Deprecated: 2.30: Use the more flexible g_unichar_fully_decompose() + * instead. + **/ +gunichar * +g_unicode_canonical_decomposition (gunichar ch, + gsize *result_len) +{ + const gchar *decomp; + const gchar *p; + gunichar *r; + + /* Hangul syllable */ + if (ch >= SBase && ch < SBase + SCount) + { + 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; + } + + 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 >= SBase && wc < SBase + SCount) + { + 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 >= SBase && wc < SBase + SCount) + { + 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; +} + +static gboolean +decompose_hangul_step (gunichar ch, + gunichar *a, + gunichar *b) +{ + gint SIndex, TIndex; + + if (ch < SBase || ch >= SBase + SCount) + return FALSE; /* not a hangul syllable */ + + SIndex = ch - SBase; + TIndex = SIndex % TCount; + + if (TIndex) + { + /* split LVT -> LV,T */ + *a = ch - TIndex; + *b = TBase + TIndex; + } + else + { + /* split LV -> L,V */ + *a = LBase + SIndex / NCount; + *b = VBase + (SIndex % NCount) / TCount; + } + + return TRUE; +} + +/** + * g_unichar_decompose: + * @ch: a Unicode character + * @a: return location for the first component of @ch + * @b: return location for the second component of @ch + * + * Performs a single decomposition step of the + * Unicode canonical decomposition algorithm. + * + * This function does not include compatibility + * decompositions. It does, however, include algorithmic + * Hangul Jamo decomposition, as well as 'singleton' + * decompositions which replace a character by a single + * other character. In the case of singletons *@b will + * be set to zero. + * + * If @ch is not decomposable, *@a is set to @ch and *@b + * is set to zero. + * + * Note that the way Unicode decomposition pairs are + * defined, it is guaranteed that @b would not decompose + * further, but @a may itself decompose. To get the full + * canonical decomposition for @ch, one would need to + * recursively call this function on @a. Or use + * g_unichar_fully_decompose(). + * + * See UAX#15 + * for details. + * + * Returns: %TRUE if the character could be decomposed + * + * Since: 2.30 + */ +gboolean +g_unichar_decompose (gunichar ch, + gunichar *a, + gunichar *b) +{ + gint start = 0; + gint end = G_N_ELEMENTS (decomp_step_table); + + if (decompose_hangul_step (ch, a, b)) + return TRUE; + + /* TODO use bsearch() */ + if (ch >= decomp_step_table[start].ch && + ch <= decomp_step_table[end - 1].ch) + { + while (TRUE) + { + gint half = (start + end) / 2; + const decomposition_step *p = &(decomp_step_table[half]); + if (ch == p->ch) + { + *a = p->a; + *b = p->b; + return TRUE; + } + else if (half == start) + break; + else if (ch > p->ch) + start = half; + else + end = half; + } + } + + *a = ch; + *b = 0; + + return FALSE; +} + +/** + * g_unichar_compose: + * @a: a Unicode character + * @b: a Unicode character + * @ch: return location for the composed character + * + * Performs a single composition step of the + * Unicode canonical composition algorithm. + * + * This function includes algorithmic Hangul Jamo composition, + * but it is not exactly the inverse of g_unichar_decompose(). + * No composition can have either of @a or @b equal to zero. + * To be precise, this function composes if and only if + * there exists a Primary Composite P which is canonically + * equivalent to the sequence <@a,@b>. See the Unicode + * Standard for the definition of Primary Composite. + * + * If @a and @b do not compose a new character, @ch is set to zero. + * + * See UAX#15 + * for details. + * + * Returns: %TRUE if the characters could be composed + * + * Since: 2.30 + */ +gboolean +g_unichar_compose (gunichar a, + gunichar b, + gunichar *ch) +{ + if (combine (a, b, ch)) + return TRUE; + + *ch = 0; + return FALSE; +} + +/** + * g_unichar_fully_decompose: + * @ch: a Unicode character. + * @compat: whether perform canonical or compatibility decomposition + * @result: (allow-none): location to store decomposed result, or %NULL + * @result_len: length of @result + * + * Computes the canonical or compatibility decomposition of a + * Unicode character. For compatibility decomposition, + * pass %TRUE for @compat; for canonical decomposition + * pass %FALSE for @compat. + * + * The decomposed sequence is placed in @result. Only up to + * @result_len characters are written into @result. The length + * of the full decomposition (irrespective of @result_len) is + * returned by the function. For canonical decomposition, + * currently all decompositions are of length at most 4, but + * this may change in the future (very unlikely though). + * At any rate, Unicode does guarantee that a buffer of length + * 18 is always enough for both compatibility and canonical + * decompositions, so that is the size recommended. This is provided + * as %G_UNICHAR_MAX_DECOMPOSITION_LENGTH. + * + * See UAX#15 + * for details. + * + * Return value: the length of the full decomposition. + * + * Since: 2.30 + **/ +gsize +g_unichar_fully_decompose (gunichar ch, + gboolean compat, + gunichar *result, + gsize result_len) +{ + const gchar *decomp; + const gchar *p; + + /* Hangul syllable */ + if (ch >= SBase && ch < SBase + SCount) + { + gsize len, i; + gunichar buffer[3]; + decompose_hangul (ch, result ? buffer : NULL, &len); + if (result) + for (i = 0; i < len && i < result_len; i++) + result[i] = buffer[i]; + return len; + } + else if ((decomp = find_decomposition (ch, compat)) != NULL) + { + /* Found it. */ + gsize len, i; + + len = g_utf8_strlen (decomp, -1); + + for (p = decomp, i = 0; i < len && i < result_len; p = g_utf8_next_char (p), i++) + result[i] = g_utf8_get_char (p); + + return len; + } + + /* Does not decompose */ + if (result && result_len >= 1) + *result = ch; + return 1; +} diff --git a/glib/gunidecomp.h b/glib/gunidecomp.h new file mode 100644 index 0000000..0e94779 --- /dev/null +++ b/glib/gunidecomp.h @@ -0,0 +1,13512 @@ +/* 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, 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 + }, + { /* 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, 230, 230, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 220, 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 8, index 5 */ + 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, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 230, + 230, 230, 0, 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, 220, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 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, 220, 230, 230, 230, 220, 220, 220, + 27, 28, 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230, + 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, 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 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, 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 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, 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 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, 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 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, 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 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, + 0, 0, 0, 0, 0, 0, 0, 0, 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 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, + 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 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, 7, 0, 9, 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, 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 + }, + { /* page 19, 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, 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 + }, + { /* page 23, index 15 */ + 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 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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 17 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 18 */ + 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, + 9, 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, 230, 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, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 27, 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, 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, 9, 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, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 28, 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, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 220, + 220, 220, 220, 220, 230, 230, 220, 220, 220, 220, 230, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + }, + { /* page 29, 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, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 230, 230, 234, + 214, 220, 202, 230, 230, 230, 230, 230, 230, 230, 230, 230, 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, 233, 220, 230, 220 + }, + { /* page 32, index 22 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }, + { /* page 44, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 + }, + { /* page 45, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 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, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230 + }, + { /* page 48, index 25 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 166, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 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, 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, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 168, index 27 */ + 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, 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, 230, 230, 230, 230, 230, 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 + }, + { /* page 169, index 28 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 7, 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 + }, + { /* page 170, index 29 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 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, 230, 230, 220, 0, 0, 230, 230, 0, 0, 0, + 0, 0, 230, 230, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 171, index 30 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 + }, + { /* page 251, index 31 */ + 0, 0, 0, 0, 0, 0, 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 32 */ + 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 257, index 33 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 + }, + { /* page 266, index 34 */ + 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 272, index 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, 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, 9, 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, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 273, index 36 */ + 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, 9, 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, 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 + }, + { /* page 278, index 37 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { /* page 465, index 38 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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 39 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 */, + 5 /* page 8 */, + 6 /* page 9 */, + 7 /* page 10 */, + 8 /* page 11 */, + 9 /* page 12 */, + 10 /* page 13 */, + 11 /* page 14 */, + 12 /* page 15 */, + 13 /* page 16 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 14 /* page 19 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 15 /* page 23 */, + 16 /* page 24 */, + 17 /* page 25 */, + 18 /* page 26 */, + 19 /* page 27 */, + 20 /* page 28 */, + 21 /* page 29 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 22 /* 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, + 23 /* page 44 */, + 24 /* page 45 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 25 /* 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, + 26 /* page 166 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 27 /* page 168 */, + 28 /* page 169 */, + 29 /* page 170 */, + 30 /* page 171 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 31 /* page 251 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 32 /* page 254 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 33 /* page 257 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 34 /* 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, + 35 /* page 272 */, + 36 /* page 273 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 37 /* page 278 */, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 0 + G_UNICODE_MAX_TABLE_INDEX, + 38 /* page 465 */, + 39 /* 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 }, + { 0x2095, G_UNICODE_NOT_PRESENT_OFFSET, 1171 }, + { 0x2096, G_UNICODE_NOT_PRESENT_OFFSET, 2381 }, + { 0x2097, G_UNICODE_NOT_PRESENT_OFFSET, 1220 }, + { 0x2098, G_UNICODE_NOT_PRESENT_OFFSET, 2383 }, + { 0x2099, G_UNICODE_NOT_PRESENT_OFFSET, 5279 }, + { 0x209a, G_UNICODE_NOT_PRESENT_OFFSET, 2399 }, + { 0x209b, G_UNICODE_NOT_PRESENT_OFFSET, 711 }, + { 0x209c, G_UNICODE_NOT_PRESENT_OFFSET, 2401 }, + { 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 }, + { 0x2150, G_UNICODE_NOT_PRESENT_OFFSET, 5364 }, + { 0x2151, G_UNICODE_NOT_PRESENT_OFFSET, 5370 }, + { 0x2152, G_UNICODE_NOT_PRESENT_OFFSET, 5376 }, + { 0x2153, G_UNICODE_NOT_PRESENT_OFFSET, 5383 }, + { 0x2154, G_UNICODE_NOT_PRESENT_OFFSET, 5389 }, + { 0x2155, G_UNICODE_NOT_PRESENT_OFFSET, 5395 }, + { 0x2156, G_UNICODE_NOT_PRESENT_OFFSET, 5401 }, + { 0x2157, G_UNICODE_NOT_PRESENT_OFFSET, 5407 }, + { 0x2158, G_UNICODE_NOT_PRESENT_OFFSET, 5413 }, + { 0x2159, G_UNICODE_NOT_PRESENT_OFFSET, 5419 }, + { 0x215a, G_UNICODE_NOT_PRESENT_OFFSET, 5425 }, + { 0x215b, G_UNICODE_NOT_PRESENT_OFFSET, 5431 }, + { 0x215c, G_UNICODE_NOT_PRESENT_OFFSET, 5437 }, + { 0x215d, G_UNICODE_NOT_PRESENT_OFFSET, 5443 }, + { 0x215e, G_UNICODE_NOT_PRESENT_OFFSET, 5449 }, + { 0x215f, G_UNICODE_NOT_PRESENT_OFFSET, 5455 }, + { 0x2160, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x2161, G_UNICODE_NOT_PRESENT_OFFSET, 5460 }, + { 0x2162, G_UNICODE_NOT_PRESENT_OFFSET, 5463 }, + { 0x2163, G_UNICODE_NOT_PRESENT_OFFSET, 5467 }, + { 0x2164, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x2165, G_UNICODE_NOT_PRESENT_OFFSET, 5472 }, + { 0x2166, G_UNICODE_NOT_PRESENT_OFFSET, 5475 }, + { 0x2167, G_UNICODE_NOT_PRESENT_OFFSET, 5479 }, + { 0x2168, G_UNICODE_NOT_PRESENT_OFFSET, 5484 }, + { 0x2169, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x216a, G_UNICODE_NOT_PRESENT_OFFSET, 5489 }, + { 0x216b, G_UNICODE_NOT_PRESENT_OFFSET, 5492 }, + { 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, 5496 }, + { 0x2172, G_UNICODE_NOT_PRESENT_OFFSET, 5499 }, + { 0x2173, G_UNICODE_NOT_PRESENT_OFFSET, 5503 }, + { 0x2174, G_UNICODE_NOT_PRESENT_OFFSET, 2412 }, + { 0x2175, G_UNICODE_NOT_PRESENT_OFFSET, 5506 }, + { 0x2176, G_UNICODE_NOT_PRESENT_OFFSET, 5509 }, + { 0x2177, G_UNICODE_NOT_PRESENT_OFFSET, 5513 }, + { 0x2178, G_UNICODE_NOT_PRESENT_OFFSET, 5518 }, + { 0x2179, G_UNICODE_NOT_PRESENT_OFFSET, 1222 }, + { 0x217a, G_UNICODE_NOT_PRESENT_OFFSET, 5521 }, + { 0x217b, G_UNICODE_NOT_PRESENT_OFFSET, 5524 }, + { 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 }, + { 0x2189, G_UNICODE_NOT_PRESENT_OFFSET, 5528 }, + { 0x219a, 5534, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x219b, 5540, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21ae, 5546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21cd, 5552, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21ce, 5558, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x21cf, 5564, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2204, 5570, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2209, 5576, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x220c, 5582, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2224, 5588, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2226, 5594, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x222c, G_UNICODE_NOT_PRESENT_OFFSET, 5600 }, + { 0x222d, G_UNICODE_NOT_PRESENT_OFFSET, 5607 }, + { 0x222f, G_UNICODE_NOT_PRESENT_OFFSET, 5617 }, + { 0x2230, G_UNICODE_NOT_PRESENT_OFFSET, 5624 }, + { 0x2241, 5634, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2244, 5640, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2247, 5646, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2249, 5652, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2260, 5658, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2262, 5662, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226d, 5668, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226e, 5674, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x226f, 5678, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2270, 5682, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2271, 5688, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2274, 5694, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2275, 5700, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2278, 5706, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2279, 5712, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2280, 5718, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2281, 5724, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2284, 5730, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2285, 5736, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2288, 5742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2289, 5748, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ac, 5754, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ad, 5760, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ae, 5766, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22af, 5772, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e0, 5778, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e1, 5784, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e2, 5790, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22e3, 5796, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ea, 5802, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22eb, 5808, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ec, 5814, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x22ed, 5820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2329, 5826, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x232a, 5830, 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, 5834 }, + { 0x246a, G_UNICODE_NOT_PRESENT_OFFSET, 5837 }, + { 0x246b, G_UNICODE_NOT_PRESENT_OFFSET, 5840 }, + { 0x246c, G_UNICODE_NOT_PRESENT_OFFSET, 5843 }, + { 0x246d, G_UNICODE_NOT_PRESENT_OFFSET, 5846 }, + { 0x246e, G_UNICODE_NOT_PRESENT_OFFSET, 5849 }, + { 0x246f, G_UNICODE_NOT_PRESENT_OFFSET, 5852 }, + { 0x2470, G_UNICODE_NOT_PRESENT_OFFSET, 5855 }, + { 0x2471, G_UNICODE_NOT_PRESENT_OFFSET, 5858 }, + { 0x2472, G_UNICODE_NOT_PRESENT_OFFSET, 5861 }, + { 0x2473, G_UNICODE_NOT_PRESENT_OFFSET, 5864 }, + { 0x2474, G_UNICODE_NOT_PRESENT_OFFSET, 5867 }, + { 0x2475, G_UNICODE_NOT_PRESENT_OFFSET, 5871 }, + { 0x2476, G_UNICODE_NOT_PRESENT_OFFSET, 5875 }, + { 0x2477, G_UNICODE_NOT_PRESENT_OFFSET, 5879 }, + { 0x2478, G_UNICODE_NOT_PRESENT_OFFSET, 5883 }, + { 0x2479, G_UNICODE_NOT_PRESENT_OFFSET, 5887 }, + { 0x247a, G_UNICODE_NOT_PRESENT_OFFSET, 5891 }, + { 0x247b, G_UNICODE_NOT_PRESENT_OFFSET, 5895 }, + { 0x247c, G_UNICODE_NOT_PRESENT_OFFSET, 5899 }, + { 0x247d, G_UNICODE_NOT_PRESENT_OFFSET, 5903 }, + { 0x247e, G_UNICODE_NOT_PRESENT_OFFSET, 5908 }, + { 0x247f, G_UNICODE_NOT_PRESENT_OFFSET, 5913 }, + { 0x2480, G_UNICODE_NOT_PRESENT_OFFSET, 5918 }, + { 0x2481, G_UNICODE_NOT_PRESENT_OFFSET, 5923 }, + { 0x2482, G_UNICODE_NOT_PRESENT_OFFSET, 5928 }, + { 0x2483, G_UNICODE_NOT_PRESENT_OFFSET, 5933 }, + { 0x2484, G_UNICODE_NOT_PRESENT_OFFSET, 5938 }, + { 0x2485, G_UNICODE_NOT_PRESENT_OFFSET, 5943 }, + { 0x2486, G_UNICODE_NOT_PRESENT_OFFSET, 5948 }, + { 0x2487, G_UNICODE_NOT_PRESENT_OFFSET, 5953 }, + { 0x2488, G_UNICODE_NOT_PRESENT_OFFSET, 5958 }, + { 0x2489, G_UNICODE_NOT_PRESENT_OFFSET, 5961 }, + { 0x248a, G_UNICODE_NOT_PRESENT_OFFSET, 5964 }, + { 0x248b, G_UNICODE_NOT_PRESENT_OFFSET, 5967 }, + { 0x248c, G_UNICODE_NOT_PRESENT_OFFSET, 5970 }, + { 0x248d, G_UNICODE_NOT_PRESENT_OFFSET, 5973 }, + { 0x248e, G_UNICODE_NOT_PRESENT_OFFSET, 5976 }, + { 0x248f, G_UNICODE_NOT_PRESENT_OFFSET, 5979 }, + { 0x2490, G_UNICODE_NOT_PRESENT_OFFSET, 5982 }, + { 0x2491, G_UNICODE_NOT_PRESENT_OFFSET, 5985 }, + { 0x2492, G_UNICODE_NOT_PRESENT_OFFSET, 5989 }, + { 0x2493, G_UNICODE_NOT_PRESENT_OFFSET, 5993 }, + { 0x2494, G_UNICODE_NOT_PRESENT_OFFSET, 5997 }, + { 0x2495, G_UNICODE_NOT_PRESENT_OFFSET, 6001 }, + { 0x2496, G_UNICODE_NOT_PRESENT_OFFSET, 6005 }, + { 0x2497, G_UNICODE_NOT_PRESENT_OFFSET, 6009 }, + { 0x2498, G_UNICODE_NOT_PRESENT_OFFSET, 6013 }, + { 0x2499, G_UNICODE_NOT_PRESENT_OFFSET, 6017 }, + { 0x249a, G_UNICODE_NOT_PRESENT_OFFSET, 6021 }, + { 0x249b, G_UNICODE_NOT_PRESENT_OFFSET, 6025 }, + { 0x249c, G_UNICODE_NOT_PRESENT_OFFSET, 6029 }, + { 0x249d, G_UNICODE_NOT_PRESENT_OFFSET, 6033 }, + { 0x249e, G_UNICODE_NOT_PRESENT_OFFSET, 6037 }, + { 0x249f, G_UNICODE_NOT_PRESENT_OFFSET, 6041 }, + { 0x24a0, G_UNICODE_NOT_PRESENT_OFFSET, 6045 }, + { 0x24a1, G_UNICODE_NOT_PRESENT_OFFSET, 6049 }, + { 0x24a2, G_UNICODE_NOT_PRESENT_OFFSET, 6053 }, + { 0x24a3, G_UNICODE_NOT_PRESENT_OFFSET, 6057 }, + { 0x24a4, G_UNICODE_NOT_PRESENT_OFFSET, 6061 }, + { 0x24a5, G_UNICODE_NOT_PRESENT_OFFSET, 6065 }, + { 0x24a6, G_UNICODE_NOT_PRESENT_OFFSET, 6069 }, + { 0x24a7, G_UNICODE_NOT_PRESENT_OFFSET, 6073 }, + { 0x24a8, G_UNICODE_NOT_PRESENT_OFFSET, 6077 }, + { 0x24a9, G_UNICODE_NOT_PRESENT_OFFSET, 6081 }, + { 0x24aa, G_UNICODE_NOT_PRESENT_OFFSET, 6085 }, + { 0x24ab, G_UNICODE_NOT_PRESENT_OFFSET, 6089 }, + { 0x24ac, G_UNICODE_NOT_PRESENT_OFFSET, 6093 }, + { 0x24ad, G_UNICODE_NOT_PRESENT_OFFSET, 6097 }, + { 0x24ae, G_UNICODE_NOT_PRESENT_OFFSET, 6101 }, + { 0x24af, G_UNICODE_NOT_PRESENT_OFFSET, 6105 }, + { 0x24b0, G_UNICODE_NOT_PRESENT_OFFSET, 6109 }, + { 0x24b1, G_UNICODE_NOT_PRESENT_OFFSET, 6113 }, + { 0x24b2, G_UNICODE_NOT_PRESENT_OFFSET, 6117 }, + { 0x24b3, G_UNICODE_NOT_PRESENT_OFFSET, 6121 }, + { 0x24b4, G_UNICODE_NOT_PRESENT_OFFSET, 6125 }, + { 0x24b5, G_UNICODE_NOT_PRESENT_OFFSET, 6129 }, + { 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, 6133 }, + { 0x24c9, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x24ca, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x24cb, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x24cc, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x24cd, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x24ce, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6139 }, + { 0x2a74, G_UNICODE_NOT_PRESENT_OFFSET, 6152 }, + { 0x2a75, G_UNICODE_NOT_PRESENT_OFFSET, 6156 }, + { 0x2a76, G_UNICODE_NOT_PRESENT_OFFSET, 6159 }, + { 0x2adc, 6163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2c7c, G_UNICODE_NOT_PRESENT_OFFSET, 1176 }, + { 0x2c7d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x2d6f, G_UNICODE_NOT_PRESENT_OFFSET, 6169 }, + { 0x2e9f, G_UNICODE_NOT_PRESENT_OFFSET, 6173 }, + { 0x2ef3, G_UNICODE_NOT_PRESENT_OFFSET, 6177 }, + { 0x2f00, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, + { 0x2f01, G_UNICODE_NOT_PRESENT_OFFSET, 6185 }, + { 0x2f02, G_UNICODE_NOT_PRESENT_OFFSET, 6189 }, + { 0x2f03, G_UNICODE_NOT_PRESENT_OFFSET, 6193 }, + { 0x2f04, G_UNICODE_NOT_PRESENT_OFFSET, 6197 }, + { 0x2f05, G_UNICODE_NOT_PRESENT_OFFSET, 6201 }, + { 0x2f06, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, + { 0x2f07, G_UNICODE_NOT_PRESENT_OFFSET, 6209 }, + { 0x2f08, G_UNICODE_NOT_PRESENT_OFFSET, 6213 }, + { 0x2f09, G_UNICODE_NOT_PRESENT_OFFSET, 6217 }, + { 0x2f0a, G_UNICODE_NOT_PRESENT_OFFSET, 6221 }, + { 0x2f0b, G_UNICODE_NOT_PRESENT_OFFSET, 6225 }, + { 0x2f0c, G_UNICODE_NOT_PRESENT_OFFSET, 6229 }, + { 0x2f0d, G_UNICODE_NOT_PRESENT_OFFSET, 6233 }, + { 0x2f0e, G_UNICODE_NOT_PRESENT_OFFSET, 6237 }, + { 0x2f0f, G_UNICODE_NOT_PRESENT_OFFSET, 6241 }, + { 0x2f10, G_UNICODE_NOT_PRESENT_OFFSET, 6245 }, + { 0x2f11, G_UNICODE_NOT_PRESENT_OFFSET, 6249 }, + { 0x2f12, G_UNICODE_NOT_PRESENT_OFFSET, 6253 }, + { 0x2f13, G_UNICODE_NOT_PRESENT_OFFSET, 6257 }, + { 0x2f14, G_UNICODE_NOT_PRESENT_OFFSET, 6261 }, + { 0x2f15, G_UNICODE_NOT_PRESENT_OFFSET, 6265 }, + { 0x2f16, G_UNICODE_NOT_PRESENT_OFFSET, 6269 }, + { 0x2f17, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, + { 0x2f18, G_UNICODE_NOT_PRESENT_OFFSET, 6277 }, + { 0x2f19, G_UNICODE_NOT_PRESENT_OFFSET, 6281 }, + { 0x2f1a, G_UNICODE_NOT_PRESENT_OFFSET, 6285 }, + { 0x2f1b, G_UNICODE_NOT_PRESENT_OFFSET, 6289 }, + { 0x2f1c, G_UNICODE_NOT_PRESENT_OFFSET, 6293 }, + { 0x2f1d, G_UNICODE_NOT_PRESENT_OFFSET, 6297 }, + { 0x2f1e, G_UNICODE_NOT_PRESENT_OFFSET, 6301 }, + { 0x2f1f, G_UNICODE_NOT_PRESENT_OFFSET, 6305 }, + { 0x2f20, G_UNICODE_NOT_PRESENT_OFFSET, 6309 }, + { 0x2f21, G_UNICODE_NOT_PRESENT_OFFSET, 6313 }, + { 0x2f22, G_UNICODE_NOT_PRESENT_OFFSET, 6317 }, + { 0x2f23, G_UNICODE_NOT_PRESENT_OFFSET, 6321 }, + { 0x2f24, G_UNICODE_NOT_PRESENT_OFFSET, 6325 }, + { 0x2f25, G_UNICODE_NOT_PRESENT_OFFSET, 6329 }, + { 0x2f26, G_UNICODE_NOT_PRESENT_OFFSET, 6333 }, + { 0x2f27, G_UNICODE_NOT_PRESENT_OFFSET, 6337 }, + { 0x2f28, G_UNICODE_NOT_PRESENT_OFFSET, 6341 }, + { 0x2f29, G_UNICODE_NOT_PRESENT_OFFSET, 6345 }, + { 0x2f2a, G_UNICODE_NOT_PRESENT_OFFSET, 6349 }, + { 0x2f2b, G_UNICODE_NOT_PRESENT_OFFSET, 6353 }, + { 0x2f2c, G_UNICODE_NOT_PRESENT_OFFSET, 6357 }, + { 0x2f2d, G_UNICODE_NOT_PRESENT_OFFSET, 6361 }, + { 0x2f2e, G_UNICODE_NOT_PRESENT_OFFSET, 6365 }, + { 0x2f2f, G_UNICODE_NOT_PRESENT_OFFSET, 6369 }, + { 0x2f30, G_UNICODE_NOT_PRESENT_OFFSET, 6373 }, + { 0x2f31, G_UNICODE_NOT_PRESENT_OFFSET, 6377 }, + { 0x2f32, G_UNICODE_NOT_PRESENT_OFFSET, 6381 }, + { 0x2f33, G_UNICODE_NOT_PRESENT_OFFSET, 6385 }, + { 0x2f34, G_UNICODE_NOT_PRESENT_OFFSET, 6389 }, + { 0x2f35, G_UNICODE_NOT_PRESENT_OFFSET, 6393 }, + { 0x2f36, G_UNICODE_NOT_PRESENT_OFFSET, 6397 }, + { 0x2f37, G_UNICODE_NOT_PRESENT_OFFSET, 6401 }, + { 0x2f38, G_UNICODE_NOT_PRESENT_OFFSET, 6405 }, + { 0x2f39, G_UNICODE_NOT_PRESENT_OFFSET, 6409 }, + { 0x2f3a, G_UNICODE_NOT_PRESENT_OFFSET, 6413 }, + { 0x2f3b, G_UNICODE_NOT_PRESENT_OFFSET, 6417 }, + { 0x2f3c, G_UNICODE_NOT_PRESENT_OFFSET, 6421 }, + { 0x2f3d, G_UNICODE_NOT_PRESENT_OFFSET, 6425 }, + { 0x2f3e, G_UNICODE_NOT_PRESENT_OFFSET, 6429 }, + { 0x2f3f, G_UNICODE_NOT_PRESENT_OFFSET, 6433 }, + { 0x2f40, G_UNICODE_NOT_PRESENT_OFFSET, 6437 }, + { 0x2f41, G_UNICODE_NOT_PRESENT_OFFSET, 6441 }, + { 0x2f42, G_UNICODE_NOT_PRESENT_OFFSET, 6445 }, + { 0x2f43, G_UNICODE_NOT_PRESENT_OFFSET, 6449 }, + { 0x2f44, G_UNICODE_NOT_PRESENT_OFFSET, 6453 }, + { 0x2f45, G_UNICODE_NOT_PRESENT_OFFSET, 6457 }, + { 0x2f46, G_UNICODE_NOT_PRESENT_OFFSET, 6461 }, + { 0x2f47, G_UNICODE_NOT_PRESENT_OFFSET, 6465 }, + { 0x2f48, G_UNICODE_NOT_PRESENT_OFFSET, 6469 }, + { 0x2f49, G_UNICODE_NOT_PRESENT_OFFSET, 6473 }, + { 0x2f4a, G_UNICODE_NOT_PRESENT_OFFSET, 6477 }, + { 0x2f4b, G_UNICODE_NOT_PRESENT_OFFSET, 6481 }, + { 0x2f4c, G_UNICODE_NOT_PRESENT_OFFSET, 6485 }, + { 0x2f4d, G_UNICODE_NOT_PRESENT_OFFSET, 6489 }, + { 0x2f4e, G_UNICODE_NOT_PRESENT_OFFSET, 6493 }, + { 0x2f4f, G_UNICODE_NOT_PRESENT_OFFSET, 6497 }, + { 0x2f50, G_UNICODE_NOT_PRESENT_OFFSET, 6501 }, + { 0x2f51, G_UNICODE_NOT_PRESENT_OFFSET, 6505 }, + { 0x2f52, G_UNICODE_NOT_PRESENT_OFFSET, 6509 }, + { 0x2f53, G_UNICODE_NOT_PRESENT_OFFSET, 6513 }, + { 0x2f54, G_UNICODE_NOT_PRESENT_OFFSET, 6517 }, + { 0x2f55, G_UNICODE_NOT_PRESENT_OFFSET, 6521 }, + { 0x2f56, G_UNICODE_NOT_PRESENT_OFFSET, 6525 }, + { 0x2f57, G_UNICODE_NOT_PRESENT_OFFSET, 6529 }, + { 0x2f58, G_UNICODE_NOT_PRESENT_OFFSET, 6533 }, + { 0x2f59, G_UNICODE_NOT_PRESENT_OFFSET, 6537 }, + { 0x2f5a, G_UNICODE_NOT_PRESENT_OFFSET, 6541 }, + { 0x2f5b, G_UNICODE_NOT_PRESENT_OFFSET, 6545 }, + { 0x2f5c, G_UNICODE_NOT_PRESENT_OFFSET, 6549 }, + { 0x2f5d, G_UNICODE_NOT_PRESENT_OFFSET, 6553 }, + { 0x2f5e, G_UNICODE_NOT_PRESENT_OFFSET, 6557 }, + { 0x2f5f, G_UNICODE_NOT_PRESENT_OFFSET, 6561 }, + { 0x2f60, G_UNICODE_NOT_PRESENT_OFFSET, 6565 }, + { 0x2f61, G_UNICODE_NOT_PRESENT_OFFSET, 6569 }, + { 0x2f62, G_UNICODE_NOT_PRESENT_OFFSET, 6573 }, + { 0x2f63, G_UNICODE_NOT_PRESENT_OFFSET, 6577 }, + { 0x2f64, G_UNICODE_NOT_PRESENT_OFFSET, 6581 }, + { 0x2f65, G_UNICODE_NOT_PRESENT_OFFSET, 6585 }, + { 0x2f66, G_UNICODE_NOT_PRESENT_OFFSET, 6589 }, + { 0x2f67, G_UNICODE_NOT_PRESENT_OFFSET, 6593 }, + { 0x2f68, G_UNICODE_NOT_PRESENT_OFFSET, 6597 }, + { 0x2f69, G_UNICODE_NOT_PRESENT_OFFSET, 6601 }, + { 0x2f6a, G_UNICODE_NOT_PRESENT_OFFSET, 6605 }, + { 0x2f6b, G_UNICODE_NOT_PRESENT_OFFSET, 6609 }, + { 0x2f6c, G_UNICODE_NOT_PRESENT_OFFSET, 6613 }, + { 0x2f6d, G_UNICODE_NOT_PRESENT_OFFSET, 6617 }, + { 0x2f6e, G_UNICODE_NOT_PRESENT_OFFSET, 6621 }, + { 0x2f6f, G_UNICODE_NOT_PRESENT_OFFSET, 6625 }, + { 0x2f70, G_UNICODE_NOT_PRESENT_OFFSET, 6629 }, + { 0x2f71, G_UNICODE_NOT_PRESENT_OFFSET, 6633 }, + { 0x2f72, G_UNICODE_NOT_PRESENT_OFFSET, 6637 }, + { 0x2f73, G_UNICODE_NOT_PRESENT_OFFSET, 6641 }, + { 0x2f74, G_UNICODE_NOT_PRESENT_OFFSET, 6645 }, + { 0x2f75, G_UNICODE_NOT_PRESENT_OFFSET, 6649 }, + { 0x2f76, G_UNICODE_NOT_PRESENT_OFFSET, 6653 }, + { 0x2f77, G_UNICODE_NOT_PRESENT_OFFSET, 6657 }, + { 0x2f78, G_UNICODE_NOT_PRESENT_OFFSET, 6661 }, + { 0x2f79, G_UNICODE_NOT_PRESENT_OFFSET, 6665 }, + { 0x2f7a, G_UNICODE_NOT_PRESENT_OFFSET, 6669 }, + { 0x2f7b, G_UNICODE_NOT_PRESENT_OFFSET, 6673 }, + { 0x2f7c, G_UNICODE_NOT_PRESENT_OFFSET, 6677 }, + { 0x2f7d, G_UNICODE_NOT_PRESENT_OFFSET, 6681 }, + { 0x2f7e, G_UNICODE_NOT_PRESENT_OFFSET, 6685 }, + { 0x2f7f, G_UNICODE_NOT_PRESENT_OFFSET, 6689 }, + { 0x2f80, G_UNICODE_NOT_PRESENT_OFFSET, 6693 }, + { 0x2f81, G_UNICODE_NOT_PRESENT_OFFSET, 6697 }, + { 0x2f82, G_UNICODE_NOT_PRESENT_OFFSET, 6701 }, + { 0x2f83, G_UNICODE_NOT_PRESENT_OFFSET, 6705 }, + { 0x2f84, G_UNICODE_NOT_PRESENT_OFFSET, 6709 }, + { 0x2f85, G_UNICODE_NOT_PRESENT_OFFSET, 6713 }, + { 0x2f86, G_UNICODE_NOT_PRESENT_OFFSET, 6717 }, + { 0x2f87, G_UNICODE_NOT_PRESENT_OFFSET, 6721 }, + { 0x2f88, G_UNICODE_NOT_PRESENT_OFFSET, 6725 }, + { 0x2f89, G_UNICODE_NOT_PRESENT_OFFSET, 6729 }, + { 0x2f8a, G_UNICODE_NOT_PRESENT_OFFSET, 6733 }, + { 0x2f8b, G_UNICODE_NOT_PRESENT_OFFSET, 6737 }, + { 0x2f8c, G_UNICODE_NOT_PRESENT_OFFSET, 6741 }, + { 0x2f8d, G_UNICODE_NOT_PRESENT_OFFSET, 6745 }, + { 0x2f8e, G_UNICODE_NOT_PRESENT_OFFSET, 6749 }, + { 0x2f8f, G_UNICODE_NOT_PRESENT_OFFSET, 6753 }, + { 0x2f90, G_UNICODE_NOT_PRESENT_OFFSET, 6757 }, + { 0x2f91, G_UNICODE_NOT_PRESENT_OFFSET, 6761 }, + { 0x2f92, G_UNICODE_NOT_PRESENT_OFFSET, 6765 }, + { 0x2f93, G_UNICODE_NOT_PRESENT_OFFSET, 6769 }, + { 0x2f94, G_UNICODE_NOT_PRESENT_OFFSET, 6773 }, + { 0x2f95, G_UNICODE_NOT_PRESENT_OFFSET, 6777 }, + { 0x2f96, G_UNICODE_NOT_PRESENT_OFFSET, 6781 }, + { 0x2f97, G_UNICODE_NOT_PRESENT_OFFSET, 6785 }, + { 0x2f98, G_UNICODE_NOT_PRESENT_OFFSET, 6789 }, + { 0x2f99, G_UNICODE_NOT_PRESENT_OFFSET, 6793 }, + { 0x2f9a, G_UNICODE_NOT_PRESENT_OFFSET, 6797 }, + { 0x2f9b, G_UNICODE_NOT_PRESENT_OFFSET, 6801 }, + { 0x2f9c, G_UNICODE_NOT_PRESENT_OFFSET, 6805 }, + { 0x2f9d, G_UNICODE_NOT_PRESENT_OFFSET, 6809 }, + { 0x2f9e, G_UNICODE_NOT_PRESENT_OFFSET, 6813 }, + { 0x2f9f, G_UNICODE_NOT_PRESENT_OFFSET, 6817 }, + { 0x2fa0, G_UNICODE_NOT_PRESENT_OFFSET, 6821 }, + { 0x2fa1, G_UNICODE_NOT_PRESENT_OFFSET, 6825 }, + { 0x2fa2, G_UNICODE_NOT_PRESENT_OFFSET, 6829 }, + { 0x2fa3, G_UNICODE_NOT_PRESENT_OFFSET, 6833 }, + { 0x2fa4, G_UNICODE_NOT_PRESENT_OFFSET, 6837 }, + { 0x2fa5, G_UNICODE_NOT_PRESENT_OFFSET, 6841 }, + { 0x2fa6, G_UNICODE_NOT_PRESENT_OFFSET, 6845 }, + { 0x2fa7, G_UNICODE_NOT_PRESENT_OFFSET, 6849 }, + { 0x2fa8, G_UNICODE_NOT_PRESENT_OFFSET, 6853 }, + { 0x2fa9, G_UNICODE_NOT_PRESENT_OFFSET, 6857 }, + { 0x2faa, G_UNICODE_NOT_PRESENT_OFFSET, 6861 }, + { 0x2fab, G_UNICODE_NOT_PRESENT_OFFSET, 6865 }, + { 0x2fac, G_UNICODE_NOT_PRESENT_OFFSET, 6869 }, + { 0x2fad, G_UNICODE_NOT_PRESENT_OFFSET, 6873 }, + { 0x2fae, G_UNICODE_NOT_PRESENT_OFFSET, 6877 }, + { 0x2faf, G_UNICODE_NOT_PRESENT_OFFSET, 6881 }, + { 0x2fb0, G_UNICODE_NOT_PRESENT_OFFSET, 6885 }, + { 0x2fb1, G_UNICODE_NOT_PRESENT_OFFSET, 6889 }, + { 0x2fb2, G_UNICODE_NOT_PRESENT_OFFSET, 6893 }, + { 0x2fb3, G_UNICODE_NOT_PRESENT_OFFSET, 6897 }, + { 0x2fb4, G_UNICODE_NOT_PRESENT_OFFSET, 6901 }, + { 0x2fb5, G_UNICODE_NOT_PRESENT_OFFSET, 6905 }, + { 0x2fb6, G_UNICODE_NOT_PRESENT_OFFSET, 6909 }, + { 0x2fb7, G_UNICODE_NOT_PRESENT_OFFSET, 6913 }, + { 0x2fb8, G_UNICODE_NOT_PRESENT_OFFSET, 6917 }, + { 0x2fb9, G_UNICODE_NOT_PRESENT_OFFSET, 6921 }, + { 0x2fba, G_UNICODE_NOT_PRESENT_OFFSET, 6925 }, + { 0x2fbb, G_UNICODE_NOT_PRESENT_OFFSET, 6929 }, + { 0x2fbc, G_UNICODE_NOT_PRESENT_OFFSET, 6933 }, + { 0x2fbd, G_UNICODE_NOT_PRESENT_OFFSET, 6937 }, + { 0x2fbe, G_UNICODE_NOT_PRESENT_OFFSET, 6941 }, + { 0x2fbf, G_UNICODE_NOT_PRESENT_OFFSET, 6945 }, + { 0x2fc0, G_UNICODE_NOT_PRESENT_OFFSET, 6949 }, + { 0x2fc1, G_UNICODE_NOT_PRESENT_OFFSET, 6953 }, + { 0x2fc2, G_UNICODE_NOT_PRESENT_OFFSET, 6957 }, + { 0x2fc3, G_UNICODE_NOT_PRESENT_OFFSET, 6961 }, + { 0x2fc4, G_UNICODE_NOT_PRESENT_OFFSET, 6965 }, + { 0x2fc5, G_UNICODE_NOT_PRESENT_OFFSET, 6969 }, + { 0x2fc6, G_UNICODE_NOT_PRESENT_OFFSET, 6973 }, + { 0x2fc7, G_UNICODE_NOT_PRESENT_OFFSET, 6977 }, + { 0x2fc8, G_UNICODE_NOT_PRESENT_OFFSET, 6981 }, + { 0x2fc9, G_UNICODE_NOT_PRESENT_OFFSET, 6985 }, + { 0x2fca, G_UNICODE_NOT_PRESENT_OFFSET, 6989 }, + { 0x2fcb, G_UNICODE_NOT_PRESENT_OFFSET, 6993 }, + { 0x2fcc, G_UNICODE_NOT_PRESENT_OFFSET, 6997 }, + { 0x2fcd, G_UNICODE_NOT_PRESENT_OFFSET, 7001 }, + { 0x2fce, G_UNICODE_NOT_PRESENT_OFFSET, 7005 }, + { 0x2fcf, G_UNICODE_NOT_PRESENT_OFFSET, 7009 }, + { 0x2fd0, G_UNICODE_NOT_PRESENT_OFFSET, 7013 }, + { 0x2fd1, G_UNICODE_NOT_PRESENT_OFFSET, 7017 }, + { 0x2fd2, G_UNICODE_NOT_PRESENT_OFFSET, 7021 }, + { 0x2fd3, G_UNICODE_NOT_PRESENT_OFFSET, 7025 }, + { 0x2fd4, G_UNICODE_NOT_PRESENT_OFFSET, 7029 }, + { 0x2fd5, G_UNICODE_NOT_PRESENT_OFFSET, 7033 }, + { 0x3000, G_UNICODE_NOT_PRESENT_OFFSET, 0 }, + { 0x3036, G_UNICODE_NOT_PRESENT_OFFSET, 7037 }, + { 0x3038, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, + { 0x3039, G_UNICODE_NOT_PRESENT_OFFSET, 7041 }, + { 0x303a, G_UNICODE_NOT_PRESENT_OFFSET, 7045 }, + { 0x304c, 7049, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x304e, 7056, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3050, 7063, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3052, 7070, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3054, 7077, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3056, 7084, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3058, 7091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305a, 7098, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305c, 7105, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x305e, 7112, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3060, 7119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3062, 7126, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3065, 7133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3067, 7140, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3069, 7147, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3070, 7154, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3071, 7161, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3073, 7168, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3074, 7175, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3076, 7182, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3077, 7189, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3079, 7196, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307a, 7203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307c, 7210, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x307d, 7217, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x3094, 7224, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x309b, G_UNICODE_NOT_PRESENT_OFFSET, 7231 }, + { 0x309c, G_UNICODE_NOT_PRESENT_OFFSET, 7236 }, + { 0x309e, 7241, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x309f, G_UNICODE_NOT_PRESENT_OFFSET, 7248 }, + { 0x30ac, 7255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ae, 7262, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b0, 7269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b2, 7276, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b4, 7283, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b6, 7290, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30b8, 7297, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ba, 7304, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30bc, 7311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30be, 7318, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c0, 7325, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c2, 7332, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c5, 7339, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c7, 7346, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30c9, 7353, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d0, 7360, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d1, 7367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d3, 7374, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d4, 7381, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d6, 7388, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d7, 7395, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30d9, 7402, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30da, 7409, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30dc, 7416, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30dd, 7423, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f4, 7430, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f7, 7437, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f8, 7444, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30f9, 7451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30fa, 7458, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30fe, 7465, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x30ff, G_UNICODE_NOT_PRESENT_OFFSET, 7472 }, + { 0x3131, G_UNICODE_NOT_PRESENT_OFFSET, 7479 }, + { 0x3132, G_UNICODE_NOT_PRESENT_OFFSET, 7483 }, + { 0x3133, G_UNICODE_NOT_PRESENT_OFFSET, 7487 }, + { 0x3134, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, + { 0x3135, G_UNICODE_NOT_PRESENT_OFFSET, 7495 }, + { 0x3136, G_UNICODE_NOT_PRESENT_OFFSET, 7499 }, + { 0x3137, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, + { 0x3138, G_UNICODE_NOT_PRESENT_OFFSET, 7507 }, + { 0x3139, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, + { 0x313a, G_UNICODE_NOT_PRESENT_OFFSET, 7515 }, + { 0x313b, G_UNICODE_NOT_PRESENT_OFFSET, 7519 }, + { 0x313c, G_UNICODE_NOT_PRESENT_OFFSET, 7523 }, + { 0x313d, G_UNICODE_NOT_PRESENT_OFFSET, 7527 }, + { 0x313e, G_UNICODE_NOT_PRESENT_OFFSET, 7531 }, + { 0x313f, G_UNICODE_NOT_PRESENT_OFFSET, 7535 }, + { 0x3140, G_UNICODE_NOT_PRESENT_OFFSET, 7539 }, + { 0x3141, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, + { 0x3142, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, + { 0x3143, G_UNICODE_NOT_PRESENT_OFFSET, 7551 }, + { 0x3144, G_UNICODE_NOT_PRESENT_OFFSET, 7555 }, + { 0x3145, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, + { 0x3146, G_UNICODE_NOT_PRESENT_OFFSET, 7563 }, + { 0x3147, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, + { 0x3148, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, + { 0x3149, G_UNICODE_NOT_PRESENT_OFFSET, 7575 }, + { 0x314a, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, + { 0x314b, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, + { 0x314c, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, + { 0x314d, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, + { 0x314e, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, + { 0x314f, G_UNICODE_NOT_PRESENT_OFFSET, 7599 }, + { 0x3150, G_UNICODE_NOT_PRESENT_OFFSET, 7603 }, + { 0x3151, G_UNICODE_NOT_PRESENT_OFFSET, 7607 }, + { 0x3152, G_UNICODE_NOT_PRESENT_OFFSET, 7611 }, + { 0x3153, G_UNICODE_NOT_PRESENT_OFFSET, 7615 }, + { 0x3154, G_UNICODE_NOT_PRESENT_OFFSET, 7619 }, + { 0x3155, G_UNICODE_NOT_PRESENT_OFFSET, 7623 }, + { 0x3156, G_UNICODE_NOT_PRESENT_OFFSET, 7627 }, + { 0x3157, G_UNICODE_NOT_PRESENT_OFFSET, 7631 }, + { 0x3158, G_UNICODE_NOT_PRESENT_OFFSET, 7635 }, + { 0x3159, G_UNICODE_NOT_PRESENT_OFFSET, 7639 }, + { 0x315a, G_UNICODE_NOT_PRESENT_OFFSET, 7643 }, + { 0x315b, G_UNICODE_NOT_PRESENT_OFFSET, 7647 }, + { 0x315c, G_UNICODE_NOT_PRESENT_OFFSET, 7651 }, + { 0x315d, G_UNICODE_NOT_PRESENT_OFFSET, 7655 }, + { 0x315e, G_UNICODE_NOT_PRESENT_OFFSET, 7659 }, + { 0x315f, G_UNICODE_NOT_PRESENT_OFFSET, 7663 }, + { 0x3160, G_UNICODE_NOT_PRESENT_OFFSET, 7667 }, + { 0x3161, G_UNICODE_NOT_PRESENT_OFFSET, 7671 }, + { 0x3162, G_UNICODE_NOT_PRESENT_OFFSET, 7675 }, + { 0x3163, G_UNICODE_NOT_PRESENT_OFFSET, 7679 }, + { 0x3164, G_UNICODE_NOT_PRESENT_OFFSET, 7683 }, + { 0x3165, G_UNICODE_NOT_PRESENT_OFFSET, 7687 }, + { 0x3166, G_UNICODE_NOT_PRESENT_OFFSET, 7691 }, + { 0x3167, G_UNICODE_NOT_PRESENT_OFFSET, 7695 }, + { 0x3168, G_UNICODE_NOT_PRESENT_OFFSET, 7699 }, + { 0x3169, G_UNICODE_NOT_PRESENT_OFFSET, 7703 }, + { 0x316a, G_UNICODE_NOT_PRESENT_OFFSET, 7707 }, + { 0x316b, G_UNICODE_NOT_PRESENT_OFFSET, 7711 }, + { 0x316c, G_UNICODE_NOT_PRESENT_OFFSET, 7715 }, + { 0x316d, G_UNICODE_NOT_PRESENT_OFFSET, 7719 }, + { 0x316e, G_UNICODE_NOT_PRESENT_OFFSET, 7723 }, + { 0x316f, G_UNICODE_NOT_PRESENT_OFFSET, 7727 }, + { 0x3170, G_UNICODE_NOT_PRESENT_OFFSET, 7731 }, + { 0x3171, G_UNICODE_NOT_PRESENT_OFFSET, 7735 }, + { 0x3172, G_UNICODE_NOT_PRESENT_OFFSET, 7739 }, + { 0x3173, G_UNICODE_NOT_PRESENT_OFFSET, 7743 }, + { 0x3174, G_UNICODE_NOT_PRESENT_OFFSET, 7747 }, + { 0x3175, G_UNICODE_NOT_PRESENT_OFFSET, 7751 }, + { 0x3176, G_UNICODE_NOT_PRESENT_OFFSET, 7755 }, + { 0x3177, G_UNICODE_NOT_PRESENT_OFFSET, 7759 }, + { 0x3178, G_UNICODE_NOT_PRESENT_OFFSET, 7763 }, + { 0x3179, G_UNICODE_NOT_PRESENT_OFFSET, 7767 }, + { 0x317a, G_UNICODE_NOT_PRESENT_OFFSET, 7771 }, + { 0x317b, G_UNICODE_NOT_PRESENT_OFFSET, 7775 }, + { 0x317c, G_UNICODE_NOT_PRESENT_OFFSET, 7779 }, + { 0x317d, G_UNICODE_NOT_PRESENT_OFFSET, 7783 }, + { 0x317e, G_UNICODE_NOT_PRESENT_OFFSET, 7787 }, + { 0x317f, G_UNICODE_NOT_PRESENT_OFFSET, 7791 }, + { 0x3180, G_UNICODE_NOT_PRESENT_OFFSET, 7795 }, + { 0x3181, G_UNICODE_NOT_PRESENT_OFFSET, 7799 }, + { 0x3182, G_UNICODE_NOT_PRESENT_OFFSET, 7803 }, + { 0x3183, G_UNICODE_NOT_PRESENT_OFFSET, 7807 }, + { 0x3184, G_UNICODE_NOT_PRESENT_OFFSET, 7811 }, + { 0x3185, G_UNICODE_NOT_PRESENT_OFFSET, 7815 }, + { 0x3186, G_UNICODE_NOT_PRESENT_OFFSET, 7819 }, + { 0x3187, G_UNICODE_NOT_PRESENT_OFFSET, 7823 }, + { 0x3188, G_UNICODE_NOT_PRESENT_OFFSET, 7827 }, + { 0x3189, G_UNICODE_NOT_PRESENT_OFFSET, 7831 }, + { 0x318a, G_UNICODE_NOT_PRESENT_OFFSET, 7835 }, + { 0x318b, G_UNICODE_NOT_PRESENT_OFFSET, 7839 }, + { 0x318c, G_UNICODE_NOT_PRESENT_OFFSET, 7843 }, + { 0x318d, G_UNICODE_NOT_PRESENT_OFFSET, 7847 }, + { 0x318e, G_UNICODE_NOT_PRESENT_OFFSET, 7851 }, + { 0x3192, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, + { 0x3193, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, + { 0x3194, G_UNICODE_NOT_PRESENT_OFFSET, 7855 }, + { 0x3195, G_UNICODE_NOT_PRESENT_OFFSET, 7859 }, + { 0x3196, G_UNICODE_NOT_PRESENT_OFFSET, 7863 }, + { 0x3197, G_UNICODE_NOT_PRESENT_OFFSET, 7867 }, + { 0x3198, G_UNICODE_NOT_PRESENT_OFFSET, 7871 }, + { 0x3199, G_UNICODE_NOT_PRESENT_OFFSET, 7875 }, + { 0x319a, G_UNICODE_NOT_PRESENT_OFFSET, 6197 }, + { 0x319b, G_UNICODE_NOT_PRESENT_OFFSET, 7879 }, + { 0x319c, G_UNICODE_NOT_PRESENT_OFFSET, 7883 }, + { 0x319d, G_UNICODE_NOT_PRESENT_OFFSET, 7887 }, + { 0x319e, G_UNICODE_NOT_PRESENT_OFFSET, 7891 }, + { 0x319f, G_UNICODE_NOT_PRESENT_OFFSET, 6213 }, + { 0x3200, G_UNICODE_NOT_PRESENT_OFFSET, 7895 }, + { 0x3201, G_UNICODE_NOT_PRESENT_OFFSET, 7901 }, + { 0x3202, G_UNICODE_NOT_PRESENT_OFFSET, 7907 }, + { 0x3203, G_UNICODE_NOT_PRESENT_OFFSET, 7913 }, + { 0x3204, G_UNICODE_NOT_PRESENT_OFFSET, 7919 }, + { 0x3205, G_UNICODE_NOT_PRESENT_OFFSET, 7925 }, + { 0x3206, G_UNICODE_NOT_PRESENT_OFFSET, 7931 }, + { 0x3207, G_UNICODE_NOT_PRESENT_OFFSET, 7937 }, + { 0x3208, G_UNICODE_NOT_PRESENT_OFFSET, 7943 }, + { 0x3209, G_UNICODE_NOT_PRESENT_OFFSET, 7949 }, + { 0x320a, G_UNICODE_NOT_PRESENT_OFFSET, 7955 }, + { 0x320b, G_UNICODE_NOT_PRESENT_OFFSET, 7961 }, + { 0x320c, G_UNICODE_NOT_PRESENT_OFFSET, 7967 }, + { 0x320d, G_UNICODE_NOT_PRESENT_OFFSET, 7973 }, + { 0x320e, G_UNICODE_NOT_PRESENT_OFFSET, 7979 }, + { 0x320f, G_UNICODE_NOT_PRESENT_OFFSET, 7988 }, + { 0x3210, G_UNICODE_NOT_PRESENT_OFFSET, 7997 }, + { 0x3211, G_UNICODE_NOT_PRESENT_OFFSET, 8006 }, + { 0x3212, G_UNICODE_NOT_PRESENT_OFFSET, 8015 }, + { 0x3213, G_UNICODE_NOT_PRESENT_OFFSET, 8024 }, + { 0x3214, G_UNICODE_NOT_PRESENT_OFFSET, 8033 }, + { 0x3215, G_UNICODE_NOT_PRESENT_OFFSET, 8042 }, + { 0x3216, G_UNICODE_NOT_PRESENT_OFFSET, 8051 }, + { 0x3217, G_UNICODE_NOT_PRESENT_OFFSET, 8060 }, + { 0x3218, G_UNICODE_NOT_PRESENT_OFFSET, 8069 }, + { 0x3219, G_UNICODE_NOT_PRESENT_OFFSET, 8078 }, + { 0x321a, G_UNICODE_NOT_PRESENT_OFFSET, 8087 }, + { 0x321b, G_UNICODE_NOT_PRESENT_OFFSET, 8096 }, + { 0x321c, G_UNICODE_NOT_PRESENT_OFFSET, 8105 }, + { 0x321d, G_UNICODE_NOT_PRESENT_OFFSET, 8114 }, + { 0x321e, G_UNICODE_NOT_PRESENT_OFFSET, 8132 }, + { 0x3220, G_UNICODE_NOT_PRESENT_OFFSET, 8147 }, + { 0x3221, G_UNICODE_NOT_PRESENT_OFFSET, 8153 }, + { 0x3222, G_UNICODE_NOT_PRESENT_OFFSET, 8159 }, + { 0x3223, G_UNICODE_NOT_PRESENT_OFFSET, 8165 }, + { 0x3224, G_UNICODE_NOT_PRESENT_OFFSET, 8171 }, + { 0x3225, G_UNICODE_NOT_PRESENT_OFFSET, 8177 }, + { 0x3226, G_UNICODE_NOT_PRESENT_OFFSET, 8183 }, + { 0x3227, G_UNICODE_NOT_PRESENT_OFFSET, 8189 }, + { 0x3228, G_UNICODE_NOT_PRESENT_OFFSET, 8195 }, + { 0x3229, G_UNICODE_NOT_PRESENT_OFFSET, 8201 }, + { 0x322a, G_UNICODE_NOT_PRESENT_OFFSET, 8207 }, + { 0x322b, G_UNICODE_NOT_PRESENT_OFFSET, 8213 }, + { 0x322c, G_UNICODE_NOT_PRESENT_OFFSET, 8219 }, + { 0x322d, G_UNICODE_NOT_PRESENT_OFFSET, 8225 }, + { 0x322e, G_UNICODE_NOT_PRESENT_OFFSET, 8231 }, + { 0x322f, G_UNICODE_NOT_PRESENT_OFFSET, 8237 }, + { 0x3230, G_UNICODE_NOT_PRESENT_OFFSET, 8243 }, + { 0x3231, G_UNICODE_NOT_PRESENT_OFFSET, 8249 }, + { 0x3232, G_UNICODE_NOT_PRESENT_OFFSET, 8255 }, + { 0x3233, G_UNICODE_NOT_PRESENT_OFFSET, 8261 }, + { 0x3234, G_UNICODE_NOT_PRESENT_OFFSET, 8267 }, + { 0x3235, G_UNICODE_NOT_PRESENT_OFFSET, 8273 }, + { 0x3236, G_UNICODE_NOT_PRESENT_OFFSET, 8279 }, + { 0x3237, G_UNICODE_NOT_PRESENT_OFFSET, 8285 }, + { 0x3238, G_UNICODE_NOT_PRESENT_OFFSET, 8291 }, + { 0x3239, G_UNICODE_NOT_PRESENT_OFFSET, 8297 }, + { 0x323a, G_UNICODE_NOT_PRESENT_OFFSET, 8303 }, + { 0x323b, G_UNICODE_NOT_PRESENT_OFFSET, 8309 }, + { 0x323c, G_UNICODE_NOT_PRESENT_OFFSET, 8315 }, + { 0x323d, G_UNICODE_NOT_PRESENT_OFFSET, 8321 }, + { 0x323e, G_UNICODE_NOT_PRESENT_OFFSET, 8327 }, + { 0x323f, G_UNICODE_NOT_PRESENT_OFFSET, 8333 }, + { 0x3240, G_UNICODE_NOT_PRESENT_OFFSET, 8339 }, + { 0x3241, G_UNICODE_NOT_PRESENT_OFFSET, 8345 }, + { 0x3242, G_UNICODE_NOT_PRESENT_OFFSET, 8351 }, + { 0x3243, G_UNICODE_NOT_PRESENT_OFFSET, 8357 }, + { 0x3244, G_UNICODE_NOT_PRESENT_OFFSET, 8363 }, + { 0x3245, G_UNICODE_NOT_PRESENT_OFFSET, 8367 }, + { 0x3246, G_UNICODE_NOT_PRESENT_OFFSET, 6445 }, + { 0x3247, G_UNICODE_NOT_PRESENT_OFFSET, 8371 }, + { 0x3250, G_UNICODE_NOT_PRESENT_OFFSET, 8375 }, + { 0x3251, G_UNICODE_NOT_PRESENT_OFFSET, 8379 }, + { 0x3252, G_UNICODE_NOT_PRESENT_OFFSET, 8382 }, + { 0x3253, G_UNICODE_NOT_PRESENT_OFFSET, 8385 }, + { 0x3254, G_UNICODE_NOT_PRESENT_OFFSET, 8388 }, + { 0x3255, G_UNICODE_NOT_PRESENT_OFFSET, 8391 }, + { 0x3256, G_UNICODE_NOT_PRESENT_OFFSET, 8394 }, + { 0x3257, G_UNICODE_NOT_PRESENT_OFFSET, 8397 }, + { 0x3258, G_UNICODE_NOT_PRESENT_OFFSET, 8400 }, + { 0x3259, G_UNICODE_NOT_PRESENT_OFFSET, 8403 }, + { 0x325a, G_UNICODE_NOT_PRESENT_OFFSET, 8406 }, + { 0x325b, G_UNICODE_NOT_PRESENT_OFFSET, 8409 }, + { 0x325c, G_UNICODE_NOT_PRESENT_OFFSET, 8412 }, + { 0x325d, G_UNICODE_NOT_PRESENT_OFFSET, 8415 }, + { 0x325e, G_UNICODE_NOT_PRESENT_OFFSET, 8418 }, + { 0x325f, G_UNICODE_NOT_PRESENT_OFFSET, 8421 }, + { 0x3260, G_UNICODE_NOT_PRESENT_OFFSET, 7479 }, + { 0x3261, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, + { 0x3262, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, + { 0x3263, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, + { 0x3264, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, + { 0x3265, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, + { 0x3266, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, + { 0x3267, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, + { 0x3268, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, + { 0x3269, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, + { 0x326a, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, + { 0x326b, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, + { 0x326c, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, + { 0x326d, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, + { 0x326e, G_UNICODE_NOT_PRESENT_OFFSET, 8424 }, + { 0x326f, G_UNICODE_NOT_PRESENT_OFFSET, 8431 }, + { 0x3270, G_UNICODE_NOT_PRESENT_OFFSET, 8438 }, + { 0x3271, G_UNICODE_NOT_PRESENT_OFFSET, 8445 }, + { 0x3272, G_UNICODE_NOT_PRESENT_OFFSET, 8452 }, + { 0x3273, G_UNICODE_NOT_PRESENT_OFFSET, 8459 }, + { 0x3274, G_UNICODE_NOT_PRESENT_OFFSET, 8466 }, + { 0x3275, G_UNICODE_NOT_PRESENT_OFFSET, 8473 }, + { 0x3276, G_UNICODE_NOT_PRESENT_OFFSET, 8480 }, + { 0x3277, G_UNICODE_NOT_PRESENT_OFFSET, 8487 }, + { 0x3278, G_UNICODE_NOT_PRESENT_OFFSET, 8494 }, + { 0x3279, G_UNICODE_NOT_PRESENT_OFFSET, 8501 }, + { 0x327a, G_UNICODE_NOT_PRESENT_OFFSET, 8508 }, + { 0x327b, G_UNICODE_NOT_PRESENT_OFFSET, 8515 }, + { 0x327c, G_UNICODE_NOT_PRESENT_OFFSET, 8522 }, + { 0x327d, G_UNICODE_NOT_PRESENT_OFFSET, 8538 }, + { 0x327e, G_UNICODE_NOT_PRESENT_OFFSET, 8551 }, + { 0x3280, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, + { 0x3281, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, + { 0x3282, G_UNICODE_NOT_PRESENT_OFFSET, 7855 }, + { 0x3283, G_UNICODE_NOT_PRESENT_OFFSET, 7859 }, + { 0x3284, G_UNICODE_NOT_PRESENT_OFFSET, 8558 }, + { 0x3285, G_UNICODE_NOT_PRESENT_OFFSET, 8562 }, + { 0x3286, G_UNICODE_NOT_PRESENT_OFFSET, 8566 }, + { 0x3287, G_UNICODE_NOT_PRESENT_OFFSET, 6225 }, + { 0x3288, G_UNICODE_NOT_PRESENT_OFFSET, 8570 }, + { 0x3289, G_UNICODE_NOT_PRESENT_OFFSET, 6273 }, + { 0x328a, G_UNICODE_NOT_PRESENT_OFFSET, 6473 }, + { 0x328b, G_UNICODE_NOT_PRESENT_OFFSET, 6521 }, + { 0x328c, G_UNICODE_NOT_PRESENT_OFFSET, 6517 }, + { 0x328d, G_UNICODE_NOT_PRESENT_OFFSET, 6477 }, + { 0x328e, G_UNICODE_NOT_PRESENT_OFFSET, 6845 }, + { 0x328f, G_UNICODE_NOT_PRESENT_OFFSET, 6305 }, + { 0x3290, G_UNICODE_NOT_PRESENT_OFFSET, 6465 }, + { 0x3291, G_UNICODE_NOT_PRESENT_OFFSET, 8574 }, + { 0x3292, G_UNICODE_NOT_PRESENT_OFFSET, 8578 }, + { 0x3293, G_UNICODE_NOT_PRESENT_OFFSET, 8582 }, + { 0x3294, G_UNICODE_NOT_PRESENT_OFFSET, 8586 }, + { 0x3295, G_UNICODE_NOT_PRESENT_OFFSET, 8590 }, + { 0x3296, G_UNICODE_NOT_PRESENT_OFFSET, 8594 }, + { 0x3297, G_UNICODE_NOT_PRESENT_OFFSET, 8598 }, + { 0x3298, G_UNICODE_NOT_PRESENT_OFFSET, 8602 }, + { 0x3299, G_UNICODE_NOT_PRESENT_OFFSET, 8606 }, + { 0x329a, G_UNICODE_NOT_PRESENT_OFFSET, 8610 }, + { 0x329b, G_UNICODE_NOT_PRESENT_OFFSET, 6329 }, + { 0x329c, G_UNICODE_NOT_PRESENT_OFFSET, 8614 }, + { 0x329d, G_UNICODE_NOT_PRESENT_OFFSET, 8618 }, + { 0x329e, G_UNICODE_NOT_PRESENT_OFFSET, 8622 }, + { 0x329f, G_UNICODE_NOT_PRESENT_OFFSET, 8626 }, + { 0x32a0, G_UNICODE_NOT_PRESENT_OFFSET, 8630 }, + { 0x32a1, G_UNICODE_NOT_PRESENT_OFFSET, 8634 }, + { 0x32a2, G_UNICODE_NOT_PRESENT_OFFSET, 8638 }, + { 0x32a3, G_UNICODE_NOT_PRESENT_OFFSET, 8642 }, + { 0x32a4, G_UNICODE_NOT_PRESENT_OFFSET, 7863 }, + { 0x32a5, G_UNICODE_NOT_PRESENT_OFFSET, 7867 }, + { 0x32a6, G_UNICODE_NOT_PRESENT_OFFSET, 7871 }, + { 0x32a7, G_UNICODE_NOT_PRESENT_OFFSET, 8646 }, + { 0x32a8, G_UNICODE_NOT_PRESENT_OFFSET, 8650 }, + { 0x32a9, G_UNICODE_NOT_PRESENT_OFFSET, 8654 }, + { 0x32aa, G_UNICODE_NOT_PRESENT_OFFSET, 8658 }, + { 0x32ab, G_UNICODE_NOT_PRESENT_OFFSET, 8662 }, + { 0x32ac, G_UNICODE_NOT_PRESENT_OFFSET, 8666 }, + { 0x32ad, G_UNICODE_NOT_PRESENT_OFFSET, 8670 }, + { 0x32ae, G_UNICODE_NOT_PRESENT_OFFSET, 8674 }, + { 0x32af, G_UNICODE_NOT_PRESENT_OFFSET, 8678 }, + { 0x32b0, G_UNICODE_NOT_PRESENT_OFFSET, 8682 }, + { 0x32b1, G_UNICODE_NOT_PRESENT_OFFSET, 8686 }, + { 0x32b2, G_UNICODE_NOT_PRESENT_OFFSET, 8689 }, + { 0x32b3, G_UNICODE_NOT_PRESENT_OFFSET, 8692 }, + { 0x32b4, G_UNICODE_NOT_PRESENT_OFFSET, 8695 }, + { 0x32b5, G_UNICODE_NOT_PRESENT_OFFSET, 8698 }, + { 0x32b6, G_UNICODE_NOT_PRESENT_OFFSET, 8701 }, + { 0x32b7, G_UNICODE_NOT_PRESENT_OFFSET, 8704 }, + { 0x32b8, G_UNICODE_NOT_PRESENT_OFFSET, 8707 }, + { 0x32b9, G_UNICODE_NOT_PRESENT_OFFSET, 8710 }, + { 0x32ba, G_UNICODE_NOT_PRESENT_OFFSET, 8713 }, + { 0x32bb, G_UNICODE_NOT_PRESENT_OFFSET, 8716 }, + { 0x32bc, G_UNICODE_NOT_PRESENT_OFFSET, 8719 }, + { 0x32bd, G_UNICODE_NOT_PRESENT_OFFSET, 8722 }, + { 0x32be, G_UNICODE_NOT_PRESENT_OFFSET, 8725 }, + { 0x32bf, G_UNICODE_NOT_PRESENT_OFFSET, 8728 }, + { 0x32c0, G_UNICODE_NOT_PRESENT_OFFSET, 8731 }, + { 0x32c1, G_UNICODE_NOT_PRESENT_OFFSET, 8736 }, + { 0x32c2, G_UNICODE_NOT_PRESENT_OFFSET, 8741 }, + { 0x32c3, G_UNICODE_NOT_PRESENT_OFFSET, 8746 }, + { 0x32c4, G_UNICODE_NOT_PRESENT_OFFSET, 8751 }, + { 0x32c5, G_UNICODE_NOT_PRESENT_OFFSET, 8756 }, + { 0x32c6, G_UNICODE_NOT_PRESENT_OFFSET, 8761 }, + { 0x32c7, G_UNICODE_NOT_PRESENT_OFFSET, 8766 }, + { 0x32c8, G_UNICODE_NOT_PRESENT_OFFSET, 8771 }, + { 0x32c9, G_UNICODE_NOT_PRESENT_OFFSET, 8776 }, + { 0x32ca, G_UNICODE_NOT_PRESENT_OFFSET, 8782 }, + { 0x32cb, G_UNICODE_NOT_PRESENT_OFFSET, 8788 }, + { 0x32cc, G_UNICODE_NOT_PRESENT_OFFSET, 8794 }, + { 0x32cd, G_UNICODE_NOT_PRESENT_OFFSET, 8797 }, + { 0x32ce, G_UNICODE_NOT_PRESENT_OFFSET, 8801 }, + { 0x32cf, G_UNICODE_NOT_PRESENT_OFFSET, 8804 }, + { 0x32d0, G_UNICODE_NOT_PRESENT_OFFSET, 8808 }, + { 0x32d1, G_UNICODE_NOT_PRESENT_OFFSET, 8812 }, + { 0x32d2, G_UNICODE_NOT_PRESENT_OFFSET, 8816 }, + { 0x32d3, G_UNICODE_NOT_PRESENT_OFFSET, 8820 }, + { 0x32d4, G_UNICODE_NOT_PRESENT_OFFSET, 8824 }, + { 0x32d5, G_UNICODE_NOT_PRESENT_OFFSET, 8828 }, + { 0x32d6, G_UNICODE_NOT_PRESENT_OFFSET, 8832 }, + { 0x32d7, G_UNICODE_NOT_PRESENT_OFFSET, 8836 }, + { 0x32d8, G_UNICODE_NOT_PRESENT_OFFSET, 8840 }, + { 0x32d9, G_UNICODE_NOT_PRESENT_OFFSET, 8844 }, + { 0x32da, G_UNICODE_NOT_PRESENT_OFFSET, 8848 }, + { 0x32db, G_UNICODE_NOT_PRESENT_OFFSET, 8852 }, + { 0x32dc, G_UNICODE_NOT_PRESENT_OFFSET, 8856 }, + { 0x32dd, G_UNICODE_NOT_PRESENT_OFFSET, 8860 }, + { 0x32de, G_UNICODE_NOT_PRESENT_OFFSET, 8864 }, + { 0x32df, G_UNICODE_NOT_PRESENT_OFFSET, 8868 }, + { 0x32e0, G_UNICODE_NOT_PRESENT_OFFSET, 8872 }, + { 0x32e1, G_UNICODE_NOT_PRESENT_OFFSET, 8876 }, + { 0x32e2, G_UNICODE_NOT_PRESENT_OFFSET, 8880 }, + { 0x32e3, G_UNICODE_NOT_PRESENT_OFFSET, 8884 }, + { 0x32e4, G_UNICODE_NOT_PRESENT_OFFSET, 8888 }, + { 0x32e5, G_UNICODE_NOT_PRESENT_OFFSET, 8892 }, + { 0x32e6, G_UNICODE_NOT_PRESENT_OFFSET, 8896 }, + { 0x32e7, G_UNICODE_NOT_PRESENT_OFFSET, 8900 }, + { 0x32e8, G_UNICODE_NOT_PRESENT_OFFSET, 8904 }, + { 0x32e9, G_UNICODE_NOT_PRESENT_OFFSET, 8908 }, + { 0x32ea, G_UNICODE_NOT_PRESENT_OFFSET, 8912 }, + { 0x32eb, G_UNICODE_NOT_PRESENT_OFFSET, 8916 }, + { 0x32ec, G_UNICODE_NOT_PRESENT_OFFSET, 8920 }, + { 0x32ed, G_UNICODE_NOT_PRESENT_OFFSET, 8924 }, + { 0x32ee, G_UNICODE_NOT_PRESENT_OFFSET, 8928 }, + { 0x32ef, G_UNICODE_NOT_PRESENT_OFFSET, 8932 }, + { 0x32f0, G_UNICODE_NOT_PRESENT_OFFSET, 8936 }, + { 0x32f1, G_UNICODE_NOT_PRESENT_OFFSET, 8940 }, + { 0x32f2, G_UNICODE_NOT_PRESENT_OFFSET, 8944 }, + { 0x32f3, G_UNICODE_NOT_PRESENT_OFFSET, 8948 }, + { 0x32f4, G_UNICODE_NOT_PRESENT_OFFSET, 8952 }, + { 0x32f5, G_UNICODE_NOT_PRESENT_OFFSET, 8956 }, + { 0x32f6, G_UNICODE_NOT_PRESENT_OFFSET, 8960 }, + { 0x32f7, G_UNICODE_NOT_PRESENT_OFFSET, 8964 }, + { 0x32f8, G_UNICODE_NOT_PRESENT_OFFSET, 8968 }, + { 0x32f9, G_UNICODE_NOT_PRESENT_OFFSET, 8972 }, + { 0x32fa, G_UNICODE_NOT_PRESENT_OFFSET, 8976 }, + { 0x32fb, G_UNICODE_NOT_PRESENT_OFFSET, 8980 }, + { 0x32fc, G_UNICODE_NOT_PRESENT_OFFSET, 8984 }, + { 0x32fd, G_UNICODE_NOT_PRESENT_OFFSET, 8988 }, + { 0x32fe, G_UNICODE_NOT_PRESENT_OFFSET, 8992 }, + { 0x3300, G_UNICODE_NOT_PRESENT_OFFSET, 8996 }, + { 0x3301, G_UNICODE_NOT_PRESENT_OFFSET, 9012 }, + { 0x3302, G_UNICODE_NOT_PRESENT_OFFSET, 9025 }, + { 0x3303, G_UNICODE_NOT_PRESENT_OFFSET, 9041 }, + { 0x3304, G_UNICODE_NOT_PRESENT_OFFSET, 9051 }, + { 0x3305, G_UNICODE_NOT_PRESENT_OFFSET, 9067 }, + { 0x3306, G_UNICODE_NOT_PRESENT_OFFSET, 9077 }, + { 0x3307, G_UNICODE_NOT_PRESENT_OFFSET, 9087 }, + { 0x3308, G_UNICODE_NOT_PRESENT_OFFSET, 9106 }, + { 0x3309, G_UNICODE_NOT_PRESENT_OFFSET, 9119 }, + { 0x330a, G_UNICODE_NOT_PRESENT_OFFSET, 9129 }, + { 0x330b, G_UNICODE_NOT_PRESENT_OFFSET, 9139 }, + { 0x330c, G_UNICODE_NOT_PRESENT_OFFSET, 9149 }, + { 0x330d, G_UNICODE_NOT_PRESENT_OFFSET, 9162 }, + { 0x330e, G_UNICODE_NOT_PRESENT_OFFSET, 9175 }, + { 0x330f, G_UNICODE_NOT_PRESENT_OFFSET, 9188 }, + { 0x3310, G_UNICODE_NOT_PRESENT_OFFSET, 9201 }, + { 0x3311, G_UNICODE_NOT_PRESENT_OFFSET, 9214 }, + { 0x3312, G_UNICODE_NOT_PRESENT_OFFSET, 9227 }, + { 0x3313, G_UNICODE_NOT_PRESENT_OFFSET, 9240 }, + { 0x3314, G_UNICODE_NOT_PRESENT_OFFSET, 9259 }, + { 0x3315, G_UNICODE_NOT_PRESENT_OFFSET, 9266 }, + { 0x3316, G_UNICODE_NOT_PRESENT_OFFSET, 9285 }, + { 0x3317, G_UNICODE_NOT_PRESENT_OFFSET, 9304 }, + { 0x3318, G_UNICODE_NOT_PRESENT_OFFSET, 9320 }, + { 0x3319, G_UNICODE_NOT_PRESENT_OFFSET, 9333 }, + { 0x331a, G_UNICODE_NOT_PRESENT_OFFSET, 9352 }, + { 0x331b, G_UNICODE_NOT_PRESENT_OFFSET, 9371 }, + { 0x331c, G_UNICODE_NOT_PRESENT_OFFSET, 9384 }, + { 0x331d, G_UNICODE_NOT_PRESENT_OFFSET, 9394 }, + { 0x331e, G_UNICODE_NOT_PRESENT_OFFSET, 9404 }, + { 0x331f, G_UNICODE_NOT_PRESENT_OFFSET, 9417 }, + { 0x3320, G_UNICODE_NOT_PRESENT_OFFSET, 9430 }, + { 0x3321, G_UNICODE_NOT_PRESENT_OFFSET, 9446 }, + { 0x3322, G_UNICODE_NOT_PRESENT_OFFSET, 9462 }, + { 0x3323, G_UNICODE_NOT_PRESENT_OFFSET, 9472 }, + { 0x3324, G_UNICODE_NOT_PRESENT_OFFSET, 9482 }, + { 0x3325, G_UNICODE_NOT_PRESENT_OFFSET, 9495 }, + { 0x3326, G_UNICODE_NOT_PRESENT_OFFSET, 9505 }, + { 0x3327, G_UNICODE_NOT_PRESENT_OFFSET, 9515 }, + { 0x3328, G_UNICODE_NOT_PRESENT_OFFSET, 9522 }, + { 0x3329, G_UNICODE_NOT_PRESENT_OFFSET, 9529 }, + { 0x332a, G_UNICODE_NOT_PRESENT_OFFSET, 9539 }, + { 0x332b, G_UNICODE_NOT_PRESENT_OFFSET, 9549 }, + { 0x332c, G_UNICODE_NOT_PRESENT_OFFSET, 9568 }, + { 0x332d, G_UNICODE_NOT_PRESENT_OFFSET, 9581 }, + { 0x332e, G_UNICODE_NOT_PRESENT_OFFSET, 9597 }, + { 0x332f, G_UNICODE_NOT_PRESENT_OFFSET, 9616 }, + { 0x3330, G_UNICODE_NOT_PRESENT_OFFSET, 9629 }, + { 0x3331, G_UNICODE_NOT_PRESENT_OFFSET, 9639 }, + { 0x3332, G_UNICODE_NOT_PRESENT_OFFSET, 9649 }, + { 0x3333, G_UNICODE_NOT_PRESENT_OFFSET, 9668 }, + { 0x3334, G_UNICODE_NOT_PRESENT_OFFSET, 9681 }, + { 0x3335, G_UNICODE_NOT_PRESENT_OFFSET, 9700 }, + { 0x3336, G_UNICODE_NOT_PRESENT_OFFSET, 9710 }, + { 0x3337, G_UNICODE_NOT_PRESENT_OFFSET, 9726 }, + { 0x3338, G_UNICODE_NOT_PRESENT_OFFSET, 9736 }, + { 0x3339, G_UNICODE_NOT_PRESENT_OFFSET, 9749 }, + { 0x333a, G_UNICODE_NOT_PRESENT_OFFSET, 9759 }, + { 0x333b, G_UNICODE_NOT_PRESENT_OFFSET, 9772 }, + { 0x333c, G_UNICODE_NOT_PRESENT_OFFSET, 9788 }, + { 0x333d, G_UNICODE_NOT_PRESENT_OFFSET, 9801 }, + { 0x333e, G_UNICODE_NOT_PRESENT_OFFSET, 9817 }, + { 0x333f, G_UNICODE_NOT_PRESENT_OFFSET, 9830 }, + { 0x3340, G_UNICODE_NOT_PRESENT_OFFSET, 9837 }, + { 0x3341, G_UNICODE_NOT_PRESENT_OFFSET, 9853 }, + { 0x3342, G_UNICODE_NOT_PRESENT_OFFSET, 9863 }, + { 0x3343, G_UNICODE_NOT_PRESENT_OFFSET, 9873 }, + { 0x3344, G_UNICODE_NOT_PRESENT_OFFSET, 9886 }, + { 0x3345, G_UNICODE_NOT_PRESENT_OFFSET, 9896 }, + { 0x3346, G_UNICODE_NOT_PRESENT_OFFSET, 9906 }, + { 0x3347, G_UNICODE_NOT_PRESENT_OFFSET, 9916 }, + { 0x3348, G_UNICODE_NOT_PRESENT_OFFSET, 9932 }, + { 0x3349, G_UNICODE_NOT_PRESENT_OFFSET, 9945 }, + { 0x334a, G_UNICODE_NOT_PRESENT_OFFSET, 9952 }, + { 0x334b, G_UNICODE_NOT_PRESENT_OFFSET, 9971 }, + { 0x334c, G_UNICODE_NOT_PRESENT_OFFSET, 9981 }, + { 0x334d, G_UNICODE_NOT_PRESENT_OFFSET, 9997 }, + { 0x334e, G_UNICODE_NOT_PRESENT_OFFSET, 10010 }, + { 0x334f, G_UNICODE_NOT_PRESENT_OFFSET, 10023 }, + { 0x3350, G_UNICODE_NOT_PRESENT_OFFSET, 10033 }, + { 0x3351, G_UNICODE_NOT_PRESENT_OFFSET, 10043 }, + { 0x3352, G_UNICODE_NOT_PRESENT_OFFSET, 10056 }, + { 0x3353, G_UNICODE_NOT_PRESENT_OFFSET, 10063 }, + { 0x3354, G_UNICODE_NOT_PRESENT_OFFSET, 10076 }, + { 0x3355, G_UNICODE_NOT_PRESENT_OFFSET, 10092 }, + { 0x3356, G_UNICODE_NOT_PRESENT_OFFSET, 10099 }, + { 0x3357, G_UNICODE_NOT_PRESENT_OFFSET, 10118 }, + { 0x3358, G_UNICODE_NOT_PRESENT_OFFSET, 10128 }, + { 0x3359, G_UNICODE_NOT_PRESENT_OFFSET, 10133 }, + { 0x335a, G_UNICODE_NOT_PRESENT_OFFSET, 10138 }, + { 0x335b, G_UNICODE_NOT_PRESENT_OFFSET, 10143 }, + { 0x335c, G_UNICODE_NOT_PRESENT_OFFSET, 10148 }, + { 0x335d, G_UNICODE_NOT_PRESENT_OFFSET, 10153 }, + { 0x335e, G_UNICODE_NOT_PRESENT_OFFSET, 10158 }, + { 0x335f, G_UNICODE_NOT_PRESENT_OFFSET, 10163 }, + { 0x3360, G_UNICODE_NOT_PRESENT_OFFSET, 10168 }, + { 0x3361, G_UNICODE_NOT_PRESENT_OFFSET, 10173 }, + { 0x3362, G_UNICODE_NOT_PRESENT_OFFSET, 10178 }, + { 0x3363, G_UNICODE_NOT_PRESENT_OFFSET, 10184 }, + { 0x3364, G_UNICODE_NOT_PRESENT_OFFSET, 10190 }, + { 0x3365, G_UNICODE_NOT_PRESENT_OFFSET, 10196 }, + { 0x3366, G_UNICODE_NOT_PRESENT_OFFSET, 10202 }, + { 0x3367, G_UNICODE_NOT_PRESENT_OFFSET, 10208 }, + { 0x3368, G_UNICODE_NOT_PRESENT_OFFSET, 10214 }, + { 0x3369, G_UNICODE_NOT_PRESENT_OFFSET, 10220 }, + { 0x336a, G_UNICODE_NOT_PRESENT_OFFSET, 10226 }, + { 0x336b, G_UNICODE_NOT_PRESENT_OFFSET, 10232 }, + { 0x336c, G_UNICODE_NOT_PRESENT_OFFSET, 10238 }, + { 0x336d, G_UNICODE_NOT_PRESENT_OFFSET, 10244 }, + { 0x336e, G_UNICODE_NOT_PRESENT_OFFSET, 10250 }, + { 0x336f, G_UNICODE_NOT_PRESENT_OFFSET, 10256 }, + { 0x3370, G_UNICODE_NOT_PRESENT_OFFSET, 10262 }, + { 0x3371, G_UNICODE_NOT_PRESENT_OFFSET, 10268 }, + { 0x3372, G_UNICODE_NOT_PRESENT_OFFSET, 10272 }, + { 0x3373, G_UNICODE_NOT_PRESENT_OFFSET, 10275 }, + { 0x3374, G_UNICODE_NOT_PRESENT_OFFSET, 10278 }, + { 0x3375, G_UNICODE_NOT_PRESENT_OFFSET, 10282 }, + { 0x3376, G_UNICODE_NOT_PRESENT_OFFSET, 10285 }, + { 0x3377, G_UNICODE_NOT_PRESENT_OFFSET, 10288 }, + { 0x3378, G_UNICODE_NOT_PRESENT_OFFSET, 10291 }, + { 0x3379, G_UNICODE_NOT_PRESENT_OFFSET, 10295 }, + { 0x337a, G_UNICODE_NOT_PRESENT_OFFSET, 10299 }, + { 0x337b, G_UNICODE_NOT_PRESENT_OFFSET, 10302 }, + { 0x337c, G_UNICODE_NOT_PRESENT_OFFSET, 10309 }, + { 0x337d, G_UNICODE_NOT_PRESENT_OFFSET, 10316 }, + { 0x337e, G_UNICODE_NOT_PRESENT_OFFSET, 10323 }, + { 0x337f, G_UNICODE_NOT_PRESENT_OFFSET, 10330 }, + { 0x3380, G_UNICODE_NOT_PRESENT_OFFSET, 10343 }, + { 0x3381, G_UNICODE_NOT_PRESENT_OFFSET, 10346 }, + { 0x3382, G_UNICODE_NOT_PRESENT_OFFSET, 10349 }, + { 0x3383, G_UNICODE_NOT_PRESENT_OFFSET, 10353 }, + { 0x3384, G_UNICODE_NOT_PRESENT_OFFSET, 10356 }, + { 0x3385, G_UNICODE_NOT_PRESENT_OFFSET, 10359 }, + { 0x3386, G_UNICODE_NOT_PRESENT_OFFSET, 10362 }, + { 0x3387, G_UNICODE_NOT_PRESENT_OFFSET, 10365 }, + { 0x3388, G_UNICODE_NOT_PRESENT_OFFSET, 10368 }, + { 0x3389, G_UNICODE_NOT_PRESENT_OFFSET, 10372 }, + { 0x338a, G_UNICODE_NOT_PRESENT_OFFSET, 10377 }, + { 0x338b, G_UNICODE_NOT_PRESENT_OFFSET, 10380 }, + { 0x338c, G_UNICODE_NOT_PRESENT_OFFSET, 10383 }, + { 0x338d, G_UNICODE_NOT_PRESENT_OFFSET, 10387 }, + { 0x338e, G_UNICODE_NOT_PRESENT_OFFSET, 10391 }, + { 0x338f, G_UNICODE_NOT_PRESENT_OFFSET, 10394 }, + { 0x3390, G_UNICODE_NOT_PRESENT_OFFSET, 10397 }, + { 0x3391, G_UNICODE_NOT_PRESENT_OFFSET, 10400 }, + { 0x3392, G_UNICODE_NOT_PRESENT_OFFSET, 10404 }, + { 0x3393, G_UNICODE_NOT_PRESENT_OFFSET, 10408 }, + { 0x3394, G_UNICODE_NOT_PRESENT_OFFSET, 10412 }, + { 0x3395, G_UNICODE_NOT_PRESENT_OFFSET, 10416 }, + { 0x3396, G_UNICODE_NOT_PRESENT_OFFSET, 10420 }, + { 0x3397, G_UNICODE_NOT_PRESENT_OFFSET, 10423 }, + { 0x3398, G_UNICODE_NOT_PRESENT_OFFSET, 10426 }, + { 0x3399, G_UNICODE_NOT_PRESENT_OFFSET, 10429 }, + { 0x339a, G_UNICODE_NOT_PRESENT_OFFSET, 10432 }, + { 0x339b, G_UNICODE_NOT_PRESENT_OFFSET, 10435 }, + { 0x339c, G_UNICODE_NOT_PRESENT_OFFSET, 10439 }, + { 0x339d, G_UNICODE_NOT_PRESENT_OFFSET, 10442 }, + { 0x339e, G_UNICODE_NOT_PRESENT_OFFSET, 10445 }, + { 0x339f, G_UNICODE_NOT_PRESENT_OFFSET, 10448 }, + { 0x33a0, G_UNICODE_NOT_PRESENT_OFFSET, 10452 }, + { 0x33a1, G_UNICODE_NOT_PRESENT_OFFSET, 10456 }, + { 0x33a2, G_UNICODE_NOT_PRESENT_OFFSET, 10459 }, + { 0x33a3, G_UNICODE_NOT_PRESENT_OFFSET, 10463 }, + { 0x33a4, G_UNICODE_NOT_PRESENT_OFFSET, 10467 }, + { 0x33a5, G_UNICODE_NOT_PRESENT_OFFSET, 10471 }, + { 0x33a6, G_UNICODE_NOT_PRESENT_OFFSET, 10474 }, + { 0x33a7, G_UNICODE_NOT_PRESENT_OFFSET, 10478 }, + { 0x33a8, G_UNICODE_NOT_PRESENT_OFFSET, 10484 }, + { 0x33a9, G_UNICODE_NOT_PRESENT_OFFSET, 10491 }, + { 0x33aa, G_UNICODE_NOT_PRESENT_OFFSET, 10494 }, + { 0x33ab, G_UNICODE_NOT_PRESENT_OFFSET, 10498 }, + { 0x33ac, G_UNICODE_NOT_PRESENT_OFFSET, 10502 }, + { 0x33ad, G_UNICODE_NOT_PRESENT_OFFSET, 10506 }, + { 0x33ae, G_UNICODE_NOT_PRESENT_OFFSET, 10510 }, + { 0x33af, G_UNICODE_NOT_PRESENT_OFFSET, 10518 }, + { 0x33b0, G_UNICODE_NOT_PRESENT_OFFSET, 10527 }, + { 0x33b1, G_UNICODE_NOT_PRESENT_OFFSET, 10530 }, + { 0x33b2, G_UNICODE_NOT_PRESENT_OFFSET, 10533 }, + { 0x33b3, G_UNICODE_NOT_PRESENT_OFFSET, 10537 }, + { 0x33b4, G_UNICODE_NOT_PRESENT_OFFSET, 10540 }, + { 0x33b5, G_UNICODE_NOT_PRESENT_OFFSET, 10543 }, + { 0x33b6, G_UNICODE_NOT_PRESENT_OFFSET, 10546 }, + { 0x33b7, G_UNICODE_NOT_PRESENT_OFFSET, 10550 }, + { 0x33b8, G_UNICODE_NOT_PRESENT_OFFSET, 10553 }, + { 0x33b9, G_UNICODE_NOT_PRESENT_OFFSET, 10556 }, + { 0x33ba, G_UNICODE_NOT_PRESENT_OFFSET, 10559 }, + { 0x33bb, G_UNICODE_NOT_PRESENT_OFFSET, 10562 }, + { 0x33bc, G_UNICODE_NOT_PRESENT_OFFSET, 10565 }, + { 0x33bd, G_UNICODE_NOT_PRESENT_OFFSET, 10569 }, + { 0x33be, G_UNICODE_NOT_PRESENT_OFFSET, 10572 }, + { 0x33bf, G_UNICODE_NOT_PRESENT_OFFSET, 10575 }, + { 0x33c0, G_UNICODE_NOT_PRESENT_OFFSET, 10578 }, + { 0x33c1, G_UNICODE_NOT_PRESENT_OFFSET, 10582 }, + { 0x33c2, G_UNICODE_NOT_PRESENT_OFFSET, 10586 }, + { 0x33c3, G_UNICODE_NOT_PRESENT_OFFSET, 10591 }, + { 0x33c4, G_UNICODE_NOT_PRESENT_OFFSET, 10594 }, + { 0x33c5, G_UNICODE_NOT_PRESENT_OFFSET, 10597 }, + { 0x33c6, G_UNICODE_NOT_PRESENT_OFFSET, 10600 }, + { 0x33c7, G_UNICODE_NOT_PRESENT_OFFSET, 10607 }, + { 0x33c8, G_UNICODE_NOT_PRESENT_OFFSET, 10611 }, + { 0x33c9, G_UNICODE_NOT_PRESENT_OFFSET, 10614 }, + { 0x33ca, G_UNICODE_NOT_PRESENT_OFFSET, 10617 }, + { 0x33cb, G_UNICODE_NOT_PRESENT_OFFSET, 10620 }, + { 0x33cc, G_UNICODE_NOT_PRESENT_OFFSET, 10623 }, + { 0x33cd, G_UNICODE_NOT_PRESENT_OFFSET, 10626 }, + { 0x33ce, G_UNICODE_NOT_PRESENT_OFFSET, 10629 }, + { 0x33cf, G_UNICODE_NOT_PRESENT_OFFSET, 10632 }, + { 0x33d0, G_UNICODE_NOT_PRESENT_OFFSET, 10635 }, + { 0x33d1, G_UNICODE_NOT_PRESENT_OFFSET, 10638 }, + { 0x33d2, G_UNICODE_NOT_PRESENT_OFFSET, 10641 }, + { 0x33d3, G_UNICODE_NOT_PRESENT_OFFSET, 10645 }, + { 0x33d4, G_UNICODE_NOT_PRESENT_OFFSET, 10648 }, + { 0x33d5, G_UNICODE_NOT_PRESENT_OFFSET, 10651 }, + { 0x33d6, G_UNICODE_NOT_PRESENT_OFFSET, 10655 }, + { 0x33d7, G_UNICODE_NOT_PRESENT_OFFSET, 10659 }, + { 0x33d8, G_UNICODE_NOT_PRESENT_OFFSET, 10662 }, + { 0x33d9, G_UNICODE_NOT_PRESENT_OFFSET, 10667 }, + { 0x33da, G_UNICODE_NOT_PRESENT_OFFSET, 10671 }, + { 0x33db, G_UNICODE_NOT_PRESENT_OFFSET, 10674 }, + { 0x33dc, G_UNICODE_NOT_PRESENT_OFFSET, 10677 }, + { 0x33dd, G_UNICODE_NOT_PRESENT_OFFSET, 10680 }, + { 0x33de, G_UNICODE_NOT_PRESENT_OFFSET, 10683 }, + { 0x33df, G_UNICODE_NOT_PRESENT_OFFSET, 10689 }, + { 0x33e0, G_UNICODE_NOT_PRESENT_OFFSET, 10695 }, + { 0x33e1, G_UNICODE_NOT_PRESENT_OFFSET, 10700 }, + { 0x33e2, G_UNICODE_NOT_PRESENT_OFFSET, 10705 }, + { 0x33e3, G_UNICODE_NOT_PRESENT_OFFSET, 10710 }, + { 0x33e4, G_UNICODE_NOT_PRESENT_OFFSET, 10715 }, + { 0x33e5, G_UNICODE_NOT_PRESENT_OFFSET, 10720 }, + { 0x33e6, G_UNICODE_NOT_PRESENT_OFFSET, 10725 }, + { 0x33e7, G_UNICODE_NOT_PRESENT_OFFSET, 10730 }, + { 0x33e8, G_UNICODE_NOT_PRESENT_OFFSET, 10735 }, + { 0x33e9, G_UNICODE_NOT_PRESENT_OFFSET, 10740 }, + { 0x33ea, G_UNICODE_NOT_PRESENT_OFFSET, 10746 }, + { 0x33eb, G_UNICODE_NOT_PRESENT_OFFSET, 10752 }, + { 0x33ec, G_UNICODE_NOT_PRESENT_OFFSET, 10758 }, + { 0x33ed, G_UNICODE_NOT_PRESENT_OFFSET, 10764 }, + { 0x33ee, G_UNICODE_NOT_PRESENT_OFFSET, 10770 }, + { 0x33ef, G_UNICODE_NOT_PRESENT_OFFSET, 10776 }, + { 0x33f0, G_UNICODE_NOT_PRESENT_OFFSET, 10782 }, + { 0x33f1, G_UNICODE_NOT_PRESENT_OFFSET, 10788 }, + { 0x33f2, G_UNICODE_NOT_PRESENT_OFFSET, 10794 }, + { 0x33f3, G_UNICODE_NOT_PRESENT_OFFSET, 10800 }, + { 0x33f4, G_UNICODE_NOT_PRESENT_OFFSET, 10806 }, + { 0x33f5, G_UNICODE_NOT_PRESENT_OFFSET, 10812 }, + { 0x33f6, G_UNICODE_NOT_PRESENT_OFFSET, 10818 }, + { 0x33f7, G_UNICODE_NOT_PRESENT_OFFSET, 10824 }, + { 0x33f8, G_UNICODE_NOT_PRESENT_OFFSET, 10830 }, + { 0x33f9, G_UNICODE_NOT_PRESENT_OFFSET, 10836 }, + { 0x33fa, G_UNICODE_NOT_PRESENT_OFFSET, 10842 }, + { 0x33fb, G_UNICODE_NOT_PRESENT_OFFSET, 10848 }, + { 0x33fc, G_UNICODE_NOT_PRESENT_OFFSET, 10854 }, + { 0x33fd, G_UNICODE_NOT_PRESENT_OFFSET, 10860 }, + { 0x33fe, G_UNICODE_NOT_PRESENT_OFFSET, 10866 }, + { 0x33ff, G_UNICODE_NOT_PRESENT_OFFSET, 10872 }, + { 0xa770, G_UNICODE_NOT_PRESENT_OFFSET, 10876 }, + { 0xa7f8, G_UNICODE_NOT_PRESENT_OFFSET, 10880 }, + { 0xa7f9, G_UNICODE_NOT_PRESENT_OFFSET, 10883 }, + { 0xf900, 10886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf901, 10890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf902, 6813, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf903, 10894, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf904, 10898, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf905, 10902, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf906, 10906, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf907, 7029, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf908, 7029, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf909, 10910, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90a, 6845, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90b, 10914, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90c, 10918, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90d, 10922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90e, 10926, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf90f, 10930, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf910, 10934, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf911, 10938, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf912, 10942, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf913, 10946, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf914, 10950, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf915, 10954, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf916, 10958, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf917, 10962, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf918, 10966, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf919, 10970, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91a, 10974, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91b, 10978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91c, 10982, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91d, 10986, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91e, 10990, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf91f, 10994, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf920, 10998, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf921, 11002, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf922, 11006, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf923, 11010, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf924, 11014, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf925, 11018, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf926, 11022, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf927, 11026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf928, 11030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf929, 11034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92a, 11038, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92b, 11042, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92c, 11046, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92d, 11050, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92e, 11054, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf92f, 11058, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf930, 11062, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf931, 11066, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf932, 11070, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf933, 11074, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf934, 6677, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf935, 11078, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf936, 11082, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf937, 11086, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf938, 11090, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf939, 11094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93a, 11098, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93b, 11102, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93c, 11106, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93d, 11110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93e, 11114, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf93f, 11118, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf940, 6969, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf941, 11122, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf942, 11126, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf943, 11130, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf944, 11134, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf945, 11138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf946, 11142, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf947, 11146, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf948, 11150, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf949, 11154, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94a, 11158, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94b, 11162, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94c, 11166, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94d, 11170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94e, 11174, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf94f, 11178, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf950, 11182, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf951, 11186, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf952, 11190, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf953, 11194, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf954, 11198, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf955, 11202, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf956, 11206, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf957, 11210, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf958, 11214, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf959, 11218, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95a, 11222, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95b, 11226, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95c, 10950, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95d, 11230, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95e, 11234, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf95f, 11238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf960, 11242, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf961, 11246, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf962, 11250, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf963, 11254, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf964, 11258, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf965, 11262, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf966, 11266, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf967, 11270, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf968, 11274, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf969, 11278, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96a, 11282, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96b, 11286, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96c, 11290, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96d, 11294, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96e, 11298, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf96f, 11302, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf970, 11306, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf971, 6821, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf972, 11310, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf973, 11314, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf974, 11318, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf975, 11322, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf976, 11326, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf977, 11330, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf978, 11334, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf979, 11338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97a, 11342, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97b, 11346, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97c, 11350, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97d, 11354, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97e, 11358, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf97f, 11362, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf980, 11366, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf981, 6329, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf982, 11370, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf983, 11374, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf984, 11378, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf985, 11382, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf986, 11386, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf987, 11390, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf988, 11394, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf989, 11398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98a, 6253, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98b, 11402, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98c, 11406, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98d, 11410, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98e, 11414, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf98f, 11418, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf990, 11422, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf991, 11426, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf992, 11430, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf993, 11434, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf994, 11438, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf995, 11442, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf996, 11446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf997, 11450, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf998, 11454, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf999, 11458, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99a, 11462, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99b, 11466, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99c, 11470, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99d, 11474, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99e, 11478, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf99f, 11482, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a0, 11486, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a1, 11302, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a2, 11490, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a3, 11494, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a4, 11498, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a5, 11502, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a6, 11506, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a7, 11510, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a8, 11514, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9a9, 11518, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9aa, 11238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ab, 11522, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ac, 11526, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ad, 11530, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ae, 11534, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9af, 11538, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b0, 11542, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b1, 11546, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b2, 11550, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b3, 11554, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b4, 11558, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b5, 11562, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b6, 11566, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b7, 11570, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b8, 11574, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9b9, 11578, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ba, 11582, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bb, 11586, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bc, 11590, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bd, 11594, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9be, 11598, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9bf, 10950, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c0, 11602, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c1, 11606, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c2, 11610, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c3, 11614, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c4, 7025, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c5, 11618, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c6, 11622, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c7, 11626, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c8, 11630, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9c9, 11634, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ca, 11638, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cb, 11642, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cc, 11646, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cd, 11650, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ce, 11654, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9cf, 11658, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d0, 11662, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d1, 8562, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d2, 11666, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d3, 11670, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d4, 11674, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d5, 11678, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d6, 11682, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d7, 11686, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d8, 11690, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9d9, 11694, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9da, 11698, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9db, 11246, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9dc, 11702, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9dd, 11706, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9de, 11710, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9df, 11714, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e0, 11718, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e1, 11722, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e2, 11726, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e3, 11730, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e4, 11734, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e5, 11738, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e6, 11742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e7, 11746, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e8, 11750, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9e9, 6841, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ea, 11754, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9eb, 11758, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ec, 11762, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ed, 11766, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ee, 11770, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ef, 11774, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f0, 11778, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f1, 11782, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f2, 11786, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f3, 11790, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f4, 11794, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f5, 11798, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f6, 11802, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f7, 6645, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f8, 11806, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9f9, 11810, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fa, 11814, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fb, 11818, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fc, 11822, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fd, 11826, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9fe, 11830, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xf9ff, 11834, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa00, 11838, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa01, 11842, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa02, 11846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa03, 11850, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa04, 11854, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa05, 11858, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa06, 11862, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa07, 11866, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa08, 6753, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa09, 11870, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0a, 6765, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0b, 11874, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0c, 11878, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa0d, 11882, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa10, 11886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa12, 11890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa15, 11894, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa16, 11898, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa17, 11902, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa18, 11906, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa19, 11910, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1a, 11914, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1b, 11918, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1c, 11922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1d, 11926, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa1e, 6673, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa20, 11930, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa22, 11934, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa25, 11938, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa26, 11942, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2a, 11946, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2b, 11950, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2c, 11954, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2d, 11958, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2e, 11962, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa2f, 11966, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa30, 11970, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa31, 11974, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa32, 11978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa33, 11982, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa34, 11986, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa35, 11990, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa36, 11994, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa37, 11998, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa38, 12002, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa39, 12006, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3a, 12010, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3b, 12014, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3c, 6357, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3d, 12018, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3e, 12022, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa3f, 12026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa40, 12030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa41, 12034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa42, 12038, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa43, 12042, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa44, 12046, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa45, 12050, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa46, 12054, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa47, 12058, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa48, 12062, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa49, 12066, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4a, 12070, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4b, 12074, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4c, 8582, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4d, 12078, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4e, 12082, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa4f, 12086, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa50, 12090, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa51, 8598, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa52, 12094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa53, 12098, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa54, 12102, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa55, 12106, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa56, 12110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa57, 11446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa58, 12114, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa59, 12118, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5a, 12122, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5b, 12126, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5c, 12130, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5d, 12134, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5e, 12134, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa5f, 12138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa60, 12142, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa61, 12146, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa62, 12150, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa63, 12154, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa64, 12158, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa65, 12162, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa66, 12166, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa67, 11938, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa68, 12170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa69, 12174, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa6a, 12178, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa6b, 12182, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa6c, 12186, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa6d, 12191, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa70, 12195, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa71, 12199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa72, 12203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa73, 12207, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa74, 12211, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa75, 12215, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa76, 12219, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa77, 12223, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa78, 11994, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa79, 12227, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7a, 12231, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7b, 12235, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7c, 11886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7d, 12239, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7e, 12243, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa7f, 12247, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa80, 12251, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa81, 12255, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa82, 12259, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa83, 12263, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa84, 12267, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa85, 12271, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa86, 12275, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa87, 12279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa88, 12283, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa89, 12026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8a, 12287, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8b, 12030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8c, 12291, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8d, 12295, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8e, 12299, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa8f, 12303, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa90, 12307, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa91, 11890, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa92, 11034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa93, 12311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa94, 12315, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa95, 6489, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa96, 11306, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa97, 11638, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa98, 12319, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa99, 12323, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9a, 12058, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9b, 12327, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9c, 12062, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9d, 12331, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9e, 12335, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfa9f, 12339, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa0, 11898, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa1, 12343, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa2, 12347, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa3, 12351, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa4, 12355, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa5, 12359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa6, 11902, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa7, 12363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa8, 12367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaa9, 12371, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaaa, 12375, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaab, 12379, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaac, 12383, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaad, 12110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaae, 12387, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaaf, 12391, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab0, 11446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab1, 12395, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab2, 12126, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab3, 12399, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab4, 12403, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab5, 12407, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab6, 12411, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab7, 12415, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab8, 12146, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfab9, 12419, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaba, 11934, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabb, 12423, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabc, 12150, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabd, 11230, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabe, 12427, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfabf, 12154, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac0, 12431, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac1, 12162, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac2, 12435, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac3, 12439, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac4, 12443, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac5, 12447, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac6, 12451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac7, 12170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac8, 11922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfac9, 12455, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfaca, 12174, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacb, 12459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacc, 12178, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacd, 12463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xface, 7029, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfacf, 12467, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad0, 12472, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad1, 12477, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad2, 12482, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad3, 12486, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad4, 12490, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad5, 12494, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad6, 12499, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad7, 12504, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad8, 12509, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfad9, 12513, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb00, G_UNICODE_NOT_PRESENT_OFFSET, 12517 }, + { 0xfb01, G_UNICODE_NOT_PRESENT_OFFSET, 12520 }, + { 0xfb02, G_UNICODE_NOT_PRESENT_OFFSET, 12523 }, + { 0xfb03, G_UNICODE_NOT_PRESENT_OFFSET, 12526 }, + { 0xfb04, G_UNICODE_NOT_PRESENT_OFFSET, 12530 }, + { 0xfb05, G_UNICODE_NOT_PRESENT_OFFSET, 12534 }, + { 0xfb06, G_UNICODE_NOT_PRESENT_OFFSET, 12534 }, + { 0xfb13, G_UNICODE_NOT_PRESENT_OFFSET, 12537 }, + { 0xfb14, G_UNICODE_NOT_PRESENT_OFFSET, 12542 }, + { 0xfb15, G_UNICODE_NOT_PRESENT_OFFSET, 12547 }, + { 0xfb16, G_UNICODE_NOT_PRESENT_OFFSET, 12552 }, + { 0xfb17, G_UNICODE_NOT_PRESENT_OFFSET, 12557 }, + { 0xfb1d, 12562, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb1f, 12567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb20, G_UNICODE_NOT_PRESENT_OFFSET, 12572 }, + { 0xfb21, G_UNICODE_NOT_PRESENT_OFFSET, 5338 }, + { 0xfb22, G_UNICODE_NOT_PRESENT_OFFSET, 5347 }, + { 0xfb23, G_UNICODE_NOT_PRESENT_OFFSET, 12575 }, + { 0xfb24, G_UNICODE_NOT_PRESENT_OFFSET, 12578 }, + { 0xfb25, G_UNICODE_NOT_PRESENT_OFFSET, 12581 }, + { 0xfb26, G_UNICODE_NOT_PRESENT_OFFSET, 12584 }, + { 0xfb27, G_UNICODE_NOT_PRESENT_OFFSET, 12587 }, + { 0xfb28, G_UNICODE_NOT_PRESENT_OFFSET, 12590 }, + { 0xfb29, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xfb2a, 12593, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2b, 12598, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2c, 12603, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2d, 12610, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2e, 12617, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb2f, 12622, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb30, 12627, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb31, 12632, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb32, 12637, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb33, 12642, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb34, 12647, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb35, 12652, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb36, 12657, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb38, 12662, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb39, 12667, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3a, 12672, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3b, 12677, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3c, 12682, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb3e, 12687, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb40, 12692, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb41, 12697, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb43, 12702, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb44, 12707, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb46, 12712, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb47, 12717, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb48, 12722, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb49, 12727, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4a, 12732, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4b, 12737, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4c, 12742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4d, 12747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4e, 12752, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0xfb4f, G_UNICODE_NOT_PRESENT_OFFSET, 12757 }, + { 0xfb50, G_UNICODE_NOT_PRESENT_OFFSET, 12762 }, + { 0xfb51, G_UNICODE_NOT_PRESENT_OFFSET, 12762 }, + { 0xfb52, G_UNICODE_NOT_PRESENT_OFFSET, 12765 }, + { 0xfb53, G_UNICODE_NOT_PRESENT_OFFSET, 12765 }, + { 0xfb54, G_UNICODE_NOT_PRESENT_OFFSET, 12765 }, + { 0xfb55, G_UNICODE_NOT_PRESENT_OFFSET, 12765 }, + { 0xfb56, G_UNICODE_NOT_PRESENT_OFFSET, 12768 }, + { 0xfb57, G_UNICODE_NOT_PRESENT_OFFSET, 12768 }, + { 0xfb58, G_UNICODE_NOT_PRESENT_OFFSET, 12768 }, + { 0xfb59, G_UNICODE_NOT_PRESENT_OFFSET, 12768 }, + { 0xfb5a, G_UNICODE_NOT_PRESENT_OFFSET, 12771 }, + { 0xfb5b, G_UNICODE_NOT_PRESENT_OFFSET, 12771 }, + { 0xfb5c, G_UNICODE_NOT_PRESENT_OFFSET, 12771 }, + { 0xfb5d, G_UNICODE_NOT_PRESENT_OFFSET, 12771 }, + { 0xfb5e, G_UNICODE_NOT_PRESENT_OFFSET, 12774 }, + { 0xfb5f, G_UNICODE_NOT_PRESENT_OFFSET, 12774 }, + { 0xfb60, G_UNICODE_NOT_PRESENT_OFFSET, 12774 }, + { 0xfb61, G_UNICODE_NOT_PRESENT_OFFSET, 12774 }, + { 0xfb62, G_UNICODE_NOT_PRESENT_OFFSET, 12777 }, + { 0xfb63, G_UNICODE_NOT_PRESENT_OFFSET, 12777 }, + { 0xfb64, G_UNICODE_NOT_PRESENT_OFFSET, 12777 }, + { 0xfb65, G_UNICODE_NOT_PRESENT_OFFSET, 12777 }, + { 0xfb66, G_UNICODE_NOT_PRESENT_OFFSET, 12780 }, + { 0xfb67, G_UNICODE_NOT_PRESENT_OFFSET, 12780 }, + { 0xfb68, G_UNICODE_NOT_PRESENT_OFFSET, 12780 }, + { 0xfb69, G_UNICODE_NOT_PRESENT_OFFSET, 12780 }, + { 0xfb6a, G_UNICODE_NOT_PRESENT_OFFSET, 12783 }, + { 0xfb6b, G_UNICODE_NOT_PRESENT_OFFSET, 12783 }, + { 0xfb6c, G_UNICODE_NOT_PRESENT_OFFSET, 12783 }, + { 0xfb6d, G_UNICODE_NOT_PRESENT_OFFSET, 12783 }, + { 0xfb6e, G_UNICODE_NOT_PRESENT_OFFSET, 12786 }, + { 0xfb6f, G_UNICODE_NOT_PRESENT_OFFSET, 12786 }, + { 0xfb70, G_UNICODE_NOT_PRESENT_OFFSET, 12786 }, + { 0xfb71, G_UNICODE_NOT_PRESENT_OFFSET, 12786 }, + { 0xfb72, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, + { 0xfb73, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, + { 0xfb74, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, + { 0xfb75, G_UNICODE_NOT_PRESENT_OFFSET, 12789 }, + { 0xfb76, G_UNICODE_NOT_PRESENT_OFFSET, 12792 }, + { 0xfb77, G_UNICODE_NOT_PRESENT_OFFSET, 12792 }, + { 0xfb78, G_UNICODE_NOT_PRESENT_OFFSET, 12792 }, + { 0xfb79, G_UNICODE_NOT_PRESENT_OFFSET, 12792 }, + { 0xfb7a, G_UNICODE_NOT_PRESENT_OFFSET, 12795 }, + { 0xfb7b, G_UNICODE_NOT_PRESENT_OFFSET, 12795 }, + { 0xfb7c, G_UNICODE_NOT_PRESENT_OFFSET, 12795 }, + { 0xfb7d, G_UNICODE_NOT_PRESENT_OFFSET, 12795 }, + { 0xfb7e, G_UNICODE_NOT_PRESENT_OFFSET, 12798 }, + { 0xfb7f, G_UNICODE_NOT_PRESENT_OFFSET, 12798 }, + { 0xfb80, G_UNICODE_NOT_PRESENT_OFFSET, 12798 }, + { 0xfb81, G_UNICODE_NOT_PRESENT_OFFSET, 12798 }, + { 0xfb82, G_UNICODE_NOT_PRESENT_OFFSET, 12801 }, + { 0xfb83, G_UNICODE_NOT_PRESENT_OFFSET, 12801 }, + { 0xfb84, G_UNICODE_NOT_PRESENT_OFFSET, 12804 }, + { 0xfb85, G_UNICODE_NOT_PRESENT_OFFSET, 12804 }, + { 0xfb86, G_UNICODE_NOT_PRESENT_OFFSET, 12807 }, + { 0xfb87, G_UNICODE_NOT_PRESENT_OFFSET, 12807 }, + { 0xfb88, G_UNICODE_NOT_PRESENT_OFFSET, 12810 }, + { 0xfb89, G_UNICODE_NOT_PRESENT_OFFSET, 12810 }, + { 0xfb8a, G_UNICODE_NOT_PRESENT_OFFSET, 12813 }, + { 0xfb8b, G_UNICODE_NOT_PRESENT_OFFSET, 12813 }, + { 0xfb8c, G_UNICODE_NOT_PRESENT_OFFSET, 12816 }, + { 0xfb8d, G_UNICODE_NOT_PRESENT_OFFSET, 12816 }, + { 0xfb8e, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfb8f, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfb90, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfb91, G_UNICODE_NOT_PRESENT_OFFSET, 12819 }, + { 0xfb92, G_UNICODE_NOT_PRESENT_OFFSET, 12822 }, + { 0xfb93, G_UNICODE_NOT_PRESENT_OFFSET, 12822 }, + { 0xfb94, G_UNICODE_NOT_PRESENT_OFFSET, 12822 }, + { 0xfb95, G_UNICODE_NOT_PRESENT_OFFSET, 12822 }, + { 0xfb96, G_UNICODE_NOT_PRESENT_OFFSET, 12825 }, + { 0xfb97, G_UNICODE_NOT_PRESENT_OFFSET, 12825 }, + { 0xfb98, G_UNICODE_NOT_PRESENT_OFFSET, 12825 }, + { 0xfb99, G_UNICODE_NOT_PRESENT_OFFSET, 12825 }, + { 0xfb9a, G_UNICODE_NOT_PRESENT_OFFSET, 12828 }, + { 0xfb9b, G_UNICODE_NOT_PRESENT_OFFSET, 12828 }, + { 0xfb9c, G_UNICODE_NOT_PRESENT_OFFSET, 12828 }, + { 0xfb9d, G_UNICODE_NOT_PRESENT_OFFSET, 12828 }, + { 0xfb9e, G_UNICODE_NOT_PRESENT_OFFSET, 12831 }, + { 0xfb9f, G_UNICODE_NOT_PRESENT_OFFSET, 12831 }, + { 0xfba0, G_UNICODE_NOT_PRESENT_OFFSET, 12834 }, + { 0xfba1, G_UNICODE_NOT_PRESENT_OFFSET, 12834 }, + { 0xfba2, G_UNICODE_NOT_PRESENT_OFFSET, 12834 }, + { 0xfba3, G_UNICODE_NOT_PRESENT_OFFSET, 12834 }, + { 0xfba4, G_UNICODE_NOT_PRESENT_OFFSET, 1721 }, + { 0xfba5, G_UNICODE_NOT_PRESENT_OFFSET, 1721 }, + { 0xfba6, G_UNICODE_NOT_PRESENT_OFFSET, 12837 }, + { 0xfba7, G_UNICODE_NOT_PRESENT_OFFSET, 12837 }, + { 0xfba8, G_UNICODE_NOT_PRESENT_OFFSET, 12837 }, + { 0xfba9, G_UNICODE_NOT_PRESENT_OFFSET, 12837 }, + { 0xfbaa, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbab, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbac, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbad, G_UNICODE_NOT_PRESENT_OFFSET, 12840 }, + { 0xfbae, G_UNICODE_NOT_PRESENT_OFFSET, 12843 }, + { 0xfbaf, G_UNICODE_NOT_PRESENT_OFFSET, 12843 }, + { 0xfbb0, G_UNICODE_NOT_PRESENT_OFFSET, 1731 }, + { 0xfbb1, G_UNICODE_NOT_PRESENT_OFFSET, 1731 }, + { 0xfbd3, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, + { 0xfbd4, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, + { 0xfbd5, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, + { 0xfbd6, G_UNICODE_NOT_PRESENT_OFFSET, 12846 }, + { 0xfbd7, G_UNICODE_NOT_PRESENT_OFFSET, 12849 }, + { 0xfbd8, G_UNICODE_NOT_PRESENT_OFFSET, 12849 }, + { 0xfbd9, G_UNICODE_NOT_PRESENT_OFFSET, 12852 }, + { 0xfbda, G_UNICODE_NOT_PRESENT_OFFSET, 12852 }, + { 0xfbdb, G_UNICODE_NOT_PRESENT_OFFSET, 12855 }, + { 0xfbdc, G_UNICODE_NOT_PRESENT_OFFSET, 12855 }, + { 0xfbdd, G_UNICODE_NOT_PRESENT_OFFSET, 1711 }, + { 0xfbde, G_UNICODE_NOT_PRESENT_OFFSET, 12858 }, + { 0xfbdf, G_UNICODE_NOT_PRESENT_OFFSET, 12858 }, + { 0xfbe0, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfbe1, G_UNICODE_NOT_PRESENT_OFFSET, 12861 }, + { 0xfbe2, G_UNICODE_NOT_PRESENT_OFFSET, 12864 }, + { 0xfbe3, G_UNICODE_NOT_PRESENT_OFFSET, 12864 }, + { 0xfbe4, G_UNICODE_NOT_PRESENT_OFFSET, 12867 }, + { 0xfbe5, G_UNICODE_NOT_PRESENT_OFFSET, 12867 }, + { 0xfbe6, G_UNICODE_NOT_PRESENT_OFFSET, 12867 }, + { 0xfbe7, G_UNICODE_NOT_PRESENT_OFFSET, 12867 }, + { 0xfbe8, G_UNICODE_NOT_PRESENT_OFFSET, 12870 }, + { 0xfbe9, G_UNICODE_NOT_PRESENT_OFFSET, 12870 }, + { 0xfbea, G_UNICODE_NOT_PRESENT_OFFSET, 12873 }, + { 0xfbeb, G_UNICODE_NOT_PRESENT_OFFSET, 12873 }, + { 0xfbec, G_UNICODE_NOT_PRESENT_OFFSET, 12880 }, + { 0xfbed, G_UNICODE_NOT_PRESENT_OFFSET, 12880 }, + { 0xfbee, G_UNICODE_NOT_PRESENT_OFFSET, 12887 }, + { 0xfbef, G_UNICODE_NOT_PRESENT_OFFSET, 12887 }, + { 0xfbf0, G_UNICODE_NOT_PRESENT_OFFSET, 12894 }, + { 0xfbf1, G_UNICODE_NOT_PRESENT_OFFSET, 12894 }, + { 0xfbf2, G_UNICODE_NOT_PRESENT_OFFSET, 12901 }, + { 0xfbf3, G_UNICODE_NOT_PRESENT_OFFSET, 12901 }, + { 0xfbf4, G_UNICODE_NOT_PRESENT_OFFSET, 12908 }, + { 0xfbf5, G_UNICODE_NOT_PRESENT_OFFSET, 12908 }, + { 0xfbf6, G_UNICODE_NOT_PRESENT_OFFSET, 12915 }, + { 0xfbf7, G_UNICODE_NOT_PRESENT_OFFSET, 12915 }, + { 0xfbf8, G_UNICODE_NOT_PRESENT_OFFSET, 12915 }, + { 0xfbf9, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfbfa, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfbfb, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfbfc, G_UNICODE_NOT_PRESENT_OFFSET, 12929 }, + { 0xfbfd, G_UNICODE_NOT_PRESENT_OFFSET, 12929 }, + { 0xfbfe, G_UNICODE_NOT_PRESENT_OFFSET, 12929 }, + { 0xfbff, G_UNICODE_NOT_PRESENT_OFFSET, 12929 }, + { 0xfc00, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, + { 0xfc01, G_UNICODE_NOT_PRESENT_OFFSET, 12939 }, + { 0xfc02, G_UNICODE_NOT_PRESENT_OFFSET, 12946 }, + { 0xfc03, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfc04, G_UNICODE_NOT_PRESENT_OFFSET, 12953 }, + { 0xfc05, G_UNICODE_NOT_PRESENT_OFFSET, 12960 }, + { 0xfc06, G_UNICODE_NOT_PRESENT_OFFSET, 12965 }, + { 0xfc07, G_UNICODE_NOT_PRESENT_OFFSET, 12970 }, + { 0xfc08, G_UNICODE_NOT_PRESENT_OFFSET, 12975 }, + { 0xfc09, G_UNICODE_NOT_PRESENT_OFFSET, 12980 }, + { 0xfc0a, G_UNICODE_NOT_PRESENT_OFFSET, 12985 }, + { 0xfc0b, G_UNICODE_NOT_PRESENT_OFFSET, 12990 }, + { 0xfc0c, G_UNICODE_NOT_PRESENT_OFFSET, 12995 }, + { 0xfc0d, G_UNICODE_NOT_PRESENT_OFFSET, 13000 }, + { 0xfc0e, G_UNICODE_NOT_PRESENT_OFFSET, 13005 }, + { 0xfc0f, G_UNICODE_NOT_PRESENT_OFFSET, 13010 }, + { 0xfc10, G_UNICODE_NOT_PRESENT_OFFSET, 13015 }, + { 0xfc11, G_UNICODE_NOT_PRESENT_OFFSET, 13020 }, + { 0xfc12, G_UNICODE_NOT_PRESENT_OFFSET, 13025 }, + { 0xfc13, G_UNICODE_NOT_PRESENT_OFFSET, 13030 }, + { 0xfc14, G_UNICODE_NOT_PRESENT_OFFSET, 13035 }, + { 0xfc15, G_UNICODE_NOT_PRESENT_OFFSET, 13040 }, + { 0xfc16, G_UNICODE_NOT_PRESENT_OFFSET, 13045 }, + { 0xfc17, G_UNICODE_NOT_PRESENT_OFFSET, 13050 }, + { 0xfc18, G_UNICODE_NOT_PRESENT_OFFSET, 13055 }, + { 0xfc19, G_UNICODE_NOT_PRESENT_OFFSET, 13060 }, + { 0xfc1a, G_UNICODE_NOT_PRESENT_OFFSET, 13065 }, + { 0xfc1b, G_UNICODE_NOT_PRESENT_OFFSET, 13070 }, + { 0xfc1c, G_UNICODE_NOT_PRESENT_OFFSET, 13075 }, + { 0xfc1d, G_UNICODE_NOT_PRESENT_OFFSET, 13080 }, + { 0xfc1e, G_UNICODE_NOT_PRESENT_OFFSET, 13085 }, + { 0xfc1f, G_UNICODE_NOT_PRESENT_OFFSET, 13090 }, + { 0xfc20, G_UNICODE_NOT_PRESENT_OFFSET, 13095 }, + { 0xfc21, G_UNICODE_NOT_PRESENT_OFFSET, 13100 }, + { 0xfc22, G_UNICODE_NOT_PRESENT_OFFSET, 13105 }, + { 0xfc23, G_UNICODE_NOT_PRESENT_OFFSET, 13110 }, + { 0xfc24, G_UNICODE_NOT_PRESENT_OFFSET, 13115 }, + { 0xfc25, G_UNICODE_NOT_PRESENT_OFFSET, 13120 }, + { 0xfc26, G_UNICODE_NOT_PRESENT_OFFSET, 13125 }, + { 0xfc27, G_UNICODE_NOT_PRESENT_OFFSET, 13130 }, + { 0xfc28, G_UNICODE_NOT_PRESENT_OFFSET, 13135 }, + { 0xfc29, G_UNICODE_NOT_PRESENT_OFFSET, 13140 }, + { 0xfc2a, G_UNICODE_NOT_PRESENT_OFFSET, 13145 }, + { 0xfc2b, G_UNICODE_NOT_PRESENT_OFFSET, 13150 }, + { 0xfc2c, G_UNICODE_NOT_PRESENT_OFFSET, 13155 }, + { 0xfc2d, G_UNICODE_NOT_PRESENT_OFFSET, 13160 }, + { 0xfc2e, G_UNICODE_NOT_PRESENT_OFFSET, 13165 }, + { 0xfc2f, G_UNICODE_NOT_PRESENT_OFFSET, 13170 }, + { 0xfc30, G_UNICODE_NOT_PRESENT_OFFSET, 13175 }, + { 0xfc31, G_UNICODE_NOT_PRESENT_OFFSET, 13180 }, + { 0xfc32, G_UNICODE_NOT_PRESENT_OFFSET, 13185 }, + { 0xfc33, G_UNICODE_NOT_PRESENT_OFFSET, 13190 }, + { 0xfc34, G_UNICODE_NOT_PRESENT_OFFSET, 13195 }, + { 0xfc35, G_UNICODE_NOT_PRESENT_OFFSET, 13200 }, + { 0xfc36, G_UNICODE_NOT_PRESENT_OFFSET, 13205 }, + { 0xfc37, G_UNICODE_NOT_PRESENT_OFFSET, 13210 }, + { 0xfc38, G_UNICODE_NOT_PRESENT_OFFSET, 13215 }, + { 0xfc39, G_UNICODE_NOT_PRESENT_OFFSET, 13220 }, + { 0xfc3a, G_UNICODE_NOT_PRESENT_OFFSET, 13225 }, + { 0xfc3b, G_UNICODE_NOT_PRESENT_OFFSET, 13230 }, + { 0xfc3c, G_UNICODE_NOT_PRESENT_OFFSET, 13235 }, + { 0xfc3d, G_UNICODE_NOT_PRESENT_OFFSET, 13240 }, + { 0xfc3e, G_UNICODE_NOT_PRESENT_OFFSET, 13245 }, + { 0xfc3f, G_UNICODE_NOT_PRESENT_OFFSET, 13250 }, + { 0xfc40, G_UNICODE_NOT_PRESENT_OFFSET, 13255 }, + { 0xfc41, G_UNICODE_NOT_PRESENT_OFFSET, 13260 }, + { 0xfc42, G_UNICODE_NOT_PRESENT_OFFSET, 13265 }, + { 0xfc43, G_UNICODE_NOT_PRESENT_OFFSET, 13270 }, + { 0xfc44, G_UNICODE_NOT_PRESENT_OFFSET, 13275 }, + { 0xfc45, G_UNICODE_NOT_PRESENT_OFFSET, 13280 }, + { 0xfc46, G_UNICODE_NOT_PRESENT_OFFSET, 13285 }, + { 0xfc47, G_UNICODE_NOT_PRESENT_OFFSET, 13290 }, + { 0xfc48, G_UNICODE_NOT_PRESENT_OFFSET, 13295 }, + { 0xfc49, G_UNICODE_NOT_PRESENT_OFFSET, 13300 }, + { 0xfc4a, G_UNICODE_NOT_PRESENT_OFFSET, 13305 }, + { 0xfc4b, G_UNICODE_NOT_PRESENT_OFFSET, 13310 }, + { 0xfc4c, G_UNICODE_NOT_PRESENT_OFFSET, 13315 }, + { 0xfc4d, G_UNICODE_NOT_PRESENT_OFFSET, 13320 }, + { 0xfc4e, G_UNICODE_NOT_PRESENT_OFFSET, 13325 }, + { 0xfc4f, G_UNICODE_NOT_PRESENT_OFFSET, 13330 }, + { 0xfc50, G_UNICODE_NOT_PRESENT_OFFSET, 13335 }, + { 0xfc51, G_UNICODE_NOT_PRESENT_OFFSET, 13340 }, + { 0xfc52, G_UNICODE_NOT_PRESENT_OFFSET, 13345 }, + { 0xfc53, G_UNICODE_NOT_PRESENT_OFFSET, 13350 }, + { 0xfc54, G_UNICODE_NOT_PRESENT_OFFSET, 13355 }, + { 0xfc55, G_UNICODE_NOT_PRESENT_OFFSET, 13360 }, + { 0xfc56, G_UNICODE_NOT_PRESENT_OFFSET, 13365 }, + { 0xfc57, G_UNICODE_NOT_PRESENT_OFFSET, 13370 }, + { 0xfc58, G_UNICODE_NOT_PRESENT_OFFSET, 13375 }, + { 0xfc59, G_UNICODE_NOT_PRESENT_OFFSET, 13380 }, + { 0xfc5a, G_UNICODE_NOT_PRESENT_OFFSET, 13385 }, + { 0xfc5b, G_UNICODE_NOT_PRESENT_OFFSET, 13390 }, + { 0xfc5c, G_UNICODE_NOT_PRESENT_OFFSET, 13395 }, + { 0xfc5d, G_UNICODE_NOT_PRESENT_OFFSET, 13400 }, + { 0xfc5e, G_UNICODE_NOT_PRESENT_OFFSET, 13405 }, + { 0xfc5f, G_UNICODE_NOT_PRESENT_OFFSET, 13411 }, + { 0xfc60, G_UNICODE_NOT_PRESENT_OFFSET, 13417 }, + { 0xfc61, G_UNICODE_NOT_PRESENT_OFFSET, 13423 }, + { 0xfc62, G_UNICODE_NOT_PRESENT_OFFSET, 13429 }, + { 0xfc63, G_UNICODE_NOT_PRESENT_OFFSET, 13435 }, + { 0xfc64, G_UNICODE_NOT_PRESENT_OFFSET, 13441 }, + { 0xfc65, G_UNICODE_NOT_PRESENT_OFFSET, 13448 }, + { 0xfc66, G_UNICODE_NOT_PRESENT_OFFSET, 12946 }, + { 0xfc67, G_UNICODE_NOT_PRESENT_OFFSET, 13455 }, + { 0xfc68, G_UNICODE_NOT_PRESENT_OFFSET, 12922 }, + { 0xfc69, G_UNICODE_NOT_PRESENT_OFFSET, 12953 }, + { 0xfc6a, G_UNICODE_NOT_PRESENT_OFFSET, 13462 }, + { 0xfc6b, G_UNICODE_NOT_PRESENT_OFFSET, 13467 }, + { 0xfc6c, G_UNICODE_NOT_PRESENT_OFFSET, 12975 }, + { 0xfc6d, G_UNICODE_NOT_PRESENT_OFFSET, 13472 }, + { 0xfc6e, G_UNICODE_NOT_PRESENT_OFFSET, 12980 }, + { 0xfc6f, G_UNICODE_NOT_PRESENT_OFFSET, 12985 }, + { 0xfc70, G_UNICODE_NOT_PRESENT_OFFSET, 13477 }, + { 0xfc71, G_UNICODE_NOT_PRESENT_OFFSET, 13482 }, + { 0xfc72, G_UNICODE_NOT_PRESENT_OFFSET, 13005 }, + { 0xfc73, G_UNICODE_NOT_PRESENT_OFFSET, 13487 }, + { 0xfc74, G_UNICODE_NOT_PRESENT_OFFSET, 13010 }, + { 0xfc75, G_UNICODE_NOT_PRESENT_OFFSET, 13015 }, + { 0xfc76, G_UNICODE_NOT_PRESENT_OFFSET, 13492 }, + { 0xfc77, G_UNICODE_NOT_PRESENT_OFFSET, 13497 }, + { 0xfc78, G_UNICODE_NOT_PRESENT_OFFSET, 13025 }, + { 0xfc79, G_UNICODE_NOT_PRESENT_OFFSET, 13502 }, + { 0xfc7a, G_UNICODE_NOT_PRESENT_OFFSET, 13030 }, + { 0xfc7b, G_UNICODE_NOT_PRESENT_OFFSET, 13035 }, + { 0xfc7c, G_UNICODE_NOT_PRESENT_OFFSET, 13180 }, + { 0xfc7d, G_UNICODE_NOT_PRESENT_OFFSET, 13185 }, + { 0xfc7e, G_UNICODE_NOT_PRESENT_OFFSET, 13200 }, + { 0xfc7f, G_UNICODE_NOT_PRESENT_OFFSET, 13205 }, + { 0xfc80, G_UNICODE_NOT_PRESENT_OFFSET, 13210 }, + { 0xfc81, G_UNICODE_NOT_PRESENT_OFFSET, 13230 }, + { 0xfc82, G_UNICODE_NOT_PRESENT_OFFSET, 13235 }, + { 0xfc83, G_UNICODE_NOT_PRESENT_OFFSET, 13240 }, + { 0xfc84, G_UNICODE_NOT_PRESENT_OFFSET, 13245 }, + { 0xfc85, G_UNICODE_NOT_PRESENT_OFFSET, 13265 }, + { 0xfc86, G_UNICODE_NOT_PRESENT_OFFSET, 13270 }, + { 0xfc87, G_UNICODE_NOT_PRESENT_OFFSET, 13275 }, + { 0xfc88, G_UNICODE_NOT_PRESENT_OFFSET, 13507 }, + { 0xfc89, G_UNICODE_NOT_PRESENT_OFFSET, 13295 }, + { 0xfc8a, G_UNICODE_NOT_PRESENT_OFFSET, 13512 }, + { 0xfc8b, G_UNICODE_NOT_PRESENT_OFFSET, 13517 }, + { 0xfc8c, G_UNICODE_NOT_PRESENT_OFFSET, 13325 }, + { 0xfc8d, G_UNICODE_NOT_PRESENT_OFFSET, 13522 }, + { 0xfc8e, G_UNICODE_NOT_PRESENT_OFFSET, 13330 }, + { 0xfc8f, G_UNICODE_NOT_PRESENT_OFFSET, 13335 }, + { 0xfc90, G_UNICODE_NOT_PRESENT_OFFSET, 13400 }, + { 0xfc91, G_UNICODE_NOT_PRESENT_OFFSET, 13527 }, + { 0xfc92, G_UNICODE_NOT_PRESENT_OFFSET, 13532 }, + { 0xfc93, G_UNICODE_NOT_PRESENT_OFFSET, 13375 }, + { 0xfc94, G_UNICODE_NOT_PRESENT_OFFSET, 13537 }, + { 0xfc95, G_UNICODE_NOT_PRESENT_OFFSET, 13380 }, + { 0xfc96, G_UNICODE_NOT_PRESENT_OFFSET, 13385 }, + { 0xfc97, G_UNICODE_NOT_PRESENT_OFFSET, 12932 }, + { 0xfc98, G_UNICODE_NOT_PRESENT_OFFSET, 12939 }, + { 0xfc99, G_UNICODE_NOT_PRESENT_OFFSET, 13542 }, + { 0xfc9a, G_UNICODE_NOT_PRESENT_OFFSET, 12946 }, + { 0xfc9b, G_UNICODE_NOT_PRESENT_OFFSET, 13549 }, + { 0xfc9c, G_UNICODE_NOT_PRESENT_OFFSET, 12960 }, + { 0xfc9d, G_UNICODE_NOT_PRESENT_OFFSET, 12965 }, + { 0xfc9e, G_UNICODE_NOT_PRESENT_OFFSET, 12970 }, + { 0xfc9f, G_UNICODE_NOT_PRESENT_OFFSET, 12975 }, + { 0xfca0, G_UNICODE_NOT_PRESENT_OFFSET, 13556 }, + { 0xfca1, G_UNICODE_NOT_PRESENT_OFFSET, 12990 }, + { 0xfca2, G_UNICODE_NOT_PRESENT_OFFSET, 12995 }, + { 0xfca3, G_UNICODE_NOT_PRESENT_OFFSET, 13000 }, + { 0xfca4, G_UNICODE_NOT_PRESENT_OFFSET, 13005 }, + { 0xfca5, G_UNICODE_NOT_PRESENT_OFFSET, 13561 }, + { 0xfca6, G_UNICODE_NOT_PRESENT_OFFSET, 13025 }, + { 0xfca7, G_UNICODE_NOT_PRESENT_OFFSET, 13040 }, + { 0xfca8, G_UNICODE_NOT_PRESENT_OFFSET, 13045 }, + { 0xfca9, G_UNICODE_NOT_PRESENT_OFFSET, 13050 }, + { 0xfcaa, G_UNICODE_NOT_PRESENT_OFFSET, 13055 }, + { 0xfcab, G_UNICODE_NOT_PRESENT_OFFSET, 13060 }, + { 0xfcac, G_UNICODE_NOT_PRESENT_OFFSET, 13070 }, + { 0xfcad, G_UNICODE_NOT_PRESENT_OFFSET, 13075 }, + { 0xfcae, G_UNICODE_NOT_PRESENT_OFFSET, 13080 }, + { 0xfcaf, G_UNICODE_NOT_PRESENT_OFFSET, 13085 }, + { 0xfcb0, G_UNICODE_NOT_PRESENT_OFFSET, 13090 }, + { 0xfcb1, G_UNICODE_NOT_PRESENT_OFFSET, 13095 }, + { 0xfcb2, G_UNICODE_NOT_PRESENT_OFFSET, 13566 }, + { 0xfcb3, G_UNICODE_NOT_PRESENT_OFFSET, 13100 }, + { 0xfcb4, G_UNICODE_NOT_PRESENT_OFFSET, 13105 }, + { 0xfcb5, G_UNICODE_NOT_PRESENT_OFFSET, 13110 }, + { 0xfcb6, G_UNICODE_NOT_PRESENT_OFFSET, 13115 }, + { 0xfcb7, G_UNICODE_NOT_PRESENT_OFFSET, 13120 }, + { 0xfcb8, G_UNICODE_NOT_PRESENT_OFFSET, 13125 }, + { 0xfcb9, G_UNICODE_NOT_PRESENT_OFFSET, 13135 }, + { 0xfcba, G_UNICODE_NOT_PRESENT_OFFSET, 13140 }, + { 0xfcbb, G_UNICODE_NOT_PRESENT_OFFSET, 13145 }, + { 0xfcbc, G_UNICODE_NOT_PRESENT_OFFSET, 13150 }, + { 0xfcbd, G_UNICODE_NOT_PRESENT_OFFSET, 13155 }, + { 0xfcbe, G_UNICODE_NOT_PRESENT_OFFSET, 13160 }, + { 0xfcbf, G_UNICODE_NOT_PRESENT_OFFSET, 13165 }, + { 0xfcc0, G_UNICODE_NOT_PRESENT_OFFSET, 13170 }, + { 0xfcc1, G_UNICODE_NOT_PRESENT_OFFSET, 13175 }, + { 0xfcc2, G_UNICODE_NOT_PRESENT_OFFSET, 13190 }, + { 0xfcc3, G_UNICODE_NOT_PRESENT_OFFSET, 13195 }, + { 0xfcc4, G_UNICODE_NOT_PRESENT_OFFSET, 13215 }, + { 0xfcc5, G_UNICODE_NOT_PRESENT_OFFSET, 13220 }, + { 0xfcc6, G_UNICODE_NOT_PRESENT_OFFSET, 13225 }, + { 0xfcc7, G_UNICODE_NOT_PRESENT_OFFSET, 13230 }, + { 0xfcc8, G_UNICODE_NOT_PRESENT_OFFSET, 13235 }, + { 0xfcc9, G_UNICODE_NOT_PRESENT_OFFSET, 13250 }, + { 0xfcca, G_UNICODE_NOT_PRESENT_OFFSET, 13255 }, + { 0xfccb, G_UNICODE_NOT_PRESENT_OFFSET, 13260 }, + { 0xfccc, G_UNICODE_NOT_PRESENT_OFFSET, 13265 }, + { 0xfccd, G_UNICODE_NOT_PRESENT_OFFSET, 13571 }, + { 0xfcce, G_UNICODE_NOT_PRESENT_OFFSET, 13280 }, + { 0xfccf, G_UNICODE_NOT_PRESENT_OFFSET, 13285 }, + { 0xfcd0, G_UNICODE_NOT_PRESENT_OFFSET, 13290 }, + { 0xfcd1, G_UNICODE_NOT_PRESENT_OFFSET, 13295 }, + { 0xfcd2, G_UNICODE_NOT_PRESENT_OFFSET, 13310 }, + { 0xfcd3, G_UNICODE_NOT_PRESENT_OFFSET, 13315 }, + { 0xfcd4, G_UNICODE_NOT_PRESENT_OFFSET, 13320 }, + { 0xfcd5, G_UNICODE_NOT_PRESENT_OFFSET, 13325 }, + { 0xfcd6, G_UNICODE_NOT_PRESENT_OFFSET, 13576 }, + { 0xfcd7, G_UNICODE_NOT_PRESENT_OFFSET, 13340 }, + { 0xfcd8, G_UNICODE_NOT_PRESENT_OFFSET, 13345 }, + { 0xfcd9, G_UNICODE_NOT_PRESENT_OFFSET, 13581 }, + { 0xfcda, G_UNICODE_NOT_PRESENT_OFFSET, 13360 }, + { 0xfcdb, G_UNICODE_NOT_PRESENT_OFFSET, 13365 }, + { 0xfcdc, G_UNICODE_NOT_PRESENT_OFFSET, 13370 }, + { 0xfcdd, G_UNICODE_NOT_PRESENT_OFFSET, 13375 }, + { 0xfcde, G_UNICODE_NOT_PRESENT_OFFSET, 13586 }, + { 0xfcdf, G_UNICODE_NOT_PRESENT_OFFSET, 12946 }, + { 0xfce0, G_UNICODE_NOT_PRESENT_OFFSET, 13549 }, + { 0xfce1, G_UNICODE_NOT_PRESENT_OFFSET, 12975 }, + { 0xfce2, G_UNICODE_NOT_PRESENT_OFFSET, 13556 }, + { 0xfce3, G_UNICODE_NOT_PRESENT_OFFSET, 13005 }, + { 0xfce4, G_UNICODE_NOT_PRESENT_OFFSET, 13561 }, + { 0xfce5, G_UNICODE_NOT_PRESENT_OFFSET, 13025 }, + { 0xfce6, G_UNICODE_NOT_PRESENT_OFFSET, 13591 }, + { 0xfce7, G_UNICODE_NOT_PRESENT_OFFSET, 13090 }, + { 0xfce8, G_UNICODE_NOT_PRESENT_OFFSET, 13596 }, + { 0xfce9, G_UNICODE_NOT_PRESENT_OFFSET, 13601 }, + { 0xfcea, G_UNICODE_NOT_PRESENT_OFFSET, 13606 }, + { 0xfceb, G_UNICODE_NOT_PRESENT_OFFSET, 13230 }, + { 0xfcec, G_UNICODE_NOT_PRESENT_OFFSET, 13235 }, + { 0xfced, G_UNICODE_NOT_PRESENT_OFFSET, 13265 }, + { 0xfcee, G_UNICODE_NOT_PRESENT_OFFSET, 13325 }, + { 0xfcef, G_UNICODE_NOT_PRESENT_OFFSET, 13576 }, + { 0xfcf0, G_UNICODE_NOT_PRESENT_OFFSET, 13375 }, + { 0xfcf1, G_UNICODE_NOT_PRESENT_OFFSET, 13586 }, + { 0xfcf2, G_UNICODE_NOT_PRESENT_OFFSET, 13611 }, + { 0xfcf3, G_UNICODE_NOT_PRESENT_OFFSET, 13618 }, + { 0xfcf4, G_UNICODE_NOT_PRESENT_OFFSET, 13625 }, + { 0xfcf5, G_UNICODE_NOT_PRESENT_OFFSET, 13632 }, + { 0xfcf6, G_UNICODE_NOT_PRESENT_OFFSET, 13637 }, + { 0xfcf7, G_UNICODE_NOT_PRESENT_OFFSET, 13642 }, + { 0xfcf8, G_UNICODE_NOT_PRESENT_OFFSET, 13647 }, + { 0xfcf9, G_UNICODE_NOT_PRESENT_OFFSET, 13652 }, + { 0xfcfa, G_UNICODE_NOT_PRESENT_OFFSET, 13657 }, + { 0xfcfb, G_UNICODE_NOT_PRESENT_OFFSET, 13662 }, + { 0xfcfc, G_UNICODE_NOT_PRESENT_OFFSET, 13667 }, + { 0xfcfd, G_UNICODE_NOT_PRESENT_OFFSET, 13672 }, + { 0xfcfe, G_UNICODE_NOT_PRESENT_OFFSET, 13677 }, + { 0xfcff, G_UNICODE_NOT_PRESENT_OFFSET, 13682 }, + { 0xfd00, G_UNICODE_NOT_PRESENT_OFFSET, 13687 }, + { 0xfd01, G_UNICODE_NOT_PRESENT_OFFSET, 13692 }, + { 0xfd02, G_UNICODE_NOT_PRESENT_OFFSET, 13697 }, + { 0xfd03, G_UNICODE_NOT_PRESENT_OFFSET, 13702 }, + { 0xfd04, G_UNICODE_NOT_PRESENT_OFFSET, 13707 }, + { 0xfd05, G_UNICODE_NOT_PRESENT_OFFSET, 13712 }, + { 0xfd06, G_UNICODE_NOT_PRESENT_OFFSET, 13717 }, + { 0xfd07, G_UNICODE_NOT_PRESENT_OFFSET, 13722 }, + { 0xfd08, G_UNICODE_NOT_PRESENT_OFFSET, 13727 }, + { 0xfd09, G_UNICODE_NOT_PRESENT_OFFSET, 13732 }, + { 0xfd0a, G_UNICODE_NOT_PRESENT_OFFSET, 13737 }, + { 0xfd0b, G_UNICODE_NOT_PRESENT_OFFSET, 13742 }, + { 0xfd0c, G_UNICODE_NOT_PRESENT_OFFSET, 13601 }, + { 0xfd0d, G_UNICODE_NOT_PRESENT_OFFSET, 13747 }, + { 0xfd0e, G_UNICODE_NOT_PRESENT_OFFSET, 13752 }, + { 0xfd0f, G_UNICODE_NOT_PRESENT_OFFSET, 13757 }, + { 0xfd10, G_UNICODE_NOT_PRESENT_OFFSET, 13762 }, + { 0xfd11, G_UNICODE_NOT_PRESENT_OFFSET, 13632 }, + { 0xfd12, G_UNICODE_NOT_PRESENT_OFFSET, 13637 }, + { 0xfd13, G_UNICODE_NOT_PRESENT_OFFSET, 13642 }, + { 0xfd14, G_UNICODE_NOT_PRESENT_OFFSET, 13647 }, + { 0xfd15, G_UNICODE_NOT_PRESENT_OFFSET, 13652 }, + { 0xfd16, G_UNICODE_NOT_PRESENT_OFFSET, 13657 }, + { 0xfd17, G_UNICODE_NOT_PRESENT_OFFSET, 13662 }, + { 0xfd18, G_UNICODE_NOT_PRESENT_OFFSET, 13667 }, + { 0xfd19, G_UNICODE_NOT_PRESENT_OFFSET, 13672 }, + { 0xfd1a, G_UNICODE_NOT_PRESENT_OFFSET, 13677 }, + { 0xfd1b, G_UNICODE_NOT_PRESENT_OFFSET, 13682 }, + { 0xfd1c, G_UNICODE_NOT_PRESENT_OFFSET, 13687 }, + { 0xfd1d, G_UNICODE_NOT_PRESENT_OFFSET, 13692 }, + { 0xfd1e, G_UNICODE_NOT_PRESENT_OFFSET, 13697 }, + { 0xfd1f, G_UNICODE_NOT_PRESENT_OFFSET, 13702 }, + { 0xfd20, G_UNICODE_NOT_PRESENT_OFFSET, 13707 }, + { 0xfd21, G_UNICODE_NOT_PRESENT_OFFSET, 13712 }, + { 0xfd22, G_UNICODE_NOT_PRESENT_OFFSET, 13717 }, + { 0xfd23, G_UNICODE_NOT_PRESENT_OFFSET, 13722 }, + { 0xfd24, G_UNICODE_NOT_PRESENT_OFFSET, 13727 }, + { 0xfd25, G_UNICODE_NOT_PRESENT_OFFSET, 13732 }, + { 0xfd26, G_UNICODE_NOT_PRESENT_OFFSET, 13737 }, + { 0xfd27, G_UNICODE_NOT_PRESENT_OFFSET, 13742 }, + { 0xfd28, G_UNICODE_NOT_PRESENT_OFFSET, 13601 }, + { 0xfd29, G_UNICODE_NOT_PRESENT_OFFSET, 13747 }, + { 0xfd2a, G_UNICODE_NOT_PRESENT_OFFSET, 13752 }, + { 0xfd2b, G_UNICODE_NOT_PRESENT_OFFSET, 13757 }, + { 0xfd2c, G_UNICODE_NOT_PRESENT_OFFSET, 13762 }, + { 0xfd2d, G_UNICODE_NOT_PRESENT_OFFSET, 13732 }, + { 0xfd2e, G_UNICODE_NOT_PRESENT_OFFSET, 13737 }, + { 0xfd2f, G_UNICODE_NOT_PRESENT_OFFSET, 13742 }, + { 0xfd30, G_UNICODE_NOT_PRESENT_OFFSET, 13601 }, + { 0xfd31, G_UNICODE_NOT_PRESENT_OFFSET, 13596 }, + { 0xfd32, G_UNICODE_NOT_PRESENT_OFFSET, 13606 }, + { 0xfd33, G_UNICODE_NOT_PRESENT_OFFSET, 13130 }, + { 0xfd34, G_UNICODE_NOT_PRESENT_OFFSET, 13075 }, + { 0xfd35, G_UNICODE_NOT_PRESENT_OFFSET, 13080 }, + { 0xfd36, G_UNICODE_NOT_PRESENT_OFFSET, 13085 }, + { 0xfd37, G_UNICODE_NOT_PRESENT_OFFSET, 13732 }, + { 0xfd38, G_UNICODE_NOT_PRESENT_OFFSET, 13737 }, + { 0xfd39, G_UNICODE_NOT_PRESENT_OFFSET, 13742 }, + { 0xfd3a, G_UNICODE_NOT_PRESENT_OFFSET, 13130 }, + { 0xfd3b, G_UNICODE_NOT_PRESENT_OFFSET, 13135 }, + { 0xfd3c, G_UNICODE_NOT_PRESENT_OFFSET, 13767 }, + { 0xfd3d, G_UNICODE_NOT_PRESENT_OFFSET, 13767 }, + { 0xfd50, G_UNICODE_NOT_PRESENT_OFFSET, 13772 }, + { 0xfd51, G_UNICODE_NOT_PRESENT_OFFSET, 13779 }, + { 0xfd52, G_UNICODE_NOT_PRESENT_OFFSET, 13779 }, + { 0xfd53, G_UNICODE_NOT_PRESENT_OFFSET, 13786 }, + { 0xfd54, G_UNICODE_NOT_PRESENT_OFFSET, 13793 }, + { 0xfd55, G_UNICODE_NOT_PRESENT_OFFSET, 13800 }, + { 0xfd56, G_UNICODE_NOT_PRESENT_OFFSET, 13807 }, + { 0xfd57, G_UNICODE_NOT_PRESENT_OFFSET, 13814 }, + { 0xfd58, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, + { 0xfd59, G_UNICODE_NOT_PRESENT_OFFSET, 13821 }, + { 0xfd5a, G_UNICODE_NOT_PRESENT_OFFSET, 13828 }, + { 0xfd5b, G_UNICODE_NOT_PRESENT_OFFSET, 13835 }, + { 0xfd5c, G_UNICODE_NOT_PRESENT_OFFSET, 13842 }, + { 0xfd5d, G_UNICODE_NOT_PRESENT_OFFSET, 13849 }, + { 0xfd5e, G_UNICODE_NOT_PRESENT_OFFSET, 13856 }, + { 0xfd5f, G_UNICODE_NOT_PRESENT_OFFSET, 13863 }, + { 0xfd60, G_UNICODE_NOT_PRESENT_OFFSET, 13863 }, + { 0xfd61, G_UNICODE_NOT_PRESENT_OFFSET, 13870 }, + { 0xfd62, G_UNICODE_NOT_PRESENT_OFFSET, 13877 }, + { 0xfd63, G_UNICODE_NOT_PRESENT_OFFSET, 13877 }, + { 0xfd64, G_UNICODE_NOT_PRESENT_OFFSET, 13884 }, + { 0xfd65, G_UNICODE_NOT_PRESENT_OFFSET, 13884 }, + { 0xfd66, G_UNICODE_NOT_PRESENT_OFFSET, 13891 }, + { 0xfd67, G_UNICODE_NOT_PRESENT_OFFSET, 13898 }, + { 0xfd68, G_UNICODE_NOT_PRESENT_OFFSET, 13898 }, + { 0xfd69, G_UNICODE_NOT_PRESENT_OFFSET, 13905 }, + { 0xfd6a, G_UNICODE_NOT_PRESENT_OFFSET, 13912 }, + { 0xfd6b, G_UNICODE_NOT_PRESENT_OFFSET, 13912 }, + { 0xfd6c, G_UNICODE_NOT_PRESENT_OFFSET, 13919 }, + { 0xfd6d, G_UNICODE_NOT_PRESENT_OFFSET, 13919 }, + { 0xfd6e, G_UNICODE_NOT_PRESENT_OFFSET, 13926 }, + { 0xfd6f, G_UNICODE_NOT_PRESENT_OFFSET, 13933 }, + { 0xfd70, G_UNICODE_NOT_PRESENT_OFFSET, 13933 }, + { 0xfd71, G_UNICODE_NOT_PRESENT_OFFSET, 13940 }, + { 0xfd72, G_UNICODE_NOT_PRESENT_OFFSET, 13940 }, + { 0xfd73, G_UNICODE_NOT_PRESENT_OFFSET, 13947 }, + { 0xfd74, G_UNICODE_NOT_PRESENT_OFFSET, 13954 }, + { 0xfd75, G_UNICODE_NOT_PRESENT_OFFSET, 13961 }, + { 0xfd76, G_UNICODE_NOT_PRESENT_OFFSET, 13968 }, + { 0xfd77, G_UNICODE_NOT_PRESENT_OFFSET, 13968 }, + { 0xfd78, G_UNICODE_NOT_PRESENT_OFFSET, 13975 }, + { 0xfd79, G_UNICODE_NOT_PRESENT_OFFSET, 13982 }, + { 0xfd7a, G_UNICODE_NOT_PRESENT_OFFSET, 13989 }, + { 0xfd7b, G_UNICODE_NOT_PRESENT_OFFSET, 13996 }, + { 0xfd7c, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, + { 0xfd7d, G_UNICODE_NOT_PRESENT_OFFSET, 14003 }, + { 0xfd7e, G_UNICODE_NOT_PRESENT_OFFSET, 14010 }, + { 0xfd7f, G_UNICODE_NOT_PRESENT_OFFSET, 14017 }, + { 0xfd80, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, + { 0xfd81, G_UNICODE_NOT_PRESENT_OFFSET, 14031 }, + { 0xfd82, G_UNICODE_NOT_PRESENT_OFFSET, 14038 }, + { 0xfd83, G_UNICODE_NOT_PRESENT_OFFSET, 14045 }, + { 0xfd84, G_UNICODE_NOT_PRESENT_OFFSET, 14045 }, + { 0xfd85, G_UNICODE_NOT_PRESENT_OFFSET, 14052 }, + { 0xfd86, G_UNICODE_NOT_PRESENT_OFFSET, 14052 }, + { 0xfd87, G_UNICODE_NOT_PRESENT_OFFSET, 14059 }, + { 0xfd88, G_UNICODE_NOT_PRESENT_OFFSET, 14059 }, + { 0xfd89, G_UNICODE_NOT_PRESENT_OFFSET, 14066 }, + { 0xfd8a, G_UNICODE_NOT_PRESENT_OFFSET, 14073 }, + { 0xfd8b, G_UNICODE_NOT_PRESENT_OFFSET, 14080 }, + { 0xfd8c, G_UNICODE_NOT_PRESENT_OFFSET, 14087 }, + { 0xfd8d, G_UNICODE_NOT_PRESENT_OFFSET, 14094 }, + { 0xfd8e, G_UNICODE_NOT_PRESENT_OFFSET, 14101 }, + { 0xfd8f, G_UNICODE_NOT_PRESENT_OFFSET, 14108 }, + { 0xfd92, G_UNICODE_NOT_PRESENT_OFFSET, 14115 }, + { 0xfd93, G_UNICODE_NOT_PRESENT_OFFSET, 14122 }, + { 0xfd94, G_UNICODE_NOT_PRESENT_OFFSET, 14129 }, + { 0xfd95, G_UNICODE_NOT_PRESENT_OFFSET, 14136 }, + { 0xfd96, G_UNICODE_NOT_PRESENT_OFFSET, 14143 }, + { 0xfd97, G_UNICODE_NOT_PRESENT_OFFSET, 14150 }, + { 0xfd98, G_UNICODE_NOT_PRESENT_OFFSET, 14150 }, + { 0xfd99, G_UNICODE_NOT_PRESENT_OFFSET, 14157 }, + { 0xfd9a, G_UNICODE_NOT_PRESENT_OFFSET, 14164 }, + { 0xfd9b, G_UNICODE_NOT_PRESENT_OFFSET, 14171 }, + { 0xfd9c, G_UNICODE_NOT_PRESENT_OFFSET, 14178 }, + { 0xfd9d, G_UNICODE_NOT_PRESENT_OFFSET, 14178 }, + { 0xfd9e, G_UNICODE_NOT_PRESENT_OFFSET, 14185 }, + { 0xfd9f, G_UNICODE_NOT_PRESENT_OFFSET, 14192 }, + { 0xfda0, G_UNICODE_NOT_PRESENT_OFFSET, 14199 }, + { 0xfda1, G_UNICODE_NOT_PRESENT_OFFSET, 14206 }, + { 0xfda2, G_UNICODE_NOT_PRESENT_OFFSET, 14213 }, + { 0xfda3, G_UNICODE_NOT_PRESENT_OFFSET, 14220 }, + { 0xfda4, G_UNICODE_NOT_PRESENT_OFFSET, 14227 }, + { 0xfda5, G_UNICODE_NOT_PRESENT_OFFSET, 14234 }, + { 0xfda6, G_UNICODE_NOT_PRESENT_OFFSET, 14241 }, + { 0xfda7, G_UNICODE_NOT_PRESENT_OFFSET, 14248 }, + { 0xfda8, G_UNICODE_NOT_PRESENT_OFFSET, 14255 }, + { 0xfda9, G_UNICODE_NOT_PRESENT_OFFSET, 14262 }, + { 0xfdaa, G_UNICODE_NOT_PRESENT_OFFSET, 14269 }, + { 0xfdab, G_UNICODE_NOT_PRESENT_OFFSET, 14276 }, + { 0xfdac, G_UNICODE_NOT_PRESENT_OFFSET, 14283 }, + { 0xfdad, G_UNICODE_NOT_PRESENT_OFFSET, 14290 }, + { 0xfdae, G_UNICODE_NOT_PRESENT_OFFSET, 14297 }, + { 0xfdaf, G_UNICODE_NOT_PRESENT_OFFSET, 14304 }, + { 0xfdb0, G_UNICODE_NOT_PRESENT_OFFSET, 14311 }, + { 0xfdb1, G_UNICODE_NOT_PRESENT_OFFSET, 14318 }, + { 0xfdb2, G_UNICODE_NOT_PRESENT_OFFSET, 14325 }, + { 0xfdb3, G_UNICODE_NOT_PRESENT_OFFSET, 14332 }, + { 0xfdb4, G_UNICODE_NOT_PRESENT_OFFSET, 14010 }, + { 0xfdb5, G_UNICODE_NOT_PRESENT_OFFSET, 14024 }, + { 0xfdb6, G_UNICODE_NOT_PRESENT_OFFSET, 14339 }, + { 0xfdb7, G_UNICODE_NOT_PRESENT_OFFSET, 14346 }, + { 0xfdb8, G_UNICODE_NOT_PRESENT_OFFSET, 14353 }, + { 0xfdb9, G_UNICODE_NOT_PRESENT_OFFSET, 14360 }, + { 0xfdba, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, + { 0xfdbb, G_UNICODE_NOT_PRESENT_OFFSET, 14374 }, + { 0xfdbc, G_UNICODE_NOT_PRESENT_OFFSET, 14367 }, + { 0xfdbd, G_UNICODE_NOT_PRESENT_OFFSET, 14353 }, + { 0xfdbe, G_UNICODE_NOT_PRESENT_OFFSET, 14381 }, + { 0xfdbf, G_UNICODE_NOT_PRESENT_OFFSET, 14388 }, + { 0xfdc0, G_UNICODE_NOT_PRESENT_OFFSET, 14395 }, + { 0xfdc1, G_UNICODE_NOT_PRESENT_OFFSET, 14402 }, + { 0xfdc2, G_UNICODE_NOT_PRESENT_OFFSET, 14409 }, + { 0xfdc3, G_UNICODE_NOT_PRESENT_OFFSET, 14374 }, + { 0xfdc4, G_UNICODE_NOT_PRESENT_OFFSET, 13961 }, + { 0xfdc5, G_UNICODE_NOT_PRESENT_OFFSET, 13891 }, + { 0xfdc6, G_UNICODE_NOT_PRESENT_OFFSET, 14416 }, + { 0xfdc7, G_UNICODE_NOT_PRESENT_OFFSET, 14423 }, + { 0xfdf0, G_UNICODE_NOT_PRESENT_OFFSET, 14430 }, + { 0xfdf1, G_UNICODE_NOT_PRESENT_OFFSET, 14437 }, + { 0xfdf2, G_UNICODE_NOT_PRESENT_OFFSET, 14444 }, + { 0xfdf3, G_UNICODE_NOT_PRESENT_OFFSET, 14453 }, + { 0xfdf4, G_UNICODE_NOT_PRESENT_OFFSET, 14462 }, + { 0xfdf5, G_UNICODE_NOT_PRESENT_OFFSET, 14471 }, + { 0xfdf6, G_UNICODE_NOT_PRESENT_OFFSET, 14480 }, + { 0xfdf7, G_UNICODE_NOT_PRESENT_OFFSET, 14489 }, + { 0xfdf8, G_UNICODE_NOT_PRESENT_OFFSET, 14498 }, + { 0xfdf9, G_UNICODE_NOT_PRESENT_OFFSET, 14507 }, + { 0xfdfa, G_UNICODE_NOT_PRESENT_OFFSET, 14514 }, + { 0xfdfb, G_UNICODE_NOT_PRESENT_OFFSET, 14548 }, + { 0xfdfc, G_UNICODE_NOT_PRESENT_OFFSET, 14564 }, + { 0xfe10, G_UNICODE_NOT_PRESENT_OFFSET, 14573 }, + { 0xfe11, G_UNICODE_NOT_PRESENT_OFFSET, 14575 }, + { 0xfe12, G_UNICODE_NOT_PRESENT_OFFSET, 14579 }, + { 0xfe13, G_UNICODE_NOT_PRESENT_OFFSET, 14583 }, + { 0xfe14, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xfe15, G_UNICODE_NOT_PRESENT_OFFSET, 14585 }, + { 0xfe16, G_UNICODE_NOT_PRESENT_OFFSET, 14587 }, + { 0xfe17, G_UNICODE_NOT_PRESENT_OFFSET, 14589 }, + { 0xfe18, G_UNICODE_NOT_PRESENT_OFFSET, 14593 }, + { 0xfe19, G_UNICODE_NOT_PRESENT_OFFSET, 5186 }, + { 0xfe30, G_UNICODE_NOT_PRESENT_OFFSET, 5183 }, + { 0xfe31, G_UNICODE_NOT_PRESENT_OFFSET, 14597 }, + { 0xfe32, G_UNICODE_NOT_PRESENT_OFFSET, 14601 }, + { 0xfe33, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xfe34, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xfe35, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xfe36, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xfe37, G_UNICODE_NOT_PRESENT_OFFSET, 14607 }, + { 0xfe38, G_UNICODE_NOT_PRESENT_OFFSET, 14609 }, + { 0xfe39, G_UNICODE_NOT_PRESENT_OFFSET, 14611 }, + { 0xfe3a, G_UNICODE_NOT_PRESENT_OFFSET, 14615 }, + { 0xfe3b, G_UNICODE_NOT_PRESENT_OFFSET, 14619 }, + { 0xfe3c, G_UNICODE_NOT_PRESENT_OFFSET, 14623 }, + { 0xfe3d, G_UNICODE_NOT_PRESENT_OFFSET, 14627 }, + { 0xfe3e, G_UNICODE_NOT_PRESENT_OFFSET, 14631 }, + { 0xfe3f, G_UNICODE_NOT_PRESENT_OFFSET, 5826 }, + { 0xfe40, G_UNICODE_NOT_PRESENT_OFFSET, 5830 }, + { 0xfe41, G_UNICODE_NOT_PRESENT_OFFSET, 14635 }, + { 0xfe42, G_UNICODE_NOT_PRESENT_OFFSET, 14639 }, + { 0xfe43, G_UNICODE_NOT_PRESENT_OFFSET, 14643 }, + { 0xfe44, G_UNICODE_NOT_PRESENT_OFFSET, 14647 }, + { 0xfe47, G_UNICODE_NOT_PRESENT_OFFSET, 14651 }, + { 0xfe48, G_UNICODE_NOT_PRESENT_OFFSET, 14653 }, + { 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, 14605 }, + { 0xfe4e, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xfe4f, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 0xfe50, G_UNICODE_NOT_PRESENT_OFFSET, 14573 }, + { 0xfe51, G_UNICODE_NOT_PRESENT_OFFSET, 14575 }, + { 0xfe52, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, + { 0xfe54, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xfe55, G_UNICODE_NOT_PRESENT_OFFSET, 14583 }, + { 0xfe56, G_UNICODE_NOT_PRESENT_OFFSET, 14587 }, + { 0xfe57, G_UNICODE_NOT_PRESENT_OFFSET, 14585 }, + { 0xfe58, G_UNICODE_NOT_PRESENT_OFFSET, 14597 }, + { 0xfe59, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xfe5a, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xfe5b, G_UNICODE_NOT_PRESENT_OFFSET, 14607 }, + { 0xfe5c, G_UNICODE_NOT_PRESENT_OFFSET, 14609 }, + { 0xfe5d, G_UNICODE_NOT_PRESENT_OFFSET, 14611 }, + { 0xfe5e, G_UNICODE_NOT_PRESENT_OFFSET, 14615 }, + { 0xfe5f, G_UNICODE_NOT_PRESENT_OFFSET, 14655 }, + { 0xfe60, G_UNICODE_NOT_PRESENT_OFFSET, 14657 }, + { 0xfe61, G_UNICODE_NOT_PRESENT_OFFSET, 14659 }, + { 0xfe62, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xfe63, G_UNICODE_NOT_PRESENT_OFFSET, 14661 }, + { 0xfe64, G_UNICODE_NOT_PRESENT_OFFSET, 14663 }, + { 0xfe65, G_UNICODE_NOT_PRESENT_OFFSET, 14665 }, + { 0xfe66, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0xfe68, G_UNICODE_NOT_PRESENT_OFFSET, 14667 }, + { 0xfe69, G_UNICODE_NOT_PRESENT_OFFSET, 14669 }, + { 0xfe6a, G_UNICODE_NOT_PRESENT_OFFSET, 14671 }, + { 0xfe6b, G_UNICODE_NOT_PRESENT_OFFSET, 14673 }, + { 0xfe70, G_UNICODE_NOT_PRESENT_OFFSET, 14675 }, + { 0xfe71, G_UNICODE_NOT_PRESENT_OFFSET, 14679 }, + { 0xfe72, G_UNICODE_NOT_PRESENT_OFFSET, 14684 }, + { 0xfe74, G_UNICODE_NOT_PRESENT_OFFSET, 14688 }, + { 0xfe76, G_UNICODE_NOT_PRESENT_OFFSET, 14692 }, + { 0xfe77, G_UNICODE_NOT_PRESENT_OFFSET, 14696 }, + { 0xfe78, G_UNICODE_NOT_PRESENT_OFFSET, 14701 }, + { 0xfe79, G_UNICODE_NOT_PRESENT_OFFSET, 14705 }, + { 0xfe7a, G_UNICODE_NOT_PRESENT_OFFSET, 14710 }, + { 0xfe7b, G_UNICODE_NOT_PRESENT_OFFSET, 14714 }, + { 0xfe7c, G_UNICODE_NOT_PRESENT_OFFSET, 14719 }, + { 0xfe7d, G_UNICODE_NOT_PRESENT_OFFSET, 14723 }, + { 0xfe7e, G_UNICODE_NOT_PRESENT_OFFSET, 14728 }, + { 0xfe7f, G_UNICODE_NOT_PRESENT_OFFSET, 14732 }, + { 0xfe80, G_UNICODE_NOT_PRESENT_OFFSET, 14737 }, + { 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, 14740 }, + { 0xfe8e, G_UNICODE_NOT_PRESENT_OFFSET, 14740 }, + { 0xfe8f, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0xfe90, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0xfe91, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0xfe92, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0xfe93, G_UNICODE_NOT_PRESENT_OFFSET, 14746 }, + { 0xfe94, G_UNICODE_NOT_PRESENT_OFFSET, 14746 }, + { 0xfe95, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0xfe96, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0xfe97, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0xfe98, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0xfe99, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0xfe9a, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0xfe9b, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0xfe9c, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0xfe9d, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0xfe9e, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0xfe9f, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0xfea0, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0xfea1, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0xfea2, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0xfea3, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0xfea4, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0xfea5, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0xfea6, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0xfea7, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0xfea8, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0xfea9, G_UNICODE_NOT_PRESENT_OFFSET, 14764 }, + { 0xfeaa, G_UNICODE_NOT_PRESENT_OFFSET, 14764 }, + { 0xfeab, G_UNICODE_NOT_PRESENT_OFFSET, 14767 }, + { 0xfeac, G_UNICODE_NOT_PRESENT_OFFSET, 14767 }, + { 0xfead, G_UNICODE_NOT_PRESENT_OFFSET, 14770 }, + { 0xfeae, G_UNICODE_NOT_PRESENT_OFFSET, 14770 }, + { 0xfeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0xfeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0xfeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0xfeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0xfeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0xfeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0xfeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0xfeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0xfeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0xfeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0xfeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0xfeba, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0xfebb, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0xfebc, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0xfebd, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0xfebe, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0xfebf, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0xfec0, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0xfec1, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0xfec2, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0xfec3, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0xfec4, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0xfec5, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0xfec6, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0xfec7, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0xfec8, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0xfec9, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0xfeca, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0xfecb, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0xfecc, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0xfecd, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0xfece, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0xfecf, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0xfed0, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0xfed1, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0xfed2, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0xfed3, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0xfed4, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0xfed5, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0xfed6, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0xfed7, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0xfed8, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0xfed9, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0xfeda, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0xfedb, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0xfedc, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0xfedd, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0xfede, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0xfedf, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0xfee0, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0xfee1, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0xfee2, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0xfee3, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0xfee4, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0xfee5, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0xfee6, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0xfee7, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0xfee8, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0xfee9, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0xfeea, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0xfeeb, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0xfeec, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0xfeed, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0xfeee, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0xfeef, G_UNICODE_NOT_PRESENT_OFFSET, 12870 }, + { 0xfef0, G_UNICODE_NOT_PRESENT_OFFSET, 12870 }, + { 0xfef1, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0xfef2, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0xfef3, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0xfef4, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0xfef5, G_UNICODE_NOT_PRESENT_OFFSET, 14827 }, + { 0xfef6, G_UNICODE_NOT_PRESENT_OFFSET, 14827 }, + { 0xfef7, G_UNICODE_NOT_PRESENT_OFFSET, 14834 }, + { 0xfef8, G_UNICODE_NOT_PRESENT_OFFSET, 14834 }, + { 0xfef9, G_UNICODE_NOT_PRESENT_OFFSET, 14841 }, + { 0xfefa, G_UNICODE_NOT_PRESENT_OFFSET, 14841 }, + { 0xfefb, G_UNICODE_NOT_PRESENT_OFFSET, 14848 }, + { 0xfefc, G_UNICODE_NOT_PRESENT_OFFSET, 14848 }, + { 0xff01, G_UNICODE_NOT_PRESENT_OFFSET, 14585 }, + { 0xff02, G_UNICODE_NOT_PRESENT_OFFSET, 14853 }, + { 0xff03, G_UNICODE_NOT_PRESENT_OFFSET, 14655 }, + { 0xff04, G_UNICODE_NOT_PRESENT_OFFSET, 14669 }, + { 0xff05, G_UNICODE_NOT_PRESENT_OFFSET, 14671 }, + { 0xff06, G_UNICODE_NOT_PRESENT_OFFSET, 14657 }, + { 0xff07, G_UNICODE_NOT_PRESENT_OFFSET, 14855 }, + { 0xff08, G_UNICODE_NOT_PRESENT_OFFSET, 5275 }, + { 0xff09, G_UNICODE_NOT_PRESENT_OFFSET, 5277 }, + { 0xff0a, G_UNICODE_NOT_PRESENT_OFFSET, 14659 }, + { 0xff0b, G_UNICODE_NOT_PRESENT_OFFSET, 5267 }, + { 0xff0c, G_UNICODE_NOT_PRESENT_OFFSET, 14573 }, + { 0xff0d, G_UNICODE_NOT_PRESENT_OFFSET, 14661 }, + { 0xff0e, G_UNICODE_NOT_PRESENT_OFFSET, 5181 }, + { 0xff0f, G_UNICODE_NOT_PRESENT_OFFSET, 14857 }, + { 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, 14583 }, + { 0xff1b, G_UNICODE_NOT_PRESENT_OFFSET, 1248 }, + { 0xff1c, G_UNICODE_NOT_PRESENT_OFFSET, 14663 }, + { 0xff1d, G_UNICODE_NOT_PRESENT_OFFSET, 5273 }, + { 0xff1e, G_UNICODE_NOT_PRESENT_OFFSET, 14665 }, + { 0xff1f, G_UNICODE_NOT_PRESENT_OFFSET, 14587 }, + { 0xff20, G_UNICODE_NOT_PRESENT_OFFSET, 14673 }, + { 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, 6133 }, + { 0xff34, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0xff35, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0xff36, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0xff37, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0xff38, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0xff39, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 0xff3a, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0xff3b, G_UNICODE_NOT_PRESENT_OFFSET, 14651 }, + { 0xff3c, G_UNICODE_NOT_PRESENT_OFFSET, 14667 }, + { 0xff3d, G_UNICODE_NOT_PRESENT_OFFSET, 14653 }, + { 0xff3e, G_UNICODE_NOT_PRESENT_OFFSET, 14859 }, + { 0xff3f, G_UNICODE_NOT_PRESENT_OFFSET, 14605 }, + { 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, 6137 }, + { 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, 14607 }, + { 0xff5c, G_UNICODE_NOT_PRESENT_OFFSET, 14861 }, + { 0xff5d, G_UNICODE_NOT_PRESENT_OFFSET, 14609 }, + { 0xff5e, G_UNICODE_NOT_PRESENT_OFFSET, 14863 }, + { 0xff5f, G_UNICODE_NOT_PRESENT_OFFSET, 14865 }, + { 0xff60, G_UNICODE_NOT_PRESENT_OFFSET, 14869 }, + { 0xff61, G_UNICODE_NOT_PRESENT_OFFSET, 14579 }, + { 0xff62, G_UNICODE_NOT_PRESENT_OFFSET, 14635 }, + { 0xff63, G_UNICODE_NOT_PRESENT_OFFSET, 14639 }, + { 0xff64, G_UNICODE_NOT_PRESENT_OFFSET, 14575 }, + { 0xff65, G_UNICODE_NOT_PRESENT_OFFSET, 14873 }, + { 0xff66, G_UNICODE_NOT_PRESENT_OFFSET, 8992 }, + { 0xff67, G_UNICODE_NOT_PRESENT_OFFSET, 14877 }, + { 0xff68, G_UNICODE_NOT_PRESENT_OFFSET, 14881 }, + { 0xff69, G_UNICODE_NOT_PRESENT_OFFSET, 14885 }, + { 0xff6a, G_UNICODE_NOT_PRESENT_OFFSET, 14889 }, + { 0xff6b, G_UNICODE_NOT_PRESENT_OFFSET, 14893 }, + { 0xff6c, G_UNICODE_NOT_PRESENT_OFFSET, 14897 }, + { 0xff6d, G_UNICODE_NOT_PRESENT_OFFSET, 14901 }, + { 0xff6e, G_UNICODE_NOT_PRESENT_OFFSET, 14905 }, + { 0xff6f, G_UNICODE_NOT_PRESENT_OFFSET, 14909 }, + { 0xff70, G_UNICODE_NOT_PRESENT_OFFSET, 14913 }, + { 0xff71, G_UNICODE_NOT_PRESENT_OFFSET, 8808 }, + { 0xff72, G_UNICODE_NOT_PRESENT_OFFSET, 8812 }, + { 0xff73, G_UNICODE_NOT_PRESENT_OFFSET, 8816 }, + { 0xff74, G_UNICODE_NOT_PRESENT_OFFSET, 8820 }, + { 0xff75, G_UNICODE_NOT_PRESENT_OFFSET, 8824 }, + { 0xff76, G_UNICODE_NOT_PRESENT_OFFSET, 8828 }, + { 0xff77, G_UNICODE_NOT_PRESENT_OFFSET, 8832 }, + { 0xff78, G_UNICODE_NOT_PRESENT_OFFSET, 8836 }, + { 0xff79, G_UNICODE_NOT_PRESENT_OFFSET, 8840 }, + { 0xff7a, G_UNICODE_NOT_PRESENT_OFFSET, 8844 }, + { 0xff7b, G_UNICODE_NOT_PRESENT_OFFSET, 8848 }, + { 0xff7c, G_UNICODE_NOT_PRESENT_OFFSET, 8852 }, + { 0xff7d, G_UNICODE_NOT_PRESENT_OFFSET, 8856 }, + { 0xff7e, G_UNICODE_NOT_PRESENT_OFFSET, 8860 }, + { 0xff7f, G_UNICODE_NOT_PRESENT_OFFSET, 8864 }, + { 0xff80, G_UNICODE_NOT_PRESENT_OFFSET, 8868 }, + { 0xff81, G_UNICODE_NOT_PRESENT_OFFSET, 8872 }, + { 0xff82, G_UNICODE_NOT_PRESENT_OFFSET, 8876 }, + { 0xff83, G_UNICODE_NOT_PRESENT_OFFSET, 8880 }, + { 0xff84, G_UNICODE_NOT_PRESENT_OFFSET, 8884 }, + { 0xff85, G_UNICODE_NOT_PRESENT_OFFSET, 8888 }, + { 0xff86, G_UNICODE_NOT_PRESENT_OFFSET, 8892 }, + { 0xff87, G_UNICODE_NOT_PRESENT_OFFSET, 8896 }, + { 0xff88, G_UNICODE_NOT_PRESENT_OFFSET, 8900 }, + { 0xff89, G_UNICODE_NOT_PRESENT_OFFSET, 8904 }, + { 0xff8a, G_UNICODE_NOT_PRESENT_OFFSET, 8908 }, + { 0xff8b, G_UNICODE_NOT_PRESENT_OFFSET, 8912 }, + { 0xff8c, G_UNICODE_NOT_PRESENT_OFFSET, 8916 }, + { 0xff8d, G_UNICODE_NOT_PRESENT_OFFSET, 8920 }, + { 0xff8e, G_UNICODE_NOT_PRESENT_OFFSET, 8924 }, + { 0xff8f, G_UNICODE_NOT_PRESENT_OFFSET, 8928 }, + { 0xff90, G_UNICODE_NOT_PRESENT_OFFSET, 8932 }, + { 0xff91, G_UNICODE_NOT_PRESENT_OFFSET, 8936 }, + { 0xff92, G_UNICODE_NOT_PRESENT_OFFSET, 8940 }, + { 0xff93, G_UNICODE_NOT_PRESENT_OFFSET, 8944 }, + { 0xff94, G_UNICODE_NOT_PRESENT_OFFSET, 8948 }, + { 0xff95, G_UNICODE_NOT_PRESENT_OFFSET, 8952 }, + { 0xff96, G_UNICODE_NOT_PRESENT_OFFSET, 8956 }, + { 0xff97, G_UNICODE_NOT_PRESENT_OFFSET, 8960 }, + { 0xff98, G_UNICODE_NOT_PRESENT_OFFSET, 8964 }, + { 0xff99, G_UNICODE_NOT_PRESENT_OFFSET, 8968 }, + { 0xff9a, G_UNICODE_NOT_PRESENT_OFFSET, 8972 }, + { 0xff9b, G_UNICODE_NOT_PRESENT_OFFSET, 8976 }, + { 0xff9c, G_UNICODE_NOT_PRESENT_OFFSET, 8980 }, + { 0xff9d, G_UNICODE_NOT_PRESENT_OFFSET, 14917 }, + { 0xff9e, G_UNICODE_NOT_PRESENT_OFFSET, 14921 }, + { 0xff9f, G_UNICODE_NOT_PRESENT_OFFSET, 14925 }, + { 0xffa0, G_UNICODE_NOT_PRESENT_OFFSET, 7683 }, + { 0xffa1, G_UNICODE_NOT_PRESENT_OFFSET, 7479 }, + { 0xffa2, G_UNICODE_NOT_PRESENT_OFFSET, 7483 }, + { 0xffa3, G_UNICODE_NOT_PRESENT_OFFSET, 7487 }, + { 0xffa4, G_UNICODE_NOT_PRESENT_OFFSET, 7491 }, + { 0xffa5, G_UNICODE_NOT_PRESENT_OFFSET, 7495 }, + { 0xffa6, G_UNICODE_NOT_PRESENT_OFFSET, 7499 }, + { 0xffa7, G_UNICODE_NOT_PRESENT_OFFSET, 7503 }, + { 0xffa8, G_UNICODE_NOT_PRESENT_OFFSET, 7507 }, + { 0xffa9, G_UNICODE_NOT_PRESENT_OFFSET, 7511 }, + { 0xffaa, G_UNICODE_NOT_PRESENT_OFFSET, 7515 }, + { 0xffab, G_UNICODE_NOT_PRESENT_OFFSET, 7519 }, + { 0xffac, G_UNICODE_NOT_PRESENT_OFFSET, 7523 }, + { 0xffad, G_UNICODE_NOT_PRESENT_OFFSET, 7527 }, + { 0xffae, G_UNICODE_NOT_PRESENT_OFFSET, 7531 }, + { 0xffaf, G_UNICODE_NOT_PRESENT_OFFSET, 7535 }, + { 0xffb0, G_UNICODE_NOT_PRESENT_OFFSET, 7539 }, + { 0xffb1, G_UNICODE_NOT_PRESENT_OFFSET, 7543 }, + { 0xffb2, G_UNICODE_NOT_PRESENT_OFFSET, 7547 }, + { 0xffb3, G_UNICODE_NOT_PRESENT_OFFSET, 7551 }, + { 0xffb4, G_UNICODE_NOT_PRESENT_OFFSET, 7555 }, + { 0xffb5, G_UNICODE_NOT_PRESENT_OFFSET, 7559 }, + { 0xffb6, G_UNICODE_NOT_PRESENT_OFFSET, 7563 }, + { 0xffb7, G_UNICODE_NOT_PRESENT_OFFSET, 7567 }, + { 0xffb8, G_UNICODE_NOT_PRESENT_OFFSET, 7571 }, + { 0xffb9, G_UNICODE_NOT_PRESENT_OFFSET, 7575 }, + { 0xffba, G_UNICODE_NOT_PRESENT_OFFSET, 7579 }, + { 0xffbb, G_UNICODE_NOT_PRESENT_OFFSET, 7583 }, + { 0xffbc, G_UNICODE_NOT_PRESENT_OFFSET, 7587 }, + { 0xffbd, G_UNICODE_NOT_PRESENT_OFFSET, 7591 }, + { 0xffbe, G_UNICODE_NOT_PRESENT_OFFSET, 7595 }, + { 0xffc2, G_UNICODE_NOT_PRESENT_OFFSET, 7599 }, + { 0xffc3, G_UNICODE_NOT_PRESENT_OFFSET, 7603 }, + { 0xffc4, G_UNICODE_NOT_PRESENT_OFFSET, 7607 }, + { 0xffc5, G_UNICODE_NOT_PRESENT_OFFSET, 7611 }, + { 0xffc6, G_UNICODE_NOT_PRESENT_OFFSET, 7615 }, + { 0xffc7, G_UNICODE_NOT_PRESENT_OFFSET, 7619 }, + { 0xffca, G_UNICODE_NOT_PRESENT_OFFSET, 7623 }, + { 0xffcb, G_UNICODE_NOT_PRESENT_OFFSET, 7627 }, + { 0xffcc, G_UNICODE_NOT_PRESENT_OFFSET, 7631 }, + { 0xffcd, G_UNICODE_NOT_PRESENT_OFFSET, 7635 }, + { 0xffce, G_UNICODE_NOT_PRESENT_OFFSET, 7639 }, + { 0xffcf, G_UNICODE_NOT_PRESENT_OFFSET, 7643 }, + { 0xffd2, G_UNICODE_NOT_PRESENT_OFFSET, 7647 }, + { 0xffd3, G_UNICODE_NOT_PRESENT_OFFSET, 7651 }, + { 0xffd4, G_UNICODE_NOT_PRESENT_OFFSET, 7655 }, + { 0xffd5, G_UNICODE_NOT_PRESENT_OFFSET, 7659 }, + { 0xffd6, G_UNICODE_NOT_PRESENT_OFFSET, 7663 }, + { 0xffd7, G_UNICODE_NOT_PRESENT_OFFSET, 7667 }, + { 0xffda, G_UNICODE_NOT_PRESENT_OFFSET, 7671 }, + { 0xffdb, G_UNICODE_NOT_PRESENT_OFFSET, 7675 }, + { 0xffdc, G_UNICODE_NOT_PRESENT_OFFSET, 7679 }, + { 0xffe0, G_UNICODE_NOT_PRESENT_OFFSET, 14929 }, + { 0xffe1, G_UNICODE_NOT_PRESENT_OFFSET, 14932 }, + { 0xffe2, G_UNICODE_NOT_PRESENT_OFFSET, 14935 }, + { 0xffe3, G_UNICODE_NOT_PRESENT_OFFSET, 8 }, + { 0xffe4, G_UNICODE_NOT_PRESENT_OFFSET, 14938 }, + { 0xffe5, G_UNICODE_NOT_PRESENT_OFFSET, 14941 }, + { 0xffe6, G_UNICODE_NOT_PRESENT_OFFSET, 14944 }, + { 0xffe8, G_UNICODE_NOT_PRESENT_OFFSET, 14948 }, + { 0xffe9, G_UNICODE_NOT_PRESENT_OFFSET, 14952 }, + { 0xffea, G_UNICODE_NOT_PRESENT_OFFSET, 14956 }, + { 0xffeb, G_UNICODE_NOT_PRESENT_OFFSET, 14960 }, + { 0xffec, G_UNICODE_NOT_PRESENT_OFFSET, 14964 }, + { 0xffed, G_UNICODE_NOT_PRESENT_OFFSET, 14968 }, + { 0xffee, G_UNICODE_NOT_PRESENT_OFFSET, 14972 }, + { 0x1109a, 14976, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1109c, 14985, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x110ab, 14994, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1112e, 15003, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1112f, 15012, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d15e, 15021, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d15f, 15030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d160, 15039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d161, 15052, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d162, 15065, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d163, 15078, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d164, 15091, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bb, 15104, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bc, 15113, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bd, 15122, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1be, 15135, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1bf, 15148, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x1d1c0, 15161, 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, 6133 }, + { 0x1d413, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d414, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d415, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d416, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d417, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d418, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d447, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d448, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d449, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d44a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d44b, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d44c, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d47b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d47c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d47d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d47e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d47f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d480, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d4af, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d4b0, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d4b1, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d4b2, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d4b3, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d4b4, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d4e3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d4e4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d4e5, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d4e6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d4e7, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d4e8, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d517, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d518, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d519, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d51a, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d51b, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d51c, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d54b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d54c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d54d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d54e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d54f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d550, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d57f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d580, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d581, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d582, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d583, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d584, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d5b3, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d5b4, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d5b5, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d5b6, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d5b7, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d5b8, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d5e7, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d5e8, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d5e9, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d5ea, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d5eb, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d5ec, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d61b, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d61c, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d61d, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d61e, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d61f, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d620, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d64f, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d650, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d651, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d652, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d653, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d654, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 6133 }, + { 0x1d683, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1d684, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1d685, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1d686, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1d687, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1d688, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 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, 6137 }, + { 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, 15174 }, + { 0x1d6a5, G_UNICODE_NOT_PRESENT_OFFSET, 15177 }, + { 0x1d6a8, G_UNICODE_NOT_PRESENT_OFFSET, 15180 }, + { 0x1d6a9, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, + { 0x1d6aa, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d6ab, G_UNICODE_NOT_PRESENT_OFFSET, 15186 }, + { 0x1d6ac, G_UNICODE_NOT_PRESENT_OFFSET, 15189 }, + { 0x1d6ad, G_UNICODE_NOT_PRESENT_OFFSET, 15192 }, + { 0x1d6ae, G_UNICODE_NOT_PRESENT_OFFSET, 15195 }, + { 0x1d6af, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6b0, G_UNICODE_NOT_PRESENT_OFFSET, 15198 }, + { 0x1d6b1, G_UNICODE_NOT_PRESENT_OFFSET, 15201 }, + { 0x1d6b2, G_UNICODE_NOT_PRESENT_OFFSET, 15204 }, + { 0x1d6b3, G_UNICODE_NOT_PRESENT_OFFSET, 15207 }, + { 0x1d6b4, G_UNICODE_NOT_PRESENT_OFFSET, 15210 }, + { 0x1d6b5, G_UNICODE_NOT_PRESENT_OFFSET, 15213 }, + { 0x1d6b6, G_UNICODE_NOT_PRESENT_OFFSET, 15216 }, + { 0x1d6b7, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d6b8, G_UNICODE_NOT_PRESENT_OFFSET, 15219 }, + { 0x1d6b9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6ba, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d6bb, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, + { 0x1d6bc, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d6bd, G_UNICODE_NOT_PRESENT_OFFSET, 15225 }, + { 0x1d6be, G_UNICODE_NOT_PRESENT_OFFSET, 15228 }, + { 0x1d6bf, G_UNICODE_NOT_PRESENT_OFFSET, 15231 }, + { 0x1d6c0, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d6c1, G_UNICODE_NOT_PRESENT_OFFSET, 15234 }, + { 0x1d6c2, G_UNICODE_NOT_PRESENT_OFFSET, 15238 }, + { 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, 15241 }, + { 0x1d6c8, G_UNICODE_NOT_PRESENT_OFFSET, 15244 }, + { 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, 15247 }, + { 0x1d6cd, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d6ce, G_UNICODE_NOT_PRESENT_OFFSET, 15250 }, + { 0x1d6cf, G_UNICODE_NOT_PRESENT_OFFSET, 15253 }, + { 0x1d6d0, G_UNICODE_NOT_PRESENT_OFFSET, 15256 }, + { 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, 15259 }, + { 0x1d6d5, G_UNICODE_NOT_PRESENT_OFFSET, 15262 }, + { 0x1d6d6, G_UNICODE_NOT_PRESENT_OFFSET, 15265 }, + { 0x1d6d7, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d6d8, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d6d9, G_UNICODE_NOT_PRESENT_OFFSET, 15268 }, + { 0x1d6da, G_UNICODE_NOT_PRESENT_OFFSET, 15271 }, + { 0x1d6db, G_UNICODE_NOT_PRESENT_OFFSET, 15274 }, + { 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, 15180 }, + { 0x1d6e3, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, + { 0x1d6e4, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d6e5, G_UNICODE_NOT_PRESENT_OFFSET, 15186 }, + { 0x1d6e6, G_UNICODE_NOT_PRESENT_OFFSET, 15189 }, + { 0x1d6e7, G_UNICODE_NOT_PRESENT_OFFSET, 15192 }, + { 0x1d6e8, G_UNICODE_NOT_PRESENT_OFFSET, 15195 }, + { 0x1d6e9, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6ea, G_UNICODE_NOT_PRESENT_OFFSET, 15198 }, + { 0x1d6eb, G_UNICODE_NOT_PRESENT_OFFSET, 15201 }, + { 0x1d6ec, G_UNICODE_NOT_PRESENT_OFFSET, 15204 }, + { 0x1d6ed, G_UNICODE_NOT_PRESENT_OFFSET, 15207 }, + { 0x1d6ee, G_UNICODE_NOT_PRESENT_OFFSET, 15210 }, + { 0x1d6ef, G_UNICODE_NOT_PRESENT_OFFSET, 15213 }, + { 0x1d6f0, G_UNICODE_NOT_PRESENT_OFFSET, 15216 }, + { 0x1d6f1, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d6f2, G_UNICODE_NOT_PRESENT_OFFSET, 15219 }, + { 0x1d6f3, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d6f4, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d6f5, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, + { 0x1d6f6, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d6f7, G_UNICODE_NOT_PRESENT_OFFSET, 15225 }, + { 0x1d6f8, G_UNICODE_NOT_PRESENT_OFFSET, 15228 }, + { 0x1d6f9, G_UNICODE_NOT_PRESENT_OFFSET, 15231 }, + { 0x1d6fa, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d6fb, G_UNICODE_NOT_PRESENT_OFFSET, 15234 }, + { 0x1d6fc, G_UNICODE_NOT_PRESENT_OFFSET, 15238 }, + { 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, 15241 }, + { 0x1d702, G_UNICODE_NOT_PRESENT_OFFSET, 15244 }, + { 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, 15247 }, + { 0x1d707, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d708, G_UNICODE_NOT_PRESENT_OFFSET, 15250 }, + { 0x1d709, G_UNICODE_NOT_PRESENT_OFFSET, 15253 }, + { 0x1d70a, G_UNICODE_NOT_PRESENT_OFFSET, 15256 }, + { 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, 15259 }, + { 0x1d70f, G_UNICODE_NOT_PRESENT_OFFSET, 15262 }, + { 0x1d710, G_UNICODE_NOT_PRESENT_OFFSET, 15265 }, + { 0x1d711, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d712, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d713, G_UNICODE_NOT_PRESENT_OFFSET, 15268 }, + { 0x1d714, G_UNICODE_NOT_PRESENT_OFFSET, 15271 }, + { 0x1d715, G_UNICODE_NOT_PRESENT_OFFSET, 15274 }, + { 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, 15180 }, + { 0x1d71d, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, + { 0x1d71e, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d71f, G_UNICODE_NOT_PRESENT_OFFSET, 15186 }, + { 0x1d720, G_UNICODE_NOT_PRESENT_OFFSET, 15189 }, + { 0x1d721, G_UNICODE_NOT_PRESENT_OFFSET, 15192 }, + { 0x1d722, G_UNICODE_NOT_PRESENT_OFFSET, 15195 }, + { 0x1d723, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d724, G_UNICODE_NOT_PRESENT_OFFSET, 15198 }, + { 0x1d725, G_UNICODE_NOT_PRESENT_OFFSET, 15201 }, + { 0x1d726, G_UNICODE_NOT_PRESENT_OFFSET, 15204 }, + { 0x1d727, G_UNICODE_NOT_PRESENT_OFFSET, 15207 }, + { 0x1d728, G_UNICODE_NOT_PRESENT_OFFSET, 15210 }, + { 0x1d729, G_UNICODE_NOT_PRESENT_OFFSET, 15213 }, + { 0x1d72a, G_UNICODE_NOT_PRESENT_OFFSET, 15216 }, + { 0x1d72b, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d72c, G_UNICODE_NOT_PRESENT_OFFSET, 15219 }, + { 0x1d72d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d72e, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d72f, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, + { 0x1d730, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d731, G_UNICODE_NOT_PRESENT_OFFSET, 15225 }, + { 0x1d732, G_UNICODE_NOT_PRESENT_OFFSET, 15228 }, + { 0x1d733, G_UNICODE_NOT_PRESENT_OFFSET, 15231 }, + { 0x1d734, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d735, G_UNICODE_NOT_PRESENT_OFFSET, 15234 }, + { 0x1d736, G_UNICODE_NOT_PRESENT_OFFSET, 15238 }, + { 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, 15241 }, + { 0x1d73c, G_UNICODE_NOT_PRESENT_OFFSET, 15244 }, + { 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, 15247 }, + { 0x1d741, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d742, G_UNICODE_NOT_PRESENT_OFFSET, 15250 }, + { 0x1d743, G_UNICODE_NOT_PRESENT_OFFSET, 15253 }, + { 0x1d744, G_UNICODE_NOT_PRESENT_OFFSET, 15256 }, + { 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, 15259 }, + { 0x1d749, G_UNICODE_NOT_PRESENT_OFFSET, 15262 }, + { 0x1d74a, G_UNICODE_NOT_PRESENT_OFFSET, 15265 }, + { 0x1d74b, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d74c, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d74d, G_UNICODE_NOT_PRESENT_OFFSET, 15268 }, + { 0x1d74e, G_UNICODE_NOT_PRESENT_OFFSET, 15271 }, + { 0x1d74f, G_UNICODE_NOT_PRESENT_OFFSET, 15274 }, + { 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, 15180 }, + { 0x1d757, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, + { 0x1d758, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d759, G_UNICODE_NOT_PRESENT_OFFSET, 15186 }, + { 0x1d75a, G_UNICODE_NOT_PRESENT_OFFSET, 15189 }, + { 0x1d75b, G_UNICODE_NOT_PRESENT_OFFSET, 15192 }, + { 0x1d75c, G_UNICODE_NOT_PRESENT_OFFSET, 15195 }, + { 0x1d75d, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d75e, G_UNICODE_NOT_PRESENT_OFFSET, 15198 }, + { 0x1d75f, G_UNICODE_NOT_PRESENT_OFFSET, 15201 }, + { 0x1d760, G_UNICODE_NOT_PRESENT_OFFSET, 15204 }, + { 0x1d761, G_UNICODE_NOT_PRESENT_OFFSET, 15207 }, + { 0x1d762, G_UNICODE_NOT_PRESENT_OFFSET, 15210 }, + { 0x1d763, G_UNICODE_NOT_PRESENT_OFFSET, 15213 }, + { 0x1d764, G_UNICODE_NOT_PRESENT_OFFSET, 15216 }, + { 0x1d765, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d766, G_UNICODE_NOT_PRESENT_OFFSET, 15219 }, + { 0x1d767, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d768, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d769, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, + { 0x1d76a, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d76b, G_UNICODE_NOT_PRESENT_OFFSET, 15225 }, + { 0x1d76c, G_UNICODE_NOT_PRESENT_OFFSET, 15228 }, + { 0x1d76d, G_UNICODE_NOT_PRESENT_OFFSET, 15231 }, + { 0x1d76e, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d76f, G_UNICODE_NOT_PRESENT_OFFSET, 15234 }, + { 0x1d770, G_UNICODE_NOT_PRESENT_OFFSET, 15238 }, + { 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, 15241 }, + { 0x1d776, G_UNICODE_NOT_PRESENT_OFFSET, 15244 }, + { 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, 15247 }, + { 0x1d77b, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d77c, G_UNICODE_NOT_PRESENT_OFFSET, 15250 }, + { 0x1d77d, G_UNICODE_NOT_PRESENT_OFFSET, 15253 }, + { 0x1d77e, G_UNICODE_NOT_PRESENT_OFFSET, 15256 }, + { 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, 15259 }, + { 0x1d783, G_UNICODE_NOT_PRESENT_OFFSET, 15262 }, + { 0x1d784, G_UNICODE_NOT_PRESENT_OFFSET, 15265 }, + { 0x1d785, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d786, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d787, G_UNICODE_NOT_PRESENT_OFFSET, 15268 }, + { 0x1d788, G_UNICODE_NOT_PRESENT_OFFSET, 15271 }, + { 0x1d789, G_UNICODE_NOT_PRESENT_OFFSET, 15274 }, + { 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, 15180 }, + { 0x1d791, G_UNICODE_NOT_PRESENT_OFFSET, 15183 }, + { 0x1d792, G_UNICODE_NOT_PRESENT_OFFSET, 5354 }, + { 0x1d793, G_UNICODE_NOT_PRESENT_OFFSET, 15186 }, + { 0x1d794, G_UNICODE_NOT_PRESENT_OFFSET, 15189 }, + { 0x1d795, G_UNICODE_NOT_PRESENT_OFFSET, 15192 }, + { 0x1d796, G_UNICODE_NOT_PRESENT_OFFSET, 15195 }, + { 0x1d797, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d798, G_UNICODE_NOT_PRESENT_OFFSET, 15198 }, + { 0x1d799, G_UNICODE_NOT_PRESENT_OFFSET, 15201 }, + { 0x1d79a, G_UNICODE_NOT_PRESENT_OFFSET, 15204 }, + { 0x1d79b, G_UNICODE_NOT_PRESENT_OFFSET, 15207 }, + { 0x1d79c, G_UNICODE_NOT_PRESENT_OFFSET, 15210 }, + { 0x1d79d, G_UNICODE_NOT_PRESENT_OFFSET, 15213 }, + { 0x1d79e, G_UNICODE_NOT_PRESENT_OFFSET, 15216 }, + { 0x1d79f, G_UNICODE_NOT_PRESENT_OFFSET, 5357 }, + { 0x1d7a0, G_UNICODE_NOT_PRESENT_OFFSET, 15219 }, + { 0x1d7a1, G_UNICODE_NOT_PRESENT_OFFSET, 1402 }, + { 0x1d7a2, G_UNICODE_NOT_PRESENT_OFFSET, 1408 }, + { 0x1d7a3, G_UNICODE_NOT_PRESENT_OFFSET, 15222 }, + { 0x1d7a4, G_UNICODE_NOT_PRESENT_OFFSET, 1374 }, + { 0x1d7a5, G_UNICODE_NOT_PRESENT_OFFSET, 15225 }, + { 0x1d7a6, G_UNICODE_NOT_PRESENT_OFFSET, 15228 }, + { 0x1d7a7, G_UNICODE_NOT_PRESENT_OFFSET, 15231 }, + { 0x1d7a8, G_UNICODE_NOT_PRESENT_OFFSET, 5333 }, + { 0x1d7a9, G_UNICODE_NOT_PRESENT_OFFSET, 15234 }, + { 0x1d7aa, G_UNICODE_NOT_PRESENT_OFFSET, 15238 }, + { 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, 15241 }, + { 0x1d7b0, G_UNICODE_NOT_PRESENT_OFFSET, 15244 }, + { 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, 15247 }, + { 0x1d7b5, G_UNICODE_NOT_PRESENT_OFFSET, 20 }, + { 0x1d7b6, G_UNICODE_NOT_PRESENT_OFFSET, 15250 }, + { 0x1d7b7, G_UNICODE_NOT_PRESENT_OFFSET, 15253 }, + { 0x1d7b8, G_UNICODE_NOT_PRESENT_OFFSET, 15256 }, + { 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, 15259 }, + { 0x1d7bd, G_UNICODE_NOT_PRESENT_OFFSET, 15262 }, + { 0x1d7be, G_UNICODE_NOT_PRESENT_OFFSET, 15265 }, + { 0x1d7bf, G_UNICODE_NOT_PRESENT_OFFSET, 1387 }, + { 0x1d7c0, G_UNICODE_NOT_PRESENT_OFFSET, 2424 }, + { 0x1d7c1, G_UNICODE_NOT_PRESENT_OFFSET, 15268 }, + { 0x1d7c2, G_UNICODE_NOT_PRESENT_OFFSET, 15271 }, + { 0x1d7c3, G_UNICODE_NOT_PRESENT_OFFSET, 15274 }, + { 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, 15278 }, + { 0x1d7cb, G_UNICODE_NOT_PRESENT_OFFSET, 15281 }, + { 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 }, + { 0x1ee00, G_UNICODE_NOT_PRESENT_OFFSET, 14740 }, + { 0x1ee01, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0x1ee02, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1ee03, G_UNICODE_NOT_PRESENT_OFFSET, 14764 }, + { 0x1ee05, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0x1ee06, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0x1ee07, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1ee08, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0x1ee09, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1ee0a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0x1ee0b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0x1ee0c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0x1ee0d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1ee0e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1ee0f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1ee10, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0x1ee11, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1ee12, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1ee13, G_UNICODE_NOT_PRESENT_OFFSET, 14770 }, + { 0x1ee14, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1ee15, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0x1ee16, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0x1ee17, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1ee18, G_UNICODE_NOT_PRESENT_OFFSET, 14767 }, + { 0x1ee19, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1ee1a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0x1ee1b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1ee1c, G_UNICODE_NOT_PRESENT_OFFSET, 15284 }, + { 0x1ee1d, G_UNICODE_NOT_PRESENT_OFFSET, 12831 }, + { 0x1ee1e, G_UNICODE_NOT_PRESENT_OFFSET, 15287 }, + { 0x1ee1f, G_UNICODE_NOT_PRESENT_OFFSET, 15290 }, + { 0x1ee21, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0x1ee22, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1ee24, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0x1ee27, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1ee29, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1ee2a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0x1ee2b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0x1ee2c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0x1ee2d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1ee2e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1ee2f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1ee30, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0x1ee31, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1ee32, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1ee34, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1ee35, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0x1ee36, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0x1ee37, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1ee39, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1ee3b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1ee42, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1ee47, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1ee49, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1ee4b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0x1ee4d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1ee4e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1ee4f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1ee51, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1ee52, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1ee54, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1ee57, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1ee59, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1ee5b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1ee5d, G_UNICODE_NOT_PRESENT_OFFSET, 12831 }, + { 0x1ee5f, G_UNICODE_NOT_PRESENT_OFFSET, 15290 }, + { 0x1ee61, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0x1ee62, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1ee64, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0x1ee67, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1ee68, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0x1ee69, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1ee6a, G_UNICODE_NOT_PRESENT_OFFSET, 14806 }, + { 0x1ee6c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0x1ee6d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1ee6e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1ee6f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1ee70, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0x1ee71, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1ee72, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1ee74, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1ee75, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0x1ee76, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0x1ee77, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1ee79, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1ee7a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0x1ee7b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1ee7c, G_UNICODE_NOT_PRESENT_OFFSET, 15284 }, + { 0x1ee7e, G_UNICODE_NOT_PRESENT_OFFSET, 15287 }, + { 0x1ee80, G_UNICODE_NOT_PRESENT_OFFSET, 14740 }, + { 0x1ee81, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0x1ee82, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1ee83, G_UNICODE_NOT_PRESENT_OFFSET, 14764 }, + { 0x1ee84, G_UNICODE_NOT_PRESENT_OFFSET, 14818 }, + { 0x1ee85, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0x1ee86, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0x1ee87, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1ee88, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0x1ee89, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1ee8b, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0x1ee8c, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0x1ee8d, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1ee8e, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1ee8f, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1ee90, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0x1ee91, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1ee92, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1ee93, G_UNICODE_NOT_PRESENT_OFFSET, 14770 }, + { 0x1ee94, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1ee95, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0x1ee96, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0x1ee97, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1ee98, G_UNICODE_NOT_PRESENT_OFFSET, 14767 }, + { 0x1ee99, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1ee9a, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0x1ee9b, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1eea1, G_UNICODE_NOT_PRESENT_OFFSET, 14743 }, + { 0x1eea2, G_UNICODE_NOT_PRESENT_OFFSET, 14755 }, + { 0x1eea3, G_UNICODE_NOT_PRESENT_OFFSET, 14764 }, + { 0x1eea5, G_UNICODE_NOT_PRESENT_OFFSET, 14821 }, + { 0x1eea6, G_UNICODE_NOT_PRESENT_OFFSET, 14773 }, + { 0x1eea7, G_UNICODE_NOT_PRESENT_OFFSET, 14758 }, + { 0x1eea8, G_UNICODE_NOT_PRESENT_OFFSET, 14788 }, + { 0x1eea9, G_UNICODE_NOT_PRESENT_OFFSET, 14824 }, + { 0x1eeab, G_UNICODE_NOT_PRESENT_OFFSET, 14809 }, + { 0x1eeac, G_UNICODE_NOT_PRESENT_OFFSET, 14812 }, + { 0x1eead, G_UNICODE_NOT_PRESENT_OFFSET, 14815 }, + { 0x1eeae, G_UNICODE_NOT_PRESENT_OFFSET, 14776 }, + { 0x1eeaf, G_UNICODE_NOT_PRESENT_OFFSET, 14794 }, + { 0x1eeb0, G_UNICODE_NOT_PRESENT_OFFSET, 14800 }, + { 0x1eeb1, G_UNICODE_NOT_PRESENT_OFFSET, 14782 }, + { 0x1eeb2, G_UNICODE_NOT_PRESENT_OFFSET, 14803 }, + { 0x1eeb3, G_UNICODE_NOT_PRESENT_OFFSET, 14770 }, + { 0x1eeb4, G_UNICODE_NOT_PRESENT_OFFSET, 14779 }, + { 0x1eeb5, G_UNICODE_NOT_PRESENT_OFFSET, 14749 }, + { 0x1eeb6, G_UNICODE_NOT_PRESENT_OFFSET, 14752 }, + { 0x1eeb7, G_UNICODE_NOT_PRESENT_OFFSET, 14761 }, + { 0x1eeb8, G_UNICODE_NOT_PRESENT_OFFSET, 14767 }, + { 0x1eeb9, G_UNICODE_NOT_PRESENT_OFFSET, 14785 }, + { 0x1eeba, G_UNICODE_NOT_PRESENT_OFFSET, 14791 }, + { 0x1eebb, G_UNICODE_NOT_PRESENT_OFFSET, 14797 }, + { 0x1f100, G_UNICODE_NOT_PRESENT_OFFSET, 15293 }, + { 0x1f101, G_UNICODE_NOT_PRESENT_OFFSET, 15296 }, + { 0x1f102, G_UNICODE_NOT_PRESENT_OFFSET, 15299 }, + { 0x1f103, G_UNICODE_NOT_PRESENT_OFFSET, 15302 }, + { 0x1f104, G_UNICODE_NOT_PRESENT_OFFSET, 15305 }, + { 0x1f105, G_UNICODE_NOT_PRESENT_OFFSET, 15308 }, + { 0x1f106, G_UNICODE_NOT_PRESENT_OFFSET, 15311 }, + { 0x1f107, G_UNICODE_NOT_PRESENT_OFFSET, 15314 }, + { 0x1f108, G_UNICODE_NOT_PRESENT_OFFSET, 15317 }, + { 0x1f109, G_UNICODE_NOT_PRESENT_OFFSET, 15320 }, + { 0x1f10a, G_UNICODE_NOT_PRESENT_OFFSET, 15323 }, + { 0x1f110, G_UNICODE_NOT_PRESENT_OFFSET, 15326 }, + { 0x1f111, G_UNICODE_NOT_PRESENT_OFFSET, 15330 }, + { 0x1f112, G_UNICODE_NOT_PRESENT_OFFSET, 15334 }, + { 0x1f113, G_UNICODE_NOT_PRESENT_OFFSET, 15338 }, + { 0x1f114, G_UNICODE_NOT_PRESENT_OFFSET, 15342 }, + { 0x1f115, G_UNICODE_NOT_PRESENT_OFFSET, 15346 }, + { 0x1f116, G_UNICODE_NOT_PRESENT_OFFSET, 15350 }, + { 0x1f117, G_UNICODE_NOT_PRESENT_OFFSET, 15354 }, + { 0x1f118, G_UNICODE_NOT_PRESENT_OFFSET, 15358 }, + { 0x1f119, G_UNICODE_NOT_PRESENT_OFFSET, 15362 }, + { 0x1f11a, G_UNICODE_NOT_PRESENT_OFFSET, 15366 }, + { 0x1f11b, G_UNICODE_NOT_PRESENT_OFFSET, 15370 }, + { 0x1f11c, G_UNICODE_NOT_PRESENT_OFFSET, 15374 }, + { 0x1f11d, G_UNICODE_NOT_PRESENT_OFFSET, 15378 }, + { 0x1f11e, G_UNICODE_NOT_PRESENT_OFFSET, 15382 }, + { 0x1f11f, G_UNICODE_NOT_PRESENT_OFFSET, 15386 }, + { 0x1f120, G_UNICODE_NOT_PRESENT_OFFSET, 15390 }, + { 0x1f121, G_UNICODE_NOT_PRESENT_OFFSET, 15394 }, + { 0x1f122, G_UNICODE_NOT_PRESENT_OFFSET, 15398 }, + { 0x1f123, G_UNICODE_NOT_PRESENT_OFFSET, 15402 }, + { 0x1f124, G_UNICODE_NOT_PRESENT_OFFSET, 15406 }, + { 0x1f125, G_UNICODE_NOT_PRESENT_OFFSET, 15410 }, + { 0x1f126, G_UNICODE_NOT_PRESENT_OFFSET, 15414 }, + { 0x1f127, G_UNICODE_NOT_PRESENT_OFFSET, 15418 }, + { 0x1f128, G_UNICODE_NOT_PRESENT_OFFSET, 15422 }, + { 0x1f129, G_UNICODE_NOT_PRESENT_OFFSET, 15426 }, + { 0x1f12a, G_UNICODE_NOT_PRESENT_OFFSET, 15430 }, + { 0x1f12b, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1f12c, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1f12d, G_UNICODE_NOT_PRESENT_OFFSET, 15438 }, + { 0x1f12e, G_UNICODE_NOT_PRESENT_OFFSET, 15441 }, + { 0x1f130, G_UNICODE_NOT_PRESENT_OFFSET, 2309 }, + { 0x1f131, G_UNICODE_NOT_PRESENT_OFFSET, 2314 }, + { 0x1f132, G_UNICODE_NOT_PRESENT_OFFSET, 5292 }, + { 0x1f133, G_UNICODE_NOT_PRESENT_OFFSET, 2316 }, + { 0x1f134, G_UNICODE_NOT_PRESENT_OFFSET, 2318 }, + { 0x1f135, G_UNICODE_NOT_PRESENT_OFFSET, 5336 }, + { 0x1f136, G_UNICODE_NOT_PRESENT_OFFSET, 2323 }, + { 0x1f137, G_UNICODE_NOT_PRESENT_OFFSET, 2325 }, + { 0x1f138, G_UNICODE_NOT_PRESENT_OFFSET, 2327 }, + { 0x1f139, G_UNICODE_NOT_PRESENT_OFFSET, 2329 }, + { 0x1f13a, G_UNICODE_NOT_PRESENT_OFFSET, 2331 }, + { 0x1f13b, G_UNICODE_NOT_PRESENT_OFFSET, 2333 }, + { 0x1f13c, G_UNICODE_NOT_PRESENT_OFFSET, 2335 }, + { 0x1f13d, G_UNICODE_NOT_PRESENT_OFFSET, 2337 }, + { 0x1f13e, G_UNICODE_NOT_PRESENT_OFFSET, 2339 }, + { 0x1f13f, G_UNICODE_NOT_PRESENT_OFFSET, 2344 }, + { 0x1f140, G_UNICODE_NOT_PRESENT_OFFSET, 5319 }, + { 0x1f141, G_UNICODE_NOT_PRESENT_OFFSET, 2346 }, + { 0x1f142, G_UNICODE_NOT_PRESENT_OFFSET, 6133 }, + { 0x1f143, G_UNICODE_NOT_PRESENT_OFFSET, 2348 }, + { 0x1f144, G_UNICODE_NOT_PRESENT_OFFSET, 2350 }, + { 0x1f145, G_UNICODE_NOT_PRESENT_OFFSET, 5470 }, + { 0x1f146, G_UNICODE_NOT_PRESENT_OFFSET, 2352 }, + { 0x1f147, G_UNICODE_NOT_PRESENT_OFFSET, 5487 }, + { 0x1f148, G_UNICODE_NOT_PRESENT_OFFSET, 6135 }, + { 0x1f149, G_UNICODE_NOT_PRESENT_OFFSET, 5331 }, + { 0x1f14a, G_UNICODE_NOT_PRESENT_OFFSET, 15444 }, + { 0x1f14b, G_UNICODE_NOT_PRESENT_OFFSET, 10556 }, + { 0x1f14c, G_UNICODE_NOT_PRESENT_OFFSET, 15447 }, + { 0x1f14d, G_UNICODE_NOT_PRESENT_OFFSET, 15450 }, + { 0x1f14e, G_UNICODE_NOT_PRESENT_OFFSET, 15453 }, + { 0x1f14f, G_UNICODE_NOT_PRESENT_OFFSET, 15457 }, + { 0x1f16a, G_UNICODE_NOT_PRESENT_OFFSET, 15460 }, + { 0x1f16b, G_UNICODE_NOT_PRESENT_OFFSET, 15463 }, + { 0x1f190, G_UNICODE_NOT_PRESENT_OFFSET, 15466 }, + { 0x1f200, G_UNICODE_NOT_PRESENT_OFFSET, 15469 }, + { 0x1f201, G_UNICODE_NOT_PRESENT_OFFSET, 15476 }, + { 0x1f202, G_UNICODE_NOT_PRESENT_OFFSET, 8848 }, + { 0x1f210, G_UNICODE_NOT_PRESENT_OFFSET, 6433 }, + { 0x1f211, G_UNICODE_NOT_PRESENT_OFFSET, 15483 }, + { 0x1f212, G_UNICODE_NOT_PRESENT_OFFSET, 15487 }, + { 0x1f213, G_UNICODE_NOT_PRESENT_OFFSET, 7346 }, + { 0x1f214, G_UNICODE_NOT_PRESENT_OFFSET, 6205 }, + { 0x1f215, G_UNICODE_NOT_PRESENT_OFFSET, 15491 }, + { 0x1f216, G_UNICODE_NOT_PRESENT_OFFSET, 15495 }, + { 0x1f217, G_UNICODE_NOT_PRESENT_OFFSET, 7887 }, + { 0x1f218, G_UNICODE_NOT_PRESENT_OFFSET, 15499 }, + { 0x1f219, G_UNICODE_NOT_PRESENT_OFFSET, 15503 }, + { 0x1f21a, G_UNICODE_NOT_PRESENT_OFFSET, 15507 }, + { 0x1f21b, G_UNICODE_NOT_PRESENT_OFFSET, 11598 }, + { 0x1f21c, G_UNICODE_NOT_PRESENT_OFFSET, 15511 }, + { 0x1f21d, G_UNICODE_NOT_PRESENT_OFFSET, 15515 }, + { 0x1f21e, G_UNICODE_NOT_PRESENT_OFFSET, 15519 }, + { 0x1f21f, G_UNICODE_NOT_PRESENT_OFFSET, 15523 }, + { 0x1f220, G_UNICODE_NOT_PRESENT_OFFSET, 15527 }, + { 0x1f221, G_UNICODE_NOT_PRESENT_OFFSET, 15531 }, + { 0x1f222, G_UNICODE_NOT_PRESENT_OFFSET, 6577 }, + { 0x1f223, G_UNICODE_NOT_PRESENT_OFFSET, 15535 }, + { 0x1f224, G_UNICODE_NOT_PRESENT_OFFSET, 15539 }, + { 0x1f225, G_UNICODE_NOT_PRESENT_OFFSET, 15543 }, + { 0x1f226, G_UNICODE_NOT_PRESENT_OFFSET, 15547 }, + { 0x1f227, G_UNICODE_NOT_PRESENT_OFFSET, 15551 }, + { 0x1f228, G_UNICODE_NOT_PRESENT_OFFSET, 15555 }, + { 0x1f229, G_UNICODE_NOT_PRESENT_OFFSET, 6181 }, + { 0x1f22a, G_UNICODE_NOT_PRESENT_OFFSET, 7855 }, + { 0x1f22b, G_UNICODE_NOT_PRESENT_OFFSET, 15559 }, + { 0x1f22c, G_UNICODE_NOT_PRESENT_OFFSET, 8646 }, + { 0x1f22d, G_UNICODE_NOT_PRESENT_OFFSET, 7867 }, + { 0x1f22e, G_UNICODE_NOT_PRESENT_OFFSET, 8650 }, + { 0x1f22f, G_UNICODE_NOT_PRESENT_OFFSET, 15563 }, + { 0x1f230, G_UNICODE_NOT_PRESENT_OFFSET, 6801 }, + { 0x1f231, G_UNICODE_NOT_PRESENT_OFFSET, 15567 }, + { 0x1f232, G_UNICODE_NOT_PRESENT_OFFSET, 15571 }, + { 0x1f233, G_UNICODE_NOT_PRESENT_OFFSET, 15575 }, + { 0x1f234, G_UNICODE_NOT_PRESENT_OFFSET, 15579 }, + { 0x1f235, G_UNICODE_NOT_PRESENT_OFFSET, 15583 }, + { 0x1f236, G_UNICODE_NOT_PRESENT_OFFSET, 8578 }, + { 0x1f237, G_UNICODE_NOT_PRESENT_OFFSET, 6473 }, + { 0x1f238, G_UNICODE_NOT_PRESENT_OFFSET, 15587 }, + { 0x1f239, G_UNICODE_NOT_PRESENT_OFFSET, 15591 }, + { 0x1f23a, G_UNICODE_NOT_PRESENT_OFFSET, 15595 }, + { 0x1f240, G_UNICODE_NOT_PRESENT_OFFSET, 15599 }, + { 0x1f241, G_UNICODE_NOT_PRESENT_OFFSET, 15609 }, + { 0x1f242, G_UNICODE_NOT_PRESENT_OFFSET, 15619 }, + { 0x1f243, G_UNICODE_NOT_PRESENT_OFFSET, 15629 }, + { 0x1f244, G_UNICODE_NOT_PRESENT_OFFSET, 15639 }, + { 0x1f245, G_UNICODE_NOT_PRESENT_OFFSET, 15649 }, + { 0x1f246, G_UNICODE_NOT_PRESENT_OFFSET, 15659 }, + { 0x1f247, G_UNICODE_NOT_PRESENT_OFFSET, 15669 }, + { 0x1f248, G_UNICODE_NOT_PRESENT_OFFSET, 15679 }, + { 0x1f250, G_UNICODE_NOT_PRESENT_OFFSET, 15689 }, + { 0x1f251, G_UNICODE_NOT_PRESENT_OFFSET, 15693 }, + { 0x2f800, 15697, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f801, 15701, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f802, 15705, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f803, 15709, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f804, 15714, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f805, 11970, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f806, 15718, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f807, 15722, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f808, 15726, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f809, 15730, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80a, 11974, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80b, 15734, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80c, 15738, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80d, 15742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80e, 11978, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f80f, 15747, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f810, 15751, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f811, 15755, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f812, 15759, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f813, 15764, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f814, 15768, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f815, 15519, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f816, 15772, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f817, 15777, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f818, 15781, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f819, 15785, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81a, 15789, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81b, 12199, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81c, 15793, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81d, 6245, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81e, 15798, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f81f, 15802, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f820, 15806, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f821, 15810, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f822, 15591, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f823, 15814, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f824, 15818, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f825, 12219, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f826, 11982, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f827, 11986, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f828, 12223, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f829, 15822, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82a, 15826, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82b, 11254, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82c, 15830, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82d, 11990, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82e, 15834, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f82f, 15838, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f830, 15842, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f831, 15846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f832, 15846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f833, 15846, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f834, 15850, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f835, 15855, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f836, 15859, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f837, 15863, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f838, 15867, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f839, 15872, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83a, 15876, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83b, 15880, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83c, 15884, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83d, 15888, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83e, 15892, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f83f, 15896, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f840, 15900, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f841, 15904, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f842, 15908, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f843, 15912, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f844, 15916, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f845, 15920, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f846, 15920, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f847, 12231, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f848, 15924, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f849, 15928, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84a, 15932, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84b, 15936, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84c, 11998, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84d, 15940, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84e, 15944, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f84f, 15948, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f850, 11838, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f851, 15952, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f852, 15956, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f853, 15960, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f854, 15964, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f855, 15968, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f856, 15972, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f857, 15976, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f858, 15980, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f859, 15984, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85a, 15989, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85b, 15993, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85c, 15997, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85d, 15491, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85e, 16001, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f85f, 16005, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f860, 16009, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f861, 16014, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f862, 16019, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f863, 16023, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f864, 16027, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f865, 16031, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f866, 16035, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f867, 16039, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f868, 16043, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f869, 16047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86a, 16051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86b, 16051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86c, 16055, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86d, 16060, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86e, 16064, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f86f, 11238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f870, 16068, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f871, 16072, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f872, 16077, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f873, 16081, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f874, 16085, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f875, 6349, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f876, 16089, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f877, 16093, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f878, 6357, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f879, 16097, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87a, 16101, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87b, 16105, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87c, 16110, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87d, 16114, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87e, 16119, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f87f, 16123, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f880, 16127, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f881, 16131, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f882, 16135, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f883, 16139, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f884, 16143, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f885, 16147, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f886, 16151, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f887, 16155, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f888, 16159, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f889, 16163, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88a, 16168, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88b, 16172, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88c, 16176, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88d, 16180, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88e, 11030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f88f, 16184, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f890, 6397, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f891, 16189, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f892, 16189, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f893, 16194, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f894, 16198, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f895, 16198, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f896, 16202, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f897, 16206, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f898, 16211, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f899, 16216, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89a, 16220, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89b, 16224, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89c, 16228, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89d, 16232, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89e, 16236, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f89f, 16240, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a0, 16244, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a1, 16248, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a2, 16252, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a3, 12018, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a4, 16256, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a5, 16261, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a6, 16265, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a7, 16269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a8, 12279, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8a9, 16269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8aa, 16273, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ab, 12026, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ac, 16277, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ad, 16281, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ae, 16285, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8af, 16289, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b0, 12030, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b1, 10922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b2, 16293, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b3, 16297, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b4, 16301, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b5, 16305, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b6, 16309, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b7, 16313, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b8, 16317, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8b9, 16322, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ba, 16326, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bb, 16330, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bc, 16334, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bd, 16338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8be, 16342, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8bf, 16347, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c0, 16351, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c1, 16355, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c2, 16359, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c3, 16363, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c4, 16367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c5, 16371, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c6, 16375, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c7, 16379, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c8, 12034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8c9, 16383, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ca, 16387, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cb, 16392, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cc, 16396, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cd, 16400, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ce, 16404, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8cf, 12042, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d0, 16408, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d1, 16412, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d2, 16416, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d3, 16420, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d4, 16424, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d5, 16428, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d6, 16432, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d7, 16436, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d8, 11034, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8d9, 12311, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8da, 16440, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8db, 16444, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8dc, 16448, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8dd, 16452, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8de, 16457, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8df, 16461, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e0, 16465, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e1, 16469, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e2, 12046, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e3, 16473, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e4, 16478, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e5, 16482, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e6, 16486, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e7, 12482, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e8, 16490, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8e9, 16494, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ea, 16498, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8eb, 16502, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ec, 16506, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ed, 16511, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ee, 16515, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ef, 16519, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f0, 16523, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f1, 16528, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f2, 16532, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f3, 16536, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f4, 16540, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f5, 11306, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f6, 16544, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f7, 16548, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f8, 16553, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8f9, 16558, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fa, 16563, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fb, 16567, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fc, 16572, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fd, 16576, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8fe, 16580, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f8ff, 16584, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f900, 16588, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f901, 12050, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f902, 11638, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f903, 16592, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f904, 16596, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f905, 16600, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f906, 16604, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f907, 16609, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f908, 16613, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f909, 16617, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90a, 16621, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90b, 12323, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90c, 16625, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90d, 16629, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90e, 16634, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f90f, 16638, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f910, 16642, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f911, 16647, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f912, 16652, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f913, 16656, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f914, 12327, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f915, 16660, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f916, 16664, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f917, 16668, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f918, 16672, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f919, 16676, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91a, 16680, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91b, 16684, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91c, 16689, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91d, 16693, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91e, 16698, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f91f, 16702, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f920, 16707, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f921, 12335, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f922, 16711, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f923, 16715, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f924, 16720, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f925, 16724, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f926, 16728, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f927, 16733, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f928, 16738, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f929, 16742, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92a, 16746, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92b, 16750, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92c, 16754, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92d, 16754, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92e, 16758, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f92f, 16762, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f930, 12343, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f931, 16766, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f932, 16770, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f933, 16774, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f934, 16778, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f935, 16782, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f936, 16787, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f937, 16791, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f938, 11250, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f939, 16796, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93a, 16801, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93b, 16805, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93c, 16810, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93d, 16815, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93e, 16820, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f93f, 16824, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f940, 12367, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f941, 16828, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f942, 16833, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f943, 16838, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f944, 16843, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f945, 16848, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f946, 16852, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f947, 16852, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f948, 12371, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f949, 12490, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94a, 16856, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94b, 16860, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94c, 16864, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94d, 16868, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94e, 16873, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f94f, 11102, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f950, 12379, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f951, 16877, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f952, 16881, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f953, 12090, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f954, 16886, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f955, 16891, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f956, 11918, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f957, 16896, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f958, 16900, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f959, 12102, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95a, 16904, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95b, 16908, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95c, 16912, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95d, 16917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95e, 16917, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f95f, 16922, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f960, 16926, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f961, 16930, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f962, 16935, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f963, 16939, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f964, 16943, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f965, 16947, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f966, 16952, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f967, 16956, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f968, 16960, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f969, 16964, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96a, 16968, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96b, 16972, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96c, 16977, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96d, 16981, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96e, 16985, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f96f, 16989, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f970, 16993, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f971, 16997, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f972, 17001, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f973, 17006, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f974, 17011, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f975, 17015, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f976, 17020, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f977, 17024, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f978, 17029, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f979, 17033, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97a, 12126, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97b, 17037, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97c, 17042, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97d, 17047, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97e, 17051, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f97f, 17056, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f980, 17060, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f981, 17065, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f982, 17069, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f983, 17073, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f984, 17077, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f985, 17081, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f986, 17085, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f987, 17089, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f988, 17094, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f989, 17099, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98a, 17104, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98b, 16194, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98c, 17109, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98d, 17113, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98e, 17117, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f98f, 17121, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f990, 17125, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f991, 17129, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f992, 17133, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f993, 17137, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f994, 17141, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f995, 17145, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f996, 17149, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f997, 17153, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f998, 11318, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f999, 17158, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99a, 17162, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99b, 17166, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99c, 17170, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99d, 17174, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99e, 17178, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f99f, 12138, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a0, 17182, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a1, 17186, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a2, 17190, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a3, 17194, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a4, 17198, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a5, 17203, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a6, 17208, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a7, 17213, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a8, 17217, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9a9, 17221, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9aa, 17225, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ab, 17229, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ac, 17234, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ad, 17238, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ae, 17243, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9af, 17247, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b0, 17251, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b1, 17256, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b2, 17261, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b3, 17265, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b4, 11082, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b5, 17269, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b6, 17273, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b7, 17277, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b8, 17281, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9b9, 17285, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ba, 17289, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bb, 12407, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bc, 17293, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bd, 17297, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9be, 17301, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9bf, 17305, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c0, 17309, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c1, 17313, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c2, 17317, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c3, 17321, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c4, 6757, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c5, 17325, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c6, 17330, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c7, 17334, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c8, 17338, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9c9, 17342, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ca, 17346, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cb, 17350, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cc, 17355, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cd, 17360, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ce, 17364, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9cf, 17368, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d0, 12427, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d1, 12431, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d2, 6785, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d3, 17372, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d4, 17377, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d5, 17381, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d6, 17385, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d7, 17389, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d8, 17393, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9d9, 17398, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9da, 17403, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9db, 17407, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9dc, 17411, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9dd, 17415, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9de, 17420, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9df, 12435, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e0, 17424, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e1, 17429, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e2, 17434, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e3, 17438, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e4, 17442, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e5, 17446, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e6, 17451, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e7, 17455, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e8, 17459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9e9, 17463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ea, 17467, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9eb, 17471, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ec, 17475, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ed, 17479, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ee, 17484, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ef, 17488, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f0, 17492, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f1, 17496, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f2, 17501, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f3, 17505, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f4, 17509, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f5, 17513, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f6, 17517, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f7, 17522, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f8, 17527, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9f9, 17531, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fa, 17535, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fb, 17539, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fc, 17544, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fd, 17548, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9fe, 12459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2f9ff, 12459, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa00, 17553, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa01, 17557, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa02, 17562, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa03, 17566, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa04, 17570, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa05, 17574, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa06, 17578, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa07, 17582, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa08, 17586, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa09, 17590, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0a, 12463, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0b, 17595, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0c, 17599, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0d, 17603, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0e, 17607, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa0f, 17611, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa10, 17615, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa11, 17620, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa12, 17624, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa13, 17629, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa14, 17634, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa15, 6977, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa16, 17639, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa17, 6993, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa18, 17643, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa19, 17647, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1a, 17651, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1b, 17655, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1c, 7013, G_UNICODE_NOT_PRESENT_OFFSET }, + { 0x2fa1d, 17659, 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\x37\0" /* offset 5364 */ + "\x31\xe2\x81\x84\x39\0" /* offset 5370 */ + "\x31\xe2\x81\x84\x31\x30\0" /* offset 5376 */ + "\x31\xe2\x81\x84\x33\0" /* offset 5383 */ + "\x32\xe2\x81\x84\x33\0" /* offset 5389 */ + "\x31\xe2\x81\x84\x35\0" /* offset 5395 */ + "\x32\xe2\x81\x84\x35\0" /* offset 5401 */ + "\x33\xe2\x81\x84\x35\0" /* offset 5407 */ + "\x34\xe2\x81\x84\x35\0" /* offset 5413 */ + "\x31\xe2\x81\x84\x36\0" /* offset 5419 */ + "\x35\xe2\x81\x84\x36\0" /* offset 5425 */ + "\x31\xe2\x81\x84\x38\0" /* offset 5431 */ + "\x33\xe2\x81\x84\x38\0" /* offset 5437 */ + "\x35\xe2\x81\x84\x38\0" /* offset 5443 */ + "\x37\xe2\x81\x84\x38\0" /* offset 5449 */ + "\x31\xe2\x81\x84\0" /* offset 5455 */ + "\x49\x49\0" /* offset 5460 */ + "\x49\x49\x49\0" /* offset 5463 */ + "\x49\x56\0" /* offset 5467 */ + "\x56\0" /* offset 5470 */ + "\x56\x49\0" /* offset 5472 */ + "\x56\x49\x49\0" /* offset 5475 */ + "\x56\x49\x49\x49\0" /* offset 5479 */ + "\x49\x58\0" /* offset 5484 */ + "\x58\0" /* offset 5487 */ + "\x58\x49\0" /* offset 5489 */ + "\x58\x49\x49\0" /* offset 5492 */ + "\x69\x69\0" /* offset 5496 */ + "\x69\x69\x69\0" /* offset 5499 */ + "\x69\x76\0" /* offset 5503 */ + "\x76\x69\0" /* offset 5506 */ + "\x76\x69\x69\0" /* offset 5509 */ + "\x76\x69\x69\x69\0" /* offset 5513 */ + "\x69\x78\0" /* offset 5518 */ + "\x78\x69\0" /* offset 5521 */ + "\x78\x69\x69\0" /* offset 5524 */ + "\x30\xe2\x81\x84\x33\0" /* offset 5528 */ + "\xe2\x86\x90\xcc\xb8\0" /* offset 5534 */ + "\xe2\x86\x92\xcc\xb8\0" /* offset 5540 */ + "\xe2\x86\x94\xcc\xb8\0" /* offset 5546 */ + "\xe2\x87\x90\xcc\xb8\0" /* offset 5552 */ + "\xe2\x87\x94\xcc\xb8\0" /* offset 5558 */ + "\xe2\x87\x92\xcc\xb8\0" /* offset 5564 */ + "\xe2\x88\x83\xcc\xb8\0" /* offset 5570 */ + "\xe2\x88\x88\xcc\xb8\0" /* offset 5576 */ + "\xe2\x88\x8b\xcc\xb8\0" /* offset 5582 */ + "\xe2\x88\xa3\xcc\xb8\0" /* offset 5588 */ + "\xe2\x88\xa5\xcc\xb8\0" /* offset 5594 */ + "\xe2\x88\xab\xe2\x88\xab\0" /* offset 5600 */ + "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 5607 */ + "\xe2\x88\xae\xe2\x88\xae\0" /* offset 5617 */ + "\xe2\x88\xae\xe2\x88\xae\xe2\x88\xae\0" /* offset 5624 */ + "\xe2\x88\xbc\xcc\xb8\0" /* offset 5634 */ + "\xe2\x89\x83\xcc\xb8\0" /* offset 5640 */ + "\xe2\x89\x85\xcc\xb8\0" /* offset 5646 */ + "\xe2\x89\x88\xcc\xb8\0" /* offset 5652 */ + "\x3d\xcc\xb8\0" /* offset 5658 */ + "\xe2\x89\xa1\xcc\xb8\0" /* offset 5662 */ + "\xe2\x89\x8d\xcc\xb8\0" /* offset 5668 */ + "\x3c\xcc\xb8\0" /* offset 5674 */ + "\x3e\xcc\xb8\0" /* offset 5678 */ + "\xe2\x89\xa4\xcc\xb8\0" /* offset 5682 */ + "\xe2\x89\xa5\xcc\xb8\0" /* offset 5688 */ + "\xe2\x89\xb2\xcc\xb8\0" /* offset 5694 */ + "\xe2\x89\xb3\xcc\xb8\0" /* offset 5700 */ + "\xe2\x89\xb6\xcc\xb8\0" /* offset 5706 */ + "\xe2\x89\xb7\xcc\xb8\0" /* offset 5712 */ + "\xe2\x89\xba\xcc\xb8\0" /* offset 5718 */ + "\xe2\x89\xbb\xcc\xb8\0" /* offset 5724 */ + "\xe2\x8a\x82\xcc\xb8\0" /* offset 5730 */ + "\xe2\x8a\x83\xcc\xb8\0" /* offset 5736 */ + "\xe2\x8a\x86\xcc\xb8\0" /* offset 5742 */ + "\xe2\x8a\x87\xcc\xb8\0" /* offset 5748 */ + "\xe2\x8a\xa2\xcc\xb8\0" /* offset 5754 */ + "\xe2\x8a\xa8\xcc\xb8\0" /* offset 5760 */ + "\xe2\x8a\xa9\xcc\xb8\0" /* offset 5766 */ + "\xe2\x8a\xab\xcc\xb8\0" /* offset 5772 */ + "\xe2\x89\xbc\xcc\xb8\0" /* offset 5778 */ + "\xe2\x89\xbd\xcc\xb8\0" /* offset 5784 */ + "\xe2\x8a\x91\xcc\xb8\0" /* offset 5790 */ + "\xe2\x8a\x92\xcc\xb8\0" /* offset 5796 */ + "\xe2\x8a\xb2\xcc\xb8\0" /* offset 5802 */ + "\xe2\x8a\xb3\xcc\xb8\0" /* offset 5808 */ + "\xe2\x8a\xb4\xcc\xb8\0" /* offset 5814 */ + "\xe2\x8a\xb5\xcc\xb8\0" /* offset 5820 */ + "\xe3\x80\x88\0" /* offset 5826 */ + "\xe3\x80\x89\0" /* offset 5830 */ + "\x31\x30\0" /* offset 5834 */ + "\x31\x31\0" /* offset 5837 */ + "\x31\x32\0" /* offset 5840 */ + "\x31\x33\0" /* offset 5843 */ + "\x31\x34\0" /* offset 5846 */ + "\x31\x35\0" /* offset 5849 */ + "\x31\x36\0" /* offset 5852 */ + "\x31\x37\0" /* offset 5855 */ + "\x31\x38\0" /* offset 5858 */ + "\x31\x39\0" /* offset 5861 */ + "\x32\x30\0" /* offset 5864 */ + "\x28\x31\x29\0" /* offset 5867 */ + "\x28\x32\x29\0" /* offset 5871 */ + "\x28\x33\x29\0" /* offset 5875 */ + "\x28\x34\x29\0" /* offset 5879 */ + "\x28\x35\x29\0" /* offset 5883 */ + "\x28\x36\x29\0" /* offset 5887 */ + "\x28\x37\x29\0" /* offset 5891 */ + "\x28\x38\x29\0" /* offset 5895 */ + "\x28\x39\x29\0" /* offset 5899 */ + "\x28\x31\x30\x29\0" /* offset 5903 */ + "\x28\x31\x31\x29\0" /* offset 5908 */ + "\x28\x31\x32\x29\0" /* offset 5913 */ + "\x28\x31\x33\x29\0" /* offset 5918 */ + "\x28\x31\x34\x29\0" /* offset 5923 */ + "\x28\x31\x35\x29\0" /* offset 5928 */ + "\x28\x31\x36\x29\0" /* offset 5933 */ + "\x28\x31\x37\x29\0" /* offset 5938 */ + "\x28\x31\x38\x29\0" /* offset 5943 */ + "\x28\x31\x39\x29\0" /* offset 5948 */ + "\x28\x32\x30\x29\0" /* offset 5953 */ + "\x31\x2e\0" /* offset 5958 */ + "\x32\x2e\0" /* offset 5961 */ + "\x33\x2e\0" /* offset 5964 */ + "\x34\x2e\0" /* offset 5967 */ + "\x35\x2e\0" /* offset 5970 */ + "\x36\x2e\0" /* offset 5973 */ + "\x37\x2e\0" /* offset 5976 */ + "\x38\x2e\0" /* offset 5979 */ + "\x39\x2e\0" /* offset 5982 */ + "\x31\x30\x2e\0" /* offset 5985 */ + "\x31\x31\x2e\0" /* offset 5989 */ + "\x31\x32\x2e\0" /* offset 5993 */ + "\x31\x33\x2e\0" /* offset 5997 */ + "\x31\x34\x2e\0" /* offset 6001 */ + "\x31\x35\x2e\0" /* offset 6005 */ + "\x31\x36\x2e\0" /* offset 6009 */ + "\x31\x37\x2e\0" /* offset 6013 */ + "\x31\x38\x2e\0" /* offset 6017 */ + "\x31\x39\x2e\0" /* offset 6021 */ + "\x32\x30\x2e\0" /* offset 6025 */ + "\x28\x61\x29\0" /* offset 6029 */ + "\x28\x62\x29\0" /* offset 6033 */ + "\x28\x63\x29\0" /* offset 6037 */ + "\x28\x64\x29\0" /* offset 6041 */ + "\x28\x65\x29\0" /* offset 6045 */ + "\x28\x66\x29\0" /* offset 6049 */ + "\x28\x67\x29\0" /* offset 6053 */ + "\x28\x68\x29\0" /* offset 6057 */ + "\x28\x69\x29\0" /* offset 6061 */ + "\x28\x6a\x29\0" /* offset 6065 */ + "\x28\x6b\x29\0" /* offset 6069 */ + "\x28\x6c\x29\0" /* offset 6073 */ + "\x28\x6d\x29\0" /* offset 6077 */ + "\x28\x6e\x29\0" /* offset 6081 */ + "\x28\x6f\x29\0" /* offset 6085 */ + "\x28\x70\x29\0" /* offset 6089 */ + "\x28\x71\x29\0" /* offset 6093 */ + "\x28\x72\x29\0" /* offset 6097 */ + "\x28\x73\x29\0" /* offset 6101 */ + "\x28\x74\x29\0" /* offset 6105 */ + "\x28\x75\x29\0" /* offset 6109 */ + "\x28\x76\x29\0" /* offset 6113 */ + "\x28\x77\x29\0" /* offset 6117 */ + "\x28\x78\x29\0" /* offset 6121 */ + "\x28\x79\x29\0" /* offset 6125 */ + "\x28\x7a\x29\0" /* offset 6129 */ + "\x53\0" /* offset 6133 */ + "\x59\0" /* offset 6135 */ + "\x71\0" /* offset 6137 */ + "\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\xe2\x88\xab\0" /* offset 6139 */ + "\x3a\x3a\x3d\0" /* offset 6152 */ + "\x3d\x3d\0" /* offset 6156 */ + "\x3d\x3d\x3d\0" /* offset 6159 */ + "\xe2\xab\x9d\xcc\xb8\0" /* offset 6163 */ + "\xe2\xb5\xa1\0" /* offset 6169 */ + "\xe6\xaf\x8d\0" /* offset 6173 */ + "\xe9\xbe\x9f\0" /* offset 6177 */ + "\xe4\xb8\x80\0" /* offset 6181 */ + "\xe4\xb8\xa8\0" /* offset 6185 */ + "\xe4\xb8\xb6\0" /* offset 6189 */ + "\xe4\xb8\xbf\0" /* offset 6193 */ + "\xe4\xb9\x99\0" /* offset 6197 */ + "\xe4\xba\x85\0" /* offset 6201 */ + "\xe4\xba\x8c\0" /* offset 6205 */ + "\xe4\xba\xa0\0" /* offset 6209 */ + "\xe4\xba\xba\0" /* offset 6213 */ + "\xe5\x84\xbf\0" /* offset 6217 */ + "\xe5\x85\xa5\0" /* offset 6221 */ + "\xe5\x85\xab\0" /* offset 6225 */ + "\xe5\x86\x82\0" /* offset 6229 */ + "\xe5\x86\x96\0" /* offset 6233 */ + "\xe5\x86\xab\0" /* offset 6237 */ + "\xe5\x87\xa0\0" /* offset 6241 */ + "\xe5\x87\xb5\0" /* offset 6245 */ + "\xe5\x88\x80\0" /* offset 6249 */ + "\xe5\x8a\x9b\0" /* offset 6253 */ + "\xe5\x8b\xb9\0" /* offset 6257 */ + "\xe5\x8c\x95\0" /* offset 6261 */ + "\xe5\x8c\x9a\0" /* offset 6265 */ + "\xe5\x8c\xb8\0" /* offset 6269 */ + "\xe5\x8d\x81\0" /* offset 6273 */ + "\xe5\x8d\x9c\0" /* offset 6277 */ + "\xe5\x8d\xa9\0" /* offset 6281 */ + "\xe5\x8e\x82\0" /* offset 6285 */ + "\xe5\x8e\xb6\0" /* offset 6289 */ + "\xe5\x8f\x88\0" /* offset 6293 */ + "\xe5\x8f\xa3\0" /* offset 6297 */ + "\xe5\x9b\x97\0" /* offset 6301 */ + "\xe5\x9c\x9f\0" /* offset 6305 */ + "\xe5\xa3\xab\0" /* offset 6309 */ + "\xe5\xa4\x82\0" /* offset 6313 */ + "\xe5\xa4\x8a\0" /* offset 6317 */ + "\xe5\xa4\x95\0" /* offset 6321 */ + "\xe5\xa4\xa7\0" /* offset 6325 */ + "\xe5\xa5\xb3\0" /* offset 6329 */ + "\xe5\xad\x90\0" /* offset 6333 */ + "\xe5\xae\x80\0" /* offset 6337 */ + "\xe5\xaf\xb8\0" /* offset 6341 */ + "\xe5\xb0\x8f\0" /* offset 6345 */ + "\xe5\xb0\xa2\0" /* offset 6349 */ + "\xe5\xb0\xb8\0" /* offset 6353 */ + "\xe5\xb1\xae\0" /* offset 6357 */ + "\xe5\xb1\xb1\0" /* offset 6361 */ + "\xe5\xb7\x9b\0" /* offset 6365 */ + "\xe5\xb7\xa5\0" /* offset 6369 */ + "\xe5\xb7\xb1\0" /* offset 6373 */ + "\xe5\xb7\xbe\0" /* offset 6377 */ + "\xe5\xb9\xb2\0" /* offset 6381 */ + "\xe5\xb9\xba\0" /* offset 6385 */ + "\xe5\xb9\xbf\0" /* offset 6389 */ + "\xe5\xbb\xb4\0" /* offset 6393 */ + "\xe5\xbb\xbe\0" /* offset 6397 */ + "\xe5\xbc\x8b\0" /* offset 6401 */ + "\xe5\xbc\x93\0" /* offset 6405 */ + "\xe5\xbd\x90\0" /* offset 6409 */ + "\xe5\xbd\xa1\0" /* offset 6413 */ + "\xe5\xbd\xb3\0" /* offset 6417 */ + "\xe5\xbf\x83\0" /* offset 6421 */ + "\xe6\x88\x88\0" /* offset 6425 */ + "\xe6\x88\xb6\0" /* offset 6429 */ + "\xe6\x89\x8b\0" /* offset 6433 */ + "\xe6\x94\xaf\0" /* offset 6437 */ + "\xe6\x94\xb4\0" /* offset 6441 */ + "\xe6\x96\x87\0" /* offset 6445 */ + "\xe6\x96\x97\0" /* offset 6449 */ + "\xe6\x96\xa4\0" /* offset 6453 */ + "\xe6\x96\xb9\0" /* offset 6457 */ + "\xe6\x97\xa0\0" /* offset 6461 */ + "\xe6\x97\xa5\0" /* offset 6465 */ + "\xe6\x9b\xb0\0" /* offset 6469 */ + "\xe6\x9c\x88\0" /* offset 6473 */ + "\xe6\x9c\xa8\0" /* offset 6477 */ + "\xe6\xac\xa0\0" /* offset 6481 */ + "\xe6\xad\xa2\0" /* offset 6485 */ + "\xe6\xad\xb9\0" /* offset 6489 */ + "\xe6\xae\xb3\0" /* offset 6493 */ + "\xe6\xaf\x8b\0" /* offset 6497 */ + "\xe6\xaf\x94\0" /* offset 6501 */ + "\xe6\xaf\x9b\0" /* offset 6505 */ + "\xe6\xb0\x8f\0" /* offset 6509 */ + "\xe6\xb0\x94\0" /* offset 6513 */ + "\xe6\xb0\xb4\0" /* offset 6517 */ + "\xe7\x81\xab\0" /* offset 6521 */ + "\xe7\x88\xaa\0" /* offset 6525 */ + "\xe7\x88\xb6\0" /* offset 6529 */ + "\xe7\x88\xbb\0" /* offset 6533 */ + "\xe7\x88\xbf\0" /* offset 6537 */ + "\xe7\x89\x87\0" /* offset 6541 */ + "\xe7\x89\x99\0" /* offset 6545 */ + "\xe7\x89\x9b\0" /* offset 6549 */ + "\xe7\x8a\xac\0" /* offset 6553 */ + "\xe7\x8e\x84\0" /* offset 6557 */ + "\xe7\x8e\x89\0" /* offset 6561 */ + "\xe7\x93\x9c\0" /* offset 6565 */ + "\xe7\x93\xa6\0" /* offset 6569 */ + "\xe7\x94\x98\0" /* offset 6573 */ + "\xe7\x94\x9f\0" /* offset 6577 */ + "\xe7\x94\xa8\0" /* offset 6581 */ + "\xe7\x94\xb0\0" /* offset 6585 */ + "\xe7\x96\x8b\0" /* offset 6589 */ + "\xe7\x96\x92\0" /* offset 6593 */ + "\xe7\x99\xb6\0" /* offset 6597 */ + "\xe7\x99\xbd\0" /* offset 6601 */ + "\xe7\x9a\xae\0" /* offset 6605 */ + "\xe7\x9a\xbf\0" /* offset 6609 */ + "\xe7\x9b\xae\0" /* offset 6613 */ + "\xe7\x9f\x9b\0" /* offset 6617 */ + "\xe7\x9f\xa2\0" /* offset 6621 */ + "\xe7\x9f\xb3\0" /* offset 6625 */ + "\xe7\xa4\xba\0" /* offset 6629 */ + "\xe7\xa6\xb8\0" /* offset 6633 */ + "\xe7\xa6\xbe\0" /* offset 6637 */ + "\xe7\xa9\xb4\0" /* offset 6641 */ + "\xe7\xab\x8b\0" /* offset 6645 */ + "\xe7\xab\xb9\0" /* offset 6649 */ + "\xe7\xb1\xb3\0" /* offset 6653 */ + "\xe7\xb3\xb8\0" /* offset 6657 */ + "\xe7\xbc\xb6\0" /* offset 6661 */ + "\xe7\xbd\x91\0" /* offset 6665 */ + "\xe7\xbe\x8a\0" /* offset 6669 */ + "\xe7\xbe\xbd\0" /* offset 6673 */ + "\xe8\x80\x81\0" /* offset 6677 */ + "\xe8\x80\x8c\0" /* offset 6681 */ + "\xe8\x80\x92\0" /* offset 6685 */ + "\xe8\x80\xb3\0" /* offset 6689 */ + "\xe8\x81\xbf\0" /* offset 6693 */ + "\xe8\x82\x89\0" /* offset 6697 */ + "\xe8\x87\xa3\0" /* offset 6701 */ + "\xe8\x87\xaa\0" /* offset 6705 */ + "\xe8\x87\xb3\0" /* offset 6709 */ + "\xe8\x87\xbc\0" /* offset 6713 */ + "\xe8\x88\x8c\0" /* offset 6717 */ + "\xe8\x88\x9b\0" /* offset 6721 */ + "\xe8\x88\x9f\0" /* offset 6725 */ + "\xe8\x89\xae\0" /* offset 6729 */ + "\xe8\x89\xb2\0" /* offset 6733 */ + "\xe8\x89\xb8\0" /* offset 6737 */ + "\xe8\x99\x8d\0" /* offset 6741 */ + "\xe8\x99\xab\0" /* offset 6745 */ + "\xe8\xa1\x80\0" /* offset 6749 */ + "\xe8\xa1\x8c\0" /* offset 6753 */ + "\xe8\xa1\xa3\0" /* offset 6757 */ + "\xe8\xa5\xbe\0" /* offset 6761 */ + "\xe8\xa6\x8b\0" /* offset 6765 */ + "\xe8\xa7\x92\0" /* offset 6769 */ + "\xe8\xa8\x80\0" /* offset 6773 */ + "\xe8\xb0\xb7\0" /* offset 6777 */ + "\xe8\xb1\x86\0" /* offset 6781 */ + "\xe8\xb1\x95\0" /* offset 6785 */ + "\xe8\xb1\xb8\0" /* offset 6789 */ + "\xe8\xb2\x9d\0" /* offset 6793 */ + "\xe8\xb5\xa4\0" /* offset 6797 */ + "\xe8\xb5\xb0\0" /* offset 6801 */ + "\xe8\xb6\xb3\0" /* offset 6805 */ + "\xe8\xba\xab\0" /* offset 6809 */ + "\xe8\xbb\x8a\0" /* offset 6813 */ + "\xe8\xbe\x9b\0" /* offset 6817 */ + "\xe8\xbe\xb0\0" /* offset 6821 */ + "\xe8\xbe\xb5\0" /* offset 6825 */ + "\xe9\x82\x91\0" /* offset 6829 */ + "\xe9\x85\x89\0" /* offset 6833 */ + "\xe9\x87\x86\0" /* offset 6837 */ + "\xe9\x87\x8c\0" /* offset 6841 */ + "\xe9\x87\x91\0" /* offset 6845 */ + "\xe9\x95\xb7\0" /* offset 6849 */ + "\xe9\x96\x80\0" /* offset 6853 */ + "\xe9\x98\x9c\0" /* offset 6857 */ + "\xe9\x9a\xb6\0" /* offset 6861 */ + "\xe9\x9a\xb9\0" /* offset 6865 */ + "\xe9\x9b\xa8\0" /* offset 6869 */ + "\xe9\x9d\x91\0" /* offset 6873 */ + "\xe9\x9d\x9e\0" /* offset 6877 */ + "\xe9\x9d\xa2\0" /* offset 6881 */ + "\xe9\x9d\xa9\0" /* offset 6885 */ + "\xe9\x9f\x8b\0" /* offset 6889 */ + "\xe9\x9f\xad\0" /* offset 6893 */ + "\xe9\x9f\xb3\0" /* offset 6897 */ + "\xe9\xa0\x81\0" /* offset 6901 */ + "\xe9\xa2\xa8\0" /* offset 6905 */ + "\xe9\xa3\x9b\0" /* offset 6909 */ + "\xe9\xa3\x9f\0" /* offset 6913 */ + "\xe9\xa6\x96\0" /* offset 6917 */ + "\xe9\xa6\x99\0" /* offset 6921 */ + "\xe9\xa6\xac\0" /* offset 6925 */ + "\xe9\xaa\xa8\0" /* offset 6929 */ + "\xe9\xab\x98\0" /* offset 6933 */ + "\xe9\xab\x9f\0" /* offset 6937 */ + "\xe9\xac\xa5\0" /* offset 6941 */ + "\xe9\xac\xaf\0" /* offset 6945 */ + "\xe9\xac\xb2\0" /* offset 6949 */ + "\xe9\xac\xbc\0" /* offset 6953 */ + "\xe9\xad\x9a\0" /* offset 6957 */ + "\xe9\xb3\xa5\0" /* offset 6961 */ + "\xe9\xb9\xb5\0" /* offset 6965 */ + "\xe9\xb9\xbf\0" /* offset 6969 */ + "\xe9\xba\xa5\0" /* offset 6973 */ + "\xe9\xba\xbb\0" /* offset 6977 */ + "\xe9\xbb\x83\0" /* offset 6981 */ + "\xe9\xbb\x8d\0" /* offset 6985 */ + "\xe9\xbb\x91\0" /* offset 6989 */ + "\xe9\xbb\xb9\0" /* offset 6993 */ + "\xe9\xbb\xbd\0" /* offset 6997 */ + "\xe9\xbc\x8e\0" /* offset 7001 */ + "\xe9\xbc\x93\0" /* offset 7005 */ + "\xe9\xbc\xa0\0" /* offset 7009 */ + "\xe9\xbc\xbb\0" /* offset 7013 */ + "\xe9\xbd\x8a\0" /* offset 7017 */ + "\xe9\xbd\x92\0" /* offset 7021 */ + "\xe9\xbe\x8d\0" /* offset 7025 */ + "\xe9\xbe\x9c\0" /* offset 7029 */ + "\xe9\xbe\xa0\0" /* offset 7033 */ + "\xe3\x80\x92\0" /* offset 7037 */ + "\xe5\x8d\x84\0" /* offset 7041 */ + "\xe5\x8d\x85\0" /* offset 7045 */ + "\xe3\x81\x8b\xe3\x82\x99\0" /* offset 7049 */ + "\xe3\x81\x8d\xe3\x82\x99\0" /* offset 7056 */ + "\xe3\x81\x8f\xe3\x82\x99\0" /* offset 7063 */ + "\xe3\x81\x91\xe3\x82\x99\0" /* offset 7070 */ + "\xe3\x81\x93\xe3\x82\x99\0" /* offset 7077 */ + "\xe3\x81\x95\xe3\x82\x99\0" /* offset 7084 */ + "\xe3\x81\x97\xe3\x82\x99\0" /* offset 7091 */ + "\xe3\x81\x99\xe3\x82\x99\0" /* offset 7098 */ + "\xe3\x81\x9b\xe3\x82\x99\0" /* offset 7105 */ + "\xe3\x81\x9d\xe3\x82\x99\0" /* offset 7112 */ + "\xe3\x81\x9f\xe3\x82\x99\0" /* offset 7119 */ + "\xe3\x81\xa1\xe3\x82\x99\0" /* offset 7126 */ + "\xe3\x81\xa4\xe3\x82\x99\0" /* offset 7133 */ + "\xe3\x81\xa6\xe3\x82\x99\0" /* offset 7140 */ + "\xe3\x81\xa8\xe3\x82\x99\0" /* offset 7147 */ + "\xe3\x81\xaf\xe3\x82\x99\0" /* offset 7154 */ + "\xe3\x81\xaf\xe3\x82\x9a\0" /* offset 7161 */ + "\xe3\x81\xb2\xe3\x82\x99\0" /* offset 7168 */ + "\xe3\x81\xb2\xe3\x82\x9a\0" /* offset 7175 */ + "\xe3\x81\xb5\xe3\x82\x99\0" /* offset 7182 */ + "\xe3\x81\xb5\xe3\x82\x9a\0" /* offset 7189 */ + "\xe3\x81\xb8\xe3\x82\x99\0" /* offset 7196 */ + "\xe3\x81\xb8\xe3\x82\x9a\0" /* offset 7203 */ + "\xe3\x81\xbb\xe3\x82\x99\0" /* offset 7210 */ + "\xe3\x81\xbb\xe3\x82\x9a\0" /* offset 7217 */ + "\xe3\x81\x86\xe3\x82\x99\0" /* offset 7224 */ + "\x20\xe3\x82\x99\0" /* offset 7231 */ + "\x20\xe3\x82\x9a\0" /* offset 7236 */ + "\xe3\x82\x9d\xe3\x82\x99\0" /* offset 7241 */ + "\xe3\x82\x88\xe3\x82\x8a\0" /* offset 7248 */ + "\xe3\x82\xab\xe3\x82\x99\0" /* offset 7255 */ + "\xe3\x82\xad\xe3\x82\x99\0" /* offset 7262 */ + "\xe3\x82\xaf\xe3\x82\x99\0" /* offset 7269 */ + "\xe3\x82\xb1\xe3\x82\x99\0" /* offset 7276 */ + "\xe3\x82\xb3\xe3\x82\x99\0" /* offset 7283 */ + "\xe3\x82\xb5\xe3\x82\x99\0" /* offset 7290 */ + "\xe3\x82\xb7\xe3\x82\x99\0" /* offset 7297 */ + "\xe3\x82\xb9\xe3\x82\x99\0" /* offset 7304 */ + "\xe3\x82\xbb\xe3\x82\x99\0" /* offset 7311 */ + "\xe3\x82\xbd\xe3\x82\x99\0" /* offset 7318 */ + "\xe3\x82\xbf\xe3\x82\x99\0" /* offset 7325 */ + "\xe3\x83\x81\xe3\x82\x99\0" /* offset 7332 */ + "\xe3\x83\x84\xe3\x82\x99\0" /* offset 7339 */ + "\xe3\x83\x86\xe3\x82\x99\0" /* offset 7346 */ + "\xe3\x83\x88\xe3\x82\x99\0" /* offset 7353 */ + "\xe3\x83\x8f\xe3\x82\x99\0" /* offset 7360 */ + "\xe3\x83\x8f\xe3\x82\x9a\0" /* offset 7367 */ + "\xe3\x83\x92\xe3\x82\x99\0" /* offset 7374 */ + "\xe3\x83\x92\xe3\x82\x9a\0" /* offset 7381 */ + "\xe3\x83\x95\xe3\x82\x99\0" /* offset 7388 */ + "\xe3\x83\x95\xe3\x82\x9a\0" /* offset 7395 */ + "\xe3\x83\x98\xe3\x82\x99\0" /* offset 7402 */ + "\xe3\x83\x98\xe3\x82\x9a\0" /* offset 7409 */ + "\xe3\x83\x9b\xe3\x82\x99\0" /* offset 7416 */ + "\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 7423 */ + "\xe3\x82\xa6\xe3\x82\x99\0" /* offset 7430 */ + "\xe3\x83\xaf\xe3\x82\x99\0" /* offset 7437 */ + "\xe3\x83\xb0\xe3\x82\x99\0" /* offset 7444 */ + "\xe3\x83\xb1\xe3\x82\x99\0" /* offset 7451 */ + "\xe3\x83\xb2\xe3\x82\x99\0" /* offset 7458 */ + "\xe3\x83\xbd\xe3\x82\x99\0" /* offset 7465 */ + "\xe3\x82\xb3\xe3\x83\x88\0" /* offset 7472 */ + "\xe1\x84\x80\0" /* offset 7479 */ + "\xe1\x84\x81\0" /* offset 7483 */ + "\xe1\x86\xaa\0" /* offset 7487 */ + "\xe1\x84\x82\0" /* offset 7491 */ + "\xe1\x86\xac\0" /* offset 7495 */ + "\xe1\x86\xad\0" /* offset 7499 */ + "\xe1\x84\x83\0" /* offset 7503 */ + "\xe1\x84\x84\0" /* offset 7507 */ + "\xe1\x84\x85\0" /* offset 7511 */ + "\xe1\x86\xb0\0" /* offset 7515 */ + "\xe1\x86\xb1\0" /* offset 7519 */ + "\xe1\x86\xb2\0" /* offset 7523 */ + "\xe1\x86\xb3\0" /* offset 7527 */ + "\xe1\x86\xb4\0" /* offset 7531 */ + "\xe1\x86\xb5\0" /* offset 7535 */ + "\xe1\x84\x9a\0" /* offset 7539 */ + "\xe1\x84\x86\0" /* offset 7543 */ + "\xe1\x84\x87\0" /* offset 7547 */ + "\xe1\x84\x88\0" /* offset 7551 */ + "\xe1\x84\xa1\0" /* offset 7555 */ + "\xe1\x84\x89\0" /* offset 7559 */ + "\xe1\x84\x8a\0" /* offset 7563 */ + "\xe1\x84\x8b\0" /* offset 7567 */ + "\xe1\x84\x8c\0" /* offset 7571 */ + "\xe1\x84\x8d\0" /* offset 7575 */ + "\xe1\x84\x8e\0" /* offset 7579 */ + "\xe1\x84\x8f\0" /* offset 7583 */ + "\xe1\x84\x90\0" /* offset 7587 */ + "\xe1\x84\x91\0" /* offset 7591 */ + "\xe1\x84\x92\0" /* offset 7595 */ + "\xe1\x85\xa1\0" /* offset 7599 */ + "\xe1\x85\xa2\0" /* offset 7603 */ + "\xe1\x85\xa3\0" /* offset 7607 */ + "\xe1\x85\xa4\0" /* offset 7611 */ + "\xe1\x85\xa5\0" /* offset 7615 */ + "\xe1\x85\xa6\0" /* offset 7619 */ + "\xe1\x85\xa7\0" /* offset 7623 */ + "\xe1\x85\xa8\0" /* offset 7627 */ + "\xe1\x85\xa9\0" /* offset 7631 */ + "\xe1\x85\xaa\0" /* offset 7635 */ + "\xe1\x85\xab\0" /* offset 7639 */ + "\xe1\x85\xac\0" /* offset 7643 */ + "\xe1\x85\xad\0" /* offset 7647 */ + "\xe1\x85\xae\0" /* offset 7651 */ + "\xe1\x85\xaf\0" /* offset 7655 */ + "\xe1\x85\xb0\0" /* offset 7659 */ + "\xe1\x85\xb1\0" /* offset 7663 */ + "\xe1\x85\xb2\0" /* offset 7667 */ + "\xe1\x85\xb3\0" /* offset 7671 */ + "\xe1\x85\xb4\0" /* offset 7675 */ + "\xe1\x85\xb5\0" /* offset 7679 */ + "\xe1\x85\xa0\0" /* offset 7683 */ + "\xe1\x84\x94\0" /* offset 7687 */ + "\xe1\x84\x95\0" /* offset 7691 */ + "\xe1\x87\x87\0" /* offset 7695 */ + "\xe1\x87\x88\0" /* offset 7699 */ + "\xe1\x87\x8c\0" /* offset 7703 */ + "\xe1\x87\x8e\0" /* offset 7707 */ + "\xe1\x87\x93\0" /* offset 7711 */ + "\xe1\x87\x97\0" /* offset 7715 */ + "\xe1\x87\x99\0" /* offset 7719 */ + "\xe1\x84\x9c\0" /* offset 7723 */ + "\xe1\x87\x9d\0" /* offset 7727 */ + "\xe1\x87\x9f\0" /* offset 7731 */ + "\xe1\x84\x9d\0" /* offset 7735 */ + "\xe1\x84\x9e\0" /* offset 7739 */ + "\xe1\x84\xa0\0" /* offset 7743 */ + "\xe1\x84\xa2\0" /* offset 7747 */ + "\xe1\x84\xa3\0" /* offset 7751 */ + "\xe1\x84\xa7\0" /* offset 7755 */ + "\xe1\x84\xa9\0" /* offset 7759 */ + "\xe1\x84\xab\0" /* offset 7763 */ + "\xe1\x84\xac\0" /* offset 7767 */ + "\xe1\x84\xad\0" /* offset 7771 */ + "\xe1\x84\xae\0" /* offset 7775 */ + "\xe1\x84\xaf\0" /* offset 7779 */ + "\xe1\x84\xb2\0" /* offset 7783 */ + "\xe1\x84\xb6\0" /* offset 7787 */ + "\xe1\x85\x80\0" /* offset 7791 */ + "\xe1\x85\x87\0" /* offset 7795 */ + "\xe1\x85\x8c\0" /* offset 7799 */ + "\xe1\x87\xb1\0" /* offset 7803 */ + "\xe1\x87\xb2\0" /* offset 7807 */ + "\xe1\x85\x97\0" /* offset 7811 */ + "\xe1\x85\x98\0" /* offset 7815 */ + "\xe1\x85\x99\0" /* offset 7819 */ + "\xe1\x86\x84\0" /* offset 7823 */ + "\xe1\x86\x85\0" /* offset 7827 */ + "\xe1\x86\x88\0" /* offset 7831 */ + "\xe1\x86\x91\0" /* offset 7835 */ + "\xe1\x86\x92\0" /* offset 7839 */ + "\xe1\x86\x94\0" /* offset 7843 */ + "\xe1\x86\x9e\0" /* offset 7847 */ + "\xe1\x86\xa1\0" /* offset 7851 */ + "\xe4\xb8\x89\0" /* offset 7855 */ + "\xe5\x9b\x9b\0" /* offset 7859 */ + "\xe4\xb8\x8a\0" /* offset 7863 */ + "\xe4\xb8\xad\0" /* offset 7867 */ + "\xe4\xb8\x8b\0" /* offset 7871 */ + "\xe7\x94\xb2\0" /* offset 7875 */ + "\xe4\xb8\x99\0" /* offset 7879 */ + "\xe4\xb8\x81\0" /* offset 7883 */ + "\xe5\xa4\xa9\0" /* offset 7887 */ + "\xe5\x9c\xb0\0" /* offset 7891 */ + "\x28\xe1\x84\x80\x29\0" /* offset 7895 */ + "\x28\xe1\x84\x82\x29\0" /* offset 7901 */ + "\x28\xe1\x84\x83\x29\0" /* offset 7907 */ + "\x28\xe1\x84\x85\x29\0" /* offset 7913 */ + "\x28\xe1\x84\x86\x29\0" /* offset 7919 */ + "\x28\xe1\x84\x87\x29\0" /* offset 7925 */ + "\x28\xe1\x84\x89\x29\0" /* offset 7931 */ + "\x28\xe1\x84\x8b\x29\0" /* offset 7937 */ + "\x28\xe1\x84\x8c\x29\0" /* offset 7943 */ + "\x28\xe1\x84\x8e\x29\0" /* offset 7949 */ + "\x28\xe1\x84\x8f\x29\0" /* offset 7955 */ + "\x28\xe1\x84\x90\x29\0" /* offset 7961 */ + "\x28\xe1\x84\x91\x29\0" /* offset 7967 */ + "\x28\xe1\x84\x92\x29\0" /* offset 7973 */ + "\x28\xe1\x84\x80\xe1\x85\xa1\x29\0" /* offset 7979 */ + "\x28\xe1\x84\x82\xe1\x85\xa1\x29\0" /* offset 7988 */ + "\x28\xe1\x84\x83\xe1\x85\xa1\x29\0" /* offset 7997 */ + "\x28\xe1\x84\x85\xe1\x85\xa1\x29\0" /* offset 8006 */ + "\x28\xe1\x84\x86\xe1\x85\xa1\x29\0" /* offset 8015 */ + "\x28\xe1\x84\x87\xe1\x85\xa1\x29\0" /* offset 8024 */ + "\x28\xe1\x84\x89\xe1\x85\xa1\x29\0" /* offset 8033 */ + "\x28\xe1\x84\x8b\xe1\x85\xa1\x29\0" /* offset 8042 */ + "\x28\xe1\x84\x8c\xe1\x85\xa1\x29\0" /* offset 8051 */ + "\x28\xe1\x84\x8e\xe1\x85\xa1\x29\0" /* offset 8060 */ + "\x28\xe1\x84\x8f\xe1\x85\xa1\x29\0" /* offset 8069 */ + "\x28\xe1\x84\x90\xe1\x85\xa1\x29\0" /* offset 8078 */ + "\x28\xe1\x84\x91\xe1\x85\xa1\x29\0" /* offset 8087 */ + "\x28\xe1\x84\x92\xe1\x85\xa1\x29\0" /* offset 8096 */ + "\x28\xe1\x84\x8c\xe1\x85\xae\x29\0" /* offset 8105 */ + "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x8c\xe1\x85\xa5\xe1\x86\xab\x29\0" /* offset 8114 */ + "\x28\xe1\x84\x8b\xe1\x85\xa9\xe1\x84\x92\xe1\x85\xae\x29\0" /* offset 8132 */ + "\x28\xe4\xb8\x80\x29\0" /* offset 8147 */ + "\x28\xe4\xba\x8c\x29\0" /* offset 8153 */ + "\x28\xe4\xb8\x89\x29\0" /* offset 8159 */ + "\x28\xe5\x9b\x9b\x29\0" /* offset 8165 */ + "\x28\xe4\xba\x94\x29\0" /* offset 8171 */ + "\x28\xe5\x85\xad\x29\0" /* offset 8177 */ + "\x28\xe4\xb8\x83\x29\0" /* offset 8183 */ + "\x28\xe5\x85\xab\x29\0" /* offset 8189 */ + "\x28\xe4\xb9\x9d\x29\0" /* offset 8195 */ + "\x28\xe5\x8d\x81\x29\0" /* offset 8201 */ + "\x28\xe6\x9c\x88\x29\0" /* offset 8207 */ + "\x28\xe7\x81\xab\x29\0" /* offset 8213 */ + "\x28\xe6\xb0\xb4\x29\0" /* offset 8219 */ + "\x28\xe6\x9c\xa8\x29\0" /* offset 8225 */ + "\x28\xe9\x87\x91\x29\0" /* offset 8231 */ + "\x28\xe5\x9c\x9f\x29\0" /* offset 8237 */ + "\x28\xe6\x97\xa5\x29\0" /* offset 8243 */ + "\x28\xe6\xa0\xaa\x29\0" /* offset 8249 */ + "\x28\xe6\x9c\x89\x29\0" /* offset 8255 */ + "\x28\xe7\xa4\xbe\x29\0" /* offset 8261 */ + "\x28\xe5\x90\x8d\x29\0" /* offset 8267 */ + "\x28\xe7\x89\xb9\x29\0" /* offset 8273 */ + "\x28\xe8\xb2\xa1\x29\0" /* offset 8279 */ + "\x28\xe7\xa5\x9d\x29\0" /* offset 8285 */ + "\x28\xe5\x8a\xb4\x29\0" /* offset 8291 */ + "\x28\xe4\xbb\xa3\x29\0" /* offset 8297 */ + "\x28\xe5\x91\xbc\x29\0" /* offset 8303 */ + "\x28\xe5\xad\xa6\x29\0" /* offset 8309 */ + "\x28\xe7\x9b\xa3\x29\0" /* offset 8315 */ + "\x28\xe4\xbc\x81\x29\0" /* offset 8321 */ + "\x28\xe8\xb3\x87\x29\0" /* offset 8327 */ + "\x28\xe5\x8d\x94\x29\0" /* offset 8333 */ + "\x28\xe7\xa5\xad\x29\0" /* offset 8339 */ + "\x28\xe4\xbc\x91\x29\0" /* offset 8345 */ + "\x28\xe8\x87\xaa\x29\0" /* offset 8351 */ + "\x28\xe8\x87\xb3\x29\0" /* offset 8357 */ + "\xe5\x95\x8f\0" /* offset 8363 */ + "\xe5\xb9\xbc\0" /* offset 8367 */ + "\xe7\xae\x8f\0" /* offset 8371 */ + "\x50\x54\x45\0" /* offset 8375 */ + "\x32\x31\0" /* offset 8379 */ + "\x32\x32\0" /* offset 8382 */ + "\x32\x33\0" /* offset 8385 */ + "\x32\x34\0" /* offset 8388 */ + "\x32\x35\0" /* offset 8391 */ + "\x32\x36\0" /* offset 8394 */ + "\x32\x37\0" /* offset 8397 */ + "\x32\x38\0" /* offset 8400 */ + "\x32\x39\0" /* offset 8403 */ + "\x33\x30\0" /* offset 8406 */ + "\x33\x31\0" /* offset 8409 */ + "\x33\x32\0" /* offset 8412 */ + "\x33\x33\0" /* offset 8415 */ + "\x33\x34\0" /* offset 8418 */ + "\x33\x35\0" /* offset 8421 */ + "\xe1\x84\x80\xe1\x85\xa1\0" /* offset 8424 */ + "\xe1\x84\x82\xe1\x85\xa1\0" /* offset 8431 */ + "\xe1\x84\x83\xe1\x85\xa1\0" /* offset 8438 */ + "\xe1\x84\x85\xe1\x85\xa1\0" /* offset 8445 */ + "\xe1\x84\x86\xe1\x85\xa1\0" /* offset 8452 */ + "\xe1\x84\x87\xe1\x85\xa1\0" /* offset 8459 */ + "\xe1\x84\x89\xe1\x85\xa1\0" /* offset 8466 */ + "\xe1\x84\x8b\xe1\x85\xa1\0" /* offset 8473 */ + "\xe1\x84\x8c\xe1\x85\xa1\0" /* offset 8480 */ + "\xe1\x84\x8e\xe1\x85\xa1\0" /* offset 8487 */ + "\xe1\x84\x8f\xe1\x85\xa1\0" /* offset 8494 */ + "\xe1\x84\x90\xe1\x85\xa1\0" /* offset 8501 */ + "\xe1\x84\x91\xe1\x85\xa1\0" /* offset 8508 */ + "\xe1\x84\x92\xe1\x85\xa1\0" /* offset 8515 */ + "\xe1\x84\x8e\xe1\x85\xa1\xe1\x86\xb7\xe1\x84\x80\xe1\x85\xa9\0" /* offset 8522 */ + "\xe1\x84\x8c\xe1\x85\xae\xe1\x84\x8b\xe1\x85\xb4\0" /* offset 8538 */ + "\xe1\x84\x8b\xe1\x85\xae\0" /* offset 8551 */ + "\xe4\xba\x94\0" /* offset 8558 */ + "\xe5\x85\xad\0" /* offset 8562 */ + "\xe4\xb8\x83\0" /* offset 8566 */ + "\xe4\xb9\x9d\0" /* offset 8570 */ + "\xe6\xa0\xaa\0" /* offset 8574 */ + "\xe6\x9c\x89\0" /* offset 8578 */ + "\xe7\xa4\xbe\0" /* offset 8582 */ + "\xe5\x90\x8d\0" /* offset 8586 */ + "\xe7\x89\xb9\0" /* offset 8590 */ + "\xe8\xb2\xa1\0" /* offset 8594 */ + "\xe7\xa5\x9d\0" /* offset 8598 */ + "\xe5\x8a\xb4\0" /* offset 8602 */ + "\xe7\xa7\x98\0" /* offset 8606 */ + "\xe7\x94\xb7\0" /* offset 8610 */ + "\xe9\x81\xa9\0" /* offset 8614 */ + "\xe5\x84\xaa\0" /* offset 8618 */ + "\xe5\x8d\xb0\0" /* offset 8622 */ + "\xe6\xb3\xa8\0" /* offset 8626 */ + "\xe9\xa0\x85\0" /* offset 8630 */ + "\xe4\xbc\x91\0" /* offset 8634 */ + "\xe5\x86\x99\0" /* offset 8638 */ + "\xe6\xad\xa3\0" /* offset 8642 */ + "\xe5\xb7\xa6\0" /* offset 8646 */ + "\xe5\x8f\xb3\0" /* offset 8650 */ + "\xe5\x8c\xbb\0" /* offset 8654 */ + "\xe5\xae\x97\0" /* offset 8658 */ + "\xe5\xad\xa6\0" /* offset 8662 */ + "\xe7\x9b\xa3\0" /* offset 8666 */ + "\xe4\xbc\x81\0" /* offset 8670 */ + "\xe8\xb3\x87\0" /* offset 8674 */ + "\xe5\x8d\x94\0" /* offset 8678 */ + "\xe5\xa4\x9c\0" /* offset 8682 */ + "\x33\x36\0" /* offset 8686 */ + "\x33\x37\0" /* offset 8689 */ + "\x33\x38\0" /* offset 8692 */ + "\x33\x39\0" /* offset 8695 */ + "\x34\x30\0" /* offset 8698 */ + "\x34\x31\0" /* offset 8701 */ + "\x34\x32\0" /* offset 8704 */ + "\x34\x33\0" /* offset 8707 */ + "\x34\x34\0" /* offset 8710 */ + "\x34\x35\0" /* offset 8713 */ + "\x34\x36\0" /* offset 8716 */ + "\x34\x37\0" /* offset 8719 */ + "\x34\x38\0" /* offset 8722 */ + "\x34\x39\0" /* offset 8725 */ + "\x35\x30\0" /* offset 8728 */ + "\x31\xe6\x9c\x88\0" /* offset 8731 */ + "\x32\xe6\x9c\x88\0" /* offset 8736 */ + "\x33\xe6\x9c\x88\0" /* offset 8741 */ + "\x34\xe6\x9c\x88\0" /* offset 8746 */ + "\x35\xe6\x9c\x88\0" /* offset 8751 */ + "\x36\xe6\x9c\x88\0" /* offset 8756 */ + "\x37\xe6\x9c\x88\0" /* offset 8761 */ + "\x38\xe6\x9c\x88\0" /* offset 8766 */ + "\x39\xe6\x9c\x88\0" /* offset 8771 */ + "\x31\x30\xe6\x9c\x88\0" /* offset 8776 */ + "\x31\x31\xe6\x9c\x88\0" /* offset 8782 */ + "\x31\x32\xe6\x9c\x88\0" /* offset 8788 */ + "\x48\x67\0" /* offset 8794 */ + "\x65\x72\x67\0" /* offset 8797 */ + "\x65\x56\0" /* offset 8801 */ + "\x4c\x54\x44\0" /* offset 8804 */ + "\xe3\x82\xa2\0" /* offset 8808 */ + "\xe3\x82\xa4\0" /* offset 8812 */ + "\xe3\x82\xa6\0" /* offset 8816 */ + "\xe3\x82\xa8\0" /* offset 8820 */ + "\xe3\x82\xaa\0" /* offset 8824 */ + "\xe3\x82\xab\0" /* offset 8828 */ + "\xe3\x82\xad\0" /* offset 8832 */ + "\xe3\x82\xaf\0" /* offset 8836 */ + "\xe3\x82\xb1\0" /* offset 8840 */ + "\xe3\x82\xb3\0" /* offset 8844 */ + "\xe3\x82\xb5\0" /* offset 8848 */ + "\xe3\x82\xb7\0" /* offset 8852 */ + "\xe3\x82\xb9\0" /* offset 8856 */ + "\xe3\x82\xbb\0" /* offset 8860 */ + "\xe3\x82\xbd\0" /* offset 8864 */ + "\xe3\x82\xbf\0" /* offset 8868 */ + "\xe3\x83\x81\0" /* offset 8872 */ + "\xe3\x83\x84\0" /* offset 8876 */ + "\xe3\x83\x86\0" /* offset 8880 */ + "\xe3\x83\x88\0" /* offset 8884 */ + "\xe3\x83\x8a\0" /* offset 8888 */ + "\xe3\x83\x8b\0" /* offset 8892 */ + "\xe3\x83\x8c\0" /* offset 8896 */ + "\xe3\x83\x8d\0" /* offset 8900 */ + "\xe3\x83\x8e\0" /* offset 8904 */ + "\xe3\x83\x8f\0" /* offset 8908 */ + "\xe3\x83\x92\0" /* offset 8912 */ + "\xe3\x83\x95\0" /* offset 8916 */ + "\xe3\x83\x98\0" /* offset 8920 */ + "\xe3\x83\x9b\0" /* offset 8924 */ + "\xe3\x83\x9e\0" /* offset 8928 */ + "\xe3\x83\x9f\0" /* offset 8932 */ + "\xe3\x83\xa0\0" /* offset 8936 */ + "\xe3\x83\xa1\0" /* offset 8940 */ + "\xe3\x83\xa2\0" /* offset 8944 */ + "\xe3\x83\xa4\0" /* offset 8948 */ + "\xe3\x83\xa6\0" /* offset 8952 */ + "\xe3\x83\xa8\0" /* offset 8956 */ + "\xe3\x83\xa9\0" /* offset 8960 */ + "\xe3\x83\xaa\0" /* offset 8964 */ + "\xe3\x83\xab\0" /* offset 8968 */ + "\xe3\x83\xac\0" /* offset 8972 */ + "\xe3\x83\xad\0" /* offset 8976 */ + "\xe3\x83\xaf\0" /* offset 8980 */ + "\xe3\x83\xb0\0" /* offset 8984 */ + "\xe3\x83\xb1\0" /* offset 8988 */ + "\xe3\x83\xb2\0" /* offset 8992 */ + "\xe3\x82\xa2\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x88\0" /* offset 8996 */ + "\xe3\x82\xa2\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa1\0" /* offset 9012 */ + "\xe3\x82\xa2\xe3\x83\xb3\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xa2\0" /* offset 9025 */ + "\xe3\x82\xa2\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9041 */ + "\xe3\x82\xa4\xe3\x83\x8b\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9051 */ + "\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9067 */ + "\xe3\x82\xa6\xe3\x82\xa9\xe3\x83\xb3\0" /* offset 9077 */ + "\xe3\x82\xa8\xe3\x82\xb9\xe3\x82\xaf\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 9087 */ + "\xe3\x82\xa8\xe3\x83\xbc\xe3\x82\xab\xe3\x83\xbc\0" /* offset 9106 */ + "\xe3\x82\xaa\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9119 */ + "\xe3\x82\xaa\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9129 */ + "\xe3\x82\xab\xe3\x82\xa4\xe3\x83\xaa\0" /* offset 9139 */ + "\xe3\x82\xab\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\0" /* offset 9149 */ + "\xe3\x82\xab\xe3\x83\xad\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9162 */ + "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9175 */ + "\xe3\x82\xab\xe3\x82\x99\xe3\x83\xb3\xe3\x83\x9e\0" /* offset 9188 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x82\xab\xe3\x82\x99\0" /* offset 9201 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x83\x8b\xe3\x83\xbc\0" /* offset 9214 */ + "\xe3\x82\xad\xe3\x83\xa5\xe3\x83\xaa\xe3\x83\xbc\0" /* offset 9227 */ + "\xe3\x82\xad\xe3\x82\x99\xe3\x83\xab\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\0" /* offset 9240 */ + "\xe3\x82\xad\xe3\x83\xad\0" /* offset 9259 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9266 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9285 */ + "\xe3\x82\xad\xe3\x83\xad\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 9304 */ + "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\0" /* offset 9320 */ + "\xe3\x82\xaf\xe3\x82\x99\xe3\x83\xa9\xe3\x83\xa0\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9333 */ + "\xe3\x82\xaf\xe3\x83\xab\xe3\x82\xbb\xe3\x82\x99\xe3\x82\xa4\xe3\x83\xad\0" /* offset 9352 */ + "\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xbc\xe3\x83\x8d\0" /* offset 9371 */ + "\xe3\x82\xb1\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9384 */ + "\xe3\x82\xb3\xe3\x83\xab\xe3\x83\x8a\0" /* offset 9394 */ + "\xe3\x82\xb3\xe3\x83\xbc\xe3\x83\x9b\xe3\x82\x9a\0" /* offset 9404 */ + "\xe3\x82\xb5\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9417 */ + "\xe3\x82\xb5\xe3\x83\xb3\xe3\x83\x81\xe3\x83\xbc\xe3\x83\xa0\0" /* offset 9430 */ + "\xe3\x82\xb7\xe3\x83\xaa\xe3\x83\xb3\xe3\x82\xaf\xe3\x82\x99\0" /* offset 9446 */ + "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x81\0" /* offset 9462 */ + "\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9472 */ + "\xe3\x82\xbf\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xb9\0" /* offset 9482 */ + "\xe3\x83\x86\xe3\x82\x99\xe3\x82\xb7\0" /* offset 9495 */ + "\xe3\x83\x88\xe3\x82\x99\xe3\x83\xab\0" /* offset 9505 */ + "\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9515 */ + "\xe3\x83\x8a\xe3\x83\x8e\0" /* offset 9522 */ + "\xe3\x83\x8e\xe3\x83\x83\xe3\x83\x88\0" /* offset 9529 */ + "\xe3\x83\x8f\xe3\x82\xa4\xe3\x83\x84\0" /* offset 9539 */ + "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xbb\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9549 */ + "\xe3\x83\x8f\xe3\x82\x9a\xe3\x83\xbc\xe3\x83\x84\0" /* offset 9568 */ + "\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xac\xe3\x83\xab\0" /* offset 9581 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xa2\xe3\x82\xb9\xe3\x83\x88\xe3\x83\xab\0" /* offset 9597 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xaf\xe3\x83\xab\0" /* offset 9616 */ + "\xe3\x83\x92\xe3\x82\x9a\xe3\x82\xb3\0" /* offset 9629 */ + "\xe3\x83\x92\xe3\x82\x99\xe3\x83\xab\0" /* offset 9639 */ + "\xe3\x83\x95\xe3\x82\xa1\xe3\x83\xa9\xe3\x83\x83\xe3\x83\x88\xe3\x82\x99\0" /* offset 9649 */ + "\xe3\x83\x95\xe3\x82\xa3\xe3\x83\xbc\xe3\x83\x88\0" /* offset 9668 */ + "\xe3\x83\x95\xe3\x82\x99\xe3\x83\x83\xe3\x82\xb7\xe3\x82\xa7\xe3\x83\xab\0" /* offset 9681 */ + "\xe3\x83\x95\xe3\x83\xa9\xe3\x83\xb3\0" /* offset 9700 */ + "\xe3\x83\x98\xe3\x82\xaf\xe3\x82\xbf\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9710 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x82\xbd\0" /* offset 9726 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\x8b\xe3\x83\x92\0" /* offset 9736 */ + "\xe3\x83\x98\xe3\x83\xab\xe3\x83\x84\0" /* offset 9749 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xb3\xe3\x82\xb9\0" /* offset 9759 */ + "\xe3\x83\x98\xe3\x82\x9a\xe3\x83\xbc\xe3\x82\xb7\xe3\x82\x99\0" /* offset 9772 */ + "\xe3\x83\x98\xe3\x82\x99\xe3\x83\xbc\xe3\x82\xbf\0" /* offset 9788 */ + "\xe3\x83\x9b\xe3\x82\x9a\xe3\x82\xa4\xe3\x83\xb3\xe3\x83\x88\0" /* offset 9801 */ + "\xe3\x83\x9b\xe3\x82\x99\xe3\x83\xab\xe3\x83\x88\0" /* offset 9817 */ + "\xe3\x83\x9b\xe3\x83\xb3\0" /* offset 9830 */ + "\xe3\x83\x9b\xe3\x82\x9a\xe3\x83\xb3\xe3\x83\x88\xe3\x82\x99\0" /* offset 9837 */ + "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9853 */ + "\xe3\x83\x9b\xe3\x83\xbc\xe3\x83\xb3\0" /* offset 9863 */ + "\xe3\x83\x9e\xe3\x82\xa4\xe3\x82\xaf\xe3\x83\xad\0" /* offset 9873 */ + "\xe3\x83\x9e\xe3\x82\xa4\xe3\x83\xab\0" /* offset 9886 */ + "\xe3\x83\x9e\xe3\x83\x83\xe3\x83\x8f\0" /* offset 9896 */ + "\xe3\x83\x9e\xe3\x83\xab\xe3\x82\xaf\0" /* offset 9906 */ + "\xe3\x83\x9e\xe3\x83\xb3\xe3\x82\xb7\xe3\x83\xa7\xe3\x83\xb3\0" /* offset 9916 */ + "\xe3\x83\x9f\xe3\x82\xaf\xe3\x83\xad\xe3\x83\xb3\0" /* offset 9932 */ + "\xe3\x83\x9f\xe3\x83\xaa\0" /* offset 9945 */ + "\xe3\x83\x9f\xe3\x83\xaa\xe3\x83\x8f\xe3\x82\x99\xe3\x83\xbc\xe3\x83\xab\0" /* offset 9952 */ + "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\0" /* offset 9971 */ + "\xe3\x83\xa1\xe3\x82\xab\xe3\x82\x99\xe3\x83\x88\xe3\x83\xb3\0" /* offset 9981 */ + "\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88\xe3\x83\xab\0" /* offset 9997 */ + "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\x88\xe3\x82\x99\0" /* offset 10010 */ + "\xe3\x83\xa4\xe3\x83\xbc\xe3\x83\xab\0" /* offset 10023 */ + "\xe3\x83\xa6\xe3\x82\xa2\xe3\x83\xb3\0" /* offset 10033 */ + "\xe3\x83\xaa\xe3\x83\x83\xe3\x83\x88\xe3\x83\xab\0" /* offset 10043 */ + "\xe3\x83\xaa\xe3\x83\xa9\0" /* offset 10056 */ + "\xe3\x83\xab\xe3\x83\x92\xe3\x82\x9a\xe3\x83\xbc\0" /* offset 10063 */ + "\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x95\xe3\x82\x99\xe3\x83\xab\0" /* offset 10076 */ + "\xe3\x83\xac\xe3\x83\xa0\0" /* offset 10092 */ + "\xe3\x83\xac\xe3\x83\xb3\xe3\x83\x88\xe3\x82\xb1\xe3\x82\x99\xe3\x83\xb3\0" /* offset 10099 */ + "\xe3\x83\xaf\xe3\x83\x83\xe3\x83\x88\0" /* offset 10118 */ + "\x30\xe7\x82\xb9\0" /* offset 10128 */ + "\x31\xe7\x82\xb9\0" /* offset 10133 */ + "\x32\xe7\x82\xb9\0" /* offset 10138 */ + "\x33\xe7\x82\xb9\0" /* offset 10143 */ + "\x34\xe7\x82\xb9\0" /* offset 10148 */ + "\x35\xe7\x82\xb9\0" /* offset 10153 */ + "\x36\xe7\x82\xb9\0" /* offset 10158 */ + "\x37\xe7\x82\xb9\0" /* offset 10163 */ + "\x38\xe7\x82\xb9\0" /* offset 10168 */ + "\x39\xe7\x82\xb9\0" /* offset 10173 */ + "\x31\x30\xe7\x82\xb9\0" /* offset 10178 */ + "\x31\x31\xe7\x82\xb9\0" /* offset 10184 */ + "\x31\x32\xe7\x82\xb9\0" /* offset 10190 */ + "\x31\x33\xe7\x82\xb9\0" /* offset 10196 */ + "\x31\x34\xe7\x82\xb9\0" /* offset 10202 */ + "\x31\x35\xe7\x82\xb9\0" /* offset 10208 */ + "\x31\x36\xe7\x82\xb9\0" /* offset 10214 */ + "\x31\x37\xe7\x82\xb9\0" /* offset 10220 */ + "\x31\x38\xe7\x82\xb9\0" /* offset 10226 */ + "\x31\x39\xe7\x82\xb9\0" /* offset 10232 */ + "\x32\x30\xe7\x82\xb9\0" /* offset 10238 */ + "\x32\x31\xe7\x82\xb9\0" /* offset 10244 */ + "\x32\x32\xe7\x82\xb9\0" /* offset 10250 */ + "\x32\x33\xe7\x82\xb9\0" /* offset 10256 */ + "\x32\x34\xe7\x82\xb9\0" /* offset 10262 */ + "\x68\x50\x61\0" /* offset 10268 */ + "\x64\x61\0" /* offset 10272 */ + "\x41\x55\0" /* offset 10275 */ + "\x62\x61\x72\0" /* offset 10278 */ + "\x6f\x56\0" /* offset 10282 */ + "\x70\x63\0" /* offset 10285 */ + "\x64\x6d\0" /* offset 10288 */ + "\x64\x6d\x32\0" /* offset 10291 */ + "\x64\x6d\x33\0" /* offset 10295 */ + "\x49\x55\0" /* offset 10299 */ + "\xe5\xb9\xb3\xe6\x88\x90\0" /* offset 10302 */ + "\xe6\x98\xad\xe5\x92\x8c\0" /* offset 10309 */ + "\xe5\xa4\xa7\xe6\xad\xa3\0" /* offset 10316 */ + "\xe6\x98\x8e\xe6\xb2\xbb\0" /* offset 10323 */ + "\xe6\xa0\xaa\xe5\xbc\x8f\xe4\xbc\x9a\xe7\xa4\xbe\0" /* offset 10330 */ + "\x70\x41\0" /* offset 10343 */ + "\x6e\x41\0" /* offset 10346 */ + "\xce\xbc\x41\0" /* offset 10349 */ + "\x6d\x41\0" /* offset 10353 */ + "\x6b\x41\0" /* offset 10356 */ + "\x4b\x42\0" /* offset 10359 */ + "\x4d\x42\0" /* offset 10362 */ + "\x47\x42\0" /* offset 10365 */ + "\x63\x61\x6c\0" /* offset 10368 */ + "\x6b\x63\x61\x6c\0" /* offset 10372 */ + "\x70\x46\0" /* offset 10377 */ + "\x6e\x46\0" /* offset 10380 */ + "\xce\xbc\x46\0" /* offset 10383 */ + "\xce\xbc\x67\0" /* offset 10387 */ + "\x6d\x67\0" /* offset 10391 */ + "\x6b\x67\0" /* offset 10394 */ + "\x48\x7a\0" /* offset 10397 */ + "\x6b\x48\x7a\0" /* offset 10400 */ + "\x4d\x48\x7a\0" /* offset 10404 */ + "\x47\x48\x7a\0" /* offset 10408 */ + "\x54\x48\x7a\0" /* offset 10412 */ + "\xce\xbc\x6c\0" /* offset 10416 */ + "\x6d\x6c\0" /* offset 10420 */ + "\x64\x6c\0" /* offset 10423 */ + "\x6b\x6c\0" /* offset 10426 */ + "\x66\x6d\0" /* offset 10429 */ + "\x6e\x6d\0" /* offset 10432 */ + "\xce\xbc\x6d\0" /* offset 10435 */ + "\x6d\x6d\0" /* offset 10439 */ + "\x63\x6d\0" /* offset 10442 */ + "\x6b\x6d\0" /* offset 10445 */ + "\x6d\x6d\x32\0" /* offset 10448 */ + "\x63\x6d\x32\0" /* offset 10452 */ + "\x6d\x32\0" /* offset 10456 */ + "\x6b\x6d\x32\0" /* offset 10459 */ + "\x6d\x6d\x33\0" /* offset 10463 */ + "\x63\x6d\x33\0" /* offset 10467 */ + "\x6d\x33\0" /* offset 10471 */ + "\x6b\x6d\x33\0" /* offset 10474 */ + "\x6d\xe2\x88\x95\x73\0" /* offset 10478 */ + "\x6d\xe2\x88\x95\x73\x32\0" /* offset 10484 */ + "\x50\x61\0" /* offset 10491 */ + "\x6b\x50\x61\0" /* offset 10494 */ + "\x4d\x50\x61\0" /* offset 10498 */ + "\x47\x50\x61\0" /* offset 10502 */ + "\x72\x61\x64\0" /* offset 10506 */ + "\x72\x61\x64\xe2\x88\x95\x73\0" /* offset 10510 */ + "\x72\x61\x64\xe2\x88\x95\x73\x32\0" /* offset 10518 */ + "\x70\x73\0" /* offset 10527 */ + "\x6e\x73\0" /* offset 10530 */ + "\xce\xbc\x73\0" /* offset 10533 */ + "\x6d\x73\0" /* offset 10537 */ + "\x70\x56\0" /* offset 10540 */ + "\x6e\x56\0" /* offset 10543 */ + "\xce\xbc\x56\0" /* offset 10546 */ + "\x6d\x56\0" /* offset 10550 */ + "\x6b\x56\0" /* offset 10553 */ + "\x4d\x56\0" /* offset 10556 */ + "\x70\x57\0" /* offset 10559 */ + "\x6e\x57\0" /* offset 10562 */ + "\xce\xbc\x57\0" /* offset 10565 */ + "\x6d\x57\0" /* offset 10569 */ + "\x6b\x57\0" /* offset 10572 */ + "\x4d\x57\0" /* offset 10575 */ + "\x6b\xce\xa9\0" /* offset 10578 */ + "\x4d\xce\xa9\0" /* offset 10582 */ + "\x61\x2e\x6d\x2e\0" /* offset 10586 */ + "\x42\x71\0" /* offset 10591 */ + "\x63\x63\0" /* offset 10594 */ + "\x63\x64\0" /* offset 10597 */ + "\x43\xe2\x88\x95\x6b\x67\0" /* offset 10600 */ + "\x43\x6f\x2e\0" /* offset 10607 */ + "\x64\x42\0" /* offset 10611 */ + "\x47\x79\0" /* offset 10614 */ + "\x68\x61\0" /* offset 10617 */ + "\x48\x50\0" /* offset 10620 */ + "\x69\x6e\0" /* offset 10623 */ + "\x4b\x4b\0" /* offset 10626 */ + "\x4b\x4d\0" /* offset 10629 */ + "\x6b\x74\0" /* offset 10632 */ + "\x6c\x6d\0" /* offset 10635 */ + "\x6c\x6e\0" /* offset 10638 */ + "\x6c\x6f\x67\0" /* offset 10641 */ + "\x6c\x78\0" /* offset 10645 */ + "\x6d\x62\0" /* offset 10648 */ + "\x6d\x69\x6c\0" /* offset 10651 */ + "\x6d\x6f\x6c\0" /* offset 10655 */ + "\x50\x48\0" /* offset 10659 */ + "\x70\x2e\x6d\x2e\0" /* offset 10662 */ + "\x50\x50\x4d\0" /* offset 10667 */ + "\x50\x52\0" /* offset 10671 */ + "\x73\x72\0" /* offset 10674 */ + "\x53\x76\0" /* offset 10677 */ + "\x57\x62\0" /* offset 10680 */ + "\x56\xe2\x88\x95\x6d\0" /* offset 10683 */ + "\x41\xe2\x88\x95\x6d\0" /* offset 10689 */ + "\x31\xe6\x97\xa5\0" /* offset 10695 */ + "\x32\xe6\x97\xa5\0" /* offset 10700 */ + "\x33\xe6\x97\xa5\0" /* offset 10705 */ + "\x34\xe6\x97\xa5\0" /* offset 10710 */ + "\x35\xe6\x97\xa5\0" /* offset 10715 */ + "\x36\xe6\x97\xa5\0" /* offset 10720 */ + "\x37\xe6\x97\xa5\0" /* offset 10725 */ + "\x38\xe6\x97\xa5\0" /* offset 10730 */ + "\x39\xe6\x97\xa5\0" /* offset 10735 */ + "\x31\x30\xe6\x97\xa5\0" /* offset 10740 */ + "\x31\x31\xe6\x97\xa5\0" /* offset 10746 */ + "\x31\x32\xe6\x97\xa5\0" /* offset 10752 */ + "\x31\x33\xe6\x97\xa5\0" /* offset 10758 */ + "\x31\x34\xe6\x97\xa5\0" /* offset 10764 */ + "\x31\x35\xe6\x97\xa5\0" /* offset 10770 */ + "\x31\x36\xe6\x97\xa5\0" /* offset 10776 */ + "\x31\x37\xe6\x97\xa5\0" /* offset 10782 */ + "\x31\x38\xe6\x97\xa5\0" /* offset 10788 */ + "\x31\x39\xe6\x97\xa5\0" /* offset 10794 */ + "\x32\x30\xe6\x97\xa5\0" /* offset 10800 */ + "\x32\x31\xe6\x97\xa5\0" /* offset 10806 */ + "\x32\x32\xe6\x97\xa5\0" /* offset 10812 */ + "\x32\x33\xe6\x97\xa5\0" /* offset 10818 */ + "\x32\x34\xe6\x97\xa5\0" /* offset 10824 */ + "\x32\x35\xe6\x97\xa5\0" /* offset 10830 */ + "\x32\x36\xe6\x97\xa5\0" /* offset 10836 */ + "\x32\x37\xe6\x97\xa5\0" /* offset 10842 */ + "\x32\x38\xe6\x97\xa5\0" /* offset 10848 */ + "\x32\x39\xe6\x97\xa5\0" /* offset 10854 */ + "\x33\x30\xe6\x97\xa5\0" /* offset 10860 */ + "\x33\x31\xe6\x97\xa5\0" /* offset 10866 */ + "\x67\x61\x6c\0" /* offset 10872 */ + "\xea\x9d\xaf\0" /* offset 10876 */ + "\xc4\xa6\0" /* offset 10880 */ + "\xc5\x93\0" /* offset 10883 */ + "\xe8\xb1\x88\0" /* offset 10886 */ + "\xe6\x9b\xb4\0" /* offset 10890 */ + "\xe8\xb3\x88\0" /* offset 10894 */ + "\xe6\xbb\x91\0" /* offset 10898 */ + "\xe4\xb8\xb2\0" /* offset 10902 */ + "\xe5\x8f\xa5\0" /* offset 10906 */ + "\xe5\xa5\x91\0" /* offset 10910 */ + "\xe5\x96\x87\0" /* offset 10914 */ + "\xe5\xa5\x88\0" /* offset 10918 */ + "\xe6\x87\xb6\0" /* offset 10922 */ + "\xe7\x99\xa9\0" /* offset 10926 */ + "\xe7\xbe\x85\0" /* offset 10930 */ + "\xe8\x98\xbf\0" /* offset 10934 */ + "\xe8\x9e\xba\0" /* offset 10938 */ + "\xe8\xa3\xb8\0" /* offset 10942 */ + "\xe9\x82\x8f\0" /* offset 10946 */ + "\xe6\xa8\x82\0" /* offset 10950 */ + "\xe6\xb4\x9b\0" /* offset 10954 */ + "\xe7\x83\x99\0" /* offset 10958 */ + "\xe7\x8f\x9e\0" /* offset 10962 */ + "\xe8\x90\xbd\0" /* offset 10966 */ + "\xe9\x85\xaa\0" /* offset 10970 */ + "\xe9\xa7\xb1\0" /* offset 10974 */ + "\xe4\xba\x82\0" /* offset 10978 */ + "\xe5\x8d\xb5\0" /* offset 10982 */ + "\xe6\xac\x84\0" /* offset 10986 */ + "\xe7\x88\x9b\0" /* offset 10990 */ + "\xe8\x98\xad\0" /* offset 10994 */ + "\xe9\xb8\x9e\0" /* offset 10998 */ + "\xe5\xb5\x90\0" /* offset 11002 */ + "\xe6\xbf\xab\0" /* offset 11006 */ + "\xe8\x97\x8d\0" /* offset 11010 */ + "\xe8\xa5\xa4\0" /* offset 11014 */ + "\xe6\x8b\x89\0" /* offset 11018 */ + "\xe8\x87\x98\0" /* offset 11022 */ + "\xe8\xa0\x9f\0" /* offset 11026 */ + "\xe5\xbb\x8a\0" /* offset 11030 */ + "\xe6\x9c\x97\0" /* offset 11034 */ + "\xe6\xb5\xaa\0" /* offset 11038 */ + "\xe7\x8b\xbc\0" /* offset 11042 */ + "\xe9\x83\x8e\0" /* offset 11046 */ + "\xe4\xbe\x86\0" /* offset 11050 */ + "\xe5\x86\xb7\0" /* offset 11054 */ + "\xe5\x8b\x9e\0" /* offset 11058 */ + "\xe6\x93\x84\0" /* offset 11062 */ + "\xe6\xab\x93\0" /* offset 11066 */ + "\xe7\x88\x90\0" /* offset 11070 */ + "\xe7\x9b\xa7\0" /* offset 11074 */ + "\xe8\x98\x86\0" /* offset 11078 */ + "\xe8\x99\x9c\0" /* offset 11082 */ + "\xe8\xb7\xaf\0" /* offset 11086 */ + "\xe9\x9c\xb2\0" /* offset 11090 */ + "\xe9\xad\xaf\0" /* offset 11094 */ + "\xe9\xb7\xba\0" /* offset 11098 */ + "\xe7\xa2\x8c\0" /* offset 11102 */ + "\xe7\xa5\xbf\0" /* offset 11106 */ + "\xe7\xb6\xa0\0" /* offset 11110 */ + "\xe8\x8f\x89\0" /* offset 11114 */ + "\xe9\x8c\x84\0" /* offset 11118 */ + "\xe8\xab\x96\0" /* offset 11122 */ + "\xe5\xa3\x9f\0" /* offset 11126 */ + "\xe5\xbc\x84\0" /* offset 11130 */ + "\xe7\xb1\xa0\0" /* offset 11134 */ + "\xe8\x81\xbe\0" /* offset 11138 */ + "\xe7\x89\xa2\0" /* offset 11142 */ + "\xe7\xa3\x8a\0" /* offset 11146 */ + "\xe8\xb3\x82\0" /* offset 11150 */ + "\xe9\x9b\xb7\0" /* offset 11154 */ + "\xe5\xa3\x98\0" /* offset 11158 */ + "\xe5\xb1\xa2\0" /* offset 11162 */ + "\xe6\xa8\x93\0" /* offset 11166 */ + "\xe6\xb7\x9a\0" /* offset 11170 */ + "\xe6\xbc\x8f\0" /* offset 11174 */ + "\xe7\xb4\xaf\0" /* offset 11178 */ + "\xe7\xb8\xb7\0" /* offset 11182 */ + "\xe9\x99\x8b\0" /* offset 11186 */ + "\xe5\x8b\x92\0" /* offset 11190 */ + "\xe8\x82\x8b\0" /* offset 11194 */ + "\xe5\x87\x9c\0" /* offset 11198 */ + "\xe5\x87\x8c\0" /* offset 11202 */ + "\xe7\xa8\x9c\0" /* offset 11206 */ + "\xe7\xb6\xbe\0" /* offset 11210 */ + "\xe8\x8f\xb1\0" /* offset 11214 */ + "\xe9\x99\xb5\0" /* offset 11218 */ + "\xe8\xae\x80\0" /* offset 11222 */ + "\xe6\x8b\x8f\0" /* offset 11226 */ + "\xe8\xab\xbe\0" /* offset 11230 */ + "\xe4\xb8\xb9\0" /* offset 11234 */ + "\xe5\xaf\xa7\0" /* offset 11238 */ + "\xe6\x80\x92\0" /* offset 11242 */ + "\xe7\x8e\x87\0" /* offset 11246 */ + "\xe7\x95\xb0\0" /* offset 11250 */ + "\xe5\x8c\x97\0" /* offset 11254 */ + "\xe7\xa3\xbb\0" /* offset 11258 */ + "\xe4\xbe\xbf\0" /* offset 11262 */ + "\xe5\xbe\xa9\0" /* offset 11266 */ + "\xe4\xb8\x8d\0" /* offset 11270 */ + "\xe6\xb3\x8c\0" /* offset 11274 */ + "\xe6\x95\xb8\0" /* offset 11278 */ + "\xe7\xb4\xa2\0" /* offset 11282 */ + "\xe5\x8f\x83\0" /* offset 11286 */ + "\xe5\xa1\x9e\0" /* offset 11290 */ + "\xe7\x9c\x81\0" /* offset 11294 */ + "\xe8\x91\x89\0" /* offset 11298 */ + "\xe8\xaa\xaa\0" /* offset 11302 */ + "\xe6\xae\xba\0" /* offset 11306 */ + "\xe6\xb2\x88\0" /* offset 11310 */ + "\xe6\x8b\xbe\0" /* offset 11314 */ + "\xe8\x8b\xa5\0" /* offset 11318 */ + "\xe6\x8e\xa0\0" /* offset 11322 */ + "\xe7\x95\xa5\0" /* offset 11326 */ + "\xe4\xba\xae\0" /* offset 11330 */ + "\xe5\x85\xa9\0" /* offset 11334 */ + "\xe5\x87\x89\0" /* offset 11338 */ + "\xe6\xa2\x81\0" /* offset 11342 */ + "\xe7\xb3\xa7\0" /* offset 11346 */ + "\xe8\x89\xaf\0" /* offset 11350 */ + "\xe8\xab\x92\0" /* offset 11354 */ + "\xe9\x87\x8f\0" /* offset 11358 */ + "\xe5\x8b\xb5\0" /* offset 11362 */ + "\xe5\x91\x82\0" /* offset 11366 */ + "\xe5\xbb\xac\0" /* offset 11370 */ + "\xe6\x97\x85\0" /* offset 11374 */ + "\xe6\xbf\xbe\0" /* offset 11378 */ + "\xe7\xa4\xaa\0" /* offset 11382 */ + "\xe9\x96\xad\0" /* offset 11386 */ + "\xe9\xa9\xaa\0" /* offset 11390 */ + "\xe9\xba\x97\0" /* offset 11394 */ + "\xe9\xbb\x8e\0" /* offset 11398 */ + "\xe6\x9b\x86\0" /* offset 11402 */ + "\xe6\xad\xb7\0" /* offset 11406 */ + "\xe8\xbd\xa2\0" /* offset 11410 */ + "\xe5\xb9\xb4\0" /* offset 11414 */ + "\xe6\x86\x90\0" /* offset 11418 */ + "\xe6\x88\x80\0" /* offset 11422 */ + "\xe6\x92\x9a\0" /* offset 11426 */ + "\xe6\xbc\xa3\0" /* offset 11430 */ + "\xe7\x85\x89\0" /* offset 11434 */ + "\xe7\x92\x89\0" /* offset 11438 */ + "\xe7\xa7\x8a\0" /* offset 11442 */ + "\xe7\xb7\xb4\0" /* offset 11446 */ + "\xe8\x81\xaf\0" /* offset 11450 */ + "\xe8\xbc\xa6\0" /* offset 11454 */ + "\xe8\x93\xae\0" /* offset 11458 */ + "\xe9\x80\xa3\0" /* offset 11462 */ + "\xe9\x8d\x8a\0" /* offset 11466 */ + "\xe5\x88\x97\0" /* offset 11470 */ + "\xe5\x8a\xa3\0" /* offset 11474 */ + "\xe5\x92\xbd\0" /* offset 11478 */ + "\xe7\x83\x88\0" /* offset 11482 */ + "\xe8\xa3\x82\0" /* offset 11486 */ + "\xe5\xbb\x89\0" /* offset 11490 */ + "\xe5\xbf\xb5\0" /* offset 11494 */ + "\xe6\x8d\xbb\0" /* offset 11498 */ + "\xe6\xae\xae\0" /* offset 11502 */ + "\xe7\xb0\xbe\0" /* offset 11506 */ + "\xe7\x8d\xb5\0" /* offset 11510 */ + "\xe4\xbb\xa4\0" /* offset 11514 */ + "\xe5\x9b\xb9\0" /* offset 11518 */ + "\xe5\xb6\xba\0" /* offset 11522 */ + "\xe6\x80\x9c\0" /* offset 11526 */ + "\xe7\x8e\xb2\0" /* offset 11530 */ + "\xe7\x91\xa9\0" /* offset 11534 */ + "\xe7\xbe\x9a\0" /* offset 11538 */ + "\xe8\x81\x86\0" /* offset 11542 */ + "\xe9\x88\xb4\0" /* offset 11546 */ + "\xe9\x9b\xb6\0" /* offset 11550 */ + "\xe9\x9d\x88\0" /* offset 11554 */ + "\xe9\xa0\x98\0" /* offset 11558 */ + "\xe4\xbe\x8b\0" /* offset 11562 */ + "\xe7\xa6\xae\0" /* offset 11566 */ + "\xe9\x86\xb4\0" /* offset 11570 */ + "\xe9\x9a\xb8\0" /* offset 11574 */ + "\xe6\x83\xa1\0" /* offset 11578 */ + "\xe4\xba\x86\0" /* offset 11582 */ + "\xe5\x83\x9a\0" /* offset 11586 */ + "\xe5\xaf\xae\0" /* offset 11590 */ + "\xe5\xb0\xbf\0" /* offset 11594 */ + "\xe6\x96\x99\0" /* offset 11598 */ + "\xe7\x87\x8e\0" /* offset 11602 */ + "\xe7\x99\x82\0" /* offset 11606 */ + "\xe8\x93\xbc\0" /* offset 11610 */ + "\xe9\x81\xbc\0" /* offset 11614 */ + "\xe6\x9a\x88\0" /* offset 11618 */ + "\xe9\x98\xae\0" /* offset 11622 */ + "\xe5\x8a\x89\0" /* offset 11626 */ + "\xe6\x9d\xbb\0" /* offset 11630 */ + "\xe6\x9f\xb3\0" /* offset 11634 */ + "\xe6\xb5\x81\0" /* offset 11638 */ + "\xe6\xba\x9c\0" /* offset 11642 */ + "\xe7\x90\x89\0" /* offset 11646 */ + "\xe7\x95\x99\0" /* offset 11650 */ + "\xe7\xa1\xab\0" /* offset 11654 */ + "\xe7\xb4\x90\0" /* offset 11658 */ + "\xe9\xa1\x9e\0" /* offset 11662 */ + "\xe6\x88\xae\0" /* offset 11666 */ + "\xe9\x99\xb8\0" /* offset 11670 */ + "\xe5\x80\xab\0" /* offset 11674 */ + "\xe5\xb4\x99\0" /* offset 11678 */ + "\xe6\xb7\xaa\0" /* offset 11682 */ + "\xe8\xbc\xaa\0" /* offset 11686 */ + "\xe5\xbe\x8b\0" /* offset 11690 */ + "\xe6\x85\x84\0" /* offset 11694 */ + "\xe6\xa0\x97\0" /* offset 11698 */ + "\xe9\x9a\x86\0" /* offset 11702 */ + "\xe5\x88\xa9\0" /* offset 11706 */ + "\xe5\x90\x8f\0" /* offset 11710 */ + "\xe5\xb1\xa5\0" /* offset 11714 */ + "\xe6\x98\x93\0" /* offset 11718 */ + "\xe6\x9d\x8e\0" /* offset 11722 */ + "\xe6\xa2\xa8\0" /* offset 11726 */ + "\xe6\xb3\xa5\0" /* offset 11730 */ + "\xe7\x90\x86\0" /* offset 11734 */ + "\xe7\x97\xa2\0" /* offset 11738 */ + "\xe7\xbd\xb9\0" /* offset 11742 */ + "\xe8\xa3\x8f\0" /* offset 11746 */ + "\xe8\xa3\xa1\0" /* offset 11750 */ + "\xe9\x9b\xa2\0" /* offset 11754 */ + "\xe5\x8c\xbf\0" /* offset 11758 */ + "\xe6\xba\xba\0" /* offset 11762 */ + "\xe5\x90\x9d\0" /* offset 11766 */ + "\xe7\x87\x90\0" /* offset 11770 */ + "\xe7\x92\x98\0" /* offset 11774 */ + "\xe8\x97\xba\0" /* offset 11778 */ + "\xe9\x9a\xa3\0" /* offset 11782 */ + "\xe9\xb1\x97\0" /* offset 11786 */ + "\xe9\xba\x9f\0" /* offset 11790 */ + "\xe6\x9e\x97\0" /* offset 11794 */ + "\xe6\xb7\x8b\0" /* offset 11798 */ + "\xe8\x87\xa8\0" /* offset 11802 */ + "\xe7\xac\xa0\0" /* offset 11806 */ + "\xe7\xb2\x92\0" /* offset 11810 */ + "\xe7\x8b\x80\0" /* offset 11814 */ + "\xe7\x82\x99\0" /* offset 11818 */ + "\xe8\xad\x98\0" /* offset 11822 */ + "\xe4\xbb\x80\0" /* offset 11826 */ + "\xe8\x8c\xb6\0" /* offset 11830 */ + "\xe5\x88\xba\0" /* offset 11834 */ + "\xe5\x88\x87\0" /* offset 11838 */ + "\xe5\xba\xa6\0" /* offset 11842 */ + "\xe6\x8b\x93\0" /* offset 11846 */ + "\xe7\xb3\x96\0" /* offset 11850 */ + "\xe5\xae\x85\0" /* offset 11854 */ + "\xe6\xb4\x9e\0" /* offset 11858 */ + "\xe6\x9a\xb4\0" /* offset 11862 */ + "\xe8\xbc\xbb\0" /* offset 11866 */ + "\xe9\x99\x8d\0" /* offset 11870 */ + "\xe5\xbb\x93\0" /* offset 11874 */ + "\xe5\x85\x80\0" /* offset 11878 */ + "\xe5\x97\x80\0" /* offset 11882 */ + "\xe5\xa1\x9a\0" /* offset 11886 */ + "\xe6\x99\xb4\0" /* offset 11890 */ + "\xe5\x87\x9e\0" /* offset 11894 */ + "\xe7\x8c\xaa\0" /* offset 11898 */ + "\xe7\x9b\x8a\0" /* offset 11902 */ + "\xe7\xa4\xbc\0" /* offset 11906 */ + "\xe7\xa5\x9e\0" /* offset 11910 */ + "\xe7\xa5\xa5\0" /* offset 11914 */ + "\xe7\xa6\x8f\0" /* offset 11918 */ + "\xe9\x9d\x96\0" /* offset 11922 */ + "\xe7\xb2\xbe\0" /* offset 11926 */ + "\xe8\x98\x92\0" /* offset 11930 */ + "\xe8\xab\xb8\0" /* offset 11934 */ + "\xe9\x80\xb8\0" /* offset 11938 */ + "\xe9\x83\xbd\0" /* offset 11942 */ + "\xe9\xa3\xaf\0" /* offset 11946 */ + "\xe9\xa3\xbc\0" /* offset 11950 */ + "\xe9\xa4\xa8\0" /* offset 11954 */ + "\xe9\xb6\xb4\0" /* offset 11958 */ + "\xe9\x83\x9e\0" /* offset 11962 */ + "\xe9\x9a\xb7\0" /* offset 11966 */ + "\xe4\xbe\xae\0" /* offset 11970 */ + "\xe5\x83\xa7\0" /* offset 11974 */ + "\xe5\x85\x8d\0" /* offset 11978 */ + "\xe5\x8b\x89\0" /* offset 11982 */ + "\xe5\x8b\xa4\0" /* offset 11986 */ + "\xe5\x8d\x91\0" /* offset 11990 */ + "\xe5\x96\x9d\0" /* offset 11994 */ + "\xe5\x98\x86\0" /* offset 11998 */ + "\xe5\x99\xa8\0" /* offset 12002 */ + "\xe5\xa1\x80\0" /* offset 12006 */ + "\xe5\xa2\xa8\0" /* offset 12010 */ + "\xe5\xb1\xa4\0" /* offset 12014 */ + "\xe6\x82\x94\0" /* offset 12018 */ + "\xe6\x85\xa8\0" /* offset 12022 */ + "\xe6\x86\x8e\0" /* offset 12026 */ + "\xe6\x87\xb2\0" /* offset 12030 */ + "\xe6\x95\x8f\0" /* offset 12034 */ + "\xe6\x97\xa2\0" /* offset 12038 */ + "\xe6\x9a\x91\0" /* offset 12042 */ + "\xe6\xa2\x85\0" /* offset 12046 */ + "\xe6\xb5\xb7\0" /* offset 12050 */ + "\xe6\xb8\x9a\0" /* offset 12054 */ + "\xe6\xbc\xa2\0" /* offset 12058 */ + "\xe7\x85\xae\0" /* offset 12062 */ + "\xe7\x88\xab\0" /* offset 12066 */ + "\xe7\x90\xa2\0" /* offset 12070 */ + "\xe7\xa2\x91\0" /* offset 12074 */ + "\xe7\xa5\x89\0" /* offset 12078 */ + "\xe7\xa5\x88\0" /* offset 12082 */ + "\xe7\xa5\x90\0" /* offset 12086 */ + "\xe7\xa5\x96\0" /* offset 12090 */ + "\xe7\xa6\x8d\0" /* offset 12094 */ + "\xe7\xa6\x8e\0" /* offset 12098 */ + "\xe7\xa9\x80\0" /* offset 12102 */ + "\xe7\xaa\x81\0" /* offset 12106 */ + "\xe7\xaf\x80\0" /* offset 12110 */ + "\xe7\xb8\x89\0" /* offset 12114 */ + "\xe7\xb9\x81\0" /* offset 12118 */ + "\xe7\xbd\xb2\0" /* offset 12122 */ + "\xe8\x80\x85\0" /* offset 12126 */ + "\xe8\x87\xad\0" /* offset 12130 */ + "\xe8\x89\xb9\0" /* offset 12134 */ + "\xe8\x91\x97\0" /* offset 12138 */ + "\xe8\xa4\x90\0" /* offset 12142 */ + "\xe8\xa6\x96\0" /* offset 12146 */ + "\xe8\xac\x81\0" /* offset 12150 */ + "\xe8\xac\xb9\0" /* offset 12154 */ + "\xe8\xb3\x93\0" /* offset 12158 */ + "\xe8\xb4\x88\0" /* offset 12162 */ + "\xe8\xbe\xb6\0" /* offset 12166 */ + "\xe9\x9b\xa3\0" /* offset 12170 */ + "\xe9\x9f\xbf\0" /* offset 12174 */ + "\xe9\xa0\xbb\0" /* offset 12178 */ + "\xe6\x81\xb5\0" /* offset 12182 */ + "\xf0\xa4\x8b\xae\0" /* offset 12186 */ + "\xe8\x88\x98\0" /* offset 12191 */ + "\xe4\xb8\xa6\0" /* offset 12195 */ + "\xe5\x86\xb5\0" /* offset 12199 */ + "\xe5\x85\xa8\0" /* offset 12203 */ + "\xe4\xbe\x80\0" /* offset 12207 */ + "\xe5\x85\x85\0" /* offset 12211 */ + "\xe5\x86\x80\0" /* offset 12215 */ + "\xe5\x8b\x87\0" /* offset 12219 */ + "\xe5\x8b\xba\0" /* offset 12223 */ + "\xe5\x95\x95\0" /* offset 12227 */ + "\xe5\x96\x99\0" /* offset 12231 */ + "\xe5\x97\xa2\0" /* offset 12235 */ + "\xe5\xa2\xb3\0" /* offset 12239 */ + "\xe5\xa5\x84\0" /* offset 12243 */ + "\xe5\xa5\x94\0" /* offset 12247 */ + "\xe5\xa9\xa2\0" /* offset 12251 */ + "\xe5\xac\xa8\0" /* offset 12255 */ + "\xe5\xbb\x92\0" /* offset 12259 */ + "\xe5\xbb\x99\0" /* offset 12263 */ + "\xe5\xbd\xa9\0" /* offset 12267 */ + "\xe5\xbe\xad\0" /* offset 12271 */ + "\xe6\x83\x98\0" /* offset 12275 */ + "\xe6\x85\x8e\0" /* offset 12279 */ + "\xe6\x84\x88\0" /* offset 12283 */ + "\xe6\x85\xa0\0" /* offset 12287 */ + "\xe6\x88\xb4\0" /* offset 12291 */ + "\xe6\x8f\x84\0" /* offset 12295 */ + "\xe6\x90\x9c\0" /* offset 12299 */ + "\xe6\x91\x92\0" /* offset 12303 */ + "\xe6\x95\x96\0" /* offset 12307 */ + "\xe6\x9c\x9b\0" /* offset 12311 */ + "\xe6\x9d\x96\0" /* offset 12315 */ + "\xe6\xbb\x9b\0" /* offset 12319 */ + "\xe6\xbb\x8b\0" /* offset 12323 */ + "\xe7\x80\x9e\0" /* offset 12327 */ + "\xe7\x9e\xa7\0" /* offset 12331 */ + "\xe7\x88\xb5\0" /* offset 12335 */ + "\xe7\x8a\xaf\0" /* offset 12339 */ + "\xe7\x91\xb1\0" /* offset 12343 */ + "\xe7\x94\x86\0" /* offset 12347 */ + "\xe7\x94\xbb\0" /* offset 12351 */ + "\xe7\x98\x9d\0" /* offset 12355 */ + "\xe7\x98\x9f\0" /* offset 12359 */ + "\xe7\x9b\x9b\0" /* offset 12363 */ + "\xe7\x9b\xb4\0" /* offset 12367 */ + "\xe7\x9d\x8a\0" /* offset 12371 */ + "\xe7\x9d\x80\0" /* offset 12375 */ + "\xe7\xa3\x8c\0" /* offset 12379 */ + "\xe7\xaa\xb1\0" /* offset 12383 */ + "\xe7\xb1\xbb\0" /* offset 12387 */ + "\xe7\xb5\x9b\0" /* offset 12391 */ + "\xe7\xbc\xbe\0" /* offset 12395 */ + "\xe8\x8d\x92\0" /* offset 12399 */ + "\xe8\x8f\xaf\0" /* offset 12403 */ + "\xe8\x9d\xb9\0" /* offset 12407 */ + "\xe8\xa5\x81\0" /* offset 12411 */ + "\xe8\xa6\x86\0" /* offset 12415 */ + "\xe8\xaa\xbf\0" /* offset 12419 */ + "\xe8\xab\x8b\0" /* offset 12423 */ + "\xe8\xab\xad\0" /* offset 12427 */ + "\xe8\xae\x8a\0" /* offset 12431 */ + "\xe8\xbc\xb8\0" /* offset 12435 */ + "\xe9\x81\xb2\0" /* offset 12439 */ + "\xe9\x86\x99\0" /* offset 12443 */ + "\xe9\x89\xb6\0" /* offset 12447 */ + "\xe9\x99\xbc\0" /* offset 12451 */ + "\xe9\x9f\x9b\0" /* offset 12455 */ + "\xe9\xa0\x8b\0" /* offset 12459 */ + "\xe9\xac\x92\0" /* offset 12463 */ + "\xf0\xa2\xa1\x8a\0" /* offset 12467 */ + "\xf0\xa2\xa1\x84\0" /* offset 12472 */ + "\xf0\xa3\x8f\x95\0" /* offset 12477 */ + "\xe3\xae\x9d\0" /* offset 12482 */ + "\xe4\x80\x98\0" /* offset 12486 */ + "\xe4\x80\xb9\0" /* offset 12490 */ + "\xf0\xa5\x89\x89\0" /* offset 12494 */ + "\xf0\xa5\xb3\x90\0" /* offset 12499 */ + "\xf0\xa7\xbb\x93\0" /* offset 12504 */ + "\xe9\xbd\x83\0" /* offset 12509 */ + "\xe9\xbe\x8e\0" /* offset 12513 */ + "\x66\x66\0" /* offset 12517 */ + "\x66\x69\0" /* offset 12520 */ + "\x66\x6c\0" /* offset 12523 */ + "\x66\x66\x69\0" /* offset 12526 */ + "\x66\x66\x6c\0" /* offset 12530 */ + "\x73\x74\0" /* offset 12534 */ + "\xd5\xb4\xd5\xb6\0" /* offset 12537 */ + "\xd5\xb4\xd5\xa5\0" /* offset 12542 */ + "\xd5\xb4\xd5\xab\0" /* offset 12547 */ + "\xd5\xbe\xd5\xb6\0" /* offset 12552 */ + "\xd5\xb4\xd5\xad\0" /* offset 12557 */ + "\xd7\x99\xd6\xb4\0" /* offset 12562 */ + "\xd7\xb2\xd6\xb7\0" /* offset 12567 */ + "\xd7\xa2\0" /* offset 12572 */ + "\xd7\x94\0" /* offset 12575 */ + "\xd7\x9b\0" /* offset 12578 */ + "\xd7\x9c\0" /* offset 12581 */ + "\xd7\x9d\0" /* offset 12584 */ + "\xd7\xa8\0" /* offset 12587 */ + "\xd7\xaa\0" /* offset 12590 */ + "\xd7\xa9\xd7\x81\0" /* offset 12593 */ + "\xd7\xa9\xd7\x82\0" /* offset 12598 */ + "\xd7\xa9\xd6\xbc\xd7\x81\0" /* offset 12603 */ + "\xd7\xa9\xd6\xbc\xd7\x82\0" /* offset 12610 */ + "\xd7\x90\xd6\xb7\0" /* offset 12617 */ + "\xd7\x90\xd6\xb8\0" /* offset 12622 */ + "\xd7\x90\xd6\xbc\0" /* offset 12627 */ + "\xd7\x91\xd6\xbc\0" /* offset 12632 */ + "\xd7\x92\xd6\xbc\0" /* offset 12637 */ + "\xd7\x93\xd6\xbc\0" /* offset 12642 */ + "\xd7\x94\xd6\xbc\0" /* offset 12647 */ + "\xd7\x95\xd6\xbc\0" /* offset 12652 */ + "\xd7\x96\xd6\xbc\0" /* offset 12657 */ + "\xd7\x98\xd6\xbc\0" /* offset 12662 */ + "\xd7\x99\xd6\xbc\0" /* offset 12667 */ + "\xd7\x9a\xd6\xbc\0" /* offset 12672 */ + "\xd7\x9b\xd6\xbc\0" /* offset 12677 */ + "\xd7\x9c\xd6\xbc\0" /* offset 12682 */ + "\xd7\x9e\xd6\xbc\0" /* offset 12687 */ + "\xd7\xa0\xd6\xbc\0" /* offset 12692 */ + "\xd7\xa1\xd6\xbc\0" /* offset 12697 */ + "\xd7\xa3\xd6\xbc\0" /* offset 12702 */ + "\xd7\xa4\xd6\xbc\0" /* offset 12707 */ + "\xd7\xa6\xd6\xbc\0" /* offset 12712 */ + "\xd7\xa7\xd6\xbc\0" /* offset 12717 */ + "\xd7\xa8\xd6\xbc\0" /* offset 12722 */ + "\xd7\xa9\xd6\xbc\0" /* offset 12727 */ + "\xd7\xaa\xd6\xbc\0" /* offset 12732 */ + "\xd7\x95\xd6\xb9\0" /* offset 12737 */ + "\xd7\x91\xd6\xbf\0" /* offset 12742 */ + "\xd7\x9b\xd6\xbf\0" /* offset 12747 */ + "\xd7\xa4\xd6\xbf\0" /* offset 12752 */ + "\xd7\x90\xd7\x9c\0" /* offset 12757 */ + "\xd9\xb1\0" /* offset 12762 */ + "\xd9\xbb\0" /* offset 12765 */ + "\xd9\xbe\0" /* offset 12768 */ + "\xda\x80\0" /* offset 12771 */ + "\xd9\xba\0" /* offset 12774 */ + "\xd9\xbf\0" /* offset 12777 */ + "\xd9\xb9\0" /* offset 12780 */ + "\xda\xa4\0" /* offset 12783 */ + "\xda\xa6\0" /* offset 12786 */ + "\xda\x84\0" /* offset 12789 */ + "\xda\x83\0" /* offset 12792 */ + "\xda\x86\0" /* offset 12795 */ + "\xda\x87\0" /* offset 12798 */ + "\xda\x8d\0" /* offset 12801 */ + "\xda\x8c\0" /* offset 12804 */ + "\xda\x8e\0" /* offset 12807 */ + "\xda\x88\0" /* offset 12810 */ + "\xda\x98\0" /* offset 12813 */ + "\xda\x91\0" /* offset 12816 */ + "\xda\xa9\0" /* offset 12819 */ + "\xda\xaf\0" /* offset 12822 */ + "\xda\xb3\0" /* offset 12825 */ + "\xda\xb1\0" /* offset 12828 */ + "\xda\xba\0" /* offset 12831 */ + "\xda\xbb\0" /* offset 12834 */ + "\xdb\x81\0" /* offset 12837 */ + "\xda\xbe\0" /* offset 12840 */ + "\xdb\x92\0" /* offset 12843 */ + "\xda\xad\0" /* offset 12846 */ + "\xdb\x87\0" /* offset 12849 */ + "\xdb\x86\0" /* offset 12852 */ + "\xdb\x88\0" /* offset 12855 */ + "\xdb\x8b\0" /* offset 12858 */ + "\xdb\x85\0" /* offset 12861 */ + "\xdb\x89\0" /* offset 12864 */ + "\xdb\x90\0" /* offset 12867 */ + "\xd9\x89\0" /* offset 12870 */ + "\xd9\x8a\xd9\x94\xd8\xa7\0" /* offset 12873 */ + "\xd9\x8a\xd9\x94\xdb\x95\0" /* offset 12880 */ + "\xd9\x8a\xd9\x94\xd9\x88\0" /* offset 12887 */ + "\xd9\x8a\xd9\x94\xdb\x87\0" /* offset 12894 */ + "\xd9\x8a\xd9\x94\xdb\x86\0" /* offset 12901 */ + "\xd9\x8a\xd9\x94\xdb\x88\0" /* offset 12908 */ + "\xd9\x8a\xd9\x94\xdb\x90\0" /* offset 12915 */ + "\xd9\x8a\xd9\x94\xd9\x89\0" /* offset 12922 */ + "\xdb\x8c\0" /* offset 12929 */ + "\xd9\x8a\xd9\x94\xd8\xac\0" /* offset 12932 */ + "\xd9\x8a\xd9\x94\xd8\xad\0" /* offset 12939 */ + "\xd9\x8a\xd9\x94\xd9\x85\0" /* offset 12946 */ + "\xd9\x8a\xd9\x94\xd9\x8a\0" /* offset 12953 */ + "\xd8\xa8\xd8\xac\0" /* offset 12960 */ + "\xd8\xa8\xd8\xad\0" /* offset 12965 */ + "\xd8\xa8\xd8\xae\0" /* offset 12970 */ + "\xd8\xa8\xd9\x85\0" /* offset 12975 */ + "\xd8\xa8\xd9\x89\0" /* offset 12980 */ + "\xd8\xa8\xd9\x8a\0" /* offset 12985 */ + "\xd8\xaa\xd8\xac\0" /* offset 12990 */ + "\xd8\xaa\xd8\xad\0" /* offset 12995 */ + "\xd8\xaa\xd8\xae\0" /* offset 13000 */ + "\xd8\xaa\xd9\x85\0" /* offset 13005 */ + "\xd8\xaa\xd9\x89\0" /* offset 13010 */ + "\xd8\xaa\xd9\x8a\0" /* offset 13015 */ + "\xd8\xab\xd8\xac\0" /* offset 13020 */ + "\xd8\xab\xd9\x85\0" /* offset 13025 */ + "\xd8\xab\xd9\x89\0" /* offset 13030 */ + "\xd8\xab\xd9\x8a\0" /* offset 13035 */ + "\xd8\xac\xd8\xad\0" /* offset 13040 */ + "\xd8\xac\xd9\x85\0" /* offset 13045 */ + "\xd8\xad\xd8\xac\0" /* offset 13050 */ + "\xd8\xad\xd9\x85\0" /* offset 13055 */ + "\xd8\xae\xd8\xac\0" /* offset 13060 */ + "\xd8\xae\xd8\xad\0" /* offset 13065 */ + "\xd8\xae\xd9\x85\0" /* offset 13070 */ + "\xd8\xb3\xd8\xac\0" /* offset 13075 */ + "\xd8\xb3\xd8\xad\0" /* offset 13080 */ + "\xd8\xb3\xd8\xae\0" /* offset 13085 */ + "\xd8\xb3\xd9\x85\0" /* offset 13090 */ + "\xd8\xb5\xd8\xad\0" /* offset 13095 */ + "\xd8\xb5\xd9\x85\0" /* offset 13100 */ + "\xd8\xb6\xd8\xac\0" /* offset 13105 */ + "\xd8\xb6\xd8\xad\0" /* offset 13110 */ + "\xd8\xb6\xd8\xae\0" /* offset 13115 */ + "\xd8\xb6\xd9\x85\0" /* offset 13120 */ + "\xd8\xb7\xd8\xad\0" /* offset 13125 */ + "\xd8\xb7\xd9\x85\0" /* offset 13130 */ + "\xd8\xb8\xd9\x85\0" /* offset 13135 */ + "\xd8\xb9\xd8\xac\0" /* offset 13140 */ + "\xd8\xb9\xd9\x85\0" /* offset 13145 */ + "\xd8\xba\xd8\xac\0" /* offset 13150 */ + "\xd8\xba\xd9\x85\0" /* offset 13155 */ + "\xd9\x81\xd8\xac\0" /* offset 13160 */ + "\xd9\x81\xd8\xad\0" /* offset 13165 */ + "\xd9\x81\xd8\xae\0" /* offset 13170 */ + "\xd9\x81\xd9\x85\0" /* offset 13175 */ + "\xd9\x81\xd9\x89\0" /* offset 13180 */ + "\xd9\x81\xd9\x8a\0" /* offset 13185 */ + "\xd9\x82\xd8\xad\0" /* offset 13190 */ + "\xd9\x82\xd9\x85\0" /* offset 13195 */ + "\xd9\x82\xd9\x89\0" /* offset 13200 */ + "\xd9\x82\xd9\x8a\0" /* offset 13205 */ + "\xd9\x83\xd8\xa7\0" /* offset 13210 */ + "\xd9\x83\xd8\xac\0" /* offset 13215 */ + "\xd9\x83\xd8\xad\0" /* offset 13220 */ + "\xd9\x83\xd8\xae\0" /* offset 13225 */ + "\xd9\x83\xd9\x84\0" /* offset 13230 */ + "\xd9\x83\xd9\x85\0" /* offset 13235 */ + "\xd9\x83\xd9\x89\0" /* offset 13240 */ + "\xd9\x83\xd9\x8a\0" /* offset 13245 */ + "\xd9\x84\xd8\xac\0" /* offset 13250 */ + "\xd9\x84\xd8\xad\0" /* offset 13255 */ + "\xd9\x84\xd8\xae\0" /* offset 13260 */ + "\xd9\x84\xd9\x85\0" /* offset 13265 */ + "\xd9\x84\xd9\x89\0" /* offset 13270 */ + "\xd9\x84\xd9\x8a\0" /* offset 13275 */ + "\xd9\x85\xd8\xac\0" /* offset 13280 */ + "\xd9\x85\xd8\xad\0" /* offset 13285 */ + "\xd9\x85\xd8\xae\0" /* offset 13290 */ + "\xd9\x85\xd9\x85\0" /* offset 13295 */ + "\xd9\x85\xd9\x89\0" /* offset 13300 */ + "\xd9\x85\xd9\x8a\0" /* offset 13305 */ + "\xd9\x86\xd8\xac\0" /* offset 13310 */ + "\xd9\x86\xd8\xad\0" /* offset 13315 */ + "\xd9\x86\xd8\xae\0" /* offset 13320 */ + "\xd9\x86\xd9\x85\0" /* offset 13325 */ + "\xd9\x86\xd9\x89\0" /* offset 13330 */ + "\xd9\x86\xd9\x8a\0" /* offset 13335 */ + "\xd9\x87\xd8\xac\0" /* offset 13340 */ + "\xd9\x87\xd9\x85\0" /* offset 13345 */ + "\xd9\x87\xd9\x89\0" /* offset 13350 */ + "\xd9\x87\xd9\x8a\0" /* offset 13355 */ + "\xd9\x8a\xd8\xac\0" /* offset 13360 */ + "\xd9\x8a\xd8\xad\0" /* offset 13365 */ + "\xd9\x8a\xd8\xae\0" /* offset 13370 */ + "\xd9\x8a\xd9\x85\0" /* offset 13375 */ + "\xd9\x8a\xd9\x89\0" /* offset 13380 */ + "\xd9\x8a\xd9\x8a\0" /* offset 13385 */ + "\xd8\xb0\xd9\xb0\0" /* offset 13390 */ + "\xd8\xb1\xd9\xb0\0" /* offset 13395 */ + "\xd9\x89\xd9\xb0\0" /* offset 13400 */ + "\x20\xd9\x8c\xd9\x91\0" /* offset 13405 */ + "\x20\xd9\x8d\xd9\x91\0" /* offset 13411 */ + "\x20\xd9\x8e\xd9\x91\0" /* offset 13417 */ + "\x20\xd9\x8f\xd9\x91\0" /* offset 13423 */ + "\x20\xd9\x90\xd9\x91\0" /* offset 13429 */ + "\x20\xd9\x91\xd9\xb0\0" /* offset 13435 */ + "\xd9\x8a\xd9\x94\xd8\xb1\0" /* offset 13441 */ + "\xd9\x8a\xd9\x94\xd8\xb2\0" /* offset 13448 */ + "\xd9\x8a\xd9\x94\xd9\x86\0" /* offset 13455 */ + "\xd8\xa8\xd8\xb1\0" /* offset 13462 */ + "\xd8\xa8\xd8\xb2\0" /* offset 13467 */ + "\xd8\xa8\xd9\x86\0" /* offset 13472 */ + "\xd8\xaa\xd8\xb1\0" /* offset 13477 */ + "\xd8\xaa\xd8\xb2\0" /* offset 13482 */ + "\xd8\xaa\xd9\x86\0" /* offset 13487 */ + "\xd8\xab\xd8\xb1\0" /* offset 13492 */ + "\xd8\xab\xd8\xb2\0" /* offset 13497 */ + "\xd8\xab\xd9\x86\0" /* offset 13502 */ + "\xd9\x85\xd8\xa7\0" /* offset 13507 */ + "\xd9\x86\xd8\xb1\0" /* offset 13512 */ + "\xd9\x86\xd8\xb2\0" /* offset 13517 */ + "\xd9\x86\xd9\x86\0" /* offset 13522 */ + "\xd9\x8a\xd8\xb1\0" /* offset 13527 */ + "\xd9\x8a\xd8\xb2\0" /* offset 13532 */ + "\xd9\x8a\xd9\x86\0" /* offset 13537 */ + "\xd9\x8a\xd9\x94\xd8\xae\0" /* offset 13542 */ + "\xd9\x8a\xd9\x94\xd9\x87\0" /* offset 13549 */ + "\xd8\xa8\xd9\x87\0" /* offset 13556 */ + "\xd8\xaa\xd9\x87\0" /* offset 13561 */ + "\xd8\xb5\xd8\xae\0" /* offset 13566 */ + "\xd9\x84\xd9\x87\0" /* offset 13571 */ + "\xd9\x86\xd9\x87\0" /* offset 13576 */ + "\xd9\x87\xd9\xb0\0" /* offset 13581 */ + "\xd9\x8a\xd9\x87\0" /* offset 13586 */ + "\xd8\xab\xd9\x87\0" /* offset 13591 */ + "\xd8\xb3\xd9\x87\0" /* offset 13596 */ + "\xd8\xb4\xd9\x85\0" /* offset 13601 */ + "\xd8\xb4\xd9\x87\0" /* offset 13606 */ + "\xd9\x80\xd9\x8e\xd9\x91\0" /* offset 13611 */ + "\xd9\x80\xd9\x8f\xd9\x91\0" /* offset 13618 */ + "\xd9\x80\xd9\x90\xd9\x91\0" /* offset 13625 */ + "\xd8\xb7\xd9\x89\0" /* offset 13632 */ + "\xd8\xb7\xd9\x8a\0" /* offset 13637 */ + "\xd8\xb9\xd9\x89\0" /* offset 13642 */ + "\xd8\xb9\xd9\x8a\0" /* offset 13647 */ + "\xd8\xba\xd9\x89\0" /* offset 13652 */ + "\xd8\xba\xd9\x8a\0" /* offset 13657 */ + "\xd8\xb3\xd9\x89\0" /* offset 13662 */ + "\xd8\xb3\xd9\x8a\0" /* offset 13667 */ + "\xd8\xb4\xd9\x89\0" /* offset 13672 */ + "\xd8\xb4\xd9\x8a\0" /* offset 13677 */ + "\xd8\xad\xd9\x89\0" /* offset 13682 */ + "\xd8\xad\xd9\x8a\0" /* offset 13687 */ + "\xd8\xac\xd9\x89\0" /* offset 13692 */ + "\xd8\xac\xd9\x8a\0" /* offset 13697 */ + "\xd8\xae\xd9\x89\0" /* offset 13702 */ + "\xd8\xae\xd9\x8a\0" /* offset 13707 */ + "\xd8\xb5\xd9\x89\0" /* offset 13712 */ + "\xd8\xb5\xd9\x8a\0" /* offset 13717 */ + "\xd8\xb6\xd9\x89\0" /* offset 13722 */ + "\xd8\xb6\xd9\x8a\0" /* offset 13727 */ + "\xd8\xb4\xd8\xac\0" /* offset 13732 */ + "\xd8\xb4\xd8\xad\0" /* offset 13737 */ + "\xd8\xb4\xd8\xae\0" /* offset 13742 */ + "\xd8\xb4\xd8\xb1\0" /* offset 13747 */ + "\xd8\xb3\xd8\xb1\0" /* offset 13752 */ + "\xd8\xb5\xd8\xb1\0" /* offset 13757 */ + "\xd8\xb6\xd8\xb1\0" /* offset 13762 */ + "\xd8\xa7\xd9\x8b\0" /* offset 13767 */ + "\xd8\xaa\xd8\xac\xd9\x85\0" /* offset 13772 */ + "\xd8\xaa\xd8\xad\xd8\xac\0" /* offset 13779 */ + "\xd8\xaa\xd8\xad\xd9\x85\0" /* offset 13786 */ + "\xd8\xaa\xd8\xae\xd9\x85\0" /* offset 13793 */ + "\xd8\xaa\xd9\x85\xd8\xac\0" /* offset 13800 */ + "\xd8\xaa\xd9\x85\xd8\xad\0" /* offset 13807 */ + "\xd8\xaa\xd9\x85\xd8\xae\0" /* offset 13814 */ + "\xd8\xac\xd9\x85\xd8\xad\0" /* offset 13821 */ + "\xd8\xad\xd9\x85\xd9\x8a\0" /* offset 13828 */ + "\xd8\xad\xd9\x85\xd9\x89\0" /* offset 13835 */ + "\xd8\xb3\xd8\xad\xd8\xac\0" /* offset 13842 */ + "\xd8\xb3\xd8\xac\xd8\xad\0" /* offset 13849 */ + "\xd8\xb3\xd8\xac\xd9\x89\0" /* offset 13856 */ + "\xd8\xb3\xd9\x85\xd8\xad\0" /* offset 13863 */ + "\xd8\xb3\xd9\x85\xd8\xac\0" /* offset 13870 */ + "\xd8\xb3\xd9\x85\xd9\x85\0" /* offset 13877 */ + "\xd8\xb5\xd8\xad\xd8\xad\0" /* offset 13884 */ + "\xd8\xb5\xd9\x85\xd9\x85\0" /* offset 13891 */ + "\xd8\xb4\xd8\xad\xd9\x85\0" /* offset 13898 */ + "\xd8\xb4\xd8\xac\xd9\x8a\0" /* offset 13905 */ + "\xd8\xb4\xd9\x85\xd8\xae\0" /* offset 13912 */ + "\xd8\xb4\xd9\x85\xd9\x85\0" /* offset 13919 */ + "\xd8\xb6\xd8\xad\xd9\x89\0" /* offset 13926 */ + "\xd8\xb6\xd8\xae\xd9\x85\0" /* offset 13933 */ + "\xd8\xb7\xd9\x85\xd8\xad\0" /* offset 13940 */ + "\xd8\xb7\xd9\x85\xd9\x85\0" /* offset 13947 */ + "\xd8\xb7\xd9\x85\xd9\x8a\0" /* offset 13954 */ + "\xd8\xb9\xd8\xac\xd9\x85\0" /* offset 13961 */ + "\xd8\xb9\xd9\x85\xd9\x85\0" /* offset 13968 */ + "\xd8\xb9\xd9\x85\xd9\x89\0" /* offset 13975 */ + "\xd8\xba\xd9\x85\xd9\x85\0" /* offset 13982 */ + "\xd8\xba\xd9\x85\xd9\x8a\0" /* offset 13989 */ + "\xd8\xba\xd9\x85\xd9\x89\0" /* offset 13996 */ + "\xd9\x81\xd8\xae\xd9\x85\0" /* offset 14003 */ + "\xd9\x82\xd9\x85\xd8\xad\0" /* offset 14010 */ + "\xd9\x82\xd9\x85\xd9\x85\0" /* offset 14017 */ + "\xd9\x84\xd8\xad\xd9\x85\0" /* offset 14024 */ + "\xd9\x84\xd8\xad\xd9\x8a\0" /* offset 14031 */ + "\xd9\x84\xd8\xad\xd9\x89\0" /* offset 14038 */ + "\xd9\x84\xd8\xac\xd8\xac\0" /* offset 14045 */ + "\xd9\x84\xd8\xae\xd9\x85\0" /* offset 14052 */ + "\xd9\x84\xd9\x85\xd8\xad\0" /* offset 14059 */ + "\xd9\x85\xd8\xad\xd8\xac\0" /* offset 14066 */ + "\xd9\x85\xd8\xad\xd9\x85\0" /* offset 14073 */ + "\xd9\x85\xd8\xad\xd9\x8a\0" /* offset 14080 */ + "\xd9\x85\xd8\xac\xd8\xad\0" /* offset 14087 */ + "\xd9\x85\xd8\xac\xd9\x85\0" /* offset 14094 */ + "\xd9\x85\xd8\xae\xd8\xac\0" /* offset 14101 */ + "\xd9\x85\xd8\xae\xd9\x85\0" /* offset 14108 */ + "\xd9\x85\xd8\xac\xd8\xae\0" /* offset 14115 */ + "\xd9\x87\xd9\x85\xd8\xac\0" /* offset 14122 */ + "\xd9\x87\xd9\x85\xd9\x85\0" /* offset 14129 */ + "\xd9\x86\xd8\xad\xd9\x85\0" /* offset 14136 */ + "\xd9\x86\xd8\xad\xd9\x89\0" /* offset 14143 */ + "\xd9\x86\xd8\xac\xd9\x85\0" /* offset 14150 */ + "\xd9\x86\xd8\xac\xd9\x89\0" /* offset 14157 */ + "\xd9\x86\xd9\x85\xd9\x8a\0" /* offset 14164 */ + "\xd9\x86\xd9\x85\xd9\x89\0" /* offset 14171 */ + "\xd9\x8a\xd9\x85\xd9\x85\0" /* offset 14178 */ + "\xd8\xa8\xd8\xae\xd9\x8a\0" /* offset 14185 */ + "\xd8\xaa\xd8\xac\xd9\x8a\0" /* offset 14192 */ + "\xd8\xaa\xd8\xac\xd9\x89\0" /* offset 14199 */ + "\xd8\xaa\xd8\xae\xd9\x8a\0" /* offset 14206 */ + "\xd8\xaa\xd8\xae\xd9\x89\0" /* offset 14213 */ + "\xd8\xaa\xd9\x85\xd9\x8a\0" /* offset 14220 */ + "\xd8\xaa\xd9\x85\xd9\x89\0" /* offset 14227 */ + "\xd8\xac\xd9\x85\xd9\x8a\0" /* offset 14234 */ + "\xd8\xac\xd8\xad\xd9\x89\0" /* offset 14241 */ + "\xd8\xac\xd9\x85\xd9\x89\0" /* offset 14248 */ + "\xd8\xb3\xd8\xae\xd9\x89\0" /* offset 14255 */ + "\xd8\xb5\xd8\xad\xd9\x8a\0" /* offset 14262 */ + "\xd8\xb4\xd8\xad\xd9\x8a\0" /* offset 14269 */ + "\xd8\xb6\xd8\xad\xd9\x8a\0" /* offset 14276 */ + "\xd9\x84\xd8\xac\xd9\x8a\0" /* offset 14283 */ + "\xd9\x84\xd9\x85\xd9\x8a\0" /* offset 14290 */ + "\xd9\x8a\xd8\xad\xd9\x8a\0" /* offset 14297 */ + "\xd9\x8a\xd8\xac\xd9\x8a\0" /* offset 14304 */ + "\xd9\x8a\xd9\x85\xd9\x8a\0" /* offset 14311 */ + "\xd9\x85\xd9\x85\xd9\x8a\0" /* offset 14318 */ + "\xd9\x82\xd9\x85\xd9\x8a\0" /* offset 14325 */ + "\xd9\x86\xd8\xad\xd9\x8a\0" /* offset 14332 */ + "\xd8\xb9\xd9\x85\xd9\x8a\0" /* offset 14339 */ + "\xd9\x83\xd9\x85\xd9\x8a\0" /* offset 14346 */ + "\xd9\x86\xd8\xac\xd8\xad\0" /* offset 14353 */ + "\xd9\x85\xd8\xae\xd9\x8a\0" /* offset 14360 */ + "\xd9\x84\xd8\xac\xd9\x85\0" /* offset 14367 */ + "\xd9\x83\xd9\x85\xd9\x85\0" /* offset 14374 */ + "\xd8\xac\xd8\xad\xd9\x8a\0" /* offset 14381 */ + "\xd8\xad\xd8\xac\xd9\x8a\0" /* offset 14388 */ + "\xd9\x85\xd8\xac\xd9\x8a\0" /* offset 14395 */ + "\xd9\x81\xd9\x85\xd9\x8a\0" /* offset 14402 */ + "\xd8\xa8\xd8\xad\xd9\x8a\0" /* offset 14409 */ + "\xd8\xb3\xd8\xae\xd9\x8a\0" /* offset 14416 */ + "\xd9\x86\xd8\xac\xd9\x8a\0" /* offset 14423 */ + "\xd8\xb5\xd9\x84\xdb\x92\0" /* offset 14430 */ + "\xd9\x82\xd9\x84\xdb\x92\0" /* offset 14437 */ + "\xd8\xa7\xd9\x84\xd9\x84\xd9\x87\0" /* offset 14444 */ + "\xd8\xa7\xd9\x83\xd8\xa8\xd8\xb1\0" /* offset 14453 */ + "\xd9\x85\xd8\xad\xd9\x85\xd8\xaf\0" /* offset 14462 */ + "\xd8\xb5\xd9\x84\xd8\xb9\xd9\x85\0" /* offset 14471 */ + "\xd8\xb1\xd8\xb3\xd9\x88\xd9\x84\0" /* offset 14480 */ + "\xd8\xb9\xd9\x84\xd9\x8a\xd9\x87\0" /* offset 14489 */ + "\xd9\x88\xd8\xb3\xd9\x84\xd9\x85\0" /* offset 14498 */ + "\xd8\xb5\xd9\x84\xd9\x89\0" /* offset 14507 */ + "\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 14514 */ + "\xd8\xac\xd9\x84\x20\xd8\xac\xd9\x84\xd8\xa7\xd9\x84\xd9\x87\0" /* offset 14548 */ + "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" /* offset 14564 */ + "\x2c\0" /* offset 14573 */ + "\xe3\x80\x81\0" /* offset 14575 */ + "\xe3\x80\x82\0" /* offset 14579 */ + "\x3a\0" /* offset 14583 */ + "\x21\0" /* offset 14585 */ + "\x3f\0" /* offset 14587 */ + "\xe3\x80\x96\0" /* offset 14589 */ + "\xe3\x80\x97\0" /* offset 14593 */ + "\xe2\x80\x94\0" /* offset 14597 */ + "\xe2\x80\x93\0" /* offset 14601 */ + "\x5f\0" /* offset 14605 */ + "\x7b\0" /* offset 14607 */ + "\x7d\0" /* offset 14609 */ + "\xe3\x80\x94\0" /* offset 14611 */ + "\xe3\x80\x95\0" /* offset 14615 */ + "\xe3\x80\x90\0" /* offset 14619 */ + "\xe3\x80\x91\0" /* offset 14623 */ + "\xe3\x80\x8a\0" /* offset 14627 */ + "\xe3\x80\x8b\0" /* offset 14631 */ + "\xe3\x80\x8c\0" /* offset 14635 */ + "\xe3\x80\x8d\0" /* offset 14639 */ + "\xe3\x80\x8e\0" /* offset 14643 */ + "\xe3\x80\x8f\0" /* offset 14647 */ + "\x5b\0" /* offset 14651 */ + "\x5d\0" /* offset 14653 */ + "\x23\0" /* offset 14655 */ + "\x26\0" /* offset 14657 */ + "\x2a\0" /* offset 14659 */ + "\x2d\0" /* offset 14661 */ + "\x3c\0" /* offset 14663 */ + "\x3e\0" /* offset 14665 */ + "\x5c\0" /* offset 14667 */ + "\x24\0" /* offset 14669 */ + "\x25\0" /* offset 14671 */ + "\x40\0" /* offset 14673 */ + "\x20\xd9\x8b\0" /* offset 14675 */ + "\xd9\x80\xd9\x8b\0" /* offset 14679 */ + "\x20\xd9\x8c\0" /* offset 14684 */ + "\x20\xd9\x8d\0" /* offset 14688 */ + "\x20\xd9\x8e\0" /* offset 14692 */ + "\xd9\x80\xd9\x8e\0" /* offset 14696 */ + "\x20\xd9\x8f\0" /* offset 14701 */ + "\xd9\x80\xd9\x8f\0" /* offset 14705 */ + "\x20\xd9\x90\0" /* offset 14710 */ + "\xd9\x80\xd9\x90\0" /* offset 14714 */ + "\x20\xd9\x91\0" /* offset 14719 */ + "\xd9\x80\xd9\x91\0" /* offset 14723 */ + "\x20\xd9\x92\0" /* offset 14728 */ + "\xd9\x80\xd9\x92\0" /* offset 14732 */ + "\xd8\xa1\0" /* offset 14737 */ + "\xd8\xa7\0" /* offset 14740 */ + "\xd8\xa8\0" /* offset 14743 */ + "\xd8\xa9\0" /* offset 14746 */ + "\xd8\xaa\0" /* offset 14749 */ + "\xd8\xab\0" /* offset 14752 */ + "\xd8\xac\0" /* offset 14755 */ + "\xd8\xad\0" /* offset 14758 */ + "\xd8\xae\0" /* offset 14761 */ + "\xd8\xaf\0" /* offset 14764 */ + "\xd8\xb0\0" /* offset 14767 */ + "\xd8\xb1\0" /* offset 14770 */ + "\xd8\xb2\0" /* offset 14773 */ + "\xd8\xb3\0" /* offset 14776 */ + "\xd8\xb4\0" /* offset 14779 */ + "\xd8\xb5\0" /* offset 14782 */ + "\xd8\xb6\0" /* offset 14785 */ + "\xd8\xb7\0" /* offset 14788 */ + "\xd8\xb8\0" /* offset 14791 */ + "\xd8\xb9\0" /* offset 14794 */ + "\xd8\xba\0" /* offset 14797 */ + "\xd9\x81\0" /* offset 14800 */ + "\xd9\x82\0" /* offset 14803 */ + "\xd9\x83\0" /* offset 14806 */ + "\xd9\x84\0" /* offset 14809 */ + "\xd9\x85\0" /* offset 14812 */ + "\xd9\x86\0" /* offset 14815 */ + "\xd9\x87\0" /* offset 14818 */ + "\xd9\x88\0" /* offset 14821 */ + "\xd9\x8a\0" /* offset 14824 */ + "\xd9\x84\xd8\xa7\xd9\x93\0" /* offset 14827 */ + "\xd9\x84\xd8\xa7\xd9\x94\0" /* offset 14834 */ + "\xd9\x84\xd8\xa7\xd9\x95\0" /* offset 14841 */ + "\xd9\x84\xd8\xa7\0" /* offset 14848 */ + "\x22\0" /* offset 14853 */ + "\x27\0" /* offset 14855 */ + "\x2f\0" /* offset 14857 */ + "\x5e\0" /* offset 14859 */ + "\x7c\0" /* offset 14861 */ + "\x7e\0" /* offset 14863 */ + "\xe2\xa6\x85\0" /* offset 14865 */ + "\xe2\xa6\x86\0" /* offset 14869 */ + "\xe3\x83\xbb\0" /* offset 14873 */ + "\xe3\x82\xa1\0" /* offset 14877 */ + "\xe3\x82\xa3\0" /* offset 14881 */ + "\xe3\x82\xa5\0" /* offset 14885 */ + "\xe3\x82\xa7\0" /* offset 14889 */ + "\xe3\x82\xa9\0" /* offset 14893 */ + "\xe3\x83\xa3\0" /* offset 14897 */ + "\xe3\x83\xa5\0" /* offset 14901 */ + "\xe3\x83\xa7\0" /* offset 14905 */ + "\xe3\x83\x83\0" /* offset 14909 */ + "\xe3\x83\xbc\0" /* offset 14913 */ + "\xe3\x83\xb3\0" /* offset 14917 */ + "\xe3\x82\x99\0" /* offset 14921 */ + "\xe3\x82\x9a\0" /* offset 14925 */ + "\xc2\xa2\0" /* offset 14929 */ + "\xc2\xa3\0" /* offset 14932 */ + "\xc2\xac\0" /* offset 14935 */ + "\xc2\xa6\0" /* offset 14938 */ + "\xc2\xa5\0" /* offset 14941 */ + "\xe2\x82\xa9\0" /* offset 14944 */ + "\xe2\x94\x82\0" /* offset 14948 */ + "\xe2\x86\x90\0" /* offset 14952 */ + "\xe2\x86\x91\0" /* offset 14956 */ + "\xe2\x86\x92\0" /* offset 14960 */ + "\xe2\x86\x93\0" /* offset 14964 */ + "\xe2\x96\xa0\0" /* offset 14968 */ + "\xe2\x97\x8b\0" /* offset 14972 */ + "\xf0\x91\x82\x99\xf0\x91\x82\xba\0" /* offset 14976 */ + "\xf0\x91\x82\x9b\xf0\x91\x82\xba\0" /* offset 14985 */ + "\xf0\x91\x82\xa5\xf0\x91\x82\xba\0" /* offset 14994 */ + "\xf0\x91\x84\xb1\xf0\x91\x84\xa7\0" /* offset 15003 */ + "\xf0\x91\x84\xb2\xf0\x91\x84\xa7\0" /* offset 15012 */ + "\xf0\x9d\x85\x97\xf0\x9d\x85\xa5\0" /* offset 15021 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\0" /* offset 15030 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15039 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15052 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb0\0" /* offset 15065 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb1\0" /* offset 15078 */ + "\xf0\x9d\x85\x98\xf0\x9d\x85\xa5\xf0\x9d\x85\xb2\0" /* offset 15091 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\0" /* offset 15104 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\0" /* offset 15113 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15122 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xae\0" /* offset 15135 */ + "\xf0\x9d\x86\xb9\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15148 */ + "\xf0\x9d\x86\xba\xf0\x9d\x85\xa5\xf0\x9d\x85\xaf\0" /* offset 15161 */ + "\xc4\xb1\0" /* offset 15174 */ + "\xc8\xb7\0" /* offset 15177 */ + "\xce\x91\0" /* offset 15180 */ + "\xce\x92\0" /* offset 15183 */ + "\xce\x94\0" /* offset 15186 */ + "\xce\x95\0" /* offset 15189 */ + "\xce\x96\0" /* offset 15192 */ + "\xce\x97\0" /* offset 15195 */ + "\xce\x99\0" /* offset 15198 */ + "\xce\x9a\0" /* offset 15201 */ + "\xce\x9b\0" /* offset 15204 */ + "\xce\x9c\0" /* offset 15207 */ + "\xce\x9d\0" /* offset 15210 */ + "\xce\x9e\0" /* offset 15213 */ + "\xce\x9f\0" /* offset 15216 */ + "\xce\xa1\0" /* offset 15219 */ + "\xce\xa4\0" /* offset 15222 */ + "\xce\xa6\0" /* offset 15225 */ + "\xce\xa7\0" /* offset 15228 */ + "\xce\xa8\0" /* offset 15231 */ + "\xe2\x88\x87\0" /* offset 15234 */ + "\xce\xb1\0" /* offset 15238 */ + "\xce\xb6\0" /* offset 15241 */ + "\xce\xb7\0" /* offset 15244 */ + "\xce\xbb\0" /* offset 15247 */ + "\xce\xbd\0" /* offset 15250 */ + "\xce\xbe\0" /* offset 15253 */ + "\xce\xbf\0" /* offset 15256 */ + "\xcf\x83\0" /* offset 15259 */ + "\xcf\x84\0" /* offset 15262 */ + "\xcf\x85\0" /* offset 15265 */ + "\xcf\x88\0" /* offset 15268 */ + "\xcf\x89\0" /* offset 15271 */ + "\xe2\x88\x82\0" /* offset 15274 */ + "\xcf\x9c\0" /* offset 15278 */ + "\xcf\x9d\0" /* offset 15281 */ + "\xd9\xae\0" /* offset 15284 */ + "\xda\xa1\0" /* offset 15287 */ + "\xd9\xaf\0" /* offset 15290 */ + "\x30\x2e\0" /* offset 15293 */ + "\x30\x2c\0" /* offset 15296 */ + "\x31\x2c\0" /* offset 15299 */ + "\x32\x2c\0" /* offset 15302 */ + "\x33\x2c\0" /* offset 15305 */ + "\x34\x2c\0" /* offset 15308 */ + "\x35\x2c\0" /* offset 15311 */ + "\x36\x2c\0" /* offset 15314 */ + "\x37\x2c\0" /* offset 15317 */ + "\x38\x2c\0" /* offset 15320 */ + "\x39\x2c\0" /* offset 15323 */ + "\x28\x41\x29\0" /* offset 15326 */ + "\x28\x42\x29\0" /* offset 15330 */ + "\x28\x43\x29\0" /* offset 15334 */ + "\x28\x44\x29\0" /* offset 15338 */ + "\x28\x45\x29\0" /* offset 15342 */ + "\x28\x46\x29\0" /* offset 15346 */ + "\x28\x47\x29\0" /* offset 15350 */ + "\x28\x48\x29\0" /* offset 15354 */ + "\x28\x49\x29\0" /* offset 15358 */ + "\x28\x4a\x29\0" /* offset 15362 */ + "\x28\x4b\x29\0" /* offset 15366 */ + "\x28\x4c\x29\0" /* offset 15370 */ + "\x28\x4d\x29\0" /* offset 15374 */ + "\x28\x4e\x29\0" /* offset 15378 */ + "\x28\x4f\x29\0" /* offset 15382 */ + "\x28\x50\x29\0" /* offset 15386 */ + "\x28\x51\x29\0" /* offset 15390 */ + "\x28\x52\x29\0" /* offset 15394 */ + "\x28\x53\x29\0" /* offset 15398 */ + "\x28\x54\x29\0" /* offset 15402 */ + "\x28\x55\x29\0" /* offset 15406 */ + "\x28\x56\x29\0" /* offset 15410 */ + "\x28\x57\x29\0" /* offset 15414 */ + "\x28\x58\x29\0" /* offset 15418 */ + "\x28\x59\x29\0" /* offset 15422 */ + "\x28\x5a\x29\0" /* offset 15426 */ + "\xe3\x80\x94\x53\xe3\x80\x95\0" /* offset 15430 */ + "\x43\x44\0" /* offset 15438 */ + "\x57\x5a\0" /* offset 15441 */ + "\x48\x56\0" /* offset 15444 */ + "\x53\x44\0" /* offset 15447 */ + "\x53\x53\0" /* offset 15450 */ + "\x50\x50\x56\0" /* offset 15453 */ + "\x57\x43\0" /* offset 15457 */ + "\x4d\x43\0" /* offset 15460 */ + "\x4d\x44\0" /* offset 15463 */ + "\x44\x4a\0" /* offset 15466 */ + "\xe3\x81\xbb\xe3\x81\x8b\0" /* offset 15469 */ + "\xe3\x82\xb3\xe3\x82\xb3\0" /* offset 15476 */ + "\xe5\xad\x97\0" /* offset 15483 */ + "\xe5\x8f\x8c\0" /* offset 15487 */ + "\xe5\xa4\x9a\0" /* offset 15491 */ + "\xe8\xa7\xa3\0" /* offset 15495 */ + "\xe4\xba\xa4\0" /* offset 15499 */ + "\xe6\x98\xa0\0" /* offset 15503 */ + "\xe7\x84\xa1\0" /* offset 15507 */ + "\xe5\x89\x8d\0" /* offset 15511 */ + "\xe5\xbe\x8c\0" /* offset 15515 */ + "\xe5\x86\x8d\0" /* offset 15519 */ + "\xe6\x96\xb0\0" /* offset 15523 */ + "\xe5\x88\x9d\0" /* offset 15527 */ + "\xe7\xb5\x82\0" /* offset 15531 */ + "\xe8\xb2\xa9\0" /* offset 15535 */ + "\xe5\xa3\xb0\0" /* offset 15539 */ + "\xe5\x90\xb9\0" /* offset 15543 */ + "\xe6\xbc\x94\0" /* offset 15547 */ + "\xe6\x8a\x95\0" /* offset 15551 */ + "\xe6\x8d\x95\0" /* offset 15555 */ + "\xe9\x81\x8a\0" /* offset 15559 */ + "\xe6\x8c\x87\0" /* offset 15563 */ + "\xe6\x89\x93\0" /* offset 15567 */ + "\xe7\xa6\x81\0" /* offset 15571 */ + "\xe7\xa9\xba\0" /* offset 15575 */ + "\xe5\x90\x88\0" /* offset 15579 */ + "\xe6\xba\x80\0" /* offset 15583 */ + "\xe7\x94\xb3\0" /* offset 15587 */ + "\xe5\x89\xb2\0" /* offset 15591 */ + "\xe5\x96\xb6\0" /* offset 15595 */ + "\xe3\x80\x94\xe6\x9c\xac\xe3\x80\x95\0" /* offset 15599 */ + "\xe3\x80\x94\xe4\xb8\x89\xe3\x80\x95\0" /* offset 15609 */ + "\xe3\x80\x94\xe4\xba\x8c\xe3\x80\x95\0" /* offset 15619 */ + "\xe3\x80\x94\xe5\xae\x89\xe3\x80\x95\0" /* offset 15629 */ + "\xe3\x80\x94\xe7\x82\xb9\xe3\x80\x95\0" /* offset 15639 */ + "\xe3\x80\x94\xe6\x89\x93\xe3\x80\x95\0" /* offset 15649 */ + "\xe3\x80\x94\xe7\x9b\x97\xe3\x80\x95\0" /* offset 15659 */ + "\xe3\x80\x94\xe5\x8b\x9d\xe3\x80\x95\0" /* offset 15669 */ + "\xe3\x80\x94\xe6\x95\x97\xe3\x80\x95\0" /* offset 15679 */ + "\xe5\xbe\x97\0" /* offset 15689 */ + "\xe5\x8f\xaf\0" /* offset 15693 */ + "\xe4\xb8\xbd\0" /* offset 15697 */ + "\xe4\xb8\xb8\0" /* offset 15701 */ + "\xe4\xb9\x81\0" /* offset 15705 */ + "\xf0\xa0\x84\xa2\0" /* offset 15709 */ + "\xe4\xbd\xa0\0" /* offset 15714 */ + "\xe4\xbe\xbb\0" /* offset 15718 */ + "\xe5\x80\x82\0" /* offset 15722 */ + "\xe5\x81\xba\0" /* offset 15726 */ + "\xe5\x82\x99\0" /* offset 15730 */ + "\xe5\x83\x8f\0" /* offset 15734 */ + "\xe3\x92\x9e\0" /* offset 15738 */ + "\xf0\xa0\x98\xba\0" /* offset 15742 */ + "\xe5\x85\x94\0" /* offset 15747 */ + "\xe5\x85\xa4\0" /* offset 15751 */ + "\xe5\x85\xb7\0" /* offset 15755 */ + "\xf0\xa0\x94\x9c\0" /* offset 15759 */ + "\xe3\x92\xb9\0" /* offset 15764 */ + "\xe5\x85\xa7\0" /* offset 15768 */ + "\xf0\xa0\x95\x8b\0" /* offset 15772 */ + "\xe5\x86\x97\0" /* offset 15777 */ + "\xe5\x86\xa4\0" /* offset 15781 */ + "\xe4\xbb\x8c\0" /* offset 15785 */ + "\xe5\x86\xac\0" /* offset 15789 */ + "\xf0\xa9\x87\x9f\0" /* offset 15793 */ + "\xe5\x88\x83\0" /* offset 15798 */ + "\xe3\x93\x9f\0" /* offset 15802 */ + "\xe5\x88\xbb\0" /* offset 15806 */ + "\xe5\x89\x86\0" /* offset 15810 */ + "\xe5\x89\xb7\0" /* offset 15814 */ + "\xe3\x94\x95\0" /* offset 15818 */ + "\xe5\x8c\x85\0" /* offset 15822 */ + "\xe5\x8c\x86\0" /* offset 15826 */ + "\xe5\x8d\x89\0" /* offset 15830 */ + "\xe5\x8d\x9a\0" /* offset 15834 */ + "\xe5\x8d\xb3\0" /* offset 15838 */ + "\xe5\x8d\xbd\0" /* offset 15842 */ + "\xe5\x8d\xbf\0" /* offset 15846 */ + "\xf0\xa0\xa8\xac\0" /* offset 15850 */ + "\xe7\x81\xb0\0" /* offset 15855 */ + "\xe5\x8f\x8a\0" /* offset 15859 */ + "\xe5\x8f\x9f\0" /* offset 15863 */ + "\xf0\xa0\xad\xa3\0" /* offset 15867 */ + "\xe5\x8f\xab\0" /* offset 15872 */ + "\xe5\x8f\xb1\0" /* offset 15876 */ + "\xe5\x90\x86\0" /* offset 15880 */ + "\xe5\x92\x9e\0" /* offset 15884 */ + "\xe5\x90\xb8\0" /* offset 15888 */ + "\xe5\x91\x88\0" /* offset 15892 */ + "\xe5\x91\xa8\0" /* offset 15896 */ + "\xe5\x92\xa2\0" /* offset 15900 */ + "\xe5\x93\xb6\0" /* offset 15904 */ + "\xe5\x94\x90\0" /* offset 15908 */ + "\xe5\x95\x93\0" /* offset 15912 */ + "\xe5\x95\xa3\0" /* offset 15916 */ + "\xe5\x96\x84\0" /* offset 15920 */ + "\xe5\x96\xab\0" /* offset 15924 */ + "\xe5\x96\xb3\0" /* offset 15928 */ + "\xe5\x97\x82\0" /* offset 15932 */ + "\xe5\x9c\x96\0" /* offset 15936 */ + "\xe5\x9c\x97\0" /* offset 15940 */ + "\xe5\x99\x91\0" /* offset 15944 */ + "\xe5\x99\xb4\0" /* offset 15948 */ + "\xe5\xa3\xae\0" /* offset 15952 */ + "\xe5\x9f\x8e\0" /* offset 15956 */ + "\xe5\x9f\xb4\0" /* offset 15960 */ + "\xe5\xa0\x8d\0" /* offset 15964 */ + "\xe5\x9e\x8b\0" /* offset 15968 */ + "\xe5\xa0\xb2\0" /* offset 15972 */ + "\xe5\xa0\xb1\0" /* offset 15976 */ + "\xe5\xa2\xac\0" /* offset 15980 */ + "\xf0\xa1\x93\xa4\0" /* offset 15984 */ + "\xe5\xa3\xb2\0" /* offset 15989 */ + "\xe5\xa3\xb7\0" /* offset 15993 */ + "\xe5\xa4\x86\0" /* offset 15997 */ + "\xe5\xa4\xa2\0" /* offset 16001 */ + "\xe5\xa5\xa2\0" /* offset 16005 */ + "\xf0\xa1\x9a\xa8\0" /* offset 16009 */ + "\xf0\xa1\x9b\xaa\0" /* offset 16014 */ + "\xe5\xa7\xac\0" /* offset 16019 */ + "\xe5\xa8\x9b\0" /* offset 16023 */ + "\xe5\xa8\xa7\0" /* offset 16027 */ + "\xe5\xa7\x98\0" /* offset 16031 */ + "\xe5\xa9\xa6\0" /* offset 16035 */ + "\xe3\x9b\xae\0" /* offset 16039 */ + "\xe3\x9b\xbc\0" /* offset 16043 */ + "\xe5\xac\x88\0" /* offset 16047 */ + "\xe5\xac\xbe\0" /* offset 16051 */ + "\xf0\xa1\xa7\x88\0" /* offset 16055 */ + "\xe5\xaf\x83\0" /* offset 16060 */ + "\xe5\xaf\x98\0" /* offset 16064 */ + "\xe5\xaf\xb3\0" /* offset 16068 */ + "\xf0\xa1\xac\x98\0" /* offset 16072 */ + "\xe5\xaf\xbf\0" /* offset 16077 */ + "\xe5\xb0\x86\0" /* offset 16081 */ + "\xe5\xbd\x93\0" /* offset 16085 */ + "\xe3\x9e\x81\0" /* offset 16089 */ + "\xe5\xb1\xa0\0" /* offset 16093 */ + "\xe5\xb3\x80\0" /* offset 16097 */ + "\xe5\xb2\x8d\0" /* offset 16101 */ + "\xf0\xa1\xb7\xa4\0" /* offset 16105 */ + "\xe5\xb5\x83\0" /* offset 16110 */ + "\xf0\xa1\xb7\xa6\0" /* offset 16114 */ + "\xe5\xb5\xae\0" /* offset 16119 */ + "\xe5\xb5\xab\0" /* offset 16123 */ + "\xe5\xb5\xbc\0" /* offset 16127 */ + "\xe5\xb7\xa1\0" /* offset 16131 */ + "\xe5\xb7\xa2\0" /* offset 16135 */ + "\xe3\xa0\xaf\0" /* offset 16139 */ + "\xe5\xb7\xbd\0" /* offset 16143 */ + "\xe5\xb8\xa8\0" /* offset 16147 */ + "\xe5\xb8\xbd\0" /* offset 16151 */ + "\xe5\xb9\xa9\0" /* offset 16155 */ + "\xe3\xa1\xa2\0" /* offset 16159 */ + "\xf0\xa2\x86\x83\0" /* offset 16163 */ + "\xe3\xa1\xbc\0" /* offset 16168 */ + "\xe5\xba\xb0\0" /* offset 16172 */ + "\xe5\xba\xb3\0" /* offset 16176 */ + "\xe5\xba\xb6\0" /* offset 16180 */ + "\xf0\xaa\x8e\x92\0" /* offset 16184 */ + "\xf0\xa2\x8c\xb1\0" /* offset 16189 */ + "\xe8\x88\x81\0" /* offset 16194 */ + "\xe5\xbc\xa2\0" /* offset 16198 */ + "\xe3\xa3\x87\0" /* offset 16202 */ + "\xf0\xa3\x8a\xb8\0" /* offset 16206 */ + "\xf0\xa6\x87\x9a\0" /* offset 16211 */ + "\xe5\xbd\xa2\0" /* offset 16216 */ + "\xe5\xbd\xab\0" /* offset 16220 */ + "\xe3\xa3\xa3\0" /* offset 16224 */ + "\xe5\xbe\x9a\0" /* offset 16228 */ + "\xe5\xbf\x8d\0" /* offset 16232 */ + "\xe5\xbf\x97\0" /* offset 16236 */ + "\xe5\xbf\xb9\0" /* offset 16240 */ + "\xe6\x82\x81\0" /* offset 16244 */ + "\xe3\xa4\xba\0" /* offset 16248 */ + "\xe3\xa4\x9c\0" /* offset 16252 */ + "\xf0\xa2\x9b\x94\0" /* offset 16256 */ + "\xe6\x83\x87\0" /* offset 16261 */ + "\xe6\x85\x88\0" /* offset 16265 */ + "\xe6\x85\x8c\0" /* offset 16269 */ + "\xe6\x85\xba\0" /* offset 16273 */ + "\xe6\x86\xb2\0" /* offset 16277 */ + "\xe6\x86\xa4\0" /* offset 16281 */ + "\xe6\x86\xaf\0" /* offset 16285 */ + "\xe6\x87\x9e\0" /* offset 16289 */ + "\xe6\x88\x90\0" /* offset 16293 */ + "\xe6\x88\x9b\0" /* offset 16297 */ + "\xe6\x89\x9d\0" /* offset 16301 */ + "\xe6\x8a\xb1\0" /* offset 16305 */ + "\xe6\x8b\x94\0" /* offset 16309 */ + "\xe6\x8d\x90\0" /* offset 16313 */ + "\xf0\xa2\xac\x8c\0" /* offset 16317 */ + "\xe6\x8c\xbd\0" /* offset 16322 */ + "\xe6\x8b\xbc\0" /* offset 16326 */ + "\xe6\x8d\xa8\0" /* offset 16330 */ + "\xe6\x8e\x83\0" /* offset 16334 */ + "\xe6\x8f\xa4\0" /* offset 16338 */ + "\xf0\xa2\xaf\xb1\0" /* offset 16342 */ + "\xe6\x90\xa2\0" /* offset 16347 */ + "\xe6\x8f\x85\0" /* offset 16351 */ + "\xe6\x8e\xa9\0" /* offset 16355 */ + "\xe3\xa8\xae\0" /* offset 16359 */ + "\xe6\x91\xa9\0" /* offset 16363 */ + "\xe6\x91\xbe\0" /* offset 16367 */ + "\xe6\x92\x9d\0" /* offset 16371 */ + "\xe6\x91\xb7\0" /* offset 16375 */ + "\xe3\xa9\xac\0" /* offset 16379 */ + "\xe6\x95\xac\0" /* offset 16383 */ + "\xf0\xa3\x80\x8a\0" /* offset 16387 */ + "\xe6\x97\xa3\0" /* offset 16392 */ + "\xe6\x9b\xb8\0" /* offset 16396 */ + "\xe6\x99\x89\0" /* offset 16400 */ + "\xe3\xac\x99\0" /* offset 16404 */ + "\xe3\xac\x88\0" /* offset 16408 */ + "\xe3\xab\xa4\0" /* offset 16412 */ + "\xe5\x86\x92\0" /* offset 16416 */ + "\xe5\x86\x95\0" /* offset 16420 */ + "\xe6\x9c\x80\0" /* offset 16424 */ + "\xe6\x9a\x9c\0" /* offset 16428 */ + "\xe8\x82\xad\0" /* offset 16432 */ + "\xe4\x8f\x99\0" /* offset 16436 */ + "\xe6\x9c\xa1\0" /* offset 16440 */ + "\xe6\x9d\x9e\0" /* offset 16444 */ + "\xe6\x9d\x93\0" /* offset 16448 */ + "\xf0\xa3\x8f\x83\0" /* offset 16452 */ + "\xe3\xad\x89\0" /* offset 16457 */ + "\xe6\x9f\xba\0" /* offset 16461 */ + "\xe6\x9e\x85\0" /* offset 16465 */ + "\xe6\xa1\x92\0" /* offset 16469 */ + "\xf0\xa3\x91\xad\0" /* offset 16473 */ + "\xe6\xa2\x8e\0" /* offset 16478 */ + "\xe6\xa0\x9f\0" /* offset 16482 */ + "\xe6\xa4\x94\0" /* offset 16486 */ + "\xe6\xa5\x82\0" /* offset 16490 */ + "\xe6\xa6\xa3\0" /* offset 16494 */ + "\xe6\xa7\xaa\0" /* offset 16498 */ + "\xe6\xaa\xa8\0" /* offset 16502 */ + "\xf0\xa3\x9a\xa3\0" /* offset 16506 */ + "\xe6\xab\x9b\0" /* offset 16511 */ + "\xe3\xb0\x98\0" /* offset 16515 */ + "\xe6\xac\xa1\0" /* offset 16519 */ + "\xf0\xa3\xa2\xa7\0" /* offset 16523 */ + "\xe6\xad\x94\0" /* offset 16528 */ + "\xe3\xb1\x8e\0" /* offset 16532 */ + "\xe6\xad\xb2\0" /* offset 16536 */ + "\xe6\xae\x9f\0" /* offset 16540 */ + "\xe6\xae\xbb\0" /* offset 16544 */ + "\xf0\xa3\xaa\x8d\0" /* offset 16548 */ + "\xf0\xa1\xb4\x8b\0" /* offset 16553 */ + "\xf0\xa3\xab\xba\0" /* offset 16558 */ + "\xe6\xb1\x8e\0" /* offset 16563 */ + "\xf0\xa3\xb2\xbc\0" /* offset 16567 */ + "\xe6\xb2\xbf\0" /* offset 16572 */ + "\xe6\xb3\x8d\0" /* offset 16576 */ + "\xe6\xb1\xa7\0" /* offset 16580 */ + "\xe6\xb4\x96\0" /* offset 16584 */ + "\xe6\xb4\xbe\0" /* offset 16588 */ + "\xe6\xb5\xa9\0" /* offset 16592 */ + "\xe6\xb5\xb8\0" /* offset 16596 */ + "\xe6\xb6\x85\0" /* offset 16600 */ + "\xf0\xa3\xb4\x9e\0" /* offset 16604 */ + "\xe6\xb4\xb4\0" /* offset 16609 */ + "\xe6\xb8\xaf\0" /* offset 16613 */ + "\xe6\xb9\xae\0" /* offset 16617 */ + "\xe3\xb4\xb3\0" /* offset 16621 */ + "\xe6\xbb\x87\0" /* offset 16625 */ + "\xf0\xa3\xbb\x91\0" /* offset 16629 */ + "\xe6\xb7\xb9\0" /* offset 16634 */ + "\xe6\xbd\xae\0" /* offset 16638 */ + "\xf0\xa3\xbd\x9e\0" /* offset 16642 */ + "\xf0\xa3\xbe\x8e\0" /* offset 16647 */ + "\xe6\xbf\x86\0" /* offset 16652 */ + "\xe7\x80\xb9\0" /* offset 16656 */ + "\xe7\x80\x9b\0" /* offset 16660 */ + "\xe3\xb6\x96\0" /* offset 16664 */ + "\xe7\x81\x8a\0" /* offset 16668 */ + "\xe7\x81\xbd\0" /* offset 16672 */ + "\xe7\x81\xb7\0" /* offset 16676 */ + "\xe7\x82\xad\0" /* offset 16680 */ + "\xf0\xa0\x94\xa5\0" /* offset 16684 */ + "\xe7\x85\x85\0" /* offset 16689 */ + "\xf0\xa4\x89\xa3\0" /* offset 16693 */ + "\xe7\x86\x9c\0" /* offset 16698 */ + "\xf0\xa4\x8e\xab\0" /* offset 16702 */ + "\xe7\x88\xa8\0" /* offset 16707 */ + "\xe7\x89\x90\0" /* offset 16711 */ + "\xf0\xa4\x98\x88\0" /* offset 16715 */ + "\xe7\x8a\x80\0" /* offset 16720 */ + "\xe7\x8a\x95\0" /* offset 16724 */ + "\xf0\xa4\x9c\xb5\0" /* offset 16728 */ + "\xf0\xa4\xa0\x94\0" /* offset 16733 */ + "\xe7\x8d\xba\0" /* offset 16738 */ + "\xe7\x8e\x8b\0" /* offset 16742 */ + "\xe3\xba\xac\0" /* offset 16746 */ + "\xe7\x8e\xa5\0" /* offset 16750 */ + "\xe3\xba\xb8\0" /* offset 16754 */ + "\xe7\x91\x87\0" /* offset 16758 */ + "\xe7\x91\x9c\0" /* offset 16762 */ + "\xe7\x92\x85\0" /* offset 16766 */ + "\xe7\x93\x8a\0" /* offset 16770 */ + "\xe3\xbc\x9b\0" /* offset 16774 */ + "\xe7\x94\xa4\0" /* offset 16778 */ + "\xf0\xa4\xb0\xb6\0" /* offset 16782 */ + "\xe7\x94\xbe\0" /* offset 16787 */ + "\xf0\xa4\xb2\x92\0" /* offset 16791 */ + "\xf0\xa2\x86\x9f\0" /* offset 16796 */ + "\xe7\x98\x90\0" /* offset 16801 */ + "\xf0\xa4\xbe\xa1\0" /* offset 16805 */ + "\xf0\xa4\xbe\xb8\0" /* offset 16810 */ + "\xf0\xa5\x81\x84\0" /* offset 16815 */ + "\xe3\xbf\xbc\0" /* offset 16820 */ + "\xe4\x80\x88\0" /* offset 16824 */ + "\xf0\xa5\x83\xb3\0" /* offset 16828 */ + "\xf0\xa5\x83\xb2\0" /* offset 16833 */ + "\xf0\xa5\x84\x99\0" /* offset 16838 */ + "\xf0\xa5\x84\xb3\0" /* offset 16843 */ + "\xe7\x9c\x9e\0" /* offset 16848 */ + "\xe7\x9c\x9f\0" /* offset 16852 */ + "\xe7\x9e\x8b\0" /* offset 16856 */ + "\xe4\x81\x86\0" /* offset 16860 */ + "\xe4\x82\x96\0" /* offset 16864 */ + "\xf0\xa5\x90\x9d\0" /* offset 16868 */ + "\xe7\xa1\x8e\0" /* offset 16873 */ + "\xe4\x83\xa3\0" /* offset 16877 */ + "\xf0\xa5\x98\xa6\0" /* offset 16881 */ + "\xf0\xa5\x9a\x9a\0" /* offset 16886 */ + "\xf0\xa5\x9b\x85\0" /* offset 16891 */ + "\xe7\xa7\xab\0" /* offset 16896 */ + "\xe4\x84\xaf\0" /* offset 16900 */ + "\xe7\xa9\x8a\0" /* offset 16904 */ + "\xe7\xa9\x8f\0" /* offset 16908 */ + "\xf0\xa5\xa5\xbc\0" /* offset 16912 */ + "\xf0\xa5\xaa\xa7\0" /* offset 16917 */ + "\xe7\xab\xae\0" /* offset 16922 */ + "\xe4\x88\x82\0" /* offset 16926 */ + "\xf0\xa5\xae\xab\0" /* offset 16930 */ + "\xe7\xaf\x86\0" /* offset 16935 */ + "\xe7\xaf\x89\0" /* offset 16939 */ + "\xe4\x88\xa7\0" /* offset 16943 */ + "\xf0\xa5\xb2\x80\0" /* offset 16947 */ + "\xe7\xb3\x92\0" /* offset 16952 */ + "\xe4\x8a\xa0\0" /* offset 16956 */ + "\xe7\xb3\xa8\0" /* offset 16960 */ + "\xe7\xb3\xa3\0" /* offset 16964 */ + "\xe7\xb4\x80\0" /* offset 16968 */ + "\xf0\xa5\xbe\x86\0" /* offset 16972 */ + "\xe7\xb5\xa3\0" /* offset 16977 */ + "\xe4\x8c\x81\0" /* offset 16981 */ + "\xe7\xb7\x87\0" /* offset 16985 */ + "\xe7\xb8\x82\0" /* offset 16989 */ + "\xe7\xb9\x85\0" /* offset 16993 */ + "\xe4\x8c\xb4\0" /* offset 16997 */ + "\xf0\xa6\x88\xa8\0" /* offset 17001 */ + "\xf0\xa6\x89\x87\0" /* offset 17006 */ + "\xe4\x8d\x99\0" /* offset 17011 */ + "\xf0\xa6\x8b\x99\0" /* offset 17015 */ + "\xe7\xbd\xba\0" /* offset 17020 */ + "\xf0\xa6\x8c\xbe\0" /* offset 17024 */ + "\xe7\xbe\x95\0" /* offset 17029 */ + "\xe7\xbf\xba\0" /* offset 17033 */ + "\xf0\xa6\x93\x9a\0" /* offset 17037 */ + "\xf0\xa6\x94\xa3\0" /* offset 17042 */ + "\xe8\x81\xa0\0" /* offset 17047 */ + "\xf0\xa6\x96\xa8\0" /* offset 17051 */ + "\xe8\x81\xb0\0" /* offset 17056 */ + "\xf0\xa3\x8d\x9f\0" /* offset 17060 */ + "\xe4\x8f\x95\0" /* offset 17065 */ + "\xe8\x82\xb2\0" /* offset 17069 */ + "\xe8\x84\x83\0" /* offset 17073 */ + "\xe4\x90\x8b\0" /* offset 17077 */ + "\xe8\x84\xbe\0" /* offset 17081 */ + "\xe5\xaa\xb5\0" /* offset 17085 */ + "\xf0\xa6\x9e\xa7\0" /* offset 17089 */ + "\xf0\xa6\x9e\xb5\0" /* offset 17094 */ + "\xf0\xa3\x8e\x93\0" /* offset 17099 */ + "\xf0\xa3\x8e\x9c\0" /* offset 17104 */ + "\xe8\x88\x84\0" /* offset 17109 */ + "\xe8\xbe\x9e\0" /* offset 17113 */ + "\xe4\x91\xab\0" /* offset 17117 */ + "\xe8\x8a\x91\0" /* offset 17121 */ + "\xe8\x8a\x8b\0" /* offset 17125 */ + "\xe8\x8a\x9d\0" /* offset 17129 */ + "\xe5\x8a\xb3\0" /* offset 17133 */ + "\xe8\x8a\xb1\0" /* offset 17137 */ + "\xe8\x8a\xb3\0" /* offset 17141 */ + "\xe8\x8a\xbd\0" /* offset 17145 */ + "\xe8\x8b\xa6\0" /* offset 17149 */ + "\xf0\xa6\xac\xbc\0" /* offset 17153 */ + "\xe8\x8c\x9d\0" /* offset 17158 */ + "\xe8\x8d\xa3\0" /* offset 17162 */ + "\xe8\x8e\xad\0" /* offset 17166 */ + "\xe8\x8c\xa3\0" /* offset 17170 */ + "\xe8\x8e\xbd\0" /* offset 17174 */ + "\xe8\x8f\xa7\0" /* offset 17178 */ + "\xe8\x8d\x93\0" /* offset 17182 */ + "\xe8\x8f\x8a\0" /* offset 17186 */ + "\xe8\x8f\x8c\0" /* offset 17190 */ + "\xe8\x8f\x9c\0" /* offset 17194 */ + "\xf0\xa6\xb0\xb6\0" /* offset 17198 */ + "\xf0\xa6\xb5\xab\0" /* offset 17203 */ + "\xf0\xa6\xb3\x95\0" /* offset 17208 */ + "\xe4\x94\xab\0" /* offset 17213 */ + "\xe8\x93\xb1\0" /* offset 17217 */ + "\xe8\x93\xb3\0" /* offset 17221 */ + "\xe8\x94\x96\0" /* offset 17225 */ + "\xf0\xa7\x8f\x8a\0" /* offset 17229 */ + "\xe8\x95\xa4\0" /* offset 17234 */ + "\xf0\xa6\xbc\xac\0" /* offset 17238 */ + "\xe4\x95\x9d\0" /* offset 17243 */ + "\xe4\x95\xa1\0" /* offset 17247 */ + "\xf0\xa6\xbe\xb1\0" /* offset 17251 */ + "\xf0\xa7\x83\x92\0" /* offset 17256 */ + "\xe4\x95\xab\0" /* offset 17261 */ + "\xe8\x99\x90\0" /* offset 17265 */ + "\xe8\x99\xa7\0" /* offset 17269 */ + "\xe8\x99\xa9\0" /* offset 17273 */ + "\xe8\x9a\xa9\0" /* offset 17277 */ + "\xe8\x9a\x88\0" /* offset 17281 */ + "\xe8\x9c\x8e\0" /* offset 17285 */ + "\xe8\x9b\xa2\0" /* offset 17289 */ + "\xe8\x9c\xa8\0" /* offset 17293 */ + "\xe8\x9d\xab\0" /* offset 17297 */ + "\xe8\x9e\x86\0" /* offset 17301 */ + "\xe4\x97\x97\0" /* offset 17305 */ + "\xe8\x9f\xa1\0" /* offset 17309 */ + "\xe8\xa0\x81\0" /* offset 17313 */ + "\xe4\x97\xb9\0" /* offset 17317 */ + "\xe8\xa1\xa0\0" /* offset 17321 */ + "\xf0\xa7\x99\xa7\0" /* offset 17325 */ + "\xe8\xa3\x97\0" /* offset 17330 */ + "\xe8\xa3\x9e\0" /* offset 17334 */ + "\xe4\x98\xb5\0" /* offset 17338 */ + "\xe8\xa3\xba\0" /* offset 17342 */ + "\xe3\x92\xbb\0" /* offset 17346 */ + "\xf0\xa7\xa2\xae\0" /* offset 17350 */ + "\xf0\xa7\xa5\xa6\0" /* offset 17355 */ + "\xe4\x9a\xbe\0" /* offset 17360 */ + "\xe4\x9b\x87\0" /* offset 17364 */ + "\xe8\xaa\xa0\0" /* offset 17368 */ + "\xf0\xa7\xb2\xa8\0" /* offset 17372 */ + "\xe8\xb2\xab\0" /* offset 17377 */ + "\xe8\xb3\x81\0" /* offset 17381 */ + "\xe8\xb4\x9b\0" /* offset 17385 */ + "\xe8\xb5\xb7\0" /* offset 17389 */ + "\xf0\xa7\xbc\xaf\0" /* offset 17393 */ + "\xf0\xa0\xa0\x84\0" /* offset 17398 */ + "\xe8\xb7\x8b\0" /* offset 17403 */ + "\xe8\xb6\xbc\0" /* offset 17407 */ + "\xe8\xb7\xb0\0" /* offset 17411 */ + "\xf0\xa0\xa3\x9e\0" /* offset 17415 */ + "\xe8\xbb\x94\0" /* offset 17420 */ + "\xf0\xa8\x97\x92\0" /* offset 17424 */ + "\xf0\xa8\x97\xad\0" /* offset 17429 */ + "\xe9\x82\x94\0" /* offset 17434 */ + "\xe9\x83\xb1\0" /* offset 17438 */ + "\xe9\x84\x91\0" /* offset 17442 */ + "\xf0\xa8\x9c\xae\0" /* offset 17446 */ + "\xe9\x84\x9b\0" /* offset 17451 */ + "\xe9\x88\xb8\0" /* offset 17455 */ + "\xe9\x8b\x97\0" /* offset 17459 */ + "\xe9\x8b\x98\0" /* offset 17463 */ + "\xe9\x89\xbc\0" /* offset 17467 */ + "\xe9\x8f\xb9\0" /* offset 17471 */ + "\xe9\x90\x95\0" /* offset 17475 */ + "\xf0\xa8\xaf\xba\0" /* offset 17479 */ + "\xe9\x96\x8b\0" /* offset 17484 */ + "\xe4\xa6\x95\0" /* offset 17488 */ + "\xe9\x96\xb7\0" /* offset 17492 */ + "\xf0\xa8\xb5\xb7\0" /* offset 17496 */ + "\xe4\xa7\xa6\0" /* offset 17501 */ + "\xe9\x9b\x83\0" /* offset 17505 */ + "\xe5\xb6\xb2\0" /* offset 17509 */ + "\xe9\x9c\xa3\0" /* offset 17513 */ + "\xf0\xa9\x85\x85\0" /* offset 17517 */ + "\xf0\xa9\x88\x9a\0" /* offset 17522 */ + "\xe4\xa9\xae\0" /* offset 17527 */ + "\xe4\xa9\xb6\0" /* offset 17531 */ + "\xe9\x9f\xa0\0" /* offset 17535 */ + "\xf0\xa9\x90\x8a\0" /* offset 17539 */ + "\xe4\xaa\xb2\0" /* offset 17544 */ + "\xf0\xa9\x92\x96\0" /* offset 17548 */ + "\xe9\xa0\xa9\0" /* offset 17553 */ + "\xf0\xa9\x96\xb6\0" /* offset 17557 */ + "\xe9\xa3\xa2\0" /* offset 17562 */ + "\xe4\xac\xb3\0" /* offset 17566 */ + "\xe9\xa4\xa9\0" /* offset 17570 */ + "\xe9\xa6\xa7\0" /* offset 17574 */ + "\xe9\xa7\x82\0" /* offset 17578 */ + "\xe9\xa7\xbe\0" /* offset 17582 */ + "\xe4\xaf\x8e\0" /* offset 17586 */ + "\xf0\xa9\xac\xb0\0" /* offset 17590 */ + "\xe9\xb1\x80\0" /* offset 17595 */ + "\xe9\xb3\xbd\0" /* offset 17599 */ + "\xe4\xb3\x8e\0" /* offset 17603 */ + "\xe4\xb3\xad\0" /* offset 17607 */ + "\xe9\xb5\xa7\0" /* offset 17611 */ + "\xf0\xaa\x83\x8e\0" /* offset 17615 */ + "\xe4\xb3\xb8\0" /* offset 17620 */ + "\xf0\xaa\x84\x85\0" /* offset 17624 */ + "\xf0\xaa\x88\x8e\0" /* offset 17629 */ + "\xf0\xaa\x8a\x91\0" /* offset 17634 */ + "\xe4\xb5\x96\0" /* offset 17639 */ + "\xe9\xbb\xbe\0" /* offset 17643 */ + "\xe9\xbc\x85\0" /* offset 17647 */ + "\xe9\xbc\x8f\0" /* offset 17651 */ + "\xe9\xbc\x96\0" /* offset 17655 */ + "\xf0\xaa\x98\x80\0" /* offset 17659 */; + +typedef struct +{ + gunichar ch; + gunichar a; + gunichar b; +} decomposition_step; + +static const decomposition_step decomp_step_table[] = +{ + { 0x000c0, 0x00041, 0x00300 }, + { 0x000c1, 0x00041, 0x00301 }, + { 0x000c2, 0x00041, 0x00302 }, + { 0x000c3, 0x00041, 0x00303 }, + { 0x000c4, 0x00041, 0x00308 }, + { 0x000c5, 0x00041, 0x0030a }, + { 0x000c7, 0x00043, 0x00327 }, + { 0x000c8, 0x00045, 0x00300 }, + { 0x000c9, 0x00045, 0x00301 }, + { 0x000ca, 0x00045, 0x00302 }, + { 0x000cb, 0x00045, 0x00308 }, + { 0x000cc, 0x00049, 0x00300 }, + { 0x000cd, 0x00049, 0x00301 }, + { 0x000ce, 0x00049, 0x00302 }, + { 0x000cf, 0x00049, 0x00308 }, + { 0x000d1, 0x0004e, 0x00303 }, + { 0x000d2, 0x0004f, 0x00300 }, + { 0x000d3, 0x0004f, 0x00301 }, + { 0x000d4, 0x0004f, 0x00302 }, + { 0x000d5, 0x0004f, 0x00303 }, + { 0x000d6, 0x0004f, 0x00308 }, + { 0x000d9, 0x00055, 0x00300 }, + { 0x000da, 0x00055, 0x00301 }, + { 0x000db, 0x00055, 0x00302 }, + { 0x000dc, 0x00055, 0x00308 }, + { 0x000dd, 0x00059, 0x00301 }, + { 0x000e0, 0x00061, 0x00300 }, + { 0x000e1, 0x00061, 0x00301 }, + { 0x000e2, 0x00061, 0x00302 }, + { 0x000e3, 0x00061, 0x00303 }, + { 0x000e4, 0x00061, 0x00308 }, + { 0x000e5, 0x00061, 0x0030a }, + { 0x000e7, 0x00063, 0x00327 }, + { 0x000e8, 0x00065, 0x00300 }, + { 0x000e9, 0x00065, 0x00301 }, + { 0x000ea, 0x00065, 0x00302 }, + { 0x000eb, 0x00065, 0x00308 }, + { 0x000ec, 0x00069, 0x00300 }, + { 0x000ed, 0x00069, 0x00301 }, + { 0x000ee, 0x00069, 0x00302 }, + { 0x000ef, 0x00069, 0x00308 }, + { 0x000f1, 0x0006e, 0x00303 }, + { 0x000f2, 0x0006f, 0x00300 }, + { 0x000f3, 0x0006f, 0x00301 }, + { 0x000f4, 0x0006f, 0x00302 }, + { 0x000f5, 0x0006f, 0x00303 }, + { 0x000f6, 0x0006f, 0x00308 }, + { 0x000f9, 0x00075, 0x00300 }, + { 0x000fa, 0x00075, 0x00301 }, + { 0x000fb, 0x00075, 0x00302 }, + { 0x000fc, 0x00075, 0x00308 }, + { 0x000fd, 0x00079, 0x00301 }, + { 0x000ff, 0x00079, 0x00308 }, + { 0x00100, 0x00041, 0x00304 }, + { 0x00101, 0x00061, 0x00304 }, + { 0x00102, 0x00041, 0x00306 }, + { 0x00103, 0x00061, 0x00306 }, + { 0x00104, 0x00041, 0x00328 }, + { 0x00105, 0x00061, 0x00328 }, + { 0x00106, 0x00043, 0x00301 }, + { 0x00107, 0x00063, 0x00301 }, + { 0x00108, 0x00043, 0x00302 }, + { 0x00109, 0x00063, 0x00302 }, + { 0x0010a, 0x00043, 0x00307 }, + { 0x0010b, 0x00063, 0x00307 }, + { 0x0010c, 0x00043, 0x0030c }, + { 0x0010d, 0x00063, 0x0030c }, + { 0x0010e, 0x00044, 0x0030c }, + { 0x0010f, 0x00064, 0x0030c }, + { 0x00112, 0x00045, 0x00304 }, + { 0x00113, 0x00065, 0x00304 }, + { 0x00114, 0x00045, 0x00306 }, + { 0x00115, 0x00065, 0x00306 }, + { 0x00116, 0x00045, 0x00307 }, + { 0x00117, 0x00065, 0x00307 }, + { 0x00118, 0x00045, 0x00328 }, + { 0x00119, 0x00065, 0x00328 }, + { 0x0011a, 0x00045, 0x0030c }, + { 0x0011b, 0x00065, 0x0030c }, + { 0x0011c, 0x00047, 0x00302 }, + { 0x0011d, 0x00067, 0x00302 }, + { 0x0011e, 0x00047, 0x00306 }, + { 0x0011f, 0x00067, 0x00306 }, + { 0x00120, 0x00047, 0x00307 }, + { 0x00121, 0x00067, 0x00307 }, + { 0x00122, 0x00047, 0x00327 }, + { 0x00123, 0x00067, 0x00327 }, + { 0x00124, 0x00048, 0x00302 }, + { 0x00125, 0x00068, 0x00302 }, + { 0x00128, 0x00049, 0x00303 }, + { 0x00129, 0x00069, 0x00303 }, + { 0x0012a, 0x00049, 0x00304 }, + { 0x0012b, 0x00069, 0x00304 }, + { 0x0012c, 0x00049, 0x00306 }, + { 0x0012d, 0x00069, 0x00306 }, + { 0x0012e, 0x00049, 0x00328 }, + { 0x0012f, 0x00069, 0x00328 }, + { 0x00130, 0x00049, 0x00307 }, + { 0x00134, 0x0004a, 0x00302 }, + { 0x00135, 0x0006a, 0x00302 }, + { 0x00136, 0x0004b, 0x00327 }, + { 0x00137, 0x0006b, 0x00327 }, + { 0x00139, 0x0004c, 0x00301 }, + { 0x0013a, 0x0006c, 0x00301 }, + { 0x0013b, 0x0004c, 0x00327 }, + { 0x0013c, 0x0006c, 0x00327 }, + { 0x0013d, 0x0004c, 0x0030c }, + { 0x0013e, 0x0006c, 0x0030c }, + { 0x00143, 0x0004e, 0x00301 }, + { 0x00144, 0x0006e, 0x00301 }, + { 0x00145, 0x0004e, 0x00327 }, + { 0x00146, 0x0006e, 0x00327 }, + { 0x00147, 0x0004e, 0x0030c }, + { 0x00148, 0x0006e, 0x0030c }, + { 0x0014c, 0x0004f, 0x00304 }, + { 0x0014d, 0x0006f, 0x00304 }, + { 0x0014e, 0x0004f, 0x00306 }, + { 0x0014f, 0x0006f, 0x00306 }, + { 0x00150, 0x0004f, 0x0030b }, + { 0x00151, 0x0006f, 0x0030b }, + { 0x00154, 0x00052, 0x00301 }, + { 0x00155, 0x00072, 0x00301 }, + { 0x00156, 0x00052, 0x00327 }, + { 0x00157, 0x00072, 0x00327 }, + { 0x00158, 0x00052, 0x0030c }, + { 0x00159, 0x00072, 0x0030c }, + { 0x0015a, 0x00053, 0x00301 }, + { 0x0015b, 0x00073, 0x00301 }, + { 0x0015c, 0x00053, 0x00302 }, + { 0x0015d, 0x00073, 0x00302 }, + { 0x0015e, 0x00053, 0x00327 }, + { 0x0015f, 0x00073, 0x00327 }, + { 0x00160, 0x00053, 0x0030c }, + { 0x00161, 0x00073, 0x0030c }, + { 0x00162, 0x00054, 0x00327 }, + { 0x00163, 0x00074, 0x00327 }, + { 0x00164, 0x00054, 0x0030c }, + { 0x00165, 0x00074, 0x0030c }, + { 0x00168, 0x00055, 0x00303 }, + { 0x00169, 0x00075, 0x00303 }, + { 0x0016a, 0x00055, 0x00304 }, + { 0x0016b, 0x00075, 0x00304 }, + { 0x0016c, 0x00055, 0x00306 }, + { 0x0016d, 0x00075, 0x00306 }, + { 0x0016e, 0x00055, 0x0030a }, + { 0x0016f, 0x00075, 0x0030a }, + { 0x00170, 0x00055, 0x0030b }, + { 0x00171, 0x00075, 0x0030b }, + { 0x00172, 0x00055, 0x00328 }, + { 0x00173, 0x00075, 0x00328 }, + { 0x00174, 0x00057, 0x00302 }, + { 0x00175, 0x00077, 0x00302 }, + { 0x00176, 0x00059, 0x00302 }, + { 0x00177, 0x00079, 0x00302 }, + { 0x00178, 0x00059, 0x00308 }, + { 0x00179, 0x0005a, 0x00301 }, + { 0x0017a, 0x0007a, 0x00301 }, + { 0x0017b, 0x0005a, 0x00307 }, + { 0x0017c, 0x0007a, 0x00307 }, + { 0x0017d, 0x0005a, 0x0030c }, + { 0x0017e, 0x0007a, 0x0030c }, + { 0x001a0, 0x0004f, 0x0031b }, + { 0x001a1, 0x0006f, 0x0031b }, + { 0x001af, 0x00055, 0x0031b }, + { 0x001b0, 0x00075, 0x0031b }, + { 0x001cd, 0x00041, 0x0030c }, + { 0x001ce, 0x00061, 0x0030c }, + { 0x001cf, 0x00049, 0x0030c }, + { 0x001d0, 0x00069, 0x0030c }, + { 0x001d1, 0x0004f, 0x0030c }, + { 0x001d2, 0x0006f, 0x0030c }, + { 0x001d3, 0x00055, 0x0030c }, + { 0x001d4, 0x00075, 0x0030c }, + { 0x001d5, 0x000dc, 0x00304 }, + { 0x001d6, 0x000fc, 0x00304 }, + { 0x001d7, 0x000dc, 0x00301 }, + { 0x001d8, 0x000fc, 0x00301 }, + { 0x001d9, 0x000dc, 0x0030c }, + { 0x001da, 0x000fc, 0x0030c }, + { 0x001db, 0x000dc, 0x00300 }, + { 0x001dc, 0x000fc, 0x00300 }, + { 0x001de, 0x000c4, 0x00304 }, + { 0x001df, 0x000e4, 0x00304 }, + { 0x001e0, 0x00226, 0x00304 }, + { 0x001e1, 0x00227, 0x00304 }, + { 0x001e2, 0x000c6, 0x00304 }, + { 0x001e3, 0x000e6, 0x00304 }, + { 0x001e6, 0x00047, 0x0030c }, + { 0x001e7, 0x00067, 0x0030c }, + { 0x001e8, 0x0004b, 0x0030c }, + { 0x001e9, 0x0006b, 0x0030c }, + { 0x001ea, 0x0004f, 0x00328 }, + { 0x001eb, 0x0006f, 0x00328 }, + { 0x001ec, 0x001ea, 0x00304 }, + { 0x001ed, 0x001eb, 0x00304 }, + { 0x001ee, 0x001b7, 0x0030c }, + { 0x001ef, 0x00292, 0x0030c }, + { 0x001f0, 0x0006a, 0x0030c }, + { 0x001f4, 0x00047, 0x00301 }, + { 0x001f5, 0x00067, 0x00301 }, + { 0x001f8, 0x0004e, 0x00300 }, + { 0x001f9, 0x0006e, 0x00300 }, + { 0x001fa, 0x000c5, 0x00301 }, + { 0x001fb, 0x000e5, 0x00301 }, + { 0x001fc, 0x000c6, 0x00301 }, + { 0x001fd, 0x000e6, 0x00301 }, + { 0x001fe, 0x000d8, 0x00301 }, + { 0x001ff, 0x000f8, 0x00301 }, + { 0x00200, 0x00041, 0x0030f }, + { 0x00201, 0x00061, 0x0030f }, + { 0x00202, 0x00041, 0x00311 }, + { 0x00203, 0x00061, 0x00311 }, + { 0x00204, 0x00045, 0x0030f }, + { 0x00205, 0x00065, 0x0030f }, + { 0x00206, 0x00045, 0x00311 }, + { 0x00207, 0x00065, 0x00311 }, + { 0x00208, 0x00049, 0x0030f }, + { 0x00209, 0x00069, 0x0030f }, + { 0x0020a, 0x00049, 0x00311 }, + { 0x0020b, 0x00069, 0x00311 }, + { 0x0020c, 0x0004f, 0x0030f }, + { 0x0020d, 0x0006f, 0x0030f }, + { 0x0020e, 0x0004f, 0x00311 }, + { 0x0020f, 0x0006f, 0x00311 }, + { 0x00210, 0x00052, 0x0030f }, + { 0x00211, 0x00072, 0x0030f }, + { 0x00212, 0x00052, 0x00311 }, + { 0x00213, 0x00072, 0x00311 }, + { 0x00214, 0x00055, 0x0030f }, + { 0x00215, 0x00075, 0x0030f }, + { 0x00216, 0x00055, 0x00311 }, + { 0x00217, 0x00075, 0x00311 }, + { 0x00218, 0x00053, 0x00326 }, + { 0x00219, 0x00073, 0x00326 }, + { 0x0021a, 0x00054, 0x00326 }, + { 0x0021b, 0x00074, 0x00326 }, + { 0x0021e, 0x00048, 0x0030c }, + { 0x0021f, 0x00068, 0x0030c }, + { 0x00226, 0x00041, 0x00307 }, + { 0x00227, 0x00061, 0x00307 }, + { 0x00228, 0x00045, 0x00327 }, + { 0x00229, 0x00065, 0x00327 }, + { 0x0022a, 0x000d6, 0x00304 }, + { 0x0022b, 0x000f6, 0x00304 }, + { 0x0022c, 0x000d5, 0x00304 }, + { 0x0022d, 0x000f5, 0x00304 }, + { 0x0022e, 0x0004f, 0x00307 }, + { 0x0022f, 0x0006f, 0x00307 }, + { 0x00230, 0x0022e, 0x00304 }, + { 0x00231, 0x0022f, 0x00304 }, + { 0x00232, 0x00059, 0x00304 }, + { 0x00233, 0x00079, 0x00304 }, + { 0x00340, 0x00300, 0x00000 }, + { 0x00341, 0x00301, 0x00000 }, + { 0x00343, 0x00313, 0x00000 }, + { 0x00344, 0x00308, 0x00301 }, + { 0x00374, 0x002b9, 0x00000 }, + { 0x0037e, 0x0003b, 0x00000 }, + { 0x00385, 0x000a8, 0x00301 }, + { 0x00386, 0x00391, 0x00301 }, + { 0x00387, 0x000b7, 0x00000 }, + { 0x00388, 0x00395, 0x00301 }, + { 0x00389, 0x00397, 0x00301 }, + { 0x0038a, 0x00399, 0x00301 }, + { 0x0038c, 0x0039f, 0x00301 }, + { 0x0038e, 0x003a5, 0x00301 }, + { 0x0038f, 0x003a9, 0x00301 }, + { 0x00390, 0x003ca, 0x00301 }, + { 0x003aa, 0x00399, 0x00308 }, + { 0x003ab, 0x003a5, 0x00308 }, + { 0x003ac, 0x003b1, 0x00301 }, + { 0x003ad, 0x003b5, 0x00301 }, + { 0x003ae, 0x003b7, 0x00301 }, + { 0x003af, 0x003b9, 0x00301 }, + { 0x003b0, 0x003cb, 0x00301 }, + { 0x003ca, 0x003b9, 0x00308 }, + { 0x003cb, 0x003c5, 0x00308 }, + { 0x003cc, 0x003bf, 0x00301 }, + { 0x003cd, 0x003c5, 0x00301 }, + { 0x003ce, 0x003c9, 0x00301 }, + { 0x003d3, 0x003d2, 0x00301 }, + { 0x003d4, 0x003d2, 0x00308 }, + { 0x00400, 0x00415, 0x00300 }, + { 0x00401, 0x00415, 0x00308 }, + { 0x00403, 0x00413, 0x00301 }, + { 0x00407, 0x00406, 0x00308 }, + { 0x0040c, 0x0041a, 0x00301 }, + { 0x0040d, 0x00418, 0x00300 }, + { 0x0040e, 0x00423, 0x00306 }, + { 0x00419, 0x00418, 0x00306 }, + { 0x00439, 0x00438, 0x00306 }, + { 0x00450, 0x00435, 0x00300 }, + { 0x00451, 0x00435, 0x00308 }, + { 0x00453, 0x00433, 0x00301 }, + { 0x00457, 0x00456, 0x00308 }, + { 0x0045c, 0x0043a, 0x00301 }, + { 0x0045d, 0x00438, 0x00300 }, + { 0x0045e, 0x00443, 0x00306 }, + { 0x00476, 0x00474, 0x0030f }, + { 0x00477, 0x00475, 0x0030f }, + { 0x004c1, 0x00416, 0x00306 }, + { 0x004c2, 0x00436, 0x00306 }, + { 0x004d0, 0x00410, 0x00306 }, + { 0x004d1, 0x00430, 0x00306 }, + { 0x004d2, 0x00410, 0x00308 }, + { 0x004d3, 0x00430, 0x00308 }, + { 0x004d6, 0x00415, 0x00306 }, + { 0x004d7, 0x00435, 0x00306 }, + { 0x004da, 0x004d8, 0x00308 }, + { 0x004db, 0x004d9, 0x00308 }, + { 0x004dc, 0x00416, 0x00308 }, + { 0x004dd, 0x00436, 0x00308 }, + { 0x004de, 0x00417, 0x00308 }, + { 0x004df, 0x00437, 0x00308 }, + { 0x004e2, 0x00418, 0x00304 }, + { 0x004e3, 0x00438, 0x00304 }, + { 0x004e4, 0x00418, 0x00308 }, + { 0x004e5, 0x00438, 0x00308 }, + { 0x004e6, 0x0041e, 0x00308 }, + { 0x004e7, 0x0043e, 0x00308 }, + { 0x004ea, 0x004e8, 0x00308 }, + { 0x004eb, 0x004e9, 0x00308 }, + { 0x004ec, 0x0042d, 0x00308 }, + { 0x004ed, 0x0044d, 0x00308 }, + { 0x004ee, 0x00423, 0x00304 }, + { 0x004ef, 0x00443, 0x00304 }, + { 0x004f0, 0x00423, 0x00308 }, + { 0x004f1, 0x00443, 0x00308 }, + { 0x004f2, 0x00423, 0x0030b }, + { 0x004f3, 0x00443, 0x0030b }, + { 0x004f4, 0x00427, 0x00308 }, + { 0x004f5, 0x00447, 0x00308 }, + { 0x004f8, 0x0042b, 0x00308 }, + { 0x004f9, 0x0044b, 0x00308 }, + { 0x00622, 0x00627, 0x00653 }, + { 0x00623, 0x00627, 0x00654 }, + { 0x00624, 0x00648, 0x00654 }, + { 0x00625, 0x00627, 0x00655 }, + { 0x00626, 0x0064a, 0x00654 }, + { 0x006c0, 0x006d5, 0x00654 }, + { 0x006c2, 0x006c1, 0x00654 }, + { 0x006d3, 0x006d2, 0x00654 }, + { 0x00929, 0x00928, 0x0093c }, + { 0x00931, 0x00930, 0x0093c }, + { 0x00934, 0x00933, 0x0093c }, + { 0x00958, 0x00915, 0x0093c }, + { 0x00959, 0x00916, 0x0093c }, + { 0x0095a, 0x00917, 0x0093c }, + { 0x0095b, 0x0091c, 0x0093c }, + { 0x0095c, 0x00921, 0x0093c }, + { 0x0095d, 0x00922, 0x0093c }, + { 0x0095e, 0x0092b, 0x0093c }, + { 0x0095f, 0x0092f, 0x0093c }, + { 0x009cb, 0x009c7, 0x009be }, + { 0x009cc, 0x009c7, 0x009d7 }, + { 0x009dc, 0x009a1, 0x009bc }, + { 0x009dd, 0x009a2, 0x009bc }, + { 0x009df, 0x009af, 0x009bc }, + { 0x00a33, 0x00a32, 0x00a3c }, + { 0x00a36, 0x00a38, 0x00a3c }, + { 0x00a59, 0x00a16, 0x00a3c }, + { 0x00a5a, 0x00a17, 0x00a3c }, + { 0x00a5b, 0x00a1c, 0x00a3c }, + { 0x00a5e, 0x00a2b, 0x00a3c }, + { 0x00b48, 0x00b47, 0x00b56 }, + { 0x00b4b, 0x00b47, 0x00b3e }, + { 0x00b4c, 0x00b47, 0x00b57 }, + { 0x00b5c, 0x00b21, 0x00b3c }, + { 0x00b5d, 0x00b22, 0x00b3c }, + { 0x00b94, 0x00b92, 0x00bd7 }, + { 0x00bca, 0x00bc6, 0x00bbe }, + { 0x00bcb, 0x00bc7, 0x00bbe }, + { 0x00bcc, 0x00bc6, 0x00bd7 }, + { 0x00c48, 0x00c46, 0x00c56 }, + { 0x00cc0, 0x00cbf, 0x00cd5 }, + { 0x00cc7, 0x00cc6, 0x00cd5 }, + { 0x00cc8, 0x00cc6, 0x00cd6 }, + { 0x00cca, 0x00cc6, 0x00cc2 }, + { 0x00ccb, 0x00cca, 0x00cd5 }, + { 0x00d4a, 0x00d46, 0x00d3e }, + { 0x00d4b, 0x00d47, 0x00d3e }, + { 0x00d4c, 0x00d46, 0x00d57 }, + { 0x00dda, 0x00dd9, 0x00dca }, + { 0x00ddc, 0x00dd9, 0x00dcf }, + { 0x00ddd, 0x00ddc, 0x00dca }, + { 0x00dde, 0x00dd9, 0x00ddf }, + { 0x00f43, 0x00f42, 0x00fb7 }, + { 0x00f4d, 0x00f4c, 0x00fb7 }, + { 0x00f52, 0x00f51, 0x00fb7 }, + { 0x00f57, 0x00f56, 0x00fb7 }, + { 0x00f5c, 0x00f5b, 0x00fb7 }, + { 0x00f69, 0x00f40, 0x00fb5 }, + { 0x00f73, 0x00f71, 0x00f72 }, + { 0x00f75, 0x00f71, 0x00f74 }, + { 0x00f76, 0x00fb2, 0x00f80 }, + { 0x00f78, 0x00fb3, 0x00f80 }, + { 0x00f81, 0x00f71, 0x00f80 }, + { 0x00f93, 0x00f92, 0x00fb7 }, + { 0x00f9d, 0x00f9c, 0x00fb7 }, + { 0x00fa2, 0x00fa1, 0x00fb7 }, + { 0x00fa7, 0x00fa6, 0x00fb7 }, + { 0x00fac, 0x00fab, 0x00fb7 }, + { 0x00fb9, 0x00f90, 0x00fb5 }, + { 0x01026, 0x01025, 0x0102e }, + { 0x01b06, 0x01b05, 0x01b35 }, + { 0x01b08, 0x01b07, 0x01b35 }, + { 0x01b0a, 0x01b09, 0x01b35 }, + { 0x01b0c, 0x01b0b, 0x01b35 }, + { 0x01b0e, 0x01b0d, 0x01b35 }, + { 0x01b12, 0x01b11, 0x01b35 }, + { 0x01b3b, 0x01b3a, 0x01b35 }, + { 0x01b3d, 0x01b3c, 0x01b35 }, + { 0x01b40, 0x01b3e, 0x01b35 }, + { 0x01b41, 0x01b3f, 0x01b35 }, + { 0x01b43, 0x01b42, 0x01b35 }, + { 0x01e00, 0x00041, 0x00325 }, + { 0x01e01, 0x00061, 0x00325 }, + { 0x01e02, 0x00042, 0x00307 }, + { 0x01e03, 0x00062, 0x00307 }, + { 0x01e04, 0x00042, 0x00323 }, + { 0x01e05, 0x00062, 0x00323 }, + { 0x01e06, 0x00042, 0x00331 }, + { 0x01e07, 0x00062, 0x00331 }, + { 0x01e08, 0x000c7, 0x00301 }, + { 0x01e09, 0x000e7, 0x00301 }, + { 0x01e0a, 0x00044, 0x00307 }, + { 0x01e0b, 0x00064, 0x00307 }, + { 0x01e0c, 0x00044, 0x00323 }, + { 0x01e0d, 0x00064, 0x00323 }, + { 0x01e0e, 0x00044, 0x00331 }, + { 0x01e0f, 0x00064, 0x00331 }, + { 0x01e10, 0x00044, 0x00327 }, + { 0x01e11, 0x00064, 0x00327 }, + { 0x01e12, 0x00044, 0x0032d }, + { 0x01e13, 0x00064, 0x0032d }, + { 0x01e14, 0x00112, 0x00300 }, + { 0x01e15, 0x00113, 0x00300 }, + { 0x01e16, 0x00112, 0x00301 }, + { 0x01e17, 0x00113, 0x00301 }, + { 0x01e18, 0x00045, 0x0032d }, + { 0x01e19, 0x00065, 0x0032d }, + { 0x01e1a, 0x00045, 0x00330 }, + { 0x01e1b, 0x00065, 0x00330 }, + { 0x01e1c, 0x00228, 0x00306 }, + { 0x01e1d, 0x00229, 0x00306 }, + { 0x01e1e, 0x00046, 0x00307 }, + { 0x01e1f, 0x00066, 0x00307 }, + { 0x01e20, 0x00047, 0x00304 }, + { 0x01e21, 0x00067, 0x00304 }, + { 0x01e22, 0x00048, 0x00307 }, + { 0x01e23, 0x00068, 0x00307 }, + { 0x01e24, 0x00048, 0x00323 }, + { 0x01e25, 0x00068, 0x00323 }, + { 0x01e26, 0x00048, 0x00308 }, + { 0x01e27, 0x00068, 0x00308 }, + { 0x01e28, 0x00048, 0x00327 }, + { 0x01e29, 0x00068, 0x00327 }, + { 0x01e2a, 0x00048, 0x0032e }, + { 0x01e2b, 0x00068, 0x0032e }, + { 0x01e2c, 0x00049, 0x00330 }, + { 0x01e2d, 0x00069, 0x00330 }, + { 0x01e2e, 0x000cf, 0x00301 }, + { 0x01e2f, 0x000ef, 0x00301 }, + { 0x01e30, 0x0004b, 0x00301 }, + { 0x01e31, 0x0006b, 0x00301 }, + { 0x01e32, 0x0004b, 0x00323 }, + { 0x01e33, 0x0006b, 0x00323 }, + { 0x01e34, 0x0004b, 0x00331 }, + { 0x01e35, 0x0006b, 0x00331 }, + { 0x01e36, 0x0004c, 0x00323 }, + { 0x01e37, 0x0006c, 0x00323 }, + { 0x01e38, 0x01e36, 0x00304 }, + { 0x01e39, 0x01e37, 0x00304 }, + { 0x01e3a, 0x0004c, 0x00331 }, + { 0x01e3b, 0x0006c, 0x00331 }, + { 0x01e3c, 0x0004c, 0x0032d }, + { 0x01e3d, 0x0006c, 0x0032d }, + { 0x01e3e, 0x0004d, 0x00301 }, + { 0x01e3f, 0x0006d, 0x00301 }, + { 0x01e40, 0x0004d, 0x00307 }, + { 0x01e41, 0x0006d, 0x00307 }, + { 0x01e42, 0x0004d, 0x00323 }, + { 0x01e43, 0x0006d, 0x00323 }, + { 0x01e44, 0x0004e, 0x00307 }, + { 0x01e45, 0x0006e, 0x00307 }, + { 0x01e46, 0x0004e, 0x00323 }, + { 0x01e47, 0x0006e, 0x00323 }, + { 0x01e48, 0x0004e, 0x00331 }, + { 0x01e49, 0x0006e, 0x00331 }, + { 0x01e4a, 0x0004e, 0x0032d }, + { 0x01e4b, 0x0006e, 0x0032d }, + { 0x01e4c, 0x000d5, 0x00301 }, + { 0x01e4d, 0x000f5, 0x00301 }, + { 0x01e4e, 0x000d5, 0x00308 }, + { 0x01e4f, 0x000f5, 0x00308 }, + { 0x01e50, 0x0014c, 0x00300 }, + { 0x01e51, 0x0014d, 0x00300 }, + { 0x01e52, 0x0014c, 0x00301 }, + { 0x01e53, 0x0014d, 0x00301 }, + { 0x01e54, 0x00050, 0x00301 }, + { 0x01e55, 0x00070, 0x00301 }, + { 0x01e56, 0x00050, 0x00307 }, + { 0x01e57, 0x00070, 0x00307 }, + { 0x01e58, 0x00052, 0x00307 }, + { 0x01e59, 0x00072, 0x00307 }, + { 0x01e5a, 0x00052, 0x00323 }, + { 0x01e5b, 0x00072, 0x00323 }, + { 0x01e5c, 0x01e5a, 0x00304 }, + { 0x01e5d, 0x01e5b, 0x00304 }, + { 0x01e5e, 0x00052, 0x00331 }, + { 0x01e5f, 0x00072, 0x00331 }, + { 0x01e60, 0x00053, 0x00307 }, + { 0x01e61, 0x00073, 0x00307 }, + { 0x01e62, 0x00053, 0x00323 }, + { 0x01e63, 0x00073, 0x00323 }, + { 0x01e64, 0x0015a, 0x00307 }, + { 0x01e65, 0x0015b, 0x00307 }, + { 0x01e66, 0x00160, 0x00307 }, + { 0x01e67, 0x00161, 0x00307 }, + { 0x01e68, 0x01e62, 0x00307 }, + { 0x01e69, 0x01e63, 0x00307 }, + { 0x01e6a, 0x00054, 0x00307 }, + { 0x01e6b, 0x00074, 0x00307 }, + { 0x01e6c, 0x00054, 0x00323 }, + { 0x01e6d, 0x00074, 0x00323 }, + { 0x01e6e, 0x00054, 0x00331 }, + { 0x01e6f, 0x00074, 0x00331 }, + { 0x01e70, 0x00054, 0x0032d }, + { 0x01e71, 0x00074, 0x0032d }, + { 0x01e72, 0x00055, 0x00324 }, + { 0x01e73, 0x00075, 0x00324 }, + { 0x01e74, 0x00055, 0x00330 }, + { 0x01e75, 0x00075, 0x00330 }, + { 0x01e76, 0x00055, 0x0032d }, + { 0x01e77, 0x00075, 0x0032d }, + { 0x01e78, 0x00168, 0x00301 }, + { 0x01e79, 0x00169, 0x00301 }, + { 0x01e7a, 0x0016a, 0x00308 }, + { 0x01e7b, 0x0016b, 0x00308 }, + { 0x01e7c, 0x00056, 0x00303 }, + { 0x01e7d, 0x00076, 0x00303 }, + { 0x01e7e, 0x00056, 0x00323 }, + { 0x01e7f, 0x00076, 0x00323 }, + { 0x01e80, 0x00057, 0x00300 }, + { 0x01e81, 0x00077, 0x00300 }, + { 0x01e82, 0x00057, 0x00301 }, + { 0x01e83, 0x00077, 0x00301 }, + { 0x01e84, 0x00057, 0x00308 }, + { 0x01e85, 0x00077, 0x00308 }, + { 0x01e86, 0x00057, 0x00307 }, + { 0x01e87, 0x00077, 0x00307 }, + { 0x01e88, 0x00057, 0x00323 }, + { 0x01e89, 0x00077, 0x00323 }, + { 0x01e8a, 0x00058, 0x00307 }, + { 0x01e8b, 0x00078, 0x00307 }, + { 0x01e8c, 0x00058, 0x00308 }, + { 0x01e8d, 0x00078, 0x00308 }, + { 0x01e8e, 0x00059, 0x00307 }, + { 0x01e8f, 0x00079, 0x00307 }, + { 0x01e90, 0x0005a, 0x00302 }, + { 0x01e91, 0x0007a, 0x00302 }, + { 0x01e92, 0x0005a, 0x00323 }, + { 0x01e93, 0x0007a, 0x00323 }, + { 0x01e94, 0x0005a, 0x00331 }, + { 0x01e95, 0x0007a, 0x00331 }, + { 0x01e96, 0x00068, 0x00331 }, + { 0x01e97, 0x00074, 0x00308 }, + { 0x01e98, 0x00077, 0x0030a }, + { 0x01e99, 0x00079, 0x0030a }, + { 0x01e9b, 0x0017f, 0x00307 }, + { 0x01ea0, 0x00041, 0x00323 }, + { 0x01ea1, 0x00061, 0x00323 }, + { 0x01ea2, 0x00041, 0x00309 }, + { 0x01ea3, 0x00061, 0x00309 }, + { 0x01ea4, 0x000c2, 0x00301 }, + { 0x01ea5, 0x000e2, 0x00301 }, + { 0x01ea6, 0x000c2, 0x00300 }, + { 0x01ea7, 0x000e2, 0x00300 }, + { 0x01ea8, 0x000c2, 0x00309 }, + { 0x01ea9, 0x000e2, 0x00309 }, + { 0x01eaa, 0x000c2, 0x00303 }, + { 0x01eab, 0x000e2, 0x00303 }, + { 0x01eac, 0x01ea0, 0x00302 }, + { 0x01ead, 0x01ea1, 0x00302 }, + { 0x01eae, 0x00102, 0x00301 }, + { 0x01eaf, 0x00103, 0x00301 }, + { 0x01eb0, 0x00102, 0x00300 }, + { 0x01eb1, 0x00103, 0x00300 }, + { 0x01eb2, 0x00102, 0x00309 }, + { 0x01eb3, 0x00103, 0x00309 }, + { 0x01eb4, 0x00102, 0x00303 }, + { 0x01eb5, 0x00103, 0x00303 }, + { 0x01eb6, 0x01ea0, 0x00306 }, + { 0x01eb7, 0x01ea1, 0x00306 }, + { 0x01eb8, 0x00045, 0x00323 }, + { 0x01eb9, 0x00065, 0x00323 }, + { 0x01eba, 0x00045, 0x00309 }, + { 0x01ebb, 0x00065, 0x00309 }, + { 0x01ebc, 0x00045, 0x00303 }, + { 0x01ebd, 0x00065, 0x00303 }, + { 0x01ebe, 0x000ca, 0x00301 }, + { 0x01ebf, 0x000ea, 0x00301 }, + { 0x01ec0, 0x000ca, 0x00300 }, + { 0x01ec1, 0x000ea, 0x00300 }, + { 0x01ec2, 0x000ca, 0x00309 }, + { 0x01ec3, 0x000ea, 0x00309 }, + { 0x01ec4, 0x000ca, 0x00303 }, + { 0x01ec5, 0x000ea, 0x00303 }, + { 0x01ec6, 0x01eb8, 0x00302 }, + { 0x01ec7, 0x01eb9, 0x00302 }, + { 0x01ec8, 0x00049, 0x00309 }, + { 0x01ec9, 0x00069, 0x00309 }, + { 0x01eca, 0x00049, 0x00323 }, + { 0x01ecb, 0x00069, 0x00323 }, + { 0x01ecc, 0x0004f, 0x00323 }, + { 0x01ecd, 0x0006f, 0x00323 }, + { 0x01ece, 0x0004f, 0x00309 }, + { 0x01ecf, 0x0006f, 0x00309 }, + { 0x01ed0, 0x000d4, 0x00301 }, + { 0x01ed1, 0x000f4, 0x00301 }, + { 0x01ed2, 0x000d4, 0x00300 }, + { 0x01ed3, 0x000f4, 0x00300 }, + { 0x01ed4, 0x000d4, 0x00309 }, + { 0x01ed5, 0x000f4, 0x00309 }, + { 0x01ed6, 0x000d4, 0x00303 }, + { 0x01ed7, 0x000f4, 0x00303 }, + { 0x01ed8, 0x01ecc, 0x00302 }, + { 0x01ed9, 0x01ecd, 0x00302 }, + { 0x01eda, 0x001a0, 0x00301 }, + { 0x01edb, 0x001a1, 0x00301 }, + { 0x01edc, 0x001a0, 0x00300 }, + { 0x01edd, 0x001a1, 0x00300 }, + { 0x01ede, 0x001a0, 0x00309 }, + { 0x01edf, 0x001a1, 0x00309 }, + { 0x01ee0, 0x001a0, 0x00303 }, + { 0x01ee1, 0x001a1, 0x00303 }, + { 0x01ee2, 0x001a0, 0x00323 }, + { 0x01ee3, 0x001a1, 0x00323 }, + { 0x01ee4, 0x00055, 0x00323 }, + { 0x01ee5, 0x00075, 0x00323 }, + { 0x01ee6, 0x00055, 0x00309 }, + { 0x01ee7, 0x00075, 0x00309 }, + { 0x01ee8, 0x001af, 0x00301 }, + { 0x01ee9, 0x001b0, 0x00301 }, + { 0x01eea, 0x001af, 0x00300 }, + { 0x01eeb, 0x001b0, 0x00300 }, + { 0x01eec, 0x001af, 0x00309 }, + { 0x01eed, 0x001b0, 0x00309 }, + { 0x01eee, 0x001af, 0x00303 }, + { 0x01eef, 0x001b0, 0x00303 }, + { 0x01ef0, 0x001af, 0x00323 }, + { 0x01ef1, 0x001b0, 0x00323 }, + { 0x01ef2, 0x00059, 0x00300 }, + { 0x01ef3, 0x00079, 0x00300 }, + { 0x01ef4, 0x00059, 0x00323 }, + { 0x01ef5, 0x00079, 0x00323 }, + { 0x01ef6, 0x00059, 0x00309 }, + { 0x01ef7, 0x00079, 0x00309 }, + { 0x01ef8, 0x00059, 0x00303 }, + { 0x01ef9, 0x00079, 0x00303 }, + { 0x01f00, 0x003b1, 0x00313 }, + { 0x01f01, 0x003b1, 0x00314 }, + { 0x01f02, 0x01f00, 0x00300 }, + { 0x01f03, 0x01f01, 0x00300 }, + { 0x01f04, 0x01f00, 0x00301 }, + { 0x01f05, 0x01f01, 0x00301 }, + { 0x01f06, 0x01f00, 0x00342 }, + { 0x01f07, 0x01f01, 0x00342 }, + { 0x01f08, 0x00391, 0x00313 }, + { 0x01f09, 0x00391, 0x00314 }, + { 0x01f0a, 0x01f08, 0x00300 }, + { 0x01f0b, 0x01f09, 0x00300 }, + { 0x01f0c, 0x01f08, 0x00301 }, + { 0x01f0d, 0x01f09, 0x00301 }, + { 0x01f0e, 0x01f08, 0x00342 }, + { 0x01f0f, 0x01f09, 0x00342 }, + { 0x01f10, 0x003b5, 0x00313 }, + { 0x01f11, 0x003b5, 0x00314 }, + { 0x01f12, 0x01f10, 0x00300 }, + { 0x01f13, 0x01f11, 0x00300 }, + { 0x01f14, 0x01f10, 0x00301 }, + { 0x01f15, 0x01f11, 0x00301 }, + { 0x01f18, 0x00395, 0x00313 }, + { 0x01f19, 0x00395, 0x00314 }, + { 0x01f1a, 0x01f18, 0x00300 }, + { 0x01f1b, 0x01f19, 0x00300 }, + { 0x01f1c, 0x01f18, 0x00301 }, + { 0x01f1d, 0x01f19, 0x00301 }, + { 0x01f20, 0x003b7, 0x00313 }, + { 0x01f21, 0x003b7, 0x00314 }, + { 0x01f22, 0x01f20, 0x00300 }, + { 0x01f23, 0x01f21, 0x00300 }, + { 0x01f24, 0x01f20, 0x00301 }, + { 0x01f25, 0x01f21, 0x00301 }, + { 0x01f26, 0x01f20, 0x00342 }, + { 0x01f27, 0x01f21, 0x00342 }, + { 0x01f28, 0x00397, 0x00313 }, + { 0x01f29, 0x00397, 0x00314 }, + { 0x01f2a, 0x01f28, 0x00300 }, + { 0x01f2b, 0x01f29, 0x00300 }, + { 0x01f2c, 0x01f28, 0x00301 }, + { 0x01f2d, 0x01f29, 0x00301 }, + { 0x01f2e, 0x01f28, 0x00342 }, + { 0x01f2f, 0x01f29, 0x00342 }, + { 0x01f30, 0x003b9, 0x00313 }, + { 0x01f31, 0x003b9, 0x00314 }, + { 0x01f32, 0x01f30, 0x00300 }, + { 0x01f33, 0x01f31, 0x00300 }, + { 0x01f34, 0x01f30, 0x00301 }, + { 0x01f35, 0x01f31, 0x00301 }, + { 0x01f36, 0x01f30, 0x00342 }, + { 0x01f37, 0x01f31, 0x00342 }, + { 0x01f38, 0x00399, 0x00313 }, + { 0x01f39, 0x00399, 0x00314 }, + { 0x01f3a, 0x01f38, 0x00300 }, + { 0x01f3b, 0x01f39, 0x00300 }, + { 0x01f3c, 0x01f38, 0x00301 }, + { 0x01f3d, 0x01f39, 0x00301 }, + { 0x01f3e, 0x01f38, 0x00342 }, + { 0x01f3f, 0x01f39, 0x00342 }, + { 0x01f40, 0x003bf, 0x00313 }, + { 0x01f41, 0x003bf, 0x00314 }, + { 0x01f42, 0x01f40, 0x00300 }, + { 0x01f43, 0x01f41, 0x00300 }, + { 0x01f44, 0x01f40, 0x00301 }, + { 0x01f45, 0x01f41, 0x00301 }, + { 0x01f48, 0x0039f, 0x00313 }, + { 0x01f49, 0x0039f, 0x00314 }, + { 0x01f4a, 0x01f48, 0x00300 }, + { 0x01f4b, 0x01f49, 0x00300 }, + { 0x01f4c, 0x01f48, 0x00301 }, + { 0x01f4d, 0x01f49, 0x00301 }, + { 0x01f50, 0x003c5, 0x00313 }, + { 0x01f51, 0x003c5, 0x00314 }, + { 0x01f52, 0x01f50, 0x00300 }, + { 0x01f53, 0x01f51, 0x00300 }, + { 0x01f54, 0x01f50, 0x00301 }, + { 0x01f55, 0x01f51, 0x00301 }, + { 0x01f56, 0x01f50, 0x00342 }, + { 0x01f57, 0x01f51, 0x00342 }, + { 0x01f59, 0x003a5, 0x00314 }, + { 0x01f5b, 0x01f59, 0x00300 }, + { 0x01f5d, 0x01f59, 0x00301 }, + { 0x01f5f, 0x01f59, 0x00342 }, + { 0x01f60, 0x003c9, 0x00313 }, + { 0x01f61, 0x003c9, 0x00314 }, + { 0x01f62, 0x01f60, 0x00300 }, + { 0x01f63, 0x01f61, 0x00300 }, + { 0x01f64, 0x01f60, 0x00301 }, + { 0x01f65, 0x01f61, 0x00301 }, + { 0x01f66, 0x01f60, 0x00342 }, + { 0x01f67, 0x01f61, 0x00342 }, + { 0x01f68, 0x003a9, 0x00313 }, + { 0x01f69, 0x003a9, 0x00314 }, + { 0x01f6a, 0x01f68, 0x00300 }, + { 0x01f6b, 0x01f69, 0x00300 }, + { 0x01f6c, 0x01f68, 0x00301 }, + { 0x01f6d, 0x01f69, 0x00301 }, + { 0x01f6e, 0x01f68, 0x00342 }, + { 0x01f6f, 0x01f69, 0x00342 }, + { 0x01f70, 0x003b1, 0x00300 }, + { 0x01f71, 0x003ac, 0x00000 }, + { 0x01f72, 0x003b5, 0x00300 }, + { 0x01f73, 0x003ad, 0x00000 }, + { 0x01f74, 0x003b7, 0x00300 }, + { 0x01f75, 0x003ae, 0x00000 }, + { 0x01f76, 0x003b9, 0x00300 }, + { 0x01f77, 0x003af, 0x00000 }, + { 0x01f78, 0x003bf, 0x00300 }, + { 0x01f79, 0x003cc, 0x00000 }, + { 0x01f7a, 0x003c5, 0x00300 }, + { 0x01f7b, 0x003cd, 0x00000 }, + { 0x01f7c, 0x003c9, 0x00300 }, + { 0x01f7d, 0x003ce, 0x00000 }, + { 0x01f80, 0x01f00, 0x00345 }, + { 0x01f81, 0x01f01, 0x00345 }, + { 0x01f82, 0x01f02, 0x00345 }, + { 0x01f83, 0x01f03, 0x00345 }, + { 0x01f84, 0x01f04, 0x00345 }, + { 0x01f85, 0x01f05, 0x00345 }, + { 0x01f86, 0x01f06, 0x00345 }, + { 0x01f87, 0x01f07, 0x00345 }, + { 0x01f88, 0x01f08, 0x00345 }, + { 0x01f89, 0x01f09, 0x00345 }, + { 0x01f8a, 0x01f0a, 0x00345 }, + { 0x01f8b, 0x01f0b, 0x00345 }, + { 0x01f8c, 0x01f0c, 0x00345 }, + { 0x01f8d, 0x01f0d, 0x00345 }, + { 0x01f8e, 0x01f0e, 0x00345 }, + { 0x01f8f, 0x01f0f, 0x00345 }, + { 0x01f90, 0x01f20, 0x00345 }, + { 0x01f91, 0x01f21, 0x00345 }, + { 0x01f92, 0x01f22, 0x00345 }, + { 0x01f93, 0x01f23, 0x00345 }, + { 0x01f94, 0x01f24, 0x00345 }, + { 0x01f95, 0x01f25, 0x00345 }, + { 0x01f96, 0x01f26, 0x00345 }, + { 0x01f97, 0x01f27, 0x00345 }, + { 0x01f98, 0x01f28, 0x00345 }, + { 0x01f99, 0x01f29, 0x00345 }, + { 0x01f9a, 0x01f2a, 0x00345 }, + { 0x01f9b, 0x01f2b, 0x00345 }, + { 0x01f9c, 0x01f2c, 0x00345 }, + { 0x01f9d, 0x01f2d, 0x00345 }, + { 0x01f9e, 0x01f2e, 0x00345 }, + { 0x01f9f, 0x01f2f, 0x00345 }, + { 0x01fa0, 0x01f60, 0x00345 }, + { 0x01fa1, 0x01f61, 0x00345 }, + { 0x01fa2, 0x01f62, 0x00345 }, + { 0x01fa3, 0x01f63, 0x00345 }, + { 0x01fa4, 0x01f64, 0x00345 }, + { 0x01fa5, 0x01f65, 0x00345 }, + { 0x01fa6, 0x01f66, 0x00345 }, + { 0x01fa7, 0x01f67, 0x00345 }, + { 0x01fa8, 0x01f68, 0x00345 }, + { 0x01fa9, 0x01f69, 0x00345 }, + { 0x01faa, 0x01f6a, 0x00345 }, + { 0x01fab, 0x01f6b, 0x00345 }, + { 0x01fac, 0x01f6c, 0x00345 }, + { 0x01fad, 0x01f6d, 0x00345 }, + { 0x01fae, 0x01f6e, 0x00345 }, + { 0x01faf, 0x01f6f, 0x00345 }, + { 0x01fb0, 0x003b1, 0x00306 }, + { 0x01fb1, 0x003b1, 0x00304 }, + { 0x01fb2, 0x01f70, 0x00345 }, + { 0x01fb3, 0x003b1, 0x00345 }, + { 0x01fb4, 0x003ac, 0x00345 }, + { 0x01fb6, 0x003b1, 0x00342 }, + { 0x01fb7, 0x01fb6, 0x00345 }, + { 0x01fb8, 0x00391, 0x00306 }, + { 0x01fb9, 0x00391, 0x00304 }, + { 0x01fba, 0x00391, 0x00300 }, + { 0x01fbb, 0x00386, 0x00000 }, + { 0x01fbc, 0x00391, 0x00345 }, + { 0x01fbe, 0x003b9, 0x00000 }, + { 0x01fc1, 0x000a8, 0x00342 }, + { 0x01fc2, 0x01f74, 0x00345 }, + { 0x01fc3, 0x003b7, 0x00345 }, + { 0x01fc4, 0x003ae, 0x00345 }, + { 0x01fc6, 0x003b7, 0x00342 }, + { 0x01fc7, 0x01fc6, 0x00345 }, + { 0x01fc8, 0x00395, 0x00300 }, + { 0x01fc9, 0x00388, 0x00000 }, + { 0x01fca, 0x00397, 0x00300 }, + { 0x01fcb, 0x00389, 0x00000 }, + { 0x01fcc, 0x00397, 0x00345 }, + { 0x01fcd, 0x01fbf, 0x00300 }, + { 0x01fce, 0x01fbf, 0x00301 }, + { 0x01fcf, 0x01fbf, 0x00342 }, + { 0x01fd0, 0x003b9, 0x00306 }, + { 0x01fd1, 0x003b9, 0x00304 }, + { 0x01fd2, 0x003ca, 0x00300 }, + { 0x01fd3, 0x00390, 0x00000 }, + { 0x01fd6, 0x003b9, 0x00342 }, + { 0x01fd7, 0x003ca, 0x00342 }, + { 0x01fd8, 0x00399, 0x00306 }, + { 0x01fd9, 0x00399, 0x00304 }, + { 0x01fda, 0x00399, 0x00300 }, + { 0x01fdb, 0x0038a, 0x00000 }, + { 0x01fdd, 0x01ffe, 0x00300 }, + { 0x01fde, 0x01ffe, 0x00301 }, + { 0x01fdf, 0x01ffe, 0x00342 }, + { 0x01fe0, 0x003c5, 0x00306 }, + { 0x01fe1, 0x003c5, 0x00304 }, + { 0x01fe2, 0x003cb, 0x00300 }, + { 0x01fe3, 0x003b0, 0x00000 }, + { 0x01fe4, 0x003c1, 0x00313 }, + { 0x01fe5, 0x003c1, 0x00314 }, + { 0x01fe6, 0x003c5, 0x00342 }, + { 0x01fe7, 0x003cb, 0x00342 }, + { 0x01fe8, 0x003a5, 0x00306 }, + { 0x01fe9, 0x003a5, 0x00304 }, + { 0x01fea, 0x003a5, 0x00300 }, + { 0x01feb, 0x0038e, 0x00000 }, + { 0x01fec, 0x003a1, 0x00314 }, + { 0x01fed, 0x000a8, 0x00300 }, + { 0x01fee, 0x00385, 0x00000 }, + { 0x01fef, 0x00060, 0x00000 }, + { 0x01ff2, 0x01f7c, 0x00345 }, + { 0x01ff3, 0x003c9, 0x00345 }, + { 0x01ff4, 0x003ce, 0x00345 }, + { 0x01ff6, 0x003c9, 0x00342 }, + { 0x01ff7, 0x01ff6, 0x00345 }, + { 0x01ff8, 0x0039f, 0x00300 }, + { 0x01ff9, 0x0038c, 0x00000 }, + { 0x01ffa, 0x003a9, 0x00300 }, + { 0x01ffb, 0x0038f, 0x00000 }, + { 0x01ffc, 0x003a9, 0x00345 }, + { 0x01ffd, 0x000b4, 0x00000 }, + { 0x02000, 0x02002, 0x00000 }, + { 0x02001, 0x02003, 0x00000 }, + { 0x02126, 0x003a9, 0x00000 }, + { 0x0212a, 0x0004b, 0x00000 }, + { 0x0212b, 0x000c5, 0x00000 }, + { 0x0219a, 0x02190, 0x00338 }, + { 0x0219b, 0x02192, 0x00338 }, + { 0x021ae, 0x02194, 0x00338 }, + { 0x021cd, 0x021d0, 0x00338 }, + { 0x021ce, 0x021d4, 0x00338 }, + { 0x021cf, 0x021d2, 0x00338 }, + { 0x02204, 0x02203, 0x00338 }, + { 0x02209, 0x02208, 0x00338 }, + { 0x0220c, 0x0220b, 0x00338 }, + { 0x02224, 0x02223, 0x00338 }, + { 0x02226, 0x02225, 0x00338 }, + { 0x02241, 0x0223c, 0x00338 }, + { 0x02244, 0x02243, 0x00338 }, + { 0x02247, 0x02245, 0x00338 }, + { 0x02249, 0x02248, 0x00338 }, + { 0x02260, 0x0003d, 0x00338 }, + { 0x02262, 0x02261, 0x00338 }, + { 0x0226d, 0x0224d, 0x00338 }, + { 0x0226e, 0x0003c, 0x00338 }, + { 0x0226f, 0x0003e, 0x00338 }, + { 0x02270, 0x02264, 0x00338 }, + { 0x02271, 0x02265, 0x00338 }, + { 0x02274, 0x02272, 0x00338 }, + { 0x02275, 0x02273, 0x00338 }, + { 0x02278, 0x02276, 0x00338 }, + { 0x02279, 0x02277, 0x00338 }, + { 0x02280, 0x0227a, 0x00338 }, + { 0x02281, 0x0227b, 0x00338 }, + { 0x02284, 0x02282, 0x00338 }, + { 0x02285, 0x02283, 0x00338 }, + { 0x02288, 0x02286, 0x00338 }, + { 0x02289, 0x02287, 0x00338 }, + { 0x022ac, 0x022a2, 0x00338 }, + { 0x022ad, 0x022a8, 0x00338 }, + { 0x022ae, 0x022a9, 0x00338 }, + { 0x022af, 0x022ab, 0x00338 }, + { 0x022e0, 0x0227c, 0x00338 }, + { 0x022e1, 0x0227d, 0x00338 }, + { 0x022e2, 0x02291, 0x00338 }, + { 0x022e3, 0x02292, 0x00338 }, + { 0x022ea, 0x022b2, 0x00338 }, + { 0x022eb, 0x022b3, 0x00338 }, + { 0x022ec, 0x022b4, 0x00338 }, + { 0x022ed, 0x022b5, 0x00338 }, + { 0x02329, 0x03008, 0x00000 }, + { 0x0232a, 0x03009, 0x00000 }, + { 0x02adc, 0x02add, 0x00338 }, + { 0x0304c, 0x0304b, 0x03099 }, + { 0x0304e, 0x0304d, 0x03099 }, + { 0x03050, 0x0304f, 0x03099 }, + { 0x03052, 0x03051, 0x03099 }, + { 0x03054, 0x03053, 0x03099 }, + { 0x03056, 0x03055, 0x03099 }, + { 0x03058, 0x03057, 0x03099 }, + { 0x0305a, 0x03059, 0x03099 }, + { 0x0305c, 0x0305b, 0x03099 }, + { 0x0305e, 0x0305d, 0x03099 }, + { 0x03060, 0x0305f, 0x03099 }, + { 0x03062, 0x03061, 0x03099 }, + { 0x03065, 0x03064, 0x03099 }, + { 0x03067, 0x03066, 0x03099 }, + { 0x03069, 0x03068, 0x03099 }, + { 0x03070, 0x0306f, 0x03099 }, + { 0x03071, 0x0306f, 0x0309a }, + { 0x03073, 0x03072, 0x03099 }, + { 0x03074, 0x03072, 0x0309a }, + { 0x03076, 0x03075, 0x03099 }, + { 0x03077, 0x03075, 0x0309a }, + { 0x03079, 0x03078, 0x03099 }, + { 0x0307a, 0x03078, 0x0309a }, + { 0x0307c, 0x0307b, 0x03099 }, + { 0x0307d, 0x0307b, 0x0309a }, + { 0x03094, 0x03046, 0x03099 }, + { 0x0309e, 0x0309d, 0x03099 }, + { 0x030ac, 0x030ab, 0x03099 }, + { 0x030ae, 0x030ad, 0x03099 }, + { 0x030b0, 0x030af, 0x03099 }, + { 0x030b2, 0x030b1, 0x03099 }, + { 0x030b4, 0x030b3, 0x03099 }, + { 0x030b6, 0x030b5, 0x03099 }, + { 0x030b8, 0x030b7, 0x03099 }, + { 0x030ba, 0x030b9, 0x03099 }, + { 0x030bc, 0x030bb, 0x03099 }, + { 0x030be, 0x030bd, 0x03099 }, + { 0x030c0, 0x030bf, 0x03099 }, + { 0x030c2, 0x030c1, 0x03099 }, + { 0x030c5, 0x030c4, 0x03099 }, + { 0x030c7, 0x030c6, 0x03099 }, + { 0x030c9, 0x030c8, 0x03099 }, + { 0x030d0, 0x030cf, 0x03099 }, + { 0x030d1, 0x030cf, 0x0309a }, + { 0x030d3, 0x030d2, 0x03099 }, + { 0x030d4, 0x030d2, 0x0309a }, + { 0x030d6, 0x030d5, 0x03099 }, + { 0x030d7, 0x030d5, 0x0309a }, + { 0x030d9, 0x030d8, 0x03099 }, + { 0x030da, 0x030d8, 0x0309a }, + { 0x030dc, 0x030db, 0x03099 }, + { 0x030dd, 0x030db, 0x0309a }, + { 0x030f4, 0x030a6, 0x03099 }, + { 0x030f7, 0x030ef, 0x03099 }, + { 0x030f8, 0x030f0, 0x03099 }, + { 0x030f9, 0x030f1, 0x03099 }, + { 0x030fa, 0x030f2, 0x03099 }, + { 0x030fe, 0x030fd, 0x03099 }, + { 0x0f900, 0x08c48, 0x00000 }, + { 0x0f901, 0x066f4, 0x00000 }, + { 0x0f902, 0x08eca, 0x00000 }, + { 0x0f903, 0x08cc8, 0x00000 }, + { 0x0f904, 0x06ed1, 0x00000 }, + { 0x0f905, 0x04e32, 0x00000 }, + { 0x0f906, 0x053e5, 0x00000 }, + { 0x0f907, 0x09f9c, 0x00000 }, + { 0x0f908, 0x09f9c, 0x00000 }, + { 0x0f909, 0x05951, 0x00000 }, + { 0x0f90a, 0x091d1, 0x00000 }, + { 0x0f90b, 0x05587, 0x00000 }, + { 0x0f90c, 0x05948, 0x00000 }, + { 0x0f90d, 0x061f6, 0x00000 }, + { 0x0f90e, 0x07669, 0x00000 }, + { 0x0f90f, 0x07f85, 0x00000 }, + { 0x0f910, 0x0863f, 0x00000 }, + { 0x0f911, 0x087ba, 0x00000 }, + { 0x0f912, 0x088f8, 0x00000 }, + { 0x0f913, 0x0908f, 0x00000 }, + { 0x0f914, 0x06a02, 0x00000 }, + { 0x0f915, 0x06d1b, 0x00000 }, + { 0x0f916, 0x070d9, 0x00000 }, + { 0x0f917, 0x073de, 0x00000 }, + { 0x0f918, 0x0843d, 0x00000 }, + { 0x0f919, 0x0916a, 0x00000 }, + { 0x0f91a, 0x099f1, 0x00000 }, + { 0x0f91b, 0x04e82, 0x00000 }, + { 0x0f91c, 0x05375, 0x00000 }, + { 0x0f91d, 0x06b04, 0x00000 }, + { 0x0f91e, 0x0721b, 0x00000 }, + { 0x0f91f, 0x0862d, 0x00000 }, + { 0x0f920, 0x09e1e, 0x00000 }, + { 0x0f921, 0x05d50, 0x00000 }, + { 0x0f922, 0x06feb, 0x00000 }, + { 0x0f923, 0x085cd, 0x00000 }, + { 0x0f924, 0x08964, 0x00000 }, + { 0x0f925, 0x062c9, 0x00000 }, + { 0x0f926, 0x081d8, 0x00000 }, + { 0x0f927, 0x0881f, 0x00000 }, + { 0x0f928, 0x05eca, 0x00000 }, + { 0x0f929, 0x06717, 0x00000 }, + { 0x0f92a, 0x06d6a, 0x00000 }, + { 0x0f92b, 0x072fc, 0x00000 }, + { 0x0f92c, 0x090ce, 0x00000 }, + { 0x0f92d, 0x04f86, 0x00000 }, + { 0x0f92e, 0x051b7, 0x00000 }, + { 0x0f92f, 0x052de, 0x00000 }, + { 0x0f930, 0x064c4, 0x00000 }, + { 0x0f931, 0x06ad3, 0x00000 }, + { 0x0f932, 0x07210, 0x00000 }, + { 0x0f933, 0x076e7, 0x00000 }, + { 0x0f934, 0x08001, 0x00000 }, + { 0x0f935, 0x08606, 0x00000 }, + { 0x0f936, 0x0865c, 0x00000 }, + { 0x0f937, 0x08def, 0x00000 }, + { 0x0f938, 0x09732, 0x00000 }, + { 0x0f939, 0x09b6f, 0x00000 }, + { 0x0f93a, 0x09dfa, 0x00000 }, + { 0x0f93b, 0x0788c, 0x00000 }, + { 0x0f93c, 0x0797f, 0x00000 }, + { 0x0f93d, 0x07da0, 0x00000 }, + { 0x0f93e, 0x083c9, 0x00000 }, + { 0x0f93f, 0x09304, 0x00000 }, + { 0x0f940, 0x09e7f, 0x00000 }, + { 0x0f941, 0x08ad6, 0x00000 }, + { 0x0f942, 0x058df, 0x00000 }, + { 0x0f943, 0x05f04, 0x00000 }, + { 0x0f944, 0x07c60, 0x00000 }, + { 0x0f945, 0x0807e, 0x00000 }, + { 0x0f946, 0x07262, 0x00000 }, + { 0x0f947, 0x078ca, 0x00000 }, + { 0x0f948, 0x08cc2, 0x00000 }, + { 0x0f949, 0x096f7, 0x00000 }, + { 0x0f94a, 0x058d8, 0x00000 }, + { 0x0f94b, 0x05c62, 0x00000 }, + { 0x0f94c, 0x06a13, 0x00000 }, + { 0x0f94d, 0x06dda, 0x00000 }, + { 0x0f94e, 0x06f0f, 0x00000 }, + { 0x0f94f, 0x07d2f, 0x00000 }, + { 0x0f950, 0x07e37, 0x00000 }, + { 0x0f951, 0x0964b, 0x00000 }, + { 0x0f952, 0x052d2, 0x00000 }, + { 0x0f953, 0x0808b, 0x00000 }, + { 0x0f954, 0x051dc, 0x00000 }, + { 0x0f955, 0x051cc, 0x00000 }, + { 0x0f956, 0x07a1c, 0x00000 }, + { 0x0f957, 0x07dbe, 0x00000 }, + { 0x0f958, 0x083f1, 0x00000 }, + { 0x0f959, 0x09675, 0x00000 }, + { 0x0f95a, 0x08b80, 0x00000 }, + { 0x0f95b, 0x062cf, 0x00000 }, + { 0x0f95c, 0x06a02, 0x00000 }, + { 0x0f95d, 0x08afe, 0x00000 }, + { 0x0f95e, 0x04e39, 0x00000 }, + { 0x0f95f, 0x05be7, 0x00000 }, + { 0x0f960, 0x06012, 0x00000 }, + { 0x0f961, 0x07387, 0x00000 }, + { 0x0f962, 0x07570, 0x00000 }, + { 0x0f963, 0x05317, 0x00000 }, + { 0x0f964, 0x078fb, 0x00000 }, + { 0x0f965, 0x04fbf, 0x00000 }, + { 0x0f966, 0x05fa9, 0x00000 }, + { 0x0f967, 0x04e0d, 0x00000 }, + { 0x0f968, 0x06ccc, 0x00000 }, + { 0x0f969, 0x06578, 0x00000 }, + { 0x0f96a, 0x07d22, 0x00000 }, + { 0x0f96b, 0x053c3, 0x00000 }, + { 0x0f96c, 0x0585e, 0x00000 }, + { 0x0f96d, 0x07701, 0x00000 }, + { 0x0f96e, 0x08449, 0x00000 }, + { 0x0f96f, 0x08aaa, 0x00000 }, + { 0x0f970, 0x06bba, 0x00000 }, + { 0x0f971, 0x08fb0, 0x00000 }, + { 0x0f972, 0x06c88, 0x00000 }, + { 0x0f973, 0x062fe, 0x00000 }, + { 0x0f974, 0x082e5, 0x00000 }, + { 0x0f975, 0x063a0, 0x00000 }, + { 0x0f976, 0x07565, 0x00000 }, + { 0x0f977, 0x04eae, 0x00000 }, + { 0x0f978, 0x05169, 0x00000 }, + { 0x0f979, 0x051c9, 0x00000 }, + { 0x0f97a, 0x06881, 0x00000 }, + { 0x0f97b, 0x07ce7, 0x00000 }, + { 0x0f97c, 0x0826f, 0x00000 }, + { 0x0f97d, 0x08ad2, 0x00000 }, + { 0x0f97e, 0x091cf, 0x00000 }, + { 0x0f97f, 0x052f5, 0x00000 }, + { 0x0f980, 0x05442, 0x00000 }, + { 0x0f981, 0x05973, 0x00000 }, + { 0x0f982, 0x05eec, 0x00000 }, + { 0x0f983, 0x065c5, 0x00000 }, + { 0x0f984, 0x06ffe, 0x00000 }, + { 0x0f985, 0x0792a, 0x00000 }, + { 0x0f986, 0x095ad, 0x00000 }, + { 0x0f987, 0x09a6a, 0x00000 }, + { 0x0f988, 0x09e97, 0x00000 }, + { 0x0f989, 0x09ece, 0x00000 }, + { 0x0f98a, 0x0529b, 0x00000 }, + { 0x0f98b, 0x066c6, 0x00000 }, + { 0x0f98c, 0x06b77, 0x00000 }, + { 0x0f98d, 0x08f62, 0x00000 }, + { 0x0f98e, 0x05e74, 0x00000 }, + { 0x0f98f, 0x06190, 0x00000 }, + { 0x0f990, 0x06200, 0x00000 }, + { 0x0f991, 0x0649a, 0x00000 }, + { 0x0f992, 0x06f23, 0x00000 }, + { 0x0f993, 0x07149, 0x00000 }, + { 0x0f994, 0x07489, 0x00000 }, + { 0x0f995, 0x079ca, 0x00000 }, + { 0x0f996, 0x07df4, 0x00000 }, + { 0x0f997, 0x0806f, 0x00000 }, + { 0x0f998, 0x08f26, 0x00000 }, + { 0x0f999, 0x084ee, 0x00000 }, + { 0x0f99a, 0x09023, 0x00000 }, + { 0x0f99b, 0x0934a, 0x00000 }, + { 0x0f99c, 0x05217, 0x00000 }, + { 0x0f99d, 0x052a3, 0x00000 }, + { 0x0f99e, 0x054bd, 0x00000 }, + { 0x0f99f, 0x070c8, 0x00000 }, + { 0x0f9a0, 0x088c2, 0x00000 }, + { 0x0f9a1, 0x08aaa, 0x00000 }, + { 0x0f9a2, 0x05ec9, 0x00000 }, + { 0x0f9a3, 0x05ff5, 0x00000 }, + { 0x0f9a4, 0x0637b, 0x00000 }, + { 0x0f9a5, 0x06bae, 0x00000 }, + { 0x0f9a6, 0x07c3e, 0x00000 }, + { 0x0f9a7, 0x07375, 0x00000 }, + { 0x0f9a8, 0x04ee4, 0x00000 }, + { 0x0f9a9, 0x056f9, 0x00000 }, + { 0x0f9aa, 0x05be7, 0x00000 }, + { 0x0f9ab, 0x05dba, 0x00000 }, + { 0x0f9ac, 0x0601c, 0x00000 }, + { 0x0f9ad, 0x073b2, 0x00000 }, + { 0x0f9ae, 0x07469, 0x00000 }, + { 0x0f9af, 0x07f9a, 0x00000 }, + { 0x0f9b0, 0x08046, 0x00000 }, + { 0x0f9b1, 0x09234, 0x00000 }, + { 0x0f9b2, 0x096f6, 0x00000 }, + { 0x0f9b3, 0x09748, 0x00000 }, + { 0x0f9b4, 0x09818, 0x00000 }, + { 0x0f9b5, 0x04f8b, 0x00000 }, + { 0x0f9b6, 0x079ae, 0x00000 }, + { 0x0f9b7, 0x091b4, 0x00000 }, + { 0x0f9b8, 0x096b8, 0x00000 }, + { 0x0f9b9, 0x060e1, 0x00000 }, + { 0x0f9ba, 0x04e86, 0x00000 }, + { 0x0f9bb, 0x050da, 0x00000 }, + { 0x0f9bc, 0x05bee, 0x00000 }, + { 0x0f9bd, 0x05c3f, 0x00000 }, + { 0x0f9be, 0x06599, 0x00000 }, + { 0x0f9bf, 0x06a02, 0x00000 }, + { 0x0f9c0, 0x071ce, 0x00000 }, + { 0x0f9c1, 0x07642, 0x00000 }, + { 0x0f9c2, 0x084fc, 0x00000 }, + { 0x0f9c3, 0x0907c, 0x00000 }, + { 0x0f9c4, 0x09f8d, 0x00000 }, + { 0x0f9c5, 0x06688, 0x00000 }, + { 0x0f9c6, 0x0962e, 0x00000 }, + { 0x0f9c7, 0x05289, 0x00000 }, + { 0x0f9c8, 0x0677b, 0x00000 }, + { 0x0f9c9, 0x067f3, 0x00000 }, + { 0x0f9ca, 0x06d41, 0x00000 }, + { 0x0f9cb, 0x06e9c, 0x00000 }, + { 0x0f9cc, 0x07409, 0x00000 }, + { 0x0f9cd, 0x07559, 0x00000 }, + { 0x0f9ce, 0x0786b, 0x00000 }, + { 0x0f9cf, 0x07d10, 0x00000 }, + { 0x0f9d0, 0x0985e, 0x00000 }, + { 0x0f9d1, 0x0516d, 0x00000 }, + { 0x0f9d2, 0x0622e, 0x00000 }, + { 0x0f9d3, 0x09678, 0x00000 }, + { 0x0f9d4, 0x0502b, 0x00000 }, + { 0x0f9d5, 0x05d19, 0x00000 }, + { 0x0f9d6, 0x06dea, 0x00000 }, + { 0x0f9d7, 0x08f2a, 0x00000 }, + { 0x0f9d8, 0x05f8b, 0x00000 }, + { 0x0f9d9, 0x06144, 0x00000 }, + { 0x0f9da, 0x06817, 0x00000 }, + { 0x0f9db, 0x07387, 0x00000 }, + { 0x0f9dc, 0x09686, 0x00000 }, + { 0x0f9dd, 0x05229, 0x00000 }, + { 0x0f9de, 0x0540f, 0x00000 }, + { 0x0f9df, 0x05c65, 0x00000 }, + { 0x0f9e0, 0x06613, 0x00000 }, + { 0x0f9e1, 0x0674e, 0x00000 }, + { 0x0f9e2, 0x068a8, 0x00000 }, + { 0x0f9e3, 0x06ce5, 0x00000 }, + { 0x0f9e4, 0x07406, 0x00000 }, + { 0x0f9e5, 0x075e2, 0x00000 }, + { 0x0f9e6, 0x07f79, 0x00000 }, + { 0x0f9e7, 0x088cf, 0x00000 }, + { 0x0f9e8, 0x088e1, 0x00000 }, + { 0x0f9e9, 0x091cc, 0x00000 }, + { 0x0f9ea, 0x096e2, 0x00000 }, + { 0x0f9eb, 0x0533f, 0x00000 }, + { 0x0f9ec, 0x06eba, 0x00000 }, + { 0x0f9ed, 0x0541d, 0x00000 }, + { 0x0f9ee, 0x071d0, 0x00000 }, + { 0x0f9ef, 0x07498, 0x00000 }, + { 0x0f9f0, 0x085fa, 0x00000 }, + { 0x0f9f1, 0x096a3, 0x00000 }, + { 0x0f9f2, 0x09c57, 0x00000 }, + { 0x0f9f3, 0x09e9f, 0x00000 }, + { 0x0f9f4, 0x06797, 0x00000 }, + { 0x0f9f5, 0x06dcb, 0x00000 }, + { 0x0f9f6, 0x081e8, 0x00000 }, + { 0x0f9f7, 0x07acb, 0x00000 }, + { 0x0f9f8, 0x07b20, 0x00000 }, + { 0x0f9f9, 0x07c92, 0x00000 }, + { 0x0f9fa, 0x072c0, 0x00000 }, + { 0x0f9fb, 0x07099, 0x00000 }, + { 0x0f9fc, 0x08b58, 0x00000 }, + { 0x0f9fd, 0x04ec0, 0x00000 }, + { 0x0f9fe, 0x08336, 0x00000 }, + { 0x0f9ff, 0x0523a, 0x00000 }, + { 0x0fa00, 0x05207, 0x00000 }, + { 0x0fa01, 0x05ea6, 0x00000 }, + { 0x0fa02, 0x062d3, 0x00000 }, + { 0x0fa03, 0x07cd6, 0x00000 }, + { 0x0fa04, 0x05b85, 0x00000 }, + { 0x0fa05, 0x06d1e, 0x00000 }, + { 0x0fa06, 0x066b4, 0x00000 }, + { 0x0fa07, 0x08f3b, 0x00000 }, + { 0x0fa08, 0x0884c, 0x00000 }, + { 0x0fa09, 0x0964d, 0x00000 }, + { 0x0fa0a, 0x0898b, 0x00000 }, + { 0x0fa0b, 0x05ed3, 0x00000 }, + { 0x0fa0c, 0x05140, 0x00000 }, + { 0x0fa0d, 0x055c0, 0x00000 }, + { 0x0fa10, 0x0585a, 0x00000 }, + { 0x0fa12, 0x06674, 0x00000 }, + { 0x0fa15, 0x051de, 0x00000 }, + { 0x0fa16, 0x0732a, 0x00000 }, + { 0x0fa17, 0x076ca, 0x00000 }, + { 0x0fa18, 0x0793c, 0x00000 }, + { 0x0fa19, 0x0795e, 0x00000 }, + { 0x0fa1a, 0x07965, 0x00000 }, + { 0x0fa1b, 0x0798f, 0x00000 }, + { 0x0fa1c, 0x09756, 0x00000 }, + { 0x0fa1d, 0x07cbe, 0x00000 }, + { 0x0fa1e, 0x07fbd, 0x00000 }, + { 0x0fa20, 0x08612, 0x00000 }, + { 0x0fa22, 0x08af8, 0x00000 }, + { 0x0fa25, 0x09038, 0x00000 }, + { 0x0fa26, 0x090fd, 0x00000 }, + { 0x0fa2a, 0x098ef, 0x00000 }, + { 0x0fa2b, 0x098fc, 0x00000 }, + { 0x0fa2c, 0x09928, 0x00000 }, + { 0x0fa2d, 0x09db4, 0x00000 }, + { 0x0fa2e, 0x090de, 0x00000 }, + { 0x0fa2f, 0x096b7, 0x00000 }, + { 0x0fa30, 0x04fae, 0x00000 }, + { 0x0fa31, 0x050e7, 0x00000 }, + { 0x0fa32, 0x0514d, 0x00000 }, + { 0x0fa33, 0x052c9, 0x00000 }, + { 0x0fa34, 0x052e4, 0x00000 }, + { 0x0fa35, 0x05351, 0x00000 }, + { 0x0fa36, 0x0559d, 0x00000 }, + { 0x0fa37, 0x05606, 0x00000 }, + { 0x0fa38, 0x05668, 0x00000 }, + { 0x0fa39, 0x05840, 0x00000 }, + { 0x0fa3a, 0x058a8, 0x00000 }, + { 0x0fa3b, 0x05c64, 0x00000 }, + { 0x0fa3c, 0x05c6e, 0x00000 }, + { 0x0fa3d, 0x06094, 0x00000 }, + { 0x0fa3e, 0x06168, 0x00000 }, + { 0x0fa3f, 0x0618e, 0x00000 }, + { 0x0fa40, 0x061f2, 0x00000 }, + { 0x0fa41, 0x0654f, 0x00000 }, + { 0x0fa42, 0x065e2, 0x00000 }, + { 0x0fa43, 0x06691, 0x00000 }, + { 0x0fa44, 0x06885, 0x00000 }, + { 0x0fa45, 0x06d77, 0x00000 }, + { 0x0fa46, 0x06e1a, 0x00000 }, + { 0x0fa47, 0x06f22, 0x00000 }, + { 0x0fa48, 0x0716e, 0x00000 }, + { 0x0fa49, 0x0722b, 0x00000 }, + { 0x0fa4a, 0x07422, 0x00000 }, + { 0x0fa4b, 0x07891, 0x00000 }, + { 0x0fa4c, 0x0793e, 0x00000 }, + { 0x0fa4d, 0x07949, 0x00000 }, + { 0x0fa4e, 0x07948, 0x00000 }, + { 0x0fa4f, 0x07950, 0x00000 }, + { 0x0fa50, 0x07956, 0x00000 }, + { 0x0fa51, 0x0795d, 0x00000 }, + { 0x0fa52, 0x0798d, 0x00000 }, + { 0x0fa53, 0x0798e, 0x00000 }, + { 0x0fa54, 0x07a40, 0x00000 }, + { 0x0fa55, 0x07a81, 0x00000 }, + { 0x0fa56, 0x07bc0, 0x00000 }, + { 0x0fa57, 0x07df4, 0x00000 }, + { 0x0fa58, 0x07e09, 0x00000 }, + { 0x0fa59, 0x07e41, 0x00000 }, + { 0x0fa5a, 0x07f72, 0x00000 }, + { 0x0fa5b, 0x08005, 0x00000 }, + { 0x0fa5c, 0x081ed, 0x00000 }, + { 0x0fa5d, 0x08279, 0x00000 }, + { 0x0fa5e, 0x08279, 0x00000 }, + { 0x0fa5f, 0x08457, 0x00000 }, + { 0x0fa60, 0x08910, 0x00000 }, + { 0x0fa61, 0x08996, 0x00000 }, + { 0x0fa62, 0x08b01, 0x00000 }, + { 0x0fa63, 0x08b39, 0x00000 }, + { 0x0fa64, 0x08cd3, 0x00000 }, + { 0x0fa65, 0x08d08, 0x00000 }, + { 0x0fa66, 0x08fb6, 0x00000 }, + { 0x0fa67, 0x09038, 0x00000 }, + { 0x0fa68, 0x096e3, 0x00000 }, + { 0x0fa69, 0x097ff, 0x00000 }, + { 0x0fa6a, 0x0983b, 0x00000 }, + { 0x0fa6b, 0x06075, 0x00000 }, + { 0x0fa6c, 0x242ee, 0x00000 }, + { 0x0fa6d, 0x08218, 0x00000 }, + { 0x0fa70, 0x04e26, 0x00000 }, + { 0x0fa71, 0x051b5, 0x00000 }, + { 0x0fa72, 0x05168, 0x00000 }, + { 0x0fa73, 0x04f80, 0x00000 }, + { 0x0fa74, 0x05145, 0x00000 }, + { 0x0fa75, 0x05180, 0x00000 }, + { 0x0fa76, 0x052c7, 0x00000 }, + { 0x0fa77, 0x052fa, 0x00000 }, + { 0x0fa78, 0x0559d, 0x00000 }, + { 0x0fa79, 0x05555, 0x00000 }, + { 0x0fa7a, 0x05599, 0x00000 }, + { 0x0fa7b, 0x055e2, 0x00000 }, + { 0x0fa7c, 0x0585a, 0x00000 }, + { 0x0fa7d, 0x058b3, 0x00000 }, + { 0x0fa7e, 0x05944, 0x00000 }, + { 0x0fa7f, 0x05954, 0x00000 }, + { 0x0fa80, 0x05a62, 0x00000 }, + { 0x0fa81, 0x05b28, 0x00000 }, + { 0x0fa82, 0x05ed2, 0x00000 }, + { 0x0fa83, 0x05ed9, 0x00000 }, + { 0x0fa84, 0x05f69, 0x00000 }, + { 0x0fa85, 0x05fad, 0x00000 }, + { 0x0fa86, 0x060d8, 0x00000 }, + { 0x0fa87, 0x0614e, 0x00000 }, + { 0x0fa88, 0x06108, 0x00000 }, + { 0x0fa89, 0x0618e, 0x00000 }, + { 0x0fa8a, 0x06160, 0x00000 }, + { 0x0fa8b, 0x061f2, 0x00000 }, + { 0x0fa8c, 0x06234, 0x00000 }, + { 0x0fa8d, 0x063c4, 0x00000 }, + { 0x0fa8e, 0x0641c, 0x00000 }, + { 0x0fa8f, 0x06452, 0x00000 }, + { 0x0fa90, 0x06556, 0x00000 }, + { 0x0fa91, 0x06674, 0x00000 }, + { 0x0fa92, 0x06717, 0x00000 }, + { 0x0fa93, 0x0671b, 0x00000 }, + { 0x0fa94, 0x06756, 0x00000 }, + { 0x0fa95, 0x06b79, 0x00000 }, + { 0x0fa96, 0x06bba, 0x00000 }, + { 0x0fa97, 0x06d41, 0x00000 }, + { 0x0fa98, 0x06edb, 0x00000 }, + { 0x0fa99, 0x06ecb, 0x00000 }, + { 0x0fa9a, 0x06f22, 0x00000 }, + { 0x0fa9b, 0x0701e, 0x00000 }, + { 0x0fa9c, 0x0716e, 0x00000 }, + { 0x0fa9d, 0x077a7, 0x00000 }, + { 0x0fa9e, 0x07235, 0x00000 }, + { 0x0fa9f, 0x072af, 0x00000 }, + { 0x0faa0, 0x0732a, 0x00000 }, + { 0x0faa1, 0x07471, 0x00000 }, + { 0x0faa2, 0x07506, 0x00000 }, + { 0x0faa3, 0x0753b, 0x00000 }, + { 0x0faa4, 0x0761d, 0x00000 }, + { 0x0faa5, 0x0761f, 0x00000 }, + { 0x0faa6, 0x076ca, 0x00000 }, + { 0x0faa7, 0x076db, 0x00000 }, + { 0x0faa8, 0x076f4, 0x00000 }, + { 0x0faa9, 0x0774a, 0x00000 }, + { 0x0faaa, 0x07740, 0x00000 }, + { 0x0faab, 0x078cc, 0x00000 }, + { 0x0faac, 0x07ab1, 0x00000 }, + { 0x0faad, 0x07bc0, 0x00000 }, + { 0x0faae, 0x07c7b, 0x00000 }, + { 0x0faaf, 0x07d5b, 0x00000 }, + { 0x0fab0, 0x07df4, 0x00000 }, + { 0x0fab1, 0x07f3e, 0x00000 }, + { 0x0fab2, 0x08005, 0x00000 }, + { 0x0fab3, 0x08352, 0x00000 }, + { 0x0fab4, 0x083ef, 0x00000 }, + { 0x0fab5, 0x08779, 0x00000 }, + { 0x0fab6, 0x08941, 0x00000 }, + { 0x0fab7, 0x08986, 0x00000 }, + { 0x0fab8, 0x08996, 0x00000 }, + { 0x0fab9, 0x08abf, 0x00000 }, + { 0x0faba, 0x08af8, 0x00000 }, + { 0x0fabb, 0x08acb, 0x00000 }, + { 0x0fabc, 0x08b01, 0x00000 }, + { 0x0fabd, 0x08afe, 0x00000 }, + { 0x0fabe, 0x08aed, 0x00000 }, + { 0x0fabf, 0x08b39, 0x00000 }, + { 0x0fac0, 0x08b8a, 0x00000 }, + { 0x0fac1, 0x08d08, 0x00000 }, + { 0x0fac2, 0x08f38, 0x00000 }, + { 0x0fac3, 0x09072, 0x00000 }, + { 0x0fac4, 0x09199, 0x00000 }, + { 0x0fac5, 0x09276, 0x00000 }, + { 0x0fac6, 0x0967c, 0x00000 }, + { 0x0fac7, 0x096e3, 0x00000 }, + { 0x0fac8, 0x09756, 0x00000 }, + { 0x0fac9, 0x097db, 0x00000 }, + { 0x0faca, 0x097ff, 0x00000 }, + { 0x0facb, 0x0980b, 0x00000 }, + { 0x0facc, 0x0983b, 0x00000 }, + { 0x0facd, 0x09b12, 0x00000 }, + { 0x0face, 0x09f9c, 0x00000 }, + { 0x0facf, 0x2284a, 0x00000 }, + { 0x0fad0, 0x22844, 0x00000 }, + { 0x0fad1, 0x233d5, 0x00000 }, + { 0x0fad2, 0x03b9d, 0x00000 }, + { 0x0fad3, 0x04018, 0x00000 }, + { 0x0fad4, 0x04039, 0x00000 }, + { 0x0fad5, 0x25249, 0x00000 }, + { 0x0fad6, 0x25cd0, 0x00000 }, + { 0x0fad7, 0x27ed3, 0x00000 }, + { 0x0fad8, 0x09f43, 0x00000 }, + { 0x0fad9, 0x09f8e, 0x00000 }, + { 0x0fb1d, 0x005d9, 0x005b4 }, + { 0x0fb1f, 0x005f2, 0x005b7 }, + { 0x0fb2a, 0x005e9, 0x005c1 }, + { 0x0fb2b, 0x005e9, 0x005c2 }, + { 0x0fb2c, 0x0fb49, 0x005c1 }, + { 0x0fb2d, 0x0fb49, 0x005c2 }, + { 0x0fb2e, 0x005d0, 0x005b7 }, + { 0x0fb2f, 0x005d0, 0x005b8 }, + { 0x0fb30, 0x005d0, 0x005bc }, + { 0x0fb31, 0x005d1, 0x005bc }, + { 0x0fb32, 0x005d2, 0x005bc }, + { 0x0fb33, 0x005d3, 0x005bc }, + { 0x0fb34, 0x005d4, 0x005bc }, + { 0x0fb35, 0x005d5, 0x005bc }, + { 0x0fb36, 0x005d6, 0x005bc }, + { 0x0fb38, 0x005d8, 0x005bc }, + { 0x0fb39, 0x005d9, 0x005bc }, + { 0x0fb3a, 0x005da, 0x005bc }, + { 0x0fb3b, 0x005db, 0x005bc }, + { 0x0fb3c, 0x005dc, 0x005bc }, + { 0x0fb3e, 0x005de, 0x005bc }, + { 0x0fb40, 0x005e0, 0x005bc }, + { 0x0fb41, 0x005e1, 0x005bc }, + { 0x0fb43, 0x005e3, 0x005bc }, + { 0x0fb44, 0x005e4, 0x005bc }, + { 0x0fb46, 0x005e6, 0x005bc }, + { 0x0fb47, 0x005e7, 0x005bc }, + { 0x0fb48, 0x005e8, 0x005bc }, + { 0x0fb49, 0x005e9, 0x005bc }, + { 0x0fb4a, 0x005ea, 0x005bc }, + { 0x0fb4b, 0x005d5, 0x005b9 }, + { 0x0fb4c, 0x005d1, 0x005bf }, + { 0x0fb4d, 0x005db, 0x005bf }, + { 0x0fb4e, 0x005e4, 0x005bf }, + { 0x1109a, 0x11099, 0x110ba }, + { 0x1109c, 0x1109b, 0x110ba }, + { 0x110ab, 0x110a5, 0x110ba }, + { 0x1112e, 0x11131, 0x11127 }, + { 0x1112f, 0x11132, 0x11127 }, + { 0x1d15e, 0x1d157, 0x1d165 }, + { 0x1d15f, 0x1d158, 0x1d165 }, + { 0x1d160, 0x1d15f, 0x1d16e }, + { 0x1d161, 0x1d15f, 0x1d16f }, + { 0x1d162, 0x1d15f, 0x1d170 }, + { 0x1d163, 0x1d15f, 0x1d171 }, + { 0x1d164, 0x1d15f, 0x1d172 }, + { 0x1d1bb, 0x1d1b9, 0x1d165 }, + { 0x1d1bc, 0x1d1ba, 0x1d165 }, + { 0x1d1bd, 0x1d1bb, 0x1d16e }, + { 0x1d1be, 0x1d1bc, 0x1d16e }, + { 0x1d1bf, 0x1d1bb, 0x1d16f }, + { 0x1d1c0, 0x1d1bc, 0x1d16f }, + { 0x2f800, 0x04e3d, 0x00000 }, + { 0x2f801, 0x04e38, 0x00000 }, + { 0x2f802, 0x04e41, 0x00000 }, + { 0x2f803, 0x20122, 0x00000 }, + { 0x2f804, 0x04f60, 0x00000 }, + { 0x2f805, 0x04fae, 0x00000 }, + { 0x2f806, 0x04fbb, 0x00000 }, + { 0x2f807, 0x05002, 0x00000 }, + { 0x2f808, 0x0507a, 0x00000 }, + { 0x2f809, 0x05099, 0x00000 }, + { 0x2f80a, 0x050e7, 0x00000 }, + { 0x2f80b, 0x050cf, 0x00000 }, + { 0x2f80c, 0x0349e, 0x00000 }, + { 0x2f80d, 0x2063a, 0x00000 }, + { 0x2f80e, 0x0514d, 0x00000 }, + { 0x2f80f, 0x05154, 0x00000 }, + { 0x2f810, 0x05164, 0x00000 }, + { 0x2f811, 0x05177, 0x00000 }, + { 0x2f812, 0x2051c, 0x00000 }, + { 0x2f813, 0x034b9, 0x00000 }, + { 0x2f814, 0x05167, 0x00000 }, + { 0x2f815, 0x0518d, 0x00000 }, + { 0x2f816, 0x2054b, 0x00000 }, + { 0x2f817, 0x05197, 0x00000 }, + { 0x2f818, 0x051a4, 0x00000 }, + { 0x2f819, 0x04ecc, 0x00000 }, + { 0x2f81a, 0x051ac, 0x00000 }, + { 0x2f81b, 0x051b5, 0x00000 }, + { 0x2f81c, 0x291df, 0x00000 }, + { 0x2f81d, 0x051f5, 0x00000 }, + { 0x2f81e, 0x05203, 0x00000 }, + { 0x2f81f, 0x034df, 0x00000 }, + { 0x2f820, 0x0523b, 0x00000 }, + { 0x2f821, 0x05246, 0x00000 }, + { 0x2f822, 0x05272, 0x00000 }, + { 0x2f823, 0x05277, 0x00000 }, + { 0x2f824, 0x03515, 0x00000 }, + { 0x2f825, 0x052c7, 0x00000 }, + { 0x2f826, 0x052c9, 0x00000 }, + { 0x2f827, 0x052e4, 0x00000 }, + { 0x2f828, 0x052fa, 0x00000 }, + { 0x2f829, 0x05305, 0x00000 }, + { 0x2f82a, 0x05306, 0x00000 }, + { 0x2f82b, 0x05317, 0x00000 }, + { 0x2f82c, 0x05349, 0x00000 }, + { 0x2f82d, 0x05351, 0x00000 }, + { 0x2f82e, 0x0535a, 0x00000 }, + { 0x2f82f, 0x05373, 0x00000 }, + { 0x2f830, 0x0537d, 0x00000 }, + { 0x2f831, 0x0537f, 0x00000 }, + { 0x2f832, 0x0537f, 0x00000 }, + { 0x2f833, 0x0537f, 0x00000 }, + { 0x2f834, 0x20a2c, 0x00000 }, + { 0x2f835, 0x07070, 0x00000 }, + { 0x2f836, 0x053ca, 0x00000 }, + { 0x2f837, 0x053df, 0x00000 }, + { 0x2f838, 0x20b63, 0x00000 }, + { 0x2f839, 0x053eb, 0x00000 }, + { 0x2f83a, 0x053f1, 0x00000 }, + { 0x2f83b, 0x05406, 0x00000 }, + { 0x2f83c, 0x0549e, 0x00000 }, + { 0x2f83d, 0x05438, 0x00000 }, + { 0x2f83e, 0x05448, 0x00000 }, + { 0x2f83f, 0x05468, 0x00000 }, + { 0x2f840, 0x054a2, 0x00000 }, + { 0x2f841, 0x054f6, 0x00000 }, + { 0x2f842, 0x05510, 0x00000 }, + { 0x2f843, 0x05553, 0x00000 }, + { 0x2f844, 0x05563, 0x00000 }, + { 0x2f845, 0x05584, 0x00000 }, + { 0x2f846, 0x05584, 0x00000 }, + { 0x2f847, 0x05599, 0x00000 }, + { 0x2f848, 0x055ab, 0x00000 }, + { 0x2f849, 0x055b3, 0x00000 }, + { 0x2f84a, 0x055c2, 0x00000 }, + { 0x2f84b, 0x05716, 0x00000 }, + { 0x2f84c, 0x05606, 0x00000 }, + { 0x2f84d, 0x05717, 0x00000 }, + { 0x2f84e, 0x05651, 0x00000 }, + { 0x2f84f, 0x05674, 0x00000 }, + { 0x2f850, 0x05207, 0x00000 }, + { 0x2f851, 0x058ee, 0x00000 }, + { 0x2f852, 0x057ce, 0x00000 }, + { 0x2f853, 0x057f4, 0x00000 }, + { 0x2f854, 0x0580d, 0x00000 }, + { 0x2f855, 0x0578b, 0x00000 }, + { 0x2f856, 0x05832, 0x00000 }, + { 0x2f857, 0x05831, 0x00000 }, + { 0x2f858, 0x058ac, 0x00000 }, + { 0x2f859, 0x214e4, 0x00000 }, + { 0x2f85a, 0x058f2, 0x00000 }, + { 0x2f85b, 0x058f7, 0x00000 }, + { 0x2f85c, 0x05906, 0x00000 }, + { 0x2f85d, 0x0591a, 0x00000 }, + { 0x2f85e, 0x05922, 0x00000 }, + { 0x2f85f, 0x05962, 0x00000 }, + { 0x2f860, 0x216a8, 0x00000 }, + { 0x2f861, 0x216ea, 0x00000 }, + { 0x2f862, 0x059ec, 0x00000 }, + { 0x2f863, 0x05a1b, 0x00000 }, + { 0x2f864, 0x05a27, 0x00000 }, + { 0x2f865, 0x059d8, 0x00000 }, + { 0x2f866, 0x05a66, 0x00000 }, + { 0x2f867, 0x036ee, 0x00000 }, + { 0x2f868, 0x036fc, 0x00000 }, + { 0x2f869, 0x05b08, 0x00000 }, + { 0x2f86a, 0x05b3e, 0x00000 }, + { 0x2f86b, 0x05b3e, 0x00000 }, + { 0x2f86c, 0x219c8, 0x00000 }, + { 0x2f86d, 0x05bc3, 0x00000 }, + { 0x2f86e, 0x05bd8, 0x00000 }, + { 0x2f86f, 0x05be7, 0x00000 }, + { 0x2f870, 0x05bf3, 0x00000 }, + { 0x2f871, 0x21b18, 0x00000 }, + { 0x2f872, 0x05bff, 0x00000 }, + { 0x2f873, 0x05c06, 0x00000 }, + { 0x2f874, 0x05f53, 0x00000 }, + { 0x2f875, 0x05c22, 0x00000 }, + { 0x2f876, 0x03781, 0x00000 }, + { 0x2f877, 0x05c60, 0x00000 }, + { 0x2f878, 0x05c6e, 0x00000 }, + { 0x2f879, 0x05cc0, 0x00000 }, + { 0x2f87a, 0x05c8d, 0x00000 }, + { 0x2f87b, 0x21de4, 0x00000 }, + { 0x2f87c, 0x05d43, 0x00000 }, + { 0x2f87d, 0x21de6, 0x00000 }, + { 0x2f87e, 0x05d6e, 0x00000 }, + { 0x2f87f, 0x05d6b, 0x00000 }, + { 0x2f880, 0x05d7c, 0x00000 }, + { 0x2f881, 0x05de1, 0x00000 }, + { 0x2f882, 0x05de2, 0x00000 }, + { 0x2f883, 0x0382f, 0x00000 }, + { 0x2f884, 0x05dfd, 0x00000 }, + { 0x2f885, 0x05e28, 0x00000 }, + { 0x2f886, 0x05e3d, 0x00000 }, + { 0x2f887, 0x05e69, 0x00000 }, + { 0x2f888, 0x03862, 0x00000 }, + { 0x2f889, 0x22183, 0x00000 }, + { 0x2f88a, 0x0387c, 0x00000 }, + { 0x2f88b, 0x05eb0, 0x00000 }, + { 0x2f88c, 0x05eb3, 0x00000 }, + { 0x2f88d, 0x05eb6, 0x00000 }, + { 0x2f88e, 0x05eca, 0x00000 }, + { 0x2f88f, 0x2a392, 0x00000 }, + { 0x2f890, 0x05efe, 0x00000 }, + { 0x2f891, 0x22331, 0x00000 }, + { 0x2f892, 0x22331, 0x00000 }, + { 0x2f893, 0x08201, 0x00000 }, + { 0x2f894, 0x05f22, 0x00000 }, + { 0x2f895, 0x05f22, 0x00000 }, + { 0x2f896, 0x038c7, 0x00000 }, + { 0x2f897, 0x232b8, 0x00000 }, + { 0x2f898, 0x261da, 0x00000 }, + { 0x2f899, 0x05f62, 0x00000 }, + { 0x2f89a, 0x05f6b, 0x00000 }, + { 0x2f89b, 0x038e3, 0x00000 }, + { 0x2f89c, 0x05f9a, 0x00000 }, + { 0x2f89d, 0x05fcd, 0x00000 }, + { 0x2f89e, 0x05fd7, 0x00000 }, + { 0x2f89f, 0x05ff9, 0x00000 }, + { 0x2f8a0, 0x06081, 0x00000 }, + { 0x2f8a1, 0x0393a, 0x00000 }, + { 0x2f8a2, 0x0391c, 0x00000 }, + { 0x2f8a3, 0x06094, 0x00000 }, + { 0x2f8a4, 0x226d4, 0x00000 }, + { 0x2f8a5, 0x060c7, 0x00000 }, + { 0x2f8a6, 0x06148, 0x00000 }, + { 0x2f8a7, 0x0614c, 0x00000 }, + { 0x2f8a8, 0x0614e, 0x00000 }, + { 0x2f8a9, 0x0614c, 0x00000 }, + { 0x2f8aa, 0x0617a, 0x00000 }, + { 0x2f8ab, 0x0618e, 0x00000 }, + { 0x2f8ac, 0x061b2, 0x00000 }, + { 0x2f8ad, 0x061a4, 0x00000 }, + { 0x2f8ae, 0x061af, 0x00000 }, + { 0x2f8af, 0x061de, 0x00000 }, + { 0x2f8b0, 0x061f2, 0x00000 }, + { 0x2f8b1, 0x061f6, 0x00000 }, + { 0x2f8b2, 0x06210, 0x00000 }, + { 0x2f8b3, 0x0621b, 0x00000 }, + { 0x2f8b4, 0x0625d, 0x00000 }, + { 0x2f8b5, 0x062b1, 0x00000 }, + { 0x2f8b6, 0x062d4, 0x00000 }, + { 0x2f8b7, 0x06350, 0x00000 }, + { 0x2f8b8, 0x22b0c, 0x00000 }, + { 0x2f8b9, 0x0633d, 0x00000 }, + { 0x2f8ba, 0x062fc, 0x00000 }, + { 0x2f8bb, 0x06368, 0x00000 }, + { 0x2f8bc, 0x06383, 0x00000 }, + { 0x2f8bd, 0x063e4, 0x00000 }, + { 0x2f8be, 0x22bf1, 0x00000 }, + { 0x2f8bf, 0x06422, 0x00000 }, + { 0x2f8c0, 0x063c5, 0x00000 }, + { 0x2f8c1, 0x063a9, 0x00000 }, + { 0x2f8c2, 0x03a2e, 0x00000 }, + { 0x2f8c3, 0x06469, 0x00000 }, + { 0x2f8c4, 0x0647e, 0x00000 }, + { 0x2f8c5, 0x0649d, 0x00000 }, + { 0x2f8c6, 0x06477, 0x00000 }, + { 0x2f8c7, 0x03a6c, 0x00000 }, + { 0x2f8c8, 0x0654f, 0x00000 }, + { 0x2f8c9, 0x0656c, 0x00000 }, + { 0x2f8ca, 0x2300a, 0x00000 }, + { 0x2f8cb, 0x065e3, 0x00000 }, + { 0x2f8cc, 0x066f8, 0x00000 }, + { 0x2f8cd, 0x06649, 0x00000 }, + { 0x2f8ce, 0x03b19, 0x00000 }, + { 0x2f8cf, 0x06691, 0x00000 }, + { 0x2f8d0, 0x03b08, 0x00000 }, + { 0x2f8d1, 0x03ae4, 0x00000 }, + { 0x2f8d2, 0x05192, 0x00000 }, + { 0x2f8d3, 0x05195, 0x00000 }, + { 0x2f8d4, 0x06700, 0x00000 }, + { 0x2f8d5, 0x0669c, 0x00000 }, + { 0x2f8d6, 0x080ad, 0x00000 }, + { 0x2f8d7, 0x043d9, 0x00000 }, + { 0x2f8d8, 0x06717, 0x00000 }, + { 0x2f8d9, 0x0671b, 0x00000 }, + { 0x2f8da, 0x06721, 0x00000 }, + { 0x2f8db, 0x0675e, 0x00000 }, + { 0x2f8dc, 0x06753, 0x00000 }, + { 0x2f8dd, 0x233c3, 0x00000 }, + { 0x2f8de, 0x03b49, 0x00000 }, + { 0x2f8df, 0x067fa, 0x00000 }, + { 0x2f8e0, 0x06785, 0x00000 }, + { 0x2f8e1, 0x06852, 0x00000 }, + { 0x2f8e2, 0x06885, 0x00000 }, + { 0x2f8e3, 0x2346d, 0x00000 }, + { 0x2f8e4, 0x0688e, 0x00000 }, + { 0x2f8e5, 0x0681f, 0x00000 }, + { 0x2f8e6, 0x06914, 0x00000 }, + { 0x2f8e7, 0x03b9d, 0x00000 }, + { 0x2f8e8, 0x06942, 0x00000 }, + { 0x2f8e9, 0x069a3, 0x00000 }, + { 0x2f8ea, 0x069ea, 0x00000 }, + { 0x2f8eb, 0x06aa8, 0x00000 }, + { 0x2f8ec, 0x236a3, 0x00000 }, + { 0x2f8ed, 0x06adb, 0x00000 }, + { 0x2f8ee, 0x03c18, 0x00000 }, + { 0x2f8ef, 0x06b21, 0x00000 }, + { 0x2f8f0, 0x238a7, 0x00000 }, + { 0x2f8f1, 0x06b54, 0x00000 }, + { 0x2f8f2, 0x03c4e, 0x00000 }, + { 0x2f8f3, 0x06b72, 0x00000 }, + { 0x2f8f4, 0x06b9f, 0x00000 }, + { 0x2f8f5, 0x06bba, 0x00000 }, + { 0x2f8f6, 0x06bbb, 0x00000 }, + { 0x2f8f7, 0x23a8d, 0x00000 }, + { 0x2f8f8, 0x21d0b, 0x00000 }, + { 0x2f8f9, 0x23afa, 0x00000 }, + { 0x2f8fa, 0x06c4e, 0x00000 }, + { 0x2f8fb, 0x23cbc, 0x00000 }, + { 0x2f8fc, 0x06cbf, 0x00000 }, + { 0x2f8fd, 0x06ccd, 0x00000 }, + { 0x2f8fe, 0x06c67, 0x00000 }, + { 0x2f8ff, 0x06d16, 0x00000 }, + { 0x2f900, 0x06d3e, 0x00000 }, + { 0x2f901, 0x06d77, 0x00000 }, + { 0x2f902, 0x06d41, 0x00000 }, + { 0x2f903, 0x06d69, 0x00000 }, + { 0x2f904, 0x06d78, 0x00000 }, + { 0x2f905, 0x06d85, 0x00000 }, + { 0x2f906, 0x23d1e, 0x00000 }, + { 0x2f907, 0x06d34, 0x00000 }, + { 0x2f908, 0x06e2f, 0x00000 }, + { 0x2f909, 0x06e6e, 0x00000 }, + { 0x2f90a, 0x03d33, 0x00000 }, + { 0x2f90b, 0x06ecb, 0x00000 }, + { 0x2f90c, 0x06ec7, 0x00000 }, + { 0x2f90d, 0x23ed1, 0x00000 }, + { 0x2f90e, 0x06df9, 0x00000 }, + { 0x2f90f, 0x06f6e, 0x00000 }, + { 0x2f910, 0x23f5e, 0x00000 }, + { 0x2f911, 0x23f8e, 0x00000 }, + { 0x2f912, 0x06fc6, 0x00000 }, + { 0x2f913, 0x07039, 0x00000 }, + { 0x2f914, 0x0701e, 0x00000 }, + { 0x2f915, 0x0701b, 0x00000 }, + { 0x2f916, 0x03d96, 0x00000 }, + { 0x2f917, 0x0704a, 0x00000 }, + { 0x2f918, 0x0707d, 0x00000 }, + { 0x2f919, 0x07077, 0x00000 }, + { 0x2f91a, 0x070ad, 0x00000 }, + { 0x2f91b, 0x20525, 0x00000 }, + { 0x2f91c, 0x07145, 0x00000 }, + { 0x2f91d, 0x24263, 0x00000 }, + { 0x2f91e, 0x0719c, 0x00000 }, + { 0x2f91f, 0x243ab, 0x00000 }, + { 0x2f920, 0x07228, 0x00000 }, + { 0x2f921, 0x07235, 0x00000 }, + { 0x2f922, 0x07250, 0x00000 }, + { 0x2f923, 0x24608, 0x00000 }, + { 0x2f924, 0x07280, 0x00000 }, + { 0x2f925, 0x07295, 0x00000 }, + { 0x2f926, 0x24735, 0x00000 }, + { 0x2f927, 0x24814, 0x00000 }, + { 0x2f928, 0x0737a, 0x00000 }, + { 0x2f929, 0x0738b, 0x00000 }, + { 0x2f92a, 0x03eac, 0x00000 }, + { 0x2f92b, 0x073a5, 0x00000 }, + { 0x2f92c, 0x03eb8, 0x00000 }, + { 0x2f92d, 0x03eb8, 0x00000 }, + { 0x2f92e, 0x07447, 0x00000 }, + { 0x2f92f, 0x0745c, 0x00000 }, + { 0x2f930, 0x07471, 0x00000 }, + { 0x2f931, 0x07485, 0x00000 }, + { 0x2f932, 0x074ca, 0x00000 }, + { 0x2f933, 0x03f1b, 0x00000 }, + { 0x2f934, 0x07524, 0x00000 }, + { 0x2f935, 0x24c36, 0x00000 }, + { 0x2f936, 0x0753e, 0x00000 }, + { 0x2f937, 0x24c92, 0x00000 }, + { 0x2f938, 0x07570, 0x00000 }, + { 0x2f939, 0x2219f, 0x00000 }, + { 0x2f93a, 0x07610, 0x00000 }, + { 0x2f93b, 0x24fa1, 0x00000 }, + { 0x2f93c, 0x24fb8, 0x00000 }, + { 0x2f93d, 0x25044, 0x00000 }, + { 0x2f93e, 0x03ffc, 0x00000 }, + { 0x2f93f, 0x04008, 0x00000 }, + { 0x2f940, 0x076f4, 0x00000 }, + { 0x2f941, 0x250f3, 0x00000 }, + { 0x2f942, 0x250f2, 0x00000 }, + { 0x2f943, 0x25119, 0x00000 }, + { 0x2f944, 0x25133, 0x00000 }, + { 0x2f945, 0x0771e, 0x00000 }, + { 0x2f946, 0x0771f, 0x00000 }, + { 0x2f947, 0x0771f, 0x00000 }, + { 0x2f948, 0x0774a, 0x00000 }, + { 0x2f949, 0x04039, 0x00000 }, + { 0x2f94a, 0x0778b, 0x00000 }, + { 0x2f94b, 0x04046, 0x00000 }, + { 0x2f94c, 0x04096, 0x00000 }, + { 0x2f94d, 0x2541d, 0x00000 }, + { 0x2f94e, 0x0784e, 0x00000 }, + { 0x2f94f, 0x0788c, 0x00000 }, + { 0x2f950, 0x078cc, 0x00000 }, + { 0x2f951, 0x040e3, 0x00000 }, + { 0x2f952, 0x25626, 0x00000 }, + { 0x2f953, 0x07956, 0x00000 }, + { 0x2f954, 0x2569a, 0x00000 }, + { 0x2f955, 0x256c5, 0x00000 }, + { 0x2f956, 0x0798f, 0x00000 }, + { 0x2f957, 0x079eb, 0x00000 }, + { 0x2f958, 0x0412f, 0x00000 }, + { 0x2f959, 0x07a40, 0x00000 }, + { 0x2f95a, 0x07a4a, 0x00000 }, + { 0x2f95b, 0x07a4f, 0x00000 }, + { 0x2f95c, 0x2597c, 0x00000 }, + { 0x2f95d, 0x25aa7, 0x00000 }, + { 0x2f95e, 0x25aa7, 0x00000 }, + { 0x2f95f, 0x07aee, 0x00000 }, + { 0x2f960, 0x04202, 0x00000 }, + { 0x2f961, 0x25bab, 0x00000 }, + { 0x2f962, 0x07bc6, 0x00000 }, + { 0x2f963, 0x07bc9, 0x00000 }, + { 0x2f964, 0x04227, 0x00000 }, + { 0x2f965, 0x25c80, 0x00000 }, + { 0x2f966, 0x07cd2, 0x00000 }, + { 0x2f967, 0x042a0, 0x00000 }, + { 0x2f968, 0x07ce8, 0x00000 }, + { 0x2f969, 0x07ce3, 0x00000 }, + { 0x2f96a, 0x07d00, 0x00000 }, + { 0x2f96b, 0x25f86, 0x00000 }, + { 0x2f96c, 0x07d63, 0x00000 }, + { 0x2f96d, 0x04301, 0x00000 }, + { 0x2f96e, 0x07dc7, 0x00000 }, + { 0x2f96f, 0x07e02, 0x00000 }, + { 0x2f970, 0x07e45, 0x00000 }, + { 0x2f971, 0x04334, 0x00000 }, + { 0x2f972, 0x26228, 0x00000 }, + { 0x2f973, 0x26247, 0x00000 }, + { 0x2f974, 0x04359, 0x00000 }, + { 0x2f975, 0x262d9, 0x00000 }, + { 0x2f976, 0x07f7a, 0x00000 }, + { 0x2f977, 0x2633e, 0x00000 }, + { 0x2f978, 0x07f95, 0x00000 }, + { 0x2f979, 0x07ffa, 0x00000 }, + { 0x2f97a, 0x08005, 0x00000 }, + { 0x2f97b, 0x264da, 0x00000 }, + { 0x2f97c, 0x26523, 0x00000 }, + { 0x2f97d, 0x08060, 0x00000 }, + { 0x2f97e, 0x265a8, 0x00000 }, + { 0x2f97f, 0x08070, 0x00000 }, + { 0x2f980, 0x2335f, 0x00000 }, + { 0x2f981, 0x043d5, 0x00000 }, + { 0x2f982, 0x080b2, 0x00000 }, + { 0x2f983, 0x08103, 0x00000 }, + { 0x2f984, 0x0440b, 0x00000 }, + { 0x2f985, 0x0813e, 0x00000 }, + { 0x2f986, 0x05ab5, 0x00000 }, + { 0x2f987, 0x267a7, 0x00000 }, + { 0x2f988, 0x267b5, 0x00000 }, + { 0x2f989, 0x23393, 0x00000 }, + { 0x2f98a, 0x2339c, 0x00000 }, + { 0x2f98b, 0x08201, 0x00000 }, + { 0x2f98c, 0x08204, 0x00000 }, + { 0x2f98d, 0x08f9e, 0x00000 }, + { 0x2f98e, 0x0446b, 0x00000 }, + { 0x2f98f, 0x08291, 0x00000 }, + { 0x2f990, 0x0828b, 0x00000 }, + { 0x2f991, 0x0829d, 0x00000 }, + { 0x2f992, 0x052b3, 0x00000 }, + { 0x2f993, 0x082b1, 0x00000 }, + { 0x2f994, 0x082b3, 0x00000 }, + { 0x2f995, 0x082bd, 0x00000 }, + { 0x2f996, 0x082e6, 0x00000 }, + { 0x2f997, 0x26b3c, 0x00000 }, + { 0x2f998, 0x082e5, 0x00000 }, + { 0x2f999, 0x0831d, 0x00000 }, + { 0x2f99a, 0x08363, 0x00000 }, + { 0x2f99b, 0x083ad, 0x00000 }, + { 0x2f99c, 0x08323, 0x00000 }, + { 0x2f99d, 0x083bd, 0x00000 }, + { 0x2f99e, 0x083e7, 0x00000 }, + { 0x2f99f, 0x08457, 0x00000 }, + { 0x2f9a0, 0x08353, 0x00000 }, + { 0x2f9a1, 0x083ca, 0x00000 }, + { 0x2f9a2, 0x083cc, 0x00000 }, + { 0x2f9a3, 0x083dc, 0x00000 }, + { 0x2f9a4, 0x26c36, 0x00000 }, + { 0x2f9a5, 0x26d6b, 0x00000 }, + { 0x2f9a6, 0x26cd5, 0x00000 }, + { 0x2f9a7, 0x0452b, 0x00000 }, + { 0x2f9a8, 0x084f1, 0x00000 }, + { 0x2f9a9, 0x084f3, 0x00000 }, + { 0x2f9aa, 0x08516, 0x00000 }, + { 0x2f9ab, 0x273ca, 0x00000 }, + { 0x2f9ac, 0x08564, 0x00000 }, + { 0x2f9ad, 0x26f2c, 0x00000 }, + { 0x2f9ae, 0x0455d, 0x00000 }, + { 0x2f9af, 0x04561, 0x00000 }, + { 0x2f9b0, 0x26fb1, 0x00000 }, + { 0x2f9b1, 0x270d2, 0x00000 }, + { 0x2f9b2, 0x0456b, 0x00000 }, + { 0x2f9b3, 0x08650, 0x00000 }, + { 0x2f9b4, 0x0865c, 0x00000 }, + { 0x2f9b5, 0x08667, 0x00000 }, + { 0x2f9b6, 0x08669, 0x00000 }, + { 0x2f9b7, 0x086a9, 0x00000 }, + { 0x2f9b8, 0x08688, 0x00000 }, + { 0x2f9b9, 0x0870e, 0x00000 }, + { 0x2f9ba, 0x086e2, 0x00000 }, + { 0x2f9bb, 0x08779, 0x00000 }, + { 0x2f9bc, 0x08728, 0x00000 }, + { 0x2f9bd, 0x0876b, 0x00000 }, + { 0x2f9be, 0x08786, 0x00000 }, + { 0x2f9bf, 0x045d7, 0x00000 }, + { 0x2f9c0, 0x087e1, 0x00000 }, + { 0x2f9c1, 0x08801, 0x00000 }, + { 0x2f9c2, 0x045f9, 0x00000 }, + { 0x2f9c3, 0x08860, 0x00000 }, + { 0x2f9c4, 0x08863, 0x00000 }, + { 0x2f9c5, 0x27667, 0x00000 }, + { 0x2f9c6, 0x088d7, 0x00000 }, + { 0x2f9c7, 0x088de, 0x00000 }, + { 0x2f9c8, 0x04635, 0x00000 }, + { 0x2f9c9, 0x088fa, 0x00000 }, + { 0x2f9ca, 0x034bb, 0x00000 }, + { 0x2f9cb, 0x278ae, 0x00000 }, + { 0x2f9cc, 0x27966, 0x00000 }, + { 0x2f9cd, 0x046be, 0x00000 }, + { 0x2f9ce, 0x046c7, 0x00000 }, + { 0x2f9cf, 0x08aa0, 0x00000 }, + { 0x2f9d0, 0x08aed, 0x00000 }, + { 0x2f9d1, 0x08b8a, 0x00000 }, + { 0x2f9d2, 0x08c55, 0x00000 }, + { 0x2f9d3, 0x27ca8, 0x00000 }, + { 0x2f9d4, 0x08cab, 0x00000 }, + { 0x2f9d5, 0x08cc1, 0x00000 }, + { 0x2f9d6, 0x08d1b, 0x00000 }, + { 0x2f9d7, 0x08d77, 0x00000 }, + { 0x2f9d8, 0x27f2f, 0x00000 }, + { 0x2f9d9, 0x20804, 0x00000 }, + { 0x2f9da, 0x08dcb, 0x00000 }, + { 0x2f9db, 0x08dbc, 0x00000 }, + { 0x2f9dc, 0x08df0, 0x00000 }, + { 0x2f9dd, 0x208de, 0x00000 }, + { 0x2f9de, 0x08ed4, 0x00000 }, + { 0x2f9df, 0x08f38, 0x00000 }, + { 0x2f9e0, 0x285d2, 0x00000 }, + { 0x2f9e1, 0x285ed, 0x00000 }, + { 0x2f9e2, 0x09094, 0x00000 }, + { 0x2f9e3, 0x090f1, 0x00000 }, + { 0x2f9e4, 0x09111, 0x00000 }, + { 0x2f9e5, 0x2872e, 0x00000 }, + { 0x2f9e6, 0x0911b, 0x00000 }, + { 0x2f9e7, 0x09238, 0x00000 }, + { 0x2f9e8, 0x092d7, 0x00000 }, + { 0x2f9e9, 0x092d8, 0x00000 }, + { 0x2f9ea, 0x0927c, 0x00000 }, + { 0x2f9eb, 0x093f9, 0x00000 }, + { 0x2f9ec, 0x09415, 0x00000 }, + { 0x2f9ed, 0x28bfa, 0x00000 }, + { 0x2f9ee, 0x0958b, 0x00000 }, + { 0x2f9ef, 0x04995, 0x00000 }, + { 0x2f9f0, 0x095b7, 0x00000 }, + { 0x2f9f1, 0x28d77, 0x00000 }, + { 0x2f9f2, 0x049e6, 0x00000 }, + { 0x2f9f3, 0x096c3, 0x00000 }, + { 0x2f9f4, 0x05db2, 0x00000 }, + { 0x2f9f5, 0x09723, 0x00000 }, + { 0x2f9f6, 0x29145, 0x00000 }, + { 0x2f9f7, 0x2921a, 0x00000 }, + { 0x2f9f8, 0x04a6e, 0x00000 }, + { 0x2f9f9, 0x04a76, 0x00000 }, + { 0x2f9fa, 0x097e0, 0x00000 }, + { 0x2f9fb, 0x2940a, 0x00000 }, + { 0x2f9fc, 0x04ab2, 0x00000 }, + { 0x2f9fd, 0x29496, 0x00000 }, + { 0x2f9fe, 0x0980b, 0x00000 }, + { 0x2f9ff, 0x0980b, 0x00000 }, + { 0x2fa00, 0x09829, 0x00000 }, + { 0x2fa01, 0x295b6, 0x00000 }, + { 0x2fa02, 0x098e2, 0x00000 }, + { 0x2fa03, 0x04b33, 0x00000 }, + { 0x2fa04, 0x09929, 0x00000 }, + { 0x2fa05, 0x099a7, 0x00000 }, + { 0x2fa06, 0x099c2, 0x00000 }, + { 0x2fa07, 0x099fe, 0x00000 }, + { 0x2fa08, 0x04bce, 0x00000 }, + { 0x2fa09, 0x29b30, 0x00000 }, + { 0x2fa0a, 0x09b12, 0x00000 }, + { 0x2fa0b, 0x09c40, 0x00000 }, + { 0x2fa0c, 0x09cfd, 0x00000 }, + { 0x2fa0d, 0x04cce, 0x00000 }, + { 0x2fa0e, 0x04ced, 0x00000 }, + { 0x2fa0f, 0x09d67, 0x00000 }, + { 0x2fa10, 0x2a0ce, 0x00000 }, + { 0x2fa11, 0x04cf8, 0x00000 }, + { 0x2fa12, 0x2a105, 0x00000 }, + { 0x2fa13, 0x2a20e, 0x00000 }, + { 0x2fa14, 0x2a291, 0x00000 }, + { 0x2fa15, 0x09ebb, 0x00000 }, + { 0x2fa16, 0x04d56, 0x00000 }, + { 0x2fa17, 0x09ef9, 0x00000 }, + { 0x2fa18, 0x09efe, 0x00000 }, + { 0x2fa19, 0x09f05, 0x00000 }, + { 0x2fa1a, 0x09f0f, 0x00000 }, + { 0x2fa1b, 0x09f16, 0x00000 }, + { 0x2fa1c, 0x09f3b, 0x00000 }, + { 0x2fa1d, 0x2a600, 0x00000 } +}; + +#endif /* DECOMP_H */ diff --git a/glib/guniprop.c b/glib/guniprop.c new file mode 100644 index 0000000..2211818 --- /dev/null +++ b/glib/guniprop.c @@ -0,0 +1,1512 @@ +/* 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 "gmem.h" +#include "gstring.h" +#include "gtestutils.h" +#include "gtypes.h" +#include "gunicode.h" +#include "gunichartables.h" +#include "gmirroringtable.h" +#include "gscripttable.h" +#include "gunicodeprivate.h" +#ifdef G_OS_WIN32 +#include "gwin32.h" +#endif + +#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_SPACING_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; +} + + +/* + * NOTE: + * + * The tables for g_unichar_iswide() and g_unichar_iswide_cjk() are + * generated from the Unicode Character Database's file + * extracted/DerivedEastAsianWidth.txt using the gen-iswide-table.py + * in this way: + * + * ./gen-iswide-table.py < path/to/ucd/extracted/DerivedEastAsianWidth.txt | fmt + * + * Last update for Unicode 6.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) +{ + /* See NOTE earlier for how to update this table. */ + static const struct Interval wide[] = { + {0x1100, 0x115F}, {0x2329, 0x232A}, {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, + {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, {0x3000, 0x303E}, {0x3041, 0x3096}, + {0x3099, 0x30FF}, {0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA}, + {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x32FE}, + {0x3300, 0x4DBF}, {0x4E00, 0xA48C}, {0xA490, 0xA4C6}, {0xA960, 0xA97C}, + {0xAC00, 0xD7A3}, {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, + {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, {0xFFE0, 0xFFE6}, + {0x1B000, 0x1B001}, {0x1F200, 0x1F202}, {0x1F210, 0x1F23A}, {0x1F240, + 0x1F248}, {0x1F250, 0x1F251}, {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) +{ + /* See NOTE earlier for how to update this table. */ + 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}, + {0x2189, 0x2189}, {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}, + {0x269E, 0x269F}, {0x26BE, 0x26BF}, {0x26C4, 0x26CD}, {0x26CF, 0x26E1}, + {0x26E3, 0x26E3}, {0x26E8, 0x26FF}, {0x273D, 0x273D}, {0x2757, 0x2757}, + {0x2776, 0x277F}, {0x2B55, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, + {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, {0x1F110, + 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F19A}, {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] ? title_table[i][1] : c; + } + } + 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); + + if (locale == NULL) + return LOCALE_NORMAL; +#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[G_UNICHAR_MAX_DECOMPOSITION_LENGTH]; + + decomp_len = g_unichar_fully_decompose (c, FALSE, decomp, G_N_ELEMENTS (decomp)); + 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); + } + + 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); +} + + +/* http://unicode.org/iso15924/ */ +static const guint32 iso15924_tags[] = +{ +#define PACK(a,b,c,d) ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d)))) + + PACK ('Z','y','y','y'), /* G_UNICODE_SCRIPT_COMMON */ + PACK ('Z','i','n','h'), /* G_UNICODE_SCRIPT_INHERITED */ + PACK ('A','r','a','b'), /* G_UNICODE_SCRIPT_ARABIC */ + PACK ('A','r','m','n'), /* G_UNICODE_SCRIPT_ARMENIAN */ + PACK ('B','e','n','g'), /* G_UNICODE_SCRIPT_BENGALI */ + PACK ('B','o','p','o'), /* G_UNICODE_SCRIPT_BOPOMOFO */ + PACK ('C','h','e','r'), /* G_UNICODE_SCRIPT_CHEROKEE */ + PACK ('C','o','p','t'), /* G_UNICODE_SCRIPT_COPTIC */ + PACK ('C','y','r','l'), /* G_UNICODE_SCRIPT_CYRILLIC */ + PACK ('D','s','r','t'), /* G_UNICODE_SCRIPT_DESERET */ + PACK ('D','e','v','a'), /* G_UNICODE_SCRIPT_DEVANAGARI */ + PACK ('E','t','h','i'), /* G_UNICODE_SCRIPT_ETHIOPIC */ + PACK ('G','e','o','r'), /* G_UNICODE_SCRIPT_GEORGIAN */ + PACK ('G','o','t','h'), /* G_UNICODE_SCRIPT_GOTHIC */ + PACK ('G','r','e','k'), /* G_UNICODE_SCRIPT_GREEK */ + PACK ('G','u','j','r'), /* G_UNICODE_SCRIPT_GUJARATI */ + PACK ('G','u','r','u'), /* G_UNICODE_SCRIPT_GURMUKHI */ + PACK ('H','a','n','i'), /* G_UNICODE_SCRIPT_HAN */ + PACK ('H','a','n','g'), /* G_UNICODE_SCRIPT_HANGUL */ + PACK ('H','e','b','r'), /* G_UNICODE_SCRIPT_HEBREW */ + PACK ('H','i','r','a'), /* G_UNICODE_SCRIPT_HIRAGANA */ + PACK ('K','n','d','a'), /* G_UNICODE_SCRIPT_KANNADA */ + PACK ('K','a','n','a'), /* G_UNICODE_SCRIPT_KATAKANA */ + PACK ('K','h','m','r'), /* G_UNICODE_SCRIPT_KHMER */ + PACK ('L','a','o','o'), /* G_UNICODE_SCRIPT_LAO */ + PACK ('L','a','t','n'), /* G_UNICODE_SCRIPT_LATIN */ + PACK ('M','l','y','m'), /* G_UNICODE_SCRIPT_MALAYALAM */ + PACK ('M','o','n','g'), /* G_UNICODE_SCRIPT_MONGOLIAN */ + PACK ('M','y','m','r'), /* G_UNICODE_SCRIPT_MYANMAR */ + PACK ('O','g','a','m'), /* G_UNICODE_SCRIPT_OGHAM */ + PACK ('I','t','a','l'), /* G_UNICODE_SCRIPT_OLD_ITALIC */ + PACK ('O','r','y','a'), /* G_UNICODE_SCRIPT_ORIYA */ + PACK ('R','u','n','r'), /* G_UNICODE_SCRIPT_RUNIC */ + PACK ('S','i','n','h'), /* G_UNICODE_SCRIPT_SINHALA */ + PACK ('S','y','r','c'), /* G_UNICODE_SCRIPT_SYRIAC */ + PACK ('T','a','m','l'), /* G_UNICODE_SCRIPT_TAMIL */ + PACK ('T','e','l','u'), /* G_UNICODE_SCRIPT_TELUGU */ + PACK ('T','h','a','a'), /* G_UNICODE_SCRIPT_THAANA */ + PACK ('T','h','a','i'), /* G_UNICODE_SCRIPT_THAI */ + PACK ('T','i','b','t'), /* G_UNICODE_SCRIPT_TIBETAN */ + PACK ('C','a','n','s'), /* G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL */ + PACK ('Y','i','i','i'), /* G_UNICODE_SCRIPT_YI */ + PACK ('T','g','l','g'), /* G_UNICODE_SCRIPT_TAGALOG */ + PACK ('H','a','n','o'), /* G_UNICODE_SCRIPT_HANUNOO */ + PACK ('B','u','h','d'), /* G_UNICODE_SCRIPT_BUHID */ + PACK ('T','a','g','b'), /* G_UNICODE_SCRIPT_TAGBANWA */ + + /* Unicode-4.0 additions */ + PACK ('B','r','a','i'), /* G_UNICODE_SCRIPT_BRAILLE */ + PACK ('C','p','r','t'), /* G_UNICODE_SCRIPT_CYPRIOT */ + PACK ('L','i','m','b'), /* G_UNICODE_SCRIPT_LIMBU */ + PACK ('O','s','m','a'), /* G_UNICODE_SCRIPT_OSMANYA */ + PACK ('S','h','a','w'), /* G_UNICODE_SCRIPT_SHAVIAN */ + PACK ('L','i','n','b'), /* G_UNICODE_SCRIPT_LINEAR_B */ + PACK ('T','a','l','e'), /* G_UNICODE_SCRIPT_TAI_LE */ + PACK ('U','g','a','r'), /* G_UNICODE_SCRIPT_UGARITIC */ + + /* Unicode-4.1 additions */ + PACK ('T','a','l','u'), /* G_UNICODE_SCRIPT_NEW_TAI_LUE */ + PACK ('B','u','g','i'), /* G_UNICODE_SCRIPT_BUGINESE */ + PACK ('G','l','a','g'), /* G_UNICODE_SCRIPT_GLAGOLITIC */ + PACK ('T','f','n','g'), /* G_UNICODE_SCRIPT_TIFINAGH */ + PACK ('S','y','l','o'), /* G_UNICODE_SCRIPT_SYLOTI_NAGRI */ + PACK ('X','p','e','o'), /* G_UNICODE_SCRIPT_OLD_PERSIAN */ + PACK ('K','h','a','r'), /* G_UNICODE_SCRIPT_KHAROSHTHI */ + + /* Unicode-5.0 additions */ + PACK ('Z','z','z','z'), /* G_UNICODE_SCRIPT_UNKNOWN */ + PACK ('B','a','l','i'), /* G_UNICODE_SCRIPT_BALINESE */ + PACK ('X','s','u','x'), /* G_UNICODE_SCRIPT_CUNEIFORM */ + PACK ('P','h','n','x'), /* G_UNICODE_SCRIPT_PHOENICIAN */ + PACK ('P','h','a','g'), /* G_UNICODE_SCRIPT_PHAGS_PA */ + PACK ('N','k','o','o'), /* G_UNICODE_SCRIPT_NKO */ + + /* Unicode-5.1 additions */ + PACK ('K','a','l','i'), /* G_UNICODE_SCRIPT_KAYAH_LI */ + PACK ('L','e','p','c'), /* G_UNICODE_SCRIPT_LEPCHA */ + PACK ('R','j','n','g'), /* G_UNICODE_SCRIPT_REJANG */ + PACK ('S','u','n','d'), /* G_UNICODE_SCRIPT_SUNDANESE */ + PACK ('S','a','u','r'), /* G_UNICODE_SCRIPT_SAURASHTRA */ + PACK ('C','h','a','m'), /* G_UNICODE_SCRIPT_CHAM */ + PACK ('O','l','c','k'), /* G_UNICODE_SCRIPT_OL_CHIKI */ + PACK ('V','a','i','i'), /* G_UNICODE_SCRIPT_VAI */ + PACK ('C','a','r','i'), /* G_UNICODE_SCRIPT_CARIAN */ + PACK ('L','y','c','i'), /* G_UNICODE_SCRIPT_LYCIAN */ + PACK ('L','y','d','i'), /* G_UNICODE_SCRIPT_LYDIAN */ + + /* Unicode-5.2 additions */ + PACK ('A','v','s','t'), /* G_UNICODE_SCRIPT_AVESTAN */ + PACK ('B','a','m','u'), /* G_UNICODE_SCRIPT_BAMUM */ + PACK ('E','g','y','p'), /* G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS */ + PACK ('A','r','m','i'), /* G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC */ + PACK ('P','h','l','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI */ + PACK ('P','r','t','i'), /* G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN */ + PACK ('J','a','v','a'), /* G_UNICODE_SCRIPT_JAVANESE */ + PACK ('K','t','h','i'), /* G_UNICODE_SCRIPT_KAITHI */ + PACK ('L','i','s','u'), /* G_UNICODE_SCRIPT_LISU */ + PACK ('M','t','e','i'), /* G_UNICODE_SCRIPT_MEETEI_MAYEK */ + PACK ('S','a','r','b'), /* G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN */ + PACK ('O','r','k','h'), /* G_UNICODE_SCRIPT_OLD_TURKIC */ + PACK ('S','a','m','r'), /* G_UNICODE_SCRIPT_SAMARITAN */ + PACK ('L','a','n','a'), /* G_UNICODE_SCRIPT_TAI_THAM */ + PACK ('T','a','v','t'), /* G_UNICODE_SCRIPT_TAI_VIET */ + + /* Unicode-6.0 additions */ + PACK ('B','a','t','k'), /* G_UNICODE_SCRIPT_BATAK */ + PACK ('B','r','a','h'), /* G_UNICODE_SCRIPT_BRAHMI */ + PACK ('M','a','n','d'), /* G_UNICODE_SCRIPT_MANDAIC */ + + /* Unicode-6.1 additions */ + PACK ('C','a','k','m'), /* G_UNICODE_SCRIPT_CHAKMA */ + PACK ('M','e','r','c'), /* G_UNICODE_SCRIPT_MEROITIC_CURSIVE */ + PACK ('M','e','r','o'), /* G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS */ + PACK ('P','l','r','d'), /* G_UNICODE_SCRIPT_MIAO */ + PACK ('S','h','r','d'), /* G_UNICODE_SCRIPT_SHARADA */ + PACK ('S','o','r','a'), /* G_UNICODE_SCRIPT_SORA_SOMPENG */ + PACK ('T','a','k','r'), /* G_UNICODE_SCRIPT_TAKRI */ + +#undef PACK +}; + +/** + * g_unicode_script_to_iso15924: + * @script: a Unicode script + * + * Looks up the ISO 15924 code for @script. ISO 15924 assigns four-letter + * codes to scripts. For example, the code for Arabic is 'Arab'. The + * four letter codes are encoded as a @guint32 by this function in a + * big-endian fashion. That is, the code returned for Arabic is + * 0x41726162 (0x41 is ASCII code for 'A', 0x72 is ASCII code for 'r', etc). + * + * See Codes for the + * representation of names of scripts for details. + * + * Return value: the ISO 15924 code for @script, encoded as an integer, + * of zero if @script is %G_UNICODE_SCRIPT_INVALID_CODE or + * ISO 15924 code 'Zzzz' (script code for UNKNOWN) if @script is not understood. + * + * Since: 2.30 + */ +guint32 +g_unicode_script_to_iso15924 (GUnicodeScript script) +{ + if (G_UNLIKELY (script == G_UNICODE_SCRIPT_INVALID_CODE)) + return 0; + + if (G_UNLIKELY (script < 0 || script >= (int) G_N_ELEMENTS (iso15924_tags))) + return 0x5A7A7A7A; + + return iso15924_tags[script]; +} + +/** + * g_unicode_script_from_iso15924: + * @iso15924: a Unicode script + * + * Looks up the Unicode script for @iso15924. ISO 15924 assigns four-letter + * codes to scripts. For example, the code for Arabic is 'Arab'. + * This function accepts four letter codes encoded as a @guint32 in a + * big-endian fashion. That is, the code expected for Arabic is + * 0x41726162 (0x41 is ASCII code for 'A', 0x72 is ASCII code for 'r', etc). + * + * See Codes for the + * representation of names of scripts for details. + * + * Return value: the Unicode script for @iso15924, or + * of %G_UNICODE_SCRIPT_INVALID_CODE if @iso15924 is zero and + * %G_UNICODE_SCRIPT_UNKNOWN if @iso15924 is unknown. + * + * Since: 2.30 + */ +GUnicodeScript +g_unicode_script_from_iso15924 (guint32 iso15924) +{ + unsigned int i; + + if (!iso15924) + return G_UNICODE_SCRIPT_INVALID_CODE; + + for (i = 0; i < G_N_ELEMENTS (iso15924_tags); i++) + if (iso15924_tags[i] == iso15924) + return (GUnicodeScript) i; + + return G_UNICODE_SCRIPT_UNKNOWN; +} diff --git a/glib/gurifuncs.c b/glib/gurifuncs.c new file mode 100644 index 0000000..d438205 --- /dev/null +++ b/glib/gurifuncs.c @@ -0,0 +1,252 @@ +/* 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" + +/** + * SECTION:gurifuncs + * @title: URI Functions + * @short_description: manipulating URIs + * + * 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: (allow-none): A string, may be %NULL + * @escaped_string_end: (allow-none): Pointer to end of @escaped_string, may be %NULL + * @illegal_characters: (allow-none): An optional string of illegal characters not to be allowed, may be %NULL + * + * 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. As a + * special case if %NULL is given for @escaped_string, this function + * will return %NULL. + * + * 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, or %NULL. + * @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); +} diff --git a/glib/gurifuncs.h b/glib/gurifuncs.h new file mode 100644 index 0000000..9f89770 --- /dev/null +++ b/glib/gurifuncs.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_URI_FUNCS_H__ +#define __G_URI_FUNCS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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 ":" + +GLIB_AVAILABLE_IN_ALL +char * g_uri_unescape_string (const char *escaped_string, + const char *illegal_characters); +GLIB_AVAILABLE_IN_ALL +char * g_uri_unescape_segment (const char *escaped_string, + const char *escaped_string_end, + const char *illegal_characters); +GLIB_AVAILABLE_IN_ALL +char * g_uri_parse_scheme (const char *uri); +GLIB_AVAILABLE_IN_ALL +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..e61d33d --- /dev/null +++ b/glib/gutf8.c @@ -0,0 +1,1747 @@ +/* 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 + +#ifdef G_PLATFORM_WIN32 +#include +#define STRICT +#include +#undef STRICT +#endif + +#include "gconvert.h" +#include "ghash.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gtypes.h" +#include "gthread.h" +#include "glibintl.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. If @max is greater than 0, up to @max + * bytes are examined + * + * Computes the length of the string in characters, not including + * the terminating nul character. If the @max'th byte falls in the + * middle of a character, the last (partial) character is not counted. + * + * 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_substring: + * @str: a UTF-8 encoded string + * @start_pos: a character offset within @str + * @end_pos: another character offset within @str + * + * Copies a substring out of a UTF-8 encoded string. + * The substring will contain @end_pos - @start_pos + * characters. + * + * Returns: a newly allocated copy of the requested + * substring. Free with g_free() when no longer needed. + * + * Since: 2.30 + */ +gchar * +g_utf8_substring (const gchar *str, + glong start_pos, + glong end_pos) +{ + gchar *start, *end, *out; + + start = g_utf8_offset_to_pointer (str, start_pos); + end = g_utf8_offset_to_pointer (start, end_pos - start_pos); + + out = g_malloc (end - start + 1); + memcpy (out, start, end - start); + out[end - start] = 0; + + return out; +} + +/** + * 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; +} + +/* 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; + * also check for malformed or overlong sequences + * and return (gunichar)-1 in this case. + */ +static inline gunichar +g_utf8_get_char_extended (const gchar *p, + gssize max_len) +{ + guint i, len; + gunichar min_code; + gunichar wc = (guchar) *p; + + if (wc < 0x80) + { + return wc; + } + else if (G_UNLIKELY (wc < 0xc0)) + { + return (gunichar)-1; + } + else if (wc < 0xe0) + { + len = 2; + wc &= 0x1f; + min_code = 1 << 7; + } + else if (wc < 0xf0) + { + len = 3; + wc &= 0x0f; + min_code = 1 << 11; + } + else if (wc < 0xf8) + { + len = 4; + wc &= 0x07; + min_code = 1 << 16; + } + else if (wc < 0xfc) + { + len = 5; + wc &= 0x03; + min_code = 1 << 21; + } + else if (wc < 0xfe) + { + len = 6; + wc &= 0x01; + min_code = 1 << 26; + } + else + { + return (gunichar)-1; + } + + if (G_UNLIKELY (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 (G_UNLIKELY ((ch & 0xc0) != 0x80)) + { + if (ch) + return (gunichar)-1; + else + return (gunichar)-2; + } + + wc <<= 6; + wc |= (ch & 0x3f); + } + + if (G_UNLIKELY (wc < min_code)) + 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: (allow-none): 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. A trailing 0 character + * 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(). + **/ +gunichar * +g_utf8_to_ucs4_fast (const gchar *str, + glong len, + glong *items_written) +{ + 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 = (guchar)*p++; + + if (wc < 0x80) + { + result[i] = wc; + } + else + { + gunichar mask = 0x40; + + if (G_UNLIKELY ((wc & mask) == 0)) + { + /* It's an out-of-sequence 10xxxxxxx byte. + * Rather than making an ugly hash of this and the next byte + * and overrunning the buffer, it's more useful to treat it + * with a replacement character */ + result[i] = 0xfffd; + continue; + } + + do + { + wc <<= 6; + wc |= (guchar)(*p++) & 0x3f; + mask <<= 5; + } + while((wc & mask) != 0); + + wc &= mask - 1; + + result[i] = wc; + } + } + 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: (allow-none): 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: (allow-none): 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 occurring, 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 character 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: (allow-none): location to store number of characters read, or %NULL. + * @items_written: (allow-none): 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 occurring, 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: (allow-none): 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: (allow-none): 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 occurring, 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: (allow-none): 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: (allow-none): 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 occurring, 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; + + if (c >= 0xdc00 && c < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + 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; + } + } + + /********** 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: (allow-none): 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: (allow-none): 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 occurring, 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: (allow-none): 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: (allow-none): 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 occurring, 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: (array length=max_len) (element-type guint8): a pointer to character data + * @max_len: max bytes to validate, or -1 to go until NUL + * @end: (allow-none) (out) (transfer none): 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 any of the @max_len bytes are NUL. + * + * 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); +} diff --git a/glib/gutils.c b/glib/gutils.c new file mode 100644 index 0000000..2e9c95f --- /dev/null +++ b/glib/gutils.c @@ -0,0 +1,2474 @@ +/* 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 "gutils.h" + +#include "glib-init.h" +#include "glib-private.h" +#include "genviron.h" +#include "gfileutils.h" +#include "ggettext.h" +#include "ghash.h" +#include "gthread.h" +#include "gtestutils.h" +#include "gunicode.h" +#include "gstrfuncs.h" +#include "garray.h" +#include "glibintl.h" + +#ifdef G_PLATFORM_WIN32 +#include "gconvert.h" +#include "gwin32.h" +#endif + + +/** + * SECTION:misc_utils + * @title: Miscellaneous Utility Functions + * @short_description: a selection of portable utility functions + * + * These are portable utility functions. + */ + +#ifdef G_PLATFORM_WIN32 +# include +# 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 + +#ifdef G_PLATFORM_WIN32 + +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 + +#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: (scope async): 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. + * + * Deprecated:2.32: It is best to avoid g_atexit(). + */ +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: a newly-allocated string with the 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; +} + +/** + * g_bit_nth_lsf: + * @mask: a #gulong containing flags + * @nth_bit: the index of the bit to start the search from + * + * 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. + * + * Returns: the index of the first bit set which is higher than @nth_bit + */ + +/** + * g_bit_nth_msf: + * @mask: a #gulong containing flags + * @nth_bit: the index of the bit to start the search from + * + * 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. + * + * Returns: the index of the first bit set which is lower than @nth_bit + */ + +/** + * g_bit_storage: + * @number: a #guint + * + * Gets the number of bits used to hold @number, + * e.g. if @number is 4, 3 bits are needed. + * + * Returns: the number of bits used to hold @number + */ + +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 == NULL || *g_tmp_dir == '\0') + { + g_free (g_tmp_dir); + g_tmp_dir = g_strdup (g_getenv ("TMP")); + } + + if (g_tmp_dir == NULL || *g_tmp_dir == '\0') + { + g_free (g_tmp_dir); + g_tmp_dir = g_strdup (g_getenv ("TEMP")); + } + +#ifdef G_OS_WIN32 + if (g_tmp_dir == NULL || *g_tmp_dir == '\0') + { + g_free (g_tmp_dir); + g_tmp_dir = get_windows_directory_root (); + } +#else + +#ifdef P_tmpdir + if (g_tmp_dir == NULL || *g_tmp_dir == '\0') + { + gsize k; + g_free (g_tmp_dir); + 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 == NULL || *g_tmp_dir == '\0') + { + g_free (g_tmp_dir); + g_tmp_dir = g_strdup ("/tmp"); + } +#endif /* !G_OS_WIN32 */ + + /* We first check HOME and use it if it is set */ + g_home_dir = g_strdup (g_getenv ("HOME")); + +#ifdef G_OS_WIN32 + /* Only believe HOME if it is an absolute path and exists. + * + * We only do this check on Windows for a couple of reasons. + * Historically, we only did it there because we used to ignore $HOME + * on UNIX. There are concerns about enabling it now on UNIX because + * of things like autofs. In short, if the user has a bogus value in + * $HOME then they get what they pay for... + */ + 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 + * successful. + */ + 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 */ + +#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. + */ +const 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. + */ +const 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 with most UNIX tools, this function will return the value of the + * HOME environment variable if it is set to an existing + * absolute path name, falling back to the passwd + * file in the case that it is unset. + * + * If the path given in HOME is non-absolute, does not + * exist, or is not a directory, the result is undefined. + * + * + * Before version 2.36 this function would ignore the + * HOME environment variable, taking the value from the + * passwd database instead. This was changed to + * increase the compatibility of GLib with other programs (and the XDG + * basedir specification) and to increase testability of programs + * based on GLib (by making it easier to run them from test + * frameworks). + * + * If your program has a strong requirement for either the new or the + * old behaviour (and if you don't wish to increase your GLib + * dependency to ensure that the new behaviour is in effect) then you + * should either directly check the HOME environment + * variable yourself or unset it before calling any functions in GLib. + * + * + * Returns: the current user's home directory + */ +const 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 or the empty string. + * + * Returns: the directory to use for temporary files. + */ +const 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. + */ +const 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 + **/ +const 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. + * In this case the directory retrieved will be XDG_DATA_HOME. + * + * On Windows this is the folder to use for local (as opposed to + * roaming) application data. See documentation for + * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as + * what g_get_user_config_dir() returns. + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +const 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_LOCAL_APPDATA); +#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_LOCAL_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. + * In this case the directory retrieved will be XDG_CONFIG_HOME. + * + * On Windows this is the folder to use for local (as opposed to + * roaming) application data. See documentation for + * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as + * what g_get_user_data_dir() returns. + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +const 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. + * In this case the directory retrieved will be XDG_CACHE_HOME. + * + * On Windows is the directory that serves as a common repository for + * temporary Internet files. A typical path is + * C:\Documents and Settings\username\Local Settings\Temporary Internet Files. + * See documentation for CSIDL_INTERNET_CACHE. + * + * Return value: a string owned by GLib that must not be modified + * or freed. + * Since: 2.6 + **/ +const 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; +} + +/** + * g_get_user_runtime_dir: + * + * Returns a directory that is unique to the current user on the local + * system. + * + * On UNIX platforms this is determined using the mechanisms described in + * the + * XDG Base Directory Specification. This is the directory + * specified in the XDG_RUNTIME_DIR environment variable. + * In the case that this variable is not set, GLib will issue a warning + * message to stderr and return the value of g_get_user_cache_dir(). + * + * On Windows this is the folder to use for local (as opposed to + * roaming) application data. See documentation for + * CSIDL_LOCAL_APPDATA. Note that on Windows it thus is the same as + * what g_get_user_config_dir() returns. + * + * Returns: a string owned by GLib that must not be modified or freed. + * + * Since: 2.28 + **/ +const gchar * +g_get_user_runtime_dir (void) +{ +#ifndef G_OS_WIN32 + static const gchar *runtime_dir; + static gsize initialised; + + if (g_once_init_enter (&initialised)) + { + runtime_dir = g_strdup (getenv ("XDG_RUNTIME_DIR")); + + g_once_init_leave (&initialised, 1); + } + + if (runtime_dir) + return runtime_dir; + + /* Both fallback for UNIX and the default + * in Windows: use the user cache directory. + */ +#endif + + return g_get_user_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 (GetModuleHandle ("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); + if (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); + } + else + g_user_special_dirs[G_USER_DIRECTORY_DOWNLOAD] = get_special_folder (CSIDL_DESKTOPDIRECTORY); + } + + 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); + if (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); + } + else + g_user_special_dirs[G_USER_DIRECTORY_PUBLIC_SHARE] = get_special_folder (CSIDL_COMMON_DOCUMENTS); + } + + 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_user_special_dirs[i] == NULL) + { + g_user_special_dirs[i] = old_val; + } + else 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 + */ +const 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 (GetModuleHandle ("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; +} + +const gchar * const * +g_win32_get_system_data_dirs_for_module (void (*address_of_function)(void)) +{ + 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 (const gchar * const *) 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 (const gchar * const *) 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 + * In this case the list of directories retrieved will be XDG_DATA_DIRS. + * + * 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: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +const gchar * const * +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 (const gchar * const *) 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. + * In this case the list of directories retrieved will be XDG_CONFIG_DIRS. + * + * On Windows is the directory that contains application data for all users. + * A typical path is C:\Documents and Settings\All Users\Application Data. + * This folder is used for application data that is not user specific. + * For example, an application can store a spell-check dictionary, a database + * of clip art, or a log file in the CSIDL_COMMON_APPDATA folder. + * This information will not roam and is available to anyone using the computer. + * + * Return value: (array zero-terminated=1) (transfer none): a %NULL-terminated array of strings owned by GLib that must + * not be modified or freed. + * Since: 2.6 + **/ +const gchar * const * +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 (const gchar * const *) conf_dir_vector; +} + +/** + * 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; +} + +#define KILOBYTE_FACTOR (G_GOFFSET_CONSTANT (1000)) +#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) + +#define KIBIBYTE_FACTOR (G_GOFFSET_CONSTANT (1024)) +#define MEBIBYTE_FACTOR (KIBIBYTE_FACTOR * KIBIBYTE_FACTOR) +#define GIBIBYTE_FACTOR (MEBIBYTE_FACTOR * KIBIBYTE_FACTOR) +#define TEBIBYTE_FACTOR (GIBIBYTE_FACTOR * KIBIBYTE_FACTOR) +#define PEBIBYTE_FACTOR (TEBIBYTE_FACTOR * KIBIBYTE_FACTOR) +#define EXBIBYTE_FACTOR (PEBIBYTE_FACTOR * KIBIBYTE_FACTOR) + +/** + * g_format_size: + * @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.2 MB". + * + * The prefix units base is 1000 (i.e. 1 kB is 1000 bytes). + * + * This string should be freed with g_free() when not needed any longer. + * + * See g_format_size_full() for more options about how the size might be + * formatted. + * + * Returns: a newly-allocated formatted string containing a human readable + * file size + * + * Since: 2.30 + */ +gchar * +g_format_size (guint64 size) +{ + return g_format_size_full (size, G_FORMAT_SIZE_DEFAULT); +} + +/** + * GFormatSizeFlags: + * @G_FORMAT_SIZE_DEFAULT: behave the same as g_format_size() + * @G_FORMAT_SIZE_LONG_FORMAT: include the exact number of bytes as part + * of the returned string. For example, "45.6 kB (45,612 bytes)". + * @G_FORMAT_SIZE_IEC_UNITS: use IEC (base 1024) units with "KiB"-style + * suffixes. IEC units should only be used for reporting things with + * a strong "power of 2" basis, like RAM sizes or RAID stripe sizes. + * Network and storage sizes should be reported in the normal SI units. + * + * Flags to modify the format of the string returned by g_format_size_full(). + */ + +/** + * g_format_size_full: + * @size: a size in bytes + * @flags: #GFormatSizeFlags to modify the output + * + * Formats a size. + * + * This function is similar to g_format_size() but allows for flags + * that modify the output. See #GFormatSizeFlags. + * + * Returns: a newly-allocated formatted string containing a human + * readable file size + * + * Since: 2.30 + */ +gchar * +g_format_size_full (guint64 size, + GFormatSizeFlags flags) +{ + GString *string; + + string = g_string_new (NULL); + + if (flags & G_FORMAT_SIZE_IEC_UNITS) + { + if (size < KIBIBYTE_FACTOR) + { + g_string_printf (string, + g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes", (guint) size), + (guint) size); + flags &= ~G_FORMAT_SIZE_LONG_FORMAT; + } + + else if (size < MEBIBYTE_FACTOR) + g_string_printf (string, _("%.1f KiB"), (gdouble) size / (gdouble) KIBIBYTE_FACTOR); + else if (size < GIBIBYTE_FACTOR) + g_string_printf (string, _("%.1f MiB"), (gdouble) size / (gdouble) MEBIBYTE_FACTOR); + + else if (size < TEBIBYTE_FACTOR) + g_string_printf (string, _("%.1f GiB"), (gdouble) size / (gdouble) GIBIBYTE_FACTOR); + + else if (size < PEBIBYTE_FACTOR) + g_string_printf (string, _("%.1f TiB"), (gdouble) size / (gdouble) TEBIBYTE_FACTOR); + + else if (size < EXBIBYTE_FACTOR) + g_string_printf (string, _("%.1f PiB"), (gdouble) size / (gdouble) PEBIBYTE_FACTOR); + + else + g_string_printf (string, _("%.1f EiB"), (gdouble) size / (gdouble) EXBIBYTE_FACTOR); + } + else + { + if (size < KILOBYTE_FACTOR) + { + g_string_printf (string, + g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes", (guint) size), + (guint) size); + flags &= ~G_FORMAT_SIZE_LONG_FORMAT; + } + + else if (size < MEGABYTE_FACTOR) + g_string_printf (string, _("%.1f kB"), (gdouble) size / (gdouble) KILOBYTE_FACTOR); + + else if (size < GIGABYTE_FACTOR) + g_string_printf (string, _("%.1f MB"), (gdouble) size / (gdouble) MEGABYTE_FACTOR); + + else if (size < TERABYTE_FACTOR) + g_string_printf (string, _("%.1f GB"), (gdouble) size / (gdouble) GIGABYTE_FACTOR); + else if (size < PETABYTE_FACTOR) + g_string_printf (string, _("%.1f TB"), (gdouble) size / (gdouble) TERABYTE_FACTOR); + + else if (size < EXABYTE_FACTOR) + g_string_printf (string, _("%.1f PB"), (gdouble) size / (gdouble) PETABYTE_FACTOR); + + else + g_string_printf (string, _("%.1f EB"), (gdouble) size / (gdouble) EXABYTE_FACTOR); + } + + if (flags & G_FORMAT_SIZE_LONG_FORMAT) + { + /* First problem: we need to use the number of bytes to decide on + * the plural form that is used for display, but the number of + * bytes potentially exceeds the size of a guint (which is what + * ngettext() takes). + * + * From a pragmatic standpoint, it seems that all known languages + * base plural forms on one or both of the following: + * + * - the lowest digits of the number + * + * - if the number if greater than some small value + * + * Here's how we fake it: Draw an arbitrary line at one thousand. + * If the number is below that, then fine. If it is above it, + * then we take the modulus of the number by one thousand (in + * order to keep the lowest digits) and add one thousand to that + * (in order to ensure that 1001 is not treated the same as 1). + */ + guint plural_form = size < 1000 ? size : size % 1000 + 1000; + + /* Second problem: we need to translate the string "%u byte" and + * "%u bytes" for pluralisation, but the correct number format to + * use for a gsize is different depending on which architecture + * we're on. + * + * Solution: format the number separately and use "%s bytes" on + * all platforms. + */ + const gchar *translated_format; + gchar *formatted_number; + + /* Translators: the %s in "%s bytes" will always be replaced by a number. */ + translated_format = g_dngettext(GETTEXT_PACKAGE, "%s byte", "%s bytes", plural_form); + /* XXX: Windows doesn't support the "'" format modifier, so we + * must not use it there. Instead, just display the number + * without separation. Bug #655336 is open until a solution is + * found. + */ +#ifndef G_OS_WIN32 + formatted_number = g_strdup_printf ("%'"G_GUINT64_FORMAT, size); +#else + formatted_number = g_strdup_printf ("%"G_GUINT64_FORMAT, size); +#endif + + g_string_append (string, " ("); + g_string_append_printf (string, translated_format, formatted_number); + g_free (formatted_number); + g_string_append (string, ")"); + } + + return g_string_free (string, FALSE); +} + +/** + * 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 + * + * Deprecated:2.30: This function is broken due to its use of SI + * suffixes to denote IEC units. Use g_format_size() instead. + */ +gchar * +g_format_size_for_display (goffset size) +{ + if (size < (goffset) KIBIBYTE_FACTOR) + return g_strdup_printf (g_dngettext(GETTEXT_PACKAGE, "%u byte", "%u bytes",(guint) size), (guint) size); + else + { + gdouble displayed_size; + + if (size < (goffset) MEBIBYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) KIBIBYTE_FACTOR; + /* Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to + * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of + * compatibility. Users will not see this string unless a program is using this deprecated function. + * Please translate as literally as possible. + */ + return g_strdup_printf (_("%.1f KB"), displayed_size); + } + else if (size < (goffset) GIBIBYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) MEBIBYTE_FACTOR; + return g_strdup_printf (_("%.1f MB"), displayed_size); + } + else if (size < (goffset) TEBIBYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) GIBIBYTE_FACTOR; + return g_strdup_printf (_("%.1f GB"), displayed_size); + } + else if (size < (goffset) PEBIBYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) TEBIBYTE_FACTOR; + return g_strdup_printf (_("%.1f TB"), displayed_size); + } + else if (size < (goffset) EXBIBYTE_FACTOR) + { + displayed_size = (gdouble) size / (gdouble) PEBIBYTE_FACTOR; + return g_strdup_printf (_("%.1f PB"), displayed_size); + } + else + { + displayed_size = (gdouble) size / (gdouble) EXBIBYTE_FACTOR; + return g_strdup_printf (_("%.1f EB"), displayed_size); + } + } +} + +#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_user_name + +const gchar * +g_get_user_name (void) +{ + g_get_any_init_locked (); + return g_user_name_cp; +} + +#undef g_get_real_name + +const gchar * +g_get_real_name (void) +{ + g_get_any_init_locked (); + return g_real_name_cp; +} + +#undef g_get_home_dir + +const gchar * +g_get_home_dir (void) +{ + g_get_any_init_locked (); + return g_home_dir_cp; +} + +#undef g_get_tmp_dir + +const gchar * +g_get_tmp_dir (void) +{ + g_get_any_init_locked (); + return g_tmp_dir_cp; +} + +#endif + +/* Private API: + * + * Returns %TRUE if the current process was executed as setuid (or an + * equivalent __libc_enable_secure is available). See: + * http://osdir.com/ml/linux.lfs.hardened/2007-04/msg00032.html + */ +gboolean +g_check_setuid (void) +{ + /* TODO: get __libc_enable_secure exported from glibc. + * See http://www.openwall.com/lists/owl-dev/2012/08/14/1 + */ +#if 0 && defined(HAVE_LIBC_ENABLE_SECURE) + { + /* See glibc/include/unistd.h */ + extern int __libc_enable_secure; + return __libc_enable_secure; + } +#elif defined(HAVE_ISSETUGID) + /* BSD: http://www.freebsd.org/cgi/man.cgi?query=issetugid&sektion=2 */ + return issetugid (); +#elif defined(G_OS_UNIX) + uid_t ruid, euid, suid; /* Real, effective and saved user ID's */ + gid_t rgid, egid, sgid; /* Real, effective and saved group ID's */ + + static gsize check_setuid_initialised; + static gboolean is_setuid; + + if (g_once_init_enter (&check_setuid_initialised)) + { +#ifdef HAVE_GETRESUID + /* These aren't in the header files, so we prototype them here. + */ + int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); + int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); + + if (getresuid (&ruid, &euid, &suid) != 0 || + getresgid (&rgid, &egid, &sgid) != 0) +#endif /* HAVE_GETRESUID */ + { + suid = ruid = getuid (); + sgid = rgid = getgid (); + euid = geteuid (); + egid = getegid (); + } + + is_setuid = (ruid != euid || ruid != suid || + rgid != egid || rgid != sgid); + + g_once_init_leave (&check_setuid_initialised, 1); + } + return is_setuid; +#else + return FALSE; +#endif +} diff --git a/glib/gutils.h b/glib/gutils.h new file mode 100644 index 0000000..8c09b7d --- /dev/null +++ b/glib/gutils.h @@ -0,0 +1,404 @@ +/* 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_UTILS_H__ +#define __G_UTILS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +/* 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 _GLIB_EXTERN +# 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 _GLIB_EXTERN +#endif /* !G_INLINE_FUNC */ + +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_name (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_real_name (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_home_dir (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_tmp_dir (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_host_name (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_prgname (void); +GLIB_AVAILABLE_IN_ALL +void g_set_prgname (const gchar *prgname); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_application_name (void); +GLIB_AVAILABLE_IN_ALL +void g_set_application_name (const gchar *application_name); + +GLIB_AVAILABLE_IN_ALL +void g_reload_user_special_dirs_cache (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_data_dir (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_config_dir (void); +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_cache_dir (void); +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_get_system_data_dirs (void); + +#ifdef G_OS_WIN32 +/* This functions is not part of the public GLib API */ +GLIB_AVAILABLE_IN_ALL +const gchar * const * 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 const gchar * const * +_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 + +GLIB_AVAILABLE_IN_ALL +const gchar * const * g_get_system_config_dirs (void); + +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_runtime_dir (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; + +GLIB_AVAILABLE_IN_ALL +const gchar * g_get_user_special_dir (GUserDirectory directory); + +/** + * GDebugKey: + * @key: the string + * @value: the flag + * + * Associates a string with a bit flag. + * Used in g_parse_debug_string(). + */ +typedef struct _GDebugKey GDebugKey; +struct _GDebugKey +{ + const gchar *key; + guint value; +}; + +/* Miscellaneous utility functions + */ +GLIB_AVAILABLE_IN_ALL +guint g_parse_debug_string (const gchar *string, + const GDebugKey *keys, + guint nkeys); + +GLIB_AVAILABLE_IN_ALL +gint g_snprintf (gchar *string, + gulong n, + gchar const *format, + ...) G_GNUC_PRINTF (3, 4); +GLIB_AVAILABLE_IN_ALL +gint g_vsnprintf (gchar *string, + gulong n, + gchar const *format, + va_list args) + G_GNUC_PRINTF(3, 0); + +GLIB_AVAILABLE_IN_ALL +void g_nullify_pointer (gpointer *nullify_location); + +typedef enum +{ + G_FORMAT_SIZE_DEFAULT = 0, + G_FORMAT_SIZE_LONG_FORMAT = 1 << 0, + G_FORMAT_SIZE_IEC_UNITS = 1 << 1 +} GFormatSizeFlags; + +GLIB_AVAILABLE_IN_2_30 +gchar *g_format_size_full (guint64 size, + GFormatSizeFlags flags); +GLIB_AVAILABLE_IN_2_30 +gchar *g_format_size (guint64 size); + +GLIB_DEPRECATED_FOR(g_format_size) +gchar *g_format_size_for_display (goffset size); + +#ifndef G_DISABLE_DEPRECATED +/** + * GVoidFunc: + * + * 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(). + */ +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. + */ +GLIB_DEPRECATED +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 + +#endif /* G_DISABLE_DEPRECATED */ + + +/* Look for an executable in PATH, following execvp() rules */ +GLIB_AVAILABLE_IN_ALL +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; + +/* 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 * 8U - 1) ^ (guint) __builtin_clzl(number)) + 1 : 1; +#else + register guint n_bits = 0; + + do + { + n_bits++; + number >>= 1; + } + while (number); + return n_bits; +#endif +} +#endif /* G_CAN_INLINE || __G_UTILS_C__ */ + +#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 */ + +#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 +#define g_find_program_in_path g_find_program_in_path_utf8 + +GLIB_AVAILABLE_IN_ALL +const gchar *g_get_user_name_utf8 (void); +GLIB_AVAILABLE_IN_ALL +const gchar *g_get_real_name_utf8 (void); +GLIB_AVAILABLE_IN_ALL +const gchar *g_get_home_dir_utf8 (void); +GLIB_AVAILABLE_IN_ALL +const gchar *g_get_tmp_dir_utf8 (void); +GLIB_AVAILABLE_IN_ALL +gchar *g_find_program_in_path_utf8 (const gchar *program); +#endif + +G_END_DECLS + +#endif /* __G_UTILS_H__ */ diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c new file mode 100644 index 0000000..b96bc90 --- /dev/null +++ b/glib/gvariant-core.c @@ -0,0 +1,1104 @@ +/* + * 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 "config.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * 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 + { + GBytes *bytes; + 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. + * + * .bytes: the #GBytes 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 bytes will be shared by both of them. When + * the instance is freed, this reference must be released + * with g_bytes_unref(). + * + * .data: the serialised data (of size 'size') of the instance. + * This pointer should not be freed or modified in any way. + * #GBytes 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) + { + GBytes *bytes; + gpointer data; + + g_variant_ensure_size (value); + data = g_malloc (value->size); + g_variant_serialise (value, data); + + g_variant_release_children (value); + + bytes = g_bytes_new_take (data, value->size); + value->contents.serialised.data = g_bytes_get_data (bytes, NULL); + value->contents.serialised.bytes = bytes; + 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 + * + * 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. + * + * Returns: a new #GVariant with a floating reference + */ +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; +} + +/** + * g_variant_new_from_bytes: + * @type: a #GVariantType + * @bytes: a #GBytes + * @trusted: if the contents of @bytes are trusted + * + * 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 @bytes. + * + * Returns: a new #GVariant with a floating reference + * + * Since: 2.36 + */ +GVariant * +g_variant_new_from_bytes (const GVariantType *type, + GBytes *bytes, + gboolean trusted) +{ + GVariant *value; + guint alignment; + gsize size; + + value = g_variant_alloc (type, TRUE, trusted); + + value->contents.serialised.bytes = g_bytes_ref (bytes); + + g_variant_type_info_query (value->type_info, + &alignment, &size); + + if (size && g_bytes_get_size (bytes) != size) + { + /* Creating a fixed-sized GVariant with a bytes of the wrong + * size. + * + * We should do the equivalent of pulling a fixed-sized child out + * of a brozen container (ie: data is NULL size is equal to the correct + * fixed size). + */ + value->contents.serialised.data = NULL; + value->size = size; + } + else + { + value->contents.serialised.data = g_bytes_get_data (bytes, &value->size); + } + + return value; +} + +/* -- internal -- */ + +/* < 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 + * + * 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. + * + * Returns: a new #GVariant with a floating reference + */ +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 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. + * + * Returns: the #GVariantTypeInfo for @value + */ +GVariantTypeInfo * +g_variant_get_type_info (GVariant *value) +{ + return value->type_info; +} + +/* < internal > + * g_variant_is_trusted: + * @value: a #GVariant + * + * 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. + * + * Returns: if @value is trusted + */ +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) +{ + g_return_if_fail (value != NULL); + g_return_if_fail (value->ref_count > 0); + + 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_bytes_unref (value->contents.serialised.bytes); + else + g_variant_release_children (value); + + memset (value, 0, sizeof (GVariant)); + g_slice_free (GVariant, value); + } +} + +/** + * g_variant_ref: + * @value: a #GVariant + * + * Increases the reference count of @value. + * + * Returns: the same @value + * + * Since: 2.24 + **/ +GVariant * +g_variant_ref (GVariant *value) +{ + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail (value->ref_count > 0, NULL); + + g_atomic_int_inc (&value->ref_count); + + return value; +} + +/** + * g_variant_ref_sink: + * @value: a #GVariant + * + * #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. + * + * Returns: the same @value + * + * Since: 2.24 + **/ +GVariant * +g_variant_ref_sink (GVariant *value) +{ + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail (value->ref_count > 0, NULL); + + 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_take_ref: + * @value: a #GVariant + * + * If @value is floating, sink it. Otherwise, do nothing. + * + * Typically you want to use g_variant_ref_sink() in order to + * automatically do the correct thing with respect to floating or + * non-floating references, but there is one specific scenario where + * this function is helpful. + * + * The situation where this function is helpful is when creating an API + * that allows the user to provide a callback function that returns a + * #GVariant. We certainly want to allow the user the flexibility to + * return a non-floating reference from this callback (for the case + * where the value that is being returned already exists). + * + * At the same time, the style of the #GVariant API makes it likely that + * for newly-created #GVariant instances, the user can be saved some + * typing if they are allowed to return a #GVariant with a floating + * reference. + * + * Using this function on the return value of the user's callback allows + * the user to do whichever is more convenient for them. The caller + * will alway receives exactly one full reference to the value: either + * the one that was returned in the first place, or a floating reference + * that has been converted to a full reference. + * + * This function has an odd interaction when combined with + * g_variant_ref_sink() running at the same time in another thread on + * the same #GVariant instance. If g_variant_ref_sink() runs first then + * the result will be that the floating reference is converted to a hard + * reference. If g_variant_take_ref() runs first then the result will + * be that the floating reference is converted to a hard reference and + * an additional reference on top of that one is added. It is best to + * avoid this situation. + * + * Returns: the same @value + **/ +GVariant * +g_variant_take_ref (GVariant *value) +{ + g_return_val_if_fail (value != NULL, NULL); + g_return_val_if_fail (value->ref_count > 0, NULL); + + g_atomic_int_and (&value->state, ~STATE_FLOATING); + + return value; +} + +/** + * g_variant_is_floating: + * @value: a #GVariant + * + * Checks whether @value has a floating reference count. + * + * This function should only ever be used to assert that a given variant + * is or is not floating, or for debug purposes. To acquire a reference + * to a variant that might be floating, always use g_variant_ref_sink() + * or g_variant_take_ref(). + * + * See g_variant_ref_sink() for more information about floating reference + * counts. + * + * Returns: whether @value is floating + * + * Since: 2.26 + **/ +gboolean +g_variant_is_floating (GVariant *value) +{ + g_return_val_if_fail (value != NULL, FALSE); + + return (value->state & STATE_FLOATING) != 0; +} + +/** + * g_variant_get_size: + * @value: a #GVariant instance + * + * 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. + * + * Returns: the serialised size of @value + * + * 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 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. + * + * To deserialise the data returned by this function, in addition to the + * serialised data, you must know the type of the #GVariant, and (if the + * machine might be different) the endianness of the machine that stored + * it. As a result, file formats or network messages that incorporate + * serialised #GVariants must include this information either + * implicitly (for instance "the file always contains a + * %G_VARIANT_TYPE_VARIANT and it is always in little-endian order") or + * explicitly (by storing the type and/or endianness in addition to the + * serialised data). + * + * Returns: (transfer none): the serialised form of @value, or %NULL + * + * 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_get_data_as_bytes: + * @value: a #GVariant + * + * Returns a pointer to the serialised form of a #GVariant instance. + * The semantics of this function are exactly the same as + * g_variant_get_data(), except that the returned #GBytes holds + * a reference to the variant data. + * + * Returns: (transfer full): A new #GBytes representing the variant data + * + * Since: 2.36 + */ +GBytes * +g_variant_get_data_as_bytes (GVariant *value) +{ + g_variant_lock (value); + g_variant_ensure_serialised (value); + g_variant_unlock (value); + + return g_bytes_ref (value->contents.serialised.bytes); +} + + +/** + * g_variant_n_children: + * @value: a container #GVariant + * + * 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). + * + * Returns: the number of children in the container + * + * 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 + * + * 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(). + * + * The returned value is never floating. You should free it with + * g_variant_unref() when you're done with it. + * + * This function is O(1). + * + * Returns: (transfer full): the child at the specified index + * + * Since: 2.24 + **/ +GVariant * +g_variant_get_child_value (GVariant *value, + gsize index_) +{ + g_return_val_if_fail (index_ < g_variant_n_children (value), NULL); + + if (~g_atomic_int_get (&value->state) & STATE_SERIALISED) + { + g_variant_lock (value); + + if (~value->state & STATE_SERIALISED) + { + GVariant *child; + + child = g_variant_ref (value->contents.tree.children[index_]); + g_variant_unlock (value); + + return child; + } + + g_variant_unlock (value); + } + + { + GVariantSerialised serialised = { + value->type_info, + (gpointer) value->contents.serialised.data, + value->size + }; + GVariantSerialised s_child; + GVariant *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.bytes = + g_bytes_ref (value->contents.serialised.bytes); + child->contents.serialised.data = s_child.data; + + 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_get_normal_form() for a solution. + * + * As with g_variant_get_data(), to be able to deserialise the + * serialised variant successfully, its type and (if the destination + * machine might be different) its endianness must also be available. + * + * 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 + * + * 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_new_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. + * + * Returns: %TRUE if @value is in normal form + * + * 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; +} diff --git a/glib/gvariant-core.h b/glib/gvariant-core.h new file mode 100644 index 0000000..d5a653d --- /dev/null +++ b/glib/gvariant-core.h @@ -0,0 +1,39 @@ +/* + * 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 */ + +GVariant * g_variant_new_from_children (const GVariantType *type, + GVariant **children, + gsize n_children, + gboolean trusted); + +gboolean g_variant_is_trusted (GVariant *value); + +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..7d7eb99 --- /dev/null +++ b/glib/gvariant-internal.h @@ -0,0 +1,52 @@ +/* + * 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__ + +/* Hack */ +#define __GLIB_H_INSIDE__ + +#include +#include + +#include "gvariant-serialiser.h" +#include "gvarianttypeinfo.h" + +#undef __GLIB_H_INSIDE__ + +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_format_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr); + +GLIB_AVAILABLE_IN_ALL +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..d5c036a --- /dev/null +++ b/glib/gvariant-parser.c @@ -0,0 +1,2547 @@ +/* + * 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 +#include +#include + +#include "gerror.h" +#include "gquark.h" +#include "gstring.h" +#include "gstrfuncs.h" +#include "gtestutils.h" +#include "gvariant.h" +#include "gvarianttype.h" +#include "gslice.h" +#include "gthread.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. + **/ +/** + * GVariantParseError: + * @G_VARIANT_PARSE_ERROR_FAILED: generic error (unused) + * @G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED: a non-basic #GVariantType was given where a basic type was expected + * @G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE: cannot infer the #GVariantType + * @G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED: an indefinite #GVariantType was given where a definite type was expected + * @G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END: extra data after parsing finished + * @G_VARIANT_PARSE_ERROR_INVALID_CHARACTER: invalid character in number or unicode escape + * @G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING: not a valid #GVariant format string + * @G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH: not a valid object path + * @G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE: not a valid type signature + * @G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING: not a valid #GVariant type string + * @G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE: could not find a common type for array entries + * @G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE: the numerical value is out of range of the given type + * @G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG: the numerical value is out of range for any type + * @G_VARIANT_PARSE_ERROR_TYPE_ERROR: cannot parse as variant of the specified type + * @G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN: an unexpected token was encountered + * @G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD: an unknown keyword was encountered + * @G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT: unterminated string constant + * @G_VARIANT_PARSE_ERROR_VALUE_EXPECTED: no value given + * + * Error codes returned by parsing text-format GVariants. + **/ +G_DEFINE_QUARK (g-variant-parse-error-quark, g_variant_parser_get_error) + +typedef struct +{ + gint start, end; +} SourceRef; + +G_GNUC_PRINTF(5, 0) +static void +parser_set_error_va (GError **error, + SourceRef *location, + SourceRef *other, + gint code, + 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, code, msg->str); + g_string_free (msg, TRUE); +} + +G_GNUC_PRINTF(5, 6) +static void +parser_set_error (GError **error, + SourceRef *location, + SourceRef *other, + gint code, + const gchar *format, + ...) +{ + va_list ap; + + va_start (ap, format); + parser_set_error_va (error, location, other, code, format, ap); + va_end (ap); +} + +typedef struct +{ + const gchar *start; + const gchar *stream; + const gchar *end; + + const gchar *this; +} TokenStream; + + +G_GNUC_PRINTF(5, 6) +static void +token_stream_set_error (TokenStream *stream, + GError **error, + gboolean this_token, + gint code, + 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, code, format, ap); + va_end (ap); +} + +static gboolean +token_stream_prepare (TokenStream *stream) +{ + gint brackets = 0; + const gchar *end; + + if (stream->this != NULL) + return TRUE; + + 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 FALSE; + } + + 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 'b': + if (stream->stream[1] == '\'' || stream->stream[1] == '"') + { + for (end = stream->stream + 2; end != stream->end; end++) + if (*end == stream->stream[1] || *end == '\0' || + (*end == '\\' && (++end == stream->end || *end == '\0'))) + break; + + if (end != stream->end && *end) + end++; + break; + } + + else /* ↓↓↓ */; + + case 'a': /* '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 '"': + 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; + + 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 != ':' && *end != '>' && !g_ascii_isspace (*end); + end++) + + if (*end == '(' || *end == '{') + brackets++; + + else if ((*end == ')' || *end == '}') && !brackets--) + break; + + break; + + default: + end = stream->stream + 1; + break; + } + + stream->this = stream->stream; + stream->stream = end; + + return TRUE; +} + +static void +token_stream_next (TokenStream *stream) +{ + stream->this = NULL; +} + +static gboolean +token_stream_peek (TokenStream *stream, + gchar first_char) +{ + if (!token_stream_prepare (stream)) + return FALSE; + + return stream->this[0] == first_char; +} + +static gboolean +token_stream_peek2 (TokenStream *stream, + gchar first_char, + gchar second_char) +{ + if (!token_stream_prepare (stream)) + return FALSE; + + return stream->this[0] == first_char && + stream->this[1] == second_char; +} + +static gboolean +token_stream_is_keyword (TokenStream *stream) +{ + if (!token_stream_prepare (stream)) + return FALSE; + + return g_ascii_isalpha (stream->this[0]) && + g_ascii_isalpha (stream->this[1]); +} + +static gboolean +token_stream_is_numeric (TokenStream *stream) +{ + if (!token_stream_prepare (stream)) + return FALSE; + + return (g_ascii_isdigit (stream->this[0]) || + stream->this[0] == '-' || + stream->this[0] == '+' || + stream->this[0] == '.'); +} + +static gboolean +token_stream_peek_string (TokenStream *stream, + const gchar *token) +{ + gint length = strlen (token); + + return token_stream_prepare (stream) && + stream->stream - stream->this == length && + memcmp (stream->this, token, length) == 0; +} + +static gboolean +token_stream_consume (TokenStream *stream, + const gchar *token) +{ + if (!token_stream_peek_string (stream, token)) + return FALSE; + + token_stream_next (stream); + return TRUE; +} + +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, + G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN, + "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; + + if (!token_stream_prepare (stream)) + return NULL; + + 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; +} + +static 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); +} + +G_GNUC_PRINTF(5, 6) +static void +ast_set_error (AST *ast, + GError **error, + AST *other_ast, + gint code, + 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, + code, + 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, + G_VARIANT_PARSE_ERROR_TYPE_ERROR, + "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, + G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE, + "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], + G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE, + "unable to find a common type"); + g_free (tmp); + return NULL; + } + + j++; + } + + } + + g_free (tmp); + } + + 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, + G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, + "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 (childtype == NULL) + { + g_variant_builder_clear (&builder); + return ast_type_error (ast, type, error); + } + + 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); + } + + if (childtype != NULL) + { + g_variant_builder_clear (&builder); + return ast_type_error (ast, type, error); + } + + 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, + G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED, + "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 NULL; + } + 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 NULL; + } + 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 NULL; + } + g_variant_builder_add_value (&builder, subvalue); + + if (!(subvalue = ast_get_value (dict->values[i], val, error))) + { + g_variant_builder_clear (&builder); + return NULL; + } + 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, + G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH, + "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, + G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE, + "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 gboolean +unicode_unescape (const gchar *src, + gint *src_ofs, + gchar *dest, + gint *dest_ofs, + gint length, + SourceRef *ref, + GError **error) +{ + gchar buffer[9]; + guint64 value; + gchar *end; + + (*src_ofs)++; + + g_assert (length < sizeof (buffer)); + strncpy (buffer, src + *src_ofs, length); + buffer[length] = '\0'; + + value = g_ascii_strtoull (buffer, &end, 0x10); + + if (value == 0 || end != buffer + length) + { + parser_set_error (error, ref, NULL, + G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, + "invalid %d-character unicode escape", length); + return FALSE; + } + + g_assert (value <= G_MAXUINT32); + + *dest_ofs += g_unichar_to_utf8 (value, dest + *dest_ofs); + *src_ofs += length; + + return TRUE; +} + +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, + G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, + "unterminated string constant"); + g_free (token); + g_free (str); + return NULL; + + case '\\': + switch (token[++i]) + { + case '\0': + parser_set_error (error, &ref, NULL, + G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, + "unterminated string constant"); + g_free (token); + g_free (str); + return NULL; + + case 'u': + if (!unicode_unescape (token, &i, str, &j, 4, &ref, error)) + { + g_free (token); + g_free (str); + return NULL; + } + continue; + + case 'U': + if (!unicode_unescape (token, &i, str, &j, 8, &ref, error)) + { + g_free (token); + g_free (str); + return NULL; + } + continue; + + case 'a': str[j++] = '\a'; i++; 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 'v': str[j++] = '\v'; 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 *string; +} ByteString; + +static gchar * +bytestring_get_pattern (AST *ast, + GError **error) +{ + return g_strdup ("May"); +} + +static GVariant * +bytestring_get_value (AST *ast, + const GVariantType *type, + GError **error) +{ + ByteString *string = (ByteString *) ast; + + g_assert (g_variant_type_equal (type, G_VARIANT_TYPE_BYTESTRING)); + + return g_variant_new_bytestring (string->string); +} + +static void +bytestring_free (AST *ast) +{ + ByteString *string = (ByteString *) ast; + + g_free (string->string); + g_slice_free (ByteString, string); +} + +static AST * +bytestring_parse (TokenStream *stream, + va_list *app, + GError **error) +{ + static const ASTClass bytestring_class = { + bytestring_get_pattern, + maybe_wrapper, bytestring_get_value, + bytestring_free + }; + ByteString *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); + g_assert (token[0] == 'b'); + length = strlen (token); + quote = token[1]; + + str = g_malloc (length); + g_assert (quote == '"' || quote == '\''); + j = 0; + i = 2; + while (token[i] != quote) + switch (token[i]) + { + case '\0': + parser_set_error (error, &ref, NULL, + G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, + "unterminated string constant"); + g_free (token); + return NULL; + + case '\\': + switch (token[++i]) + { + case '\0': + parser_set_error (error, &ref, NULL, + G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, + "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 'a': str[j++] = '\a'; i++; 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 'v': str[j++] = '\v'; i++; continue; + case '\n': i++; continue; + } + + default: + str[j++] = token[i++]; + } + str[j++] = '\0'; + g_free (token); + + string = g_slice_new (ByteString); + string->ast.class = &bytestring_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')) || + strstr (number->token, "inf") || + strstr (number->token, "nan")) + 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, + G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE, + "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, + G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, + "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, + G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, + "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, + G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, + "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 (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 (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 (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, + G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING, + "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, + G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING, + "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, + G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED, + "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, + G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, + "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_is_numeric (stream) || + token_stream_peek_string (stream, "inf") || + token_stream_peek_string (stream, "nan")) + result = number_parse (stream, app, error); + + 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_peek (stream, '\'') || + token_stream_peek (stream, '"')) + result = string_parse (stream, app, error); + + else if (token_stream_peek2 (stream, 'b', '\'') || + token_stream_peek2 (stream, 'b', '"')) + result = bytestring_parse (stream, app, error); + + else + { + token_stream_set_error (stream, error, FALSE, + G_VARIANT_PARSE_ERROR_VALUE_EXPECTED, + "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: (allow-none): a #GVariantType, or %NULL + * @text: a string containing a GVariant in text form + * @limit: (allow-none): a pointer to the end of @text, or %NULL + * @endptr: (allow-none): a location to store the end pointer, or %NULL + * @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL + * + * Parses a #GVariant from a text representation. + * + * A single #GVariant is parsed from the content of @text. + * + * The format is described here. + * + * 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 occurred. + * + * Officially, the language understood by the parser is "any string + * produced by g_variant_print()". + * + * Returns: a reference to a #GVariant, or %NULL + **/ +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, + G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END, + "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 + * + * 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. + * + * Returns: a new, usually floating, #GVariant + **/ +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 + * + * Parses @format and returns the result. + * + * @format must be a text format #GVariant with one extension: 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 "%@". + * + * Returns: a new floating #GVariant instance + **/ +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; +} + +/** + * g_variant_builder_add_parsed: + * @builder: a #GVariantBuilder + * @format: a text format #GVariant + * @...: arguments as per @format + * + * Adds to a #GVariantBuilder. + * + * This call is a convenience wrapper that is exactly equivalent to + * calling g_variant_new_parsed() 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_ARRAY); + * g_variant_builder_add_parsed (builder, "{'width', <%i>}", 600); + * g_variant_builder_add_parsed (builder, "{'title', <%s>}", "foo"); + * g_variant_builder_add_parsed (builder, "{'transparency', <0.5>}"); + * return g_variant_builder_end (builder); + * } + * + * + * Since: 2.26 + **/ +void +g_variant_builder_add_parsed (GVariantBuilder *builder, + const gchar *format, + ...) +{ + va_list ap; + + va_start (ap, format); + g_variant_builder_add_value (builder, g_variant_new_parsed_va (format, &ap)); + va_end (ap); +} diff --git a/glib/gvariant-serialiser.c b/glib/gvariant-serialiser.c new file mode 100644 index 0000000..cc5cc7b --- /dev/null +++ b/glib/gvariant-serialiser.c @@ -0,0 +1,1702 @@ +/* + * 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 + + +/* 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 D-Bus specification requirements). + */ + +/* < private > + * GVariantSerialised: + * @type_info: the #GVariantTypeInfo of this value + * @data: (allow-none): 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); + + /* Depending on the native alignment requirements of the machine, the + * compiler will insert either 3 or 7 padding bytes after the char. + * This will result in the sizeof() the struct being 12 or 16. + * Subtract 9 to get 3 or 7 which is a nice bitmask to apply to get + * the alignment bits that we "care about" being zero: in the + * 4-aligned case, we care about 2 bits, and in the 8-aligned case, we + * care about 3 bits. + */ + alignment &= sizeof (struct { + char a; + union { + guint64 x; + void *y; + gdouble z; + } b; + } + ) - 9; + + /* Some OSes (FreeBSD is a known example) have a malloc() that returns + * unaligned memory if you request small sizes. 'malloc (1);', for + * example, has been seen to return pointers aligned to 6 mod 16. + * + * Check if this is a small allocation and return without enforcing + * the alignment assertion if this is the case. + */ + if (serialised.size <= alignment) + return; + + 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 necessarily 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 occurred 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; + + /* as per the comment in gvs_tuple_get_child() */ + if G_UNLIKELY (value.data == NULL && value.size != 0) + return FALSE; + + 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 + * + * For serialised data that represents a container value (maybes, + * tuples, arrays, variants), determine how many child items are inside + * that container. + * + * Returns: the number of children + */ +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 + * + * 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. + * + * Returns: a #GVariantSerialised for the child + */ +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); + + ) + + if (serialised.data == NULL) + return FALSE; + + /* 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 *expected_end; + const gchar *end; + + if (size == 0) + return FALSE; + + expected_end = ((gchar *) data) + size - 1; + + if (*expected_end != '\0') + return FALSE; + + g_utf8_validate (data, size, &end); + + return end == expected_end; +} + +/* < private > + * g_variant_serialiser_is_object_path: + * @data: a possible D-Bus 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 D-Bus + * 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 D-Bus signature + * @size: the size of @data + * + * Performs the checks for being a valid string. + * + * Also, ensures that @data is a valid D-Bus type signature, as per the + * D-Bus 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 */ +/* vim:set foldmethod=marker: */ diff --git a/glib/gvariant-serialiser.h b/glib/gvariant-serialiser.h new file mode 100644 index 0000000..b003aed --- /dev/null +++ b/glib/gvariant-serialiser.h @@ -0,0 +1,75 @@ +/* + * 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 */ +GLIB_AVAILABLE_IN_ALL +gsize g_variant_serialised_n_children (GVariantSerialised container); +GLIB_AVAILABLE_IN_ALL +GVariantSerialised g_variant_serialised_get_child (GVariantSerialised container, + gsize index); + +/* serialisation */ +typedef void (*GVariantSerialisedFiller) (GVariantSerialised *serialised, + gpointer data); + +GLIB_AVAILABLE_IN_ALL +gsize g_variant_serialiser_needed_size (GVariantTypeInfo *info, + GVariantSerialisedFiller gsv_filler, + const gpointer *children, + gsize n_children); + +GLIB_AVAILABLE_IN_ALL +void g_variant_serialiser_serialise (GVariantSerialised container, + GVariantSerialisedFiller gsv_filler, + const gpointer *children, + gsize n_children); + +/* misc */ +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_serialised_is_normal (GVariantSerialised value); +GLIB_AVAILABLE_IN_ALL +void g_variant_serialised_byteswap (GVariantSerialised value); + +/* validation of strings */ +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_serialiser_is_string (gconstpointer data, + gsize size); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_serialiser_is_object_path (gconstpointer data, + gsize size); +GLIB_AVAILABLE_IN_ALL +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..163782d --- /dev/null +++ b/glib/gvariant.c @@ -0,0 +1,5328 @@ +/* + * 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 + + +/** + * 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 cannot 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 D-Bus. Almost all types of + * #GVariant instances can be sent over D-Bus. See #GVariantType for + * exceptions. (However, #GVariant's serialisation format is not the same + * as the serialisation format of a D-Bus message body: use #GDBusMessage, + * in the gio library, for those.) + * + * For space-efficiency, the #GVariant serialisation format does not + * automatically include the variant's type or endianness, which must + * either be implied from context (such as knowledge that a particular + * file format always contains a little-endian %G_VARIANT_TYPE_VARIANT) + * or supplied out-of-band (for instance, a type and/or endianness + * indicator could be placed at the beginning of a file, network message + * or network stream). + * + * A #GVariant's size is limited mainly by any lower level operating + * system constraints, such as the number of bits in #gsize. For + * example, it is reasonable to have a 2GB file mapped into memory + * with #GMappedFile, and call g_variant_new_from_data() on it. + * + * 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 referring 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 + * + * Constructs a new trusted #GVariant instance from the provided data. + * This is used to implement g_variant_new_* for all the basic types. + * + * Returns: a new floating #GVariant + */ +static GVariant * +g_variant_new_from_trusted (const GVariantType *type, + gconstpointer data, + gsize size) +{ + GVariant *value; + GBytes *bytes; + + bytes = g_bytes_new (data, size); + value = g_variant_new_from_bytes (type, bytes, TRUE); + g_bytes_unref (bytes); + + return value; +} + +/** + * g_variant_new_boolean: + * @value: a #gboolean value + * + * Creates a new boolean #GVariant instance -- either %TRUE or %FALSE. + * + * Returns: (transfer none): a floating reference to a new boolean #GVariant instance + * + * 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 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. + * + * Returns: %TRUE or %FALSE + * + * 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: + * @value: a #guint8 value + * + * Creates a new byte #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new byte #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_byte: + * @value: a byte #GVariant instance + * + * 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. + * + * Returns: a #guchar + * + * Since: 2.24 + **/ +NUMERIC_TYPE (BYTE, byte, guchar) + +/** + * g_variant_new_int16: + * @value: a #gint16 value + * + * Creates a new int16 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new int16 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_int16: + * @value: a int16 #GVariant instance + * + * 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. + * + * Returns: a #gint16 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT16, int16, gint16) + +/** + * g_variant_new_uint16: + * @value: a #guint16 value + * + * Creates a new uint16 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new uint16 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint16: + * @value: a uint16 #GVariant instance + * + * 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. + * + * Returns: a #guint16 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT16, uint16, guint16) + +/** + * g_variant_new_int32: + * @value: a #gint32 value + * + * Creates a new int32 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new int32 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_int32: + * @value: a int32 #GVariant instance + * + * 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. + * + * Returns: a #gint32 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT32, int32, gint32) + +/** + * g_variant_new_uint32: + * @value: a #guint32 value + * + * Creates a new uint32 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new uint32 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint32: + * @value: a uint32 #GVariant instance + * + * 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. + * + * Returns: a #guint32 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT32, uint32, guint32) + +/** + * g_variant_new_int64: + * @value: a #gint64 value + * + * Creates a new int64 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new int64 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_int64: + * @value: a int64 #GVariant instance + * + * 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. + * + * Returns: a #gint64 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (INT64, int64, gint64) + +/** + * g_variant_new_uint64: + * @value: a #guint64 value + * + * Creates a new uint64 #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new uint64 #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_uint64: + * @value: a uint64 #GVariant instance + * + * 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. + * + * Returns: a #guint64 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (UINT64, uint64, guint64) + +/** + * g_variant_new_handle: + * @value: a #gint32 value + * + * Creates a new handle #GVariant instance. + * + * By convention, handles are indexes into an array of file descriptors + * that are sent alongside a D-Bus message. If you're not interacting + * with D-Bus, you probably don't need them. + * + * Returns: (transfer none): a floating reference to a new handle #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_handle: + * @value: a handle #GVariant instance + * + * 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 D-Bus message. If you're not interacting + * with D-Bus, you probably don't need them. + * + * Returns: a #gint32 + * + * Since: 2.24 + **/ +NUMERIC_TYPE (HANDLE, handle, gint32) + +/** + * g_variant_new_double: + * @value: a #gdouble floating point value + * + * Creates a new double #GVariant instance. + * + * Returns: (transfer none): a floating reference to a new double #GVariant instance + * + * Since: 2.24 + **/ +/** + * g_variant_get_double: + * @value: a double #GVariant instance + * + * 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. + * + * Returns: a #gdouble + * + * Since: 2.24 + **/ +NUMERIC_TYPE (DOUBLE, double, gdouble) + +/* Container type Constructor / Deconstructors {{{1 */ +/** + * g_variant_new_maybe: + * @child_type: (allow-none): the #GVariantType of the child, or %NULL + * @child: (allow-none): the child value, or %NULL + * + * Depending on if @child is %NULL, either wraps @child inside of a + * maybe container or creates a Nothing instance for the given @type. + * + * At least one of @child_type and @child must be non-%NULL. + * If @child_type is non-%NULL then it must be a definite type. + * If they are both non-%NULL then @child_type must be the type + * of @child. + * + * If @child is a floating reference (see g_variant_ref_sink()), the new + * instance takes ownership of @child. + * + * Returns: (transfer none): a floating reference to a new #GVariant maybe instance + * + * 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 + * + * Given a maybe-typed #GVariant instance, extract its value. If the + * value is Nothing, then this function returns %NULL. + * + * Returns: (allow-none) (transfer full): the contents of @value, or %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: (constructor) + * @value: a #GVariant instance + * + * Boxes @value. The result is a #GVariant instance representing a + * variant containing the original value. + * + * If @child is a floating reference (see g_variant_ref_sink()), the new + * instance takes ownership of @child. + * + * Returns: (transfer none): a floating reference to a new variant #GVariant instance + * + * 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 #GVariant instance + * + * Unboxes @value. The result is the #GVariant instance that was + * contained in @value. + * + * Returns: (transfer full): the item contained in the variant + * + * 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: (allow-none): the element type of the new array + * @children: (allow-none) (array length=n_children): an array of + * #GVariant pointers, the children + * @n_children: the length of @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. + * + * If the @children are floating references (see g_variant_ref_sink()), the + * new instance takes ownership of them as if via g_variant_ref_sink(). + * + * Returns: (transfer none): a floating reference to a new #GVariant array + * + * 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: (array length=n_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: (array length=n_children): the items to make the tuple out of + * @n_children: the length of @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. + * + * If the @children are floating references (see g_variant_ref_sink()), the + * new instance takes ownership of them as if via g_variant_ref_sink(). + * + * Returns: (transfer none): a floating reference to a new #GVariant tuple + * + * 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: (constructor) + * @key: a basic #GVariant, the key + * @value: a #GVariant, the 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). + * + * If the @key or @value are floating references (see g_variant_ref_sink()), + * the new instance takes ownership of them as if via g_variant_ref_sink(). + * + * Returns: (transfer none): a floating reference to a new dictionary entry #GVariant + * + * 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_lookup: (skip) + * @dictionary: a dictionary #GVariant + * @key: the key to lookup in the dictionary + * @format_string: a GVariant format string + * @...: the arguments to unpack the value into + * + * Looks up a value in a dictionary #GVariant. + * + * This function is a wrapper around g_variant_lookup_value() and + * g_variant_get(). In the case that %NULL would have been returned, + * this function returns %FALSE. Otherwise, it unpacks the returned + * value and returns %TRUE. + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * Returns: %TRUE if a value was unpacked + * + * Since: 2.28 + */ +gboolean +g_variant_lookup (GVariant *dictionary, + const gchar *key, + const gchar *format_string, + ...) +{ + GVariantType *type; + GVariant *value; + + /* flatten */ + g_variant_get_data (dictionary); + + type = g_variant_format_string_scan_type (format_string, NULL, NULL); + value = g_variant_lookup_value (dictionary, key, type); + g_variant_type_free (type); + + if (value) + { + va_list ap; + + va_start (ap, format_string); + g_variant_get_va (value, format_string, NULL, &ap); + g_variant_unref (value); + va_end (ap); + + return TRUE; + } + + else + return FALSE; +} + +/** + * g_variant_lookup_value: + * @dictionary: a dictionary #GVariant + * @key: the key to lookup in the dictionary + * @expected_type: (allow-none): a #GVariantType, or %NULL + * + * Looks up a value in a dictionary #GVariant. + * + * This function works with dictionaries of the type + * a{s*} (and equally well with type + * a{o*}, but we only further discuss the string case + * for sake of clarity). + * + * In the event that @dictionary has the type a{sv}, + * the @expected_type string specifies what type of value is expected to + * be inside of the variant. If the value inside the variant has a + * different type then %NULL is returned. In the event that @dictionary + * has a value type other than v then @expected_type + * must directly match the key type and it is used to unpack the value + * directly or an error occurs. + * + * In either case, if @key is not found in @dictionary, %NULL is + * returned. + * + * If the key is found and the value has the correct type, it is + * returned. If @expected_type was specified then any non-%NULL return + * value will have this type. + * + * Returns: (transfer full): the value of the dictionary key, or %NULL + * + * Since: 2.28 + */ +GVariant * +g_variant_lookup_value (GVariant *dictionary, + const gchar *key, + const GVariantType *expected_type) +{ + GVariantIter iter; + GVariant *entry; + GVariant *value; + + g_return_val_if_fail (g_variant_is_of_type (dictionary, + G_VARIANT_TYPE ("a{s*}")) || + g_variant_is_of_type (dictionary, + G_VARIANT_TYPE ("a{o*}")), + NULL); + + g_variant_iter_init (&iter, dictionary); + + while ((entry = g_variant_iter_next_value (&iter))) + { + GVariant *entry_key; + gboolean matches; + + entry_key = g_variant_get_child_value (entry, 0); + matches = strcmp (g_variant_get_string (entry_key, NULL), key) == 0; + g_variant_unref (entry_key); + + if (matches) + break; + + g_variant_unref (entry); + } + + if (entry == NULL) + return NULL; + + value = g_variant_get_child_value (entry, 1); + g_variant_unref (entry); + + if (g_variant_is_of_type (value, G_VARIANT_TYPE_VARIANT)) + { + GVariant *tmp; + + tmp = g_variant_get_variant (value); + g_variant_unref (value); + + if (expected_type && !g_variant_is_of_type (tmp, expected_type)) + { + g_variant_unref (tmp); + tmp = NULL; + } + + value = tmp; + } + + g_return_val_if_fail (expected_type == NULL || value == NULL || + g_variant_is_of_type (value, expected_type), NULL); + + return value; +} + +/** + * g_variant_get_fixed_array: + * @value: a #GVariant array with fixed-sized elements + * @n_elements: (out): a pointer to the location to store the number of items + * @element_size: the size of each element + * + * 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, + * as given by the section on + * Serialised Data + * Memory. + * + * In particular, arrays of these fixed-sized types can be interpreted + * as an array of the given C type, with @element_size set to + * sizeof the appropriate type: + * + * + * + * element type C type + * + * %G_VARIANT_TYPE_INT16 (etc.) + * #gint16 (etc.) + * %G_VARIANT_TYPE_BOOLEAN + * #guchar (not #gboolean!) + * %G_VARIANT_TYPE_BYTE #guchar + * %G_VARIANT_TYPE_HANDLE #guint32 + * %G_VARIANT_TYPE_DOUBLE #gdouble + * + * + * + * + * 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 + * serialised data matches the caller's expectation. + * + * @n_elements, which must be non-%NULL is set equal to the number of + * items in the array. + * + * Returns: (array length=n_elements) (transfer none): a pointer to + * the fixed 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; +} + +/** + * g_variant_new_fixed_array: + * @element_type: the #GVariantType of each element + * @elements: a pointer to the fixed array of contiguous elements + * @n_elements: the number of elements + * @element_size: the size of each element + * + * 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 + * serialised data matches the caller's expectation. + * + * @n_elements, which must be non-%NULL is set equal to the number of + * items in the array. + * + * Returns: (transfer none): a floating reference to a new array #GVariant instance + * + * Since: 2.32 + **/ +GVariant * +g_variant_new_fixed_array (const GVariantType *element_type, + gconstpointer elements, + gsize n_elements, + gsize element_size) +{ + GVariantType *array_type; + gsize array_element_size; + GVariantTypeInfo *array_info; + GVariant *value; + gpointer data; + + g_return_val_if_fail (g_variant_type_is_definite (element_type), NULL); + g_return_val_if_fail (element_size > 0, NULL); + + array_type = g_variant_type_new_array (element_type); + array_info = g_variant_type_info_get (array_type); + g_variant_type_info_query_element (array_info, NULL, &array_element_size); + if G_UNLIKELY (array_element_size != element_size) + { + if (array_element_size) + g_critical ("g_variant_new_fixed_array: 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: array does not have fixed size."); + return NULL; + } + + data = g_memdup (elements, n_elements * element_size); + value = g_variant_new_from_data (array_type, data, + n_elements * element_size, + FALSE, g_free, data); + + g_variant_type_free (array_type); + g_variant_type_info_unref (array_info); + + return value; +} + +/* String type constructor/getters/validation {{{1 */ +/** + * g_variant_new_string: + * @string: a normal utf8 nul-terminated string + * + * Creates a string #GVariant with the contents of @string. + * + * @string must be valid utf8. + * + * Returns: (transfer none): a floating reference to a new string #GVariant instance + * + * Since: 2.24 + **/ +GVariant * +g_variant_new_string (const gchar *string) +{ + g_return_val_if_fail (string != NULL, NULL); + g_return_val_if_fail (g_utf8_validate (string, -1, 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 + * + * Creates a D-Bus object path #GVariant with the contents of @string. + * @string must be a valid D-Bus object path. Use + * g_variant_is_object_path() if you're not sure. + * + * Returns: (transfer none): a floating reference to a new object path #GVariant instance + * + * 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 + * + * Determines if a given string is a valid D-Bus object path. You + * should ensure that a string is a valid D-Bus 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. + * + * Returns: %TRUE if @string is a D-Bus object path + * + * 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 + * + * Creates a D-Bus type signature #GVariant with the contents of + * @string. @string must be a valid D-Bus type signature. Use + * g_variant_is_signature() if you're not sure. + * + * Returns: (transfer none): a floating reference to a new signature #GVariant instance + * + * 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 + * + * Determines if a given string is a valid D-Bus type signature. You + * should ensure that a string is a valid D-Bus type signature before + * passing it to g_variant_new_signature(). + * + * D-Bus type signatures consist of zero or more definite #GVariantType + * strings in sequence. + * + * Returns: %TRUE if @string is a D-Bus type signature + * + * 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: (allow-none) (default 0) (out): a pointer to a #gsize, + * to store the 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. + * + * The string will always be utf8 encoded. + * + * 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. + * + * Returns: (transfer none): the constant string, utf8 encoded + * + * 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: (out): a pointer to a #gsize, to store the length + * + * Similar to g_variant_get_string() except that instead of returning + * a constant string, the string is duplicated. + * + * The string will always be utf8 encoded. + * + * The return value must be freed using g_free(). + * + * Returns: (transfer full): a newly allocated string, utf8 encoded + * + * 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: (array length=length) (element-type utf8): an array of strings + * @length: the length of @strv, or -1 + * + * Constructs an array of strings #GVariant from the given array of + * strings. + * + * If @length is -1 then @strv is %NULL-terminated. + * + * Returns: (transfer none): a new floating #GVariant instance + * + * 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_STRING_ARRAY, + strings, length, TRUE); +} + +/** + * g_variant_get_strv: + * @value: an array of strings #GVariant + * @length: (out) (allow-none): the length of the result, or %NULL + * + * 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. + * + * Returns: (array length=length zero-terminated=1) (transfer container): an array of constant strings + * + * Since: 2.24 + **/ +const gchar ** +g_variant_get_strv (GVariant *value, + gsize *length) +{ + const gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_STRING_ARRAY, 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: (out) (allow-none): the length of the result, or %NULL + * + * 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. + * + * Returns: (array length=length zero-terminated=1) (transfer full): an array of strings + * + * Since: 2.24 + **/ +gchar ** +g_variant_dup_strv (GVariant *value, + gsize *length) +{ + gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_STRING_ARRAY, 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; +} + +/** + * g_variant_new_objv: + * @strv: (array length=length) (element-type utf8): an array of strings + * @length: the length of @strv, or -1 + * + * Constructs an array of object paths #GVariant from the given array of + * strings. + * + * Each string must be a valid #GVariant object path; see + * g_variant_is_object_path(). + * + * If @length is -1 then @strv is %NULL-terminated. + * + * Returns: (transfer none): a new floating #GVariant instance + * + * Since: 2.30 + **/ +GVariant * +g_variant_new_objv (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_object_path (strv[i])); + + return g_variant_new_from_children (G_VARIANT_TYPE_OBJECT_PATH_ARRAY, + strings, length, TRUE); +} + +/** + * g_variant_get_objv: + * @value: an array of object paths #GVariant + * @length: (out) (allow-none): the length of the result, or %NULL + * + * Gets the contents of an array of object paths #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. + * + * Returns: (array length=length zero-terminated=1) (transfer container): an array of constant strings + * + * Since: 2.30 + **/ +const gchar ** +g_variant_get_objv (GVariant *value, + gsize *length) +{ + const gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_OBJECT_PATH_ARRAY, 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_objv: + * @value: an array of object paths #GVariant + * @length: (out) (allow-none): the length of the result, or %NULL + * + * Gets the contents of an array of object paths #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. + * + * Returns: (array length=length zero-terminated=1) (transfer full): an array of strings + * + * Since: 2.30 + **/ +gchar ** +g_variant_dup_objv (GVariant *value, + gsize *length) +{ + gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_OBJECT_PATH_ARRAY, 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; +} + + +/** + * g_variant_new_bytestring: + * @string: (array zero-terminated=1) (element-type guint8): a normal + * nul-terminated string in no particular encoding + * + * Creates an array-of-bytes #GVariant with the contents of @string. + * This function is just like g_variant_new_string() except that the + * string need not be valid utf8. + * + * The nul terminator character at the end of the string is stored in + * the array. + * + * Returns: (transfer none): a floating reference to a new bytestring #GVariant instance + * + * Since: 2.26 + **/ +GVariant * +g_variant_new_bytestring (const gchar *string) +{ + g_return_val_if_fail (string != NULL, NULL); + + return g_variant_new_from_trusted (G_VARIANT_TYPE_BYTESTRING, + string, strlen (string) + 1); +} + +/** + * g_variant_get_bytestring: + * @value: an array-of-bytes #GVariant instance + * + * Returns the string value of a #GVariant instance with an + * array-of-bytes type. The string has no particular encoding. + * + * If the array does not end with a nul terminator character, the empty + * string is returned. For this reason, you can always trust that a + * non-%NULL nul-terminated string will be returned by this function. + * + * If the array contains a nul terminator character somewhere other than + * the last byte then the returned string is the string, up to the first + * such nul character. + * + * It is an error to call this function with a @value that is not an + * array of bytes. + * + * The return value remains valid as long as @value exists. + * + * Returns: (transfer none) (array zero-terminated=1) (element-type guint8): + * the constant string + * + * Since: 2.26 + **/ +const gchar * +g_variant_get_bytestring (GVariant *value) +{ + const gchar *string; + gsize size; + + TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING, NULL); + + /* Won't be NULL since this is an array type */ + string = g_variant_get_data (value); + size = g_variant_get_size (value); + + if (size && string[size - 1] == '\0') + return string; + else + return ""; +} + +/** + * g_variant_dup_bytestring: + * @value: an array-of-bytes #GVariant instance + * @length: (out) (allow-none) (default NULL): a pointer to a #gsize, to store + * the length (not including the nul terminator) + * + * Similar to g_variant_get_bytestring() except that instead of + * returning a constant string, the string is duplicated. + * + * The return value must be freed using g_free(). + * + * Returns: (transfer full) (array zero-terminated=1 length=length) (element-type guint8): + * a newly allocated string + * + * Since: 2.26 + **/ +gchar * +g_variant_dup_bytestring (GVariant *value, + gsize *length) +{ + const gchar *original = g_variant_get_bytestring (value); + gsize size; + + /* don't crash in case get_bytestring() had an assert failure */ + if (original == NULL) + return NULL; + + size = strlen (original); + + if (length) + *length = size; + + return g_memdup (original, size + 1); +} + +/** + * g_variant_new_bytestring_array: + * @strv: (array length=length): an array of strings + * @length: the length of @strv, or -1 + * + * Constructs an array of bytestring #GVariant from the given array of + * strings. + * + * If @length is -1 then @strv is %NULL-terminated. + * + * Returns: (transfer none): a new floating #GVariant instance + * + * Since: 2.26 + **/ +GVariant * +g_variant_new_bytestring_array (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_bytestring (strv[i])); + + return g_variant_new_from_children (G_VARIANT_TYPE_BYTESTRING_ARRAY, + strings, length, TRUE); +} + +/** + * g_variant_get_bytestring_array: + * @value: an array of array of bytes #GVariant ('aay') + * @length: (out) (allow-none): the length of the result, or %NULL + * + * Gets the contents of an array of array of bytes #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. + * + * Returns: (array length=length) (transfer container): an array of constant strings + * + * Since: 2.26 + **/ +const gchar ** +g_variant_get_bytestring_array (GVariant *value, + gsize *length) +{ + const gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING_ARRAY, 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_bytestring (string); + g_variant_unref (string); + } + strv[i] = NULL; + + if (length) + *length = n; + + return strv; +} + +/** + * g_variant_dup_bytestring_array: + * @value: an array of array of bytes #GVariant ('aay') + * @length: (out) (allow-none): the length of the result, or %NULL + * + * Gets the contents of an array of array of bytes #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. + * + * Returns: (array length=length) (transfer full): an array of strings + * + * Since: 2.26 + **/ +gchar ** +g_variant_dup_bytestring_array (GVariant *value, + gsize *length) +{ + gchar **strv; + gsize n; + gsize i; + + TYPE_CHECK (value, G_VARIANT_TYPE_BYTESTRING_ARRAY, NULL); + + g_variant_get_data (value); + 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_bytestring (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 + * + * Determines the type of @value. + * + * The return value is valid for the lifetime of @value and must not + * be freed. + * + * Returns: a #GVariantType + * + * 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 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. + * + * Returns: the type string for the type of @value + * + * 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 + * + * Checks if a value has a type matching the provided type. + * + * Returns: %TRUE if the type of @value matches @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 + * + * Checks if @value is a container. + * + * Returns: %TRUE if @value is a container + * + * Since: 2.24 + */ +gboolean +g_variant_is_container (GVariant *value) +{ + return g_variant_type_is_container (g_variant_get_type (value)); +} + + +/** + * g_variant_classify: + * @value: a #GVariant + * + * Classifies @value according to its top-level type. + * + * Returns: the #GVariantClass of @value + * + * 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 D-Bus object path + * string. + * @G_VARIANT_CLASS_SIGNATURE: The #GVariant is a D-Bus 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 */ +/* This function is not introspectable because if @string is NULL, + @returns is (transfer full), otherwise it is (transfer none), which + is not supported by GObjectIntrospection */ +/** + * g_variant_print_string: (skip) + * @value: a #GVariant + * @string: (allow-none) (default NULL): a #GString, or %NULL + * @type_annotate: %TRUE if type information should be included in + * the output + * + * 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. + * + * Returns: a #GString containing the string + * + * 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 'ay' then it's a bytestring. + * under certain conditions we print those as strings. + */ + if (g_variant_get_type_string (value)[1] == 'y') + { + const gchar *str; + gsize size; + gsize i; + + /* first determine if it is a byte string. + * that's when there's a single nul character: at the end. + */ + str = g_variant_get_data (value); + size = g_variant_get_size (value); + + for (i = 0; i < size; i++) + if (str[i] == '\0') + break; + + /* first nul byte is the last byte -> it's a byte string. */ + if (i == size - 1) + { + gchar *escaped = g_strescape (str, NULL); + + /* use double quotes only if a ' is in the string */ + if (strchr (str, '\'')) + g_string_append_printf (string, "b\"%s\"", escaped); + else + g_string_append_printf (string, "b'%s'", escaped); + + g_free (escaped); + break; + } + + else + /* fall through and handle normally... */; + } + + /* + * 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); + gunichar quote = strchr (str, '\'') ? '"' : '\''; + + g_string_append_c (string, quote); + + while (*str) + { + gunichar c = g_utf8_get_char (str); + + if (c == quote || c == '\\') + g_string_append_c (string, '\\'); + + if (g_unichar_isprint (c)) + g_string_append_unichar (string, c); + + else + { + g_string_append_c (string, '\\'); + if (c < 0x10000) + switch (c) + { + case '\a': + g_string_append_c (string, 'a'); + break; + + case '\b': + g_string_append_c (string, 'b'); + break; + + case '\f': + g_string_append_c (string, 'f'); + break; + + case '\n': + g_string_append_c (string, 'n'); + break; + + case '\r': + g_string_append_c (string, 'r'); + break; + + case '\t': + g_string_append_c (string, 't'); + break; + + case '\v': + g_string_append_c (string, 'v'); + break; + + default: + g_string_append_printf (string, "u%04x", c); + break; + } + else + g_string_append_printf (string, "U%08x", c); + } + + str = g_utf8_next_char (str); + } + + g_string_append_c (string, quote); + } + 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 + * + * Pretty-prints @value in the format understood by g_variant_parse(). + * + * The format is described here. + * + * If @type_annotate is %TRUE, then type information is included in + * the output. + * + * Returns: (transfer full): a newly-allocated string holding the result. + * + * Since: 2.24 + */ +gchar * +g_variant_print (GVariant *value, + gboolean type_annotate) +{ + return g_string_free (g_variant_print_string (value, NULL, type_annotate), + FALSE); +}; + +/* Hash, Equal, Compare {{{1 */ +/** + * g_variant_hash: + * @value: (type GVariant): a basic #GVariant value as a #gconstpointer + * + * 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. + * + * Returns: a hash value corresponding to @value + * + * 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: (type GVariant): a #GVariant instance + * @two: (type GVariant): a #GVariant instance + * + * 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. + * + * Returns: %TRUE if @one and @two are equal + * + * 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; +} + +/** + * g_variant_compare: + * @one: (type GVariant): a basic-typed #GVariant instance + * @two: (type GVariant): a #GVariant instance of the same type + * + * Compares @one and @two. + * + * The types of @one and @two are #gconstpointer only to allow use of + * this function with #GTree, #GPtrArray, etc. They must each be a + * #GVariant. + * + * Comparison is only defined for basic types (ie: booleans, numbers, + * strings). For booleans, %FALSE is less than %TRUE. Numbers are + * ordered in the usual way. Strings are in ASCII lexographical order. + * + * It is a programmer error to attempt to compare container values or + * two values that have types that are not exactly equal. For example, + * you cannot compare a 32-bit signed integer with a 32-bit unsigned + * integer. Also note that this function is not particularly + * well-behaved when it comes to comparison of doubles; in particular, + * the handling of incomparable values (ie: NaN) is undefined. + * + * If you only require an equality comparison, g_variant_equal() is more + * general. + * + * Returns: negative value if a < b; + * zero if a = b; + * positive value if a > b. + * + * Since: 2.26 + **/ +gint +g_variant_compare (gconstpointer one, + gconstpointer two) +{ + GVariant *a = (GVariant *) one; + GVariant *b = (GVariant *) two; + + g_return_val_if_fail (g_variant_classify (a) == g_variant_classify (b), 0); + + switch (g_variant_classify (a)) + { + case G_VARIANT_CLASS_BOOLEAN: + return g_variant_get_boolean (a) - + g_variant_get_boolean (b); + + case G_VARIANT_CLASS_BYTE: + return ((gint) g_variant_get_byte (a)) - + ((gint) g_variant_get_byte (b)); + + case G_VARIANT_CLASS_INT16: + return ((gint) g_variant_get_int16 (a)) - + ((gint) g_variant_get_int16 (b)); + + case G_VARIANT_CLASS_UINT16: + return ((gint) g_variant_get_uint16 (a)) - + ((gint) g_variant_get_uint16 (b)); + + case G_VARIANT_CLASS_INT32: + { + gint32 a_val = g_variant_get_int32 (a); + gint32 b_val = g_variant_get_int32 (b); + + return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; + } + + case G_VARIANT_CLASS_UINT32: + { + guint32 a_val = g_variant_get_uint32 (a); + guint32 b_val = g_variant_get_uint32 (b); + + return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; + } + + case G_VARIANT_CLASS_INT64: + { + gint64 a_val = g_variant_get_int64 (a); + gint64 b_val = g_variant_get_int64 (b); + + return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; + } + + case G_VARIANT_CLASS_UINT64: + { + guint64 a_val = g_variant_get_uint64 (a); + guint64 b_val = g_variant_get_uint64 (b); + + return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; + } + + case G_VARIANT_CLASS_DOUBLE: + { + gdouble a_val = g_variant_get_double (a); + gdouble b_val = g_variant_get_double (b); + + return (a_val == b_val) ? 0 : (a_val > b_val) ? 1 : -1; + } + + case G_VARIANT_CLASS_STRING: + case G_VARIANT_CLASS_OBJECT_PATH: + case G_VARIANT_CLASS_SIGNATURE: + return strcmp (g_variant_get_string (a, NULL), + g_variant_get_string (b, NULL)); + + default: + g_return_val_if_fail (!g_variant_is_container (a), 0); + g_assert_not_reached (); + } +} + +/* GVariantIter {{{1 */ +/** + * GVariantIter: (skip) + * + * #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 + * + * 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. + * + * Returns: (transfer full): a new heap-allocated #GVariantIter + * + * 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: (skip) + * @iter: a pointer to a #GVariantIter + * @value: a container #GVariant + * + * 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. + * + * Returns: the number of items in @value + * + * 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 + * + * 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. + * + * Returns: (transfer full): a new heap-allocated #GVariantIter + * + * 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 + * + * 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. + * + * Returns: the number of children in the container + * + * 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: (transfer full): 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 + * + * 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, container); + * 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); + * } + * } + * + * + * + * Returns: (allow-none) (transfer full): a #GVariant, or %NULL + * + * 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 + * + * 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(). + * + * Returns: (transfer full): a #GVariantBuilder + * + * 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: (transfer full): 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() + * + * Increases the reference count on @builder. + * + * Don't call this on stack-allocated #GVariantBuilder instances or bad + * things will happen. + * + * Returns: (transfer full): a new reference to @builder + * + * 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: (skip) + * @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_unref() 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: (skip) + * @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. + * + * If @value is a floating reference (see g_variant_ref_sink()), + * the @builder instance takes ownership of @value. + * + * 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 + * + * Ends the builder process and returns the constructed value. + * + * It is not permissible to use @builder in any way after this call + * except for reference counting operations (in the case of a + * heap-allocated #GVariantBuilder) or by reinitialising it with + * g_variant_builder_init() (in the case of stack-allocated). + * + * 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. + * + * Returns: (transfer none): a new, floating, #GVariant + * + * 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: (allow-none) (default NULL): a pointer to the end of @string, + * or %NULL + * @endptr: (allow-none) (default NULL): location to store the end pointer, + * or %NULL + * + * 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. + * + * Returns: %TRUE if there was a valid format string + * + * 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 '^': + if ((c = next_char()) == 'a') + { + if ((c = next_char()) == '&') + { + if ((c = next_char()) == 'a') + { + if ((c = next_char()) == 'y') + break; /* '^a&ay' */ + } + + else if (c == 's' || c == 'o') + break; /* '^a&s', '^a&o' */ + } + + else if (c == 'a') + { + if ((c = next_char()) == 'y') + break; /* '^aay' */ + } + + else if (c == 's' || c == 'o') + break; /* '^as', '^ao' */ + + else if (c == 'y') + break; /* '^ay' */ + } + else if (c == '&') + { + if ((c = next_char()) == 'a') + { + if ((c = next_char()) == 'y') + break; /* '^&ay' */ + } + } + + return FALSE; + + 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; +} + +/** + * g_variant_check_format_string: + * @value: a #GVariant + * @format_string: a valid #GVariant format string + * @copy_only: %TRUE to ensure the format string makes deep copies + * + * Checks if calling g_variant_get() with @format_string on @value would + * be valid from a type-compatibility standpoint. @format_string is + * assumed to be a valid format string (from a syntactic standpoint). + * + * If @copy_only is %TRUE then this function additionally checks that it + * would be safe to call g_variant_unref() on @value immediately after + * the call to g_variant_get() without invalidating the result. This is + * only possible if deep copies are made (ie: there are no pointers to + * the data inside of the soon-to-be-freed #GVariant instance). If this + * check fails then a g_critical() is printed and %FALSE is returned. + * + * This function is meant to be used by functions that wish to provide + * varargs accessors to #GVariant values of uncertain values (eg: + * g_variant_lookup() or g_menu_model_get_item_attribute()). + * + * Returns: %TRUE if @format_string is safe to use + * + * Since: 2.34 + */ +gboolean +g_variant_check_format_string (GVariant *value, + const gchar *format_string, + gboolean copy_only) +{ + const gchar *original_format = format_string; + const gchar *type_string; + + /* Interesting factoid: assuming a format string is valid, it can be + * converted to a type string by removing all '@' '&' and '^' + * characters. + * + * Instead of doing that, we can just skip those characters when + * comparing it to the type string of @value. + * + * For the copy-only case we can just drop the '&' from the list of + * characters to skip over. A '&' will never appear in a type string + * so we know that it won't be possible to return %TRUE if it is in a + * format string. + */ + type_string = g_variant_get_type_string (value); + + while (*type_string || *format_string) + { + gchar format = *format_string++; + + switch (format) + { + case '&': + if G_UNLIKELY (copy_only) + { + /* for the love of all that is good, please don't mark this string for translation... */ + g_critical ("g_variant_check_format_string() is being called by a function with a GVariant varargs " + "interface to validate the passed format string for type safety. The passed format " + "(%s) contains a '&' character which would result in a pointer being returned to the " + "data inside of a GVariant instance that may no longer exist by the time the function " + "returns. Modify your code to use a format string without '&'.", original_format); + return FALSE; + } + + /* fall through */ + case '^': + case '@': + /* ignore these 2 (or 3) */ + continue; + + case '?': + /* attempt to consume one of 'bynqiuxthdsog' */ + { + char s = *type_string++; + + if (s == '\0' || strchr ("bynqiuxthdsog", s) == NULL) + return FALSE; + } + continue; + + case 'r': + /* ensure it's a tuple */ + if (*type_string != '(') + return FALSE; + + /* fall through */ + case '*': + /* consume a full type string for the '*' or 'r' */ + if (!g_variant_type_string_scan (type_string, NULL, &type_string)) + return FALSE; + + continue; + + default: + /* attempt to consume exactly one character equal to the format */ + if (format != *type_string++) + return FALSE; + } + } + + return TRUE; +} + +/*< private > + * g_variant_format_string_scan_type: + * @string: a string that may be prefixed with a format string + * @limit: (allow-none) (default NULL): a pointer to the end of @string, + * or %NULL + * @endptr: (allow-none) (default NULL): location to store the end pointer, + * or %NULL + * + * 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(). + * + * Returns: (allow-none): a #GVariantType if there was a valid format string + * + * 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', '^ao' */ + g_strfreev (ptr); + else /* '^a&s', '^a&o' */ + 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 gchar +g_variant_scan_convenience (const gchar **str, + gboolean *constant, + guint *arrays) +{ + *constant = FALSE; + *arrays = 0; + + for (;;) + { + char c = *(*str)++; + + if (c == '&') + *constant = TRUE; + + else if (c == 'a') + (*arrays)++; + + else + return c; + } +} + +static GVariant * +g_variant_valist_new_nnp (const gchar **str, + gpointer ptr) +{ + if (**str == '&') + (*str)++; + + switch (*(*str)++) + { + case 'a': + if (ptr != NULL) + { + 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; + } + else + + /* special case: NULL pointer for empty array */ + { + const GVariantType *type = (GVariantType *) *str; + + g_variant_type_string_scan (*str, NULL, str); + + if G_UNLIKELY (!g_variant_type_is_definite (type)) + g_error ("g_variant_new: NULL pointer given with indefinite " + "array type; unable to determine which type of empty " + "array to construct."); + + return g_variant_new_array (type, NULL, 0); + } + + case 's': + { + GVariant *value; + + value = g_variant_new_string (ptr); + + if (value == NULL) + value = g_variant_new_string ("[Invalid UTF-8]"); + + return value; + } + + case 'o': + return g_variant_new_object_path (ptr); + + case 'g': + return g_variant_new_signature (ptr); + + case '^': + { + gboolean constant; + guint arrays; + gchar type; + + type = g_variant_scan_convenience (str, &constant, &arrays); + + if (type == 's') + return g_variant_new_strv (ptr, -1); + + if (type == 'o') + return g_variant_new_objv (ptr, -1); + + if (arrays > 1) + return g_variant_new_bytestring_array (ptr, -1); + + return g_variant_new_bytestring (ptr); + } + + 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 '^': + { + gboolean constant; + guint arrays; + gchar type; + + type = g_variant_scan_convenience (str, &constant, &arrays); + + if (type == 's') + { + if (constant) + return g_variant_get_strv (value, NULL); + else + return g_variant_dup_strv (value, NULL); + } + + else if (type == 'o') + { + if (constant) + return g_variant_get_objv (value, NULL); + else + return g_variant_dup_objv (value, NULL); + } + + else if (arrays > 1) + { + if (constant) + return g_variant_get_bytestring_array (value, NULL); + else + return g_variant_dup_bytestring_array (value, NULL); + } + + else + { + if (constant) + return (gchar *) g_variant_get_bytestring (value); + else + return g_variant_dup_bytestring (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 */ + { + gint index = 0; + + g_assert (**str == '(' || **str == '{'); + + (*str)++; + while (**str != ')' && **str != '}') + { + if (value != NULL) + { + GVariant *child = g_variant_get_child_value (value, index++); + g_variant_valist_get (str, child, free, app); + g_variant_unref (child); + } + else + g_variant_valist_get (str, NULL, free, app); + } + (*str)++; + } +} + +/* User-facing API {{{2 */ +/** + * g_variant_new: (skip) + * @format_string: a #GVariant format string + * @...: arguments, as per @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). + * + * Returns: a new floating #GVariant instance + * + * 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: (skip) + * @format_string: a string that is prefixed with a format string + * @endptr: (allow-none) (default NULL): 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_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. + * + * Returns: a new, usually floating, #GVariant + * + * 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: (skip) + * @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. + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * 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: (skip) + * @value: a #GVariant + * @format_string: a string that is prefixed with a format string + * @endptr: (allow-none) (default NULL): 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. + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * 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: (skp) + * @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_ARRAY); + * 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: (skip) + * @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(). + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * 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: (skip) + * @iter: a #GVariantIter + * @format_string: a GVariant format string + * @...: the arguments to unpack the value into + * + * 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. + * + * See the section on GVariant + * Format Strings. + * + * + * 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(). + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * Returns: %TRUE if a value was unpacked, or %FALSE if there as no value + * + * 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: (skip) + * @iter: a #GVariantIter + * @format_string: a GVariant format string + * @...: the arguments to unpack the value into + * + * 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 causes undefined behavior. + * + * If you break out of a such a while loop using g_variant_iter_loop() then + * you must free or unreference all the unpacked values as you would with + * g_variant_get(). Failure to do so will cause a memory leak. + * + * See the section on GVariant + * Format Strings. + * + * + * 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 */ + * /* unless breaking out of this loop */ + * } + * } + * + * + * + * For most cases you should use g_variant_iter_next(). + * + * This function is really only useful when unpacking into #GVariant or + * #GVariantIter in order to allow you to skip the call to + * g_variant_unref() or g_variant_iter_free(). + * + * For example, if you are only looping over simple integer and string + * types, g_variant_iter_next() is definitely preferred. For string + * types, use the '&' prefix to avoid allocating any memory at all (and + * thereby avoiding the need to free anything as well). + * + * @format_string determines the C types that are used for unpacking + * the values and also determines if the values are copied or borrowed, + * see the section on + * GVariant Format Strings. + * + * Returns: %TRUE if a value was unpacked, or %FALSE if there was no + * value + * + * 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 + * + * 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. + * + * Returns: (transfer full): a trusted #GVariant + * + * 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 + * + * 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. + * + * Returns: (transfer full): the byteswapped form of @value + * + * Since: 2.24 + **/ +GVariant * +g_variant_byteswap (GVariant *value) +{ + GVariantTypeInfo *type_info; + guint alignment; + GVariant *new; + + type_info = g_variant_get_type_info (value); + + g_variant_type_info_query (type_info, &alignment, NULL); + + if (alignment) + /* (potentially) contains multi-byte numeric data */ + { + GVariantSerialised serialised; + GVariant *trusted; + GBytes *bytes; + + 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); + + bytes = g_bytes_new_take (serialised.data, serialised.size); + new = g_variant_new_from_bytes (g_variant_get_type (value), bytes, TRUE); + g_bytes_unref (bytes); + } + else + /* contains no multi-byte data */ + new = value; + + return g_variant_ref_sink (new); +} + +/** + * g_variant_new_from_data: + * @type: a definite #GVariantType + * @data: (array length=size) (element-type guint8): the serialised data + * @size: the size of @data + * @trusted: %TRUE if @data is definitely in normal form + * @notify: (scope async): function to call when @data is no longer needed + * @user_data: data for @notify + * + * 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. + * + * If @data was not stored in this machine's native endianness, any multi-byte + * numeric values in the returned variant will also be in non-native + * endianness. g_variant_byteswap() can be used to recover the original values. + * + * @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. + * + * Returns: (transfer none): a new floating #GVariant of type @type + * + * 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; + GBytes *bytes; + + g_return_val_if_fail (g_variant_type_is_definite (type), NULL); + g_return_val_if_fail (data != NULL || size == 0, NULL); + + if (notify) + bytes = g_bytes_new_with_free_func (data, size, notify, user_data); + else + bytes = g_bytes_new_static (data, size); + + value = g_variant_new_from_bytes (type, bytes, trusted); + g_bytes_unref (bytes); + + return value; +} + +/* Epilogue {{{1 */ +/* vim:set foldmethod=marker: */ diff --git a/glib/gvariant.h b/glib/gvariant.h new file mode 100644 index 0000000..c8050c4 --- /dev/null +++ b/glib/gvariant.h @@ -0,0 +1,395 @@ +/* + * 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__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#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; + +GLIB_AVAILABLE_IN_ALL +void g_variant_unref (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_ref (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_ref_sink (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_floating (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_take_ref (GVariant *value); + +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_get_type (GVariant *value); +GLIB_AVAILABLE_IN_ALL +const gchar * g_variant_get_type_string (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_of_type (GVariant *value, + const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_container (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariantClass g_variant_classify (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_boolean (gboolean value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_byte (guchar value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_int16 (gint16 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_uint16 (guint16 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_int32 (gint32 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_uint32 (guint32 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_int64 (gint64 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_uint64 (guint64 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_handle (gint32 value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_double (gdouble value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_string (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_object_path (const gchar *object_path); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_object_path (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_signature (const gchar *signature); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_signature (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_variant (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_strv (const gchar * const *strv, + gssize length); +GLIB_AVAILABLE_IN_2_30 +GVariant * g_variant_new_objv (const gchar * const *strv, + gssize length); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_bytestring (const gchar *string); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_bytestring_array (const gchar * const *strv, + gssize length); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_fixed_array (const GVariantType *element_type, + gconstpointer elements, + gsize n_elements, + gsize element_size); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_get_boolean (GVariant *value); +GLIB_AVAILABLE_IN_ALL +guchar g_variant_get_byte (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gint16 g_variant_get_int16 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +guint16 g_variant_get_uint16 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gint32 g_variant_get_int32 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +guint32 g_variant_get_uint32 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gint64 g_variant_get_int64 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +guint64 g_variant_get_uint64 (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gint32 g_variant_get_handle (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gdouble g_variant_get_double (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_get_variant (GVariant *value); +GLIB_AVAILABLE_IN_ALL +const gchar * g_variant_get_string (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +gchar * g_variant_dup_string (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +const gchar ** g_variant_get_strv (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +gchar ** g_variant_dup_strv (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_2_30 +const gchar ** g_variant_get_objv (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +gchar ** g_variant_dup_objv (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +const gchar * g_variant_get_bytestring (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gchar * g_variant_dup_bytestring (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +const gchar ** g_variant_get_bytestring_array (GVariant *value, + gsize *length); +GLIB_AVAILABLE_IN_ALL +gchar ** g_variant_dup_bytestring_array (GVariant *value, + gsize *length); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_maybe (const GVariantType *child_type, + GVariant *child); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_array (const GVariantType *child_type, + GVariant * const *children, + gsize n_children); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_tuple (GVariant * const *children, + gsize n_children); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_dict_entry (GVariant *key, + GVariant *value); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_get_maybe (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gsize g_variant_n_children (GVariant *value); +GLIB_AVAILABLE_IN_ALL +void g_variant_get_child (GVariant *value, + gsize index_, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_get_child_value (GVariant *value, + gsize index_); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_lookup (GVariant *dictionary, + const gchar *key, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_lookup_value (GVariant *dictionary, + const gchar *key, + const GVariantType *expected_type); +GLIB_AVAILABLE_IN_ALL +gconstpointer g_variant_get_fixed_array (GVariant *value, + gsize *n_elements, + gsize element_size); + +GLIB_AVAILABLE_IN_ALL +gsize g_variant_get_size (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gconstpointer g_variant_get_data (GVariant *value); +GLIB_AVAILABLE_IN_2_36 +GBytes * g_variant_get_data_as_bytes (GVariant *value); +GLIB_AVAILABLE_IN_ALL +void g_variant_store (GVariant *value, + gpointer data); + +GLIB_AVAILABLE_IN_ALL +gchar * g_variant_print (GVariant *value, + gboolean type_annotate); +GLIB_AVAILABLE_IN_ALL +GString * g_variant_print_string (GVariant *value, + GString *string, + gboolean type_annotate); + +GLIB_AVAILABLE_IN_ALL +guint g_variant_hash (gconstpointer value); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_equal (gconstpointer one, + gconstpointer two); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_get_normal_form (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_is_normal_form (GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_byteswap (GVariant *value); + +GLIB_AVAILABLE_IN_2_36 +GVariant * g_variant_new_from_bytes (const GVariantType *type, + GBytes *bytes, + gboolean trusted); +GLIB_AVAILABLE_IN_ALL +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]; +}; + +GLIB_AVAILABLE_IN_ALL +GVariantIter * g_variant_iter_new (GVariant *value); +GLIB_AVAILABLE_IN_ALL +gsize g_variant_iter_init (GVariantIter *iter, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +GVariantIter * g_variant_iter_copy (GVariantIter *iter); +GLIB_AVAILABLE_IN_ALL +gsize g_variant_iter_n_children (GVariantIter *iter); +GLIB_AVAILABLE_IN_ALL +void g_variant_iter_free (GVariantIter *iter); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_iter_next_value (GVariantIter *iter); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_iter_next (GVariantIter *iter, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_iter_loop (GVariantIter *iter, + const gchar *format_string, + ...); + + +typedef struct _GVariantBuilder GVariantBuilder; +struct _GVariantBuilder { + /*< private >*/ + gsize x[16]; +}; + +typedef enum +{ + G_VARIANT_PARSE_ERROR_FAILED, + G_VARIANT_PARSE_ERROR_BASIC_TYPE_EXPECTED, + G_VARIANT_PARSE_ERROR_CANNOT_INFER_TYPE, + G_VARIANT_PARSE_ERROR_DEFINITE_TYPE_EXPECTED, + G_VARIANT_PARSE_ERROR_INPUT_NOT_AT_END, + G_VARIANT_PARSE_ERROR_INVALID_CHARACTER, + G_VARIANT_PARSE_ERROR_INVALID_FORMAT_STRING, + G_VARIANT_PARSE_ERROR_INVALID_OBJECT_PATH, + G_VARIANT_PARSE_ERROR_INVALID_SIGNATURE, + G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING, + G_VARIANT_PARSE_ERROR_NO_COMMON_TYPE, + G_VARIANT_PARSE_ERROR_NUMBER_OUT_OF_RANGE, + G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, + G_VARIANT_PARSE_ERROR_TYPE_ERROR, + G_VARIANT_PARSE_ERROR_UNEXPECTED_TOKEN, + G_VARIANT_PARSE_ERROR_UNKNOWN_KEYWORD, + G_VARIANT_PARSE_ERROR_UNTERMINATED_STRING_CONSTANT, + G_VARIANT_PARSE_ERROR_VALUE_EXPECTED +} GVariantParseError; +#define G_VARIANT_PARSE_ERROR (g_variant_parser_get_error_quark ()) + +GLIB_AVAILABLE_IN_ALL +GQuark g_variant_parser_get_error_quark (void); + +GLIB_AVAILABLE_IN_ALL +GVariantBuilder * g_variant_builder_new (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_unref (GVariantBuilder *builder); +GLIB_AVAILABLE_IN_ALL +GVariantBuilder * g_variant_builder_ref (GVariantBuilder *builder); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_init (GVariantBuilder *builder, + const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_builder_end (GVariantBuilder *builder); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_clear (GVariantBuilder *builder); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_open (GVariantBuilder *builder, + const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_close (GVariantBuilder *builder); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_add_value (GVariantBuilder *builder, + GVariant *value); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_add (GVariantBuilder *builder, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +void g_variant_builder_add_parsed (GVariantBuilder *builder, + const gchar *format, + ...); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new (const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +void g_variant_get (GVariant *value, + const gchar *format_string, + ...); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_va (const gchar *format_string, + const gchar **endptr, + va_list *app); +GLIB_AVAILABLE_IN_ALL +void g_variant_get_va (GVariant *value, + const gchar *format_string, + const gchar **endptr, + va_list *app); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_check_format_string (GVariant *value, + const gchar *format_string, + gboolean copy_only); + +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_parse (const GVariantType *type, + const gchar *text, + const gchar *limit, + const gchar **endptr, + GError **error); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_parsed (const gchar *format, + ...); +GLIB_AVAILABLE_IN_ALL +GVariant * g_variant_new_parsed_va (const gchar *format, + va_list *app); + +GLIB_AVAILABLE_IN_ALL +gint g_variant_compare (gconstpointer one, + gconstpointer two); +G_END_DECLS + +#endif /* __G_VARIANT_H__ */ diff --git a/glib/gvarianttype.c b/glib/gvarianttype.c new file mode 100644 index 0000000..658af77 --- /dev/null +++ b/glib/gvarianttype.c @@ -0,0 +1,1520 @@ +/* + * 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 + + +/** + * 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 D-Bus 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 D-Bus 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 D-Bus. For example, it is possible to speak + * of "an array of any type" in GVariant, where the D-Bus 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 D-Bus, 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: D-Bus + * 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 D-Bus 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_of_type() with an indefinite type may return + * %TRUE. For example, you cannot 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 D-Bus 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 D-Bus object path. + * + * + * + * + * + * + * g + * + * + * + * + * the type string of %G_VARIANT_TYPE_STRING; a string in the + * form of a D-Bus 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) +{ + if (type == NULL) + return FALSE; + +#if 0 + return g_variant_type_string_scan ((const gchar *) type, NULL, NULL); +#else + return TRUE; +#endif +} + +/** + * g_variant_type_string_scan: + * @string: a pointer to any string + * @limit: (allow-none): the end of @string, or %NULL + * @endptr: (out) (allow-none): location to store the end pointer, or %NULL + * + * 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(). + * + * Returns: %TRUE if a valid type string was found + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type_string is exactly one valid type string + * + * 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: (allow-none): 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 + * + * Makes a copy of a #GVariantType. It is appropriate to call + * g_variant_type_free() on the return value. @type may not be %NULL. + * + * Returns: (transfer full): a new #GVariantType + * + * 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 + * + * 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. + * + * Returns: (transfer full): a new #GVariantType + * + * 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 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(). + * + * Returns: the length of the corresponding type 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; +} + +/* + This function is not introspectable, it returns something that + is not an array and neither a string +*/ +/** + * g_variant_type_peek_string: (skip) + * @type: a #GVariantType + * + * 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(). + * + * Returns: the corresponding type string (not nul-terminated) + * + * 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 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. + * + * Returns: (transfer full): the corresponding type string + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is definite + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a container type + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a basic type + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a maybe type + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is an array type + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a tuple type + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a dictionary entry type + * + * 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 + * + * Determines if the given @type is the variant type. + * + * Returns: %TRUE if @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: (type GVariantType): a #GVariantType + * + * 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. + * + * Returns: the hash value + * + * 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: (type GVariantType): a #GVariantType + * @type2: (type GVariantType): a #GVariantType + * + * 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. + * + * Returns: %TRUE if @type1 and @type2 are exactly equal + * + * 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 + * + * 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. + * + * Returns: %TRUE if @type is a subtype of @supertype + * + * 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 + * + * Determines the element type of an array or maybe type. + * + * This function may only be used with array or maybe types. + * + * Returns: (transfer none): the element type of @type + * + * 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 + * + * 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. + * + * Returns: (transfer none): the first item type of @type, or %NULL + * + * 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 + * + * 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. + * + * Returns: (transfer none): the next #GVariantType after @type, or %NULL + * + * 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 + * + * 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. + * + * Returns: the number of items in @type + * + * 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 + * + * 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(). + * + * Returns: (transfer none): the key type of the dictionary entry + * + * 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 + * + * Determines the value type of a dictionary entry type. + * + * This function may only be used with a dictionary entry type. + * + * Returns: (transfer none): the value type of the dictionary entry + * + * 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: (array length=length): an array of #GVariantTypes, one for each item + * @length: the length of @items, or -1 + * + * 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. + * + * Returns: (transfer full): a new tuple #GVariantType + * + * 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: (constructor) + * @element: a #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. + * + * Returns: (transfer full): a new array #GVariantType + * + * 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: (constructor) + * @element: a #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. + * + * Returns: (transfer full): a new maybe #GVariantType + * + * 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: (constructor) + * @key: a basic #GVariantType + * @value: a #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. + * + * Returns: (transfer full): a new dictionary entry #GVariantType + * + * 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; +} diff --git a/glib/gvarianttype.h b/glib/gvarianttype.h new file mode 100644 index 0000000..81e324f --- /dev/null +++ b/glib/gvarianttype.h @@ -0,0 +1,382 @@ +/* + * 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__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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_of(). 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 D-Bus 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 D-Bus, then there is no reason to make + * use of this type. If you are, then the D-Bus 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 D-Bus type signature. These are strings of a specific + * format used as type signatures for D-Bus methods and messages. + * + * If you are not interacting with D-Bus, then there is no reason to make + * use of this type. If you are, then the D-Bus 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 D-Bus message. + * + * If you are not interacting with D-Bus, 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_STRING_ARRAY: + * + * The type of an array of strings. + **/ +#define G_VARIANT_TYPE_STRING_ARRAY ((const GVariantType *) "as") + +/** + * G_VARIANT_TYPE_OBJECT_PATH_ARRAY: + * + * The type of an array of object paths. + **/ +#define G_VARIANT_TYPE_OBJECT_PATH_ARRAY ((const GVariantType *) "ao") + +/** + * G_VARIANT_TYPE_BYTESTRING: + * + * The type of an array of bytes. This type is commonly used to pass + * around strings that may not be valid utf8. In that case, the + * convention is that the nul terminator character should be included as + * the last character in the array. + **/ +#define G_VARIANT_TYPE_BYTESTRING ((const GVariantType *) "ay") + +/** + * G_VARIANT_TYPE_BYTESTRING_ARRAY: + * + * The type of an array of byte strings (an array of arrays of bytes). + **/ +#define G_VARIANT_TYPE_BYTESTRING_ARRAY ((const GVariantType *) "aay") + +/** + * G_VARIANT_TYPE_VARDICT: + * + * The type of a dictionary mapping strings to variants (the ubiquitous + * "a{sv}" type). + * + * Since: 2.30 + **/ +#define G_VARIANT_TYPE_VARDICT ((const GVariantType *) "a{sv}") + + +/** + * 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. If in doubt, use g_variant_type_string_is_valid() to + * check if the string is valid. + * + * 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 */ +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_string_is_valid (const gchar *type_string); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_string_scan (const gchar *string, + const gchar *limit, + const gchar **endptr); + +/* create/destroy */ +GLIB_AVAILABLE_IN_ALL +void g_variant_type_free (GVariantType *type); +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_copy (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_new (const gchar *type_string); + +/* getters */ +GLIB_AVAILABLE_IN_ALL +gsize g_variant_type_get_string_length (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +const gchar * g_variant_type_peek_string (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gchar * g_variant_type_dup_string (const GVariantType *type); + +/* classification */ +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_definite (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_container (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_basic (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_maybe (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_array (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_tuple (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_dict_entry (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_variant (const GVariantType *type); + +/* for hash tables */ +GLIB_AVAILABLE_IN_ALL +guint g_variant_type_hash (gconstpointer type); +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_equal (gconstpointer type1, + gconstpointer type2); + +/* subtypes */ +GLIB_AVAILABLE_IN_ALL +gboolean g_variant_type_is_subtype_of (const GVariantType *type, + const GVariantType *supertype); + +/* type iterator interface */ +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_type_element (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_type_first (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_type_next (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +gsize g_variant_type_n_items (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_type_key (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +const GVariantType * g_variant_type_value (const GVariantType *type); + +/* constructors */ +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_new_array (const GVariantType *element); +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_new_maybe (const GVariantType *element); +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_new_tuple (const GVariantType * const *items, + gint length); +GLIB_AVAILABLE_IN_ALL +GVariantType * g_variant_type_new_dict_entry (const GVariantType *key, + const GVariantType *value); + +/*< private >*/ +GLIB_AVAILABLE_IN_ALL +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..7a76d27 --- /dev/null +++ b/glib/gvarianttypeinfo.c @@ -0,0 +1,869 @@ +/* + * 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 + +/* < 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 existence) 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: (allow-none): the location to store the alignment, or %NULL + * @fixed_size: (allow-none): 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 GV_ARRAY_INFO_CLASS 'a' +static ArrayInfo * +GV_ARRAY_INFO (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, GV_ARRAY_INFO_CLASS); + + return (ArrayInfo *) info; +} + +static void +array_info_free (GVariantTypeInfo *info) +{ + ArrayInfo *array_info; + + g_assert (info->container_class == GV_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 = GV_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 GV_ARRAY_INFO (info)->element; +} + +/* < private > + * g_variant_type_query_element: + * @info: a #GVariantTypeInfo for an array or maybe type + * @alignment: (allow-none): the location to store the alignment, or %NULL + * @fixed_size: (allow-none): 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 (GV_ARRAY_INFO (info)->element, + alignment, fixed_size); +} + +/* == tuple == */ +#define GV_TUPLE_INFO_CLASS 'r' +static TupleInfo * +GV_TUPLE_INFO (GVariantTypeInfo *info) +{ + g_variant_type_info_check (info, GV_TUPLE_INFO_CLASS); + + return (TupleInfo *) info; +} + +static void +tuple_info_free (GVariantTypeInfo *info) +{ + TupleInfo *tuple_info; + gint i; + + g_assert (info->container_class == GV_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 = GV_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 GV_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 = GV_TUPLE_INFO (info); + + if (index < tuple_info->n_members) + return &tuple_info->members[index]; + + return NULL; +} + +/* == new/ref/unref == */ +static GRecMutex g_variant_type_info_lock; +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_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_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_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_rec_mutex_unlock (&g_variant_type_info_lock); + + g_free (container->type_string); + + if (info->container_class == GV_ARRAY_INFO_CLASS) + array_info_free (info); + + else if (info->container_class == GV_TUPLE_INFO_CLASS) + tuple_info_free (info); + + else + g_assert_not_reached (); + } + else + g_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); +} diff --git a/glib/gvarianttypeinfo.h b/glib/gvarianttypeinfo.h new file mode 100644 index 0000000..7247bf2 --- /dev/null +++ b/glib/gvarianttypeinfo.h @@ -0,0 +1,161 @@ +/* + * 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 precede 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 preceding 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 + * preceding the item of interest. If no variable-sized items precede + * 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 */ +GLIB_AVAILABLE_IN_ALL +const gchar * g_variant_type_info_get_type_string (GVariantTypeInfo *typeinfo); + +GLIB_AVAILABLE_IN_ALL +void g_variant_type_info_query (GVariantTypeInfo *typeinfo, + guint *alignment, + gsize *size); + +/* array */ +GLIB_AVAILABLE_IN_ALL +GVariantTypeInfo * g_variant_type_info_element (GVariantTypeInfo *typeinfo); +GLIB_AVAILABLE_IN_ALL +void g_variant_type_info_query_element (GVariantTypeInfo *typeinfo, + guint *alignment, + gsize *size); + +/* structure */ +GLIB_AVAILABLE_IN_ALL +gsize g_variant_type_info_n_members (GVariantTypeInfo *typeinfo); +GLIB_AVAILABLE_IN_ALL +const GVariantMemberInfo * g_variant_type_info_member_info (GVariantTypeInfo *typeinfo, + gsize index); + +/* new/ref/unref */ +GLIB_AVAILABLE_IN_ALL +GVariantTypeInfo * g_variant_type_info_get (const GVariantType *type); +GLIB_AVAILABLE_IN_ALL +GVariantTypeInfo * g_variant_type_info_ref (GVariantTypeInfo *typeinfo); +GLIB_AVAILABLE_IN_ALL +void g_variant_type_info_unref (GVariantTypeInfo *typeinfo); +GLIB_AVAILABLE_IN_ALL +void g_variant_type_info_assert_no_infos (void); + +#endif /* __G_VARIANT_TYPE_INFO_H__ */ diff --git a/glib/gversion.c b/glib/gversion.c new file mode 100644 index 0000000..70650b3 --- /dev/null +++ b/glib/gversion.c @@ -0,0 +1,157 @@ +/* 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/. + */ + +#include "config.h" + +#include "gversion.h" + +/** + * SECTION:version + * @Title: Version Information + * @Short_description: 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 GLib headers annotate deprecated APIs in a way that produces + * compiler warnings if these deprecated APIs are used. The warnings + * can be turned off by defining the macro %GLIB_DISABLE_DEPRECATION_WARNINGS + * before including the glib.h header. + * + * GLib also provides support for building applications against + * defined subsets of deprecated or new GLib APIs. Define the macro + * %GLIB_VERSION_MIN_REQUIRED to specify up to what version of GLib + * you want to receive warnings about deprecated APIs. Define the + * macro %GLIB_VERSION_MAX_ALLOWED to specify the newest version of + * GLib whose API you want to use. + */ + +/** + * GLIB_MAJOR_VERSION: + * + * 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: + * + * 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: + * + * 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: + * @major: the major version to check for + * @minor: the minor version to check for + * @micro: the micro version to check for + * + * Checks the version of the GLib library that is being compiled + * against. + * + * + * 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"); + * + * + * + * See glib_check_version() for a runtime check. + * + * Returns: %TRUE if the version of the GLib header files + * is the same as or newer than the passed-in version. + */ + +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; + +/** + * 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; +} diff --git a/glib/gversion.h b/glib/gversion.h new file mode 100644 index 0000000..7eb414d --- /dev/null +++ b/glib/gversion.h @@ -0,0 +1,57 @@ +/* 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_VERSION_H__ +#define __G_VERSION_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +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; + +GLIB_AVAILABLE_IN_ALL +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 + +#endif /* __G_VERSION_H__ */ diff --git a/glib/gversionmacros.h b/glib/gversionmacros.h new file mode 100644 index 0000000..b294d74 --- /dev/null +++ b/glib/gversionmacros.h @@ -0,0 +1,275 @@ +/* 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_VERSION_MACROS_H__ +#define __G_VERSION_MACROS_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +/* Version boundaries checks */ + +#define G_ENCODE_VERSION(major,minor) ((major) << 16 | (minor) << 8) + +/* XXX: Every new stable minor release bump should add a macro here */ + +/** + * GLIB_VERSION_2_26: + * + * A macro that evaluates to the 2.26 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.32 + */ +#define GLIB_VERSION_2_26 (G_ENCODE_VERSION (2, 26)) + +/** + * GLIB_VERSION_2_28: + * + * A macro that evaluates to the 2.28 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.32 + */ +#define GLIB_VERSION_2_28 (G_ENCODE_VERSION (2, 28)) + +/** + * GLIB_VERSION_2_30: + * + * A macro that evaluates to the 2.30 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.32 + */ +#define GLIB_VERSION_2_30 (G_ENCODE_VERSION (2, 30)) + +/** + * GLIB_VERSION_2_32: + * + * A macro that evaluates to the 2.32 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.32 + */ +#define GLIB_VERSION_2_32 (G_ENCODE_VERSION (2, 32)) + +/** + * GLIB_VERSION_2_34: + * + * A macro that evaluates to the 2.34 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.34 + */ +#define GLIB_VERSION_2_34 (G_ENCODE_VERSION (2, 34)) + +/** + * GLIB_VERSION_2_36: + * + * A macro that evaluates to the 2.36 version of GLib, in a format + * that can be used by the C pre-processor. + * + * Since: 2.36 + */ +#define GLIB_VERSION_2_36 (G_ENCODE_VERSION (2, 36)) + +/* evaluates to the current stable version; for development cycles, + * this means the next stable target + */ +#if (GLIB_MINOR_VERSION % 2) +#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION + 1)) +#else +#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION)) +#endif + +/* evaluates to the previous stable version */ +#if (GLIB_MINOR_VERSION % 2) +#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 1)) +#else +#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 2)) +#endif + +/** + * GLIB_VERSION_MIN_REQUIRED: + * + * A macro that should be defined by the user prior to including + * the glib.h header. + * The definition should be one of the predefined GLib version + * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,... + * + * This macro defines the earliest version of GLib that the package is + * required to be able to compile against. + * + * If the compiler is configured to warn about the use of deprecated + * functions, then using functions that were deprecated in version + * %GLIB_VERSION_MIN_REQUIRED or earlier will cause warnings (but + * using functions deprecated in later releases will not). + * + * Since: 2.32 + */ +/* If the package sets GLIB_VERSION_MIN_REQUIRED to some future + * GLIB_VERSION_X_Y value that we don't know about, it will compare as + * 0 in preprocessor tests. + */ +#ifndef GLIB_VERSION_MIN_REQUIRED +# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE) +#elif GLIB_VERSION_MIN_REQUIRED == 0 +# undef GLIB_VERSION_MIN_REQUIRED +# define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE + 2) +#endif + +/** + * GLIB_VERSION_MAX_ALLOWED: + * + * A macro that should be defined by the user prior to including + * the glib.h header. + * The definition should be one of the predefined GLib version + * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,... + * + * This macro defines the latest version of the GLib API that the + * package is allowed to make use of. + * + * If the compiler is configured to warn about the use of deprecated + * functions, then using functions added after version + * %GLIB_VERSION_MAX_ALLOWED will cause warnings. + * + * Unless you are using GLIB_CHECK_VERSION() or the like to compile + * different code depending on the GLib version, then this should be + * set to the same value as %GLIB_VERSION_MIN_REQUIRED. + * + * Since: 2.32 + */ +#if !defined (GLIB_VERSION_MAX_ALLOWED) || (GLIB_VERSION_MAX_ALLOWED == 0) +# undef GLIB_VERSION_MAX_ALLOWED +# define GLIB_VERSION_MAX_ALLOWED (GLIB_VERSION_CUR_STABLE) +#endif + +/* sanity checks */ +#if GLIB_VERSION_MIN_REQUIRED > GLIB_VERSION_CUR_STABLE +#error "GLIB_VERSION_MIN_REQUIRED must be <= GLIB_VERSION_CUR_STABLE" +#endif +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_MIN_REQUIRED +#error "GLIB_VERSION_MAX_ALLOWED must be >= GLIB_VERSION_MIN_REQUIRED" +#endif +#if GLIB_VERSION_MIN_REQUIRED < GLIB_VERSION_2_26 +#error "GLIB_VERSION_MIN_REQUIRED must be >= GLIB_VERSION_2_26" +#endif + +/* These macros are used to mark deprecated functions in GLib headers, + * and thus have to be exposed in installed headers. But please + * do *not* use them in other projects. Instead, use G_DEPRECATED + * or define your own wrappers around it. + */ +#define GLIB_AVAILABLE_IN_ALL _GLIB_EXTERN + +/* XXX: Every new stable minor release should add a set of macros here */ + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_26 +# define GLIB_DEPRECATED_IN_2_26 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_26_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_26 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_26_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_26 +# define GLIB_AVAILABLE_IN_2_26 GLIB_UNAVAILABLE(2, 26) +#else +# define GLIB_AVAILABLE_IN_2_26 _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_28 +# define GLIB_DEPRECATED_IN_2_28 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_28_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_28 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_28_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_28 +# define GLIB_AVAILABLE_IN_2_28 GLIB_UNAVAILABLE(2, 28) +#else +# define GLIB_AVAILABLE_IN_2_28 _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_30 +# define GLIB_DEPRECATED_IN_2_30 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_30_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_30 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_30_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_30 +# define GLIB_AVAILABLE_IN_2_30 GLIB_UNAVAILABLE(2, 30) +#else +# define GLIB_AVAILABLE_IN_2_30 _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_32 +# define GLIB_DEPRECATED_IN_2_32 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_32_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_32 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_32_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_32 +# define GLIB_AVAILABLE_IN_2_32 GLIB_UNAVAILABLE(2, 32) +#else +# define GLIB_AVAILABLE_IN_2_32 _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_34 +# define GLIB_DEPRECATED_IN_2_34 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_34_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_34 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_34_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_34 +# define GLIB_AVAILABLE_IN_2_34 GLIB_UNAVAILABLE(2, 34) +#else +# define GLIB_AVAILABLE_IN_2_34 _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_36 +# define GLIB_DEPRECATED_IN_2_36 GLIB_DEPRECATED +# define GLIB_DEPRECATED_IN_2_36_FOR(f) GLIB_DEPRECATED_FOR(f) +#else +# define GLIB_DEPRECATED_IN_2_36 _GLIB_EXTERN +# define GLIB_DEPRECATED_IN_2_36_FOR(f) _GLIB_EXTERN +#endif + +#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_36 +# define GLIB_AVAILABLE_IN_2_36 GLIB_UNAVAILABLE(2, 36) +#else +# define GLIB_AVAILABLE_IN_2_36 _GLIB_EXTERN +#endif + +#endif /* __G_VERSION_MACROS_H__ */ diff --git a/glib/gwakeup.c b/glib/gwakeup.c new file mode 100644 index 0000000..5e03b5d --- /dev/null +++ b/glib/gwakeup.c @@ -0,0 +1,269 @@ +/* + * Copyright © 2011 Canonical 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" + + +/* gwakeup.h is special -- GIO and some test cases include it. As such, + * it cannot include other glib headers without triggering the single + * includes warnings. We have to manually include its dependencies here + * (and at all other use sites). + */ +#ifdef GLIB_COMPILATION +#include "gtypes.h" +#include "gpoll.h" +#else +#include +#endif + +#include "gwakeup.h" + +/*< private > + * SECTION:gwakeup + * @title: GWakeup + * @short_description: portable cross-thread event signal mechanism + * + * #GWakeup is a simple and portable way of signaling events between + * different threads in a way that integrates nicely with g_poll(). + * GLib uses it internally for cross-thread signalling in the + * implementation of #GMainContext and #GCancellable. + * + * You first create a #GWakeup with g_wakeup_new() and initialise a + * #GPollFD from it using g_wakeup_get_pollfd(). Polling on the created + * #GPollFD will block until g_wakeup_signal() is called, at which point + * it will immediately return. Future attempts to poll will continue to + * return until g_wakeup_acknowledge() is called. g_wakeup_free() is + * used to free a #GWakeup. + * + * On sufficiently modern Linux, this is implemented using eventfd. On + * Windows it is implemented using an event handle. On other systems it + * is implemented with a pair of pipes. + * + * Since: 2.30 + **/ +#ifdef _WIN32 + +#include + +#ifdef GLIB_COMPILATION +#include "gmessages.h" +#include "giochannel.h" +#include "gwin32.h" +#endif + +GWakeup * +g_wakeup_new (void) +{ + HANDLE wakeup; + + wakeup = CreateEvent (NULL, TRUE, FALSE, NULL); + + if (wakeup == NULL) + g_error ("Cannot create event for GWakeup: %s", + g_win32_error_message (GetLastError ())); + + return (GWakeup *) wakeup; +} + +void +g_wakeup_get_pollfd (GWakeup *wakeup, + GPollFD *poll_fd) +{ + poll_fd->fd = (gintptr) wakeup; + poll_fd->events = G_IO_IN; +} + +void +g_wakeup_acknowledge (GWakeup *wakeup) +{ + ResetEvent ((HANDLE) wakeup); +} + +void +g_wakeup_signal (GWakeup *wakeup) +{ + SetEvent ((HANDLE) wakeup); +} + +void +g_wakeup_free (GWakeup *wakeup) +{ + CloseHandle ((HANDLE) wakeup); +} + +#else + +#include "glib-unix.h" +#include + +#if defined (HAVE_EVENTFD) +#include +#endif + +struct _GWakeup +{ + gint fds[2]; +}; + +/** + * g_wakeup_new: + * + * Creates a new #GWakeup. + * + * You should use g_wakeup_free() to free it when you are done. + * + * Returns: a new #GWakeup + * + * Since: 2.30 + **/ +GWakeup * +g_wakeup_new (void) +{ + GError *error = NULL; + GWakeup *wakeup; + + wakeup = g_slice_new (GWakeup); + + /* try eventfd first, if we think we can */ +#if defined (HAVE_EVENTFD) +#ifndef TEST_EVENTFD_FALLBACK + wakeup->fds[0] = eventfd (0, EFD_CLOEXEC | EFD_NONBLOCK); +#else + wakeup->fds[0] = -1; +#endif + + if (wakeup->fds[0] != -1) + { + wakeup->fds[1] = -1; + return wakeup; + } + + /* for any failure, try a pipe instead */ +#endif + + if (!g_unix_open_pipe (wakeup->fds, FD_CLOEXEC, &error)) + g_error ("Creating pipes for GWakeup: %s\n", error->message); + + if (!g_unix_set_fd_nonblocking (wakeup->fds[0], TRUE, &error) || + !g_unix_set_fd_nonblocking (wakeup->fds[1], TRUE, &error)) + g_error ("Set pipes non-blocking for GWakeup: %s\n", error->message); + + return wakeup; +} + +/** + * g_wakeup_get_pollfd: + * @wakeup: a #GWakeup + * @poll_fd: a #GPollFD + * + * Prepares a @poll_fd such that polling on it will succeed when + * g_wakeup_signal() has been called on @wakeup. + * + * @poll_fd is valid until @wakeup is freed. + * + * Since: 2.30 + **/ +void +g_wakeup_get_pollfd (GWakeup *wakeup, + GPollFD *poll_fd) +{ + poll_fd->fd = wakeup->fds[0]; + poll_fd->events = G_IO_IN; +} + +/** + * g_wakeup_acknowledge: + * @wakeup: a #GWakeup + * + * Acknowledges receipt of a wakeup signal on @wakeup. + * + * You must call this after @wakeup polls as ready. If not, it will + * continue to poll as ready until you do so. + * + * If you call this function and @wakeup is not signaled, nothing + * happens. + * + * Since: 2.30 + **/ +void +g_wakeup_acknowledge (GWakeup *wakeup) +{ + char buffer[16]; + + /* read until it is empty */ + while (read (wakeup->fds[0], buffer, sizeof buffer) == sizeof buffer); +} + +/** + * g_wakeup_signal: + * @wakeup: a #GWakeup + * + * Signals @wakeup. + * + * Any future (or present) polling on the #GPollFD returned by + * g_wakeup_get_pollfd() will immediately succeed until such a time as + * g_wakeup_acknowledge() is called. + * + * This function is safe to call from a UNIX signal handler. + * + * Since: 2.30 + **/ +void +g_wakeup_signal (GWakeup *wakeup) +{ + guint64 one = 1; + int res; + + if (wakeup->fds[1] == -1) + { + do + res = write (wakeup->fds[0], &one, sizeof one); + while (G_UNLIKELY (res == -1 && errno == EINTR)); + } + else + { + do + res = write (wakeup->fds[1], &one, 1); + while (G_UNLIKELY (res == -1 && errno == EINTR)); + } +} + +/** + * g_wakeup_free: + * @wakeup: a #GWakeup + * + * Frees @wakeup. + * + * You must not currently be polling on the #GPollFD returned by + * g_wakeup_get_pollfd(), or the result is undefined. + **/ +void +g_wakeup_free (GWakeup *wakeup) +{ + close (wakeup->fds[0]); + + if (wakeup->fds[1] != -1) + close (wakeup->fds[1]); + + g_slice_free (GWakeup, wakeup); +} + +#endif /* !_WIN32 */ diff --git a/glib/gwakeup.h b/glib/gwakeup.h new file mode 100644 index 0000000..d871cdf --- /dev/null +++ b/glib/gwakeup.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2011 Canonical 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_WAKEUP_H__ +#define __G_WAKEUP_H__ + +#include + +typedef struct _GWakeup GWakeup; + +GWakeup * g_wakeup_new (void); +void g_wakeup_free (GWakeup *wakeup); + +void g_wakeup_get_pollfd (GWakeup *wakeup, + GPollFD *poll_fd); +void g_wakeup_signal (GWakeup *wakeup); +void g_wakeup_acknowledge (GWakeup *wakeup); + +#endif diff --git a/glib/gwin32.c b/glib/gwin32.c new file mode 100644 index 0000000..97eccd7 --- /dev/null +++ b/glib/gwin32.c @@ -0,0 +1,577 @@ +/* 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 "gthreadprivate.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: (allow-none): 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: (allow-none): You should pass %NULL for this. + * @dll_name: (allow-none): 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: (allow-none): You should pass %NULL for this. + * @dll_name: (allow-none): 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 + +/** + * 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 + * detailed 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) +{ + static gsize windows_version; + + if (g_once_init_enter (&windows_version)) + g_once_init_leave (&windows_version, GetVersion ()); + + 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; +} diff --git a/glib/gwin32.h b/glib/gwin32.h new file mode 100644 index 0000000..ae87a45 --- /dev/null +++ b/glib/gwin32.h @@ -0,0 +1,133 @@ +/* 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_WIN32_H__ +#define __G_WIN32_H__ + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#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: + */ +GLIB_AVAILABLE_IN_ALL +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(). + */ +GLIB_AVAILABLE_IN_ALL +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(). + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_win32_error_message (gint error); + +#ifndef _WIN64 +GLIB_DEPRECATED +gchar* g_win32_get_package_installation_directory (const gchar *package, + const gchar *dll_name); + +GLIB_DEPRECATED +gchar* g_win32_get_package_installation_subdirectory (const gchar *package, + const gchar *dll_name, + const gchar *subdir); +#endif + +GLIB_AVAILABLE_IN_ALL +gchar* g_win32_get_package_installation_directory_of_module (gpointer hmodule); + +GLIB_AVAILABLE_IN_ALL +guint g_win32_get_windows_version (void); + +GLIB_AVAILABLE_IN_ALL +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 */ + +#ifdef G_OS_WIN32 +#ifdef _WIN64 +#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 +#endif + +GLIB_AVAILABLE_IN_ALL +gchar *g_win32_get_package_installation_directory_utf8 (const gchar *package, + const gchar *dll_name); +GLIB_AVAILABLE_IN_ALL +gchar *g_win32_get_package_installation_subdirectory_utf8 (const gchar *package, + const gchar *dll_name, + const gchar *subdir); + +#endif /* G_OS_WIN32 */ + +#endif /* __G_WIN32_H__ */ diff --git a/glib/libcharset/.gitignore b/glib/libcharset/.gitignore new file mode 100644 index 0000000..0cef440 --- /dev/null +++ b/glib/libcharset/.gitignore @@ -0,0 +1,3 @@ +charset.alias +ref-add.sed +ref-del.sed diff --git a/glib/libcharset/Makefile.am b/glib/libcharset/Makefile.am new file mode 100644 index 0000000..fb9a978 --- /dev/null +++ b/glib/libcharset/Makefile.am @@ -0,0 +1,66 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + -DLIBDIR=\"$(libdir)\" \ + $(config_h_INCLUDES) + +noinst_LTLIBRARIES = libcharset.la + +libcharset_la_CFLAGS = $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +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 + $(AM_V_GEN) $(SHELL) $(srcdir)/config.charset '@host@' > t-$@ + @mv t-$@ $@ + +all-local: ref-add.sed ref-del.sed charset.alias + +SUFFIXES = .sed .sin +.sin.sed: + $(AM_V_GEN) $(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/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..cb1d8f0 --- /dev/null +++ b/glib/libcharset/config.charset @@ -0,0 +1,672 @@ +#! /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. + # + # Even with those limitations, nl_langinfo does work often + # enough to be useful. Since setenv works only with locales + # provided in /usr/share/locale, the following aliases are the + # codesets used there. + echo "ARMSCII-8 ARMSCII-8" + echo "Big5HKSCS BIG5-HKSCS" + echo "Big5 BIG5" + echo "CP866 CP866" + echo "CP949 CP949" + echo "CP1131 CP1131" + echo "CP1251 CP1251" + echo "eucCN EUC-CN" + echo "eucKR EUC-KR" + echo "eucJP EUC-JP" + echo "eucjp EUC-JP" + echo "GB18030 GB18030" + echo "GB2312 GB2312" + echo "GBK GBK" +# echo "ISCII-DEV ISCII_DEV" Not supported by iconv + 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-9 ISO-8859-9" + echo "ISO8859-13 ISO-8859-13" + echo "ISO8859-15 ISO-8859-15" + echo "KOI8-R KOI8-R" + echo "KOI8-U KOI8-U" + echo "PT154 CP154" + echo "SJIS SHIFT_JIS" + 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..3e07c42 --- /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..e45b1e5 --- /dev/null +++ b/glib/makefile.msc.in @@ -0,0 +1,143 @@ +## 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 \ + 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 + +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 winmm.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/pcre/COPYING b/glib/pcre/COPYING new file mode 100644 index 0000000..58eed01 --- /dev/null +++ b/glib/pcre/COPYING @@ -0,0 +1,5 @@ +PCRE LICENCE + +Please see the file LICENCE in the PCRE distribution for licensing details. + +End diff --git a/glib/pcre/Makefile.am b/glib/pcre/Makefile.am new file mode 100644 index 0000000..53669a0 --- /dev/null +++ b/glib/pcre/Makefile.am @@ -0,0 +1,63 @@ +include $(top_srcdir)/Makefile.decl + +noinst_LTLIBRARIES = libpcre.la + +libpcre_la_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GRegex\" \ + -DHAVE_CONFIG_H \ + -DSUPPORT_UCP \ + -DSUPPORT_UTF \ + -DSUPPORT_UTF8 \ + -DNEWLINE=-1 \ + -DMATCH_LIMIT=10000000 \ + -DMATCH_LIMIT_RECURSION=8192 \ + -DMAX_NAME_SIZE=32 \ + -DMAX_NAME_COUNT=10000 \ + -DMAX_DUPLENGTH=30000 \ + -DLINK_SIZE=2 \ + -DPOSIX_MALLOC_THRESHOLD=10 \ + -DPCRE_STATIC \ + -UBSR_ANYCRLF \ + -UEBCDIC \ + $(glib_INCLUDES) \ + @GLIB_DEBUG_FLAGS@ \ + -DGLIB_COMPILATION \ + $(AM_CPPFLAGS) + +libpcre_la_CFLAGS = \ + $(GLIB_HIDDEN_VISIBILITY_CFLAGS) \ + $(PCRE_WARN_CFLAGS) \ + $(DEP_CFLAGS) \ + $(AM_CFLAGS) + +libpcre_la_LDFLAGS = \ + -no-undefined \ + $(AM_LDFLAGS) + +libpcre_la_SOURCES = \ + pcre_byte_order.c \ + pcre_chartables.c \ + pcre_compile.c \ + pcre_config.c \ + pcre_dfa_exec.c \ + pcre_exec.c \ + pcre_fullinfo.c \ + pcre_get.c \ + pcre_globals.c \ + pcre_jit_compile.c \ + pcre_newline.c \ + pcre_ord2utf8.c \ + pcre_string_utils.c \ + pcre_study.c \ + pcre_tables.c \ + pcre_valid_utf8.c \ + pcre_xclass.c \ + pcre.h \ + pcre_internal.h \ + ucp.h + +libpcre_la_LIBADD = $(DEP_LIBS) + +EXTRA_DIST += \ + COPYING \ + makefile.msc 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..b71ead3 --- /dev/null +++ b/glib/pcre/pcre.h @@ -0,0 +1,507 @@ +/************************************************* +* 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-2012 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 8 +#define PCRE_MINOR 31 +#define PCRE_PRERELEASE +#define PCRE_DATE 2012-07-06 + +/* 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. Some are compile-time only, some are run-time only, and some are +both, so we keep them all distinct. However, almost all the bits in the options +word are now used. In the long run, we may have to re-use some of the +compile-time only bits for runtime options, or vice versa. In the comments +below, "compile", "exec", and "DFA exec" mean that the option is permitted to +be set for those functions; "used in" means that an option may be set only for +compile, but is subsequently referenced in exec and/or DFA exec. Any of the +compile-time options may be inspected during studying (and therefore JIT +compiling). */ + +#define PCRE_CASELESS 0x00000001 /* Compile */ +#define PCRE_MULTILINE 0x00000002 /* Compile */ +#define PCRE_DOTALL 0x00000004 /* Compile */ +#define PCRE_EXTENDED 0x00000008 /* Compile */ +#define PCRE_ANCHORED 0x00000010 /* Compile, exec, DFA exec */ +#define PCRE_DOLLAR_ENDONLY 0x00000020 /* Compile, used in exec, DFA exec */ +#define PCRE_EXTRA 0x00000040 /* Compile */ +#define PCRE_NOTBOL 0x00000080 /* Exec, DFA exec */ +#define PCRE_NOTEOL 0x00000100 /* Exec, DFA exec */ +#define PCRE_UNGREEDY 0x00000200 /* Compile */ +#define PCRE_NOTEMPTY 0x00000400 /* Exec, DFA exec */ +/* The next two are also used in exec and DFA exec */ +#define PCRE_UTF8 0x00000800 /* Compile (same as PCRE_UTF16) */ +#define PCRE_UTF16 0x00000800 /* Compile (same as PCRE_UTF8) */ +#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* Compile */ +/* The next two are also used in exec and DFA exec */ +#define PCRE_NO_UTF8_CHECK 0x00002000 /* Compile (same as PCRE_NO_UTF16_CHECK) */ +#define PCRE_NO_UTF16_CHECK 0x00002000 /* Compile (same as PCRE_NO_UTF8_CHECK) */ +#define PCRE_AUTO_CALLOUT 0x00004000 /* Compile */ +#define PCRE_PARTIAL_SOFT 0x00008000 /* Exec, DFA exec */ +#define PCRE_PARTIAL 0x00008000 /* Backwards compatible synonym */ +#define PCRE_DFA_SHORTEST 0x00010000 /* DFA exec */ +#define PCRE_DFA_RESTART 0x00020000 /* DFA exec */ +#define PCRE_FIRSTLINE 0x00040000 /* Compile, used in exec, DFA exec */ +#define PCRE_DUPNAMES 0x00080000 /* Compile */ +#define PCRE_NEWLINE_CR 0x00100000 /* Compile, exec, DFA exec */ +#define PCRE_NEWLINE_LF 0x00200000 /* Compile, exec, DFA exec */ +#define PCRE_NEWLINE_CRLF 0x00300000 /* Compile, exec, DFA exec */ +#define PCRE_NEWLINE_ANY 0x00400000 /* Compile, exec, DFA exec */ +#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* Compile, exec, DFA exec */ +#define PCRE_BSR_ANYCRLF 0x00800000 /* Compile, exec, DFA exec */ +#define PCRE_BSR_UNICODE 0x01000000 /* Compile, exec, DFA exec */ +#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* Compile, used in exec */ +#define PCRE_NO_START_OPTIMIZE 0x04000000 /* Compile, exec, DFA exec */ +#define PCRE_NO_START_OPTIMISE 0x04000000 /* Synonym */ +#define PCRE_PARTIAL_HARD 0x08000000 /* Exec, DFA exec */ +#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* Exec, DFA exec */ +#define PCRE_UCP 0x20000000 /* Compile, used in exec, DFA exec */ + +/* 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) /* Same for 8/16 */ +#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16 */ +#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ +#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ +#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) +#define PCRE_ERROR_BADOFFSET (-24) +#define PCRE_ERROR_SHORTUTF8 (-25) +#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ +#define PCRE_ERROR_RECURSELOOP (-26) +#define PCRE_ERROR_JIT_STACKLIMIT (-27) +#define PCRE_ERROR_BADMODE (-28) +#define PCRE_ERROR_BADENDIANNESS (-29) +#define PCRE_ERROR_DFA_BADRESTART (-30) + +/* Specific error codes for UTF-8 validity checks */ + +#define PCRE_UTF8_ERR0 0 +#define PCRE_UTF8_ERR1 1 +#define PCRE_UTF8_ERR2 2 +#define PCRE_UTF8_ERR3 3 +#define PCRE_UTF8_ERR4 4 +#define PCRE_UTF8_ERR5 5 +#define PCRE_UTF8_ERR6 6 +#define PCRE_UTF8_ERR7 7 +#define PCRE_UTF8_ERR8 8 +#define PCRE_UTF8_ERR9 9 +#define PCRE_UTF8_ERR10 10 +#define PCRE_UTF8_ERR11 11 +#define PCRE_UTF8_ERR12 12 +#define PCRE_UTF8_ERR13 13 +#define PCRE_UTF8_ERR14 14 +#define PCRE_UTF8_ERR15 15 +#define PCRE_UTF8_ERR16 16 +#define PCRE_UTF8_ERR17 17 +#define PCRE_UTF8_ERR18 18 +#define PCRE_UTF8_ERR19 19 +#define PCRE_UTF8_ERR20 20 +#define PCRE_UTF8_ERR21 21 + +/* Specific error codes for UTF-16 validity checks */ + +#define PCRE_UTF16_ERR0 0 +#define PCRE_UTF16_ERR1 1 +#define PCRE_UTF16_ERR2 2 +#define PCRE_UTF16_ERR3 3 +#define PCRE_UTF16_ERR4 4 + +/* 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 +#define PCRE_INFO_MINLENGTH 15 +#define PCRE_INFO_JIT 16 +#define PCRE_INFO_JITSIZE 17 +#define PCRE_INFO_MAXLOOKBEHIND 18 + +/* 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 +#define PCRE_CONFIG_JIT 9 +#define PCRE_CONFIG_UTF16 10 +#define PCRE_CONFIG_JITTARGET 11 + +/* Request types for pcre_study(). Do not re-arrange, in order to remain +compatible. */ + +#define PCRE_STUDY_JIT_COMPILE 0x0001 +#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 +#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 + +/* Bit flags for the pcre[16]_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 +#define PCRE_EXTRA_MARK 0x0020 +#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 + +/* Types */ + +struct real_pcre; /* declaration; the definition is private */ +typedef struct real_pcre pcre; + +struct real_pcre16; /* declaration; the definition is private */ +typedef struct real_pcre16 pcre16; + +struct real_pcre_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre_jit_stack pcre_jit_stack; + +struct real_pcre16_jit_stack; /* declaration; the definition is private */ +typedef struct real_pcre16_jit_stack pcre16_jit_stack; + +/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain +a 16 bit wide signed data type. Otherwise it can be a dummy data type since +pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ +#ifndef PCRE_UCHAR16 +#define PCRE_UCHAR16 unsigned short +#endif + +#ifndef PCRE_SPTR16 +#define PCRE_SPTR16 const PCRE_UCHAR16 * +#endif + +/* 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() */ + unsigned char **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre_extra; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_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_UCHAR16 **mark; /* For passing back a mark pointer */ + void *executable_jit; /* Contains a pointer to a compiled jit code */ +} pcre16_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 */ + /* ------------------- Added for Version 2 -------------------------- */ + const unsigned char *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre_callout_block; + +/* Same structure as above, but with 16 bit char pointers. */ + +typedef struct pcre16_callout_block { + int version; /* Identifies version of block */ + /* ------------------------ Version 0 ------------------------------- */ + int callout_number; /* Number compiled into pattern */ + int *offset_vector; /* The offset vector */ + PCRE_SPTR16 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 */ + /* ------------------- Added for Version 2 -------------------------- */ + const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ + /* ------------------------------------------------------------------ */ +} pcre16_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_EXP_DECL void *(*pcre_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_free)(void *); +PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre_stack_free)(void *); +PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); + +PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_free)(void *); +PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); +PCRE_EXP_DECL void (*pcre16_stack_free)(void *); +PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); +#else /* VPCOMPAT */ +PCRE_EXP_DECL void *pcre_malloc(size_t); +PCRE_EXP_DECL void pcre_free(void *); +PCRE_EXP_DECL void *pcre_stack_malloc(size_t); +PCRE_EXP_DECL void pcre_stack_free(void *); +PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); + +PCRE_EXP_DECL void *pcre16_malloc(size_t); +PCRE_EXP_DECL void pcre16_free(void *); +PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); +PCRE_EXP_DECL void pcre16_stack_free(void *); +PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); +#endif /* VPCOMPAT */ + +/* User defined callback which provides a stack just before the match starts. */ + +typedef pcre_jit_stack *(*pcre_jit_callback)(void *); +typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); + +/* Exported PCRE functions */ + +PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, 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 pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, + int *, const unsigned char *); +PCRE_EXP_DECL int pcre_config(int, void *); +PCRE_EXP_DECL int pcre16_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 pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); +PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, + char *, int); +PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, + PCRE_UCHAR16 *, 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 pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, 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 int pcre16_exec(const pcre16 *, const pcre16_extra *, + PCRE_SPTR16, int, int, int, int *, int); +PCRE_EXP_DECL void pcre_free_substring(const char *); +PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); +PCRE_EXP_DECL void pcre_free_substring_list(const char **); +PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, + void *); +PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_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 pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, + int *, int, PCRE_SPTR16, PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); +PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); +PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, + char **, char **); +PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, + PCRE_UCHAR16 **, PCRE_UCHAR16 **); +PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, + const char **); +PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, + PCRE_SPTR16 *); +PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, + const char ***); +PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, + PCRE_SPTR16 **); +PCRE_EXP_DECL const unsigned char *pcre_maketables(void); +PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); +PCRE_EXP_DECL int pcre_refcount(pcre *, int); +PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); +PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); +PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); +PCRE_EXP_DECL void pcre_free_study(pcre_extra *); +PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); +PCRE_EXP_DECL const char *pcre_version(void); +PCRE_EXP_DECL const char *pcre16_version(void); + +/* Utility functions for byte order swaps. */ +PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, + const unsigned char *); +PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, + PCRE_SPTR16, int, int *, int); + +/* JIT compiler related functions. */ + +PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); +PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); +PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); +PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); +PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, + pcre_jit_callback, void *); +PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, + pcre16_jit_callback, void *); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/glib/pcre/pcre_byte_order.c b/glib/pcre/pcre_byte_order.c new file mode 100644 index 0000000..6ac8325 --- /dev/null +++ b/glib/pcre/pcre_byte_order.c @@ -0,0 +1,288 @@ +/************************************************* +* 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-2012 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" + + +/************************************************* +* Swap byte functions * +*************************************************/ + +/* The following functions swap the bytes of a pcre_uint16 +and pcre_uint32 value. + +Arguments: + value any number + +Returns: the byte swapped value +*/ + +static pcre_uint32 +swap_uint32(pcre_uint32 value) +{ +return ((value & 0x000000ff) << 24) | + ((value & 0x0000ff00) << 8) | + ((value & 0x00ff0000) >> 8) | + (value >> 24); +} + +static pcre_uint16 +swap_uint16(pcre_uint16 value) +{ +return (value >> 8) | (value << 8); +} + + +/************************************************* +* Test for a byte-flipped compiled regex * +*************************************************/ + +/* This function swaps the bytes of a compiled pattern usually +loaded form the disk. It also sets the tables pointer, which +is likely an invalid pointer after reload. + +Arguments: + argument_re points to the compiled expression + extra_data points to extra data or is NULL + tables points to the character tables or NULL + +Returns: 0 if the swap is successful, negative on error +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *argument_re, + pcre_extra *extra_data, const unsigned char *tables) +#else +PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *argument_re, + pcre16_extra *extra_data, const unsigned char *tables) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)argument_re; +pcre_study_data *study; +#ifndef COMPILE_PCRE8 +pcre_uchar *ptr; +int length; +#ifdef SUPPORT_UTF +BOOL utf; +BOOL utf16_char; +#endif /* SUPPORT_UTF */ +#endif /* !COMPILE_PCRE8 */ + +if (re == NULL) return PCRE_ERROR_NULL; +if (re->magic_number == MAGIC_NUMBER) + { + if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + re->tables = tables; + return 0; + } + +if (re->magic_number != REVERSED_MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; +if ((swap_uint16(re->flags) & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +re->magic_number = MAGIC_NUMBER; +re->size = swap_uint32(re->size); +re->options = swap_uint32(re->options); +re->flags = swap_uint16(re->flags); +re->top_bracket = swap_uint16(re->top_bracket); +re->top_backref = swap_uint16(re->top_backref); +re->first_char = swap_uint16(re->first_char); +re->req_char = swap_uint16(re->req_char); +re->name_table_offset = swap_uint16(re->name_table_offset); +re->name_entry_size = swap_uint16(re->name_entry_size); +re->name_count = swap_uint16(re->name_count); +re->ref_count = swap_uint16(re->ref_count); +re->tables = tables; + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) + { + study = (pcre_study_data *)extra_data->study_data; + study->size = swap_uint32(study->size); + study->flags = swap_uint32(study->flags); + study->minlength = swap_uint32(study->minlength); + } + +#ifndef COMPILE_PCRE8 +ptr = (pcre_uchar *)re + re->name_table_offset; +length = re->name_count * re->name_entry_size; +#ifdef SUPPORT_UTF +utf = (re->options & PCRE_UTF16) != 0; +utf16_char = FALSE; +#endif + +while(TRUE) + { + /* Swap previous characters. */ + while (length-- > 0) + { + *ptr = swap_uint16(*ptr); + ptr++; + } +#ifdef SUPPORT_UTF + if (utf16_char) + { + if (HAS_EXTRALEN(ptr[-1])) + { + /* We know that there is only one extra character in UTF-16. */ + *ptr = swap_uint16(*ptr); + ptr++; + } + } + utf16_char = FALSE; +#endif /* SUPPORT_UTF */ + + /* Get next opcode. */ + length = 0; + *ptr = swap_uint16(*ptr); + switch (*ptr) + { + case OP_END: + return 0; + +#ifdef SUPPORT_UTF + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + if (utf) utf16_char = TRUE; +#endif + /* Fall through. */ + + default: + length = PRIV(OP_lengths)[*ptr] - 1; + break; + + case OP_CLASS: + case OP_NCLASS: + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uchar); + length = 0; + break; + + case OP_XCLASS: + /* Reverse the size of the XCLASS instance. */ + ptr++; + *ptr = swap_uint16(*ptr); + if (LINK_SIZE > 1) + { + /* LINK_SIZE can be 1 or 2 in 16 bit mode. */ + ptr++; + *ptr = swap_uint16(*ptr); + } + ptr++; + length = (GET(ptr, -LINK_SIZE)) - (1 + LINK_SIZE + 1); + *ptr = swap_uint16(*ptr); + if ((*ptr & XCL_MAP) != 0) + { + /* Skip the character bit map. */ + ptr += 32/sizeof(pcre_uchar); + length -= 32/sizeof(pcre_uchar); + } + break; + } + ptr++; + } +/* Control should never reach here in 16 bit mode. */ +#endif /* !COMPILE_PCRE8 */ + +return 0; +} + +/* End of pcre_byte_order.c */ diff --git a/glib/pcre/pcre_chartables.c b/glib/pcre/pcre_chartables.c new file mode 100644 index 0000000..2a39e9f --- /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 them 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 pcre_uint8 PRIV(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..28dc2ed --- /dev/null +++ b/glib/pcre/pcre_compile.c @@ -0,0 +1,8215 @@ +/************************************************* +* 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-2012 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" + +#ifdef GLIB_COMPILATION +#include "gstrfuncs.h" +#else +#include +#endif + +/* When PCRE_DEBUG is defined, we need the pcre(16)_printint() function, which +is also used by pcretest. PCRE_DEBUG is not defined when building a production +library. We do not need to select pcre16_printint.c specially, because the +COMPILE_PCREx macro will already be appropriately set. */ + +#ifdef PCRE_DEBUG +/* pcre_printint.c should not include any headers */ +#define PCRE_INCLUDED +#include "pcre_printint.c" +#undef PCRE_INCLUDED +#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 for most patterns. However, the memory can get +filled up by repetitions of forward references, for example patterns like +/(?1){0,1999}(b)/, and one user did hit the limit. The code has been changed so +that the workspace is expanded using malloc() in this situation. The value +below is therefore a minimum, and we put a maximum on it for safety. The +minimum is now also defined in terms of LINK_SIZE so that the use of malloc() +kicks in at the same number of forward references in all cases. */ + +#define COMPILE_WORK_SIZE (2048*LINK_SIZE) +#define COMPILE_WORK_SIZE_MAX (100*COMPILE_WORK_SIZE) + +/* The overrun tests check for a slightly smaller size so that they detect the +overrun before it actually does run off the end of the data block. */ + +#define WORK_SIZE_SAFETY_MARGIN (100) + +/* Private flags added to firstchar and reqchar. */ + +#define REQ_CASELESS 0x10000000l /* Indicates caselessness */ +#define REQ_VARY 0x20000000l /* Reqchar followed non-literal item */ + +/* Repeated character flags. */ + +#define UTF_LENGTH 0x10000000l /* The char contains its length. */ + +/* 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 or for EBCDIC systems running +in UTF-8 mode. */ + +static const short int escapes[] = { + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + CHAR_COLON, CHAR_SEMICOLON, + CHAR_LESS_THAN_SIGN, CHAR_EQUALS_SIGN, + CHAR_GREATER_THAN_SIGN, CHAR_QUESTION_MARK, + CHAR_COMMERCIAL_AT, -ESC_A, + -ESC_B, -ESC_C, + -ESC_D, -ESC_E, + 0, -ESC_G, + -ESC_H, 0, + 0, -ESC_K, + 0, 0, + -ESC_N, 0, + -ESC_P, -ESC_Q, + -ESC_R, -ESC_S, + 0, 0, + -ESC_V, -ESC_W, + -ESC_X, 0, + -ESC_Z, CHAR_LEFT_SQUARE_BRACKET, + CHAR_BACKSLASH, CHAR_RIGHT_SQUARE_BRACKET, + CHAR_CIRCUMFLEX_ACCENT, CHAR_UNDERSCORE, + CHAR_GRAVE_ACCENT, 7, + -ESC_b, 0, + -ESC_d, ESC_e, + ESC_f, 0, + -ESC_h, 0, + 0, -ESC_k, + 0, 0, + ESC_n, 0, + -ESC_p, 0, + ESC_r, -ESC_s, + ESC_tee, 0, + -ESC_v, -ESC_w, + 0, 0, + -ESC_z +}; + +#else + +/* This is the "abnormal" table for EBCDIC systems without UTF-8 support. */ + +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,-ESC_N, 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. The +string is built from string macros so that it works in UTF-8 mode on EBCDIC +platforms. */ + +typedef struct verbitem { + int len; /* Length of verb name */ + int op; /* Op when no arg, or -1 if arg mandatory */ + int op_arg; /* Op when arg present, or -1 if not allowed */ +} verbitem; + +static const char verbnames[] = + "\0" /* Empty name is a shorthand for MARK */ + STRING_MARK0 + STRING_ACCEPT0 + STRING_COMMIT0 + STRING_F0 + STRING_FAIL0 + STRING_PRUNE0 + STRING_SKIP0 + STRING_THEN; + +static const verbitem verbs[] = { + { 0, -1, OP_MARK }, + { 4, -1, OP_MARK }, + { 6, OP_ACCEPT, -1 }, + { 6, OP_COMMIT, -1 }, + { 1, OP_FAIL, -1 }, + { 4, OP_FAIL, -1 }, + { 5, OP_PRUNE, OP_PRUNE_ARG }, + { 4, OP_SKIP, OP_SKIP_ARG }, + { 4, OP_THEN, OP_THEN_ARG } +}; + +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[] = + STRING_alpha0 STRING_lower0 STRING_upper0 STRING_alnum0 + STRING_ascii0 STRING_blank0 STRING_cntrl0 STRING_digit0 + STRING_graph0 STRING_print0 STRING_punct0 STRING_space0 + STRING_word0 STRING_xdigit; + +static const pcre_uint8 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 */ +}; + +/* Table of substitutes for \d etc when PCRE_UCP is set. The POSIX class +substitutes must be in the order of the names, defined above, and there are +both positive and negative cases. NULL means no substitute. */ + +#ifdef SUPPORT_UCP +static const pcre_uchar string_PNd[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pNd[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_N, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXsp[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXsp[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_s, CHAR_p, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXwd[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXwd[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_w, CHAR_d, CHAR_RIGHT_CURLY_BRACKET, '\0' }; + +static const pcre_uchar *substitutes[] = { + string_PNd, /* \D */ + string_pNd, /* \d */ + string_PXsp, /* \S */ /* NOTE: Xsp is Perl space */ + string_pXsp, /* \s */ + string_PXwd, /* \W */ + string_pXwd /* \w */ +}; + +static const pcre_uchar string_pL[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pLl[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pLu[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_pXan[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_h[] = { + CHAR_BACKSLASH, CHAR_h, '\0' }; +static const pcre_uchar string_pXps[] = { + CHAR_BACKSLASH, CHAR_p, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PL[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PLl[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_l, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PLu[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_L, CHAR_u, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_PXan[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_a, CHAR_n, CHAR_RIGHT_CURLY_BRACKET, '\0' }; +static const pcre_uchar string_H[] = { + CHAR_BACKSLASH, CHAR_H, '\0' }; +static const pcre_uchar string_PXps[] = { + CHAR_BACKSLASH, CHAR_P, CHAR_LEFT_CURLY_BRACKET, + CHAR_X, CHAR_p, CHAR_s, CHAR_RIGHT_CURLY_BRACKET, '\0' }; + +static const pcre_uchar *posix_substitutes[] = { + string_pL, /* alpha */ + string_pLl, /* lower */ + string_pLu, /* upper */ + string_pXan, /* alnum */ + NULL, /* ascii */ + string_h, /* blank */ + NULL, /* cntrl */ + string_pNd, /* digit */ + NULL, /* graph */ + NULL, /* print */ + NULL, /* punct */ + string_pXps, /* space */ /* NOTE: Xps is POSIX space */ + string_pXwd, /* word */ + NULL, /* xdigit */ + /* Negated cases */ + string_PL, /* ^alpha */ + string_PLl, /* ^lower */ + string_PLu, /* ^upper */ + string_PXan, /* ^alnum */ + NULL, /* ^ascii */ + string_H, /* ^blank */ + NULL, /* ^cntrl */ + string_PNd, /* ^digit */ + NULL, /* ^graph */ + NULL, /* ^print */ + NULL, /* ^punct */ + string_PXps, /* ^space */ /* NOTE: Xps is POSIX space */ + string_PXwd, /* ^word */ + NULL /* ^xdigit */ +}; +#define POSIX_SUBSIZE (sizeof(posix_substitutes) / sizeof(pcre_uchar *)) +#endif + +#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. + +Each substring ends with \0 to insert a null character. This includes the final +substring, so that the whole string ends with \0\0, which can be detected when +counting through. */ + +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 compiled without UTF 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{name}, \\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 in 8-bit non-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" /** DEAD **/ + "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" + "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)\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\0" + /* 65 */ + "different names for subpatterns of the same number are not allowed\0" + "(*MARK) must have an argument\0" + "this version of PCRE is not compiled with Unicode property support\0" + "\\c must be followed by an ASCII character\0" + "\\k is not followed by a braced, angle-bracketed, or quoted name\0" + /* 70 */ + "internal error: unknown opcode in find_fixedlength()\0" + "\\N is not supported in a class\0" + "too many forward references\0" + "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)\0" + "invalid UTF-16 string\0" + /* 75 */ + "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)\0" + "character value in \\u.... sequence is too large\0" + ; + +/* 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. */ + +/* Using a simple comparison for decimal numbers rather than a memory read +is much faster, and the resulting code is simpler (the compiler turns it +into a subtraction and unsigned comparison). */ + +#define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9) + +#if 0 +#ifndef EBCDIC + +/* This is the "normal" case, for ASCII systems, and EBCDIC systems running in +UTF-8 mode. */ + +static const pcre_uint8 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 not running in UTF-8 mode. */ + +static const pcre_uint8 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- 95 */ + 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 pcre_uint8 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- 95 */ + 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 +#endif /* 0 */ + +/* Definition to allow mutual recursion */ + +static BOOL + compile_regex(int, pcre_uchar **, const pcre_uchar **, int *, BOOL, BOOL, int, 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) {}; + if (*s == 0) return "Error text not found (please report)"; + } +return s; +} + + +/************************************************* +* Expand the workspace * +*************************************************/ + +/* This function is called during the second compiling phase, if the number of +forward references fills the existing workspace, which is originally a block on +the stack. A larger block is obtained from malloc() unless the ultimate limit +has been reached or the increase will be rather small. + +Argument: pointer to the compile data block +Returns: 0 if all went well, else an error number +*/ + +static int +expand_workspace(compile_data *cd) +{ +pcre_uchar *newspace; +int newsize = cd->workspace_size * 2; + +if (newsize > COMPILE_WORK_SIZE_MAX) newsize = COMPILE_WORK_SIZE_MAX; +if (cd->workspace_size >= COMPILE_WORK_SIZE_MAX || + newsize - cd->workspace_size < WORK_SIZE_SAFETY_MARGIN) + return ERR72; + +newspace = (PUBL(malloc))(IN_UCHARS(newsize)); +if (newspace == NULL) return ERR21; +memcpy(newspace, cd->start_workspace, cd->workspace_size * sizeof(pcre_uchar)); +cd->hwm = (pcre_uchar *)newspace + (cd->hwm - cd->start_workspace); +if (cd->workspace_size > COMPILE_WORK_SIZE) + (PUBL(free))((void *)cd->start_workspace); +cd->start_workspace = newspace; +cd->workspace_size = newsize; +return 0; +} + + + +/************************************************* +* 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 pcre_uchar *p) +{ +if (!IS_DIGIT(*p)) return FALSE; +p++; +while (IS_DIGIT(*p)) p++; +if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE; + +if (*p++ != CHAR_COMMA) return FALSE; +if (*p == CHAR_RIGHT_CURLY_BRACKET) return TRUE; + +if (!IS_DIGIT(*p)) return FALSE; +p++; +while (IS_DIGIT(*p)) p++; + +return (*p == CHAR_RIGHT_CURLY_BRACKET); +} + + + +/************************************************* +* 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 pcre_uchar **ptrptr, int *errorcodeptr, int bracount, + int options, BOOL isclass) +{ +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +const pcre_uchar *ptr = *ptrptr + 1; +pcre_int32 c; +int 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/UTF-8 coding */ +/* Not alphanumeric */ +else if (c < CHAR_0 || c > CHAR_z) {} +else if ((i = escapes[c - CHAR_0]) != 0) c = i; + +#else /* EBCDIC coding */ +/* Not alphanumeric */ +else if (c < 'a' || (!MAX_255(c) || (ebcdic_chartab[c] & 0x0E) == 0)) {} +else if ((i = escapes[c - 0x48]) != 0) c = i; +#endif + +/* Escapes that need further processing, or are illegal. */ + +else + { + const pcre_uchar *oldptr; + BOOL braced, negated; + + switch (c) + { + /* A number of Perl escapes are not handled by PCRE. We give an explicit + error. */ + + case CHAR_l: + case CHAR_L: + *errorcodeptr = ERR37; + break; + + case CHAR_u: + if ((options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + /* In JavaScript, \u must be followed by four hexadecimal numbers. + Otherwise it is a lowercase u letter. */ + if (MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0 + && MAX_255(ptr[2]) && g_ascii_isxdigit(ptr[2]) != 0 + && MAX_255(ptr[3]) && g_ascii_isxdigit(ptr[3]) != 0 + && MAX_255(ptr[4]) && g_ascii_isxdigit(ptr[4]) != 0) + { + c = 0; + for (i = 0; i < 4; ++i) + { + register int cc = *(++ptr); +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + +#ifdef COMPILE_PCRE8 + if (c > (utf ? 0x10ffff : 0xff)) +#else +#ifdef COMPILE_PCRE16 + if (c > (utf ? 0x10ffff : 0xffff)) +#endif +#endif + { + *errorcodeptr = ERR76; + } + else if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + } + } + else + *errorcodeptr = ERR37; + break; + + case CHAR_U: + /* In JavaScript, \U is an uppercase U letter. */ + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) *errorcodeptr = ERR37; + break; + + /* In a character class, \g is just a literal "g". Outside a character + class, \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 CHAR_g: + if (isclass) break; + if (ptr[1] == CHAR_LESS_THAN_SIGN || ptr[1] == CHAR_APOSTROPHE) + { + c = -ESC_g; + break; + } + + /* Handle the Perl-compatible cases */ + + if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) + { + const pcre_uchar *p; + for (p = ptr+2; *p != 0 && *p != CHAR_RIGHT_CURLY_BRACKET; p++) + if (*p != CHAR_MINUS && !IS_DIGIT(*p)) break; + if (*p != 0 && *p != CHAR_RIGHT_CURLY_BRACKET) + { + c = -ESC_k; + break; + } + braced = TRUE; + ptr++; + } + else braced = FALSE; + + if (ptr[1] == CHAR_MINUS) + { + negated = TRUE; + ptr++; + } + else negated = FALSE; + + /* The integer range is limited by the machine's int representation. */ + c = 0; + while (IS_DIGIT(ptr[1])) + { + if (((unsigned int)c) > INT_MAX / 10) /* Integer overflow */ + { + c = -1; + break; + } + c = c * 10 + *(++ptr) - CHAR_0; + } + if (((unsigned int)c) > INT_MAX) /* Integer overflow */ + { + while (IS_DIGIT(ptr[1])) + ptr++; + *errorcodeptr = ERR61; + break; + } + + if (braced && *(++ptr) != CHAR_RIGHT_CURLY_BRACKET) + { + *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 CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: case CHAR_5: + case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9: + + if (!isclass) + { + oldptr = ptr; + /* The integer range is limited by the machine's int representation. */ + c -= CHAR_0; + while (IS_DIGIT(ptr[1])) + { + if (((unsigned int)c) > INT_MAX / 10) /* Integer overflow */ + { + c = -1; + break; + } + c = c * 10 + *(++ptr) - CHAR_0; + } + if (((unsigned int)c) > INT_MAX) /* Integer overflow */ + { + while (IS_DIGIT(ptr[1])) + ptr++; + *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) >= CHAR_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 and 16-bit mode, + but no more than 3 octal digits. */ + + case CHAR_0: + c -= CHAR_0; + while(i++ < 2 && ptr[1] >= CHAR_0 && ptr[1] <= CHAR_7) + c = c * 8 + *(++ptr) - CHAR_0; +#ifdef COMPILE_PCRE8 + if (!utf && c > 0xff) *errorcodeptr = ERR51; +#endif + break; + + /* \x is complicated. \x{ddd} is a character number which can be greater + than 0xff in utf or non-8bit mode, but only if the ddd are hex digits. + If not, { is treated as a data character. */ + + case CHAR_x: + if ((options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + /* In JavaScript, \x must be followed by two hexadecimal numbers. + Otherwise it is a lowercase x letter. */ + if (MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0 + && MAX_255(ptr[2]) && g_ascii_isxdigit(ptr[2]) != 0) + { + c = 0; + for (i = 0; i < 2; ++i) + { + register int cc = *(++ptr); +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + } + break; + } + + if (ptr[1] == CHAR_LEFT_CURLY_BRACKET) + { + const pcre_uchar *pt = ptr + 2; + + c = 0; + while (MAX_255(*pt) && g_ascii_isxdigit(*pt) != 0) + { + register int cc = *pt++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ + +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = (c << 4) + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc >= CHAR_a && cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = (c << 4) + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + +#ifdef COMPILE_PCRE8 + if (c > (utf ? 0x10ffff : 0xff)) { c = -1; break; } +#else +#ifdef COMPILE_PCRE16 + if (c > (utf ? 0x10ffff : 0xffff)) { c = -1; break; } +#endif +#endif + } + + if (c < 0) + { + while (MAX_255(*pt) && g_ascii_isxdigit(*pt) != 0) pt++; + *errorcodeptr = ERR34; + } + + if (*pt == CHAR_RIGHT_CURLY_BRACKET) + { + if (utf && c >= 0xd800 && c <= 0xdfff) *errorcodeptr = ERR73; + 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 && MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0) + { + int cc; /* Some compilers don't like */ + cc = *(++ptr); /* ++ in initializers */ +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (cc >= CHAR_a) cc -= 32; /* Convert to upper case */ + c = c * 16 + cc - ((cc < CHAR_A)? CHAR_0 : (CHAR_A - 10)); +#else /* EBCDIC coding */ + if (cc <= CHAR_z) cc += 64; /* Convert to upper case */ + c = c * 16 + cc - ((cc >= CHAR_0)? CHAR_0 : (CHAR_A - 10)); +#endif + } + break; + + /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped. + An error is given if the byte following \c is not an ASCII character. This + coding is ASCII-specific, but then the whole concept of \cx is + ASCII-specific. (However, an EBCDIC equivalent has now been added.) */ + + case CHAR_c: + c = *(++ptr); + if (c == 0) + { + *errorcodeptr = ERR2; + break; + } +#ifndef EBCDIC /* ASCII/UTF-8 coding */ + if (c > 127) /* Excludes all non-ASCII in either mode */ + { + *errorcodeptr = ERR68; + break; + } + if (c >= CHAR_a && c <= CHAR_z) c -= 32; + c ^= 0x40; +#else /* EBCDIC coding */ + if (c >= CHAR_a && c <= CHAR_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; + } + } + +/* Perl supports \N{name} for character names, as well as plain \N for "not +newline". PCRE does not support \N{name}. However, it does support +quantification such as \N{2,3}. */ + +if (c == -ESC_N && ptr[1] == CHAR_LEFT_CURLY_BRACKET && + !is_counted_repeat(ptr+2)) + *errorcodeptr = ERR37; + +/* If PCRE_UCP is set, we change the values for \d etc. */ + +if ((options & PCRE_UCP) != 0 && c <= -ESC_D && c >= -ESC_w) + c -= (ESC_DU - ESC_D); + +/* Set the pointer to the final character before returning. */ + +*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 pcre_uchar **ptrptr, BOOL *negptr, int *dptr, int *errorcodeptr) +{ +int c, i, bot, top; +const pcre_uchar *ptr = *ptrptr; +pcre_uchar 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 == CHAR_LEFT_CURLY_BRACKET) + { + if (ptr[1] == CHAR_CIRCUMFLEX_ACCENT) + { + *negptr = TRUE; + ptr++; + } + for (i = 0; i < (int)(sizeof(name) / sizeof(pcre_uchar)) - 1; i++) + { + c = *(++ptr); + if (c == 0) goto ERROR_RETURN; + if (c == CHAR_RIGHT_CURLY_BRACKET) break; + name[i] = c; + } + if (c != CHAR_RIGHT_CURLY_BRACKET) 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 = PRIV(utt_size); + +while (bot < top) + { + i = (bot + top) >> 1; + c = STRCMP_UC_C8(name, PRIV(utt_names) + PRIV(utt)[i].name_offset); + if (c == 0) + { + *dptr = PRIV(utt)[i].value; + return PRIV(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 + + + + +/************************************************* +* 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 pcre_uchar * +read_repeat_counts(const pcre_uchar *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 (IS_DIGIT(*p)) min = min * 10 + *p++ - CHAR_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 == CHAR_RIGHT_CURLY_BRACKET) max = min; else + { + if (*(++p) != CHAR_RIGHT_CURLY_BRACKET) + { + max = 0; + while(IS_DIGIT(*p)) max = max * 10 + *p++ - CHAR_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; +} + + + +/************************************************* +* Subroutine for finding forward reference * +*************************************************/ + +/* This recursive function is called only from find_parens() below. The +top-level call starts at the beginning of the pattern. All other calls must +start at a parenthesis. It 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. Recursion is used to keep +track of subpatterns that reset the capturing group numbers - the (?| feature. + +This function was originally called only from the second pass, in which we know +that if (?< or (?' or (?P< is encountered, the name will be correctly +terminated because that is checked in the first pass. There is now one call to +this function in the first pass, to check for a recursive back reference by +name (so that we can make the whole group atomic). In this case, we need check +only up to the current position in the pattern, and that is still OK because +and previous occurrences will have been checked. To make this work, the test +for "end of pattern" is a check against cd->end_pattern in the main loop, +instead of looking for a binary zero. This means that the special first-pass +call can adjust cd->end_pattern temporarily. (Checks for binary zero while +processing items within the loop are OK, because afterwards the main loop will +terminate.) + +Arguments: + ptrptr address of the current character pointer (updated) + 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 + utf TRUE if we are in UTF-8 / UTF-16 mode + count pointer to the current capturing subpattern number (updated) + +Returns: the number of the named subpattern, or -1 if not found +*/ + +static int +find_parens_sub(pcre_uchar **ptrptr, compile_data *cd, const pcre_uchar *name, int lorn, + BOOL xmode, BOOL utf, int *count) +{ +pcre_uchar *ptr = *ptrptr; +int start_count = *count; +int hwm_count = start_count; +BOOL dup_parens = FALSE; + +/* If the first character is a parenthesis, check on the type of group we are +dealing with. The very first call may not start with a parenthesis. */ + +if (ptr[0] == CHAR_LEFT_PARENTHESIS) + { + /* Handle specials such as (*SKIP) or (*UTF8) etc. */ + + if (ptr[1] == CHAR_ASTERISK) ptr += 2; + + /* Handle a normal, unnamed capturing parenthesis. */ + + else if (ptr[1] != CHAR_QUESTION_MARK) + { + *count += 1; + if (name == NULL && *count == lorn) return *count; + ptr++; + } + + /* All cases now have (? at the start. Remember when we are in a group + where the parenthesis numbers are duplicated. */ + + else if (ptr[2] == CHAR_VERTICAL_LINE) + { + ptr += 3; + dup_parens = TRUE; + } + + /* Handle comments; all characters are allowed until a ket is reached. */ + + else if (ptr[2] == CHAR_NUMBER_SIGN) + { + for (ptr += 3; *ptr != 0; ptr++) if (*ptr == CHAR_RIGHT_PARENTHESIS) break; + goto FAIL_EXIT; + } + + /* Handle a condition. If it is an assertion, just carry on so that it + is processed as normal. If not, skip to the closing parenthesis of the + condition (there can't be any nested parens). */ + + else if (ptr[2] == CHAR_LEFT_PARENTHESIS) + { + ptr += 2; + if (ptr[1] != CHAR_QUESTION_MARK) + { + while (*ptr != 0 && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + if (*ptr != 0) ptr++; + } + } + + /* Start with (? but not a condition. */ + + else + { + ptr += 2; + if (*ptr == CHAR_P) ptr++; /* Allow optional P */ + + /* We have to disambiguate (? for named groups */ + + if ((*ptr == CHAR_LESS_THAN_SIGN && ptr[1] != CHAR_EXCLAMATION_MARK && + ptr[1] != CHAR_EQUALS_SIGN) || *ptr == CHAR_APOSTROPHE) + { + int term; + const pcre_uchar *thisname; + *count += 1; + if (name == NULL && *count == lorn) return *count; + term = *ptr++; + if (term == CHAR_LESS_THAN_SIGN) term = CHAR_GREATER_THAN_SIGN; + thisname = ptr; + while (*ptr != term) ptr++; + if (name != NULL && lorn == ptr - thisname && + STRNCMP_UC_UC(name, thisname, lorn) == 0) + return *count; + term++; + } + } + } + +/* Past any initial parenthesis handling, scan for parentheses or vertical +bars. Stop if we get to cd->end_pattern. Note that this is important for the +first-pass call when this value is temporarily adjusted to stop at the current +position. So DO NOT change this to a test for binary zero. */ + +for (; ptr < cd->end_pattern; ptr++) + { + /* Skip over backslashed characters and also entire \Q...\E */ + + if (*ptr == CHAR_BACKSLASH) + { + if (*(++ptr) == 0) goto FAIL_EXIT; + if (*ptr == CHAR_Q) for (;;) + { + while (*(++ptr) != 0 && *ptr != CHAR_BACKSLASH) {}; + if (*ptr == 0) goto FAIL_EXIT; + if (*(++ptr) == CHAR_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. Note the use of STR macros to + encode "Q\\E" so that it works in UTF-8 on EBCDIC platforms. */ + + if (*ptr == CHAR_LEFT_SQUARE_BRACKET) + { + BOOL negate_class = FALSE; + for (;;) + { + if (ptr[1] == CHAR_BACKSLASH) + { + if (ptr[2] == CHAR_E) + ptr+= 2; + else if (STRNCMP_UC_C8(ptr + 2, + STR_Q STR_BACKSLASH STR_E, 3) == 0) + ptr += 4; + else + break; + } + else if (!negate_class && ptr[1] == CHAR_CIRCUMFLEX_ACCENT) + { + negate_class = TRUE; + ptr++; + } + else break; + } + + /* If the next character is ']', it is a data character that must be + skipped, except in JavaScript compatibility mode. */ + + if (ptr[1] == CHAR_RIGHT_SQUARE_BRACKET && + (cd->external_options & PCRE_JAVASCRIPT_COMPAT) == 0) + ptr++; + + while (*(++ptr) != CHAR_RIGHT_SQUARE_BRACKET) + { + if (*ptr == 0) return -1; + if (*ptr == CHAR_BACKSLASH) + { + if (*(++ptr) == 0) goto FAIL_EXIT; + if (*ptr == CHAR_Q) for (;;) + { + while (*(++ptr) != 0 && *ptr != CHAR_BACKSLASH) {}; + if (*ptr == 0) goto FAIL_EXIT; + if (*(++ptr) == CHAR_E) break; + } + continue; + } + } + continue; + } + + /* Skip comments in /x mode */ + + if (xmode && *ptr == CHAR_NUMBER_SIGN) + { + ptr++; + while (*ptr != 0) + { + if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } + ptr++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(ptr); +#endif + } + if (*ptr == 0) goto FAIL_EXIT; + continue; + } + + /* Check for the special metacharacters */ + + if (*ptr == CHAR_LEFT_PARENTHESIS) + { + int rc = find_parens_sub(&ptr, cd, name, lorn, xmode, utf, count); + if (rc > 0) return rc; + if (*ptr == 0) goto FAIL_EXIT; + } + + else if (*ptr == CHAR_RIGHT_PARENTHESIS) + { + if (dup_parens && *count < hwm_count) *count = hwm_count; + goto FAIL_EXIT; + } + + else if (*ptr == CHAR_VERTICAL_LINE && dup_parens) + { + if (*count > hwm_count) hwm_count = *count; + *count = start_count; + } + } + +FAIL_EXIT: +*ptrptr = ptr; +return -1; +} + + + + +/************************************************* +* 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 used to be able to start this scan from the +current compiling point, using the current count value from cd->bracount, and +do it all in a single loop, but the addition of the possibility of duplicate +subpattern numbers means that we have to scan from the very start, in order to +take account of such duplicates, and to use a recursive function to keep track +of the different types of group. + +Arguments: + 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 + utf TRUE if we are in UTF-8 / UTF-16 mode + +Returns: the number of the found subpattern, or -1 if not found +*/ + +static int +find_parens(compile_data *cd, const pcre_uchar *name, int lorn, BOOL xmode, + BOOL utf) +{ +pcre_uchar *ptr = (pcre_uchar *)cd->start_pattern; +int count = 0; +int rc; + +/* If the pattern does not start with an opening parenthesis, the first call +to find_parens_sub() will scan right to the end (if necessary). However, if it +does start with a parenthesis, find_parens_sub() will return when it hits the +matching closing parens. That is why we have to have a loop. */ + +for (;;) + { + rc = find_parens_sub(&ptr, cd, name, lorn, xmode, utf, &count); + if (rc > 0 || *ptr++ == 0) break; + } + +return rc; +} + + + + +/************************************************* +* 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, 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 + skipassert TRUE if certain assertions are to be skipped + +Returns: pointer to the first significant opcode +*/ + +static const pcre_uchar* +first_significant_code(const pcre_uchar *code, BOOL skipassert) +{ +for (;;) + { + switch ((int)*code) + { + 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 += PRIV(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_NCREF: + case OP_RREF: + case OP_NRREF: + case OP_DEF: + code += PRIV(OP_lengths)[*code]; + break; + + default: + return code; + } + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Find the fixed length of a branch * +*************************************************/ + +/* Scan a branch 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. The branch is +temporarily terminated with OP_END when this function is called. + +This function is called when a backward assertion is encountered, so that if it +fails, the error message can point to the correct place in the pattern. +However, we cannot do this when the assertion contains subroutine calls, +because they can be forward references. We solve this by remembering this case +and doing the check at the end; a flag specifies which mode we are running in. + +Arguments: + code points to the start of the pattern (the bracket) + utf TRUE in UTF-8 / UTF-16 mode + atend TRUE if called when the pattern is complete + cd the "compile data" structure + +Returns: the fixed length, + or -1 if there is no fixed length, + or -2 if \C was encountered (in UTF-8 mode only) + or -3 if an OP_RECURSE item was encountered and atend is FALSE + or -4 if an unknown opcode was encountered (internal error) +*/ + +static int +find_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd) +{ +int length = -1; + +register int branchlength = 0; +register pcre_uchar *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; + pcre_uchar *ce, *cs; + register int op = *cc; + + switch (op) + { + /* We only need to continue for OP_CBRA (normal capturing bracket) and + OP_BRA (normal non-capturing bracket) because the other variants of these + opcodes are all concerned with unlimited repeated groups, which of course + are not of fixed length. */ + + case OP_CBRA: + case OP_BRA: + case OP_ONCE: + case OP_ONCE_NC: + case OP_COND: + d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd); + 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. An ACCEPT is effectively + an ALT. If it is END it's the end of the outer call. All can be handled by + the same code. Note that we must not include the OP_KETRxxx opcodes here, + because they all imply an unlimited repeat. */ + + case OP_ALT: + case OP_KET: + case OP_END: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + if (length < 0) length = branchlength; + else if (length != branchlength) return -1; + if (*cc != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + break; + + /* A true recursion implies not fixed length, but a subroutine call may + be OK. If the subroutine is a forward reference, we can't deal with + it until the end of the pattern, so return -3. */ + + case OP_RECURSE: + if (!atend) return -3; + cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1); /* Start subpattern */ + do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */ + if (cc > cs && cc < ce) return -1; /* Recursion */ + d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd); + if (d < 0) return d; + branchlength += d; + cc += 1 + LINK_SIZE; + 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); + cc += PRIV(OP_lengths)[*cc]; + break; + + /* Skip over things that don't match chars */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + cc += cc[1] + PRIV(OP_lengths)[*cc]; + break; + + case OP_CALLOUT: + case OP_CIRC: + case OP_CIRCM: + case OP_CLOSE: + case OP_COMMIT: + case OP_CREF: + case OP_DEF: + case OP_DOLL: + case OP_DOLLM: + case OP_EOD: + case OP_EODN: + case OP_FAIL: + case OP_NCREF: + case OP_NRREF: + case OP_NOT_WORD_BOUNDARY: + case OP_PRUNE: + case OP_REVERSE: + case OP_RREF: + case OP_SET_SOM: + case OP_SKIP: + case OP_SOD: + case OP_SOM: + case OP_THEN: + case OP_WORD_BOUNDARY: + cc += PRIV(OP_lengths)[*cc]; + break; + + /* Handle literal characters */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#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: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + branchlength += GET2(cc,1); + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + if (cc[1 + IMM2_SIZE] == OP_PROP || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2; + cc += 1 + IMM2_SIZE + 1; + break; + + /* Handle single-char matchers */ + + case OP_PROP: + case OP_NOTPROP: + cc += 2; + /* Fall through */ + + case OP_HSPACE: + case OP_VSPACE: + case OP_NOT_HSPACE: + case OP_NOT_VSPACE: + 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. This only happens in UTF-8 mode; + otherwise \C is coded as OP_ALLANY. */ + + case OP_ANYBYTE: + return -2; + + /* Check a class for variable quantification */ + +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 + case OP_XCLASS: + cc += GET(cc, 1) - PRIV(OP_lengths)[OP_CLASS]; + /* Fall through */ +#endif + + case OP_CLASS: + case OP_NCLASS: + cc += PRIV(OP_lengths)[OP_CLASS]; + + switch (*cc) + { + case OP_CRPLUS: + case OP_CRMINPLUS: + 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,1+IMM2_SIZE)) return -1; + branchlength += GET2(cc,1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + branchlength++; + } + break; + + /* Anything else is variable length */ + + case OP_ANYNL: + case OP_BRAMINZERO: + case OP_BRAPOS: + case OP_BRAPOSZERO: + case OP_BRAZERO: + case OP_CBRAPOS: + case OP_EXTUNI: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_PLUS: + case OP_PLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_QUERY: + case OP_QUERYI: + case OP_REF: + case OP_REFI: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + case OP_SCOND: + case OP_SKIPZERO: + case OP_STAR: + case OP_STARI: + case OP_TYPEMINPLUS: + case OP_TYPEMINQUERY: + case OP_TYPEMINSTAR: + case OP_TYPEMINUPTO: + case OP_TYPEPLUS: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSUPTO: + case OP_TYPEQUERY: + case OP_TYPESTAR: + case OP_TYPEUPTO: + case OP_UPTO: + case OP_UPTOI: + return -1; + + /* Catch unrecognized opcodes so that when new ones are added they + are not forgotten, as has happened in the past. */ + + default: + return -4; + } + } +/* Control never gets here */ +} + + + + +/************************************************* +* Scan compiled regex for specific bracket * +*************************************************/ + +/* This little function scans through a compiled pattern until it finds a +capturing bracket with the given number, or, if the number is negative, an +instance of OP_REVERSE for a lookbehind. The function is global in the C sense +so that it can be called from pcre_study() when finding the minimum matching +length. + +Arguments: + code points to start of expression + utf TRUE in UTF-8 / UTF-16 mode + number the required bracket number or negative to find a lookbehind + +Returns: pointer to the opcode for the bracket, or NULL if not found +*/ + +const pcre_uchar * +PRIV(find_bracket)(const pcre_uchar *code, BOOL utf, 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 recursion */ + + else if (c == OP_REVERSE) + { + if (number < 0) return (pcre_uchar *)code; + code += PRIV(OP_lengths)[c]; + } + + /* Handle capturing bracket */ + + else if (c == OP_CBRA || c == OP_SCBRA || + c == OP_CBRAPOS || c == OP_SCBRAPOS) + { + int n = GET2(code, 1+LINK_SIZE); + if (n == number) return (pcre_uchar *)code; + code += PRIV(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, and for MARK/PRUNE/SKIP/THEN with an argument, we + must add in its length. */ + + 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[1 + IMM2_SIZE] == OP_PROP + || code[1 + IMM2_SIZE] == OP_NOTPROP) code += 2; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + code += code[1]; + break; + + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(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_UTF + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_EXACT: + case OP_EXACTI: + case OP_UPTO: + case OP_UPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_STAR: + case OP_STARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* 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 + utf TRUE in UTF-8 / UTF-16 mode + +Returns: pointer to the opcode for OP_RECURSE, or NULL if not found +*/ + +static const pcre_uchar * +find_recurse(const pcre_uchar *code, BOOL utf) +{ +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, and for MARK/PRUNE/SKIP/THEN with an argument, we + must add in its length. */ + + 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[1 + IMM2_SIZE] == OP_PROP + || code[1 + IMM2_SIZE] == OP_NOTPROP) code += 2; + break; + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + code += code[1]; + break; + + case OP_THEN_ARG: + code += code[1]; + break; + } + + /* Add in the fixed length from the table */ + + code += PRIV(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_UTF + if (utf) switch(c) + { + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_EXACT: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]); + break; + } +#else + (void)(utf); /* 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 + utf TRUE if in UTF-8 / UTF-16 mode + cd contains pointers to tables etc. + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode, + BOOL utf, compile_data *cd) +{ +register int c; +for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE); + code < endcode; + code = first_significant_code(code + PRIV(OP_lengths)[c], TRUE)) + { + const pcre_uchar *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; + } + + /* For a recursion/subroutine call, if its end has been reached, which + implies a backward reference subroutine call, we can scan it. If it's a + forward reference subroutine call, we can't. To detect forward reference + we have to scan up the list that is kept in the workspace. This function is + called only when doing the real compile, not during the pre-compile that + measures the size of the compiled pattern. */ + + if (c == OP_RECURSE) + { + const pcre_uchar *scode; + BOOL empty_branch; + + /* Test for forward reference */ + + for (scode = cd->start_workspace; scode < cd->hwm; scode += LINK_SIZE) + if (GET(scode, 0) == code + 1 - cd->start_code) return TRUE; + + /* Not a forward reference, test for completed backward reference */ + + empty_branch = FALSE; + scode = cd->start_code + GET(code, 1); + if (GET(scode, 1) == 0) return TRUE; /* Unclosed */ + + /* Completed backwards reference */ + + do + { + if (could_be_empty_branch(scode, endcode, utf, cd)) + { + empty_branch = TRUE; + break; + } + scode += GET(scode, 1); + } + while (*scode == OP_ALT); + + if (!empty_branch) return FALSE; /* All branches are non-empty */ + continue; + } + + /* Groups with zero repeats can of course be empty; skip them. */ + + if (c == OP_BRAZERO || c == OP_BRAMINZERO || c == OP_SKIPZERO || + c == OP_BRAPOSZERO) + { + code += PRIV(OP_lengths)[c]; + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* A nested group that is already marked as "could be empty" can just be + skipped. */ + + if (c == OP_SBRA || c == OP_SBRAPOS || + c == OP_SCBRA || c == OP_SCBRAPOS) + { + do code += GET(code, 1); while (*code == OP_ALT); + c = *code; + continue; + } + + /* For other groups, scan the branches. */ + + if (c == OP_BRA || c == OP_BRAPOS || + c == OP_CBRA || c == OP_CBRAPOS || + c == OP_ONCE || c == OP_ONCE_NC || + c == OP_COND) + { + BOOL empty_branch; + if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ + + /* If a conditional group has only one branch, there is a second, implied, + empty branch, so just skip over the conditional, because it could be empty. + Otherwise, scan the individual branches of the group. */ + + if (c == OP_COND && code[GET(code, 1)] != OP_ALT) + code += GET(code, 1); + else + { + empty_branch = FALSE; + do + { + if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd)) + 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 PRIV(OP_lengths)[] is zero; the + actual length is stored in the compiled code, so we must update "code" + here. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + ccode = code += GET(code, 1); + goto CHECK_CLASS_REPEAT; +#endif + + case OP_CLASS: + case OP_NCLASS: + ccode = code + PRIV(OP_lengths)[OP_CLASS]; + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + 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_CHARI: + case OP_NOT: + case OP_NOTI: + 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[1 + IMM2_SIZE] == OP_PROP + || code[1 + IMM2_SIZE] == OP_NOTPROP) code += 2; + break; + + /* End of branch */ + + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + 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_UTF + case OP_STAR: + case OP_STARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_QUERY: + case OP_QUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + if (utf && HAS_EXTRALEN(code[1])) code += GET_EXTRALEN(code[1]); + break; + + case OP_UPTO: + case OP_UPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + if (utf && HAS_EXTRALEN(code[1 + IMM2_SIZE])) code += GET_EXTRALEN(code[1 + IMM2_SIZE]); + break; +#endif + + /* MARK, and PRUNE/SKIP/THEN with an argument must skip over the argument + string. */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + code += code[1]; + break; + + case OP_THEN_ARG: + code += code[1]; + break; + + /* None of the remaining opcodes are required to match a character. */ + + default: + break; + } + } + +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. +This function is called only during the real compile, not during the +pre-compile. + +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 + utf TRUE if in UTF-8 / UTF-16 mode + cd pointers to tables etc + +Returns: TRUE if what is matched could be empty +*/ + +static BOOL +could_be_empty(const pcre_uchar *code, const pcre_uchar *endcode, + branch_chain *bcptr, BOOL utf, compile_data *cd) +{ +while (bcptr != NULL && bcptr->current_branch >= code) + { + if (!could_be_empty_branch(bcptr->current_branch, endcode, utf, cd)) + 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. + +A user pointed out that PCRE was rejecting [:a[:digit:]] whereas Perl was not. +It seems that the appearance of a nested POSIX class supersedes an apparent +external class. For example, [:a[:digit:]b:] matches "a", "b", ":", or +a digit. + +In Perl, unescaped square brackets may also appear as part of class names. For +example, [:a[:abc]b:] gives unknown POSIX class "[:abc]b:]". However, for +[:a[:abc]b][b:] it gives unknown POSIX class "[:abc]b][b:]", which does not +seem right at all. PCRE does not allow closing square brackets in POSIX class +names. + +Arguments: + ptr pointer to the initial [ + endptr where to return the end pointer + +Returns: TRUE or FALSE +*/ + +static BOOL +check_posix_syntax(const pcre_uchar *ptr, const pcre_uchar **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 == CHAR_BACKSLASH && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET) + ptr++; + else if (*ptr == CHAR_RIGHT_SQUARE_BRACKET) return FALSE; + else + { + if (*ptr == terminator && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET) + { + *endptr = ptr; + return TRUE; + } + if (*ptr == CHAR_LEFT_SQUARE_BRACKET && + (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && + check_posix_syntax(ptr, endptr)) + return FALSE; + } + } +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 pcre_uchar *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_UC_C8(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 + utf TRUE in UTF-8 / UTF-16 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(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd, + pcre_uchar *save_hwm) +{ +pcre_uchar *ptr = group; + +while ((ptr = (pcre_uchar *)find_recurse(ptr, utf)) != NULL) + { + int offset; + pcre_uchar *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 pcre_uchar * +auto_callout(pcre_uchar *code, const pcre_uchar *ptr, compile_data *cd) +{ +*code++ = OP_CALLOUT; +*code++ = 255; +PUT(code, 0, (int)(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(pcre_uchar *previous_callout, const pcre_uchar *ptr, compile_data *cd) +{ +int length = (int)(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; +} + + + +/************************************************* +* Check a character and a property * +*************************************************/ + +/* This function is called by check_auto_possessive() when a property item +is adjacent to a fixed character. + +Arguments: + c the character + ptype the property type + pdata the data for the type + negated TRUE if it's a negated property (\P or \p{^) + +Returns: TRUE if auto-possessifying is OK +*/ + +static BOOL +check_char_prop(int c, int ptype, int pdata, BOOL negated) +{ +const pcre_uint8 chartype = UCD_CHARTYPE(c); +switch(ptype) + { + case PT_LAMP: + return (chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == negated; + + case PT_GC: + return (pdata == PRIV(ucp_gentype)[chartype]) == negated; + + case PT_PC: + return (pdata == chartype) == negated; + + case PT_SC: + return (pdata == UCD_SCRIPT(c)) == negated; + + /* These are specials */ + + case PT_ALNUM: + return (PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N) == negated; + + case PT_SPACE: /* Perl space */ + return (PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == negated; + + case PT_PXSPACE: /* POSIX space */ + return (PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) + == negated; + + case PT_WORD: + return (PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE) == negated; + } +return FALSE; +} +#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: + previous pointer to the repeated opcode + utf TRUE in UTF-8 / UTF-16 mode + 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(const pcre_uchar *previous, BOOL utf, + const pcre_uchar *ptr, int options, compile_data *cd) +{ +pcre_int32 c, next; +int op_code = *previous++; + +/* Skip whitespace and comments in extended mode */ + +if ((options & PCRE_EXTENDED) != 0) + { + for (;;) + { + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_space) != 0) ptr++; + if (*ptr == CHAR_NUMBER_SIGN) + { + ptr++; + while (*ptr != 0) + { + if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } + ptr++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(ptr); +#endif + } + } + 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 == CHAR_BACKSLASH) + { + 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 (!MAX_255(*ptr) || (cd->ctypes[*ptr] & ctype_meta) == 0) + { +#ifdef SUPPORT_UTF + if (utf) { GETCHARINC(next, ptr); } else +#endif + next = *ptr++; + } +else return FALSE; + +/* Skip whitespace and comments in extended mode */ + +if ((options & PCRE_EXTENDED) != 0) + { + for (;;) + { + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_space) != 0) ptr++; + if (*ptr == CHAR_NUMBER_SIGN) + { + ptr++; + while (*ptr != 0) + { + if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } + ptr++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(ptr); +#endif + } + } + else break; + } + } + +/* If the next thing is itself optional, we have to give up. */ + +if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || + STRNCMP_UC_C8(ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) + return FALSE; + +/* Now compare the next item with the previous opcode. First, handle cases when +the next item is a character. */ + +if (next >= 0) switch(op_code) + { + case OP_CHAR: +#ifdef SUPPORT_UTF + GETCHARTEST(c, previous); +#else + c = *previous; +#endif + return c != next; + + /* For CHARI (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_CHARI: +#ifdef SUPPORT_UTF + GETCHARTEST(c, previous); +#else + c = *previous; +#endif + if (c == next) return FALSE; +#ifdef SUPPORT_UTF + if (utf) + { + 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)c != othercase; + } + else +#endif /* SUPPORT_UTF */ + return (c != TABLE_GET((unsigned int)next, cd->fcc, next)); /* Non-UTF-8 mode */ + + case OP_NOT: +#ifdef SUPPORT_UTF + GETCHARTEST(c, previous); +#else + c = *previous; +#endif + return c == next; + + case OP_NOTI: +#ifdef SUPPORT_UTF + GETCHARTEST(c, previous); +#else + c = *previous; +#endif + if (c == next) return TRUE; +#ifdef SUPPORT_UTF + if (utf) + { + 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)c == othercase; + } + else +#endif /* SUPPORT_UTF */ + return (c == TABLE_GET((unsigned int)next, cd->fcc, next)); /* Non-UTF-8 mode */ + + /* Note that OP_DIGIT etc. are generated only when PCRE_UCP is *not* set. + When it is set, \d etc. are converted into OP_(NOT_)PROP codes. */ + + case OP_DIGIT: + return next > 255 || (cd->ctypes[next] & ctype_digit) == 0; + + case OP_NOT_DIGIT: + return next <= 255 && (cd->ctypes[next] & ctype_digit) != 0; + + case OP_WHITESPACE: + return next > 255 || (cd->ctypes[next] & ctype_space) == 0; + + case OP_NOT_WHITESPACE: + return next <= 255 && (cd->ctypes[next] & ctype_space) != 0; + + case OP_WORDCHAR: + return next > 255 || (cd->ctypes[next] & ctype_word) == 0; + + case OP_NOT_WORDCHAR: + return next <= 255 && (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_NOT_HSPACE; + default: + return op_code != OP_NOT_HSPACE; + } + + case OP_ANYNL: + 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_NOT_VSPACE; + default: + return op_code != OP_NOT_VSPACE; + } + +#ifdef SUPPORT_UCP + case OP_PROP: + return check_char_prop(next, previous[0], previous[1], FALSE); + + case OP_NOTPROP: + return check_char_prop(next, previous[0], previous[1], TRUE); +#endif + + default: + return FALSE; + } + + +/* Handle the case when the next item is \d, \s, etc. Note that when PCRE_UCP +is set, \d turns into ESC_du rather than ESC_d, etc., so ESC_d etc. are +generated only when PCRE_UCP is *not* set, that is, when only ASCII +characteristics are recognized. Similarly, the opcodes OP_DIGIT etc. are +replaced by OP_PROP codes when PCRE_UCP is set. */ + +switch(op_code) + { + case OP_CHAR: + case OP_CHARI: +#ifdef SUPPORT_UTF + GETCHARTEST(c, previous); +#else + c = *previous; +#endif + switch(-next) + { + case ESC_d: + return c > 255 || (cd->ctypes[c] & ctype_digit) == 0; + + case ESC_D: + return c <= 255 && (cd->ctypes[c] & ctype_digit) != 0; + + case ESC_s: + return c > 255 || (cd->ctypes[c] & ctype_space) == 0; + + case ESC_S: + return c <= 255 && (cd->ctypes[c] & ctype_space) != 0; + + case ESC_w: + return c > 255 || (cd->ctypes[c] & ctype_word) == 0; + + case ESC_W: + return c <= 255 && (cd->ctypes[c] & ctype_word) != 0; + + case ESC_h: + case ESC_H: + switch(c) + { + 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(c) + { + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x85: + case 0x2028: + case 0x2029: + return -next != ESC_v; + default: + return -next == ESC_v; + } + + /* When PCRE_UCP is set, these values get generated for \d etc. Find + their substitutions and process them. The result will always be either + -ESC_p or -ESC_P. Then fall through to process those values. */ + +#ifdef SUPPORT_UCP + case ESC_du: + case ESC_DU: + case ESC_wu: + case ESC_WU: + case ESC_su: + case ESC_SU: + { + int temperrorcode = 0; + ptr = substitutes[-next - ESC_DU]; + next = check_escape(&ptr, &temperrorcode, 0, options, FALSE); + if (temperrorcode != 0) return FALSE; + ptr++; /* For compatibility */ + } + /* Fall through */ + + case ESC_p: + case ESC_P: + { + int ptype, pdata, errorcodeptr; + BOOL negated; + + ptr--; /* Make ptr point at the p or P */ + ptype = get_ucp(&ptr, &negated, &pdata, &errorcodeptr); + if (ptype < 0) return FALSE; + ptr++; /* Point past the final curly ket */ + + /* If the property item is optional, we have to give up. (When generated + from \d etc by PCRE_UCP, this test will have been applied much earlier, + to the original \d etc. At this point, ptr will point to a zero byte. */ + + if (*ptr == CHAR_ASTERISK || *ptr == CHAR_QUESTION_MARK || + STRNCMP_UC_C8(ptr, STR_LEFT_CURLY_BRACKET STR_0 STR_COMMA, 3) == 0) + return FALSE; + + /* Do the property check. */ + + return check_char_prop(c, ptype, pdata, (next == -ESC_P) != negated); + } +#endif + + default: + return FALSE; + } + + /* In principle, support for Unicode properties should be integrated here as + well. It means re-organizing the above code so as to get hold of the property + values before switching on the op-code. However, I wonder how many patterns + combine ASCII \d etc with Unicode properties? (Note that if PCRE_UCP is set, + these op-codes are never generated.) */ + + case OP_DIGIT: + return next == -ESC_D || next == -ESC_s || next == -ESC_W || + next == -ESC_h || next == -ESC_v || next == -ESC_R; + + 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 || next == -ESC_R; + + case OP_HSPACE: + return next == -ESC_S || next == -ESC_H || next == -ESC_d || + next == -ESC_w || next == -ESC_v || next == -ESC_R; + + case OP_NOT_HSPACE: + return next == -ESC_h; + + /* Can't have \S in here because VT matches \S (Perl anomaly) */ + case OP_ANYNL: + case OP_VSPACE: + return next == -ESC_V || next == -ESC_d || next == -ESC_w; + + case OP_NOT_VSPACE: + return next == -ESC_v || next == -ESC_R; + + case OP_WORDCHAR: + return next == -ESC_W || next == -ESC_s || next == -ESC_h || + next == -ESC_v || next == -ESC_R; + + 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 + firstcharptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE) + reqcharptr set to the last literal character required, else < 0 + bcptr points to current branch chain + cond_depth conditional nesting depth + 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, pcre_uchar **codeptr, + const pcre_uchar **ptrptr, int *errorcodeptr, pcre_int32 *firstcharptr, + pcre_int32 *reqcharptr, branch_chain *bcptr, int cond_depth, + 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; +pcre_int32 firstchar, reqchar; +pcre_int32 zeroreqchar, zerofirstchar; +pcre_int32 req_caseopt, reqvary, tempreqvary; +int options = *optionsptr; /* May change dynamically */ +int after_manual_callout = 0; +int length_prevgroup = 0; +register int c; +register pcre_uchar *code = *codeptr; +pcre_uchar *last_code = code; +pcre_uchar *orig_code = code; +pcre_uchar *tempcode; +BOOL inescq = FALSE; +BOOL groupsetfirstchar = FALSE; +const pcre_uchar *ptr = *ptrptr; +const pcre_uchar *tempptr; +const pcre_uchar *nestptr = NULL; +pcre_uchar *previous = NULL; +pcre_uchar *previous_callout = NULL; +pcre_uchar *save_hwm = NULL; +pcre_uint8 classbits[32]; + +/* We can fish out the UTF-8 setting once and for all into a BOOL, but we +must not do this for other options (e.g. PCRE_EXTENDED) because they may change +dynamically as we process the pattern. */ + +#ifdef SUPPORT_UTF +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +pcre_uchar utf_chars[6]; +#else +BOOL utf = FALSE; +#endif + +/* Helper variables for OP_XCLASS opcode (for characters > 255). */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 +BOOL xclass; +pcre_uchar *class_uchardata; +pcre_uchar *class_uchardata_base; +#endif + +#ifdef PCRE_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; reqchar 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 zeroreqchar when such a repeat is encountered. The individual +item types that can be repeated set these backoff variables appropriately. */ + +firstchar = reqchar = zerofirstchar = zeroreqchar = REQ_UNSET; + +/* The variable req_caseopt contains either the REQ_CASELESS value +or zero, according to the current setting of the caseless flag. The +REQ_CASELESS leaves the lower 28 bit empty. It is added into the +firstchar or reqchar 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_has_8bitchar; + int class_single_char; + int newoptions; + int recno; + int refsign; + int skipbytes; + int subreqchar; + int subfirstchar; + int terminator; + int mclength; + int tempbracount; + pcre_uchar mcbuffer[8]; + + /* Get next character in the pattern */ + + c = *ptr; + + /* If we are at the end of a nested substitution, revert to the outer level + string. Nesting only happens one level deep. */ + + if (c == 0 && nestptr != NULL) + { + ptr = nestptr; + nestptr = NULL; + 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 PCRE_DEBUG + if (code > cd->hwm) cd->hwm = code; /* High water info */ +#endif + if (code > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN) /* 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 += (int)(code - last_code); + DPRINTF(("length=%d added %d c=%c (0x%x)\n", *lengthptr, + (int)(code - last_code), c, 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, IN_UCHARS(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 + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN) + { + *errorcodeptr = ERR52; + goto FAILED; + } + + /* If in \Q...\E, check for the end; if not, we have a literal */ + + if (inescq && c != 0) + { + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_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 == CHAR_ASTERISK || c == CHAR_PLUS || c == CHAR_QUESTION_MARK || + (c == CHAR_LEFT_CURLY_BRACKET && 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 (MAX_255(*ptr) && (cd->ctypes[c] & ctype_space) != 0) continue; + if (c == CHAR_NUMBER_SIGN) + { + ptr++; + while (*ptr != 0) + { + if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } + ptr++; +#ifdef SUPPORT_UTF + if (utf) FORWARDCHAR(ptr); +#endif + } + 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 CHAR_VERTICAL_LINE: /* or | or ) */ + case CHAR_RIGHT_PARENTHESIS: + *firstcharptr = firstchar; + *reqcharptr = reqchar; + *codeptr = code; + *ptrptr = ptr; + if (lengthptr != NULL) + { + if (OFLOW_MAX - *lengthptr < code - last_code) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += (int)(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 CHAR_CIRCUMFLEX_ACCENT: + previous = NULL; + if ((options & PCRE_MULTILINE) != 0) + { + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + *code++ = OP_CIRCM; + } + else *code++ = OP_CIRC; + break; + + case CHAR_DOLLAR_SIGN: + previous = NULL; + *code++ = ((options & PCRE_MULTILINE) != 0)? OP_DOLLM : OP_DOLL; + break; + + /* There can never be a first char if '.' is first, whatever happens about + repeats. The value of reqchar doesn't change either. */ + + case CHAR_DOT: + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + zerofirstchar = firstchar; + zeroreqchar = reqchar; + 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 CHAR_RIGHT_SQUARE_BRACKET: + if ((cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *errorcodeptr = ERR64; + goto FAILED; + } + goto NORMAL_CHAR; + + case CHAR_LEFT_SQUARE_BRACKET: + 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] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && + check_posix_syntax(ptr, &tempptr)) + { + *errorcodeptr = (ptr[1] == CHAR_COLON)? 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 == CHAR_BACKSLASH) + { + if (ptr[1] == CHAR_E) + ptr++; + else if (STRNCMP_UC_C8(ptr + 1, STR_Q STR_BACKSLASH STR_E, 3) == 0) + ptr += 3; + else + break; + } + else if (!negate_class && c == CHAR_CIRCUMFLEX_ACCENT) + 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 == CHAR_RIGHT_SQUARE_BRACKET && + (cd->external_options & PCRE_JAVASCRIPT_COMPAT) != 0) + { + *code++ = negate_class? OP_ALLANY : OP_FAIL; + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + zerofirstchar = firstchar; + 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; + + /* For optimization purposes, we track some properties of the class. + class_has_8bitchar will be non-zero, if the class contains at least one + < 256 character. class_single_char will be 1 if the class contains only + a single character. */ + + class_has_8bitchar = 0; + class_single_char = 0; + + /* 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(pcre_uint8)); + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + xclass = FALSE; /* No chars >= 256 */ + class_uchardata = code + LINK_SIZE + 2; /* For UTF-8 items */ + class_uchardata_base = class_uchardata; /* 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 pcre_uchar *oldptr; + +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(c)) + { /* Braces are required because the */ + GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ + } +#endif + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + /* In the pre-compile phase, accumulate the length of any extra + data and reset the pointer. This is so that very large classes that + contain a zillion > 255 characters no longer overwrite the work space + (which is on the stack). */ + + if (lengthptr != NULL) + { + *lengthptr += class_uchardata - class_uchardata_base; + class_uchardata = class_uchardata_base; + } +#endif + + /* Inside \Q...\E everything is literal except \E */ + + if (inescq) + { + if (c == CHAR_BACKSLASH && ptr[1] == CHAR_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 == CHAR_LEFT_SQUARE_BRACKET && + (ptr[1] == CHAR_COLON || ptr[1] == CHAR_DOT || + ptr[1] == CHAR_EQUALS_SIGN) && check_posix_syntax(ptr, &tempptr)) + { + BOOL local_negate = FALSE; + int posix_class, taboffset, tabopt; + register const pcre_uint8 *cbits = cd->cbits; + pcre_uint8 pbits[32]; + + if (ptr[1] != CHAR_COLON) + { + *errorcodeptr = ERR31; + goto FAILED; + } + + ptr += 2; + if (*ptr == CHAR_CIRCUMFLEX_ACCENT) + { + local_negate = TRUE; + should_flip_negation = TRUE; /* Note negative special */ + ptr++; + } + + posix_class = check_posix_name(ptr, (int)(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; + + /* When PCRE_UCP is set, some of the POSIX classes are converted to + different escape sequences that use Unicode properties. */ + +#ifdef SUPPORT_UCP + if ((options & PCRE_UCP) != 0) + { + int pc = posix_class + ((local_negate)? POSIX_SUBSIZE/2 : 0); + if (posix_substitutes[pc] != NULL) + { + nestptr = tempptr + 1; + ptr = posix_substitutes[pc] - 1; + continue; + } + } +#endif + /* In the non-UCP case, 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(pcre_uint8)); + + /* 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; + /* Every class contains at least one < 256 characters. */ + class_has_8bitchar = 1; + /* Every class contains at least two characters. */ + class_single_char = 2; + 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. We + assume that other escapes have more than one character in them, so + speculatively set both class_has_8bitchar and class_single_char bigger + than one. Unrecognized escapes fall through and are either treated + as literal characters (by default), or are faulted if + PCRE_EXTRA is set. */ + + if (c == CHAR_BACKSLASH) + { + c = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; + + if (-c == ESC_b) c = CHAR_BS; /* \b is backspace in a class */ + else if (-c == ESC_N) /* \N is not supported in a class */ + { + *errorcodeptr = ERR71; + goto FAILED; + } + else if (-c == ESC_Q) /* Handle start of quoted string */ + { + if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E) + { + ptr += 2; /* avoid empty string */ + } + else inescq = TRUE; + continue; + } + else if (-c == ESC_E) continue; /* Ignore orphan \E */ + + if (c < 0) + { + register const pcre_uint8 *cbits = cd->cbits; + /* Every class contains at least two < 256 characters. */ + class_has_8bitchar++; + /* Every class contains at least two characters. */ + class_single_char += 2; + + switch (-c) + { +#ifdef SUPPORT_UCP + case ESC_du: /* These are the values given for \d etc */ + case ESC_DU: /* when PCRE_UCP is set. We replace the */ + case ESC_wu: /* escape sequence with an appropriate \p */ + case ESC_WU: /* or \P to test Unicode properties instead */ + case ESC_su: /* of the default ASCII testing. */ + case ESC_SU: + nestptr = ptr; + ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ + class_has_8bitchar--; /* Undo! */ + continue; +#endif + 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; + + /* Perl 5.004 onwards omits VT from \s, but we must preserve it + if it was previously set by something earlier in the character + class. */ + + case ESC_s: + classbits[0] |= cbits[cbit_space]; + classbits[1] |= cbits[cbit_space+1] & ~0x08; + for (c = 2; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; + 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; + + case ESC_h: + SETBIT(classbits, 0x09); /* VT */ + SETBIT(classbits, 0x20); /* SPACE */ + SETBIT(classbits, 0xa0); /* NSBP */ +#ifndef COMPILE_PCRE8 + xclass = TRUE; + *class_uchardata++ = XCL_SINGLE; + *class_uchardata++ = 0x1680; + *class_uchardata++ = XCL_SINGLE; + *class_uchardata++ = 0x180e; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x2000; + *class_uchardata++ = 0x200a; + *class_uchardata++ = XCL_SINGLE; + *class_uchardata++ = 0x202f; + *class_uchardata++ = XCL_SINGLE; + *class_uchardata++ = 0x205f; + *class_uchardata++ = XCL_SINGLE; + *class_uchardata++ = 0x3000; +#elif defined SUPPORT_UTF + if (utf) + { + xclass = TRUE; + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(0x1680, class_uchardata); + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(0x180e, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x2000, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x200a, class_uchardata); + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(0x202f, class_uchardata); + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(0x205f, class_uchardata); + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(0x3000, class_uchardata); + } +#endif + continue; + + case 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; + } +#ifndef COMPILE_PCRE8 + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x0100; + *class_uchardata++ = 0x167f; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x1681; + *class_uchardata++ = 0x180d; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x180f; + *class_uchardata++ = 0x1fff; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x200b; + *class_uchardata++ = 0x202e; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x2030; + *class_uchardata++ = 0x205e; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x2060; + *class_uchardata++ = 0x2fff; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x3001; +#ifdef SUPPORT_UTF + if (utf) + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + else +#endif + *class_uchardata++ = 0xffff; +#elif defined SUPPORT_UTF + if (utf) + { + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x0100, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x167f, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x1681, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x180d, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x180f, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x1fff, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x200b, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x202e, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x2030, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x205e, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x2060, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x2fff, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x3001, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + } +#endif + continue; + + case ESC_v: + SETBIT(classbits, 0x0a); /* LF */ + SETBIT(classbits, 0x0b); /* VT */ + SETBIT(classbits, 0x0c); /* FF */ + SETBIT(classbits, 0x0d); /* CR */ + SETBIT(classbits, 0x85); /* NEL */ +#ifndef COMPILE_PCRE8 + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x2028; + *class_uchardata++ = 0x2029; +#elif defined SUPPORT_UTF + if (utf) + { + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x2028, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x2029, class_uchardata); + } +#endif + continue; + + case 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; + } + +#ifndef COMPILE_PCRE8 + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x0100; + *class_uchardata++ = 0x2027; + *class_uchardata++ = XCL_RANGE; + *class_uchardata++ = 0x202a; +#ifdef SUPPORT_UTF + if (utf) + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + else +#endif + *class_uchardata++ = 0xffff; +#elif defined SUPPORT_UTF + if (utf) + { + xclass = TRUE; + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x0100, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x2027, class_uchardata); + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(0x202a, class_uchardata); + class_uchardata += PRIV(ord2utf)(0x10ffff, class_uchardata); + } +#endif + continue; + +#ifdef SUPPORT_UCP + case ESC_p: + case ESC_P: + { + BOOL negated; + int pdata; + int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr); + if (ptype < 0) goto FAILED; + xclass = TRUE; + *class_uchardata++ = ((-c == ESC_p) != negated)? + XCL_PROP : XCL_NOTPROP; + *class_uchardata++ = ptype; + *class_uchardata++ = pdata; + class_has_8bitchar--; /* Undo! */ + 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. */ + + default: + if ((options & PCRE_EXTRA) != 0) + { + *errorcodeptr = ERR7; + goto FAILED; + } + class_has_8bitchar--; /* Undo the speculative increase. */ + class_single_char -= 2; /* Undo the speculative increase. */ + c = *ptr; /* Get the final character and fall through */ + break; + } + } + + /* Fall through if we have a single character (c >= 0). This may be + greater than 256. */ + + } /* 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] == CHAR_BACKSLASH && ptr[2] == CHAR_E) + { + inescq = FALSE; + ptr += 2; + } + + oldptr = ptr; + + /* Remember \r or \n */ + + if (c == CHAR_CR || c == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF; + + /* Check for range */ + + if (!inescq && ptr[1] == CHAR_MINUS) + { + int d; + ptr += 2; + while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) ptr += 2; + + /* If we hit \Q (not followed by \E) at this point, go into escaped + mode. */ + + while (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_Q) + { + ptr += 2; + if (*ptr == CHAR_BACKSLASH && ptr[1] == CHAR_E) + { ptr += 2; continue; } + inescq = TRUE; + break; + } + + if (*ptr == 0 || (!inescq && *ptr == CHAR_RIGHT_SQUARE_BRACKET)) + { + ptr = oldptr; + goto LONE_SINGLE_CHARACTER; + } + +#ifdef SUPPORT_UTF + if (utf) + { /* 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 == CHAR_BACKSLASH) + { + d = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); + if (*errorcodeptr != 0) goto FAILED; + + /* \b is backspace; any other special means the '-' was literal */ + + if (d < 0) + { + if (d == -ESC_b) d = CHAR_BS; 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 == CHAR_CR || d == CHAR_NL) cd->external_flags |= PCRE_HASCRORLF; + + /* Since we found a character range, single character optimizations + cannot be done anymore. */ + class_single_char = 2; + + /* 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. */ + +#if defined SUPPORT_UTF && !(defined COMPILE_PCRE8) + if ((d > 255) || (utf && ((options & PCRE_CASELESS) != 0 && d > 127))) +#elif defined SUPPORT_UTF + if (utf && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127))) +#elif !(defined COMPILE_PCRE8) + if (d > 255) +#endif +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + { + xclass = 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 +#ifndef COMPILE_PCRE8 + if (utf && (options & PCRE_CASELESS) != 0) +#else + if ((options & PCRE_CASELESS) != 0) +#endif + { + 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_uchardata++ = XCL_SINGLE; + } + else + { + *class_uchardata++ = XCL_RANGE; + class_uchardata += PRIV(ord2utf)(occ, class_uchardata); + } + class_uchardata += PRIV(ord2utf)(ocd, class_uchardata); + } + } +#endif /* SUPPORT_UCP */ + + /* Now record the original range, possibly modified for UCP caseless + overlapping ranges. */ + + *class_uchardata++ = XCL_RANGE; +#ifdef SUPPORT_UTF +#ifndef COMPILE_PCRE8 + if (utf) + { + class_uchardata += PRIV(ord2utf)(c, class_uchardata); + class_uchardata += PRIV(ord2utf)(d, class_uchardata); + } + else + { + *class_uchardata++ = c; + *class_uchardata++ = d; + } +#else + class_uchardata += PRIV(ord2utf)(c, class_uchardata); + class_uchardata += PRIV(ord2utf)(d, class_uchardata); +#endif +#else /* SUPPORT_UTF */ + *class_uchardata++ = c; + *class_uchardata++ = d; +#endif /* SUPPORT_UTF */ + + /* With UCP support, we are done. Without UCP support, there is no + caseless matching for UTF characters > 127; we can use the bit map + for the smaller ones. As for 16 bit characters without UTF, we + can still use */ + +#ifdef SUPPORT_UCP +#ifndef COMPILE_PCRE8 + if (utf) +#endif + continue; /* With next character in the class */ +#endif /* SUPPORT_UCP */ + +#if defined SUPPORT_UTF && !defined(SUPPORT_UCP) && !(defined COMPILE_PCRE8) + if (utf) + { + if ((options & PCRE_CASELESS) == 0 || c > 127) continue; + /* Adjust upper limit and fall through to set up the map */ + d = 127; + } + else + { + if (c > 255) continue; + /* Adjust upper limit and fall through to set up the map */ + d = 255; + } +#elif defined SUPPORT_UTF && !defined(SUPPORT_UCP) + if ((options & PCRE_CASELESS) == 0 || c > 127) continue; + /* Adjust upper limit and fall through to set up the map */ + d = 127; +#else + if (c > 255) continue; + /* Adjust upper limit and fall through to set up the map */ + d = 255; +#endif /* SUPPORT_UTF && !SUPPORT_UCP && !COMPILE_PCRE8 */ + } +#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */ + + /* We use the bit map for 8 bit mode, or when the characters fall + partially or entirely to [0-255] ([0-127] for UCP) ranges. */ + + class_has_8bitchar = 1; + + /* 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: + + /* Only the value of 1 matters for class_single_char. */ + + if (class_single_char < 2) class_single_char++; + + /* If class_charcount is 1, we saw precisely one character. As long as + there was no use of \p or \P, in other words, no use of any XCLASS + features, we can optimize. + + The optimization throws away the bit map. We turn the item into a + 1-character OP_CHAR[I] if it's positive, or OP_NOT[I] if it's negative. + In the positive case, it can cause firstchar to be set. Otherwise, there + can be no first char if this item is first, whatever repeat count may + follow. In the case of reqchar, save the previous value for reinstating. */ + + if (class_single_char == 1 && ptr[1] == CHAR_RIGHT_SQUARE_BRACKET) + { + ptr++; + zeroreqchar = reqchar; + + if (negate_class) + { + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + zerofirstchar = firstchar; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_NOTI: OP_NOT; +#ifdef SUPPORT_UTF + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + code += PRIV(ord2utf)(c, code); + else +#endif + *code++ = c; + goto NOT_CHAR; + } + + /* For a single, positive character, get the value into mcbuffer, and + then we can handle this with the normal one-character code. */ + +#ifdef SUPPORT_UTF + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + mclength = PRIV(ord2utf)(c, mcbuffer); + else +#endif + { + mcbuffer[0] = c; + mclength = 1; + } + goto ONE_CHAR; + } /* End of 1-char optimization */ + + /* Handle a character that cannot go in the bit map. */ + +#if defined SUPPORT_UTF && !(defined COMPILE_PCRE8) + if ((c > 255) || (utf && ((options & PCRE_CASELESS) != 0 && c > 127))) +#elif defined SUPPORT_UTF + if (utf && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127))) +#elif !(defined COMPILE_PCRE8) + if (c > 255) +#endif + +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + { + xclass = TRUE; + *class_uchardata++ = XCL_SINGLE; +#ifdef SUPPORT_UTF +#ifndef COMPILE_PCRE8 + /* In non 8 bit mode, we can get here even if we are not in UTF mode. */ + if (!utf) + *class_uchardata++ = c; + else +#endif + class_uchardata += PRIV(ord2utf)(c, class_uchardata); +#else /* SUPPORT_UTF */ + *class_uchardata++ = c; +#endif /* SUPPORT_UTF */ + +#ifdef SUPPORT_UCP +#ifdef COMPILE_PCRE8 + if ((options & PCRE_CASELESS) != 0) +#else + /* In non 8 bit mode, we can get here even if we are not in UTF mode. */ + if (utf && (options & PCRE_CASELESS) != 0) +#endif + { + unsigned int othercase; + if ((int)(othercase = UCD_OTHERCASE(c)) != c) + { + *class_uchardata++ = XCL_SINGLE; + class_uchardata += PRIV(ord2utf)(othercase, class_uchardata); + } + } +#endif /* SUPPORT_UCP */ + + } + else +#endif /* SUPPORT_UTF || COMPILE_PCRE16 */ + + /* Handle a single-byte character */ + { + class_has_8bitchar = 1; + classbits[c/8] |= (1 << (c&7)); + if ((options & PCRE_CASELESS) != 0) + { + c = cd->fcc[c]; /* flip case */ + classbits[c/8] |= (1 << (c&7)); + } + } + } + + /* Loop until ']' reached. This "while" is the end of the "do" far above. + If we are at the end of an internal nested string, revert to the outer + string. */ + + while (((c = *(++ptr)) != 0 || + (nestptr != NULL && + (ptr = nestptr, nestptr = NULL, c = *(++ptr)) != 0)) && + (c != CHAR_RIGHT_SQUARE_BRACKET || inescq)); + + /* Check for missing terminating ']' */ + + if (c == 0) + { + *errorcodeptr = ERR6; + goto FAILED; + } + + /* If this is the first thing in the branch, there can be no first char + setting, whatever the repeat count. Any reqchar setting must remain + unchanged after any kind of repeat. */ + + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + zerofirstchar = firstchar; + zeroreqchar = reqchar; + + /* 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, and PCRE_UCP is not set, 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_UTF + if (xclass && (!should_flip_negation || (options & PCRE_UCP) != 0)) +#elif !defined COMPILE_PCRE8 + if (xclass && !should_flip_negation) +#endif +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + { + *class_uchardata++ = 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_has_8bitchar > 0) + { + *code++ |= XCL_MAP; + memmove(code + (32 / sizeof(pcre_uchar)), code, + IN_UCHARS(class_uchardata - code)); + memcpy(code, classbits, 32); + code = class_uchardata + (32 / sizeof(pcre_uchar)); + } + else code = class_uchardata; + + /* Now fill in the complete length of the item */ + + PUT(previous, 1, (int)(code - previous)); + break; /* End of class handling */ + } +#endif + + /* If there are no characters > 255, or they are all to be included or + excluded, 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 + (non-UCP) 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 (lengthptr == NULL) /* Save time in the pre-compile phase */ + { + if (negate_class) + for (c = 0; c < 32; c++) classbits[c] = ~classbits[c]; + memcpy(code, classbits, 32); + } + code += 32 / sizeof(pcre_uchar); + NOT_CHAR: + break; + + + /* ===================================================================*/ + /* Various kinds of repeat; '{' is not necessarily a quantifier, but this + has been tested above. */ + + case CHAR_LEFT_CURLY_BRACKET: + 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 CHAR_ASTERISK: + repeat_min = 0; + repeat_max = -1; + goto REPEAT; + + case CHAR_PLUS: + repeat_min = 1; + repeat_max = -1; + goto REPEAT; + + case CHAR_QUESTION_MARK: + repeat_min = 0; + repeat_max = 1; + + REPEAT: + if (previous == NULL) + { + *errorcodeptr = ERR9; + goto FAILED; + } + + if (repeat_min == 0) + { + firstchar = zerofirstchar; /* Adjust for zero repeat */ + reqchar = zeroreqchar; /* 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 in order to + insert something before it. */ + + 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] == CHAR_PLUS) + { + repeat_type = 0; /* Force greedy */ + possessive_quantifier = TRUE; + ptr++; + } + else if (ptr[1] == CHAR_QUESTION_MARK) + { + repeat_type = greedy_non_default; + ptr++; + } + else repeat_type = greedy_default; + + /* If previous was a recursion call, wrap it in atomic brackets so that + previous becomes the atomic group. All recursions were so wrapped in the + past, but it no longer happens for non-repeated recursions. In fact, the + repeated ones could be re-implemented independently so as not to need this, + but for the moment we rely on the code for repeating groups. */ + + if (*previous == OP_RECURSE) + { + memmove(previous + 1 + LINK_SIZE, previous, IN_UCHARS(1 + LINK_SIZE)); + *previous = OP_ONCE; + PUT(previous, 1, 2 + 2*LINK_SIZE); + previous[2 + 2*LINK_SIZE] = OP_KET; + PUT(previous, 3 + 2*LINK_SIZE, 2 + 2*LINK_SIZE); + code += 2 + 2 * LINK_SIZE; + length_prevgroup = 3 + 3*LINK_SIZE; + + /* When actually compiling, we need to check whether this was a forward + reference, and if so, adjust the offset. */ + + if (lengthptr == NULL && cd->hwm >= cd->start_workspace + LINK_SIZE) + { + int offset = GET(cd->hwm, -LINK_SIZE); + if (offset == previous + 1 - cd->start_code) + PUT(cd->hwm, -LINK_SIZE, offset + 1 + LINK_SIZE); + } + } + + /* Now handle repetition for the different types of item. */ + + /* If previous was a character or negated character match, abolish the item + and generate a repeat item instead. If a char item has a minimum of more + than one, ensure that it is set in reqchar - 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 firstchar instead. */ + + if (*previous == OP_CHAR || *previous == OP_CHARI + || *previous == OP_NOT || *previous == OP_NOTI) + { + switch (*previous) + { + default: /* Make compiler happy. */ + case OP_CHAR: op_type = OP_STAR - OP_STAR; break; + case OP_CHARI: op_type = OP_STARI - OP_STAR; break; + case OP_NOT: op_type = OP_NOTSTAR - OP_STAR; break; + case OP_NOTI: op_type = OP_NOTSTARI - OP_STAR; break; + } + + /* Deal with UTF characters that take up more than one character. 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 UTF_LENGTH to flag that + it's a length rather than a small character. */ + +#ifdef SUPPORT_UTF + if (utf && NOT_FIRSTCHAR(code[-1])) + { + pcre_uchar *lastchar = code - 1; + BACKCHAR(lastchar); + c = (int)(code - lastchar); /* Length of UTF-8 character */ + memcpy(utf_chars, lastchar, IN_UCHARS(c)); /* Save the char */ + c |= UTF_LENGTH; /* Flag c as a length */ + } + else +#endif /* SUPPORT_UTF */ + + /* Handle the case of a single charater - either with no UTF support, or + with UTF disabled, or for a single character UTF character. */ + { + c = code[-1]; + if (*previous <= OP_CHARI && repeat_min > 1) + reqchar = 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, utf, 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 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) + { + pcre_uchar *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(previous, utf, 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; + + /*--------------------------------------------------------------------*/ + /* This code is obsolete from release 8.00; the restriction was finally + removed: */ + + /* 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 UTF_LENGTH bit as a flag. */ + + if (repeat_max < 0) + { +#ifdef SUPPORT_UTF + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(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_UTF + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(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_UTF + if (utf && (c & UTF_LENGTH) != 0) + { + memcpy(code, utf_chars, IN_UCHARS(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 || +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + *previous == OP_XCLASS || +#endif + *previous == OP_REF || + *previous == OP_REFI) + { + if (repeat_max == 0) + { + code = previous; + goto END_REPEAT; + } + + /*--------------------------------------------------------------------*/ + /* This code is obsolete from release 8.00; the restriction was finally + removed: */ + + /* 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. Note that at this point we can encounter only the "basic" bracket + opcodes such as BRA and CBRA, as this is the place where they get converted + into the more special varieties such as BRAPOS and SBRA. A test for >= + OP_ASSERT and <= OP_COND includes ASSERT, ASSERT_NOT, ASSERTBACK, + ASSERTBACK_NOT, ONCE, BRA, CBRA, and COND. Originally, PCRE did not allow + repetition of assertions, but now it does, for Perl compatibility. */ + + else if (*previous >= OP_ASSERT && *previous <= OP_COND) + { + register int i; + int len = (int)(code - previous); + pcre_uchar *bralink = NULL; + pcre_uchar *brazeroptr = NULL; + + /* Repeating a DEFINE group is pointless, but Perl allows the syntax, so + we just ignore the repeat. */ + + if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF) + goto END_REPEAT; + + /* There is no sense in actually repeating assertions. The only potential + use of repetition is in cases when the assertion is optional. Therefore, + if the minimum is greater than zero, just ignore the repeat. If the + maximum is not not zero or one, set it to 1. */ + + if (*previous < OP_ONCE) /* Assertion */ + { + if (repeat_min > 0) goto END_REPEAT; + if (repeat_max < 0 || repeat_max > 1) repeat_max = 1; + } + + /* 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 or a subgroup within it 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, utf, cd, save_hwm); + memmove(previous + 1, previous, IN_UCHARS(len)); + code++; + if (repeat_max == 0) + { + *previous++ = OP_SKIPZERO; + goto END_REPEAT; + } + brazeroptr = previous; /* Save for possessive optimizing */ + *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, utf, cd, save_hwm); + memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(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 : (int)(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. The INT64_OR_DOUBLE type is a 64-bit + integer type when available, otherwise double. */ + + if (lengthptr != NULL) + { + int delta = (repeat_min - 1)*length_prevgroup; + if ((INT64_OR_DOUBLE)(repeat_min - 1)* + (INT64_OR_DOUBLE)length_prevgroup > + (INT64_OR_DOUBLE)INT_MAX || + OFLOW_MAX - *lengthptr < delta) + { + *errorcodeptr = ERR20; + goto FAILED; + } + *lengthptr += delta; + } + + /* This is compiling for real. If there is a set first byte for + the group, and we have not yet set a "required byte", set it. Make + sure there is enough workspace for copying forward references before + doing the copy. */ + + else + { + if (groupsetfirstchar && reqchar < 0) reqchar = firstchar; + + for (i = 1; i < repeat_min; i++) + { + pcre_uchar *hc; + pcre_uchar *this_hwm = cd->hwm; + memcpy(code, previous, IN_UCHARS(len)); + + while (cd->hwm > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN - (this_hwm - save_hwm)) + { + int save_offset = save_hwm - cd->start_workspace; + int this_offset = this_hwm - cd->start_workspace; + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + save_hwm = (pcre_uchar *)cd->start_workspace + save_offset; + this_hwm = (pcre_uchar *)cd->start_workspace + this_offset; + } + + 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. The INT64_OR_DOUBLE type is + a 64-bit integer type when available, otherwise double. */ + + 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 ((INT64_OR_DOUBLE)repeat_max * + (INT64_OR_DOUBLE)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) + > (INT64_OR_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--) + { + pcre_uchar *hc; + pcre_uchar *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 : (int)(code - bralink); + bralink = code; + PUTINC(code, 0, offset); + } + + memcpy(code, previous, IN_UCHARS(len)); + + /* Ensure there is enough workspace for forward references before + copying them. */ + + while (cd->hwm > cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN - (this_hwm - save_hwm)) + { + int save_offset = save_hwm - cd->start_workspace; + int this_offset = this_hwm - cd->start_workspace; + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + save_hwm = (pcre_uchar *)cd->start_workspace + save_offset; + this_hwm = (pcre_uchar *)cd->start_workspace + this_offset; + } + + 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 = (int)(code - bralink + 1); + pcre_uchar *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. For + ONCE brackets, that's all we need to do. However, possessively repeated + ONCE brackets can be converted into non-capturing brackets, as the + behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to + deal with possessive ONCEs specially. + + Otherwise, when we are doing the actual compile phase, check to see + whether this group is 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 ONCE + groups at runtime, but in a different way.] + + Then, if the quantifier was possessive and the bracket is not a + conditional, we convert the BRA code to the POS form, and the KET code to + KETRPOS. (It turns out to be convenient at runtime to detect this kind of + subpattern at both the start and at the end.) The use of special opcodes + makes it possible to reduce greatly the stack usage in pcre_exec(). If + the group is preceded by OP_BRAZERO, convert this to OP_BRAPOSZERO. + + Then, if the minimum number of matches is 1 or 0, cancel the possessive + flag so that the default action below, of wrapping everything inside + atomic brackets, does not happen. When the minimum is greater than 1, + there will be earlier copies of the group, and so we still have to wrap + the whole thing. */ + + else + { + pcre_uchar *ketcode = code - 1 - LINK_SIZE; + pcre_uchar *bracode = ketcode - GET(ketcode, 1); + + /* Convert possessive ONCE brackets to non-capturing */ + + if ((*bracode == OP_ONCE || *bracode == OP_ONCE_NC) && + possessive_quantifier) *bracode = OP_BRA; + + /* For non-possessive ONCE brackets, all we need to do is to + set the KET. */ + + if (*bracode == OP_ONCE || *bracode == OP_ONCE_NC) + *ketcode = OP_KETRMAX + repeat_type; + + /* Handle non-ONCE brackets and possessive ONCEs (which have been + converted to non-capturing above). */ + + else + { + /* In the compile phase, check for empty string matching. */ + + if (lengthptr == NULL) + { + pcre_uchar *scode = bracode; + do + { + if (could_be_empty_branch(scode, ketcode, utf, cd)) + { + *bracode += OP_SBRA - OP_BRA; + break; + } + scode += GET(scode, 1); + } + while (*scode == OP_ALT); + } + + /* Handle possessive quantifiers. */ + + if (possessive_quantifier) + { + /* For COND brackets, we wrap the whole thing in a possessively + repeated non-capturing bracket, because we have not invented POS + versions of the COND opcodes. Because we are moving code along, we + must ensure that any pending recursive references are updated. */ + + if (*bracode == OP_COND || *bracode == OP_SCOND) + { + int nlen = (int)(code - bracode); + *code = OP_END; + adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, save_hwm); + memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen)); + code += 1 + LINK_SIZE; + nlen += 1 + LINK_SIZE; + *bracode = OP_BRAPOS; + *code++ = OP_KETRPOS; + PUTINC(code, 0, nlen); + PUT(bracode, 1, nlen); + } + + /* For non-COND brackets, we modify the BRA code and use KETRPOS. */ + + else + { + *bracode += 1; /* Switch to xxxPOS opcodes */ + *ketcode = OP_KETRPOS; + } + + /* If the minimum is zero, mark it as possessive, then unset the + possessive flag when the minimum is 0 or 1. */ + + if (brazeroptr != NULL) *brazeroptr = OP_BRAPOSZERO; + if (repeat_min < 2) possessive_quantifier = FALSE; + } + + /* Non-possessive quantifier */ + + else *ketcode = OP_KETRMAX + repeat_type; + } + } + } + + /* 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 opcodes, + there are special alternative opcodes for this case. For anything else, we + wrap the entire repeated item inside OP_ONCE brackets. Logically, the '+' + notation is just syntactic sugar, taken from Sun's Java package, but the + special opcodes can optimize it. + + Some (but not all) possessively repeated subpatterns have already been + completely handled in the code just above. For them, possessive_quantifier + is always FALSE at this stage. + + Note that 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_TYPEEXACT) + tempcode += PRIV(OP_lengths)[*tempcode] + + ((tempcode[1 + IMM2_SIZE] == OP_PROP + || tempcode[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0); + + else if (*tempcode == OP_EXACT || *tempcode == OP_NOTEXACT) + { + tempcode += PRIV(OP_lengths)[*tempcode]; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(tempcode[-1])) + tempcode += GET_EXTRALEN(tempcode[-1]); +#endif + } + + len = (int)(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_STARI: *tempcode = OP_POSSTARI; break; + case OP_PLUSI: *tempcode = OP_POSPLUSI; break; + case OP_QUERYI: *tempcode = OP_POSQUERYI; break; + case OP_UPTOI: *tempcode = OP_POSUPTOI; 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; + + case OP_NOTSTARI: *tempcode = OP_NOTPOSSTARI; break; + case OP_NOTPLUSI: *tempcode = OP_NOTPOSPLUSI; break; + case OP_NOTQUERYI: *tempcode = OP_NOTPOSQUERYI; break; + case OP_NOTUPTOI: *tempcode = OP_NOTPOSUPTOI; 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; + + /* Because we are moving code along, we must ensure that any + pending recursive references are updated. */ + + default: + *code = OP_END; + adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm); + memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(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 reqchars 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 CHAR_LEFT_PARENTHESIS: + newoptions = options; + skipbytes = 0; + bravalue = OP_CBRA; + save_hwm = cd->hwm; + reset_bracount = FALSE; + + /* First deal with various "verbs" that can be introduced by '*'. */ + + ptr++; + if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':' + || (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0)))) + { + int i, namelen; + int arglen = 0; + const char *vn = verbnames; + const pcre_uchar *name = ptr + 1; + const pcre_uchar *arg = NULL; + previous = NULL; + ptr++; + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; + namelen = (int)(ptr - name); + + /* It appears that Perl allows any characters whatsoever, other than + a closing parenthesis, to appear in arguments, so we no longer insist on + letters, digits, and underscores. */ + + if (*ptr == CHAR_COLON) + { + arg = ++ptr; + while (*ptr != 0 && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + arglen = (int)(ptr - arg); + if (arglen > (int)MAX_MARK) + { + *errorcodeptr = ERR75; + goto FAILED; + } + } + + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR60; + goto FAILED; + } + + /* Scan the table of verb names */ + + for (i = 0; i < verbcount; i++) + { + if (namelen == verbs[i].len && + STRNCMP_UC_C8(name, vn, namelen) == 0) + { + /* Check for open captures before ACCEPT and convert it to + ASSERT_ACCEPT if in an assertion. */ + + if (verbs[i].op == OP_ACCEPT) + { + open_capitem *oc; + if (arglen != 0) + { + *errorcodeptr = ERR59; + goto FAILED; + } + cd->had_accept = TRUE; + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + *code++ = OP_CLOSE; + PUT2INC(code, 0, oc->number); + } + *code++ = (cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT; + + /* Do not set firstchar after *ACCEPT */ + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + } + + /* Handle other cases with/without an argument */ + + else if (arglen == 0) + { + if (verbs[i].op < 0) /* Argument is mandatory */ + { + *errorcodeptr = ERR66; + goto FAILED; + } + *code = verbs[i].op; + if (*code++ == OP_THEN) cd->external_flags |= PCRE_HASTHEN; + } + + else + { + if (verbs[i].op_arg < 0) /* Argument is forbidden */ + { + *errorcodeptr = ERR59; + goto FAILED; + } + *code = verbs[i].op_arg; + if (*code++ == OP_THEN_ARG) cd->external_flags |= PCRE_HASTHEN; + *code++ = arglen; + memcpy(code, arg, IN_UCHARS(arglen)); + code += arglen; + *code++ = 0; + } + + break; /* Found verb, exit loop */ + } + + vn += verbs[i].len + 1; + } + + if (i < verbcount) continue; /* Successfully handled a verb */ + *errorcodeptr = ERR60; /* Verb not recognized */ + 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 == CHAR_QUESTION_MARK) + { + int i, set, unset, namelen; + int *optset; + const pcre_uchar *name; + pcre_uchar *slot; + + switch (*(++ptr)) + { + case CHAR_NUMBER_SIGN: /* Comment; skip to ket */ + ptr++; + while (*ptr != 0 && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++; + if (*ptr == 0) + { + *errorcodeptr = ERR18; + goto FAILED; + } + continue; + + + /* ------------------------------------------------------------ */ + case CHAR_VERTICAL_LINE: /* Reset capture count for each branch */ + reset_bracount = TRUE; + /* Fall through */ + + /* ------------------------------------------------------------ */ + case CHAR_COLON: /* Non-capturing bracket */ + bravalue = OP_BRA; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_LEFT_PARENTHESIS: + 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] == CHAR_QUESTION_MARK && (ptr[2] == CHAR_EQUALS_SIGN || + ptr[2] == CHAR_EXCLAMATION_MARK || ptr[2] == CHAR_LESS_THAN_SIGN)) + break; + + /* Most other conditions use OP_CREF (a couple change to OP_RREF + below), and all need to skip 1+IMM2_SIZE bytes at the start of the group. */ + + code[1+LINK_SIZE] = OP_CREF; + skipbytes = 1+IMM2_SIZE; + refsign = -1; + + /* Check for a test for recursion in a named group. */ + + if (ptr[1] == CHAR_R && ptr[2] == CHAR_AMPERSAND) + { + 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] == CHAR_LESS_THAN_SIGN) + { + terminator = CHAR_GREATER_THAN_SIGN; + ptr++; + } + else if (ptr[1] == CHAR_APOSTROPHE) + { + terminator = CHAR_APOSTROPHE; + ptr++; + } + else + { + terminator = 0; + if (ptr[1] == CHAR_MINUS || ptr[1] == CHAR_PLUS) refsign = *(++ptr); + } + + /* We now expect to read a name; any thing else is an error */ + + if (!MAX_255(ptr[1]) || (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 (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) + { + if (recno >= 0) + recno = (IS_DIGIT(*ptr))? recno * 10 + *ptr - CHAR_0 : -1; + ptr++; + } + namelen = (int)(ptr - name); + + if ((terminator > 0 && *ptr++ != terminator) || + *ptr++ != CHAR_RIGHT_PARENTHESIS) + { + 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 == CHAR_MINUS)? + 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. If we find a name, add one to the opcode to change OP_CREF or + OP_RREF into OP_NCREF or OP_NRREF. These behave exactly the same, + except they record that the reference was originally to a name. The + information is used to check duplicate names. */ + + slot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (STRNCMP_UC_UC(name, slot+IMM2_SIZE, 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); + code[1+LINK_SIZE]++; + } + + /* Search the pattern for a forward reference */ + + else if ((i = find_parens(cd, name, namelen, + (options & PCRE_EXTENDED) != 0, utf)) > 0) + { + PUT2(code, 2+LINK_SIZE, i); + code[1+LINK_SIZE]++; + } + + /* 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 == CHAR_R) + { + recno = 0; + for (i = 1; i < namelen; i++) + { + if (!IS_DIGIT(name[i])) + { + *errorcodeptr = ERR15; + goto FAILED; + } + recno = recno * 10 + name[i] - CHAR_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_UC_C8(name, STRING_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 CHAR_EQUALS_SIGN: /* Positive lookahead */ + bravalue = OP_ASSERT; + cd->assert_depth += 1; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_EXCLAMATION_MARK: /* Negative lookahead */ + ptr++; + if (*ptr == CHAR_RIGHT_PARENTHESIS) /* Optimize (?!) */ + { + *code++ = OP_FAIL; + previous = NULL; + continue; + } + bravalue = OP_ASSERT_NOT; + cd->assert_depth += 1; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_LESS_THAN_SIGN: /* Lookbehind or named define */ + switch (ptr[1]) + { + case CHAR_EQUALS_SIGN: /* Positive lookbehind */ + bravalue = OP_ASSERTBACK; + cd->assert_depth += 1; + ptr += 2; + break; + + case CHAR_EXCLAMATION_MARK: /* Negative lookbehind */ + bravalue = OP_ASSERTBACK_NOT; + cd->assert_depth += 1; + ptr += 2; + break; + + default: /* Could be name define, else bad */ + if (MAX_255(ptr[1]) && (cd->ctypes[ptr[1]] & ctype_word) != 0) + goto DEFINE_NAME; + ptr++; /* Correct offset for error */ + *errorcodeptr = ERR24; + goto FAILED; + } + break; + + + /* ------------------------------------------------------------ */ + case CHAR_GREATER_THAN_SIGN: /* One-time brackets */ + bravalue = OP_ONCE; + ptr++; + break; + + + /* ------------------------------------------------------------ */ + case CHAR_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; + ptr++; + while(IS_DIGIT(*ptr)) + n = n * 10 + *ptr++ - CHAR_0; + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *errorcodeptr = ERR39; + goto FAILED; + } + if (n > 255) + { + *errorcodeptr = ERR38; + goto FAILED; + } + *code++ = n; + PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */ + PUT(code, LINK_SIZE, 0); /* Default length */ + code += 2 * LINK_SIZE; + } + previous = NULL; + continue; + + + /* ------------------------------------------------------------ */ + case CHAR_P: /* Python-style named subpattern handling */ + if (*(++ptr) == CHAR_EQUALS_SIGN || + *ptr == CHAR_GREATER_THAN_SIGN) /* Reference or recursion */ + { + is_recurse = *ptr == CHAR_GREATER_THAN_SIGN; + terminator = CHAR_RIGHT_PARENTHESIS; + goto NAMED_REF_OR_RECURSE; + } + else if (*ptr != CHAR_LESS_THAN_SIGN) /* Test for Python-style defn */ + { + *errorcodeptr = ERR41; + goto FAILED; + } + /* Fall through to handle (?P< as (?< is handled */ + + + /* ------------------------------------------------------------ */ + DEFINE_NAME: /* Come here from (?< handling */ + case CHAR_APOSTROPHE: + { + terminator = (*ptr == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; + name = ++ptr; + + while (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = (int)(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 + IMM2_SIZE + 1 > cd->name_entry_size) + { + cd->name_entry_size = namelen + IMM2_SIZE + 1; + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + } + } + + /* In the real compile, create the entry in the table, maintaining + alphabetical order. Duplicate names for different numbers are + permitted only if PCRE_DUPNAMES is set. Duplicate names for the same + number are always OK. (An existing number can be re-used if (?| + appears in the pattern.) In either event, a duplicate name results in + a duplicate entry in the table, even if the number is the same. This + is because the number of names, and hence the table size, is computed + in the pre-compile, and it affects various numbers and pointers which + would all have to be modified, and the compiled code moved down, if + duplicates with the same number were omitted from the table. This + doesn't seem worth the hassle. However, *different* names for the + same number are not permitted. */ + + else + { + BOOL dupname = FALSE; + slot = cd->name_table; + + for (i = 0; i < cd->names_found; i++) + { + int crc = memcmp(name, slot+IMM2_SIZE, IN_UCHARS(namelen)); + if (crc == 0) + { + if (slot[IMM2_SIZE+namelen] == 0) + { + if (GET2(slot, 0) != cd->bracount + 1 && + (options & PCRE_DUPNAMES) == 0) + { + *errorcodeptr = ERR43; + goto FAILED; + } + else dupname = TRUE; + } + else crc = -1; /* Current name is a substring */ + } + + /* Make space in the table and break the loop for an earlier + name. For a duplicate or later name, carry on. We do this for + duplicates so that in the simple case (when ?(| is not used) they + are in order of their numbers. */ + + if (crc < 0) + { + memmove(slot + cd->name_entry_size, slot, + IN_UCHARS((cd->names_found - i) * cd->name_entry_size)); + break; + } + + /* Continue the loop for a later or duplicate name */ + + slot += cd->name_entry_size; + } + + /* For non-duplicate names, check for a duplicate number before + adding the new name. */ + + if (!dupname) + { + pcre_uchar *cslot = cd->name_table; + for (i = 0; i < cd->names_found; i++) + { + if (cslot != slot) + { + if (GET2(cslot, 0) == cd->bracount + 1) + { + *errorcodeptr = ERR65; + goto FAILED; + } + } + else i--; + cslot += cd->name_entry_size; + } + } + + PUT2(slot, 0, cd->bracount + 1); + memcpy(slot + IMM2_SIZE, name, IN_UCHARS(namelen)); + slot[IMM2_SIZE + namelen] = 0; + } + } + + /* In both pre-compile and compile, count the number of names we've + encountered. */ + + cd->names_found++; + ptr++; /* Move past > or ' */ + goto NUMBERED_GROUP; + + + /* ------------------------------------------------------------ */ + case CHAR_AMPERSAND: /* Perl recursion/subroutine syntax */ + terminator = CHAR_RIGHT_PARENTHESIS; + 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 (MAX_255(*ptr) && (cd->ctypes[*ptr] & ctype_word) != 0) ptr++; + namelen = (int)(ptr - name); + + /* In the pre-compile phase, do a syntax check. We used to just set + a dummy reference number, because it was not used in the first pass. + However, with the change of recursive back references to be atomic, + we have to look for the number so that this state can be identified, as + otherwise the incorrect length is computed. If it's not a backwards + reference, the dummy number will do. */ + + if (lengthptr != NULL) + { + const pcre_uchar *temp; + + if (namelen == 0) + { + *errorcodeptr = ERR62; + goto FAILED; + } + if (*ptr != terminator) + { + *errorcodeptr = ERR42; + goto FAILED; + } + if (namelen > MAX_NAME_SIZE) + { + *errorcodeptr = ERR48; + goto FAILED; + } + + /* The name table does not exist in the first pass, so we cannot + do a simple search as in the code below. Instead, we have to scan the + pattern to find the number. It is important that we scan it only as + far as we have got because the syntax of named subpatterns has not + been checked for the rest of the pattern, and find_parens() assumes + correct syntax. In any case, it's a waste of resources to scan + further. We stop the scan at the current point by temporarily + adjusting the value of cd->endpattern. */ + + temp = cd->end_pattern; + cd->end_pattern = ptr; + recno = find_parens(cd, name, namelen, + (options & PCRE_EXTENDED) != 0, utf); + cd->end_pattern = temp; + if (recno < 0) recno = 0; /* Forward ref; set dummy number */ + } + + /* 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_UC_UC(name, slot+IMM2_SIZE, namelen) == 0 && + slot[IMM2_SIZE+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(cd, name, namelen, + (options & PCRE_EXTENDED) != 0, utf)) <= 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 CHAR_R: /* Recursion */ + ptr++; /* Same as (?0) */ + /* Fall through */ + + + /* ------------------------------------------------------------ */ + case CHAR_MINUS: case CHAR_PLUS: /* Recursion or subroutine */ + case CHAR_0: case CHAR_1: case CHAR_2: case CHAR_3: case CHAR_4: + case CHAR_5: case CHAR_6: case CHAR_7: case CHAR_8: case CHAR_9: + { + const pcre_uchar *called; + terminator = CHAR_RIGHT_PARENTHESIS; + + /* 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) == CHAR_PLUS) + { + ptr++; + if (!IS_DIGIT(*ptr)) + { + *errorcodeptr = ERR63; + goto FAILED; + } + } + else if (refsign == CHAR_MINUS) + { + if (!IS_DIGIT(ptr[1])) + goto OTHER_CHAR_AFTER_QUERY; + ptr++; + } + + recno = 0; + while(IS_DIGIT(*ptr)) + recno = recno * 10 + *ptr++ - CHAR_0; + + if (*ptr != terminator) + { + *errorcodeptr = ERR29; + goto FAILED; + } + + if (refsign == CHAR_MINUS) + { + if (recno == 0) + { + *errorcodeptr = ERR58; + goto FAILED; + } + recno = cd->bracount - recno + 1; + if (recno <= 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + } + else if (refsign == CHAR_PLUS) + { + 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 = PRIV(find_bracket)(cd->start_code, utf, recno); + + /* Forward reference */ + + if (called == NULL) + { + if (find_parens(cd, NULL, recno, + (options & PCRE_EXTENDED) != 0, utf) < 0) + { + *errorcodeptr = ERR15; + goto FAILED; + } + + /* Fudge the value of "called" so that when it is inserted as an + offset below, what it actually inserted is the reference number + of the group. Then remember the forward reference. */ + + called = cd->start_code + recno; + if (cd->hwm >= cd->start_workspace + cd->workspace_size - + WORK_SIZE_SAFETY_MARGIN) + { + *errorcodeptr = expand_workspace(cd); + if (*errorcodeptr != 0) goto FAILED; + } + PUTINC(cd->hwm, 0, (int)(code + 1 - 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. We + must not, however, do this check if we are in a conditional + subpattern because the condition might be testing for recursion in + a pattern such as /(?(R)a+|(?R)b)/, which is perfectly valid. + Forever loops are also detected at runtime, so those that occur in + conditional subpatterns will be picked up then. */ + + else if (GET(called, 1) == 0 && cond_depth <= 0 && + could_be_empty(called, code, bcptr, utf, cd)) + { + *errorcodeptr = ERR40; + goto FAILED; + } + } + + /* Insert the recursion/subroutine item. It does not have a set first + character (relevant if it is repeated, because it will then be + wrapped with ONCE brackets). */ + + *code = OP_RECURSE; + PUT(code, 1, (int)(called - cd->start_code)); + code += 1 + LINK_SIZE; + groupsetfirstchar = FALSE; + } + + /* Can't determine a first byte now */ + + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + continue; + + + /* ------------------------------------------------------------ */ + default: /* Other characters: check option setting */ + OTHER_CHAR_AFTER_QUERY: + set = unset = 0; + optset = &set; + + while (*ptr != CHAR_RIGHT_PARENTHESIS && *ptr != CHAR_COLON) + { + switch (*ptr++) + { + case CHAR_MINUS: optset = &unset; break; + + case CHAR_J: /* Record that it changed in the external options */ + *optset |= PCRE_DUPNAMES; + cd->external_flags |= PCRE_JCHANGED; + break; + + case CHAR_i: *optset |= PCRE_CASELESS; break; + case CHAR_m: *optset |= PCRE_MULTILINE; break; + case CHAR_s: *optset |= PCRE_DOTALL; break; + case CHAR_x: *optset |= PCRE_EXTENDED; break; + case CHAR_U: *optset |= PCRE_UNGREEDY; break; + case CHAR_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, reset the greedy defaults and the + case value for firstchar and reqchar. */ + + if (*ptr == CHAR_RIGHT_PARENTHESIS) + { + if (code == cd->start_code + 1 + LINK_SIZE && + (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE)) + { + cd->external_options = newoptions; + } + else + { + 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. */ + + *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 '*' or '?'. 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 = IMM2_SIZE; + } + + /* Process nested bracketed regex. Assertions used not to be repeatable, + but this was changed for Perl compatibility, so all kinds can now be + repeated. We copy code into a non-register variable (tempcode) in order to + be able to pass its address because some compilers complain otherwise. */ + + previous = code; /* For handling repetition */ + *code = bravalue; + tempcode = code; + tempreqvary = cd->req_varyopt; /* Save value before bracket */ + tempbracount = cd->bracount; /* Save value before bracket */ + length_prevgroup = 0; /* Initialize for pre-compile phase */ + + if (!compile_regex( + newoptions, /* The complete new 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 */ + cond_depth + + ((bravalue == OP_COND)?1:0), /* Depth of condition subpatterns */ + &subfirstchar, /* For possible first char */ + &subreqchar, /* For possible last char */ + bcptr, /* Current branch chain */ + cd, /* Tables block */ + (lengthptr == NULL)? NULL : /* Actual compile phase */ + &length_prevgroup /* Pre-compile phase */ + )) + goto FAILED; + + /* If this was an atomic group and there are no capturing groups within it, + generate OP_ONCE_NC instead of OP_ONCE. */ + + if (bravalue == OP_ONCE && cd->bracount <= tempbracount) + *code = OP_ONCE_NC; + + if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT) + cd->assert_depth -= 1; + + /* 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. + 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) + { + pcre_uchar *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 firstchar or reqchar, because this is equivalent to an + empty second branch. */ + + else + { + if (condcount > 2) + { + *errorcodeptr = ERR27; + goto FAILED; + } + if (condcount == 1) subfirstchar = subreqchar = REQ_NONE; + } + } + + /* Error if hit end of pattern */ + + if (*ptr != CHAR_RIGHT_PARENTHESIS) + { + *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++; /* This already contains bravalue */ + 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 zeroreqchar and + zerofirstchar outside the main loop so that they can be accessed for the + back off. */ + + zeroreqchar = reqchar; + zerofirstchar = firstchar; + groupsetfirstchar = FALSE; + + if (bravalue >= OP_ONCE) + { + /* If we have not yet set a firstchar 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 reqchar if necessary. If the subpattern has + no firstchar, set "none" for the whole branch. In both cases, a zero + repeat forces firstchar to "none". */ + + if (firstchar == REQ_UNSET) + { + if (subfirstchar >= 0) + { + firstchar = subfirstchar; + groupsetfirstchar = TRUE; + } + else firstchar = REQ_NONE; + zerofirstchar = REQ_NONE; + } + + /* If firstchar was previously set, convert the subpattern's firstchar + into reqchar if there wasn't one, using the vary flag that was in + existence beforehand. */ + + else if (subfirstchar >= 0 && subreqchar < 0) + subreqchar = subfirstchar | 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 (subreqchar >= 0) reqchar = subreqchar; + } + + /* For a forward assertion, we take the reqchar, 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 firstchar + for an assertion, however because it leads to incorrect effect for patterns + such as /(?=a)a.+/ when the "real" "a" would then become a reqchar instead + of a firstchar. This is overcome by a scan at the end if there's no + firstchar, looking for an asserted first char. */ + + else if (bravalue == OP_ASSERT && subreqchar >= 0) reqchar = subreqchar; + 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 in the + default case when PCRE_UCP is not set. 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 CHAR_BACKSLASH: + 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] == CHAR_BACKSLASH && ptr[2] == CHAR_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 (firstchar == REQ_UNSET && -c > ESC_b && -c < ESC_Z) + firstchar = REQ_NONE; + + /* Set values to reset to if this is followed by a zero repeat. */ + + zerofirstchar = firstchar; + zeroreqchar = reqchar; + + /* \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 pcre_uchar *p; + save_hwm = cd->hwm; /* Normally this is set when '(' is read */ + terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE; + + /* 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] != CHAR_PLUS && ptr[1] != CHAR_MINUS) + { + BOOL is_a_number = TRUE; + for (p = ptr + 1; *p != 0 && *p != terminator; p++) + { + if (!MAX_255(*p)) { is_a_number = FALSE; break; } + if ((cd->ctypes[*p] & ctype_digit) == 0) is_a_number = FALSE; + if ((cd->ctypes[*p] & ctype_word) == 0) break; + } + if (*p != terminator) + { + *errorcodeptr = ERR57; + break; + } + if (is_a_number) + { + 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 (IS_DIGIT(*p)) 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) + { + if ((ptr[1] != CHAR_LESS_THAN_SIGN && + ptr[1] != CHAR_APOSTROPHE && ptr[1] != CHAR_LEFT_CURLY_BRACKET)) + { + *errorcodeptr = ERR69; + break; + } + is_recurse = FALSE; + terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)? + CHAR_GREATER_THAN_SIGN : (*ptr == CHAR_APOSTROPHE)? + CHAR_APOSTROPHE : CHAR_RIGHT_CURLY_BRACKET; + goto NAMED_REF_OR_RECURSE; + } + + /* Back references are handled specially; must disable firstchar if + not set to cope with cases like (?=(\w+))\1: which would otherwise set + ':' later. */ + + if (-c >= ESC_REF) + { + open_capitem *oc; + recno = -c - ESC_REF; + + HANDLE_REFERENCE: /* Come here from named backref handling */ + if (firstchar == REQ_UNSET) firstchar = REQ_NONE; + previous = code; + *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF; + PUT2INC(code, 0, recno); + cd->backref_map |= (recno < 32)? (1 << recno) : 1; + if (recno > cd->top_backref) cd->top_backref = recno; + + /* Check to see if this back reference is recursive, that it, it + is inside the group that it references. A flag is set so that the + group can be made atomic. */ + + for (oc = cd->open_caps; oc != NULL; oc = oc->next) + { + if (oc->number == recno) + { + oc->flag = TRUE; + break; + } + } + } + + /* 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 in the default + situation when PCRE_UCP is not set. When it *is* set, we substitute + Unicode property tests. Note that \b and \B do a one-character + lookbehind. */ + + else + { + if ((-c == ESC_b || -c == ESC_B) && cd->max_lookbehind == 0) + cd->max_lookbehind = 1; +#ifdef SUPPORT_UCP + if (-c >= ESC_DU && -c <= ESC_wu) + { + nestptr = ptr + 1; /* Where to resume */ + ptr = substitutes[-c - ESC_DU] - 1; /* Just before substitute */ + } + else +#endif + /* In non-UTF-8 mode, we turn \C into OP_ALLANY instead of OP_ANYBYTE + so that it works in DFA mode and in lookbehinds. */ + + { + previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; + *code++ = (!utf && c == -ESC_C)? OP_ALLANY : -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_UTF + if (utf && c > MAX_VALUE_FOR_SINGLE_CHAR) + mclength = PRIV(ord2utf)(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_UTF + if (utf && HAS_EXTRALEN(c)) + ACROSSCHAR(TRUE, ptr[1], 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_CHARI : OP_CHAR; + for (c = 0; c < mclength; c++) *code++ = mcbuffer[c]; + + /* Remember if \r or \n were seen */ + + if (mcbuffer[0] == CHAR_CR || mcbuffer[0] == CHAR_NL) + 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 firstchar value alone, and don't change it on a zero + repeat. */ + + if (firstchar == REQ_UNSET) + { + zerofirstchar = REQ_NONE; + zeroreqchar = reqchar; + + /* If the character is more than one byte long, we can set firstchar + only if it is not to be matched caselessly. */ + + if (mclength == 1 || req_caseopt == 0) + { + firstchar = mcbuffer[0] | req_caseopt; + if (mclength != 1) reqchar = code[-1] | cd->req_varyopt; + } + else firstchar = reqchar = REQ_NONE; + } + + /* firstchar was previously set; we can set reqchar only if the length is + 1 or the matching is caseful. */ + + else + { + zerofirstchar = firstchar; + zeroreqchar = reqchar; + if (mclength == 1 || req_caseopt == 0) + reqchar = 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. +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 + 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) + cond_depth depth of nesting for conditional subpatterns + firstcharptr place to put the first required character, or a negative number + reqcharptr 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, pcre_uchar **codeptr, const pcre_uchar **ptrptr, + int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes, + int cond_depth, pcre_int32 *firstcharptr, pcre_int32 *reqcharptr, + branch_chain *bcptr, compile_data *cd, int *lengthptr) +{ +const pcre_uchar *ptr = *ptrptr; +pcre_uchar *code = *codeptr; +pcre_uchar *last_branch = code; +pcre_uchar *start_bracket = code; +pcre_uchar *reverse_count = NULL; +open_capitem capitem; +int capnumber = 0; +pcre_int32 firstchar, reqchar; +pcre_int32 branchfirstchar, branchreqchar; +int length; +int orig_bracount; +int max_bracount; +branch_chain bc; + +bc.outer = bcptr; +bc.current_branch = code; + +firstchar = reqchar = 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. */ + +/* If this is a capturing subpattern, add to the chain of open capturing items +so that we can detect them if (*ACCEPT) is encountered. This is also used to +detect groups that contain recursive back references to themselves. Note that +only OP_CBRA need be tested here; changing this opcode to one of its variants, +e.g. OP_SCBRAPOS, happens later, after the group has been compiled. */ + +if (*code == OP_CBRA) + { + capnumber = GET2(code, 1 + LINK_SIZE); + capitem.number = capnumber; + capitem.next = cd->open_caps; + capitem.flag = FALSE; + cd->open_caps = &capitem; + } + +/* 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; + + /* 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, &branchfirstchar, + &branchreqchar, &bc, cond_depth, 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 firstchar and reqchar values for the + branch become the values for the regex. */ + + if (*last_branch != OP_ALT) + { + firstchar = branchfirstchar; + reqchar = branchreqchar; + } + + /* If this is not the first branch, the first char and reqchar have to + match the values from all the previous branches, except that if the + previous value for reqchar didn't have REQ_VARY set, it can still match, + and we set REQ_VARY for the regex. */ + + else + { + /* If we previously had a firstchar, but it doesn't match the new branch, + we have to abandon the firstchar for the regex, but if there was + previously no reqchar, it takes on the value of the old firstchar. */ + + if (firstchar >= 0 && firstchar != branchfirstchar) + { + if (reqchar < 0) reqchar = firstchar; + firstchar = REQ_NONE; + } + + /* If we (now or from before) have no firstchar, a firstchar from the + branch becomes a reqchar if there isn't a branch reqchar. */ + + if (firstchar < 0 && branchfirstchar >= 0 && branchreqchar < 0) + branchreqchar = branchfirstchar; + + /* Now ensure that the reqchars match */ + + if ((reqchar & ~REQ_VARY) != (branchreqchar & ~REQ_VARY)) + reqchar = REQ_NONE; + else reqchar |= branchreqchar; /* 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 the branch contains OP_RECURSE, the result is -3 + because there may be forward references that we can't check here. Set a + flag to cause another lookbehind check at the end. Why not do it all at the + end? Because common, erroneous checks are picked up here and the offset of + the problem can be shown. */ + + if (lookbehind) + { + int fixed_length; + *code = OP_END; + fixed_length = find_fixedlength(last_branch, (options & PCRE_UTF8) != 0, + FALSE, cd); + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length == -3) + { + cd->check_lookbehind = TRUE; + } + else if (fixed_length < 0) + { + *errorcodeptr = (fixed_length == -2)? ERR36 : + (fixed_length == -4)? ERR70: ERR25; + *ptrptr = ptr; + return FALSE; + } + else + { + if (fixed_length > cd->max_lookbehind) + cd->max_lookbehind = fixed_length; + 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. Return leaving the pointer at the terminating char. */ + + if (*ptr != CHAR_VERTICAL_LINE) + { + if (lengthptr == NULL) + { + int branch_length = (int)(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, (int)(code - start_bracket)); + code += 1 + LINK_SIZE; + + /* If it was a capturing subpattern, check to see if it contained any + recursive back references. If so, we must wrap it in atomic brackets. + In any event, remove the block from the chain. */ + + if (capnumber > 0) + { + if (cd->open_caps->flag) + { + memmove(start_bracket + 1 + LINK_SIZE, start_bracket, + IN_UCHARS(code - start_bracket)); + *start_bracket = OP_ONCE; + code += 1 + LINK_SIZE; + PUT(start_bracket, 1, (int)(code - start_bracket)); + *code = OP_KET; + PUT(code, 1, (int)(code - start_bracket)); + code += 1 + LINK_SIZE; + length += 2 + 2*LINK_SIZE; + } + cd->open_caps = cd->open_caps->next; + } + + /* Retain the highest bracket number, in case resetting was used. */ + + cd->bracount = max_bracount; + + /* Set values to pass back */ + + *codeptr = code; + *ptrptr = ptr; + *firstcharptr = firstchar; + *reqcharptr = reqchar; + 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, (int)(code - last_branch)); + bc.current_branch = 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 will +be found, because ^ generates OP_CIRCM in that mode. + +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) + 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 pcre_uchar *code, unsigned int bracket_map, + unsigned int backref_map) +{ +do { + const pcre_uchar *scode = first_significant_code( + code + PRIV(OP_lengths)[*code], FALSE); + register int op = *scode; + + /* Non-capturing brackets */ + + if (op == OP_BRA || op == OP_BRAPOS || + op == OP_SBRA || op == OP_SBRAPOS) + { + if (!is_anchored(scode, bracket_map, backref_map)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA || op == OP_CBRAPOS || + op == OP_SCBRA || op == OP_SCBRAPOS) + { + int n = GET2(scode, 1+LINK_SIZE); + int new_map = bracket_map | ((n < 32)? (1 << n) : 1); + if (!is_anchored(scode, new_map, backref_map)) return FALSE; + } + + /* Other brackets */ + + else if (op == OP_ASSERT || op == OP_ONCE || op == OP_ONCE_NC || + op == OP_COND) + { + if (!is_anchored(scode, 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 && 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 pcre_uchar *code, unsigned int bracket_map, + unsigned int backref_map) +{ +do { + const pcre_uchar *scode = first_significant_code( + code + PRIV(OP_lengths)[*code], FALSE); + register int op = *scode; + + /* If we are at the start of a conditional assertion group, *both* the + conditional assertion *and* what follows the condition must satisfy the test + for start of line. Other kinds of condition fail. Note that there may be an + auto-callout at the start of a condition. */ + + if (op == OP_COND) + { + scode += 1 + LINK_SIZE; + if (*scode == OP_CALLOUT) scode += PRIV(OP_lengths)[OP_CALLOUT]; + switch (*scode) + { + case OP_CREF: + case OP_NCREF: + case OP_RREF: + case OP_NRREF: + case OP_DEF: + return FALSE; + + default: /* Assertion */ + if (!is_startline(scode, bracket_map, backref_map)) return FALSE; + do scode += GET(scode, 1); while (*scode == OP_ALT); + scode += 1 + LINK_SIZE; + break; + } + scode = first_significant_code(scode, FALSE); + op = *scode; + } + + /* Non-capturing brackets */ + + if (op == OP_BRA || op == OP_BRAPOS || + op == OP_SBRA || op == OP_SBRAPOS) + { + if (!is_startline(scode, bracket_map, backref_map)) return FALSE; + } + + /* Capturing brackets */ + + else if (op == OP_CBRA || op == OP_CBRAPOS || + op == OP_SCBRA || op == OP_SCBRAPOS) + { + 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_ONCE_NC) + { + 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 && op != OP_CIRCM) 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) + inassert TRUE if in an assertion + +Returns: -1 or the fixed first char +*/ + +static int +find_firstassertedchar(const pcre_uchar *code, BOOL inassert) +{ +register int c = -1; +do { + int d; + int xl = (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS)? IMM2_SIZE:0; + const pcre_uchar *scode = first_significant_code(code + 1+LINK_SIZE + xl, + TRUE); + register int op = *scode; + + switch(op) + { + default: + return -1; + + case OP_BRA: + case OP_BRAPOS: + case OP_CBRA: + case OP_SCBRA: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_ASSERT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_COND: + if ((d = find_firstassertedchar(scode, op == OP_ASSERT)) < 0) + return -1; + if (c < 0) c = d; else if (c != d) return -1; + break; + + case OP_EXACT: + scode += IMM2_SIZE; + /* Fall through */ + + case OP_CHAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + if (!inassert) return -1; + if (c < 0) c = scode[1]; + else if (c != scode[1]) return -1; + break; + + case OP_EXACTI: + scode += IMM2_SIZE; + /* Fall through */ + + case OP_CHARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + if (!inassert) return -1; + if (c < 0) c = scode[1] | 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN pcre * PCRE_CALL_CONVENTION +pcre_compile(const char *pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +#else +PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION +pcre16_compile(PCRE_SPTR16 pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +#endif +{ +#ifdef COMPILE_PCRE8 +return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +#else +return pcre16_compile2(pattern, options, NULL, errorptr, erroroffset, tables); +#endif +} + + +#ifdef COMPILE_PCRE8 +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) +#else +PCRE_EXP_DEFN pcre16 * PCRE_CALL_CONVENTION +pcre16_compile2(PCRE_SPTR16 pattern, int options, int *errorcodeptr, + const char **errorptr, int *erroroffset, const unsigned char *tables) +#endif +{ +REAL_PCRE *re; +int length = 1; /* For final END opcode */ +pcre_int32 firstchar, reqchar; +int newline; +int errorcode = 0; +int skipatstart = 0; +BOOL utf; +size_t size; +pcre_uchar *code; +const pcre_uchar *codestart; +const pcre_uchar *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. That may overflow, in which case +new memory is obtained from malloc(). */ + +pcre_uchar cworkspace[COMPILE_WORK_SIZE]; + +/* Set this early so that early errors get offset 0. */ + +ptr = (const pcre_uchar *)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; + +/* Set up pointers to the individual character tables */ + +if (tables == NULL) tables = PRIV(default_tables); +cd->lcc = tables + lcc_offset; +cd->fcc = tables + fcc_offset; +cd->cbits = tables + cbits_offset; +cd->ctypes = tables + ctypes_offset; + +/* Check that all undefined public option bits are zero */ + +if ((options & ~PUBLIC_COMPILE_OPTIONS) != 0) + { + errorcode = ERR17; + goto PCRE_EARLY_ERROR_RETURN; + } + +/* Check for global one-time settings at the start of the pattern, and remember +the offset for later. */ + +while (ptr[skipatstart] == CHAR_LEFT_PARENTHESIS && + ptr[skipatstart+1] == CHAR_ASTERISK) + { + int newnl = 0; + int newbsr = 0; + +#ifdef COMPILE_PCRE8 + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF_RIGHTPAR, 5) == 0) + { skipatstart += 7; options |= PCRE_UTF8; continue; } +#endif +#ifdef COMPILE_PCRE16 + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UTF_RIGHTPAR, 6) == 0) + { skipatstart += 8; options |= PCRE_UTF16; continue; } +#endif + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_UCP_RIGHTPAR, 4) == 0) + { skipatstart += 6; options |= PCRE_UCP; continue; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_NO_START_OPT_RIGHTPAR, 13) == 0) + { skipatstart += 15; options |= PCRE_NO_START_OPTIMIZE; continue; } + + if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CR_RIGHTPAR, 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_CR; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_LF_RIGHTPAR, 3) == 0) + { skipatstart += 5; newnl = PCRE_NEWLINE_LF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_CRLF_RIGHTPAR, 5) == 0) + { skipatstart += 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANY_RIGHTPAR, 4) == 0) + { skipatstart += 6; newnl = PCRE_NEWLINE_ANY; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_ANYCRLF_RIGHTPAR, 8) == 0) + { skipatstart += 10; newnl = PCRE_NEWLINE_ANYCRLF; } + + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_ANYCRLF_RIGHTPAR, 12) == 0) + { skipatstart += 14; newbsr = PCRE_BSR_ANYCRLF; } + else if (STRNCMP_UC_C8(ptr+skipatstart+2, STRING_BSR_UNICODE_RIGHTPAR, 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; + } + +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +utf = (options & PCRE_UTF8) != 0; + +/* Can't support UTF unless PCRE has been compiled to include the code. The +return of an error code from PRIV(valid_utf)() is a new feature, introduced in +release 8.13. It is passed back from pcre_[dfa_]exec(), but at the moment is +not used here. */ + +#ifdef SUPPORT_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0 && + (errorcode = PRIV(valid_utf)((PCRE_PUCHAR)pattern, -1, erroroffset)) != 0) + { +#ifdef COMPILE_PCRE8 + errorcode = ERR44; +#else + errorcode = ERR74; +#endif + goto PCRE_EARLY_ERROR_RETURN2; + } +#else +if (utf) + { + errorcode = ERR32; + goto PCRE_EARLY_ERROR_RETURN; + } +#endif + +/* Can't support UCP unless PCRE has been compiled to include the code. */ + +#ifndef SUPPORT_UCP +if ((options & PCRE_UCP) != 0) + { + errorcode = ERR67; + goto PCRE_EARLY_ERROR_RETURN; + } +#endif + +/* Check validity of \R options. */ + +if ((options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) == + (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE)) + { + 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 = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; 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")); +#ifdef PCRE_DEBUG +print_puchar(stdout, (PCRE_PUCHAR)pattern); +#endif +DPRINTF(("\n")); + +/* 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_code = cworkspace; +cd->hwm = cworkspace; +cd->start_workspace = cworkspace; +cd->workspace_size = COMPILE_WORK_SIZE; +cd->start_pattern = (const pcre_uchar *)pattern; +cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern)); +cd->req_varyopt = 0; +cd->assert_depth = 0; +cd->max_lookbehind = 0; +cd->external_options = options; +cd->external_flags = 0; +cd->open_caps = NULL; + +/* 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, &code, &ptr, &errorcode, FALSE, + FALSE, 0, 0, &firstchar, &reqchar, NULL, cd, &length); +if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN; + +DPRINTF(("end pre-compile: length=%d workspace=%d\n", length, + (int)(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 = sizeof(REAL_PCRE) + (length + cd->names_found * cd->name_entry_size) * sizeof(pcre_uchar); +re = (REAL_PCRE *)(PUBL(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 = (int)size; +re->options = cd->external_options; +re->flags = cd->external_flags; +re->first_char = 0; +re->req_char = 0; +re->name_table_offset = sizeof(REAL_PCRE) / sizeof(pcre_uchar); +re->name_entry_size = cd->name_entry_size; +re->name_count = cd->names_found; +re->ref_count = 0; +re->tables = (tables == PRIV(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->assert_depth = 0; +cd->bracount = 0; +cd->max_lookbehind = 0; +cd->names_found = 0; +cd->name_table = (pcre_uchar *)re + re->name_table_offset; +codestart = cd->name_table + re->name_entry_size * re->name_count; +cd->start_code = codestart; +cd->hwm = (pcre_uchar *)(cd->start_workspace); +cd->req_varyopt = 0; +cd->had_accept = FALSE; +cd->check_lookbehind = FALSE; +cd->open_caps = NULL; + +/* 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 pcre_uchar *)pattern + skipatstart; +code = (pcre_uchar *)codestart; +*code = OP_BRA; +(void)compile_regex(re->options, &code, &ptr, &errorcode, FALSE, FALSE, 0, 0, + &firstchar, &reqchar, NULL, cd, NULL); +re->top_bracket = cd->bracount; +re->top_backref = cd->top_backref; +re->max_lookbehind = cd->max_lookbehind; +re->flags = cd->external_flags | PCRE_MODE; + +if (cd->had_accept) reqchar = REQ_NONE; /* 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 PCRE_DEBUG +if (code - codestart > length) errorcode = ERR23; +#endif + +/* Fill in any forward references that are required. There may be repeated +references; optimize for them, as searching a large regex takes time. */ + +if (cd->hwm > cd->start_workspace) + { + int prev_recno = -1; + const pcre_uchar *groupptr = NULL; + while (errorcode == 0 && cd->hwm > cd->start_workspace) + { + int offset, recno; + cd->hwm -= LINK_SIZE; + offset = GET(cd->hwm, 0); + recno = GET(codestart, offset); + if (recno != prev_recno) + { + groupptr = PRIV(find_bracket)(codestart, utf, recno); + prev_recno = recno; + } + if (groupptr == NULL) errorcode = ERR53; + else PUT(((pcre_uchar *)codestart), offset, (int)(groupptr - codestart)); + } + } + +/* If the workspace had to be expanded, free the new memory. */ + +if (cd->workspace_size > COMPILE_WORK_SIZE) + (PUBL(free))((void *)cd->start_workspace); + +/* 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; + +/* If there were any lookbehind assertions that contained OP_RECURSE +(recursions or subroutine calls), a flag is set for them to be checked here, +because they may contain forward references. Actual recursions can't be fixed +length, but subroutine calls can. It is done like this so that those without +OP_RECURSE that are not fixed length get a diagnosic with a useful offset. The +exceptional ones forgo this. We scan the pattern to check that they are fixed +length, and set their lengths. */ + +if (cd->check_lookbehind) + { + pcre_uchar *cc = (pcre_uchar *)codestart; + + /* Loop, searching for OP_REVERSE items, and process those that do not have + their length set. (Actually, it will also re-process any that have a length + of zero, but that is a pathological case, and it does no harm.) When we find + one, we temporarily terminate the branch it is in while we scan it. */ + + for (cc = (pcre_uchar *)PRIV(find_bracket)(codestart, utf, -1); + cc != NULL; + cc = (pcre_uchar *)PRIV(find_bracket)(cc, utf, -1)) + { + if (GET(cc, 1) == 0) + { + int fixed_length; + pcre_uchar *be = cc - 1 - LINK_SIZE + GET(cc, -LINK_SIZE); + int end_op = *be; + *be = OP_END; + fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE, + cd); + *be = end_op; + DPRINTF(("fixed length = %d\n", fixed_length)); + if (fixed_length < 0) + { + errorcode = (fixed_length == -2)? ERR36 : + (fixed_length == -4)? ERR70 : ERR25; + break; + } + if (fixed_length > cd->max_lookbehind) cd->max_lookbehind = fixed_length; + PUT(cc, 1, fixed_length); + } + cc += 1 + LINK_SIZE; + } + } + +/* Failed to compile, or error while post-processing */ + +if (errorcode != 0) + { + (PUBL(free))(re); + PCRE_EARLY_ERROR_RETURN: + *erroroffset = (int)(ptr - (const pcre_uchar *)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) + { + if (is_anchored(codestart, 0, cd->backref_map)) + re->options |= PCRE_ANCHORED; + else + { + if (firstchar < 0) + firstchar = find_firstassertedchar(codestart, FALSE); + if (firstchar >= 0) /* Remove caseless flag for non-caseable chars */ + { +#ifdef COMPILE_PCRE8 + re->first_char = firstchar & 0xff; +#else +#ifdef COMPILE_PCRE16 + re->first_char = firstchar & 0xffff; +#endif +#endif + if ((firstchar & REQ_CASELESS) != 0) + { +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + /* We ignore non-ASCII first chars in 8 bit mode. */ + if (utf) + { + if (re->first_char < 128) + { + if (cd->fcc[re->first_char] != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + else if (UCD_OTHERCASE(re->first_char) != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + else +#endif + if (MAX_255(re->first_char) + && cd->fcc[re->first_char] != re->first_char) + re->flags |= PCRE_FCH_CASELESS; + } + + 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 (reqchar >= 0 && + ((re->options & PCRE_ANCHORED) == 0 || (reqchar & REQ_VARY) != 0)) + { +#ifdef COMPILE_PCRE8 + re->req_char = reqchar & 0xff; +#else +#ifdef COMPILE_PCRE16 + re->req_char = reqchar & 0xffff; +#endif +#endif + if ((reqchar & REQ_CASELESS) != 0) + { +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + /* We ignore non-ASCII first chars in 8 bit mode. */ + if (utf) + { + if (re->req_char < 128) + { + if (cd->fcc[re->req_char] != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + else if (UCD_OTHERCASE(re->req_char) != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + else +#endif + if (MAX_255(re->req_char) && cd->fcc[re->req_char] != re->req_char) + re->flags |= PCRE_RCH_CASELESS; + } + + re->flags |= PCRE_REQCHSET; + } + +/* Print out the compiled data if debugging is enabled. This is never the +case when building a production library. */ + +#ifdef PCRE_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) + { + pcre_uchar ch = re->first_char; + const char *caseless = + ((re->flags & PCRE_FCH_CASELESS) == 0)? "" : " (caseless)"; + if (PRINTABLE(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) + { + pcre_uchar ch = re->req_char; + const char *caseless = + ((re->flags & PCRE_RCH_CASELESS) == 0)? "" : " (caseless)"; + if (PRINTABLE(ch)) printf("Req char = %c%s\n", ch, caseless); + else printf("Req char = \\x%02x%s\n", ch, caseless); + } + +#ifdef COMPILE_PCRE8 +pcre_printint((pcre *)re, stdout, TRUE); +#else +pcre16_printint((pcre *)re, stdout, TRUE); +#endif + +/* This check is done here in the debugging case so that the code that +was compiled can be seen. */ + +if (code - codestart > length) + { + (PUBL(free))(re); + *errorptr = find_error_text(ERR23); + *erroroffset = ptr - (pcre_uchar *)pattern; + if (errorcodeptr != NULL) *errorcodeptr = ERR23; + return NULL; + } +#endif /* PCRE_DEBUG */ + +#ifdef COMPILE_PCRE8 +return (pcre *)re; +#else +return (pcre16 *)re; +#endif +} + +/* 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..aa0ef86 --- /dev/null +++ b/glib/pcre/pcre_config.c @@ -0,0 +1,170 @@ +/************************************************* +* 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-2012 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 + +/* Keep the original link size. */ +static int real_link_size = LINK_SIZE; + +#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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_config(int what, void *where) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_config(int what, void *where) +#endif +{ +switch (what) + { + case PCRE_CONFIG_UTF8: +#if defined COMPILE_PCRE16 + *((int *)where) = 0; + return PCRE_ERROR_BADOPTION; +#else +#if defined SUPPORT_UTF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; +#endif + + case PCRE_CONFIG_UTF16: +#if defined COMPILE_PCRE8 + *((int *)where) = 0; + return PCRE_ERROR_BADOPTION; +#else +#if defined SUPPORT_UTF + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; +#endif + + case PCRE_CONFIG_UNICODE_PROPERTIES: +#ifdef SUPPORT_UCP + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_JIT: +#ifdef SUPPORT_JIT + *((int *)where) = 1; +#else + *((int *)where) = 0; +#endif + break; + + case PCRE_CONFIG_JITTARGET: +#ifdef SUPPORT_JIT + *((const char **)where) = PRIV(jit_get_target)(); +#else + *((const char **)where) = NULL; +#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) = real_link_size; + break; + + case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: + *((int *)where) = POSIX_MALLOC_THRESHOLD; + break; + + case PCRE_CONFIG_MATCH_LIMIT: + *((unsigned long int *)where) = MATCH_LIMIT; + break; + + case PCRE_CONFIG_MATCH_LIMIT_RECURSION: + *((unsigned long 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..5593d39 --- /dev/null +++ b/glib/pcre/pcre_dfa_exec.c @@ -0,0 +1,3613 @@ +/************************************************* +* 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 (but see +below for why this module is different). + + Written by Philip Hazel + Copyright (c) 1997-2012 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. */ + + +/* NOTE ABOUT PERFORMANCE: A user of this function sent some code that improved +the performance of his patterns greatly. I could not use it as it stood, as it +was not thread safe, and made assumptions about pattern sizes. Also, it caused +test 7 to loop, and test 9 to crash with a segfault. + +The issue is the check for duplicate states, which is done by a simple linear +search up the state list. (Grep for "duplicate" below to find the code.) For +many patterns, there will never be many states active at one time, so a simple +linear search is fine. In patterns that have many active states, it might be a +bottleneck. The suggested code used an indexing scheme to remember which states +had previously been used for each character, and avoided the linear search when +it knew there was no chance of a duplicate. This was implemented when adding +states to the state lists. + +I wrote some thread-safe, not-limited code to try something similar at the time +of checking for duplicates (instead of when adding states), using index vectors +on the stack. It did give a 13% improvement with one specially constructed +pattern for certain subject strings, but on other strings and on many of the +simpler patterns in the test suite it did worse. The major problem, I think, +was the extra time to initialize the index. This had to be done for each call +of internal_dfa_exec(). (The supplied patch used a static vector, initialized +only once - I suspect this was the cause of the problems with the tests.) + +Overall, I concluded that the gains in some cases did not outweigh the losses +in others, so I abandoned this code. */ + + + +#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 it 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. Non-zero values in the table are the offsets from the opcode where +the character is to be found. ***NOTE*** If the start of this table is +modified, the three tables that follow must also be modified. */ + +static const pcre_uint8 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, /* \P, \p */ + 0, 0, 0, 0, 0, /* \R, \H, \h, \V, \v */ + 0, /* \X */ + 0, 0, 0, 0, 0, 0, /* \Z, \z, ^, ^M, $, $M */ + 1, /* Char */ + 1, /* Chari */ + 1, /* not */ + 1, /* noti */ + /* Positive single-char repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* upto, minupto */ + 1+IMM2_SIZE, /* exact */ + 1, 1, 1, 1+IMM2_SIZE, /* *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* *I, *?I, +I, +?I, ?I, ??I */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* upto I, minupto I */ + 1+IMM2_SIZE, /* exact I */ + 1, 1, 1, 1+IMM2_SIZE, /* *+I, ++I, ?+I, upto+I */ + /* Negative single-char repeats - only for chars < 256 */ + 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* NOT upto, minupto */ + 1+IMM2_SIZE, /* NOT exact */ + 1, 1, 1, 1+IMM2_SIZE, /* NOT *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* NOT *I, *?I, +I, +?I, ?I, ??I */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* NOT upto I, minupto I */ + 1+IMM2_SIZE, /* NOT exact I */ + 1, 1, 1, 1+IMM2_SIZE, /* NOT *+I, ++I, ?+I, upto+I */ + /* Positive type repeats */ + 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* Type upto, minupto */ + 1+IMM2_SIZE, /* Type exact */ + 1, 1, 1, 1+IMM2_SIZE, /* 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, /* REFI */ + 0, /* RECURSE */ + 0, /* CALLOUT */ + 0, /* Alt */ + 0, /* Ket */ + 0, /* KetRmax */ + 0, /* KetRmin */ + 0, /* KetRpos */ + 0, /* Reverse */ + 0, /* Assert */ + 0, /* Assert not */ + 0, /* Assert behind */ + 0, /* Assert behind not */ + 0, 0, /* ONCE, ONCE_NC */ + 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ + 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ + 0, 0, /* CREF, NCREF */ + 0, 0, /* RREF, NRREF */ + 0, /* DEF */ + 0, 0, 0, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ + 0, 0, 0, /* MARK, PRUNE, PRUNE_ARG */ + 0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG */ + 0, 0, 0, 0, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ + 0, 0 /* CLOSE, SKIPZERO */ +}; + +/* This table identifies those opcodes that inspect a character. It is used to +remember the fact that a character could have been inspected when the end of +the subject is reached. ***NOTE*** If the start of this table is modified, the +two tables that follow must also be modified. */ + +static const pcre_uint8 poptable[] = { + 0, /* End */ + 0, 0, 0, 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 */ + 1, 1, /* \P, \p */ + 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ + 1, /* \X */ + 0, 0, 0, 0, 0, 0, /* \Z, \z, ^, ^M, $, $M */ + 1, /* Char */ + 1, /* Chari */ + 1, /* not */ + 1, /* noti */ + /* Positive single-char repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* upto, minupto, exact */ + 1, 1, 1, 1, /* *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* *I, *?I, +I, +?I, ?I, ??I */ + 1, 1, 1, /* upto I, minupto I, exact I */ + 1, 1, 1, 1, /* *+I, ++I, ?+I, upto+I */ + /* Negative single-char repeats - only for chars < 256 */ + 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* NOT upto, minupto, exact */ + 1, 1, 1, 1, /* NOT *+, ++, ?+, upto+ */ + 1, 1, 1, 1, 1, 1, /* NOT *I, *?I, +I, +?I, ?I, ??I */ + 1, 1, 1, /* NOT upto I, minupto I, exact I */ + 1, 1, 1, 1, /* NOT *+I, ++I, ?+I, upto+I */ + /* Positive type repeats */ + 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ + 1, 1, 1, /* Type upto, minupto, exact */ + 1, 1, 1, 1, /* Type *+, ++, ?+, upto+ */ + /* Character class & ref repeats */ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ + 1, 1, /* CRRANGE, CRMINRANGE */ + 1, /* CLASS */ + 1, /* NCLASS */ + 1, /* XCLASS - variable length */ + 0, /* REF */ + 0, /* REFI */ + 0, /* RECURSE */ + 0, /* CALLOUT */ + 0, /* Alt */ + 0, /* Ket */ + 0, /* KetRmax */ + 0, /* KetRmin */ + 0, /* KetRpos */ + 0, /* Reverse */ + 0, /* Assert */ + 0, /* Assert not */ + 0, /* Assert behind */ + 0, /* Assert behind not */ + 0, 0, /* ONCE, ONCE_NC */ + 0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */ + 0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */ + 0, 0, /* CREF, NCREF */ + 0, 0, /* RREF, NRREF */ + 0, /* DEF */ + 0, 0, 0, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ + 0, 0, 0, /* MARK, PRUNE, PRUNE_ARG */ + 0, 0, 0, 0, /* SKIP, SKIP_ARG, THEN, THEN_ARG */ + 0, 0, 0, 0, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ + 0, 0 /* CLOSE, SKIPZERO */ +}; + +/* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W, +and \w */ + +static const pcre_uint8 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 pcre_uint8 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 data; /* Some use extra data */ +} stateblock; + +#define INTS_PER_STATEBLOCK (int)(sizeof(stateblock)/sizeof(int)) + + +#ifdef PCRE_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(const pcre_uchar *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 + rlevel function call recursion 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++; \ + 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->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++; \ + 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->data = (z); \ + next_new_state++; \ + DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d) line %d\n", rlevel*2-2, SP, \ + (x), (y), (z), __LINE__)); \ + } \ + else return PCRE_ERROR_DFA_WSSIZE + +/* And now, here is the code */ + +static int +internal_dfa_exec( + dfa_match_data *md, + const pcre_uchar *this_start_code, + const pcre_uchar *current_subject, + int start_offset, + int *offsets, + int offsetcount, + int *workspace, + int wscount, + int rlevel) +{ +stateblock *active_states, *new_states, *temp_states; +stateblock *next_active_state, *next_new_state; + +const pcre_uint8 *ctypes, *lcc, *fcc; +const pcre_uchar *ptr; +const pcre_uchar *end_code, *first_op; + +dfa_recursion_info new_recursive; + +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 pcre_uchar *start_subject = md->start_subject; +const pcre_uchar *end_subject = md->end_subject; +const pcre_uchar *start_code = md->start_code; + +#ifdef SUPPORT_UTF +BOOL utf = (md->poptions & PCRE_UTF8) != 0; +#else +BOOL utf = FALSE; +#endif + +BOOL reset_could_continue = FALSE; + +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\n", + rlevel*2-2, SP, rlevel*2-2, SP, rlevel)); + +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 || + *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS) + ? IMM2_SIZE: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_UTF + /* In character mode we have to step back character by character */ + + if (utf) + { + for (gone_back = 0; gone_back < max_back; gone_back++) + { + if (current_subject <= start_subject) break; + current_subject--; + ACROSSCHAR(current_subject > start_subject, *current_subject, current_subject--); + } + } + else +#endif + + /* In byte-mode we can do this quickly. */ + + { + gone_back = (current_subject - max_back < start_subject)? + (int)(current_subject - start_subject) : max_back; + current_subject -= gone_back; + } + + /* Save the earliest consulted character */ + + if (current_subject < md->start_used_ptr) + md->start_used_ptr = current_subject; + + /* 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 = (int)(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 || + *this_start_code == OP_CBRAPOS || *this_start_code == OP_SCBRAPOS) + ? IMM2_SIZE:0); + do + { + ADD_NEW((int)(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, (int)(end_code - start_code))); + +/* Loop for scanning the subject */ + +ptr = current_subject; +for (;;) + { + int i, j; + int clen, dlen; + unsigned int c, d; + int forced_fail = 0; + BOOL partial_newline = FALSE; + BOOL could_continue = reset_could_continue; + reset_could_continue = FALSE; + + /* 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 PCRE_DEBUG + printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP); + pchars(ptr, STRLEN_UC(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 data items in the character */ +#ifdef SUPPORT_UTF + if (utf) { GETCHARLEN(c, ptr, clen); } else +#endif /* SUPPORT_UTF */ + 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; + BOOL caseless = FALSE; + const pcre_uchar *code; + int state_offset = current_state->offset; + int count, codevalue, rrc; + +#ifdef PCRE_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 + + /* 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 the could_continue flag was passed over from a previous + state, arrange for it to passed on. */ + + 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); + if (could_continue) reset_could_continue = TRUE; + continue; + } + else + { + current_state->offset = state_offset = -state_offset; + } + } + + /* Check for a duplicate state with the same count, and skip if found. + See the note at the head of this module about the possibility of improving + performance here. */ + + 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 inspects a character, but we are at the end of the + subject, remember the fact for use when testing for a partial match. */ + + if (clen == 0 && poptable[codevalue] != 0) + could_continue = TRUE; + + /* 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 because + the values are small. 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_UTF + if (utf) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else +#endif /* SUPPORT_UTF */ + 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) + { +/* ========================================================================== */ + /* These cases are never obeyed. This is a fudge that causes a compile- + time error if the vectors coptable or poptable, which are indexed by + opcode, are not the correct length. It seems to be the only way to do + such a check at compile time, as the sizeof() operator does not work + in the C preprocessor. */ + + case OP_TABLE_LENGTH: + case OP_TABLE_LENGTH + + ((sizeof(coptable) == OP_TABLE_LENGTH) && + (sizeof(poptable) == OP_TABLE_LENGTH)): + break; + +/* ========================================================================== */ + /* Reached a closing bracket. If not at the end of the pattern, carry + on with the next opcode. For repeating opcodes, also add the repeat + state. Note that KETRPOS will always be encountered at the end of the + subpattern, because the possessive subpattern repeats are always handled + using recursive calls. Thus, it never adds any new states. + + At the end of the (sub)pattern, unless we have an empty string and + PCRE_NOTEMPTY is set, or PCRE_NOTEMPTY_ATSTART is set and we are at the + start of the subject, 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: + case OP_KETRPOS: + 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 && + ((md->moptions & PCRE_NOTEMPTY_ATSTART) == 0 || + current_subject > start_subject + md->start_offset))) + { + 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] = (int)(current_subject - start_subject); + offsets[1] = (int)(ptr - start_subject); + DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP, + offsets[1] - offsets[0], (char *)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((int)(code - start_code), 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_BRA: + case OP_SBRA: + do + { + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE), 0); + code += GET(code, 1); + } + while (*code == OP_ALT); + break; + + /*-----------------------------------------------------------------*/ + case OP_CBRA: + case OP_SCBRA: + ADD_ACTIVE((int)(code - start_code + 1 + LINK_SIZE + IMM2_SIZE), 0); + code += GET(code, 1); + while (*code == OP_ALT) + { + ADD_ACTIVE((int)(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((int)(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((int)(code - start_code + 1 + LINK_SIZE), 0); + break; + + /*-----------------------------------------------------------------*/ + case OP_CIRC: + if (ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_CIRCM: + if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) || + (ptr != end_subject && WAS_NEWLINE(ptr))) + { ADD_ACTIVE(state_offset + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + case OP_EOD: + if (ptr >= end_subject) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else { ADD_ACTIVE(state_offset + 1, 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)) + { + if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else + { + 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 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else 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 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else if (clen == 0 || + ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr) && + (ptr == end_subject - md->nllen) + )) + { ADD_ACTIVE(state_offset + 1, 0); } + else if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + { + reset_could_continue = TRUE; + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else could_continue = partial_newline = TRUE; + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_DOLLM: + if ((md->moptions & PCRE_NOTEOL) == 0) + { + if (clen == 0 && (md->moptions & PCRE_PARTIAL_HARD) != 0) + could_continue = TRUE; + else if (clen == 0 || + ((md->poptions & PCRE_DOLLAR_ENDONLY) == 0 && IS_NEWLINE(ptr))) + { ADD_ACTIVE(state_offset + 1, 0); } + else if (ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + { + reset_could_continue = TRUE; + ADD_NEW_DATA(-(state_offset + 1), 0, 1); + } + else could_continue = partial_newline = TRUE; + } + } + else if (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 pcre_uchar *temp = ptr - 1; + if (temp < md->start_used_ptr) md->start_used_ptr = temp; +#ifdef SUPPORT_UTF + if (utf) { BACKCHAR(temp); } +#endif + GETCHARTEST(d, temp); +#ifdef SUPPORT_UCP + if ((md->poptions & PCRE_UCP) != 0) + { + if (d == '_') left_word = TRUE; else + { + int cat = UCD_CATEGORY(d); + left_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + left_word = d < 256 && (ctypes[d] & ctype_word) != 0; + } + else left_word = FALSE; + + if (clen > 0) + { +#ifdef SUPPORT_UCP + if ((md->poptions & PCRE_UCP) != 0) + { + if (c == '_') right_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + right_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + right_word = c < 256 && (ctypes[c] & ctype_word) != 0; + } + else right_word = FALSE; + + 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; + const pcre_uint8 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 = PRIV(ucp_gentype)[chartype] == code[2]; + break; + + case PT_PC: + OK = chartype == code[2]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + 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 (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else 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 (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else 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 (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else 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 (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else 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 + 1 + IMM2_SIZE + 1, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + ADD_ACTIVE(state_offset + 2 + IMM2_SIZE, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + if (d == OP_ANY && ptr + 1 >= md->end_subject && + (md->moptions & (PCRE_PARTIAL_HARD)) != 0 && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + could_continue = partial_newline = TRUE; + } + else 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 + 2 + IMM2_SIZE, 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; + const pcre_uint8 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 = PRIV(ucp_gentype)[chartype] == code[3]; + break; + + case PT_PC: + OK = chartype == code[3]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + 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 pcre_uchar *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; + const pcre_uint8 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 = PRIV(ucp_gentype)[chartype] == code[3]; + break; + + case PT_PC: + OK = chartype == code[3]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + 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 pcre_uchar *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 + 1 + IMM2_SIZE + 3, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + BOOL OK; + const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(code[1 + IMM2_SIZE + 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 = PRIV(ucp_gentype)[chartype] == code[1 + IMM2_SIZE + 2]; + break; + + case PT_PC: + OK = chartype == code[1 + IMM2_SIZE + 2]; + break; + + case PT_SC: + OK = UCD_SCRIPT(c) == code[1 + IMM2_SIZE + 2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ + OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: + OK = PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + 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 + 1 + IMM2_SIZE + 3, 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 + 2 + IMM2_SIZE, 0); } + count = current_state->count; /* Number already matched */ + if (clen > 0 && UCD_CATEGORY(c) != ucp_M) + { + const pcre_uchar *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 (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + if (++count >= GET2(code, 1)) + { ADD_NEW_DATA(-(state_offset + 2 + IMM2_SIZE), 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 + 2 + IMM2_SIZE, 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 + 2 + IMM2_SIZE), 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 + 2 + IMM2_SIZE, 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 + 2 + IMM2_SIZE), 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 + 2 + IMM2_SIZE, 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 + 2 + IMM2_SIZE), 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_CHARI: + if (clen == 0) break; + +#ifdef SUPPORT_UTF + if (utf) + { + 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_UTF */ + /* Not UTF mode */ + { + if (TABLE_GET(c, lcc, c) == TABLE_GET(d, 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 pcre_uchar *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; + } + if (nptr >= end_subject && (md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + 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) + { + ADD_NEW(state_offset + 1, 0); + if ((md->moptions & PCRE_PARTIAL_HARD) != 0) + reset_could_continue = TRUE; + } + else if (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 casefully. */ + + case OP_NOT: + if (clen > 0 && c != d) { ADD_NEW(state_offset + dlen + 1, 0); } + break; + + /*-----------------------------------------------------------------*/ + /* Match a negated single character caselessly. */ + + case OP_NOTI: + if (clen > 0) + { + unsigned int otherd; +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + if (c != d && c != otherd) + { ADD_NEW(state_offset + dlen + 1, 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTPOSPLUSI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + + /* Fall through */ + 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 (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, 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_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTPOSQUERYI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + 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 (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, 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_STARI: + case OP_MINSTARI: + case OP_POSSTARI: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPOSSTARI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + 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 (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, 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_EXACTI: + case OP_NOTEXACTI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_EXACT: + case OP_NOTEXACT: + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, fcc, d); + } + if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) + { + if (++count >= GET2(code, 1)) + { ADD_NEW(state_offset + dlen + 1 + IMM2_SIZE, 0); } + else + { ADD_NEW(state_offset, count); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_UPTOI: + case OP_MINUPTOI: + case OP_POSUPTOI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTPOSUPTOI: + caseless = TRUE; + codevalue -= OP_STARI - OP_STAR; + /* Fall through */ + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTPOSUPTO: + ADD_ACTIVE(state_offset + dlen + 1 + IMM2_SIZE, 0); + count = current_state->count; /* Number already matched */ + if (clen > 0) + { + unsigned int otherd = NOTACHAR; + if (caseless) + { +#ifdef SUPPORT_UTF + if (utf && d >= 128) + { +#ifdef SUPPORT_UCP + otherd = UCD_OTHERCASE(d); +#endif /* SUPPORT_UCP */ + } + else +#endif /* SUPPORT_UTF */ + otherd = TABLE_GET(d, 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 + 1 + IMM2_SIZE, 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 pcre_uchar *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 + 1 + (32 / sizeof(pcre_uchar)); + if (clen > 0) + { + isinclass = (c > 255)? (codevalue == OP_NCLASS) : + ((((pcre_uint8 *)(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 = PRIV(xclass)(c, code + 1 + LINK_SIZE, utf); + } + + /* 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 = (int)(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 + 1 + 2 * IMM2_SIZE, 0); } + if (isinclass) + { + int max = GET2(ecode, 1 + IMM2_SIZE); + if (++count >= max && max != 0) /* Max 0 => no limit */ + { ADD_NEW(next_state_offset + 1 + 2 * IMM2_SIZE, 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" assertion + (?!) is optimised to OP_FAIL when compiling, so we have to support that, + though the other "backtracking verbs" are not supported. */ + + case OP_FAIL: + forced_fail++; /* Count FAILs for multiple states */ + 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 pcre_uchar *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 */ + (int)(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 */ + rlevel); /* function recursion level */ + + if (rc == PCRE_ERROR_DFA_UITEM) return rc; + if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK)) + { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_COND: + case OP_SCOND: + { + int local_offsets[1000]; + int local_workspace[1000]; + int codelink = GET(code, 1); + int condcode; + + /* Because of the way auto-callout works during compile, a callout item + is inserted between OP_COND and an assertion condition. This does not + happen for the other conditions. */ + + if (code[LINK_SIZE+1] == OP_CALLOUT) + { + rrc = 0; + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = code[LINK_SIZE+2]; + cb.offset_vector = offsets; +#ifdef COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)start_subject; +#else + cb.subject = (PCRE_SPTR16)start_subject; +#endif + cb.subject_length = (int)(end_subject - start_subject); + cb.start_match = (int)(current_subject - start_subject); + cb.current_position = (int)(ptr - start_subject); + cb.pattern_position = GET(code, LINK_SIZE + 3); + cb.next_item_length = GET(code, 3 + 2*LINK_SIZE); + cb.capture_top = 1; + cb.capture_last = -1; + cb.callout_data = md->callout_data; + cb.mark = NULL; /* No (*MARK) support */ + if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc; /* Abandon */ + } + if (rrc > 0) break; /* Fail this thread */ + code += PRIV(OP_lengths)[OP_CALLOUT]; /* Skip callout data */ + } + + condcode = code[LINK_SIZE+1]; + + /* Back reference conditions are not supported */ + + if (condcode == OP_CREF || condcode == OP_NCREF) + return PCRE_ERROR_DFA_UCOND; + + /* The DEFINE condition is always false */ + + if (condcode == OP_DEF) + { ADD_ACTIVE(state_offset + codelink + 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 || condcode == OP_NRREF) + { + int value = GET2(code, LINK_SIZE + 2); + if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND; + if (md->recursive != NULL) + { ADD_ACTIVE(state_offset + LINK_SIZE + 2 + IMM2_SIZE, 0); } + else { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); } + } + + /* Otherwise, the condition is an assertion */ + + else + { + int rc; + const pcre_uchar *asscode = code + LINK_SIZE + 1; + const pcre_uchar *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 */ + (int)(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 */ + rlevel); /* function recursion level */ + + if (rc == PCRE_ERROR_DFA_UITEM) return rc; + if ((rc >= 0) == + (condcode == OP_ASSERT || condcode == OP_ASSERTBACK)) + { ADD_ACTIVE((int)(endasscode + LINK_SIZE + 1 - start_code), 0); } + else + { ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_RECURSE: + { + dfa_recursion_info *ri; + int local_offsets[1000]; + int local_workspace[1000]; + const pcre_uchar *callpat = start_code + GET(code, 1); + int recno = (callpat == md->start_code)? 0 : + GET2(callpat, 1 + LINK_SIZE); + int rc; + + DPRINTF(("%.*sStarting regex recursion\n", rlevel*2-2, SP)); + + /* Check for repeating a recursion without advancing the subject + pointer. This should catch convoluted mutual recursions. (Some simple + cases are caught at compile time.) */ + + for (ri = md->recursive; ri != NULL; ri = ri->prevrec) + if (recno == ri->group_num && ptr == ri->subject_position) + return PCRE_ERROR_RECURSELOOP; + + /* Remember this recursion and where we started it so as to + catch infinite loops. */ + + new_recursive.group_num = recno; + new_recursive.subject_position = ptr; + new_recursive.prevrec = md->recursive; + md->recursive = &new_recursive; + + rc = internal_dfa_exec( + md, /* fixed match data */ + callpat, /* this subexpression's code */ + ptr, /* where we currently are */ + (int)(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 */ + rlevel); /* function recursion level */ + + md->recursive = new_recursive.prevrec; /* Done this recursion */ + + DPRINTF(("%.*sReturn from regex recursion: rc=%d\n", rlevel*2-2, SP, + 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) + { + int charcount = local_offsets[rc+1] - local_offsets[rc]; +#ifdef SUPPORT_UTF + if (utf) + { + const pcre_uchar *p = start_subject + local_offsets[rc]; + const pcre_uchar *pp = start_subject + local_offsets[rc+1]; + while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; + } +#endif + 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_BRAPOS: + case OP_SBRAPOS: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + { + int charcount, matched_count; + const pcre_uchar *local_ptr = ptr; + BOOL allow_zero; + + if (codevalue == OP_BRAPOSZERO) + { + allow_zero = TRUE; + codevalue = *(++code); /* Codevalue will be one of above BRAs */ + } + else allow_zero = FALSE; + + /* Loop to match the subpattern as many times as possible as if it were + a complete pattern. */ + + for (matched_count = 0;; matched_count++) + { + int local_offsets[2]; + int local_workspace[1000]; + + int rc = internal_dfa_exec( + md, /* fixed match data */ + code, /* this subexpression's code */ + local_ptr, /* where we currently are */ + (int)(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 */ + rlevel); /* function recursion level */ + + /* Failed to match */ + + if (rc < 0) + { + if (rc != PCRE_ERROR_NOMATCH) return rc; + break; + } + + /* Matched: break the loop if zero characters matched. */ + + charcount = local_offsets[1] - local_offsets[0]; + if (charcount == 0) break; + local_ptr += charcount; /* Advance temporary position ptr */ + } + + /* At this point we have matched the subpattern matched_count + times, and local_ptr is pointing to the character after the end of the + last match. */ + + if (matched_count > 0 || allow_zero) + { + const pcre_uchar *end_subpattern = code; + int next_state_offset; + + do { end_subpattern += GET(end_subpattern, 1); } + while (*end_subpattern == OP_ALT); + next_state_offset = + (int)(end_subpattern - start_code + LINK_SIZE + 1); + + /* 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 matched substring is reached. */ + + if (i + 1 >= active_count && new_count == 0) + { + ptr = local_ptr; + clen = 0; + ADD_NEW(next_state_offset, 0); + } + else + { + const pcre_uchar *p = ptr; + const pcre_uchar *pp = local_ptr; + charcount = (int)(pp - p); +#ifdef SUPPORT_UTF + if (utf) while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; +#endif + ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1)); + } + } + } + break; + + /*-----------------------------------------------------------------*/ + case OP_ONCE: + case OP_ONCE_NC: + { + 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 */ + (int)(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 */ + rlevel); /* function recursion level */ + + if (rc >= 0) + { + const pcre_uchar *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 = + (int)(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)? + (int)(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 matched 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 + { +#ifdef SUPPORT_UTF + if (utf) + { + const pcre_uchar *p = start_subject + local_offsets[0]; + const pcre_uchar *pp = start_subject + local_offsets[1]; + while (p < pp) if (NOT_FIRSTCHAR(*p++)) charcount--; + } +#endif + 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: + rrc = 0; + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 1; /* Version 1 of the callout block */ + cb.callout_number = code[1]; + cb.offset_vector = offsets; +#ifdef COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)start_subject; +#else + cb.subject = (PCRE_SPTR16)start_subject; +#endif + cb.subject_length = (int)(end_subject - start_subject); + cb.start_match = (int)(current_subject - start_subject); + cb.current_position = (int)(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; + cb.mark = NULL; /* No (*MARK) support */ + if ((rrc = (*PUBL(callout))(&cb)) < 0) return rrc; /* Abandon */ + } + if (rrc == 0) + { ADD_ACTIVE(state_offset + PRIV(OP_lengths)[OP_CALLOUT], 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. + + The "forced_ fail" variable counts the number of (*F) encountered for the + character. If it is equal to the original active_count (saved in + workspace[1]) it means that (*F) was found on every active state. In this + case we don't want to give a partial match. + + The "could_continue" variable is true if a state could have continued but + for the fact that the end of the subject was reached. */ + + if (new_count <= 0) + { + if (rlevel == 1 && /* Top level, and */ + could_continue && /* Some could go on, and */ + forced_fail != workspace[1] && /* Not all forced fail & */ + ( /* either... */ + (md->moptions & PCRE_PARTIAL_HARD) != 0 /* Hard partial */ + || /* or... */ + ((md->moptions & PCRE_PARTIAL_SOFT) != 0 && /* Soft partial and */ + match_count < 0) /* no matches */ + ) && /* And... */ + ( + partial_newline || /* Either partial NL */ + ( /* or ... */ + ptr >= end_subject && /* End of subject and */ + ptr > md->start_used_ptr) /* Inspected non-empty string */ + ) + ) + { + if (offsetcount >= 2) + { + offsets[0] = (int)(md->start_used_ptr - start_subject); + offsets[1] = (int)(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 +*/ + +#ifdef COMPILE_PCRE8 +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) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_dfa_exec(const pcre16 *argument_re, const pcre16_extra *extra_data, + PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets, + int offsetcount, int *workspace, int wscount) +#endif +{ +REAL_PCRE *re = (REAL_PCRE *)argument_re; +dfa_match_data match_block; +dfa_match_data *md = &match_block; +BOOL utf, anchored, startline, firstline; +const pcre_uchar *current_subject, *end_subject; +const pcre_study_data *study = NULL; + +const pcre_uchar *req_char_ptr; +const pcre_uint8 *start_bits = NULL; +BOOL has_first_char = FALSE; +BOOL has_req_char = FALSE; +pcre_uchar first_char = 0; +pcre_uchar first_char2 = 0; +pcre_uchar req_char = 0; +pcre_uchar req_char2 = 0; +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; +if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +/* If restarting after a partial match, do some sanity checks on the contents +of the workspace. */ + +if ((options & PCRE_DFA_RESTART) != 0) + { + if ((workspace[0] & (-2)) != 0 || workspace[1] < 1 || + workspace[1] > (wscount - 2)/INTS_PER_STATEBLOCK) + return PCRE_ERROR_DFA_BADRESTART; + } + +/* Set up study, callout, and table data */ + +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; + } + +/* Set some local values */ + +current_subject = (const pcre_uchar *)subject + start_offset; +end_subject = (const pcre_uchar *)subject + length; +req_char_ptr = current_subject - 1; + +#ifdef SUPPORT_UTF +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +utf = (re->options & PCRE_UTF8) != 0; +#else +utf = 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 pcre_uchar *)argument_re + + re->name_table_offset + re->name_count * re->name_entry_size; +md->start_subject = (const pcre_uchar *)subject; +md->end_subject = end_subject; +md->start_offset = start_offset; +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 = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; 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_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0) + { + int erroroffset; + int errorcode = PRIV(valid_utf)((pcre_uchar *)subject, length, &erroroffset); + if (errorcode != 0) + { + if (offsetcount >= 2) + { + offsets[0] = erroroffset; + offsets[1] = errorcode; + } + return (errorcode <= PCRE_UTF8_ERR5 && (options & PCRE_PARTIAL_HARD) != 0)? + PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8; + } + if (start_offset > 0 && start_offset < length && + NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset])) + 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 = PRIV(default_tables); + +/* The "must be at the start of a line" flags are used in a loop when finding +where to start. */ + +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) + { + has_first_char = TRUE; + first_char = first_char2 = (pcre_uchar)(re->first_char); + if ((re->flags & PCRE_FCH_CASELESS) != 0) + { + first_char2 = TABLE_GET(first_char, md->tables + fcc_offset, first_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && first_char > 127) + first_char2 = UCD_OTHERCASE(first_char); +#endif + } + } + else + { + if (!startline && study != NULL && + (study->flags & 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) + { + has_req_char = TRUE; + req_char = req_char2 = (pcre_uchar)(re->req_char); + if ((re->flags & PCRE_RCH_CASELESS) != 0) + { + req_char2 = TABLE_GET(req_char, md->tables + fcc_offset, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && req_char > 127) + req_char2 = UCD_OTHERCASE(req_char); +#endif + } + } + +/* Call the main matching function, looping for a non-anchored regex after a +failed match. If not restarting, perform certain optimizations at the start of +a match. */ + +for (;;) + { + int rc; + + if ((options & PCRE_DFA_RESTART) == 0) + { + const pcre_uchar *save_end_subject = end_subject; + + /* 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) + { + PCRE_PUCHAR t = current_subject; +#ifdef SUPPORT_UTF + if (utf) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + ACROSSCHAR(t < end_subject, *t, t++); + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + /* There are some optimizations that avoid running the match if a known + starting point is not found. However, there is an option that disables + these, for testing and for ensuring that all callouts do actually occur. + The option can be set in the regex by (*NO_START_OPT) or passed in + match-time options. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0) + { + /* Advance to a known first char. */ + + if (has_first_char) + { + if (first_char != first_char2) + while (current_subject < end_subject && + *current_subject != first_char && *current_subject != first_char2) + current_subject++; + else + while (current_subject < end_subject && + *current_subject != first_char) + 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_UTF + if (utf) + { + while (current_subject < end_subject && + !WAS_NEWLINE(current_subject)) + { + current_subject++; + ACROSSCHAR(current_subject < end_subject, *current_subject, + 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] == CHAR_CR && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + current_subject < end_subject && + *current_subject == CHAR_NL) + 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; +#ifndef COMPILE_PCRE8 + if (c > 255) c = 255; +#endif + if ((start_bits[c/8] & (1 << (c&7))) == 0) + { + current_subject++; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + /* In non 8-bit mode, the iteration will stop for + characters > 255 at the beginning or not stop at all. */ + if (utf) + ACROSSCHAR(current_subject < end_subject, *current_subject, + current_subject++); +#endif + } + else break; + } + } + } + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + + /* The following two optimizations are disabled for partial matching or if + disabling is explicitly requested (and of course, by the test above, this + code is not obeyed when restarting after a partial match). */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && + (options & (PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT)) == 0) + { + /* If the pattern was studied, a minimum subject length may be set. This + is a lower bound; no actual string of that length may actually match the + pattern. Although the value is, strictly, in characters, we treat it as + bytes to avoid spending too much time in this optimization. */ + + if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 && + (pcre_uint32)(end_subject - current_subject) < study->minlength) + return PCRE_ERROR_NOMATCH; + + /* If req_char is set, we know that that character must appear in the + subject for the match to succeed. If the first character is set, req_char + 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. */ + + if (has_req_char && end_subject - current_subject < REQ_BYTE_MAX) + { + register PCRE_PUCHAR p = current_subject + (has_first_char? 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_char_ptr) + { + if (req_char != req_char2) + { + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_char || pp == req_char2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (*p++ == req_char) { 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_char_ptr = p; + } + } + } + } /* End of optimizations that are done when not restarting */ + + /* OK, now we can do the business */ + + md->start_used_ptr = current_subject; + md->recursive = NULL; + + 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 */ + 0); /* function 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++; +#ifdef SUPPORT_UTF + if (utf) + { + ACROSSCHAR(current_subject < end_subject, *current_subject, + current_subject++); + } +#endif + 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] == CHAR_CR && + current_subject < end_subject && + *current_subject == CHAR_NL && + (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..4eb27f0 --- /dev/null +++ b/glib/pcre/pcre_exec.c @@ -0,0 +1,7149 @@ +/************************************************* +* 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-2012 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 + +/* Values for setting in md->match_function_type to indicate two special types +of call to match(). We do it this way to save on using another stack variable, +as stack usage is to be discouraged. */ + +#define MATCH_CONDASSERT 1 /* Called to check a condition assertion */ +#define MATCH_CBEGROUP 2 /* 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_ACCEPT (-999) +#define MATCH_COMMIT (-998) +#define MATCH_KETRPOS (-997) +#define MATCH_ONCE (-996) +#define MATCH_PRUNE (-995) +#define MATCH_SKIP (-994) +#define MATCH_SKIP_ARG (-993) +#define MATCH_THEN (-992) + +/* 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 PCRE_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 pcre_uchar *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 * +*************************************************/ + +/* Normally, if a back reference hasn't been set, the length that is passed is +negative, so the match always fails. However, in JavaScript compatibility mode, +the length passed is zero. Note that in caseless UTF-8 mode, the number of +subject bytes matched may be different to the number of reference bytes. + +Arguments: + offset index into the offset vector + eptr pointer into the subject + length length of reference to be matched (number of bytes) + md points to match data block + caseless TRUE if caseless + +Returns: >= 0 the number of subject bytes matched + -1 no match + -2 partial match; always given if at end subject +*/ + +static int +match_ref(int offset, register PCRE_PUCHAR eptr, int length, match_data *md, + BOOL caseless) +{ +PCRE_PUCHAR eptr_start = eptr; +register PCRE_PUCHAR p = md->start_subject + md->offset_vector[offset]; + +#ifdef PCRE_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 reference not set (and not JavaScript compatible - in that +case the length is passed as zero). */ + +if (length < 0) return -1; + +/* 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 (caseless) + { +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + if (md->utf) + { + /* Match characters up to the end of the reference. NOTE: the number of + bytes matched may differ, because there are some characters whose upper and + lower case versions code as different numbers of bytes. For example, U+023A + (2 bytes in UTF-8) is the upper case version of U+2C65 (3 bytes in UTF-8); + a sequence of 3 of the former uses 6 bytes, as does a sequence of two of + the latter. It is important, therefore, to check the length along the + reference, not along the subject (earlier code did this wrong). */ + + PCRE_PUCHAR endptr = p + length; + while (p < endptr) + { + int c, d; + if (eptr >= md->end_subject) return -2; /* Partial match */ + GETCHARINC(c, eptr); + GETCHARINC(d, p); + if (c != d && c != UCD_OTHERCASE(d)) return -1; + } + } + 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 (eptr >= md->end_subject) return -2; /* Partial match */ + if (TABLE_GET(*p, md->lcc, *p) != TABLE_GET(*eptr, md->lcc, *eptr)) return -1; + p++; + eptr++; + } + } + } + +/* In the caseful case, we can just compare the bytes, whether or not we +are in UTF-8 mode. */ + +else + { + while (length-- > 0) + { + if (eptr >= md->end_subject) return -2; /* Partial match */ + if (*p++ != *eptr++) return -1; + } + } + +return (int)(eptr - eptr_start); +} + + + +/*************************************************************************** +**************************************************************************** + 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, RM55, RM56, RM57, RM58, RM59, RM60, + RM61, RM62, RM63, RM64, RM65, RM66 }; + +/* 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 +actually used in this definition. */ + +#ifndef NO_RECURSE +#define REGISTER register + +#ifdef PCRE_DEBUG +#define RMATCH(ra,rb,rc,rd,re,rw) \ + { \ + printf("match() called in line %d\n", __LINE__); \ + rrc = match(ra,rb,mstart,rc,rd,re,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,rw) \ + rrc = match(ra,rb,mstart,rc,rd,re,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,rw)\ + {\ + heapframe *newframe = frame->Xnextframe;\ + if (newframe == NULL)\ + {\ + newframe = (heapframe *)(PUBL(stack_malloc))(sizeof(heapframe));\ + if (newframe == NULL) RRETURN(PCRE_ERROR_NOMEMORY);\ + newframe->Xnextframe = NULL;\ + frame->Xnextframe = newframe;\ + }\ + frame->Xwhere = rw;\ + newframe->Xeptr = ra;\ + newframe->Xecode = rb;\ + newframe->Xmstart = mstart;\ + newframe->Xoffset_top = rc;\ + newframe->Xeptrb = re;\ + 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 *oldframe = frame;\ + frame = oldframe->Xprevframe;\ + 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; + struct heapframe *Xnextframe; + + /* Function arguments that may change */ + + PCRE_PUCHAR Xeptr; + const pcre_uchar *Xecode; + PCRE_PUCHAR Xmstart; + int Xoffset_top; + eptrblock *Xeptrb; + unsigned int Xrdepth; + + /* Function local variables */ + + PCRE_PUCHAR Xcallpat; +#ifdef SUPPORT_UTF + PCRE_PUCHAR Xcharptr; +#endif + PCRE_PUCHAR Xdata; + PCRE_PUCHAR Xnext; + PCRE_PUCHAR Xpp; + PCRE_PUCHAR Xprev; + PCRE_PUCHAR Xsaved_eptr; + + recursion_info Xnew_recursive; + + BOOL Xcur_is_word; + BOOL Xcondition; + BOOL Xprev_is_word; + +#ifdef SUPPORT_UCP + int Xprop_type; + int Xprop_value; + int Xprop_fail_result; + int Xoclength; + pcre_uchar Xocchars[6]; +#endif + + int Xcodelink; + 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. */ + +/* These macros pack up tests that are used for partial matching, and which +appear several times in the code. We set the "hit end" flag if the pointer is +at the end of the subject and also past the start of the subject (i.e. +something has been matched). For hard partial matching, we then return +immediately. The second one is used when we already know we are past the end of +the subject. */ + +#define CHECK_PARTIAL()\ + if (md->partial != 0 && eptr >= md->end_subject && \ + eptr > md->start_used_ptr) \ + { \ + md->hitend = TRUE; \ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \ + } + +#define SCHECK_PARTIAL()\ + if (md->partial != 0 && eptr > md->start_used_ptr) \ + { \ + md->hitend = TRUE; \ + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); \ + } + + +/* Performance note: It might be tempting to extract commonly used fields from +the md structure (e.g. utf, 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 + eptrb pointer to chain of blocks containing eptr at start of + brackets - for testing for empty matches + rdepth the recursion depth + +Returns: MATCH_MATCH if matched ) these values are >= 0 + MATCH_NOMATCH if failed to match ) + a negative MATCH_xxx value for PRUNE, SKIP, etc + 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 PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, + PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb, + 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 utf; /* Local copy of UTF flag for speed */ + +BOOL minimize, possessive; /* Quantifier options */ +BOOL caseless; +int condcode; + +/* When recursion is not being used, all "local" variables that have to be +preserved over calls to RMATCH() are part of a "frame". We set up the top-level +frame on the stack here; subsequent instantiations are obtained from the heap +whenever RMATCH() does a "recursion". See the macro definitions above. Putting +the top-level on the stack rather than malloc-ing them all gives a performance +boost in many cases where there is not much "recursion". */ + +#ifdef NO_RECURSE +heapframe *frame = (heapframe *)md->match_frames_base; + +/* Copy in the original argument variables */ + +frame->Xeptr = eptr; +frame->Xecode = ecode; +frame->Xmstart = mstart; +frame->Xoffset_top = offset_top; +frame->Xeptrb = eptrb; +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 eptrb frame->Xeptrb +#define rdepth frame->Xrdepth + +/* Ditto for the local variables */ + +#ifdef SUPPORT_UTF +#define charptr frame->Xcharptr +#endif +#define callpat frame->Xcallpat +#define codelink frame->Xcodelink +#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 + +#ifdef SUPPORT_UCP +#define prop_type frame->Xprop_type +#define prop_value frame->Xprop_value +#define prop_fail_result frame->Xprop_fail_result +#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 + +/* Many of the following variables are used only in small blocks of the code. +My normal style of coding would have declared them within each of those blocks. +However, in order to accommodate the version of this code that uses an external +"stack" implemented on the heap, it is easier to declare them all here, so the +declarations can be cut out in a block. The only declarations within blocks +below are for variables that do not have to be preserved over a recursive call +to RMATCH(). */ + +#ifdef SUPPORT_UTF +const pcre_uchar *charptr; +#endif +const pcre_uchar *callpat; +const pcre_uchar *data; +const pcre_uchar *next; +PCRE_PUCHAR pp; +const pcre_uchar *prev; +PCRE_PUCHAR saved_eptr; + +recursion_info new_recursive; + +BOOL cur_is_word; +BOOL condition; +BOOL prev_is_word; + +#ifdef SUPPORT_UCP +int prop_type; +int prop_value; +int prop_fail_result; +int oclength; +pcre_uchar occhars[6]; +#endif + +int codelink; +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; + +/* There is a special fudge for calling match() in a way that causes it to +measure the size of its basic stack frame when the stack is being used for +recursion. The second argument (ecode) being NULL triggers this behaviour. It +cannot normally ever be NULL. The return is the negated value of the frame +size. */ + +if (ecode == NULL) + { + if (rdepth == 0) + return match((PCRE_PUCHAR)&rdepth, NULL, NULL, 0, NULL, NULL, 1); + else + { + int len = (char *)&rdepth - (char *)eptr; + return (len > 0)? -len : len; + } + } +#endif /* NO_RECURSE */ + +/* To save space on the stack and in the heap frame, I have doubled up on some +of the local variables that are used only in localised parts of the code, but +still need to be preserved over recursive calls of match(). These macros define +the alternative names that are used. */ + +#define allow_zero cur_is_word +#define cbegroup condition +#define code_offset codelink +#define condassert condition +#define matched_once prev_is_word +#define foc number +#define save_mark data + +/* 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 PCRE_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_UTF +utf = md->utf; /* Local copy of the flag */ +#else +utf = 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); + +/* At the start of a group with an unlimited repeat that may match an empty +string, the variable md->match_function_type is set to MATCH_CBEGROUP. It is +done this way to save having to use another function argument, which would take +up space on the stack. See also MATCH_CONDASSERT below. + +When MATCH_CBEGROUP is set, 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 feature 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 (md->match_function_type == MATCH_CBEGROUP) + { + newptrb.epb_saved_eptr = eptr; + newptrb.epb_prev = eptrb; + eptrb = &newptrb; + md->match_function_type = 0; + } + +/* Now start processing the opcodes. */ + +for (;;) + { + minimize = possessive = FALSE; + op = *ecode; + + switch(op) + { + case OP_MARK: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM55); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + + /* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an + argument, and we must check whether that argument matches this MARK's + argument. It is passed back in md->start_match_ptr (an overloading of that + variable). If it does match, we reset that variable to the current subject + position and return MATCH_SKIP. Otherwise, pass back the return code + unaltered. */ + + else if (rrc == MATCH_SKIP_ARG && + STRCMP_UC_UC(ecode + 2, md->start_match_ptr) == 0) + { + md->start_match_ptr = eptr; + RRETURN(MATCH_SKIP); + } + RRETURN(rrc); + + case OP_FAIL: + RRETURN(MATCH_NOMATCH); + + /* COMMIT overrides PRUNE, SKIP, and THEN */ + + case OP_COMMIT: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM52); + if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && + rrc != MATCH_SKIP && rrc != MATCH_SKIP_ARG && + rrc != MATCH_THEN) + RRETURN(rrc); + RRETURN(MATCH_COMMIT); + + /* PRUNE overrides THEN */ + + case OP_PRUNE: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM51); + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + RRETURN(MATCH_PRUNE); + + case OP_PRUNE_ARG: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM56); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + RRETURN(MATCH_PRUNE); + + /* SKIP overrides PRUNE and THEN */ + + case OP_SKIP: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM53); + if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) + RRETURN(rrc); + md->start_match_ptr = eptr; /* Pass back current position */ + RRETURN(MATCH_SKIP); + + /* Note that, for Perl compatibility, SKIP with an argument does NOT set + nomatch_mark. There is a flag that disables this opcode when re-matching a + pattern that ended with a SKIP for which there was not a matching MARK. */ + + case OP_SKIP_ARG: + if (md->ignore_skip_arg) + { + ecode += PRIV(OP_lengths)[*ecode] + ecode[1]; + break; + } + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md, + eptrb, RM57); + if (rrc != MATCH_NOMATCH && rrc != MATCH_PRUNE && rrc != MATCH_THEN) + RRETURN(rrc); + + /* Pass back the current skip name by overloading md->start_match_ptr and + returning the special MATCH_SKIP_ARG return code. This will either be + caught by a matching MARK, or get to the top, where it causes a rematch + with the md->ignore_skip_arg flag set. */ + + md->start_match_ptr = ecode + 2; + RRETURN(MATCH_SKIP_ARG); + + /* For THEN (and THEN_ARG) we pass back the address of the opcode, so that + the branch in which it occurs can be determined. Overload the start of + match pointer to do this. */ + + case OP_THEN: + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM54); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = ecode; + RRETURN(MATCH_THEN); + + case OP_THEN_ARG: + md->nomatch_mark = ecode + 2; + md->mark = NULL; /* In case previously set by assertion */ + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, + md, eptrb, RM58); + if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) && + md->mark == NULL) md->mark = ecode + 2; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->start_match_ptr = ecode; + RRETURN(MATCH_THEN); + + /* Handle an atomic group that does not contain any capturing parentheses. + This can be handled like an assertion. Prior to 8.13, all atomic groups + were handled this way. In 8.13, the code was changed as below for ONCE, so + that backups pass through the group and thereby reset captured values. + However, this uses a lot more stack, so in 8.20, atomic groups that do not + contain any captures generate OP_ONCE_NC, which can be handled in the old, + less stack intensive way. + + 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, but resetting + the start-of-match value in case it was changed by \K. */ + + case OP_ONCE_NC: + prev = ecode; + saved_eptr = eptr; + save_mark = md->mark; + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM64); + if (rrc == MATCH_MATCH) /* Note: _not_ MATCH_ACCEPT */ + { + mstart = md->start_match_ptr; + break; + } + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += GET(ecode,1); + md->mark = save_mark; + } + while (*ecode == OP_ALT); + + /* If hit the end of the group (which could be repeated), fail */ + + if (*ecode != OP_ONCE_NC && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); + + /* Continue as from after the group, 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 (*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. */ + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM65); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode = prev; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM66); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += 1 + LINK_SIZE; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* Handle a capturing bracket, other than those that are possessive with an + unlimited repeat. 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. A failure to match might occur after the group has succeeded, + if something later on doesn't match. For this reason, we need to restore + the working 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 PCRE_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; + save_mark = md->mark; + + DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); + md->offset_vector[md->offset_end - number] = + (int)(eptr - md->start_subject); + + for (;;) + { + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM1); + if (rrc == MATCH_ONCE) break; /* Backing up through an atomic group */ + + /* If we backed up to a THEN, check whether it is within the current + branch by comparing the address of the THEN that is passed back with + the end of the branch. If it is within the current branch, and the + branch is one of two or more alternatives (it either starts or ends + with OP_ALT), we have reached the limit of THEN's action, so convert + the return code to NOMATCH, which will cause normal backtracking to + happen from now on. Otherwise, THEN is passed back to an outer + alternative. This implements Perl's treatment of parenthesized groups, + where a group not containing | does not affect the current alternative, + that is, (X) is NOT the same as (X|(*F)). */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + /* Anything other than NOMATCH is passed back. */ + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->capture_last = save_capture_last; + ecode += GET(ecode, 1); + md->mark = save_mark; + if (*ecode != OP_ALT) break; + } + + 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; + + /* At this point, rrc will be one of MATCH_ONCE or MATCH_NOMATCH. */ + + RRETURN(rrc); + } + + /* 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 or atomic group, except for possessive with unlimited + repeat and ONCE group with no captures. Loop for all the alternatives. + + When we get to the final alternative within the brackets, we used to return + the result of a recursive call to match() whatever happened so it was + possible to reduce stack usage by turning this into a tail recursion, + except in the case of a possibly empty group. However, now that there is + the possiblity of (*THEN) occurring in the final alternative, this + optimization is no longer always possible. + + We can optimize if we know there are no (*THEN)s in the pattern; at present + this is the best that can be done. + + MATCH_ONCE is returned when the end of an atomic group is successfully + reached, but subsequent matching fails. It passes back up the tree (causing + captured values to be reset) until the original atomic group level is + reached. This is tested by comparing md->once_target with the start of the + group. At this point, the return is converted into MATCH_NOMATCH so that + previous backup points can be taken. */ + + case OP_ONCE: + case OP_BRA: + case OP_SBRA: + DPRINTF(("start non-capturing bracket\n")); + + for (;;) + { + if (op >= OP_SBRA || op == OP_ONCE) + md->match_function_type = MATCH_CBEGROUP; + + /* If this is not a possibly empty group, and there are no (*THEN)s in + the pattern, and this is the final alternative, optimize as described + above. */ + + else if (!md->hasthen && ecode[GET(ecode, 1)] != OP_ALT) + { + ecode += PRIV(OP_lengths)[*ecode]; + goto TAIL_RECURSE; + } + + /* In all other cases, we have to make another call to match(). */ + + save_mark = md->mark; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, eptrb, + RM2); + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) + { + if (rrc == MATCH_ONCE) + { + const pcre_uchar *scode = ecode; + if (*scode != OP_ONCE) /* If not at start, find it */ + { + while (*scode == OP_ALT) scode += GET(scode, 1); + scode -= GET(scode, 1); + } + if (md->once_target == scode) rrc = MATCH_NOMATCH; + } + RRETURN(rrc); + } + ecode += GET(ecode, 1); + md->mark = save_mark; + if (*ecode != OP_ALT) break; + } + + RRETURN(MATCH_NOMATCH); + + /* Handle possessive capturing brackets with an unlimited repeat. We come + here from BRAZERO with allow_zero set TRUE. The offset_vector values are + handled similarly to the normal case above. However, the matching is + different. The end of these brackets will always be OP_KETRPOS, which + returns MATCH_KETRPOS without going further in the pattern. By this means + we can handle the group by iteration rather than recursion, thereby + reducing the amount of stack needed. */ + + case OP_CBRAPOS: + case OP_SCBRAPOS: + allow_zero = FALSE; + + POSSESSIVE_CAPTURE: + number = GET2(ecode, 1+LINK_SIZE); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("start possessive bracket %d\n", number); + printf("subject="); + pchars(eptr, 16, TRUE, md); + printf("\n"); +#endif + + if (offset < md->offset_max) + { + matched_once = FALSE; + code_offset = (int)(ecode - md->start_code); + + 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)); + + /* Each time round the loop, save the current subject position for use + when the group matches. For MATCH_MATCH, the group has matched, so we + restart it with a new subject starting position, remembering that we had + at least one match. For MATCH_NOMATCH, carry on with the alternatives, as + usual. If we haven't matched any alternatives in any iteration, check to + see if a previous iteration matched. If so, the group has matched; + continue from afterwards. Otherwise it has failed; restore the previous + capture values before returning NOMATCH. */ + + for (;;) + { + md->offset_vector[md->offset_end - number] = + (int)(eptr - md->start_subject); + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM63); + if (rrc == MATCH_KETRPOS) + { + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + ecode = md->start_code + code_offset; + save_capture_last = md->capture_last; + matched_once = TRUE; + continue; + } + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->capture_last = save_capture_last; + ecode += GET(ecode, 1); + if (*ecode != OP_ALT) break; + } + + if (!matched_once) + { + md->offset_vector[offset] = save_offset1; + md->offset_vector[offset+1] = save_offset2; + md->offset_vector[md->offset_end - number] = save_offset3; + } + + if (allow_zero || matched_once) + { + ecode += 1 + LINK_SIZE; + break; + } + + 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 possessive bracket with unlimited repeat. We come here + from BRAZERO with allow_zero = TRUE. The code is similar to the above, + without the capturing complication. It is written out separately for speed + and cleanliness. */ + + case OP_BRAPOS: + case OP_SBRAPOS: + allow_zero = FALSE; + + POSSESSIVE_NON_CAPTURE: + matched_once = FALSE; + code_offset = (int)(ecode - md->start_code); + + for (;;) + { + if (op >= OP_SBRA) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode], offset_top, md, + eptrb, RM48); + if (rrc == MATCH_KETRPOS) + { + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + ecode = md->start_code + code_offset; + matched_once = TRUE; + continue; + } + + /* See comment in the code for capturing groups above about handling + THEN. */ + + if (rrc == MATCH_THEN) + { + next = ecode + GET(ecode,1); + if (md->start_match_ptr < next && + (*ecode == OP_ALT || *next == OP_ALT)) + rrc = MATCH_NOMATCH; + } + + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + ecode += GET(ecode, 1); + if (*ecode != OP_ALT) break; + } + + if (matched_once || allow_zero) + { + ecode += 1 + LINK_SIZE; + break; + } + RRETURN(MATCH_NOMATCH); + + /* 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. */ + + case OP_COND: + case OP_SCOND: + codelink = GET(ecode, 1); + + /* Because of the way auto-callout works during compile, a callout item is + inserted between OP_COND and an assertion condition. */ + + if (ecode[LINK_SIZE+1] == OP_CALLOUT) + { + if (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 2; /* Version 1 of the callout block */ + cb.callout_number = ecode[LINK_SIZE+2]; + cb.offset_vector = md->offset_vector; +#ifdef COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)md->start_subject; +#else + cb.subject = (PCRE_SPTR16)md->start_subject; +#endif + cb.subject_length = (int)(md->end_subject - md->start_subject); + cb.start_match = (int)(mstart - md->start_subject); + cb.current_position = (int)(eptr - md->start_subject); + cb.pattern_position = GET(ecode, LINK_SIZE + 3); + cb.next_item_length = GET(ecode, 3 + 2*LINK_SIZE); + cb.capture_top = offset_top/2; + cb.capture_last = md->capture_last; + cb.callout_data = md->callout_data; + cb.mark = md->nomatch_mark; + if ((rrc = (*PUBL(callout))(&cb)) > 0) RRETURN(MATCH_NOMATCH); + if (rrc < 0) RRETURN(rrc); + } + ecode += PRIV(OP_lengths)[OP_CALLOUT]; + } + + condcode = ecode[LINK_SIZE+1]; + + /* Now see what the actual condition is */ + + if (condcode == OP_RREF || condcode == OP_NRREF) /* Recursion test */ + { + if (md->recursive == NULL) /* Not recursing => FALSE */ + { + condition = FALSE; + ecode += GET(ecode, 1); + } + else + { + int recno = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ + condition = (recno == RREF_ANY || recno == md->recursive->group_num); + + /* If the test is for recursion into a specific subpattern, and it is + false, but the test was set up by name, scan the table to see if the + name refers to any other numbers, and test them. The condition is true + if any one is set. */ + + if (!condition && condcode == OP_NRREF) + { + pcre_uchar *slotA = md->name_table; + for (i = 0; i < md->name_count; i++) + { + if (GET2(slotA, 0) == recno) break; + slotA += md->name_entry_size; + } + + /* Found a name for the number - there can be only one; duplicate + names for different numbers are allowed, but not vice versa. First + scan down for duplicates. */ + + if (i < md->name_count) + { + pcre_uchar *slotB = slotA; + while (slotB > md->name_table) + { + slotB -= md->name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = GET2(slotB, 0) == md->recursive->group_num; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + + if (!condition) + { + slotB = slotA; + for (i++; i < md->name_count; i++) + { + slotB += md->name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = GET2(slotB, 0) == md->recursive->group_num; + if (condition) break; + } + else break; + } + } + } + } + + /* Chose branch according to the condition */ + + ecode += condition? 1 + IMM2_SIZE : GET(ecode, 1); + } + } + + else if (condcode == OP_CREF || condcode == OP_NCREF) /* Group used test */ + { + offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ + condition = offset < offset_top && md->offset_vector[offset] >= 0; + + /* If the numbered capture is unset, but the reference was by name, + scan the table to see if the name refers to any other numbers, and test + them. The condition is true if any one is set. This is tediously similar + to the code above, but not close enough to try to amalgamate. */ + + if (!condition && condcode == OP_NCREF) + { + int refno = offset >> 1; + pcre_uchar *slotA = md->name_table; + + for (i = 0; i < md->name_count; i++) + { + if (GET2(slotA, 0) == refno) break; + slotA += md->name_entry_size; + } + + /* Found a name for the number - there can be only one; duplicate names + for different numbers are allowed, but not vice versa. First scan down + for duplicates. */ + + if (i < md->name_count) + { + pcre_uchar *slotB = slotA; + while (slotB > md->name_table) + { + slotB -= md->name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + offset = GET2(slotB, 0) << 1; + condition = offset < offset_top && + md->offset_vector[offset] >= 0; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + + if (!condition) + { + slotB = slotA; + for (i++; i < md->name_count; i++) + { + slotB += md->name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + offset = GET2(slotB, 0) << 1; + condition = offset < offset_top && + md->offset_vector[offset] >= 0; + if (condition) break; + } + else break; + } + } + } + } + + /* Chose branch according to the condition */ + + ecode += condition? 1 + IMM2_SIZE : GET(ecode, 1); + } + + else if (condcode == OP_DEF) /* DEFINE - always false */ + { + condition = FALSE; + ecode += GET(ecode, 1); + } + + /* The condition is an assertion. Call match() to evaluate it - setting + md->match_function_type to MATCH_CONDASSERT causes it to stop at the end of + an assertion. */ + + else + { + md->match_function_type = MATCH_CONDASSERT; + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM3); + if (rrc == MATCH_MATCH) + { + if (md->end_offset_top > offset_top) + offset_top = md->end_offset_top; /* Captures may have happened */ + condition = TRUE; + ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE + 2); + while (*ecode == OP_ALT) ecode += GET(ecode, 1); + } + + /* PCRE doesn't allow the effect of (*THEN) to escape beyond an + assertion; it is therefore treated as NOMATCH. */ + + else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) + { + RRETURN(rrc); /* Need braces because of following else */ + } + else + { + condition = FALSE; + ecode += codelink; + } + } + + /* We are now at the branch that is to be obeyed. As there is only one, can + use tail recursion to avoid using another stack frame, except when there is + unlimited repeat of a possibly empty group. In the latter case, a recursive + call to match() is always required, unless the second alternative doesn't + exist, in which case we can just plough on. Note that, for compatibility + with Perl, the | in a conditional group is NOT treated as creating two + alternatives. If a THEN is encountered in the branch, it propagates out to + the enclosing alternative (unless nested in a deeper set of alternatives, + of course). */ + + if (condition || *ecode == OP_ALT) + { + if (op != OP_SCOND) + { + ecode += 1 + LINK_SIZE; + goto TAIL_RECURSE; + } + + md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM49); + RRETURN(rrc); + } + + /* Condition false & no alternative; continue after the group. */ + + else + { + ecode += 1 + LINK_SIZE; + } + break; + + + /* Before OP_ACCEPT there may be any number of OP_CLOSE opcodes, + to close any currently open capturing brackets. */ + + case OP_CLOSE: + number = GET2(ecode, 1); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("end bracket %d at *ACCEPT", 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] = (int)(eptr - md->start_subject); + if (offset_top <= offset) offset_top = offset + 2; + } + ecode += 1 + IMM2_SIZE; + break; + + + /* End of the pattern, either real or forced. */ + + case OP_END: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + + /* If we have matched an empty string, fail if not in an assertion and not + in a recursion if either PCRE_NOTEMPTY is set, or if PCRE_NOTEMPTY_ATSTART + is set and we have matched at the start of the subject. In both cases, + backtracking will then try other alternatives, if any. */ + + if (eptr == mstart && op != OP_ASSERT_ACCEPT && + md->recursive == NULL && + (md->notempty || + (md->notempty_atstart && + mstart == md->start_subject + md->start_offset))) + RRETURN(MATCH_NOMATCH); + + /* Otherwise, we have a match. */ + + 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) */ + + /* For some reason, the macros don't work properly if an expression is + given as the argument to RRETURN when the heap is in use. */ + + rrc = (op == OP_END)? MATCH_MATCH : MATCH_ACCEPT; + RRETURN(rrc); + + /* 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. When the assertion is part + of a condition, we want to return immediately afterwards. The caller of + this incarnation of the match() function will have set MATCH_CONDASSERT in + md->match_function type, and one of these opcodes will be the first opcode + that is processed. We use a local variable that is preserved over calls to + match() to remember this case. */ + + case OP_ASSERT: + case OP_ASSERTBACK: + save_mark = md->mark; + if (md->match_function_type == MATCH_CONDASSERT) + { + condassert = TRUE; + md->match_function_type = 0; + } + else condassert = FALSE; + + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM4); + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) + { + mstart = md->start_match_ptr; /* In case \K reset it */ + break; + } + md->mark = save_mark; + + /* A COMMIT failure must fail the entire assertion, without trying any + subsequent branches. */ + + if (rrc == MATCH_COMMIT) RRETURN(MATCH_NOMATCH); + + /* PCRE does not allow THEN to escape beyond an assertion; it + is treated as NOMATCH. */ + + 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 (condassert) 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. Encountering SKIP, + PRUNE, or COMMIT means we must assume failure without checking subsequent + branches. */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK_NOT: + save_mark = md->mark; + if (md->match_function_type == MATCH_CONDASSERT) + { + condassert = TRUE; + md->match_function_type = 0; + } + else condassert = FALSE; + + do + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, NULL, RM5); + md->mark = save_mark; + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) RRETURN(MATCH_NOMATCH); + if (rrc == MATCH_SKIP || rrc == MATCH_PRUNE || rrc == MATCH_COMMIT) + { + do ecode += GET(ecode,1); while (*ecode == OP_ALT); + break; + } + + /* PCRE does not allow THEN to escape beyond an assertion; it is treated + as NOMATCH. */ + + if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); + ecode += GET(ecode,1); + } + while (*ecode == OP_ALT); + + if (condassert) RRETURN(MATCH_MATCH); /* Condition assertion */ + + 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_UTF + if (utf) + { + 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); + } + + /* Save the earliest consulted character, then skip to next op code */ + + if (eptr < md->start_used_ptr) md->start_used_ptr = eptr; + 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 (PUBL(callout) != NULL) + { + PUBL(callout_block) cb; + cb.version = 2; /* Version 1 of the callout block */ + cb.callout_number = ecode[1]; + cb.offset_vector = md->offset_vector; +#ifdef COMPILE_PCRE8 + cb.subject = (PCRE_SPTR)md->start_subject; +#else + cb.subject = (PCRE_SPTR16)md->start_subject; +#endif + cb.subject_length = (int)(md->end_subject - md->start_subject); + cb.start_match = (int)(mstart - md->start_subject); + cb.current_position = (int)(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; + cb.mark = md->nomatch_mark; + if ((rrc = (*PUBL(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.) + + The state of the capturing groups is preserved over recursion, and + re-instated afterwards. We don't know how many are started and not yet + finished (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. + + 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. It has, however, been hacked around + a lot, so he is not to blame for the current way it works. */ + + case OP_RECURSE: + { + recursion_info *ri; + int recno; + + callpat = md->start_code + GET(ecode, 1); + recno = (callpat == md->start_code)? 0 : + GET2(callpat, 1 + LINK_SIZE); + + /* Check for repeating a recursion without advancing the subject pointer. + This should catch convoluted mutual recursions. (Some simple cases are + caught at compile time.) */ + + for (ri = md->recursive; ri != NULL; ri = ri->prevrec) + if (recno == ri->group_num && eptr == ri->subject_position) + RRETURN(PCRE_ERROR_RECURSELOOP); + + /* Add to "recursing stack" */ + + new_recursive.group_num = recno; + new_recursive.subject_position = eptr; + new_recursive.prevrec = md->recursive; + md->recursive = &new_recursive; + + /* Where to continue from afterwards */ + + ecode += 1 + LINK_SIZE; + + /* 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 *)(PUBL(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)); + + /* OK, now we can do the recursion. After processing each alternative, + restore the offset data. If there were nested recursions, md->recursive + might be changed, so reset it before looping. */ + + DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); + cbegroup = (*callpat >= OP_SBRA); + do + { + if (cbegroup) md->match_function_type = MATCH_CBEGROUP; + RMATCH(eptr, callpat + PRIV(OP_lengths)[*callpat], offset_top, + md, eptrb, RM6); + memcpy(md->offset_vector, new_recursive.offset_save, + new_recursive.saved_max * sizeof(int)); + md->recursive = new_recursive.prevrec; + if (rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) + { + DPRINTF(("Recursion matched\n")); + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + + /* Set where we got to in the subject, and reset the start in case + it was changed by \K. This *is* propagated back out of a recursion, + for Perl compatibility. */ + + eptr = md->end_match_ptr; + mstart = md->start_match_ptr; + goto RECURSION_MATCHED; /* Exit loop; end processing */ + } + + /* PCRE does not allow THEN or COMMIT to escape beyond a recursion; it + is treated as NOMATCH. */ + + else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN && + rrc != MATCH_COMMIT) + { + DPRINTF(("Recursion gave error %d\n", rrc)); + if (new_recursive.offset_save != stacksave) + (PUBL(free))(new_recursive.offset_save); + RRETURN(rrc); + } + + md->recursive = &new_recursive; + 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) + (PUBL(free))(new_recursive.offset_save); + RRETURN(MATCH_NOMATCH); + } + + RECURSION_MATCHED: + break; + + /* 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, eptrb, 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, eptrb, 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; + + /* BRAPOSZERO occurs before a possessive bracket group. Don't do anything + here; just jump to the group, with allow_zero set TRUE. */ + + case OP_BRAPOSZERO: + op = *(++ecode); + allow_zero = TRUE; + if (op == OP_CBRAPOS || op == OP_SCBRAPOS) goto POSSESSIVE_CAPTURE; + goto POSSESSIVE_NON_CAPTURE; + + /* End of a group, repeated or non-repeating. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + case OP_KETRPOS: + 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 || *prev == OP_ONCE) + { + 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 or a non-capturing atomic + group, stop matching and return MATCH_MATCH, but record the current high + water mark for use by positive assertions. We also need to record the match + start in case it was changed by \K. */ + + if ((*prev >= OP_ASSERT && *prev <= OP_ASSERTBACK_NOT) || + *prev == OP_ONCE_NC) + { + md->end_match_ptr = eptr; /* For ONCE_NC */ + md->end_offset_top = offset_top; + md->start_match_ptr = mstart; + RRETURN(MATCH_MATCH); /* Sets md->mark */ + } + + /* 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. 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. We just have to record + the current subject position and start match pointer and give a MATCH + return. */ + + if (*prev == OP_CBRA || *prev == OP_SCBRA || + *prev == OP_CBRAPOS || *prev == OP_SCBRAPOS) + { + number = GET2(prev, 1+LINK_SIZE); + offset = number << 1; + +#ifdef PCRE_DEBUG + printf("end bracket %d", number); + printf("\n"); +#endif + + /* Handle a recursively called group. */ + + if (md->recursive != NULL && md->recursive->group_num == number) + { + md->end_match_ptr = eptr; + md->start_match_ptr = mstart; + RRETURN(MATCH_MATCH); + } + + /* Deal with capturing */ + + md->capture_last = number; + if (offset >= md->offset_max) md->offset_overflow = TRUE; else + { + /* If offset is greater than offset_top, it means that we are + "skipping" a capturing group, and that group's offsets must be marked + unset. In earlier versions of PCRE, all the offsets were unset at the + start of matching, but this doesn't work because atomic groups and + assertions can cause a value to be set that should later be unset. + Example: matching /(?>(a))b|(a)c/ against "ac". This sets group 1 as + part of the atomic group, but this is not on the final matching path, + so must be unset when 2 is set. (If there is no group 2, there is no + problem, because offset_top will then be 2, indicating no capture.) */ + + if (offset > offset_top) + { + register int *iptr = md->offset_vector + offset_top; + register int *iend = md->offset_vector + offset; + while (iptr < iend) *iptr++ = -1; + } + + /* Now make the extraction */ + + md->offset_vector[offset] = + md->offset_vector[md->offset_end - number]; + md->offset_vector[offset+1] = (int)(eptr - md->start_subject); + if (offset_top <= offset) offset_top = offset + 2; + } + } + + /* For an ordinary 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. For a non-repeating atomic group that includes captures, + establish a backup point by processing the rest of the pattern at a lower + level. If this results in a NOMATCH return, pass MATCH_ONCE back to the + original OP_ONCE level, thereby bypassing intermediate backup points, but + resetting any captures that happened along the way. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + if (*prev == OP_ONCE) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM12); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; /* Level at which to change to MATCH_NOMATCH */ + RRETURN(MATCH_ONCE); + } + ecode += 1 + LINK_SIZE; /* Carry on at this level */ + break; + } + + /* OP_KETRPOS is a possessive repeating ket. Remember the current position, + and return the MATCH_KETRPOS. This makes it possible to do the repeats one + at a time from the outer level, thus saving stack. */ + + if (*ecode == OP_KETRPOS) + { + md->end_match_ptr = eptr; + md->end_offset_top = offset_top; + RRETURN(MATCH_KETRPOS); + } + + /* The normal 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 + an atomic group or an unlimited repeat of a group that can match an empty + string. */ + + if (*ecode == OP_KETRMIN) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM7); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (*prev == OP_ONCE) + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM8); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; /* Level at which to change to MATCH_NOMATCH */ + RRETURN(MATCH_ONCE); + } + if (*prev >= OP_SBRA) /* Could match an empty string */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM50); + RRETURN(rrc); + } + ecode = prev; + goto TAIL_RECURSE; + } + else /* OP_KETRMAX */ + { + RMATCH(eptr, prev, offset_top, md, eptrb, RM13); + if (rrc == MATCH_ONCE && md->once_target == prev) rrc = MATCH_NOMATCH; + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (*prev == OP_ONCE) + { + RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, eptrb, RM9); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + md->once_target = prev; + RRETURN(MATCH_ONCE); + } + ecode += 1 + LINK_SIZE; + goto TAIL_RECURSE; + } + /* Control never gets here */ + + /* Not multiline mode: start of subject assertion, unless notbol. */ + + case OP_CIRC: + if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); + + /* Start of subject assertion */ + + case OP_SOD: + if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); + ecode++; + break; + + /* Multiline mode: start of subject unless notbol, or after any newline. */ + + case OP_CIRCM: + if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); + if (eptr != md->start_subject && + (eptr == md->end_subject || !WAS_NEWLINE(eptr))) + 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; + + /* Multiline mode: assert before any newline, or before end of subject + unless noteol is set. */ + + case OP_DOLLM: + if (eptr < md->end_subject) + { + if (!IS_NEWLINE(eptr)) + { + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + RRETURN(MATCH_NOMATCH); + } + } + else + { + if (md->noteol) RRETURN(MATCH_NOMATCH); + SCHECK_PARTIAL(); + } + ecode++; + break; + + /* Not multiline mode: assert before a terminating newline or before end of + subject unless noteol is set. */ + + case OP_DOLL: + if (md->noteol) RRETURN(MATCH_NOMATCH); + if (!md->endonly) goto ASSERT_NL_OR_EOS; + + /* ... else fall through for endonly */ + + /* End of subject assertion (\z) */ + + case OP_EOD: + if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); + SCHECK_PARTIAL(); + ecode++; + break; + + /* End of subject or ending \n assertion (\Z) */ + + case OP_EODN: + ASSERT_NL_OR_EOS: + if (eptr < md->end_subject && + (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) + { + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + RRETURN(MATCH_NOMATCH); + } + + /* Either at end of string or \n before end. */ + + SCHECK_PARTIAL(); + 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. Remember the earliest consulted character for + partial matching. */ + +#ifdef SUPPORT_UTF + if (utf) + { + /* Get status of previous character */ + + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + PCRE_PUCHAR lastptr = eptr - 1; + BACKCHAR(lastptr); + if (lastptr < md->start_used_ptr) md->start_used_ptr = lastptr; + GETCHAR(c, lastptr); +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + if (c == '_') prev_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + prev_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + + /* Get status of next character */ + + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else + { + GETCHAR(c, eptr); +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + if (c == '_') cur_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + cur_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; + } + } + else +#endif + + /* Not in UTF-8 mode, but we may still have PCRE_UCP set, and for + consistency with the behaviour of \w we do use it in this case. */ + + { + /* Get status of previous character */ + + if (eptr == md->start_subject) prev_is_word = FALSE; else + { + if (eptr <= md->start_used_ptr) md->start_used_ptr = eptr - 1; +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + c = eptr[-1]; + if (c == '_') prev_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + prev_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + prev_is_word = MAX_255(eptr[-1]) + && ((md->ctypes[eptr[-1]] & ctype_word) != 0); + } + + /* Get status of next character */ + + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + cur_is_word = FALSE; + } + else +#ifdef SUPPORT_UCP + if (md->use_ucp) + { + c = *eptr; + if (c == '_') cur_is_word = TRUE; else + { + int cat = UCD_CATEGORY(c); + cur_is_word = (cat == ucp_L || cat == ucp_N); + } + } + else +#endif + cur_is_word = MAX_255(*eptr) + && ((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 any single character type except newline; have to take care with + CRLF newlines and partial matching. */ + + case OP_ANY: + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + + /* Fall through */ + + /* Match any single character whatsoever. */ + + case OP_ALLANY: + if (eptr >= md->end_subject) /* DO NOT merge the eptr++ here; it must */ + { /* not be updated before SCHECK_PARTIAL. */ + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; +#ifdef SUPPORT_UTF + if (utf) ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); +#endif + 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) /* DO NOT merge the eptr++ here; it must */ + { /* not be updated before SCHECK_PARTIAL. */ + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; + ecode++; + break; + + case OP_NOT_DIGIT: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_digit) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_DIGIT: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_digit) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WHITESPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_space) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WHITESPACE: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_space) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_NOT_WORDCHAR: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c < 256 && +#endif + (md->ctypes[c] & ctype_word) != 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_WORDCHAR: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ( +#if defined SUPPORT_UTF || !(defined COMPILE_PCRE8) + c > 255 || +#endif + (md->ctypes[c] & ctype_word) == 0 + ) + RRETURN(MATCH_NOMATCH); + ecode++; + break; + + case OP_ANYNL: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + + case 0x000d: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + } + else if (*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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + { + const pcre_uint8 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] != PRIV(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; + + /* These are specials */ + + case PT_ALNUM: + if ((PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_SPACE: /* Perl space */ + if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_PXSPACE: /* POSIX space */ + if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) + == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_WORD: + if ((PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + /* This should never occur */ + + 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + if (UCD_CATEGORY(c) != ucp_M) break; + eptr += len; + } + CHECK_PARTIAL(); + 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: + case OP_REFI: + caseless = op == OP_REFI; + offset = GET2(ecode, 1) << 1; /* Doubled ref number */ + ecode += 1 + IMM2_SIZE; + + /* If the reference is unset, there are two possibilities: + + (a) In the default, Perl-compatible state, set the length negative; + 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 : -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, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + break; + + default: /* No repeat follows */ + if ((length = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (length == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += length; + continue; /* With the main loop */ + } + + /* Handle repeated back references. If the length of the reference is + zero, just continue with the main loop. If the length is negative, it + means the reference is unset in non-Java-compatible mode. If the minimum is + zero, we can continue at the same level without recursion. For any other + minimum, carrying on will result in NOMATCH. */ + + if (length == 0) continue; + if (length < 0 && min == 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++) + { + int slength; + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (slength == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += slength; + } + + /* 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++) + { + int slength; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM14); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + if (slength == -2) eptr = md->end_subject; /* Partial match */ + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += slength; + } + /* Control never gets here */ + } + + /* If maximizing, find the longest string and work backwards */ + + else + { + pp = eptr; + for (i = min; i < max; i++) + { + int slength; + if ((slength = match_ref(offset, eptr, length, md, caseless)) < 0) + { + /* Can't use CHECK_PARTIAL because we don't want to update eptr in + the soft partial matching case. */ + + if (slength == -2 && md->partial != 0 && + md->end_subject > md->start_used_ptr) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + } + eptr += slength; + } + + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, 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: + { + /* The data variable is saved across frames, so the byte map needs to + be stored there. */ +#define BYTE_MAP ((pcre_uint8 *)data) + data = ecode + 1; /* Save for matching */ + ecode += 1 + (32 / sizeof(pcre_uchar)); /* 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, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + +#ifdef SUPPORT_UTF + if (utf) + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + c = *eptr++; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else +#endif + if ((BYTE_MAP[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_UTF + if (utf) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM16); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(c, eptr); + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM17); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + c = *eptr++; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); + } + else +#endif + if ((BYTE_MAP[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_UTF + if (utf) + { + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(c, eptr, len); + if (c > 255) + { + if (op == OP_CLASS) break; + } + else + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; + eptr += len; + } + for (;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM18); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; +#ifndef COMPILE_PCRE8 + if (c > 255) + { + if (op == OP_CLASS) break; + } + else +#endif + if ((BYTE_MAP[c/8] & (1 << (c&7))) == 0) break; + eptr++; + } + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM19); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } +#undef BYTE_MAP + } + /* Control never gets here */ + + + /* Match an extended character class. This opcode is encountered only + when UTF-8 mode mode is supported. Nevertheless, we may not be in UTF-8 + mode, because Unicode properties are supported in non-UTF-8 mode. */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + 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, 1 + IMM2_SIZE); + if (max == 0) max = INT_MAX; + ecode += 1 + 2 * IMM2_SIZE; + 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (!PRIV(xclass)(c, data, utf)) 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, eptrb, RM20); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (!PRIV(xclass)(c, data, utf)) 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) + { + SCHECK_PARTIAL(); + break; + } +#ifdef SUPPORT_UTF + GETCHARLENTEST(c, eptr, len); +#else + c = *eptr; +#endif + if (!PRIV(xclass)(c, data, utf)) break; + eptr += len; + } + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ +#ifdef SUPPORT_UTF + if (utf) BACKCHAR(eptr); +#endif + } + RRETURN(MATCH_NOMATCH); + } + + /* Control never gets here */ + } +#endif /* End of XCLASS */ + + /* Match a single character, casefully */ + + case OP_CHAR: +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + if (length > md->end_subject - eptr) + { + CHECK_PARTIAL(); /* Not SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } + while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); + } + else +#endif + /* Not UTF mode */ + { + if (md->end_subject - eptr < 1) + { + SCHECK_PARTIAL(); /* This one can use SCHECK_PARTIAL() */ + RRETURN(MATCH_NOMATCH); + } + if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); + ecode += 2; + } + break; + + /* Match a single character, caselessly. If we are at the end of the + subject, give up immediately. */ + + case OP_CHARI: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + ecode++; + GETCHARLEN(fc, ecode, length); + + /* If the pattern character's value is < 128, we have only one byte, and + we know that its other case must also be one byte long, so we can use the + fast lookup table. We know that there is at least one byte left in the + subject. */ + + if (fc < 128) + { + if (md->lcc[fc] + != TABLE_GET(*eptr, md->lcc, *eptr)) RRETURN(MATCH_NOMATCH); + ecode++; + eptr++; + } + + /* Otherwise we must pick up the subject character. Note that we cannot + use the value of "length" to check for sufficient bytes left, because the + other case of the character may have more or fewer bytes. */ + + 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_UTF */ + + /* Not UTF mode */ + { + if (TABLE_GET(ecode[1], md->lcc, ecode[1]) + != TABLE_GET(*eptr, md->lcc, *eptr)) RRETURN(MATCH_NOMATCH); + eptr++; + ecode += 2; + } + break; + + /* Match a single character repeatedly. */ + + case OP_EXACT: + case OP_EXACTI: + min = max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATCHAR; + + case OP_POSUPTO: + case OP_POSUPTOI: + possessive = TRUE; + /* Fall through */ + + case OP_UPTO: + case OP_UPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_MINUPTO || *ecode == OP_MINUPTOI; + ecode += 1 + IMM2_SIZE; + goto REPEATCHAR; + + case OP_POSSTAR: + case OP_POSSTARI: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSPLUS: + case OP_POSPLUSI: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATCHAR; + + case OP_POSQUERY: + case OP_POSQUERYI: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATCHAR; + + case OP_STAR: + case OP_STARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_QUERY: + case OP_QUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + c = *ecode++ - ((op < OP_STARI)? OP_STAR : OP_STARI); + 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. */ + + REPEATCHAR: +#ifdef SUPPORT_UTF + if (utf) + { + length = 1; + charptr = ecode; + GETCHARLEN(fc, ecode, length); + 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 (op >= OP_STARI && /* Caseless */ + (othercase = UCD_OTHERCASE(fc)) != fc) + oclength = PRIV(ord2utf)(othercase, occhars); + else oclength = 0; +#endif /* SUPPORT_UCP */ + + for (i = 1; i <= min; i++) + { + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + } + + if (min == max) continue; + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM22); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr <= md->end_subject - length && + memcmp(eptr, charptr, IN_UCHARS(length)) == 0) eptr += length; +#ifdef SUPPORT_UCP + else if (oclength > 0 && + eptr <= md->end_subject - oclength && + memcmp(eptr, occhars, IN_UCHARS(oclength)) == 0) eptr += oclength; +#endif /* SUPPORT_UCP */ + else + { + CHECK_PARTIAL(); + break; + } + } + + if (possessive) continue; + + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, 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_UTF */ + /* When not in UTF-8 mode, load a single-byte character. */ + fc = *ecode++; + + /* The value of fc at this point is always one character, though we may + or may not be in UTF 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, (char *)eptr)); + + if (op >= OP_STARI) /* Caseless */ + { +#ifdef COMPILE_PCRE8 + /* fc must be < 128 if UTF is enabled. */ + foc = md->fcc[fc]; +#else +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + if (utf && fc > 127) + foc = UCD_OTHERCASE(fc); +#else + if (utf && fc > 127) + foc = fc; +#endif /* SUPPORT_UCP */ + else +#endif /* SUPPORT_UTF */ + foc = TABLE_GET(fc, md->fcc, fc); +#endif /* COMPILE_PCRE8 */ + + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr && foc != *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + if (min == max) continue; + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM24); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr && foc != *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc != *eptr && foc != *eptr) break; + eptr++; + } + + if (possessive) continue; + + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, 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 (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr++) RRETURN(MATCH_NOMATCH); + } + + if (min == max) continue; + + if (minimize) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM26); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc != *eptr++) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + else /* Maximize */ + { + pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc != *eptr) break; + eptr++; + } + if (possessive) continue; + + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, 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: + case OP_NOTI: + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int ch, och; + + ecode++; + GETCHARINC(ch, ecode); + GETCHARINC(c, eptr); + + if (op == OP_NOT) + { + if (ch == c) RRETURN(MATCH_NOMATCH); + } + else + { +#ifdef SUPPORT_UCP + if (ch > 127) + och = UCD_OTHERCASE(ch); +#else + if (ch > 127) + och = ch; +#endif /* SUPPORT_UCP */ + else + och = TABLE_GET(ch, md->fcc, ch); + if (ch == c || och == c) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + { + register unsigned int ch = ecode[1]; + c = *eptr++; + if (ch == c || (op == OP_NOTI && TABLE_GET(ch, md->fcc, ch) == c)) + RRETURN(MATCH_NOMATCH); + ecode += 2; + } + 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: + case OP_NOTEXACTI: + min = max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_NOTMINUPTO || *ecode == OP_NOTMINUPTOI; + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + possessive = TRUE; + min = 0; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + possessive = TRUE; + min = 1; + max = INT_MAX; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + possessive = TRUE; + min = 0; + max = 1; + ecode++; + goto REPEATNOTCHAR; + + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + possessive = TRUE; + min = 0; + max = GET2(ecode, 1); + ecode += 1 + IMM2_SIZE; + goto REPEATNOTCHAR; + + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + c = *ecode++ - ((op >= OP_NOTSTARI)? OP_NOTSTARI: 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. */ + + REPEATNOTCHAR: + GETCHARINCTEST(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, (char *)eptr)); + + if (op >= OP_NOTSTARI) /* Caseless */ + { +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + if (utf && fc > 127) + foc = UCD_OTHERCASE(fc); +#else + if (utf && fc > 127) + foc = fc; +#endif /* SUPPORT_UCP */ + else +#endif /* SUPPORT_UTF */ + foc = TABLE_GET(fc, md->fcc, fc); + +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM28); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d || (unsigned int)foc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM29); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr || foc == *eptr) RRETURN(MATCH_NOMATCH); + eptr++; + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(d, eptr, len); + if (fc == d || (unsigned int)foc == d) break; + eptr += len; + } + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM30); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == *eptr || foc == *eptr) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM31); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + } + } + + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + } + + /* Caseful comparisons */ + + else + { +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } + } + + if (min == max) continue; + + if (minimize) + { +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM32); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINC(d, eptr); + if (fc == d) RRETURN(MATCH_NOMATCH); + } + } + else +#endif + /* Not UTF mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM33); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (fc == *eptr++) RRETURN(MATCH_NOMATCH); + } + } + /* Control never gets here */ + } + + /* Maximize case */ + + else + { + pp = eptr; + +#ifdef SUPPORT_UTF + if (utf) + { + register unsigned int d; + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLEN(d, eptr, len); + if (fc == d) break; + eptr += len; + } + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM34); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + } + } + else +#endif + /* Not UTF mode */ + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (fc == *eptr) break; + eptr++; + } + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, 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 += 1 + IMM2_SIZE; + goto REPEATTYPE; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + min = 0; + max = GET2(ecode, 1); + minimize = *ecode == OP_TYPEMINUPTO; + ecode += 1 + IMM2_SIZE; + 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 += 1 + IMM2_SIZE; + 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). 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 > 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + } + break; + + case PT_LAMP: + for (i = 1; i <= min; i++) + { + int chartype; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + chartype == ucp_Lt) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_GC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_PC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CHARTYPE(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_SC: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_ALNUM: + for (i = 1; i <= min; i++) + { + int category; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_SPACE: /* Perl space */ + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_PXSPACE: /* POSIX space */ + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + case PT_WORD: + for (i = 1; i <= min; i++) + { + int category; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N || c == CHAR_UNDERSCORE) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + break; + + /* This should not occur */ + + 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++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + if (UCD_CATEGORY(c) != ucp_M) break; + eptr += len; + } + CHECK_PARTIAL(); + } + } + + else +#endif /* SUPPORT_UCP */ + +/* Handle all other cases when the coding is UTF-8 */ + +#ifdef SUPPORT_UTF + if (utf) switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_ALLANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_ANYBYTE: + if (eptr > md->end_subject - min) RRETURN(MATCH_NOMATCH); + eptr += min; + break; + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr >= 128 || (md->ctypes[*eptr] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr >= 128 || (md->ctypes[*eptr] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* 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) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (*eptr >= 128 || (md->ctypes[*eptr] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + /* 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_UTF */ + + /* Code for the non-UTF-8 case for minimum matching of operators other + than OP_PROP and OP_NOTPROP. */ + + switch(ctype) + { + case OP_ANY: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); + if (md->partial != 0 && + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + } + break; + + case OP_ALLANY: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += min; + break; + + case OP_ANYBYTE: + if (eptr > md->end_subject - min) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + eptr += min; + break; + + case OP_ANYNL: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + 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: +#ifdef COMPILE_PCRE16 + case 0x2028: + case 0x2029: +#endif + if (md->bsr_anycrlf) RRETURN(MATCH_NOMATCH); + break; + } + } + break; + + case OP_NOT_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: break; + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ +#ifdef COMPILE_PCRE16 + 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 */ +#endif + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_HSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ +#ifdef COMPILE_PCRE16 + 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 */ +#endif + break; + } + } + break; + + case OP_NOT_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: break; + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ +#ifdef COMPILE_PCRE16 + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ +#endif + RRETURN(MATCH_NOMATCH); + } + } + break; + + case OP_VSPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + switch(*eptr++) + { + default: RRETURN(MATCH_NOMATCH); + case 0x0a: /* LF */ + case 0x0b: /* VT */ + case 0x0c: /* FF */ + case 0x0d: /* CR */ + case 0x85: /* NEL */ +#ifdef COMPILE_PCRE16 + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ +#endif + break; + } + } + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_word) == 0) + RRETURN(MATCH_NOMATCH); + eptr++; + } + 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, eptrb, RM36); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (prop_fail_result) RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_LAMP: + for (fi = min;; fi++) + { + int chartype; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM37); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + 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, eptrb, RM38); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == 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, eptrb, RM39); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CHARTYPE(c) == 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, eptrb, RM40); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_ALNUM: + for (fi = min;; fi++) + { + int category; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM59); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_SPACE: /* Perl space */ + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM60); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_PXSPACE: /* POSIX space */ + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM61); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + case PT_WORD: + for (fi = min;; fi++) + { + int category; + RMATCH(eptr, ecode, offset_top, md, eptrb, RM62); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + category = UCD_CATEGORY(c); + if ((category == ucp_L || + category == ucp_N || + c == CHAR_UNDERSCORE) + == prop_fail_result) + RRETURN(MATCH_NOMATCH); + } + /* Control never gets here */ + + /* This should never occur */ + + 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, eptrb, RM41); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + GETCHARINCTEST(c, eptr); + if (UCD_CATEGORY(c) == ucp_M) RRETURN(MATCH_NOMATCH); + while (eptr < md->end_subject) + { + int len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + if (UCD_CATEGORY(c) != ucp_M) break; + eptr += len; + } + CHECK_PARTIAL(); + } + } + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF + if (utf) + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM42); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) + RRETURN(MATCH_NOMATCH); + GETCHARINC(c, eptr); + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + + 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 mode */ + { + for (fi = min;; fi++) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM43); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (fi >= max) RRETURN(MATCH_NOMATCH); + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + RRETURN(MATCH_NOMATCH); + } + if (ctype == OP_ANY && IS_NEWLINE(eptr)) + RRETURN(MATCH_NOMATCH); + c = *eptr++; + switch(ctype) + { + case OP_ANY: /* This is the non-NL case */ + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + c == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + break; + + 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: +#ifdef COMPILE_PCRE16 + case 0x2028: + case 0x2029: +#endif + 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 */ +#ifdef COMPILE_PCRE16 + 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 */ +#endif + RRETURN(MATCH_NOMATCH); + } + break; + + case OP_HSPACE: + switch(c) + { + default: RRETURN(MATCH_NOMATCH); + case 0x09: /* HT */ + case 0x20: /* SPACE */ + case 0xa0: /* NBSP */ +#ifdef COMPILE_PCRE16 + 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 */ +#endif + 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 */ +#ifdef COMPILE_PCRE16 + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ +#endif + 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 */ +#ifdef COMPILE_PCRE16 + case 0x2028: /* LINE SEPARATOR */ + case 0x2029: /* PARAGRAPH SEPARATOR */ +#endif + break; + } + break; + + case OP_NOT_DIGIT: + if (MAX_255(c) && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_DIGIT: + if (!MAX_255(c) || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WHITESPACE: + if (MAX_255(c) && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WHITESPACE: + if (!MAX_255(c) || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_NOT_WORDCHAR: + if (MAX_255(c) && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); + break; + + case OP_WORDCHAR: + if (!MAX_255(c) || (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) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if (prop_fail_result) break; + eptr+= len; + } + break; + + case PT_LAMP: + for (i = min; i < max; i++) + { + int chartype; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + chartype = UCD_CHARTYPE(c); + if ((chartype == ucp_Lu || + chartype == ucp_Ll || + 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) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CATEGORY(c) == 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) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CHARTYPE(c) == 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) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_SCRIPT(c) == prop_value) == prop_fail_result) break; + eptr+= len; + } + break; + + case PT_ALNUM: + for (i = min; i < max; i++) + { + int category; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N) == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_SPACE: /* Perl space */ + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_PXSPACE: /* POSIX space */ + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + if ((UCD_CATEGORY(c) == ucp_Z || c == CHAR_HT || c == CHAR_NL || + c == CHAR_VT || c == CHAR_FF || c == CHAR_CR) + == prop_fail_result) + break; + eptr+= len; + } + break; + + case PT_WORD: + for (i = min; i < max; i++) + { + int category; + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + GETCHARLENTEST(c, eptr, len); + category = UCD_CATEGORY(c); + if ((category == ucp_L || category == ucp_N || + c == CHAR_UNDERSCORE) == prop_fail_result) + 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, eptrb, RM44); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + if (utf) 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++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + if (UCD_CATEGORY(c) == ucp_M) break; + eptr += len; + while (eptr < md->end_subject) + { + len = 1; + if (!utf) c = *eptr; else { GETCHARLEN(c, eptr, len); } + if (UCD_CATEGORY(c) != ucp_M) break; + eptr += len; + } + CHECK_PARTIAL(); + } + + /* eptr is now past the end of the maximum run */ + + if (possessive) continue; + + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM45); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + for (;;) /* Move back over one extended */ + { + if (!utf) c = *eptr; else + { + BACKCHAR(eptr); + GETCHAR(c, eptr); + } + if (UCD_CATEGORY(c) != ucp_M) break; + eptr--; + } + } + } + + else +#endif /* SUPPORT_UCP */ + +#ifdef SUPPORT_UTF + if (utf) + { + switch(ctype) + { + case OP_ANY: + if (max < INT_MAX) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + } + + /* Handle unlimited UTF-8 repeat */ + + else + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + } + break; + + case OP_ALLANY: + if (max < INT_MAX) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + eptr++; + ACROSSCHAR(eptr < md->end_subject, *eptr, eptr++); + } + } + else + { + eptr = md->end_subject; /* Unlimited UTF-8 repeat */ + SCHECK_PARTIAL(); + } + break; + + /* The byte case is the same as non-UTF8 */ + + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + int len = 1; + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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) + { + SCHECK_PARTIAL(); + 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, we are + done (no backing up). Otherwise, match at this position; anything other + than no match is immediately returned. For nomatch, back up one + character, unless we are matching \R and the last thing matched was + \r\n, in which case, back up two bytes. */ + + if (possessive) continue; + for(;;) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM46); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + if (eptr-- == pp) break; /* Stop if tried at original pos */ + BACKCHAR(eptr); + if (ctype == OP_ANYNL && eptr > pp && *eptr == '\n' && + eptr[-1] == '\r') eptr--; + } + } + else +#endif /* SUPPORT_UTF */ + /* Not UTF mode */ + { + switch(ctype) + { + case OP_ANY: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (IS_NEWLINE(eptr)) break; + if (md->partial != 0 && /* Take care with CRLF partial */ + eptr + 1 >= md->end_subject && + NLBLOCK->nltype == NLTYPE_FIXED && + NLBLOCK->nllen == 2 && + *eptr == NLBLOCK->nl[0]) + { + md->hitend = TRUE; + if (md->partial > 1) RRETURN(PCRE_ERROR_PARTIAL); + } + eptr++; + } + break; + + case OP_ALLANY: + case OP_ANYBYTE: + c = max - min; + if (c > (unsigned int)(md->end_subject - eptr)) + { + eptr = md->end_subject; + SCHECK_PARTIAL(); + } + else eptr += c; + break; + + case OP_ANYNL: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + 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 +#ifdef COMPILE_PCRE16 + && c != 0x2028 && c != 0x2029 +#endif + ))) break; + eptr++; + } + } + break; + + case OP_NOT_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; + if (c == 0x09 || c == 0x20 || c == 0xa0 +#ifdef COMPILE_PCRE16 + || c == 0x1680 || c == 0x180e || (c >= 0x2000 && c <= 0x200A) + || c == 0x202f || c == 0x205f || c == 0x3000 +#endif + ) break; + eptr++; + } + break; + + case OP_HSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; + if (c != 0x09 && c != 0x20 && c != 0xa0 +#ifdef COMPILE_PCRE16 + && c != 0x1680 && c != 0x180e && (c < 0x2000 || c > 0x200A) + && c != 0x202f && c != 0x205f && c != 0x3000 +#endif + ) break; + eptr++; + } + break; + + case OP_NOT_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; + if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85 +#ifdef COMPILE_PCRE16 + || c == 0x2028 || c == 0x2029 +#endif + ) break; + eptr++; + } + break; + + case OP_VSPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + c = *eptr; + if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85 +#ifdef COMPILE_PCRE16 + && c != 0x2028 && c != 0x2029 +#endif + ) break; + eptr++; + } + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_digit) != 0) break; + eptr++; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_digit) == 0) break; + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_space) != 0) break; + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (md->ctypes[*eptr] & ctype_space) == 0) break; + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (MAX_255(*eptr) && (md->ctypes[*eptr] & ctype_word) != 0) break; + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) + { + SCHECK_PARTIAL(); + break; + } + if (!MAX_255(*eptr) || (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, we are + done (no backing up). Otherwise, match at this position; anything other + than no match is immediately returned. For nomatch, back up one + character (byte), unless we are matching \R and the last thing matched + was \r\n, in which case, back up two bytes. */ + + if (possessive) continue; + while (eptr >= pp) + { + RMATCH(eptr, ecode, offset_top, md, eptrb, RM47); + if (rrc != MATCH_NOMATCH) RRETURN(rrc); + eptr--; + if (ctype == OP_ANYNL && eptr > pp && *eptr == '\n' && + eptr[-1] == '\r') eptr--; + } + } + + /* 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) LBL(55) LBL(56) LBL(57) LBL(58) LBL(63) LBL(64) + LBL(65) LBL(66) +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + LBL(21) +#endif +#ifdef SUPPORT_UTF + LBL(16) LBL(18) LBL(20) + 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) + LBL(59) LBL(60) LBL(61) LBL(62) +#endif /* SUPPORT_UCP */ +#endif /* SUPPORT_UTF */ + default: + DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere)); + +printf("+++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 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 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 + +/*************************************************************************** +***************************************************************************/ + + +#ifdef NO_RECURSE +/************************************************* +* Release allocated heap frames * +*************************************************/ + +/* This function releases all the allocated frames. The base frame is on the +machine stack, and so must not be freed. + +Argument: the address of the base frame +Returns: nothing +*/ + +static void +release_match_heapframes (heapframe *frame_base) +{ +heapframe *nextframe = frame_base->Xnextframe; +while (nextframe != NULL) + { + heapframe *oldframe = nextframe; + nextframe = nextframe->Xnextframe; + (PUBL(stack_free))(oldframe); + } +} +#endif + + +/************************************************* +* 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 +*/ + +#ifdef COMPILE_PCRE8 +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) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_exec(const pcre16 *argument_re, const pcre16_extra *extra_data, + PCRE_SPTR16 subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +#endif +{ +int rc, ocount, arg_offset_max; +int newline; +BOOL using_temporary_offsets = FALSE; +BOOL anchored; +BOOL startline; +BOOL firstline; +BOOL utf; +BOOL has_first_char = FALSE; +BOOL has_req_char = FALSE; +pcre_uchar first_char = 0; +pcre_uchar first_char2 = 0; +pcre_uchar req_char = 0; +pcre_uchar req_char2 = 0; +match_data match_block; +match_data *md = &match_block; +const pcre_uint8 *tables; +const pcre_uint8 *start_bits = NULL; +PCRE_PUCHAR start_match = (PCRE_PUCHAR)subject + start_offset; +PCRE_PUCHAR end_subject; +PCRE_PUCHAR start_partial = NULL; +PCRE_PUCHAR req_char_ptr = start_match - 1; + +const pcre_study_data *study; +const REAL_PCRE *re = (const REAL_PCRE *)argument_re; + +#ifdef NO_RECURSE +heapframe frame_zero; +frame_zero.Xprevframe = NULL; /* Marks the top level */ +frame_zero.Xnextframe = NULL; /* None are allocated yet */ +md->match_frames_base = &frame_zero; +#endif + +/* Check for the special magic call that measures the size of the stack used +per recursive call of match(). Without the funny casting for sizeof, a Windows +compiler gave this error: "unary minus operator applied to unsigned type, +result still unsigned". Hopefully the cast fixes that. */ + +if (re == NULL && extra_data == NULL && subject == NULL && length == -999 && + start_offset == -999) +#ifdef NO_RECURSE + return -((int)sizeof(heapframe)); +#else + return match(NULL, NULL, NULL, 0, NULL, NULL, 0); +#endif + +/* 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; +if (start_offset < 0 || start_offset > length) return PCRE_ERROR_BADOFFSET; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +/* These two settings are used in the code for checking a UTF-8 string that +follows immediately afterwards. Other values in the md block are used only +during "normal" pcre_exec() processing, not when the JIT support is in use, +so they are set up later. */ + +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +utf = md->utf = (re->options & PCRE_UTF8) != 0; +md->partial = ((options & PCRE_PARTIAL_HARD) != 0)? 2 : + ((options & PCRE_PARTIAL_SOFT) != 0)? 1 : 0; + +/* Check a UTF-8 string if required. Pass back the character offset and error +code for an invalid string if a results vector is available. */ + +#ifdef SUPPORT_UTF +if (utf && (options & PCRE_NO_UTF8_CHECK) == 0) + { + int erroroffset; + int errorcode = PRIV(valid_utf)((PCRE_PUCHAR)subject, length, &erroroffset); + if (errorcode != 0) + { + if (offsetcount >= 2) + { + offsets[0] = erroroffset; + offsets[1] = errorcode; + } +#ifdef COMPILE_PCRE16 + return (errorcode <= PCRE_UTF16_ERR1 && md->partial > 1)? + PCRE_ERROR_SHORTUTF16 : PCRE_ERROR_BADUTF16; +#else + return (errorcode <= PCRE_UTF8_ERR5 && md->partial > 1)? + PCRE_ERROR_SHORTUTF8 : PCRE_ERROR_BADUTF8; +#endif + } + + /* Check that a start_offset points to the start of a UTF character. */ + if (start_offset > 0 && start_offset < length && + NOT_FIRSTCHAR(((PCRE_PUCHAR)subject)[start_offset])) + return PCRE_ERROR_BADUTF8_OFFSET; + } +#endif + +/* If the pattern was successfully studied with JIT support, run the JIT +executable instead of the rest of this function. Most options must be set at +compile time for the JIT code to be usable. Fallback to the normal code path if +an unsupported flag is set. */ + +#ifdef SUPPORT_JIT +if (extra_data != NULL + && (extra_data->flags & (PCRE_EXTRA_EXECUTABLE_JIT | + PCRE_EXTRA_TABLES)) == PCRE_EXTRA_EXECUTABLE_JIT + && extra_data->executable_jit != NULL + && (options & ~(PCRE_NO_UTF8_CHECK | PCRE_NOTBOL | PCRE_NOTEOL | + PCRE_NOTEMPTY | PCRE_NOTEMPTY_ATSTART | + PCRE_PARTIAL_SOFT | PCRE_PARTIAL_HARD)) == 0) + { + rc = PRIV(jit_exec)(re, extra_data, (const pcre_uchar *)subject, length, + start_offset, options, offsets, offsetcount); + + /* PCRE_ERROR_NULL means that the selected normal or partial matching + mode is not compiled. In this case we simply fallback to interpreter. */ + + if (rc != PCRE_ERROR_NULL) return rc; + } +#endif + +/* Carry on with non-JIT matching. This information is for finding all the +numbers associated with a given name, for condition testing. */ + +md->name_table = (pcre_uchar *)re + re->name_table_offset; +md->name_count = re->name_count; +md->name_entry_size = re->name_entry_size; + +/* 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 = 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 = PRIV(default_tables); + +/* 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 pcre_uchar *)re + re->name_table_offset + + re->name_count * re->name_entry_size; + +md->start_subject = (PCRE_PUCHAR)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; +md->use_ucp = (re->options & PCRE_UCP) != 0; +md->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; +md->ignore_skip_arg = FALSE; + +/* Some options are unpacked into BOOL variables in the hope that testing +them will be faster than individual option bits. */ + +md->notbol = (options & PCRE_NOTBOL) != 0; +md->noteol = (options & PCRE_NOTEOL) != 0; +md->notempty = (options & PCRE_NOTEMPTY) != 0; +md->notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; + +md->hitend = FALSE; +md->mark = md->nomatch_mark = NULL; /* In case never set */ + +md->recursive = NULL; /* No recursion at top level */ +md->hasthen = (re->flags & PCRE_HASTHEN) != 0; + +md->lcc = tables + lcc_offset; +md->fcc = tables + fcc_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 = CHAR_CR; break; + case PCRE_NEWLINE_LF: newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: newline = (CHAR_CR << 8) | CHAR_NL; 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 was originally supported only for a restricted set of +regexes; from release 8.00 there are no restrictions, but the bits are still +defined (though never set). So there's no harm in leaving this code. */ + +if (md->partial && (re->flags & PCRE_NOPARTIAL) != 0) + return PCRE_ERROR_BADPARTIAL; + +/* 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); +arg_offset_max = (2*ocount)/3; + +if (re->top_backref > 0 && re->top_backref >= ocount/3) + { + ocount = re->top_backref * 3 + 3; + md->offset_vector = (int *)(PUBL(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; + +/* 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. Also, unset the +offsets for the matched string. This is really just for tidiness with callouts, +in case they inspect these fields. */ + +if (md->offset_vector != NULL) + { + register int *iptr = md->offset_vector + ocount; + register int *iend = iptr - re->top_bracket; + if (iend < md->offset_vector + 2) iend = md->offset_vector + 2; + while (--iptr >= iend) *iptr = -1; + md->offset_vector[0] = md->offset_vector[1] = -1; + } + +/* Set up the first character to match, if available. The first_char 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) + { + has_first_char = TRUE; + first_char = first_char2 = (pcre_uchar)(re->first_char); + if ((re->flags & PCRE_FCH_CASELESS) != 0) + { + first_char2 = TABLE_GET(first_char, md->fcc, first_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && first_char > 127) + first_char2 = UCD_OTHERCASE(first_char); +#endif + } + } + else + if (!startline && study != NULL && + (study->flags & 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) + { + has_req_char = TRUE; + req_char = req_char2 = (pcre_uchar)(re->req_char); + if ((re->flags & PCRE_RCH_CASELESS) != 0) + { + req_char2 = TABLE_GET(req_char, md->fcc, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (utf && req_char > 127) + req_char2 = UCD_OTHERCASE(req_char); +#endif + } + } + + +/* ==========================================================================*/ + +/* Loop for handling unanchored repeated matching attempts; for anchored regexs +the loop runs just once. */ + +for(;;) + { + PCRE_PUCHAR save_end_subject = end_subject; + PCRE_PUCHAR new_start_match; + + /* 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) + { + PCRE_PUCHAR t = start_match; +#ifdef SUPPORT_UTF + if (utf) + { + while (t < md->end_subject && !IS_NEWLINE(t)) + { + t++; + ACROSSCHAR(t < end_subject, *t, t++); + } + } + else +#endif + while (t < md->end_subject && !IS_NEWLINE(t)) t++; + end_subject = t; + } + + /* There are some optimizations that avoid running the match if a known + starting point is not found, or if a known later character is not present. + However, there is an option that disables these, for testing and for ensuring + that all callouts do actually occur. The option can be set in the regex by + (*NO_START_OPT) or passed in match-time options. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0) + { + /* Advance to a unique first char if there is one. */ + + if (has_first_char) + { + if (first_char != first_char2) + while (start_match < end_subject && + *start_match != first_char && *start_match != first_char2) + start_match++; + else + while (start_match < end_subject && *start_match != first_char) + 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_UTF + if (utf) + { + while (start_match < end_subject && !WAS_NEWLINE(start_match)) + { + start_match++; + ACROSSCHAR(start_match < end_subject, *start_match, + 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] == CHAR_CR && + (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && + start_match < end_subject && + *start_match == CHAR_NL) + 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; +#ifndef COMPILE_PCRE8 + if (c > 255) c = 255; +#endif + if ((start_bits[c/8] & (1 << (c&7))) == 0) + { + start_match++; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + /* In non 8-bit mode, the iteration will stop for + characters > 255 at the beginning or not stop at all. */ + if (utf) + ACROSSCHAR(start_match < end_subject, *start_match, + start_match++); +#endif + } + else break; + } + } + } /* Starting optimizations */ + + /* Restore fudged end_subject */ + + end_subject = save_end_subject; + + /* The following two optimizations are disabled for partial matching or if + disabling is explicitly requested. */ + + if (((options | re->options) & PCRE_NO_START_OPTIMIZE) == 0 && !md->partial) + { + /* If the pattern was studied, a minimum subject length may be set. This is + a lower bound; no actual string of that length may actually match the + pattern. Although the value is, strictly, in characters, we treat it as + bytes to avoid spending too much time in this optimization. */ + + if (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0 && + (pcre_uint32)(end_subject - start_match) < study->minlength) + { + rc = MATCH_NOMATCH; + break; + } + + /* If req_char is set, we know that that character must appear in the + subject for the match to succeed. If the first character is set, req_char + 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. */ + + if (has_req_char && end_subject - start_match < REQ_BYTE_MAX) + { + register PCRE_PUCHAR p = start_match + (has_first_char? 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_char_ptr) + { + if (req_char != req_char2) + { + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_char || pp == req_char2) { p--; break; } + } + } + else + { + while (p < end_subject) + { + if (*p++ == req_char) { 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_char_ptr = p; + } + } + } + +#ifdef PCRE_DEBUG /* Sigh. Some compilers never learn. */ + printf(">>>> Match against: "); + pchars(start_match, end_subject - start_match, TRUE, md); + printf("\n"); +#endif + + /* OK, we can now run the match. If "hitend" is set afterwards, remember the + first starting point for which a partial match was found. */ + + md->start_match_ptr = start_match; + md->start_used_ptr = start_match; + md->match_call_count = 0; + md->match_function_type = 0; + md->end_offset_top = 0; + rc = match(start_match, md->start_code, start_match, 2, md, NULL, 0); + if (md->hitend && start_partial == NULL) start_partial = md->start_used_ptr; + + switch(rc) + { + /* If MATCH_SKIP_ARG reaches this level it means that a MARK that matched + the SKIP's arg was not found. In this circumstance, Perl ignores the SKIP + entirely. The only way we can do that is to re-do the match at the same + point, with a flag to force SKIP with an argument to be ignored. Just + treating this case as NOMATCH does not work because it does not check other + alternatives in patterns such as A(*SKIP:A)B|AC when the subject is AC. */ + + case MATCH_SKIP_ARG: + new_start_match = start_match; + md->ignore_skip_arg = TRUE; + break; + + /* SKIP passes back the next starting point explicitly, but if it is the + same as the match we have just done, treat it as NOMATCH. */ + + case MATCH_SKIP: + if (md->start_match_ptr != start_match) + { + new_start_match = md->start_match_ptr; + break; + } + /* Fall through */ + + /* NOMATCH and PRUNE advance by one character. THEN at this level acts + exactly like PRUNE. Unset the ignore SKIP-with-argument flag. */ + + case MATCH_NOMATCH: + case MATCH_PRUNE: + case MATCH_THEN: + md->ignore_skip_arg = FALSE; + new_start_match = start_match + 1; +#ifdef SUPPORT_UTF + if (utf) + ACROSSCHAR(new_start_match < end_subject, *new_start_match, + new_start_match++); +#endif + break; + + /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ + + case MATCH_COMMIT: + rc = MATCH_NOMATCH; + goto ENDLOOP; + + /* Any other return is either a match, or 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. In + normal matching start_match will aways be greater than the first position at + this stage, but a failed *SKIP can cause a return at the same point, which is + why the first test exists. */ + + if (start_match > (PCRE_PUCHAR)subject + start_offset && + start_match[-1] == CHAR_CR && + start_match < end_subject && + *start_match == CHAR_NL && + (re->flags & PCRE_HASCRORLF) == 0 && + (md->nltype == NLTYPE_ANY || + md->nltype == NLTYPE_ANYCRLF || + md->nllen == 2)) + start_match++; + + md->mark = NULL; /* Reset for start of next match attempt */ + } /* 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 || rc == MATCH_ACCEPT) + { + if (using_temporary_offsets) + { + if (arg_offset_max >= 4) + { + memcpy(offsets + 2, md->offset_vector + 2, + (arg_offset_max - 2) * sizeof(int)); + DPRINTF(("Copied offsets from temporary memory\n")); + } + if (md->end_offset_top > arg_offset_max) md->offset_overflow = TRUE; + DPRINTF(("Freeing temporary memory\n")); + (PUBL(free))(md->offset_vector); + } + + /* Set the return code to the number of captured strings, or 0 if there were + too many to fit into the vector. */ + + rc = (md->offset_overflow && md->end_offset_top >= arg_offset_max)? + 0 : md->end_offset_top/2; + + /* If there is space in the offset vector, set any unused pairs at the end of + the pattern to -1 for backwards compatibility. It is documented that this + happens. In earlier versions, the whole set of potential capturing offsets + was set to -1 each time round the loop, but this is handled differently now. + "Gaps" are set to -1 dynamically instead (this fixes a bug). Thus, it is only + those at the end that need unsetting here. We can't just unset them all at + the start of the whole thing because they may get set in one branch that is + not the final matching branch. */ + + if (md->end_offset_top/2 <= re->top_bracket && offsets != NULL) + { + register int *iptr, *iend; + int resetcount = 2 + re->top_bracket * 2; + if (resetcount > offsetcount) resetcount = offsetcount; + iptr = offsets + md->end_offset_top; + iend = offsets + resetcount; + while (iptr < iend) *iptr++ = -1; + } + + /* 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] = (int)(md->start_match_ptr - md->start_subject); + offsets[1] = (int)(md->end_match_ptr - md->start_subject); + } + + /* Return MARK data if requested */ + + if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = (pcre_uchar *)md->mark; + DPRINTF((">>>> returning %d\n", rc)); +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif + 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")); + (PUBL(free))(md->offset_vector); + } + +/* For anything other than nomatch or partial match, just return the code. */ + +if (rc != MATCH_NOMATCH && rc != PCRE_ERROR_PARTIAL) + { + DPRINTF((">>>> error: returning %d\n", rc)); +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif + return rc; + } + +/* Handle partial matches - disable any mark data */ + +if (start_partial != NULL) + { + DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); + md->mark = NULL; + if (offsetcount > 1) + { + offsets[0] = (int)(start_partial - (PCRE_PUCHAR)subject); + offsets[1] = (int)(end_subject - (PCRE_PUCHAR)subject); + } + rc = PCRE_ERROR_PARTIAL; + } + +/* This is the classic nomatch case */ + +else + { + DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); + rc = PCRE_ERROR_NOMATCH; + } + +/* Return the MARK data if it has been requested. */ + +if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = (pcre_uchar *)md->nomatch_mark; +#ifdef NO_RECURSE + release_match_heapframes(&frame_zero); +#endif +return rc; +} + +/* 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..7a7db11 --- /dev/null +++ b/glib/pcre/pcre_fullinfo.c @@ -0,0 +1,206 @@ +/************************************************* +* 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-2012 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, + int what, void *where) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_fullinfo(const pcre16 *argument_re, const pcre16_extra *extra_data, + int what, void *where) +#endif +{ +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; + +/* Check that the first field in the block is the magic number. If it is not, +return with PCRE_ERROR_BADMAGIC. However, if the magic number is equal to +REVERSED_MAGIC_NUMBER we return with PCRE_ERROR_BADENDIANNESS, which +means that the pattern is likely compiled with different endianness. */ + +if (re->magic_number != MAGIC_NUMBER) + return re->magic_number == REVERSED_MAGIC_NUMBER? + PCRE_ERROR_BADENDIANNESS:PCRE_ERROR_BADMAGIC; + +/* Check that this pattern was compiled in the correct bit mode */ + +if ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; + +switch (what) + { + case PCRE_INFO_OPTIONS: + *((unsigned long int *)where) = re->options & PUBLIC_COMPILE_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_JITSIZE: +#ifdef SUPPORT_JIT + *((size_t *)where) = + (extra_data != NULL && + (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra_data->executable_jit != NULL)? + PRIV(jit_get_size)(extra_data->executable_jit) : 0; +#else + *((size_t *)where) = 0; +#endif + 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_char : + ((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 pcre_uint8 **)where) = + (study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0)? + ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; + break; + + case PCRE_INFO_MINLENGTH: + *((int *)where) = + (study != NULL && (study->flags & PCRE_STUDY_MINLEN) != 0)? + (int)(study->minlength) : -1; + break; + + case PCRE_INFO_JIT: + *((int *)where) = extra_data != NULL && + (extra_data->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra_data->executable_jit != NULL; + break; + + case PCRE_INFO_LASTLITERAL: + *((int *)where) = + ((re->flags & PCRE_REQCHSET) != 0)? re->req_char : -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 pcre_uchar **)where) = (const pcre_uchar *)re + re->name_table_offset; + break; + + case PCRE_INFO_DEFAULT_TABLES: + *((const pcre_uint8 **)where) = (const pcre_uint8 *)(PRIV(default_tables)); + break; + + /* From release 8.00 this will always return TRUE because NOPARTIAL is + no longer ever set (the restrictions have been removed). */ + + 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; + + case PCRE_INFO_MAXLOOKBEHIND: + *((int *)where) = re->max_lookbehind; + 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..3d9904e --- /dev/null +++ b/glib/pcre/pcre_get.c @@ -0,0 +1,587 @@ +/************************************************* +* 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-2012 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringnumber(const pcre *code, const char *stringname) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_stringnumber(const pcre16 *code, PCRE_SPTR16 stringname) +#endif +{ +int rc; +int entrysize; +int top, bot; +pcre_uchar *nametable; + +#ifdef COMPILE_PCRE8 +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; +#endif +#ifdef COMPILE_PCRE16 +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif + +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + pcre_uchar *entry = nametable + entrysize*mid; + int c = STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(entry + IMM2_SIZE)); + if (c == 0) return GET2(entry, 0); + 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_stringtable_entries(const pcre *code, const char *stringname, + char **firstptr, char **lastptr) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_stringtable_entries(const pcre16 *code, PCRE_SPTR16 stringname, + PCRE_UCHAR16 **firstptr, PCRE_UCHAR16 **lastptr) +#endif +{ +int rc; +int entrysize; +int top, bot; +pcre_uchar *nametable, *lastentry; + +#ifdef COMPILE_PCRE8 +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; +#endif +#ifdef COMPILE_PCRE16 +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) + return rc; +if (top <= 0) return PCRE_ERROR_NOSUBSTRING; + +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) + return rc; +if ((rc = pcre16_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) + return rc; +#endif + +lastentry = nametable + entrysize * (top - 1); +bot = 0; +while (top > bot) + { + int mid = (top + bot) / 2; + pcre_uchar *entry = nametable + entrysize*mid; + int c = STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(entry + IMM2_SIZE)); + if (c == 0) + { + pcre_uchar *first = entry; + pcre_uchar *last = entry; + while (first > nametable) + { + if (STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(first - entrysize + IMM2_SIZE)) != 0) break; + first -= entrysize; + } + while (last < lastentry) + { + if (STRCMP_UC_UC((pcre_uchar *)stringname, + (pcre_uchar *)(last + entrysize + IMM2_SIZE)) != 0) break; + last += entrysize; + } +#ifdef COMPILE_PCRE8 + *firstptr = (char *)first; + *lastptr = (char *)last; +#else + *firstptr = (PCRE_UCHAR16 *)first; + *lastptr = (PCRE_UCHAR16 *)last; +#endif + 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 +*/ + +#ifdef COMPILE_PCRE8 +static int +get_first_set(const pcre *code, const char *stringname, int *ovector) +#else +static int +get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector) +#endif +{ +const REAL_PCRE *re = (const REAL_PCRE *)code; +int entrysize; +pcre_uchar *entry; +#ifdef COMPILE_PCRE8 +char *first, *last; +#else +PCRE_UCHAR16 *first, *last; +#endif + +#ifdef COMPILE_PCRE8 +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); +#else +if ((re->options & PCRE_DUPNAMES) == 0 && (re->flags & PCRE_JCHANGED) == 0) + return pcre16_get_stringnumber(code, stringname); +entrysize = pcre16_get_stringtable_entries(code, stringname, &first, &last); +#endif +if (entrysize <= 0) return entrysize; +for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) + { + int n = GET2(entry, 0); + if (ovector[n*2] >= 0) return n; + } +return GET2(entry, 0); +} + + + + +/************************************************* +* 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_copy_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, char *buffer, int size) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, + int stringnumber, PCRE_UCHAR16 *buffer, int size) +#endif +{ +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], IN_UCHARS(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 +*/ + +#ifdef COMPILE_PCRE8 +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) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_copy_named_substring(const pcre16 *code, PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 stringname, + PCRE_UCHAR16 *buffer, int size) +#endif +{ +int n = get_first_set(code, stringname, ovector); +if (n <= 0) return n; +#ifdef COMPILE_PCRE8 +return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); +#else +return pcre16_copy_substring(subject, ovector, stringcount, n, buffer, size); +#endif +} + + + +/************************************************* +* 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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring_list(const char *subject, int *ovector, int stringcount, + const char ***listptr) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_substring_list(PCRE_SPTR16 subject, int *ovector, int stringcount, + PCRE_SPTR16 **listptr) +#endif +{ +int i; +int size = sizeof(pcre_uchar *); +int double_count = stringcount * 2; +pcre_uchar **stringlist; +pcre_uchar *p; + +for (i = 0; i < double_count; i += 2) + size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1); + +stringlist = (pcre_uchar **)(PUBL(malloc))(size); +if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; + +#ifdef COMPILE_PCRE8 +*listptr = (const char **)stringlist; +#else +*listptr = (PCRE_SPTR16 *)stringlist; +#endif +p = (pcre_uchar *)(stringlist + stringcount + 1); + +for (i = 0; i < double_count; i += 2) + { + int len = ovector[i+1] - ovector[i]; + memcpy(p, subject + ovector[i], IN_UCHARS(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 (PUBL(free))() +directly. + +Argument: the result of a previous pcre_get_substring_list() +Returns: nothing +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring_list(const char **pointer) +#else +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre16_free_substring_list(PCRE_SPTR16 *pointer) +#endif +{ +(PUBL(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 +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre_get_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, const char **stringptr) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, int stringcount, + int stringnumber, PCRE_SPTR16 *stringptr) +#endif +{ +int yield; +pcre_uchar *substring; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +substring = (pcre_uchar *)(PUBL(malloc))(IN_UCHARS(yield + 1)); +if (substring == NULL) return PCRE_ERROR_NOMEMORY; +memcpy(substring, subject + ovector[stringnumber], IN_UCHARS(yield)); +substring[yield] = 0; +#ifdef COMPILE_PCRE8 +*stringptr = (const char *)substring; +#else +*stringptr = (PCRE_SPTR16)substring; +#endif +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 +*/ + +#ifdef COMPILE_PCRE8 +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) +#else +PCRE_EXP_DEFN int PCRE_CALL_CONVENTION +pcre16_get_named_substring(const pcre16 *code, PCRE_SPTR16 subject, + int *ovector, int stringcount, PCRE_SPTR16 stringname, + PCRE_SPTR16 *stringptr) +#endif +{ +int n = get_first_set(code, stringname, ovector); +if (n <= 0) return n; +#ifdef COMPILE_PCRE8 +return pcre_get_substring(subject, ovector, stringcount, n, stringptr); +#else +return pcre16_get_substring(subject, ovector, stringcount, n, stringptr); +#endif +} + + + + +/************************************************* +* 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 (PUBL(free))() +directly. + +Argument: the result of a previous pcre_get_substring() +Returns: nothing +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre_free_substring(const char *pointer) +#else +PCRE_EXP_DEFN void PCRE_CALL_CONVENTION +pcre16_free_substring(PCRE_SPTR16 pointer) +#endif +{ +(PUBL(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..534660c --- /dev/null +++ b/glib/pcre/pcre_globals.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-2012 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. + +For MS Visual Studio and Symbian OS, there are problems in initializing these +variables to non-local functions. In these cases, therefore, an indirection via +a local function is used. + +Also, when compiling for Virtual Pascal, things are done differently, and +global variables are not used. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#ifdef GLIB_COMPILATION +#include "gmem.h" +#else +#include +#endif /* GLIB_COMPILATION */ + +#if defined _MSC_VER || defined __SYMBIAN32__ +static void* LocalPcreMalloc(size_t aSize) + { + return malloc(aSize); + } +static void LocalPcreFree(void* aPtr) + { + free(aPtr); + } +PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = LocalPcreMalloc; +PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = LocalPcreFree; +PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = LocalPcreMalloc; +PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = LocalPcreFree; +PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; + +#elif !defined VPCOMPAT +PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = g_try_malloc; +PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = g_free; +PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = g_try_malloc; +PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = g_free; +PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; +#endif + +/* End of pcre_globals.c */ diff --git a/glib/pcre/pcre_internal.h b/glib/pcre/pcre_internal.h new file mode 100644 index 0000000..9918e71 --- /dev/null +++ b/glib/pcre/pcre_internal.h @@ -0,0 +1,2334 @@ +/************************************************* +* 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-2012 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_" or "_pcre16_" depending on +the PRIV macro. */ + +#ifndef PCRE_INTERNAL_H +#define PCRE_INTERNAL_H + +/* Define PCRE_DEBUG to get debugging output on stdout. */ + +#if 0 +#define PCRE_DEBUG +#endif + +/* PCRE is compiled as an 8 bit library if it is not requested otherwise. */ +#ifndef COMPILE_PCRE16 +#define COMPILE_PCRE8 +#endif + +/* If SUPPORT_UCP is defined, SUPPORT_UTF must also be defined. The +"configure" script ensures this, but not everybody uses "configure". */ + +#if defined SUPPORT_UCP && !(defined SUPPORT_UTF) +#define SUPPORT_UTF 1 +#endif + +/* We define SUPPORT_UTF if SUPPORT_UTF8 is enabled for compatibility +reasons with existing code. */ + +#if defined SUPPORT_UTF8 && !(defined SUPPORT_UTF) +#define SUPPORT_UTF 1 +#endif + +/* Fixme: SUPPORT_UTF8 should be eventually disappear from the code. +Until then we define it if SUPPORT_UTF is defined. */ + +#if defined SUPPORT_UTF && !(defined SUPPORT_UTF8) +#define SUPPORT_UTF8 1 +#endif + +/* We do not support both EBCDIC and UTF-8/16 at the same time. The "configure" +script prevents both being selected, but not everybody uses "configure". */ + +#if defined EBCDIC && defined SUPPORT_UTF +#error The use of both EBCDIC and SUPPORT_UTF8/16 is not supported. +#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 PCRE_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 + +/* 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 8, 16 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. */ + +typedef unsigned char pcre_uint8; + +#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 + +/* When checking for integer overflow in pcre_compile(), we need to handle +large integers. If a 64-bit integer type is available, we can use that. +Otherwise we have to cast to double, which of course requires floating point +arithmetic. Handle this by defining a macro for the appropriate type. If +stdint.h is available, include it; it may define INT64_MAX. Systems that do not +have stdint.h (e.g. Solaris) may have inttypes.h. The macro int64_t may be set +by "configure". */ + +#if HAVE_STDINT_H +#include +#elif HAVE_INTTYPES_H +#include +#endif + +#if defined INT64_MAX || defined int64_t +#define INT64_OR_DOUBLE int64_t +#else +#define INT64_OR_DOUBLE double +#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 * or short *, +because that should make things easier for callers. This character type is +called pcre_uchar. + +The IN_UCHARS macro multiply its argument with the byte size of the current +pcre_uchar type. Useful for memcpy and such operations, whose require the +byte size of their input/output buffers. + +The MAX_255 macro checks whether its pcre_uchar input is less than 256. + +The TABLE_GET macro is designed for accessing elements of tables whose contain +exactly 256 items. When the character is able to contain more than 256 +items, some check is needed before accessing these tables. +*/ + +#ifdef COMPILE_PCRE8 + +typedef unsigned char pcre_uchar; +#define IN_UCHARS(x) (x) +#define MAX_255(c) 1 +#define TABLE_GET(c, table, default) ((table)[c]) + +#else + +#ifdef COMPILE_PCRE16 +#if USHRT_MAX != 65535 +/* This is a warning message. Change PCRE_UCHAR16 to a 16 bit data type in +pcre.h(.in) and disable (comment out) this message. */ +#error Warning: PCRE_UCHAR16 is not a 16 bit data type. +#endif + +typedef pcre_uint16 pcre_uchar; +#define IN_UCHARS(x) ((x) << 1) +#define MAX_255(c) ((c) <= 255u) +#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default)) + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE16 */ + +#endif /* COMPILE_PCRE8 */ + +/* 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 && \ + PRIV(is_newline)((p), NLBLOCK->nltype, NLBLOCK->PSEND, \ + &(NLBLOCK->nllen), utf)) \ + : \ + ((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 && \ + PRIV(was_newline)((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \ + &(NLBLOCK->nllen), utf)) \ + : \ + ((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_PUCHAR CUSTOM_SUBJECT_PTR +#else +#define PCRE_PUCHAR const pcre_uchar * +#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 memmove(d,s,n) _memmove(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. */ + +#ifdef COMPILE_PCRE8 + +#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]) + +/* Keep it positive */ +#define MAX_PATTERN_SIZE (1 << 30) + +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + +#else /* COMPILE_PCRE8 */ + +#ifdef COMPILE_PCRE16 + +#if LINK_SIZE == 2 + +#undef LINK_SIZE +#define LINK_SIZE 1 + +#define PUT(a,n,d) \ + (a[n] = (d)) + +#define GET(a,n) \ + (a[n]) + +#define MAX_PATTERN_SIZE (1 << 16) + +#elif LINK_SIZE == 3 || LINK_SIZE == 4 + +#undef LINK_SIZE +#define LINK_SIZE 2 + +#define PUT(a,n,d) \ + (a[n] = (d) >> 16), \ + (a[(n)+1] = (d) & 65535) + +#define GET(a,n) \ + (((a)[n] << 16) | (a)[(n)+1]) + +/* Keep it positive */ +#define MAX_PATTERN_SIZE (1 << 30) + +#else +#error LINK_SIZE must be either 2, 3, or 4 +#endif + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE16 */ + +#endif /* COMPILE_PCRE8 */ + +/* 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. */ + +#ifdef COMPILE_PCRE8 + +#define IMM2_SIZE 2 + +#define PUT2(a,n,d) \ + a[n] = (d) >> 8; \ + a[(n)+1] = (d) & 255 + +#define GET2(a,n) \ + (((a)[n] << 8) | (a)[(n)+1]) + +#else /* COMPILE_PCRE8 */ + +#ifdef COMPILE_PCRE16 + +#define IMM2_SIZE 1 + +#define PUT2(a,n,d) \ + a[n] = d + +#define GET2(a,n) \ + a[n] + +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE16 */ + +#endif /* COMPILE_PCRE8 */ + +#define PUT2INC(a,n,d) PUT2(a,n,d), a += IMM2_SIZE + +/* The maximum length of a MARK name is currently one data unit; it may be +changed in future to be a fixed number of bytes or to depend on LINK_SIZE. */ + +#define MAX_MARK ((1 << (sizeof(pcre_uchar)*8)) - 1) + +/* When UTF encoding is being used, a character is no longer just a single +character. The macros for character handling generate simple sequences when +used in character-mode, and more complicated ones for UTF characters. +GETCHARLENTEST and other macros are not used when UTF is not supported, +so they are not defined. To make sure they can never even appear when +UTF support is omitted, we don't even define them. */ + +#ifndef SUPPORT_UTF + +/* #define MAX_VALUE_FOR_SINGLE_CHAR */ +/* #define HAS_EXTRALEN(c) */ +/* #define GET_EXTRALEN(c) */ +/* #define NOT_FIRSTCHAR(c) */ +#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 GETCHARLENTEST(c, eptr, len) */ +/* #define BACKCHAR(eptr) */ +/* #define FORWARDCHAR(eptr) */ +/* #define ACROSSCHAR(condition, eptr, action) */ + +#else /* SUPPORT_UTF */ + +#ifdef COMPILE_PCRE8 + +/* These macros were originally written in the form of loops that used data +from the tables whose names start with PRIV(utf8_table). They were rewritten by +a user so as not to use loops, because in some environments this gives a +significant performance advantage, and it seems never to do any harm. */ + +/* Tells the biggest code point which can be encoded as a single character. */ + +#define MAX_VALUE_FOR_SINGLE_CHAR 127 + +/* Tests whether the code point needs extra characters to decode. */ + +#define HAS_EXTRALEN(c) ((c) >= 0xc0) + +/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE. +Otherwise it has an undefined behaviour. */ + +#define GET_EXTRALEN(c) (PRIV(utf8_table4)[(c) & 0x3f]) + +/* Returns TRUE, if the given character is not the first character +of a UTF sequence. */ + +#define NOT_FIRSTCHAR(c) (((c) & 0xc0) == 0x80) + +/* Base macro to pick up the remaining bytes of a UTF-8 character, not +advancing the pointer. */ + +#define GETUTF8(c, eptr) \ + { \ + if ((c & 0x20) == 0) \ + c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \ + else if ((c & 0x10) == 0) \ + c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + else if ((c & 0x08) == 0) \ + c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \ + ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \ + else if ((c & 0x04) == 0) \ + c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \ + ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \ + (eptr[4] & 0x3f); \ + else \ + c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \ + ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \ + ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \ + } + +/* 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) GETUTF8(c, eptr); + +/* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *eptr; \ + if (utf && c >= 0xc0) GETUTF8(c, eptr); + +/* Base macro to pick up the remaining bytes of a UTF-8 character, advancing +the pointer. */ + +#define GETUTF8INC(c, eptr) \ + { \ + if ((c & 0x20) == 0) \ + c = ((c & 0x1f) << 6) | (*eptr++ & 0x3f); \ + else if ((c & 0x10) == 0) \ + { \ + c = ((c & 0x0f) << 12) | ((*eptr & 0x3f) << 6) | (eptr[1] & 0x3f); \ + eptr += 2; \ + } \ + else if ((c & 0x08) == 0) \ + { \ + c = ((c & 0x07) << 18) | ((*eptr & 0x3f) << 12) | \ + ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + eptr += 3; \ + } \ + else if ((c & 0x04) == 0) \ + { \ + c = ((c & 0x03) << 24) | ((*eptr & 0x3f) << 18) | \ + ((eptr[1] & 0x3f) << 12) | ((eptr[2] & 0x3f) << 6) | \ + (eptr[3] & 0x3f); \ + eptr += 4; \ + } \ + else \ + { \ + c = ((c & 0x01) << 30) | ((*eptr & 0x3f) << 24) | \ + ((eptr[1] & 0x3f) << 18) | ((eptr[2] & 0x3f) << 12) | \ + ((eptr[3] & 0x3f) << 6) | (eptr[4] & 0x3f); \ + eptr += 5; \ + } \ + } + +/* 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) GETUTF8INC(c, eptr); + +/* Get the next character, testing for UTF-8 mode, and advancing the pointer. +This is called when we don't know if we are in UTF-8 mode. */ + +#define GETCHARINCTEST(c, eptr) \ + c = *eptr++; \ + if (utf && c >= 0xc0) GETUTF8INC(c, eptr); + +/* Base macro to pick up the remaining bytes of a UTF-8 character, not +advancing the pointer, incrementing the length. */ + +#define GETUTF8LEN(c, eptr, len) \ + { \ + if ((c & 0x20) == 0) \ + { \ + c = ((c & 0x1f) << 6) | (eptr[1] & 0x3f); \ + len++; \ + } \ + else if ((c & 0x10) == 0) \ + { \ + c = ((c & 0x0f) << 12) | ((eptr[1] & 0x3f) << 6) | (eptr[2] & 0x3f); \ + len += 2; \ + } \ + else if ((c & 0x08) == 0) \ + {\ + c = ((c & 0x07) << 18) | ((eptr[1] & 0x3f) << 12) | \ + ((eptr[2] & 0x3f) << 6) | (eptr[3] & 0x3f); \ + len += 3; \ + } \ + else if ((c & 0x04) == 0) \ + { \ + c = ((c & 0x03) << 24) | ((eptr[1] & 0x3f) << 18) | \ + ((eptr[2] & 0x3f) << 12) | ((eptr[3] & 0x3f) << 6) | \ + (eptr[4] & 0x3f); \ + len += 4; \ + } \ + else \ + {\ + c = ((c & 0x01) << 30) | ((eptr[1] & 0x3f) << 24) | \ + ((eptr[2] & 0x3f) << 18) | ((eptr[3] & 0x3f) << 12) | \ + ((eptr[4] & 0x3f) << 6) | (eptr[5] & 0x3f); \ + len += 5; \ + } \ + } + +/* 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) GETUTF8LEN(c, eptr, len); + +/* Get the next UTF-8 character, testing for UTF-8 mode, not advancing the +pointer, incrementing length if there are extra bytes. This is called when we +do not know if we are in UTF-8 mode. */ + +#define GETCHARLENTEST(c, eptr, len) \ + c = *eptr; \ + if (utf && c >= 0xc0) GETUTF8LEN(c, eptr, len); + +/* 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-- + +/* Same as above, just in the other direction. */ +#define FORWARDCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr++ + +/* Same as above, but it allows a fully customizable form. */ +#define ACROSSCHAR(condition, eptr, action) \ + while((condition) && ((eptr) & 0xc0) == 0x80) action + +#else /* COMPILE_PCRE8 */ + +#ifdef COMPILE_PCRE16 + +/* Tells the biggest code point which can be encoded as a single character. */ + +#define MAX_VALUE_FOR_SINGLE_CHAR 65535 + +/* Tests whether the code point needs extra characters to decode. */ + +#define HAS_EXTRALEN(c) (((c) & 0xfc00) == 0xd800) + +/* Returns with the additional number of characters if IS_MULTICHAR(c) is TRUE. +Otherwise it has an undefined behaviour. */ + +#define GET_EXTRALEN(c) 1 + +/* Returns TRUE, if the given character is not the first character +of a UTF sequence. */ + +#define NOT_FIRSTCHAR(c) (((c) & 0xfc00) == 0xdc00) + +/* Base macro to pick up the low surrogate of a UTF-16 character, not +advancing the pointer. */ + +#define GETUTF16(c, eptr) \ + { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; } + +/* Get the next UTF-16 character, not advancing the pointer. This is called when +we know we are in UTF-16 mode. */ + +#define GETCHAR(c, eptr) \ + c = *eptr; \ + if ((c & 0xfc00) == 0xd800) GETUTF16(c, eptr); + +/* Get the next UTF-16 character, testing for UTF-16 mode, and not advancing the +pointer. */ + +#define GETCHARTEST(c, eptr) \ + c = *eptr; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16(c, eptr); + +/* Base macro to pick up the low surrogate of a UTF-16 character, advancing +the pointer. */ + +#define GETUTF16INC(c, eptr) \ + { c = (((c & 0x3ff) << 10) | (*eptr++ & 0x3ff)) + 0x10000; } + +/* Get the next UTF-16 character, advancing the pointer. This is called when we +know we are in UTF-16 mode. */ + +#define GETCHARINC(c, eptr) \ + c = *eptr++; \ + if ((c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr); + +/* Get the next character, testing for UTF-16 mode, and advancing the pointer. +This is called when we don't know if we are in UTF-16 mode. */ + +#define GETCHARINCTEST(c, eptr) \ + c = *eptr++; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16INC(c, eptr); + +/* Base macro to pick up the low surrogate of a UTF-16 character, not +advancing the pointer, incrementing the length. */ + +#define GETUTF16LEN(c, eptr, len) \ + { c = (((c & 0x3ff) << 10) | (eptr[1] & 0x3ff)) + 0x10000; len++; } + +/* Get the next UTF-16 character, not advancing the pointer, incrementing +length if there is a low surrogate. This is called when we know we are in +UTF-16 mode. */ + +#define GETCHARLEN(c, eptr, len) \ + c = *eptr; \ + if ((c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len); + +/* Get the next UTF-816character, testing for UTF-16 mode, not advancing the +pointer, incrementing length if there is a low surrogate. This is called when +we do not know if we are in UTF-16 mode. */ + +#define GETCHARLENTEST(c, eptr, len) \ + c = *eptr; \ + if (utf && (c & 0xfc00) == 0xd800) GETUTF16LEN(c, eptr, len); + +/* If the pointer is not at the start of a character, move it back until +it is. This is called only in UTF-16 mode - we don't put a test within the +macro because almost all calls are already within a block of UTF-16 only +code. */ + +#define BACKCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr-- + +/* Same as above, just in the other direction. */ +#define FORWARDCHAR(eptr) if ((*eptr & 0xfc00) == 0xdc00) eptr++ + +/* Same as above, but it allows a fully customizable form. */ +#define ACROSSCHAR(condition, eptr, action) \ + if ((condition) && ((eptr) & 0xfc00) == 0xdc00) action + +#endif + +#endif /* COMPILE_PCRE8 */ + +#endif /* SUPPORT_UTF */ + + +/* 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 + + +/* 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. From release 8.00, PCRE_NOPARTIAL is unused, as +the restrictions on partial matching have been lifted. It remains for backwards +compatibility. */ + +#ifdef COMPILE_PCRE8 +#define PCRE_MODE 0x0001 /* compiled in 8 bit mode */ +#endif +#ifdef COMPILE_PCRE16 +#define PCRE_MODE 0x0002 /* compiled in 16 bit mode */ +#endif +#define PCRE_FIRSTSET 0x0010 /* first_char is set */ +#define PCRE_FCH_CASELESS 0x0020 /* caseless first char */ +#define PCRE_REQCHSET 0x0040 /* req_byte is set */ +#define PCRE_RCH_CASELESS 0x0080 /* caseless requested char */ +#define PCRE_STARTLINE 0x0100 /* start after \n for multiline */ +#define PCRE_NOPARTIAL 0x0200 /* can't use partial with this regex */ +#define PCRE_JCHANGED 0x0400 /* j option used in regex */ +#define PCRE_HASCRORLF 0x0800 /* explicit \r or \n in pattern */ +#define PCRE_HASTHEN 0x1000 /* pattern contains (*THEN) */ + +/* Flags for the "extra" block produced by pcre_study(). */ + +#define PCRE_STUDY_MAPPED 0x0001 /* a map of starting chars exists */ +#define PCRE_STUDY_MINLEN 0x0002 /* a minimum length field 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_COMPILE_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|PCRE_UCP|PCRE_NO_START_OPTIMIZE) + +#define PUBLIC_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_NEWLINE_BITS| \ + PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE|PCRE_NO_START_OPTIMIZE) + +#define PUBLIC_DFA_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NOTEMPTY_ATSTART| \ + PCRE_NO_UTF8_CHECK|PCRE_PARTIAL_HARD|PCRE_PARTIAL_SOFT|PCRE_DFA_SHORTEST| \ + PCRE_DFA_RESTART|PCRE_NEWLINE_BITS|PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE| \ + PCRE_NO_START_OPTIMIZE) + +#define PUBLIC_STUDY_OPTIONS \ + (PCRE_STUDY_JIT_COMPILE|PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE| \ + PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) + +/* Magic number to provide a small check against being handed junk. */ + +#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ + +/* This variable is used to detect a loaded regular expression +in different endianness. */ + +#define REVERSED_MAGIC_NUMBER 0x45524350UL /* 'ERCP' */ + +/* 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 + +/* Miscellaneous definitions. The #ifndef is to pacify compiler warnings in +environments where these macros are defined elsewhere. Unfortunately, there +is no way to do the same for the typedef. */ + +typedef int BOOL; + +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +/* If PCRE is to support UTF-8 on EBCDIC platforms, we cannot use normal +character constants like '*' because the compiler would emit their EBCDIC code, +which is different from their ASCII/UTF-8 code. Instead we define macros for +the characters so that they always use the ASCII/UTF-8 code when UTF-8 support +is enabled. When UTF-8 support is not enabled, the definitions use character +literals. Both character and string versions of each character are needed, and +there are some longer strings as well. + +This means that, on EBCDIC platforms, the PCRE library can handle either +EBCDIC, or UTF-8, but not both. To support both in the same compiled library +would need different lookups depending on whether PCRE_UTF8 was set or not. +This would make it impossible to use characters in switch/case statements, +which would reduce performance. For a theoretical use (which nobody has asked +for) in a minority area (EBCDIC platforms), this is not sensible. Any +application that did need both could compile two versions of the library, using +macros to give the functions distinct names. */ + +#ifndef SUPPORT_UTF + +/* UTF-8 support is not enabled; use the platform-dependent character literals +so that PCRE works on both ASCII and EBCDIC platforms, in non-UTF-mode only. */ + +#define CHAR_HT '\t' +#define CHAR_VT '\v' +#define CHAR_FF '\f' +#define CHAR_CR '\r' +#define CHAR_NL '\n' +#define CHAR_BS '\b' +#define CHAR_BEL '\a' +#ifdef EBCDIC +#define CHAR_ESC '\047' +#define CHAR_DEL '\007' +#else +#define CHAR_ESC '\033' +#define CHAR_DEL '\177' +#endif + +#define CHAR_SPACE ' ' +#define CHAR_EXCLAMATION_MARK '!' +#define CHAR_QUOTATION_MARK '"' +#define CHAR_NUMBER_SIGN '#' +#define CHAR_DOLLAR_SIGN '$' +#define CHAR_PERCENT_SIGN '%' +#define CHAR_AMPERSAND '&' +#define CHAR_APOSTROPHE '\'' +#define CHAR_LEFT_PARENTHESIS '(' +#define CHAR_RIGHT_PARENTHESIS ')' +#define CHAR_ASTERISK '*' +#define CHAR_PLUS '+' +#define CHAR_COMMA ',' +#define CHAR_MINUS '-' +#define CHAR_DOT '.' +#define CHAR_SLASH '/' +#define CHAR_0 '0' +#define CHAR_1 '1' +#define CHAR_2 '2' +#define CHAR_3 '3' +#define CHAR_4 '4' +#define CHAR_5 '5' +#define CHAR_6 '6' +#define CHAR_7 '7' +#define CHAR_8 '8' +#define CHAR_9 '9' +#define CHAR_COLON ':' +#define CHAR_SEMICOLON ';' +#define CHAR_LESS_THAN_SIGN '<' +#define CHAR_EQUALS_SIGN '=' +#define CHAR_GREATER_THAN_SIGN '>' +#define CHAR_QUESTION_MARK '?' +#define CHAR_COMMERCIAL_AT '@' +#define CHAR_A 'A' +#define CHAR_B 'B' +#define CHAR_C 'C' +#define CHAR_D 'D' +#define CHAR_E 'E' +#define CHAR_F 'F' +#define CHAR_G 'G' +#define CHAR_H 'H' +#define CHAR_I 'I' +#define CHAR_J 'J' +#define CHAR_K 'K' +#define CHAR_L 'L' +#define CHAR_M 'M' +#define CHAR_N 'N' +#define CHAR_O 'O' +#define CHAR_P 'P' +#define CHAR_Q 'Q' +#define CHAR_R 'R' +#define CHAR_S 'S' +#define CHAR_T 'T' +#define CHAR_U 'U' +#define CHAR_V 'V' +#define CHAR_W 'W' +#define CHAR_X 'X' +#define CHAR_Y 'Y' +#define CHAR_Z 'Z' +#define CHAR_LEFT_SQUARE_BRACKET '[' +#define CHAR_BACKSLASH '\\' +#define CHAR_RIGHT_SQUARE_BRACKET ']' +#define CHAR_CIRCUMFLEX_ACCENT '^' +#define CHAR_UNDERSCORE '_' +#define CHAR_GRAVE_ACCENT '`' +#define CHAR_a 'a' +#define CHAR_b 'b' +#define CHAR_c 'c' +#define CHAR_d 'd' +#define CHAR_e 'e' +#define CHAR_f 'f' +#define CHAR_g 'g' +#define CHAR_h 'h' +#define CHAR_i 'i' +#define CHAR_j 'j' +#define CHAR_k 'k' +#define CHAR_l 'l' +#define CHAR_m 'm' +#define CHAR_n 'n' +#define CHAR_o 'o' +#define CHAR_p 'p' +#define CHAR_q 'q' +#define CHAR_r 'r' +#define CHAR_s 's' +#define CHAR_t 't' +#define CHAR_u 'u' +#define CHAR_v 'v' +#define CHAR_w 'w' +#define CHAR_x 'x' +#define CHAR_y 'y' +#define CHAR_z 'z' +#define CHAR_LEFT_CURLY_BRACKET '{' +#define CHAR_VERTICAL_LINE '|' +#define CHAR_RIGHT_CURLY_BRACKET '}' +#define CHAR_TILDE '~' + +#define STR_HT "\t" +#define STR_VT "\v" +#define STR_FF "\f" +#define STR_CR "\r" +#define STR_NL "\n" +#define STR_BS "\b" +#define STR_BEL "\a" +#ifdef EBCDIC +#define STR_ESC "\047" +#define STR_DEL "\007" +#else +#define STR_ESC "\033" +#define STR_DEL "\177" +#endif + +#define STR_SPACE " " +#define STR_EXCLAMATION_MARK "!" +#define STR_QUOTATION_MARK "\"" +#define STR_NUMBER_SIGN "#" +#define STR_DOLLAR_SIGN "$" +#define STR_PERCENT_SIGN "%" +#define STR_AMPERSAND "&" +#define STR_APOSTROPHE "'" +#define STR_LEFT_PARENTHESIS "(" +#define STR_RIGHT_PARENTHESIS ")" +#define STR_ASTERISK "*" +#define STR_PLUS "+" +#define STR_COMMA "," +#define STR_MINUS "-" +#define STR_DOT "." +#define STR_SLASH "/" +#define STR_0 "0" +#define STR_1 "1" +#define STR_2 "2" +#define STR_3 "3" +#define STR_4 "4" +#define STR_5 "5" +#define STR_6 "6" +#define STR_7 "7" +#define STR_8 "8" +#define STR_9 "9" +#define STR_COLON ":" +#define STR_SEMICOLON ";" +#define STR_LESS_THAN_SIGN "<" +#define STR_EQUALS_SIGN "=" +#define STR_GREATER_THAN_SIGN ">" +#define STR_QUESTION_MARK "?" +#define STR_COMMERCIAL_AT "@" +#define STR_A "A" +#define STR_B "B" +#define STR_C "C" +#define STR_D "D" +#define STR_E "E" +#define STR_F "F" +#define STR_G "G" +#define STR_H "H" +#define STR_I "I" +#define STR_J "J" +#define STR_K "K" +#define STR_L "L" +#define STR_M "M" +#define STR_N "N" +#define STR_O "O" +#define STR_P "P" +#define STR_Q "Q" +#define STR_R "R" +#define STR_S "S" +#define STR_T "T" +#define STR_U "U" +#define STR_V "V" +#define STR_W "W" +#define STR_X "X" +#define STR_Y "Y" +#define STR_Z "Z" +#define STR_LEFT_SQUARE_BRACKET "[" +#define STR_BACKSLASH "\\" +#define STR_RIGHT_SQUARE_BRACKET "]" +#define STR_CIRCUMFLEX_ACCENT "^" +#define STR_UNDERSCORE "_" +#define STR_GRAVE_ACCENT "`" +#define STR_a "a" +#define STR_b "b" +#define STR_c "c" +#define STR_d "d" +#define STR_e "e" +#define STR_f "f" +#define STR_g "g" +#define STR_h "h" +#define STR_i "i" +#define STR_j "j" +#define STR_k "k" +#define STR_l "l" +#define STR_m "m" +#define STR_n "n" +#define STR_o "o" +#define STR_p "p" +#define STR_q "q" +#define STR_r "r" +#define STR_s "s" +#define STR_t "t" +#define STR_u "u" +#define STR_v "v" +#define STR_w "w" +#define STR_x "x" +#define STR_y "y" +#define STR_z "z" +#define STR_LEFT_CURLY_BRACKET "{" +#define STR_VERTICAL_LINE "|" +#define STR_RIGHT_CURLY_BRACKET "}" +#define STR_TILDE "~" + +#define STRING_ACCEPT0 "ACCEPT\0" +#define STRING_COMMIT0 "COMMIT\0" +#define STRING_F0 "F\0" +#define STRING_FAIL0 "FAIL\0" +#define STRING_MARK0 "MARK\0" +#define STRING_PRUNE0 "PRUNE\0" +#define STRING_SKIP0 "SKIP\0" +#define STRING_THEN "THEN" + +#define STRING_alpha0 "alpha\0" +#define STRING_lower0 "lower\0" +#define STRING_upper0 "upper\0" +#define STRING_alnum0 "alnum\0" +#define STRING_ascii0 "ascii\0" +#define STRING_blank0 "blank\0" +#define STRING_cntrl0 "cntrl\0" +#define STRING_digit0 "digit\0" +#define STRING_graph0 "graph\0" +#define STRING_print0 "print\0" +#define STRING_punct0 "punct\0" +#define STRING_space0 "space\0" +#define STRING_word0 "word\0" +#define STRING_xdigit "xdigit" + +#define STRING_DEFINE "DEFINE" + +#define STRING_CR_RIGHTPAR "CR)" +#define STRING_LF_RIGHTPAR "LF)" +#define STRING_CRLF_RIGHTPAR "CRLF)" +#define STRING_ANY_RIGHTPAR "ANY)" +#define STRING_ANYCRLF_RIGHTPAR "ANYCRLF)" +#define STRING_BSR_ANYCRLF_RIGHTPAR "BSR_ANYCRLF)" +#define STRING_BSR_UNICODE_RIGHTPAR "BSR_UNICODE)" +#ifdef COMPILE_PCRE8 +#define STRING_UTF_RIGHTPAR "UTF8)" +#endif +#ifdef COMPILE_PCRE16 +#define STRING_UTF_RIGHTPAR "UTF16)" +#endif +#define STRING_UCP_RIGHTPAR "UCP)" +#define STRING_NO_START_OPT_RIGHTPAR "NO_START_OPT)" + +#else /* SUPPORT_UTF */ + +/* UTF-8 support is enabled; always use UTF-8 (=ASCII) character codes. This +works in both modes non-EBCDIC platforms, and on EBCDIC platforms in UTF-8 mode +only. */ + +#define CHAR_HT '\011' +#define CHAR_VT '\013' +#define CHAR_FF '\014' +#define CHAR_CR '\015' +#define CHAR_NL '\012' +#define CHAR_BS '\010' +#define CHAR_BEL '\007' +#define CHAR_ESC '\033' +#define CHAR_DEL '\177' + +#define CHAR_SPACE '\040' +#define CHAR_EXCLAMATION_MARK '\041' +#define CHAR_QUOTATION_MARK '\042' +#define CHAR_NUMBER_SIGN '\043' +#define CHAR_DOLLAR_SIGN '\044' +#define CHAR_PERCENT_SIGN '\045' +#define CHAR_AMPERSAND '\046' +#define CHAR_APOSTROPHE '\047' +#define CHAR_LEFT_PARENTHESIS '\050' +#define CHAR_RIGHT_PARENTHESIS '\051' +#define CHAR_ASTERISK '\052' +#define CHAR_PLUS '\053' +#define CHAR_COMMA '\054' +#define CHAR_MINUS '\055' +#define CHAR_DOT '\056' +#define CHAR_SLASH '\057' +#define CHAR_0 '\060' +#define CHAR_1 '\061' +#define CHAR_2 '\062' +#define CHAR_3 '\063' +#define CHAR_4 '\064' +#define CHAR_5 '\065' +#define CHAR_6 '\066' +#define CHAR_7 '\067' +#define CHAR_8 '\070' +#define CHAR_9 '\071' +#define CHAR_COLON '\072' +#define CHAR_SEMICOLON '\073' +#define CHAR_LESS_THAN_SIGN '\074' +#define CHAR_EQUALS_SIGN '\075' +#define CHAR_GREATER_THAN_SIGN '\076' +#define CHAR_QUESTION_MARK '\077' +#define CHAR_COMMERCIAL_AT '\100' +#define CHAR_A '\101' +#define CHAR_B '\102' +#define CHAR_C '\103' +#define CHAR_D '\104' +#define CHAR_E '\105' +#define CHAR_F '\106' +#define CHAR_G '\107' +#define CHAR_H '\110' +#define CHAR_I '\111' +#define CHAR_J '\112' +#define CHAR_K '\113' +#define CHAR_L '\114' +#define CHAR_M '\115' +#define CHAR_N '\116' +#define CHAR_O '\117' +#define CHAR_P '\120' +#define CHAR_Q '\121' +#define CHAR_R '\122' +#define CHAR_S '\123' +#define CHAR_T '\124' +#define CHAR_U '\125' +#define CHAR_V '\126' +#define CHAR_W '\127' +#define CHAR_X '\130' +#define CHAR_Y '\131' +#define CHAR_Z '\132' +#define CHAR_LEFT_SQUARE_BRACKET '\133' +#define CHAR_BACKSLASH '\134' +#define CHAR_RIGHT_SQUARE_BRACKET '\135' +#define CHAR_CIRCUMFLEX_ACCENT '\136' +#define CHAR_UNDERSCORE '\137' +#define CHAR_GRAVE_ACCENT '\140' +#define CHAR_a '\141' +#define CHAR_b '\142' +#define CHAR_c '\143' +#define CHAR_d '\144' +#define CHAR_e '\145' +#define CHAR_f '\146' +#define CHAR_g '\147' +#define CHAR_h '\150' +#define CHAR_i '\151' +#define CHAR_j '\152' +#define CHAR_k '\153' +#define CHAR_l '\154' +#define CHAR_m '\155' +#define CHAR_n '\156' +#define CHAR_o '\157' +#define CHAR_p '\160' +#define CHAR_q '\161' +#define CHAR_r '\162' +#define CHAR_s '\163' +#define CHAR_t '\164' +#define CHAR_u '\165' +#define CHAR_v '\166' +#define CHAR_w '\167' +#define CHAR_x '\170' +#define CHAR_y '\171' +#define CHAR_z '\172' +#define CHAR_LEFT_CURLY_BRACKET '\173' +#define CHAR_VERTICAL_LINE '\174' +#define CHAR_RIGHT_CURLY_BRACKET '\175' +#define CHAR_TILDE '\176' + +#define STR_HT "\011" +#define STR_VT "\013" +#define STR_FF "\014" +#define STR_CR "\015" +#define STR_NL "\012" +#define STR_BS "\010" +#define STR_BEL "\007" +#define STR_ESC "\033" +#define STR_DEL "\177" + +#define STR_SPACE "\040" +#define STR_EXCLAMATION_MARK "\041" +#define STR_QUOTATION_MARK "\042" +#define STR_NUMBER_SIGN "\043" +#define STR_DOLLAR_SIGN "\044" +#define STR_PERCENT_SIGN "\045" +#define STR_AMPERSAND "\046" +#define STR_APOSTROPHE "\047" +#define STR_LEFT_PARENTHESIS "\050" +#define STR_RIGHT_PARENTHESIS "\051" +#define STR_ASTERISK "\052" +#define STR_PLUS "\053" +#define STR_COMMA "\054" +#define STR_MINUS "\055" +#define STR_DOT "\056" +#define STR_SLASH "\057" +#define STR_0 "\060" +#define STR_1 "\061" +#define STR_2 "\062" +#define STR_3 "\063" +#define STR_4 "\064" +#define STR_5 "\065" +#define STR_6 "\066" +#define STR_7 "\067" +#define STR_8 "\070" +#define STR_9 "\071" +#define STR_COLON "\072" +#define STR_SEMICOLON "\073" +#define STR_LESS_THAN_SIGN "\074" +#define STR_EQUALS_SIGN "\075" +#define STR_GREATER_THAN_SIGN "\076" +#define STR_QUESTION_MARK "\077" +#define STR_COMMERCIAL_AT "\100" +#define STR_A "\101" +#define STR_B "\102" +#define STR_C "\103" +#define STR_D "\104" +#define STR_E "\105" +#define STR_F "\106" +#define STR_G "\107" +#define STR_H "\110" +#define STR_I "\111" +#define STR_J "\112" +#define STR_K "\113" +#define STR_L "\114" +#define STR_M "\115" +#define STR_N "\116" +#define STR_O "\117" +#define STR_P "\120" +#define STR_Q "\121" +#define STR_R "\122" +#define STR_S "\123" +#define STR_T "\124" +#define STR_U "\125" +#define STR_V "\126" +#define STR_W "\127" +#define STR_X "\130" +#define STR_Y "\131" +#define STR_Z "\132" +#define STR_LEFT_SQUARE_BRACKET "\133" +#define STR_BACKSLASH "\134" +#define STR_RIGHT_SQUARE_BRACKET "\135" +#define STR_CIRCUMFLEX_ACCENT "\136" +#define STR_UNDERSCORE "\137" +#define STR_GRAVE_ACCENT "\140" +#define STR_a "\141" +#define STR_b "\142" +#define STR_c "\143" +#define STR_d "\144" +#define STR_e "\145" +#define STR_f "\146" +#define STR_g "\147" +#define STR_h "\150" +#define STR_i "\151" +#define STR_j "\152" +#define STR_k "\153" +#define STR_l "\154" +#define STR_m "\155" +#define STR_n "\156" +#define STR_o "\157" +#define STR_p "\160" +#define STR_q "\161" +#define STR_r "\162" +#define STR_s "\163" +#define STR_t "\164" +#define STR_u "\165" +#define STR_v "\166" +#define STR_w "\167" +#define STR_x "\170" +#define STR_y "\171" +#define STR_z "\172" +#define STR_LEFT_CURLY_BRACKET "\173" +#define STR_VERTICAL_LINE "\174" +#define STR_RIGHT_CURLY_BRACKET "\175" +#define STR_TILDE "\176" + +#define STRING_ACCEPT0 STR_A STR_C STR_C STR_E STR_P STR_T "\0" +#define STRING_COMMIT0 STR_C STR_O STR_M STR_M STR_I STR_T "\0" +#define STRING_F0 STR_F "\0" +#define STRING_FAIL0 STR_F STR_A STR_I STR_L "\0" +#define STRING_MARK0 STR_M STR_A STR_R STR_K "\0" +#define STRING_PRUNE0 STR_P STR_R STR_U STR_N STR_E "\0" +#define STRING_SKIP0 STR_S STR_K STR_I STR_P "\0" +#define STRING_THEN STR_T STR_H STR_E STR_N + +#define STRING_alpha0 STR_a STR_l STR_p STR_h STR_a "\0" +#define STRING_lower0 STR_l STR_o STR_w STR_e STR_r "\0" +#define STRING_upper0 STR_u STR_p STR_p STR_e STR_r "\0" +#define STRING_alnum0 STR_a STR_l STR_n STR_u STR_m "\0" +#define STRING_ascii0 STR_a STR_s STR_c STR_i STR_i "\0" +#define STRING_blank0 STR_b STR_l STR_a STR_n STR_k "\0" +#define STRING_cntrl0 STR_c STR_n STR_t STR_r STR_l "\0" +#define STRING_digit0 STR_d STR_i STR_g STR_i STR_t "\0" +#define STRING_graph0 STR_g STR_r STR_a STR_p STR_h "\0" +#define STRING_print0 STR_p STR_r STR_i STR_n STR_t "\0" +#define STRING_punct0 STR_p STR_u STR_n STR_c STR_t "\0" +#define STRING_space0 STR_s STR_p STR_a STR_c STR_e "\0" +#define STRING_word0 STR_w STR_o STR_r STR_d "\0" +#define STRING_xdigit STR_x STR_d STR_i STR_g STR_i STR_t + +#define STRING_DEFINE STR_D STR_E STR_F STR_I STR_N STR_E + +#define STRING_CR_RIGHTPAR STR_C STR_R STR_RIGHT_PARENTHESIS +#define STRING_LF_RIGHTPAR STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_CRLF_RIGHTPAR STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_ANY_RIGHTPAR STR_A STR_N STR_Y STR_RIGHT_PARENTHESIS +#define STRING_ANYCRLF_RIGHTPAR STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_ANYCRLF_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_A STR_N STR_Y STR_C STR_R STR_L STR_F STR_RIGHT_PARENTHESIS +#define STRING_BSR_UNICODE_RIGHTPAR STR_B STR_S STR_R STR_UNDERSCORE STR_U STR_N STR_I STR_C STR_O STR_D STR_E STR_RIGHT_PARENTHESIS +#ifdef COMPILE_PCRE8 +#define STRING_UTF_RIGHTPAR STR_U STR_T STR_F STR_8 STR_RIGHT_PARENTHESIS +#endif +#ifdef COMPILE_PCRE16 +#define STRING_UTF_RIGHTPAR STR_U STR_T STR_F STR_1 STR_6 STR_RIGHT_PARENTHESIS +#endif +#define STRING_UCP_RIGHTPAR STR_U STR_C STR_P STR_RIGHT_PARENTHESIS +#define STRING_NO_START_OPT_RIGHTPAR STR_N STR_O STR_UNDERSCORE STR_S STR_T STR_A STR_R STR_T STR_UNDERSCORE STR_O STR_P STR_T STR_RIGHT_PARENTHESIS + +#endif /* SUPPORT_UTF */ + +/* Escape items that are just an encoding of a particular data value. */ + +#ifndef ESC_e +#define ESC_e CHAR_ESC +#endif + +#ifndef ESC_f +#define ESC_f CHAR_FF +#endif + +#ifndef ESC_n +#define ESC_n CHAR_NL +#endif + +#ifndef ESC_r +#define ESC_r CHAR_CR +#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 CHAR_HT +#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 /* Specified general characteristic (e.g. L) */ +#define PT_PC 3 /* Specified particular characteristic (e.g. Lu) */ +#define PT_SC 4 /* Script (e.g. Han) */ +#define PT_ALNUM 5 /* Alphanumeric - the union of L and N */ +#define PT_SPACE 6 /* Perl space - Z plus 9,10,12,13 */ +#define PT_PXSPACE 7 /* POSIX space - Z plus 9,10,11,12,13 */ +#define PT_WORD 8 /* Word - L plus N plus underscore */ + +/* Flag bits and data types for the extended class (OP_XCLASS) for classes that +contain 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_ALLANY because it +corresponds to "." in DOTALL mode rather than an escape sequence. It is also +used for [^] in JavaScript compatibility mode, and for \C in non-utf mode. In +non-DOTALL mode, "." behaves like \N. + +The special values ESC_DU, ESC_du, etc. are used instead of ESC_D, ESC_d, etc. +when PCRE_UCP is set, when replacement of \d etc by \p sequences is required. +They must be contiguous, and remain in order so that the replacements can be +looked up from a table. + +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_N, ESC_dum, 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_DU, ESC_du, ESC_SU, ESC_su, ESC_WU, ESC_wu, + 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 are also tables called +"coptable" and "poptable" 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 except newline */ + OP_ALLANY, /* 13 Match any character */ + 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_CIRC, /* 25 Start of line - not multiline */ + OP_CIRCM, /* 26 Start of line - multiline */ + OP_DOLL, /* 27 End of line - not multiline */ + OP_DOLLM, /* 28 End of line - multiline */ + OP_CHAR, /* 29 Match one character, casefully */ + OP_CHARI, /* 30 Match one character, caselessly */ + OP_NOT, /* 31 Match one character, not the given one, casefully */ + OP_NOTI, /* 32 Match one character, not the given one, caselessly */ + + /* The following sets of 13 opcodes must always be kept in step because + the offset from the first one is used to generate the others. */ + + /**** Single characters, caseful, must precede the caseless ones ****/ + + OP_STAR, /* 33 The maximizing and minimizing versions of */ + OP_MINSTAR, /* 34 these six opcodes must come in pairs, with */ + OP_PLUS, /* 35 the minimizing one second. */ + OP_MINPLUS, /* 36 */ + OP_QUERY, /* 37 */ + OP_MINQUERY, /* 38 */ + + OP_UPTO, /* 39 From 0 to n matches of one character, caseful*/ + OP_MINUPTO, /* 40 */ + OP_EXACT, /* 41 Exactly n matches */ + + OP_POSSTAR, /* 42 Possessified star, caseful */ + OP_POSPLUS, /* 43 Possessified plus, caseful */ + OP_POSQUERY, /* 44 Posesssified query, caseful */ + OP_POSUPTO, /* 45 Possessified upto, caseful */ + + /**** Single characters, caseless, must follow the caseful ones */ + + OP_STARI, /* 46 */ + OP_MINSTARI, /* 47 */ + OP_PLUSI, /* 48 */ + OP_MINPLUSI, /* 49 */ + OP_QUERYI, /* 50 */ + OP_MINQUERYI, /* 51 */ + + OP_UPTOI, /* 52 From 0 to n matches of one character, caseless */ + OP_MINUPTOI, /* 53 */ + OP_EXACTI, /* 54 */ + + OP_POSSTARI, /* 55 Possessified star, caseless */ + OP_POSPLUSI, /* 56 Possessified plus, caseless */ + OP_POSQUERYI, /* 57 Posesssified query, caseless */ + OP_POSUPTOI, /* 58 Possessified upto, caseless */ + + /**** The negated ones must follow the non-negated ones, and match them ****/ + /**** Negated single character, caseful; must precede the caseless ones ****/ + + OP_NOTSTAR, /* 59 The maximizing and minimizing versions of */ + OP_NOTMINSTAR, /* 60 these six opcodes must come in pairs, with */ + OP_NOTPLUS, /* 61 the minimizing one second. They must be in */ + OP_NOTMINPLUS, /* 62 exactly the same order as those above. */ + OP_NOTQUERY, /* 63 */ + OP_NOTMINQUERY, /* 64 */ + + OP_NOTUPTO, /* 65 From 0 to n matches, caseful */ + OP_NOTMINUPTO, /* 66 */ + OP_NOTEXACT, /* 67 Exactly n matches */ + + OP_NOTPOSSTAR, /* 68 Possessified versions, caseful */ + OP_NOTPOSPLUS, /* 69 */ + OP_NOTPOSQUERY, /* 70 */ + OP_NOTPOSUPTO, /* 71 */ + + /**** Negated single character, caseless; must follow the caseful ones ****/ + + OP_NOTSTARI, /* 72 */ + OP_NOTMINSTARI, /* 73 */ + OP_NOTPLUSI, /* 74 */ + OP_NOTMINPLUSI, /* 75 */ + OP_NOTQUERYI, /* 76 */ + OP_NOTMINQUERYI, /* 77 */ + + OP_NOTUPTOI, /* 78 From 0 to n matches, caseless */ + OP_NOTMINUPTOI, /* 79 */ + OP_NOTEXACTI, /* 80 Exactly n matches */ + + OP_NOTPOSSTARI, /* 81 Possessified versions, caseless */ + OP_NOTPOSPLUSI, /* 82 */ + OP_NOTPOSQUERYI, /* 83 */ + OP_NOTPOSUPTOI, /* 84 */ + + /**** Character types ****/ + + OP_TYPESTAR, /* 85 The maximizing and minimizing versions of */ + OP_TYPEMINSTAR, /* 86 these six opcodes must come in pairs, with */ + OP_TYPEPLUS, /* 87 the minimizing one second. These codes must */ + OP_TYPEMINPLUS, /* 88 be in exactly the same order as those above. */ + OP_TYPEQUERY, /* 89 */ + OP_TYPEMINQUERY, /* 90 */ + + OP_TYPEUPTO, /* 91 From 0 to n matches */ + OP_TYPEMINUPTO, /* 92 */ + OP_TYPEEXACT, /* 93 Exactly n matches */ + + OP_TYPEPOSSTAR, /* 94 Possessified versions */ + OP_TYPEPOSPLUS, /* 95 */ + OP_TYPEPOSQUERY, /* 96 */ + OP_TYPEPOSUPTO, /* 97 */ + + /* These are used for character classes and back references; only the + first six are the same as the sets above. */ + + OP_CRSTAR, /* 98 The maximizing and minimizing versions of */ + OP_CRMINSTAR, /* 99 all these opcodes must come in pairs, with */ + OP_CRPLUS, /* 100 the minimizing one second. These codes must */ + OP_CRMINPLUS, /* 101 be in exactly the same order as those above. */ + OP_CRQUERY, /* 102 */ + OP_CRMINQUERY, /* 103 */ + + OP_CRRANGE, /* 104 These are different to the three sets above. */ + OP_CRMINRANGE, /* 105 */ + + /* End of quantifier opcodes */ + + OP_CLASS, /* 106 Match a character class, chars < 256 only */ + OP_NCLASS, /* 107 Same, but the bitmap was created from a negative + class - the difference is relevant only when a + character > 255 is encountered. */ + OP_XCLASS, /* 108 Extended class for handling > 255 chars within the + class. This does both positive and negative. */ + OP_REF, /* 109 Match a back reference, casefully */ + OP_REFI, /* 110 Match a back reference, caselessly */ + OP_RECURSE, /* 111 Match a numbered subpattern (possibly recursive) */ + OP_CALLOUT, /* 112 Call out to external function if provided */ + + OP_ALT, /* 113 Start of alternation */ + OP_KET, /* 114 End of group that doesn't have an unbounded repeat */ + OP_KETRMAX, /* 115 These two must remain together and in this */ + OP_KETRMIN, /* 116 order. They are for groups the repeat for ever. */ + OP_KETRPOS, /* 117 Possessive unlimited repeat. */ + + /* The assertions must come before BRA, CBRA, ONCE, and COND, and the four + asserts must remain in order. */ + + OP_REVERSE, /* 118 Move pointer back - used in lookbehind assertions */ + OP_ASSERT, /* 119 Positive lookahead */ + OP_ASSERT_NOT, /* 120 Negative lookahead */ + OP_ASSERTBACK, /* 121 Positive lookbehind */ + OP_ASSERTBACK_NOT, /* 122 Negative lookbehind */ + + /* ONCE, ONCE_NC, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately + after the assertions, with ONCE first, as there's a test for >= ONCE for a + subpattern that isn't an assertion. The POS versions must immediately follow + the non-POS versions in each case. */ + + OP_ONCE, /* 123 Atomic group, contains captures */ + OP_ONCE_NC, /* 124 Atomic group containing no captures */ + OP_BRA, /* 125 Start of non-capturing bracket */ + OP_BRAPOS, /* 126 Ditto, with unlimited, possessive repeat */ + OP_CBRA, /* 127 Start of capturing bracket */ + OP_CBRAPOS, /* 128 Ditto, with unlimited, possessive repeat */ + OP_COND, /* 129 Conditional group */ + + /* These five must follow the previous five, in the same order. There's a + check for >= SBRA to distinguish the two sets. */ + + OP_SBRA, /* 130 Start of non-capturing bracket, check empty */ + OP_SBRAPOS, /* 131 Ditto, with unlimited, possessive repeat */ + OP_SCBRA, /* 132 Start of capturing bracket, check empty */ + OP_SCBRAPOS, /* 133 Ditto, with unlimited, possessive repeat */ + OP_SCOND, /* 134 Conditional group, check empty */ + + /* The next two pairs must (respectively) be kept together. */ + + OP_CREF, /* 135 Used to hold a capture number as condition */ + OP_NCREF, /* 136 Same, but generated by a name reference*/ + OP_RREF, /* 137 Used to hold a recursion number as condition */ + OP_NRREF, /* 138 Same, but generated by a name reference*/ + OP_DEF, /* 139 The DEFINE condition */ + + OP_BRAZERO, /* 140 These two must remain together and in this */ + OP_BRAMINZERO, /* 141 order. */ + OP_BRAPOSZERO, /* 142 */ + + /* These are backtracking control verbs */ + + OP_MARK, /* 143 always has an argument */ + OP_PRUNE, /* 144 */ + OP_PRUNE_ARG, /* 145 same, but with argument */ + OP_SKIP, /* 146 */ + OP_SKIP_ARG, /* 147 same, but with argument */ + OP_THEN, /* 148 */ + OP_THEN_ARG, /* 149 same, but with argument */ + OP_COMMIT, /* 150 */ + + /* These are forced failure and success verbs */ + + OP_FAIL, /* 151 */ + OP_ACCEPT, /* 152 */ + OP_ASSERT_ACCEPT, /* 153 Used inside assertions */ + OP_CLOSE, /* 154 Used before OP_ACCEPT to close open captures */ + + /* This is used to skip a subpattern with a {0} quantifier */ + + OP_SKIPZERO, /* 155 */ + + /* This is not an opcode, but is used to check that tables indexed by opcode + are the correct length, in order to catch updating errors - there have been + some in the past. */ + + OP_TABLE_LENGTH +}; + +/* *** NOTE NOTE NOTE *** Whenever the list above is updated, the two macro +definitions that follow must also be updated to match. There are also tables +called "coptable" and "poptable" in pcre_dfa_exec.c that must be updated. */ + + +/* This macro defines textual names for all the opcodes. These are used only +for debugging, and some of them are only partial names. The macro is referenced +only in pcre_printint.c, which fills out the full names in many cases (and in +some cases doesn't actually use these names at all). */ + +#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", \ + "^", "^", "$", "$", "char", "chari", "not", "noti", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", \ + "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ + "*+","++", "?+", "{", \ + "*", "*?", "+", "+?", "?", "??", "{", "{", \ + "class", "nclass", "xclass", "Ref", "Refi", \ + "Recurse", "Callout", \ + "Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \ + "Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \ + "Once", "Once_NC", \ + "Bra", "BraPos", "CBra", "CBraPos", \ + "Cond", \ + "SBra", "SBraPos", "SCBra", "SCBraPos", \ + "SCond", \ + "Cond ref", "Cond nref", "Cond rec", "Cond nrec", "Cond def", \ + "Brazero", "Braminzero", "Braposzero", \ + "*MARK", "*PRUNE", "*PRUNE", "*SKIP", "*SKIP", \ + "*THEN", "*THEN", "*COMMIT", "*FAIL", \ + "*ACCEPT", "*ASSERT_ACCEPT", \ + "Close", "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, /* \P, \p */ \ + 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ \ + 1, /* \X */ \ + 1, 1, 1, 1, 1, 1, /* \Z, \z, ^, ^M, $, $M */ \ + 2, /* Char - the minimum length */ \ + 2, /* Chari - the minimum length */ \ + 2, /* not */ \ + 2, /* noti */ \ + /* Positive single-char repeats ** These are */ \ + 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* upto, minupto ** mode */ \ + 2+IMM2_SIZE, /* exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* *+, ++, ?+, upto+ */ \ + 2, 2, 2, 2, 2, 2, /* *I, *?I, +I, +?I, ?I, ??I ** UTF-8 */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* upto I, minupto I */ \ + 2+IMM2_SIZE, /* exact I */ \ + 2, 2, 2, 2+IMM2_SIZE, /* *+I, ++I, ?+I, upto+I */ \ + /* Negative single-char repeats - only for chars < 256 */ \ + 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* NOT upto, minupto */ \ + 2+IMM2_SIZE, /* NOT exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive NOT *, +, ?, upto */ \ + 2, 2, 2, 2, 2, 2, /* NOT *I, *?I, +I, +?I, ?I, ??I */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* NOT upto I, minupto I */ \ + 2+IMM2_SIZE, /* NOT exact I */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive NOT *I, +I, ?I, upto I */ \ + /* Positive type repeats */ \ + 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ + 2+IMM2_SIZE, 2+IMM2_SIZE, /* Type upto, minupto */ \ + 2+IMM2_SIZE, /* Type exact */ \ + 2, 2, 2, 2+IMM2_SIZE, /* Possessive *+, ++, ?+, upto+ */ \ + /* Character class & ref repeats */ \ + 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ + 1+2*IMM2_SIZE, 1+2*IMM2_SIZE, /* CRRANGE, CRMINRANGE */ \ + 1+(32/sizeof(pcre_uchar)), /* CLASS */ \ + 1+(32/sizeof(pcre_uchar)), /* NCLASS */ \ + 0, /* XCLASS - variable length */ \ + 1+IMM2_SIZE, /* REF */ \ + 1+IMM2_SIZE, /* REFI */ \ + 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, /* KetRpos */ \ + 1+LINK_SIZE, /* Reverse */ \ + 1+LINK_SIZE, /* Assert */ \ + 1+LINK_SIZE, /* Assert not */ \ + 1+LINK_SIZE, /* Assert behind */ \ + 1+LINK_SIZE, /* Assert behind not */ \ + 1+LINK_SIZE, /* ONCE */ \ + 1+LINK_SIZE, /* ONCE_NC */ \ + 1+LINK_SIZE, /* BRA */ \ + 1+LINK_SIZE, /* BRAPOS */ \ + 1+LINK_SIZE+IMM2_SIZE, /* CBRA */ \ + 1+LINK_SIZE+IMM2_SIZE, /* CBRAPOS */ \ + 1+LINK_SIZE, /* COND */ \ + 1+LINK_SIZE, /* SBRA */ \ + 1+LINK_SIZE, /* SBRAPOS */ \ + 1+LINK_SIZE+IMM2_SIZE, /* SCBRA */ \ + 1+LINK_SIZE+IMM2_SIZE, /* SCBRAPOS */ \ + 1+LINK_SIZE, /* SCOND */ \ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* CREF, NCREF */ \ + 1+IMM2_SIZE, 1+IMM2_SIZE, /* RREF, NRREF */ \ + 1, /* DEF */ \ + 1, 1, 1, /* BRAZERO, BRAMINZERO, BRAPOSZERO */ \ + 3, 1, 3, /* MARK, PRUNE, PRUNE_ARG */ \ + 1, 3, /* SKIP, SKIP_ARG */ \ + 1, 3, /* THEN, THEN_ARG */ \ + 1, 1, 1, 1, /* COMMIT, FAIL, ACCEPT, ASSERT_ACCEPT */ \ + 1+IMM2_SIZE, 1 /* CLOSE, SKIPZERO */ + +/* A magic value for OP_RREF and OP_NRREF to indicate the "any recursion" +condition. */ + +#define RREF_ANY 0xffff + +/* Compile time error code numbers. They are given names so that they can more +easily be tracked. When a new number is added, the table called eint in +pcreposix.c must be updated. */ + +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, ERR65, ERR66, ERR67, ERR68, ERR69, + ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERRCOUNT }; + +/* JIT compiling modes. The function list is indexed by them. */ +enum { JIT_COMPILE, JIT_PARTIAL_SOFT_COMPILE, JIT_PARTIAL_HARD_COMPILE, + JIT_NUMBER_OF_COMPILE_MODES }; + +/* 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 +*/ + +#ifdef COMPILE_PCRE8 +#define REAL_PCRE real_pcre +#else +#define REAL_PCRE real_pcre16 +#endif + +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 max_lookbehind; /* Longest lookbehind (characters) */ + pcre_uint16 top_bracket; /* Highest numbered group */ + pcre_uint16 top_backref; /* Highest numbered back reference */ + pcre_uint16 first_char; /* Starting character */ + pcre_uint16 req_char; /* This character must be seen */ + 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 pcre_uint8 *tables; /* Pointer to tables or NULL for std */ + const pcre_uint8 *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 flags; /* Private flags */ + pcre_uint8 start_bits[32]; /* Starting char bits */ + pcre_uint32 minlength; /* Minimum subject length */ +} pcre_study_data; + +/* Structure for building a chain of open capturing subpatterns during +compiling, so that instructions to close them can be compiled when (*ACCEPT) is +encountered. This is also used to identify subpatterns that contain recursive +back references to themselves, so that they can be made atomic. */ + +typedef struct open_capitem { + struct open_capitem *next; /* Chain link */ + pcre_uint16 number; /* Capture number */ + pcre_uint16 flag; /* Set TRUE if recursive back ref */ +} open_capitem; + +/* Structure for passing "static" information around between the functions +doing the compiling, so that they are thread-safe. */ + +typedef struct compile_data { + const pcre_uint8 *lcc; /* Points to lower casing table */ + const pcre_uint8 *fcc; /* Points to case-flipping table */ + const pcre_uint8 *cbits; /* Points to character type table */ + const pcre_uint8 *ctypes; /* Points to table of type maps */ + const pcre_uchar *start_workspace;/* The start of working space */ + const pcre_uchar *start_code; /* The start of the compiled code */ + const pcre_uchar *start_pattern; /* The start of the pattern */ + const pcre_uchar *end_pattern; /* The end of the pattern */ + open_capitem *open_caps; /* Chain of open capture items */ + pcre_uchar *hwm; /* High watermark of workspace */ + pcre_uchar *name_table; /* The name/number table */ + int names_found; /* Number of entries so far */ + int name_entry_size; /* Size of each entry */ + int workspace_size; /* Size of workspace */ + int bracount; /* Count of capturing parens as we compile */ + int final_bracount; /* Saved value after first pass */ + int max_lookbehind; /* Maximum lookbehind (characters) */ + int top_backref; /* Maximum back reference */ + unsigned int backref_map; /* Bitmap of low back refs */ + int assert_depth; /* Depth of nested assertions */ + 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 */ + BOOL check_lookbehind; /* Lookbehinds need later checking */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + pcre_uchar 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 while compiling. */ + +typedef struct branch_chain { + struct branch_chain *outer; + pcre_uchar *current_branch; +} branch_chain; + +/* Structure for items in a linked list that represents an explicit recursive +call within the pattern; used by pcre_exec(). */ + +typedef struct recursion_info { + struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ + int group_num; /* Number of group that was called */ + int *offset_save; /* Pointer to start of saved offsets */ + int saved_max; /* Number of saved offsets */ + PCRE_PUCHAR subject_position; /* Position at start of recursion */ +} recursion_info; + +/* A similar structure for pcre_dfa_exec(). */ + +typedef struct dfa_recursion_info { + struct dfa_recursion_info *prevrec; + int group_num; + PCRE_PUCHAR subject_position; +} dfa_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; used by +pcre_exec(). */ + +typedef struct eptrblock { + struct eptrblock *epb_prev; + PCRE_PUCHAR 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 */ + int name_count; /* Number of names in name table */ + int name_entry_size; /* Size of entry in names table */ + pcre_uchar *name_table; /* Table of names */ + pcre_uchar nl[4]; /* Newline string when fixed */ + const pcre_uint8 *lcc; /* Points to lower casing table */ + const pcre_uint8 *fcc; /* Points to case-flipping table */ + const pcre_uint8 *ctypes; /* Points to table of type maps */ + BOOL offset_overflow; /* Set if too many extractions */ + BOOL notbol; /* NOTBOL flag */ + BOOL noteol; /* NOTEOL flag */ + BOOL utf; /* UTF-8 / UTF-16 flag */ + BOOL jscript_compat; /* JAVASCRIPT_COMPAT flag */ + BOOL use_ucp; /* PCRE_UCP flag */ + BOOL endonly; /* Dollar not before final \n */ + BOOL notempty; /* Empty string match not wanted */ + BOOL notempty_atstart; /* Empty string match at start not wanted */ + BOOL hitend; /* Hit the end of the subject at some point */ + BOOL bsr_anycrlf; /* \R is just any CRLF, not full Unicode */ + BOOL hasthen; /* Pattern contains (*THEN) */ + BOOL ignore_skip_arg; /* For re-run when SKIP name not found */ + const pcre_uchar *start_code; /* For use when recursing */ + PCRE_PUCHAR start_subject; /* Start of the subject string */ + PCRE_PUCHAR end_subject; /* End of the subject string */ + PCRE_PUCHAR start_match_ptr; /* Start of matched string */ + PCRE_PUCHAR end_match_ptr; /* Subject position at end match */ + PCRE_PUCHAR start_used_ptr; /* Earliest consulted character */ + int partial; /* PARTIAL options */ + int end_offset_top; /* Highwater mark at end of match */ + int capture_last; /* Most recent capture number */ + int start_offset; /* The start offset value */ + int match_function_type; /* Set for certain special calls of MATCH() */ + 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 */ + const pcre_uchar *mark; /* Mark pointer to pass back on success */ + const pcre_uchar *nomatch_mark;/* Mark pointer to pass back on failure */ + const pcre_uchar *once_target; /* Where to back up to for atomic groups */ +#ifdef NO_RECURSE + void *match_frames_base; /* For remembering malloc'd frames */ +#endif +} match_data; + +/* A similar structure is used for the same purpose by the DFA matching +functions. */ + +typedef struct dfa_match_data { + const pcre_uchar *start_code; /* Start of the compiled pattern */ + const pcre_uchar *start_subject ; /* Start of the subject string */ + const pcre_uchar *end_subject; /* End of subject string */ + const pcre_uchar *start_used_ptr; /* Earliest consulted character */ + const pcre_uint8 *tables; /* Character tables */ + int start_offset; /* The start offset value */ + int moptions; /* Match options */ + int poptions; /* Pattern options */ + int nltype; /* Newline type */ + int nllen; /* Newline string length */ + pcre_uchar nl[4]; /* Newline string when fixed */ + void *callout_data; /* To pass back to callouts */ + dfa_recursion_info *recursive; /* Linked list of recursion data */ +} 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) + +/* Internal function and data prefixes. */ + +#ifdef COMPILE_PCRE8 +#ifndef PUBL +#define PUBL(name) pcre_##name +#endif +#ifndef PRIV +#define PRIV(name) _pcre_##name +#endif +#else /* COMPILE_PCRE8 */ +#ifdef COMPILE_PCRE16 +#ifndef PUBL +#define PUBL(name) pcre16_##name +#endif +#ifndef PRIV +#define PRIV(name) _pcre16_##name +#endif +#else +#error Unsupported compiling mode +#endif /* COMPILE_PCRE16 */ +#endif /* COMPILE_PCRE8 */ + +/* 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. */ + +#ifdef COMPILE_PCRE8 + +extern const int PRIV(utf8_table1)[]; +extern const int PRIV(utf8_table1_size); +extern const int PRIV(utf8_table2)[]; +extern const int PRIV(utf8_table3)[]; +extern const pcre_uint8 PRIV(utf8_table4)[]; + +#endif /* COMPILE_PCRE8 */ + +extern const char PRIV(utt_names)[]; +extern const ucp_type_table PRIV(utt)[]; +extern const int PRIV(utt_size); + +extern const pcre_uint8 PRIV(default_tables)[]; + +extern const pcre_uint8 PRIV(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. */ + +/* String comparison functions. */ +#ifdef COMPILE_PCRE8 + +#define STRCMP_UC_UC(str1, str2) \ + strcmp((char *)(str1), (char *)(str2)) +#define STRCMP_UC_C8(str1, str2) \ + strcmp((char *)(str1), (str2)) +#define STRNCMP_UC_UC(str1, str2, num) \ + strncmp((char *)(str1), (char *)(str2), (num)) +#define STRNCMP_UC_C8(str1, str2, num) \ + strncmp((char *)(str1), (str2), (num)) +#define STRLEN_UC(str) strlen((const char *)str) + +#else + +extern int PRIV(strcmp_uc_uc)(const pcre_uchar *, + const pcre_uchar *); +extern int PRIV(strcmp_uc_c8)(const pcre_uchar *, + const char *); +extern int PRIV(strncmp_uc_uc)(const pcre_uchar *, + const pcre_uchar *, unsigned int num); +extern int PRIV(strncmp_uc_c8)(const pcre_uchar *, + const char *, unsigned int num); +extern unsigned int PRIV(strlen_uc)(const pcre_uchar *str); + +#define STRCMP_UC_UC(str1, str2) \ + PRIV(strcmp_uc_uc)((str1), (str2)) +#define STRCMP_UC_C8(str1, str2) \ + PRIV(strcmp_uc_c8)((str1), (str2)) +#define STRNCMP_UC_UC(str1, str2, num) \ + PRIV(strncmp_uc_uc)((str1), (str2), (num)) +#define STRNCMP_UC_C8(str1, str2, num) \ + PRIV(strncmp_uc_c8)((str1), (str2), (num)) +#define STRLEN_UC(str) PRIV(strlen_uc)(str) + +#endif /* COMPILE_PCRE8 */ + +extern const pcre_uchar *PRIV(find_bracket)(const pcre_uchar *, BOOL, int); +extern BOOL PRIV(is_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR, + int *, BOOL); +extern int PRIV(ord2utf)(pcre_uint32, pcre_uchar *); +extern int PRIV(valid_utf)(PCRE_PUCHAR, int, int *); +extern BOOL PRIV(was_newline)(PCRE_PUCHAR, int, PCRE_PUCHAR, + int *, BOOL); +extern BOOL PRIV(xclass)(int, const pcre_uchar *, BOOL); + +#ifdef SUPPORT_JIT +extern void PRIV(jit_compile)(const REAL_PCRE *, + PUBL(extra) *, int); +extern int PRIV(jit_exec)(const REAL_PCRE *, const PUBL(extra) *, + const pcre_uchar *, int, int, int, int *, int); +extern void PRIV(jit_free)(void *); +extern int PRIV(jit_get_size)(void *); +extern const char* PRIV(jit_get_target)(void); +#endif + +/* Unicode character database (UCD) */ + +extern const int PRIV(ucp_gentype)[]; +#ifdef SUPPORT_JIT +extern const int PRIV(ucp_typerange)[]; +#endif + +#ifdef SUPPORT_UCP +/* UCD access macros */ + +unsigned int _pcre_ucp_othercase(const unsigned int c); + +#define UCD_CHARTYPE(ch) (pcre_uint8)g_unichar_type((gunichar)(ch)) +#define UCD_SCRIPT(ch) (pcre_uint8)g_unichar_get_script((gunichar)(ch)) +#define UCD_CATEGORY(ch) PRIV(ucp_gentype)[UCD_CHARTYPE(ch)] +#define UCD_OTHERCASE(ch) (_pcre_ucp_othercase(ch)) + +#endif /* SUPPORT_UCP */ + +#endif + +/* End of pcre_internal.h */ diff --git a/glib/pcre/pcre_jit_compile.c b/glib/pcre/pcre_jit_compile.c new file mode 100644 index 0000000..acb7ea2 --- /dev/null +++ b/glib/pcre/pcre_jit_compile.c @@ -0,0 +1,7499 @@ +/************************************************* +* 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-2012 University of Cambridge + + The machine code generator part (this module) was written by Zoltan Herczeg + Copyright (c) 2010-2012 + +----------------------------------------------------------------------------- +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. +----------------------------------------------------------------------------- +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#ifdef SUPPORT_JIT + +/* All-in-one: Since we use the JIT compiler only from here, +we just include it. This way we don't need to touch the build +system files. */ + +#define SLJIT_MALLOC(size) (PUBL(malloc))(size) +#define SLJIT_FREE(ptr) (PUBL(free))(ptr) +#define SLJIT_CONFIG_AUTO 1 +#define SLJIT_CONFIG_STATIC 1 +#define SLJIT_VERBOSE 0 +#define SLJIT_DEBUG 0 + +#include "sljit/sljitLir.c" + +#if defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED +#error Unsupported architecture +#endif + +/* Allocate memory on the stack. Fast, but limited size. */ +#define LOCAL_SPACE_SIZE 32768 + +#define STACK_GROWTH_RATE 8192 + +/* Enable to check that the allocation could destroy temporaries. */ +#if defined SLJIT_DEBUG && SLJIT_DEBUG +#define DESTROY_REGISTERS 1 +#endif + +/* +Short summary about the backtracking mechanism empolyed by the jit code generator: + +The code generator follows the recursive nature of the PERL compatible regular +expressions. The basic blocks of regular expressions are condition checkers +whose execute different commands depending on the result of the condition check. +The relationship between the operators can be horizontal (concatenation) and +vertical (sub-expression) (See struct backtrack_common for more details). + + 'ab' - 'a' and 'b' regexps are concatenated + 'a+' - 'a' is the sub-expression of the '+' operator + +The condition checkers are boolean (true/false) checkers. Machine code is generated +for the checker itself and for the actions depending on the result of the checker. +The 'true' case is called as the try path (expected path), and the other is called as +the 'backtrack' path. Branch instructions are expesive for all CPUs, so we avoid taken +branches on the try path. + + Greedy star operator (*) : + Try path: match happens. + Backtrack path: match failed. + Non-greedy star operator (*?) : + Try path: no need to perform a match. + Backtrack path: match is required. + +The following example shows how the code generated for a capturing bracket +with two alternatives. Let A, B, C, D are arbirary regular expressions, and +we have the following regular expression: + + A(B|C)D + +The generated code will be the following: + + A try path + '(' try path (pushing arguments to the stack) + B try path + ')' try path (pushing arguments to the stack) + D try path + return with successful match + + D backtrack path + ')' backtrack path (If we arrived from "C" jump to the backtrack of "C") + B backtrack path + C expected path + jump to D try path + C backtrack path + A backtrack path + + Notice, that the order of backtrack code paths are the opposite of the fast + code paths. In this way the topmost value on the stack is always belong + to the current backtrack code path. The backtrack path must check + whether there is a next alternative. If so, it needs to jump back to + the try path eventually. Otherwise it needs to clear out its own stack + frame and continue the execution on the backtrack code paths. +*/ + +/* +Saved stack frames: + +Atomic blocks and asserts require reloading the values of local variables +when the backtrack mechanism performed. Because of OP_RECURSE, the locals +are not necessarly known in compile time, thus we need a dynamic restore +mechanism. + +The stack frames are stored in a chain list, and have the following format: +([ capturing bracket offset ][ start value ][ end value ])+ ... [ 0 ] [ previous head ] + +Thus we can restore the locals to a particular point in the stack. +*/ + +typedef struct jit_arguments { + /* Pointers first. */ + struct sljit_stack *stack; + const pcre_uchar *str; + const pcre_uchar *begin; + const pcre_uchar *end; + int *offsets; + pcre_uchar *uchar_ptr; + pcre_uchar *mark_ptr; + /* Everything else after. */ + int offsetcount; + int calllimit; + pcre_uint8 notbol; + pcre_uint8 noteol; + pcre_uint8 notempty; + pcre_uint8 notempty_atstart; +} jit_arguments; + +typedef struct executable_functions { + void *executable_funcs[JIT_NUMBER_OF_COMPILE_MODES]; + PUBL(jit_callback) callback; + void *userdata; + sljit_uw executable_sizes[JIT_NUMBER_OF_COMPILE_MODES]; +} executable_functions; + +typedef struct jump_list { + struct sljit_jump *jump; + struct jump_list *next; +} jump_list; + +enum stub_types { stack_alloc }; + +typedef struct stub_list { + enum stub_types type; + int data; + struct sljit_jump *start; + struct sljit_label *leave; + struct stub_list *next; +} stub_list; + +typedef int (SLJIT_CALL *jit_function)(jit_arguments *args); + +/* The following structure is the key data type for the recursive +code generator. It is allocated by compile_trypath, and contains +the aguments for compile_backtrackpath. Must be the first member +of its descendants. */ +typedef struct backtrack_common { + /* Concatenation stack. */ + struct backtrack_common *prev; + jump_list *nextbacktracks; + /* Internal stack (for component operators). */ + struct backtrack_common *top; + jump_list *topbacktracks; + /* Opcode pointer. */ + pcre_uchar *cc; +} backtrack_common; + +typedef struct assert_backtrack { + backtrack_common common; + jump_list *condfailed; + /* Less than 0 (-1) if a frame is not needed. */ + int framesize; + /* Points to our private memory word on the stack. */ + int localptr; + /* For iterators. */ + struct sljit_label *trypath; +} assert_backtrack; + +typedef struct bracket_backtrack { + backtrack_common common; + /* Where to coninue if an alternative is successfully matched. */ + struct sljit_label *alttrypath; + /* For rmin and rmax iterators. */ + struct sljit_label *recursivetrypath; + /* For greedy ? operator. */ + struct sljit_label *zerotrypath; + /* Contains the branches of a failed condition. */ + union { + /* Both for OP_COND, OP_SCOND. */ + jump_list *condfailed; + assert_backtrack *assert; + /* For OP_ONCE. -1 if not needed. */ + int framesize; + } u; + /* Points to our private memory word on the stack. */ + int localptr; +} bracket_backtrack; + +typedef struct bracketpos_backtrack { + backtrack_common common; + /* Points to our private memory word on the stack. */ + int localptr; + /* Reverting stack is needed. */ + int framesize; + /* Allocated stack size. */ + int stacksize; +} bracketpos_backtrack; + +typedef struct braminzero_backtrack { + backtrack_common common; + struct sljit_label *trypath; +} braminzero_backtrack; + +typedef struct iterator_backtrack { + backtrack_common common; + /* Next iteration. */ + struct sljit_label *trypath; +} iterator_backtrack; + +typedef struct recurse_entry { + struct recurse_entry *next; + /* Contains the function entry. */ + struct sljit_label *entry; + /* Collects the calls until the function is not created. */ + jump_list *calls; + /* Points to the starting opcode. */ + int start; +} recurse_entry; + +typedef struct recurse_backtrack { + backtrack_common common; +} recurse_backtrack; + +typedef struct compiler_common { + struct sljit_compiler *compiler; + pcre_uchar *start; + + /* Opcode local area direct map. */ + int *localptrs; + int cbraptr; + /* OVector starting point. Must be divisible by 2. */ + int ovector_start; + /* Last known position of the requested byte. */ + int req_char_ptr; + /* Head of the last recursion. */ + int recursive_head; + /* First inspected character for partial matching. */ + int start_used_ptr; + /* Starting pointer for partial soft matches. */ + int hit_start; + /* End pointer of the first line. */ + int first_line_end; + /* Points to the marked string. */ + int mark_ptr; + + /* Other */ + const pcre_uint8 *fcc; + sljit_w lcc; + int mode; + int nltype; + int newline; + int bsr_nltype; + int endonly; + BOOL has_set_som; + sljit_w ctypes; + sljit_uw name_table; + sljit_w name_count; + sljit_w name_entry_size; + + /* Labels and jump lists. */ + struct sljit_label *partialmatchlabel; + struct sljit_label *leavelabel; + struct sljit_label *acceptlabel; + stub_list *stubs; + recurse_entry *entries; + recurse_entry *currententry; + jump_list *partialmatch; + jump_list *leave; + jump_list *accept; + jump_list *calllimit; + jump_list *stackalloc; + jump_list *revertframes; + jump_list *wordboundary; + jump_list *anynewline; + jump_list *hspace; + jump_list *vspace; + jump_list *casefulcmp; + jump_list *caselesscmp; + BOOL jscript_compat; +#ifdef SUPPORT_UTF + BOOL utf; +#ifdef SUPPORT_UCP + BOOL use_ucp; +#endif + jump_list *utfreadchar; +#ifdef COMPILE_PCRE8 + jump_list *utfreadtype8; +#endif +#endif /* SUPPORT_UTF */ +#ifdef SUPPORT_UCP + jump_list *getunichartype; + jump_list *getunichartype_2; + jump_list *getunicharscript; +#endif +} compiler_common; + +/* For byte_sequence_compare. */ + +typedef struct compare_context { + int length; + int sourcereg; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + int ucharptr; + union { + sljit_i asint; + sljit_uh asushort; +#ifdef COMPILE_PCRE8 + sljit_ub asbyte; + sljit_ub asuchars[4]; +#else +#ifdef COMPILE_PCRE16 + sljit_uh asuchars[2]; +#endif +#endif + } c; + union { + sljit_i asint; + sljit_uh asushort; +#ifdef COMPILE_PCRE8 + sljit_ub asbyte; + sljit_ub asuchars[4]; +#else +#ifdef COMPILE_PCRE16 + sljit_uh asuchars[2]; +#endif +#endif + } oc; +#endif +} compare_context; + +enum { + frame_end = 0, + frame_setstrbegin = -1, + frame_setmark = -2 +}; + +/* Undefine sljit macros. */ +#undef CMP + +/* Used for accessing the elements of the stack. */ +#define STACK(i) ((-(i) - 1) * (int)sizeof(sljit_w)) + +#define TMP1 SLJIT_TEMPORARY_REG1 +#define TMP2 SLJIT_TEMPORARY_REG3 +#define TMP3 SLJIT_TEMPORARY_EREG2 +#define STR_PTR SLJIT_SAVED_REG1 +#define STR_END SLJIT_SAVED_REG2 +#define STACK_TOP SLJIT_TEMPORARY_REG2 +#define STACK_LIMIT SLJIT_SAVED_REG3 +#define ARGUMENTS SLJIT_SAVED_EREG1 +#define CALL_COUNT SLJIT_SAVED_EREG2 +#define RETURN_ADDR SLJIT_TEMPORARY_EREG1 + +/* Locals layout. */ +/* These two locals can be used by the current opcode. */ +#define LOCALS0 (0 * sizeof(sljit_w)) +#define LOCALS1 (1 * sizeof(sljit_w)) +/* Two local variables for possessive quantifiers (char1 cannot use them). */ +#define POSSESSIVE0 (2 * sizeof(sljit_w)) +#define POSSESSIVE1 (3 * sizeof(sljit_w)) +/* Max limit of recursions. */ +#define CALL_LIMIT (4 * sizeof(sljit_w)) +/* The output vector is stored on the stack, and contains pointers +to characters. The vector data is divided into two groups: the first +group contains the start / end character pointers, and the second is +the start pointers when the end of the capturing group has not yet reached. */ +#define OVECTOR_START (common->ovector_start) +#define OVECTOR(i) (OVECTOR_START + (i) * sizeof(sljit_w)) +#define OVECTOR_PRIV(i) (common->cbraptr + (i) * sizeof(sljit_w)) +#define PRIV_DATA(cc) (common->localptrs[(cc) - common->start]) + +#ifdef COMPILE_PCRE8 +#define MOV_UCHAR SLJIT_MOV_UB +#define MOVU_UCHAR SLJIT_MOVU_UB +#else +#ifdef COMPILE_PCRE16 +#define MOV_UCHAR SLJIT_MOV_UH +#define MOVU_UCHAR SLJIT_MOVU_UH +#else +#error Unsupported compiling mode +#endif +#endif + +/* Shortcuts. */ +#define DEFINE_COMPILER \ + struct sljit_compiler *compiler = common->compiler +#define OP1(op, dst, dstw, src, srcw) \ + sljit_emit_op1(compiler, (op), (dst), (dstw), (src), (srcw)) +#define OP2(op, dst, dstw, src1, src1w, src2, src2w) \ + sljit_emit_op2(compiler, (op), (dst), (dstw), (src1), (src1w), (src2), (src2w)) +#define LABEL() \ + sljit_emit_label(compiler) +#define JUMP(type) \ + sljit_emit_jump(compiler, (type)) +#define JUMPTO(type, label) \ + sljit_set_label(sljit_emit_jump(compiler, (type)), (label)) +#define JUMPHERE(jump) \ + sljit_set_label((jump), sljit_emit_label(compiler)) +#define CMP(type, src1, src1w, src2, src2w) \ + sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)) +#define CMPTO(type, src1, src1w, src2, src2w, label) \ + sljit_set_label(sljit_emit_cmp(compiler, (type), (src1), (src1w), (src2), (src2w)), (label)) +#define COND_VALUE(op, dst, dstw, type) \ + sljit_emit_cond_value(compiler, (op), (dst), (dstw), (type)) +#define GET_LOCAL_BASE(dst, dstw, offset) \ + sljit_get_local_base(compiler, (dst), (dstw), (offset)) + +static pcre_uchar* bracketend(pcre_uchar* cc) +{ +SLJIT_ASSERT((*cc >= OP_ASSERT && *cc <= OP_ASSERTBACK_NOT) || (*cc >= OP_ONCE && *cc <= OP_SCOND)); +do cc += GET(cc, 1); while (*cc == OP_ALT); +SLJIT_ASSERT(*cc >= OP_KET && *cc <= OP_KETRPOS); +cc += 1 + LINK_SIZE; +return cc; +} + +/* Functions whose might need modification for all new supported opcodes: + next_opcode + get_localspace + set_localptrs + get_framesize + init_frame + get_localsize + copy_locals + compile_trypath + compile_backtrackpath +*/ + +static pcre_uchar *next_opcode(compiler_common *common, pcre_uchar *cc) +{ +SLJIT_UNUSED_ARG(common); +switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_SET_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + 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_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + 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: + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + case OP_DEF: + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + case OP_COMMIT: + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + case OP_SKIPZERO: + return cc + 1; + + case OP_ANYBYTE: +#ifdef SUPPORT_UTF + if (common->utf) return NULL; +#endif + return cc + 1; + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + return cc; + + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSUPTO: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSUPTOI: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSUPTO: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSUPTOI: + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + return cc; + + case OP_NOTPROP: + case OP_PROP: + return cc + 1 + 2; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSUPTO: + case OP_REF: + case OP_REFI: + case OP_CREF: + case OP_NCREF: + case OP_RREF: + case OP_NRREF: + case OP_CLOSE: + cc += 1 + IMM2_SIZE; + return cc; + + case OP_CRRANGE: + case OP_CRMINRANGE: + return cc + 1 + 2 * IMM2_SIZE; + + case OP_CLASS: + case OP_NCLASS: + return cc + 1 + 32 / sizeof(pcre_uchar); + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + return cc + GET(cc, 1); +#endif + + case OP_RECURSE: + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_REVERSE: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_BRAPOS: + case OP_COND: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + return cc + 1 + LINK_SIZE; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + return cc + 1 + LINK_SIZE + IMM2_SIZE; + + case OP_MARK: + return cc + 1 + 2 + cc[1]; + + default: + return NULL; + } +} + +static int get_localspace(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend) +{ +int localspace = 0; +pcre_uchar *alternative; +/* Calculate important variables (like stack size) and checks whether all opcodes are supported. */ +while (cc < ccend) + { + switch(*cc) + { + case OP_SET_SOM: + common->has_set_som = TRUE; + cc += 1; + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + localspace += sizeof(sljit_w); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + localspace += sizeof(sljit_w); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + localspace += sizeof(sljit_w); + cc += 1 + LINK_SIZE; + break; + + case OP_RECURSE: + /* Set its value only once. */ + if (common->recursive_head == 0) + { + common->recursive_head = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + } + cc += 1 + LINK_SIZE; + break; + + case OP_MARK: + if (common->mark_ptr == 0) + { + common->mark_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + } + cc += 1 + 2 + cc[1]; + break; + + default: + cc = next_opcode(common, cc); + if (cc == NULL) + return -1; + break; + } + } +return localspace; +} + +static void set_localptrs(compiler_common *common, int localptr, pcre_uchar *ccend) +{ +pcre_uchar *cc = common->start; +pcre_uchar *alternative; +while (cc < ccend) + { + switch(*cc) + { + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + common->localptrs[cc - common->start] = localptr; + localptr += sizeof(sljit_w); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + common->localptrs[cc - common->start] = localptr; + localptr += sizeof(sljit_w); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + { + common->localptrs[cc - common->start] = localptr; + localptr += sizeof(sljit_w); + } + cc += 1 + LINK_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + } +} + +/* Returns with -1 if no need for frame. */ +static int get_framesize(compiler_common *common, pcre_uchar *cc, BOOL recursive) +{ +pcre_uchar *ccend = bracketend(cc); +int length = 0; +BOOL possessive = FALSE; +BOOL setsom_found = recursive; +BOOL setmark_found = recursive; + +if (!recursive && (*cc == OP_CBRAPOS || *cc == OP_SCBRAPOS)) + { + length = 3; + possessive = TRUE; + } + +cc = next_opcode(common, cc); +SLJIT_ASSERT(cc != NULL); +while (cc < ccend) + switch(*cc) + { + case OP_SET_SOM: + SLJIT_ASSERT(common->has_set_som); + if (!setsom_found) + { + length += 2; + setsom_found = TRUE; + } + cc += 1; + break; + + case OP_MARK: + SLJIT_ASSERT(common->mark_ptr != 0); + if (!setmark_found) + { + length += 2; + setmark_found = TRUE; + } + cc += 1 + 2 + cc[1]; + break; + + case OP_RECURSE: + if (common->has_set_som && !setsom_found) + { + length += 2; + setsom_found = TRUE; + } + if (common->mark_ptr != 0 && !setmark_found) + { + length += 2; + setmark_found = TRUE; + } + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + length += 3; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + +/* Possessive quantifiers can use a special case. */ +if (SLJIT_UNLIKELY(possessive) && length == 3) + return -1; + +if (length > 0) + return length + 1; +return -1; +} + +static void init_frame(compiler_common *common, pcre_uchar *cc, int stackpos, int stacktop, BOOL recursive) +{ +DEFINE_COMPILER; +pcre_uchar *ccend = bracketend(cc); +BOOL setsom_found = recursive; +BOOL setmark_found = recursive; +int offset; + +/* >= 1 + shortest item size (2) */ +SLJIT_UNUSED_ARG(stacktop); +SLJIT_ASSERT(stackpos >= stacktop + 2); + +stackpos = STACK(stackpos); +if (recursive || (*cc != OP_CBRAPOS && *cc != OP_SCBRAPOS)) + cc = next_opcode(common, cc); +SLJIT_ASSERT(cc != NULL); +while (cc < ccend) + switch(*cc) + { + case OP_SET_SOM: + SLJIT_ASSERT(common->has_set_som); + if (!setsom_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_setstrbegin); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos += (int)sizeof(sljit_w); + setsom_found = TRUE; + } + cc += 1; + break; + + case OP_MARK: + SLJIT_ASSERT(common->mark_ptr != 0); + if (!setmark_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_setmark); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos += (int)sizeof(sljit_w); + setmark_found = TRUE; + } + cc += 1 + 2 + cc[1]; + break; + + case OP_RECURSE: + if (common->has_set_som && !setsom_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_setstrbegin); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos += (int)sizeof(sljit_w); + setsom_found = TRUE; + } + if (common->mark_ptr != 0 && !setmark_found) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_setmark); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos += (int)sizeof(sljit_w); + setmark_found = TRUE; + } + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_CBRAPOS: + case OP_SCBRA: + case OP_SCBRAPOS: + offset = (GET2(cc, 1 + LINK_SIZE)) << 1; + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, OVECTOR(offset)); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP1, 0); + stackpos += (int)sizeof(sljit_w); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, TMP2, 0); + stackpos += (int)sizeof(sljit_w); + + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackpos, SLJIT_IMM, frame_end); +SLJIT_ASSERT(stackpos == STACK(stacktop)); +} + +static SLJIT_INLINE int get_localsize(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend) +{ +int localsize = 2; +pcre_uchar *alternative; +/* Calculate the sum of the local variables. */ +while (cc < ccend) + { + switch(*cc) + { + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + localsize++; + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + localsize++; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + localsize += 2; + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + localsize++; + cc += 1 + LINK_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + } +SLJIT_ASSERT(cc == ccend); +return localsize; +} + +static void copy_locals(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, + BOOL save, int stackptr, int stacktop) +{ +DEFINE_COMPILER; +int srcw[2]; +int count; +BOOL tmp1next = TRUE; +BOOL tmp1empty = TRUE; +BOOL tmp2empty = TRUE; +pcre_uchar *alternative; +enum { + start, + loop, + end +} status; + +status = save ? start : loop; +stackptr = STACK(stackptr - 2); +stacktop = STACK(stacktop - 1); + +if (!save) + { + stackptr += sizeof(sljit_w); + if (stackptr < stacktop) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_w); + tmp1empty = FALSE; + } + if (stackptr < stacktop) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_w); + tmp2empty = FALSE; + } + /* The tmp1next must be TRUE in either way. */ + } + +while (status != end) + { + count = 0; + switch(status) + { + case start: + SLJIT_ASSERT(save && common->recursive_head != 0); + count = 1; + srcw[0] = common->recursive_head; + status = loop; + break; + + case loop: + if (cc >= ccend) + { + status = end; + break; + } + + switch(*cc) + { + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRAPOS: + case OP_SBRA: + case OP_SBRAPOS: + case OP_SCOND: + count = 1; + srcw[0] = PRIV_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + cc += 1 + LINK_SIZE; + break; + + case OP_CBRA: + case OP_SCBRA: + count = 1; + srcw[0] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + count = 2; + srcw[1] = OVECTOR_PRIV(GET2(cc, 1 + LINK_SIZE)); + srcw[0] = PRIV_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + cc += 1 + LINK_SIZE + IMM2_SIZE; + break; + + case OP_COND: + /* Might be a hidden SCOND. */ + alternative = cc + GET(cc, 1); + if (*alternative == OP_KETRMAX || *alternative == OP_KETRMIN) + { + count = 1; + srcw[0] = PRIV_DATA(cc); + SLJIT_ASSERT(srcw[0] != 0); + } + cc += 1 + LINK_SIZE; + break; + + default: + cc = next_opcode(common, cc); + SLJIT_ASSERT(cc != NULL); + break; + } + break; + + case end: + SLJIT_ASSERT_STOP(); + break; + } + + while (count > 0) + { + count--; + if (save) + { + if (tmp1next) + { + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_w); + } + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), srcw[count]); + tmp1empty = FALSE; + tmp1next = FALSE; + } + else + { + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_w); + } + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), srcw[count]); + tmp2empty = FALSE; + tmp1next = TRUE; + } + } + else + { + if (tmp1next) + { + SLJIT_ASSERT(!tmp1empty); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), srcw[count], TMP1, 0); + tmp1empty = stackptr >= stacktop; + if (!tmp1empty) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_w); + } + tmp1next = FALSE; + } + else + { + SLJIT_ASSERT(!tmp2empty); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), srcw[count], TMP2, 0); + tmp2empty = stackptr >= stacktop; + if (!tmp2empty) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), stackptr); + stackptr += sizeof(sljit_w); + } + tmp1next = TRUE; + } + } + } + } + +if (save) + { + if (tmp1next) + { + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_w); + } + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_w); + } + } + else + { + if (!tmp2empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP2, 0); + stackptr += sizeof(sljit_w); + } + if (!tmp1empty) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), stackptr, TMP1, 0); + stackptr += sizeof(sljit_w); + } + } + } +SLJIT_ASSERT(cc == ccend && stackptr == stacktop && (save || (tmp1empty && tmp2empty))); +} + +static SLJIT_INLINE BOOL ispowerof2(unsigned int value) +{ +return (value & (value - 1)) == 0; +} + +static SLJIT_INLINE void set_jumps(jump_list *list, struct sljit_label *label) +{ +while (list) + { + /* sljit_set_label is clever enough to do nothing + if either the jump or the label is NULL */ + sljit_set_label(list->jump, label); + list = list->next; + } +} + +static SLJIT_INLINE void add_jump(struct sljit_compiler *compiler, jump_list **list, struct sljit_jump* jump) +{ +jump_list *list_item = sljit_alloc_memory(compiler, sizeof(jump_list)); +if (list_item) + { + list_item->next = *list; + list_item->jump = jump; + *list = list_item; + } +} + +static void add_stub(compiler_common *common, enum stub_types type, int data, struct sljit_jump *start) +{ +DEFINE_COMPILER; +stub_list* list_item = sljit_alloc_memory(compiler, sizeof(stub_list)); + +if (list_item) + { + list_item->type = type; + list_item->data = data; + list_item->start = start; + list_item->leave = LABEL(); + list_item->next = common->stubs; + common->stubs = list_item; + } +} + +static void flush_stubs(compiler_common *common) +{ +DEFINE_COMPILER; +stub_list* list_item = common->stubs; + +while (list_item) + { + JUMPHERE(list_item->start); + switch(list_item->type) + { + case stack_alloc: + add_jump(compiler, &common->stackalloc, JUMP(SLJIT_FAST_CALL)); + break; + } + JUMPTO(SLJIT_JUMP, list_item->leave); + list_item = list_item->next; + } +common->stubs = NULL; +} + +static SLJIT_INLINE void decrease_call_count(compiler_common *common) +{ +DEFINE_COMPILER; + +OP2(SLJIT_SUB | SLJIT_SET_E, CALL_COUNT, 0, CALL_COUNT, 0, SLJIT_IMM, 1); +add_jump(compiler, &common->calllimit, JUMP(SLJIT_C_ZERO)); +} + +static SLJIT_INLINE void allocate_stack(compiler_common *common, int size) +{ +/* May destroy all locals and registers except TMP2. */ +DEFINE_COMPILER; + +OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_w)); +#ifdef DESTROY_REGISTERS +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 12345); +OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); +OP1(SLJIT_MOV, RETURN_ADDR, 0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, TMP1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, TMP1, 0); +#endif +add_stub(common, stack_alloc, 0, CMP(SLJIT_C_GREATER, STACK_TOP, 0, STACK_LIMIT, 0)); +} + +static SLJIT_INLINE void free_stack(compiler_common *common, int size) +{ +DEFINE_COMPILER; +OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, size * sizeof(sljit_w)); +} + +static SLJIT_INLINE void reset_ovector(compiler_common *common, int length) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +int i; +/* At this point we can freely use all temporary registers. */ +/* TMP1 returns with begin - 1. */ +OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG1, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), SLJIT_OFFSETOF(jit_arguments, begin), SLJIT_IMM, IN_UCHARS(1)); +if (length < 8) + { + for (i = 0; i < length; i++) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(i), SLJIT_TEMPORARY_REG1, 0); + } +else + { + GET_LOCAL_BASE(SLJIT_TEMPORARY_REG2, 0, OVECTOR_START - sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, length); + loop = LABEL(); + OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), sizeof(sljit_w), SLJIT_TEMPORARY_REG1, 0); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_TEMPORARY_REG3, 0, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_C_NOT_ZERO, loop); + } +} + +static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *earlyexit; + +/* At this point we can freely use all registers. */ +OP1(SLJIT_MOV, SLJIT_SAVED_REG3, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1), STR_PTR, 0); + +OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, ARGUMENTS, 0); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr); +OP1(SLJIT_MOV_SI, SLJIT_TEMPORARY_REG2, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsetcount)); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_TEMPORARY_REG3, 0); +OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int)); +OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), SLJIT_OFFSETOF(jit_arguments, begin)); +GET_LOCAL_BASE(SLJIT_SAVED_REG1, 0, OVECTOR_START); +/* Unlikely, but possible */ +earlyexit = CMP(SLJIT_C_EQUAL, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 0); +loop = LABEL(); +OP2(SLJIT_SUB, SLJIT_SAVED_REG2, 0, SLJIT_MEM1(SLJIT_SAVED_REG1), 0, SLJIT_TEMPORARY_REG1, 0); +OP2(SLJIT_ADD, SLJIT_SAVED_REG1, 0, SLJIT_SAVED_REG1, 0, SLJIT_IMM, sizeof(sljit_w)); +/* Copy the integer value to the output buffer */ +#ifdef COMPILE_PCRE16 +OP2(SLJIT_ASHR, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 1); +#endif +OP1(SLJIT_MOVU_SI, SLJIT_MEM1(SLJIT_TEMPORARY_REG3), sizeof(int), SLJIT_SAVED_REG2, 0); +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 1); +JUMPTO(SLJIT_C_NOT_ZERO, loop); +JUMPHERE(earlyexit); + +/* Calculate the return value, which is the maximum ovector value. */ +if (topbracket > 1) + { + GET_LOCAL_BASE(SLJIT_TEMPORARY_REG1, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, topbracket + 1); + + /* OVECTOR(0) is never equal to SLJIT_SAVED_REG3. */ + loop = LABEL(); + OP1(SLJIT_MOVU, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG1), -(2 * (sljit_w)sizeof(sljit_w))); + OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG2, 0, SLJIT_TEMPORARY_REG2, 0, SLJIT_IMM, 1); + CMPTO(SLJIT_C_EQUAL, SLJIT_TEMPORARY_REG3, 0, SLJIT_SAVED_REG3, 0, loop); + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_TEMPORARY_REG2, 0); + } +else + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); +} + +static SLJIT_INLINE void return_with_partial_match(compiler_common *common, struct sljit_label *leave) +{ +DEFINE_COMPILER; + +SLJIT_COMPILE_ASSERT(STR_END == SLJIT_SAVED_REG2, str_end_must_be_saved_reg2); +SLJIT_ASSERT(common->start_used_ptr != 0 && (common->mode == JIT_PARTIAL_SOFT_COMPILE ? common->hit_start != 0 : common->hit_start == 0)); + +OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG2, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_PARTIAL); +OP1(SLJIT_MOV_SI, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), SLJIT_OFFSETOF(jit_arguments, offsetcount)); +CMPTO(SLJIT_C_LESS, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, 2, leave); + +/* Store match begin and end. */ +OP1(SLJIT_MOV, SLJIT_SAVED_REG1, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG2, 0, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), SLJIT_OFFSETOF(jit_arguments, offsets)); +OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG3, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mode == JIT_PARTIAL_HARD_COMPILE ? common->start_used_ptr : common->hit_start); +OP2(SLJIT_SUB, SLJIT_SAVED_REG2, 0, STR_END, 0, SLJIT_SAVED_REG1, 0); +#ifdef COMPILE_PCRE16 +OP2(SLJIT_ASHR, SLJIT_SAVED_REG2, 0, SLJIT_SAVED_REG2, 0, SLJIT_IMM, 1); +#endif +OP1(SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), sizeof(int), SLJIT_SAVED_REG2, 0); + +OP2(SLJIT_SUB, SLJIT_TEMPORARY_REG3, 0, SLJIT_TEMPORARY_REG3, 0, SLJIT_SAVED_REG1, 0); +#ifdef COMPILE_PCRE16 +OP2(SLJIT_ASHR, SLJIT_TEMPORARY_REG3, 0, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, 1); +#endif +OP1(SLJIT_MOV_SI, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), 0, SLJIT_TEMPORARY_REG3, 0); + +JUMPTO(SLJIT_JUMP, leave); +} + +static SLJIT_INLINE void check_start_used_ptr(compiler_common *common) +{ +/* May destroy TMP1. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + /* The value of -1 must be kept for start_used_ptr! */ + OP2(SLJIT_ADD, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, SLJIT_IMM, 1); + /* Jumps if start_used_ptr < STR_PTR, or start_used_ptr == -1. Although overwriting + is not necessary if start_used_ptr == STR_PTR, it does not hurt as well. */ + jump = CMP(SLJIT_C_LESS_EQUAL, TMP1, 0, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + JUMPHERE(jump); + } +else if (common->mode == JIT_PARTIAL_HARD_COMPILE) + { + jump = CMP(SLJIT_C_LESS_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + JUMPHERE(jump); + } +} + +static SLJIT_INLINE BOOL char_has_othercase(compiler_common *common, pcre_uchar* cc) +{ +/* Detects if the character has an othercase. */ +unsigned int c; + +#ifdef SUPPORT_UTF +if (common->utf) + { + GETCHAR(c, cc); + if (c > 127) + { +#ifdef SUPPORT_UCP + return c != UCD_OTHERCASE(c); +#else + return FALSE; +#endif + } +#ifndef COMPILE_PCRE8 + return common->fcc[c] != c; +#endif + } +else +#endif + c = *cc; +return MAX_255(c) ? common->fcc[c] != c : FALSE; +} + +static SLJIT_INLINE unsigned int char_othercase(compiler_common *common, unsigned int c) +{ +/* Returns with the othercase. */ +#ifdef SUPPORT_UTF +if (common->utf && c > 127) + { +#ifdef SUPPORT_UCP + return UCD_OTHERCASE(c); +#else + return c; +#endif + } +#endif +return TABLE_GET(c, common->fcc, c); +} + +static unsigned int char_get_othercase_bit(compiler_common *common, pcre_uchar* cc) +{ +/* Detects if the character and its othercase has only 1 bit difference. */ +unsigned int c, oc, bit; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +int n; +#endif + +#ifdef SUPPORT_UTF +if (common->utf) + { + GETCHAR(c, cc); + if (c <= 127) + oc = common->fcc[c]; + else + { +#ifdef SUPPORT_UCP + oc = UCD_OTHERCASE(c); +#else + oc = c; +#endif + } + } +else + { + c = *cc; + oc = TABLE_GET(c, common->fcc, c); + } +#else +c = *cc; +oc = TABLE_GET(c, common->fcc, c); +#endif + +SLJIT_ASSERT(c != oc); + +bit = c ^ oc; +/* Optimized for English alphabet. */ +if (c <= 127 && bit == 0x20) + return (0 << 8) | 0x20; + +/* Since c != oc, they must have at least 1 bit difference. */ +if (!ispowerof2(bit)) + return 0; + +#ifdef COMPILE_PCRE8 + +#ifdef SUPPORT_UTF +if (common->utf && c > 127) + { + n = GET_EXTRALEN(*cc); + while ((bit & 0x3f) == 0) + { + n--; + bit >>= 6; + } + return (n << 8) | bit; + } +#endif /* SUPPORT_UTF */ +return (0 << 8) | bit; + +#else /* COMPILE_PCRE8 */ + +#ifdef COMPILE_PCRE16 +#ifdef SUPPORT_UTF +if (common->utf && c > 65535) + { + if (bit >= (1 << 10)) + bit >>= 10; + else + return (bit < 256) ? ((2 << 8) | bit) : ((3 << 8) | (bit >> 8)); + } +#endif /* SUPPORT_UTF */ +return (bit < 256) ? ((0 << 8) | bit) : ((1 << 8) | (bit >> 8)); +#endif /* COMPILE_PCRE16 */ + +#endif /* COMPILE_PCRE8 */ +} + +static void check_partial(compiler_common *common, BOOL force) +{ +/* Checks whether a partial matching is occured. Does not modify registers. */ +DEFINE_COMPILER; +struct sljit_jump *jump = NULL; + +SLJIT_ASSERT(!force || common->mode != JIT_COMPILE); + +if (common->mode == JIT_COMPILE) + return; + +if (!force) + jump = CMP(SLJIT_C_GREATER_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); +else if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + jump = CMP(SLJIT_C_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, SLJIT_IMM, -1); + +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, -1); +else + { + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } + +if (jump != NULL) + JUMPHERE(jump); +} + +static struct sljit_jump *check_str_end(compiler_common *common) +{ +/* Does not affect registers. Usually used in a tight spot. */ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_jump *nohit; +struct sljit_jump *return_value; + +if (common->mode == JIT_COMPILE) + return CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + +jump = CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0); +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + nohit = CMP(SLJIT_C_GREATER_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, -1); + JUMPHERE(nohit); + return_value = JUMP(SLJIT_JUMP); + } +else + { + return_value = CMP(SLJIT_C_GREATER_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } +JUMPHERE(jump); +return return_value; +} + +static void detect_partial_match(compiler_common *common, jump_list **backtracks) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; + +if (common->mode == JIT_COMPILE) + { + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + return; + } + +/* Partial matching mode. */ +jump = CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0); +add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0)); +if (common->mode == JIT_PARTIAL_SOFT_COMPILE) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, -1); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + } +else + { + if (common->partialmatchlabel != NULL) + JUMPTO(SLJIT_JUMP, common->partialmatchlabel); + else + add_jump(compiler, &common->partialmatch, JUMP(SLJIT_JUMP)); + } +JUMPHERE(jump); +} + +static void read_char(compiler_common *common) +{ +/* Reads the character into TMP1, updates STR_PTR. +Does not check STR_END. TMP2 Destroyed. */ +DEFINE_COMPILER; +#ifdef SUPPORT_UTF +struct sljit_jump *jump; +#endif + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); +#ifdef SUPPORT_UTF +if (common->utf) + { +#ifdef COMPILE_PCRE8 + jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0); +#else +#ifdef COMPILE_PCRE16 + jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800); +#endif +#endif /* COMPILE_PCRE8 */ + add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + JUMPHERE(jump); + } +#endif +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +} + +static void peek_char(compiler_common *common) +{ +/* Reads the character into TMP1, keeps STR_PTR. +Does not check STR_END. TMP2 Destroyed. */ +DEFINE_COMPILER; +#ifdef SUPPORT_UTF +struct sljit_jump *jump; +#endif + +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); +#ifdef SUPPORT_UTF +if (common->utf) + { +#ifdef COMPILE_PCRE8 + jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0); +#else +#ifdef COMPILE_PCRE16 + jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800); +#endif +#endif /* COMPILE_PCRE8 */ + add_jump(compiler, &common->utfreadchar, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + JUMPHERE(jump); + } +#endif +} + +static void read_char8_type(compiler_common *common) +{ +/* Reads the character type into TMP1, updates STR_PTR. Does not check STR_END. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 +struct sljit_jump *jump; +#endif + +#ifdef SUPPORT_UTF +if (common->utf) + { + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#ifdef COMPILE_PCRE8 + /* This can be an extra read in some situations, but hopefully + it is needed in most cases. */ + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + jump = CMP(SLJIT_C_LESS, TMP2, 0, SLJIT_IMM, 0xc0); + add_jump(compiler, &common->utfreadtype8, JUMP(SLJIT_FAST_CALL)); + JUMPHERE(jump); +#else +#ifdef COMPILE_PCRE16 + OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); + jump = CMP(SLJIT_C_GREATER, TMP2, 0, SLJIT_IMM, 255); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); + JUMPHERE(jump); + /* Skip low surrogate if necessary. */ + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0xd800); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +#endif +#endif /* COMPILE_PCRE8 */ + return; + } +#endif +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), 0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#ifdef COMPILE_PCRE16 +/* The ctypes array contains only 256 values. */ +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +jump = CMP(SLJIT_C_GREATER, TMP2, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); +#ifdef COMPILE_PCRE16 +JUMPHERE(jump); +#endif +} + +static void skip_char_back(compiler_common *common) +{ +/* Goes one character back. Affects STR_PTR and TMP1. Does not check begin. */ +DEFINE_COMPILER; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +struct sljit_label *label; + +if (common->utf) + { + label = LABEL(); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xc0); + CMPTO(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, 0x80, label); + return; + } +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), -IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + /* Skip low surrogate if necessary. */ + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xdc00); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + return; + } +#endif +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +} + +static void check_newlinechar(compiler_common *common, int nltype, jump_list **backtracks, BOOL jumpiftrue) +{ +/* Character comes in TMP1. Checks if it is a newline. TMP2 may be destroyed. */ +DEFINE_COMPILER; + +if (nltype == NLTYPE_ANY) + { + add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, JUMP(jumpiftrue ? SLJIT_C_NOT_ZERO : SLJIT_C_ZERO)); + } +else if (nltype == NLTYPE_ANYCRLF) + { + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_CR); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + add_jump(compiler, backtracks, JUMP(jumpiftrue ? SLJIT_C_NOT_ZERO : SLJIT_C_ZERO)); + } +else + { + SLJIT_ASSERT(nltype == NLTYPE_FIXED && common->newline < 256); + add_jump(compiler, backtracks, CMP(jumpiftrue ? SLJIT_C_EQUAL : SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline)); + } +} + +#ifdef SUPPORT_UTF + +#ifdef COMPILE_PCRE8 +static void do_utfreadchar(compiler_common *common) +{ +/* Fast decoding a UTF-8 character. TMP1 contains the first byte +of the character (>= 0xc0). Return char value in TMP1, length - 1 in TMP2. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +/* Searching for the first zero. */ +OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20); +jump = JUMP(SLJIT_C_NOT_ZERO); +/* Two byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1f); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +JUMPHERE(jump); + +OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x10); +jump = JUMP(SLJIT_C_NOT_ZERO); +/* Three byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0f); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 12); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(2)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +JUMPHERE(jump); + +/* Four byte sequence. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x07); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 18); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 12); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(2)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(3)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(3)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(3)); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_utfreadtype8(compiler_common *common) +{ +/* Fast decoding a UTF-8 character type. TMP2 contains the first byte +of the character (>= 0xc0). Return value in TMP1. */ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_jump *compare; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_IMM, 0x20); +jump = JUMP(SLJIT_C_NOT_ZERO); +/* Two byte sequence. */ +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x1f); +OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 6); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3f); +OP2(SLJIT_OR, TMP2, 0, TMP2, 0, TMP1, 0); +compare = CMP(SLJIT_C_GREATER, TMP2, 0, SLJIT_IMM, 255); +OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), common->ctypes); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(compare); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +JUMPHERE(jump); + +/* We only have types for characters less than 256. */ +OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP2), (sljit_w)PRIV(utf8_table4) - 0xc0); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#else /* COMPILE_PCRE8 */ + +#ifdef COMPILE_PCRE16 +static void do_utfreadchar(compiler_common *common) +{ +/* Fast decoding a UTF-16 character. TMP1 contains the first 16 bit char +of the character (>= 0xd800). Return char value in TMP1, length - 1 in TMP2. */ +DEFINE_COMPILER; +struct sljit_jump *jump; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xdc00); +/* Do nothing, only return. */ +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); +/* Combine two 16 bit characters. */ +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x3ff); +OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 10); +OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 0x3ff); +OP2(SLJIT_OR, TMP1, 0, TMP1, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x10000); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} +#endif /* COMPILE_PCRE16 */ + +#endif /* COMPILE_PCRE8 */ + +#endif /* SUPPORT_UTF */ + +#ifdef SUPPORT_UCP + +static sljit_w SLJIT_CALL getunichartype(sljit_w c) +{ + return (sljit_w)(unsigned int)UCD_CHARTYPE((unsigned int)c); +} + +static sljit_w SLJIT_CALL getunicharscript(sljit_w c) +{ + return (sljit_w)(unsigned int)UCD_SCRIPT((unsigned int)c); +} + +static void do_getunichartype(compiler_common *common) +{ +/* Character comes in TMP1. Returns chartype in TMP1 */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +/* Save registers */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0); +sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(getunichartype)); +/* Restore registers */ +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_getunichartype_2(compiler_common *common) +{ +/* Character comes in TMP1. Returns chartype in TMP1 */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +/* Save registers */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, STACK_TOP, 0); +sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(getunichartype)); +/* Restore registers */ +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void do_getunicharscript(compiler_common *common) +{ +/* Character comes in TMP1. Returns chartype in TMP1 */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +/* Save registers */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0); +sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(getunicharscript)); +/* Restore registers */ +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} +#endif + +static SLJIT_INLINE struct sljit_label *mainloop_entry(compiler_common *common, BOOL hascrorlf, BOOL firstline) +{ +DEFINE_COMPILER; +struct sljit_label *mainloop; +struct sljit_label *newlinelabel = NULL; +struct sljit_jump *start; +struct sljit_jump *end = NULL; +struct sljit_jump *nl = NULL; +#ifdef SUPPORT_UTF +struct sljit_jump *singlechar; +#endif +jump_list *newline = NULL; +BOOL newlinecheck = FALSE; +BOOL readuchar = FALSE; + +if (!(hascrorlf || firstline) && (common->nltype == NLTYPE_ANY || + common->nltype == NLTYPE_ANYCRLF || common->newline > 255)) + newlinecheck = TRUE; + +if (firstline) + { + /* Search for the end of the first line. */ + SLJIT_ASSERT(common->first_line_end != 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end, STR_END, 0); + + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + mainloop = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + end = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + CMPTO(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, mainloop); + CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, mainloop); + OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } + else + { + end = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + mainloop = LABEL(); + /* Continual stores does not cause data dependency. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end, STR_PTR, 0); + read_char(common); + check_newlinechar(common, common->nltype, &newline, TRUE); + CMPTO(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0, mainloop); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end, STR_PTR, 0); + set_jumps(newline, LABEL()); + } + + JUMPHERE(end); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); + } + +start = JUMP(SLJIT_JUMP); + +if (newlinecheck) + { + newlinelabel = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + end = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, common->newline & 0xff); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); +#ifdef COMPILE_PCRE16 + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + nl = JUMP(SLJIT_JUMP); + } + +mainloop = LABEL(); + +/* Increasing the STR_PTR here requires one less jump in the most common case. */ +#ifdef SUPPORT_UTF +if (common->utf) readuchar = TRUE; +#endif +if (newlinecheck) readuchar = TRUE; + +if (readuchar) + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + +if (newlinecheck) + CMPTO(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, newlinelabel); + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + singlechar = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(singlechar); + } +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + singlechar = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(singlechar); + } +#endif +JUMPHERE(start); + +if (newlinecheck) + { + JUMPHERE(end); + JUMPHERE(nl); + } + +return mainloop; +} + +static SLJIT_INLINE void fast_forward_first_char(compiler_common *common, pcre_uchar first_char, BOOL caseless, BOOL firstline) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *leave; +struct sljit_jump *found; +pcre_uchar oc, bit; + +if (firstline) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, STR_END, 0); + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end); + } + +start = LABEL(); +leave = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + +oc = first_char; +if (caseless) + { + oc = TABLE_GET(first_char, common->fcc, first_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (first_char > 127 && common->utf) + oc = UCD_OTHERCASE(first_char); +#endif + } +if (first_char == oc) + found = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, first_char); +else + { + bit = first_char ^ oc; + if (ispowerof2(bit)) + { + OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, bit); + found = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, first_char | bit); + } + else + { + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, first_char); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, oc); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + found = JUMP(SLJIT_C_NOT_ZERO); + } + } + +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0, start); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#endif +JUMPTO(SLJIT_JUMP, start); +JUMPHERE(found); +JUMPHERE(leave); + +if (firstline) + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); +} + +static SLJIT_INLINE void fast_forward_newline(compiler_common *common, BOOL firstline) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *lastchar; +struct sljit_jump *firstchar; +struct sljit_jump *leave; +struct sljit_jump *foundcr = NULL; +struct sljit_jump *notfoundnl; +jump_list *newline = NULL; + +if (firstline) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, STR_END, 0); + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end); + } + +if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + lastchar = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + firstchar = CMP(SLJIT_C_LESS_EQUAL, STR_PTR, 0, TMP2, 0); + + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(2)); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, TMP1, 0); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_GREATER_EQUAL); +#ifdef COMPILE_PCRE16 + OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); +#endif + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + + loop = LABEL(); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + leave = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + CMPTO(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff, loop); + CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff, loop); + + JUMPHERE(leave); + JUMPHERE(firstchar); + JUMPHERE(lastchar); + + if (firstline) + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); + return; + } + +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +firstchar = CMP(SLJIT_C_LESS_EQUAL, STR_PTR, 0, TMP2, 0); +skip_char_back(common); + +loop = LABEL(); +read_char(common); +lastchar = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) + foundcr = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); +check_newlinechar(common, common->nltype, &newline, FALSE); +set_jumps(newline, loop); + +if (common->nltype == NLTYPE_ANY || common->nltype == NLTYPE_ANYCRLF) + { + leave = JUMP(SLJIT_JUMP); + JUMPHERE(foundcr); + notfoundnl = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_NL); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); +#ifdef COMPILE_PCRE16 + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(notfoundnl); + JUMPHERE(leave); + } +JUMPHERE(lastchar); +JUMPHERE(firstchar); + +if (firstline) + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); +} + +static SLJIT_INLINE void fast_forward_start_bits(compiler_common *common, sljit_uw start_bits, BOOL firstline) +{ +DEFINE_COMPILER; +struct sljit_label *start; +struct sljit_jump *leave; +struct sljit_jump *found; +#ifndef COMPILE_PCRE8 +struct sljit_jump *jump; +#endif + +if (firstline) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, STR_END, 0); + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end); + } + +start = LABEL(); +leave = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); +OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); +#ifdef SUPPORT_UTF +if (common->utf) + OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); +#endif +#ifndef COMPILE_PCRE8 +jump = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 255); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_IMM, 255); +JUMPHERE(jump); +#endif +OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); +OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); +OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), start_bits); +OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); +OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); +found = JUMP(SLJIT_C_NOT_ZERO); + +#ifdef SUPPORT_UTF +if (common->utf) + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); +#endif +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (common->utf) + { + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0, start); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#endif +#if defined SUPPORT_UTF && defined COMPILE_PCRE16 +if (common->utf) + { + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800, start); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + } +#endif +JUMPTO(SLJIT_JUMP, start); +JUMPHERE(found); +JUMPHERE(leave); + +if (firstline) + OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); +} + +static SLJIT_INLINE struct sljit_jump *search_requested_char(compiler_common *common, pcre_uchar req_char, BOOL caseless, BOOL has_firstchar) +{ +DEFINE_COMPILER; +struct sljit_label *loop; +struct sljit_jump *toolong; +struct sljit_jump *alreadyfound; +struct sljit_jump *found; +struct sljit_jump *foundoc = NULL; +struct sljit_jump *notfound; +pcre_uchar oc, bit; + +SLJIT_ASSERT(common->req_char_ptr != 0); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->req_char_ptr); +OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, REQ_BYTE_MAX); +toolong = CMP(SLJIT_C_LESS, TMP1, 0, STR_END, 0); +alreadyfound = CMP(SLJIT_C_LESS, STR_PTR, 0, TMP2, 0); + +if (has_firstchar) + OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +else + OP1(SLJIT_MOV, TMP1, 0, STR_PTR, 0); + +loop = LABEL(); +notfound = CMP(SLJIT_C_GREATER_EQUAL, TMP1, 0, STR_END, 0); + +OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(TMP1), 0); +oc = req_char; +if (caseless) + { + oc = TABLE_GET(req_char, common->fcc, req_char); +#if defined SUPPORT_UCP && !(defined COMPILE_PCRE8) + if (req_char > 127 && common->utf) + oc = UCD_OTHERCASE(req_char); +#endif + } +if (req_char == oc) + found = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, req_char); +else + { + bit = req_char ^ oc; + if (ispowerof2(bit)) + { + OP2(SLJIT_OR, TMP2, 0, TMP2, 0, SLJIT_IMM, bit); + found = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, req_char | bit); + } + else + { + found = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, req_char); + foundoc = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, oc); + } + } +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); +JUMPTO(SLJIT_JUMP, loop); + +JUMPHERE(found); +if (foundoc) + JUMPHERE(foundoc); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->req_char_ptr, TMP1, 0); +JUMPHERE(alreadyfound); +JUMPHERE(toolong); +return notfound; +} + +static void do_revertframes(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *mainloop; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP1(SLJIT_MOV, TMP1, 0, STACK_TOP, 0); +GET_LOCAL_BASE(TMP3, 0, 0); + +/* Drop frames until we reach STACK_TOP. */ +mainloop = LABEL(); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), 0); +jump = CMP(SLJIT_C_SIG_LESS_EQUAL, TMP2, 0, SLJIT_IMM, frame_end); +OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP3, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), sizeof(sljit_w), SLJIT_MEM1(TMP1), 2 * sizeof(sljit_w)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 3 * sizeof(sljit_w)); +JUMPTO(SLJIT_JUMP, mainloop); + +JUMPHERE(jump); +jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_end); +/* End of dropping frames. */ +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); + +JUMPHERE(jump); +jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_setstrbegin); +/* Set string begin. */ +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), TMP2, 0); +JUMPTO(SLJIT_JUMP, mainloop); + +JUMPHERE(jump); +if (common->mark_ptr != 0) + { + jump = CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, frame_setmark); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), sizeof(sljit_w)); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, TMP2, 0); + JUMPTO(SLJIT_JUMP, mainloop); + + JUMPHERE(jump); + } + +/* Unknown command. */ +OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 2 * sizeof(sljit_w)); +JUMPTO(SLJIT_JUMP, mainloop); +} + +static void check_wordboundary(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *skipread; +#if !(defined COMPILE_PCRE8) || defined SUPPORT_UTF +struct sljit_jump *jump; +#endif + +SLJIT_COMPILE_ASSERT(ctype_word == 0x10, ctype_word_must_be_16); + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +/* Get type of the previous char, and put it to LOCALS1. */ +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, SLJIT_IMM, 0); +skipread = CMP(SLJIT_C_LESS_EQUAL, STR_PTR, 0, TMP1, 0); +skip_char_back(common); +check_start_used_ptr(common); +read_char(common); + +/* Testing char type. */ +#ifdef SUPPORT_UCP +if (common->use_ucp) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); + jump = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); + add_jump(compiler, &common->getunichartype_2, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_LESS_EQUAL); + JUMPHERE(jump); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, TMP2, 0); + } +else +#endif + { +#ifndef COMPILE_PCRE8 + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#elif defined SUPPORT_UTF + /* Here LOCALS1 has already been zeroed. */ + jump = NULL; + if (common->utf) + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#endif /* COMPILE_PCRE8 */ + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), common->ctypes); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 4 /* ctype_word */); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, TMP1, 0); +#ifndef COMPILE_PCRE8 + JUMPHERE(jump); +#elif defined SUPPORT_UTF + if (jump != NULL) + JUMPHERE(jump); +#endif /* COMPILE_PCRE8 */ + } +JUMPHERE(skipread); + +OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); +skipread = check_str_end(common); +peek_char(common); + +/* Testing char type. This is a code duplication. */ +#ifdef SUPPORT_UCP +if (common->use_ucp) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 1); + jump = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE); + add_jump(compiler, &common->getunichartype_2, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Nd - ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ucp_No - ucp_Nd); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_LESS_EQUAL); + JUMPHERE(jump); + } +else +#endif + { +#ifndef COMPILE_PCRE8 + /* TMP2 may be destroyed by peek_char. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#elif defined SUPPORT_UTF + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); + jump = NULL; + if (common->utf) + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#endif + OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), common->ctypes); + OP2(SLJIT_LSHR, TMP2, 0, TMP2, 0, SLJIT_IMM, 4 /* ctype_word */); + OP2(SLJIT_AND, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); +#ifndef COMPILE_PCRE8 + JUMPHERE(jump); +#elif defined SUPPORT_UTF + if (jump != NULL) + JUMPHERE(jump); +#endif /* COMPILE_PCRE8 */ + } +JUMPHERE(skipread); + +OP2(SLJIT_XOR | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1); +sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +} + +static void check_anynewline(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 */ +COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void check_hspace(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x09); +COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x20); +COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xa0); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x1680); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x180e); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x2000); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x200A - 0x2000); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_LESS_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x202f - 0x2000); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x205f - 0x2000); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x3000 - 0x2000); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 */ +COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +static void check_vspace(compiler_common *common) +{ +/* Check whether TMP1 contains a newline character. TMP2 destroyed. */ +DEFINE_COMPILER; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); + +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x0a); +OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x0d - 0x0a); +COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS_EQUAL); +OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x85 - 0x0a); +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 +#ifdef COMPILE_PCRE8 +if (common->utf) + { +#endif + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, 0x1); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0x2029 - 0x0a); +#ifdef COMPILE_PCRE8 + } +#endif +#endif /* SUPPORT_UTF || COMPILE_PCRE16 */ +COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#define CHAR1 STR_END +#define CHAR2 STACK_TOP + +static void do_casefulcmp(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *label; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); +OP1(SLJIT_MOV, TMP3, 0, CHAR1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, CHAR2, 0); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +label = LABEL(); +OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1)); +OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +jump = CMP(SLJIT_C_NOT_EQUAL, CHAR1, 0, CHAR2, 0); +OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +JUMPTO(SLJIT_C_NOT_ZERO, label); + +JUMPHERE(jump); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, CHAR1, 0, TMP3, 0); +OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#define LCC_TABLE STACK_LIMIT + +static void do_caselesscmp(compiler_common *common) +{ +DEFINE_COMPILER; +struct sljit_jump *jump; +struct sljit_label *label; + +sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + +OP1(SLJIT_MOV, TMP3, 0, LCC_TABLE, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, CHAR1, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, CHAR2, 0); +OP1(SLJIT_MOV, LCC_TABLE, 0, SLJIT_IMM, common->lcc); +OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); +OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +label = LABEL(); +OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1)); +OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); +#ifndef COMPILE_PCRE8 +jump = CMP(SLJIT_C_GREATER, CHAR1, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_UB, CHAR1, 0, SLJIT_MEM2(LCC_TABLE, CHAR1), 0); +#ifndef COMPILE_PCRE8 +JUMPHERE(jump); +jump = CMP(SLJIT_C_GREATER, CHAR2, 0, SLJIT_IMM, 255); +#endif +OP1(SLJIT_MOV_UB, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0); +#ifndef COMPILE_PCRE8 +JUMPHERE(jump); +#endif +jump = CMP(SLJIT_C_NOT_EQUAL, CHAR1, 0, CHAR2, 0); +OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); +JUMPTO(SLJIT_C_NOT_ZERO, label); + +JUMPHERE(jump); +OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, LCC_TABLE, 0, TMP3, 0); +OP1(SLJIT_MOV, CHAR1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1); +sljit_emit_fast_return(compiler, RETURN_ADDR, 0); +} + +#undef LCC_TABLE +#undef CHAR1 +#undef CHAR2 + +#if defined SUPPORT_UTF && defined SUPPORT_UCP + +static const pcre_uchar *SLJIT_CALL do_utf_caselesscmp(pcre_uchar *src1, jit_arguments *args, pcre_uchar *end1) +{ +/* This function would be ineffective to do in JIT level. */ +int c1, c2; +const pcre_uchar *src2 = args->uchar_ptr; +const pcre_uchar *end2 = args->end; + +while (src1 < end1) + { + if (src2 >= end2) + return (pcre_uchar*)1; + GETCHARINC(c1, src1); + GETCHARINC(c2, src2); + if (c1 != c2 && c1 != UCD_OTHERCASE(c2)) return NULL; + } +return src2; +} + +#endif /* SUPPORT_UTF && SUPPORT_UCP */ + +static pcre_uchar *byte_sequence_compare(compiler_common *common, BOOL caseless, pcre_uchar *cc, + compare_context* context, jump_list **backtracks) +{ +DEFINE_COMPILER; +unsigned int othercasebit = 0; +pcre_uchar *othercasechar = NULL; +#ifdef SUPPORT_UTF +int utflength; +#endif + +if (caseless && char_has_othercase(common, cc)) + { + othercasebit = char_get_othercase_bit(common, cc); + SLJIT_ASSERT(othercasebit); + /* Extracting bit difference info. */ +#ifdef COMPILE_PCRE8 + othercasechar = cc + (othercasebit >> 8); + othercasebit &= 0xff; +#else +#ifdef COMPILE_PCRE16 + othercasechar = cc + (othercasebit >> 9); + if ((othercasebit & 0x100) != 0) + othercasebit = (othercasebit & 0xff) << 8; + else + othercasebit &= 0xff; +#endif +#endif + } + +if (context->sourcereg == -1) + { +#ifdef COMPILE_PCRE8 +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + if (context->length >= 4) + OP1(SLJIT_MOV_SI, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else if (context->length >= 2) + OP1(SLJIT_MOV_UH, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else +#endif + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); +#else +#ifdef COMPILE_PCRE16 +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + if (context->length >= 4) + OP1(SLJIT_MOV_SI, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); + else +#endif + OP1(SLJIT_MOV_UH, TMP1, 0, SLJIT_MEM1(STR_PTR), -context->length); +#endif +#endif /* COMPILE_PCRE8 */ + context->sourcereg = TMP2; + } + +#ifdef SUPPORT_UTF +utflength = 1; +if (common->utf && HAS_EXTRALEN(*cc)) + utflength += GET_EXTRALEN(*cc); + +do + { +#endif + + context->length -= IN_UCHARS(1); +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + + /* Unaligned read is supported. */ + if (othercasebit != 0 && othercasechar == cc) + { + context->c.asuchars[context->ucharptr] = *cc | othercasebit; + context->oc.asuchars[context->ucharptr] = othercasebit; + } + else + { + context->c.asuchars[context->ucharptr] = *cc; + context->oc.asuchars[context->ucharptr] = 0; + } + context->ucharptr++; + +#ifdef COMPILE_PCRE8 + if (context->ucharptr >= 4 || context->length == 0 || (context->ucharptr == 2 && context->length == 1)) +#else + if (context->ucharptr >= 2 || context->length == 0) +#endif + { + if (context->length >= 4) + OP1(SLJIT_MOV_SI, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#ifdef COMPILE_PCRE8 + else if (context->length >= 2) + OP1(SLJIT_MOV_UH, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); + else if (context->length >= 1) + OP1(SLJIT_MOV_UB, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#else + else if (context->length >= 2) + OP1(SLJIT_MOV_UH, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#endif + context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1; + + switch(context->ucharptr) + { + case 4 / sizeof(pcre_uchar): + if (context->oc.asint != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asint); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asint | context->oc.asint)); + break; + + case 2 / sizeof(pcre_uchar): + if (context->oc.asushort != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asushort); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asushort | context->oc.asushort)); + break; + +#ifdef COMPILE_PCRE8 + case 1: + if (context->oc.asbyte != 0) + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, context->oc.asbyte); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, context->c.asbyte | context->oc.asbyte)); + break; +#endif + + default: + SLJIT_ASSERT_STOP(); + break; + } + context->ucharptr = 0; + } + +#else + + /* Unaligned read is unsupported. */ +#ifdef COMPILE_PCRE8 + if (context->length > 0) + OP1(SLJIT_MOV_UB, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#else + if (context->length > 0) + OP1(SLJIT_MOV_UH, context->sourcereg, 0, SLJIT_MEM1(STR_PTR), -context->length); +#endif + context->sourcereg = context->sourcereg == TMP1 ? TMP2 : TMP1; + + if (othercasebit != 0 && othercasechar == cc) + { + OP2(SLJIT_OR, context->sourcereg, 0, context->sourcereg, 0, SLJIT_IMM, othercasebit); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc | othercasebit)); + } + else + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, context->sourcereg, 0, SLJIT_IMM, *cc)); + +#endif + + cc++; +#ifdef SUPPORT_UTF + utflength--; + } +while (utflength > 0); +#endif + +return cc; +} + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + +#define SET_TYPE_OFFSET(value) \ + if ((value) != typeoffset) \ + { \ + if ((value) > typeoffset) \ + OP2(SLJIT_SUB, typereg, 0, typereg, 0, SLJIT_IMM, (value) - typeoffset); \ + else \ + OP2(SLJIT_ADD, typereg, 0, typereg, 0, SLJIT_IMM, typeoffset - (value)); \ + } \ + typeoffset = (value); + +#define SET_CHAR_OFFSET(value) \ + if ((value) != charoffset) \ + { \ + if ((value) > charoffset) \ + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, (value) - charoffset); \ + else \ + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, charoffset - (value)); \ + } \ + charoffset = (value); + +static void compile_xclass_trypath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks) +{ +DEFINE_COMPILER; +jump_list *found = NULL; +jump_list **list = (*cc & XCL_NOT) == 0 ? &found : backtracks; +unsigned int c; +int compares; +struct sljit_jump *jump = NULL; +pcre_uchar *ccbegin; +#ifdef SUPPORT_UCP +BOOL needstype = FALSE, needsscript = FALSE, needschar = FALSE; +BOOL charsaved = FALSE; +int typereg = TMP1, scriptreg = TMP1; +unsigned int typeoffset; +#endif +int invertcmp, numberofcmps; +unsigned int charoffset; + +/* Although SUPPORT_UTF must be defined, we are not necessary in utf mode. */ +detect_partial_match(common, backtracks); +read_char(common); + +if ((*cc++ & XCL_MAP) != 0) + { + OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); +#ifndef COMPILE_PCRE8 + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#elif defined SUPPORT_UTF + if (common->utf) + jump = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); +#endif + + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)cc); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + add_jump(compiler, list, JUMP(SLJIT_C_NOT_ZERO)); + +#ifndef COMPILE_PCRE8 + JUMPHERE(jump); +#elif defined SUPPORT_UTF + if (common->utf) + JUMPHERE(jump); +#endif + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); +#ifdef SUPPORT_UCP + charsaved = TRUE; +#endif + cc += 32 / sizeof(pcre_uchar); + } + +/* Scanning the necessary info. */ +ccbegin = cc; +compares = 0; +while (*cc != XCL_END) + { + compares++; + if (*cc == XCL_SINGLE) + { + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif +#ifdef SUPPORT_UCP + needschar = TRUE; +#endif + } + else if (*cc == XCL_RANGE) + { + cc += 2; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + cc++; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif +#ifdef SUPPORT_UCP + needschar = TRUE; +#endif + } +#ifdef SUPPORT_UCP + else + { + SLJIT_ASSERT(*cc == XCL_PROP || *cc == XCL_NOTPROP); + cc++; + switch(*cc) + { + case PT_ANY: + break; + + case PT_LAMP: + case PT_GC: + case PT_PC: + case PT_ALNUM: + needstype = TRUE; + break; + + case PT_SC: + needsscript = TRUE; + break; + + case PT_SPACE: + case PT_PXSPACE: + case PT_WORD: + needstype = TRUE; + needschar = TRUE; + break; + + default: + SLJIT_ASSERT_STOP(); + break; + } + cc += 2; + } +#endif + } + +#ifdef SUPPORT_UCP +/* Simple register allocation. TMP1 is preferred if possible. */ +if (needstype || needsscript) + { + if ((needschar || needsscript) && !charsaved) + OP1(SLJIT_MOV, TMP3, 0, TMP1, 0); + + /* Needed to save important temporary registers. */ + SLJIT_ASSERT(TMP1 == SLJIT_TEMPORARY_REG1 && + STACK_TOP == SLJIT_TEMPORARY_REG2 && + TMP2 == SLJIT_TEMPORARY_REG3); + + if (needschar) + { + if (needstype) + typereg = RETURN_ADDR; + if (needsscript) + scriptreg = TMP3; + } + else if (needstype && needsscript) + scriptreg = TMP3; + /* In all other cases only one of them was specified, and that can goes to TMP1. */ + + if (needstype) + { + add_jump(compiler, &common->getunichartype, JUMP(SLJIT_FAST_CALL)); + if (typereg != TMP1) + OP1(SLJIT_MOV, typereg, 0, TMP1, 0); + } + + if (needsscript) + { + /* Get the char again */ + if (needstype) + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); + + add_jump(compiler, &common->getunicharscript, JUMP(SLJIT_FAST_CALL)); + if (scriptreg != TMP1) + OP1(SLJIT_MOV, scriptreg, 0, TMP1, 0); + } + + if (needschar) + OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); + } +#endif + +/* Generating code. */ +cc = ccbegin; +charoffset = 0; +numberofcmps = 0; +#ifdef SUPPORT_UCP +typeoffset = 0; +#endif + +while (*cc != XCL_END) + { + compares--; + invertcmp = (compares == 0 && list != backtracks); + jump = NULL; + + if (*cc == XCL_SINGLE) + { + cc ++; +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHARINC(c, cc); + } + else +#endif + c = *cc++; + + if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) + { + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, c - charoffset); + COND_VALUE(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + numberofcmps++; + } + else if (numberofcmps > 0) + { + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, c - charoffset); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + jump = JUMP(SLJIT_C_NOT_ZERO ^ invertcmp); + numberofcmps = 0; + } + else + { + jump = CMP(SLJIT_C_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, c - charoffset); + numberofcmps = 0; + } + } + else if (*cc == XCL_RANGE) + { + cc ++; +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHARINC(c, cc); + } + else +#endif + c = *cc++; + SET_CHAR_OFFSET(c); +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHARINC(c, cc); + } + else +#endif + c = *cc++; + if (numberofcmps < 3 && (*cc == XCL_SINGLE || *cc == XCL_RANGE)) + { + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, c - charoffset); + COND_VALUE(numberofcmps == 0 ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_C_LESS_EQUAL); + numberofcmps++; + } + else if (numberofcmps > 0) + { + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, c - charoffset); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_LESS_EQUAL); + jump = JUMP(SLJIT_C_NOT_ZERO ^ invertcmp); + numberofcmps = 0; + } + else + { + jump = CMP(SLJIT_C_LESS_EQUAL ^ invertcmp, TMP1, 0, SLJIT_IMM, c - charoffset); + numberofcmps = 0; + } + } +#ifdef SUPPORT_UCP + else + { + if (*cc == XCL_NOTPROP) + invertcmp ^= 0x1; + cc++; + switch(*cc) + { + case PT_ANY: + if (list != backtracks) + { + if ((cc[-1] == XCL_NOTPROP && compares > 0) || (cc[-1] == XCL_PROP && compares == 0)) + continue; + } + else if (cc[-1] == XCL_NOTPROP) + continue; + jump = JUMP(SLJIT_JUMP); + break; + + case PT_LAMP: + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - typeoffset); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Ll - typeoffset); + COND_VALUE(SLJIT_OR, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lt - typeoffset); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + jump = JUMP(SLJIT_C_NOT_ZERO ^ invertcmp); + break; + + case PT_GC: + c = PRIV(ucp_typerange)[(int)cc[1] * 2]; + SET_TYPE_OFFSET(c); + jump = CMP(SLJIT_C_LESS_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, PRIV(ucp_typerange)[(int)cc[1] * 2 + 1] - c); + break; + + case PT_PC: + jump = CMP(SLJIT_C_EQUAL ^ invertcmp, typereg, 0, SLJIT_IMM, (int)cc[1] - typeoffset); + break; + + case PT_SC: + jump = CMP(SLJIT_C_EQUAL ^ invertcmp, scriptreg, 0, SLJIT_IMM, (int)cc[1]); + break; + + case PT_SPACE: + case PT_PXSPACE: + if (*cc == PT_SPACE) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, 0); + jump = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, 11 - charoffset); + } + SET_CHAR_OFFSET(9); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 13 - 9); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS_EQUAL); + if (*cc == PT_SPACE) + JUMPHERE(jump); + + SET_TYPE_OFFSET(ucp_Zl); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Zs - ucp_Zl); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_LESS_EQUAL); + jump = JUMP(SLJIT_C_NOT_ZERO ^ invertcmp); + break; + + case PT_WORD: + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, CHAR_UNDERSCORE - charoffset); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + /* ... fall through */ + + case PT_ALNUM: + SET_TYPE_OFFSET(ucp_Ll); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_Lu - ucp_Ll); + COND_VALUE((*cc == PT_ALNUM) ? SLJIT_MOV : SLJIT_OR, TMP2, 0, SLJIT_C_LESS_EQUAL); + SET_TYPE_OFFSET(ucp_Nd); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, typereg, 0, SLJIT_IMM, ucp_No - ucp_Nd); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_LESS_EQUAL); + jump = JUMP(SLJIT_C_NOT_ZERO ^ invertcmp); + break; + } + cc += 2; + } +#endif + + if (jump != NULL) + add_jump(compiler, compares > 0 ? list : backtracks, jump); + } + +if (found != NULL) + set_jumps(found, LABEL()); +} + +#undef SET_TYPE_OFFSET +#undef SET_CHAR_OFFSET + +#endif + +static pcre_uchar *compile_char1_trypath(compiler_common *common, pcre_uchar type, pcre_uchar *cc, jump_list **backtracks) +{ +DEFINE_COMPILER; +int length; +unsigned int c, oc, bit; +compare_context context; +struct sljit_jump *jump[4]; +#ifdef SUPPORT_UTF +struct sljit_label *label; +#ifdef SUPPORT_UCP +pcre_uchar propdata[5]; +#endif +#endif + +switch(type) + { + case OP_SOD: + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); + return cc; + + case OP_SOM: + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, TMP1, 0)); + return cc; + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + add_jump(compiler, &common->wordboundary, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_WORD_BOUNDARY ? SLJIT_C_NOT_ZERO : SLJIT_C_ZERO)); + return cc; + + case OP_NOT_DIGIT: + case OP_DIGIT: + detect_partial_match(common, backtracks); + read_char8_type(common); + OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_digit); + add_jump(compiler, backtracks, JUMP(type == OP_DIGIT ? SLJIT_C_ZERO : SLJIT_C_NOT_ZERO)); + return cc; + + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + detect_partial_match(common, backtracks); + read_char8_type(common); + OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_space); + add_jump(compiler, backtracks, JUMP(type == OP_WHITESPACE ? SLJIT_C_ZERO : SLJIT_C_NOT_ZERO)); + return cc; + + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + detect_partial_match(common, backtracks); + read_char8_type(common); + OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, ctype_word); + add_jump(compiler, backtracks, JUMP(type == OP_WORDCHAR ? SLJIT_C_ZERO : SLJIT_C_NOT_ZERO)); + return cc; + + case OP_ANY: + detect_partial_match(common, backtracks); + read_char(common); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + jump[0] = CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); + if (common->mode != JIT_PARTIAL_HARD_COMPILE) + jump[1] = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + else + jump[1] = check_str_end(common); + + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, common->newline & 0xff)); + if (jump[1] != NULL) + JUMPHERE(jump[1]); + JUMPHERE(jump[0]); + } + else + check_newlinechar(common, common->nltype, backtracks, TRUE); + return cc; + + case OP_ALLANY: + detect_partial_match(common, backtracks); +#ifdef SUPPORT_UTF + if (common->utf) + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +#ifdef COMPILE_PCRE8 + jump[0] = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +#else /* COMPILE_PCRE8 */ +#ifdef COMPILE_PCRE16 + jump[0] = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xd800); + OP2(SLJIT_AND, TMP1, 0, TMP1, 0, SLJIT_IMM, 0xfc00); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, 0xd800); + COND_VALUE(SLJIT_MOV, TMP1, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SHL, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); +#endif /* COMPILE_PCRE16 */ +#endif /* COMPILE_PCRE8 */ + JUMPHERE(jump[0]); + return cc; + } +#endif + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + return cc; + + case OP_ANYBYTE: + detect_partial_match(common, backtracks); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + return cc; + +#ifdef SUPPORT_UTF +#ifdef SUPPORT_UCP + case OP_NOTPROP: + case OP_PROP: + propdata[0] = 0; + propdata[1] = type == OP_NOTPROP ? XCL_NOTPROP : XCL_PROP; + propdata[2] = cc[0]; + propdata[3] = cc[1]; + propdata[4] = XCL_END; + compile_xclass_trypath(common, propdata, backtracks); + return cc + 2; +#endif +#endif + + case OP_ANYNL: + detect_partial_match(common, backtracks); + read_char(common); + jump[0] = CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); + /* We don't need to handle soft partial matching case. */ + if (common->mode != JIT_PARTIAL_HARD_COMPILE) + jump[1] = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + else + jump[1] = check_str_end(common); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + jump[2] = CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump[3] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[0]); + check_newlinechar(common, common->bsr_nltype, backtracks, FALSE); + JUMPHERE(jump[1]); + JUMPHERE(jump[2]); + JUMPHERE(jump[3]); + return cc; + + case OP_NOT_HSPACE: + case OP_HSPACE: + detect_partial_match(common, backtracks); + read_char(common); + add_jump(compiler, &common->hspace, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_HSPACE ? SLJIT_C_NOT_ZERO : SLJIT_C_ZERO)); + return cc; + + case OP_NOT_VSPACE: + case OP_VSPACE: + detect_partial_match(common, backtracks); + read_char(common); + add_jump(compiler, &common->vspace, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, JUMP(type == OP_NOT_VSPACE ? SLJIT_C_NOT_ZERO : SLJIT_C_ZERO)); + return cc; + +#ifdef SUPPORT_UCP + case OP_EXTUNI: + detect_partial_match(common, backtracks); + read_char(common); + add_jump(compiler, &common->getunichartype, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Mc); + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Mn - ucp_Mc)); + + label = LABEL(); + jump[0] = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP3, 0, STR_PTR, 0); + read_char(common); + add_jump(compiler, &common->getunichartype, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, ucp_Mc); + CMPTO(SLJIT_C_LESS_EQUAL, TMP1, 0, SLJIT_IMM, ucp_Mn - ucp_Mc, label); + + OP1(SLJIT_MOV, STR_PTR, 0, TMP3, 0); + JUMPHERE(jump[0]); + if (common->mode == JIT_PARTIAL_HARD_COMPILE) + { + jump[0] = CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0); + /* Since we successfully read a char above, partial matching must occure. */ + check_partial(common, TRUE); + JUMPHERE(jump[0]); + } + return cc; +#endif + + case OP_EODN: + /* Requires rather complex checks. */ + jump[0] = CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_END, 0)); + else + { + jump[1] = CMP(SLJIT_C_EQUAL, TMP2, 0, STR_END, 0); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_LESS); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_NOT_EQUAL); + add_jump(compiler, backtracks, JUMP(SLJIT_C_NOT_EQUAL)); + check_partial(common, TRUE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(jump[1]); + } + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else if (common->nltype == NLTYPE_FIXED) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_END, 0)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, common->newline)); + } + else + { + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + jump[1] = CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_CR); + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP2, 0, STR_END, 0); + jump[2] = JUMP(SLJIT_C_GREATER); + add_jump(compiler, backtracks, JUMP(SLJIT_C_LESS)); + /* Equal. */ + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump[3] = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + + JUMPHERE(jump[1]); + if (common->nltype == NLTYPE_ANYCRLF) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS, TMP2, 0, STR_END, 0)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, CHAR_NL)); + } + else + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, STR_PTR, 0); + read_char(common); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, STR_END, 0)); + add_jump(compiler, &common->anynewline, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, JUMP(SLJIT_C_ZERO)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1); + } + JUMPHERE(jump[2]); + JUMPHERE(jump[3]); + } + JUMPHERE(jump[0]); + check_partial(common, FALSE); + return cc; + + case OP_EOD: + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0)); + check_partial(common, FALSE); + return cc; + + case OP_CIRC: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER, STR_PTR, 0, TMP1, 0)); + OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + return cc; + + case OP_CIRCM: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); + jump[1] = CMP(SLJIT_C_GREATER, STR_PTR, 0, TMP1, 0); + OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, notbol)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + jump[0] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[1]); + + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER_EQUAL, STR_PTR, 0, STR_END, 0)); + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_SUB, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS, TMP2, 0, TMP1, 0)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-2)); + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(-1)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else + { + skip_char_back(common); + read_char(common); + check_newlinechar(common, common->nltype, backtracks, FALSE); + } + JUMPHERE(jump[0]); + return cc; + + case OP_DOLL: + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + + if (!common->endonly) + compile_char1_trypath(common, OP_EODN, cc, backtracks); + else + { + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0)); + check_partial(common, FALSE); + } + return cc; + + case OP_DOLLM: + jump[1] = CMP(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0); + OP1(SLJIT_MOV, TMP2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, noteol)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + check_partial(common, FALSE); + jump[0] = JUMP(SLJIT_JUMP); + JUMPHERE(jump[1]); + + if (common->nltype == NLTYPE_FIXED && common->newline > 255) + { + OP2(SLJIT_ADD, TMP2, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(2)); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(0)); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER, TMP2, 0, STR_END, 0)); + else + { + jump[1] = CMP(SLJIT_C_LESS_EQUAL, TMP2, 0, STR_END, 0); + /* STR_PTR = STR_END - IN_UCHARS(1) */ + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + check_partial(common, TRUE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(jump[1]); + } + + OP1(MOV_UCHAR, TMP2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, (common->newline >> 8) & 0xff)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, common->newline & 0xff)); + } + else + { + peek_char(common); + check_newlinechar(common, common->nltype, backtracks, FALSE); + } + JUMPHERE(jump[0]); + return cc; + + case OP_CHAR: + case OP_CHARI: + length = 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(*cc)) length += GET_EXTRALEN(*cc); +#endif + if (common->mode == JIT_COMPILE && (type == OP_CHAR || !char_has_othercase(common, cc) || char_get_othercase_bit(common, cc) != 0)) + { + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER, STR_PTR, 0, STR_END, 0)); + + context.length = IN_UCHARS(length); + context.sourcereg = -1; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + context.ucharptr = 0; +#endif + return byte_sequence_compare(common, type == OP_CHARI, cc, &context, backtracks); + } + detect_partial_match(common, backtracks); + read_char(common); +#ifdef SUPPORT_UTF + if (common->utf) + { + GETCHAR(c, cc); + } + else +#endif + c = *cc; + if (type == OP_CHAR || !char_has_othercase(common, cc)) + { + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c)); + return cc + length; + } + oc = char_othercase(common, c); + bit = c ^ oc; + if (ispowerof2(bit)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, c | bit)); + return cc + length; + } + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, c); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_IMM, char_othercase(common, c)); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + add_jump(compiler, backtracks, JUMP(SLJIT_C_ZERO)); + return cc + length; + + case OP_NOT: + case OP_NOTI: + detect_partial_match(common, backtracks); + length = 1; +#ifdef SUPPORT_UTF + if (common->utf) + { +#ifdef COMPILE_PCRE8 + c = *cc; + if (c < 128) + { + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(STR_PTR), 0); + if (type == OP_NOT || !char_has_othercase(common, cc)) + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, c)); + else + { + /* Since UTF8 code page is fixed, we know that c is in [a-z] or [A-Z] range. */ + OP2(SLJIT_OR, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x20); + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, c | 0x20)); + } + /* Skip the variable-length character. */ + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump[0] = CMP(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, 0xc0); + OP1(MOV_UCHAR, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)PRIV(utf8_table4) - 0xc0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); + JUMPHERE(jump[0]); + return cc + 1; + } + else +#endif /* COMPILE_PCRE8 */ + { + GETCHARLEN(c, cc, length); + read_char(common); + } + } + else +#endif /* SUPPORT_UTF */ + { + read_char(common); + c = *cc; + } + + if (type == OP_NOT || !char_has_othercase(common, cc)) + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, c)); + else + { + oc = char_othercase(common, c); + bit = c ^ oc; + if (ispowerof2(bit)) + { + OP2(SLJIT_OR, TMP1, 0, TMP1, 0, SLJIT_IMM, bit); + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, c | bit)); + } + else + { + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, c)); + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, oc)); + } + } + return cc + length; + + case OP_CLASS: + case OP_NCLASS: + detect_partial_match(common, backtracks); + read_char(common); +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + jump[0] = NULL; +#ifdef COMPILE_PCRE8 + /* This check only affects 8 bit mode. In other modes, we + always need to compare the value with 255. */ + if (common->utf) +#endif /* COMPILE_PCRE8 */ + { + jump[0] = CMP(SLJIT_C_GREATER, TMP1, 0, SLJIT_IMM, 255); + if (type == OP_CLASS) + { + add_jump(compiler, backtracks, jump[0]); + jump[0] = NULL; + } + } +#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */ + OP2(SLJIT_AND, TMP2, 0, TMP1, 0, SLJIT_IMM, 0x7); + OP2(SLJIT_LSHR, TMP1, 0, TMP1, 0, SLJIT_IMM, 3); + OP1(SLJIT_MOV_UB, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_w)cc); + OP2(SLJIT_SHL, TMP2, 0, SLJIT_IMM, 1, TMP2, 0); + OP2(SLJIT_AND | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, TMP2, 0); + add_jump(compiler, backtracks, JUMP(SLJIT_C_ZERO)); +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + if (jump[0] != NULL) + JUMPHERE(jump[0]); +#endif /* SUPPORT_UTF || !COMPILE_PCRE8 */ + return cc + 32 / sizeof(pcre_uchar); + +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 + case OP_XCLASS: + compile_xclass_trypath(common, cc + LINK_SIZE, backtracks); + return cc + GET(cc, 0) - 1; +#endif + + case OP_REVERSE: + length = GET(cc, 0); + if (length == 0) + return cc + LINK_SIZE; + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +#ifdef SUPPORT_UTF + if (common->utf) + { + OP1(SLJIT_MOV, TMP3, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, length); + label = LABEL(); + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS_EQUAL, STR_PTR, 0, TMP3, 0)); + skip_char_back(common); + OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, TMP2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_C_NOT_ZERO, label); + } + else +#endif + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, begin)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(length)); + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS, STR_PTR, 0, TMP1, 0)); + } + check_start_used_ptr(common); + return cc + LINK_SIZE; + } +SLJIT_ASSERT_STOP(); +return cc; +} + +static SLJIT_INLINE pcre_uchar *compile_charn_trypath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, jump_list **backtracks) +{ +/* This function consumes at least one input character. */ +/* To decrease the number of length checks, we try to concatenate the fixed length character sequences. */ +DEFINE_COMPILER; +pcre_uchar *ccbegin = cc; +compare_context context; +int size; + +context.length = 0; +do + { + if (cc >= ccend) + break; + + if (*cc == OP_CHAR) + { + size = 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(cc[1])) + size += GET_EXTRALEN(cc[1]); +#endif + } + else if (*cc == OP_CHARI) + { + size = 1; +#ifdef SUPPORT_UTF + if (common->utf) + { + if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0) + size = 0; + else if (HAS_EXTRALEN(cc[1])) + size += GET_EXTRALEN(cc[1]); + } + else +#endif + if (char_has_othercase(common, cc + 1) && char_get_othercase_bit(common, cc + 1) == 0) + size = 0; + } + else + size = 0; + + cc += 1 + size; + context.length += IN_UCHARS(size); + } +while (size > 0 && context.length <= 128); + +cc = ccbegin; +if (context.length > 0) + { + /* We have a fixed-length byte sequence. */ + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, context.length); + add_jump(compiler, backtracks, CMP(SLJIT_C_GREATER, STR_PTR, 0, STR_END, 0)); + + context.sourcereg = -1; +#if defined SLJIT_UNALIGNED && SLJIT_UNALIGNED + context.ucharptr = 0; +#endif + do cc = byte_sequence_compare(common, *cc == OP_CHARI, cc + 1, &context, backtracks); while (context.length > 0); + return cc; + } + +/* A non-fixed length character will be checked if length == 0. */ +return compile_char1_trypath(common, *cc, cc + 1, backtracks); +} + +static struct sljit_jump *compile_ref_checks(compiler_common *common, pcre_uchar *cc, jump_list **backtracks) +{ +DEFINE_COMPILER; +int offset = GET2(cc, 1) << 1; + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); +if (!common->jscript_compat) + { + if (backtracks == NULL) + { + /* OVECTOR(1) contains the "string begin - 1" constant. */ + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_EQUAL); + OP2(SLJIT_SUB | SLJIT_SET_E, SLJIT_UNUSED, 0, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_EQUAL); + return JUMP(SLJIT_C_NOT_ZERO); + } + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1))); + } +return CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); +} + +/* Forward definitions. */ +static void compile_trypath(compiler_common *, pcre_uchar *, pcre_uchar *, backtrack_common *); +static void compile_backtrackpath(compiler_common *, struct backtrack_common *); + +#define PUSH_BACKTRACK(size, ccstart, error) \ + do \ + { \ + backtrack = sljit_alloc_memory(compiler, (size)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return error; \ + memset(backtrack, 0, size); \ + backtrack->prev = parent->top; \ + backtrack->cc = (ccstart); \ + parent->top = backtrack; \ + } \ + while (0) + +#define PUSH_BACKTRACK_NOVALUE(size, ccstart) \ + do \ + { \ + backtrack = sljit_alloc_memory(compiler, (size)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return; \ + memset(backtrack, 0, size); \ + backtrack->prev = parent->top; \ + backtrack->cc = (ccstart); \ + parent->top = backtrack; \ + } \ + while (0) + +#define BACKTRACK_AS(type) ((type *)backtrack) + +static pcre_uchar *compile_ref_trypath(compiler_common *common, pcre_uchar *cc, jump_list **backtracks, BOOL withchecks, BOOL emptyfail) +{ +DEFINE_COMPILER; +int offset = GET2(cc, 1) << 1; +struct sljit_jump *jump = NULL; +struct sljit_jump *partial; +struct sljit_jump *nopartial; + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); +/* OVECTOR(1) contains the "string begin - 1" constant. */ +if (withchecks && !common->jscript_compat) + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1))); + +#if defined SUPPORT_UTF && defined SUPPORT_UCP +if (common->utf && *cc == OP_REFI) + { + SLJIT_ASSERT(TMP1 == SLJIT_TEMPORARY_REG1 && STACK_TOP == SLJIT_TEMPORARY_REG2 && TMP2 == SLJIT_TEMPORARY_REG3); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); + if (withchecks) + jump = CMP(SLJIT_C_EQUAL, TMP1, 0, TMP2, 0); + + /* Needed to save important temporary registers. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, STACK_TOP, 0); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG2, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_TEMPORARY_REG2), SLJIT_OFFSETOF(jit_arguments, uchar_ptr), STR_PTR, 0); + sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, CMP(SLJIT_C_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1)); + else + { + add_jump(compiler, backtracks, CMP(SLJIT_C_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0)); + nopartial = CMP(SLJIT_C_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); + check_partial(common, FALSE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(nopartial); + } + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + } +else +#endif /* SUPPORT_UTF && SUPPORT_UCP */ + { + OP2(SLJIT_SUB | SLJIT_SET_E, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP1, 0); + if (withchecks) + jump = JUMP(SLJIT_C_ZERO); + + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0); + partial = CMP(SLJIT_C_GREATER, STR_PTR, 0, STR_END, 0); + if (common->mode == JIT_COMPILE) + add_jump(compiler, backtracks, partial); + + add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + + if (common->mode != JIT_COMPILE) + { + nopartial = JUMP(SLJIT_JUMP); + JUMPHERE(partial); + /* TMP2 -= STR_END - STR_PTR */ + OP2(SLJIT_SUB, TMP2, 0, TMP2, 0, STR_PTR, 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, STR_END, 0); + partial = CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); + add_jump(compiler, *cc == OP_REF ? &common->casefulcmp : &common->caselesscmp, JUMP(SLJIT_FAST_CALL)); + add_jump(compiler, backtracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); + JUMPHERE(partial); + check_partial(common, FALSE); + add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); + JUMPHERE(nopartial); + } + } + +if (jump != NULL) + { + if (emptyfail) + add_jump(compiler, backtracks, jump); + else + JUMPHERE(jump); + } +return cc + 1 + IMM2_SIZE; +} + +static SLJIT_INLINE pcre_uchar *compile_ref_iterator_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar type; +struct sljit_label *label; +struct sljit_jump *zerolength; +struct sljit_jump *jump = NULL; +pcre_uchar *ccbegin = cc; +int min = 0, max = 0; +BOOL minimize; + +PUSH_BACKTRACK(sizeof(iterator_backtrack), cc, NULL); + +type = cc[1 + IMM2_SIZE]; +minimize = (type & 0x1) != 0; +switch(type) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + min = 0; + max = 0; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRPLUS: + case OP_CRMINPLUS: + min = 1; + max = 0; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRQUERY: + case OP_CRMINQUERY: + min = 0; + max = 1; + cc += 1 + IMM2_SIZE + 1; + break; + case OP_CRRANGE: + case OP_CRMINRANGE: + min = GET2(cc, 1 + IMM2_SIZE + 1); + max = GET2(cc, 1 + IMM2_SIZE + 1 + IMM2_SIZE); + cc += 1 + IMM2_SIZE + 1 + 2 * IMM2_SIZE; + break; + default: + SLJIT_ASSERT_STOP(); + break; + } + +if (!minimize) + { + if (min == 0) + { + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + /* Temporary release of STR_PTR. */ + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + zerolength = compile_ref_checks(common, ccbegin, NULL); + /* Restore if not zero length. */ + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + } + else + { + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + zerolength = compile_ref_checks(common, ccbegin, &backtrack->topbacktracks); + } + + if (min > 1 || max > 1) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 0); + + label = LABEL(); + compile_ref_trypath(common, ccbegin, &backtrack->topbacktracks, FALSE, FALSE); + + if (min > 1 || max > 1) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, TMP1, 0); + if (min > 1) + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, min, label); + if (max > 1) + { + jump = CMP(SLJIT_C_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, max); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + JUMPHERE(jump); + } + } + + if (max == 0) + { + /* Includes min > 1 case as well. */ + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + } + + JUMPHERE(zerolength); + BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); + + decrease_call_count(common); + return cc; + } + +allocate_stack(common, 2); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); +if (type != OP_CRMINSTAR) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + +if (min == 0) + { + zerolength = compile_ref_checks(common, ccbegin, NULL); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + jump = JUMP(SLJIT_JUMP); + } +else + zerolength = compile_ref_checks(common, ccbegin, &backtrack->topbacktracks); + +BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); +if (max > 0) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_GREATER_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, max)); + +compile_ref_trypath(common, ccbegin, &backtrack->topbacktracks, TRUE, TRUE); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + +if (min > 1) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, min, BACKTRACK_AS(iterator_backtrack)->trypath); + } +else if (max > 0) + OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1); + +if (jump != NULL) + JUMPHERE(jump); +JUMPHERE(zerolength); + +decrease_call_count(common); +return cc; +} + +static SLJIT_INLINE pcre_uchar *compile_recurse_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +recurse_entry *entry = common->entries; +recurse_entry *prev = NULL; +int start = GET(cc, 1); + +PUSH_BACKTRACK(sizeof(recurse_backtrack), cc, NULL); +while (entry != NULL) + { + if (entry->start == start) + break; + prev = entry; + entry = entry->next; + } + +if (entry == NULL) + { + entry = sljit_alloc_memory(compiler, sizeof(recurse_entry)); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + entry->next = NULL; + entry->entry = NULL; + entry->calls = NULL; + entry->start = start; + + if (prev != NULL) + prev->next = entry; + else + common->entries = entry; + } + +if (common->has_set_som && common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); + allocate_stack(common, 2); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + } +else if (common->has_set_som || common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } + +if (entry->entry == NULL) + add_jump(compiler, &entry->calls, JUMP(SLJIT_FAST_CALL)); +else + JUMPTO(SLJIT_FAST_CALL, entry->entry); +/* Leave if the match is failed. */ +add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, 0)); +return cc + 1 + LINK_SIZE; +} + +static pcre_uchar *compile_assert_trypath(compiler_common *common, pcre_uchar *cc, assert_backtrack *backtrack, BOOL conditional) +{ +DEFINE_COMPILER; +int framesize; +int localptr; +backtrack_common altbacktrack; +pcre_uchar *ccbegin; +pcre_uchar opcode; +pcre_uchar bra = OP_BRA; +jump_list *tmp = NULL; +jump_list **target = (conditional) ? &backtrack->condfailed : &backtrack->common.topbacktracks; +jump_list **found; +/* Saving previous accept variables. */ +struct sljit_label *save_leavelabel = common->leavelabel; +struct sljit_label *save_acceptlabel = common->acceptlabel; +jump_list *save_leave = common->leave; +jump_list *save_accept = common->accept; +struct sljit_jump *jump; +struct sljit_jump *brajump = NULL; + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + SLJIT_ASSERT(!conditional); + bra = *cc; + cc++; + } +localptr = PRIV_DATA(cc); +SLJIT_ASSERT(localptr != 0); +framesize = get_framesize(common, cc, FALSE); +backtrack->framesize = framesize; +backtrack->localptr = localptr; +opcode = *cc; +SLJIT_ASSERT(opcode >= OP_ASSERT && opcode <= OP_ASSERTBACK_NOT); +found = (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) ? &tmp : target; +ccbegin = cc; +cc += GET(cc, 1); + +if (bra == OP_BRAMINZERO) + { + /* This is a braminzero backtrack path. */ + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brajump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + +if (framesize < 0) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STACK_TOP, 0); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } +else + { + allocate_stack(common, framesize + 2); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, -STACK(framesize + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + init_frame(common, ccbegin, framesize + 1, 2, FALSE); + } + +memset(&altbacktrack, 0, sizeof(backtrack_common)); +common->leavelabel = NULL; +common->leave = NULL; +while (1) + { + common->acceptlabel = NULL; + common->accept = NULL; + altbacktrack.top = NULL; + altbacktrack.topbacktracks = NULL; + + if (*ccbegin == OP_ALT) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + altbacktrack.cc = ccbegin; + compile_trypath(common, ccbegin + 1 + LINK_SIZE, cc, &altbacktrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + common->leavelabel = save_leavelabel; + common->acceptlabel = save_acceptlabel; + common->leave = save_leave; + common->accept = save_accept; + return NULL; + } + common->acceptlabel = LABEL(); + if (common->accept != NULL) + set_jumps(common->accept, common->acceptlabel); + + /* Reset stack. */ + if (framesize < 0) + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + else { + if ((opcode != OP_ASSERT_NOT && opcode != OP_ASSERTBACK_NOT) || conditional) + { + /* We don't need to keep the STR_PTR, only the previous localptr. */ + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_w)); + } + else + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + } + + if (opcode == OP_ASSERT_NOT || opcode == OP_ASSERTBACK_NOT) + { + /* We know that STR_PTR was stored on the top of the stack. */ + if (conditional) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0); + else if (bra == OP_BRAZERO) + { + if (framesize < 0) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0); + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_w)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), (framesize + 1) * sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP1, 0); + } + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else if (framesize >= 0) + { + /* For OP_BRA and OP_BRAMINZERO. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_w)); + } + } + add_jump(compiler, found, JUMP(SLJIT_JUMP)); + + compile_backtrackpath(common, altbacktrack.top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + common->leavelabel = save_leavelabel; + common->acceptlabel = save_acceptlabel; + common->leave = save_leave; + common->accept = save_accept; + return NULL; + } + set_jumps(altbacktrack.topbacktracks, LABEL()); + + if (*cc != OP_ALT) + break; + + ccbegin = cc; + cc += GET(cc, 1); + } +/* None of them matched. */ +if (common->leave != NULL) + set_jumps(common->leave, LABEL()); + +if (opcode == OP_ASSERT || opcode == OP_ASSERTBACK) + { + /* Assert is failed. */ + if (conditional || bra == OP_BRAZERO) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + if (framesize < 0) + { + /* The topmost item should be 0. */ + if (bra == OP_BRAZERO) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + else + free_stack(common, 1); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* The topmost item should be 0. */ + if (bra == OP_BRAZERO) + { + free_stack(common, framesize + 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else + free_stack(common, framesize + 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP1, 0); + } + jump = JUMP(SLJIT_JUMP); + if (bra != OP_BRAZERO) + add_jump(compiler, target, jump); + + /* Assert is successful. */ + set_jumps(tmp, LABEL()); + if (framesize < 0) + { + /* We know that STR_PTR was stored on the top of the stack. */ + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0); + /* Keep the STR_PTR on the top of the stack. */ + if (bra == OP_BRAZERO) + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + else if (bra == OP_BRAMINZERO) + { + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + } + else + { + if (bra == OP_BRA) + { + /* We don't need to keep the STR_PTR, only the previous localptr. */ + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, (framesize + 1) * sizeof(sljit_w)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), 0); + } + else + { + /* We don't need to keep the STR_PTR, only the previous localptr. */ + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, (framesize + 2) * sizeof(sljit_w)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), bra == OP_BRAZERO ? STR_PTR : SLJIT_IMM, 0); + } + } + + if (bra == OP_BRAZERO) + { + backtrack->trypath = LABEL(); + sljit_set_label(jump, backtrack->trypath); + } + else if (bra == OP_BRAMINZERO) + { + JUMPTO(SLJIT_JUMP, backtrack->trypath); + JUMPHERE(brajump); + if (framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), framesize * sizeof(sljit_w)); + } + set_jumps(backtrack->common.topbacktracks, LABEL()); + } + } +else + { + /* AssertNot is successful. */ + if (framesize < 0) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (bra != OP_BRA) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + else + free_stack(common, 1); + } + else + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* The topmost item should be 0. */ + if (bra != OP_BRA) + { + free_stack(common, framesize + 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + else + free_stack(common, framesize + 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP1, 0); + } + + if (bra == OP_BRAZERO) + backtrack->trypath = LABEL(); + else if (bra == OP_BRAMINZERO) + { + JUMPTO(SLJIT_JUMP, backtrack->trypath); + JUMPHERE(brajump); + } + + if (bra != OP_BRA) + { + SLJIT_ASSERT(found == &backtrack->common.topbacktracks); + set_jumps(backtrack->common.topbacktracks, LABEL()); + backtrack->common.topbacktracks = NULL; + } + } + +common->leavelabel = save_leavelabel; +common->acceptlabel = save_acceptlabel; +common->leave = save_leave; +common->accept = save_accept; +return cc + 1 + LINK_SIZE; +} + +static sljit_w SLJIT_CALL do_searchovector(sljit_w refno, sljit_w* locals, pcre_uchar *name_table) +{ +int condition = FALSE; +pcre_uchar *slotA = name_table; +pcre_uchar *slotB; +sljit_w name_count = locals[LOCALS0 / sizeof(sljit_w)]; +sljit_w name_entry_size = locals[LOCALS1 / sizeof(sljit_w)]; +sljit_w no_capture; +int i; + +locals += refno & 0xff; +refno >>= 8; +no_capture = locals[1]; + +for (i = 0; i < name_count; i++) + { + if (GET2(slotA, 0) == refno) break; + slotA += name_entry_size; + } + +if (i < name_count) + { + /* Found a name for the number - there can be only one; duplicate names + for different numbers are allowed, but not vice versa. First scan down + for duplicates. */ + + slotB = slotA; + while (slotB > name_table) + { + slotB -= name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = locals[GET2(slotB, 0) << 1] != no_capture; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + if (!condition) + { + slotB = slotA; + for (i++; i < name_count; i++) + { + slotB += name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = locals[GET2(slotB, 0) << 1] != no_capture; + if (condition) break; + } + else break; + } + } + } +return condition; +} + +static sljit_w SLJIT_CALL do_searchgroups(sljit_w recno, sljit_w* locals, pcre_uchar *name_table) +{ +int condition = FALSE; +pcre_uchar *slotA = name_table; +pcre_uchar *slotB; +sljit_w name_count = locals[LOCALS0 / sizeof(sljit_w)]; +sljit_w name_entry_size = locals[LOCALS1 / sizeof(sljit_w)]; +sljit_w group_num = locals[POSSESSIVE0 / sizeof(sljit_w)]; +int i; + +for (i = 0; i < name_count; i++) + { + if (GET2(slotA, 0) == recno) break; + slotA += name_entry_size; + } + +if (i < name_count) + { + /* Found a name for the number - there can be only one; duplicate + names for different numbers are allowed, but not vice versa. First + scan down for duplicates. */ + + slotB = slotA; + while (slotB > name_table) + { + slotB -= name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = GET2(slotB, 0) == group_num; + if (condition) break; + } + else break; + } + + /* Scan up for duplicates */ + if (!condition) + { + slotB = slotA; + for (i++; i < name_count; i++) + { + slotB += name_entry_size; + if (STRCMP_UC_UC(slotA + IMM2_SIZE, slotB + IMM2_SIZE) == 0) + { + condition = GET2(slotB, 0) == group_num; + if (condition) break; + } + else break; + } + } + } +return condition; +} + +/* + Handling bracketed expressions is probably the most complex part. + + Stack layout naming characters: + S - Push the current STR_PTR + 0 - Push a 0 (NULL) + A - Push the current STR_PTR. Needed for restoring the STR_PTR + before the next alternative. Not pushed if there are no alternatives. + M - Any values pushed by the current alternative. Can be empty, or anything. + C - Push the previous OVECTOR(i), OVECTOR(i+1) and OVECTOR_PRIV(i) to the stack. + L - Push the previous local (pointed by localptr) to the stack + () - opional values stored on the stack + ()* - optonal, can be stored multiple times + + The following list shows the regular expression templates, their PCRE byte codes + and stack layout supported by pcre-sljit. + + (?:) OP_BRA | OP_KET A M + () OP_CBRA | OP_KET C M + (?:)+ OP_BRA | OP_KETRMAX 0 A M S ( A M S )* + OP_SBRA | OP_KETRMAX 0 L M S ( L M S )* + (?:)+? OP_BRA | OP_KETRMIN 0 A M S ( A M S )* + OP_SBRA | OP_KETRMIN 0 L M S ( L M S )* + ()+ OP_CBRA | OP_KETRMAX 0 C M S ( C M S )* + OP_SCBRA | OP_KETRMAX 0 C M S ( C M S )* + ()+? OP_CBRA | OP_KETRMIN 0 C M S ( C M S )* + OP_SCBRA | OP_KETRMIN 0 C M S ( C M S )* + (?:)? OP_BRAZERO | OP_BRA | OP_KET S ( A M 0 ) + (?:)?? OP_BRAMINZERO | OP_BRA | OP_KET S ( A M 0 ) + ()? OP_BRAZERO | OP_CBRA | OP_KET S ( C M 0 ) + ()?? OP_BRAMINZERO | OP_CBRA | OP_KET S ( C M 0 ) + (?:)* OP_BRAZERO | OP_BRA | OP_KETRMAX S 0 ( A M S )* + OP_BRAZERO | OP_SBRA | OP_KETRMAX S 0 ( L M S )* + (?:)*? OP_BRAMINZERO | OP_BRA | OP_KETRMIN S 0 ( A M S )* + OP_BRAMINZERO | OP_SBRA | OP_KETRMIN S 0 ( L M S )* + ()* OP_BRAZERO | OP_CBRA | OP_KETRMAX S 0 ( C M S )* + OP_BRAZERO | OP_SCBRA | OP_KETRMAX S 0 ( C M S )* + ()*? OP_BRAMINZERO | OP_CBRA | OP_KETRMIN S 0 ( C M S )* + OP_BRAMINZERO | OP_SCBRA | OP_KETRMIN S 0 ( C M S )* + + + Stack layout naming characters: + A - Push the alternative index (starting from 0) on the stack. + Not pushed if there is no alternatives. + M - Any values pushed by the current alternative. Can be empty, or anything. + + The next list shows the possible content of a bracket: + (|) OP_*BRA | OP_ALT ... M A + (?()|) OP_*COND | OP_ALT M A + (?>|) OP_ONCE | OP_ALT ... [stack trace] M A + (?>|) OP_ONCE_NC | OP_ALT ... [stack trace] M A + Or nothing, if trace is unnecessary +*/ + +static pcre_uchar *compile_bracket_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +int localptr = 0; +int offset = 0; +int stacksize; +pcre_uchar *ccbegin; +pcre_uchar *trypath; +pcre_uchar bra = OP_BRA; +pcre_uchar ket; +assert_backtrack *assert; +BOOL has_alternatives; +struct sljit_jump *jump; +struct sljit_jump *skip; +struct sljit_label *rmaxlabel = NULL; +struct sljit_jump *braminzerojump = NULL; + +PUSH_BACKTRACK(sizeof(bracket_backtrack), cc, NULL); + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + bra = *cc; + cc++; + opcode = *cc; + } + +opcode = *cc; +ccbegin = cc; +trypath = ccbegin + 1 + LINK_SIZE; + +if ((opcode == OP_COND || opcode == OP_SCOND) && cc[1 + LINK_SIZE] == OP_DEF) + { + /* Drop this bracket_backtrack. */ + parent->top = backtrack->prev; + return bracketend(cc); + } + +ket = *(bracketend(cc) - 1 - LINK_SIZE); +SLJIT_ASSERT(ket == OP_KET || ket == OP_KETRMAX || ket == OP_KETRMIN); +SLJIT_ASSERT(!((bra == OP_BRAZERO && ket == OP_KETRMIN) || (bra == OP_BRAMINZERO && ket == OP_KETRMAX))); +cc += GET(cc, 1); + +has_alternatives = *cc == OP_ALT; +if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + { + has_alternatives = (*trypath == OP_RREF) ? FALSE : TRUE; + if (*trypath == OP_NRREF) + { + stacksize = GET2(trypath, 1); + if (common->currententry == NULL || stacksize == RREF_ANY) + has_alternatives = FALSE; + else if (common->currententry->start == 0) + has_alternatives = stacksize != 0; + else + has_alternatives = stacksize != GET2(common->start, common->currententry->start + 1 + LINK_SIZE); + } + } + +if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN)) + opcode = OP_SCOND; +if (SLJIT_UNLIKELY(opcode == OP_ONCE_NC)) + opcode = OP_ONCE; + +if (opcode == OP_CBRA || opcode == OP_SCBRA) + { + /* Capturing brackets has a pre-allocated space. */ + offset = GET2(ccbegin, 1 + LINK_SIZE); + localptr = OVECTOR_PRIV(offset); + offset <<= 1; + BACKTRACK_AS(bracket_backtrack)->localptr = localptr; + trypath += IMM2_SIZE; + } +else if (opcode == OP_ONCE || opcode == OP_SBRA || opcode == OP_SCOND) + { + /* Other brackets simply allocate the next entry. */ + localptr = PRIV_DATA(ccbegin); + SLJIT_ASSERT(localptr != 0); + BACKTRACK_AS(bracket_backtrack)->localptr = localptr; + if (opcode == OP_ONCE) + BACKTRACK_AS(bracket_backtrack)->u.framesize = get_framesize(common, ccbegin, FALSE); + } + +/* Instructions before the first alternative. */ +stacksize = 0; +if ((ket == OP_KETRMAX) || (ket == OP_KETRMIN && bra != OP_BRAMINZERO)) + stacksize++; +if (bra == OP_BRAZERO) + stacksize++; + +if (stacksize > 0) + allocate_stack(common, stacksize); + +stacksize = 0; +if ((ket == OP_KETRMAX) || (ket == OP_KETRMIN && bra != OP_BRAMINZERO)) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + +if (bra == OP_BRAZERO) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + +if (bra == OP_BRAMINZERO) + { + /* This is a backtrack path! (Since the try-path of OP_BRAMINZERO matches to the empty string) */ + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (ket != OP_KETRMIN) + { + free_stack(common, 1); + braminzerojump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + else + { + if (opcode == OP_ONCE || opcode >= OP_SBRA) + { + jump = CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* Nothing stored during the first run. */ + skip = JUMP(SLJIT_JUMP); + JUMPHERE(jump); + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE || BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) + { + /* When we come from outside, localptr contains the previous STR_PTR. */ + braminzerojump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + } + else + { + /* Except when the whole stack frame must be saved. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + braminzerojump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), (BACKTRACK_AS(bracket_backtrack)->u.framesize + 1) * sizeof(sljit_w)); + } + JUMPHERE(skip); + } + else + { + jump = CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + JUMPHERE(jump); + } + } + } + +if (ket == OP_KETRMIN) + BACKTRACK_AS(bracket_backtrack)->recursivetrypath = LABEL(); + +if (ket == OP_KETRMAX) + { + rmaxlabel = LABEL(); + if (has_alternatives && opcode != OP_ONCE && opcode < OP_SBRA) + BACKTRACK_AS(bracket_backtrack)->alttrypath = rmaxlabel; + } + +/* Handling capturing brackets and alternatives. */ +if (opcode == OP_ONCE) + { + if (BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) + { + /* Neither capturing brackets nor recursions are not found in the block. */ + if (ket == OP_KETRMIN) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + OP2(SLJIT_SUB, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + } + else if (ket == OP_KETRMAX || has_alternatives) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STACK_TOP, 0); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + else + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STACK_TOP, 0); + } + else + { + if (ket == OP_KETRMIN || ket == OP_KETRMAX || has_alternatives) + { + allocate_stack(common, BACKTRACK_AS(bracket_backtrack)->u.framesize + 2); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, -STACK(BACKTRACK_AS(bracket_backtrack)->u.framesize + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + init_frame(common, ccbegin, BACKTRACK_AS(bracket_backtrack)->u.framesize + 1, 2, FALSE); + } + else + { + allocate_stack(common, BACKTRACK_AS(bracket_backtrack)->u.framesize + 1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, -STACK(BACKTRACK_AS(bracket_backtrack)->u.framesize)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + init_frame(common, ccbegin, BACKTRACK_AS(bracket_backtrack)->u.framesize, 1, FALSE); + } + } + } +else if (opcode == OP_CBRA || opcode == OP_SCBRA) + { + /* Saving the previous values. */ + allocate_stack(common, 3); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(2), TMP1, 0); + } +else if (opcode == OP_SBRA || opcode == OP_SCOND) + { + /* Saving the previous value. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + } +else if (has_alternatives) + { + /* Pushing the starting string pointer. */ + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + +/* Generating code for the first alternative. */ +if (opcode == OP_COND || opcode == OP_SCOND) + { + if (*trypath == OP_CREF) + { + SLJIT_ASSERT(has_alternatives); + add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), + CMP(SLJIT_C_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(GET2(trypath, 1) << 1), SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1))); + trypath += 1 + IMM2_SIZE; + } + else if (*trypath == OP_NCREF) + { + SLJIT_ASSERT(has_alternatives); + stacksize = GET2(trypath, 1); + jump = CMP(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(stacksize << 1), SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(1)); + + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STACK_TOP, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, SLJIT_IMM, common->name_count); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, SLJIT_IMM, common->name_entry_size); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, SLJIT_IMM, (stacksize << 8) | (common->ovector_start / sizeof(sljit_w))); + GET_LOCAL_BASE(SLJIT_TEMPORARY_REG2, 0, 0); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, common->name_table); + sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_searchovector)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1); + add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), CMP(SLJIT_C_EQUAL, SLJIT_TEMPORARY_REG1, 0, SLJIT_IMM, 0)); + + JUMPHERE(jump); + trypath += 1 + IMM2_SIZE; + } + else if (*trypath == OP_RREF || *trypath == OP_NRREF) + { + /* Never has other case. */ + BACKTRACK_AS(bracket_backtrack)->u.condfailed = NULL; + + stacksize = GET2(trypath, 1); + if (common->currententry == NULL) + stacksize = 0; + else if (stacksize == RREF_ANY) + stacksize = 1; + else if (common->currententry->start == 0) + stacksize = stacksize == 0; + else + stacksize = stacksize == GET2(common->start, common->currententry->start + 1 + LINK_SIZE); + + if (*trypath == OP_RREF || stacksize || common->currententry == NULL) + { + SLJIT_ASSERT(!has_alternatives); + if (stacksize != 0) + trypath += 1 + IMM2_SIZE; + else + { + if (*cc == OP_ALT) + { + trypath = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + } + else + trypath = cc; + } + } + else + { + SLJIT_ASSERT(has_alternatives); + + stacksize = GET2(trypath, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STACK_TOP, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0, SLJIT_IMM, common->name_count); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, SLJIT_IMM, common->name_entry_size); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, GET2(common->start, common->currententry->start + 1 + LINK_SIZE)); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG1, 0, SLJIT_IMM, stacksize); + GET_LOCAL_BASE(SLJIT_TEMPORARY_REG2, 0, 0); + OP1(SLJIT_MOV, SLJIT_TEMPORARY_REG3, 0, SLJIT_IMM, common->name_table); + sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_searchgroups)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1); + add_jump(compiler, &(BACKTRACK_AS(bracket_backtrack)->u.condfailed), CMP(SLJIT_C_EQUAL, SLJIT_TEMPORARY_REG1, 0, SLJIT_IMM, 0)); + trypath += 1 + IMM2_SIZE; + } + } + else + { + SLJIT_ASSERT(has_alternatives && *trypath >= OP_ASSERT && *trypath <= OP_ASSERTBACK_NOT); + /* Similar code as PUSH_BACKTRACK macro. */ + assert = sljit_alloc_memory(compiler, sizeof(assert_backtrack)); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + memset(assert, 0, sizeof(assert_backtrack)); + assert->common.cc = trypath; + BACKTRACK_AS(bracket_backtrack)->u.assert = assert; + trypath = compile_assert_trypath(common, trypath, assert, TRUE); + } + } + +compile_trypath(common, trypath, cc, backtrack); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + +if (opcode == OP_ONCE) + { + if (BACKTRACK_AS(bracket_backtrack)->u.framesize < 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + /* TMP2 which is set here used by OP_KETRMAX below. */ + if (ket == OP_KETRMAX) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), 0); + else if (ket == OP_KETRMIN) + { + /* Move the STR_PTR to the localptr. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), 0); + } + } + else + { + stacksize = (ket == OP_KETRMIN || ket == OP_KETRMAX || has_alternatives) ? 2 : 1; + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, (BACKTRACK_AS(bracket_backtrack)->u.framesize + stacksize) * sizeof(sljit_w)); + if (ket == OP_KETRMAX) + { + /* TMP2 which is set here used by OP_KETRMAX below. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + } + } + +stacksize = 0; +if (ket != OP_KET || bra != OP_BRA) + stacksize++; +if (has_alternatives && opcode != OP_ONCE) + stacksize++; + +if (stacksize > 0) + allocate_stack(common, stacksize); + +stacksize = 0; +if (ket != OP_KET) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + stacksize++; + } +else if (bra != OP_BRA) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + +if (has_alternatives) + { + if (opcode != OP_ONCE) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + if (ket != OP_KETRMAX) + BACKTRACK_AS(bracket_backtrack)->alttrypath = LABEL(); + } + +/* Must be after the trypath label. */ +if (offset != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 0), TMP1, 0); + } + +if (ket == OP_KETRMAX) + { + if (opcode == OP_ONCE || opcode >= OP_SBRA) + { + if (has_alternatives) + BACKTRACK_AS(bracket_backtrack)->alttrypath = LABEL(); + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE) + { + CMPTO(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STR_PTR, 0, rmaxlabel); + /* Drop STR_PTR for greedy plus quantifier. */ + if (bra != OP_BRAZERO) + free_stack(common, 1); + } + else + /* TMP2 must contain the starting STR_PTR. */ + CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_PTR, 0, rmaxlabel); + } + else + JUMPTO(SLJIT_JUMP, rmaxlabel); + BACKTRACK_AS(bracket_backtrack)->recursivetrypath = LABEL(); + } + +if (bra == OP_BRAZERO) + BACKTRACK_AS(bracket_backtrack)->zerotrypath = LABEL(); + +if (bra == OP_BRAMINZERO) + { + /* This is a backtrack path! (From the viewpoint of OP_BRAMINZERO) */ + JUMPTO(SLJIT_JUMP, ((braminzero_backtrack *)parent)->trypath); + if (braminzerojump != NULL) + { + JUMPHERE(braminzerojump); + /* We need to release the end pointer to perform the + backtrack for the zero-length iteration. When + framesize is < 0, OP_ONCE will do the release itself. */ + if (opcode == OP_ONCE && BACKTRACK_AS(bracket_backtrack)->u.framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + else if (ket == OP_KETRMIN && opcode != OP_ONCE) + free_stack(common, 1); + } + /* Continue to the normal backtrack. */ + } + +if ((ket != OP_KET && bra != OP_BRAMINZERO) || bra == OP_BRAZERO) + decrease_call_count(common); + +/* Skip the other alternatives. */ +while (*cc == OP_ALT) + cc += GET(cc, 1); +cc += 1 + LINK_SIZE; +return cc; +} + +static pcre_uchar *compile_bracketpos_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +int localptr; +int cbraprivptr = 0; +int framesize; +int stacksize; +int offset = 0; +BOOL zero = FALSE; +pcre_uchar *ccbegin = NULL; +int stack; +struct sljit_label *loop = NULL; +struct jump_list *emptymatch = NULL; + +PUSH_BACKTRACK(sizeof(bracketpos_backtrack), cc, NULL); +if (*cc == OP_BRAPOSZERO) + { + zero = TRUE; + cc++; + } + +opcode = *cc; +localptr = PRIV_DATA(cc); +SLJIT_ASSERT(localptr != 0); +BACKTRACK_AS(bracketpos_backtrack)->localptr = localptr; +switch(opcode) + { + case OP_BRAPOS: + case OP_SBRAPOS: + ccbegin = cc + 1 + LINK_SIZE; + break; + + case OP_CBRAPOS: + case OP_SCBRAPOS: + offset = GET2(cc, 1 + LINK_SIZE); + cbraprivptr = OVECTOR_PRIV(offset); + offset <<= 1; + ccbegin = cc + 1 + LINK_SIZE + IMM2_SIZE; + break; + + default: + SLJIT_ASSERT_STOP(); + break; + } + +framesize = get_framesize(common, cc, FALSE); +BACKTRACK_AS(bracketpos_backtrack)->framesize = framesize; +if (framesize < 0) + { + stacksize = (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) ? 2 : 1; + if (!zero) + stacksize++; + BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize; + allocate_stack(common, stacksize); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, STACK_TOP, 0); + + if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP2, 0); + } + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + + if (!zero) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 1); + } +else + { + stacksize = framesize + 1; + if (!zero) + stacksize++; + if (opcode == OP_BRAPOS || opcode == OP_SBRAPOS) + stacksize++; + BACKTRACK_AS(bracketpos_backtrack)->stacksize = stacksize; + allocate_stack(common, stacksize); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP2(SLJIT_SUB, TMP2, 0, STACK_TOP, 0, SLJIT_IMM, -STACK(stacksize - 1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP2, 0); + stack = 0; + if (!zero) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 1); + stack++; + } + if (opcode == OP_BRAPOS || opcode == OP_SBRAPOS) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), STR_PTR, 0); + stack++; + } + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stack), TMP1, 0); + init_frame(common, cc, stacksize - 1, stacksize - framesize, FALSE); + } + +if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); + +loop = LABEL(); +while (*cc != OP_KETRPOS) + { + backtrack->top = NULL; + backtrack->topbacktracks = NULL; + cc += GET(cc, 1); + + compile_trypath(common, ccbegin, cc, backtrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + + if (framesize < 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + + if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); + } + else + { + if (opcode == OP_SBRAPOS) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + + if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS) + add_jump(compiler, &emptymatch, CMP(SLJIT_C_EQUAL, TMP1, 0, STR_PTR, 0)); + + if (!zero) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0); + } + else + { + if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + { + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, stacksize * sizeof(sljit_w)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP2(SLJIT_ADD, STACK_TOP, 0, TMP2, 0, SLJIT_IMM, stacksize * sizeof(sljit_w)); + if (opcode == OP_SBRAPOS) + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_w), STR_PTR, 0); + } + + if (opcode == OP_SBRAPOS || opcode == OP_SCBRAPOS) + add_jump(compiler, &emptymatch, CMP(SLJIT_C_EQUAL, TMP1, 0, STR_PTR, 0)); + + if (!zero) + { + if (framesize < 0) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + } + JUMPTO(SLJIT_JUMP, loop); + flush_stubs(common); + + compile_backtrackpath(common, backtrack->top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return NULL; + set_jumps(backtrack->topbacktracks, LABEL()); + + if (framesize < 0) + { + if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); + else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + else + { + if (opcode == OP_CBRAPOS || opcode == OP_SCBRAPOS) + { + /* Last alternative. */ + if (*cc == OP_KETRPOS) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), cbraprivptr); + } + else + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP2), (framesize + 1) * sizeof(sljit_w)); + } + } + + if (*cc == OP_KETRPOS) + break; + ccbegin = cc + 1 + LINK_SIZE; + } + +backtrack->topbacktracks = NULL; +if (!zero) + { + if (framesize < 0) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(STACK_TOP), STACK(stacksize - 1), SLJIT_IMM, 0)); + else /* TMP2 is set to [localptr] above. */ + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(TMP2), (stacksize - 1) * sizeof(sljit_w), SLJIT_IMM, 0)); + } + +/* None of them matched. */ +set_jumps(emptymatch, LABEL()); +decrease_call_count(common); +return cc + 1 + LINK_SIZE; +} + +static SLJIT_INLINE pcre_uchar *get_iterator_parameters(compiler_common *common, pcre_uchar *cc, pcre_uchar *opcode, pcre_uchar *type, int *arg1, int *arg2, pcre_uchar **end) +{ +int class_len; + +*opcode = *cc; +if (*opcode >= OP_STAR && *opcode <= OP_POSUPTO) + { + cc++; + *type = OP_CHAR; + } +else if (*opcode >= OP_STARI && *opcode <= OP_POSUPTOI) + { + cc++; + *type = OP_CHARI; + *opcode -= OP_STARI - OP_STAR; + } +else if (*opcode >= OP_NOTSTAR && *opcode <= OP_NOTPOSUPTO) + { + cc++; + *type = OP_NOT; + *opcode -= OP_NOTSTAR - OP_STAR; + } +else if (*opcode >= OP_NOTSTARI && *opcode <= OP_NOTPOSUPTOI) + { + cc++; + *type = OP_NOTI; + *opcode -= OP_NOTSTARI - OP_STAR; + } +else if (*opcode >= OP_TYPESTAR && *opcode <= OP_TYPEPOSUPTO) + { + cc++; + *opcode -= OP_TYPESTAR - OP_STAR; + *type = 0; + } +else + { + SLJIT_ASSERT(*opcode >= OP_CLASS || *opcode <= OP_XCLASS); + *type = *opcode; + cc++; + class_len = (*type < OP_XCLASS) ? (int)(1 + (32 / sizeof(pcre_uchar))) : GET(cc, 0); + *opcode = cc[class_len - 1]; + if (*opcode >= OP_CRSTAR && *opcode <= OP_CRMINQUERY) + { + *opcode -= OP_CRSTAR - OP_STAR; + if (end != NULL) + *end = cc + class_len; + } + else + { + SLJIT_ASSERT(*opcode == OP_CRRANGE || *opcode == OP_CRMINRANGE); + *arg1 = GET2(cc, (class_len + IMM2_SIZE)); + *arg2 = GET2(cc, class_len); + + if (*arg2 == 0) + { + SLJIT_ASSERT(*arg1 != 0); + *opcode = (*opcode == OP_CRRANGE) ? OP_UPTO : OP_MINUPTO; + } + if (*arg1 == *arg2) + *opcode = OP_EXACT; + + if (end != NULL) + *end = cc + class_len + 2 * IMM2_SIZE; + } + return cc; + } + +if (*opcode == OP_UPTO || *opcode == OP_MINUPTO || *opcode == OP_EXACT || *opcode == OP_POSUPTO) + { + *arg1 = GET2(cc, 0); + cc += IMM2_SIZE; + } + +if (*type == 0) + { + *type = *cc; + if (end != NULL) + *end = next_opcode(common, cc); + cc++; + return cc; + } + +if (end != NULL) + { + *end = cc + 1; +#ifdef SUPPORT_UTF + if (common->utf && HAS_EXTRALEN(*cc)) *end += GET_EXTRALEN(*cc); +#endif + } +return cc; +} + +static pcre_uchar *compile_iterator_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; +pcre_uchar opcode; +pcre_uchar type; +int arg1 = -1, arg2 = -1; +pcre_uchar* end; +jump_list *nomatch = NULL; +struct sljit_jump *jump = NULL; +struct sljit_label *label; + +PUSH_BACKTRACK(sizeof(iterator_backtrack), cc, NULL); + +cc = get_iterator_parameters(common, cc, &opcode, &type, &arg1, &arg2, &end); + +switch(opcode) + { + case OP_STAR: + case OP_PLUS: + case OP_UPTO: + case OP_CRRANGE: + if (type == OP_ANYNL || type == OP_EXTUNI) + { + if (opcode == OP_STAR || opcode == OP_UPTO) + { + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 0); + } + else + { + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + } + if (opcode == OP_UPTO || opcode == OP_CRRANGE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 0); + + label = LABEL(); + compile_char1_trypath(common, type, cc, &backtrack->topbacktracks); + if (opcode == OP_UPTO || opcode == OP_CRRANGE) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + if (opcode == OP_CRRANGE && arg2 > 0) + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg2, label); + if (opcode == OP_UPTO || (opcode == OP_CRRANGE && arg1 > 0)) + jump = CMP(SLJIT_C_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, arg1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, TMP1, 0); + } + + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, label); + if (jump != NULL) + JUMPHERE(jump); + } + else + { + if (opcode == OP_PLUS) + compile_char1_trypath(common, type, cc, &backtrack->topbacktracks); + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1); + label = LABEL(); + compile_char1_trypath(common, type, cc, &nomatch); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + if (opcode <= OP_PLUS || (opcode == OP_CRRANGE && arg1 == 0)) + { + OP2(SLJIT_ADD, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1); + JUMPTO(SLJIT_JUMP, label); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg1 + 1, label); + } + set_jumps(nomatch, LABEL()); + if (opcode == OP_CRRANGE) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_LESS, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, arg2 + 1)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); + break; + + case OP_MINSTAR: + case OP_MINPLUS: + if (opcode == OP_MINPLUS) + compile_char1_trypath(common, type, cc, &backtrack->topbacktracks); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); + break; + + case OP_MINUPTO: + case OP_CRMINRANGE: + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), SLJIT_IMM, 1); + if (opcode == OP_CRMINRANGE) + add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP)); + BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); + break; + + case OP_QUERY: + case OP_MINQUERY: + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + if (opcode == OP_QUERY) + compile_char1_trypath(common, type, cc, &backtrack->topbacktracks); + BACKTRACK_AS(iterator_backtrack)->trypath = LABEL(); + break; + + case OP_EXACT: + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 1); + label = LABEL(); + compile_char1_trypath(common, type, cc, &backtrack->topbacktracks); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, TMP1, 0); + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg1 + 1, label); + break; + + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSUPTO: + if (opcode != OP_POSSTAR) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STR_PTR, 0); + label = LABEL(); + compile_char1_trypath(common, type, cc, &nomatch); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STR_PTR, 0); + if (opcode != OP_POSUPTO) + { + if (opcode == OP_POSPLUS) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 2); + JUMPTO(SLJIT_JUMP, label); + } + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, TMP1, 0); + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg1 + 1, label); + } + set_jumps(nomatch, LABEL()); + if (opcode == OP_POSPLUS) + add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_LESS, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE0, SLJIT_IMM, 2)); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1); + break; + + case OP_POSQUERY: + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STR_PTR, 0); + compile_char1_trypath(common, type, cc, &nomatch); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1, STR_PTR, 0); + set_jumps(nomatch, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), POSSESSIVE1); + break; + + default: + SLJIT_ASSERT_STOP(); + break; + } + +decrease_call_count(common); +return end; +} + +static SLJIT_INLINE pcre_uchar *compile_fail_accept_trypath(compiler_common *common, pcre_uchar *cc, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; + +PUSH_BACKTRACK(sizeof(bracket_backtrack), cc, NULL); + +if (*cc == OP_FAIL) + { + add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP)); + return cc + 1; + } + +if (*cc == OP_ASSERT_ACCEPT || common->currententry != NULL) + { + /* No need to check notempty conditions. */ + if (common->acceptlabel == NULL) + add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP)); + else + JUMPTO(SLJIT_JUMP, common->acceptlabel); + return cc + 1; + } + +if (common->acceptlabel == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0))); +else + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), common->acceptlabel); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty)); +add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0)); +OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart)); +if (common->acceptlabel == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, 0)); +else + CMPTO(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, 0, common->acceptlabel); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +if (common->acceptlabel == NULL) + add_jump(compiler, &common->accept, CMP(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_PTR, 0)); +else + CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_PTR, 0, common->acceptlabel); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_JUMP)); +return cc + 1; +} + +static SLJIT_INLINE pcre_uchar *compile_close_trypath(compiler_common *common, pcre_uchar *cc) +{ +DEFINE_COMPILER; +int offset = GET2(cc, 1); + +/* Data will be discarded anyway... */ +if (common->currententry != NULL) + return cc + 1 + IMM2_SIZE; + +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR_PRIV(offset)); +offset <<= 1; +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); +return cc + 1 + IMM2_SIZE; +} + +static void compile_trypath(compiler_common *common, pcre_uchar *cc, pcre_uchar *ccend, backtrack_common *parent) +{ +DEFINE_COMPILER; +backtrack_common *backtrack; + +while (cc < ccend) + { + switch(*cc) + { + case OP_SOD: + case OP_SOM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + 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_NOTPROP: + case OP_PROP: + case OP_ANYNL: + case OP_NOT_HSPACE: + case OP_HSPACE: + case OP_NOT_VSPACE: + case OP_VSPACE: + case OP_EXTUNI: + case OP_EODN: + case OP_EOD: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_NOT: + case OP_NOTI: + case OP_REVERSE: + cc = compile_char1_trypath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + break; + + case OP_SET_SOM: + PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + cc++; + break; + + case OP_CHAR: + case OP_CHARI: + if (common->mode == JIT_COMPILE) + cc = compile_charn_trypath(common, cc, ccend, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + else + cc = compile_char1_trypath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + cc = compile_iterator_trypath(common, cc, parent); + break; + + case OP_CLASS: + case OP_NCLASS: + if (cc[1 + (32 / sizeof(pcre_uchar))] >= OP_CRSTAR && cc[1 + (32 / sizeof(pcre_uchar))] <= OP_CRMINRANGE) + cc = compile_iterator_trypath(common, cc, parent); + else + cc = compile_char1_trypath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + break; + +#if defined SUPPORT_UTF || defined COMPILE_PCRE16 + case OP_XCLASS: + if (*(cc + GET(cc, 1)) >= OP_CRSTAR && *(cc + GET(cc, 1)) <= OP_CRMINRANGE) + cc = compile_iterator_trypath(common, cc, parent); + else + cc = compile_char1_trypath(common, *cc, cc + 1, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks); + break; +#endif + + case OP_REF: + case OP_REFI: + if (cc[1 + IMM2_SIZE] >= OP_CRSTAR && cc[1 + IMM2_SIZE] <= OP_CRMINRANGE) + cc = compile_ref_iterator_trypath(common, cc, parent); + else + cc = compile_ref_trypath(common, cc, parent->top != NULL ? &parent->top->nextbacktracks : &parent->topbacktracks, TRUE, FALSE); + break; + + case OP_RECURSE: + cc = compile_recurse_trypath(common, cc, parent); + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc); + cc = compile_assert_trypath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE); + break; + + case OP_BRAMINZERO: + PUSH_BACKTRACK_NOVALUE(sizeof(braminzero_backtrack), cc); + cc = bracketend(cc + 1); + if (*(cc - 1 - LINK_SIZE) != OP_KETRMIN) + { + allocate_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + } + else + { + allocate_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), STR_PTR, 0); + } + BACKTRACK_AS(braminzero_backtrack)->trypath = LABEL(); + if (cc[1] > OP_ASSERTBACK_NOT) + decrease_call_count(common); + break; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + case OP_COND: + case OP_SBRA: + case OP_SCBRA: + case OP_SCOND: + cc = compile_bracket_trypath(common, cc, parent); + break; + + case OP_BRAZERO: + if (cc[1] > OP_ASSERTBACK_NOT) + cc = compile_bracket_trypath(common, cc, parent); + else + { + PUSH_BACKTRACK_NOVALUE(sizeof(assert_backtrack), cc); + cc = compile_assert_trypath(common, cc, BACKTRACK_AS(assert_backtrack), FALSE); + } + break; + + case OP_BRAPOS: + case OP_CBRAPOS: + case OP_SBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + cc = compile_bracketpos_trypath(common, cc, parent); + break; + + case OP_MARK: + PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc); + SLJIT_ASSERT(common->mark_ptr != 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr); + allocate_stack(common, 1); + OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), TMP2, 0); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_IMM, (sljit_w)(cc + 2)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, mark_ptr), TMP2, 0); + cc += 1 + 2 + cc[1]; + break; + + case OP_COMMIT: + PUSH_BACKTRACK_NOVALUE(sizeof(backtrack_common), cc); + cc += 1; + break; + + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + cc = compile_fail_accept_trypath(common, cc, parent); + break; + + case OP_CLOSE: + cc = compile_close_trypath(common, cc); + break; + + case OP_SKIPZERO: + cc = bracketend(cc + 1); + break; + + default: + SLJIT_ASSERT_STOP(); + return; + } + if (cc == NULL) + return; + } +SLJIT_ASSERT(cc == ccend); +} + +#undef PUSH_BACKTRACK +#undef PUSH_BACKTRACK_NOVALUE +#undef BACKTRACK_AS + +#define COMPILE_BACKTRACKPATH(current) \ + do \ + { \ + compile_backtrackpath(common, (current)); \ + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) \ + return; \ + } \ + while (0) + +#define CURRENT_AS(type) ((type *)current) + +static void compile_iterator_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +pcre_uchar opcode; +pcre_uchar type; +int arg1 = -1, arg2 = -1; +struct sljit_label *label = NULL; +struct sljit_jump *jump = NULL; +jump_list *jumplist = NULL; + +cc = get_iterator_parameters(common, cc, &opcode, &type, &arg1, &arg2, NULL); + +switch(opcode) + { + case OP_STAR: + case OP_PLUS: + case OP_UPTO: + case OP_CRRANGE: + if (type == OP_ANYNL || type == OP_EXTUNI) + { + set_jumps(current->topbacktracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->trypath); + } + else + { + if (opcode <= OP_PLUS || opcode == OP_UPTO) + arg2 = 0; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + jump = CMP(SLJIT_C_LESS_EQUAL, TMP1, 0, SLJIT_IMM, arg2 + 1); + OP2(SLJIT_SUB, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + skip_char_back(common); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->trypath); + if (opcode == OP_CRRANGE) + set_jumps(current->topbacktracks, LABEL()); + JUMPHERE(jump); + free_stack(common, 2); + if (opcode == OP_PLUS) + set_jumps(current->topbacktracks, LABEL()); + } + break; + + case OP_MINSTAR: + case OP_MINPLUS: + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + compile_char1_trypath(common, type, cc, &jumplist); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->trypath); + set_jumps(jumplist, LABEL()); + free_stack(common, 1); + if (opcode == OP_MINPLUS) + set_jumps(current->topbacktracks, LABEL()); + break; + + case OP_MINUPTO: + case OP_CRMINRANGE: + if (opcode == OP_CRMINRANGE) + { + label = LABEL(); + set_jumps(current->topbacktracks, label); + } + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + compile_char1_trypath(common, type, cc, &jumplist); + + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(1), TMP1, 0); + + if (opcode == OP_CRMINRANGE) + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg2 + 1, label); + + if (opcode == OP_CRMINRANGE && arg1 == 0) + JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->trypath); + else + CMPTO(SLJIT_C_LESS, TMP1, 0, SLJIT_IMM, arg1 + 2, CURRENT_AS(iterator_backtrack)->trypath); + + set_jumps(jumplist, LABEL()); + free_stack(common, 2); + break; + + case OP_QUERY: + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->trypath); + jump = JUMP(SLJIT_JUMP); + set_jumps(current->topbacktracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->trypath); + JUMPHERE(jump); + free_stack(common, 1); + break; + + case OP_MINQUERY: + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + jump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + compile_char1_trypath(common, type, cc, &jumplist); + JUMPTO(SLJIT_JUMP, CURRENT_AS(iterator_backtrack)->trypath); + set_jumps(jumplist, LABEL()); + JUMPHERE(jump); + free_stack(common, 1); + break; + + case OP_EXACT: + case OP_POSPLUS: + set_jumps(current->topbacktracks, LABEL()); + break; + + case OP_POSSTAR: + case OP_POSQUERY: + case OP_POSUPTO: + break; + + default: + SLJIT_ASSERT_STOP(); + break; + } +} + +static void compile_ref_iterator_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +pcre_uchar type; + +type = cc[1 + IMM2_SIZE]; +if ((type & 0x1) == 0) + { + set_jumps(current->topbacktracks, LABEL()); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->trypath); + return; + } + +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); +CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(iterator_backtrack)->trypath); +set_jumps(current->topbacktracks, LABEL()); +free_stack(common, 2); +} + +static void compile_recurse_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; + +set_jumps(current->topbacktracks, LABEL()); + +if (common->has_set_som && common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, TMP1, 0); + } +else if (common->has_set_som || common->mark_ptr != 0) + { + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->has_set_som ? (int)(OVECTOR(0)) : common->mark_ptr, TMP2, 0); + } +} + +static void compile_assert_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +pcre_uchar *cc = current->cc; +pcre_uchar bra = OP_BRA; +struct sljit_jump *brajump = NULL; + +SLJIT_ASSERT(*cc != OP_BRAMINZERO); +if (*cc == OP_BRAZERO) + { + bra = *cc; + cc++; + } + +if (bra == OP_BRAZERO) + { + SLJIT_ASSERT(current->topbacktracks == NULL); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + +if (CURRENT_AS(assert_backtrack)->framesize < 0) + { + set_jumps(current->topbacktracks, LABEL()); + + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->trypath); + free_stack(common, 1); + } + return; + } + +if (bra == OP_BRAZERO) + { + if (*cc == OP_ASSERT_NOT || *cc == OP_ASSERTBACK_NOT) + { + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(assert_backtrack)->trypath); + free_stack(common, 1); + return; + } + free_stack(common, 1); + brajump = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_IMM, 0); + } + +if (*cc == OP_ASSERT || *cc == OP_ASSERTBACK) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), CURRENT_AS(assert_backtrack)->localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), CURRENT_AS(assert_backtrack)->localptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(assert_backtrack)->framesize * sizeof(sljit_w)); + + set_jumps(current->topbacktracks, LABEL()); + } +else + set_jumps(current->topbacktracks, LABEL()); + +if (bra == OP_BRAZERO) + { + /* We know there is enough place on the stack. */ + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), SLJIT_IMM, 0); + JUMPTO(SLJIT_JUMP, CURRENT_AS(assert_backtrack)->trypath); + JUMPHERE(brajump); + } +} + +static void compile_bracket_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +int opcode; +int offset = 0; +int localptr = CURRENT_AS(bracket_backtrack)->localptr; +int stacksize; +int count; +pcre_uchar *cc = current->cc; +pcre_uchar *ccbegin; +pcre_uchar *ccprev; +jump_list *jumplist = NULL; +jump_list *jumplistitem = NULL; +pcre_uchar bra = OP_BRA; +pcre_uchar ket; +assert_backtrack *assert; +BOOL has_alternatives; +struct sljit_jump *brazero = NULL; +struct sljit_jump *once = NULL; +struct sljit_jump *cond = NULL; +struct sljit_label *rminlabel = NULL; + +if (*cc == OP_BRAZERO || *cc == OP_BRAMINZERO) + { + bra = *cc; + cc++; + } + +opcode = *cc; +ccbegin = cc; +ket = *(bracketend(ccbegin) - 1 - LINK_SIZE); +cc += GET(cc, 1); +has_alternatives = *cc == OP_ALT; +if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + has_alternatives = (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) || CURRENT_AS(bracket_backtrack)->u.condfailed != NULL; +if (opcode == OP_CBRA || opcode == OP_SCBRA) + offset = (GET2(ccbegin, 1 + LINK_SIZE)) << 1; +if (SLJIT_UNLIKELY(opcode == OP_COND) && (*cc == OP_KETRMAX || *cc == OP_KETRMIN)) + opcode = OP_SCOND; +if (SLJIT_UNLIKELY(opcode == OP_ONCE_NC)) + opcode = OP_ONCE; + +if (ket == OP_KETRMAX) + { + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brazero = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, 0); + } + } +else if (ket == OP_KETRMIN) + { + if (bra != OP_BRAMINZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (opcode >= OP_SBRA || opcode == OP_ONCE) + { + /* Checking zero-length iteration. */ + if (opcode != OP_ONCE || CURRENT_AS(bracket_backtrack)->u.framesize < 0) + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, CURRENT_AS(bracket_backtrack)->recursivetrypath); + else + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_MEM1(TMP1), (CURRENT_AS(bracket_backtrack)->u.framesize + 1) * sizeof(sljit_w), CURRENT_AS(bracket_backtrack)->recursivetrypath); + } + if (opcode != OP_ONCE) + free_stack(common, 1); + } + else + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->recursivetrypath); + } + rminlabel = LABEL(); + } +else if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + brazero = CMP(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0); + } + +if (SLJIT_UNLIKELY(opcode == OP_ONCE)) + { + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + } + once = JUMP(SLJIT_JUMP); + } +else if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + { + if (has_alternatives) + { + /* Always exactly one alternative. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + + jumplistitem = sljit_alloc_memory(compiler, sizeof(jump_list)); + if (SLJIT_UNLIKELY(!jumplistitem)) + return; + jumplist = jumplistitem; + jumplistitem->next = NULL; + jumplistitem->jump = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, 1); + } + } +else if (*cc == OP_ALT) + { + /* Build a jump list. Get the last successfully matched branch index. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + count = 1; + do + { + /* Append as the last item. */ + if (jumplist != NULL) + { + jumplistitem->next = sljit_alloc_memory(compiler, sizeof(jump_list)); + jumplistitem = jumplistitem->next; + } + else + { + jumplistitem = sljit_alloc_memory(compiler, sizeof(jump_list)); + jumplist = jumplistitem; + } + + if (SLJIT_UNLIKELY(!jumplistitem)) + return; + + jumplistitem->next = NULL; + jumplistitem->jump = CMP(SLJIT_C_EQUAL, TMP1, 0, SLJIT_IMM, count++); + cc += GET(cc, 1); + } + while (*cc == OP_ALT); + + cc = ccbegin + GET(ccbegin, 1); + } + +COMPILE_BACKTRACKPATH(current->top); +if (current->topbacktracks) + set_jumps(current->topbacktracks, LABEL()); + +if (SLJIT_UNLIKELY(opcode == OP_COND) || SLJIT_UNLIKELY(opcode == OP_SCOND)) + { + /* Conditional block always has at most one alternative. */ + if (ccbegin[1 + LINK_SIZE] >= OP_ASSERT && ccbegin[1 + LINK_SIZE] <= OP_ASSERTBACK_NOT) + { + SLJIT_ASSERT(has_alternatives); + assert = CURRENT_AS(bracket_backtrack)->u.assert; + if (assert->framesize >= 0 && (ccbegin[1 + LINK_SIZE] == OP_ASSERT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK)) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), assert->localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), assert->localptr, SLJIT_MEM1(STACK_TOP), assert->framesize * sizeof(sljit_w)); + } + cond = JUMP(SLJIT_JUMP); + set_jumps(CURRENT_AS(bracket_backtrack)->u.assert->condfailed, LABEL()); + } + else if (CURRENT_AS(bracket_backtrack)->u.condfailed != NULL) + { + SLJIT_ASSERT(has_alternatives); + cond = JUMP(SLJIT_JUMP); + set_jumps(CURRENT_AS(bracket_backtrack)->u.condfailed, LABEL()); + } + else + SLJIT_ASSERT(!has_alternatives); + } + +if (has_alternatives) + { + count = 1; + do + { + current->top = NULL; + current->topbacktracks = NULL; + current->nextbacktracks = NULL; + if (*cc == OP_ALT) + { + ccprev = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + if (opcode != OP_COND && opcode != OP_SCOND) + { + if (localptr != 0 && opcode != OP_ONCE) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + else + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + compile_trypath(common, ccprev, cc, current); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + return; + } + + /* Instructions after the current alternative is succesfully matched. */ + /* There is a similar code in compile_bracket_trypath. */ + if (opcode == OP_ONCE) + { + if (CURRENT_AS(bracket_backtrack)->u.framesize < 0) + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + /* TMP2 which is set here used by OP_KETRMAX below. */ + if (ket == OP_KETRMAX) + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), 0); + else if (ket == OP_KETRMIN) + { + /* Move the STR_PTR to the localptr. */ + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), 0); + } + } + else + { + OP2(SLJIT_ADD, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_IMM, (CURRENT_AS(bracket_backtrack)->u.framesize + 2) * sizeof(sljit_w)); + if (ket == OP_KETRMAX) + { + /* TMP2 which is set here used by OP_KETRMAX below. */ + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + } + } + } + + stacksize = 0; + if (opcode != OP_ONCE) + stacksize++; + if (ket != OP_KET || bra != OP_BRA) + stacksize++; + + if (stacksize > 0) { + if (opcode != OP_ONCE || CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + allocate_stack(common, stacksize); + else + { + /* We know we have place at least for one item on the top of the stack. */ + SLJIT_ASSERT(stacksize == 1); + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, sizeof(sljit_w)); + } + } + + stacksize = 0; + if (ket != OP_KET || bra != OP_BRA) + { + if (ket != OP_KET) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), STR_PTR, 0); + else + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, 0); + stacksize++; + } + + if (opcode != OP_ONCE) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(stacksize), SLJIT_IMM, count++); + + if (offset != 0) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 0), TMP1, 0); + } + + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->alttrypath); + + if (opcode != OP_ONCE) + { + SLJIT_ASSERT(jumplist); + JUMPHERE(jumplist->jump); + jumplist = jumplist->next; + } + + COMPILE_BACKTRACKPATH(current->top); + if (current->topbacktracks) + set_jumps(current->topbacktracks, LABEL()); + SLJIT_ASSERT(!current->nextbacktracks); + } + while (*cc == OP_ALT); + SLJIT_ASSERT(!jumplist); + + if (cond != NULL) + { + SLJIT_ASSERT(opcode == OP_COND || opcode == OP_SCOND); + assert = CURRENT_AS(bracket_backtrack)->u.assert; + if ((ccbegin[1 + LINK_SIZE] == OP_ASSERT_NOT || ccbegin[1 + LINK_SIZE] == OP_ASSERTBACK_NOT) && assert->framesize >= 0) + + { + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), assert->localptr); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), assert->localptr, SLJIT_MEM1(STACK_TOP), assert->framesize * sizeof(sljit_w)); + } + JUMPHERE(cond); + } + + /* Free the STR_PTR. */ + if (localptr == 0) + free_stack(common, 1); + } + +if (offset != 0) + { + /* Using both tmp register is better for instruction scheduling. */ + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), STACK(2)); + free_stack(common, 3); + } +else if (opcode == OP_SBRA || opcode == OP_SCOND) + { + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + } +else if (opcode == OP_ONCE) + { + cc = ccbegin + GET(ccbegin, 1); + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + { + /* Reset head and drop saved frame. */ + stacksize = (ket == OP_KETRMAX || ket == OP_KETRMIN || *cc == OP_ALT) ? 2 : 1; + free_stack(common, CURRENT_AS(bracket_backtrack)->u.framesize + stacksize); + } + else if (ket == OP_KETRMAX || (*cc == OP_ALT && ket != OP_KETRMIN)) + { + /* The STR_PTR must be released. */ + free_stack(common, 1); + } + + JUMPHERE(once); + /* Restore previous localptr */ + if (CURRENT_AS(bracket_backtrack)->u.framesize >= 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(bracket_backtrack)->u.framesize * sizeof(sljit_w)); + else if (ket == OP_KETRMIN) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + /* See the comment below. */ + free_stack(common, 2); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), localptr, TMP1, 0); + } + } + +if (ket == OP_KETRMAX) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + if (bra != OP_BRAZERO) + free_stack(common, 1); + CMPTO(SLJIT_C_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0, CURRENT_AS(bracket_backtrack)->recursivetrypath); + if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zerotrypath); + JUMPHERE(brazero); + free_stack(common, 1); + } + } +else if (ket == OP_KETRMIN) + { + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + /* OP_ONCE removes everything in case of a backtrack, so we don't + need to explicitly release the STR_PTR. The extra release would + affect badly the free_stack(2) above. */ + if (opcode != OP_ONCE) + free_stack(common, 1); + CMPTO(SLJIT_C_NOT_EQUAL, TMP1, 0, SLJIT_IMM, 0, rminlabel); + if (opcode == OP_ONCE) + free_stack(common, bra == OP_BRAMINZERO ? 2 : 1); + else if (bra == OP_BRAMINZERO) + free_stack(common, 1); + } +else if (bra == OP_BRAZERO) + { + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + JUMPTO(SLJIT_JUMP, CURRENT_AS(bracket_backtrack)->zerotrypath); + JUMPHERE(brazero); + } +} + +static void compile_bracketpos_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; +int offset; +struct sljit_jump *jump; + +if (CURRENT_AS(bracketpos_backtrack)->framesize < 0) + { + if (*current->cc == OP_CBRAPOS || *current->cc == OP_SCBRAPOS) + { + offset = (GET2(current->cc, 1 + LINK_SIZE)) << 1; + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), STACK(1)); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset), TMP1, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(offset + 1), TMP2, 0); + } + set_jumps(current->topbacktracks, LABEL()); + free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize); + return; + } + +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), CURRENT_AS(bracketpos_backtrack)->localptr); +add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + +if (current->topbacktracks) + { + jump = JUMP(SLJIT_JUMP); + set_jumps(current->topbacktracks, LABEL()); + /* Drop the stack frame. */ + free_stack(common, CURRENT_AS(bracketpos_backtrack)->stacksize); + JUMPHERE(jump); + } +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), CURRENT_AS(bracketpos_backtrack)->localptr, SLJIT_MEM1(STACK_TOP), CURRENT_AS(bracketpos_backtrack)->framesize * sizeof(sljit_w)); +} + +static void compile_braminzero_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +assert_backtrack backtrack; + +current->top = NULL; +current->topbacktracks = NULL; +current->nextbacktracks = NULL; +if (current->cc[1] > OP_ASSERTBACK_NOT) + { + /* Manual call of compile_bracket_trypath and compile_bracket_backtrackpath. */ + compile_bracket_trypath(common, current->cc, current); + compile_bracket_backtrackpath(common, current->top); + } +else + { + memset(&backtrack, 0, sizeof(backtrack)); + backtrack.common.cc = current->cc; + backtrack.trypath = CURRENT_AS(braminzero_backtrack)->trypath; + /* Manual call of compile_assert_trypath. */ + compile_assert_trypath(common, current->cc, &backtrack, FALSE); + } +SLJIT_ASSERT(!current->nextbacktracks && !current->topbacktracks); +} + +static void compile_backtrackpath(compiler_common *common, struct backtrack_common *current) +{ +DEFINE_COMPILER; + +while (current) + { + if (current->nextbacktracks != NULL) + set_jumps(current->nextbacktracks, LABEL()); + switch(*current->cc) + { + case OP_SET_SOM: + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), TMP1, 0); + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_UPTO: + case OP_MINUPTO: + case OP_EXACT: + case OP_POSSTAR: + case OP_POSPLUS: + case OP_POSQUERY: + case OP_POSUPTO: + case OP_STARI: + case OP_MINSTARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_UPTOI: + case OP_MINUPTOI: + case OP_EXACTI: + case OP_POSSTARI: + case OP_POSPLUSI: + case OP_POSQUERYI: + case OP_POSUPTOI: + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + case OP_NOTEXACT: + case OP_NOTPOSSTAR: + case OP_NOTPOSPLUS: + case OP_NOTPOSQUERY: + case OP_NOTPOSUPTO: + case OP_NOTSTARI: + case OP_NOTMINSTARI: + case OP_NOTPLUSI: + case OP_NOTMINPLUSI: + case OP_NOTQUERYI: + case OP_NOTMINQUERYI: + case OP_NOTUPTOI: + case OP_NOTMINUPTOI: + case OP_NOTEXACTI: + case OP_NOTPOSSTARI: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERYI: + case OP_NOTPOSUPTOI: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEEXACT: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSPLUS: + case OP_TYPEPOSQUERY: + case OP_TYPEPOSUPTO: + case OP_CLASS: + case OP_NCLASS: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: +#endif + compile_iterator_backtrackpath(common, current); + break; + + case OP_REF: + case OP_REFI: + compile_ref_iterator_backtrackpath(common, current); + break; + + case OP_RECURSE: + compile_recurse_backtrackpath(common, current); + break; + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + compile_assert_backtrackpath(common, current); + break; + + case OP_ONCE: + case OP_ONCE_NC: + case OP_BRA: + case OP_CBRA: + case OP_COND: + case OP_SBRA: + case OP_SCBRA: + case OP_SCOND: + compile_bracket_backtrackpath(common, current); + break; + + case OP_BRAZERO: + if (current->cc[1] > OP_ASSERTBACK_NOT) + compile_bracket_backtrackpath(common, current); + else + compile_assert_backtrackpath(common, current); + break; + + case OP_BRAPOS: + case OP_CBRAPOS: + case OP_SBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOSZERO: + compile_bracketpos_backtrackpath(common, current); + break; + + case OP_BRAMINZERO: + compile_braminzero_backtrackpath(common, current); + break; + + case OP_MARK: + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + free_stack(common, 1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, TMP1, 0); + break; + + case OP_COMMIT: + OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); + if (common->leavelabel == NULL) + add_jump(compiler, &common->leave, JUMP(SLJIT_JUMP)); + else + JUMPTO(SLJIT_JUMP, common->leavelabel); + break; + + case OP_FAIL: + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + set_jumps(current->topbacktracks, LABEL()); + break; + + default: + SLJIT_ASSERT_STOP(); + break; + } + current = current->prev; + } +} + +static SLJIT_INLINE void compile_recurse(compiler_common *common) +{ +DEFINE_COMPILER; +pcre_uchar *cc = common->start + common->currententry->start; +pcre_uchar *ccbegin = cc + 1 + LINK_SIZE + (*cc == OP_BRA ? 0 : IMM2_SIZE); +pcre_uchar *ccend = bracketend(cc); +int localsize = get_localsize(common, ccbegin, ccend); +int framesize = get_framesize(common, cc, TRUE); +int alternativesize; +BOOL needsframe; +backtrack_common altbacktrack; +struct sljit_label *save_leavelabel = common->leavelabel; +jump_list *save_leave = common->leave; +struct sljit_jump *jump; + +SLJIT_ASSERT(*cc == OP_BRA || *cc == OP_CBRA || *cc == OP_CBRAPOS || *cc == OP_SCBRA || *cc == OP_SCBRAPOS); +needsframe = framesize >= 0; +if (!needsframe) + framesize = 0; +alternativesize = *(cc + GET(cc, 1)) == OP_ALT ? 1 : 0; + +SLJIT_ASSERT(common->currententry->entry == NULL && common->recursive_head != 0); +common->currententry->entry = LABEL(); +set_jumps(common->currententry->calls, common->currententry->entry); + +sljit_emit_fast_enter(compiler, TMP2, 0); +allocate_stack(common, localsize + framesize + alternativesize); +OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(localsize + framesize + alternativesize - 1), TMP2, 0); +copy_locals(common, ccbegin, ccend, TRUE, localsize + framesize + alternativesize, framesize + alternativesize); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->recursive_head, STACK_TOP, 0); +if (needsframe) + init_frame(common, cc, framesize + alternativesize - 1, alternativesize, TRUE); + +if (alternativesize > 0) + OP1(SLJIT_MOV, SLJIT_MEM1(STACK_TOP), STACK(0), STR_PTR, 0); + +memset(&altbacktrack, 0, sizeof(backtrack_common)); +common->leavelabel = NULL; +common->acceptlabel = NULL; +common->leave = NULL; +common->accept = NULL; +altbacktrack.cc = ccbegin; +cc += GET(cc, 1); +while (1) + { + altbacktrack.top = NULL; + altbacktrack.topbacktracks = NULL; + + if (altbacktrack.cc != ccbegin) + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(STACK_TOP), STACK(0)); + + compile_trypath(common, altbacktrack.cc, cc, &altbacktrack); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + common->leavelabel = save_leavelabel; + common->leave = save_leave; + return; + } + + add_jump(compiler, &common->accept, JUMP(SLJIT_JUMP)); + + compile_backtrackpath(common, altbacktrack.top); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + common->leavelabel = save_leavelabel; + common->leave = save_leave; + return; + } + set_jumps(altbacktrack.topbacktracks, LABEL()); + + if (*cc != OP_ALT) + break; + + altbacktrack.cc = cc + 1 + LINK_SIZE; + cc += GET(cc, 1); + } +/* None of them matched. */ +if (common->leave != NULL) + set_jumps(common->leave, LABEL()); + +OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 0); +jump = JUMP(SLJIT_JUMP); + +set_jumps(common->accept, LABEL()); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->recursive_head); +if (needsframe) + { + OP2(SLJIT_SUB, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_w)); + add_jump(compiler, &common->revertframes, JUMP(SLJIT_FAST_CALL)); + OP2(SLJIT_ADD, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, (framesize + alternativesize) * sizeof(sljit_w)); + } +OP1(SLJIT_MOV, TMP3, 0, SLJIT_IMM, 1); + +JUMPHERE(jump); +copy_locals(common, ccbegin, ccend, FALSE, localsize + framesize + alternativesize, framesize + alternativesize); +free_stack(common, localsize + framesize + alternativesize); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(STACK_TOP), sizeof(sljit_w)); +OP1(SLJIT_MOV, TMP1, 0, TMP3, 0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->recursive_head, TMP2, 0); +sljit_emit_fast_return(compiler, SLJIT_MEM1(STACK_TOP), 0); + +common->leavelabel = save_leavelabel; +common->leave = save_leave; +} + +#undef COMPILE_BACKTRACKPATH +#undef CURRENT_AS + +void +PRIV(jit_compile)(const REAL_PCRE *re, PUBL(extra) *extra, int mode) +{ +struct sljit_compiler *compiler; +backtrack_common rootbacktrack; +compiler_common common_data; +compiler_common *common = &common_data; +const pcre_uint8 *tables = re->tables; +pcre_study_data *study; +int localsize; +pcre_uchar *ccend; +executable_functions *functions; +void *executable_func; +sljit_uw executable_size; +struct sljit_label *mainloop = NULL; +struct sljit_label *empty_match_found; +struct sljit_label *empty_match_backtrack; +struct sljit_jump *jump; +struct sljit_jump *reqbyte_notfound = NULL; +struct sljit_jump *empty_match; + +SLJIT_ASSERT((extra->flags & PCRE_EXTRA_STUDY_DATA) != 0); +study = extra->study_data; + +if (!tables) + tables = PRIV(default_tables); + +memset(&rootbacktrack, 0, sizeof(backtrack_common)); +memset(common, 0, sizeof(compiler_common)); +rootbacktrack.cc = (pcre_uchar *)re + re->name_table_offset + re->name_count * re->name_entry_size; + +common->start = rootbacktrack.cc; +common->fcc = tables + fcc_offset; +common->lcc = (sljit_w)(tables + lcc_offset); +common->mode = mode; +common->nltype = NLTYPE_FIXED; +switch(re->options & PCRE_NEWLINE_BITS) + { + case 0: + /* Compile-time default */ + switch (NEWLINE) + { + case -1: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break; + case -2: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break; + default: common->newline = NEWLINE; break; + } + break; + case PCRE_NEWLINE_CR: common->newline = CHAR_CR; break; + case PCRE_NEWLINE_LF: common->newline = CHAR_NL; break; + case PCRE_NEWLINE_CR+ + PCRE_NEWLINE_LF: common->newline = (CHAR_CR << 8) | CHAR_NL; break; + case PCRE_NEWLINE_ANY: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANY; break; + case PCRE_NEWLINE_ANYCRLF: common->newline = (CHAR_CR << 8) | CHAR_NL; common->nltype = NLTYPE_ANYCRLF; break; + default: return; + } +if ((re->options & PCRE_BSR_ANYCRLF) != 0) + common->bsr_nltype = NLTYPE_ANYCRLF; +else if ((re->options & PCRE_BSR_UNICODE) != 0) + common->bsr_nltype = NLTYPE_ANY; +else + { +#ifdef BSR_ANYCRLF + common->bsr_nltype = NLTYPE_ANYCRLF; +#else + common->bsr_nltype = NLTYPE_ANY; +#endif + } +common->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; +common->ctypes = (sljit_w)(tables + ctypes_offset); +common->name_table = (sljit_w)((pcre_uchar *)re + re->name_table_offset); +common->name_count = re->name_count; +common->name_entry_size = re->name_entry_size; +common->jscript_compat = (re->options & PCRE_JAVASCRIPT_COMPAT) != 0; +#ifdef SUPPORT_UTF +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +common->utf = (re->options & PCRE_UTF8) != 0; +#ifdef SUPPORT_UCP +common->use_ucp = (re->options & PCRE_UCP) != 0; +#endif +#endif /* SUPPORT_UTF */ +ccend = bracketend(rootbacktrack.cc); + +/* Calculate the local space size on the stack. */ +common->ovector_start = CALL_LIMIT + sizeof(sljit_w); + +SLJIT_ASSERT(*rootbacktrack.cc == OP_BRA && ccend[-(1 + LINK_SIZE)] == OP_KET); +localsize = get_localspace(common, rootbacktrack.cc, ccend); +if (localsize < 0) + return; + +/* Checking flags and updating ovector_start. */ +if (mode == JIT_COMPILE && (re->flags & PCRE_REQCHSET) != 0 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + common->req_char_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + } +if (mode != JIT_COMPILE) + { + common->start_used_ptr = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + common->hit_start = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + } + } +if ((re->options & PCRE_FIRSTLINE) != 0) + { + common->first_line_end = common->ovector_start; + common->ovector_start += sizeof(sljit_w); + } + +/* Aligning ovector to even number of sljit words. */ +if ((common->ovector_start & sizeof(sljit_w)) != 0) + common->ovector_start += sizeof(sljit_w); + +SLJIT_ASSERT(!(common->req_char_ptr != 0 && common->start_used_ptr != 0)); +common->cbraptr = OVECTOR_START + (re->top_bracket + 1) * 2 * sizeof(sljit_w); +localsize += common->cbraptr + (re->top_bracket + 1) * sizeof(sljit_w); +if (localsize > SLJIT_MAX_LOCAL_SIZE) + return; +common->localptrs = (int *)SLJIT_MALLOC((ccend - rootbacktrack.cc) * sizeof(int)); +if (!common->localptrs) + return; +memset(common->localptrs, 0, (ccend - rootbacktrack.cc) * sizeof(int)); +set_localptrs(common, common->cbraptr + (re->top_bracket + 1) * sizeof(sljit_w), ccend); + +compiler = sljit_create_compiler(); +if (!compiler) + { + SLJIT_FREE(common->localptrs); + return; + } +common->compiler = compiler; + +/* Main pcre_jit_exec entry. */ +sljit_emit_enter(compiler, 1, 5, 5, localsize); + +/* Register init. */ +reset_ovector(common, (re->top_bracket + 1) * 2); +if (common->req_char_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->req_char_ptr, SLJIT_TEMPORARY_REG1, 0); + +OP1(SLJIT_MOV, ARGUMENTS, 0, SLJIT_SAVED_REG1, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_SAVED_REG1, 0); +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end)); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV_SI, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, calllimit)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, base)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, limit)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), CALL_LIMIT, TMP1, 0); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, 0); + +/* Main part of the matching */ +if ((re->options & PCRE_ANCHORED) == 0) + { + mainloop = mainloop_entry(common, (re->flags & PCRE_HASCRORLF) != 0, (re->options & PCRE_FIRSTLINE) != 0); + /* Forward search if possible. */ + if ((re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + if ((re->flags & PCRE_FIRSTSET) != 0) + fast_forward_first_char(common, (pcre_uchar)re->first_char, (re->flags & PCRE_FCH_CASELESS) != 0, (re->options & PCRE_FIRSTLINE) != 0); + else if ((re->flags & PCRE_STARTLINE) != 0) + fast_forward_newline(common, (re->options & PCRE_FIRSTLINE) != 0); + else if ((re->flags & PCRE_STARTLINE) == 0 && study != NULL && (study->flags & PCRE_STUDY_MAPPED) != 0) + fast_forward_start_bits(common, (sljit_uw)study->start_bits, (re->options & PCRE_FIRSTLINE) != 0); + } + } +if (common->req_char_ptr != 0) + reqbyte_notfound = search_requested_char(common, (pcre_uchar)re->req_char, (re->flags & PCRE_RCH_CASELESS) != 0, (re->flags & PCRE_FIRSTSET) != 0); + +/* Store the current STR_PTR in OVECTOR(0). */ +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0), STR_PTR, 0); +/* Copy the limit of allowed recursions. */ +OP1(SLJIT_MOV, CALL_COUNT, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), CALL_LIMIT); +if (common->mark_ptr != 0) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->mark_ptr, SLJIT_IMM, 0); +/* Copy the beginning of the string. */ +if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + jump = CMP(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, 0); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + JUMPHERE(jump); + } +else if (mode == JIT_PARTIAL_HARD_COMPILE) + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, STR_PTR, 0); + +compile_trypath(common, rootbacktrack.cc, ccend, &rootbacktrack); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->localptrs); + return; + } + +empty_match = CMP(SLJIT_C_EQUAL, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); +empty_match_found = LABEL(); + +common->acceptlabel = LABEL(); +if (common->accept != NULL) + set_jumps(common->accept, common->acceptlabel); + +/* This means we have a match. Update the ovector. */ +copy_ovector(common, re->top_bracket + 1); +common->leavelabel = LABEL(); +if (common->leave != NULL) + set_jumps(common->leave, common->leavelabel); +sljit_emit_return(compiler, SLJIT_MOV, SLJIT_RETURN_REG, 0); + +if (mode != JIT_COMPILE) + { + common->partialmatchlabel = LABEL(); + set_jumps(common->partialmatch, common->partialmatchlabel); + return_with_partial_match(common, common->leavelabel); + } + +empty_match_backtrack = LABEL(); +compile_backtrackpath(common, rootbacktrack.top); +if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->localptrs); + return; + } + +SLJIT_ASSERT(rootbacktrack.prev == NULL); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + { + /* Update hit_start only in the first time. */ + jump = CMP(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, -1); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->start_used_ptr, SLJIT_IMM, -1); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, TMP1, 0); + JUMPHERE(jump); + } + +/* Check we have remaining characters. */ +OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), OVECTOR(0)); + +if ((re->options & PCRE_ANCHORED) == 0) + { + if ((re->options & PCRE_FIRSTLINE) == 0) + { + if (mode == JIT_COMPILE && study != NULL && study->minlength > 1 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(study->minlength + 1)); + CMPTO(SLJIT_C_LESS_EQUAL, TMP1, 0, STR_END, 0, mainloop); + } + else + CMPTO(SLJIT_C_LESS, STR_PTR, 0, STR_END, 0, mainloop); + } + else + { + SLJIT_ASSERT(common->first_line_end != 0); + if (mode == JIT_COMPILE && study != NULL && study->minlength > 1 && (re->options & PCRE_NO_START_OPTIMIZE) == 0) + { + OP2(SLJIT_ADD, TMP1, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(study->minlength + 1)); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, TMP1, 0, STR_END, 0); + COND_VALUE(SLJIT_MOV, TMP2, 0, SLJIT_C_GREATER); + OP2(SLJIT_SUB | SLJIT_SET_U, SLJIT_UNUSED, 0, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end); + COND_VALUE(SLJIT_OR | SLJIT_SET_E, TMP2, 0, SLJIT_C_GREATER_EQUAL); + JUMPTO(SLJIT_C_ZERO, mainloop); + } + else + CMPTO(SLJIT_C_LESS, STR_PTR, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), common->first_line_end, mainloop); + } + } + +/* No more remaining characters. */ +if (reqbyte_notfound != NULL) + JUMPHERE(reqbyte_notfound); + +if (mode == JIT_PARTIAL_SOFT_COMPILE) + CMPTO(SLJIT_C_NOT_EQUAL, SLJIT_MEM1(SLJIT_LOCALS_REG), common->hit_start, SLJIT_IMM, 0, common->partialmatchlabel); + +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_NOMATCH); +JUMPTO(SLJIT_JUMP, common->leavelabel); + +flush_stubs(common); + +JUMPHERE(empty_match); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty)); +CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_backtrack); +OP1(SLJIT_MOV_UB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, notempty_atstart)); +CMPTO(SLJIT_C_EQUAL, TMP2, 0, SLJIT_IMM, 0, empty_match_found); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)); +CMPTO(SLJIT_C_NOT_EQUAL, TMP2, 0, STR_PTR, 0, empty_match_found); +JUMPTO(SLJIT_JUMP, empty_match_backtrack); + +common->currententry = common->entries; +while (common->currententry != NULL) + { + /* Might add new entries. */ + compile_recurse(common); + if (SLJIT_UNLIKELY(sljit_get_compiler_error(compiler))) + { + sljit_free_compiler(compiler); + SLJIT_FREE(common->localptrs); + return; + } + flush_stubs(common); + common->currententry = common->currententry->next; + } + +/* Allocating stack, returns with PCRE_ERROR_JIT_STACKLIMIT if fails. */ +/* This is a (really) rare case. */ +set_jumps(common->stackalloc, LABEL()); +/* RETURN_ADDR is not a saved register. */ +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1, TMP2, 0); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top), STACK_TOP, 0); +OP2(SLJIT_ADD, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, STACK_GROWTH_RATE); + +sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize)); +jump = CMP(SLJIT_C_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit)); +OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS1); +sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_LOCALS_REG), LOCALS0); + +/* Allocation failed. */ +JUMPHERE(jump); +/* We break the return address cache here, but this is a really rare case. */ +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_JIT_STACKLIMIT); +JUMPTO(SLJIT_JUMP, common->leavelabel); + +/* Call limit reached. */ +set_jumps(common->calllimit, LABEL()); +OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_IMM, PCRE_ERROR_MATCHLIMIT); +JUMPTO(SLJIT_JUMP, common->leavelabel); + +if (common->revertframes != NULL) + { + set_jumps(common->revertframes, LABEL()); + do_revertframes(common); + } +if (common->wordboundary != NULL) + { + set_jumps(common->wordboundary, LABEL()); + check_wordboundary(common); + } +if (common->anynewline != NULL) + { + set_jumps(common->anynewline, LABEL()); + check_anynewline(common); + } +if (common->hspace != NULL) + { + set_jumps(common->hspace, LABEL()); + check_hspace(common); + } +if (common->vspace != NULL) + { + set_jumps(common->vspace, LABEL()); + check_vspace(common); + } +if (common->casefulcmp != NULL) + { + set_jumps(common->casefulcmp, LABEL()); + do_casefulcmp(common); + } +if (common->caselesscmp != NULL) + { + set_jumps(common->caselesscmp, LABEL()); + do_caselesscmp(common); + } +#ifdef SUPPORT_UTF +if (common->utfreadchar != NULL) + { + set_jumps(common->utfreadchar, LABEL()); + do_utfreadchar(common); + } +#ifdef COMPILE_PCRE8 +if (common->utfreadtype8 != NULL) + { + set_jumps(common->utfreadtype8, LABEL()); + do_utfreadtype8(common); + } +#endif +#endif /* COMPILE_PCRE8 */ +#ifdef SUPPORT_UCP +if (common->getunichartype != NULL) + { + set_jumps(common->getunichartype, LABEL()); + do_getunichartype(common); + } +if (common->getunichartype_2 != NULL) + { + set_jumps(common->getunichartype_2, LABEL()); + do_getunichartype_2(common); + } +if (common->getunicharscript != NULL) + { + set_jumps(common->getunicharscript, LABEL()); + do_getunicharscript(common); + } +#endif + +SLJIT_FREE(common->localptrs); +executable_func = sljit_generate_code(compiler); +executable_size = sljit_get_generated_code_size(compiler); +sljit_free_compiler(compiler); +if (executable_func == NULL) + return; + +/* Reuse the function descriptor if possible. */ +if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && extra->executable_jit != NULL) + functions = (executable_functions *)extra->executable_jit; +else + { + functions = SLJIT_MALLOC(sizeof(executable_functions)); + if (functions == NULL) + { + /* This case is highly unlikely since we just recently + freed a lot of memory. Although not impossible. */ + sljit_free_code(executable_func); + return; + } + memset(functions, 0, sizeof(executable_functions)); + extra->executable_jit = functions; + extra->flags |= PCRE_EXTRA_EXECUTABLE_JIT; + } + +functions->executable_funcs[mode] = executable_func; +functions->executable_sizes[mode] = executable_size; +} + +static int jit_machine_stack_exec(jit_arguments *arguments, void* executable_func) +{ +union { + void* executable_func; + jit_function call_executable_func; +} convert_executable_func; +pcre_uint8 local_area[LOCAL_SPACE_SIZE]; +struct sljit_stack local_stack; + +local_stack.top = (sljit_w)&local_area; +local_stack.base = local_stack.top; +local_stack.limit = local_stack.base + LOCAL_SPACE_SIZE; +local_stack.max_limit = local_stack.limit; +arguments->stack = &local_stack; +convert_executable_func.executable_func = executable_func; +return convert_executable_func.call_executable_func(arguments); +} + +int +PRIV(jit_exec)(const REAL_PCRE *re, const PUBL(extra) *extra_data, const pcre_uchar *subject, + int length, int start_offset, int options, int *offsets, int offsetcount) +{ +executable_functions *functions = (executable_functions *)extra_data->executable_jit; +union { + void* executable_func; + jit_function call_executable_func; +} convert_executable_func; +jit_arguments arguments; +int maxoffsetcount; +int retval; +int mode = JIT_COMPILE; + +if ((options & PCRE_PARTIAL_HARD) != 0) + mode = JIT_PARTIAL_HARD_COMPILE; +else if ((options & PCRE_PARTIAL_SOFT) != 0) + mode = JIT_PARTIAL_SOFT_COMPILE; + +if (functions->executable_funcs[mode] == NULL) + return PCRE_ERROR_NULL; + +/* Sanity checks should be handled by pcre_exec. */ +arguments.stack = NULL; +arguments.str = subject + start_offset; +arguments.begin = subject; +arguments.end = subject + length; +arguments.mark_ptr = NULL; +/* JIT decreases this value less frequently than the interpreter. */ +arguments.calllimit = ((extra_data->flags & PCRE_EXTRA_MATCH_LIMIT) == 0) ? MATCH_LIMIT : extra_data->match_limit; +arguments.notbol = (options & PCRE_NOTBOL) != 0; +arguments.noteol = (options & PCRE_NOTEOL) != 0; +arguments.notempty = (options & PCRE_NOTEMPTY) != 0; +arguments.notempty_atstart = (options & PCRE_NOTEMPTY_ATSTART) != 0; +arguments.offsets = offsets; + +/* pcre_exec() rounds offsetcount to a multiple of 3, and then uses only 2/3 of +the output vector for storing captured strings, with the remainder used as +workspace. We don't need the workspace here. For compatibility, we limit the +number of captured strings in the same way as pcre_exec(), so that the user +gets the same result with and without JIT. */ + +if (offsetcount != 2) + offsetcount = ((offsetcount - (offsetcount % 3)) * 2) / 3; +maxoffsetcount = (re->top_bracket + 1) * 2; +if (offsetcount > maxoffsetcount) + offsetcount = maxoffsetcount; +arguments.offsetcount = offsetcount; + +if (functions->callback) + arguments.stack = (struct sljit_stack *)functions->callback(functions->userdata); +else + arguments.stack = (struct sljit_stack *)functions->userdata; + +if (arguments.stack == NULL) + retval = jit_machine_stack_exec(&arguments, functions->executable_funcs[mode]); +else + { + convert_executable_func.executable_func = functions->executable_funcs[mode]; + retval = convert_executable_func.call_executable_func(&arguments); + } + +if (retval * 2 > offsetcount) + retval = 0; +if ((extra_data->flags & PCRE_EXTRA_MARK) != 0) + *(extra_data->mark) = arguments.mark_ptr; + +return retval; +} + +void +PRIV(jit_free)(void *executable_funcs) +{ +int i; +executable_functions *functions = (executable_functions *)executable_funcs; +for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) + { + if (functions->executable_funcs[i] != NULL) + sljit_free_code(functions->executable_funcs[i]); + } +SLJIT_FREE(functions); +} + +int +PRIV(jit_get_size)(void *executable_funcs) +{ +int i; +sljit_uw size = 0; +sljit_uw *executable_sizes = ((executable_functions *)executable_funcs)->executable_sizes; +for (i = 0; i < JIT_NUMBER_OF_COMPILE_MODES; i++) + size += executable_sizes[i]; +return (int)size; +} + +const char* +PRIV(jit_get_target)(void) +{ +return sljit_get_platform_name(); +} + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL pcre_jit_stack * +pcre_jit_stack_alloc(int startsize, int maxsize) +#else +PCRE_EXP_DECL pcre16_jit_stack * +pcre16_jit_stack_alloc(int startsize, int maxsize) +#endif +{ +if (startsize < 1 || maxsize < 1) + return NULL; +if (startsize > maxsize) + startsize = maxsize; +startsize = (startsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); +maxsize = (maxsize + STACK_GROWTH_RATE - 1) & ~(STACK_GROWTH_RATE - 1); +return (PUBL(jit_stack)*)sljit_allocate_stack(startsize, maxsize); +} + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_stack_free(pcre_jit_stack *stack) +#else +PCRE_EXP_DECL void +pcre16_jit_stack_free(pcre16_jit_stack *stack) +#endif +{ +sljit_free_stack((struct sljit_stack *)stack); +} + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata) +#else +PCRE_EXP_DECL void +pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata) +#endif +{ +executable_functions *functions; +if (extra != NULL && + (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra->executable_jit != NULL) + { + functions = (executable_functions *)extra->executable_jit; + functions->callback = callback; + functions->userdata = userdata; + } +} + +#else /* SUPPORT_JIT */ + +/* These are dummy functions to avoid linking errors when JIT support is not +being compiled. */ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL pcre_jit_stack * +pcre_jit_stack_alloc(int startsize, int maxsize) +#else +PCRE_EXP_DECL pcre16_jit_stack * +pcre16_jit_stack_alloc(int startsize, int maxsize) +#endif +{ +(void)startsize; +(void)maxsize; +return NULL; +} + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_jit_stack_free(pcre_jit_stack *stack) +#else +PCRE_EXP_DECL void +pcre16_jit_stack_free(pcre16_jit_stack *stack) +#endif +{ +(void)stack; +} + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DECL void +pcre_assign_jit_stack(pcre_extra *extra, pcre_jit_callback callback, void *userdata) +#else +PCRE_EXP_DECL void +pcre16_assign_jit_stack(pcre16_extra *extra, pcre16_jit_callback callback, void *userdata) +#endif +{ +(void)extra; +(void)callback; +(void)userdata; +} + +#endif + +/* End of pcre_jit_compile.c */ diff --git a/glib/pcre/pcre_newline.c b/glib/pcre/pcre_newline.c new file mode 100644 index 0000000..a0a13c8 --- /dev/null +++ b/glib/pcre/pcre_newline.c @@ -0,0 +1,184 @@ +/************************************************* +* 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-2012 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 + utf TRUE if in utf mode + +Returns: TRUE or FALSE +*/ + +BOOL +PRIV(is_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR endptr, int *lenptr, + BOOL utf) +{ +int c; +(void)utf; +#ifdef SUPPORT_UTF +if (utf) + { + GETCHAR(c, ptr); + } +else +#endif /* SUPPORT_UTF */ + 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 */ +#ifdef COMPILE_PCRE8 + case 0x0085: *lenptr = utf? 2 : 1; return TRUE; /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ +#else + case 0x0085: /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 1; return TRUE; /* PS */ +#endif /* COMPILE_PCRE8 */ + 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 + utf TRUE if in utf mode + +Returns: TRUE or FALSE +*/ + +BOOL +PRIV(was_newline)(PCRE_PUCHAR ptr, int type, PCRE_PUCHAR startptr, int *lenptr, + BOOL utf) +{ +int c; +(void)utf; +ptr--; +#ifdef SUPPORT_UTF +if (utf) + { + BACKCHAR(ptr); + GETCHAR(c, ptr); + } +else +#endif /* SUPPORT_UTF */ + c = *ptr; + +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 */ +#ifdef COMPILE_PCRE8 + case 0x0085: *lenptr = utf? 2 : 1; return TRUE; /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 3; return TRUE; /* PS */ +#else + case 0x0085: /* NEL */ + case 0x2028: /* LS */ + case 0x2029: *lenptr = 1; return TRUE; /* PS */ +#endif /* COMPILE_PCRE8 */ + 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..50fca95 --- /dev/null +++ b/glib/pcre/pcre_ord2utf8.c @@ -0,0 +1,97 @@ +/************************************************* +* 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-2012 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 - 0x10ffff +and encodes it as a UTF-8 character in 1 to 6 pcre_uchars. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 6 pcre_uchars long + +Returns: number of characters placed in the buffer +*/ + +int +PRIV(ord2utf)(pcre_uint32 cvalue, pcre_uchar *buffer) +{ +#ifdef SUPPORT_UTF + +register int i, j; + +/* Checking invalid cvalue character, encoded as invalid UTF-16 character. +Should never happen in practice. */ +if ((cvalue & 0xf800) == 0xd800 || cvalue >= 0x110000) + cvalue = 0xfffe; + +for (i = 0; i < PRIV(utf8_table1_size); i++) + if ((int)cvalue <= PRIV(utf8_table1)[i]) break; +buffer += i; +for (j = i; j > 0; j--) + { + *buffer-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*buffer = PRIV(utf8_table2)[i] | cvalue; +return i + 1; + +#else + +(void)(cvalue); /* Keep compiler happy; this function won't ever be */ +(void)(buffer); /* called when SUPPORT_UTF is not defined. */ +return 0; + +#endif +} + +/* End of pcre_ord2utf8.c */ diff --git a/glib/pcre/pcre_string_utils.c b/glib/pcre/pcre_string_utils.c new file mode 100644 index 0000000..54a75f6 --- /dev/null +++ b/glib/pcre/pcre_string_utils.c @@ -0,0 +1,168 @@ +/************************************************* +* 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-2012 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. It is used by both pcre_exec() and pcre_def_exec(). */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + +#ifndef COMPILE_PCRE8 + +/************************************************* +* Compare string utilities * +*************************************************/ + +/* The following two functions compares two strings. Basically an strcmp +for non 8 bit characters. + +Arguments: + str1 first string + str2 second string + +Returns: 0 if both string are equal (like strcmp), 1 otherwise +*/ + +int +PRIV(strcmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2) +{ +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *str2 != '\0') + { + c1 = *str1++; + c2 = *str2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +int +PRIV(strcmp_uc_c8)(const pcre_uchar *str1, const char *str2) +{ +const pcre_uint8 *ustr2 = (pcre_uint8 *)str2; +pcre_uchar c1; +pcre_uchar c2; + +while (*str1 != '\0' || *ustr2 != '\0') + { + c1 = *str1++; + c2 = (pcre_uchar)*ustr2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +/* The following two functions compares two, fixed length +strings. Basically an strncmp for non 8 bit characters. + +Arguments: + str1 first string + str2 second string + num size of the string + +Returns: 0 if both string are equal (like strcmp), 1 otherwise +*/ + +int +PRIV(strncmp_uc_uc)(const pcre_uchar *str1, const pcre_uchar *str2, unsigned int num) +{ +pcre_uchar c1; +pcre_uchar c2; + +while (num-- > 0) + { + c1 = *str1++; + c2 = *str2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +int +PRIV(strncmp_uc_c8)(const pcre_uchar *str1, const char *str2, unsigned int num) +{ +const pcre_uint8 *ustr2 = (pcre_uint8 *)str2; +pcre_uchar c1; +pcre_uchar c2; + +while (num-- > 0) + { + c1 = *str1++; + c2 = (pcre_uchar)*ustr2++; + if (c1 != c2) + return ((c1 > c2) << 1) - 1; + } +/* Both length and characters must be equal. */ +return 0; +} + +/* The following function returns with the length of +a zero terminated string. Basically an strlen for non 8 bit characters. + +Arguments: + str string + +Returns: length of the string +*/ + +unsigned int +PRIV(strlen_uc)(const pcre_uchar *str) +{ +unsigned int len = 0; +while (*str++ != 0) + len++; +return len; +} + +#endif /* COMPILE_PCRE8 */ + +/* End of pcre_string_utils.c */ diff --git a/glib/pcre/pcre_study.c b/glib/pcre/pcre_study.c new file mode 100644 index 0000000..85cb514 --- /dev/null +++ b/glib/pcre/pcre_study.c @@ -0,0 +1,1534 @@ +/************************************************* +* 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-2012 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" + +#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7)) + +/* Returns from set_start_bits() */ + +enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE, SSB_UNKNOWN }; + + + +/************************************************* +* Find the minimum subject length for a group * +*************************************************/ + +/* Scan a parenthesized group and compute the minimum length of subject that +is needed to match it. This is a lower bound; it does not mean there is a +string of that length that matches. In UTF8 mode, the result is in characters +rather than bytes. + +Arguments: + code pointer to start of group (the bracket) + startcode pointer to start of the whole pattern + options the compiling options + int RECURSE depth + +Returns: the minimum length + -1 if \C in UTF-8 mode or (*ACCEPT) was encountered + -2 internal error (missing capturing bracket) + -3 internal error (opcode not listed) +*/ + +static int +find_minlength(const pcre_uchar *code, const pcre_uchar *startcode, int options, + int recurse_depth) +{ +int length = -1; +/* PCRE_UTF16 has the same value as PCRE_UTF8. */ +BOOL utf = (options & PCRE_UTF8) != 0; +BOOL had_recurse = FALSE; +register int branchlength = 0; +register pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE; + +if (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS) cc += IMM2_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, min; + pcre_uchar *cs, *ce; + register int op = *cc; + + switch (op) + { + case OP_COND: + case OP_SCOND: + + /* If there is only one branch in a condition, the implied branch has zero + length, so we don't add anything. This covers the DEFINE "condition" + automatically. */ + + cs = cc + GET(cc, 1); + if (*cs != OP_ALT) + { + cc = cs + 1 + LINK_SIZE; + break; + } + + /* Otherwise we can fall through and treat it the same as any other + subpattern. */ + + case OP_CBRA: + case OP_SCBRA: + case OP_BRA: + case OP_SBRA: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_BRAPOS: + case OP_SBRAPOS: + case OP_ONCE: + case OP_ONCE_NC: + d = find_minlength(cc, startcode, options, recurse_depth); + if (d < 0) return d; + branchlength += d; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* ACCEPT makes things far too complicated; we have to give up. */ + + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + return -1; + + /* 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. If an + ACCEPT was previously encountered, use the length that was in force at that + time, and pass back the shortest ACCEPT length. */ + + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_KETRPOS: + case OP_END: + if (length < 0 || (!had_recurse && branchlength < length)) + length = branchlength; + if (op != OP_ALT) return length; + cc += 1 + LINK_SIZE; + branchlength = 0; + had_recurse = FALSE; + 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_NCREF: + case OP_RREF: + case OP_NRREF: + case OP_DEF: + case OP_CALLOUT: + case OP_SOD: + case OP_SOM: + case OP_EOD: + case OP_EODN: + case OP_CIRC: + case OP_CIRCM: + case OP_DOLL: + case OP_DOLLM: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + cc += PRIV(OP_lengths)[*cc]; + break; + + /* Skip over a subpattern that has a {0} or {0,x} quantifier */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + case OP_SKIPZERO: + cc += PRIV(OP_lengths)[*cc]; + do cc += GET(cc, 1); while (*cc == OP_ALT); + cc += 1 + LINK_SIZE; + break; + + /* Handle literal characters and + repetitions */ + + case OP_CHAR: + case OP_CHARI: + case OP_NOT: + case OP_NOTI: + case OP_PLUS: + case OP_PLUSI: + case OP_MINPLUS: + case OP_MINPLUSI: + case OP_POSPLUS: + case OP_POSPLUSI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + branchlength++; + cc += 2; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEPOSPLUS: + branchlength++; + cc += (cc[1] == OP_PROP || cc[1] == OP_NOTPROP)? 4 : 2; + 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: + case OP_EXACTI: + case OP_NOTEXACT: + case OP_NOTEXACTI: + branchlength += GET2(cc,1); + cc += 2 + IMM2_SIZE; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + case OP_TYPEEXACT: + branchlength += GET2(cc,1); + cc += 2 + IMM2_SIZE + ((cc[1 + IMM2_SIZE] == OP_PROP + || cc[1 + IMM2_SIZE] == OP_NOTPROP)? 2 : 0); + break; + + /* Handle single-char non-literal 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: + case OP_EXTUNI: + case OP_HSPACE: + case OP_NOT_HSPACE: + case OP_VSPACE: + case OP_NOT_VSPACE: + branchlength++; + cc++; + break; + + /* "Any newline" might match two characters, but it also might match just + one. */ + + case OP_ANYNL: + branchlength += 1; + cc++; + break; + + /* The single-byte matcher means we can't proceed in UTF-8 mode. (In + non-UTF-8 mode \C will actually be turned into OP_ALLANY, so won't ever + appear, but leave the code, just in case.) */ + + case OP_ANYBYTE: +#ifdef SUPPORT_UTF + if (utf) return -1; +#endif + branchlength++; + cc++; + break; + + /* For repeated character types, we have to test for \p and \P, which have + an extra two bytes of parameters. */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSSTAR: + case OP_TYPEPOSQUERY: + if (cc[1] == OP_PROP || cc[1] == OP_NOTPROP) cc += 2; + cc += PRIV(OP_lengths)[op]; + break; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + case OP_TYPEPOSUPTO: + if (cc[1 + IMM2_SIZE] == OP_PROP + || cc[1 + IMM2_SIZE] == OP_NOTPROP) cc += 2; + cc += PRIV(OP_lengths)[op]; + break; + + /* Check a class for variable quantification */ + +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: + cc += GET(cc, 1) - PRIV(OP_lengths)[OP_CLASS]; + /* Fall through */ +#endif + + case OP_CLASS: + case OP_NCLASS: + cc += PRIV(OP_lengths)[OP_CLASS]; + + switch (*cc) + { + case OP_CRPLUS: + case OP_CRMINPLUS: + branchlength++; + /* Fall through */ + + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + branchlength += GET2(cc,1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + branchlength++; + break; + } + break; + + /* Backreferences and subroutine calls are treated in the same way: we find + the minimum length for the subpattern. A recursion, however, causes an + a flag to be set that causes the length of this branch to be ignored. The + logic is that a recursion can only make sense if there is another + alternation that stops the recursing. That will provide the minimum length + (when no recursion happens). A backreference within the group that it is + referencing behaves in the same way. + + If PCRE_JAVASCRIPT_COMPAT is set, a backreference to an unset bracket + matches an empty string (by default it causes a matching failure), so in + that case we must set the minimum length to zero. */ + + case OP_REF: + case OP_REFI: + if ((options & PCRE_JAVASCRIPT_COMPAT) == 0) + { + ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1)); + if (cs == NULL) return -2; + do ce += GET(ce, 1); while (*ce == OP_ALT); + if (cc > cs && cc < ce) + { + d = 0; + had_recurse = TRUE; + } + else + { + d = find_minlength(cs, startcode, options, recurse_depth); + } + } + else d = 0; + cc += 1 + IMM2_SIZE; + + /* Handle repeated back references */ + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + min = 0; + cc++; + break; + + case OP_CRPLUS: + case OP_CRMINPLUS: + min = 1; + cc++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + min = GET2(cc, 1); + cc += 1 + 2 * IMM2_SIZE; + break; + + default: + min = 1; + break; + } + + branchlength += min * d; + break; + + /* We can easily detect direct recursion, but not mutual recursion. This is + caught by a recursion depth count. */ + + case OP_RECURSE: + cs = ce = (pcre_uchar *)startcode + GET(cc, 1); + do ce += GET(ce, 1); while (*ce == OP_ALT); + if ((cc > cs && cc < ce) || recurse_depth > 10) + had_recurse = TRUE; + else + { + branchlength += find_minlength(cs, startcode, options, recurse_depth + 1); + } + cc += 1 + LINK_SIZE; + break; + + /* Anything else does not or need not match a character. We can get the + item's length from the table, but for those that can match zero occurrences + of a character, we must take special action for UTF-8 characters. As it + happens, the "NOT" versions of these opcodes are used at present only for + ASCII characters, so they could be omitted from this list. However, in + future that may change, so we include them here so as not to leave a + gotcha for a future maintainer. */ + + case OP_UPTO: + case OP_UPTOI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_MINUPTO: + case OP_MINUPTOI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_POSUPTO: + case OP_POSUPTOI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + + case OP_STAR: + case OP_STARI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_MINSTAR: + case OP_MINSTARI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_POSSTAR: + case OP_POSSTARI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + + case OP_QUERY: + case OP_QUERYI: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_MINQUERY: + case OP_MINQUERYI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_POSQUERY: + case OP_POSQUERYI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + + cc += PRIV(OP_lengths)[op]; +#ifdef SUPPORT_UTF + if (utf && HAS_EXTRALEN(cc[-1])) cc += GET_EXTRALEN(cc[-1]); +#endif + break; + + /* Skip these, but we need to add in the name length. */ + + case OP_MARK: + case OP_PRUNE_ARG: + case OP_SKIP_ARG: + case OP_THEN_ARG: + cc += PRIV(OP_lengths)[op] + cc[1]; + break; + + /* The remaining opcodes are just skipped over. */ + + case OP_CLOSE: + case OP_COMMIT: + case OP_FAIL: + case OP_PRUNE: + case OP_SET_SOM: + case OP_SKIP: + case OP_THEN: + cc += PRIV(OP_lengths)[op]; + break; + + /* This should not occur: we list all opcodes explicitly so that when + new ones get added they are properly considered. */ + + default: + return -3; + } + } +/* Control never gets here */ +} + + + +/************************************************* +* Set a bit and maybe its alternate case * +*************************************************/ + +/* Given a character, set its first byte's bit in the table, and also the +corresponding bit for the other version of a letter if we are caseless. In +UTF-8 mode, for characters greater than 127, we can only do the caseless thing +when Unicode property support is available. + +Arguments: + start_bits points to the bit map + p points to the character + caseless the caseless flag + cd the block with char table pointers + utf TRUE for UTF-8 / UTF-16 mode + +Returns: pointer after the character +*/ + +static const pcre_uchar * +set_table_bit(pcre_uint8 *start_bits, const pcre_uchar *p, BOOL caseless, + compile_data *cd, BOOL utf) +{ +unsigned int c = *p; + +#ifdef COMPILE_PCRE8 +SET_BIT(c); + +#ifdef SUPPORT_UTF +if (utf && c > 127) + { + GETCHARINC(c, p); +#ifdef SUPPORT_UCP + if (caseless) + { + pcre_uchar buff[6]; + c = UCD_OTHERCASE(c); + (void)PRIV(ord2utf)(c, buff); + SET_BIT(buff[0]); + } +#endif + return p; + } +#endif + +/* Not UTF-8 mode, or character is less than 127. */ + +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]); +return p + 1; +#endif + +#ifdef COMPILE_PCRE16 +if (c > 0xff) + { + c = 0xff; + caseless = FALSE; + } +SET_BIT(c); + +#ifdef SUPPORT_UTF +if (utf && c > 127) + { + GETCHARINC(c, p); +#ifdef SUPPORT_UCP + if (caseless) + { + c = UCD_OTHERCASE(c); + if (c > 0xff) + c = 0xff; + SET_BIT(c); + } +#endif + return p; + } +#endif + +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]); +return p + 1; +#endif +} + + + +/************************************************* +* Set bits for a positive character type * +*************************************************/ + +/* This function sets starting bits for a character type. In UTF-8 mode, we can +only do a direct setting for bytes less than 128, as otherwise there can be +confusion with bytes in the middle of UTF-8 characters. In a "traditional" +environment, the tables will only recognize ASCII characters anyway, but in at +least one Windows environment, some higher bytes bits were set in the tables. +So we deal with that case by considering the UTF-8 encoding. + +Arguments: + start_bits the starting bitmap + cbit type the type of character wanted + table_limit 32 for non-UTF-8; 16 for UTF-8 + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_type_bits(pcre_uint8 *start_bits, int cbit_type, int table_limit, + compile_data *cd) +{ +register int c; +for (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type]; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (table_limit == 32) return; +for (c = 128; c < 256; c++) + { + if ((cd->cbits[c/8] & (1 << (c&7))) != 0) + { + pcre_uchar buff[6]; + (void)PRIV(ord2utf)(c, buff); + SET_BIT(buff[0]); + } + } +#endif +} + + +/************************************************* +* Set bits for a negative character type * +*************************************************/ + +/* This function sets starting bits for a negative character type such as \D. +In UTF-8 mode, we can only do a direct setting for bytes less than 128, as +otherwise there can be confusion with bytes in the middle of UTF-8 characters. +Unlike in the positive case, where we can set appropriate starting bits for +specific high-valued UTF-8 characters, in this case we have to set the bits for +all high-valued characters. The lowest is 0xc2, but we overkill by starting at +0xc0 (192) for simplicity. + +Arguments: + start_bits the starting bitmap + cbit type the type of character wanted + table_limit 32 for non-UTF-8; 16 for UTF-8 + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_nottype_bits(pcre_uint8 *start_bits, int cbit_type, int table_limit, + compile_data *cd) +{ +register int c; +for (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type]; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +if (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff; +#endif +} + + + +/************************************************* +* 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 + utf TRUE if in UTF-8 / UTF-16 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 + SSB_UNKNOWN => Hit an unrecognized opcode +*/ + +static int +set_start_bits(const pcre_uchar *code, pcre_uint8 *start_bits, BOOL utf, + compile_data *cd) +{ +register int c; +int yield = SSB_DONE; +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 +int table_limit = utf? 16:32; +#else +int table_limit = 32; +#endif + +#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 + { + BOOL try_next = TRUE; + const pcre_uchar *tcode = code + 1 + LINK_SIZE; + + if (*code == OP_CBRA || *code == OP_SCBRA || + *code == OP_CBRAPOS || *code == OP_SCBRAPOS) tcode += IMM2_SIZE; + + while (try_next) /* Loop for items in this branch */ + { + int rc; + + switch(*tcode) + { + /* If we reach something we don't understand, it means a new opcode has + been created that hasn't been added to this code. Hopefully this problem + will be discovered during testing. */ + + default: + return SSB_UNKNOWN; + + /* Fail for a valid opcode that implies no starting bits. */ + + case OP_ACCEPT: + case OP_ASSERT_ACCEPT: + case OP_ALLANY: + case OP_ANY: + case OP_ANYBYTE: + case OP_CIRC: + case OP_CIRCM: + case OP_CLOSE: + case OP_COMMIT: + case OP_COND: + case OP_CREF: + case OP_DEF: + case OP_DOLL: + case OP_DOLLM: + case OP_END: + case OP_EOD: + case OP_EODN: + case OP_EXTUNI: + case OP_FAIL: + case OP_MARK: + case OP_NCREF: + case OP_NOT: + case OP_NOTEXACT: + case OP_NOTEXACTI: + case OP_NOTI: + case OP_NOTMINPLUS: + case OP_NOTMINPLUSI: + case OP_NOTMINQUERY: + case OP_NOTMINQUERYI: + case OP_NOTMINSTAR: + case OP_NOTMINSTARI: + case OP_NOTMINUPTO: + case OP_NOTMINUPTOI: + case OP_NOTPLUS: + case OP_NOTPLUSI: + case OP_NOTPOSPLUS: + case OP_NOTPOSPLUSI: + case OP_NOTPOSQUERY: + case OP_NOTPOSQUERYI: + case OP_NOTPOSSTAR: + case OP_NOTPOSSTARI: + case OP_NOTPOSUPTO: + case OP_NOTPOSUPTOI: + case OP_NOTPROP: + case OP_NOTQUERY: + case OP_NOTQUERYI: + case OP_NOTSTAR: + case OP_NOTSTARI: + case OP_NOTUPTO: + case OP_NOTUPTOI: + case OP_NOT_HSPACE: + case OP_NOT_VSPACE: + case OP_NRREF: + case OP_PROP: + case OP_PRUNE: + case OP_PRUNE_ARG: + case OP_RECURSE: + case OP_REF: + case OP_REFI: + case OP_REVERSE: + case OP_RREF: + case OP_SCOND: + case OP_SET_SOM: + case OP_SKIP: + case OP_SKIP_ARG: + case OP_SOD: + case OP_SOM: + case OP_THEN: + case OP_THEN_ARG: +#if defined SUPPORT_UTF || !defined COMPILE_PCRE8 + case OP_XCLASS: +#endif + return SSB_FAIL; + + /* We can ignore word boundary tests. */ + + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + tcode++; + break; + + /* 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_BRAPOS: + case OP_SBRAPOS: + case OP_CBRAPOS: + case OP_SCBRAPOS: + case OP_ONCE: + case OP_ONCE_NC: + case OP_ASSERT: + rc = set_start_bits(tcode, start_bits, utf, cd); + if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; + 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: + case OP_KETRPOS: + 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; + + /* BRAZERO does the bracket, but carries on. */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + case OP_BRAPOSZERO: + rc = set_start_bits(++tcode, start_bits, utf, cd); + if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc; +/* ========================================================================= + 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: + tcode = set_table_bit(start_bits, tcode + 1, FALSE, cd, utf); + break; + + case OP_STARI: + case OP_MINSTARI: + case OP_POSSTARI: + case OP_QUERYI: + case OP_MINQUERYI: + case OP_POSQUERYI: + tcode = set_table_bit(start_bits, tcode + 1, TRUE, cd, utf); + break; + + /* Single-char upto sets the bit and tries the next */ + + case OP_UPTO: + case OP_MINUPTO: + case OP_POSUPTO: + tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, FALSE, cd, utf); + break; + + case OP_UPTOI: + case OP_MINUPTOI: + case OP_POSUPTOI: + tcode = set_table_bit(start_bits, tcode + 1 + IMM2_SIZE, TRUE, cd, utf); + break; + + /* At least one single char sets the bit and stops */ + + case OP_EXACT: + tcode += IMM2_SIZE; + /* Fall through */ + case OP_CHAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_POSPLUS: + (void)set_table_bit(start_bits, tcode + 1, FALSE, cd, utf); + try_next = FALSE; + break; + + case OP_EXACTI: + tcode += IMM2_SIZE; + /* Fall through */ + case OP_CHARI: + case OP_PLUSI: + case OP_MINPLUSI: + case OP_POSPLUSI: + (void)set_table_bit(start_bits, tcode + 1, TRUE, cd, utf); + try_next = FALSE; + break; + + /* Special spacing and line-terminating items. These recognize specific + lists of characters. The difference between VSPACE and ANYNL is that the + latter can match the two-character CRLF sequence, but that is not + relevant for finding the first character, so their code here is + identical. */ + + case OP_HSPACE: + SET_BIT(0x09); + SET_BIT(0x20); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+00A0 */ + SET_BIT(0xE1); /* For U+1680, U+180E */ + SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */ + SET_BIT(0xE3); /* For U+3000 */ +#endif +#ifdef COMPILE_PCRE16 + SET_BIT(0xA0); + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + else +#endif /* SUPPORT_UTF */ + { + SET_BIT(0xA0); +#ifdef COMPILE_PCRE16 + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + try_next = FALSE; + break; + + case OP_ANYNL: + case OP_VSPACE: + SET_BIT(0x0A); + SET_BIT(0x0B); + SET_BIT(0x0C); + SET_BIT(0x0D); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+0085 */ + SET_BIT(0xE2); /* For U+2028, U+2029 */ +#endif +#ifdef COMPILE_PCRE16 + SET_BIT(0x85); + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + else +#endif /* SUPPORT_UTF */ + { + SET_BIT(0x85); +#ifdef COMPILE_PCRE16 + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + try_next = FALSE; + break; + + /* Single character types set the bits and stop. Note that if PCRE_UCP + is set, we do not see these op codes because \d etc are converted to + properties. Therefore, these apply in the case when only characters less + than 256 are recognized to match the types. */ + + case OP_NOT_DIGIT: + set_nottype_bits(start_bits, cbit_digit, table_limit, cd); + try_next = FALSE; + break; + + case OP_DIGIT: + set_type_bits(start_bits, cbit_digit, table_limit, cd); + try_next = FALSE; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + ensure it is set as not whitespace. */ + + case OP_NOT_WHITESPACE: + set_nottype_bits(start_bits, cbit_space, table_limit, cd); + start_bits[1] |= 0x08; + try_next = FALSE; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + not set it from the table. */ + + case OP_WHITESPACE: + c = start_bits[1]; /* Save in case it was already set */ + set_type_bits(start_bits, cbit_space, table_limit, cd); + start_bits[1] = (start_bits[1] & ~0x08) | c; + try_next = FALSE; + break; + + case OP_NOT_WORDCHAR: + set_nottype_bits(start_bits, cbit_word, table_limit, cd); + try_next = FALSE; + break; + + case OP_WORDCHAR: + set_type_bits(start_bits, cbit_word, table_limit, cd); + 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: + case OP_TYPEPOSPLUS: + tcode++; + break; + + case OP_TYPEEXACT: + tcode += 1 + IMM2_SIZE; + 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 += IMM2_SIZE; /* Fall through */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPOSSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + case OP_TYPEPOSQUERY: + switch(tcode[1]) + { + default: + case OP_ANY: + case OP_ALLANY: + return SSB_FAIL; + + case OP_HSPACE: + SET_BIT(0x09); + SET_BIT(0x20); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+00A0 */ + SET_BIT(0xE1); /* For U+1680, U+180E */ + SET_BIT(0xE2); /* For U+2000 - U+200A, U+202F, U+205F */ + SET_BIT(0xE3); /* For U+3000 */ +#endif +#ifdef COMPILE_PCRE16 + SET_BIT(0xA0); + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + else +#endif /* SUPPORT_UTF */ + SET_BIT(0xA0); + break; + + case OP_ANYNL: + case OP_VSPACE: + SET_BIT(0x0A); + SET_BIT(0x0B); + SET_BIT(0x0C); + SET_BIT(0x0D); +#ifdef SUPPORT_UTF + if (utf) + { +#ifdef COMPILE_PCRE8 + SET_BIT(0xC2); /* For U+0085 */ + SET_BIT(0xE2); /* For U+2028, U+2029 */ +#endif +#ifdef COMPILE_PCRE16 + SET_BIT(0x85); + SET_BIT(0xFF); /* For characters > 255 */ +#endif + } + else +#endif /* SUPPORT_UTF */ + SET_BIT(0x85); + break; + + case OP_NOT_DIGIT: + set_nottype_bits(start_bits, cbit_digit, table_limit, cd); + break; + + case OP_DIGIT: + set_type_bits(start_bits, cbit_digit, table_limit, cd); + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + ensure it gets set as not whitespace. */ + + case OP_NOT_WHITESPACE: + set_nottype_bits(start_bits, cbit_space, table_limit, cd); + start_bits[1] |= 0x08; + break; + + /* The cbit_space table has vertical tab as whitespace; we have to + avoid setting it. */ + + case OP_WHITESPACE: + c = start_bits[1]; /* Save in case it was already set */ + set_type_bits(start_bits, cbit_space, table_limit, cd); + start_bits[1] = (start_bits[1] & ~0x08) | c; + break; + + case OP_NOT_WORDCHAR: + set_nottype_bits(start_bits, cbit_word, table_limit, cd); + break; + + case OP_WORDCHAR: + set_type_bits(start_bits, cbit_word, table_limit, cd); + 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: +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (utf) + { + start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ + memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ + } +#endif +#ifdef COMPILE_PCRE16 + SET_BIT(0xFF); /* For characters > 255 */ +#endif + /* Fall through */ + + case OP_CLASS: + { + pcre_uint8 *map; + tcode++; + map = (pcre_uint8 *)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. */ + +#if defined SUPPORT_UTF && defined COMPILE_PCRE8 + if (utf) + { + for (c = 0; c < 16; c++) start_bits[c] |= map[c]; + for (c = 128; c < 256; c++) + { + if ((map[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. */ + } + } + } + else +#endif + { + /* In non-UTF-8 mode, the two bit maps are completely compatible. */ + for (c = 0; c < 32; c++) start_bits[c] |= map[c]; + } + + /* Advance past the bit map, and act on what follows. For a zero + minimum repeat, continue; otherwise stop processing. */ + + tcode += 32 / sizeof(pcre_uchar); + switch (*tcode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + tcode++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if (GET2(tcode, 1) == 0) tcode += 1 + 2 * IMM2_SIZE; + 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[16]_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[16]_extra block, with study_data filled in and + the appropriate flags set; + NULL on error or if no optimization possible +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN pcre_extra * PCRE_CALL_CONVENTION +pcre_study(const pcre *external_re, int options, const char **errorptr) +#else +PCRE_EXP_DEFN pcre16_extra * PCRE_CALL_CONVENTION +pcre16_study(const pcre16 *external_re, int options, const char **errorptr) +#endif +{ +int min; +BOOL bits_set = FALSE; +pcre_uint8 start_bits[32]; +PUBL(extra) *extra = NULL; +pcre_study_data *study; +const pcre_uint8 *tables; +pcre_uchar *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 ((re->flags & PCRE_MODE) == 0) + { +#ifdef COMPILE_PCRE8 + *errorptr = "argument is compiled in 16 bit mode"; +#else + *errorptr = "argument is compiled in 8 bit mode"; +#endif + return NULL; + } + +if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) + { + *errorptr = "unknown or incorrect option bit(s) set"; + return NULL; + } + +code = (pcre_uchar *)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", there is no point in +seeking a list of starting bytes. */ + +if ((re->options & PCRE_ANCHORED) == 0 && + (re->flags & (PCRE_FIRSTSET|PCRE_STARTLINE)) == 0) + { + int rc; + + /* Set the character tables in the block that is passed around */ + + tables = re->tables; + +#ifdef COMPILE_PCRE8 + if (tables == NULL) + (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); +#else + if (tables == NULL) + (void)pcre16_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, + (void *)(&tables)); +#endif + + 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(pcre_uint8)); + rc = set_start_bits(code, start_bits, (re->options & PCRE_UTF8) != 0, + &compile_block); + bits_set = rc == SSB_DONE; + if (rc == SSB_UNKNOWN) + { + *errorptr = "internal error: opcode not recognized"; + return NULL; + } + } + +/* Find the minimum length of subject string. */ + +switch(min = find_minlength(code, code, re->options, 0)) + { + case -2: *errorptr = "internal error: missing capturing bracket"; return NULL; + case -3: *errorptr = "internal error: opcode not recognized"; return NULL; + default: break; + } + +/* If a set of starting bytes has been identified, or if the minimum length is +greater than zero, or if JIT optimization has been requested, get a +pcre[16]_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. */ + +if (bits_set || min > 0 +#ifdef SUPPORT_JIT + || (options & (PCRE_STUDY_JIT_COMPILE | PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE + | PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE)) != 0 +#endif + ) + { + extra = (PUBL(extra) *)(PUBL(malloc)) + (sizeof(PUBL(extra)) + sizeof(pcre_study_data)); + if (extra == NULL) + { + *errorptr = "failed to get memory"; + return NULL; + } + + study = (pcre_study_data *)((char *)extra + sizeof(PUBL(extra))); + extra->flags = PCRE_EXTRA_STUDY_DATA; + extra->study_data = study; + + study->size = sizeof(pcre_study_data); + study->flags = 0; + + /* Set the start bits always, to avoid unset memory errors if the + study data is written to a file, but set the flag only if any of the bits + are set, to save time looking when none are. */ + + if (bits_set) + { + study->flags |= PCRE_STUDY_MAPPED; + memcpy(study->start_bits, start_bits, sizeof(start_bits)); + } + else memset(study->start_bits, 0, 32 * sizeof(pcre_uint8)); + +#ifdef PCRE_DEBUG + if (bits_set) + { + pcre_uint8 *ptr = start_bits; + int i; + + printf("Start bits:\n"); + for (i = 0; i < 32; i++) + printf("%3d: %02x%s", i * 8, *ptr++, ((i + 1) & 0x7) != 0? " " : "\n"); + } +#endif + + /* Always set the minlength value in the block, because the JIT compiler + makes use of it. However, don't set the bit unless the length is greater than + zero - the interpretive pcre_exec() and pcre_dfa_exec() needn't waste time + checking the zero case. */ + + if (min > 0) + { + study->flags |= PCRE_STUDY_MINLEN; + study->minlength = min; + } + else study->minlength = 0; + + /* If JIT support was compiled and requested, attempt the JIT compilation. + If no starting bytes were found, and the minimum length is zero, and JIT + compilation fails, abandon the extra block and return NULL. */ + +#ifdef SUPPORT_JIT + extra->executable_jit = NULL; + if ((options & PCRE_STUDY_JIT_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_COMPILE); + if ((options & PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_PARTIAL_SOFT_COMPILE); + if ((options & PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE) != 0) + PRIV(jit_compile)(re, extra, JIT_PARTIAL_HARD_COMPILE); + + if (study->flags == 0 && (extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) == 0) + { +#ifdef COMPILE_PCRE8 + pcre_free_study(extra); +#endif +#ifdef COMPILE_PCRE16 + pcre16_free_study(extra); +#endif + extra = NULL; + } +#endif + } + +return extra; +} + + +/************************************************* +* Free the study data * +*************************************************/ + +/* This function frees the memory that was obtained by pcre_study(). + +Argument: a pointer to the pcre[16]_extra block +Returns: nothing +*/ + +#ifdef COMPILE_PCRE8 +PCRE_EXP_DEFN void +pcre_free_study(pcre_extra *extra) +#else +PCRE_EXP_DEFN void +pcre16_free_study(pcre16_extra *extra) +#endif +{ +if (extra == NULL) + return; +#ifdef SUPPORT_JIT +if ((extra->flags & PCRE_EXTRA_EXECUTABLE_JIT) != 0 && + extra->executable_jit != NULL) + PRIV(jit_free)(extra->executable_jit); +#endif +PUBL(free)(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..b580a4a --- /dev/null +++ b/glib/pcre/pcre_tables.c @@ -0,0 +1,602 @@ +/************************************************* +* 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-2012 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_INCLUDED + +/* 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" + +#endif /* PCRE_INCLUDED */ + +/* 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 pcre_uint8 PRIV(OP_lengths)[] = { OP_LENGTHS }; + + + +/************************************************* +* Tables for UTF-8 support * +*************************************************/ + +/* These are the breakpoints for different numbers of bytes in a UTF-8 +character. */ + +#if (defined SUPPORT_UTF && defined COMPILE_PCRE8) \ + || (defined PCRE_INCLUDED && defined SUPPORT_PCRE16) + +/* These tables are also required by pcretest in 16 bit mode. */ + +const int PRIV(utf8_table1)[] = + { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; + +const int PRIV(utf8_table1_size) = sizeof(PRIV(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 PRIV(utf8_table2)[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; +const int PRIV(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 pcre_uint8 PRIV(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 }; + +#endif /* (SUPPORT_UTF && COMPILE_PCRE8) || (PCRE_INCLUDED && SUPPORT_PCRE16)*/ + +#ifdef SUPPORT_UTF + +/* Table to translate from particular type value to the general value. */ + +const int PRIV(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 */ +}; + +#ifdef SUPPORT_JIT +/* This table reverses PRIV(ucp_gentype). We can save the cost +of a memory load. */ + +const int PRIV(ucp_typerange)[] = { + ucp_Cc, ucp_Cs, + ucp_Ll, ucp_Lu, + ucp_Mc, ucp_Mn, + ucp_Nd, ucp_No, + ucp_Pc, ucp_Ps, + ucp_Sc, ucp_So, + ucp_Zl, ucp_Zs, +}; +#endif /* SUPPORT_JIT */ + +/* 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 that can be used +to generate this data automatically instead of maintaining it by hand. + +The script was updated in March 2009 to generate a new EBCDIC-compliant +version. Like all other character and string literals that are compared against +the regular expression pattern, we must use STR_ macros instead of literal +strings to make sure that UTF-8 support works on EBCDIC platforms. */ + +#define STRING_Any0 STR_A STR_n STR_y "\0" +#define STRING_Arabic0 STR_A STR_r STR_a STR_b STR_i STR_c "\0" +#define STRING_Armenian0 STR_A STR_r STR_m STR_e STR_n STR_i STR_a STR_n "\0" +#define STRING_Avestan0 STR_A STR_v STR_e STR_s STR_t STR_a STR_n "\0" +#define STRING_Balinese0 STR_B STR_a STR_l STR_i STR_n STR_e STR_s STR_e "\0" +#define STRING_Bamum0 STR_B STR_a STR_m STR_u STR_m "\0" +#define STRING_Batak0 STR_B STR_a STR_t STR_a STR_k "\0" +#define STRING_Bengali0 STR_B STR_e STR_n STR_g STR_a STR_l STR_i "\0" +#define STRING_Bopomofo0 STR_B STR_o STR_p STR_o STR_m STR_o STR_f STR_o "\0" +#define STRING_Brahmi0 STR_B STR_r STR_a STR_h STR_m STR_i "\0" +#define STRING_Braille0 STR_B STR_r STR_a STR_i STR_l STR_l STR_e "\0" +#define STRING_Buginese0 STR_B STR_u STR_g STR_i STR_n STR_e STR_s STR_e "\0" +#define STRING_Buhid0 STR_B STR_u STR_h STR_i STR_d "\0" +#define STRING_C0 STR_C "\0" +#define STRING_Canadian_Aboriginal0 STR_C STR_a STR_n STR_a STR_d STR_i STR_a STR_n STR_UNDERSCORE STR_A STR_b STR_o STR_r STR_i STR_g STR_i STR_n STR_a STR_l "\0" +#define STRING_Carian0 STR_C STR_a STR_r STR_i STR_a STR_n "\0" +#define STRING_Cc0 STR_C STR_c "\0" +#define STRING_Cf0 STR_C STR_f "\0" +#define STRING_Chakma0 STR_C STR_h STR_a STR_k STR_m STR_a "\0" +#define STRING_Cham0 STR_C STR_h STR_a STR_m "\0" +#define STRING_Cherokee0 STR_C STR_h STR_e STR_r STR_o STR_k STR_e STR_e "\0" +#define STRING_Cn0 STR_C STR_n "\0" +#define STRING_Co0 STR_C STR_o "\0" +#define STRING_Common0 STR_C STR_o STR_m STR_m STR_o STR_n "\0" +#define STRING_Coptic0 STR_C STR_o STR_p STR_t STR_i STR_c "\0" +#define STRING_Cs0 STR_C STR_s "\0" +#define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m "\0" +#define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t "\0" +#define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0" +#define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0" +#define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0" +#define STRING_Egyptian_Hieroglyphs0 STR_E STR_g STR_y STR_p STR_t STR_i STR_a STR_n STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0" +#define STRING_Ethiopic0 STR_E STR_t STR_h STR_i STR_o STR_p STR_i STR_c "\0" +#define STRING_Georgian0 STR_G STR_e STR_o STR_r STR_g STR_i STR_a STR_n "\0" +#define STRING_Glagolitic0 STR_G STR_l STR_a STR_g STR_o STR_l STR_i STR_t STR_i STR_c "\0" +#define STRING_Gothic0 STR_G STR_o STR_t STR_h STR_i STR_c "\0" +#define STRING_Greek0 STR_G STR_r STR_e STR_e STR_k "\0" +#define STRING_Gujarati0 STR_G STR_u STR_j STR_a STR_r STR_a STR_t STR_i "\0" +#define STRING_Gurmukhi0 STR_G STR_u STR_r STR_m STR_u STR_k STR_h STR_i "\0" +#define STRING_Han0 STR_H STR_a STR_n "\0" +#define STRING_Hangul0 STR_H STR_a STR_n STR_g STR_u STR_l "\0" +#define STRING_Hanunoo0 STR_H STR_a STR_n STR_u STR_n STR_o STR_o "\0" +#define STRING_Hebrew0 STR_H STR_e STR_b STR_r STR_e STR_w "\0" +#define STRING_Hiragana0 STR_H STR_i STR_r STR_a STR_g STR_a STR_n STR_a "\0" +#define STRING_Imperial_Aramaic0 STR_I STR_m STR_p STR_e STR_r STR_i STR_a STR_l STR_UNDERSCORE STR_A STR_r STR_a STR_m STR_a STR_i STR_c "\0" +#define STRING_Inherited0 STR_I STR_n STR_h STR_e STR_r STR_i STR_t STR_e STR_d "\0" +#define STRING_Inscriptional_Pahlavi0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_h STR_l STR_a STR_v STR_i "\0" +#define STRING_Inscriptional_Parthian0 STR_I STR_n STR_s STR_c STR_r STR_i STR_p STR_t STR_i STR_o STR_n STR_a STR_l STR_UNDERSCORE STR_P STR_a STR_r STR_t STR_h STR_i STR_a STR_n "\0" +#define STRING_Javanese0 STR_J STR_a STR_v STR_a STR_n STR_e STR_s STR_e "\0" +#define STRING_Kaithi0 STR_K STR_a STR_i STR_t STR_h STR_i "\0" +#define STRING_Kannada0 STR_K STR_a STR_n STR_n STR_a STR_d STR_a "\0" +#define STRING_Katakana0 STR_K STR_a STR_t STR_a STR_k STR_a STR_n STR_a "\0" +#define STRING_Kayah_Li0 STR_K STR_a STR_y STR_a STR_h STR_UNDERSCORE STR_L STR_i "\0" +#define STRING_Kharoshthi0 STR_K STR_h STR_a STR_r STR_o STR_s STR_h STR_t STR_h STR_i "\0" +#define STRING_Khmer0 STR_K STR_h STR_m STR_e STR_r "\0" +#define STRING_L0 STR_L "\0" +#define STRING_L_AMPERSAND0 STR_L STR_AMPERSAND "\0" +#define STRING_Lao0 STR_L STR_a STR_o "\0" +#define STRING_Latin0 STR_L STR_a STR_t STR_i STR_n "\0" +#define STRING_Lepcha0 STR_L STR_e STR_p STR_c STR_h STR_a "\0" +#define STRING_Limbu0 STR_L STR_i STR_m STR_b STR_u "\0" +#define STRING_Linear_B0 STR_L STR_i STR_n STR_e STR_a STR_r STR_UNDERSCORE STR_B "\0" +#define STRING_Lisu0 STR_L STR_i STR_s STR_u "\0" +#define STRING_Ll0 STR_L STR_l "\0" +#define STRING_Lm0 STR_L STR_m "\0" +#define STRING_Lo0 STR_L STR_o "\0" +#define STRING_Lt0 STR_L STR_t "\0" +#define STRING_Lu0 STR_L STR_u "\0" +#define STRING_Lycian0 STR_L STR_y STR_c STR_i STR_a STR_n "\0" +#define STRING_Lydian0 STR_L STR_y STR_d STR_i STR_a STR_n "\0" +#define STRING_M0 STR_M "\0" +#define STRING_Malayalam0 STR_M STR_a STR_l STR_a STR_y STR_a STR_l STR_a STR_m "\0" +#define STRING_Mandaic0 STR_M STR_a STR_n STR_d STR_a STR_i STR_c "\0" +#define STRING_Mc0 STR_M STR_c "\0" +#define STRING_Me0 STR_M STR_e "\0" +#define STRING_Meetei_Mayek0 STR_M STR_e STR_e STR_t STR_e STR_i STR_UNDERSCORE STR_M STR_a STR_y STR_e STR_k "\0" +#define STRING_Meroitic_Cursive0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_C STR_u STR_r STR_s STR_i STR_v STR_e "\0" +#define STRING_Meroitic_Hieroglyphs0 STR_M STR_e STR_r STR_o STR_i STR_t STR_i STR_c STR_UNDERSCORE STR_H STR_i STR_e STR_r STR_o STR_g STR_l STR_y STR_p STR_h STR_s "\0" +#define STRING_Miao0 STR_M STR_i STR_a STR_o "\0" +#define STRING_Mn0 STR_M STR_n "\0" +#define STRING_Mongolian0 STR_M STR_o STR_n STR_g STR_o STR_l STR_i STR_a STR_n "\0" +#define STRING_Myanmar0 STR_M STR_y STR_a STR_n STR_m STR_a STR_r "\0" +#define STRING_N0 STR_N "\0" +#define STRING_Nd0 STR_N STR_d "\0" +#define STRING_New_Tai_Lue0 STR_N STR_e STR_w STR_UNDERSCORE STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_u STR_e "\0" +#define STRING_Nko0 STR_N STR_k STR_o "\0" +#define STRING_Nl0 STR_N STR_l "\0" +#define STRING_No0 STR_N STR_o "\0" +#define STRING_Ogham0 STR_O STR_g STR_h STR_a STR_m "\0" +#define STRING_Ol_Chiki0 STR_O STR_l STR_UNDERSCORE STR_C STR_h STR_i STR_k STR_i "\0" +#define STRING_Old_Italic0 STR_O STR_l STR_d STR_UNDERSCORE STR_I STR_t STR_a STR_l STR_i STR_c "\0" +#define STRING_Old_Persian0 STR_O STR_l STR_d STR_UNDERSCORE STR_P STR_e STR_r STR_s STR_i STR_a STR_n "\0" +#define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0" +#define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c "\0" +#define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a "\0" +#define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a "\0" +#define STRING_P0 STR_P "\0" +#define STRING_Pc0 STR_P STR_c "\0" +#define STRING_Pd0 STR_P STR_d "\0" +#define STRING_Pe0 STR_P STR_e "\0" +#define STRING_Pf0 STR_P STR_f "\0" +#define STRING_Phags_Pa0 STR_P STR_h STR_a STR_g STR_s STR_UNDERSCORE STR_P STR_a "\0" +#define STRING_Phoenician0 STR_P STR_h STR_o STR_e STR_n STR_i STR_c STR_i STR_a STR_n "\0" +#define STRING_Pi0 STR_P STR_i "\0" +#define STRING_Po0 STR_P STR_o "\0" +#define STRING_Ps0 STR_P STR_s "\0" +#define STRING_Rejang0 STR_R STR_e STR_j STR_a STR_n STR_g "\0" +#define STRING_Runic0 STR_R STR_u STR_n STR_i STR_c "\0" +#define STRING_S0 STR_S "\0" +#define STRING_Samaritan0 STR_S STR_a STR_m STR_a STR_r STR_i STR_t STR_a STR_n "\0" +#define STRING_Saurashtra0 STR_S STR_a STR_u STR_r STR_a STR_s STR_h STR_t STR_r STR_a "\0" +#define STRING_Sc0 STR_S STR_c "\0" +#define STRING_Sharada0 STR_S STR_h STR_a STR_r STR_a STR_d STR_a "\0" +#define STRING_Shavian0 STR_S STR_h STR_a STR_v STR_i STR_a STR_n "\0" +#define STRING_Sinhala0 STR_S STR_i STR_n STR_h STR_a STR_l STR_a "\0" +#define STRING_Sk0 STR_S STR_k "\0" +#define STRING_Sm0 STR_S STR_m "\0" +#define STRING_So0 STR_S STR_o "\0" +#define STRING_Sora_Sompeng0 STR_S STR_o STR_r STR_a STR_UNDERSCORE STR_S STR_o STR_m STR_p STR_e STR_n STR_g "\0" +#define STRING_Sundanese0 STR_S STR_u STR_n STR_d STR_a STR_n STR_e STR_s STR_e "\0" +#define STRING_Syloti_Nagri0 STR_S STR_y STR_l STR_o STR_t STR_i STR_UNDERSCORE STR_N STR_a STR_g STR_r STR_i "\0" +#define STRING_Syriac0 STR_S STR_y STR_r STR_i STR_a STR_c "\0" +#define STRING_Tagalog0 STR_T STR_a STR_g STR_a STR_l STR_o STR_g "\0" +#define STRING_Tagbanwa0 STR_T STR_a STR_g STR_b STR_a STR_n STR_w STR_a "\0" +#define STRING_Tai_Le0 STR_T STR_a STR_i STR_UNDERSCORE STR_L STR_e "\0" +#define STRING_Tai_Tham0 STR_T STR_a STR_i STR_UNDERSCORE STR_T STR_h STR_a STR_m "\0" +#define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t "\0" +#define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i "\0" +#define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l "\0" +#define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u "\0" +#define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a "\0" +#define STRING_Thai0 STR_T STR_h STR_a STR_i "\0" +#define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n "\0" +#define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0" +#define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0" +#define STRING_Vai0 STR_V STR_a STR_i "\0" +#define STRING_Xan0 STR_X STR_a STR_n "\0" +#define STRING_Xps0 STR_X STR_p STR_s "\0" +#define STRING_Xsp0 STR_X STR_s STR_p "\0" +#define STRING_Xwd0 STR_X STR_w STR_d "\0" +#define STRING_Yi0 STR_Y STR_i "\0" +#define STRING_Z0 STR_Z "\0" +#define STRING_Zl0 STR_Z STR_l "\0" +#define STRING_Zp0 STR_Z STR_p "\0" +#define STRING_Zs0 STR_Z STR_s "\0" + +const char PRIV(utt_names)[] = + STRING_Any0 + STRING_Arabic0 + STRING_Armenian0 + STRING_Avestan0 + STRING_Balinese0 + STRING_Bamum0 + STRING_Batak0 + STRING_Bengali0 + STRING_Bopomofo0 + STRING_Brahmi0 + STRING_Braille0 + STRING_Buginese0 + STRING_Buhid0 + STRING_C0 + STRING_Canadian_Aboriginal0 + STRING_Carian0 + STRING_Cc0 + STRING_Cf0 + STRING_Chakma0 + STRING_Cham0 + STRING_Cherokee0 + STRING_Cn0 + STRING_Co0 + STRING_Common0 + STRING_Coptic0 + STRING_Cs0 + STRING_Cuneiform0 + STRING_Cypriot0 + STRING_Cyrillic0 + STRING_Deseret0 + STRING_Devanagari0 + STRING_Egyptian_Hieroglyphs0 + STRING_Ethiopic0 + STRING_Georgian0 + STRING_Glagolitic0 + STRING_Gothic0 + STRING_Greek0 + STRING_Gujarati0 + STRING_Gurmukhi0 + STRING_Han0 + STRING_Hangul0 + STRING_Hanunoo0 + STRING_Hebrew0 + STRING_Hiragana0 + STRING_Imperial_Aramaic0 + STRING_Inherited0 + STRING_Inscriptional_Pahlavi0 + STRING_Inscriptional_Parthian0 + STRING_Javanese0 + STRING_Kaithi0 + STRING_Kannada0 + STRING_Katakana0 + STRING_Kayah_Li0 + STRING_Kharoshthi0 + STRING_Khmer0 + STRING_L0 + STRING_L_AMPERSAND0 + STRING_Lao0 + STRING_Latin0 + STRING_Lepcha0 + STRING_Limbu0 + STRING_Linear_B0 + STRING_Lisu0 + STRING_Ll0 + STRING_Lm0 + STRING_Lo0 + STRING_Lt0 + STRING_Lu0 + STRING_Lycian0 + STRING_Lydian0 + STRING_M0 + STRING_Malayalam0 + STRING_Mandaic0 + STRING_Mc0 + STRING_Me0 + STRING_Meetei_Mayek0 + STRING_Meroitic_Cursive0 + STRING_Meroitic_Hieroglyphs0 + STRING_Miao0 + STRING_Mn0 + STRING_Mongolian0 + STRING_Myanmar0 + STRING_N0 + STRING_Nd0 + STRING_New_Tai_Lue0 + STRING_Nko0 + STRING_Nl0 + STRING_No0 + STRING_Ogham0 + STRING_Ol_Chiki0 + STRING_Old_Italic0 + STRING_Old_Persian0 + STRING_Old_South_Arabian0 + STRING_Old_Turkic0 + STRING_Oriya0 + STRING_Osmanya0 + STRING_P0 + STRING_Pc0 + STRING_Pd0 + STRING_Pe0 + STRING_Pf0 + STRING_Phags_Pa0 + STRING_Phoenician0 + STRING_Pi0 + STRING_Po0 + STRING_Ps0 + STRING_Rejang0 + STRING_Runic0 + STRING_S0 + STRING_Samaritan0 + STRING_Saurashtra0 + STRING_Sc0 + STRING_Sharada0 + STRING_Shavian0 + STRING_Sinhala0 + STRING_Sk0 + STRING_Sm0 + STRING_So0 + STRING_Sora_Sompeng0 + STRING_Sundanese0 + STRING_Syloti_Nagri0 + STRING_Syriac0 + STRING_Tagalog0 + STRING_Tagbanwa0 + STRING_Tai_Le0 + STRING_Tai_Tham0 + STRING_Tai_Viet0 + STRING_Takri0 + STRING_Tamil0 + STRING_Telugu0 + STRING_Thaana0 + STRING_Thai0 + STRING_Tibetan0 + STRING_Tifinagh0 + STRING_Ugaritic0 + STRING_Vai0 + STRING_Xan0 + STRING_Xps0 + STRING_Xsp0 + STRING_Xwd0 + STRING_Yi0 + STRING_Z0 + STRING_Zl0 + STRING_Zp0 + STRING_Zs0; + +const ucp_type_table PRIV(utt)[] = { + { 0, PT_ANY, 0 }, + { 4, PT_SC, ucp_Arabic }, + { 11, PT_SC, ucp_Armenian }, + { 20, PT_SC, ucp_Avestan }, + { 28, PT_SC, ucp_Balinese }, + { 37, PT_SC, ucp_Bamum }, + { 43, PT_SC, ucp_Batak }, + { 49, PT_SC, ucp_Bengali }, + { 57, PT_SC, ucp_Bopomofo }, + { 66, PT_SC, ucp_Brahmi }, + { 73, PT_SC, ucp_Braille }, + { 81, PT_SC, ucp_Buginese }, + { 90, PT_SC, ucp_Buhid }, + { 96, PT_GC, ucp_C }, + { 98, PT_SC, ucp_Canadian_Aboriginal }, + { 118, PT_SC, ucp_Carian }, + { 125, PT_PC, ucp_Cc }, + { 128, PT_PC, ucp_Cf }, + { 131, PT_SC, ucp_Chakma }, + { 138, PT_SC, ucp_Cham }, + { 143, PT_SC, ucp_Cherokee }, + { 152, PT_PC, ucp_Cn }, + { 155, PT_PC, ucp_Co }, + { 158, PT_SC, ucp_Common }, + { 165, PT_SC, ucp_Coptic }, + { 172, PT_PC, ucp_Cs }, + { 175, PT_SC, ucp_Cuneiform }, + { 185, PT_SC, ucp_Cypriot }, + { 193, PT_SC, ucp_Cyrillic }, + { 202, PT_SC, ucp_Deseret }, + { 210, PT_SC, ucp_Devanagari }, + { 221, PT_SC, ucp_Egyptian_Hieroglyphs }, + { 242, PT_SC, ucp_Ethiopic }, + { 251, PT_SC, ucp_Georgian }, + { 260, PT_SC, ucp_Glagolitic }, + { 271, PT_SC, ucp_Gothic }, + { 278, PT_SC, ucp_Greek }, + { 284, PT_SC, ucp_Gujarati }, + { 293, PT_SC, ucp_Gurmukhi }, + { 302, PT_SC, ucp_Han }, + { 306, PT_SC, ucp_Hangul }, + { 313, PT_SC, ucp_Hanunoo }, + { 321, PT_SC, ucp_Hebrew }, + { 328, PT_SC, ucp_Hiragana }, + { 337, PT_SC, ucp_Imperial_Aramaic }, + { 354, PT_SC, ucp_Inherited }, + { 364, PT_SC, ucp_Inscriptional_Pahlavi }, + { 386, PT_SC, ucp_Inscriptional_Parthian }, + { 409, PT_SC, ucp_Javanese }, + { 418, PT_SC, ucp_Kaithi }, + { 425, PT_SC, ucp_Kannada }, + { 433, PT_SC, ucp_Katakana }, + { 442, PT_SC, ucp_Kayah_Li }, + { 451, PT_SC, ucp_Kharoshthi }, + { 462, PT_SC, ucp_Khmer }, + { 468, PT_GC, ucp_L }, + { 470, PT_LAMP, 0 }, + { 473, PT_SC, ucp_Lao }, + { 477, PT_SC, ucp_Latin }, + { 483, PT_SC, ucp_Lepcha }, + { 490, PT_SC, ucp_Limbu }, + { 496, PT_SC, ucp_Linear_B }, + { 505, PT_SC, ucp_Lisu }, + { 510, PT_PC, ucp_Ll }, + { 513, PT_PC, ucp_Lm }, + { 516, PT_PC, ucp_Lo }, + { 519, PT_PC, ucp_Lt }, + { 522, PT_PC, ucp_Lu }, + { 525, PT_SC, ucp_Lycian }, + { 532, PT_SC, ucp_Lydian }, + { 539, PT_GC, ucp_M }, + { 541, PT_SC, ucp_Malayalam }, + { 551, PT_SC, ucp_Mandaic }, + { 559, PT_PC, ucp_Mc }, + { 562, PT_PC, ucp_Me }, + { 565, PT_SC, ucp_Meetei_Mayek }, + { 578, PT_SC, ucp_Meroitic_Cursive }, + { 595, PT_SC, ucp_Meroitic_Hieroglyphs }, + { 616, PT_SC, ucp_Miao }, + { 621, PT_PC, ucp_Mn }, + { 624, PT_SC, ucp_Mongolian }, + { 634, PT_SC, ucp_Myanmar }, + { 642, PT_GC, ucp_N }, + { 644, PT_PC, ucp_Nd }, + { 647, PT_SC, ucp_New_Tai_Lue }, + { 659, PT_SC, ucp_Nko }, + { 663, PT_PC, ucp_Nl }, + { 666, PT_PC, ucp_No }, + { 669, PT_SC, ucp_Ogham }, + { 675, PT_SC, ucp_Ol_Chiki }, + { 684, PT_SC, ucp_Old_Italic }, + { 695, PT_SC, ucp_Old_Persian }, + { 707, PT_SC, ucp_Old_South_Arabian }, + { 725, PT_SC, ucp_Old_Turkic }, + { 736, PT_SC, ucp_Oriya }, + { 742, PT_SC, ucp_Osmanya }, + { 750, PT_GC, ucp_P }, + { 752, PT_PC, ucp_Pc }, + { 755, PT_PC, ucp_Pd }, + { 758, PT_PC, ucp_Pe }, + { 761, PT_PC, ucp_Pf }, + { 764, PT_SC, ucp_Phags_Pa }, + { 773, PT_SC, ucp_Phoenician }, + { 784, PT_PC, ucp_Pi }, + { 787, PT_PC, ucp_Po }, + { 790, PT_PC, ucp_Ps }, + { 793, PT_SC, ucp_Rejang }, + { 800, PT_SC, ucp_Runic }, + { 806, PT_GC, ucp_S }, + { 808, PT_SC, ucp_Samaritan }, + { 818, PT_SC, ucp_Saurashtra }, + { 829, PT_PC, ucp_Sc }, + { 832, PT_SC, ucp_Sharada }, + { 840, PT_SC, ucp_Shavian }, + { 848, PT_SC, ucp_Sinhala }, + { 856, PT_PC, ucp_Sk }, + { 859, PT_PC, ucp_Sm }, + { 862, PT_PC, ucp_So }, + { 865, PT_SC, ucp_Sora_Sompeng }, + { 878, PT_SC, ucp_Sundanese }, + { 888, PT_SC, ucp_Syloti_Nagri }, + { 901, PT_SC, ucp_Syriac }, + { 908, PT_SC, ucp_Tagalog }, + { 916, PT_SC, ucp_Tagbanwa }, + { 925, PT_SC, ucp_Tai_Le }, + { 932, PT_SC, ucp_Tai_Tham }, + { 941, PT_SC, ucp_Tai_Viet }, + { 950, PT_SC, ucp_Takri }, + { 956, PT_SC, ucp_Tamil }, + { 962, PT_SC, ucp_Telugu }, + { 969, PT_SC, ucp_Thaana }, + { 976, PT_SC, ucp_Thai }, + { 981, PT_SC, ucp_Tibetan }, + { 989, PT_SC, ucp_Tifinagh }, + { 998, PT_SC, ucp_Ugaritic }, + { 1007, PT_SC, ucp_Vai }, + { 1011, PT_ALNUM, 0 }, + { 1015, PT_PXSPACE, 0 }, + { 1019, PT_SPACE, 0 }, + { 1023, PT_WORD, 0 }, + { 1027, PT_SC, ucp_Yi }, + { 1030, PT_GC, ucp_Z }, + { 1032, PT_PC, ucp_Zl }, + { 1035, PT_PC, ucp_Zp }, + { 1038, PT_PC, ucp_Zs } +}; + +const int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); + +unsigned int +_pcre_ucp_othercase(const unsigned int c) +{ + unsigned int oc = NOTACHAR; + + if ((oc = g_unichar_toupper(c)) != c) + return oc; + if ((oc = g_unichar_tolower(c)) != c) + return oc; + + return c; +} + +#endif /* SUPPORT_UTF */ + +/* End of pcre_tables.c */ diff --git a/glib/pcre/pcre_valid_utf8.c b/glib/pcre/pcre_valid_utf8.c new file mode 100644 index 0000000..7b9d3df --- /dev/null +++ b/glib/pcre/pcre_valid_utf8.c @@ -0,0 +1,299 @@ +/************************************************* +* 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-2012 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 for validating UTF-8 character +strings. */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "pcre_internal.h" + + +/************************************************* +* Validate a UTF-8 string * +*************************************************/ + +/* This function is called (optionally) at the start of compile or match, to +check that a supposed UTF-8 string is actually valid. The early check means +that subsequent code can assume it is dealing with a valid string. The check +can be turned off for maximum performance, but the consequences of supplying an +invalid string are then undefined. + +Originally, this function checked according to RFC 2279, allowing for values in +the range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were in +the canonical format. Once somebody had pointed out RFC 3629 to me (it +obsoletes 2279), additional restrictions were applied. The values are now +limited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the +subrange 0xd000 to 0xdfff is excluded. However, the format of 5-byte and 6-byte +characters is still checked. + +From release 8.13 more information about the details of the error are passed +back in the returned value: + +PCRE_UTF8_ERR0 No error +PCRE_UTF8_ERR1 Missing 1 byte at the end of the string +PCRE_UTF8_ERR2 Missing 2 bytes at the end of the string +PCRE_UTF8_ERR3 Missing 3 bytes at the end of the string +PCRE_UTF8_ERR4 Missing 4 bytes at the end of the string +PCRE_UTF8_ERR5 Missing 5 bytes at the end of the string +PCRE_UTF8_ERR6 2nd-byte's two top bits are not 0x80 +PCRE_UTF8_ERR7 3rd-byte's two top bits are not 0x80 +PCRE_UTF8_ERR8 4th-byte's two top bits are not 0x80 +PCRE_UTF8_ERR9 5th-byte's two top bits are not 0x80 +PCRE_UTF8_ERR10 6th-byte's two top bits are not 0x80 +PCRE_UTF8_ERR11 5-byte character is not permitted by RFC 3629 +PCRE_UTF8_ERR12 6-byte character is not permitted by RFC 3629 +PCRE_UTF8_ERR13 4-byte character with value > 0x10ffff is not permitted +PCRE_UTF8_ERR14 3-byte character with value 0xd000-0xdfff is not permitted +PCRE_UTF8_ERR15 Overlong 2-byte sequence +PCRE_UTF8_ERR16 Overlong 3-byte sequence +PCRE_UTF8_ERR17 Overlong 4-byte sequence +PCRE_UTF8_ERR18 Overlong 5-byte sequence (won't ever occur) +PCRE_UTF8_ERR19 Overlong 6-byte sequence (won't ever occur) +PCRE_UTF8_ERR20 Isolated 0x80 byte (not within UTF-8 character) +PCRE_UTF8_ERR21 Byte with the illegal value 0xfe or 0xff + +Arguments: + string points to the string + length length of string, or -1 if the string is zero-terminated + errp pointer to an error position offset variable + +Returns: = 0 if the string is a valid UTF-8 string + > 0 otherwise, setting the offset of the bad character +*/ + +int +PRIV(valid_utf)(PCRE_PUCHAR string, int length, int *erroroffset) +{ +#ifdef SUPPORT_UTF +register PCRE_PUCHAR p; + +if (length < 0) + { + for (p = string; *p != 0; p++); + length = (int)(p - string); + } + +for (p = string; length-- > 0; p++) + { + register int ab, c, d; + + c = *p; + if (c < 128) continue; /* ASCII character */ + + if (c < 0xc0) /* Isolated 10xx xxxx byte */ + { + *erroroffset = (int)(p - string); + return PCRE_UTF8_ERR20; + } + + if (c >= 0xfe) /* Invalid 0xfe or 0xff bytes */ + { + *erroroffset = (int)(p - string); + return PCRE_UTF8_ERR21; + } + + ab = PRIV(utf8_table4)[c & 0x3f]; /* Number of additional bytes */ + if (length < ab) + { + *erroroffset = (int)(p - string); /* Missing bytes */ + return ab - length; /* Codes ERR1 to ERR5 */ + } + length -= ab; /* Length remaining */ + + /* Check top bits in the second byte */ + + if (((d = *(++p)) & 0xc0) != 0x80) + { + *erroroffset = (int)(p - string) - 1; + return PCRE_UTF8_ERR6; + } + + /* For each length, check that the remaining bytes start with the 0x80 bit + set and not the 0x40 bit. Then check for an overlong sequence, and for the + excluded range 0xd800 to 0xdfff. */ + + switch (ab) + { + /* 2-byte character. No further bytes to check for 0x80. Check first byte + for for xx00 000x (overlong sequence). */ + + case 1: if ((c & 0x3e) == 0) + { + *erroroffset = (int)(p - string) - 1; + return PCRE_UTF8_ERR15; + } + break; + + /* 3-byte character. Check third byte for 0x80. Then check first 2 bytes + for 1110 0000, xx0x xxxx (overlong sequence) or + 1110 1101, 1010 xxxx (0xd800 - 0xdfff) */ + + case 2: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if (c == 0xe0 && (d & 0x20) == 0) + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR16; + } + if (c == 0xed && d >= 0xa0) + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR14; + } + break; + + /* 4-byte character. Check 3rd and 4th bytes for 0x80. Then check first 2 + bytes for for 1111 0000, xx00 xxxx (overlong sequence), then check for a + character greater than 0x0010ffff (f4 8f bf bf) */ + + case 3: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if (c == 0xf0 && (d & 0x30) == 0) + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR17; + } + if (c > 0xf4 || (c == 0xf4 && d > 0x8f)) + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR13; + } + break; + + /* 5-byte and 6-byte characters are not allowed by RFC 3629, and will be + rejected by the length test below. However, we do the appropriate tests + here so that overlong sequences get diagnosed, and also in case there is + ever an option for handling these larger code points. */ + + /* 5-byte character. Check 3rd, 4th, and 5th bytes for 0x80. Then check for + 1111 1000, xx00 0xxx */ + + case 4: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */ + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR9; + } + if (c == 0xf8 && (d & 0x38) == 0) + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR18; + } + break; + + /* 6-byte character. Check 3rd-6th bytes for 0x80. Then check for + 1111 1100, xx00 00xx. */ + + case 5: + if ((*(++p) & 0xc0) != 0x80) /* Third byte */ + { + *erroroffset = (int)(p - string) - 2; + return PCRE_UTF8_ERR7; + } + if ((*(++p) & 0xc0) != 0x80) /* Fourth byte */ + { + *erroroffset = (int)(p - string) - 3; + return PCRE_UTF8_ERR8; + } + if ((*(++p) & 0xc0) != 0x80) /* Fifth byte */ + { + *erroroffset = (int)(p - string) - 4; + return PCRE_UTF8_ERR9; + } + if ((*(++p) & 0xc0) != 0x80) /* Sixth byte */ + { + *erroroffset = (int)(p - string) - 5; + return PCRE_UTF8_ERR10; + } + if (c == 0xfc && (d & 0x3c) == 0) + { + *erroroffset = (int)(p - string) - 5; + return PCRE_UTF8_ERR19; + } + break; + } + + /* Character is valid under RFC 2279, but 4-byte and 5-byte characters are + excluded by RFC 3629. The pointer p is currently at the last byte of the + character. */ + + if (ab > 3) + { + *erroroffset = (int)(p - string) - ab; + return (ab == 4)? PCRE_UTF8_ERR11 : PCRE_UTF8_ERR12; + } + } + +#else /* SUPPORT_UTF */ +(void)(string); /* Keep picky compilers happy */ +(void)(length); +#endif + +return PCRE_UTF8_ERR0; /* This indicates success */ +} + +/* End of pcre_valid_utf8.c */ diff --git a/glib/pcre/pcre_xclass.c b/glib/pcre/pcre_xclass.c new file mode 100644 index 0000000..e5a55d7 --- /dev/null +++ b/glib/pcre/pcre_xclass.c @@ -0,0 +1,198 @@ +/************************************************* +* 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-2012 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. 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 and/or Unicode properties. + +Arguments: + c the character + data points to the flag byte of the XCLASS data + +Returns: TRUE if character matches, else FALSE +*/ + +BOOL +PRIV(xclass)(int c, const pcre_uchar *data, BOOL utf) +{ +int t; +BOOL negated = (*data & XCL_NOT) != 0; + +(void)utf; +#ifdef COMPILE_PCRE8 +/* In 8 bit mode, this must always be TRUE. Help the compiler to know that. */ +utf = TRUE; +#endif + +/* 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 && + (((pcre_uint8 *)(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 / sizeof(pcre_uchar); + +while ((t = *data++) != XCL_END) + { + int x, y; + if (t == XCL_SINGLE) + { +#ifdef SUPPORT_UTF + if (utf) + { + GETCHARINC(x, data); /* macro generates multiple statements */ + } + else +#endif + x = *data++; + if (c == x) return !negated; + } + else if (t == XCL_RANGE) + { +#ifdef SUPPORT_UTF + if (utf) + { + GETCHARINC(x, data); /* macro generates multiple statements */ + GETCHARINC(y, data); /* macro generates multiple statements */ + } + else +#endif + { + x = *data++; + y = *data++; + } + if (c >= x && c <= y) return !negated; + } + +#ifdef SUPPORT_UCP + else /* XCL_PROP & XCL_NOTPROP */ + { + const pcre_uint8 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] == PRIV(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; + + case PT_ALNUM: + if ((PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N) == (t == XCL_PROP)) + return !negated; + break; + + case PT_SPACE: /* Perl space */ + if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == (t == XCL_PROP)) + return !negated; + break; + + case PT_PXSPACE: /* POSIX space */ + if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) == (t == XCL_PROP)) + return !negated; + break; + + case PT_WORD: + if ((PRIV(ucp_gentype)[chartype] == ucp_L || + PRIV(ucp_gentype)[chartype] == ucp_N || c == CHAR_UNDERSCORE) + == (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..f1c14be --- /dev/null +++ b/glib/pcre/ucp.h @@ -0,0 +1,179 @@ +/************************************************* +* Unicode Property Table handler * +*************************************************/ + +#ifndef _UCP_H +#define _UCP_H + +/* This file contains definitions of the property values that are returned by +the UCD access macros. 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. */ +#ifdef GLIB_COMPILATION +#include "gunicode.h" +#else +#include +#endif + +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 = G_UNICODE_CONTROL, /* Control */ + ucp_Cf = G_UNICODE_FORMAT, /* Format */ + ucp_Cn = G_UNICODE_UNASSIGNED, /* Unassigned */ + ucp_Co = G_UNICODE_PRIVATE_USE, /* Private use */ + ucp_Cs = G_UNICODE_SURROGATE, /* Surrogate */ + ucp_Ll = G_UNICODE_LOWERCASE_LETTER, /* Lower case letter */ + ucp_Lm = G_UNICODE_MODIFIER_LETTER, /* Modifier letter */ + ucp_Lo = G_UNICODE_OTHER_LETTER, /* Other letter */ + ucp_Lt = G_UNICODE_TITLECASE_LETTER, /* Title case letter */ + ucp_Lu = G_UNICODE_UPPERCASE_LETTER, /* Upper case letter */ + ucp_Mc = G_UNICODE_SPACING_MARK, /* Spacing mark */ + ucp_Me = G_UNICODE_ENCLOSING_MARK, /* Enclosing mark */ + ucp_Mn = G_UNICODE_NON_SPACING_MARK, /* Non-spacing mark */ + ucp_Nd = G_UNICODE_DECIMAL_NUMBER, /* Decimal number */ + ucp_Nl = G_UNICODE_LETTER_NUMBER, /* Letter number */ + ucp_No = G_UNICODE_OTHER_NUMBER, /* Other number */ + ucp_Pc = G_UNICODE_CONNECT_PUNCTUATION, /* Connector punctuation */ + ucp_Pd = G_UNICODE_DASH_PUNCTUATION, /* Dash punctuation */ + ucp_Pe = G_UNICODE_CLOSE_PUNCTUATION, /* Close punctuation */ + ucp_Pf = G_UNICODE_FINAL_PUNCTUATION, /* Final punctuation */ + ucp_Pi = G_UNICODE_INITIAL_PUNCTUATION, /* Initial punctuation */ + ucp_Po = G_UNICODE_OTHER_PUNCTUATION, /* Other punctuation */ + ucp_Ps = G_UNICODE_OPEN_PUNCTUATION, /* Open punctuation */ + ucp_Sc = G_UNICODE_CURRENCY_SYMBOL, /* Currency symbol */ + ucp_Sk = G_UNICODE_MODIFIER_SYMBOL, /* Modifier symbol */ + ucp_Sm = G_UNICODE_MATH_SYMBOL, /* Mathematical symbol */ + ucp_So = G_UNICODE_OTHER_SYMBOL, /* Other symbol */ + ucp_Zl = G_UNICODE_LINE_SEPARATOR, /* Line separator */ + ucp_Zp = G_UNICODE_PARAGRAPH_SEPARATOR, /* Paragraph separator */ + ucp_Zs = G_UNICODE_SPACE_SEPARATOR /* Space separator */ +}; + +/* These are the script identifications. */ + +enum { + ucp_Common = G_UNICODE_SCRIPT_COMMON, + ucp_Inherited = G_UNICODE_SCRIPT_INHERITED, + + 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_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_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, + /* New for Unicode 5.0: */ + ucp_Balinese = G_UNICODE_SCRIPT_BALINESE, + ucp_Cuneiform = G_UNICODE_SCRIPT_CUNEIFORM, + ucp_Nko = G_UNICODE_SCRIPT_NKO, + ucp_Phags_Pa = G_UNICODE_SCRIPT_PHAGS_PA, + ucp_Phoenician = G_UNICODE_SCRIPT_PHOENICIAN, + /* New for Unicode 5.1: */ + ucp_Carian = G_UNICODE_SCRIPT_CARIAN, + ucp_Cham = G_UNICODE_SCRIPT_CHAM, + ucp_Kayah_Li = G_UNICODE_SCRIPT_KAYAH_LI, + ucp_Lepcha = G_UNICODE_SCRIPT_LEPCHA, + ucp_Lycian = G_UNICODE_SCRIPT_LYCIAN, + ucp_Lydian = G_UNICODE_SCRIPT_LYDIAN, + ucp_Ol_Chiki = G_UNICODE_SCRIPT_OL_CHIKI, + ucp_Rejang = G_UNICODE_SCRIPT_REJANG, + ucp_Saurashtra = G_UNICODE_SCRIPT_SAURASHTRA, + ucp_Sundanese = G_UNICODE_SCRIPT_SUNDANESE, + ucp_Vai = G_UNICODE_SCRIPT_VAI, + /* New for Unicode 5.2: */ + ucp_Avestan = G_UNICODE_SCRIPT_AVESTAN, + ucp_Bamum = G_UNICODE_SCRIPT_BAMUM, + ucp_Egyptian_Hieroglyphs = G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, + ucp_Imperial_Aramaic = G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, + ucp_Inscriptional_Pahlavi = G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, + ucp_Inscriptional_Parthian = G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, + ucp_Javanese = G_UNICODE_SCRIPT_JAVANESE, + ucp_Kaithi = G_UNICODE_SCRIPT_KAITHI, + ucp_Lisu = G_UNICODE_SCRIPT_LISU, + ucp_Meetei_Mayek = G_UNICODE_SCRIPT_MEETEI_MAYEK, + ucp_Old_South_Arabian = G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, + ucp_Old_Turkic = G_UNICODE_SCRIPT_OLD_TURKIC, + ucp_Samaritan = G_UNICODE_SCRIPT_SAMARITAN, + ucp_Tai_Tham = G_UNICODE_SCRIPT_TAI_THAM, + ucp_Tai_Viet = G_UNICODE_SCRIPT_TAI_VIET, + /* New for Unicode 6.0.0: */ + ucp_Batak = G_UNICODE_SCRIPT_BATAK, + ucp_Brahmi = G_UNICODE_SCRIPT_BRAHMI, + ucp_Mandaic = G_UNICODE_SCRIPT_MANDAIC, + /* New for Unicode 6.1.0: */ + ucp_Chakma = G_UNICODE_SCRIPT_CHAKMA, + ucp_Meroitic_Cursive = G_UNICODE_SCRIPT_MEROITIC_CURSIVE, + ucp_Meroitic_Hieroglyphs = G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, + ucp_Miao = G_UNICODE_SCRIPT_MIAO, + ucp_Sharada = G_UNICODE_SCRIPT_SHARADA, + ucp_Sora_Sompeng = G_UNICODE_SCRIPT_SORA_SOMPENG, + ucp_Takri = G_UNICODE_SCRIPT_TAKRI, +}; + +#endif + +/* End of ucp.h */ diff --git a/glib/tests/.gitignore b/glib/tests/.gitignore new file mode 100644 index 0000000..1bc83c5 --- /dev/null +++ b/glib/tests/.gitignore @@ -0,0 +1,81 @@ +1bit-emufutex +1bit-mutex +642026 +642026-ec +array-test +asyncqueue +atomic +base64 +bitlock +bookmarkfile +bytes +cache +checksum +collate +cond +convert +dataset +date +dir +environment +error +fileutils +gdatetime +gvariant +gwakeup +gwakeup-fallback +hash +hmac +hook +hostutils +include +keyfile +list +logging +mainloop +mappedfile +markup-collect +markup-escape +markup-parse +markup-subparser +mem-overflow +mutex +node +once +option-argv0 +option-context +pattern +private +protocol +queue +rand +rec-mutex +regex +rwlock +scannerapi +sequence +shell +slice +slist +sort +spawn-multithreaded +spawn-singlethread +strfuncs +string +testing +test-printf +test-spawn-echo +thread +timeout +tmpsample.xml +tree +unicode +unix +unix-multithreaded +unix-nothreads +uri +utf8-misc +utf8-performance +utf8-pointer +utf8-validate +utils diff --git a/glib/tests/1bit-mutex.c b/glib/tests/1bit-mutex.c new file mode 100644 index 0000000..897bd4b --- /dev/null +++ b/glib/tests/1bit-mutex.c @@ -0,0 +1,165 @@ +/* + * 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. + */ + +#include "config.h" + +/* 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 + +#include + +#if TEST_EMULATED_FUTEX + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-prototypes" + + /* 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 GLIB_COMPILATION + + /* rebuild gbitlock.c without futex support, + defining our own version of the g_bit_*lock symbols + */ + #undef g_pointer_bit_lock + #undef g_pointer_bit_trylock + #undef g_pointer_bit_unlock + + #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_pointer_bit_lock _emufutex_g_pointer_bit_lock + #define g_pointer_bit_trylock _emufutex_g_pointer_bit_trylock + #define g_pointer_bit_unlock _emufutex_g_pointer_bit_unlock + + #define G_BIT_LOCK_FORCE_FUTEX_EMULATION + + #include + +#pragma GCC diagnostic pop +#endif + +volatile GThread *owners[LOCKS]; +volatile gint locks[LOCKS]; +volatile gpointer ptrs[LOCKS]; +volatile gint bits[LOCKS]; + +static void +acquire (int nr, + gboolean use_pointers) +{ + GThread *self; + + self = g_thread_self (); + + g_assert_cmpint (((gsize) ptrs) % sizeof(gint), ==, 0); + + if (!(use_pointers ? + g_pointer_bit_trylock (&ptrs[nr], bits[nr]) + : g_bit_trylock (&locks[nr], bits[nr]))) + { + if (g_test_verbose ()) + g_print ("thread %p going to block on lock %d\n", self, nr); + + if (use_pointers) + g_pointer_bit_lock (&ptrs[nr], bits[nr]); + else + 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 */ + + if (use_pointers) + g_pointer_bit_unlock (&ptrs[nr], bits[nr]); + else + g_bit_unlock (&locks[nr], bits[nr]); +} + +static gpointer +thread_func (gpointer data) +{ + gboolean use_pointers = GPOINTER_TO_INT (data); + gint i; + GRand *rand; + + rand = g_rand_new (); + + for (i = 0; i < ITERATIONS; i++) + acquire (g_rand_int_range (rand, 0, LOCKS), use_pointers); + + g_rand_free (rand); + + return NULL; +} + +static void +testcase (gconstpointer data) +{ + gboolean use_pointers = GPOINTER_TO_INT (data); + GThread *threads[THREADS]; + int i; + +#ifdef TEST_EMULATED_FUTEX + #define SUFFIX "-emufutex" + + /* ensure that we are using the emulated futex by checking + * (at compile-time) for the existance of 'g_futex_address_list' + */ + g_assert (g_futex_address_list == 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_new ("foo", thread_func, + GINT_TO_POINTER (use_pointers)); + + 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_data_func ("/glib/1bit-mutex" SUFFIX "/int", (gpointer) 0, testcase); + g_test_add_data_func ("/glib/1bit-mutex" SUFFIX "/pointer", (gpointer) 1, testcase); + + return g_test_run (); +} diff --git a/glib/tests/4096-random-bytes b/glib/tests/4096-random-bytes new file mode 100644 index 0000000..3e7a7db --- /dev/null +++ b/glib/tests/4096-random-bytes @@ -0,0 +1,45 @@ +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXOxdolodx0WMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWMMMMMMMMMMMMMMMMMM0l' :NMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0c. .:KMMMMMMMMMMMWd. ,MMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN, XMMMMMMMMMk. .MMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM' oMMMMMMMMc oMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMNklclkWMMMMMM0 lMMMMMMMc ;MMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMW: .XMMMMMk OMMMMMMx ;WMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMc 'MMMMMK .MMMMMMW. dMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMM. KMMMMM' 0MMMMMM0 ,KMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMM: OMMMMMK OMMMMMMM0 .OMMMMMMMMMMMMMMMM +MMMMMMMMMMMMW0kONMMMMMK KMMMMMMX, ,KMMMMMMMMW. ,kMMMMMMMMMMMMMMMMMM +MMMMMMMMMMWc lWMMMMO .MMMMMMMMMKxxXMMMMMMMMMMM0. .lXMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMM; 'WMMMMN: 0MMMMMMMMMMMMMMMMMMMMMMMMMNl'. ..:xXMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMM. oMMMMMMXdldNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMx .MMMMMMMMMMMMMMMMMMMMMMMWXK0OkkkkkkO0XNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMx NMMMMMMMMMMMMMMWKko:'. .;d0WMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMK, .MMMMMMMMMMW0o;. :KMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMXo;';KMMMMMMMKo' cMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMXl. xMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMk' :MMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMO. dMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMWc ,WMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMN. cWMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMW' '0MMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMd :KMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMM. 'dNMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMM 'oXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMM. ,xNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMM; .:kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMO .l0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMM, :KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMN. oNMMMMMMMMMMMMMXkoc:,,,,:lOWMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMX. .XMMMMMMMMMMMM0:. .XMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMN. xMMMMMMMMMMMM0 OMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMWc 'NMMMMMMMMMMMO 'WMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMO. .kMMMMMMMMMMc .XMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMWl .l0WMMMW0; .KMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMNl ... ;NMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMWd. .OMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0c. 'xWMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0l. .cKMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNOo;. .;dKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNKOxxdddkOXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM. diff --git a/glib/tests/642026.c b/glib/tests/642026.c new file mode 100644 index 0000000..05f9f25 --- /dev/null +++ b/glib/tests/642026.c @@ -0,0 +1,91 @@ +/* + * Author: Simon McVittie + * Copyright © 2011 Nokia Corporation + * + * 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. + */ + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +/* On smcv's laptop, 1e4 iterations didn't always exhibit the bug, but 1e5 + * iterations exhibited it 10/10 times in practice. YMMV. */ +#define ITERATIONS 100000 + +static GStaticPrivate sp; +static GMutex *mutex; +static GCond *cond; +static guint i; + +static volatile gint freed = 0; + +static void +notify (gpointer p) +{ + if (!g_atomic_int_compare_and_exchange (&freed, 0, 1)) + { + g_error ("someone already freed it after %u iterations", i); + } +} + +static gpointer thread_func (gpointer nil) +{ + /* wait for main thread to reach its g_cond_wait call */ + g_mutex_lock (mutex); + + g_static_private_set (&sp, &sp, notify); + g_cond_broadcast (cond); + g_mutex_unlock (mutex); + + return nil; +} + +static void +testcase (void) +{ + g_test_bug ("642026"); + + mutex = g_mutex_new (); + cond = g_cond_new (); + + g_mutex_lock (mutex); + + for (i = 0; i < ITERATIONS; i++) + { + GThread *t1; + + g_static_private_init (&sp); + freed = 0; + + t1 = g_thread_create (thread_func, NULL, TRUE, NULL); + + /* wait for t1 to set up its thread-private data */ + g_cond_wait (cond, mutex); + + /* exercise the bug, by racing with t1 to free the private data */ + g_static_private_free (&sp); + g_thread_join (t1); + } + + g_cond_free (cond); + g_mutex_unlock (mutex); + g_mutex_free (mutex); +} + +int +main (int argc, + char **argv) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("https://bugzilla.gnome.org/show_bug.cgi?id="); + + g_test_add_func ("/glib/642026", testcase); + + return g_test_run (); +} diff --git a/glib/tests/Makefile.am b/glib/tests/Makefile.am new file mode 100644 index 0000000..3ffbab1 --- /dev/null +++ b/glib/tests/Makefile.am @@ -0,0 +1,144 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + -g \ + $(glib_INCLUDES) \ + -DG_LOG_DOMAIN=\"GLib\" \ + -DSRCDIR=\""$(srcdir)"\" \ + $(GLIB_DEBUG_FLAGS) + +LDADD = $(top_builddir)/glib/libglib-2.0.la -lm + +TEST_PROGS += \ + array-test \ + asyncqueue \ + atomic \ + base64 \ + bitlock \ + bookmarkfile \ + bytes \ + cache \ + checksum \ + collate \ + cond \ + convert \ + dataset \ + date \ + dir \ + environment \ + error \ + fileutils \ + gdatetime \ + gvariant \ + gwakeup \ + hash \ + hmac \ + hook \ + hostutils \ + keyfile \ + list \ + logging \ + mainloop \ + mappedfile \ + markup-parse \ + markup-collect \ + markup-escape \ + markup-subparser \ + mem-overflow \ + mutex \ + node \ + once \ + option-context \ + option-argv0 \ + pattern \ + private \ + protocol \ + queue \ + rand \ + rec-mutex \ + regex \ + rwlock \ + scannerapi \ + sequence \ + shell \ + slice \ + slist \ + sort \ + spawn-multithreaded \ + spawn-singlethread \ + strfuncs \ + string \ + testing \ + test-printf \ + thread \ + timeout \ + tree \ + utf8-performance \ + utf8-pointer \ + utf8-validate \ + utf8-misc \ + utils \ + unicode \ + uri \ + 1bit-mutex \ + 1bit-emufutex \ + 642026 \ + 642026-ec + +noinst_PROGRAMS = $(TEST_PROGS) test-spawn-echo + +atomic_CFLAGS = $(AM_CFLAGS) +if HAVE_GCC +atomic_CFLAGS += -Wstrict-aliasing=2 +endif + +642026_ec_SOURCES = 642026.c +642026_ec_CFLAGS = -DG_ERRORCHECK_MUTEXES + +1bit_emufutex_SOURCES = 1bit-mutex.c +1bit_emufutex_CFLAGS = $(AM_CFLAGS) -DTEST_EMULATED_FUTEX + +gwakeup_SOURCES = gwakeuptest.c ../../glib/gwakeup.c + +if HAVE_EVENTFD +TEST_PROGS += gwakeup-fallback +gwakeup_fallback_SOURCES = gwakeuptest.c ../../glib/gwakeup.c +gwakeup_fallback_CFLAGS = $(AM_CFLAGS) -DTEST_EVENTFD_FALLBACK +endif + +if OS_UNIX + +TEST_PROGS += unix +TEST_PROGS += include + +# some testing of gtester functionality +XMLLINT = xmllint + +gtester-xmllint-check: # check testreport xml with xmllint if present + ${GTESTER} -k --quiet -o tmpsample.xml --test-arg=--gtester-selftest ${GTESTER} + ${XMLLINT} --version 2>/dev/null; test "$$?" != 0 || ${XMLLINT} --noout tmpsample.xml + +check-am: gtester-xmllint-check + +private_LDFLAGS = -pthread + +endif + +CLEANFILES = \ + tmpsample.xml + +EXTRA_DIST += \ + 4096-random-bytes \ + keyfiletest.ini \ + pages.ini \ + bookmarks.xbel \ + empty \ + echo-script + +dist-hook: + mkdir $(distdir)/markups; \ + for f in $(srcdir)/markups/*; do \ + cp $$f $(distdir)/markups; done + mkdir $(distdir)/bookmarks; \ + for f in $(srcdir)/bookmarks/* ; do \ + cp $$f $(distdir)/bookmarks; done diff --git a/glib/tests/array-test.c b/glib/tests/array-test.c new file mode 100644 index 0000000..255bb3f --- /dev/null +++ b/glib/tests/array-test.c @@ -0,0 +1,879 @@ +/* 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; + gint *segment; + + 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); + + segment = (gint*)g_array_free (garray, FALSE); + for (i = 0; i < 10000; i++) + g_assert_cmpint (segment[i], ==, i); + g_free (segment); +} + +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_remove (void) +{ + GArray *garray; + gint i; + gint prev, cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_append_val (garray, i); + + g_assert_cmpint (garray->len, ==, 100); + + g_array_remove_index (garray, 1); + g_array_remove_index (garray, 3); + g_array_remove_index (garray, 21); + g_array_remove_index (garray, 57); + + g_assert_cmpint (garray->len, ==, 96); + + prev = -1; + for (i = 0; i < garray->len; i++) + { + cur = g_array_index (garray, gint, i); + g_assert (cur != 1 && cur != 4 && cur != 23 && cur != 60); + g_assert_cmpint (prev, <, cur); + prev = cur; + } + + g_array_free (garray, TRUE); +} + +static void +array_remove_fast (void) +{ + GArray *garray; + gint i; + gint prev, cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_append_val (garray, i); + + g_assert_cmpint (garray->len, ==, 100); + + g_array_remove_index_fast (garray, 1); + g_array_remove_index_fast (garray, 3); + g_array_remove_index_fast (garray, 21); + g_array_remove_index_fast (garray, 57); + + g_assert_cmpint (garray->len, ==, 96); + + prev = -1; + for (i = 0; i < garray->len; i++) + { + cur = g_array_index (garray, gint, i); + g_assert (cur != 1 && cur != 3 && cur != 21 && cur != 57); + if (cur < 96) + { + g_assert_cmpint (prev, <, cur); + prev = cur; + } + } + + g_array_free (garray, TRUE); +} + +static void +array_remove_range (void) +{ + GArray *garray; + gint i; + gint prev, cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 100; i++) + g_array_append_val (garray, i); + + g_assert_cmpint (garray->len, ==, 100); + + g_array_remove_range (garray, 31, 4); + + g_assert_cmpint (garray->len, ==, 96); + + prev = -1; + for (i = 0; i < garray->len; i++) + { + cur = g_array_index (garray, gint, i); + g_assert (cur < 31 || cur > 34); + g_assert_cmpint (prev, <, cur); + prev = cur; + } + + 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 gpointer +array_large_size_remalloc_impl (gpointer mem, + gsize n_bytes) +{ + /* We only care that g_array_set_size() doesn't hang before + * calling g_realloc(). So if we got here, we already won. + */ + exit (0); +} + +static GMemVTable array_large_size_mem_vtable = { + malloc, array_large_size_remalloc_impl, free, + NULL, NULL, NULL +}; + +static void +array_large_size (void) +{ + GArray* array; + + g_test_bug ("568760"); + + array = g_array_new (FALSE, FALSE, sizeof (char)); + + if (g_test_trap_fork (5 /* s */ * 1000 /* ms */ * 1000 /* µs */, 0)) + { + g_mem_set_vtable (&array_large_size_mem_vtable); + g_array_set_size (array, 1073750016); + g_assert_not_reached (); + } + g_test_trap_assert_passed (); + + g_array_free (array, TRUE); +} + +static int +int_compare (gconstpointer p1, gconstpointer p2) +{ + const gint *i1 = p1; + const gint *i2 = p2; + + return *i1 - *i2; +} + +static int +int_compare_data (gconstpointer p1, gconstpointer p2, gpointer data) +{ + const gint *i1 = p1; + const gint *i2 = p2; + + return *i1 - *i2; +} +static void +array_sort (void) +{ + GArray *garray; + gint i; + gint prev, cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 10000; i++) + { + cur = g_random_int_range (0, 10000); + g_array_append_val (garray, cur); + } + g_array_sort (garray, int_compare); + + prev = -1; + for (i = 0; i < garray->len; i++) + { + cur = g_array_index (garray, gint, i); + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_array_free (garray, TRUE); +} + +static void +array_sort_with_data (void) +{ + GArray *garray; + gint i; + gint prev, cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + for (i = 0; i < 10000; i++) + { + cur = g_random_int_range (0, 10000); + g_array_append_val (garray, cur); + } + g_array_sort_with_data (garray, int_compare_data, NULL); + + prev = -1; + for (i = 0; i < garray->len; i++) + { + cur = g_array_index (garray, gint, i); + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_array_free (garray, TRUE); +} + +static gint num_clear_func_invocations = 0; + +static void +my_clear_func (gpointer data) +{ + num_clear_func_invocations += 1; +} + +static void +array_clear_func (void) +{ + GArray *garray; + gint i; + gint cur; + + garray = g_array_new (FALSE, FALSE, sizeof (gint)); + g_array_set_clear_func (garray, my_clear_func); + + for (i = 0; i < 10; i++) + { + cur = g_random_int_range (0, 100); + g_array_append_val (garray, cur); + } + + g_array_remove_index (garray, 9); + g_assert_cmpint (num_clear_func_invocations, ==, 1); + + g_array_remove_range (garray, 5, 3); + g_assert_cmpint (num_clear_func_invocations, ==, 4); + + g_array_remove_index_fast (garray, 4); + g_assert_cmpint (num_clear_func_invocations, ==, 5); + + g_array_free (garray, TRUE); + g_assert_cmpint (num_clear_func_invocations, ==, 10); +} + +static void +pointer_array_add (void) +{ + GPtrArray *gparray; + gint i; + gint sum = 0; + gpointer *segment; + + gparray = g_ptr_array_sized_new (1000); + + 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); + + segment = g_ptr_array_free (gparray, FALSE); + for (i = 0; i < 10000; i++) + g_assert (segment[i] == GINT_TO_POINTER (i)); + g_free (segment); +} + +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); + g_ptr_array_remove_index_fast (gparray, 1); + g_assert_cmpint (num_free_func_invocations, ==, 2); + s = g_strdup ("frob"); + g_ptr_array_add (gparray, s); + g_assert (g_ptr_array_remove (gparray, s)); + g_assert (!g_ptr_array_remove (gparray, "nuun")); + g_assert (!g_ptr_array_remove_fast (gparray, "mlo")); + g_assert_cmpint (num_free_func_invocations, ==, 3); + s = g_strdup ("frob"); + g_ptr_array_add (gparray, s); + g_ptr_array_set_size (gparray, 1); + g_assert_cmpint (num_free_func_invocations, ==, 4); + g_ptr_array_ref (gparray); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 4); + g_ptr_array_unref (gparray); + g_assert_cmpint (num_free_func_invocations, ==, 5); + + num_free_func_invocations = 0; + gparray = g_ptr_array_new_full (10, 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_set_size (gparray, 20); + 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_remove_range (gparray, 1, 1); + 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 gint +ptr_compare (gconstpointer p1, gconstpointer p2) +{ + gpointer i1 = *(gpointer*)p1; + gpointer i2 = *(gpointer*)p2; + + return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2); +} + +static gint +ptr_compare_data (gconstpointer p1, gconstpointer p2, gpointer data) +{ + gpointer i1 = *(gpointer*)p1; + gpointer i2 = *(gpointer*)p2; + + return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2); +} + +static void +pointer_array_sort (void) +{ + GPtrArray *gparray; + gint i; + gint val; + gint prev, cur; + + gparray = g_ptr_array_new (); + for (i = 0; i < 10000; i++) + { + val = g_random_int_range (0, 10000); + g_ptr_array_add (gparray, GINT_TO_POINTER (val)); + } + + g_ptr_array_sort (gparray, ptr_compare); + + prev = -1; + for (i = 0; i < 10000; i++) + { + cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i)); + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_ptr_array_free (gparray, TRUE); +} + +static void +pointer_array_sort_with_data (void) +{ + GPtrArray *gparray; + gint i; + gint prev, cur; + + gparray = g_ptr_array_new (); + for (i = 0; i < 10000; i++) + g_ptr_array_add (gparray, GINT_TO_POINTER (g_random_int_range (0, 10000))); + + g_ptr_array_sort_with_data (gparray, ptr_compare_data, NULL); + + prev = -1; + for (i = 0; i < 10000; i++) + { + cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i)); + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_ptr_array_free (gparray, TRUE); +} + +static void +byte_array_append (void) +{ + GByteArray *gbarray; + gint i; + guint8 *segment; + + gbarray = g_byte_array_sized_new (1000); + 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'); + } + + segment = g_byte_array_free (gbarray, FALSE); + + for (i = 0; i < 10000; i++) + { + g_assert (segment[4*i] == 'a'); + g_assert (segment[4*i+1] == 'b'); + g_assert (segment[4*i+2] == 'c'); + g_assert (segment[4*i+3] == 'd'); + } + + g_free (segment); +} + +static void +byte_array_prepend (void) +{ + GByteArray *gbarray; + gint i; + + gbarray = g_byte_array_new (); + g_byte_array_set_size (gbarray, 1000); + + for (i = 0; i < 10000; i++) + g_byte_array_prepend (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); +} + +static void +byte_array_remove (void) +{ + GByteArray *gbarray; + gint i; + + gbarray = g_byte_array_new (); + for (i = 0; i < 100; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + + g_assert_cmpint (gbarray->len, ==, 400); + + g_byte_array_remove_index (gbarray, 4); + g_byte_array_remove_index (gbarray, 4); + g_byte_array_remove_index (gbarray, 4); + g_byte_array_remove_index (gbarray, 4); + + g_assert_cmpint (gbarray->len, ==, 396); + + for (i = 0; i < 99; 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_remove_fast (void) +{ + GByteArray *gbarray; + gint i; + + gbarray = g_byte_array_new (); + for (i = 0; i < 100; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + + g_assert_cmpint (gbarray->len, ==, 400); + + g_byte_array_remove_index_fast (gbarray, 4); + g_byte_array_remove_index_fast (gbarray, 4); + g_byte_array_remove_index_fast (gbarray, 4); + g_byte_array_remove_index_fast (gbarray, 4); + + g_assert_cmpint (gbarray->len, ==, 396); + + for (i = 0; i < 99; 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_remove_range (void) +{ + GByteArray *gbarray; + gint i; + + gbarray = g_byte_array_new (); + for (i = 0; i < 100; i++) + g_byte_array_append (gbarray, (guint8*) "abcd", 4); + + g_assert_cmpint (gbarray->len, ==, 400); + + g_byte_array_remove_range (gbarray, 12, 4); + + g_assert_cmpint (gbarray->len, ==, 396); + + for (i = 0; i < 99; 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 int +byte_compare (gconstpointer p1, gconstpointer p2) +{ + const guint8 *i1 = p1; + const guint8 *i2 = p2; + + return *i1 - *i2; +} + +static int +byte_compare_data (gconstpointer p1, gconstpointer p2, gpointer data) +{ + const guint8 *i1 = p1; + const guint8 *i2 = p2; + + return *i1 - *i2; +} + +static void +byte_array_sort (void) +{ + GByteArray *gbarray; + gint i; + guint8 val; + guint8 prev, cur; + + gbarray = g_byte_array_new (); + for (i = 0; i < 100; i++) + { + val = 'a' + g_random_int_range (0, 26); + g_byte_array_append (gbarray, (guint8*) &val, 1); + } + + g_byte_array_sort (gbarray, byte_compare); + + prev = 'a'; + for (i = 0; i < gbarray->len; i++) + { + cur = gbarray->data[i]; + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_byte_array_free (gbarray, TRUE); +} + +static void +byte_array_sort_with_data (void) +{ + GByteArray *gbarray; + gint i; + guint8 val; + guint8 prev, cur; + + gbarray = g_byte_array_new (); + for (i = 0; i < 100; i++) + { + val = 'a' + g_random_int_range (0, 26); + g_byte_array_append (gbarray, (guint8*) &val, 1); + } + + g_byte_array_sort_with_data (gbarray, byte_compare_data, NULL); + + prev = 'a'; + for (i = 0; i < gbarray->len; i++) + { + cur = gbarray->data[i]; + g_assert_cmpint (prev, <=, cur); + prev = cur; + } + + g_byte_array_free (gbarray, TRUE); +} + +static void +byte_array_new_take (void) +{ + GByteArray *gbarray; + guint8 *data; + + data = g_memdup ("woooweeewow", 11); + gbarray = g_byte_array_new_take (data, 11); + g_assert (gbarray->data == data); + g_assert_cmpuint (gbarray->len, ==, 11); + g_byte_array_free (gbarray, TRUE); +} + +static void +byte_array_free_to_bytes (void) +{ + GByteArray *gbarray; + gpointer memory; + GBytes *bytes; + gsize size; + + gbarray = g_byte_array_new (); + g_byte_array_append (gbarray, (guint8 *)"woooweeewow", 11); + memory = gbarray->data; + + bytes = g_byte_array_free_to_bytes (gbarray); + g_assert (bytes != NULL); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 11); + g_assert (g_bytes_get_data (bytes, &size) == memory); + g_assert_cmpuint (size, ==, 11); + + g_bytes_unref (bytes); +} +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugs.gnome.org/"); + + /* array tests */ + g_test_add_func ("/array/append", array_append); + g_test_add_func ("/array/prepend", array_prepend); + g_test_add_func ("/array/remove", array_remove); + g_test_add_func ("/array/remove-fast", array_remove_fast); + g_test_add_func ("/array/remove-range", array_remove_range); + g_test_add_func ("/array/ref-count", array_ref_count); + g_test_add_func ("/array/large-size", array_large_size); + g_test_add_func ("/array/sort", array_sort); + g_test_add_func ("/array/sort-with-data", array_sort_with_data); + g_test_add_func ("/array/clear-func", array_clear_func); + + /* 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); + g_test_add_func ("/pointerarray/sort", pointer_array_sort); + g_test_add_func ("/pointerarray/sort-with-data", pointer_array_sort_with_data); + + /* byte arrays */ + g_test_add_func ("/bytearray/append", byte_array_append); + g_test_add_func ("/bytearray/prepend", byte_array_prepend); + g_test_add_func ("/bytearray/remove", byte_array_remove); + g_test_add_func ("/bytearray/remove-fast", byte_array_remove_fast); + g_test_add_func ("/bytearray/remove-range", byte_array_remove_range); + g_test_add_func ("/bytearray/ref-count", byte_array_ref_count); + g_test_add_func ("/bytearray/sort", byte_array_sort); + g_test_add_func ("/bytearray/sort-with-data", byte_array_sort_with_data); + g_test_add_func ("/bytearray/new-take", byte_array_new_take); + g_test_add_func ("/bytearray/free-to-bytes", byte_array_free_to_bytes); + + return g_test_run (); +} + diff --git a/glib/tests/asyncqueue.c b/glib/tests/asyncqueue.c new file mode 100644 index 0000000..fce411b --- /dev/null +++ b/glib/tests/asyncqueue.c @@ -0,0 +1,221 @@ +/* Unit tests for GAsyncQueue + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +static gint +compare_func (gconstpointer d1, gconstpointer d2, gpointer data) +{ + gint i1, i2; + + i1 = GPOINTER_TO_INT (d1); + i2 = GPOINTER_TO_INT (d2); + + return i1 - i2; +} + +static +void test_async_queue_sort (void) +{ + GAsyncQueue *q; + + q = g_async_queue_new (); + + g_async_queue_push (q, GINT_TO_POINTER (10)); + g_async_queue_push (q, GINT_TO_POINTER (2)); + g_async_queue_push (q, GINT_TO_POINTER (7)); + + g_async_queue_sort (q, compare_func, NULL); + + g_async_queue_push_sorted (q, GINT_TO_POINTER (1), compare_func, NULL); + g_async_queue_push_sorted (q, GINT_TO_POINTER (8), compare_func, NULL); + + g_assert_cmpint (GPOINTER_TO_INT (g_async_queue_pop (q)), ==, 1); + g_assert_cmpint (GPOINTER_TO_INT (g_async_queue_pop (q)), ==, 2); + g_assert_cmpint (GPOINTER_TO_INT (g_async_queue_pop (q)), ==, 7); + g_assert_cmpint (GPOINTER_TO_INT (g_async_queue_pop (q)), ==, 8); + g_assert_cmpint (GPOINTER_TO_INT (g_async_queue_pop (q)), ==, 10); + + g_assert (g_async_queue_try_pop (q) == NULL); + + g_async_queue_unref (q); +} + +static gint destroy_count; + +static void +destroy_notify (gpointer item) +{ + destroy_count++; +} + +static void +test_async_queue_destroy (void) +{ + GAsyncQueue *q; + + q = g_async_queue_new_full (destroy_notify); + + g_assert (destroy_count == 0); + + g_async_queue_push (q, GINT_TO_POINTER (1)); + g_async_queue_push (q, GINT_TO_POINTER (1)); + g_async_queue_push (q, GINT_TO_POINTER (1)); + g_async_queue_push (q, GINT_TO_POINTER (1)); + + g_assert (g_async_queue_length (q) == 4); + + g_async_queue_unref (q); + + g_assert (destroy_count == 4); +} + +static GAsyncQueue *q; + +static GThread *threads[10]; +static gint counts[10]; +static gint sums[10]; +static gint total; + +static gpointer +thread_func (gpointer data) +{ + gint pos = GPOINTER_TO_INT (data); + gint value; + + while (1) + { + value = GPOINTER_TO_INT (g_async_queue_pop (q)); + + if (value == -1) + break; + + counts[pos]++; + sums[pos] += value; + + g_usleep (1000); + } + + return NULL; +} + +static void +test_async_queue_threads (void) +{ + gint i, j; + gint s, c; + gint value; + + q = g_async_queue_new (); + + for (i = 0; i < 10; i++) + threads[i] = g_thread_new ("test", thread_func, GINT_TO_POINTER (i)); + + for (i = 0; i < 100; i++) + { + g_async_queue_lock (q); + for (j = 0; j < 10; j++) + { + value = g_random_int_range (1, 100); + total += value; + g_async_queue_push_unlocked (q, GINT_TO_POINTER (value)); + } + g_async_queue_unlock (q); + + g_usleep (1000); + } + + for (i = 0; i < 10; i++) + g_async_queue_push (q, GINT_TO_POINTER(-1)); + + for (i = 0; i < 10; i++) + g_thread_join (threads[i]); + + g_assert_cmpint (g_async_queue_length (q), ==, 0); + + s = c = 0; + + for (i = 0; i < 10; i++) + { + g_assert_cmpint (sums[i], >, 0); + g_assert_cmpint (counts[i], >, 0); + s += sums[i]; + c += counts[i]; + } + + g_assert_cmpint (s, ==, total); + g_assert_cmpint (c, ==, 1000); + + g_async_queue_unref (q); +} + +static void +test_async_queue_timed (void) +{ + GAsyncQueue *q; + GTimeVal tv; + gint64 start, end, diff; + gpointer val; + + q = g_async_queue_new (); + + start = g_get_monotonic_time (); + val = g_async_queue_timeout_pop (q, G_USEC_PER_SEC / 10); + g_assert (val == NULL); + + end = g_get_monotonic_time (); + diff = end - start; + g_assert_cmpint (diff, >=, G_USEC_PER_SEC / 10); + /* diff should be only a little bit more than G_USEC_PER_SEC/10, but + * we have to leave some wiggle room for heavily-loaded machines... + */ + g_assert_cmpint (diff, <, G_USEC_PER_SEC); + + start = end; + g_get_current_time (&tv); + g_time_val_add (&tv, G_USEC_PER_SEC / 10); + val = g_async_queue_timed_pop (q, &tv); + g_assert (val == NULL); + + end = g_get_monotonic_time (); + diff = end - start; + g_assert_cmpint (diff, >=, G_USEC_PER_SEC / 10); + g_assert_cmpint (diff, <, G_USEC_PER_SEC); + + g_async_queue_unref (q); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/asyncqueue/sort", test_async_queue_sort); + g_test_add_func ("/asyncqueue/destroy", test_async_queue_destroy); + g_test_add_func ("/asyncqueue/threads", test_async_queue_threads); + g_test_add_func ("/asyncqueue/timed", test_async_queue_timed); + + return g_test_run (); +} diff --git a/glib/tests/atomic.c b/glib/tests/atomic.c new file mode 100644 index 0000000..1c252c6 --- /dev/null +++ b/glib/tests/atomic.c @@ -0,0 +1,273 @@ +/* + * Copyright 2011 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 + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + +#include + +static void +test_types (void) +{ + const gint *csp; + const gint * const *cspp; + guint u, u2; + gint s, s2; + gpointer vp, vp2; + int *ip, *ip2; + gsize gs, gs2; + gboolean res; + + csp = &s; + cspp = &csp; + + g_atomic_int_set (&u, 5); + u2 = g_atomic_int_get (&u); + g_assert_cmpint (u2, ==, 5); + res = g_atomic_int_compare_and_exchange (&u, 6, 7); + g_assert (!res); + g_assert_cmpint (u, ==, 5); + g_atomic_int_add (&u, 1); + g_assert_cmpint (u, ==, 6); + g_atomic_int_inc (&u); + g_assert_cmpint (u, ==, 7); + res = g_atomic_int_dec_and_test (&u); + g_assert (!res); + g_assert_cmpint (u, ==, 6); + u2 = g_atomic_int_and (&u, 5); + g_assert_cmpint (u2, ==, 6); + g_assert_cmpint (u, ==, 4); + u2 = g_atomic_int_or (&u, 8); + g_assert_cmpint (u2, ==, 4); + g_assert_cmpint (u, ==, 12); + u2 = g_atomic_int_xor (&u, 4); + g_assert_cmpint (u2, ==, 12); + g_assert_cmpint (u, ==, 8); + + g_atomic_int_set (&s, 5); + s2 = g_atomic_int_get (&s); + g_assert_cmpint (s2, ==, 5); + res = g_atomic_int_compare_and_exchange (&s, 6, 7); + g_assert (!res); + g_assert_cmpint (s, ==, 5); + g_atomic_int_add (&s, 1); + g_assert_cmpint (s, ==, 6); + g_atomic_int_inc (&s); + g_assert_cmpint (s, ==, 7); + res = g_atomic_int_dec_and_test (&s); + g_assert (!res); + g_assert_cmpint (s, ==, 6); + s2 = g_atomic_int_and (&s, 5); + g_assert_cmpint (s2, ==, 6); + g_assert_cmpint (s, ==, 4); + s2 = g_atomic_int_or (&s, 8); + g_assert_cmpint (s2, ==, 4); + g_assert_cmpint (s, ==, 12); + s2 = g_atomic_int_xor (&s, 4); + g_assert_cmpint (s2, ==, 12); + g_assert_cmpint (s, ==, 8); + + g_atomic_pointer_set (&vp, 0); + vp2 = g_atomic_pointer_get (&vp); + g_assert (vp2 == 0); + res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0); + g_assert (res); + g_assert (vp == 0); + + g_atomic_pointer_set (&ip, 0); + ip2 = g_atomic_pointer_get (&ip); + g_assert (ip2 == 0); + res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0); + g_assert (res); + g_assert (ip == 0); + + g_atomic_pointer_set (&gs, 0); + gs2 = (gsize) g_atomic_pointer_get (&gs); + g_assert (gs2 == 0); + res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0); + g_assert (res); + g_assert (gs == 0); + gs2 = g_atomic_pointer_add (&gs, 5); + g_assert (gs2 == 0); + g_assert (gs == 5); + gs2 = g_atomic_pointer_and (&gs, 6); + g_assert (gs2 == 5); + g_assert (gs == 4); + gs2 = g_atomic_pointer_or (&gs, 8); + g_assert (gs2 == 4); + g_assert (gs == 12); + gs2 = g_atomic_pointer_xor (&gs, 4); + g_assert (gs2 == 12); + g_assert (gs == 8); + + g_assert (g_atomic_int_get (csp) == s); + g_assert (g_atomic_pointer_get (cspp) == csp); + + /* repeat, without the macros */ +#undef g_atomic_int_set +#undef g_atomic_int_get +#undef g_atomic_int_compare_and_exchange +#undef g_atomic_int_add +#undef g_atomic_int_inc +#undef g_atomic_int_and +#undef g_atomic_int_or +#undef g_atomic_int_xor +#undef g_atomic_int_dec_and_test +#undef g_atomic_pointer_set +#undef g_atomic_pointer_get +#undef g_atomic_pointer_compare_and_exchange +#undef g_atomic_pointer_add +#undef g_atomic_pointer_and +#undef g_atomic_pointer_or +#undef g_atomic_pointer_xor + + g_atomic_int_set ((gint*)&u, 5); + u2 = g_atomic_int_get ((gint*)&u); + g_assert_cmpint (u2, ==, 5); + res = g_atomic_int_compare_and_exchange ((gint*)&u, 6, 7); + g_assert (!res); + g_assert_cmpint (u, ==, 5); + g_atomic_int_add ((gint*)&u, 1); + g_assert_cmpint (u, ==, 6); + g_atomic_int_inc ((gint*)&u); + g_assert_cmpint (u, ==, 7); + res = g_atomic_int_dec_and_test ((gint*)&u); + g_assert (!res); + g_assert_cmpint (u, ==, 6); + u2 = g_atomic_int_and (&u, 5); + g_assert_cmpint (u2, ==, 6); + g_assert_cmpint (u, ==, 4); + u2 = g_atomic_int_or (&u, 8); + g_assert_cmpint (u2, ==, 4); + g_assert_cmpint (u, ==, 12); + u2 = g_atomic_int_xor (&u, 4); + g_assert_cmpint (u2, ==, 12); + + g_atomic_int_set (&s, 5); + s2 = g_atomic_int_get (&s); + g_assert_cmpint (s2, ==, 5); + res = g_atomic_int_compare_and_exchange (&s, 6, 7); + g_assert (!res); + g_assert_cmpint (s, ==, 5); + g_atomic_int_add (&s, 1); + g_assert_cmpint (s, ==, 6); + g_atomic_int_inc (&s); + g_assert_cmpint (s, ==, 7); + res = g_atomic_int_dec_and_test (&s); + g_assert (!res); + g_assert_cmpint (s, ==, 6); + s2 = g_atomic_int_and ((guint*)&s, 5); + g_assert_cmpint (s2, ==, 6); + g_assert_cmpint (s, ==, 4); + s2 = g_atomic_int_or ((guint*)&s, 8); + g_assert_cmpint (s2, ==, 4); + g_assert_cmpint (s, ==, 12); + s2 = g_atomic_int_xor ((guint*)&s, 4); + g_assert_cmpint (s2, ==, 12); + g_assert_cmpint (s, ==, 8); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + s2 = g_atomic_int_exchange_and_add ((gint*)&s, 1); +G_GNUC_END_IGNORE_DEPRECATIONS + g_assert_cmpint (s2, ==, 8); + g_assert_cmpint (s, ==, 9); + + g_atomic_pointer_set (&vp, 0); + vp2 = g_atomic_pointer_get (&vp); + g_assert (vp2 == 0); + res = g_atomic_pointer_compare_and_exchange (&vp, 0, 0); + g_assert (res); + g_assert (vp == 0); + + g_atomic_pointer_set (&ip, 0); + ip2 = g_atomic_pointer_get (&ip); + g_assert (ip2 == 0); + res = g_atomic_pointer_compare_and_exchange (&ip, 0, 0); + g_assert (res); + g_assert (ip == 0); + + g_atomic_pointer_set (&gs, 0); + gs2 = (gsize) g_atomic_pointer_get (&gs); + g_assert (gs2 == 0); + res = g_atomic_pointer_compare_and_exchange (&gs, 0, 0); + g_assert (res); + g_assert (gs == 0); + gs2 = g_atomic_pointer_add (&gs, 5); + g_assert (gs2 == 0); + g_assert (gs == 5); + gs2 = g_atomic_pointer_and (&gs, 6); + g_assert (gs2 == 5); + g_assert (gs == 4); + gs2 = g_atomic_pointer_or (&gs, 8); + g_assert (gs2 == 4); + g_assert (gs == 12); + gs2 = g_atomic_pointer_xor (&gs, 4); + g_assert (gs2 == 12); + g_assert (gs == 8); + + g_assert (g_atomic_int_get (csp) == s); + g_assert (g_atomic_pointer_get (cspp) == csp); +} + +#define THREADS 10 +#define ROUNDS 10000 + +volatile gint bucket[THREADS]; +volatile gint atomic; + +static gpointer +thread_func (gpointer data) +{ + gint idx = GPOINTER_TO_INT (data); + gint i; + gint d; + + for (i = 0; i < ROUNDS; i++) + { + d = g_random_int_range (-10, 100); + bucket[idx] += d; + g_atomic_int_add (&atomic, d); + g_thread_yield (); + } + + return NULL; +} + +static void +test_threaded (void) +{ + gint sum; + gint i; + GThread *threads[THREADS]; + + atomic = 0; + for (i = 0; i < THREADS; i++) + bucket[i] = 0; + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("atomic", thread_func, GINT_TO_POINTER (i)); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + sum = 0; + for (i = 0; i < THREADS; i++) + sum += bucket[i]; + + g_assert_cmpint (sum, ==, atomic); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/atomic/types", test_types); + g_test_add_func ("/atomic/threaded", test_threaded); + + return g_test_run (); +} diff --git a/glib/tests/base64.c b/glib/tests/base64.c new file mode 100644 index 0000000..982a3e7 --- /dev/null +++ b/glib/tests/base64.c @@ -0,0 +1,370 @@ +#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; + + /* Check encoded length */ + g_assert_cmpint (len, <=, max); + + 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; + } + + /* Check decoded length */ + g_assert_cmpint (decoded_len, ==, length); + /* Check decoded data */ + g_assert (memcmp (data, data2, length) == 0); + + g_free (text); + g_free (data2); +} + +static void +test_incremental_break (gconstpointer d) +{ + gint length = GPOINTER_TO_INT (d); + + test_incremental (TRUE, length); +} + +static void +test_incremental_nobreak (gconstpointer d) +{ + gint length = GPOINTER_TO_INT (d); + + test_incremental (FALSE, length); +} + +static void +test_full (gconstpointer d) +{ + gint length = GPOINTER_TO_INT (d); + char *text; + guchar *data2; + gsize len; + + text = g_base64_encode (data, length); + data2 = g_base64_decode (text, &len); + g_free (text); + + /* Check decoded length */ + g_assert_cmpint (len, ==, length); + /* Check decoded base64 data */ + g_assert (memcmp (data, data2, length) == 0); + + g_free (data2); +} + +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 +decode_inplace_and_compare (const gchar *datap, + const struct MyRawData *p) +{ + gchar *data; + guchar *data2; + gsize len; + int memcmp_decode; + + data = g_strdup (datap); + data2 = g_base64_decode_inplace (data, &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_decode_inplace (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_inplace_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[]) +{ + gint i; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < DATA_SIZE; i++) + data[i] = (guchar)i; + + g_test_add_data_func ("/base64/full/1", GINT_TO_POINTER (DATA_SIZE), test_full); + g_test_add_data_func ("/base64/full/2", GINT_TO_POINTER (1), test_full); + g_test_add_data_func ("/base64/full/3", GINT_TO_POINTER (2), test_full); + g_test_add_data_func ("/base64/full/4", GINT_TO_POINTER (3), test_full); + + g_test_add_data_func ("/base64/incremental/nobreak/1", GINT_TO_POINTER (DATA_SIZE), test_incremental_nobreak); + g_test_add_data_func ("/base64/incremental/break/1", GINT_TO_POINTER (DATA_SIZE), test_incremental_break); + + g_test_add_data_func ("/base64/incremental/nobreak/2", GINT_TO_POINTER (DATA_SIZE - 1), test_incremental_nobreak); + g_test_add_data_func ("/base64/incremental/break/2", GINT_TO_POINTER (DATA_SIZE - 1), test_incremental_break); + + g_test_add_data_func ("/base64/incremental/nobreak/3", GINT_TO_POINTER (DATA_SIZE - 2), test_incremental_nobreak); + g_test_add_data_func ("/base64/incremental/break/3", GINT_TO_POINTER (DATA_SIZE - 2), test_incremental_break); + + g_test_add_data_func ("/base64/incremental/nobreak/4", GINT_TO_POINTER (1), test_incremental_nobreak); + g_test_add_data_func ("/base64/incremental/nobreak/4", GINT_TO_POINTER (2), test_incremental_nobreak); + g_test_add_data_func ("/base64/incremental/nobreak/4", GINT_TO_POINTER (3), test_incremental_nobreak); + + g_test_add_func ("/base64/encode", test_base64_encode); + g_test_add_func ("/base64/decode", test_base64_decode); + g_test_add_func ("/base64/decode-inplace", test_base64_decode_inplace); + g_test_add_func ("/base64/encode-decode", test_base64_encode_decode); + + return g_test_run (); +} diff --git a/glib/tests/bitlock.c b/glib/tests/bitlock.c new file mode 100644 index 0000000..694fe6d --- /dev/null +++ b/glib/tests/bitlock.c @@ -0,0 +1,39 @@ +#include + +#define ITERATIONS 100000000 + +static void +test_bitlocks (void) +{ + guint64 start = g_get_monotonic_time (); + gint lock = 0; + gint i; + + for (i = 0; i < ITERATIONS; i++) + { + g_bit_lock (&lock, 0); + g_bit_unlock (&lock, 0); + } + + { + gdouble elapsed; + gdouble rate; + + elapsed = g_get_monotonic_time () - start; + elapsed /= 1000000; + rate = ITERATIONS / elapsed; + + g_test_maximized_result (rate, "iterations per second"); + } +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + if (g_test_perf ()) + g_test_add_func ("/bitlock/performance/uncontended", test_bitlocks); + + return g_test_run (); +} diff --git a/glib/tests/bookmarkfile.c b/glib/tests/bookmarkfile.c new file mode 100644 index 0000000..3028298 --- /dev/null +++ b/glib/tests/bookmarkfile.c @@ -0,0 +1,297 @@ +#undef G_DISABLE_ASSERT + +#include +#include +#include +#include +#include +#include + +#ifndef SRCDIR +#define SRCDIR "." +#endif + +#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_test_verbose ()) + g_print ("Load error: %s\n", error->message); + + g_clear_error (&error); + return res; +} + +static void +test_query (GBookmarkFile *bookmark) +{ + gint size; + gchar **uris; + gsize uris_len, i; + gchar *mime; + GError *error; + + size = g_bookmark_file_get_size (bookmark); + uris = g_bookmark_file_get_uris (bookmark, &uris_len); + + g_assert_cmpint (uris_len, ==, size); + + for (i = 0; i < uris_len; i++) + { + g_assert (g_bookmark_file_has_item (bookmark, uris[i])); + error = NULL; + mime = g_bookmark_file_get_mime_type (bookmark, uris[i], &error); + g_assert (mime != NULL); + g_assert_no_error (error); + g_free (mime); + } + g_strfreev (uris); + + g_assert (!g_bookmark_file_has_item (bookmark, "file:///no/such/uri")); + error = NULL; + mime = g_bookmark_file_get_mime_type (bookmark, "file:///no/such/uri", &error); + g_assert (mime == NULL); + g_assert_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND); + g_error_free (error); + g_free (mime); +} + +static gboolean +test_modify (GBookmarkFile *bookmark) +{ + gchar *text; + guint count; + time_t stamp; + time_t now; + GError *error = NULL; + gchar **groups; + gsize length; + gchar **apps; + gchar *icon; + gchar *mime; + + if (g_test_verbose ()) + 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); + if (g_test_verbose ()) + g_print ("ok\n"); + + if (g_test_verbose ()) + 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"); + g_bookmark_file_set_is_private (bookmark, TEST_URI_0, TRUE); + time (&now); + g_bookmark_file_set_added (bookmark, TEST_URI_0, now); + g_bookmark_file_set_modified (bookmark, TEST_URI_0, now); + g_bookmark_file_set_visited (bookmark, TEST_URI_0, now); + g_bookmark_file_set_icon (bookmark, TEST_URI_0, "testicon", "image/png"); + + 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); + text = g_bookmark_file_get_description (bookmark, TEST_URI_0, &error); + g_assert_no_error (error); + g_assert_cmpstr (text, ==, "a description"); + g_free (text); + g_assert (g_bookmark_file_get_is_private (bookmark, TEST_URI_0, &error)); + g_assert_no_error (error); + stamp = g_bookmark_file_get_added (bookmark, TEST_URI_0, &error); + g_assert_no_error (error); + g_assert (stamp == now); + stamp = g_bookmark_file_get_modified (bookmark, TEST_URI_0, &error); + g_assert_no_error (error); + g_assert (stamp == now); + stamp = g_bookmark_file_get_visited (bookmark, TEST_URI_0, &error); + g_assert_no_error (error); + g_assert (stamp == now); + g_assert (g_bookmark_file_get_icon (bookmark, TEST_URI_0, &icon, &mime, &error)); + g_assert_no_error (error); + g_assert_cmpstr (icon, ==, "testicon"); + g_assert_cmpstr (mime, ==, "image/png"); + g_free (icon); + g_free (mime); + if (g_test_verbose ()) + g_print ("ok\n"); + + if (g_test_verbose ()) + 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_bookmark_file_get_is_private (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_bookmark_file_get_added (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_bookmark_file_get_modified (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_bookmark_file_get_visited (bookmark, TEST_URI_1, &error); + g_assert_error (error, G_BOOKMARK_FILE_ERROR, G_BOOKMARK_FILE_ERROR_URI_NOT_FOUND); + g_clear_error (&error); + if (g_test_verbose ()) + g_print ("ok\n"); + + if (g_test_verbose ()) + g_print ("\t=> check application..."); + g_bookmark_file_set_mime_type (bookmark, TEST_URI_0, TEST_MIME); + g_assert (!g_bookmark_file_has_application (bookmark, TEST_URI_0, TEST_APP_NAME, NULL)); + 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)); + 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_assert (g_bookmark_file_remove_application (bookmark, TEST_URI_0, TEST_APP_NAME, &error)); + g_assert_no_error (error); + g_bookmark_file_add_application (bookmark, TEST_URI_0, TEST_APP_NAME, TEST_APP_EXEC); + apps = g_bookmark_file_get_applications (bookmark, TEST_URI_0, &length, &error); + g_assert_no_error (error); + g_assert_cmpint (length, ==, 1); + g_assert_cmpstr (apps[0], ==, TEST_APP_NAME); + g_strfreev (apps); + + 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); + + if (g_test_verbose ()) + g_print ("ok\n"); + + if (g_test_verbose ()) + g_print ("\t=> check groups..."); + g_assert (!g_bookmark_file_has_group (bookmark, TEST_URI_1, "Test", NULL)); + g_bookmark_file_add_group (bookmark, TEST_URI_1, "Test"); + g_assert (g_bookmark_file_has_group (bookmark, TEST_URI_1, "Test", NULL)); + g_assert (!g_bookmark_file_has_group (bookmark, TEST_URI_1, "Fail", NULL)); + g_assert (g_bookmark_file_remove_group (bookmark, TEST_URI_1, "Test", &error)); + g_assert_no_error (error); + groups = g_bookmark_file_get_groups (bookmark, TEST_URI_1, NULL, &error); + g_assert_cmpint (g_strv_length (groups), ==, 0); + g_strfreev (groups); + groups = g_new0 (gchar *, 3); + groups[0] = "Group1"; + groups[1] = "Group2"; + groups[2] = NULL; + g_bookmark_file_set_groups (bookmark, TEST_URI_1, (const gchar **)groups, 2); + g_free (groups); + groups = g_bookmark_file_get_groups (bookmark, TEST_URI_1, &length, &error); + g_assert_cmpint (length, ==, 2); + g_strfreev (groups); + g_assert_no_error (error); + + if (g_test_verbose ()) + g_print ("ok\n"); + + if (g_test_verbose ()) + 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); + if (g_test_verbose ()) + g_print ("ok\n"); + + return TRUE; +} + +static void +test_file (gconstpointer d) +{ + const gchar *filename = d; + GBookmarkFile *bookmark_file; + gboolean success; + gchar *data; + GError *error; + + bookmark_file = g_bookmark_file_new (); + g_assert (bookmark_file != NULL); + + success = test_load (bookmark_file, filename); + + if (success) + { + test_query (bookmark_file); + test_modify (bookmark_file); + + error = NULL; + data = g_bookmark_file_to_data (bookmark_file, NULL, &error); + g_assert_no_error (error); + /* FIXME do some checks on data */ + g_free (data); + } + + g_bookmark_file_free (bookmark_file); + + g_assert (success == (strstr (filename, "fail") == NULL)); +} + +int +main (int argc, char *argv[]) +{ + GDir *dir; + GError *error; + const gchar *name; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + if (argc > 1) + { + test_file (argv[1]); + return 0; + } + + error = NULL; + dir = g_dir_open (SRCDIR "/bookmarks", 0, &error); + g_assert_no_error (error); + while ((name = g_dir_read_name (dir)) != NULL) + { + path = g_strdup_printf ("/bookmarks/parse/%s", name); + g_test_add_data_func_full (path, g_build_filename (SRCDIR, "bookmarks", name, NULL), + test_file, g_free); + g_free (path); + } + g_dir_close (dir); + + return g_test_run (); +} diff --git a/glib/tests/bookmarks.xbel b/glib/tests/bookmarks.xbel new file mode 100644 index 0000000..969332e --- /dev/null +++ b/glib/tests/bookmarks.xbel @@ -0,0 +1,23 @@ + + + + + Desktop Bookmarks Spec + + + text/xml + + + + + + Editors + + + + + + diff --git a/glib/tests/bookmarks/fail-03.xbel b/glib/tests/bookmarks/fail-03.xbel new file mode 100644 index 0000000..563dd54 --- /dev/null +++ b/glib/tests/bookmarks/fail-03.xbel @@ -0,0 +1,18 @@ + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-04.xbel b/glib/tests/bookmarks/fail-04.xbel new file mode 100644 index 0000000..86f1e90 --- /dev/null +++ b/glib/tests/bookmarks/fail-04.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-05.xbel b/glib/tests/bookmarks/fail-05.xbel new file mode 100644 index 0000000..355f172 --- /dev/null +++ b/glib/tests/bookmarks/fail-05.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file & containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-06.xbel b/glib/tests/bookmarks/fail-06.xbel new file mode 100644 index 0000000..d1e288b --- /dev/null +++ b/glib/tests/bookmarks/fail-06.xbel @@ -0,0 +1,19 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-07.xbel b/glib/tests/bookmarks/fail-07.xbel new file mode 100644 index 0000000..8e24c64 --- /dev/null +++ b/glib/tests/bookmarks/fail-07.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-08.xbel b/glib/tests/bookmarks/fail-08.xbel new file mode 100644 index 0000000..d26f752 --- /dev/null +++ b/glib/tests/bookmarks/fail-08.xbel @@ -0,0 +1,18 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + diff --git a/glib/tests/bookmarks/fail-09.xbel b/glib/tests/bookmarks/fail-09.xbel new file mode 100644 index 0000000..5e1ce64 --- /dev/null +++ b/glib/tests/bookmarks/fail-09.xbel @@ -0,0 +1,20 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-10.xbel b/glib/tests/bookmarks/fail-10.xbel new file mode 100644 index 0000000..f4eef12 --- /dev/null +++ b/glib/tests/bookmarks/fail-10.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-11.xbel b/glib/tests/bookmarks/fail-11.xbel new file mode 100644 index 0000000..520693b --- /dev/null +++ b/glib/tests/bookmarks/fail-11.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + & + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-12.xbel b/glib/tests/bookmarks/fail-12.xbel new file mode 100644 index 0000000..9ba280e --- /dev/null +++ b/glib/tests/bookmarks/fail-12.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-13.xbel b/glib/tests/bookmarks/fail-13.xbel new file mode 100644 index 0000000..cdd1aff --- /dev/null +++ b/glib/tests/bookmarks/fail-13.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/glib/tests/bookmarks/fail-14.xbel b/glib/tests/bookmarks/fail-14.xbel new file mode 100644 index 0000000..2161632 --- /dev/null +++ b/glib/tests/bookmarks/fail-14.xbel @@ -0,0 +1,24 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test + + + + + diff --git a/glib/tests/bookmarks/fail-15.xbel b/glib/tests/bookmarks/fail-15.xbel new file mode 100644 index 0000000..9a2ac12 --- /dev/null +++ b/glib/tests/bookmarks/fail-15.xbel @@ -0,0 +1,23 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test + + + + diff --git a/glib/tests/bookmarks/fail-16.xbel b/glib/tests/bookmarks/fail-16.xbel new file mode 100644 index 0000000..18f55b3 --- /dev/null +++ b/glib/tests/bookmarks/fail-16.xbel @@ -0,0 +1,24 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + Test
+ + + + + diff --git a/glib/tests/bookmarks/fail-17.xbel b/glib/tests/bookmarks/fail-17.xbel new file mode 100644 index 0000000..9ad97bd --- /dev/null +++ b/glib/tests/bookmarks/fail-17.xbel @@ -0,0 +1,22 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + + diff --git a/glib/tests/bookmarks/valid-01.xbel b/glib/tests/bookmarks/valid-01.xbel new file mode 100644 index 0000000..6ab98ba --- /dev/null +++ b/glib/tests/bookmarks/valid-01.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/valid-02.xbel b/glib/tests/bookmarks/valid-02.xbel new file mode 100644 index 0000000..85a84a0 --- /dev/null +++ b/glib/tests/bookmarks/valid-02.xbel @@ -0,0 +1,15 @@ + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bookmarks/valid-03.xbel b/glib/tests/bookmarks/valid-03.xbel new file mode 100644 index 0000000..32f431d --- /dev/null +++ b/glib/tests/bookmarks/valid-03.xbel @@ -0,0 +1,21 @@ + + + + Singleton + A file containing a single bookmark element + + + + + + + + + + + diff --git a/glib/tests/bytes.c b/glib/tests/bytes.c new file mode 100644 index 0000000..044450d --- /dev/null +++ b/glib/tests/bytes.c @@ -0,0 +1,358 @@ +/* + * Copyright 2011 Collabora Ltd. + * + * 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. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include "glib.h" + +static const gchar *NYAN = "nyannyan"; +static const gsize N_NYAN = 8; + +static void +test_new (void) +{ + const gchar *data; + GBytes *bytes; + gsize size; + + data = "test"; + bytes = g_bytes_new (data, 4); + g_assert (bytes != NULL); + g_assert (g_bytes_get_data (bytes, &size) != data); + g_assert_cmpuint (size, ==, 4); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 4); + g_assert (memcmp (data, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes)) == 0); + + g_bytes_unref (bytes); +} + +static void +test_new_take (void) +{ + gchar *data; + GBytes *bytes; + gsize size; + + data = g_strdup ("test"); + bytes = g_bytes_new_take (data, 4); + g_assert (bytes != NULL); + g_assert (g_bytes_get_data (bytes, &size) == data); + g_assert_cmpuint (size, ==, 4); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 4); + + g_bytes_unref (bytes); +} + +static void +test_new_static (void) +{ + const gchar *data; + GBytes *bytes; + gsize size; + + data = "test"; + bytes = g_bytes_new_static (data, 4); + g_assert (bytes != NULL); + g_assert (g_bytes_get_data (bytes, &size) == data); + g_assert_cmpuint (size, ==, 4); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 4); + + g_bytes_unref (bytes); +} + +static void +test_new_from_bytes (void) +{ + const gchar *data = "smile and wave"; + GBytes *bytes; + GBytes *sub; + + bytes = g_bytes_new (data, 14); + sub = g_bytes_new_from_bytes (bytes, 10, 4); + + g_assert (sub != NULL); + g_assert (g_bytes_get_data (sub, NULL) == ((gchar *)g_bytes_get_data (bytes, NULL)) + 10); + g_assert (g_bytes_get_size (sub) == 4); + g_bytes_unref (bytes); + + g_assert (memcmp (g_bytes_get_data (sub, NULL), "wave", 4) == 0); + g_bytes_unref (sub); +} + +static void +on_destroy_increment (gpointer data) +{ + gint *count = data; + g_assert (count != NULL); + (*count)++; +} + +static void +test_new_with_free_func (void) +{ + GBytes *bytes; + gchar *data; + gint count = 0; + gsize size; + + data = "test"; + bytes = g_bytes_new_with_free_func (data, 4, on_destroy_increment, &count); + g_assert (bytes != NULL); + g_assert_cmpint (count, ==, 0); + g_assert (g_bytes_get_data (bytes, &size) == data); + g_assert_cmpuint (size, ==, 4); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 4); + + g_bytes_unref (bytes); + g_assert_cmpuint (count, ==, 1); +} + +static void +test_hash (void) +{ + GBytes *bytes1; + GBytes *bytes2; + guint hash1; + guint hash2; + + bytes1 = g_bytes_new ("blah", 4); + bytes2 = g_bytes_new ("blah", 4); + + hash1 = g_bytes_hash (bytes1); + hash2 = g_bytes_hash (bytes2); + g_assert (hash1 == hash2); + + g_bytes_unref (bytes1); + g_bytes_unref (bytes2); +} + +static void +test_equal (void) +{ + GBytes *bytes; + GBytes *bytes2; + + bytes = g_bytes_new ("blah", 4); + + bytes2 = g_bytes_new ("blah", 4); + g_assert (g_bytes_equal (bytes, bytes2)); + g_assert (g_bytes_equal (bytes2, bytes)); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("bla", 3); + g_assert (!g_bytes_equal (bytes, bytes2)); + g_assert (!g_bytes_equal (bytes2, bytes)); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("true", 4); + g_assert (!g_bytes_equal (bytes, bytes2)); + g_assert (!g_bytes_equal (bytes2, bytes)); + g_bytes_unref (bytes2); + + g_bytes_unref (bytes); +} + +static void +test_compare (void) +{ + GBytes *bytes; + GBytes *bytes2; + + bytes = g_bytes_new ("blah", 4); + + bytes2 = g_bytes_new ("blah", 4); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), ==, 0); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("bla", 3); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), >, 0); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("abcd", 4); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), >, 0); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("blahblah", 8); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), <, 0); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("zyx", 3); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), <, 0); + g_bytes_unref (bytes2); + + bytes2 = g_bytes_new ("zyxw", 4); + g_assert_cmpint (g_bytes_compare (bytes, bytes2), <, 0); + g_bytes_unref (bytes2); + + g_bytes_unref (bytes); +} + +static void +test_to_data_transferred (void) +{ + gconstpointer memory; + gpointer data; + gsize size; + GBytes *bytes; + + /* Memory transferred: one reference, and allocated with g_malloc */ + bytes = g_bytes_new (NYAN, N_NYAN); + memory = g_bytes_get_data (bytes, NULL); + data = g_bytes_unref_to_data (bytes, &size); + g_assert (data == memory); + g_assert_cmpuint (size, ==, N_NYAN); + g_assert (memcmp (data, NYAN, N_NYAN) == 0); + g_free (data); +} + +static void +test_to_data_two_refs (void) +{ + gconstpointer memory; + gpointer data; + gsize size; + GBytes *bytes; + + /* Memory copied: two references */ + bytes = g_bytes_new (NYAN, N_NYAN); + bytes = g_bytes_ref (bytes); + memory = g_bytes_get_data (bytes, NULL); + data = g_bytes_unref_to_data (bytes, &size); + g_assert (data != memory); + g_assert_cmpuint (size, ==, N_NYAN); + g_assert (memcmp (data, NYAN, N_NYAN) == 0); + g_free (data); + g_assert (g_bytes_get_data (bytes, &size) == memory); + g_assert_cmpuint (size, ==, N_NYAN); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, N_NYAN); + g_bytes_unref (bytes); +} + +static void +test_to_data_non_malloc (void) +{ + gpointer data; + gsize size; + GBytes *bytes; + + /* Memory copied: non malloc memory */ + bytes = g_bytes_new_static (NYAN, N_NYAN); + g_assert (g_bytes_get_data (bytes, NULL) == NYAN); + data = g_bytes_unref_to_data (bytes, &size); + g_assert (data != (gpointer)NYAN); + g_assert_cmpuint (size, ==, N_NYAN); + g_assert (memcmp (data, NYAN, N_NYAN) == 0); + g_free (data); +} + +static void +test_to_array_transferred (void) +{ + gconstpointer memory; + GByteArray *array; + GBytes *bytes; + + /* Memory transferred: one reference, and allocated with g_malloc */ + bytes = g_bytes_new (NYAN, N_NYAN); + memory = g_bytes_get_data (bytes, NULL); + array = g_bytes_unref_to_array (bytes); + g_assert (array != NULL); + g_assert (array->data == memory); + g_assert_cmpuint (array->len, ==, N_NYAN); + g_assert (memcmp (array->data, NYAN, N_NYAN) == 0); + g_byte_array_unref (array); +} + +static void +test_to_array_two_refs (void) +{ + gconstpointer memory; + GByteArray *array; + GBytes *bytes; + gsize size; + + /* Memory copied: two references */ + bytes = g_bytes_new (NYAN, N_NYAN); + bytes = g_bytes_ref (bytes); + memory = g_bytes_get_data (bytes, NULL); + array = g_bytes_unref_to_array (bytes); + g_assert (array != NULL); + g_assert (array->data != memory); + g_assert_cmpuint (array->len, ==, N_NYAN); + g_assert (memcmp (array->data, NYAN, N_NYAN) == 0); + g_byte_array_unref (array); + g_assert (g_bytes_get_data (bytes, &size) == memory); + g_assert_cmpuint (size, ==, N_NYAN); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, N_NYAN); + g_bytes_unref (bytes); +} + +static void +test_to_array_non_malloc (void) +{ + GByteArray *array; + GBytes *bytes; + + /* Memory copied: non malloc memory */ + bytes = g_bytes_new_static (NYAN, N_NYAN); + g_assert (g_bytes_get_data (bytes, NULL) == NYAN); + array = g_bytes_unref_to_array (bytes); + g_assert (array != NULL); + g_assert (array->data != (gpointer)NYAN); + g_assert_cmpuint (array->len, ==, N_NYAN); + g_assert (memcmp (array->data, NYAN, N_NYAN) == 0); + g_byte_array_unref (array); +} + +static void +test_null (void) +{ + GBytes *bytes; + gpointer data; + gsize size; + + bytes = g_bytes_new (NULL, 0); + + data = g_bytes_unref_to_data (bytes, &size); + + g_assert (data == NULL); + g_assert (size == 0); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugs.gnome.org/"); + + g_test_add_func ("/bytes/new", test_new); + g_test_add_func ("/bytes/new-take", test_new_take); + g_test_add_func ("/bytes/new-static", test_new_static); + g_test_add_func ("/bytes/new-with-free-func", test_new_with_free_func); + g_test_add_func ("/bytes/new-from-bytes", test_new_from_bytes); + g_test_add_func ("/bytes/hash", test_hash); + g_test_add_func ("/bytes/equal", test_equal); + g_test_add_func ("/bytes/compare", test_compare); + g_test_add_func ("/bytes/to-data/transfered", test_to_data_transferred); + g_test_add_func ("/bytes/to-data/two-refs", test_to_data_two_refs); + g_test_add_func ("/bytes/to-data/non-malloc", test_to_data_non_malloc); + g_test_add_func ("/bytes/to-array/transfered", test_to_array_transferred); + g_test_add_func ("/bytes/to-array/two-refs", test_to_array_two_refs); + g_test_add_func ("/bytes/to-array/non-malloc", test_to_array_non_malloc); + g_test_add_func ("/bytes/null", test_null); + + return g_test_run (); +} diff --git a/glib/tests/cache.c b/glib/tests/cache.c new file mode 100644 index 0000000..e80c5af --- /dev/null +++ b/glib/tests/cache.c @@ -0,0 +1,167 @@ +/* Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +static gint value_create_count = 0; +static gint value_destroy_count = 0; + +static gpointer +value_create (gpointer key) +{ + gint *value; + + value_create_count++; + + value = g_new (gint, 1); + *value = *(gint*)key * 2; + + return value; +} + +static void +value_destroy (gpointer value) +{ + value_destroy_count++; + g_free (value); +} + +static gpointer +key_dup (gpointer key) +{ + gint *newkey; + + newkey = g_new (gint, 1); + *newkey = *(gint*)key; + + return newkey; +} + +static void +key_destroy (gpointer key) +{ + g_free (key); +} + +static guint +key_hash (gconstpointer key) +{ + return *(guint*)key; +} + +static guint +value_hash (gconstpointer value) +{ + return *(guint*)value; +} + +static gboolean +key_equal (gconstpointer key1, gconstpointer key2) +{ + return *(gint*)key1 == *(gint*)key2; +} + +static void +key_foreach (gpointer valuep, gpointer keyp, gpointer data) +{ + gint *count = data; + gint *key = keyp; + + (*count)++; + + g_assert_cmpint (*key, ==, 2); +} + +static void +value_foreach (gpointer keyp, gpointer nodep, gpointer data) +{ + gint *count = data; + gint *key = keyp; + + (*count)++; + + g_assert_cmpint (*key, ==, 2); +} + +static void +test_cache_basic (void) +{ + GCache *c; + gint *key; + gint *value; + gint count; + + value_create_count = 0; + value_destroy_count = 0; + + c = g_cache_new (value_create, value_destroy, + key_dup, key_destroy, + key_hash, value_hash, key_equal); + + key = g_new (gint, 1); + *key = 2; + + value = g_cache_insert (c, key); + g_assert_cmpint (*value, ==, 4); + g_assert_cmpint (value_create_count, ==, 1); + g_assert_cmpint (value_destroy_count, ==, 0); + + count = 0; + g_cache_key_foreach (c, key_foreach, &count); + g_assert_cmpint (count, ==, 1); + + count = 0; + g_cache_value_foreach (c, value_foreach, &count); + g_assert_cmpint (count, ==, 1); + + value = g_cache_insert (c, key); + g_assert_cmpint (*value, ==, 4); + g_assert_cmpint (value_create_count, ==, 1); + g_assert_cmpint (value_destroy_count, ==, 0); + + g_cache_remove (c, value); + g_assert_cmpint (value_create_count, ==, 1); + g_assert_cmpint (value_destroy_count, ==, 0); + + g_cache_remove (c, value); + g_assert_cmpint (value_create_count, ==, 1); + g_assert_cmpint (value_destroy_count, ==, 1); + + value = g_cache_insert (c, key); + g_assert_cmpint (*value, ==, 4); + g_assert_cmpint (value_create_count, ==, 2); + g_assert_cmpint (value_destroy_count, ==, 1); + + g_cache_remove (c, value); + g_cache_destroy (c); + g_free (key); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/cache/basic", test_cache_basic); + + return g_test_run (); + +} diff --git a/glib/tests/checksum.c b/glib/tests/checksum.c new file mode 100644 index 0000000..4823c99 --- /dev/null +++ b/glib/tests/checksum.c @@ -0,0 +1,1028 @@ +#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. + */ + +static const char 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" +}; + +const gchar *SHA512_sums[] = { + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", + "b2396a002fe7aec008808687d7cbacb340b7f7a090008382f3c95870f6fb10415f61f5737c102d4bfec58fe525407ea2001e761dab1da8a501d9523921f0ec21", + "11ee0d7b40a7a4dd95f63b8c2a9a36b77daee5ca7d46fb5cb7f871db29650ce9c78306ec1fa9c4075ad0615a7f9e63697dd05cf79cedcdecc82cade38ce7638a", + "d1eb8fca18f1ed13c254f228435ba23ba203b42d6fb38bf84aaae54760a3964e671149b5d10317a0d3ecdcd0021053e6c596fb0b05c33214cfd5455d325ab53e", + "a4b96da738e2cf6a3d127a0ec33725a6953aa44140ad820415aab4ab3d2baf67d7c260b36d3c6d479e85cb3b0d00b54a555e41993519eeb594cb7796eb9aecec", + "c9401760fc70ce01607f7d635a8b71ff2985d543ac715e772c2252967537772392eeb9884af7a8685b099628df73650b05b5511997eafd0627c8a47d5f16cbf5", + "f8243bcab27b16f47c58d10a486775e02eae948cbb650ff22e68e501e41b78a0784abfe67b2992d5acd0d5ee4b18e495870e1189e4e9f256066fb1e28149a97d", + "dd8519e311bff211839edb8a822b6434e15d2c4e3beeb529d43646f7fcc710b393f4f7a6c928e660817e3fd70b280e9e7128a6d3b0a431f4f4dbef4b1527f35e", + "c643d169d3e822e42f2b60d2bf48b36d6bf1d8d8bbd0c18fb00fa4fca79faa6f0d3633a0ce7a2fd62fa332712a45feeedbfd4c5cbdc30f743979aec79fdf6286", + "bbedb9d77e386908fbce019fed3f8237b6c95b13137948844d68347116d2caf7a495a9f34af79cd762bba0190e1900afe3e922b5162ff77f265ccbd275718183", + "b6084d61c87ea222d8f7506fad7b7250741f34ad8a075df75c18a31ef380385587474991c3256cd8e464c0594d45c6d1505ac5fd50289731089f86bc1bf4cd5b", + "4f4fbc4b5702df96d75ef959d5aeb32a7c74dfc14358d79a473e92bc16f4848262409f35fbb2d169ce7b7f16cc9f5d661860c6393c0ad2a2b25907e177324573", + "1548bfb55f25295008b7f6e11cfab72bd7b4525902897747b585e94c7dc4b9baaca57032e2139df5fc8fbfd5f82115327db42ee15b87052f679de6a586eef4b5", + "51020dc906ee7a3fb202099269dfbdfc01e2a8477f474db279edc23b90da683de99b7c0c5367086508a89a5c76ad1ea8ed05456ddab592a5135497e92f12348b", + "a7a3e5d22ab9ec75d7e15aed5742d4c83569279f2f9c61076ebd9ca13f3c8842642df2ee03f81646ac1dbddd29a53ef816a350e662977c73b3a051a56df01965", + "c5c60fce714297d6ea30f078756b33b11bed89e69513ed900a91885c14141184bb32b65936cddd3432ace744bdab8b0fc46b0542cbad0d96726c5325ab6b148a", + "29e6100e1107481303663798fa0195a4f56cd410f52087a9b877c742fdadb293473d91b3ad3a6606a75f3b8787fefa68e94f1129bad7c77f6df251fd5b82d96e", + "bc26056e51dd3ee0747b21ba6fe7467a1256b81a595d4165e33b13810a0807b9c04b98e444aed600afff7bea013e362657090b41a10652d5d9dc8ce766f4ce7a", + "40c4a4640176132297ff0b5db944e86e0fcdc823ea2e3d30265f9889edff943b63839451d783bbd853653956ae6e9763534270539deb4bb77d814fba5f56a879", + "015e6d23e760f612cca616c54f110cb12dd54213f1e046c7607081372402eff4936b379296ed549236020afb37bd3e728a044a4243754f095498c98bc24f77e0", + "55af8ef14b57edd35334323adac3fe07e7f4de338c05877f2cc94a11da5b4291e2d4c10f1ba7e1c01b20648e8c8dde2f3df22aaa3bcbcc888e3796b1118e6679", + "aece539289caee7baa30fb7915464d12d4d2929acfcf0e12b1f81d76be8967a83b051801bdeb38a62eda5bad70cb98391d8d6767ff3f78900c18e26d9c829331", + "bf08cdc2b15698e4cb5f7ec837a7fa3630a0acac52d866b9ecf7e10083d4913bd46afdc91216f922fbae5b6e58116e9fdbde2f41dd32a0dd57bddb0455a305fc", + "5049280393cab13415d832fc7ac370e99dd413fdb7a71c213baaa98f8c45f84f892757d1b9ab6a181c84ba880b528768f32d907e89f4e0e003838c4f4f005024", + "8d81d423f7c11167a3f016489758ccf4fcb45aa1c916566352f5a0a94ea565d8120c868cf93b38e2f41b16a350fa607edaa288017f541ba36b45b55262efcadd", + "4b4c254dd0bc5c4a1a70900bc9eea84c852e11ac3d16f87f1d3aaff0478e46ee58c264d4aea58d2ce1b08e84bd7bbbf032e99521f60fcec637abdb243977dd7c", + "afc85167cf33d21418e021a4946801b91bc103c8b2d4a53e01b2a237c293915615b9f2504d117399a4eec2578683c91304a608745db331a2dd7dfa9ccf7352ef", + "a435a6f9d0bc4b66e3b62becfb3ea1cbee93b78707847e9219bc62327d9d8aedb48b765e99f5d6b334bf76aacb879d796b998b855bf6ee7db826ac16e4da693f", + "bab93872f631b5dd2be09ef4aa1c80ab92f0f3c0593c901a46a04fd2a19e8cc36fa827380da7fc663aa79e2421a6256b5b7106b15823ae49e674950b94747883", + "815fdc6d15a1ab485f274638d92442af5ad5db11200b67180bc29dcf70e0598255503431e13c7e6dea4488402f112c4574ca93df4b8b0e07f28ce3d5ff64393f", + "ad6f2a6ac5dfc9ed273c1e18f2d16c14221843ff9c2092a30108ddc127cc43c3252f821d599a5d0bb3e66eb40b59d3537ff5a90f3356f78b7075bd9a671bb30c", + "b13effea3bd3444f360ae4aaca1fd334b23a46a9d8ad64bd88de51589b80a745f794456e612921be4f4e819cf2f7661241bcb2b19afa9917ad87802008243f8c", + "afea68e278d0da3a9f07d0591dee8acee064de85ff63644f2da7e92947e4c73fa7ad2db9b2d2bb1d0b27fe16cfd274d3b230d7fc89c3159be40a8e5d2ef1fc5d", + "ca148b59a34ca4c558ccce905d557babdfa9eb8264097cc50f230d3853b5139838b52d888937e0d1de33a9c6bbd11fdfb0eebb7f805d2c090f0c4aeede00df49", + "a73db6aeeaa8ec452aad71bc56da4467d4530f67ede3cde54bbab5081e732c76ea550220125fdaf4fe874c448fd7e6400f5e1a80c3ab4f733bbeac0172a833e0", + "282a28dad323190b3d2f11035cca91fdeee4a7b0c5606e28786055c5ad96dc03ea7b05dcbad19a653fa073aaac50d5170e5de5eaf266a3fde2e59ae4ad94f2f6", + "240b9cd3ac60c56da080baf790e882eca4ea75644c5967ed8266d0f1946847f0e3e243bf1189df20c990c94683d15ec6e903ede830e57e0727ef7e4066a97b0b", + "2c247a65e8b946837e79fe8a0918a997e50766b967e0d9d14f354bbd58a9db4a7672e92649a49fb2289035a14ed0892d7592a1d269b672a4ec8867c3d346aea2", + "d7c26aead784f5ff1e87045fb9137ebea95f06498da0c2a1e9ee8793fad537b1b41090e57f30acfe43594b4c6f0184d924890ee67d92615abaa3bd2624f236b1", + "4b29f8d8420e499011e18d64c1e90446c8ab2927dd774b022fbacd7552a888fe48a172679562e69838099b6761610325d587ecd4c94a8d55e1b3ec44f5207736", + "3e5a0fd20cefab3b91f0e57f2f874601305e6781c154baf4c8e6a4e09557cb404df189b0b6a8cdb655d59ed88fccf29e6459950841c739106f0a7731e17a1053", + "f07aa6f2f93be5a8122f0ad8d659ff66488f4fcfbda7f77b2f56eee4223497a1b31a93d66d251159dac5ccc343a15a85f73e5814eb7d9baeeead010ba751222e", + "edbddb6c20b0f7d250c1dc453898b0b110c819754348e8b2fde6889dd680bec51c686ba81a52963b4a716def84b3f3f4e911191c3d6c73cc7f9e060cfe05173b", + "07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb642e93a252a954f23912547d1e8a3b5ed6e1bfd7097821233fa0538f3db854fee6", + "91ea1245f20d46ae9a037a989f54f1f790f0a47607eeb8a14d12890cea77a1bbc6c7ed9cf205e67b7f2b8fd4c7dfd3a7a8617e45f3c463d481c7e586c39ac1ed", + "5e1e2c9fd51c753fe537e43c1982035b2a86c641d22a98677af89f442bda95a509a35c4fc2861ee4ca5eea20e6450902ecd116a95976b96ec37d0f58be6f84cd", + "162930d5e90bee1c86b56fffe4bafafeee94815d343bc4184f87f3ded2fa4fc44c981199d0331c79e41eb1e2008bee02639e9a0764b9c39e00a8cbcca6f43979", + "1216c818be9f2bc1bd993d29b6931a400d474ee439e5824c879e1030206d4698daff0f51977c8e701d8ffd2d0cf9a300c7f1ae547d93058695ac034fed20c3d7", + "4039837b00e37ff43c29585971a68f89414a6951aeba2ae692e6ece11a6a3e58b9d2bad15176c918aef644a576a4dd4497cd22884067f27fadef262e79ec8a9f", + "9d7c27566c55459b1a183f2698eb5ced70a298a73e10072deedc3a200e0a391d7e5fcf6a802aa12cb469cf70f928f01960df1e8d7471c0b8ab3c572403a30098", + "b733d09fbc2b5266f4d113e1f260994f58771ac555145ae33f737ae814adf91738f37b3a982e6071d226846261c6f1440655d167c5ce04df4eba23f62a661996", + "e94f8fac70a3b7a4c0d29946e7c6433d29a749cd8f165938e8b13dadc0901b198ff6b4395c2ac802083dce48422ec3aa455d612bb379bcb0e9ff5216418acf6d", + "0039c0e979793cfa23748b7cf7a2e3982eba9aef9a301575d50f332fe20a960f300511460b6ae7645ba9b656416aa781e833ebbeb6ba9bbe5f7f643c9a156d59", + "cee648b7c0b14c531a64e6026e97adfa8d2b71f1c89985a7bac502b552eb4986bf2dcccbbe6e68040818232398d70508f90d37ec6576d216b733a7b52de78bd6", + "f96caca679e2776a8933ccfaf848f58ed1de564fcbce00ddccdbf7bdf9819f1fb06574c34323009cdb5b0ef430d90e08e4da17953d34b72bd87373de840b0299", + "7c2522efaf0251854ed9d68aed3ee646553401f87c162719b602c676d5f2f45391f7fb8d2619d3e20055435cbaa78defd51dbd95e5c351420dd62e2f53cc77d5", + "ae7572c1f8f8e89c48ea25401f79942b8cb1a0316409f29c957ac0de9b3edec509dd29baee2cbbd7fbfb81dcda750ce59d1ceed9234f4edca8194656f00831c9", + "2fbd6b7ad16da77fd307b4cd712ed70d4a21313f966fda3b6f60d73dd3cab0aaaa6c9455fc4a5103f99d80fb0490a8310c603bdbb6b925ccb14c87b1e9c2ceb7", + "3cebd0bde4ac281151020e3c944e40dc3ca9203fd8af0bd2009ded0ec50566c53f630aaca6ddd40041b1c0e6e77df43b503e37c9fe913711c03a10ef3785d54d", + "3ede082cea90fb909f21a299c1bd39494f44e9f4f614cc69d080482d12c39c6082748f7253fe9ed80cd85f09a11db35f68b453981269f4cda03728d936ac2e97", + "b60bb7fb62fcb4e673dc4c5b8c5c8ec3a9c31569f6b3425043cbe7814508373c5a07fad5d27c090ba61de97a1a3596370c77feac711af76c80f7795004de81b4", + "e7a60093f04ca5cca156ed165bb2b4cf7cc0bc538240fd121bea824f7ea309a362d1e5deb15550fe7ae56e533f99f290c5a570913e537605c53dbb525284cf54", + "e4d0de74f09f714ed7b97667f4c462f3b4b7802b1cd6698fd7d1ad97c0eb09bc39fda853f1fcca9570767738e576215bfd7ee76ac72d1da5280b582296329f24", + "f02f601c2c27fd84b75a643c8ee26e6d4421140f75d2af30709e621ef198e05615bd6b568a4f67c70f9fe898c7cd3026e3379dafb01d969dacb20049d62c4682", + "291aea713e6c8567bfaae8fa6b2711557320ffeb44ad3ded077abffde0bfec8fc9c6cb86aab677a4d99b6e150408b7a8d4bac9c876c9335e07cc25ab49162767", + "139f3f4d4009be42ae62422718bc65ae0c416916b6761b5c2a80b2b55be51cd243eeac5caee9b2bbee20f3e55a91365b86199d3fc0557db3db979219f5839bdd", + "187249bab389e589bef61e903e2c7e016d94cb0ca2491d07fe4bf2e0484ae5640145de666e0cfb577d4d60953fb9ac75db0c07dad4e3f7dfa1bc30619c88cdfb", + "bef11c0d3c5267ddfecacfee56913fb60679ea346470f6d045b48535df4a56be6edd3a57ee9c48045f8a321b4fed4cf613474220764998526541b5ae401cb1d0", + "c40ccf026171ba822e721e2ba3862cbbfd8331db99f4f580bd0388ba75f2f89b929a1ec80fc19945c0ef79fbd5b92de0cd772418ffd0c8147e1306680a9663b5", + "7c35d4fd4a95464d5191a3f5e9f3edb8893c66d5891dee0a53038a2222432a6ee88d3f887e1348beab0008472f8df84d178da7c584a00d2db43c1535203da390", + "e2de986a6b5c8ef705c59a8eda38e1855e6896e948cbdbd6042d934341a4777645d39cd8969f53415ab900138fad8a8543bc87c7371d32bc9c97566d0774aba8", + "b13c9913ec130f5bf2e40adc283a96ae4903d71782279cb8794e926abc82937e01a2cff494f4d168506341b492642dd0c04a657e016f9d8d8b57b20465aeff72", + "38e89130fabdcea2f555f71ea2094005cff7e039b4a7421a7b40d56c457705e857908ec53bfe463ece568d75f75ad959868d78c5baa7cae309ffea4cfeacb380", + "ceabf765aeed49868054c62e3bbc2c00b5368d3714b7c96649b2edb26f0b6640c69b8a04097dbcdb9664cf426f0efab7ecd8269e3cac7ee8b8784424c3389d0a", + "eac764653fe8bdf0a6f876f8c27cb9dd6b986974a405e383c840f2fa359640a580905ac37753040b8801a0ae6835d3d0d9295e9ca40bbcad903a2ece091bb547", + "a5f601eda3c483432c8b34af1ca5a5b2ed75801936ec4bed7570bda19cd4a79b2c1f24e505df4ab2b91c43028555358b44f6246062ab1f60687a98c49c5a4ccb", + "254efa3bd9575a0fc856d53f8542c0cc64cbf4891b1b3ee97060d596a51ff8471d0186868af59ca50d73b8f509352c146757a5bd86f59ebcec6ee4db2fa2fded", + "b439ae6bf400df4edaea40570cf2e6478b031355a0491f94cc213b345f0794db6773cf3779e300dcf12d42a24662a9668ecbb79c87f888454354c440366f0f1d", + "f99d86d1ea7a5dde3fae3baab3f6603b7805d6818f44b724902836bc857cad8bd9f8626cfdfaff8d76b86dad3f69bde28abbe78a0dab090e6c501166343d99bc", + "5b3f6a33c7f9e80d98c0d16f18ed989acb2c723e3f84b929f07cd9eab4a9a20e736aa12ad9808daf69310c61c2e63db15904703a9fd4e3ac74933e55772ebbdf", + "1d9e66a96556fcbaca8ef242da4dcdd83d1339369bdfa9d2af0c1940396d43adc302cfde629bdd0b5ae5d8f995a558597ef11bb04bc818e807dc5b0ac0d7a730", + "3b9279b07e9574821d827cf1985039948c26329ea5767138b06b2e91b01ad64475dc88985e5f1c664655343237d97fb884e700819b61e1cf12b7ecac38207c1a", + "5631f6bcaeb487bf843cf54e12cff6d72ab5f1786bad51d9e90ead7f340387b2a271cb85aa417a0898b6a9e4f33eac155e5224152051ca21fef4f6e0b1c76a49", + "5994362806cad2c71fa69291840f5798365b238cb710aa7515c36d059e96009bfdb41155d8f9ca008b7b536ebe1c1e49b401b5334a75a4cf8e7891f3907a864f", + "bfa6a6ae5248a4668d4dcc50b1022c76d04e6aab799a77f2641e34a8df9f30a4a0fb29de6bde727d6941adf32775c2739eb4d2ad7575661a0010ed957deed45b", + "830c371d35a9590bfc897ec2d49ed52ac1df87dcb1664eec4fa4ef13bcc80b4f8cdd9cfb29ffb32e01d3e35b44094dd43a1df0081d1435b7298a2ea729453c86", + "f0fd5c15bcbfa9041e1c53754ff0b5972930be7fee568fef02de68becd088303e4dd6da8a204bb569f0d7c73e0c478816e77cac412681ecabc3a371d5afe4b56", + "b29b5852cb2d3523aa98d0ec3f94813187c2dc0993d35be9f6247810d35bf4aacb6ee5f993fccfc8c9d7d9524ffa8c01ae2042510d3ac950ee62315235fd3afe", + "1064a5e41eb6faa80f2aba180fe59c3b0f237c43d608b235382a9b22057f4d6ac91a316c4582bfafd4ea04ecc427eca886860240d88ba8af9508064e71eaa52a", + "5574086049660e7cd1d2cd4b774758df61e8499ad2a25295322639035aa4bfa29fd1e33a438e74ebe79fd0dd17a90cc0f88e9282ff5fb2205c155094057bd27e", + "07c40b39525c7c8afbba33afb909f538aeb400286488e77cdbc195a7d135dec54d419aed450b44d7ac3b05878365d35fdef5651d6d30c2d81c5b8fb106fc3334", + "2174d552a8786edd25c3d6bcedbce5fa84a80801845ac338df4bb28f6ac51f6ac9023365bbe9b21ddd568a4465ca6ea8da356286f5b2ea627a67d8833880f78a", + "5e6ca770fa9cee048a8951e4598df26d4379111b12b62743cbae5b4b19c198e9095df55efb7f478955f3ac8e060e501a709818165b8f3c73909ea2d58227412a", + "d52feecbf5c9a9fd6097cfa06ecac142cad3421e7dab3a04ef8dbcba16e21e1a9fdf2c3fcca1f510815e194e71c45f71635427fea15f7945ccde0131452acdc6", + "1bdb98a3f797482f004e98597553cc763aec2f2896f9fb0f7fc679702eb043849b6ba3984f4ed304db6cfc82ba222215b9b5dd991b6ceff53dd1f8e67759af92", + "fb5606b7f39828a91c0ec5ffb0ecff985179c612f3c5098065d696ddbf525c8a44514b8bf05b9dd0d396420ea3bf106a0bc9d08b929d44ecb83796d146eb09fd", + "3dff123b608bfec0b02118a569b55b80f7317de4bad125a9f897a5ddfff0ca8a1382e9a72afc79ae80f2cfe59e7712f4713e68663e3cdfa0d23f5fd848354523", + "d47d6576adb48d7bebac60fbde84c92bca384318e21ddc8073ad423bf2b7cb7b9939ffa0b304cd6a522186a813acf0ca8eeae6b7a01755e92662f4fa3df0de71", + "293e7812e9fd6f39f9a81e11f858f6743e4e31553b7251edf6aea5dfada1afde12bc1578572347007484fc0e591c1fde72c254c960cedbb8eaa7ac85aac3eb7a", + "1227a9c0d52a20f00d7f085e95416b3671ddfcf5b73dfd7caf7c64cf19b95d8b762a0a578600e6af971f3b97a10d7bfaa685460a9beb92942c706c547cf813cb", + "15e2c21af9d9209606e728b4ad464c108b7e386d21da4344ecdfd03cc5827432d161b14ddeb621be6c2861ff7547e011c63c490f3d809aefac7ae5162cc6d655", + "c54c0de631c7998fb2da9d3ad2f0f8a87a5f658c292ff1e76443f19a8d51e34e0465063e49086d9c891dc79cb2bc08a9611b108ff928093e6b8c985d14cdb281", + "33b2ff02a79184ef6639867bb72bdaf0c93740c36e1b5e26a0f3db94d2af7bdc323af8b10fdaa57caa08b2ba5e17f4236753e657dbc158bae140b71955bbe120", + "0462f7739cdd8690faefe555246466bedf67b7b9b7a9694ea92c28a4af4180f42cdd7839d7db5c1f8baaa6c6340b9efcab31a8c62674ff3db8f1cca965011230", + "b3f4a7006181556befd5251a56543f14e9aa479699749f949d038020111bd305a679a83dcf66e66460b970da6cccd67f1f3f4c4da99d4e52d9ee34dcad7176c0", + "bcd2deaa39624795411746e1e33101b7e44e1e9bbec7ae104f0308c6a24dfc89271a43a547a6484194dac6ab6614e974be6990ae3d8d11bbe65d27ea68ffc144", + "b2700cab398bca05a23850a5f393ef9c71eb9cead13036e93b66cb2cdb288f00e0dfe35e1a16f1039abdc7e1d7393ed3df3eda7e75e8d0de28c6ff68066b907e", + "3e99f7ef52ae5b3eb4bafe745a7bc6170b5c4a0f61f5a0dc0294254a1e87543fac10f46ebdc29a1e8ef5ae715636e0aedc578b5560ba55365eb4c28b226682ad", + "e2e67d7cb85acfb52791fce61b08d79df6f90a92dc8e0cf26b5bddf3a7deb5ce6c23a9098cb066ba065e6991a66d9449dc9166417ef86001f48b45d7718bd124", + "a038eb72223e8fbcf4040ea988b53f8aeac0b6029a85d44182c4742bd5e9e454e3470c19ba2dfdae71c2f1f31bbf543e704e0cfa55e98772c9cc056882031bad", + "82a1d1c2764f32dd54d242b26d82a559301375e74dfdc149bdb2a3c27b2fe2645d85b2aa8e6a892a846b157bf3119c6079b3512239043de0bb77eb0612ca6dd8", + "3d04e36beac7a7d845655bb52da45d80f7862fd989c256b09d6cbf654c946b8b40b0432ea43a6b60864b1addda95501518609b690265d969ee909f07f8a02f97", + "e37d5080c16d8a2ad752796482a570759f69d9274f6b55d11ffa4b3b14350edc3dff02f83fb360086a5d53b7ad68020ec781e22a05f3984afed3002743f1e3ec", + "b3133139eefd7742f993815f8171c611209b2e76900e753517c6eb6b6482ce8f98c7a2a7e02e5cf08680115884733ebe72a7cde5604aff31e00b4d82b5fc6ca6", + "b5ec00879e0c890d570c4ed0e93b32e92579df18350835db4333318e52675b54b18ff156195c9808547ab72ea36a6dfdaf478a9360668baea162ed2d665ab54e", + "1d892e3482147fb943b8029fe2c4b8e5a711a06993d6d5b3ef66e691b2aa72ce2668c501af83f94203a40b4c37465cede2dc127b7a2dfd5e300453ecca177a39", + "ebe5dae73d7539eee9b5b281cfc36b39a749f40a7e43d7508d8fc535d3b3bc9c51bf2815b63e04ca26c4225b099cead47f37c5524e5379de221e49c59d870f2b", + "67477cf7b6f426399073619c6dbb7cb0958e8e7b41e2c3591b5a716c69aaf13ff37d53d5d8baa93dcbdef3c7fc800a0c379767ce09f714983991d3568e3265cd", + "8417261aacd1ecf031d17fad6a4ae726250f62b6ef4986fdb532086b2c2fa8afea21739eb9e949662d7512c11bc5cbb558f9ccf3bf4e69b9285964edbe0d5a96", + "bc667649dd008529a9d5fa3e8bde8420786e00a63e3481976811b2e9b395df6edc6eb6182be7d91cc92e6a4dae309456a5b3ba6754c1203a50b38d287ad7ca7f", + "bcfe7aa19ae72582d859539c050dc53f18442ccaf1a08415464a669b72503b45bdb13553653ccd20399b74069f3260d43a80d6f91dced3cf09bc72b32f05ab89", + "7d3b8dc4f5dafee652db9f134111fe3d7be1383491c308a24de6d19c85f3ed3b28543e78a360f1c7dc90ecc3f4c0731293e3523372a554af290b3e5720abacb3", + "3af3fd8d186ded54088d93099079679f30b33b472ad9c45a1ef56f66f55d324a8ac19971f7e5b585c4355fae0f5bc32437376bfa240976975f4b9a8bbee7897f", + "cbe6405ce8db3c3fcc956d76def5bb3199fbafa808cab6ee399af30998b36f0c82620e9ff9d48636157aefc92e1a4526e646c885c66f4a0a7617f4bb51da5e5c", + "4b29415c4bf027830612f3a83db423949535d6b7d036a5adce3ebe824ba200037f517de8953c000d5d2481209948f4d4b8cf90d799347b90e79c6f0593169ada", + "b0cc887af7da5630f9d9771f9c8cc8539526f045c340e08e65d6fdc97d20577d57b192c4672bfc6dfca5c800933ff2fa07d160cabea90d28ead54c05c3b7a37e", + "04bcf2550faa52348d1cfcd971ee0bb7f639d68a19c3305a109fe012e66ecbdf44c57ea0788edec16630e42247da4a3fc2e7eba13e760bd4d401bc19f09071d0", + "3a9c39158f01951db962e4d7decd60cb250f14e041c1ff88205f6c9b5daad930d2affaa896f8bbf586cfa81506c8cfeb31405b9eb1c9be6ab8b2829408219b0e", + "b2fac91e5eade54d6100b7fc4cfe42fce3e22dbdf51bd613f4e8a3496ab6101159cb2e559aa4d0d650209f2eec6a02f63f15483b899dd4e5e933273b31139dab", + "5c5568e3ad468eec55a92ba557a57ac03a6235fecf1cfb55c09796afe3e927f8f9801d1d07b2df4060470bb11b09f83f34c5122eb887d9a94c0f5f145fb9e56e", + "bdab9cac7cb2ab91d14950a32e0a62c668dd91e2b8754193d146ea8672d29222c6ed5c2ea60f0a7851eb7277ee7f9cedc0489f892adde2a04ca80e038135f198", + "af3ea76bbbcaf5774bc4958b07568c837f948a5daf8a560c5755149a70614dcb64faff186217799b7589225076f2758b8cc0d84c075a1c752a09a826004bbe76", + "3b50e163d5ba96a2e7e3329340fde381a535af02fc517168a7d6d4195cf272e61768a1f3e5d45868597bb32c49380f4ba21e788c92fc6114729a44b4706ebca4", + "37dd3a8ad218aa44b07878828283301cf39da589111e5fb65298002c3a7b9f013c36128fe66f93ea72dad5d99ff42d774ae999f1e8d84d3c1fb61d78f478c329", + "670b50a1f26c26febdb8fa31e1bc9f03afe3f725bd7deefb465070de06777de9ae55479d271961265624bb25c685b48e42e72601f52391986f2b97203d983797", + "5e2c8d428816d02642bb094f9bcb0d8a3e48108c4549fa1bb7347d0d15a3d37bbc3af5ce8f9279616dcc802f142dc0e246dc76fc182c103747f5225da8cc4841", + "8e2e77fdc06eb9324f7b1d858ce6442263d880caf256bf9d62970f1ad765e81bb6a95a5bdc88fa87b37007872443952b85448ad4dbcf7ff012e2b1d44f53f699", + "8937de9272ae5f8a1ccece91f5cccf118904a5e7fd21edc9d077a6a1d312e621f4cd96f4a950b74f2f481985495c4fdbb8500c2386aba7d133486931195a06ea", + "cdc9687c2404ecd21f1f9b7fbb272fed78ade6ad8547024dcbf931258a3f3045b0d644ec402d2bd13ac7e3c883c94800ef001b797c9e5dfebce8aa44f24829dd", + "5719bee028987d23eaf51350467f153e9d440c51e1266038b4ebbcd573ac74b79008566646075e2a1a2b5a6b3a1404450cca32b0fd29dfe2f7cc7e2f4585d07c", + "2eda00c8cf9efdd46f79b95e177cb98b1d566526ec12829ff82da0a78dc047e68d6f0e776715df6fd9aed5df4168b9e33aa015552105fa0a21e8cb038d28be1b", + "d372e62ba258d701eb7fba23617d7967e5190f8114cefee27284744952f1da02e1e8de8c9dd7a9bff520a7061a18dbe99ebf33342670644129ac8190135dde78", + "5c3a473fd13763eaea52dc52e5eb6ac7e5df5c35ea8812e8be7d41293ea8ebea66bb76d8cf58680c3859f350c98b4ad6771b8c6e4cffec4622fd3ce5ad87216b", + "d206f0f3af96718772e2362df47e0f65085033820e1eed17ada51a8c880f41e0cc4b539363fe414ffdafc87cb95053a447f154567cacb94a56faf26423614973", + "933d85bb2e7a3b8bf7437ed6fcc52202d6d797a466c21bc50c74c348dc6a8e06535e8aa9fb2c309e6cb947709992f816dd89f99205909198743848d13803713b", + "e76363cd6d53d7610f4955df2acfc305337f6e3dbbfa2be6c11ac0f486149ec402dacabe810ef305fb4fa06054b03aa06cd9d512149eb52e443de3f9d442395e", + "a3e64c7cad5a7aee65dc47c3fbbd0f52289b118eee07e43e5b997d3d71577995b906a37bc4e5688b5d36e26602276e242e49bfad1f786b927ccedb627fd61401", + "7cea74c5c65aa40575672969dab244911275c73ede90543b3e19da85a038065dd971329c8c7dc23eb260bc9e5df9e6f4e4f29f6d6ffc9fac51d2d8175f7f4342", + "a4ae36fc9c75d72384ca96cfbf5dd3d55750ff1dbbfe01d71088fc86b955faf48cd6a9bd45a8ac7d429ea4eb94a5108998f05b1c69f506f8d429e415678b35f5", + "7f27474f5ecc49c4cc5c8835a408c2137c3063402e893b6fa8435158892f7cf4066ed695053bea7c394ef3877821956a89d94632b32286ad65f6b0c6b3397f6a", + "5d868eb076cbe09c47cf570d3aef8facea44af0898a11b8500161d0f6e402a9112ea2e41e28bbea388c9234529b5fae5ef74631c044df7c218efa5d82efb78e3", + "6cec12204ee0972baeeaffca5c912647af39291a7e2b81664e562ad12a2b17fd4e092cdb1197aa9f1330a0a7c8bcc7f623069d325b21b14a5803515a61dd0fb3", + "fd3393f5c582297309610f427cb14001df921bcfb0a771f37a51e6166a2fe143ca7fd329fccc47ab5766056caa4dbfa9da5f221a4ca054644cbfa939df491e3e", + "9917e3cf093607bc286cffc60269af690f4eb9f704107c906627cf3259de31d923f696628e730283b51513890ccd90c40f4bc2cb762980b7531810bd2a333882", + "95522c31784f34aea08529a4a09a283b30085cbab3843babf96f0b45f406c9b3a76b6373635074428b23e17f4977e9fcd065b44a9161a26b7fe66fd5391d6d78", + "91778a52ce45d4b77f1d91e3cdb38464ac16c880b28916733a31367a3b2015082017f767267bafaa1ae769611f05bb6b60c307fb080cdd4bf2892704e5aa1af3", + "09a1466f07160ca2da1f999236a7cc016c9be9a5f66abe80ee2694df708d58d5b572cd9c2dbedff202b940d874938caad417183e71012b77e446afb3832b809d", + "1227c21bc6e15c7bf0aec79febae2e8787b97c33c3d96c2b2fac1a43fcb841576cc4c806aec038534cbf0476cf90fedc70eca44339523904e37020c14cbf2151", + "2ed90b58e8009fafd9c7dd299547bcdea69a6c72d4af00be9a5f5d81422cfe6f275a00af7579291fba526ea0d872620f72321b5a712e08849493024422d3009e", + "64a10ff891e361e3a7919614152053bfbce6b02c8241f6551550cf704203833c538d879c8631d04656f0e67963b8b56ff546fe9a7f1ee073f0fb92259a702328", + "d4bcc92ceeeb193aae5f673d444275bc2b400116c48c8e70e5fdc19606982f574823171a6590d377399ebbff7ea66c643998b0b9a3ede9c82acef9ec4232356c", + "407d968198d56fefb39af30c26d7af2d32231c388ae8f9d68eee68a5a491be488f21ac41c2cdbd2e5a6ca5cad398662477c070d6954e8bf2447b39b471019f0b", + "38c7a0ebfefee5d4809fdb78d07626d1fbcc7a398fed72a94623c819b8320c2744de1249d5f4fd8a40da86489d9b4c4370c8dd64cb31f072b79159a2403666be", + "36d93692644eb4a082a92e6c12ac7cd91f8b064b79f6f484f40c2ba4a1071516ab4134351661f23794199e60193dae637615eb03fa3d3d988710d0dc67a2ff3e", + "05e6f04cc9fb24de203d06a65911276d3408def644d0eaabea8daa3f05924faf79e8d14161a94e1eb2cf28dfecc9dcc63aa6f820ca28a8b6a7677f9e6f89bc5a", + "b5bdf2b8009369341985a4d6920b7dd0b2bfd088968050b208d3eeef95e2444abc88227de54866c419bbfe008a91de2c6ec7f028cf7161a7335f929b09005f3c", + "d57d75ec354a3ae54aabd4a0e4c1d352426031ae401cbd6d18d5de72cddad32822f057a9aea2f64d7531540832a8fd37498f27ecac24cf70783d8ae7dbae16da", + "9eb628ff8258d6eb5ba260cbc7f66a32d0d35f72eb7d7f70614c0c4d6ba72f8bb7204f8ee704493fc798a74de6659378ba0627b8b8a88630d4220375a5906a6e", + "d992753f9de4963cf53679d6612de1987725bb9608fe23cfd6506c4d07b1efbb4bddbad542a5f4194e6d4744bf6c3eccdddabbc04d01197f2ad84c35bf885896", + "6689fd5d94a7dcb6b20bcda530db758c5d373ebfbc0f57808b95a14f45326478a0cad7a0d6ebd22f8c70e39f41f7b9610ab9b475785b93807e16059ab5dda7bf", + "93893c6b57bcec91f2d19c8668c5b59b6c5a66492b71770e914ff30489a6efa7f030fd42bd342d8202ce9df99c0a5ed56e1e4ab06ae0ed6d359e3b140076d5bd", + "76ca602812d40fed5cef33b7310e7b8bb5a5de549fc63219f5dabb3cc8ca70658151417e2fc041d6fa05484321be2f57bca1d0300be701031646aab039125fbc", + "0c71f03a2b3ad8765aacb895f6a19de92fbf77b0e40a61622888c2886bb5bbb8c3b4ebe4e6abae661e4f0b72aae10753d890aab9d18941fdf18078b77f187d31", + "8e2d159af8fae54ca736e3f3412d7de329631db7bb561dc0e82266c50958f22fdd7ef8181ce62e9632f7443608c1d3405503af23c804083e1058c6118bd8a52e", + "83be1fa27282e68590c15074ac8443f9f53e064ff8c5c2d65304266eab1d998fb23f180f3811c5ec5cbc88597e037f5a7b908eba287dcdbab5ae473e65325611", + "681f00cf54a854e4b2d26dfd264ea4f0695360d0f23c82a024e0403775925b2f2f9f1aed94f123a5a683241c73d4e9b6abb7473787eb48dfefbbb54d0d122a71", + "4ba62bdeee45a2f100f7d7e62482913cc64b3a8fda4c1e833568d98403d0d6a9a788d3980fcb3a9b62599403012014b3f2926e264d83c4167f9f99a1f29a9e2a", + "a40d8ae569c4a15e542d0fc9a2270b1e253a5757bf64f3769ec2c0e6a2b8f82d8934c1cc0450c1cce806b6b876de1fbafcb2e06ec4519edea2fdab9a6f54ddad", + "5430372627c0d0f0e6ed0550b77a4256640c1de9da96c7faa7606c7c1b0cbc6ab793bfd279b505bdce09b46cb7f5d73217bdc0a18240541656ee9888999c3339", + "c9d0a880ded82409ac942823379d65acfc1b11e54fd44cf0d4569eb204e372bb10d4d111915de64163031dc533715b29f14a6f910a3d58662bd13768e31c2aad", + "a326708cd8da2fab8f4b7870dda03800446f520532638ed7bf8177c509c53a65ec3127730ab2f02d3f911927d1f265d147bb53ec5cc0dfebdb68d0f50eb2aff3", + "ea381acd65980fd5eb1e8cb5b25ccae38afcfb9fa1308014bbcc96d9b80255cc8ea8225f4c6fc2477b7af3aa2c61228a9d7a6be1bd92b8687ca25b0f912757d0", + "42255ddad4f1c30ad42e85752bc3685fff22da82dd8ca85f7616112acf2c4644d40330b7e7bd4707c8094d1034cae77a503cbe20d0bbf2519bed7a758817bfae", + "9da644c289075656b5339317f7100d954b49e67e6c3f981451bf7982c52f003016470c781fa0af61a965fc0ae50f1bbc8d94ffe91e10dc09f27dbe5b1fc2827c" +}; + +typedef struct { + GChecksumType checksum_type; + const gchar *sum; + int length; +} ChecksumTest; + +static void +test_checksum (gconstpointer d) +{ + const ChecksumTest *test = d; + GChecksum *checksum; + GChecksum *checksum2; + const char *p; + int chunk_length; + + for (chunk_length = MIN (test->length, 1); chunk_length < test->length; chunk_length++) + { + checksum = g_checksum_new (test->checksum_type); + for (p = FIXED_STR; p < FIXED_STR + test->length; p += chunk_length) + { + g_checksum_update (checksum, (const guchar *)p, + MIN (chunk_length, test->length - (p - FIXED_STR))); + } + checksum2 = g_checksum_copy (checksum); + g_assert_cmpstr (g_checksum_get_string (checksum), ==, test->sum); + g_checksum_free (checksum); + + g_assert_cmpstr (g_checksum_get_string (checksum2), ==, test->sum); + g_checksum_free (checksum2); + } +} + +static gint +hexval (const gchar c) +{ + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + return c - '0'; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + return 10 + c - 'a'; + default: + return 0; + } +} + +static guint8 * +sum_to_digest (const gchar *sum, gsize *len) +{ + gsize l; + guint8 *digest; + gint i; + + g_assert (strlen (sum) % 2 == 0); + l = strlen (sum) / 2; + + digest = g_malloc (l); + for (i = 0; i < l; i++) + digest[i] = (hexval(sum[2*i]) << 4) + hexval(sum[2*i+1]); + + *len = l; + return digest; +} + +static void +test_checksum_reset (gconstpointer d) +{ + const ChecksumTest *test = d; + GChecksum *checksum; + const char *p; + int chunk_length; + guint8 *digest; + guint8 *digest2; + gsize len, len2; + + checksum = g_checksum_new (test->checksum_type); + + for (chunk_length = MIN (test->length, 1); chunk_length < test->length; chunk_length++) + { + for (p = FIXED_STR; p < FIXED_STR + test->length; p += chunk_length) + { + g_checksum_update (checksum, (const guchar *)p, + MIN (chunk_length, test->length - (p - FIXED_STR))); + } + + len2 = g_checksum_type_get_length (test->checksum_type); + digest = sum_to_digest (test->sum, &len); + g_assert_cmpint (len, ==, len2); + digest2 = g_malloc (len2); + g_checksum_get_digest (checksum, digest2, &len2); + g_assert_cmpint (len, ==, len2); + g_assert (memcmp (digest, digest2, len) == 0); + g_free (digest); + g_free (digest2); + + g_checksum_reset (checksum); + } + + g_checksum_free (checksum); +} + +typedef struct { + GChecksumType checksum_type; + const gchar **sums; +} ChecksumComputeTest; + +static void +test_checksum_string (gconstpointer d) +{ + const ChecksumComputeTest *test = d; + int length; + gchar *checksum; + + for (length = 0; length <= FIXED_LEN; length++) + { + checksum = g_compute_checksum_for_string (test->checksum_type, + FIXED_STR, + length); + g_assert_cmpstr (checksum, ==, test->sums[length]); + g_free (checksum); + } + + checksum = g_compute_checksum_for_string (test->checksum_type, + FIXED_STR, + -1); + g_assert_cmpstr (checksum, ==, test->sums[FIXED_LEN]); + g_free (checksum); +} + +static void +test_checksum_bytes (gconstpointer d) +{ + const ChecksumComputeTest *test = d; + GBytes *input; + int length; + gchar *checksum; + + for (length = 0; length <= FIXED_LEN; length++) + { + input = g_bytes_new_static (FIXED_STR, length); + checksum = g_compute_checksum_for_bytes (test->checksum_type, input); + g_bytes_unref (input); + + g_assert_cmpstr (checksum, ==, test->sums[length]); + g_free (checksum); + } +} + +static void +add_checksum_test (GChecksumType type, + const char *type_name, + const char *sum, + gint length) +{ + ChecksumTest *test; + gchar *path; + + test = g_new0 (ChecksumTest, 1); + test->checksum_type = type; + test->sum = sum; + test->length = length; + + path = g_strdup_printf ("/checksum/%s/%d", type_name, length); + g_test_add_data_func (path, test, test_checksum); + g_free (path); + + path = g_strdup_printf ("/checksum/%s/reset/%d", type_name, length); + g_test_add_data_func_full (path, test, test_checksum_reset, g_free); + g_free (path); +} + +static void +add_checksum_string_test (GChecksumType type, + const gchar *type_name, + const gchar **sums) +{ + ChecksumComputeTest *test; + gchar *path; + + test = g_new0 (ChecksumComputeTest, 1); + test->checksum_type = type; + test->sums = sums; + + path = g_strdup_printf ("/checksum/%s/string", type_name); + g_test_add_data_func_full (path, test, test_checksum_string, g_free); + g_free (path); +} + +static void +add_checksum_bytes_test (GChecksumType type, + const gchar *type_name, + const gchar **sums) +{ + ChecksumComputeTest *test; + gchar *path; + + test = g_new0 (ChecksumComputeTest, 1); + test->checksum_type = type; + test->sums = sums; + + path = g_strdup_printf ("/checksum/%s/bytes", type_name); + g_test_add_data_func_full (path, test, test_checksum_bytes, g_free); + g_free (path); +} + +static void +test_unsupported (void) +{ + g_assert_cmpint (g_checksum_type_get_length (20), ==, -1); + g_assert (g_checksum_new (20) == NULL); +} + +int +main (int argc, char *argv[]) +{ + int length; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/checksum/unsupported", test_unsupported); + + for (length = 0; length <= FIXED_LEN; length++) + add_checksum_test (G_CHECKSUM_MD5, "MD5", MD5_sums[length], length); + add_checksum_string_test (G_CHECKSUM_MD5, "MD5", MD5_sums); + add_checksum_bytes_test (G_CHECKSUM_MD5, "MD5", MD5_sums); + + for (length = 0; length <= FIXED_LEN; length++) + add_checksum_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums[length], length); + add_checksum_string_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums); + add_checksum_bytes_test (G_CHECKSUM_SHA1, "SHA1", SHA1_sums); + + for (length = 0; length <= FIXED_LEN; length++) + add_checksum_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums[length], length); + add_checksum_string_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums); + add_checksum_bytes_test (G_CHECKSUM_SHA256, "SHA256", SHA256_sums); + + for (length = 0; length <= FIXED_LEN; length++) + add_checksum_test (G_CHECKSUM_SHA512, "SHA512", SHA512_sums[length], length); + add_checksum_string_test (G_CHECKSUM_SHA512, "SHA512", SHA512_sums); + add_checksum_bytes_test (G_CHECKSUM_SHA512, "SHA512", SHA512_sums); + + return g_test_run (); +} diff --git a/glib/tests/collate.c b/glib/tests/collate.c new file mode 100644 index 0000000..a99d1f9 --- /dev/null +++ b/glib/tests/collate.c @@ -0,0 +1,231 @@ +#include +#include +#include +#include + +typedef struct { + const gchar **input; + const gchar **sorted; + const gchar **file_sorted; +} CollateTest; + +typedef struct { + gchar *key; + const gchar *str; +} Line; + +static void +clear_line (Line *line) +{ + g_free (line->key); +} + +static 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); +} + +static 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); +} + +static void +do_collate (gboolean for_file, gboolean use_key, const CollateTest *test) +{ + GArray *line_array; + Line line; + gint i; + + line_array = g_array_new (FALSE, FALSE, sizeof(Line)); + g_array_set_clear_func (line_array, (GDestroyNotify)clear_line); + + for (i = 0; test->input[i]; i++) + { + line.str = test->input[i]; + if (for_file) + line.key = g_utf8_collate_key_for_filename (line.str, -1); + else + line.key = g_utf8_collate_key (line.str, -1); + + g_array_append_val (line_array, line); + } + + qsort (line_array->data, line_array->len, sizeof (Line), use_key ? compare_key : compare_collate); + + for (i = 0; test->input[i]; i++) + { + const gchar *str; + str = g_array_index (line_array, Line, i).str; + if (for_file) + g_assert_cmpstr (str, ==, test->file_sorted[i]); + else + g_assert_cmpstr (str, ==, test->sorted[i]); + } + + g_array_free (line_array, TRUE); +} + +static void +test_collate (gconstpointer d) +{ + const CollateTest *test = d; + do_collate (FALSE, FALSE, test); +} + +static void +test_collate_key (gconstpointer d) +{ + const CollateTest *test = d; + do_collate (FALSE, TRUE, test); +} + +static void +test_collate_file (gconstpointer d) +{ + const CollateTest *test = d; + do_collate (TRUE, TRUE, test); +} + +const gchar *input0[] = { + "z", + "c", + "eer34", + "223", + "er1", + "üĠണ", + "foo", + "bar", + "baz", + "GTK+", + NULL +}; + +const gchar *sorted0[] = { + "223", + "bar", + "baz", + "c", + "eer34", + "er1", + "foo", + "GTK+", + "üĠണ", + "z", + NULL +}; + +const gchar *file_sorted0[] = { + "223", + "bar", + "baz", + "c", + "eer34", + "er1", + "foo", + "GTK+", + "üĠണ", + "z", + NULL +}; + +const gchar *input1[] = { + "file.txt", + "file2.bla", + "file.c", + "file3.xx", + "bla001", + "bla02", + "bla03", + "bla4", + "bla10", + "bla100", + "event.c", + "eventgenerator.c", + "event.h", + NULL +}; + +const gchar *sorted1[] = { + "bla001", + "bla02", + "bla03", + "bla10", + "bla100", + "bla4", + "event.c", + "eventgenerator.c", + "event.h", + "file2.bla", + "file3.xx", + "file.c", + "file.txt", + NULL +}; + +const gchar *file_sorted1[] = { + "bla001", + "bla02", + "bla03", + "bla4", + "bla10", + "bla100", + "event.c", + "event.h", + "eventgenerator.c", + "file.c", + "file.txt", + "file2.bla", + "file3.xx", + NULL +}; + +int +main (int argc, char *argv[]) +{ + gchar *path; + gint i; + const gchar *locale; + CollateTest test[2]; + + g_test_init (&argc, &argv, NULL); + + g_setenv ("LC_ALL", "en_US", TRUE); + locale = setlocale (LC_ALL, ""); + if (locale == NULL || strcmp (locale, "en_US") != 0) + { + g_test_message ("No suitable locale, skipping test"); + return 0; + } + + test[0].input = input0; + test[0].sorted = sorted0; + test[0].file_sorted = file_sorted0; + test[1].input = input1; + test[1].sorted = sorted1; + test[1].file_sorted = file_sorted1; + + for (i = 0; i < G_N_ELEMENTS (test); i++) + { + path = g_strdup_printf ("/unicode/collate/%d", i); + g_test_add_data_func (path, &test[i], test_collate); + g_free (path); + path = g_strdup_printf ("/unicode/collate-key/%d", i); + g_test_add_data_func (path, test, test_collate_key); + g_free (path); + path = g_strdup_printf ("/unicode/collate-filename/%d", i); + g_test_add_data_func (path, test, test_collate_file); + g_free (path); + } + + return g_test_run (); +} + diff --git a/glib/tests/cond.c b/glib/tests/cond.c new file mode 100644 index 0000000..4046ab0 --- /dev/null +++ b/glib/tests/cond.c @@ -0,0 +1,243 @@ +/* Unit tests for GCond + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +static GCond cond; +static GMutex mutex; +static volatile gint next; + +static void +push_value (gint value) +{ + g_mutex_lock (&mutex); + next = value; + if (g_test_verbose ()) + g_print ("Thread %p producing next value: %d\n", g_thread_self (), value); + if (value % 10 == 0) + g_cond_broadcast (&cond); + else + g_cond_signal (&cond); + g_mutex_unlock (&mutex); +} + +static gint +pop_value (void) +{ + gint value; + + g_mutex_lock (&mutex); + while (next == 0) + { + if (g_test_verbose ()) + g_print ("Thread %p waiting for cond\n", g_thread_self ()); + g_cond_wait (&cond, &mutex); + } + value = next; + next = 0; + if (g_test_verbose ()) + g_print ("Thread %p consuming value %d\n", g_thread_self (), value); + g_mutex_unlock (&mutex); + + return value; +} + +static gpointer +produce_values (gpointer data) +{ + gint total; + gint i; + + total = 0; + + for (i = 1; i < 100; i++) + { + total += i; + push_value (i); + g_usleep (1000); + } + + push_value (-1); + g_usleep (1000); + push_value (-1); + + if (g_test_verbose ()) + g_print ("Thread %p produced %d altogether\n", g_thread_self (), total); + + return GINT_TO_POINTER (total); +} + +static gpointer +consume_values (gpointer data) +{ + gint accum = 0; + gint value; + + while (TRUE) + { + value = pop_value (); + if (value == -1) + break; + + accum += value; + } + + if (g_test_verbose ()) + g_print ("Thread %p accumulated %d\n", g_thread_self (), accum); + + return GINT_TO_POINTER (accum); +} + +static GThread *producer, *consumer1, *consumer2; + +static void +test_cond1 (void) +{ + gint total, acc1, acc2; + + producer = g_thread_create (produce_values, NULL, TRUE, NULL); + consumer1 = g_thread_create (consume_values, NULL, TRUE, NULL); + consumer2 = g_thread_create (consume_values, NULL, TRUE, NULL); + + total = GPOINTER_TO_INT (g_thread_join (producer)); + acc1 = GPOINTER_TO_INT (g_thread_join (consumer1)); + acc2 = GPOINTER_TO_INT (g_thread_join (consumer2)); + + g_assert_cmpint (total, ==, acc1 + acc2); +} + +typedef struct +{ + GMutex mutex; + GCond cond; + gint limit; + gint count; +} Barrier; + +static void +barrier_init (Barrier *barrier, + gint limit) +{ + g_mutex_init (&barrier->mutex); + g_cond_init (&barrier->cond); + barrier->limit = limit; + barrier->count = limit; +} + +static gint +barrier_wait (Barrier *barrier) +{ + gint ret; + + g_mutex_lock (&barrier->mutex); + barrier->count--; + if (barrier->count == 0) + { + ret = -1; + barrier->count = barrier->limit; + g_cond_broadcast (&barrier->cond); + } + else + { + ret = 0; + while (barrier->count != barrier->limit) + g_cond_wait (&barrier->cond, &barrier->mutex); + } + g_mutex_unlock (&barrier->mutex); + + return ret; +} + +static void +barrier_clear (Barrier *barrier) +{ + g_mutex_clear (&barrier->mutex); + g_cond_clear (&barrier->cond); +} + +static Barrier b; +static gint check; + +static gpointer +cond2_func (gpointer data) +{ + gint value = GPOINTER_TO_INT (data); + gint ret; + + g_atomic_int_inc (&check); + + if (g_test_verbose ()) + g_print ("thread %d starting, check %d\n", value, g_atomic_int_get (&check)); + + g_usleep (10000 * value); + + g_atomic_int_inc (&check); + + if (g_test_verbose ()) + g_print ("thread %d reaching barrier, check %d\n", value, g_atomic_int_get (&check)); + + ret = barrier_wait (&b); + + g_assert_cmpint (g_atomic_int_get (&check), ==, 10); + + if (g_test_verbose ()) + g_print ("thread %d leaving barrier (%d), check %d\n", value, ret, g_atomic_int_get (&check)); + + return NULL; +} + +/* this test demonstrates how to use a condition variable + * to implement a barrier + */ +static void +test_cond2 (void) +{ + gint i; + GThread *threads[5]; + + g_atomic_int_set (&check, 0); + + barrier_init (&b, 5); + for (i = 0; i < 5; i++) + threads[i] = g_thread_create (cond2_func, GINT_TO_POINTER (i), TRUE, NULL); + + for (i = 0; i < 5; i++) + g_thread_join (threads[i]); + + g_assert_cmpint (g_atomic_int_get (&check), ==, 10); + + barrier_clear (&b); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/cond1", test_cond1); + g_test_add_func ("/thread/cond2", test_cond2); + + return g_test_run (); +} diff --git a/glib/tests/convert.c b/glib/tests/convert.c new file mode 100644 index 0000000..2742fa6 --- /dev/null +++ b/glib/tests/convert.c @@ -0,0 +1,719 @@ +/* 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]); + g_error_free (error3); + } + 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]); + g_error_free (error3); + } + 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); + g_error_free (error3); + } + 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]); + g_error_free (error3); + } + 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); +} + +static void +test_filename_utf8 (void) +{ + const gchar *filename = "/my/path/to/foo"; + gchar *utf8; + gchar *back; + GError *error; + + error = NULL; + utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, &error); + g_assert_no_error (error); + back = g_filename_from_utf8 (utf8, -1, NULL, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (back, ==, filename); + + g_free (utf8); + g_free (back); +} + +static void +test_filename_display (void) +{ + const gchar *filename = "/my/path/to/foo"; + char *display; + + display = g_filename_display_basename (filename); + g_assert_cmpstr (display, ==, "foo"); + + g_free (display); +} + +static void +test_no_conv (void) +{ + gchar *in = ""; + gchar *out G_GNUC_UNUSED; + gsize bytes_read = 0; + gsize bytes_written = 0; + GError *error = NULL; + + out = g_convert (in, -1, "XXX", "UVZ", + &bytes_read, &bytes_written, &error); + + /* error code is unreliable, since we mishandle errno there */ + g_assert (error && error->domain == G_CONVERT_ERROR); + g_error_free (error); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/conversion/no-conv", test_no_conv); + g_test_add_func ("/conversion/iconv-state", test_iconv_state); + g_test_add_func ("/conversion/illegal-sequence", test_one_half); + g_test_add_func ("/conversion/byte-order", test_byte_order); + g_test_add_func ("/conversion/unicode", test_unicode_conversions); + g_test_add_func ("/conversion/filename-utf8", test_filename_utf8); + g_test_add_func ("/conversion/filename-display", test_filename_display); + + return g_test_run (); +} diff --git a/glib/tests/dataset.c b/glib/tests/dataset.c new file mode 100644 index 0000000..fa57d84 --- /dev/null +++ b/glib/tests/dataset.c @@ -0,0 +1,215 @@ +#include +#include + +static void +test_quark_basic (void) +{ + GQuark quark; + const gchar *orig = "blargh"; + gchar *copy; + const gchar *str; + + quark = g_quark_try_string ("no-such-quark"); + g_assert (quark == 0); + + copy = g_strdup (orig); + quark = g_quark_from_static_string (orig); + g_assert (quark != 0); + g_assert (g_quark_from_string (orig) == quark); + g_assert (g_quark_from_string (copy) == quark); + g_assert (g_quark_try_string (orig) == quark); + + str = g_quark_to_string (quark); + g_assert_cmpstr (str, ==, orig); + + g_free (copy); +} + +static void +test_quark_string (void) +{ + const gchar *orig = "string1"; + gchar *copy; + const gchar *str1; + const gchar *str2; + + copy = g_strdup (orig); + + str1 = g_intern_static_string (orig); + str2 = g_intern_string (copy); + g_assert (str1 == str2); + g_assert (str1 == orig); + + g_free (copy); +} + +static void +test_dataset_basic (void) +{ + gpointer location = (gpointer)test_dataset_basic; + gpointer other = (gpointer)test_quark_basic; + gpointer data = "test1"; + gpointer ret; + + g_dataset_set_data (location, "test1", data); + + ret = g_dataset_get_data (location, "test1"); + g_assert (ret == data); + + ret = g_dataset_get_data (location, "test2"); + g_assert (ret == NULL); + + ret = g_dataset_get_data (other, "test1"); + g_assert (ret == NULL); + + g_dataset_set_data (location, "test1", "new-value"); + ret = g_dataset_get_data (location, "test1"); + g_assert (ret != data); + + g_dataset_remove_data (location, "test1"); + ret = g_dataset_get_data (location, "test1"); + g_assert (ret == NULL); +} + +static gint destroy_count; + +static void +notify (gpointer data) +{ + destroy_count++; +} + +static void +test_dataset_full (void) +{ + gpointer location = (gpointer)test_dataset_full; + + g_dataset_set_data_full (location, "test1", "test1", notify); + + destroy_count = 0; + g_dataset_set_data (location, "test1", NULL); + g_assert (destroy_count == 1); + + g_dataset_set_data_full (location, "test1", "test1", notify); + + destroy_count = 0; + g_dataset_remove_data (location, "test1"); + g_assert (destroy_count == 1); + + g_dataset_set_data_full (location, "test1", "test1", notify); + + destroy_count = 0; + g_dataset_remove_no_notify (location, "test1"); + g_assert (destroy_count == 0); +} + +static void +foreach (GQuark id, + gpointer data, + gpointer user_data) +{ + gint *counter = user_data; + + *counter += 1; +} + +static void +test_dataset_foreach (void) +{ + gpointer location = (gpointer)test_dataset_foreach; + gint my_count; + + my_count = 0; + g_dataset_set_data_full (location, "test1", "test1", notify); + g_dataset_set_data_full (location, "test2", "test2", notify); + g_dataset_set_data_full (location, "test3", "test3", notify); + g_dataset_foreach (location, foreach, &my_count); + g_assert (my_count == 3); + + g_dataset_destroy (location); +} + +static void +test_dataset_destroy (void) +{ + gpointer location = (gpointer)test_dataset_destroy; + + destroy_count = 0; + g_dataset_set_data_full (location, "test1", "test1", notify); + g_dataset_set_data_full (location, "test2", "test2", notify); + g_dataset_set_data_full (location, "test3", "test3", notify); + g_dataset_destroy (location); + g_assert (destroy_count == 3); +} + +static void +test_dataset_id (void) +{ + gpointer location = (gpointer)test_dataset_id; + gpointer other = (gpointer)test_quark_basic; + gpointer data = "test1"; + gpointer ret; + GQuark quark; + + quark = g_quark_from_string ("test1"); + + g_dataset_id_set_data (location, quark, data); + + ret = g_dataset_id_get_data (location, quark); + g_assert (ret == data); + + ret = g_dataset_id_get_data (location, g_quark_from_string ("test2")); + g_assert (ret == NULL); + + ret = g_dataset_id_get_data (other, quark); + g_assert (ret == NULL); + + g_dataset_id_set_data (location, quark, "new-value"); + ret = g_dataset_id_get_data (location, quark); + g_assert (ret != data); + + g_dataset_id_remove_data (location, quark); + ret = g_dataset_id_get_data (location, quark); + g_assert (ret == NULL); +} + +GData *list; + +static void +free_one (gpointer data) +{ + /* recurse */ + g_datalist_clear (&list); +} + +static void +test_datalist_clear (void) +{ + if (g_test_trap_fork (500000, 0)) + { + g_datalist_init (&list); + g_datalist_set_data_full (&list, "one", GINT_TO_POINTER (1), free_one); + g_datalist_set_data_full (&list, "two", GINT_TO_POINTER (2), NULL); + g_datalist_clear (&list); + g_assert (list == NULL); + exit (0); + } + g_test_trap_assert_passed (); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/quark/basic", test_quark_basic); + g_test_add_func ("/quark/string", test_quark_string); + g_test_add_func ("/dataset/basic", test_dataset_basic); + g_test_add_func ("/dataset/id", test_dataset_id); + g_test_add_func ("/dataset/full", test_dataset_full); + g_test_add_func ("/dataset/foreach", test_dataset_foreach); + g_test_add_func ("/dataset/destroy", test_dataset_destroy); + g_test_add_func ("/datalist/recursive-clear", test_datalist_clear); + + return g_test_run (); +} diff --git a/glib/tests/date.c b/glib/tests/date.c new file mode 100644 index 0000000..51b51e2 --- /dev/null +++ b/glib/tests/date.c @@ -0,0 +1,377 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "glib.h" + +#include +#include +#include +#include +#include + +static void +test_basic (void) +{ + g_assert_cmpint (sizeof (GDate), <, 9); + g_assert (!g_date_valid_month (G_DATE_BAD_MONTH)); + g_assert (!g_date_valid_month (13)); + g_assert (!g_date_valid_day (G_DATE_BAD_DAY)); + g_assert (!g_date_valid_day (32)); + g_assert (!g_date_valid_year (G_DATE_BAD_YEAR)); + g_assert (!g_date_valid_julian (G_DATE_BAD_JULIAN)); + g_assert (!g_date_valid_weekday (G_DATE_BAD_WEEKDAY)); + g_assert (g_date_is_leap_year (2000)); + g_assert (!g_date_is_leap_year (1999)); + g_assert (g_date_is_leap_year (1996)); + g_assert (g_date_is_leap_year (1600)); + g_assert (!g_date_is_leap_year (2100)); + g_assert (!g_date_is_leap_year (1800)); +} + +static void +test_empty_constructor (void) +{ + GDate *d; + + d = g_date_new (); + g_assert (!g_date_valid (d)); + g_date_free (d); +} + +static void +test_dmy_constructor (void) +{ + GDate *d; + guint32 j; + + d = g_date_new_dmy (1, 1, 1); + g_assert (g_date_valid (d)); + j = g_date_get_julian (d); + g_assert_cmpint (j, ==, 1); + g_assert_cmpint (g_date_get_month (d), ==, G_DATE_JANUARY); + g_assert_cmpint (g_date_get_day (d), ==, 1); + g_assert_cmpint (g_date_get_year (d), ==, 1); + g_date_free (d); +} + +static void +test_julian_constructor (void) +{ + GDate *d1; + GDate *d2; + + d1 = g_date_new_julian (4000); + d2 = g_date_new_julian (5000); + g_assert_cmpint (g_date_get_julian (d1), ==, 4000); + g_assert_cmpint (g_date_days_between (d1, d2), ==, 1000); + g_date_free (d1); + g_date_free (d2); +} + +static void +test_dates (void) +{ + GDate *d; + GTimeVal tv; + + d = g_date_new (); + + /* today */ + g_date_set_time (d, time (NULL)); + g_assert (g_date_valid (d)); + + /* Unix epoch */ + g_date_set_time (d, 1); + g_assert (g_date_valid (d)); + + tv.tv_sec = 0; + tv.tv_usec = 0; + g_date_set_time_val (d, &tv); + g_assert (g_date_valid (d)); + + /* Julian day 1 */ + g_date_set_julian (d, 1); + g_assert (g_date_valid (d)); + + g_date_set_year (d, 3); + g_date_set_day (d, 3); + g_date_set_month (d, 3); + g_assert (g_date_valid (d)); + g_assert_cmpint (g_date_get_year (d), ==, 3); + g_assert_cmpint (g_date_get_month (d), ==, 3); + g_assert_cmpint (g_date_get_day (d), ==, 3); + g_assert (!g_date_is_first_of_month (d)); + g_assert (!g_date_is_last_of_month (d)); + g_date_set_day (d, 1); + g_assert (g_date_is_first_of_month (d)); + g_date_subtract_days (d, 1); + g_assert (g_date_is_last_of_month (d)); + + g_date_free (d); +} + +static void +test_parse (void) +{ + GDate *d; + gchar buf[101]; + + d = g_date_new (); + + g_date_set_dmy (d, 10, 1, 2000); + g_date_strftime (buf, 100, "%x", d); + + g_date_set_parse (d, buf); + g_assert (g_date_valid (d)); + g_assert_cmpint (g_date_get_month (d), ==, 1); + g_assert_cmpint (g_date_get_day (d), ==, 10); + g_assert_cmpint (g_date_get_year (d), ==, 2000); + + g_date_set_parse (d, "10 10 2010"); + g_assert (g_date_valid (d)); + g_assert_cmpint (g_date_get_month (d), ==, 10); + g_assert_cmpint (g_date_get_day (d), ==, 10); + g_assert_cmpint (g_date_get_year (d), ==, 2010); + + g_date_set_parse (d, "10 March 2010"); + g_assert (g_date_valid (d)); + g_assert_cmpint (g_date_get_month (d), ==, 3); + g_assert_cmpint (g_date_get_day (d), ==, 10); + g_assert_cmpint (g_date_get_year (d), ==, 2010); + + g_date_free (d); +} + +static void +test_year (gconstpointer t) +{ + GDateYear y = GPOINTER_TO_INT (t); + GDateMonth m; + GDateDay day; + guint32 j; + GDate *d; + gint i; + GDate tmp; + + 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; + + g_assert (g_date_valid_year (y)); + /* Years ought to have roundabout 52 weeks */ + g_assert (sunday_weeks_in_year == 52 || sunday_weeks_in_year == 53); + g_assert (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]; + + g_date_clear (days, 31); + + g_assert (dim > 0 && dim < 32); + g_assert (g_date_valid_month (m)); + + day = 1; + while (day <= dim) + { + g_assert (g_date_valid_dmy (day, m, y)); + + d = &days[day - 1]; + //g_assert (!g_date_valid (d)); + + g_date_set_dmy (d, day, m, y); + + g_assert (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); + + g_assert_cmpint (g_date_get_month (d), ==, m); + g_assert_cmpint (g_date_get_year (d), ==, y); + g_assert_cmpint (g_date_get_day (d), ==, day); + + g_assert (g_date_get_julian (d) + 1 - first_day_of_year == + g_date_get_day_of_year (d)); + + if (m == G_DATE_DECEMBER && day == 31) + g_assert_cmpint (g_date_get_day_of_year (d), ==, days_in_year); + + g_assert_cmpint (g_date_get_day_of_year (d), <=, days_in_year); + g_assert_cmpint (g_date_get_monday_week_of_year (d), <=, monday_weeks_in_year); + g_assert_cmpint (g_date_get_monday_week_of_year (d), >=, monday_week_of_year); + + if (g_date_get_weekday(d) == G_DATE_MONDAY) + { + g_assert_cmpint (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)) + g_assert_cmpint (g_date_get_iso8601_week_of_year (d), ==, 1); + else + g_assert_cmpint (g_date_get_iso8601_week_of_year (d) - iso8601_week_of_year, ==, 1); + } + else + { + g_assert_cmpint (g_date_get_monday_week_of_year(d) - monday_week_of_year, ==, 0); + if (!(day == 1 && m == G_DATE_JANUARY)) + g_assert_cmpint (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); + + g_assert_cmpint (g_date_get_sunday_week_of_year (d), <=, sunday_weeks_in_year); + g_assert_cmpint (g_date_get_sunday_week_of_year (d), >=, sunday_week_of_year); + if (g_date_get_weekday(d) == G_DATE_SUNDAY) + g_assert_cmpint (g_date_get_sunday_week_of_year (d) - sunday_week_of_year, ==, 1); + else + g_assert_cmpint (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); + + g_assert_cmpint (g_date_compare (d, d), ==, 0); + + i = 1; + while (i < 402) /* Need to get 400 year increments in */ + { + tmp = *d; + g_date_add_days (d, i); + g_assert_cmpint (g_date_compare (d, &tmp), >, 0); + g_date_subtract_days (d, i); + g_assert_cmpint (g_date_get_day (d), ==, day); + g_assert_cmpint (g_date_get_month (d), ==, m); + g_assert_cmpint (g_date_get_year (d), ==, y); + + tmp = *d; + g_date_add_months (d, i); + g_assert_cmpint (g_date_compare (d, &tmp), >, 0); + g_date_subtract_months (d, i); + g_assert_cmpint (g_date_get_month (d), ==, m); + g_assert_cmpint (g_date_get_year (d), ==, y); + + if (day < 29) + g_assert_cmpint (g_date_get_day (d), ==, day); + else + g_date_set_day (d, day); + + tmp = *d; + g_date_add_years (d, i); + g_assert_cmpint (g_date_compare (d, &tmp), >, 0); + g_date_subtract_years (d, i); + g_assert_cmpint (g_date_get_month (d), ==, m); + g_assert_cmpint (g_date_get_year (d), ==, y); + + if (m != 2 && day != 29) + g_assert_cmpint (g_date_get_day (d), ==, day); + else + g_date_set_day (d, day); /* reset */ + + i += 10; + } + + j = g_date_get_julian (d); + + ++day; + } + ++m; + } + + /* at this point, d is the last day of year y */ + g_date_set_dmy (&tmp, 1, 1, y + 1); + g_assert_cmpint (j + 1, ==, g_date_get_julian (&tmp)); + + g_date_add_days (&tmp, 1); + g_assert_cmpint (j + 2, ==, g_date_get_julian (&tmp)); +} + +static void +test_clamp (void) +{ + GDate d1, d2, d, o; + + g_date_set_dmy (&d1, 1, 1, 1970); + g_date_set_dmy (&d2, 1, 1, 1980); + g_date_set_dmy (&d, 1, 1, 1); + + o = d; + g_date_clamp (&o, NULL, NULL); + g_assert (g_date_compare (&o, &d) == 0); + + g_date_clamp (&o, &d1, &d2); + g_assert (g_date_compare (&o, &d1) == 0); + + g_date_set_dmy (&o, 1, 1, 2000); + + g_date_clamp (&o, &d1, &d2); + g_assert (g_date_compare (&o, &d2) == 0); +} + +static void +test_order (void) +{ + GDate d1, d2; + + g_date_set_dmy (&d1, 1, 1, 1970); + g_date_set_dmy (&d2, 1, 1, 1980); + + g_assert (g_date_compare (&d1, &d2) == -1); + g_date_order (&d2, &d1); + g_assert (g_date_compare (&d1, &d2) == 1); +} + +int +main (int argc, char** argv) +{ + gchar *path; + gint i; + + /* Try to get all the leap year cases. */ + int 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 + }; + + g_setenv ("LANG", "en_US.utf-8", TRUE); + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/date/basic", test_basic); + g_test_add_func ("/date/empty", test_empty_constructor); + g_test_add_func ("/date/dmy", test_dmy_constructor); + g_test_add_func ("/date/julian", test_julian_constructor); + g_test_add_func ("/date/dates", test_dates); + g_test_add_func ("/date/parse", test_parse); + g_test_add_func ("/date/clamp", test_clamp); + g_test_add_func ("/date/order", test_order); + for (i = 0; i < G_N_ELEMENTS (check_years); i++) + { + path = g_strdup_printf ("/date/year/%d", check_years[i]); + g_test_add_data_func (path, GINT_TO_POINTER(check_years[i]), test_year); + g_free (path); + } + + return g_test_run (); +} + + diff --git a/glib/tests/dir.c b/glib/tests/dir.c new file mode 100644 index 0000000..74dbe14 --- /dev/null +++ b/glib/tests/dir.c @@ -0,0 +1,53 @@ +#include + +static void +test_dir_read (void) +{ + GDir *dir; + GError *error; + gchar *first; + const gchar *name; + + error = NULL; + dir = g_dir_open (".", 0, &error); + g_assert_no_error (error); + + first = NULL; + while ((name = g_dir_read_name (dir)) != NULL) + { + if (first == NULL) + first = g_strdup (name); + g_assert_cmpstr (name, !=, "."); + g_assert_cmpstr (name, !=, ".."); + } + + g_dir_rewind (dir); + g_assert_cmpstr (g_dir_read_name (dir), ==, first); + + g_free (first); + g_dir_close (dir); +} + +static void +test_dir_nonexisting (void) +{ + GDir *dir; + GError *error; + + error = NULL; + dir = g_dir_open ("/pfrkstrf", 0, &error); + g_assert (dir == NULL); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + g_error_free (error); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/dir/read", test_dir_read); + g_test_add_func ("/dir/nonexisting", test_dir_nonexisting); + + return g_test_run (); +} diff --git a/glib/tests/echo-script b/glib/tests/echo-script new file mode 100755 index 0000000..c732ed9 --- /dev/null +++ b/glib/tests/echo-script @@ -0,0 +1 @@ +echo "echo" diff --git a/glib/tests/empty b/glib/tests/empty new file mode 100644 index 0000000..e69de29 diff --git a/glib/tests/environment.c b/glib/tests/environment.c new file mode 100644 index 0000000..36c875b --- /dev/null +++ b/glib/tests/environment.c @@ -0,0 +1,129 @@ +#include + +static void +test_listenv (void) +{ + GHashTable *table; + gchar **list; + gint i; + + table = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + list = g_get_environ (); + for (i = 0; list[i]; i++) + { + gchar **parts; + + parts = g_strsplit (list[i], "=", 2); + g_assert (g_hash_table_lookup (table, parts[0]) == NULL); + g_hash_table_insert (table, parts[0], parts[1]); + g_free (parts); + } + g_strfreev (list); + + g_assert_cmpint (g_hash_table_size (table), >, 0); + + list = g_listenv (); + for (i = 0; list[i]; i++) + { + const gchar *expected; + const gchar *value; + + expected = g_hash_table_lookup (table, list[i]); + value = g_getenv (list[i]); + g_assert_cmpstr (value, ==, expected); + g_hash_table_remove (table, list[i]); + } + g_assert_cmpint (g_hash_table_size (table), ==, 0); + g_hash_table_unref (table); + g_strfreev (list); +} + +static void +test_setenv (void) +{ + const gchar *var, *value; + + var = "NOSUCHENVVAR"; + value = "value1"; + + g_assert (g_getenv (var) == NULL); + g_setenv (var, value, FALSE); + g_assert_cmpstr (g_getenv (var), ==, value); + g_assert (g_setenv (var, "value2", FALSE)); + g_assert_cmpstr (g_getenv (var), ==, value); + g_assert (g_setenv (var, "value2", TRUE)); + g_assert_cmpstr (g_getenv (var), ==, "value2"); + g_unsetenv (var); + g_assert (g_getenv (var) == NULL); +} + +static void +test_environ_array (void) +{ + gchar **env; + const gchar *value; + + env = g_new (gchar *, 1); + env[0] = NULL; + + value = g_environ_getenv (env, "foo"); + g_assert (value == NULL); + + env = g_environ_setenv (env, "foo", "bar", TRUE); + value = g_environ_getenv (env, "foo"); + g_assert_cmpstr (value, ==, "bar"); + + env = g_environ_setenv (env, "foo2", "bar2", FALSE); + value = g_environ_getenv (env, "foo"); + g_assert_cmpstr (value, ==, "bar"); + value = g_environ_getenv (env, "foo2"); + g_assert_cmpstr (value, ==, "bar2"); + + env = g_environ_setenv (env, "foo", "x", FALSE); + value = g_environ_getenv (env, "foo"); + g_assert_cmpstr (value, ==, "bar"); + + env = g_environ_setenv (env, "foo", "x", TRUE); + value = g_environ_getenv (env, "foo"); + g_assert_cmpstr (value, ==, "x"); + + env = g_environ_unsetenv (env, "foo2"); + value = g_environ_getenv (env, "foo2"); + g_assert (value == NULL); + + g_strfreev (env); +} + +static void +test_environ_null (void) +{ + gchar **env; + const gchar *value; + + env = NULL; + + value = g_environ_getenv (env, "foo"); + g_assert (value == NULL); + + env = g_environ_setenv (NULL, "foo", "bar", TRUE); + g_assert (env != NULL); + g_strfreev (env); + + env = g_environ_unsetenv (NULL, "foo"); + g_assert (env == NULL); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/environ/listenv", test_listenv); + g_test_add_func ("/environ/setenv", test_setenv); + g_test_add_func ("/environ/array", test_environ_array); + g_test_add_func ("/environ/null", test_environ_null); + + return g_test_run (); +} diff --git a/glib/tests/error.c b/glib/tests/error.c new file mode 100644 index 0000000..81b4055 --- /dev/null +++ b/glib/tests/error.c @@ -0,0 +1,100 @@ +#include + +static void +test_overwrite (void) +{ + GError *error, *dest, *src; + + if (!g_test_undefined ()) + return; + + error = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "bla"); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*set over the top*"); + g_set_error_literal (&error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "bla"); + g_test_assert_expected_messages (); + + g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY); + g_error_free (error); + + + dest = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "bla"); + src = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "bla"); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*set over the top*"); + g_propagate_error (&dest, src); + g_test_assert_expected_messages (); + + g_assert_error (dest, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY); + g_assert_error (src, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE); + g_error_free (dest); + g_error_free (src); + +} + +static void +test_prefix (void) +{ + GError *error; + GError *dest, *src; + + error = NULL; + g_prefix_error (&error, "foo %d %s: ", 1, "two"); + g_assert (error == NULL); + + error = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "bla"); + g_prefix_error (&error, "foo %d %s: ", 1, "two"); + g_assert_cmpstr (error->message, ==, "foo 1 two: bla"); + g_error_free (error); + + dest = NULL; + src = g_error_new_literal (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "bla"); + g_propagate_prefixed_error (&dest, src, "foo %d %s: ", 1, "two"); + g_assert_cmpstr (dest->message, ==, "foo 1 two: bla"); + g_error_free (dest); +} + +static void +test_literal (void) +{ + GError *error; + + error = NULL; + g_set_error_literal (&error, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "%s %d %x"); + g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY); + g_assert_cmpstr (error->message, ==, "%s %d %x"); + g_error_free (error); +} + +static void +test_copy (void) +{ + GError *error; + GError *copy; + + error = NULL; + g_set_error_literal (&error, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, "%s %d %x"); + copy = g_error_copy (error); + + g_assert_error (copy, G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY); + g_assert_cmpstr (copy->message, ==, "%s %d %x"); + + g_error_free (error); + g_error_free (copy); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/error/overwrite", test_overwrite); + g_test_add_func ("/error/prefix", test_prefix); + g_test_add_func ("/error/literal", test_literal); + g_test_add_func ("/error/copy", test_copy); + + return g_test_run (); +} + diff --git a/glib/tests/fileutils.c b/glib/tests/fileutils.c new file mode 100644 index 0000000..be9acdb --- /dev/null +++ b/glib/tests/fileutils.c @@ -0,0 +1,792 @@ +/* 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 + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#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]; + + g_assert (g_build_pathv ("", NULL) == NULL); + 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); + + g_free (p2); + g_free (p1); + g_free (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); + + g_assert (g_mkdir_with_parents (NULL, 0) == -1); + g_assert (errno == EINVAL); +} + +static void +test_format_size_for_display (void) +{ + /* nobody called setlocale(), so we should get "C" behaviour... */ + 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"); + check_string (g_format_size_for_display (1024ULL * 1024 * 1024 * 1024), "1.0 TB"); + check_string (g_format_size_for_display (1024ULL * 1024 * 1024 * 1024 * 1024), "1.0 PB"); + check_string (g_format_size_for_display (1024ULL * 1024 * 1024 * 1024 * 1024 * 1024), "1.0 EB"); + + check_string (g_format_size (0), "0 bytes"); + check_string (g_format_size (1), "1 byte"); + check_string (g_format_size (2), "2 bytes"); + check_string (g_format_size (1000ULL), "1.0 kB"); + check_string (g_format_size (1000ULL * 1000), "1.0 MB"); + check_string (g_format_size (1000ULL * 1000 * 1000), "1.0 GB"); + check_string (g_format_size (1000ULL * 1000 * 1000 * 1000), "1.0 TB"); + check_string (g_format_size (1000ULL * 1000 * 1000 * 1000 * 1000), "1.0 PB"); + check_string (g_format_size (1000ULL * 1000 * 1000 * 1000 * 1000 * 1000), "1.0 EB"); + + check_string (g_format_size_full (0, G_FORMAT_SIZE_IEC_UNITS), "0 bytes"); + check_string (g_format_size_full (1, G_FORMAT_SIZE_IEC_UNITS), "1 byte"); + check_string (g_format_size_full (2, G_FORMAT_SIZE_IEC_UNITS), "2 bytes"); + + check_string (g_format_size_full (2048ULL, G_FORMAT_SIZE_IEC_UNITS), "2.0 KiB"); + check_string (g_format_size_full (2048ULL * 1024, G_FORMAT_SIZE_IEC_UNITS), "2.0 MiB"); + check_string (g_format_size_full (2048ULL * 1024 * 1024, G_FORMAT_SIZE_IEC_UNITS), "2.0 GiB"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024, G_FORMAT_SIZE_IEC_UNITS), "2.0 TiB"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_IEC_UNITS), "2.0 PiB"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_IEC_UNITS), "2.0 EiB"); + + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_IEC_UNITS), "227.4 MiB"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_DEFAULT), "238.5 MB"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_LONG_FORMAT), "238.5 MB (238472938 bytes)"); +} + +static void +test_file_errors (void) +{ +#ifdef EEXIST + g_assert (g_file_error_from_errno (EEXIST) == G_FILE_ERROR_EXIST); +#endif +#ifdef EISDIR + g_assert (g_file_error_from_errno (EISDIR) == G_FILE_ERROR_ISDIR); +#endif +#ifdef EACCES + g_assert (g_file_error_from_errno (EACCES) == G_FILE_ERROR_ACCES); +#endif +#ifdef ENAMETOOLONG + g_assert (g_file_error_from_errno (ENAMETOOLONG) == G_FILE_ERROR_NAMETOOLONG); +#endif +#ifdef ENOENT + g_assert (g_file_error_from_errno (ENOENT) == G_FILE_ERROR_NOENT); +#endif +#ifdef ENOTDIR + g_assert (g_file_error_from_errno (ENOTDIR) == G_FILE_ERROR_NOTDIR); +#endif +#ifdef ENXIO + g_assert (g_file_error_from_errno (ENXIO) == G_FILE_ERROR_NXIO); +#endif +#ifdef ENODEV + g_assert (g_file_error_from_errno (ENODEV) == G_FILE_ERROR_NODEV); +#endif +#ifdef EROFS + g_assert (g_file_error_from_errno (EROFS) == G_FILE_ERROR_ROFS); +#endif +#ifdef ETXTBSY + g_assert (g_file_error_from_errno (ETXTBSY) == G_FILE_ERROR_TXTBSY); +#endif +#ifdef EFAULT + g_assert (g_file_error_from_errno (EFAULT) == G_FILE_ERROR_FAULT); +#endif +#ifdef ELOOP + g_assert (g_file_error_from_errno (ELOOP) == G_FILE_ERROR_LOOP); +#endif +#ifdef ENOSPC + g_assert (g_file_error_from_errno (ENOSPC) == G_FILE_ERROR_NOSPC); +#endif +#ifdef ENOMEM + g_assert (g_file_error_from_errno (ENOMEM) == G_FILE_ERROR_NOMEM); +#endif +#ifdef EMFILE + g_assert (g_file_error_from_errno (EMFILE) == G_FILE_ERROR_MFILE); +#endif +#ifdef ENFILE + g_assert (g_file_error_from_errno (ENFILE) == G_FILE_ERROR_NFILE); +#endif +#ifdef EBADF + g_assert (g_file_error_from_errno (EBADF) == G_FILE_ERROR_BADF); +#endif +#ifdef EINVAL + g_assert (g_file_error_from_errno (EINVAL) == G_FILE_ERROR_INVAL); +#endif +#ifdef EPIPE + g_assert (g_file_error_from_errno (EPIPE) == G_FILE_ERROR_PIPE); +#endif +#ifdef EAGAIN + g_assert (g_file_error_from_errno (EAGAIN) == G_FILE_ERROR_AGAIN); +#endif +#ifdef EINTR + g_assert (g_file_error_from_errno (EINTR) == G_FILE_ERROR_INTR); +#endif +#ifdef EIO + g_assert (g_file_error_from_errno (EIO) == G_FILE_ERROR_IO); +#endif +#ifdef EPERM + g_assert (g_file_error_from_errno (EPERM) == G_FILE_ERROR_PERM); +#endif +#ifdef ENOSYS + g_assert (g_file_error_from_errno (ENOSYS) == G_FILE_ERROR_NOSYS); +#endif +} + +static void +test_basename (void) +{ + gchar *b; + + b = g_path_get_basename (""); + g_assert_cmpstr (b, ==, "."); + g_free (b); + + b = g_path_get_basename ("///"); + g_assert_cmpstr (b, ==, G_DIR_SEPARATOR_S); + g_free (b); + + b = g_path_get_basename ("/a/b/c/d"); + g_assert_cmpstr (b, ==, "d"); + g_free (b); +} + +static void +test_dir_make_tmp (void) +{ + gchar *name; + GError *error = NULL; + + name = g_dir_make_tmp ("testXXXXXXtest", &error); + g_assert_no_error (error); + g_assert (g_file_test (name, G_FILE_TEST_IS_DIR)); + g_assert (g_rmdir (name) == 0); + g_free (name); + + name = g_dir_make_tmp (NULL, &error); + g_assert_no_error (error); + g_assert (g_file_test (name, G_FILE_TEST_IS_DIR)); + g_assert (g_rmdir (name) == 0); + g_free (name); + + name = g_dir_make_tmp ("test/XXXXXX", &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED); + g_clear_error (&error); + g_assert (name == NULL); + + name = g_dir_make_tmp ("XXXXxX", &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED); + g_clear_error (&error); + g_assert (name == NULL); +} + +static void +test_file_open_tmp (void) +{ + gchar *name = NULL; + GError *error = NULL; + gint fd; + + fd = g_file_open_tmp ("testXXXXXXtest", &name, &error); + g_assert (fd != -1); + g_assert_no_error (error); + g_assert (name != NULL); + unlink (name); + g_free (name); + close (fd); + + fd = g_file_open_tmp (NULL, &name, &error); + g_assert (fd != -1); + g_assert_no_error (error); + g_assert (name != NULL); + g_unlink (name); + g_free (name); + close (fd); + + name = NULL; + fd = g_file_open_tmp ("test/XXXXXX", &name, &error); + g_assert (fd == -1); + g_assert (name == NULL); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED); + g_clear_error (&error); + + fd = g_file_open_tmp ("XXXXxX", &name, &error); + g_assert (fd == -1); + g_assert (name == NULL); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED); + g_clear_error (&error); +} + +static void +test_mkstemp (void) +{ + gchar *name; + gint fd; + + name = g_strdup ("testXXXXXXtest"), + fd = g_mkstemp (name); + g_assert (fd != -1); + g_assert (strstr (name, "XXXXXX") == NULL); + unlink (name); + close (fd); + g_free (name); + + name = g_strdup ("testYYYYYYtest"), + fd = g_mkstemp (name); + g_assert (fd == -1); + g_free (name); +} + +static void +test_mkdtemp (void) +{ + gchar *name; + gchar *ret; + + name = g_strdup ("testXXXXXXtest"), + ret = g_mkdtemp (name); + g_assert (ret == name); + g_assert (strstr (name, "XXXXXX") == NULL); + g_rmdir (name); + g_free (name); + + name = g_strdup ("testYYYYYYtest"), + ret = g_mkdtemp (name); + g_assert (ret == NULL); + g_free (name); +} + +static void +test_set_contents (void) +{ + GError *error = NULL; + gint fd; + gchar *name; + gchar *buf; + gsize len; + gboolean ret; + + fd = g_file_open_tmp (NULL, &name, &error); + g_assert_no_error (error); + write (fd, "a", 1); + close (fd); + + ret = g_file_get_contents (name, &buf, &len, &error); + g_assert (ret); + g_assert_no_error (error); + g_assert_cmpstr (buf, ==, "a"); + g_free (buf); + + ret = g_file_set_contents (name, "b", 1, &error); + g_assert (ret); + g_assert_no_error (error); + + ret = g_file_get_contents (name, &buf, &len, &error); + g_assert (ret); + g_assert_no_error (error); + g_assert_cmpstr (buf, ==, "b"); + g_free (buf); + + g_remove (name); + g_free (name); +} + +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); + g_test_add_func ("/fileutils/errors", test_file_errors); + g_test_add_func ("/fileutils/basename", test_basename); + g_test_add_func ("/fileutils/dir-make-tmp", test_dir_make_tmp); + g_test_add_func ("/fileutils/file-open-tmp", test_file_open_tmp); + g_test_add_func ("/fileutils/mkstemp", test_mkstemp); + g_test_add_func ("/fileutils/mkdtemp", test_mkdtemp); + g_test_add_func ("/fileutils/set-contents", test_set_contents); + + return g_test_run (); +} diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c new file mode 100644 index 0000000..4f82929 --- /dev/null +++ b/glib/tests/gdatetime.c @@ -0,0 +1,1589 @@ +/* gdatetime-tests.c + * + * Copyright (C) 2009-2010 Christian Hergert + * + * This is free software; you can redistribute it 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 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should 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 +#include +#include +#include + +#define ASSERT_DATE(dt,y,m,d) G_STMT_START { \ + g_assert_cmpint ((y), ==, g_date_time_get_year ((dt))); \ + g_assert_cmpint ((m), ==, g_date_time_get_month ((dt))); \ + g_assert_cmpint ((d), ==, g_date_time_get_day_of_month ((dt))); \ +} G_STMT_END +#define ASSERT_TIME(dt,H,M,S) G_STMT_START { \ + g_assert_cmpint ((H), ==, g_date_time_get_hour ((dt))); \ + g_assert_cmpint ((M), ==, g_date_time_get_minute ((dt))); \ + g_assert_cmpint ((S), ==, g_date_time_get_second ((dt))); \ +} G_STMT_END + +static void +get_localtime_tm (time_t time_, + struct tm *retval) +{ +#ifdef HAVE_LOCALTIME_R + localtime_r (&time_, retval); +#else + { + struct tm *ptm = localtime (&time_); + + 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_STRFUNC, "ptm != NULL"); +#endif + + retval->tm_mon = 0; + retval->tm_mday = 1; + retval->tm_year = 100; + } + else + memcpy ((void *) retval, (void *) ptm, sizeof (struct tm)); + } +#endif /* HAVE_LOCALTIME_R */ +} + +static void +test_GDateTime_now (void) +{ + GDateTime *dt; + struct tm tm; + + memset (&tm, 0, sizeof (tm)); + get_localtime_tm (time (NULL), &tm); + + dt = g_date_time_new_now_local (); + + g_assert_cmpint (g_date_time_get_year (dt), ==, 1900 + tm.tm_year); + g_assert_cmpint (g_date_time_get_month (dt), ==, 1 + tm.tm_mon); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, tm.tm_mday); + g_assert_cmpint (g_date_time_get_hour (dt), ==, tm.tm_hour); + g_assert_cmpint (g_date_time_get_minute (dt), ==, tm.tm_min); + /* XXX we need some fuzzyness here */ + g_assert_cmpint (g_date_time_get_second (dt), >=, tm.tm_sec); + + g_date_time_unref (dt); +} + +static void +test_GDateTime_new_from_unix (void) +{ + GDateTime *dt; + struct tm tm; + time_t t; + + memset (&tm, 0, sizeof (tm)); + t = time (NULL); + get_localtime_tm (t, &tm); + + dt = g_date_time_new_from_unix_local (t); + g_assert_cmpint (g_date_time_get_year (dt), ==, 1900 + tm.tm_year); + g_assert_cmpint (g_date_time_get_month (dt), ==, 1 + tm.tm_mon); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, tm.tm_mday); + g_assert_cmpint (g_date_time_get_hour (dt), ==, tm.tm_hour); + g_assert_cmpint (g_date_time_get_minute (dt), ==, tm.tm_min); + g_assert_cmpint (g_date_time_get_second (dt), ==, tm.tm_sec); + g_date_time_unref (dt); + + memset (&tm, 0, sizeof (tm)); + tm.tm_year = 90; + tm.tm_mday = 1; + tm.tm_mon = 0; + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + t = mktime (&tm); + + dt = g_date_time_new_from_unix_local (t); + g_assert_cmpint (g_date_time_get_year (dt), ==, 1990); + g_assert_cmpint (g_date_time_get_month (dt), ==, 1); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, 1); + g_assert_cmpint (g_date_time_get_hour (dt), ==, 0); + g_assert_cmpint (g_date_time_get_minute (dt), ==, 0); + g_assert_cmpint (g_date_time_get_second (dt), ==, 0); + g_date_time_unref (dt); +} + +static void +test_GDateTime_compare (void) +{ + GDateTime *dt1, *dt2; + gint i; + + dt1 = g_date_time_new_utc (2000, 1, 1, 0, 0, 0); + + for (i = 1; i < 2000; i++) + { + dt2 = g_date_time_new_utc (i, 12, 31, 0, 0, 0); + g_assert_cmpint (1, ==, g_date_time_compare (dt1, dt2)); + g_date_time_unref (dt2); + } + + dt2 = g_date_time_new_utc (1999, 12, 31, 23, 59, 59); + g_assert_cmpint (1, ==, g_date_time_compare (dt1, dt2)); + g_date_time_unref (dt2); + + dt2 = g_date_time_new_utc (2000, 1, 1, 0, 0, 1); + g_assert_cmpint (-1, ==, g_date_time_compare (dt1, dt2)); + g_date_time_unref (dt2); + + dt2 = g_date_time_new_utc (2000, 1, 1, 0, 0, 0); + g_assert_cmpint (0, ==, g_date_time_compare (dt1, dt2)); + g_date_time_unref (dt2); + g_date_time_unref (dt1); +} + +static void +test_GDateTime_equal (void) +{ + GDateTime *dt1, *dt2; + GTimeZone *tz; + + dt1 = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + dt2 = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + g_assert (g_date_time_equal (dt1, dt2)); + g_date_time_unref (dt1); + g_date_time_unref (dt2); + + dt1 = g_date_time_new_local (2009, 10, 18, 0, 0, 0); + dt2 = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + g_assert (!g_date_time_equal (dt1, dt2)); + g_date_time_unref (dt1); + g_date_time_unref (dt2); + + /* UTC-0300 and not in DST */ + tz = g_time_zone_new ("-03:00"); + dt1 = g_date_time_new (tz, 2010, 5, 24, 8, 0, 0); + g_time_zone_unref (tz); + g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, (-3 * 3600)); + /* UTC */ + dt2 = g_date_time_new_utc (2010, 5, 24, 11, 0, 0); + g_assert_cmpint (g_date_time_get_utc_offset (dt2), ==, 0); + + g_assert (g_date_time_equal (dt1, dt2)); + g_date_time_unref (dt1); + + /* America/Recife is in UTC-0300 */ +#ifdef G_OS_UNIX + tz = g_time_zone_new ("America/Recife"); +#elif defined G_OS_WIN32 + tz = g_time_zone_new ("E. South America Standard Time"); +#endif + dt1 = g_date_time_new (tz, 2010, 5, 24, 8, 0, 0); + g_time_zone_unref (tz); + g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, (-3 * 3600)); + g_assert (g_date_time_equal (dt1, dt2)); + g_date_time_unref (dt1); + g_date_time_unref (dt2); +} + +static void +test_GDateTime_get_day_of_week (void) +{ + GDateTime *dt; + + dt = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + g_assert_cmpint (1, ==, g_date_time_get_day_of_week (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_local (2000, 10, 1, 0, 0, 0); + g_assert_cmpint (7, ==, g_date_time_get_day_of_week (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_day_of_month (void) +{ + GDateTime *dt; + + dt = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, 19); + g_date_time_unref (dt); + + dt = g_date_time_new_local (1400, 3, 12, 0, 0, 0); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, 12); + g_date_time_unref (dt); + + dt = g_date_time_new_local (1800, 12, 31, 0, 0, 0); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, 31); + g_date_time_unref (dt); + + dt = g_date_time_new_local (1000, 1, 1, 0, 0, 0); + g_assert_cmpint (g_date_time_get_day_of_month (dt), ==, 1); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_hour (void) +{ + GDateTime *dt; + + dt = g_date_time_new_utc (2009, 10, 19, 15, 13, 11); + g_assert_cmpint (15, ==, g_date_time_get_hour (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_utc (100, 10, 19, 1, 0, 0); + g_assert_cmpint (1, ==, g_date_time_get_hour (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_utc (100, 10, 19, 0, 0, 0); + g_assert_cmpint (0, ==, g_date_time_get_hour (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_utc (100, 10, 1, 23, 59, 59); + g_assert_cmpint (23, ==, g_date_time_get_hour (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_microsecond (void) +{ + GTimeVal tv; + GDateTime *dt; + + g_get_current_time (&tv); + dt = g_date_time_new_from_timeval_local (&tv); + g_assert_cmpint (tv.tv_usec, ==, g_date_time_get_microsecond (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_year (void) +{ + GDateTime *dt; + + dt = g_date_time_new_local (2009, 1, 1, 0, 0, 0); + g_assert_cmpint (2009, ==, g_date_time_get_year (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_local (1, 1, 1, 0, 0, 0); + g_assert_cmpint (1, ==, g_date_time_get_year (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_local (13, 1, 1, 0, 0, 0); + g_assert_cmpint (13, ==, g_date_time_get_year (dt)); + g_date_time_unref (dt); + + dt = g_date_time_new_local (3000, 1, 1, 0, 0, 0); + g_assert_cmpint (3000, ==, g_date_time_get_year (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_hash (void) +{ + GHashTable *h; + + h = g_hash_table_new_full (g_date_time_hash, g_date_time_equal, + (GDestroyNotify)g_date_time_unref, + NULL); + g_hash_table_insert (h, g_date_time_new_now_local (), NULL); + g_hash_table_remove_all (h); + g_hash_table_destroy (h); +} + +static void +test_GDateTime_new_from_timeval (void) +{ + GDateTime *dt; + GTimeVal tv, tv2; + + g_get_current_time (&tv); + dt = g_date_time_new_from_timeval_local (&tv); + + if (g_test_verbose ()) + g_print ("\nDT%04d-%02d-%02dT%02d:%02d:%02d%s\n", + g_date_time_get_year (dt), + g_date_time_get_month (dt), + g_date_time_get_day_of_month (dt), + g_date_time_get_hour (dt), + g_date_time_get_minute (dt), + g_date_time_get_second (dt), + g_date_time_get_timezone_abbreviation (dt)); + + g_date_time_to_timeval (dt, &tv2); + g_assert_cmpint (tv.tv_sec, ==, tv2.tv_sec); + g_assert_cmpint (tv.tv_usec, ==, tv2.tv_usec); + g_date_time_unref (dt); +} + +static void +test_GDateTime_new_from_timeval_utc (void) +{ + GDateTime *dt; + GTimeVal tv, tv2; + + g_get_current_time (&tv); + dt = g_date_time_new_from_timeval_utc (&tv); + + if (g_test_verbose ()) + g_print ("\nDT%04d-%02d-%02dT%02d:%02d:%02d%s\n", + g_date_time_get_year (dt), + g_date_time_get_month (dt), + g_date_time_get_day_of_month (dt), + g_date_time_get_hour (dt), + g_date_time_get_minute (dt), + g_date_time_get_second (dt), + g_date_time_get_timezone_abbreviation (dt)); + + g_date_time_to_timeval (dt, &tv2); + g_assert_cmpint (tv.tv_sec, ==, tv2.tv_sec); + g_assert_cmpint (tv.tv_usec, ==, tv2.tv_usec); + g_date_time_unref (dt); +} + +static void +test_GDateTime_to_unix (void) +{ + GDateTime *dt; + time_t t; + + t = time (NULL); + dt = g_date_time_new_from_unix_local (t); + g_assert_cmpint (g_date_time_to_unix (dt), ==, t); + g_date_time_unref (dt); +} + +static void +test_GDateTime_add_years (void) +{ + GDateTime *dt, *dt2; + + dt = g_date_time_new_local (2009, 10, 19, 0, 0, 0); + dt2 = g_date_time_add_years (dt, 1); + g_assert_cmpint (2010, ==, g_date_time_get_year (dt2)); + g_date_time_unref (dt); + g_date_time_unref (dt2); +} + +static void +test_GDateTime_add_months (void) +{ +#define TEST_ADD_MONTHS(y,m,d,a,ny,nm,nd) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_utc (y, m, d, 0, 0, 0); \ + dt2 = g_date_time_add_months (dt, a); \ + ASSERT_DATE (dt2, ny, nm, nd); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_MONTHS (2009, 12, 31, 1, 2010, 1, 31); + TEST_ADD_MONTHS (2009, 12, 31, 1, 2010, 1, 31); + TEST_ADD_MONTHS (2009, 6, 15, 1, 2009, 7, 15); + TEST_ADD_MONTHS (1400, 3, 1, 1, 1400, 4, 1); + TEST_ADD_MONTHS (1400, 1, 31, 1, 1400, 2, 28); + TEST_ADD_MONTHS (1400, 1, 31, 7200, 2000, 1, 31); + TEST_ADD_MONTHS (2008, 2, 29, 12, 2009, 2, 28); + TEST_ADD_MONTHS (2000, 8, 16, -5, 2000, 3, 16); + TEST_ADD_MONTHS (2000, 8, 16, -12, 1999, 8, 16); + TEST_ADD_MONTHS (2011, 2, 1, -13, 2010, 1, 1); + TEST_ADD_MONTHS (1776, 7, 4, 1200, 1876, 7, 4); +} + +static void +test_GDateTime_add_days (void) +{ +#define TEST_ADD_DAYS(y,m,d,a,ny,nm,nd) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_local (y, m, d, 0, 0, 0); \ + dt2 = g_date_time_add_days (dt, a); \ + g_assert_cmpint (ny, ==, g_date_time_get_year (dt2)); \ + g_assert_cmpint (nm, ==, g_date_time_get_month (dt2)); \ + g_assert_cmpint (nd, ==, g_date_time_get_day_of_month (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_DAYS (2009, 1, 31, 1, 2009, 2, 1); + TEST_ADD_DAYS (2009, 2, 1, -1, 2009, 1, 31); + TEST_ADD_DAYS (2008, 2, 28, 1, 2008, 2, 29); + TEST_ADD_DAYS (2008, 12, 31, 1, 2009, 1, 1); + TEST_ADD_DAYS (1, 1, 1, 1, 1, 1, 2); + TEST_ADD_DAYS (1955, 5, 24, 10, 1955, 6, 3); + TEST_ADD_DAYS (1955, 5, 24, -10, 1955, 5, 14); +} + +static void +test_GDateTime_add_weeks (void) +{ +#define TEST_ADD_WEEKS(y,m,d,a,ny,nm,nd) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_local (y, m, d, 0, 0, 0); \ + dt2 = g_date_time_add_weeks (dt, a); \ + g_assert_cmpint (ny, ==, g_date_time_get_year (dt2)); \ + g_assert_cmpint (nm, ==, g_date_time_get_month (dt2)); \ + g_assert_cmpint (nd, ==, g_date_time_get_day_of_month (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_WEEKS (2009, 1, 1, 1, 2009, 1, 8); + TEST_ADD_WEEKS (2009, 8, 30, 1, 2009, 9, 6); + TEST_ADD_WEEKS (2009, 12, 31, 1, 2010, 1, 7); + TEST_ADD_WEEKS (2009, 1, 1, -1, 2008, 12, 25); +} + +static void +test_GDateTime_add_hours (void) +{ +#define TEST_ADD_HOURS(y,m,d,h,mi,s,a,ny,nm,nd,nh,nmi,ns) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_utc (y, m, d, h, mi, s); \ + dt2 = g_date_time_add_hours (dt, a); \ + g_assert_cmpint (ny, ==, g_date_time_get_year (dt2)); \ + g_assert_cmpint (nm, ==, g_date_time_get_month (dt2)); \ + g_assert_cmpint (nd, ==, g_date_time_get_day_of_month (dt2)); \ + g_assert_cmpint (nh, ==, g_date_time_get_hour (dt2)); \ + g_assert_cmpint (nmi, ==, g_date_time_get_minute (dt2)); \ + g_assert_cmpint (ns, ==, g_date_time_get_second (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_HOURS (2009, 1, 1, 0, 0, 0, 1, 2009, 1, 1, 1, 0, 0); + TEST_ADD_HOURS (2008, 12, 31, 23, 0, 0, 1, 2009, 1, 1, 0, 0, 0); +} + +static void +test_GDateTime_add_full (void) +{ +#define TEST_ADD_FULL(y,m,d,h,mi,s,ay,am,ad,ah,ami,as,ny,nm,nd,nh,nmi,ns) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_utc (y, m, d, h, mi, s); \ + dt2 = g_date_time_add_full (dt, ay, am, ad, ah, ami, as); \ + g_assert_cmpint (ny, ==, g_date_time_get_year (dt2)); \ + g_assert_cmpint (nm, ==, g_date_time_get_month (dt2)); \ + g_assert_cmpint (nd, ==, g_date_time_get_day_of_month (dt2)); \ + g_assert_cmpint (nh, ==, g_date_time_get_hour (dt2)); \ + g_assert_cmpint (nmi, ==, g_date_time_get_minute (dt2)); \ + g_assert_cmpint (ns, ==, g_date_time_get_second (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_FULL (2009, 10, 21, 0, 0, 0, + 1, 1, 1, 1, 1, 1, + 2010, 11, 22, 1, 1, 1); + TEST_ADD_FULL (2000, 1, 1, 1, 1, 1, + 0, 1, 0, 0, 0, 0, + 2000, 2, 1, 1, 1, 1); + TEST_ADD_FULL (2000, 1, 1, 0, 0, 0, + -1, 1, 0, 0, 0, 0, + 1999, 2, 1, 0, 0, 0); + TEST_ADD_FULL (2010, 10, 31, 0, 0, 0, + 0, 4, 0, 0, 0, 0, + 2011, 2, 28, 0, 0, 0); + TEST_ADD_FULL (2010, 8, 25, 22, 45, 0, + 0, 1, 6, 1, 25, 0, + 2010, 10, 2, 0, 10, 0); +} + +static void +test_GDateTime_add_minutes (void) +{ +#define TEST_ADD_MINUTES(i,o) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_local (2000, 1, 1, 0, 0, 0); \ + dt2 = g_date_time_add_minutes (dt, i); \ + g_assert_cmpint (o, ==, g_date_time_get_minute (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_MINUTES (60, 0); + TEST_ADD_MINUTES (100, 40); + TEST_ADD_MINUTES (5, 5); + TEST_ADD_MINUTES (1441, 1); + TEST_ADD_MINUTES (-1441, 59); +} + +static void +test_GDateTime_add_seconds (void) +{ +#define TEST_ADD_SECONDS(i,o) G_STMT_START { \ + GDateTime *dt, *dt2; \ + dt = g_date_time_new_local (2000, 1, 1, 0, 0, 0); \ + dt2 = g_date_time_add_seconds (dt, i); \ + g_assert_cmpint (o, ==, g_date_time_get_second (dt2)); \ + g_date_time_unref (dt); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_ADD_SECONDS (1, 1); + TEST_ADD_SECONDS (60, 0); + TEST_ADD_SECONDS (61, 1); + TEST_ADD_SECONDS (120, 0); + TEST_ADD_SECONDS (-61, 59); + TEST_ADD_SECONDS (86401, 1); + TEST_ADD_SECONDS (-86401, 59); + TEST_ADD_SECONDS (-31, 29); + TEST_ADD_SECONDS (13, 13); +} + +static void +test_GDateTime_diff (void) +{ +#define TEST_DIFF(y,m,d,y2,m2,d2,u) G_STMT_START { \ + GDateTime *dt1, *dt2; \ + GTimeSpan ts = 0; \ + dt1 = g_date_time_new_local (y, m, d, 0, 0, 0); \ + dt2 = g_date_time_new_local (y2, m2, d2, 0, 0, 0); \ + ts = g_date_time_difference (dt2, dt1); \ + g_assert_cmpint (ts, ==, u); \ + g_date_time_unref (dt1); \ + g_date_time_unref (dt2); \ +} G_STMT_END + + TEST_DIFF (2009, 1, 1, 2009, 2, 1, G_TIME_SPAN_DAY * 31); + TEST_DIFF (2009, 1, 1, 2010, 1, 1, G_TIME_SPAN_DAY * 365); + TEST_DIFF (2008, 2, 28, 2008, 2, 29, G_TIME_SPAN_DAY); + TEST_DIFF (2008, 2, 29, 2008, 2, 28, -G_TIME_SPAN_DAY); + + /* TODO: Add usec tests */ +} + +static void +test_GDateTime_get_minute (void) +{ + GDateTime *dt; + + dt = g_date_time_new_utc (2009, 12, 1, 1, 31, 0); + g_assert_cmpint (31, ==, g_date_time_get_minute (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_month (void) +{ + GDateTime *dt; + + dt = g_date_time_new_utc (2009, 12, 1, 1, 31, 0); + g_assert_cmpint (12, ==, g_date_time_get_month (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_second (void) +{ + GDateTime *dt; + + dt = g_date_time_new_utc (2009, 12, 1, 1, 31, 44); + g_assert_cmpint (44, ==, g_date_time_get_second (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_new_full (void) +{ + GTimeZone *tz; + GDateTime *dt; + + dt = g_date_time_new_utc (2009, 12, 11, 12, 11, 10); + g_assert_cmpint (2009, ==, g_date_time_get_year (dt)); + g_assert_cmpint (12, ==, g_date_time_get_month (dt)); + g_assert_cmpint (11, ==, g_date_time_get_day_of_month (dt)); + g_assert_cmpint (12, ==, g_date_time_get_hour (dt)); + g_assert_cmpint (11, ==, g_date_time_get_minute (dt)); + g_assert_cmpint (10, ==, g_date_time_get_second (dt)); + g_date_time_unref (dt); + +#ifdef G_OS_UNIX + tz = g_time_zone_new ("America/Recife"); +#elif defined G_OS_WIN32 + tz = g_time_zone_new ("E. South America Standard Time"); +#endif + dt = g_date_time_new (tz, 2010, 5, 24, 8, 4, 0); + g_time_zone_unref (tz); + g_assert_cmpint (2010, ==, g_date_time_get_year (dt)); + g_assert_cmpint (5, ==, g_date_time_get_month (dt)); + g_assert_cmpint (24, ==, g_date_time_get_day_of_month (dt)); + g_assert_cmpint (8, ==, g_date_time_get_hour (dt)); + g_assert_cmpint (4, ==, g_date_time_get_minute (dt)); + g_assert_cmpint (0, ==, g_date_time_get_second (dt)); +#ifdef G_OS_UNIX + g_assert_cmpstr ("BRT", ==, g_date_time_get_timezone_abbreviation (dt)); +#elif defined G_OS_WIN32 + g_assert_cmpstr ("E. South America Standard Time", ==, + g_date_time_get_timezone_abbreviation (dt)); +#endif + g_assert (!g_date_time_is_daylight_savings (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_now_utc (void) +{ + GDateTime *dt; + time_t t; + struct tm tm; + + t = time (NULL); +#ifdef HAVE_GMTIME_R + gmtime_r (&t, &tm); +#else + { + struct tm *tmp = gmtime (&t); + /* Assume gmtime() can't fail as we got t from time(NULL). (Note + * that on Windows, gmtime() *is* MT-safe, it uses a thread-local + * buffer.) + */ + memcpy (&tm, tmp, sizeof (struct tm)); + } +#endif + dt = g_date_time_new_now_utc (); + g_assert_cmpint (tm.tm_year + 1900, ==, g_date_time_get_year (dt)); + g_assert_cmpint (tm.tm_mon + 1, ==, g_date_time_get_month (dt)); + g_assert_cmpint (tm.tm_mday, ==, g_date_time_get_day_of_month (dt)); + g_assert_cmpint (tm.tm_hour, ==, g_date_time_get_hour (dt)); + g_assert_cmpint (tm.tm_min, ==, g_date_time_get_minute (dt)); + g_assert_cmpint (tm.tm_sec, ==, g_date_time_get_second (dt)); + g_date_time_unref (dt); +} + +static void +test_GDateTime_new_from_unix_utc (void) +{ + GDateTime *dt; + gint64 t; + + t = g_get_real_time (); + +#if 0 + dt = g_date_time_new_from_unix_utc (t); + g_assert (dt == NULL); +#endif + + t = t / 1e6; /* oops, this was microseconds */ + + dt = g_date_time_new_from_unix_utc (t); + g_assert (dt != NULL); + + g_assert (dt == g_date_time_ref (dt)); + g_date_time_unref (dt); + g_assert_cmpint (g_date_time_to_unix (dt), ==, t); + g_date_time_unref (dt); +} + +static void +test_GDateTime_get_utc_offset (void) +{ +#if defined (HAVE_STRUCT_TM_TM_GMTOFF) || defined (HAVE_STRUCT_TM___TM_GMTOFF) + GDateTime *dt; + GTimeSpan ts; + struct tm tm; + + memset (&tm, 0, sizeof (tm)); + get_localtime_tm (time (NULL), &tm); + + dt = g_date_time_new_now_local (); + ts = g_date_time_get_utc_offset (dt); +#ifdef HAVE_STRUCT_TM_TM_GMTOFF + g_assert_cmpint (ts, ==, (tm.tm_gmtoff * G_TIME_SPAN_SECOND)); +#endif +#ifdef HAVE_STRUCT_TM___TM_GMTOFF + g_assert_cmpint (ts, ==, (tm.__tm_gmtoff * G_TIME_SPAN_SECOND)); +#endif + g_date_time_unref (dt); +#endif +} + +static void +test_GDateTime_to_timeval (void) +{ + GTimeVal tv1, tv2; + GDateTime *dt; + + memset (&tv1, 0, sizeof (tv1)); + memset (&tv2, 0, sizeof (tv2)); + + g_get_current_time (&tv1); + dt = g_date_time_new_from_timeval_local (&tv1); + g_date_time_to_timeval (dt, &tv2); + g_assert_cmpint (tv1.tv_sec, ==, tv2.tv_sec); + g_assert_cmpint (tv1.tv_usec, ==, tv2.tv_usec); + g_date_time_unref (dt); +} + +static void +test_GDateTime_to_local (void) +{ + GDateTime *utc, *now, *dt; + + utc = g_date_time_new_now_utc (); + now = g_date_time_new_now_local (); + dt = g_date_time_to_local (utc); + + g_assert_cmpint (g_date_time_get_year (now), ==, g_date_time_get_year (dt)); + g_assert_cmpint (g_date_time_get_month (now), ==, g_date_time_get_month (dt)); + g_assert_cmpint (g_date_time_get_day_of_month (now), ==, g_date_time_get_day_of_month (dt)); + g_assert_cmpint (g_date_time_get_hour (now), ==, g_date_time_get_hour (dt)); + g_assert_cmpint (g_date_time_get_minute (now), ==, g_date_time_get_minute (dt)); + g_assert_cmpint (g_date_time_get_second (now), ==, g_date_time_get_second (dt)); + + g_date_time_unref (now); + g_date_time_unref (utc); + g_date_time_unref (dt); +} + +static void +test_GDateTime_to_utc (void) +{ + GDateTime *dt, *dt2; + time_t t; + struct tm tm; + + t = time (NULL); +#ifdef HAVE_GMTIME_R + gmtime_r (&t, &tm); +#else + { + struct tm *tmp = gmtime (&t); + memcpy (&tm, tmp, sizeof (struct tm)); + } +#endif + dt2 = g_date_time_new_from_unix_local (t); + dt = g_date_time_to_utc (dt2); + g_assert_cmpint (tm.tm_year + 1900, ==, g_date_time_get_year (dt)); + g_assert_cmpint (tm.tm_mon + 1, ==, g_date_time_get_month (dt)); + g_assert_cmpint (tm.tm_mday, ==, g_date_time_get_day_of_month (dt)); + g_assert_cmpint (tm.tm_hour, ==, g_date_time_get_hour (dt)); + g_assert_cmpint (tm.tm_min, ==, g_date_time_get_minute (dt)); + g_assert_cmpint (tm.tm_sec, ==, g_date_time_get_second (dt)); + g_date_time_unref (dt); + g_date_time_unref (dt2); +} + +static void +test_GDateTime_get_day_of_year (void) +{ +#define TEST_DAY_OF_YEAR(y,m,d,o) G_STMT_START { \ + GDateTime *__dt = g_date_time_new_local ((y), (m), (d), 0, 0, 0); \ + g_assert_cmpint ((o), ==, g_date_time_get_day_of_year (__dt)); \ + g_date_time_unref (__dt); } G_STMT_END + + TEST_DAY_OF_YEAR (2009, 1, 1, 1); + TEST_DAY_OF_YEAR (2009, 2, 1, 32); + TEST_DAY_OF_YEAR (2009, 8, 16, 228); + TEST_DAY_OF_YEAR (2008, 8, 16, 229); +} + +static void +test_GDateTime_printf (void) +{ +/* 64 seems big, but one zoneinfo file, Factory, has an abbreviation + * that long, and it will cause the test to fail if dst isn't big + * enough. + */ + gchar dst[64]; + struct tm tt; + time_t t; + gchar t_str[16]; + +#define TEST_PRINTF(f,o) G_STMT_START { \ +GDateTime *__dt = g_date_time_new_local (2009, 10, 24, 0, 0, 0);\ + gchar *__p = g_date_time_format (__dt, (f)); \ + g_assert_cmpstr (__p, ==, (o)); \ + g_date_time_unref (__dt); \ + g_free (__p); } G_STMT_END + +#define TEST_PRINTF_DATE(y,m,d,f,o) G_STMT_START { \ + GDateTime *dt = g_date_time_new_local (y, m, d, 0, 0, 0); \ + gchar *p = g_date_time_format (dt, (f)); \ + g_assert_cmpstr (p, ==, (o)); \ + g_date_time_unref (dt); \ + g_free (p); } G_STMT_END + +#define TEST_PRINTF_TIME(h,m,s,f,o) G_STMT_START { \ + GDateTime *dt = g_date_time_new_local (2009, 10, 24, (h), (m), (s)); \ + gchar *p = g_date_time_format (dt, (f)); \ + g_assert_cmpstr (p, ==, (o)); \ + g_date_time_unref (dt); \ + g_free (p); } G_STMT_END + + /* + * This is a little helper to make sure we can compare timezones to + * that of the generated timezone. + */ + t = time (NULL); + memset (&tt, 0, sizeof(tt)); + get_localtime_tm (t, &tt); + tt.tm_year = 2009 - 1900; + tt.tm_mon = 9; /* 0 indexed */ + tt.tm_mday = 24; + t = mktime (&tt); + memset (&tt, 0, sizeof(tt)); + get_localtime_tm (t, &tt); + strftime (dst, sizeof(dst), "%Z", &tt); + + /* get current time_t for 20090924 in the local timezone */ + tt.tm_sec = 0; + tt.tm_min = 0; + tt.tm_hour = 0; + t = mktime (&tt); + g_sprintf (t_str, "%ld", t); + + TEST_PRINTF ("%a", "Sat"); + TEST_PRINTF ("%A", "Saturday"); + TEST_PRINTF ("%b", "Oct"); + TEST_PRINTF ("%B", "October"); + TEST_PRINTF ("%d", "24"); + TEST_PRINTF_DATE (2009, 1, 1, "%d", "01"); + TEST_PRINTF ("%e", "24"); // fixme + TEST_PRINTF ("%h", "Oct"); + TEST_PRINTF ("%H", "00"); + TEST_PRINTF_TIME (15, 0, 0, "%H", "15"); + TEST_PRINTF ("%I", "12"); + TEST_PRINTF_TIME (12, 0, 0, "%I", "12"); + TEST_PRINTF_TIME (15, 0, 0, "%I", "03"); + TEST_PRINTF ("%j", "297"); + TEST_PRINTF ("%k", " 0"); + TEST_PRINTF_TIME (13, 13, 13, "%k", "13"); + TEST_PRINTF ("%l", "12"); + TEST_PRINTF_TIME (12, 0, 0, "%I", "12"); + TEST_PRINTF_TIME (13, 13, 13, "%l", " 1"); + TEST_PRINTF_TIME (10, 13, 13, "%l", "10"); + TEST_PRINTF ("%m", "10"); + TEST_PRINTF ("%M", "00"); + TEST_PRINTF ("%p", "AM"); + TEST_PRINTF_TIME (13, 13, 13, "%p", "PM"); + TEST_PRINTF ("%P", "am"); + TEST_PRINTF_TIME (13, 13, 13, "%P", "pm"); + TEST_PRINTF ("%r", "12:00:00 AM"); + TEST_PRINTF_TIME (13, 13, 13, "%r", "01:13:13 PM"); + TEST_PRINTF ("%R", "00:00"); + TEST_PRINTF_TIME (13, 13, 31, "%R", "13:13"); + //TEST_PRINTF ("%s", t_str); + TEST_PRINTF ("%S", "00"); + TEST_PRINTF ("%t", " "); + TEST_PRINTF ("%u", "6"); + TEST_PRINTF ("%x", "10/24/09"); + TEST_PRINTF ("%X", "00:00:00"); + TEST_PRINTF_TIME (13, 14, 15, "%X", "13:14:15"); + TEST_PRINTF ("%y", "09"); + TEST_PRINTF ("%Y", "2009"); + TEST_PRINTF ("%%", "%"); + TEST_PRINTF ("%", ""); + TEST_PRINTF ("%9", NULL); +#ifdef G_OS_UNIX + TEST_PRINTF ("%Z", dst); +#elif defined G_OS_WIN32 + TEST_PRINTF ("%Z", "Pacific Standard Time"); +#endif +} + +static void +test_non_utf8_printf (void) +{ + gchar *oldlocale; + + oldlocale = g_strdup (setlocale (LC_ALL, NULL)); + setlocale (LC_ALL, "ja_JP.eucjp"); + if (strstr (setlocale (LC_ALL, NULL), "ja_JP") == NULL) + { + g_test_message ("locale ja_JP.eucjp not available, skipping non-UTF8 tests"); + g_free (oldlocale); + return; + } + if (g_get_charset (NULL)) + { + g_test_message ("locale ja_JP.eucjp may be available, but glib seems to think that it's equivalent to UTF-8, skipping non-UTF-8 tests."); + g_test_message ("This is a known issue on Darwin"); + setlocale (LC_ALL, oldlocale); + g_free (oldlocale); + return; + } + + /* These are the outputs that ja_JP.UTF-8 generates; if everything + * is working then ja_JP.eucjp should generate the same. + */ + TEST_PRINTF ("%a", "\345\234\237"); + TEST_PRINTF ("%A", "\345\234\237\346\233\234\346\227\245"); +#ifndef HAVE_CARBON /* OSX just returns the number */ + TEST_PRINTF ("%b", "10\346\234\210"); +#endif + TEST_PRINTF ("%B", "10\346\234\210"); + TEST_PRINTF ("%d", "24"); + TEST_PRINTF_DATE (2009, 1, 1, "%d", "01"); + TEST_PRINTF ("%e", "24"); // fixme +#ifndef HAVE_CARBON /* OSX just returns the number */ + TEST_PRINTF ("%h", "10\346\234\210"); +#endif + TEST_PRINTF ("%H", "00"); + TEST_PRINTF_TIME (15, 0, 0, "%H", "15"); + TEST_PRINTF ("%I", "12"); + TEST_PRINTF_TIME (12, 0, 0, "%I", "12"); + TEST_PRINTF_TIME (15, 0, 0, "%I", "03"); + TEST_PRINTF ("%j", "297"); + TEST_PRINTF ("%k", " 0"); + TEST_PRINTF_TIME (13, 13, 13, "%k", "13"); + TEST_PRINTF ("%l", "12"); + TEST_PRINTF_TIME (12, 0, 0, "%I", "12"); + TEST_PRINTF_TIME (13, 13, 13, "%l", " 1"); + TEST_PRINTF_TIME (10, 13, 13, "%l", "10"); + TEST_PRINTF ("%m", "10"); + TEST_PRINTF ("%M", "00"); +#ifndef HAVE_CARBON /* OSX returns latin "AM", not japanese */ + TEST_PRINTF ("%p", "\345\215\210\345\211\215"); + TEST_PRINTF_TIME (13, 13, 13, "%p", "\345\215\210\345\276\214"); + TEST_PRINTF ("%P", "\345\215\210\345\211\215"); + TEST_PRINTF_TIME (13, 13, 13, "%P", "\345\215\210\345\276\214"); + TEST_PRINTF ("%r", "\345\215\210\345\211\21512\346\231\20200\345\210\20600\347\247\222"); + TEST_PRINTF_TIME (13, 13, 13, "%r", "\345\215\210\345\276\21401\346\231\20213\345\210\20613\347\247\222"); +#endif + TEST_PRINTF ("%R", "00:00"); + TEST_PRINTF_TIME (13, 13, 31, "%R", "13:13"); + TEST_PRINTF ("%S", "00"); + TEST_PRINTF ("%t", " "); + TEST_PRINTF ("%u", "6"); +#ifndef HAVE_CARBON /* OSX returns YYYY/MM/DD in ASCII */ + TEST_PRINTF ("%x", "2009\345\271\26410\346\234\21024\346\227\245"); +#endif + TEST_PRINTF ("%X", "00\346\231\20200\345\210\20600\347\247\222"); + TEST_PRINTF_TIME (13, 14, 15, "%X", "13\346\231\20214\345\210\20615\347\247\222"); + TEST_PRINTF ("%y", "09"); + TEST_PRINTF ("%Y", "2009"); + TEST_PRINTF ("%%", "%"); + TEST_PRINTF ("%", ""); + TEST_PRINTF ("%9", NULL); + + setlocale (LC_ALL, oldlocale); + g_free (oldlocale); +} + +static void +test_modifiers (void) +{ + gchar *oldlocale; + + TEST_PRINTF_DATE (2009, 1, 1, "%d", "01"); + TEST_PRINTF_DATE (2009, 1, 1, "%_d", " 1"); + TEST_PRINTF_DATE (2009, 1, 1, "%-d", "1"); + TEST_PRINTF_DATE (2009, 1, 1, "%0d", "01"); + TEST_PRINTF_DATE (2009, 1, 21, "%d", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%_d", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%-d", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%0d", "21"); + + TEST_PRINTF_DATE (2009, 1, 1, "%e", " 1"); + TEST_PRINTF_DATE (2009, 1, 1, "%_e", " 1"); + TEST_PRINTF_DATE (2009, 1, 1, "%-e", "1"); + TEST_PRINTF_DATE (2009, 1, 1, "%0e", "01"); + TEST_PRINTF_DATE (2009, 1, 21, "%e", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%_e", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%-e", "21"); + TEST_PRINTF_DATE (2009, 1, 21, "%0e", "21"); + + TEST_PRINTF_TIME ( 1, 0, 0, "%H", "01"); + TEST_PRINTF_TIME ( 1, 0, 0, "%_H", " 1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%-H", "1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%0H", "01"); + TEST_PRINTF_TIME (21, 0, 0, "%H", "21"); + TEST_PRINTF_TIME (21, 0, 0, "%_H", "21"); + TEST_PRINTF_TIME (21, 0, 0, "%-H", "21"); + TEST_PRINTF_TIME (21, 0, 0, "%0H", "21"); + + TEST_PRINTF_TIME ( 1, 0, 0, "%I", "01"); + TEST_PRINTF_TIME ( 1, 0, 0, "%_I", " 1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%-I", "1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%0I", "01"); + TEST_PRINTF_TIME (23, 0, 0, "%I", "11"); + TEST_PRINTF_TIME (23, 0, 0, "%_I", "11"); + TEST_PRINTF_TIME (23, 0, 0, "%-I", "11"); + TEST_PRINTF_TIME (23, 0, 0, "%0I", "11"); + + TEST_PRINTF_TIME ( 1, 0, 0, "%k", " 1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%_k", " 1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%-k", "1"); + TEST_PRINTF_TIME ( 1, 0, 0, "%0k", "01"); + + oldlocale = g_strdup (setlocale (LC_ALL, NULL)); + setlocale (LC_ALL, "fa_IR.utf-8"); + if (strstr (setlocale (LC_ALL, NULL), "fa_IR") != NULL) + { + TEST_PRINTF_TIME (23, 0, 0, "%OH", "\333\262\333\263"); /* '23' */ + TEST_PRINTF_TIME (23, 0, 0, "%OI", "\333\261\333\261"); /* '11' */ + TEST_PRINTF_TIME (23, 0, 0, "%OM", "\333\260\333\260"); /* '00' */ + + TEST_PRINTF_DATE (2011, 7, 1, "%Om", "\333\260\333\267"); /* '07' */ + TEST_PRINTF_DATE (2011, 7, 1, "%0Om", "\333\260\333\267"); /* '07' */ + TEST_PRINTF_DATE (2011, 7, 1, "%-Om", "\333\267"); /* '7' */ + TEST_PRINTF_DATE (2011, 7, 1, "%_Om", " \333\267"); /* ' 7' */ + } + else + g_test_message ("locale fa_IR not available, skipping O modifier tests"); + setlocale (LC_ALL, oldlocale); + g_free (oldlocale); +} + +static void +test_GDateTime_dst (void) +{ + GDateTime *dt1, *dt2; + GTimeZone *tz; + + /* this date has the DST state set for Europe/London */ +#ifdef G_OS_UNIX + tz = g_time_zone_new ("Europe/London"); +#elif defined G_OS_WIN32 + tz = g_time_zone_new ("GMT Standard Time"); +#endif + dt1 = g_date_time_new (tz, 2009, 8, 15, 3, 0, 1); + g_assert (g_date_time_is_daylight_savings (dt1)); + g_assert_cmpint (g_date_time_get_utc_offset (dt1) / G_USEC_PER_SEC, ==, 3600); + g_assert_cmpint (g_date_time_get_hour (dt1), ==, 3); + + /* add 6 months to clear the DST flag but keep the same time */ + dt2 = g_date_time_add_months (dt1, 6); + g_assert (!g_date_time_is_daylight_savings (dt2)); + g_assert_cmpint (g_date_time_get_utc_offset (dt2) / G_USEC_PER_SEC, ==, 0); + g_assert_cmpint (g_date_time_get_hour (dt2), ==, 3); + + g_date_time_unref (dt2); + g_date_time_unref (dt1); + + /* now do the reverse: start with a non-DST state and move to DST */ + dt1 = g_date_time_new (tz, 2009, 2, 15, 2, 0, 1); + g_assert (!g_date_time_is_daylight_savings (dt1)); + g_assert_cmpint (g_date_time_get_hour (dt1), ==, 2); + + dt2 = g_date_time_add_months (dt1, 6); + g_assert (g_date_time_is_daylight_savings (dt2)); + g_assert_cmpint (g_date_time_get_hour (dt2), ==, 2); + + g_date_time_unref (dt2); + g_date_time_unref (dt1); + g_time_zone_unref (tz); +} + +static inline gboolean +is_leap_year (gint year) +{ + g_assert (1 <= year && year <= 9999); + + return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); +} + +static inline gint +days_in_month (gint year, gint month) +{ + const gint table[2][13] = { + {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} + }; + + g_assert (1 <= month && month <= 12); + + return table[is_leap_year (year)][month]; +} + +static void +test_all_dates (void) +{ + gint year, month, day; + GTimeZone *timezone; + gint64 unix_time; + gint day_of_year; + gint week_year; + gint week_num; + gint weekday; + + /* save some time by hanging on to this. */ + timezone = g_time_zone_new_utc (); + + unix_time = G_GINT64_CONSTANT(-62135596800); + + /* 0001-01-01 is 0001-W01-1 */ + week_year = 1; + week_num = 1; + weekday = 1; + + + /* The calendar makes a full cycle every 400 years, so we could + * theoretically just test years 1 through 400. That assumes that our + * software has no bugs, so probably we should just test them all. :) + */ + for (year = 1; year <= 9999; year++) + { + day_of_year = 1; + + for (month = 1; month <= 12; month++) + for (day = 1; day <= days_in_month (year, month); day++) + { + GDateTime *dt; + + dt = g_date_time_new (timezone, year, month, day, 0, 0, 0); + +#if 0 + g_print ("%04d-%02d-%02d = %04d-W%02d-%d = %04d-%03d\n", + year, month, day, + week_year, week_num, weekday, + year, day_of_year); +#endif + + /* sanity check */ + if G_UNLIKELY (g_date_time_get_year (dt) != year || + g_date_time_get_month (dt) != month || + g_date_time_get_day_of_month (dt) != day) + g_error ("%04d-%02d-%02d comes out as %04d-%02d-%02d", + year, month, day, + g_date_time_get_year (dt), + g_date_time_get_month (dt), + g_date_time_get_day_of_month (dt)); + + if G_UNLIKELY (g_date_time_get_week_numbering_year (dt) != week_year || + g_date_time_get_week_of_year (dt) != week_num || + g_date_time_get_day_of_week (dt) != weekday) + g_error ("%04d-%02d-%02d should be %04d-W%02d-%d but " + "comes out as %04d-W%02d-%d", year, month, day, + week_year, week_num, weekday, + g_date_time_get_week_numbering_year (dt), + g_date_time_get_week_of_year (dt), + g_date_time_get_day_of_week (dt)); + + if G_UNLIKELY (g_date_time_to_unix (dt) != unix_time) + g_error ("%04d-%02d-%02d 00:00:00 UTC should have unix time %" + G_GINT64_FORMAT " but comes out as %"G_GINT64_FORMAT, + year, month, day, unix_time, g_date_time_to_unix (dt)); + + if G_UNLIKELY (g_date_time_get_day_of_year (dt) != day_of_year) + g_error ("%04d-%02d-%02d should be day of year %d" + " but comes out as %d", year, month, day, + day_of_year, g_date_time_get_day_of_year (dt)); + + if G_UNLIKELY (g_date_time_get_hour (dt) != 0 || + g_date_time_get_minute (dt) != 0 || + g_date_time_get_seconds (dt) != 0) + g_error ("%04d-%02d-%02d 00:00:00 UTC comes out " + "as %02d:%02d:%02.6f", year, month, day, + g_date_time_get_hour (dt), + g_date_time_get_minute (dt), + g_date_time_get_seconds (dt)); + /* done */ + + /* add 24 hours to unix time */ + unix_time += 24 * 60 * 60; + + /* move day of year forward */ + day_of_year++; + + /* move the week date forward */ + if (++weekday == 8) + { + weekday = 1; /* Sunday -> Monday */ + + /* NOTE: year/month/day is the final day of the week we + * just finished. + * + * If we just finished the last week of last year then + * we are definitely starting the first week of this + * year. + * + * Otherwise, if we're still in this year, but Sunday + * fell on or after December 28 then December 29, 30, 31 + * could be days within the next year's first year. + */ + if (year != week_year || (month == 12 && day >= 28)) + { + /* first week of the new year */ + week_num = 1; + week_year++; + } + else + week_num++; + } + + g_date_time_unref (dt); + } + } + + g_time_zone_unref (timezone); +} + +static void +test_z (void) +{ + GTimeZone *tz; + GDateTime *dt; + gchar *p; + + g_test_bug ("642935"); + + tz = g_time_zone_new ("-08:00"); + dt = g_date_time_new (tz, 0, 0, 0, 0, 0, 0); + p = g_date_time_format (dt, "%z"); + g_assert_cmpstr (p, ==, "-0800"); + g_date_time_unref (dt); + g_time_zone_unref (tz); + g_free (p); +} + +static void +test_strftime (void) +{ +#ifdef __linux__ +#define TEST_FORMAT \ + "a%a A%A b%b B%B c%c C%C d%d e%e F%F g%g G%G h%h H%H I%I j%j m%m M%M " \ + "n%n p%p r%r R%R S%S t%t T%T u%u V%V w%w x%x X%X y%y Y%Y z%z Z%Z %%" + time_t t; + + /* 127997 is prime, 1315005118 is now */ + for (t = 0; t < 1315005118; t += 127997) + { + GDateTime *date_time; + gchar c_str[1000]; + gchar *dt_str; + + date_time = g_date_time_new_from_unix_local (t); + dt_str = g_date_time_format (date_time, TEST_FORMAT); + strftime (c_str, sizeof c_str, TEST_FORMAT, localtime (&t)); + g_assert_cmpstr (c_str, ==, dt_str); + g_date_time_unref (date_time); + g_free (dt_str); + } +#endif +} + +static void +test_find_interval (void) +{ + GTimeZone *tz; + GDateTime *dt; + gint64 u; + gint i1, i2; + +#ifdef G_OS_UNIX + tz = g_time_zone_new ("Canada/Eastern"); +#elif defined G_OS_WIN32 + tz = g_time_zone_new ("Eastern Standard Time"); +#endif + dt = g_date_time_new_utc (2010, 11, 7, 1, 30, 0); + u = g_date_time_to_unix (dt); + + i1 = g_time_zone_find_interval (tz, G_TIME_TYPE_STANDARD, u); + i2 = g_time_zone_find_interval (tz, G_TIME_TYPE_DAYLIGHT, u); + + g_assert_cmpint (i1, !=, i2); + + g_date_time_unref (dt); + + dt = g_date_time_new_utc (2010, 3, 14, 2, 0, 0); + u = g_date_time_to_unix (dt); + + i1 = g_time_zone_find_interval (tz, G_TIME_TYPE_STANDARD, u); + g_assert_cmpint (i1, ==, -1); + + g_date_time_unref (dt); + g_time_zone_unref (tz); +} + +static void +test_adjust_time (void) +{ + GTimeZone *tz; + GDateTime *dt; + gint64 u, u2; + gint i1, i2; + +#ifdef G_OS_UNIX + tz = g_time_zone_new ("Canada/Eastern"); +#elif defined G_OS_WIN32 + tz = g_time_zone_new ("Eastern Standard Time"); +#endif + dt = g_date_time_new_utc (2010, 11, 7, 1, 30, 0); + u = g_date_time_to_unix (dt); + u2 = u; + + i1 = g_time_zone_find_interval (tz, G_TIME_TYPE_DAYLIGHT, u); + i2 = g_time_zone_adjust_time (tz, G_TIME_TYPE_DAYLIGHT, &u2); + + g_assert_cmpint (i1, ==, i2); + g_assert (u == u2); + + g_date_time_unref (dt); + + dt = g_date_time_new_utc (2010, 3, 14, 2, 30, 0); + u2 = g_date_time_to_unix (dt); + g_date_time_unref (dt); + + dt = g_date_time_new_utc (2010, 3, 14, 3, 0, 0); + u = g_date_time_to_unix (dt); + g_date_time_unref (dt); + + i1 = g_time_zone_adjust_time (tz, G_TIME_TYPE_DAYLIGHT, &u2); + g_assert (u == u2); + + g_time_zone_unref (tz); +} + +static void +test_no_header (void) +{ + GTimeZone *tz; + + tz = g_time_zone_new ("blabla"); + + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 0); + g_assert (!g_time_zone_is_dst (tz, 0)); + + g_time_zone_unref (tz); +} + +static void +test_posix_parse (void) +{ + GTimeZone *tz; + GDateTime *gdt1, *gdt2; + + tz = g_time_zone_new ("PST"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 0); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_time_zone_unref (tz); + + tz = g_time_zone_new ("PST8"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_time_zone_unref (tz); + +/* This fails rules_from_identifier on Unix (though not on Windows) + * but passes anyway because PST8PDT is a zone name. + */ + tz = g_time_zone_new ("PST8PDT"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "PDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==,- 7 * 3600); + g_assert (g_time_zone_is_dst (tz, 1)); + g_time_zone_unref (tz); + + tz = g_time_zone_new ("PST8PDT6:32:15"); +#ifdef G_OS_WIN32 + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "PST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, - 8 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "PDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, - 6 * 3600 - 32 *60 - 15); + g_assert (g_time_zone_is_dst (tz, 1)); + gdt1 = g_date_time_new (tz, 2012, 12, 6, 11, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 6, 6, 11, 15, 23.0); + g_assert (!g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, -28800); + g_assert (g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, -23535); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); +#else + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "UTC"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 0); + g_assert (!g_time_zone_is_dst (tz, 0)); +#endif + g_time_zone_unref (tz); + + tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "NZDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, 13 * 3600); + g_assert (g_time_zone_is_dst (tz, 1)); + gdt1 = g_date_time_new (tz, 2012, 3, 18, 0, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 3, 18, 3, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 2012, 10, 7, 3, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 10, 7, 1, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + g_time_zone_unref (tz); + + tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,280,77"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "NZDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, 13 * 3600); + g_assert (g_time_zone_is_dst (tz, 1)); + gdt1 = g_date_time_new (tz, 2012, 3, 18, 0, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 3, 18, 3, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 2012, 10, 7, 3, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 10, 7, 1, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + g_time_zone_unref (tz); + + tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,J279,J76"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "NZDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, 13 * 3600); + g_assert (g_time_zone_is_dst (tz, 1)); + gdt1 = g_date_time_new (tz, 2012, 3, 18, 0, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 3, 18, 3, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 2012, 10, 7, 3, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 10, 7, 1, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + g_time_zone_unref (tz); + + tz = g_time_zone_new ("NZST-12:00:00NZDT-13:00:00,M10.1.0/07:00,M3.3.0/07:00"); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 0), ==, "NZST"); + g_assert_cmpint (g_time_zone_get_offset (tz, 0), ==, 12 * 3600); + g_assert (!g_time_zone_is_dst (tz, 0)); + g_assert_cmpstr (g_time_zone_get_abbreviation (tz, 1), ==, "NZDT"); + g_assert_cmpint (g_time_zone_get_offset (tz, 1), ==, 13 * 3600); + g_assert (g_time_zone_is_dst (tz, 1)); + gdt1 = g_date_time_new (tz, 2012, 3, 18, 5, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 3, 18, 8, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 2012, 10, 7, 8, 15, 23.0); + gdt2 = g_date_time_new (tz, 2012, 10, 7, 6, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 1902, 10, 7, 8, 15, 23.0); + gdt2 = g_date_time_new (tz, 1902, 10, 7, 6, 15, 23.0); + g_assert (!g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 43200); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 2142, 10, 7, 8, 15, 23.0); + gdt2 = g_date_time_new (tz, 2142, 10, 7, 6, 15, 23.0); + g_assert (g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 46800); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + gdt1 = g_date_time_new (tz, 3212, 10, 7, 8, 15, 23.0); + gdt2 = g_date_time_new (tz, 3212, 10, 7, 6, 15, 23.0); + g_assert (!g_date_time_is_daylight_savings (gdt1)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt1) / 1000000, ==, 43200); + g_assert (!g_date_time_is_daylight_savings (gdt2)); + g_assert_cmpint (g_date_time_get_utc_offset (gdt2) / 1000000, ==, 43200); + g_date_time_unref (gdt1); + g_date_time_unref (gdt2); + g_time_zone_unref (tz); +} + +gint +main (gint argc, + gchar *argv[]) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + /* GDateTime Tests */ + + g_test_add_func ("/GDateTime/add_days", test_GDateTime_add_days); + g_test_add_func ("/GDateTime/add_full", test_GDateTime_add_full); + g_test_add_func ("/GDateTime/add_hours", test_GDateTime_add_hours); + g_test_add_func ("/GDateTime/add_minutes", test_GDateTime_add_minutes); + g_test_add_func ("/GDateTime/add_months", test_GDateTime_add_months); + g_test_add_func ("/GDateTime/add_seconds", test_GDateTime_add_seconds); + g_test_add_func ("/GDateTime/add_weeks", test_GDateTime_add_weeks); + g_test_add_func ("/GDateTime/add_years", test_GDateTime_add_years); + g_test_add_func ("/GDateTime/compare", test_GDateTime_compare); + g_test_add_func ("/GDateTime/diff", test_GDateTime_diff); + g_test_add_func ("/GDateTime/equal", test_GDateTime_equal); + g_test_add_func ("/GDateTime/get_day_of_week", test_GDateTime_get_day_of_week); + g_test_add_func ("/GDateTime/get_day_of_month", test_GDateTime_get_day_of_month); + g_test_add_func ("/GDateTime/get_day_of_year", test_GDateTime_get_day_of_year); + g_test_add_func ("/GDateTime/get_hour", test_GDateTime_get_hour); + g_test_add_func ("/GDateTime/get_microsecond", test_GDateTime_get_microsecond); + g_test_add_func ("/GDateTime/get_minute", test_GDateTime_get_minute); + g_test_add_func ("/GDateTime/get_month", test_GDateTime_get_month); + g_test_add_func ("/GDateTime/get_second", test_GDateTime_get_second); + g_test_add_func ("/GDateTime/get_utc_offset", test_GDateTime_get_utc_offset); + g_test_add_func ("/GDateTime/get_year", test_GDateTime_get_year); + g_test_add_func ("/GDateTime/hash", test_GDateTime_hash); + g_test_add_func ("/GDateTime/new_from_unix", test_GDateTime_new_from_unix); + g_test_add_func ("/GDateTime/new_from_unix_utc", test_GDateTime_new_from_unix_utc); + g_test_add_func ("/GDateTime/new_from_timeval", test_GDateTime_new_from_timeval); + g_test_add_func ("/GDateTime/new_from_timeval_utc", test_GDateTime_new_from_timeval_utc); + g_test_add_func ("/GDateTime/new_full", test_GDateTime_new_full); + g_test_add_func ("/GDateTime/now", test_GDateTime_now); + g_test_add_func ("/GDateTime/printf", test_GDateTime_printf); + g_test_add_func ("/GDateTime/non_utf8_printf", test_non_utf8_printf); + g_test_add_func ("/GDateTime/strftime", test_strftime); + g_test_add_func ("/GDateTime/modifiers", test_modifiers); + g_test_add_func ("/GDateTime/to_local", test_GDateTime_to_local); + g_test_add_func ("/GDateTime/to_unix", test_GDateTime_to_unix); + g_test_add_func ("/GDateTime/to_timeval", test_GDateTime_to_timeval); + g_test_add_func ("/GDateTime/to_utc", test_GDateTime_to_utc); + g_test_add_func ("/GDateTime/now_utc", test_GDateTime_now_utc); + g_test_add_func ("/GDateTime/dst", test_GDateTime_dst); + g_test_add_func ("/GDateTime/test_z", test_z); + g_test_add_func ("/GDateTime/test-all-dates", test_all_dates); + g_test_add_func ("/GTimeZone/find-interval", test_find_interval); + g_test_add_func ("/GTimeZone/adjust-time", test_adjust_time); + g_test_add_func ("/GTimeZone/no-header", test_no_header); + g_test_add_func ("/GTimeZone/posix-parse", test_posix_parse); + + return g_test_run (); +} diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c new file mode 100644 index 0000000..d2d09d9 --- /dev/null +++ b/glib/tests/gvariant.c @@ -0,0 +1,4339 @@ +/* + * 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 "config.h" + +#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) + +/* see comment in gvariant-serialiser.c about this madness. + * + * we use this to get testing of non-strictly-aligned GVariant instances + * on machines that can tolerate it. it is necessary to support this + * because some systems have malloc() that returns non-8-aligned + * pointers. it is necessary to have special support in the tests + * because on most machines malloc() is 8-aligned. + */ +#define ALIGN_BITS (sizeof (struct { char a; union { \ + guint64 x; void *y; gdouble z; } b; }) - 9) + +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_hash (ctype) == g_variant_type_hash (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 & ALIGN_BITS & 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 & ALIGN_BITS & 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 & ALIGN_BITS & 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, + gsize flavour) +{ + if (!data) + return; + g_free (((gchar *) data) - flavour); +} + +static gpointer +align_malloc (gsize size) +{ + gpointer mem; + +#ifdef HAVE_POSIX_MEMALIGN + if (posix_memalign (&mem, 8, size)) + g_error ("posix_memalign failed"); +#else + /* NOTE: there may be platforms that lack posix_memalign() and also + * have malloc() that returns non-8-aligned. if so, we need to try + * harder here. + */ + mem = malloc (size); +#endif + + return mem; +} + +static void +align_free (gpointer mem) +{ + free (mem); +} + +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 = align_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 & ALIGN_BITS) + 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, flavour); + } + } + + g_variant_type_info_unref (type_info); + random_instance_free (instance); + align_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 = align_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 = (alignment & ALIGN_BITS) + 1; + + 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, flavour); + } + } + + { + 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); + align_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 = align_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 = (alignment & ALIGN_BITS) + 1; + + 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, flavour); + } + } + + { + guint i; + + for (i = 0; i < n_children; i++) + random_instance_free (instances[i]); + g_free (instances); + } + + g_variant_type_info_unref (type_info); + align_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 = align_malloc (needed_size); + append_instance_data (instance, &ptr); + *ptr++ = '\0'; + memcpy (ptr, type_string, len); + ptr += len; + + g_assert (data + needed_size == ptr); + } + + { + gsize alignment; + gsize flavour; + + /* variants are always 8-aligned */ + alignment = ALIGN_BITS + 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); + + 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, flavour); + } + } + + g_variant_type_info_unref (type_info); + random_instance_free (instance); + align_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_nval, 13, "hello\xffworld!" }, + { is_string, 13, "hello world!" }, + { is_nval, 13, "hello world\0" }, + { is_nval, 13, "hello\0world!" }, + { is_nval, 12, "hello world!" }, + { is_nval, 13, "hello world!\xff" }, + + { 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_utf8 (void) +{ + const gchar invalid[] = "hello\xffworld"; + GVariant *value; + + /* ensure that the test data is not valid utf8... */ + g_assert (!g_utf8_validate (invalid, -1, NULL)); + + /* load the data untrusted */ + value = g_variant_new_from_data (G_VARIANT_TYPE_STRING, + invalid, sizeof invalid, + FALSE, NULL, NULL); + + /* ensure that the problem is caught and we get valid UTF-8 */ + g_assert (g_utf8_validate (g_variant_get_string (value, NULL), -1, NULL)); + g_variant_unref (value); + + + /* now load it trusted */ + value = g_variant_new_from_data (G_VARIANT_TYPE_STRING, + invalid, sizeof invalid, + TRUE, NULL, NULL); + + /* ensure we get the invalid data (ie: make sure that time wasn't + * wasted on validating data that was marked as trusted) + */ + g_assert (g_variant_get_string (value, NULL) == invalid); + g_variant_unref (value); +} + +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) +{ + GVariant *value; + const gchar *end; + + if (!g_test_undefined ()) + return; + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*GVariant format string*"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*valid_format_string*"); + value = g_variant_new ("z"); + g_test_assert_expected_messages (); + g_assert (value == NULL); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*valid GVariant format string as a prefix*"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*valid_format_string*"); + value = g_variant_new_va ("z", &end, NULL); + g_test_assert_expected_messages (); + g_assert (value == NULL); + + value = g_variant_new ("y", 'a'); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*type of `q' but * has a type of `y'*"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*valid_format_string*"); + g_variant_get (value, "q"); + g_test_assert_expected_messages (); + g_variant_unref (value); +} + +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_parsed (&array, "{'size', <(%i, %i)> }", 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 ("as")); + g_variant_builder_add (&builder, "s", "/foo"); + g_variant_builder_add (&builder, "s", "/bar"); + g_variant_builder_add (&builder, "s", "/baz"); + value = g_variant_new("(as^as^a&s)", &builder, strvector, strvector); + g_variant_iter_init (&tuple, value); + g_variant_iter_next (&tuple, "as", &array); + + i = 0; + while (g_variant_iter_loop (array, "s", &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, "as", &array); + + i = 0; + while (g_variant_iter_loop (array, "&s", &str)) + g_assert_cmpstr (str, ==, test_strs[i++]); + g_assert (i == 3); + + g_variant_iter_free (array); + + g_variant_iter_next (&tuple, "^a&s", &strv); + g_variant_iter_next (&tuple, "^as", &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[] = {"/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_OBJECT_PATH_ARRAY); + 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 ("aas")); + g_variant_builder_open (&builder, G_VARIANT_TYPE ("as")); + for (i = 0; i < 6; i++) + if (i & 1) + g_variant_builder_add (&builder, "s", strvector[i]); + else + g_variant_builder_add (&builder, "&s", strvector[i]); + g_variant_builder_close (&builder); + g_variant_builder_add (&builder, "^as", strvector); + g_variant_builder_add (&builder, "^as", strvector); + value = g_variant_new ("aas", &builder); + + g_variant_iter_init (&iter, value); + while (g_variant_iter_loop (&iter, "^as", &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&s", &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, "as", &i2)) + { + gchar *str; + + i = 0; + while (g_variant_iter_loop (i2, "s", &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, "@as", &sub)) + { + gchar *str = g_variant_print (sub, TRUE); + g_assert_cmpstr (str, ==, + "['i', 'ii', 'iii', 'iv', 'v', 'vi']"); + g_free (str); + } + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*NULL has already been returned*"); + g_variant_iter_next_value (&iter); + g_test_assert_expected_messages (); + + while (g_variant_iter_loop (i3, "*", &sub)) + { + gchar *str = g_variant_print (sub, TRUE); + g_assert_cmpstr (str, ==, + "['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, "&s", &str); + g_assert_cmpstr (str, ==, strvector[j]); + + cval = g_variant_get_child_value (sub, j); + g_variant_get (cval, "&s", &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); + } + + { + GVariant *value; + gchar *str; + + value = g_variant_new ("(masas)", NULL, NULL); + g_variant_ref_sink (value); + + str = g_variant_print (value, TRUE); + g_assert_cmpstr (str, ==, "(@mas nothing, @as [])"); + g_variant_unref (value); + g_free (str); + + if (do_failed_test ("*which type of empty array*")) + g_variant_new ("(a{s*})", NULL); + } + + 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 (void) +{ +#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 validbytes[] = { 'a', '\0', swapped16(66), 2, + 0, + 'b', '\0', swapped16(77), 2, + 5, 11 }; + guchar corruptbytes[] = { 'a', '\0', swapped16(66), 2, + 0, + 'b', '\0', swapped16(77), 2, + 6, 11 }; + guint valid_data[4], corrupt_data[4]; + GVariant *value, *swapped; + gchar *string, *string2; + + memcpy (valid_data, validbytes, sizeof validbytes); + memcpy (corrupt_data, corruptbytes, sizeof corruptbytes); + + /* trusted */ + value = g_variant_new_from_data (G_VARIANT_TYPE ("a(sn)"), + valid_data, sizeof validbytes, 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 validbytes, 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 corruptbytes, 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 */ + { + GError *error = NULL; + gchar str[128]; + GVariant *val; + gchar *p, *p2; + + for (i = 0; i < 127; i++) + str[i] = i + 1; + str[i] = 0; + + val = g_variant_new_string (str); + p = g_variant_print (val, FALSE); + g_variant_unref (val); + + val = g_variant_parse (NULL, p, NULL, NULL, &error); + 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); + } + + /* unicode mini test */ + { + /* ał𝄞 */ + const gchar orig[] = "a\xc5\x82\xf0\x9d\x84\x9e \t\n"; + GVariant *value; + gchar *printed; + + value = g_variant_new_string (orig); + printed = g_variant_print (value, FALSE); + g_variant_unref (value); + + g_assert_cmpstr (printed, ==, "'a\xc5\x82\xf0\x9d\x84\x9e \\t\\n'"); + value = g_variant_parse (NULL, printed, NULL, NULL, NULL); + g_assert_cmpstr (g_variant_get_string (value, NULL), ==, orig); + g_variant_unref (value); + g_free (printed); + } + + /* inf/nan mini test */ + { + const gchar *tests[] = { "inf", "-inf", "nan" }; + GVariant *value; + gchar *printed; + gint i; + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + GError *error = NULL; + value = g_variant_parse (NULL, tests[i], NULL, NULL, &error); + printed = g_variant_print (value, FALSE); + g_assert (g_str_has_prefix (printed, tests[i])); + g_free (printed); + 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 (g_test_undefined ()) + { + 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 (); + } + } +} + +static void +test_floating (void) +{ + GVariant *value; + + value = g_variant_new_int32 (42); + g_assert (g_variant_is_floating (value)); + g_variant_ref_sink (value); + g_assert (!g_variant_is_floating (value)); + g_variant_unref (value); +} + +static void +test_bytestring (void) +{ + const gchar *test_string = "foo,bar,baz,quux,\xffoooo"; + GVariant *value; + gchar **strv; + gchar *str; + const gchar *const_str; + GVariant *untrusted_empty; + + strv = g_strsplit (test_string, ",", 0); + + value = g_variant_new_bytestring_array ((const gchar **) strv, -1); + g_assert (g_variant_is_floating (value)); + g_strfreev (strv); + + str = g_variant_print (value, FALSE); + g_variant_unref (value); + + value = g_variant_parse (NULL, str, NULL, NULL, NULL); + g_free (str); + + strv = g_variant_dup_bytestring_array (value, NULL); + g_variant_unref (value); + + str = g_strjoinv (",", strv); + g_strfreev (strv); + + g_assert_cmpstr (str, ==, test_string); + g_free (str); + + strv = g_strsplit (test_string, ",", 0); + value = g_variant_new ("(^aay^a&ay^ay^&ay)", + strv, strv, strv[0], strv[0]); + g_strfreev (strv); + + g_variant_get_child (value, 0, "^a&ay", &strv); + str = g_strjoinv (",", strv); + g_free (strv); + g_assert_cmpstr (str, ==, test_string); + g_free (str); + + g_variant_get_child (value, 0, "^aay", &strv); + str = g_strjoinv (",", strv); + g_strfreev (strv); + g_assert_cmpstr (str, ==, test_string); + g_free (str); + + g_variant_get_child (value, 1, "^a&ay", &strv); + str = g_strjoinv (",", strv); + g_free (strv); + g_assert_cmpstr (str, ==, test_string); + g_free (str); + + g_variant_get_child (value, 1, "^aay", &strv); + str = g_strjoinv (",", strv); + g_strfreev (strv); + g_assert_cmpstr (str, ==, test_string); + g_free (str); + + g_variant_get_child (value, 2, "^ay", &str); + g_assert_cmpstr (str, ==, "foo"); + g_free (str); + + g_variant_get_child (value, 2, "^&ay", &str); + g_assert_cmpstr (str, ==, "foo"); + + g_variant_get_child (value, 3, "^ay", &str); + g_assert_cmpstr (str, ==, "foo"); + g_free (str); + + g_variant_get_child (value, 3, "^&ay", &str); + g_assert_cmpstr (str, ==, "foo"); + g_variant_unref (value); + + untrusted_empty = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), NULL, 0, FALSE, NULL, NULL); + value = g_variant_get_normal_form (untrusted_empty); + const_str = g_variant_get_bytestring (value); + (void) const_str; + g_variant_unref (value); + g_variant_unref (untrusted_empty); +} + +static void +test_lookup_value (void) +{ + struct { + const gchar *dict, *key, *value; + } cases[] = { + { "@a{ss} {'x': 'y'}", "x", "'y'" }, + { "@a{ss} {'x': 'y'}", "y" }, + { "@a{os} {'/x': 'y'}", "/x", "'y'" }, + { "@a{os} {'/x': 'y'}", "/y" }, + { "@a{sv} {'x': <'y'>}", "x", "'y'" }, + { "@a{sv} {'x': <5>}", "x", "5" }, + { "@a{sv} {'x': <'y'>}", "y" } + }; + gint i; + + for (i = 0; i < G_N_ELEMENTS (cases); i++) + { + GVariant *dictionary; + GVariant *value; + gchar *p; + + dictionary = g_variant_parse (NULL, cases[i].dict, NULL, NULL, NULL); + value = g_variant_lookup_value (dictionary, cases[i].key, NULL); + g_variant_unref (dictionary); + + if (value == NULL && cases[i].value == NULL) + continue; + + g_assert (value && cases[i].value); + p = g_variant_print (value, FALSE); + g_assert_cmpstr (cases[i].value, ==, p); + g_variant_unref (value); + g_free (p); + } +} + +static void +test_lookup (void) +{ + const gchar *str; + GVariant *dict; + gboolean ok; + gint num; + + dict = g_variant_parse (NULL, + "{'a': <5>, 'b': <'c'>}", + NULL, NULL, NULL); + + ok = g_variant_lookup (dict, "a", "i", &num); + g_assert (ok); + g_assert_cmpint (num, ==, 5); + + ok = g_variant_lookup (dict, "a", "&s", &str); + g_assert (!ok); + + ok = g_variant_lookup (dict, "q", "&s", &str); + g_assert (!ok); + + ok = g_variant_lookup (dict, "b", "i", &num); + g_assert (!ok); + + ok = g_variant_lookup (dict, "b", "&s", &str); + g_assert (ok); + g_assert_cmpstr (str, ==, "c"); + + ok = g_variant_lookup (dict, "q", "&s", &str); + g_assert (!ok); + + g_variant_unref (dict); +} + +static void +test_compare (void) +{ + GVariant *a; + GVariant *b; + + a = g_variant_new_byte (5); + b = g_variant_new_byte (6); + g_assert (g_variant_compare (a, b) < 0); + g_variant_unref (a); + g_variant_unref (b); + a = g_variant_new_string ("abc"); + b = g_variant_new_string ("abd"); + g_assert (g_variant_compare (a, b) < 0); + g_variant_unref (a); + g_variant_unref (b); + a = g_variant_new_boolean (FALSE); + b = g_variant_new_boolean (TRUE); + g_assert (g_variant_compare (a, b) < 0); + g_variant_unref (a); + g_variant_unref (b); +} + +static void +test_fixed_array (void) +{ + GVariant *a; + gint32 values[5]; + const gint32 *elts; + gsize n_elts; + gint i; + + n_elts = 0; + a = g_variant_new_parsed ("[1,2,3,4,5]"); + elts = g_variant_get_fixed_array (a, &n_elts, sizeof (gint32)); + g_assert (n_elts == 5); + for (i = 0; i < 5; i++) + g_assert_cmpint (elts[i], ==, i + 1); + g_variant_unref (a); + + n_elts = 0; + for (i = 0; i < 5; i++) + values[i] = i + 1; + a = g_variant_new_fixed_array (G_VARIANT_TYPE_INT32, values, + G_N_ELEMENTS (values), sizeof (values[0])); + g_assert_cmpstr (g_variant_get_type_string (a), ==, "ai"); + elts = g_variant_get_fixed_array (a, &n_elts, sizeof (gint32)); + g_assert (n_elts == 5); + for (i = 0; i < 5; i++) + g_assert_cmpint (elts[i], ==, i + 1); + g_variant_unref (a); +} + +static void +test_check_format_string (void) +{ + GVariant *value; + + value = g_variant_new ("(sas)", "foo", NULL); + g_variant_ref_sink (value); + + g_assert (g_variant_check_format_string (value, "(s*)", TRUE)); + g_assert (g_variant_check_format_string (value, "(s*)", FALSE)); + g_assert (!g_variant_check_format_string (value, "(u*)", TRUE)); + g_assert (!g_variant_check_format_string (value, "(u*)", FALSE)); + + g_assert (g_variant_check_format_string (value, "(&s*)", FALSE)); + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, "*contains a '&' character*"); + g_assert (!g_variant_check_format_string (value, "(&s*)", TRUE)); + g_test_assert_expected_messages (); + + g_assert (g_variant_check_format_string (value, "(s^as)", TRUE)); + g_assert (g_variant_check_format_string (value, "(s^as)", FALSE)); + + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, "*contains a '&' character*"); + g_assert (!g_variant_check_format_string (value, "(s^a&s)", TRUE)); + g_test_assert_expected_messages (); + g_assert (g_variant_check_format_string (value, "(s^a&s)", FALSE)); + + g_variant_unref (value); + + /* Do it again with a type that will let us put a '&' after a '^' */ + value = g_variant_new ("(say)", "foo", NULL); + g_variant_ref_sink (value); + + g_assert (g_variant_check_format_string (value, "(s*)", TRUE)); + g_assert (g_variant_check_format_string (value, "(s*)", FALSE)); + g_assert (!g_variant_check_format_string (value, "(u*)", TRUE)); + g_assert (!g_variant_check_format_string (value, "(u*)", FALSE)); + + g_assert (g_variant_check_format_string (value, "(&s*)", FALSE)); + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, "*contains a '&' character*"); + g_assert (!g_variant_check_format_string (value, "(&s*)", TRUE)); + g_test_assert_expected_messages (); + + g_assert (g_variant_check_format_string (value, "(s^ay)", TRUE)); + g_assert (g_variant_check_format_string (value, "(s^ay)", FALSE)); + + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, "*contains a '&' character*"); + g_assert (!g_variant_check_format_string (value, "(s^&ay)", TRUE)); + g_test_assert_expected_messages (); + g_assert (g_variant_check_format_string (value, "(s^&ay)", FALSE)); + + g_variant_unref (value); +} + +static void +verify_gvariant_checksum (const gchar *sha256, + GVariant *v) + +{ + gchar *checksum; + checksum = g_compute_checksum_for_data (G_CHECKSUM_SHA256, + g_variant_get_data (v), + g_variant_get_size (v)); + g_assert_cmpstr (sha256, ==, checksum); + g_free (checksum); +} + +static void +verify_gvariant_checksum_va (const gchar *sha256, + const gchar *fmt, + ...) +{ + va_list args; + GVariant *v; + + va_start (args, fmt); + + v = g_variant_new_va (fmt, NULL, &args); + g_variant_ref_sink (v); +#if G_BYTE_ORDER == G_BIG_ENDIAN + { + GVariant *byteswapped = g_variant_byteswap (v); + g_variant_unref (v); + v = byteswapped; + } +#endif + + va_end (args); + + verify_gvariant_checksum (sha256, v); + + g_variant_unref (v); +} + +static void +test_checksum_basic (void) +{ + verify_gvariant_checksum_va ("e8a4b2ee7ede79a3afb332b5b6cc3d952a65fd8cffb897f5d18016577c33d7cc", + "u", 42); + verify_gvariant_checksum_va ("c53e363c33b00cfce298229ee83856b8a98c2e6126cab13f65899f62473b0df5", + "s", "moocow"); + verify_gvariant_checksum_va ("2b4c342f5433ebe591a1da77e013d1b72475562d48578dca8b84bac6651c3cb9", + "y", 9); + verify_gvariant_checksum_va ("12a3ae445661ce5dee78d0650d33362dec29c4f82af05e7e57fb595bbbacf0ca", + "t", G_MAXUINT64); + verify_gvariant_checksum_va ("e25a59b24440eb6c833aa79c93b9840e6eab6966add0dacf31df7e9e7000f5b3", + "d", 3.14159); + verify_gvariant_checksum_va ("4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a", + "b", TRUE); + verify_gvariant_checksum_va ("ca2fd00fa001190744c15c317643ab092e7048ce086a243e2be9437c898de1bb", + "q", G_MAXUINT16); +} + +static void +test_checksum_nested (void) +{ + static const char* const strv[] = {"foo", "bar", "baz", NULL}; + + verify_gvariant_checksum_va ("31fbc92f08fddaca716188fe4b5d44ae122fc6306fd3c6925af53cfa47ea596d", + "(uu)", 41, 43); + verify_gvariant_checksum_va ("01759d683cead856d1d386d59af0578841698a424a265345ad5413122f220de8", + "(su)", "moocow", 79); + verify_gvariant_checksum_va ("52b3ae95f19b3e642ea1d01185aea14a09004c1d1712672644427403a8a0afe6", + "(qyst)", G_MAXUINT16, 9, "moocow", G_MAXUINT64); + verify_gvariant_checksum_va ("6fc6f4524161c3ae0d316812d7088e3fcd372023edaea2d7821093be40ae1060", + "(@ay)", g_variant_new_bytestring ("\xFF\xFF\xFF")); + verify_gvariant_checksum_va ("572aca386e1a983dd23bb6eb6e3dfa72eef9ca7c7744581aa800e18d7d9d0b0b", + "(^as)", strv); + verify_gvariant_checksum_va ("4bddf6174c791bb44fc6a4106573031690064df34b741033a0122ed8dc05bcf3", + "(yvu)", 254, g_variant_new ("(^as)", strv), 42); +} + +static void +test_gbytes (void) +{ + GVariant *a; + GBytes *bytes; + GBytes *bytes2; + const guint8 values[5] = { 1, 2, 3, 4, 5 }; + const guint8 *elts; + gsize n_elts; + gint i; + + bytes = g_bytes_new (&values, 5); + a = g_variant_new_from_bytes (G_VARIANT_TYPE_BYTESTRING, bytes, TRUE); + g_bytes_unref (bytes); + n_elts = 0; + elts = g_variant_get_fixed_array (a, &n_elts, sizeof (guint8)); + g_assert (n_elts == 5); + for (i = 0; i < 5; i++) + g_assert_cmpint (elts[i], ==, i + 1); + + bytes2 = g_variant_get_data_as_bytes (a); + g_variant_unref (a); + + bytes = g_bytes_new (&values, 5); + g_assert (g_bytes_equal (bytes, bytes2)); + + g_bytes_unref (bytes); + g_bytes_unref (bytes2); +} + +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/utf8", test_utf8); + 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); + g_test_add_func ("/gvariant/floating", test_floating); + g_test_add_func ("/gvariant/bytestring", test_bytestring); + g_test_add_func ("/gvariant/lookup-value", test_lookup_value); + g_test_add_func ("/gvariant/lookup", test_lookup); + g_test_add_func ("/gvariant/compare", test_compare); + g_test_add_func ("/gvariant/fixed-array", test_fixed_array); + g_test_add_func ("/gvariant/check-format-string", test_check_format_string); + + g_test_add_func ("/gvariant/checksum-basic", test_checksum_basic); + g_test_add_func ("/gvariant/checksum-nested", test_checksum_nested); + + g_test_add_func ("/gvariant/gbytes", test_gbytes); + + return g_test_run (); +} diff --git a/glib/tests/gwakeuptest.c b/glib/tests/gwakeuptest.c new file mode 100644 index 0000000..5c149da --- /dev/null +++ b/glib/tests/gwakeuptest.c @@ -0,0 +1,273 @@ +#include +#include +#include + +#ifdef _WIN32 +static void alarm (int sec) { } +#endif + +static gboolean +check_signaled (GWakeup *wakeup) +{ + GPollFD fd; + + g_wakeup_get_pollfd (wakeup, &fd); + return g_poll (&fd, 1, 0); +} + +static void +wait_for_signaled (GWakeup *wakeup) +{ + GPollFD fd; + + g_wakeup_get_pollfd (wakeup, &fd); + g_poll (&fd, 1, -1); +} + +static void +test_semantics (void) +{ + GWakeup *wakeup; + gint i; + + /* prevent the test from deadlocking */ + alarm (60); + + wakeup = g_wakeup_new (); + g_assert (!check_signaled (wakeup)); + + g_wakeup_signal (wakeup); + g_assert (check_signaled (wakeup)); + + g_wakeup_acknowledge (wakeup); + g_assert (!check_signaled (wakeup)); + + g_wakeup_free (wakeup); + + /* free unused */ + wakeup = g_wakeup_new (); + g_wakeup_free (wakeup); + + /* free while signaled */ + wakeup = g_wakeup_new (); + g_wakeup_signal (wakeup); + g_wakeup_free (wakeup); + + /* ensure excessive signalling doesn't deadlock */ + wakeup = g_wakeup_new (); + for (i = 0; i < 1000000; i++) + g_wakeup_signal (wakeup); + g_assert (check_signaled (wakeup)); + + /* ensure a single acknowledgement is sufficient */ + g_wakeup_acknowledge (wakeup); + g_assert (!check_signaled (wakeup)); + + g_wakeup_free (wakeup); + + /* cancel the alarm */ + alarm (0); +} + +struct token +{ + gpointer owner; + gint ttl; +}; + +struct context +{ + GSList *pending_tokens; + GMutex lock; + GWakeup *wakeup; + gboolean quit; +}; + +#define NUM_THREADS 50 +#define NUM_TOKENS 5 +#define TOKEN_TTL 100000 + +static struct context contexts[NUM_THREADS]; +static GThread *threads[NUM_THREADS]; +static GWakeup *last_token_wakeup; +static volatile gint tokens_alive; + +static void +context_init (struct context *ctx) +{ + ctx->pending_tokens = NULL; + g_mutex_init (&ctx->lock); + ctx->wakeup = g_wakeup_new (); + ctx->quit = FALSE; +} + +static void +context_clear (struct context *ctx) +{ + g_assert (ctx->pending_tokens == NULL); + g_assert (ctx->quit); + + g_mutex_clear (&ctx->lock); + g_wakeup_free (ctx->wakeup); +} + +static void +context_quit (struct context *ctx) +{ + ctx->quit = TRUE; + g_wakeup_signal (ctx->wakeup); +} + +static struct token * +context_pop_token (struct context *ctx) +{ + struct token *token; + + g_mutex_lock (&ctx->lock); + token = ctx->pending_tokens->data; + ctx->pending_tokens = g_slist_delete_link (ctx->pending_tokens, + ctx->pending_tokens); + g_mutex_unlock (&ctx->lock); + + return token; +} + +static void +context_push_token (struct context *ctx, + struct token *token) +{ + g_assert (token->owner == ctx); + + g_mutex_lock (&ctx->lock); + ctx->pending_tokens = g_slist_prepend (ctx->pending_tokens, token); + g_mutex_unlock (&ctx->lock); + + g_wakeup_signal (ctx->wakeup); +} + +static void +dispatch_token (struct token *token) +{ + if (token->ttl > 0) + { + struct context *ctx; + gint next_ctx; + + next_ctx = g_test_rand_int_range (0, NUM_THREADS); + ctx = &contexts[next_ctx]; + token->owner = ctx; + token->ttl--; + + context_push_token (ctx, token); + } + else + { + g_slice_free (struct token, token); + + if (g_atomic_int_dec_and_test (&tokens_alive)) + g_wakeup_signal (last_token_wakeup); + } +} + +static struct token * +token_new (int ttl) +{ + struct token *token; + + token = g_slice_new (struct token); + token->ttl = ttl; + + g_atomic_int_inc (&tokens_alive); + + return token; +} + +static gpointer +thread_func (gpointer data) +{ + struct context *ctx = data; + + while (!ctx->quit) + { + wait_for_signaled (ctx->wakeup); + g_wakeup_acknowledge (ctx->wakeup); + + while (ctx->pending_tokens) + { + struct token *token; + + token = context_pop_token (ctx); + g_assert (token->owner == ctx); + dispatch_token (token); + } + } + + return NULL; +} + +static void +test_threaded (void) +{ + gint i; + + /* make sure we don't block forever */ + alarm (60); + + /* simple mainloop test based on GWakeup. + * + * create a bunch of contexts and a thread to 'run' each one. create + * some tokens and randomly pass them between the threads, until the + * TTL on each token is zero. + * + * when no tokens are left, signal that we are done. the mainthread + * will then signal each worker thread to exit and join them to make + * sure that works. + */ + + last_token_wakeup = g_wakeup_new (); + + /* create contexts, assign to threads */ + for (i = 0; i < NUM_THREADS; i++) + { + context_init (&contexts[i]); + threads[i] = g_thread_new ("test", thread_func, &contexts[i]); + } + + /* dispatch tokens */ + for (i = 0; i < NUM_TOKENS; i++) + dispatch_token (token_new (TOKEN_TTL)); + + /* wait until all tokens are gone */ + wait_for_signaled (last_token_wakeup); + + /* ask threads to quit, join them, cleanup */ + for (i = 0; i < NUM_THREADS; i++) + { + context_quit (&contexts[i]); + g_thread_join (threads[i]); + context_clear (&contexts[i]); + } + + g_wakeup_free (last_token_wakeup); + + /* cancel alarm */ + alarm (0); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + +#ifdef TEST_EVENTFD_FALLBACK +#define TESTNAME_SUFFIX "-fallback" +#else +#define TESTNAME_SUFFIX +#endif + + + g_test_add_func ("/gwakeup/semantics" TESTNAME_SUFFIX, test_semantics); + g_test_add_func ("/gwakeup/threaded" TESTNAME_SUFFIX, test_threaded); + + return g_test_run (); +} diff --git a/glib/tests/hash.c b/glib/tests/hash.c new file mode 100644 index 0000000..1741eb2 --- /dev/null +++ b/glib/tests/hash.c @@ -0,0 +1,1297 @@ +/* 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 + +#include +#include +#include + +#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 (gconstpointer d) +{ + gboolean simple_hash = GPOINTER_TO_INT (d); + + 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); +} + +static void +int64_hash_test (void) +{ + gint i, rc; + GHashTable *h; + gint64 values[20]; + gint64 key; + + h = g_hash_table_new (g_int64_hash, g_int64_equal); + g_assert (h != NULL); + for (i = 0; i < 20; i++) + { + values[i] = i + 42; + g_hash_table_insert (h, &values[i], GINT_TO_POINTER (i + 42)); + } + + g_assert (g_hash_table_size (h) == 20); + + for (i = 0; i < 20; i++) + { + key = i + 42; + rc = GPOINTER_TO_INT (g_hash_table_lookup (h, &key)); + + g_assert_cmpint (rc, ==, i + 42); + } + + g_hash_table_destroy (h); +} + +static void +double_hash_test (void) +{ + gint i, rc; + GHashTable *h; + gdouble values[20]; + gdouble key; + + h = g_hash_table_new (g_double_hash, g_double_equal); + g_assert (h != NULL); + for (i = 0; i < 20; i++) + { + values[i] = i + 42.5; + g_hash_table_insert (h, &values[i], GINT_TO_POINTER (i + 42)); + } + + g_assert (g_hash_table_size (h) == 20); + + for (i = 0; i < 20; i++) + { + key = i + 42.5; + rc = GPOINTER_TO_INT (g_hash_table_lookup (h, &key)); + + g_assert_cmpint (rc, ==, i + 42); + } + + g_hash_table_destroy (h); +} + +static void +string_free (gpointer data) +{ + GString *s = data; + + g_string_free (s, TRUE); +} + +static void +string_hash_test (void) +{ + gint i, rc; + GHashTable *h; + GString *s; + + h = g_hash_table_new_full ((GHashFunc)g_string_hash, (GEqualFunc)g_string_equal, string_free, NULL); + g_assert (h != NULL); + for (i = 0; i < 20; i++) + { + s = g_string_new (""); + g_string_append_printf (s, "%d", i + 42); + g_string_append_c (s, '.'); + g_string_prepend_unichar (s, 0x2301); + g_hash_table_insert (h, s, GINT_TO_POINTER (i + 42)); + } + + g_assert (g_hash_table_size (h) == 20); + + s = g_string_new (""); + for (i = 0; i < 20; i++) + { + g_string_assign (s, ""); + g_string_append_printf (s, "%d", i + 42); + g_string_append_c (s, '.'); + g_string_prepend_unichar (s, 0x2301); + rc = GPOINTER_TO_INT (g_hash_table_lookup (h, s)); + + g_assert_cmpint (rc, ==, i + 42); + } + + g_string_free (s, TRUE); + g_hash_table_destroy (h); +} + +static void +set_check (gpointer key, + gpointer value, + gpointer user_data) +{ + int *pi = user_data; + if (key != value) + g_assert_not_reached (); + + g_assert_cmpint (atoi (key) % 7, ==, 2); + + (*pi)++; +} + +static void +set_hash_test (void) +{ + GHashTable *hash_table = + g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + int i; + + for (i = 2; i < 5000; i += 7) + { + char *s = g_strdup_printf ("%d", i); + g_hash_table_add (hash_table, s); + } + + i = 0; + g_hash_table_foreach (hash_table, set_check, &i); + g_assert_cmpint (i, ==, g_hash_table_size (hash_table)); + + g_assert (g_hash_table_contains (hash_table, "2")); + g_assert (g_hash_table_contains (hash_table, "9")); + g_assert (!g_hash_table_contains (hash_table, "a")); + + /* this will cause the hash table to loose set nature */ + g_hash_table_insert (hash_table, g_strdup ("a"), "b"); + + g_assert_cmpstr (g_hash_table_lookup (hash_table, "2"), ==, "2"); + g_assert_cmpstr (g_hash_table_lookup (hash_table, "a"), ==, "b"); + + g_hash_table_destroy (hash_table); +} + + +static void +test_hash_misc (void) +{ + 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]; + int n_array[1]; + + 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); + + hash_table = g_hash_table_new (my_hash, my_hash_equal); + fill_hash_table_and_array (hash_table); + + n_array[0] = 1; + + g_hash_table_iter_init (&iter, hash_table); + for (i = 0; i < 10000; i++) + { + g_assert (g_hash_table_iter_next (&iter, &ikey, &ivalue)); + g_hash_table_iter_replace (&iter, &n_array[0]); + } + + g_hash_table_iter_init (&iter, hash_table); + for (i = 0; i < 10000; i++) + { + g_assert (g_hash_table_iter_next (&iter, &ikey, &ivalue)); + + g_assert (ivalue == &n_array[0]); + } + + g_hash_table_destroy (hash_table); +} + +static gint destroy_counter; + +static void +value_destroy (gpointer value) +{ + destroy_counter++; +} + +static void +test_hash_ref (void) +{ + GHashTable *h; + GHashTableIter iter; + gchar *key, *value; + gboolean abc_seen = FALSE; + gboolean cde_seen = FALSE; + gboolean xyz_seen = FALSE; + + h = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy); + g_hash_table_insert (h, "abc", "ABC"); + g_hash_table_insert (h, "cde", "CDE"); + g_hash_table_insert (h, "xyz", "XYZ"); + + g_assert_cmpint (g_hash_table_size (h), == , 3); + + g_hash_table_iter_init (&iter, h); + + while (g_hash_table_iter_next (&iter, (gpointer*)&key, (gpointer*)&value)) + { + if (strcmp (key, "abc") == 0) + { + g_assert_cmpstr (value, ==, "ABC"); + abc_seen = TRUE; + g_hash_table_iter_steal (&iter); + } + else if (strcmp (key, "cde") == 0) + { + g_assert_cmpstr (value, ==, "CDE"); + cde_seen = TRUE; + } + else if (strcmp (key, "xyz") == 0) + { + g_assert_cmpstr (value, ==, "XYZ"); + xyz_seen = TRUE; + } + } + g_assert_cmpint (destroy_counter, ==, 0); + + g_assert (g_hash_table_iter_get_hash_table (&iter) == h); + g_assert (abc_seen && cde_seen && xyz_seen); + g_assert_cmpint (g_hash_table_size (h), == , 2); + + g_hash_table_ref (h); + g_hash_table_destroy (h); + g_assert_cmpint (g_hash_table_size (h), == , 0); + g_assert_cmpint (destroy_counter, ==, 2); + g_hash_table_insert (h, "uvw", "UVW"); + g_hash_table_unref (h); + g_assert_cmpint (destroy_counter, ==, 3); +} + +static guint +null_safe_str_hash (gconstpointer key) +{ + if (key == NULL) + return 0; + else + return g_str_hash (key); +} + +static gboolean +null_safe_str_equal (gconstpointer a, gconstpointer b) +{ + return g_strcmp0 (a, b) == 0; +} + +static void +test_lookup_null_key (void) +{ + GHashTable *h; + gboolean res; + gpointer key; + gpointer value; + + g_test_bug ("642944"); + + h = g_hash_table_new (null_safe_str_hash, null_safe_str_equal); + g_hash_table_insert (h, "abc", "ABC"); + + res = g_hash_table_lookup_extended (h, NULL, &key, &value); + g_assert (!res); + + g_hash_table_insert (h, NULL, "NULL"); + + res = g_hash_table_lookup_extended (h, NULL, &key, &value); + g_assert (res); + g_assert_cmpstr (value, ==, "NULL"); + + g_hash_table_unref (h); +} + +static gint destroy_key_counter; + +static void +key_destroy (gpointer key) +{ + destroy_key_counter++; +} + +static void +test_remove_all (void) +{ + GHashTable *h; + gboolean res; + + h = g_hash_table_new_full (g_str_hash, g_str_equal, key_destroy, value_destroy); + g_hash_table_insert (h, "abc", "ABC"); + g_hash_table_insert (h, "cde", "CDE"); + g_hash_table_insert (h, "xyz", "XYZ"); + + destroy_counter = 0; + destroy_key_counter = 0; + + g_hash_table_steal_all (h); + g_assert_cmpint (destroy_counter, ==, 0); + g_assert_cmpint (destroy_key_counter, ==, 0); + + g_hash_table_insert (h, "abc", "ABC"); + g_hash_table_insert (h, "cde", "CDE"); + g_hash_table_insert (h, "xyz", "XYZ"); + + res = g_hash_table_steal (h, "nosuchkey"); + g_assert (!res); + g_assert_cmpint (destroy_counter, ==, 0); + g_assert_cmpint (destroy_key_counter, ==, 0); + + res = g_hash_table_steal (h, "xyz"); + g_assert (res); + g_assert_cmpint (destroy_counter, ==, 0); + g_assert_cmpint (destroy_key_counter, ==, 0); + + g_hash_table_remove_all (h); + g_assert_cmpint (destroy_counter, ==, 2); + g_assert_cmpint (destroy_key_counter, ==, 2); + + g_hash_table_unref (h); +} + +typedef struct { + gint ref_count; + const gchar *key; +} RefCountedKey; + +static guint +hash_func (gconstpointer key) +{ + const RefCountedKey *rkey = key; + + return g_str_hash (rkey->key); +} + +static gboolean +eq_func (gconstpointer a, gconstpointer b) +{ + const RefCountedKey *aa = a; + const RefCountedKey *bb = b; + + return g_strcmp0 (aa->key, bb->key) == 0; +} + +static void +key_unref (gpointer data) +{ + RefCountedKey *key = data; + + g_assert (key->ref_count > 0); + + key->ref_count -= 1; + + if (key->ref_count == 0) + g_free (key); +} + +static RefCountedKey * +key_ref (RefCountedKey *key) +{ + key->ref_count += 1; + + return key; +} + +static RefCountedKey * +key_new (const gchar *key) +{ + RefCountedKey *rkey; + + rkey = g_new (RefCountedKey, 1); + + rkey->ref_count = 1; + rkey->key = key; + + return rkey; +} + +static void +set_ref_hash_test (void) +{ + GHashTable *h; + RefCountedKey *key1; + RefCountedKey *key2; + + h = g_hash_table_new_full (hash_func, eq_func, key_unref, key_unref); + + key1 = key_new ("a"); + key2 = key_new ("a"); + + g_assert_cmpint (key1->ref_count, ==, 1); + g_assert_cmpint (key2->ref_count, ==, 1); + + g_hash_table_insert (h, key_ref (key1), key_ref (key1)); + + g_assert_cmpint (key1->ref_count, ==, 3); + g_assert_cmpint (key2->ref_count, ==, 1); + + g_hash_table_replace (h, key_ref (key2), key_ref (key2)); + + g_assert_cmpint (key1->ref_count, ==, 1); + g_assert_cmpint (key2->ref_count, ==, 3); + + g_hash_table_remove (h, key1); + + g_assert_cmpint (key1->ref_count, ==, 1); + g_assert_cmpint (key2->ref_count, ==, 1); + + g_hash_table_unref (h); + + key_unref (key1); + key_unref (key2); +} + +GHashTable *h; + +typedef struct { + gchar *string; + gboolean freed; +} FakeFreeData; + +GPtrArray *fake_free_data; + +static void +fake_free (gpointer dead) +{ + guint i; + + for (i = 0; i < fake_free_data->len; i++) + { + FakeFreeData *ffd = g_ptr_array_index (fake_free_data, i); + + if (ffd->string == (gchar *) dead) + { + g_assert (!ffd->freed); + ffd->freed = TRUE; + return; + } + } + + g_assert_not_reached (); +} + +static void +value_destroy_insert (gpointer value) +{ + g_hash_table_remove_all (h); +} + +static void +test_destroy_modify (void) +{ + FakeFreeData *ffd; + guint i; + + g_test_bug ("650459"); + + fake_free_data = g_ptr_array_new (); + + h = g_hash_table_new_full (g_str_hash, g_str_equal, fake_free, value_destroy_insert); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("a"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "b"); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("c"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "d"); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("e"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "f"); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("g"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "h"); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("h"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "k"); + + ffd = g_new0 (FakeFreeData, 1); + ffd->string = g_strdup ("a"); + g_ptr_array_add (fake_free_data, ffd); + g_hash_table_insert (h, ffd->string, "c"); + + g_hash_table_remove (h, "c"); + + /* that removed everything... */ + for (i = 0; i < fake_free_data->len; i++) + { + FakeFreeData *ffd = g_ptr_array_index (fake_free_data, i); + + g_assert (ffd->freed); + g_free (ffd->string); + g_free (ffd); + } + + g_ptr_array_unref (fake_free_data); + + /* ... so this is a no-op */ + g_hash_table_remove (h, "e"); + + g_hash_table_unref (h); +} + +static gboolean +find_str (gpointer key, gpointer value, gpointer data) +{ + return g_str_equal (key, data); +} + +static void +test_find (void) +{ + GHashTable *hash; + const gchar *value; + + hash = g_hash_table_new (g_str_hash, g_str_equal); + + g_hash_table_insert (hash, "a", "A"); + g_hash_table_insert (hash, "b", "B"); + g_hash_table_insert (hash, "c", "C"); + g_hash_table_insert (hash, "d", "D"); + g_hash_table_insert (hash, "e", "E"); + g_hash_table_insert (hash, "f", "F"); + + value = g_hash_table_find (hash, find_str, "a"); + g_assert_cmpstr (value, ==, "A"); + + value = g_hash_table_find (hash, find_str, "b"); + g_assert_cmpstr (value, ==, "B"); + + value = g_hash_table_find (hash, find_str, "c"); + g_assert_cmpstr (value, ==, "C"); + + value = g_hash_table_find (hash, find_str, "d"); + g_assert_cmpstr (value, ==, "D"); + + value = g_hash_table_find (hash, find_str, "e"); + g_assert_cmpstr (value, ==, "E"); + + value = g_hash_table_find (hash, find_str, "f"); + g_assert_cmpstr (value, ==, "F"); + + value = g_hash_table_find (hash, find_str, "0"); + g_assert (value == NULL); + + g_hash_table_unref (hash); +} + +gboolean seen_key[6]; + +static void +foreach_func (gpointer key, gpointer value, gpointer data) +{ + seen_key[((char*)key)[0] - 'a'] = TRUE; +} + +static void +test_foreach (void) +{ + GHashTable *hash; + gint i; + + hash = g_hash_table_new (g_str_hash, g_str_equal); + + g_hash_table_insert (hash, "a", "A"); + g_hash_table_insert (hash, "b", "B"); + g_hash_table_insert (hash, "c", "C"); + g_hash_table_insert (hash, "d", "D"); + g_hash_table_insert (hash, "e", "E"); + g_hash_table_insert (hash, "f", "F"); + + for (i = 0; i < 6; i++) + seen_key[i] = FALSE; + + g_hash_table_foreach (hash, foreach_func, NULL); + + for (i = 0; i < 6; i++) + g_assert (seen_key[i]); + + g_hash_table_unref (hash); +} + +struct _GHashTable +{ + gint size; + gint mod; + guint mask; + gint nnodes; + gint noccupied; /* nnodes + tombstones */ + + gpointer *keys; + guint *hashes; + gpointer *values; + + GHashFunc hash_func; + GEqualFunc key_equal_func; + volatile gint ref_count; + +#ifndef G_DISABLE_ASSERT + int version; +#endif + GDestroyNotify key_destroy_func; + GDestroyNotify value_destroy_func; +}; + +static void +count_keys (GHashTable *h, gint *unused, gint *occupied, gint *tombstones) +{ + gint i; + + *unused = 0; + *occupied = 0; + *tombstones = 0; + for (i = 0; i < h->size; i++) + { + if (h->hashes[i] == 0) + (*unused)++; + else if (h->hashes[i] == 1) + (*tombstones)++; + else + (*occupied)++; + } +} + +static void +check_data (GHashTable *h) +{ + gint i; + + for (i = 0; i < h->size; i++) + { + if (h->hashes[i] < 2) + { + g_assert (h->keys[i] == NULL); + g_assert (h->values[i] == NULL); + } + else + { + g_assert_cmpint (h->hashes[i], ==, h->hash_func (h->keys[i])); + } + } +} + +static void +check_consistency (GHashTable *h) +{ + gint unused; + gint occupied; + gint tombstones; + + count_keys (h, &unused, &occupied, &tombstones); + + g_assert_cmpint (occupied, ==, h->nnodes); + g_assert_cmpint (occupied + tombstones, ==, h->noccupied); + g_assert_cmpint (occupied + tombstones + unused, ==, h->size); + + check_data (h); +} + +static void +check_counts (GHashTable *h, gint occupied, gint tombstones) +{ + g_assert_cmpint (occupied, ==, h->nnodes); + g_assert_cmpint (occupied + tombstones, ==, h->noccupied); +} + +static void +trivial_key_destroy (gpointer key) +{ +} + +static void +test_internal_consistency (void) +{ + GHashTable *h; + + h = g_hash_table_new_full (g_str_hash, g_str_equal, trivial_key_destroy, NULL); + + check_counts (h, 0, 0); + check_consistency (h); + + g_hash_table_insert (h, "a", "A"); + g_hash_table_insert (h, "b", "B"); + g_hash_table_insert (h, "c", "C"); + g_hash_table_insert (h, "d", "D"); + g_hash_table_insert (h, "e", "E"); + g_hash_table_insert (h, "f", "F"); + + check_counts (h, 6, 0); + check_consistency (h); + + g_hash_table_remove (h, "a"); + check_counts (h, 5, 1); + check_consistency (h); + + g_hash_table_remove (h, "b"); + check_counts (h, 4, 2); + check_consistency (h); + + g_hash_table_insert (h, "c", "c"); + check_counts (h, 4, 2); + check_consistency (h); + + g_hash_table_insert (h, "a", "A"); + check_counts (h, 5, 1); + check_consistency (h); + + g_hash_table_remove_all (h); + check_counts (h, 0, 0); + check_consistency (h); + + g_hash_table_unref (h); +} + +static void +my_key_free (gpointer v) +{ + gchar *s = v; + g_assert (s[0] != 'x'); + s[0] = 'x'; + g_free (v); +} + +static void +my_value_free (gpointer v) +{ + gchar *s = v; + g_assert (s[0] != 'y'); + s[0] = 'y'; + g_free (v); +} + +static void +test_iter_replace (void) +{ + GHashTable *h; + GHashTableIter iter; + gpointer k, v; + gchar *s; + + g_test_bug ("662544"); + + h = g_hash_table_new_full (g_str_hash, g_str_equal, my_key_free, my_value_free); + + g_hash_table_insert (h, g_strdup ("A"), g_strdup ("a")); + g_hash_table_insert (h, g_strdup ("B"), g_strdup ("b")); + g_hash_table_insert (h, g_strdup ("C"), g_strdup ("c")); + + g_hash_table_iter_init (&iter, h); + + while (g_hash_table_iter_next (&iter, &k, &v)) + { + s = (gchar*)v; + g_assert (g_ascii_islower (s[0])); + g_hash_table_iter_replace (&iter, g_strdup (k)); + } + + g_hash_table_unref (h); +} + +static void +replace_first_character (gchar *string) +{ + string[0] = 'b'; +} + +static void +test_set_insert_corruption (void) +{ + GHashTable *hash_table = + g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) replace_first_character, NULL); + GHashTableIter iter; + gchar a[] = "foo"; + gchar b[] = "foo"; + gpointer key, value; + + g_test_bug ("692815"); + + g_hash_table_insert (hash_table, a, a); + g_assert (g_hash_table_contains (hash_table, "foo")); + + g_hash_table_insert (hash_table, b, b); + + g_assert_cmpuint (g_hash_table_size (hash_table), ==, 1); + g_hash_table_iter_init (&iter, hash_table); + if (!g_hash_table_iter_next (&iter, &key, &value)) + g_assert_not_reached(); + + /* per the documentation to g_hash_table_insert(), 'b' has now been freed, + * and the sole key in 'hash_table' should be 'a'. + */ + g_assert (key != b); + g_assert (key == a); + + g_assert_cmpstr (b, ==, "boo"); + + /* g_hash_table_insert() also says that the value should now be 'b', + * which is probably not what the caller intended but is precisely what they + * asked for. + */ + g_assert (value == b); + + /* even though the hash has now been de-set-ified: */ + g_assert (g_hash_table_contains (hash_table, "foo")); + + g_hash_table_unref (hash_table); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/hash/misc", test_hash_misc); + g_test_add_data_func ("/hash/one", GINT_TO_POINTER (TRUE), second_hash_test); + g_test_add_data_func ("/hash/honeyman", GINT_TO_POINTER (FALSE), second_hash_test); + g_test_add_func ("/hash/direct", direct_hash_test); + g_test_add_func ("/hash/int64", int64_hash_test); + g_test_add_func ("/hash/double", double_hash_test); + g_test_add_func ("/hash/string", string_hash_test); + g_test_add_func ("/hash/set", set_hash_test); + g_test_add_func ("/hash/set-ref", set_ref_hash_test); + g_test_add_func ("/hash/ref", test_hash_ref); + g_test_add_func ("/hash/remove-all", test_remove_all); + g_test_add_func ("/hash/find", test_find); + g_test_add_func ("/hash/foreach", test_foreach); + + /* tests for individual bugs */ + g_test_add_func ("/hash/lookup-null-key", test_lookup_null_key); + g_test_add_func ("/hash/destroy-modify", test_destroy_modify); + g_test_add_func ("/hash/consistency", test_internal_consistency); + g_test_add_func ("/hash/iter-replace", test_iter_replace); + g_test_add_func ("/hash/set-insert-corruption", test_set_insert_corruption); + + return g_test_run (); + +} diff --git a/glib/tests/hmac.c b/glib/tests/hmac.c new file mode 100644 index 0000000..008d293 --- /dev/null +++ b/glib/tests/hmac.c @@ -0,0 +1,318 @@ +#include "config.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +/* HMAC-MD5 test vectors as per RFC 2202 */ + +/* Test 1 */ +guint8 key_md5_test1[] = { + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b }; +guint8 result_md5_test1[] = { + 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4, + 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d }; + +/* Test 2 */ +guint8 result_md5_test2[] = { + 0x75, 0x0c, 0x78, 0x3e, 0x6a, 0xb0, 0xb5, 0x03, 0xea, 0xa8, + 0x6e, 0x31, 0x0a, 0x5d, 0xb7, 0x38 }; + +/* Test 3 */ +guint8 key_md5_test3[] = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; +guint8 data_md5_test3[] = { + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }; +guint8 result_md5_test3[] = { + 0x56, 0xbe, 0x34, 0x52, 0x1d, 0x14, 0x4c, 0x88, 0xdb, 0xb8, + 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }; + +/* Test 4 */ +guint8 key_md5_test4[] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19 }; +guint8 data_md5_test4[] = { + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd }; +guint8 result_md5_test4[] = { + 0x69, 0x7e, 0xaf, 0x0a, 0xca, 0x3a, 0x3a, 0xea, 0x3a, 0x75, + 0x16, 0x47, 0x46, 0xff, 0xaa, 0x79 }; + +/* Test 5 */ +guint8 key_md5_test5[] = { + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c}; +guint8 result_md5_test5[] = { + 0x56, 0x46, 0x1e, 0xf2, 0x34, 0x2e, 0xdc, 0x00, 0xf9, 0xba, + 0xb9, 0x95, 0x69, 0x0e, 0xfd, 0x4c }; + +/* Test 6 */ +guint8 key_md5_test6[] = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; +guint8 result_md5_test6[] = { + 0x6b, 0x1a, 0xb7, 0xfe, 0x4b, 0xd7, 0xbf, 0x8f, 0x0b, 0x62, + 0xe6, 0xce, 0x61, 0xb9, 0xd0, 0xcd }; + +/* Test 6 */ +guint8 key_md5_test7[] = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; +guint8 result_md5_test7[] = { + 0x6f, 0x63, 0x0f, 0xad, 0x67, 0xcd, 0xa0, 0xee, 0x1f, 0xb1, + 0xf5, 0x62, 0xdb, 0x3a, 0xa5, 0x3e }; + +/* HMAC-SHA1 test vectors as per RFC 2202 */ + +/* Test 1 */ +guint8 key_sha1_test1[] = { + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b }; +guint8 result_sha1_test1[] = { + 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b, + 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, 0xf1, 0x46, 0xbe, 0x00 }; + +/* Test 2 */ +guint8 result_sha1_test2[] = { + 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb, 0x2f, 0xa2, 0xd2, 0x74, + 0x16, 0xd5, 0xf1, 0x84, 0xdf, 0x9c, 0x25, 0x9a, 0x7c, 0x79 }; + +/* Test 3 */ +guint8 key_sha1_test3[] = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; +guint8 data_sha1_test3[] = { + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }; +guint8 result_sha1_test3[] = { + 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac, 0x11, 0xcd, 0x91, 0xa3, + 0x9a, 0xf4, 0x8a, 0xa1, 0x7b, 0x4f, 0x63, 0xf1, 0x75, 0xd3 }; + +/* Test 4 */ +guint8 key_sha1_test4[] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19 }; +guint8 data_sha1_test4[] = { + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, + 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd }; +guint8 result_sha1_test4[] = { + 0x4c, 0x90, 0x07, 0xf4, 0x02, 0x62, 0x50, 0xc6, 0xbc, 0x84, + 0x14, 0xf9, 0xbf, 0x50, 0xc8, 0x6c, 0x2d, 0x72, 0x35, 0xda }; + +/* Test 5 */ +guint8 key_sha1_test5[] = { + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c }; +guint8 result_sha1_test5[] = { + 0x4c, 0x1a, 0x03, 0x42, 0x4b, 0x55, 0xe0, 0x7f, 0xe7, 0xf2, + 0x7b, 0xe1, 0xd5, 0x8b, 0xb9, 0x32, 0x4a, 0x9a, 0x5a, 0x04 }; + +/* Test 6 & 7*/ +guint8 key_sha1_test6_7[] = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa }; + +guint8 result_sha1_test6[] = { + 0xaa, 0x4a, 0xe5, 0xe1, 0x52, 0x72, 0xd0, 0x0e, 0x95, 0x70, + 0x56, 0x37, 0xce, 0x8a, 0x3b, 0x55, 0xed, 0x40, 0x21, 0x12 }; + +guint8 result_sha1_test7[] = { + 0xe8, 0xe9, 0x9d, 0xf, 0x45, 0x23, 0x7d, 0x78, 0x6d, 0x6b, + 0xba, 0xa7, 0x96, 0x5c, 0x78, 0x8, 0xbb, 0xff, 0x1a, 0x91 }; + + +typedef struct { + GChecksumType digest_type; + gpointer key; + gsize key_len; + gpointer data; + gsize data_len; + gpointer result; +} HmacCase; + +HmacCase hmac_md5_tests[] = { + { G_CHECKSUM_MD5, key_md5_test1, 16, "Hi There", 8, result_md5_test1 }, + { G_CHECKSUM_MD5, "Jefe", 4, "what do ya want for nothing?", 28, + result_md5_test2 }, + { G_CHECKSUM_MD5, key_md5_test3, 16, data_md5_test3, 50, + result_md5_test3 }, + { G_CHECKSUM_MD5, key_md5_test4, 25, data_md5_test4, 50, + result_md5_test4 }, + { G_CHECKSUM_MD5, key_md5_test5, 16, "Test With Truncation", 20, + result_md5_test5 }, + { G_CHECKSUM_MD5, key_md5_test6, 80, + "Test Using Larger Than Block-Size Key - Hash Key First", 54, + result_md5_test6 }, + { G_CHECKSUM_MD5, key_md5_test7, 80, + "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", + 73, result_md5_test7 }, + { -1, NULL, 0, NULL, 0, NULL }, +}; + +HmacCase hmac_sha1_tests[] = { + { G_CHECKSUM_SHA1, key_sha1_test1, 20, "Hi There", 8, result_sha1_test1 }, + { G_CHECKSUM_SHA1, "Jefe", 4, "what do ya want for nothing?", 28, + result_sha1_test2 }, + { G_CHECKSUM_SHA1, key_sha1_test3, 20, data_sha1_test3, 50, + result_sha1_test3 }, + { G_CHECKSUM_SHA1, key_sha1_test4, 25, data_sha1_test4, 50, + result_sha1_test4 }, + { G_CHECKSUM_SHA1, key_sha1_test5, 20, "Test With Truncation", 20, + result_sha1_test5 }, + { G_CHECKSUM_SHA1, key_sha1_test6_7, 80, + "Test Using Larger Than Block-Size Key - Hash Key First", 54, + result_sha1_test6 }, + { G_CHECKSUM_SHA1, key_sha1_test6_7, 80, + "Test Using Larger Than Block-Size Key and Larger" \ + " Than One Block-Size Data", 73, result_sha1_test7, }, + { -1, NULL, 0, NULL, 0, NULL }, +}; + +static void +test_hmac (HmacCase *t) +{ + GHmac *hmac; + gsize digest_len, hmac_len; + gpointer digest; + + hmac_len = digest_len = g_checksum_type_get_length (t->digest_type); + digest = g_malloc (hmac_len); + + hmac = g_hmac_new (t->digest_type, t->key, t->key_len); + g_hmac_update (hmac, t->data, t->data_len); + g_hmac_get_digest (hmac, digest, &digest_len); + + g_assert_cmpuint (digest_len, ==, hmac_len); + g_assert (memcmp (digest, t->result, digest_len) == 0); + + g_free (digest); + g_hmac_unref (hmac); +} + +static void +test_hmac_ref_unref (void) +{ + GHmac *hmac, *check; + + hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3); + check = g_hmac_ref (hmac); + g_assert (check == hmac); + g_hmac_unref (check); + g_hmac_unref (hmac); +} + +static void +test_hmac_copy (void) +{ + GHmac *hmac, *check; + + hmac = g_hmac_new (G_CHECKSUM_SHA256, (guchar*)"aaa", 3); + check = g_hmac_copy (hmac); + g_assert (check != hmac); + g_assert_cmpstr (g_hmac_get_string (hmac), ==, g_hmac_get_string (check)); + g_hmac_unref (check); + g_hmac_unref (hmac); +} + +static void +test_hmac_for_data (void) +{ + gchar *string; + GHmac *hmac; + + string = g_compute_hmac_for_data (G_CHECKSUM_SHA1, + (guchar*)"aaa", 3, + (guchar*)"bcdef", 5); + + hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3); + g_hmac_update (hmac, (guchar*)"bcdef", 5); + g_assert_cmpstr (string, ==, g_hmac_get_string (hmac)); + g_hmac_unref (hmac); + g_free (string); +} + +static void +test_hmac_for_string (void) +{ + gchar *string; + GHmac *hmac; + + string = g_compute_hmac_for_string (G_CHECKSUM_SHA1, + (guchar*)"aaa", 3, + "bcdef", -1); + + hmac = g_hmac_new (G_CHECKSUM_SHA1, (guchar*)"aaa", 3); + g_hmac_update (hmac, (guchar*)"bcdef", 5); + g_assert_cmpstr (string, ==, g_hmac_get_string (hmac)); + g_hmac_unref (hmac); + g_free (string); +} + +int +main (int argc, + char **argv) +{ + int i; + g_test_init (&argc, &argv, NULL); + + for (i = 0 ; hmac_sha1_tests[i].key_len > 0 ; i++) + { + gchar *name = g_strdup_printf ("/hmac/sha1-%d", i + 1); + g_test_add_data_func (name, hmac_sha1_tests + i, + (void (*)(const void *)) test_hmac); + g_free (name); + } + + for (i = 0 ; hmac_md5_tests[i].key_len > 0 ; i++) + { + gchar *name = g_strdup_printf ("/hmac/md5-%d", i + 1); + g_test_add_data_func (name, hmac_md5_tests + i, + (void (*)(const void *)) test_hmac); + g_free (name); + } + + g_test_add_func ("/hmac/ref-unref", test_hmac_ref_unref); + g_test_add_func ("/hmac/copy", test_hmac_copy); + g_test_add_func ("/hmac/for-data", test_hmac_for_data); + g_test_add_func ("/hmac/for-string", test_hmac_for_string); + + return g_test_run (); +} diff --git a/glib/tests/hook.c b/glib/tests/hook.c new file mode 100644 index 0000000..5f139a8 --- /dev/null +++ b/glib/tests/hook.c @@ -0,0 +1,95 @@ +/* Unit tests for hook lists + * Copyright (C) 2011 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. + * + * Author: Matthias Clasen + */ + +#include "glib.h" + +static void +hook_func (gpointer data) +{ +} + +static void +destroy (gpointer data) +{ +} + +static void +test_hook1 (void) +{ + GHookList *hl; + GHook *hook; + gulong id; + GHook *h; + + hl = g_new (GHookList, 1); + g_hook_list_init (hl, sizeof (GHook)); + + hook = g_hook_alloc (hl); + hook->data = GINT_TO_POINTER(1); + hook->func = hook_func; + hook->flags = G_HOOK_FLAG_ACTIVE; + hook->destroy = destroy; + g_hook_append (hl, hook); + id = hook->hook_id; + + h = g_hook_get (hl, id); + g_assert (h == hook); + + h = hook = g_hook_alloc (hl); + hook->data = GINT_TO_POINTER(2); + hook->func = hook_func; + hook->flags = G_HOOK_FLAG_ACTIVE; + hook->destroy = destroy; + g_hook_prepend (hl, hook); + + g_hook_destroy (hl, id); + + hook = g_hook_alloc (hl); + hook->data = GINT_TO_POINTER(3); + hook->func = hook_func; + hook->flags = G_HOOK_FLAG_ACTIVE; + hook->destroy = destroy; + g_hook_insert_sorted (hl, hook, g_hook_compare_ids); + + hook = g_hook_alloc (hl); + hook->data = GINT_TO_POINTER(4); + hook->func = hook_func; + hook->flags = G_HOOK_FLAG_ACTIVE; + hook->destroy = destroy; + g_hook_insert_before (hl, h, hook); + + g_hook_list_invoke (hl, TRUE); + + g_hook_list_clear (hl); + g_free (hl); +} + +int main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/hook/test1", test_hook1); + + return g_test_run (); +} + diff --git a/glib/tests/hostutils.c b/glib/tests/hostutils.c new file mode 100644 index 0000000..218f516 --- /dev/null +++ b/glib/tests/hostutils.c @@ -0,0 +1,347 @@ +/* + * 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 +#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 struct { + const gchar *orig_name, *ascii_name; + gboolean orig_is_unicode, ascii_is_encoded; +} non_round_trip_names[] = { + /* uppercase characters */ + { "EXAMPLE.COM", "example.com", FALSE, FALSE }, + { "\xc3\x89XAMPLE.COM", "xn--xample-9ua.com", TRUE, TRUE }, + + /* unicode that decodes to ascii */ + { "\xe2\x93\x94\xe2\x93\xa7\xe2\x93\x90\xe2\x93\x9c\xe2\x93\x9f\xe2\x93\x9b\xe2\x93\x94.com", "example.com", TRUE, FALSE }, + + /* non-standard dot characters */ + { "example\xe3\x80\x82" "com", "example.com", TRUE, FALSE }, + { "\xc3\xa9xample\xe3\x80\x82" "com", "xn--xample-9ua.com", TRUE, TRUE } +}; +static const gint num_non_round_trip_names = G_N_ELEMENTS (non_round_trip_names); + +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_non_round_trip_names; i++) + { + if (non_round_trip_names[i].orig_is_unicode) + g_assert (g_hostname_is_non_ascii (non_round_trip_names[i].orig_name)); + else + g_assert (!g_hostname_is_non_ascii (non_round_trip_names[i].orig_name)); + + if (non_round_trip_names[i].ascii_is_encoded) + g_assert (g_hostname_is_ascii_encoded (non_round_trip_names[i].ascii_name)); + else + g_assert (!g_hostname_is_ascii_encoded (non_round_trip_names[i].ascii_name)); + + ascii = g_hostname_to_ascii (non_round_trip_names[i].orig_name); + g_assert_cmpstr (non_round_trip_names[i].ascii_name, ==, ascii); + g_free (ascii); + + ascii = g_hostname_to_ascii (non_round_trip_names[i].ascii_name); + g_assert_cmpstr (non_round_trip_names[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); + + if (argc == 2 && argv[1][0] != '-') + { + const gchar *hostname = argv[1]; + gchar *converted; + + if (g_hostname_is_non_ascii (hostname)) + { + converted = g_hostname_to_ascii (hostname); + printf ("to_ascii: %s\n", converted); + g_free (converted); + } + else if (g_hostname_is_ascii_encoded (hostname)) + { + converted = g_hostname_to_unicode (hostname); + printf ("to_unicode: %s\n", converted); + g_free (converted); + } + else + printf ("hostname is neither unicode nor ACE encoded\n"); + return 0; + } + + 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/include.c b/glib/tests/include.c new file mode 100644 index 0000000..0e8627b --- /dev/null +++ b/glib/tests/include.c @@ -0,0 +1,18 @@ +/* Test case for bug 659866 */ + +#define _POSIX_C_SOURCE 199309L +#undef _GNU_SOURCE +#undef _XOPEN_SOURCE +#include +#include + +int +main (int argc, char *argv[]) +{ + GRWLock lock; + + g_rw_lock_init (&lock); + g_rw_lock_clear (&lock); + + return 0; +} diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c new file mode 100644 index 0000000..530fbf1 --- /dev/null +++ b/glib/tests/keyfile.c @@ -0,0 +1,1616 @@ +#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); + + g_key_file_remove_comment (keyfile, "group1", "key2", &error); + check_no_error (&error); + comment = g_key_file_get_comment (keyfile, "group1", "key2", &error); + check_no_error (&error); + g_assert (comment == NULL); + + 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_set_boolean (keyfile, "valid", "key1", FALSE); + check_boolean_value (keyfile, "valid", "key1", FALSE); + + 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; + gchar *old_locale; + + 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 */ + + old_locale = g_strdup (setlocale (LC_ALL, NULL)); + 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); + + setlocale (LC_ALL, old_locale); + g_free (old_locale); +} + +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_assert (value == NULL); + 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_assert (value == NULL); + 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_assert (value == NULL); + 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); +} + +static const char int64_data[] = +"[bees]\n" +"a=1\n" +"b=2\n" +"c=123456789123456789\n" +"d=-123456789123456789\n"; + +static void +test_int64 (void) +{ + GKeyFile *file; + gboolean ok; + guint64 c; + gint64 d; + gchar *value; + + g_test_bug ("614864"); + + file = g_key_file_new (); + + ok = g_key_file_load_from_data (file, int64_data, strlen (int64_data), + 0, NULL); + g_assert (ok); + + c = g_key_file_get_uint64 (file, "bees", "c", NULL); + g_assert (c == G_GUINT64_CONSTANT (123456789123456789)); + + d = g_key_file_get_int64 (file, "bees", "d", NULL); + g_assert (d == G_GINT64_CONSTANT (-123456789123456789)); + + g_key_file_set_uint64 (file, "bees", "c", + G_GUINT64_CONSTANT (987654321987654321)); + value = g_key_file_get_value (file, "bees", "c", NULL); + g_assert_cmpstr (value, ==, "987654321987654321"); + g_free (value); + + g_key_file_set_int64 (file, "bees", "d", + G_GINT64_CONSTANT (-987654321987654321)); + value = g_key_file_get_value (file, "bees", "d", NULL); + g_assert_cmpstr (value, ==, "-987654321987654321"); + g_free (value); + + g_key_file_free (file); +} + +static void +test_load (void) +{ + GKeyFile *file; + GError *error; + gboolean bools[2] = { TRUE, FALSE }; + gboolean loaded; + + file = g_key_file_new (); + error = NULL; +#ifdef G_OS_UNIX + /* Uses the value of $XDG_DATA_HOME we set in main() */ + loaded = g_key_file_load_from_data_dirs (file, "keyfiletest.ini", NULL, 0, &error); +#else + loaded = g_key_file_load_from_file (file, SRCDIR "/keyfiletest.ini", 0, &error); +#endif + g_assert_no_error (error); + g_assert (loaded); + + g_key_file_set_locale_string (file, "test", "key4", "de", "Vierter Schlüssel"); + g_key_file_set_boolean_list (file, "test", "key5", bools, 2); + g_key_file_set_integer (file, "test", "key6", 22); + g_key_file_set_double (file, "test", "key7", 2.5); + g_key_file_set_comment (file, "test", "key7", "some float", NULL); + g_key_file_set_comment (file, "test", NULL, "the test group", NULL); + g_key_file_set_comment (file, NULL, NULL, "top comment", NULL); + + g_key_file_free (file); + + file = g_key_file_new (); + error = NULL; + g_assert (!g_key_file_load_from_data_dirs (file, "keyfile-test.ini", NULL, 0, &error)); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND); + g_error_free (error); + g_key_file_free (file); +} + +static void +test_load_fail (void) +{ + GKeyFile *file; + GError *error; + + file = g_key_file_new (); + error = NULL; + g_assert (!g_key_file_load_from_file (file, SRCDIR "/keyfile.c", 0, &error)); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE); + g_clear_error (&error); + g_assert (!g_key_file_load_from_file (file, "/nosuchfile", 0, &error)); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + g_clear_error (&error); + + g_key_file_free (file); +} + +static void +test_non_utf8 (void) +{ + GKeyFile *file; + static const char data[] = +"[group]\n" +"a=\230\230\230\n" +"b=a;b;\230\230\230;\n" +"c=a\\\n"; + gboolean ok; + GError *error; + gchar *s; + gchar **l; + + file = g_key_file_new (); + + ok = g_key_file_load_from_data (file, data, strlen (data), 0, NULL); + g_assert (ok); + + error = NULL; + s = g_key_file_get_string (file, "group", "a", &error); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING); + g_assert (s == NULL); + + g_clear_error (&error); + l = g_key_file_get_string_list (file, "group", "b", NULL, &error); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING); + g_assert (l == NULL); + + g_clear_error (&error); + l = g_key_file_get_string_list (file, "group", "c", NULL, &error); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + g_assert (l == NULL); + + g_clear_error (&error); + + g_key_file_free (file); +} + +#ifndef SRCDIR +#define SRCDIR "." +#endif + +static void +test_page_boundary (void) +{ + GKeyFile *file; + GError *error; + gint i; + +#define GROUP "main_section" +#define KEY_PREFIX "fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_" +#define FIRST_KEY 10 +#define LAST_KEY 99 +#define VALUE 92 + + g_test_bug ("640695"); + + file = g_key_file_new (); + + error = NULL; + g_key_file_load_from_file (file, SRCDIR "/pages.ini", G_KEY_FILE_NONE, &error); + g_assert_no_error (error); + + for (i = FIRST_KEY; i <= LAST_KEY; i++) + { + gchar *key; + gint val; + + key = g_strdup_printf (KEY_PREFIX "%d", i); + val = g_key_file_get_integer (file, GROUP, key, &error); + g_free (key); + g_assert_no_error (error); + g_assert_cmpint (val, ==, VALUE); + } + + g_key_file_free (file); +} + +static void +test_ref (void) +{ + GKeyFile *file; + static const char data[] = +"[group]\n" +"a=1\n"; + gboolean ok; + + file = g_key_file_new (); + + ok = g_key_file_load_from_data (file, data, strlen (data), 0, NULL); + g_assert (ok); + g_assert (g_key_file_has_key (file, "group", "a", NULL)); + g_key_file_ref (file); + g_key_file_free (file); + g_key_file_unref (file); +} + +/* https://bugzilla.gnome.org/show_bug.cgi?id=634232 */ +static void +test_replace_value (void) +{ + GKeyFile *keyfile; + + keyfile = g_key_file_new(); + g_key_file_set_value(keyfile, "grupo1", "chave1", "1234567890"); + g_key_file_set_value(keyfile, "grupo1", "chave1", "123123423423423432432423423"); + g_key_file_remove_group(keyfile, "grupo1", NULL); + g_free (g_key_file_to_data (keyfile, NULL, NULL)); + g_key_file_unref (keyfile); +} + +static void +test_list_separator (void) +{ + GKeyFile *keyfile; + GError *error = NULL; + + const gchar *data = + "[test]\n" + "key1=v1,v2\n"; + + keyfile = g_key_file_new (); + g_key_file_set_list_separator (keyfile, ','); + g_key_file_load_from_data (keyfile, data, -1, 0, &error); + + check_string_list_value (keyfile, "test", "key1", "v1", "v2", NULL); + g_key_file_unref (keyfile); +} + +static void +test_empty_string (void) +{ + GError *error = NULL; + GKeyFile *kf; + + kf = g_key_file_new (); + + g_key_file_load_from_data (kf, "", 0, 0, &error); + g_assert_no_error (error); + + g_key_file_load_from_data (kf, "", -1, 0, &error); + g_assert_no_error (error); + + /* NULL is a fine pointer to use if length is zero */ + g_key_file_load_from_data (kf, NULL, 0, 0, &error); + g_assert_no_error (error); + + /* should not attempt to access non-NULL pointer if length is zero */ + g_key_file_load_from_data (kf, GINT_TO_POINTER (1), 0, 0, &error); + g_assert_no_error (error); + + g_key_file_unref (kf); +} + +static void +test_limbo (void) +{ + GKeyFile *file; + static const char data[] = +"a=b\n" +"[group]\n" +"b=c\n"; + gboolean ok; + GError *error; + + file = g_key_file_new (); + + error = NULL; + ok = g_key_file_load_from_data (file, data, strlen (data), 0, &error); + g_assert (!ok); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); + g_clear_error (&error); + g_key_file_free (file); +} + +static void +test_utf8 (void) +{ + GKeyFile *file; + static const char data[] = +"[group]\n" +"Encoding=non-UTF-8\n"; + gboolean ok; + GError *error; + + file = g_key_file_new (); + + error = NULL; + ok = g_key_file_load_from_data (file, data, strlen (data), 0, &error); + g_assert (!ok); + g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING); + g_clear_error (&error); + g_key_file_free (file); +} + +static void +test_roundtrip (void) +{ + GKeyFile *kf; + const gchar orig[] = + "[Group1]\n" + "key1=value1\n" + "\n" + "[Group2]\n" + "key1=value1\n"; + gsize len; + gchar *data; + + kf = load_data (orig, G_KEY_FILE_KEEP_COMMENTS); + g_key_file_set_integer (kf, "Group1", "key2", 0); + g_key_file_remove_key (kf, "Group1", "key2", NULL); + + data = g_key_file_to_data (kf, &len, NULL); + g_assert_cmpstr (data, ==, orig); + + g_free (data); + g_key_file_free (kf); +} + +int +main (int argc, char *argv[]) +{ +#ifdef G_OS_UNIX + g_setenv ("XDG_DATA_HOME", SRCDIR, TRUE); +#endif + + 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); + g_test_add_func ("/keyfile/int64", test_int64); + g_test_add_func ("/keyfile/load", test_load); + g_test_add_func ("/keyfile/load-fail", test_load_fail); + g_test_add_func ("/keyfile/non-utf8", test_non_utf8); + g_test_add_func ("/keyfile/page-boundary", test_page_boundary); + g_test_add_func ("/keyfile/ref", test_ref); + g_test_add_func ("/keyfile/replace-value", test_replace_value); + g_test_add_func ("/keyfile/list-separator", test_list_separator); + g_test_add_func ("/keyfile/empty-string", test_empty_string); + g_test_add_func ("/keyfile/limbo", test_limbo); + g_test_add_func ("/keyfile/utf8", test_utf8); + g_test_add_func ("/keyfile/roundtrip", test_roundtrip); + + return g_test_run (); +} diff --git a/glib/tests/keyfiletest.ini b/glib/tests/keyfiletest.ini new file mode 100644 index 0000000..62a0431 --- /dev/null +++ b/glib/tests/keyfiletest.ini @@ -0,0 +1,4 @@ +[test] +key1=16 +key2=32 +key3=fourty-eight diff --git a/glib/tests/list.c b/glib/tests/list.c new file mode 100644 index 0000000..7241784 --- /dev/null +++ b/glib/tests/list.c @@ -0,0 +1,521 @@ +#include + +#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; + + 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)); + } + + g_list_free (list); +} + +static void +test_list_sort_with_data (void) +{ + GList *list = NULL; + gint i; + + 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)); + } + + g_list_free (list); +} + +static void +test_list_insert_sorted (void) +{ + GList *list = NULL; + gint i; + + 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)); + } + + g_list_free (list); +} + +static void +test_list_insert_sorted_with_data (void) +{ + GList *list = NULL; + gint i; + + 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)); + } + + 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; + + 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; + + 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); +} + +static void +test_list_concat (void) +{ + GList *list1 = NULL; + GList *list2 = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 5; i++) + { + list1 = g_list_append (list1, &nums[i]); + list2 = g_list_append (list2, &nums[i+5]); + } + + g_assert_cmpint (g_list_length (list1), ==, 5); + g_assert_cmpint (g_list_length (list2), ==, 5); + + list1 = g_list_concat (list1, list2); + + g_assert_cmpint (g_list_length (list1), ==, 10); + + for (i = 0; i < 10; i++) + { + st = g_list_nth (list1, i); + g_assert (*((gint*) st->data) == i); + } + + list2 = g_list_concat (NULL, list1); + g_assert_cmpint (g_list_length (list2), ==, 10); + + list2 = g_list_concat (list1, NULL); + g_assert_cmpint (g_list_length (list2), ==, 10); + + list2 = g_list_concat (NULL, NULL); + g_assert (list2 == NULL); + + g_list_free (list1); +} + +static void +test_list_remove (void) +{ + GList *list = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + { + list = g_list_append (list, &nums[i]); + list = g_list_append (list, &nums[i]); + } + + g_assert_cmpint (g_list_length (list), ==, 20); + + for (i = 0; i < 10; i++) + { + list = g_list_remove (list, &nums[i]); + } + + g_assert_cmpint (g_list_length (list), ==, 10); + + for (i = 0; i < 10; i++) + { + st = g_list_nth (list, i); + g_assert (*((gint*) st->data) == i); + } + + g_list_free (list); +} + +static void +test_list_remove_all (void) +{ + GList *list = NULL; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + { + list = g_list_append (list, &nums[i]); + list = g_list_append (list, &nums[i]); + } + + g_assert_cmpint (g_list_length (list), ==, 20); + + for (i = 0; i < 5; i++) + { + list = g_list_remove_all (list, &nums[2 * i + 1]); + list = g_list_remove_all (list, &nums[8 - 2 * i]); + } + + g_assert_cmpint (g_list_length (list), ==, 0); + g_assert (list == NULL); +} + +static void +test_list_first_last (void) +{ + GList *list = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + list = g_list_append (list, &nums[i]); + + st = g_list_last (list); + g_assert (*((gint*) st->data) == 9); + st = g_list_nth_prev (st, 3); + g_assert (*((gint*) st->data) == 6); + st = g_list_first (st); + g_assert (*((gint*) st->data) == 0); + + g_list_free (list); +} + +static void +test_list_insert (void) +{ + GList *list = NULL; + GList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + list = g_list_insert_before (NULL, NULL, &nums[1]); + list = g_list_insert (list, &nums[3], 1); + list = g_list_insert (list, &nums[4], -1); + list = g_list_insert (list, &nums[0], 0); + list = g_list_insert (list, &nums[5], 100); + list = g_list_insert_before (list, NULL, &nums[6]); + list = g_list_insert_before (list, list->next->next, &nums[2]); + + list = g_list_insert (list, &nums[9], 7); + list = g_list_insert (list, &nums[8], 7); + list = g_list_insert (list, &nums[7], 7); + + for (i = 0; i < 10; i++) + { + st = g_list_nth (list, i); + g_assert (*((gint*) st->data) == i); + } + + g_list_free (list); +} + +typedef struct +{ + gboolean freed; + int x; +} ListItem; + +static void +free_func (gpointer data) +{ + ListItem *item = data; + + item->freed = TRUE; +} + +static ListItem * +new_item (int x) +{ + ListItem *item; + + item = g_slice_new (ListItem); + item->freed = FALSE; + item->x = x; + + return item; +} + +static void +test_free_full (void) +{ + ListItem *one, *two, *three; + GSList *slist = NULL; + GList *list = NULL; + + slist = g_slist_prepend (slist, one = new_item (1)); + slist = g_slist_prepend (slist, two = new_item (2)); + slist = g_slist_prepend (slist, three = new_item (3)); + g_assert (!one->freed); + g_assert (!two->freed); + g_assert (!three->freed); + g_slist_free_full (slist, free_func); + g_assert (one->freed); + g_assert (two->freed); + g_assert (three->freed); + g_slice_free (ListItem, one); + g_slice_free (ListItem, two); + g_slice_free (ListItem, three); + + list = g_list_prepend (list, one = new_item (1)); + list = g_list_prepend (list, two = new_item (2)); + list = g_list_prepend (list, three = new_item (3)); + g_assert (!one->freed); + g_assert (!two->freed); + g_assert (!three->freed); + g_list_free_full (list, free_func); + g_assert (one->freed); + g_assert (two->freed); + g_assert (three->freed); + g_slice_free (ListItem, one); + g_slice_free (ListItem, two); + g_slice_free (ListItem, three); +} + +static void +test_list_copy (void) +{ + GList *l, *l2; + GList *u, *v; + + l = NULL; + l = g_list_append (l, GINT_TO_POINTER (1)); + l = g_list_append (l, GINT_TO_POINTER (2)); + l = g_list_append (l, GINT_TO_POINTER (3)); + + l2 = g_list_copy (l); + + for (u = l, v = l2; u && v; u = u->next, v = v->next) + { + g_assert (u->data == v->data); + } + + g_list_free (l); + g_list_free (l2); +} + +static gpointer +multiply_value (gconstpointer value, gpointer data) +{ + return GINT_TO_POINTER (GPOINTER_TO_INT (value) * GPOINTER_TO_INT (data)); +} + +static void +test_list_copy_deep (void) +{ + GList *l, *l2; + GList *u, *v; + + l = NULL; + l = g_list_append (l, GINT_TO_POINTER (1)); + l = g_list_append (l, GINT_TO_POINTER (2)); + l = g_list_append (l, GINT_TO_POINTER (3)); + + l2 = g_list_copy_deep (l, multiply_value, GINT_TO_POINTER (2)); + + for (u = l, v = l2; u && v; u = u->next, v = v->next) + { + g_assert_cmpint (GPOINTER_TO_INT (u->data) * 2, ==, GPOINTER_TO_INT (v->data)); + } + + g_list_free (l); + g_list_free (l2); +} + +static void +test_delete_link (void) +{ + GList *l, *l2; + + l = NULL; + l = g_list_append (l, GINT_TO_POINTER (1)); + l = g_list_append (l, GINT_TO_POINTER (2)); + l = g_list_append (l, GINT_TO_POINTER (3)); + + l2 = l->next; + + l = g_list_delete_link (l, l2); + g_assert (l->data == GINT_TO_POINTER (1)); + g_assert (l->next->data == GINT_TO_POINTER (3)); + + g_list_free (l); +} + +static void +test_prepend (void) +{ + GList *l, *l2; + + l = NULL; + l = g_list_prepend (l, "c"); + l = g_list_prepend (l, "a"); + + g_assert (l->data == (gpointer)"a"); + g_assert (l->next->data == (gpointer)"c"); + g_assert (l->next->next == NULL); + + l2 = l->next; + l2 = g_list_prepend (l2, "b"); + g_assert (l2->prev == l); + + g_assert (l->data == (gpointer)"a"); + g_assert (l->next->data == (gpointer)"b"); + g_assert (l->next->next->data == (gpointer)"c"); + g_assert (l->next->next->next == NULL); + + g_list_free (l); +} + +static void +test_position (void) +{ + GList *l, *ll; + + l = NULL; + l = g_list_append (l, "a"); + l = g_list_append (l, "b"); + l = g_list_append (l, "c"); + + ll = g_list_find (l, "a"); + g_assert_cmpint (g_list_position (l, ll), ==, 0); + g_assert_cmpint (g_list_index (l, "a"), ==, 0); + ll = g_list_find (l, "b"); + g_assert_cmpint (g_list_position (l, ll), ==, 1); + g_assert_cmpint (g_list_index (l, "b"), ==, 1); + ll = g_list_find (l, "c"); + g_assert_cmpint (g_list_position (l, ll), ==, 2); + g_assert_cmpint (g_list_index (l, "c"), ==, 2); + + ll = g_list_append (NULL, "d"); + g_assert_cmpint (g_list_position (l, ll), ==, -1); + g_assert_cmpint (g_list_index (l, "d"), ==, -1); + + g_list_free (l); + g_list_free (ll); +} + +int +main (int argc, char *argv[]) +{ + gint i; + + g_test_init (&argc, &argv, NULL); + + /* Create an array of random numbers. */ + for (i = 0; i < SIZE; i++) + array[i] = g_test_rand_int_range (NUMBER_MIN, NUMBER_MAX); + + g_test_add_func ("/list/sort", test_list_sort); + g_test_add_func ("/list/sort-with-data", test_list_sort_with_data); + g_test_add_func ("/list/insert-sorted", test_list_insert_sorted); + g_test_add_func ("/list/insert-sorted-with-data", test_list_insert_sorted_with_data); + g_test_add_func ("/list/reverse", test_list_reverse); + g_test_add_func ("/list/nth", test_list_nth); + g_test_add_func ("/list/concat", test_list_concat); + g_test_add_func ("/list/remove", test_list_remove); + g_test_add_func ("/list/remove-all", test_list_remove_all); + g_test_add_func ("/list/first-last", test_list_first_last); + g_test_add_func ("/list/insert", test_list_insert); + g_test_add_func ("/list/free-full", test_free_full); + g_test_add_func ("/list/copy", test_list_copy); + g_test_add_func ("/list/copy-deep", test_list_copy_deep); + g_test_add_func ("/list/delete-link", test_delete_link); + g_test_add_func ("/list/prepend", test_prepend); + g_test_add_func ("/list/position", test_position); + + return g_test_run (); +} diff --git a/glib/tests/logging.c b/glib/tests/logging.c new file mode 100644 index 0000000..e2df2b5 --- /dev/null +++ b/glib/tests/logging.c @@ -0,0 +1,276 @@ +#include +#include + +/* Test g_warn macros */ +static void +test_warnings (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_warn_if_reached (); + } + g_test_trap_assert_failed(); + g_test_trap_assert_stderr ("*WARNING*test_warnings*should not be reached*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_warn_if_fail (FALSE); + } + g_test_trap_assert_failed(); + g_test_trap_assert_stderr ("*WARNING*test_warnings*runtime check failed*"); +} + +static guint log_count = 0; + +static void +log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_assert_cmpstr (log_domain, ==, "bu"); + g_assert_cmpint (log_level, ==, G_LOG_LEVEL_INFO); + + log_count++; +} + +/* test that custom log handlers only get called for + * their domain and level + */ +static void +test_set_handler (void) +{ + guint id; + + id = g_log_set_handler ("bu", G_LOG_LEVEL_INFO, log_handler, NULL); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log ("bu", G_LOG_LEVEL_DEBUG, "message"); + g_log ("ba", G_LOG_LEVEL_DEBUG, "message"); + g_log ("bu", G_LOG_LEVEL_INFO, "message"); + g_log ("ba", G_LOG_LEVEL_INFO, "message"); + + g_assert_cmpint (log_count, ==, 1); + exit (0); + } + g_test_trap_assert_passed (); + + g_log_remove_handler ("bu", id); +} + +static void +test_default_handler (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_error ("message1"); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*ERROR*message1*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_critical ("message2"); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*CRITICAL*message2*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_warning ("message3"); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*WARNING*message3*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_message ("message4"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stderr ("*Message*message4*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "message5"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout_unmatched ("*INFO*message5*"); + + g_setenv ("G_MESSAGES_DEBUG", "foo bar baz", TRUE); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_log ("bar", G_LOG_LEVEL_INFO, "message5"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*INFO*message5*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_log ("baz", G_LOG_LEVEL_DEBUG, "message6"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*DEBUG*message6*"); + + g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_log ("foo", G_LOG_LEVEL_DEBUG, "6"); + g_log ("bar", G_LOG_LEVEL_DEBUG, "6"); + g_log ("baz", G_LOG_LEVEL_DEBUG, "6"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*DEBUG*6*6*6*"); + + g_unsetenv ("G_MESSAGES_DEBUG"); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + g_log_set_default_handler (g_log_default_handler, NULL); + g_log (G_LOG_DOMAIN, 1<<10, "message7"); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*LOG-0x400*message7*"); +} + +/* test that setting levels as fatal works */ +static void +test_fatal_log_mask (void) +{ + GLogLevelFlags flags; + + flags = g_log_set_fatal_mask ("bu", G_LOG_LEVEL_INFO); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + g_log ("bu", G_LOG_LEVEL_INFO, "fatal"); + g_test_trap_assert_failed (); + g_log_set_fatal_mask ("bu", flags); +} + +static gint my_print_count = 0; +static void +my_print_handler (const gchar *text) +{ + my_print_count++; +} + +static void +test_print_handler (void) +{ + GPrintFunc old_print_handler; + + old_print_handler = g_set_print_handler (my_print_handler); + g_assert (old_print_handler == NULL); + + my_print_count = 0; + g_print ("bu ba"); + g_assert_cmpint (my_print_count, ==, 1); + + g_set_print_handler (NULL); +} + +static void +test_printerr_handler (void) +{ + GPrintFunc old_printerr_handler; + + old_printerr_handler = g_set_printerr_handler (my_print_handler); + g_assert (old_printerr_handler == NULL); + + my_print_count = 0; + g_printerr ("bu ba"); + g_assert_cmpint (my_print_count, ==, 1); + + g_set_printerr_handler (NULL); +} + +static char *fail_str = "foo"; +static char *log_str = "bar"; + +static gboolean +good_failure_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *msg, + gpointer user_data) +{ + g_test_message ("The Good Fail Message Handler\n"); + g_assert ((char *)user_data != log_str); + g_assert ((char *)user_data == fail_str); + + return FALSE; +} + +static gboolean +bad_failure_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *msg, + gpointer user_data) +{ + g_test_message ("The Bad Fail Message Handler\n"); + g_assert ((char *)user_data == log_str); + g_assert ((char *)user_data != fail_str); + + return FALSE; +} + +static void +test_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *msg, + gpointer user_data) +{ + g_test_message ("The Log Message Handler\n"); + g_assert ((char *)user_data != fail_str); + g_assert ((char *)user_data == log_str); +} + +static void +bug653052 (void) +{ + g_test_bug ("653052"); + + g_test_log_set_fatal_handler (good_failure_handler, fail_str); + g_log_set_default_handler (test_handler, log_str); + + g_return_if_fail (0); + + g_test_log_set_fatal_handler (bad_failure_handler, fail_str); + g_log_set_default_handler (test_handler, log_str); + + g_return_if_fail (0); +} + +int +main (int argc, char *argv[]) +{ + g_unsetenv ("G_MESSAGES_DEBUG"); + + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/logging/default-handler", test_default_handler); + g_test_add_func ("/logging/warnings", test_warnings); + g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask); + g_test_add_func ("/logging/set-handler", test_set_handler); + g_test_add_func ("/logging/print-handler", test_print_handler); + g_test_add_func ("/logging/printerr-handler", test_printerr_handler); + g_test_add_func ("/logging/653052", bug653052); + + return g_test_run (); +} + diff --git a/glib/tests/mainloop.c b/glib/tests/mainloop.c new file mode 100644 index 0000000..530a53c --- /dev/null +++ b/glib/tests/mainloop.c @@ -0,0 +1,1275 @@ +/* Unit tests for GMainLoop + * Copyright (C) 2011 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 "glib-private.h" +#include + +static gboolean cb (gpointer data) +{ + return FALSE; +} + +static gboolean prepare (GSource *source, gint *time) +{ + return FALSE; +} +static gboolean check (GSource *source) +{ + return FALSE; +} +static gboolean dispatch (GSource *source, GSourceFunc cb, gpointer date) +{ + return FALSE; +} + +GSourceFuncs funcs = { + prepare, + check, + dispatch, + NULL +}; + +static void +test_maincontext_basic (void) +{ + GMainContext *ctx; + GSource *source; + guint id; + gpointer data = &funcs; + + ctx = g_main_context_new (); + + g_assert (!g_main_context_pending (ctx)); + g_assert (!g_main_context_iteration (ctx, FALSE)); + + source = g_source_new (&funcs, sizeof (GSource)); + g_assert_cmpint (g_source_get_priority (source), ==, G_PRIORITY_DEFAULT); + g_assert (!g_source_is_destroyed (source)); + + g_assert (!g_source_get_can_recurse (source)); + g_assert (g_source_get_name (source) == NULL); + + g_source_set_can_recurse (source, TRUE); + g_source_set_name (source, "d"); + + g_assert (g_source_get_can_recurse (source)); + g_assert_cmpstr (g_source_get_name (source), ==, "d"); + + g_assert (g_main_context_find_source_by_user_data (ctx, NULL) == NULL); + g_assert (g_main_context_find_source_by_funcs_user_data (ctx, &funcs, NULL) == NULL); + + id = g_source_attach (source, ctx); + g_assert_cmpint (g_source_get_id (source), ==, id); + g_assert (g_main_context_find_source_by_id (ctx, id) == source); + + g_source_set_priority (source, G_PRIORITY_HIGH); + g_assert_cmpint (g_source_get_priority (source), ==, G_PRIORITY_HIGH); + + g_source_destroy (source); + g_assert (g_source_get_context (source) == ctx); + g_assert (g_main_context_find_source_by_id (ctx, id) == NULL); + + g_main_context_unref (ctx); + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*source->context != NULL*failed*"); + g_assert (g_source_get_context (source) == NULL); + g_test_assert_expected_messages (); + } + + g_source_unref (source); + + ctx = g_main_context_default (); + source = g_source_new (&funcs, sizeof (GSource)); + g_source_set_funcs (source, &funcs); + g_source_set_callback (source, cb, data, NULL); + id = g_source_attach (source, ctx); + g_source_unref (source); + g_source_set_name_by_id (id, "e"); + g_assert_cmpstr (g_source_get_name (source), ==, "e"); + g_assert (g_source_get_context (source) == ctx); + g_assert (g_source_remove_by_funcs_user_data (&funcs, data)); + + source = g_source_new (&funcs, sizeof (GSource)); + g_source_set_funcs (source, &funcs); + g_source_set_callback (source, cb, data, NULL); + id = g_source_attach (source, ctx); + g_source_unref (source); + g_assert (g_source_remove_by_user_data (data)); + + g_idle_add (cb, data); + g_assert (g_idle_remove_by_data (data)); +} + +static void +test_mainloop_basic (void) +{ + GMainLoop *loop; + GMainContext *ctx; + + loop = g_main_loop_new (NULL, FALSE); + + g_assert (!g_main_loop_is_running (loop)); + + g_main_loop_ref (loop); + + ctx = g_main_loop_get_context (loop); + g_assert (ctx == g_main_context_default ()); + + g_main_loop_unref (loop); + + g_assert_cmpint (g_main_depth (), ==, 0); + + g_main_loop_unref (loop); +} + +static gint a; +static gint b; +static gint c; + +static gboolean +count_calls (gpointer data) +{ + gint *i = data; + + (*i)++; + + return TRUE; +} + +static void +test_timeouts (void) +{ + GMainContext *ctx; + GMainLoop *loop; + GSource *source; + + a = b = c = 0; + + ctx = g_main_context_new (); + loop = g_main_loop_new (ctx, FALSE); + + source = g_timeout_source_new (100); + g_source_set_callback (source, count_calls, &a, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + source = g_timeout_source_new (250); + g_source_set_callback (source, count_calls, &b, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + source = g_timeout_source_new (330); + g_source_set_callback (source, count_calls, &c, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + source = g_timeout_source_new (1050); + g_source_set_callback (source, (GSourceFunc)g_main_loop_quit, loop, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + g_main_loop_run (loop); + + /* this is a race condition; under some circumstances we might not get 10 + * 100ms runs in 1050 ms, so consider 9 as "close enough" */ + g_assert_cmpint (a, >=, 9); + g_assert_cmpint (a, <=, 10); + g_assert_cmpint (b, ==, 4); + g_assert_cmpint (c, ==, 3); + + g_main_loop_unref (loop); + g_main_context_unref (ctx); +} + +static void +test_priorities (void) +{ + GMainContext *ctx; + GSource *sourcea; + GSource *sourceb; + + a = b = c = 0; + + ctx = g_main_context_new (); + + sourcea = g_idle_source_new (); + g_source_set_callback (sourcea, count_calls, &a, NULL); + g_source_set_priority (sourcea, 1); + g_source_attach (sourcea, ctx); + g_source_unref (sourcea); + + sourceb = g_idle_source_new (); + g_source_set_callback (sourceb, count_calls, &b, NULL); + g_source_set_priority (sourceb, 0); + g_source_attach (sourceb, ctx); + g_source_unref (sourceb); + + g_assert (g_main_context_pending (ctx)); + g_assert (g_main_context_iteration (ctx, FALSE)); + g_assert_cmpint (a, ==, 0); + g_assert_cmpint (b, ==, 1); + + g_assert (g_main_context_iteration (ctx, FALSE)); + g_assert_cmpint (a, ==, 0); + g_assert_cmpint (b, ==, 2); + + g_source_destroy (sourceb); + + g_assert (g_main_context_iteration (ctx, FALSE)); + g_assert_cmpint (a, ==, 1); + g_assert_cmpint (b, ==, 2); + + g_assert (g_main_context_pending (ctx)); + g_source_destroy (sourcea); + g_assert (!g_main_context_pending (ctx)); + + g_main_context_unref (ctx); +} + +static gboolean +quit_loop (gpointer data) +{ + GMainLoop *loop = data; + + g_main_loop_quit (loop); + + return G_SOURCE_REMOVE; +} + +static gint count; + +static gboolean +func (gpointer data) +{ + if (data != NULL) + g_assert (data == g_thread_self ()); + + count++; + + return FALSE; +} + +static gboolean +call_func (gpointer data) +{ + func (g_thread_self ()); + + return G_SOURCE_REMOVE; +} + +static GMutex mutex; +static GCond cond; +static gboolean thread_ready; + +static gpointer +thread_func (gpointer data) +{ + GMainContext *ctx = data; + GMainLoop *loop; + GSource *source; + + g_main_context_push_thread_default (ctx); + loop = g_main_loop_new (ctx, FALSE); + + g_mutex_lock (&mutex); + thread_ready = TRUE; + g_cond_signal (&cond); + g_mutex_unlock (&mutex); + + source = g_timeout_source_new (500); + g_source_set_callback (source, quit_loop, loop, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + + g_main_loop_run (loop); + + g_main_context_pop_thread_default (ctx); + g_main_loop_unref (loop); + + return NULL; +} + +static void +test_invoke (void) +{ + GMainContext *ctx; + GThread *thread; + + count = 0; + + /* this one gets invoked directly */ + g_main_context_invoke (NULL, func, g_thread_self ()); + g_assert_cmpint (count, ==, 1); + + /* invoking out of an idle works too */ + g_idle_add (call_func, NULL); + g_main_context_iteration (g_main_context_default (), FALSE); + g_assert_cmpint (count, ==, 2); + + /* test thread-default forcing the invocation to go + * to another thread + */ + ctx = g_main_context_new (); + thread = g_thread_new ("worker", thread_func, ctx); + + g_mutex_lock (&mutex); + while (!thread_ready) + g_cond_wait (&cond, &mutex); + g_mutex_unlock (&mutex); + + g_main_context_invoke (ctx, func, thread); + + g_thread_join (thread); + g_assert_cmpint (count, ==, 3); + + g_main_context_unref (ctx); +} + +static gboolean +run_inner_loop (gpointer user_data) +{ + GMainContext *ctx = user_data; + GMainLoop *inner; + GSource *timeout; + + a++; + + inner = g_main_loop_new (ctx, FALSE); + timeout = g_timeout_source_new (100); + g_source_set_callback (timeout, quit_loop, inner, NULL); + g_source_attach (timeout, ctx); + g_source_unref (timeout); + + g_main_loop_run (inner); + g_main_loop_unref (inner); + + return G_SOURCE_CONTINUE; +} + +static void +test_child_sources (void) +{ + GMainContext *ctx; + GMainLoop *loop; + GSource *parent, *child_b, *child_c, *end; + + ctx = g_main_context_new (); + loop = g_main_loop_new (ctx, FALSE); + + a = b = c = 0; + + parent = g_timeout_source_new (2000); + g_source_set_callback (parent, run_inner_loop, ctx, NULL); + g_source_set_priority (parent, G_PRIORITY_LOW); + g_source_attach (parent, ctx); + + child_b = g_timeout_source_new (250); + g_source_set_callback (child_b, count_calls, &b, NULL); + g_source_add_child_source (parent, child_b); + + child_c = g_timeout_source_new (330); + g_source_set_callback (child_c, count_calls, &c, NULL); + g_source_set_priority (child_c, G_PRIORITY_HIGH); + g_source_add_child_source (parent, child_c); + + /* Child sources always have the priority of the parent */ + g_assert_cmpint (g_source_get_priority (parent), ==, G_PRIORITY_LOW); + g_assert_cmpint (g_source_get_priority (child_b), ==, G_PRIORITY_LOW); + g_assert_cmpint (g_source_get_priority (child_c), ==, G_PRIORITY_LOW); + g_source_set_priority (parent, G_PRIORITY_DEFAULT); + g_assert_cmpint (g_source_get_priority (parent), ==, G_PRIORITY_DEFAULT); + g_assert_cmpint (g_source_get_priority (child_b), ==, G_PRIORITY_DEFAULT); + g_assert_cmpint (g_source_get_priority (child_c), ==, G_PRIORITY_DEFAULT); + + end = g_timeout_source_new (1050); + g_source_set_callback (end, quit_loop, loop, NULL); + g_source_attach (end, ctx); + g_source_unref (end); + + g_main_loop_run (loop); + + /* The parent source's own timeout will never trigger, so "a" will + * only get incremented when "b" or "c" does. And when timeouts get + * blocked, they still wait the full interval next time rather than + * "catching up". So the timing is: + * + * 250 - b++ -> a++, run_inner_loop + * 330 - (c is blocked) + * 350 - inner_loop ends + * 350 - c++ belatedly -> a++, run_inner_loop + * 450 - inner loop ends + * 500 - b++ -> a++, run_inner_loop + * 600 - inner_loop ends + * 680 - c++ -> a++, run_inner_loop + * 750 - (b is blocked) + * 780 - inner loop ends + * 780 - b++ belatedly -> a++, run_inner_loop + * 880 - inner loop ends + * 1010 - c++ -> a++, run_inner_loop + * 1030 - (b is blocked) + * 1050 - end runs, quits outer loop, which has no effect yet + * 1110 - inner loop ends, a returns, outer loop exits + */ + + g_assert_cmpint (a, ==, 6); + g_assert_cmpint (b, ==, 3); + g_assert_cmpint (c, ==, 3); + + g_source_destroy (parent); + g_source_unref (parent); + g_source_unref (child_b); + g_source_unref (child_c); + + g_main_loop_unref (loop); + g_main_context_unref (ctx); +} + +static void +test_recursive_child_sources (void) +{ + GMainContext *ctx; + GMainLoop *loop; + GSource *parent, *child_b, *child_c, *end; + + ctx = g_main_context_new (); + loop = g_main_loop_new (ctx, FALSE); + + a = b = c = 0; + + parent = g_timeout_source_new (500); + g_source_set_callback (parent, count_calls, &a, NULL); + + child_b = g_timeout_source_new (220); + g_source_set_callback (child_b, count_calls, &b, NULL); + g_source_add_child_source (parent, child_b); + + child_c = g_timeout_source_new (430); + g_source_set_callback (child_c, count_calls, &c, NULL); + g_source_add_child_source (child_b, child_c); + + g_source_attach (parent, ctx); + + end = g_timeout_source_new (2010); + g_source_set_callback (end, (GSourceFunc)g_main_loop_quit, loop, NULL); + g_source_attach (end, ctx); + g_source_unref (end); + + g_main_loop_run (loop); + + /* Sequence of events: + * 220 b (b = 440, a = 720) + * 430 c (c = 860, b = 650, a = 930) + * 650 b (b = 870, a = 1150) + * 860 c (c = 1290, b = 1080, a = 1360) + * 1080 b (b = 1300, a = 1580) + * 1290 c (c = 1720, b = 1510, a = 1790) + * 1510 b (b = 1730, a = 2010) + * 1720 c (c = 2150, b = 1940, a = 2220) + * 1940 b (b = 2160, a = 2440) + */ + + g_assert_cmpint (a, ==, 9); + g_assert_cmpint (b, ==, 9); + g_assert_cmpint (c, ==, 4); + + g_source_destroy (parent); + g_source_unref (parent); + g_source_unref (child_b); + g_source_unref (child_c); + + g_main_loop_unref (loop); + g_main_context_unref (ctx); +} + +typedef struct { + GSource *parent, *old_child, *new_child; + GMainLoop *loop; +} SwappingTestData; + +static gboolean +swap_sources (gpointer user_data) +{ + SwappingTestData *data = user_data; + + if (data->old_child) + { + g_source_remove_child_source (data->parent, data->old_child); + g_clear_pointer (&data->old_child, g_source_unref); + } + + if (!data->new_child) + { + data->new_child = g_timeout_source_new (0); + g_source_set_callback (data->new_child, quit_loop, data->loop, NULL); + g_source_add_child_source (data->parent, data->new_child); + } + + return G_SOURCE_CONTINUE; +} + +static gboolean +assert_not_reached_callback (gpointer user_data) +{ + g_assert_not_reached (); + + return G_SOURCE_REMOVE; +} + +static void +test_swapping_child_sources (void) +{ + GMainContext *ctx; + GMainLoop *loop; + SwappingTestData data; + + ctx = g_main_context_new (); + loop = g_main_loop_new (ctx, FALSE); + + data.parent = g_timeout_source_new (50); + data.loop = loop; + g_source_set_callback (data.parent, swap_sources, &data, NULL); + g_source_attach (data.parent, ctx); + + data.old_child = g_timeout_source_new (100); + g_source_add_child_source (data.parent, data.old_child); + g_source_set_callback (data.old_child, assert_not_reached_callback, NULL, NULL); + + data.new_child = NULL; + g_main_loop_run (loop); + + g_source_destroy (data.parent); + g_source_unref (data.parent); + g_source_unref (data.new_child); + + g_main_loop_unref (loop); + g_main_context_unref (ctx); +} + +typedef struct { + GMainContext *ctx; + GMainLoop *loop; + + GSource *timeout1, *timeout2; + gint64 time1; +} TimeTestData; + +static gboolean +timeout1_callback (gpointer user_data) +{ + TimeTestData *data = user_data; + GSource *source; + gint64 mtime1, mtime2, time2; + + source = g_main_current_source (); + g_assert (source == data->timeout1); + + if (data->time1 == -1) + { + /* First iteration */ + g_assert (!g_source_is_destroyed (data->timeout2)); + + mtime1 = g_get_monotonic_time (); + data->time1 = g_source_get_time (source); + + /* g_source_get_time() does not change during a single callback */ + g_usleep (1000000); + mtime2 = g_get_monotonic_time (); + time2 = g_source_get_time (source); + + g_assert_cmpint (mtime1, <, mtime2); + g_assert_cmpint (data->time1, ==, time2); + } + else + { + /* Second iteration */ + g_assert (g_source_is_destroyed (data->timeout2)); + + /* g_source_get_time() MAY change between iterations; in this + * case we know for sure that it did because of the g_usleep() + * last time. + */ + time2 = g_source_get_time (source); + g_assert_cmpint (data->time1, <, time2); + + g_main_loop_quit (data->loop); + } + + return TRUE; +} + +static gboolean +timeout2_callback (gpointer user_data) +{ + TimeTestData *data = user_data; + GSource *source; + gint64 time2, time3; + + source = g_main_current_source (); + g_assert (source == data->timeout2); + + g_assert (!g_source_is_destroyed (data->timeout1)); + + /* g_source_get_time() does not change between different sources in + * a single iteration of the mainloop. + */ + time2 = g_source_get_time (source); + g_assert_cmpint (data->time1, ==, time2); + + /* The source should still have a valid time even after being + * destroyed, since it's currently running. + */ + g_source_destroy (source); + time3 = g_source_get_time (source); + g_assert_cmpint (time2, ==, time3); + + return FALSE; +} + +static void +test_source_time (void) +{ + TimeTestData data; + + data.ctx = g_main_context_new (); + data.loop = g_main_loop_new (data.ctx, FALSE); + + data.timeout1 = g_timeout_source_new (0); + g_source_set_callback (data.timeout1, timeout1_callback, &data, NULL); + g_source_attach (data.timeout1, data.ctx); + + data.timeout2 = g_timeout_source_new (0); + g_source_set_callback (data.timeout2, timeout2_callback, &data, NULL); + g_source_attach (data.timeout2, data.ctx); + + data.time1 = -1; + + g_main_loop_run (data.loop); + + g_assert (!g_source_is_destroyed (data.timeout1)); + g_assert (g_source_is_destroyed (data.timeout2)); + + g_source_destroy (data.timeout1); + g_source_unref (data.timeout1); + g_source_unref (data.timeout2); + + g_main_loop_unref (data.loop); + g_main_context_unref (data.ctx); +} + +typedef struct { + guint outstanding_ops; + GMainLoop *loop; +} TestOverflowData; + +static gboolean +on_source_fired_cb (gpointer user_data) +{ + TestOverflowData *data = user_data; + GSource *current_source; + GMainContext *current_context; + guint source_id; + + data->outstanding_ops--; + + current_source = g_main_current_source (); + current_context = g_source_get_context (current_source); + source_id = g_source_get_id (current_source); + g_assert (g_main_context_find_source_by_id (current_context, source_id) != NULL); + g_source_destroy (current_source); + g_assert (g_main_context_find_source_by_id (current_context, source_id) == NULL); + + if (data->outstanding_ops == 0) + g_main_loop_quit (data->loop); + return FALSE; +} + +static GSource * +add_idle_source (GMainContext *ctx, + TestOverflowData *data) +{ + GSource *source; + + source = g_idle_source_new (); + g_source_set_callback (source, on_source_fired_cb, data, NULL); + g_source_attach (source, ctx); + g_source_unref (source); + data->outstanding_ops++; + + return source; +} + +/* https://bugzilla.gnome.org/show_bug.cgi?id=687098 */ +static void +test_mainloop_overflow (void) +{ + GMainContext *ctx; + GMainLoop *loop; + GSource *source; + TestOverflowData data; + guint i; + + memset (&data, 0, sizeof (data)); + + ctx = GLIB_PRIVATE_CALL (g_main_context_new_with_next_id) (G_MAXUINT-1); + + loop = g_main_loop_new (ctx, TRUE); + data.outstanding_ops = 0; + data.loop = loop; + + source = add_idle_source (ctx, &data); + g_assert_cmpint (source->source_id, ==, G_MAXUINT-1); + + source = add_idle_source (ctx, &data); + g_assert_cmpint (source->source_id, ==, G_MAXUINT); + + source = add_idle_source (ctx, &data); + g_assert_cmpint (source->source_id, !=, 0); + + /* Now, a lot more sources */ + for (i = 0; i < 50; i++) + { + source = add_idle_source (ctx, &data); + g_assert_cmpint (source->source_id, !=, 0); + } + + g_main_loop_run (loop); + g_assert_cmpint (data.outstanding_ops, ==, 0); + + g_main_loop_unref (loop); + g_main_context_unref (ctx); +} + +static volatile gint ready_time_dispatched; + +static gboolean +ready_time_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + g_atomic_int_set (&ready_time_dispatched, TRUE); + + g_source_set_ready_time (source, -1); + + return TRUE; +} + +static gpointer +run_context (gpointer user_data) +{ + g_main_loop_run (user_data); + + return NULL; +} + +static void +test_ready_time (void) +{ + GThread *thread; + GSource *source; + GSourceFuncs source_funcs = { + NULL, NULL, ready_time_dispatch + }; + GMainLoop *loop; + + source = g_source_new (&source_funcs, sizeof (GSource)); + g_source_attach (source, NULL); + g_source_unref (source); + + /* Unfortunately we can't do too many things with respect to timing + * without getting into trouble on slow systems or heavily loaded + * builders. + * + * We can test that the basics are working, though. + */ + + /* A source with no ready time set should not fire */ + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (!ready_time_dispatched); + + /* The ready time should not have been changed */ + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* Of course this shouldn't change anything either */ + g_source_set_ready_time (source, -1); + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* A source with a ready time set to tomorrow should not fire on any + * builder, no matter how badly loaded... + */ + g_source_set_ready_time (source, g_get_monotonic_time () + G_TIME_SPAN_DAY); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (!ready_time_dispatched); + /* Make sure it didn't get reset */ + g_assert_cmpint (g_source_get_ready_time (source), !=, -1); + + /* Ready time of -1 -> don't fire */ + g_source_set_ready_time (source, -1); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (!ready_time_dispatched); + /* Not reset, but should still be -1 from above */ + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* A ready time of the current time should fire immediately */ + g_source_set_ready_time (source, g_get_monotonic_time ()); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (ready_time_dispatched); + ready_time_dispatched = FALSE; + /* Should have gotten reset by the handler function */ + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* As well as one in the recent past... */ + g_source_set_ready_time (source, g_get_monotonic_time () - G_TIME_SPAN_SECOND); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (ready_time_dispatched); + ready_time_dispatched = FALSE; + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* Zero is the 'official' way to get a source to fire immediately */ + g_source_set_ready_time (source, 0); + while (g_main_context_iteration (NULL, FALSE)); + g_assert (ready_time_dispatched); + ready_time_dispatched = FALSE; + g_assert_cmpint (g_source_get_ready_time (source), ==, -1); + + /* Now do some tests of cross-thread wakeups. + * + * Make sure it wakes up right away from the start. + */ + g_source_set_ready_time (source, 0); + loop = g_main_loop_new (NULL, FALSE); + thread = g_thread_new ("context thread", run_context, loop); + while (!g_atomic_int_get (&ready_time_dispatched)); + + /* Now let's see if it can wake up from sleeping. */ + g_usleep (G_TIME_SPAN_SECOND / 2); + g_atomic_int_set (&ready_time_dispatched, FALSE); + g_source_set_ready_time (source, 0); + while (!g_atomic_int_get (&ready_time_dispatched)); + + /* kill the thread */ + g_main_loop_quit (loop); + g_thread_join (thread); + g_main_loop_unref (loop); + + g_source_destroy (source); +} + +#ifdef G_OS_UNIX + +#include +#include + +static gchar zeros[1024]; + +static gsize +fill_a_pipe (gint fd) +{ + gsize written = 0; + GPollFD pfd; + + pfd.fd = fd; + pfd.events = G_IO_OUT; + while (g_poll (&pfd, 1, 0) == 1) + /* we should never see -1 here */ + written += write (fd, zeros, sizeof zeros); + + return written; +} + +static gboolean +write_bytes (gint fd, + GIOCondition condition, + gpointer user_data) +{ + gssize *to_write = user_data; + gint limit; + + if (*to_write == 0) + return FALSE; + + /* Detect if we run before we should */ + g_assert (*to_write >= 0); + + limit = MIN (*to_write, sizeof zeros); + *to_write -= write (fd, zeros, limit); + + return TRUE; +} + +static gboolean +read_bytes (gint fd, + GIOCondition condition, + gpointer user_data) +{ + static gchar buffer[1024]; + gssize *to_read = user_data; + + *to_read -= read (fd, buffer, sizeof buffer); + + /* The loop will exit when there is nothing else to read, then we will + * use g_source_remove() to destroy this source. + */ + return TRUE; +} + +static void +test_unix_fd (void) +{ + gssize to_write = -1; + gssize to_read; + gint fds[2]; + gint a, b; + gint s; + GSource *source_a; + GSource *source_b; + + s = pipe (fds); + g_assert (s == 0); + + to_read = fill_a_pipe (fds[1]); + /* write at higher priority to keep the pipe full... */ + a = g_unix_fd_add_full (G_PRIORITY_HIGH, fds[1], G_IO_OUT, write_bytes, &to_write, NULL); + source_a = g_source_ref (g_main_context_find_source_by_id (NULL, a)); + /* make sure no 'writes' get dispatched yet */ + while (g_main_context_iteration (NULL, FALSE)); + + to_read += 128 * 1024 * 1024; + to_write = 128 * 1024 * 1024; + b = g_unix_fd_add (fds[0], G_IO_IN, read_bytes, &to_read); + source_b = g_source_ref (g_main_context_find_source_by_id (NULL, b)); + + /* Assuming the kernel isn't internally 'laggy' then there will always + * be either data to read or room in which to write. That will keep + * the loop running until all data has been read and written. + */ + while (TRUE) + { + gssize to_write_was = to_write; + gssize to_read_was = to_read; + + if (!g_main_context_iteration (NULL, FALSE)) + break; + + /* Since the sources are at different priority, only one of them + * should possibly have run. + */ + g_assert (to_write == to_write_was || to_read == to_read_was); + } + + g_assert (to_write == 0); + g_assert (to_read == 0); + + /* 'a' is already removed by itself */ + g_assert (g_source_is_destroyed (source_a)); + g_source_unref (source_a); + g_source_remove (b); + g_assert (g_source_is_destroyed (source_b)); + g_source_unref (source_b); + close (fds[1]); + close (fds[0]); +} + +static void +assert_main_context_state (gint n_to_poll, + ...) +{ + GMainContext *context; + gboolean consumed[10] = { }; + GPollFD poll_fds[10]; + gboolean immediate; + gint max_priority; + gint timeout; + gint n; + gint i, j; + va_list ap; + + context = g_main_context_default (); + + immediate = g_main_context_prepare (context, &max_priority); + g_assert (!immediate); + n = g_main_context_query (context, max_priority, &timeout, poll_fds, 10); + g_assert_cmpint (n, ==, n_to_poll + 1); /* one will be the gwakeup */ + + va_start (ap, n_to_poll); + for (i = 0; i < n_to_poll; i++) + { + gint expected_fd = va_arg (ap, gint); + GIOCondition expected_events = va_arg (ap, GIOCondition); + GIOCondition report_events = va_arg (ap, GIOCondition); + + for (j = 0; j < n; j++) + if (!consumed[j] && poll_fds[j].fd == expected_fd && poll_fds[j].events == expected_events) + { + poll_fds[j].revents = report_events; + consumed[j] = TRUE; + break; + } + + if (j == n) + g_error ("Unable to find fd %d (index %d) with events 0x%x\n", expected_fd, i, (guint) expected_events); + } + va_end (ap); + + /* find the gwakeup, flag as non-ready */ + for (i = 0; i < n; i++) + if (!consumed[i]) + poll_fds[i].revents = 0; + + if (g_main_context_check (context, max_priority, poll_fds, n)) + g_main_context_dispatch (context); +} + +static gboolean +flag_bool (gint fd, + GIOCondition condition, + gpointer user_data) +{ + gboolean *flag = user_data; + + *flag = TRUE; + + return TRUE; +} + +static void +test_unix_fd_source (void) +{ + GSource *out_source; + GSource *in_source; + GSource *source; + gboolean out, in; + gint fds[2]; + gint s; + + assert_main_context_state (0); + + s = pipe (fds); + g_assert (s == 0); + + source = g_unix_fd_source_new (fds[1], G_IO_OUT); + g_source_attach (source, NULL); + + /* Check that a source with no callback gets successfully detached + * with a warning printed. + */ + g_test_expect_message ("GLib", G_LOG_LEVEL_WARNING, "*GUnixFDSource dispatched without callback*"); + while (g_main_context_iteration (NULL, FALSE)); + g_test_assert_expected_messages (); + g_assert (g_source_is_destroyed (source)); + g_source_unref (source); + + out = in = FALSE; + out_source = g_unix_fd_source_new (fds[1], G_IO_OUT); + g_source_set_callback (out_source, (GSourceFunc) flag_bool, &out, NULL); + g_source_attach (out_source, NULL); + assert_main_context_state (1, + fds[1], G_IO_OUT, 0); + g_assert (!in && !out); + + in_source = g_unix_fd_source_new (fds[0], G_IO_IN); + g_source_set_callback (in_source, (GSourceFunc) flag_bool, &in, NULL); + g_source_set_priority (in_source, G_PRIORITY_DEFAULT_IDLE); + g_source_attach (in_source, NULL); + assert_main_context_state (2, + fds[0], G_IO_IN, G_IO_IN, + fds[1], G_IO_OUT, G_IO_OUT); + /* out is higher priority so only it should fire */ + g_assert (!in && out); + + /* raise the priority of the in source to higher than out*/ + in = out = FALSE; + g_source_set_priority (in_source, G_PRIORITY_HIGH); + assert_main_context_state (2, + fds[0], G_IO_IN, G_IO_IN, + fds[1], G_IO_OUT, G_IO_OUT); + g_assert (in && !out); + + /* now, let them be equal */ + in = out = FALSE; + g_source_set_priority (in_source, G_PRIORITY_DEFAULT); + assert_main_context_state (2, + fds[0], G_IO_IN, G_IO_IN, + fds[1], G_IO_OUT, G_IO_OUT); + g_assert (in && out); + + g_source_destroy (out_source); + g_source_destroy (in_source); + close (fds[1]); + close (fds[0]); +} + +typedef struct +{ + GSource parent; + gboolean flagged; +} FlagSource; + +static gboolean +return_true (GSource *source, GSourceFunc callback, gpointer user_data) +{ + FlagSource *flag_source = (FlagSource *) source; + + flag_source->flagged = TRUE; + + return TRUE; +} + +#define assert_flagged(s) g_assert (((FlagSource *) (s))->flagged); +#define assert_not_flagged(s) g_assert (!((FlagSource *) (s))->flagged); +#define clear_flag(s) ((FlagSource *) (s))->flagged = 0 + +static void +test_source_unix_fd_api (void) +{ + GSourceFuncs no_funcs = { + NULL, NULL, return_true + }; + GSource *source_a; + GSource *source_b; + gpointer tag1, tag2; + gint fds_a[2]; + gint fds_b[2]; + + pipe (fds_a); + pipe (fds_b); + + source_a = g_source_new (&no_funcs, sizeof (FlagSource)); + source_b = g_source_new (&no_funcs, sizeof (FlagSource)); + + /* attach a source with more than one fd */ + g_source_add_unix_fd (source_a, fds_a[0], G_IO_IN); + g_source_add_unix_fd (source_a, fds_a[1], G_IO_OUT); + g_source_attach (source_a, NULL); + assert_main_context_state (2, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, 0); + assert_not_flagged (source_a); + + /* attach a higher priority source with no fds */ + g_source_set_priority (source_b, G_PRIORITY_HIGH); + g_source_attach (source_b, NULL); + assert_main_context_state (2, + fds_a[0], G_IO_IN, G_IO_IN, + fds_a[1], G_IO_OUT, 0); + assert_flagged (source_a); + assert_not_flagged (source_b); + clear_flag (source_a); + + /* add some fds to the second source, while attached */ + tag1 = g_source_add_unix_fd (source_b, fds_b[0], G_IO_IN); + tag2 = g_source_add_unix_fd (source_b, fds_b[1], G_IO_OUT); + assert_main_context_state (4, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, G_IO_OUT, + fds_b[0], G_IO_IN, 0, + fds_b[1], G_IO_OUT, G_IO_OUT); + /* only 'b' (higher priority) should have dispatched */ + assert_not_flagged (source_a); + assert_flagged (source_b); + clear_flag (source_b); + + /* change our events on b to the same as they were before */ + g_source_modify_unix_fd (source_b, tag1, G_IO_IN); + g_source_modify_unix_fd (source_b, tag2, G_IO_OUT); + assert_main_context_state (4, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, G_IO_OUT, + fds_b[0], G_IO_IN, 0, + fds_b[1], G_IO_OUT, G_IO_OUT); + assert_not_flagged (source_a); + assert_flagged (source_b); + clear_flag (source_b); + + /* now reverse them */ + g_source_modify_unix_fd (source_b, tag1, G_IO_OUT); + g_source_modify_unix_fd (source_b, tag2, G_IO_IN); + assert_main_context_state (4, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, G_IO_OUT, + fds_b[0], G_IO_OUT, 0, + fds_b[1], G_IO_IN, 0); + /* 'b' had no events, so 'a' can go this time */ + assert_flagged (source_a); + assert_not_flagged (source_b); + clear_flag (source_a); + + /* remove one of the fds from 'b' */ + g_source_remove_unix_fd (source_b, tag1); + assert_main_context_state (3, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, 0, + fds_b[1], G_IO_IN, 0); + assert_not_flagged (source_a); + assert_not_flagged (source_b); + + /* remove the other */ + g_source_remove_unix_fd (source_b, tag2); + assert_main_context_state (2, + fds_a[0], G_IO_IN, 0, + fds_a[1], G_IO_OUT, 0); + assert_not_flagged (source_a); + assert_not_flagged (source_b); + + /* destroy the sources */ + g_source_destroy (source_a); + g_source_destroy (source_b); + assert_main_context_state (0); + + g_source_unref (source_a); + g_source_unref (source_b); + close (fds_a[0]); + close (fds_a[1]); + close (fds_b[0]); + close (fds_b[1]); +} + +#endif + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/maincontext/basic", test_maincontext_basic); + g_test_add_func ("/mainloop/basic", test_mainloop_basic); + g_test_add_func ("/mainloop/timeouts", test_timeouts); + g_test_add_func ("/mainloop/priorities", test_priorities); + g_test_add_func ("/mainloop/invoke", test_invoke); + g_test_add_func ("/mainloop/child_sources", test_child_sources); + g_test_add_func ("/mainloop/recursive_child_sources", test_recursive_child_sources); + g_test_add_func ("/mainloop/swapping_child_sources", test_swapping_child_sources); + g_test_add_func ("/mainloop/source_time", test_source_time); + g_test_add_func ("/mainloop/overflow", test_mainloop_overflow); + g_test_add_func ("/mainloop/ready-time", test_ready_time); +#ifdef G_OS_UNIX + g_test_add_func ("/mainloop/unix-fd", test_unix_fd); + g_test_add_func ("/mainloop/unix-fd-source", test_unix_fd_source); + g_test_add_func ("/mainloop/source-unix-fd-api", test_source_unix_fd_api); +#endif + + return g_test_run (); +} diff --git a/glib/tests/mappedfile.c b/glib/tests/mappedfile.c new file mode 100644 index 0000000..8d5258d --- /dev/null +++ b/glib/tests/mappedfile.c @@ -0,0 +1,187 @@ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include + +static void +test_basic (void) +{ + GMappedFile *file; + GError *error; + + error = NULL; + file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error); + g_assert_no_error (error); + + g_mapped_file_ref (file); + g_mapped_file_unref (file); + + g_mapped_file_unref (file); +} + +static void +test_empty (void) +{ + GMappedFile *file; + GError *error; + + error = NULL; + file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error); + g_assert_no_error (error); + + g_assert (g_mapped_file_get_contents (file) == NULL); + + g_mapped_file_free (file); +} + +#ifdef G_OS_UNIX +static void +test_device (void) +{ + GError *error = NULL; + GMappedFile *file; + + file = g_mapped_file_new ("/dev/null", FALSE, &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL); + g_assert (file == NULL); + g_error_free (error); +} +#endif + +static void +test_nonexisting (void) +{ + GMappedFile *file; + GError *error; + + error = NULL; + file = g_mapped_file_new ("no-such-file", FALSE, &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + g_clear_error (&error); + g_assert (file == NULL); +} + +static void +test_writable (void) +{ + GMappedFile *file; + GError *error; + gchar *contents; + const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM"; + const gchar *new = "abcdefghijklmnopqrstuvxyz"; + + if (access (SRCDIR "/4096-random-bytes", W_OK) != 0) + { + g_test_message ("Skipping writable mapping test"); + return; + } + + error = NULL; + file = g_mapped_file_new (SRCDIR "/4096-random-bytes", TRUE, &error); + g_assert_no_error (error); + + contents = g_mapped_file_get_contents (file); + g_assert (strncmp (contents, old, strlen (old)) == 0); + + memcpy (contents, new, strlen (new)); + g_assert (strncmp (contents, new, strlen (new)) == 0); + + g_mapped_file_free (file); + + error = NULL; + file = g_mapped_file_new (SRCDIR "/4096-random-bytes", TRUE, &error); + g_assert_no_error (error); + + contents = g_mapped_file_get_contents (file); + g_assert (strncmp (contents, old, strlen (old)) == 0); + + g_mapped_file_free (file); +} + +static void +test_writable_fd (void) +{ + GMappedFile *file; + GError *error; + gchar *contents; + const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM"; + const gchar *new = "abcdefghijklmnopqrstuvxyz"; + int fd; + + if (access (SRCDIR "/4096-random-bytes", W_OK) != 0) + { + g_test_message ("Skipping writable mapping test"); + return; + } + + error = NULL; + fd = g_open (SRCDIR "/4096-random-bytes", O_RDWR, 0); + g_assert (fd != -1); + file = g_mapped_file_new_from_fd (fd, TRUE, &error); + g_assert_no_error (error); + + contents = g_mapped_file_get_contents (file); + g_assert (strncmp (contents, old, strlen (old)) == 0); + + memcpy (contents, new, strlen (new)); + g_assert (strncmp (contents, new, strlen (new)) == 0); + + g_mapped_file_free (file); + close (fd); + + error = NULL; + fd = g_open (SRCDIR "/4096-random-bytes", O_RDWR, 0); + g_assert (fd != -1); + file = g_mapped_file_new_from_fd (fd, TRUE, &error); + g_assert_no_error (error); + + contents = g_mapped_file_get_contents (file); + g_assert (strncmp (contents, old, strlen (old)) == 0); + + g_mapped_file_free (file); + +} + +static void +test_gbytes (void) +{ + GMappedFile *file; + GBytes *bytes; + GError *error; + + error = NULL; + file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error); + g_assert_no_error (error); + + bytes = g_mapped_file_get_bytes (file); + g_mapped_file_unref (file); + + g_assert_cmpint (g_bytes_get_size (bytes), ==, 0); + g_bytes_unref (bytes); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/mappedfile/basic", test_basic); + g_test_add_func ("/mappedfile/empty", test_empty); +#ifdef G_OS_UNIX + g_test_add_func ("/mappedfile/device", test_device); +#endif + g_test_add_func ("/mappedfile/nonexisting", test_nonexisting); + g_test_add_func ("/mappedfile/writable", test_writable); + g_test_add_func ("/mappedfile/writable_fd", test_writable_fd); + g_test_add_func ("/mappedfile/gbytes", test_gbytes); + + return g_test_run (); +} diff --git a/glib/tests/markup-collect.c b/glib/tests/markup-collect.c new file mode 100644 index 0000000..e6422ff --- /dev/null +++ b/glib/tests/markup-collect.c @@ -0,0 +1,234 @@ +/* + * 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 +#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'" } +}; + +static void +test_collect (gconstpointer d) +{ + const struct test *test = d; + + 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, + test->document, + -1, &error); + if (result) + result = g_markup_parse_context_end_parse (ctx, &error); + + if (result) + { + g_assert_no_error (error); + g_assert_cmpint (test->error_code, ==, 0); + g_assert_cmpstr (test->result, ==, string->str); + } + else + { + g_assert_error (error, G_MARKUP_ERROR, test->error_code); + } + + g_markup_parse_context_free (ctx); + g_string_free (string, TRUE); + g_clear_error (&error); +} + +#define XML "" + +static void +start_element (GMarkupParseContext *context, + const gchar *element_name, + const gchar **attribute_names, + const gchar **attribute_values, + gpointer user_data, + GError **error) +{ + /* Omitting "c" attribute intentionally to trigger crash. */ + g_markup_collect_attributes (element_name, + attribute_names, + attribute_values, + error, + G_MARKUP_COLLECT_STRING, "a", NULL, + G_MARKUP_COLLECT_STRING, "b", NULL, + G_MARKUP_COLLECT_INVALID); +} + +static GMarkupParser cleanup_parser = { + start_element +}; + +static void +test_cleanup (void) +{ + GMarkupParseContext *context; + + if (!g_test_undefined ()) + return; + + context = g_markup_parse_context_new (&cleanup_parser, 0, NULL, NULL); + g_markup_parse_context_parse (context, XML, -1, NULL); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "g_markup_parse_context_end_parse: assertion `context->state != STATE_ERROR' failed"); + g_markup_parse_context_end_parse (context, NULL); + g_test_assert_expected_messages (); + + g_markup_parse_context_free (context); +} + +int +main (int argc, char **argv) +{ + int i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + path = g_strdup_printf ("/markup/collect/%d", i); + g_test_add_data_func (path, &tests[i], test_collect); + g_free (path); + } + + g_test_add_func ("/markup/collect/cleanup", test_cleanup); + + return g_test_run (); +} diff --git a/glib/tests/markup-escape.c b/glib/tests/markup-escape.c new file mode 100644 index 0000000..b2de289 --- /dev/null +++ b/glib/tests/markup-escape.c @@ -0,0 +1,160 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include + +typedef struct _EscapeTest EscapeTest; + +struct _EscapeTest +{ + const gchar *original; + const gchar *expected; +}; + +static EscapeTest escape_tests[] = +{ + { "&", "&" }, + { "<", "<" }, + { ">", ">" }, + { "'", "'" }, + { "\"", """ }, + { "", "" }, + { "A", "A" }, + { "A&", "A&" }, + { "&A", "&A" }, + { "A&A", "A&A" }, + { "&&A", "&&A" }, + { "A&&", "A&&" }, + { "A&&A", "A&&A" }, + { "A&A&A", "A&A&A" }, + { "AA", "A&#23;A" }, + { "A A", "A&#xa;A" } +}; + +static void +escape_test (gconstpointer d) +{ + const EscapeTest *test = d; + gchar *result; + + result = g_markup_escape_text (test->original, -1); + + g_assert_cmpstr (result, ==, test->expected); + + g_free (result); +} + +typedef struct _UnicharTest UnicharTest; + +struct _UnicharTest +{ + gunichar c; + gboolean entity; +}; + +static UnicharTest unichar_tests[] = +{ + { 0x1, TRUE }, + { 0x8, TRUE }, + { 0x9, FALSE }, + { 0xa, FALSE }, + { 0xb, TRUE }, + { 0xc, TRUE }, + { 0xd, FALSE }, + { 0xe, TRUE }, + { 0x1f, TRUE }, + { 0x20, FALSE }, + { 0x7e, FALSE }, + { 0x7f, TRUE }, + { 0x84, TRUE }, + { 0x85, FALSE }, + { 0x86, TRUE }, + { 0x9f, TRUE }, + { 0xa0, FALSE } +}; + +static void +unichar_test (gconstpointer d) +{ + const UnicharTest *test = d; + EscapeTest t; + gint len; + gchar outbuf[7], expected[12]; + + len = g_unichar_to_utf8 (test->c, outbuf); + outbuf[len] = 0; + + if (test->entity) + g_snprintf (expected, 12, "&#x%x;", test->c); + else + strcpy (expected, outbuf); + + t.original = outbuf; + t.expected = expected; + escape_test (&t); +} + +G_GNUC_PRINTF(1, 3) +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); + + g_assert_cmpstr (result, ==, expected); + + g_free (result); +} + +static void +format_test (void) +{ + 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."); +} + +int main (int argc, char **argv) +{ + gint i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (escape_tests); i++) + { + path = g_strdup_printf ("/markup/escape-text/%d", i); + g_test_add_data_func (path, &escape_tests[i], escape_test); + g_free (path); + } + + for (i = 0; i < G_N_ELEMENTS (unichar_tests); i++) + { + path = g_strdup_printf ("/markup/escape-unichar/%d", i); + g_test_add_data_func (path, &unichar_tests[i], unichar_test); + g_free (path); + } + + g_test_add_func ("/markup/format", format_test); + + return g_test_run (); +} diff --git a/glib/tests/markup-parse.c b/glib/tests/markup-parse.c new file mode 100644 index 0000000..4c7445e --- /dev/null +++ b/glib/tests/markup-parse.c @@ -0,0 +1,315 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include +#include +#include + +#ifndef SRCDIR +#define SRCDIR "." +#endif + +static int depth = 0; +static GString *string; + +static void +indent (int extra) +{ + int i = 0; + while (i < depth) + { + g_string_append (string, " "); + ++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); + g_string_append_printf (string, "ELEMENT '%s'\n", element_name); + + i = 0; + while (attribute_names[i] != NULL) + { + indent (1); + + g_string_append_printf (string, "%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); + g_string_append_printf (string, "END '%s'\n", element_name); + } + +static void +text_handler (GMarkupParseContext *context, + const gchar *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + indent (0); + g_string_append_printf (string, "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); + + g_string_append_printf (string, "PASS '%.*s'\n", (int)text_len, passthrough_text); +} + +static void +error_handler (GMarkupParseContext *context, + GError *error, + gpointer user_data) +{ + g_string_append_printf (string, "ERROR %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; + gint line, col; + + 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); + g_assert (g_markup_parse_context_get_user_data (context) == NULL); + g_markup_parse_context_get_position (context, &line, &col); + g_assert (line == 1 && col == 1); + + if (!g_markup_parse_context_parse (context, contents, length, NULL)) + { + g_markup_parse_context_free (context); + g_free (contents); + return 1; + } + + if (!g_markup_parse_context_end_parse (context, NULL)) + { + g_markup_parse_context_free (context); + g_free (contents); + return 1; + } + + g_markup_parse_context_free (context); + + /* A byte at a time */ + if (test_in_chunks (contents, length, 1) != 0) + { + g_free (contents); + return 1; + } + + /* 2 bytes */ + if (test_in_chunks (contents, length, 2) != 0) + { + g_free (contents); + return 1; + } + + /*5 bytes */ + if (test_in_chunks (contents, length, 5) != 0) + { + g_free (contents); + return 1; + } + + /* 12 bytes */ + if (test_in_chunks (contents, length, 12) != 0) + { + g_free (contents); + return 1; + } + + /* 1024 bytes */ + if (test_in_chunks (contents, length, 1024) != 0) + { + g_free (contents); + return 1; + } + + g_free (contents); + + return 0; +} + +static gchar * +get_expected_filename (const gchar *filename) +{ + gchar *f, *p, *expected; + + f = g_strdup (filename); + p = strstr (f, ".gmarkup"); + if (p) + *p = 0; + expected = g_strconcat (f, ".expected", NULL); + g_free (f); + + return expected; +} + +static void +test_parse (gconstpointer d) +{ + const gchar *filename = d; + gchar *expected_file; + gchar *expected; + gint res; + + depth = 0; + string = g_string_sized_new (0); + + res = test_file (filename); + + if (strstr (filename, "valid")) + g_assert_cmpint (res, ==, 0); + else + g_assert_cmpint (res, ==, 1); + + expected_file = get_expected_filename (filename); + if (g_file_get_contents (expected_file, &expected, NULL, NULL)) + { + g_assert_cmpstr (string->str, ==, expected); + g_free (expected); + } + g_free (expected_file); + + g_string_free (string, TRUE); +} + +int +main (int argc, char *argv[]) +{ + GDir *dir; + GError *error; + const gchar *name; + gchar *path; + + g_setenv ("LANG", "en_US.utf-8", TRUE); + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + /* allow to easily generate expected output for new test cases */ + if (argc > 1) + { + string = g_string_sized_new (0); + test_file (argv[1]); + g_print ("%s", string->str); + return 0; + } + + error = NULL; + dir = g_dir_open (SRCDIR "/markups", 0, &error); + g_assert_no_error (error); + while ((name = g_dir_read_name (dir)) != NULL) + { + if (strstr (name, "expected")) + continue; + + path = g_strdup_printf ("/markup/parse/%s", name); + g_test_add_data_func_full (path, g_build_filename (SRCDIR, "markups", name, NULL), + test_parse, g_free); + g_free (path); + } + g_dir_close (dir); + + return g_test_run (); +} + diff --git a/glib/tests/markup-subparser.c b/glib/tests/markup-subparser.c new file mode 100644 index 0000000..3218880 --- /dev/null +++ b/glib/tests/markup-subparser.c @@ -0,0 +1,380 @@ +/* + * 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, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "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, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "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 NULL; + } + + result = string->str; + + g_string_free (string, FALSE); + strings_allocated--; + + if (result == NULL || result[0] == '\0') + { + g_free (result); + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "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; + +static 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/markups/fail-1.expected b/glib/tests/markups/fail-1.expected new file mode 100644 index 0000000..ccd6219 --- /dev/null +++ b/glib/tests/markups/fail-1.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 1: Document was empty or contained only whitespace diff --git a/glib/tests/markups/fail-1.gmarkup b/glib/tests/markups/fail-1.gmarkup new file mode 100644 index 0000000..e69de29 diff --git a/glib/tests/markups/fail-10.expected b/glib/tests/markups/fail-10.expected new file mode 100644 index 0000000..7761a22 --- /dev/null +++ b/glib/tests/markups/fail-10.expected @@ -0,0 +1,4 @@ +ELEMENT 'foo' + TEXT ' +' +ERROR Error on line 2 char 8: Element '|foo' was closed, but the currently open element is 'foo' diff --git a/glib/tests/markups/fail-10.gmarkup b/glib/tests/markups/fail-10.gmarkup new file mode 100644 index 0000000..fe16558 --- /dev/null +++ b/glib/tests/markups/fail-10.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/glib/tests/markups/fail-11.expected b/glib/tests/markups/fail-11.expected new file mode 100644 index 0000000..3a7173d --- /dev/null +++ b/glib/tests/markups/fail-11.expected @@ -0,0 +1,7 @@ +ELEMENT 'foo' + TEXT ' +' + ELEMENT 'bar' + TEXT ' +' +ERROR Error on line 3 char 7: Element 'foo' was closed, but the currently open element is 'bar' diff --git a/glib/tests/markups/fail-11.gmarkup b/glib/tests/markups/fail-11.gmarkup new file mode 100644 index 0000000..216f40c --- /dev/null +++ b/glib/tests/markups/fail-11.gmarkup @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/glib/tests/markups/fail-12.expected b/glib/tests/markups/fail-12.expected new file mode 100644 index 0000000..0aab7b5 --- /dev/null +++ b/glib/tests/markups/fail-12.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 6: Element 'foo' was closed, no element is currently open diff --git a/glib/tests/markups/fail-12.gmarkup b/glib/tests/markups/fail-12.gmarkup new file mode 100644 index 0000000..a640299 --- /dev/null +++ b/glib/tests/markups/fail-12.gmarkup @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/glib/tests/markups/fail-13.expected b/glib/tests/markups/fail-13.expected new file mode 100644 index 0000000..60157fa --- /dev/null +++ b/glib/tests/markups/fail-13.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 7: Element 'foo|' was closed, no element is currently open diff --git a/glib/tests/markups/fail-13.gmarkup b/glib/tests/markups/fail-13.gmarkup new file mode 100644 index 0000000..a719288 --- /dev/null +++ b/glib/tests/markups/fail-13.gmarkup @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/glib/tests/markups/fail-14.expected b/glib/tests/markups/fail-14.expected new file mode 100644 index 0000000..47e6847 --- /dev/null +++ b/glib/tests/markups/fail-14.expected @@ -0,0 +1,4 @@ +ELEMENT 'foo' + TEXT ' +' +ERROR Error on line 2 char 3: Document ended unexpectedly just after an open angle bracket '<' diff --git a/glib/tests/markups/fail-14.gmarkup b/glib/tests/markups/fail-14.gmarkup new file mode 100644 index 0000000..ed52a60 --- /dev/null +++ b/glib/tests/markups/fail-14.gmarkup @@ -0,0 +1,2 @@ + +< \ No newline at end of file diff --git a/glib/tests/markups/fail-15.expected b/glib/tests/markups/fail-15.expected new file mode 100644 index 0000000..380ab74 --- /dev/null +++ b/glib/tests/markups/fail-15.expected @@ -0,0 +1,8 @@ +ELEMENT 'foo' + TEXT ' +' + ELEMENT 'bar' + TEXT ' +' + END 'bar' +ERROR Error on line 3 char 8: Document ended unexpectedly with elements still open - 'foo' was the last element opened diff --git a/glib/tests/markups/fail-15.gmarkup b/glib/tests/markups/fail-15.gmarkup new file mode 100644 index 0000000..c3b59e0 --- /dev/null +++ b/glib/tests/markups/fail-15.gmarkup @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/glib/tests/markups/fail-16.expected b/glib/tests/markups/fail-16.expected new file mode 100644 index 0000000..a9f1f82 --- /dev/null +++ b/glib/tests/markups/fail-16.expected @@ -0,0 +1,2 @@ +ELEMENT 'foo' +ERROR Error on line 1 char 6: Document ended unexpectedly, expected to see a close angle bracket ending the tag diff --git a/glib/tests/markups/fail-16.gmarkup b/glib/tests/markups/fail-16.gmarkup new file mode 100644 index 0000000..20f0148 --- /dev/null +++ b/glib/tests/markups/fail-16.gmarkup @@ -0,0 +1 @@ +) diff --git a/glib/tests/markups/fail-2.gmarkup b/glib/tests/markups/fail-2.gmarkup new file mode 100644 index 0000000..c7e4a54 --- /dev/null +++ b/glib/tests/markups/fail-2.gmarkup @@ -0,0 +1 @@ +±Î½èªž diff --git a/glib/tests/markups/fail-20.expected b/glib/tests/markups/fail-20.expected new file mode 100644 index 0000000..0dc081b --- /dev/null +++ b/glib/tests/markups/fail-20.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 10: Document ended unexpectedly after the equals sign following an attribute name; no attribute value diff --git a/glib/tests/markups/fail-20.gmarkup b/glib/tests/markups/fail-20.gmarkup new file mode 100644 index 0000000..39fcbad --- /dev/null +++ b/glib/tests/markups/fail-20.gmarkup @@ -0,0 +1 @@ + diff --git a/glib/tests/markups/fail-43.expected b/glib/tests/markups/fail-43.expected new file mode 100644 index 0000000..57a7b02 --- /dev/null +++ b/glib/tests/markups/fail-43.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 10: Odd character '≈', expected a '=' after attribute name 'bar' of element 'foo' diff --git a/glib/tests/markups/fail-43.gmarkup b/glib/tests/markups/fail-43.gmarkup new file mode 100644 index 0000000..c247c71 --- /dev/null +++ b/glib/tests/markups/fail-43.gmarkup @@ -0,0 +1 @@ + diff --git a/glib/tests/markups/fail-44.expected b/glib/tests/markups/fail-44.expected new file mode 100644 index 0000000..2548050 --- /dev/null +++ b/glib/tests/markups/fail-44.expected @@ -0,0 +1,3 @@ +ELEMENT 'foo' +END 'foo' +ERROR Error on line 1 char 6: Odd character '≻', expected a '>' character to end the empty-element tag 'foo' diff --git a/glib/tests/markups/fail-44.gmarkup b/glib/tests/markups/fail-44.gmarkup new file mode 100644 index 0000000..f6217db --- /dev/null +++ b/glib/tests/markups/fail-44.gmarkup @@ -0,0 +1 @@ +' diff --git a/glib/tests/markups/fail-45.gmarkup b/glib/tests/markups/fail-45.gmarkup new file mode 100644 index 0000000..4183291 --- /dev/null +++ b/glib/tests/markups/fail-45.gmarkup @@ -0,0 +1 @@ + +abc diff --git a/glib/tests/markups/fail-47.expected b/glib/tests/markups/fail-47.expected new file mode 100644 index 0000000..89dc4b4 --- /dev/null +++ b/glib/tests/markups/fail-47.expected @@ -0,0 +1 @@ +ERROR Error on line 1: Failed to parse '', which should have been a digit inside a character reference (ê for example) - perhaps the digit is too large diff --git a/glib/tests/markups/fail-47.gmarkup b/glib/tests/markups/fail-47.gmarkup new file mode 100644 index 0000000..bbe8179 --- /dev/null +++ b/glib/tests/markups/fail-47.gmarkup @@ -0,0 +1 @@ + diff --git a/glib/tests/markups/fail-48.expected b/glib/tests/markups/fail-48.expected new file mode 100644 index 0000000..e5fa740 --- /dev/null +++ b/glib/tests/markups/fail-48.expected @@ -0,0 +1 @@ +ERROR Error on line 2 char 2: Odd character '>', expected a '=' after attribute name 'bar' of element 'fail' diff --git a/glib/tests/markups/fail-48.gmarkup b/glib/tests/markups/fail-48.gmarkup new file mode 100644 index 0000000..fcbeab6 --- /dev/null +++ b/glib/tests/markups/fail-48.gmarkup @@ -0,0 +1,2 @@ + diff --git a/glib/tests/markups/fail-49.expected b/glib/tests/markups/fail-49.expected new file mode 100644 index 0000000..fc3bacb --- /dev/null +++ b/glib/tests/markups/fail-49.expected @@ -0,0 +1,3 @@ +ELEMENT 'foo' + TEXT '' +ERROR Error on line 2 char 2: Document ended unexpectedly inside the close tag for element 'foo' diff --git a/glib/tests/markups/fail-49.gmarkup b/glib/tests/markups/fail-49.gmarkup new file mode 100644 index 0000000..5e1e3bb --- /dev/null +++ b/glib/tests/markups/fail-49.gmarkup @@ -0,0 +1 @@ + + diff --git a/glib/tests/markups/fail-6.expected b/glib/tests/markups/fail-6.expected new file mode 100644 index 0000000..b722468 --- /dev/null +++ b/glib/tests/markups/fail-6.expected @@ -0,0 +1 @@ +ERROR Error on line 2 char 1: 'foo|' is not a valid name: '|' diff --git a/glib/tests/markups/fail-6.gmarkup b/glib/tests/markups/fail-6.gmarkup new file mode 100644 index 0000000..4c63568 --- /dev/null +++ b/glib/tests/markups/fail-6.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/glib/tests/markups/fail-7.expected b/glib/tests/markups/fail-7.expected new file mode 100644 index 0000000..40b61c1 --- /dev/null +++ b/glib/tests/markups/fail-7.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 15: 'bar}"baz"' is not a valid name: '}' diff --git a/glib/tests/markups/fail-7.gmarkup b/glib/tests/markups/fail-7.gmarkup new file mode 100644 index 0000000..5585bd6 --- /dev/null +++ b/glib/tests/markups/fail-7.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/glib/tests/markups/fail-8.expected b/glib/tests/markups/fail-8.expected new file mode 100644 index 0000000..2448220 --- /dev/null +++ b/glib/tests/markups/fail-8.expected @@ -0,0 +1,3 @@ +ELEMENT 'foo' +END 'foo' +ERROR Error on line 1 char 6: Odd character '}', expected a '>' character to end the empty-element tag 'foo' diff --git a/glib/tests/markups/fail-8.gmarkup b/glib/tests/markups/fail-8.gmarkup new file mode 100644 index 0000000..b355951 --- /dev/null +++ b/glib/tests/markups/fail-8.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/glib/tests/markups/fail-9.expected b/glib/tests/markups/fail-9.expected new file mode 100644 index 0000000..9994eb3 --- /dev/null +++ b/glib/tests/markups/fail-9.expected @@ -0,0 +1 @@ +ERROR Error on line 1 char 10: Odd character '{', expected an open quote mark after the equals sign when giving value for attribute 'bar' of element 'foo' diff --git a/glib/tests/markups/fail-9.gmarkup b/glib/tests/markups/fail-9.gmarkup new file mode 100644 index 0000000..edd5596 --- /dev/null +++ b/glib/tests/markups/fail-9.gmarkup @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/glib/tests/markups/valid-1.expected b/glib/tests/markups/valid-1.expected new file mode 100644 index 0000000..8b6cdd7 --- /dev/null +++ b/glib/tests/markups/valid-1.expected @@ -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 + + +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/glib/tests/markups/valid-10.expected b/glib/tests/markups/valid-10.expected new file mode 100644 index 0000000..e7b8af8 --- /dev/null +++ b/glib/tests/markups/valid-10.expected @@ -0,0 +1,6 @@ +ELEMENT 'foo' +bar="baz" +bar2="baz2" +bar3="baz3" + TEXT 'data' +END 'foo' diff --git a/glib/tests/markups/valid-10.gmarkup b/glib/tests/markups/valid-10.gmarkup new file mode 100644 index 0000000..cbeb68e --- /dev/null +++ b/glib/tests/markups/valid-10.gmarkup @@ -0,0 +1,6 @@ +data diff --git a/glib/tests/markups/valid-11.expected b/glib/tests/markups/valid-11.expected new file mode 100644 index 0000000..7810394 --- /dev/null +++ b/glib/tests/markups/valid-11.expected @@ -0,0 +1,3 @@ +ELEMENT 'foo' + TEXT 'data' +END 'foo' diff --git a/glib/tests/markups/valid-11.gmarkup b/glib/tests/markups/valid-11.gmarkup new file mode 100644 index 0000000..fe1cc4e --- /dev/null +++ b/glib/tests/markups/valid-11.gmarkup @@ -0,0 +1,2 @@ +data diff --git a/glib/tests/markups/valid-12.expected b/glib/tests/markups/valid-12.expected new file mode 100644 index 0000000..49e2aeb --- /dev/null +++ b/glib/tests/markups/valid-12.expected @@ -0,0 +1,5 @@ +ELEMENT 'abcäöü' + TEXT ' +abcäöü +' +END 'abcäöü' diff --git a/glib/tests/markups/valid-12.gmarkup b/glib/tests/markups/valid-12.gmarkup new file mode 100644 index 0000000..34a6dec --- /dev/null +++ b/glib/tests/markups/valid-12.gmarkup @@ -0,0 +1,3 @@ + +abcäöü + diff --git a/glib/tests/markups/valid-13.expected b/glib/tests/markups/valid-13.expected new file mode 100644 index 0000000..84f0e71 --- /dev/null +++ b/glib/tests/markups/valid-13.expected @@ -0,0 +1,4 @@ +ELEMENT 'foo' +bar="a b c d e𝐀" + TEXT '' +END 'foo' diff --git a/glib/tests/markups/valid-13.gmarkup b/glib/tests/markups/valid-13.gmarkup new file mode 100644 index 0000000..70afdb7 --- /dev/null +++ b/glib/tests/markups/valid-13.gmarkup @@ -0,0 +1,3 @@ + diff --git a/glib/tests/markups/valid-14.expected b/glib/tests/markups/valid-14.expected new file mode 100644 index 0000000..cea1fdd --- /dev/null +++ b/glib/tests/markups/valid-14.expected @@ -0,0 +1,30 @@ +ELEMENT 'foo' + TEXT ' +' + ELEMENT 'bar' + TEXT ' +/* 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. + */ +' + END 'bar' + TEXT ' +' +END 'foo' diff --git a/glib/tests/markups/valid-14.gmarkup b/glib/tests/markups/valid-14.gmarkup new file mode 100644 index 0000000..f999a34 --- /dev/null +++ b/glib/tests/markups/valid-14.gmarkup @@ -0,0 +1,24 @@ + + +/* gmarkup.c - Simple XML-like parser + * + * Copyright 2000, 2003 Red Hat, Inc. + * Copyright 2007, 2008 Ryan Lortie <desrt@desrt.ca> + * + * 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. + */ + + diff --git a/glib/tests/markups/valid-15.expected b/glib/tests/markups/valid-15.expected new file mode 100644 index 0000000..559c949 --- /dev/null +++ b/glib/tests/markups/valid-15.expected @@ -0,0 +1,3 @@ +ELEMENT 'test' + TEXT 'bla' +END 'test' diff --git a/glib/tests/markups/valid-15.gmarkup b/glib/tests/markups/valid-15.gmarkup new file mode 100644 index 0000000..ba13597 --- /dev/null +++ b/glib/tests/markups/valid-15.gmarkup @@ -0,0 +1 @@ +<bla>bla diff --git a/glib/tests/markups/valid-2.expected b/glib/tests/markups/valid-2.expected new file mode 100644 index 0000000..82a531a --- /dev/null +++ b/glib/tests/markups/valid-2.expected @@ -0,0 +1,51 @@ +ELEMENT 'foobar' + TEXT ' +Παν語 + +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 -- 元氣 開發 + + +' +END 'foobar' diff --git a/glib/tests/markups/valid-2.gmarkup b/glib/tests/markups/valid-2.gmarkup new file mode 100644 index 0000000..4a3fa69 --- /dev/null +++ b/glib/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/glib/tests/markups/valid-3.expected b/glib/tests/markups/valid-3.expected new file mode 100644 index 0000000..9b44653 --- /dev/null +++ b/glib/tests/markups/valid-3.expected @@ -0,0 +1,61 @@ +ELEMENT 'foo' + TEXT ' +' + ELEMENT 'bar' + a="1" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + c="3" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + c="3" + d="4" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + c="3" + d="4" + e="5" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + c="3" + d="4" + e="5" + f="6" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + b="2" + c="3" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="1" + END 'bar' + TEXT ' +' +END 'foo' diff --git a/glib/tests/markups/valid-3.gmarkup b/glib/tests/markups/valid-3.gmarkup new file mode 100644 index 0000000..aed984e --- /dev/null +++ b/glib/tests/markups/valid-3.gmarkup @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/glib/tests/markups/valid-4.expected b/glib/tests/markups/valid-4.expected new file mode 100644 index 0000000..395f453 --- /dev/null +++ b/glib/tests/markups/valid-4.expected @@ -0,0 +1,29 @@ +ELEMENT 'foo' + TEXT ' +' + ELEMENT 'bar' + a="1" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="2" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="3"" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="4'" + END 'bar' + TEXT ' +' + ELEMENT 'bar' + a="5''''" + END 'bar' + TEXT ' +' +END 'foo' diff --git a/glib/tests/markups/valid-4.gmarkup b/glib/tests/markups/valid-4.gmarkup new file mode 100644 index 0000000..2036162 --- /dev/null +++ b/glib/tests/markups/valid-4.gmarkup @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/glib/tests/markups/valid-5.expected b/glib/tests/markups/valid-5.expected new file mode 100644 index 0000000..12d05c8 --- /dev/null +++ b/glib/tests/markups/valid-5.expected @@ -0,0 +1,4 @@ +PASS '' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/glib/tests/markups/valid-5.gmarkup b/glib/tests/markups/valid-5.gmarkup new file mode 100644 index 0000000..3b861de --- /dev/null +++ b/glib/tests/markups/valid-5.gmarkup @@ -0,0 +1,2 @@ + + diff --git a/glib/tests/markups/valid-6.expected b/glib/tests/markups/valid-6.expected new file mode 100644 index 0000000..bfb41ce --- /dev/null +++ b/glib/tests/markups/valid-6.expected @@ -0,0 +1,6 @@ +PASS ' +]>' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/glib/tests/markups/valid-6.gmarkup b/glib/tests/markups/valid-6.gmarkup new file mode 100644 index 0000000..d7c065a --- /dev/null +++ b/glib/tests/markups/valid-6.gmarkup @@ -0,0 +1,4 @@ + +]> + diff --git a/glib/tests/markups/valid-7.expected b/glib/tests/markups/valid-7.expected new file mode 100644 index 0000000..2fe1975 --- /dev/null +++ b/glib/tests/markups/valid-7.expected @@ -0,0 +1,4 @@ +PASS '' +ELEMENT 'foo' + TEXT '' +END 'foo' diff --git a/glib/tests/markups/valid-7.gmarkup b/glib/tests/markups/valid-7.gmarkup new file mode 100644 index 0000000..832445d --- /dev/null +++ b/glib/tests/markups/valid-7.gmarkup @@ -0,0 +1,2 @@ + + diff --git a/glib/tests/markups/valid-8.expected b/glib/tests/markups/valid-8.expected new file mode 100644 index 0000000..5bbda04 --- /dev/null +++ b/glib/tests/markups/valid-8.expected @@ -0,0 +1,5 @@ +ELEMENT 'foo' + TEXT '' + PASS '>>> CDATA ]]>' + TEXT '' +END 'foo' diff --git a/glib/tests/markups/valid-8.gmarkup b/glib/tests/markups/valid-8.gmarkup new file mode 100644 index 0000000..a75aee0 --- /dev/null +++ b/glib/tests/markups/valid-8.gmarkup @@ -0,0 +1 @@ +>>> CDATA ]]> diff --git a/glib/tests/markups/valid-9.expected b/glib/tests/markups/valid-9.expected new file mode 100644 index 0000000..7810394 --- /dev/null +++ b/glib/tests/markups/valid-9.expected @@ -0,0 +1,3 @@ +ELEMENT 'foo' + TEXT 'data' +END 'foo' diff --git a/glib/tests/markups/valid-9.gmarkup b/glib/tests/markups/valid-9.gmarkup new file mode 100644 index 0000000..90a99a0 --- /dev/null +++ b/glib/tests/markups/valid-9.gmarkup @@ -0,0 +1,2 @@ +data diff --git a/glib/tests/mem-overflow.c b/glib/tests/mem-overflow.c new file mode 100644 index 0000000..c7ea218 --- /dev/null +++ b/glib/tests/mem-overflow.c @@ -0,0 +1,163 @@ +/* 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. + */ + +/* We test for errors in optimize-only definitions in gmem.h */ + +#pragma GCC optimize (1) + +#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]; + + /* "FAIL" here apparently means "fail to overflow"... */ +#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)); + g_free (p); + + 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)); + g_free (p); + + 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)); + g_free (p); + + CHECK_PASS (g_try_new (X, a)); + CHECK_FAIL (g_try_new (X, b)); + g_free (p); + + CHECK_PASS (g_try_new0 (X, a)); + CHECK_FAIL (g_try_new0 (X, b)); + g_free (p); + + 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) do { \ + if (g_test_undefined ()) \ + { \ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) \ + { \ + p = (P); \ + exit (0); \ + } \ + \ + g_test_trap_assert_failed(); \ + } \ + } while (0) + +#define CHECK_PASS(P) do { \ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) \ + { \ + p = (P); \ + g_free (p); \ + exit (0); \ + } \ + \ + g_test_trap_assert_passed(); \ + } while (0) + + 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)); + g_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)); + g_free (q); +} + +typedef struct +{ +} Empty; + +static void +empty_alloc (void) +{ + g_test_bug ("615379"); + + g_assert_cmpint (sizeof (Empty), ==, 0); + + if (g_test_trap_fork (0, 0)) + { + Empty *empty; + + empty = g_new0 (Empty, 1); + g_assert (empty == NULL); + exit (0); + } + g_test_trap_assert_passed (); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/mem/overflow", mem_overflow); + g_test_add_func ("/mem/empty-alloc", empty_alloc); + + return g_test_run(); +} diff --git a/glib/tests/mutex.c b/glib/tests/mutex.c new file mode 100644 index 0000000..3bd2e2f --- /dev/null +++ b/glib/tests/mutex.c @@ -0,0 +1,237 @@ +/* Unit tests for GMutex + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +#include + +static void +test_mutex1 (void) +{ + GMutex mutex; + + g_mutex_init (&mutex); + g_mutex_lock (&mutex); + g_mutex_unlock (&mutex); + g_mutex_lock (&mutex); + g_mutex_unlock (&mutex); + g_mutex_clear (&mutex); +} + +static void +test_mutex2 (void) +{ + static GMutex mutex; + + g_mutex_lock (&mutex); + g_mutex_unlock (&mutex); + g_mutex_lock (&mutex); + g_mutex_unlock (&mutex); +} + +static void +test_mutex3 (void) +{ + GMutex *mutex; + + mutex = g_mutex_new (); + g_mutex_lock (mutex); + g_mutex_unlock (mutex); + g_mutex_lock (mutex); + g_mutex_unlock (mutex); + g_mutex_free (mutex); +} + +static void +test_mutex4 (void) +{ + static GMutex mutex; + gboolean ret; + + ret = g_mutex_trylock (&mutex); + g_assert (ret); + + /* no guarantees that mutex is recursive, so could return 0 or 1 */ + if (g_mutex_trylock (&mutex)) + g_mutex_unlock (&mutex); + + g_mutex_unlock (&mutex); +} + +#define LOCKS 48 +#define ITERATIONS 10000 +#define THREADS 100 + + +GThread *owners[LOCKS]; +GMutex locks[LOCKS]; + +static void +acquire (gint nr) +{ + GThread *self; + + self = g_thread_self (); + + if (!g_mutex_trylock (&locks[nr])) + { + if (g_test_verbose ()) + g_print ("thread %p going to block on lock %d\n", self, nr); + + g_mutex_lock (&locks[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_mutex_unlock (&locks[nr]); +} + +static gpointer +thread_func (gpointer data) +{ + gint i; + GRand *rand; + + rand = g_rand_new (); + + for (i = 0; i < ITERATIONS; i++) + acquire (g_rand_int_range (rand, 0, LOCKS)); + + g_rand_free (rand); + + return NULL; +} + +static void +test_mutex5 (void) +{ + gint i; + GThread *threads[THREADS]; + + for (i = 0; i < LOCKS; i++) + g_mutex_init (&locks[i]); + + 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_mutex_clear (&locks[i]); + + for (i = 0; i < LOCKS; i++) + g_assert (owners[i] == NULL); +} + +#define COUNT_TO 100000000 + +static gboolean +do_addition (gint *value) +{ + static GMutex lock; + gboolean more; + + /* test performance of "good" cases (ie: short critical sections) */ + g_mutex_lock (&lock); + if ((more = *value != COUNT_TO)) + if (*value != -1) + (*value)++; + g_mutex_unlock (&lock); + + return more; +} + +static gpointer +addition_thread (gpointer value) +{ + while (do_addition (value)); + + return NULL; +} + +static void +test_mutex_perf (gconstpointer data) +{ + gint n_threads = GPOINTER_TO_INT (data); + GThread *threads[THREADS]; + gint64 start_time; + gdouble rate; + gint x = -1; + gint i; + + for (i = 0; i < n_threads - 1; i++) + threads[i] = g_thread_create (addition_thread, &x, TRUE, NULL); + + /* avoid measuring thread setup/teardown time */ + start_time = g_get_monotonic_time (); + g_atomic_int_set (&x, 0); + addition_thread (&x); + g_assert_cmpint (g_atomic_int_get (&x), ==, COUNT_TO); + rate = g_get_monotonic_time () - start_time; + rate = x / rate; + + for (i = 0; i < n_threads - 1; i++) + g_thread_join (threads[i]); + + g_test_maximized_result (rate, "%f mips", rate); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/mutex1", test_mutex1); + g_test_add_func ("/thread/mutex2", test_mutex2); + g_test_add_func ("/thread/mutex3", test_mutex3); + g_test_add_func ("/thread/mutex4", test_mutex4); + g_test_add_func ("/thread/mutex5", test_mutex5); + + if (g_test_perf ()) + { + gint i; + + g_test_add_data_func ("/thread/mutex/perf/uncontended", NULL, test_mutex_perf); + + for (i = 1; i <= 10; i++) + { + gchar name[80]; + sprintf (name, "/thread/mutex/perf/contended/%d", i); + g_test_add_data_func (name, GINT_TO_POINTER (i), test_mutex_perf); + } + } + + return g_test_run (); +} diff --git a/glib/tests/node.c b/glib/tests/node.c new file mode 100644 index 0000000..27b5073 --- /dev/null +++ b/glib/tests/node.c @@ -0,0 +1,424 @@ +/* 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" + +#define C2P(c) ((gpointer) ((long) (c))) +#define P2C(p) ((gchar) ((long) (p))) + +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 +traversal_test (void) +{ + GNode *root; + GNode *node_B; + GNode *node_C; + GNode *node_D; + GNode *node_E; + GNode *node_F; + GNode *node_G; + GNode *node_J; + GNode *n; + gchar *tstring; + + root = g_node_new (C2P ('A')); + node_B = g_node_new (C2P ('B')); + g_node_append (root, 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); + 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'))); + + /* 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. + */ + + node_C = node_B->children; + node_E = node_D->next; + + n = g_node_last_sibling (node_C); + g_assert (n == node_E); + n = g_node_last_sibling (node_D); + g_assert (n == node_E); + n = g_node_last_sibling (node_E); + g_assert (n == node_E); + + 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_PRE_ORDER, G_TRAVERSE_ALL, 2, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABF"); + 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_POST_ORDER, G_TRAVERSE_ALL, 2, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "BFA"); + 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_IN_ORDER, G_TRAVERSE_ALL, 2, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "BAF"); + 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_ALL, 2, node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "ABF"); + 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; + + 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); + g_assert_cmpstr (tstring, ==, "ABFEDCGLMKJIH"); + g_free (tstring); tstring = NULL; + + g_node_destroy (root); +} + +static void +construct_test (void) +{ + GNode *root; + GNode *node; + GNode *node_B; + GNode *node_D; + GNode *node_F; + GNode *node_G; + GNode *node_J; + guint i; + + root = g_node_new (C2P ('A')); + g_assert_cmpint (g_node_depth (root), ==, 1); + g_assert_cmpint (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')); + 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); + 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'))); + + /* we have built: A + * / \ + * B F + * / | \ \ + * C D E G + * / /\ \ + * H I J K + */ + g_assert_cmpint (g_node_depth (root), ==, 1); + g_assert_cmpint (g_node_max_height (root), ==, 4); + g_assert_cmpint (g_node_depth (node_G->children->next), ==, 4); + g_assert_cmpint (g_node_n_nodes (root, G_TRAVERSE_LEAFS), ==, 7); + g_assert_cmpint (g_node_n_nodes (root, G_TRAVERSE_NON_LEAFS), ==, 4); + g_assert_cmpint (g_node_n_nodes (root, G_TRAVERSE_ALL), ==, 11); + g_assert_cmpint (g_node_max_height (node_F), ==, 3); + g_assert_cmpint (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_cmpint (P2C (node->data), ==, ('C' + i)); + } + + for (i = 0; i < g_node_n_children (node_G); i++) + g_assert_cmpint (g_node_child_position (node_G, g_node_nth_child (node_G, i)), ==, i); + + g_node_destroy (root); +} + +static void +allocation_test (void) +{ + GNode *root; + GNode *node; + gint i; + + 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_cmpint (g_node_max_height (root), >, 100); + g_assert_cmpint (g_node_n_nodes (root, G_TRAVERSE_ALL), ==, 1 + 2048); + + g_node_destroy (root); +} + + +static void +misc_test (void) +{ + GNode *root; + GNode *node_B; + GNode *node_C; + GNode *node_D; + GNode *node_E; + gchar *tstring; + + root = g_node_new (C2P ('A')); + node_B = g_node_new (C2P ('B')); + g_node_append (root, node_B); + node_D = g_node_new (C2P ('D')); + g_node_append (root, node_D); + node_C = g_node_new (C2P ('C')); + g_node_insert_after (root, node_B, node_C); + node_E = g_node_new (C2P ('E')); + g_node_append (node_C, node_E); + + g_assert (g_node_get_root (node_E) == root); + g_assert (g_node_is_ancestor (root, node_B)); + g_assert (g_node_is_ancestor (root, node_E)); + g_assert (!g_node_is_ancestor (node_B, node_D)); + g_assert (g_node_first_sibling (node_D) == node_B); + g_assert (g_node_first_sibling (node_E) == node_E); + g_assert_cmpint (g_node_child_index (root, C2P ('B')), ==, 0); + g_assert_cmpint (g_node_child_index (root, C2P ('C')), ==, 1); + g_assert_cmpint (g_node_child_index (root, C2P ('D')), ==, 2); + g_assert_cmpint (g_node_child_index (root, C2P ('E')), ==, -1); + + tstring = NULL; + g_node_children_foreach (root, G_TRAVERSE_ALL, (GNodeForeachFunc)node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "BCD"); + g_free (tstring); tstring = NULL; + + g_node_children_foreach (root, G_TRAVERSE_LEAVES, (GNodeForeachFunc)node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "BD"); + g_free (tstring); tstring = NULL; + + g_node_children_foreach (root, G_TRAVERSE_NON_LEAVES, (GNodeForeachFunc)node_build_string, &tstring); + g_assert_cmpstr (tstring, ==, "C"); + g_free (tstring); tstring = NULL; + + g_node_destroy (root); +} + +static gboolean +check_order (GNode *node, + gpointer data) +{ + gchar **expected = data; + gchar d; + + d = GPOINTER_TO_INT (node->data); + g_assert_cmpint (d, ==, **expected); + (*expected)++; + + return FALSE; +} + +static void +unlink_test (void) +{ + GNode *root; + GNode *cnode; + GNode *node; + gchar *expected; + + /* + * -------- a -------- + * / | \ + * b c d + * / | \ / | \ / | \ + * e f g h i j k l m + * + */ + + root = g_node_new (C2P ('a')); + node = g_node_append_data (root, C2P ('b')); + g_node_append_data (node, C2P ('e')); + g_node_append_data (node, C2P ('f')); + g_node_append_data (node, C2P ('g')); + + node = cnode = g_node_append_data (root, C2P ('c')); + g_node_append_data (node, C2P ('h')); + g_node_append_data (node, C2P ('i')); + g_node_append_data (node, C2P ('j')); + + node = g_node_append_data (root, C2P ('d')); + g_node_append_data (node, C2P ('k')); + g_node_append_data (node, C2P ('l')); + g_node_append_data (node, C2P ('m')); + + g_node_unlink (cnode); + + expected = "abdefgklm"; + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, check_order, &expected); + + expected = "chij"; + g_node_traverse (cnode, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, check_order, &expected); + + g_node_destroy (root); + g_node_destroy (cnode); +} + +static gpointer +copy_up (gconstpointer src, + gpointer data) +{ + gchar l, u; + + l = GPOINTER_TO_INT (src); + u = g_ascii_toupper (l); + + return GINT_TO_POINTER ((int)u); +} + +static void +copy_test (void) +{ + GNode *root; + GNode *copy; + gchar *expected; + + root = g_node_new (C2P ('a')); + g_node_append_data (root, C2P ('b')); + g_node_append_data (root, C2P ('c')); + g_node_append_data (root, C2P ('d')); + + expected = "abcd"; + g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, check_order, &expected); + + copy = g_node_copy (root); + + expected = "abcd"; + g_node_traverse (copy, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, check_order, &expected); + + g_node_destroy (copy); + + copy = g_node_copy_deep (root, copy_up, NULL); + + expected = "ABCD"; + g_node_traverse (copy, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, check_order, &expected); + + g_node_destroy (copy); + + g_node_destroy (root); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/node/allocation", allocation_test); + g_test_add_func ("/node/construction", construct_test); + g_test_add_func ("/node/traversal", traversal_test); + g_test_add_func ("/node/misc", misc_test); + g_test_add_func ("/node/unlink", unlink_test); + g_test_add_func ("/node/copy", copy_test); + + return g_test_run (); +} + diff --git a/glib/tests/once.c b/glib/tests/once.c new file mode 100644 index 0000000..b11e577 --- /dev/null +++ b/glib/tests/once.c @@ -0,0 +1,137 @@ + +/* Unit tests for GOnce and friends + * Copyright (C) 2011 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 + +static gpointer +do_once (gpointer data) +{ + static gint i = 0; + + i++; + + return GINT_TO_POINTER (i); +} + +static void +test_once1 (void) +{ + GOnce once = G_ONCE_INIT; + gpointer res; + + g_assert (once.status == G_ONCE_STATUS_NOTCALLED); + + res = g_once (&once, do_once, NULL); + g_assert_cmpint (GPOINTER_TO_INT (res), ==, 1); + + g_assert (once.status == G_ONCE_STATUS_READY); + + res = g_once (&once, do_once, NULL); + g_assert_cmpint (GPOINTER_TO_INT (res), ==, 1); +} + +static void +test_once2 (void) +{ + static gsize init = 0; + + if (g_once_init_enter (&init)) + { + g_assert (TRUE); + g_once_init_leave (&init, 1); + } + + g_assert_cmpint (init, ==, 1); + if (g_once_init_enter (&init)) + { + g_assert_not_reached (); + g_once_init_leave (&init, 2); + } + g_assert_cmpint (init, ==, 1); +} + +#define THREADS 100 + +static gint64 shared; + +static void +init_shared (void) +{ + static gsize init = 0; + + if (g_once_init_enter (&init)) + { + shared += 42; + + g_once_init_leave (&init, 1); + } +} + +static gpointer +thread_func (gpointer data) +{ + init_shared (); + + return NULL; +} + +static void +test_once3 (void) +{ + gint i; + GThread *threads[THREADS]; + + shared = 0; + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("once3", thread_func, NULL); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + g_assert_cmpint (shared, ==, 42); +} + +static void +test_once4 (void) +{ + static const gchar *val; + + if (g_once_init_enter (&val)) + g_once_init_leave (&val, "foo"); + + g_assert_cmpstr (val, ==, "foo"); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/once1", test_once1); + g_test_add_func ("/thread/once2", test_once2); + g_test_add_func ("/thread/once3", test_once3); + g_test_add_func ("/thread/once4", test_once4); + + return g_test_run (); +} diff --git a/glib/tests/option-argv0.c b/glib/tests/option-argv0.c new file mode 100644 index 0000000..c7bbc7c --- /dev/null +++ b/glib/tests/option-argv0.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2011 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: Colin Walters + */ + +#include + +#include +#include +#include + +#if defined __linux || defined __OpenBSD__ +static void +test_platform_argv0 (void) +{ + GOptionContext *context; + gboolean arg; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + gboolean retval; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + retval = g_option_context_parse (context, NULL, NULL, NULL); + g_assert (retval == TRUE); + g_assert (strcmp (g_get_prgname(), "option-argv0") == 0 + || strcmp (g_get_prgname (), "lt-option-argv0") == 0); + + g_option_context_free (context); +} +#endif + +int +main (int argc, + char *argv[]) +{ + /* Note - we can't actually use g_test_* because g_test_init mutates + * g_get_prgname() which is exactly what we wanted to test =/ + */ +#if defined __linux || defined __OpenBSD__ + g_print ("/option/argv0: "); + test_platform_argv0 (); + g_print ("OK\n"); +#endif + + return 0; +} diff --git a/glib/tests/option-context.c b/glib/tests/option-context.c new file mode 100644 index 0000000..433b7dc --- /dev/null +++ b/glib/tests/option-context.c @@ -0,0 +1,2311 @@ +/* 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 +test_group_captions (void) +{ + gchar *help_variants[] = { "--help", "--help-all", "--help-test" }; + + GOptionEntry main_entries[] = { + { "main-switch", 0, 0, + G_OPTION_ARG_NONE, NULL, + "A switch that is in the main group", NULL }, + { NULL } + }; + + GOptionEntry group_entries[] = { + { "test-switch", 0, 0, + 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); + g_option_context_free (options); + 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*"); + } + } + + g_option_context_free (options); + } +} + +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; + +static 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; +} + +static 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 */ +static char ** +copy_stringv (char **argv, int argc) +{ + return g_memdup (argv, sizeof (char *) * (argc + 1)); +} + +static void +check_identical_stringv (gchar **before, gchar **after) +{ + guint i; + + /* Not only is it the same string... */ + for (i = 0; before[i] != NULL; i++) + g_assert_cmpstr (before[i], ==, after[i]); + + /* ... it is actually the same pointer */ + for (i = 0; before[i] != NULL; i++) + g_assert (before[i] == after[i]); + + g_assert (after[i] == NULL); +} + + +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; +} + +static void +error_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_assert (error != NULL); + /* An error occurred, so argv has not been changed */ + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + /* On failure, values should be reset */ + g_assert (error_test1_int == 0x12345678); + + g_strfreev (argv_copy); + g_free (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; +} + +static void +error_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + retval = g_option_context_parse (context, &argc, &argv, &error); + + g_assert (retval == FALSE); + g_assert (error != NULL); + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + g_assert (strcmp (error_test2_string, "foo") == 0); + + g_strfreev (argv_copy); + g_free (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; +} + +static void +error_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + retval = g_option_context_parse (context, &argc, &argv, &error); + + g_assert (retval == FALSE); + g_assert (error != NULL); + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + g_assert (!error_test3_boolean); + + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +arg_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_no_error (error); + g_assert (retval); + + /* Last arg specified is the one that should be stored */ + g_assert (arg_test1_int == 30); + + /* We free all of the strings in a copy of argv, because now argv is a + * subset - some have been removed in-place + */ + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +arg_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +arg_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + + +static void +arg_test4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +arg_test5 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, 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); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +arg_test6 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (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; +} + +static void +callback_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_no_error (error); + g_assert (retval); + + g_assert (strcmp (callback_test1_string, "foo.txt") == 0); + + g_free (callback_test1_string); + + g_strfreev (argv_copy); + g_free (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; +} + +static void +callback_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_no_error (error); + g_assert (retval); + + g_assert (callback_test2_int == 2); + + g_strfreev (argv_copy); + g_free (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; +} + +static void +callback_test_optional_1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + + +static void +callback_test_optional_4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_5 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_6 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_7 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +callback_test_optional_8 (void) +{ + GOptionContext *context; + gboolean dummy; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (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; +} + +static void +callback_remaining_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (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; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, 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); + check_identical_stringv (argv_copy, argv); + + g_option_context_free (context); + g_clear_error (&error); + g_strfreev (argv_copy); + g_free (argv); + + /* 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); + argv_copy = copy_stringv (argv, 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); + check_identical_stringv (argv_copy, argv); + + g_option_context_free (context); + g_clear_error (&error); + g_strfreev (argv_copy); + g_free (argv); + + /* 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); + argv_copy = copy_stringv (argv, 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); + check_identical_stringv (argv_copy, argv); + + g_option_context_free (context); + g_clear_error (&error); + g_strfreev (argv_copy); + g_free (argv); + + /* 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); + argv_copy = copy_stringv (argv, 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); + check_identical_stringv (argv_copy, argv); + + g_option_context_free (context); + g_clear_error (&error); + g_strfreev (argv_copy); + g_free (argv); +} + + +static 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); + g_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); +} + +static void +ignore_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static 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); + g_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 +static array_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static 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); +} + +static 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); +} + +static 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 */ +static void +rest_test1 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +/* check that -- works */ +static void +rest_test2 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +/* check that -- stripping works */ +static void +rest_test2a (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +rest_test2b (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +rest_test2c (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +rest_test2d (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + + +/* check that G_OPTION_REMAINING collects non-option arguments */ +static void +rest_test3 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + + +/* check that G_OPTION_REMAINING and -- work together */ +static void +rest_test4 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +/* test that G_OPTION_REMAINING works with G_OPTION_ARG_FILENAME_ARRAY */ +static void +rest_test5 (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_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_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +unknown_short_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (!retval); + g_assert (error != NULL); + g_clear_error (&error); + + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +/* test that lone dashes are treated as non-options */ +static void +lonely_dash_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + int argc; + + g_test_bug ("168008"); + + context = g_option_context_new (NULL); + + /* Now try parsing */ + argv = split_string ("program -", &argc); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_no_error (error); + g_assert (retval); + + g_assert (argv[1] && strcmp (argv[1], "-") == 0); + + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +missing_arg_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + 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); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_assert (error != NULL); + /* An error occurred, so argv has not been changed */ + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + g_strfreev (argv_copy); + g_free (argv); + + /* Try parsing again */ + argv = split_string ("program -t", &argc); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_assert (error != NULL); + /* An error occurred, so argv has not been changed */ + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +static gchar *test_arg; + +static gboolean cb (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + test_arg = g_strdup (value); + return TRUE; +} + +static void +dash_arg_test (void) +{ + GOptionContext *context; + gboolean retval; + GError *error = NULL; + gchar **argv; + gchar **argv_copy; + int argc; + gboolean argb = FALSE; + GOptionEntry entries [] = + { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, cb, NULL, NULL }, + { "three", '3', 0, G_OPTION_ARG_NONE, &argb, NULL, NULL }, + { NULL } }; + + g_test_bug ("577638"); + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + /* Now try parsing */ + argv = split_string ("program --test=-3", &argc); + argv_copy = copy_stringv (argv, argc); + + test_arg = NULL; + error = NULL; + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval); + g_assert_no_error (error); + g_assert_cmpstr (test_arg, ==, "-3"); + + g_strfreev (argv_copy); + g_free (argv); + g_free (test_arg); + test_arg = NULL; + + /* Try parsing again */ + argv = split_string ("program --test -3", &argc); + argv_copy = copy_stringv (argv, argc); + + error = NULL; + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert_no_error (error); + g_assert (retval); + g_assert_cmpstr (test_arg, ==, NULL); + + g_option_context_free (context); + g_strfreev (argv_copy); + g_free (argv); +} + +static void +test_basic (void) +{ + GOptionContext *context; + gchar *arg = NULL; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + g_assert (g_option_context_get_help_enabled (context)); + g_assert (!g_option_context_get_ignore_unknown_options (context)); + g_assert_cmpstr (g_option_context_get_summary (context), ==, NULL); + g_assert_cmpstr (g_option_context_get_description (context), ==, NULL); + + g_option_context_set_help_enabled (context, FALSE); + g_option_context_set_ignore_unknown_options (context, TRUE); + g_option_context_set_summary (context, "summary"); + g_option_context_set_description(context, "description"); + + g_assert (!g_option_context_get_help_enabled (context)); + g_assert (g_option_context_get_ignore_unknown_options (context)); + g_assert_cmpstr (g_option_context_get_summary (context), ==, "summary"); + g_assert_cmpstr (g_option_context_get_description (context), ==, "description"); + + g_option_context_free (context); +} + +static void +test_help (void) +{ + GOptionContext *context; + GOptionGroup *group; + gchar *str; + gchar *arg = NULL; + gchar **sarr = NULL; + GOptionEntry entries[] = { + { "test", 't', 0, G_OPTION_ARG_STRING, &arg, "Test tests", "Argument to use in test" }, + { "test2", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, NULL, "Tests also", NULL }, + { "frob", 0, 0, G_OPTION_ARG_NONE, NULL, "Main frob", NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &sarr, "Rest goes here", "REST" }, + { NULL } + }; + GOptionEntry group_entries[] = { + { "test", 't', 0, G_OPTION_ARG_STRING, &arg, "Group test", "Group test arg" }, + { "frob", 0, G_OPTION_FLAG_NOALIAS, G_OPTION_ARG_NONE, NULL, "Group frob", NULL }, + { NULL } + }; + + context = g_option_context_new ("blabla"); + g_option_context_add_main_entries (context, entries, NULL); + g_option_context_set_summary (context, "Summary"); + g_option_context_set_description (context, "Description"); + + group = g_option_group_new ("group1", "Group1-description", "Group1-help", NULL, NULL); + g_option_group_add_entries (group, group_entries); + + g_option_context_add_group (context, group); + + str = g_option_context_get_help (context, FALSE, NULL); + g_assert (strstr (str, "blabla") != NULL); + g_assert (strstr (str, "Test tests") != NULL); + g_assert (strstr (str, "Argument to use in test") != NULL); + g_assert (strstr (str, "Tests also") == NULL); + g_assert (strstr (str, "REST") != NULL); + g_assert (strstr (str, "Summary") != NULL); + g_assert (strstr (str, "Description") != NULL); + g_assert (strstr (str, "--help") != NULL); + g_assert (strstr (str, "--help-all") != NULL); + g_assert (strstr (str, "--help-group1") != NULL); + g_assert (strstr (str, "Group1-description") != NULL); + g_assert (strstr (str, "Group1-help") != NULL); + g_assert (strstr (str, "Group test arg") != NULL); + g_assert (strstr (str, "Group frob") != NULL); + g_assert (strstr (str, "Main frob") != NULL); + g_assert (strstr (str, "--frob") != NULL); + g_assert (strstr (str, "--group1-test") != NULL); + g_assert (strstr (str, "--group1-frob") == NULL); + g_free (str); + + g_option_context_free (context); +} + +static void +test_help_no_options (void) +{ + GOptionContext *context; + gchar **sarr = NULL; + GOptionEntry entries[] = { + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &sarr, "Rest goes here", "REST" }, + { NULL } + }; + gchar *str; + + context = g_option_context_new ("blabla"); + g_option_context_add_main_entries (context, entries, NULL); + + str = g_option_context_get_help (context, FALSE, NULL); + g_assert (strstr (str, "blabla") != NULL); + g_assert (strstr (str, "REST") != NULL); + g_assert (strstr (str, "Help Options") != NULL); + g_assert (strstr (str, "Application Options") == NULL); + + g_free (str); + g_option_context_free (context); +} + +static void +set_bool (gpointer data) +{ + gboolean *b = data; + + *b = TRUE; +} + +static void +test_main_group (void) +{ + GOptionContext *context; + GOptionGroup *group; + gboolean b = FALSE; + + context = g_option_context_new (NULL); + g_assert (g_option_context_get_main_group (context) == NULL); + group = g_option_group_new ("name", "description", "hlep", &b, set_bool); + g_option_context_add_group (context, group); + group = g_option_group_new ("name2", "description", "hlep", NULL, NULL); + g_option_context_add_group (context, group); + g_assert (g_option_context_get_main_group (context) == NULL); + group = g_option_group_new ("name", "description", "hlep", NULL, NULL); + g_option_context_set_main_group (context, group); + g_assert (g_option_context_get_main_group (context) == group); + + g_option_context_free (context); + + g_assert (b); +} + +static gboolean error_func_called = FALSE; + +static void +error_func (GOptionContext *context, + GOptionGroup *group, + gpointer data, + GError **error) +{ + g_assert_cmpint (GPOINTER_TO_INT(data), ==, 1234); + error_func_called = TRUE; +} + +static void +test_error_hook (void) +{ + GOptionContext *context; + gchar *arg = NULL; + GOptionEntry entries [] = + { { "test", 't', 0, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + GOptionGroup *group; + gchar **argv; + gchar **argv_copy; + gint argc; + gboolean retval; + GError *error = NULL; + + context = g_option_context_new (NULL); + group = g_option_group_new ("name", "description", "hlep", GINT_TO_POINTER(1234), NULL); + g_option_group_add_entries (group, entries); + g_option_context_set_main_group (context, group); + g_option_group_set_error_hook (g_option_context_get_main_group (context), + error_func); + + argv = split_string ("program --test", &argc); + argv_copy = copy_stringv (argv, argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_assert (error != NULL); + /* An error occurred, so argv has not been changed */ + check_identical_stringv (argv_copy, argv); + g_clear_error (&error); + + g_assert (error_func_called); + + g_strfreev (argv_copy); + g_free (argv); + g_option_context_free (context); +} + +static void +test_group_parse (void) +{ + GOptionContext *context; + GOptionGroup *group; + gchar *arg1 = NULL; + gchar *arg2 = NULL; + gchar *arg3 = NULL; + gchar *arg4 = NULL; + gchar *arg5 = NULL; + GOptionEntry entries[] = { + { "test", 't', 0, G_OPTION_ARG_STRING, &arg1, NULL, NULL }, + { "faz", 'f', 0, G_OPTION_ARG_STRING, &arg2, NULL, NULL }, + { NULL } + }; + GOptionEntry group_entries[] = { + { "test", 0, 0, G_OPTION_ARG_STRING, &arg3, NULL, NULL }, + { "frob", 'f', 0, G_OPTION_ARG_STRING, &arg4, NULL, NULL }, + { "faz", 'z', 0, G_OPTION_ARG_STRING, &arg5, NULL, NULL }, + { NULL } + }; + gchar **argv, **orig_argv; + gint argc; + GError *error = NULL; + gboolean retval; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + group = g_option_group_new ("group", "A group", "help for group", NULL, NULL); + g_option_group_add_entries (group, group_entries); + g_option_context_add_group (context, group); + + argv = split_string ("program --test arg1 -f arg2 --group-test arg3 --frob arg4 -z arg5", &argc); + orig_argv = g_memdup (argv, (argc + 1) * sizeof (char *)); + + retval = g_option_context_parse (context, &argc, &argv, &error); + + g_assert_no_error (error); + g_assert (retval); + g_assert_cmpstr (arg1, ==, "arg1"); + g_assert_cmpstr (arg2, ==, "arg2"); + g_assert_cmpstr (arg3, ==, "arg3"); + g_assert_cmpstr (arg4, ==, "arg4"); + g_assert_cmpstr (arg5, ==, "arg5"); + + g_free (arg1); + g_free (arg2); + g_free (arg3); + g_free (arg4); + g_free (arg5); + + g_free (argv); + g_strfreev (orig_argv); + g_option_context_free (context); +} + +static void +flag_reverse_string (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GOptionContext *context; + gchar *arg = NULL; + GOptionEntry entries [] = + { { "test", 't', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_STRING, &arg, NULL, NULL }, + { NULL } }; + gchar **argv; + gint argc; + gboolean retval; + GError *error = NULL; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + argv = split_string ("program --test bla", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_clear_error (&error); + g_strfreev (argv); + g_option_context_free (context); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*ignoring reverse flag*"); +} + +static void +flag_optional_int (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + GOptionContext *context; + gint arg = 0; + GOptionEntry entries [] = + { { "test", 't', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &arg, NULL, NULL }, + { NULL } }; + gchar **argv; + gint argc; + gboolean retval; + GError *error = NULL; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, entries, NULL); + + argv = split_string ("program --test 5", &argc); + + retval = g_option_context_parse (context, &argc, &argv, &error); + g_assert (retval == FALSE); + g_clear_error (&error); + g_strfreev (argv); + g_option_context_free (context); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*ignoring no-arg, optional-arg or filename flags*"); +} +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + g_test_add_func ("/option/help/options", test_help); + g_test_add_func ("/option/help/no-options", test_help_no_options); + + g_test_add_func ("/option/basic", test_basic); + g_test_add_func ("/option/group/captions", test_group_captions); + g_test_add_func ("/option/group/main", test_main_group); + g_test_add_func ("/option/group/error-hook", test_error_hook); + g_test_add_func ("/option/group/parse", test_group_parse); + + /* Test that restoration on failure works */ + g_test_add_func ("/option/restoration/int", error_test1); + g_test_add_func ("/option/restoration/string", error_test2); + g_test_add_func ("/option/restoration/boolean", error_test3); + + /* Test that special argument parsing works */ + g_test_add_func ("/option/arg/repetition/int", arg_test1); + g_test_add_func ("/option/arg/repetition/string", arg_test2); + g_test_add_func ("/option/arg/repetition/filename", arg_test3); + g_test_add_func ("/option/arg/repetition/double", arg_test4); + g_test_add_func ("/option/arg/repetition/locale", arg_test5); + g_test_add_func ("/option/arg/repetition/int64", arg_test6); + + /* Test string arrays */ + g_test_add_func ("/option/arg/array/string", array_test1); + + /* Test callback args */ + g_test_add_func ("/option/arg/callback/string", callback_test1); + g_test_add_func ("/option/arg/callback/count", callback_test2); + + /* Test optional arg flag for callback */ + g_test_add_func ("/option/arg/callback/optional1", callback_test_optional_1); + g_test_add_func ("/option/arg/callback/optional2", callback_test_optional_2); + g_test_add_func ("/option/arg/callback/optional3", callback_test_optional_3); + g_test_add_func ("/option/arg/callback/optional4", callback_test_optional_4); + g_test_add_func ("/option/arg/callback/optional5", callback_test_optional_5); + g_test_add_func ("/option/arg/callback/optional6", callback_test_optional_6); + g_test_add_func ("/option/arg/callback/optional7", callback_test_optional_7); + g_test_add_func ("/option/arg/callback/optional8", callback_test_optional_8); + + /* Test callback with G_OPTION_REMAINING */ + g_test_add_func ("/option/arg/remaining/callback", callback_remaining_test1); + + /* Test callbacks which return FALSE */ + g_test_add_func ("/option/arg/remaining/callback-false", callback_returns_false); + + /* Test ignoring options */ + g_test_add_func ("/option/arg/ignore/long", ignore_test1); + g_test_add_func ("/option/arg/ignore/short", ignore_test2); + g_test_add_func ("/option/arg/ignore/arg", ignore_test3); + g_test_add_func ("/option/context/add", add_test1); + + /* Test parsing empty args */ + /* Note there used to be an empty1 here, but it effectively moved + * to option-argv0.c. + */ + g_test_add_func ("/option/context/empty2", empty_test2); + g_test_add_func ("/option/context/empty3", empty_test3); + + /* Test handling of rest args */ + g_test_add_func ("/option/arg/rest/non-option", rest_test1); + g_test_add_func ("/option/arg/rest/separator1", rest_test2); + g_test_add_func ("/option/arg/rest/separator2", rest_test2a); + g_test_add_func ("/option/arg/rest/separator3", rest_test2b); + g_test_add_func ("/option/arg/rest/separator4", rest_test2c); + g_test_add_func ("/option/arg/rest/separator5", rest_test2d); + g_test_add_func ("/option/arg/remaining/non-option", rest_test3); + g_test_add_func ("/option/arg/remaining/separator", rest_test4); + g_test_add_func ("/option/arg/remaining/array", rest_test5); + + /* Test some invalid flag combinations */ + g_test_add_func ("/option/arg/reverse-string", flag_reverse_string); + g_test_add_func ("/option/arg/optional-int", flag_optional_int); + + /* regression tests for individual bugs */ + g_test_add_func ("/option/bug/unknown-short", unknown_short_test); + g_test_add_func ("/option/bug/lonely-dash", lonely_dash_test); + g_test_add_func ("/option/bug/missing-arg", missing_arg_test); + g_test_add_func ("/option/bug/dash-arg", dash_arg_test); + + return g_test_run(); +} diff --git a/glib/tests/pages.ini b/glib/tests/pages.ini new file mode 100644 index 0000000..9efdaa5 --- /dev/null +++ b/glib/tests/pages.ini @@ -0,0 +1,92 @@ +[main_section] +fill_specific_length_for_alignment_purposes = 3 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_10 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_11 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_12 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_13 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_14 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_15 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_16 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_17 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_18 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_19 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_20 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_21 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_22 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_23 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_24 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_25 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_26 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_27 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_28 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_29 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_30 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_31 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_32 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_33 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_34 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_35 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_36 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_37 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_38 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_39 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_40 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_41 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_42 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_43 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_44 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_45 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_46 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_47 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_48 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_49 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_50 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_51 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_52 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_53 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_54 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_55 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_56 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_57 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_58 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_59 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_60 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_61 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_62 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_63 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_64 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_65 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_66 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_67 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_68 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_69 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_70 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_71 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_72 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_73 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_74 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_75 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_76 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_77 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_78 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_79 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_80 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_81 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_82 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_83 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_84 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_85 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_86 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_87 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_88 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_89 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_90 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_91 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_92 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_93 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_94 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_95 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_96 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_97 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_98 = 92 +fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_99 = 92 diff --git a/glib/tests/pattern.c b/glib/tests/pattern.c new file mode 100644 index 0000000..52ab7a3 --- /dev/null +++ b/glib/tests/pattern.c @@ -0,0 +1,244 @@ +/* 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 + +/* 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; +}; + +typedef struct _CompileTest CompileTest; + +struct _CompileTest +{ + const gchar *src; + GMatchType match_type; + gchar *pattern; + guint min; +}; + +static CompileTest compile_tests[] = +{ + { "*A?B*", G_MATCH_ALL, "*A?B*", 3 }, + { "ABC*DEFGH", G_MATCH_ALL_TAIL, "HGFED*CBA", 8 }, + { "ABCDEF*GH", G_MATCH_ALL, "ABCDEF*GH", 8 }, + { "ABC**?***??**DEF*GH", G_MATCH_ALL, "ABC*???DEF*GH", 11 }, + { "*A?AA", G_MATCH_ALL_TAIL, "AA?A*", 4 }, + { "ABCD*", G_MATCH_HEAD, "ABCD", 4 }, + { "*ABCD", G_MATCH_TAIL, "ABCD", 4 }, + { "ABCDE", G_MATCH_EXACT, "ABCDE", 5 }, + { "A?C?E", G_MATCH_ALL, "A?C?E", 5 }, + { "*?x", G_MATCH_ALL_TAIL, "x?*", 2 }, + { "?*x", G_MATCH_ALL_TAIL, "x?*", 2 }, + { "*?*x", G_MATCH_ALL_TAIL, "x?*", 2 }, + { "x*??", G_MATCH_ALL_TAIL, "??*x", 3 } +}; + +static void +test_compilation (gconstpointer d) +{ + const CompileTest *test = d; + GPatternSpec *spec; + + spec = g_pattern_spec_new (test->src); + + g_assert_cmpint (spec->match_type, ==, test->match_type); + g_assert_cmpstr (spec->pattern, ==, test->pattern); + g_assert_cmpint (spec->pattern_length, ==, strlen (spec->pattern)); + g_assert_cmpint (spec->min_length, ==, test->min); + + g_pattern_spec_free (spec); +} + +typedef struct _MatchTest MatchTest; + +struct _MatchTest +{ + const gchar *pattern; + const gchar *string; + gboolean match; +}; + +static MatchTest match_tests[] = +{ + { "*x", "x", TRUE }, + { "*x", "xx", TRUE }, + { "*x", "yyyx", TRUE }, + { "*x", "yyxy", FALSE }, + { "?x", "x", FALSE }, + { "?x", "xx", TRUE }, + { "?x", "yyyx", FALSE }, + { "?x", "yyxy", FALSE }, + { "*?x", "xx", TRUE }, + { "?*x", "xx", TRUE }, + { "*?x", "x", FALSE }, + { "?*x", "x", FALSE }, + { "*?*x", "yx", TRUE }, + { "*?*x", "xxxx", TRUE }, + { "x*??", "xyzw", TRUE }, + { "*x", "\xc3\x84x", TRUE }, + { "?x", "\xc3\x84x", TRUE }, + { "??x", "\xc3\x84x", FALSE }, + { "ab\xc3\xa4\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab\xc3\xa4\xc3\xb6", "abao", FALSE }, + { "ab?\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab?\xc3\xb6", "abao", FALSE }, + { "ab\xc3\xa4?", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab\xc3\xa4?", "abao", FALSE }, + { "ab??", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab*", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab*\xc3\xb6", "ab\xc3\xa4\xc3\xb6", TRUE }, + { "ab*\xc3\xb6", "aba\xc3\xb6x\xc3\xb6", TRUE }, + { "", "abc", FALSE }, + { "", "", TRUE }, + { "abc", "abc", TRUE }, + { "*fo1*bar", "yyyfoxfo1bar", TRUE }, + { "12*fo1g*bar", "12yyyfoxfo1gbar", TRUE }, + { "__________:*fo1g*bar", "__________:yyyfoxfo1gbar", TRUE }, + { "*abc*cde", "abcde", FALSE }, + { "*abc*cde", "abccde", TRUE }, + { "*abc*cde", "abcxcde", TRUE }, + { "*abc*?cde", "abccde", FALSE }, + { "*abc*?cde", "abcxcde", TRUE }, + { "*abc*def", "abababcdededef", TRUE }, + { "*abc*def", "abcbcbcdededef", TRUE }, + { "*acbc*def", "acbcbcbcdededef", TRUE }, + { "*a?bc*def", "acbcbcbcdededef", TRUE }, + { "*abc*def", "bcbcbcdefdef", FALSE }, + { "*abc*def*ghi", "abcbcbcbcbcbcdefefdefdefghi", TRUE }, + { "*abc*def*ghi", "bcbcbcbcbcbcdefdefdefdefghi", FALSE }, + { "_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 }, + { "fooooooo*a*bc", "fooooooo_a_bd_a_bc", TRUE }, + { "x*?", "x", FALSE }, + { "abc*", "abc", TRUE }, + { "*", "abc", TRUE } +}; + +static void +test_match (gconstpointer d) +{ + const MatchTest *test = d; + GPatternSpec *p; + gchar *r; + + g_assert_cmpint (g_pattern_match_simple (test->pattern, test->string), ==, test->match); + + p = g_pattern_spec_new (test->pattern); + g_assert_cmpint (g_pattern_match_string (p, test->string), ==, test->match); + + r = g_utf8_strreverse (test->string, -1); + g_assert_cmpint (g_pattern_match (p, strlen (test->string), test->string, r), ==, test->match); + g_free (r); + + g_pattern_spec_free (p); +} + +typedef struct _EqualTest EqualTest; + +struct _EqualTest +{ + const gchar *pattern1; + const gchar *pattern2; + gboolean expected; +}; + +static EqualTest equal_tests[] = +{ + { "*A?B*", "*A?B*", TRUE }, + { "A*BCD", "A*BCD", TRUE }, + { "ABCD*", "ABCD****", TRUE }, + { "A1*", "A1*", TRUE }, + { "*YZ", "*YZ", TRUE }, + { "A1x", "A1x", TRUE }, + { "AB*CD", "AB**CD", TRUE }, + { "AB*?*CD", "AB*?CD", TRUE }, + { "AB*?CD", "AB?*CD", TRUE }, + { "AB*CD", "AB*?*CD", FALSE }, + { "ABC*", "ABC?", FALSE }, +}; + +static void +test_equal (gconstpointer d) +{ + const EqualTest *test = d; + GPatternSpec *p1, *p2; + + p1 = g_pattern_spec_new (test->pattern1); + p2 = g_pattern_spec_new (test->pattern2); + + g_assert_cmpint (g_pattern_spec_equal (p1, p2), ==, test->expected); + + g_pattern_spec_free (p1); + g_pattern_spec_free (p2); +} + + +int +main (int argc, char** argv) +{ + gint i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (compile_tests); i++) + { + path = g_strdup_printf ("/pattern/compile/%d", i); + g_test_add_data_func (path, &compile_tests[i], test_compilation); + g_free (path); + } + + for (i = 0; i < G_N_ELEMENTS (match_tests); i++) + { + path = g_strdup_printf ("/pattern/match/%d", i); + g_test_add_data_func (path, &match_tests[i], test_match); + g_free (path); + } + + for (i = 0; i < G_N_ELEMENTS (equal_tests); i++) + { + path = g_strdup_printf ("/pattern/equal/%d", i); + g_test_add_data_func (path, &equal_tests[i], test_equal); + g_free (path); + } + + return g_test_run (); +} + + diff --git a/glib/tests/private.c b/glib/tests/private.c new file mode 100644 index 0000000..1bdcffa --- /dev/null +++ b/glib/tests/private.c @@ -0,0 +1,395 @@ +/* Unit tests for GPrivate and friends + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +/* test basics: + * - initial value is NULL + * - set/get work repeatedly + */ +static void +test_private1 (void) +{ + GPrivate *private1; + gpointer value; + + private1 = g_private_new (NULL); + + value = g_private_get (private1); + g_assert (value == NULL); + + g_private_set (private1, GINT_TO_POINTER(1)); + value = g_private_get (private1); + g_assert_cmpint (GPOINTER_TO_INT (value), ==, 1); + + g_private_set (private1, GINT_TO_POINTER(2)); + value = g_private_get (private1); + g_assert_cmpint (GPOINTER_TO_INT (value), ==, 2); +} + +static GPrivate *private2; +static gint private2_destroy_count; + +static void +private2_destroy (gpointer data) +{ + g_atomic_int_inc (&private2_destroy_count); +} + +static gpointer +private2_func (gpointer data) +{ + gint value = GPOINTER_TO_INT (data); + gint i; + gint v, v2; + + for (i = 0; i < 1000; i++) + { + v = value + (i % 5); + g_private_set (private2, GINT_TO_POINTER(v)); + g_usleep (1000); + v2 = GPOINTER_TO_INT(g_private_get (private2)); + g_assert_cmpint (v, ==, v2); + } + + if (value % 2 == 0) + g_thread_exit (NULL); + + return NULL; +} + +/* test that + * - threads do not interfere with each other + * - destroy notifies are called for each thread exit + * - destroy notifies are called for g_thread_exit() too + * - destroy notifies are not called on g_private_set() + * - destroy notifies are called on g_private_replace() + */ +static void +test_private2 (void) +{ + GThread *thread[10]; + gint i; + + private2 = g_private_new (private2_destroy); + + g_private_set (private2, GINT_TO_POINTER(234)); + g_private_replace (private2, GINT_TO_POINTER(123)); + + for (i = 0; i < 10; i++) + thread[i] = g_thread_create (private2_func, GINT_TO_POINTER (i), TRUE, NULL); + + for (i = 0; i < 10; i++) + g_thread_join (thread[i]); + + g_assert_cmpint (private2_destroy_count, ==, 11); +} + +static gboolean private3_freed; + +static void +private3_free (gpointer data) +{ + g_assert (data == (void*) 0x1234); + private3_freed = TRUE; +} + +#ifdef G_OS_WIN32 +#include +#include + +static guint __stdcall +#else +#include + +static gpointer +#endif +private3_func (gpointer data) +{ + static GPrivate key = G_PRIVATE_INIT (private3_free); + + g_private_set (&key, (void *) 0x1234); + + return 0; +} + +static void +test_private3 (void) +{ + g_assert (!private3_freed); + +#ifdef G_OS_WIN32 + { + HANDLE thread; + guint ignore; + thread = (HANDLE) _beginthreadex (NULL, 0, private3_func, NULL, 0, &ignore); + WaitForSingleObject (thread, INFINITE); + CloseHandle (thread); + } +#else + { + pthread_t thread; + + pthread_create (&thread, NULL, private3_func, NULL); + pthread_join (thread, NULL); + } +#endif + g_assert (private3_freed); +} + +/* test basics: + * - static initialization works + * - initial value is NULL + * - get/set works repeatedly + */ +static GStaticPrivate sp1 = G_STATIC_PRIVATE_INIT; + +static void +test_static_private1 (void) +{ + gpointer value; + + value = g_static_private_get (&sp1); + g_assert (value == NULL); + + g_static_private_set (&sp1, GINT_TO_POINTER(1), NULL); + value = g_static_private_get (&sp1); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 1); + + g_static_private_set (&sp1, GINT_TO_POINTER(2), NULL); + value = g_static_private_get (&sp1); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 2); + + g_static_private_free (&sp1); + + value = g_static_private_get (&sp1); + g_assert (value == NULL); +} + +static gint sp2_destroy_count; + +static void +sp2_destroy (gpointer data) +{ + sp2_destroy_count++; +} + +static void +sp2_destroy2 (gpointer data) +{ + gint value = GPOINTER_TO_INT (data); + + g_assert_cmpint (value, ==, 2); +} + +/* test that destroy notifies are called as expected + * and on the right values + */ +static void +test_static_private2 (void) +{ + GStaticPrivate sp2; + gpointer value; + + g_static_private_init (&sp2); + + value = g_static_private_get (&sp2); + g_assert (value == NULL); + + g_static_private_set (&sp2, GINT_TO_POINTER(1), sp2_destroy); + g_assert_cmpint (sp2_destroy_count, ==, 0); + value = g_static_private_get (&sp2); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 1); + + g_static_private_set (&sp2, GINT_TO_POINTER(2), sp2_destroy2); + g_assert_cmpint (sp2_destroy_count, ==, 1); + value = g_static_private_get (&sp2); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 2); + + g_static_private_set (&sp2, GINT_TO_POINTER(3), sp2_destroy); + g_assert_cmpint (sp2_destroy_count, ==, 1); + value = g_static_private_get (&sp2); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 3); + + g_static_private_free (&sp2); + + value = g_static_private_get (&sp2); + g_assert (value == NULL); +} + +/* test that freeing and reinitializing a static private + * drops previous value + */ +static void +test_static_private3 (void) +{ + GStaticPrivate sp3; + gpointer value; + + g_static_private_init (&sp3); + + value = g_static_private_get (&sp3); + g_assert (value == NULL); + + g_static_private_set (&sp3, GINT_TO_POINTER(1), NULL); + value = g_static_private_get (&sp3); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 1); + + g_static_private_free (&sp3); + g_static_private_init (&sp3); + + value = g_static_private_get (&sp3); + g_assert (value == NULL); + + g_static_private_set (&sp3, GINT_TO_POINTER(2), NULL); + value = g_static_private_get (&sp3); + g_assert_cmpint (GPOINTER_TO_INT(value), ==, 2); + + g_static_private_free (&sp3); +} + +static GStaticPrivate sp4 = G_STATIC_PRIVATE_INIT; + +static gpointer +sp4_func (gpointer data) +{ + gint value = GPOINTER_TO_INT (data); + gint i; + gint v, v2; + + for (i = 0; i < 1000; i++) + { + v = value + (i % 5); + g_static_private_set (&sp4, GINT_TO_POINTER(v), NULL); + g_usleep (1000); + v2 = GPOINTER_TO_INT(g_static_private_get (&sp4)); + g_assert_cmpint (v, ==, v2); + } + + if (value % 2 == 0) + g_thread_exit (NULL); + + return NULL; +} + +/* test that threads do not interfere with each other + */ +static void +test_static_private4 (void) +{ + GThread *thread[10]; + gint i; + + for (i = 0; i < 10; i++) + thread[i] = g_thread_create (sp4_func, GINT_TO_POINTER (i), TRUE, NULL); + + for (i = 0; i < 10; i++) + g_thread_join (thread[i]); + + g_static_private_free (&sp4); +} + +static GStaticPrivate sp5 = G_STATIC_PRIVATE_INIT; +static GMutex m5; +static GCond c5a; +static GCond c5b; +static gint count5; + +static gpointer +sp5_func (gpointer data) +{ + gint v = GPOINTER_TO_INT (data); + gpointer value; + + value = g_static_private_get (&sp5); + g_assert (value == NULL); + + g_static_private_set (&sp5, GINT_TO_POINTER (v), NULL); + value = g_static_private_get (&sp5); + g_assert_cmpint (GPOINTER_TO_INT (value), ==, v); + + if (g_test_verbose ()) + g_print ("thread %d set sp5\n", v); + g_mutex_lock (&m5); + g_atomic_int_inc (&count5); + g_cond_signal (&c5a); + g_cond_wait (&c5b, &m5); + g_mutex_unlock (&m5); + + if (g_test_verbose ()) + g_print ("thread %d get sp5\n", v); + value = g_static_private_get (&sp5); + g_assert (value == NULL); + + return NULL; +} + +static void +test_static_private5 (void) +{ + GThread *thread[10]; + gint i; + + g_atomic_int_set (&count5, 0); + + for (i = 0; i < 10; i++) + thread[i] = g_thread_create (sp5_func, GINT_TO_POINTER (i), TRUE, NULL); + + g_mutex_lock (&m5); + while (g_atomic_int_get (&count5) < 10) + g_cond_wait (&c5a, &m5); + + if (g_test_verbose ()) + g_print ("sp5 gets nuked\n"); + + g_static_private_free (&sp5); + + g_cond_broadcast (&c5b); + g_mutex_unlock (&m5); + + for (i = 0; i < 10; i++) + g_thread_join (thread[i]); + + g_mutex_clear (&m5); + g_cond_clear (&c5a); + g_cond_clear (&c5b); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/private1", test_private1); + g_test_add_func ("/thread/private2", test_private2); + g_test_add_func ("/thread/private3", test_private3); + g_test_add_func ("/thread/staticprivate1", test_static_private1); + g_test_add_func ("/thread/staticprivate2", test_static_private2); + g_test_add_func ("/thread/staticprivate3", test_static_private3); + g_test_add_func ("/thread/staticprivate4", test_static_private4); + g_test_add_func ("/thread/staticprivate5", test_static_private5); + + return g_test_run (); +} diff --git a/glib/tests/protocol.c b/glib/tests/protocol.c new file mode 100644 index 0000000..a07b9f0 --- /dev/null +++ b/glib/tests/protocol.c @@ -0,0 +1,357 @@ +/* This file is part of GLib + * + * Copyright (C) 2010 Sven Herzberg + * + * 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 /* errno */ +#include +#ifndef _WIN32 +#include /* pipe() */ +#else +#include +#include +#define pipe(fds) _pipe(fds, 4096, _O_BINARY) +#endif + +static void +debug (void) +{ + if (g_test_verbose ()) + g_debug ("this is a regular g_debug() from the test suite"); +} + +static void +info (void) +{ +#ifdef g_info +#error "rewrite this to use g_info()" +#endif + if (g_test_verbose ()) + g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, "this is a regular g_log(..., G_LOG_LEVEL_INFO, ...) from the test suite"); +} + +static void +message (void) +{ + if (g_test_verbose ()) + g_message ("this is a regular g_message() from the test suite"); +} + +static void +warning (void) +{ + if (g_test_verbose ()) + g_warning ("this is a regular g_warning() from the test suite"); +} + +static void +critical (void) +{ + if (g_test_verbose ()) + g_critical ("this is a regular g_critical() from the test suite"); +} + +static void +error (void) +{ + if (g_test_verbose ()) + g_error ("this is a regular g_error() from the test suite"); +} + +static void +gtest_message (void) +{ + if (g_test_verbose ()) + g_test_message ("this is a regular g_test_message() from the test suite"); +} + +static gboolean +test_message_cb1 (GIOChannel * channel, + GIOCondition condition, + gpointer user_data) +{ + GIOStatus status; + guchar buf[512]; + gsize read_bytes = 0; + + g_assert_cmpuint (condition, ==, G_IO_IN); + + for (status = g_io_channel_read_chars (channel, (gchar*)buf, sizeof (buf), &read_bytes, NULL); + status == G_IO_STATUS_NORMAL; + status = g_io_channel_read_chars (channel, (gchar*)buf, sizeof (buf), &read_bytes, NULL)) + { + g_test_log_buffer_push (user_data, read_bytes, buf); + } + + g_assert_cmpuint (status, ==, G_IO_STATUS_AGAIN); + + return TRUE; +} + +static void +test_message_cb2 (GPid pid, + gint status, + gpointer user_data) +{ + g_spawn_close_pid (pid); + + g_main_loop_quit (user_data); +} + +static void +test_message (void) +{ + gchar* argv[] = { + "./protocol", + NULL, + "--verbose", + "-p", "/glib/testing/protocol/debug", + "-p", "/glib/testing/protocol/message", + "-p", "/glib/testing/protocol/gtest-message", + NULL + }; + GTestLogBuffer* tlb; + GTestLogMsg * msg; + GIOChannel * channel; + GMainLoop * loop; + GError * error = NULL; + gulong child_source; + gulong io_source; + GPid pid = 0; + int pipes[2]; + int passed = 0; + int messages = 0; + const char * line_term; + int line_term_len; + + if (0 > pipe (pipes)) + { + g_error ("error creating pipe: %s", g_strerror (errno)); + } + + argv[1] = g_strdup_printf ("--GTestLogFD=%u", pipes[1]); + + if (!g_spawn_async (NULL, + argv, NULL, + G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_LEAVE_DESCRIPTORS_OPEN | + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, &pid, + &error)) + { + g_error ("error spawning the test: %s", error->message); + } + + tlb = g_test_log_buffer_new (); + loop = g_main_loop_new (NULL, FALSE); + + channel = g_io_channel_unix_new (pipes[0]); + g_io_channel_set_close_on_unref (channel, TRUE); + g_io_channel_set_encoding (channel, NULL, NULL); + g_io_channel_set_buffered (channel, FALSE); + g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); + g_assert (g_io_channel_get_line_term (channel, NULL) == NULL); + g_io_channel_set_line_term (channel, "\n", 1); + line_term = g_io_channel_get_line_term (channel, &line_term_len); + g_assert_cmpint (*line_term, ==, '\n'); + g_assert_cmpint (line_term_len, ==, 1); + + io_source = g_io_add_watch (channel, G_IO_IN, test_message_cb1, tlb); + child_source = g_child_watch_add (pid, test_message_cb2, loop); + + g_main_loop_run (loop); + + test_message_cb1 (channel, G_IO_IN, tlb); + + g_assert (!g_source_remove (child_source)); + g_assert (g_source_remove (io_source)); + g_io_channel_unref (channel); + + for (msg = g_test_log_buffer_pop (tlb); + msg; + msg = g_test_log_buffer_pop (tlb)) + { + switch (msg->log_type) + { + case G_TEST_LOG_START_BINARY: + case G_TEST_LOG_START_CASE: + /* ignore */ + break; + case G_TEST_LOG_STOP_CASE: + passed++; + break; + case G_TEST_LOG_MESSAGE: + { + gchar const* known_messages[] = { + "this is a regular g_test_message() from the test suite", + "GLib-MESSAGE: this is a regular g_message() from the test suite", + "GLib-DEBUG: this is a regular g_debug() from the test suite" + }; + g_assert_cmpint (messages, <, G_N_ELEMENTS (known_messages)); + g_assert_cmpstr (msg->strings[0], ==, known_messages[messages]); + messages++; + } + break; + case G_TEST_LOG_ERROR: + g_assert_not_reached (); + break; + default: + g_error ("unexpected log message type: %s", g_test_log_type_name (msg->log_type)); + } + g_test_log_msg_free (msg); + } + + g_assert_cmpint (passed, ==, 3); + g_assert_cmpint (messages, ==, 3); + + g_free (argv[1]); + g_main_loop_unref (loop); + g_test_log_buffer_free (tlb); +} + +static void +test_error (void) +{ + gchar* tests[] = { + "/glib/testing/protocol/warning", + "/glib/testing/protocol/critical", + "/glib/testing/protocol/error" + }; + gint i; + int messages = 0; + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + gchar* argv[] = { + "./protocol", + NULL, + "--verbose", + "-p", tests[i], + NULL + }; + GTestLogBuffer* tlb; + GTestLogMsg * msg; + GIOChannel * channel; + GMainLoop * loop; + GError * error = NULL; + gulong child_source; + gulong io_source; + GPid pid = 0; + int pipes[2]; + + if (0 > pipe (pipes)) + { + g_error ("error creating pipe: %s", g_strerror (errno)); + } + + argv[1] = g_strdup_printf ("--GTestLogFD=%u", pipes[1]); + + if (!g_spawn_async (NULL, + argv, NULL, + G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_LEAVE_DESCRIPTORS_OPEN | + G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, + NULL, NULL, &pid, + &error)) + { + g_error ("error spawning the test: %s", error->message); + } + + tlb = g_test_log_buffer_new (); + loop = g_main_loop_new (NULL, FALSE); + + channel = g_io_channel_unix_new (pipes[0]); + g_io_channel_set_close_on_unref (channel, TRUE); + g_io_channel_set_encoding (channel, NULL, NULL); + g_io_channel_set_buffered (channel, FALSE); + g_io_channel_set_flags (channel, G_IO_FLAG_NONBLOCK, NULL); + + io_source = g_io_add_watch (channel, G_IO_IN, test_message_cb1, tlb); + child_source = g_child_watch_add (pid, test_message_cb2, loop); + + g_main_loop_run (loop); + + test_message_cb1 (channel, G_IO_IN, tlb); + + g_assert (!g_source_remove (child_source)); + g_assert (g_source_remove (io_source)); + g_io_channel_unref (channel); + + for (msg = g_test_log_buffer_pop (tlb); + msg; + msg = g_test_log_buffer_pop (tlb)) + { + switch (msg->log_type) + { + case G_TEST_LOG_START_BINARY: + case G_TEST_LOG_START_CASE: + /* ignore */ + break; + case G_TEST_LOG_STOP_CASE: + case G_TEST_LOG_MESSAGE: + g_assert_not_reached (); + break; + case G_TEST_LOG_ERROR: + { + gchar const* known_messages[] = { + "GLib-FATAL-WARNING: this is a regular g_warning() from the test suite", + "GLib-FATAL-CRITICAL: this is a regular g_critical() from the test suite", + "GLib-FATAL-ERROR: this is a regular g_error() from the test suite" + }; + g_assert_cmpint (messages, <, G_N_ELEMENTS (known_messages)); + g_assert_cmpstr (msg->strings[0], ==, known_messages[messages]); + messages++; + } + break; + default: + g_error ("unexpected log message type: %s", g_test_log_type_name (msg->log_type)); + } + g_test_log_msg_free (msg); + } + + g_free (argv[1]); + g_main_loop_unref (loop); + g_test_log_buffer_free (tlb); + } + + g_assert_cmpint (messages, ==, 3); +} + +int +main (int argc, + char**argv) +{ + g_test_init (&argc, &argv, NULL); + + /* we use ourself as the testcase, these are the ones we need internally */ + g_test_add_func ("/glib/testing/protocol/debug", debug); + g_test_add_func ("/glib/testing/protocol/info", info); + g_test_add_func ("/glib/testing/protocol/message", message); + g_test_add_func ("/glib/testing/protocol/warning", warning); + g_test_add_func ("/glib/testing/protocol/critical", critical); + g_test_add_func ("/glib/testing/protocol/error", error); + g_test_add_func ("/glib/testing/protocol/gtest-message", gtest_message); + + /* these are the real tests */ + g_test_add_func ("/glib/testing/protocol/test-message", test_message); + g_test_add_func ("/glib/testing/protocol/test-error", test_error); + + return g_test_run (); +} + +/* vim:set et sw=2 cino=t0,f0,(0,{s,>2s,n-1s,^-1s,e2s: */ diff --git a/glib/tests/queue.c b/glib/tests/queue.c new file mode 100644 index 0000000..f7c7276 --- /dev/null +++ b/glib/tests/queue.c @@ -0,0 +1,1103 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include +#include + +#include + + +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 (gconstpointer d) +{ + guint32 seed = GPOINTER_TO_UINT (d); + + 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]; + + 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); + /* qinf->head/qinf->tail may be invalid at this point */ + if (!g_queue_is_empty (q)) + g_queue_remove (q, q->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); + /* qinf->head/qinf->tail may be invalid at this point */ + if (!g_queue_is_empty (q)) + g_queue_remove_all (q, q->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); +} + +static void +test_basic (void) +{ + GQueue *q; + GList *node; + gpointer data; + + q = g_queue_new (); + + g_assert (g_queue_is_empty (q)); + 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)); + check_integrity (q); + g_assert_cmpint (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_cmpint (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_cmpint (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_cmpint (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_cmpint (g_list_length (q->head), ==, 5); + g_assert (g_queue_is_empty (q) == FALSE); + check_integrity (q); + g_assert_cmpint (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_cmpint (g_list_length (q->head), ==, 4); + g_assert_cmpint (q->length, ==, 4); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (5)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 3); + + node = g_queue_pop_head_link (q); + g_assert (node->data == GINT_TO_POINTER (2)); + g_list_free_1 (node); + + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 2); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (4)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 1); + node = g_queue_pop_head_link (q); + g_assert (node->data == GINT_TO_POINTER (3)); + g_list_free_1 (node); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 0); + g_assert (g_queue_pop_tail (q) == NULL); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 0); + g_assert (g_queue_pop_head (q) == NULL); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 0); + g_assert (g_queue_is_empty (q)); + check_integrity (q); + + g_queue_push_head (q, GINT_TO_POINTER (1)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 1); + g_assert_cmpint (q->length, ==, 1); + g_queue_push_head (q, GINT_TO_POINTER (2)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 2); + g_assert_cmpint (q->length, ==, 2); + g_queue_push_head (q, GINT_TO_POINTER (3)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 3); + g_assert_cmpint (q->length, ==, 3); + g_queue_push_head (q, GINT_TO_POINTER (4)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 4); + g_assert_cmpint (q->length, ==, 4); + g_queue_push_head (q, GINT_TO_POINTER (5)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 5); + g_assert_cmpint (q->length, ==, 5); + g_assert (g_queue_pop_head (q) == GINT_TO_POINTER (5)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 4); + node = q->tail; + g_assert (node == g_queue_pop_tail_link (q)); + check_integrity (q); + g_list_free_1 (node); + g_assert_cmpint (g_list_length (q->head), ==, 3); + data = q->head->data; + g_assert (data == g_queue_pop_head (q)); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 2); + g_assert (g_queue_pop_tail (q) == GINT_TO_POINTER (2)); + check_integrity (q); + g_assert_cmpint (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_cmpint (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_cmpint (g_list_length (q->head), ==, 0); + g_assert (g_queue_pop_tail_link (q) == NULL); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 0); + + g_queue_reverse (q); + check_integrity (q); + g_assert_cmpint (g_list_length (q->head), ==, 0); + g_queue_free (q); +} + +static void +test_copy (void) +{ + GQueue *q, *q2; + gint i; + + q = g_queue_new (); + q2 = g_queue_copy (q); + check_integrity (q); + check_integrity (q2); + g_assert_cmpint (g_list_length (q->head), ==, 0); + g_assert_cmpint (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); + + g_queue_free (q); + g_queue_free (q2); +} + +static void +test_off_by_one (void) +{ + GQueue *q; + GList *node; + + q = g_queue_new (); + + 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_list_free_1 (node); + + g_queue_free (q); +} + +static gint +find_custom (gconstpointer a, gconstpointer b) +{ + return GPOINTER_TO_INT (a) - GPOINTER_TO_INT (b); +} + +static void +test_find_custom (void) +{ + GQueue *q; + GList *node; + q = g_queue_new (); + + g_queue_push_tail (q, GINT_TO_POINTER (1234)); + g_queue_push_tail (q, GINT_TO_POINTER (1)); + g_queue_push_tail (q, GINT_TO_POINTER (2)); + node = g_queue_find_custom (q, GINT_TO_POINTER (1), find_custom); + g_assert (node != NULL); + node = g_queue_find_custom (q, GINT_TO_POINTER (2), find_custom); + g_assert (node != NULL); + node = g_queue_find_custom (q, GINT_TO_POINTER (3), find_custom); + g_assert (node == NULL); + + g_queue_free (q); +} + +static void +test_static (void) +{ + GQueue q; + GQueue q2 = G_QUEUE_INIT; + + g_queue_init (&q); + + check_integrity (&q); + g_assert (g_queue_is_empty (&q)); + + check_integrity (&q2); + g_assert (g_queue_is_empty (&q2)); +} + +static void +test_clear (void) +{ + GQueue *q; + q = g_queue_new (); + + g_queue_push_tail (q, GINT_TO_POINTER (1234)); + g_queue_push_tail (q, GINT_TO_POINTER (1)); + g_queue_push_tail (q, GINT_TO_POINTER (2)); + g_assert_cmpint (g_queue_get_length (q), ==, 3); + + g_queue_clear (q); + check_integrity (q); + g_assert (g_queue_is_empty (q)); + + g_queue_free (q); +} + +typedef struct +{ + gboolean freed; + int x; +} QueueItem; + +static void +free_func (gpointer data) +{ + QueueItem *item = data; + + item->freed = TRUE; +} + +static QueueItem * +new_item (int x) +{ + QueueItem *item; + + item = g_slice_new (QueueItem); + item->freed = FALSE; + item->x = x; + + return item; +} + +static void +test_free_full (void) +{ + QueueItem *one, *two, *three; + GQueue *queue = NULL; + + queue = g_queue_new(); + g_queue_push_tail (queue, one = new_item (1)); + g_queue_push_tail (queue, two = new_item (2)); + g_queue_push_tail (queue, three = new_item (3)); + g_assert (!one->freed); + g_assert (!two->freed); + g_assert (!three->freed); + g_queue_free_full (queue, free_func); + g_assert (one->freed); + g_assert (two->freed); + g_assert (three->freed); + g_slice_free (QueueItem, one); + g_slice_free (QueueItem, two); + g_slice_free (QueueItem, three); +} + + +int main (int argc, char *argv[]) +{ + guint32 seed; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/queue/basic", test_basic); + g_test_add_func ("/queue/copy", test_copy); + g_test_add_func ("/queue/off-by-one", test_off_by_one); + g_test_add_func ("/queue/find-custom", test_find_custom); + g_test_add_func ("/queue/static", test_static); + g_test_add_func ("/queue/clear", test_clear); + g_test_add_func ("/queue/free-full", test_free_full); + + seed = g_test_rand_int_range (0, G_MAXINT); + path = g_strdup_printf ("/queue/random/seed:%u", seed); + g_test_add_data_func (path, GUINT_TO_POINTER (seed), random_test); + g_free (path); + + return g_test_run (); +} diff --git a/glib/tests/rand.c b/glib/tests/rand.c new file mode 100644 index 0000000..1e3a2eb --- /dev/null +++ b/glib/tests/rand.c @@ -0,0 +1,176 @@ +/* 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.sci.hiroshima-u.ac.jp/~m-mat/MT/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); +} + +static void +test_double_range (void) +{ + gdouble d; + + g_test_bug ("502560"); + + d = g_random_double_range (-G_MAXDOUBLE, G_MAXDOUBLE); + + g_assert (-G_MAXDOUBLE <= d); + g_assert (d < G_MAXDOUBLE); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/rand/test-rand", test_rand); + g_test_add_func ("/rand/double-range", test_double_range); + + return g_test_run(); +} diff --git a/glib/tests/rec-mutex.c b/glib/tests/rec-mutex.c new file mode 100644 index 0000000..95ac03f --- /dev/null +++ b/glib/tests/rec-mutex.c @@ -0,0 +1,255 @@ +/* Unit tests for GRecMutex + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +#include + +static void +test_rec_mutex1 (void) +{ + GRecMutex mutex; + + g_rec_mutex_init (&mutex); + g_rec_mutex_lock (&mutex); + g_rec_mutex_unlock (&mutex); + g_rec_mutex_lock (&mutex); + g_rec_mutex_unlock (&mutex); + g_rec_mutex_clear (&mutex); +} + +static void +test_rec_mutex2 (void) +{ + static GRecMutex mutex; + + g_rec_mutex_lock (&mutex); + g_rec_mutex_unlock (&mutex); + g_rec_mutex_lock (&mutex); + g_rec_mutex_unlock (&mutex); +} + +static void +test_rec_mutex3 (void) +{ + static GRecMutex mutex; + gboolean ret; + + ret = g_rec_mutex_trylock (&mutex); + g_assert (ret); + + ret = g_rec_mutex_trylock (&mutex); + g_assert (ret); + + g_rec_mutex_unlock (&mutex); + g_rec_mutex_unlock (&mutex); +} + +#define LOCKS 48 +#define ITERATIONS 10000 +#define THREADS 100 + + +GThread *owners[LOCKS]; +GRecMutex locks[LOCKS]; + +static void +acquire (gint nr) +{ + GThread *self; + + self = g_thread_self (); + + if (!g_rec_mutex_trylock (&locks[nr])) + { + if (g_test_verbose ()) + g_print ("thread %p going to block on lock %d\n", self, nr); + + g_rec_mutex_lock (&locks[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_assert (owners[nr] == self); /* hopefully this is still us... */ + + if (g_test_verbose ()) + g_print ("thread %p recursively taking lock %d\n", self, nr); + + g_rec_mutex_lock (&locks[nr]); /* we're recursive, after all */ + + g_assert (owners[nr] == self); /* hopefully this is still us... */ + + g_rec_mutex_unlock (&locks[nr]); + + 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_rec_mutex_unlock (&locks[nr]); +} + +static gpointer +thread_func (gpointer data) +{ + gint i; + GRand *rand; + + rand = g_rand_new (); + + for (i = 0; i < ITERATIONS; i++) + acquire (g_rand_int_range (rand, 0, LOCKS)); + + g_rand_free (rand); + + return NULL; +} + +static void +test_rec_mutex4 (void) +{ + gint i; + GThread *threads[THREADS]; + + for (i = 0; i < LOCKS; i++) + g_rec_mutex_init (&locks[i]); + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("test", thread_func, NULL); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + for (i = 0; i < LOCKS; i++) + g_rec_mutex_clear (&locks[i]); + + for (i = 0; i < LOCKS; i++) + g_assert (owners[i] == NULL); +} + +#define COUNT_TO 100000000 + +static gint depth; + +static gboolean +do_addition (gint *value) +{ + static GRecMutex lock; + gboolean more; + gint i; + + /* test performance of "good" cases (ie: short critical sections) */ + for (i = 0; i < depth; i++) + g_rec_mutex_lock (&lock); + + if ((more = *value != COUNT_TO)) + if (*value != -1) + (*value)++; + + for (i = 0; i < depth; i++) + g_rec_mutex_unlock (&lock); + + return more; +} + +static gpointer +addition_thread (gpointer value) +{ + while (do_addition (value)); + + return NULL; +} + +static void +test_mutex_perf (gconstpointer data) +{ + gint c = GPOINTER_TO_INT (data); + GThread *threads[THREADS]; + gint64 start_time; + gint n_threads; + gdouble rate; + gint x = -1; + gint i; + + n_threads = c / 256; + depth = c % 256; + + for (i = 0; i < n_threads - 1; i++) + threads[i] = g_thread_new ("test", addition_thread, &x); + + /* avoid measuring thread setup/teardown time */ + start_time = g_get_monotonic_time (); + g_atomic_int_set (&x, 0); + addition_thread (&x); + g_assert_cmpint (g_atomic_int_get (&x), ==, COUNT_TO); + rate = g_get_monotonic_time () - start_time; + rate = x / rate; + + for (i = 0; i < n_threads - 1; i++) + g_thread_join (threads[i]); + + g_test_maximized_result (rate, "%f mips", rate); +} + + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/rec-mutex1", test_rec_mutex1); + g_test_add_func ("/thread/rec-mutex2", test_rec_mutex2); + g_test_add_func ("/thread/rec-mutex3", test_rec_mutex3); + g_test_add_func ("/thread/rec-mutex4", test_rec_mutex4); + + if (g_test_perf ()) + { + gint i, j; + + for (i = 0; i < 5; i++) + for (j = 1; j <= 5; j++) + { + gchar name[80]; + guint c; + + c = i * 256 + j; + + if (i) + sprintf (name, "/thread/rec-mutex/perf/contended%d/depth%d", i, j); + else + sprintf (name, "/thread/rec-mutex/perf/uncontended/depth%d", j); + + g_test_add_data_func (name, GINT_TO_POINTER (c), test_mutex_perf); + } + } + + return g_test_run (); +} diff --git a/glib/tests/regex.c b/glib/tests/regex.c new file mode 100644 index 0000000..f205bf2 --- /dev/null +++ b/glib/tests/regex.c @@ -0,0 +1,2742 @@ +/* + * Copyright (C) 2005 - 2006, Marco Barisione + * Copyright (C) 2010 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_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include +#include +#include "glib.h" + +/* 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 gint total; + +typedef struct { + const gchar *pattern; + GRegexCompileFlags compile_opts; + GRegexMatchFlags match_opts; + gint expected_error; + gboolean check_flags; + GRegexCompileFlags real_compile_opts; + GRegexMatchFlags real_match_opts; +} TestNewData; + +static void +test_new (gconstpointer d) +{ + const TestNewData *data = d; + GRegex *regex; + GError *error = NULL; + + regex = g_regex_new (data->pattern, data->compile_opts, data->match_opts, &error); + g_assert (regex != NULL); + g_assert_no_error (error); + g_assert_cmpstr (data->pattern, ==, g_regex_get_pattern (regex)); + + if (data->check_flags) + { + g_assert_cmphex (g_regex_get_compile_flags (regex), ==, data->real_compile_opts); + g_assert_cmphex (g_regex_get_match_flags (regex), ==, data->real_match_opts); + } + + g_regex_unref (regex); +} + +#define TEST_NEW(_pattern, _compile_opts, _match_opts) { \ + TestNewData *data; \ + gchar *path; \ + data = g_new0 (TestNewData, 1); \ + data->pattern = _pattern; \ + data->compile_opts = _compile_opts; \ + data->match_opts = _match_opts; \ + data->expected_error = 0; \ + data->check_flags = FALSE; \ + path = g_strdup_printf ("/regex/new/%d", ++total); \ + g_test_add_data_func_full (path, data, test_new, g_free); \ + g_free (path); \ +} + +#define TEST_NEW_CHECK_FLAGS(_pattern, _compile_opts, _match_opts, _real_compile_opts, _real_match_opts) { \ + TestNewData *data; \ + gchar *path; \ + data = g_new0 (TestNewData, 1); \ + data->pattern = _pattern; \ + data->compile_opts = _compile_opts; \ + data->match_opts = 0; \ + data->expected_error = 0; \ + data->check_flags = TRUE; \ + data->real_compile_opts = _real_compile_opts; \ + data->real_match_opts = _real_match_opts; \ + path = g_strdup_printf ("/regex/new-check-flags/%d", ++total); \ + g_test_add_data_func_full (path, data, test_new, g_free); \ + g_free (path); \ +} + +static void +test_new_fail (gconstpointer d) +{ + const TestNewData *data = d; + GRegex *regex; + GError *error = NULL; + + regex = g_regex_new (data->pattern, data->compile_opts, data->match_opts, &error); + + g_assert (regex == NULL); + g_assert_error (error, G_REGEX_ERROR, data->expected_error); + g_error_free (error); +} + +#define TEST_NEW_FAIL(_pattern, _compile_opts, _expected_error) { \ + TestNewData *data; \ + gchar *path; \ + data = g_new0 (TestNewData, 1); \ + data->pattern = _pattern; \ + data->compile_opts = _compile_opts; \ + data->match_opts = 0; \ + data->expected_error = _expected_error; \ + path = g_strdup_printf ("/regex/new-fail/%d", ++total); \ + g_test_add_data_func_full (path, data, test_new_fail, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + GRegexCompileFlags compile_opts; + GRegexMatchFlags match_opts; + gboolean expected; + gssize string_len; + gint start_position; + GRegexMatchFlags match_opts2; +} TestMatchData; + +static void +test_match_simple (gconstpointer d) +{ + const TestMatchData *data = d; + gboolean match; + + match = g_regex_match_simple (data->pattern, data->string, data->compile_opts, data->match_opts); + g_assert_cmpint (match, ==, data->expected); +} + +#define TEST_MATCH_SIMPLE_NAMED(_name, _pattern, _string, _compile_opts, _match_opts, _expected) { \ + TestMatchData *data; \ + gchar *path; \ + data = g_new0 (TestMatchData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->compile_opts = _compile_opts; \ + data->match_opts = _match_opts; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/match-%s/%d", _name, ++total); \ + g_test_add_data_func_full (path, data, test_match_simple, g_free); \ + g_free (path); \ +} + +#define TEST_MATCH_SIMPLE(_pattern, _string, _compile_opts, _match_opts, _expected) \ + TEST_MATCH_SIMPLE_NAMED("simple", _pattern, _string, _compile_opts, _match_opts, _expected) +#define TEST_MATCH_NOTEMPTY(_pattern, _string, _expected) \ + TEST_MATCH_SIMPLE_NAMED("notempty", _pattern, _string, 0, G_REGEX_MATCH_NOTEMPTY, _expected) +#define TEST_MATCH_NOTEMPTY_ATSTART(_pattern, _string, _expected) \ + TEST_MATCH_SIMPLE_NAMED("notempty-atstart", _pattern, _string, 0, G_REGEX_MATCH_NOTEMPTY_ATSTART, _expected) + +static void +test_match (gconstpointer d) +{ + const TestMatchData *data = d; + GRegex *regex; + gboolean match; + GError *error = NULL; + + regex = g_regex_new (data->pattern, data->compile_opts, data->match_opts, &error); + g_assert (regex != NULL); + g_assert_no_error (error); + + match = g_regex_match_full (regex, data->string, data->string_len, + data->start_position, data->match_opts2, NULL, NULL); + + g_assert_cmpint (match, ==, data->expected); + + if (data->string_len == -1 && data->start_position == 0) + { + match = g_regex_match (regex, data->string, data->match_opts2, NULL); + g_assert_cmpint (match, ==, data->expected); + } + + g_regex_unref (regex); +} + +#define TEST_MATCH(_pattern, _compile_opts, _match_opts, _string, \ + _string_len, _start_position, _match_opts2, _expected) { \ + TestMatchData *data; \ + gchar *path; \ + data = g_new0 (TestMatchData, 1); \ + data->pattern = _pattern; \ + data->compile_opts = _compile_opts; \ + data->match_opts = _match_opts; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->match_opts2 = _match_opts2; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/match/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match, g_free); \ + g_free (path); \ +} + +struct _Match +{ + gchar *string; + gint start, end; +}; +typedef struct _Match Match; + +static void +free_match (gpointer data) +{ + Match *match = data; + if (match == NULL) + return; + g_free (match->string); + g_free (match); +} + +typedef struct { + const gchar *pattern; + const gchar *string; + gssize string_len; + gint start_position; + GSList *expected; +} TestMatchNextData; + +static void +test_match_next (gconstpointer d) +{ + const TestMatchNextData *data = d; + GRegex *regex; + GMatchInfo *match_info; + GSList *matches; + GSList *l_exp, *l_match; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match_full (regex, data->string, data->string_len, + data->start_position, 0, &match_info, NULL); + matches = 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_cmpstr (data->string, ==, g_match_info_get_string (match_info)); + g_match_info_free (match_info); + matches = g_slist_reverse (matches); + + g_assert_cmpint (g_slist_length (matches), ==, g_slist_length (data->expected)); + + l_exp = data->expected; + l_match = matches; + while (l_exp != NULL) + { + Match *exp = l_exp->data; + Match *match = l_match->data; + + g_assert_cmpstr (exp->string, ==, match->string); + g_assert_cmpint (exp->start, ==, match->start); + g_assert_cmpint (exp->end, ==, match->end); + + l_exp = g_slist_next (l_exp); + l_match = g_slist_next (l_match); + } + + g_regex_unref (regex); + g_slist_free_full (matches, free_match); +} + +static void +free_match_next_data (gpointer _data) +{ + TestMatchNextData *data = _data; + + g_slist_free_full (data->expected, g_free); + g_free (data); +} + +#define TEST_MATCH_NEXT0(_pattern, _string, _string_len, _start_position) { \ + TestMatchNextData *data; \ + gchar *path; \ + data = g_new0 (TestMatchNextData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->expected = NULL; \ + path = g_strdup_printf ("/regex/match/next0/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \ + g_free (path); \ +} + +#define TEST_MATCH_NEXT1(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1) { \ + TestMatchNextData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchNextData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (NULL, match); \ + path = g_strdup_printf ("/regex/match/next1/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \ + g_free (path); \ +} + +#define TEST_MATCH_NEXT2(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1, t2, s2, e2) { \ + TestMatchNextData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchNextData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (NULL, match); \ + match = g_new0 (Match, 1); \ + match->string = t2; \ + match->start = s2; \ + match->end = e2; \ + data->expected = g_slist_append (data->expected, match); \ + path = g_strdup_printf ("/regex/match/next2/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \ + g_free (path); \ +} + +#define TEST_MATCH_NEXT3(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3) { \ + TestMatchNextData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchNextData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (NULL, match); \ + match = g_new0 (Match, 1); \ + match->string = t2; \ + match->start = s2; \ + match->end = e2; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t3; \ + match->start = s3; \ + match->end = e3; \ + data->expected = g_slist_append (data->expected, match); \ + path = g_strdup_printf ("/regex/match/next3/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \ + g_free (path); \ +} + +#define TEST_MATCH_NEXT4(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3, t4, s4, e4) { \ + TestMatchNextData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchNextData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (NULL, match); \ + match = g_new0 (Match, 1); \ + match->string = t2; \ + match->start = s2; \ + match->end = e2; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t3; \ + match->start = s3; \ + match->end = e3; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t4; \ + match->start = s4; \ + match->end = e4; \ + data->expected = g_slist_append (data->expected, match); \ + path = g_strdup_printf ("/regex/match/next4/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_next, free_match_next_data); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + gint start_position; + GRegexMatchFlags match_opts; + gint expected_count; +} TestMatchCountData; + +static void +test_match_count (gconstpointer d) +{ + const TestMatchCountData *data = d; + GRegex *regex; + GMatchInfo *match_info; + gint count; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match_full (regex, data->string, -1, data->start_position, + data->match_opts, &match_info, NULL); + count = g_match_info_get_match_count (match_info); + + g_assert_cmpint (count, ==, data->expected_count); + + g_match_info_ref (match_info); + g_match_info_unref (match_info); + g_match_info_unref (match_info); + g_regex_unref (regex); +} + +#define TEST_MATCH_COUNT(_pattern, _string, _start_position, _match_opts, _expected_count) { \ + TestMatchCountData *data; \ + gchar *path; \ + data = g_new0 (TestMatchCountData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->match_opts = _match_opts; \ + data->expected_count = _expected_count; \ + path = g_strdup_printf ("/regex/match/count/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_count, g_free); \ + g_free (path); \ +} + +static void +test_partial (gconstpointer d) +{ + const TestMatchData *data = d; + GRegex *regex; + GMatchInfo *match_info; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match (regex, data->string, data->match_opts, &match_info); + + g_assert_cmpint (data->expected, ==, g_match_info_is_partial_match (match_info)); + + if (data->expected) + { + g_assert (!g_match_info_fetch_pos (match_info, 0, NULL, NULL)); + g_assert (!g_match_info_fetch_pos (match_info, 1, NULL, NULL)); + } + + g_match_info_free (match_info); + g_regex_unref (regex); +} + +#define TEST_PARTIAL_FULL(_pattern, _string, _match_opts, _expected) { \ + TestMatchData *data; \ + gchar *path; \ + data = g_new0 (TestMatchData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->match_opts = _match_opts; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/match/partial/%d", ++total); \ + g_test_add_data_func_full (path, data, test_partial, g_free); \ + g_free (path); \ +} + +#define TEST_PARTIAL(_pattern, _string, _expected) TEST_PARTIAL_FULL(_pattern, _string, G_REGEX_MATCH_PARTIAL, _expected) + +typedef struct { + const gchar *pattern; + const gchar *string; + gint start_position; + gint sub_n; + const gchar *expected_sub; + gint expected_start; + gint expected_end; +} TestSubData; + +static void +test_sub_pattern (gconstpointer d) +{ + const TestSubData *data = d; + GRegex *regex; + GMatchInfo *match_info; + gchar *sub_expr; + gint start = UNTOUCHED, end = UNTOUCHED; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match_full (regex, data->string, -1, data->start_position, 0, &match_info, NULL); + + sub_expr = g_match_info_fetch (match_info, data->sub_n); + g_assert_cmpstr (sub_expr, ==, data->expected_sub); + g_free (sub_expr); + + g_match_info_fetch_pos (match_info, data->sub_n, &start, &end); + g_assert_cmpint (start, ==, data->expected_start); + g_assert_cmpint (end, ==, data->expected_end); + + g_match_info_free (match_info); + g_regex_unref (regex); +} + +#define TEST_SUB_PATTERN(_pattern, _string, _start_position, _sub_n, _expected_sub, \ + _expected_start, _expected_end) { \ + TestSubData *data; \ + gchar *path; \ + data = g_new0 (TestSubData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->sub_n = _sub_n; \ + data->expected_sub = _expected_sub; \ + data->expected_start = _expected_start; \ + data->expected_end = _expected_end; \ + path = g_strdup_printf ("/regex/match/subpattern/%d", ++total); \ + g_test_add_data_func_full (path, data, test_sub_pattern, g_free); \ + g_free (path); \ +} + +typedef struct { + 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; +} TestNamedSubData; + +static void +test_named_sub_pattern (gconstpointer d) +{ + const TestNamedSubData *data = d; + GRegex *regex; + GMatchInfo *match_info; + gint start = UNTOUCHED, end = UNTOUCHED; + gchar *sub_expr; + + regex = g_regex_new (data->pattern, data->flags, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match_full (regex, data->string, -1, data->start_position, 0, &match_info, NULL); + sub_expr = g_match_info_fetch_named (match_info, data->sub_name); + g_assert_cmpstr (sub_expr, ==, data->expected_sub); + g_free (sub_expr); + + g_match_info_fetch_named_pos (match_info, data->sub_name, &start, &end); + g_assert_cmpint (start, ==, data->expected_start); + g_assert_cmpint (end, ==, data->expected_end); + + g_match_info_free (match_info); + g_regex_unref (regex); +} + +#define TEST_NAMED_SUB_PATTERN(_pattern, _string, _start_position, _sub_name, \ + _expected_sub, _expected_start, _expected_end) { \ + TestNamedSubData *data; \ + gchar *path; \ + data = g_new0 (TestNamedSubData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->flags = 0; \ + data->start_position = _start_position; \ + data->sub_name = _sub_name; \ + data->expected_sub = _expected_sub; \ + data->expected_start = _expected_start; \ + data->expected_end = _expected_end; \ + path = g_strdup_printf ("/regex/match/named/subpattern/%d", ++total); \ + g_test_add_data_func_full (path, data, test_named_sub_pattern, g_free); \ + g_free (path); \ +} + +#define TEST_NAMED_SUB_PATTERN_DUPNAMES(_pattern, _string, _start_position, _sub_name, \ + _expected_sub, _expected_start, _expected_end) { \ + TestNamedSubData *data; \ + gchar *path; \ + data = g_new0 (TestNamedSubData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->flags = G_REGEX_DUPNAMES; \ + data->start_position = _start_position; \ + data->sub_name = _sub_name; \ + data->expected_sub = _expected_sub; \ + data->expected_start = _expected_start; \ + data->expected_end = _expected_end; \ + path = g_strdup_printf ("/regex/match/subpattern/named/dupnames/%d", ++total); \ + g_test_add_data_func_full (path, data, test_named_sub_pattern, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + GSList *expected; + gint start_position; + gint max_tokens; +} TestFetchAllData; + +static void +test_fetch_all (gconstpointer d) +{ + const TestFetchAllData *data = d; + GRegex *regex; + GMatchInfo *match_info; + GSList *l_exp; + gchar **matches; + gint match_count; + gint i; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + g_regex_match (regex, data->string, 0, &match_info); + matches = g_match_info_fetch_all (match_info); + if (matches) + match_count = g_strv_length (matches); + else + match_count = 0; + + g_assert_cmpint (match_count, ==, g_slist_length (data->expected)); + + l_exp = data->expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + g_assert_cmpstr (l_exp->data, ==, matches[i]); + } + + g_match_info_free (match_info); + g_regex_unref (regex); + g_strfreev (matches); +} + +static void +free_fetch_all_data (gpointer _data) +{ + TestFetchAllData *data = _data; + + g_slist_free (data->expected); + g_free (data); +} + +#define TEST_FETCH_ALL0(_pattern, _string) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = NULL; \ + path = g_strdup_printf ("/regex/fetch-all0/%d", ++total); \ + g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_FETCH_ALL1(_pattern, _string, e1) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + path = g_strdup_printf ("/regex/fetch-all1/%d", ++total); \ + g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_FETCH_ALL2(_pattern, _string, e1, e2) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + path = g_strdup_printf ("/regex/fetch-all2/%d", ++total); \ + g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_FETCH_ALL3(_pattern, _string, e1, e2, e3) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + data->expected = g_slist_append (data->expected, e3); \ + path = g_strdup_printf ("/regex/fetch-all3/%d", ++total); \ + g_test_add_data_func_full (path, data, test_fetch_all, free_fetch_all_data); \ + g_free (path); \ +} + +static void +test_split_simple (gconstpointer d) +{ + const TestFetchAllData *data = d; + GSList *l_exp; + gchar **tokens; + gint token_count; + gint i; + + tokens = g_regex_split_simple (data->pattern, data->string, 0, 0); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + g_assert_cmpint (token_count, ==, g_slist_length (data->expected)); + + l_exp = data->expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + g_assert_cmpstr (l_exp->data, ==, tokens[i]); + } + + g_strfreev (tokens); +} + +#define TEST_SPLIT_SIMPLE0(_pattern, _string) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = NULL; \ + path = g_strdup_printf ("/regex/split/simple0/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT_SIMPLE1(_pattern, _string, e1) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + path = g_strdup_printf ("/regex/split/simple1/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT_SIMPLE2(_pattern, _string, e1, e2) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + path = g_strdup_printf ("/regex/split/simple2/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT_SIMPLE3(_pattern, _string, e1, e2, e3) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->expected = g_slist_append (NULL, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + data->expected = g_slist_append (data->expected, e3); \ + path = g_strdup_printf ("/regex/split/simple3/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_simple, free_fetch_all_data); \ + g_free (path); \ +} + +static void +test_split_full (gconstpointer d) +{ + const TestFetchAllData *data = d; + GRegex *regex; + GSList *l_exp; + gchar **tokens; + gint token_count; + gint i; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + tokens = g_regex_split_full (regex, data->string, -1, data->start_position, + 0, data->max_tokens, NULL); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + g_assert_cmpint (token_count, ==, g_slist_length (data->expected)); + + l_exp = data->expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + g_assert_cmpstr (l_exp->data, ==, tokens[i]); + } + + g_regex_unref (regex); + g_strfreev (tokens); +} + +static void +test_split (gconstpointer d) +{ + const TestFetchAllData *data = d; + GRegex *regex; + GSList *l_exp; + gchar **tokens; + gint token_count; + gint i; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + + g_assert (regex != NULL); + + tokens = g_regex_split (regex, data->string, 0); + if (tokens) + token_count = g_strv_length (tokens); + else + token_count = 0; + + g_assert_cmpint (token_count, ==, g_slist_length (data->expected)); + + l_exp = data->expected; + for (i = 0; l_exp != NULL; i++, l_exp = g_slist_next (l_exp)) + { + g_assert_cmpstr (l_exp->data, ==, tokens[i]); + } + + g_regex_unref (regex); + g_strfreev (tokens); +} + +#define TEST_SPLIT0(_pattern, _string, _start_position, _max_tokens) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->max_tokens = _max_tokens; \ + data->expected = NULL; \ + if (_start_position == 0 && _max_tokens <= 0) { \ + path = g_strdup_printf ("/regex/split0/%d", ++total); \ + g_test_add_data_func (path, data, test_split); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/full-split0/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT1(_pattern, _string, _start_position, _max_tokens, e1) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->max_tokens = _max_tokens; \ + data->expected = NULL; \ + data->expected = g_slist_append (data->expected, e1); \ + if (_start_position == 0 && _max_tokens <= 0) { \ + path = g_strdup_printf ("/regex/split1/%d", ++total); \ + g_test_add_data_func (path, data, test_split); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/full-split1/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT2(_pattern, _string, _start_position, _max_tokens, e1, e2) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->max_tokens = _max_tokens; \ + data->expected = NULL; \ + data->expected = g_slist_append (data->expected, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + if (_start_position == 0 && _max_tokens <= 0) { \ + path = g_strdup_printf ("/regex/split2/%d", ++total); \ + g_test_add_data_func (path, data, test_split); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/full-split2/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \ + g_free (path); \ +} + +#define TEST_SPLIT3(_pattern, _string, _start_position, _max_tokens, e1, e2, e3) { \ + TestFetchAllData *data; \ + gchar *path; \ + data = g_new0 (TestFetchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->max_tokens = _max_tokens; \ + data->expected = NULL; \ + data->expected = g_slist_append (data->expected, e1); \ + data->expected = g_slist_append (data->expected, e2); \ + data->expected = g_slist_append (data->expected, e3); \ + if (_start_position == 0 && _max_tokens <= 0) { \ + path = g_strdup_printf ("/regex/split3/%d", ++total); \ + g_test_add_data_func (path, data, test_split); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/full-split3/%d", ++total); \ + g_test_add_data_func_full (path, data, test_split_full, free_fetch_all_data); \ + g_free (path); \ +} + +typedef struct { + const gchar *string_to_expand; + gboolean expected; + gboolean expected_refs; +} TestCheckReplacementData; + +static void +test_check_replacement (gconstpointer d) +{ + const TestCheckReplacementData *data = d; + gboolean has_refs; + gboolean result; + + result = g_regex_check_replacement (data->string_to_expand, &has_refs, NULL); + g_assert_cmpint (data->expected, ==, result); + + if (data->expected) + g_assert_cmpint (data->expected_refs, ==, has_refs); +} + +#define TEST_CHECK_REPLACEMENT(_string_to_expand, _expected, _expected_refs) { \ + TestCheckReplacementData *data; \ + gchar *path; \ + data = g_new0 (TestCheckReplacementData, 1); \ + data->string_to_expand = _string_to_expand; \ + data->expected = _expected; \ + data->expected_refs = _expected_refs; \ + path = g_strdup_printf ("/regex/check-repacement/%d", ++total); \ + g_test_add_data_func_full (path, data, test_check_replacement, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + const gchar *string_to_expand; + gboolean raw; + const gchar *expected; +} TestExpandData; + +static void +test_expand (gconstpointer d) +{ + const TestExpandData *data = d; + GRegex *regex = NULL; + GMatchInfo *match_info = NULL; + gchar *res; + + if (data->pattern) + { + regex = g_regex_new (data->pattern, data->raw ? G_REGEX_RAW : 0, 0, NULL); + g_regex_match (regex, data->string, 0, &match_info); + } + + res = g_match_info_expand_references (match_info, data->string_to_expand, NULL); + g_assert_cmpstr (res, ==, data->expected); + g_free (res); + g_match_info_free (match_info); + if (regex) + g_regex_unref (regex); +} + +#define TEST_EXPAND(_pattern, _string, _string_to_expand, _raw, _expected) { \ + TestExpandData *data; \ + gchar *path; \ + data = g_new0 (TestExpandData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_to_expand = _string_to_expand; \ + data->raw = _raw; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/expand/%d", ++total); \ + g_test_add_data_func_full (path, data, test_expand, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + gint start_position; + const gchar *replacement; + const gchar *expected; +} TestReplaceData; + +static void +test_replace (gconstpointer d) +{ + const TestReplaceData *data = d; + GRegex *regex; + gchar *res; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + res = g_regex_replace (regex, data->string, -1, data->start_position, data->replacement, 0, NULL); + + g_assert_cmpstr (res, ==, data->expected); + + g_free (res); + g_regex_unref (regex); +} + +#define TEST_REPLACE(_pattern, _string, _start_position, _replacement, _expected) { \ + TestReplaceData *data; \ + gchar *path; \ + data = g_new0 (TestReplaceData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->replacement = _replacement; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/replace/%d", ++total); \ + g_test_add_data_func_full (path, data, test_replace, g_free); \ + g_free (path); \ +} + +static void +test_replace_lit (gconstpointer d) +{ + const TestReplaceData *data = d; + GRegex *regex; + gchar *res; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + res = g_regex_replace_literal (regex, data->string, -1, data->start_position, + data->replacement, 0, NULL); + g_assert_cmpstr (res, ==, data->expected); + + g_free (res); + g_regex_unref (regex); +} + +#define TEST_REPLACE_LIT(_pattern, _string, _start_position, _replacement, _expected) { \ + TestReplaceData *data; \ + gchar *path; \ + data = g_new0 (TestReplaceData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->start_position = _start_position; \ + data->replacement = _replacement; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/replace-literally/%d", ++total); \ + g_test_add_data_func_full (path, data, test_replace_lit, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *name; + gint expected_num; +} TestStringNumData; + +static void +test_get_string_number (gconstpointer d) +{ + const TestStringNumData *data = d; + GRegex *regex; + gint num; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + num = g_regex_get_string_number (regex, data->name); + + g_assert_cmpint (num, ==, data->expected_num); + g_regex_unref (regex); +} + +#define TEST_GET_STRING_NUMBER(_pattern, _name, _expected_num) { \ + TestStringNumData *data; \ + gchar *path; \ + data = g_new0 (TestStringNumData, 1); \ + data->pattern = _pattern; \ + data->name = _name; \ + data->expected_num = _expected_num; \ + path = g_strdup_printf ("/regex/string-number/%d", ++total); \ + g_test_add_data_func_full (path, data, test_get_string_number, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *string; + gint length; + const gchar *expected; +} TestEscapeData; + +static void +test_escape (gconstpointer d) +{ + const TestEscapeData *data = d; + gchar *escaped; + + escaped = g_regex_escape_string (data->string, data->length); + + g_assert_cmpstr (escaped, ==, data->expected); + + g_free (escaped); +} + +#define TEST_ESCAPE(_string, _length, _expected) { \ + TestEscapeData *data; \ + gchar *path; \ + data = g_new0 (TestEscapeData, 1); \ + data->string = _string; \ + data->length = _length; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/escape/%d", ++total); \ + g_test_add_data_func_full (path, data, test_escape, g_free); \ + g_free (path); \ +} + +static void +test_escape_nul (gconstpointer d) +{ + const TestEscapeData *data = d; + gchar *escaped; + + escaped = g_regex_escape_nul (data->string, data->length); + + g_assert_cmpstr (escaped, ==, data->expected); + + g_free (escaped); +} + +#define TEST_ESCAPE_NUL(_string, _length, _expected) { \ + TestEscapeData *data; \ + gchar *path; \ + data = g_new0 (TestEscapeData, 1); \ + data->string = _string; \ + data->length = _length; \ + data->expected = _expected; \ + path = g_strdup_printf ("/regex/escape_nul/%d", ++total); \ + g_test_add_data_func_full (path, data, test_escape_nul, g_free); \ + g_free (path); \ +} + +typedef struct { + const gchar *pattern; + const gchar *string; + gssize string_len; + gint start_position; + GSList *expected; +} TestMatchAllData; + +static void +test_match_all_full (gconstpointer d) +{ + const TestMatchAllData *data = d; + GRegex *regex; + GMatchInfo *match_info; + GSList *l_exp; + gboolean match_ok; + gint match_count; + gint i; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + match_ok = g_regex_match_all_full (regex, data->string, data->string_len, data->start_position, + 0, &match_info, NULL); + + if (g_slist_length (data->expected) == 0) + g_assert (!match_ok); + else + g_assert (match_ok); + + match_count = g_match_info_get_match_count (match_info); + g_assert_cmpint (match_count, ==, g_slist_length (data->expected)); + + l_exp = data->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); + + g_assert_cmpstr (exp->string, ==, matched_string); + g_assert_cmpint (exp->start, ==, start); + g_assert_cmpint (exp->end, ==, end); + + g_free (matched_string); + + l_exp = g_slist_next (l_exp); + } + + g_match_info_free (match_info); + g_regex_unref (regex); +} + +static void +test_match_all (gconstpointer d) +{ + const TestMatchAllData *data = d; + GRegex *regex; + GMatchInfo *match_info; + GSList *l_exp; + gboolean match_ok; + gint match_count; + gint i; + + regex = g_regex_new (data->pattern, 0, 0, NULL); + match_ok = g_regex_match_all (regex, data->string, 0, &match_info); + + if (g_slist_length (data->expected) == 0) + g_assert (!match_ok); + else + g_assert (match_ok); + + match_count = g_match_info_get_match_count (match_info); + g_assert_cmpint (match_count, ==, g_slist_length (data->expected)); + + l_exp = data->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); + + g_assert_cmpstr (exp->string, ==, matched_string); + g_assert_cmpint (exp->start, ==, start); + g_assert_cmpint (exp->end, ==, end); + + g_free (matched_string); + + l_exp = g_slist_next (l_exp); + } + + g_match_info_free (match_info); + g_regex_unref (regex); +} + +static void +free_match_all_data (gpointer _data) +{ + TestMatchAllData *data = _data; + + g_slist_free_full (data->expected, g_free); + g_free (data); +} + +#define TEST_MATCH_ALL0(_pattern, _string, _string_len, _start_position) { \ + TestMatchAllData *data; \ + gchar *path; \ + data = g_new0 (TestMatchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->expected = NULL; \ + if (_string_len == -1 && _start_position == 0) { \ + path = g_strdup_printf ("/regex/match-all0/%d", ++total); \ + g_test_add_data_func (path, data, test_match_all); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/match-all-full0/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \ + g_free (path); \ +} + +#define TEST_MATCH_ALL1(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1) { \ + TestMatchAllData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->expected = NULL; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (data->expected, match); \ + if (_string_len == -1 && _start_position == 0) { \ + path = g_strdup_printf ("/regex/match-all1/%d", ++total); \ + g_test_add_data_func (path, data, test_match_all); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/match-all-full1/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \ + g_free (path); \ +} + +#define TEST_MATCH_ALL2(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1, t2, s2, e2) { \ + TestMatchAllData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->expected = NULL; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t2; \ + match->start = s2; \ + match->end = e2; \ + data->expected = g_slist_append (data->expected, match); \ + if (_string_len == -1 && _start_position == 0) { \ + path = g_strdup_printf ("/regex/match-all2/%d", ++total); \ + g_test_add_data_func (path, data, test_match_all); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/match-all-full2/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \ + g_free (path); \ +} + +#define TEST_MATCH_ALL3(_pattern, _string, _string_len, _start_position, \ + t1, s1, e1, t2, s2, e2, t3, s3, e3) { \ + TestMatchAllData *data; \ + Match *match; \ + gchar *path; \ + data = g_new0 (TestMatchAllData, 1); \ + data->pattern = _pattern; \ + data->string = _string; \ + data->string_len = _string_len; \ + data->start_position = _start_position; \ + data->expected = NULL; \ + match = g_new0 (Match, 1); \ + match->string = t1; \ + match->start = s1; \ + match->end = e1; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t2; \ + match->start = s2; \ + match->end = e2; \ + data->expected = g_slist_append (data->expected, match); \ + match = g_new0 (Match, 1); \ + match->string = t3; \ + match->start = s3; \ + match->end = e3; \ + data->expected = g_slist_append (data->expected, match); \ + if (_string_len == -1 && _start_position == 0) { \ + path = g_strdup_printf ("/regex/match-all3/%d", ++total); \ + g_test_add_data_func (path, data, test_match_all); \ + g_free (path); \ + } \ + path = g_strdup_printf ("/regex/match-all-full3/%d", ++total); \ + g_test_add_data_func_full (path, data, test_match_all_full, free_match_all_data); \ + g_free (path); \ +} + +static void +test_properties (void) +{ + GRegex *regex; + GError *error; + gboolean res; + GMatchInfo *match; + gchar *str; + + error = NULL; + regex = g_regex_new ("\\p{L}\\p{Ll}\\p{Lu}\\p{L&}\\p{N}\\p{Nd}", G_REGEX_OPTIMIZE, 0, &error); + res = g_regex_match (regex, "ppPP01", 0, &match); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "ppPP01"); + g_free (str); + + g_match_info_free (match); + g_regex_unref (regex); +} + +static void +test_class (void) +{ + GRegex *regex; + GError *error; + GMatchInfo *match; + gboolean res; + gchar *str; + + error = NULL; + regex = g_regex_new ("[abc\\x{0B1E}\\p{Mn}\\x{0391}-\\x{03A9}]", G_REGEX_OPTIMIZE, 0, &error); + res = g_regex_match (regex, "a:b:\340\254\236:\333\253:\316\240", 0, &match); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "a"); + g_free (str); + res = g_match_info_next (match, NULL); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "b"); + g_free (str); + res = g_match_info_next (match, NULL); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "\340\254\236"); + g_free (str); + res = g_match_info_next (match, NULL); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "\333\253"); + g_free (str); + res = g_match_info_next (match, NULL); + g_assert (res); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "\316\240"); + g_free (str); + + res = g_match_info_next (match, NULL); + g_assert (!res); + + g_match_info_free (match); + g_regex_unref (regex); +} + +/* examples for lookahead assertions taken from pcrepattern(3) */ +static void +test_lookahead (void) +{ + GRegex *regex; + GError *error; + GMatchInfo *match; + gboolean res; + gchar *str; + gint start, end; + + error = NULL; + regex = g_regex_new ("\\w+(?=;)", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "word1 word2: word3;", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_assert_cmpint (g_match_info_get_match_count (match), ==, 1); + str = g_match_info_fetch (match, 0); + g_assert_cmpstr (str, ==, "word3"); + g_free (str); + g_match_info_free (match); + g_regex_unref (regex); + + error = NULL; + regex = g_regex_new ("foo(?!bar)", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "foobar foobaz", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_assert_cmpint (g_match_info_get_match_count (match), ==, 1); + res = g_match_info_fetch_pos (match, 0, &start, &end); + g_assert (res); + g_assert_cmpint (start, ==, 7); + g_assert_cmpint (end, ==, 10); + g_match_info_free (match); + g_regex_unref (regex); + + error = NULL; + regex = g_regex_new ("(?!bar)foo", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "foobar foobaz", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_assert_cmpint (g_match_info_get_match_count (match), ==, 1); + res = g_match_info_fetch_pos (match, 0, &start, &end); + g_assert (res); + g_assert_cmpint (start, ==, 0); + g_assert_cmpint (end, ==, 3); + res = g_match_info_next (match, &error); + g_assert (res); + g_assert_no_error (error); + res = g_match_info_fetch_pos (match, 0, &start, &end); + g_assert (res); + g_assert_cmpint (start, ==, 7); + g_assert_cmpint (end, ==, 10); + g_match_info_free (match); + g_regex_unref (regex); +} + +/* examples for lookbehind assertions taken from pcrepattern(3) */ +static void +test_lookbehind (void) +{ + GRegex *regex; + GError *error; + GMatchInfo *match; + gboolean res; + gint start, end; + + error = NULL; + regex = g_regex_new ("(?Mon|Fri|Sun)(?:day)?|(?Tue)(?:sday)?|(?Wed)(?:nesday)?|(?Thu)(?:rsday)?|(?Sat)(?:urday)?", G_REGEX_OPTIMIZE|G_REGEX_DUPNAMES, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "Mon Tuesday Wed Saturday", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + str = g_match_info_fetch_named (match, "DN"); + g_assert_cmpstr (str, ==, "Mon"); + g_free (str); + res = g_match_info_next (match, &error); + g_assert (res); + str = g_match_info_fetch_named (match, "DN"); + g_assert_cmpstr (str, ==, "Tue"); + g_free (str); + res = g_match_info_next (match, &error); + g_assert (res); + str = g_match_info_fetch_named (match, "DN"); + g_assert_cmpstr (str, ==, "Wed"); + g_free (str); + res = g_match_info_next (match, &error); + g_assert (res); + str = g_match_info_fetch_named (match, "DN"); + g_assert_cmpstr (str, ==, "Sat"); + g_free (str); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^(a|b\\1)+$", G_REGEX_OPTIMIZE|G_REGEX_DUPNAMES, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "aaaaaaaaaaaaaaaa", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "ababbaa", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); +} + +/* examples for conditions taken from pcrepattern(3) */ +static void +test_condition (void) +{ + GRegex *regex; + GError *error; + GMatchInfo *match; + gboolean res; + + error = NULL; + regex = g_regex_new ("^(a+)(\\()?[^()]+(?(-1)\\))(b+)$", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "a(zzzzzz)b", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "aaazzzzzzbbb", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + error = NULL; + regex = g_regex_new ("^(a+)(?\\()?[^()]+(?()\\))(b+)$", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "a(zzzzzz)b", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "aaazzzzzzbbb", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^(a+)(?(+1)\\[|\\<)?[^()]+(\\])?(b+)$", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "a[zzzzzz]b", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "aaa 2[0-4]\\d | 25[0-5] | 1\\d\\d | [1-9]?\\d) )" + "\\b (?&byte) (\\.(?&byte)){3} \\b", + G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "128.0.0.1", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "192.168.1.1", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "209.132.180.167", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^(?(?=[^a-z]*[a-z])" + "\\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} )$", + G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "01-abc-24", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "01-23-45", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "01-uv-45", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "01-234-45", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); +} + +/* examples for recursion taken from pcrepattern(3) */ +static void +test_recursion (void) +{ + GRegex *regex; + GError *error; + GMatchInfo *match; + gboolean res; + gint start; + + error = NULL; + regex = g_regex_new ("\\( ( [^()]++ | (?R) )* \\)", G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "(middle)", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "((((((((((((((((middle))))))))))))))))", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "(((xxx(((", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^( \\( ( [^()]++ | (?1) )* \\) )$", G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "((((((((((((((((middle))))))))))))))))", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "(((xxx((()", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^(? \\( ( [^()]++ | (?&pn) )* \\) )$", G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + g_regex_match (regex, "(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("< (?: (?(R) \\d++ | [^<>]*+) | (?R)) * >", G_REGEX_OPTIMIZE|G_REGEX_EXTENDED, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, ">>>", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + res = g_match_info_fetch_pos (match, 0, &start, NULL); + g_assert (res); + g_assert_cmpint (start, ==, 0); + g_match_info_free (match); + res = g_regex_match (regex, ">>>", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + res = g_match_info_fetch_pos (match, 0, &start, NULL); + g_assert (res); + g_assert_cmpint (start, >, 0); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^((.)(?1)\\2|.)$", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "abcdcba", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "abcddcba", 0, &match); + g_assert (!res); + g_assert (!g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^(?:((.)(?1)\\2|)|((.)(?3)\\4|.))$", G_REGEX_OPTIMIZE, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "abcdcba", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "abcddcba", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); + + regex = g_regex_new ("^\\W*+(?:((.)\\W*+(?1)\\W*+\\2|)|((.)\\W*+(?3)\\W*+\\4|\\W*+.\\W*+))\\W*+$", G_REGEX_OPTIMIZE|G_REGEX_CASELESS, 0, &error); + g_assert (regex); + g_assert_no_error (error); + res = g_regex_match (regex, "abcdcba", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "A man, a plan, a canal: Panama!", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + res = g_regex_match (regex, "Oozy rat in a sanitary zoo", 0, &match); + g_assert (res); + g_assert (g_match_info_matches (match)); + g_match_info_free (match); + g_regex_unref (regex); +} + +static void +test_multiline (void) +{ + GRegex *regex; + GMatchInfo *info; + gint count; + + g_test_bug ("640489"); + + regex = g_regex_new ("^a$", G_REGEX_MULTILINE|G_REGEX_DOTALL, 0, NULL); + + count = 0; + g_regex_match (regex, "a\nb\na", 0, &info); + while (g_match_info_matches (info)) + { + count++; + g_match_info_next (info, NULL); + } + g_match_info_free (info); + g_regex_unref (regex); + + g_assert_cmpint (count, ==, 2); +} + +static void +test_explicit_crlf (void) +{ + GRegex *regex; + + regex = g_regex_new ("[\r\n]a", 0, 0, NULL); + g_assert_cmpint (g_regex_get_has_cr_or_lf (regex), ==, TRUE); + g_regex_unref (regex); +} + +int +main (int argc, char *argv[]) +{ + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/regex/properties", test_properties); + g_test_add_func ("/regex/class", test_class); + g_test_add_func ("/regex/lookahead", test_lookahead); + g_test_add_func ("/regex/lookbehind", test_lookbehind); + g_test_add_func ("/regex/subpattern", test_subpattern); + g_test_add_func ("/regex/condition", test_condition); + g_test_add_func ("/regex/recursion", test_recursion); + g_test_add_func ("/regex/multiline", test_multiline); + g_test_add_func ("/regex/explicit-crlf", test_explicit_crlf); + + /* TEST_NEW(pattern, compile_opts, match_opts) */ + TEST_NEW("[A-Z]+", G_REGEX_CASELESS | G_REGEX_EXTENDED | G_REGEX_OPTIMIZE, G_REGEX_MATCH_NOTBOL | G_REGEX_MATCH_PARTIAL); + 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); + + /* Check that flags are correct if the pattern modifies them */ + /* TEST_NEW_CHECK_FLAGS(pattern, compile_opts, match_ops, real_compile_opts, real_match_opts) */ + TEST_NEW_CHECK_FLAGS ("a", G_REGEX_OPTIMIZE, 0, G_REGEX_OPTIMIZE, 0); + TEST_NEW_CHECK_FLAGS ("a", G_REGEX_RAW, 0, G_REGEX_RAW, 0); + TEST_NEW_CHECK_FLAGS ("(?i)a", 0, 0, G_REGEX_CASELESS, 0); + TEST_NEW_CHECK_FLAGS ("(?m)a", 0, 0, G_REGEX_MULTILINE, 0); + TEST_NEW_CHECK_FLAGS ("(?s)a", 0, 0, G_REGEX_DOTALL, 0); + TEST_NEW_CHECK_FLAGS ("(?x)a", 0, 0, G_REGEX_EXTENDED, 0); + TEST_NEW_CHECK_FLAGS ("(?J)a", 0, 0, G_REGEX_DUPNAMES, 0); + TEST_NEW_CHECK_FLAGS ("(?U)[a-z]+", 0, 0, G_REGEX_UNGREEDY, 0); + TEST_NEW_CHECK_FLAGS ("(?X)a", 0, 0, 0 /* not exposed by GRegex */, 0); + TEST_NEW_CHECK_FLAGS ("^.*", 0, 0, G_REGEX_ANCHORED, 0); + TEST_NEW_CHECK_FLAGS ("(*UTF8)a", 0, 0, 0 /* this is the default in GRegex */, 0); + TEST_NEW_CHECK_FLAGS ("(*UCP)a", 0, 0, 0 /* this always on in GRegex */, 0); + TEST_NEW_CHECK_FLAGS ("(*CR)a", 0, 0, G_REGEX_NEWLINE_CR, 0); + TEST_NEW_CHECK_FLAGS ("(*LF)a", 0, 0, G_REGEX_NEWLINE_LF, 0); + TEST_NEW_CHECK_FLAGS ("(*CRLF)a", 0, 0, G_REGEX_NEWLINE_CRLF, 0); + TEST_NEW_CHECK_FLAGS ("(*ANY)a", 0, 0, 0 /* this is the default in GRegex */, 0); + TEST_NEW_CHECK_FLAGS ("(*ANYCRLF)a", 0, 0, G_REGEX_NEWLINE_ANYCRLF, 0); + TEST_NEW_CHECK_FLAGS ("(*BSR_ANYCRLF)a", 0, 0, G_REGEX_BSR_ANYCRLF, 0); + TEST_NEW_CHECK_FLAGS ("(*BSR_UNICODE)a", 0, 0, 0 /* this is the default in GRegex */, 0); + TEST_NEW_CHECK_FLAGS ("(*NO_START_OPT)a", 0, 0, 0 /* not exposed in GRegex */, 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); + + /* Check all GRegexError codes */ + TEST_NEW_FAIL ("a\\", 0, G_REGEX_ERROR_STRAY_BACKSLASH); + TEST_NEW_FAIL ("a\\c", 0, G_REGEX_ERROR_MISSING_CONTROL_CHAR); + TEST_NEW_FAIL ("a\\l", 0, G_REGEX_ERROR_UNRECOGNIZED_ESCAPE); + TEST_NEW_FAIL ("a{4,2}", 0, G_REGEX_ERROR_QUANTIFIERS_OUT_OF_ORDER); + TEST_NEW_FAIL ("a{999999,}", 0, G_REGEX_ERROR_QUANTIFIER_TOO_BIG); + TEST_NEW_FAIL ("[a-z", 0, G_REGEX_ERROR_UNTERMINATED_CHARACTER_CLASS); + TEST_NEW_FAIL ("(?X)[\\B]", 0, G_REGEX_ERROR_INVALID_ESCAPE_IN_CHARACTER_CLASS); + TEST_NEW_FAIL ("[z-a]", 0, G_REGEX_ERROR_RANGE_OUT_OF_ORDER); + TEST_NEW_FAIL ("{2,4}", 0, G_REGEX_ERROR_NOTHING_TO_REPEAT); + TEST_NEW_FAIL ("a(?u)", 0, G_REGEX_ERROR_UNRECOGNIZED_CHARACTER); + TEST_NEW_FAIL ("a(?<$foo)bar", 0, G_REGEX_ERROR_UNRECOGNIZED_CHARACTER); + TEST_NEW_FAIL ("a[:alpha:]b", 0, G_REGEX_ERROR_POSIX_NAMED_CLASS_OUTSIDE_CLASS); + TEST_NEW_FAIL ("a(b", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL ("a)b", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL ("a(?R", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL ("a(?-54", 0, G_REGEX_ERROR_UNMATCHED_PARENTHESIS); + TEST_NEW_FAIL ("(ab\\2)", 0, G_REGEX_ERROR_INEXISTENT_SUBPATTERN_REFERENCE); + TEST_NEW_FAIL ("a(?#abc", 0, G_REGEX_ERROR_UNTERMINATED_COMMENT); + TEST_NEW_FAIL ("(?<=a+)b", 0, G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND); + TEST_NEW_FAIL ("(?(1?)a|b)", 0, G_REGEX_ERROR_MALFORMED_CONDITION); + TEST_NEW_FAIL ("(a)(?(1)a|b|c)", 0, G_REGEX_ERROR_TOO_MANY_CONDITIONAL_BRANCHES); + TEST_NEW_FAIL ("(?(?i))", 0, G_REGEX_ERROR_ASSERTION_EXPECTED); + TEST_NEW_FAIL ("a[[:fubar:]]b", 0, G_REGEX_ERROR_UNKNOWN_POSIX_CLASS_NAME); + TEST_NEW_FAIL ("[[.ch.]]", 0, G_REGEX_ERROR_POSIX_COLLATING_ELEMENTS_NOT_SUPPORTED); + TEST_NEW_FAIL ("\\x{110000}", 0, G_REGEX_ERROR_HEX_CODE_TOO_LARGE); + TEST_NEW_FAIL ("^(?(0)f|b)oo", 0, G_REGEX_ERROR_INVALID_CONDITION); + TEST_NEW_FAIL ("(?<=\\C)X", 0, G_REGEX_ERROR_SINGLE_BYTE_MATCH_IN_LOOKBEHIND); + TEST_NEW_FAIL ("(?!\\w)(?R)", 0, G_REGEX_ERROR_INFINITE_LOOP); + TEST_NEW_FAIL ("(?(?eks)(?Peccs)", 0, G_REGEX_ERROR_DUPLICATE_SUBPATTERN_NAME); +#if 0 + TEST_NEW_FAIL (?, 0, G_REGEX_ERROR_MALFORMED_PROPERTY); + TEST_NEW_FAIL (?, 0, G_REGEX_ERROR_UNKNOWN_PROPERTY); +#endif + TEST_NEW_FAIL ("\\666", G_REGEX_RAW, G_REGEX_ERROR_INVALID_OCTAL_VALUE); + TEST_NEW_FAIL ("^(?(DEFINE) abc | xyz ) ", 0, G_REGEX_ERROR_TOO_MANY_BRANCHES_IN_DEFINE); + TEST_NEW_FAIL ("a", G_REGEX_NEWLINE_CRLF | G_REGEX_NEWLINE_ANYCRLF, G_REGEX_ERROR_INCONSISTENT_NEWLINE_OPTIONS); + TEST_NEW_FAIL ("^(a)\\g{3", 0, G_REGEX_ERROR_MISSING_BACK_REFERENCE); + TEST_NEW_FAIL ("^(a)\\g{0}", 0, G_REGEX_ERROR_INVALID_RELATIVE_REFERENCE); + TEST_NEW_FAIL ("abc(*FAIL:123)xyz", 0, G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_FORBIDDEN); + TEST_NEW_FAIL ("a(*FOOBAR)b", 0, G_REGEX_ERROR_UNKNOWN_BACKTRACKING_CONTROL_VERB); + TEST_NEW_FAIL ("(?i:A{1,}\\6666666666)", 0, G_REGEX_ERROR_NUMBER_TOO_BIG); + TEST_NEW_FAIL ("(?)(?&)", 0, G_REGEX_ERROR_MISSING_SUBPATTERN_NAME); + TEST_NEW_FAIL ("(?+-a)", 0, G_REGEX_ERROR_MISSING_DIGIT); + TEST_NEW_FAIL ("TA]", G_REGEX_JAVASCRIPT_COMPAT, G_REGEX_ERROR_INVALID_DATA_CHARACTER); + TEST_NEW_FAIL ("(?|(?A)|(?B))", 0, G_REGEX_ERROR_EXTRA_SUBPATTERN_NAME); + TEST_NEW_FAIL ("a(*MARK)b", 0, G_REGEX_ERROR_BACKTRACKING_CONTROL_VERB_ARGUMENT_REQUIRED); + TEST_NEW_FAIL ("^\\c€", 0, G_REGEX_ERROR_INVALID_CONTROL_CHAR); + TEST_NEW_FAIL ("\\k", 0, G_REGEX_ERROR_MISSING_NAME); + TEST_NEW_FAIL ("a[\\NB]c", 0, G_REGEX_ERROR_NOT_SUPPORTED_IN_CLASS); + TEST_NEW_FAIL ("(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFG)XX", 0, G_REGEX_ERROR_NAME_TOO_LONG); + TEST_NEW_FAIL ("\\u0100", G_REGEX_RAW | G_REGEX_JAVASCRIPT_COMPAT, G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE); + + /* These errors can't really be tested sanely: + * G_REGEX_ERROR_EXPRESSION_TOO_LARGE + * G_REGEX_ERROR_MEMORY_ERROR + * G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG + * G_REGEX_ERROR_TOO_MANY_SUBPATTERNS + * G_REGEX_ERROR_TOO_MANY_FORWARD_REFERENCES + * + * These errors are obsolete and never raised by PCRE: + * G_REGEX_ERROR_DEFINE_REPETION + */ + + /* 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("line\nbreak", G_REGEX_MULTILINE, 0, "this is a line\nbreak", -1, 0, 0, TRUE); + TEST_MATCH("line\nbreak", G_REGEX_MULTILINE | G_REGEX_FIRSTLINE, 0, "first line\na line\nbreak", -1, 0, 0, FALSE); + + /* This failed with PCRE 7.2 (gnome bug #455640) */ + TEST_MATCH(".*$", 0, 0, "\xe1\xbb\x85", -1, 0, 0, TRUE); + + /* Test that othercasing in our pcre/glib integration is bug-for-bug compatible + * with pcre's internal tables. Bug #678273 */ + TEST_MATCH("[DŽ]", G_REGEX_CASELESS, 0, "DŽ", -1, 0, 0, TRUE); + TEST_MATCH("[DŽ]", G_REGEX_CASELESS, 0, "Dž", -1, 0, 0, FALSE); + TEST_MATCH("[DŽ]", G_REGEX_CASELESS, 0, "dž", -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", TRUE); + TEST_PARTIAL("(a)+b", "aa", TRUE); + TEST_PARTIAL("a?b", "a", TRUE); + + /* Test soft vs. hard partial matching */ + TEST_PARTIAL_FULL("cat(fish)?", "cat", G_REGEX_MATCH_PARTIAL_SOFT, FALSE); + TEST_PARTIAL_FULL("cat(fish)?", "cat", G_REGEX_MATCH_PARTIAL_HARD, 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"); + TEST_SPLIT_SIMPLE2("\\s", "ab c", "ab", "c"); + TEST_SPLIT_SIMPLE3("\\s*", "ab c", "a", "b", "c"); + /* 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_NUL(string, length, expected) */ + TEST_ESCAPE_NUL("hello world", -1, "hello world"); + TEST_ESCAPE_NUL("hello\0world", -1, "hello"); + TEST_ESCAPE_NUL("\0world", -1, ""); + TEST_ESCAPE_NUL("hello world", 5, "hello"); + TEST_ESCAPE_NUL("hello.world", 11, "hello.world"); + TEST_ESCAPE_NUL("a(b\\b.$", 7, "a(b\\b.$"); + TEST_ESCAPE_NUL("hello\0", 6, "hello\\x00"); + TEST_ESCAPE_NUL("\0world", 6, "\\x00world"); + TEST_ESCAPE_NUL("\0\0", 2, "\\x00\\x00"); + TEST_ESCAPE_NUL("hello\0world", 11, "hello\\x00world"); + TEST_ESCAPE_NUL("hello\0world\0", 12, "hello\\x00world\\x00"); + TEST_ESCAPE_NUL("hello\\\0world", 12, "hello\\x00world"); + TEST_ESCAPE_NUL("hello\\\\\0world", 13, "hello\\\\\\x00world"); + TEST_ESCAPE_NUL("|()[]{}^$*+?.", 13, "|()[]{}^$*+?."); + TEST_ESCAPE_NUL("|()[]{}^$*+?.\\\\", 15, "|()[]{}^$*+?.\\\\"); + + /* 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); + + /* NOTEMPTY matching */ + TEST_MATCH_NOTEMPTY("a?b?", "xyz", FALSE); + TEST_MATCH_NOTEMPTY_ATSTART("a?b?", "xyz", TRUE); + + return g_test_run (); +} diff --git a/glib/tests/rwlock.c b/glib/tests/rwlock.c new file mode 100644 index 0000000..658009d --- /dev/null +++ b/glib/tests/rwlock.c @@ -0,0 +1,287 @@ +/* Unit tests for GRWLock + * Copyright (C) 2011 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +static void +test_rwlock1 (void) +{ + GRWLock lock; + + g_rw_lock_init (&lock); + g_rw_lock_writer_lock (&lock); + g_rw_lock_writer_unlock (&lock); + g_rw_lock_writer_lock (&lock); + g_rw_lock_writer_unlock (&lock); + g_rw_lock_clear (&lock); +} + +static void +test_rwlock2 (void) +{ + static GRWLock lock; + + g_rw_lock_writer_lock (&lock); + g_rw_lock_writer_unlock (&lock); + g_rw_lock_writer_lock (&lock); + g_rw_lock_writer_unlock (&lock); +} + +static void +test_rwlock3 (void) +{ + static GRWLock lock; + gboolean ret; + + ret = g_rw_lock_writer_trylock (&lock); + g_assert (ret); + ret = g_rw_lock_writer_trylock (&lock); + g_assert (!ret); + + g_rw_lock_writer_unlock (&lock); +} + +static void +test_rwlock4 (void) +{ + static GRWLock lock; + + g_rw_lock_reader_lock (&lock); + g_rw_lock_reader_unlock (&lock); + g_rw_lock_reader_lock (&lock); + g_rw_lock_reader_unlock (&lock); +} + +static void +test_rwlock5 (void) +{ + static GRWLock lock; + gboolean ret; + + ret = g_rw_lock_reader_trylock (&lock); + g_assert (ret); + ret = g_rw_lock_reader_trylock (&lock); + g_assert (ret); + + g_rw_lock_reader_unlock (&lock); + g_rw_lock_reader_unlock (&lock); +} + +static void +test_rwlock6 (void) +{ + static GRWLock lock; + gboolean ret; + + g_rw_lock_writer_lock (&lock); + ret = g_rw_lock_reader_trylock (&lock); + g_assert (!ret); + g_rw_lock_writer_unlock (&lock); + + g_rw_lock_reader_lock (&lock); + ret = g_rw_lock_writer_trylock (&lock); + g_assert (!ret); + g_rw_lock_reader_unlock (&lock); +} + + +#define LOCKS 48 +#define ITERATIONS 10000 +#define THREADS 100 + + +GThread *owners[LOCKS]; +GRWLock locks[LOCKS]; + +static void +acquire (gint nr) +{ + GThread *self; + + self = g_thread_self (); + + if (!g_rw_lock_writer_trylock (&locks[nr])) + { + if (g_test_verbose ()) + g_print ("thread %p going to block on lock %d\n", self, nr); + + g_rw_lock_writer_lock (&locks[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_rw_lock_writer_unlock (&locks[nr]); +} + +static gpointer +thread_func (gpointer data) +{ + gint i; + GRand *rand; + + rand = g_rand_new (); + + for (i = 0; i < ITERATIONS; i++) + acquire (g_rand_int_range (rand, 0, LOCKS)); + + g_rand_free (rand); + + return NULL; +} + +static void +test_rwlock7 (void) +{ + gint i; + GThread *threads[THREADS]; + + for (i = 0; i < LOCKS; i++) + g_rw_lock_init (&locks[i]); + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("test", thread_func, NULL); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + for (i = 0; i < LOCKS; i++) + g_rw_lock_clear (&locks[i]); + + for (i = 0; i < LOCKS; i++) + g_assert (owners[i] == NULL); +} + +static gint even; +static GRWLock even_lock; +GThread *writers[2]; +GThread *readers[10]; + +static void +change_even (gpointer data) +{ + g_rw_lock_writer_lock (&even_lock); + + g_assert (even % 2 == 0); + + even += 1; + + if (GPOINTER_TO_INT (data) == 0) + even += 1; + else + even -= 1; + + g_assert (even % 2 == 0); + + g_rw_lock_writer_unlock (&even_lock); +} + +static void +verify_even (gpointer data) +{ + g_rw_lock_reader_lock (&even_lock); + + g_assert (even % 2 == 0); + + g_rw_lock_reader_unlock (&even_lock); +} + +static gpointer +writer_func (gpointer data) +{ + gint i; + + for (i = 0; i < 100000; i++) + change_even (data); + + return NULL; +} + +static gpointer +reader_func (gpointer data) +{ + gint i; + + for (i = 0; i < 100000; i++) + verify_even (data); + + return NULL; +} + +/* This test has 2 writers and 10 readers. + * The writers modify an integer multiple times, + * but always leave it with an even value. + * The readers verify that they can only observe + * even values + */ +static void +test_rwlock8 (void) +{ + gint i; + + even = 0; + g_rw_lock_init (&even_lock); + + for (i = 0; i < 2; i++) + writers[i] = g_thread_new ("a", writer_func, GINT_TO_POINTER (i)); + + for (i = 0; i < 10; i++) + readers[i] = g_thread_new ("b", reader_func, NULL); + + for (i = 0; i < 2; i++) + g_thread_join (writers[i]); + + for (i = 0; i < 10; i++) + g_thread_join (readers[i]); + + g_assert (even % 2 == 0); + + g_rw_lock_clear (&even_lock); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/rwlock1", test_rwlock1); + g_test_add_func ("/thread/rwlock2", test_rwlock2); + g_test_add_func ("/thread/rwlock3", test_rwlock3); + g_test_add_func ("/thread/rwlock4", test_rwlock4); + g_test_add_func ("/thread/rwlock5", test_rwlock5); + g_test_add_func ("/thread/rwlock6", test_rwlock6); + g_test_add_func ("/thread/rwlock7", test_rwlock7); + g_test_add_func ("/thread/rwlock8", test_rwlock8); + + return g_test_run (); +} diff --git a/glib/tests/scannerapi.c b/glib/tests/scannerapi.c new file mode 100644 index 0000000..85cd92c --- /dev/null +++ b/glib/tests/scannerapi.c @@ -0,0 +1,142 @@ +/* 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_assert_cmpint (GPOINTER_TO_INT (g_scanner_lookup_symbol (fix->scanner, "5")), ==, 5); + g_scanner_scope_remove_symbol (fix->scanner, 1, "5"); + g_assert (g_scanner_lookup_symbol (fix->scanner, "5") == NULL); + + 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/glib/tests/sequence.c b/glib/tests/sequence.c new file mode 100644 index 0000000..8b1d64b --- /dev/null +++ b/glib/tests/sequence.c @@ -0,0 +1,1401 @@ +#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); + } +} + +static 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, + LOOKUP, LOOKUP_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 0 + if (g_sequence_get_length (info->sequence) != info->n_items) + g_print ("%d %d\n", + g_sequence_get_length (info->sequence), info->n_items); +#endif + 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 +simple_items_cmp (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) + return -1; + else + return 0; +} + +static gint +simple_iters_cmp (gconstpointer a, + gconstpointer b, + gpointer data) +{ + GSequence *seq = data; + GSequenceIter *iter_a = (GSequenceIter *)a; + GSequenceIter *iter_b = (GSequenceIter *)b; + gpointer item_a = g_sequence_get (iter_a); + gpointer 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 simple_items_cmp (item_a, item_b, data); +} + +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 (gconstpointer d) +{ + guint32 seed = GPOINTER_TO_UINT (d); +#define N_ITERATIONS 60000 +#define N_SEQUENCES 8 +#define N_TIMES 24 + + SequenceInfo sequences[N_SEQUENCES]; + int k; + +#if 0 + g_print (" seed: %u\n", seed); +#endif + + 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; + case LOOKUP: + { + Item *item; + GSequenceIter *lookup_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); + insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL); + g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL); + + lookup_iter = g_sequence_lookup (seq->sequence, item, simple_items_cmp, NULL); + g_assert (simple_iters_cmp (insert_iter, lookup_iter, NULL) == 0); + } + break; + case LOOKUP_ITER: + { + Item *item; + GSequenceIter *lookup_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); + insert_iter = g_sequence_insert_sorted (seq->sequence, item, compare_items, NULL); + g_queue_insert_sorted (seq->queue, insert_iter, compare_iters, NULL); + + lookup_iter = g_sequence_lookup_iter (seq->sequence, item, + (GSequenceIterCompareFunc) simple_iters_cmp, NULL); + g_assert (simple_iters_cmp (insert_iter, lookup_iter, NULL) == 0); + } + 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); + } + + for (k = 0; k < N_SEQUENCES; ++k) + { + g_queue_free (sequences[k].queue); + g_sequence_free (sequences[k].sequence); + sequences[k].n_items = 0; + } +} + +/* Random seeds known to have failed at one point + */ +static gulong seeds[] = + { + 825541564u, + 801678400u, + 1477639090u, + 3369132895u, + 1192944867u, + 770458294u, + 1099575817u, + 590523467u, + 3583571454u, + 579241222u + }; + +/* 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)); + + g_sequence_free (seq); +} + +static void +test_iter_move (void) +{ + GSequence *seq = g_sequence_new (NULL); + GSequenceIter *iter; + gint i; + + for (i = 0; i < 10; ++i) + g_sequence_append (seq, GINT_TO_POINTER (i)); + + iter = g_sequence_get_begin_iter (seq); + iter = g_sequence_iter_move (iter, 5); + g_assert_cmpint (GPOINTER_TO_INT (g_sequence_get (iter)), ==, 5); + + iter = g_sequence_iter_move (iter, -10); + g_assert (g_sequence_iter_is_begin (iter)); + + iter = g_sequence_get_end_iter (seq); + iter = g_sequence_iter_move (iter, -5); + g_assert_cmpint (GPOINTER_TO_INT (g_sequence_get (iter)), ==, 5); + + iter = g_sequence_iter_move (iter, 10); + g_assert (g_sequence_iter_is_end (iter)); + + g_sequence_free (seq); +} + +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); + } + + g_sequence_free (seq); +} + +int +main (int argc, + char **argv) +{ + gint i; + guint32 seed; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + /* Standalone tests */ + g_test_add_func ("/sequence/out-of-range-jump", test_out_of_range_jump); + g_test_add_func ("/sequence/iter-move", test_iter_move); + g_test_add_func ("/sequence/insert-sorted-non-pointer", test_insert_sorted_non_pointer); + g_test_add_func ("/sequence/stable-sort", test_stable_sort); + + /* Regression tests */ + for (i = 0; i < G_N_ELEMENTS (seeds); ++i) + { + path = g_strdup_printf ("/sequence/random/seed:%lu", seeds[i]); + g_test_add_data_func (path, GUINT_TO_POINTER (seeds[i]), run_random_tests); + g_free (path); + } + + /* New random seed */ + seed = g_test_rand_int_range (0, G_MAXINT); + path = g_strdup_printf ("/sequence/random/seed:%u", seed); + g_test_add_data_func (path, GUINT_TO_POINTER (seed), run_random_tests); + g_free (path); + + return g_test_run (); +} + diff --git a/glib/tests/shell.c b/glib/tests/shell.c new file mode 100644 index 0000000..41e9d68 --- /dev/null +++ b/glib/tests/shell.c @@ -0,0 +1,233 @@ +/* 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 _CmdlineTest CmdlineTest; + +struct _CmdlineTest +{ + const gchar *cmdline; + gint argc; + const gchar *argv[10]; + gint error_code; +}; + +static CmdlineTest cmdline_tests[] = +{ + { "foo bar", 2, { "foo", "bar", NULL }, -1 }, + { "foo 'bar'", 2, { "foo", "bar", NULL }, -1 }, + { "foo \"bar\"", 2, { "foo", "bar", NULL }, -1 }, + { "foo '' 'bar'", 3, { "foo", "", "bar", NULL }, -1 }, + { "foo \"bar\"'baz'blah'foo'\\''blah'\"boo\"", 2, { "foo", "barbazblahfoo'blahboo", NULL }, -1 }, + { "foo \t \tblah\tfoo\t\tbar baz", 5, { "foo", "blah", "foo", "bar", "baz", NULL }, -1 }, + { "foo ' spaces more spaces lots of spaces in this ' \t", 2, { "foo", " spaces more spaces lots of spaces in this ", NULL }, -1 }, + { "foo \\\nbar", 2, { "foo", "bar", NULL }, -1 }, + { "foo '' ''", 3, { "foo", "", "", NULL }, -1 }, + { "foo \\\" la la la", 5, { "foo", "\"", "la", "la", "la", NULL }, -1 }, + { "foo \\ foo woo woo\\ ", 4, { "foo", " foo", "woo", "woo ", NULL }, -1 }, + { "foo \"yada yada \\$\\\"\"", 2, { "foo", "yada yada $\"", NULL }, -1 }, + { "foo \"c:\\\\\"", 2, { "foo", "c:\\", NULL }, -1 }, + { "foo # bla bla bla\n bar", 2, { "foo", "bar", NULL }, -1 }, + { "foo a#b", 2, { "foo", "a#b", NULL }, -1 }, + { "#foo", 0, { NULL }, G_SHELL_ERROR_EMPTY_STRING }, + { "foo bar \\", 0, { NULL }, G_SHELL_ERROR_BAD_QUOTING }, + { "foo 'bar baz", 0, { NULL }, G_SHELL_ERROR_BAD_QUOTING }, + { "foo '\"bar\" baz", 0, { NULL }, G_SHELL_ERROR_BAD_QUOTING }, + { "", 0, { NULL }, G_SHELL_ERROR_EMPTY_STRING }, + { " ", 0, { NULL }, G_SHELL_ERROR_EMPTY_STRING }, + { "# foo bar", 0, { NULL }, G_SHELL_ERROR_EMPTY_STRING }, + {"foo '/bar/summer'\\''09 tours.pdf'", 2, {"foo", "/bar/summer'09 tours.pdf", NULL}, -1} +}; + +static gboolean +strv_equal (gchar **a, gchar **b) +{ + gint i; + + if (g_strv_length (a) != g_strv_length (b)) + return FALSE; + + for (i = 0; a[i]; i++) + if (g_strcmp0 (a[i], b[i]) != 0) + return FALSE; + + return TRUE; +} + +static void +do_cmdline_test (gconstpointer d) +{ + const CmdlineTest *test = d; + gint argc; + gchar **argv; + GError *err; + gboolean res; + + err = NULL; +g_print ("test cmdline: %s\n", test->cmdline); + res = g_shell_parse_argv (test->cmdline, &argc, &argv, &err); + if (test->error_code == -1) + { + g_assert (res); + g_assert_cmpint (argc, ==, test->argc); + g_assert (strv_equal (argv, (gchar **)test->argv)); + g_assert_no_error (err); + } + else + { + g_assert (!res); + g_assert_error (err, G_SHELL_ERROR, test->error_code); + } + + if (err) + g_error_free (err); + if (res) + g_strfreev (argv); +} + +typedef struct _QuoteTest QuoteTest; + +struct _QuoteTest +{ + const gchar *in; + const gchar *out; +}; + +static QuoteTest quote_tests[] = +{ + { "", "''" }, + { "a", "'a'" }, + { "(", "'('" }, + { "'", "''\\'''" }, + { "'a", "''\\''a'" }, + { "a'", "'a'\\'''" }, + { "a'a", "'a'\\''a'" } +}; + +static void +do_quote_test (gconstpointer d) +{ + const QuoteTest *test = d; + gchar *out; + + out = g_shell_quote (test->in); + g_assert_cmpstr (out, ==, test->out); + g_free (out); +} + +typedef struct _UnquoteTest UnquoteTest; + +struct _UnquoteTest +{ + const gchar *in; + const gchar *out; + gint error_code; +}; + +static UnquoteTest unquote_tests[] = +{ + { "", "", -1 }, + { "a", "a", -1 }, + { "'a'", "a", -1 }, + { "'('", "(", -1 }, + { "''\\'''", "'", -1 }, + { "''\\''a'", "'a", -1 }, + { "'a'\\'''", "a'", -1 }, + { "'a'\\''a'", "a'a", -1 }, + { "\\\\", "\\", -1 }, + { "\\\n", "", -1 }, + { "'\\''", NULL, G_SHELL_ERROR_BAD_QUOTING }, + { "\"\\\"\"", "\"", -1 }, + { "\"", NULL, G_SHELL_ERROR_BAD_QUOTING }, + { "'", NULL, G_SHELL_ERROR_BAD_QUOTING }, + { "\x22\\\\\"", "\\", -1 }, + { "\x22\\`\"", "`", -1 }, + { "\x22\\$\"", "$", -1 }, + { "\x22\\\n\"", "\n", -1 }, + { "\"\\'\"", "\\'", -1 }, + { "\x22\\\r\"", "\\\r", -1 }, + { "\x22\\n\"", "\\n", -1 } +}; + +static void +do_unquote_test (gconstpointer d) +{ + const UnquoteTest *test = d; + gchar *out; + GError *error; + + error = NULL; + out = g_shell_unquote (test->in, &error); + g_assert_cmpstr (out, ==, test->out); + if (test->error_code == -1) + g_assert_no_error (error); + else + g_assert_error (error, G_SHELL_ERROR, test->error_code); + + g_free (out); + if (error) + g_error_free (error); +} + +int +main (int argc, char *argv[]) +{ + gint i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; i < G_N_ELEMENTS (cmdline_tests); i++) + { + path = g_strdup_printf ("/shell/cmdline/%d", i); + g_test_add_data_func (path, &cmdline_tests[i], do_cmdline_test); + g_free (path); + } + + for (i = 0; i < G_N_ELEMENTS (quote_tests); i++) + { + path = g_strdup_printf ("/shell/quote/%d", i); + g_test_add_data_func (path, "e_tests[i], do_quote_test); + g_free (path); + } + + for (i = 0; i < G_N_ELEMENTS (unquote_tests); i++) + { + path = g_strdup_printf ("/shell/unquote/%d", i); + g_test_add_data_func (path, &unquote_tests[i], do_unquote_test); + g_free (path); + } + + return g_test_run (); +} diff --git a/glib/tests/slice.c b/glib/tests/slice.c new file mode 100644 index 0000000..50bbed1 --- /dev/null +++ b/glib/tests/slice.c @@ -0,0 +1,34 @@ +#include + +/* We test deprecated functionality here */ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + +static void +test_slice_config (void) +{ + if (!g_test_undefined ()) + return; + + if (g_test_trap_fork (1000000, G_TEST_TRAP_SILENCE_STDERR)) + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, TRUE); + + g_test_trap_assert_failed (); +} + +int +main (int argc, char **argv) +{ + /* have to do this before using gtester since it uses gslice */ + gboolean was; + + was = g_slice_get_config (G_SLICE_CONFIG_ALWAYS_MALLOC); + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, !was); + g_assert_cmpint (g_slice_get_config (G_SLICE_CONFIG_ALWAYS_MALLOC), !=, was); + g_slice_set_config (G_SLICE_CONFIG_ALWAYS_MALLOC, was); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/slice/config", test_slice_config); + + return g_test_run (); +} diff --git a/glib/tests/slist.c b/glib/tests/slist.c new file mode 100644 index 0000000..482d76a --- /dev/null +++ b/glib/tests/slist.c @@ -0,0 +1,352 @@ +#include + +#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; + + 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)); + } + + g_slist_free (slist); +} + +static void +test_slist_sort_with_data (void) +{ + GSList *slist = NULL; + gint i; + + 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)); + } + + g_slist_free (slist); +} + +static void +test_slist_insert_sorted (void) +{ + GSList *slist = NULL; + gint i; + + 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)); + } + + g_slist_free (slist); +} + +static void +test_slist_insert_sorted_with_data (void) +{ + GSList *slist = NULL; + gint i; + + 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)); + } + + g_slist_free (slist); +} + +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; + + 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; + + 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); +} + +static void +test_slist_remove (void) +{ + GSList *slist = NULL; + GSList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + { + slist = g_slist_append (slist, &nums[i]); + slist = g_slist_append (slist, &nums[i]); + } + + g_assert_cmpint (g_slist_length (slist), ==, 20); + + for (i = 0; i < 10; i++) + { + slist = g_slist_remove (slist, &nums[i]); + } + + g_assert_cmpint (g_slist_length (slist), ==, 10); + + for (i = 0; i < 10; i++) + { + st = g_slist_nth (slist, i); + g_assert (*((gint*) st->data) == i); + } + + g_slist_free (slist); +} + +static void +test_slist_remove_all (void) +{ + GSList *slist = NULL; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + { + slist = g_slist_append (slist, &nums[i]); + slist = g_slist_append (slist, &nums[i]); + } + + g_assert_cmpint (g_slist_length (slist), ==, 20); + + for (i = 0; i < 10; i++) + { + slist = g_slist_remove_all (slist, &nums[2 * i + 1]); + slist = g_slist_remove_all (slist, &nums[8 - 2 * i]); + } + + g_assert_cmpint (g_slist_length (slist), ==, 0); + g_assert (slist == NULL); +} + +static void +test_slist_insert (void) +{ + GSList *slist = NULL; + GSList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + slist = g_slist_insert_before (NULL, NULL, &nums[1]); + slist = g_slist_insert (slist, &nums[3], 1); + slist = g_slist_insert (slist, &nums[4], -1); + slist = g_slist_insert (slist, &nums[0], 0); + slist = g_slist_insert (slist, &nums[5], 100); + slist = g_slist_insert_before (slist, NULL, &nums[6]); + slist = g_slist_insert_before (slist, slist->next->next, &nums[2]); + + slist = g_slist_insert (slist, &nums[9], 7); + slist = g_slist_insert (slist, &nums[8], 7); + slist = g_slist_insert (slist, &nums[7], 7); + + for (i = 0; i < 10; i++) + { + st = g_slist_nth (slist, i); + g_assert (*((gint*) st->data) == i); + } + + g_slist_free (slist); + + slist = g_slist_insert (NULL, "a", 1); + g_assert (slist->data == (gpointer)"a"); + g_assert (slist->next == NULL); + g_slist_free (slist); + + slist = g_slist_append (NULL, "a"); + slist = g_slist_append (slist, "b"); + slist = g_slist_insert (slist, "c", 5); + + g_assert (slist->next->next->data == (gpointer)"c"); + g_assert (slist->next->next->next == NULL); + g_slist_free (slist); + + slist = g_slist_append (NULL, "a"); + slist = g_slist_insert_before (slist, slist, "b"); + g_assert (slist->data == (gpointer)"b"); + g_assert (slist->next->data == (gpointer)"a"); + g_assert (slist->next->next == NULL); + g_slist_free (slist); +} + +static gint +find_num (gconstpointer l, gconstpointer data) +{ + return *(gint*)l - GPOINTER_TO_INT(data); +} + +static void +test_slist_position (void) +{ + GSList *slist = NULL; + GSList *st; + gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + gint i; + + for (i = 0; i < 10; i++) + { + slist = g_slist_append (slist, &nums[i]); + } + + g_assert_cmpint (g_slist_index (slist, NULL), ==, -1); + g_assert_cmpint (g_slist_position (slist, NULL), ==, -1); + + for (i = 0; i < 10; i++) + { + g_assert_cmpint (g_slist_index (slist, &nums[i]), ==, i); + st = g_slist_find_custom (slist, GINT_TO_POINTER(i), find_num); + g_assert (st != NULL); + g_assert_cmpint (g_slist_position (slist, st), ==, i); + } + + st = g_slist_find_custom (slist, GINT_TO_POINTER (1000), find_num); + g_assert (st == NULL); + + g_slist_free (slist); +} + +static void +test_slist_concat (void) +{ + GSList *s1, *s2, *s; + + s1 = g_slist_append (NULL, "a"); + s2 = g_slist_append (NULL, "b"); + s = g_slist_concat (s1, s2); + g_assert (s->data == (gpointer)"a"); + g_assert (s->next->data == (gpointer)"b"); + g_assert (s->next->next == NULL); + g_slist_free (s); + + s1 = g_slist_append (NULL, "a"); + + s = g_slist_concat (NULL, s1); + g_assert_cmpint (g_slist_length (s), ==, 1); + s = g_slist_concat (s1, NULL); + g_assert_cmpint (g_slist_length (s), ==, 1); + + g_slist_free (s); + + s = g_slist_concat (NULL, NULL); + g_assert (s == NULL); +} + +int +main (int argc, char *argv[]) +{ + gint i; + + g_test_init (&argc, &argv, NULL); + + /* Create an array of random numbers. */ + for (i = 0; i < SIZE; i++) + array[i] = g_test_rand_int_range (NUMBER_MIN, NUMBER_MAX); + + g_test_add_func ("/slist/sort", test_slist_sort); + g_test_add_func ("/slist/sort-with-data", test_slist_sort_with_data); + g_test_add_func ("/slist/insert-sorted", test_slist_insert_sorted); + g_test_add_func ("/slist/insert-sorted-with-data", test_slist_insert_sorted_with_data); + g_test_add_func ("/slist/reverse", test_slist_reverse); + g_test_add_func ("/slist/nth", test_slist_nth); + g_test_add_func ("/slist/remove", test_slist_remove); + g_test_add_func ("/slist/remove-all", test_slist_remove_all); + g_test_add_func ("/slist/insert", test_slist_insert); + g_test_add_func ("/slist/position", test_slist_position); + g_test_add_func ("/slist/concat", test_slist_concat); + + return g_test_run (); +} diff --git a/glib/tests/sort.c b/glib/tests/sort.c new file mode 100644 index 0000000..ef6af50 --- /dev/null +++ b/glib/tests/sort.c @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2011 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 + +static int +int_compare_data (gconstpointer p1, gconstpointer p2, gpointer data) +{ + const gint *i1 = p1; + const gint *i2 = p2; + + return *i1 - *i2; +} + +static void +test_sort_basic (void) +{ + gint *data; + gint i; + + data = g_malloc (10000 * sizeof (int)); + for (i = 0; i < 10000; i++) + { + data[i] = g_random_int_range (0, 10000); + } + + g_qsort_with_data (data, 10000, sizeof (int), int_compare_data, NULL); + + for (i = 1; i < 10000; i++) + g_assert_cmpint (data[i -1], <=, data[i]); + + g_free (data); +} + +typedef struct { + int val; + int i; +} SortItem; + +typedef struct { + int val; + int i; + int data[16]; +} BigItem; + +static int +item_compare_data (gconstpointer p1, gconstpointer p2, gpointer data) +{ + const SortItem *i1 = p1; + const SortItem *i2 = p2; + + return i1->val - i2->val; +} + +static void +test_sort_stable (void) +{ + SortItem *data; + gint i; + + data = g_malloc (10000 * sizeof (SortItem)); + for (i = 0; i < 10000; i++) + { + data[i].val = g_random_int_range (0, 10000); + data[i].i = i; + } + + g_qsort_with_data (data, 10000, sizeof (SortItem), item_compare_data, NULL); + + for (i = 1; i < 10000; i++) + { + g_assert_cmpint (data[i -1].val, <=, data[i].val); + if (data[i -1].val == data[i].val) + g_assert_cmpint (data[i -1].i, <, data[i].i); + } + g_free (data); +} + +static void +test_sort_big (void) +{ + BigItem *data; + gint i; + + data = g_malloc (10000 * sizeof (BigItem)); + for (i = 0; i < 10000; i++) + { + data[i].val = g_random_int_range (0, 10000); + data[i].i = i; + } + + g_qsort_with_data (data, 10000, sizeof (BigItem), item_compare_data, NULL); + + for (i = 1; i < 10000; i++) + { + g_assert_cmpint (data[i -1].val, <=, data[i].val); + if (data[i -1].val == data[i].val) + g_assert_cmpint (data[i -1].i, <, data[i].i); + } + g_free (data); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/sort/basic", test_sort_basic); + g_test_add_func ("/sort/stable", test_sort_stable); + g_test_add_func ("/sort/big", test_sort_big); + + return g_test_run (); +} + diff --git a/glib/tests/spawn-multithreaded.c b/glib/tests/spawn-multithreaded.c new file mode 100644 index 0000000..baccf36 --- /dev/null +++ b/glib/tests/spawn-multithreaded.c @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2011 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. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include +#include + +static char *echo_prog_path; + +static void +multithreaded_test_run (GThreadFunc function) +{ + int i; + GPtrArray *threads = g_ptr_array_new (); + guint n_threads; + + /* Limit to 64, otherwise we may hit file descriptor limits and such */ + n_threads = MIN (g_get_num_processors () * 2, 64); + + for (i = 0; i < n_threads; i++) + { + GThread *thread; + + thread = g_thread_new ("test", function, GINT_TO_POINTER (i)); + g_ptr_array_add (threads, thread); + } + + for (i = 0; i < n_threads; i++) + { + gpointer ret; + ret = g_thread_join (g_ptr_array_index (threads, i)); + g_assert_cmpint (GPOINTER_TO_INT (ret), ==, i); + } + g_ptr_array_free (threads, TRUE); +} + +static gpointer +test_spawn_sync_multithreaded_instance (gpointer data) +{ + int tnum = GPOINTER_TO_INT (data); + GError *error = NULL; + GPtrArray *argv; + char *arg; + char *stdout_str; + int estatus; + + arg = g_strdup_printf ("thread %d", tnum); + + argv = g_ptr_array_new (); + g_ptr_array_add (argv, echo_prog_path); + g_ptr_array_add (argv, arg); + g_ptr_array_add (argv, NULL); + + g_spawn_sync (NULL, (char**)argv->pdata, NULL, 0, NULL, NULL, &stdout_str, NULL, &estatus, &error); + g_assert_no_error (error); + g_assert_cmpstr (arg, ==, stdout_str); + g_free (arg); + g_free (stdout_str); + g_ptr_array_free (argv, TRUE); + + return GINT_TO_POINTER (tnum); +} + +static void +test_spawn_sync_multithreaded (void) +{ + multithreaded_test_run (test_spawn_sync_multithreaded_instance); +} + +typedef struct { + GMainLoop *loop; + gboolean child_exited; + gboolean stdout_done; + GString *stdout_buf; +} SpawnAsyncMultithreadedData; + +static gboolean +on_child_exited (GPid pid, + gint status, + gpointer datap) +{ + SpawnAsyncMultithreadedData *data = datap; + + data->child_exited = TRUE; + if (data->child_exited && data->stdout_done) + g_main_loop_quit (data->loop); + + return G_SOURCE_REMOVE; +} + +static gboolean +on_child_stdout (GIOChannel *channel, + GIOCondition condition, + gpointer datap) +{ + char buf[1024]; + GError *error = NULL; + gsize bytes_read; + GIOStatus status; + SpawnAsyncMultithreadedData *data = datap; + + 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->stdout_buf, buf, (gssize) bytes_read); + if (bytes_read == sizeof (buf)) + goto read; + } + else if (status == G_IO_STATUS_EOF) + { + g_string_append_len (data->stdout_buf, buf, (gssize) bytes_read); + data->stdout_done = TRUE; + } + else if (status == G_IO_STATUS_ERROR) + { + g_error ("Error reading from child stdin: %s", error->message); + } + + if (data->child_exited && data->stdout_done) + g_main_loop_quit (data->loop); + + return !data->stdout_done; +} + +static gpointer +test_spawn_async_multithreaded_instance (gpointer thread_data) +{ + int tnum = GPOINTER_TO_INT (thread_data); + GError *error = NULL; + GPtrArray *argv; + char *arg; + GPid pid; + GMainContext *context; + GMainLoop *loop; + GIOChannel *channel; + GSource *source; + int child_stdout_fd; + SpawnAsyncMultithreadedData data; + + context = g_main_context_new (); + loop = g_main_loop_new (context, TRUE); + + arg = g_strdup_printf ("thread %d", tnum); + + argv = g_ptr_array_new (); + g_ptr_array_add (argv, echo_prog_path); + g_ptr_array_add (argv, arg); + g_ptr_array_add (argv, NULL); + + g_spawn_async_with_pipes (NULL, (char**)argv->pdata, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, + &child_stdout_fd, NULL, &error); + g_assert_no_error (error); + g_ptr_array_free (argv, TRUE); + + data.loop = loop; + data.stdout_done = FALSE; + data.child_exited = FALSE; + data.stdout_buf = g_string_new (0); + + source = g_child_watch_source_new (pid); + g_source_set_callback (source, (GSourceFunc)on_child_exited, &data, NULL); + g_source_attach (source, context); + g_source_unref (source); + + channel = g_io_channel_unix_new (child_stdout_fd); + source = g_io_create_watch (channel, G_IO_IN | G_IO_HUP); + g_source_set_callback (source, (GSourceFunc)on_child_stdout, &data, NULL); + g_source_attach (source, context); + g_source_unref (source); + + g_main_loop_run (loop); + + g_assert (data.child_exited); + g_assert (data.stdout_done); + g_assert_cmpstr (data.stdout_buf->str, ==, arg); + g_string_free (data.stdout_buf, TRUE); + + g_io_channel_unref (channel); + g_main_context_unref (context); + g_main_loop_unref (loop); + + g_free (arg); + + return GINT_TO_POINTER (tnum); +} + +static void +test_spawn_async_multithreaded (void) +{ + multithreaded_test_run (test_spawn_async_multithreaded_instance); +} + +int +main (int argc, + char *argv[]) +{ + char *dirname; + int ret; + + g_test_init (&argc, &argv, NULL); + + dirname = g_path_get_dirname (argv[0]); + echo_prog_path = g_build_filename (dirname, "test-spawn-echo", NULL); + if (!g_file_test (echo_prog_path, G_FILE_TEST_EXISTS)) + { + g_free (echo_prog_path); + echo_prog_path = g_build_filename (dirname, "lt-test-spawn-echo", NULL); + } + g_free (dirname); + + g_assert (g_file_test (echo_prog_path, G_FILE_TEST_EXISTS)); + + g_test_add_func ("/gthread/spawn-sync", test_spawn_sync_multithreaded); + g_test_add_func ("/gthread/spawn-async", test_spawn_async_multithreaded); + + ret = g_test_run(); + + g_free (echo_prog_path); + + return ret; +} diff --git a/glib/tests/spawn-singlethread.c b/glib/tests/spawn-singlethread.c new file mode 100644 index 0000000..4898b72 --- /dev/null +++ b/glib/tests/spawn-singlethread.c @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2011 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. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include +#include + +static char *echo_prog_path; +static char *echo_script_path; + +typedef struct { + GMainLoop *loop; + gboolean child_exited; + gboolean stdout_done; + GString *stdout_buf; +} SpawnAsyncMultithreadedData; + +static gboolean +on_child_exited (GPid pid, + gint status, + gpointer datap) +{ + SpawnAsyncMultithreadedData *data = datap; + + data->child_exited = TRUE; + if (data->child_exited && data->stdout_done) + g_main_loop_quit (data->loop); + + return G_SOURCE_REMOVE; +} + +static gboolean +on_child_stdout (GIOChannel *channel, + GIOCondition condition, + gpointer datap) +{ + char buf[1024]; + GError *error = NULL; + gsize bytes_read; + SpawnAsyncMultithreadedData *data = datap; + + if (condition & G_IO_IN) + { + GIOStatus status; + status = g_io_channel_read_chars (channel, buf, sizeof (buf), &bytes_read, &error); + g_assert_no_error (error); + g_string_append_len (data->stdout_buf, buf, (gssize) bytes_read); + if (status == G_IO_STATUS_EOF) + data->stdout_done = TRUE; + } + if (condition & G_IO_HUP) + data->stdout_done = TRUE; + if (condition & G_IO_ERR) + g_error ("Error reading from child stdin"); + + if (data->child_exited && data->stdout_done) + g_main_loop_quit (data->loop); + + return !data->stdout_done; +} + +static void +test_spawn_async (void) +{ + int tnum = 1; + GError *error = NULL; + GPtrArray *argv; + char *arg; + GPid pid; + GMainContext *context; + GMainLoop *loop; + GIOChannel *channel; + GSource *source; + int child_stdout_fd; + SpawnAsyncMultithreadedData data; + + context = g_main_context_new (); + loop = g_main_loop_new (context, TRUE); + + arg = g_strdup_printf ("thread %d", tnum); + + argv = g_ptr_array_new (); + g_ptr_array_add (argv, echo_prog_path); + g_ptr_array_add (argv, arg); + g_ptr_array_add (argv, NULL); + + g_spawn_async_with_pipes (NULL, (char**)argv->pdata, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL, + &child_stdout_fd, NULL, &error); + g_assert_no_error (error); + g_ptr_array_free (argv, TRUE); + + data.loop = loop; + data.stdout_done = FALSE; + data.child_exited = FALSE; + data.stdout_buf = g_string_new (0); + + source = g_child_watch_source_new (pid); + g_source_set_callback (source, (GSourceFunc)on_child_exited, &data, NULL); + g_source_attach (source, context); + g_source_unref (source); + + channel = g_io_channel_unix_new (child_stdout_fd); + source = g_io_create_watch (channel, G_IO_IN | G_IO_HUP | G_IO_ERR); + g_source_set_callback (source, (GSourceFunc)on_child_stdout, &data, NULL); + g_source_attach (source, context); + g_source_unref (source); + + g_main_loop_run (loop); + + g_assert (data.child_exited); + g_assert (data.stdout_done); + g_assert_cmpstr (data.stdout_buf->str, ==, arg); + g_string_free (data.stdout_buf, TRUE); + + g_io_channel_unref (channel); + g_main_context_unref (context); + g_main_loop_unref (loop); + + g_free (arg); +} + +static void +test_spawn_sync (void) +{ + int tnum = 1; + GError *error = NULL; + GPtrArray *argv; + char *arg; + char *stdout_str; + int estatus; + + arg = g_strdup_printf ("thread %d", tnum); + + argv = g_ptr_array_new (); + g_ptr_array_add (argv, echo_prog_path); + g_ptr_array_add (argv, arg); + g_ptr_array_add (argv, NULL); + + g_spawn_sync (NULL, (char**)argv->pdata, NULL, 0, NULL, NULL, &stdout_str, NULL, &estatus, &error); + g_assert_no_error (error); + g_assert_cmpstr (arg, ==, stdout_str); + g_free (arg); + g_free (stdout_str); + g_ptr_array_free (argv, TRUE); +} + +static void +test_spawn_script (void) +{ + GError *error = NULL; + GPtrArray *argv; + char *stdout_str; + int estatus; + + argv = g_ptr_array_new (); + g_ptr_array_add (argv, echo_script_path); + g_ptr_array_add (argv, NULL); + + g_spawn_sync (NULL, (char**)argv->pdata, NULL, 0, NULL, NULL, &stdout_str, NULL, &estatus, &error); + g_assert_no_error (error); + g_assert_cmpstr ("echo\n", ==, stdout_str); + g_free (stdout_str); + g_ptr_array_free (argv, TRUE); +} + +int +main (int argc, + char *argv[]) +{ + char *dirname; + int ret; + + g_test_init (&argc, &argv, NULL); + + dirname = g_path_get_dirname (argv[0]); + echo_prog_path = g_build_filename (dirname, "test-spawn-echo", NULL); + if (!g_file_test (echo_prog_path, G_FILE_TEST_EXISTS)) + { + g_free (echo_prog_path); + echo_prog_path = g_build_filename (dirname, "lt-test-spawn-echo", NULL); + } +#ifndef SRCDIR +#define SRCDIR dirname +#endif + echo_script_path = g_build_filename (SRCDIR, "echo-script", NULL); + if (!g_file_test (echo_script_path, G_FILE_TEST_EXISTS)) + { + gchar *tmp; + /* strip .libs */ + tmp = g_path_get_dirname (dirname); + g_free (echo_script_path); + echo_script_path = g_build_filename (tmp, "echo-script", NULL); + g_free (tmp); + } + g_free (dirname); + + g_assert (g_file_test (echo_prog_path, G_FILE_TEST_EXISTS)); + g_assert (g_file_test (echo_script_path, G_FILE_TEST_EXISTS)); + + g_test_add_func ("/gthread/spawn-single-sync", test_spawn_sync); + g_test_add_func ("/gthread/spawn-single-async", test_spawn_async); + g_test_add_func ("/gthread/spawn-script", test_spawn_script); + + ret = g_test_run(); + + g_free (echo_script_path); + g_free (echo_prog_path); + + return ret; +} diff --git a/glib/tests/strfuncs.c b/glib/tests/strfuncs.c new file mode 100644 index 0000000..f0ea4a2 --- /dev/null +++ b/glib/tests/strfuncs.c @@ -0,0 +1,1367 @@ +/* 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. + */ + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#define _XOPEN_SOURCE 600 +#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); + + g_assert (g_strconcat (NULL, "bla", NULL) == NULL); +} + +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_undefined ()) + { + gchar *ret; + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + str = g_strcanon (NULL, "ab", 'y'); + g_test_assert_expected_messages (); + g_assert (str == NULL); + + str = g_strdup ("abxabxab"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + ret = g_strcanon (str, NULL, 'y'); + g_test_assert_expected_messages (); + g_assert (ret == NULL); + g_free (str); + } + + 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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + str = g_strcompress (NULL); + g_test_assert_expected_messages (); + g_assert (str == NULL); + + /* trailing slashes are not allowed */ + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "*trailing \\*"); + str = g_strcompress ("abc\\"); + g_test_assert_expected_messages (); + g_assert_cmpstr (str, ==, "abc"); + g_free (str); + } + + str = g_strcompress ("abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313\\12345z"); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\"\b\f\n\r\t\v\003\177\234\313\12345z"); + g_free (str); + + /* test escape */ + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + str = g_strescape (NULL, NULL); + g_test_assert_expected_messages (); + g_assert (str == NULL); + } + + str = g_strescape ("abc\\\"\b\f\n\r\t\v\003\177\234\313", NULL); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313"); + g_free (str); + + str = g_strescape ("abc\\\"\b\f\n\r\t\v\003\177\234\313", + "\b\f\001\002\003\004"); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\\\\\"\b\f\\n\\r\\t\\v\003\\177\\234\\313"); + g_free (str); + + /* round trip */ + tmp = g_strescape ("abc\\\"\b\f\n\r\t\v\003\177\234\313", NULL); + str = g_strcompress (tmp); + g_assert (str != NULL); + g_assert_cmpstr (str, ==, "abc\\\"\b\f\n\r\t\v\003\177\234\313"); + g_free (str); + g_free (tmp); +} + +static void +test_ascii_strcasecmp (void) +{ + gboolean res; + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_ascii_strcasecmp ("foo", NULL); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_ascii_strcasecmp (NULL, "foo"); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + } + + 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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + g_strchug (NULL); + g_test_assert_expected_messages (); + } + + 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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + g_strchomp (NULL); + g_test_assert_expected_messages (); + } + + 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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + str = g_strreverse (NULL); + g_test_assert_expected_messages (); + g_assert (str == NULL); + } + + 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_strncasecmp (void) +{ + g_assert (g_strncasecmp ("abc1", "ABC2", 3) == 0); + g_assert (g_strncasecmp ("abc1", "ABC2", 4) != 0); +} + +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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_str_has_prefix ("foo", NULL); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_str_has_prefix (NULL, "foo"); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + } + + 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_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_str_has_suffix ("foo", NULL); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + res = g_str_has_suffix (NULL, "foo"); + g_test_assert_expected_messages (); + g_assert (res == FALSE); + } + + 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) +{ + gchar **strv; + guint l; + + if (g_test_undefined ()) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*!= NULL*"); + l = g_strv_length (NULL); + g_test_assert_expected_messages (); + g_assert_cmpint (l, ==, 0); + } + + strv = g_strsplit ("1,2,3,4", ",", -1); + l = g_strv_length (strv); + g_assert_cmpuint (l, ==, 4); + g_strfreev (strv); +} + +static char *locales[] = {"sv_SE", "en_US", "fa_IR", "C", "ru_RU"}; + +static 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++) + { + gchar *end = "(unset)"; + + setlocale (LC_NUMERIC, locales[l]); + d = g_ascii_strtod (number, &end); + g_assert (isnan (res) ? isnan (d) : (d == res)); + g_assert ((end - number) == (check_end ? correct_len : strlen (number))); + } + + 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++) + { + setlocale (LC_ALL, 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); + check_strtod_string ("0xa.b", 10.6875, TRUE, 5); + check_strtod_string ("0xa.bP3", 85.5, TRUE, 7); + check_strtod_string ("0xa.bp+3", 85.5, TRUE, 8); + check_strtod_string ("0xa.bp-2", 2.671875, TRUE, 8); + check_strtod_string ("0xA.BG", 10.6875, TRUE, 5); + /* 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_unref (before); + g_mapped_file_unref (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, ""); + + tmp = g_ascii_strup (string, 4096); + tmp2 = g_ascii_strup (tmp, 4096); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp, 4096), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp2, 4096), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (tmp, tmp2, 4096), ==, 0); + g_free (tmp); + g_free (tmp2); + + tmp = g_ascii_strdown (string, 4096); + tmp2 = g_ascii_strdown (tmp, 4096); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp, 4096), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp2, 4096), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (tmp, tmp2, 4096), ==, 0); + g_free (tmp); + g_free (tmp2); + + 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); + + tmp = g_ascii_strdown (string, -1); + tmp2 = g_ascii_strdown (tmp, -1); + g_assert_cmpint (strlen(tmp), ==, strlen(tmp2)); + g_assert_cmpint (strlen(string), ==, strlen(tmp)); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp, -1), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp2, -1), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (tmp, tmp2, -1), ==, 0); + g_free (tmp); + g_free (tmp2); + + tmp = g_ascii_strup (string, -1); + tmp2 = g_ascii_strup (string, -1); + g_assert_cmpint (strlen(tmp), ==, strlen(tmp2)); + g_assert_cmpint (strlen(string), ==, strlen(tmp)); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp, -1), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (string, tmp2, -1), ==, 0); + g_assert_cmpint (g_ascii_strncasecmp (tmp, tmp2, -1), ==, 0); + g_free (tmp); + g_free (tmp2); + + 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_unref (file); +} + +static void +test_strip_context (void) +{ + const gchar *msgid; + const gchar *msgval; + const gchar *s; + + + msgid = "blabla"; + msgval = "bla"; + s = g_strip_context (msgid, msgval); + g_assert (s == msgval); + + msgid = msgval = "blabla"; + s = g_strip_context (msgid, msgval); + g_assert (s == msgval); + + msgid = msgval = "blabla|foo"; + s = g_strip_context (msgid, msgval); + g_assert (s == msgval + 7); + + msgid = msgval = "blabla||bar"; + s = g_strip_context (msgid, msgval); + g_assert (s == msgval + 7); +} + +static void +test_strerror (void) +{ + gint i; + const gchar *str; + + for (i = 1; i < 100; i++) + { + str = g_strerror (i); + g_assert (str != NULL); + g_assert (g_utf8_validate (str, -1, NULL)); + } +} + +static void +test_strsignal (void) +{ + gint i; + const gchar *str; + + for (i = 1; i < 20; i++) + { + str = g_strsignal (i); + g_assert (str != NULL); + g_assert (g_utf8_validate (str, -1, NULL)); + } +} + +static void +test_strup (void) +{ + gchar *s; + + s = g_strdup ("lower"); + g_assert_cmpstr (g_strup (s), ==, "LOWER"); + g_assert_cmpstr (g_strdown (s), ==, "lower"); + g_assert (g_strcasecmp ("lower", "LOWER") == 0); + g_free (s); +} + +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/strncasecmp", test_strncasecmp); + 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); + g_test_add_func ("/strfuncs/strip-context", test_strip_context); + g_test_add_func ("/strfuncs/strerror", test_strerror); + g_test_add_func ("/strfuncs/strsignal", test_strsignal); + g_test_add_func ("/strfuncs/strup", test_strup); + + return g_test_run(); +} diff --git a/glib/tests/string.c b/glib/tests/string.c new file mode 100644 index 0000000..ba55d3d --- /dev/null +++ b/glib/tests/string.c @@ -0,0 +1,524 @@ +/* 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. + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#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_clear (string_chunk); + 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); + + string1 = g_string_new_len ("foo", -1); + string2 = g_string_new_len ("foobar", 3); + + g_assert_cmpstr (string1->str, ==, "foo"); + g_assert_cmpint (string1->len, ==, 3); + g_assert_cmpstr (string2->str, ==, "foo"); + g_assert_cmpint (string2->len, ==, 3); + + g_string_free (string1, TRUE); + g_string_free (string2, TRUE); +} + +G_GNUC_PRINTF(2, 3) +static void +my_string_printf (GString *string, + const gchar *format, + ...) +{ + va_list args; + + va_start (args, format); + g_string_vprintf (string, format, args); + va_end (args); +} + +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); + + string = g_string_new (NULL); + g_string_printf (string, "bla %s %d", "foo", 99); + g_assert_cmpstr (string->str, ==, "bla foo 99"); + my_string_printf (string, "%d,%s,%d", 1, "two", 3); + g_assert_cmpstr (string->str, ==, "1,two,3"); + + 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++) + if (i % 2) + g_string_append_c (string, 'a'+(i%26)); + else + (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_overwrite_len (string, 4, "BLABL", 0); + g_assert (g_str_equal ("test NOT-blabla", string->str)); + g_string_overwrite_len (string, 4, "BLABL", -1); + g_assert (g_str_equal ("testBLABLblabla", 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); +} + +static void +test_string_up_down (void) +{ + GString *s; + + s = g_string_new ("Mixed Case String !?"); + g_string_ascii_down (s); + g_assert_cmpstr (s->str, ==, "mixed case string !?"); + + g_string_assign (s, "Mixed Case String !?"); + g_string_down (s); + g_assert_cmpstr (s->str, ==, "mixed case string !?"); + + g_string_assign (s, "Mixed Case String !?"); + g_string_ascii_up (s); + g_assert_cmpstr (s->str, ==, "MIXED CASE STRING !?"); + + g_string_assign (s, "Mixed Case String !?"); + g_string_up (s); + g_assert_cmpstr (s->str, ==, "MIXED CASE STRING !?"); + + g_string_free (s, TRUE); +} + +static void +test_string_set_size (void) +{ + GString *s; + + s = g_string_new ("foo"); + g_string_set_size (s, 30); + + g_assert_cmpstr (s->str, ==, "foo"); + g_assert_cmpint (s->len, ==, 30); + + g_string_free (s, TRUE); +} + +static void +test_string_to_bytes (void) +{ + GString *s; + GBytes *bytes; + gconstpointer byte_data; + gsize byte_len; + + s = g_string_new ("foo"); + g_string_append (s, "-bar"); + + bytes = g_string_free_to_bytes (s); + + byte_data = g_bytes_get_data (bytes, &byte_len); + + g_assert_cmpint (byte_len, ==, 7); + + g_assert_cmpint (memcmp (byte_data, "foo-bar", byte_len), ==, 0); + + g_bytes_unref (bytes); +} + +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); + g_test_add_func ("/string/test-string-up-down", test_string_up_down); + g_test_add_func ("/string/test-string-set-size", test_string_set_size); + g_test_add_func ("/string/test-string-to-bytes", test_string_to_bytes); + + return g_test_run(); +} diff --git a/glib/tests/test-printf.c b/glib/tests/test-printf.c new file mode 100644 index 0000000..dbfc8fc --- /dev/null +++ b/glib/tests/test-printf.c @@ -0,0 +1,997 @@ +/* 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 +#include "glib.h" +#include "gstdio.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_positional_params2 (void) +{ + gint res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%2$c %1$c", 'b', 'a'); + g_assert_cmpint (res, ==, 3); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*a b*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%1$*2$.*3$s", "abc", 5, 2); + g_assert_cmpint (res, ==, 5); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("* ab*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%1$s%1$s", "abc"); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*abcabc*"); +} + +static void +test_positional_params3 (void) +{ + gchar buf[128]; + gint res; + + res = g_sprintf (buf, "%2$c %1$c", 'b', 'a'); + g_assert_cmpint (res, ==, 3); + g_assert_cmpstr (buf, ==, "a b"); + + res = g_sprintf (buf, "%1$*2$.*3$s", "abc", 5, 2); + g_assert_cmpint (res, ==, 5); + g_assert_cmpstr (buf, ==, " ab"); + + res = g_sprintf (buf, "%1$s%1$s", "abc"); + g_assert_cmpint (res, ==, 6); + g_assert_cmpstr (buf, ==, "abcabc"); +} + +static void +test_percent2 (void) +{ + gint res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%%"); + g_assert_cmpint (res, ==, 1); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*%*"); +} + +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. + */ + + /* However, gcc doesn't know about this, so we need to disable printf + * format warnings... + */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +_Pragma ("GCC diagnostic push") +_Pragma ("GCC diagnostic ignored \"-Wformat\"") +_Pragma ("GCC diagnostic ignored \"-Wformat-extra-args\"") +#endif + + 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"); + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +_Pragma ("GCC diagnostic pop") +#endif + +#endif +} + +static void +test_64bit2 (void) +{ + gint res; + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GINT64_FORMAT, (gint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GINT64_FORMAT, (gint64)-123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*-123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GUINT64_FORMAT, (guint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GINT64_MODIFIER "o", (gint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*361100*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%#" G_GINT64_MODIFIER "o", (gint64)123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*0361100*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GINT64_MODIFIER "x", (gint64)123456); + g_assert_cmpint (res, ==, 5); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*1e240*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%#" G_GINT64_MODIFIER "x", (gint64)123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*0x1e240*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" G_GINT64_MODIFIER "X", (gint64)123456); + g_assert_cmpint (res, ==, 5); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*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. + */ + + /* However, gcc doesn't know about this, so we need to disable printf + * format warnings... + */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +_Pragma ("GCC diagnostic push") +_Pragma ("GCC diagnostic ignored \"-Wformat\"") +_Pragma ("GCC diagnostic ignored \"-Wformat-extra-args\"") +#endif + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "lli", (gint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "lli", (gint64)-123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*-123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "llu", (guint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*123456*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "ll" "o", (gint64)123456); + g_assert_cmpint (res, ==, 6); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*361100*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%#" "ll" "o", (gint64)123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*0361100*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "ll" "x", (gint64)123456); + g_assert_cmpint (res, ==, 5); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*1e240*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%#" "ll" "x", (gint64)123456); + g_assert_cmpint (res, ==, 7); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*0x1e240*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDOUT)) + { + res = g_printf ("%" "ll" "X", (gint64)123456); + g_assert_cmpint (res, ==, 5); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stdout ("*1E240*"); + +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +_Pragma ("GCC diagnostic pop") +#endif + +#endif +} + +G_GNUC_PRINTF(1, 2) +static gsize +upper_bound (const gchar *format, ...) +{ + va_list args; + gsize res; + + va_start (args, format); + res = g_printf_string_upper_bound (format, args); + va_end (args); + + return res; +} + +static void +test_upper_bound (void) +{ + gsize res; + + res = upper_bound ("bla %s %d: %g\n", "bla", 123, 0.123); + g_assert_cmpint (res, ==, 20); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/snprintf/retval-and-trunc", test_retval_and_trunc); + g_test_add_func ("/snprintf/%d", test_d); + g_test_add_func ("/snprintf/%o", test_o); + g_test_add_func ("/snprintf/%u", test_u); + g_test_add_func ("/snprintf/%x", test_x); + g_test_add_func ("/snprintf/%X", test_X); + g_test_add_func ("/snprintf/%f", test_f); + g_test_add_func ("/snprintf/%e", test_e); + g_test_add_func ("/snprintf/%c", test_c); + g_test_add_func ("/snprintf/%s", test_s); + g_test_add_func ("/snprintf/%n", test_n); + g_test_add_func ("/snprintf/test-percent", test_percent); + g_test_add_func ("/snprintf/test-positional-params", test_positional_params); + g_test_add_func ("/snprintf/test-64bit", test_64bit); + + g_test_add_func ("/printf/test-percent", test_percent2); + g_test_add_func ("/printf/test-positional-params", test_positional_params2); + g_test_add_func ("/printf/test-64bit", test_64bit2); + + g_test_add_func ("/sprintf/test-positional-params", test_positional_params3); + g_test_add_func ("/sprintf/upper-bound", test_upper_bound); + + return g_test_run(); +} diff --git a/glib/tests/test-spawn-echo.c b/glib/tests/test-spawn-echo.c new file mode 100644 index 0000000..cb387ba --- /dev/null +++ b/glib/tests/test-spawn-echo.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 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. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include "glib.h" + +int +main (int argc, + char *argv[]) +{ + int i; + for (i = 1; i < argc; i++) + { + g_print ("%s", argv[i]); + } + + return 0; +} diff --git a/glib/tests/testing.c b/glib/tests/testing.c new file mode 100644 index 0000000..76e358c --- /dev/null +++ b/glib/tests/testing.c @@ -0,0 +1,346 @@ +/* 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"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_assert_cmpstr ("fzz", !=, "fzz"); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*assertion failed*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_assert_cmpint (4, !=, 4); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*assertion failed*"); +} + +/* 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_fatal_log_handler (void) +{ + g_test_log_set_fatal_handler (fatal_handler, NULL); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_str_has_prefix (NULL, "file://"); + g_critical ("Test passing"); + exit (0); + } + g_test_trap_assert_passed (); + + g_test_log_set_fatal_handler (NULL, NULL); + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_error ("Test failing"); + g_test_trap_assert_failed (); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + g_str_has_prefix (NULL, "file://"); + g_test_trap_assert_failed (); +} + +static void +expected_messages_helper (void) +{ + g_warning ("This is a %d warning", g_random_int ()); + g_return_if_reached (); +} + +static void +test_expected_messages (void) +{ + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + expected_messages_helper (); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*This is a * warning*"); + g_test_trap_assert_stderr_unmatched ("*should not be reached*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "This is a * warning"); + expected_messages_helper (); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr_unmatched ("*This is a * warning*"); + g_test_trap_assert_stderr ("*should not be reached*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*should not be *"); + expected_messages_helper (); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr_unmatched ("*should not be reached*"); + g_test_trap_assert_stderr ("*Did not see expected message CRITICAL*should not be *WARNING*This is a * warning*"); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "This is a * warning"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*should not be reached"); + expected_messages_helper (); + g_test_assert_expected_messages (); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stderr (""); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "This is a * warning"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*should not be reached"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "nope"); + expected_messages_helper (); + /* If we don't assert, it won't notice the missing message */ + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stderr (""); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, + "This is a * warning"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*should not be reached"); + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "nope"); + expected_messages_helper (); + g_test_assert_expected_messages (); + exit (0); + } + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*Did not see expected message CRITICAL*nope*"); +} + +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/fatal-log-handler", test_fatal_log_handler); + g_test_add_func ("/misc/expected-messages", test_expected_messages); + + return g_test_run(); +} diff --git a/glib/tests/thread.c b/glib/tests/thread.c new file mode 100644 index 0000000..f91fcae --- /dev/null +++ b/glib/tests/thread.c @@ -0,0 +1,205 @@ +/* Unit tests for GThread + * Copyright (C) 2011 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 + +#ifdef HAVE_SYS_TIME_H +#include +#endif +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + + +#include + +#ifndef G_OS_WIN32 +#include +#endif + +static gpointer +thread1_func (gpointer data) +{ + g_thread_exit (GINT_TO_POINTER (1)); + + g_assert_not_reached (); + + return NULL; +} + +/* test that g_thread_exit() works */ +static void +test_thread1 (void) +{ + gpointer result; + GThread *thread; + GError *error = NULL; + + thread = g_thread_try_new ("test", thread1_func, NULL, &error); + g_assert_no_error (error); + + result = g_thread_join (thread); + + g_assert_cmpint (GPOINTER_TO_INT (result), ==, 1); +} + +static gpointer +thread2_func (gpointer data) +{ + return g_thread_self (); +} + +/* test that g_thread_self() works */ +static void +test_thread2 (void) +{ + gpointer result; + GThread *thread; + + thread = g_thread_new ("test", thread2_func, NULL); + + g_assert (g_thread_self () != thread); + + result = g_thread_join (thread); + + g_assert (result == thread); +} + +static gpointer +thread3_func (gpointer data) +{ + GThread *peer = data; + gint retval; + + retval = 3; + + if (peer) + { + gpointer result; + + result = g_thread_join (peer); + + retval += GPOINTER_TO_INT (result); + } + + return GINT_TO_POINTER (retval); +} + +/* test that g_thread_join() works across peers */ +static void +test_thread3 (void) +{ + gpointer result; + GThread *thread1, *thread2, *thread3; + + thread1 = g_thread_new ("a", thread3_func, NULL); + thread2 = g_thread_new ("b", thread3_func, thread1); + thread3 = g_thread_new ("c", thread3_func, thread2); + + result = g_thread_join (thread3); + + g_assert_cmpint (GPOINTER_TO_INT(result), ==, 9); +} + +/* test that thread creation fails as expected, + * by setting RLIMIT_NPROC ridiculously low + */ +static void +test_thread4 (void) +{ +#ifdef HAVE_PRLIMIT + struct rlimit ol, nl; + GThread *thread; + GError *error; + gint ret; + + getrlimit (RLIMIT_NPROC, &nl); + nl.rlim_cur = 1; + + if ((ret = prlimit (getpid(), RLIMIT_NPROC, &nl, &ol)) != 0) + g_error ("prlimit failed: %s\n", g_strerror (ret)); + + error = NULL; + thread = g_thread_try_new ("a", thread1_func, NULL, &error); + g_assert (thread == NULL); + g_assert_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN); + g_error_free (error); + + if ((ret = prlimit (getpid (), RLIMIT_NPROC, &ol, NULL)) != 0) + g_error ("resetting RLIMIT_NPROC failed: %s\n", g_strerror (ret)); +#endif +} + +static void +test_thread5 (void) +{ + GThread *thread; + + thread = g_thread_new ("a", thread3_func, NULL); + g_thread_ref (thread); + g_thread_join (thread); + g_thread_unref (thread); +} + +static gpointer +thread6_func (gpointer data) +{ +#ifdef HAVE_SYS_PRCTL_H +#ifdef PR_GET_NAME + const gchar name[16]; + + prctl (PR_GET_NAME, name, 0, 0, 0, 0); + + g_assert_cmpstr (name, ==, (gchar*)data); +#endif +#endif + + return NULL; +} + +static void +test_thread6 (void) +{ + GThread *thread; + + thread = g_thread_new ("abc", thread6_func, "abc"); + g_thread_join (thread); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/thread/thread1", test_thread1); + g_test_add_func ("/thread/thread2", test_thread2); + g_test_add_func ("/thread/thread3", test_thread3); + g_test_add_func ("/thread/thread4", test_thread4); + g_test_add_func ("/thread/thread5", test_thread5); + g_test_add_func ("/thread/thread6", test_thread6); + + return g_test_run (); +} diff --git a/glib/tests/timeout.c b/glib/tests/timeout.c new file mode 100644 index 0000000..445af22 --- /dev/null +++ b/glib/tests/timeout.c @@ -0,0 +1,108 @@ +#include +#include + +static GMainLoop *loop; + +static gboolean +stop_waiting (gpointer data) +{ + g_main_loop_quit (loop); + + return G_SOURCE_REMOVE; +} + +static gboolean +function (gpointer data) +{ + g_assert_not_reached (); + + return G_SOURCE_REMOVE; +} + +static void +test_seconds (void) +{ + guint id; + + /* Bug 642052 mentions that g_timeout_add_seconds(21475) schedules a + * job that runs once per second. + * + * Test that that isn't true anymore by scheduling two jobs: + * - one, as above + * - another that runs in 2100ms + * + * If everything is working properly, the 2100ms one should run first + * (and exit the mainloop). If we ever see the 21475 second job run + * then we have trouble (since it ran in less than 2 seconds). + * + * We need a timeout of at least 2 seconds because + * g_timeout_add_second can add as much as an additional second of + * latency. + */ + loop = g_main_loop_new (NULL, FALSE); + + g_timeout_add (2100, stop_waiting, NULL); + id = g_timeout_add_seconds (21475, function, NULL); + + g_main_loop_run (loop); + g_main_loop_unref (loop); + + g_source_remove (id); +} + +static gint64 last_time; +static gint count; + +static gboolean +test_func (gpointer data) +{ + gint64 current_time; + + current_time = g_get_monotonic_time (); + + /* We accept 2 on the first iteration because _add_seconds() can + * have an initial latency of 1 second, see its documentation. + */ + if (count == 0) + g_assert (current_time / 1000000 - last_time / 1000000 <= 2); + else + g_assert (current_time / 1000000 - last_time / 1000000 == 1); + + last_time = current_time; + count++; + + /* Make the timeout take up to 0.1 seconds. + * We should still get scheduled for the next second. + */ + g_usleep (count * 10000); + + if (count < 10) + return TRUE; + + g_main_loop_quit (loop); + + return FALSE; +} + +static void +test_rounding (void) +{ + loop = g_main_loop_new (NULL, FALSE); + + last_time = g_get_monotonic_time (); + g_timeout_add_seconds (1, test_func, NULL); + + g_main_loop_run (loop); + g_main_loop_unref (loop); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/timeout/seconds", test_seconds); + g_test_add_func ("/timeout/rounding", test_rounding); + + return g_test_run (); +} diff --git a/glib/tests/tree.c b/glib/tests/tree.c new file mode 100644 index 0000000..ee129eb --- /dev/null +++ b/glib/tests/tree.c @@ -0,0 +1,354 @@ +/* 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 + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#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_compare_with_data (gconstpointer a, + gconstpointer b, + gpointer user_data) +{ + const char *cha = a; + const char *chb = b; + + /* just check that we got the right data */ + g_assert (GPOINTER_TO_INT(user_data) == 123); + + 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; +} + +static void +test_tree_search (void) +{ + gint i; + GTree *tree; + gboolean removed; + gchar c; + gchar *p, *d; + + tree = g_tree_new_with_data (my_compare_with_data, GINT_TO_POINTER(123)); + + for (i = 0; chars[i]; i++) + g_tree_insert (tree, &chars[i], &chars[i]); + + g_tree_foreach (tree, my_traverse, NULL); + + g_assert_cmpint (g_tree_nnodes (tree), ==, strlen (chars)); + g_assert_cmpint (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); + + g_tree_foreach (tree, my_traverse, NULL); + + g_assert_cmpint (g_tree_nnodes (tree), ==, strlen (chars2)); + g_assert_cmpint (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); + g_assert (g_tree_lookup_extended (tree, &c, (gpointer *)&d, (gpointer *)&p)); + g_assert (c == *d && c == *p); + + 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); +} + +static void +test_tree_remove (void) +{ + GTree *tree; + char c, d; + gint i; + gboolean removed; + gchar *remove; + + 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); + + remove = "omkjigfedba"; + for (i = 0; remove[i]; i++) + { + removed = g_tree_remove (tree, &remove[i]); + g_assert (removed); + } + + g_tree_destroy (tree); +} + +static void +test_tree_destroy (void) +{ + GTree *tree; + gint i; + + tree = g_tree_new (my_compare); + + for (i = 0; chars[i]; i++) + g_tree_insert (tree, &chars[i], &chars[i]); + + g_assert_cmpint (g_tree_nnodes (tree), ==, strlen (chars)); + + g_tree_ref (tree); + g_tree_destroy (tree); + + g_assert_cmpint (g_tree_nnodes (tree), ==, 0); + + g_tree_unref (tree); +} + +static gboolean +traverse_func (gpointer key, gpointer value, gpointer data) +{ + gchar *c = value; + gchar **p = data; + + **p = *c; + (*p)++; + + return FALSE; +} + +static void +test_tree_traverse (void) +{ + GTree *tree; + gint i; + gchar *p, *result; + + tree = g_tree_new (my_compare); + + for (i = 0; chars[i]; i++) + g_tree_insert (tree, &chars[i], &chars[i]); + + result = g_new0 (gchar, strlen (chars) + 1); + + p = result; + g_tree_traverse (tree, traverse_func, G_IN_ORDER, &p); + g_assert_cmpstr (result, ==, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); + + p = result; + g_tree_traverse (tree, traverse_func, G_PRE_ORDER, &p); + g_assert_cmpstr (result, ==, "VF73102546B98ADCENJHGILKMRPOQTSUldZXWYbachfegjiktpnmorqsxvuwyz"); + + p = result; + g_tree_traverse (tree, traverse_func, G_POST_ORDER, &p); + g_assert_cmpstr (result, ==, "02146538A9CEDB7GIHKMLJOQPSUTRNFWYXacbZegfikjhdmonqsrpuwvzyxtlV"); + + g_tree_unref (tree); + g_free (result); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/tree/search", test_tree_search); + g_test_add_func ("/tree/remove", test_tree_remove); + g_test_add_func ("/tree/destroy", test_tree_destroy); + g_test_add_func ("/tree/traverse", test_tree_traverse); + + return g_test_run (); +} + diff --git a/glib/tests/unicode.c b/glib/tests/unicode.c new file mode 100644 index 0000000..bee0def --- /dev/null +++ b/glib/tests/unicode.c @@ -0,0 +1,860 @@ +/* Unit tests for utilities + * Copyright (C) 2010 Red Hat, Inc. + * Copyright (C) 2011 Google, 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. + * + * Author: Matthias Clasen, Behdad Esfahbod + */ + +/* We are testing some deprecated APIs here */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "glib.h" + +static void +test_unichar_validate (void) +{ + g_assert (g_unichar_validate ('j')); + g_assert (g_unichar_validate (8356)); + g_assert (g_unichar_validate (8356)); + g_assert (!g_unichar_validate (0xfdd1)); + g_assert (g_unichar_validate (917760)); + g_assert (!g_unichar_validate (0x110000)); +} + +static void +test_unichar_character_type (void) +{ + guint i; + struct { + GUnicodeType type; + gunichar c; + } examples[] = { + { G_UNICODE_CONTROL, 0x000D }, + { G_UNICODE_FORMAT, 0x200E }, + /* G_UNICODE_UNASSIGNED */ + { G_UNICODE_PRIVATE_USE, 0xE000 }, + { G_UNICODE_SURROGATE, 0xD800 }, + { G_UNICODE_LOWERCASE_LETTER, 0x0061 }, + { G_UNICODE_MODIFIER_LETTER, 0x02B0 }, + { G_UNICODE_OTHER_LETTER, 0x3400 }, + { G_UNICODE_TITLECASE_LETTER, 0x01C5 }, + { G_UNICODE_UPPERCASE_LETTER, 0xFF21 }, + { G_UNICODE_COMBINING_MARK, 0x0903 }, + { G_UNICODE_ENCLOSING_MARK, 0x20DD }, + { G_UNICODE_NON_SPACING_MARK, 0xA806 }, + { G_UNICODE_DECIMAL_NUMBER, 0xFF10 }, + { G_UNICODE_LETTER_NUMBER, 0x16EE }, + { G_UNICODE_OTHER_NUMBER, 0x17F0 }, + { G_UNICODE_CONNECT_PUNCTUATION, 0x005F }, + { G_UNICODE_DASH_PUNCTUATION, 0x058A }, + { G_UNICODE_CLOSE_PUNCTUATION, 0x0F3B }, + { G_UNICODE_FINAL_PUNCTUATION, 0x2019 }, + { G_UNICODE_INITIAL_PUNCTUATION, 0x2018 }, + { G_UNICODE_OTHER_PUNCTUATION, 0x2016 }, + { G_UNICODE_OPEN_PUNCTUATION, 0x0F3A }, + { G_UNICODE_CURRENCY_SYMBOL, 0x20A0 }, + { G_UNICODE_MODIFIER_SYMBOL, 0x309B }, + { G_UNICODE_MATH_SYMBOL, 0xFB29 }, + { G_UNICODE_OTHER_SYMBOL, 0x00A6 }, + { G_UNICODE_LINE_SEPARATOR, 0x2028 }, + { G_UNICODE_PARAGRAPH_SEPARATOR, 0x2029 }, + { G_UNICODE_SPACE_SEPARATOR, 0x202F }, + }; + + for (i = 0; i < G_N_ELEMENTS (examples); i++) + { + g_assert_cmpint (g_unichar_type (examples[i].c), ==, examples[i].type); + } +} + +static void +test_unichar_break_type (void) +{ + guint i; + struct { + GUnicodeBreakType type; + gunichar c; + } examples[] = { + { G_UNICODE_BREAK_MANDATORY, 0x2028 }, + { G_UNICODE_BREAK_CARRIAGE_RETURN, 0x000D }, + { G_UNICODE_BREAK_LINE_FEED, 0x000A }, + { G_UNICODE_BREAK_COMBINING_MARK, 0x0300 }, + { G_UNICODE_BREAK_SURROGATE, 0xD800 }, + { G_UNICODE_BREAK_ZERO_WIDTH_SPACE, 0x200B }, + { G_UNICODE_BREAK_INSEPARABLE, 0x2024 }, + { G_UNICODE_BREAK_NON_BREAKING_GLUE, 0x00A0 }, + { G_UNICODE_BREAK_CONTINGENT, 0xFFFC }, + { G_UNICODE_BREAK_SPACE, 0x0020 }, + { G_UNICODE_BREAK_AFTER, 0x05BE }, + { G_UNICODE_BREAK_BEFORE, 0x02C8 }, + { G_UNICODE_BREAK_BEFORE_AND_AFTER, 0x2014 }, + { G_UNICODE_BREAK_HYPHEN, 0x002D }, + { G_UNICODE_BREAK_NON_STARTER, 0x17D6 }, + { G_UNICODE_BREAK_OPEN_PUNCTUATION, 0x0028 }, + { G_UNICODE_BREAK_CLOSE_PARANTHESIS, 0x0029 }, + { G_UNICODE_BREAK_CLOSE_PUNCTUATION, 0x007D }, + { G_UNICODE_BREAK_QUOTATION, 0x0022 }, + { G_UNICODE_BREAK_EXCLAMATION, 0x0021 }, + { G_UNICODE_BREAK_IDEOGRAPHIC, 0x2E80 }, + { G_UNICODE_BREAK_NUMERIC, 0x0030 }, + { G_UNICODE_BREAK_INFIX_SEPARATOR, 0x002C }, + { G_UNICODE_BREAK_SYMBOL, 0x002F }, + { G_UNICODE_BREAK_ALPHABETIC, 0x0023 }, + { G_UNICODE_BREAK_PREFIX, 0x0024 }, + { G_UNICODE_BREAK_POSTFIX, 0x0025 }, + { G_UNICODE_BREAK_COMPLEX_CONTEXT, 0x0E01 }, + { G_UNICODE_BREAK_AMBIGUOUS, 0x00F7 }, + { G_UNICODE_BREAK_UNKNOWN, 0xE000 }, + { G_UNICODE_BREAK_NEXT_LINE, 0x0085 }, + { G_UNICODE_BREAK_WORD_JOINER, 0x2060 }, + { G_UNICODE_BREAK_HANGUL_L_JAMO, 0x1100 }, + { G_UNICODE_BREAK_HANGUL_V_JAMO, 0x1160 }, + { G_UNICODE_BREAK_HANGUL_T_JAMO, 0x11A8 }, + { G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, 0xAC00 }, + { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, 0xAC01 }, + { G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, 0x3041 }, + { G_UNICODE_BREAK_HEBREW_LETTER, 0x05D0 }, + { G_UNICODE_BREAK_REGIONAL_INDICATOR, 0x1F1F6 } + }; + + for (i = 0; i < G_N_ELEMENTS (examples); i++) + { + g_assert_cmpint (g_unichar_break_type (examples[i].c), ==, examples[i].type); + } +} + +static void +test_unichar_script (void) +{ + guint i; + struct { + GUnicodeScript script; + gunichar c; + } examples[] = { + { G_UNICODE_SCRIPT_COMMON, 0x002A }, + { G_UNICODE_SCRIPT_INHERITED, 0x1CED }, + { G_UNICODE_SCRIPT_INHERITED, 0x0670 }, + { G_UNICODE_SCRIPT_ARABIC, 0x060D }, + { G_UNICODE_SCRIPT_ARMENIAN, 0x0559 }, + { G_UNICODE_SCRIPT_BENGALI, 0x09CD }, + { G_UNICODE_SCRIPT_BOPOMOFO, 0x31B6 }, + { G_UNICODE_SCRIPT_CHEROKEE, 0x13A2 }, + { G_UNICODE_SCRIPT_COPTIC, 0x2CFD }, + { G_UNICODE_SCRIPT_CYRILLIC, 0x0482 }, + { G_UNICODE_SCRIPT_DESERET, 0x10401 }, + { G_UNICODE_SCRIPT_DEVANAGARI, 0x094D }, + { G_UNICODE_SCRIPT_ETHIOPIC, 0x1258 }, + { G_UNICODE_SCRIPT_GEORGIAN, 0x10FC }, + { G_UNICODE_SCRIPT_GOTHIC, 0x10341 }, + { G_UNICODE_SCRIPT_GREEK, 0x0375 }, + { G_UNICODE_SCRIPT_GUJARATI, 0x0A83 }, + { G_UNICODE_SCRIPT_GURMUKHI, 0x0A3C }, + { G_UNICODE_SCRIPT_HAN, 0x3005 }, + { G_UNICODE_SCRIPT_HANGUL, 0x1100 }, + { G_UNICODE_SCRIPT_HEBREW, 0x05BF }, + { G_UNICODE_SCRIPT_HIRAGANA, 0x309F }, + { G_UNICODE_SCRIPT_KANNADA, 0x0CBC }, + { G_UNICODE_SCRIPT_KATAKANA, 0x30FF }, + { G_UNICODE_SCRIPT_KHMER, 0x17DD }, + { G_UNICODE_SCRIPT_LAO, 0x0EDD }, + { G_UNICODE_SCRIPT_LATIN, 0x0061 }, + { G_UNICODE_SCRIPT_MALAYALAM, 0x0D3D }, + { G_UNICODE_SCRIPT_MONGOLIAN, 0x1843 }, + { G_UNICODE_SCRIPT_MYANMAR, 0x1031 }, + { G_UNICODE_SCRIPT_OGHAM, 0x169C }, + { G_UNICODE_SCRIPT_OLD_ITALIC, 0x10322 }, + { G_UNICODE_SCRIPT_ORIYA, 0x0B3C }, + { G_UNICODE_SCRIPT_RUNIC, 0x16EF }, + { G_UNICODE_SCRIPT_SINHALA, 0x0DBD }, + { G_UNICODE_SCRIPT_SYRIAC, 0x0711 }, + { G_UNICODE_SCRIPT_TAMIL, 0x0B82 }, + { G_UNICODE_SCRIPT_TELUGU, 0x0C03 }, + { G_UNICODE_SCRIPT_THAANA, 0x07B1 }, + { G_UNICODE_SCRIPT_THAI, 0x0E31 }, + { G_UNICODE_SCRIPT_TIBETAN, 0x0FD4 }, + { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, 0x1400 }, + { G_UNICODE_SCRIPT_CANADIAN_ABORIGINAL, 0x1401 }, + { G_UNICODE_SCRIPT_YI, 0xA015 }, + { G_UNICODE_SCRIPT_TAGALOG, 0x1700 }, + { G_UNICODE_SCRIPT_HANUNOO, 0x1720 }, + { G_UNICODE_SCRIPT_BUHID, 0x1740 }, + { G_UNICODE_SCRIPT_TAGBANWA, 0x1760 }, + { G_UNICODE_SCRIPT_BRAILLE, 0x2800 }, + { G_UNICODE_SCRIPT_CYPRIOT, 0x10808 }, + { G_UNICODE_SCRIPT_LIMBU, 0x1932 }, + { G_UNICODE_SCRIPT_OSMANYA, 0x10480 }, + { G_UNICODE_SCRIPT_SHAVIAN, 0x10450 }, + { G_UNICODE_SCRIPT_LINEAR_B, 0x10000 }, + { G_UNICODE_SCRIPT_TAI_LE, 0x1950 }, + { G_UNICODE_SCRIPT_UGARITIC, 0x1039F }, + { G_UNICODE_SCRIPT_NEW_TAI_LUE, 0x1980 }, + { G_UNICODE_SCRIPT_BUGINESE, 0x1A1F }, + { G_UNICODE_SCRIPT_GLAGOLITIC, 0x2C00 }, + { G_UNICODE_SCRIPT_TIFINAGH, 0x2D6F }, + { G_UNICODE_SCRIPT_SYLOTI_NAGRI, 0xA800 }, + { G_UNICODE_SCRIPT_OLD_PERSIAN, 0x103D0 }, + { G_UNICODE_SCRIPT_KHAROSHTHI, 0x10A3F }, + { G_UNICODE_SCRIPT_UNKNOWN, 0x1111111 }, + { G_UNICODE_SCRIPT_BALINESE, 0x1B04 }, + { G_UNICODE_SCRIPT_CUNEIFORM, 0x12000 }, + { G_UNICODE_SCRIPT_PHOENICIAN, 0x10900 }, + { G_UNICODE_SCRIPT_PHAGS_PA, 0xA840 }, + { G_UNICODE_SCRIPT_NKO, 0x07C0 }, + { G_UNICODE_SCRIPT_KAYAH_LI, 0xA900 }, + { G_UNICODE_SCRIPT_LEPCHA, 0x1C00 }, + { G_UNICODE_SCRIPT_REJANG, 0xA930 }, + { G_UNICODE_SCRIPT_SUNDANESE, 0x1B80 }, + { G_UNICODE_SCRIPT_SAURASHTRA, 0xA880 }, + { G_UNICODE_SCRIPT_CHAM, 0xAA00 }, + { G_UNICODE_SCRIPT_OL_CHIKI, 0x1C50 }, + { G_UNICODE_SCRIPT_VAI, 0xA500 }, + { G_UNICODE_SCRIPT_CARIAN, 0x102A0 }, + { G_UNICODE_SCRIPT_LYCIAN, 0x10280 }, + { G_UNICODE_SCRIPT_LYDIAN, 0x1093F }, + { G_UNICODE_SCRIPT_AVESTAN, 0x10B00 }, + { G_UNICODE_SCRIPT_BAMUM, 0xA6A0 }, + { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, 0x13000 }, + { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, 0x10840 }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, 0x10B60 }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, 0x10B40 }, + { G_UNICODE_SCRIPT_JAVANESE, 0xA980 }, + { G_UNICODE_SCRIPT_KAITHI, 0x11082 }, + { G_UNICODE_SCRIPT_LISU, 0xA4D0 }, + { G_UNICODE_SCRIPT_MEETEI_MAYEK, 0xABE5 }, + { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, 0x10A60 }, + { G_UNICODE_SCRIPT_OLD_TURKIC, 0x10C00 }, + { G_UNICODE_SCRIPT_SAMARITAN, 0x0800 }, + { G_UNICODE_SCRIPT_TAI_THAM, 0x1A20 }, + { G_UNICODE_SCRIPT_TAI_VIET, 0xAA80 }, + { G_UNICODE_SCRIPT_BATAK, 0x1BC0 }, + { G_UNICODE_SCRIPT_BRAHMI, 0x11000 }, + { G_UNICODE_SCRIPT_MANDAIC, 0x0840 }, + { G_UNICODE_SCRIPT_CHAKMA, 0x11100 }, + { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, 0x109A0 }, + { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, 0x10980 }, + { G_UNICODE_SCRIPT_MIAO, 0x16F00 }, + { G_UNICODE_SCRIPT_SHARADA, 0x11180 }, + { G_UNICODE_SCRIPT_SORA_SOMPENG, 0x110D0 }, + { G_UNICODE_SCRIPT_TAKRI, 0x11680 } + }; + for (i = 0; i < G_N_ELEMENTS (examples); i++) + { + g_assert_cmpint (g_unichar_get_script (examples[i].c), ==, examples[i].script); + } +} + +static void +test_combining_class (void) +{ + guint i; + struct { + gint class; + gunichar c; + } examples[] = { + { 0, 0x0020 }, + { 1, 0x0334 }, + { 7, 0x093C }, + { 8, 0x3099 }, + { 9, 0x094D }, + { 10, 0x05B0 }, + { 11, 0x05B1 }, + { 12, 0x05B2 }, + { 13, 0x05B3 }, + { 14, 0x05B4 }, + { 15, 0x05B5 }, + { 16, 0x05B6 }, + { 17, 0x05B7 }, + { 18, 0x05B8 }, + { 19, 0x05B9 }, + { 20, 0x05BB }, + { 21, 0x05BC }, + { 22, 0x05BD }, + { 23, 0x05BF }, + { 24, 0x05C1 }, + { 25, 0x05C2 }, + { 26, 0xFB1E }, + { 27, 0x064B }, + { 28, 0x064C }, + { 29, 0x064D }, + /* ... */ + { 228, 0x05AE }, + { 230, 0x0300 }, + { 232, 0x302C }, + { 233, 0x0362 }, + { 234, 0x0360 }, + { 234, 0x1DCD }, + { 240, 0x0345 } + }; + for (i = 0; i < G_N_ELEMENTS (examples); i++) + { + g_assert_cmpint (g_unichar_combining_class (examples[i].c), ==, examples[i].class); + } +} + +static void +test_mirror (void) +{ + gunichar mirror; + + g_assert (g_unichar_get_mirror_char ('(', &mirror)); + g_assert_cmpint (mirror, ==, ')'); + g_assert (g_unichar_get_mirror_char (')', &mirror)); + g_assert_cmpint (mirror, ==, '('); + g_assert (g_unichar_get_mirror_char ('{', &mirror)); + g_assert_cmpint (mirror, ==, '}'); + g_assert (g_unichar_get_mirror_char ('}', &mirror)); + g_assert_cmpint (mirror, ==, '{'); + g_assert (g_unichar_get_mirror_char (0x208D, &mirror)); + g_assert_cmpint (mirror, ==, 0x208E); + g_assert (g_unichar_get_mirror_char (0x208E, &mirror)); + g_assert_cmpint (mirror, ==, 0x208D); + g_assert (!g_unichar_get_mirror_char ('a', &mirror)); +} + +static void +test_mark (void) +{ + g_assert (g_unichar_ismark (0x0903)); + g_assert (g_unichar_ismark (0x20DD)); + g_assert (g_unichar_ismark (0xA806)); + g_assert (!g_unichar_ismark ('a')); +} + +static void +test_zerowidth (void) +{ + g_assert (!g_unichar_iszerowidth (0x00AD)); + g_assert (!g_unichar_iszerowidth (0x00AD)); + g_assert (!g_unichar_iszerowidth (0x115F)); + g_assert (g_unichar_iszerowidth (0x1160)); + g_assert (g_unichar_iszerowidth (0x11AA)); + g_assert (g_unichar_iszerowidth (0x11FF)); + g_assert (!g_unichar_iszerowidth (0x1200)); + g_assert (g_unichar_iszerowidth (0x200B)); + g_assert (g_unichar_iszerowidth (0x591)); +} + +static void +test_title (void) +{ + g_assert (g_unichar_istitle (0x01c5)); + g_assert (g_unichar_istitle (0x1f88)); + g_assert (g_unichar_istitle (0x1fcc)); + g_assert (!g_unichar_istitle ('a')); + g_assert (!g_unichar_istitle ('A')); + + g_assert_cmphex (g_unichar_totitle (0x01c6), ==, 0x01c5); + g_assert_cmphex (g_unichar_totitle (0x01c4), ==, 0x01c5); + g_assert_cmphex (g_unichar_totitle (0x01c5), ==, 0x01c5); + g_assert_cmphex (g_unichar_totitle (0x1f80), ==, 0x1f88); + g_assert_cmphex (g_unichar_totitle (0x1f88), ==, 0x1f88); + g_assert_cmphex (g_unichar_totitle ('a'), ==, 'A'); + g_assert_cmphex (g_unichar_totitle ('A'), ==, 'A'); +} + +static void +test_cases (void) +{ + g_assert_cmphex (g_unichar_toupper ('a'), ==, 'A'); + g_assert_cmphex (g_unichar_toupper ('A'), ==, 'A'); + g_assert_cmphex (g_unichar_toupper (0x01C5), ==, 0x01C4); + g_assert_cmphex (g_unichar_toupper (0x01C6), ==, 0x01C4); + g_assert_cmphex (g_unichar_tolower ('A'), ==, 'a'); + g_assert_cmphex (g_unichar_tolower ('a'), ==, 'a'); + g_assert_cmphex (g_unichar_tolower (0x01C4), ==, 0x01C6); + g_assert_cmphex (g_unichar_tolower (0x01C5), ==, 0x01C6); + g_assert_cmphex (g_unichar_tolower (0x1F8A), ==, 0x1F82); + g_assert_cmphex (g_unichar_totitle (0x1F8A), ==, 0x1F8A); + g_assert_cmphex (g_unichar_toupper (0x1F8A), ==, 0x1F8A); + g_assert_cmphex (g_unichar_tolower (0x1FB2), ==, 0x1FB2); + g_assert_cmphex (g_unichar_toupper (0x1FB2), ==, 0x1FB2); +} + +static void +test_defined (void) +{ + g_assert (g_unichar_isdefined (0x0903)); + g_assert (g_unichar_isdefined (0x20DD)); + g_assert (g_unichar_isdefined (0x20BA)); + g_assert (g_unichar_isdefined (0xA806)); + g_assert (g_unichar_isdefined ('a')); + g_assert (!g_unichar_isdefined (0x10C49)); + g_assert (!g_unichar_isdefined (0x169D)); +} + +static void +test_wide (void) +{ + guint i; + struct { + gunichar c; + enum { + NOT_WIDE, + WIDE_CJK, + WIDE + } wide; + } examples[] = { + /* Neutral */ + { 0x0000, NOT_WIDE }, + { 0x0483, NOT_WIDE }, + { 0x0641, NOT_WIDE }, + { 0xFFFC, NOT_WIDE }, + { 0x10000, NOT_WIDE }, + { 0xE0001, NOT_WIDE }, + + /* Narrow */ + { 0x0020, NOT_WIDE }, + { 0x0041, NOT_WIDE }, + { 0x27E6, NOT_WIDE }, + + /* Halfwidth */ + { 0x20A9, NOT_WIDE }, + { 0xFF61, NOT_WIDE }, + { 0xFF69, NOT_WIDE }, + { 0xFFEE, NOT_WIDE }, + + /* Ambiguous */ + { 0x00A1, WIDE_CJK }, + { 0x00BE, WIDE_CJK }, + { 0x02DD, WIDE_CJK }, + { 0x2020, WIDE_CJK }, + { 0xFFFD, WIDE_CJK }, + { 0x00A1, WIDE_CJK }, + { 0x1F100, WIDE_CJK }, + { 0xE0100, WIDE_CJK }, + { 0x100000, WIDE_CJK }, + { 0x10FFFD, WIDE_CJK }, + + /* Fullwidth */ + { 0x3000, WIDE }, + { 0xFF60, WIDE }, + + /* Wide */ + { 0x2329, WIDE }, + { 0x3001, WIDE }, + { 0xFE69, WIDE }, + { 0x30000, WIDE }, + { 0x3FFFD, WIDE }, + + /* Default Wide blocks */ + { 0x4DBF, WIDE }, + { 0x9FFF, WIDE }, + { 0xFAFF, WIDE }, + { 0x2A6DF, WIDE }, + { 0x2B73F, WIDE }, + { 0x2B81F, WIDE }, + { 0x2FA1F, WIDE }, + + /* Uniode-5.2 character additions */ + /* Wide */ + { 0x115F, WIDE }, + + /* Uniode-6.0 character additions */ + /* Wide */ + { 0x2B740, WIDE }, + { 0x1B000, WIDE }, + + { 0x111111, NOT_WIDE } + }; + + for (i = 0; i < G_N_ELEMENTS (examples); i++) + { + g_assert_cmpint (g_unichar_iswide (examples[i].c), ==, (examples[i].wide == WIDE)); + g_assert_cmpint (g_unichar_iswide_cjk (examples[i].c), ==, (examples[i].wide != NOT_WIDE)); + } +}; + +static void +test_compose (void) +{ + gunichar ch; + + /* Not composable */ + g_assert (!g_unichar_compose (0x0041, 0x0042, &ch) && ch == 0); + g_assert (!g_unichar_compose (0x0041, 0, &ch) && ch == 0); + g_assert (!g_unichar_compose (0x0066, 0x0069, &ch) && ch == 0); + + /* Tricky non-composable */ + g_assert (!g_unichar_compose (0x0308, 0x0301, &ch) && ch == 0); /* !0x0344 */ + g_assert (!g_unichar_compose (0x0F71, 0x0F72, &ch) && ch == 0); /* !0x0F73 */ + + /* Singletons should not compose */ + g_assert (!g_unichar_compose (0x212B, 0, &ch) && ch == 0); + g_assert (!g_unichar_compose (0x00C5, 0, &ch) && ch == 0); + g_assert (!g_unichar_compose (0x2126, 0, &ch) && ch == 0); + g_assert (!g_unichar_compose (0x03A9, 0, &ch) && ch == 0); + + /* Pairs */ + g_assert (g_unichar_compose (0x0041, 0x030A, &ch) && ch == 0x00C5); + g_assert (g_unichar_compose (0x006F, 0x0302, &ch) && ch == 0x00F4); + g_assert (g_unichar_compose (0x1E63, 0x0307, &ch) && ch == 0x1E69); + g_assert (g_unichar_compose (0x0073, 0x0323, &ch) && ch == 0x1E63); + g_assert (g_unichar_compose (0x0064, 0x0307, &ch) && ch == 0x1E0B); + g_assert (g_unichar_compose (0x0064, 0x0323, &ch) && ch == 0x1E0D); + + /* Hangul */ + g_assert (g_unichar_compose (0xD4CC, 0x11B6, &ch) && ch == 0xD4DB); + g_assert (g_unichar_compose (0x1111, 0x1171, &ch) && ch == 0xD4CC); + g_assert (g_unichar_compose (0xCE20, 0x11B8, &ch) && ch == 0xCE31); + g_assert (g_unichar_compose (0x110E, 0x1173, &ch) && ch == 0xCE20); +} + +static void +test_decompose (void) +{ + gunichar a, b; + + /* Not decomposable */ + g_assert (!g_unichar_decompose (0x0041, &a, &b) && a == 0x0041 && b == 0); + g_assert (!g_unichar_decompose (0xFB01, &a, &b) && a == 0xFB01 && b == 0); + + /* Singletons */ + g_assert (g_unichar_decompose (0x212B, &a, &b) && a == 0x00C5 && b == 0); + g_assert (g_unichar_decompose (0x2126, &a, &b) && a == 0x03A9 && b == 0); + + /* Tricky pairs */ + g_assert (g_unichar_decompose (0x0344, &a, &b) && a == 0x0308 && b == 0x0301); + g_assert (g_unichar_decompose (0x0F73, &a, &b) && a == 0x0F71 && b == 0x0F72); + + /* Pairs */ + g_assert (g_unichar_decompose (0x00C5, &a, &b) && a == 0x0041 && b == 0x030A); + g_assert (g_unichar_decompose (0x00F4, &a, &b) && a == 0x006F && b == 0x0302); + g_assert (g_unichar_decompose (0x1E69, &a, &b) && a == 0x1E63 && b == 0x0307); + g_assert (g_unichar_decompose (0x1E63, &a, &b) && a == 0x0073 && b == 0x0323); + g_assert (g_unichar_decompose (0x1E0B, &a, &b) && a == 0x0064 && b == 0x0307); + g_assert (g_unichar_decompose (0x1E0D, &a, &b) && a == 0x0064 && b == 0x0323); + + /* Hangul */ + g_assert (g_unichar_decompose (0xD4DB, &a, &b) && a == 0xD4CC && b == 0x11B6); + g_assert (g_unichar_decompose (0xD4CC, &a, &b) && a == 0x1111 && b == 0x1171); + g_assert (g_unichar_decompose (0xCE31, &a, &b) && a == 0xCE20 && b == 0x11B8); + g_assert (g_unichar_decompose (0xCE20, &a, &b) && a == 0x110E && b == 0x1173); +} + +static void +test_fully_decompose_canonical (void) +{ + gunichar decomp[5]; + gsize len; + +#define TEST_DECOMP(ch, expected_len, a, b, c, d) \ + len = g_unichar_fully_decompose (ch, FALSE, decomp, G_N_ELEMENTS (decomp)); \ + g_assert_cmpint (expected_len, ==, len); \ + if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \ + if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \ + if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \ + if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \ + +#define TEST0(ch) TEST_DECOMP (ch, 1, ch, 0, 0, 0) +#define TEST1(ch, a) TEST_DECOMP (ch, 1, a, 0, 0, 0) +#define TEST2(ch, a, b) TEST_DECOMP (ch, 2, a, b, 0, 0) +#define TEST3(ch, a, b, c) TEST_DECOMP (ch, 3, a, b, c, 0) +#define TEST4(ch, a, b, c, d) TEST_DECOMP (ch, 4, a, b, c, d) + + /* Not decomposable */ + TEST0 (0x0041); + TEST0 (0xFB01); + + /* Singletons */ + TEST2 (0x212B, 0x0041, 0x030A); + TEST1 (0x2126, 0x03A9); + + /* Tricky pairs */ + TEST2 (0x0344, 0x0308, 0x0301); + TEST2 (0x0F73, 0x0F71, 0x0F72); + + /* General */ + TEST2 (0x00C5, 0x0041, 0x030A); + TEST2 (0x00F4, 0x006F, 0x0302); + TEST3 (0x1E69, 0x0073, 0x0323, 0x0307); + TEST2 (0x1E63, 0x0073, 0x0323); + TEST2 (0x1E0B, 0x0064, 0x0307); + TEST2 (0x1E0D, 0x0064, 0x0323); + + /* Hangul */ + TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6); + TEST2 (0xD4CC, 0x1111, 0x1171); + TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8); + TEST2 (0xCE20, 0x110E, 0x1173); + +#undef TEST_DECOMP +} + +static void +test_canonical_decomposition (void) +{ + gunichar *decomp; + gsize len; + +#define TEST_DECOMP(ch, expected_len, a, b, c, d) \ + decomp = g_unicode_canonical_decomposition (ch, &len); \ + g_assert_cmpint (expected_len, ==, len); \ + if (expected_len >= 1) g_assert_cmphex (decomp[0], ==, a); \ + if (expected_len >= 2) g_assert_cmphex (decomp[1], ==, b); \ + if (expected_len >= 3) g_assert_cmphex (decomp[2], ==, c); \ + if (expected_len >= 4) g_assert_cmphex (decomp[3], ==, d); \ + g_free (decomp); + +#define TEST0(ch) TEST_DECOMP (ch, 1, ch, 0, 0, 0) +#define TEST1(ch, a) TEST_DECOMP (ch, 1, a, 0, 0, 0) +#define TEST2(ch, a, b) TEST_DECOMP (ch, 2, a, b, 0, 0) +#define TEST3(ch, a, b, c) TEST_DECOMP (ch, 3, a, b, c, 0) +#define TEST4(ch, a, b, c, d) TEST_DECOMP (ch, 4, a, b, c, d) + + /* Not decomposable */ + TEST0 (0x0041); + TEST0 (0xFB01); + + /* Singletons */ + TEST2 (0x212B, 0x0041, 0x030A); + TEST1 (0x2126, 0x03A9); + + /* Tricky pairs */ + TEST2 (0x0344, 0x0308, 0x0301); + TEST2 (0x0F73, 0x0F71, 0x0F72); + + /* General */ + TEST2 (0x00C5, 0x0041, 0x030A); + TEST2 (0x00F4, 0x006F, 0x0302); + TEST3 (0x1E69, 0x0073, 0x0323, 0x0307); + TEST2 (0x1E63, 0x0073, 0x0323); + TEST2 (0x1E0B, 0x0064, 0x0307); + TEST2 (0x1E0D, 0x0064, 0x0323); + + /* Hangul */ + TEST3 (0xD4DB, 0x1111, 0x1171, 0x11B6); + TEST2 (0xD4CC, 0x1111, 0x1171); + TEST3 (0xCE31, 0x110E, 0x1173, 0x11B8); + TEST2 (0xCE20, 0x110E, 0x1173); + +#undef TEST_DECOMP +} + +static void +test_decompose_tail (void) +{ + gunichar ch, a, b, c, d; + + /* Test that whenever a char ch decomposes into a and b, b itself + * won't decompose any further. */ + + for (ch = 0; ch < 0x110000; ch++) + if (g_unichar_decompose (ch, &a, &b)) + g_assert (!g_unichar_decompose (b, &c, &d)); + else + { + g_assert_cmpuint (a, ==, ch); + g_assert_cmpuint (b, ==, 0); + } +} + +static void +test_fully_decompose_len (void) +{ + gunichar ch; + + /* Test that all canonical decompositions are at most 4 in length, + * and compatibility decompositions are at most 18 in length. + */ + + for (ch = 0; ch < 0x110000; ch++) { + g_assert_cmpint (g_unichar_fully_decompose (ch, FALSE, NULL, 0), <=, 4); + g_assert_cmpint (g_unichar_fully_decompose (ch, TRUE, NULL, 0), <=, 18); + } +} + +static void +test_iso15924 (void) +{ + const struct { + GUnicodeScript script; + char four_letter_code[5]; + } data[] = { + { G_UNICODE_SCRIPT_COMMON, "Zyyy" }, + { G_UNICODE_SCRIPT_INHERITED, "Zinh" }, + { 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, "Copt" }, + { G_UNICODE_SCRIPT_CYRILLIC, "Cyrl" }, + { G_UNICODE_SCRIPT_DESERET, "Dsrt" }, + { G_UNICODE_SCRIPT_DEVANAGARI, "Deva" }, + { G_UNICODE_SCRIPT_ETHIOPIC, "Ethi" }, + { G_UNICODE_SCRIPT_GEORGIAN, "Geor" }, + { 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" }, + { 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" }, + { 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" }, + + /* Unicode-5.2 additions */ + { G_UNICODE_SCRIPT_AVESTAN, "Avst" }, + { G_UNICODE_SCRIPT_BAMUM, "Bamu" }, + { G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, "Egyp" }, + { G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, "Armi" }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, "Phli" }, + { G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, "Prti" }, + { G_UNICODE_SCRIPT_JAVANESE, "Java" }, + { G_UNICODE_SCRIPT_KAITHI, "Kthi" }, + { G_UNICODE_SCRIPT_LISU, "Lisu" }, + { G_UNICODE_SCRIPT_MEETEI_MAYEK, "Mtei" }, + { G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, "Sarb" }, + { G_UNICODE_SCRIPT_OLD_TURKIC, "Orkh" }, + { G_UNICODE_SCRIPT_SAMARITAN, "Samr" }, + { G_UNICODE_SCRIPT_TAI_THAM, "Lana" }, + { G_UNICODE_SCRIPT_TAI_VIET, "Tavt" }, + + /* Unicode-6.0 additions */ + { G_UNICODE_SCRIPT_BATAK, "Batk" }, + { G_UNICODE_SCRIPT_BRAHMI, "Brah" }, + { G_UNICODE_SCRIPT_MANDAIC, "Mand" }, + + /* Unicode-6.1 additions */ + { G_UNICODE_SCRIPT_CHAKMA, "Cakm" }, + { G_UNICODE_SCRIPT_MEROITIC_CURSIVE, "Merc" }, + { G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, "Mero" }, + { G_UNICODE_SCRIPT_MIAO, "Plrd" }, + { G_UNICODE_SCRIPT_SHARADA, "Shrd" }, + { G_UNICODE_SCRIPT_SORA_SOMPENG, "Sora" }, + { G_UNICODE_SCRIPT_TAKRI, "Takr" }, + }; + guint i; + + g_assert_cmphex (0, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_INVALID_CODE)); + g_assert_cmphex (0x5A7A7A7A, ==, g_unicode_script_to_iso15924 (1000)); + g_assert_cmphex (0x41726162, ==, g_unicode_script_to_iso15924 (G_UNICODE_SCRIPT_ARABIC)); + + g_assert_cmphex (G_UNICODE_SCRIPT_INVALID_CODE, ==, g_unicode_script_from_iso15924 (0)); + g_assert_cmphex (G_UNICODE_SCRIPT_UNKNOWN, ==, g_unicode_script_from_iso15924 (0x12345678)); + +#define PACK(a,b,c,d) ((guint32)((((guint8)(a))<<24)|(((guint8)(b))<<16)|(((guint8)(c))<<8)|((guint8)(d)))) + + for (i = 0; i < G_N_ELEMENTS (data); i++) + { + guint32 code = PACK (data[i].four_letter_code[0], + data[i].four_letter_code[1], + data[i].four_letter_code[2], + data[i].four_letter_code[3]); + + g_assert_cmphex (g_unicode_script_to_iso15924 (data[i].script), ==, code); + g_assert_cmpint (g_unicode_script_from_iso15924 (code), ==, data[i].script); + } + +#undef PACK +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/unicode/validate", test_unichar_validate); + g_test_add_func ("/unicode/character-type", test_unichar_character_type); + g_test_add_func ("/unicode/break-type", test_unichar_break_type); + g_test_add_func ("/unicode/script", test_unichar_script); + g_test_add_func ("/unicode/combining-class", test_combining_class); + g_test_add_func ("/unicode/mirror", test_mirror); + g_test_add_func ("/unicode/mark", test_mark); + g_test_add_func ("/unicode/title", test_title); + g_test_add_func ("/unicode/zero-width", test_zerowidth); + g_test_add_func ("/unicode/defined", test_defined); + g_test_add_func ("/unicode/wide", test_wide); + g_test_add_func ("/unicode/compose", test_compose); + g_test_add_func ("/unicode/decompose", test_decompose); + g_test_add_func ("/unicode/fully-decompose-canonical", test_fully_decompose_canonical); + g_test_add_func ("/unicode/canonical-decomposition", test_canonical_decomposition); + g_test_add_func ("/unicode/decompose-tail", test_decompose_tail); + g_test_add_func ("/unicode/fully-decompose-len", test_fully_decompose_len); + g_test_add_func ("/unicode/iso15924", test_iso15924); + g_test_add_func ("/unicode/cases", test_cases); + + return g_test_run(); +} diff --git a/glib/tests/unix.c b/glib/tests/unix.c new file mode 100644 index 0000000..329e19a --- /dev/null +++ b/glib/tests/unix.c @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2011 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. + * + * Author: Colin Walters + */ + +#include "config.h" + +#include "glib-unix.h" +#include + +static void +test_pipe (void) +{ + GError *error = NULL; + int pipefd[2]; + char buf[1024]; + ssize_t bytes_read; + gboolean res; + + res = g_unix_open_pipe (pipefd, FD_CLOEXEC, &error); + g_assert (res); + g_assert_no_error (error); + + write (pipefd[1], "hello", sizeof ("hello")); + memset (buf, 0, sizeof (buf)); + bytes_read = read (pipefd[0], buf, sizeof(buf) - 1); + g_assert_cmpint (bytes_read, >, 0); + buf[bytes_read] = '\0'; + + close (pipefd[0]); + close (pipefd[1]); + + g_assert (g_str_has_prefix (buf, "hello")); +} + +static void +test_error (void) +{ + GError *error = NULL; + gboolean res; + + res = g_unix_set_fd_nonblocking (123456, TRUE, &error); + g_assert_cmpint (errno, ==, EBADF); + g_assert (!res); + g_assert_error (error, G_UNIX_ERROR, 0); + g_clear_error (&error); +} + +static gboolean sig_received = FALSE; + +static gboolean +on_sig_received (gpointer user_data) +{ + GMainLoop *loop = user_data; + g_main_loop_quit (loop); + sig_received = TRUE; + return G_SOURCE_REMOVE; +} + +static gboolean +sig_not_received (gpointer data) +{ + GMainLoop *loop = data; + (void) loop; + g_error ("Timed out waiting for signal"); + return G_SOURCE_REMOVE; +} + +static gboolean +exit_mainloop (gpointer data) +{ + GMainLoop *loop = data; + g_main_loop_quit (loop); + return G_SOURCE_REMOVE; +} + +static void +test_signal (int signum) +{ + GMainLoop *mainloop; + int id; + + mainloop = g_main_loop_new (NULL, FALSE); + + sig_received = FALSE; + g_unix_signal_add (signum, on_sig_received, mainloop); + kill (getpid (), signum); + g_assert (!sig_received); + id = g_timeout_add (5000, sig_not_received, mainloop); + g_main_loop_run (mainloop); + g_assert (sig_received); + sig_received = FALSE; + g_source_remove (id); + + /* Ensure we don't get double delivery */ + g_timeout_add (500, exit_mainloop, mainloop); + g_main_loop_run (mainloop); + g_assert (!sig_received); + g_main_loop_unref (mainloop); + +} + +static void +test_sighup (void) +{ + test_signal (SIGHUP); +} + +static void +test_sigterm (void) +{ + test_signal (SIGTERM); +} + +static void +test_sighup_add_remove (void) +{ + GMainLoop *mainloop; + guint id; + + mainloop = g_main_loop_new (NULL, FALSE); + + sig_received = FALSE; + id = g_unix_signal_add (SIGHUP, on_sig_received, mainloop); + g_source_remove (id); + kill (getpid (), SIGHUP); + g_assert (!sig_received); + g_main_loop_unref (mainloop); + +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/glib-unix/pipe", test_pipe); + g_test_add_func ("/glib-unix/error", test_error); + g_test_add_func ("/glib-unix/sighup", test_sighup); + g_test_add_func ("/glib-unix/sigterm", test_sigterm); + g_test_add_func ("/glib-unix/sighup_again", test_sighup); + g_test_add_func ("/glib-unix/sighup_add_remove", test_sighup_add_remove); + + return g_test_run(); +} diff --git a/glib/tests/uri.c b/glib/tests/uri.c new file mode 100644 index 0000000..0fc7657 --- /dev/null +++ b/glib/tests/uri.c @@ -0,0 +1,395 @@ +/* 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 +#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 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 (res) + g_assert_cmpstr (res, ==, to_uri_tests[i].expected_result); + else + g_assert_error (error, G_CONVERT_ERROR, to_uri_tests[i].expected_error); + + g_free (res); + g_clear_error (&error); + } +} + +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); + +#ifdef G_OS_WIN32 + if (from_uri_tests[i].expected_filename) + { + gchar *p, *slash; + 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) + g_assert_cmpstr (res, ==, from_uri_tests[i].expected_filename); + else + g_assert_error (error, G_CONVERT_ERROR, from_uri_tests[i].expected_error); + g_assert_cmpstr (hostname, ==, from_uri_tests[i].expected_hostname); + + g_free (res); + g_free (hostname); + g_clear_error (&error); + } +} + +static gint +safe_strcmp_filename (const gchar *a, const gchar *b) +{ +#ifndef G_OS_WIN32 + return g_strcmp0 (a, b); +#else + if (!a || !b) + return g_strcmp0 (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) +{ + if (a == NULL) + a = ""; + if (b == NULL) + b = ""; +#ifndef G_OS_WIN32 + return strcmp (a, b); +#else + if (strcmp (a, "localhost") == 0 && !*b) + return 0; + else + return 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); + g_assert_no_error (error); + + hostname = NULL; + res = g_filename_from_uri (uri, &hostname, &error); + g_assert_no_error (error); + + g_assert (safe_strcmp_filename (to_uri_tests[i].filename, res) == 0); + g_assert (safe_strcmp_hostname (to_uri_tests[i].hostname, hostname) == 0); + g_free (res); + g_free (uri); + g_free (hostname); + } +} + +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); + g_assert_cmpint (g_strv_length (uris), ==, 3); + + for (j = 0; j < 3; j++) + g_assert_cmpstr (uris[j], ==, expected_uris[j]); + + g_strfreev (uris); + + uris = g_uri_list_extract_uris ("# just hot air\r\n# more hot air"); + g_assert_cmpint (g_strv_length (uris), ==, 0); + g_strfreev (uris); +} + +static void +test_uri_unescape (void) +{ + gchar *s; + + s = g_uri_unescape_string ("%2Babc %4F", NULL); + g_assert_cmpstr (s, ==, "+abc O"); + g_free (s); + g_assert_cmpstr (g_uri_unescape_string ("%2Babc %4F", "+"), ==, NULL); + g_assert_cmpstr (g_uri_unescape_string ("%00abc %4F", "+/"), ==, NULL); + g_assert_cmpstr (g_uri_unescape_string ("%0", NULL), ==, NULL); + g_assert_cmpstr (g_uri_unescape_string ("%ra", NULL), ==, NULL); + g_assert_cmpstr (g_uri_unescape_string ("%2r", NULL), ==, NULL); + g_assert_cmpstr (g_uri_unescape_string (NULL, NULL), ==, NULL); +} + +static void +test_uri_escape (void) +{ + gchar *s; + + s = g_uri_escape_string ("abcdefgABCDEFG._~", NULL, FALSE); + g_assert_cmpstr (s, ==, "abcdefgABCDEFG._~"); + g_free (s); + s = g_uri_escape_string (":+ \\?#", NULL, FALSE); + g_assert_cmpstr (s, ==, "%3A%2B%20%5C%3F%23"); + g_free (s); + s = g_uri_escape_string ("a+b:c", "+", FALSE); + g_assert_cmpstr (s, ==, "a+b%3Ac"); + g_free (s); + s = g_uri_escape_string ("a+b:c\303\234", "+", TRUE); + g_assert_cmpstr (s, ==, "a+b%3Ac\303\234"); + g_free (s); +} + +static void +test_uri_scheme (void) +{ + gchar *s; + + s = g_uri_parse_scheme ("ftp://ftp.gtk.org"); + g_assert_cmpstr (s, ==, "ftp"); + g_free (s); + s = g_uri_parse_scheme ("1bad:"); + g_assert (s == NULL); + s = g_uri_parse_scheme ("bad"); + g_assert (s == NULL); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/uri/to-uri", run_to_uri_tests); + g_test_add_func ("/uri/from-uri", run_from_uri_tests); + g_test_add_func ("/uri/roundtrip", run_roundtrip_tests); + g_test_add_func ("/uri/list", run_uri_list_tests); + g_test_add_func ("/uri/unescape", test_uri_unescape); + g_test_add_func ("/uri/escape", test_uri_escape); + g_test_add_func ("/uri/scheme", test_uri_scheme); + + return g_test_run (); +} diff --git a/glib/tests/utf8-misc.c b/glib/tests/utf8-misc.c new file mode 100644 index 0000000..764cd3d --- /dev/null +++ b/glib/tests/utf8-misc.c @@ -0,0 +1,146 @@ +/* Unit tests for utilities + * 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. + * + * Author: Matthias Clasen + */ + +#include "glib.h" + +static void +test_utf8_strlen (void) +{ + const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl"; + + g_assert_cmpint (g_utf8_strlen (string, -1), ==, 6); + g_assert_cmpint (g_utf8_strlen (string, 0), ==, 0); + g_assert_cmpint (g_utf8_strlen (string, 1), ==, 0); + g_assert_cmpint (g_utf8_strlen (string, 2), ==, 0); + g_assert_cmpint (g_utf8_strlen (string, 3), ==, 1); + g_assert_cmpint (g_utf8_strlen (string, 4), ==, 2); + g_assert_cmpint (g_utf8_strlen (string, 5), ==, 3); + g_assert_cmpint (g_utf8_strlen (string, 6), ==, 3); + g_assert_cmpint (g_utf8_strlen (string, 7), ==, 3); + g_assert_cmpint (g_utf8_strlen (string, 8), ==, 4); + g_assert_cmpint (g_utf8_strlen (string, 9), ==, 5); + g_assert_cmpint (g_utf8_strlen (string, 10), ==, 6); +} + +static void +test_utf8_strncpy (void) +{ + const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl"; + gchar dest[20]; + + g_utf8_strncpy (dest, string, 0); + g_assert_cmpstr (dest, ==, ""); + + g_utf8_strncpy (dest, string, 1); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0"); + + g_utf8_strncpy (dest, string, 2); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0g"); + + g_utf8_strncpy (dest, string, 3); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh"); + + g_utf8_strncpy (dest, string, 4); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4"); + + g_utf8_strncpy (dest, string, 5); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4j"); + + g_utf8_strncpy (dest, string, 6); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl"); + + g_utf8_strncpy (dest, string, 20); + g_assert_cmpstr (dest, ==, "\xe2\x82\xa0gh\xe2\x82\xa4jl"); +} + +static void +test_utf8_strrchr (void) +{ + const gchar *string = "\xe2\x82\xa0gh\xe2\x82\xa4jl\xe2\x82\xa4jl"; + + g_assert (g_utf8_strrchr (string, -1, 'j') == string + 13); + g_assert (g_utf8_strrchr (string, -1, 8356) == string + 10); + g_assert (g_utf8_strrchr (string, 9, 8356) == string + 5); + g_assert (g_utf8_strrchr (string, 3, 'j') == NULL); + g_assert (g_utf8_strrchr (string, -1, 'x') == NULL); +} + +static void +test_utf8_reverse (void) +{ + gchar *r; + + r = g_utf8_strreverse ("abcdef", -1); + g_assert_cmpstr (r, ==, "fedcba"); + g_free (r); + + r = g_utf8_strreverse ("abcdef", 4); + g_assert_cmpstr (r, ==, "dcba"); + g_free (r); + + /* U+0B0B Oriya Letter Vocalic R + * U+10900 Phoenician Letter Alf + * U+0041 Latin Capital Letter A + * U+1EB6 Latin Capital Letter A With Breve And Dot Below + */ + r = g_utf8_strreverse ("\340\254\213\360\220\244\200\101\341\272\266", -1); + g_assert_cmpstr (r, ==, "\341\272\266\101\360\220\244\200\340\254\213"); + g_free (r); +} + +static void +test_utf8_substring (void) +{ + gchar *r; + + r = g_utf8_substring ("abcd", 1, 3); + g_assert_cmpstr (r, ==, "bc"); + g_free (r); + + r = g_utf8_substring ("abcd", 0, 4); + g_assert_cmpstr (r, ==, "abcd"); + g_free (r); + + r = g_utf8_substring ("abcd", 2, 2); + g_assert_cmpstr (r, ==, ""); + g_free (r); + + r = g_utf8_substring ("abc\xe2\x82\xa0gh\xe2\x82\xa4", 2, 5); + g_assert_cmpstr (r, ==, "c\xe2\x82\xa0g"); + g_free (r); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/utf8/strlen", test_utf8_strlen); + g_test_add_func ("/utf8/strncpy", test_utf8_strncpy); + g_test_add_func ("/utf8/strrchr", test_utf8_strrchr); + g_test_add_func ("/utf8/reverse", test_utf8_reverse); + g_test_add_func ("/utf8/substring", test_utf8_substring); + + return g_test_run(); +} diff --git a/glib/tests/utf8-performance.c b/glib/tests/utf8-performance.c new file mode 100644 index 0000000..fa1e2c2 --- /dev/null +++ b/glib/tests/utf8-performance.c @@ -0,0 +1,200 @@ +/* GLIB - Library of useful routines for C programming + * + * Copyright (C) 2010 Mikhail Zabaluev + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * 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 NUM_ITERATIONS 500000 + +static const char str_ascii[] = + "The quick brown fox jumps over the lazy dog"; + +static const gchar str_latin1[] = + "Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich"; + +/* Energizing GOELRO-talk in Russian, used by KDE */ +static const char str_cyrillic[] = + "Широкая электрификация южных губерний даст мощный толчок подъёму " + "сельского хозяйства."; + +/* First sentence from the Wikipedia article: + * http://zh.wikipedia.org/w/index.php?title=%E6%B1%89%E5%AD%97&oldid=13053137 */ +static const char str_chinese[] = + "漢字,亦稱中文字、中国字,在台灣又被稱為國字,是漢字文化圈廣泛使用的一種文字,屬於表意文字的詞素音節文字"; + +typedef int (* GrindFunc) (const char *, gsize); + +static int +grind_get_char (const char *str, gsize len) +{ + gunichar acc = 0; + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + const char *p = str; + while (*p) { + acc += g_utf8_get_char (p); + p = g_utf8_next_char (p); + } + } + return acc; +} + +static int +grind_get_char_validated (const char *str, gsize len) +{ + gunichar acc = 0; + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + const char *p = str; + while (*p) { + acc += g_utf8_get_char_validated (p, -1); + p = g_utf8_next_char (p); + } + } + return acc; +} + +static int +grind_utf8_to_ucs4 (const char *str, gsize len) +{ + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + gunichar *ustr; + ustr = g_utf8_to_ucs4 (str, -1, NULL, NULL, NULL); + g_free (ustr); + } + return 0; +} + +static int +grind_get_char_backwards (const char *str, gsize len) +{ + gunichar acc = 0; + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + const char *p = str + len; + do + { + p = g_utf8_prev_char (p); + acc += g_utf8_get_char (p); + } + while (p != str); + } + return acc; +} + +static int +grind_utf8_to_ucs4_sized (const char *str, gsize len) +{ + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + gunichar *ustr; + ustr = g_utf8_to_ucs4 (str, len, NULL, NULL, NULL); + g_free (ustr); + } + return 0; +} + +static int +grind_utf8_to_ucs4_fast (const char *str, gsize len) +{ + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + gunichar *ustr; + ustr = g_utf8_to_ucs4_fast (str, -1, NULL); + g_free (ustr); + } + return 0; +} + +static int +grind_utf8_to_ucs4_fast_sized (const char *str, gsize len) +{ + int i; + for (i = 0; i < NUM_ITERATIONS; i++) + { + gunichar *ustr; + ustr = g_utf8_to_ucs4_fast (str, len, NULL); + g_free (ustr); + } + return 0; +} + +static void +perform_for (GrindFunc grind_func, const char *str, const char *label) +{ + gsize len; + gulong bytes_ground; + gdouble time_elapsed; + gdouble result; + + len = strlen (str); + bytes_ground = (gulong) len * NUM_ITERATIONS; + + g_test_timer_start (); + + grind_func (str, len); + + time_elapsed = g_test_timer_elapsed (); + + result = ((gdouble) bytes_ground / time_elapsed) * 1.0e-6; + + g_test_maximized_result (result, "%-9s %6.1f MB/s", label, result); +} + +static void +perform (gconstpointer data) +{ + GrindFunc grind_func = (GrindFunc) data; + + if (!g_test_perf ()) + return; + + perform_for (grind_func, str_ascii, "ASCII:"); + perform_for (grind_func, str_latin1, "Latin-1:"); + perform_for (grind_func, str_cyrillic, "Cyrillic:"); + perform_for (grind_func, str_chinese, "Chinese:"); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + if (g_test_perf ()) + { + g_test_add_data_func ("/utf8/perf/get_char", grind_get_char, perform); + g_test_add_data_func ("/utf8/perf/get_char-backwards", grind_get_char_backwards, perform); + g_test_add_data_func ("/utf8/perf/get_char_validated", grind_get_char_validated, perform); + g_test_add_data_func ("/utf8/perf/utf8_to_ucs4", grind_utf8_to_ucs4, perform); + g_test_add_data_func ("/utf8/perf/utf8_to_ucs4-sized", grind_utf8_to_ucs4_sized, perform); + g_test_add_data_func ("/utf8/perf/utf8_to_ucs4_fast", grind_utf8_to_ucs4_fast, perform); + g_test_add_data_func ("/utf8/perf/utf8_to_ucs4_fast-sized", grind_utf8_to_ucs4_fast_sized, perform); + } + + return g_test_run (); +} diff --git a/glib/tests/utf8-pointer.c b/glib/tests/utf8-pointer.c new file mode 100644 index 0000000..6ef27d3 --- /dev/null +++ b/glib/tests/utf8-pointer.c @@ -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/. + */ + +#include +#include + +/* Test conversions between offsets and pointers */ + +static void test_utf8 (gconstpointer d) +{ + gint num_chars; + const gchar **p; + gint i, j; + const gchar *string = d; + + g_assert (g_utf8_validate (string, -1, NULL)); + + num_chars = g_utf8_strlen (string, -1); + + p = (const 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_find (void) +{ + /* U+0B0B Oriya Letter Vocalic R (\340\254\213) + * U+10900 Phoenician Letter Alf (\360\220\244\200) + * U+0041 Latin Capital Letter A (\101) + * U+1EB6 Latin Capital Letter A With Breve And Dot Below (\341\272\266) + */ + const gchar *str = "\340\254\213\360\220\244\200\101\341\272\266"; + const gchar *p = str + strlen (str); + const gchar *q; + + q = g_utf8_find_prev_char (str, p); + g_assert (q == str + 8); + q = g_utf8_find_prev_char (str, q); + g_assert (q == str + 7); + q = g_utf8_find_prev_char (str, q); + g_assert (q == str + 3); + q = g_utf8_find_prev_char (str, q); + g_assert (q == str); + q = g_utf8_find_prev_char (str, q); + g_assert (q == NULL); + + p = str + 2; + q = g_utf8_find_next_char (p, NULL); + g_assert (q == str + 3); + q = g_utf8_find_next_char (q, NULL); + g_assert (q == str + 7); + + q = g_utf8_find_next_char (p, str + 6); + g_assert (q == str + 3); + q = g_utf8_find_next_char (q, str + 6); + g_assert (q == NULL); +} + +int main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_data_func ("/utf8/offsets", longline, test_utf8); + g_test_add_func ("/utf8/lengths", test_length); + g_test_add_func ("/utf8/find", test_find); + + return g_test_run (); +} diff --git a/glib/tests/utf8-validate.c b/glib/tests/utf8-validate.c new file mode 100644 index 0000000..e570d5a --- /dev/null +++ b/glib/tests/utf8-validate.c @@ -0,0 +1,305 @@ +/* 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) + + +typedef struct { + const gchar *text; + gint max_len; + gint offset; + gboolean valid; +} Test; + +Test 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 (gconstpointer d) +{ + const Test *test = d; + const gchar *end; + gboolean result; + + result = g_utf8_validate (test->text, test->max_len, &end); + + g_assert (result == test->valid); + g_assert (end - test->text == test->offset); +} + +int +main (int argc, char *argv[]) +{ + gint i; + gchar *path; + + g_test_init (&argc, &argv, NULL); + + for (i = 0; test[i].text; i++) + { + path = g_strdup_printf ("/utf8/validate/%d", i); + g_test_add_data_func (path, &test[i], do_test); + g_free (path); + } + + return g_test_run (); +} diff --git a/glib/tests/utils.c b/glib/tests/utils.c new file mode 100644 index 0000000..1e4fbbc --- /dev/null +++ b/glib/tests/utils.c @@ -0,0 +1,554 @@ +/* Unit tests for utilities + * 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. + * + * Author: Matthias Clasen + */ + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "glib.h" + +#include +#include +#include + +static gboolean +strv_check (const gchar * const *strv, ...) +{ + va_list args; + gchar *s; + gint i; + + va_start (args, strv); + for (i = 0; strv[i]; i++) + { + s = va_arg (args, gchar*); + if (g_strcmp0 (strv[i], s) != 0) + { + va_end (args); + return FALSE; + } + } + + va_end (args); + + return TRUE; +} + +static void +test_language_names (void) +{ + const gchar * const *names; + + g_setenv ("LANGUAGE", "de:en_US", TRUE); + names = g_get_language_names (); + g_assert (strv_check (names, "de", "en_US", "en", "C", NULL)); + + g_setenv ("LANGUAGE", "tt_RU.UTF-8@iqtelif", TRUE); + names = g_get_language_names (); + g_assert (strv_check (names, + "tt_RU.UTF-8@iqtelif", + "tt_RU@iqtelif", + "tt.UTF-8@iqtelif", + "tt@iqtelif", + "tt_RU.UTF-8", + "tt_RU", + "tt.UTF-8", + "tt", + "C", + NULL)); +} + +static void +test_locale_variants (void) +{ + char **v; + + v = g_get_locale_variants ("fr_BE"); + g_assert (strv_check ((const gchar * const *) v, "fr_BE", "fr", NULL)); + g_strfreev (v); + + v = g_get_locale_variants ("sr_SR@latin"); + g_assert (strv_check ((const gchar * const *) v, "sr_SR@latin", "sr@latin", "sr_SR", "sr", NULL)); + g_strfreev (v); +} + +static void +test_version (void) +{ + if (g_test_verbose ()) + g_print ("(header %d.%d.%d library %d.%d.%d) ", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION, + glib_major_version, glib_minor_version, glib_micro_version); + + g_assert (glib_check_version (GLIB_MAJOR_VERSION, + GLIB_MINOR_VERSION, + GLIB_MICRO_VERSION) == NULL); + g_assert (glib_check_version (GLIB_MAJOR_VERSION, + GLIB_MINOR_VERSION, + 0) == NULL); + g_assert (glib_check_version (GLIB_MAJOR_VERSION - 1, + 0, + 0) != NULL); + g_assert (glib_check_version (GLIB_MAJOR_VERSION + 1, + 0, + 0) != NULL); + g_assert (glib_check_version (GLIB_MAJOR_VERSION, + GLIB_MINOR_VERSION + 1, + 0) != NULL); + /* don't use + 1 here, since a +/-1 difference can + * happen due to post-release version bumps in git + */ + g_assert (glib_check_version (GLIB_MAJOR_VERSION, + GLIB_MINOR_VERSION, + GLIB_MICRO_VERSION + 3) != NULL); +} + +static const gchar *argv0; + +static void +test_appname (void) +{ + const gchar *prgname; + const gchar *appname; + + prgname = g_get_prgname (); + appname = g_get_application_name (); + g_assert_cmpstr (prgname, ==, argv0); + g_assert_cmpstr (appname, ==, prgname); + + g_set_prgname ("prgname"); + + prgname = g_get_prgname (); + appname = g_get_application_name (); + g_assert_cmpstr (prgname, ==, "prgname"); + g_assert_cmpstr (appname, ==, "prgname"); + + g_set_application_name ("appname"); + + prgname = g_get_prgname (); + appname = g_get_application_name (); + g_assert_cmpstr (prgname, ==, "prgname"); + g_assert_cmpstr (appname, ==, "appname"); +} + +static void +test_tmpdir (void) +{ + g_test_bug ("627969"); + g_assert_cmpstr (g_get_tmp_dir (), !=, ""); +} + +static void +test_bits (void) +{ + gulong mask; + gint max_bit; + gint i, pos; + + pos = g_bit_nth_lsf (0, -1); + g_assert_cmpint (pos, ==, -1); + + max_bit = sizeof (gulong) * 8; + for (i = 0; i < max_bit; i++) + { + mask = 1UL << i; + + pos = g_bit_nth_lsf (mask, -1); + g_assert_cmpint (pos, ==, i); + + pos = g_bit_nth_lsf (mask, i - 3); + g_assert_cmpint (pos , ==, i); + + pos = g_bit_nth_lsf (mask, i); + g_assert_cmpint (pos , ==, -1); + + pos = g_bit_nth_lsf (mask, i + 1); + g_assert_cmpint (pos , ==, -1); + } + + pos = g_bit_nth_msf (0, -1); + g_assert_cmpint (pos, ==, -1); + + for (i = 0; i < max_bit; i++) + { + mask = 1UL << i; + + pos = g_bit_nth_msf (mask, -1); + g_assert_cmpint (pos, ==, i); + + pos = g_bit_nth_msf (mask, i + 3); + g_assert_cmpint (pos , ==, i); + + pos = g_bit_nth_msf (mask, i); + g_assert_cmpint (pos , ==, -1); + + if (i > 0) + { + pos = g_bit_nth_msf (mask, i - 1); + g_assert_cmpint (pos , ==, -1); + } + } +} + +static void +test_swap (void) +{ + guint16 a16, b16; + guint32 a32, b32; + guint64 a64, b64; + + a16 = 0xaabb; + b16 = 0xbbaa; + + g_assert_cmpint (GUINT16_SWAP_LE_BE (a16), ==, b16); + + a32 = 0xaaaabbbb; + b32 = 0xbbbbaaaa; + + g_assert_cmpint (GUINT32_SWAP_LE_BE (a32), ==, b32); + + a64 = G_GUINT64_CONSTANT(0xaaaaaaaabbbbbbbb); + b64 = G_GUINT64_CONSTANT(0xbbbbbbbbaaaaaaaa); + + g_assert_cmpint (GUINT64_SWAP_LE_BE (a64), ==, b64); +} + +static void +test_find_program (void) +{ + gchar *res; + +#ifdef G_OS_UNIX + res = g_find_program_in_path ("sh"); + g_assert (res != NULL); + g_free (res); + + res = g_find_program_in_path ("/bin/sh"); + g_assert (res != NULL); + g_free (res); +#else + /* There's not a lot we can search for that would reliably work both + * on real Windows and mingw. + */ +#endif + + res = g_find_program_in_path ("this_program_does_not_exit"); + g_assert (res == NULL); + + res = g_find_program_in_path ("/bin"); + g_assert (res == NULL); + + res = g_find_program_in_path ("/etc/passwd"); + g_assert (res == NULL); +} + +static void +test_debug (void) +{ + GDebugKey keys[] = { + { "key1", 1 }, + { "key2", 2 }, + { "key3", 4 }, + }; + guint res; + + res = g_parse_debug_string (NULL, keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 0); + + res = g_parse_debug_string ("foobabla;#!%!$%112 223", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 0); + + res = g_parse_debug_string ("key1:key2", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 3); + + res = g_parse_debug_string ("key1;key2", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 3); + + res = g_parse_debug_string ("key1,key2", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 3); + + res = g_parse_debug_string ("key1 key2", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 3); + + res = g_parse_debug_string ("key1\tkey2", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 3); + + res = g_parse_debug_string ("all", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 7); + + if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) + { + res = g_parse_debug_string ("help", keys, G_N_ELEMENTS (keys)); + g_assert_cmpint (res, ==, 0); + exit (0); + } + g_test_trap_assert_passed (); + g_test_trap_assert_stderr ("*Supported debug values: key1 key2 key3 all help*"); +} + +static void +test_codeset (void) +{ + gchar *c; + const gchar *c2; + + c = g_get_codeset (); + g_get_charset (&c2); + + g_assert_cmpstr (c, ==, c2); + + g_free (c); +} + +static void +test_basename (void) +{ + const gchar *path = "/path/to/a/file/deep/down.sh"; + const gchar *b; + + b = g_basename (path); + + g_assert_cmpstr (b, ==, "down.sh"); +} + +extern const gchar *glib_pgettext (const gchar *msgidctxt, gsize msgidoffset); + +static void +test_gettext (void) +{ + const gchar *am0, *am1, *am2, *am3; + + am0 = glib_pgettext ("GDateTime\004AM", strlen ("GDateTime") + 1); + am1 = g_dpgettext ("glib20", "GDateTime\004AM", strlen ("GDateTime") + 1); + am2 = g_dpgettext ("glib20", "GDateTime|AM", 0); + am3 = g_dpgettext2 ("glib20", "GDateTime", "AM"); + + g_assert_cmpstr (am0, ==, am1); + g_assert_cmpstr (am1, ==, am2); + g_assert_cmpstr (am2, ==, am3); +} + +static void +test_username (void) +{ + const gchar *name; + + name = g_get_user_name (); + + g_assert (name != NULL); +} + +static void +test_realname (void) +{ + const gchar *name; + + name = g_get_real_name (); + + g_assert (name != NULL); +} + +static void +test_hostname (void) +{ + const gchar *name; + + name = g_get_host_name (); + + g_assert (name != NULL); +} + +#ifdef G_OS_UNIX +static void +test_xdg_dirs (void) +{ + gchar *xdg; + const gchar *dir; + const gchar * const *dirs; + gchar *s; + + xdg = g_strdup (g_getenv ("XDG_CONFIG_HOME")); + if (!xdg) + xdg = g_build_filename (g_get_home_dir (), ".config", NULL); + + dir = g_get_user_config_dir (); + + g_assert_cmpstr (dir, ==, xdg); + g_free (xdg); + + xdg = g_strdup (g_getenv ("XDG_DATA_HOME")); + if (!xdg) + xdg = g_build_filename (g_get_home_dir (), ".local", "share", NULL); + + dir = g_get_user_data_dir (); + + g_assert_cmpstr (dir, ==, xdg); + g_free (xdg); + + xdg = g_strdup (g_getenv ("XDG_CACHE_HOME")); + if (!xdg) + xdg = g_build_filename (g_get_home_dir (), ".cache", NULL); + + dir = g_get_user_cache_dir (); + + g_assert_cmpstr (dir, ==, xdg); + g_free (xdg); + + xdg = g_strdup (g_getenv ("XDG_RUNTIME_DIR")); + if (!xdg) + xdg = g_strdup (g_get_user_cache_dir ()); + + dir = g_get_user_runtime_dir (); + + g_assert_cmpstr (dir, ==, xdg); + g_free (xdg); + + xdg = (gchar *)g_getenv ("XDG_CONFIG_DIRS"); + if (!xdg) + xdg = "/etc/xdg"; + + dirs = g_get_system_config_dirs (); + + s = g_strjoinv (":", (gchar **)dirs); + + g_assert_cmpstr (s, ==, xdg); + + g_strfreev ((gchar **)dirs); + g_free (s); +} +#endif + +static void +test_special_dir (void) +{ + const gchar *dir, *dir2; + + dir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + g_reload_user_special_dirs_cache (); + dir2 = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + + g_assert_cmpstr (dir, ==, dir2); +} + +static void +test_desktop_special_dir (void) +{ + const gchar *dir, *dir2; + + dir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + g_assert (dir != NULL); + + g_reload_user_special_dirs_cache (); + dir2 = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + g_assert (dir2 != NULL); +} + +static void +test_clear_pointer (void) +{ + gpointer a; + + a = g_malloc (5); + g_clear_pointer (&a, g_free); + g_assert (a == NULL); + + a = g_malloc (5); + (g_clear_pointer) (&a, g_free); + g_assert (a == NULL); +} + +static void +test_misc_mem (void) +{ + gpointer a; + + a = g_try_malloc (0); + g_assert (a == NULL); + + a = g_try_malloc0 (0); + g_assert (a == NULL); + + a = g_malloc (16); + a = g_try_realloc (a, 20); + a = g_try_realloc (a, 0); + + g_assert (a == NULL); +} + +static void +test_nullify (void) +{ + gpointer p = &test_nullify; + + g_assert (p != NULL); + + g_nullify_pointer (&p); + + g_assert (p == NULL); +} + +int +main (int argc, + char *argv[]) +{ + argv0 = argv[0]; + + /* for tmpdir test, need to do this early before g_get_any_init */ + g_setenv ("TMPDIR", "", TRUE); + g_unsetenv ("TMP"); + g_unsetenv ("TEMP"); + + /* g_test_init() only calls g_set_prgname() if g_get_prgname() + * returns %NULL, but g_get_prgname() on Windows never returns NULL. + * So we need to do this by hand to make test_appname() work on + * Windows. + */ + g_set_prgname (argv[0]); + + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/utils/language-names", test_language_names); + g_test_add_func ("/utils/locale-variants", test_locale_variants); + g_test_add_func ("/utils/version", test_version); + g_test_add_func ("/utils/appname", test_appname); + g_test_add_func ("/utils/tmpdir", test_tmpdir); + g_test_add_func ("/utils/bits", test_bits); + g_test_add_func ("/utils/swap", test_swap); + g_test_add_func ("/utils/find-program", test_find_program); + g_test_add_func ("/utils/debug", test_debug); + g_test_add_func ("/utils/codeset", test_codeset); + g_test_add_func ("/utils/basename", test_basename); + g_test_add_func ("/utils/gettext", test_gettext); + g_test_add_func ("/utils/username", test_username); + g_test_add_func ("/utils/realname", test_realname); + g_test_add_func ("/utils/hostname", test_hostname); +#ifdef G_OS_UNIX + g_test_add_func ("/utils/xdgdirs", test_xdg_dirs); +#endif + g_test_add_func ("/utils/specialdir", test_special_dir); + g_test_add_func ("/utils/specialdir/desktop", test_desktop_special_dir); + g_test_add_func ("/utils/clear-pointer", test_clear_pointer); + g_test_add_func ("/utils/misc-mem", test_misc_mem); + g_test_add_func ("/utils/nullify", test_nullify); + + return g_test_run (); +} diff --git a/glib/update-pcre/Makefile.am b/glib/update-pcre/Makefile.am new file mode 100644 index 0000000..66943ec --- /dev/null +++ b/glib/update-pcre/Makefile.am @@ -0,0 +1,6 @@ +include $(top_srcdir)/Makefile.decl + +EXTRA_DIST += \ + update.sh \ + digitab.patch \ + memory.patch diff --git a/glib/update-pcre/digitab.patch b/glib/update-pcre/digitab.patch new file mode 100644 index 0000000..a12efc5 --- /dev/null +++ b/glib/update-pcre/digitab.patch @@ -0,0 +1,94 @@ +From 5238ab10c5f3082a4be38410bd01a47ab176dfde Mon Sep 17 00:00:00 2001 +From: Christian Persch +Date: Sun, 12 Feb 2012 19:29:42 +0100 +Subject: [PATCH] regex: Use g_ascii_is[x]digit + +--- + glib/pcre/pcre_compile.c | 22 ++++++++++++---------- + 1 files changed, 12 insertions(+), 10 deletions(-) + +diff --git a/glib/pcre/pcre_compile.c b/glib/pcre/pcre_compile.c +index 8070f51..eb985df 100644 +--- a/glib/pcre/pcre_compile.c ++++ b/glib/pcre/pcre_compile.c +@@ -52,6 +52,7 @@ supporting internal functions that are not used by other modules. */ + + #include "pcre_internal.h" + ++#include "gstrfuncs.h" + + /* When PCRE_DEBUG is defined, we need the pcre(16)_printint() function, which + is also used by pcretest. PCRE_DEBUG is not defined when building a production +@@ -513,6 +514,7 @@ into a subtraction and unsigned comparison). */ + + #define IS_DIGIT(x) ((x) >= CHAR_0 && (x) <= CHAR_9) + ++#if 0 + #ifndef EBCDIC + + /* This is the "normal" case, for ASCII systems, and EBCDIC systems running in +@@ -626,7 +628,7 @@ static const pcre_uint8 ebcdic_chartab[] = { /* chartable partial dup */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ + #endif +- ++#endif /* 0 */ + + /* Definition to allow mutual recursion */ + +@@ -812,10 +814,10 @@ else + { + /* In JavaScript, \u must be followed by four hexadecimal numbers. + Otherwise it is a lowercase u letter. */ +- if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0 +- && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0 +- && MAX_255(ptr[3]) && (digitab[ptr[3]] & ctype_xdigit) != 0 +- && MAX_255(ptr[4]) && (digitab[ptr[4]] & ctype_xdigit) != 0) ++ if (MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0 ++ && MAX_255(ptr[2]) && g_ascii_isxdigit(ptr[2]) != 0 ++ && MAX_255(ptr[3]) && g_ascii_isxdigit(ptr[3]) != 0 ++ && MAX_255(ptr[4]) && g_ascii_isxdigit(ptr[4]) != 0) + { + c = 0; + for (i = 0; i < 4; ++i) +@@ -1012,8 +1014,8 @@ else + { + /* In JavaScript, \x must be followed by two hexadecimal numbers. + Otherwise it is a lowercase x letter. */ +- if (MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0 +- && MAX_255(ptr[2]) && (digitab[ptr[2]] & ctype_xdigit) != 0) ++ if (MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0 ++ && MAX_255(ptr[2]) && g_ascii_isxdigit(ptr[2]) != 0) + { + c = 0; + for (i = 0; i < 2; ++i) +@@ -1036,7 +1038,7 @@ else + const pcre_uchar *pt = ptr + 2; + + c = 0; +- while (MAX_255(*pt) && (digitab[*pt] & ctype_xdigit) != 0) ++ while (MAX_255(*pt) && g_ascii_isxdigit(*pt) != 0) + { + register int cc = *pt++; + if (c == 0 && cc == CHAR_0) continue; /* Leading zeroes */ +@@ -1060,7 +1062,7 @@ else + + if (c < 0) + { +- while (MAX_255(*pt) && (digitab[*pt] & ctype_xdigit) != 0) pt++; ++ while (MAX_255(*pt) && g_ascii_isxdigit(*pt) != 0) pt++; + *errorcodeptr = ERR34; + } + +@@ -1078,7 +1080,7 @@ else + /* Read just a single-byte hex-defined char */ + + c = 0; +- while (i++ < 2 && MAX_255(ptr[1]) && (digitab[ptr[1]] & ctype_xdigit) != 0) ++ while (i++ < 2 && MAX_255(ptr[1]) && g_ascii_isxdigit(ptr[1]) != 0) + { + int cc; /* Some compilers don't like */ + cc = *(++ptr); /* ++ in initializers */ +-- +1.7.5.1.217.g4e3aa.dirty + diff --git a/glib/update-pcre/memory.patch b/glib/update-pcre/memory.patch new file mode 100644 index 0000000..f3a04c7 --- /dev/null +++ b/glib/update-pcre/memory.patch @@ -0,0 +1,40 @@ +From acf401f1353a37b6edff9577ff07d055c625e4ca Mon Sep 17 00:00:00 2001 +From: Christian Persch +Date: Sun, 12 Feb 2012 19:40:48 +0100 +Subject: [PATCH] regex: Use glib memory allocator + +--- + glib/pcre/pcre_globals.c | 10 ++++++---- + 1 files changed, 6 insertions(+), 4 deletions(-) + +diff --git a/glib/pcre/pcre_globals.c b/glib/pcre/pcre_globals.c +index 36e6ddb..93d3af5 100644 +--- a/glib/pcre/pcre_globals.c ++++ b/glib/pcre/pcre_globals.c +@@ -58,6 +58,8 @@ global variables are not used. */ + + #include "pcre_internal.h" + ++#include "gmem.h" ++ + #if defined _MSC_VER || defined __SYMBIAN32__ + static void* LocalPcreMalloc(size_t aSize) + { +@@ -74,10 +76,10 @@ PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = LocalPcreFree; + PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; + + #elif !defined VPCOMPAT +-PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = malloc; +-PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = free; +-PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = malloc; +-PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = free; ++PCRE_EXP_DATA_DEFN void *(*PUBL(malloc))(size_t) = g_try_malloc; ++PCRE_EXP_DATA_DEFN void (*PUBL(free))(void *) = g_free; ++PCRE_EXP_DATA_DEFN void *(*PUBL(stack_malloc))(size_t) = g_try_malloc; ++PCRE_EXP_DATA_DEFN void (*PUBL(stack_free))(void *) = g_free; + PCRE_EXP_DATA_DEFN int (*PUBL(callout))(PUBL(callout_block) *) = NULL; + #endif + +-- +1.7.5.1.217.g4e3aa.dirty + diff --git a/glib/update-pcre/ucp.patch b/glib/update-pcre/ucp.patch new file mode 100644 index 0000000..402020f --- /dev/null +++ b/glib/update-pcre/ucp.patch @@ -0,0 +1,834 @@ +From 23d48c5fc7aa889dc7798f9c64acd43d9cb34683 Mon Sep 17 00:00:00 2001 +From: Christian Persch +Date: Sun, 12 Feb 2012 21:20:33 +0100 +Subject: [PATCH] regex: Use glib for unicode data + +Use g_unichar_type() and g_unichar_get_script() instead of pcre tables. +--- + glib/pcre/pcre_compile.c | 26 +++--- + glib/pcre/pcre_dfa_exec.c | 96 ++++++++-------- + glib/pcre/pcre_exec.c | 26 +++--- + glib/pcre/pcre_internal.h | 11 +-- + glib/pcre/pcre_tables.c | 16 +++ + glib/pcre/pcre_xclass.c | 24 ++-- + glib/pcre/ucp.h | 265 +++++++++++++++++++++++---------------------- + 7 files changed, 239 insertions(+), 225 deletions(-) + +diff --git a/glib/pcre/pcre_compile.c b/glib/pcre/pcre_compile.c +index 21bef80..a6c84e1 100644 +--- a/glib/pcre/pcre_compile.c ++++ b/glib/pcre/pcre_compile.c +@@ -2920,43 +2920,43 @@ Returns: TRUE if auto-possessifying is OK + static BOOL + check_char_prop(int c, int ptype, int pdata, BOOL negated) + { +-const ucd_record *prop = GET_UCD(c); ++const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(ptype) + { + case PT_LAMP: +- return (prop->chartype == ucp_Lu || +- prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt) == negated; ++ return (chartype == ucp_Lu || ++ chartype == ucp_Ll || ++ chartype == ucp_Lt) == negated; + + case PT_GC: +- return (pdata == PRIV(ucp_gentype)[prop->chartype]) == negated; ++ return (pdata == PRIV(ucp_gentype)[chartype]) == negated; + + case PT_PC: +- return (pdata == prop->chartype) == negated; ++ return (pdata == chartype) == negated; + + case PT_SC: +- return (pdata == prop->script) == negated; ++ return (pdata == UCD_SCRIPT(c)) == negated; + + /* These are specials */ + + case PT_ALNUM: +- return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N) == negated; ++ return (PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N) == negated; + + case PT_SPACE: /* Perl space */ +- return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ return (PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == negated; + + case PT_PXSPACE: /* POSIX space */ +- return (PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ return (PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) + == negated; + + case PT_WORD: +- return (PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ return (PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE) == negated; + } + return FALSE; +diff --git a/glib/pcre/pcre_dfa_exec.c b/glib/pcre/pcre_dfa_exec.c +index 9565d46..3f913ce 100644 +--- a/glib/pcre/pcre_dfa_exec.c ++++ b/glib/pcre/pcre_dfa_exec.c +@@ -1060,7 +1060,7 @@ for (;;) + if (clen > 0) + { + BOOL OK; +- const ucd_record * prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(code[1]) + { + case PT_ANY: +@@ -1068,43 +1068,43 @@ for (;;) + break; + + case PT_LAMP: +- OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt; ++ OK = chartype == ucp_Lu || chartype == ucp_Ll || ++ chartype == ucp_Lt; + break; + + case PT_GC: +- OK = PRIV(ucp_gentype)[prop->chartype] == code[2]; ++ OK = PRIV(ucp_gentype)[chartype] == code[2]; + break; + + case PT_PC: +- OK = prop->chartype == code[2]; ++ OK = chartype == code[2]; + break; + + case PT_SC: +- OK = prop->script == code[2]; ++ OK = UCD_SCRIPT(c) == code[2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N; ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + +@@ -1294,7 +1294,7 @@ for (;;) + if (clen > 0) + { + BOOL OK; +- const ucd_record * prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(code[2]) + { + case PT_ANY: +@@ -1302,43 +1302,43 @@ for (;;) + break; + + case PT_LAMP: +- OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt; ++ OK = chartype == ucp_Lu || chartype == ucp_Ll || ++ chartype == ucp_Lt; + break; + + case PT_GC: +- OK = PRIV(ucp_gentype)[prop->chartype] == code[3]; ++ OK = PRIV(ucp_gentype)[chartype] == code[3]; + break; + + case PT_PC: +- OK = prop->chartype == code[3]; ++ OK = chartype == code[3]; + break; + + case PT_SC: +- OK = prop->script == code[3]; ++ OK = UCD_SCRIPT(c) == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N; ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + +@@ -1541,7 +1541,7 @@ for (;;) + if (clen > 0) + { + BOOL OK; +- const ucd_record * prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(code[2]) + { + case PT_ANY: +@@ -1549,43 +1549,43 @@ for (;;) + break; + + case PT_LAMP: +- OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt; ++ OK = chartype == ucp_Lu || chartype == ucp_Ll || ++ chartype == ucp_Lt; + break; + + case PT_GC: +- OK = PRIV(ucp_gentype)[prop->chartype] == code[3]; ++ OK = PRIV(ucp_gentype)[chartype] == code[3]; + break; + + case PT_PC: +- OK = prop->chartype == code[3]; ++ OK = chartype == code[3]; + break; + + case PT_SC: +- OK = prop->script == code[3]; ++ OK = UCD_SCRIPT(c) == code[3]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N; ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + +@@ -1813,7 +1813,7 @@ for (;;) + if (clen > 0) + { + BOOL OK; +- const ucd_record * prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + switch(code[1 + IMM2_SIZE + 1]) + { + case PT_ANY: +@@ -1821,43 +1821,43 @@ for (;;) + break; + + case PT_LAMP: +- OK = prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt; ++ OK = chartype == ucp_Lu || chartype == ucp_Ll || ++ chartype == ucp_Lt; + break; + + case PT_GC: +- OK = PRIV(ucp_gentype)[prop->chartype] == code[1 + IMM2_SIZE + 2]; ++ OK = PRIV(ucp_gentype)[chartype] == code[1 + IMM2_SIZE + 2]; + break; + + case PT_PC: +- OK = prop->chartype == code[1 + IMM2_SIZE + 2]; ++ OK = chartype == code[1 + IMM2_SIZE + 2]; + break; + + case PT_SC: +- OK = prop->script == code[1 + IMM2_SIZE + 2]; ++ OK = UCD_SCRIPT(c) == code[1 + IMM2_SIZE + 2]; + break; + + /* These are specials for combination cases. */ + + case PT_ALNUM: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N; ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N; + break; + + case PT_SPACE: /* Perl space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR; + break; + + case PT_PXSPACE: /* POSIX space */ +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR; + break; + + case PT_WORD: +- OK = PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ OK = PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE; + break; + +diff --git a/glib/pcre/pcre_exec.c b/glib/pcre/pcre_exec.c +index 830b8b5..c89a3f9 100644 +--- a/glib/pcre/pcre_exec.c ++++ b/glib/pcre/pcre_exec.c +@@ -2565,7 +2565,7 @@ for (;;) + } + GETCHARINCTEST(c, eptr); + { +- const ucd_record *prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + + switch(ecode[1]) + { +@@ -2574,44 +2574,44 @@ for (;;) + break; + + case PT_LAMP: +- if ((prop->chartype == ucp_Lu || +- prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt) == (op == OP_NOTPROP)) ++ if ((chartype == ucp_Lu || ++ chartype == ucp_Ll || ++ chartype == ucp_Lt) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_GC: +- if ((ecode[2] != PRIV(ucp_gentype)[prop->chartype]) == (op == OP_PROP)) ++ if ((ecode[2] != PRIV(ucp_gentype)[chartype]) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_PC: +- if ((ecode[2] != prop->chartype) == (op == OP_PROP)) ++ if ((ecode[2] != chartype) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_SC: +- if ((ecode[2] != prop->script) == (op == OP_PROP)) ++ if ((ecode[2] != UCD_SCRIPT(c)) == (op == OP_PROP)) + RRETURN(MATCH_NOMATCH); + break; + + /* These are specials */ + + case PT_ALNUM: +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N) == (op == OP_NOTPROP)) ++ if ((PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_SPACE: /* Perl space */ +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; + + case PT_PXSPACE: /* POSIX space */ +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) + == (op == OP_NOTPROP)) +@@ -2619,8 +2619,8 @@ for (;;) + break; + + case PT_WORD: +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || ++ if ((PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || + c == CHAR_UNDERSCORE) == (op == OP_NOTPROP)) + RRETURN(MATCH_NOMATCH); + break; +diff --git a/glib/pcre/pcre_internal.h b/glib/pcre/pcre_internal.h +index 181c312..234af1b 100644 +--- a/glib/pcre/pcre_internal.h ++++ b/glib/pcre/pcre_internal.h +@@ -2329,15 +2329,12 @@ extern const int PRIV(ucp_typerange)[]; + #ifdef SUPPORT_UCP + /* UCD access macros */ + +-#define UCD_BLOCK_SIZE 128 +-#define GET_UCD(ch) (PRIV(ucd_records) + \ +- PRIV(ucd_stage2)[PRIV(ucd_stage1)[(ch) / UCD_BLOCK_SIZE] * \ +- UCD_BLOCK_SIZE + (ch) % UCD_BLOCK_SIZE]) ++unsigned int _pcre_ucp_othercase(const unsigned int c); + +-#define UCD_CHARTYPE(ch) GET_UCD(ch)->chartype +-#define UCD_SCRIPT(ch) GET_UCD(ch)->script ++#define UCD_CHARTYPE(ch) (pcre_uint8)g_unichar_type((gunichar)(ch)) ++#define UCD_SCRIPT(ch) (pcre_uint8)g_unichar_get_script((gunichar)(ch)) + #define UCD_CATEGORY(ch) PRIV(ucp_gentype)[UCD_CHARTYPE(ch)] +-#define UCD_OTHERCASE(ch) (ch + GET_UCD(ch)->other_case) ++#define UCD_OTHERCASE(ch) (_pcre_ucp_othercase(ch)) + + #endif /* SUPPORT_UCP */ + +diff --git a/glib/pcre/pcre_tables.c b/glib/pcre/pcre_tables.c +index 7ac2d89..e401974 100644 +--- a/glib/pcre/pcre_tables.c ++++ b/glib/pcre/pcre_tables.c +@@ -584,6 +584,22 @@ const ucp_type_table PRIV(utt)[] = { + + const int PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table); + ++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; ++} ++ + #endif /* SUPPORT_UTF */ + + /* End of pcre_tables.c */ +diff --git a/glib/pcre/pcre_xclass.c b/glib/pcre/pcre_xclass.c +index dca7a39..e5a55d7 100644 +--- a/glib/pcre/pcre_xclass.c ++++ b/glib/pcre/pcre_xclass.c +@@ -127,7 +127,7 @@ while ((t = *data++) != XCL_END) + #ifdef SUPPORT_UCP + else /* XCL_PROP & XCL_NOTPROP */ + { +- const ucd_record *prop = GET_UCD(c); ++ const pcre_uint8 chartype = UCD_CHARTYPE(c); + + switch(*data) + { +@@ -136,46 +136,46 @@ while ((t = *data++) != XCL_END) + break; + + case PT_LAMP: +- if ((prop->chartype == ucp_Lu || prop->chartype == ucp_Ll || +- prop->chartype == ucp_Lt) == (t == XCL_PROP)) return !negated; ++ if ((chartype == ucp_Lu || chartype == ucp_Ll || ++ chartype == ucp_Lt) == (t == XCL_PROP)) return !negated; + break; + + case PT_GC: +- if ((data[1] == PRIV(ucp_gentype)[prop->chartype]) == (t == XCL_PROP)) ++ if ((data[1] == PRIV(ucp_gentype)[chartype]) == (t == XCL_PROP)) + return !negated; + break; + + case PT_PC: +- if ((data[1] == prop->chartype) == (t == XCL_PROP)) return !negated; ++ if ((data[1] == chartype) == (t == XCL_PROP)) return !negated; + break; + + case PT_SC: +- if ((data[1] == prop->script) == (t == XCL_PROP)) return !negated; ++ if ((data[1] == UCD_SCRIPT(c)) == (t == XCL_PROP)) return !negated; + break; + + case PT_ALNUM: +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N) == (t == XCL_PROP)) ++ if ((PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N) == (t == XCL_PROP)) + return !negated; + break; + + case PT_SPACE: /* Perl space */ +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_FF || c == CHAR_CR) + == (t == XCL_PROP)) + return !negated; + break; + + case PT_PXSPACE: /* POSIX space */ +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_Z || ++ if ((PRIV(ucp_gentype)[chartype] == ucp_Z || + c == CHAR_HT || c == CHAR_NL || c == CHAR_VT || + c == CHAR_FF || c == CHAR_CR) == (t == XCL_PROP)) + return !negated; + break; + + case PT_WORD: +- if ((PRIV(ucp_gentype)[prop->chartype] == ucp_L || +- PRIV(ucp_gentype)[prop->chartype] == ucp_N || c == CHAR_UNDERSCORE) ++ if ((PRIV(ucp_gentype)[chartype] == ucp_L || ++ PRIV(ucp_gentype)[chartype] == ucp_N || c == CHAR_UNDERSCORE) + == (t == XCL_PROP)) + return !negated; + break; +diff --git a/glib/pcre/ucp.h b/glib/pcre/ucp.h +index 59c3bec..53a48c9 100644 +--- a/glib/pcre/ucp.h ++++ b/glib/pcre/ucp.h +@@ -10,6 +10,7 @@ the UCD access macros. 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. */ ++#include "gunicode.h" + + enum { + ucp_C, /* Other */ +@@ -24,148 +25,148 @@ enum { + /* 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 */ ++ ucp_Cc = G_UNICODE_CONTROL, /* Control */ ++ ucp_Cf = G_UNICODE_FORMAT, /* Format */ ++ ucp_Cn = G_UNICODE_UNASSIGNED, /* Unassigned */ ++ ucp_Co = G_UNICODE_PRIVATE_USE, /* Private use */ ++ ucp_Cs = G_UNICODE_SURROGATE, /* Surrogate */ ++ ucp_Ll = G_UNICODE_LOWERCASE_LETTER, /* Lower case letter */ ++ ucp_Lm = G_UNICODE_MODIFIER_LETTER, /* Modifier letter */ ++ ucp_Lo = G_UNICODE_OTHER_LETTER, /* Other letter */ ++ ucp_Lt = G_UNICODE_TITLECASE_LETTER, /* Title case letter */ ++ ucp_Lu = G_UNICODE_UPPERCASE_LETTER, /* Upper case letter */ ++ ucp_Mc = G_UNICODE_SPACING_MARK, /* Spacing mark */ ++ ucp_Me = G_UNICODE_ENCLOSING_MARK, /* Enclosing mark */ ++ ucp_Mn = G_UNICODE_NON_SPACING_MARK, /* Non-spacing mark */ ++ ucp_Nd = G_UNICODE_DECIMAL_NUMBER, /* Decimal number */ ++ ucp_Nl = G_UNICODE_LETTER_NUMBER, /* Letter number */ ++ ucp_No = G_UNICODE_OTHER_NUMBER, /* Other number */ ++ ucp_Pc = G_UNICODE_CONNECT_PUNCTUATION, /* Connector punctuation */ ++ ucp_Pd = G_UNICODE_DASH_PUNCTUATION, /* Dash punctuation */ ++ ucp_Pe = G_UNICODE_CLOSE_PUNCTUATION, /* Close punctuation */ ++ ucp_Pf = G_UNICODE_FINAL_PUNCTUATION, /* Final punctuation */ ++ ucp_Pi = G_UNICODE_INITIAL_PUNCTUATION, /* Initial punctuation */ ++ ucp_Po = G_UNICODE_OTHER_PUNCTUATION, /* Other punctuation */ ++ ucp_Ps = G_UNICODE_OPEN_PUNCTUATION, /* Open punctuation */ ++ ucp_Sc = G_UNICODE_CURRENCY_SYMBOL, /* Currency symbol */ ++ ucp_Sk = G_UNICODE_MODIFIER_SYMBOL, /* Modifier symbol */ ++ ucp_Sm = G_UNICODE_MATH_SYMBOL, /* Mathematical symbol */ ++ ucp_So = G_UNICODE_OTHER_SYMBOL, /* Other symbol */ ++ ucp_Zl = G_UNICODE_LINE_SEPARATOR, /* Line separator */ ++ ucp_Zp = G_UNICODE_PARAGRAPH_SEPARATOR, /* Paragraph separator */ ++ ucp_Zs = G_UNICODE_SPACE_SEPARATOR /* Space separator */ + }; + + /* These are the script identifications. */ + + enum { +- ucp_Arabic, +- ucp_Armenian, +- ucp_Bengali, +- ucp_Bopomofo, +- ucp_Braille, +- ucp_Buginese, +- ucp_Buhid, +- ucp_Canadian_Aboriginal, +- ucp_Cherokee, +- ucp_Common, +- ucp_Coptic, +- ucp_Cypriot, +- ucp_Cyrillic, +- ucp_Deseret, +- ucp_Devanagari, +- ucp_Ethiopic, +- ucp_Georgian, +- ucp_Glagolitic, +- ucp_Gothic, +- ucp_Greek, +- ucp_Gujarati, +- ucp_Gurmukhi, +- ucp_Han, +- ucp_Hangul, +- ucp_Hanunoo, +- ucp_Hebrew, +- ucp_Hiragana, +- ucp_Inherited, +- ucp_Kannada, +- ucp_Katakana, +- ucp_Kharoshthi, +- ucp_Khmer, +- ucp_Lao, +- ucp_Latin, +- ucp_Limbu, +- ucp_Linear_B, +- ucp_Malayalam, +- ucp_Mongolian, +- ucp_Myanmar, +- ucp_New_Tai_Lue, +- ucp_Ogham, +- ucp_Old_Italic, +- ucp_Old_Persian, +- ucp_Oriya, +- ucp_Osmanya, +- ucp_Runic, +- ucp_Shavian, +- ucp_Sinhala, +- ucp_Syloti_Nagri, +- ucp_Syriac, +- ucp_Tagalog, +- ucp_Tagbanwa, +- ucp_Tai_Le, +- ucp_Tamil, +- ucp_Telugu, +- ucp_Thaana, +- ucp_Thai, +- ucp_Tibetan, +- ucp_Tifinagh, +- ucp_Ugaritic, +- ucp_Yi, ++ 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, + /* New for Unicode 5.0: */ +- ucp_Balinese, +- ucp_Cuneiform, +- ucp_Nko, +- ucp_Phags_Pa, +- ucp_Phoenician, ++ ucp_Balinese = G_UNICODE_SCRIPT_BALINESE, ++ ucp_Cuneiform = G_UNICODE_SCRIPT_CUNEIFORM, ++ ucp_Nko = G_UNICODE_SCRIPT_NKO, ++ ucp_Phags_Pa = G_UNICODE_SCRIPT_PHAGS_PA, ++ ucp_Phoenician = G_UNICODE_SCRIPT_PHOENICIAN, + /* New for Unicode 5.1: */ +- ucp_Carian, +- ucp_Cham, +- ucp_Kayah_Li, +- ucp_Lepcha, +- ucp_Lycian, +- ucp_Lydian, +- ucp_Ol_Chiki, +- ucp_Rejang, +- ucp_Saurashtra, +- ucp_Sundanese, +- ucp_Vai, ++ ucp_Carian = G_UNICODE_SCRIPT_CARIAN, ++ ucp_Cham = G_UNICODE_SCRIPT_CHAM, ++ ucp_Kayah_Li = G_UNICODE_SCRIPT_KAYAH_LI, ++ ucp_Lepcha = G_UNICODE_SCRIPT_LEPCHA, ++ ucp_Lycian = G_UNICODE_SCRIPT_LYCIAN, ++ ucp_Lydian = G_UNICODE_SCRIPT_LYDIAN, ++ ucp_Ol_Chiki = G_UNICODE_SCRIPT_OL_CHIKI, ++ ucp_Rejang = G_UNICODE_SCRIPT_REJANG, ++ ucp_Saurashtra = G_UNICODE_SCRIPT_SAURASHTRA, ++ ucp_Sundanese = G_UNICODE_SCRIPT_SUNDANESE, ++ ucp_Vai = G_UNICODE_SCRIPT_VAI, + /* New for Unicode 5.2: */ +- ucp_Avestan, +- ucp_Bamum, +- ucp_Egyptian_Hieroglyphs, +- ucp_Imperial_Aramaic, +- ucp_Inscriptional_Pahlavi, +- ucp_Inscriptional_Parthian, +- ucp_Javanese, +- ucp_Kaithi, +- ucp_Lisu, +- ucp_Meetei_Mayek, +- ucp_Old_South_Arabian, +- ucp_Old_Turkic, +- ucp_Samaritan, +- ucp_Tai_Tham, +- ucp_Tai_Viet, ++ ucp_Avestan = G_UNICODE_SCRIPT_AVESTAN, ++ ucp_Bamum = G_UNICODE_SCRIPT_BAMUM, ++ ucp_Egyptian_Hieroglyphs = G_UNICODE_SCRIPT_EGYPTIAN_HIEROGLYPHS, ++ ucp_Imperial_Aramaic = G_UNICODE_SCRIPT_IMPERIAL_ARAMAIC, ++ ucp_Inscriptional_Pahlavi = G_UNICODE_SCRIPT_INSCRIPTIONAL_PAHLAVI, ++ ucp_Inscriptional_Parthian = G_UNICODE_SCRIPT_INSCRIPTIONAL_PARTHIAN, ++ ucp_Javanese = G_UNICODE_SCRIPT_JAVANESE, ++ ucp_Kaithi = G_UNICODE_SCRIPT_KAITHI, ++ ucp_Lisu = G_UNICODE_SCRIPT_LISU, ++ ucp_Meetei_Mayek = G_UNICODE_SCRIPT_MEETEI_MAYEK, ++ ucp_Old_South_Arabian = G_UNICODE_SCRIPT_OLD_SOUTH_ARABIAN, ++ ucp_Old_Turkic = G_UNICODE_SCRIPT_OLD_TURKIC, ++ ucp_Samaritan = G_UNICODE_SCRIPT_SAMARITAN, ++ ucp_Tai_Tham = G_UNICODE_SCRIPT_TAI_THAM, ++ ucp_Tai_Viet = G_UNICODE_SCRIPT_TAI_VIET, + /* New for Unicode 6.0.0: */ +- ucp_Batak, +- ucp_Brahmi, +- ucp_Mandaic, ++ ucp_Batak = G_UNICODE_SCRIPT_BATAK, ++ ucp_Brahmi = G_UNICODE_SCRIPT_BRAHMI, ++ ucp_Mandaic = G_UNICODE_SCRIPT_MANDAIC, + /* New for Unicode 6.1.0: */ +- ucp_Chakma, +- ucp_Meroitic_Cursive, +- ucp_Meroitic_Hieroglyphs, +- ucp_Miao, +- ucp_Sharada, +- ucp_Sora_Sompeng, +- ucp_Takri ++ ucp_Chakma = G_UNICODE_SCRIPT_CHAKMA, ++ ucp_Meroitic_Cursive = G_UNICODE_SCRIPT_MEROITIC_CURSIVE, ++ ucp_Meroitic_Hieroglyphs = G_UNICODE_SCRIPT_MEROITIC_HIEROGLYPHS, ++ ucp_Miao = G_UNICODE_SCRIPT_MIAO, ++ ucp_Sharada = G_UNICODE_SCRIPT_SHARADA, ++ ucp_Sora_Sompeng = G_UNICODE_SCRIPT_SORA_SOMPENG, ++ ucp_Takri = G_UNICODE_SCRIPT_TAKRI, + }; + + #endif +-- +1.7.5.1.217.g4e3aa.dirty + 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..7a55c0a --- /dev/null +++ b/glib/win_iconv.c @@ -0,0 +1,1965 @@ +/* + * 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(void); +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(void) +{ + HMODULE h = NULL; + char mlang_dll[MAX_PATH + 100]; + int n; + if (ConvertINetString != NULL) + return TRUE; + n = GetSystemDirectory(mlang_dll, MAX_PATH); + if (n > 0 && n < MAX_PATH) + { + if (mlang_dll[n-1] != '\\' && + mlang_dll[n-1] != '/') + strcat(mlang_dll, "\\"); + strcat(mlang_dll, "mlang.dll"); + 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/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.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/.gitignore b/gmodule/.gitignore new file mode 100644 index 0000000..bd1e253 --- /dev/null +++ b/gmodule/.gitignore @@ -0,0 +1,2 @@ +gmoduleconf.h +makefile.msc 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..e0a8e1a --- /dev/null +++ b/gmodule/Makefile.am @@ -0,0 +1,110 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + $(glib_INCLUDES) \ + -DG_LOG_DOMAIN=\"GModule\" \ + @GLIB_DEBUG_FLAGS@ \ + -DG_DISABLE_DEPRECATED + +EXTRA_DIST += \ + makefile.msc.in \ + gmoduleconf.h.in \ + 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 +gmodule_win32_res = gmodule-win32-res.o +gmodule_win32_res_ldflag = -Wl,$(gmodule_win32_res) +endif + +libgmodule_2_0_la_CFLAGS = $(AM_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +libgmodule_2_0_la_SOURCES = gmodule.c +libgmodule_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \ + $(gmodule_win32_res_ldflag) \ + $(G_MODULE_LDFLAGS) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +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 + $(AM_V_GEN) $(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:$(builddir)/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 + +uninstall-local: uninstall-ms-lib + +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/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..439fb5d --- /dev/null +++ b/gmodule/gmodule-win32.c @@ -0,0 +1,202 @@ +/* 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) +{ + HANDLE snapshot; + MODULEENTRY32 me32; + + gpointer p; + + if ((snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0)) == (HANDLE) -1) + return NULL; + + me32.dwSize = sizeof (me32); + p = NULL; + if (Module32First (snapshot, &me32)) + { + do { + if ((p = GetProcAddress (me32.hModule, symbol_name)) != NULL) + break; + } while (Module32Next (snapshot, &me32)); + } + + CloseHandle (snapshot); + + 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) + 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..f373833 --- /dev/null +++ b/gmodule/gmodule.c @@ -0,0 +1,935 @@ +/* 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" + +/** + * SECTION:modules + * @title: Dynamic Loading of Modules + * @short_description: 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; + * } + * + * + */ + +/** + * GModule: + * + * The #GModule struct is an opaque data structure to represent a + * Dynamically-Loaded + * Module. It should only be accessed via the following functions. + */ + +/** + * GModuleCheckInit: + * @module: the #GModule corresponding to the module which has just been loaded + * + * 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. + * + * Returns: %NULL on success, or a string describing the initialization error + */ + +/** + * GModuleUnload: + * @module: the #GModule about to be unloaded + * + * 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. + */ + +/** + * G_MODULE_SUFFIX: + * + * 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: + * + * 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: + * + * Used to declare functions imported from modules. + */ + +/* We maintain a list of modules, so we can reference count them. + * That's needed because some platforms don't support references 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 GPrivate module_error_private = G_PRIVATE_INIT (g_free); +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_private_replace (&module_error_private, error); + 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 --- */ + +/** + * g_module_supported: + * + * Checks if modules are supported on the current platform. + * + * Returns: %TRUE if modules are supported + */ +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 GRecMutex g_module_global_lock; + +GModule* +g_module_open (const gchar *file_name, + GModuleFlags flags) +{ + GModule *module; + gpointer handle = NULL; + gchar *name = NULL; + + SUPPORT_OR_RETURN (NULL); + + g_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_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_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_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, ") ", + "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_rec_mutex_unlock (&g_module_global_lock); + return module; +} + +#if defined (G_OS_WIN32) && !defined(_WIN64) + +#undef g_module_open + +/** + * GModuleFlags: + * @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. + * + * Flags passed to g_module_open(). + * Note that these flags are not supported on all platforms. + */ + +/** + * g_module_open: + * @file_name: (allow-none): 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 + * + * 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. + * + * Returns: a #GModule on success, or %NULL on failure + */ +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 + +/** + * g_module_close: + * @module: a #GModule to close + * + * Closes a module. + * + * Returns: %TRUE on success + */ +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_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_rec_mutex_unlock (&g_module_global_lock); + return g_module_error() == NULL; +} + +/** + * g_module_make_resident: + * @module: a #GModule to make permanently resident + * + * Ensures that a module will never be unloaded. + * Any future g_module_close() calls on the module will be ignored. + */ +void +g_module_make_resident (GModule *module) +{ + g_return_if_fail (module != NULL); + + module->is_resident = TRUE; +} + +/** + * g_module_error: + * + * Gets a string describing the last module error. + * + * Returns: a string describing the last module error + */ +const gchar * +g_module_error (void) +{ + return g_private_get (&module_error_private); +} + +/** + * g_module_symbol: + * @module: a #GModule + * @symbol_name: the name of the symbol to find + * @symbol: returns the pointer to the symbol value + * + * Gets a symbol pointer from a module, such as one exported + * by #G_MODULE_EXPORT. Note that a valid symbol can be %NULL. + * + * Returns: %TRUE on success + */ +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_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_rec_mutex_unlock (&g_module_global_lock); + return !module_error; +} + +/** + * g_module_name: + * @module: a #GModule + * + * Returns the filename that the module was opened with. + * + * If @module refers to the application itself, "main" is returned. + * + * Returns: (transfer none): the filename of the module + */ +const 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 + +const 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 + +/** + * g_module_build_path: + * @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 + * + * 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. + * + * Returns: the complete path of the module, including the standard library + * prefix and suffix. This should be freed when no longer needed + */ +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..caa0680 --- /dev/null +++ b/gmodule/gmodule.h @@ -0,0 +1,117 @@ +/* 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); + +/* return TRUE if dynamic module loading is supported */ +GLIB_AVAILABLE_IN_ALL +gboolean g_module_supported (void) G_GNUC_CONST; + +/* open a module `file_name' and return handle, which is NULL on error */ +GLIB_AVAILABLE_IN_ALL +GModule* g_module_open (const gchar *file_name, + GModuleFlags flags); + +/* close a previously opened module, returns TRUE on success */ +GLIB_AVAILABLE_IN_ALL +gboolean g_module_close (GModule *module); + +/* make a module resident so g_module_close on it will be ignored */ +GLIB_AVAILABLE_IN_ALL +void g_module_make_resident (GModule *module); + +/* query the last module error as a string */ +GLIB_AVAILABLE_IN_ALL +const gchar * g_module_error (void); + +/* retrieve a symbol pointer from `module', returns TRUE on success */ +GLIB_AVAILABLE_IN_ALL +gboolean g_module_symbol (GModule *module, + const gchar *symbol_name, + gpointer *symbol); + +/* retrieve the file name from an existing module */ +GLIB_AVAILABLE_IN_ALL +const 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 according 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. + */ +GLIB_AVAILABLE_IN_ALL +gchar* g_module_build_path (const gchar *directory, + const gchar *module_name); + + +#ifndef __GTK_DOC_IGNORE__ +#ifdef G_OS_WIN32 +#define g_module_open g_module_open_utf8 +#define g_module_name g_module_name_utf8 + +GLIB_AVAILABLE_IN_ALL +GModule * g_module_open_utf8 (const gchar *file_name, + GModuleFlags flags); +GLIB_AVAILABLE_IN_ALL +const gchar *g_module_name_utf8 (GModule *module); +#endif +#endif + +G_END_DECLS + +#endif /* __GMODULE_H__ */ diff --git a/gmodule/gmodule.rc.in b/gmodule/gmodule.rc.in new file mode 100644 index 0000000..0def0a9 --- /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-2011 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/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.pc.in b/gobject-2.0.pc.in new file mode 100644 index 0000000..04f40c0 --- /dev/null +++ b/gobject-2.0.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: GObject +Description: GLib Type, Object, Parameter and Signal Library +Requires: glib-2.0 +Version: @VERSION@ +Libs: -L${libdir} -lgobject-2.0 +Libs.private: @LIBFFI_LIBS@ +Cflags: diff --git a/gobject/.gitignore b/gobject/.gitignore new file mode 100644 index 0000000..6ecf1fb --- /dev/null +++ b/gobject/.gitignore @@ -0,0 +1,9 @@ +glib-genmarshal +glib-mkenums +gmarshal.strings +gobject-query +testgobject +libgobject-gdb.py +makefile.msc +gobject_probes.h +gobject-public-headers.txt 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..ae27b51 --- /dev/null +++ b/gobject/Makefile.am @@ -0,0 +1,285 @@ +# 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 = . +if BUILD_MODULAR_TESTS +SUBDIRS += tests +endif + +BUILT_SOURCES= +CLEANFILES= + +AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"GLib-GObject\" \ + $(glib_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) \ + -DGOBJECT_COMPILATION + +libglib = $(top_builddir)/glib/libglib-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 +gobject_win32_res = gobject-win32-res.o +gobject_win32_res_ldflag = -Wl,$(gobject_win32_res) +endif + +libgobjectincludedir = $(includedir)/glib-2.0/gobject +libgobject_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \ + $(gobject_win32_res_ldflag) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +libgobject_2_0_la_CFLAGS = $(AM_CFLAGS) $(LIBFFI_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS) + +libgobject_2_0_la_LIBADD = $(libglib) $(LIBFFI_LIBS) + +libgobject_2_0_la_DEPENDENCIES = $(gobject_win32_res) + +# +# setup source file variables +# +# GObject library header files for public installation +gobject_public_h_sources = \ + glib-types.h \ + gbinding.h \ + gboxed.h \ + gclosure.h \ + genums.h \ + gmarshal.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 + +# 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 = \ + gobject_probes.d \ + gatomicarray.c \ + gbinding.c \ + gboxed.c \ + gclosure.c \ + genums.c \ + gmarshal.c \ + gobject.c \ + gobject_trace.h \ + gparam.c \ + gparamspecs.c \ + gsignal.c \ + gsourceclosure.c \ + gtype.c \ + gtypemodule.c \ + gtypeplugin.c \ + gvalue.c \ + gvaluearray.c \ + gvaluetransform.c \ + gvaluetypes.c + +if ENABLE_DTRACE +gobject_probes.h: gobject_probes.d Makefile + $(AM_V_GEN) $(DTRACE) -C -h -s $< -o $@.tmp + @$(SED) -e "s,define STAP_HAS_SEMAPHORES 1,undef STAP_HAS_SEMAPHORES," < $@.tmp > $@ && rm -f $@.tmp +gobject_probes.o: gobject_probes.d Makefile + $(AM_V_GEN) $(DTRACE) -G -s $< -o $@ +BUILT_SOURCES += gobject_probes.h gobject_probes.o +CLEANFILES += gobject_probes.h +libgobject_2_0_la_LIBADD += gobject_probes.o +endif + +if ENABLE_SYSTEMTAP +tapset_in_files = gobject.stp.in +tapsetdir = @ABS_TAPSET_DIR@ +tapset_DATA = $(tapset_in_files:.stp.in=.stp) +EXTRA_DIST += $(tapset_in_files) +endif + +# 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 + + +# +# 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) \ + marshal-genstrings.pl + +# This is read by gobject-introspection/misc/ and gtk-doc +gobject-public-headers.txt: Makefile + $(AM_V_GEN) echo $(gobject_public_h_sources) > $@.tmp && mv $@.tmp $@ + +CLEANFILES += gobject-public-headers.txt + +all-local: gobject-public-headers.txt + +# +# 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. + + +gmarshal.strings: @REBUILD@ $(srcdir)/gmarshal.list + $(AM_V_GEN) 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 + +# 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 +# source files +gobject_query_SOURCES = gobject-query.c +glib_genmarshal_SOURCES = glib-genmarshal.c +# link programs against libgobject +progs_LDADD = ./libgobject-2.0.la $(libglib) +glib_genmarshal_LDADD = $(libglib) +gobject_query_LDADD = $(progs_LDADD) + +# +# auxillary files +# +EXTRA_DIST += \ + makefile.msc.in \ + gobject.rc.in \ + libgobject-gdb.py.in \ + glib-mkenums.in + +CLEANFILES += libgobject-gdb.py + +BUILT_EXTRA_DIST = \ + makefile.msc \ + gobject.rc + +gobject-win32-res.o: gobject.rc + $(AM_V_GEN) $(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:$(builddir)/gobject.def -out:$@ + +dist-hook: $(BUILT_EXTRA_DIST) ../build/win32/vs9/gobject.vcproj ../build/win32/vs10/gobject.vcxproj ../build/win32/vs10/gobject.vcxproj.filters + 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 >$@ + rm libgobject.sourcefiles + +../build/win32/vs10/gobject.vcxproj: $(top_srcdir)/build/win32/vs10/gobject.vcxprojin + for F in $(libgobject_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' ' \ + ;; \ + esac; \ + done >libgobject.vs10.sourcefiles + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/gobject.vcxprojin >$@ + rm libgobject.vs10.sourcefiles + +../build/win32/vs10/gobject.vcxproj.filters: $(top_srcdir)/build/win32/vs10/gobject.vcxproj.filtersin + for F in $(libgobject_2_0_la_SOURCES); do \ + case $$F in \ + *.c) echo ' Source Files' \ + ;; \ + esac; \ + done >libgobject.vs10.sourcefiles.filters + $(CPP) -P - <$(top_srcdir)/build/win32/vs10/gobject.vcxproj.filtersin >$@ + rm libgobject.vs10.sourcefiles.filters + +install-data-local: install-ms-lib + +uninstall-local: uninstall-ms-lib uninstall-gdb + +distclean-local: + if test $(srcdir) = .; then :; else \ + rm -f $(BUILT_EXTRA_DIST); \ + fi + +# install gdb scripts +gdbdir = $(datadir)/glib-2.0/gdb +dist_gdb_SCRIPTS = gobject.py + +libgobject-gdb.py: libgobject-gdb.py.in + $(AM_V_GEN) $(SED) -e "s|\@datadir\@|$(datadir)|" $(srcdir)/libgobject-gdb.py.in > $(builddir)/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) $(builddir)/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/gatomicarray.c b/gobject/gatomicarray.c new file mode 100644 index 0000000..77966f2 --- /dev/null +++ b/gobject/gatomicarray.c @@ -0,0 +1,168 @@ +/* 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 + +#include "gatomicarray.h" + +/* 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. + * + * We don't support shrinking arrays, as if + * we then re-grow we may reuse an old pointer + * value and confuse the transaction check. + */ +gpointer +_g_atomic_array_copy (GAtomicArray *array, + gsize header_size, + gsize additional_element_size) +{ + guint8 *new, *old; + gsize old_size, new_size; + + 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..b2ad970 --- /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. + */ +#ifndef __G_ATOMIC_ARRAY_H__ +#define __G_ATOMIC_ARRAY_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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/gbinding.c b/gobject/gbinding.c new file mode 100644 index 0000000..3dbe616 --- /dev/null +++ b/gobject/gbinding.c @@ -0,0 +1,1190 @@ +/* gbinding.c: Binding for object properties + * + * Copyright (C) 2010 Intel Corp. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Emmanuele Bassi + */ + +/** + * SECTION:gbinding + * @Title: GBinding + * @Short_Description: Bind two object properties + * + * #GBinding is the representation of a binding between a property on a + * #GObject instance (or source) and another property on another #GObject + * instance (or target). Whenever the source property changes, the same + * value is applied to the target property; for instance, the following + * binding: + * + * |[ + * g_object_bind_property (object1, "property-a", + * object2, "property-b", + * G_BINDING_DEFAULT); + * ]| + * + * will cause object2:property-b to be updated every + * time g_object_set() or the specific accessor changes the value of + * object1:property-a. + * + * It is possible to create a bidirectional binding between two properties + * of two #GObject instances, so that if either property changes, the + * other is updated as well, for instance: + * + * |[ + * g_object_bind_property (object1, "property-a", + * object2, "property-b", + * G_BINDING_BIDIRECTIONAL); + * ]| + * + * will keep the two properties in sync. + * + * It is also possible to set a custom transformation function (in both + * directions, in case of a bidirectional binding) to apply a custom + * transformation from the source value to the target value before + * applying it; for instance, the following binding: + * + * |[ + * g_object_bind_property_full (adjustment1, "value", + * adjustment2, "value", + * G_BINDING_BIDIRECTIONAL, + * celsius_to_fahrenheit, + * fahrenheit_to_celsius, + * NULL, NULL); + * ]| + * + * will keep the value property of the two adjustments + * in sync; the celsius_to_fahrenheit function will be + * called whenever the adjustment1:value property changes + * and will transform the current value of the property before applying it + * to the adjustment2:value property; vice versa, the + * fahrenheit_to_celsius function will be called whenever + * the adjustment2:value property changes, and will + * transform the current value of the property before applying it to the + * adjustment1:value. + * + * Note that #GBinding does not resolve cycles by itself; a cycle like + * + * |[ + * object1:propertyA -> object2:propertyB + * object2:propertyB -> object3:propertyC + * object3:propertyC -> object1:propertyA + * ]| + * + * might lead to an infinite loop. The loop, in this particular case, + * can be avoided if the objects emit the #GObject::notify signal only + * if the value has effectively been changed. A binding is implemented + * using the #GObject::notify signal, so it is susceptible to all the + * various ways of blocking a signal emission, like g_signal_stop_emission() + * or g_signal_handler_block(). + * + * A binding will be severed, and the resources it allocates freed, whenever + * either one of the #GObject instances it refers to are finalized, or when + * the #GBinding instance loses its last reference. + * + * #GBinding is available since GObject 2.26 + */ + +#include "config.h" + +#include + +#include "gbinding.h" +#include "genums.h" +#include "gmarshal.h" +#include "gobject.h" +#include "gsignal.h" +#include "gparamspecs.h" +#include "gvaluetypes.h" + +#include "glibintl.h" + + +GType +g_binding_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_BINDING_DEFAULT, "G_BINDING_DEFAULT", "default" }, + { G_BINDING_BIDIRECTIONAL, "G_BINDING_BIDIRECTIONAL", "bidirectional" }, + { G_BINDING_SYNC_CREATE, "G_BINDING_SYNC_CREATE", "sync-create" }, + { G_BINDING_INVERT_BOOLEAN, "G_BINDING_INVERT_BOOLEAN", "invert-boolean" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_flags_register_static (g_intern_static_string ("GBindingFlags"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +#define G_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), G_TYPE_BINDING, GBindingClass)) +#define G_IS_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), G_TYPE_BINDING)) +#define G_BINDING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), G_TYPE_BINDING, GBindingClass)) + +typedef struct _GBindingClass GBindingClass; + +struct _GBinding +{ + GObject parent_instance; + + /* no reference is held on the objects, to avoid cycles */ + GObject *source; + GObject *target; + + /* the property names are interned, so they should not be freed */ + const gchar *source_property; + const gchar *target_property; + + GParamSpec *source_pspec; + GParamSpec *target_pspec; + + GBindingTransformFunc transform_s2t; + GBindingTransformFunc transform_t2s; + + GBindingFlags flags; + + guint source_notify; + guint target_notify; + + gpointer transform_data; + GDestroyNotify notify; + + /* a guard, to avoid loops */ + guint is_frozen : 1; +}; + +struct _GBindingClass +{ + GObjectClass parent_class; +}; + +enum +{ + PROP_0, + + PROP_SOURCE, + PROP_TARGET, + PROP_SOURCE_PROPERTY, + PROP_TARGET_PROPERTY, + PROP_FLAGS +}; + +static GQuark quark_gbinding = 0; + +G_DEFINE_TYPE (GBinding, g_binding, G_TYPE_OBJECT); + +static inline void +add_binding_qdata (GObject *gobject, + GBinding *binding) +{ + GHashTable *bindings; + + bindings = g_object_get_qdata (gobject, quark_gbinding); + if (bindings == NULL) + { + bindings = g_hash_table_new (NULL, NULL); + + g_object_set_qdata_full (gobject, quark_gbinding, + bindings, + (GDestroyNotify) g_hash_table_destroy); + } + + g_hash_table_insert (bindings, binding, GUINT_TO_POINTER (1)); +} + +static inline void +remove_binding_qdata (GObject *gobject, + GBinding *binding) +{ + GHashTable *bindings; + + bindings = g_object_get_qdata (gobject, quark_gbinding); + g_hash_table_remove (bindings, binding); +} + +/* the basic assumption is that if either the source or the target + * goes away then the binding does not exist any more and it should + * be reaped as well + */ +static void +weak_unbind (gpointer user_data, + GObject *where_the_object_was) +{ + GBinding *binding = user_data; + + /* if what went away was the source, unset it so that GBinding::finalize + * does not try to access it; otherwise, disconnect everything and remove + * the GBinding instance from the object's qdata + */ + if (binding->source == where_the_object_was) + binding->source = NULL; + else + { + if (binding->source_notify != 0) + g_signal_handler_disconnect (binding->source, binding->source_notify); + + g_object_weak_unref (binding->source, weak_unbind, user_data); + remove_binding_qdata (binding->source, binding); + binding->source = NULL; + } + + /* as above, but with the target */ + if (binding->target == where_the_object_was) + binding->target = NULL; + else + { + if (binding->target_notify != 0) + g_signal_handler_disconnect (binding->target, binding->target_notify); + + g_object_weak_unref (binding->target, weak_unbind, user_data); + remove_binding_qdata (binding->target, binding); + binding->target = NULL; + } + + /* this will take care of the binding itself */ + g_object_unref (binding); +} + +static inline gboolean +default_transform (const GValue *value_a, + GValue *value_b) +{ + /* if it's not the same type, try to convert it using the GValue + * transformation API; otherwise just copy it + */ + if (!g_type_is_a (G_VALUE_TYPE (value_a), G_VALUE_TYPE (value_b))) + { + /* are these two types compatible (can be directly copied)? */ + if (g_value_type_compatible (G_VALUE_TYPE (value_a), + G_VALUE_TYPE (value_b))) + { + g_value_copy (value_a, value_b); + goto done; + } + + if (g_value_type_transformable (G_VALUE_TYPE (value_a), + G_VALUE_TYPE (value_b))) + { + if (g_value_transform (value_a, value_b)) + goto done; + + g_warning ("%s: Unable to convert a value of type %s to a " + "value of type %s", + G_STRLOC, + g_type_name (G_VALUE_TYPE (value_a)), + g_type_name (G_VALUE_TYPE (value_b))); + + return FALSE; + } + } + else + g_value_copy (value_a, value_b); + +done: + return TRUE; +} + +static inline gboolean +default_invert_boolean_transform (const GValue *value_a, + GValue *value_b) +{ + gboolean value; + + g_assert (G_VALUE_HOLDS_BOOLEAN (value_a)); + g_assert (G_VALUE_HOLDS_BOOLEAN (value_b)); + + value = g_value_get_boolean (value_a); + value = !value; + + g_value_set_boolean (value_b, value); + + return TRUE; +} + +static gboolean +default_transform_to (GBinding *binding, + const GValue *value_a, + GValue *value_b, + gpointer user_data G_GNUC_UNUSED) +{ + if (binding->flags & G_BINDING_INVERT_BOOLEAN) + return default_invert_boolean_transform (value_a, value_b); + + return default_transform (value_a, value_b); +} + +static gboolean +default_transform_from (GBinding *binding, + const GValue *value_a, + GValue *value_b, + gpointer user_data G_GNUC_UNUSED) +{ + if (binding->flags & G_BINDING_INVERT_BOOLEAN) + return default_invert_boolean_transform (value_a, value_b); + + return default_transform (value_a, value_b); +} + +static void +on_source_notify (GObject *gobject, + GParamSpec *pspec, + GBinding *binding) +{ + const gchar *p_name; + GValue source_value = G_VALUE_INIT; + GValue target_value = G_VALUE_INIT; + gboolean res; + + if (binding->is_frozen) + return; + + p_name = g_intern_string (pspec->name); + + if (p_name != binding->source_property) + return; + + g_value_init (&source_value, G_PARAM_SPEC_VALUE_TYPE (binding->source_pspec)); + g_value_init (&target_value, G_PARAM_SPEC_VALUE_TYPE (binding->target_pspec)); + + g_object_get_property (binding->source, binding->source_pspec->name, &source_value); + + res = binding->transform_s2t (binding, + &source_value, + &target_value, + binding->transform_data); + if (res) + { + binding->is_frozen = TRUE; + + g_param_value_validate (binding->target_pspec, &target_value); + g_object_set_property (binding->target, binding->target_pspec->name, &target_value); + + binding->is_frozen = FALSE; + } + + g_value_unset (&source_value); + g_value_unset (&target_value); +} + +static void +on_target_notify (GObject *gobject, + GParamSpec *pspec, + GBinding *binding) +{ + const gchar *p_name; + GValue source_value = G_VALUE_INIT; + GValue target_value = G_VALUE_INIT; + gboolean res; + + if (binding->is_frozen) + return; + + p_name = g_intern_string (pspec->name); + + if (p_name != binding->target_property) + return; + + g_value_init (&source_value, G_PARAM_SPEC_VALUE_TYPE (binding->target_pspec)); + g_value_init (&target_value, G_PARAM_SPEC_VALUE_TYPE (binding->source_pspec)); + + g_object_get_property (binding->target, binding->target_pspec->name, &source_value); + + res = binding->transform_t2s (binding, + &source_value, + &target_value, + binding->transform_data); + if (res) + { + binding->is_frozen = TRUE; + + g_param_value_validate (binding->source_pspec, &target_value); + g_object_set_property (binding->source, binding->source_pspec->name, &target_value); + + binding->is_frozen = FALSE; + } + + g_value_unset (&source_value); + g_value_unset (&target_value); +} + +static void +g_binding_finalize (GObject *gobject) +{ + GBinding *binding = G_BINDING (gobject); + + /* dispose of the transformation data */ + if (binding->notify != NULL) + { + binding->notify (binding->transform_data); + + binding->transform_data = NULL; + binding->notify = NULL; + } + + /* we need this in case the source and target instance are still + * valid, and it was the GBinding that was unreferenced + */ + if (binding->source != NULL) + { + if (binding->source_notify != 0) + g_signal_handler_disconnect (binding->source, binding->source_notify); + + g_object_weak_unref (binding->source, weak_unbind, binding); + remove_binding_qdata (binding->source, binding); + } + + if (binding->target != NULL) + { + if (binding->target_notify != 0) + g_signal_handler_disconnect (binding->target, binding->target_notify); + + g_object_weak_unref (binding->target, weak_unbind, binding); + remove_binding_qdata (binding->target, binding); + } + + G_OBJECT_CLASS (g_binding_parent_class)->finalize (gobject); +} + +static void +g_binding_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GBinding *binding = G_BINDING (gobject); + + switch (prop_id) + { + case PROP_SOURCE: + binding->source = g_value_get_object (value); + break; + + case PROP_SOURCE_PROPERTY: + binding->source_property = g_intern_string (g_value_get_string (value)); + break; + + case PROP_TARGET: + binding->target = g_value_get_object (value); + break; + + case PROP_TARGET_PROPERTY: + binding->target_property = g_intern_string (g_value_get_string (value)); + break; + + case PROP_FLAGS: + binding->flags = g_value_get_flags (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +g_binding_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GBinding *binding = G_BINDING (gobject); + + switch (prop_id) + { + case PROP_SOURCE: + g_value_set_object (value, binding->source); + break; + + case PROP_SOURCE_PROPERTY: + g_value_set_string (value, binding->source_property); + break; + + case PROP_TARGET: + g_value_set_object (value, binding->target); + break; + + case PROP_TARGET_PROPERTY: + g_value_set_string (value, binding->target_property); + break; + + case PROP_FLAGS: + g_value_set_flags (value, binding->flags); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +g_binding_constructed (GObject *gobject) +{ + GBinding *binding = G_BINDING (gobject); + + /* assert that we were constructed correctly */ + g_assert (binding->source != NULL); + g_assert (binding->target != NULL); + g_assert (binding->source_property != NULL); + g_assert (binding->target_property != NULL); + + /* we assume a check was performed prior to construction - since + * g_object_bind_property_full() does it; we cannot fail construction + * anyway, so it would be hard for use to properly warn here + */ + binding->source_pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (binding->source), binding->source_property); + binding->target_pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (binding->target), binding->target_property); + g_assert (binding->source_pspec != NULL); + g_assert (binding->target_pspec != NULL); + + /* set the default transformation functions here */ + binding->transform_s2t = default_transform_to; + binding->transform_t2s = default_transform_from; + + binding->transform_data = NULL; + binding->notify = NULL; + + binding->source_notify = g_signal_connect (binding->source, "notify", + G_CALLBACK (on_source_notify), + binding); + + g_object_weak_ref (binding->source, weak_unbind, binding); + add_binding_qdata (binding->source, binding); + + if (binding->flags & G_BINDING_BIDIRECTIONAL) + binding->target_notify = g_signal_connect (binding->target, "notify", + G_CALLBACK (on_target_notify), + binding); + + if (binding->target != binding->source) + { + g_object_weak_ref (binding->target, weak_unbind, binding); + add_binding_qdata (binding->target, binding); + } +} + +static void +g_binding_class_init (GBindingClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + quark_gbinding = g_quark_from_static_string ("g-binding"); + + gobject_class->constructed = g_binding_constructed; + gobject_class->set_property = g_binding_set_property; + gobject_class->get_property = g_binding_get_property; + gobject_class->finalize = g_binding_finalize; + + /** + * GBinding:source: + * + * The #GObject that should be used as the source of the binding + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_SOURCE, + g_param_spec_object ("source", + P_("Source"), + P_("The source of the binding"), + G_TYPE_OBJECT, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GBinding:target: + * + * The #GObject that should be used as the target of the binding + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_TARGET, + g_param_spec_object ("target", + P_("Target"), + P_("The target of the binding"), + G_TYPE_OBJECT, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GBinding:source-property: + * + * The name of the property of #GBinding:source that should be used + * as the source of the binding + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_SOURCE_PROPERTY, + g_param_spec_string ("source-property", + P_("Source Property"), + P_("The property on the source to bind"), + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GBinding:target-property: + * + * The name of the property of #GBinding:target that should be used + * as the target of the binding + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_TARGET_PROPERTY, + g_param_spec_string ("target-property", + P_("Target Property"), + P_("The property on the target to bind"), + NULL, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + /** + * GBinding:flags: + * + * Flags to be used to control the #GBinding + * + * Since: 2.26 + */ + g_object_class_install_property (gobject_class, PROP_FLAGS, + g_param_spec_flags ("flags", + P_("Flags"), + P_("The binding flags"), + G_TYPE_BINDING_FLAGS, + G_BINDING_DEFAULT, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_binding_init (GBinding *binding) +{ +} + +/** + * g_binding_get_flags: + * @binding: a #GBinding + * + * Retrieves the flags passed when constructing the #GBinding + * + * Return value: the #GBindingFlags used by the #GBinding + * + * Since: 2.26 + */ +GBindingFlags +g_binding_get_flags (GBinding *binding) +{ + g_return_val_if_fail (G_IS_BINDING (binding), G_BINDING_DEFAULT); + + return binding->flags; +} + +/** + * g_binding_get_source: + * @binding: a #GBinding + * + * Retrieves the #GObject instance used as the source of the binding + * + * Return value: (transfer none): the source #GObject + * + * Since: 2.26 + */ +GObject * +g_binding_get_source (GBinding *binding) +{ + g_return_val_if_fail (G_IS_BINDING (binding), NULL); + + return binding->source; +} + +/** + * g_binding_get_target: + * @binding: a #GBinding + * + * Retrieves the #GObject instance used as the target of the binding + * + * Return value: (transfer none): the target #GObject + * + * Since: 2.26 + */ +GObject * +g_binding_get_target (GBinding *binding) +{ + g_return_val_if_fail (G_IS_BINDING (binding), NULL); + + return binding->target; +} + +/** + * g_binding_get_source_property: + * @binding: a #GBinding + * + * Retrieves the name of the property of #GBinding:source used as the source + * of the binding + * + * Return value: the name of the source property + * + * Since: 2.26 + */ +const gchar * +g_binding_get_source_property (GBinding *binding) +{ + g_return_val_if_fail (G_IS_BINDING (binding), NULL); + + return binding->source_property; +} + +/** + * g_binding_get_target_property: + * @binding: a #GBinding + * + * Retrieves the name of the property of #GBinding:target used as the target + * of the binding + * + * Return value: the name of the target property + * + * Since: 2.26 + */ +const gchar * +g_binding_get_target_property (GBinding *binding) +{ + g_return_val_if_fail (G_IS_BINDING (binding), NULL); + + return binding->target_property; +} + +/** + * g_object_bind_property_full: + * @source: (type GObject.Object): the source #GObject + * @source_property: the property on @source to bind + * @target: (type GObject.Object): the target #GObject + * @target_property: the property on @target to bind + * @flags: flags to pass to #GBinding + * @transform_to: (scope notified) (allow-none): the transformation function + * from the @source to the @target, or %NULL to use the default + * @transform_from: (scope notified) (allow-none): the transformation function + * from the @target to the @source, or %NULL to use the default + * @user_data: custom data to be passed to the transformation functions, + * or %NULL + * @notify: function to be called when disposing the binding, to free the + * resources used by the transformation functions + * + * Complete version of g_object_bind_property(). + * + * Creates a binding between @source_property on @source and @target_property + * on @target, allowing you to set the transformation functions to be used by + * the binding. + * + * If @flags contains %G_BINDING_BIDIRECTIONAL then the binding will be mutual: + * if @target_property on @target changes then the @source_property on @source + * will be updated as well. The @transform_from function is only used in case + * of bidirectional bindings, otherwise it will be ignored + * + * The binding will automatically be removed when either the @source or the + * @target instances are finalized. To remove the binding without affecting the + * @source and the @target you can just call g_object_unref() on the returned + * #GBinding instance. + * + * A #GObject can have multiple bindings. + * + * The same @user_data parameter will be used for both @transform_to + * and @transform_from transformation functions; the @notify function will + * be called once, when the binding is removed. If you need different data + * for each transformation function, please use + * g_object_bind_property_with_closures() instead. + * + * Return value: (transfer none): the #GBinding instance representing the + * binding between the two #GObject instances. The binding is released + * whenever the #GBinding reference count reaches zero. + * + * Since: 2.26 + */ +GBinding * +g_object_bind_property_full (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags, + GBindingTransformFunc transform_to, + GBindingTransformFunc transform_from, + gpointer user_data, + GDestroyNotify notify) +{ + GParamSpec *pspec; + GBinding *binding; + + g_return_val_if_fail (G_IS_OBJECT (source), NULL); + g_return_val_if_fail (source_property != NULL, NULL); + g_return_val_if_fail (G_IS_OBJECT (target), NULL); + g_return_val_if_fail (target_property != NULL, NULL); + + if (source == target && g_strcmp0 (source_property, target_property) == 0) + { + g_warning ("Unable to bind the same property on the same instance"); + return NULL; + } + + /* remove the G_BINDING_INVERT_BOOLEAN flag in case we have + * custom transformation functions + */ + if ((flags & G_BINDING_INVERT_BOOLEAN) && + (transform_to != NULL || transform_from != NULL)) + { + flags &= ~G_BINDING_INVERT_BOOLEAN; + } + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (source), source_property); + if (pspec == NULL) + { + g_warning ("%s: The source object of type %s has no property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (source), + source_property); + return NULL; + } + + if (!(pspec->flags & G_PARAM_READABLE)) + { + g_warning ("%s: The source object of type %s has no readable property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (source), + source_property); + return NULL; + } + + if ((flags & G_BINDING_BIDIRECTIONAL) && + ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) || !(pspec->flags & G_PARAM_WRITABLE))) + { + g_warning ("%s: The source object of type %s has no writable property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (source), + source_property); + return NULL; + } + + if ((flags & G_BINDING_INVERT_BOOLEAN) && + !(G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN)) + { + g_warning ("%s: The G_BINDING_INVERT_BOOLEAN flag can only be used " + "when binding boolean properties; the source property '%s' " + "is of type '%s'", + G_STRLOC, + source_property, + g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec))); + return NULL; + } + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (target), target_property); + if (pspec == NULL) + { + g_warning ("%s: The target object of type %s has no property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (target), + target_property); + return NULL; + } + + if ((pspec->flags & G_PARAM_CONSTRUCT_ONLY) || !(pspec->flags & G_PARAM_WRITABLE)) + { + g_warning ("%s: The target object of type %s has no writable property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (target), + target_property); + return NULL; + } + + if ((flags & G_BINDING_BIDIRECTIONAL) && + !(pspec->flags & G_PARAM_READABLE)) + { + g_warning ("%s: The target object of type %s has no readable property called '%s'", + G_STRLOC, + G_OBJECT_TYPE_NAME (target), + target_property); + return NULL; + } + + if ((flags & G_BINDING_INVERT_BOOLEAN) && + !(G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN)) + { + g_warning ("%s: The G_BINDING_INVERT_BOOLEAN flag can only be used " + "when binding boolean properties; the target property '%s' " + "is of type '%s'", + G_STRLOC, + target_property, + g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec))); + return NULL; + } + + binding = g_object_new (G_TYPE_BINDING, + "source", source, + "source-property", source_property, + "target", target, + "target-property", target_property, + "flags", flags, + NULL); + + if (transform_to != NULL) + binding->transform_s2t = transform_to; + + if (transform_from != NULL) + binding->transform_t2s = transform_from; + + binding->transform_data = user_data; + binding->notify = notify; + + /* synchronize the target with the source by faking an emission of + * the ::notify signal for the source property; this will also take + * care of the bidirectional binding case because the eventual change + * will emit a notification on the target + */ + if (flags & G_BINDING_SYNC_CREATE) + on_source_notify (binding->source, binding->source_pspec, binding); + + return binding; +} + +/** + * g_object_bind_property: + * @source: (type GObject.Object): the source #GObject + * @source_property: the property on @source to bind + * @target: (type GObject.Object): the target #GObject + * @target_property: the property on @target to bind + * @flags: flags to pass to #GBinding + * + * Creates a binding between @source_property on @source and @target_property + * on @target. Whenever the @source_property is changed the @target_property is + * updated using the same value. For instance: + * + * |[ + * g_object_bind_property (action, "active", widget, "sensitive", 0); + * ]| + * + * Will result in the "sensitive" property of the widget #GObject instance to be + * updated with the same value of the "active" property of the action #GObject + * instance. + * + * If @flags contains %G_BINDING_BIDIRECTIONAL then the binding will be mutual: + * if @target_property on @target changes then the @source_property on @source + * will be updated as well. + * + * The binding will automatically be removed when either the @source or the + * @target instances are finalized. To remove the binding without affecting the + * @source and the @target you can just call g_object_unref() on the returned + * #GBinding instance. + * + * A #GObject can have multiple bindings. + * + * Return value: (transfer none): the #GBinding instance representing the + * binding between the two #GObject instances. The binding is released + * whenever the #GBinding reference count reaches zero. + * + * Since: 2.26 + */ +GBinding * +g_object_bind_property (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags) +{ + /* type checking is done in g_object_bind_property_full() */ + + return g_object_bind_property_full (source, source_property, + target, target_property, + flags, + NULL, + NULL, + NULL, NULL); +} + +typedef struct _TransformData +{ + GClosure *transform_to_closure; + GClosure *transform_from_closure; +} TransformData; + +static gboolean +bind_with_closures_transform_to (GBinding *binding, + const GValue *source, + GValue *target, + gpointer data) +{ + TransformData *t_data = data; + GValue params[3] = { G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT }; + GValue retval = G_VALUE_INIT; + gboolean res; + + g_value_init (¶ms[0], G_TYPE_BINDING); + g_value_set_object (¶ms[0], binding); + + g_value_init (¶ms[1], G_TYPE_VALUE); + g_value_set_boxed (¶ms[1], source); + + g_value_init (¶ms[2], G_TYPE_VALUE); + g_value_set_boxed (¶ms[2], target); + + g_value_init (&retval, G_TYPE_BOOLEAN); + g_value_set_boolean (&retval, FALSE); + + g_closure_invoke (t_data->transform_to_closure, &retval, 3, params, NULL); + + res = g_value_get_boolean (&retval); + if (res) + { + const GValue *out_value = g_value_get_boxed (¶ms[2]); + + g_assert (out_value != NULL); + + g_value_copy (out_value, target); + } + + g_value_unset (¶ms[0]); + g_value_unset (¶ms[1]); + g_value_unset (¶ms[2]); + g_value_unset (&retval); + + return res; +} + +static gboolean +bind_with_closures_transform_from (GBinding *binding, + const GValue *source, + GValue *target, + gpointer data) +{ + TransformData *t_data = data; + GValue params[3] = { G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT }; + GValue retval = G_VALUE_INIT; + gboolean res; + + g_value_init (¶ms[0], G_TYPE_BINDING); + g_value_set_object (¶ms[0], binding); + + g_value_init (¶ms[1], G_TYPE_VALUE); + g_value_set_boxed (¶ms[1], source); + + g_value_init (¶ms[2], G_TYPE_VALUE); + g_value_set_boxed (¶ms[2], target); + + g_value_init (&retval, G_TYPE_BOOLEAN); + g_value_set_boolean (&retval, FALSE); + + g_closure_invoke (t_data->transform_from_closure, &retval, 3, params, NULL); + + res = g_value_get_boolean (&retval); + if (res) + { + const GValue *out_value = g_value_get_boxed (¶ms[2]); + + g_assert (out_value != NULL); + + g_value_copy (out_value, target); + } + + g_value_unset (¶ms[0]); + g_value_unset (¶ms[1]); + g_value_unset (¶ms[2]); + g_value_unset (&retval); + + return res; +} + +static void +bind_with_closures_free_func (gpointer data) +{ + TransformData *t_data = data; + + if (t_data->transform_to_closure != NULL) + g_closure_unref (t_data->transform_to_closure); + + if (t_data->transform_from_closure != NULL) + g_closure_unref (t_data->transform_from_closure); + + g_slice_free (TransformData, t_data); +} + +/** + * g_object_bind_property_with_closures: + * @source: (type GObject.Object): the source #GObject + * @source_property: the property on @source to bind + * @target: (type GObject.Object): the target #GObject + * @target_property: the property on @target to bind + * @flags: flags to pass to #GBinding + * @transform_to: a #GClosure wrapping the transformation function + * from the @source to the @target, or %NULL to use the default + * @transform_from: a #GClosure wrapping the transformation function + * from the @target to the @source, or %NULL to use the default + * + * Creates a binding between @source_property on @source and @target_property + * on @target, allowing you to set the transformation functions to be used by + * the binding. + * + * This function is the language bindings friendly version of + * g_object_bind_property_full(), using #GClosures instead of + * function pointers. + * + * Rename to: g_object_bind_property_full + * + * Return value: (transfer none): the #GBinding instance representing the + * binding between the two #GObject instances. The binding is released + * whenever the #GBinding reference count reaches zero. + * + * Since: 2.26 + */ +GBinding * +g_object_bind_property_with_closures (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags, + GClosure *transform_to, + GClosure *transform_from) +{ + TransformData *data; + + data = g_slice_new0 (TransformData); + + if (transform_to != NULL) + { + if (G_CLOSURE_NEEDS_MARSHAL (transform_to)) + g_closure_set_marshal (transform_to, g_cclosure_marshal_BOOLEAN__BOXED_BOXED); + + data->transform_to_closure = g_closure_ref (transform_to); + g_closure_sink (data->transform_to_closure); + } + + if (transform_from != NULL) + { + if (G_CLOSURE_NEEDS_MARSHAL (transform_from)) + g_closure_set_marshal (transform_from, g_cclosure_marshal_BOOLEAN__BOXED_BOXED); + + data->transform_from_closure = g_closure_ref (transform_from); + g_closure_sink (data->transform_from_closure); + } + + return g_object_bind_property_full (source, source_property, + target, target_property, + flags, + transform_to != NULL ? bind_with_closures_transform_to : NULL, + transform_from != NULL ? bind_with_closures_transform_from : NULL, + data, + bind_with_closures_free_func); +} diff --git a/gobject/gbinding.h b/gobject/gbinding.h new file mode 100644 index 0000000..ebb329c --- /dev/null +++ b/gobject/gbinding.h @@ -0,0 +1,146 @@ +/* gbinding.h: Binding for object properties + * + * Copyright (C) 2010 Intel Corp. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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: Emmanuele Bassi + */ + +#ifndef __G_BINDING_H__ +#define __G_BINDING_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_BINDING_FLAGS (g_binding_flags_get_type ()) + +#define G_TYPE_BINDING (g_binding_get_type ()) +#define G_BINDING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_BINDING, GBinding)) +#define G_IS_BINDING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_BINDING)) + +/** + * GBinding: + * + * GBinding is an opaque structure whose members + * cannot be accessed directly. + * + * Since: 2.26 + */ +typedef struct _GBinding GBinding; + +/** + * GBindingTransformFunc: + * @binding: a #GBinding + * @source_value: the value of the source property + * @target_value: the value of the target property + * @user_data: data passed to the transform function + * + * A function to be called to transform the source property of @source + * from @source_value into the target property of @target + * using @target_value. + * + * Return value: %TRUE if the transformation was successful, and %FALSE + * otherwise + * + * Since: 2.26 + */ +typedef gboolean (* GBindingTransformFunc) (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer user_data); + +/** + * GBindingFlags: + * @G_BINDING_DEFAULT: The default binding; if the source property + * changes, the target property is updated with its value. + * @G_BINDING_BIDIRECTIONAL: Bidirectional binding; if either the + * property of the source or the property of the target changes, + * the other is updated. + * @G_BINDING_SYNC_CREATE: Synchronize the values of the source and + * target properties when creating the binding; the direction of + * the synchronization is always from the source to the target. + * @G_BINDING_INVERT_BOOLEAN: If the two properties being bound are + * booleans, setting one to %TRUE will result in the other being + * set to %FALSE and vice versa. This flag will only work for + * boolean properties, and cannot be used when passing custom + * transformation functions to g_object_bind_property_full(). + * + * Flags to be passed to g_object_bind_property() or + * g_object_bind_property_full(). + * + * This enumeration can be extended at later date. + * + * Since: 2.26 + */ +typedef enum { /*< prefix=G_BINDING >*/ + G_BINDING_DEFAULT = 0, + + G_BINDING_BIDIRECTIONAL = 1 << 0, + G_BINDING_SYNC_CREATE = 1 << 1, + G_BINDING_INVERT_BOOLEAN = 1 << 2 +} GBindingFlags; + +GLIB_AVAILABLE_IN_ALL +GType g_binding_flags_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_binding_get_type (void) G_GNUC_CONST; + +GLIB_AVAILABLE_IN_ALL +GBindingFlags g_binding_get_flags (GBinding *binding); +GLIB_AVAILABLE_IN_ALL +GObject * g_binding_get_source (GBinding *binding); +GLIB_AVAILABLE_IN_ALL +GObject * g_binding_get_target (GBinding *binding); +GLIB_AVAILABLE_IN_ALL +const gchar * g_binding_get_source_property (GBinding *binding); +GLIB_AVAILABLE_IN_ALL +const gchar * g_binding_get_target_property (GBinding *binding); + +GLIB_AVAILABLE_IN_ALL +GBinding *g_object_bind_property (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags); +GLIB_AVAILABLE_IN_ALL +GBinding *g_object_bind_property_full (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags, + GBindingTransformFunc transform_to, + GBindingTransformFunc transform_from, + gpointer user_data, + GDestroyNotify notify); +GLIB_AVAILABLE_IN_ALL +GBinding *g_object_bind_property_with_closures (gpointer source, + const gchar *source_property, + gpointer target, + const gchar *target_property, + GBindingFlags flags, + GClosure *transform_to, + GClosure *transform_from); + +G_END_DECLS + +#endif /* __G_BINDING_H__ */ diff --git a/gobject/gboxed.c b/gobject/gboxed.c new file mode 100644 index 0000000..7bac5e1 --- /dev/null +++ b/gobject/gboxed.c @@ -0,0 +1,553 @@ +/* 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 + +/* for GValueArray */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gboxed.h" +#include "gclosure.h" +#include "gtype-private.h" +#include "gvalue.h" +#include "gvaluearray.h" +#include "gvaluecollector.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 GValue * +value_copy (GValue *src_value) +{ + 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 (GValue *value) +{ + if (G_VALUE_TYPE (value)) + g_value_unset (value); + g_free (value); +} + +static GPollFD * +pollfd_copy (GPollFD *src) +{ + GPollFD *dest = g_new0 (GPollFD, 1); + /* just a couple of integers */ + memcpy (dest, src, sizeof (GPollFD)); + return dest; +} + +void +_g_boxed_type_init (void) +{ + 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); +} + +static GDate * +gdate_copy (GDate *date) +{ + return g_date_new_julian (g_date_get_julian (date)); +} + +static GString * +gstring_copy (GString *src_gstring) +{ + return g_string_new_len (src_gstring->str, src_gstring->len); +} + +static void +gstring_free (GString *gstring) +{ + g_string_free (gstring, TRUE); +} + +G_DEFINE_BOXED_TYPE (GClosure, g_closure, g_closure_ref, g_closure_unref) +G_DEFINE_BOXED_TYPE (GValue, g_value, value_copy, value_free) +G_DEFINE_BOXED_TYPE (GValueArray, g_value_array, g_value_array_copy, g_value_array_free) +G_DEFINE_BOXED_TYPE (GDate, g_date, gdate_copy, g_date_free) +/* the naming is a bit odd, but GString is obviously not G_TYPE_STRING */ +G_DEFINE_BOXED_TYPE (GString, g_gstring, gstring_copy, gstring_free) +G_DEFINE_BOXED_TYPE (GHashTable, g_hash_table, g_hash_table_ref, g_hash_table_unref) +G_DEFINE_BOXED_TYPE (GArray, g_array, g_array_ref, g_array_unref) +G_DEFINE_BOXED_TYPE (GPtrArray, g_ptr_array,g_ptr_array_ref, g_ptr_array_unref) +G_DEFINE_BOXED_TYPE (GByteArray, g_byte_array, g_byte_array_ref, g_byte_array_unref) +G_DEFINE_BOXED_TYPE (GBytes, g_bytes, g_bytes_ref, g_bytes_unref); + +G_DEFINE_BOXED_TYPE (GRegex, g_regex, g_regex_ref, g_regex_unref) +G_DEFINE_BOXED_TYPE (GMatchInfo, g_match_info, g_match_info_ref, g_match_info_unref) + +#define g_variant_type_get_type g_variant_type_get_gtype +G_DEFINE_BOXED_TYPE (GVariantType, g_variant_type, g_variant_type_copy, g_variant_type_free) +#undef g_variant_type_get_type + +G_DEFINE_BOXED_TYPE (GVariantBuilder, g_variant_builder, g_variant_builder_ref, g_variant_builder_unref) + +G_DEFINE_BOXED_TYPE (GError, g_error, g_error_copy, g_error_free) + +G_DEFINE_BOXED_TYPE (GDateTime, g_date_time, g_date_time_ref, g_date_time_unref); +G_DEFINE_BOXED_TYPE (GTimeZone, g_time_zone, g_time_zone_ref, g_time_zone_unref); +G_DEFINE_BOXED_TYPE (GKeyFile, g_key_file, g_key_file_ref, g_key_file_unref) + +G_DEFINE_BOXED_TYPE (GMainLoop, g_main_loop, g_main_loop_ref, g_main_loop_unref) +G_DEFINE_BOXED_TYPE (GMainContext, g_main_context, g_main_context_ref, g_main_context_unref) +G_DEFINE_BOXED_TYPE (GSource, g_source, g_source_ref, g_source_unref) +G_DEFINE_BOXED_TYPE (GPollFD, g_pollfd, pollfd_copy, g_free) +G_DEFINE_BOXED_TYPE (GMarkupParseContext, g_markup_parse_context, g_markup_parse_context_ref, g_markup_parse_context_unref) + +G_DEFINE_BOXED_TYPE (GThread, g_thread, g_thread_ref, g_thread_unref) +G_DEFINE_BOXED_TYPE (GChecksum, g_checksum, g_checksum_copy, g_checksum_free) + +/* This one can't use G_DEFINE_BOXED_TYPE (GStrv, g_strv, g_strdupv, g_strfreev) */ +GType +g_strv_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 (g_intern_static_string ("GStrv"), + (GBoxedCopyFunc) g_strdupv, + (GBoxedFreeFunc) g_strfreev); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +/** + * g_variant_get_gtype: + * + * Since: 2.24 + * Deprecated: 2.26 + */ +GType +g_variant_get_gtype (void) +{ + return G_TYPE_VARIANT; +} + +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 successful 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 laid 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: (transfer none): 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: (skip) + * @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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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); +} diff --git a/gobject/gboxed.h b/gobject/gboxed.h new file mode 100644 index 0000000..5f6b915 --- /dev/null +++ b/gobject/gboxed.h @@ -0,0 +1,124 @@ +/* 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. + */ +#ifndef __G_BOXED_H__ +#define __G_BOXED_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +#ifndef __GI_SCANNER__ +#include +#endif + +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 --- */ +GLIB_AVAILABLE_IN_ALL +gpointer g_boxed_copy (GType boxed_type, + gconstpointer src_boxed); +GLIB_AVAILABLE_IN_ALL +void g_boxed_free (GType boxed_type, + gpointer boxed); +GLIB_AVAILABLE_IN_ALL +void g_value_set_boxed (GValue *value, + gconstpointer v_boxed); +GLIB_AVAILABLE_IN_ALL +void g_value_set_static_boxed (GValue *value, + gconstpointer v_boxed); +GLIB_AVAILABLE_IN_ALL +void g_value_take_boxed (GValue *value, + gconstpointer v_boxed); +GLIB_DEPRECATED_FOR(g_value_take_boxed) +void g_value_set_boxed_take_ownership (GValue *value, + gconstpointer v_boxed); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_get_boxed (const GValue *value); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_dup_boxed (const GValue *value); + + +/* --- convenience --- */ +GLIB_AVAILABLE_IN_ALL +GType g_boxed_type_register_static (const gchar *name, + GBoxedCopyFunc boxed_copy, + GBoxedFreeFunc boxed_free); + +/* --- GObject 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 ()) + +GLIB_AVAILABLE_IN_ALL +GType g_closure_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_value_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __G_BOXED_H__ */ diff --git a/gobject/gclosure.c b/gobject/gclosure.c new file mode 100644 index 0000000..dd3fae6 --- /dev/null +++ b/gobject/gclosure.c @@ -0,0 +1,1892 @@ +/* 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 + +#include "gclosure.h" +#include "gboxed.h" +#include "gobject.h" +#include "genums.h" +#include "gvalue.h" +#include "gvaluetypes.h" +#include "gtype-private.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)->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: (transfer full): a newly allocated #GClosure + */ +GClosure* +g_closure_new_simple (guint sizeof_closure, + gpointer data) +{ + GRealClosure *real_closure; + GClosure *closure; + + g_return_val_if_fail (sizeof_closure >= sizeof (GClosure), NULL); + sizeof_closure = sizeof_closure + sizeof (GRealClosure) - sizeof (GClosure); + + real_closure = g_malloc0 (sizeof_closure); + closure = &real_closure->closure; + SET (closure, ref_count, 1); + SET (closure, floating, TRUE); + closure->data = data; + + return closure; +} + +static inline void +closure_invoke_notifiers (GClosure *closure, + guint notify_type) +{ + /* notifier layout: + * n_guards n_guards n_fnotif. n_inotifiers + * ->[[pre_guards][post_guards][fnotifiers][inotifiers]] + * + * CLOSURE_N_MFUNCS(cl) = 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 + * + 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 = 0; + while (i--) + { + ndata = closure->notifiers + offs + i; + ndata->notify (ndata->data, closure); + } + break; + case POST_NOTIFY: + i = closure->n_guards; + offs = i; + while (i--) + { + ndata = closure->notifiers + offs + i; + ndata->notify (ndata->data, closure); + } + break; + } +} + +static void +g_closure_set_meta_va_marshal (GClosure *closure, + GVaClosureMarshal va_meta_marshal) +{ + GRealClosure *real_closure; + + g_return_if_fail (closure != NULL); + g_return_if_fail (va_meta_marshal != NULL); + g_return_if_fail (closure->is_invalid == FALSE); + g_return_if_fail (closure->in_marshal == FALSE); + + real_closure = G_REAL_CLOSURE (closure); + + g_return_if_fail (real_closure->meta_marshal != NULL); + + real_closure->va_meta_marshal = va_meta_marshal; +} + +/** + * g_closure_set_meta_marshal: (skip) + * @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) +{ + GRealClosure *real_closure; + + 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); + + real_closure = G_REAL_CLOSURE (closure); + + g_return_if_fail (real_closure->meta_marshal == NULL); + + real_closure->meta_marshal = meta_marshal; + real_closure->meta_marshal_data = marshal_data; +} + +/** + * g_closure_add_marshal_guards: (skip) + * @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->n_guards + + closure->n_guards + 1)] = closure->notifiers[closure->n_guards]; + i = closure->n_guards; + closure->notifiers[i].data = pre_marshal_data; + closure->notifiers[i].notify = pre_marshal_notify; + closure->notifiers[i + 1].data = post_marshal_data; + closure->notifiers[i + 1].notify = post_marshal_notify; + INC (closure, n_guards); +} + +/** + * g_closure_add_finalize_notifier: (skip) + * @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: (skip) + * @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: (transfer none): 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 (G_REAL_CLOSURE (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 existence 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 initial 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: (skip) + * @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: (skip) + * @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: (allow-none): 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: (array length=n_param_values): an array of + * #GValues holding the arguments on which to + * invoke the callback of @closure + * @invocation_hint: (allow-none): 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) +{ + GRealClosure *real_closure; + + g_return_if_fail (closure != NULL); + + real_closure = G_REAL_CLOSURE (closure); + + 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 || real_closure->meta_marshal); + + SET (closure, in_marshal, TRUE); + if (real_closure->meta_marshal) + { + marshal_data = real_closure->meta_marshal_data; + marshal = real_closure->meta_marshal; + } + 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); +} + +gboolean +_g_closure_supports_invoke_va (GClosure *closure) +{ + GRealClosure *real_closure; + + g_return_val_if_fail (closure != NULL, FALSE); + + real_closure = G_REAL_CLOSURE (closure); + + return + real_closure->va_marshal != NULL && + (real_closure->meta_marshal == NULL || + real_closure->va_meta_marshal != NULL); +} + +void +_g_closure_invoke_va (GClosure *closure, + GValue /*out*/ *return_value, + gpointer instance, + va_list args, + int n_params, + GType *param_types) +{ + GRealClosure *real_closure; + + g_return_if_fail (closure != NULL); + + real_closure = G_REAL_CLOSURE (closure); + + g_closure_ref (closure); /* preserve floating flag */ + if (!closure->is_invalid) + { + GVaClosureMarshal marshal; + gpointer marshal_data; + gboolean in_marshal = closure->in_marshal; + + g_return_if_fail (closure->marshal || real_closure->meta_marshal); + + SET (closure, in_marshal, TRUE); + if (real_closure->va_meta_marshal) + { + marshal_data = real_closure->meta_marshal_data; + marshal = real_closure->va_meta_marshal; + } + else + { + marshal_data = NULL; + marshal = real_closure->va_marshal; + } + if (!in_marshal) + closure_invoke_notifiers (closure, PRE_NOTIFY); + marshal (closure, + return_value, + instance, args, + marshal_data, + n_params, param_types); + if (!in_marshal) + closure_invoke_notifiers (closure, POST_NOTIFY); + SET (closure, in_marshal, in_marshal); + } + g_closure_unref (closure); +} + + +/** + * g_closure_set_marshal: (skip) + * @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; +} + +void +_g_closure_set_va_marshal (GClosure *closure, + GVaClosureMarshal marshal) +{ + GRealClosure *real_closure; + + g_return_if_fail (closure != NULL); + g_return_if_fail (marshal != NULL); + + real_closure = G_REAL_CLOSURE (closure); + + if (real_closure->va_marshal && real_closure->va_marshal != marshal) + g_warning ("attempt to override closure->va_marshal (%p) with new marshal (%p)", + real_closure->va_marshal, marshal); + else + real_closure->va_marshal = marshal; +} + +/** + * g_cclosure_new: (skip) + * @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: (skip) + * @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: (transfer full): 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_class_meta_marshalv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + GRealClosure *real_closure; + GTypeClass *class; + gpointer callback; + /* GType itype = (GType) closure->data; */ + guint offset = GPOINTER_TO_UINT (marshal_data); + + real_closure = G_REAL_CLOSURE (closure); + + class = G_TYPE_INSTANCE_GET_CLASS (instance, itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + if (callback) + real_closure->va_marshal (closure, + return_value, + instance, args, + callback, + n_params, + param_types); +} + +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); +} + +gboolean +_g_closure_is_void (GClosure *closure, + gpointer instance) +{ + GRealClosure *real_closure; + GTypeClass *class; + gpointer callback; + GType itype; + guint offset; + + if (closure->is_invalid) + return TRUE; + + real_closure = G_REAL_CLOSURE (closure); + + if (real_closure->meta_marshal == g_type_iface_meta_marshal) + { + itype = (GType) closure->data; + offset = GPOINTER_TO_UINT (real_closure->meta_marshal_data); + + class = G_TYPE_INSTANCE_GET_INTERFACE (instance, itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + return callback == NULL; + } + else if (real_closure->meta_marshal == g_type_class_meta_marshal) + { + offset = GPOINTER_TO_UINT (real_closure->meta_marshal_data); + + class = G_TYPE_INSTANCE_GET_CLASS (instance, itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + return callback == NULL; + } + + return FALSE; +} + +static void +g_type_iface_meta_marshalv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + GRealClosure *real_closure; + GTypeClass *class; + gpointer callback; + GType itype = (GType) closure->data; + guint offset = GPOINTER_TO_UINT (marshal_data); + + real_closure = G_REAL_CLOSURE (closure); + + class = G_TYPE_INSTANCE_GET_INTERFACE (instance, itype, GTypeClass); + callback = G_STRUCT_MEMBER (gpointer, class, offset); + if (callback) + real_closure->va_marshal (closure, + return_value, + instance, args, + callback, + n_params, + param_types); +} + +/** + * 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); + g_closure_set_meta_va_marshal (closure, g_type_iface_meta_marshalv); + } + else + { + g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_class_meta_marshal); + g_closure_set_meta_va_marshal (closure, g_type_class_meta_marshalv); + } + return closure; +} + +#include +static ffi_type * +value_to_ffi_type (const GValue *gvalue, + gpointer *value, + gint *enum_tmpval, + gboolean *tmpval_used) +{ + ffi_type *rettype = NULL; + GType type = g_type_fundamental (G_VALUE_TYPE (gvalue)); + g_assert (type != G_TYPE_INVALID); + + if (enum_tmpval) + { + g_assert (tmpval_used != NULL); + *tmpval_used = FALSE; + } + + switch (type) + { + case G_TYPE_BOOLEAN: + case G_TYPE_CHAR: + case G_TYPE_INT: + rettype = &ffi_type_sint; + *value = (gpointer)&(gvalue->data[0].v_int); + break; + case G_TYPE_ENUM: + /* enums are stored in v_long even though they are integers, which makes + * marshalling through libffi somewhat complicated. They need to be + * marshalled as signed ints, but we need to use a temporary int sized + * value to pass to libffi otherwise it'll pull the wrong value on + * BE machines with 32-bit integers when treating v_long as 32-bit int. + */ + g_assert (enum_tmpval != NULL); + rettype = &ffi_type_sint; + *enum_tmpval = g_value_get_enum (gvalue); + *value = enum_tmpval; + *tmpval_used = TRUE; + break; + case G_TYPE_UCHAR: + case G_TYPE_UINT: + case G_TYPE_FLAGS: + rettype = &ffi_type_uint; + *value = (gpointer)&(gvalue->data[0].v_uint); + break; + case G_TYPE_STRING: + case G_TYPE_OBJECT: + case G_TYPE_BOXED: + case G_TYPE_PARAM: + case G_TYPE_POINTER: + case G_TYPE_INTERFACE: + case G_TYPE_VARIANT: + rettype = &ffi_type_pointer; + *value = (gpointer)&(gvalue->data[0].v_pointer); + break; + case G_TYPE_FLOAT: + rettype = &ffi_type_float; + *value = (gpointer)&(gvalue->data[0].v_float); + break; + case G_TYPE_DOUBLE: + rettype = &ffi_type_double; + *value = (gpointer)&(gvalue->data[0].v_double); + break; + case G_TYPE_LONG: + rettype = &ffi_type_slong; + *value = (gpointer)&(gvalue->data[0].v_long); + break; + case G_TYPE_ULONG: + rettype = &ffi_type_ulong; + *value = (gpointer)&(gvalue->data[0].v_ulong); + break; + case G_TYPE_INT64: + rettype = &ffi_type_sint64; + *value = (gpointer)&(gvalue->data[0].v_int64); + break; + case G_TYPE_UINT64: + rettype = &ffi_type_uint64; + *value = (gpointer)&(gvalue->data[0].v_uint64); + break; + default: + rettype = &ffi_type_pointer; + *value = NULL; + g_warning ("value_to_ffi_type: Unsupported fundamental type: %s", g_type_name (type)); + break; + } + return rettype; +} + +static void +value_from_ffi_type (GValue *gvalue, gpointer *value) +{ + ffi_arg *int_val = (ffi_arg*) value; + + switch (g_type_fundamental (G_VALUE_TYPE (gvalue))) + { + case G_TYPE_INT: + g_value_set_int (gvalue, (gint) *int_val); + break; + case G_TYPE_FLOAT: + g_value_set_float (gvalue, *(gfloat*)value); + break; + case G_TYPE_DOUBLE: + g_value_set_double (gvalue, *(gdouble*)value); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (gvalue, (gboolean) *int_val); + break; + case G_TYPE_STRING: + g_value_take_string (gvalue, *(gchar**)value); + break; + case G_TYPE_CHAR: + g_value_set_schar (gvalue, (gint8) *int_val); + break; + case G_TYPE_UCHAR: + g_value_set_uchar (gvalue, (guchar) *int_val); + break; + case G_TYPE_UINT: + g_value_set_uint (gvalue, (guint) *int_val); + break; + case G_TYPE_POINTER: + g_value_set_pointer (gvalue, *(gpointer*)value); + break; + case G_TYPE_LONG: + g_value_set_long (gvalue, (glong) *int_val); + break; + case G_TYPE_ULONG: + g_value_set_ulong (gvalue, (gulong) *int_val); + break; + case G_TYPE_INT64: + g_value_set_int64 (gvalue, (gint64) *int_val); + break; + case G_TYPE_UINT64: + g_value_set_uint64 (gvalue, (guint64) *int_val); + break; + case G_TYPE_BOXED: + g_value_take_boxed (gvalue, *(gpointer*)value); + break; + case G_TYPE_ENUM: + g_value_set_enum (gvalue, (gint) *int_val); + break; + case G_TYPE_FLAGS: + g_value_set_flags (gvalue, (guint) *int_val); + break; + case G_TYPE_PARAM: + g_value_take_param (gvalue, *(gpointer*)value); + break; + case G_TYPE_OBJECT: + g_value_take_object (gvalue, *(gpointer*)value); + break; + case G_TYPE_VARIANT: + g_value_take_variant (gvalue, *(gpointer*)value); + break; + default: + g_warning ("value_from_ffi_type: Unsupported fundamental type: %s", + g_type_name (g_type_fundamental (G_VALUE_TYPE (gvalue)))); + } +} + +typedef union { + gpointer _gpointer; + float _float; + double _double; + gint _gint; + guint _guint; + glong _glong; + gulong _gulong; + gint64 _gint64; + guint64 _guint64; +} va_arg_storage; + +static ffi_type * +va_to_ffi_type (GType gtype, + va_list *va, + va_arg_storage *storage) +{ + ffi_type *rettype = NULL; + GType type = g_type_fundamental (gtype); + g_assert (type != G_TYPE_INVALID); + + switch (type) + { + case G_TYPE_BOOLEAN: + case G_TYPE_CHAR: + case G_TYPE_INT: + case G_TYPE_ENUM: + rettype = &ffi_type_sint; + storage->_gint = va_arg (*va, gint); + break; + case G_TYPE_UCHAR: + case G_TYPE_UINT: + case G_TYPE_FLAGS: + rettype = &ffi_type_uint; + storage->_guint = va_arg (*va, guint); + break; + case G_TYPE_STRING: + case G_TYPE_OBJECT: + case G_TYPE_BOXED: + case G_TYPE_PARAM: + case G_TYPE_POINTER: + case G_TYPE_INTERFACE: + case G_TYPE_VARIANT: + rettype = &ffi_type_pointer; + storage->_gpointer = va_arg (*va, gpointer); + break; + case G_TYPE_FLOAT: + /* Float args are passed as doubles in varargs */ + rettype = &ffi_type_float; + storage->_float = (float)va_arg (*va, double); + break; + case G_TYPE_DOUBLE: + rettype = &ffi_type_double; + storage->_double = va_arg (*va, double); + break; + case G_TYPE_LONG: + rettype = &ffi_type_slong; + storage->_glong = va_arg (*va, glong); + break; + case G_TYPE_ULONG: + rettype = &ffi_type_ulong; + storage->_gulong = va_arg (*va, gulong); + break; + case G_TYPE_INT64: + rettype = &ffi_type_sint64; + storage->_gint64 = va_arg (*va, gint64); + break; + case G_TYPE_UINT64: + rettype = &ffi_type_uint64; + storage->_guint64 = va_arg (*va, guint64); + break; + default: + rettype = &ffi_type_pointer; + storage->_guint64 = 0; + g_warning ("va_to_ffi_type: Unsupported fundamental type: %s", g_type_name (type)); + break; + } + return rettype; +} + +/** + * g_cclosure_marshal_generic: + * @closure: A #GClosure. + * @return_gvalue: 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() + * + * A generic marshaller function implemented via libffi. + * + * Since: 2.30 + */ +void +g_cclosure_marshal_generic (GClosure *closure, + GValue *return_gvalue, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + ffi_type *rtype; + void *rvalue; + int n_args; + ffi_type **atypes; + void **args; + int i; + ffi_cif cif; + GCClosure *cc = (GCClosure*) closure; + gint *enum_tmpval; + gboolean tmpval_used = FALSE; + + enum_tmpval = g_alloca (sizeof (gint)); + if (return_gvalue && G_VALUE_TYPE (return_gvalue)) + { + rtype = value_to_ffi_type (return_gvalue, &rvalue, enum_tmpval, &tmpval_used); + } + else + { + rtype = &ffi_type_void; + } + + rvalue = g_alloca (MAX (rtype->size, sizeof (ffi_arg))); + + n_args = n_param_values + 1; + atypes = g_alloca (sizeof (ffi_type *) * n_args); + args = g_alloca (sizeof (gpointer) * n_args); + + if (tmpval_used) + enum_tmpval = g_alloca (sizeof (gint)); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + atypes[n_args-1] = value_to_ffi_type (param_values + 0, + &args[n_args-1], + enum_tmpval, + &tmpval_used); + atypes[0] = &ffi_type_pointer; + args[0] = &closure->data; + } + else + { + atypes[0] = value_to_ffi_type (param_values + 0, + &args[0], + enum_tmpval, + &tmpval_used); + atypes[n_args-1] = &ffi_type_pointer; + args[n_args-1] = &closure->data; + } + + for (i = 1; i < n_args - 1; i++) + { + if (tmpval_used) + enum_tmpval = g_alloca (sizeof (gint)); + + atypes[i] = value_to_ffi_type (param_values + i, + &args[i], + enum_tmpval, + &tmpval_used); + } + + if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, n_args, rtype, atypes) != FFI_OK) + return; + + ffi_call (&cif, marshal_data ? marshal_data : cc->callback, rvalue, args); + + if (return_gvalue && G_VALUE_TYPE (return_gvalue)) + value_from_ffi_type (return_gvalue, rvalue); +} + +void +g_cclosure_marshal_generic_va (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args_list, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + ffi_type *rtype; + void *rvalue; + int n_args; + ffi_type **atypes; + void **args; + va_arg_storage *storage; + int i; + ffi_cif cif; + GCClosure *cc = (GCClosure*) closure; + gint *enum_tmpval; + gboolean tmpval_used = FALSE; + va_list args_copy; + + enum_tmpval = g_alloca (sizeof (gint)); + if (return_value && G_VALUE_TYPE (return_value)) + { + rtype = value_to_ffi_type (return_value, &rvalue, enum_tmpval, &tmpval_used); + } + else + { + rtype = &ffi_type_void; + } + + rvalue = g_alloca (MAX (rtype->size, sizeof (ffi_arg))); + + n_args = n_params + 2; + atypes = g_alloca (sizeof (ffi_type *) * n_args); + args = g_alloca (sizeof (gpointer) * n_args); + storage = g_alloca (sizeof (va_arg_storage) * n_params); + + if (tmpval_used) + enum_tmpval = g_alloca (sizeof (gint)); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + atypes[n_args-1] = &ffi_type_pointer; + args[n_args-1] = &instance; + atypes[0] = &ffi_type_pointer; + args[0] = &closure->data; + } + else + { + atypes[0] = &ffi_type_pointer; + args[0] = &instance; + atypes[n_args-1] = &ffi_type_pointer; + args[n_args-1] = &closure->data; + } + + G_VA_COPY (args_copy, args_list); + + /* Box non-primitive arguments */ + for (i = 0; i < n_params; i++) + { + GType type = param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE; + GType fundamental = G_TYPE_FUNDAMENTAL (type); + + atypes[i+1] = va_to_ffi_type (type, + &args_copy, + &storage[i]); + args[i+1] = &storage[i]; + + if ((param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0) + { + if (fundamental == G_TYPE_STRING && storage[i]._gpointer != NULL) + storage[i]._gpointer = g_strdup (storage[i]._gpointer); + else if (fundamental == G_TYPE_PARAM && storage[i]._gpointer != NULL) + storage[i]._gpointer = g_param_spec_ref (storage[i]._gpointer); + else if (fundamental == G_TYPE_BOXED && storage[i]._gpointer != NULL) + storage[i]._gpointer = g_boxed_copy (type, storage[i]._gpointer); + else if (fundamental == G_TYPE_VARIANT && storage[i]._gpointer != NULL) + storage[i]._gpointer = g_variant_ref_sink (storage[i]._gpointer); + } + if (fundamental == G_TYPE_OBJECT && storage[i]._gpointer != NULL) + storage[i]._gpointer = g_object_ref (storage[i]._gpointer); + } + + va_end (args_copy); + + if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, n_args, rtype, atypes) != FFI_OK) + return; + + ffi_call (&cif, marshal_data ? marshal_data : cc->callback, rvalue, args); + + /* Unbox non-primitive arguments */ + for (i = 0; i < n_params; i++) + { + GType type = param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE; + GType fundamental = G_TYPE_FUNDAMENTAL (type); + + if ((param_types[i] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0) + { + if (fundamental == G_TYPE_STRING && storage[i]._gpointer != NULL) + g_free (storage[i]._gpointer); + else if (fundamental == G_TYPE_PARAM && storage[i]._gpointer != NULL) + g_param_spec_unref (storage[i]._gpointer); + else if (fundamental == G_TYPE_BOXED && storage[i]._gpointer != NULL) + g_boxed_free (type, storage[i]._gpointer); + else if (fundamental == G_TYPE_VARIANT && storage[i]._gpointer != NULL) + g_variant_unref (storage[i]._gpointer); + } + if (fundamental == G_TYPE_OBJECT && storage[i]._gpointer != NULL) + g_object_unref (storage[i]._gpointer); + } + + if (return_value && G_VALUE_TYPE (return_value)) + value_from_ffi_type (return_value, rvalue); +} + +/** + * 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__VARIANT: + * @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 #GVariant* 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, GVariant *arg1, gpointer user_data). + * + * Since: 2.26 + */ + +/** + * 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). + */ +/** + * g_cclosure_marshal_BOOLEAN__OBJECT_BOXED_BOXED: + * @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 + * gboolean (*callback) (gpointer instance, GBoxed *arg1, GBoxed *arg2, gpointer user_data). + * + * Since: 2.26 + */ diff --git a/gobject/gclosure.h b/gobject/gclosure.h new file mode 100644 index 0000000..f59aab5 --- /dev/null +++ b/gobject/gclosure.h @@ -0,0 +1,299 @@ +/* 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. + */ +#ifndef __G_CLOSURE_H__ +#define __G_CLOSURE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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)->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: (allow-none): 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: (array length=n_param_values): an array of + * #GValues holding the arguments on which to invoke the + * callback of @closure + * @invocation_hint: (allow-none): the invocation hint given as the + * last argument to g_closure_invoke() + * @marshal_data: (allow-none): 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); + +typedef void (* GVaClosureMarshal) (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/** + * 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; + /* meta_marshal is not used anymore but must be zero for historical reasons + as it was exposed in the G_CLOSURE_N_NOTIFIERS macro */ + volatile guint meta_marshal_nouse : 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 --- */ +GLIB_AVAILABLE_IN_ALL +GClosure* g_cclosure_new (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GLIB_AVAILABLE_IN_ALL +GClosure* g_cclosure_new_swap (GCallback callback_func, + gpointer user_data, + GClosureNotify destroy_data); +GLIB_AVAILABLE_IN_ALL +GClosure* g_signal_type_cclosure_new (GType itype, + guint struct_offset); + + +/* --- prototypes --- */ +GLIB_AVAILABLE_IN_ALL +GClosure* g_closure_ref (GClosure *closure); +GLIB_AVAILABLE_IN_ALL +void g_closure_sink (GClosure *closure); +GLIB_AVAILABLE_IN_ALL +void g_closure_unref (GClosure *closure); +/* intimidating */ +GLIB_AVAILABLE_IN_ALL +GClosure* g_closure_new_simple (guint sizeof_closure, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_closure_add_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +GLIB_AVAILABLE_IN_ALL +void g_closure_remove_finalize_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +GLIB_AVAILABLE_IN_ALL +void g_closure_add_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +GLIB_AVAILABLE_IN_ALL +void g_closure_remove_invalidate_notifier (GClosure *closure, + gpointer notify_data, + GClosureNotify notify_func); +GLIB_AVAILABLE_IN_ALL +void g_closure_add_marshal_guards (GClosure *closure, + gpointer pre_marshal_data, + GClosureNotify pre_marshal_notify, + gpointer post_marshal_data, + GClosureNotify post_marshal_notify); +GLIB_AVAILABLE_IN_ALL +void g_closure_set_marshal (GClosure *closure, + GClosureMarshal marshal); +GLIB_AVAILABLE_IN_ALL +void g_closure_set_meta_marshal (GClosure *closure, + gpointer marshal_data, + GClosureMarshal meta_marshal); +GLIB_AVAILABLE_IN_ALL +void g_closure_invalidate (GClosure *closure); +GLIB_AVAILABLE_IN_ALL +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 +*/ + +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_generic (GClosure *closure, + GValue *return_gvalue, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); + +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_generic_va (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args_list, + gpointer marshal_data, + int n_params, + GType *param_types); + + +G_END_DECLS + +#endif /* __G_CLOSURE_H__ */ diff --git a/gobject/genums.c b/gobject/genums.c new file mode 100644 index 0000000..1b3411f --- /dev/null +++ b/gobject/genums.c @@ -0,0 +1,621 @@ +/* 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 "gtype-private.h" +#include "gvalue.h" +#include "gvaluecollector.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 */ + }; + 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; +} diff --git a/gobject/genums.h b/gobject/genums.h new file mode 100644 index 0000000..8aa7b89 --- /dev/null +++ b/gobject/genums.h @@ -0,0 +1,275 @@ +/* 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_ENUMS_H__ +#define __G_ENUMS_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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 --- */ +GLIB_AVAILABLE_IN_ALL +GEnumValue* g_enum_get_value (GEnumClass *enum_class, + gint value); +GLIB_AVAILABLE_IN_ALL +GEnumValue* g_enum_get_value_by_name (GEnumClass *enum_class, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GEnumValue* g_enum_get_value_by_nick (GEnumClass *enum_class, + const gchar *nick); +GLIB_AVAILABLE_IN_ALL +GFlagsValue* g_flags_get_first_value (GFlagsClass *flags_class, + guint value); +GLIB_AVAILABLE_IN_ALL +GFlagsValue* g_flags_get_value_by_name (GFlagsClass *flags_class, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GFlagsValue* g_flags_get_value_by_nick (GFlagsClass *flags_class, + const gchar *nick); +GLIB_AVAILABLE_IN_ALL +void g_value_set_enum (GValue *value, + gint v_enum); +GLIB_AVAILABLE_IN_ALL +gint g_value_get_enum (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_flags (GValue *value, + guint v_flags); +GLIB_AVAILABLE_IN_ALL +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! + */ +GLIB_AVAILABLE_IN_ALL +GType g_enum_register_static (const gchar *name, + const GEnumValue *const_static_values); +GLIB_AVAILABLE_IN_ALL +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 + */ +GLIB_AVAILABLE_IN_ALL +void g_enum_complete_type_info (GType g_enum_type, + GTypeInfo *info, + const GEnumValue *const_values); +GLIB_AVAILABLE_IN_ALL +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.c b/gobject/glib-genmarshal.c new file mode 100644 index 0000000..6ef6ea7 --- /dev/null +++ b/gobject/glib-genmarshal.c @@ -0,0 +1,1084 @@ +/* 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 + +#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 *promoted_ctype; /* promoted C type name [gchar*] */ + const gchar *getter; /* value getter function [g_value_get_string] */ + const gchar *box; /* value box function [g_strdup] */ + const gchar *unbox; /* value unbox function [g_free] */ + gboolean box_ignores_static; /* Wether the box/unbox functions ignore the static_scope */ + gboolean box_takes_type; /* Wether the box/unbox functions take a type arg */ +} 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 gen_valist = 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_schar (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 ("#define g_marshal_value_peek_variant(v) g_value_get_variant (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 ("#define g_marshal_value_peek_variant(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 promoted getter */ + { "VOID", "VOID", "void", "void", NULL, }, + { "BOOLEAN", "BOOLEAN", "gboolean", "gboolean", "g_marshal_value_peek_boolean", }, + { "CHAR", "CHAR", "gchar", "gint", "g_marshal_value_peek_char", }, + { "UCHAR", "UCHAR", "guchar", "guint", "g_marshal_value_peek_uchar", }, + { "INT", "INT", "gint", "gint", "g_marshal_value_peek_int", }, + { "UINT", "UINT", "guint", "guint", "g_marshal_value_peek_uint", }, + { "LONG", "LONG", "glong", "glong", "g_marshal_value_peek_long", }, + { "ULONG", "ULONG", "gulong", "gulong", "g_marshal_value_peek_ulong", }, + { "INT64", "INT64", "gint64", "gint64", "g_marshal_value_peek_int64", }, + { "UINT64", "UINT64", "guint64", "guint64", "g_marshal_value_peek_uint64", }, + { "ENUM", "ENUM", "gint", "gint", "g_marshal_value_peek_enum", }, + { "FLAGS", "FLAGS", "guint", "guint", "g_marshal_value_peek_flags", }, + { "FLOAT", "FLOAT", "gfloat", "gdouble", "g_marshal_value_peek_float", }, + { "DOUBLE", "DOUBLE", "gdouble", "gdouble", "g_marshal_value_peek_double", }, + { "STRING", "STRING", "gpointer", "gpointer", "g_marshal_value_peek_string", "g_strdup", "g_free"}, + { "PARAM", "PARAM", "gpointer", "gpointer", "g_marshal_value_peek_param", "g_param_spec_ref", "g_param_spec_unref"}, + { "BOXED", "BOXED", "gpointer", "gpointer", "g_marshal_value_peek_boxed", "g_boxed_copy", "g_boxed_free", FALSE, TRUE}, + { "POINTER", "POINTER", "gpointer", "gpointer", "g_marshal_value_peek_pointer", }, + { "OBJECT", "OBJECT", "gpointer", "gpointer", "g_marshal_value_peek_object", "g_object_ref", "g_object_unref", TRUE}, + { "VARIANT", "VARIANT", "gpointer", "gpointer", "g_marshal_value_peek_variant", "g_variant_ref_sink", "g_variant_unref"}, + /* deprecated: */ + { "NONE", "VOID", "void", "void", NULL, }, + { "BOOL", "BOOLEAN", "gboolean", "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->promoted_ctype = args[i].promoted_ctype; + iarg->getter = args[i].getter; + iarg->box = args[i].box; + iarg->unbox = args[i].unbox; + iarg->box_ignores_static = args[i].box_ignores_static; + iarg->box_takes_type = args[i].box_takes_type; + + 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", }, + { "VARIANT", "VARIANT", "GVariant*", "g_value_take_variant", }, + /* 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); + } + + /* GValue marshaller */ + 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"); + } + + + /* vararg marshaller */ + if (gen_cheader && gen_valist && have_std_marshaller) + { + g_fprintf (fout, "#define %s_%sv\t%s_%sv\n", marshaller_prefix, signame, std_marshaller_prefix, signame); + } + if (gen_cheader && gen_valist && !have_std_marshaller) + { + ind = g_fprintf (fout, gen_internal ? "G_GNUC_INTERNAL " : "extern "); + ind += g_fprintf (fout, "void "); + ind += g_fprintf (fout, "%s_%sv (", marshaller_prefix, signame); + g_fprintf (fout, "GClosure *closure,\n"); + g_fprintf (fout, "%sGValue *return_value,\n", indent (ind)); + g_fprintf (fout, "%sgpointer instance,\n", indent (ind)); + g_fprintf (fout, "%sva_list args,\n", indent (ind)); + g_fprintf (fout, "%sgpointer marshal_data,\n", indent (ind)); + g_fprintf (fout, "%sint n_params,\n", indent (ind)); + g_fprintf (fout, "%sGType *param_types);\n", indent (ind)); + } + if (gen_cbody && gen_valist && !have_std_marshaller) + { + gint i; + gboolean has_arg; + + g_fprintf (fout, "void\n"); + ind = g_fprintf (fout, "%s_%sv (", marshaller_prefix, signame); + g_fprintf (fout, "GClosure *closure,\n"); + g_fprintf (fout, "%sGValue *return_value,\n", indent (ind)); + g_fprintf (fout, "%sgpointer instance,\n", indent (ind)); + g_fprintf (fout, "%sva_list args,\n", indent (ind)); + g_fprintf (fout, "%sgpointer marshal_data,\n", indent (ind)); + g_fprintf (fout, "%sint n_params,\n", indent (ind)); + g_fprintf (fout, "%sGType *param_types)\n", indent (ind)); + g_fprintf (fout, "{\n"); + + ind = g_fprintf (fout, " typedef %s (*GMarshalFunc_%s) (", sig->rarg->ctype, signame); + g_fprintf (fout, "%s instance", pad ("gpointer")); + for (a = 0, node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + g_fprintf (fout, ",\n%s%s arg_%d", indent (ind), pad (iarg->ctype), a++); + } + g_fprintf (fout, ",\n%s%s data);\n", indent (ind), pad ("gpointer")); + g_fprintf (fout, " GCClosure *cc = (GCClosure*) closure;\n"); + g_fprintf (fout, " gpointer data1, data2;\n"); + g_fprintf (fout, " GMarshalFunc_%s callback;\n", signame); + has_arg = FALSE; + + i = 0; + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + { + g_fprintf (fout, " %s arg%i;\n", iarg->ctype, i++); + has_arg = TRUE; + } + } + if (has_arg) + g_fprintf (fout, " va_list args_copy;\n"); + + if (sig->rarg->setter) + g_fprintf (fout, " %s v_return;\n", sig->rarg->ctype); + + if (sig->rarg->setter) + { + g_fprintf (fout, "\n"); + g_fprintf (fout, " g_return_if_fail (return_value != NULL);\n"); + } + + /* cfile marshal data1, data2 and callback setup */ + if (has_arg) + { + g_fprintf (fout, "\n"); + g_fprintf (fout, " G_VA_COPY (args_copy, args);\n"); + i = 0; + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + { + g_fprintf (fout, " arg%i = (%s) va_arg (args_copy, %s);\n", + i, iarg->ctype, iarg->promoted_ctype); + + if (iarg->box != NULL) + { + g_fprintf (fout, " if ("); + if (!iarg->box_ignores_static) + g_fprintf (fout, "(param_types[%i] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && ", i); + g_fprintf (fout, "arg%i != NULL)\n ", i); + if (iarg->box_takes_type) + g_fprintf (fout, + " arg%i = %s (param_types[%i] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg%i);\n", + i, iarg->box, i, i); + else + g_fprintf (fout, + " arg%i = %s (arg%i);\n", + i, iarg->box, i); + } + } + i++; + } + g_fprintf (fout, " va_end (args_copy);\n"); + } + + g_fprintf (fout, "\n"); + /* cfile marshal data1, data2 and callback setup */ + g_fprintf (fout, " if (G_CCLOSURE_SWAP_DATA (closure))\n {\n"); + g_fprintf (fout, " data1 = closure->data;\n"); + g_fprintf (fout, " data2 = instance;\n"); + g_fprintf (fout, " }\n else\n {\n"); + g_fprintf (fout, " data1 = instance;\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"); + + i = 0; + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->getter) + g_fprintf (fout, ",\n%sarg%i", indent (ind), i++); + } + g_fprintf (fout, ",\n%sdata2);\n", indent (ind)); + + i = 0; + for (node = sig->args; node; node = node->next) + { + InArgument *iarg = node->data; + + if (iarg->unbox) + { + g_fprintf (fout, " if ("); + if (!iarg->box_ignores_static) + g_fprintf (fout, "(param_types[%i] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && ", i); + g_fprintf (fout, "arg%i != NULL)\n ", i); + if (iarg->box_takes_type) + g_fprintf (fout, + " %s (param_types[%i] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg%i);\n", + iarg->unbox, i, i); + else + g_fprintf (fout, + " %s (arg%i);\n", + iarg->unbox, i); + } + i++; + } + + /* 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); + } + + g_fprintf (fout, "}\n\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 auxiliary 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 = g_open (file, O_RDONLY, 0); + + 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 ((guint) 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 ("--valist-marshallers", argv[i]) == 0) + { + gen_valist = 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, " --valist-marshallers Generate va_list marshallers\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.in b/gobject/glib-mkenums.in new file mode 100755 index 0000000..b776e1f --- /dev/null +++ b/gobject/glib-mkenums.in @@ -0,0 +1,565 @@ +#! @PERL_PATH@ + +use warnings; +use File::Basename; +use Safe; + +# 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 +my $sandbox = Safe->new; # sandbox for safe evaluation of expressions + +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 =~ /< Identifier prefix\n"; + print " --symbol-prefix Symbol prefix\n"; + print " --fhead 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 " \@valuenum\@ the integer value (limited support, Since: 2.26)\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 $idprefix = ""; # "G", "Gtk", etc +my $symprefix = ""; # "g", "gtk", etc, if not just lc($idprefix) +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 +my $comment_tmpl = ""; # comment template + +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'}; + + # default to C-style comments + $comment_tmpl = "/* \@comment\@ */" if $comment_tmpl eq ""; +} + +if (!defined $ARGV[0]) { + usage; +} +while ($_=$ARGV[0],/^-/) { + shift; + last if /^--$/; + if (/^--template$/) { read_template_file (shift); } + elsif (/^--identifier-prefix$/) { $idprefix = shift } + elsif (/^--symbol-prefix$/) { $symprefix = 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; + + # ignore forward declarations + next if /^\s*typedef\s+enum.*;/; + + 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 (eof) { + die "Hit end of file while parsing enum in $ARGV"; + } + 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 = $_->[2]; + 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,$num,$nick) = @{$entry}; + if (!defined $nick) { + ($nick = $name) =~ s/^$enum_prefix//; + $nick =~ tr/_/-/; + $nick = lc($nick); + @{$entry} = ($name, $num, $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$//; + } elsif (!$symprefix && !$idprefix) { + # 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; + } + } else { + $enumshort = $enumname; + if ($idprefix) { + $enumshort =~ s/^${idprefix}//; + } else { + $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 = $symprefix && uc($symprefix) || uc($idprefix); + + $enumlong = $enumname_prefix . "_" . $enumshort; + $enumsym = lc($enumlong); + } + + 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; + my $next_num = 0; + + $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,$num,$nick) = @{$_}; + my $tmp_prod = $prod; + + if ($prod =~ /\@valuenum\@/) { + # only attempt to eval the value if it is requested + # this prevents us from throwing errors otherwise + if (defined $num) { + # use sandboxed perl evaluation as a reasonable + # approximation to C constant folding + $num = $sandbox->reval ($num); + + # make sure it parsed to an integer + if (!defined $num or $num !~ /^-?\d+$/) { + die "Unable to parse enum value '$num'"; + } + } else { + $num = $next_num; + } + + $tmp_prod =~ s/\@valuenum\@/$num/g; + $next_num = $num + 1; + } + + $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/glib-types.h b/gobject/glib-types.h new file mode 100644 index 0000000..663d790 --- /dev/null +++ b/gobject/glib-types.h @@ -0,0 +1,338 @@ +/* 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. + */ +#ifndef __GLIB_TYPES_H__ +#define __GLIB_TYPES_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) && !defined(GLIB_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/* A hack necesssary to preprocess this file with g-ir-scanner */ +#ifdef __GI_SCANNER__ +typedef gsize GType; +#endif + +/* --- GLib boxed types --- */ +/** + * 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_MATCH_INFO: + * + * The #GType for a boxed type holding a #GMatchInfo reference. + * + * Since: 2.30 + */ +#define G_TYPE_MATCH_INFO (g_match_info_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_BYTES: + * + * The #GType for #GBytes. + * + * Since: 2.32 + */ +#define G_TYPE_BYTES (g_bytes_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_ERROR: + * + * The #GType for a boxed type holding a #GError. + * + * Since: 2.26 + */ +#define G_TYPE_ERROR (g_error_get_type ()) + +/** + * G_TYPE_DATE_TIME: + * + * The #GType for a boxed type holding a #GDateTime. + * + * Since: 2.26 + */ +#define G_TYPE_DATE_TIME (g_date_time_get_type ()) + +/** + * G_TYPE_TIME_ZONE: + * + * The #GType for a boxed type holding a #GTimeZone. + * + * Since: 2.34 + */ +#define G_TYPE_TIME_ZONE (g_time_zone_get_type ()) + +/** + * 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_TYPE_VARIANT_BUILDER: + * + * The #GType for a boxed type holding a #GVariantBuilder. + * + * Since: 2.30 + */ +#define G_TYPE_VARIANT_BUILDER (g_variant_builder_get_type ()) + +/** + * G_TYPE_MAIN_LOOP: + * + * The #GType for a boxed type holding a #GMainLoop. + * + * Since: 2.30 + */ +#define G_TYPE_MAIN_LOOP (g_main_loop_get_type ()) + +/** + * G_TYPE_MAIN_CONTEXT: + * + * The #GType for a boxed type holding a #GMainContext. + * + * Since: 2.30 + */ +#define G_TYPE_MAIN_CONTEXT (g_main_context_get_type ()) + +/** + * G_TYPE_SOURCE: + * + * The #GType for a boxed type holding a #GSource. + * + * Since: 2.30 + */ +#define G_TYPE_SOURCE (g_source_get_type ()) + +/** + * G_TYPE_POLLFD: + * + * The #GType for a boxed type holding a #GPollFD. + * + * Since: 2.36 + */ +#define G_TYPE_POLLFD (g_pollfd_get_type ()) + +/** + * G_TYPE_MARKUP_PARSE_CONTEXT: + * + * The #GType for a boxed type holding a #GMarkupParseContext. + * + * Since: 2.36 + */ +#define G_TYPE_MARKUP_PARSE_CONTEXT (g_markup_parse_context_get_type ()) + +/** + * G_TYPE_KEY_FILE: + * + * The #GType for a boxed type holding a #GKeyFile. + * + * Since: 2.32 + */ +#define G_TYPE_KEY_FILE (g_key_file_get_type ()) + +/** + * G_TYPE_THREAD: + * + * The #GType for a boxed type holding a #GThread. + * + * Since: 2.36 + */ +#define G_TYPE_THREAD (g_thread_get_type ()) + +/** + * G_TYPE_CHECKSUM: + * + * The #GType for a boxed type holding a #GChecksum. + * + * Since: 2.36 + */ +#define G_TYPE_CHECKSUM (g_checksum_get_type ()) + +GLIB_AVAILABLE_IN_ALL +GType g_date_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_strv_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_gstring_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_hash_table_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_array_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_byte_array_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_ptr_array_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_bytes_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_variant_type_get_gtype (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_regex_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_30 +GType g_match_info_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_error_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_date_time_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_time_zone_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_io_channel_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_io_condition_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_variant_builder_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +GType g_key_file_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_30 +GType g_main_loop_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_30 +GType g_main_context_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_30 +GType g_source_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_36 +GType g_pollfd_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_36 +GType g_thread_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_36 +GType g_checksum_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_36 +GType g_markup_parse_context_get_type (void) G_GNUC_CONST; + +GLIB_DEPRECATED_FOR('G_TYPE_VARIANT') +GType g_variant_get_gtype (void) G_GNUC_CONST; + +/** + * GStrv: + * + * A C representable type name for #G_TYPE_STRV. + */ +typedef gchar** GStrv; + +G_END_DECLS + +#endif /* __GLIB_TYPES_H__ */ diff --git a/gobject/gmarshal.c b/gobject/gmarshal.c new file mode 100644 index 0000000..883ab72 --- /dev/null +++ b/gobject/gmarshal.c @@ -0,0 +1,1750 @@ + +#include "config.h" + +#include "gobject.h" +#include "genums.h" +#include "gboxed.h" +#include "gvaluetypes.h" + +#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_schar (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) +#define g_marshal_value_peek_variant(v) g_value_get_variant (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 +#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +/* VOID:VOID (./gmarshal.list:6) */ +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 +g_cclosure_marshal_VOID__VOIDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__VOID) (gpointer instance, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__VOID callback; + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__VOID) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + data2); +} + + +/* VOID:BOOLEAN (./gmarshal.list:7) */ +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 +g_cclosure_marshal_VOID__BOOLEANv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__BOOLEAN) (gpointer instance, + gboolean arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__BOOLEAN callback; + gboolean arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gboolean) va_arg (args_copy, gboolean); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOOLEAN) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:CHAR (./gmarshal.list:8) */ +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 +g_cclosure_marshal_VOID__CHARv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__CHAR) (gpointer instance, + gchar arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__CHAR callback; + gchar arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gchar) va_arg (args_copy, gint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__CHAR) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:UCHAR (./gmarshal.list:9) */ +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 +g_cclosure_marshal_VOID__UCHARv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__UCHAR) (gpointer instance, + guchar arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__UCHAR callback; + guchar arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (guchar) va_arg (args_copy, guint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UCHAR) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:INT (./gmarshal.list:10) */ +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 +g_cclosure_marshal_VOID__INTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__INT) (gpointer instance, + gint arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__INT callback; + gint arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gint) va_arg (args_copy, gint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:UINT (./gmarshal.list:11) */ +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 +g_cclosure_marshal_VOID__UINTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__UINT) (gpointer instance, + guint arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__UINT callback; + guint arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (guint) va_arg (args_copy, guint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:LONG (./gmarshal.list:12) */ +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 +g_cclosure_marshal_VOID__LONGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__LONG) (gpointer instance, + glong arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__LONG callback; + glong arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (glong) va_arg (args_copy, glong); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__LONG) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:ULONG (./gmarshal.list:13) */ +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 +g_cclosure_marshal_VOID__ULONGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__ULONG) (gpointer instance, + gulong arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__ULONG callback; + gulong arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gulong) va_arg (args_copy, gulong); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__ULONG) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:ENUM (./gmarshal.list:14) */ +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 +g_cclosure_marshal_VOID__ENUMv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__ENUM) (gpointer instance, + gint arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__ENUM callback; + gint arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gint) va_arg (args_copy, gint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__ENUM) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:FLAGS (./gmarshal.list:15) */ +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 +g_cclosure_marshal_VOID__FLAGSv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__FLAGS) (gpointer instance, + guint arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__FLAGS callback; + guint arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (guint) va_arg (args_copy, guint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__FLAGS) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:FLOAT (./gmarshal.list:16) */ +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 +g_cclosure_marshal_VOID__FLOATv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__FLOAT) (gpointer instance, + gfloat arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__FLOAT callback; + gfloat arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gfloat) va_arg (args_copy, gdouble); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__FLOAT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:DOUBLE (./gmarshal.list:17) */ +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 +g_cclosure_marshal_VOID__DOUBLEv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__DOUBLE) (gpointer instance, + gdouble arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__DOUBLE callback; + gdouble arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gdouble) va_arg (args_copy, gdouble); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__DOUBLE) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:STRING (./gmarshal.list:18) */ +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 +g_cclosure_marshal_VOID__STRINGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__STRING) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__STRING callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + arg0 = g_strdup (arg0); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__STRING) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + g_free (arg0); +} + + +/* VOID:PARAM (./gmarshal.list:19) */ +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 +g_cclosure_marshal_VOID__PARAMv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__PARAM) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__PARAM callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + arg0 = g_param_spec_ref (arg0); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__PARAM) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + g_param_spec_unref (arg0); +} + + +/* VOID:BOXED (./gmarshal.list:20) */ +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 +g_cclosure_marshal_VOID__BOXEDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__BOXED) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__BOXED callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + arg0 = g_boxed_copy (param_types[0] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg0); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + g_boxed_free (param_types[0] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg0); +} + + +/* VOID:POINTER (./gmarshal.list:21) */ +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 +g_cclosure_marshal_VOID__POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__POINTER) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__POINTER callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); +} + + +/* VOID:OBJECT (./gmarshal.list:22) */ +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 +g_cclosure_marshal_VOID__OBJECTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__OBJECT) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__OBJECT callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if (arg0 != NULL) + arg0 = g_object_ref (arg0); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__OBJECT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); + if (arg0 != NULL) + g_object_unref (arg0); +} + + +/* VOID:VARIANT (./gmarshal.list:23) */ +void +g_cclosure_marshal_VOID__VARIANT (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__VARIANT) (gpointer data1, + gpointer arg_1, + gpointer data2); + register GMarshalFunc_VOID__VARIANT 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__VARIANT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_variant (param_values + 1), + data2); +} +void +g_cclosure_marshal_VOID__VARIANTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__VARIANT) (gpointer instance, + gpointer arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__VARIANT callback; + gpointer arg0; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + arg0 = g_variant_ref_sink (arg0); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__VARIANT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + data2); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + g_variant_unref (arg0); +} + + +/* VOID:UINT,POINTER (./gmarshal.list:26) */ +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); +} +void +g_cclosure_marshal_VOID__UINT_POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef void (*GMarshalFunc_VOID__UINT_POINTER) (gpointer instance, + guint arg_0, + gpointer arg_1, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_VOID__UINT_POINTER callback; + guint arg0; + gpointer arg1; + va_list args_copy; + + G_VA_COPY (args_copy, args); + arg0 = (guint) va_arg (args_copy, guint); + arg1 = (gpointer) va_arg (args_copy, gpointer); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__UINT_POINTER) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + arg0, + arg1, + data2); +} + + +/* BOOL:FLAGS (./gmarshal.list:27) */ +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); +} +void +g_cclosure_marshal_BOOLEAN__FLAGSv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__FLAGS) (gpointer instance, + guint arg_0, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_BOOLEAN__FLAGS callback; + guint arg0; + va_list args_copy; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + + G_VA_COPY (args_copy, args); + arg0 = (guint) va_arg (args_copy, guint); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__FLAGS) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + arg0, + data2); + + g_value_set_boolean (return_value, v_return); +} + + +/* STRING:OBJECT,POINTER (./gmarshal.list:28) */ +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); +} +void +g_cclosure_marshal_STRING__OBJECT_POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef gchar* (*GMarshalFunc_STRING__OBJECT_POINTER) (gpointer instance, + gpointer arg_0, + gpointer arg_1, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_STRING__OBJECT_POINTER callback; + gpointer arg0; + gpointer arg1; + va_list args_copy; + gchar* v_return; + + g_return_if_fail (return_value != NULL); + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if (arg0 != NULL) + arg0 = g_object_ref (arg0); + arg1 = (gpointer) va_arg (args_copy, gpointer); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_STRING__OBJECT_POINTER) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + arg0, + arg1, + data2); + if (arg0 != NULL) + g_object_unref (arg0); + + g_value_take_string (return_value, v_return); +} + + +/* BOOL:BOXED,BOXED (./gmarshal.list:29) */ +void +g_cclosure_marshal_BOOLEAN__BOXED_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 gboolean (*GMarshalFunc_BOOLEAN__BOXED_BOXED) (gpointer data1, + gpointer arg_1, + gpointer arg_2, + gpointer data2); + register GMarshalFunc_BOOLEAN__BOXED_BOXED 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 == 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_BOOLEAN__BOXED_BOXED) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_boxed (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), + data2); + + g_value_set_boolean (return_value, v_return); +} +void +g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__BOXED_BOXED) (gpointer instance, + gpointer arg_0, + gpointer arg_1, + gpointer data); + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + GMarshalFunc_BOOLEAN__BOXED_BOXED callback; + gpointer arg0; + gpointer arg1; + va_list args_copy; + gboolean v_return; + + g_return_if_fail (return_value != NULL); + + G_VA_COPY (args_copy, args); + arg0 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + arg0 = g_boxed_copy (param_types[0] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg0); + arg1 = (gpointer) va_arg (args_copy, gpointer); + if ((param_types[1] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg1 != NULL) + arg1 = g_boxed_copy (param_types[1] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg1); + va_end (args_copy); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = instance; + } + else + { + data1 = instance; + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__BOXED_BOXED) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + arg0, + arg1, + data2); + if ((param_types[0] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg0 != NULL) + g_boxed_free (param_types[0] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg0); + if ((param_types[1] & G_SIGNAL_TYPE_STATIC_SCOPE) == 0 && arg1 != NULL) + g_boxed_free (param_types[1] & ~G_SIGNAL_TYPE_STATIC_SCOPE, arg1); + + g_value_set_boolean (return_value, v_return); +} + + diff --git a/gobject/gmarshal.h b/gobject/gmarshal.h new file mode 100644 index 0000000..d4fd76a --- /dev/null +++ b/gobject/gmarshal.h @@ -0,0 +1,385 @@ +/* Note: This file is no longer generated. See the comment in gmarshal.list */ +#ifndef __G_MARSHAL_H__ +#define __G_MARSHAL_H__ + +G_BEGIN_DECLS + +/* VOID:VOID (./gmarshal.list:6) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__VOIDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:BOOLEAN (./gmarshal.list:7) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__BOOLEANv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:CHAR (./gmarshal.list:8) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__CHARv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:UCHAR (./gmarshal.list:9) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__UCHARv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:INT (./gmarshal.list:10) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__INTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:UINT (./gmarshal.list:11) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__UINTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:LONG (./gmarshal.list:12) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__LONGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:ULONG (./gmarshal.list:13) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__ULONGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:ENUM (./gmarshal.list:14) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__ENUMv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:FLAGS (./gmarshal.list:15) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__FLAGSv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:FLOAT (./gmarshal.list:16) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__FLOATv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:DOUBLE (./gmarshal.list:17) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__DOUBLEv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:STRING (./gmarshal.list:18) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__STRINGv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:PARAM (./gmarshal.list:19) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__PARAMv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:BOXED (./gmarshal.list:20) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__BOXEDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:POINTER (./gmarshal.list:21) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:OBJECT (./gmarshal.list:22) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__OBJECTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:VARIANT (./gmarshal.list:23) */ +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__VARIANT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__VARIANTv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* VOID:UINT,POINTER (./gmarshal.list:26) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_VOID__UINT_POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* BOOL:FLAGS (./gmarshal.list:27) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_BOOLEAN__FLAGSv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); +#define g_cclosure_marshal_BOOL__FLAGS g_cclosure_marshal_BOOLEAN__FLAGS + +/* STRING:OBJECT,POINTER (./gmarshal.list:28) */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_STRING__OBJECT_POINTERv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); + +/* BOOL:BOXED,BOXED (./gmarshal.list:29) */ +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_BOOLEAN__BOXED_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +GLIB_AVAILABLE_IN_ALL +void g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv (GClosure *closure, + GValue *return_value, + gpointer instance, + va_list args, + gpointer marshal_data, + int n_params, + GType *param_types); +#define g_cclosure_marshal_BOOL__BOXED_BOXED g_cclosure_marshal_BOOLEAN__BOXED_BOXED + +G_END_DECLS + +#endif /* __G_MARSHAL_H__ */ diff --git a/gobject/gmarshal.list b/gobject/gmarshal.list new file mode 100644 index 0000000..4a5ddf5 --- /dev/null +++ b/gobject/gmarshal.list @@ -0,0 +1,32 @@ +# Note: This file used to generate gmarshal.[ch], but it doesn't any +# longer; it is kept mainly for backward compatibility purposes. If +# you find yourself in the need to add a marshaller in GObject, use +# g_cclosure_marshal_generic() instead. +# +# Warning: The generated symbols are part of the GObject ABI. + +# 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 +VOID:VARIANT + +# GRuntime specific marshallers +VOID:UINT,POINTER +BOOL:FLAGS +STRING:OBJECT,POINTER +BOOL:BOXED,BOXED diff --git a/gobject/gobject-query.c b/gobject/gobject-query.c new file mode 100644 index 0000000..179acb6 --- /dev/null +++ b/gobject/gobject-query.c @@ -0,0 +1,228 @@ +/* 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; + + 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..2674c23 --- /dev/null +++ b/gobject/gobject.c @@ -0,0 +1,4148 @@ +/* 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 "gobject.h" +#include "gtype-private.h" +#include "gvaluecollector.h" +#include "gsignal.h" +#include "gparamspecs.h" +#include "gvaluetypes.h" +#include "gobject_trace.h" +#include "gconstructor.h" + +/** + * SECTION:objects + * @title: GObject + * @short_description: The base object type + * @see_also: #GParamSpecObject, g_param_spec_object() + * + * 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) should not + * 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 achieve 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); + * else + * g_object_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_CUSTOM_CONSTRUCTED(class) \ + ((class)->constructed != g_object_constructed) + +#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_constructed (GObject *object); +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 guint object_floating_flag_handler (GObject *object, + gint job); + +static void object_interface_check_properties (gpointer func_data, + gpointer g_iface); + +/* --- typedefs --- */ +typedef struct _GObjectNotifyQueue GObjectNotifyQueue; + +struct _GObjectNotifyQueue +{ + GSList *pspecs; + guint16 n_pspecs; + guint16 freeze_count; +}; + +/* --- variables --- */ +G_LOCK_DEFINE_STATIC (closure_array_mutex); +G_LOCK_DEFINE_STATIC (weak_refs_mutex); +G_LOCK_DEFINE_STATIC (toggle_refs_mutex); +static GQuark quark_closure_array = 0; +static GQuark quark_weak_refs = 0; +static GQuark quark_toggle_refs = 0; +static GQuark quark_notify_queue; +static GParamSpecPool *pspec_pool = NULL; +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; +/* qdata pointing to GSList, protected by weak_locations_lock */ +static GQuark quark_weak_locations = 0; +static GRWLock weak_locations_lock; + +G_LOCK_DEFINE_STATIC(notify_lock); + +/* --- functions --- */ +static void +g_object_notify_queue_free (gpointer data) +{ + GObjectNotifyQueue *nqueue = data; + + g_slist_free (nqueue->pspecs); + g_slice_free (GObjectNotifyQueue, nqueue); +} + +static GObjectNotifyQueue* +g_object_notify_queue_freeze (GObject *object, + gboolean conditional) +{ + GObjectNotifyQueue *nqueue; + + G_LOCK(notify_lock); + nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); + if (!nqueue) + { + if (conditional) + { + G_UNLOCK(notify_lock); + return NULL; + } + + nqueue = g_slice_new0 (GObjectNotifyQueue); + g_datalist_id_set_data_full (&object->qdata, quark_notify_queue, + nqueue, g_object_notify_queue_free); + } + + if (nqueue->freeze_count >= 65535) + g_critical("Free queue for %s (%p) is larger than 65535," + " called g_object_freeze_notify() too often." + " Forgot to call g_object_thaw_notify() or infinite loop", + G_OBJECT_TYPE_NAME (object), object); + else + nqueue->freeze_count++; + G_UNLOCK(notify_lock); + + return nqueue; +} + +static void +g_object_notify_queue_thaw (GObject *object, + GObjectNotifyQueue *nqueue) +{ + GParamSpec *pspecs_mem[16], **pspecs, **free_me = NULL; + GSList *slist; + guint n_pspecs = 0; + + g_return_if_fail (nqueue->freeze_count > 0); + g_return_if_fail (g_atomic_int_get(&object->ref_count) > 0); + + G_LOCK(notify_lock); + + /* Just make sure we never get into some nasty race condition */ + if (G_UNLIKELY(nqueue->freeze_count == 0)) { + G_UNLOCK(notify_lock); + g_warning ("%s: property-changed notification for %s(%p) is not frozen", + G_STRFUNC, G_OBJECT_TYPE_NAME (object), object); + return; + } + + nqueue->freeze_count--; + if (nqueue->freeze_count) { + G_UNLOCK(notify_lock); + return; + } + + pspecs = nqueue->n_pspecs > 16 ? free_me = g_new (GParamSpec*, nqueue->n_pspecs) : pspecs_mem; + + for (slist = nqueue->pspecs; slist; slist = slist->next) + { + pspecs[n_pspecs++] = slist->data; + } + g_datalist_id_set_data (&object->qdata, quark_notify_queue, NULL); + + G_UNLOCK(notify_lock); + + if (n_pspecs) + G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs); + g_free (free_me); +} + +static void +g_object_notify_queue_add (GObject *object, + GObjectNotifyQueue *nqueue, + GParamSpec *pspec) +{ + G_LOCK(notify_lock); + + g_return_if_fail (nqueue->n_pspecs < 65535); + + if (g_slist_find (nqueue->pspecs, pspec) == NULL) + { + nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec); + nqueue->n_pspecs++; + } + + G_UNLOCK(notify_lock); +} + +#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); +} + +#ifdef G_HAS_CONSTRUCTORS +#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(debug_objects_atexit) +#endif +G_DEFINE_DESTRUCTOR(debug_objects_atexit) +#endif /* G_HAS_CONSTRUCTORS */ + +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, + }; + 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); +#ifndef G_HAS_CONSTRUCTORS + g_atexit (debug_objects_atexit); +#endif /* G_HAS_CONSTRUCTORS */ + } +#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_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_weak_locations = g_quark_from_static_string ("GObject-weak-locations"); + quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references"); + quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue"); + pspec_pool = g_param_spec_pool_new (TRUE); + + class->constructor = g_object_constructor; + class->constructed = g_object_constructed; + 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 inline 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_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; + + g_return_if_fail (pspec->flags & (G_PARAM_READABLE | G_PARAM_WRITABLE)); + 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 properties, 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_class_install_properties: + * @oclass: a #GObjectClass + * @n_pspecs: the length of the #GParamSpecs array + * @pspecs: (array length=n_pspecs): the #GParamSpecs array + * defining the new properties + * + * Installs new properties from an array of #GParamSpecs. This is + * usually done in the class initializer. + * + * The property id of each property is the index of each #GParamSpec in + * the @pspecs array. + * + * The property id of 0 is treated specially by #GObject and it should not + * be used to store a #GParamSpec. + * + * This function should be used if you plan to use a static array of + * #GParamSpecs and g_object_notify_by_pspec(). For instance, this + * class initialization: + * + * |[ + * enum { + * PROP_0, PROP_FOO, PROP_BAR, N_PROPERTIES + * }; + * + * static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + * + * static void + * my_object_class_init (MyObjectClass *klass) + * { + * GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + * + * obj_properties[PROP_FOO] = + * g_param_spec_int ("foo", "Foo", "Foo", + * -1, G_MAXINT, + * 0, + * G_PARAM_READWRITE); + * + * obj_properties[PROP_BAR] = + * g_param_spec_string ("bar", "Bar", "Bar", + * NULL, + * G_PARAM_READWRITE); + * + * gobject_class->set_property = my_object_set_property; + * gobject_class->get_property = my_object_get_property; + * g_object_class_install_properties (gobject_class, + * N_PROPERTIES, + * obj_properties); + * } + * ]| + * + * allows calling g_object_notify_by_pspec() to notify of property changes: + * + * |[ + * void + * my_object_set_foo (MyObject *self, gint foo) + * { + * if (self->foo != foo) + * { + * self->foo = foo; + * g_object_notify_by_pspec (G_OBJECT (self), obj_properties[PROP_FOO]); + * } + * } + * ]| + * + * Since: 2.26 + */ +void +g_object_class_install_properties (GObjectClass *oclass, + guint n_pspecs, + GParamSpec **pspecs) +{ + GType oclass_type, parent_type; + gint i; + + g_return_if_fail (G_IS_OBJECT_CLASS (oclass)); + g_return_if_fail (n_pspecs > 1); + g_return_if_fail (pspecs[0] == NULL); + + if (CLASS_HAS_DERIVED_CLASS (oclass)) + g_error ("Attempt to add properties to %s after it was derived", + G_OBJECT_CLASS_NAME (oclass)); + + oclass_type = G_OBJECT_CLASS_TYPE (oclass); + parent_type = g_type_parent (oclass_type); + + /* we skip the first element of the array as it would have a 0 prop_id */ + for (i = 1; i < n_pspecs; i++) + { + GParamSpec *pspec = pspecs[i]; + + g_return_if_fail (pspec != NULL); + + if (pspec->flags & G_PARAM_WRITABLE) + g_return_if_fail (oclass->set_property != NULL); + if (pspec->flags & G_PARAM_READABLE) + g_return_if_fail (oclass->get_property != NULL); + 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); + + oclass->flags |= CLASS_HAS_PROPS_FLAG; + install_property_internal (oclass_type, i, pspec); + + if (pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + oclass->construct_properties = g_slist_prepend (oclass->construct_properties, pspec); + + /* for property overrides of construct properties, we have to get rid + * of the overidden inherited construct property + */ + pspec = g_param_spec_pool_lookup (pspec_pool, pspec->name, parent_type, TRUE); + if (pspec && pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) + oclass->construct_properties = g_slist_remove (oclass->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 */ + + g_return_if_fail (pspec->flags & (G_PARAM_READABLE | G_PARAM_WRITABLE)); + 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 (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: (transfer none): 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: (transfer none): 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: (out): return location for the length of the returned array + * + * Get an array of #GParamSpec* for all properties of a class. + * + * Returns: (array length=n_properties) (transfer container): 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: (out): 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: (array length=n_properties_p) (transfer container): 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; + object->qdata = NULL; + + if (CLASS_HAS_PROPS (class)) + { + /* freeze object's notification queue, g_object_newv() preserves pairedness */ + g_object_notify_queue_freeze (object, FALSE); + } + + 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); + TRACE (GOBJECT_OBJECT_DISPOSE(object,G_TYPE_FROM_INSTANCE(object), 0)); + G_OBJECT_GET_CLASS (object)->dispose (object); + TRACE (GOBJECT_OBJECT_DISPOSE_END(object,G_TYPE_FROM_INSTANCE(object), 0)); + 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. Duplicate notifications are squashed so that at most one + * #GObject::notify signal is emitted for each property modified while the + * object is frozen. + * + * 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, FALSE); + g_object_unref (object); +} + +static GParamSpec * +get_notify_pspec (GParamSpec *pspec) +{ + GParamSpec *redirected; + + /* we don't notify on non-READABLE parameters */ + if (~pspec->flags & G_PARAM_READABLE) + return NULL; + + /* if the paramspec is redirected, notify on the target */ + redirected = g_param_spec_get_redirect_target (pspec); + if (redirected != NULL) + return redirected; + + /* else, notify normally */ + return pspec; +} + +static inline void +g_object_notify_by_spec_internal (GObject *object, + GParamSpec *pspec) +{ + GParamSpec *notify_pspec; + + notify_pspec = get_notify_pspec (pspec); + + if (notify_pspec != NULL) + { + GObjectNotifyQueue *nqueue; + + /* conditional freeze: only increase freeze count if already frozen */ + nqueue = g_object_notify_queue_freeze (object, TRUE); + + if (nqueue != NULL) + { + /* we're frozen, so add to the queue and release our freeze */ + g_object_notify_queue_add (object, nqueue, notify_pspec); + g_object_notify_queue_thaw (object, nqueue); + } + else + /* not frozen, so just dispatch the notification directly */ + G_OBJECT_GET_CLASS (object) + ->dispatch_properties_changed (object, 1, ¬ify_pspec); + } +} + +/** + * 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. + * + * When possible, eg. when signaling a property change from within the class + * that registered the property, you should use g_object_notify_by_pspec() + * instead. + */ +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 + g_object_notify_by_spec_internal (object, pspec); + g_object_unref (object); +} + +/** + * g_object_notify_by_pspec: + * @object: a #GObject + * @pspec: the #GParamSpec of a property installed on the class of @object. + * + * Emits a "notify" signal for the property specified by @pspec on @object. + * + * This function omits the property name lookup, hence it is faster than + * g_object_notify(). + * + * One way to avoid using g_object_notify() from within the + * class that registered the properties, and using g_object_notify_by_pspec() + * instead, is to store the GParamSpec used with + * g_object_class_install_property() inside a static array, e.g.: + * + *|[ + * enum + * { + * PROP_0, + * PROP_FOO, + * PROP_LAST + * }; + * + * static GParamSpec *properties[PROP_LAST]; + * + * static void + * my_object_class_init (MyObjectClass *klass) + * { + * properties[PROP_FOO] = g_param_spec_int ("foo", "Foo", "The foo", + * 0, 100, + * 50, + * G_PARAM_READWRITE); + * g_object_class_install_property (gobject_class, + * PROP_FOO, + * properties[PROP_FOO]); + * } + * ]| + * + * and then notify a change on the "foo" property with: + * + * |[ + * g_object_notify_by_pspec (self, properties[PROP_FOO]); + * ]| + * + * Since: 2.26 + */ +void +g_object_notify_by_pspec (GObject *object, + GParamSpec *pspec) +{ + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + + g_object_ref (object); + g_object_notify_by_spec_internal (object, pspec); + 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, queued "notify" signals are emitted. + * + * Duplicate notifications for each property are squashed so that at most one + * #GObject::notify signal is emitted for each property. + * + * 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); + + /* FIXME: Freezing is the only way to get at the notify queue. + * So we freeze once and then thaw twice. + */ + nqueue = g_object_notify_queue_freeze (object, FALSE); + g_object_notify_queue_thaw (object, nqueue); + 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; + + if (class == NULL) + { + g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype", + g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type)); + return; + } + + 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 = G_VALUE_INIT; + GObjectClass *class = g_type_class_peek (pspec->owner_type); + guint param_id = PARAM_SPEC_PARAM_ID (pspec); + GParamSpec *redirect; + static const gchar * enable_diagnostic = NULL; + + if (class == NULL) + { + g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype", + g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type)); + return; + } + + redirect = g_param_spec_get_redirect_target (pspec); + if (redirect) + pspec = redirect; + + if (G_UNLIKELY (!enable_diagnostic)) + { + enable_diagnostic = g_getenv ("G_ENABLE_DIAGNOSTIC"); + if (!enable_diagnostic) + enable_diagnostic = "0"; + } + + if (enable_diagnostic[0] == '1') + { + if (pspec->flags & G_PARAM_DEPRECATED) + g_warning ("The property %s:%s is deprecated and shouldn't be used " + "anymore. It will be removed in a future version.", + G_OBJECT_TYPE_NAME (object), pspec->name); + } + + /* 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 + { + GParamSpec *notify_pspec; + + class->set_property (object, param_id, &tmp_value, pspec); + + notify_pspec = get_notify_pspec (pspec); + + if (notify_pspec != NULL) + g_object_notify_queue_add (object, nqueue, notify_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; + GType iface_type = iface_class->g_type; + GParamSpec **pspecs; + guint n; + + class = g_type_class_ref (iface_class->g_instance_type); + + 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; + } + + /* We do a number of checks on the properties of an interface to + * make sure that all classes implementing the interface are + * overriding the properties in a sane way. + * + * We do the checks in order of importance so that we can give + * more useful error messages first. + * + * First, we check that the implementation doesn't remove the + * basic functionality (readability, writability) advertised by + * the interface. Next, we check that it doesn't introduce + * additional restrictions (such as construct-only). Finally, we + * make sure the types are compatible. + */ + +#define SUBSET(a,b,mask) (((a) & ~(b) & (mask)) == 0) + /* If the property on the interface is readable then the + * implementation must be readable. If the interface is writable + * then the implementation must be writable. + */ + if (!SUBSET (pspecs[n]->flags, class_pspec->flags, G_PARAM_READABLE | G_PARAM_WRITABLE)) + { + g_critical ("Flags for property '%s' on class '%s' remove functionality compared with the " + "property on interface '%s'\n", pspecs[n]->name, + g_type_name (G_OBJECT_CLASS_TYPE (class)), g_type_name (iface_type)); + continue; + } + + /* If the property on the interface is writable then we need to + * make sure the implementation doesn't introduce new restrictions + * on that writability (ie: construct-only). + * + * If the interface was not writable to begin with then we don't + * really have any problems here because "writable at construct + * type only" is still more permissive than "read only". + */ + if (pspecs[n]->flags & G_PARAM_WRITABLE) + { + if (!SUBSET (class_pspec->flags, pspecs[n]->flags, G_PARAM_CONSTRUCT_ONLY)) + { + g_critical ("Flags for property '%s' on class '%s' introduce additional restrictions on " + "writability compared with the property on interface '%s'\n", pspecs[n]->name, + g_type_name (G_OBJECT_CLASS_TYPE (class)), g_type_name (iface_type)); + continue; + } + } +#undef SUBSET + + /* If the property on the interface is readable then we are + * effectively advertising that reading the property will return a + * value of a specific type. All implementations of the interface + * need to return items of this type -- but may be more + * restrictive. For example, it is legal to have: + * + * GtkWidget *get_item(); + * + * that is implemented by a function that always returns a + * GtkEntry. In short: readability implies that the + * implementation value type must be equal or more restrictive. + * + * Similarly, if the property on the interface is writable then + * must be able to accept the property being set to any value of + * that type, including subclasses. In this case, we may also be + * less restrictive. For example, it is legal to have: + * + * set_item (GtkEntry *); + * + * that is implemented by a function that will actually work with + * any GtkWidget. In short: writability implies that the + * implementation value type must be equal or less restrictive. + * + * In the case that the property is both readable and writable + * then the only way that both of the above can be satisfied is + * with a type that is exactly equal. + */ + switch (pspecs[n]->flags & (G_PARAM_READABLE | G_PARAM_WRITABLE)) + { + case G_PARAM_READABLE | G_PARAM_WRITABLE: + /* class pspec value type must have exact equality with interface */ + if (pspecs[n]->value_type != class_pspec->value_type) + g_critical ("Read/writable property '%s' on class '%s' has type '%s' which is not exactly equal to the " + "type '%s' of the property on the 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)); + break; + + case G_PARAM_READABLE: + /* class pspec value type equal or more restrictive than interface */ + if (!g_type_is_a (class_pspec->value_type, pspecs[n]->value_type)) + g_critical ("Read-only property '%s' on class '%s' has type '%s' which is not equal to or more " + "restrictive than the type '%s' of the property on the 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)); + break; + + case G_PARAM_WRITABLE: + /* class pspec value type equal or less restrictive than interface */ + if (!g_type_is_a (pspecs[n]->value_type, class_pspec->value_type)) + g_critical ("Write-only property '%s' on class '%s' has type '%s' which is not equal to or less " + "restrictive than the type '%s' of the property on the 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)); + break; + + default: + g_assert_not_reached (); + } + } + + g_free (pspecs); + + g_type_class_unref (class); +} + +GType +g_object_get_type (void) +{ + return G_TYPE_OBJECT; +} + +/** + * g_object_new: (skip) + * @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: (transfer full): 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: (array length=n_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. + * + * Rename to: g_object_new + * Returns: (type GObject.Object) (transfer full): 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, FALSE); + if (newly_constructed) + g_object_notify_queue_thaw (object, nqueue); + } + + /* run 'constructed' handler if there is a custom one */ + if (newly_constructed && CLASS_HAS_CUSTOM_CONSTRUCTED (class)) + 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: (skip) + * @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); + memset (params + n_params, 0, 16 * (sizeof *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, FALSE); + + /* 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; +} + +static void +g_object_constructed (GObject *object) +{ + /* empty default impl to allow unconditional upchaining */ +} + +/** + * g_object_set_valist: (skip) + * @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, FALSE); + + name = first_property_name; + while (name) + { + GValue value = G_VALUE_INIT; + 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: (skip) + * @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 = G_VALUE_INIT; + 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: (skip) + * @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: (skip) + * @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, FALSE); + + 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. @value must have been initialized to the + * expected type of the property (or a type to which the expected type can be + * transformed) using g_value_init(). + * + * 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 = G_VALUE_INIT; + + /* 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: (skip) + * @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: (transfer none): @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); + + if (strncmp (signal_spec, "signal::", 8) == 0) + 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) + 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) + 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) + 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) + 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) + 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) + 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) + 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: (skip) + * @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: (skip) + * @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). + * + * Note that the weak references created by this method are not + * thread-safe: they cannot safely be used in one thread if the + * object's last g_object_unref() might happen in another thread. + * Use #GWeakRef if thread-safety is required. + */ +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); + + G_LOCK (weak_refs_mutex); + 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_UNLOCK (weak_refs_mutex); +} + +/** + * g_object_weak_unref: (skip) + * @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); + + G_LOCK (weak_refs_mutex); + 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; + } + } + G_UNLOCK (weak_refs_mutex); + if (!found_one) + g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data); +} + +/** + * g_object_add_weak_pointer: (skip) + * @object: The object that should be weak referenced. + * @weak_pointer_location: (inout): 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. + * + * Note that as with g_object_weak_ref(), the weak references created by + * this method are not thread-safe: they cannot safely be used in one + * thread if the object's last g_object_unref() might happen in another + * thread. Use #GWeakRef if thread-safety is required. + */ +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: (skip) + * @object: The object that is weak referenced. + * @weak_pointer_location: (inout): 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: (type GObject.Object): a #GObject + * + * Checks whether @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: (type GObject.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: (type GObject.Object) (transfer none): @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 seldom 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) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count >= 1); + + 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, *tstackptr; + + G_LOCK (toggle_refs_mutex); + tstackptr = g_datalist_id_get_data (&object->qdata, quark_toggle_refs); + tstack = *tstackptr; + G_UNLOCK (toggle_refs_mutex); + + /* 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: (skip) + * @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_add_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); + + G_LOCK (toggle_refs_mutex); + 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_UNLOCK (toggle_refs_mutex); +} + +/** + * g_object_remove_toggle_ref: (skip) + * @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); + + G_LOCK (toggle_refs_mutex); + 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); + + break; + } + } + G_UNLOCK (toggle_refs_mutex); + + if (found_one) + g_object_unref (object); + else + g_warning ("%s: couldn't find toggle ref %p(%p)", G_STRFUNC, notify, data); +} + +/** + * g_object_ref: + * @object: (type GObject.Object): a #GObject + * + * Increases the reference count of @object. + * + * Returns: (type GObject.Object) (transfer none): 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_add (&object->ref_count, 1); + + if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object)) + toggle_refs_notify (object, FALSE); + + TRACE (GOBJECT_OBJECT_REF(object,G_TYPE_FROM_INSTANCE(object),old_val)); + + return object; +} + +/** + * g_object_unref: + * @object: (type GObject.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; + + 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; + + TRACE (GOBJECT_OBJECT_UNREF(object,G_TYPE_FROM_INSTANCE(object),old_ref)); + + /* 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 + { + GSList **weak_locations; + + /* The only way that this object can live at this point is if + * there are outstanding weak references already established + * before we got here. + * + * If there were not already weak references then no more can be + * established at this time, because the other thread would have + * to hold a strong ref in order to call + * g_object_add_weak_pointer() and then we wouldn't be here. + */ + weak_locations = g_datalist_id_get_data (&object->qdata, quark_weak_locations); + + if (weak_locations != NULL) + { + g_rw_lock_writer_lock (&weak_locations_lock); + + /* It is possible that one of the weak references beat us to + * the lock. Make sure the refcount is still what we expected + * it to be. + */ + old_ref = g_atomic_int_get (&object->ref_count); + if (old_ref != 1) + { + g_rw_lock_writer_unlock (&weak_locations_lock); + goto retry_atomic_decrement1; + } + + /* We got the lock first, so the object will definitely die + * now. Clear out all the weak references. + */ + while (*weak_locations) + { + GWeakRef *weak_ref_location = (*weak_locations)->data; + + weak_ref_location->priv.p = NULL; + *weak_locations = g_slist_delete_link (*weak_locations, *weak_locations); + } + + g_rw_lock_writer_unlock (&weak_locations_lock); + } + + /* we are about to remove the last reference */ + TRACE (GOBJECT_OBJECT_DISPOSE(object,G_TYPE_FROM_INSTANCE(object), 1)); + G_OBJECT_GET_CLASS (object)->dispose (object); + TRACE (GOBJECT_OBJECT_DISPOSE_END(object,G_TYPE_FROM_INSTANCE(object), 1)); + + /* 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; + + TRACE (GOBJECT_OBJECT_UNREF(object,G_TYPE_FROM_INSTANCE(object),old_ref)); + + /* 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 */ + old_ref = g_atomic_int_add (&object->ref_count, -1); + + TRACE (GOBJECT_OBJECT_UNREF(object,G_TYPE_FROM_INSTANCE(object),old_ref)); + + /* may have been re-referenced meanwhile */ + if (G_LIKELY (old_ref == 1)) + { + TRACE (GOBJECT_OBJECT_FINALIZE(object,G_TYPE_FROM_INSTANCE(object))); + G_OBJECT_GET_CLASS (object)->finalize (object); + + TRACE (GOBJECT_OBJECT_FINALIZE_END(object,G_TYPE_FROM_INSTANCE(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_clear_object: (skip) + * @object_ptr: a pointer to a #GObject reference + * + * Clears a reference to a #GObject. + * + * @object_ptr must not be %NULL. + * + * If the reference is %NULL then this function does nothing. + * Otherwise, the reference count of the object is decreased and the + * pointer is set to %NULL. + * + * This function is threadsafe and modifies the pointer atomically, + * using memory barriers where needed. + * + * A macro is also included that allows this function to be used without + * pointer casts. + * + * Since: 2.28 + **/ +#undef g_clear_object +void +g_clear_object (volatile GObject **object_ptr) +{ + g_clear_pointer (object_ptr, g_object_unref); +} + +/** + * 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: (transfer none): 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: (skip) + * @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_dup_qdata: + * @object: the #GObject to store user data on + * @quark: a #GQuark, naming the user data pointer + * @dup_func: (allow-none): function to dup the value + * @user_data: (allow-none): passed as user_data to @dup_func + * + * This is a variant of g_object_get_qdata() which returns + * a 'duplicate' of the value. @dup_func defines the + * meaning of 'duplicate' in this context, it could e.g. + * take a reference on a ref-counted object. + * + * If the @quark is not set on the object then @dup_func + * will be called with a %NULL argument. + * + * Note that @dup_func is called while user data of @object + * is locked. + * + * This function can be useful to avoid races when multiple + * threads are using object data on the same key on the same + * object. + * + * Returns: the result of calling @dup_func on the value + * associated with @quark on @object, or %NULL if not set. + * If @dup_func is %NULL, the value is returned + * unmodified. + * + * Since: 2.34 + */ +gpointer +g_object_dup_qdata (GObject *object, + GQuark quark, + GDuplicateFunc dup_func, + gpointer user_data) +{ + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (quark > 0, NULL); + + return g_datalist_id_dup_data (&object->qdata, quark, dup_func, user_data); +} + +/** + * g_object_replace_qdata: + * @object: the #GObject to store user data on + * @quark: a #GQuark, naming the user data pointer + * @oldval: (allow-none): the old value to compare against + * @newval: (allow-none): the new value + * @destroy: (allow-none): a destroy notify for the new value + * @old_destroy: (allow-none): destroy notify for the existing value + * + * Compares the user data for the key @quark on @object with + * @oldval, and if they are the same, replaces @oldval with + * @newval. + * + * This is like a typical atomic compare-and-exchange + * operation, for user data on an object. + * + * If the previous value was replaced then ownership of the + * old value (@oldval) is passed to the caller, including + * the registred destroy notify for it (passed out in @old_destroy). + * Its up to the caller to free this as he wishes, which may + * or may not include using @old_destroy as sometimes replacement + * should not destroy the object in the normal way. + * + * Return: %TRUE if the existing value for @quark was replaced + * by @newval, %FALSE otherwise. + * + * Since: 2.34 + */ +gboolean +g_object_replace_qdata (GObject *object, + GQuark quark, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy) +{ + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + g_return_val_if_fail (quark > 0, FALSE); + + return g_datalist_id_replace_data (&object->qdata, quark, + oldval, newval, destroy, + old_destroy); +} + +/** + * g_object_set_qdata_full: (skip) + * @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: (transfer full): 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: (transfer none): the data if found, or %NULL if no such data exists. + */ +gpointer +g_object_get_data (GObject *object, + const gchar *key) +{ + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (key != NULL, NULL); + + return g_datalist_get_data (&object->qdata, key); +} + +/** + * 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_dup_data: + * @object: the #GObject to store user data on + * @key: a string, naming the user data pointer + * @dup_func: (allow-none): function to dup the value + * @user_data: (allow-none): passed as user_data to @dup_func + * + * This is a variant of g_object_get_data() which returns + * a 'duplicate' of the value. @dup_func defines the + * meaning of 'duplicate' in this context, it could e.g. + * take a reference on a ref-counted object. + * + * If the @key is not set on the object then @dup_func + * will be called with a %NULL argument. + * + * Note that @dup_func is called while user data of @object + * is locked. + * + * This function can be useful to avoid races when multiple + * threads are using object data on the same key on the same + * object. + * + * Returns: the result of calling @dup_func on the value + * associated with @key on @object, or %NULL if not set. + * If @dup_func is %NULL, the value is returned + * unmodified. + * + * Since: 2.34 + */ +gpointer +g_object_dup_data (GObject *object, + const gchar *key, + GDuplicateFunc dup_func, + gpointer user_data) +{ + g_return_val_if_fail (G_IS_OBJECT (object), NULL); + g_return_val_if_fail (key != NULL, NULL); + + return g_datalist_id_dup_data (&object->qdata, + g_quark_from_string (key), + dup_func, user_data); +} + +/** + * g_object_replace_data: + * @object: the #GObject to store user data on + * @key: a string, naming the user data pointer + * @oldval: (allow-none): the old value to compare against + * @newval: (allow-none): the new value + * @destroy: (allow-none): a destroy notify for the new value + * @old_destroy: (allow-none): destroy notify for the existing value + * + * Compares the user data for the key @key on @object with + * @oldval, and if they are the same, replaces @oldval with + * @newval. + * + * This is like a typical atomic compare-and-exchange + * operation, for user data on an object. + * + * If the previous value was replaced then ownership of the + * old value (@oldval) is passed to the caller, including + * the registred destroy notify for it (passed out in @old_destroy). + * Its up to the caller to free this as he wishes, which may + * or may not include using @old_destroy as sometimes replacement + * should not destroy the object in the normal way. + * + * Return: %TRUE if the existing value for @key was replaced + * by @newval, %FALSE otherwise. + * + * Since: 2.34 + */ +gboolean +g_object_replace_data (GObject *object, + const gchar *key, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy) +{ + g_return_val_if_fail (G_IS_OBJECT (object), FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + return g_datalist_id_replace_data (&object->qdata, + g_quark_from_string (key), + oldval, newval, destroy, + old_destroy); +} + +/** + * g_object_set_data_full: (skip) + * @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: (transfer full): 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: (type GObject.Object) (allow-none): 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: (skip) + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * @v_object: (allow-none): 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: (skip) + * @value: a valid #GValue of %G_TYPE_OBJECT derived type + * @v_object: (allow-none): 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: (type GObject.Object) (transfer none): 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. If the contents of the #GValue are %NULL, then + * %NULL will be returned. + * + * Returns: (type GObject.Object) (transfer full): 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: (skip) + * @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 #GConnectFlags. + * + * 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. + * + * When the object is destroyed the signal handler will be automatically + * disconnected. Note that this is not currently threadsafe (ie: + * emitting a signal while @gobject is being destroyed in another thread + * is not safe). + * + * 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; + guint i; + + G_LOCK (closure_array_mutex); + carray = g_object_get_qdata (object, quark_closure_array); + 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]; + G_UNLOCK (closure_array_mutex); + return; + } + G_UNLOCK (closure_array_mutex); + 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); + G_LOCK (closure_array_mutex); + 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_UNLOCK (closure_array_mutex); +} + +/** + * 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: (transfer full): 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: (skip) + * @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: (skip) + * @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) +{ +} + +/** + * GWeakRef: + * + * A structure containing a weak reference to a #GObject. It can either + * be empty (i.e. point to %NULL), or point to an object for as long as + * at least one "strong" reference to that object exists. Before the + * object's #GObjectClass.dispose method is called, every #GWeakRef + * associated with becomes empty (i.e. points to %NULL). + * + * Like #GValue, #GWeakRef can be statically allocated, stack- or + * heap-allocated, or embedded in larger structures. + * + * Unlike g_object_weak_ref() and g_object_add_weak_pointer(), this weak + * reference is thread-safe: converting a weak pointer to a reference is + * atomic with respect to invalidation of weak pointers to destroyed + * objects. + * + * If the object's #GObjectClass.dispose method results in additional + * references to the object being held, any #GWeakRefs taken + * before it was disposed will continue to point to %NULL. If + * #GWeakRefs are taken after the object is disposed and + * re-referenced, they will continue to point to it until its refcount + * goes back to zero, at which point they too will be invalidated. + */ + +/** + * g_weak_ref_init: (skip) + * @weak_ref: (inout): uninitialized or empty location for a weak + * reference + * @object: (allow-none): a #GObject or %NULL + * + * Initialise a non-statically-allocated #GWeakRef. + * + * This function also calls g_weak_ref_set() with @object on the + * freshly-initialised weak reference. + * + * This function should always be matched with a call to + * g_weak_ref_clear(). It is not necessary to use this function for a + * #GWeakRef in static storage because it will already be + * properly initialised. Just use g_weak_ref_set() directly. + * + * Since: 2.32 + */ +void +g_weak_ref_init (GWeakRef *weak_ref, + gpointer object) +{ + weak_ref->priv.p = NULL; + + g_weak_ref_set (weak_ref, object); +} + +/** + * g_weak_ref_clear: (skip) + * @weak_ref: (inout): location of a weak reference, which + * may be empty + * + * Frees resources associated with a non-statically-allocated #GWeakRef. + * After this call, the #GWeakRef is left in an undefined state. + * + * You should only call this on a #GWeakRef that previously had + * g_weak_ref_init() called on it. + * + * Since: 2.32 + */ +void +g_weak_ref_clear (GWeakRef *weak_ref) +{ + g_weak_ref_set (weak_ref, NULL); + + /* be unkind */ + weak_ref->priv.p = (void *) 0xccccccccu; +} + +/** + * g_weak_ref_get: (skip) + * @weak_ref: (inout): location of a weak reference to a #GObject + * + * If @weak_ref is not empty, atomically acquire a strong + * reference to the object it points to, and return that reference. + * + * This function is needed because of the potential race between taking + * the pointer value and g_object_ref() on it, if the object was losing + * its last reference at the same time in a different thread. + * + * The caller should release the resulting reference in the usual way, + * by using g_object_unref(). + * + * Returns: (transfer full) (type GObject.Object): the object pointed to + * by @weak_ref, or %NULL if it was empty + * + * Since: 2.32 + */ +gpointer +g_weak_ref_get (GWeakRef *weak_ref) +{ + gpointer object_or_null; + + g_return_val_if_fail (weak_ref!= NULL, NULL); + + g_rw_lock_reader_lock (&weak_locations_lock); + + object_or_null = weak_ref->priv.p; + + if (object_or_null != NULL) + g_object_ref (object_or_null); + + g_rw_lock_reader_unlock (&weak_locations_lock); + + return object_or_null; +} + +/** + * g_weak_ref_set: (skip) + * @weak_ref: location for a weak reference + * @object: (allow-none): a #GObject or %NULL + * + * Change the object to which @weak_ref points, or set it to + * %NULL. + * + * You must own a strong reference on @object while calling this + * function. + * + * Since: 2.32 + */ +void +g_weak_ref_set (GWeakRef *weak_ref, + gpointer object) +{ + GSList **weak_locations; + GObject *new_object; + GObject *old_object; + + g_return_if_fail (weak_ref != NULL); + g_return_if_fail (object == NULL || G_IS_OBJECT (object)); + + new_object = object; + + g_rw_lock_writer_lock (&weak_locations_lock); + + /* We use the extra level of indirection here so that if we have ever + * had a weak pointer installed at any point in time on this object, + * we can see that there is a non-NULL value associated with the + * weak-pointer quark and know that this value will not change at any + * point in the object's lifetime. + * + * Both properties are important for reducing the amount of times we + * need to acquire locks and for decreasing the duration of time the + * lock is held while avoiding some rather tricky races. + * + * Specifically: we can avoid having to do an extra unconditional lock + * in g_object_unref() without worrying about some extremely tricky + * races. + */ + + old_object = weak_ref->priv.p; + if (new_object != old_object) + { + weak_ref->priv.p = new_object; + + /* Remove the weak ref from the old object */ + if (old_object != NULL) + { + weak_locations = g_datalist_id_get_data (&old_object->qdata, quark_weak_locations); + /* for it to point to an object, the object must have had it added once */ + g_assert (weak_locations != NULL); + + *weak_locations = g_slist_remove (*weak_locations, weak_ref); + } + + /* Add the weak ref to the new object */ + if (new_object != NULL) + { + weak_locations = g_datalist_id_get_data (&new_object->qdata, quark_weak_locations); + + if (weak_locations == NULL) + { + weak_locations = g_new0 (GSList *, 1); + g_datalist_id_set_data_full (&new_object->qdata, quark_weak_locations, weak_locations, g_free); + } + + *weak_locations = g_slist_prepend (*weak_locations, weak_ref); + } + } + + g_rw_lock_writer_unlock (&weak_locations_lock); +} diff --git a/gobject/gobject.h b/gobject/gobject.h new file mode 100644 index 0000000..2c58f72 --- /dev/null +++ b/gobject/gobject.h @@ -0,0 +1,669 @@ +/* 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_H__ +#define __G_OBJECT_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#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 address 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 >*/ + /* seldom 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); + /* seldom 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 --- */ +GLIB_AVAILABLE_IN_ALL +GType g_initially_unowned_get_type (void); +GLIB_AVAILABLE_IN_ALL +void g_object_class_install_property (GObjectClass *oclass, + guint property_id, + GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_object_class_find_property (GObjectClass *oclass, + const gchar *property_name); +GLIB_AVAILABLE_IN_ALL +GParamSpec**g_object_class_list_properties (GObjectClass *oclass, + guint *n_properties); +GLIB_AVAILABLE_IN_ALL +void g_object_class_override_property (GObjectClass *oclass, + guint property_id, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +void g_object_class_install_properties (GObjectClass *oclass, + guint n_pspecs, + GParamSpec **pspecs); + +GLIB_AVAILABLE_IN_ALL +void g_object_interface_install_property (gpointer g_iface, + GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_object_interface_find_property (gpointer g_iface, + const gchar *property_name); +GLIB_AVAILABLE_IN_ALL +GParamSpec**g_object_interface_list_properties (gpointer g_iface, + guint *n_properties_p); + +GLIB_AVAILABLE_IN_ALL +GType g_object_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gpointer g_object_new (GType object_type, + const gchar *first_property_name, + ...); +GLIB_AVAILABLE_IN_ALL +gpointer g_object_newv (GType object_type, + guint n_parameters, + GParameter *parameters); +GLIB_AVAILABLE_IN_ALL +GObject* g_object_new_valist (GType object_type, + const gchar *first_property_name, + va_list var_args); +GLIB_AVAILABLE_IN_ALL +void g_object_set (gpointer object, + const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +void g_object_get (gpointer object, + const gchar *first_property_name, + ...) G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +gpointer g_object_connect (gpointer object, + const gchar *signal_spec, + ...) G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +void g_object_disconnect (gpointer object, + const gchar *signal_spec, + ...) G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_ALL +void g_object_set_valist (GObject *object, + const gchar *first_property_name, + va_list var_args); +GLIB_AVAILABLE_IN_ALL +void g_object_get_valist (GObject *object, + const gchar *first_property_name, + va_list var_args); +GLIB_AVAILABLE_IN_ALL +void g_object_set_property (GObject *object, + const gchar *property_name, + const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_object_get_property (GObject *object, + const gchar *property_name, + GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_object_freeze_notify (GObject *object); +GLIB_AVAILABLE_IN_ALL +void g_object_notify (GObject *object, + const gchar *property_name); +GLIB_AVAILABLE_IN_ALL +void g_object_notify_by_pspec (GObject *object, + GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +void g_object_thaw_notify (GObject *object); +GLIB_AVAILABLE_IN_ALL +gboolean g_object_is_floating (gpointer object); +GLIB_AVAILABLE_IN_ALL +gpointer g_object_ref_sink (gpointer object); +GLIB_AVAILABLE_IN_ALL +gpointer g_object_ref (gpointer object); +GLIB_AVAILABLE_IN_ALL +void g_object_unref (gpointer object); +GLIB_AVAILABLE_IN_ALL +void g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_object_add_weak_pointer (GObject *object, + gpointer *weak_pointer_location); +GLIB_AVAILABLE_IN_ALL +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); + +GLIB_AVAILABLE_IN_ALL +void g_object_add_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_object_remove_toggle_ref (GObject *object, + GToggleNotify notify, + gpointer data); + +GLIB_AVAILABLE_IN_ALL +gpointer g_object_get_qdata (GObject *object, + GQuark quark); +GLIB_AVAILABLE_IN_ALL +void g_object_set_qdata (GObject *object, + GQuark quark, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_object_set_qdata_full (GObject *object, + GQuark quark, + gpointer data, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_ALL +gpointer g_object_steal_qdata (GObject *object, + GQuark quark); + +GLIB_AVAILABLE_IN_2_34 +gpointer g_object_dup_qdata (GObject *object, + GQuark quark, + GDuplicateFunc dup_func, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +gboolean g_object_replace_qdata (GObject *object, + GQuark quark, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy); + +GLIB_AVAILABLE_IN_ALL +gpointer g_object_get_data (GObject *object, + const gchar *key); +GLIB_AVAILABLE_IN_ALL +void g_object_set_data (GObject *object, + const gchar *key, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_object_set_data_full (GObject *object, + const gchar *key, + gpointer data, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_ALL +gpointer g_object_steal_data (GObject *object, + const gchar *key); + +GLIB_AVAILABLE_IN_2_34 +gpointer g_object_dup_data (GObject *object, + const gchar *key, + GDuplicateFunc dup_func, + gpointer user_data); +GLIB_AVAILABLE_IN_2_34 +gboolean g_object_replace_data (GObject *object, + const gchar *key, + gpointer oldval, + gpointer newval, + GDestroyNotify destroy, + GDestroyNotify *old_destroy); + + +GLIB_AVAILABLE_IN_ALL +void g_object_watch_closure (GObject *object, + GClosure *closure); +GLIB_AVAILABLE_IN_ALL +GClosure* g_cclosure_new_object (GCallback callback_func, + GObject *object); +GLIB_AVAILABLE_IN_ALL +GClosure* g_cclosure_new_object_swap (GCallback callback_func, + GObject *object); +GLIB_AVAILABLE_IN_ALL +GClosure* g_closure_new_object (guint sizeof_closure, + GObject *object); +GLIB_AVAILABLE_IN_ALL +void g_value_set_object (GValue *value, + gpointer v_object); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_get_object (const GValue *value); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_dup_object (const GValue *value); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_connect_object (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer gobject, + GConnectFlags connect_flags); + +/*< protected >*/ +GLIB_AVAILABLE_IN_ALL +void g_object_force_floating (GObject *object); +GLIB_AVAILABLE_IN_ALL +void g_object_run_dispose (GObject *object); + + +GLIB_AVAILABLE_IN_ALL +void g_value_take_object (GValue *value, + gpointer v_object); +GLIB_DEPRECATED_FOR(g_value_take_object) +void g_value_set_object_take_ownership (GValue *value, + gpointer v_object); + +GLIB_DEPRECATED +gsize g_object_compat_control (gsize what, + gpointer data); + +/* --- implementation macros --- */ +#define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \ +G_STMT_START { \ + GObject *_glib__object = (GObject*) (object); \ + GParamSpec *_glib__pspec = (GParamSpec*) (pspec); \ + guint _glib__property_id = (property_id); \ + g_warning ("%s: invalid %s id %u for \"%s\" of type `%s' in `%s'", \ + G_STRLOC, \ + (pname), \ + _glib__property_id, \ + _glib__pspec->name, \ + g_type_name (G_PARAM_SPEC_TYPE (_glib__pspec)), \ + G_OBJECT_TYPE_NAME (_glib__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)) + +GLIB_AVAILABLE_IN_ALL +void g_clear_object (volatile GObject **object_ptr); +#define g_clear_object(object_ptr) g_clear_pointer ((object_ptr), g_object_unref) + +typedef struct { + /**/ + union { gpointer p; } priv; +} GWeakRef; + +GLIB_AVAILABLE_IN_ALL +void g_weak_ref_init (GWeakRef *weak_ref, + gpointer object); +GLIB_AVAILABLE_IN_ALL +void g_weak_ref_clear (GWeakRef *weak_ref); +GLIB_AVAILABLE_IN_ALL +gpointer g_weak_ref_get (GWeakRef *weak_ref); +GLIB_AVAILABLE_IN_ALL +void g_weak_ref_set (GWeakRef *weak_ref, + gpointer object); + +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..a453d3d --- /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-2011 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.stp.in b/gobject/gobject.stp.in new file mode 100644 index 0000000..edcdb50 --- /dev/null +++ b/gobject/gobject.stp.in @@ -0,0 +1,199 @@ +global gtypes +global gtypenames +global gsignalnames + +/* These are needed to keep track of gtype and signal names for the below + * probes. + */ +probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("type__new") +{ + gtypes[pid(),user_string($arg1)] = $arg3; + gtypenames[pid(),$arg3] = user_string($arg1); +} +probe process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__new") +{ + gsignalnames[pid(),$arg1] = user_string($arg2); +} + +/** + * probe gobject.type_new - Called when any entity registered with the #GType system is created + * @name: String name of type + * @parent_gtype: The parent #GType of this type + * @gtype: The #GType for this type + */ +probe gobject.type_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("type__new") +{ + name = user_string($arg1); + parent_gtype = $arg2; + gtype = $arg3; + probestr = sprintf("gobject.type_new(%s, %d) -> %d", name, parent_gtype, gtype); +} + +/** + * probe gobject.object_new - Called when a #GObject is created + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + */ +probe gobject.object_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__new") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),$arg2]; + probestr = sprintf("gobject.object_new(%s) -> %p", type, object); +} + +/** + * probe gobject.object_ref - Called when a new reference is added to a #GObject + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + * @old_refcount: Original value of the reference count + * @refcount: New value of the reference count + */ +probe gobject.object_ref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__ref") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),gtype]; + old_refcount = $arg3; + refcount = old_refcount+1; + probestr = sprintf("gobject.object_ref(%p[%s]) -> %d", object, type, refcount); +} + +/** + * probe gobject.object_unref - Called when a reference is removed from a #GObject + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + * @old_refcount: Original value of the reference count + */ +probe gobject.object_unref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__unref") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),gtype]; + old_refcount = $arg3; + refcount = old_refcount-1; + probestr = sprintf("gobject.object_unref(%p [%s]) -> %d", object, type, refcount); +} + +/** + * probe gobject.object_dispose - Called when a g_object_dispose() run for a #GObject is initiated + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + * @last_unref: FIXME + */ +probe gobject.object_dispose = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__dispose") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),$arg2]; + last_unref = $arg3; + probestr = sprintf("gobject.object_dispose(%p[%s])", object, type); +} + +/** + * probe gobject.object_dispose_end - Called when a g_object_dispose() run for a #GObject is completed + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + * @last_unref: FIXME + */ +probe gobject.object_dispose_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__dispose__end") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),$arg2]; + last_unref = $arg3; + probestr = sprintf("gobject.object_dispose_end(%p[%s])", object, type); +} + +/** + * probe gobject.object_finalize - Called when finalization for a #GObject is started + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + */ +probe gobject.object_finalize = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__finalize") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),$arg2]; + probestr = sprintf("gobject.object_finalize(%p[%s])", object, type); +} + +/** + * probe gobject.object_finalize - Called when finalization for a #GObject is completed + * @object: Raw pointer to object + * @gtype: #GType for this object + * @type: String name of object type + */ +probe gobject.object_finalize_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__finalize__end") +{ + object = $arg1; + gtype = $arg2; + type = gtypenames[pid(),$arg2]; + probestr = sprintf("gobject.object_finalize_end(%p[%s])", object, type); +} + +/** + * probe gobject.signal_new - Called when a new signal is registered for a #GObject + * @gsignal: Integer value for this signal + * @name: String name for this signal + * @gtype: #GType for the type which will gain the new signal + * @type: String name of the type which will gain the new signal + */ +probe gobject.signal_new = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__new") +{ + gsignal = $arg1; + name = user_string($arg2); + gtype = $arg3; + type = gtypenames[pid(),$arg3]; + probestr = sprintf("gobject.signal_new(%s, %s) -> %d", name, type, gsignal); +} + +/** + * probe gobject.signal_emit - Called when a signal emission for a #GObject is started + * @gsignal: Integer value for this signal + * @detail: String containing signal "detail" + * @signal: String name of the signal + * @object: Raw pointer for object emitting signal + * @gtype: #GType for the type emitting the signal + * @type: String name of the type emitting the signal + */ +probe gobject.signal_emit = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__emit") +{ + gsignal = $arg1; + detail = $arg2; + signal = gsignalnames[pid(),$arg1]; + if (detail != 0) + signal = signal . "::" . gquarks[pid(), detail] + object = $arg3; + gtype = $arg4; + type = gtypenames[pid(),$arg4]; + probestr = sprintf("gobject.signal_emit(%p[%s], %s)", object, type, signal); +} + +/** + * probe gobject.signal_emit_end - Called when a signal emission for a #GObject is completed + * @gsignal: Integer value for this signal + * @detail: String containing signal "detail" + * @signal: String name of the signal + * @object: Raw pointer for object emitting signal + * @gtype: #GType for the type emitting the signal + * @type: String name of the type emitting the signal + */ +probe gobject.signal_emit_end = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("signal__emit__end") +{ + gsignal = $arg1; + detail = $arg2; + signal = gsignalnames[pid(),$arg1]; + if (detail != 0) + signal = signal . "::" . gquarks[pid(), detail] + object = $arg3; + gtype = $arg4; + type = gtypenames[pid(),$arg4]; + probestr = sprintf("gobject.signal_emit_end(%p[%s], %s)", object, type, signal); +} diff --git a/gobject/gobject_probes.d b/gobject/gobject_probes.d new file mode 100644 index 0000000..bddbfae --- /dev/null +++ b/gobject/gobject_probes.d @@ -0,0 +1,13 @@ +provider gobject { + probe type__new(char *, unsigned long, unsigned long); + probe object__new(void*, unsigned long); + probe object__ref(void*, unsigned long, unsigned int); + probe object__unref(void*, unsigned long, unsigned int); + probe object__dispose(void*, unsigned long, unsigned int); + probe object__dispose__end(void*, unsigned long, unsigned int); + probe object__finalize(void*, unsigned long); + probe object__finalize__end(void*, unsigned long); + probe signal__new(unsigned int, char *, unsigned long); + probe signal__emit(unsigned int, unsigned int, void *, unsigned long); + probe signal__emit__end(unsigned int, unsigned int, void *, unsigned long); +}; diff --git a/gobject/gobject_trace.h b/gobject/gobject_trace.h new file mode 100644 index 0000000..292a0e8 --- /dev/null +++ b/gobject/gobject_trace.h @@ -0,0 +1,43 @@ +/* GLIB - Library of useful routines for C programming + * + * Copyright (C) 2009,2010 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 __GOBJECTTRACE_H__ +#define __GOBJECTTRACE_H__ + +#ifndef SIZEOF_CHAR +#error "config.h must be included prior to gobject_trace.h" +#endif + +#ifdef HAVE_DTRACE + +/* include the generated probes header and put markers in code */ +#include "gobject_probes.h" +#define TRACE(probe) probe + +#else + +/* Wrap the probe to allow it to be removed when no systemtap available */ +#define TRACE(probe) + +#endif + +#endif /* __GOBJECTTRACE_H__ */ diff --git a/gobject/gobjectnotifyqueue.c b/gobject/gobjectnotifyqueue.c new file mode 100644 index 0000000..cfe01ba --- /dev/null +++ b/gobject/gobjectnotifyqueue.c @@ -0,0 +1,199 @@ +/* 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. + */ + +/* WARNING: + * + * This file is INSTALLED and other projects (outside of glib) + * #include its contents. + */ + +#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; +}; + +G_LOCK_DEFINE_STATIC(notify_lock); + +/* --- 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; + + G_LOCK(notify_lock); + 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); + } + + if (nqueue->freeze_count >= 65535) + g_critical("Free queue for %s (%p) is larger than 65535," + " called g_object_freeze_notify() too often." + " Forgot to call g_object_thaw_notify() or infinite loop", + G_OBJECT_TYPE_NAME (object), object); + else + nqueue->freeze_count++; + G_UNLOCK(notify_lock); + + 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); + g_return_if_fail (g_atomic_int_get(&object->ref_count) > 0); + + G_LOCK(notify_lock); + + /* Just make sure we never get into some nasty race condition */ + if (G_UNLIKELY(nqueue->freeze_count == 0)) { + G_UNLOCK(notify_lock); + g_warning ("%s: property-changed notification for %s(%p) is not frozen", + G_STRFUNC, G_OBJECT_TYPE_NAME (object), object); + return; + } + + nqueue->freeze_count--; + if (nqueue->freeze_count) { + G_UNLOCK(notify_lock); + return; + } + + pspecs = nqueue->n_pspecs > 16 ? free_me = g_new (GParamSpec*, nqueue->n_pspecs) : pspecs_mem; + + for (slist = nqueue->pspecs; slist; slist = slist->next) + { + pspecs[n_pspecs++] = slist->data; + } + g_datalist_id_set_data (&object->qdata, context->quark_notify_queue, NULL); + + G_UNLOCK(notify_lock); + + 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_LOCK(notify_lock); + + g_slist_free (nqueue->pspecs); + nqueue->pspecs = NULL; + nqueue->n_pspecs = 0; + + G_UNLOCK(notify_lock); +} + +static inline void +g_object_notify_queue_add (GObject *object, + GObjectNotifyQueue *nqueue, + GParamSpec *pspec) +{ + if (pspec->flags & G_PARAM_READABLE) + { + GParamSpec *redirect; + + G_LOCK(notify_lock); + + 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 */ + if (g_slist_find (nqueue->pspecs, pspec) == NULL) + { + nqueue->pspecs = g_slist_prepend (nqueue->pspecs, pspec); + nqueue->n_pspecs++; + } + + G_UNLOCK(notify_lock); + } +} + +/* NB: This function is not threadsafe, do not ever use it if + * you need a threadsafe notify queue. + * Use g_object_notify_queue_freeze() to acquire the queue and + * g_object_notify_queue_thaw() after you are done instead. + */ +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..b5c3024 --- /dev/null +++ b/gobject/gparam.c @@ -0,0 +1,1508 @@ +/* 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 "gtype-private.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))) + +/* --- 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 */ + }; + 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 registered as GParamSpec instead of GParam, for + * consistency sake, so that type name can be mapped to struct name, + * However, some language bindings, most noticeable 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_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_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: (skip) + * @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_atomic_int_inc ((int *)&pspec->ref_count); + + return pspec; +} + +/** + * g_param_spec_unref: (skip) + * @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)); + + 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) +{ + gsize oldvalue; + g_return_if_fail (G_IS_PARAM_SPEC (pspec)); + + oldvalue = g_atomic_pointer_and (&pspec->qdata, ~(gsize)PARAM_FLOATING_FLAG); + if (oldvalue & PARAM_FLOATING_FLAG) + g_param_spec_unref (pspec); +} + +/** + * g_param_spec_ref_sink: (skip) + * @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) +{ + gsize oldvalue; + g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); + + oldvalue = g_atomic_pointer_and (&pspec->qdata, ~(gsize)PARAM_FLOATING_FLAG); + if (!(oldvalue & PARAM_FLOATING_FLAG)) + g_param_spec_ref (pspec); + + return pspec; +} + +/** + * g_param_spec_get_name: + * @pspec: a valid #GParamSpec + * + * Get the name of a #GParamSpec. + * + * The name is always an "interned" string (as per g_intern_string()). + * This allows for pointer-value comparisons. + * + * Returns: the name of @pspec. + */ +const 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. + */ +const 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. + */ +const 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: (skip) + * @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 is not freed if (flags & G_PARAM_STATIC_NAME) */ + pspec->name = (gchar *) 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 + { + if (is_canonical (name)) + pspec->name = (gchar *) g_intern_string (name); + else + { + gchar *tmp = g_strdup (name); + canonicalize_key (tmp); + pspec->name = (gchar *) g_intern_string (tmp); + g_free (tmp); + } + } + + 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: (transfer none): 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: (skip) + * @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: (transfer none): 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: (transfer none): 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 = G_VALUE_INIT; + 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 = G_VALUE_INIT; + + 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 +{ + GMutex mutex; + 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: (transfer none): a newly allocated #GParamSpecPool. + */ +GParamSpecPool* +g_param_spec_pool_new (gboolean type_prefixing) +{ + static GMutex init_mutex; + GParamSpecPool *pool = g_new (GParamSpecPool, 1); + + memcpy (&pool->mutex, &init_mutex, sizeof (init_mutex)); + 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) +{ + const gchar *p; + + if (pool && pspec && owner_type > 0 && pspec->owner_type == 0) + { + 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); + return; + } + } + g_mutex_lock (&pool->mutex); + pspec->owner_type = owner_type; + g_param_spec_ref (pspec); + g_hash_table_insert (pool->hash_table, pspec, pspec); + g_mutex_unlock (&pool->mutex); + } + 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_mutex_lock (&pool->mutex); + 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_mutex_unlock (&pool->mutex); + } + 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)) + { + gchar *canonical; + + canonical = g_strdup (key.name); + canonicalize_key (canonical); + + /* try canonicalized form */ + key.name = canonical; + key.owner_type = owner_type; + + if (walk_ancestors) + do + { + pspec = g_hash_table_lookup (hash_table, &key); + if (pspec) + { + g_free (canonical); + 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 (canonical); + } + + 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: (transfer none): 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_mutex_lock (&pool->mutex); + + 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_mutex_unlock (&pool->mutex); + + 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_mutex_unlock (&pool->mutex); + + return NULL; + } + owner_type = type; + param_name += l + 2; + pspec = param_spec_ht_lookup (pool->hash_table, param_name, owner_type, walk_ancestors); + g_mutex_unlock (&pool->mutex); + + return pspec; + } + } + /* malformed param_name */ + + g_mutex_unlock (&pool->mutex); + + 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: (transfer container) (element-type GObject.ParamSpec): 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_mutex_lock (&pool->mutex); + data[0] = NULL; + data[1] = (gpointer) owner_type; + g_hash_table_foreach (pool->hash_table, pool_list, &data); + g_mutex_unlock (&pool->mutex); + + return data[0]; +} + +static gint +pspec_compare_id (gconstpointer a, + gconstpointer b) +{ + const GParamSpec *pspec1 = a, *pspec2 = b; + + if (pspec1->param_id < pspec2->param_id) + return -1; + + if (pspec1->param_id > pspec2->param_id) + return 1; + + return strcmp (pspec1->name, pspec2->name); +} + +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: (out): return location for the length of the returned array + * + * Gets an array of all #GParamSpecs owned by @owner_type in + * the pool. + * + * Returns: (array length=n_pspecs_p) (transfer container): 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_mutex_lock (&pool->mutex); + *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_mutex_unlock (&pool->mutex); + + return pspecs; +} + + +/* --- auxiliary 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: (allow-none): 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: (skip) + * @value: a valid #GValue of type %G_TYPE_PARAM + * @param: (allow-none): 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: (skip) + * @value: a valid #GValue of type %G_TYPE_PARAM + * @param: (allow-none): 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: (transfer none): #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: (skip) + * @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; +} diff --git a/gobject/gparam.h b/gobject/gparam.h new file mode 100644 index 0000000..ebdc91e --- /dev/null +++ b/gobject/gparam.h @@ -0,0 +1,443 @@ +/* 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 + */ +#ifndef __G_PARAM_H__ +#define __G_PARAM_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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 + * @G_PARAM_DEPRECATED: the parameter is deprecated and will be removed + * in a future version. A warning will be generated if it is used + * while running with G_ENABLE_DIAGNOSTIC=1. + * Since 2.26 + * + * 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, + /* User defined flags go up to 30 */ + G_PARAM_DEPRECATED = 1 << 31 +} 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. The maximum allowed is 30 + G_PARAM_USER_SHIFT. + */ +#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: always an interned string + * @flags: #GParamFlags flags for this parameter + * @value_type: the #GValue type for this parameter + * @owner_type: #GType type that uses (introduces) this parameter + * + * All other fields of the GParamSpec struct are private and + * should not be used directly. + */ +struct _GParamSpec +{ + GTypeInstance g_type_instance; + + const gchar *name; /* interned string */ + 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_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 /* auxiliary structure for _setv() variants */ +{ + const gchar *name; + GValue value; +}; + + +/* --- prototypes --- */ +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_ref (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_unref (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_sink (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_ref_sink (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +gpointer g_param_spec_get_qdata (GParamSpec *pspec, + GQuark quark); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_set_qdata (GParamSpec *pspec, + GQuark quark, + gpointer data); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_set_qdata_full (GParamSpec *pspec, + GQuark quark, + gpointer data, + GDestroyNotify destroy); +GLIB_AVAILABLE_IN_ALL +gpointer g_param_spec_steal_qdata (GParamSpec *pspec, + GQuark quark); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_get_redirect_target (GParamSpec *pspec); + +GLIB_AVAILABLE_IN_ALL +void g_param_value_set_default (GParamSpec *pspec, + GValue *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_param_value_defaults (GParamSpec *pspec, + GValue *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_param_value_validate (GParamSpec *pspec, + GValue *value); +GLIB_AVAILABLE_IN_ALL +gboolean g_param_value_convert (GParamSpec *pspec, + const GValue *src_value, + GValue *dest_value, + gboolean strict_validation); +GLIB_AVAILABLE_IN_ALL +gint g_param_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2); +GLIB_AVAILABLE_IN_ALL +const gchar * g_param_spec_get_name (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +const gchar * g_param_spec_get_nick (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +const gchar * g_param_spec_get_blurb (GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +void g_value_set_param (GValue *value, + GParamSpec *param); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_value_get_param (const GValue *value); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_value_dup_param (const GValue *value); + + +GLIB_AVAILABLE_IN_ALL +void g_value_take_param (GValue *value, + GParamSpec *param); +GLIB_DEPRECATED_FOR(g_value_take_param) +void g_value_set_param_take_ownership (GValue *value, + GParamSpec *param); + +/* --- 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_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); +}; +GLIB_AVAILABLE_IN_ALL +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 --- */ +GLIB_AVAILABLE_IN_ALL +gpointer g_param_spec_internal (GType param_type, + const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpecPool* g_param_spec_pool_new (gboolean type_prefixing); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_pool_insert (GParamSpecPool *pool, + GParamSpec *pspec, + GType owner_type); +GLIB_AVAILABLE_IN_ALL +void g_param_spec_pool_remove (GParamSpecPool *pool, + GParamSpec *pspec); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_pool_lookup (GParamSpecPool *pool, + const gchar *param_name, + GType owner_type, + gboolean walk_ancestors); +GLIB_AVAILABLE_IN_ALL +GList* g_param_spec_pool_list_owned (GParamSpecPool *pool, + GType owner_type); +GLIB_AVAILABLE_IN_ALL +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..fb5ce50 --- /dev/null +++ b/gobject/gparamspecs.c @@ -0,0 +1,2522 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * Copyright (C) 2010 Christian Persch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include "gparamspecs.h" +#include "gtype-private.h" +#include "gvaluecollector.h" + +#include "gvaluearray.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; +} + +static void +param_variant_init (GParamSpec *pspec) +{ + GParamSpecVariant *vspec = G_PARAM_SPEC_VARIANT (pspec); + + vspec->type = NULL; + vspec->default_value = NULL; +} + +static void +param_variant_finalize (GParamSpec *pspec) +{ + GParamSpecVariant *vspec = G_PARAM_SPEC_VARIANT (pspec); + GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_VARIANT)); + + if (vspec->default_value) + g_variant_unref (vspec->default_value); + g_variant_type_free (vspec->type); + + parent_class->finalize (pspec); +} + +static void +param_variant_set_default (GParamSpec *pspec, + GValue *value) +{ + value->data[0].v_pointer = G_PARAM_SPEC_VARIANT (pspec)->default_value; + value->data[1].v_uint |= G_VALUE_NOCOPY_CONTENTS; +} + +static gboolean +param_variant_validate (GParamSpec *pspec, + GValue *value) +{ + GParamSpecVariant *vspec = G_PARAM_SPEC_VARIANT (pspec); + GVariant *variant = value->data[0].v_pointer; + + if ((variant == NULL && vspec->default_value != NULL) || + (variant != NULL && !g_variant_is_of_type (variant, vspec->type))) + { + g_param_value_set_default (pspec, value); + return TRUE; + } + + return FALSE; +} + +static gint +param_variant_values_cmp (GParamSpec *pspec, + const GValue *value1, + const GValue *value2) +{ + GVariant *v1 = value1->data[0].v_pointer; + GVariant *v2 = value2->data[0].v_pointer; + + return v1 < v2 ? -1 : v2 > v1; +} + +/* --- type initialization --- */ +GType *g_param_spec_types = NULL; + +void +_g_param_spec_types_init (void) +{ + const guint n_types = 23; + 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_TYPE_PARAM_VARIANT + */ + { + const GParamSpecTypeInfo pspec_info = { + sizeof (GParamSpecVariant), /* instance_size */ + 0, /* n_preallocs */ + param_variant_init, /* instance_init */ + G_TYPE_VARIANT, /* value_type */ + param_variant_finalize, /* finalize */ + param_variant_set_default, /* value_set_default */ + param_variant_validate, /* value_validate */ + param_variant_values_cmp, /* values_cmp */ + }; + type = g_param_type_register_static (g_intern_static_string ("GParamVariant"), &pspec_info); + *spec_types++ = type; + g_assert (type == G_TYPE_PARAM_VARIANT); + } + + 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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: (transfer full): 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 #GParamSpecPointer instance specifying a pointer property. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: (transfer full): 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: (transfer full): 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: (skip) + * @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: (transfer full): 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: (skip) + * @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; +} + +/** + * g_param_spec_variant: + * @name: canonical name of the property specified + * @nick: nick name for the property specified + * @blurb: description of the property specified + * @type: a #GVariantType + * @default_value: (allow-none) (transfer full): a #GVariant of type @type to + * use as the default value, or %NULL + * @flags: flags for the property specified + * + * Creates a new #GParamSpecVariant instance specifying a #GVariant + * property. + * + * If @default_value is floating, it is consumed. + * + * See g_param_spec_internal() for details on property names. + * + * Returns: (transfer full): the newly created #GParamSpec + * + * Since: 2.26 + */ +GParamSpec* +g_param_spec_variant (const gchar *name, + const gchar *nick, + const gchar *blurb, + const GVariantType *type, + GVariant *default_value, + GParamFlags flags) +{ + GParamSpecVariant *vspec; + + g_return_val_if_fail (type != NULL, NULL); + g_return_val_if_fail (default_value == NULL || + g_variant_is_of_type (default_value, type), NULL); + + vspec = g_param_spec_internal (G_TYPE_PARAM_VARIANT, + name, + nick, + blurb, + flags); + + vspec->type = g_variant_type_copy (type); + if (default_value) + vspec->default_value = g_variant_ref_sink (default_value); + + return G_PARAM_SPEC (vspec); +} diff --git a/gobject/gparamspecs.h b/gobject/gparamspecs.h new file mode 100644 index 0000000..b3245a8 --- /dev/null +++ b/gobject/gparamspecs.h @@ -0,0 +1,1166 @@ +/* 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 + */ +#ifndef __G_PARAMSPECS_H__ +#define __G_PARAMSPECS_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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. + * + * Deprecated: 2.32: Use #GArray instead of #GValueArray + */ +#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. + * + * Deprecated: 2.32: Use #GArray instead of #GValueArray + */ +#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. + * + * Deprecated: 2.32: Use #GArray instead of #GValueArray + */ +#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)) + +/** + * G_TYPE_PARAM_VARIANT: + * + * The #GType of #GParamSpecVariant. + * + * Since: 2.26 + */ +#define G_TYPE_PARAM_VARIANT (g_param_spec_types[22]) +/** + * G_IS_PARAM_SPEC_VARIANT: + * @pspec: a #GParamSpec + * + * Checks whether the given #GParamSpec is of type %G_TYPE_PARAM_VARIANT. + * + * Returns: %TRUE on success + * + * Since: 2.26 + */ +#define G_IS_PARAM_SPEC_VARIANT(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_VARIANT)) +/** + * G_PARAM_SPEC_VARIANT: + * @pspec: a #GParamSpec + * + * Casts a #GParamSpec into a #GParamSpecVariant. + * + * Since: 2.26 + */ +#define G_PARAM_SPEC_VARIANT(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_VARIANT, GParamSpecVariant)) + +/* --- 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; +typedef struct _GParamSpecVariant GParamSpecVariant; + +/** + * 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; +}; +/** + * GParamSpecVariant: + * @parent_instance: private #GParamSpec portion + * @type: a #GVariantType, or %NULL + * @default_value: a #GVariant, or %NULL + * + * A #GParamSpec derived structure that contains the meta data for #GVariant properties. + * + * Since: 2.26 + */ +struct _GParamSpecVariant +{ + GParamSpec parent_instance; + GVariantType *type; + GVariant *default_value; + + /*< private >*/ + gpointer padding[4]; +}; + +/* --- GParamSpec prototypes --- */ +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_char (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint8 minimum, + gint8 maximum, + gint8 default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_uchar (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint8 minimum, + guint8 maximum, + guint8 default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_boolean (const gchar *name, + const gchar *nick, + const gchar *blurb, + gboolean default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_int (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint minimum, + gint maximum, + gint default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_uint (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint minimum, + guint maximum, + guint default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_long (const gchar *name, + const gchar *nick, + const gchar *blurb, + glong minimum, + glong maximum, + glong default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_ulong (const gchar *name, + const gchar *nick, + const gchar *blurb, + gulong minimum, + gulong maximum, + gulong default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_int64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + gint64 minimum, + gint64 maximum, + gint64 default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_uint64 (const gchar *name, + const gchar *nick, + const gchar *blurb, + guint64 minimum, + guint64 maximum, + guint64 default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_unichar (const gchar *name, + const gchar *nick, + const gchar *blurb, + gunichar default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_enum (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType enum_type, + gint default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_flags (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType flags_type, + guint default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_float (const gchar *name, + const gchar *nick, + const gchar *blurb, + gfloat minimum, + gfloat maximum, + gfloat default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_double (const gchar *name, + const gchar *nick, + const gchar *blurb, + gdouble minimum, + gdouble maximum, + gdouble default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_string (const gchar *name, + const gchar *nick, + const gchar *blurb, + const gchar *default_value, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_param (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType param_type, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_boxed (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType boxed_type, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_pointer (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_value_array (const gchar *name, + const gchar *nick, + const gchar *blurb, + GParamSpec *element_spec, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_object (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType object_type, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_override (const gchar *name, + GParamSpec *overridden); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_gtype (const gchar *name, + const gchar *nick, + const gchar *blurb, + GType is_a_type, + GParamFlags flags); +GLIB_AVAILABLE_IN_ALL +GParamSpec* g_param_spec_variant (const gchar *name, + const gchar *nick, + const gchar *blurb, + const GVariantType *type, + GVariant *default_value, + 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 _GLIB_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..cf3aacd --- /dev/null +++ b/gobject/gsignal.c @@ -0,0 +1,3824 @@ +/* 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 "gtype-private.h" +#include "gbsearcharray.h" +#include "gvaluecollector.h" +#include "gvaluetypes.h" +#include "gobject.h" +#include "genums.h" +#include "gobject_trace.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 COND_DEBUG(debug_type, cond) ((_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) || (cond)) +#define IF_DEBUG(debug_type, cond) if (COND_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, + GClosure *closure, + 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 void add_invalid_closure_notify (Handler *handler, + gpointer instance); +static void remove_invalid_closure_notify (Handler *handler, + gpointer instance); +static void invalid_closure_notify (gpointer data, + GClosure *closure); +static const gchar * type_debug_name (GType type); +static void node_check_deprecated (const SignalNode *node); +static void node_update_single_va_closure (SignalNode *node); + + +/* --- 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 flags : 9; + guint n_params : 8; + guint single_va_closure_is_valid : 1; + guint single_va_closure_is_after : 1; + 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; + GSignalCVaMarshaller va_marshaller; + GHookList *emission_hooks; + + GClosure *single_va_closure; +}; + +#define SINGLE_VA_CLOSURE_EMPTY_MAGIC GINT_TO_POINTER(1) /* indicates single_va_closure is valid but empty */ + +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; + guint has_invalid_closure_notify : 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, + GClosure *closure, + 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 (closure ? (handler->closure == closure) : (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 && + G_REAL_CLOSURE (handler->closure)->meta_marshal == NULL && + ((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 && + G_REAL_CLOSURE (handler->closure)->meta_marshal == NULL && + ((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; + handler->has_invalid_closure_notify = 0; + + 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 void +node_update_single_va_closure (SignalNode *node) +{ + GClosure *closure = NULL; + gboolean is_after = FALSE; + + /* Fast path single-handler without boxing the arguments in GValues */ + if (G_TYPE_IS_OBJECT (node->itype) && + (node->flags & (G_SIGNAL_MUST_COLLECT)) == 0 && + (node->emission_hooks == NULL || node->emission_hooks->hooks == NULL)) + { + GSignalFlags run_type; + ClassClosure * cc; + GBSearchArray *bsa = node->class_closure_bsa; + + if (bsa == NULL || bsa->n_nodes == 0) + closure = SINGLE_VA_CLOSURE_EMPTY_MAGIC; + else if (bsa->n_nodes == 1) + { + /* Look for default class closure (can't support non-default as it + chains up using GValues */ + cc = g_bsearch_array_get_nth (bsa, &g_class_closure_bconfig, 0); + if (cc->instance_type == 0) + { + run_type = node->flags & (G_SIGNAL_RUN_FIRST|G_SIGNAL_RUN_LAST|G_SIGNAL_RUN_CLEANUP); + /* Only support *one* of run-first or run-last, not multiple or cleanup */ + if (run_type == G_SIGNAL_RUN_FIRST || + run_type == G_SIGNAL_RUN_LAST) + { + closure = cc->closure; + is_after = (run_type == G_SIGNAL_RUN_LAST); + } + } + } + } + + node->single_va_closure_is_valid = TRUE; + node->single_va_closure = closure; + node->single_va_closure_is_after = is_after; +} + +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; + } + node->single_va_closure_is_valid = FALSE; + 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; + } + + node_check_deprecated (node); + + 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); + goto out; + } + 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); + + node->single_va_closure_is_valid = FALSE; + + out: + 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: (out): Location to store the signal id. + * @detail_p: (out): 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: (array length=n_ids): 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. + */ +const 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: (out caller-allocates): 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: (allow-none): the function to translate arrays of parameter + * values to signal emissions into C language callback invocations or %NULL. + * @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(). + * + * If c_marshaller is %NULL, g_cclosure_marshal_generic() will be used as + * the marshaller for this signal. + * + * 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); + + 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: (allow-none): the function to translate arrays of parameter + * values to signal emissions into C language callback invocations or %NULL. + * @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. + * + * If c_marshaller is %NULL @g_cclosure_marshal_generic will be used as + * the marshaller for this signal. + * + * 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; + + node->single_va_closure_is_valid = FALSE; + + 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); + if (node->va_marshaller) + _g_closure_set_va_marshal (closure, node->va_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: (allow-none): The closure to invoke on signal emission; + * may be %NULL + * @accumulator: (allow-none): the accumulator for this signal; may be %NULL + * @accu_data: user data for the @accumulator + * @c_marshaller: (allow-none): the function to translate arrays of + * parameter values to signal emissions into C language callback + * invocations or %NULL + * @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: (array length=n_params): 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. + * + * If c_marshaller is %NULL @g_cclosure_marshal_generic will be used as + * the marshaller for this signal. + * + * 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; + GSignalCMarshaller builtin_c_marshaller; + GSignalCVaMarshaller va_marshaller; + + 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); + + TRACE(GOBJECT_SIGNAL_NEW(signal_id, name, itype)); + } + node->destroyed = FALSE; + + /* setup reinitializable portion */ + node->single_va_closure_is_valid = FALSE; + 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; + + builtin_c_marshaller = NULL; + va_marshaller = NULL; + + /* Pick up built-in va marshallers for standard types, and + instead of generic marshaller if no marshaller specified */ + if (n_params == 0 && return_type == G_TYPE_NONE) + { + builtin_c_marshaller = g_cclosure_marshal_VOID__VOID; + va_marshaller = g_cclosure_marshal_VOID__VOIDv; + } + else if (n_params == 1 && return_type == G_TYPE_NONE) + { +#define ADD_CHECK(__type__) \ + else if (g_type_is_a (param_types[0] & ~G_SIGNAL_TYPE_STATIC_SCOPE, G_TYPE_ ##__type__)) \ + { \ + builtin_c_marshaller = g_cclosure_marshal_VOID__ ## __type__; \ + va_marshaller = g_cclosure_marshal_VOID__ ## __type__ ##v; \ + } + + if (0) {} + ADD_CHECK (BOOLEAN) + ADD_CHECK (CHAR) + ADD_CHECK (UCHAR) + ADD_CHECK (INT) + ADD_CHECK (UINT) + ADD_CHECK (LONG) + ADD_CHECK (ULONG) + ADD_CHECK (ENUM) + ADD_CHECK (FLAGS) + ADD_CHECK (FLOAT) + ADD_CHECK (DOUBLE) + ADD_CHECK (STRING) + ADD_CHECK (PARAM) + ADD_CHECK (BOXED) + ADD_CHECK (POINTER) + ADD_CHECK (OBJECT) + ADD_CHECK (VARIANT) + } + + if (c_marshaller == NULL) + { + if (builtin_c_marshaller) + c_marshaller = builtin_c_marshaller; + else + { + c_marshaller = g_cclosure_marshal_generic; + va_marshaller = g_cclosure_marshal_generic_va; + } + } + + node->c_marshaller = c_marshaller; + node->va_marshaller = va_marshaller; + node->emission_hooks = NULL; + if (class_closure) + signal_add_class_closure (node, 0, class_closure); + + SIGNAL_UNLOCK (); + + g_free (name); + + return signal_id; +} + +void +g_signal_set_va_marshaller (guint signal_id, + GType instance_type, + GSignalCVaMarshaller va_marshaller) +{ + SignalNode *node; + + g_return_if_fail (signal_id > 0); + g_return_if_fail (va_marshaller != NULL); + + SIGNAL_LOCK (); + node = LOOKUP_SIGNAL_NODE (signal_id); + if (node) + { + node->va_marshaller = va_marshaller; + if (node->class_closure_bsa) + { + ClassClosure *cc = g_bsearch_array_get_nth (node->class_closure_bsa, &g_class_closure_bconfig, 0); + if (cc->closure->marshal == node->c_marshaller) + _g_closure_set_va_marshal (cc->closure, va_marshaller); + } + + node->single_va_closure_is_valid = FALSE; + } + + SIGNAL_UNLOCK (); +} + + +/** + * 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: (allow-none): the function to translate arrays of parameter + * values to signal emissions into C language callback invocations or %NULL. + * @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. + * + * If c_marshaller is %NULL, g_cclosure_marshal_generic() will be used as + * the marshaller for this signal. + * + * 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->single_va_closure_is_valid = FALSE; + 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->va_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); + node_check_deprecated (node); + 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: (array) 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_alloca (sizeof (GValue) * (n_params + 1)); + memset (instance_and_params, 0, 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); + + 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 = G_VALUE_INIT; + 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 occurred + */ + } + } + + for (i = 0; i < n_params; i++) + g_value_unset (param_values + i); + g_value_unset (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: (transfer none): 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); + add_invalid_closure_notify (handler, instance); + handler_insert (signal_id, instance, handler); + if (node->c_marshaller && G_CLOSURE_NEEDS_MARSHAL (closure)) + { + g_closure_set_marshal (closure, node->c_marshaller); + if (node->va_marshaller) + _g_closure_set_va_marshal (closure, node->va_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); + add_invalid_closure_notify (handler, instance); + 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); + if (node->va_marshaller) + _g_closure_set_va_marshal (handler->closure, node->va_marshaller); + } + } + } + else + g_warning ("%s: signal `%s' is invalid for instance `%p'", G_STRLOC, detailed_signal, instance); + SIGNAL_UNLOCK (); + + return handler_seq_no; +} + +static void +node_check_deprecated (const SignalNode *node) +{ + static const gchar * g_enable_diagnostic = NULL; + + if (G_UNLIKELY (!g_enable_diagnostic)) + { + g_enable_diagnostic = g_getenv ("G_ENABLE_DIAGNOSTIC"); + if (!g_enable_diagnostic) + g_enable_diagnostic = "0"; + } + + if (g_enable_diagnostic[0] == '1') + { + if (node->flags & G_SIGNAL_DEPRECATED) + { + g_warning ("The signal %s::%s is deprecated and shouldn't be used " + "anymore. It will be removed in a future version.", + type_debug_name (node->itype), node->name); + } + } +} + +/** + * 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); + + node_check_deprecated (node); + + 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); + if (node->va_marshaller) + _g_closure_set_va_marshal (handler->closure, node->va_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, 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, 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, NULL, &signal_id); + if (handler) + { + handler->sequential_number = 0; + handler->block_count = 1; + remove_invalid_closure_notify (handler, instance); + 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, 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) + { + remove_invalid_closure_notify (tmp, instance); + 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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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; +} + +/** + * g_signal_emitv: + * @instance_and_params: (array): 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 (!node->single_va_closure_is_valid) + node_update_single_va_closure (node); + + if (node->single_va_closure != NULL && + (node->single_va_closure == SINGLE_VA_CLOSURE_EMPTY_MAGIC || + _g_closure_is_void (node->single_va_closure, instance)) +#ifdef G_ENABLE_DEBUG + && !COND_DEBUG (SIGNALS, g_trace_instance_signals != instance && + g_trap_instance_signals == instance) +#endif /* G_ENABLE_DEBUG */ + ) + { + HandlerList* hlist = handler_list_lookup (node->signal_id, instance); + if (hlist == NULL || hlist->handlers == NULL) + { + /* 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); +} + +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; +} + +/** + * 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 */ + + if (!node->single_va_closure_is_valid) + node_update_single_va_closure (node); + + if (node->single_va_closure != NULL +#ifdef G_ENABLE_DEBUG + && !COND_DEBUG (SIGNALS, g_trace_instance_signals != instance && + g_trap_instance_signals == instance) +#endif /* G_ENABLE_DEBUG */ + ) + { + HandlerList* hlist = handler_list_lookup (node->signal_id, instance); + Handler *l; + GClosure *closure = NULL; + gboolean fastpath = TRUE; + GSignalFlags run_type = G_SIGNAL_RUN_FIRST; + + if (node->single_va_closure != SINGLE_VA_CLOSURE_EMPTY_MAGIC && + !_g_closure_is_void (node->single_va_closure, instance)) + { + if (_g_closure_supports_invoke_va (node->single_va_closure)) + { + closure = node->single_va_closure; + if (node->single_va_closure_is_after) + run_type = G_SIGNAL_RUN_LAST; + else + run_type = G_SIGNAL_RUN_FIRST; + } + else + fastpath = FALSE; + } + + for (l = hlist ? hlist->handlers : NULL; fastpath && l != NULL; l = l->next) + { + if (!l->block_count && + (!l->detail || l->detail == detail)) + { + if (closure != NULL || !_g_closure_supports_invoke_va (l->closure)) + { + fastpath = FALSE; + break; + } + else + { + closure = l->closure; + if (l->after) + run_type = G_SIGNAL_RUN_LAST; + else + run_type = G_SIGNAL_RUN_FIRST; + } + } + } + + if (fastpath && closure == NULL && node->return_type == G_TYPE_NONE) + { + SIGNAL_UNLOCK (); + return; + } + + /* Don't allow no-recurse emission as we might have to restart, which means + we will run multiple handlers and thus must ref all arguments */ + if (closure != NULL && (node->flags & (G_SIGNAL_NO_RECURSE)) != 0) + fastpath = FALSE; + + if (fastpath) + { + SignalAccumulator *accumulator; + Emission emission; + GValue *return_accu, accu = G_VALUE_INIT; + guint signal_id; + GType instance_type = G_TYPE_FROM_INSTANCE (instance); + GValue emission_return = G_VALUE_INIT; + GType rtype = node->return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE; + gboolean static_scope = node->return_type & G_SIGNAL_TYPE_STATIC_SCOPE; + + signal_id = node->signal_id; + accumulator = node->accumulator; + if (rtype == G_TYPE_NONE) + return_accu = NULL; + else if (accumulator) + return_accu = &accu; + else + return_accu = &emission_return; + + emission.instance = instance; + emission.ihint.signal_id = signal_id; + emission.ihint.detail = detail; + emission.ihint.run_type = run_type; + emission.state = EMISSION_RUN; + emission.chain_type = instance_type; + emission_push (&g_recursive_emissions, &emission); + + SIGNAL_UNLOCK (); + + TRACE(GOBJECT_SIGNAL_EMIT(signal_id, detail, instance, instance_type)); + + if (rtype != G_TYPE_NONE) + g_value_init (&emission_return, rtype); + + if (accumulator) + g_value_init (&accu, rtype); + + if (closure != NULL) + { + g_object_ref (instance); + _g_closure_invoke_va (closure, + return_accu, + instance, + var_args, + node->n_params, + node->param_types); + accumulate (&emission.ihint, &emission_return, &accu, accumulator); + g_object_unref (instance); + } + + SIGNAL_LOCK (); + + emission.chain_type = G_TYPE_NONE; + emission_pop (&g_recursive_emissions, &emission); + + SIGNAL_UNLOCK (); + + if (accumulator) + g_value_unset (&accu); + + if (rtype != G_TYPE_NONE) + { + gchar *error = NULL; + for (i = 0; i < node->n_params; i++) + { + GType ptype = node->param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE; + G_VALUE_COLLECT_SKIP (ptype, var_args); + } + + G_VALUE_LCOPY (&emission_return, + var_args, + static_scope ? G_VALUE_NOCOPY_CONTENTS : 0, + &error); + if (!error) + g_value_unset (&emission_return); + 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 occurred + */ + } + } + + TRACE(GOBJECT_SIGNAL_EMIT_END(signal_id, detail, instance, instance_type)); + + return; + } + } + + n_params = node->n_params; + signal_return_type = node->return_type; + instance_and_params = g_alloca (sizeof (GValue) * (n_params + 1)); + memset (instance_and_params, 0, 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); + + 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 = G_VALUE_INIT; + 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 occurred + */ + } + } + for (i = 0; i < n_params; i++) + g_value_unset (param_values + i); + g_value_unset (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 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 = G_VALUE_INIT; + 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 */ + + TRACE(GOBJECT_SIGNAL_EMIT(node->signal_id, detail, instance, G_TYPE_FROM_INSTANCE (instance))); + + 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); + + TRACE(GOBJECT_SIGNAL_EMIT_END(node->signal_id, detail, instance, G_TYPE_FROM_INSTANCE (instance))); + + return return_value_altered; +} + +static void +add_invalid_closure_notify (Handler *handler, + gpointer instance) +{ + g_closure_add_invalidate_notifier (handler->closure, instance, invalid_closure_notify); + handler->has_invalid_closure_notify = 1; +} + +static void +remove_invalid_closure_notify (Handler *handler, + gpointer instance) +{ + if (handler->has_invalid_closure_notify) + { + g_closure_remove_invalidate_notifier (handler->closure, instance, invalid_closure_notify); + handler->has_invalid_closure_notify = 0; + } +} + +static void +invalid_closure_notify (gpointer instance, + GClosure *closure) +{ + Handler *handler; + guint signal_id; + + SIGNAL_LOCK (); + + handler = handler_lookup (instance, 0, closure, &signal_id); + g_assert (handler->closure == closure); + + handler->sequential_number = 0; + handler->block_count = 1; + handler_unref_R (signal_id, instance, handler); + + SIGNAL_UNLOCK (); +} + +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 continue. 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; +} + +/** + * g_signal_accumulator_first_wins: + * @ihint: standard #GSignalAccumulator parameter + * @return_accu: standard #GSignalAccumulator parameter + * @handler_return: standard #GSignalAccumulator parameter + * @dummy: standard #GSignalAccumulator parameter + * + * A predefined #GSignalAccumulator for signals intended to be used as a + * hook for application code to provide a particular value. Usually + * only one such value is desired and multiple handlers for the same + * signal don't make much sense (except for the case of the default + * handler defined in the class structure, in which case you will + * usually want the signal connection to override the class handler). + * + * This accumulator will use the return value from the first signal + * handler that is run as the return value for the signal and not run + * any further handlers (ie: the first handler "wins"). + * + * Returns: standard #GSignalAccumulator result + * + * Since: 2.28 + **/ +gboolean +g_signal_accumulator_first_wins (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) +{ + g_value_copy (handler_return, return_accu); + return FALSE; +} diff --git a/gobject/gsignal.h b/gobject/gsignal.h new file mode 100644 index 0000000..46721ca --- /dev/null +++ b/gobject/gsignal.h @@ -0,0 +1,585 @@ +/* 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. + */ +#ifndef __G_SIGNAL_H__ +#define __G_SIGNAL_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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; +/** + * GSignalCVaMarshaller: + * + * This is the signature of va_list marshaller functions, an optional + * marshaller that can be used in some situations to avoid + * marshalling the signal argument into GValues. + */ +typedef GVaClosureMarshal GSignalCVaMarshaller; +/** + * 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: (array length=n_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. + * @G_SIGNAL_MUST_COLLECT: Varargs signal emission will always collect the + * arguments, even if there are no signal handlers connected. Since 2.30. + * @G_SIGNAL_DEPRECATED: The signal is deprecated and will be removed + * in a future version. A warning will be generated if it is connected while + * running with G_ENABLE_DIAGNOSTIC=1. Since 2.32. + * + * 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, + G_SIGNAL_MUST_COLLECT = 1 << 7, + G_SIGNAL_DEPRECATED = 1 << 8 +} GSignalFlags; +/** + * G_SIGNAL_FLAGS_MASK: + * + * A mask for all #GSignalFlags bits. + */ +#define G_SIGNAL_FLAGS_MASK 0x1ff +/** + * 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: (array length=n_params): 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 --- */ +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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); +GLIB_AVAILABLE_IN_ALL +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, + ...); +GLIB_AVAILABLE_IN_ALL +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, + ...); +GLIB_AVAILABLE_IN_ALL +void g_signal_set_va_marshaller (guint signal_id, + GType instance_type, + GSignalCVaMarshaller va_marshaller); + +GLIB_AVAILABLE_IN_ALL +void g_signal_emitv (const GValue *instance_and_params, + guint signal_id, + GQuark detail, + GValue *return_value); +GLIB_AVAILABLE_IN_ALL +void g_signal_emit_valist (gpointer instance, + guint signal_id, + GQuark detail, + va_list var_args); +GLIB_AVAILABLE_IN_ALL +void g_signal_emit (gpointer instance, + guint signal_id, + GQuark detail, + ...); +GLIB_AVAILABLE_IN_ALL +void g_signal_emit_by_name (gpointer instance, + const gchar *detailed_signal, + ...); +GLIB_AVAILABLE_IN_ALL +guint g_signal_lookup (const gchar *name, + GType itype); +GLIB_AVAILABLE_IN_ALL +const gchar * g_signal_name (guint signal_id); +GLIB_AVAILABLE_IN_ALL +void g_signal_query (guint signal_id, + GSignalQuery *query); +GLIB_AVAILABLE_IN_ALL +guint* g_signal_list_ids (GType itype, + guint *n_ids); +GLIB_AVAILABLE_IN_ALL +gboolean g_signal_parse_name (const gchar *detailed_signal, + GType itype, + guint *signal_id_p, + GQuark *detail_p, + gboolean force_detail_quark); +GLIB_AVAILABLE_IN_ALL +GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance); + + +/* --- signal emissions --- */ +GLIB_AVAILABLE_IN_ALL +void g_signal_stop_emission (gpointer instance, + guint signal_id, + GQuark detail); +GLIB_AVAILABLE_IN_ALL +void g_signal_stop_emission_by_name (gpointer instance, + const gchar *detailed_signal); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_add_emission_hook (guint signal_id, + GQuark detail, + GSignalEmissionHook hook_func, + gpointer hook_data, + GDestroyNotify data_destroy); +GLIB_AVAILABLE_IN_ALL +void g_signal_remove_emission_hook (guint signal_id, + gulong hook_id); + + +/* --- signal handlers --- */ +GLIB_AVAILABLE_IN_ALL +gboolean g_signal_has_handler_pending (gpointer instance, + guint signal_id, + GQuark detail, + gboolean may_be_blocked); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_connect_closure_by_id (gpointer instance, + guint signal_id, + GQuark detail, + GClosure *closure, + gboolean after); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_connect_closure (gpointer instance, + const gchar *detailed_signal, + GClosure *closure, + gboolean after); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_connect_data (gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data, + GClosureNotify destroy_data, + GConnectFlags connect_flags); +GLIB_AVAILABLE_IN_ALL +void g_signal_handler_block (gpointer instance, + gulong handler_id); +GLIB_AVAILABLE_IN_ALL +void g_signal_handler_unblock (gpointer instance, + gulong handler_id); +GLIB_AVAILABLE_IN_ALL +void g_signal_handler_disconnect (gpointer instance, + gulong handler_id); +GLIB_AVAILABLE_IN_ALL +gboolean g_signal_handler_is_connected (gpointer instance, + gulong handler_id); +GLIB_AVAILABLE_IN_ALL +gulong g_signal_handler_find (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_signal_handlers_block_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_signal_handlers_unblock_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); +GLIB_AVAILABLE_IN_ALL +guint g_signal_handlers_disconnect_matched (gpointer instance, + GSignalMatchType mask, + guint signal_id, + GQuark detail, + GClosure *closure, + gpointer func, + gpointer data); + + +/* --- overriding and chaining --- */ +GLIB_AVAILABLE_IN_ALL +void g_signal_override_class_closure (guint signal_id, + GType instance_type, + GClosure *class_closure); +GLIB_AVAILABLE_IN_ALL +void g_signal_override_class_handler (const gchar *signal_name, + GType instance_type, + GCallback class_handler); +GLIB_AVAILABLE_IN_ALL +void g_signal_chain_from_overridden (const GValue *instance_and_params, + GValue *return_value); +GLIB_AVAILABLE_IN_ALL +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_disconnect_by_data: + * @instance: The instance to remove handlers from + * @data: the closure data of the handlers' closures + * + * Disconnects all handlers on an instance that match @data. + * + * Returns: The number of handlers that matched. + * + * Since: 2.32 + */ +#define g_signal_handlers_disconnect_by_data(instance, data) \ + g_signal_handlers_disconnect_matched ((instance), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (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)) + + +GLIB_AVAILABLE_IN_ALL +gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + +GLIB_AVAILABLE_IN_ALL +gboolean g_signal_accumulator_first_wins (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + +/*< private >*/ +GLIB_AVAILABLE_IN_ALL +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..16f34ee --- /dev/null +++ b/gobject/gsourceclosure.c @@ -0,0 +1,239 @@ +/* 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" + +G_DEFINE_BOXED_TYPE (GIOChannel, g_io_channel, g_io_channel_ref, g_io_channel_unref) + +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] = { G_VALUE_INIT, G_VALUE_INIT }; + GValue result_value = G_VALUE_INIT; + 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 = G_VALUE_INIT; + 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 +}; + +static void +closure_invalidated (gpointer user_data, + GClosure *closure) +{ + g_source_destroy (user_data); +} + +/** + * 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); + + g_closure_add_invalidate_notifier (closure, source, closure_invalidated); + + 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); + } +} + +static void +dummy_closure_marshal (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + if (G_VALUE_HOLDS_BOOLEAN (return_value)) + g_value_set_boolean (return_value, TRUE); +} + +/** + * g_source_set_dummy_callback: + * @source: the source + * + * Sets a dummy callback for @source. The callback will do nothing, and + * if the source expects a #gboolean return value, it will return %TRUE. + * (If the source expects any other type of return value, it will return + * a 0/%NULL value; whatever g_value_init() initializes a #GValue to for + * that type.) + * + * 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_dummy_callback (GSource *source) +{ + GClosure *closure; + + closure = g_closure_new_simple (sizeof (GClosure), NULL); + g_closure_set_meta_marshal (closure, NULL, dummy_closure_marshal); + g_source_set_closure (source, closure); +} diff --git a/gobject/gsourceclosure.h b/gobject/gsourceclosure.h new file mode 100644 index 0000000..6f07786 --- /dev/null +++ b/gobject/gsourceclosure.h @@ -0,0 +1,40 @@ +/* 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. + */ +#ifndef __G_SOURCECLOSURE_H__ +#define __G_SOURCECLOSURE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +GLIB_AVAILABLE_IN_ALL +void g_source_set_closure (GSource *source, + GClosure *closure); + +GLIB_AVAILABLE_IN_ALL +void g_source_set_dummy_callback (GSource *source); + +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..5c415e5 --- /dev/null +++ b/gobject/gtype-private.h @@ -0,0 +1,78 @@ +/* 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_TYPE_PRIVATE_H__ +#define __G_TYPE_PRIVATE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include "gboxed.h" +#include "gclosure.h" + +G_BEGIN_DECLS + +typedef struct _GRealClosure GRealClosure; +struct _GRealClosure +{ + GClosureMarshal meta_marshal; + gpointer meta_marshal_data; + GVaClosureMarshal va_meta_marshal; + GVaClosureMarshal va_marshal; + GClosure closure; +}; + +#define G_REAL_CLOSURE(_c) \ + ((GRealClosure *)G_STRUCT_MEMBER_P ((_c), -G_STRUCT_OFFSET (GRealClosure, closure))) + +void _g_value_c_init (void); /* sync with gvalue.c */ +void _g_value_types_init (void); /* sync with gvaluetypes.c */ +void _g_enum_types_init (void); /* sync with genums.c */ +void _g_param_type_init (void); /* sync with gparam.c */ +void _g_boxed_type_init (void); /* sync with gboxed.c */ +void _g_object_type_init (void); /* sync with gobject.c */ +void _g_param_spec_types_init (void); /* sync with gparamspecs.c */ +void _g_value_transforms_init (void); /* sync with gvaluetransform.c */ +void _g_signal_init (void); /* sync with gsignal.c */ + +/* 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); + +gboolean _g_closure_is_void (GClosure *closure, + gpointer instance); +gboolean _g_closure_supports_invoke_va (GClosure *closure); +void _g_closure_set_va_marshal (GClosure *closure, + GVaClosureMarshal marshal); +void _g_closure_invoke_va (GClosure *closure, + GValue /*out*/ *return_value, + gpointer instance, + va_list args, + int n_params, + GType *param_types); + + +G_END_DECLS + +#endif /* __G_TYPE_PRIVATE_H__ */ diff --git a/gobject/gtype.c b/gobject/gtype.c new file mode 100644 index 0000000..a821442 --- /dev/null +++ b/gobject/gtype.c @@ -0,0 +1,4720 @@ +/* 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 "gatomicarray.h" +#include "gobject_trace.h" + +#include "gconstructor.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. + * + * 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. + * + * Type instance and class structs are limited to a total of 64 KiB, + * including all parent types. Similarly, type instances' private data + * (as created by g_type_class_add_private()) are limited to a total of + * 64 KiB. If a type instance needs a large static buffer, allocate it + * separately (typically by using #GArray or #GPtrArray) and put a pointer + * to the buffer in the structure. + * + * 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. + * + * 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_rw_lock_reader_lock (rw_lock); } while (0) +#define G_READ_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": readL--\n"); g_rw_lock_reader_unlock (rw_lock); } while (0) +#define G_WRITE_LOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL++\n"); g_rw_lock_writer_lock (rw_lock); } while (0) +#define G_WRITE_UNLOCK(rw_lock) do { g_printerr (G_STRLOC ": writeL--\n"); g_rw_lock_writer_unlock (rw_lock); } while (0) +#else +#define G_READ_LOCK(rw_lock) g_rw_lock_reader_lock (rw_lock) +#define G_READ_UNLOCK(rw_lock) g_rw_lock_reader_unlock (rw_lock) +#define G_WRITE_LOCK(rw_lock) g_rw_lock_writer_lock (rw_lock) +#define G_WRITE_UNLOCK(rw_lock) g_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_assert_type_system_initialized() \ + g_assert (static_quark_type_flags) + +#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 GRWLock type_rw_lock; +static GRecMutex class_init_rec_mutex; +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; +static guint type_registration_serial = 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]; +} + +/** + * g_type_get_type_registration_serial: + * + * Returns an opaque serial number that represents the state of the set of registered + * types. Any time a type is registred this serial changes, which means you can + * cache information based on type lookups (such as g_type_from_name) and know if + * the cache is still valid at a later time by comparing the current serial with + * the one at the type lookup. + * + * Since: 2.36 + * + * Returns: An unsigned int, representing the state of type registrations. + */ +guint +g_type_get_type_registration_serial (void) +{ + return (guint)g_atomic_int_get ((gint *)&type_registration_serial); +} + +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; + } + + TRACE(GOBJECT_TYPE_NEW(name, node->supers[1], 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, + (gpointer) g_quark_to_string (node->qname), + (gpointer) type); + + g_atomic_int_inc ((gint *)&type_registration_serial); + + 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; + } + if (node->data && node->data->class.class) + { + g_warning ("attempting to add an interface (%s) to class (%s) after class_init", + NODE_NAME (iface), 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) /* careful, 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 publicly 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: (out) (allow-none): location to return the number + * of prerequisites, or %NULL + * + * Returns the prerequisites of an interfaces type. + * + * Since: 2.2 + * + * Returns: (array length=n_prerequisites) (transfer full): 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: (skip) + * @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_error ("cannot create new instance of invalid (non-instantiatable) type `%s'", + type_descriptive_name_I (type)); + } + /* G_TYPE_IS_ABSTRACT() is an external call: _U */ + if (!node->mutatable_check_cache && G_TYPE_IS_ABSTRACT (type)) + { + g_error ("cannot create instance of abstract (non-instantiatable) type `%s'", + type_descriptive_name_I (type)); + } + + 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); + + TRACE(GOBJECT_OBJECT_NEW(instance, type)); + + 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; + } + else + { + /* This is the last reference of a type from a plugin. We are + * experimentally disabling support for unloading type + * plugins, so don't allow the last ref to drop. + */ + return; + } + + g_assert (current > 0); + + g_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_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: (skip) + * @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: (skip) + * @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: (skip) + * @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: (skip) + * @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. If @type_id is already registered, or a type + * named @type_name is already registered, the behaviour is undefined. 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_assert_type_system_initialized (); + 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: (skip) + * @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; + + /* Instances are not allowed to be larger than this. If you have a big + * fixed-length array or something, point to it instead. + */ + g_return_val_if_fail (class_size <= G_MAXUINT16, G_TYPE_INVALID); + g_return_val_if_fail (instance_size <= G_MAXUINT16, G_TYPE_INVALID); + + 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_assert_type_system_initialized (); + 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_assert_type_system_initialized (); + 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 #GInterfaceInfo 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_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_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_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_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: (type GObject.TypeClass) (transfer none): 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_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_rec_mutex_unlock (&class_init_rec_mutex); + + return node->data->class.class; +} + +/** + * g_type_class_unref: + * @g_class: (type GObject.TypeClass): 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: (skip) + * @g_class: (type GObject.TypeClass): 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: (type GObject.TypeClass) (transfer none): 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: (type GObject.TypeClass) (transfer none): 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: (type GObject.TypeClass): 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: (type GObject.TypeClass) (transfer none): 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: (type GObject.TypeClass): 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: (type GObject.TypeInterface) (transfer none): 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: (type GObject.TypeInterface): 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: (transfer none) (type GObject.TypeInterface): 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: (type GObject.TypeInterface) (transfer none): 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_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_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: (type GObject.TypeInterface) (transfer none): 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: (type GObject.TypeInterface): 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. + */ +const gchar * +g_type_name (GType type) +{ + TypeNode *node; + + g_assert_type_system_initialized (); + + 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; + + g_return_val_if_fail (name != NULL, 0); + + G_READ_LOCK (&type_rw_lock); + type = (GType) g_hash_table_lookup (static_type_nodes_ht, name); + 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: (out) (allow-none): 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: (array length=n_children) (transfer full): 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: (out) (allow-none): 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: (array length=n_interfaces) (transfer full): 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(). + * + * Note that this does not take subtyping into account; data + * attached to one type with g_type_set_qdata() cannot + * be retrieved from a subtype using g_type_get_qdata(). + * + * Returns: (transfer none): 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: (out caller-allocates): 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: (transfer none): 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: (transfer none): 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: (skip) + * @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; +} + +const gchar * +g_type_name_from_instance (GTypeInstance *instance) +{ + if (!instance) + return ""; + else + return g_type_name_from_class (instance->g_class); +} + +const 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. + * + * This function used to initialise the type system with debugging + * flags. Since GLib 2.36, the type system is initialised automatically + * and this function does nothing. + * + * If you need to enable debugging features, use the GOBJECT_DEBUG + * environment variable. + * + * Deprecated: 2.36: the type system is now initialised automatically + */ +void +g_type_init_with_debug_flags (GTypeDebugFlags debug_flags) +{ + g_assert_type_system_initialized (); + + if (debug_flags) + g_message ("g_type_init_with_debug_flags() is no longer supported. Use the GOBJECT_DEBUG environment variable."); +} + +/** + * g_type_init: + * + * This function used to initialise the type system. Since GLib 2.36, + * the type system is initialised automatically and this function does + * nothing. + * + * Deprecated: 2.36: the type system is now initialised automatically + */ +void +g_type_init (void) +{ + g_assert_type_system_initialized (); +} + +#if defined (G_HAS_CONSTRUCTORS) +#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(gobject_init_ctor) +#endif +G_DEFINE_CONSTRUCTOR(gobject_init_ctor) +#else +# error Your platform/compiler is missing constructor support +#endif + +static void +gobject_init_ctor (void) +{ + const gchar *env_string; + GTypeInfo info; + TypeNode *node; + GType type; + + G_WRITE_LOCK (&type_rw_lock); + + /* setup GObject library wide debugging flags */ + env_string = g_getenv ("GOBJECT_DEBUG"); + if (env_string != NULL) + { + 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, G_N_ELEMENTS (debug_keys)); + } + + /* 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_str_hash, g_str_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); + type = NODE_TYPE (node); + g_assert (type == 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); + type = NODE_TYPE (node); + type_data_make_W (node, &info, NULL); + g_assert (type == G_TYPE_INTERFACE); + + G_WRITE_UNLOCK (&type_rw_lock); + + _g_value_c_init (); + + /* G_TYPE_TYPE_PLUGIN + */ + g_type_ensure (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_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. + * + * Note that the accumulated size of the private structures of + * a type and all its parent types cannot exceed 64 KiB. + * + * This function should be called in the type's class_init() function. + * The private structure can be retrieved using the + * G_TYPE_INSTANCE_GET_PRIVATE() macro. + * + * The following example shows attaching a private structure + * MyObjectPrivate to an object + * MyObject defined in the standard GObject + * fashion. + * type's class_init() function. + * Note the use of a structure member "priv" to avoid the overhead + * of repeatedly calling MY_OBJECT_GET_PRIVATE(). + * + * |[ + * typedef struct _MyObject MyObject; + * typedef struct _MyObjectPrivate MyObjectPrivate; + * + * struct _MyObject { + * GObject parent; + * + * MyObjectPrivate *priv; + * }; + * + * struct _MyObjectPrivate { + * int some_field; + * }; + * + * static void + * my_object_class_init (MyObjectClass *klass) + * { + * g_type_class_add_private (klass, sizeof (MyObjectPrivate)); + * } + * + * static void + * my_object_init (MyObject *my_object) + * { + * my_object->priv = G_TYPE_INSTANCE_GET_PRIVATE (my_object, + * MY_TYPE_OBJECT, + * MyObjectPrivate); + * } + * + * static int + * my_object_get_some_field (MyObject *my_object) + * { + * MyObjectPrivate *priv; + * + * g_return_val_if_fail (MY_IS_OBJECT (my_object), 0); + * + * priv = my_object->priv; + * + * return priv->some_field; + * } + * ]| + * + * Since: 2.4 + */ +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); + g_return_if_fail (private_size <= 0xffff); + + 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); + + g_assert (offset + private_size <= 0xffff); + + 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_add_class_private()"); + return NULL; + } + + offset += ALIGN_STRUCT (parent_node->data->class.class_private_size); + } + + return G_STRUCT_MEMBER_P (klass, offset); +} + +/** + * g_type_ensure: + * @type: a #GType. + * + * Ensures that the indicated @type has been registered with the + * type system, and its _class_init() method has been run. + * + * In theory, simply calling the type's _get_type() method (or using + * the corresponding macro) is supposed take care of this. However, + * _get_type() methods are often marked %G_GNUC_CONST for performance + * reasons, even though this is technically incorrect (since + * %G_GNUC_CONST requires that the function not have side effects, + * which _get_type() methods do on the first call). As a result, if + * you write a bare call to a _get_type() macro, it may get optimized + * out by the compiler. Using g_type_ensure() guarantees that the + * type's _get_type() method is called. + * + * Since: 2.34 + */ +void +g_type_ensure (GType type) +{ + /* In theory, @type has already been resolved and so there's nothing + * to do here. But this protects us in the case where the function + * gets inlined (as it might in gobject_init_ctor() above). + */ + if (G_UNLIKELY (type == (GType)-1)) + g_error ("can't happen"); +} diff --git a/gobject/gtype.h b/gobject/gtype.h new file mode 100644 index 0000000..8a1bff2 --- /dev/null +++ b/gobject/gtype.h @@ -0,0 +1,1790 @@ +/* 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_TYPE_H__ +#define __G_TYPE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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, + */ +/** + * 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) +/** + * G_TYPE_VARIANT: + * + * The fundamental type corresponding to #GVariant. + * + * All floating #GVariant instances passed through the #GType system are + * consumed. + * + * Note that callbacks in closures, and signal handlers + * for signals of return type %G_TYPE_VARIANT, must never return floating + * variants. + * + * Note: GLib 2.24 did include a boxed type with this name. It was replaced + * with this fundamental type in 2.26. + * + * Since: 2.26 + */ +#define G_TYPE_VARIANT G_TYPE_MAKE_FUNDAMENTAL (21) + + +/* 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 (22) +/** + * 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 cannot 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. + * + * These flags used to be passed to g_type_init_with_debug_flags() which + * is now deprecated. + * + * If you need to enable debugging features, use the GOBJECT_DEBUG + * environment variable. + * + * Deprecated: 2.36: g_type_init() is now done automatically + */ +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 --- */ +GLIB_DEPRECATED_IN_2_36 +void g_type_init (void); +GLIB_DEPRECATED_IN_2_36 +void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags); +GLIB_AVAILABLE_IN_ALL +const gchar * g_type_name (GType type); +GLIB_AVAILABLE_IN_ALL +GQuark g_type_qname (GType type); +GLIB_AVAILABLE_IN_ALL +GType g_type_from_name (const gchar *name); +GLIB_AVAILABLE_IN_ALL +GType g_type_parent (GType type); +GLIB_AVAILABLE_IN_ALL +guint g_type_depth (GType type); +GLIB_AVAILABLE_IN_ALL +GType g_type_next_base (GType leaf_type, + GType root_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_type_is_a (GType type, + GType is_a_type); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_class_ref (GType type); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_class_peek (GType type); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_class_peek_static (GType type); +GLIB_AVAILABLE_IN_ALL +void g_type_class_unref (gpointer g_class); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_class_peek_parent (gpointer g_class); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_interface_peek (gpointer instance_class, + GType iface_type); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_interface_peek_parent (gpointer g_iface); + +GLIB_AVAILABLE_IN_ALL +gpointer g_type_default_interface_ref (GType g_type); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_default_interface_peek (GType g_type); +GLIB_AVAILABLE_IN_ALL +void g_type_default_interface_unref (gpointer g_iface); + +/* g_free() the returned arrays */ +GLIB_AVAILABLE_IN_ALL +GType* g_type_children (GType type, + guint *n_children); +GLIB_AVAILABLE_IN_ALL +GType* g_type_interfaces (GType type, + guint *n_interfaces); + +/* per-type _static_ data */ +GLIB_AVAILABLE_IN_ALL +void g_type_set_qdata (GType type, + GQuark quark, + gpointer data); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_get_qdata (GType type, + GQuark quark); +GLIB_AVAILABLE_IN_ALL +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 signal emission 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); + const gchar *collect_format; + gchar* (*collect_value) (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); + const gchar *lcopy_format; + gchar* (*lcopy_value) (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags); +}; +GLIB_AVAILABLE_IN_ALL +GType g_type_register_static (GType parent_type, + const gchar *type_name, + const GTypeInfo *info, + GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL +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); + +GLIB_AVAILABLE_IN_ALL +GType g_type_register_dynamic (GType parent_type, + const gchar *type_name, + GTypePlugin *plugin, + GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL +GType g_type_register_fundamental (GType type_id, + const gchar *type_name, + const GTypeInfo *info, + const GTypeFundamentalInfo *finfo, + GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL +void g_type_add_interface_static (GType instance_type, + GType interface_type, + const GInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL +void g_type_add_interface_dynamic (GType instance_type, + GType interface_type, + GTypePlugin *plugin); +GLIB_AVAILABLE_IN_ALL +void g_type_interface_add_prerequisite (GType interface_type, + GType prerequisite_type); +GLIB_AVAILABLE_IN_ALL +GType*g_type_interface_prerequisites (GType interface_type, + guint *n_prerequisites); +GLIB_AVAILABLE_IN_ALL +void g_type_class_add_private (gpointer g_class, + gsize private_size); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_instance_get_private (GTypeInstance *instance, + GType private_type); + +GLIB_AVAILABLE_IN_ALL +void g_type_add_class_private (GType class_type, + gsize private_size); +GLIB_AVAILABLE_IN_ALL +gpointer g_type_class_get_private (GTypeClass *klass, + GType private_type); + +GLIB_AVAILABLE_IN_2_34 +void g_type_ensure (GType type); +GLIB_AVAILABLE_IN_2_36 +guint g_type_get_type_registration_serial (void); + + +/* --- 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); + * { + * 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() */ + +/** + * G_DEFINE_BOXED_TYPE: + * @TypeName: The name of the new type, in Camel case. + * @type_name: The name of the new type, in lowercase, with words + * separated by '_'. + * @copy_func: the #GBoxedCopyFunc for the new type + * @free_func: the #GBoxedFreeFunc for the new type + * + * A convenience macro for boxed type implementations, which defines a + * type_name_get_type() function registering the boxed type. + * + * Since: 2.26 + */ +#define G_DEFINE_BOXED_TYPE(TypeName, type_name, copy_func, free_func) G_DEFINE_BOXED_TYPE_WITH_CODE (TypeName, type_name, copy_func, free_func, {}) +/** + * G_DEFINE_BOXED_TYPE_WITH_CODE: + * @TypeName: The name of the new type, in Camel case. + * @type_name: The name of the new type, in lowercase, with words + * separated by '_'. + * @copy_func: the #GBoxedCopyFunc for the new type + * @free_func: the #GBoxedFreeFunc for the new type + * @_C_: Custom code that gets inserted in the *_get_type() function. + * + * A convenience macro for boxed type implementations. + * Similar to G_DEFINE_BOXED_TYPE(), but allows to insert custom code into the + * type_name_get_type() function, e.g. to register value transformations with + * g_value_register_transform_func(). + * + * Since: 2.26 + */ +#define G_DEFINE_BOXED_TYPE_WITH_CODE(TypeName, type_name, copy_func, free_func, _C_) _G_DEFINE_BOXED_TYPE_BEGIN (TypeName, type_name, copy_func, free_func) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() + +#if !defined (__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) +#define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \ +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_register_boxed) \ + (const gchar *, \ + union \ + { \ + TypeName * (*do_copy_type) (TypeName *); \ + TypeName * (*do_const_copy_type) (const TypeName *); \ + GBoxedCopyFunc do_copy_boxed; \ + } __attribute__((__transparent_union__)), \ + union \ + { \ + void (* do_free_type) (TypeName *); \ + GBoxedFreeFunc do_free_boxed; \ + } __attribute__((__transparent_union__)) \ + ) = g_boxed_type_register_static; \ + GType g_define_type_id = \ + _g_register_boxed (g_intern_static_string (#TypeName), copy_func, free_func); \ + { /* custom code follows */ +#else +#define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \ +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_boxed_type_register_static (g_intern_static_string (#TypeName), \ + (GBoxedCopyFunc) copy_func, \ + (GBoxedFreeFunc) free_func); \ + { /* custom code follows */ +#endif /* __GNUC__ */ + +/** + * G_DEFINE_POINTER_TYPE: + * @TypeName: The name of the new type, in Camel case. + * @type_name: The name of the new type, in lowercase, with words + * separated by '_'. + * + * A convenience macro for pointer type implementations, which defines a + * type_name_get_type() function registering the pointer type. + * + * Since: 2.26 + */ +#define G_DEFINE_POINTER_TYPE(TypeName, type_name) G_DEFINE_POINTER_TYPE_WITH_CODE (TypeName, type_name, {}) +/** + * G_DEFINE_POINTER_TYPE_WITH_CODE: + * @TypeName: The name of the new type, in Camel case. + * @type_name: The name of the new type, in lowercase, with words + * separated by '_'. + * @_C_: Custom code that gets inserted in the *_get_type() function. + * + * A convenience macro for pointer type implementations. + * Similar to G_DEFINE_POINTER_TYPE(), but allows to insert custom code into the + * type_name_get_type() function. + * + * Since: 2.26 + */ +#define G_DEFINE_POINTER_TYPE_WITH_CODE(TypeName, type_name, _C_) _G_DEFINE_POINTER_TYPE_BEGIN (TypeName, type_name) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() + +#define _G_DEFINE_POINTER_TYPE_BEGIN(TypeName, type_name) \ +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_pointer_type_register_static (g_intern_static_string (#TypeName)); \ + { /* custom code follows */ + +/* --- protected (for fundamental type implementations) --- */ +GLIB_AVAILABLE_IN_ALL +GTypePlugin* g_type_get_plugin (GType type); +GLIB_AVAILABLE_IN_ALL +GTypePlugin* g_type_interface_get_plugin (GType instance_type, + GType interface_type); +GLIB_AVAILABLE_IN_ALL +GType g_type_fundamental_next (void); +GLIB_AVAILABLE_IN_ALL +GType g_type_fundamental (GType type_id); +GLIB_AVAILABLE_IN_ALL +GTypeInstance* g_type_create_instance (GType type); +GLIB_AVAILABLE_IN_ALL +void g_type_free_instance (GTypeInstance *instance); + +GLIB_AVAILABLE_IN_ALL +void g_type_add_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func); +GLIB_AVAILABLE_IN_ALL +void g_type_remove_class_cache_func (gpointer cache_data, + GTypeClassCacheFunc cache_func); +GLIB_AVAILABLE_IN_ALL +void g_type_class_unref_uncached (gpointer g_class); + +GLIB_AVAILABLE_IN_ALL +void g_type_add_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func); +GLIB_AVAILABLE_IN_ALL +void g_type_remove_interface_check (gpointer check_data, + GTypeInterfaceCheckFunc check_func); + +GLIB_AVAILABLE_IN_ALL +GTypeValueTable* g_type_value_table_peek (GType type); + + +/*< private >*/ +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance, + GType iface_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_instance_is_a (GTypeInstance *instance, + GType iface_type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +GTypeClass* g_type_check_class_cast (GTypeClass *g_class, + GType is_a_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_class_is_a (GTypeClass *g_class, + GType is_a_type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_value (GValue *value) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gboolean g_type_check_value_holds (GValue *value, + GType type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL +gboolean g_type_test_flags (GType type, + guint flags) G_GNUC_CONST; + + +/* --- debugging functions --- */ +GLIB_AVAILABLE_IN_ALL +const gchar * g_type_name_from_instance (GTypeInstance *instance); +GLIB_AVAILABLE_IN_ALL +const gchar * g_type_name_from_class (GTypeClass *g_class); + + +/* --- 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..b1a663d --- /dev/null +++ b/gobject/gtypemodule.c @@ -0,0 +1,581 @@ +/* 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" + + +/** + * 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 cannot 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_run_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) + { + 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 */ + }; + 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); +} diff --git a/gobject/gtypemodule.h b/gobject/gtypemodule.h new file mode 100644 index 0000000..cc42bdd --- /dev/null +++ b/gobject/gtypemodule.h @@ -0,0 +1,271 @@ +/* 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. + */ +#ifndef __G_TYPE_MODULE_H__ +#define __G_TYPE_MODULE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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 G_GNUC_UNUSED; \ + 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); \ +} + +GLIB_AVAILABLE_IN_ALL +GType g_type_module_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +gboolean g_type_module_use (GTypeModule *module); +GLIB_AVAILABLE_IN_ALL +void g_type_module_unuse (GTypeModule *module); +GLIB_AVAILABLE_IN_ALL +void g_type_module_set_name (GTypeModule *module, + const gchar *name); +GLIB_AVAILABLE_IN_ALL +GType g_type_module_register_type (GTypeModule *module, + GType parent_type, + const gchar *type_name, + const GTypeInfo *type_info, + GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL +void g_type_module_add_interface (GTypeModule *module, + GType instance_type, + GType interface_type, + const GInterfaceInfo *interface_info); +GLIB_AVAILABLE_IN_ALL +GType g_type_module_register_enum (GTypeModule *module, + const gchar *name, + const GEnumValue *const_static_values); +GLIB_AVAILABLE_IN_ALL +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..192f6f9 --- /dev/null +++ b/gobject/gtypeplugin.c @@ -0,0 +1,206 @@ +/* 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" + + +/** + * 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) + { + 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); +} diff --git a/gobject/gtypeplugin.h b/gobject/gtypeplugin.h new file mode 100644 index 0000000..c744f9e --- /dev/null +++ b/gobject/gtypeplugin.h @@ -0,0 +1,139 @@ +/* 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. + */ +#ifndef __G_TYPE_PLUGIN_H__ +#define __G_TYPE_PLUGIN_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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 --- */ +GLIB_AVAILABLE_IN_ALL +GType g_type_plugin_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL +void g_type_plugin_use (GTypePlugin *plugin); +GLIB_AVAILABLE_IN_ALL +void g_type_plugin_unuse (GTypePlugin *plugin); +GLIB_AVAILABLE_IN_ALL +void g_type_plugin_complete_type_info (GTypePlugin *plugin, + GType g_type, + GTypeInfo *info, + GTypeValueTable *value_table); +GLIB_AVAILABLE_IN_ALL +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..9044d6f --- /dev/null +++ b/gobject/gvalue.c @@ -0,0 +1,553 @@ +/* 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 "gtype-private.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 be initialized */ + * GValue a = G_VALUE_INIT; + * GValue b = G_VALUE_INIT; + * const gchar *message; + * + * /* 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: (transfer none): 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. + * + * Returns: (transfer none): 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. + */ +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: (allow-none): 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: (skip) + * @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; +} diff --git a/gobject/gvalue.h b/gobject/gvalue.h new file mode 100644 index 0000000..56ea0c6 --- /dev/null +++ b/gobject/gvalue.h @@ -0,0 +1,194 @@ +/* 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 + */ +#ifndef __G_VALUE_H__ +#define __G_VALUE_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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 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 cannot 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 --- */ +GLIB_AVAILABLE_IN_ALL +GValue* g_value_init (GValue *value, + GType g_type); +GLIB_AVAILABLE_IN_ALL +void g_value_copy (const GValue *src_value, + GValue *dest_value); +GLIB_AVAILABLE_IN_ALL +GValue* g_value_reset (GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_unset (GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_instance (GValue *value, + gpointer instance); + + +/* --- private --- */ +GLIB_AVAILABLE_IN_ALL +gboolean g_value_fits_pointer (const GValue *value); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_peek_pointer (const GValue *value); + + +/* --- implementation details --- */ +GLIB_AVAILABLE_IN_ALL +gboolean g_value_type_compatible (GType src_type, + GType dest_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_value_type_transformable (GType src_type, + GType dest_type); +GLIB_AVAILABLE_IN_ALL +gboolean g_value_transform (const GValue *src_value, + GValue *dest_value); +GLIB_AVAILABLE_IN_ALL +void g_value_register_transform_func (GType src_type, + GType dest_type, + GValueTransform transform_func); + +/** + * G_VALUE_NOCOPY_CONTENTS: + * + * If passed to G_VALUE_COLLECT(), allocated data won't be copied + * but used verbatim. This does not affect ref-counted types like + * objects. + */ +#define G_VALUE_NOCOPY_CONTENTS (1 << 27) + +/** + * G_VALUE_INIT: + * + * A #GValue must be initialized before it can be used. + * This macro can be used as initializer instead of an explicit + * { 0 } when declaring a variable, + * but it cannot be assigned to a variable. + * + * |[ + * GValue value = G_VALUE_INIT; + * ]| + * + * Since: 2.30 + */ +#define G_VALUE_INIT { 0, { { 0 } } } + + +G_END_DECLS + +#endif /* __G_VALUE_H__ */ diff --git a/gobject/gvaluearray.c b/gobject/gvaluearray.c new file mode 100644 index 0000000..db6c719 --- /dev/null +++ b/gobject/gvaluearray.c @@ -0,0 +1,387 @@ +/* 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" + + +/** + * 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. + * + * #GValueArray is deprecated in favour of #GArray since GLib 2.32. It + * is possible to create a #GArray that behaves like a #GValueArray by + * using the size of #GValue as the element size, and by setting + * g_value_unset() as the clear function using g_array_set_clear_func(), + * for instance, the following code: + * + * |[ + * GValueArray *array = g_value_array_new (10); + * ]| + * + * can be replaced by: + * + * |[ + * GArray *array = g_array_sized_new (FALSE, TRUE, sizeof (GValue), 10); + * g_array_set_clear_func (array, (GDestroyNotify) g_value_unset); + * ]| + */ + + +#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: (transfer none): pointer to a value at @index_ in @value_array + * + * Deprecated: 2.32: Use g_array_index() instead. + */ +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 + * + * Deprecated: 2.32: Use #GArray and g_array_sized_new() instead. + */ +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. + * + * Deprecated: 2.32: Use #GArray and g_array_unref() instead. + */ +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: (transfer full): Newly allocated copy of #GValueArray + * + * Deprecated: 2.32: Use #GArray and g_array_ref() instead. + */ +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: (allow-none): #GValue to copy into #GValueArray, or %NULL + * + * Insert a copy of @value as first element of @value_array. If @value is + * %NULL, an uninitialized value is prepended. + * + * + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_prepend_val() instead. + */ +GValueArray* +g_value_array_prepend (GValueArray *value_array, + const GValue *value) +{ + g_return_val_if_fail (value_array != NULL, NULL); + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + return g_value_array_insert (value_array, 0, value); + G_GNUC_END_IGNORE_DEPRECATIONS +} + +/** + * g_value_array_append: + * @value_array: #GValueArray to add an element to + * @value: (allow-none): #GValue to copy into #GValueArray, or %NULL + * + * Insert a copy of @value as last element of @value_array. If @value is + * %NULL, an uninitialized value is appended. + * + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_append_val() instead. + */ +GValueArray* +g_value_array_append (GValueArray *value_array, + const GValue *value) +{ + g_return_val_if_fail (value_array != NULL, NULL); + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + return g_value_array_insert (value_array, value_array->n_values, value); + G_GNUC_END_IGNORE_DEPRECATIONS +} + +/** + * g_value_array_insert: + * @value_array: #GValueArray to add an element to + * @index_: insertion position, must be <= value_array->n_values + * @value: (allow-none): #GValue to copy into #GValueArray, or %NULL + * + * Insert a copy of @value at specified position into @value_array. If @value + * is %NULL, an uninitialized value is inserted. + * + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_insert_val() instead. + */ +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); + + 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, which must be less than + * value_array->n_values + * + * Remove the value at position @index_ from @value_array. + * + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_remove_index() instead. + */ +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: (scope call): function to compare elements + * + * Sort @value_array using @compare_func to compare the elements according to + * the semantics of #GCompareFunc. + * + * The current implementation uses Quick-Sort as sorting algorithm. + * + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_sort(). + */ +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: (scope call): function to compare elements + * @user_data: (closure): extra data argument provided for @compare_func + * + * Sort @value_array using @compare_func to compare the elements according + * to the semantics of #GCompareDataFunc. + * + * The current implementation uses Quick-Sort as sorting algorithm. + * + * Rename to: g_value_array_sort + * Returns: (transfer none): the #GValueArray passed in as @value_array + * + * Deprecated: 2.32: Use #GArray and g_array_sort_with_data(). + */ +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; +} diff --git a/gobject/gvaluearray.h b/gobject/gvaluearray.h new file mode 100644 index 0000000..aca3716 --- /dev/null +++ b/gobject/gvaluearray.h @@ -0,0 +1,106 @@ +/* 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 + */ +#ifndef __G_VALUE_ARRAY_H__ +#define __G_VALUE_ARRAY_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * G_TYPE_VALUE_ARRAY: + * + * The type ID of the "GValueArray" type which is a boxed type, + * used to pass around pointers to GValueArrays. + * + * Deprecated: 2.32: Use #GArray instead of #GValueArray + */ +#define G_TYPE_VALUE_ARRAY (g_value_array_get_type ()) + +/* --- 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 --- */ +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GType g_value_array_get_type (void) G_GNUC_CONST; + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValue* g_value_array_get_nth (GValueArray *value_array, + guint index_); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_new (guint n_prealloced); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +void g_value_array_free (GValueArray *value_array); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_copy (const GValueArray *value_array); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_prepend (GValueArray *value_array, + const GValue *value); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_append (GValueArray *value_array, + const GValue *value); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_insert (GValueArray *value_array, + guint index_, + const GValue *value); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_remove (GValueArray *value_array, + guint index_); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +GValueArray* g_value_array_sort (GValueArray *value_array, + GCompareFunc compare_func); + +GLIB_DEPRECATED_IN_2_32_FOR(GArray) +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..05a436a --- /dev/null +++ b/gobject/gvaluecollector.h @@ -0,0 +1,256 @@ +/* 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 + * @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 actual values collected + */ +/** + * GTypeCValue: + * @v_int: the field for holding integer values + * @v_long: the field for holding long integer values + * @v_int64: the field for holding 64 bit integer values + * @v_double: the field for holding floating point values + * @v_pointer: the field for holding pointers + * + * 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); \ + const 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 + +#define G_VALUE_COLLECT_SKIP(_value_type, var_args) \ +G_STMT_START { \ + GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \ + const gchar *_collect_format = _vtable->collect_format; \ + \ + while (*_collect_format) \ + { \ + switch (*_collect_format++) \ + { \ + case G_VALUE_COLLECT_INT: \ + va_arg ((var_args), gint); \ + break; \ + case G_VALUE_COLLECT_LONG: \ + va_arg ((var_args), glong); \ + break; \ + case G_VALUE_COLLECT_INT64: \ + va_arg ((var_args), gint64); \ + break; \ + case G_VALUE_COLLECT_DOUBLE: \ + va_arg ((var_args), gdouble); \ + break; \ + case G_VALUE_COLLECT_POINTER: \ + va_arg ((var_args), gpointer); \ + break; \ + default: \ + g_assert_not_reached (); \ + } \ + } \ +} 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); \ + const 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..054250c --- /dev/null +++ b/gobject/gvaluetransform.c @@ -0,0 +1,435 @@ +/* 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 "gtype-private.h" +#include "genums.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); +DEFINE_CAST (uint64_float, v_uint64, gfloat, v_float); +DEFINE_CAST (uint64_double, v_uint64, gdouble, v_double); +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_ulong); +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 && v_flags); + + 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..799dfdd --- /dev/null +++ b/gobject/gvaluetypes.c @@ -0,0 +1,1447 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 1997-1999, 2000-2001 Tim Janik and Red Hat, Inc. + * Copyright © 2010 Christian Persch + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public 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 "gtype-private.h" +#include "gvaluecollector.h" +#include "gobject.h" +#include "gparam.h" +#include "gboxed.h" +#include "genums.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; +} + +static void +value_free_variant (GValue *value) +{ + if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) && + value->data[0].v_pointer) + g_variant_unref (value->data[0].v_pointer); +} + +static void +value_copy_variant (const GValue *src_value, + GValue *dest_value) +{ + if (src_value->data[0].v_pointer) + dest_value->data[0].v_pointer = g_variant_ref_sink (src_value->data[0].v_pointer); + else + dest_value->data[0].v_pointer = NULL; +} + +static gchar* +value_collect_variant (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_variant_ref_sink (collect_values[0].v_pointer); + + return NULL; +} + +static gchar* +value_lcopy_variant (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + GVariant **variant_p = collect_values[0].v_pointer; + + if (!variant_p) + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + + if (!value->data[0].v_pointer) + *variant_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *variant_p = value->data[0].v_pointer; + else + *variant_p = g_variant_ref_sink (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); + } + + /* G_TYPE_VARIANT + */ + { + static const GTypeValueTable value_table = { + value_init_pointer, /* value_init */ + value_free_variant, /* value_free */ + value_copy_variant, /* value_copy */ + value_peek_pointer0, /* value_peek_pointer */ + "p", /* collect_format */ + value_collect_variant, /* collect_value */ + "p", /* lcopy_format */ + value_lcopy_variant, /* lcopy_value */ + }; + info.value_table = &value_table; + type = g_type_register_fundamental (G_TYPE_VARIANT, g_intern_static_string ("GVariant"), &info, &finfo, 0); + g_assert (type == G_TYPE_VARIANT); + } +} + + +/* --- 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. + * Deprecated: 2.32: This function's input type is broken, see g_value_set_schar() + */ +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 + * + * Do not use this function; it is broken on platforms where the %char + * type is unsigned, such as ARM and PowerPC. See g_value_get_schar(). + * + * Get the contents of a %G_TYPE_CHAR #GValue. + * + * Returns: character contents of @value + * Deprecated: 2.32: This function's return type is broken, see g_value_get_schar() + */ +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_schar: + * @value: a valid #GValue of type %G_TYPE_CHAR + * @v_char: signed 8 bit integer to be set + * + * Set the contents of a %G_TYPE_CHAR #GValue to @v_char. + * + * Since: 2.32 + */ +void +g_value_set_schar (GValue *value, + gint8 v_char) +{ + g_return_if_fail (G_VALUE_HOLDS_CHAR (value)); + + value->data[0].v_int = v_char; +} + +/** + * g_value_get_schar: + * @value: a valid #GValue of type %G_TYPE_CHAR + * + * Get the contents of a %G_TYPE_CHAR #GValue. + * + * Returns: signed 8 bit integer contents of @value + * Since: 2.32 + */ +gint8 +g_value_get_schar (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: (allow-none): 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: (allow-none): 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: (allow-none): 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: (allow-none): 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 + */ +const 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: (transfer none): 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; +} + +G_DEFINE_POINTER_TYPE (GType, g_gtype) + +/** + * 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_pointer = GSIZE_TO_POINTER (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 GPOINTER_TO_SIZE (value->data[0].v_pointer); +} + +/** + * g_value_set_variant: + * @value: a valid #GValue of type %G_TYPE_VARIANT + * @variant: (allow-none): a #GVariant, or %NULL + * + * Set the contents of a variant #GValue to @variant. + * If the variant is floating, it is consumed. + * + * Since: 2.26 + */ +void +g_value_set_variant (GValue *value, + GVariant *variant) +{ + GVariant *old_variant; + + g_return_if_fail (G_VALUE_HOLDS_VARIANT (value)); + + old_variant = value->data[0].v_pointer; + + if (variant) + value->data[0].v_pointer = g_variant_ref_sink (variant); + else + value->data[0].v_pointer = NULL; + + if (old_variant) + g_variant_unref (old_variant); +} + +/** + * g_value_take_variant: + * @value: a valid #GValue of type %G_TYPE_VARIANT + * @variant: (allow-none): a #GVariant, or %NULL + * + * Set the contents of a variant #GValue to @variant, and takes over + * the ownership of the caller's reference to @variant; + * the caller doesn't have to unref it any more (i.e. the reference + * count of the variant is not increased). + * + * If @variant was floating then its floating reference is converted to + * a hard reference. + * + * If you want the #GValue to hold its own reference to @variant, use + * g_value_set_variant() instead. + * + * This is an internal function introduced mainly for C marshallers. + * + * Since: 2.26 + */ +void +g_value_take_variant (GValue *value, + GVariant *variant) +{ + GVariant *old_variant; + + g_return_if_fail (G_VALUE_HOLDS_VARIANT (value)); + + old_variant = value->data[0].v_pointer; + + if (variant) + value->data[0].v_pointer = g_variant_take_ref (variant); + else + value->data[0].v_pointer = NULL; + + if (old_variant) + g_variant_unref (old_variant); +} + +/** + * g_value_get_variant: + * @value: a valid #GValue of type %G_TYPE_VARIANT + * + * Get the contents of a variant #GValue. + * + * Returns: variant contents of @value + * + * Since: 2.26 + */ +GVariant* +g_value_get_variant (const GValue *value) +{ + g_return_val_if_fail (G_VALUE_HOLDS_VARIANT (value), NULL); + + return value->data[0].v_pointer; +} + +/** + * g_value_dup_variant: + * @value: a valid #GValue of type %G_TYPE_VARIANT + * + * Get the contents of a variant #GValue, increasing its refcount. + * + * Returns: variant contents of @value, should be unrefed using + * g_variant_unref() when no longer needed + * + * Since: 2.26 + */ +GVariant* +g_value_dup_variant (const GValue *value) +{ + GVariant *variant; + + g_return_val_if_fail (G_VALUE_HOLDS_VARIANT (value), NULL); + + variant = value->data[0].v_pointer; + if (variant) + g_variant_ref_sink (variant); + + return variant; +} + +/** + * 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 = G_VALUE_INIT; + 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 (value, G_TYPE_STRV)) + { + GStrv strv = g_value_get_boxed (value); + GString *tmp = g_string_new ("["); + + while (*strv != NULL) + { + gchar *escaped = g_strescape (*strv, NULL); + + g_string_append_printf (tmp, "\"%s\"", escaped); + g_free (escaped); + + if (*++strv != NULL) + g_string_append (tmp, ", "); + } + + g_string_append (tmp, "]"); + contents = g_string_free (tmp, FALSE); + } + 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) +{ + 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; +} diff --git a/gobject/gvaluetypes.h b/gobject/gvaluetypes.h new file mode 100644 index 0000000..5fb42ad --- /dev/null +++ b/gobject/gvaluetypes.h @@ -0,0 +1,302 @@ +/* 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 + */ +#ifndef __G_VALUETYPES_H__ +#define __G_VALUETYPES_H__ + +#if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) +#error "Only can be included directly." +#endif + +#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)) +/** + * G_VALUE_HOLDS_VARIANT: + * @value: a valid #GValue structure + * + * Checks whether the given #GValue can hold values of type %G_TYPE_VARIANT. + * + * Returns: %TRUE on success. + * + * Since: 2.26 + */ +#define G_VALUE_HOLDS_VARIANT(value) (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_VARIANT)) + + +/* --- prototypes --- */ +GLIB_DEPRECATED_IN_2_32_FOR(g_value_set_schar) +void g_value_set_char (GValue *value, + gchar v_char); +GLIB_DEPRECATED_IN_2_32_FOR(g_value_get_schar) +gchar g_value_get_char (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_schar (GValue *value, + gint8 v_char); +GLIB_AVAILABLE_IN_ALL +gint8 g_value_get_schar (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_uchar (GValue *value, + guchar v_uchar); +GLIB_AVAILABLE_IN_ALL +guchar g_value_get_uchar (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_boolean (GValue *value, + gboolean v_boolean); +GLIB_AVAILABLE_IN_ALL +gboolean g_value_get_boolean (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_int (GValue *value, + gint v_int); +GLIB_AVAILABLE_IN_ALL +gint g_value_get_int (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_uint (GValue *value, + guint v_uint); +GLIB_AVAILABLE_IN_ALL +guint g_value_get_uint (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_long (GValue *value, + glong v_long); +GLIB_AVAILABLE_IN_ALL +glong g_value_get_long (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_ulong (GValue *value, + gulong v_ulong); +GLIB_AVAILABLE_IN_ALL +gulong g_value_get_ulong (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_int64 (GValue *value, + gint64 v_int64); +GLIB_AVAILABLE_IN_ALL +gint64 g_value_get_int64 (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_uint64 (GValue *value, + guint64 v_uint64); +GLIB_AVAILABLE_IN_ALL +guint64 g_value_get_uint64 (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_float (GValue *value, + gfloat v_float); +GLIB_AVAILABLE_IN_ALL +gfloat g_value_get_float (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_double (GValue *value, + gdouble v_double); +GLIB_AVAILABLE_IN_ALL +gdouble g_value_get_double (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_string (GValue *value, + const gchar *v_string); +GLIB_AVAILABLE_IN_ALL +void g_value_set_static_string (GValue *value, + const gchar *v_string); +GLIB_AVAILABLE_IN_ALL +const gchar * g_value_get_string (const GValue *value); +GLIB_AVAILABLE_IN_ALL +gchar* g_value_dup_string (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_pointer (GValue *value, + gpointer v_pointer); +GLIB_AVAILABLE_IN_ALL +gpointer g_value_get_pointer (const GValue *value); +GLIB_AVAILABLE_IN_ALL +GType g_gtype_get_type (void); +GLIB_AVAILABLE_IN_ALL +void g_value_set_gtype (GValue *value, + GType v_gtype); +GLIB_AVAILABLE_IN_ALL +GType g_value_get_gtype (const GValue *value); +GLIB_AVAILABLE_IN_ALL +void g_value_set_variant (GValue *value, + GVariant *variant); +GLIB_AVAILABLE_IN_ALL +void g_value_take_variant (GValue *value, + GVariant *variant); +GLIB_AVAILABLE_IN_ALL +GVariant* g_value_get_variant (const GValue *value); +GLIB_AVAILABLE_IN_ALL +GVariant* g_value_dup_variant (const GValue *value); + + +/* Convenience for registering new pointer types */ +GLIB_AVAILABLE_IN_ALL +GType g_pointer_type_register_static (const gchar *name); + +/* debugging aid, describe value contents as string */ +GLIB_AVAILABLE_IN_ALL +gchar* g_strdup_value_contents (const GValue *value); + + +GLIB_AVAILABLE_IN_ALL +void g_value_take_string (GValue *value, + gchar *v_string); +GLIB_DEPRECATED_FOR(g_value_take_string) +void g_value_set_string_take_ownership (GValue *value, + gchar *v_string); + + +/* 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..fbd4879 --- /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..3f5af9b --- /dev/null +++ b/gobject/makefile.msc.in @@ -0,0 +1,83 @@ +## 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 \ + 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 + +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/marshal-genstrings.pl b/gobject/marshal-genstrings.pl new file mode 100644 index 0000000..93fceb4 --- /dev/null +++ b/gobject/marshal-genstrings.pl @@ -0,0 +1,9 @@ +#!/usr/bin/perl + +open (List, "gmarshal.list"); + +while () { + next unless /^[A-Z]/; + s/^/"g_cclosure_marshal_/; s/:/__/; s/,/_/g; s/$/",/; + print; +} diff --git a/gobject/tests/.gitignore b/gobject/tests/.gitignore new file mode 100644 index 0000000..30fcd41 --- /dev/null +++ b/gobject/tests/.gitignore @@ -0,0 +1,13 @@ +binding +boxed +dynamictests +enums +ifaceproperties +param +properties +qdata +reference +signals +threadtests +valuearray +marshalers.[ch] diff --git a/gobject/tests/Makefile.am b/gobject/tests/Makefile.am new file mode 100644 index 0000000..28bd09d --- /dev/null +++ b/gobject/tests/Makefile.am @@ -0,0 +1,45 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + -g \ + -DG_LOG_DOMAIN=\"GLib-GObject\" \ + $(gobject_INCLUDES) \ + $(GLIB_DEBUG_FLAGS) + +if CROSS_COMPILING + glib_genmarshal=$(GLIB_GENMARSHAL) +else + glib_genmarshal=$(top_builddir)/gobject/glib-genmarshal +endif + +noinst_PROGRAMS = $(TEST_PROGS) +LDADD = ../libgobject-2.0.la $(top_builddir)/gthread/libgthread-2.0.la $(top_builddir)/glib/libglib-2.0.la + +TEST_PROGS += \ + qdata \ + boxed \ + enums \ + param \ + signals \ + threadtests \ + dynamictests \ + binding \ + properties \ + reference \ + ifaceproperties \ + valuearray + +signals_SOURCES = signals.c marshalers.c + +marshalers.h: Makefile.am marshalers.list + $(AM_V_GEN) $(glib_genmarshal) --prefix=test $(srcdir)/marshalers.list --header --valist-marshallers > marshalers.h + +marshalers.c: Makefile.am marshalers.list + $(AM_V_GEN) (echo "#include \"marshalers.h\""; $(glib_genmarshal) --prefix=test $(srcdir)/marshalers.list --body --valist-marshallers) > $@.tmp && mv $@.tmp $@ + +BUILT_SOURCES = marshalers.h marshalers.c +CLEANFILES = marshalers.h marshalers.c + +ifaceproperties_SOURCES = ifaceproperties.c testcommon.h + +EXTRA_DIST += marshalers.list diff --git a/gobject/tests/binding.c b/gobject/tests/binding.c new file mode 100644 index 0000000..b6dcdbb --- /dev/null +++ b/gobject/tests/binding.c @@ -0,0 +1,591 @@ +#include +#include +#include + +typedef struct _BindingSource +{ + GObject parent_instance; + + gint foo; + gint bar; + gdouble value; + gboolean toggle; +} BindingSource; + +typedef struct _BindingSourceClass +{ + GObjectClass parent_class; +} BindingSourceClass; + +enum +{ + PROP_SOURCE_0, + + PROP_SOURCE_FOO, + PROP_SOURCE_BAR, + PROP_SOURCE_VALUE, + PROP_SOURCE_TOGGLE +}; + +static GType binding_source_get_type (void); +G_DEFINE_TYPE (BindingSource, binding_source, G_TYPE_OBJECT); + +static void +binding_source_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + BindingSource *source = (BindingSource *) gobject; + + switch (prop_id) + { + case PROP_SOURCE_FOO: + source->foo = g_value_get_int (value); + break; + + case PROP_SOURCE_BAR: + source->bar = g_value_get_int (value); + break; + + case PROP_SOURCE_VALUE: + source->value = g_value_get_double (value); + break; + + case PROP_SOURCE_TOGGLE: + source->toggle = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +binding_source_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + BindingSource *source = (BindingSource *) gobject; + + switch (prop_id) + { + case PROP_SOURCE_FOO: + g_value_set_int (value, source->foo); + break; + + case PROP_SOURCE_BAR: + g_value_set_int (value, source->bar); + break; + + case PROP_SOURCE_VALUE: + g_value_set_double (value, source->value); + break; + + case PROP_SOURCE_TOGGLE: + g_value_set_boolean (value, source->toggle); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +binding_source_class_init (BindingSourceClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = binding_source_set_property; + gobject_class->get_property = binding_source_get_property; + + g_object_class_install_property (gobject_class, PROP_SOURCE_FOO, + g_param_spec_int ("foo", "Foo", "Foo", + -1, 100, + 0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_SOURCE_BAR, + g_param_spec_int ("bar", "Bar", "Bar", + -1, 100, + 0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_SOURCE_VALUE, + g_param_spec_double ("value", "Value", "Value", + -100.0, 200.0, + 0.0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_SOURCE_TOGGLE, + g_param_spec_boolean ("toggle", "Toggle", "Toggle", + FALSE, + G_PARAM_READWRITE)); +} + +static void +binding_source_init (BindingSource *self) +{ +} + +typedef struct _BindingTarget +{ + GObject parent_instance; + + gint bar; + gdouble value; + gboolean toggle; +} BindingTarget; + +typedef struct _BindingTargetClass +{ + GObjectClass parent_class; +} BindingTargetClass; + +enum +{ + PROP_TARGET_0, + + PROP_TARGET_BAR, + PROP_TARGET_VALUE, + PROP_TARGET_TOGGLE +}; + +static GType binding_target_get_type (void); +G_DEFINE_TYPE (BindingTarget, binding_target, G_TYPE_OBJECT); + +static void +binding_target_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + BindingTarget *target = (BindingTarget *) gobject; + + switch (prop_id) + { + case PROP_TARGET_BAR: + target->bar = g_value_get_int (value); + break; + + case PROP_TARGET_VALUE: + target->value = g_value_get_double (value); + break; + + case PROP_TARGET_TOGGLE: + target->toggle = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +binding_target_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + BindingTarget *target = (BindingTarget *) gobject; + + switch (prop_id) + { + case PROP_TARGET_BAR: + g_value_set_int (value, target->bar); + break; + + case PROP_TARGET_VALUE: + g_value_set_double (value, target->value); + break; + + case PROP_TARGET_TOGGLE: + g_value_set_boolean (value, target->toggle); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + } +} + +static void +binding_target_class_init (BindingTargetClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = binding_target_set_property; + gobject_class->get_property = binding_target_get_property; + + g_object_class_install_property (gobject_class, PROP_TARGET_BAR, + g_param_spec_int ("bar", "Bar", "Bar", + -1, 100, + 0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_TARGET_VALUE, + g_param_spec_double ("value", "Value", "Value", + -100.0, 200.0, + 0.0, + G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_TARGET_TOGGLE, + g_param_spec_boolean ("toggle", "Toggle", "Toggle", + FALSE, + G_PARAM_READWRITE)); +} + +static void +binding_target_init (BindingTarget *self) +{ +} + +static gboolean +celsius_to_fahrenheit (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer user_data G_GNUC_UNUSED) +{ + gdouble celsius, fahrenheit; + + g_assert (G_VALUE_HOLDS (source_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (target_value, G_TYPE_DOUBLE)); + + celsius = g_value_get_double (source_value); + fahrenheit = (9 * celsius / 5) + 32.0; + + if (g_test_verbose ()) + g_print ("Converting %.2fC to %.2fF\n", celsius, fahrenheit); + + g_value_set_double (target_value, fahrenheit); + + return TRUE; +} + +static gboolean +fahrenheit_to_celsius (GBinding *binding, + const GValue *source_value, + GValue *target_value, + gpointer user_data G_GNUC_UNUSED) +{ + gdouble celsius, fahrenheit; + + g_assert (G_VALUE_HOLDS (source_value, G_TYPE_DOUBLE)); + g_assert (G_VALUE_HOLDS (target_value, G_TYPE_DOUBLE)); + + fahrenheit = g_value_get_double (source_value); + celsius = 5 * (fahrenheit - 32.0) / 9; + + if (g_test_verbose ()) + g_print ("Converting %.2fF to %.2fC\n", fahrenheit, celsius); + + g_value_set_double (target_value, celsius); + + return TRUE; +} + +static void +binding_default (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "foo", + target, "bar", + G_BINDING_DEFAULT); + + g_assert ((BindingSource *) g_binding_get_source (binding) == source); + g_assert ((BindingTarget *) g_binding_get_target (binding) == target); + g_assert_cmpstr (g_binding_get_source_property (binding), ==, "foo"); + g_assert_cmpstr (g_binding_get_target_property (binding), ==, "bar"); + g_assert_cmpint (g_binding_get_flags (binding), ==, G_BINDING_DEFAULT); + + g_object_set (source, "foo", 42, NULL); + g_assert_cmpint (source->foo, ==, target->bar); + + g_object_set (target, "bar", 47, NULL); + g_assert_cmpint (source->foo, !=, target->bar); + + g_object_unref (binding); + + g_object_set (source, "foo", 0, NULL); + g_assert_cmpint (source->foo, !=, target->bar); + + g_object_unref (source); + g_object_unref (target); +} + +static void +binding_bidirectional (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "foo", + target, "bar", + G_BINDING_BIDIRECTIONAL); + + g_object_set (source, "foo", 42, NULL); + g_assert_cmpint (source->foo, ==, target->bar); + + g_object_set (target, "bar", 47, NULL); + g_assert_cmpint (source->foo, ==, target->bar); + + g_object_unref (binding); + + g_object_set (source, "foo", 0, NULL); + g_assert_cmpint (source->foo, !=, target->bar); + + g_object_unref (source); + g_object_unref (target); +} + +static void +data_free (gpointer data) +{ + gboolean *b = data; + + *b = TRUE; +} + +static void +binding_transform_default (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding; + gpointer src, trg; + gchar *src_prop, *trg_prop; + GBindingFlags flags; + + binding = g_object_bind_property (source, "foo", + target, "value", + G_BINDING_BIDIRECTIONAL); + + g_object_get (binding, + "source", &src, + "source-property", &src_prop, + "target", &trg, + "target-property", &trg_prop, + "flags", &flags, + NULL); + g_assert (src == source); + g_assert (trg == target); + g_assert_cmpstr (src_prop, ==, "foo"); + g_assert_cmpstr (trg_prop, ==, "value"); + g_assert_cmpint (flags, ==, G_BINDING_BIDIRECTIONAL); + g_object_unref (src); + g_object_unref (trg); + g_free (src_prop); + g_free (trg_prop); + + g_object_set (source, "foo", 24, NULL); + g_assert_cmpfloat (target->value, ==, 24.0); + + g_object_set (target, "value", 69.0, NULL); + g_assert_cmpint (source->foo, ==, 69); + + g_object_unref (target); + g_object_unref (source); +} + +static void +binding_transform (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding G_GNUC_UNUSED; + gboolean unused_data = FALSE; + + binding = g_object_bind_property_full (source, "value", + target, "value", + G_BINDING_BIDIRECTIONAL, + celsius_to_fahrenheit, + fahrenheit_to_celsius, + &unused_data, data_free); + + g_object_set (source, "value", 24.0, NULL); + g_assert_cmpfloat (target->value, ==, ((9 * 24.0 / 5) + 32.0)); + + g_object_set (target, "value", 69.0, NULL); + g_assert_cmpfloat (source->value, ==, (5 * (69.0 - 32.0) / 9)); + + g_object_unref (source); + g_object_unref (target); + + g_assert (unused_data); +} + +static void +binding_transform_closure (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), NULL); + GBinding *binding G_GNUC_UNUSED; + gboolean unused_data_1 = FALSE, unused_data_2 = FALSE; + GClosure *c2f_clos, *f2c_clos; + + c2f_clos = g_cclosure_new (G_CALLBACK (celsius_to_fahrenheit), &unused_data_1, (GClosureNotify) data_free); + + f2c_clos = g_cclosure_new (G_CALLBACK (fahrenheit_to_celsius), &unused_data_2, (GClosureNotify) data_free); + + binding = g_object_bind_property_with_closures (source, "value", + target, "value", + G_BINDING_BIDIRECTIONAL, + c2f_clos, + f2c_clos); + + g_object_set (source, "value", 24.0, NULL); + g_assert_cmpfloat (target->value, ==, ((9 * 24.0 / 5) + 32.0)); + + g_object_set (target, "value", 69.0, NULL); + g_assert_cmpfloat (source->value, ==, (5 * (69.0 - 32.0) / 9)); + + g_object_unref (source); + g_object_unref (target); + + g_assert (unused_data_1); + g_assert (unused_data_2); +} + +static void +binding_chain (void) +{ + BindingSource *a = g_object_new (binding_source_get_type (), NULL); + BindingSource *b = g_object_new (binding_source_get_type (), NULL); + BindingSource *c = g_object_new (binding_source_get_type (), NULL); + GBinding *binding_1, *binding_2; + + g_test_bug ("621782"); + + /* A -> B, B -> C */ + binding_1 = g_object_bind_property (a, "foo", b, "foo", G_BINDING_BIDIRECTIONAL); + binding_2 = g_object_bind_property (b, "foo", c, "foo", G_BINDING_BIDIRECTIONAL); + + /* verify the chain */ + g_object_set (a, "foo", 42, NULL); + g_assert_cmpint (a->foo, ==, b->foo); + g_assert_cmpint (b->foo, ==, c->foo); + + /* unbind A -> B and B -> C */ + g_object_unref (binding_1); + g_object_unref (binding_2); + + /* bind A -> C directly */ + binding_2 = g_object_bind_property (a, "foo", c, "foo", G_BINDING_BIDIRECTIONAL); + + /* verify the chain is broken */ + g_object_set (a, "foo", 47, NULL); + g_assert_cmpint (a->foo, !=, b->foo); + g_assert_cmpint (a->foo, ==, c->foo); + + g_object_unref (a); + g_object_unref (b); + g_object_unref (c); +} + +static void +binding_sync_create (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), + "foo", 42, + NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), + "bar", 47, + NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "foo", + target, "bar", + G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); + + g_assert_cmpint (source->foo, ==, 42); + g_assert_cmpint (target->bar, ==, 42); + + g_object_set (source, "foo", 47, NULL); + g_assert_cmpint (source->foo, ==, target->bar); + + g_object_unref (binding); + + g_object_set (target, "bar", 49, NULL); + + binding = g_object_bind_property (source, "foo", + target, "bar", + G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE); + g_assert_cmpint (source->foo, ==, 47); + g_assert_cmpint (target->bar, ==, 47); + + g_object_unref (source); + g_object_unref (target); +} + +static void +binding_invert_boolean (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), + "toggle", TRUE, + NULL); + BindingTarget *target = g_object_new (binding_target_get_type (), + "toggle", FALSE, + NULL); + GBinding *binding; + + binding = g_object_bind_property (source, "toggle", + target, "toggle", + G_BINDING_BIDIRECTIONAL | G_BINDING_INVERT_BOOLEAN); + + g_assert (source->toggle); + g_assert (!target->toggle); + + g_object_set (source, "toggle", FALSE, NULL); + g_assert (!source->toggle); + g_assert (target->toggle); + + g_object_set (target, "toggle", FALSE, NULL); + g_assert (source->toggle); + g_assert (!target->toggle); + + g_object_unref (binding); + g_object_unref (source); + g_object_unref (target); +} + +static void +binding_same_object (void) +{ + BindingSource *source = g_object_new (binding_source_get_type (), + "foo", 100, + "bar", 50, + NULL); + GBinding *binding G_GNUC_UNUSED; + + binding = g_object_bind_property (source, "foo", + source, "bar", + G_BINDING_BIDIRECTIONAL); + + g_object_set (source, "foo", 10, NULL); + g_assert_cmpint (source->foo, ==, 10); + g_assert_cmpint (source->bar, ==, 10); + g_object_set (source, "bar", 30, NULL); + g_assert_cmpint (source->foo, ==, 30); + g_assert_cmpint (source->bar, ==, 30); + + g_object_unref (source); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/binding/default", binding_default); + g_test_add_func ("/binding/bidirectional", binding_bidirectional); + g_test_add_func ("/binding/transform", binding_transform); + g_test_add_func ("/binding/transform-default", binding_transform_default); + g_test_add_func ("/binding/transform-closure", binding_transform_closure); + g_test_add_func ("/binding/chain", binding_chain); + g_test_add_func ("/binding/sync-create", binding_sync_create); + g_test_add_func ("/binding/invert-boolean", binding_invert_boolean); + g_test_add_func ("/binding/same-object", binding_same_object); + + return g_test_run (); +} diff --git a/gobject/tests/boxed.c b/gobject/tests/boxed.c new file mode 100644 index 0000000..7b764c2 --- /dev/null +++ b/gobject/tests/boxed.c @@ -0,0 +1,533 @@ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include + +typedef struct _MyBoxed MyBoxed; + +struct _MyBoxed +{ + gint ivalue; + gchar *bla; +}; + +static gpointer +my_boxed_copy (gpointer orig) +{ + MyBoxed *a = orig; + MyBoxed *b; + + b = g_slice_new (MyBoxed); + b->ivalue = a->ivalue; + b->bla = g_strdup (a->bla); + + return b; +} + +static gint my_boxed_free_count; + +static void +my_boxed_free (gpointer orig) +{ + MyBoxed *a = orig; + + g_free (a->bla); + g_slice_free (MyBoxed, a); + + my_boxed_free_count++; +} + +static GType my_boxed_get_type (void); +#define MY_TYPE_BOXED (my_boxed_get_type ()) + +G_DEFINE_BOXED_TYPE (MyBoxed, my_boxed, my_boxed_copy, my_boxed_free) + +static void +test_define_boxed (void) +{ + MyBoxed a; + MyBoxed *b; + + a.ivalue = 20; + a.bla = g_strdup ("bla"); + + b = g_boxed_copy (MY_TYPE_BOXED, &a); + + g_assert_cmpint (b->ivalue, ==, 20); + g_assert_cmpstr (b->bla, ==, "bla"); + + g_boxed_free (MY_TYPE_BOXED, b); + + g_free (a.bla); +} + +static void +test_boxed_ownership (void) +{ + GValue value = G_VALUE_INIT; + static MyBoxed boxed = { 10, "bla" }; + + g_value_init (&value, MY_TYPE_BOXED); + + my_boxed_free_count = 0; + + g_value_set_static_boxed (&value, &boxed); + g_value_reset (&value); + + g_assert_cmpint (my_boxed_free_count, ==, 0); + + g_value_set_boxed_take_ownership (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed)); + g_value_reset (&value); + g_assert_cmpint (my_boxed_free_count, ==, 1); + + g_value_take_boxed (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed)); + g_value_reset (&value); + g_assert_cmpint (my_boxed_free_count, ==, 2); + + g_value_set_boxed (&value, &boxed); + g_value_reset (&value); + g_assert_cmpint (my_boxed_free_count, ==, 3); +} + +static void +my_callback (gpointer user_data) +{ +} + +static gint destroy_count; + +static void +my_closure_notify (gpointer user_data, GClosure *closure) +{ + destroy_count++; +} + +static void +test_boxed_closure (void) +{ + GClosure *closure; + GClosure *closure2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_CLOSURE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + closure = g_cclosure_new (G_CALLBACK (my_callback), "bla", my_closure_notify); + g_value_take_boxed (&value, closure); + + closure2 = g_value_get_boxed (&value); + g_assert (closure2 == closure); + + closure2 = g_value_dup_boxed (&value); + g_assert (closure2 == closure); /* closures use ref/unref for copy/free */ + g_closure_unref (closure2); + + g_value_unset (&value); + g_assert_cmpint (destroy_count, ==, 1); +} + +static void +test_boxed_date (void) +{ + GDate *date; + GDate *date2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_DATE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + date = g_date_new_dmy (1, 3, 1970); + g_value_take_boxed (&value, date); + + date2 = g_value_get_boxed (&value); + g_assert (date2 == date); + + date2 = g_value_dup_boxed (&value); + g_assert (date2 != date); + g_assert (g_date_compare (date, date2) == 0); + g_date_free (date2); + + g_value_unset (&value); +} + +static void +test_boxed_value (void) +{ + GValue value1 = G_VALUE_INIT; + GValue *value2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_VALUE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + g_value_init (&value1, G_TYPE_INT); + g_value_set_int (&value1, 26); + + g_value_set_static_boxed (&value, &value1); + + value2 = g_value_get_boxed (&value); + g_assert (value2 == &value1); + + value2 = g_value_dup_boxed (&value); + g_assert (value2 != &value1); + g_assert (G_VALUE_HOLDS_INT (value2)); + g_assert_cmpint (g_value_get_int (value2), ==, 26); + g_boxed_free (G_TYPE_VALUE, value2); + + g_value_unset (&value); +} + +static void +test_boxed_string (void) +{ + GString *v; + GString *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_GSTRING); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_string_new ("bla"); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 != v); + g_assert (g_string_equal (v, v2)); + g_string_free (v2, TRUE); + + g_value_unset (&value); +} + +static void +test_boxed_hashtable (void) +{ + GHashTable *v; + GHashTable *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_HASH_TABLE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_hash_table_new (g_str_hash, g_str_equal); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 == v); /* hash tables use ref/unref for copy/free */ + g_hash_table_unref (v2); + + g_value_unset (&value); +} + +static void +test_boxed_array (void) +{ + GArray *v; + GArray *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_ARRAY); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_array_new (TRUE, FALSE, 1); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 == v); /* arrays use ref/unref for copy/free */ + g_array_unref (v2); + + g_value_unset (&value); +} + +static void +test_boxed_ptrarray (void) +{ + GPtrArray *v; + GPtrArray *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_PTR_ARRAY); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_ptr_array_new (); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 == v); /* ptr arrays use ref/unref for copy/free */ + g_ptr_array_unref (v2); + + g_value_unset (&value); +} + +static void +test_boxed_regex (void) +{ + GRegex *v; + GRegex *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_REGEX); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_regex_new ("a+b+", 0, 0, NULL); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 == v); /* regexes use ref/unref for copy/free */ + g_regex_unref (v2); + + g_value_unset (&value); +} + +static void +test_boxed_matchinfo (void) +{ + GRegex *r; + GMatchInfo *info, *info2; + gboolean ret; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_MATCH_INFO); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + r = g_regex_new ("ab", 0, 0, NULL); + ret = g_regex_match (r, "blabla abab bla", 0, &info); + g_assert (ret); + g_value_take_boxed (&value, info); + + info2 = g_value_get_boxed (&value); + g_assert (info == info2); + + info2 = g_value_dup_boxed (&value); + g_assert (info == info2); /* matchinfo uses ref/unref for copy/free */ + g_match_info_unref (info2); + + g_value_unset (&value); + g_regex_unref (r); +} + +static void +test_boxed_varianttype (void) +{ + GVariantType *v; + GVariantType *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_VARIANT_TYPE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_variant_type_new ("mas"); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 != v); + g_assert_cmpstr (g_variant_type_peek_string (v), ==, g_variant_type_peek_string (v2)); + g_variant_type_free (v2); + + g_value_unset (&value); +} + +static void +test_boxed_datetime (void) +{ + GDateTime *v; + GDateTime *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_DATE_TIME); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_date_time_new_now_local (); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 == v); /* datetime uses ref/unref for copy/free */ + g_date_time_unref (v2); + + g_value_unset (&value); +} + +static void +test_boxed_error (void) +{ + GError *v; + GError *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_ERROR); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_error_new_literal (G_VARIANT_PARSE_ERROR, + G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG, + "Too damn big"); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v2 == v); + + v2 = g_value_dup_boxed (&value); + g_assert (v2 != v); + g_assert_cmpint (v->domain, ==, v2->domain); + g_assert_cmpint (v->code, ==, v2->code); + g_assert_cmpstr (v->message, ==, v2->message); + g_error_free (v2); + + g_value_unset (&value); +} + +static void +test_boxed_keyfile (void) +{ + GKeyFile *k, *k2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_KEY_FILE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + k = g_key_file_new (); + g_value_take_boxed (&value, k); + + k2 = g_value_get_boxed (&value); + g_assert (k == k2); + + k2 = g_value_dup_boxed (&value); + g_assert (k == k2); /* keyfile uses ref/unref for copy/free */ + g_key_file_unref (k2); + + g_value_unset (&value); +} + +static void +test_boxed_mainloop (void) +{ + GMainLoop *l, *l2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_MAIN_LOOP); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + l = g_main_loop_new (NULL, FALSE); + g_value_take_boxed (&value, l); + + l2 = g_value_get_boxed (&value); + g_assert (l == l2); + + l2 = g_value_dup_boxed (&value); + g_assert (l == l2); /* mainloop uses ref/unref for copy/free */ + g_main_loop_unref (l2); + + g_value_unset (&value); +} + +static void +test_boxed_maincontext (void) +{ + GMainContext *c, *c2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_MAIN_CONTEXT); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + c = g_main_context_new (); + g_value_take_boxed (&value, c); + + c2 = g_value_get_boxed (&value); + g_assert (c == c2); + + c2 = g_value_dup_boxed (&value); + g_assert (c == c2); /* maincontext uses ref/unref for copy/free */ + g_main_context_unref (c2); + + g_value_unset (&value); +} + +static void +test_boxed_source (void) +{ + GSource *s, *s2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_SOURCE); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + s = g_idle_source_new (); + g_value_take_boxed (&value, s); + + s2 = g_value_get_boxed (&value); + g_assert (s == s2); + + s2 = g_value_dup_boxed (&value); + g_assert (s == s2); /* source uses ref/unref for copy/free */ + g_source_unref (s2); + + g_value_unset (&value); +} + +static void +test_boxed_variantbuilder (void) +{ + GVariantBuilder *v, *v2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_VARIANT_BUILDER); + g_assert (G_VALUE_HOLDS_BOXED (&value)); + + v = g_variant_builder_new (G_VARIANT_TYPE_OBJECT_PATH_ARRAY); + g_value_take_boxed (&value, v); + + v2 = g_value_get_boxed (&value); + g_assert (v == v2); + + v2 = g_value_dup_boxed (&value); + g_assert (v == v2); /* variantbuilder uses ref/unref for copy/free */ + g_variant_builder_unref (v2); + + g_value_unset (&value); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/boxed/define", test_define_boxed); + g_test_add_func ("/boxed/ownership", test_boxed_ownership); + g_test_add_func ("/boxed/closure", test_boxed_closure); + g_test_add_func ("/boxed/date", test_boxed_date); + g_test_add_func ("/boxed/value", test_boxed_value); + g_test_add_func ("/boxed/string", test_boxed_string); + g_test_add_func ("/boxed/hashtable", test_boxed_hashtable); + g_test_add_func ("/boxed/array", test_boxed_array); + g_test_add_func ("/boxed/ptrarray", test_boxed_ptrarray); + g_test_add_func ("/boxed/regex", test_boxed_regex); + g_test_add_func ("/boxed/varianttype", test_boxed_varianttype); + g_test_add_func ("/boxed/error", test_boxed_error); + g_test_add_func ("/boxed/datetime", test_boxed_datetime); + g_test_add_func ("/boxed/matchinfo", test_boxed_matchinfo); + g_test_add_func ("/boxed/keyfile", test_boxed_keyfile); + g_test_add_func ("/boxed/mainloop", test_boxed_mainloop); + g_test_add_func ("/boxed/maincontext", test_boxed_maincontext); + g_test_add_func ("/boxed/source", test_boxed_source); + g_test_add_func ("/boxed/variantbuilder", test_boxed_variantbuilder); + + return g_test_run (); +} diff --git a/gobject/tests/dynamictests.c b/gobject/tests/dynamictests.c new file mode 100644 index 0000000..a052e1a --- /dev/null +++ b/gobject/tests/dynamictests.c @@ -0,0 +1,367 @@ +/* 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; +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; +} + + +static 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; +}; + +static GType dynamic_object_get_type (void); +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); + g_assert (module != NULL); + + /* 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_new ("test", ref_unref_thread, (gpointer) DYNAMIC_OBJECT_TYPE); + } + + /* execute threads */ + g_mutex_unlock (&sync_mutex); + + for (i = 0; i < N_THREADS; i++) { + g_thread_join (threads[i]); + } +} + +enum +{ + PROP_0, + PROP_FOO +}; + +typedef struct _DynObj DynObj; +typedef struct _DynObjClass DynObjClass; +typedef struct _DynIfaceInterface DynIfaceInterface; + +struct _DynObj +{ + GObject obj; + + gint foo; +}; + +struct _DynObjClass +{ + GObjectClass class; +}; + +struct _DynIfaceInterface +{ + GTypeInterface iface; +}; + +static void dyn_obj_iface_init (DynIfaceInterface *iface); + +static GType dyn_iface_get_type (void); +G_DEFINE_INTERFACE (DynIface, dyn_iface, G_TYPE_OBJECT) + +static GType dyn_obj_get_type (void); +G_DEFINE_DYNAMIC_TYPE_EXTENDED(DynObj, dyn_obj, G_TYPE_OBJECT, 0, + G_IMPLEMENT_INTERFACE_DYNAMIC(dyn_iface_get_type (), dyn_obj_iface_init)) + + +static void +dyn_iface_default_init (DynIfaceInterface *iface) +{ + g_object_interface_install_property (iface, + g_param_spec_int ("foo", NULL, NULL, 0, 100, 0, G_PARAM_READWRITE)); +} + +static void +dyn_obj_iface_init (DynIfaceInterface *iface) +{ +} + +static void +dyn_obj_init (DynObj *obj) +{ + obj->foo = 0; +} + +static void +set_prop (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + DynObj *obj = (DynObj *)object; + + switch (prop_id) + { + case PROP_FOO: + obj->foo = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_prop (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + DynObj *obj = (DynObj *)object; + + switch (prop_id) + { + case PROP_FOO: + g_value_set_int (value, obj->foo); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +dyn_obj_class_init (DynObjClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = set_prop; + object_class->get_property = get_prop; + + g_object_class_override_property (object_class, PROP_FOO, "foo"); +} + +static void +dyn_obj_class_finalize (DynObjClass *class) +{ +} + +static void +mod_register (GTypeModule *module) +{ + dyn_obj_register_type (module); +} + +static void +test_dynamic_interface_properties (void) +{ + GTypeModule *module; + DynObj *obj; + gint val; + + module = test_module_new (mod_register); + g_assert (module != NULL); + + obj = g_object_new (dyn_obj_get_type (), "foo", 1, NULL); + g_object_get (obj, "foo", &val, NULL); + g_assert_cmpint (val, ==, 1); + + g_object_unref (obj); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/GObject/threaded-dynamic-ref-unref-init", test_multithreaded_dynamic_type_init); + g_test_add_func ("/GObject/dynamic-interface-properties", test_dynamic_interface_properties); + + return g_test_run(); +} diff --git a/gobject/tests/enums.c b/gobject/tests/enums.c new file mode 100644 index 0000000..2d05d4b --- /dev/null +++ b/gobject/tests/enums.c @@ -0,0 +1,124 @@ +#include + +static const GEnumValue my_enum_values[] = +{ + { 1, "the first value", "one" }, + { 2, "the second value", "two" }, + { 3, "the third value", "three" }, + { 0, NULL, NULL } +}; + +static void +test_enum_basic (void) +{ + GType type; + GEnumClass *class; + GEnumValue *val; + GValue value = G_VALUE_INIT; + + type = g_enum_register_static ("MyEnum", my_enum_values); + + g_value_init (&value, type); + g_assert (G_VALUE_HOLDS_ENUM (&value)); + + g_value_set_enum (&value, 2); + g_assert_cmpint (g_value_get_enum (&value), ==, 2); + g_value_unset (&value); + + class = g_type_class_ref (type); + + g_assert_cmpint (class->minimum, ==, 1); + g_assert_cmpint (class->maximum, ==, 3); + g_assert_cmpint (class->n_values, ==, 3); + + val = g_enum_get_value (class, 2); + g_assert (val != NULL); + g_assert_cmpstr (val->value_name, ==, "the second value"); + val = g_enum_get_value (class, 15); + g_assert (val == NULL); + + val = g_enum_get_value_by_name (class, "the third value"); + g_assert (val != NULL); + g_assert_cmpint (val->value, ==, 3); + val = g_enum_get_value_by_name (class, "the color purple"); + g_assert (val == NULL); + + val = g_enum_get_value_by_nick (class, "one"); + g_assert (val != NULL); + g_assert_cmpint (val->value, ==, 1); + val = g_enum_get_value_by_nick (class, "purple"); + g_assert (val == NULL); +} + +static const GFlagsValue my_flag_values[] = +{ + { 0, "no flags", "none" }, + { 1, "the first flag", "one" }, + { 2, "the second flag", "two" }, + { 8, "the third flag", "three" }, + { 0, NULL, NULL } +}; + +static void +test_flags_transform_to_string (const GValue *value) +{ + GValue tmp = G_VALUE_INIT; + + g_value_init (&tmp, G_TYPE_STRING); + g_value_transform (value, &tmp); + g_value_unset (&tmp); +} + +static void +test_flags_basic (void) +{ + GType type; + GFlagsClass *class; + GFlagsValue *val; + GValue value = G_VALUE_INIT; + + type = g_flags_register_static ("MyFlags", my_flag_values); + + g_value_init (&value, type); + g_assert (G_VALUE_HOLDS_FLAGS (&value)); + + g_value_set_flags (&value, 2|8); + g_assert_cmpint (g_value_get_flags (&value), ==, 2|8); + + class = g_type_class_ref (type); + + g_assert_cmpint (class->mask, ==, 1|2|8); + g_assert_cmpint (class->n_values, ==, 4); + + val = g_flags_get_first_value (class, 2|8); + g_assert (val != NULL); + g_assert_cmpstr (val->value_name, ==, "the second flag"); + val = g_flags_get_first_value (class, 16); + g_assert (val == NULL); + + val = g_flags_get_value_by_name (class, "the third flag"); + g_assert (val != NULL); + g_assert_cmpint (val->value, ==, 8); + val = g_flags_get_value_by_name (class, "the color purple"); + g_assert (val == NULL); + + val = g_flags_get_value_by_nick (class, "one"); + g_assert (val != NULL); + g_assert_cmpint (val->value, ==, 1); + val = g_flags_get_value_by_nick (class, "purple"); + g_assert (val == NULL); + + test_flags_transform_to_string (&value); + g_value_unset (&value); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/enum/basic", test_enum_basic); + g_test_add_func ("/flags/basic", test_flags_basic); + + return g_test_run (); +} diff --git a/gobject/tests/ifaceproperties.c b/gobject/tests/ifaceproperties.c new file mode 100644 index 0000000..1fba57e --- /dev/null +++ b/gobject/tests/ifaceproperties.c @@ -0,0 +1,648 @@ +/* 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. + */ + +#include +#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 (void); +static GType derived_object_get_type (void); + +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 = G_VALUE_INIT; + GValue value2 = G_VALUE_INIT; + 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); +} + +/* Test setting and getting the properties */ +static void +test_set (void) +{ + BaseObject *object; + gint val1, val2, val3, val4; + + object = g_object_new (DERIVED_TYPE_OBJECT, NULL); + + 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); + + g_object_unref (object); +} + +/* Test that the right spec is passed on explicit notifications */ +static void +test_notify (void) +{ + BaseObject *object; + + object = g_object_new (DERIVED_TYPE_OBJECT, NULL); + + 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)); + + g_object_unref (object); +} + +/* Test g_object_class_find_property() for overridden properties */ +static void +test_find_overridden (void) +{ + GObjectClass *object_class; + + object_class = g_type_class_peek (DERIVED_TYPE_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 */ +static void +test_list_overridden (void) +{ + GObjectClass *object_class; + GParamSpec **properties; + guint n_properties; + + object_class = g_type_class_peek (DERIVED_TYPE_OBJECT); + + 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() */ +static void +test_find_interface (void) +{ + TestIfaceClass *iface; + + iface = g_type_default_interface_peek (TEST_TYPE_IFACE); + + g_assert (g_object_interface_find_property (iface, "prop1") == iface_spec1); + g_assert (g_object_interface_find_property (iface, "prop2") == iface_spec2); + g_assert (g_object_interface_find_property (iface, "prop3") == iface_spec3); +} + +/* Test g_object_interface_list_properties() */ +static void +test_list_interface (void) +{ + TestIfaceClass *iface; + GParamSpec **properties; + guint n_properties; + + iface = g_type_default_interface_peek (TEST_TYPE_IFACE); + + properties = g_object_interface_list_properties (iface, &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); +} + +/* Base2Object, which implements the interface but fails + * to override some of its properties + */ +#define BASE2_TYPE_OBJECT (base2_object_get_type ()) +#define BASE2_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BASE2_TYPE_OBJECT, Base2Object)) + +typedef struct _Base2Object Base2Object; +typedef struct _Base2ObjectClass Base2ObjectClass; + +static void +base2_object_test_iface_init (TestIfaceClass *iface) +{ +} + +enum { + BASE2_PROP_0, + BASE2_PROP1, + BASE2_PROP2 +}; + +struct _Base2Object +{ + GObject parent_instance; +}; + +struct _Base2ObjectClass +{ + GObjectClass parent_class; +}; + +static GType base2_object_get_type (void); +G_DEFINE_TYPE_WITH_CODE (Base2Object, base2_object, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (TEST_TYPE_IFACE, + base2_object_test_iface_init)) + +static void +base2_object_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + case BASE2_PROP1: + g_value_set_int (value, 0); + break; + case BASE2_PROP2: + g_value_set_int (value, 0); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +base2_object_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (prop_id) + { + case BASE2_PROP1: + break; + case BASE2_PROP2: + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +base2_object_class_init (Base2ObjectClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + + object_class->set_property = base2_object_set_property; + object_class->get_property = base2_object_get_property; + + g_object_class_override_property (object_class, BASE2_PROP1, "prop1"); + g_object_class_override_property (object_class, BASE2_PROP2, "prop2"); +} + +static void +base2_object_init (Base2Object *object) +{ +} + +static void +test_not_overridden (void) +{ + Base2Object *object; + + if (!g_test_undefined ()) + return; + + g_test_bug ("637738"); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*Base2Object doesn't implement property 'prop3' from interface 'TestIface'*"); + object = g_object_new (BASE2_TYPE_OBJECT, NULL); + g_test_assert_expected_messages (); + + g_object_unref (object); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/interface/properties/set", test_set); + g_test_add_func ("/interface/properties/notify", test_notify); + g_test_add_func ("/interface/properties/find-overridden", test_find_overridden); + g_test_add_func ("/interface/properties/list-overridden", test_list_overridden); + g_test_add_func ("/interface/properties/find-interface", test_find_interface); + g_test_add_func ("/interface/properties/list-interface", test_list_interface); + g_test_add_func ("/interface/properties/not-overridden", test_not_overridden); + + return g_test_run (); +} diff --git a/gobject/tests/marshalers.list b/gobject/tests/marshalers.list new file mode 100644 index 0000000..19167ea --- /dev/null +++ b/gobject/tests/marshalers.list @@ -0,0 +1,3 @@ +VOID:INT,BOOLEAN,CHAR,UCHAR,UINT,LONG,ULONG,ENUM,FLAGS,FLOAT,DOUBLE,STRING,PARAM,BOXED,POINTER,OBJECT,VARIANT,INT64,UINT64 +INT:VOID +UINT:VOID diff --git a/gobject/tests/param.c b/gobject/tests/param.c new file mode 100644 index 0000000..0c9edab --- /dev/null +++ b/gobject/tests/param.c @@ -0,0 +1,803 @@ +#define GLIB_DISABLE_DEPRECATION_WARNINGS +#include +#include + +static void +test_param_value (void) +{ + GParamSpec *p, *p2; + GParamSpec *pp; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_PARAM); + g_assert (G_VALUE_HOLDS_PARAM (&value)); + + p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE); + + g_value_take_param (&value, p); + p2 = g_value_get_param (&value); + g_assert (p2 == p); + + pp = g_param_spec_uint ("my-uint", "My UInt", "Blurb", 0, 10, 5, G_PARAM_READWRITE); + g_value_set_param (&value, pp); + + p2 = g_value_dup_param (&value); + g_assert (p2 == pp); /* param specs use ref/unref for copy/free */ + g_param_spec_unref (p2); + + g_value_unset (&value); + g_param_spec_unref (pp); +} + +static gint destroy_count; + +static void +my_destroy (gpointer data) +{ + destroy_count++; +} + +static void +test_param_qdata (void) +{ + GParamSpec *p; + gchar *bla; + GQuark q; + + q = g_quark_from_string ("bla"); + + p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE); + g_param_spec_set_qdata (p, q, "bla"); + bla = g_param_spec_get_qdata (p, q); + g_assert_cmpstr (bla, ==, "bla"); + + g_assert_cmpint (destroy_count, ==, 0); + g_param_spec_set_qdata_full (p, q, "bla", my_destroy); + g_param_spec_set_qdata_full (p, q, "blabla", my_destroy); + g_assert_cmpint (destroy_count, ==, 1); + g_assert_cmpstr (g_param_spec_steal_qdata (p, q), ==, "blabla"); + g_assert_cmpint (destroy_count, ==, 1); + g_assert (g_param_spec_get_qdata (p, q) == NULL); + + g_param_spec_ref_sink (p); + + g_param_spec_unref (p); +} + +static void +test_param_validate (void) +{ + GParamSpec *p; + GValue value = G_VALUE_INIT; + + p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE); + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, 100); + g_assert (!g_param_value_defaults (p, &value)); + g_assert (g_param_value_validate (p, &value)); + g_assert_cmpint (g_value_get_int (&value), ==, 20); + + g_param_value_set_default (p, &value); + g_assert (g_param_value_defaults (p, &value)); + g_assert_cmpint (g_value_get_int (&value), ==, 10); + + g_param_spec_unref (p); +} + +static void +test_param_strings (void) +{ + GParamSpec *p; + + /* test canonicalization */ + p = g_param_spec_int ("my_int:bla", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE); + + g_assert_cmpstr (g_param_spec_get_name (p), ==, "my-int-bla"); + g_assert_cmpstr (g_param_spec_get_nick (p), ==, "My Int"); + g_assert_cmpstr (g_param_spec_get_blurb (p), ==, "Blurb"); + + g_param_spec_unref (p); + + /* test nick defaults to name */ + p = g_param_spec_int ("my-int", NULL, NULL, 0, 20, 10, G_PARAM_READWRITE); + + g_assert_cmpstr (g_param_spec_get_name (p), ==, "my-int"); + g_assert_cmpstr (g_param_spec_get_nick (p), ==, "my-int"); + g_assert (g_param_spec_get_blurb (p) == NULL); + + g_param_spec_unref (p); +} + +static void +test_param_convert (void) +{ + GParamSpec *p; + GValue v1 = G_VALUE_INIT; + GValue v2 = G_VALUE_INIT; + + p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE); + g_value_init (&v1, G_TYPE_UINT); + g_value_set_uint (&v1, 43); + + g_value_init (&v2, G_TYPE_INT); + g_value_set_int (&v2, -4); + + g_assert (!g_param_value_convert (p, &v1, &v2, TRUE)); + g_assert_cmpint (g_value_get_int (&v2), ==, -4); + + g_assert (g_param_value_convert (p, &v1, &v2, FALSE)); + g_assert_cmpint (g_value_get_int (&v2), ==, 20); + + g_param_spec_unref (p); +} + +static void +test_value_transform (void) +{ + GValue src = G_VALUE_INIT; + GValue dest = G_VALUE_INIT; + +#define CHECK_INT_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_INT, type)); \ + g_value_init (&src, G_TYPE_INT); \ + g_value_init (&dest, type); \ + g_value_set_int (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + /* Keep a check for an integer in the range of 0-127 so we're + * still testing g_value_get_char(). See + * https://bugzilla.gnome.org/show_bug.cgi?id=659870 + * for why it is broken. + */ + CHECK_INT_CONVERSION(G_TYPE_CHAR, char, 124) + + CHECK_INT_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_INT_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_INT_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_INT_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_INT_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_INT_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_INT_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_INT_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_INT_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_INT_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_INT_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_INT_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_INT_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_INT_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_UINT_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_UINT, type)); \ + g_value_init (&src, G_TYPE_UINT); \ + g_value_init (&dest, type); \ + g_value_set_uint (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpuint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_UINT_CONVERSION(G_TYPE_CHAR, char, 124) + CHECK_UINT_CONVERSION(G_TYPE_CHAR, char, 124) + CHECK_UINT_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_UINT_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_UINT_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_UINT_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_UINT_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_UINT_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_UINT_CONVERSION(G_TYPE_LONG, long, 12345678) + CHECK_UINT_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_UINT_CONVERSION(G_TYPE_INT64, int64, 12345678) + CHECK_UINT_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_UINT_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_UINT_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_LONG_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_LONG, type)); \ + g_value_init (&src, G_TYPE_LONG); \ + g_value_init (&dest, type); \ + g_value_set_long (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_LONG_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_LONG_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_LONG_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_LONG_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_LONG_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_LONG_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_LONG_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_LONG_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_LONG_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_LONG_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_LONG_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_LONG_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_LONG_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_LONG_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_ULONG_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_ULONG, type)); \ + g_value_init (&src, G_TYPE_ULONG); \ + g_value_init (&dest, type); \ + g_value_set_ulong (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpuint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_ULONG_CONVERSION(G_TYPE_CHAR, char, 124) + CHECK_ULONG_CONVERSION(G_TYPE_CHAR, char, 124) + CHECK_ULONG_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_ULONG_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_ULONG_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_ULONG_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_ULONG_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_ULONG_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_ULONG_CONVERSION(G_TYPE_LONG, long, 12345678) + CHECK_ULONG_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_ULONG_CONVERSION(G_TYPE_INT64, int64, 12345678) + CHECK_ULONG_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_ULONG_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_ULONG_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_INT64_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_INT64, type)); \ + g_value_init (&src, G_TYPE_INT64); \ + g_value_init (&dest, type); \ + g_value_set_int64 (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_INT64_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_INT64_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_INT64_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_INT64_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_INT64_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_INT64_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_INT64_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_INT64_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_INT64_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_INT64_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_INT64_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_INT64_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_INT64_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_INT64_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_UINT64_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_UINT64, type)); \ + g_value_init (&src, G_TYPE_UINT64); \ + g_value_init (&dest, type); \ + g_value_set_uint64 (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpuint (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_UINT64_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_UINT64_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_UINT64_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_UINT64_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_UINT64_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_UINT64_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_UINT64_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_UINT64_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_UINT64_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_UINT64_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_UINT64_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_UINT64_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_UINT64_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_UINT64_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_FLOAT_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_FLOAT, type)); \ + g_value_init (&src, G_TYPE_FLOAT); \ + g_value_init (&dest, type); \ + g_value_set_float (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpfloat (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_FLOAT_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_FLOAT_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_FLOAT_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_FLOAT_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_FLOAT_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_FLOAT_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_FLOAT_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_FLOAT_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_FLOAT_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_FLOAT_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_FLOAT_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_FLOAT_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_FLOAT_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_FLOAT_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_DOUBLE_CONVERSION(type, getter, value) \ + g_assert (g_value_type_transformable (G_TYPE_DOUBLE, type)); \ + g_value_init (&src, G_TYPE_DOUBLE); \ + g_value_init (&dest, type); \ + g_value_set_double (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpfloat (g_value_get_##getter (&dest), ==, value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_DOUBLE_CONVERSION(G_TYPE_CHAR, schar, -124) + CHECK_DOUBLE_CONVERSION(G_TYPE_CHAR, schar, 124) + CHECK_DOUBLE_CONVERSION(G_TYPE_UCHAR, uchar, 0) + CHECK_DOUBLE_CONVERSION(G_TYPE_UCHAR, uchar, 255) + CHECK_DOUBLE_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_DOUBLE_CONVERSION(G_TYPE_INT, int, 12345) + CHECK_DOUBLE_CONVERSION(G_TYPE_UINT, uint, 0) + CHECK_DOUBLE_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_DOUBLE_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_DOUBLE_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_DOUBLE_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_DOUBLE_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_DOUBLE_CONVERSION(G_TYPE_FLOAT, float, 12345678) + CHECK_DOUBLE_CONVERSION(G_TYPE_DOUBLE, double, 12345678) + +#define CHECK_BOOLEAN_CONVERSION(type, setter, value) \ + g_assert (g_value_type_transformable (type, G_TYPE_BOOLEAN)); \ + g_value_init (&src, type); \ + g_value_init (&dest, G_TYPE_BOOLEAN); \ + g_value_set_##setter (&src, value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpint (g_value_get_boolean (&dest), ==, TRUE); \ + g_value_set_##setter (&src, 0); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpint (g_value_get_boolean (&dest), ==, FALSE); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_BOOLEAN_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_BOOLEAN_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_BOOLEAN_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_BOOLEAN_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_BOOLEAN_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_BOOLEAN_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + +#define CHECK_STRING_CONVERSION(int_type, setter, int_value) \ + g_assert (g_value_type_transformable (int_type, G_TYPE_STRING)); \ + g_value_init (&src, int_type); \ + g_value_init (&dest, G_TYPE_STRING); \ + g_value_set_##setter (&src, int_value); \ + g_assert (g_value_transform (&src, &dest)); \ + g_assert_cmpstr (g_value_get_string (&dest), ==, #int_value); \ + g_value_unset (&src); \ + g_value_unset (&dest); + + CHECK_STRING_CONVERSION(G_TYPE_INT, int, -12345) + CHECK_STRING_CONVERSION(G_TYPE_UINT, uint, 12345) + CHECK_STRING_CONVERSION(G_TYPE_LONG, long, -12345678) + CHECK_STRING_CONVERSION(G_TYPE_ULONG, ulong, 12345678) + CHECK_STRING_CONVERSION(G_TYPE_INT64, int64, -12345678) + CHECK_STRING_CONVERSION(G_TYPE_UINT64, uint64, 12345678) + CHECK_STRING_CONVERSION(G_TYPE_FLOAT, float, 0.500000) + CHECK_STRING_CONVERSION(G_TYPE_DOUBLE, double, -1.234567) + + g_assert (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_CHAR)); + g_value_init (&src, G_TYPE_STRING); + g_value_init (&dest, G_TYPE_CHAR); + g_value_set_static_string (&src, "bla"); + g_value_set_schar (&dest, 'c'); + g_assert (!g_value_transform (&src, &dest)); + g_assert_cmpint (g_value_get_schar (&dest), ==, 'c'); + g_value_unset (&src); + g_value_unset (&dest); +} + + +/* We create some dummy objects with a simple relationship: + * + * GObject + * / \ + * TestObjectA TestObjectC + * | + * TestObjectB + * + * ie: TestObjectB is a subclass of TestObjectA and TestObjectC is + * related to neither. + */ + +static GType test_object_a_get_type (void); +typedef GObject TestObjectA; typedef GObjectClass TestObjectAClass; +G_DEFINE_TYPE (TestObjectA, test_object_a, G_TYPE_OBJECT); +static void test_object_a_class_init (TestObjectAClass *class) { } +static void test_object_a_init (TestObjectA *a) { } + +static GType test_object_b_get_type (void); +typedef GObject TestObjectB; typedef GObjectClass TestObjectBClass; +G_DEFINE_TYPE (TestObjectB, test_object_b, test_object_a_get_type ()); +static void test_object_b_class_init (TestObjectBClass *class) { } +static void test_object_b_init (TestObjectB *b) { } + +static GType test_object_c_get_type (void); +typedef GObject TestObjectC; typedef GObjectClass TestObjectCClass; +G_DEFINE_TYPE (TestObjectC, test_object_c, G_TYPE_OBJECT); +static void test_object_c_class_init (TestObjectCClass *class) { } +static void test_object_c_init (TestObjectC *c) { } + +/* We create an interface and programmatically populate it with + * properties of each of the above type, with various flag combinations. + * + * Properties are named like "type-perm" where type is 'a', 'b' or 'c' + * and perm is a series of characters, indicating the permissions: + * + * - 'r': readable + * - 'w': writable + * - 'c': construct + * - 'C': construct-only + * + * It doesn't make sense to have a property that is neither readable nor + * writable. It is also not valid to have construct or construct-only + * on read-only params. Finally, it is invalid to have both construct + * and construct-only specified, so we do not consider those cases. + * That gives us 7 possible permissions: + * + * 'r', 'w', 'rw', 'wc', 'rwc', 'wC', 'rwC' + * + * And 9 impossible ones: + * + * '', 'c', 'rc', 'C', 'rC', 'cC', 'rcC', 'wcC', rwcC' + * + * For a total of 16 combinations. + * + * That gives a total of 48 (16 * 3) possible flag/type combinations, of + * which 27 (9 * 3) are impossible to install. + * + * That gives 21 (7 * 3) properties that will be installed. + */ +typedef GTypeInterface TestInterfaceInterface; +static GType test_interface_get_type (void); +//typedef struct _TestInterface TestInterface; +G_DEFINE_INTERFACE (TestInterface, test_interface, G_TYPE_OBJECT) +static void +test_interface_default_init (TestInterfaceInterface *iface) +{ + const gchar *names[] = { "a", "b", "c" }; + const gchar *perms[] = { NULL, "r", "w", "rw", + NULL, NULL, "wc", "rwc", + NULL, NULL, "wC", "rwC", + NULL, NULL, NULL, NULL }; + const GType types[] = { test_object_a_get_type (), test_object_b_get_type (), test_object_c_get_type () }; + guint i, j; + + for (i = 0; i < G_N_ELEMENTS (types); i++) + for (j = 0; j < G_N_ELEMENTS (perms); j++) + { + gchar prop_name[10]; + GParamSpec *pspec; + + if (perms[j] == NULL) + { + if (!g_test_undefined ()) + continue; + + /* we think that this is impossible. make sure. */ + pspec = g_param_spec_object ("xyz", "xyz", "xyz", types[i], j); + + g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, + "*assertion*pspec->flags*failed*"); + g_object_interface_install_property (iface, pspec); + g_test_assert_expected_messages (); + + g_param_spec_unref (pspec); + continue; + } + + /* install the property */ + g_snprintf (prop_name, sizeof prop_name, "%s-%s", names[i], perms[j]); + pspec = g_param_spec_object (prop_name, prop_name, prop_name, types[i], j); + g_object_interface_install_property (iface, pspec); + } +} + +/* We now have 21 properties. Each property may be correctly + * implemented with the following types: + * + * Properties Valid Types Reason + * + * a-r a, b Read only can provide subclasses + * a-w, wc, wC a, GObject Write only can accept superclasses + * a-rw, rwc, rwC a Read-write must be exactly equal + * + * b-r b (as above) + * b-w, wc, wC b, a, GObject + * b-rw, rwc, rwC b + * + * c-r c (as above) + * c-wo, wc, wC c, GObject + * c-rw, rwc, rwC c + * + * We can express this in a 48-by-4 table where each row represents an + * installed property and each column represents a type. The value in + * the table represents if it is valid to subclass the row's property + * with the type of the column: + * + * - 0: invalid because the interface property doesn't exist (invalid flags) + * - 'v': valid + * - '=': invalid because of the type not being exactly equal + * - '<': invalid because of the type not being a subclass + * - '>': invalid because of the type not being a superclass + * + * We organise the table by interface property type ('a', 'b', 'c') then + * by interface property flags. + */ + +static gint valid_impl_types[48][4] = { + /* a b c GObject */ + /* 'a-' */ { }, + /* 'a-r' */ { 'v', 'v', '<', '<' }, + /* 'a-w' */ { 'v', '>', '>', 'v' }, + /* 'a-rw' */ { 'v', '=', '=', '=' }, + /* 'a-c */ { }, + /* 'a-rc' */ { }, + /* 'a-wc' */ { 'v', '>', '>', 'v' }, + /* 'a-rwc' */ { 'v', '=', '=', '=' }, + /* 'a-C */ { }, + /* 'a-rC' */ { }, + /* 'a-wC' */ { 'v', '>', '>', 'v' }, + /* 'a-rwC' */ { 'v', '=', '=', '=' }, + /* 'a-cC */ { }, + /* 'a-rcC' */ { }, + /* 'a-wcC' */ { }, + /* 'a-rwcC' */ { }, + + /* 'b-' */ { }, + /* 'b-r' */ { '<', 'v', '<', '<' }, + /* 'b-w' */ { 'v', 'v', '>', 'v' }, + /* 'b-rw' */ { '=', 'v', '=', '=' }, + /* 'b-c */ { }, + /* 'b-rc' */ { }, + /* 'b-wc' */ { 'v', 'v', '>', 'v' }, + /* 'b-rwc' */ { '=', 'v', '=', '=' }, + /* 'b-C */ { }, + /* 'b-rC' */ { }, + /* 'b-wC' */ { 'v', 'v', '>', 'v' }, + /* 'b-rwC' */ { '=', 'v', '=', '=' }, + /* 'b-cC */ { }, + /* 'b-rcC' */ { }, + /* 'b-wcC' */ { }, + /* 'b-rwcC' */ { }, + + /* 'c-' */ { }, + /* 'c-r' */ { '<', '<', 'v', '<' }, + /* 'c-w' */ { '>', '>', 'v', 'v' }, + /* 'c-rw' */ { '=', '=', 'v', '=' }, + /* 'c-c */ { }, + /* 'c-rc' */ { }, + /* 'c-wc' */ { '>', '>', 'v', 'v' }, + /* 'c-rwc' */ { '=', '=', 'v', '=' }, + /* 'c-C */ { }, + /* 'c-rC' */ { }, + /* 'c-wC' */ { '>', '>', 'v', 'v' }, + /* 'c-rwC' */ { '=', '=', 'v', '=' }, + /* 'c-cC */ { }, + /* 'c-rcC' */ { }, + /* 'c-wcC' */ { }, + /* 'c-rwcC' */ { } +}; + +/* We also try to change the flags. We must ensure that all + * implementations provide all functionality promised by the interface. + * We must therefore never remove readability or writability (but we can + * add them). Construct-only is a restrictions that applies to + * writability, so we can never add it unless writability was never + * present in the first place, in which case "writable at construct + * only" is still better than "not writable". + * + * The 'construct' flag is of interest only to the implementation. It + * may be changed at any time. + * + * Properties Valid Access Reason + * + * *-r r, rw, rwc, rwC Must keep readable, but can restrict newly-added writable + * *-w w, rw, rwc Must keep writable unrestricted + * *-rw rw, rwc Must not add any restrictions + * *-rwc rw, rwc Must not add any restrictions + * *-rwC rw, rwc, rwC Can remove 'construct-only' restriction + * *-wc rwc, rw, w, wc Can add readability + * *-wC rwC, rw, w, wC Can add readability or remove 'construct only' restriction + * rwc, wc + * + * We can represent this with a 16-by-16 table. The rows represent the + * flags of the property on the interface. The columns is the flags to + * try to use when overriding the property. The cell contents are: + * + * - 0: invalid because the interface property doesn't exist (invalid flags) + * - 'v': valid + * - 'i': invalid because the implementation flags are invalid + * - 'f': invalid because of the removal of functionality + * - 'r': invalid because of the addition of restrictions (ie: construct-only) + * + * We also ensure that removal of functionality is reported before + * addition of restrictions, since this is a more basic problem. + */ +static gint valid_impl_flags[16][16] = { + /* '' r w rw c rc wc rwc C rC wC rwC cC rcC wcC rwcC */ + /* '*-' */ { }, + /* '*-r' */ { 'i', 'v', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'i', 'i' }, + /* '*-w' */ { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'i', 'i' }, + /* '*-rw' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'i', 'i' }, + /* '*-c */ { }, + /* '*-rc' */ { }, + /* '*-wc' */ { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'r', 'r', 'i', 'i', 'i', 'i' }, + /* '*-rwc' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'r', 'i', 'i', 'i', 'i' }, + /* '*-C */ { }, + /* '*-rC' */ { }, + /* '*-wC' */ { 'i', 'f', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'v', 'v', 'i', 'i', 'i', 'i' }, + /* '*-rwC' */ { 'i', 'f', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'f', 'v', 'i', 'i', 'i', 'i' }, +}; + +static guint change_this_flag; +static guint change_this_type; +static guint use_this_flag; +static guint use_this_type; + +typedef GObjectClass TestImplementationClass; +typedef GObject TestImplementation; + +static void test_implementation_init (TestImplementation *impl) { } +static void test_implementation_iface_init (TestInterfaceInterface *iface) { } + +static GType test_implementation_get_type (void); +G_DEFINE_TYPE_WITH_CODE (TestImplementation, test_implementation, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (test_interface_get_type (), test_implementation_iface_init)) + +static void test_implementation_class_init (TestImplementationClass *class) +{ + const gchar *names[] = { "a", "b", "c" }; + const gchar *perms[] = { NULL, "r", "w", "rw", + NULL, NULL, "wc", "rwc", + NULL, NULL, "wC", "rwC", + NULL, NULL, NULL, NULL }; + const GType types[] = { test_object_a_get_type (), test_object_b_get_type (), + test_object_c_get_type (), G_TYPE_OBJECT }; + gchar prop_name[10]; + GParamSpec *pspec; + guint i, j; + + class->get_property = GINT_TO_POINTER (1); + class->set_property = GINT_TO_POINTER (1); + + /* Install all of the non-modified properties or else GObject will + * complain about non-implemented properties. + */ + for (i = 0; i < 3; i++) + for (j = 0; j < G_N_ELEMENTS (perms); j++) + { + if (i == change_this_type && j == change_this_flag) + continue; + + if (perms[j] != NULL) + { + /* override the property without making changes */ + g_snprintf (prop_name, sizeof prop_name, "%s-%s", names[i], perms[j]); + g_object_class_override_property (class, 1, prop_name); + } + } + + /* Now try installing our modified property */ + if (perms[change_this_flag] == NULL) + g_error ("Interface property does not exist"); + + g_snprintf (prop_name, sizeof prop_name, "%s-%s", names[change_this_type], perms[change_this_flag]); + pspec = g_param_spec_object (prop_name, prop_name, prop_name, types[use_this_type], use_this_flag); + g_object_class_install_property (class, 1, pspec); +} + +static void +test_param_implement (void) +{ + /* GObject oddity: GObjectClass must be initialised before we can + * initialise a GTypeInterface. + */ + g_type_class_ref (G_TYPE_OBJECT); + + /* Bring up the interface first. */ + g_type_default_interface_ref (test_interface_get_type ()); + + for (change_this_flag = 0; change_this_flag < 16; change_this_flag++) + for (change_this_type = 0; change_this_type < 3; change_this_type++) + for (use_this_flag = 0; use_this_flag < 16; use_this_flag++) + for (use_this_type = 0; use_this_type < 4; use_this_type++) + { + if (!g_test_undefined ()) + { + /* only test the valid (defined) cases, e.g. under valgrind */ + if (valid_impl_flags[change_this_flag][use_this_flag] != 'v') + continue; + + if (valid_impl_types[change_this_type * 16 + change_this_flag][use_this_type] != 'v') + continue; + } + + if (g_test_trap_fork (G_TIME_SPAN_SECOND, G_TEST_TRAP_SILENCE_STDERR)) + { + g_type_class_ref (test_implementation_get_type ()); + exit (0); + } + + /* We want to ensure that any flags mismatch problems are reported first. */ + switch (valid_impl_flags[change_this_flag][use_this_flag]) + { + case 0: + /* make sure the other table agrees */ + g_assert (valid_impl_types[change_this_type * 16 + change_this_flag][use_this_type] == 0); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*Interface property does not exist*"); + continue; + + case 'i': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*g_object_class_install_property*"); + continue; + + case 'f': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*remove functionality*"); + continue; + + case 'r': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*introduce additional restrictions*"); + continue; + + case 'v': + break; + } + + /* Next, we check if there should have been a type error. */ + switch (valid_impl_types[change_this_type * 16 + change_this_flag][use_this_type]) + { + case 0: + /* this should have been caught above */ + g_assert_not_reached (); + + case '=': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*exactly equal*"); + continue; + + case '<': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*equal to or more restrictive*"); + continue; + + case '>': + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*equal to or less restrictive*"); + continue; + + case 'v': + break; + } + + g_test_trap_assert_passed (); + } +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/param/value", test_param_value); + g_test_add_func ("/param/strings", test_param_strings); + g_test_add_func ("/param/qdata", test_param_qdata); + g_test_add_func ("/param/validate", test_param_validate); + g_test_add_func ("/param/convert", test_param_convert); + g_test_add_func ("/param/implement", test_param_implement); + g_test_add_func ("/value/transform", test_value_transform); + + return g_test_run (); +} diff --git a/gobject/tests/properties.c b/gobject/tests/properties.c new file mode 100644 index 0000000..27c2a22 --- /dev/null +++ b/gobject/tests/properties.c @@ -0,0 +1,268 @@ +#include +#include +#include + +typedef struct _TestObject { + GObject parent_instance; + gint foo; + gboolean bar; + gchar *baz; +} TestObject; + +typedef struct _TestObjectClass { + GObjectClass parent_class; +} TestObjectClass; + +enum { PROP_0, PROP_FOO, PROP_BAR, PROP_BAZ, N_PROPERTIES }; + +static GParamSpec *properties[N_PROPERTIES] = { NULL, }; + +static GType test_object_get_type (void); +G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT); + +static void +test_object_set_foo (TestObject *obj, + gint foo) +{ + if (obj->foo != foo) + { + obj->foo = foo; + + g_assert (properties[PROP_FOO] != NULL); + g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_FOO]); + } +} + +static void +test_object_set_bar (TestObject *obj, + gboolean bar) +{ + bar = !!bar; + + if (obj->bar != bar) + { + obj->bar = bar; + + g_assert (properties[PROP_BAR] != NULL); + g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_BAR]); + } +} + +static void +test_object_set_baz (TestObject *obj, + const gchar *baz) +{ + if (g_strcmp0 (obj->baz, baz) != 0) + { + g_free (obj->baz); + obj->baz = g_strdup (baz); + + g_assert (properties[PROP_BAZ] != NULL); + g_object_notify_by_pspec (G_OBJECT (obj), properties[PROP_BAZ]); + } +} + +static void +test_object_finalize (GObject *gobject) +{ + g_free (((TestObject *) gobject)->baz); + + G_OBJECT_CLASS (test_object_parent_class)->finalize (gobject); +} + +static void +test_object_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + TestObject *tobj = (TestObject *) gobject; + + g_assert_cmpint (prop_id, !=, 0); + g_assert_cmpint (prop_id, !=, N_PROPERTIES); + g_assert (pspec == properties[prop_id]); + + switch (prop_id) + { + case PROP_FOO: + test_object_set_foo (tobj, g_value_get_int (value)); + break; + + case PROP_BAR: + test_object_set_bar (tobj, g_value_get_boolean (value)); + break; + + case PROP_BAZ: + test_object_set_baz (tobj, g_value_get_string (value)); + break; + + default: + g_assert_not_reached (); + } +} + +static void +test_object_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + TestObject *tobj = (TestObject *) gobject; + + g_assert_cmpint (prop_id, !=, 0); + g_assert_cmpint (prop_id, !=, N_PROPERTIES); + g_assert (pspec == properties[prop_id]); + + switch (prop_id) + { + case PROP_FOO: + g_value_set_int (value, tobj->foo); + break; + + case PROP_BAR: + g_value_set_boolean (value, tobj->bar); + break; + + case PROP_BAZ: + g_value_set_string (value, tobj->baz); + break; + + default: + g_assert_not_reached (); + } +} + +static void +test_object_class_init (TestObjectClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + properties[PROP_FOO] = g_param_spec_int ("foo", "Foo", "Foo", + -1, G_MAXINT, + 0, + G_PARAM_READWRITE); + properties[PROP_BAR] = g_param_spec_boolean ("bar", "Bar", "Bar", + FALSE, + G_PARAM_READWRITE); + properties[PROP_BAZ] = g_param_spec_string ("baz", "Baz", "Baz", + NULL, + G_PARAM_READWRITE); + + gobject_class->set_property = test_object_set_property; + gobject_class->get_property = test_object_get_property; + gobject_class->finalize = test_object_finalize; + + g_object_class_install_properties (gobject_class, N_PROPERTIES, properties); +} + +static void +test_object_init (TestObject *self) +{ + self->foo = 42; + self->bar = TRUE; + self->baz = g_strdup ("Hello"); +} + +static void +properties_install (void) +{ + TestObject *obj = g_object_new (test_object_get_type (), NULL); + GParamSpec *pspec; + + g_assert (properties[PROP_FOO] != NULL); + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (obj), "foo"); + g_assert (properties[PROP_FOO] == pspec); + + g_object_unref (obj); +} + +typedef struct { + const gchar *name; + GParamSpec *pspec; +} TestNotifyClosure; + +static void +on_notify (GObject *gobject, + GParamSpec *pspec, + TestNotifyClosure *clos) +{ + g_assert (clos->pspec == pspec); + g_assert_cmpstr (clos->name, ==, pspec->name); +} + +static void +properties_notify (void) +{ + TestObject *obj = g_object_new (test_object_get_type (), NULL); + TestNotifyClosure clos; + + g_assert (properties[PROP_FOO] != NULL); + + clos.name = "foo"; + clos.pspec = properties[PROP_FOO]; + + g_signal_connect (obj, "notify", G_CALLBACK (on_notify), &clos); + g_object_set (obj, "foo", 47, NULL); + + g_object_unref (obj); +} + +static void +properties_construct (void) +{ + TestObject *obj; + gint val; + gboolean b; + gchar *s; + + g_test_bug ("630357"); + + /* more than 16 args triggers a realloc in g_object_new_valist() */ + obj = g_object_new (test_object_get_type (), + "foo", 1, + "foo", 2, + "foo", 3, + "foo", 4, + "foo", 5, + "bar", FALSE, + "foo", 6, + "foo", 7, + "foo", 8, + "foo", 9, + "foo", 10, + "baz", "boo", + "foo", 11, + "foo", 12, + "foo", 13, + "foo", 14, + "foo", 15, + "foo", 16, + "foo", 17, + "foo", 18, + NULL); + + g_object_get (obj, "foo", &val, NULL); + g_assert (val == 18); + g_object_get (obj, "bar", &b, NULL); + g_assert (!b); + g_object_get (obj, "baz", &s, NULL); + g_assert_cmpstr (s, ==, "boo"); + g_free (s); + + g_object_unref (obj); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_bug_base ("http://bugzilla.gnome.org/"); + + g_test_add_func ("/properties/install", properties_install); + g_test_add_func ("/properties/notify", properties_notify); + g_test_add_func ("/properties/construct", properties_construct); + + return g_test_run (); +} diff --git a/gobject/tests/qdata.c b/gobject/tests/qdata.c new file mode 100644 index 0000000..b126579 --- /dev/null +++ b/gobject/tests/qdata.c @@ -0,0 +1,93 @@ +/* + * Copyright 2012 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 + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + +#include + +gboolean fail; + +#define THREADS 10 +#define ROUNDS 10000 + +GObject *object; +volatile gint bucket[THREADS]; + +static gpointer +thread_func (gpointer data) +{ + gint idx = GPOINTER_TO_INT (data); + gint i; + gint d; + gint value; + gint new_value; + + for (i = 0; i < ROUNDS; i++) + { + d = g_random_int_range (-10, 100); + bucket[idx] += d; +retry: + value = GPOINTER_TO_INT (g_object_get_data (object, "test")); + new_value = value + d; + if (fail) + g_object_set_data (object, "test", GINT_TO_POINTER (new_value)); + else + { + if (!g_object_replace_data (object, "test", + GINT_TO_POINTER (value), + GINT_TO_POINTER (new_value), + NULL, NULL)) + goto retry; + } + g_thread_yield (); + } + + return NULL; +} + +static void +test_qdata_threaded (void) +{ + gint sum; + gint i; + GThread *threads[THREADS]; + gint result; + + object = g_object_new (G_TYPE_OBJECT, NULL); + g_object_set_data (object, "test", GINT_TO_POINTER (0)); + + for (i = 0; i < THREADS; i++) + bucket[i] = 0; + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("qdata", thread_func, GINT_TO_POINTER (i)); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + sum = 0; + for (i = 0; i < THREADS; i++) + sum += bucket[i]; + + result = GPOINTER_TO_INT (g_object_get_data (object, "test")); + + g_assert_cmpint (sum, ==, result); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + fail = !!g_getenv ("FAIL"); + + g_test_add_func ("/qdata/threaded", test_qdata_threaded); + + return g_test_run (); +} diff --git a/gobject/tests/reference.c b/gobject/tests/reference.c new file mode 100644 index 0000000..0742339 --- /dev/null +++ b/gobject/tests/reference.c @@ -0,0 +1,616 @@ +#include + +static void +test_fundamentals (void) +{ + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_NONE)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INTERFACE)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_CHAR)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UCHAR)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_BOOLEAN)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INT)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UINT)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_LONG)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_ULONG)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_INT64)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_UINT64)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_ENUM)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_FLAGS)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_FLOAT)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_DOUBLE)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_STRING)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_POINTER)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_BOXED)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_PARAM)); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_OBJECT)); + g_assert (G_TYPE_OBJECT == g_object_get_type ()); + g_assert (G_TYPE_IS_FUNDAMENTAL (G_TYPE_VARIANT)); + g_assert (G_TYPE_IS_DERIVED (G_TYPE_INITIALLY_UNOWNED)); + + g_assert (g_type_fundamental_next () == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST)); +} + +static void +test_type_qdata (void) +{ + gchar *data; + + g_type_set_qdata (G_TYPE_ENUM, g_quark_from_string ("bla"), "bla"); + data = g_type_get_qdata (G_TYPE_ENUM, g_quark_from_string ("bla")); + g_assert_cmpstr (data, ==, "bla"); +} + +static void +test_type_query (void) +{ + GTypeQuery query; + + g_type_query (G_TYPE_ENUM, &query); + g_assert_cmpint (query.type, ==, G_TYPE_ENUM); + g_assert_cmpstr (query.type_name, ==, "GEnum"); + g_assert_cmpint (query.class_size, ==, sizeof (GEnumClass)); + g_assert_cmpint (query.instance_size, ==, 0); +} + +typedef struct _MyObject MyObject; +typedef struct _MyObjectClass MyObjectClass; +typedef struct _MyObjectClassPrivate MyObjectClassPrivate; + +struct _MyObject +{ + GObject parent_instance; + + gint count; +}; + +struct _MyObjectClass +{ + GObjectClass parent_class; +}; + +struct _MyObjectClassPrivate +{ + gint secret_class_count; +}; + +static GType my_object_get_type (void); +G_DEFINE_TYPE_WITH_CODE (MyObject, my_object, G_TYPE_OBJECT, + g_type_add_class_private (g_define_type_id, sizeof (MyObjectClassPrivate)) ); + +static void +my_object_init (MyObject *obj) +{ + obj->count = 42; +} + +static void +my_object_class_init (MyObjectClass *klass) +{ +} + +static void +test_class_private (void) +{ + GObject *obj; + MyObjectClass *class; + MyObjectClassPrivate *priv; + + obj = g_object_new (my_object_get_type (), NULL); + + class = g_type_class_ref (my_object_get_type ()); + priv = G_TYPE_CLASS_GET_PRIVATE (class, my_object_get_type (), MyObjectClassPrivate); + priv->secret_class_count = 13; + g_type_class_unref (class); + + g_object_unref (obj); + + g_assert_cmpint (g_type_qname (my_object_get_type ()), ==, g_quark_from_string ("MyObject")); +} + +static void +test_clear (void) +{ + GObject *o = NULL; + GObject *tmp; + + g_clear_object (&o); + g_assert (o == NULL); + + tmp = g_object_new (G_TYPE_OBJECT, NULL); + g_assert_cmpint (tmp->ref_count, ==, 1); + o = g_object_ref (tmp); + g_assert (o != NULL); + + g_assert_cmpint (tmp->ref_count, ==, 2); + g_clear_object (&o); + g_assert_cmpint (tmp->ref_count, ==, 1); + g_assert (o == NULL); + + g_object_unref (tmp); +} + +static void +test_clear_function (void) +{ + volatile GObject *o = NULL; + GObject *tmp; + + (g_clear_object) (&o); + g_assert (o == NULL); + + tmp = g_object_new (G_TYPE_OBJECT, NULL); + g_assert_cmpint (tmp->ref_count, ==, 1); + o = g_object_ref (tmp); + g_assert (o != NULL); + + g_assert_cmpint (tmp->ref_count, ==, 2); + (g_clear_object) (&o); + g_assert_cmpint (tmp->ref_count, ==, 1); + g_assert (o == NULL); + + g_object_unref (tmp); +} + +static void +toggle_cb (gpointer data, GObject *obj, gboolean is_last) +{ + gboolean *b = data; + + *b = TRUE; +} + +static void +test_object_value (void) +{ + GObject *v; + GObject *v2; + GValue value = G_VALUE_INIT; + gboolean toggled = FALSE; + + g_value_init (&value, G_TYPE_OBJECT); + + v = g_object_new (G_TYPE_OBJECT, NULL); + g_object_add_toggle_ref (v, toggle_cb, &toggled); + + g_value_take_object (&value, v); + + v2 = g_value_get_object (&value); + g_assert (v2 == v); + + v2 = g_value_dup_object (&value); + g_assert (v2 == v); /* objects use ref/unref for copy/free */ + g_object_unref (v2); + + g_assert (!toggled); + g_value_unset (&value); + g_assert (toggled); + + /* test the deprecated variant too */ + g_value_init (&value, G_TYPE_OBJECT); + /* get a new reference */ + g_object_ref (v); + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_value_set_object_take_ownership (&value, v); +G_GNUC_END_IGNORE_DEPRECATIONS + + toggled = FALSE; + g_value_unset (&value); + g_assert (toggled); + + g_object_remove_toggle_ref (v, toggle_cb, &toggled); +} + +static void +test_initially_unowned (void) +{ + GObject *obj; + + obj = g_object_new (G_TYPE_INITIALLY_UNOWNED, NULL); + g_assert (g_object_is_floating (obj)); + g_assert_cmpint (obj->ref_count, ==, 1); + + g_object_ref_sink (obj); + g_assert (!g_object_is_floating (obj)); + g_assert_cmpint (obj->ref_count, ==, 1); + + g_object_ref_sink (obj); + g_assert (!g_object_is_floating (obj)); + g_assert_cmpint (obj->ref_count, ==, 2); + + g_object_unref (obj); + g_assert_cmpint (obj->ref_count, ==, 1); + + g_object_force_floating (obj); + g_assert (g_object_is_floating (obj)); + g_assert_cmpint (obj->ref_count, ==, 1); + + g_object_ref_sink (obj); + g_object_unref (obj); +} + +static void +test_weak_pointer (void) +{ + GObject *obj; + gpointer weak; + gpointer weak2; + + weak = weak2 = obj = g_object_new (G_TYPE_OBJECT, NULL); + g_assert_cmpint (obj->ref_count, ==, 1); + + g_object_add_weak_pointer (obj, &weak); + g_object_add_weak_pointer (obj, &weak2); + g_assert_cmpint (obj->ref_count, ==, 1); + g_assert (weak == obj); + g_assert (weak2 == obj); + + g_object_remove_weak_pointer (obj, &weak2); + g_assert_cmpint (obj->ref_count, ==, 1); + g_assert (weak == obj); + g_assert (weak2 == obj); + + g_object_unref (obj); + g_assert (weak == NULL); + g_assert (weak2 == obj); +} + +/* See gobject/tests/threadtests.c for the threaded version */ +static void +test_weak_ref (void) +{ + GObject *obj; + GObject *obj2; + GObject *tmp; + GWeakRef weak = { { GUINT_TO_POINTER (0xDEADBEEFU) } }; + GWeakRef weak2 = { { GUINT_TO_POINTER (0xDEADBEEFU) } }; + GWeakRef weak3 = { { GUINT_TO_POINTER (0xDEADBEEFU) } }; + GWeakRef *dynamic_weak = g_new (GWeakRef, 1); + + /* you can initialize to empty like this... */ + g_weak_ref_init (&weak2, NULL); + g_assert (g_weak_ref_get (&weak2) == NULL); + + /* ... or via an initializer */ + g_weak_ref_init (&weak3, NULL); + g_assert (g_weak_ref_get (&weak3) == NULL); + + obj = g_object_new (G_TYPE_OBJECT, NULL); + g_assert_cmpint (obj->ref_count, ==, 1); + + obj2 = g_object_new (G_TYPE_OBJECT, NULL); + g_assert_cmpint (obj2->ref_count, ==, 1); + + /* you can init with an object (even if uninitialized) */ + g_weak_ref_init (&weak, obj); + g_weak_ref_init (dynamic_weak, obj); + /* or set to point at an object, if initialized (maybe to 0) */ + g_weak_ref_set (&weak2, obj); + g_weak_ref_set (&weak3, obj); + /* none of this affects its refcount */ + g_assert_cmpint (obj->ref_count, ==, 1); + + /* getting the value takes a ref */ + tmp = g_weak_ref_get (&weak); + g_assert (tmp == obj); + g_assert_cmpint (obj->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj->ref_count, ==, 1); + + tmp = g_weak_ref_get (&weak2); + g_assert (tmp == obj); + g_assert_cmpint (obj->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj->ref_count, ==, 1); + + tmp = g_weak_ref_get (&weak3); + g_assert (tmp == obj); + g_assert_cmpint (obj->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj->ref_count, ==, 1); + + tmp = g_weak_ref_get (dynamic_weak); + g_assert (tmp == obj); + g_assert_cmpint (obj->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj->ref_count, ==, 1); + + /* clearing a weak ref stops tracking */ + g_weak_ref_clear (&weak); + + /* setting a weak ref to NULL stops tracking too */ + g_weak_ref_set (&weak2, NULL); + g_assert (g_weak_ref_get (&weak2) == NULL); + g_weak_ref_clear (&weak2); + + /* setting a weak ref to a new object stops tracking the old one */ + g_weak_ref_set (dynamic_weak, obj2); + tmp = g_weak_ref_get (dynamic_weak); + g_assert (tmp == obj2); + g_assert_cmpint (obj2->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj2->ref_count, ==, 1); + + g_assert_cmpint (obj->ref_count, ==, 1); + + /* free the object: weak3 is the only one left pointing there */ + g_object_unref (obj); + g_assert (g_weak_ref_get (&weak3) == NULL); + + /* setting a weak ref to a new object stops tracking the old one */ + g_weak_ref_set (dynamic_weak, obj2); + tmp = g_weak_ref_get (dynamic_weak); + g_assert (tmp == obj2); + g_assert_cmpint (obj2->ref_count, ==, 2); + g_object_unref (tmp); + g_assert_cmpint (obj2->ref_count, ==, 1); + + g_weak_ref_clear (&weak3); + + /* clear and free dynamic_weak... */ + g_weak_ref_clear (dynamic_weak); + + /* ... to prove that doing so stops this from being a use-after-free */ + g_object_unref (obj2); + g_free (dynamic_weak); +} + +typedef struct +{ + gboolean should_be_last; + gint count; +} Count; + +static void +toggle_notify (gpointer data, + GObject *obj, + gboolean is_last) +{ + Count *c = data; + + g_assert (is_last == c->should_be_last); + + c->count++; +} + +static void +test_toggle_ref (void) +{ + GObject *obj; + Count c, c2; + + obj = g_object_new (G_TYPE_OBJECT, NULL); + + g_object_add_toggle_ref (obj, toggle_notify, &c); + g_object_add_toggle_ref (obj, toggle_notify, &c2); + + c.should_be_last = c2.should_be_last = TRUE; + c.count = c2.count = 0; + + g_object_unref (obj); + + g_assert_cmpint (c.count, ==, 0); + g_assert_cmpint (c2.count, ==, 0); + + g_object_ref (obj); + + g_assert_cmpint (c.count, ==, 0); + g_assert_cmpint (c2.count, ==, 0); + + g_object_remove_toggle_ref (obj, toggle_notify, &c2); + + g_object_unref (obj); + + g_assert_cmpint (c.count, ==, 1); + + c.should_be_last = FALSE; + + g_object_ref (obj); + + g_assert_cmpint (c.count, ==, 2); + + c.should_be_last = TRUE; + + g_object_unref (obj); + + g_assert_cmpint (c.count, ==, 3); + + g_object_remove_toggle_ref (obj, toggle_notify, &c); +} + +static gboolean destroyed; +static gint value; + +static void +data_destroy (gpointer data) +{ + g_assert_cmpint (GPOINTER_TO_INT (data), ==, value); + + destroyed = TRUE; +} + +static void +test_object_qdata (void) +{ + GObject *obj; + gpointer v; + GQuark quark; + + obj = g_object_new (G_TYPE_OBJECT, NULL); + + value = 1; + destroyed = FALSE; + g_object_set_data_full (obj, "test", GINT_TO_POINTER (1), data_destroy); + v = g_object_get_data (obj, "test"); + g_assert_cmpint (GPOINTER_TO_INT (v), ==, 1); + g_object_set_data_full (obj, "test", GINT_TO_POINTER (2), data_destroy); + g_assert (destroyed); + value = 2; + destroyed = FALSE; + v = g_object_steal_data (obj, "test"); + g_assert_cmpint (GPOINTER_TO_INT (v), ==, 2); + g_assert (!destroyed); + + value = 1; + destroyed = FALSE; + quark = g_quark_from_string ("test"); + g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (1), data_destroy); + v = g_object_get_qdata (obj, quark); + g_assert_cmpint (GPOINTER_TO_INT (v), ==, 1); + g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (2), data_destroy); + g_assert (destroyed); + value = 2; + destroyed = FALSE; + v = g_object_steal_qdata (obj, quark); + g_assert_cmpint (GPOINTER_TO_INT (v), ==, 2); + g_assert (!destroyed); + + g_object_set_qdata_full (obj, quark, GINT_TO_POINTER (3), data_destroy); + value = 3; + destroyed = FALSE; + g_object_unref (obj); + + g_assert (destroyed); +} + +typedef struct { + const gchar *value; + gint refcount; +} Value; + +static gpointer +ref_value (gpointer value, gpointer user_data) +{ + Value *v = value; + Value **old_value_p = user_data; + + if (old_value_p) + *old_value_p = v; + + if (v) + v->refcount += 1; + + return value; +} + +static void +unref_value (gpointer value) +{ + Value *v = value; + + v->refcount -= 1; + if (v->refcount == 0) + g_free (value); +} + +static +Value * +new_value (const gchar *s) +{ + Value *v; + + v = g_new (Value, 1); + v->value = s; + v->refcount = 1; + + return v; +} + +static void +test_object_qdata2 (void) +{ + GObject *obj; + Value *v, *v1, *v2, *v3, *old_val; + GDestroyNotify old_destroy; + gboolean res; + + obj = g_object_new (G_TYPE_OBJECT, NULL); + + v1 = new_value ("bla"); + + g_object_set_data_full (obj, "test", v1, unref_value); + + v = g_object_get_data (obj, "test"); + g_assert_cmpstr (v->value, ==, "bla"); + g_assert_cmpint (v->refcount, ==, 1); + + v = g_object_dup_data (obj, "test", ref_value, &old_val); + g_assert (old_val == v1); + g_assert_cmpstr (v->value, ==, "bla"); + g_assert_cmpint (v->refcount, ==, 2); + unref_value (v); + + v = g_object_dup_data (obj, "nono", ref_value, &old_val); + g_assert (old_val == NULL); + g_assert (v == NULL); + + v2 = new_value ("not"); + + res = g_object_replace_data (obj, "test", v1, v2, unref_value, &old_destroy); + g_assert (res == TRUE); + g_assert (old_destroy == unref_value); + g_assert_cmpstr (v1->value, ==, "bla"); + g_assert_cmpint (v1->refcount, ==, 1); + + v = g_object_get_data (obj, "test"); + g_assert_cmpstr (v->value, ==, "not"); + g_assert_cmpint (v->refcount, ==, 1); + + v3 = new_value ("xyz"); + res = g_object_replace_data (obj, "test", v1, v3, unref_value, &old_destroy); + g_assert (res == FALSE); + g_assert_cmpstr (v2->value, ==, "not"); + g_assert_cmpint (v2->refcount, ==, 1); + + unref_value (v1); + + res = g_object_replace_data (obj, "test", NULL, v3, unref_value, &old_destroy); + g_assert (res == FALSE); + g_assert_cmpstr (v2->value, ==, "not"); + g_assert_cmpint (v2->refcount, ==, 1); + + res = g_object_replace_data (obj, "test", v2, NULL, unref_value, &old_destroy); + g_assert (res == TRUE); + g_assert (old_destroy == unref_value); + g_assert_cmpstr (v2->value, ==, "not"); + g_assert_cmpint (v2->refcount, ==, 1); + + unref_value (v2); + + v = g_object_get_data (obj, "test"); + g_assert (v == NULL); + + res = g_object_replace_data (obj, "test", NULL, v3, unref_value, &old_destroy); + g_assert (res == TRUE); + + v = g_object_get_data (obj, "test"); + g_assert (v == v3); + + ref_value (v3, NULL); + g_assert_cmpint (v3->refcount, ==, 2); + g_object_unref (obj); + g_assert_cmpint (v3->refcount, ==, 1); + unref_value (v3); +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/type/fundamentals", test_fundamentals); + g_test_add_func ("/type/qdata", test_type_qdata); + g_test_add_func ("/type/query", test_type_query); + g_test_add_func ("/type/class-private", test_class_private); + g_test_add_func ("/object/clear", test_clear); + g_test_add_func ("/object/clear-function", test_clear_function); + g_test_add_func ("/object/value", test_object_value); + g_test_add_func ("/object/initially-unowned", test_initially_unowned); + g_test_add_func ("/object/weak-pointer", test_weak_pointer); + g_test_add_func ("/object/weak-ref", test_weak_ref); + g_test_add_func ("/object/toggle-ref", test_toggle_ref); + g_test_add_func ("/object/qdata", test_object_qdata); + g_test_add_func ("/object/qdata2", test_object_qdata2); + + return g_test_run (); +} diff --git a/gobject/tests/signals.c b/gobject/tests/signals.c new file mode 100644 index 0000000..671e168 --- /dev/null +++ b/gobject/tests/signals.c @@ -0,0 +1,862 @@ +#include +#include "marshalers.h" + +typedef enum { + TEST_ENUM_NEGATIVE = -30, + TEST_ENUM_NONE = 0, + TEST_ENUM_FOO = 1, + TEST_ENUM_BAR = 2 +} TestEnum; + +typedef enum { + TEST_UNSIGNED_ENUM_FOO = 1, + TEST_UNSIGNED_ENUM_BAR = 42 + /* Don't test 0x80000000 for now- nothing appears to do this in + * practice, and it triggers GValue/GEnum bugs on ppc64. + */ +} TestUnsignedEnum; + +static GType +test_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[] = { + { TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" }, + { TEST_ENUM_NONE, "TEST_ENUM_NONE", "none" }, + { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" }, + { TEST_ENUM_BAR, "TEST_ENUM_BAR", "bar" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("TestEnum"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +static GType +test_unsigned_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[] = { + { TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" }, + { TEST_UNSIGNED_ENUM_BAR, "TEST_UNSIGNED_ENUM_BAR", "bar" }, + { 0, NULL, NULL } + }; + GType g_define_type_id = + g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values); + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + + +static const GEnumValue my_enum_values[] = +{ + { 1, "the first value", "one" }, + { 0, NULL, NULL } +}; + +static const GFlagsValue my_flag_values[] = +{ + { 1, "the first value", "one" }, + { 0, NULL, NULL } +}; + +static GType enum_type; +static GType flags_type; + + +typedef struct _Test Test; +typedef struct _TestClass TestClass; + +struct _Test +{ + GObject parent_instance; +}; + +static void all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, gint e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64); + +struct _TestClass +{ + GObjectClass parent_class; + + void (* variant_changed) (Test *, GVariant *); + void (* all_types) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, gint e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64); + void (* all_types_null) (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, gint e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64); +}; + +static GType test_get_type (void); +G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT) + +static void +test_init (Test *test) +{ +} + +static void +test_class_init (TestClass *klass) +{ + guint s; + + enum_type = g_enum_register_static ("MyEnum", my_enum_values); + flags_type = g_flags_register_static ("MyFlag", my_flag_values); + + klass->all_types = all_types_handler; + + g_signal_new ("simple", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, + 0); + g_signal_new ("generic-marshaller-1", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, + 7, + G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_LONG, G_TYPE_POINTER, G_TYPE_DOUBLE, G_TYPE_FLOAT); + g_signal_new ("generic-marshaller-2", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, + 5, + G_TYPE_INT, test_enum_get_type(), G_TYPE_INT, test_unsigned_enum_get_type (), G_TYPE_INT); + g_signal_new ("generic-marshaller-enum-return-signed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + test_enum_get_type(), + 0); + g_signal_new ("generic-marshaller-enum-return-unsigned", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + test_unsigned_enum_get_type(), + 0); + g_signal_new ("generic-marshaller-int-return", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_INT, + 0); + s = g_signal_new ("va-marshaller-int-return", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + test_INT__VOID, + G_TYPE_INT, + 0); + g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass), + test_INT__VOIDv); + g_signal_new ("generic-marshaller-uint-return", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + NULL, + G_TYPE_UINT, + 0); + s = g_signal_new ("va-marshaller-uint-return", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + test_INT__VOID, + G_TYPE_UINT, + 0); + g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass), + test_UINT__VOIDv); + g_signal_new ("variant-changed-no-slot", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VARIANT, + G_TYPE_NONE, + 1, + G_TYPE_VARIANT); + g_signal_new ("variant-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + G_STRUCT_OFFSET (TestClass, variant_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VARIANT, + G_TYPE_NONE, + 1, + G_TYPE_VARIANT); + g_signal_new ("all-types", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestClass, all_types), + NULL, NULL, + test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64, + G_TYPE_NONE, + 19, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_CHAR, + G_TYPE_UCHAR, + G_TYPE_UINT, + G_TYPE_LONG, + G_TYPE_ULONG, + enum_type, + flags_type, + G_TYPE_FLOAT, + G_TYPE_DOUBLE, + G_TYPE_STRING, + G_TYPE_PARAM_LONG, + G_TYPE_BYTES, + G_TYPE_POINTER, + test_get_type (), + G_TYPE_VARIANT, + G_TYPE_INT64, + G_TYPE_UINT64); + s = g_signal_new ("all-types-va", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestClass, all_types), + NULL, NULL, + test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64, + G_TYPE_NONE, + 19, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_CHAR, + G_TYPE_UCHAR, + G_TYPE_UINT, + G_TYPE_LONG, + G_TYPE_ULONG, + enum_type, + flags_type, + G_TYPE_FLOAT, + G_TYPE_DOUBLE, + G_TYPE_STRING, + G_TYPE_PARAM_LONG, + G_TYPE_BYTES, + G_TYPE_POINTER, + test_get_type (), + G_TYPE_VARIANT, + G_TYPE_INT64, + G_TYPE_UINT64); + g_signal_set_va_marshaller (s, G_TYPE_FROM_CLASS (klass), + test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64v); + + g_signal_new ("all-types-generic", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestClass, all_types), + NULL, NULL, + NULL, + G_TYPE_NONE, + 19, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_CHAR, + G_TYPE_UCHAR, + G_TYPE_UINT, + G_TYPE_LONG, + G_TYPE_ULONG, + enum_type, + flags_type, + G_TYPE_FLOAT, + G_TYPE_DOUBLE, + G_TYPE_STRING, + G_TYPE_PARAM_LONG, + G_TYPE_BYTES, + G_TYPE_POINTER, + test_get_type (), + G_TYPE_VARIANT, + G_TYPE_INT64, + G_TYPE_UINT64); + g_signal_new ("all-types-null", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestClass, all_types_null), + NULL, NULL, + test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64, + G_TYPE_NONE, + 19, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_CHAR, + G_TYPE_UCHAR, + G_TYPE_UINT, + G_TYPE_LONG, + G_TYPE_ULONG, + enum_type, + flags_type, + G_TYPE_FLOAT, + G_TYPE_DOUBLE, + G_TYPE_STRING, + G_TYPE_PARAM_LONG, + G_TYPE_BYTES, + G_TYPE_POINTER, + test_get_type (), + G_TYPE_VARIANT, + G_TYPE_INT64, + G_TYPE_UINT64); + g_signal_new ("all-types-empty", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + test_VOID__INT_BOOLEAN_CHAR_UCHAR_UINT_LONG_ULONG_ENUM_FLAGS_FLOAT_DOUBLE_STRING_PARAM_BOXED_POINTER_OBJECT_VARIANT_INT64_UINT64, + G_TYPE_NONE, + 19, + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_CHAR, + G_TYPE_UCHAR, + G_TYPE_UINT, + G_TYPE_LONG, + G_TYPE_ULONG, + enum_type, + flags_type, + G_TYPE_FLOAT, + G_TYPE_DOUBLE, + G_TYPE_STRING, + G_TYPE_PARAM_LONG, + G_TYPE_BYTES, + G_TYPE_POINTER, + test_get_type (), + G_TYPE_VARIANT, + G_TYPE_INT64, + G_TYPE_UINT64); +} + +static void +test_variant_signal (void) +{ + Test *test; + GVariant *v; + + /* Tests that the signal emission consumes the variant, + * even if there are no handlers connected. + */ + + test = g_object_new (test_get_type (), NULL); + + v = g_variant_new_boolean (TRUE); + g_variant_ref (v); + g_assert (g_variant_is_floating (v)); + g_signal_emit_by_name (test, "variant-changed-no-slot", v); + g_assert (!g_variant_is_floating (v)); + g_variant_unref (v); + + v = g_variant_new_boolean (TRUE); + g_variant_ref (v); + g_assert (g_variant_is_floating (v)); + g_signal_emit_by_name (test, "variant-changed", v); + g_assert (!g_variant_is_floating (v)); + g_variant_unref (v); + + g_object_unref (test); +} + +static void +on_generic_marshaller_1 (Test *obj, + gint8 v_schar, + guint8 v_uchar, + gint v_int, + glong v_long, + gpointer v_pointer, + gdouble v_double, + gfloat v_float, + gpointer user_data) +{ + g_assert_cmpint (v_schar, ==, 42); + g_assert_cmpint (v_uchar, ==, 43); + g_assert_cmpint (v_int, ==, 4096); + g_assert_cmpint (v_long, ==, 8192); + g_assert (v_pointer == NULL); + g_assert_cmpfloat (v_double, >, 0.0); + g_assert_cmpfloat (v_double, <, 1.0); + g_assert_cmpfloat (v_float, >, 5.0); + g_assert_cmpfloat (v_float, <, 6.0); +} + +static void +test_generic_marshaller_signal_1 (void) +{ + Test *test; + test = g_object_new (test_get_type (), NULL); + + g_signal_connect (test, "generic-marshaller-1", G_CALLBACK (on_generic_marshaller_1), NULL); + + g_signal_emit_by_name (test, "generic-marshaller-1", 42, 43, 4096, 8192, NULL, 0.5, 5.5); + + g_object_unref (test); +} + +static void +on_generic_marshaller_2 (Test *obj, + gint v_int1, + TestEnum v_enum, + gint v_int2, + TestUnsignedEnum v_uenum, + gint v_int3) +{ + g_assert_cmpint (v_int1, ==, 42); + g_assert_cmpint (v_enum, ==, TEST_ENUM_BAR); + g_assert_cmpint (v_int2, ==, 43); + g_assert_cmpint (v_uenum, ==, TEST_UNSIGNED_ENUM_BAR); + g_assert_cmpint (v_int3, ==, 44); +} + +static void +test_generic_marshaller_signal_2 (void) +{ + Test *test; + test = g_object_new (test_get_type (), NULL); + + g_signal_connect (test, "generic-marshaller-2", G_CALLBACK (on_generic_marshaller_2), NULL); + + g_signal_emit_by_name (test, "generic-marshaller-2", 42, TEST_ENUM_BAR, 43, TEST_UNSIGNED_ENUM_BAR, 44); + + g_object_unref (test); +} + +static TestEnum +on_generic_marshaller_enum_return_signed_1 (Test *obj) +{ + return TEST_ENUM_NEGATIVE; +} + +static TestEnum +on_generic_marshaller_enum_return_signed_2 (Test *obj) +{ + return TEST_ENUM_BAR; +} + +static void +test_generic_marshaller_signal_enum_return_signed (void) +{ + Test *test; + guint id; + TestEnum retval = 0; + + test = g_object_new (test_get_type (), NULL); + + /* Test return value NEGATIVE */ + id = g_signal_connect (test, + "generic-marshaller-enum-return-signed", + G_CALLBACK (on_generic_marshaller_enum_return_signed_1), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval); + g_assert_cmpint (retval, ==, TEST_ENUM_NEGATIVE); + g_signal_handler_disconnect (test, id); + + /* Test return value BAR */ + retval = 0; + id = g_signal_connect (test, + "generic-marshaller-enum-return-signed", + G_CALLBACK (on_generic_marshaller_enum_return_signed_2), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-enum-return-signed", &retval); + g_assert_cmpint (retval, ==, TEST_ENUM_BAR); + g_signal_handler_disconnect (test, id); + + g_object_unref (test); +} + +static TestUnsignedEnum +on_generic_marshaller_enum_return_unsigned_1 (Test *obj) +{ + return TEST_UNSIGNED_ENUM_FOO; +} + +static TestUnsignedEnum +on_generic_marshaller_enum_return_unsigned_2 (Test *obj) +{ + return TEST_UNSIGNED_ENUM_BAR; +} + +static void +test_generic_marshaller_signal_enum_return_unsigned (void) +{ + Test *test; + guint id; + TestUnsignedEnum retval = 0; + + test = g_object_new (test_get_type (), NULL); + + /* Test return value FOO */ + id = g_signal_connect (test, + "generic-marshaller-enum-return-unsigned", + G_CALLBACK (on_generic_marshaller_enum_return_unsigned_1), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval); + g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_FOO); + g_signal_handler_disconnect (test, id); + + /* Test return value BAR */ + retval = 0; + id = g_signal_connect (test, + "generic-marshaller-enum-return-unsigned", + G_CALLBACK (on_generic_marshaller_enum_return_unsigned_2), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-enum-return-unsigned", &retval); + g_assert_cmpint (retval, ==, TEST_UNSIGNED_ENUM_BAR); + g_signal_handler_disconnect (test, id); + + g_object_unref (test); +} + +/**********************/ + +static gint +on_generic_marshaller_int_return_signed_1 (Test *obj) +{ + return -30; +} + +static gint +on_generic_marshaller_int_return_signed_2 (Test *obj) +{ + return 2; +} + +static void +test_generic_marshaller_signal_int_return (void) +{ + Test *test; + guint id; + gint retval = 0; + + test = g_object_new (test_get_type (), NULL); + + /* Test return value -30 */ + id = g_signal_connect (test, + "generic-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_1), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, -30); + g_signal_handler_disconnect (test, id); + + /* Test return value positive */ + retval = 0; + id = g_signal_connect (test, + "generic-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_2), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, 2); + g_signal_handler_disconnect (test, id); + + /* Same test for va marshaller */ + + /* Test return value -30 */ + id = g_signal_connect (test, + "va-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_1), + NULL); + g_signal_emit_by_name (test, "va-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, -30); + g_signal_handler_disconnect (test, id); + + /* Test return value positive */ + retval = 0; + id = g_signal_connect (test, + "va-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_2), + NULL); + g_signal_emit_by_name (test, "va-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, 2); + g_signal_handler_disconnect (test, id); + + g_object_unref (test); +} + +static guint +on_generic_marshaller_uint_return_1 (Test *obj) +{ + return 1; +} + +static guint +on_generic_marshaller_uint_return_2 (Test *obj) +{ + return G_MAXUINT; +} + +static void +test_generic_marshaller_signal_uint_return (void) +{ + Test *test; + guint id; + guint retval = 0; + + test = g_object_new (test_get_type (), NULL); + + id = g_signal_connect (test, + "generic-marshaller-uint-return", + G_CALLBACK (on_generic_marshaller_uint_return_1), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval); + g_assert_cmpint (retval, ==, 1); + g_signal_handler_disconnect (test, id); + + retval = 0; + id = g_signal_connect (test, + "generic-marshaller-uint-return", + G_CALLBACK (on_generic_marshaller_uint_return_2), + NULL); + g_signal_emit_by_name (test, "generic-marshaller-uint-return", &retval); + g_assert_cmpint (retval, ==, G_MAXUINT); + g_signal_handler_disconnect (test, id); + + /* Same test for va marshaller */ + + id = g_signal_connect (test, + "va-marshaller-uint-return", + G_CALLBACK (on_generic_marshaller_uint_return_1), + NULL); + g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval); + g_assert_cmpint (retval, ==, 1); + g_signal_handler_disconnect (test, id); + + retval = 0; + id = g_signal_connect (test, + "va-marshaller-uint-return", + G_CALLBACK (on_generic_marshaller_uint_return_2), + NULL); + g_signal_emit_by_name (test, "va-marshaller-uint-return", &retval); + g_assert_cmpint (retval, ==, G_MAXUINT); + g_signal_handler_disconnect (test, id); + + g_object_unref (test); +} + +static int all_type_handlers_count = 0; + +static void +all_types_handler (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, gint e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64) +{ + all_type_handlers_count++; + + g_assert_cmpint (i, ==, 42); + g_assert_cmpint (b, ==, TRUE); + g_assert_cmpint (c, ==, 17); + g_assert_cmpuint (uc, ==, 140); + g_assert_cmpuint (ui, ==, G_MAXUINT - 42); + g_assert_cmpint (l, ==, -1117); + g_assert_cmpuint (ul, ==, G_MAXULONG - 999); + g_assert_cmpint (e, ==, 1); + g_assert_cmpuint (f, ==, 0); + g_assert_cmpfloat (fl, ==, 0.25); + g_assert_cmpfloat (db, ==, 1.5); + g_assert_cmpstr (str, ==, "Test"); + g_assert_cmpstr (g_param_spec_get_nick (param), ==, "nick"); + g_assert_cmpstr (g_bytes_get_data (bytes, NULL), ==, "Blah"); + g_assert (ptr == &enum_type); + g_assert_cmpuint (g_variant_get_uint16 (var), == , 99); + g_assert_cmpint (i64, ==, G_MAXINT64 - 1234); + g_assert_cmpuint (ui64, ==, G_MAXUINT64 - 123456); +} + +static void +all_types_handler_cb (Test *test, int i, gboolean b, char c, guchar uc, guint ui, glong l, gulong ul, gint e, guint f, float fl, double db, char *str, GParamSpec *param, GBytes *bytes, gpointer ptr, Test *obj, GVariant *var, gint64 i64, guint64 ui64, gpointer user_data) +{ + g_assert (user_data == &flags_type); + all_types_handler (test, i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, obj, var, i64, ui64); +} + +static void +test_all_types (void) +{ + Test *test; + + int i = 42; + gboolean b = TRUE; + char c = 17; + guchar uc = 140; + guint ui = G_MAXUINT - 42; + glong l = -1117; + gulong ul = G_MAXULONG - 999; + gint e = 1; + guint f = 0; + float fl = 0.25; + double db = 1.5; + char *str = "Test"; + GParamSpec *param = g_param_spec_long ("param", "nick", "blurb", 0, 10, 4, 0); + GBytes *bytes = g_bytes_new_static ("Blah", 5); + gpointer ptr = &enum_type; + GVariant *var = g_variant_new_uint16 (99); + gint64 i64; + guint64 ui64; + g_variant_ref_sink (var); + i64 = G_MAXINT64 - 1234; + ui64 = G_MAXUINT64 - 123456; + + test = g_object_new (test_get_type (), NULL); + + all_type_handlers_count = 0; + + g_signal_emit_by_name (test, "all-types", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-va", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-generic", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-empty", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-null", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + + g_assert_cmpint (all_type_handlers_count, ==, 3); + + all_type_handlers_count = 0; + + g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type); + + g_signal_emit_by_name (test, "all-types", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-va", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-generic", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-empty", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-null", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + + g_assert_cmpint (all_type_handlers_count, ==, 3 + 5); + + all_type_handlers_count = 0; + + g_signal_connect (test, "all-types", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-va", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-generic", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-empty", G_CALLBACK (all_types_handler_cb), &flags_type); + g_signal_connect (test, "all-types-null", G_CALLBACK (all_types_handler_cb), &flags_type); + + g_signal_emit_by_name (test, "all-types", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-va", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-generic", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-empty", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + g_signal_emit_by_name (test, "all-types-null", + i, b, c, uc, ui, l, ul, e, f, fl, db, str, param, bytes, ptr, test, var, i64, ui64); + + g_assert_cmpint (all_type_handlers_count, ==, 3 + 5 + 5); + + g_object_unref (test); + g_param_spec_unref (param); + g_bytes_unref (bytes); + g_variant_unref (var); +} + +static void +test_connect (void) +{ + GObject *test; + gint retval; + + test = g_object_new (test_get_type (), NULL); + + g_object_connect (test, + "signal::generic-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_1), + NULL, + "object-signal::va-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_2), + NULL, + NULL); + g_signal_emit_by_name (test, "generic-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, -30); + g_signal_emit_by_name (test, "va-marshaller-int-return", &retval); + g_assert_cmpint (retval, ==, 2); + + g_object_disconnect (test, + "any-signal", + G_CALLBACK (on_generic_marshaller_int_return_signed_1), + NULL, + "any-signal::va-marshaller-int-return", + G_CALLBACK (on_generic_marshaller_int_return_signed_2), + NULL, + NULL); + + g_object_unref (test); +} + +static void +simple_handler1 (GObject *sender, + GObject *target) +{ + g_object_unref (target); +} + +static void +simple_handler2 (GObject *sender, + GObject *target) +{ + g_object_unref (target); +} + +static void +test_destroy_target_object (void) +{ + Test *sender, *target1, *target2; + + sender = g_object_new (test_get_type (), NULL); + target1 = g_object_new (test_get_type (), NULL); + target2 = g_object_new (test_get_type (), NULL); + g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler1), target1, 0); + g_signal_connect_object (sender, "simple", G_CALLBACK (simple_handler2), target2, 0); + g_signal_emit_by_name (sender, "simple"); + g_object_unref (sender); +} + +/* --- */ + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gobject/signals/all-types", test_all_types); + g_test_add_func ("/gobject/signals/variant", test_variant_signal); + g_test_add_func ("/gobject/signals/destroy-target-object", test_destroy_target_object); + g_test_add_func ("/gobject/signals/generic-marshaller-1", test_generic_marshaller_signal_1); + g_test_add_func ("/gobject/signals/generic-marshaller-2", test_generic_marshaller_signal_2); + g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-signed", test_generic_marshaller_signal_enum_return_signed); + g_test_add_func ("/gobject/signals/generic-marshaller-enum-return-unsigned", test_generic_marshaller_signal_enum_return_unsigned); + g_test_add_func ("/gobject/signals/generic-marshaller-int-return", test_generic_marshaller_signal_int_return); + g_test_add_func ("/gobject/signals/generic-marshaller-uint-return", test_generic_marshaller_signal_uint_return); + g_test_add_func ("/gobject/signals/connect", test_connect); + + return g_test_run (); +} diff --git a/gobject/tests/testcommon.h b/gobject/tests/testcommon.h new file mode 100644 index 0000000..7bfef05 --- /dev/null +++ b/gobject/tests/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/gobject/tests/threadtests.c b/gobject/tests/threadtests.c new file mode 100644 index 0000000..37b6b70 --- /dev/null +++ b/gobject/tests/threadtests.c @@ -0,0 +1,349 @@ +/* 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. + */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS +#include +#include + +static volatile int mtsafe_call_counter = 0; /* multi thread safe call counter */ +static int unsafe_call_counter = 0; /* single-threaded call counter */ +static GCond sync_cond; +static GMutex sync_mutex; + +#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 (void) { call_counter_init (NULL); } + +/* define 3 test interfaces */ +typedef GTypeInterface MyFace0Interface; +static GType my_face0_get_type (void); +G_DEFINE_INTERFACE (MyFace0, my_face0, G_TYPE_OBJECT); +static void my_face0_default_init (MyFace0Interface *iface) { call_counter_init (iface); } +typedef GTypeInterface MyFace1Interface; +static GType my_face1_get_type (void); +G_DEFINE_INTERFACE (MyFace1, my_face1, G_TYPE_OBJECT); +static void my_face1_default_init (MyFace1Interface *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; +static GType my_tester0_get_type (void); +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; + +/* Disabled for now (see https://bugzilla.gnome.org/show_bug.cgi?id=687659) */ +#if 0 +typedef GTypeInterface MyFace2Interface; +static GType my_face2_get_type (void); +G_DEFINE_INTERFACE (MyFace2, my_face2, G_TYPE_OBJECT); +static void my_face2_default_init (MyFace2Interface *iface) { call_counter_init (iface); } + +static GType my_tester1_get_type (void); +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; +static GType my_tester2_get_type (void); +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 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 *thread; + + /* pause newly created threads */ + g_mutex_lock (&sync_mutex); + + /* create threads */ + thread = g_thread_create (tester_init_thread, (gpointer) my_tester0_get_type(), TRUE, NULL); + g_thread_unref (thread); + thread = g_thread_create (tester_init_thread, (gpointer) my_tester1_get_type(), TRUE, NULL); + g_thread_unref (thread); + thread = g_thread_create (tester_init_thread, (gpointer) my_tester2_get_type(), TRUE, NULL); + g_thread_unref (thread); + + /* 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); +} +#endif + +typedef struct { + GObject parent; + char *name; +} PropTester; +typedef GObjectClass PropTesterClass; +static GType prop_tester_get_type (void); +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); +} + +typedef struct { + MyTester0 *strong; + guint unref_delay; +} UnrefInThreadData; + +static gpointer +unref_in_thread (gpointer p) +{ + UnrefInThreadData *data = p; + + g_usleep (data->unref_delay); + g_object_unref (data->strong); + + return NULL; +} + +/* undefine to see this test fail without GWeakRef */ +#define HAVE_G_WEAK_REF + +#define SLEEP_MIN_USEC 1 +#define SLEEP_MAX_USEC 10 + +static void +test_threaded_weak_ref (void) +{ + guint i; + guint get_wins = 0, unref_wins = 0; + guint n; + + if (g_test_thorough ()) + n = NUM_COUNTER_INCREMENTS; + else + n = NUM_COUNTER_INCREMENTS / 20; + + for (i = 0; i < n; i++) + { + UnrefInThreadData data; +#ifdef HAVE_G_WEAK_REF + /* GWeakRef in C++ terms */ + GWeakRef weak; +#else + gpointer weak; +#endif + MyTester0 *strengthened; + guint get_delay; + GThread *thread; + GError *error = NULL; + + if (g_test_verbose () && (i % (n/20)) == 0) + g_print ("%u%%\n", ((i * 100) / n)); + + /* Have an object and a weak ref to it */ + data.strong = g_object_new (my_tester0_get_type (), NULL); + +#ifdef HAVE_G_WEAK_REF + g_weak_ref_init (&weak, data.strong); +#else + weak = data.strong; + g_object_add_weak_pointer ((GObject *) weak, &weak); +#endif + + /* Delay for a random time on each side of the race, to perturb the + * timing. Ideally, we want each side to win half the races; on + * smcv's laptop, these timings are about right. + */ + data.unref_delay = g_random_int_range (SLEEP_MIN_USEC / 2, SLEEP_MAX_USEC / 2); + get_delay = g_random_int_range (SLEEP_MIN_USEC, SLEEP_MAX_USEC); + + /* One half of the race is to unref the shared object */ + thread = g_thread_create (unref_in_thread, &data, TRUE, &error); + g_assert_no_error (error); + + /* The other half of the race is to get the object from the "global + * singleton" + */ + g_usleep (get_delay); + +#ifdef HAVE_G_WEAK_REF + strengthened = g_weak_ref_get (&weak); +#else + /* Spot the unsafe pointer access! In GDBusConnection this is rather + * better-hidden, but ends up with essentially the same thing, albeit + * cleared in dispose() rather than by a traditional weak pointer + */ + strengthened = weak; + + if (strengthened != NULL) + g_object_ref (strengthened); +#endif + + if (strengthened != NULL) + g_assert (G_IS_OBJECT (strengthened)); + + /* Wait for the thread to run */ + g_thread_join (thread); + + if (strengthened != NULL) + { + get_wins++; + g_assert (G_IS_OBJECT (strengthened)); + g_object_unref (strengthened); + } + else + { + unref_wins++; + } + +#ifdef HAVE_G_WEAK_REF + g_weak_ref_clear (&weak); +#else + if (weak != NULL) + g_object_remove_weak_pointer (weak, &weak); +#endif + } + + if (g_test_verbose ()) + g_print ("Race won by get %u times, unref %u times\n", + get_wins, unref_wins); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + /* g_test_add_func ("/GObject/threaded-class-init", test_threaded_class_init); */ + g_test_add_func ("/GObject/threaded-object-init", test_threaded_object_init); + g_test_add_func ("/GObject/threaded-weak-ref", test_threaded_weak_ref); + + return g_test_run(); +} diff --git a/gobject/tests/valuearray.c b/gobject/tests/valuearray.c new file mode 100644 index 0000000..cce7087 --- /dev/null +++ b/gobject/tests/valuearray.c @@ -0,0 +1,64 @@ +#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_30 +#include + +static gint +cmpint (gconstpointer a, gconstpointer b) +{ + const GValue *aa = a; + const GValue *bb = b; + + return g_value_get_int (aa) - g_value_get_int (bb); +} + +static void +test_basic (void) +{ + GValueArray *a; + GValueArray *a2; + GValue v = G_VALUE_INIT; + GValue *p; + gint i; + + a = g_value_array_new (20); + + g_value_init (&v, G_TYPE_INT); + for (i = 0; i < 100; i++) + { + g_value_set_int (&v, i); + g_value_array_append (a, &v); + } + + g_assert_cmpint (a->n_values, ==, 100); + p = g_value_array_get_nth (a, 5); + g_assert_cmpint (g_value_get_int (p), ==, 5); + + for (i = 20; i < 100; i+= 5) + g_value_array_remove (a, 100 - i); + + for (i = 100; i < 150; i++) + { + g_value_set_int (&v, i); + g_value_array_prepend (a, &v); + } + + g_value_array_sort (a, cmpint); + for (i = 0; i < a->n_values - 1; i++) + g_assert_cmpint (g_value_get_int (&a->values[i]), <=, g_value_get_int (&a->values[i+1])); + + a2 = g_value_array_copy (a); + for (i = 0; i < a->n_values; i++) + g_assert_cmpint (g_value_get_int (&a->values[i]), ==, g_value_get_int (&a2->values[i])); + + g_value_array_free (a); + g_value_array_free (a2); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/valuearray/basic", test_basic); + + return g_test_run (); +} 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/.gitignore b/gthread/.gitignore new file mode 100644 index 0000000..8f2ed21 --- /dev/null +++ b/gthread/.gitignore @@ -0,0 +1 @@ +makefile.msc 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..2aa5078 --- /dev/null +++ b/gthread/Makefile.am @@ -0,0 +1,97 @@ +## Process this file with automake to produce Makefile.in +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + $(glib_INCLUDES) \ + -DG_LOG_DOMAIN=\"GThread\" \ + @GTHREAD_COMPILE_IMPL_DEFINES@ \ + @GLIB_DEBUG_FLAGS@ + +EXTRA_DIST += \ + makefile.msc.in \ + 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_CFLAGS = $(AM_CFLAGS) $(GLIB_HIDDEN_VISIBILITY_CFLAGS) +libgthread_2_0_la_SOURCES = gthread-impl.c +libgthread_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS) \ + $(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 + $(AM_V_GEN) $(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/gthread-impl.c b/gthread/gthread-impl.c new file mode 100644 index 0000000..6ccf0f6 --- /dev/null +++ b/gthread/gthread-impl.c @@ -0,0 +1,50 @@ +/* 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 + +void +g_thread_init (gpointer init) +{ + if (init != NULL) + g_warning ("GThread system no longer supports custom thread implementations."); +} + +void +g_thread_init_with_errorcheck_mutexes (gpointer vtable) +{ + g_assert (vtable == NULL); + g_warning ("GThread system no longer supports errorcheck mutexes."); +} 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..a1abc56 --- /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-2011 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/m4macros/.gitignore b/m4macros/.gitignore new file mode 100644 index 0000000..d59889a --- /dev/null +++ b/m4macros/.gitignore @@ -0,0 +1,6 @@ +libtool.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +lt~obsolete.m4 +gtk-doc.m4 diff --git a/m4macros/Makefile.am b/m4macros/Makefile.am new file mode 100644 index 0000000..75a9ca0 --- /dev/null +++ b/m4macros/Makefile.am @@ -0,0 +1,8 @@ +include $(top_srcdir)/Makefile.decl + +installed_m4= glib-2.0.m4 glib-gettext.m4 gsettings.m4 + +EXTRA_DIST+=$(installed_m4) + +m4datadir = $(datadir)/aclocal +m4data_DATA = $(installed_m4) diff --git a/m4macros/attributes.m4 b/m4macros/attributes.m4 new file mode 100644 index 0000000..f0bcf24 --- /dev/null +++ b/m4macros/attributes.m4 @@ -0,0 +1,288 @@ +dnl Macros to check the presence of generic (non-typed) symbols. +dnl Copyright (c) 2006-2008 Diego Pettenò +dnl Copyright (c) 2006-2008 xine project +dnl Copyright (c) 2012 Lucas De Marchi +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2, or (at your option) +dnl any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +dnl 02110-1301, USA. +dnl +dnl As a special exception, the copyright owners of the +dnl macro gives unlimited permission to copy, distribute and modify the +dnl configure scripts that are the output of Autoconf when processing the +dnl Macro. You need not follow the terms of the GNU General Public +dnl License when using or distributing such scripts, even though portions +dnl of the text of the Macro appear in them. The GNU General Public +dnl License (GPL) does govern all other use of the material that +dnl constitutes the Autoconf Macro. +dnl +dnl This special exception to the GPL applies to versions of the +dnl Autoconf Macro released by this project. When you make and +dnl distribute a modified version of the Autoconf Macro, you may extend +dnl this special exception to the GPL to apply to your modified version as +dnl well. + +dnl Check if FLAG in ENV-VAR is supported by compiler and append it +dnl to WHERE-TO-APPEND variable +dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG]) + +AC_DEFUN([CC_CHECK_FLAG_APPEND], [ + AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2], + AS_TR_SH([cc_cv_$2_$3]), + [eval "AS_TR_SH([cc_save_$2])='${$2}'" + eval "AS_TR_SH([$2])='-Werror $3'" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([int a = 0; int main(void) { return a; } ])], + [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"], + [eval "AS_TR_SH([cc_cv_$2_$3])='no'"]) + eval "AS_TR_SH([$2])='$cc_save_$2'"]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes], + [eval "$1='${$1} $3'"]) +]) + +dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2]) +AC_DEFUN([CC_CHECK_FLAGS_APPEND], [ + for flag in $3; do + CC_CHECK_FLAG_APPEND($1, $2, $flag) + done +]) + +dnl Check if the flag is supported by linker (cacheable) +dnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND]) + +AC_DEFUN([CC_CHECK_LDFLAGS], [ + AC_CACHE_CHECK([if $CC supports $1 flag], + AS_TR_SH([cc_cv_ldflags_$1]), + [ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $1" + AC_LINK_IFELSE([int main() { return 1; }], + [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_ldflags_$1])="]) + LDFLAGS="$ac_save_LDFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes], + [$2], [$3]) +]) + +dnl define the LDFLAGS_NOUNDEFINED variable with the correct value for +dnl the current linker to avoid undefined references in a shared object. +AC_DEFUN([CC_NOUNDEFINED], [ + dnl We check $host for which systems to enable this for. + AC_REQUIRE([AC_CANONICAL_HOST]) + + case $host in + dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads + dnl are requested, as different implementations are present; to avoid problems + dnl use -Wl,-z,defs only for those platform not behaving this way. + *-freebsd* | *-openbsd*) ;; + *) + dnl First of all check for the --no-undefined variant of GNU ld. This allows + dnl for a much more readable commandline, so that people can understand what + dnl it does without going to look for what the heck -z defs does. + for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do + CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"]) + break + done + ;; + esac + + AC_SUBST([LDFLAGS_NOUNDEFINED]) +]) + +dnl Check for a -Werror flag or equivalent. -Werror is the GCC +dnl and ICC flag that tells the compiler to treat all the warnings +dnl as fatal. We usually need this option to make sure that some +dnl constructs (like attributes) are not simply ignored. +dnl +dnl Other compilers don't support -Werror per se, but they support +dnl an equivalent flag: +dnl - Sun Studio compiler supports -errwarn=%all +AC_DEFUN([CC_CHECK_WERROR], [ + AC_CACHE_CHECK( + [for $CC way to treat warnings as errors], + [cc_cv_werror], + [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror], + [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])]) + ]) +]) + +AC_DEFUN([CC_CHECK_ATTRIBUTE], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))], + AS_TR_SH([cc_cv_attribute_$1]), + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])], + [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"], + [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes], + [AC_DEFINE( + AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1, + [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))] + ) + $4], + [$5]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [ + CC_CHECK_ATTRIBUTE( + [constructor],, + [void __attribute__((constructor)) ctor() { int a; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT], [ + CC_CHECK_ATTRIBUTE( + [format], [format(printf, n, n)], + [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [ + CC_CHECK_ATTRIBUTE( + [format_arg], [format_arg(printf)], + [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [ + CC_CHECK_ATTRIBUTE( + [visibility_$1], [visibility("$1")], + [void __attribute__((visibility("$1"))) $1_function() { }], + [$2], [$3]) +]) + +AC_DEFUN([CC_ATTRIBUTE_NONNULL], [ + CC_CHECK_ATTRIBUTE( + [nonnull], [nonnull()], + [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_UNUSED], [ + CC_CHECK_ATTRIBUTE( + [unused], , + [void some_function(void *foo, __attribute__((unused)) void *bar);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_SENTINEL], [ + CC_CHECK_ATTRIBUTE( + [sentinel], , + [void some_function(void *foo, ...) __attribute__((sentinel));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [ + CC_CHECK_ATTRIBUTE( + [deprecated], , + [void some_function(void *foo, ...) __attribute__((deprecated));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIAS], [ + CC_CHECK_ATTRIBUTE( + [alias], [weak, alias], + [void other_function(void *foo) { } + void some_function(void *foo) __attribute__((weak, alias("other_function")));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_MALLOC], [ + CC_CHECK_ATTRIBUTE( + [malloc], , + [void * __attribute__((malloc)) my_alloc(int n);], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_PACKED], [ + CC_CHECK_ATTRIBUTE( + [packed], , + [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));], + [$1], [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_CONST], [ + CC_CHECK_ATTRIBUTE( + [const], , + [int __attribute__((const)) twopow(int n) { return 1 << n; } ], + [$1], [$2]) +]) + +AC_DEFUN([CC_FLAG_VISIBILITY], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if $CC supports -fvisibility=hidden], + [cc_cv_flag_visibility], + [cc_flag_visibility_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden], + cc_cv_flag_visibility='yes', + cc_cv_flag_visibility='no') + CFLAGS="$cc_flag_visibility_save_CFLAGS"]) + + AS_IF([test "x$cc_cv_flag_visibility" = "xyes"], + [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1, + [Define this if the compiler supports the -fvisibility flag]) + $1], + [$2]) +]) + +AC_DEFUN([CC_FUNC_EXPECT], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([if compiler has __builtin_expect function], + [cc_cv_func_expect], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + AC_COMPILE_IFELSE([AC_LANG_SOURCE( + [int some_function() { + int a = 3; + return (int)__builtin_expect(a, 3); + }])], + [cc_cv_func_expect=yes], + [cc_cv_func_expect=no]) + CFLAGS="$ac_save_CFLAGS" + ]) + + AS_IF([test "x$cc_cv_func_expect" = "xyes"], + [AC_DEFINE([SUPPORT__BUILTIN_EXPECT], 1, + [Define this if the compiler supports __builtin_expect() function]) + $1], + [$2]) +]) + +AC_DEFUN([CC_ATTRIBUTE_ALIGNED], [ + AC_REQUIRE([CC_CHECK_WERROR]) + AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported], + [cc_cv_attribute_aligned], + [ac_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cc_cv_werror" + for cc_attribute_align_try in 64 32 16 8 4 2; do + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ + int main() { + static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0; + return c; + }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break]) + done + CFLAGS="$ac_save_CFLAGS" + ]) + + if test "x$cc_cv_attribute_aligned" != "x"; then + AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned], + [Define the highest alignment supported]) + fi +]) diff --git a/m4macros/glib-2.0.m4 b/m4macros/glib-2.0.m4 new file mode 100644 index 0000000..0507b76 --- /dev/null +++ b/m4macros/glib-2.0.m4 @@ -0,0 +1,214 @@ +# Configure paths for GLIB +# Owen Taylor 1997-2001 + +dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) +dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject, +dnl gthread, or gio is specified in MODULES, pass to pkg-config +dnl +AC_DEFUN([AM_PATH_GLIB_2_0], +[dnl +dnl Get the cflags and libraries from pkg-config +dnl +AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program], + , enable_glibtest=yes) + + pkg_config_args=glib-2.0 + for module in . $4 + do + case "$module" in + gmodule) + pkg_config_args="$pkg_config_args gmodule-2.0" + ;; + gmodule-no-export) + pkg_config_args="$pkg_config_args gmodule-no-export-2.0" + ;; + gobject) + pkg_config_args="$pkg_config_args gobject-2.0" + ;; + gthread) + pkg_config_args="$pkg_config_args gthread-2.0" + ;; + gio*) + pkg_config_args="$pkg_config_args $module-2.0" + ;; + esac + done + + PKG_PROG_PKG_CONFIG([0.16]) + + no_glib="" + + if test "x$PKG_CONFIG" = x ; then + no_glib=yes + PKG_CONFIG=no + fi + + min_glib_version=ifelse([$1], ,2.0.0,$1) + AC_MSG_CHECKING(for GLIB - version >= $min_glib_version) + + if test x$PKG_CONFIG != xno ; then + ## don't try to run the test against uninstalled libtool libs + if $PKG_CONFIG --uninstalled $pkg_config_args; then + echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH" + enable_glibtest=no + fi + + if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then + : + else + no_glib=yes + fi + fi + + if test x"$no_glib" = x ; then + GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` + GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0` + GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0` + GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0` + + GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args` + GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args` + glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_glibtest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$GLIB_LIBS $LIBS" +dnl +dnl Now check if the installed GLIB is sufficiently new. (Also sanity +dnl checks the results of pkg-config to some extent) +dnl + rm -f conf.glibtest + AC_TRY_RUN([ +#include +#include +#include + +int +main () +{ + unsigned int major, minor, micro; + char *tmp_version; + + fclose (fopen ("conf.glibtest", "w")); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = g_strdup("$min_glib_version"); + if (sscanf(tmp_version, "%u.%u.%u", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_glib_version"); + exit(1); + } + + if ((glib_major_version != $glib_config_major_version) || + (glib_minor_version != $glib_config_minor_version) || + (glib_micro_version != $glib_config_micro_version)) + { + printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", + $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version, + glib_major_version, glib_minor_version, glib_micro_version); + printf ("*** was found! If pkg-config was correct, then it is best\n"); + printf ("*** to remove the old version of GLib. You may also be able to fix the error\n"); + printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); + printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); + printf("*** required on your system.\n"); + printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); + printf("*** to point to the correct configuration files\n"); + } + else if ((glib_major_version != GLIB_MAJOR_VERSION) || + (glib_minor_version != GLIB_MINOR_VERSION) || + (glib_micro_version != GLIB_MICRO_VERSION)) + { + printf("*** GLIB header files (version %d.%d.%d) do not match\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + printf("*** library (version %d.%d.%d)\n", + glib_major_version, glib_minor_version, glib_micro_version); + } + else + { + if ((glib_major_version > major) || + ((glib_major_version == major) && (glib_minor_version > minor)) || + ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n", + glib_major_version, glib_minor_version, glib_micro_version); + printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n", + major, minor, micro); + printf("*** GLIB is always available from ftp://ftp.gtk.org.\n"); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); + printf("*** being found. The easiest way to fix this is to remove the old version\n"); + printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n"); + printf("*** correct copy of pkg-config. (In this case, you will have to\n"); + printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); + printf("*** so that the correct libraries are found at run-time))\n"); + } + } + return 1; +} +],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_glib" = x ; then + AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$PKG_CONFIG" = "no" ; then + echo "*** A new enough version of pkg-config was not found." + echo "*** See http://www.freedesktop.org/software/pkgconfig/" + else + if test -f conf.glibtest ; then + : + else + echo "*** Could not run GLIB test program, checking why..." + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GLIB_CFLAGS" + LIBS="$LIBS $GLIB_LIBS" + AC_TRY_LINK([ +#include +#include +], [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding GLIB or finding the wrong" + echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means GLIB is incorrectly installed."]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + GLIB_CFLAGS="" + GLIB_LIBS="" + GLIB_GENMARSHAL="" + GOBJECT_QUERY="" + GLIB_MKENUMS="" + GLIB_COMPILE_RESOURCES="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(GLIB_CFLAGS) + AC_SUBST(GLIB_LIBS) + AC_SUBST(GLIB_GENMARSHAL) + AC_SUBST(GOBJECT_QUERY) + AC_SUBST(GLIB_MKENUMS) + AC_SUBST(GLIB_COMPILE_RESOURCES) + rm -f conf.glibtest +]) diff --git a/m4macros/glib-gettext.m4 b/m4macros/glib-gettext.m4 new file mode 100644 index 0000000..c64e64f --- /dev/null +++ b/m4macros/glib-gettext.m4 @@ -0,0 +1,436 @@ +# 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]) + ;; + *-*-openbsd*) + CATOBJEXT=.mo + DATADIRNAME=share + ;; + *) + 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.ac. + 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_ac,[],[ +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/m4macros/gsettings.m4 b/m4macros/gsettings.m4 new file mode 100644 index 0000000..7b2f9a2 --- /dev/null +++ b/m4macros/gsettings.m4 @@ -0,0 +1,83 @@ +dnl GLIB_GSETTINGS +dnl Defines GSETTINGS_SCHEMAS_INSTALL which controls whether +dnl the schema should be compiled +dnl + +AC_DEFUN([GLIB_GSETTINGS], +[ + m4_pattern_allow([AM_V_GEN]) + AC_ARG_ENABLE(schemas-compile, + AS_HELP_STRING([--disable-schemas-compile], + [Disable regeneration of gschemas.compiled on install]), + [case ${enableval} in + yes) GSETTINGS_DISABLE_SCHEMAS_COMPILE="" ;; + no) GSETTINGS_DISABLE_SCHEMAS_COMPILE="1" ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-schemas-compile]) ;; + esac]) + AC_SUBST([GSETTINGS_DISABLE_SCHEMAS_COMPILE]) + PKG_PROG_PKG_CONFIG([0.16]) + AC_SUBST(gsettingsschemadir, [${datadir}/glib-2.0/schemas]) + if test x$cross_compiling != xyes; then + GLIB_COMPILE_SCHEMAS=`$PKG_CONFIG --variable glib_compile_schemas gio-2.0` + else + AC_PATH_PROG(GLIB_COMPILE_SCHEMAS, glib-compile-schemas) + fi + AC_SUBST(GLIB_COMPILE_SCHEMAS) + if test "x$GLIB_COMPILE_SCHEMAS" = "x"; then + ifelse([$2],,[AC_MSG_ERROR([glib-compile-schemas not found.])],[$2]) + else + ifelse([$1],,[:],[$1]) + fi + + GSETTINGS_RULES=' +.PHONY : uninstall-gsettings-schemas install-gsettings-schemas clean-gsettings-schemas + +mostlyclean-am: clean-gsettings-schemas + +gsettings__enum_file = $(addsuffix .enums.xml,$(gsettings_ENUM_NAMESPACE)) + +%.gschema.valid: %.gschema.xml $(gsettings__enum_file) + $(AM_V_GEN) if test -f "$<"; then d=; else d="$(srcdir)/"; fi; $(GLIB_COMPILE_SCHEMAS) --strict --dry-run $(addprefix --schema-file=,$(gsettings__enum_file)) --schema-file=$${d}$< && touch [$]@ + +all-am: $(gsettings_SCHEMAS:.xml=.valid) +uninstall-am: uninstall-gsettings-schemas +install-data-am: install-gsettings-schemas + +.SECONDARY: $(gsettings_SCHEMAS) + +install-gsettings-schemas: $(gsettings_SCHEMAS) $(gsettings__enum_file) + @$(NORMAL_INSTALL) + if test -n "$^"; then \ + test -z "$(gsettingsschemadir)" || $(MKDIR_P) "$(DESTDIR)$(gsettingsschemadir)"; \ + $(INSTALL_DATA) $^ "$(DESTDIR)$(gsettingsschemadir)"; \ + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir); \ + fi + +uninstall-gsettings-schemas: + @$(NORMAL_UNINSTALL) + @list='\''$(gsettings_SCHEMAS) $(gsettings__enum_file)'\''; test -n "$(gsettingsschemadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e '\''s|^.*/||'\''`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '\''$(DESTDIR)$(gsettingsschemadir)'\'' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(gsettingsschemadir)" && rm -f $$files + test -n "$(GSETTINGS_DISABLE_SCHEMAS_COMPILE)$(DESTDIR)" || $(GLIB_COMPILE_SCHEMAS) $(gsettingsschemadir) + +clean-gsettings-schemas: + rm -f $(gsettings_SCHEMAS:.xml=.valid) $(gsettings__enum_file) + +ifdef gsettings_ENUM_NAMESPACE +$(gsettings__enum_file): $(gsettings_ENUM_FILES) + $(AM_V_GEN) glib-mkenums --comments '\'''\'' --fhead "" --vhead " <@type@ id='\''$(gsettings_ENUM_NAMESPACE).@EnumName@'\''>" --vprod " " --vtail " " --ftail "" [$]^ > [$]@.tmp && mv [$]@.tmp [$]@ +endif +' + _GSETTINGS_SUBST(GSETTINGS_RULES) +]) + +dnl _GSETTINGS_SUBST(VARIABLE) +dnl Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST +AC_DEFUN([_GSETTINGS_SUBST], +[ +AC_SUBST([$1]) +m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) +] +) 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/msvc_recommended_pragmas.h b/msvc_recommended_pragmas.h new file mode 100644 index 0000000..f78f9a1 --- /dev/null +++ b/msvc_recommended_pragmas.h @@ -0,0 +1,32 @@ +#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 */ +#define _CRT_SECURE_NO_WARNINGS +#define _CRT_NONSTDC_NO_WARNINGS diff --git a/po/.gitignore b/po/.gitignore new file mode 100644 index 0000000..d17ff35 --- /dev/null +++ b/po/.gitignore @@ -0,0 +1,3 @@ +POTFILES +*.gmo +glib20.pot diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 0000000..62d69d5 --- /dev/null +++ b/po/ChangeLog @@ -0,0 +1,4775 @@ +2010-06-09 Funda Wang + + * zh_CN.po: Updated zh_CN translation from blue dark . + +=== 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..cc9fea7 --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1,96 @@ +# 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 +kk +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 +ug +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..e6c32cb --- /dev/null +++ b/po/Makefile.in.in @@ -0,0 +1,268 @@ +# 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 = mkdir -p + +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: + $(AM_V_GEN) 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) \ + --msgid-bugs-address='http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general' \ + --add-comments --keyword=_ --keyword=N_ \ + --keyword=C_:1c,2 \ + --keyword=NC_:1c,2 \ + --keyword=g_dcgettext:2 \ + --keyword=g_dngettext:2,3 \ + --keyword=g_dpgettext2:2c,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 \ + $(POTFILES) \ + && 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 + $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ + 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; \ + $(MKINSTALLDIRS) $$dir; \ + 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 \ + $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ + $(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: $(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..b76b65f --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,160 @@ +gio/gaction.c +gio/gactiongroup.c +gio/gappinfo.c +gio/gapplication.c +gio/gapplicationcommandline.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/gcontenttype-win32.c +gio/gconverter.c +gio/gconverterinputstream.c +gio/gconverteroutputstream.c +gio/gcredentials.c +gio/gdatainputstream.c +gio/gdataoutputstream.c +gio/gdbusaddress.c +gio/gdbusauth.c +gio/gdbusauthmechanism.c +gio/gdbusauthmechanismsha1.c +gio/gdbusconnection.c +gio/gdbusmessage.c +gio/gdbusmethodinvocation.c +gio/gdbusprivate.c +gio/gdbusproxy.c +gio/gdbusserver.c +gio/gdbus-tool.c +gio/gdesktopappinfo.c +gio/gdrive.c +gio/gdummyfile.c +gio/gdummytlsbackend.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/ginetaddress.c +gio/ginetaddressmask.c +gio/ginetsocketaddress.c +gio/ginitable.c +gio/ginputstream.c +gio/gioerror.c +gio/giomodule.c +gio/gioscheduler.c +gio/giostream.c +gio/glib-compile-resources.c +gio/glib-compile-schemas.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/gnetworkmonitorbase.c +gio/gnetworkmonitor.c +gio/gnetworkmonitornetlink.c +gio/gnetworkservice.c +gio/goutputstream.c +gio/gpermission.c +gio/gpollableinputstream.c +gio/gpollableoutputstream.c +gio/gpollfilemonitor.c +gio/gproxyaddress.c +gio/gproxyaddressenumerator.c +gio/gresolver.c +gio/gresource.c +gio/gresourcefile.c +gio/gresource-tool.c +gio/gseekable.c +gio/gsettingsbackend.c +gio/gsettings.c +gio/gsettings-tool.c +gio/gsimpleaction.c +gio/gsimpleasyncresult.c +gio/gsimpleproxyresolver.c +gio/gsocketaddress.c +gio/gsocket.c +gio/gsocketclient.c +gio/gsocketconnectable.c +gio/gsocketconnection.c +gio/gsocketinputstream.c +gio/gsocketlistener.c +gio/gsocketoutputstream.c +gio/gsocks4aproxy.c +gio/gsocks5proxy.c +gio/gtcpconnection.c +gio/gtcpwrapperconnection.c +gio/gtestdbus.c +gio/gthemedicon.c +gio/gthreadedresolver.c +gio/gthreadedsocketservice.c +gio/gtlscertificate.c +gio/gtlsclientconnection.c +gio/gtlsconnection.c +gio/gtlsfiledatabase.c +gio/gtlspassword.c +gio/gtlsserverconnection.c +gio/gunionvolumemonitor.c +gio/gunixconnection.c +gio/gunixcredentialsmessage.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/gwin32inputstream.c +gio/gwin32outputstream.c +gio/gzlibcompressor.c +gio/gzlibdecompressor.c +gio/tests/gdbus-daemon.c +gio/win32/gwinhttpfile.c +glib/gatomic.c +glib/gbookmarkfile.c +glib/gconvert.c +glib/gdatetime.c +glib/gdir.c +glib/gfileutils.c +glib/giochannel.c +glib/giowin32.c +glib/gkeyfile.c +glib/glib.py +glib/gmappedfile.c +glib/gmarkup.c +glib/goption.c +glib/gregex.c +glib/gshell.c +glib/gspawn.c +glib/gspawn-win32.c +glib/gutf8.c +glib/gutils.c +gobject/gbinding.c diff --git a/po/POTFILES.skip b/po/POTFILES.skip new file mode 100644 index 0000000..6e12c7e --- /dev/null +++ b/po/POTFILES.skip @@ -0,0 +1,2 @@ +glib/tests/utils.c +tests/gio-ls.c diff --git a/po/README.translators b/po/README.translators new file mode 100644 index 0000000..984392c --- /dev/null +++ b/po/README.translators @@ -0,0 +1,25 @@ +All the .po files are now in UTF-8! + +For information on editing UTF-8 files on Unix, see + + +If you just want to convert it back to your native encoding to +edit and then convert again to UTF-8 to commit, please see the +scripts in gnome-i18n/UTF-8, for example + + export ENCODING_TO=ISO-8859-15 + utftopo fi.po + emacs fi.po + potoutf.sh fi.po + cvs commit fi.po + +Alternatively, you can use the gettext package (>= 0.11) to convert +your translation to and from your native encoding: + +msgconv -t ISO-8859-15 fi.po > fi.native.po +emacs fi.native.po +msgconv -t UTF-8 fi.native.po > fi.po +cvs commit fi.po + +If you need help with this, ask, but please don't commit +non-UTF-8 files here. diff --git a/po/af.po b/po/af.po new file mode 100644 index 0000000..fa5147a --- /dev/null +++ b/po/af.po @@ -0,0 +1,3722 @@ +# Afrikaans translation for glib. +# Copyright (C) 2010 glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the glib package. +# F Wolff , 2010, 2011. +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-03-30 18:52+0200\n" +"Last-Translator: F Wolff \n" +"Language-Team: translate-discuss-af@lists.sourceforge.net\n" +"Language: af\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: Virtaal 0.7.0-beta4\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Ongeldige gasheernaam" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "vm." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "nm." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y-%m-%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +#, fuzzy +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Januarie" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Februarie" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Maart" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Junie" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Julie" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "Augustus" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "Oktober" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "Desember" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mrt" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Des" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Maandag" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dinsdag" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Woensdag" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Donderdag" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Vrydag" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Saterdag" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sondag" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Ma." + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Di." + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Wo." + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Do." + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Vr." + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sa." + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "So." + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fout met oopmaak van die gids '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fout met lees van lêer '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Die lêer \"%s\" is te groot" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kon nie lees vanaf lêer '%s' nie: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kon nie lêer '%s' oopmaak nie: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Kon nie lêer '%s' skep nie: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KG" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MG" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GG" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TG" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PG" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EG" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KG" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MG" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GG" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TG" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PG" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EG" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KG" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kon nie simboliese skakel '%s' lees nie: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is nie 'n geldige naam nie: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fout op lyn %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Gebruik:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[KEUSE...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Hulpkeuses:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Wys hulpkeuses" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Wys alle hulpkeuses" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Toepassingkeuses:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Onbekende keuse %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Nie 'n gewone lêer nie" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Lêer is leeg" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ongeldige groepnaam: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s-tipe" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Fout met oopmaak van lêer: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fout met lees van lêer '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Fout met lees van lêer '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Fout met skryf na lêer: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Fout met lees van lêer '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Onbekende tipe" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Fout met oopmaak van die gids '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fout met skep van gids: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fout met lees van lêer '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fout met lees van lêer '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fout met toemaak van lêer: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Fout met skryf na lêer: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Simboliese skakels word nie ondersteun nie" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fout met skryf na lêer: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Fout op lyn %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fout met skep van gids: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Fout met oopmaak van lêer: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' is nie 'n geldige naam nie " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fout met oopmaak van die gids '%s': %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fout met oopmaak van lêer: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Fout met oopmaak van die gids '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Kan nie oor 'n gids kopieer nie" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Kan nie 'n gids oor 'n gids kopieer nie" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Teiken lêer bestaan" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Kan nie gids rekursief kopieer nie" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Kan nie spesiale lêer kopieer nie" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Ongeldige waarde vir simboliese skakel gegee" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Lêernaam kan nie '%c' bevat nie" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Geen toepassing is geregistreer om hierdie lêer te hanteer nie" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "leë name word nie toegelaat nie" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ongeldige lêernaam %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fout met kry van lêerstelselinligting: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Kan nie wortelgids hernoem nie" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fout met hernoem van lêer: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Kan nie lêer hernoem nie - lêernaam bestaan reeds" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Ongeldige lêernaam" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Fout met oopmaak van lêer: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Kan nie gids open nie" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Fout met skrap van lêer: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fout met skep van gids: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Lêerstelsel ondersteun nie simboliese skakels nie" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fout met maak van simboliese skakel: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Fout met skuif van lêer: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Kan nie 'n gids oor 'n gids skuif nie" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Kon nie rugsteunlêer skep nie" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fout met skrap van teikenlêer: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (ongeldige enkodering)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fout met lees vanaf lêer: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Fout met toemaak van lêer: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fout met skryf na lêer: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fout met skep van rugsteunkopie: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fout met hernoeming van tydelike lêer: %s " + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fout met oopmaak van lêer '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Teikenlêer is 'n gids" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Teikenlêer is nie 'n gewone lêer nie" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Die lêer is ekstern gewysig" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fout met skrap van ou lêer: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: ../gio/gsocket.c:2163 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Simboliese skakels word nie ondersteun nie" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Fout met oopmaak van lêer: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fout met hernoem van lêer: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Fout met lees vanaf lêer: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Fout met toemaak van lêer: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Fout met skryf na lêer: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Onvoldoende geheue" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Interne fout: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Benodig meer toevoer" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ongeldige saamgepersde data" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "vm." + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "nm." + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Kan nie 'n gids oor 'n gids skuif nie" diff --git a/po/am.po b/po/am.po new file mode 100644 index 0000000..e3064f2 --- /dev/null +++ b/po/am.po @@ -0,0 +1,3731 @@ +# Translations into the Amharic Language. +# Copyright (C) 2002 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Ge'ez Frontier Foundation , 2002. +# +# +msgid "" +msgstr "" +"Project-Id-Version: glib VERSION\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2003-01-16 08:39+EDT\n" +"Last-Translator: Ge'ez Frontier Foundation \n" +"Language-Team: Amharic \n" +"Language: am\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s'ን ተቀብሏል" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "ጡዋት" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "ከሰዓት" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A፣ %B %e ቀን %Y %r %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%l:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%X %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "ጃንዩወሪ" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "ፌብሩወሪ" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "ማርች" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "ኤፕረል" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "ሜይ" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "ጁን" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "ጁላይ" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ጃንዩ" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ፌብሩ" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "ማርች" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ኤፕረ" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "ሜይ " + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ጁን " + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ጁላይ" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ሰኞ" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "ማክሰኞ" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ረቡዕ" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ሐሙስ" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "ዓርብ" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "ቅዳሜ" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "እሑድ" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ሰኞ " + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ማክሰ" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ረቡዕ" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ሐሙስ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ዓርብ" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ቅዳሜ" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "እሑድ" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "የማይሰራ የUTF-8 ጽሑፍ" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "የእንግዳ ተቀባይ ስም ተቀብሏል" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ፋይል '%s'ን ለማንበብ ስህተት አለ፦ %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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.po b/po/ar.po new file mode 100644 index 0000000..a249af5 --- /dev/null +++ b/po/ar.po @@ -0,0 +1,4179 @@ +# translation of glib.HEAD.po to Arabic +# translation of glib.po to +# Copyright (C) 2001,2002,2003, 2006, 2007, 2008 Free Software Foundation, Inc. +# Isam Bayazidi , 2001,2002. +# Arafat Medini , 2003. +# Djihed Afifi , 2006, 2007. +# Khaled Hosny , 2006, 2007, 2008, 2010, 2011, 2012. +# Anas Afif Emad , 2008. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-06-13 21:00+0200\n" +"PO-Revision-Date: 2012-06-13 21:00+0200\n" +"Last-Translator: Khaled Hosny \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\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 ? 4 : 5;\n" +"X-Generator: Virtaal 0.7.0\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:854 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "مُرِّرت قيمة كبيرة جدّا إلى %s" + +#: ../gio/gbufferedinputstream.c:909 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "عملية السعي غير مُدعمة على الدَفق الأساسي" + +#: ../gio/gbufferedinputstream.c:955 +msgid "Cannot truncate GBufferedInputStream" +msgstr "تعذر بَتْرُ GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:1000 ../gio/ginputstream.c:1062 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1385 +msgid "Stream is already closed" +msgstr "سبق إغلاق الدَفق " + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "البَتْرُ غير مدعم على الدَفق الأساسي" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2133 ../gio/gsimpleasyncresult.c:833 +#: ../gio/gsimpleasyncresult.c:859 +#, c-format +msgid "Operation was cancelled" +msgstr "أُلغيت العملية " + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "سلسلة بايتات غير سليمة في الدخْل" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "لا يوجد مساحة كافية في الوِجهة" + +#: ../gio/gcharsetconverter.c:345 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "سلسلة بايتات غير سليمة في دخْل التحويل" + +#: ../gio/gcharsetconverter.c:350 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "خطأ أثناء التحويل: %s" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:959 +msgid "Cancellable initialization not supported" +msgstr "الاستبداء القابل للإلغاء غير مدعوم" + +#: ../gio/gcharsetconverter.c:458 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "التحويل من مجموعة المحارف '%s' إلى '%s' غير مدعوم" + +#: ../gio/gcharsetconverter.c:462 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "تعذّر فتح المُحوِّل من '%s' إلى '%s'" + +#: ../gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "نوع مجهول" + +#: ../gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "نوع ملفّ %s" + +#: ../gio/gcontenttype.c:680 +#, c-format +msgid "%s type" +msgstr "نوع %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "لم تُطبق GCredentials لهذا النظام" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "لم تدعم GCredentials على هذه المنصة" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "نهاية دَفق غير متوقّعة وغير متوقعة " + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1029 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1066 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "" + +#: ../gio/gdbusaddress.c:1077 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1091 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1312 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" + +#: ../gio/gdbusaddress.c:1437 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#: ../gio/gdbusaddress.c:1458 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1557 ../gio/gdbusconnection.c:6755 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1566 ../gio/gdbusconnection.c:6764 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1576 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "الاتصال مغلق" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "انتهت المهلة" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6198 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6704 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:6309 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6428 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "خطأ: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:581 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "غير مسمّى" + +#: ../gio/gdesktopappinfo.c:994 +msgid "Desktop file didn't specify Exec field" +msgstr "ملف سطح المكتب لم يحدد الحقل التنفيدي" + +#: ../gio/gdesktopappinfo.c:1282 +msgid "Unable to find terminal required for application" +msgstr "تعذّر إيجاد الطرفية المطلوبة للتطبيق" + +#: ../gio/gdesktopappinfo.c:1570 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "تعذّر إنشاء مجلد التهيئة الخاص بتطبيق المستخدم %s: ‏%s" + +#: ../gio/gdesktopappinfo.c:1574 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "لا يمكن إنشاء مجلد التهيئة MIME %s للمستخدم: %s" + +#: ../gio/gdesktopappinfo.c:1814 ../gio/gdesktopappinfo.c:1838 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2071 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "لا يمكن إنشاء الملف %s" + +#: ../gio/gdesktopappinfo.c:2193 +#, c-format +msgid "Custom definition for %s" +msgstr "تعريف مخصص لِ %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "محرك الأقراص لا يدعم البدء" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "محرك الأقراص لا يدعم الإيقاف" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:874 ../gio/gfile.c:1105 ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 ../gio/gfile.c:1531 ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 ../gio/gfile.c:1726 ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 ../gio/gfile.c:3312 ../gio/gfile.c:3366 +#: ../gio/gfile.c:3511 ../gio/gfile.c:3552 ../gio/gfile.c:3882 +#: ../gio/gfile.c:4284 ../gio/gfile.c:4370 ../gio/gfile.c:4459 +#: ../gio/gfile.c:4557 ../gio/gfile.c:4644 ../gio/gfile.c:4738 +#: ../gio/gfile.c:5059 ../gio/gfile.c:5326 ../gio/gfile.c:5391 +#: ../gio/gfile.c:7018 ../gio/gfile.c:7108 ../gio/gfile.c:7194 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 ../gio/glocalfile.c:1070 ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "الوصل الحاوي غير موجود" + +#: ../gio/gfile.c:2414 ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "لا يمكنك نقل دليل على دليل" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "لا يمكنك نسخ دليل على دليل" + +#: ../gio/gfile.c:2483 ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "الملف الهدف موجود مسبّقا" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr " لا يمكنك النسخ التكراري للدليل " + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3501 +msgid "Invalid symlink value given" +msgstr "قيمة الوصلة الرمزية المُعطاة غير سليمة" + +#: ../gio/gfile.c:3595 +msgid "Trash not supported" +msgstr "المهملات غير مدعومة" + +#: ../gio/gfile.c:3644 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "لا يمكن لأسماء الملفات أن تحتوي على '%c' " + +#: ../gio/gfile.c:6077 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "الجهاز لا ينفذ الوَصل" + +#: ../gio/gfile.c:6188 +msgid "No application is registered as handling this file" +msgstr "لم يسجل أي تطبيق كمعالج لهذا الملف" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "المُعدِّد مغلق" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "مُعدد الملف له عملية عالقة" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +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:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "الدَفق لا يدعم query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "عملية السعي البحث غير مُدعمة على الدَفق" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "البَتْرُ غير مسموح به على دَفق الإدخال" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "البَتْرُ غير مدعم على الدَفق" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:1072 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1395 +msgid "Stream has outstanding operation" +msgstr " للدَفق عملية عالقة" + +#: ../gio/glib-compile-resources.c:144 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-resources.c:148 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-resources.c:238 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:251 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:262 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "" + +#: ../gio/glib-compile-resources.c:309 ../gio/glib-compile-resources.c:368 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "" + +#: ../gio/glib-compile-resources.c:338 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" + +#: ../gio/glib-compile-resources.c:394 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" + +#: ../gio/glib-compile-resources.c:408 +#, c-format +msgid "Error reading file %s: %s" +msgstr "" + +#: ../gio/glib-compile-resources.c:428 +#, c-format +msgid "Error compressing file %s" +msgstr "" + +#: ../gio/glib-compile-resources.c:492 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 +msgid "name of the output file" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 ../gio/glib-compile-resources.c:648 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "" + +#: ../gio/glib-compile-resources.c:616 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:616 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-resources.c:617 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:619 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:620 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:621 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:622 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:651 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:667 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "تعذّر ايجاد نوع المراقبة للدليل المحلي الافتراضي " + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "اسم ملف غير صالح %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "خطأ أثناء تلقي معلومات نظام الملفات: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr " لا يمكنك إعادة تسمية الدليل الجذري " + +#: ../gio/glocalfile.c:1136 ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "خطأ عند إعادة تسمية الملف: %s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "لا يمكنك إعادة تسمية الملف، اسم الملف موجود بالفعل" + +#: ../gio/glocalfile.c:1158 ../gio/glocalfile.c:2162 ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "اسم ملف غير صالح" + +#: ../gio/glocalfile.c:1325 ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "لا يمكن فتح الدّليل" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "خطأ عند فتح الملف: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "خطأ عند حذف الملف: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "خطأ عند ارسال الملف للمهملات: %s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "تعذّر إنشاء مجلد سلة المهملات %s: ‏%s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "تعذّر إيجاد دليل المستوى الأعلى للمهملات" + +#: ../gio/glocalfile.c:1964 ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "تعذّر ايجاد أو إنشاء دليل المهملات" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "تعذّر إنشاء ملف المُهْملات: %s" + +#: ../gio/glocalfile.c:2047 ../gio/glocalfile.c:2052 ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "تعذّر نقل الملف: %s إلى المهملات " + +#: ../gio/glocalfile.c:2140 ../glib/gregex.c:213 +msgid "internal error" +msgstr "خطأ داخلي" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "خطأ أثناء إنشاء الدليل: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "لا يدعم نظام الملفات الوصلات الرمزية." + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "خطأ أثناء تشكيل الوصلة الرمزية: %s" + +#: ../gio/glocalfile.c:2261 ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "خطأ عندنقل الملف: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "لا يمكنك نقل دليل على دليل" + +#: ../gio/glocalfile.c:2311 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "فشل إنشاء ملف النسخة الاحتياطية" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "خطأ في إزالة الملف الهدف: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "النقل بين الوصلات غير مدعوم" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "قيمة الخاصية لا بد أن تكون غير منعدمة" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض أن يكون مقطعا )" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "اسم غير سليم للخاصية الممتدة" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "خطأ عند ضبط الخاصية الممتدة '%s'‏: %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (ترميز غير سليم)" + +#: ../gio/glocalfileinfo.c:1527 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "خطأ عند جلب معلومات الملف '%s': %s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "خطأ عند جلب معلومات الملف: %s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض uint32 )" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "نوع الخاصية غير سليم ( يُفترض uint64 )" + +#: ../gio/glocalfileinfo.c:1861 ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "نوع الخاصية غير سليم ( يُنتضر مقطع بايت )" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "لا يمكن ضبط صلاحيات الوصلات الرمزية" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "خطأ ضبط الصلاحيات: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "خطأ ضبط المالك: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "يجب أن يكون فهرس القائمة غير سلبي" + +#: ../gio/glocalfileinfo.c:2015 ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "خطأ أثناء ضبط الوصلة الرمزية: %s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "خطأ في ضبط الوصلة الرمزية: الملف ليس وصلة رمزية" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "يجب ألا يكون سياق SELinux صفرا" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "خطأ في ضبط سياق SELinux: ‏%s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "‏SELinux ليس مفعلا على هذا النظام" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ضبط الصفة %s غير مُدَعَّم" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "خطأ أثناء القراءة من الملف: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "خطأ أثناء تصفح الملف: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "خطأ عند غلق الملف: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "تعذّر إيجاد نوع المراقبة للملف المحلي الافتراضي " + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "خطأ في الكتابة للملف: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "خطأ أثناء إزالة وصلة النسخة الاحتياطية القديمة: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "خطأ أثناء إنشاء النسخة الاحتياطية: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "خطأ عند إعادة تسمية الملف المؤقت: %s " + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "خطأ أثناء بَتْر الملف: %s " + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "خطأ عند فتح الملف '%s'‏: %s " + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "الملف الهدف هو دليل" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "الملف الهدف هو ليس ملفًا عاديًا" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "تمّ تعديل الملف خارجيّا" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "خطأ عند حذف الملف القديم: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "تم تقديم GSeekType غير سليم" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "طلب بحث غير سليم" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "تعذر بَتْرُ GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "دَفْقُ الاخراج للذاكرة غير قابل لتغيير القياس" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "فشل تغيير قياس دَفْقُ الاخراج للذاكرة" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:753 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "نقطة الوصل لا تدعم \"الفصل\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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 "نقطة الوصل لا تدعم \"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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "نقطة الوصل لا تدعم التخمين المتزامن لنوع المحتوى" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "يحتوي اسم المستضيف '%s' '[' لكن لا ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "دَفْقُ الاخراج لا يدعم الكتابة" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1033 +msgid "Source stream is already closed" +msgstr "دَفْقُ المَصدر سبق إغلاقه" + +#: ../gio/gresolver.c:937 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:987 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:1146 ../gio/gresolver.c:1320 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#: ../gio/gresolver.c:1151 ../gio/gresolver.c:1325 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:1156 ../gio/gresolver.c:1330 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: ../gio/gresource.c:295 ../gio/gresource.c:543 ../gio/gresource.c:560 +#: ../gio/gresource.c:681 ../gio/gresource.c:750 ../gio/gresource.c:811 +#: ../gio/gresource.c:891 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:460 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +msgid "[COMMAND]" +msgstr "" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"أمرٌ مجهول %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:554 +msgid "[PATH]" +msgstr "" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:305 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: ../gio/gsocket.c:506 ../gio/gsocket.c:513 ../gio/gsocket.c:529 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: ../gio/gsocket.c:506 +msgid "Unknown family was specified" +msgstr "" + +#: ../gio/gsocket.c:513 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1718 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1761 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1822 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1896 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: ../gio/gsocket.c:1949 ../gio/gsocket.c:1985 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "" + +#: ../gio/gsocket.c:1950 ../gio/gsocket.c:1986 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "" + +#: ../gio/gsocket.c:1951 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2170 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: ../gio/gsocket.c:2291 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:2343 ../gio/gsocket.c:4322 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:2513 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: ../gio/gsocket.c:2691 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: ../gio/gsocket.c:2805 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2884 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:4101 ../gio/gsocket.c:4237 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: ../gio/gsocket.c:4341 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:249 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "جذر نظام الملفّات" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "تعذّر العثور على التّطبيق" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "خطأ عند تشغيل التطبيق: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "المسارات غير مدعومة" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "تغيير الترابطات غير مدعوم على win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "إنشاء الترابط غير مدعوم على win32" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "صفة غير متوقّعة '%s' للعنصر '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "الصفة '%s' للعنصر '%s' غير موجودة" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "وسْم غير متوقع '%s'، توقّعت الوسْم '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "وسْم غير متوقّع '%s' داخل '%s'" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "لا يوجد ملف علامات سليم في أدلّة البيانات" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "توجد بالفعل علامة للمسار '%s'" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "لا توجد علامة للمسار '%s'" + +#: ../glib/gbookmarkfile.c:2385 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "لم يعرّف نوع MIME في علامة المسار '%s'" + +#: ../glib/gbookmarkfile.c:2470 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "لم يعرف علم خاص في العلامات للمسار '%s'" + +#: ../glib/gbookmarkfile.c:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "لم تحدد أي مجموعات في علامة '%s'" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "لم يسجل أي تطبيق بالاسم '%s' علامة '%s'" + +#: ../glib/gbookmarkfile.c:3424 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "فشل تمديد سطر exec '%s' بالمسار '%s'" + +#: ../glib/gconvert.c:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "تتابع محارف جزئي عند نهاية الدخْل" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "تعذّر تحويل fallback '%s' إلى مجموعة المحارف '%s'" + +#: ../glib/gconvert.c:1874 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "المسار '%s' ليس مسارا مطلقا باستخدام المخطط \"file\"" + +#: ../glib/gconvert.c:1884 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ملف المسار المحلي '%s' لا يمكن أن يحتوي على '#'" + +#: ../glib/gconvert.c:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "المسار '%s' غير سليم" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "اسم مستضيف المسار '%s' غير سليم" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "المسار '%s' يحتوي على محارف خلوص غير سليمة " + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "اسم المسار '%s' ليس مسارا كاملا" + +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "اسم المستضيف غير سليم" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ص" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "م" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %e %B %l:%M:%S %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d‏/%m‏/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%OI:%OM:%OS %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "يناير" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "فبراير" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "مارس" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "أبريل" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "مايو" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "يونيو" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "يوليو" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "أغسطس" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "سبتمبر" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "أكتوبر" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "نوفمبر" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ديسمبر" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "يناير" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "فبراير" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "مارس" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "أبريل" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "مايو" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "يونيو" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "يوليو" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "أغسطس" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "سبتمبر" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "أكتوبر" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "نوفمبر" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ديسمبر" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "الاثنين" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "الثلاثاء" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "الأربعاء" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "الخميس" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "الجمعة" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "السبت" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "الأحد" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "اثنين" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ثلاثاء" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "أربعاء" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "خميس" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "جمعة" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "سبت" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "أحد" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "خطأ أثناء فتح الدليل '%s'‏: %s" + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "تعذّر تحصيص %Ilu بايتات لقرائة الملف \"%s\"" + +#: ../glib/gfileutils.c:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "خطأ عند قراءة الملف '%s'‏: %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "الملف \"%s\" كبير جدا" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "فشلت القراءة من الملف '%s'‏: %s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "فشل فتح الملف '%s'‏: %s" + +#: ../glib/gfileutils.c:855 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "فشلت في أخذ صفات الملف '%s': فشل fstat(): %s" + +#: ../glib/gfileutils.c:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "فشل فتح الملف '%s': فشل fdopen(): %s" + +#: ../glib/gfileutils.c:997 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "فشل إعادة تسمية الملف '%s' إلى '%s': فشل g_rename(): %s" + +#: ../glib/gfileutils.c:1039 ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "فشل إنشاء الملف '%s'‏: %s" + +#: ../glib/gfileutils.c:1053 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "فشل فتح الملف '%s' للكتابة: فشل fdopen(): %s" + +#: ../glib/gfileutils.c:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fwrite(): %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fflush(): %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "فشلت في كتابة الملف '%s': فشل fsync(): %s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "فشلت في غلق الملف '%s': فشل fclose(): %s" + +#: ../glib/gfileutils.c:1287 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "لا يمكن حذف الملف الموجود مسبقا '%s': فشل g_unlink(): %s" + +#: ../glib/gfileutils.c:1547 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "القالب '%s' غير سليم، لا يجب أن يحتوي على '%s'" + +#: ../glib/gfileutils.c:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "لا يحتوي القالب '%s' على XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "فشلت قراءة الوصلة الرمزية '%s'‏: %s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "الوصلات الرمزية غير مدعومة" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "تعذّر فتح المُحوِّل من '%s' إلى '%s'‏: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "بيانات غير مُحوّلة باقية في حاجز القراءة الخلفي" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "تنتهي القناة عند محرف جزئي" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "لا يمكن عمل قراءة خام في g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "لا يمكن إيجاد ملف مفتاح صحيح في دلائل البحث" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "ليس ملفا اعتياديا" + +#: ../glib/gkeyfile.c:1162 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ملف المفتاح يحتوي على سطر '%s' والذي ليس زوج قيمة مفاتيح ، مجموعة ، أو تعليق" + +#: ../glib/gkeyfile.c:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "اسم مجموعة غير صحيح: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "لا يبدأ ملف المفتاح بمجموعة" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "اسم مفتاح غير صحيح: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "يحتوي ملف المفتاع على ترميز غير مدعوم '%s'" + +#: ../glib/gkeyfile.c:1541 ../glib/gkeyfile.c:1703 ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 ../glib/gkeyfile.c:3273 ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 ../glib/gkeyfile.c:3778 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "لا يحتوي ملف المفتاح على المجموعة '%s'" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "لا يحتوي ملف المفتاح على المفتاح '%s'" + +#: ../glib/gkeyfile.c:1822 ../glib/gkeyfile.c:1938 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "يحتوي ملف المفتاح على المفتاح '%s' ذو القيمة '%s' التي ليست UTF-8" + +#: ../glib/gkeyfile.c:1842 ../glib/gkeyfile.c:1958 ../glib/gkeyfile.c:2327 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ملف المفتاح يحتوي على مفتاح '%s' والذي لديه قيمة لا يمكن تفسيرها." + +#: ../glib/gkeyfile.c:2544 ../glib/gkeyfile.c:2910 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"ملف المفتاح يحتوي على مفتاح '%s' في المجموعة '%s' والتي لديها قيمة لا يمكن " +"تفسيرها>" + +#: ../glib/gkeyfile.c:2622 ../glib/gkeyfile.c:2698 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" + +#: ../glib/gkeyfile.c:3096 ../glib/gkeyfile.c:3288 ../glib/gkeyfile.c:3857 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "لا يحتوي ملف المفتاح على مفتاح '%s' في المجموعة '%s'" + +#: ../glib/gkeyfile.c:4089 +msgid "Key file contains escape character at end of line" +msgstr "ملف المفتاح يحتوي على محرف الخلوص في آخر السطر" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ملف المفتاح يحتوي على تتابع خلوص غير صالح '%s'" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "لا يمكن تفسير القيمة '%s' كعدد." + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "قيمة عدد صحيح '%s' خارج المدى" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "لا يمكن تفسير القيمة '%s' كعدد عشري." + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "لا يمكن تفسير القيمة '%s' كعدد منطقي." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "فشلت في أخذ صفات الملف '%s%s%s%s': فشل fstat‪()‬‏: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "فشل في مقابلة %s%s%s%s‏: ‪mmap()‬ فشل: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "فشل فتح الملف '%s': فشل open(): %s" + +#: ../glib/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "خطأ في السطر %Id الرمز %Id: " + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "نص مرمّز بـ UTF-8 غير سليم في الاسم - غير سليم '%s'" + +#: ../glib/gmarkup.c:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "ليس '%s' اسما سليما" + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "ليس '%s' اسما سليما: '%c'" + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "خطأ في السطر %Id‏: ‎%s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "مرجع المحرف '%-.*s' لا يقوم بترميز محرف مسموح به" + +#: ../glib/gmarkup.c:715 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "رُؤي كيان فارغ '&;'، الكيانات السليمة هي:& " < > ' " + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "اسم الكيان '%-.*s' غير معروف" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "يجب أن يبدأ المستند بعنصر ( مثلا)" + +#: ../glib/gmarkup.c:1116 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' محرف غير سليم بعد المحرف '<'؛ ربما لا يبدأ هذا المحرف اسم عنصر" + +#: ../glib/gmarkup.c:1184 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "محرف غريب '%s'، توقعت محرف '>' لإنهاء بداية وسم العنصر '%s'" + +#: ../glib/gmarkup.c:1268 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "محرف غريب '%s'، توقعت '=' بعد اسم الصفة '%s' للعنصر '%s'" + +#: ../glib/gmarkup.c:1309 +#, 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:1353 +#, 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:1486 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' محرف غير صالح بعد اغلاق اسم العنصر '%s'؛ المحرف المسموح به هو '>'" + +#: ../glib/gmarkup.c:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "العنصر '%s' كان مغلقا، لا عنصر مفتوح حاليا" + +#: ../glib/gmarkup.c:1542 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "العنصر '%s' كان مغلقا، لكن العنصر المفتوح حاليا هو '%s'" + +#: ../glib/gmarkup.c:1710 +msgid "Document was empty or contained only whitespace" +msgstr "المستند كان فارغا أو كان يحتوي فقط على مساحات فارغة" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "انتهى المستند بشكل غير متوقع بعد قوس بزاوية ‪'<'‬" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"انتهى المستند بشكل غير متوقع مع عناصر لا زالت مفتوحة - '%s' كان آخر عنصر " +"مفتوح" + +#: ../glib/gmarkup.c:1740 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"انتهى المستند بشكل غير متوقع، توقعت رؤية قوس ذا زاوية لينهي العلامة‪<%s/>‬" + +#: ../glib/gmarkup.c:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "انتهى المستند بشكل غير متوقع داخل اسم عنصر" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "انتهى المستند بشكل غير متوقع داخل اسم صفة" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "انتهى المستند بشكل غير متوقع بعد علامة فتح عنصر." + +#: ../glib/gmarkup.c:1763 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"انتهى المستند بشكل غير متوقع بعد علامة التساوي اثر اسم صفة؛ لا توجد قيمة " +"للصفة" + +#: ../glib/gmarkup.c:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "انتهى المستند بشكل غير متوقع وهو داخلَ قيمة صفة" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "انتهى المستند بشكل غير متوقع داخل علامة انهاء للعنصر '%s'" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "انتهى المستند بشكل غير متوقع داخل تعليق أو تعليمات معالجة" + +#: ../glib/goption.c:745 +msgid "Usage:" +msgstr "الاستخدام:" + +#: ../glib/goption.c:745 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:851 +msgid "Help Options:" +msgstr "خيارات المساعدة:" + +#: ../glib/goption.c:852 +msgid "Show help options" +msgstr "اعرض خيارات المساعدة" + +#: ../glib/goption.c:858 +msgid "Show all help options" +msgstr "اعرض كل خيارات المساعدة" + +#: ../glib/goption.c:920 +msgid "Application Options:" +msgstr "خيارات التطبيق:" + +#: ../glib/goption.c:982 ../glib/goption.c:1052 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "تعذّر تحليل قيمة العدد الصحيح '%s' ل %s" + +#: ../glib/goption.c:992 ../glib/goption.c:1060 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "قيمة الرقم الصحيح '%s' ل %s خارج المجال" + +#: ../glib/goption.c:1017 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "تعذّر تحليل القيمة المزدوجة '%s' ل %s" + +#: ../glib/goption.c:1025 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "القيمة المزدوجة '%s' ل %s خارج المجال" + +#: ../glib/goption.c:1288 ../glib/goption.c:1367 +#, c-format +msgid "Error parsing option %s" +msgstr "خطأ أثناء تحليل الخيار %s" + +#: ../glib/goption.c:1398 ../glib/goption.c:1511 +#, c-format +msgid "Missing argument for %s" +msgstr "معامل %s مفقود" + +#: ../glib/goption.c:1964 +#, c-format +msgid "Unknown option %s" +msgstr "خيار مجهول %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "كائن تالف" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "خطأ داخلي أو كائن تالف" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "نفذت الذّاكرة" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "وُصِلَ للحد المسموح به من أمكنة الرجوع للوراء" + +#: ../glib/gregex.c:211 ../glib/gregex.c:219 +msgid "the pattern contains items not supported for partial matching" +msgstr "المثال يحتوي على عناصر لا تحتمل التطابق الجزئي" + +#: ../glib/gregex.c:221 +msgid "back references as conditions are not supported for partial matching" +msgstr "المراجع الرجعية غير مدعومة كشرط للتطابق الجزئي" + +#: ../glib/gregex.c:230 +msgid "recursion limit reached" +msgstr "وُصِلَ للحد المسموح به من التواتر" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "وُصِلَ للحد المسموح به لمساحة العمل بالسلاسل الجزئية الفارغة" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "ائتلاف غير صحيح لأعلمة السطر الجديد" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "خطأ مجهول" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ في نهاية النمط" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "‏\\c في نهاية النمط" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "رمز غير معروف بعد \\" + +#: ../glib/gregex.c:275 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "خلوصات تغيير المحارف (\\l, \\L, \\u, \\U) غير مسموح بها هنا" + +#: ../glib/gregex.c:278 +msgid "numbers out of order in {} quantifier" +msgstr "الأعداد خارج التغطية في المكمم {}" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "العدد كبير جدا في المكمم {}" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "الرمز ] غير موجود" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "سلسلة غير سليمة" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "مجال خارج التغطية في نوع الرموز" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "لا شيئ للإعادة" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "رمز غير معروف بعد (?" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "رمز غير معروف بعد (?<" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "رمز غير معروف بعد (?P" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "أصناف POSIX المسماة مدعومة فقط داخل صنف" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "القوس الغالق غير موجود )" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "‏(?R أو (?[+-] أرقام يجب أن تتبع ب )" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "إشارة لقالب داخلي غير موجود" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "الرمز ) غير موجود بعد التعليق" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "قالب كبير جدًّا" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "فشل تلقي الذاكرة" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "مصادقة العثور الخلفي ليست بحجم واحد" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "اسم أو عدد غير صحيح بعد (?(" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "المجموعة الشرطية تحتوي على أكثر من فرعين" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "مصادقة منتظرة بعد (?(" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "اسم نوع POSIX غير معروف" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "عناصر الترتيب POSIX غير مدعومة" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "قيمة الرمز في سلسلة \\x{...} كبيرة جدًا" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "شرط غير صحيح (?(0)" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "‏\\C غير مسموحة له عند العثور الخلفي" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "الوظيفة التكرارية يمكن أن تستمر إلى ما لا نهاية" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "منهي غير موجود في اسم القالب الداخلي" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "هناك قالبان داخليان لهما نفس الاسم" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "سلسلة \\P أو \\p سيئة التركيب" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "اسم خاصية غير معروفة بعد \\P أو \\p" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "اسم القالب الداخلي كبير جدا" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "هناك عدد كبير جدا من اسماء القوالب الداخلية (الأقصى 10,000)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "القيمة الثمانية أكبر من \\377" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "مجموعة DEFINE تحتوي على أكثر من فرع واحد" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "إعادة مجموعة DEFINE غير مسموحة" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "خيارات NEWLINE غير صحيحة " + +#: ../glib/gregex.c:396 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "‏\\g غير متبوعة باسم قوس أو عدد بقوس" + +#: ../glib/gregex.c:401 +msgid "unexpected repeat" +msgstr "إعادة غير متوقعة" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "فيضان الرموز" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "خطأ تركيب مساحة العمل" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "القالب الداخلى المراقب مسبقا غير موجود" + +#: ../glib/gregex.c:631 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "خطأ عند تطابق جملة المقارنة %s: ‏%s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "تم تجميع مكتبة PCRE من دون دعم UTF8 " + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "تم تجميع مكتبة PCRE من دون دعم خصائص UTF8 " + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "خطأ عند تجميع جملة المقارنة %s عند المحرف %Id: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "خطأ عند تحسين جملة المقارنة %s: ‏%s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "رقم من نظام 16 أو '}' متوقع" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "رقم من نظام 16 متوقع" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "'<' غير موجود في المرجع الرمزي" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "مرجع كيان غير مكتمل" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "مرجع رمزي معدوم الطول" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "رقم متوقع" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "مرجع كيان غير صحيح" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "نتيجة نهائية '\\'" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "سلسلة خروج غير معروفة" + +#: ../glib/gregex.c:2359 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "خطأ عند قراءة نص الإستبدال \"%s\" عند المحرف %Ilu: ‏%s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "النص المقتبس لا يبدأ بعلامة اقتباس" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "علامة اقتباس غير مطابقة في سطر الأوامر أو نص منقول من الصدفة" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "انتهى النص بعد المحرف '\\' (النص كان '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "انتهى النص قبل ايجاد المُقتَبَس لـ%c (النص كان '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "كان النص فارغا (أو كان يحتوي على فراغ أبيض)" + +#: ../glib/gspawn.c:210 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "فشلت قراءة البيانات من العملية الإبنة (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "خطأ غير متوقع في select() أثناء قراءة البيانات من العملية الإبنة (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "خطأ غير متوقع في waitpid() (%s)" + +#: ../glib/gspawn.c:1190 ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "فشلت القراءة من الأنبوب الإبن (%s)" + +#: ../glib/gspawn.c:1258 +#, c-format +msgid "Failed to fork (%s)" +msgstr "فشل تشعيب (%s)" + +#: ../glib/gspawn.c:1406 ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "فشل التغيير إلى الدليل '%s' ‏(%s)" + +#: ../glib/gspawn.c:1416 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "فشل تنفيذ العملية الإبنة \"%s\" ‏(%s)" + +#: ../glib/gspawn.c:1426 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "فشل اعادة توجيه الخرْج أو الدخْل للعملية الإبنة (%s)" + +#: ../glib/gspawn.c:1435 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "فشل تشعيب العملية الإبنة (%s)" + +#: ../glib/gspawn.c:1443 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "خطأ غير معروف أثناء تنفيذ العملية الإبنة \"%s\"" + +#: ../glib/gspawn.c:1467 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "فشلت قراءة بيانات كافية من أنبوب child pid ‏(%s)" + +#: ../glib/gspawn.c:1540 ../glib/gspawn-win32.c:299 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "فشل عمل أنبوب للاتصال بالعملية الإبنة (%s)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "فشلت قراءة البيانات من العملية الإبنة" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "فشل تنفيذ العملية الإبنة (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "اسم برنامج غير صحيح: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "سلسلة غير صالحة في متجه الأحجية عند %Id: ‏%s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "سلسلة غير صالحة في البيئة: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "دليل عمل غير سليم: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "فشل تنفيذ البرنامج المساعد (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "خطأ غير متوقع في g_io_channel_win32_poll() أثناء القراءة من عملية ابنة" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "محرف خارج حدود UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "تتابع غير سليم في دخْل التحويل" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "محرف خارج حدود UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "صفر بايت" +msgstr[1] "بايت واحد" +msgstr[2] "%u بايت" +msgstr[3] "%u بايت" +msgstr[4] "%u بايت" +msgstr[5] "%u بايت" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%I.1f ك.بايت" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%I.1f م.بايت" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%I.1f ج.بايت" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%I.1f ت.بايت" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%I.1f ب.بايت" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%I.1f Ø¥.بايت" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%I.1f ك.بايت" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%I.1f م.بايت" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%I.1f ج.بايت" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%I.1f ت.بايت" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%I.1f ب.بايت" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%I.1f Ø¥.بايت" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "صفر بايت" +msgstr[1] "بايت واحد" +msgstr[2] "%s بايت" +msgstr[3] "%s بايت" +msgstr[4] "%s بايت" +msgstr[5] "%s بايت" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%I.1f ك.بايت" + +#~ msgid "File is empty" +#~ msgstr "الملف فارغ" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "ملف المفتاح يحتوي على مفتاح '%s' والذي لديه قيمة لايمكن تفسيرها." + +#~ msgid "Error reading from unix: %s" +#~ msgstr "خطأ عند القراءة من يونكس: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "خطأ عند غلق يونكس: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "خطأ أثناء الكتابة إلى يونكس: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "ص" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "م" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "" +#~ "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 "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.po b/po/as.po new file mode 100644 index 0000000..3c818dc --- /dev/null +++ b/po/as.po @@ -0,0 +1,4478 @@ +# translation of as.po to Assamese +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Amitakhya Phukan , 2007, 2008. +# Amitakhya Phukan , 2009. +# Nilamdyuti Goswami , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: as\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-06 22:15+0000\n" +"PO-Revision-Date: 2013-01-07 17:43+0530\n" +"Last-Translator: Nilamdyuti Goswami \n" +"Language-Team: Assamese \n" +"Language: as\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=(n!=1)\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:184 ../gio/ginputstream.c:375 +#: ../gio/ginputstream.c:612 ../gio/ginputstream.c:830 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s লৈ বহুত ডাঙৰ count মান দিয়া হৈছে" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "ভিত্তি স্ৰোতত Seek সমৰ্থিত নহয়" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream ক truncate কৰিব নোৱাৰি" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1020 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "স্ৰোত ইতিমধ্যে বন্ধ" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "ভিত্তি স্ৰোতত Truncate à§° সমৰ্থন নাই" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "কৰ্ম বাতিল কৰা হৈছে" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "অবৈধ অবজেক্ট, আৰম্ভ কৰা হোৱা নাই" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ইনপুটত অবৈধ মাল্টিবাইট ক্ৰম" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "গন্তব্যত পৰ্যাপ্ত স্থান নাই" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "সলনি কৰাৰ ইনপুটত অৱৈধ byte ক্ৰম" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "সলনি কৰাৰ সময়ত ত্ৰুটি: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "বাতিল কৰিব পৰা আৰম্ভ সমৰ্থিত নহয়" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "আখৰৰ সংহতি '%s' à§° পৰা '%s' লৈ সলনি কৰাৰ সমৰ্থন নাই" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' à§° পৰা '%s' লৈ সলনি কৰা পৰিৱৰ্তকক খোলিব নোৱাৰি" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s ধৰণ" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "অজ্ঞাত ধৰণ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ফাইলৰ ধৰণ" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials এই OS ত প্ৰণয়ন কৰা হোৱা নাই" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "আপোনাৰ প্লেটফৰ্মৰ বাবে কোনো GCredentials সমৰ্থন নাই" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials à§° এই OS ত এটা প্ৰক্ৰিয়া ID নাই" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ৰোতৰ অপ্ৰত্যাশিত আগতীয়া অন্ত।" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "ঠিকনা প্ৰবিষ্টি '%s' ত অসমৰ্থিত কি '%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "ঠিকনা '%s' অবৈধ (সঠিক এটা পথৰ প্ৰয়োজন, tmpdir অথবা এবস্ট্ৰেক্ট কিসমূহ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "ঠিকনা প্ৰবিষ্টি '%s' ত মূল্যহিন কি/মান যোৰ সংযুক্তি" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "ঠিকনা '%s' ত ত্ৰুটি - পৰ্ট বৈশিষ্ট ক্ষতিগ্ৰস্থ" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "ঠিকনা '%s' ত ত্ৰুটি - পৰিয়াল বৈশিষ্ট ক্ষতিগ্ৰস্থ" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "ঠিকনা উপাদান '%s' এ এটা কলন (:) অন্তৰ্ভুক্ত নকৰে" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"কি/মান যোৰ %d, '%s', ঠিকনা উপাদান '%s' ত এটা ইকুৱেল চিহ্ন অন্তৰ্ভুক্ত নকৰে" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"কি অথবা মান আনএক্সেইপ কৰোতে ত্ৰুটি কি/মান যোৰ %d, %s ত,ঠিকনা উপাদান '%s' ত" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"ঠিকনা '%s' ত ত্ৰুটি - unix পৰিৱহনৰ কেৱল এটা 'পথ' অথবা 'এবস্ট্ৰেক্ট' সংহতি " +"কৰাৰ " +"প্ৰয়োজন" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "ঠিকনা '%s' ত ত্ৰুটি - হস্ট বৈশিষ্ট সন্ধানহিন অথবা ক্ষতিগ্ৰস্থ" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "ঠিকনা '%s' ত ত্ৰুটি - পৰ্ট বৈশিষ্ট সন্ধানহিন অথবা ক্ষতিগ্ৰস্থ" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "ঠিকনা '%s' ত ত্ৰুটি - noncefile বৈশিষ্ট সন্ধানহিন অথবা ক্ষতিগ্ৰস্থ" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "স্বচালিত-লঞ্চ কৰোতে ত্ৰুটি: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "ঠিকনা '%s' à§° বাবে অজ্ঞাত অথবা অসমৰ্থিত পৰিৱহন '%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "nonce file '%s' খোলোতে ত্ৰুটি: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "nonce file '%s' à§° পঢ়োতে ত্ৰুটি: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "nonce file '%s' à§° পৰা পঢ়োতে ত্ৰুটি, ১৬ বাইট আশা কৰা হৈছিল, %d পোৱা গল" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "nonce file '%s' à§° সমলসমূহ স্ৰোতলে লিখোতে ত্ৰুটি:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "দিয়া ঠিকনা ৰিক্ত" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "setuid অৱস্থাত এটা বাৰ্তা বাচ প্ৰজনন কৰিব নোৱাৰি" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "এটা মেচিন-আইডিৰ অৱিহনে এটা বাৰ্তা বাচ সৃজন কৰিব নোৱাৰি: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "কমান্ড শাৰী '%s' সৃজন কৰোতে ত্ৰুটি: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(এই উইন্ডো বন্ধ কৰিবলে যিকোনো আখৰ টাইপ কৰক)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "অধিবেশন dbus চলি থকা নাই, আৰু autolaunch ব্যৰ্থ হল" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "অধিবেশন বাচ ঠিকনা নিৰ্ধাৰণ কৰিব নোৱাৰি (এই OS à§° বাবে প্ৰণয়ন কৰা নহয়)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE পৰিৱেশ চলকৰ পৰা বাচ ঠিকনা নিৰ্ধাৰণ কৰিব নোৱাৰি - অজ্ঞাত " +"মান '%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"বাচ ঠিকনা নিৰ্ধাৰণ কৰিব নোৱাৰি কাৰণ DBUS_STARTER_BUS_TYPE পৰিৱেশ চলক সংহতি " +"কৰা হোৱা নাই" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "অজ্ঞাত বাচ ধৰণ %d" + +#: ../gio/gdbusauth.c:297 +msgid "Unexpected lack of content trying to read a line" +msgstr "এটা শাৰী পঢ়োতে অপ্ৰত্যাশিত সমল চেষ্টাৰ অভাৱ" + +#: ../gio/gdbusauth.c:341 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "এটা শাৰী (সুৰক্ষিতভাৱে) পঢ়াৰ চেষ্টাত অপ্ৰত্যাশিত সমল চেষ্টাৰ অভাৱ" + +#: ../gio/gdbusauth.c:512 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"সকলো উপলব্ধ প্ৰমাণীকৰণ পদ্ধতি শেষ হৈছে (চেষ্টা কৰা হৈছে: %s) (উপলব্ধ: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer ৰে বাতিল কৰা হৈছে" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "ডাইৰেকটৰি `%s' à§° বাবে তথ্য প্ৰাপ্ত কৰোতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"ডাইৰেকটৰি '%s' ত অনুমতিসমূহ ক্ষতিগ্ৰস্থ। আশা কৰা অৱস্থা 0700, প্ৰাপ্ত হল 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "ডাইৰেকটৰি '%s' সৃষ্টি কৰোতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "keyring '%s' ক পঢ়াৰ বাবে খোলোতে ত্ৰুটি: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "keyring à§° শাৰী %d ক্ষতিগ্ৰস্থ '%s' ত সমল '%s' à§° সৈতে" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "keyring à§° %d শাৰীৰ প্ৰথম টকেন ক্ষতিগ্ৰস্থ '%s' ত সমল '%s' à§° সৈতে" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "keyring à§° %d শাৰীৰ দ্বিতীয় টকেন ক্ষতিগ্ৰস্থ '%s' ত সমল '%s' à§° সৈতে" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "আইডি %d à§° সৈতে কুকি পোৱা নগল '%s' à§° keyring ত" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "পুৰনি lock file '%s' মচি পেলাওতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "lock file '%s' সৃষ্টি কৰোতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(অসংযুক্ত) lock file '%s' বন্ধ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "lock file '%s' আনসংযোগ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "লিখিবৰ বাবে keyring '%s' খোলিবলে ত্ৰুটি: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(অতিৰিক্তভাৱে, `%s' à§° বাবে লক মুক্ত কৰাও ব্যৰ্থ হল: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "সংযোগ বন্ধ" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "সময়অন্ত প্ৰাপ্ত কৰা হৈছিল" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "এটা ক্লাএন্ট দিশ সংযোগ সৃষ্টি কৰোতে অসমৰ্থিত ফ্লেগসমূহৰ সন্মুখিন হৈছে" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"পথ %s à§° অবজেক্টত এনে কোনো আন্তঃপৃষ্ঠ `org.freedesktop.DBus.Properties' নাই" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"বৈশিষ্ট '%s' সংহতি কৰোতে ত্ৰুটি: আশা কৰা হৈছিল '%s' কিন্তু পোৱা গল '%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "এনে কোনো বৈশিষ্ট '%s' নাই" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "বৈশিষ্ট '%s' পঢ়িব নোৱাৰি" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "বৈশিষ্ট '%s' লিখিব নোৱাৰি" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "এনে কোনো আন্তঃপৃষ্ঠ '%s' নাই" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "এনে কোনো আন্তঃপৃষ্ঠ নাই" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "পথ %s ত অবজেক্টত এনে কোনো আন্তঃপৃষ্ঠ `%s' নাই" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "এনে কোনো পদ্ধতি '%s' নাই" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "বাৰ্তাৰ ধৰণ, '%s', প্ৰত্যাশিত ধৰণ '%s' à§° সৈতে মিল নাখায়" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%s ত আন্তঃপৃষ্ঠ %s à§° বাবে ইতিমধ্যে এটা অবজেক্ট এক্সপৰ্ট কৰা হৈছে" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "পদ্ধতি '%s' এ ধৰণ '%s' ঘুৰাই দিছে, কিন্তু আশা কৰা হৈছিল '%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "আন্তঃপৃষ্ঠ '%s' ত স্বাক্ষৰ '%s' à§° সৈতে পদ্ধতি '%s' অস্তিত্ববান নহয়" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s à§° বাবে এটা চাবট্ৰি ইতিমধ্যে এক্সপৰ্ট কৰা হৈছে" + +#: ../gio/gdbusmessage.c:1270 +msgid "type is INVALID" +msgstr "ধৰণ INVALID" + +#: ../gio/gdbusmessage.c:1281 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL বাৰ্তা: PATH অথবা MEMBER হেডাৰ ক্ষেত্ৰ সন্ধানহিন" + +#: ../gio/gdbusmessage.c:1292 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN বাৰ্তা: REPLY_SERIAL হেডাৰ ক্ষেত্ৰ সন্ধানহিন" + +#: ../gio/gdbusmessage.c:1304 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR বাৰ্তা: REPLY_SERIAL অথবা ERROR_NAME হেডাৰ ক্ষেত্ৰ সন্ধানহিন" + +#: ../gio/gdbusmessage.c:1317 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL বাৰ্তা: PATH, INTERFACE অথবা MEMBER হেডাৰ ক্ষেত্ৰ সন্ধানহিন" + +#: ../gio/gdbusmessage.c:1325 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL বাৰ্তা: PATH হেডাৰ ক্ষেত্ৰয় সংৰক্ষীত মান /org/freedesktop/DBus/Local " +"ব্যৱহাৰ কৰি আছে" + +#: ../gio/gdbusmessage.c:1333 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL বাৰ্তা: INTERFACE হেডাৰ ক্ষেত্ৰয় সংৰক্ষীত মান " +"org.freedesktop.DBus.Local " +"ব্যৱহাৰ কৰি আছে" + +#: ../gio/gdbusmessage.c:1382 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "%lu বাইটসমূহ পঢ়িবৰ ইচ্ছা আছিল কিন্তু %lu প্ৰাপ্ত হল" +msgstr[1] "%lu বাইট পঢ়িবৰ ইচ্ছা আছিল কিন্তু %lu প্ৰাপ্ত হল" + +#: ../gio/gdbusmessage.c:1397 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "স্ট্ৰিং '%s' à§° পিছত NUL বাইট আশা কৰা হৈছিল কিন্তু বাইট %d পোৱা গল" + +#: ../gio/gdbusmessage.c:1416 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"বৈধ UTF-8 স্ট্ৰিং আশা কৰা হৈছিল কিন্তু বাইট অফচেট %d ত অবৈধ বাইটসমূহ পোৱা গল " +"(স্ট্ৰিংৰ দৈৰ্ঘ %d)। সেই বিন্দু লৈকে বৈধ UTF-8 স্ট্ৰিং '%s' আছিল" + +#: ../gio/gdbusmessage.c:1618 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "বিশ্লেষণ কৰা মান '%s' এটা বৈধ D-Bus অবজেক্ট পথ নহয়" + +#: ../gio/gdbusmessage.c:1642 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "বিশ্লেষণ কৰা মান '%s' এটা বৈধ D-Bus স্বাক্ষৰ নহয়" + +#: ../gio/gdbusmessage.c:1697 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"%u বাইট দৈৰ্ঘৰ এৰে সন্মুখিন হল। সৰ্বাধিক দৈৰ্ঘ হল 2<<26 bytes (64 MiB)।" +msgstr[1] "" +"%u বাইটসমূহ দৈৰ্ঘৰ এৰে সন্মুখিন হল। সৰ্বাধিক দৈৰ্ঘ হল 2<<26 bytes (64 MiB)।" + +#: ../gio/gdbusmessage.c:1850 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "অপৰৰ বাবে বিশ্লেষণ কৰা মান '%s' এটা বৈধ D-Bus স্বাক্ষৰ নহয়" + +#: ../gio/gdbusmessage.c:1874 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"D-Bus তাঁৰ বিন্যাসৰ পৰা ধৰণ স্ট্ৰিং '%s' à§° সৈতে GVariant ডিচিৰিএলাইজ কৰোতে " +"ত্ৰুটি" + +#: ../gio/gdbusmessage.c:2061 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"অবৈধ endianness মান। 0x6c ('l') অথবা 0x42 ('B') আশা কৰা হৈছিল কিন্তু মান 0x" +"%02x পোৱা গল" + +#: ../gio/gdbusmessage.c:2074 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "অবৈধ মূখ্য প্ৰটোকল সংস্কৰণ। আশা কৰা হৈছিল 1 কিন্তু পোৱা গল %d" + +#: ../gio/gdbusmessage.c:2130 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "স্বাক্ষৰ '%s' à§° সৈতে স্বাক্ষৰ হেডাৰ পোৱা গল কিন্তু বাৰ্তা অংশ ৰিক্ত" + +#: ../gio/gdbusmessage.c:2144 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "বিশ্লেষণ কৰা মান '%s' এটা বৈধ D-Bus স্বাক্ষৰ (দেহৰ বাবে)" + +#: ../gio/gdbusmessage.c:2174 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "বাৰ্তাত কোনো স্বাক্ষৰ হেডাৰ নাই কিন্তু বাৰ্তা দেহ হল %u বাইট" +msgstr[1] "বাৰ্তাত কোনো স্বাক্ষৰ হেডাৰ নাই কিন্তু বাৰ্তা দেহ হল %u বাইটসমূহ" + +#: ../gio/gdbusmessage.c:2184 +msgid "Cannot deserialize message: " +msgstr "বাৰ্তা deserialize কৰিব নোৱাৰি: " + +#: ../gio/gdbusmessage.c:2505 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"D-Bus তাঁৰ বিন্যাসৰ লে ধৰণ স্ট্ৰিং '%s' à§° সৈতে GVariant চিৰিএলাইজ কৰোতে ত্ৰুটি" + +#: ../gio/gdbusmessage.c:2642 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"বাৰ্তাৰ %d ফাইল বিৱৰকসমূহ আছে কিন্তু হেডাৰ ক্ষেত্ৰয় %d ফাইল বিৱৰকসমূহৰ সূচনা " +"দিয়ে" + +#: ../gio/gdbusmessage.c:2650 +msgid "Cannot serialize message: " +msgstr "বাৰ্তা চিৰিয়েলাইজ কৰিব নোৱাৰি: " + +#: ../gio/gdbusmessage.c:2694 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "বাৰ্তা দেহৰ স্বাক্ষৰ '%s' আছে কিন্তু কোনো স্বাক্ষৰ হেডাৰ নাই" + +#: ../gio/gdbusmessage.c:2704 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "বাৰ্তা দেহৰ ধৰণ স্বাক্ষৰ '%s' আছে কিন্তু হেডাৰ ক্ষেত্ৰত স্বাক্ষৰ '%s'" + +#: ../gio/gdbusmessage.c:2720 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "বাৰ্তা দেহ ৰিক্ত কিন্তু হেডাৰ ক্ষেত্ৰত স্বাক্ষৰ হল `(%s)'" + +#: ../gio/gdbusmessage.c:3270 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "'%s' ধৰণৰ দেহৰ সৈতে ত্ৰুটি ঘুৰাই দিয়া হৈছে" + +#: ../gio/gdbusmessage.c:3278 +msgid "Error return with empty body" +msgstr "ৰিক্ত দেহৰ সৈতে ত্ৰুটি ঘুৰাই দিয়া হৈছে" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "হাৰ্ডৱেৰ আলেখ্য প্ৰাপ্ত কৰিবলে অক্ষম: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id অথবা /etc/machine-id ল'ড কৰিবলে অক্ষম: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s à§° বাবে StartServiceByName কল কৰোতে ত্ৰুটি: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "অপ্ৰত্যাশিত উত্তৰ %d StartServiceByName(\"%s\") পদ্ধতিৰ পৰা" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"পদ্ধতি আৱাহন কৰিব নোৱাৰি; প্ৰক্সি এটা জনপ্ৰিয় কিন্তু গৰাকী নথকা নামৰ বাবে আৰু " +"প্ৰক্সি " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START à§° সৈতে সৃষ্টি কৰা হৈছিল" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "এবস্ট্ৰেক্ট নাম-স্পেইচ সমৰ্থিত নহয়" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "এটা চাৰ্ভাৰ সৃষ্টি কৰোতে nonce file ধাৰ্য্য কৰিব নোৱাৰি" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' ত nonce file লিখোতে ত্ৰুটি: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "স্ট্ৰিং '%s' এটা বৈধ D-Bus GUID নহয়" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "অসমৰ্থিত পৰিৱহন '%s' ত শুনিব নোৱাৰি" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"কমান্ডসমূহ:\n" +" help এই তথ্য দেখুৱায়\n" +" introspect এটা দূৰৱৰ্তী অবজেক্ট নিৰীক্ষণ কৰক\n" +" monitor এটা দূৰৱৰ্তী অবজেক্ট মনিটৰ কৰক\n" +" call এটা দূৰৱৰ্তী অবজেক্টত এটা পদ্ধতি আৱাহন কৰক\n" +" emit এটা সংকেত এৰক\n" +"\n" +"প্ৰতিটো কমান্ডত সহায়ৰ বাবে \"%s COMMAND --help\" ব্যৱহাৰ কৰক।\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "ত্ৰুটি: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "নিৰীক্ষণ XML বিশ্লেষণ কৰোতে ত্ৰুটি: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "চিস্টেম বাচৰ সৈতে সংযোগ কৰক" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "অধিবেশন বাচৰ সৈতে সংযোগ কৰক" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "প্ৰদান কৰা D-Bus ঠিকনাৰ সৈতে সংযোগ কৰক" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "সংযোগ অন্তবিন্দু বিকল্পসমূহ:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "সংযোগ অন্তবিন্দু ধাৰ্য্য কৰা বিকল্পসমূহ" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "কোনো সংযোগ অন্তবিন্দু ধাৰ্য্য কৰা হোৱা নাই" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "বহু সংযোগ অন্তবিন্দু ধাৰ্য্য কৰা হৈছে" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "সতৰ্কবাৰ্তা: নিৰীক্ষণ তথ্যৰ মতে, আন্তঃপৃষ্ঠ '%s' à§° অস্তিত্ব নাই\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"সতৰ্কবাৰ্তা: নিৰীক্ষণ তথ্যৰ মতে, আন্তঃপৃষ্ঠ '%s' ত পদ্ধতি '%s' à§° অস্তিত্ব " +"নাই\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "সংকেতৰ বাবে বৈকল্পিক গন্তব্য (অবিকল্প নাম)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "সংকেত এৰিবলে অবজেক্ট পথ" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "সংকেত আৰু আন্তঃপৃষ্ঠ নাম" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "এটা সংকেত এৰক।" + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "সংযোগ কৰোতে ত্ৰুটি: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "ত্ৰুটি: অবজেক্ট পথ ধাৰ্য্য কৰা হোৱা নাই।\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "ত্ৰুটি: %s এটা বৈধ অবজেক্ট পথ নহয়\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "ত্ৰুটি: সংকেত ধাৰ্য্য কৰা হোৱা নাই।\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "ত্ৰুটি: সংকেত সম্পূৰ্ণভাৱে-অৰ্হতাসম্পন্ন নাম হব লাগিব।\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ত্ৰুটি: %s এটা বৈধ আন্তঃপৃষ্ঠ নাম নহয়\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ত্ৰুটি: %s এটা বৈধ সদস্য নাম নহয়\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ত্ৰুটি: %s এটা বৈধ অবিকল্প বাচ নাম নহয়।\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "প্ৰাচল %d বিশ্লেষণ কৰোতে ত্ৰুটি: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "সংযোগ পৰিষ্কাৰ কৰোতে ত্ৰুটি: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "পদ্ধতি আৱাহন কৰিবলে গন্তব্য নাম" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "পদ্ধতি আৱাহন কৰিবলে অবজেক্ট পথ" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "পদ্ধতি আৰু আন্তঃপৃষ্ঠ নাম" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "ছেকেণ্ডসমূহত সময়অন্ত" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "এটা দূৰৱৰ্তী অবজেক্টত এটা পদ্ধতি আৱাহন কৰক।" + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "ত্ৰুটি: গন্তব্য ধাৰ্য্য কৰা হোৱা নাই\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "ত্ৰুটি: অবজেক্ট পথ ধাৰ্য্য কৰা হোৱা নাই\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "ত্ৰুটি: পদ্ধতি নাম ধাৰ্য্য কৰা হোৱা নাই\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "ত্ৰুটি: পদ্ধতি নাম '%s' অবৈধ\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "প্ৰাচল %d বিশ্লেষণ কৰোতে ত্ৰুটি ধৰণ '%s': %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "নিৰীক্ষণ কৰিবলে গন্তব্য নাম" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "নিৰীক্ষণ কৰিবলে অবজেক্ট পথ" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "XML প্ৰিন্ট কৰক" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "সন্তান নিৰীক্ষণ কৰক" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "কেৱল বৈশিষ্টসমূহ প্ৰিন্ট কৰক" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "এটা দূৰৱৰ্তী অবজেক্ট নিৰীক্ষণ কৰক।" + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "মনিটৰলে গন্তব্য নাম" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "মনিটৰলে অবজেক্ট পথ" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "এটা দূৰৱৰ্তী অবজেক্ট মনিটৰ কৰক।" + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ ফাইলত Exec ক্ষেত্ৰ নিৰ্ধাৰিত নহয়" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "এপ্লিকেচনৰ বাবে আৱশ্যক টাৰ্মিনেল পোৱা নাযায়" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ব্যৱহাৰকাৰী এপ্লিকেচনৰ বিন্যাস ফোল্ডাৰ %s সৃষ্টি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ব্যৱহাৰকাৰী MIME বিন্যাস ফোল্ডাৰ %s সৃষ্টি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "এপ্লিকেচন তথ্যৰ এটা পৰিচয়কৰ প্ৰয়োজন" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ব্যৱহাৰকাৰী ডেস্কটপ ফাইল %s সৃষ্টি কৰিবলৈ ব্যৰ্থ" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "%s à§° বাবে স্বনিৰ্ধাৰত ব্যাখ্যা" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ড্ৰাইভ দ্বাৰা ইজেক্ট বা eject_with_operation কৰ্ম সঞ্চালিত নহয়" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "ড্ৰাইভত মিডিয়াৰ বাবে প'ল কৰাৰ কাৰ্যক্ষমতা নাই" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "ড্ৰাইভ দ্বাৰা আৰম্ভ কৰ্ম সঞ্চালিত নহয়" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "ড্ৰাইভ দ্বাৰা বন্ধ কৰ্ম সঞ্চালিত নহয়" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS সমৰ্থন উপলব্ধ নহয়" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem encoding à§° %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem encoding ত ট'কেনৰ ত্ৰুটি সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon encoding à§° %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon encoding ত ট'কেনৰ ত্ৰুটি সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon à§° কাৰণে এটা GEmblem প্ৰত্যাশিত" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7114 ../gio/gfile.c:7204 ../gio/gfile.c:7288 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "ধাৰণকাৰী মাউন্ট উপস্থিত নাই" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "ডাইৰেকটৰিৰ ওপৰত কপি কৰা নাযাব" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "ডাইৰেকটৰিৰ ওপৰত ডাইৰেকটৰি কপি কৰা নাযায়" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "লক্ষ্য ফাইল উপস্থিত আছে" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "ৰিকাৰ্ছিভ ভাবে ডাইৰেকটৰি কপি কৰা নাযাব" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "Splice সমৰ্থিত নহয়" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "ফাইল splice কৰোতে ত্ৰুটি: %s" + +#: ../gio/gfile.c:2952 +#| msgid "Move between mounts not supported" +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "মাউন্টসমূহৰ মাজত কপি (ৰিফ্লিঙ্ক/ক্লৌন) সমৰ্থিত নহয়" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "কপি (ৰিফ্লিঙ্ক/ক্লৌন) সমৰ্থিত নহয় অথবা অবৈধ" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "কপি (ৰিফ্লিৃঙ্ক/ক্লৌন) সমৰ্থিত নহয় অথবা কাম নকৰিলে" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "বিশেষ ফাইল কপি কৰিব নোৱাৰি" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "অৱৈধ চিমসংযোগ মান উপলব্ধ কৰা হৈছে" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "আবৰ্জনা সমৰ্থিত নহয়" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ফাইলৰ নামত '%c' ব্যৱহাৰ কৰা নাযাব" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বাৰা mount প্ৰয়োগ কৰা নহয়" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত ফাইল ব্যৱস্থাপনাৰ উদ্দেশ্যে কোনো এপ্লিকেচন নিবন্ধিত নহয়" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumerator বন্ধ" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "ফাইল enumerator ত অসমাপ্ত কৰ্ম উপস্থিত" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "স্ৰোত দ্বাৰা query_info সমৰ্থিত নহয়" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "স্ৰোত দ্বাৰা Seek সমৰ্থিত নহয়" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "ইনপুট স্ৰোতত Truncate à§° অনুমতি নাই" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "স্ৰোতত Truncate à§° সমৰ্থন নাই" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ট'কেনৰ ত্ৰুটি সংখ্যা (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "শ্ৰেণীৰ নাম %s à§° ধৰণ নাই" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধৰনে GIcon আন্তঃপৃষ্ঠ প্ৰণয়ন নকৰে" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধৰণক class কৰা হোৱা নাই" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "ত্ৰুটি সংস্কৰণ সংখ্যা: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধৰণে from_tokens() প্ৰণয়ন নকৰে GIcon আন্তঃপৃষ্ঠত" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "আইকন এনক'ডিংৰ প্ৰদান কৰা সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "কোনো ঠিকনা ধাৰ্য্য কৰা হোৱা নাই" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "দৈৰ্ঘ্য %u ঠিকনাৰ বাবে অতি দীঘল" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "ঠিকনাৰ বিটসমূহ সংহতি উপসৰ্গ দৈৰ্ঘৰ বাহিৰ আছে" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' ক IP ঠিকনা মাস্ক হিচাপে বিশ্লেষণ কৰিব পৰা নগল" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "চকেট ঠিকনাৰ কাৰণে যথেষ্ট স্থান নাই" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "অসমৰ্থিত চকেট ঠিকনা" + +#: ../gio/ginputstream.c:193 +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:1030 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "স্ৰোতৰ ক্ষেত্ৰত অসমাপ্ত কৰ্ম উপস্থিত আছে" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "উপাদান <%s> <%s> à§° ভিতৰত অনুমোদিত নহয়" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "উপাদান <%s> ওপৰস্তৰত অনুমোদিত নহয়" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "ফাইল %s সম্পদত বহুবাৰ দেখা গৈছে" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "কোনো উৎস ডাইৰেকটৰিত '%s' অৱস্থান কৰাত ব্যৰ্থ" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "বৰ্তমান ডাইৰেকটৰিত '%s' অৱস্থান কৰাত ব্যৰ্থ" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "অজ্ঞাত প্ৰক্ৰিয়াকৰণ বিকল্প \"%s\"" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "অস্থায়ী ফাইল সৃষ্টি কৰোতে ব্যৰ্থ: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"ইনপুট ফাইলক xmllint à§° সৈতে প্ৰক্ৰিয়াকৰণ কৰোতে ত্ৰুটি:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata à§° সৈতে ইনপুট ফাইল প্ৰক্ৰিয়াকৰণ কৰোতে ত্ৰুটি:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "ফাইল %s পঢ়োতে ত্ৰুটি: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "ফাইল %s সংকোচন কৰোতে ত্ৰুটি" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "লিখনী <%s> à§° ভিতৰত নাহিবও পাৰে" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "আউটপুট ফাইলৰ নাম" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "ডাইৰেকটৰিসমূহ যৰ পৰা ফাইলসমূহ পঢ়া হব (বৰ্তমান ডাইৰেকটৰিলে অবিকল্পিত) " + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "লক্ষ্য ফাইল সম্প্ৰসাৰন দ্বাৰা নিৰ্বাচিত বিন্যাসত আউটপুট সৃজন কৰক" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "উৎস হেডাৰ সৃজন কৰক" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "আপোনাৰ ক'ডত সম্পদ ফাইলৰ সৈতে সংযোগ কৰিবলে ব্যৱহৃত উৎসক'ড সৃজন কৰক" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "নিৰ্ভৰতা তালিকা সৃজন কৰক" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "সম্পদক স্বচালিতভাৱে সৃষ্টি আৰু ৰেজিস্টাৰ নকৰিব" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "ফলনসমূহ এক্সপোৰ্ট নকৰিব; সিহতক G_GNUC_INTERNAL ঘোষণা কৰক" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "সৃজন কৰা উৎস ক'ডৰ বাবে C identifier নাম ব্যৱহাৰ কৰা হৈছে" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"এটা সম্পদ ফাইলত এটা সম্পদ ধাৰ্য্যকৰণ কমপাইল কৰক।\n" +"সম্পদ ধাৰ্য্যকৰণ ফাইলসমূহৰ প্ৰসাৰণ .gresource.xml থাকে,\n" +"আৰু সম্পদ ফাইলৰ প্ৰসাৰণ .gresource থাকে।" + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "আপুনি এটা ফাইল নাম দিব লাগিব\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "ৰিক্ত নামসমূহৰ অনুমতি নাই" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "অবৈধ নাম '%s': নামসমূহ এটা তলফলা আখৰৰে আৰম্ভ হব লাগিব" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"অবৈধ নাম '%s': অবৈধ আখৰ '%c'; কেৱল তলৰফলা আখৰসমূহ, নম্বৰসমূহ আৰু হাইফেন ('-') " +"à§° " +"অনুমতি আছে।" + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "অবৈধ নাম '%s': দুটা ক্ৰমাগত হাইফেন ('--') à§° অনুমতি নাই।" + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "অবৈধ নাম '%s': শেষ আখৰ এটা হাইফেন ('-') নহবও পাৰে।" + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "অবৈধ নাম '%s': সৰ্বাধিক দৈৰ্ঘ হল ১০২৪" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " ইতিমধ্যে ধাৰ্য্যত" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "এটা 'list-of' স্কিমালে কিসমূহ যোগ কৰিব নোৱাৰি" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " ইতিমধ্যে ধাৰ্য্যত" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" ত ছায়াসমূহ ; মান সলনি কৰিবলে " +" ব্যৱহাৰ কৰক" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"এটা 'type', 'enum' অথবা 'flags' এটা বৈশিষ্ট হিচাপে লে ধাৰ্য্য কৰিব লাগিব" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (এতিয়াও) বিৱৰিত নহয়।" + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "অবৈধ GVariant ধৰণ স্ট্ৰিং '%s'" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " দিয়া হৈছে কিন্তু স্কিমায় একো প্ৰসাৰন কৰা নাই" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "অভাৰৰাইড কৰিবলে কোনো নাই" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " ইতিমধ্যে ধাৰ্য্যত" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " ইতিমধ্যে ধাৰ্য্যত" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " এ এতিয়াও-অস্তিত্বত-নহোৱা স্কিমা '%s' ক প্ৰসাৰন কৰে" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " এতিয়াও-অস্তিত্বত-নহোৱা স্কিমা '%s' à§° তালিকা" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "এটা পথৰ সৈতে এটা স্কিমাৰ এটা তালিকা হব নোৱাৰিব" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "এটা পথৰ সৈতে এটা স্কিমা প্ৰসাৰন কৰিব নোৱাৰি" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" এটা তালিকা, যি এটা তালিকা নহয় প্ৰসাৰন কৰা " +"হৈছে" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" এ প্ৰসাৰন কৰে " +"কিন্তু '%s' এ '%s' প্ৰসাৰন নকৰে" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "এটা পথ, যদি দিয়া আছে, এটা স্লেশৰ সৈতে আৰম্ভ আৰু অন্ত হব লাগিব" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "এটা তালিকাৰ পথ ':/' à§° সৈতে শেষ হব লাগিব" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ইতিমধ্যে ধাৰ্য্যত" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "উপাদান <%s> ওপৰ স্তৰত অনুমোদিত নহয়" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict ধাৰ্য্য কৰা হৈছিল; প্ৰস্থান কৰা হৈছিল।\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "এই সম্পূৰ্ণ ফাইল উপেক্ষা কৰা হৈছে।\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "এই ফাইল উপেক্ষা কৰা হৈছে।\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "অভাৰৰাইড ফাইল '%s' ত দেখুৱা দৰে স্কিমা '%s' ত এনে কোনো কি '%s' নাই" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; এই কিৰ বাবে অভাৰৰাইড উপেক্ষা কৰা হৈছে।\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " আৰু --strict ধাৰ্য্য কৰা হৈছিল; প্ৰস্থান কৰা হৈছে।\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"অভাৰৰাইড ফাইল '%s' ত দেখুৱা দৰে স্কিমা '%s' ত কি' '%s' বিশ্লেষণ কৰোতে ত্ৰুটি: " +"%s।" + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "এই কিৰ বাবে অভাৰৰাইড উপেক্ষা কৰা হৈছে।\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"অভাৰৰাইড ফাইল '%s' ত স্কিমা '%s' ত কি '%s' à§° বাবে অভাৰৰাইড স্কিমাত দিয়া " +"বিস্তাৰৰ বাহিৰ" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"অভাৰৰাইড ফাইল '%s' ত স্কিমা '%s' ত কি '%s' à§° বাবে অভাৰৰাইড বৈধ পছন্দসমূহৰ " +"তালিকাত নাই" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ফাইল ক'ত সংৰক্ষণ কৰা হব" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "স্কিমাসমূহত যিকোনো ত্ৰুটিত বাতিল কৰিব" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled ফাইল নিলিখিব" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "কি নাম বাধাসমূহ বলৱৎ নকৰিব" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"সকলো GSettings স্কিমা ফাইলসমূহক এটা স্কিমা ক্যাশত কমপাইল কৰক।\n" +"স্কিমা ফাইলসমূহৰ সম্প্ৰসাৰন .gschema.xml থাকিব লাগিব,\n" +"আৰু ক্যাশ ফাইলক gschemas.compiled কোৱা হয়।" + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "আপুনি এটা ডাইৰেকটৰি নাম দিব লাগিব\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "কোনো স্কিমা ফাইল পোৱা নগল:" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "একো কৰা নাই।\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "অস্তিত্ববান আউটপুট ফাইল আতৰোৱা হল।\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "অবিকল্পিত স্থানীয় ডাইৰেকটৰিৰ মনিটৰৰ ধৰণ পোৱা নগল" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ফাইলৰ নাম অৱৈধ: %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ফাইলচিস্টেম তথ্য প্ৰাপ্ত কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "root ডাইৰেকটৰিৰ নাম পৰিবৰ্তন কৰা সম্ভৱ নহয়" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "ফাইলৰ নাম পৰিবৰ্তনত সমস্যা: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "ফাইল পুনৰ নামকৰণ কৰিব নোৱাৰি, ফাইলনাম ইতিমধ্যে অস্তিত্ববান" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "ফাইলৰ নাম অবৈধ" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "ডাইৰেকটৰি খোলিবলৈ সমস্যা" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "ফাইল খোলিবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "ফাইল আঁতৰাবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "ফাইল আবৰ্জনালৈ স্থানান্তৰ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবৰ্জনাৰ ডাইৰেকটৰি %s সৃষ্টি কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "আবৰ্জনাৰ ঊৰ্ধ্বতন ডাইৰেকটৰি চিনাক্ত কৰিবলৈ ব্যৰ্থ" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "আবৰ্জনাৰ ডাইৰেকটৰি চিনাক্ত বা সৃষ্টি কৰিবলৈ ব্যৰ্থ" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing তথ্যৰ ফাইল সৃষ্টি কৰিব নোৱাৰি: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ফাইল বৰ্জন কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "অভ্যন্তৰীণ ত্ৰুটি" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "ডাইৰেকটৰি সৃষ্টি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ফাইলচিস্টেময়ে সাংকেতিক সংযোগসমূহ সমৰ্থন নকৰে" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "চিমসংযোগ সৃষ্টি কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "ফাইল স্থানান্তৰ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "ডাইৰেকটৰিৰ ওপৰত ডাইৰেকটৰি স্থানান্তৰ কৰা নাযাব" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "বেক-আপ ফাইল সৃষ্টি কৰিবলৈ ব্যৰ্থ" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "লক্ষ্য ফাইল আঁতৰাবলৈ সমস্যা: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "মাউন্ট কৰা অৱস্থানত স্থানান্তৰ কৰা সম্ভৱ নহয়" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "বৈশিষ্টৰ মান নন-NULL হব লাগিব" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "অবৈধ বৈশিষ্টৰ ধৰণ (স্ট্ৰিং প্ৰত্যাশিত)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "অবৈধ সম্প্ৰসাৰিত বৈশিষ্টৰ নাম" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "সম্প্ৰসাৰিত বৈশিষ্ট নিৰ্ধাৰণ কৰোঁতে ত্ৰুটি '%s': %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (অৱৈধ এনক'ডিং)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ফাইল '%s' à§° বাবে তথ্য প্ৰাপ্ত কৰোতে ত্ৰুটি: %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "ফাইল বিৱৰকৰ বাবে তথ্য প্ৰাপ্ত কৰোতে ত্ৰুটি: %s" + +#: ../gio/glocalfileinfo.c:2026 +msgid "Invalid attribute type (uint32 expected)" +msgstr "অবৈধ বৈশিষ্টৰ ধৰণ (প্ৰত্যাশিত uint32)" + +#: ../gio/glocalfileinfo.c:2044 +msgid "Invalid attribute type (uint64 expected)" +msgstr "অবৈধ বৈশিষ্টৰ ধৰণ (প্ৰত্যাশিত uint64)" + +#: ../gio/glocalfileinfo.c:2063 ../gio/glocalfileinfo.c:2082 +msgid "Invalid attribute type (byte string expected)" +msgstr "অবৈধ বৈশিষ্টৰ ধৰণ (প্ৰত্যাশিত byte স্ট্ৰিং)" + +#: ../gio/glocalfileinfo.c:2117 +msgid "Cannot set permissions on symlinks" +msgstr "চিমসংযোগসমূহত সন্মতি নিৰ্ধাৰণ কৰিব নোৱাৰি" + +#: ../gio/glocalfileinfo.c:2133 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2184 +#, c-format +msgid "Error setting owner: %s" +msgstr "গৰাকী নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2207 +msgid "symlink must be non-NULL" +msgstr "চিমসংযোগ NULL হ'ব নোৱাৰে" + +#: ../gio/glocalfileinfo.c:2217 ../gio/glocalfileinfo.c:2236 +#: ../gio/glocalfileinfo.c:2247 +#, c-format +msgid "Error setting symlink: %s" +msgstr "চিমসংযোগ নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2226 +msgid "Error setting symlink: file is not a symlink" +msgstr "চিমসংযোগ নিৰ্ধাৰণ কৰিবলৈ ত্ৰুটি: ফাইল চিমসংযোগ নহয়" + +#: ../gio/glocalfileinfo.c:2352 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "পৰিবৰ্তন বা অভিগমৰ সময় নিৰ্ধাৰণ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2375 +msgid "SELinux context must be non-NULL" +msgstr "SELinux à§° সন্দৰ্ভ NULL হ'ব নোৱাৰে" + +#: ../gio/glocalfileinfo.c:2390 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux à§° সন্দৰ্ভ নিৰ্ধাৰণ কৰিবলৈ ব্যৰ্থ: %s" + +#: ../gio/glocalfileinfo.c:2397 +msgid "SELinux is not enabled on this system" +msgstr "এই চিস্টেমত SELinux সক্ৰিয় কৰা নাই" + +#: ../gio/glocalfileinfo.c:2489 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s বৈশিষ্টৰ মান নিৰ্ধাৰণ সমৰ্থিত নহয়" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "ফাইলৰ পৰা পঢ়িবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ফাইলত seek কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "ফাইল বন্ধ কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "অবিকল্পিত স্থানীয় ফাইলৰ মনিটৰৰ ধৰণ পোৱা নগল" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "ফাইললৈ লিখিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুৰনি বেক-আপ সংযোগ আঁতৰাবলৈ সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "বেক-আপ প্ৰতিলিপি সৃষ্টি কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী ফাইলৰ নাম পৰিবৰ্তন কৰিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "ফাইল সৰু কৰিবলৈ ত্ৰুটি: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ফাইল '%s' খোলিবলৈ সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "লক্ষ্য ফাইল এটা ডাইৰেকটৰি" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "লক্ষ্য ফাইল সাধাৰণ ফাইল নহয়" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "ফাইল বহিৰ্তমভাৱে পৰিবৰ্তন কৰা হৈছে" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুৰনি ফাইল আঁতৰাবলৈ সমস্যা: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "অৱৈধ GSeekType উল্লিখিত হৈছে" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "অৱৈধ seek à§° অনুৰোধ" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ক truncate কৰিব নোৱাৰি" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "মেমৰিৰ আউটপুটৰ স্ৰোতক পুনঃ আকাৰ দিব নোৱাৰি" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "মেমৰিৰ আউটপুটৰ স্ৰোতক পুনঃ আকাৰ দিবলৈ ব্যৰ্থ" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"লিখা প্ৰক্ৰিয়া কৰিবলে প্ৰয়োজনীয় মেমৰিৰ পৰিমাণ উপস্থিত ঠিকনা স্থানতকে অধিক" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "স্ৰোতৰ আৰম্ভণিৰ আগত সন্ধানৰ অনুৰোধ কৰা হৈছে" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বাৰা সুসংগতভাবে সামগ্ৰীৰ ধৰণ অনুমান কৰা সম্ভৱ নহয়" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "হস্টনাম '%s' এ '[' কিন্তু নহয় ']' অন্তৰ্ভুক্ত কৰে" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "নেটৱাৰ্ক প্ৰাপ্ত কৰিব নোৱাৰি" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "হস্ট প্ৰাপ্ত কৰিব নোৱাৰি" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "নেটৱাৰ্ক মনিটৰ সৃষ্টি কৰিব পৰা নগল: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "নেটৱাৰ্ক মনিটৰ সৃষ্টি কৰিব পৰা নগল:" + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "নেটৱাৰ্ক অৱস্থা প্ৰাপ্ত কৰিব নোৱাৰি: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "আউটপুটৰ স্ৰোতে লিখা কাৰ্য ৰূপায়ন নকৰে" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "উৎসৰ স্ৰোত ইতিমধ্যে বন্ধ" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' ত সম্পদ অস্তিত্ববান নহয়" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' ত সম্পদ অসংকোচন হবলে ব্যৰ্থ হল" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s' à§° সম্পদ এটা ডাইৰেকটৰি নহয়" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "ইনপুট স্ট্ৰিমে সন্ধান প্ৰণয়ন নকৰে" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "প্ৰিন্ট সহায়" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "এটা elf ফাইলত সম্পদসমূহ অন্তৰ্ভুক্ত কৰা অংশসমূহ তালিকাভুক্ত কৰে" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"সম্পদসমূহ তালিকাভুক্ত কৰক\n" +"যদি SECTION দিয়া থাকে, কেৱল এই অংশত সম্পদসমূহ তালিকাভুক্ত কৰক\n" +"যদি PATH দিয়া থাকে, কেৱল মিল খোৱা সম্পদসমূহ তালিকাভুক্ত কৰক" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"বিৱৰণ থকা সম্পদসমূহ তালিকাভুক্ত কৰক\n" +"যদি SECTION দিয়া থাকে, কেৱল এই অংশৰ সম্পদসমূহ তালিকাভুক্ত কৰক\n" +"যদি PATH দিয়া থাকে, কেৱল মিল খোৱা সম্পদসমূহ তালিকাভুক্ত কৰক\n" +"বিৱৰণসমূহে অংশ, আকাৰ আৰু সংকোচন অন্তৰ্ভুক্ত কৰে" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "stdout লে এটা সম্পদ ফাইল নিষ্কাষণ কৰক" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"অজ্ঞাত কমান্ড %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ব্যৱহাৰ:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"কমান্ডসমূহ:\n" +" help এই তথ্য দেখুৱাওক\n" +" sections সম্পদ অংশসমূহ তালিকাভুক্ত কৰক\n" +" list সম্পদসমূহ তালিকাভুক্ত কৰক\n" +" details বিৱৰণৰ সৈতে সম্পদসমূহ তালিকাভুক্ত কৰক\n" +" extract এটা সম্পদ নিষ্কাষণ কৰক\n" +"\n" +"বিৱৰিত সহায়ৰ বাবে 'gresource help COMMAND' ব্যৱহাৰ কৰক।\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ব্যৱহাৰ:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "তৰ্কসমূহ:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION এটা (বৈকল্পিক) elf অংশ নাম\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND বিৱৰণ কৰিবলে (বিকল্প) কমান্ড\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE এটা elf ফাইল (এটা বাইনাৰি অথবা এটা অংশীদাৰী লাইব্ৰেৰী)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE এটা elf ফাইল (এটা বাইনাৰি অথবা এটা অংশীদাৰী লাইব্ৰেৰী)\n" +" অথবা এটা কমপাইল্ড সম্পদ ফাইল\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH এটা (বৈকল্পিক) সম্পদ পথ (আংশিক হব পাৰে)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PATH এটা সম্পদ পথ\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "এনে কোনো স্কিমা '%s' নাই\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "স্কিমা '%s' পুনৰঅৱস্থিত কৰিব নোৱাৰি (পথ ধাৰ্য্য কৰা হব নালাগিব)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "স্কিমা '%s' পুনৰঅৱস্থিত কৰিব পাৰি (পথ ধাৰ্য্য কৰিব লাগিব)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "ৰিক্ত পথ দিয়া হৈছে।\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "পথ এটা স্লেশ (/) à§° সৈতে আৰম্ভ হব লাগিব\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "পথ এটা স্লেশ (/) à§° সৈতে শেষ হব লাগিব\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "পথত দুটা কাষৰীয়া স্লেশ থাকিব নালাগিব (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "এনে কোনো কি '%s' নাই\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "প্ৰদান কৰা মান বৈধ বিস্তাৰৰ বাহিৰ\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "ইনস্টল (অৱস্থিত কৰিব নোৱাৰা) স্কিমাসমূহ তালিকাভুক্ত কৰক" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "ইনস্টল থকা পুনৰ অৱস্থিত কৰিব পৰা স্কিমাসমূহ তালিকাভুক্ত কৰক" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "কিসমূহক SCHEMA ত তালিকাভুক্ত কৰক" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "SCHEMA সন্তানসমূহ তালিকাভুক্ত কৰক" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"কি আৰু মানসমূহ তালিকাভুক্ত কৰক, বাৰংবাৰভাৱে\n" +"যদি কোনো SCHEMA দিয়া হোৱা নাই, সকলো কি তালিকাভুক্ত কৰক\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "KEY à§° মান প্ৰাপ্ত কৰক" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "KEY à§° বাবে বৈধ মানসমূহৰ বিস্তাৰক প্ৰশ্ন কৰক" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "KEY à§° মান VALUE লে সংহতি কৰক" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "KEY ক ইয়াৰ অবিকল্পিত মানলে পুনৰসংহতি কৰক" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA ত থকা সকলো কিক সিহতৰ অবিকল্পিতসমূহলে পুনৰসংহতি কৰক" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "নিৰীক্ষণ কৰক KEY লিখাযোগ্য হয় নে" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"KEY ক পৰিবৰ্তনসমূহৰ বাবে মনিটৰ কৰক।\n" +"যদি কোনো কি ধাৰ্য্য কৰা নহয়, SCHEMA ত থকা সকলো কি মনিটৰ কৰক।\n" +"মনিটৰিং বন্ধ কৰিবলে ^C ব্যৱহাৰ কৰক।\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ব্যৱহাৰ:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"কমান্ডসমূহ:\n" +" help এই তথ্য দেখুৱাওক\n" +" list-schemas ইনস্টল থকা স্কিমাসমূহ তালিকাভুক্ত কৰক\n" +" list-relocatable-schemas পুনৰঅৱস্থিত কৰিব পৰা স্কিমাসমূহ তালিকাভুক্ত কৰক \n" +" list-keys এটা স্কিমাৰ কিসমূহ তালিকাভুক্ত কৰক\n" +" list-children এটা স্কিমাৰ সন্তান তালিকাভুক্ত কৰক\n" +" list-recursively কি আৰু মানসমূহ তালিকাভুক্ত কৰক, পুনৰাবৃত্তি " +"কৰাকৈ\n" +" range এটা কিৰ বিস্তাৰক প্ৰশ্ন কৰে\n" +" get এটা কিৰ মান প্ৰাপ্ত কৰক\n" +" set এটা কিৰ মান সংহতি কৰক\n" +" reset এটা কিৰ মান পুনৰসংহতি কৰক\n" +" reset-recursively এটা স্কিমাত সকলো মান পুনৰসংহতি কৰক\n" +" writable এটা কি লিখিব পৰা নে নীৰিক্ষণ কৰক\n" +" monitor পৰিবৰ্তনসমূহ চাওক\n" +"\n" +"বিৱৰিত সহায়ৰ বাবে 'gsettings help COMMAND' ব্যৱহাৰ কৰক।\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ব্যৱহাৰ:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR অতিৰিক্ত স্কিমাসমূহ সন্ধান কৰিবলে এটা ডাইৰেকটৰি\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA স্কিমাৰ নাম\n" +" PATH পথ, পুনৰ অৱস্থান কৰিব পৰা স্কিমাসমূহৰ বাবে\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY স্কিমাৰ ভিতৰত (বিকল্প) কি\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY স্কিমাৰ ভিতৰত কি\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALUE সংহতি কৰিবলে মান\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "ৰিক্ত স্কিমা নাম দিয়া হৈছে\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ চকেট, আৰম্ভ কৰা হোৱা নাই" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ চকেট, ইয়াৰ কাৰণে আৰম্ভ কৰিব নোৱাৰি: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "চকেট ইতিমধ্যে বন্ধ" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "চকেট I/O সময়অন্ত হল" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd à§° পৰা GSocket সৃষ্টি কৰা হৈছে: %s" + +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "চকেট সৃষ্টি কৰিবলৈ সমস্যা: %s" + +#: ../gio/gsocket.c:515 +msgid "Unknown family was specified" +msgstr "অজ্ঞাত পৰিয়াল ধাৰ্য্য কৰা হৈছিল" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "অজ্ঞাত প্ৰটোকল ধাৰ্য্য কৰা হৈছিল" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকনা পোৱা নাযায়: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূৰৰ ঠিকনা পোৱা নাযায়: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "শুনিব পৰা নগল: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকনালৈ বান্ধিবলৈ সমস্যা: %s" + +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "মাল্টিকাস্ট দলত অংশগ্ৰহণ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "মাল্টিকাস্ট দল এৰোতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "উৎস-বিশেষ মাল্টিকাস্টৰ বাবে কোনো সমৰ্থন নাই" + +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্ৰহণ কৰোঁতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "সংযোগ চলি আছে" + +#: ../gio/gsocket.c:2330 +msgid "Unable to get pending error: " +msgstr "পেন্ডিং ত্ৰুটি পাবলৈ ব্যৰ্থ:" + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য পাওঁতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পঠিয়াবলৈ সমস্যা: %s" + +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "চকেট বন্ধ কৰিবলে অক্ষম: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "চকেট বন্ধ কৰোঁতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "চকেট অৱস্থাৰ কাৰণে প্ৰতীক্ষা কৰা হৈছে: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "সম্বাদ পঠিয়াওঁতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:3805 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage ক Windows ত সমৰ্থিত নহয়" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4274 +#, c-format +msgid "Error receiving message: %s" +msgstr "সম্বাদ পাওঁতে ত্ৰুটি: %s" + +#: ../gio/gsocket.c:4356 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "পেন্ডিং ত্ৰুটি পাবলৈ ব্যৰ্থ: %s" + +#: ../gio/gsocket.c:4375 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "এই OS à§° বাবে g_socket_get_credentials প্ৰণয়ন কৰা হোৱা নাই" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "প্ৰক্সি চাৰ্ভাৰ %s লে সংযোগ কৰিব নোৱাৰি: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s লে সংযোগ কৰিব নোৱাৰি: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "সংযোগ কৰিব পৰা নগল: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "সংযোগত অজ্ঞাত ত্ৰুটি" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "নন-TCP সংযোগৰ ওপৰত প্ৰক্সি কৰাটো সমৰ্থন কৰা নহয়।" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "প্ৰক্সি প্ৰটোকল '%s' সমৰ্থিত নহয়।" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "স্ৰোত ইতিমধ্যে বন্ধ" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "যোগ কৰা চকেট বন্ধ" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 এ IPv6 ঠিকনা '%s' ক সমৰ্থন নকৰে" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "ব্যৱহাৰকাৰীনাম SOCKSv4 প্ৰটোকলৰ বাবে অতি দীঘল" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "হস্টনাম '%s' SOCKSv4 প্ৰটোকলৰ বাবে অতি দীঘল" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "চাৰ্ভাৰ এটা SOCKSv4 প্ৰক্সি চাৰ্ভাৰ নহয়।" + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 প্ৰক্সি চাৰ্ভাৰৰ সৈতে সংযোগ নাকচ কৰা হৈছিল" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "চাৰ্ভাৰ এটা SOCKSv5 প্ৰক্সি চাৰ্ভাৰ নহয়।" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 প্ৰক্সি চাৰ্ভাৰৰ প্ৰমাণীকৰণৰ প্ৰয়োজন।" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 প্ৰক্সিৰ এটা প্ৰমাণীকৰণ পদ্ধতিৰ প্ৰয়োজন যি GLib দ্বাৰা সমৰ্থিত নহয়।" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "ব্যৱহাৰকাৰীনাম অথবা পাছৱাৰ্ড SOCKSv5 প্ৰটোকলৰ বাবে অতি দীঘল।" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 প্ৰমাণীকৰণ ত্ৰুটি ব্যৱহাৰকাৰীনাম অথবা পাছৱাৰ্ডৰ কাৰণে ব্যৰ্থ হল।" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "হস্টনাম '%s' SOCKSv5 প্ৰটোকলৰ বাবে অতি দীঘল" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 প্ৰক্সি চাৰ্ভাৰে অজ্ঞাত ঠিকনা ধৰণ ব্যৱহাৰ কৰে।" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "অভ্যন্তৰীক SOCKSv5 প্ৰক্সি চাৰ্ভাৰ ত্ৰুটি।" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 সংযোগ নিয়মসংহতি দ্বাৰা অনুমোদিত নহয়। " + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "হস্ট SOCKSv5 চাৰ্ভাৰ দ্বাৰা প্ৰাপ্ত নহয়।" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "নেটৱাৰ্ক SOCKSv5 প্ৰক্সি দ্বাৰা প্ৰাপ্ত নহয়।" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "সংযোগ SOCKSv5 প্ৰক্সি দ্বাৰা নাকচ কৰা হৈছে।" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 প্ৰক্সিয়ে 'connect' কমান্ডৰ সমৰ্থন নকৰে।" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 প্ৰক্সিয়ে প্ৰদান কৰা ঠিকনা ধৰণ সমৰ্থন নকৰে।" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "অজ্ঞাত SOCKSv5 প্ৰক্সি ত্ৰুটি।" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon encoding à§° %d সংস্কৰণ পৰিচালন কৰিব নোৱাৰি" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' বিশ্লেষণ কৰোঁতে ত্ৰুটি: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ক ওলোটা ভাবে বুজিবলৈ ত্ৰুটি: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' à§° বাবে অনুৰোধ কৰা ধৰণৰ কোনো DNS ৰেকৰ্ড নাই" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ক অস্থায়ীভাবে বুজিব পৰা নাযায়" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' বুজিব লওঁতে ত্ৰুটি" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM এনক'ড থকা ব্যক্তিগত কিক ডিক্ৰিপ্ট কৰিব নোৱাৰি" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "কোনো PEM এনকোডেড ব্যক্তিগত কি পোৱা নগল" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM এনকোডেড ব্যক্তিগত কি বিশ্লেষণ কৰিব নোৱাৰি" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "কোনো PEM এনকোডেড প্ৰমাণপত্ৰ পোৱা নগল" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM এনকোডেড প্ৰমাণপত্ৰ বিশ্লেষণ কৰিব পৰা নগল" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"আপোনাৰ অভিগম লকআউট হৈ যোৱাৰ আগত পাছৱাৰ্ড সঠিকভাৱে সুমুৱাৰ এয়া শেষ সুযোগ।" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"বহু সুমুৱা পাছৱাৰ্ড ত্ৰুটি হৈছে, আৰু আপোনাৰ অভিগম ততোধিক ব্যৰ্থতাৰ পিছত লক " +"আউট কৰি " +"দিয়া হব।" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "সুমুৱা পাছৱাৰ্ড শুদ্ধ নহয়।" + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "à§§ নিয়ন্ত্ৰণৰ সম্বাদ প্ৰত্যাশিত, %d পোৱা গ'ল" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "এঞ্চিলাৰি তথ্যৰ অপ্ৰত্যাশিত ধৰণ" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "এটা fd প্ৰত্যাশিত, কিন্তু %d পোৱা গ'ল\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "অবৈধ fd পোৱা গ'ল" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "তথ্য পঠিয়াওতে ত্ৰুটি: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "SO_PASSCRED চকেটৰ বাবে সামৰ্থবান আছে নে নিৰীক্ষণ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED সামৰ্থবান কৰোতে ত্ৰুটি: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"তথ্যসমূহ গ্ৰহন কৰাৰ বাবে এটা বাইট পঢ়িবলে আশা কৰা হৈ আছিল কিন্তু শূণ্য বাইট " +"পঢ়া হল" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "নিয়ন্ত্ৰণ বাৰ্তা আশা কৰা হোৱা নাছিল, কিন্তু %d পোৱা গল" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED অসামৰ্থবান কৰোতে ত্ৰুটি: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ফাইল বিৱৰকৰ পৰা পঢ়োতে ত্ৰুটি: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ফাইল বিৱৰক বন্ধ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ফাইলচিস্টেম root" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ফাইল বিৱৰকলে লিখোতে ত্ৰুটি: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "এই চিস্টেমত এবস্ট্ৰেক্ট UNIX ডমেইন চকেট ঠিকনাসমূহ সমৰ্থিত নহয়" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বাৰা ইজেক্ট বা eject_with_operation প্ৰয়োগ কৰা নহয়" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "এপ্লিকেচন পোৱা নাযায়" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "এপ্লিকেচন আৰম্ভ কৰিবলৈ ত্ৰুটি: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI সমৰ্থিত নহয়" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 ত এপ্লিকেচনৰ সম্বন্ধৰ সলনি সমৰ্থিত নহয়" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 ত এপ্লিকেচনৰ সম্বন্ধৰ সৃষ্টি সমৰ্থিত নহয়" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "হাতলৰ পৰা পঢ়োতে ত্ৰুটি: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "হাতল বন্ধ কৰোতে ত্ৰুটি: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "হাতললে লিখোতে ত্ৰুটি: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "পৰ্যাপ্ত মেমৰি নাই" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তৰীক ত্ৰুটি: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "অধিক ইনপুটৰ প্ৰয়োজন" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "অবৈধ সংকোচিত তথ্য" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "শুনিবলে ঠিকনা" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "উপেক্ষা কৰা হৈছে, GTestDbus à§° সৈতে compat à§° বাবে" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "ঠিকনা প্ৰিন্ট কৰক" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "শ্বেল অৱস্থাত ঠিকনা প্ৰিন্ট কৰক" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "এটা dbus সেৱা চলাওক" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "ভুল args\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্ৰত্যাশিত বৈশিষ্ট '%s' পদাৰ্থ '%s' à§° বাবে" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' বৈশিষ্ট '%s' পদাৰ্থৰ পোৱা নগল" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্ৰত্যাশিত চিহ্ন '%s', '%s' চিহ্ন আশা কৰা হৈছিল" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্ৰত্যাশিত চিহ্ন '%s', '%s' à§° ভিতৰত" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "তথ্য ডাইৰেকটৰিত কোনো বৈধ পত্ৰচিহ্নৰ ফাইল পোৱা নগল" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' à§° বাবে পত্ৰচিহ্ন ইতিমধ্যে আছে" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' à§° বাবে পত্ৰচিহ্ন পোৱা নগল" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' à§° পত্ৰচিহ্নৰ বাবে কোনো MIME à§° ধৰণ সংজ্ঞা দিয়া হোৱা নাই" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' à§° পত্ৰচিহ্নত কোনো ব্যক্তিগত চিহ্নৰ সংজ্ঞা দিয়া হোৱা নাই" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' à§° পত্ৰচিহ্নৰ বাবে কোনো দল প্ৰতিষ্ঠা কৰা হোৱা নাই" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামৰ কোনো এপ্লিকেচনে '%s' à§° বাবে কোনো পত্ৰচিহ্ন ৰেজিস্টাৰ কৰা নাই" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec শাৰী '%s', য'ত URI '%s' আছে, বিস্তৃত কৰাত ব্যৰ্থ" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "ইনপুটৰ অন্তত অসম্পূৰ্ণ আখৰৰ ক্ৰম" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "fallback '%s' ক codeset '%s' লৈ সলনি কৰিব নোৱাৰি" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"file\" আঁচনি ব্যৱহাৰ কৰা URI '%s' এটা সম্পূৰ্ণ URI নহয়" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানিক ফাইলৰ URI '%s' ত এটা '#' থাকিব নোৱাৰে" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' অৱৈধ" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' à§° হস্টনাম অৱৈধ" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ত অৱৈধভাবে মুক্তি পোৱা আখৰ আছে" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পথৰ নাম এটা সম্পূৰ্ণ পথৰ নাম নহয়" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "অৱৈধ হস্টনাম" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "পূৰ্ব্বাহ্ন" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "অপৰাহ্ন" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %b %e %H:%M:%S %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I.%M.%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "জানুৱাৰী" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ফেব্ৰুৱাৰী" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "মাৰ্চ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "এপ্ৰিল" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "জুন" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "জুলাই" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "আগষ্ট" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "চেপ্তেম্বৰ" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "অক্টোবৰ" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "নভেম্বৰ" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ডিচেম্বৰ" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "জান" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ফেব্ৰু" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "মাৰ্চ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "এপ্ৰি" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "জুন" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "জুল" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "আগ" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "চেপ" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "অক্ট" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "নভ" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ডিচ" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "সোমবাৰ" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "মঙ্গলবাৰ" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "বুধবাৰ" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "বৃহষ্পতিবাৰ" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "শুক্ৰবাৰ" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "শনিবাৰ" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "দেওবাৰ" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "সোম" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "মঙ্গল" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "বুধ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "বৃহষ্পতি" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "শুক্ৰ" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "শনি" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "দেও" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ডাইৰেকটৰি খোলোঁতে ত্ৰুটি: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ফাইল '%s' পঢ়োঁতে ত্ৰুটি: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ফাইল বৰ ডাঙৰ" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ফাইলৰ পৰা পঢ়োঁতে ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ফাইল খোলোঁতে ত্ৰুটি: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ফাইলৰ বৈশিষ্ট পাওঁতে ব্যৰ্থ: fstat() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ফাইল খোলোঁতে ত্ৰুটি: fdopen() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ফাইলক '%s' লৈ পুনঃনামকৰণ কৰোঁতে ব্যৰ্থ: g_rename() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ফাইল সৃষ্টি কৰোঁতে ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' ফাইল লিখিবৰ বাবে খোলাত ব্যৰ্থ: fdopen() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ফাইল লিখাত ব্যৰ্থ: fwrite() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ফাইল লিখাত ব্যৰ্থ: fflush() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ফাইল লিখাত ব্যৰ্থ: fsync() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ফাইল বন্ধ কৰাত ব্যৰ্থ: fclose() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বৰ্ত্তমানে থকা ফাইল '%s' আঁতৰাব পৰা নগল: g_unlink() ব্যৰ্থ: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' টেমপ্লেট অৱৈধ, এটা '%s' থাকিব নালাগে" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটত XXXXXX নাই" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "চিমসংযোগ পঢ়াত ব্যৰ্থ '%s': %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "চিমসংযোগ সমৰ্থিত নহয়" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' à§° পৰা '%s' লৈ সলনি কৰা পৰিৱৰ্তক খোলিব পৰা নগল: %s" + +#: ../glib/giochannel.c:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "read বাফাৰত অৱশিষ্ট অপৰিবৰ্তিত তথ্য আছে" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "চেনেল অসম্পূৰ্ণ আখৰত অন্ত হয়" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ত এটা raw read কৰিব নোৱাৰি" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানৰ dirs ত বৈধ কি ফাইল পোৱা নাযায়" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "সাধাৰণ ফাইল নহয়" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "কি ফাইলত '%s' পংক্তি আছে যি কি-মানৰ জোৰা, দল বা মন্তব্য নহয়" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলৰ নাম অৱৈধ: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "কি-ফাইলৰ আৰম্ভত কোনো দল উল্লিখিত নাই" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "অৱৈধ কিৰ নাম: %s:" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "কি ফাইলত অসমৰ্থিত এনক'ডিং '%s'" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "কি ফাইলত কোনো দল অনুপস্থিত '%s'" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "কি ফাইলত কোনো কি উপস্থিত নাই '%s'" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "কি ফাইলত '%s' কি আছে '%s' মান সহ যি UTF-8 বিন্যাসত নাই।" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "কি ফাইলত '%s' কি উপস্থিত আছে যাৰ মান বুজিব পৰা নাযায়।" + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"কি ফাইলয় দল '%s' ত কি '%s' অন্তৰ্ভুক্ত কৰে যাৰ এটা অনুবাদ কৰিব নোৱাৰা মান আছে।" + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "দল '%s' ত কি '%s' à§° মান '%s' আছে যত %s প্ৰত্যাশিত আছিল" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "কি ফাইলত '%s' কি '%s' দলত নাই" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "কি ফাইলত পংক্তিৰ অৱশেষত এস্কেইপ আখৰ উপস্থিত আছে" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "কি ফাইলত অৱৈধ এস্কেইপ ধাৰা উপস্থিত আছে '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যাৰূপে বুজিব পৰা নাযায়।" + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূৰ্ণসংখ্যা মান সীমা বহিৰ্ভূত" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান float সংখ্যা ৰূপে বুজিব পৰা নাযায়।" + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়েন ৰূপে বুজিব পৰা নাযায়।" + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"ফাইল '%s%s%s%s' à§° বৈশিষ্টসমূহ প্ৰাপ্ত কৰিবলে ব্যৰ্থ: fstat() ব্যৰ্থ: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s মেপ কৰিবলে ব্যৰ্থ: mmap() ব্যৰ্থ: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' ফাইল খোলোঁতে ব্যৰ্থ: open() ব্যৰ্থ: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:438 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d শাৰীৰ %d আখৰত ত্ৰুটি:" + +#: ../glib/gmarkup.c:460 ../glib/gmarkup.c:543 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামত অৱৈধ UTF-8 সাঙ্কেতিক লিপি - অৱৈধ '%s'" + +#: ../glib/gmarkup.c:471 +#, c-format +msgid "'%s' is not a valid name" +msgstr "'%s' এটা বৈধ নাম নহয়" + +#: ../glib/gmarkup.c:487 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' এটা বৈধ নাম নহয়: '%c'" + +#: ../glib/gmarkup.c:596 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d শাৰীত ত্ৰুটি: %s" + +#: ../glib/gmarkup.c:680 +#, 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:692 +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:718 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"আখৰৰ উল্লেখ থকা '%-.*s' এ এটা আজ্ঞা থকা আখৰক সাঙ্কেতিক লিপিলৈ পৰিবৰ্তিত নকৰে" + +#: ../glib/gmarkup.c:756 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ৰিক্ত পদাৰ্থ '&;' দেখা গ'ল; বৈধ পদাৰ্থসমূহ হ'ল: & " < > '" + +#: ../glib/gmarkup.c:764 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "পদাৰ্থৰ নাম '%-.*s' অজ্ঞাত" + +#: ../glib/gmarkup.c:769 +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:1117 +msgid "Document must begin with an element (e.g. )" +msgstr "দস্তাবেজ এটা উপাদানৰ সৈতে আৰম্ভ হ'ব লাগিব (যেনে )" + +#: ../glib/gmarkup.c:1157 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' এটা বৈধ আখৰ নহয় '<' আখৰৰ পিছত; ইয়াৰ দ্বাৰা পদাৰ্থৰ নাম আৰম্ভ নহবও পাৰে" + +#: ../glib/gmarkup.c:1225 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ত্ৰুটি আখৰ '%s', এটা '>' আখৰ প্ৰত্যাশিত ৰিক্ত পদাৰ্থৰ টেগ '%s' শেষ কৰিবলৈ" + +#: ../glib/gmarkup.c:1309 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' আখৰ প্ৰত্যাশিত নহয়, এটা '=' চিহ্ন প্ৰত্যাশিত বৈশিষ্টৰ নাম '%s', পদাৰ্থ '%" +"s' à§°, " +"পিছত" + +#: ../glib/gmarkup.c:1350 +#, 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:1394 +#, 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:1527 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' আখৰৰ ব্যৱহাৰ বৈধ নহয় '%s' বদ্ধ পদাৰ্থৰ নামৰ পিছত; অনুমোদিত আখৰ হ'ল '>'" + +#: ../glib/gmarkup.c:1574 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' পদাৰ্থ বদ্ধ অৱস্থাত, বৰ্তমানে কোনো পদাৰ্থ খোলা অৱস্থাত নাই" + +#: ../glib/gmarkup.c:1583 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' পদাৰ্থ বদ্ধ অৱস্থাত, বৰ্তমানে '%s' পদাৰ্থ খোলা অৱস্থাত আছে" + +#: ../glib/gmarkup.c:1751 +msgid "Document was empty or contained only whitespace" +msgstr "দস্তাবেজ ৰিক্ত বা অকল ৰিক্ত স্থান আছিলে" + +#: ../glib/gmarkup.c:1765 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"খোলা ব্ৰেকেটৰ প্ৰাৰম্ভিক চিহ্নৰ '<' ঠিক পিছত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত " +"হৈছে" + +#: ../glib/gmarkup.c:1773 ../glib/gmarkup.c:1818 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা পদাৰ্থসহ দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে - '%s' পদাৰ্থ সৰ্বশেষ খোলা " +"হৈছিল" + +#: ../glib/gmarkup.c:1781 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে, <%s/> টেগ সমাপ্তিৰ বাবে খোলা ব্ৰেকেট " +"চিহ্নৰ " +"অন্তিম অংশৰ উপস্থিতি প্ৰত্যাশিত" + +#: ../glib/gmarkup.c:1787 +msgid "Document ended unexpectedly inside an element name" +msgstr "পদাৰ্থৰ নামত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/gmarkup.c:1793 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যৰ নামত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/gmarkup.c:1798 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "পদাৰ্থৰ প্ৰাৰম্ভিক টেগত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/gmarkup.c:1804 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যৰ নামৰ পিছত উপস্থিত সমান চিহ্নৰ পিছত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত " +"হৈছে; " +"বৈশিষ্ট্যৰ মান অনুপস্থিত" + +#: ../glib/gmarkup.c:1811 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যৰ মানত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/gmarkup.c:1827 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' পদাৰ্থৰ অন্তিম টেগত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/gmarkup.c:1833 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"কোনো মন্তব্য বা প্ৰক্ৰিয়াকৰণৰ নিৰ্দেশত দস্তাবেজ অপ্ৰত্যাশিতৰূপে সমাপ্ত হৈছে" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ব্যৱহাৰ:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "সহায় বিকল্পসমূহ:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "সহায় বিকল্পসমূহ দেখুৱাওক" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "সহায় সমস্ত বিকল্প দেখুৱাওক" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "এপ্লিকেচন বিকল্পসমূহ:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' পূৰ্ণসংখ্যাৰ মান %s à§° বাবে বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' পূৰ্ণসংখ্যাৰ মান %s à§° বাবে সীমাৰ বহিৰ্ভূত" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' à§° দ্বীবৈশিষ্ট মান %s à§° বাবে বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' à§° দ্বীবৈশিষ্ট মান %s à§° বাবে সীমা বহিৰ্ভূত" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "%s বিকল্প বিশ্লেষণ কৰিবলৈ ব্যৰ্থ" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s à§° তৰ্ক সন্ধানহিন" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "অজ্ঞাত বিকল্প %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ক্ষতিগ্ৰস্ত অৱজেক্ট" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তৰীণ ত্ৰুটি বা ক্ষতিগ্ৰস্ত অৱজেক্ট" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "মেমৰি অৱশিষ্ট নাই" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "backtracking à§° সুনিৰ্দিষ্ট সীমা পূৰ্ণ" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"উল্লিখিত বিন্যাসত অন্তৰ্ভুক্ত সামগ্ৰী, আংশিক মিল অনুসন্ধানত সমৰ্থিত নহয়" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানৰ সময় বেক প্ৰসংগ সমৰ্থিত নহয়" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "পুনৰাবৃত্তিৰ সীমা পূৰ্ণ" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "নতুন পংক্তি চিহ্নকাৰী ফ্লেগৰ অৱৈধ দল" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "বেয়া অফচেট" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "সৰু utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "বাৰংবাৰতা লুপ" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "অজ্ঞাত ত্ৰুটি" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "পংক্তিৰ শেষত \\ উপস্থিত" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "পংক্তিৰ শেষত \\c উপস্থিত" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "\\ à§° পিছত অজ্ঞাত আখৰ উপস্থিত" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} quantifier ত সংখ্যা ক্ৰমত নাই" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} quantifier à§° সংখ্যা অত্যাধিক ডাঙৰ" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "আখৰৰ শ্ৰেণীৰ শেষত ] চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "আখৰৰ শ্ৰেণীত অৱৈধ escape ক্ৰম" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "আখৰৰ শ্ৰেণীৰ অঞ্চল সীমাৰ বাহিৰত" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "পুনৰাবৃত্তিৰ বাবে একো উপস্থিত নাই" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "অপ্ৰত্যাশিত পুনৰাবৃত্তি" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? অথবা (?- à§° পিছত অপৰিচিত আখৰ" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX নামৰ শ্ৰেণীসমূহ অকল শ্ৰেণীত সমৰ্থিত হ'ব" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "শেষৰ ) অনুপস্থিত" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত উপবিন্যাস নিৰ্দেশ কৰা হৈছে" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "বক্তব্যৰ পিছত ) চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "সাধাৰণ অভিব্যক্তি অত্যাধিক ডাঙৰ" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "মেমৰি প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "( চিহ্ন নোহোৱাকে ) চিহ্ন প্ৰয়োগ কৰা হৈছে" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "ক'ড অভাৰফ্লো" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নৰ পিছত অজ্ঞাত আখৰ উপস্থিত" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion সীমিত দৈৰ্ঘ্যৰ নহয়" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( à§° পিছত ত্ৰুটিপূৰ্ণ সংখ্যা বা নাম উপস্থিত আছে" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "চৰ্তসাপেক্ষ দলত দুটাতকৈ অধিক শাখা আছে" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "(?( à§° পিছত assertion প্ৰত্যাশিত" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R বা (?[+-]সংখ্যা à§° পিছত ) চিহ্ন ব্যৱহাৰ কৰা আৱশ্যক" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "অজ্ঞাত POSIX শ্ৰেণীৰ নাম" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX কলেটিং পদাৰ্থ সমৰ্থিত নহয়" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} শাৰীত আখৰৰ মান বৰ ডাঙৰ" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "অৱৈধ চৰ্ত (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind assertion ত \\C à§° অনুমতি নাই" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escape \\L, \\l, \\N{name}, \\U, আৰু \\u সমৰ্থিত নহয়" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "ৰিকাৰ্ছিভ কল অনিশ্চিত কাললৈ লুপ কৰিব পাৰে" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নৰ পিছত অজ্ঞাত আখৰ উপস্থিত" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "উপবিন্যাস নামত হেৰুৱা টাৰ্মিনেটৰ" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "দুটা নাম দিয়া উপবিন্যাসসমূহ à§° একে নাম" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "ত্ৰুটিপূৰ্ণ \\P বা \\p ক্ৰম" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P বা \\p à§° পিছত অজ্ঞাত বৈশিষ্টৰ নাম" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "উপবিন্যাস নাম বৰ দীঘল (সৰ্বাধিক ৩২ টা আখৰ)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "বহুত নাম দিয়া উপবিন্যাসসমূহ (সৰ্বাধিক ১০,০০০)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377 à§° অধিক" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "অভাৰৰেন কমপাইলিং কৰ্মস্থান" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "আগতে পৰীক্ষা কৰা সন্দৰ্ভ থকা উপবিন্যাস পোৱা নগল" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলত একাধিক ব্ৰাঞ্চ উপস্থিত আছে" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্পসমূহ" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g এটা ব্ৰেইচ, এঙ্ল-ব্ৰেকেট, অথবা কৌট নাম অথবা নম্বৰ, অথবা এটা সাধাৰণ নম্বৰ " +"দ্বাৰা অনুকৰিত নহয়" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "এটা সাংখ্যিক প্ৰসংগ শূন্য হব নোৱাৰিব" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "(*ACCEPT), (*FAIL), অথবা (*COMMIT) à§° বাবে এটা তৰ্কৰ অনুমতি নাই" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) পৰিচিত নহয়" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "নম্বৰ অত্যাধিক ডাঙৰ" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& পিছৰ উপবিন্যাস নাম সন্ধানহিন" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ à§° পিছত ডিজিট প্ৰত্যাশিত" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "JavaScript সংগতি অৱস্থাত ] এটা অবৈধ তথ্য আখৰ" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "একে নম্বৰৰ উপবিন্যাসৰ বাবে ভিন্ন নাম অনুমোদিত নহয়" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) à§° এটা তৰ্ক থাকিব লাগিব" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c এটা ASCII আখৰ দ্বাৰা অনুকৰিত হব লাগিব" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k এটা ব্ৰেইচ, এঙ্ল-ব্ৰেকেট, অথবা কৌট নাম দ্বাৰা অনুকৰিত নহয়" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N এটা শ্ৰেণীত সমৰ্থিত নহয়" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "অত্যাধিক আগবঢ়োৱা প্ৰসংগসমূহ" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), অথবা (*THEN) ত নাম অত্যাধিক ডাঙৰ" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... ক্ৰমত আখৰ মান অতি ডাঙৰ" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "সাধাৰণ অভিব্যক্তি %s à§° মিল অনুসন্ধানত সমস্যা: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্ৰেৰি UTF8 সমৰ্থন নোহোৱাকে কমপাইল কৰা হৈছে" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্ৰেৰি UTF8 বৈশিষ্ট্যৰ সমৰ্থন নোহোৱাকে কমপাইল কৰা হৈছে" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE লাইব্ৰেৰী অসংগত বিকল্পসমূহ দ্বাৰা কমপাইল কৰা আছে" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "সাধাৰণ অভিব্যক্তি %s, %d আখৰত কমপাইল কৰিবলৈ সমস্যা: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "সাধাৰণ অভিব্যক্তি %s à§° সৰ্বোত্তম ব্যৱহাৰত সমস্যা: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal সংখ্যা বা '}' প্ৰত্যাশিত" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "hexadecimal সংখ্যা প্ৰত্যাশিত" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "সাঙ্কেতিক প্ৰসংগত '<' অনুপস্থিত" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "সাঙ্কেতিক প্ৰসংগ অসম্পূৰ্ণ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "সাঙ্কেতিক প্ৰসংগত আখৰ সংখ্যা শূণ্য" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "সংখ্যা প্ৰত্যাশিত" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "অৱৈধ সাঙ্কেতিক প্ৰসংগ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "অন্তত অপ্ৰত্যাশিত '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "অজ্ঞাত এস্কেইপ ক্ৰম" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্ৰতিস্থাপন লিখনী \"%s\" আখৰ %lu ত বিশ্লেষণ কৰিবলৈ সমস্যা: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতিৰ অংশ উদ্ধৃতি চিহ্ন দ্বাৰা আৰম্ভ কৰা নহয়" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "কমান্ড শাৰী বা শ্বেল à§° উদ্ধৃতিত অসংগত উদ্ধৃতি চিহ্ন" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' আখৰৰ পিছত লিখনী সমাপ্ত হৈছে। (লিখনী আছিল '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c à§° ক্ষেত্ৰত সুসংগত উদ্ধৃতি চিহ্ন পোৱা নাযায়। (লিখনী আছিল '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "লিখনী ৰিক্ত (বা অকল শূণ্যস্থানসহ)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়াৰ সময়ত select() অপ্ৰত্যাশিত ত্ৰুটি (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "চাইল্ড প্ৰক্ৰিয়া ক'ড %ld à§° সৈতে প্ৰস্থান কৰিলে" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "চাইল্ড প্ৰক্ৰিয়া সংকেত %ld দ্বাৰা kill কৰা হৈছে" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "চাইল্ড প্ৰক্ৰিয়া সংকেত %ld দ্বাৰা বন্ধ কৰা হৈছে" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "চাইল্ড প্ৰক্ৰিয়া অস্বাভাৱিকভাৱে প্ৰস্থান কৰিলে" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপৰ পৰা পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork কৰিবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ডাইৰেকটৰিলৈ পৰিবৰ্তন কৰিবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়া \"%s\" চলাওঁতে ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ আউটপুট বা ইনপুট পুনৰনিৰ্দেশ কৰিবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়া fork কৰিবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্ৰক্ৰিয়া \"%s\" প্ৰণয়ন কৰিবলৈ অজ্ঞাত ত্ৰুটি" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপৰ পৰা পৰ্যাপ্ত তথ্য পঢ়িবলৈ ব্যৰ্থ (%s)" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ সৈতে যোগাযোগৰ উদ্দেশ্যে পাইপ সৃষ্টিত ব্যৰ্থ (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়িবলৈ ব্যৰ্থ" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ত তৰ্ক সদিশত উল্লিখিত পংক্তি বৈধ নহয়: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পৰিবেশত উল্লিখিত পংক্তি বৈধ নহয়: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্ৰিয় ডাইৰেকটৰি বৈধ নহয়: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্ৰগ্ৰাম চলাওঁতে ব্যৰ্থ (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্ৰক্ৰিয়াৰ পৰা তথ্য পঢ়াৰ সময়ত g_io_channel_win32_poll() ত অপ্ৰত্যাশিত " +"ত্ৰুটি" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "আখৰ UTF-8 à§° আয়ত্বৰ বাহিৰত" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "ৰূপান্তৰ কৰাৰ উদ্দেশ্যে প্ৰদত্ত তথ্যত অৱৈধ ধাৰা" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "আখৰ UTF-16 à§° আয়ত্বৰ বাহিৰত" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u বাইট" +msgstr[1] "%u বাইটসমূহ" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s বাইট" +msgstr[1] "%s বাইটসমূহ" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "'%s' à§° বাবে অসম্পূৰ্ণ তথ্য প্ৰাপ্ত হৈছে" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "SO_PASSCRED চকেটৰ বাবে সামৰ্থবান আছে নে নিৰীক্ষণ কৰোতে অপ্ৰত্যাশিত বিকল্প " +#~ "দৈৰ্ঘ্য। আশা কৰা হৈছিল %d বাইটসমূহ, পোৱা গল %d" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "waitpid() ত অপ্ৰত্যাশিত ত্ৰুটি (%s)" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "কমান্ড শাৰী '%s' সৃজন কৰোতে অস্বাভাৱিক প্ৰগ্ৰাম অন্ত: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "কমান্ড শাৰী '%s' অ-শূণ্য প্ৰস্থান অৱস্থা %d সৈতে প্ৰস্থান কৰিছে: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ৰিক্ত উপস্ট্ৰিং à§° কৰ্মক্ষেত্ৰৰ সীমা পূৰ্ণ" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "ফলা সলনি কৰা escapes (\\l, \\L, \\u, \\U) à§° ইয়াত অনুমতি নাই" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "কোনো DEFINE দলৰ পুনৰাবৃত্তি কৰা নাযাব" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' à§° কাৰণে সেৱাৰ ৰেকৰ্ড নাই" + +#~ msgid "File is empty" +#~ msgstr "ফাইল ৰিক্ত" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "কি ফাইলত '%s' কি উপস্থিত আছে যাৰ মান বুজিব পৰা নাযায়।" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "ফাইল '%s' stat কৰিবলৈ ব্যৰ্থ: %s" + +#~ msgid "Error connecting: " +#~ msgstr "সংযোগ কৰিবলৈ ত্ৰুটি:" + +#~ msgid "Error connecting: %s" +#~ msgstr "সংযোগ কৰিবলৈ সমস্যা: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix à§° পৰা পঢ়িবলৈ সমস্যা: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix বন্ধ কৰিবলৈ সমস্যা: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unix লৈ লিখিবলৈ সমস্যা: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ডাইৰেকটৰিৰ ওপৰত ডাইৰেকটৰি স্থানান্তৰ কৰা নাযাব" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s ধৰণক class কৰা হোৱা নাই" + +#, 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 "" +#~ "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 "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.po b/po/ast.po new file mode 100644 index 0000000..1470b7e --- /dev/null +++ b/po/ast.po @@ -0,0 +1,3821 @@ +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-01-04 19:27+0100\n" +"Last-Translator: astur \n" +"Language-Team: Asturian \n" +"Language: ast\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributu inesperáu «%s» pal elementu «%s»" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "L'atributu «%s» del elementu «%s» nun s'atopó" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta «%s» inesperada, esperabase la etiqueta «%s»" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta «%s» inesperada dientro de «%s»" + +#: ../glib/gbookmarkfile.c:1834 +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:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Yá esiste un marcador pal URI «%s»" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nun s'atopó un marcador pal URI «%s»" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nun pudo abrir el conversor de «%s» a «%s»" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Hai una secuencia de bytes nun válida na entrada de conversión" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Ocurrió un fallu durante la conversión: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Hai una secuencia parcial de carauteres nel final de la entrada" + +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "La URI «%s» ye non válida" + +#: ../glib/gconvert.c:1925 +#, 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:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "La URI «%s» caltién carauteres d'escape inválidos" + +#: ../glib/gconvert.c:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "El nome del anfitrión ye non válidu" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "xineru" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "febreru" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "marzu" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "abril" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "mayu" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "xunu" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "xunetu" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "xin" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "abr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "may" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "xun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "xnt" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "llunes" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "martes" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "miércoles" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "xueves" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "vienres" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sábadu" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "domingu" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "llu" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "mar" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mié" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "xue" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "vie" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sáb" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dom" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Ocurrió un fallu al abrir el direutoriu «%s»: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El ficheru «%s» ye enforma grande" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ocurrido un fallu na llectura dende'l ficheru «%s»: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ocurrido un fallu al abrir el ficheru «%s»: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ocurrió un fallu al criar el ficheru «%s»: %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falló al escribir el ficheru «%s»: falló fflush(): %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falló al escribir el ficheru «%s»: falló fsync(): %s" + +#: ../glib/gfileutils.c:1030 +#, 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:1152 +#, 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:1412 +#, 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:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» nun caltién XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, 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:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fallu na llinia %d, caráuter %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» nun ye un nome válidu " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» nun ye un nome válidu: «%c» " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fallu na llinia %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"La entidá '&;' ta vacía; les entidaes válides son: & " < > " +"'" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "El nome de la entidá «%-.*s» desconozse" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "El documentu tien d'entamar con un elementu (por exemplu: )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "El documentu taba ermu o namái caltenía espacios en blancu" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "El documentu fina inesperadamente xusto dempués d'un '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "El documentu fina inesperadamente dientro d'un nome d'elementu" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El documentu fina inesperadamente dientro d'un nome d'atributu" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El documentu fina inesperadamente dientro del valor d'un atributu" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "oxetu corruptu" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "fallu internu o oxetu corruptu" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "ensin memoria" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "algamóse'l llímite de «backtracking»" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +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:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "fallu internu" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "algamóse'l llímite de recursividá" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "llímite del espaciu de trabayu cuando s'alcancen subcadenes vacíes" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "combinación de banderes de nueva llinia inválides" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "fallu desconocíu" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ al final del patrón" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c al final del patrón" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "caráuter non reconocíu dempués de \\" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "númberos fuera de rangu nel cuantificador {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "númberu enforma grande nel cuantificador {}" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "falta la terminación ] pa la clas de caráuter" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "secuencia d'escape non válida na clas de caráuter" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "rangu fuera d'orde na clas de caráuter" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "na que repetir" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "caráuter non reconocíu dempués de (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "caráuter non reconocíu dempués de (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "caráuter non reconocíu dempués de (?P" + +#: ../glib/gregex.c:306 +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:309 +msgid "missing terminating )" +msgstr "falta'l ) de terminación" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o los díxitos (?[+-] deben tar seguíos por )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón non esistente" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "falta ) dempués del comentariu" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "la espresión regular ye enforma llarga" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "falló al obtener memoria" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "la comprobación «lookbehind» nun tien una llonxitú fixa" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "númberu o nome mal formáu dempués de (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "el grupu condicional caltién más de dos rames" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "esperabase una comprobación dempués de (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "nome de clas POSIX desconocíu" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "los elementos POSIX recopilaos nun tán sofitaos" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "el valor del caráuter na secuencia \\x{…} ye enforma llargu" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "condición nun válida (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "nun se permite \\C en comprobaciones «lookbehind»" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "una llamada recursiva podrá criar un bucle infinitu" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "falta'l terminador nel nome del subpatrón" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "dos subpatrones tien el mesmu nome" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P o \\p mal formada" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propiedá desconocíu dempués de \\P o \\p" + +#: ../glib/gregex.c:377 +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:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatrones con nome (máximu 10.000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "el valor octal ye mayor que \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "el grupu DEFINE caltién más d'una rama" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "nun se permite repetir un grupu DEFINE" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "opciones NEWLINE inconsistentes" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "desbordamientu de códigu" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "desbordóse l'espaciu de trabayu de compilación" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "nun s'atopó'l subpatrón referenciáu anteriormente comprobáu" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fallu al coincidir cola espresión regular %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE ta compilada ensin sofitu pa UTF8" + +#: ../glib/gregex.c:1215 +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:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fallu al optimizar la espresión regular %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "esperábase un díxitu hexadecimal o «}»" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "esperábase un díxitu hexadecimal" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "falta «<» na referencia simbólica" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "referencia de símbolu ensin finar" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de llonxitú cero" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "esperábase un díxitu" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "referencia simbólica illegal" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "final '\\' perdiu" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "secuencia d'escape desconocía" + +#: ../glib/gregex.c:2360 +#, 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:91 +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:181 +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:559 +#, 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:566 +#, 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:578 +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:282 +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:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, 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:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ocurrió un fallu al camudar al direutoriu «%s» (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ocurrió un fallu al executar el procesu fíu (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de programa non válidu: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena non válida nel entornu: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directoriu de trabayu non válidu: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Ocurrió un fallu al executar el programa auxiliar (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ocurrió un fallu inesperáu en waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falló al bifurcar (fork) (%s)" + +#: ../glib/gspawn.c:1393 +#, 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:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ocurrió un fallu al llanzar el procesu fíu (%s)" + +#: ../glib/gspawn.c:1420 +#, 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:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "El caráuter atopáse fuera del rangu pa UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "La secuencia na conversión d'entrada nun ye válida" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "El caráuter atopáse fuera del rangu pa UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Usu:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPCIÓN...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Opciones d'aida:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Amosar opciones d'aida" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Amosar toles opciones d'aida" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opciones de l'aplicación:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nun puede analizase'l valor enteru «%s» pa %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nun puede analizase'l valor duble «%s» pa %s" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Fallu al analizar la opción: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta un argumentu pa %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Opción desconocía %s" + +#: ../glib/gkeyfile.c:366 +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:401 +msgid "Not a regular file" +msgstr "Nun ye un ficheru regular" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "El ficheru ta ermu" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupu non válidu: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "El ficheru de claves non entama con un grupu" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de claves non válida: %s" + +#: ../glib/gkeyfile.c:903 +#, 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:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El ficheru de claves nun tien el grupu «%s»" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El ficheru de claves nun tien la contraseña «%s»" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, 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:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enteru «%s» ta fuera de rangu" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» nun puede interpretase como un booleanu." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, 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:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "El fluxu ya se zarró" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Encaboxóse la operación" + +#: ../gio/gcharsetconverter.c:263 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "Socket incorreutu, non anicializáu" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Hai una secuencia de bytes nun válida na entrada de conversión" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +#, fuzzy +msgid "Not enough space in destination" +msgstr "Nun hai abondu espaciu pa la direición del socket" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "triba %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de fluxu inesperadamente prematuru" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Direición de socket non sofitada" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Fallu coneutando: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Fallu al escribir nel ficheru: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Triba desconocía" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Ocurrió un fallu al abrir el direutoriu «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fallu al criar el direutoriu: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Ocurrió un fallu al lleer el ficheru «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fallu al zarrar el ficheru: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "El socket amestáu ta peslláu" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "La triba %s nun tien clas" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "La triba %s nun tien clas" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "L'escuchador yá ta peslláu" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Fallu al escribir nel ficheru: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Nun ta sofitao mover a la papelera" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fallu al escribir nel ficheru: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Fallu na llinia %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fallu al analizar la opción: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "Conexón en cursu" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "Conexón en cursu" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Fallu coneutando: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "«%s» nun ye un nome válidu " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fallu al analizar la opción: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fallu aceutando conexón: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Ocurrió un fallu al abrir el direutoriu «%s»: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "oxetu corruptu" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Ensin nome" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "El ficheru d'escritoriu nun especificó'l campu Exec" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Imposible atopar el terminal requeríu pola aplicación" + +#: ../gio/gdesktopappinfo.c:1515 +#, 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:1519 +#, 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:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nun puede criase'l ficheru d'escritoriu %s d'usuariu" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada pa %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "la unidá nun implementa reproducir" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "la unidá nun implementa detener" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:368 +#, 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:378 +#, 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:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperabase un GEmblem pa GEmblemedIconjo" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "El puntu de montaxe conteníu nun esiste" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Nun puede copiase sobro'l direutoriu" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Nun puede copiase direutoriu sobro direutoriu" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "El ficheru destín ya esiste" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Nun puede copiase'l direutoriu recursivamente" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Enllaces simbólicos non sofitaos" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fallu al abrir el ficheru: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Nun puede copiase'l ficheru especial" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "El valor del enllaz simbólicu dáu nun ye válidu" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Nun ta sofitao mover a la papelera" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Los nomes de ficheru nun pueden caltener «%c»" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "el volume nun implementa'l montáu" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Nun hai denguna aplicación rexistrada pa manexar esti ficheru" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "L'enumerador ta zarráu" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador del ficheru tien una operación excepcional" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "L'enumerador del ficheru ya ta zarráu" + +#: ../gio/gfileicon.c:236 +#, 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:246 +msgid "Malformed input data for GFileIcon" +msgstr "Datos d'entrada mal formaos pa GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "El fluxu non sofita query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Nun se permite guetar nel fluxu" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Nun se permite truncar nel fluxu d'entrada" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Nun se sofita'l truncamiento nel fluxu" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Númberu de tokens (%d) incorreutu" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Non esiste la triba pa la clas de nome %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "La triba %s non implementa la interface GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "La triba %s nun tien clas" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Númberu de versión mal formáu: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +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:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "El fluxu tien una operación excepcional" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nun hai abondu espaciu pa la direición del socket" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Direición de socket non sofitada" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Nun ta sofitao mover a la papelera" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Triba d'atributu non válidu (esperabase una cadena)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +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:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de ficheru nun válidu %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fallu al obtener la información del sistema de ficheros: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Nun puede renomase'l direutoriu raíz" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fallu al renomar el ficheru: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Nun puede renomase'l ficheru, el nome ya esiste" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Nome de ficheru non válidu" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Fallu al abrir el ficheru: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Nun puede abrise'l direutoriu" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Fallu al desaniciar el ficheru: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fallu al mover a la papelera'l ficheru: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nun pudo criase'l direutoriu papelera %s: %s" + +#: ../gio/glocalfile.c:1852 +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:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Nun pudo atopase o criar el direutoriu de la papelera" + +#: ../gio/glocalfile.c:1985 +#, 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:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nun pudo unviase a la papelera'l ficheru: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fallu al criar el direutoriu: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de ficheros nun sofita enllaces simbólicos" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fallu al criar l'enllaz simbólicu: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Fallu al mover el ficheru: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Nun puede movese un direutoriu sobro un direutoriu" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Falló la criación del ficheru de respaldu" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fallu al desaniciar el ficheru destín: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Nun se sofita mover ficheros ente puntos de montaxe" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "El valor del atributu de ser non nulu" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Triba d'atributu non válidu (esperabase una cadena)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Nome extendíu del atributu non válidu" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fallu al afitar l'atributu estendíu «%s»: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Fallu al amosar información del estáu del ficheru «%s»: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (codificación non válida)" + +#: ../gio/glocalfileinfo.c:1768 +#, 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:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Triba d'atributu non válida (esperabase uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Triba d'atributu nun válida (esperabase uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Triba d'atributu non válida (esperabase una cadena byte)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Nun pueden afitase permisos n'enllaces simbólicos" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fallu al afitar permisos: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fallu al afitar el propietariu: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "l'enllaz simbólicu tien de ser non nulu" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fallu al afitar l'enllaz simbólicu: %s" + +#: ../gio/glocalfileinfo.c:2013 +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:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fallu al afitar o modificar el tiempu d'accesu: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "El contestu SELinux tien de ser non nulu" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fallu al afitar el contestu SELinux: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nun ta activáu n'esti sistema" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Afitar l'atributu %s nun tá sofitáu" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fallu al lleer del ficheru: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fallu al guetar nel ficheru: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Fallu al zarrar el ficheru: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fallu al escribir nel ficheru: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fallu al desaniciar l'enllaz de respaldu antiguu: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fallu al criar una copia de respaldu: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fallu al renomar el ficheru temporal: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fallu al truncar el ficheru: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fallu al abrir el ficheru «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "El ficheru destín ye un direutoriu" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "El ficheru destín nun ye un ficheru regular" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "El ficheru camudóse esternamente" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fallu al desaniciar el ficheru antiguu: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Proporcionóse un GSeekType non válidu" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Petición de gueta non válida" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nun puede truncase GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "El fluxu de salida de la memoria nun ye redimensionable" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Falló al redimensionar el fluxu de salida de la memoria" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +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:322 +#, 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:411 +msgid "Output stream doesn't implement write" +msgstr "El fluxu de salida non implementa la escritura" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "El fluxu d'orixe ya ta zarráu" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fallu na resolución de «%s»: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fallu na resolución inversa de «%s»: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "Nun hai dengún rexistru de serviciu pa «%s»" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Nun ye dable resolver temporalmente «%s»" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fallu na resolución de «%s»" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Opción desconocía %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Socket incorreutu, non anicializáu" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket incorreutu, falló n'anicialización darréu de: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "El socket áa ta peslláu" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando Gsocket de df: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nun pudo crease'l socket: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "Especificóse un protocolu desconocíu" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "nun pudo obtenese la direición llocal: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "nun pudo obtenese la direición remota: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "nun s'escuchó: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fallu al vinculase a la direición: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fallu aceutando conexón: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Fallu coneutando: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "Conexón en cursu" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Fallu coneutando: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Incapaz d'obtener el fallu pendiente: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fallu al recibir datos: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Fallu al unviar datos: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nun pudo crease'l socket: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fallu al pesllar el socket: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Esperando la condición del socket: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Fallu al unviar mensax: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage non sofitáu sobro ventanes" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fallu al recibir mensax: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Fallu desconocíu al coneutar" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "La triba %s nun tien clas" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "L'escuchador yá ta peslláu" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "El socket amestáu ta peslláu" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, 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/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperábase 1 mensax de control, obtúvose %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Triba inesperada de datos auxiliares" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Esperábase un fd, pero obtúvose %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "fd inválidu recibíu" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Fallu al unviar datos: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fallu al renomar el ficheru: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "Esperábase 1 mensax de control, obtúvose %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Fallu al lleer d'unix: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Fallu al zarrar unix: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Sistema de ficheros raíz" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Fallu al escribir n'unix: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +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:276 +msgid "Can't find application" +msgstr "Nun puede atopase l'aplicación" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Fallu al analizar l'aplicación: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "Nun se sofita URI" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "los cambeos d'asociación nun tán sofitaos en win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "La criación d'asociación nun tá sofitada en win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Fallu al lleer del ficheru: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Fallu al zarrar el ficheru: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Fallu al escribir nel ficheru: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "ensin memoria" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "fallu internu" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "El nome del anfitrión ye non válidu" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Nun puede movese un direutoriu sobro un direutoriu" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "La triba %s nun tien clas" + +#, 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.po b/po/az.po new file mode 100644 index 0000000..dc92173 --- /dev/null +++ b/po/az.po @@ -0,0 +1,3820 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2004-02-02 12:12+0200\n" +"Last-Translator: Mətin Əmirov \n" +"Language-Team: Azerbaijani Turkish \n" +"Language: \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:780 +#, 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:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, 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:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Girişin sonunda parçalı hərf qatarı" + +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "`%s' URI-si səhvdir" + +#: ../glib/gconvert.c:1925 +#, 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:1941 +#, 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:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "Hökmsüz qovşaq adı" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %d %B %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "yanvar" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "fevral" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "mart" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "aprel" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "may" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "iyun" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "iyul" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Yan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Fev" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "İyn" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "İyl" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "bazar ertəsi" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "çərşənbə axşamı" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "çərşənbə" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "cümə axşamı" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "cümə" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "şənbə" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "bazar günü" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ber" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "çax" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "çər" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "cax" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "cüm" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "şnb" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "baz" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Fayldan oxuma iflası '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Fayl açma iflası '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Şablon '%s' XXXXXX ilə qurtarmır" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Fayl açma iflası '%s': fdopen() iflası: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d. sətir %d. xarakterində xəta: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d sətirində xəta : %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Boş element '&;' tapldı; hökmlü elementlər: & " < &qt; '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Element adı '%s' bilinmir" + +#: ../glib/gmarkup.c:727 +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:1078 +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:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +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:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +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:1754 +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:1759 +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:1765 +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:1772 +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:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal qismi xarakterlə bitir" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Bitirilməmiş xarakter mə'lumatı" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Bitirilməmiş varlıq mə'lumatı" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +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:181 +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:559 +#, 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:566 +#, 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:578 +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:282 +msgid "Failed to read data from child process" +msgstr "Törəmə gedişatdan mə'lumat oxuma iflası" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Törəmə pipe-dan oxuma iflası (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Qovluq dəyişdirmə iflası '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Törəmə gedişat icra iflası (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, 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:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Yardımcı proqram icra edilə bilmədi" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'də namə'lum xəta (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork iflası (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\" törəmə gedişat icra iflası (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Törəmə gedişat fork xətası (%s)" + +#: ../glib/gspawn.c:1420 +#, 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:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 üçün hərf sərhədinin xaricində" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "dönüşdürmə girişi içində hökmsüz qatar" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 üçün hərf sərhədinin xaricindədir" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Hökmsüz qovşaq adı" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, 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:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "dönüşdürmə girişində hökmsüz bayt qatarı" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%d sətirində xəta : %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Xarakter '%s' bir element adının içində hökmlü deyildir" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Xarakter '%s' bir element adının içində hökmlü deyildir" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Xarakter '%s' bir element adının içində hökmlü deyildir" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Hökmsüz qovşaq adı" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Hökmsüz qovşaq adı" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' simvolik körpüsü oxuna bilmədi: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, 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:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Cərgə açma xətası: '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d sətirində xəta : %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, 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:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Hökmsüz qovşaq adı" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, 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:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Fayl yaratma iflası '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d sətirində xəta : %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Dönüşdürmə sırasında xəta yarandı: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Simvolik körpülər dəstəklənmir" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Fayl oxuma xətası: '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/be.po new file mode 100644 index 0000000..4cb09b8 --- /dev/null +++ b/po/be.po @@ -0,0 +1,4386 @@ +# Ihar Hrachyshka , 2011-2012. +# Kasia Bondarava , 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 07:45+0000\n" +"PO-Revision-Date: 2012-09-14 13:26+0300\n" +"Last-Translator: Kasia Bondarava \n" +"Language-Team: Belarusian \n" +"Language: be\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: Virtaal 0.7.0\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Надта вялікае значэнне перададзена ў %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Базавы струмень не падтрымлівае пракрутку" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Немагчыма абрэзаць GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Струмень ужо закрыты" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Базавы струмень не падтрымлівае абразання" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Дзеянне скасавана" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Хібны, неініцыяваны аб'ект" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Абрэзаная многабайтавая паслядоўнасць на ўваходзе" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "У месцы прызначэння не стае вольнай прасторы" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Хібная паслядоўнасць байтаў ва ўводзе на пераўтварэнне" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Падчас пераўтварэння ўзнікла памылка: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Ініцыяцыя з магчымасцю скасавання не падтрымліваецца" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Пераўтварэнне даных са знаказбору \"%s\" у \"%s\" не падтрымліваецца" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не ўдалося адкрыць пераўтваральнік з \"%s\" у \"%s\"" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "Тып %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Невядомы тып" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "Тып файлаў %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "Механізм GCredentials адсутнічае для гэтай аперацыйнай сістэмы" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Ваша праграмная платформа не падтрымлівае механізму GCredentials" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Нечаканы заўчасны канец струменя" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Невядомы ключ \"%s\" у адрасе \"%s\"" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Адрас \"%s\" мае хібу (трэба вызначыць толькі адзін з ключоў: сцежку, часовы " +"каталог або абстрактны сокет)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Бессэнсоўная пара ключ-значэнне ў адрасе \"%s\"" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Памылка ў адрасе \"%s\": хібны атрыбут порта" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Памылка ў адрасе \"%s\": хібны атрыбут пратакола" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Элемент адрасу \"%s\" не змяшчае двукроп'я (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Пара ключ-значэнне %d, \"%s\" (у элеменце адрасу \"%s\") не змяшчае знака " +"роўнасці" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Памылка скасавання экранавання для ключа або яго значэння ў пары %d, \"%s\", " +"для элемента адрасу \"%s\"" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Памылка ў адрасе \"%s\": unix-транспарт вымагае дакладна толькі аднаго з " +"ключоў \"path\" (сцежка) або \"abstract\" (абстрактны адрас)" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Памылка ў адрасе \"%s\": атрыбут азначэння машыны адсутнічае або хібны" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Памылка ў адрасе \"%s\": атрыбут азначэння порта адсутнічае або хібны" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Памылка ў адрасе \"%s\": атрыбут азначэння файла таямніцы (\"noncefile\") " +"адсутнічае або хібны" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Памылка аўтазапуску: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"Невядомы транспарт або транспарт, які не абслугоўваецца, (\"%s\") для адрасу " +"\"%s\"" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Памылка адкрыцця файла таямніцы (\"nonce\") \"%s\": %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Памылка чытання з файла таямніцы (\"nonce\") \"%s\": %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Памылка чытання з файла таямніцы (\"nonce\") \"%s\": чакалі 16 байтаў, а " +"атрымалі %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Памылка перасылкі змесціва файла таямніцы (\"nonce\") \"%s\" у струмень:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Гэты адрас пусты" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Немагчыма стварыць шыну апавяшчэння у рэжыме setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Немагчыма стварыць шыну апавяшчэння без ідэнтыфікатара машыны: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Памылка запуску праграмы \"%s\": " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Увядзіце любы знак, каб закрыць гэта акно)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"DBUS-магістраль сеанса не запушчана, але таксама не ўдалося аўтаматычна " +"запусціць новую" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Немагчыма вызначыць адрас сеансавай магістралі (такая здольнасць не " +"рэалізаваная для вашай аперацыйнай сістэмы)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Не ўдалося вызначыць адрас магістралі апавяшчэнняў са зменнай асяроддзя " +"DBUS_STARTER_BUS_TYPE. Зменная мае невядомае значэнне \"%s\"" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Не ўдалося вызначыць адрас магістралі апавяшчэнняў, бо зменная асяроддзя " +"DBUS_STARTER_BUS_TYPE не настаўлена" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Невядомы тып магістралі %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Нечакана не хапіла змесціва для прачытання радка" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Нечакана не хапіла змесціва для бяспечнага прачытання радка" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Усе наяўныя механізмы праверкі тоеснасці вычарпаны (былі спробы: %s) " +"(наяўна: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Скасавана праз GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Памылка пры зборы звестак аб каталогу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Дазволы на каталог \"%s\" хібныя. Чакалі рэжым дазволаў 0700, а маем 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Памылка стварэння каталога \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Памылка адкрыцця вязкі ключоў \"%s\" для чытання: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Радок %1$d (змест радка: \"%3$s\") з вязкі ключоў на \"%2$s\" хібны" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Першы складнік радка %1$d (змест радка: \"%3$s\") з вязкі ключоў \"%2$s\" " +"хібны" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Другі складнік радка %1$d (змест радка: \"%3$s\") з вязкі ключоў \"%2$s\" " +"хібны" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Квіток з ідэнтыфікатарам %d не знойдзены ў вязцы ключоў \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Памылка выдалення састарэлага блок-файла \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Памылка стварэння блок-файла \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Памылка закрыцця (выдаленага) блок-файла \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Памылка выдалення блок-файла \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Памылка адкрыцця вязкі ключоў \"%s\" для запісу: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" +"(Да таго ж, вызваленне блок-файла для \"%s\" таксама пацярпела няўдачу: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Злучэнне закрыта" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Тэрмін чакання скончыўся" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Падчас стварэння злучэння з боку кліента напатканыя невядомыя сцяжкі" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Аб'ект са сцежкі \"%s\" не мае інтэрфейсу \"org.freedesktop.DBus.Properties\"" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Памылка настаўлення ўласцівасці \"%s\": чакалі тып \"%s\", а маем \"%s\"" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Няма такой уласцівасці (\"%s\")" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Няма дазволу на прачытанне ўласцівасці \"%s\"" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Няма дазволу на запіс уласцівасці \"%s\"" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Няма такога інтэрфейсу (\"%s\")" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Няма такога інтэрфейсу" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Аб'ект са сцежкі \"%2$s\" не мае такога інтэрфейсу (\"%1$s\")" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Няма такога метаду (\"%s\")" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Тып паведамлення \"%s\" не адпавядае чаканаму тыпу \"%s\"" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Аб'ект ужо экспартаваны для інтэрфейсу \"%s\" на \"%s\"" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Метад \"%s\" вярнуў значэнне тыпу \"%s\", хоць чакалі \"%s\"" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Метад \"%s\" на інтэрфейсе \"%s\" з подпісам \"%s\" не існуе" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Паддрэва для \"%s\" ужо экспартавана" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "тып хібны (INVALID)" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Паведамленне METHOD_CALL: не стае загалоўнай графы PATH або MEMBER" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Паведамленне METHOD_RETURN: не стае загалоўнай графы REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Паведамленне ERROR: не стае загалоўнай графы REPLY_SERIAL або ERROR_NAME" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Паведамленне SIGNAL: не стае загалоўнай графы PATH, INTERFACE або MEMBER" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Паведамленне SIGNAL: загалоўная графа PATH выкарыстоўвае зарэзерваванае " +"значэнне /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Паведамленне SIGNAL: загалоўная графа INTERFACE выкарыстоўвае зарэзерваванае " +"значэнне org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Хацелі прачытаць %lu байт, а атрымалі EOF" +msgstr[1] "Хацелі прачытаць %lu байты, а атрымалі EOF" +msgstr[2] "Хацелі прачытаць %lu байтаў, а атрымалі EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Чакалі правільны UTF-8 ланцужок, але напаткалі хібныя байты на зруху %d " +"(даўжыня ланцужка: %d). Да гэтага моманту прачытаны наступны бясхібны UTF-8 " +"ланцужок: \"%s\"" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Замест чаканага NULL-байта пасля ланцужка \"%s\" напаткалі байт %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Значэнне \"%s\" не з'яўляецца сцежкай аб'екта D-Bus" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Значэнне \"%s\" не з'яўляецца подпісам D-Bus" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Напаткалі масіў даўжынёй у %u байт. Найбольшая даўжыня роўная 2<<26 байтам " +"(64 Мбайт)." +msgstr[1] "" +"Напаткалі масіў даўжынёй у %u байты. Найбольшая даўжыня роўная 2<<26 байтам " +"(64 Мбайт)." +msgstr[2] "" +"Напаткалі масіў даўжынёй у %u байтаў. Найбольшая даўжыня роўная 2<<26 байтам " +"(64 Мбайт)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Значэнне \"%s\" варыянта не з'яўляецца подпісам D-Bus" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Памылка дэсерыялізацыі аб'екта GVariant (тып: \"%s\") з сеткавага фармату D-" +"Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Хібнае азначэнне байтавага ладу. Замест чаканых 0x6c ('l') або 0x42 ('B') " +"атрымалі 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Хібная major-версія пратакола. Замест чаканай версіі \"1\" атрымалі \"%d\"" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Знойдзены загаловак подпісу і сам подпіс \"%s\", але цела паведамлення пустое" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Значэнне \"%s\" не з'яўляецца подпісам D-Bus (для цела паведамлення)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Паведамленне не мае загалоўка з подпісам, але яго цела мае даўжыню %u байт" +msgstr[1] "" +"Паведамленне не мае загалоўка з подпісам, але яго цела мае даўжыню %u байты" +msgstr[2] "" +"Паведамленне не мае загалоўка з подпісам, але яго цела мае даўжыню %u байтаў" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Не ўдалося дэсерыялізаваць паведамленне: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Памылка серыялізацыі аб'екта GVariant (тып: \"%s\") у сеткавы фармат D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Паведамленне мае %d файлавых дэскрыптараў, але загаловак абвяшчае аб %d " +"дэскрыптарах" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Не ўдалося серыялізаваць паведамленне: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Цела паведамлення мае подпіс \"%s\", але не стае подпісу загалоўка" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Цела паведамлення мае подпіс \"%s\", але подпіс загалоўка іншы: \"%s\"" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Цела паведамлення пустое, але подпіс загалоўка: \"%s\"" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Памылка вярнулася з целам тыпу \"%s\"" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Памылка вярнулася з пустым целам" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Не ўдалося атрымаць профіль апаратуры: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Не ўдалося прачытаць /var/lib/dbus/machine-id або /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Памылка запуску StartServiceByName для %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Нечаканы адказ %d ад метаду StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Немагчыма выклікаць метад. Проксі прызначаны для шырока вядомай назвы без " +"уласніка, і ён быў створаны з настаўленым сцяжком " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START." + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Абстрактная прастора назваў не падтрымліваецца" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Немагчыма вызначыць файл таямніцы (\"nonce\") пры стварэнні сервера" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Памылка запісу ў файл таямніцы (\"nonce\") \"%s\": %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Ланцужок \"%s\" не з'яўляецца сапраўдным D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" +"Немагчыма пачаць слухаць порт для транспарту \"%s\", які не падтрымліваецца" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "ЗАГАД" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Загады:\n" +" help Паказаць гэтую даведку\n" +" introspect Вывучэнне аддаленага аб'екта\n" +" monitor Адсочванне аддаленага аб'екта\n" +" call Выклік метаду аддаленага аб'екта\n" +" emit Падаць сігнал\n" +"\n" +"Каб атрымаць даведку для пэўнага загаду, выканайце \"%s ЗАГАД --help\".\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Памылка: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "" +"Памылка разбору XML-файла з атрыманымі данымі: %s\n" +"\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Далучыцца да сістэмнай магістралі" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Далучыцца да сеансавай магістралі" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Далучыцца да пэўнага D-Bus адрасу" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Опцыі канцавога вузла злучэння:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Опцыі, якія вызначаюць канцавы вузел злучэння" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Канцавы вузел злучэння не вызначаны" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Вызначана некалькі канцавых вузлоў злучэння" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Увага: сабраныя даныя сведчаць, што інтэрфейс \"%s\" не існуе\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Увага: сабраныя даныя сведчаць, што на інтэрфейсе \"%2$s\" няма метаду \"%1$s" +"\"\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Неабавязковае месца прызначэння сігналу (унікальная назва)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Сцежка аб'екта для падачы сігналу" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Сігнал і назва інтэрфейсу" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Падаць сігнал." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Памылка злучэння: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Памылка: сцежка аб'екта не вызначана.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Памылка: %s не з'яўляецца сцежкай аб'екта\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Памылка: сігнал не вызначаны.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "" +"Памылка: сігнал мусіць мець форму поўнасцю вызначанай даменнай назвы " +"(FQDN).\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Памылка: %s не з'яўляецца прыдатнай назвай інтэрфейсу\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Памылка: %s не з'яўляецца прыдатнай назвай члена\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Памылка: %s не з'яўляецца прыдатнай унікальнай назвай магістралі.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Памылка разбору параметра %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Памылка давяршэння злучэння: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Мэтавая назва, для якой трэба выклікаць метад" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Сцежка аб'екта, для якой трэба выклікаць метад" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Метад і назва інтэрфейсу" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Тэрмін чакання, секундаў" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Выклікаць метад для аддаленага аб'екта." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Памылка: мэта не вызначана\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Памылка: сцежка аб'екта не вызначана\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Памылка: назва метаду не вызначана\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Памылка: хібная назва метаду \"%s\"\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Памылка разбору параметра %d тыпу \"%s\": %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Мэтавая назва для вывучэння" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Сцежка аб'екта для вывучэння" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Вывесці XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Даследаваць дзяцей" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Толькі вывесці ўласцівасці" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Даследаваць аддалены аб'ект." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Мэтавая назва для адсочвання" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Сцежка аб'екта для адсочвання" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Адсочваць аддалены аб'ект." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Без назвы" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Артыкульны файл не мае графы Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Не ўдалося знайсці тэрмінал, патрэбны для праграмы" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Не ўдалося стварыць папку %s для канфігурацыі праграм карыстальніка: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не ўдалося стварыць папку %s для MIME-канфігурацыі карыстальніка: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Інфармацыі аб праграме не стае ідэнтыфікатара" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не ўдалося стварыць артыкульны файл %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Уласнае азначэнне для %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "прывод не падтрымлівае аперацыі eject або eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "прывод не падтрымлівае функцыі апытвання наконт наяўнасці носьбіта" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "прывод не падтрымлівае аперацыі start" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "прывод не падтрымлівае аперацыі stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Адсутнічае падтрымка TLS" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Не ўдалося апрацаваць версію %d кадавання GEmblem" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Хібная колькасць складнікаў (%d) у кадаванні GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Не ўдалося апрацаваць версію %d кадавання GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Хібная колькасць складнікаў (%d) у кадаванні GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Чакалі GEmblem для GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Прымацаваны дыск, які змяшчае файл, не існуе" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Нельга скапіраваць на месца каталога" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Нельга скапіраваць каталог на месца іншага каталога" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Мэтавы файл існуе" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Не ўдалося рэкурсіўна скапіраваць каталог" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Функцыя splice не падтрымліваецца" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Памылка ўжывання функцыі splice для файла: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Не ўдалося скапіраваць асаблівы файл" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Хібнае значэнне для сімвальнай спасылкі" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Функцыі сметніцы не падтрымліваюцца" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Назвы файлаў не павінны змяшчаць \"%c\"" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "дыскавы том не падтрымлівае мацавання да файлавай сістэмы" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Няма праграм, зарэгістраваных для працы з гэтым файлам" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Аб'ект пераліку закрыты" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Аб'ект пераліку файлаў мае няскончаную аперацыю" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Струмень не падтрымлівае функцыі query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Струмень не падтрымлівае пракручвання" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Для ўваходнага струменя забаронена абразанне" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Струмень не падтрымлівае абразання" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Хібная колькасць складнікаў (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Назва класа %s не мае тыпу" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Тып %s не мае інтэрфейсу GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Тып %s не мае класаў" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Хібны нумар версіі: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Тып %s не мае функцыі from_tokens() для інтэрфейсу GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Не ўдалося апрацаваць гэтую версію кадавання значкоў" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Адрас не вызначаны" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Даўжыня %u надта вялікая для адрасу" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Гэты адрас мае выстаўленыя біты, якія не ўваходзяць у сеткавы прэфікс" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Не ўдалося разабраць \"%s\" як сеткавую маску IP-адрасу" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Не стае вольнай прасторы для адрасу сокета" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Адрас сокета, які не падтрымліваецца" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Струмень мае няскончаную аперацыю" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Элемент <%s> унутры <%s> забаронены" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Элемент <%s> забаронены для найвышэйшага ўзроўню" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Файл %s з'яўляецца ў рэсурсе некалькі разоў" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Не ўдалося адшукаць \"%s\" ва ўсіх выточных каталогах" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Не ўдалося адшукаць \"%s\" у бягучым каталогу" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Невядомая опцыя апрацавання \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Не ўдалося стварыць часовы файл: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Памылка апрацавання ўваходнага файла з дапамогай xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Памылка апрацавання ўваходнага файла з дапамогай to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Не ўдалося прачытаць файл %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Памылка сціскання файла: %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "тэкст не павінен быць унутры <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "назва файла вываду" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "ФАЙЛ" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Каталог, файлы з якога трэба прачытаць (прадвызначана: бягучы каталог)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "КАТАЛОГ" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Згенераваць вывад у фармаце, абраным для пашырэння мэтавага файла" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Згенераваць загаловак крыніцы" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Згенераваць выточны код для спасылкі на файл рэсурса ў вашым кодзе" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Згенераваць спіс залежнасцяў" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Не ствараць і не рэгістраваць рэсурсы аўтаматычна" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "" +"Назва ідэнтыфікатара \"С\", якая будзе ўжывацца ў згенераваным выточным кодзе" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Скампіляваць спецыфікацыю рэсурса ў файл рэсурса.\n" +"Файлы спецыфікацыі рэсурса мусяць мець пашырэнне .gresource.xml,\n" +"а файл рэсурса мае пашырэнне .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Трэба падаць дакладна адну назву файла\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "пустыя назвы забаронены" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "хібная назва \"%s\": назвы мусяць пачынацца з літары ніжняга рэгістра" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"хібная назва \"%s\": хібны знак \"%c\"; дазволены толькі літары ніжняга " +"рэгістра, лічбы і злучок." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "хібная назва \"%s\": два паслядоўныя злучкі забаронены." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "хібная назва \"%s\": апошні знак не можа быць злучком." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "хібная назва \"%s\": максімальная даўжыня = 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " ужо вызначана" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "не ўдалося дадаць ключы да схемы \"list-of\"" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " ужо вызначана" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" засланяе з ; каб змяніць " +"значэнне, ужыйце " + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"дакладна адзін з атрыбутаў \"type\" (тып), \"enum\" (пералік) або \"flags" +"\" (сцяжкі) мусіць быць вызначаны для " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (пакуль) не зызначана." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Хібны ланцужок тыпу GVariant: \"%s\"" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "ужыта , але схема нічога не засланяе" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "няма для засланення" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " ужо вызначана" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " ужо вызначана" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " засланяе яшчэ адсутную схему \"%s\"" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " з'яўляецца спісам для яшчэ адсутнай схемы \"%s\"" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Не можа быць спісам схемы са сцежкай" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Не можа засланяць схему са сцежкай" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" з'яўляецца спісам, які засланяе ня-спіс " + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" засланяе , але " +"\"%s\" не засланяе \"%s\"" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "сцежка мусіць пачынацца і канчацца знакам скосу" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "сцежка спіса мусіць канчацца \":/\"" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ужо вызначана" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Элемент <%s> забаронены для найвышэйшага ўзроўню" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "выбрана опцыя --strict; выходзім.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Увесь гэты файл быў праігнараваны.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ігнараванне гэтага файла.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"У схеме \"%2$s\" няма ключа \"%1$s\", вызначанага ў файле заслоны \"%3$s\"" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; заслона гэтага ключа праігнараваная.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " , а таксама вызначана опцыя --strict; выходзім.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"памылка разбору ключа \"%s\" схемы \"%s\", вызначанага ў файле заслоны \"%s" +"\": %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Заслона для гэтага ключа праігнараваная.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"заслона для ключа \"%s\" схемы \"%s\" у файле заслоны \"%s\" не ў дыяпазоне, " +"вызначаным схемай" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"заслона для ключа \"%s\" схемы \"%s\" у файле заслоны \"%s\" не ў спісе " +"магчымага выбару" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "дзе захоўваць файл gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Перапыніць працу пры знаходжанні памылак у схемах" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Не запісваць файл gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Не пільнавацца абмежаванняў на назвы ключоў" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Скампіляваць файлы схем GSettings у кэш.\n" +"Файлы схем мусяць мець пашырэнне .gschema.xml,\n" +"а файл кэшу называецца gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Трэба падаць дакладна адну назву каталога\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Файлы схем не знойдзены: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "нічога не ўчынена.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "наяўны выхадны файл выдалены.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Не ўдалося адшукаць прадвызначаны тып назіральніка за каталогам" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Хібная назва файла %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Памылка атрымання звестак аб файлавай сістэме: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Немагчыма пераназваць каранёвы каталог" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Памылка пераназвання файла: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Не ўдалося пераназваць файл, бо файл з такой назвай ужо існуе" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Хібная назва файла" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Не ўдалося адкрыць каталог" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Памылка адкрыцця файла: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Памылка выдалення файла: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Памылка пераносу файла ў сметніцу: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не ўдалося стварыць каталог для смецця \"%s\": %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Не ўдалося адшукаць каталог верхняга ўзроўню для сметніцы" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Не ўдалося адшукаць ці стварыць каталог для смецця" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не ўдалося стварыць файл са звесткамі аб смецці: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не ўдалося перанесці файл у сметніцу: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "унутраная памылка" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Памылка стварэння каталога: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файлавая сістэма не падтрымлівае сімвальных спасылак" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Памылка стварэння сімвальнай спасылкі: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Памылка перамяшчэння файла: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Немагчыма перамясціць каталог на месца іншага каталога" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Не ўдалося стварыць запасную копію файла" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Памылка выдалення мэтавага файла: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Перамяшчэнне з аднаго прымацаванага дыска на іншы не падтрымліваецца" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Атрыбут не можа мець NULL-значэнне" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Хібны тып атрыбута (чакаўся ланцужок знакаў)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Хібная назва пашыранага атрыбута" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Памылка настаўлення пашыранага атрыбута \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (хібнае кадаванне)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Памылка пры зборы звестак аб файле \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Памылка пры зборы звестак аб дэскрыптары файла: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Хібны тып атрыбута (чакаўся uint32)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Хібны тып атрыбута (чакаўся uint64)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Хібны тып атрыбута (чакаўся ланцужок байтаў)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Немагчыма настаўляць дазволы для сімвальных спасылак" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Памылка настаўлення дазволаў: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Памылка прызначэння ўласніка: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "сімвальная спасылка не можа мець NULL-значэнне" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Памылка настаўлення сімвальнай спасылкі: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "Памылка настаўлення: файл не з'яўляецца сімвальнай спасылкай" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Памылка настаўлення часавых метак змянення і доступу: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-кантэкст не можа мець NULL-значэнне" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Памылка настаўлення SELinux-кантэксту: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux не ўключаны для гэтай сістэмы" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Настаўленне атрыбута %s не падтрымліваецца" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Памылка чытання з файла: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Памылка пракручвання змесціва файла: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Памылка закрыцця файла: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" +"Не ўдалося вызначыць прадвызначаны тып назіральніка за мясцовымі файламі" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Памылка запісу ў файл: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Памылка выдалення старой запасной спасылкі: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Памылка стварэння запасной копіі: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Памылка пераназвання часовага файла: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Памылка абразання файла: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Памылка адкрыцця файла \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Мэтавы файл з'яўляецца каталогам" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Мэтавы файл не з'яўляецца звычайным файлам" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Файл быў зменены звонку" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Памылка выдалення старога файла: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Хібны тып GSeekType" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Хібны запыт пракруткі" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Немагчыма абрэзаць струмень GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Немагчыма змяняць памер струменя вываду змесціва памяці" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Не ўдалося змяніць памер струменя вываду змесціва памяці" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "Памяць, патрэбная для запісу, большая за даступную адрасную прастору" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Атрыманы загад на пракрутку струменя далей за яго пачатак" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"прымацаваны дыск не падтрымлівае функцыі сіхроннага вызначэння тыпу змесціва" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Назва машыны \"%s\" змяшчае знак \"[\" без \"]\"" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Сетка недасягальная" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Машына недасягальная" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Не ўдалося стварыць сеткавага назіральніка: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Не ўдалося стварыць сеткавага назіральніка: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Не ўдалося вызначыць сеткавы стан: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Выхадны струмень не падтрымлівае функцыі запісу" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Выточны струмень ужо закрыты" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Памылка вызначэння адрасу \"%s\": %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Памылка адваротнага вызначэння адрасу \"%s\": %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Для \"%s\" адсутнічае DNS-запіс патрэбнага тыпу" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Часова немагчыма вызначыць адрас \"%s\"" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Памылка вызначэння адрасу \"%s\"" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Для \"%s\" атрыманы няпоўныя даныя" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Рэсурс на \"%s\" не існуе" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Памылка распакавання рэсурса на \"%s\"" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Рэсурс на \"%s\" не з'яўляецца каталогам" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Уваходны струмень не мае функцыі пошуку" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Вывесці даведку" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[ЗАГАД]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Пералічыць секцыі, якія змяшчаюць рэсурсы ў elf-файле ФАЙЛ" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Пералічыць рэсурсы\n" +"Калі дадзена СЕКЦЫЯ, пералічвае толькі рэсурсы з гэтай секцыі\n" +"Калі дадзена СЦЕЖКА, пералічвае толькі адпаведныя рэсурсы" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "ФАЙЛ [СЦЕЖКА]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "СЕКЦЫЯ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Пералічыць рэсурсы з падрабязнасцямі\n" +"Калі дадзена СЕКЦЫЯ, пералічвае толькі рэсурсы з гэтай секцыі\n" +"Калі дадзена СЦЕЖКА, пералічвае толькі адпаведныя рэсурсы\n" +"Падрабязнасці ўключаюць секцыю, памер і сцісканне" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Выняць файл рэсурса ў стандартны выхад" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "СЦЕЖКА ФАЙЛ" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Невядомы загад %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Правілы выкарыстання:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Загады:\n" +" help Паказаць гэту інфармацыю\n" +" sections Пералічыць секцыі рэсурсаў\n" +" list Пералічыць рэсурсы\n" +" details Пералічыць рэсурсы з падрабязнасцямі\n" +" extract Выняць рэсурс\n" +"\n" +"Выкарыстоўвайце \"gresource help ЗАГАД\", каб атрымаць падрабязную даведку.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Правілы выкарыстання:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Аргументы:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " СЕКЦЫЯ (Неабавязковая) назва elf-секцыі\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " ЗАГАД (Неабавязковы) загад, які трэба патлумачыць\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " ФАЙЛ Elf-файл (двайковая ці супольная бібліятэка)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ФАЙЛ Elf-файл (двайковая ці супольная бібліятэка)\n" +" ці скампіляваны файл рэсурса\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[СЦЕЖКА]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " СЦЕЖКА (Неабавязковая) сцежка рэсурса (можа быць няпоўнай)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "СЦЕЖКА" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " СЦЕЖКА Сцежка рэсурса\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Схема \"%s\" не існуе\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Схема \"%s\" непераносная (трэба вызначыць сцежку)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Схема \"%s\" пераносная (трэба вызначыць сцежку)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Сцежка пустая.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Сцежка мусіць пачынацца са скосу (\"/\")\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Сцежка мусіць канчацца скосам (\"/\")\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Сцежка не можа змяшчаць два паслядоўныя скосы (\"//\")\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ключ \"%s\" не існуе\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Значэнне не ў дазволеным дыяпазоне\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Пералічыць усталяваныя (непераносныя) схемы" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Пералічыць усталяваныя пераносныя схемы" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Пералічыць ключы СХЕМЫ" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "СХЕМА[:СЦЕЖКА]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Пералічыць нашчадкаў СХЕМЫ" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Рэкурсіўна пералічыць ключы і іх значэнні\n" +"Калі СХЕМА не вызначана, пералічыць усе ключы\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[СХЕМА[:СЦЕЖКА]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Атрымаць значэнне КЛЮЧА" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "СХЕМА[:СЦЕЖКА] КЛЮЧ" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Запытаць аб дыяпазоне магчымых значэнняў КЛЮЧА" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Прызначыць ЗНАЧЭННЕ КЛЮЧУ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "СХЕМА[:СЦЕЖКА] КЛЮЧ ЗНАЧЭННЕ" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Вярнуць прадвызначанае значэнне КЛЮЧА" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Вярнуць прадвызначаныя значэнні ўсіх ключоў СХЕМЫ" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Праверыць магчымасць змянення значэння КЛЮЧА" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Назіраць за зменамі КЛЮЧА.\n" +"Калі КЛЮЧ не вызначаны, назіраць за ўсімі ключамі СХЕМЫ.\n" +"Каб спыніць назіранне, націсніце ^C.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "СХЕМА[:СЦЕЖКА] [КЛЮЧ]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Правілы карыстання:\n" +" gsettings [--schemadir КАТАЛОГ_СХЕМ] ЗАГАД [АРГУМЕНТЫ...]\n" +"\n" +"Загады:\n" +" help Паказаць гэтую даведку\n" +" list-schemas Пералічыць усталяваныя схемы\n" +" list-relocatable-schemas Пералічыць пераносныя схемы\n" +" list-keys Пералічыць ключы схемы\n" +" list-children Пералічыць нашчадкаў схемы\n" +" list-recursively Рэкурсіўна пералічыць ключы і іх значэнні\n" +" range Запытаць аб дыяпазоне магчымых значэнняў ключа\n" +" get Атрымаць значэнне ключа\n" +" set Прызначыць значэнне ключу\n" +" reset Вярнуць прадвызначанае значэнне ключа\n" +" reset-recursively Вярнуць прадвызначаныя значэнні ўсіх ключоў " +"схемы\n" +" writable Праверыць магчымасць змянення значэння ключа\n" +" monitor Назіраць за зменамі\n" +"\n" +"Каб атрымаць падрабязнейшую даведку, выканайце загад \"gsettings help ЗАГАД" +"\".\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Правілы карыстання:\n" +"gsettings [--schemadir КАТАЛОГ_СХЕМ] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " КАТАЛОГ_СХЕМ Каталог для пошуку дадатковых схем\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" СХЕМА Назва схемы\n" +" СЦЕЖКА Сцежка (для пераносных схем)\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " КЛЮЧ (неабавязковы) ключ у схеме\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " КЛЮЧ Ключ у схеме\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " ЗНАЧЭННЕ Патрэбнае значэнне ключа\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Пустая назва схемы\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Хібны сокет не ініцыяваны" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Хібны сокет не ініцыяваны з наступнай прычыны: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Сокет ужо закрыты" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Скончыўся тэрмін чакання ўводу-вываду на сокеце" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "стварэнне GSocket-аб'екта з fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не ўдалося стварыць сокет: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Невядомае сямейства пратакола" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Невядомы пратакол" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "не ўдалося вызначыць свой адрас: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "не ўдалося вызначыць адрас аддаленай машыны: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "не ўдалося пачаць слухаць: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Памылка прывязання да адрасу: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Не ўдалося далучыцца да групы multicast: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Не ўдалося выйсці з групы multicast: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Спецыфічная крыніца multicast не падтрымліваецца" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Памылка ўхвалення злучэння: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Адбываецца злучэнне" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не ўдалося ўзяць чарговую памылку: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Памылка атрымання даных: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Памылка паслання даных: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не ўдалося спыніць працу сокета: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Памылка закрыцця сокета: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Чакаем умовы на сокеце: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Памылка пасылання паведамлення: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage не падтрымліваецца ў сістэме Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Памылка атрымання паведамлення: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials адсутнічае для гэтай аперацыйнай сістэмы" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Не ўдалося злучыцца з проксі-серверам %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Не ўдалося злучыцца з %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Не ўдалося злучыцца: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Падчас злучэння ўзнікла невядомая памылка " + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Проксі-перасылка падтрымліваецца толькі для TCP-злучэнняў." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Пратакол \"%s\" не падтрымліваецца для проксі-злучэнняў." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Слухач ужо закрыў сокет" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Дададзены сокет закрыты" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "Пратакол SOCKSv4 не падтрымлівае IPv6-адрасу \"%s\"" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Імя карыстальніка надта доўгае для пратакола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Назва машыны \"%s\" надта доўгая для пратакола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Гэты проксі-сервер не з'яўляецца SOCKSv4-серверам." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Злучэнне праз SOCKSv4-сервер было адпрэчана" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Гэты проксі-сервер не з'яўляецца SOCKSv5-серверам." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Гэты SOCKSv5-сервер вымагае праверкі тоеснасці." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Гэты SOCKSv5 проксі-сервер патрабуе такога спосабу ідэнтыфікацыі, які не " +"падтрымліваецца бібліятэкай GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Імя карыстальніка ці пароль надта доўгія для пратакола SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Праверка тоеснасці пратакола SOCKSv5 скончылася няўдачай праз хібныя імя " +"карыстальніка ці пароль." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Назва машыны \"%s\" надта доўгая для пратакола SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 проксі-сервер мае невядомы тып адрасу." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Унутраная памылка SOCKSv5 проксі-сервера." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-злучэнне забаронена правіламі." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Машына недасягальная праз гэты SOCKSv5-сервер." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Сетка недасягальная праз гэты SOCKSv5-сервер." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Прапанова злучэння праз SOCKSv5-сервер адпрэчана." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 проксі-сервер не падтрымлівае загаду \"connect\"." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 проксі-сервер не падтрымлівае гэтага тыпу адрасоў." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Невядомая памылка проксі-сервера SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Не ўдалося апрацаваць версію %d кадавання GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Не ўдалося расшыфраваць закрыты ключ, закадаваны як PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Закрыты ключ, закадаваны як PEM, не знойдзены" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Не ўдалося разабраць закрыты ключ, закадаваны як PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Сертыфікат, закадаваны як PEM, не знойдзены" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Не ўдалося разабраць сертыфікат, закадаваны як PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "Гэта апошні шанец увесці правільны пароль да блакіравання доступу." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Вы некалькі разоў уводзілі хібныя паролі, і калі вы працягнеце ўводзіць " +"хібныя паролі, дык будзеце заблакіраваны." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Уведзены пароль няправільны." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Чакалі аднаго кіроўнага паведамлення, а маем %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Нечаканы тып дадатковых даных" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Чакалі аднаго fd, а маем %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Атрымалі хібны fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Памылка паслання пасведчанняў: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Не ўдалося праверыць, ці ўключаная опцыя SO_PASSCRED для сокета: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Падчас праверкі, ці ўключаная опцыя SO_PASSCRED для сокета, атрымалі даныя " +"нечаканай даўжыні (%2$d замест %1$d байтаў)" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Не ўдалося ўключыць опцыю SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Чакалі аднаго байта, які б пацвердзіў атрыманне пасведчанняў, але нічога не " +"атрымалі" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Не чакалі кіроўнага паведамлення, але маем %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Не ўдалося выключыць опцыю SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Памылка чытання з дэскрыптара файла: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Памылка закрыцця дэскрыптара файла: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Корань файлавай сістэмы" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Памылка запісу ў дэскрыптар файла: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Абстрактныя адрасы UNIX-сокетаў не падтрымліваюцца ў гэтай сістэме" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "дыскавы том не мае функцый \"eject\" ці \"eject_with_operation\"" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Не ўдалося адшукаць праграму" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Не ўдалося запусціць праграму: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI-адрасы не абслугоўваюцца" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "" +"змяненне сувязі праграм і тыпаў файлаў не падтрымліваецца ў win32-асяроддзі" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "" +"Стварэнне сувязей праграм і тыпаў файлаў не падтрымліваецца ў win32-асяроддзі" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Не ўдалося прачытаць з файлавага аб'екта: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Не ўдалося закрыць файлавы аб'ект: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Не ўдалося запісаць у файлавы аб'ект: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Не стае памяці" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Унутраная памылка: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Трэба болей уводных даных" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Хібныя сціснутыя даныя" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Адрас для праслухоўвання" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ігнаруецца, захаваны для сумяшчальнасці з GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Вывесці адрас" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Вывесці адрас у рэжыме абалонкі" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Запусціць dbus-службу" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Хібныя аргументы\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Нечаканы атрыбут \"%s\" для складніка \"%s\"" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрыбут \"%s\" элемента \"%s\" не знойдзены" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Нечаканы тэг \"%s\" замест чаканага \"%s\"" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Нечаканы тэг \"%s\" унутры \"%s\"" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "У каталогах з данымі не знойдзена файлаў з закладкамі" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Закладка для адрасу \"%s\" ужо існуе" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Для адрасу \"%s\" не знойдзена закладкі" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "MIME-тып не вызначаны для закладкі на адрас \"%s\"" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Закладка на адрас \"%s\" не мае сцяжка прыватнасці" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Для закладкі на адрас \"%s\" не вызначана груп" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Няма праграм з назвай \"%s\", якія б зарэгістравалі закладу на \"%s\"" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не ўдалося разгарнуць загад \"%s\" з дапамогай адрасу \"%s\"" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Абрэзаная паслядоўнасць знакаў напрыканцы ўводу" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не ўдалося пераўтварыць даныя з падменнага знаказбору \"%s\" у \"%s\"" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"%s\" не з'яўляецца абсалютным адрасам файла" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адрас мясцовага файла \"%s\" не можа змяшчаць знак \"#\"" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адрас \"%s\" няправільны" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Назва машыны ў адрасе \"%s\" няправільная" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адрас \"%s\" змяшчае памылкова экранаваныя знакі" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "\"%s\" не з'яўляецца абсалютнай сцежкай" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Хібная назва машыны" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "да поўдня" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "пасля поўдня" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%2$d.%1$m.%3$y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "студзень" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "люты" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "сакавік" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "красавік" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "май" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "чэрвень" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ліпень" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "жнівень" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "верасень" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "кастрычнік" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "лістапад" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "снежань" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "сту" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "лют" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "сак" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "кра" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "май" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "чэр" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ліп" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "жні" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "вер" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "кас" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ліс" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "сне" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "панядзелак" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "аўторак" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "серада" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "чацвер" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "пятніца" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "субота" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "нядзеля" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "пан" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "аўт" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "сер" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "чац" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "пят" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "суб" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "нядз" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Не ўдалося адкрыць каталог \"%s\": %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не ўдалося выдзеліць %lu байтаў, каб прачытаць файл \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Не ўдалося прачытаць файл \"%s\": %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файл \"%s\" надта вялікі" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не ўдалося прачытаць з файла \"%s\": %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не ўдалося адкрыць файл \"%s\": %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не ўдалося атрымаць спіс атрыбутаў файла \"%s\": памылка fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не ўдалося адкрыць файл \"%s\": памылка fdopen(): %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Не ўдалося змяніць назву файла з \"%s\" на \"%s\": памылка g_rename(): %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не ўдалося стварыць файл \"%s\": %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не ўдалося адкрыць файл \"%s\" для запісу: памылка fdopen(): %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не ўдалося запісаць файл \"%s\": памылка fwrite(): %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не ўдалося запісаць файл \"%s\": памылка fflush(): %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не ўдалося запісаць файл \"%s\": памылка fsync(): %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не ўдалося закрыць файл \"%s\": памылка fclose(): %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Не ўдалося сцерці наяўны файл \"%s\": памылка g_unlink(): %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблон \"%s\" хібны, бо змяшчае \"%s\"" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон \"%s\" не змяшчае XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не ўдалося прачытаць сімвальную спасылку \"%s\": %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Сімвальныя спасылкі не падтрымліваюцца" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не ўдалося адкрыць пераўтваральнік са знаказбору \"%s\" у \"%s\": %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Не ўдалося прачытаць сырыя даныя ў функцыі g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "У буферы даных для пераўтварэння засталіся неапрацаваныя даныя" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Канал закончыўся абрэзаным знакам" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не ўдалося прачытаць сырыя даныя ў функцыі g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "У каталогах пошуку не знойдзена ключавых файлаў" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "Гэта не звычайны файл" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ключавы файл змяшчае радок \"%s\", які не з'яўляецца ані парай ключ-" +"значэнне, ані групай, ані каментарыем" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Хібная назва групы: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Ключавы файл не пачынаецца з групы" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Хібная назва ключа: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" +"Ключавы файл змяшчае даныя, закадаваныя як \"%s\". Гэты спосаб кадавання не " +"падтрымліваецца." + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ключавы файл не мае групы \"%s\"" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ключавы файл не мае ключа \"%s\"" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ключавы файл змяшчае ключ \"%s\" са значэннем \"%s\", закадаваным не як UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ключавы файл змяшчае ключ \"%s\" са значэннем, якое немагчыма зразумець." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Ключавы файл змяшчае ключ \"%s\" у групе \"%s\" са значэннем, якое немагчыма " +"зразумець." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Ключ \"%s\" у групе \"%s\" мае значэнне \"%s\", хоць чакалася %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ключавы файл не мае ключа \"%s\" у групе \"%s\"" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "Ключавы файл змяшчае знак экранавання напрыканцы радка" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ключавы файл змяшчае хібную кіроўную паслядоўнасць \"%s\"" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Не ўдалося ўспрыняць значэнне \"%s\" як лік." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Цэлае значэнне \"%s\" не ў дыяпазоне" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Не ўдалося ўспрыняць значэнне \"%s\" як дробавы лік." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Не ўдалося ўспрыняць значэнне \"%s\" як булева." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Не ўдалося атрымаць спіс атрыбутаў файла \"%s%s%s%s\": памылка fstat(): %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Не ўдалося алюстраваць файл %s%s%s%s у памяці: памылка mmap(): %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не ўдалося адкрыць файл \"%s\": памылка open(): %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Памылка ў радку %d, знак %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Няправільны UTF-8 тэкст у назве - хібны \"%s\"" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" не з'яўляецца правільнай назвай " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" не з'яўляецца правільнай назвай: \"%c\" " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Памылка ў радку %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Адсылка да знака \"%-.*s\" не азначае дазволенага знака" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Напатканы пусты знакавы элемент \"&;\". Дазволеныя элементы: \"&\", " +"\""\", \"<\", \">\" і \"'\"." + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Назва знакавага элемента \"%-.*s\" невядомая." + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Дакумент мусіць пачынацца з элемента (напрыклад, з )." + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Знак \"%s\" забаронены пасля знака \"<\". Назва элемента не можа пачынацца з " +"гэтага знака." + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Напатканы нечаканы \"%s\" замест чаканага знака \">\", які б закрыў тэг \"%s" +"\" пустога элемента." + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Напатканы нечаканы \"%s\" замест чаканага знака \"=\" пасля назвы атрыбута " +"\"%s\" элемента \"%s\"." + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Знак \"%s\" не дазволены для змяшчэння пасля канцавой назвы элемента \"%s\". " +"У гэтым месцы дазволены толькі знак \">\"." + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Элемент \"%s\" закрыты, і ўжо больш няма адкрытых элементаў." + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Элемент \"%s\" закрыты, але цяпер адкрытым застаецца элемент \"%s\"." + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Дакумент быў пустым або змяшчаў толькі прабельныя знакі." + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Дакумент нечакана скончыўся адразу пасля пачатковага знака \"<\"." + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Дакумент нечакана скончыўся, хаця яшчэ засталіся адкрытыя элементы. Апошнім " +"адкрытым элементам з'яўляецца \"%s\"." + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Дакумент нечакана скончыўся, хаця далей мусіў быць канцавы знак \">\", які б " +"закрыў тэг <%s/>." + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Дакумент нечакана скончыўся пасярод назвы элемента." + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Дакумент нечакана скончыўся пасярод назвы атрыбута." + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Дакумент нечакана скончыўся пасярод тэга, які адкрывае элемент." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Дакумент нечакана скончыўся пасля знака роўнасці, змешчанага пасля назвы " +"атрыбута. Значэнне атрыбута не вызначана." + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Дакумент нечакана скончыўся пасярод значэння атрыбута." + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Дакумент нечакана скончыўся пасярод тэга, які закрывае элемент \"%s\"." + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Дакумент нечакана скончыўся пасярод каментарыя або інструкцыі для " +"апрацоўвання." + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Правілы выкарыстання:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ОПЦЫЯ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Опцыі дапамогі:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Паказаць опцыі дапамогі" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Паказаць усе опцыі дапамогі" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Опцыі праграмы:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не ўдалося разабраць цэлае значэнне \"%s\" для %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Цэлае значэнне \"%s\" для %s не ў дыяпазоне" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" +"Не ўдалося разабраць дробавае значэнне падвойнай дакладнасці \"%s\" для %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Дробавае значэнне падвойнай дакладнасці \"%s\" для %s не ў дыяпазоне" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Не ўдалося разабраць опцыю %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Адсутнічае аргумент да %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Невядомая опцыя %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "пашкоджаны аб'ект" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "унутраная памылка або пашкоджаны аб'ект" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "памяць вычарпана" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "дасягнута абмежаванне на колькасць галін пошуку" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблон змяшчае складнікі, якія не падтрымліваюцца для пошуку няпоўных " +"адпаведнікаў" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"зваротныя адсылкі як умовы не падтрымліваюцца для пошуку няпоўных " +"адпаведнікаў" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "дасягнута абмежаванне на глыбіню рэкурсіі" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "памылковае спалучэнне сцяжкоў новага радка" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "хібны зрух" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "кароткі utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "рэкурсіўны цыкл" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "невядомая памылка" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "знак \"\\\" напрыканцы шаблона" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "знак \"\\c\" напрыканцы шаблона" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "невядомы знак пасля \"\\\"" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "неўпарадкаваныя лікі ў квантары {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "надта вялікі лік у квантары {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "адсутнічае канцавы знак \"]\" класа знакаў" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "хібная кіроўная паслядоўнасць у класе знакаў" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "дыяпазон у класе знакаў па-за дапушчальнымі межамі" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "няма што паўтараць" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "нечаканы паўтор" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "невядомы знак пасля \"(?\" ці \"(?-\"" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-класы з назвамі падтрымліваюцца толькі ўнутры іншага класа" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "адсутны канцавы знак \")\"" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "адсылка да адсутнага падшаблона" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "пасля каментарыя адсутнічае знак \")\"" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "надта доўгі рэгулярны выраз" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "не ўдалося займець памяць" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "знак \")\" не мае адпаведнага пачатковага знака \"(\"" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "перапаўненне коду" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "невядомы знак пасля \"(?<\"" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "праверка з азіраннем назад не мае сталай даўжыні" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "пасля \"(?(\" змешчаны хібны лік ці назва" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "умоўная група змяшчае больш за дзве галіны" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "пасля \"(?R\" і \"(?[+-]лічбы\" мусіць ісці знак \")\"" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "назва невядомага POSIX-класа" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "элементы парадкавання POSIX не падтрымліваюцца" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "надта вялікае значэнне знака ў паслядоўнасці \"\\x{...}\"" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "хібная ўмова \"(?(0)\"" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\"\\C\" забаронена для праверкі з азіраннем назад" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "паслядоўнасці \\L, \\l, \\N{назва}, \\U і \\u не падтрымліваюцца" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "рэкурсія магла ніколі не скончыцца" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "невядомы знак пасля \"(?P\"" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "у назве падшаблона адсутнічае канцавы элемент" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "два падшаблоны маюць аднолькавую назву" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "хібная паслядоўнасць \"\\P\" ці \"\\p\"" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "назва невядомай уласцівасці пасля \"\\P\" ці \"\\p\"" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "надта доўгая назва падшаблона (дазволена не больш за 32 знакі)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "надта шмат падшаблонаў з назвамі (дазволена не больш за 10 тыс.)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "васьмярковае значэнне большае за \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "пераўпоўнена працоўная прастора для кампіляцыі" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "раней правераны падшаблон з адсылкай не знойдзены" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "Група DEFINE змяшчае больш за адну галіну" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "Няўзгоднены выбар NEWLINE" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"пасля \"\\g\" адсутнічае назва ці лік у дужках (круглых або вуглавых) ці ў " +"двукоссі, або проста лік" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "пранумараваная адсылка мусіць быць ненулявой" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "для (*ACCEPT), (*FAIL) ці (*COMMIT) не дазволеныя аргументы" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) не апазнаны" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "надта вялікі лік" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "пасля \"(?&\" адсутнічае назва падшаблона" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "пасля \"(?+\" чакалі лічбу" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"\"]\" з'яўляецца хібным знакам даных у рэжыме сумяшчальнасці з JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "розныя назвы для падшаблонаў з аднолькавым нумарам забароненыя" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) мусіць прымаць аргумент" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "пасля \"\\c\" мусіць быць ASCII-знак" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"пасля \"\\k\" адсутнічае назва ў дужках (круглых ці вуглавых) або ў двукоссі" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\"\\N\" не падтрымліваецца ў класе" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "надта шмат адсылак наперад" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "надта доўгая назва ў (*MARK), (*PRUNE), (*SKIP) ці (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "надта вялікае значэнне знака ў паслядоўнасці \"\\u....\"" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Памылка падчас пошуку адпаведнікаў да рэгулярнага выразу %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" +"Праграмная бібліятэка PCRE скампіляваная без падтрымкі кадавання UTF-8." + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"Праграмная бібліятэка PCRE скампіляваная без падтрымкі ўласцівасцяў UTF-8." + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Праграмная бібліятэка PCRE скампіляваная з несумяшчальнымі опцыямі" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Памылка падчас кампілявання рэгулярнага выразу \"%s\" на знаку %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Памылка падчас аптымізавання рэгулярнага выразу \"%s\": %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "чакалі шаснаццатковую лічбу або знак \"}\"" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "чакалі шаснаццатковую лічбу" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "адсутнічае знак \"<\" у сімвальнай адсылцы" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "няскончаная сімвальная адсылка" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "сімвальная адсылка нулявой даўжыні" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "чакалі лічбу" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "забароненая сімвальная адсылка" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "няправільна змешчаны канцавы знак \"\\\"" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "невядомая кіроўная паслядоўнасць" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Памылка падчас разбору тэксту замены \"%s\" у знаку %lu: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Цытаваны тэкст не пачынаецца з двукосся" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Самотнае двукоссе ў загадным радку ці ў іншым цытаваным тэксце" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Тэкст (\"%s\") абрэзаны адразу пасля знака \"\\\"." + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Тэкст (\"%2$s\") абрэзаны да парнага двукосся для %1$c." + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Тэкст пусты (або змяшчаў толькі прабельныя знакі)." + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Не ўдалося прачытаць даныя працэсу-нашчадка (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Нечаканая памылка ў функцыі select() падчас чытання даных працэсу-нашчадка " +"(%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Нечаканая памылка ў функцыі waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Працэс-нашчадак выйшаў, вярнуўшы код %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Працэс-нашчадак забіты сігналам %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Працэс-нашчадак спынены сігналам %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Працэс-нашчадак скончыў працу надзвычайным чынам" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Не ўдалося прачыць з канала сувязі з нашчадкам (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Не ўдалося разгалінаваць працэс (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Не ўдалося перайсці ў каталог \"%s\" (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Не ўдалося запусціць працэс-нашчадак \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Не ўдалося перанакіраваць вывад ці ўвод працэсу-нашчадка (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Не ўдалося адгалінаваць працэс-нашчадак (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Невядомая памылка запуску працэсу-нашчадка \"%s\"" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Не ўдалося прачытаць дастатковую колькасць даных з канала сувязі з нашчадкам " +"(%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Не ўсталяваць стварыць канал сувязі з працэсам-нашчадкам (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "Не ўдалося прачытаць даныя ад працэсу-нашчадка" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Не ўдалося запусціць працэс-нашчадак (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Хібная назва праграмы: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "хібны ланцужок у масіве аргументаў у пазіцыі %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "хібны ланцужок у асяроддзі: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "хібны рабочы каталог: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не ўдалося запусціць дапаможную праграму (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Нечаканая памылка ў функцыі g_io_channel_win32_poll() падчас чытання даных " +"працэсу-нашчадка" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Знак не ў дыяпазоне UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Хібная паслядоўнасць на ўваходзе пераўтварэння" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Знак не ў дыяпазоне UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байты" +msgstr[2] "%u байтаў" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f Кбайт" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f Мбайт" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f Гбайт" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f Тбайт" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f Пбайт" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f Эбайт" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f кб" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Мб" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Гб" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f Тб" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f Пб" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f Эб" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s байт" +msgstr[1] "%s байты" +msgstr[2] "%s байтаў" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f кб" diff --git a/po/be@latin.po b/po/be@latin.po new file mode 100644 index 0000000..b44cd9b --- /dev/null +++ b/po/be@latin.po @@ -0,0 +1,4125 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2008-02-16 23:33+0200\n" +"Last-Translator: Ihar Hrachyshka \n" +"Language-Team: Belarusian Latin \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Niečakany atrybut '%s' dla elementu '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atrybut '%s' elementu '%s' nia znojdzieny" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Niečakany značnik '%s', spadziavalisia značnika '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Niečakany značnik '%s' unutry '%s'" + +#: ../glib/gbookmarkfile.c:1834 +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:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zakładka dla URI '%s' užo isnuje" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Dla URI '%s' nia znojdziena zakładak" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, 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:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +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:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, 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:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "NiapoÅ­ny znak u kancy Å­vachodnaha radka" + +# glib/gconvert.c:788 +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' niapravilny" + +# glib/gconvert.c:1632 +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Niapravilnaja nazva hostu Å­ URI '%s' " + +# glib/gconvert.c:1648 +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' utrymlivaje nieadpaviedna cytavanyja znaki" + +# glib/gconvert.c:1719 +#: ../glib/gconvert.c:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "Niapravilnaja nazva kamputara" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Studzień" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Luty" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Sakavik" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Krasavik" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Travień" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Červień" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Lipień" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Stu" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Lut" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Sak" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Kra" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Tra" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Čer" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Lip" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Paniadziełak" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "AÅ­torak" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Sierada" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Čaćvier" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Piatnica" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Subota" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Niadziela" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pan" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "AÅ­t" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Sie" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Čać" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pia" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sub" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Nia" + +# glib/gdir.c:79 +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, 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:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +# glib/gfileutils.c:426 +#: ../glib/gfileutils.c:652 +#, 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:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Niemahčyma adčynić fajł '%s': %s" + +# glib/gfileutils.c:479 +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Niemahčyma stvaryć fajł '%s': %s" + +# glib/gfileutils.c:505 +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, 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:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "U Å¡ablonie '%s' niama XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtaÅ­" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtaÅ­" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +# glib/gfileutils.c:745 +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Niemahčyma pračytać symbalnuju spasyłku '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, 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:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +# glib/gmarkup.c:303 +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Pamyłka Å­ radku %d: %s" + +# glib/gmarkup.c:528 +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Pusty zapis '&;' adÅ¡ukany; dapuščalnyja: & " < > '" + +# glib/gmarkup.c:472 +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nieviadomaja nazva adzinki '%s'" + +# glib/gmarkup.c:482 +#: ../glib/gmarkup.c:727 +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:1078 +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:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dakument byÅ­ pusty albo Å­trymlivaÅ­ tolki prabieły" + +# glib/gmarkup.c:1588 +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +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:1754 +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:1759 +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:1765 +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:1772 +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:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dakument niečakana skončyÅ­sia Å­nutry kamentara albo instrukcyi" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "sapsavany abjekt" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "unutranaja pamyłka ci sapsavany abjekt" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "nie chapiła pamiaci" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "limit viartańnia (backtracking) dasiahnutaja" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"Å¡ablon utrymlivaje elementy, jakija nie padtrymvajucca dla častkovaj " +"adpaviadnaści" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "unutranaja pamyłka" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "limit rekursii dasiahnuty" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "limit rabočaj prastory dla pustych padradkoÅ­ dasiahnuty" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "niapravilnaja kambinacyja ściažkoÅ­ novych radkoÅ­" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "nieviadomaja pamyłka" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ u kancy Å¡ablonu" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c u kancy Å¡ablonu" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "za \\ śleduje nieviadomy znak" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "niečarhovyja liki Å­ quantyfikatary {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "zavialiki lik u quantyfikatary {}" + +# glib/giochannel.c:1587 glib/giochannel.c:1661 +#: ../glib/gregex.c:283 +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:286 +msgid "invalid escape sequence in character class" +msgstr "niapravilnaja paśladoÅ­naść escape Å­ znakavaj klasie" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "dyjapazon nie Å­ paradku Å­ klasie znakaÅ­" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "niama čaho paÅ­tarać" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "nieviadomy znak paśla (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "nieviadomy znak paśla (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "nieviadomy znak paśla (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "Nazvanyja klasy POSIX padtrymlivajucca tolki Å­ klasach" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "nie staje kancavoha )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ci (?[+-]ličby musić zakančvacca na )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "spasyłka na niaisny padÅ¡ablon" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "nie staje ) paśla kamentara" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "rehularny vyraz zavialiki" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "niemahčyma atrymać pamiaci" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "assertacyja lookbehind niastałaj daŭžyni" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "nierečaisny lik ci nazva paśla (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "umoÅ­naja hrupa maje bolej za dźvie haliny" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "čakaÅ­sia assert paśla (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "nieviadomaja nazva klasy POSIX" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "elementy paradkavańnia POSIX nie padtrymlivajucca" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "znakavaja vartaść u paśladoÅ­naści \\x{...} zavialikaja" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "niapravilnaja Å­mova (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nie dazvoleny Å­ assertacyi lookbehind" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "rekursiÅ­ny vyklik moža zacyklicca niapeÅ­nym čynam" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "nie staje terminatara Å­ naźvie padÅ¡ablonu" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "dva nazvanyja padÅ¡ablony adnolkava nazyvajucca" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "nierečaisnaja paśladoÅ­naść \\P ci \\p" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "nazva nieviadomaj ułaścivaści paśla \\P ci \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nazva padÅ¡ablonu zavialikaja (maksymalna 32 znakaÅ­)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "zaÅ¡mat nazvanych padÅ¡ablonaÅ­ (maksymalna 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "vaśmiarkovaja vartaść bolÅ¡aja za \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "Hrupa DEFINE źmiaščaje bolÅ¡ za adnu halinu" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "paÅ­tor hrupy DEFINE nie dazvoleny" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "niapoÅ­nyja opcyi NEWLINE" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "niečakany paÅ­tor" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "pierapaÅ­nieńnie kodu" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "rabočy abÅ¡ar dla kampilavańnia pierapaÅ­nieńnia" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "raniej pravierany padÅ¡ablon sa spasyłkami nia znojdzieny" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, 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:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblijateka PCRE skampilavanaja biez padtrymki UTF8" + +#: ../glib/gregex.c:1215 +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:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Pamyłka padčas aptymizacyi rehularnaha vyrazu %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "Å¡asnaccatkovaja ličba ci \"}\" čakalisia" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "Å¡asnaccatkovaja ličba čakałasia" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "nie staje \"<\" u symbalnaj spasyłcy" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "niezavierÅ¡anaja symbalnaja spasyłka" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "symbalnaja spasyłka nulavoj daŭžyni" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "čakałasia ličba" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "zabaronienaja symbalnaja spasyłka" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "zabłukaÅ­Å¡y kancavy \"\\\"" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "nieviadomaja cytavanaja paśladoÅ­naść" + +#: ../glib/gregex.c:2360 +#, 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:91 +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:181 +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:559 +#, 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:566 +#, 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:578 +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:282 +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:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, 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:369 ../glib/gspawn.c:1383 +#, 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:375 ../glib/gspawn-win32.c:494 +#, 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:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Niapravilnaja nazva prahramy: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Niapravilny radok u asiarodździ: %s" + +# glib/gdir.c:79 +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Niapravilny rabočy kataloh: %s" + +# glib/gspawn-win32.c:940 +#: ../glib/gspawn-win32.c:783 +#, 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:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Niečakanaja pamyłka Å­ waitpid() (%s)" + +# glib/gspawn.c:979 +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Niemahčyma stvaryć praces (%s)" + +# glib/gspawn.c:1129 +#: ../glib/gspawn.c:1393 +#, 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:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Niemahčyma stvaryć praces-naščadka (%s)" + +# glib/gspawn.c:1156 +#: ../glib/gspawn.c:1420 +#, 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:1444 +#, 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:1086 +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:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Niapravilny paradak na Å­vachodzie kanversii" + +# glib/gutf8.c:1341 glib/gutf8.c:1437 +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Znak pa-za dyjapazonam UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Vykarystańnie:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPCYJA...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Opcyi dapamohi:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Pakažy opcyi dapamohi" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Pakažy Å­sie opcyi dapamohi" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opcyi aplikacyi:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Niemahčyma pierapracavać ličbavaj vartaści '%s' dla %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nielha pierapracavać padvojnuju ličbavuju vartaść '%s' dla %s" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Pamyłka padčas pierapracoÅ­ki %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Adsutny parametar dla %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Nieviadomaja opcyja %s" + +#: ../glib/gkeyfile.c:366 +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:401 +msgid "Not a regular file" +msgstr "Heta nie zvyčajny fajł" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Fajł pusty" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Niapravilnaja nazva hrupy: %s" + +#: ../glib/gkeyfile.c:850 +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:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Niapravilnaja nazva kluča: %s" + +#: ../glib/gkeyfile.c:903 +#, 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:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Fajł kluča nie Å­klučaje Å­ siabie hrupy '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Fajł kluča nie Å­klučaje Å­ siabie kluča '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, 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:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nielha interpretavać '%s' jak ličbavuju vartaść." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Ličbavaja vartaść '%s' pa-za dapuščalnymi miežami" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Funkcyi %s pieradadzieny nadta vialiki ličylnik" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Płyń užo začynienaja" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Aperacyja anulavanaja" + +#: ../gio/gcharsetconverter.c:263 +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:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Niapravilnaja paśladoÅ­naść bajtaÅ­ na Å­vachodzie kanversii" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Zaŭčasny kaniec płyni" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Pamyłka abcinańnia fajłu: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Nieviadomy typ" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +# glib/gdir.c:79 +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Pamyłka pry adčynieńni katalohu '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +# glib/gdir.c:79 +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Pamyłka pry adčynieńni katalohu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +# glib/gfileutils.c:348 +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Ličylnik začynieny" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Płyń užo začynienaja" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Śmietnica nie padtrymlivajacca" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +# glib/gmarkup.c:303 +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Pamyłka Å­ radku %d: %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Pamyłka padčas pierapracoÅ­ki %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +# glib/gmarkup.c:428 +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Znak '%s' niedapuščalny Å­nutry nazvy adzinki" + +# glib/gmarkup.c:428 +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Znak '%s' niedapuščalny Å­nutry nazvy adzinki" + +# glib/gmarkup.c:428 +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Znak '%s' niedapuščalny Å­nutry nazvy adzinki" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Pamyłka padčas pierapracoÅ­ki %s" + +# glib/gconvert.c:597 glib/gconvert.c:813 glib/giochannel.c:1289 +# glib/giochannel.c:2175 +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Pamyłka padčas kanversii: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +# glib/gdir.c:79 +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Pamyłka pry adčynieńni katalohu '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "sapsavany abjekt" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Nienazvany" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Fajł stała nie akreślivaje pola Exec" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Niemahčyma znajści terminału, vymahanaha dla aplikacyi" + +#: ../gio/gdesktopappinfo.c:1515 +#, 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:1519 +#, 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:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Niemahčyma stvaryć fajł stała %s dla karystalnika" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Asablivaje aznačeńnie dla %s" + +#: ../gio/gdrive.c:363 +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:728 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#: ../gio/gdrive.c:831 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "pryłada nie zaimplementavała vysoÅ­vańnia (eject)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Źmiaščalnaje mantavańnie nie isnuje" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Niemahčyma skapijavać zamiest katalohu" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Niemahčyma skapijavać kataloh zamiest inÅ¡aha katalohu" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Metavy fajł isnuje" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Niemahčyma rekursiÅ­na skapijavać kataloh" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbalnyja spasyłki nie padtrymlivajucca" + +# glib/gfileutils.c:348 +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: ../gio/gfile.c:2909 +#, fuzzy +msgid "Can't copy special file" +msgstr "Niemahčyma skapijavać zamiest katalohu" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Padadzienaja niapravilnaja vartaść symbalnaj spasyłki" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Śmietnica nie padtrymlivajacca" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nazvy fajłaÅ­ nia mohuć utrymlivać \"%c\"" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "masiÅ­ nie zaimplementavaÅ­ mantavańnia (mount)" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Nivodnaja aplikacyja nie zarehistravanaja dla pracy z hetym fajłam" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Ličylnik začynieny" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "U fajłavaha ličylnika jość važkaja aperacyja" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Fajłavy ličylnik užo začynieny" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Płyń nie padtrymlivaje query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Dla płyni nie padtrymlivajecca zruch" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Dla Å­vachodnaj płyni nie dazvolenaje abcinańnie" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Dla płyni nie padtrymlivajecca abcinańnie" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Dla płyni jość važkaja aperacyja" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Śmietnica nie padtrymlivajacca" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia tekstavy radok)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +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:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Niapravilnaja nazva fajłu %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Pamyłka atrymańnia źviestak ab fajłavaj systemie: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Niemahčyma źmianić nazvu dla karaniovaha katalohu" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Pamyłka adčytańnia fajłu: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Niemahčyma źmianić nazvu dla fajłu, taki fajł užo isnuje" + +# glib/gconvert.c:1729 +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Niapravilnaja nazva fajłu" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Niemahčyma adčynić kataloh" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Pamyłka vykidańnia Å­ śmietnicu fajłu: %s" + +# glib/gfileutils.c:745 +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Niemahčyma stvaryć kataloh śmietnicy %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Niemahčyma znajści najvyÅ¡ejÅ¡y kataloh dziela śmiećcia" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +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:1985 +#, 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:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Niemahčyma vykinuć u śmietnicu fajł: %s" + +# glib/gdir.c:79 +#: ../gio/glocalfile.c:2133 +#, 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:2162 +#, 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:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Pamyłka stvareńnia symbalnaj spasyłki: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Pamyłka pieranosu fajłu: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Niemahčyma pieranieści kataloh zamiest inÅ¡aha katalohu" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "NiaÅ­dałaje stvareńnie zapasnoha fajłu" + +# glib/gfileutils.c:348 +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Pamyłka vydaleńnia metavaha fajłu: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Pieranos pamiž punktami mantavańnia nie padtrymlivajecca" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Vartaść atrybutu musić być nia-NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia tekstavy radok)" + +# glib/gmarkup.c:1615 +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Niapravilnaja nazva paÅ¡yranaha atrybutu" + +# glib/gdir.c:79 +#: ../gio/glocalfileinfo.c:773 +#, 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:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Pamyłka atrymańnia stat() dla fajłu '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (niapravilnaje kadavańnie)" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Pamyłka atrymańnia stat() dla fajłavaha deskryptara: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Niapravilny typ atrybutu (čakaÅ­sia uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +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:1904 +#, 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:1920 +#, 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:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Pamyłka akreśleńnia ŭładalnika: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "symbalnaja spasyłka musić być nia-NULL" + +# glib/gmarkup.c:303 +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Pamyłka akreśleńnia symbalnaj spasyłki: %s" + +#: ../gio/glocalfileinfo.c:2013 +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:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Pamyłka akreśleńnia pravoÅ­: %s" + +#: ../gio/glocalfileinfo.c:2162 +#, 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:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Pamyłka akreśleńnia ŭładalnika: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Akreśleńnie atrybutu %s nie padtrymlivajecca" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, 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:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Pamyłka zruchu Å­ fajle: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, 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:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Pamyłka stvareńnia zapasnoj kopii: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Pamyłka źmieny nazy časovaha fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Pamyłka abcinańnia fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Pamyłka adčynieńnia fajłu '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Metavy fajł źjaÅ­lajecca kataloham" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Metavy fajł nia prosty" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Fajł byÅ­ źmienieny zvonku" + +# glib/gfileutils.c:348 +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Akreśleny niapravilny GSeekType" + +# glib/gconvert.c:1729 +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Niapravilnaja zapyt pieraskoku Å­ fajle" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Niemahčyma padrezać GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Nielha źmianiać pamier płyni vyjścia Å­ pamiaci" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Nie Å­dałosia źmianić pamier płyni vyjścia Å­ pamiaci" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +#, 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:874 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mantavańnie nie zaimplementavała admantavańnia (unmount)" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "Vyjściovaja płyń nie zaimplementavała zapisu (write)" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Kryničnaja płyń užo začynienaja" + +# glib/gfileutils.c:348 +#: ../gio/gresolver.c:779 +#, 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:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Pamyłka adčytańnia fajłu '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Nieviadomaja opcyja %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +#, fuzzy +msgid "Socket is already closed" +msgstr "Kryničnaja płyń užo začynienaja" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:464 +#, 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:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Niemahčyma stvaryć kataloh śmietnicy %s: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:1446 +#, 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:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Pamyłka padčas kanversii: %s" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Pamyłka abcinańnia fajłu: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +# glib/gfileutils.c:745 +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, 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:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +# glib/gfileutils.c:745 +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Niemahčyma stvaryć kataloh śmietnicy %s: %s" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: ../gio/gsocket.c:3081 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "źmieny asacyjacyjaÅ­ nie padtrymlivajucca dla win32" + +# glib/gfileutils.c:348 +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Pamyłka vydaleńnia fajłu: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "nieviadomaja pamyłka" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Symbalnyja spasyłki nie padtrymlivajucca" + +#: ../gio/gsocketlistener.c:191 +#, fuzzy +msgid "Listener is already closed" +msgstr "Płyń užo začynienaja" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Zaŭčasny kaniec płyni" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Pamyłka adčynieńnia fajłu: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Pamyłka adčytańnia fajłu: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +# glib/gfileutils.c:348 +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Pamyłka adčytańnia z unix: %s" + +# glib/gmarkup.c:303 +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Pamyłka začynieńnia unix: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +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:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Pamyłka zapisu Å­ unix: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "masiÅ­ nie zaimplementavaÅ­ vysoÅ­vańnia (eject)" + +#: ../gio/gwin32appinfo.c:276 +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:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Pamyłka Å­klučeńnia aplikacyi: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "Adrasy URI nie padtrymlivajucca" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "źmieny asacyjacyjaÅ­ nie padtrymlivajucca dla win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Stvareńnie asacyjacyjaÅ­ nie padtrymlivajecca dla win32" + +# glib/gfileutils.c:348 +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Pamyłka adčytańnia z fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Pamyłka začynieńnia fajłu: %s" + +# glib/gfileutils.c:348 +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Pamyłka zapisu Å­ fajł: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "nie chapiła pamiaci" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "unutranaja pamyłka" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +# glib/gconvert.c:1729 +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Niapravilnaja nazva kamputara" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Niemahčyma pieranieści kataloh zamiest inÅ¡aha katalohu" + +# 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: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.po b/po/bg.po new file mode 100644 index 0000000..a6accb1 --- /dev/null +++ b/po/bg.po @@ -0,0 +1,4399 @@ +# Bulgarian translation of glib po-file. +# Copyright (C) 2002, 2005, 2006, 2007, 2009 Free Software Foundation, Inc. +# Copyright (C) 2010, 2011, 2012, 2013 Free Software Foundation, Inc. +# Borislav Aleksandrov , 2002. +# Alexander Shopov , 2002, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Damyan Ivanov , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-12 20:18+0200\n" +"PO-Revision-Date: 2013-01-12 20:16+0200\n" +"Last-Translator: Alexander Shopov \n" +"Language-Team: Bulgarian \n" +"Language: bg\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:184 ../gio/ginputstream.c:375 +#: ../gio/ginputstream.c:612 ../gio/ginputstream.c:830 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Подадена е прекалено голяма стойност на %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Търсенето не се поддържа от основния поток" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream не може да се съкрати" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1020 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Потокът вече е затворен" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Основният поток не може да се съкращава" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Действието е прекратено" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Неправилен обект, не е инициализирано" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Непълна байтова последователност на входа" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Няма достатъчно място в целта" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Грешна байтова последователност на входа за преобразуване" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка по време на преобразуване: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "Не се поддържа отменима инициализация" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Преобразуването от набора знаци „%s“ към „%s“ не се поддържа" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не може да се отвори конвертор от „%s“ към „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "Вид на %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Непознат вид" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "Вид на файла %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "Операционната система няма реализация на GCredentials" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Платформата не поддържа GCredentials" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "" +"Реализацията на GCredentials върху тази операционна система не съдържа " +"идентификатор на процес" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочаквано ранен край на поток" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Неподдържан ключ „%s“ в адрес „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Адресът „%s“ е грешен (трябва да съдържа само едно от следните: път, " +"временна директория или абстрактни ключове)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Безсмислена комбинация от ключ и стойност в адреса „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Грешка в адреса „%s“ — портът е неправилен" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Грешка в адреса „%s“ — атрибутът „family“ е неправилен" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Елементът на адреса „%s“ не съдържа двоеточие („:“)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Двойката ключ/стойност %d, „%s“ в адресния елемент „%s“ не съдържа знак за " +"равенство („=“)" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Грешка при декодиране на ключа или стойността в двойката %d, „%s“ в адресния " +"елемент „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Грешка в адреса „%s“ — транспортът „unix“ изисква точно един от ключовете " +"„path“ или „abstract“" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Грешка в адреса „%s“ — името на хост липсва или е грешен" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Грешка в адреса „%s“ — портът липсва или е грешен" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Грешка в адреса „%s“ — атрибутът „noncefile“ липсва или е грешен" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Грешка при автоматично стартиране: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Непознат или неподдържан транспорт „%s“ за адрес „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Грешка при отваряне на моментен файл „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Грешка при четене на моментен файл „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Грешка при четене на моментен файл „%s“, очакват се 16 байта, а са получени " +"%d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Грешка при запис на съдържанието на моментен файл „%s“ в поток:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Даденият адрес е празен" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" +"Създаването на шина за обмен на съобщения не е възможно при изрично зададен " +"идентификатор на потребител (setuid)" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Създаването на шина за обмен на съобщения не е възможно без идентификатор на " +"машина: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Грешка при изпълняване на външна команда „%s“: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Въведете произволен знак, за да затворите този прозорец)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"Шината на сесията dbus не е стартирана. Автоматичното ѝ стартиране бе също " +"неуспешно" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Адресът на шината на сесията не може да се определи (липсва реализация за " +"тази операционна система)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Адресът на шината не може да се определи от променливата на обкръжението " +"DBUS_STARTER_BUS_TYPE — непозната стойност „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Адресът на шината не може да се определи, защото променливата " +"DBUS_STARTER_BUS_TYPE липсва в обкръжението" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Непознат вид шина %d" + +#: ../gio/gdbusauth.c:297 +msgid "Unexpected lack of content trying to read a line" +msgstr "Неочаквана липса на съдържание при опит за четене на ред" + +#: ../gio/gdbusauth.c:341 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Неочаквана липса на съдържание при опит за (безопасно) четене на ред" + +#: ../gio/gdbusauth.c:512 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Изчерпване на наличните механизми за идентификация (пробвани: %s) (налични: " +"%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Прекъсване чрез GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Грешка при получаване на информация за папка „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Правата за достъп до папката „%s“ са повредени. Очакван режим 0700, получен " +"0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Грешка при създаване на папка „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Грешка при отваряне на ключодържателя „%s“ за четене: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Ред %d на ключодържателя „%s“, съдържащ „%s“, е повреден" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Първата лексема на ред %d на ключодържателя „%s“, съдържащ „%s“, е повреден" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Втората лексема на ред %d на ключодържателя „%s“, съдържащ „%s“, е повреден" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Не е намерена бисквитка с идентификатор %d в ключодържателя в „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Грешка при изтриване на остарелия файл за синхронизация „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Грешка при създаване на файла за синхронизация „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Грешка при затваряне на изтрития файл за синхронизация „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Грешка при изтриване на файла за синхронизация „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Грешка при отваряне на ключодържателя „%s“ за запис: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Допълнително, отключването на „%s“ бе също неуспешно: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Връзката е прекъсната" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Времето за изчакване е просрочено" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Неподдържани флагове при създаване на изходяща връзка" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "Обектът в %s няма интерфейс „org.freedesktop.DBus.Properties“" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Грешка при промяна на свойството „%s“: Очакван е вид „%s“, а е получен „%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Липсва свойство „%s“" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Свойството „%s“ не поддържа четене" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Свойството „%s“ не поддържа запис" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Липсва интерфейс „%s“" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Липсва такъв интерфейс" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Липсва интерфейс „%s“ към обекта в %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Липсва метод „%s“" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Видът на съобщението („%s“) не съвпада с очаквания („%s“)" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Вече е наличен обект за интерфейса %s в %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Методът „%s“ върна тип „%s“, а се очаква „%s“" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Не съществува метод „%s“ на интерфейса „%s“ със сигнатура „%s“" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Вече има поддърво за %s" + +#: ../gio/gdbusmessage.c:1270 +msgid "type is INVALID" +msgstr "видът е INVALID" + +#: ../gio/gdbusmessage.c:1281 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"Съобщение METHOD_CALL: в заглавната част липсват полета PATH или MEMBER" + +#: ../gio/gdbusmessage.c:1292 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Съобщение METHOD_RETURN: в заглавната част липсва поле REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1304 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Съобщение ERROR: в заглавната част липсват полета REPLY_SERIAL или ERROR_NAME" + +#: ../gio/gdbusmessage.c:1317 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Съобщение SIGNAL: в заглавната част липсват полета PATH, INTERFACE или MEMBER" + +#: ../gio/gdbusmessage.c:1325 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Съобщение SIGNAL: Полето PATH в заглавната част използва запазената " +"стойност /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1333 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Съобщение SIGNAL: Полето INTERFACE в заглавната част използва запазената " +"стойност org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1382 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "При опит за четене на %lu байт бяха получени %lu" +msgstr[1] "При опит за четене на %lu байта бяха получени %lu" + +#: ../gio/gdbusmessage.c:1397 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "След низа „%s“ се очаква байт NUL, а не %d" + +#: ../gio/gdbusmessage.c:1416 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Очаква се низ, кодиран в UTF-8, а са получени неправилни байтове при " +"отместване %d (дължината на низа е %d). Декодираният от UTF-8 низ до тази " +"позиция е „%s“" + +#: ../gio/gdbusmessage.c:1618 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Запазената стойност „%s“ не е допустим път до обект в D-Bus" + +#: ../gio/gdbusmessage.c:1642 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Прочетената стойност „%s“ не е допустима сигнатура в D-Bus" + +#: ../gio/gdbusmessage.c:1697 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Срещнат е масив с дължина %u байт. Максималната дължина е 2²⁶ (64МБ)" +msgstr[1] "" +"Срещнат е масив с дължина %u байта. Максималната дължина е 2²⁶ (64МБ)" + +#: ../gio/gdbusmessage.c:1850 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Прочетената вариантна стойност „%s“ не е допустима сигнатура в D-Bus" + +#: ../gio/gdbusmessage.c:1874 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Грешка при разчитане на GVariant от вид „%s“ от машинния формат на D-Bus" + +#: ../gio/gdbusmessage.c:2061 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Недопустима стойност на индикатора за подреждане на байтовете в думи. Очаква " +"се или 0x6c („l“), или 0x42 („B“), а е открита стойност 0x%02x" + +#: ../gio/gdbusmessage.c:2074 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Недопустима главна версия на протокола. Очаква се 1, а е открита %d" + +#: ../gio/gdbusmessage.c:2130 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Открита е сигнатурна заглавна част със сигнатура „%s“, обаче тялото на " +"съобщението е празно" + +#: ../gio/gdbusmessage.c:2144 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Разчетената стойност „%s“ не е допустима сигнатура в D-Bus (за тяло)" + +#: ../gio/gdbusmessage.c:2174 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "В заглавната част на съобщението няма сигнатура, а тялото е %u байт" +msgstr[1] "" +"В заглавната част на съобщението няма сигнатура, а тялото е %u байта" + +#: ../gio/gdbusmessage.c:2184 +msgid "Cannot deserialize message: " +msgstr "Неуспешно декодиране на съобщение: " + +#: ../gio/gdbusmessage.c:2505 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Грешка при кодиране на GVariant от вид „%s“ в машинния формат на D-Bus" + +#: ../gio/gdbusmessage.c:2642 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Съобщението има %d файлови дескриптора, а в заглавната част са обявени %d" + +#: ../gio/gdbusmessage.c:2650 +msgid "Cannot serialize message: " +msgstr "Неуспешно кодиране на съобщението:" + +#: ../gio/gdbusmessage.c:2694 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Тялото на съобщението има сигнатура „%s“, но няма заглавна част със сигнатури" + +#: ../gio/gdbusmessage.c:2704 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Тялото на съобщението има сигнатура за тип „%s“, но полето в заглавната част " +"за сигнатури е „%s“" + +#: ../gio/gdbusmessage.c:2720 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Тялото на съобщението е празно, а сигнатурата в полето на заглавната част е " +"„(%s)“" + +#: ../gio/gdbusmessage.c:3270 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Връщане на грешка с тяло от вид „%s“" + +#: ../gio/gdbusmessage.c:3278 +msgid "Error return with empty body" +msgstr "Връщане на грешка с празно тяло на съобщението" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Неуспешно определяне на хардуерния профил: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Неуспешно зареждане на /var/lib/dbus/machine-id или /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Грешка при извикване на StartServiceByName за %s:" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Неочакван отговор „%d“ от метода StartServicebyName(„%s“)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Не може да се направи обръщение към метода. Посредникът е за предварително " +"дефинирано име без собственик, а е създаден с флага " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Не се поддържа абстрактно пространство за имена" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Не може да се задава моментен файл при създаване на сървър" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Грешка при запис в моментен файл „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Низът „%s“ не е допустим глобален идентификатор в D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Невъзможно е да се чака за връзки по неподдържан транспорт „%s“" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Команди:\n" +" help Показва този текст\n" +" introspect Анализ на отдалечен обект\n" +" monitor Наблюдение на отдалечен обект\n" +" call Обръщане към метод на отдалечен обект\n" +" emit Издаване на сигнал\n" +"\n" +"Използвайте „%s КОМАНДА --help“ за допълнителна информация за всяка " +"команда.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Грешка: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Грешка при разчитане на XML с аналитична информация: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Свързване към системната шина" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Свързване към шината на сесията" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Свързване към даден адрес на D-Bus" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Варианти за връзка:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Опции, указващи точката за връзка" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Не е указана точка за връзка" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Указани са множество точки за връзка" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Предупреждение: Според анализа интерфейсът „%s“ не съществува\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Предупреждение: Според анализа методът „%s“ не се предлага от интерфейса " +"„%s“\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Незадължителен получател на сигнала (уникално име)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Път до обекта, към който да се излъчи сигнал" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Име на сигнал и интерфейс" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Издаване на сигнал." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Грешка при свързване: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Грешка: не е указан път до обект\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Грешка: „%s“ не е допустим път до обект\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Грешка: не е указан сигнал\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Грешка: сигналът трябва да е указан с квалифицирано име\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Грешка: „%s“ не е вярно име на интерфейс\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Грешка: „%s“ не е вярно име на член\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Грешка: „%s“ не е вярно, уникално име на шина\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Грешка при анализ на параметър %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Грешка при завършване на предаването на данните на връзка: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Целево име, към чийто метод да се направи обръщение" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Път до обект, към чийто метод да се направи обръщение" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Име на метод и интерфейс" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Време за изчакване в секунди" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Обръщение към метод на отдалечен обект" + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Грешка: не е указана цел\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Грешка: Не е указан път до обект\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Грешка: Не е указано име на метод\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Грешка: „%s“ не е допустимо име на метод\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Грешка при анализ на параметър %d от вид „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Име на целта за анализ" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Път до обекта за анализ" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Извеждане на XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Анализ на наследниците" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Извеждане само на свойствата" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Анализ на отдалечен обект." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Име на целта за наблюдение" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Път до обекта за наблюдение" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Наблюдение на отдалечен обект." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Без име" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Във файла .desktop липсва поле за изпълнение" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Не може да се открие терминал за приложението" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не може да се създаде папката с потребителските настройки %s: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не може да се създаде папката с настройките за MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "В информацията за програма липсва идентификатор" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не може да се създаде файл .desktop — „%s“" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Потребителска дефиниция за %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "устройството не поддържа нито изваждане, нито изваждане с действие" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "устройството не поддържа следене за носител" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "устройството не поддържа стартиране" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "устройството не поддържа спиране" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Липсва поддръжка на TLS" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Версия %d на кодирането GEmblem не се поддържа" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неправилен брой лексеми (%d) в кодирането GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Версия %d на кодирането GEmblemedIcon не се поддържа" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Неправилен брой лексеми (%d) в кодирането GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очакваше се GEmblem за GEmblemedIcon" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7114 ../gio/gfile.c:7204 ../gio/gfile.c:7288 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Съдържащият монтиран обект не съществува" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Не може да се копира върху папка" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "Папка не може да се копира върху папка" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Целевият файл съществува" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "Папката не може да се копира рекурсивно" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "Не се поддържа разделяне" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "Грешка при разделяне на файл: %s" + +#: ../gio/gfile.c:2952 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "" +"Копирането между различни монтирани дялове чрез reflink/clone не се поддържа" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "" +"Копирането чрез reflink/clone не се поддържа или е извършено неправилно" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Копирането чрез reflink/clone не се поддържа или не проработи" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "Не може да се копира специален файл" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "Зададена е неправилна стойност на символна връзка" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "Не се поддържа кошче" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Файловите имена не могат да съдържат „%c“" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "томът не поддържа монтиране" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "Не е регистрирано приложение за обработка на този вид файлове" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Броячът е затворен" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Файловият брояч все още е е привършил" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Потокът не поддържа запитване за информация (query_info)" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Търсенето не се поддържа от потока" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Входният поток не може да се съкращава" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Потокът не може да се съкращава" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неправилен брой лексеми (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Липсва тип за името на клас %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Типът „%s“ не поддържа интерфейса GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Типът „%s“ не е класов" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Неправилен номер на версия: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Типът „%s“ не поддържа from_tokens() от интерфейса GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Подадената версия на кодирането на икони не се поддържа" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Не е указан адрес" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Дължината на адреса %u е прекалено голяма" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "В адреса са зададени битове след префикса му" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "„%s“ не е на маска за адреси на IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Няма достатъчно място за адреса на гнездо" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Неподдържан адрес на гнездо" + +#: ../gio/ginputstream.c:193 +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:1030 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Действията върху потока не са привършили" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Елементът <%s> не е позволен в <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Елементът <%s> не е позволен на най-горно ниво" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Файлът „%s“ присъства многократно в ресурса" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "„%s“ липсва във всички папки за ресурси" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "„%s“ липсва в текущата папка" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Непозната опция за обработка „%s“" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Неуспешно създаване на временен файл: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Грешка при обработка на входящия файл с xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Грешка при обработка на входящия файл с to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Грешка при четене на файл „%s“: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Грешка при компресиране на файл: %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "в <%s> не е позволен текст" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "име на изходният файл" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "ФАЙЛ" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Папката откъдето да се четат файловете (стандартно е текущата)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "ПАПКА" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Формат на изхода според разширението на изходния файл" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Заглавни части" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Генериране на изходния код за свързване на ресурса в кода" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Списък със зависимостите" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Без автоматично генериране и регистриране на ресурси" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Не изнасяйте функции. Декларирайте ги G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Идентификатор на C за генерирания изходен код" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Компилиране на файловете с указания за ресурси в ресурсен файл.\n" +"Файловете за указване на ресурси трябва да завършват на „.gresource.xml“,\n" +"а ресурсният файл на „.gresource“." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Изисква се точно едно име на файл\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "не се позволяват празни имена" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "неправилно име „%s“: имената трябва да започват с малка буква" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"неправилно име „%s“: неправилен знак „%c“; позволени са само малки букви, " +"цифри и тире („-“)." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "неправилно име „%s“: не са позволени две последователни тирета („--“)." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "неправилно име „%s“: последният знак не може да е тире („-“)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "неправилно име „%s“: максималната дължина е 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " вече е указано" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "към схема „list-of“ не могат да се добавят ключове" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " вече е указано" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" покрива в ; използвайте " +", за да промените стойността" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"като атрибут на трябва да присъства точно едно от „type“, „enum“ или " +"„flags“" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> не е дефинирано (все още)." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "неправилен низ за вид на GVariant: „%s“" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "използвано е , но схемата не разширява нищо" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "липсва за предефиниране" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr "вече е указано " + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr "вече е указано " + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " добавя към схема „%s“, която още не съществува" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " е списък на схема „%s“, която още не съществува" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Не може да е списък от схема с път" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Схема не може да се разширява с път" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" е списък, разширяващ , която не е списък" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" разширява , но " +"„%s“ не разширява „%s“" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "всеки път трябва да започва и да завършва с наклонена черта („/“)" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "пътят на списък трябва да завършва с „:/“" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "вече е указано <%s id='%s'>" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Елементът <%s> не е позволен на най-горно ниво" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "Указано е „--strict“, излизане.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Целият файл е пренебрегнат.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Пренебрегване на файла.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Липсва ключ „%s“ в схемата „%s“, указан във файла за предефиниране „%s“" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; пренебрегване на предефинирането на ключа.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "и е указано „--strict“, излизане.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"грешка при анализиране на ключа „%s“ от схемата „%s“, указан във файла за " +"предефиниране „%s“ — %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Пренебрегване на предефинирането на ключа.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"предефинирането на ключа „%s“ в схемата „%s“ във файла за предефиниране „%s“ " +"е извън обсега, даден в схемата" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"предефинирането на ключа „%s“ в схемата „%s“ във файла за предефиниране „%s“ " +"не е в списъка с позволени стойности" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "място за съхраняване на файла gschemas.compiled" + +# Явно става дума за обясняване на --strict +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Прекъсване на работа при всякакви грешки в схемите" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Без запис на файл gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Без налагане на ограниченията за имена на ключове" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Компилиране на всички файлове със схеми за GSettings в кеш.\n" +"Файловете със схемите трябва да завършват на .gschema.xml,\n" +"а файлът с кеша се нарича gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Изисква се точно едно име на папка\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Не са открити файлове със схеми: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "без обработка.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "съществуващият резултатен файл е премахнат.\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Стандартната функционалност за наблюдение на локални папки не може да бъде " +"открита" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Неправилно име на файл: %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при получаване на информация за файловата система: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Кореновата папка не може да се преименува" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка при преименуване на файл: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Файлът не може да се преименува — съществува друг файл с такова име" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Неправилно име на файл" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Папката не може да бъде отворена" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка при отваряне на файл: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка при изтриване на файл: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при преместване на файл в кошчето: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Неуспешно създаване на папката за кошче „%s“: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Не може да се открие най-горната папка за кошче" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Не може да се създаде папката за кошче" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Неуспешно създаване на файл с информация за кошчето: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Неуспешно преместване на файл в кошчето: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "вътрешна грешка" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при създаване на папка: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файловата система не поддържа символни връзки" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка при създаване на символна връзка: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка при преместване на файл: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Папка не може да бъде преместена върху папка" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Неуспешно създаване на резервен файл" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка при премахване на целевия файл: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Не се поддържа местене между монтирани местоположения" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Стойността на атрибут не трябва да е NULL" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Неправилен вид на атрибут (очакваше се низ)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Неправилно име на допълнителен атрибут" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка при задаване на допълнителен атрибут „%s“: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (неправилно кодиране)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Грешка при получаване на информация за файла „%s“: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Грешка при получаване на информация за файловия дескриптор: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неправилен вид на атрибут (очакваше се uint32)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неправилен вид на атрибут (очакваше се uint64)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неправилен вид на атрибут (очакваше се низ от байтове)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "Грешка при задаване на правата за достъп на символната връзка" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка при задаване на правата за достъп: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при задаване на собственик: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "символната връзка трябва да не е NULL" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка при задаване на символна връзка: %s" + +#: ../gio/glocalfileinfo.c:2230 +msgid "Error setting symlink: file is not a symlink" +msgstr "Грешка при задаване на символна връзка: файлът не е такава" + +#: ../gio/glocalfileinfo.c:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при задаване на времето на промяна или достъп: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "Контекстът на SELinux трябва да не е NULL" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при задаване на контекста на SELinux: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "SELinux не е включен на тази система" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Не се поддържа задаването на атрибута %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при четене от файл: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при търсене във файл: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка при затваряне на файл: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" +"Стандартната функционалност за наблюдение на локални файлове не може да бъде " +"открита" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка при запис във файл: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка при премахване на стара, резервна връзка: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при създаване на резервно копие: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка при преименуване на временен файл: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при съкращаване на файл: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при отваряне на файла „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Целевият файл е папка" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Целевият файл не е обикновен файл" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Файлът бе променен от външно приложение" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при изтриване на стар файл: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Зададен е неправилен GSeekType" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Неправилна заявка за търсене" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream не може да се съкрати" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Изходящият поток в паметта не може да бъде преоразмерен" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Неуспешно преоразмеряване на изходящия поток в паметта" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Количеството памет, необходимо за обработката на записа, е по-голямо от " +"наличното адресно пространство." + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Заявеното търсене е преди началото на потока" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "монтираният обект не поддържа демонтиране" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "монтираният обект не поддържа синхронно откриване на вида" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Името на хоста „%s“ съдържа „[“, но липсва „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Мрежата е недостъпна" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Хостът е недостъпен" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Състоянието на мрежата не може да бъде наблюдавано: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Състоянието на мрежата не може да бъде наблюдавано: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Състоянието на мрежата не може да бъде получено: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Изходният поток не поддържа запис" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Изходният поток вече е затворен" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Ресурсът „%s“ липсва" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Ресурсът „%s“ не може да се декомпресира" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Ресурсът „%s“ не е папка" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Входният поток не поддържа търсене" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Извеждане на помощта" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[КОМАНДА]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Изброяване на разделите с ресурси във ФАЙЛа във формат elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Изброяване на ресурсите\n" +"Ако е даден РАЗДЕЛ, се изброяват само ресурсите в него\n" +"Ако е даден ПЪТ, се изброяват само съвпадащите ресурси" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "ФАЙЛ [ПЪТ]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "РАЗДЕЛ" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Подробно изброяване на ресурсите\n" +"Ако е даден РАЗДЕЛ, се изброяват само ресурсите в него\n" +"Ако е даден ПЪТ, се изброяват само съвпадащите ресурси\n" +"Подробностите включват раздел, размер и компресия" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Разархивиране на ресурс към стандартния изход" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "ПЪТ ДО ФАЙЛ" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Непозната команда „%s“\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Употреба:\n" +" gresource [--section РАЗДЕЛ] КОМАНДА [АРГУМЕНТИ…]\n" +"\n" +"Команда:\n" +" help Тази информация\n" +" sections Списък с разделите ресурси\n" +" list Списък с ресурсите\n" +" details Подробен списък с ресурси\n" +" extract Разархивиране на ресурс\n" +"\n" +"За подробна информация стартирайте „gresource help КОМАНДА“\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Употреба:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Аргументи:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " РАЗДЕЛ (Незадължително) име на раздел в elf\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " КОМАНДА Помощ за командата или обща помощ, ако не е указано име\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " ФАЙЛ Файл във формат elf (изпълним или споделена библиотека)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ФАЙЛ Файл във формат elf (изпълним или споделена библиотека)\n" +" или компилиран файл с ресурси\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[ПЪТ]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " ПЪТ (Незадължителен) (непълен) път до ресурс\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "ПЪТ" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " ПЪТ Път до ресурс\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Липсва схема „%s“\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Схемата „%s“ не може да се мести (не трябва да указвате път)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Схемата „%s“ може да се мести (трябва да укажете път)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Даден е празен път.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Пътят трябва да започва с наклонена черта („/“)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Пътят трябва да завършва с наклонена черта („/“)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Пътят не трябва да съдържа две последователни наклонени черти („//“)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Липсва ключ „%s“\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Стойността е извън интервала на допустимите стойности\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Извеждане на инсталираните схеми (които не се местят)" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Извеждане на инсталираните схеми, които могат да се местят" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Извеждане на ключовете в СХЕМАта" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "СХЕМА[:ПЪТ]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Извеждане на наследниците на СХЕМАта" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Рекурсивно извеждане на ключовете и стойностите им\n" +"Ако липсва СХЕМА, се извеждат всички ключове\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[СХЕМА[:ПЪТ]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Получаване на стойността на КЛЮЧ" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "СХЕМА[:ПЪТ] КЛЮЧ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Запитване за интервала от допустими стойности за КЛЮЧа" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Задаване на СТОЙНОСТта на КЛЮЧ" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "СХЕМА[:ПЪТ] КЛЮЧ СТОЙНОСТ" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Връща стандартната стойност на КЛЮЧ" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Връщане на стандартната стойност на всички ключове в СХЕМАта" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Проверка дали стойността на КЛЮЧ може да се променя" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Наблюдение на КЛЮЧа за промени.\n" +"Ако не е указан определен КЛЮЧ, се следят всички във СХЕМАта.\n" +"Наблюдението се спира с „^C“.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "СХЕМА[:ПЪТ] [КЛЮЧ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Употреба:\n" +" gsettings [--schemadir ПАПКА_НА_СХЕМА] КОМАНДА [АРГУМЕНТИ…]\n" +"\n" +"Команди:\n" +" help Показване на този текст\n" +" list-schemas Извеждане на инсталираните схеми\n" +" list-relocatable-schemas Извеждане на схемите, които могат да се местят\n" +" list-keys Извеждане на ключовете в схема\n" +" list-children Извеждане на наследниците на схема\n" +" list-recursively Рекурсивно извеждане на ключовете и стойностите " +"им\n" +" range Какъв е интервала от допустими стойности за " +"ключ\n" +" get Получаване на стойността на даден ключ\n" +" set Промяна на стойността на даден ключ\n" +" reset Връщане на стандартната стойност на даден ключ\n" +" reset-recursively Връщане на стойностите на всички ключове в " +"схема\n" +" writable Проверка дали даден ключ може да се променя\n" +" monitor Наблюдение на даден ключ за промени\n" +"\n" +"Използвайте „gsettings help КОМАНДА“ за допълнителна информация.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Уореба:\n" +" gsettings [--schemadir ПАПКА_НА_СХЕМА] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " ПАПКА_НА_СХЕМА Папка, в която да се търсят допълнителни схеми\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +"Аргументи:\n" +" СХЕМА Името на схемата\n" +" ПЪТ Път (за схеми, които могат да се местят)\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " КЛЮЧ Ключ в схемата (незадължителен)\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " КЛЮЧ Ключ в схемата\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " СТОЙНОСТ Стойност, която да бъде зададена\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Подадено е празно име за схема\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Неправилно гнездо, не е инициализирано" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неправилно гнездо, неуспешна инициализация понеже: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Гнездото вече е затворено" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "Просрочено време за отговор при входни-изходна операция с гнездото" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "създаване на GSocket от файлов дескриптор: %s" + +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Неуспешно създаване на гнездо: %s" + +#: ../gio/gsocket.c:515 +msgid "Unknown family was specified" +msgstr "Указан е непознат вид версия на протокол" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "Указан е непознат протокол" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "локалният адрес не може да бъде получен :%s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "отдалеченият адрес не може да бъде получен :%s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "не може да се слуша: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "Грешка при свързване към адрес: %s" + +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Грешка при включване към група за разпръскване: %s" + +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Грешка при напускане на група за разпръскване: %s" + +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "Липсва поддръжка за насочено разпръскване" + +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при приемане на връзка: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "В момента се осъществява връзка" + +#: ../gio/gsocket.c:2330 +msgid "Unable to get pending error: " +msgstr "Неуспешно получаване на текущата грешка: " + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при получаване на данни: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "Грешка при изпращане на данни: %s" + +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Неуспешно изключване на гнездо: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "Грешка при затваряне на гнездо: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Изчакване за състояние на гнездо: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "Грешка при изпращане на съобщение: %s" + +#: ../gio/gsocket.c:3805 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage не се поддържа под Уиндоус" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4274 +#, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при изпращане на съобщение: %s" + +#: ../gio/gsocket.c:4356 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Неуспешно получаване на текущата грешка: %s" + +#: ../gio/gsocket.c:4375 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials не е реализирана на тази операционна система" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Неуспешно свързване към сървъра-посредник %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Неуспешно свързване към „%s“: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Неуспешно свързване: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Непозната грешка при свързване" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Не се поддържа посредничество на връзки извън TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Не се поддържа протоколът за посредничество „%s“." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Функцията за слушане вече е затворена" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Добавеното гнездо е затворено" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 не поддържа адреса IPv6 „%s“" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Потребителското име е твърде дълго за протокола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Името на хоста „%s“ е твърде дълго за протокола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Този сървър не предоставя посредничество чрез SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Връзката през сървъра SOCKSv4 беше отхвърлена" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Този сървър не предоставя посредничество чрез SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Посредникът чрез SOCKSv5 изисква идентификация." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Посредникът чрез SOCKSv5 изисква механизъм за идентификация, който не се " +"поддържа от GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Потребителското име или паролата са твърде дълги за протокола SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Идентифицирането за SOCKSv4 не успя поради грешно потребителско име или " +"парола." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Името на хоста „%s“ е твърде дълго за протокола SOCKSv5." + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Сървърът посредник за SOCKSv5 използва непознат вид адрес." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Вътрешна грешка на сървъра посредник за SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Правилата не позволяват свързването по SOCKSv5." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Хостът не е достижим през сървъра за SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Мрежата не е достижима през сървъра посредник за SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Връзката сървъра посредник за SOCKSv5 е отказана." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Сървърът посредник за SOCKSv5 не поддържа командата „connect“." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Сървърът посредник за SOCKSv5 не поддържа предоставения вид адрес." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Неизвестна грешка със сървъра посредник за SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Версия %d на кодирането GThemedIcon не се поддържа" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при откриване по адрес на „%s“: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при обратно откриване по адрес на „%s“: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Няма запис в DNS от указания вид за „%s“" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Временно е невъзможно „%s“ да бъде открит по адрес" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при откриване по адрес на %s" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Частният ключ, шифриран с PEM, не може да бъде дешифриран" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Липсва частен ключ, шифриран с PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Частният ключ, шифриран с PEM, не може да бъде анализиран" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Липсва сертификат, шифриран с PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Сертификатът, шифриран с PEM, не може да бъде анализиран" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Това е последният ви шанс да въведете правилна парола, преди машината да се " +"заключи." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Няколко пъти сте въвели неправилна парола. Ако отново сгрешите, машината ще " +"се заключи за достъп." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Въведената парола е неправилна." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очакваше се 1 контролно съобщение, а бяха получени %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Неочакван вид на помощните данни" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очакваше се един файлов дескриптор, а бяха получени %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Получен е неправилен файлов дескриптор" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Грешка при изпращане на самоличност: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Грешка при проверка дали SO_PASSCRED е позволено за гнездото: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Грешка при разрешаване на SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Очаква се един байт за получаване на самоличност, но са прочетени 0 байта." + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Не се очакваше контролно съобщение, а бяха получени %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Грешка при забраняване на SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Грешка при четене от файловия дескриптор: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Грешка при затваряне на файловия дескриптор: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Коренова папка на файловата система" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Грешка при запис във файловия дескриптор: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"Тази система не поддържа абстрактни адреси на гнезда за домейни в ЮНИКС" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "томът не поддържа нито изваждане, нито изваждане с действие" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Приложението не може да бъде открито" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка при стартиране на приложение: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Не се поддържат такива адреси" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "не се поддържа промяна на асоциациите при win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Не се поддържа създаването на асоциации при win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Грешка при четене от манипулатор: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Грешка при затваряне на манипулатор: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Грешка при запис в манипулатор: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "недостатъчно памет" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Вътрешна грешка: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Необходими са още данни от входа" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Неправилни, компресирани данни" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Адрес, на който да се слуша" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Стойността няма значение, просто осигурява съвместимост с GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Извеждане на адреса" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Извеждане на адреса в режим за обвивката" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Стартиране на сесийна шина dbus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Неправилни аргументи\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочакван атрибут „%s“ на елемента „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибутът „%s“ на елемента „%s“ не е открит" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочакван етикет „%s“, очакваше се „%s“" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочакван етикет „%s“ вътре в „%s“" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Не може да се открие валиден файл с отметки в папките с данни" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Вече съществува отметка за адреса „%s“" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не е открита отметка за адреса „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не е указан видът MIME в отметката за адреса „%s“" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не е зададен флаг за лични данни в отметката за адреса „%s“" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не са зададени групи в отметката за адреса „%s“" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Никоя програма „%s“ не е регистрирала отметка за „%s“" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Неуспешно дописване на реда за изпълнение „%s“ с адреса „%s“" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Непълна знакова последователност в края на входните данни" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Заместващият знак „%s“ не може да бъде преобразуван към знак от набора „%s“" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Адресът „%s“ не е абсолютен при използване на схемата „file“ (файлова " +"система)" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адресът „%s“ на локален файл не може да включва „#“" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адресът „%s“ е неправилен" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Името на хоста в адреса „%s“ е неправилно" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адресът „%s“ съдържа грешни екраниращи последователности" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Пътят „%s“ не е абсолютен" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Неправилно име на хост" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "пр. об." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "сл. об." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%x (%a) %X %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%l,%M,%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "януари" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "февруари" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "март" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "април" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "май" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "юни" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "юли" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "август" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "септември" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "октомври" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "ноември" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "декември" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "яну" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "фев" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "мар" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "апр" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "май" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "юни" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "юли" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "авг" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "сеп" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "окт" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ное" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "дек" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "понеделник" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "вторник" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "сряда" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "четвъртък" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "петък" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "събота" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "неделя" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "пн" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "вт" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ср" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "чт" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "пт" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "сб" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "нд" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отваряне на папка „%s“: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Неуспешно заделяне на %lu байт за четене на файла „%s“" +msgstr[1] "Неуспешно заделяне на %lu байта за четене на файла „%s“" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при четене на файл „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файлът „%s“ е прекалено голям" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Неуспешно четене от файл „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Неуспешно отваряне на файл „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Неуспех при получаване на атрибутите на файл „%s“: неуспешно изпълнение на " +"fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" +"Неуспех при отваряне на файл „%s“: неуспешно изпълнение на fdopen(): %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Неуспех при преименуване на файл „%s“ на „%s“: неуспешно изпълнение на " +"g_rename(): %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Неуспешно създаване на файл „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Неуспешно отваряне на файл „%s“ за писане: неуспешно изпълнение на fdopen(): " +"%s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Неуспешен запис на файл „%s“: неуспешно изпълнение на fwrite(): %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Неуспешен запис на файл „%s“: неуспешно изпълнение на fflush(): %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Неуспешен запис на файл „%s“: неуспешно изпълнение на fsync(): %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Неуспешно затваряне на файл „%s“: неуспешно изпълнение на fclose(): %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Неуспешно изтриване на съществуващия файл „%s“: неуспешно изпълнение на " +"g_unlink(): %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблонът „%s“ е неправилен, не трябва да съдържа „%s“" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблонът „%s“ не съдържа XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Неуспешно четене на символната връзка „%s“: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Символни връзки не се поддържат" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не може да се отвори конвертор от „%s“ към „%s“: %s" + +#: ../glib/giochannel.c:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не може да се чете от g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "В буфера за четене останаха непреобразувани данни" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Каналът прекъсна на непълен знак" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не може да се чете от g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "Не може да се открие валиден файл с ключове в папките с данни" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Не е обикновен файл" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ключовият файл съдържа реда „%s“, който не е нито двойка ключ-стойност, нито " +"група, нито коментар" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неправилно име на група: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Ключовият файл не започва с група" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неправилно име на ключ: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ключовият файл съдържа неподдържаното кодиране „%s“" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ключовият файл не съдържа групата „%s“" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ключовият файл не съдържа ключа „%s“" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Ключовият файл съдържа ключ „%s“ със стойност „%s“, която не е в UTF-8" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ключовият файл съдържа ключа „%s“, чиято стойност не може да бъде " +"анализирана." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Ключовият файл съдържа ключа „%s“ в групата „%s“, чиято стойност не може да " +"бъде анализирана." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Ключът „%s“ в групата „%s“ има стойност „%s“, а се очакваше „%s“." + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ключовият файл не съдържа ключа „%s“ в групата „%s“" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "Ключовият файл съдържа екранираща последователност в край на ред" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ключовият файл съдържа грешна екранираща последователност — „%s“" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Стойността „%s“ не може да се интерпретира като число." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целочислената стойност „%s“ е извън интервала на допустими стойности" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" +"Стойността „%s“ не може да се интерпретира като число с плаваща запетая." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Стойността „%s“ не може да се интерпретира като булева." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Неуспешно получаване на атрибутите на файла „%s%s%s%s“: неуспешно изпълнение " +"на fstat(): %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "" +"Неуспешно отваряне на файл в паметта „%s%s%s%s“: неуспешно изпълнение на mmap" +"(): %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Неуспешно отваряне на файл „%s“: неуспешно изпълнение на open(): %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:438 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка на ред %d, знак %d: " + +#: ../glib/gmarkup.c:460 ../glib/gmarkup.c:543 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неправилно кодиран текст в UTF-8 — „%s“ е грешен" + +#: ../glib/gmarkup.c:471 +#, c-format +msgid "'%s' is not a valid name" +msgstr "„%s“ е неправилно име" + +#: ../glib/gmarkup.c:487 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "„%s“ е неправилно име: „%c“" + +#: ../glib/gmarkup.c:596 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка на ред %d: %s" + +#: ../glib/gmarkup.c:680 +#, 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:692 +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:718 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Указателят на знак „%-.*s“ не представя разрешен знак при декодиране" + +#: ../glib/gmarkup.c:756 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Намерена е празна заместваща последователност: „&;“. Валидни " +"последователности са: „&“, „"“, „<“, „>“, „'“" + +#: ../glib/gmarkup.c:764 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Името на заместващата последователност „%-.*s“ е неизвестно" + +#: ../glib/gmarkup.c:769 +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:1117 +msgid "Document must begin with an element (e.g. )" +msgstr "Документът трябва да започва с елемент (напр. )" + +#: ../glib/gmarkup.c:1157 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ е неправилен знак след „<“. Името на елемент не може да започне с него" + +#: ../glib/gmarkup.c:1225 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Неподходящ знак „%s“, очаква се етикетът на празния елемент „%s“ да завърши " +"с „>“" + +#: ../glib/gmarkup.c:1309 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Неподходящ знак „%s“, очаква се „=“ след името на атрибут „%s“ на елемент " +"„%s“" + +#: ../glib/gmarkup.c:1350 +#, 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:1394 +#, 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:1527 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ е неправилен знак при завършването на затварящ етикет с име „%s“. " +"Позволен е знакът „>“" + +#: ../glib/gmarkup.c:1574 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елементът „%s“ е затворен, няма текущо отворен елемент" + +#: ../glib/gmarkup.c:1583 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елементът „%s“ е затворен, но текущо е отворен елемент „%s“" + +#: ../glib/gmarkup.c:1751 +msgid "Document was empty or contained only whitespace" +msgstr "Документът е празен или съдържа само празни знаци" + +#: ../glib/gmarkup.c:1765 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документът завършва неочаквано веднага след отваряща счупена скоба — „<“" + +#: ../glib/gmarkup.c:1773 ../glib/gmarkup.c:1818 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документът завършва неочаквано — има отворени елементи. Последно отворен е " +"„%s“" + +#: ../glib/gmarkup.c:1781 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документът завършва неочаквано, очаква се затваряща счупена скоба да завърши " +"етикета <%s/>" + +#: ../glib/gmarkup.c:1787 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документът завършва неочаквано в името на елемент" + +#: ../glib/gmarkup.c:1793 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документът завършва неочаквано в името на атрибут" + +#: ../glib/gmarkup.c:1798 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документът завършва неочаквано в отварящ етикет на елемент " + +#: ../glib/gmarkup.c:1804 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документът завършва неочаквано след знака за равенство следващ името на " +"атрибута. Атрибутът няма стойност" + +#: ../glib/gmarkup.c:1811 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документът завършва неочаквано вътре в стойността на атрибут" + +#: ../glib/gmarkup.c:1827 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документът завършва неочаквано в затварящия етикет на елемент „%s“" + +#: ../glib/gmarkup.c:1833 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документът завършва неочаквано в коментар или инструкция за обработка" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Употреба:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ОПЦИЯ…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Настройки на помощта:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Показване на настройките на помощта" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Показване на всички настройки на помощта" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Настройки на приложението:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не може да се анализира целочислената стойност „%s“ за %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" +"Целочислената стойност „%s“ за %s е извън интервала на допустимите стойности" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" +"Не може да се анализира стойността с повишена точност double „%s“ за %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" +"Стойността с повишена точност — double „%s“ за %s е извън интервала на " +"допустимите стойности" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при анализа на опцията: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Липсва аргумент за %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опция %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "повреден обект" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "вътрешна грешка или повреден обект" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "недостатъчно памет" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "достигната е границата на обратното връщане" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблонът съдържа елементи, които не се поддържат при частично съвпадение" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"обратните указатели не се поддържат като условие при частично съвпадение" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "прекалено дълбока рекурсия" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "неправилна комбинация от флагове за нов ред" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "неправилно отместване" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "прекалено къс utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "зацикляне при рекурсия" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "непозната грешка" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "„\\“ в края на шаблон" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "„\\c“ в края на шаблон" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "след „\\“ следва непознат знак" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "числата не са в правилен ред в определението за брой с „{}“" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "прекалено голямо число в определението за брой с „{}“" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "липсва завършващ знак „]“ за клас от знаци" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "грешна екранираща последователност в класа от знаци" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "знаците са в неправилен ред в класа от знаци" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "няма какво да се повтори" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "неочаквано повторение" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "непознат знак след „(?“ или „(?-“" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "именованите класове от POSIX се поддържат само в клас" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "липсва завършваща „)“" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "указател към несъществуващ подшаблон" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "липсва „)“ след коментар" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "регулярният израз е прекалено голям" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "неуспешно получаване на памет" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "„)“ без отваряща „(“" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "препълване на кода" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "непознат знак след „(?<“" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "предположението за преглед назад не е с постоянна дължина" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "неправилен номер или име след „(?(“" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "условната група съдържа повече от две разклонения" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "„(?R“ или „(?[+-]цифри“ трябва да се следват от „)“" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "непознато име на клас по POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "не се поддържат елементи на POSIX за подредба" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "знаковата стойност в последователността „\\x{…}“ е прекалено голяма" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "неправилно условие „(?(0)“" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "предположението за преглед назад не може да съдържа „\\C“" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "екраниранията „\\L“, „\\l“, „\\N{name}“, „\\U“ и „\\u“ не се поддържат" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивно извикване може да доведе до безкраен цикъл" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "непознат знак след „(?P“" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "липсва краен знак в име на подшаблон" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "два именовани подшаблона са с еднакво име" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "неправилни последователности „\\P“ или „\\p“" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "непознато име на свойство след „\\P“ или „\\p“" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "името на подшаблон е прекалено дълго (максимално е 32 знака)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "прекалено много именовани подшаблони (максимумът е 10 000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "осмичната стойност е по-голяма от „\\377“" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "надхвърлено е работното пространство за компилация" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "не е открит указан предварително проверен подшаблон" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "групата DEFINE съдържа повече от едно разклонение" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "несъвместими опции за нов ред" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"„\\g“ не е последвано от име или число във фигурни или квадратни скоби, от " +"цитирано име или от обикновено число" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "численият указател не трябва да е „0“" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "„(*ACCEPT)“, „(*FAIL)“ и „(*COMMIT)“ не приемат аргументи" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "неразпознат „(*ГЛАГОЛ)“" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "числото е прекалено голямо" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "липсва име на подшаблон след „(?&“" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "очаква се цифра след „(?+“" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "„]“ е неправилен знак за данни в съвместимия с JavaScript режим" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "не са позволени различни имена за подшаблони с еднакъв номер" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "„(*MARK)“ изисква аргумент" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "„\\c“ трябва да се следва от знак от ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"„\\k“ не е последвано от име във фигурни или квадратни скоби или от цитирано " +"име" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "„\\N“ не се поддържа в клас" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "прекалено много прави указатели" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "" +"името е прекалено дълго за „(*MARK)“, „(*PRUNE)“, „(*SKIP)“ и „(*THEN)“" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "знаковата стойност в последователността „\\u…“ е прекалено голяма" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка %2$s при напасването на регулярния израз — %1$s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Библиотеката PCRE е компилирана без поддръжка на UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Библиотеката PCRE е компилирана без поддръжка на настройки в UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Библиотеката PCRE е компилирана с несъвместими опции" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при компилирането на регулярния израз %s, знак %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка при оптимизирането на регулярния израз %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "очаква се шестнайсетично число или „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "очаква се шестнайсетично число" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "в символния указател липсва „<“" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "незавършен символен указател" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "символен указател с нулева дължина" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "очаква се цифра" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "неправилен символен указател" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "в края има един знак „\\“ в повече" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "непозната екранираща последователност" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка при анализа на текста за замяна „%s“, знак %lu: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Цитиран текст не започва със знака „\"“" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Липсват затварящи кавички в команден ред или друг текст цитиран за обвивката" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текстът свърши веднага след знака „\\“. (Текстът е „%s“)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текстът свърши преди откриването на затварящи кавички за %c. (Текстът е „%s“)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текстът е празен (или съдържа само празни знаци)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспешно четене на данни от дъщерен процес (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочаквана грешка в select() при четене на данни от дъщерен процес (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Дъщерният процес завърши с код %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr " Дъщерният процес бе убит от сигнал %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Дъщерният процес бе спрян от сигнал %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Дъщерният процес завърши аварийно" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Неуспешно четене от дъщерен канал (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Неуспешно разклоняване (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Неуспешна промяна към папка „%s“ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Неуспешно изпълнение на дъщерен процес „%s“ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Неуспешно пренасочване на изхода или входа на дъщерен процес (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Неуспешно разклоняване на дъщерен процес (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Неизвестна грешка при изпълнение на дъщерен процес „%s“" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Неуспешно четене на достатъчно данни от канала на дъщерен процес (с " +"идентификатор %s)" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Неуспешно създаване на канал за комуникация с дъщерен процес (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Неуспешно четене на данни от дъщерен процес" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Неправилен низ във вектора с аргументи на позиция %d: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Неправилен низ в средата: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Неправилна работна папка: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Неуспешно изпълнение на програмата за помощта (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочаквана грешка в g_io_channel_win32_poll() при четене на данни от дъщерен " +"процес" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Знак извън обхвата на UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Неправилна последователност на входа" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Знак извън обхвата на UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u B" +msgstr[1] "%u B" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kb" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s байт" +msgstr[1] "%s байта" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/bn.po b/po/bn.po new file mode 100644 index 0000000..9687f2f --- /dev/null +++ b/po/bn.po @@ -0,0 +1,3802 @@ +# Bengali 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. +# Saad M Niamatullah, 2009 +# Loba Yeasmeen , 2010. +# Israt Jahan , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: bn\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-03-07 01:38+0600\n" +"Last-Translator: Israt Jahan \n" +"Language-Team: Bengali \n" +"Language: bn\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-এর মধ্যে" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "তথ্য ডিরেক্টরির মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-এর জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-এর জন্য বুকমার্ক পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে MIME-এর ধরন নির্ধারিত নেই" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয়নি" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-এর বুকমার্কের ক্ষেত্রে গ্রুপ নির্ধারণ করা হয়নি" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয়নি" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec লাইন '%s'-টির URI '%s' সহ প্রসারণ করতে ব্যর্থ" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' অক্ষরমালা থেকে '%s'-এ রূপান্তর করা সমর্থিত নয়" + +# sam: রুপান্তরকারক +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' থেকে '%s' রুপান্তরকারক খোলা যায়নি" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "রূপান্তর কর্ম সঞ্চালনকালের উৎপন্ন ত্রুটি: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "প্রদত্ত ইনপুটের অন্তে আংশিক অক্ষর অনুক্রম" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ফলব্যাক '%s' থেকে '%s' কোড-সেটে পরিবর্তন করা যায়নি" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'-টি \"file\" স্কিম ব্যবহারকারী সুনিশ্চিত URI নয়" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানীয় ফাইল URI '%s'-এর মধ্যে '#' চিহ্ন অন্তর্ভুক্ত করা যাবে না" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' অকার্যকর" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-এর হোস্ট-নেম অকার্যকর" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-এর মধ্যে অবৈধরূপে এস্কেপ অক্ষর ব্যবহার করা হয়েছে" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পাথটি সুনিশ্চিত নয়" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "হোস্ট-নেম অকার্যকর" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "পূর্বাহ্ণ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "অপরাহ্ণ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "জানুয়ারি" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "ফেব্রুয়ারি" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "মার্চ" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "এপ্রিল" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "জুন" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "জুলাই" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "জানু" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ফেব্রু" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "মার্চ" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "এপ্রি" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "জুন" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "জুল" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "সোমবার" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "মঙ্গলবার" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "বুধবার" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "বৃহস্পতিবার" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "শুক্রবার" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "শনিবার" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "রবিবার" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "সোম" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "মঙ্গল" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "বুধ" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "বৃহঃ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "শুক্র" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "শনি" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "রবি" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu বাইট, \"%s\" ফাইল পড়ার জন্য বরাদ্দ করা যায়নি" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ফাইল অত্যাধিক বড়" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ফাইল থেকে পড়তে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ফাইলের বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ: fstat() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ফাইলের নাম '%s'-এ পরিবর্তন করতে ব্যর্থ: g_rename() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ফাইল তৈরি করতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "লেখার উদ্দেশ্যে '%s' খুলতে ব্যর্থ: fdopen() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fwrite() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fflush() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fsync() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত নয়" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f মেগাবাইট" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f গিগাবাইট" + +# TB= টেরাবাইট +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f টেরাবাইট" + +# PB= পেটাবাইট +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f পেটাবাইট" + +# EB= ইক্সাবাইট +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f ইক্সাবাইট" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f মেগাবাইট" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f গিগাবাইট" + +# TB= টেরাবাইট +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f টেরাবাইট" + +# PB= পেটাবাইট +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f পেটাবাইট" + +# EB= ইক্সাবাইট +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ইক্সাবাইট" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' খুলতে ব্যর্থ: open() ব্যর্থ: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ফাইল ম্যাপ করতে ব্যর্থ: mmap() ব্যর্থ: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "রেখা %d অক্ষর %d-তে ত্রুটি: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামের মধ্যে অবৈধ UTF-8 এনকোডিং সহ টেক্সট - কার্যকর '%s' নয়" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' কার্যকর নাম নয়" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' কার্যকর নাম নয়: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d রেখার মধ্যে ত্রুটি: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' অক্ষরের রেফারেন্সের মধ্যে অনুমোদিত অক্ষর এনকোড করা হয়নি" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"তথ্যবিহীন এনটিটি '&;' প্রদর্শিত; বৈধ এনটিটি হল: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "এনটিটির নাম '%-.*s' অজানা" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "ডকুমেন্ট কোনো এলিমেন্ট দ্বারা আরম্ভ হওয়া আবশ্যক (উদাহরণস্বরূপ )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' অক্ষরের পরে '%s'-এর ব্যবহার বৈধ নয়; এর দ্বারা এলিমেন্টের নাম আরম্ভ করা যাবে না" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' ফাঁকা এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে " +"'>' চিহ্ন প্রত্যাশিত" + +#: ../glib/gmarkup.c:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%2$s' বদ্ধ এলিমেন্টের নামের পশ্চাৎ '%1$s' অক্ষরের ব্যবহার বৈধ নয়; অনুমোদিত অক্ষর " +"হল '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায় ছিলো, তবে বর্তমানে কোনো এলিমেন্ট খোলা অবস্থায় নেই" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"'%s' এলিমেন্ট বদ্ধ অবস্থায় ছিলো, তবে বর্তমানে '%s' এলিমেন্ট খোলা অবস্থায় রয়েছে" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "ডকুমেন্ট ফাঁকা ছিলো অথবা শুধুমাত্র শূণ্যস্থান উপস্থিত ছিলো" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"তেরছা বন্ধনীর প্রারম্ভিক চিহ্নের '<' ঠিক পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা এলিমেন্টসহ ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে - '%s' এলিমেন্ট সর্বশেষ খোলা " +"হয়েছিল" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে, <%s/> ট্যাগ সমাপ্তির জন্য তেরছা বন্ধনী চিহ্নের " +"অন্তিম অংশের উপস্থিতি প্রত্যাশিত" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "এলিমেন্টের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "এলিমেন্টের প্রারম্ভিক ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে।" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যের নামের পরে উপস্থিত সমান চিহ্নের পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে; " +"বৈশিষ্ট্যের মান অনুপস্থিত" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যের মানের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' এলিমেন্টের অন্তিম ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"কোনো মন্তব্য অথবা প্রক্রিয়াকরণের নির্দেশের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তরীণ সমস্যা অথবা ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "ব্যাক-ট্যাক করার সুনির্দিষ্ট সীমা পূর্ণ" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "উল্লিখিত বিন্যাসটির মধ্যে অন্তর্ভুক্ত সামগ্রী, আংশিক মিল অনুসন্ধানে সমর্থিত নয়" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "অভ্যন্তরীণ ত্রুটি" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানের সময় ব্যাক রেফারেন্স সমর্থিত নয়" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "পুনরাবৃত্তির সীমা পূর্ণ" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "ফাঁকা সাবস্ট্রিং-এর কর্মক্ষেত্রের সীমা পূর্ণ" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "নতুন রেখা চিহ্নকারী ফ্ল্যাগের অবৈধ সমষ্টি" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "অজানা ত্রুটি" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "প্যাটার্নের শেষে \\ উপস্থিত" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "প্যাটার্নের শেষে \\c উপস্থিত" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "\\-এর পরে অজ্ঞাত অক্ষর উপস্থিত " + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"হরফের ছাঁদ পরিবর্তনকারী এস্কেপ অক্ষর (\\l, \\L, \\u, \\U) এখানে ব্যবহার করা যায় না" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের মধ্যে উল্লিখিত সংখ্যাগুলো ক্রমবিহীন" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের সংখ্যা অত্যাধিক বড়" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "অক্ষরের ক্লাসের শেষে ] চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে অকার্যকর এস্কেপ সিকোয়েন্স" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে উল্লিখিত সীমা ক্রমবহির্ভূত" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "পুনরাবৃত্তির জন্য কিছু নেই" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "(? চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ক্লাসগুলি শুধুমাত্র ক্লাসের মধ্যে সমর্থিত হবে" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "শেষে ) অনুপস্থিত" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R অথবা (?[+-]সংখ্যা-এর পরে ) চিহ্ন ব্যবহার করা আবশ্যক" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত সাব-প্যাটার্ন নির্দেশ করা হয়েছে" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "বক্তব্যের পরে ) চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "রেগুলার এক্সপ্রেশনটি অত্যাধিক লম্বা" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "মেমরি গ্রহন করতে ব্যর্থ" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের দৈর্ঘ্য সুনির্দিষ্ট নয়" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "(?(-এর পরে ত্রুটিপূর্ণ সংখ্যা অথবা নাম উপস্থিত রয়েছে" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "অবস্থাভিত্তিক দলের মধ্যে দুটির বেশি শ্রেণী উপস্থিত রয়েছে" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "(?(-এর পরে অ্যাসারশন প্রত্যাশিত" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "অজানা POSIX ক্লাসের নাম" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX কোলেটিং এলিমেন্ট সমর্থিত নয়" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} অনুক্রমের মধ্যে উপস্থিত অক্ষরের মান অত্যাধিক বড়" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "অবৈধ কন্ডিশন (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের মধ্যে \\C অনুমোদিত নয়" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "রিকার্সিভ কল-টি সীমাহীন সংখ্যায় লুপ করতে পারবে" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "সাব-প্যাটার্ন নামের মধ্যে সমাপ্তি নির্দেশক অনুপস্থিত" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "দুটি named সাব-প্যাটার্নের ক্ষেত্রে একই নাম ব্যবহার করা হয়েছে" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "ত্রুটিপূর্ণ \\P অথবা \\p সিকোয়েন্স" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "\\P অথবা \\p-এর পরে অজানা প্রপার্টির নাম" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "সাব-প্যাটার্নের নাম অত্যাধিক লম্বা (সর্বাধিক ৩২-টি অক্ষর)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "নামসহ অত্যাধিক সাব-প্যাটার্ন (সর্বাধিক ১০,০০০)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377-এর অধিক" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলের মধ্যে একাধিক ব্রাঞ্চ উপস্থিত রয়েছে" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "কোনো DEFINE দলের পুনরাবৃত্তি করা যাবে না" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্প" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g-এর পরে braced নাম অথবা ঐচ্ছিকরূপে শূণ্য ভিন্ন braced সংখ্যা উপস্থিত নেই" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "অপ্রত্যাশিত পুনরাবৃত্তি" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "কোড ওভার-ফ্লো" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "কম্পাইল করার কর্মক্ষেত্র অতিক্রান্ত হয়েছে" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "পূর্বে পরীক্ষিত রেফারেন্স করা সাব-প্যাটার্ন পাওয়া যায়নি" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-এর মিল অনুসন্ধানে সমস্যা: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্রেরি UTF8 সমর্থন ছাড়া কম্পাইল করা হয়েছে" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্রেরি UTF8 বৈশিষ্ট্যের সমর্থন ছাড়া কম্পাইল করা হয়েছে" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "রেগুলার এক্সপ্রেশন %s, %d অক্ষরে কম্পাইল করতে সমস্যা: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-এর সেরা-অনুকূল করতে সমস্যা: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "হেক্সাডেসিমাল সংখ্যা অথবা '}' প্রত্যাশিত" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "হেক্সাডেসিমাল সংখ্যা প্রত্যাশিত" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে '<' অনুপস্থিত" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "সিম্বলিক রেফারেন্স অসম্পূর্ণ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে অক্ষর সংখ্যা শূণ্য" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "সংখ্যা প্রত্যাশিত" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "অবৈধ সিম্বলিক রেফারেন্স" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "অন্তে অপ্রত্যাশিত '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "অজানা এস্কেপ সিকোয়েন্স" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্রতিস্থাপনার টেক্সট \"%s\", %lu অক্ষরে পার্স করতে সমস্যা: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতির অংশ উদ্ধিতি চিহ্ন দ্বারা আরম্ভ করা হয়নি" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "কমান্ড-লাইন অথবা শেল-এর উদ্ধৃতির মধ্যে অসংগত উদ্ধৃতি চিহ্ন" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' অক্ষরের পরে টেক্সট সমাপ্ত হয়েছে। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c-এর ক্ষেত্রে সুসংগত উদ্ধৃতি চিহ্ন পাওয়া যায়নি। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "টেক্সট ফাঁকা (অথবা শুধুমাত্র শূণ্যস্থানসহ)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্রসেসের সাথে যোগাযোগের উদ্দেশ্যে পাইপ তৈরি করতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপ থেকে পড়তে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ডিরেক্টরিতে পরিবর্তন করতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "চাইল্ড প্রসেস কার্যকর করতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "প্রোগ্রামের নাম অবৈধ: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d-তে আর্গুমেন্ট ভেক্টর-এ উল্লিখিত স্ট্রিংটি বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পরিবেশের মধ্যে উল্লিখিত স্ট্রিং বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্রোগ্রাম চালাতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()-এ অপ্রত্যাশিত ত্রুটি" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় select() সংক্রান্ত অপ্রত্যাশিত ত্রুটি (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()-তে অপ্রত্যাশিত ত্রুটি (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্রসেস \"%s\" চালাতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্রসেসের আউটপুট অথবা ইনপুট রি-ডাইরেক্ট করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্রসেস fork করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করতে অজানা সমস্যা" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপ থেকে পর্যাপ্ত তথ্য পড়তে ব্যর্থ (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "অক্ষরটি UTF-8-এর আয়ত্বের বাইরে" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "অক্ষরটি UTF-16-এর আয়ত্বের বাইরে" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "ব্যবহারপ্রণালী:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "সহায়তা সংক্রান্ত অপশন:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "সহায়তা সংক্রান্ত অপশন প্রদর্শন করা হবে" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "সহায়তা সংক্রান্ত সমস্ত অপশন প্রদর্শন করা হবে" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "অ্যাপ্লিকেশন সংক্রান্ত অপশন:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s-এর জন্য '%1$s'-এর পূর্ণসংখ্যা মান পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s-এর জন্য '%1$s'-এর পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s-এর জন্য '%1$s'-এর দ্বিগুণ মান পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s-এর জন্য '%1$s'-এর দ্বিগুণ মান সীমা বহির্ভূত" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "%s অপশন পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s-এর আর্গুমেন্ট অনুপস্থিত" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "অজানা অপশন %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানের ডিরেক্টরিতে মধ্যে কার্যকর কি-ফাইল পাওয়া যায়নি" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "সাধারণ ফাইল নয়" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "ফাইল ফাঁকা" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "কী-ফাইলের মধ্যে '%s' রেখাটি রয়েছে, এটি কী-মান জুটি, গ্রুপ অথবা মন্তব্য নয়" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলের নাম অকার্যকর: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "কী-ফাইলের প্রারম্ভে কোনো গ্রুপ উল্লিখিত নেই" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "কী-এর নাম অকার্যকর: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "কী-ফাইলের মধ্যে অসমর্থিত এনকোডিং '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "কী-ফাইলের মধ্যে কোনো গ্রুপ অনুপস্থিত '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "কী-ফাইলের মধ্যে কোনো '%s' কি উপস্থিত নেই" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "কী-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "কী-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "কী-ফাইলের মধ্যে '%2$s' গ্রুপে '%1$s' কি উপস্থিত নেই" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "কী-ফাইলের মধ্যে রেখার অবশেষে এস্কেপ অক্ষর উপস্থিত রয়েছে" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "কী-ফাইলের মধ্যে অকার্যকর এস্কেপ ধারা উপস্থিত রয়েছে '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যারূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান ফ্লোট সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়ান রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-এর জন্য উল্লিখিত গণনার মান অত্যাধিক বড়" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "স্ট্রিম বর্তমান বন্ধ হয়েছে" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "কর্ম বাতিল করা হয়েছে" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "অকার্যকর অবজেক্ট, আরম্ভ করা হয়নি" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সম্পূর্ন নয়" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "গন্তব্যের জন্য পর্যাপ্ত স্থান নেই" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s ধরণ" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ট্রিমের সমাপ্তিস্থল অপ্রত্যাশিতভাবে শীঘ্রই পাওয়া গিয়েছে" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "সংযোগ স্থাপন করতে সমস্যা:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "অজানা প্রকৃতি" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "ডিরেক্টরি তৈরি করতে ত্রুটি: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "আবর্জনা সমর্থিত নয়" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%d রেখার মধ্যে ত্রুটি: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s অপশন পার্স করতে ব্যর্থ" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "সংযোগ স্থাপন করতে সমস্যা: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' কার্যকর নাম নয়" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%s অপশন পার্স করতে ব্যর্থ" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "সংযোগ গ্রহণ করতে সমস্যা: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ ফাইলের মধ্যে Exec ফিল্ড উল্লেখ করা নেই" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "অ্যাপ্লিকেশনের জন্য আবশ্যক টার্মিনাল পাওয়া যায়নি" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ব্যবহারকারী অ্যাপ্লিকেশনের কনফিগারেশন ফোল্ডার %s তৈরি করতে ব্যর্থ: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ব্যবহারকারী MIME কনফিগারেশন ফোল্ডার %s তৈরি করতে ব্যর্থ: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ব্যবহারকারী ডেস্কটপ ফাইল %s তৈরি করতে ব্যর্থ" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "%s-এর জন্য স্বনির্ধারিত ব্যাখ্যা" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "ড্রাইভ দ্বারা প্রারম্ভের কর্ম সঞ্চালিত নেই" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "ড্রাইভ দ্বারা বন্ধ করার কর্ম সঞ্চালিত নেই" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem এনকোডিং-এর মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-এর জন্য একটি GEmblem প্রত্যাশিত" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "ধারণকারী মাউন্ট উপস্থিত নেই" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "ডিরেক্টরির উপরে অনুলিপি করা যাবে না" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি অনুলিপি করা যায়নি" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "টারগেট ফাইল উপস্থিত রয়েছে" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "রিকার্সিভ ভাবে ডিরেক্টরি অনুলিপি করা যাবে না" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "স্প্যাইস সমর্থিত নয়" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "স্প্যাইসিং ফাইলে সমস্যা: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "বিশেষ ফাইল অনুলিপি করা যাবে না" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "অকার্যকর symlink মান দেয়া হয়েছে" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "আবর্জনা সমর্থিত নয়" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ফাইলের নামের মধ্যে '%c' ব্যবহার করা যাবে না" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বারা মাউন্ট ব্যবহার করা হয় না" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত ফাইল ব্যবস্থাপনার উদ্দেশ্যে কোনো অ্যাপ্লিকেশন নিবন্ধিত হয়নি" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ইনুমেরেটর বন্ধ" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "ফাইল enumerator-এর মধ্যে অসমাপ্ত কর্ম উপস্থিত" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "ফাইল enumerator বন্ধ আছে" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-এর জন্য ক্ষতিগ্রস্ত ইনপুট তথ্য উপস্থিত" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "স্ট্রিম দ্বারা query_info সমর্থিত নয়" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "স্ট্রিম দ্বারা Seek সমর্থিত নয়" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "ইনপুট স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের অনুমতি নেই" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের সমর্থন নেই" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "টোকেনের সংখ্যা সঠিক নয় (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s ক্লাসের নামের জন্য কোনো ধরন নির্ধারিত হয়নি" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেস বাস্তবায়িত হয় না" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "সংস্করণ সংখ্যা সটিকরূপে গঠিত হয়নি: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধরণ দ্বারা GIcon ইন্টারফেসের মধ্যে from_tokens() বাস্তবায়িত হয় না" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "উপলব্ধ আইকন এনকোডিং-এর সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "স্ট্রিমের ক্ষেত্রে অসমাপ্ত কর্ম উপস্থিত রয়েছে" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান নেই" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "আবর্জনা সমর্থিত নয়" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরণ সন্ধান করতে ব্যর্থ" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ফাইলের নাম অবৈধ: %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ফাইল-সিস্টেম সংক্রান্ত তথ্য প্রাপ্ত করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "root ডিরেক্টরির নাম পরিবর্তন করা সম্ভব নয়" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "" +"ফাইলের নাম পরিবর্তন করা যায়নি, নতুন নামের একটি ফাইলের নাম বর্তমানে উপস্থিত রয়েছে" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "ফাইলের নাম অকার্যকর নয়" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "ডিরেক্টরি খুলতে পারেনি" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "ফাইলটি আবর্জনায় স্থানান্তর করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবর্জনার ডিরেক্টরি %s তৈরি করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "আবর্জনার ঊর্ধ্বতন ডিরেক্টরি সনাক্ত করতে ব্যর্থ" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "আবর্জনার ডিরেক্টরি সনাক্ত অথবা তৈরি করতে ব্যর্থ" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing info ফাইল তৈরি করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ফাইল বর্জন করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "ডিরেক্টরি তৈরি করতে ত্রুটি: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ফাইলসিস্টেম সিম্বোলিঙ্ক লিঙ্ক সমর্থন করে না" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "সিম্‌বলিক লিঙ্ক তৈরি করতে ত্রুটি: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "ফাইল স্থানান্তর করতে ত্রুটি: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "ব্যাক-আপ ফাইল তৈরি করতে ব্যর্থ" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "উদ্দিষ্ট ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "মাউন্ট করা অবস্থানের মধ্যে স্থানান্তর করা সম্ভব নয়" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "অ্যাট্রিবিউটের ক্ষেত্রে NULL-ব্যতীত অন্য মান নির্ধারণ করা আবশ্যক" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "প্রসারিত অ্যাট্রিবিউটের নাম অবৈধ" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "প্রসারিত অ্যাট্রিবিউট '%s'-কে নির্ধারণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ফাইল '%s' stat করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (অবৈধ এনকোডিং)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ফাইলের বিবরণ stat করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (byte string প্রত্যাশিত)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "সিমলিংকের অনুমতি নির্ধারণ করতে ব্যর্থ" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "মালিকানা নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "সিম্‌-লিঙ্ক NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে ত্রুটি: ফাইলটি সিম্‌-লিঙ্ক নয়" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "পরিবর্তন অথবা ব্যবহারের সময় নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux কনটেক্সটের NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux কনটেক্সট নির্ধারণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "এই সিস্টেমে SELinux সক্রিয় করা হয়নি" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s অ্যাট্রিবিউটের মান নির্ধারণ সমর্থিত নয়" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ফাইলের মধ্যে seek করতে সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুরোনো ব্যাক-আপের লিংক মুছে ফেলতে ত্রুটি: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ব্যাক-আপ প্রতিলিপি তৈরি করতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী ফাইলের নাম পরিবর্তন করতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "ফাইল ট্রানকেট (ছাঁটাই) করতে সমস্যা %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "উদ্দিষ্ট ফাইলটি একটি ডিরেক্টরি" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "উদ্দিষ্ট ফাইলটি সাধারণ ফাইল নয়" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "ফাইলটি স্বতন্ত্ররূপে পরিবর্তন করা হয়েছে" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুরোনো ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "অবৈধ GSeekType উল্লিখিত হয়েছে" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "অবৈধ seek-এর অনুরোধ" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ট্রানকেট করতে ব্যর্থ" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তনযোগ্য নয়" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তন করতে ব্যর্থ" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"রাইট প্রসেস করার জন্য প্রয়োজনীয় মেমরির পরিমান বিদ্যমান ঠিকানার জন্য ফাঁকা স্থানের " +"অধিক" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "স্ট্রীমের শুরুর পূর্বে অনুরোধকৃত সিক" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "মাউন্ট করা বস্তুর ক্ষেত্রে \"আনমাউন্ট\" প্রয়োগ করা সম্ভব নয়" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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 "" +"মাউন্ট করা বস্তুর ক্ষেত্রে \"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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বারা সুসংগতভাবে সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' হোস্ট-নেমের মধ্যে '[' উপস্থিত রয়েছে কিন্তু ']' অনুপস্থিত" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "আউটপুট স্ট্রিম দ্বারা write বাস্তবায়িত হয় না" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "মূল স্ট্রিম বর্তমানে বন্ধ করা হয়েছে" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' মীমাংসা করতে ব্যর্থ: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "বিপরীত ক্রমে '%s' মীমাংসা করতে ব্যর্থ: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-এর পরিসেবার কোনো রেকর্ড অনুপস্থিত" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "সাময়িকভাবে '%s' মীমাংসা করতে ব্যর্থ" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' মীমাংসা করতে ত্রুটি" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "অজানা অপশন %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ সকেট, চিহ্নিত কারণে আরম্ভ করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "সকেট বর্তমানে বন্ধ করা হয়েছে" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd থেকে GSocket তৈরি করা হচ্ছে: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "সকেট তৈরি করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "অজানা প্রোটোকল নির্ধারণ করা হয়" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকানা পেতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূরবর্তী ঠিকানা পেতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "অপেক্ষা করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকানার সাথে বাইন্ড করতে সমস্যা: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্রহণ করতে সমস্যা: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "সংযোগ স্থাপন করতে সমস্যা:" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "সংযোগ স্থাপন করতে সমস্যা: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "অপেক্ষারত ত্রুটি পেতে সমস্যা: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য পেতে সমস্যা: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পাঠাতে সমস্যা: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "সকেট তৈরি করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "সকেট বন্ধ করতে সমস্যা: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "সকেটের অবস্থা পেতে অপেক্ষা করা হচ্ছে: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "বার্তা পাঠাতে সমস্যা: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "উইন্ডোতে GSocketControlMessage সমর্থিত নয়" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "বার্তা পেতে সমস্যা: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "সংযোগ স্থাপনকালে অজানা সমস্যা" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-এর %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "à§§-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি পেয়েছে" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "অপ্রত্যাশিত প্রকৃতির আনুষঙ্গিক তথ্য" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "একটি fd প্রত্যাশিত, কিন্তু %d পেয়েছে\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "অকার্যকর fd পেয়েছে" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "তথ্য পাঠাতে সমস্যা: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "à§§-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি পেয়েছে" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix থেকে পড়তে সমস্যা: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix বন্ধ করতে সমস্যা: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "ফাইল-সিস্টেমের root" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix-এ লিখতে সমস্যা: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "এই সিস্টেমের মধ্যে অ্যাবস্ট্র্যাক্ট unix ডোমেইন সকেট ঠিকানা সমর্থিত নয়" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বারা eject অথবা eject_with_operation ব্যবহার করা সম্ভব নয়" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "অ্যাপ্লিকেশন পাওয়া যায়নি" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "অ্যাপ্লিকেশন আরম্ভ করতে সমস্যা: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI সমর্থিত নয়" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "সংসর্গ সম্বন্ধীয় পরিবর্তনগুলি win32-এর মধ্যে সমর্থিত নয়" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "সংসর্গ নির্ধারণ win32-এর মধ্যে সমর্থিত নয়" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "যথেষ্ট মেমরি নেই" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তরীণ ত্রুটি: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "আরও ইনপুট প্রয়োজন" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "অকার্যকর কমপ্রেস করা ডাটা" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#, 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.po b/po/bn_IN.po new file mode 100644 index 0000000..4472965 --- /dev/null +++ b/po/bn_IN.po @@ -0,0 +1,3802 @@ +# 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, 2011. +msgid "" +msgstr "" +"Project-Id-Version: bn_IN\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-02-11 19:00+0530\n" +"Last-Translator: \n" +"Language-Team: Bengali (India) \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "অপ্রত্যাশিত '%s' বৈশিষ্ট্য '%s' বস্তুর জন্য উল্লিখিত হয়েছে" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' বৈশিষ্ট্য '%s' বস্তুর ক্ষেত্রে পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "অপ্রত্যাশিত ট্যাগ '%s', ট্যাগ '%s' প্রত্যাশিত" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "অপ্রত্যাশিত '%s' ট্যাগ '%s'-র মধ্যে" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "data dir'র মধ্যে বৈধ বুকমার্ক ফাইল পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-র জন্য বুকমার্ক বর্তমানে উপস্থিত রয়েছে" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-র জন্য বুকমার্ক পাওয়া যায়নি" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে MIME'র ধরন নির্ধারিত হয়নি" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে ব্যক্তিগত ফ্ল্যাগ চিহ্ন দেওয়া হয়নি" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-র বুকমার্কের ক্ষেত্রে দল নির্ধারণ করা হয়নি" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' নামক কোনো অ্যাপ্লিকেশনের দ্বারা '%s' বুকমার্ক নিবন্ধিত হয়নি" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec পংক্তি '%s'-টি URI '%s' সহ প্রসারণ করতে ব্যর্থ" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' অক্ষরমালা থেকে '%s'-এ রূপান্তর করা যাবে না" + +# sam: রুপান্তরকারক +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' থেকে '%s' রূপান্তর ব্যবস্থা খোলা যায়নি" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "রূপান্তর করার জন্য প্রদত্ত ইনপুটের মধ্যে বাইটের অনুক্রম সঠিক নয়" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "রূপান্তর কর্ম সঞ্চালনকালের উৎপন্ন সমস্যা: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "প্রদত্ত ইনপুটের অন্তে আংশিক অক্ষর অনুক্রম" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ফলব্যাক '%s' থেকে '%s' কোড-সেটে পরিবর্তন করা যায়নি" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'-টি \"file\" স্কিম প্রয়োগকারী সুনিশ্চিত URI নয়" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "স্থানীয় ফাইল URI '%s'-র মধ্যে '#' চিহ্ন অন্তর্ভুক্ত করা যাবে না" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' বৈধ নয়" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-র হোস্ট-নেম বৈধ নয়" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-র মধ্যে অবৈধরূপে এস্কেপ অক্ষর প্রয়োগ করা হয়েছে" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' পাথটি সুনিশ্চিত নয়" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "হোস্ট-নেম বৈধ নয়" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "পূর্বাহ্ন" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "অপরাহ্ন" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "জানুয়ারি" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "ফেব্রুয়ারি" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "মার্চ" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "এপ্রিল" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "জুন" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "জুলাই" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "আগস্ট" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "সেপ্টেমবর" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "অক্টোবর" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "নভেম্বর" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "ডিসেম্বর" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "জানুয়ারি" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ফেব্রুয়ারি" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "মার্চ" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "এপ্রিল" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "মে" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "জুন" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "জুলাই" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "আগস্ট" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "সেপ্টেম্বর" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "অক্টোবর" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "নভেম্বর" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ডিসেম্বর" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "সোমবার" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "মঙ্গলবার" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "বুধবার" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "বৃহস্পতিবার" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "শুক্রবার" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "শনিবার" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "রবিবার" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "সোম" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "মঙ্গল" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "বুধ" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "বৃহঃ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "শুক্র" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "শনি" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "রবি" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu বাইট, \"%s\" ফাইল পড়ার জন্য বরাদ্দ করা যায়নি" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ফাইল অত্যাধিক বড়" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ফাইল থেকে পড়তে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ফাইলের বৈশিষ্ট্য প্রাপ্ত করতে ব্যর্থ: fstat() বিফল: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ফাইল খুলতে ব্যর্থ: fdopen() বিফল: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ফাইলের নাম '%s'-এ পরিবর্তন করতে ব্যর্থ: g_rename() বিফল: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ফাইল নির্মাণ করতে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "লেখার উদ্দেশ্যে '%s' খুলতে ব্যর্থ: fdopen() বিফল: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fwrite() বিফল: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fflush() বিফল: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ফাইলে লিখতে ব্যর্থ: fsync() বিফল: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ফাইল বন্ধ করতে ব্যর্থ: fclose() বিফল: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "বিদ্যমান ফাইল '%s' অপসারিত করা যায়নি: g_unlink() ব্যর্থ: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "নমুনা '%s' সঠিক নয়, '%s' থাকা উচিত নয়" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' টেমপ্লেটের মধ্যে XXXXXX অন্তর্ভুক্ত নেই" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u বাইট" +msgstr[1] "%u বাইট" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f মেগাবাইট" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f গিগাবাইট" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f মেগাবাইট" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f গিগাবাইট" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u বাইট" +msgstr[1] "%u বাইট" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f কিলোবাইট" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' খুলতে ব্যর্থ: open() বিফল: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ফাইল ম্যাপ করতে ব্যর্থ: mmap() বিফল: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "পংক্তি %d অক্ষর %d'এ ত্রুটি: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "নামের মধ্যে অবৈধ UTF-8 এনকোডিং সহ টেক্সট - বৈধ '%s' নয়" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' বৈধ নাম নয়" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' বৈধ নাম নয়: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "পংক্তি %d'এ ত্রুটি: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' অক্ষরের রেফারেন্সের মধ্যে অনুমোদিত অক্ষর এনকোড করা হয়নি" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"তথ্যবিহীন স্বত্বা '&;' প্রদর্শিত; বৈধ স্বত্বা হল: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "স্বত্ত্বার নাম '%-.*s' অজানা" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "নথি কোনো এলিমেন্ট দ্বারা আরম্ভ হওয়া আবশ্যক (উদাহরণস্বরূপ )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' অক্ষরের পরে '%s'-র ব্যবহার বৈধ নয়; এর দ্বারা এলিমেন্টের নাম আরম্ভ করা যাবে না" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"'%s' অক্ষর প্রত্যাশিত নয়, '%s' ফাঁকা এলিমেন্টের প্রারম্ভিক ট্যাগ সমাপ্ত করার উদ্দেশ্যে " +"'>' চিহ্ন প্রত্যাশিত" + +#: ../glib/gmarkup.c:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%2$s' বদ্ধ এলিমেন্টের নামের পশ্চাত '%1$s' অক্ষরের ব্যবহার বৈধ নয়; অনুমোদিত অক্ষর " +"হল '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে কোনো এলিমেন্ট খোলা অবস্থায় নেই" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' এলিমেন্ট বদ্ধ অবস্থায়, বর্তমানে '%s' এলিমেন্ট খোলা অবস্থায় রয়েছে" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "ডকুমেন্ট সম্ভবত ফাঁকা অথবা শুধুমাত্র শূণ্যস্থান উপস্থিত" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"তেরছা বন্ধনীর প্রারম্ভিক চিহ্নের '<' ঠিক পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"খোলা এলিমেন্টসহ ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে - '%s' এলিমেন্ট সর্বশেষ খোলা " +"হয়েছিল" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"নথি অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে, <%s/> ট্যাগ সমাপ্তির জন্য তেরছা বন্ধনী চিহ্নের " +"অন্তিম অংশের উপস্থিতি প্রত্যাশিত" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "এলিমেন্টের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "বৈশিষ্ট্যের নামের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "এলিমেন্টের প্রারম্ভিক ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"বৈশিষ্ট্যের নামের পরে উপস্থিত সমান চিহ্নের (=) পরে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত " +"হয়েছে; বৈশিষ্ট্যের মান অনুপস্থিত" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "বৈশিষ্ট্যের মানের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' এলিমেন্টের অন্তিম ট্যাগের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"কোনো মন্তব্য অথবা প্রক্রিয়াকরণের নির্দেশের মধ্যে ডকুমেন্ট অপ্রত্যাশিতরূপে সমাপ্ত হয়েছে" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "অভ্যন্তরীণ সমস্যা অথবা ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "ব্যাক-ট্যাক করার সুনির্দিষ্ট সীমা পূর্ণ" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "উল্লিখিত বিন্যাসটির মধ্যে অন্তর্ভুক্ত সামগ্রী, আংশিক মিল অনুসন্ধানে সমর্থিত নয়" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "অভ্যন্তরীণ সমস্যা" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "আংশিক মিল অনুসন্ধানের সময় ব্যাক রেফারেন্স সমর্থিত নয়" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "পুনরাবৃত্তির সীমা পূর্ণ" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "ফাঁকা সাব-স্ট্রিং-র কর্মক্ষেত্রের সীমা পূর্ণ" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "নতুন পংক্তি চিহ্নকারী ফ্ল্যাগের অবৈধ সমষ্টি" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "ভুল অফসেট" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "শর্ট utf8" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "অজানা সমস্যা" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "পংক্তির শেষে \\ উপস্থিত" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "পংক্তির শেষে \\c উপস্থিত" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "\\-র পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"হরফের ছাঁদ পরিবর্তনকারী এস্কেপ অক্ষর (\\l, \\L, \\u, \\U) এখানে ব্যবহার করা সম্ভব " +"নয়" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "{} সংখ্যা নির্দেশকের মধ্যে উল্লিখিত সংখ্যাগুল ক্রমবিহীন" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "{} কোয়ান্টিফায়ারের সংখ্যা অত্যাধিক বড়" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "অক্ষরের ক্লাসের শেষে ] চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে অবৈধ এস্কেপ সিকোয়েন্স" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "অক্ষরের ক্লাসের মধ্যে উল্লিখিত সীমা ক্রমবহির্ভূত" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "পুনরাবৃত্তির জন্য কিছু উপস্থিত নেই" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "(? চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "(?< চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "(?P চিহ্নের পরে অজ্ঞাত অক্ষর উপস্থিত" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ক্লাসগুলি শুধুমাত্র ক্লাসের মধ্যে সমর্থিত হবে" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "শেষে ) অনুপস্থিত" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R অথবা (?[+-]সংখ্যা-র পরে ) চিহ্ন ব্যবহার করা আবশ্যক" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "অনুপস্থিত সাব-প্যাটার্ন নির্দেশ করা হয়েছে" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "বক্তব্যের পরে ) চিহ্ন অনুপস্থিত" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "রেগুলার এক্সপ্রেশনটি অত্যাধিক লম্বা" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "মেমরি প্রাপ্ত করতে ব্যর্থ" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের দৈর্ঘ্য সুনির্দিষ্ট নয়" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "(?(-র পরে ত্রুটিপূর্ণ সংখ্যা অথবা নাম উপস্থিত রয়েছে" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "অবস্থাভিত্তিক দলের মধ্যে দুটির বেশি শ্রেণী উপস্থিত রয়েছে" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "(?(-র পরে অ্যাসারশন প্রত্যাশিত" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "অজানা POSIX ক্লাসের নাম" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX কোলেটিং এলিমেন্ট সমর্থিত নয়" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} অনুক্রমের মধ্যে উপস্থিত অক্ষরের মান অত্যাধিক বড়" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "অবৈধ কন্ডিশন (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "লুক-বিহাইন্ড অ্যাসারশনের মধ্যে \\C অনুমোদিত নয়" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "রিকার্সিভ কল-টি সীমাহীন সংখ্যায় লুপ করতে পারবে" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "সাব-প্যাটার্ন নামের মধ্যে সমাপ্তি নির্দেশক অনুপস্থিত" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "দুটি named সাব-প্যাটার্নের ক্ষেত্রে একই নাম প্রয়োগ করা হয়েছে" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "ত্রুটিপূর্ণ \\P অথবা \\p সিকোয়েন্স" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "\\P অথবা \\p-র পরে অজানা প্রপার্টির নাম" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "সাব-প্যাটার্নের নাম অত্যাধিক লম্বা (সর্বাধিক ৩২-টি অক্ষর)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "নামসহ অত্যাধিক সাব-প্যাটার্ন (সর্বাধিক ১০,০০০)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "অক্টাল মান \\377-র অধিক" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE দলের মধ্যে একাধিক ব্রাঞ্চ উপস্থিত রয়েছে" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "কোনো DEFINE দলের পুনরাবৃত্তি করা যাবে না" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "বিসংগত NEWLINE বিকল্প" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g-র পরে braced নাম অথবা ঐচ্ছিকরূপে শূণ্য ভিন্ন braced সংখ্যা উপস্থিত নেই" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "অপ্রত্যাশিত পুনরাবৃত্তি" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "কোড ওভার-ফ্লো" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "কম্পাইল করার কর্মক্ষেত্র অতিক্রান্ত হয়েছে" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "পূর্বে পরীক্ষিত রেফারেন্স করা সাব-প্যাটার্ন পাওয়া যায়নি" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-র মিল অনুসন্ধানে সমস্যা: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE লাইব্রেরি UTF8 সমর্থন বিনা কম্পাইল করা হয়েছে" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE লাইব্রেরি UTF8 বৈশিষ্ট্যের সমর্থন বিনা কম্পাইল করা হয়েছে" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "রেগুলার এক্সপ্রেশন %s, %d অক্ষরে কম্পাইল করতে সমস্যা: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "রেগুলার এক্সপ্রেশন %s-র সর্বোত্তম ব্যবহারে সমস্যা: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "হেক্সাডেসিমাল সংখ্যা অথবা '}' প্রত্যাশিত" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "হেক্সাডেসিমাল সংখ্যা প্রত্যাশিত" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে '<' অনুপস্থিত" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "সিম্বলিক রেফারেন্স অসম্পূর্ণ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "সিম্বলিক রেফারেন্সের মধ্যে অক্ষর সংখ্যা শূণ্য" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "সংখ্যা প্রত্যাশিত" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "অবৈধ সিম্বলিক রেফারেন্স" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "অন্তে অপ্রত্যাশিত '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "অজানা এস্কেপ সিকোয়েন্স" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "প্রতিস্থাপনার টেক্সট \"%s\", %lu অক্ষরে পার্স করতে সমস্যা: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "উদ্ধৃতির অংশ উদ্ধিতি চিহ্ন দ্বারা আরম্ভ করা হয়নি" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "কমান্ড-লাইন অথবা শেল'র উদ্ধৃতির মধ্যে অসংগত উদ্ধৃতি চিহ্ন" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' অক্ষরের পরে টেক্সট সমাপ্ত হয়েছে। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c'র ক্ষেত্রে সুসংগত উদ্ধৃতি চিহ্ন পাওয়া যায়নি। (সংশ্লিষ্ট টেক্সট হল '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "টেক্সট ফাঁকা (অথবা শুধুমাত্র শূণ্যস্থানসহ)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "চাইল্ড প্রসেসের সাথে যোগাযোগের উদ্দেশ্যে পাইপ নির্মাণে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "চাইল্ড পাইপ থেকে পড়তে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ডিরেক্টরিতে পরিবর্তন করতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "চাইল্ড প্রসেস কার্যকর করতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "প্রোগ্রামের নাম অবৈধ: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d'এ আর্গুমেন্ট ভেক্টর'এ উল্লিখিত পংক্তি বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "পরিবেশের মধ্যে উল্লিখিত পংক্তি বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "সক্রিয় ডিরেক্টরি বৈধ নয়: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "সহায়ক প্রোগ্রাম চালাতে ব্যর্থ (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় g_io_channel_win32_poll()'এ অপ্রত্যাশিত ত্রুটি" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়তে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "চাইল্ড প্রসেস থেকে তথ্য পড়ার সময় select() সংক্রান্ত অপ্রত্যাশিত ত্রুটি (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'এ অপ্রত্যাশিত ত্রুটি (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "চাইল্ড প্রসেস \"%s\" চালাতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "চাইল্ড প্রসেসের আউটপুট অথবা ইনপুট রি-ডাইরেক্ট করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "চাইল্ড প্রসেস fork করতে ব্যর্থ (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "চাইল্ড প্রসেস \"%s\" কার্যকর করতে অজানা সমস্যা" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "চাইল্ড pid পাইপ থেকে পর্যাপ্ত তথ্য পড়তে ব্যর্থ (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "অক্ষরটি UTF-8'র আয়ত্বের বাইরে" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "রূপান্তর করার উদ্দেশ্যে প্রদত্ত তথ্যের মধ্যে অবৈধ ধারা" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "অক্ষরটি UTF-16'র আয়ত্বের বাইরে" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "ব্যবহারপ্রণালী:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "সহায়তা সংক্রান্ত বিকল্প:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "সহায়তা সংক্রান্ত বিকল্প প্রদর্শন করা হবে" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "সহায়তা সংক্রান্ত সমস্ত বিকল্প প্রদর্শন করা হবে" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "অ্যাপ্লিকেশন সংক্রান্ত বিকল্প:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s-র জন্য '%1$s'-র পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s-র জন্য '%1$s'-র দ্বীগুণ মান সীমা বহির্ভূত" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "%s বিকল্প পার্স করতে ব্যর্থ" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s'র আর্গুমেন্ট অনুপস্থিত" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "অজানা বিকল্প %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "অনুসন্ধানের dirs-র মধ্যে বৈধ কি-ফাইল পাওয়া যায়নি" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "সাধারণ ফাইল নয়" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "ফাইল ফাঁকা" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "কি-ফাইলের মধ্যে '%s' পংক্তিটি রয়েছে, এটি কি-মান জুটি, সংকলন অথবা মন্তব্য নয়" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "দলের নাম অবৈধ: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "কি-ফাইলের প্রারম্ভে কোনো সংকলন উল্লিখিত নেই" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "কি-র নাম অবৈধ: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "কি-ফাইলের মধ্যে অসমর্থিত এনকোডিং '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো সংকলন অনুপস্থিত '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "কি-ফাইলের মধ্যে কোনো কি উপস্থিত নেই '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "কি-ফাইলের মধ্যে '%s' কি উপস্থিত রয়েছে যার মান ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "কি-ফাইলের মধ্যে '%2$s' সংকলনে '%1$s' কি উপস্থিত নেই" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "কি-ফাইলের মধ্যে পংক্তির অবশেষে এস্কেপ অক্ষর উপস্থিত রয়েছে" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "কি-ফাইলের মধ্যে অবৈধ এস্কেপ ধারা উপস্থিত রয়েছে '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' মান কোনো সংখ্যারূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' পূর্ণসংখ্যা মান সীমা বহির্ভূত" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' মান float সংখ্যা রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' মান বুলিয়ান রূপে ব্যাখ্যা করা সম্ভব নয়।" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-র জন্য উল্লিখিত গণনার মান অত্যাধিক বড়" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "স্ট্রিম বর্তমান বন্ধ হয়েছে" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "কর্ম বাতিল করা হয়েছে" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "অবৈধ অবজেক্ট, আরম্ভ করা হয়নি" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "প্রদত্ত ইনপুটের মধ্যে অসম্পূর্ণ মাল্টি-বাইটের অনুক্রম" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "গন্তব্যস্থলের মধ্যে পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s ধরন" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "এই অপারেটিং সিস্টেমের মধ্যে GCredentials স্থাপন করা হয়নি" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "আপনার ব্যবহৃত প্ল্যাটফর্মের মধ্যে কোনো GCredentials সমর্থন উপস্থিত নেই" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "স্ট্রিমের সমাপ্তিস্থল অপ্রত্যাশিতভাবে শীঘ্র পাওয়া গিয়েছে" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "সংযোগ স্থাপন করতে ব্যর্থ: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "অজানা প্রকৃতি" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "ডিরেক্টরি নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' ফাইল পড়তে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "আবর্জনা সমর্থিত হয় না" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "পংক্তি %d'এ ত্রুটি: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s বিকল্প পার্স করতে ব্যর্থ" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "সংযোগ স্থাপন করতে ত্রুটি: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' বৈধ নাম নয়" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%s বিকল্প পার্স করতে ব্যর্থ" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "সংযোগ গ্রহণ করতে ব্যর্থ: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "'%s' ডিরেক্টরি খুলতে ব্যর্থ: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "ক্ষতিগ্রস্ত অবজেক্ট" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "নামবিহীন" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "ডেস্কটপ ফাইলের মধ্যে Exec ফিল্ড" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "অ্যাপ্লিকেশনের জন্য আবশ্যক টার্মিনাল পাওয়া যায়নি" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "উইজার অ্যাপ্লিকেশনের কনফিগারেশন ফোল্ডার %s নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ইউজার MIME কনফিগারেশন ফোল্ডার %s নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ইউজার ডেস্কটপ ফাইল %s নির্মাণ করতে ব্যর্থ" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "%s-র জন্য স্বনির্ধারত ব্যাখ্যা" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "ড্রাইভ দ্বারা প্রারম্ভের কর্ম সঞ্চালিত হয় না" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "ড্রাইভ দ্বারা বন্ধ করার কর্ম সঞ্চালিত হয় না" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem এনকোডিং-র মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র মধ্যে উপস্থিত ক্ষতিগ্রস্ত টোকেনের সংখ্যা (%d)" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-র জন্য একটি GEmblem প্রত্যাশিত" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "ধারণকারী মাউন্ট উপস্থিত নেই" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "ডিরেক্টরির উপরে কপি করা যাবে না" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি কপি করা যায়নি" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "উদ্দিষ্ট ফাইল উপস্থিত রয়েছে" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "রিকার্সিভ ভাবে ডিরেক্টরি কপি করা যাবে না" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "সিম্বোলিক লিঙ্ক সমর্থিত হয় না" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "বিশেষ ফাইল কপি করা যাবে না" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "অবৈধ সিম-লিঙ্ক মান উপলব্ধ করা হয়েছে" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "আবর্জনা সমর্থিত হয় না" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ফাইলের নামের মধ্যে '%c' ব্যবহার করা যাবে না" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "ভলিউম দ্বারা mount প্রয়োগ করা হয় না" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "চিহ্নিত ফাইল ব্যবস্থাপনার উদ্দেশ্যে কোনো অ্যাপ্লিকেশন নিবন্ধিত হয়নি" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator বন্ধ" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "ফাইল enumerator-র মধ্যে অসমাপ্ত কর্ম উপস্থিত" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "ফাইল enumerator-র বন্ধ" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-র জন্য ক্ষতিগ্রস্ত ইনপুট তথ্য উপস্থিত" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "স্ট্রিম দ্বারা query_info সমর্থিত হয় না" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "স্ট্রিম দ্বারা Seek সমর্থিত হয় না" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "ইনপুট স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের অনুমতি নেই" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "স্ট্রিমের ক্ষেত্রে ট্রানকেট অর্থাৎ ছাঁটাইয়ের সমর্থন নেই" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "টোকেনের সংখ্যা সঠিক নয় (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s ক্লাসের নামের জন্য কোনো ধরন নির্ধারিত হয়নি" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেস বাস্তবায়িত হয় না" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "সংস্করণ সংখ্যা সটিকরূপে গঠিত হয়নি: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s ধরন দ্বারা GIcon ইন্টারফেসের মধ্যে from_tokens() বাস্তবায়িত হয় না" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "উপলব্ধ আইকন এনকোডিং-র সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "স্ট্রিমের ক্ষেত্রে অসমাপ্ত কর্ম উপস্থিত রয়েছে" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "সকেটের ঠিকানার জন্য পর্যাপ্ত স্থান উপলব্ধ নেই" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "সকেটের ঠিকানা সমর্থিত নয়" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "আবর্জনা সমর্থিত হয় না" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ফাইলের নাম অবৈধ: %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ফাইল-সিস্টেম সংক্রান্ত তথ্য প্রাপ্ত করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "root ডিরেক্টরির নাম পরিবর্তন করা সম্ভব নয়" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "" +"ফাইলের নাম পরিবর্তন করা যায়নি, নতুন নামের একটি ফাইলের নাম বর্তমানে উপস্থিত রয়েছে" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "ফাইলের নাম বৈধ নয়" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "ফাইল খুলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "ডিরেক্টরি খুলতে সমস্যা" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "ফাইলটি আবর্জনায় স্থানান্তর করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "আবর্জনার ডিরেক্টরি %s নির্মাণ করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "আবর্জনার ঊর্ধ্বতন ডিরেক্টরি সনাক্ত করতে ব্যর্থ" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "আবর্জনার ডিরেক্টরি সনাক্ত অথবা নির্মাণ করতে ব্যর্থ" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "trashing info ফাইল নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ফাইল বর্জন করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "ডিরেক্টরি নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' সিম্বোলিঙ্ক লিঙ্ক পড়তে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "সিম্‌বলিক লিঙ্ক নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "ফাইল স্থানান্তর করতে সমস্যা: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "ব্যাক-আপ ফাইল নির্মাণ করতে ব্যর্থ" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "উদ্দিষ্ট ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "মাউন্ট করা অবস্থানের মধ্যে স্থানান্তর করা সম্ভব নয়" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "অ্যাট্রিবিউটের ক্ষেত্রে NULL-ব্যতীত অন্য মান নির্ধারণ করা আবশ্যক" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (string প্রত্যাশিত)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "প্রসারিত অ্যাট্রিবিউটের নাম অবৈধ" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "প্রসারিত অ্যাট্রিবিউট '%s'-কে নির্ধারণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "ফাইল '%s' stat করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (অবৈধ এনকোডিং)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ফাইলের বিবরণ stat করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (প্রত্যাশিত uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "অ্যাট্রিবিউটের ধরন বৈধ নয় (byte string প্রত্যাশিত)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "সিমলিংকের অনুমতি নির্ধারণ করতে ব্যর্থ" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "অনুমতি নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "মালিকানা নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "সিম্‌-লিঙ্ক NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "সিম্‌-লিঙ্ক নির্ধারণ করতে ত্রুটি: ফাইলটি সিম্‌-লিঙ্ক নয়" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "পরিবর্তন অথবা ব্যবহারের সময় নির্ধারণ করতে সমস্যা: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux কনটেক্সটের NULL-ব্যাতীত মান হওয়া আবশ্যক" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux কনটেক্সট নির্ধারণ করতে ব্যর্থ: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "এই সিস্টেমে SELinux সক্রিয় করা হয়নি" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s অ্যাট্রিবিউটের মান নির্ধারণ সমর্থিত নয়" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ফাইলের মধ্যে seek করতে সমস্যা: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "স্থানীয় ডিরেক্টরি নিয়ন্ত্রণের ডিফল্ট ধরন সন্ধান করতে ব্যর্থ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "পুরোনো ব্যাক-আপের লিংক মুছে ফেলতে ত্রুটি: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ব্যাক-আপ প্রতিলিপি নির্মাণ করতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "অস্থায়ী ফাইলের নাম পরিবর্তন করতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "ফাইল ট্রানকেট (ছাঁটাই) করতে সমস্যা %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ফাইল '%s' খুলতে সমস্যা: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "উদ্দিষ্ট ফাইলটি একটি ডিরেক্টরি" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "উদ্দিষ্ট ফাইলটি সাধারণ ফাইল নয়" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "ফাইলটি স্বতন্ত্ররূপে পরিবর্তন করা হয়েছে" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "পুরোনো ফাইল মুছে ফেলতে সমস্যা: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "অবৈধ GSeekType উল্লিখিত হয়েছে" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "অবৈধ seek-র অনুরোধ" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ট্রানকেট করতে ব্যর্থ" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তনযোগ্য নয়" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "মেমরি আউটপুট স্ট্রিমের মাপ পরিবর্তন করতে ব্যর্থ" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount দ্বারা সুসংগতভাবে সামগ্রীর ধরন অনুমান করা সম্ভব নয়" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' হোস্ট-নেমের মধ্যে '[' উপস্থিত রয়েছে কিন্তু ']' অনুপস্থিত" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "আউটপুট স্ট্রিম দ্বারা write বাস্তবায়িত হয় না" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "মূল স্ট্রিম বর্তমানে বন্ধ করা হয়েছে" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' মীমাংসা করতে ব্যর্থ: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "বিপরীত দিশায় '%s' মীমাংসা করতে ব্যর্থ: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-র পরিসেবার কোনো রেকর্ড অনুপস্থিত" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "সাময়িকভাবে '%s' মীমাংসা করতে ব্যর্থ" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' মীমাংসা করতে ত্রুটি" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +#, fuzzy +msgid "[SCHEMA[:PATH]]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "অজানা বিকল্প %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "অবৈধ সকেট, আরম্ভ করা হয়নি" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "অবৈধ সকেট, চিহ্নিত কারণে আরম্ভ করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "সকেট বর্তমানে বন্ধ করা হয়েছে" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd থেকে GSocket নির্মাণ করা হচ্ছে: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "সকেট নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "অজানা প্রোটোকল নির্ধারণ করা হয়" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "স্থানীয় ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "দূরবর্তী ঠিকানা প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "অপেক্ষা করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "ঠিকানার সাথে বাইন্ড করতে ত্রুটি: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "সংযোগ গ্রহণ করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "সংযোগ স্থাপন করতে ব্যর্থ: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "সংযোগ বর্তমানে স্থাপিত হচ্ছে" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "সংযোগ স্থাপন করতে ত্রুটি: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "অপেক্ষারত ত্রুটি প্রাপ্ত করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "তথ্য প্রাপ্ত করতে ত্রুটি: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "তথ্য পাঠাতে ত্রুটি: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "সকেট নির্মাণ করতে ব্যর্থ: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "সকেট বন্ধ করতে ত্রুটি: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "সকেটের অবস্থা প্রাপ্ত করতে অপেক্ষা করা হচ্ছে: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "বার্তা পাঠাতে ত্রুটি: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "উইন্ডোর GSocketControlMessage মধ্যে সমর্থিত নয়" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "বার্তা প্রাপ্ত করতে ত্রুটি: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "সংযোগ স্থাপনকালে অজানা সমস্যা" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "লিসেনার বর্তমানে বন্ধ করা আছে" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "যোগ করা সকেট বর্তমান বন্ধ করা আছে" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GEmblemedIcon এনকোডিং-র %d সংস্করণ ব্যবস্থাপনা করা সম্ভব নয়" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "à§§-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি প্রাপ্ত হয়েছে" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "অপ্রত্যাশিত প্রকৃতির অনুষঅঙ্গিক তথ্য" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "একটি fd প্রত্যাশিত, কিন্তু %d প্রাপ্ত হয়েছে\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "অবৈধ fd প্রাপ্ত হয়েছে" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "তথ্য পাঠাতে ত্রুটি: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ফাইলের নাম পরিবর্তনে সমস্যা: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "à§§-টি কনট্রোল বার্তা প্রত্যাশিত, %d-টি প্রাপ্ত হয়েছে" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix থেকে পড়তে সমস্যা: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix বন্ধ করতে সমস্যা: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "ফাইল-সিস্টেমের root" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix-এ লিখতে সমস্যা: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "এই সিস্টেমের মধ্যে অ্যাবস্ট্র্যাক্ট unix ডোমেইন সকেট ঠিকানা সমর্থিত নয়" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ভলিউম দ্বারা eject অথবা eject_with_operation প্রয়োগ করা সম্ভব নয়" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "অ্যাপ্লিকেশন পাওয়া যায়নি" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "অ্যাপ্লিকেশন আরম্ভ করতে সমস্যা: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI সমর্থিত নয়" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "সংসর্গ সম্বন্ধীয় পরিবর্তনগুলি win32-র মধ্যে সমর্থিত নয়" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "সংসর্গ নির্ধারণ win32-র মধ্যে সমর্থিত নয়" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ফাইল থেকে পড়তে সমস্যা: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ফাইল বন্ধ করতে সমস্যা: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ফাইলে লিখতে সমস্যা: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "মেমরি অবশিষ্ট নেই" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "অভ্যন্তরীণ সমস্যা" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "হোস্ট-নেম বৈধ নয়" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "পূর্বাহ্ন" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "অপরাহ্ন" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ডিরেক্টরির উপর ডিরেক্টরি স্থানান্তর করা যাবে না" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s ধরন কোনো শ্রেণীর মধ্যে অন্তর্ভুক্ত নয়" + +#, 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.po b/po/bs.po new file mode 100644 index 0000000..4f71c0e --- /dev/null +++ b/po/bs.po @@ -0,0 +1,3819 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2004-05-17 01:30+0000\n" +"Last-Translator: Kenan Hadžiavdić \n" +"Language-Team: Bosnian \n" +"Language: bs\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:780 +#, 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:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nisam mogao pokrenuti pretvaranje iz '%s' u '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Djelimičan niz znakova na kraju ulaznih podataka" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne mogu pretvoriti '%s' u znakovni skup '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI lokalne datoteke '%s' ne smije sadržavati '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' je nevažeći" + +#: ../glib/gconvert.c:1925 +#, 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:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sadrži nevažeće escape znakove" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja '%s' nije absolutna putanja" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Nevažeće ime računara" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Januar" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Februar" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Mart" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Ponedjeljak" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Utorak" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Srijeda" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Četvrtak" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Petak" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Subota" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Nedjelja" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pon" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Uto" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Sri" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Čet" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pet" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sub" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ned" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "NeuspjeÅ¡no čitanje datoteke '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "NeuspjeÅ¡no otvaranje datoteke '%s': fdopen() neuspjeÅ¡an: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablon '%s' ne zavrÅ¡ava sa XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "NeuspjeÅ¡no čitanje simboličkog linka '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka u %d. redu, znak %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neispravno UTF-8 kodirani tekst" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Primijećen prazan entitet '&;'; važeći entiteti su: & " < > " +"'" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nepoznato ime entiteta '%s'" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi elementom (npr. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' je zatvoren, trenutno nema otvorenih elemenata" + +#: ../glib/gmarkup.c:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je bio prazan ili je sadržavao samo prazna polja" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Neočekivan kraj dokumenta nakon otvorene zagrade '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Neočekivan kraj dokumenta unutar imena elementa" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Neočekivan kraj dokumenta unutar imena osobine" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Neočekivan kraj dokumenta unutar oznake za otvaranje elementa" + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Neočekivan kraj dokumenta unutar vrijednosti atributa" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Neočekivan kraj dokumenta unutar komentara ili instrukcije procesiranja" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal zavrÅ¡ava djelimičnim znakom" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "NedovrÅ¡ena referenca znaka" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "NedovrÅ¡ena referenca znaka" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "NedovrÅ¡ena referenca znaka" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "NedovrÅ¡ena referenca entiteta" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citat ne počinje navodnim znakom" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst je bio prazan (ili je sadržavao samo prazna polja)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "NeuspjeÅ¡no čitanje podataka iz podređenog procesa" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "NeuspjeÅ¡no čitanje iz podređene cijevi (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "NeuspjeÅ¡an prelazak u direktorij '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "NeuspjeÅ¡no pokretanje podređenog procesa (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Nevažeće ime računara" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Nevažeći niz u unosu za pretvaranje" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "NeuspjeÅ¡no pokretanje pomoćnog programa" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "NeuspjeÅ¡no čitanje podataka iz podređenog procesa (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekivana greÅ¡ka u waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "NeuspjeÅ¡an fork (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "NeuspjeÅ¡no izvrÅ¡avanje podređenog procesa \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "NeuspjeÅ¡no pokretanje fork() za podređeni proces (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka tokom izvrÅ¡enja podređenog procesa \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Znak izvan raspona za UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Nevažeći niz u unosu za pretvaranje" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Znak izvan raspona za UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Nevažeće ime računara" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Nevažeće ime računara" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' sadrži nevažeće escape znakove" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Nevažeći niz bajtova u ulaznim podacima za pretvaranje" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Znak '%s' je nevažeći u imenu entiteta" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Znak '%s' je nevažeći u imenu entiteta" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Znak '%s' je nevažeći u imenu entiteta" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Nevažeće ime računara" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Nevažeće ime računara" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "NeuspjeÅ¡no čitanje simboličkog linka '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Neočekivan kraj dokumenta unutar imena osobine" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka tokom otvaranja direktorija '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Nevažeće ime računara" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Nisam mogao dodijeliti %lu bajtova za čitanje datoteke \"%s\"" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "NeuspjeÅ¡no pravljenje datoteke '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka tokom pretvaranja: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Simbolički linkovi nisu podržani" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "GreÅ¡ka tokom čitanja datoteke '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/ca.po new file mode 100644 index 0000000..3779d6b --- /dev/null +++ b/po/ca.po @@ -0,0 +1,4740 @@ +# 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. +# Sílvia Miranda , 2011. +# Gil Forcada , 2008-2012. +# Jordi Serratosa , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.8\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-21 18:44+0000\n" +"PO-Revision-Date: 2012-09-22 09:42+0200\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de comptatge passat a %s és massa llarg" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "No està implementada la cerca en el flux base" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "No es pot truncar el GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Ja està tancat el flux" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "No es permet truncar en els fluxos base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "L'objecte no és vàlid, no s'ha inicialitzat" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "La seqüència de múltiples bytes de l'entrada no és completa" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "No hi ha prou espai a la destinació" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "S'ha produït un error durant la conversió: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "La cancel·lació de la inicialització no està implementada" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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» i «%s»" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipus %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipus de fitxer %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "Aquest sistema operatiu no implementa les GCredentials" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "La vostra plataforma no implementa les GCredentials" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "No s'esperava un final de flux tan aviat" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "No es permet la clau «%s» en l'entrada de l'adreça «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"L'adreça «%s» no és vàlida (ha de ser, o bé un camí, o bé un tmpdir -" +"directori temporal-, o bé unes claus abstractes)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "L'entrada d'adreça «%s» té una parella clau/valor que no té sentit" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Hi ha un error a l'adreça «%s»: l'atribut del port no està ben format" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: l'atribut de la família no està ben format" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "L'element d'adreça «%s» no conté dos punts (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"La parella de clau/valor %d, «%s», a l'element d'adreça «%s», no conté un " +"signe d'igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"S'ha produït un error en suprimir l'escapament d'una clau o d'un valor en la " +"parella clau/valor %d, «%s», de l'element d'adreça «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Hi ha un error a l'adreça «%s»: el transport unix requereix que hi hagi " +"establerta exactament una clau, o bé de tipus «path» (camí), o bé de tipus " +"«abstract» (abstracte)" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: manca o està mal format l'atribut del nom " +"d'ordinador" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: manca o està mal format l'atribut del port " + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: l'atribut noncefile no existeix o està mal " +"format " + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "S'ha produït un error en executar-se automàticament: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"El transport «%s» per a l'adreça «%s» és desconegut o no està implementat" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "S'ha produït un error en obrir el fitxer nonce «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "S'ha produït un error en llegir el fitxer nonce «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"S'ha produït un error en llegir el fitxer nonce «%s»: s'esperaven 16 bytes " +"però se n'han obtingut %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"S'ha produït un error en escriure els continguts del fitxer nonce «%s» al " +"flux:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "L'adreça que s'ha indicat és buida" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" +"No es pot engendrar un bus de missatge si s'executa com un altre usuari " +"(setuid)" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"No es pot engendrar un bus de missatge sense un identificador de màquina: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "S'ha produït un error en engendrar la línia d'ordres «%s»: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Premeu qualsevol tecla per tancar aquesta finestra)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"El bus de sessió (D-Bus) no està en funcionament i l'arrencada automàtica no " +"ha funcionat" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"No s'ha pogut determinar l'adreça del bus de sessió (no està implementat en " +"aquest sistema operatiu)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"No es pot determinar l'adreça del bus a través de la variable d'entorn " +"«DBUS_STARTER_BUS_TYPE»: conté un valor desconegut «%s»" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"No es pot determinar l'adreça del bus perquè la variable d'entorn " +"«DBUS_STARTER_BUS_TYPE» no està establerta" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipus de bus desconegut %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "S'ha trobat una inesperada falta de contingut en llegir una línia" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"S'ha trobat una inesperada falta de contingut en llegir (de forma segura) " +"una línia" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"S'han exhaurit tots els mecanismes d'autenticació disponibles (s'han provat: " +"%s) (hi ha disponibles: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" +"S'ha cancel·lat a través de GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "S'ha produït un error en obtenir la informació del directori «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Els permisos del directori «%s» no estan ben formats. S'esperava el mode " +"0700 però s'ha obtingut el 0%o." + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "S'ha produït un error en crear el directori «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "S'ha produït un error en obrir l'anell de claus «%s» per llegir-lo: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"La línia %d de l'anell de claus a «%s» amb el contingut «%s» no està ben " +"formada" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El primer testimoni de la línia %d de l'anell de claus a «%s» amb el " +"contingut «%s» no està ben format" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El segon testimoni de la línia %d de l'anell de claus a «%s» amb el " +"contingut «%s» no està ben format" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"No s'ha trobat la galeta amb l'identificador %d a l'anell de claus a «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "S'ha produït un suprimir el fitxer de blocatge antic «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "S'ha produït un error en crear el fitxer de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "" +"S'ha produït un error en tancar el fitxer (no enllaçat) de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "S'ha produït un error en desenllaçar el fitxer de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" +"S'ha produït un error en obrir l'anell de claus «%s» per a escriptura: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" +"(A més a més, l'alliberació del blocatge per a «%s» també ha fallat: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "La connexió està tancada" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "S'ha esgotat el temps d'espera" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"S'han trobat senyaladors no implementats en construir-se la part de la " +"connexió del client" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"No existeix la interfície «org.freedesktop.DBus.Properties» en l'objecte al " +"camí %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"S'ha produït un error en establir la propietat «%s»: s'esperava el tipus " +"«%s» però s'ha obtingut el «%s»" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "No existeix la propietat «%s»" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "La propietat «%s» no és de lectura" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "La propietat «%s» no és d'escriptura" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "No existeix la interfície «%s»" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "No existeix la interfície" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No existeix la interfície «%s» en l'objecte al camí %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "No existeix el mètode «%s»" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "El tipus de missatge «%s» no correspon al tipus «%s» que s'esperava" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Ja hi ha un objecte exportat per a la interfície %s a %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "El mètode «%s» ha retornat un tipus «%s» però s'esperava «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "No existeix el mètode «%s» a la interfície «%s» amb la signatura «%s»" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ja està exportat un subarbre per a %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "el tipus és no vàlid" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Missatge «METHOD_CALL»: manca el camp de capçalera «PATH» o «MEMBER»" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Missatge «METHOD_RETURN»: manca el camp de capçalera «REPLY_SERIAL»" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Missatge «ERROR»: manca el camp de capçalera «REPLY_SERIAL» o «ERROR_NAME»" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Missatge «SIGNAL»: manca el camp de capçalera «PATH», «INTERFACE» o «MEMBER»" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Missatge «SIGNAL»: el camp de la capçalera «PATH» utilitza el valor reservat " +"«/org/freedesktop/DBus/Local»" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"missatge «SIGNAL»: el camp de capçalera «INTERFACE» utilitza el valor " +"reservat «org.freedesktop.DBus.Local»" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Es volia llegir %lu byte però s'ha rebut un «EOF»" +msgstr[1] "Es volien llegir %lu bytes però s'ha rebut un «EOF»" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"S'esperava una cadena UTF-8 vàlida però s'han trobat bytes no vàlids a " +"l'òfset %d (la llargada de la cadena és %d). La cadena UTF-8 vàlida fins " +"aquell moment era «%s»" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"S'esperava el byte «NUL» després de la cadena «%s» però s'ha trobat el byte " +"%d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "El valor analitzat «%s» no és un camí d'objecte D-Bus vàlid" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "El valor analitzat «%s» no és una signatura D-Bus vàlida" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"S'ha trobat una matriu de llargada %u byte. La llargada màxima és de 2<<26 " +"bytes (64 MiB)." +msgstr[1] "" +"S'ha trobat una matriu de llargada %u bytes. La llargada màxima és de 2<<26 " +"bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "El valor analitzat «%s» per variant no és una signatura D-Bus vàlida" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"S'ha produït un error en convertir a estructura de dades la GVariant amb el " +"tipus de cadena «%s» del format de cable D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor d'ordenació de bits (endianness) no vàlid. S'esperava 0x6c («l») o " +"0x42 («B») però s'ha trobat el valor 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versió major del protocol no vàlida. S'esperava 1 però s'ha trobat %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"S'ha trobat la capçalera de la signatura amb la signatura «%s», però el cos " +"és buit" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "El valor analitzat «%s» no és una signatura de D-Bus vàlida (pel cos)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"No hi ha cap capçalera de la signatura en el missatge, però el cos és de %u " +"byte" +msgstr[1] "" +"No hi ha cap capçalera de la signatura en el missatge, però el cos és de %u " +"bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "No s'ha pogut tornar a convertir el missatge a estructura de dades: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"No s'ha pogut convertir a seqüència de bits la GVariant de tipus cadena «%s» " +"al format de cable D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"El missatge conté %d descriptors de fitxers, però el camp de la capçalera " +"n'indica %d" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "No s'ha pogut convertir a seqüència de bits el missatge: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"El cos del missatge té la signatura «%s» però no hi ha cap capçalera de " +"signatura" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"El cos del missatge té el tipus de signatura «%s» però la signatura en el " +"camp de la capçalera és «%s»" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"El cos del missatge és buit però la signatura en el camp de la capçalera és " +"«(%s)»" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "S'ha retornat un error amb el cos de tipus «%s»" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "S'ha retornat un error amb el cos buit" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "No s'ha pogut obtenir el perfil de maquinari: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"No s'ha pogut carregar «/var/lib/dbus/machine-id» o «/etc/machine-id»: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "S'ha produït un error en cridar «StartServiceByName» per a %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" +"S'ha obtingut una resposta inesperada %d per al mètode «StartServiceByName" +"(\"%s\")»" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"No es pot invocar el mètode: el servidor intermediari és per a un nom ben " +"conegut sense cap propietari i el servidor intermediari s'ha construït amb " +"el senyalador «G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START»" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "No es pot utilitzar l'espai de noms abstracte" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "No es pot especificar el fitxer «nonce» quan es crea un servidor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "S'ha produït un error en escriure el fitxer «nonce» a «%s»: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La cadena «%s» no és un GUID vàlid de D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "No es pot escoltar «%s», és un transport desconegut" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "ORDRE" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Ordres:\n" +" help Mostra aquesta informació\n" +" introspect Introspecciona un objecte remot\n" +" monitor Fa un seguiment d'un objecte remot\n" +" call Invoca un mètode en l'objecte remot\n" +" emit Emet un senyal\n" +"\n" +"Utilitzeu «%s ORDRE --help» per veure l'ajuda de cada ordre en particular.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "S'ha produït un error: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "S'ha produït un error en analitzar la introspecció XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Connecta al bus del sistema" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Connecta al bus de la sessió" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Connecta a l'adreça de D-Bus donada" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opcions del punt final de connexió:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opcions d'especificació del punt final de connexió" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "No s'ha especificat el punt final de connexió" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "S'han especificat més d'un punt final de connexió" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Avís: d'acord amb les dades d'introspecció no existeix la interfície «%s»\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Avís: d'acord amb les dades d'introspecció no existeix el mètode «%s» a la " +"interfície «%s»\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Destinació opcional del senyal (nom únic)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Camí a l'objecte al qual se li enviarà un senyal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Senyal i nom d'interfície" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Envia un senyal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "S'ha produït un error en connectar-se: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: no s'ha especificat el camí a l'objecte.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: «%s» no és un camí d'objecte vàlid\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: no s'ha especificat el senyal.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Error: el senyal no pot ser un nom parcial.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s no és un nom d'interfície vàlid\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s no és un nom de membre vàlid\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s no és un nom de bus únic vàlid.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "S'ha produït un error en analitzar el paràmetre %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "S'ha produït un error en buidar la connexió: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nom de destinació on invocar el mètode" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Camí a l'objecte on invocar el mètode" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Mètode i nom d'interfície" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Temps d'espera, en segons" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Invoca un mètode en un objecte remot." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: no s'ha especificat la destinació\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: no s'ha especificat el camí a l'objecte\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: no s'ha especificat el nom del mètode\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: el nom del mètode «%s» no és vàlid\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" +"S'ha produït un error en analitzar el paràmetre %d del tipus «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nom de destinació a introspeccionar" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Camí a l'objecte a introspeccionar" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Imprimeix XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspecciona el fill" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Només mostra les propietats" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspecciona un objecte remot." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nom de destinació al qual se li vol fer un seguiment" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Camí a l'objecte al qual se li vol fer un seguiment" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Fes el seguiment a un objecte remot." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sense nom" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "El fitxer d'escriptori no especificava el camp d'execució" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "A la informació d'aplicació li manca un identificador" + +#: ../gio/gdesktopappinfo.c:2069 +#, 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:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Definició personalitzada per a %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unitat no implementa l'expulsió o «eject_with_operation»" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "la unitat no implementa el sondeig per si hi ha un suport" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "la unitat no implementa la inicialització" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "la unitat no implementa l'aturada" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "El TLS no està implementat" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "S'esperava un GEmblem per a un GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "No existeix el punt de muntatge contenidor" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "No es pot copiar al directori" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "No es pot copiar el directori al directori" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Ja existeix el fitxer de destinació" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "No es pot copiar el directori de forma recursiva" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "No es pot empalmar" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "S'ha produït un error en empalmar el fitxer: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "No es pot copiar el fitxer especial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "No es pot utilitzar la paperera" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "En els noms de fitxers no pot haver-hi «%c»" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "el volum no implementa el muntatge" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "" +"No hi ha cap aplicació que s'hagi registrat per gestionar aquest fitxer" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "L'enumerador està tancat" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador de fitxer té una operació pendent" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "El flux no implementa «query_info»" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "No està implementada la cerca en el flux" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "No es permet truncar en els fluxos d'entrada" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "No es permet truncar en els fluxos" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de testimonis erroni (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "El nom de classe %s no té tipus" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipus %s no implementa la interfície GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipus %s no té classe" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "El número de versió no és format correctament: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "" +"No es pot gestionar la versió proporcionada de la codificació de la icona" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "No s'ha especificat cap adreça" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "L'adreça és massa llarga (%u)" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "L'adreça conté bits més enllà de la llargada del prefix" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "No s'ha pogut analitzar «%s» com a màscara d'adreça IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "No hi ha prou espai per a l'adreça del sòcol" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "L'adreça de sòcol no és compatible" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "El flux té una operació pendent" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "No es permet posar l'element <%s> dins de <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "No es permet posar l'element <%s> al primer nivell" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "El fitxer %s existeix més d'una vegada en els recursos" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "No s'ha pogut trobar «%s» en cap directori de recursos" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "No s'ha pogut trobar «%s» en el directori actual" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Es desconeix l'opció de processament «%s»" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "No s'ha pogut crear el fitxer temporal: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"S'ha produït un error en processar el fitxer d'entrada amb l'xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"S'ha produït un error en processar el fitxer d'entrada amb el to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "S'ha produït un error en llegir el fitxer %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "S'ha produït un error en comprimir el fitxer %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "no pot haver-hi text dins de <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "el nom del fitxer de sortida" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FITXER" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Els directoris des d'on s'han de llegir els fitxers (per defecte és el " +"directori actual)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORI" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Genera la sortida en el format seleccionat per l'extensió del nom de fitxer " +"de destinació" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Genera la capçalera del codi" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Genera el codi font que es fa servir per enllaçar el fitxer de recurs amb el " +"codi" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Genera una llista de dependències" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "No creïs ni registris automàticament els recursos" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "" +"El nom de l'identificador de C que s'utilitzarà en el codi font generat" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compila una especificació de recursos en un fitxer de recursos.\n" +"Els fitxers d'especificació de recursos tenen l'extensió .gresource.xml\n" +"i els fitxers de recursos tenen l'extensió .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Heu de donar un sol nom de fitxer\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "o es permet utilitzar noms buits" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"el nom «%s» no és vàlid: els noms han de començar amb una lletra minúscula" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"el nom «%s» no és vàlid: el caràcter «%c» no és vàlid. Només es permeten " +"lletres minúscules, nombres i el guionet («-»)." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"el nom «%s» no és vàlid: no es poden posar dos guionets seguits («--»)." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "el nom «%s» no és vàlid: l'últim caràcter no pot ser un guionet («-»)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "el nom «%s» no és vàlid: la llargada màxima és de 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr "ja està especificat " + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "no es poden afegir claus a un esquema del tipus «list-of»" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr "ja està especificat " + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +"La emmascara la a . " +"Utilitzeu per modificar-ne el valor." + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"l'atribut de la ha de ser necessàriament «type», «enum» o «flags»" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "(encara) no s'ha definit <%s id='%s'>." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "el tipus de cadena GVariant «%s» no és vàlid" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "s'ha indicat però l'esquema no està ampliant res" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "no hi ha cap a sobreescriure" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr "ja s'ha especificat " + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr "ja s'ha especificat " + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "el amplia l'esquema «%s» que encara no existeix" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" +"el és una llista d'un esquema «%s» que encara no existeix" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "No pot ser una llista d'un esquema amb un camí" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "No es pot ampliar un esquema amb un camí" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +"El és una llista i amplia el que no és una " +"llista" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +"El amplia el " +"però «%s» no amplia «%s»" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "si es dóna un camí ha de començar i acabar amb una barra inclinada" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "el camí d'una llista ha d'acabar amb «:/»" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "ja s'ha especificat <%s id='%s'>" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "No es permet posar l'element <%s> al primer nivell" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "S'ha especificat «--strict», se surt.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "S'ha ignorat el fitxer sencer.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "S'està ignorant aquest fitxer.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " +"sobreescriptura «%s»" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; s'està ignorant la sobreescriptura d'aquesta clau.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " i s'havia especificat «--strict», se surt.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " +"sobreescriptura «%s»: %s." + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "S'està ignorant la sobreescriptura d'aquesta clau.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"la sobreescriptura de la clau «%s» de l'esquema «%s» en el fitxer de " +"sobreescriptura «%s» és fora de l'interval de l'esquema donat" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"la sobreescriptura de la clau «%s» de l'esquema «%s» en el fitxer de " +"sobreescriptura «%s» no és a la llista de valors vàlids" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "on desar el fitxer gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Interromp si hi ha cap error en els esquemes" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "No escriguis el fitxer gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "No siguis estricte amb les restriccions dels noms de les claus" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compila tots els fitxers d'esquema GSettings en una memòria cau d'esquemes.\n" +"Els fitxers d'esquema han de tenir l'extensió .gschema.xml\n" +"i el fitxer de memòria cau es dirà gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Heu de donar un sol nom de directori\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "No s'ha trobat cap fitxer d'esquemes: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "no facis res.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "suprimeix el fitxer de sortida actual.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "El nom del fitxer no és vàlid: %s" + +#: ../gio/glocalfile.c:967 +#, 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:1135 +msgid "Can't rename root directory" +msgstr "No es pot canviar el nom del directori arrel" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "No es pot canviar el nom del fitxer, ja existeix aquest nom" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nom de fitxer no vàlid" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "No s'ha pogut obrir el directori" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: ../gio/glocalfile.c:1860 +#, 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:1883 +#, 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:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "No s'ha pogut trobar el directori superior per a la paperera" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "No s'ha pogut trobar o crear el directori de la paperera" + +#: ../gio/glocalfile.c:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No s'ha pogut enviar el fitxer a la paperera: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "error intern" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "S'ha produït un error en crear el directori: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de fitxers no implementa enllaços simbòlics" + +#: ../gio/glocalfile.c:2218 +#, 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:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "S'ha produït un error en moure el fitxer: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "No s'ha pogut moure el directori al directori" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Ha fallat la creació del fitxer de còpia de seguretat" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "No està implementat el moure entre muntatges" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "El valor de l'atribut no pot ser nul" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "El nom de l'atribut ampliat no és vàlid" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "S'ha produït un error en establir l'atribut ampliat «%s»: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (codificació no vàlida)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "S'ha produït un error en obtenir informació del fitxer «%s»: %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "" +"S'ha produït un error en obtenir informació del descriptor de fitxer: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "No es poden establir permisos en els enllaços simbòlics" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "S'ha produït un error en establir el propietari: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "l'enllaç simbòlic no pot ser nul" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, 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:2248 +msgid "SELinux context must be non-NULL" +msgstr "El context del SELinux no pot ser nul" + +#: ../gio/glocalfileinfo.c:2263 +#, 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:2270 +msgid "SELinux is not enabled on this system" +msgstr "Aquest sistema no té habilitat el SELinux" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "No està implementat establir l'atribut %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "S'ha produït un error en llegir des del fitxer: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "S'ha produït un error en cercar en el fitxer: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "S'ha produït un error en tancar el fitxer: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "S'ha produït un error en escriure al fitxer: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "S'ha produït un error en truncar el fitxer: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "S'ha produït un error en obrir el fitxer «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "El fitxer objectiu és un directori" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "El fitxer objectiu no és un fitxer regular" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "El fitxer ha estat modificat des d'alguna aplicació externa" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "S'ha produït un error en suprimir el fitxer vell: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "El GSeekType proporcionat no és vàlid" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "La sol·licitud de cerca és no vàlida" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No es pot truncar el GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "El flux de sortida de memòria no és modificable" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Ha fallat el redimensionament de la memòria del flux de sortida" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +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:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nom de l'ordinador «%s» conté «[» però no «]»" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "No es pot accedir a la xarxa" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "No es pot accedir a la màquina" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "No s'ha pogut crear el monitor de xarxa: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "No s'ha pogut crear el monitor de xarxa: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "No s'ha pogut obtenir l'estat de la xarxa: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "El flux de sortida no implementa l'escriptura" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "El flux font ja està tancat" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "S'ha produït un error en resoldre «%s»: %s" + +#: ../gio/gresolver.c:967 +#, 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:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "No hi ha cap registre del tipus sol·licitat al DNS per «%s»" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "No s'ha pogut resoldre «%s» de forma temporal" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "S'ha produït un error en resoldre «%s»" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "No s'han rebut totes les dades per «%s»" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "No existeix el recurs a «%s»" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "No s'ha pogut descomprimir el recurs «%s»" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "El recurs a «%s» no és un directori" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "El flux d'entrada no té implementada la cerca" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Mostra l'ajuda" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[ORDRE]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Llista les seccions que contenen recursos en un FITXER elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Llista recursos\n" +"Si s'especifica una SECCIÓ, només es llisten els recursos d'aquella secció\n" +"Si s'especifica un CAMÍ, només es llisten els recursos que hi coincideixin" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FITXER [CAMÍ]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECCIÓ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Llista els recursos amb les seves dades\n" +"Si s'especifica la SECCIÓ, només es mostren els recursos de la secció\n" +"Si s'especifica el CAMÍ, només es mostren els recursos que hi coincideixin\n" +"Les dades són la secció, la mida i la compressió" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extreu un fitxer de recurs a la sortida estàndard" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "CAMÍ AL FITXER" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Es desconeix l'ordre «%s»\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Ús:\n" +" gresource [--section SECCIÓ] ORDRE [ARGUMENTS...]\n" +"\n" +"Ordres:\n" +" help Mostra aquesta informació\n" +" sections Llista les seccions de recursos\n" +" list Llista els recursos\n" +" details Llista els recursos amb les seves dades\n" +" extract Extreu un recurs\n" +"\n" +"Utilitzeu «gresource help ORDRE» per obtenir informació més detallada.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilització:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Arguments:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECCIÓ El nom (opcional) d'una secció elf\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " ORDRE L'ordre (opcional) que s'explicarà\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FITXER Un fitxer elf (un fitxer binari o una biblioteca compartida)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FITXER Un fitxer elf (un fitxer binari o una biblioteca\n" +" compartida) o un fitxer de recurs compilat\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CAMÍ]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CAMÍ Un (opcional) camí (pot ser parcial) de recurs\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CAMÍ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CAMÍ Un camí de recurs\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No existeix l'esquema «%s»\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"No es pot canviar de lloc l'esquema «%s» (no s'ha d'especificar el camí)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Es pot canviar de lloc l'esquema «%s» (s'ha d'especificar el camí)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "S'ha donat un camí buit.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "El camí ha de començar amb una barra inclinada (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "El camí ha d'acabar amb una barra inclinada (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "El camí no pot contenir dues barres inclinades seguides (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "No existeix la clau «%s»\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "El valor proporcionat està fora del rang vàlid\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Llista els esquemes instal·lats (que no es poden canviar de lloc)" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Llista els esquemes instal·lats que es poden canviar de lloc" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Llista les claus a l'ESQUEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:CAMÍ]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Llista els fills de l'ESQUEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Llista les claus i els valors recursivament\n" +"Si no es passa cap ESQUEMA, es llista totes les claus\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:CAMÍ]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Obtén el valor de la CLAU" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:CAMÍ] CLAU" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Consulta el rang de valors vàlids per a la CLAU" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Estableix el valor de la CLAU a VALOR" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:CAMÍ] CLAU VALOR" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Reinicia la CLAU al seu valor predeterminat" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reinicia totes les claus de l'ESQUEMA als seus valors per defecte" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Comprova si la CLAU és d'escriptura" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Fes un seguiment de la CLAU per si hi ha canvis.\n" +"Si no s'especifica cap CLAU, es farà un seguiment a \n" +"totes les claus de l'ESQUEMA.\n" +"Utilitzeu ^C per deixar de fer el seguiment.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:CAMÍ] [CLAU]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilització:\n" +" gsettings [--schemadir DIRECTORI_D'ESQUEMES] ORDRE [ARGUMENTS...]\n" +"\n" +"Ordres:\n" +" help Mostra aquesta informació\n" +" list-schemas Llista els esquemes instal·lats\n" +" list-relocatable-schemas Llista els esquemes que es poden canviar de " +"lloc\n" +" list-keys Llista les claus d'un esquema\n" +" list-children Llista els fills d'un esquema\n" +" list-recursively Llista les claus i els valors recursivament\n" +" range Consulta el rang d'una clau\n" +" get Obtén el valor d'una clau\n" +" set Estableix el valor d'una clau\n" +" reset Reinicia el valor d'una clau\n" +" reset-recursively Reinicia tots els valors de l'esquema donat\n" +" writable Comprova si es pot escriure a la clau\n" +" monitor Fa un seguiment per si hi ha canvis\n" +"\n" +"Utilitzeu «gsettings help ORDRE» per veure l'ajuda més detallada.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Ús:\n" +" gsettings [--schemadir DIRECTORI_D'ESQUEMES] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" +" DIRECTORI_D'ESQUEMES Un directori on cercar-hi esquemes addicionals\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ESQUEMA El nom de l'esquema\n" +" CAMÍ El camí, pels esquemes que es poden canviar de lloc\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " CLAU La clau (opcional) de l'esquema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " CLAU La clau de l'esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALOR El valor a establir\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "S'ha donat un nom d'esquema buit\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "El sòcol no és vàlid, no està inicialitzat" + +#: ../gio/gsocket.c:293 +#, 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:301 +msgid "Socket is already closed" +msgstr "El sòcol ja és tancat" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "S'ha excedit el temps d'espera d'entrada/sortida del sòcol" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "s'està creant un GSocket a partir del descriptor de fitxer: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "No s'ha pogut crear el sòcol: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "S'ha especificat una família desconeguda" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "S'ha especificat un protocol desconegut" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "no s'ha pogut obtenir l'adreça local: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "no s'ha pogut obtenir l'adreça remota: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "no s'ha pogut escoltar: %s" + +#: ../gio/gsocket.c:1900 +#, 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:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "S'ha produït un error en unir-se a un grup de multidestinació: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "S'ha produït un error en deixar un grup de multidestinació: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Encara no es pot fer multidestinació des d'un origen concret" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "S'ha produït un error en acceptar la connexió: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Connexió en curs" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "No s'ha pogut obtenir l'error pendent: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "S'ha produït un error en rebre les dades: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "S'ha produït un error en enviar les dades: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "No s'ha pogut aturar el sòcol: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "S'ha produït un error en tancar el sòcol: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "S'està esperant la condició del sòcol: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "S'ha produït un error en enviar el missatge: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "El GSocketControlMessage no està implementat a Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "S'ha produït un error en rebre un missatge: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "Aquest sistema operatiu no implementa el «g_socket_get_credentials»" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "No s'ha pogut connectar al servidor intermediari %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "No s'ha pogut connectar a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "No s'ha pogut connectar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "S'ha produït un error desconegut en connectar-se" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "" +"Encara no es pot fer de servidor intermediari d'una connexió que no sigui " +"TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "El protocol del servidor intermediari «%s» no està implementat." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Ja està tancat el receptor de connexions" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "El sòcol que s'ha afegit és tancat" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "El SOCKSv4 no permet utilitzar adreces IPv6 «%s»" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "El nom d'usuari és massa llarg pel protocol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "El nom d'ordinador «%s» és massa llarg pel protocol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "El servidor no és un servidor intermediari de SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "S'ha rebutjat la connexió a través d'un servidor SOCKSv4" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "El servidor no és un servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "El servidor intermediari SOCKSv5 requereix autenticació." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"El servidor intermediari SOCKSv5 requereix un mètode d'autenticació que " +"encara no està implementat a la GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"El protocol SOCKSv5 no permet un nom d'usuari o de contrasenya d'aquesta " +"mida." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Ha fallat l'autenticació SOCKSv5 degut a un nom d'usuari o contrasenya " +"errònies." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "El nom d'ordinador «%s» és massa llarg pel protocol SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" +"El servidor intermediari SOCKSv5 utilitza un tipus d'adreça desconeguda." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "S'ha produït un error intern del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "El conjunt de regles no permet fer connexions SOCKSv5." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" +"No es pot arribar al servidor a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" +"No es pot arribar a la xarxa a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "S'ha refusat la connexió a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "El servidor intermediari SOCKSv5 no permet l'ús de l'ordre «connect»." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" +"El servidor intermediari SOCKSv5 no permet l'ús del tipus d'adreça " +"proporcionada." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "S'ha produït un error desconegut en el servidor intermediari SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, 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/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "No s'ha pogut desencriptar la clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "No s'ha trobat cap clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "No s'ha pogut analitzar la clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "No s'ha trobat cap certificat codificat amb PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "No s'ha pogut analitzar el certificat codificat amb PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Últim intent per introduir la contrasenya correctament abans que se us " +"bloquegi l'accés." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"S'han introduït diverses contrasenyes errònies i se us bloquejarà l'accés " +"després de més intents." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "La contrasenya introduïda no és correcte." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, 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:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Tipus de dades extres no esperades" + +#: ../gio/gunixconnection.c:195 +#, 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:211 +msgid "Received invalid fd" +msgstr "S'ha rebut un descriptor de fitxer no vàlid" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "S'ha produït un error en enviar les credencials: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"S'ha produït un error en la comprovació de si «SO_PASSCRED» és habilitat en " +"el sòcol: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"No s'esperava aquesta llargada de l'opció quan s'estava comprovant si " +"«SO_PASSCRED» és habilitat en el sòcol. S'esperaven %d bytes i n'eren %d." + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "S'ha produït un error en habilitar «SO_PASSCRED»: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"S'esperava llegir un sol byte per rebre les credencials però s'han llegit " +"zero bytes" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "No s'esperava un missatge de control però s'ha obtingut %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "S'ha produït un error en inhabilitar «SO_PASSCRED»: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "S'ha produït un error en llegir del descriptor de fitxer: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "S'ha produït un error tancant el descriptor de fitxer: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Arrel del sistema de fitxers" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "S'ha produït un error en escriure al descriptor de fitxer: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volum no implementa l'expulsió o «eject_with_operation»" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "No es pot trobar l'aplicació" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "S'ha produït un error en executar l'aplicació: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "No estan implementats els URI" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "els canvis associatius no estan implementats a win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "La creació associativa no està implementada a win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "S'ha produït un error en llegir del gestor: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "S'ha produït un error en tancar el gestor: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "S'ha produït un error en escriure al gestor: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "No hi ha prou memòria" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Error intern: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Fan falta més dades d'entrada" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Les dades comprimides no són vàlides" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adreça on s'escoltarà" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorat, per mantenir la compatibilitat amb el GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Mostra l'adreça" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Mostra l'adreça en mode intèrpret d'ordres" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Executa un servei de D-Bus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Els arguments no són vàlids\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, 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:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "No s'esperava l'etiqueta «%s» dins «%s»" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, 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:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, 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:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "No s'ha pogut ampliar la línia d'execució «%s» amb l'URI «%s»" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, 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:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI «%s» no és vàlid" + +#: ../glib/gconvert.c:1909 +#, 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:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI «%s» conté caràcters d'escapada no vàlids" + +#: ../glib/gconvert.c:2020 +#, 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:2030 +msgid "Invalid hostname" +msgstr "El nom de l'ordinador no és vàlid" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "A. M." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "P. M." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Gener" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Febrer" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Març" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maig" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juny" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juliol" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agost" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Setembre" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Octubre" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembre" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Desembre" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "gen" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "març" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maig" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "juny" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ag" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "set" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "oct" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "des" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Dilluns" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dimarts" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Dimecres" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Dijous" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Divendres" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Dissabte" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Diumenge" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "dl" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "dt" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "dm" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "dj" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "dv" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ds" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dg" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "S'ha produït un error en obrir el directori «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El fitxer «%s» és massa gran" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "No s'ha pogut llegir del fitxer «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"No s'han pogut obtenir els atributs del fitxer «%s»: ha fallat la funció " +"fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "No s'ha pogut crear el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"No s'ha pogut obrir el fitxer «%s» per escriure-hi: ha fallat la funció " +"fdopen(): %s" + +#: ../glib/gfileutils.c:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no conté XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, 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:2104 +msgid "Symbolic links not supported" +msgstr "No es poden utilitzar els enllaços simbòlics" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +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:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "El canal acaba en un caràcter parcial" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "No és un fitxer regular" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "El nom del grup no és vàlid: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "El fitxer de claus no comença amb un grup" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "El nom de la clau no és vàlid: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El fitxer de claus conté la codificació no implementada «%s»" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El fitxer de claus no té el grup «%s»" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El fitxer de claus no té la clau «%s»" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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 es pot " +"interpretar." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» en el grup «%s», que té un valor que " +"no es pot interpretar." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"La clau «%s» en el grup «%s» té el valor «%s» però s'esperava el valor %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El fitxer de claus conté la seqüència d'escapada no vàlida «%s»" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» no es pot interpretar com un nombre." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enter «%s» és fora de l'interval" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» no es pot interpretar com un nombre amb coma flotant." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no es pot interpretar com un booleà." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"No s'han pogut obtenir els atributs del fitxer «%s%s%s%s»: ha fallat la " +"funció fstat(): %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "" +"No s'ha pogut mapar el fitxer «%s%s%s%s»: ha fallat la funció mmap(): %s" + +#: ../glib/gmappedfile.c:260 +#, 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/gmarkup.c:353 ../glib/gmarkup.c:394 +#, 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:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» no és un nom vàlid " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» no és un nom vàlid: «%c» " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "S'ha produït un error a la línia %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S'ha detectat una entitat buida «&;». Les entitats vàlides són: & " " +"< > '." + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Es desconeix el nom d'entitat «%-.*s»" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "El document ha de començar amb un element (p. ex. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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 tancar " +"l'etiqueta d'element buit «%s»." + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "El document era buit o només contenia espais en blanc" + +#: ../glib/gmarkup.c:1721 +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:1729 ../glib/gmarkup.c:1774 +#, 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 que encara eren " +"oberts. «%s» era l'últim element obert." + +#: ../glib/gmarkup.c:1737 +#, 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:1743 +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:1749 +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:1754 +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:1760 +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:1767 +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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El document ha acabat de manera inesperada enmig d'un comentari o d'una " +"instrucció de processament" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Forma d'ús:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPCIÓ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opcions d'ajuda:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Mostra les opcions d'ajuda" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Mostra totes les opcions d'ajuda" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opcions de l'aplicació:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, 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:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor enter «%s» per a %s és fora de l'interval" + +#: ../glib/goption.c:1014 +#, 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:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor doble «%s» per a %s és fora de l'interval" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "S'ha produït un error en analitzar l'opció %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Manca un argument per a %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Es desconeix l'opció %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objecte malmès" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "error intern o objecte malmès" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "no hi ha prou memòria" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "s'ha arribat al límit de tornades enrere" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "s'ha arribat al límit de recurrències" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "la combinació de senyaladors de línia nova no és vàlida" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "desplaçament incorrecte" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "UTF-8 curt" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "bucle recursiu" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "error desconegut" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ al final del patró" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c al final del patró" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "caràcter no reconegut després de \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "nombres fora de l'interval en el quantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "nombre massa gran en el quantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "falta el «]» per a la classe de caràcter" + +#: ../glib/gregex.c:347 +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:350 +msgid "range out of order in character class" +msgstr "s'ha sortit de l'interval en la classe de caràcter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "no hi ha res per repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetició no esperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "no es reconeix el caràcter després de «(?» o «(?-»" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "falta un «)»" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referència a un subpatró que no existeix" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "falta un «)» després del comentari" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "l'expressió regular és massa llarga" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "no s'ha pogut obtenir memòria" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "hi ha un «)» sense el corresponent «(»" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "desbordament del codi" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "no es reconeix el caràcter després de «(?<»" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserció cap enrere no té llargada fixa" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "el nombre o el nom no estan ben formats després de «(?(»" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "el grup condicional conté més de dues branques" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "s'esperava una asserció després de «(?(»" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "«(?R» o «(?[+-]dígits» han d'anar seguits de «)»" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX desconeguda" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "no es poden utilitzar els elements d'ordenació de POSIX" + +#: ../glib/gregex.c:418 +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:421 +msgid "invalid condition (?(0)" +msgstr "condició «(?(0)» no vàlida" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no es permet \\C en assercions cap enrere" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" +"no s'admeten els caràcters d'escapada «\\L», «\\l», «\\N{nom}», «\\U» i «\\u»" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "la crida recursiva podria entrar en bucle indefinidament" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "no es reconeix el caràcter després de «(?P»" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "falta la finalització en el nom del subpatró" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dos noms de subpatró tenen el mateix nom" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "la seqüència «\\P» o «\\p» no està ben formada" + +#: ../glib/gregex.c:450 +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:453 +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:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "hi ha massa subpatrons amb nom (màxim de 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "el valor octal és més gran que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "s'ha produït un desbordament en compilar l'espai de treball" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "no s'ha trobat el subpatró referenciat comprovat anteriorment" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "el grup «DEFINE» conté més d'una branca" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opcions «NEWLINE» incoherents" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"després de «\\g» no hi ha cap número o cap nom o número entre claudàtors, " +"claus angulars o cometes" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "les referències numerades no poden ser zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "no es permeten arguments per «(*ACCEPT)», «(*FAIL)» o «(*COMMIT)»" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "no es reconeix «(*VERB)»" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "el número és massa gran" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "falta el nom del subpatró després de (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "s'esperava un dígit després de (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"el caràcter«]» no és un caràcter de dades vàlid en el mode de compatibilitat " +"amb JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "no s'accepten noms diferents per subpatrons del mateix número" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "«(*MARK)» ha de tenir un argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "després de «\\c» ha d'haver-hi un caràcter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"després de «\\k» no hi ha cap nom entre claudàtors, claus angulars o cometes" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "no es pot utilitzar \\N en una classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "hi ha massa referències cap endavant" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "el nom és massa llarg a «(*MARK)«, «(*PRUNE)«, «(*SKIP)» o «(*THEN)»" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "el valor del caràcter a la seqüència «\\u...» és massa llarg" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE no està compilada per interpretar UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La biblioteca PCRE no està compilada per interpretar les propietats UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "La biblioteca PCRE ha estat compilada amb opcions incompatibles" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "s'esperava un dígit hexadecimal o bé «}»" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "s'esperava un dígit hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "falta un «<» en la referència simbòlica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "la referència simbòlica no està acabada" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referència simbòlica de longitud zero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "s'esperava un dígit" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "la referència simbòlica no és vàlida" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "«\\» final extraviat" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "no es reconeix la seqüència d'escapament" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El text citat no comença amb cometes" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "El text era buit (o només contenia espais en blanc)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "No s'han pogut llegir dades des del procés fill (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "S'ha produït un error inesperat en waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "El procés fill ha sortit amb el codi %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "El senyal %ld ha matat el procés fill" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "El senyal %ld ha aturat el procés fill" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "El procés fill ha sortit inesperadament" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "No s'ha pogut llegir des del conducte fill (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "No s'ha pogut bifurcar-se (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "No s'ha pogut canviar al directori «%s» (%s)" + +#: ../glib/gspawn.c:1508 +#, 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:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "No s'ha pogut bifurcar el procés fill (%s)" + +#: ../glib/gspawn.c:1535 +#, 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:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "No s'han pogut llegir dades del procés fill" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "No s'ha pogut executar el procés fill (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "El nom del programa no és vàlid: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena no vàlida a l'entorn: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "El directori de treball no és vàlid: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "No s'ha pogut executar el programa d'ajuda (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "El caràcter és fora de l'interval d'UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Seqüència no vàlida a l'entrada de la conversió" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "El caràcter és fora de l'interval d'UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "El programa ha finalitzat de manera anòmala quan generava la línia " +#~ "d'ordres «%s»: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "La línia d'ordres «%s» ha acabat amb un estat de sortida diferent de zero " +#~ "(%d): %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "No hi ha cap registre de servei per a «%s»" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "s'ha arribat al límit d'espais de treball per a subcadenes buides" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "aquí no es permeten els escapaments que canvien entre majúscules i " +#~ "minúscules (\\l,\\L, \\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "no es permet repetir un grup «DEFINE»" + +#~ msgid "File is empty" +#~ msgstr "El fitxer és buit" + +#~ 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 es pot " +#~ "interpretar." + +#~ msgid "This option will be removed soon." +#~ msgstr "Aquesta opció se suprimirà aviat." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "" +#~ "S'ha produït un error en executar la funció «stat()» en el fitxer «%s»: %s" + +#~ msgid "Error connecting: " +#~ msgstr "S'ha produït un error en connectar-se: " + +#~ msgid "Error connecting: %s" +#~ msgstr "S'ha produït un error en connectar-se: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "La implementació de SOCKSv4 limita els caràcters del nom d'usuari a %i" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "La implementació de SOCKSv4 limita els caràcters del nom d'ordinador a %i" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "S'ha produït un error en llegir des de UNIX: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "S'ha produït un error en tancar des de UNIX: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "S'ha produït un error en escriure a UNIX: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "a. m." + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "p. m." + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "El tipus de valor de retorn no és correcte, s'ha obtingut el «%s» i " +#~ "s'esperava el «%s»" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "S'ha intentat establir la propietat %s de tipus %s però segons la " +#~ "interfície esperada el tipus és %s" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Ordres:\n" +#~ " help Mostra aquesta informació\n" +#~ " get Obtén el valor d'una clau\n" +#~ " set Estableix el valor d'una clau\n" +#~ " reset Reinicia el valor d'una clau\n" +#~ " monitor Fes el seguiment dels canvis de valor d'una clau\n" +#~ " writable Comprova si una clau és d'escriptura\n" +#~ "\n" +#~ "Utilitzeu «%s ORDRE --help» per veure l'ajuda de cada ordre en " +#~ "particular.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especifica el camí de l'esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Arguments:\n" +#~ " SCHEMA L'identificador de l'esquema\n" +#~ " KEY El nom de la clau\n" +#~ " VALUE El valor a establir a la clau, com a seqüència de bits " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "La clau %s no és d'escriptura\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Fes un seguiment de la CLAU per canvis en el seu valor i mostra'l quan " +#~ "passi.\n" +#~ "El seguiment estarà actiu fins que no es finalitzi el procés." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "" +#~ "No existeix l'esquema especificat «%s» dins del fitxer de sobreescriptura " +#~ "«%s»" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "No s'ha pogut moure el directori al directori" + +#~ 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 "" +#~ "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 "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.po b/po/ca@valencia.po new file mode 100644 index 0000000..85be6f8 --- /dev/null +++ b/po/ca@valencia.po @@ -0,0 +1,4736 @@ +# 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. +# Sílvia Miranda , 2011. +# Gil Forcada , 2008-2012. +# Jordi Serratosa , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.8\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-26 01:50+0200\n" +"PO-Revision-Date: 2012-09-22 09:42+0200\n" +"Last-Translator: Gil Forcada \n" +"Language-Team: Catalan \n" +"Language: ca-XV\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bits\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de comptatge passat a %s és massa llarg" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "No està implementada la cerca en el flux base" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "No es pot truncar el GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Ja està tancat el flux" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "No es permet truncar en els fluxos base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "S'ha cancel·lat l'operació" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "L'objecte no és vàlid, no s'ha inicialitzat" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "La seqüència de múltiples bytes de l'entrada no és completa" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "No hi ha prou espai a la destinació" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "S'ha produït un error durant la conversió: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "La cancel·lació de la inicialització no està implementada" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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» i «%s»" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipus %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipus desconegut" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipus de fitxer %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "Este sistema operatiu no implementa les GCredentials" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "La vostra plataforma no implementa les GCredentials" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "No s'esperava un final de flux tan prompte" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "No es permet la clau «%s» en l'entrada de l'adreça «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"L'adreça «%s» no és vàlida (ha de ser, o bé un camí, o bé un tmpdir -" +"directori temporal-, o bé unes claus abstractes)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "L'entrada d'adreça «%s» té una parella clau/valor que no té sentit" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Hi ha un error a l'adreça «%s»: l'atribut del port no està ben format" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: l'atribut de la família no està ben format" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "L'element d'adreça «%s» no conté dos punts (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"La parella de clau/valor %d, «%s», a l'element d'adreça «%s», no conté un " +"signe d'igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"S'ha produït un error en suprimir l'escapament d'una clau o d'un valor en la " +"parella clau/valor %d, «%s», de l'element d'adreça «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Hi ha un error a l'adreça «%s»: el transport unix requereix que hi haja " +"establerta exactament una clau, o bé de tipus «path» (camí), o bé de tipus " +"«abstract» (abstracte)" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: manca o està mal format l'atribut del nom " +"d'ordinador" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: manca o està mal format l'atribut del port " + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Hi ha un error a l'adreça «%s»: l'atribut noncefile no existeix o està mal " +"format " + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "S'ha produït un error en executar-se automàticament: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"El transport «%s» per a l'adreça «%s» és desconegut o no està implementat" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "S'ha produït un error en obrir el fitxer nonce «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "S'ha produït un error en llegir el fitxer nonce «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"S'ha produït un error en llegir el fitxer nonce «%s»: s'esperaven 16 bytes " +"però se n'han obtingut %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"S'ha produït un error en escriure els continguts del fitxer nonce «%s» al " +"flux:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "L'adreça que s'ha indicat és buida" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" +"No es pot engendrar un bus de missatge si s'executa com un altre usuari " +"(setuid)" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"No es pot engendrar un bus de missatge sense un identificador de màquina: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "S'ha produït un error en engendrar la línia d'ordes «%s»: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Premeu qualsevol tecla per tancar esta finestra)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"El bus de sessió (D-Bus) no està en funcionament i l'arrencada automàtica no " +"ha funcionat" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"No s'ha pogut determinar l'adreça del bus de sessió (no està implementat en " +"este sistema operatiu)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"No es pot determinar l'adreça del bus a través de la variable d'entorn " +"«DBUS_STARTER_BUS_TYPE»: conté un valor desconegut «%s»" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"No es pot determinar l'adreça del bus perquè la variable d'entorn " +"«DBUS_STARTER_BUS_TYPE» no està establerta" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipus de bus desconegut %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "S'ha trobat una inesperada falta de contingut en llegir una línia" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"S'ha trobat una inesperada falta de contingut en llegir (de forma segura) " +"una línia" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"S'han exhaurit tots els mecanismes d'autenticació disponibles (s'han provat: " +"%s) (hi ha disponibles: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" +"S'ha cancel·lat a través de GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "S'ha produït un error en obtindre la informació del directori «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Els permisos del directori «%s» no estan ben formats. S'esperava el mode " +"0700 però s'ha obtingut el 0%o." + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "S'ha produït un error en crear el directori «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "S'ha produït un error en obrir l'anell de claus «%s» per llegir-lo: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"La línia %d de l'anell de claus a «%s» amb el contingut «%s» no està ben " +"formada" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El primer testimoni de la línia %d de l'anell de claus a «%s» amb el " +"contingut «%s» no està ben format" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El segon testimoni de la línia %d de l'anell de claus a «%s» amb el " +"contingut «%s» no està ben format" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"No s'ha trobat la galeta amb l'identificador %d a l'anell de claus a «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "S'ha produït un suprimir el fitxer de blocatge antic «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "S'ha produït un error en crear el fitxer de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "" +"S'ha produït un error en tancar el fitxer (no enllaçat) de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "S'ha produït un error en desenllaçar el fitxer de blocatge «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" +"S'ha produït un error en obrir l'anell de claus «%s» per a escriptura: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" +"(A més a més, l'alliberació del blocatge per a «%s» també ha fallat: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "La connexió està tancada" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "S'ha esgotat el temps d'espera" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"S'han trobat senyaladors no implementats en construir-se la part de la " +"connexió del client" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"No existeix la interfície «org.freedesktop.DBus.Properties» en l'objecte al " +"camí %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"S'ha produït un error en establir la propietat «%s»: s'esperava el tipus " +"«%s» però s'ha obtingut el «%s»" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "No existeix la propietat «%s»" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "La propietat «%s» no és de lectura" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "La propietat «%s» no és d'escriptura" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "No existeix la interfície «%s»" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "No existeix la interfície" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No existeix la interfície «%s» en l'objecte al camí %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "No existeix el mètode «%s»" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "El tipus de missatge «%s» no correspon al tipus «%s» que s'esperava" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Ja hi ha un objecte exportat per a la interfície %s a %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "El mètode «%s» ha retornat un tipus «%s» però s'esperava «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "No existeix el mètode «%s» a la interfície «%s» amb la signatura «%s»" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ja està exportat un subarbre per a %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "el tipus és no vàlid" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Missatge «METHOD_CALL»: manca el camp de capçalera «PATH» o «MEMBER»" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Missatge «METHOD_RETURN»: manca el camp de capçalera «REPLY_SERIAL»" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Missatge «ERROR»: manca el camp de capçalera «REPLY_SERIAL» o «ERROR_NAME»" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Missatge «SIGNAL»: manca el camp de capçalera «PATH», «INTERFACE» o «MEMBER»" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Missatge «SIGNAL»: el camp de la capçalera «PATH» utilitza el valor reservat " +"«/org/freedesktop/DBus/Local»" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"missatge «SIGNAL»: el camp de capçalera «INTERFACE» utilitza el valor " +"reservat «org.freedesktop.DBus.Local»" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Es volia llegir %lu byte però s'ha rebut un «EOF»" +msgstr[1] "Es volien llegir %lu bytes però s'ha rebut un «EOF»" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"S'esperava una cadena UTF-8 vàlida però s'han trobat bytes no vàlids a " +"l'òfset %d (la llargada de la cadena és %d). La cadena UTF-8 vàlida fins " +"aquell moment era «%s»" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"S'esperava el byte «NUL» després de la cadena «%s» però s'ha trobat el byte " +"%d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "El valor analitzat «%s» no és un camí d'objecte D-Bus vàlid" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "El valor analitzat «%s» no és una signatura D-Bus vàlida" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"S'ha trobat una matriu de llargada %u byte. La llargada màxima és de 2<<26 " +"bytes (64 MiB)." +msgstr[1] "" +"S'ha trobat una matriu de llargada %u bytes. La llargada màxima és de 2<<26 " +"bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "El valor analitzat «%s» per variant no és una signatura D-Bus vàlida" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"S'ha produït un error en convertir a estructura de dades la GVariant amb el " +"tipus de cadena «%s» del format de cable D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor d'ordenació de bits (endianness) no vàlid. S'esperava 0x6c («l») o " +"0x42 («B») però s'ha trobat el valor 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versió major del protocol no vàlida. S'esperava 1 però s'ha trobat %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"S'ha trobat la capçalera de la signatura amb la signatura «%s», però el cos " +"és buit" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "El valor analitzat «%s» no és una signatura de D-Bus vàlida (pel cos)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"No hi ha cap capçalera de la signatura en el missatge, però el cos és de %u " +"byte" +msgstr[1] "" +"No hi ha cap capçalera de la signatura en el missatge, però el cos és de %u " +"bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "No s'ha pogut tornar a convertir el missatge a estructura de dades: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"No s'ha pogut convertir a seqüència de bits la GVariant de tipus cadena «%s» " +"al format de cable D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"El missatge conté %d descriptors de fitxers, però el camp de la capçalera " +"n'indica %d" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "No s'ha pogut convertir a seqüència de bits el missatge: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"El cos del missatge té la signatura «%s» però no hi ha cap capçalera de " +"signatura" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"El cos del missatge té el tipus de signatura «%s» però la signatura en el " +"camp de la capçalera és «%s»" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"El cos del missatge és buit però la signatura en el camp de la capçalera és " +"«(%s)»" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "S'ha retornat un error amb el cos de tipus «%s»" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "S'ha retornat un error amb el cos buit" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "No s'ha pogut obtindre el perfil de maquinari: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"No s'ha pogut carregar «/var/lib/dbus/machine-id» o «/etc/machine-id»: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "S'ha produït un error en cridar «StartServiceByName» per a %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" +"S'ha obtingut una resposta inesperada %d per al mètode «StartServiceByName" +"(\"%s\")»" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"No es pot invocar el mètode: el servidor intermediari és per a un nom ben " +"conegut sense cap propietari i el servidor intermediari s'ha construït amb " +"el senyalador «G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START»" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "No es pot utilitzar l'espai de noms abstracte" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "No es pot especificar el fitxer «nonce» quan es crea un servidor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "S'ha produït un error en escriure el fitxer «nonce» a «%s»: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La cadena «%s» no és un GUID vàlid de D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "No es pot escoltar «%s», és un transport desconegut" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "ORDRE" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Ordes:\n" +" help Mostra esta informació\n" +" introspect Introspecciona un objecte remot\n" +" monitor Fa un seguiment d'un objecte remot\n" +" call Invoca un mètode en l'objecte remot\n" +" emit Emet un senyal\n" +"\n" +"Utilitzeu «%s ORDRE --help» per veure l'ajuda de cada orde en particular.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "S'ha produït un error: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "S'ha produït un error en analitzar la introspecció XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Connecta al bus del sistema" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Connecta al bus de la sessió" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Connecta a l'adreça de D-Bus donada" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opcions del punt final de connexió:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opcions d'especificació del punt final de connexió" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "No s'ha especificat el punt final de connexió" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "S'han especificat més d'un punt final de connexió" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Avís: d'acord amb les dades d'introspecció no existeix la interfície «%s»\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Avís: d'acord amb les dades d'introspecció no existeix el mètode «%s» a la " +"interfície «%s»\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Destinació opcional del senyal (nom únic)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Camí a l'objecte al qual se li enviarà un senyal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Senyal i nom d'interfície" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Envia un senyal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "S'ha produït un error en connectar-se: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: no s'ha especificat el camí a l'objecte.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: «%s» no és un camí d'objecte vàlid\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: no s'ha especificat el senyal.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Error: el senyal no pot ser un nom parcial.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s no és un nom d'interfície vàlid\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s no és un nom de membre vàlid\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s no és un nom de bus únic vàlid.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "S'ha produït un error en analitzar el paràmetre %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "S'ha produït un error en buidar la connexió: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nom de destinació on invocar el mètode" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Camí a l'objecte on invocar el mètode" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Mètode i nom d'interfície" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Temps d'espera, en segons" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Invoca un mètode en un objecte remot." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: no s'ha especificat la destinació\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: no s'ha especificat el camí a l'objecte\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: no s'ha especificat el nom del mètode\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: el nom del mètode «%s» no és vàlid\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" +"S'ha produït un error en analitzar el paràmetre %d del tipus «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nom de destinació a introspeccionar" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Camí a l'objecte a introspeccionar" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Imprimeix XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspecciona el fill" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Només mostra les propietats" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspecciona un objecte remot." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nom de destinació al qual se li vol fer un seguiment" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Camí a l'objecte al qual se li vol fer un seguiment" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Fes el seguiment a un objecte remot." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sense nom" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "El fitxer d'escriptori no especificava el camp d'execució" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "A la informació d'aplicació li manca un identificador" + +#: ../gio/gdesktopappinfo.c:2069 +#, 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:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Definició personalitzada per a %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "la unitat no implementa l'expulsió o «eject_with_operation»" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "la unitat no implementa el sondeig per si hi ha un suport" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "la unitat no implementa la inicialització" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "la unitat no implementa l'parada" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "El TLS no està implementat" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "S'esperava un GEmblem per a un GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "No existeix el punt de muntatge contenidor" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "No es pot copiar al directori" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "No es pot copiar el directori al directori" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Ja existeix el fitxer de destinació" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "No es pot copiar el directori de forma recursiva" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "No es pot empalmar" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "S'ha produït un error en empalmar el fitxer: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "No es pot copiar el fitxer especial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "No es pot utilitzar la paperera" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "En els noms de fitxers no pot haver-hi «%c»" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "el volum no implementa el muntatge" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "No hi ha cap aplicació que s'haja registrat per gestionar este fitxer" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "L'enumerador està tancat" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "L'enumerador de fitxer té una operació pendent" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "El flux no implementa «query_info»" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "No està implementada la cerca en el flux" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "No es permet truncar en els fluxos d'entrada" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "No es permet truncar en els fluxos" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de testimonis erroni (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "El nom de classe %s no té tipus" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipus %s no implementa la interfície GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipus %s no té classe" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "El número de versió no és format correctament: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "" +"No es pot gestionar la versió proporcionada de la codificació de la icona" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "No s'ha especificat cap adreça" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "L'adreça és massa llarga (%u)" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "L'adreça conté bits més enllà de la llargada del prefix" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "No s'ha pogut analitzar «%s» com a màscara d'adreça IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "No hi ha prou espai per a l'adreça del sòcol" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "L'adreça de sòcol no és compatible" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "El flux té una operació pendent" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "No es permet posar l'element <%s> dins de <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "No es permet posar l'element <%s> al primer nivell" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "El fitxer %s existeix més d'una vegada en els recursos" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "No s'ha pogut trobar «%s» en cap directori de recursos" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "No s'ha pogut trobar «%s» en el directori actual" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Es desconeix l'opció de processament «%s»" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "No s'ha pogut crear el fitxer temporal: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"S'ha produït un error en processar el fitxer d'entrada amb l'xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"S'ha produït un error en processar el fitxer d'entrada amb el to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "S'ha produït un error en llegir el fitxer %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "S'ha produït un error en comprimir el fitxer %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "no pot haver-hi text dins de <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "el nom del fitxer d'eixida" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FITXER" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Els directoris des d'on s'han de llegir els fitxers (per defecte és el " +"directori actual)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORI" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Genera l'eixida en el format seleccionat per l'extensió del nom de fitxer de " +"destinació" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Genera la capçalera del codi" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Genera el codi font que es fa servir per enllaçar el fitxer de recurs amb el " +"codi" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Genera una llista de dependències" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "No crees ni registris automàticament els recursos" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "" +"El nom de l'identificador de C que s'utilitzarà en el codi font generat" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compila una especificació de recursos en un fitxer de recursos.\n" +"Els fitxers d'especificació de recursos tenen l'extensió .gresource.xml\n" +"i els fitxers de recursos tenen l'extensió .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Heu de donar un sol nom de fitxer\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "o es permet utilitzar noms buits" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"el nom «%s» no és vàlid: els noms han de començar amb una lletra minúscula" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"el nom «%s» no és vàlid: el caràcter «%c» no és vàlid. Només es permeten " +"lletres minúscules, nombres i el guionet («-»)." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"el nom «%s» no és vàlid: no es poden posar dos guionets seguits («--»)." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "el nom «%s» no és vàlid: l'últim caràcter no pot ser un guionet («-»)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "el nom «%s» no és vàlid: la llargada màxima és de 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr "ja està especificat " + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "no es poden afegir claus a un esquema del tipus «list-of»" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr "ja està especificat " + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +"La emmascara la a . " +"Utilitzeu per modificar-ne el valor." + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"l'atribut de la ha de ser necessàriament «type», «enum» o «flags»" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "(encara) no s'ha definit <%s id='%s'>." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "el tipus de cadena GVariant «%s» no és vàlid" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "s'ha indicat però l'esquema no està ampliant res" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "no hi ha cap a sobreescriure" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr "ja s'ha especificat " + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr "ja s'ha especificat " + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "el amplia l'esquema «%s» que encara no existeix" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" +"el és una llista d'un esquema «%s» que encara no existeix" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "No pot ser una llista d'un esquema amb un camí" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "No es pot ampliar un esquema amb un camí" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +"El és una llista i amplia el que no és una " +"llista" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +"El amplia el " +"però «%s» no amplia «%s»" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "si es dóna un camí ha de començar i acabar amb una barra inclinada" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "el camí d'una llista ha d'acabar amb «:/»" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "ja s'ha especificat <%s id='%s'>" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "No es permet posar l'element <%s> al primer nivell" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "S'ha especificat «--strict», se ix.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "S'ha ignorat el fitxer sencer.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "S'està ignorant este fitxer.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " +"sobreescriptura «%s»" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; s'està ignorant la sobreescriptura d'esta clau.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " i s'havia especificat «--strict», se ix.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " +"sobreescriptura «%s»: %s." + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "S'està ignorant la sobreescriptura d'esta clau.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"la sobreescriptura de la clau «%s» de l'esquema «%s» en el fitxer de " +"sobreescriptura «%s» és fora de l'interval de l'esquema donat" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"la sobreescriptura de la clau «%s» de l'esquema «%s» en el fitxer de " +"sobreescriptura «%s» no és a la llista de valors vàlids" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "on alçar el fitxer gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Interromp si hi ha cap error en els esquemes" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "No escrigues el fitxer gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "No siguis estricte amb les restriccions dels noms de les claus" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compila tots els fitxers d'esquema GSettings en una memòria cau d'esquemes.\n" +"Els fitxers d'esquema han de tindre l'extensió .gschema.xml\n" +"i el fitxer de memòria cau es dirà gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Heu de donar un sol nom de directori\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "No s'ha trobat cap fitxer d'esquemes: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "no faces res.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "suprimeix el fitxer d'eixida actual.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "El nom del fitxer no és vàlid: %s" + +#: ../gio/glocalfile.c:967 +#, 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:1135 +msgid "Can't rename root directory" +msgstr "No es pot canviar el nom del directori arrel" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "S'ha produït un error en canviar el nom del fitxer: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "No es pot canviar el nom del fitxer, ja existeix este nom" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nom de fitxer no vàlid" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "No s'ha pogut obrir el directori" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "S'ha produït un error en obrir el fitxer: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "S'ha produït un error en suprimir el fitxer: %s" + +#: ../gio/glocalfile.c:1860 +#, 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:1883 +#, 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:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "No s'ha pogut trobar el directori superior per a la paperera" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "No s'ha pogut trobar o crear el directori de la paperera" + +#: ../gio/glocalfile.c:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No s'ha pogut enviar el fitxer a la paperera: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "error intern" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "S'ha produït un error en crear el directori: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de fitxers no implementa enllaços simbòlics" + +#: ../gio/glocalfile.c:2218 +#, 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:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "S'ha produït un error en moure el fitxer: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "No s'ha pogut moure el directori al directori" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Ha fallat la creació del fitxer de còpia de seguretat" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "No està implementat el moure entre muntatges" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "El valor de l'atribut no pot ser nul" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "El nom de l'atribut ampliat no és vàlid" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "S'ha produït un error en establir l'atribut ampliat «%s»: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (codificació no vàlida)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "S'ha produït un error en obtindre informació del fitxer «%s»: %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "" +"S'ha produït un error en obtindre informació del descriptor de fitxer: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "No es poden establir permisos en els enllaços simbòlics" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "S'ha produït un error en establir els permisos: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "S'ha produït un error en establir el propietari: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "l'enllaç simbòlic no pot ser nul" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, 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:2248 +msgid "SELinux context must be non-NULL" +msgstr "El context del SELinux no pot ser nul" + +#: ../gio/glocalfileinfo.c:2263 +#, 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:2270 +msgid "SELinux is not enabled on this system" +msgstr "Este sistema no té habilitat el SELinux" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "No està implementat establir l'atribut %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "S'ha produït un error en llegir des del fitxer: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "S'ha produït un error en cercar en el fitxer: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "S'ha produït un error en tancar el fitxer: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "S'ha produït un error en escriure al fitxer: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "S'ha produït un error en truncar el fitxer: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "S'ha produït un error en obrir el fitxer «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "El fitxer objectiu és un directori" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "El fitxer objectiu no és un fitxer regular" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "El fitxer ha estat modificat des d'alguna aplicació externa" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "S'ha produït un error en suprimir el fitxer vell: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "El GSeekType proporcionat no és vàlid" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "La sol·licitud de cerca és no vàlida" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No es pot truncar el GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "El flux d'eixida de memòria no és modificable" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Ha fallat el redimensionament de la memòria del flux d'eixida" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +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:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nom de l'ordinador «%s» conté «[» però no «]»" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "No es pot accedir a la xarxa" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "No es pot accedir a la màquina" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "No s'ha pogut crear el monitor de xarxa: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "No s'ha pogut crear el monitor de xarxa: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "No s'ha pogut obtindre l'estat de la xarxa: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "El flux d'eixida no implementa l'escriptura" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "El flux font ja està tancat" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "S'ha produït un error en resoldre «%s»: %s" + +#: ../gio/gresolver.c:967 +#, 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:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "No hi ha cap registre del tipus sol·licitat al DNS per «%s»" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "No s'ha pogut resoldre «%s» de forma temporal" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "S'ha produït un error en resoldre «%s»" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "No s'han rebut totes les dades per «%s»" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "No existeix el recurs a «%s»" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "No s'ha pogut descomprimir el recurs «%s»" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "El recurs a «%s» no és un directori" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "El flux d'entrada no té implementada la cerca" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Mostra l'ajuda" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[ORDRE]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Llista les seccions que contenen recursos en un FITXER elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Llista recursos\n" +"Si s'especifica una SECCIÓ, només es llisten els recursos d'aquella secció\n" +"Si s'especifica un CAMÍ, només es llisten els recursos que hi coincidisquen" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FITXER [CAMÍ]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECCIÓ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Llista els recursos amb les seues dades\n" +"Si s'especifica la SECCIÓ, només es mostren els recursos de la secció\n" +"Si s'especifica el CAMÍ, només es mostren els recursos que hi coincidisquen\n" +"Les dades són la secció, la mida i la compressió" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extrau un fitxer de recurs a l'eixida estàndard" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "CAMÍ AL FITXER" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Es desconeix l'orde «%s»\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Ús:\n" +" gresource [--section SECCIÓ] ORDRE [ARGUMENTS...]\n" +"\n" +"Ordes:\n" +" help Mostra esta informació\n" +" sections Llista les seccions de recursos\n" +" list Llista els recursos\n" +" details Llista els recursos amb les seues dades\n" +" extract Extrau un recurs\n" +"\n" +"Utilitzeu «gresource help ORDRE» per obtindre informació més detallada.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilització:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Arguments:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECCIÓ El nom (opcional) d'una secció elf\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " ORDRE L'orde (opcional) que s'explicarà\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FITXER Un fitxer elf (un fitxer binari o una biblioteca compartida)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FITXER Un fitxer elf (un fitxer binari o una biblioteca\n" +" compartida) o un fitxer de recurs compilat\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CAMÍ]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CAMÍ Un (opcional) camí (pot ser parcial) de recurs\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CAMÍ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CAMÍ Un camí de recurs\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No existeix l'esquema «%s»\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"No es pot canviar de lloc l'esquema «%s» (no s'ha d'especificar el camí)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Es pot canviar de lloc l'esquema «%s» (s'ha d'especificar el camí)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "S'ha donat un camí buit.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "El camí ha de començar amb una barra inclinada (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "El camí ha d'acabar amb una barra inclinada (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "El camí no pot contindre dues barres inclinades seguides (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "No existeix la clau «%s»\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "El valor proporcionat està fora del rang vàlid\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Llista els esquemes instal·lats (que no es poden canviar de lloc)" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Llista els esquemes instal·lats que es poden canviar de lloc" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Llista les claus a l'ESQUEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:CAMÍ]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Llista els fills de l'ESQUEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Llista les claus i els valors recursivament\n" +"Si no es passa cap ESQUEMA, es llista totes les claus\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:CAMÍ]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Obtén el valor de la CLAU" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:CAMÍ] CLAU" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Consulta el rang de valors vàlids per a la CLAU" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Estableix el valor de la CLAU a VALOR" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:CAMÍ] CLAU VALOR" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Reinicia la CLAU al seu valor predeterminat" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reinicia totes les claus de l'ESQUEMA als seus valors per defecte" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Comprova si la CLAU és d'escriptura" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Fes un seguiment de la CLAU per si hi ha canvis.\n" +"Si no s'especifica cap CLAU, es farà un seguiment a \n" +"totes les claus de l'ESQUEMA.\n" +"Utilitzeu ^C per deixar de fer el seguiment.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:CAMÍ] [CLAU]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilització:\n" +" gsettings [--schemadir DIRECTORI_D'ESQUEMES] ORDRE [ARGUMENTS...]\n" +"\n" +"Ordes:\n" +" help Mostra esta informació\n" +" list-schemas Llista els esquemes instal·lats\n" +" list-relocatable-schemas Llista els esquemes que es poden canviar de " +"lloc\n" +" list-keys Llista les claus d'un esquema\n" +" list-children Llista els fills d'un esquema\n" +" list-recursively Llista les claus i els valors recursivament\n" +" range Consulta el rang d'una clau\n" +" get Obtén el valor d'una clau\n" +" set Estableix el valor d'una clau\n" +" reset Reinicia el valor d'una clau\n" +" reset-recursively Reinicia tots els valors de l'esquema donat\n" +" writable Comprova si es pot escriure a la clau\n" +" monitor Fa un seguiment per si hi ha canvis\n" +"\n" +"Utilitzeu «gsettings help ORDRE» per veure l'ajuda més detallada.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Ús:\n" +" gsettings [--schemadir DIRECTORI_D'ESQUEMES] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" +" DIRECTORI_D'ESQUEMES Un directori on cercar-hi esquemes addicionals\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ESQUEMA El nom de l'esquema\n" +" CAMÍ El camí, pels esquemes que es poden canviar de lloc\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " CLAU La clau (opcional) de l'esquema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " CLAU La clau de l'esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALOR El valor a establir\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "S'ha donat un nom d'esquema buit\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "El sòcol no és vàlid, no està inicialitzat" + +#: ../gio/gsocket.c:293 +#, 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:301 +msgid "Socket is already closed" +msgstr "El sòcol ja és tancat" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "S'ha excedit el temps d'espera d'entrada/eixida del sòcol" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "s'està creant un GSocket a partir del descriptor de fitxer: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "No s'ha pogut crear el sòcol: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "S'ha especificat una família desconeguda" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "S'ha especificat un protocol desconegut" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "no s'ha pogut obtindre l'adreça local: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "no s'ha pogut obtindre l'adreça remota: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "no s'ha pogut escoltar: %s" + +#: ../gio/gsocket.c:1900 +#, 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:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "S'ha produït un error en unir-se a un grup de multidestinació: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "S'ha produït un error en deixar un grup de multidestinació: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Encara no es pot fer multidestinació des d'un origen concret" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "S'ha produït un error en acceptar la connexió: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Connexió en curs" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "No s'ha pogut obtindre l'error pendent: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "S'ha produït un error en rebre les dades: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "S'ha produït un error en enviar les dades: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "No s'ha pogut parar el sòcol: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "S'ha produït un error en tancar el sòcol: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "S'està esperant la condició del sòcol: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "S'ha produït un error en enviar el missatge: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "El GSocketControlMessage no està implementat a Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "S'ha produït un error en rebre un missatge: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "Este sistema operatiu no implementa el «g_socket_get_credentials»" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "No s'ha pogut connectar al servidor intermediari %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "No s'ha pogut connectar a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "No s'ha pogut connectar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "S'ha produït un error desconegut en connectar-se" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "" +"Encara no es pot fer de servidor intermediari d'una connexió que no siga TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "El protocol del servidor intermediari «%s» no està implementat." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Ja està tancat el receptor de connexions" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "El sòcol que s'ha afegit és tancat" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "El SOCKSv4 no permet utilitzar adreces IPv6 «%s»" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "El nom d'usuari és massa llarg pel protocol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "El nom d'ordinador «%s» és massa llarg pel protocol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "El servidor no és un servidor intermediari de SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "S'ha rebutjat la connexió a través d'un servidor SOCKSv4" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "El servidor no és un servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "El servidor intermediari SOCKSv5 requereix autenticació." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"El servidor intermediari SOCKSv5 requereix un mètode d'autenticació que " +"encara no està implementat a la GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"El protocol SOCKSv5 no permet un nom d'usuari o de contrasenya d'esta mida." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Ha fallat l'autenticació SOCKSv5 degut a un nom d'usuari o contrasenya " +"errònies." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "El nom d'ordinador «%s» és massa llarg pel protocol SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" +"El servidor intermediari SOCKSv5 utilitza un tipus d'adreça desconeguda." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "S'ha produït un error intern del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "El conjunt de regles no permet fer connexions SOCKSv5." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" +"No es pot arribar al servidor a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" +"No es pot arribar a la xarxa a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "S'ha refusat la connexió a través del servidor intermediari SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "El servidor intermediari SOCKSv5 no permet l'ús de l'orde «connect»." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" +"El servidor intermediari SOCKSv5 no permet l'ús del tipus d'adreça " +"proporcionada." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "S'ha produït un error desconegut en el servidor intermediari SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, 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/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "No s'ha pogut desencriptar la clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "No s'ha trobat cap clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "No s'ha pogut analitzar la clau privada codificada amb PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "No s'ha trobat cap certificat codificat amb PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "No s'ha pogut analitzar el certificat codificat amb PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Últim intent per introduir la contrasenya correctament abans que se vos " +"bloquegi l'accés." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"S'han introduït diverses contrasenyes errònies i se vos bloquejarà l'accés " +"després de més intents." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "La contrasenya introduïda no és correcte." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, 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:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Tipus de dades extres no esperades" + +#: ../gio/gunixconnection.c:195 +#, 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:211 +msgid "Received invalid fd" +msgstr "S'ha rebut un descriptor de fitxer no vàlid" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "S'ha produït un error en enviar les credencials: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"S'ha produït un error en la comprovació de si «SO_PASSCRED» és habilitat en " +"el sòcol: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"No s'esperava esta llargada de l'opció quan s'estava comprovant si " +"«SO_PASSCRED» és habilitat en el sòcol. S'esperaven %d bytes i n'eren %d." + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "S'ha produït un error en habilitar «SO_PASSCRED»: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"S'esperava llegir un sol byte per rebre les credencials però s'han llegit " +"zero bytes" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "No s'esperava un missatge de control però s'ha obtingut %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "S'ha produït un error en inhabilitar «SO_PASSCRED»: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "S'ha produït un error en llegir del descriptor de fitxer: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "S'ha produït un error tancant el descriptor de fitxer: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Arrel del sistema de fitxers" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "S'ha produït un error en escriure al descriptor de fitxer: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Este sistema no admet adreces de sòcol de domini UNIX abstractes" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "el volum no implementa l'expulsió o «eject_with_operation»" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "No es pot trobar l'aplicació" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "S'ha produït un error en executar l'aplicació: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "No estan implementats els URI" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "els canvis associatius no estan implementats a win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "La creació associativa no està implementada a win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "S'ha produït un error en llegir del gestor: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "S'ha produït un error en tancar el gestor: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "S'ha produït un error en escriure al gestor: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "No hi ha prou memòria" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Error intern: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Fan falta més dades d'entrada" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Les dades comprimides no són vàlides" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adreça on s'escoltarà" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorat, per mantindre la compatibilitat amb el GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Mostra l'adreça" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Mostra l'adreça en mode intèrpret d'ordes" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Executa un servei de D-Bus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Els arguments no són vàlids\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, 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:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "No s'esperava l'etiqueta «%s» dins «%s»" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, 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:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, 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:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "No s'ha pogut ampliar la línia d'execució «%s» amb l'URI «%s»" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, 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:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI «%s» no és vàlid" + +#: ../glib/gconvert.c:1909 +#, 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:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI «%s» conté caràcters d'escapada no vàlids" + +#: ../glib/gconvert.c:2020 +#, 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:2030 +msgid "Invalid hostname" +msgstr "El nom de l'ordinador no és vàlid" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "A. M." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "P. M." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Gener" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Febrer" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Març" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maig" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juny" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juliol" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agost" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Setembre" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Octubre" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembre" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Desembre" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "gen" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "març" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maig" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "juny" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ag" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "set" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "oct" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "des" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Dilluns" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dimarts" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Dimecres" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Dijous" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Divendres" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Dissabte" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Diumenge" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "dl" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "dt" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "dm" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "dj" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "dv" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ds" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dg" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "S'ha produït un error en obrir el directori «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El fitxer «%s» és massa gran" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "No s'ha pogut llegir del fitxer «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "No s'ha pogut obrir el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"No s'han pogut obtindre els atributs del fitxer «%s»: ha fallat la funció " +"fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "No s'ha pogut crear el fitxer «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"No s'ha pogut obrir el fitxer «%s» per escriure-hi: ha fallat la funció " +"fdopen(): %s" + +#: ../glib/gfileutils.c:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no conté XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, 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:2104 +msgid "Symbolic links not supported" +msgstr "No es poden utilitzar els enllaços simbòlics" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +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:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "El canal acaba en un caràcter parcial" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "No és un fitxer regular" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "El nom del grup no és vàlid: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "El fitxer de claus no comença amb un grup" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "El nom de la clau no és vàlid: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El fitxer de claus conté la codificació no implementada «%s»" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El fitxer de claus no té el grup «%s»" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El fitxer de claus no té la clau «%s»" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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 es pot " +"interpretar." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"El fitxer de claus conté la clau «%s» en el grup «%s», que té un valor que " +"no es pot interpretar." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"La clau «%s» en el grup «%s» té el valor «%s» però s'esperava el valor %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El fitxer de claus conté la seqüència d'escapada no vàlida «%s»" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "El valor «%s» no es pot interpretar com un nombre." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor enter «%s» és fora de l'interval" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "El valor «%s» no es pot interpretar com un nombre amb coma flotant." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no es pot interpretar com un booleà." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"No s'han pogut obtindre els atributs del fitxer «%s%s%s%s»: ha fallat la " +"funció fstat(): %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "" +"No s'ha pogut mapar el fitxer «%s%s%s%s»: ha fallat la funció mmap(): %s" + +#: ../glib/gmappedfile.c:260 +#, 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/gmarkup.c:353 ../glib/gmarkup.c:394 +#, 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:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "«%s» no és un nom vàlid " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "«%s» no és un nom vàlid: «%c» " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "S'ha produït un error a la línia %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S'ha detectat una entitat buida «&;». Les entitats vàlides són: & " " +"< > '." + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Es desconeix el nom d'entitat «%-.*s»" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "El document ha de començar amb un element (p. ex. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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 tancar " +"l'etiqueta d'element buit «%s»." + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "El document era buit o només contenia espais en blanc" + +#: ../glib/gmarkup.c:1721 +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:1729 ../glib/gmarkup.c:1774 +#, 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 que encara eren " +"oberts. «%s» era l'últim element obert." + +#: ../glib/gmarkup.c:1737 +#, 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:1743 +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:1749 +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:1754 +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:1760 +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:1767 +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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"El document ha acabat de manera inesperada enmig d'un comentari o d'una " +"instrucció de processament" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Forma d'ús:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPCIÓ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opcions d'ajuda:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Mostra les opcions d'ajuda" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Mostra totes les opcions d'ajuda" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opcions de l'aplicació:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, 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:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "El valor enter «%s» per a %s és fora de l'interval" + +#: ../glib/goption.c:1014 +#, 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:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "El valor doble «%s» per a %s és fora de l'interval" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "S'ha produït un error en analitzar l'opció %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Manca un argument per a %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Es desconeix l'opció %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objecte malmés" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "error intern o objecte malmés" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "no hi ha prou memòria" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "s'ha arribat al límit de tornades arrere" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "s'ha arribat al límit de recurrències" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "la combinació de senyaladors de línia nova no és vàlida" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "desplaçament incorrecte" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "UTF-8 curt" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "bucle recursiu" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "error desconegut" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ al final del patró" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c al final del patró" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "caràcter no reconegut després de \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "nombres fora de l'interval en el quantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "nombre massa gran en el quantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "falta el «]» per a la classe de caràcter" + +#: ../glib/gregex.c:347 +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:350 +msgid "range out of order in character class" +msgstr "s'ha eixit de l'interval en la classe de caràcter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "no hi ha res per repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetició no esperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "no es reconeix el caràcter després de «(?» o «(?-»" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "falta un «)»" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referència a un subpatró que no existeix" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "falta un «)» després del comentari" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "l'expressió regular és massa llarga" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "no s'ha pogut obtindre memòria" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "hi ha un «)» sense el corresponent «(»" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "desbordament del codi" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "no es reconeix el caràcter després de «(?<»" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserció cap arrere no té llargada fixa" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "el nombre o el nom no estan ben formats després de «(?(»" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "el grup condicional conté més de dues branques" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "s'esperava una asserció després de «(?(»" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "«(?R» o «(?[+-]dígits» han d'anar seguits de «)»" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX desconeguda" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "no es poden utilitzar els elements d'ordenació de POSIX" + +#: ../glib/gregex.c:418 +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:421 +msgid "invalid condition (?(0)" +msgstr "condició «(?(0)» no vàlida" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no es permet \\C en assercions cap arrere" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" +"no s'admeten els caràcters d'escapada «\\L», «\\l», «\\N{nom}», «\\U» i «\\u»" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "la crida recursiva podria entrar en bucle indefinidament" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "no es reconeix el caràcter després de «(?P»" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "falta la finalització en el nom del subpatró" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dos noms de subpatró tenen el mateix nom" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "la seqüència «\\P» o «\\p» no està ben formada" + +#: ../glib/gregex.c:450 +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:453 +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:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "hi ha massa subpatrons amb nom (màxim de 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "el valor octal és més gran que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "s'ha produït un desbordament en compilar l'espai de treball" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "no s'ha trobat el subpatró referenciat comprovat anteriorment" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "el grup «DEFINE» conté més d'una branca" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opcions «NEWLINE» incoherents" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"després de «\\g» no hi ha cap número o cap nom o número entre claudàtors, " +"claus angulars o cometes" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "les referències numerades no poden ser zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "no es permeten arguments per «(*ACCEPT)», «(*FAIL)» o «(*COMMIT)»" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "no es reconeix «(*VERB)»" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "el número és massa gran" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "falta el nom del subpatró després de (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "s'esperava un dígit després de (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"el caràcter«]» no és un caràcter de dades vàlid en el mode de compatibilitat " +"amb JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "no s'accepten noms diferents per subpatrons del mateix número" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "«(*MARK)» ha de tindre un argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "després de «\\c» ha d'haver-hi un caràcter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"després de «\\k» no hi ha cap nom entre claudàtors, claus angulars o cometes" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "no es pot utilitzar \\N en una classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "hi ha massa referències cap avant" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "el nom és massa llarg a «(*MARK)«, «(*PRUNE)«, «(*SKIP)» o «(*THEN)»" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "el valor del caràcter a la seqüència «\\u...» és massa llarg" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE no està compilada per interpretar UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"La biblioteca PCRE no està compilada per interpretar les propietats UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "La biblioteca PCRE ha estat compilada amb opcions incompatibles" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "s'esperava un dígit hexadecimal o bé «}»" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "s'esperava un dígit hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "falta un «<» en la referència simbòlica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "la referència simbòlica no està acabada" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referència simbòlica de longitud zero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "s'esperava un dígit" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "la referència simbòlica no és vàlida" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "«\\» final extraviat" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "no es reconeix la seqüència d'escapament" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El text citat no comença amb cometes" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "El text era buit (o només contenia espais en blanc)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "No s'han pogut llegir dades des del procés fill (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "S'ha produït un error inesperat en waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "El procés fill ha eixit amb el codi %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "El senyal %ld ha matat el procés fill" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "El senyal %ld ha parat el procés fill" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "El procés fill ha eixit inesperadament" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "No s'ha pogut llegir des del conducte fill (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "No s'ha pogut bifurcar-se (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "No s'ha pogut canviar al directori «%s» (%s)" + +#: ../glib/gspawn.c:1508 +#, 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:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "No s'ha pogut redirigir l'entrada o l'eixida del procés fill (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "No s'ha pogut bifurcar el procés fill (%s)" + +#: ../glib/gspawn.c:1535 +#, 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:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "No s'han pogut llegir dades del procés fill" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "No s'ha pogut executar el procés fill (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "El nom del programa no és vàlid: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena no vàlida a l'entorn: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "El directori de treball no és vàlid: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "No s'ha pogut executar el programa d'ajuda (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "El caràcter és fora de l'interval d'UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Seqüència no vàlida a l'entrada de la conversió" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "El caràcter és fora de l'interval d'UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "El programa ha finalitzat de manera anòmala quan generava la línia " +#~ "d'ordres «%s»: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "La línia d'ordres «%s» ha acabat amb un estat de sortida diferent de zero " +#~ "(%d): %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "No hi ha cap registre de servei per a «%s»" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "s'ha arribat al límit d'espais de treball per a subcadenes buides" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "aquí no es permeten els escapaments que canvien entre majúscules i " +#~ "minúscules (\\l,\\L, \\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "no es permet repetir un grup «DEFINE»" + +#~ msgid "File is empty" +#~ msgstr "El fitxer és buit" + +#~ 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 es pot " +#~ "interpretar." + +#~ msgid "This option will be removed soon." +#~ msgstr "Aquesta opció se suprimirà aviat." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "" +#~ "S'ha produït un error en executar la funció «stat()» en el fitxer «%s»: %s" + +#~ msgid "Error connecting: " +#~ msgstr "S'ha produït un error en connectar-se: " + +#~ msgid "Error connecting: %s" +#~ msgstr "S'ha produït un error en connectar-se: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "La implementació de SOCKSv4 limita els caràcters del nom d'usuari a %i" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "La implementació de SOCKSv4 limita els caràcters del nom d'ordinador a %i" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "S'ha produït un error en llegir des de UNIX: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "S'ha produït un error en tancar des de UNIX: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "S'ha produït un error en escriure a UNIX: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "a. m." + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "p. m." + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "El tipus de valor de retorn no és correcte, s'ha obtingut el «%s» i " +#~ "s'esperava el «%s»" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "S'ha intentat establir la propietat %s de tipus %s però segons la " +#~ "interfície esperada el tipus és %s" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Ordres:\n" +#~ " help Mostra aquesta informació\n" +#~ " get Obtén el valor d'una clau\n" +#~ " set Estableix el valor d'una clau\n" +#~ " reset Reinicia el valor d'una clau\n" +#~ " monitor Fes el seguiment dels canvis de valor d'una clau\n" +#~ " writable Comprova si una clau és d'escriptura\n" +#~ "\n" +#~ "Utilitzeu «%s ORDRE --help» per veure l'ajuda de cada ordre en " +#~ "particular.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especifica el camí de l'esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Arguments:\n" +#~ " SCHEMA L'identificador de l'esquema\n" +#~ " KEY El nom de la clau\n" +#~ " VALUE El valor a establir a la clau, com a seqüència de bits " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "La clau %s no és d'escriptura\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Fes un seguiment de la CLAU per canvis en el seu valor i mostra'l quan " +#~ "passi.\n" +#~ "El seguiment estarà actiu fins que no es finalitzi el procés." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "" +#~ "No existeix l'esquema especificat «%s» dins del fitxer de sobreescriptura " +#~ "«%s»" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "No s'ha pogut moure el directori al directori" + +#~ 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 "" +#~ "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 "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/cs.po b/po/cs.po new file mode 100644 index 0000000..721a9eb --- /dev/null +++ b/po/cs.po @@ -0,0 +1,4392 @@ +# Czech translation of glib. +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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. +# Marek Černocký , 2012. +# Petr Kovar , 2007, 2008, 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&k" +"eywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-23 23:56+0000\n" +"PO-Revision-Date: 2012-09-24 18:22+0200\n" +"Last-Translator: Petr Kovar \n" +"Language-Team: Czech \n" +"Language: cs\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s poskytnut příliÅ¡ vysoký počet" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Posouvání není v proudu podporováno" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Nelze zkrátit GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Proud je již uzavřen" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Zkrácování není v proudu podporováno" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Operace byla zruÅ¡ena" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Neplatný objekt, nebyl spuÅ¡těn" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Neúplná vícebajtová posloupnost na vstupu" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Cíl nemá dostatek místa" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Neplatná posloupnost bajtů na vstupu převodu" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Chyba při převodu: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "ZruÅ¡itelné spuÅ¡tění není podporováno" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nelze otevřít převaděč z „%s“ do „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Neznámý typ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "typ souboru %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials na tomto OS není implementováno" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Danou platformu GCredentials nepodporuje" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neočekávaný časný konec proudu" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nepodporovaný klíč „%s“ v záznamu adresy „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresa „%s“ je neplatná (je zapotřebí právě jeden z klíčů path, tmpdir nebo " +"abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Nesmyslná párová kombinace klíč/hodnota v záznamu adresy „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Chyba v adrese „%s“ – atribut portu má chybný formát" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Chyba v adrese „%s“ – atribut rodiny má chybný formát" + +#: ../gio/gdbusaddress.c:454 +#, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Prvek adresy „%s“ neobsahuje dvojtečku (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +#| msgid "" +#| "Key/Value pair %d, `%s', in address element `%s', does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "Pár klíč/hodnota %d, „%s“, v prvku adresy „%s“ neobsahuje znak rovná se" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Chyba v neuvozeném klíči nebo hodnotě v páru klíč/hodnota %d, „%s“, v prvku " +"adresy „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Chyba v adrese „%s“ – unix transport vyžaduje jako nastavený právě jeden z " +"klíčů „path“ nebo „abstract“" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribut počítače schází nebo má chybný formát" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribut portu schází nebo má chybný formát" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribut noncefile schází nebo má chybný formát" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Chyba při automatickém spouÅ¡tění: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Neznámý nebo nepodporovaný transport „%s“ adresy „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Chyba při otevírání souboru nonce „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Chyba při čtení ze souboru nonce „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Chyba při čtení ze souboru nonce „%s“, očekáváno 16 bajtů, obdrženo %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Chyba při zápisu obsahu souboru nonce „%s“ do proudu:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Daná adresa je prázdná" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "Nelze spustit sběrnici zpráv bez setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Nelze spustit sběrnici zpráv bez machine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Chyba při spouÅ¡tění příkazového řádku „%s“: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Zmáčknutím libovolného znaku okno zavřete)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Služba dbus sezení neběží a automatické spuÅ¡tění selhalo" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Nelze určit adresu sběrnice sezení (v tomto OS neimplementováno)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nelze určit adresu sběrnice z proměnné prostředí DBUS_STARTER_BUS_TYPE – " +"neznámá hodnota „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nelze určit adresu sběrnice, jelikož proměnná prostředí " +"DBUS_STARTER_BUS_TYPE není nastavena" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Neznámý typ sběrnice %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Neočekávaně scházející obsah při pokusu o přečtení řádku" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Neočekávaně scházející obsah při pokusu o (bezpečné) přečtení řádku" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Vyčerpány vÅ¡echny dostupné ověřovací mechanismy (pokusů: %s) (dostupných: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "ZruÅ¡eno přes GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Chyba při získávání informací pro složku „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Oprávnění adresáře „%s“ mají chybný formát. Očekáván režim 0700, obdržen 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Chyba při vytváření adresáře „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Chyba při otevírání klíčenky „%s“ ke čtení: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Řádek %d klíčenky na „%s“ s obsahem „%s“ má chybný formát" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "První token řádku %d klíčenky na „%s“ s obsahem „%s“ má chybný formát" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Druhý token řádku %d klíčenky na „%s“ s obsahem „%s“ má chybný formát" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Nenalezeno cookie s id %d v klíčence na „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Chyba při mazání zastaralého souboru uzamčení „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Chyba při vytváření souboru uzamčení „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Chyba při zavírání (neodkazovaného) souboru uzamčení „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Chyba při ruÅ¡ení odkazu souboru uzamčení „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Chyba při otevírání klíčenky „%s“ k zápisu: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Navíc selhalo také zruÅ¡ení uzamčení „%s“: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Spojení bylo ukončeno" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Časový limit vyprÅ¡el" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Nalezeny nepodporované příznaky při vytváření spojení na straně klienta" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Žádné prostředí „org.freedesktop.DBus.Properties“ neexistuje na objektu na " +"cestě %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Chyba při nastavování vlastnosti „%s“: Očekáván typ „%s“, ale obdržen „%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Žádná vlastnost „%s“ neexistuje" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Vlastnost „%s“ není čitelná" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Vlastnost „%s“ není zapisovatelná" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Žádné rozhraní „%s“ neexistuje" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Žádné takové rozhraní neexistuje" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Žádné rozhraní „%s“ neexistuje na objektu na cestě %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Žádná taková metoda „%s“ neexistuje" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Typ zprávy, „%s“, se neshoduje s očekávaným typem „%s“" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Objekt je již exportován pro prostředí %s na %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoda „%s“ navrátila typ „%s“, ale očekáván byl „%s“" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoda „%s“ na rozhraní „%s“ s podpisem „%s“ neexistuje" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Podstrom je již exportován pro %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "typ je INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Zpráva METHOD_CALL: pole se záhlavím PATH nebo MEMBER schází" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Zpráva METHOD_RETURN: pole se záhlavím REPLY_SERIAL schází" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Zpráva ERROR: pole se záhlavím REPLY_SERIAL nebo ERROR_NAME schází" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Zpráva SIGNAL: pole se záhlavím PATH, INTERFACE nebo MEMBER schází" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Zpráva SIGNAL: pole se záhlavím PATH používá rezervovanou hodnotu /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Zpráva SIGNAL: pole se záhlavím INTERFACE používá rezervovanou hodnotu org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Zamýšlel se přečíst %lu bajt, ale obdrženo EOF" +msgstr[1] "Zamýšlely se přečíst %lu bajty, ale obdrženo EOF" +msgstr[2] "Zamýšlelo se přečíst %lu bajtů, ale obdrženo EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Očekáván platný řetězec UTF-8, ale byly nalezeny neplatné bajty na offsetu " +"bajtu %d (délka řetězce je %d). Platný řetězec UTF-8 až do přísluÅ¡ného bodu " +"byl „%s“" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Očekáván bajt NULL za řetězcem „%s“, ale byl nalezen bajt %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Analyzovaná hodnota „%s“ není platná cesta objektu D-Bus" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Analyzovaná hodnota „%s“ není platný podpis D-Bus" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"ZjiÅ¡těno pole o délce %u bajt. Maximální délka je 2<<26 bajtů (64 MiB)." +msgstr[1] "" +"ZjiÅ¡těno pole o délce %u bajty. Maximální délka je 2<<26 bajtů (64 MiB)." +msgstr[2] "" +"ZjiÅ¡těno pole o délce %u bajtů. Maximální délka je 2<<26 bajtů (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Analyzovaná hodnota „%s“ varianty není platným podpisem D-Bus" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Chyba při ruÅ¡ení serializace GVariant s řetězcem typu „%s“ od přenosového " +"formátu D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Neplatná hodnota endianity. Očekávána 0x6c („l“) nebo 0x42 („B“), ale " +"nalezena hodnota 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Neplatná verze hlavního protokolu. Očekávána 1, ale nalezena %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Nalezeno záhlaví podpisu s podpisem „%s“, ale tělo zprávy je prázdné" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Analyzovaná hodnota „%s“ není platným podpisem D-Bus (pro tělo)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Ve zprávě není záhlaví s podpisem, ale tělo zprávy má %u bajt" +msgstr[1] "Ve zprávě není záhlaví s podpisem, ale tělo zprávy má %u bajty" +msgstr[2] "Ve zprávě není záhlaví s podpisem, ale tělo zprávy má %u bajtů" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Nelze zruÅ¡it serializaci zprávy: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Chyba při serializaci GVariant s řetězcem typu „%s“ do přenosového formátu D-" +"Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Zpráva má %d popisovačů souboru, ale pole se záhlavím uvádí %d popisovačů" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Nelze serializovat zprávu: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Tělo zprávy má podpis „%s“, ale záhlaví s podpisem neexistuje" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Tělo zprávy má podpis typu „%s“, ale podpis v poli se záhlavím je „%s“" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Tělo zprávy je prázdné, ale podpis v poli se záhlavím je „(%s)“" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Navrácena chyba s tělem typu „%s“" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Navrácena chyba s prázdným tělem" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Nelze získat profil hardwaru: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nelze načíst /var/lib/dbus/machine-id nebo /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Chyba při volání StartServiceByName pro %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Neočekávaná odpověď %d od metody StartServiceByName(„%s“)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Metodu nelze vyvolat; proxy je na dobře známý název bez vlastníka a proxy " +"byla vytvořena s příznakem G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstraktní jmenný prostor není podporován" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Při vytváření serveru nelze určit soubor nonce" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Chyba při zápisu souboru nonce na „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Řetězec „%s“ není platné D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nelze naslouchat na nepodporovaném transportu „%s“" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "PŘÍKAZ" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Příkazy:\n" +" help Zobrazit tyto informace\n" +" introspect Provést introspection vzdáleného objektu\n" +" monitor Sledovat vzdálený objekt\n" +" call Spustit metodu na vzdáleném objektu\n" +" emit Vyslat signál\n" +"\n" +"Nápovědu k jednotlivým příkazům získáte použitím „%s PŘÍKAZ --help“.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Chyba: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Chyba při analýze introspection XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Připojit k systémové sběrnici" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Připojit ke sběrnici sezení" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Připojit k dané adrese D-Bus" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Volby koncového bodu spojení:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Volby určující koncový bod spojení" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Neurčen žádný koncový bod spojení" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Určeno více koncových bodů spojení" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Varování: Podle dat introspection rozhraní „%s“ neexistuje\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Varování: Podle dat introspection metoda „%s“ neexistuje na rozhraní „%s“\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Volitelný cíl signálu (jedinečný název)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Cesta objektu, na kterou se má vyslat signál" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Název signálu a rozhraní" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Vyslat signál." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Chyba při spojení: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Chyba: neurčena cesta objektu.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Chyba: %s není platnou cestou objektu\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Chyba: neurčen žádný signál.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Chyba: signál musí být úplný název.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Chyba: %s není platným názvem rozhraní\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Chyba: %s není platným názvem členu\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Chyba: %s není platným jedinečným názvem sběrnice.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Chyba při analyzování parametru %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Chyba při vyprazdňování spojení: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Název cíle, u kterého se má spustit metoda" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Cesta objektu, u kterého se má spustit metoda" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Název metody a rozhraní" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Časový limit v sekundách" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Spustit metodu na vzdáleném objektu." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Chyba: Neurčen žádný cíl\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Chyba: Neurčena žádná cesta objektu\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Chyba: Název metody neurčen\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Chyba: Název metody „%s“ je neplatný\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Chyba při analyzování parametru %d typu „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Název cíle, u kterého provést introspection" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Cesta objektu, u které provést introspection" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Vypsat XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Provést introspection potomka" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Vypsat pouze vlastnosti" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Provést introspection vzdáleného objektu." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Název cíle určený ke sledování" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Cesta objektu určená ke sledování" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Sledovat vzdálený objekt." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Bez názvu" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "V souboru desktop nezadáno pole Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Nelze nalézt terminál vyžadovaný pro aplikaci" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Informace o aplikaci postrádá identifikátor" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nelze vytvořit uživatelský soubor desktop %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Vlastní definice %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "mechanika neprovádí eject (vysouvání) nebo eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "mechanika neprovádí dotazování na média" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "mechanika neprovádí spuÅ¡tění" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "mechanika neprovádí zastavení" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Podpora TLS je nedostupná" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nelze zpracovat verzi %d kódování GEmblem" + +#: ../gio/gemblem.c:334 +#, 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:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nelze zpracovat verzi %d kódování GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Očekáváno GEmblem u GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Obsahující připojené neexistuje" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Nelze kopírovat nad adresář" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Nelze kopírovat adresář nad adresář" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Cílový soubor existuje" + +#: ../gio/gfile.c:2547 +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:2811 +msgid "Splice not supported" +msgstr "splice() není podporováno" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Chyba při spojování souboru: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Nelze kopírovat zvláštní soubor" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Zadaný symbolický odkaz je neplatný" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Zahozené není podporováno" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Názvy souborů nemohou obsahovat „%c“" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "svazek neprovádí připojení" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Žádná aplikace není zaregistrována k obsluze tohoto souboru" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator je uzavřen" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Souborový enumerator má nevykonanou operaci" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Proud nepodporuje query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Posouvání není v proudu podporováno" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Zkrácení nepodporováno ve vstupním proudu" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Zkrácení není v proudu podporováno" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Chybný počet tokenů (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Název třídy %s nemá typ" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typ %s neimplementuje rozhraní GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s není mezi třídami" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Chybné číslo verze: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Nelze zpracovat poskytnutou verzi kódování ikony" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Není zadána žádná adresa" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Délka %u je pro adresu příliÅ¡ dlouhá" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adresa má nastavené bity za hranicí danou prefixem délky" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Nelze zpracovat „%s“ jak masku adresy IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Adresa socketu nemá dostatek místa" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nepodporovaná adresa socketu" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Proud má otevřenou operaci" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Prvek <%s> není povolen uvnitř <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Prvek <%s> není povolen na nejvyšší úrovni" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Soubor %s s v prostředku nachází vícekrát" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Nelze najít „%s“ v žádné ze zdrojových složek" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Nelze nají „%s“ v aktuální složce" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Neznámá volba zpracování „%s“" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Nelze vytvořit dočasný soubor „%s“" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +#| msgid "Error processing input file with xmllint" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Chyba při zpracování vstupního souboru pomocí xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +#| msgid "Error processing input file with to-pixdata" +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Chyba při zpracování vstupního souboru pomocí to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Chyba čtení souboru „%s“: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Chyba při komprimaci souboru „%s“" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text nemůže být umístěn uvnitř <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "název výstupního souboru" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "SOUBOR" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Složka, ze které mají být čteny soubory (výchozí je aktuální složka)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "SLOŽKA" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Generovat výstup ve formátu vybraného podle přípony v názvu cílového souboru" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Generovat hlavičkový soubor" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Generovat zdrojový kód, který se použije ve vaÅ¡em zdrojovém kódu jako odkaz " +"na soubor prostředků" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Generovat seznam závislostí" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Prostředek nevytvářet a neregistrovat automaticky" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Název identifikátoru C použitý ke generování zdrojového kódu" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Přeložit vÅ¡echny specifikace prostředků do souboru prostředků.\n" +"Soubory se specifikacemi prostředků musí mít příponu .gschema.xml,\n" +"a soubor prostředků musí mít příponu .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Měl by být zadán právě jeden název souboru\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "prázdné názvy nejsou povoleny" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "neplatný název „%s“: názvy musí začínat malým písmenem" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +#| msgid "" +#| "invalid name '%s': invalid character '%c'; only lowercase letters, " +#| "numbers and dash ('-') are permitted." +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"neplatný název „%s“: neplatný znak „%c“; pouze malá písmena, číslice a " +"pomlčka („-“) jsou povoleny." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +#| msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"neplatný název „%s“: dvě po sobě následující pomlčky („--“) nejsou povoleny." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "neplatný název „%s“: posledním znakem nemůže být pomlčka („-“)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "neplatný název „%s“: maximální délka je 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " již bylo určeno" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ke schématu „list-of“ nelze přidat klíče" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " již bylo určeno" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" má přednost před v ; " +"použijte ke změně hodnoty" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"právě jeden z „type“, „enum“ nebo „flags“ musí být vybrán jako atribut ke " +"klíči " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (zatím) nebylo určeno." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "neplatný řetězec typu GVariant „%s“" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " zadáno, ale schéma nic nerozÅ¡iřuje" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "neexistuje žádné k přepsání" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " již bylo určeno" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " již bylo určeno" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr " rozÅ¡iřuje zatím neexistující schéma „%s“" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr " je seznamem zatím neexistujícího schématu „%s“" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nemůže být seznamem schématu s cestou" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nemůže rozšířit schéma s cestou" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" je seznam rozÅ¡iřující , což není seznam" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" rozÅ¡iřuje , ale " +"„%s“ nerozÅ¡iřuje „%s“" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "cesta, je-li zadána, musí začínat lomítkem" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "cesta seznamu musí končit znakem „:/“" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> již bylo určeno" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "Prvek <%s> není povolen na nejvyšší úrovni" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict bylo určeno; ukončuje se.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Celý tento soubor byl ignorován.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoruje se tento soubor.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Klíč „%s“ neexistuje ve schématu „%s“, jak bylo určeno v přepisujícím " +"souboru „%s“" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoruje se přepsání u tohoto klíče.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " a --strict bylo určeno; ukončuje se.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"chyba při analýze klíče „%s“ ve schématu „%s“, jak bylo určeno v " +"přepisujícím souboru „%s“: %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoruje se přepsání u tohoto klíče.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +#| msgid "" +#| "override for key `%s' in schema `%s' in override file `%s' is out of the " +#| "range given in the schema" +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"přepsání u klíče „%s“ ve schématu „%s“ v přepisujícím souboru „%s“ je mimo " +"rozsah zadaný ve schématu" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"přepsání u klíče „%s“ ve schématu „%s“ v přepisujícím souboru „%s“ není v " +"seznamu platných možností" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "kde ukládat soubor gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "PřeruÅ¡it při libovolných chybách ve schématech" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Nezapisovat soubor gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Nevynucovat omezení názvů klíče" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompilovat vÅ¡echny soubory schémat GSettings do mezipaměti schémat.\n" +"Soubory schémat musí mít rozšíření .gschema.xml,\n" +"a soubor mezipaměti se jmenuje gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Měl by být zadán právě jeden název adresáře\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Žádné soubory schémat nenalezeny: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "nedělá se nic.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "odstraněn existující výstupní soubor.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Neplatný název souboru %s" + +#: ../gio/glocalfile.c:967 +#, 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:1135 +msgid "Can't rename root directory" +msgstr "Nelze přejmenovat kořenový adresář" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Chyba při přejmenovávání souboru: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Soubor nelze přejmenovat, název souboru již existuje" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Neplatný název souboru" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Nelze otevřít adresář" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Chyba při otevírání souboru: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Chyba při odstraňování souboru: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Chyba při zahazování souboru: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nelze vytvořit adresář koÅ¡e %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Ke koÅ¡i nelze nalézt adresář nejvyšší úrovně" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Nelze nalézt nebo vytvořit adresář koÅ¡e" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nelze vytvořit informační soubor o zahozeném: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nelze zahodit soubor: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "vnitřní chyba" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Chyba při vytváření adresáře: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Systém souborů nepodporuje symbolické odkazy" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Chyba při vytváření symbolického odkazu: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Chyba při přesunování souboru: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Adresář nelze přesunout nad adresář" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Vytvoření záložního souboru selhalo" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Chyba při odstraňování cílového souboru: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Přesunování mezi připojeními není podporováno" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Hodnota atributu nesmí být prázdná" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Neplatný typ atributu (očekáván řetězec)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Neplatný název rozšířeného atributu" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Chyba při nastavování rozšířeného atributu „%s“: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (neplatné kódování)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Chyba při získávání informací pro soubor „%s“: %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Chyba při získávání informací pro popisovače souboru: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neplatný typ atributu (očekáván uint32)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neplatný typ atributu (očekáván uint64)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neplatný typ atributu (očekáván bajtový řetězec)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "Nelze nastavit oprávnění na symbolických odkazech" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Chyba při nastavování oprávnění: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "Chyba při nastavování vlastníka: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "symbolický odkaz nesmí být prázdný" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Chyba při nastavování symbolického odkazu: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, 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:2248 +msgid "SELinux context must be non-NULL" +msgstr "Kontext SELinux nesmí být prázdný" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Chyba při nastavování kontextu SELinux: %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "V tomto systému není SELinux povolen" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Nastavení atributu %s není podporováno" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Chyba při čtení ze souboru: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Chyba při hledání v souboru: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Chyba při zavírání souboru: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Chyba při zápisu do souboru: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Chyba při vytváření záložní kopie: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Chyba při přejmenovávání dočasného souboru: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Chyba při zkracování souboru: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Chyba při otevírání souboru „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Cílový soubor je adresářem" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Cílový soubor není obyčejným souborem" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Soubor byl externě pozměněn" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Chyba při odstraňování starého souboru: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Poskytnut neplatný GSeekType" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Neplatný požadavek na hledání" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nelze zkrátit GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Nelze měnit velikost výstupního proudu paměti" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Nelze změnit velikost výstupního proudu paměti" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Požadováno hledání před počátkem proudu" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "připojené neprovádí synchronní odhad typu obsahu" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Název počítače „%s“ obsahuje „[“, ale nikoliv „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Síť není dostupná" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Počítač není dostupný" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Nelze vytvořit sledování sítě: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Nelze vytvořit sledování sítě: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Nelze zjistit stav sítě: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Výstupní proud neprovádí zápis" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Zdrojový proud je již ukončen" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Chyba při řeÅ¡ení „%s“: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Chyba při zpětném řeÅ¡ení „%s“: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Záznam DNS požadovaného typu pro „%s“ neexistuje" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Dočasně není možné vyřeÅ¡it „%s“" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Chyba při řeÅ¡ení „%s“" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Obdržena neúplná data z \"%s\"" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Prostředek v „%s“ neexistuje" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Prostředek v „%s“ se nezdařilo dekomprimovat" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Prostředek v „%s“ není složkou" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Vstupní proud neimplementuje posouvání" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Vypsat nápovědu" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[PŘÍKAZ]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Vypsat oddíly obsahující prostředky v SOUBORU ve formátu elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Vypsat prostředky\n" +"Je-li zadán ODDÍL, jsou vypsány pouze prostředky v tomto oddíle\n" +"Je-li zadána CESTA, jsou vypsány jen odpovídající prostředky" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "SOUBOR [CESTA]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "ODDÍL" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Vypsat prostředky včetně podrobností\n" +"Je-li zadán ODDÍL, jsou vypsány pouze prostředky v tomto oddíle\n" +"Je-li zadána CESTA, jsou vypsány jen odpovídající prostředky\n" +"Podrobnosti zahrnují oddíl, velikost a komprimaci" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Vybalit prostředky ze souboru na standardní výstup" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "SOUBOR CESTA" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Neznámý příkaz „%s“\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Použití:\n" +" gresource [--section ODDÍL] PŘÍKAZ [ARGUMENTY…]\n" +"\n" +"Příkazy:\n" +" help Zobrazit tyto informace\n" +" sections Vypsat oddíly s prostředky\n" +" list Vypsat prostředky\n" +" details Vypsat prostředky včetně prodrobností\n" +" extract Vybalit prostředky\n" +"\n" +"Další informace získáte zadáním „gresource help PŘÍKAZ“.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Použití:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumenty:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " ODDÍL (Volitelný) název oddílu elf\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " PŘÍKAZ (Volitelný) příkaz, který má být popsán\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" SOUBOR Soubor ve formátu elf (spustitelný nebo sdílená knihovna)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" SOUBOR Soubor ve formátu elf (spustitelný nebo sdílená knihovna)\n" +" nebo přeložený soubor prostředků\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CESTA]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CESTA (Volitelná) cesta k prostředku (může být neúplná)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CESTA" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CESTA Cesta k prostředku\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Schéma „%s“ neexistuje\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schéma „%s“ není přemístitelné (cesta nesmí být určena)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schéma „%s“ je přemístitelné (cesta musí být určena)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Poskytnuta prázdná cesta.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Cesta musí začínat lomítkem (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Cesta musí končit lomítkem (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Cesta nesmí obsahovat dvě po sobě jdoucí lomítka (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Klíč „%s“ neexistuje\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Poskytnutá hodnota je mimo platný rozsah\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Vypíše nainstalovaná (nepřemístitelná) schémata" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Vypíše nainstalovaná přemístitelná schémata" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Vypíše klíče ve SCHÉMATU" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHÉMA[:CESTA]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Vypíše potomky SCHÉMATU" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Vypíše klíče a hodnoty, rekurzivně\n" +"Není-li zadáno SCHÉMA, vypíše vÅ¡echny klíče\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHÉMA[:CESTA]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Získá hodnotu KLÍČE" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHÉMA[:CESTA] KLÍČ" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Dotáže se na rozsah platných hodnot KLÍČE" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Nastaví hodnotu KLÍČE k HODNOTĚ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHÉMA[:CESTA] KLÍČ HODNOTA" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Nastaví KLÍČ na výchozí hodnotu" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Resetovat vÅ¡echny klíče ve SCHÉMATU na výchozí hodnoty" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Zjistí, zda je KLÍČ zapisovatelný" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Sleduje změny KLÍČE.\n" +"Není-li zadán KLÍČ, sleduje vÅ¡echny klíče ve SCHÉMATU.\n" +"Sledování zastavíte použitím ^C.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHÉMA[:CESTA] [KLÍČ]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Použití:\n" +" gsettings PŘÍKAZ [ARGUMENTY…]\n" +"\n" +"Příkazy:\n" +" help Zobrazit tuto informaci\n" +" list-schemas Vypsat nainstalovaná schémata\n" +" list-relocatable-schemas Vypsat nainstalovaná přemístitelná schémata\n" +" list-keys Vypsat klíče ve schématu\n" +" list-children Vypsat potomky schématu\n" +" list-recursively Vypsat klíče a hodnoty, rekurzivně\n" +" range Dotázat se na rozsah klíče\n" +" get Získat hodnotu klíče\n" +" set Nastavit hodnotu klíče\n" +" reset Hodnotu klíče na výchozí\n" +" reset-recursively VÅ¡echny hodnoty v daném schématu na výchozí\n" +" writable Zkontrolovat, zda je klíč zapisovatelný\n" +" monitor Sledovat změny\n" +"\n" +"Podrobnou nápovědu získáte použitím „gsettings help PŘÍKAZ“.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Použití:\n" +" gsettings [--schemadir SLOŽKA_SCHÉMAT] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SLOŽKA_SCHÉMAT Složka, ve které se mají hledat dodatečná schémata\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHÉMA Název schématu\n" +" CESTA Cesta, pro přemístitelná schémata\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KLÍČ (Volitelný) klíč uvnitř schématu\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KLÍČ Klíč uvnitř schématu\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " HODNOTA Hodnota, která má být nastavena\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Poskytnut prázdný název schématu\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Neplatný socket, nebyl spuÅ¡těn" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neplatný socket, spuÅ¡tění selhalo kvůli: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket je již ukončen" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Časový limit V/V socketu vyprÅ¡el" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "vytváří se GSocket z fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nelze vytvořit socket: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Byla zadána neznámá rodina" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Byl zadán neznámý protokol" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "nezdařilo se získat místní adresu: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "nezdařilo se získat vzdálenou adresu: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "nezdařilo se naslouchání: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Chyba při propojení na adresu: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Chyba připojování ke skupině hromadného vysílání: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Chyba při opouÅ¡tění skupiny hromadného vysílání: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Není podpora pro hromadné vysílání určené zdrojem" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Chyba při přijímání spojení: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Probíhá spojení" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nelze získat nevyřízenou chybu: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Chyba při získávání dat: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Chyba při odesílání dat: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nelze ukončit socket: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Chyba při zavírání socketu: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čeká se na stav socketu: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Chyba při odesílání zprávy: %s" + +#: ../gio/gsocket.c:3825 +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage nepodporováno na Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Chyba při získávání zprávy: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials není u tohoto OS implementováno" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nelze se připojit k serveru proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nelze se připojit k %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Nelze se připojit: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Neznámá chyba při spojení" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +#| msgid "Trying to proxy over non-TCP connection is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Není podporován pokus o proxy přes spojení, které není založeno na TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokol proxy „%s“ není podporován." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Naslouchající je již uzavřen" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Přidaný socket je uzavřen" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nepodporuje adresy IPv6 „%s“" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Uživatelské jméno je příliÅ¡ dlouhé na protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Název počítače „%s“ je příliÅ¡ dlouhý na protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Server není proxy serverem SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Spojení přes server SOCKSv4 bylo odmítnuto" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Server není proxy serverem SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 proxy vyžaduje ověření." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 vyžaduje metodu ověření nepodporovanou v GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Uživatelské jméno nebo heslo je příliÅ¡ dlouhé na protokol SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Ověření SOCKSv5 selhalo z důvodu chybného uživatelského jména nebo hesla." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Název počítače „%s“ je příliÅ¡ dlouhý na protokol SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Proxy server SOCKSv5 používá neznámý typ adresy." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Vnitřní chyba proxy serveru SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Spojení SOCKSv5 není povoleno zadaným pravidlem." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Počítač není přes server SOCKSv5 dostupný." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Síť není přes server SOCKSv5 dostupná." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Spojení bylo přes SOCKSv5 proxy odmítnuto." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy nepodporuje příkaz „connect“." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy nepodporuje poskytnutý typ adresy." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Neznámá chyba SOCKSv5 proxy." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nelze zpracovat verzi %d kódování GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nelze deÅ¡ifrovat soukromý klíč kódovaný jako PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nenalezen žádný soukromý klíč kódovaný jako PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nelze analyzovat soukromý klíč kódovaný jako PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nenalezen žádný certifikát kódovaný jako PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nelze analyzovat certifikát kódovaný jako PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Toto je poslední možnost zadat heslo správně před tím, než bude přístup " +"zablokován." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Několik předeÅ¡lých hesel nebylo zadáno správně a po dalším nesprávně zadaném " +"heslu bude přístup zablokován." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Zadané heslo není správné." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, 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:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Neočekávaný typ pomocných dat" + +#: ../gio/gunixconnection.c:195 +#, 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:211 +msgid "Received invalid fd" +msgstr "Přijato neplatné fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Chyba při odesílání přihlaÅ¡ovacích údajů: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Chyba při kontrole, zda je SO_PASSCRED povoleno u socketu: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Neočekávaná délka volby při kontrole, zda je SO_PASSCRED povoleno u socketu. " +"Očekáváno %d bajtů, obdrženo %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Chyba při povolování SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"U odeslání přihlaÅ¡ovacích údajů očekáváno přečtení jednoho bajtu, ale " +"přečteno nula bajtů" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Ovládací zpráva nebyla očekávána, ale obdrženo %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Chyba při zakazování SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Chyba při čtení z popisovače souboru: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Chyba při zavírání popisovače souboru: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Kořen systému souborů" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Chyba při zápisu do popisovače souboru: %s" + +#: ../gio/gunixsocketaddress.c:244 +#| msgid "Abstract unix domain socket addresses not supported on this system" +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "svazek neprovádí eject (vysouvání) nebo eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Nelze nalézt aplikaci" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Chyba při spouÅ¡tění aplikace: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI nejsou podporovány" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "změny asociací nepodporovány na Win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Vytváření asociací nepodporováno na Win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Chyba při čtení z obsluhy: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Chyba při zavírání obsluhy: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Chyba při zápisu do obsluhy: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nedostatek paměti" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Vnitřní chyba: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Vyžadováno více na vstupu" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Neplatná komprimovaná data" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresa, na které se má naslouchat" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorováno, kvůli kompatibilitě s GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Vypsat adresu" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Vypsat adresu v režimu shellu" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Spustit službu dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Nesprávné argumenty\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočekávaný atribut „%s“ prvku „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atribut „%s“ prvku „%s“ nenalezen" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, 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:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočekávaná značka „%s“ v „%s“" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Záložka URI „%s“ již existuje" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nebyla nalezena záložka URI „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Žádné skupiny nenastaveny v záložce URI „%s“" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Částečná posloupnost znaků na konci vstupu" + +#: ../glib/gconvert.c:1053 +#, 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:1870 +#, 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:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI „%s“ místního souboru nesmí obsahovat „#“" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI „%s“ je neplatné" + +#: ../glib/gconvert.c:1909 +#, 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:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI „%s“ obsahuje nesprávně změněné znaky" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "„%s“ není absolutní cestou" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Neplatný název počítače" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "dop." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "odp." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %-d. %B %Y, %H:%M:%S %Z" + +# This might be e.g. %Y-%m-%d or %e. %m. %Y as well. See also http://prirucka.ujc.cas.cz/?id=810. +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +# This might be e.g. %k:%M:%S or %k.%M.%S as well. See also http://prirucka.ujc.cas.cz/?id=820. +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "leden" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "únor" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "březen" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "duben" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "květen" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "červen" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "červenec" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "srpen" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "září" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "říjen" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "listopad" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "prosinec" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "led" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "úno" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "bře" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "dub" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "kvě" + +# Might be e.g. "čer" as well. +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "čen" + +# Might be e.g. "čvc" as well. +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "čec" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "srp" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "zář" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "říj" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "lis" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "pro" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "pondělí" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "úterý" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "středa" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "čtvrtek" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "pátek" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sobota" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "neděle" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "po" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "út" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "st" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "čt" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "pá" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "so" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ne" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Chyba při otevírání adresáře „%s“: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Chyba čtení souboru „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Soubor „%s“ je příliÅ¡ velký" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Chyba při čtení ze souboru „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nelze otevřít soubor „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nelze otevřít soubor „%s“: fdopen() selhalo: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nelze vytvořit soubor „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nelze zapisovat do souboru „%s“: fwrite() selhalo: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nelze zapisovat do souboru „%s“: fflush() selhalo: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nelze zapisovat do souboru „%s“: fsync() selhalo: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nelze zavřít soubor „%s“: fclose() selhalo: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablona „%s“ je neplatná, neměla by obsahovat „%s“" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablona „%s“ neobsahuje XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nelze přečíst symbolický odkaz „%s“: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Symbolické odkazy nejsou podporovány" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Ve vstupní vyrovnávací paměti zbyla nepřevedená data" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanál ukončen částí znaku" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Není obyčejným souborem" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neplatný název skupiny: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Soubor klíče nezačíná skupinou" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neplatný název klíče: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Soubor klíče obsahuje nepodporované kódování „%s“" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Soubor klíče nemá skupinu „%s“" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Soubor klíče nemá klíč „%s“" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Soubor klíče obsahuje klíč „%s“ ve skupině „%s“, který má " +"neinterpretovatelnou hodnotu." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Klíč „%s“ ve skupině „%s“ má hodnotu „%s“, když byla očekávána „%s“" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +msgid "Key file contains escape character at end of line" +msgstr "Soubor klíče obsahuje na konci řádku znak změny" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Soubor klíče obsahuje neplatnou posloupnost pro změnu „%s“" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Hodnotu „%s“ nelze interpretovat jako číslo." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celočíselná hodnota „%s“ mimo rozsah" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Hodnotu „%s“ nelze interpretovat jako pravdivostní hodnotu." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Nelze získat atributy souboru „%s%s%s%s“: fstat() selhalo: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Nelze mapovat „%s%s%s%s“: mmap() selhalo: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nelze otevřít soubor „%s“: open() selhalo: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Chyba na řádku %d, znak %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s“ není platným názvem " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s“ není platným názvem: „%c“ " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Chyba na řádku %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Odkaz na znak „%-.*s“ nekóduje povolený znak" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nalezena prázdná entita „&;“, platnými entitami jsou: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Název entity „%-.*s“ není znám" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musí začínat prvkem (například: )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prázdný nebo obsahuje pouze mezery" + +#: ../glib/gmarkup.c:1721 +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:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument neočekávaně skončil uvnitř názvu prvku" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument neočekávaně skončil uvnitř názvu atributu" + +#: ../glib/gmarkup.c:1754 +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:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument neočekávaně skončil uvnitř hodnoty atributu" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Použití:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[PŘEPÍNAČ…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Přepínače nápovědy:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Zobrazit přepínače nápovědy" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Zobrazit vÅ¡echny přepínače nápovědy" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Přepínače aplikace:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nelze zpracovat celočíselnou hodnotu „%s“ u %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celočíselná hodnota „%s“ u %s mimo rozsah" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nelze zpracovat celočíselnou (double) hodnotu „%s“ u %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Celočíselná (double) hodnota „%s“ u %s mimo rozsah" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Chyba volby %s při syntaktické analýze" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Chybí parametr %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Neznámý přepínač %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "poÅ¡kozený objekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "vnitřní chyba nebo poÅ¡kozený objekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "nedostatek paměti" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "dosažen limit zpětného vyhledávání" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "dosažen limit rekurze" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "neplatná kombinace příznaků nového řádku" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "chybný offset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "zkrácené utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekurzivní smyčka" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "neznámá chyba" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ na konci vzorku" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c na konci vzorku" + +#: ../glib/gregex.c:335 +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "nerozpoznaný znak následuje po \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "čísla v {} quantifier nejsou v pořádku" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "číslo v {} quantifier je příliÅ¡ vysoké" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "schází koncový znak ] znakové třídy" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "neplatná posloupnost pro změnu ve znakové třídě" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "rozsah ve znakové třídě není v pořádku" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nic k opakování" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "nepředpokládané opakování" + +#: ../glib/gregex.c:360 +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "nerozpoznaný znak po (? nebo (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "schází koncový znak )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "odkaz na neexistující podřazený vzorek" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "po komentáři schází znak )" + +#: ../glib/gregex.c:375 +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "regulární výraz je příliÅ¡ dlouhý" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "nelze získat paměť" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "znak ) bez počátečního znaku (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "přetečení kódu" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "nerozpoznaný znak před (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "zpětný výrok není pevné délky" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "nesprávně utvořené číslo nebo název po (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "podmínková skupina obsahuje více než dvě větve" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "po (?( očekáván výrok" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R či (?[+-]číslice musí být následovány znakem )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "neplatný název třídy POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "Porovnávací prvky POSIX nejsou podporovány" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "znaková hodnota v posloupnosti \\x{…} je příliÅ¡ vysoká" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "neplatná podmínka (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C není dovoleno ve zpětném výroku" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "znaky escape \\L, \\l, \\N{název}, \\U a \\u nejsou podporovány" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekurzivní volání by se mohlo dostat do nekonečné smyčky" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "nerozpoznaný znak pře (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "schází ukončovací člen v názvu podřazeného vzorku" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dva nazvané podřazené vzorky mají stejný název" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "chybně utvořená posloupnost \\P nebo \\p" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "neznámý název vlastnosti po \\P či \\p" + +#: ../glib/gregex.c:453 +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:456 +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:459 +msgid "octal value is greater than \\377" +msgstr "osmičková hodnota je větší než \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "přetečení přijímaných informací překládaného pracovního prostoru" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "v předchozím kroku kontrolovaný odkazovaný podřazený vzorek nenalezen" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "skupina DEFINE obsahuje více než jednu větev" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "neslučitelné volby NEWLINE" + +#: ../glib/gregex.c:476 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"po \\g nenásleduje název nebo číslo ve složené nebo lomené závorce nebo v " +"uvozovkách, nebo nenulové číslo" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "číslovaná reference nesmí být nula" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "argument není povolen u (*ACCEPT), (*FAIL) nebo (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) nerozpoznáno" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "číslo je příliÅ¡ velké" + +#: ../glib/gregex.c:492 +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "schází název podřazeného vzorku po (?&" + +#: ../glib/gregex.c:495 +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "očekáváno číslo za (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] je neplatný datový znak v režimu kompatibility JavaScript" + +#: ../glib/gregex.c:501 +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "rozdílné názvy podřazených vzorků stejného čísla nejsou povoleny" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) musí mít argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "po \\c nesmí následovat znak ASCII" + +#: ../glib/gregex.c:510 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "po \\k nenásleduje název ve složené nebo lomné závorce nebo v uvozovkách" + +#: ../glib/gregex.c:513 +#| msgid "Seek not supported on base stream" +msgid "\\N is not supported in a class" +msgstr "\\N není podporováno ve třídě" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "příliÅ¡ mnoho dopředných referencí" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "název je příliÅ¡ dlouhý v (*MARK), (*PRUNE), (*SKIP) nebo (*THEN)" + +#: ../glib/gregex.c:522 +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "znaková hodnota v posloupnosti \\u.... je příliÅ¡ vysoká" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knihovna PCRE byla přeložena bez podpory UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knihovna PCRE byla přeložena bez podpory vlastností UTF-8" + +#: ../glib/gregex.c:1331 +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "Knihovna PCRE je přeložena s nekompatibilními volbami" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "očekáváno číslo nebo „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "očekáváno Å¡estnáctkové číslo" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "v symbolickém odkazu chybí „<“" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "neukončený symbolický odkaz" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "symbolický odkaz o nulové délce" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "očekáváno číslo" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "nedovolený symbolický odkaz" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "osamocené koncové „\\“" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "neznámá posloupnost pro změnu" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Text v uvozovkách nezačíná uvozovkami" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text je prázdný (nebo obsahuje pouze mezery)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nelze číst data z procesu potomka (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekávaná chyba v waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Proces potomka skončil s kódem %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Proces potomka byl zabit signálem %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Proces potomka byl zastaven signálem %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Proces potomka neskončil normálně" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nelze číst z roury potomka (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nelze rozvětvit (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nelze přejít do adresáře „%s“ (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nelze spustit proces potomka „%s“ (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nelze rozvětvit proces potomka (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznámá chyba při běhu procesu potomka „%s“" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Nelze číst data z procesu potomka" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nelze spustit proces potomka (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neplatný název programu: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neplatný řetězec v poli argumentů na %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neplatný řetězec v prostředí: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neplatný aktuální adresář: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nelze spustit pomocný program (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Znak je mimo rozsah UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Neplatná posloupnost na vstupu převodu" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Znak je mimo rozsah UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtů" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajt" +msgstr[1] "%s bajty" +msgstr[2] "%s bajtů" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Neobvyklé ukončení programu při spouÅ¡tění příkazového řádku „%s“: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Příkazový řádek „%s“ skončil s nenulovým stavem ukončení %d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "dosažen limit pracovního prostoru prázdných dílčích řetězců" + +#~ 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" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "opakování skupiny DEFINE není povoleno" diff --git a/po/cy.po b/po/cy.po new file mode 100644 index 0000000..8c7b7f4 --- /dev/null +++ b/po/cy.po @@ -0,0 +1,3853 @@ +# glib yn Gymraeg. +# This file is distributed under the same license as the libgnome package. +# Kyfieithu (http://www.kyfieithu.co.uk), 2003. +# Dafydd Harries , 2003 2004. +# Rhys Jones , 2003-2006. +# Iestyn Pryce , 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2009-12-21 14:56+0100\n" +"Last-Translator: Iestyn Pryce \n" +"Language-Team: Welsh \n" +"Language: cy\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==2) ? 1 : 0;\n" +"X-Generator: Virtaal 0.5.0\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Priodwedd annisgwyl '%s' i'r elfen '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Priodwedd '%s' o elfen '%s' heb ei chanfod" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag annisgwyl '%s'; disgwyliwyd y tag '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag annisgwyl '%s' o fewn '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Ni ddarganfuwyd ffeil llyfrnodau ddilys yn y plygell data" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Llyfrnod ar gyfer yr URI '%s' yn bodoli eisoes" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Dim llyfrnod wedi ei ganfod ar gyfer yr URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Methwyd agor trawsnewidydd rhwng '%s' a '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Dilyniant nod rhannol ar ddiwedd y mewnbwn" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Methu trawsnewid '%s' wrth gefn i'r set godau '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Mae'r LAU '%s' yn annilys" + +#: ../glib/gconvert.c:1925 +#, 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:1941 +#, 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:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nid yw'r llwybr '%s' yn llwybr gosodedig" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Enw gwesteiwr annilys" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "Dydd %A %d mis %B %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%l:%M:%S %P %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Ionawr" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Chwefror" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Mawrth" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Ebrill" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Mehefin" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Gorffennaf" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ion" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Chw" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Maw" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Ebr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Meh" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Gor" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Llun" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Mawrth" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Mercher" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Iau" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Gwener" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sadwrn" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sul" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Llu" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Maw" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mer" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Iau" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Gwe" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sad" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sul" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Mae'r ffeil \"%s\" yn rhy fawr" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Methwyd darllen o'r ffeil '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Methwyd agor y ffeil '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Methwyd agor y ffeil '%s': methiant yn fdopen(): %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fwrite(): %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fflush(): %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Methwyd ysgrifennu i'r ffeil '%s': methodd fsync(): %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Methwyd cau'r ffeil '%s': methodd fclose(): %s" + +#: ../glib/gfileutils.c:1152 +#, 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:1412 +#, 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:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Nid yw'r patrymlun '%s' yn cynnwys XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u beit" +msgstr[1] "%u beit" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u beit" +msgstr[1] "%u beit" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Methwyd agor y ffeil '%s': methodd open(): %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Methwyd mapio'r ffeil '%s': methodd mmap(): %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Gwall ar linell %d golofn %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "dydy '%s' ddim yn enw dilys: '%c'" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Gwall ar linell %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Gwelwyd endid gwag '&;'; mae & " < > a ' yn endidau dilys" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Mae'r enw endid '%-.*s' yn anhysbys" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Rhaid i'r ddogfen ddechrau gydag elfen (e.e. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw elfen" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw priodoledd" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i werth priodoledd" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "gwrthrych wedi'i lygru" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "gwall mewnol neu gwrthrych wedi'i lygru" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "allan o gof" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "wedi cyrraedd terfan cilio" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +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:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "gwall mewnol" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "wedi cyrraedd cyfyngiad ymgylchu" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "gwall anhysbys" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ ar diwedd patrwm" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c ar ddiwedd patrwm" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "mae nod anhysbys yn dilyn \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "] terfynol ar goll ar gyfer y dosbarth nod" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "dim byd i ailadrodd" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "nod anhysbys ar ôl (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "nod anhysbys ar ôl (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "nod anhysbys ar ôl (?P" + +#: ../glib/gregex.c:306 +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:309 +msgid "missing terminating )" +msgstr ") terfynol ar goll" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr ") ar goll ar ôl sylw" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "mynegiad rheolaidd yn rhy fawr" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "wedi methu cael cof" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "enw dosbarth POSIX anhysbys" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "gall yr alwad aliadroddus ailadrodd heb derfyn" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "gwerth octal yn fwy na \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "mae'r grŵp DEFINE yn cynnwys mwy nag un cangen" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "ni chaniateir ailadrodd grŵp DEFINE" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "ailadroddiad anisgwyl" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "gorlif côd" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Gwall tra'n gweddu y mynegiad cyffredinol %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Mae'r llyfrgell PCRE wedi'i grynhoi heb cymorth UTF8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Mae'r llyfrgell PCRE wedi'i grynhoi heb cymorth rhinweddau UTF8" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "yn disgwyl digid hex neu '}'" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "yn disgwyl digid hex" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Cyfeiriant endid heb ei orffen" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "disgwyl digid" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Nid yw'r testun dyfynedig yn dechrau gyda dyfynnod" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Roedd y testun yn wag, neu'n cynnwys gofodnodau'n unig" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Methwyd darllen data o broses plentyn" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Methwyd darllen o bibell plentyn (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Methwyd newid i'r cyfeiriadur '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Methwyd gweithredu proses plentyn (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Enw rhaglen annilys: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Llinyn annilys yn yr amgylchedd: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Cyfeiriadur gweithio annilys: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Methwyd gweithredu proses cymorth (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Methwyd darllen data o broses plentyn (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Gwall annisgwyl yn waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Methwyd fforcio (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Methwyd gweithredu proses plentyn \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Methwyd fforcio proses plentyn (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Gwall anhysbys wrth weithredu proses blentyn \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Nod y tu allan i ystod ddilys UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Dilyniant annilys ym mewnbwn trawsnewidiad" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Nod y tu allan i ystod ddilys UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Defnydd:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPSIWN...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Cymorth Opsiynau:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Dangos opsiynau cymorth" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Dangos bob opsiwn cymorth" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opsiynau Rhaglen:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Methu gramadegu'r gwerth cyfanrif '%s' ar gyfer %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Methu gramadegu'r gwerth dwbl '%s' ar gyfer %s" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Arg ar goll ar gyfer %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Opsiwn anhysbys %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Ni ddarganfuwyd ffeil allwedd ddilys yn y plygellau data" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Ddim yn ffeil cyffredin" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Ffeil yn wag" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Enw grŵp annilys: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Nid yw'r ffeil allwedd yn dechrau gyda grŵp" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Enw allwedd annilys: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ffeil allwedd yn cynnwys yr amgodiad '%s', na gynhelir" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nid oes gan y ffeil allwedd y grŵp '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ffeil allwedd heb fod yn cynnwys yr allwedd '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "Ffeil allwedd yn cynnwys nod dianc ar ddiwedd llinell" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ffeil allwedd yn cynnwys '%s', sy'n ddilyniant dianc annilys" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ni ellir darllen y gwerth '%s' fel rhif." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Gwerth cyfanrif '%s' y tu allan i'r ystod" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ni ellir darllen '%s' fel gwerth Boole." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Mae'r llif wedi'i gau yn barod" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Diddymwyd y weithred" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Dilyniant beit annilys ym mewnbwn trawsnewid" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "math %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Fath anhysbys" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Gwall wrth creu plygell: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Gwall wrth cau ffeil': %s " + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "Dydy %s heb ei ddosbarthu" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "Dydy %s heb ei ddosbarthu" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Mae'r llif wedi'i gau yn barod" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Ni chynhelir sbwriel" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Gwall ar linell %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "dydy '%s' ddim yn enw dilys" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "gwrthrych wedi'i lygru" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Heb enw" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Methwyd canfod y terfynell angenrheidiol ar gyfer y rhaglen" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Methu creu ffeil penbwrdd defnyddiwr %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Methu copïo plygell drosodd" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Methu copïo plygell dros plygell" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Methu copïo plygell yn ailadroddus" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Gwall wrth agor ffeil: %s " + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Methu copïo ffeil arbennig" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Ni chynhelir sbwriel" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dydy enwai ffeiliau ddim yn gallu cynnwys '%c'" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "Does dim un rhaglen wedi cofrestru llyfrnod ar gyfer '%s'" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nifer anghywir o docynnau (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Dim fath ar gyfer enw dosbarth %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Dydy %s heb ei ddosbarthu" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Ni chynhelir sbwriel" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Enw ffeil annilys %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Gwall wrth gyrchu gwybodaeth y system ffeiliau: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Methu ailenwi'r plygell gwraidd" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Gwall wrth ailenwi ffeil: %s " + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Methu ailenwi ffeil, mae ffeil gyda'r enw'n bodoli'n barod" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Enw ffeil annilys" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Gwall wrth agor ffeil: %s " + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Methu agor plygell" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Gwall wrth gwaredu ffeil: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Gwall wrth rhoi ffeil yn y sbwriel: %s " + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Methwyd creu'r plygell sbwriel %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Methu canfod na chreu plygell sbwriel" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Methwyd creu ffeil sbwriel: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Gwall wrth creu plygell: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Methwyd darllen y cyswllt symbolaidd '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Gwall wrth creu cyswllt symbolaidd: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Gwall wrth symud ffeil: %s " + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Methu symud plygell dros plygell" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Gorffennodd y ddogfen yn annisgwyl y tu fewn i enw priodoledd" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Gwall y cyfeiriadur '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (amgodiad annilys)" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Gwall wrth osod cyswllt symbolaidd: %s" + +#: ../gio/glocalfileinfo.c:2013 +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:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Gwall wrth ddarllen ffeil: %s " + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Gwall wrth chwilio ffeil: %s " + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Gwall wrth cau ffeil': %s " + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Gwall wrth greu copï wrth gefn: %s " + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Gwall wrth ailenwi ffeil dros dro: %s " + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Gwall wrth talfyrru ffeil: %s " + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Gwall wrth agor ffeil '%s': %s " + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Ddim yn ffeil cyffredin" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Gwall wrth gwaredu hen ffeil: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Enw rhaglen annilys: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Methu talfyrru GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Opsiwn anhysbys %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Methu newid modd ffeil: methodd waitpid(): %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Gwall wrth drawsnewid: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Methwyd creu'r ffeil '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Dydy %s heb ei ddosbarthu" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Gwall wrth ailenwi ffeil: %s " + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Gwall wrth ddarllen ffeil '%s': %s " + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Gwall ar linell %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Gwall wrth ramadegu opsiwn %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Ni chynhelir cysylltion symbolaidd" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Gwall wrth ddarllen ffeil: %s " + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Gwall wrth cau ffeil': %s " + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Gwall wrth ysgrifennu i ffeil: %s " + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "allan o gof" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "gwall mewnol" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Enw gwesteiwr annilys" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Methu symud plygell dros plygell" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "Dydy %s heb ei ddosbarthu" + +#, 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.po b/po/da.po new file mode 100644 index 0000000..803bc54 --- /dev/null +++ b/po/da.po @@ -0,0 +1,4618 @@ +# Danish translation of glib. +# Copyright (C) 2001-2012 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 +# Kenneth Nielsen , 2011. +# Ask Hjorth Larsen , 2007, 08, 09, 10, 11, 12. +# +# Konventioner: +# +# attribute -> attribut +# header -> toptekst +# message -> besked +# message body -> beskedtekst +# override (objektorienteret programmering) -> overskrive +# property -> egenskab +# signature -> signatur +# 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: 2012-10-15 06:33+0200\n" +"PO-Revision-Date: 2012-10-12 17:29+0200\n" +"Last-Translator: Ask Hjorth Larsen \n" +"Language-Team: Dansk \n" +"Language: da\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "For stor talværdi givet til %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Søgning understøttes ikke af basisstrømmen" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Kan ikke beskære GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Strømmen er allerede lukket" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Beskæring understøttes ikke af basisstrømmen" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Operationen blev afbrudt" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Ugyldigt objekt, ikke initialiseret" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Ufuldstændig flerbytesekvens i inddata" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Utilstrækkelig plads pÃ¥ destinationen" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Ugyldig bytesekvens i konverteringsinddata" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fejl under konvertering: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Initialisering med mulighed for afbrydelse understøttes ikke" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunne ikke konvertere fra \"%s\" til \"%s\"" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s-type" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Ukendt type" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s-filtype" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials er ikke implementeret pÃ¥ dette operativsystem" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Der er ingen understøttelse for GCredentials pÃ¥ din platform" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventet tidlig strømafslutning" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Ikke-understøttet nøgle \"%s\" i adresseindgang \"%s\"" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adressen \"%s\" er ugyldig (kræver præcist en af nøglerne path, tmpdir eller " +"abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Meningsløst nøgle-/værdikombination i adresseindgang \"%s\"" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Fejl i adressen \"%s\" - portattributten er fejlformateret" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Fejl i adressen \"%s\" - familieattributten er fejlformateret" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adresseelementet \"%s\" indeholder intet kolon (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Nøgle-/værdiparret %d, \"%s\" i adresseelementet \"%s\" indeholder ikke et " +"lighedstegn" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Fejl ved af-undvigelse af nøgle eller værdi i nøgle-/værdiparret %d, \"%s\" " +"i adresseelementet \"%s\"" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Fejl i adressen \"%s\" - unix-transporten kræver at præcist en af nøglerne " +"\"path\" eller \"abstract\" er givet" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Fejl i adressen \"%s\" - værtsattributten mangler eller er fejlformateret" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Fejl i adressen \"%s\" - portattributten mangler eller er fejlformateret" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Fejl i adressen \"%s\" - noncefile-attributten mangler eller er " +"fejlformateret" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Fejl ved automatisk opstart: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Ukendt eller ikke-understøttet transport \"%s\" for adressen \"%s\"" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fejl ved Ã¥bning af \"nonce\"-filen \"%s\": %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fejl ved læsning af \"nonce\"-filen \"%s\": %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Fejl ved læsning af \"nonce\"-filen \"%s\". Forventede 16 byte, fandt %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Fejl under skrivning af indhold af \"nonce\"-filen \"%s\" til strømmen:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Den givne adresse er tom" + +# nÃ¥ ja, det er ikke grimmere pÃ¥ dansk end pÃ¥ engelsk +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Kan ikke starte en meddelelsesbus nÃ¥r setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Kan ikke starte en meddelelsesbus uden maskine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Fejl ved kørsel af kommandolinjen \"%s\": " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Skriv et hvilket som helst tegn for at lukke dette vindue)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Sessions-dbus kører ikke, og autostart mislykkedes" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Kan ikke bestemme sessionsbussens adresse (ikke implementeret for dette " +"operativsystem)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Kan ikke bestemme busadressen fra miljøvariablen DBUS_STARTER_BUS_TYPE - " +"ukendt værdi \"%s\"" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Kan ikke bestemme busadressen, da miljøvariablen DBUS_STARTER_BUS_TYPE ikke " +"er angivet" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Ukendt bustype %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Uventet mangel pÃ¥ indhold ved forsøg pÃ¥ at læse en linje" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Uventet mangel pÃ¥ indhold ved forsøg pÃ¥ (sikkert) at læse en linje" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Forsøgte alle tilgængelige godkendelsesmekanismer (forsøgt: %s) " +"(tilgængelige: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Annulleret via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Fejl ved indhentning af oplysninger for kataloget \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Rettigheder for kataloget \"%s\" er fejlformateret. Forventede tilstanden " +"0700, fandt 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fejl ved oprettelse af mappen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fejl ved Ã¥bning af nøgleringen \"%s\" til læsning: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Linje %d i nøgleringen pÃ¥ \"%s\" med indholdet \"%s\" er fejlformateret" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Første symbol i linje %d af nøgleringen pÃ¥ \"%s\" med indholdet \"%s\" er " +"fejlformateret" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Andet symbol i linje %d af nøgleringen pÃ¥ \"%s\" med indholdet \"%s\" er " +"fejlformateret" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Fandt ingen cookie med id %d i nøgleringen pÃ¥ \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fejl ved sletning af forældet lÃ¥sefil \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fejl ved oprettelse af lÃ¥sefil \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fejl ved lukning af (aflænket) lÃ¥sefil \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fejl ved aflænkning af lÃ¥sefil \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fejl ved Ã¥bning af nøgleringen \"%s\" til skrivning: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Yderligere kunne lÃ¥sen for \"%s\" ikke opgives: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Forbindelsen er lukket" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Tiden løb ud" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Der blev fundet ikke-understøttede flag ved oprettelse af en forbindelse pÃ¥ " +"klientsiden" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Ingen grænseflade \"org.freedesktop.DBus.Properties\" pÃ¥ objekt ved stien %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Fejl ved anvendelse af egenskaben \"%s\": Forventede typen \"%s\", men fik " +"\"%s\"" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Ingen sÃ¥dan egenskab \"%s\"" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Egenskaben \"%s\" kan ikke læses" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Egenskaben \"%s\" er skrivebeskyttet" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Ingen sÃ¥dan grænseflade \"%s\"" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Ingen sÃ¥dan grænseflade" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Ingen sÃ¥dan grænseflade \"%s\" pÃ¥ objektet ved stien %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Ingen sÃ¥dan metode \"%s\"" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Beskedtypen \"%s\" er ikke den forventede type, \"%s\"" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Der er allerede eksporteret et objekt for grænsefladen %s pÃ¥ %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoden \"%s\" returnerede typen \"%s\", men forventede \"%s\"" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoden \"%s\" pÃ¥ grænsefladen \"%s\" med signatur \"%s\" findes ikke" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Der er allerede eksporteret et undertræ for %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "typen er INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"Meddelelse for METHOD_CALL: et af toptekstfelterne PATH eller MEMBER mangler" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Meddelelse for METHOD_RETURN: Toptekstfeltet REPLY_SERIAL mangler" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "FEJLmeddelelse: Toptekstfeltet REPLY_SERIAL eller ERROR_NAME mangler" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNALmeddelelse: Toptekstfeltet PATH, INTERFACE eller MEMBER mangler" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNALmeddelelse: Toptekstfeltet PATH bruger den reserverede værdi /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNALbesked: Toptekstfeltet INTERFACE bruger den reserverede værdi org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Ville læse %lu byte men fik EOF" +msgstr[1] "Ville læse %lu bytes men fik EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Forventede gyldig UTF-8-streng, men fandt ugyldige byte ved afsæt %d " +"(strengens længde er %d). Den gyldige UTF-8-streng indtil dette punkt var " +"\"%s\"" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Forventede NUL-byte efter strengen \"%s\", men fandt byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Den fortolkede værdi \"%s\" er ikke en gyldig objektsti til D-Bus" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Fortolket værdi \"%s\" er ikke en gyldig D-Bus-signatur" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Stødte pÃ¥ et array med længde %u byte. Den maksimale længde er 2<<26 byte " +"(64 MiB)." +msgstr[1] "" +"Stødte pÃ¥ et array med længde %u bytes. Den maksimale længde er 2<<26 byte " +"(64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Fortolket værdi \"%s\" for variant er ikke en gyldig D-Bus-signatur" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Fejl ved deserialisering af GVariant med type-streng \"%s\" fra D-Bus-wire-" +"formatet" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Ugyldigt værdi for byterækkefølge (endianness). Forventede 0x6c (\"l\") " +"eller 0x42 (\"B\"), men fandt værdien 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Igyldig hovedprotokolversion. Forventede 1 men fandt %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Signaturtoptekst med signaturen \"%s\" fundet, men beskedteksten er tom" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Fortolket værdi \"%s\" er ikke en gyldig D-Bus-signatur (for tekst)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Ingen signaturtoptekst i beskeden, men beskedteksten er %u byte" +msgstr[1] "Ingen signaturtoptekst i beskeden, men beskedteksten er %u bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Kan ikke deserialisere besked: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Fejl ved serialisering af GVariant med typestreng \"%s\" til D-Bus-wire-" +"formatet" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Beskeden har %d fildeskriptorer, men toptekstfeltet angiver %d " +"fildeskriptorer" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Kan ikke serialisere besked: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Beskedteksten har signatur \"%s\", men der er ingen signaturtoptekst" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Beskedteksten har typesignatur \"%s\", men signaturen i toptekstfeltet er " +"\"%s\"" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Beskedteksten er tom, men signaturen i toptekstfeltet er \"(%s)\"" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Fejlagtig returværdi med beskedtekst af typen \"%s\"" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Fejlagtig returværdi - tom beskedtekst" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Kan ikke hente hardwareprofil: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Kan ikke indlæse /var/lib/dbus/machine-id eller /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Fejl ved kald til StartServiceByName for %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Uventet svar %d fra metoden StartServiceByName(\"%s\")" + +# Ved ikke helt hvad proxy dækker over her +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Kan ikke kalde metode; proxy er for et velkendt navn uden ejer, og proxy " +"blev konstrueret med flaget G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakt navnerum understøttes ikke" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Kan ikke angive \"nonce\"-fil ved oprettelse af server" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fejl ved skrivning af \"nonce\"-fil i \"%s\": %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Strengen \"%s\" er ikke en gyldig D-Bus-GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Kan ikke lytte pÃ¥ ikke-understøttet transport \"%s\"" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMMANDO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Kommandoer:\n" +" help Viser denne information\n" +" introspect Introspicér et fjernobjekt\n" +" monitor OvervÃ¥g et fjernobjekt\n" +" call Kald en metode pÃ¥ et fjernobjekt\n" +" emit Udsend et signal\n" +"\n" +"Brug \"%s KOMMANDO --help\" for at fÃ¥ hjælp om hver kommando.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Fejl: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fejl ved fortolkning af XML til introspektion: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Forbind til systembussen" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Forbind til sessionsbussen" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Forbind til den givne D-Bus-adresse" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Tilvalg for forbindelsesslutpunkt:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Tilvalg, der angiver forbindelsens slutpunkt" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Intet slutpunkt for forbindelsen angivet" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Flere slutpunkter for forbindelsen angivet" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Advarsel: Grænsefladen \"%s\" findes ikke ifølge introspektionsdata\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Advarsel: Metoden \"%s\" findes ikke i grænsefladen \"%s\" ifølge " +"introspektionsdata\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Valgfri destination for signal (unikt navn)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objektsti, der skal udsendes et signal fra" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signal- og grænsefladenavn" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Udsend et signal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Fejl ved forbindelse: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Fejl: Objektstien er ikke angivet.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Fejl: \"%s\" er ikke en gyldig objektsti\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Fejl: Signal er ikke angivet.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Fejl: Signal skal være et fuldt kvalificeret navn.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Fejl: \"%s\" er ikke et gyldigt grænsefladenavn\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Fejl: \"%s\" er ikke et gyldigt medlemsnavn\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Fejl: \"%s\" er ikke et gyldigt unikt busnavn.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fejl ved fortolkning af parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fejl ved tømning (flush) af forbindelse: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Destinationsnavnet, som metoden skal kaldes pÃ¥" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Objektstien, som metoden skal kaldes pÃ¥" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Metode- og grænsefladenavn" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Tidsudløb i sekunder" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Kald en metode pÃ¥ et fjernobjekt." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Fejl: Destinationen er ikke angivet\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Fejl: Objektstien er ikke angivet\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Fejl: Metodenavnet er ikke angivet\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Fejl: Metodenavnet \"%s\" er ugyldigt\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Fejl ved fortolkning af parameter %d af typen \"%s\": %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Destinationsnavnet, der skal introspiceres" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Objektstien, der skal introspiceres" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Udskriv XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Foretag introspektion af underelementer" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Vis kun egenskaber" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspicér et fjernobjekt." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Navn pÃ¥ destination, der skal overvÃ¥ges" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Objektsti, der skal overvÃ¥ges" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "OvervÃ¥g et fjernobjekt." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Unavngivet" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivebordsfil angav intet Exec-felt" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Kan ikke finde terminal krævet af dette program" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan ikke oprette konfigurationsfolder %s for brugerprogram: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan ikke oprette bruger-MIME-konfigurationsfolder %s: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Programinformation mangler en identifikator" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikke oprette brugerskrivebords-fil %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Tilpasset definition for %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drevet implementerer ikke eject eller eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "drevet implementerer ikke forespørgsel om medier" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "drevet implementerer ikke start" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "drevet implementerer ikke stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-understøttelse er ikke tilgængelig" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GEmblem-kodning" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Forkert antal symboler (%d) i GEmblem-kodning" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GEmblemIcon-kodning" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Forkert antal symboler (%d) i GEmblemedIcon-kodning" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Forventede et GEmblem til GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7214 ../gio/gfile.c:7304 ../gio/gfile.c:7388 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Indeholdende montering findes ikke" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Kan ikke kopiere over mappe" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Kan ikke kopiere mappe over mappe" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "MÃ¥lfilen findes" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Kan ikke kopiere mappe rekursivt" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Splejsning understøttes ikke" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fejl ved splejsning af fil: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Kan ikke kopiere specialfil" + +#: ../gio/gfile.c:3554 +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:3714 +msgid "Trash not supported" +msgstr "Affald understøttes ikke" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnavne kan ikke indeholder \"%c\"" + +#: ../gio/gfile.c:6279 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "diskenheden implementerer ikke montering" + +#: ../gio/gfile.c:6387 +msgid "No application is registered as handling this file" +msgstr "Intet program er registreret til hÃ¥ndtering af denne fil" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Optæller er lukket" + +# udviklerkommentar ved tilsvarende streng andetsteds i filen forklarer dette +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Filoptæller arbejder stadig" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Strømmen understøtter ikke query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Søgning understøttes ikke pÃ¥ strømmen" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Afskæring tillades ikke for inputstrømmen" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Afskæring understøttes ikke pÃ¥ strømmen" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Forkert antal tegn (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen type til klassenavn %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typen %s implementerer ikke GIcon-grænsefladen" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typen %s har ingen klasse" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Fejlformateret versionsnummer %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Kan ikke hÃ¥ndtere den givne version af ikonkodningen" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Ingen adresse angivet" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Længden %u er for stor til adressen" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adressen har bit sat ud over præfikslængden" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Kunne ikke fortolke \"%s\" som en IP-adresse-maske" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Utilstrækkelig plads til sokkeladresse" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Sokkeladresse understøttes ikke" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Strøm arbejder stadig" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elementet <%s> er ikke tilladt inden i <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elementet <%s> er ikke tilladt pÃ¥ topniveau" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Filen %s findes flere steder i ressourcen" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Kunne ikke finde \"%s\" i noget kildekatalog" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Kunne ikke finde \"%s\" i det nuværende katalog" + +#: ../gio/glib-compile-resources.c:287 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Ukendt behandlingstilvalg \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:366 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Kunne ikke oprette midlertidig fil: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Fejl ved behandling af inputfil med xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:392 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Fejl ved behandling af inputfil med to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:406 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Fejl ved læsning af filen %s: %s" + +#: ../gio/glib-compile-resources.c:426 +#, c-format +msgid "Error compressing file %s" +msgstr "Fejl ved komprimering af filen %s" + +#: ../gio/glib-compile-resources.c:490 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "der mÃ¥ ikke være tekst inden i <%s>" + +#: ../gio/glib-compile-resources.c:613 +msgid "name of the output file" +msgstr "navnet pÃ¥ outputfilen" + +#: ../gio/glib-compile-resources.c:613 ../gio/glib-compile-resources.c:646 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FIL" + +#: ../gio/glib-compile-resources.c:614 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Katalogerne hvorfra filer læses (som standard det nuværende katalog)" + +#: ../gio/glib-compile-resources.c:614 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "KATALOG" + +#: ../gio/glib-compile-resources.c:615 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Generér output i formatet givet ved mÃ¥lets filendelse" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate source header" +msgstr "Generér kildeheader" + +#: ../gio/glib-compile-resources.c:617 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Generér kildekoden, der bruges til at lænke fra ressourcefilen ind i din kode" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate dependency list" +msgstr "Generér liste af afhængigheder" + +#: ../gio/glib-compile-resources.c:619 +msgid "Don't automatically create and register resource" +msgstr "Opret og registrér ikke ressource automatisk" + +#: ../gio/glib-compile-resources.c:620 +msgid "C identifier name used for the generated source code" +msgstr "C-identifikatornavn, der bruges til genereret kildekode" + +#: ../gio/glib-compile-resources.c:649 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompilér en ressourcespecifikation til en ressourcefil.\n" +"Ressourcespecifikationsfiler har filendelsen .gresource.xml,\n" +"og ressourcefilen har filendelsen .gresource." + +#: ../gio/glib-compile-resources.c:665 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Du skal angive præcist ét filnavn\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "tomme navne tillades ikke" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ugyldigt navn \"%s\": Navne skal begynde med et lille bogstav" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"ugyldigt navn \"%s\": ugyldigt tegn \"%c\"; kun smÃ¥ bogstaver, tal og " +"bindestreg (\"-\") er tilladt." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "ugyldigt navn \"%s\": To bindestreger i træk (\"--\") er ikke tilladt." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "ugyldigt navn \"%s\": Sidste tegn mÃ¥ ikke være en bindestreg (\"-\")." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ugyldigt navn \"%s\": maksimale længde er 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " allerede angivet" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "kan ikke føje nøgler til et \"list-of\"-skema" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " allerede angivet" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" overskygger i ; brug " +" for at ændre værdi" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"præcist en af 'type', 'enum' eller 'flags' skal være angivet som attribut " +"for " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (endnu) ikke defineret." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ugyldig typestreng \"%s\" for GVariant" + +# override og extend bruges i forbindelse med nedarvning i forbindelse med objektorienteret programmering +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " givet, men skemaet nedarver ikke fra noget" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ingen at overskrive" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " allerede angivet" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " allerede angivet" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " nedarver fra skemaet \"%s\", som ikke findes endnu" + +# list of? +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " er en liste for skemaet \"%s\", der ikke findes endnu" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Kan ikke være en liste for et skema med en sti" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Kan ikke udvide et skema med en sti" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" er en liste, der nedarver fra , som ikke er " +"en liste" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" nedarver fra , " +"men \"%s\" nedarver ikke fra \"%s\"" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "en sti, hvis givet, skal starte og slutte med skrÃ¥streg" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "stien for en liste skal slutte med \":/\"" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> allerede angivet" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elementet <%s> er ikke tilladt i topniveau" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict blev angivet; afslutter.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Hele denne fil er blevet ignoreret.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorerer denne fil.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Ingen sÃ¥dan nøgle \"%s\" i skemaet \"%s\" som angivet i overskrivningsfilen " +"\"%s\"" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorerer overskrivning for denne nøgle.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " og --strict blev givet; afslutter.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"fejl ved fortolkning af nøglen \"%s\" i skemaet \"%s\" som givet i " +"overskrivningsfilen \"%s\": %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorerer overskrivning for denne nøgle.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"overskrivning for nøglen \"%s\" i skemaet \"%s\" i overskrivningsfilen \"%s" +"\" er ikke i det interval, skemaet angiver" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"overskrivningen for nøglen \"%s\" i skemaet \"%s\" i overskrivningsfilen \"%s" +"\" er ikke i listen af gyldige valg" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "hvor filen gschemas.compiled skal lægges" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Afbryd ved enhver fejl i skemaer" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Skriv ikke filen gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Gennemtving ikke begrænsninger pÃ¥ nøglenavn" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompilér alle GSettings-skemafiler til et skemamellemlager.\n" +"Schemafiler skal have filendelsen .gschema.xml,\n" +"og mellemlagerfilen kaldes gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Du skal give præcist et katalognavn\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Ingen skemafiler fundet: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "gør intet.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "fjernede eksisterende uddatafil.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Kan ikke finde standardmonitortype for lokal mappe" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldigt filnavn %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fejl ved læsning af filsysteminformation: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Kan ikke omdøbe rodmappen" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fejl ved omdøbning af fil: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Kan ikke omdøbe fil, filnavn findes allerede" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Ugyldigt filnavn" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Kan ikke Ã¥bne mappe" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Fejl ved Ã¥bning af fil: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Fejl under fjernelse af fil: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fejl ved udsmidning af fil: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan ikke oprette affaldsmappe %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan ikke finde topniveau-mappe til affald" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Kan ikke finde eller oprette affaldsmappe" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan ikke oprette affalds-infofil: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan ikke smide fil ud: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "intern fejl" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fejl ved oprettelse af mappen: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet understøtter ikke symbolske henvisninger" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fejl under oprettelse af symbolsk henvisning: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Fejl ved flytning af fil: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Kan ikke flytte mappe over mappe" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Oprettelse af sikkerhedskopi mislykkedes" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fejl ved fjernelse af mÃ¥lfil: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Flytning mellem monteringer understøttes ikke" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Attributværdien mÃ¥ ikke være NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig attributtype (streng forventet)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Ugyldigt udvidet attributnavn" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fejl ved instilling af udvidet attribut \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (ugyldig kodning)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Fejl ved indhentning af oplysninger om filen \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Fejl ved indhentning af oplysninger om fildeskriptor: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig attributtype (uint32 forventet)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig attributtype (uint64 forventet)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig attributtype (byte-streng forventet)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "Kan ikke ændre rettigheder pÃ¥ symlænker" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fejl ved ændring af rettigheder: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fejl ved ændring af ejer: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "symbolsk henvisning mÃ¥ ikke være NULL" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fejl ved manipulation af symbolsk henvisning: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fejl ved ændring af tidspunkt for ændring eller tilgang: %s" + +#: ../gio/glocalfileinfo.c:2248 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontekst skal være forskellig fra NULL" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fejl ved ændring af SELinux-kontekst: %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "SELinux er ikke aktiveret pÃ¥ dette system" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Indstilling af attributten %s understøttes ikke" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fejl ved læsning fra filen: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fejl under søgning i filen: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Fejl ved lukning af filen: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Kan ikke finde standardmonitortype for lokal fil" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fejl under skrivning til filen: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fejl under fjernelse af gammel sikkerhedskopi-henvisning: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fejl under oprettelse af sikkerhedskopi: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fejl under omdøbning af midlertidig fil: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fejl ved beskæring af filen: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fejl ved Ã¥bning af filen \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen er en mappe" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen er ikke en almindelig fil" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Filen blev modificeret eksternt" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fejl under fjernelse af gammel fil: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType angivet" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Ugyldig søgeforespørgsel" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikke beskære GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Hukommelses-uddatastrøm kan ikke ændre størrelse" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Kunne ikke ændre størrelse for hukommelses-uddatastrøm" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Forespurgte om søgning før begyndelse af strøm" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "monteringsobjekt implementerer ikke synkrone gæt pÃ¥ indholdstype" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Værtsnavnet \"%s\" indeholder \"[\", men ikke \"]\"" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Netværket kan ikke nÃ¥s" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Vært kan ikke nÃ¥s" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Kunne ikke oprette netværksovervÃ¥gning: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Kunne ikke oprette netværksovervÃ¥gning: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Kunne ikke finde netværksstatus: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Uddatastrøm implementerer ikke write" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Kildestrømmen er allerede lukket" + +#: ../gio/gresolver.c:912 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fejl ved opløsning af \"%s\": %s" + +#: ../gio/gresolver.c:962 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fejl ved baglæns opløsning af \"%s\": %s" + +#: ../gio/gresolver.c:1165 ../gio/gresolver.c:1364 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Ingen DNS-post af den forespurgte type for \"%s\"" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Midlertidigt ude af stand til at opløse \"%s\"" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fejl ved opløsning af \"%s\"" + +#: ../gio/gresolver.c:1203 ../gio/gresolver.c:1264 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Ufuldstændige data modtaget for \"%s\"" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Ressourcen pÃ¥ \"%s\" findes ikke" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Ressourcen pÃ¥ \"%s\" kunne ikke afkomprimeres" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Ressourcen i \"%s\" er ikke et katalog" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Inputstrømmen implementerer ikke søgning" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Udskriv hjælp" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[KOMMANDO]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Vis sektioner, der indeholder ressourcer, i en elf-FIL" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Vis ressourcer\n" +"Hvis SEKTION er givet, sÃ¥ vis kun ressourcer i denne sektion\n" +"Hvis STI er givet, sÃ¥ vis kun matchende ressourcer" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FIL [STI]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SEKTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Vis ressourcer med detaljer\n" +"Hvis SEKTION er givet, sÃ¥ vis kun ressourcer i denne sektion\n" +"Hvis STI er givet, sÃ¥ vis kun matchende ressourcer\n" +"Detaljerne inkluderer sektion, størrelse og komprimering" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Udskriv en ressourcefil til stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FILSTI" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Ukendt kommando \"%s\"\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Brug:\n" +" gresource [--section SEKTION] KOMMANDO [ARG...]\n" +"\n" +"Kommandoer:\n" +" help Vis denne information\n" +" sections Vis ressourcesektioner\n" +" list Vis ressourcer\n" +" details Vis ressourcer med detaljer\n" +" extract Udskriv en ressource\n" +"\n" +"Brug \"gresource help KOMMANDO\" til at fÃ¥ uddybende hjælp.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Brug:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumenter:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKTION Navn pÃ¥ elf-sektion (valgfri)\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMMANDO Den kommandoen der skal forklares (valgfri)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FIL En elf-fil (et binært eller delt bibliotek)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FIL En elf-fil (et binært eller delt bibliotek)\n" +" eller en kompileret ressourcefil\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[STI]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " STI En eventuelt delvis ressourcesti (valgfri)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "STI" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " STI En ressourcesti\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Intet sÃ¥dant skema \"%s\"\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Skemaet \"%s\" kan ikke flyttes (stien mÃ¥ ikke være angivet)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Skemaet \"%s\" kan flyttes (sti skal angives)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Tom sti givet.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Sti skal begynde med skrÃ¥streg (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Sti skal slutte med skrÃ¥streg (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Sti mÃ¥ ikke indeholde to skrÃ¥streger i træk (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ingen sÃ¥dan nøgle \"%s\"\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Den givne værdi ligger uden for det gyldige interval\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Vis de installerede (uflytbare) skemaer" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Vis de installerede flytbare skemaer" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Vis nøglerne i SKEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SKEMA[:STI]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Vis underelementerne af SKEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Vis nøgler og værdier rekursivt\n" +"Hvis intet SKEMA er angivet, vis alle nøgler\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SKEMA[:STI]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Hent værdien for NØGLE" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SKEMA[:STI] NØGLE" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Forespørg om det gyldige interval af værdier for NØGLE" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Sæt værdien af NØGLE til VÆRDI" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SKEMA[:STI] NØGLE VÆRDI" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Nulstil NØGLE til dens standardværdi" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Nulstil alle nøgler i SKEMA til deres standardværdier" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Se om NØGLE er skrivbar" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"OvervÃ¥g ændringer af NØGLE.\n" +"Hvis ingen NØGLE er givet, overvÃ¥ges alle nøgler i SKEMA.\n" +"Brug ^C for at standse overvÃ¥gning.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SKEMA[:STI] [NØGLE]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Brug:\n" +" gsettings [--schemadir SKEMAKAT] KOMMANDO [ARG...]\n" +"\n" +"Kommandoer:\n" +" help Vis denne information\n" +" list-schemas Vis installerede skemaer\n" +" list-relocatable-schemas Vis flytbare skemaer\n" +" list-keys Vis nøgler i et skema\n" +" list-children Vis underelementer af et skema\n" +" list-recursively Vis nøgler og værdier rekursivt\n" +" range Forespørg om interval for nøgle\n" +" get Hent værdi af en nøgle\n" +" set Sæt værdien af en nøgle\n" +" reset Nulstil værdien af en nøgle\n" +" reset-recursively Nulstil alle værdier i et skema\n" +" writable Se om en nøgle er skrivbar\n" +" monitor OvervÃ¥g ændringer\n" +"\n" +"Brug \"gsettings help KOMMANDO\" for at fÃ¥ uddybende hjælp.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Brug:\n" +" gsettings [--schemadir SKEMAKAT] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SKEMAKAT Et katalog hvor der søges efter yderligere skemaer\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SKEMA Navnet pÃ¥ skemaet\n" +" STI Stien, for flytbare skemaer\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " NØGLE Den (valgfri) nøgle inden for skemaet\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " NØGLE Nøglen inden for skemaet\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VÆRDI Værdien der skal sættes\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Tomt skemanavn givet\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Ugyldig sokkel, ikke initialiseret" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ugyldig sokkel, initialisering mislykkedes pÃ¥ grund af: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Soklen er allerede lukket" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Tidsudløb for sokkel-I/O" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "opretter GSocket fra fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kan ikke oprette sokkel: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Der blev angivet en ukendt familie" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Der blev angivet en ukendt protokol" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "kunne ikke finde lokal adresse: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "kunne ikke finde fjern adresse: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "kunne ikke lytte: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fejl ved binding til adresse: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Fejl ved deltagelse i multicastgruppe: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Fejl ved fratræden fra multicastgruppe: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Ingen understøttelse for kildespecifik multicast" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fejl ved accept af forbindelse: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Forbinder" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan ikke hente verserende fejl: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fejl ved modtagelse af data: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Fejl ved afsendelse af data: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Kan ikke nedlukke sokkel: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fejl ved lukning af sokkel: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Venter pÃ¥ sokkelbetingelse: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Fejl ved afsendelse af meddelelse: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage understøttes ikke af Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fejl ved modtagelse af meddelelse: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials ikke implementeret pÃ¥ dette operativsystem" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Kunne ikke forbinde til proxyserver %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Kunne ikke forbinde til %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Kunne ikke forbinde: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Ukendt forbindelsesfejl" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Brug af proxy over ikke-TCP-forbindelse understøttes ikke." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxyprotokollen \"%s\" understøttes ikke." + +# Relateret til ordlistens "(SMTP )listener -> *(SMTP-)modtager" +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Modtager er allerede lukket" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Tilføjede sokkel er lukket" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 understøtter ikke IPv6-adressen \"%s\"" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Brugernavnet er for langt til SOCKSv4-protokollen" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Værtsnavnet \"%s\" er for langt til SOCKSv4-protokollen" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Serveren er ikke en SOCKSv4-proxyserver." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Forbindelsen gennem SOCKSv4-serveren blev afslÃ¥et" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Serveren er ikke en SOCKSv5-proxyserver." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5-proxy'en kræver godkendelse." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 kræver en godkendelsesmetode, der ikke understøttes af GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Brugernavn eller adgangskode er for langt til SOCKSv5-protokollen." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5-godkendelse slog fejl pÃ¥ grund af forkert brugernavn og adgangskode." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Værtsnavnet \"%s\" er for langt til SOCKSv5-protokollen" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5-proxyserveren bruger ukendt adressetype." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Intern SOCKSv5-proxyserverfejl." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-forbindelse tillades ikke af regelsættet." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Vært kan ikke nÃ¥s gennem SOCKSv5-server." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Netværket kan ikke nÃ¥s gennem SOCKSv5-proxy." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Forbindelsen afslÃ¥et gennem SOCKSv5-proxy." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-proxy understøtter ikke \"connect\"-kommando." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-proxy understøtter ikke den givne adressetype." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Ukendt SOCKSv5-proxyfejl." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere version %d af GThemedIcon-kodningen" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Kan ikke dekryptere PEM-kodet privat nøgle" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Intet privat, PEM-kodet nøgle fundet" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Kunne ikke fortolke PEM-kodet privat nøgle" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Intet PEM-kodet certifikat fundet" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Kunne ikke fortolke PEM-kodet certifikat" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Dette er den sidste chance for at skrive adgangskoden korrekt, før din " +"adgang vil blive lÃ¥st." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Adskillige indtastede adgangskoder var forkerte og din adgang vil blive lÃ¥st " +"efter yderligere fejlslagne forsøg." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Den indtastede adgangskode er forkert." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:566 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Forventer én kontrolmeddelelse, modtog %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:576 +msgid "Unexpected type of ancillary data" +msgstr "Uventet type af supplerende data" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Forventede én fd, men fik %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Modtog ugyldig fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Fejl ved afsendelse af akkreditiver: " + +#: ../gio/gunixconnection.c:497 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Fejl ved kontrol af om SO_PASSCRED er slÃ¥et til for sokkel: %s" + +#: ../gio/gunixconnection.c:506 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Uventet tilvalgslængde ved kontrol af om SO_PASSCRED er aktiveret for " +"sokkel. Ventede %d byte, fandt %d" + +#: ../gio/gunixconnection.c:523 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fejl ved aktivering af SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:552 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Forventede at læse en enkelt byte for at modtage akkreditiver, men læste nul " +"byte" + +#: ../gio/gunixconnection.c:590 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Forventer ikke kontrolmeddelelse, men modtog %d" + +#: ../gio/gunixconnection.c:616 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Fejl ved deaktiverering af SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Fejl ved læsning fra fildeskriptor: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Fejl ved lukning af fildeskriptor: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Filsystemets rod" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Fejl under skrivning til fildeskriptor: %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:244 +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "diskenhed implementerer ikke eject eller eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Kan ikke finde program" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Fejl ved opstart af program: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI'er understøttes ikke" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "associationsændring understøttes ikke af win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Associationsoprettelse understøttes ikke i win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Fejl ved læsning fra hÃ¥ndtag: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Fejl ved lukning af hÃ¥ndtag: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Fejl under skrivning til hÃ¥ndtag: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Utilstrækkelig hukommelse" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Intern fejl: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Kræver yderligere input" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ugyldige komprimerede data" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresse, der skal lyttes pÃ¥" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignoreres af hensyn til kompatibilitet med GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Udskriv adresse" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Udskriv adresse i skaltilstand" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Kør en dbus-tjeneste" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Forkerte argumenter\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventet attribut \"%s\" for elementet \"%s\"" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributten \"%s\" for elementet \"%s\" blev ikke fundet" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventet mærke \"%s\", forventede mærket \"%s\"" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventet mærke \"%s\" inden i \"%s\"" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen gyldig bogmærkefil blev fundet i datakatalogerne" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Et bogmærke for URI'en \"%s\" findes allerede" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Der blev intet bogmærke fundet for URI'en \"%s\"" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Delvis tegnsekvens ved slutningen af inddata" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan ikke konvertere tilbagefaldet \"%s\" til tegnsæt \"%s\"" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI'en \"%s\" er ugyldig" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Værtsnavnet for URI'en \"%s\" er ugyldig" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI'en \"%s\" indeholder ugyldigt beskyttede tegn" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Stinavnet \"%s\" er ikke en absolut sti" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Ugyldigt værtsnavn" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m-%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +# Læg mærke til programmørkommentaren. Selvom vi ikke bruger AM/PM %p mÃ¥ det jo stadig være den foretrukne mÃ¥de at udtrykke 12-timers tid. +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "januar" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "februar" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "marts" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "april" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "august" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "september" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "november" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "december" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "mandag" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "tirsdag" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "onsdag" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "torsdag" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "fredag" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "lørdag" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "søndag" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "man" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "tir" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ons" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "tor" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "fre" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "lør" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "søn" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fejl ved Ã¥bning af mappen \"%s\": %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fejl ved læsning af filen \"%s\": %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Filen \"%s\" er for stor" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kunne ikke læse fra filen \"%s\": %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Kunne ikke læse attributter for filen \"%s\": fstat() mislykkedes: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": fdopen() mislykkedes: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Fejl under oprettelse af filen \"%s\": %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fwrite() mislykkedes: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fflush() mislykkedes: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kunne ikke skrive filen \"%s\": fsync() mislykkedes: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kunne ikke lukke filen \"%s\": fclose() mislykkedes: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Skabelonen \"%s\" er ugyldig, mÃ¥ ikke indeholde en \"%s\"" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Skabelonen \"%s\" indeholder ikke XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kunne ikke læse den symbolske henvisning \"%s\": %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Symbolske henvisninger er ikke understøttet" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Resterende ukonverterede data i læsemellemlager" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanal afslutter med et ufuldendt tegn" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "Gyldig nøglefil blev ikke fundet i søgekatalogerne" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "Ikke en almindelig fil" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldigt gruppenavn: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Nøglefilen starter ikke med en gruppe" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldigt nøglenavn: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøglefilen indeholder kodningen \"%s\", der ikke understøttes" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøglefilen indeholder ikke gruppen \"%s\"" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøglefilen indeholder ikke nøglen \"%s\"" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"Nøglen \"%s\" i gruppen \"%s\" har værdien \"%s\", mens %s blev forventet" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +msgid "Key file contains escape character at end of line" +msgstr "Nøglefilen indeholder beskyttede tegn for enden af linjen" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøglefilen indeholder en ugyldig undvigesekvens \"%s\"" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Værdien \"%s\" kan ikke fortolkes som et nummer." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltalsværdien \"%s\" er ikke i gyldigt interval" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Værdien \"%s\" kan ikke fortolkes som en sandhedsværdi." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Kunne ikke læse attributter for filen \"%s%s%s%s\": fstat() mislykkedes: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Kunne ikke kortlægge %s%s%s%s: mmap() mislykkedes: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kunne ikke Ã¥bne filen \"%s\": open() mislykkedes: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fejl pÃ¥ linje %d tegn %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" er ikke et gyldigt navn " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" er ikke et gyldigt navn: \"%c\" " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fejl pÃ¥ linje %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tegnreferencen \"%-.*s\" koder ikke et tilladt tegn" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tom entitet \"&;\" fundet; gyldige entiteter er: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnavnet \"%-.*s\" er ukendt" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet skal begynde med et element (f.eks )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Mærkeligt tegn \"%s\", forventede et \"=\" efter attributnavn \"%s\" for " +"elementet \"%s\"" + +#: ../glib/gmarkup.c:1306 +#, 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 attribut; mÃ¥ske " +"brugte du et ugyldigt tegn i attributnavnet" + +#: ../glib/gmarkup.c:1350 +#, 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 attributten \"%s\" " +"angives" + +#: ../glib/gmarkup.c:1483 +#, 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:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element \"%s\" blev lukket, ingen Ã¥bne elementer nu" + +#: ../glib/gmarkup.c:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller indeholdt kun blanke tegn" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet sluttede uventet lige efter en Ã¥ben vinkelparantes \"<\"" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet sluttede uventet inden i et elementnavn" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet sluttede uventet inden i et attributnavn" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet sluttede uventet inden i et element-Ã¥bnende mærke." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumentet sluttede uventet efter lighedstegnet efter et attributnavn; ingen " +"attributværdi" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet sluttede uventet inden i en attributværdi" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet sluttede uventet inden i en kommentar eller behandlingsinstruktion" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Brug:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[TILVALG...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Flag for hjælp:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Vis flag for hjælp" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Vis alle flag for hjælp" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Flag for programmet:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikke fortolke heltalsværdien \"%s\" for %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, 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:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikke fortolke double-værdien \"%s\" for %s" + +#: ../glib/goption.c:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Kunne ikke fortolke tilvalg %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Mangler argument for %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Ukendt flag %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ødelagt objekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "intern fejl eller ødelagt objekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "utilstrækkelig hukommelse" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "grænse for bagudlæsning nÃ¥et" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "rekursionsgrænse nÃ¥et" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombination af linjeskift-flag" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ugyldig forskydning" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "kort utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekursiv løkke" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ukendt fejl" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ sidst i mønster" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c sidst i mønster" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "ukendt tegn følger \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "tal er ude af rækkefølge i {}-kvantor" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "for stort tal i {}-kvantor" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "manglende afsluttende ] for tegnklasse" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ugyldig undvigesekvens i tegnklasse" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "følgen er ikke ordnet i tegnklassen" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "intet at gentage" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "uventet gentagelse" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "ukendt tegn efter (? eller (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-navngivne klasser understøttes kun inden i en klasse" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "manglende afsluttende )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "reference til ikke-eksisterende undermønster" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "manglende ) efter kommentar" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regulært udtryk for stort" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "kunne ikke hente hukommelse" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") uden Ã¥bnende (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "kodeoverløb" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "ukendt tegn efter (?<" + +# ??? +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-assert-erklæring har ikke fast længde" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "fejlformet tal eller navn efter (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "betinget gruppe indeholder mere end to grene" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "assert-erklæring forventet efter (?(" + +# 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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]cifre skal efterfølges af )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ukendt POSIX-klassenavn" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-arrangerende elementer understøttes ikke" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "tegnværdi i \\x{..}-sekvens er for stor" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ugyldig betingelse (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ikke tillad i lookbehind-assert-erklæring" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "undvigesekvenserne \\L, \\l, \\N{navn}, \\U og \\u understøttes ikke" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekursive kald kan danne uendelig løkke" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "ukendt tegn efter (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "manglende terminator i undermønsters navn" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "to navngivne undermønstre har samme navn" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "fejlformet \\P- eller \\p-sekvens" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "ukendt egenskabsnavn efter \\P eller \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermønsters navn er for langt (maksimal 32 tegn)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange navngivne undermønstre (maksimalt 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "oktal værdi er større end \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "overløb kompileringsarbejdspladsen" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "tidligere kontrolleret, refereret undermønster blev ikke fundet" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe indeholder mere end én gren" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-indstillinger" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g følges ikke af et navn eller tal indeholdt i klammer eller " +"vinkelklammer, eller af et enkeltstÃ¥ende tal" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "en nummereret reference kan ikke være nul" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "et argument er ikke tilladt for (*ACCEPT), (*FAIL) eller (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ikke genkendt" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "tallet er for stort" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "manglende undermønsternavn efter (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "ciffer forventet efter (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] er et ugyldigt datategn i JavaScript-kompatibilitetstilstand" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "forskellige navne til undermønstre med samme nummer er ikke tilladt" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) skal have et argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c must skal være efterfulgt af et ASCII-tegn" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k følges ikke af et navn indeholdt i klammer, vinkelklammer eller " +"citationstegn" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N understøttes ikke i en klasse" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "for mange fremadreferencer" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "navn er for langt i (*MARK), (*PRUNE), (*SKIP) eller (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "tegnværdi i \\u...-sekvens er for stor" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket er kompileret uden UTF8-understøttelse" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket er kompileret uden understøttelse af UTF8-egenskaber" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE-biblioteket er kompileret med inkompatible indstillinger" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fejl under optimering af det regulære udtryk %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimalt ciffer eller \"}\" forventet" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "hexadecimalt ciffer forventet" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "manglende \"<\" i symbolsk reference" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "ufærdig symbolsk reference" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "symbolsk reference med længde nul" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "ciffer forventet" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk reference" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "løst afsluttende \"\\\"" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ukendt undvigesekvens" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Anført tekst begynder ikke med anførselstegn" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst var tom (eller indeholdt kun blanke tegn)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Fejl ved læsning af data fra underprocess (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Uventet fejl i waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Underproces afsluttede med kode %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Underproces dræbt med signal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Underproces stoppet med signal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Underproces afsluttede fejlagtigt" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Fejl under læsning fra barnedatakanal (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Fejl under fraspaltning af proces (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Fejl ved skift til mappen \"%s\" (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Fejl under kørsel af underprocessen \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Fejl ved fraspaltning af underprocess (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukendt fejl under kørsel af underprocessen \"%s\"" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Fejl under læsning af data fra underprocess" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Fejl under kørsel af underprocess (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ugyldigt programnavn: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ugyldig streng i argumentvektor pÃ¥ %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldigt arbejdskatalog: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Fejl under kørsel af hjælpeprogram (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Tegn uden for gyldigt interval for UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i konverteringsinddata" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Tegn uden for gyldigt interval for UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Unormal programafslutning ved start af kommandolinje \"%s\": %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "Kommandolinjen \"%s\" afsluttede med fejlstatus %d forskellig fra 0: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Ingen tjenestejournal for \"%s\"" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "arbejdsomrÃ¥dets grænse for tomme delstrenge er blevet nÃ¥et" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "versal-ændrende undvigesekvenser (\\l, \\L, \\u, \\U) er ikke tilladt her" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "gentagelse af en DEFINE-gruppe er ikke tilladt" + +#~ msgid "File is empty" +#~ msgstr "Filen er tom" + +#~ msgid "Error connecting: " +#~ msgstr "Fejl ved forbindelse: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Fejl ved forbindelse: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Fejl ved læsning fra unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Fejl ved lukningaf unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Fejl ved skrivning til unix: %s" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Dette tilvalg vil snart blive fjernet." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Fejl ved stat for filen \"%s\": %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4-implementationen begrænser brugernavn til %i tegn" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a-implementation begrænser værtsnavn til %i tegn" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Typen af returværdi er forkert - fik \"%s\", men forventede \"%s\"" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Forsøger at ændre egenskaben %s af typen %s, men ifølge den forventede " +#~ "grænseflade er typen %s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Intet sÃ¥dant skema \"%s\" angivet i overskrivningsfilen \"%s\"" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Kommandoer:\n" +#~ " help Vis denne information\n" +#~ " get Hent værdien af en nøgle\n" +#~ " set Ændr værdien af en nøgle\n" +#~ " reset Nulstil værdien af en nøgle\n" +#~ " monitor OvervÃ¥g ændringer for en nøgle\n" +#~ " writable Se om der kan skrives til nøglen\n" +#~ "\n" +#~ "Brug \"%s KOMMANDO --help\" for at fÃ¥ hjælp om kommandoer enkeltvis.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Angiv stien til skemaet" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumenter:\n" +#~ " SKEMA Id for skemaet\n" +#~ " NØGLE Nøglens navn\n" +#~ " VÆRDI Værdien som nøglen skal gives, i form af serialiseret " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Nøglen %s er skrivebeskyttet\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "OvervÃ¥g ændringer af NØGLE, og udskriv de ændrede værdier.\n" +#~ "OvervÃ¥gning vil fortsætte indtil processen afsluttes." + +#~ 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 "" +#~ "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 "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.po b/po/de.po new file mode 100644 index 0000000..68db198 --- /dev/null +++ b/po/de.po @@ -0,0 +1,4688 @@ +# German glib translation. +# Copyright (C) 2001-2004, 2007 Free Software Foundation, Inc. +# Christian Meyer , 2001, 2002. +# Christian Neumair , 2002-2004. +# Hendrik Richter , 2004-2009. +# Hendrik Brandt , 2004. +# Andre Klapper , 2007, 2008. +# Philipp Kerling , 2008. +# Mario Blättermann , 2010-2012. +# Wolfgang Stöggl , 2011. +# Christian Kirbach , 2009, 2010, 2012. +# Tobias Endrigkeit , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-22 17:03+0000\n" +"PO-Revision-Date: 2012-09-23 14:42+0100\n" +"Last-Translator: Mario Blättermann \n" +"Language-Team: Deutsch \n" +"Language: de\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" +"X-Generator: Gtranslator 2.91.5\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Zu großer Zählwert an %s übermittelt" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Suchen im Basis-Datenstrom nicht unterstützt" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream konnte nicht abgeschnitten werden" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Datenstrom ist bereits geschlossen" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Abschneiden wird vom Basis-Datenstrom nicht unterstützt" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Vorgang wurde abgebrochen" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Ungültiges Objekt, wurde nicht initialisiert" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Ungültige Multibyte-Folge in Eingabe" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Nicht genug Platz im Ziel" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Ungültige Bytefolge in Konvertierungseingabe" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fehler bei der Umwandlung: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Abbrechbare Initialisierung wird nicht unterstützt" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 ../glib/gconvert.c:642 +#: ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Umwandlung von Zeichensatz »%s« in »%s« wird nicht unterstützt" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Konverter von »%s« in »%s« konnte nicht geöffnet werden" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s-Typ" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Unbekannter Typ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s-Dateityp" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ist in diesem Betriebssystem nicht implementiert" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Es gibt auf Ihrer Plattform keine Unterstützung für GCredentials" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unerwartet frühes Datenstromende" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nicht unterstützter Schlüssel »%s« im Adresseintrag »%s«" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresse »%s« ist ungültig (benötigt genau einen der Schlüssel path, tmpdir " +"oder abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Bedeutungsloses Schlüssel-Wert-Paar im Adresseintrag »%s«" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Fehler in Adresse »%s« - Das Port-Attribut ist nicht korrekt" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Fehler in Adresse »%s« - Das Familien-Attribut ist nicht korrekt" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adresselement »%s« enthält keinen Doppelpunkt" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Schlüssel-Wert-Paar %d, »%s«, in Adresselement »%s« enthält kein " +"Gleichheitszeichen" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element `" +"%s'" +msgstr "" +"Fehler beim Entfernen von Escape-Zeichen im Schlüssel-Wert-Paar %d, »%s« im " +"Adresselement »%s«" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Fehler in Adresse »%s« - für den Unix-Transport muss genau einer der " +"Schlüssel »path« oder »abstract« gesetzt sein" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Fehler in Adresse »%s« - Das Host-Attribut fehlt oder ist nicht korrekt" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Fehler in Adresse »%s« - Das Port-Attribut fehlt oder ist nicht korrekt" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Fehler in Adresse »%s« - Das noncefile-Attribut fehlt oder ist nicht korrekt" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Fehler beim automatischen Starten:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Unbekannter oder nicht unterstützter Transport »%s« für Adresse »%s«" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fehler beim Öffnen der Nonce-Datei »%s«: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fehler beim Lesen der Nonce-Datei »%s«: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Fehler beim Lesen der Nonce-Datei »%s«, erwartet wurden 16 Bytes, jedoch %d " +"erhalten" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Fehler beim Schreiben des Inhalts der Nonce-Datei »%s« in den Datenstrom:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Die angegebene Adresse ist leer" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Ein Nachrichtenbus kann nicht mit setuid erzeugt werden" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ein Nachrichtenbus kann nicht ohne eine Rechner-Kennung erzeugt werden:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Fehler beim Erzeugen der Befehlszeile »%s«:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" +"(Geben Sie ein beliebiges Zeichen ein, um dieses Fenster zu schließen)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Der Sitzungs-dbus läuft nicht und automatisches Starten schlug fehl" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Adresse des Sitzungsbus konnte nicht ermittelt werden (für dieses " +"Betriebssystem nicht implementiert)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Bus-Adresse konnte nicht über die Umgebungsvariable DBUS_STARTER_BUS_TYPE " +"ermittelt werden, unbekannter Wert »%s«" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Bus-Adresse konnte nicht ermittelt werden, da die Umgebungsvariable " +"DBUS_STARTER_BUS_TYPE nicht gesetzt ist" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Unbekannter Bus-Typ %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Unerwarteter Mangel an Inhalt beim Versuch, eine Zeile zu lesen" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Unerwarteter Mangel an Inhalt beim Versuch, eine Zeile (sicher) zu lesen" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Alle verfügbaren Legitimierungsmechanismen sind ausgeschöpft (%s Versuche) " +"(verfügbar: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Abgebrochen durch GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Fehler beim Holen der Informationen für Ordner »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Zugriffsrechte des Ordners »%s« sind inkorrekt. Erwarteter Modus ist 0700, " +"0%o wurde erhalten" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fehler beim Erstellen des Ordners »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fehler beim Öffnen des Schlüsselbundes »%s« zum Lesen:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Zeile %d des Schlüsselbundes auf »%s« mit Inhalt »%s« ist inkorrekt" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Der erste Token in Zeile %d des Schlüsselrings bei »%s« mit dem Inhalt »%s« " +"ist inkorrekt" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Der zweite Token in Zeile %d des Schlüsselrings bei »%s« mit dem Inhalt »%s« " +"ist inkorrekt" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"Cookie mit Kennung %d konnte im Schlüsselbund auf »%s« nicht gefunden werden" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fehler beim Löschen der alten Sperrdatei »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fehler beim Erstellen der Sperrdatei »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fehler beim Schließen der entknüpften Sperrdatei »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fehler beim Entknüpfen der Sperrdatei »%s«: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fehler beim Öffnen des Schlüsselbundes »%s« zum Schreiben:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Außerdem schlug das Entsperren von »%s« ebenso fehl: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Verbindung ist geschlossen" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Zeitüberschreitung wurde erreicht" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Beim Erstellen einer client-seitigen Verbindung wurden nicht unterstützte " +"Flags entdeckt" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Keine derartige Schnittstelle »org.freedesktop.DBus.Properties« des Objekts " +"im Pfad %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Fehler beim Setzen der Eigenschaft »%s«: Erwarteter Typ war »%s«, aber »%s« " +"wurde erhalten" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Keine derartige Eigenschaft »%s«" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Eigenschaft »%s« ist nicht lesbar" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Eigenschaft »%s« ist nicht schreibbar" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Keine derartige Schnittstelle »%s«" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Keine derartige Schnittstelle" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Keine derartige Schnittstelle »%s« des Objekts im Pfad %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Keine derartige Methode »%s«" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Der Nachrichtentyp »%s« entspricht nicht dem erwarteten Wert »%s«" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Für die Schnittstelle %s auf %s wurde bereits ein Objekt exportiert" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Methode »%s« gab Typ »%s« zurück, aber »%s« wurde erwartet" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Methode »%s« in Schnittstelle »%s« mit Signatur »%s« existiert nicht" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ein Unterbaum wurde bereits für %s exportiert" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "Typ ist UNGÜLTIG" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL-Meldung: Kopfzeilenfeld PATH oder MEMBER fehlt" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN-Meldung: Kopfzeilenfeld REPLY_SERIAL fehlt" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR-Meldung: Kopfzeilenfeld REPLY_SERIAL oder ERROR_NAME fehlt" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL-Meldung: Kopfzeilenfeld PATH, INTERFACE oder MEMBER fehlt" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL-Meldung: Das Kopfzeilenfeld PATH verwendet den reservierten Wert /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL-Meldung: Das Kopfzeilenfeld INTERFACE verwendet den reservierten Wert " +"org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu Byte sollten gelesen werden, aber Dateiende wurde erreicht" +msgstr[1] "%lu Bytes sollten gelesen werden, aber Dateiende wurde erreicht" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d (length " +"of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Gültige UTF-8-Zeichenkette wurde erwartet, aber ungültige Bytes am Byte-" +"Versatz %d gefunden (Länge der Zeichenkette ist %d). Die gültige UTF-8-" +"Zeichenkette bis zu diesem Punkt war »%s«)" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"Ein NUL-Byte wurde nach der Zeichenkette »%s« erwartet, aber es wurde Byte %d " +"gefunden" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Verarbeiteter Wert »%s« ist kein gültiger D-Bus-Objektpfad" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Verarbeiteter Wert »%s« ist keine gültige D-Bus-Signatur" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Array der Länge %u Byte wurde erkannt. Maximale Länge ist 2<<26 Bytes (64 " +"MiB)." +msgstr[1] "" +"Array der Länge %u Bytes wurde erkannt. Maximale Länge ist 2<<26 Bytes (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Verarbeiteter Wert »%s« für Variante ist keine gültige D-Bus-Signatur" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Fehler beim Deserialisieren von GVariant mit der Typenzeichenkette »%s« aus " +"dem D-Bus Wire-Format" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x" +"%02x" +msgstr "" +"Ungültiger Wert für die Speicherreihenfolge. Es wird entweder 0x6c ('l') oder " +"0x42 ('B') erwartet, aber der Wert 0x%02x gefunden" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Ungültige Version des Hauptprotokolls. Erwartet wurde 1, jedoch %d gefunden" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Signatur-Kopfzeilenfeld mit Signatur »%s« gefunden, aber Nachrichtenrumpf ist " +"leer" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Verarbeiteter Wert »%s« ist keine gültige D-Bus-Signatur (für Rumpf)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Kein Signatur-Kopfzeilenfeld in der Nachricht, aber der Nachrichtenrumpf ist " +"%u Byte groß" +msgstr[1] "" +"Kein Signatur-Kopfzeilenfeld in der Nachricht, aber der Nachrichtenrumpf ist " +"%u Bytes groß" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Meldung kann nicht deserialisiert werden:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Fehler beim Deserialisieren von GVariant mit der Typenzeichenkette »%s« in " +"das D-Bus Wire-Format" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Meldung hat %d Dateideskriptoren, aber das Kopfzeilenfeld kündigt %d " +"Dateideskriptoren an" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Meldung kann nicht serialisiert werden:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Nachrichtenrumpf hat den Signaturtyp »%s«, aber es gibt keine Signatur im " +"Kopfzeilenfeld" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "" +"Nachrichtenrumpf hat den Signaturtyp »%s«, aber die Signatur im " +"Kopfzeilenfeld ist »%s«" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Nachrichtenrumpf ist leer, aber die Signatur im Kopfzeilenfeld ist »(%s)«" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Fehlerrückmeldung mit Inhalt des Typs »%s«" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Fehlerrückmeldung mit leerem Inhalt" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Hardware-Profil konnte nicht ermittelt werden: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"/var/lib/dbus/machine-id oder /etc/machine-id konnte nicht geladen werden: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Fehler beim Aufruf von StartServiceByName für %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Unerwartete Antwort %d von der Methode StartServiceByName(»%s«)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Die Methode kann nicht aufgerufen werden; Der Proxy ist für einen allgemein " +"bekannten Namen ohne Besitzer und der Proxy wurde mit dem Flag " +"»G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START« erstellt" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakter Namensraum wird nicht unterstützt" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Nonce-Datei kann beim Erstellen eines Servers nicht angegeben werden" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fehler beim Schreiben der Nonce-Datei auf »%s«: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Die Zeichenkette »%s« ist keine gültige GUID für D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "An nicht unterstützter Übertragung »%s« kann nicht gelauscht werden" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "BEFEHL" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Befehle:\n" +" help Diese Information anzeigen\n" +" introspect Ein entferntes Objekt inspizieren\n" +" monitor Ein entferntes Objekt überwachen\n" +" call Eine Methode für ein entferntes Objekt aufrufen\n" +" emit Ein Signal ausgeben\n" +"\n" +"Mit »%s BEFEHL --help« erhalten Sie Hilfe zu jedem der Befehle.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Fehler: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fehler beim Verarbeiten des XML-Codes der Inspektion: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Zum Systembus verbinden" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Zum Sitzungsbus verbinden" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Zur angegebenen D-Bus-Adresse verbinden" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Optionen für Gegenstelle der Verbindung:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Optionen zur Gegenstelle der Verbindung" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Keine Gegenstelle der Verbindung angegeben" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Mehrere Gegenstellen der Verbindung angegeben" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Warnung: Entsprechend den Inspektionsdaten existiert die Schnittstelle »%s« " +"nicht\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Warnung: Entsprechend den Inspektionsdaten existiert die Methode »%s« nicht " +"in der Schnittstelle »%s«\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Optionales Ziel des Signals (eindeutiger Name)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objektpfad, auf den das Signal ausgegeben werden soll" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signal und Schnittstellenname" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Ein Signal ausgeben." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Fehler beim Verbinden: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Fehler: Objektpfad wurde nicht angegeben.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Fehler: %s ist kein gültiger Objektpfad\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Fehler: Signal wurde nicht angegeben.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Fehler: Signal muss ein vollwertiger Name sein.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Fehler: %s ist kein gültiger Schnittstellenname\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Fehler: %s ist kein gültiger Mitgliedsname\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Fehler: %s ist kein gültiger eindeutiger Bus-Name.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fehler bei der Verarbeitung des Parameters %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fehler beim Löschen der Verbindung: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Name des Ziels, für das die Methode aufgerufen werden soll" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Objektpfad, für den die Methode aufgerufen werden soll" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Methode und Schnittstellenname" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Verzögerung in Sekunden:" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Eine Methode für ein entferntes Objekt aufrufen." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Fehler: Ziel wurde nicht angegeben\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Fehler: Objektpfad wurde nicht angegeben\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Fehler: Name der Methode wurde nicht angegeben\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Fehler: Name der Methode »%s« ist ungültig\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Fehler bei der Verarbeitung des Parameters %d vom Typ »%s«: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Name des Ziels der Inspektion" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Zu inspizierender Objektpfad" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML drucken" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Unterelemente inspizieren" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Nur Eigenschaften ausgeben" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Ein entferntes Objekt inspizieren." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Name des zu überwachenden Ziels" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Zu überwachender Objektpfad" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Ein entferntes Objekt überwachen." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Unbenannt" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop-Datei hat kein Exec-Feld angegeben" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Für die Anwendung benötigtes Terminal konnte nicht gefunden werden" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Den Anwendungsinformationen fehlt ein Bezeichner" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Benutzer-Desktop-Datei %s kann nicht erstellt werden" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Benutzerdefinition für %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "Laufwerk unterstützt weder ein Auswerfen noch »eject_with_operation«" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "Laufwerk unterstützt Prüfen auf Datenträger nicht" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "Laufwerk unterstützt keinen Startvorgang" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "Laufwerk unterstützt keinen Stoppvorgang" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-Unterstützung ist nicht verfügbar" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Version %d der GEmblem-Kodierung kann nicht verarbeitet werden" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Ungültige Symbolanzahl (%d) in GEmblem-Kodierung" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Version %d der GEmblemedIcon-Kodierung kann nicht verarbeitet werden" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Ungültige Symbolanzahl (%d) in GEmblemedIcon-Kodierung" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Es wurde ein GEmblem für GEmblemedIcon erwartet" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +msgid "Operation not supported" +msgstr "Vorgang wird 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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Enthaltender Einhängepunkt existiert nicht" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Es kann nicht über den Ordner kopiert werden" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Ordner kann nicht über Ordner kopiert werden" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Zieldatei existiert" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Ordner kann nicht rekursiv kopiert werden" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Zusammenfügen wird nicht unterstützt" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fehler beim Zusammenfügen der Datei: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Spezielle Datei kann nicht kopiert werden" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Ungültiger Wert für symbolische Verknüpfung angegeben" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Müll nicht unterstützt" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dateinamen dürfen kein »%c« enthalten" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "Datenträger unterstützt Einhängen nicht" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Es wurde keine Anwendung gefunden, die diese Datei verarbeiten kann" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Datei-Enumerator ist geschlossen" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Datei-Enumerator hat noch einen ausstehenden Vorgang" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Datenstrom unterstützt query_info nicht" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Suchen im Datenstrom nicht unterstützt" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Abschneiden des Eingabedatenstroms nicht erlaubt" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Abschneiden wird vom Datenstrom nicht unterstützt" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Ungültige Symbolanzahl (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Kein Typ für Klassenname %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "GIcon-Schnittstelle wird vom Typ %s nicht unterstützt" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s ist keine Klasse" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Ungültige Versionsnummer: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Übergebene Version der Symbol-Kodierung kann nicht verarbeitet werden" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Keine Adresse angegeben" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Länge %u ist zu groß für eine Adresse" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Für die Adresse sind Bits außerhalb der Präfix-Länge gesetzt" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "»%s« konnte nicht als IP-Adressmaske verarbeitet werden" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nicht genug Platz für eine Socket-Adresse" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nicht unterstützte Socket-Adresse" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Datenstrom hat noch einen ausstehenden Vorgang" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> ist innerhalb <%s> nicht erlaubt" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> ist in der obersten Ebene nicht erlaubt" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Datei %s tritt in der Ressource mehrfach auf" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "»%s« konnte in keinem Quellordner gefunden werden" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "»%s« konnte im aktuellen Ordner nicht gefunden werden" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Unbekannte Verarbeitungsoption %s" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Temporäre Datei konnte nicht angelegt werden: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Fehler beim Verarbeiten der Eingabedatei mit xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Fehler beim Verarbeiten der Eingabedatei mit to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Fehler beim Lesen der Datei »%s«: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Fehler beim Komprimieren der Datei %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "Text könnte nicht innerhalb von <%s> erscheinen" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "Name der Ausgabedatei" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "DATEI" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current directory)" +msgstr "" +"Die Ordner, aus denen Dateien gelesen werden sollen (Vorgabe ist der aktuelle " +"Ordner)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "ORDNER" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Ausgabe in dem Format generieren, welches durch die Dateiendung der Zieldatei " +"vorgegeben wird" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Quellcode-Header gernerieren" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Quellcode zum Verlinken der Ressourcendatei in Ihren Code verwenden" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Abhängigkeitsliste generieren" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Die Resssource nicht automatisch anlegen und registrieren" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "C-Bezeichnername für den generierten Quellcode" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Eine Ressourcenspezifikation in eine Ressourcendatei kompilieren.\n" +"Ressourcenspezifikationsdateien müssen die Erweiterung .gresource.xml haben,\n" +"die Ressourcendateien die Erweiterung .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Sie sollten genau einen Dateinamen angeben\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "Leere Namen sind nicht zulässig" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "Ungültiger Name »%s«: Namen müssen mit einem Kleinbuchstaben beginnen" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"Ungültiger Name »%s«: ungültiges Zeichen »%c«; nur Kleinbuchstaben, Ziffern " +"und Bindestriche »-« sind zulässig" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"Ungültiger Name »%s«: Zwei aufeinander folgende Bindestriche »--« sind nicht " +"zulässig." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"Ungültiger Name »%s«: das letzte Zeichen darf kein Bindestrich »-« sein." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "Ungültiger Name »%s«: maximale Länge ist 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " wurde bereits angegeben" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "Schlüssel können nicht zum Schema »list-of« hinzugefügt werden" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " wurde bereits angegeben" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" verdeckt in ; verwenden Sie " +", um den Wert anzupassen" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +"" +msgstr "" +"Genau eines von »type«, »enum« oder »flags« muss als Attribut für " +"angegeben werden" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (noch) nicht definiert." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Ungültige GVariant-Typzeichenkette »%s«" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " angegeben, aber das Schema erweitert nichts" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "Kein zum Überschreiben" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " wurde bereits angegeben" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " wurde bereits angegeben" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " erweitert noch nicht vorhandenes Schema »%s«" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " ist eine Liste des noch nicht vorhandenen Schemas »%s«" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Darf nicht eine Liste von Schemata mit einem Pfad sein" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Ein Schema darf nicht um einem Pfad erweitert werden" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" ist eine Liste, welche erweitert, das keine " +"Liste ist" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" erweitert , aber " +"»%s« erweitert »%s« nicht" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"Ein Pfad, falls angegeben, muss mit einem Schrägstrich beginnen und enden" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "Der Pfad einer Liste muss mit »:/« enden" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> bereits angegeben" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> ist in der obersten Ebene nicht erlaubt" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict wurde angegeben; Abbruch.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Die gesamte Datei wurde ignoriert.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Diese Datei wird ignoriert.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Kein Schlüssel »%s« in Schema »%s« wie angegeben in überschreibender Datei " +"»%s«" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; Überschreiben dieses Schlüssels wird ignoriert.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " und --strict wurde angegeben; Abbruch.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"Fehler beim Verarbeiten des Schlüssels »%s« in Schema »%s« wie angegeben in " +"überschreibender Datei »%s«: %s" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Überschreiben dieses Schlüssels wird ignoriert.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"Überschreiben für Schlüssel »%s« in Schema »%s« in überschreibender Datei " +"»%s« liegt außerhalb des im Schema angegebenen Bereichs" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the list " +"of valid choices" +msgstr "" +"Überschreiben für Schlüssel »%s« in Schema »%s« in überschreibender Datei " +"»%s« befindet sich nicht in der Liste gültiger Auswahlmöglichkeiten" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "Speicherort der Datei »gschemas.compiled«" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Abbruch wegen einiger Fehler in Schemata" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Die Datei »gschema.compiled« nicht schreiben" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Keine Einschränkungen für Schlüsselnamen erzwingen" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Alle GSettings-Schemadateien in eine Zwischenspeicherdatei kompilieren.\n" +"Schemadateien müssen die Erweiterung .gschema.xml haben,\n" +"die Zwischenspeicherdatei die Erweiterung gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Sie sollten genau einen Ordnernamen angeben\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Keine Schema-Dateien gefunden:" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "Nichts wird getan.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "Vorhandene Ausgabedatei wurde entfernt.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Vorgegebener Überwachungstyp für lokale Ordner konnte nicht gefunden werden" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ungültiger Dateiname %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fehler beim Einlesen der Dateisystem-Information: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Wurzelordner kann nicht umbenannt werden" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fehler beim Umbenennen der Datei: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Datei kann nicht umbenannt werden, da der Dateiname bereits existiert" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Ungültiger Dateiname" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Ordner kann nicht geöffnet werden" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Fehler beim Öffnen der Datei: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Fehler beim Entfernen der Datei: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fehler beim Verschieben der Datei in den Müll: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Müll-Ordner %s konnte nicht angelegt werden: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Elternordner für den Müll konnte nicht gefunden werden" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Müll-Ordner konnte nicht gefunden oder angelegt werden" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Löschprotokoll-Datei konnte nicht angelegt werden: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Datei konnte nicht in den Müll verschoben werden: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "Interner Fehler" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fehler beim Erstellen des Ordners: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Das Dateisystem unterstützt keine symbolische Verknüpfungen" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fehler beim Erstellen der symbolischen Verknüpfung: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Fehler beim Verschieben der Datei: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Ordner kann nicht über Ordner verschoben werden" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Erstellen der Sicherungsdatei gescheitert" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fehler beim Entfernen der Zieldatei: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Verschieben zwischen Einhängepunkten nicht unterstützt" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Attributwert darf nicht NULL sein" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Ungültiger Attributtyp (»string« erwartet)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Ungültiger erweiterter Attributname" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fehler beim Setzen des erweiterten Attributs »%s«: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (ungültige Kodierung)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Fehler beim Holen der Informationen für Datei »%s«: %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Fehler beim Holen der Informationen für Dateideskriptor: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ungültiger Attributtyp (»uint32« erwartet)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ungültiger Attributtyp (»uint64« erwartet)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ungültiger Attributtyp (»byte string« erwartet)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "" +"Zugriffsrechte für symbolische Verknüpfungen können nicht gesetzt werden" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fehler beim Setzen der Zugriffsrechte: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fehler beim Setzen des Besitzers: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "Symbolische Verknüpfung darf nicht NULL sein" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fehler beim Setzen der symbolischen Verknüpfung: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fehler beim Setzen der Zugriffsrechte oder der Zugriffszeit: %s" + +#: ../gio/glocalfileinfo.c:2248 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-Kontext darf nicht NULL sein" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fehler beim Setzen des SELinux-Kontexts: %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ist auf diesem System nicht aktiviert" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setzen des Attributs %s nicht unterstützt" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fehler beim Lesen aus Datei: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fehler beim Suchen in Datei: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Fehler beim Schließen der Datei: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" +"Vorgegebener Überwachungstyp für lokale Dateien konnte nicht gefunden werden" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fehler beim Schreiben in Datei: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fehler beim Entfernen der alten Sicherungsverknüpfung: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fehler beim Erzeugen der Sicherungskopie: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fehler beim Umbenennen der temporären Datei: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fehler beim Abschneiden der Datei: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fehler beim Öffnen der Datei »%s«: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Zieldatei ist ein Ordner" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Zieldatei ist keine reguläre Datei" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Die Datei wurde extern verändert" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fehler beim Entfernen der alten Datei: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Ungültiger GSeekType übergeben" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Ungültige Suchanfrage" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream konnte nicht abgeschnitten werden" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Größe des Speicherausgabestroms ist nicht änderbar" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Größe des Speicherausgabestroms konnte nicht geändert werden" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Angeforderte Suche vor dem Beginn des Datenstroms" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "Einhängepunkt unterstützt synchrones Erraten des Inhaltstyps nicht" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Rechnername »%s« enthält »[«, aber nicht »]«" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Das Netzwerk ist nicht erreichbar" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Rechner ist nicht erreichbar" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Netzwerkmonitor konnte nicht erstellt werden: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Netzwerkmonitor konnte nicht erstellt werden:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Netzwerkstatus konnte nicht ermittelt werden:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Ausgabedatenstrom unterstützt kein Schreiben" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Quelldatenstrom ist bereits geschlossen" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fehler beim Auflösen von »%s«: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fehler beim Rückwärtsauflösen von »%s«: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Kein DNS-Datensatz des angeforderten Typs für »%s«" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "»%s« kann vorübergehend nicht aufgelöst werden" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fehler beim Auflösen von »%s«" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Unvollständige Daten erhalten für »%s«" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 ../gio/gresourcefile.c:553 +#: ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Die Ressource auf »%s« existiert nicht" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Die Ressource auf »%s« konnte nicht entpackt werden" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Die Ressource »%s« ist ein Ordner" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Eingabedatenstrom unterstützt kein Suchen" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Hilfe ausgeben" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[BEFEHL]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Sektionen einer ELF-Datei auflisten, welche Ressourcen enthält" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Ressourcen auflisten\n" +"Falls SEKTION angegeben ist, nur die Ressourcen dieser Sektion auflisten\n" +"Falls PFAD angegeben ist, nur die betreffenden Ressourcen auflisten" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "DATEI [PFAD]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SEKTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Ressourcen detailliert auflisten\n" +"Falls SEKTION angegeben ist, nur die Ressourcen dieser Sektion auflisten\n" +"Falls PFAD angegeben ist, nur die betreffenden Ressourcen auflisten\n" +"Details enthalten Sektion, Größe und Kompression" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Eine Ressourcendatei in stdout auspacken" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "DATEIPFAD" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Unbekannter Befehl %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Aufruf:\n" +" gresource [--section SEKTION] BEFEHL [ARGUMENTE...]\n" +"\n" +"Befehle:\n" +" help Diese Information anzeigen\n" +" sections Ressourcensektionen auflisten\n" +" list Ressourcen auflisten\n" +" details Ressourcen detailliert auflisten\n" +" extract Eine Ressource entpacken\n" +"\n" +"Rufen Sie »gresource help BEFEHL« auf, um detaillierte Hilfe zu erhalten.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Aufruf:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumente:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKTION Ein (optionaler) Name einer ELF-Sektion\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " BEFEHL Der (optionale) zu erklärende Befehl\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" DATEI Eine ELF-Datei (ein Binary oder eine gemeinsame Bibliothek)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" DATEI Eine ELF-Datei (ein Binary oder eine gemeinsame Bibliothek)\n" +" oder eine kompilierte Ressourcendatei\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PFAD]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PFAD Ein (optionaler) Ressourcenpfad (kann unvollständig sein)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PFAD" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PFAD Ein Ressourcenpfad\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Keine derartiges Schema »%s«\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema »%s« ist nicht verschiebbar (Pfad darf nicht angegeben werden)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema »%s« ist verschiebbar (Pfad muss angegeben werden)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Leerer Pfad angegeben.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Pfad muss mit einem Schrägstrich beginnen (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Pfad muss mit einem Schrägstrich enden (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" +"Pfad darf nicht zwei aufeinander folgende Schrägstriche enthalten (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Keine derartiger Schlüssel »%s«\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Der angegebene Wert liegt außerhalb des gültigen Bereichs\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Installierte (nicht verschiebbare) Schemata auflisten" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Installierte (verschiebbare) Schemata auflisten" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Schlüssel in SCHEMA auflisten" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PFAD]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Unterelemente von SCHEMA auflisten" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Schlüssel und Werte rekursiv auflisten\n" +"Falls kein Schema angegeben, alle Schlüssel auflisten\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PFAD]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Den Wert von SCHLÜSSEL ermitteln" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PFAD] SCHLÜSSEL" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Den Bereich gültiger Werte für SCHLÜSSEL abfragen" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Den Wert von SCHLÜSSEL auf WERT setzen" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PFAD] SCHLÜSSEL WERT" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "SCHLÜSSEL auf Vorgabewert setzen" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Alle Schlüssel in SCHEMA auf deren Vorgaben zurücksetzen" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Prüfen, ob SCHLÜSSEL schreibgeschützt ist" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"SCHLÜSSEL auf Änderungen überwachen.\n" +"Falls kein SCHLÜSSEL angegeben wird, werden alle Schlüssel\n" +"in SCHEMA überwacht.\n" +"Drücken Sie ^C, um die Überwachung zu beenden.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PFAD] [SCHLÜSSEL]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Aufruf:\n" +" gsettings [--schemadir SCHEMADIR] BEFEHL [ARGUMENTE...]\n" +"\n" +"Befehle:\n" +" help Diese Information anzeigen\n" +" list-schemas Installierte Schemata auflisten\n" +" list-relocatable-schemas Verschiebbare Schemata auflisten\n" +" list-keys Schlüssel in einem Schema auflisten\n" +" list-children Unterlemente eines Schemas auflisten\n" +" list-recursively Schlüssel und Werte rekursiv auflisten\n" +" range Bereich eines Schlüssels abfragen\n" +" get Wert eines Schlüssels ermitteln\n" +" set Wert eines Schlüssels setzen\n" +" reset Wert eines Schlüssels zurücksetzen\n" +" reset-recursively Werte aller Schlüssel eines gegebenen\n" +" Schemas zurücksetzen\n" +" writable Prüfen, ob Schlüssel schreibgeschützt ist\n" +" monitor Auf Änderungen überwachen\n" +"\n" +"Rufen Sie »gsettings help BEFEHL« auf, um eine detaillierte Hilfe zu " +"erhalten.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Aufruf:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR Ein Ordner zum Suchen nach zusätzlichen Schemas\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Die Kennung des Schemas\n" +" SCHLÜSSEL Der Name des Schlüssels\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " SCHLÜSSEL Der (optionale) Schlüssel innerhalb des Schemas\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " SCHLÜSSEL Der Schlüssel innerhalb des Schemas\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " WERT Der zu setzende Wert\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Leerer Schema-Name wurde angegeben\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Ungültiger Socket, wurde nicht initialisiert" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ungültiger Socket, Initialisierung schlug fehl wegen: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Der Socket ist bereits geschlossen" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Zeitüberschreitung bei Ein-/Ausgabeoperation des Sockets" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket wird erstellt von Dateideskriptor: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Socket kann nicht angelegt werden: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Eine unbekannte Familie wurde angegeben" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Ein unbekanntes Protokoll wurde angegeben" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "Lokale Adresse konnte nicht gelesen werden: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "Entfernte Adresse konnte nicht gelesen werden: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "Es konnte nicht gelauscht werden: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fehler beim Binden an Adresse: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Fehler beim Beitreten zur Multicast-Gruppe: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Fehler beim Verlassen der Multicast-Gruppe: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Quellen-spezifisches Multicast wird nicht unterstützt" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fehler bei Annahme der Verbindung: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Verbindungsvorgang läuft" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Fehlermeldung kann nicht gelesen werden: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fehler beim Erhalt von Daten: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Fehler beim Senden von Daten: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Socket kann nicht heruntergefahren werden: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fehler beim Schließen des Sockets: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Es wird auf eine Socket-Bedingung gewartet: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Fehler beim Senden der Nachricht: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage wird unter Windows nicht unterstützt" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fehler beim Empfang der Nachricht: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials ist für dieses Betriebssystem nicht implementiert" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Verbindung zum Proxy-Server %s konnte nicht aufgebaut werden" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Verbindung mit %s ist gescheitert:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Verbindung ist gescheitert:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Unbekannter Fehler bei Verbindungsversuch" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Nicht-TCP-Verbindung über Proxy wird nicht unterstützt." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy-Protokoll »%s« wird nicht unterstützt." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Lauscher ist bereits geschlossen" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Der hinzugefügte Socket ist geschlossen" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 unterstützt die IPv6-Adresse »%s« nicht" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Benutzername ist zu lang für das SOCKSv5-Protokoll" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Rechnername »%s« ist zu lang für das SOCKSv5-Protokoll" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Der Server ist kein SOCKSv4-Proxy-Server." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Verbindung durch SOCKSv4-Server wurde abgewiesen" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Der Server ist kein SOCKSv5-Proxy-Server." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Der SOCKSv5-Proxy erfordert Legitimierung." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Der SOCKSv5 erfordert eine Legitimierungsmethode, die durch GLib nicht " +"unterstützt wird." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Benutzername oder Passwort ist zu lang für das SOCKSv5-Protokoll." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5-Legitimierung scheiterte wegen falschen Benutzernamens oder Passworts." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Rechnername »%s« ist zu lang für das SOCKSv5-Protokoll" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Der SOCKSv5-Proxy-Server verwendet einen unbekannten Adresstyp." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Interner Fehler des SOCKSv5-Proxy-Servers." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-Verbindung ist aufgrund des Regelwerks nicht erlaubt." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Rechner ist über den SOCKSv5-Server nicht erreichbar." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Das Netzwerk ist durch den SOCKSv5-Proxy nicht erreichbar." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Verbindung wurde durch SOCKSv5-Proxy abgewiesen." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-Proxy unterstützt den Befehl »connect« nicht." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-Proxy unterstützt den angegebenen Adresstyp nicht." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Unbekannter Fehler im SOCKSv5-Proxy." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Version %d der GThemedIcon-Kodierung kann nicht verarbeitet werden" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-enkodierter geheimer Schlüssel konnte nicht entschlüsselt werden" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Kein PEM-enkodierter geheimer Schlüssel gefunden" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-enkodierter geheimer Schlüssel konnte nicht verarbeitet werden" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Kein PEM-enkodiertes Zertifikat gefunden" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-enkodiertes Zertifikat konnte nicht verarbeitet werden" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access is " +"locked out." +msgstr "" +"Dies ist die letzte Möglichkeit, das Passwort korrekt einzugeben, bevor Ihr " +"Zugang gesperrt wird." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Ein Passwort wurde mehrfach inkorrekt eingegeben, daher wird Ihr Zugriff nach " +"weiteren Fehleingaben gesperrt." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Das eingegebene Passwort ist ungültig." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 Kontrollnachricht wird erwartet, %d wurden erhalten" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Unerwartete Art von Zustzdaten" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ein Dateideskriptor wird erwartet, aber %d wurden erhalten\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Ungültiger Dateideskriptor wurde erhalten" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Fehler beim Senden der Anmeldedaten:" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Fehler bei der Überprüfung, ob SO_PASSCRED für Socket aktiviert ist: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for socket. " +"Expected %d bytes, got %d" +msgstr "" +"Unerwartete Länge der Option bei der Überprüfung, ob SO_PASSCRED für den " +"Socket aktiviert ist. Erwartet wurden %d Bytes, jedoch %d erhalten" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fehler beim Aktivieren von SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Erwartet wurde der Empfang eines einzelnen Bytes als Anmeldedaten, jedoch " +"null Bytes gelesen" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Kontrollnachricht wurde nicht erwartet, %d wurde erhalten" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Fehler beim Deaktivieren von SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Fehler beim Lesen aus dem Dateideskriptor: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Fehler beim Schließen des Dateideskriptors: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Wurzelordner des Dateisystems" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Fehler beim Schreiben in den Dateideskriptor: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "Datenträger unterstützt weder Auswerfen noch »eject_with_operation«" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Anwendung kann nicht gefunden werden" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Fehler beim Starten der Anwendung: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Adressen werden nicht unterstützt" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "Änderungen von Assoziationen unter win32 nicht unterstützt" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Erstellen von Assoziationen unter win32 nicht unterstützt" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Fehler beim Lesen aus dem Handler: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Fehler beim Schließen des Handlers: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Fehler beim Schreiben in das Handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nicht genügend freier Speicher" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Interner Fehler: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Weitere Eingaben erforderlich" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ungültige komprimierte Daten" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresse, an der gelauscht werden soll" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignoriert (für Kompatibilität mit GTestDbus)" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Adresse ausgeben" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Adresse im Shell-Modus ausgeben" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Einen D-Bus-Dienst ausführen" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Falsche Argumente\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unerwartetes Attribut »%s« des Elements »%s«" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribut »%s« des Elements »%s« konnte nicht gefunden werden" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unerwarteter Tag »%s«; Tag »%s« wird erwartet" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unerwarteter Tag »%s« innerhalb von »%s«" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Es wurde keine gültige Lesezeichendatei in den Datenordnern gefunden" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Es existiert bereits ein Lesezeichen für die Adresse »%s«" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Es konnte kein Lesezeichen für die Adresse »%s« gefunden werden." + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" +"Die Befehlszeile »%s« konnte nicht mit der Adresse »%s« verknüpft werden." + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Bruchstückhafte Zeichenfolge am Eingabeende" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Notnagel »%s« kann nicht in Kodierung »%s« umgewandelt werden" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Die lokale Adresse »%s« darf kein »#« enthalten" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Die Adresse »%s« ist ungültig" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Der Rechnername der Adresse »%s« ist ungültig" + +# CHECK +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Die Adresse »%s« enthält ungültige Escape-Zeichen" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Der Pfadname »%s« ist kein absoluter Pfad" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Ungültiger Rechnername" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Januar" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februar" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "März" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "August" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Dezember" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mär" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dez" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Montag" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dienstag" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Mittwoch" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Donnerstag" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Freitag" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Samstag" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sonntag" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Mo" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Di" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mi" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Do" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Fr" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sa" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "So" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fehler beim Öffnen des Ordners »%s«: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu Bytes konnten nicht zugeordnet werden, um Datei »%s« zu lesen" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fehler beim Lesen der Datei »%s«: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datei »%s« ist zu groß" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Aus der Datei »%s« konnte nicht gelesen werden: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Datei »%s« konnte nicht geöffnet werden: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Datei »%s« konnte nicht angelegt werden: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Vorlage »%s« ungültig, sollte kein »%s« enthalten" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Vorlage »%s« enthält nicht XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, 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:2104 +msgid "Symbolic links not supported" +msgstr "Symbolische Verknüpfungen nicht unterstützt" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Nicht konvertierte Daten befinden sich noch im Lesepuffer " + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanal endet mit einem Teilzeichen" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Keine reguläre Datei" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ungültiger Gruppenname: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Die Schlüsselwertedatei beginnt nicht mit einer Gruppe" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ungültiger Schlüsselname: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Die Schlüsselwertedatei enthält die nicht unterstützte Kodierung »%s«" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Die Schlüsselwertedatei enthält nicht die Gruppe »%s«" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Die Schlüsselwertedatei enthält nicht den Schlüssel »%s«" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"Der Schlüssel »%s« in der Gruppe »%s« enthält den Wert »%s«, obwohl %s " +"erwartet wurde" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, 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:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Der Wert »%s« konnte nicht als Zahl interpretiert werden." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Ganzzahliger Wert »%s« ist außerhalb des Wertebereiches." + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" +"Der Wert »%s« konnte nicht als boolescher Ausdruck interpretiert werden." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Attribute der Datei »%s%s%s%s« konnten nicht ermittelt werden: fstat() " +"gescheitert: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "»%s%s%s%s« konnte nicht abgebildet werden: mmap() ist gescheitert: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Datei »%s« konnte nicht geöffnet werden: open() ist gescheitert: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fehler in Zeile %d, Zeichen %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "»%s« ist kein gültiger Name" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "»%s« ist kein gültiger Name: »%c«" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fehler in Zeile %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Zeichenreferenz »%-.*s« kodiert kein zulässiges Zeichen" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Leere Entität »&;« gefunden; gültige Entitäten sind & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitätenname »%-.*s« ist unbekannt" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument muss mit einem Element beginnen (e.g. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Seltsames Zeichen »%s«, »=« wird nach dem Attributnamen »%s« des Elements " +"»%s« erwartet" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument ist leer oder enthält nur Leerraum" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument endete unerwartet nach einer offenen spitzen Klammer »<«" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument endete unerwartet innerhalb eines Elementnamens" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument endete unerwartet innerhalb eines Attributnamens" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument endete unerwartet innerhalb eines Element-öffnenden Tags." + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument endete unerwartet innerhalb eines Attributwertes" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokument endete unerwartet innerhalb eines Kommentars oder " +"Verarbeitungsanweisung" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Aufruf:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION …]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Hilfeoptionen:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Hilfeoptionen anzeigen" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Alle Hilfeoptionen anzeigen" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Anwendungsoptionen:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, 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:989 ../glib/goption.c:1057 +#, 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:1014 +#, 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:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Fehler beim Verarbeiten der Option: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Für %s wird ein Argument benötigt" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Unbekannte Option %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "Beschädigtes Objekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "Interner Fehler oder beschädigtes Objekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "Nicht genügend freier Speicher" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "Rückverfolgungsgrenze wurde erreicht" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "Rekursionslimit wurde erreicht" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "Ungültige Kombination von newline-Markierungen" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "fehlerhafter Versatz" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "Kurzes UTF-8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "Rekursionsschleife" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "Unbekannter Fehler" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ am Ende des Ausdrucks" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c am Ende des Ausdrucks" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "Unbekanntes Zeichen nach \\" + +# CHECK +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "Ziffern wirkungslos in {}-Quantifizierer" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "Ziffer zu groß in {}-Quantifizierer" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "Terminierendes ] für Zeichenklasse fehlt" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "Ungültige Escape-Sequenz in Zeichenklasse" + +# CHECK +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "Bereich wirkungslos in Zeichenklasse" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "Nichts zum Wiederholen" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "Unerwartete Wiederholung" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "Unbekanntes Zeichen nach (? oder (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-benannte Klassen werden nur innerhalb einer Klasse unterstützt" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "Abschließende ) fehlt" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "Referenz auf nicht existierenden Unterausdruck" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "fehlende ) nach Kommentar" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "Regulärer Ausdruck zu groß" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "Fehler beim Holen von Speicher" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ohne öffnende (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "Code-Überlauf" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "Unbekanntes Zeichen nach (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "Rückblickende Annahme hat keine feste Länge" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "Falsch formatierte Zahl oder Name nach (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "Bedingte Gruppe enthält mehr als zwei Verzweigungen" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "Annahme erwartet nach (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "auf (?R oder (?[+-]Ziffern muss ) folgen" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "Unbekannter POSIX-Klassenname" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-Elementverknüpfungen nicht unterstützt" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "Wert in \\x{…}-Sequenz ist zu groß" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "Ungültige Bedingung (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nicht erlaubt in rückblickender Annahme" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" +"Escape-Sequenzen \\L, \\l, \\N{name}, \\U, und \\u werden nicht unterstützt" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "Rekursive Aufrufe könnten unendlich oft aufgerufen werden" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "Unbekanntes Zeichen nach (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "Terminierung im Namen des Unterausdrucks fehlt" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "Zwei benannte Unterausdrücke haben den gleichen Namen" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "Fehlerhafte \\P- oder \\p-Sequenz" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "Unbekannte Eigenschaftsname nach \\P oder \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "Name des Unterausdrucks ist zu lang (maximal 32 Zeichen)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "Zu viele benannte Unterausdrücke (maximal 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "Oktaler Wert ist größer als \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "Überlauf beim Kompilieren des Arbeitsbereichs" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "" +"Bereits geprüfter, referenzierter Unterausdruck konnte nicht gefunden werden" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-Gruppe enthält mehr als eine Verzweigung" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "Inkonsistente NEWLINE-Optionen" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"Auf \\g folgt kein eingeklammerter, in eckigen Klammern eingeklammerter oder " +"zitierter Name oder eine Zahl oder eine einfache Zahl" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "Eine nummerierte Referenz darf nicht Null sein" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "Ein Argument ist für (*ACCEPT), (*FAIL), oder (*COMMIT) nichr erlaubt" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) nicht erkannt" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "Zahl ist zu groß" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "Name des Unterausdrucks nach (?& fehlt" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "Ziffer erwartet nach (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] ist ein ungültiges Datenzeichen im JavaScript-Kompatibiliätsmodus" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "" +"Verschiedene Namen für Unterausdrücke der gleichen Nummer sind nicht erlaubt" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) benötigt ein Argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "Auf \\c muss ein ASCII-Zeichen folgen" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"Auf \\k folgt kein eingeklammerter, in eckigen Klammern eingeklammerter oder " +"zitierter Name" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N wird in einer Klasse nicht unterstützt" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "Zu viele Vorwärtsreferenzen" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "Name ist zu lang in (*MARK), (*PRUNE), (*SKIP), oder (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "Zeichenwert in \\u....-Sequenz ist zu groß" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fehler beim Anwenden des regulären Ausdrucks %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-Bibliothek wurde ohne UTF8-Unterstützung kompilliert" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE-Bibliothek wurde ohne Unterstützung für UTF8-Eigenschaften kompilliert" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "" +"PCRE-Bibliothek wurde mit Unterstützung für nicht-kompatible Optionen " +"kompiliert" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fehler beim Optimieren des regulären Ausdrucks %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "Hexadezimalzahl oder »}« erwartet" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "Hexadezimalzahl erwartet" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "Fehlendes »<» in symbolischer Referenz" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "Unvollendete symbolische Referenz" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "Symbolische Referenz der Länge 0" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "Ziffer erwartet" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "Illegale symbolische Referenz" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "Verirrtes abschließendes »\\«" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "Unbekannte Escape-Sequenz" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Zitierter Text beginnt nicht mit einem Anführungszeichen" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text war leer (oder enthielt nur Leerraum)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Daten vom Kindprozess konnten nicht gelesen werden (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unerwarteter Fehler in waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Der Kindprozess wurde mit Status %ld beendet" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Der Kindprozess wurde mit Signal %ld beendet" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Der Kindprozess wurde mit Signal %ld beendet" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Der Kindprozess wurde gewaltsam beendet" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lesen aus Weiterleitung zum Kind (%s) gescheitert" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Abspalten gescheitert (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "In Ordner »%s« (%s) konnte nicht gewechselt werden" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Kindprozess »%s« konnte nicht ausgeführt werden (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Abspalten des Kindprozesses gescheitert (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unbekannter Fehler beim Ausführen des Kindprozesses »%s«" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Daten konnten nicht vom Kindprozess gelesen werden" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Kindprozess konnte nicht ausgeführt werden (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ungültiger Programmname: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ungültige Zeichenkette im Argumentsvektor bei %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ungültige Zeichenkette in der Umgebung: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ungültiger Arbeitsordner: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Hilfsprogramm (%s) konnte nicht ausgeführt werden" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Zeichen außerhalb des Bereiches für UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Ungültige Folge in Umwandlungseingabe" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Zeichen außerhalb des Bereiches für UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u Byte" +msgstr[1] "%u Bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f kiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s Byte" +msgstr[1] "%s Bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Außergewöhnlicher Abbruch des Programms beim Erzeugen der Befehlszeile " +#~ "»%s«: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "Befehlszeile »%s« brach mit von Null verschiedenem Beenden-Status %d ab: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Kein Diensteintrag für »%s«" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "Arbeitsplatzlimit für leere Teilstrings wurde erreicht" + +#~ 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." + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "Wiederholen einer DEFINE-Gruppe ist nicht erlaubt" + +#~ msgid "Error connecting: " +#~ msgstr "Fehler beim Verbinden:" + +#~ msgid "Error connecting: %s" +#~ msgstr "Fehler beim Verbinden: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Fehler beim Lesen aus Unix-Datenstrom: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Fehler beim Schließen des Unix-Datenstroms: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Fehler beim Schreiben in Unix-Datenstrom: %s" + +#~ msgid "File is empty" +#~ msgstr "Datei ist leer" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Diese Option wird demnächst entfernt." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Fehler beim Untersuchen der Datei %s mit fstat(): %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4-Implementation begrenzt Benutzername auf %i Zeichen" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4-Implementation begrenzt Rechnername auf %i Zeichen" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Typ des Rückgabewertes ist inkorrekt, »%s« erhalten, »%s« erwartet" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Es wird versucht, die Eigenschaft %s auf den Typ %s zu setzen, aber der " +#~ "Typ ist %s entsprechend der erwarteten Schnittstelle" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Befehle:\n" +#~ " help Diese Information anzeigen\n" +#~ " get Den Wert eines Schlüssels ermitteln\n" +#~ " set Den Wert eines Schlüssels setzen\n" +#~ " reset Den Wert eines Schlüssels zurücksetzen\n" +#~ " monitor Einen Schlüssel auf Änderungen überwachen\n" +#~ " writable Prüfen, ob ein Schlüssel schreibgeschützt ist\n" +#~ "\n" +#~ "Mit »%s BEFEHL --help« erhalten Sie individuelle Hilfe für einen Befehl.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Den Pfad für das Schema angeben" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumente:\n" +#~ " SCHEMA Die Kennung des Schemas\n" +#~ " SCHLÜSSEL Der Name des Schlüssels\n" +#~ " WERT Der Wert, auf den der Schlüssel gesetzt wird, als " +#~ "serialisierte GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Schlüssel %s ist nicht schreibbar\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "SCHLÜSSEL auf Änderungen überwachen und geänderte Werte ausgeben.\n" +#~ "Überwachung wird fortgesetzt, bis der Prozess beendet wird." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Kein Schema »%s« angegeben in überschreibender Datei »%s«" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Ordner kann nicht über Ordner verschoben werden" + +#~ 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 "" +#~ "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 "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.po b/po/dz.po new file mode 100644 index 0000000..28b6590 --- /dev/null +++ b/po/dz.po @@ -0,0 +1,3836 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2006-08-09 10:23+0530\n" +"Last-Translator: Mindu Dorji\n" +"Language-Team: DZONGKHA \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "རེ་བ་མེད་པའི་ཁྱད་ཆོས་ '%s'ཆ་ཤས་'%s'གི་དོན་ལུ།" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ཁྱད་ཆོས་'%s'འཚོལ་མ་ཐོབ་ ཆ་ཤས་'%sགི" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s'། རེ་བ་བསྐྱེད་མི་ངོ་རྟགས་'%s'།" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "རེ་བ་མེད་པའི་ངོ་རྟགས་ '%s' ངོ་རྟགས། '%s'ནང་ན།" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་དེབ་རྟགས་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་ དེབ་རྟགས་ཅིག་ཧེ་མ་ལས་རང་འདུག" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་མ་ཐོབ།" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ མ་ཡིམ་གྱི་དབྱེ་བ་ངེས་འཛིན་མ་འབད་བས། " + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%s'གི་དོན་ལུ་དེབ་རྟགས་ནང་ སྒེར་གྱི་ཟུར་རྟགས་ངེས་འཛིན་མ་འབད་བས།" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "ཡུ་ཨར་ཨའི་'%sགི་དོན་ལུ་ དེབ་རྟགས་ནང་ སྡེ་ཚན་གཞི་སྒྲིག་མ་འབད་བས།" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "མིང་'%sའབད་མི་གློག་རིམ་གྱིས་ '%s དོན་ལུ་ དེབ་རྟགས་ཅིག་ཐོ་འགོད་མ་འབད་བས། " + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ཡིག་འབྲུའི་ཆ་ཚན་ ‘%s’ ལས་ ‘%s’ ལུ་གཞི་བསྒྱུར་འབད་ནི་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "‘%s’ ལས་ '%s' ལུ་ སྒྱུར་བྱེད་ཁ་ཕྱེ་མ་ཚུགས།" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "ཨིན་པུཊི་མཇུག་ལུ་ ཡི་གུའི་འབྱུང་རིམ་ཆ་ཤས།" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "གློ་བུར་རྒྱབ་ཐག ’%s’ ལས་ ཀོཌི་སེཊི་ ’%s’ ལུ་ གཞི་བསྒྱུར་འབད་མི་ཚུགས། " + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ \"file\" འཆར་ལས་ལག་ལེན་འཐབ་པའི་ ཡུ་ཨར་ཨའི་ཡང་དག་ཅིག་མེན།" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ཉེ་གནས་་ཀྱི་ཡིག་སྣོད་ ཡུ་ཨར་ཨའི་ ’%s’ འབད་མི་དེ་ནང་ '#' ཅིག་མེདཔ་འོང༌།" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ ནུས་མེད་ཨིན་པས།" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ ཧོསཊི་ནེམ་དེ་ ནུས་མེད་ཨིན་པས།" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "ཡུ་ཨར་ཨའི་ ’%s’ གི་ནང་ན་ ནུས་མེད་ཐོག་ལས་ཐར་མི་ ཡིག་འབྲུ་་ཚུ་འདུག" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "འགྲུལ་ལམ་གྱི་མིང་ ’%s’ འབད་མི་དེ་ འགྲུལ་ལམ་ཡང་དག་ཅིག་མེན།" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "ངས་ཆ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "ཕྱི་ཆ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "པསྱི་ལོ%yཟལ%mཚེས%dཆུ་ཚོད%Hཀསར་མ%Mཀསར་ཆ%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "པསྱི་ལོ%yཟལ%mཚེས%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "ཆུ་ཚོད%Hཀསར་མ%Mཀསར་ཆ%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "ཆུ་ཚོད%Iཀསར་མ%Mཀསར་ཆ%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "ཟླ་བ་དང་པ་" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "ཟླ་བ་གཉིས་པ་" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "ཟླ་བ་གསུམ་པ་" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "ཟླ་བ་བཞི་པ་" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "ཟླ་བ་ལྔ་ཕ་" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "ཟླ་བ་དྲུག་པ་" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "ཟླ་བ་བདུནཔ་" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ཟླ་༡" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ཟླ་༢" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "ཟླ་༣" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ཟླ་༤" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "ཟླ་༥" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ཟླ་༦" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ཟླ་༧" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "གཟའ་མིག་དམར་" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "གཟའ་ལྷག་ཕ་" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "གཟའ་པུར་བུ་" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "གཟའ་པ་སངས་" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "གཟའ་སྤེན་ཕ་" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "གཟའ་ཉི་མ་" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "གཟའ་ཟླ་བ་" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "མིར་" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ལྷག་" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "པུར་" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "སངས་" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "སྤེན་" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ཉི་" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ཟླ་" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "བཱཡིཊི་ %lu བསྐལ་སྤྲོད་འབད་མ་ཚུགས་ \"%s\" ལྷག་ནི་ལུ།" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ནང་ལས་ ལྷག་མ་ཚུགས།" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ཁ་ཕྱེ་མ་ཚུགས།" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ཡིག་སྣོད་ '%s': fstat() གི་ཁྱད་ཆོས་ཚུ་ ལེན་མ་ཚུགས་ :%sམ་བཏུབ།" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’:fdopen() ཁ་ཕྱེ་མ་ཚུགས། %s་མ་བཏུབ།" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ལས་'%s' ལུ་ བསྐྱར་མིང་བཏགས་མ་ཚུགས། g_rename() གིས་ %s ལུ་མ་བཏུབ།" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ཡིག་སྣོད་’%s’ འབྲི་ནིའི་དོན་ལུ་ ཁ་ཕྱེ་མ་ཚུགས་: fdopen() མ་བཏུབ་:%s།" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’འབྲི་མ་ཚུགས་: fwrite() མ་བཏུབ་:%s།" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ཁ་བསྡམས་མ་ཚུགས་: fclose() མ་བཏུབ་:%s།" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ཡོད་བཞིན་པའི་ཡིག་སྣོད་'%s' དེ་ རྩ་བསྐྲད་གཏང་མ་ཚུགས་: g_unlink() མ་བཏུབ་:%s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ཊེམ་པེ་ལེཊི་ '%s' དེ་ནུས་མེད་ཨིན། དེ་ནང་ '%s' འབད་མི་ བཞག་ནི་མི་འོང༌།" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ཊེམ་པེལེཊི་ ’%s’ འབད་མི་དེ་ནང་ XXXXXX མིན་འདུག།" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ཡིག་སྣོད་ ’%s’ ཁ་ཕྱེ་མ་ཚུགས་: open()མ་བཏུབ་:%s།" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ཡིག་སྣོད་’%s’ གི་ས་ཁྲ་འབྲི་མ་ཚུགས་: mmap() མ་བཏུབ་:%s།" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ནུས་མེད་ཡུ་ཊི་ཨེཕ་-༨ ཀྱི ཨིན་ཀོ་དེཌི་ཚིག་ཡིག" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ཡིག་འབྲུ་གཞི་བསྟུན་ '%-.*s' དེ་གིས་ གནང་བ་ཅན་གྱི་ཡིག་འབྲུ་ཅིག་ལུ་ ཨིན་ཀོཌི་མི་འབད་བས།" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ངོ་བོ་སྟོང་པ་ ’&;’ མཐོང་ཅི། ནུས་ཅན་ངོ་བོ་ཚུ་: & " < > ' ཚུ་ཨིན།" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ངོ་བོའི་མིང་ '%s' ཧ་མ་གོ" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "ཡིག་ཆ་དེ་ (དཔེར་ན་ ) བཟུམ་མའི་ཆ་ཤས་ཅིག་གིས་ འགོ་བཙུགས་དགོ" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"ཡིག་འབྲུ་ ’%s’ དེ་ ཡིག་འབྲུ་’<’ ཅིག་གི་རྗེས་སུ་འོངམ་ད་ ནུས་པ་ཡོད་པའི་ཡིག་འབྲུ་ཅིག་མིན། འདི་གིས་ཆ་ཤས་" +"ཀྱི་མིང་ཅིག་ འགོ་མི་བཙུགསཔ་འོང༌།" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ཆ་ཤས་ཀྱི་ འགོ་བཙུགས་ངོ་རྟགས་ %s’ དེ་མཇུག་བསྡུ་ནི་ལུ་ ཡིག་འབྲུ་ ’>’ ཅིག་ " +"ཨིན་པའི་རེ་བ་ཡོད།" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"’%s’ དེ་རྐྱང་ཡིག་ཨིན་པས། ’=’ ཅིག་ཡོད་པའི་ རེ་བ་ཡོད་ ཁྱད་ཆོས་ཀྱི་མིང་ ’%s’ ཆ་ཤས་ ’%s’ གི་རྗེས་" +"སུ།" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"’%s’ དེ་ ཡིག་འབྲུ་ནུས་ཅན་ཅིག་མེན། ཁ་བསྡམ་ནིའི་ཆ་ཤས་མིང་ ’%s’; གི་རྟིང་བདའ་འོངམ་ད་ ཆོག་པའི་ཡིག་" +"འབྲུ་དེ་ ’>’ ཨིན།" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ཏེ་ཡོདཔ་ལས་ ད་ལྟོ་ཆ་ཤས་གཅིག་ཡང་ ཁ་ཕྱེ་ཕྱེཝ་མིན་འདུག" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ཆ་ཤས་ ’%s’ དེ་ ཁ་བསྡམས་ནུག དེ་འབདཝ་ད་ ད་ལྟོ་ཁ་ཕྱེ་སྟེ་ཡོད་མི་ཆ་ཤས་དེ་ ’%s’ ཨིན།" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "ཡིག་ཆ་དེ་སྟོང་པའམ་ ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་མ་གཏོགས་ མེདཔ་འོང་ནི་མས།" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ཡིག་ཆ་དེ་ ཟུར་ཁུག་གུག་ཤད་ ’<’ ཅིག་གི་ཤུལ་ལས་ རེ་བ་མེད་པར་ རྫོགས་སོ་ཡི།" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་རུང་ ཆ་ཤས་དེ་ ཁ་ཕྱེ་སྟེ་རང་འདུག མཐའ་མཇུག་ཁ་ཕྱེ་མི་ ཆ་ཤས་དེ་ " +"-’%s’ ཨིན་པས།" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ཡིག་ཆ་དེ་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག ངོ་རྟགས་ <%s/> མཇུག་བསྡུ་བའི་ ཁ་བསྡམ་ཟུར་ཁུག་གུག་ཤད་ཅིག་ " +"མཐོང་བའི་རེ་བ་ཡོད།" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཅིག་གི་ མིང་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ཁ་ཕྱེ་ནིའི་ ངོ་རྟགས་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ཤུལ་ལས་ མཉམ་རྟགས་ཀྱི་རྗེས་སུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག ཁྱད་ཆོས་ཀྱི་བེ་" +"ལུ་མིན་འདུག" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་ བེ་ལུ་ཅིག་གི་ནང་ན་སྡོད་པའི་སྐབས་ལུ་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ཡིག་ཆ་དེ་ ཆ་ཤས་ ’%s’ གི་དོན་ལུ་ ཁ་བསྡམ་ངོ་རྟགས་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ཡིག་ཆ་དེ་ བསམ་བཀོད་ ཡང་ན་ ལས་སྦྱོར་བཀོད་རྒྱ་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་ རྫོགས་སོ་ནུག" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "ཡིག་འབྲུ་ནང་ཆ་ཤས་ནང་ལུ་ རྒྱུ་ལམ་རྩ་འགྲོལ་འགྱོཝ་ཨིན།" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "མཇུག་མ་བསྡུ་བའི་ ཡིག་འབྲུའི་གཞི་བསྟུན།" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "གྱལ་རིམ་%d ཡིག་འབྲུ་ %d:%s ལུ་འཛོལ་བ།" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "མཇུག་མ་བསྡུ་བའི་ ངོ་བོའི་གཞི་བསྟུན།" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ལུང་འདྲེན་ཚིག་ཡིག་ཚུ་ འདྲེན་རྟགས་ཀྱི་ཐོག་ལས་ འགོ་མི་བཙུགས།" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"བཀོད་ལམ་ནང་ ཡང་ན་ གཞན་ ཤལ་གྱི་འདྲེན་རྟགས་ནང་བཙུགས་པའི་ཚིག་ཡིག་ཚུ་ནང་ མི་མཐུན་པའི་འདྲེན་རྟགས་" +"འདུག" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"ཚིག་ཡིག་དེ་ ཡིག་འབྲུ་ ’\\’ ཅིག་གི་ རྟིང་བདའ་སྟེ་རང་ རྫོགས་སོ་ནུག (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས།)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"འདྲེན་རྟགས་དང་ མ་མཐུན་པའི་ཧེ་མར་ རྫོགས་སོང་མི་ ཚིག་ཡིག་དེ་ %c ཨིན་མས། (ཚིག་ཡིག་དེ་ ’%s’ ཨིན་པས)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "ཚིག་ཡིག་དེ་ སྟོང་པའམ་ (ཡང་ཅིན་ ནང་ན་ས་སྟོང་དཀརཔོ་རྐྱངམ་ཅིག་ འོང་ནི་མས།)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས། " + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"ཆ་ལག་ལས་སྦྱོར་ (%s) དང་གཅིག་ཁར་ རྒྱུད་འབྲེལ་འཐབ་ནིའི་དོན་ལུ་ རྒྱུད་དུང་གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ཆ་ལག་རྒྱུད་དུང་ (%s) ནང་ལས་ ལྷག་མ་ཚུགས།" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "སྣོད་ཐོ་’%s’ (%s)ལུ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས། " + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) དེ་ ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d: %s ལུ་ སྒྲུབ་རྟགས་ཝེཀ་ཊོར་ནང་ ནུས་མེད་ཡིག་རྒྱུན།" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "མཐའ་འཁོར་:%sནང་ལུ་ ནུས་མེད་ཡིག་རྒྱུན།" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ནུས་མེད་ལཱ་གཡོག་སྣོད་ཐོ་:%s།" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ལས་རོགས་པའི་ལས་རིམ་ (%s) ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ཆ་ལག་ལས་སྦྱོར་ནང་ལས་ གནད་སྡུད་ལྷག་ནི་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་ g_io_channel_win32_poll() " +"ཚུ་འདུག" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་མ་ཚུགས།" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"སེལ་འཐུ་() ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ་བྱུང་སྟེ་ ཆ་ལག་ལས་སྦྱོར་ (%s) ནང་ལས་ གནད་སྡུད་ལྷག་དོ།" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "ཝེཊི་པིཌི་ () (%s) ནང་ལུ་ རེ་བ་མེད་པའི་འཛོལ་བ། " + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) ལུ་ ཁ་སྤེལ་མ་ཚུགས།" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ \"%s\" (%s) ལག་ལེན་འཐབ་མ་ཚུགས།" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) གི་ ཨའུཊི་པུཊི་ ཡང་ཅིན་ ཨིན་པུཊི་ ལོག་གཏང་མ་ཚུགས།" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ཆ་ལག་ལས་སྦྱོར་ (%s) ཁ་སྤེལ་མ་ཚུགས།" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "མ་ཤེས་པའི་འཛོལ་བ་ཅིག་གིས ཆ་ལག་ལས་སྦྱོར་ \"%s\" ལག་ལེན་འཐབ་དོ།" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ཆ་ལག་ པིཨའི་ཌི་ རྒྱུད་དུང་ (%s) ནང་ལས་ གནད་སྡུད་ལངམ་ ལྷག་མ་ཚུགས།" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་ - ༨ ཀྱི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "བསྒྱུར་བཅོས་ཀྱི་ ཨིན་པུཊི་ནང་ལུ་ ནུས་མེད་འབྱུང་རིམ་འདུག" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "ཡིག་འབྲུ་ ཡུ་ཊི་ཨེཕ་- ༡༦ གི་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་མས།" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "ལག་ལེན:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ གདམ་ཁ... ] " + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ།" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་སྟོན།" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "གྲོགས་རམ་གདམ་ཁ་ཚུ་ ཆ་མཉམ་སྟོན།" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "གློག་རིམ་གྱི་གདམ་ཁ།" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’དེ་%s གི་དོན་ལུ་ མིང་དཔྱད་འབད་མི་ཚུགས།" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s གི་དོན་ལུ་ ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "བེ་ལུ་གཉིས་བལྟབ་%s'མིང་དཔྱད་འབད་མི་ཚུགས། %sགི་དོན་ལུ།" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "བེ་ལུ་གཉིས་བལྟབ་'%s' དེ་%s གི་དོན་ལུ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s གི་དོན་ལུ་ སྒྲུབ་རྟགས་བརླག་སྟོར་ཞུགས་ནུག" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།" + +#: ../glib/gkeyfile.c:366 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "གནད་སྡུད་སྣོད་ཐོ་ཚུ་ནང་ ནུས་ཅན་ལྡེ་མིག་ཡིག་སྣོད་ འཚོལ་མ་ཐོབ།" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "དུས་རྒྱུན་གྱི་ཡིག་སྣོད་ཅིག་མེན་པས།" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "ཡིག་སྣོད་སྟོངམ་ཨིན་པས།" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ལྡེ་མིག་-བེ་ལུ་དང་ སྡེ་ཚན་ བསམ་བཀོད་མེན་པའི་ གྱལ་རིམ་'%s' ཡོད། " + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ སྡེ་ཚན་ཅིག་གི་ཐོག་ལས་ འགོ་མི་བཙུགས།" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ རྒྱབ་སྐྱོར་མེད་པའི་ ཨིན་ཀོ་ཌིང་'%s'ཡོད།" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ སྡེ་ཚན་ '%s' མིན་འདུག།" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ ལྡེ་མིག་'%s'མིན་འདུག" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཡུ་ཊི་ཨེཕ་-༨ མེད་པའི་ ལྡེ་མིག་'%s' བེ་ལུ་'%s' དང་བཅསཔ་སྦེ་འདུག" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ བེ་ལུ་ཡོད་མི་ ལྡེ་མིག་ '%s'འདུག" + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ བེ་ལུ་ཡོད་མི་ ལྡེ་མིག་ '%s'འདུག" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ཁ་བསྒྱུར་འབད་མ་ཚུགས་པའི་ ལྡེ་མིག་'%s'སྡེ་ཚན་'%s' ནང་འདུག།" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་དེ་ལུ་ ལྡེ་མིག་'%s' སྡེ་ཚན་'%s' ནང་མིན་འདུག" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ གྱལ་རིམ་མཇུག་ལུ་ གྲོས་ཐར་འབད་མི་ཡིག་འབྲུ་འདུག" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ལྡེ་མིག་ཡིག་སྣོད་ནང་ལུ་ ནུས་མེད་གྲོས་ཐར་འབྱུང་རིམ་ '%s' འདུག" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "བེ་ལུ་'%s'དེ་ ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ཧྲིལ་ཨང་བེ་ལུ་ ’%s’ དེ་ ཁྱབ་ཚད་ཀྱི་ཕྱི་ཁར་ཨིན་པས།" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "བེ་ལུ་'%s'དེ་ འཕུར་ལྡིང་ཨང་གྲངས་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "བེ་ལུ་'%s'དེ་ བུ་ལིན་ཅིག་སྦེ་ ཁ་བསྒྱུར་འབད་མི་ཚུགས།" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "གཞི་བསྒྱུར་གྱི་ཨིན་པུཊི་ནང་ བའིཊི་གི་འབྱུང་རིམ་ ནུས་མེད་ཨིན་པས།" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ཡིག་འབྲུ་ ’%s དེ་ ངོ་བོའི་མིང་ཅིག་གི་ ནང་འཁོད་ལུ་ ནུས་མེད་ཨིན། " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ཡིག་འབྲུ་ ’%s དེ་ ངོ་བོའི་མིང་ཅིག་གི་ ནང་འཁོད་ལུ་ ནུས་མེད་ཨིན། " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ཡིག་འབྲུ་ ’%s དེ་ ངོ་བོའི་མིང་ཅིག་གི་ ནང་འཁོད་ལུ་ ནུས་མེད་ཨིན། " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "མིང་'%sའབད་མི་གློག་རིམ་གྱིས་ '%s དོན་ལུ་ དེབ་རྟགས་ཅིག་ཐོ་འགོད་མ་འབད་བས། " + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "ནུས་མེད་ཀྱི་ ཧོསཊི་ནེམ།" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ ’%s’:%s ལྷག་མ་ཚུགས།" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "ཡིག་ཆ་དེ་ ཁྱད་ཆོས་ཀྱི་མིང་ཅིག་གི་ནང་ན་ རེ་བ་མེད་པར་རྫོགས་སོ་ནུག" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "སྣོད་ཐོ་ '%s':%s ཁ་ཕྱེ་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "དུས་རྒྱུན་གྱི་ཡིག་སྣོད་ཅིག་མེན་པས།" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "ནུས་མེད་ལསརིམ་མིང་:%s།" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "ཤེས་མ་ཚུགས་པའི་གདམ་ཁ་ %s།" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "ཡིག་སྣོད་ཐབས་ལམ་ བསྒྱུར་བཅོས་འབད་མ་ཚུགས་: waitpid() གིས་%s ལུ་མ་བཏུབ།" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "གཞི་བསྒྱུར་གྱི་སྐབས་འཛོལ་བ་ :%s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ཡིག་སྣོད་ ’%s’:%s གསར་བསྐྲུན་འབད་མ་ཚུགས།" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "གྱལ་རིམ་ %d་: %s ལུ་འཛོལ་བ།" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "གདམ་ཁ་%s མིང་དཔྱད་འབད་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "བརྡ་མཚོན་འགྲེལ་ལམ་ལུ་ རྒྱབ་སྐྱོར་མིན་འདུག" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ཡིག་སྣོད་ ’%s’: %s ལྷག་ནི་ལུ་འཛོལ་བ།" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/el.po new file mode 100644 index 0000000..a46f585 --- /dev/null +++ b/po/el.po @@ -0,0 +1,4735 @@ +# translation of glib.HEAD.po to Greek +# Greek translation of glib. +# Copyright (C) 2002, 2004, 2006, 2009 Free Software Foundation, Inc. +# Simos Xenitellis , 2002. +# Kostas Papadimas , 2002. +# Kostas Papadimas , 2004, 2006. +# Jennie Petoumenou , 2009. +# Fotis Tsamis , 2009. +# Michael Kotsarinis , 2011. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2012. +# Dimitris Spingos (Δημήτρης Σπίγγος) , 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&k" +"eywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-12-19 20:14+0000\n" +"PO-Revision-Date: 2012-12-24 17:21+0300\n" +"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) \n" +"Language-Team: team@gnome.gr\n" +"Language: el\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:184 ../gio/ginputstream.c:375 +#: ../gio/ginputstream.c:612 ../gio/ginputstream.c:830 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Η τιμή που διαβιβάστηκε στο %s είναι υπερβολικά μεγάλη" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Δεν υποστηρίζεται η αναζήτηση στη βασική ροή" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Αδυναμία περικοπής του GMemoryInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1020 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Η ροή έχει ήδη κλείσει" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Δεν υποστηρίζεται η περικοπή στη βασική ροή" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Η λειτουργία ακυρώθηκε" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Άκυρο αντικείμενο, δεν αρχικοποιήθηκε" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Ελλιπής σειρά πολλαπλών byte στην είσοδο" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Μη επαρκής χώρος στην περιοχή προορισμού" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Άκυρη σειρά byte στην είσοδο μετατροπής" + +# gconf/gconftool.c:1181 +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Σφάλμα κατά τη μετατροπή: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "Δεν υποστηρίζεται η ακυρώσιμη αρχικοποίηση" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Η μετατροπή από την ομάδα χαρακτήρων '%s' σε '%s' δεν υποστηρίζεται" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Αδυναμία ανοίγματος μετατροπέα από '%s' σε '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "τύπος %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Άγνωστος τύπος" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s τύπος αρχείων" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "Το GCredentials δεν έχει υλοποιηθεί σε αυτό το λειτουργικό σύστημα" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Δεν υπάρχει υποστήριξη του GCredentials για το λογισμικό σας" + +#: ../gio/gcredentials.c:480 +#| msgid "GCredentials is not implemented on this OS" +msgid "GCredentials does not contain a process ID on this OS" +msgstr "" +"Το GCredentials δεν περιέχει αναγνωριστικό διεργασίας σε αυτό το λειτουργικό " +"σύστημα" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Αναπάντεχο πρόωρο τέλος ροής" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Ανυποστήρικτο κλειδί `%s' στην εισαγωγή διεύθυνσης`%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Η διεύθυνση `%s' είναι άκυρη (χρειάζεται ακριβώς μια διαδρομή, tmpdir ή " +"αφηρημένα κλειδιά)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Συνδυασμός χωρίς νόημα ζευγαριού κλειδιού/τιμής στην εισαγόμενη διεύθυνση `" +"%s'" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Σφάλμα στη διεύθυνση `%s' - η ιδιότητα θύρας είναι κακοδιατυπωμένη" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Σφάλμα στη διεύθυνση `%s' - η ιδιότητα ομάδας είναι κακοδιατυπωμένη" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Το στοιχείο διευθύνσεως `%s' δεν περιέχει διπλή στιγμή (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Το δίδυμο κλειδί/τιμή %d, `%s', στο στοιχείο διεύθυνσης`%s' δεν περιέχει τον " +"τελεστή ίσον" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Σφάλμα στη μη διαφυγή του κλειδιού ή της τιμής στο δίδυμο κλειδί/τιμή %d, `" +"%s', στο στοιχείο διεύθυνσης `%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Σφάλμα στη διεύθυνση `%s' – ο μεταφορέας unix απαιτεί ακριβώς ένα από τα " +"κλειδιά `path' ή `abstract' να οριστούν" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Σφάλμα στη διεύθυνση `%s' - η ιδιότητα οικοδεσπότη λείπει ή είναι " +"κακοδιατυπωμένη" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Σφάλμα στη διεύθυνση `%s' - η ιδιότητα θύρας λείπει ή είναι κακοδιατυπωμένη" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Σφάλμα στη διεύθυνση `%s' - η ιδιότητα του παρόντος αρχείου λείπει ή είναι " +"κακοδιατυπωμένη" + +# +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Σφάλμα αυτόματης εκκίνησης: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Άγνωστη ή ανυποστήρικτη μεταφορά `%s' για τη διεύθυνση `%s'" + +# +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Σφάλμα ανοίγματος παρόντος αρχείου `%s': %s" + +# +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Σφάλμα ανάγνωσης από το παρόν αρχείο `%s': %s" + +# +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Σφάλμα ανάγνωσης από το παρόν αρχείο `%s', αναμενόμενες 16 bytes, " +"παραλήφθηκαν %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Σφάλμα εγγραφής περιεχομένου του παρόντος αρχείου `%s' στην ροή:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Η δεδομένη διεύθυνση είναι κενή" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Αδύνατη η δημιουργία διαύλου μηνυμάτων όταν χρησιμοποιείται setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Αδύνατη η δημιουργία διαύλου μηνυμάτων χωρίς ταυτότητα μηχανήματος: " + +# +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Σφάλμα δημιουργίας στη γραμμή εντολών `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" +"(Πληκτρολογήστε οποιοδήποτε χαρακτήρα για να κλείσετε αυτό το παράθυρο)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Η σύνοδος dbus δεν εκτελείται και η αυτόματη εκκίνηση απέτυχε" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Αδύνατος ο καθορισμός της διεύθυνσης διαύλου συνόδου (μη υλοποιημένος σε " +"αυτό το λειτουργικό)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Αδύνατος ο καθορισμός της διεύθυνση διαύλου από την μεταβλητή περιβάλλοντος " +"DBUS_STARTER_BUS_TYPE - άγνωστη τιμή `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Αδυναμία καθορισμού της διεύθυνσης διαύλου επειδή η μεταβλητή περιβάλλοντος " +"DBUS_STARTER_BUS_TYPE δεν είναι ορισθεί" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Άγνωστος τύπος διαύλου %d" + +#: ../gio/gdbusauth.c:297 +msgid "Unexpected lack of content trying to read a line" +msgstr "" +"Απροσδόκητη έλλειψη περιεχομένου κατά την προσπάθεια ανάγνωσης μιας γραμμής" + +#: ../gio/gdbusauth.c:341 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Απροσδόκητη έλλειψη περιεχομένου που προσπαθεί (με ασφάλεια) να διαβάσει μια " +"γραμμή" + +#: ../gio/gdbusauth.c:512 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Εξάντληση όλων των διαθέσιμων μηχανισμών επικύρωσης (χρησιμοποιήθηκε: %s) " +"(διαθέσιμο: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Ακυρώθηκε μέσω του GDBusAuthObserver::authorize-authenticated-peer" + +# +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Σφάλμα λήψης πληροφορίας του καταλόγου `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Δικαιώματα στον κατάλογο `%s' είναι κακοδιατυπωμένα. Αναμενόμενη κατάσταση " +"0700, ελήφθη 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Σφάλμα δημιουργίας καταλόγου `%s': %s" + +# +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Σφάλμα ανοίγματος της κλειδοθήκης `%s' για ανάγνωση: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Η γραμμή %d από την κλειδοθήκη στο `%s' με το περιεχόμενο `%s' είναι " +"κακοδιατυπωμένη" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Το πρώτο σημείο της γραμμής %d της κλειδοθήκης στο `%s' με περιεχόμενο `%s' " +"είναι κακοδιατυπωμένο" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Το δεύτερο διακριτικό της γραμμής %d της κλειδοθήκης στο `%s' με περιεχόμενο " +"`%s' είναι κακοδιατυπωμένο" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Δεν βρήκε το μπισκότο με ταυτότητα %d στη κλειδοθήκη στο `%s'" + +# +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Σφάλμα διαγραφής ξεπερασμένου αρχείου κλειδαριών `%s': %s" + +# +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Σφάλμα δημιουργίας αρχείου κλειδαριών `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Σφάλμα στο κλείσιμο (αποσυνδεμένου) αρχείου κλειδαριών `%s': %s" + +# +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Σφάλμα αποσύνδεσης αρχείου κλειδαριών `%s': %s" + +# +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Σφάλμα στο άνοιγμα της κλειδοθήκης `%s' για εγγραφή: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Επιπλέον, απελευθερώνοντας το κλείδωμα για `%s' απέτυχε επίσης: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Η σύνδεση είναι κλειστή" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Έφτασε ο χρόνος λήξης" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Βρέθηκαν ανυποστήρικτες σημαίες κατά την κατασκευή μίας client-side σύνδεσης" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Καμία τέτοια διεπαφή `org.freedesktop.DBus.Properties' στο αντικείμενο στη " +"διαδρομή %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Σφάλμα ρύθμισης της ιδιότητας`%s': Αναμενόμενος τύπος `%s' αλλά βρήκε `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Δεν υπάρχει η ιδιότητα `%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Η ιδιότητα `%s' δεν είναι αναγνώσιμη" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Η ιδιότητα `%s' δεν είναι εγγράψιμη" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Δεν υπάρχει η διεπαφή`%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Δεν υπάρχει τέτοια διεπαφή" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Δεν υπάρχει η διεπαφή `%s' στο αντικείμενο στην διαδρομή %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Δεν υπάρχει η μέθοδος `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Ο τύπος μηνύματος, `%s', δεν ταιριάζει με τον αναμενόμενο τύπο `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Ένα αντικείμενο έχει εξαχθεί ήδη για τη διεπαφή %s στο %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Η μέθοδος `%s' επέστρεψε τον τύπο `%s', αλλά αναμενόταν `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Η μέθοδος `%s' στη διεπαφή `%s' με υπογραφή `%s' δεν υπάρχει" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ένα υποδένδρο εξάγεται ήδη για %s" + +#: ../gio/gdbusmessage.c:1270 +msgid "type is INVALID" +msgstr "ο τύπος είναι ΑΚΥΡΟΣ" + +#: ../gio/gdbusmessage.c:1281 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Μήνυμα METHOD_CALL: το πεδίο κεφαλίδας PATH ή MEMBER λείπει" + +#: ../gio/gdbusmessage.c:1292 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Μήνυμα METHOD_RETURN: το πεδίο κεφαλίδας REPLY_SERIAL λείπει" + +#: ../gio/gdbusmessage.c:1304 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Μήνυμα σφάλματος: το πεδίο κεφαλίδας REPLY_SERIAL ή ERROR_NAME λείπει" + +#: ../gio/gdbusmessage.c:1317 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Μήνυμα σήματος: το πεδίο κεφαλίδας PATH, INTERFACE ή MEMBER λείπει" + +#: ../gio/gdbusmessage.c:1325 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Μήνυμα ΣΗΜΑΤΟΣ: Το πεδίο κεφαλίδας PATH χρησιμοποιεί τη δεσμευμένη τιμή /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1333 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Μήνυμα σήματος: Το πεδίο κεφαλίδας INTERFACE χρησιμοποιεί τη δεσμευμένη τιμή " +"org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1382 +#, c-format +#| msgid "Wanted to read %lu byte but got EOF" +#| msgid_plural "Wanted to read %lu bytes but got EOF" +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Απαίτηση για ανάγνωση %lu ψηφιολέξεων αλλά ελήφθησαν μόνο %lu" +msgstr[1] "Απαίτηση για ανάγνωση %lu ψηφιολέξης αλλά ελήφθη μόνο %lu" + +#: ../gio/gdbusmessage.c:1397 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"Αναμενόμενo byte NUL μετά από το αλφαριθμητικό `%s' αλλά βρέθηκε byte %d" + +#: ../gio/gdbusmessage.c:1416 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Αναμενόταν έγκυρο αλφαριθμητικό UTF-8 αλλά βρέθηκαν άκυρα bytes στη " +"μετατόπιση byte %d (μήκος του αλφαριθμητικού %d). Το έγκυρο UTF-8 " +"αλφαριθμητικό μέχρι εκείνο το σημείο ήταν `%s'" + +#: ../gio/gdbusmessage.c:1618 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Η αναλυμένη τιμή `%s' δεν είναι αποδεκτή διαδρομή αντικειμένου D-Bus" + +#: ../gio/gdbusmessage.c:1642 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Η αναλυμένη τιμή `%s' δεν είναι έγκυρη υπογραφή D-Bus" + +#: ../gio/gdbusmessage.c:1697 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Βρέθηκε πίνακας μήκους %u byte. Μέγιστο μήκος είναι 2<<26 bytes (64 MiB)." +msgstr[1] "" +"Βρέθηκε πίνακας μήκους %u bytes. Μέγιστο μήκος είναι 2<<26 bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1850 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Η αναλυμένη τιμή `%s' για την παραλλαγή δεν είναι αποδεκτή υπογραφή D-Bus" + +#: ../gio/gdbusmessage.c:1874 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Σφάλμα αποσειριοποίησης GVariant με τον τύπο αλφαριθμητικού `%s' από τη " +"μορφή καλωδίου D-Bus" + +#: ../gio/gdbusmessage.c:2061 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Άκυρη τιμή διάταξης ψηφιολέξεων. Αναμενόμενη 0x6c ('l') ή 0x42 ('B') αλλά " +"βρέθηκε η τιμή 0x%02x" + +#: ../gio/gdbusmessage.c:2074 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Άκυρη κύρια έκδοση πρωτοκόλλου. Αναμενόμενη 1 αλλά βρέθηκε %d" + +#: ../gio/gdbusmessage.c:2130 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Η κεφαλίδα υπογραφών με υπογραφή `%s' βρέθηκε αλλά το σώμα του μηνύματος " +"είναι κενό" + +#: ../gio/gdbusmessage.c:2144 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Η αναλυμένη τιμή `%s' δεν είναι αποδεκτή υπογραφή D-Bus (για το σώμα)" + +#: ../gio/gdbusmessage.c:2174 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Δεν υπάρχει κεφαλίδα υπογραφών στο μήνυμα αλλά το σώμα του μηνυμάτων είναι " +"%u byte" +msgstr[1] "" +"Δεν υπάρχει κεφαλίδα υπογραφών στο μήνυμα αλλά το σώμα του μηνυμάτων είναι " +"%u bytes" + +#: ../gio/gdbusmessage.c:2184 +msgid "Cannot deserialize message: " +msgstr "Αδυναμία αποσειριοποίησης μηνύματος: " + +#: ../gio/gdbusmessage.c:2505 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Σφάλμα στην σειριακή διάταξη GVariant με τύπο αλφαριθμητικού `%s' στην μορφή " +"δικτυώματος D-Bus" + +#: ../gio/gdbusmessage.c:2642 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Το μήνυμα έχει %d περιγραφείς αρχείου αλλά η κεφαλίδα δείχνει %d περιγραφείς " +"αρχείου" + +#: ../gio/gdbusmessage.c:2650 +msgid "Cannot serialize message: " +msgstr "Αδυναμία σειριακής διάταξης μηνύματος: " + +#: ../gio/gdbusmessage.c:2694 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Το σώμα του μηνύματος έχει υπογραφή `%s' αλλά δεν υπάρχει κεφαλίδα υπογραφής" + +#: ../gio/gdbusmessage.c:2704 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Το σώμα του μηνύματος έχει την υπογραφή τύπου `%s' αλλά η υπογραφή στο πεδίο " +"κεφαλίδας είναι `%s'" + +#: ../gio/gdbusmessage.c:2720 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Το σώμα του μηνύματος είναι κενό αλλά η υπογραφή στο πεδίο κεφαλίδας είναι `" +"(%s)'" + +#: ../gio/gdbusmessage.c:3270 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Σφάλμα επιστροφής με σώμα τύπου`%s'" + +#: ../gio/gdbusmessage.c:3278 +msgid "Error return with empty body" +msgstr "Επιστροφή σφάλματος με κενό σώμα" + +# gconf/gconf-internals.c:2416 +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Αδύνατη η λήψη κατατομής υλικού: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Αδυναμία φόρτωσης /var/lib/dbus/machine-id ή /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Σφάλμα στην κλήση StartServiceByName για το %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Απροσδόκητη απάντηση %d από την μέθοδο StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Αδυναμία επίκλησης της μεθόδου· ο διαμεσολαβητής είναι για ένα γνωστό όνομα " +"χωρίς ιδιοκτήτη και ο διαμεσολαβητής δημιουργήθηκε με την σημαία " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Δεν υποστηρίζονται αφηρημένα ονόματα χώρου" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"Αδυναμία διευκρίνισης του τρέχοντος αρχείου κατά τη δημιουργία εξυπηρετητή" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Σφάλμα εγγραφής στο παρόν αρχείο στο `%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Το αλφαριθμητικό `%s' δεν είναι αποδεκτό D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Αδυναμία ακρόασης στην ανυποστήρικτη μεταφορά `%s'" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "ΕΝΤΟΛΗ" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Εντολές:\n" +" help Παρουσιάζει αυτές τις πληροφορίες\n" +" introspect Ενδοσκόπηση ενός μακρινού αντικειμένου\n" +" monitor Παρακολούθηση ενός μακρινού αντικειμένου\n" +" call Καλέστε μια μέθοδο επάνω ένα μακρινό αντικείμενο\n" +" emit Εκπομπή σήματος\n" +"\n" +"Χρησιμοποιείστε \"%s COMMAND --help\" για λήψη βοήθειας για κάθε εντολή.\n" + +# +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Σφάλμα: %s\n" + +# gconf/gconftool.c:1181 +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Ενδοσκόπηση της ανάλυσης λάθους XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Σύνδεση με το δίαυλο συστήματος" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Σύνδεση με το δίαυλο συνόδου" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Σύνδεση με δεδομένη διεύθυνση D-Bus" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Επιλογές σημείου τέλους σύνδεσης:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Οι επιλογές που διευκρινίζουν το σημείο τέλους σύνδεσης" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Δεν διευκρινίζεται σημείο τέλους σύνδεσης" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Διευκρινίστηκαν πολλαπλά σημεία τέλους σύνδεσης" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Προειδοποίηση: Σύμφωνα με τα στοιχεία ενδοσκόπησης, η διεπαφή `%s' δεν " +"υπάρχει\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Προειδοποίηση: Σύμφωνα με τα στοιχεία ενδοσκόπησης, η μέθοδος `%s' δεν " +"υπάρχει στη διεπαφή `%s'\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Προαιρετικός προορισμός για σήμα (μοναδικό όνομα)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Η διαδρομή αντικειμένου για εκπομπή σήματος" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Σήμα και όνομα διεπαφής" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Εκπομπή σήματος." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Σφάλμα σύνδεσης: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Σφάλμα: αδιευκρίνιστη διαδρομή αντικειμένου.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Σφάλμα: το %s δεν είναι έγκυρη διαδρομή αντικειμένου\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Σφάλμα: αδιευκρίνιστο σήμα.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Σφάλμα: το σήμα πρέπει να είναι το πλήρως εξειδικευμένο όνομα.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Σφάλμα: Το %s δεν είναι έγκυρο όνομα διεπαφής\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Σφάλμα: το %s δεν είναι έγκυρο όνομα μέλους\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Σφάλμα: το %s δεν είναι έγκυρο μοναδικό όνομα διαύλου.\n" + +# gconf/gconftool.c:1181 +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Σφάλμα ανάλυσης παραμέτρου %d: %s\n" + +# gconf/gconftool.c:1181 +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Σφάλμα εκκένωσης σύνδεσης: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Το όνομα προορισμού για την κλήση της μεθόδου" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Η διαδρομή αντικειμένου για κλήση της μεθόδου" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Μέθοδος και όνομα διεπαφής" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Ο χρόνος λήξης σε δευτερόλεπτα" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Κλήση μεθόδου σε απομακρυσμένο αντικείμενο." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Σφάλμα: αδιευκρίνιστος προορισμός\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Σφάλμα: αδιευκρίνιστη διαδρομή αντικειμένου\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Σφάλμα: αδιευκρίνιστο όνομα μεθόδου\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Σφάλμα: Το όνομα μεθόδου `%s' είναι άκυρο\n" + +# +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Σφάλμα στην ανάλυσης παραμέτρου %d του τύπου `%s': %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Όνομα προορισμού για ενδοσκόπηση" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Διαδρομή αντικειμένου για ενδοσκόπηση" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Εκτύπωση XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Ενδοσκόπηση θυγατρικής" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Μόνο ιδιότητες εκτύπωσης" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Ενδοσκόπηση απομακρυσμένου αντικειμένου." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Όνομα προορισμού για έλεγχο" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Η διαδρομή αντικειμένου για έλεγχο" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Έλεγχος απομακρυσμένου αντικειμένου." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Ανώνυμο" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Το αρχείο επιφάνειας εργασίας δεν όρισε πεδίο Exec" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Αδυναμία εύρεσης του απαιτούμενου τερματικού για την εφαρμογή" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Αδυναμία δημιουργίας φακέλου ρυθμίσεων εφαρμογής %s: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Αδυναμία δημιουργίας φακέλου ρυθμίσεων MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "Οι πληροφορίες εφαρμογής στερούνται ταυτοποιητή" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Αδυναμία δημιουργίας αρχείου επιφάνειας εργασίας %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Προσαρμοσμένος ορισμός του %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "η μονάδα δίσκου δεν υποστηρίζει εξαγωγή ή eject_with_operation" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "ο οδηγός δεν υποστηρίζει αναζήτηση πολυμέσων" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "ο οδηγός δεν υποστηρίζει έναρξη" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "ο οδηγός δεν υποστηρίζει τερματισμό" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Η υποστήριξη TLS δεν είναι διαθέσιμη" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Αδυναμία χειρισμού της έκδοσης %d της κωδικοποίησης GEmblem" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Κακοδιατυπωμένος αριθμός κουπονιών (%d) στην κωδικοποίηση GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Αδύνατος ο χειρισμός της έκδοσης %d της κωδικοποίησης GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" +"Κακοδιατυπωμένος αριθμός κουπονιών (%d) στην κωδικοποίηση GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Αναμενόταν GEmblem για το GEmblemedIcon" + +#: ../gio/gfile.c:902 ../gio/gfile.c:1141 ../gio/gfile.c:1280 +#: ../gio/gfile.c:1520 ../gio/gfile.c:1575 ../gio/gfile.c:1633 +#: ../gio/gfile.c:1717 ../gio/gfile.c:1774 ../gio/gfile.c:1838 +#: ../gio/gfile.c:1893 ../gio/gfile.c:3362 ../gio/gfile.c:3417 +#: ../gio/gfile.c:3563 ../gio/gfile.c:3605 ../gio/gfile.c:4007 +#: ../gio/gfile.c:4419 ../gio/gfile.c:4504 ../gio/gfile.c:4594 +#: ../gio/gfile.c:4691 ../gio/gfile.c:4778 ../gio/gfile.c:4879 +#: ../gio/gfile.c:5152 ../gio/gfile.c:5430 ../gio/gfile.c:5484 +#: ../gio/gfile.c:7028 ../gio/gfile.c:7118 ../gio/gfile.c:7202 +#: ../gio/win32/gwinhttpfile.c:439 +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:1404 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Δεν υπάρχει η περιέχουσα προσάρτηση" + +#: ../gio/gfile.c:2459 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Αδύνατη η αντιγραφή σε κατάλογο" + +#: ../gio/gfile.c:2519 +msgid "Can't copy directory over directory" +msgstr "Αδύνατη η αντιγραφή καταλόγου σε κατάλογο" + +#: ../gio/gfile.c:2527 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Το αρχείο προορισμού υπάρχει" + +#: ../gio/gfile.c:2546 +msgid "Can't recursively copy directory" +msgstr "Αδύνατη η αναδρομική αντιγραφή καταλόγου" + +#: ../gio/gfile.c:2810 +msgid "Splice not supported" +msgstr "Η αρμολόγηση δεν υποστηρίζεται" + +#: ../gio/gfile.c:2814 +#, c-format +msgid "Error splicing file: %s" +msgstr "Σφάλμα αρμολόγησης αρχείου: %s" + +#: ../gio/gfile.c:2960 +msgid "Can't copy special file" +msgstr "Αδύνατη η αντιγραφή του ειδικού αρχείου" + +#: ../gio/gfile.c:3553 +msgid "Invalid symlink value given" +msgstr "Άκυρη τιμή συμβολικού συνδέσμου" + +#: ../gio/gfile.c:3713 +msgid "Trash not supported" +msgstr "Δεν υποστηρίζονται απορρίμματα" + +#: ../gio/gfile.c:3764 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Τα ονόματα των αρχείων δεν μπορούν να περιέχουν '%c'" + +#: ../gio/gfile.c:6152 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "ο τόμος δεν υποστηρίζει προσάρτηση" + +#: ../gio/gfile.c:6261 +msgid "No application is registered as handling this file" +msgstr "Δεν έχουν οριστεί εφαρμογές για το χειρισμό αυτού του αρχείου" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Ο μετρητής είναι κλειστός" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Εκκρεμεί μία ενέργεια του μετρητή αρχείων" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Η ροή δεν υποστηρίζει το query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Ανυποστήρικτη η αναζήτηση στη ροή" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Δεν επιτρέπεται η περικοπή για τη ροή εισόδου" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Δεν υποστηρίζεται η περικοπή ροής" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Λανθασμένος αριθμός κουπονιού (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Χωρίς τύπο ονόματος κλάσης %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Ο τύπος %s δεν υποστηρίζει τη διεπαφή GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Ο τύπος %s δεν είναι καταχωρημένος" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Κακοδιατυπωμένος αριθμός έκδοσης: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Ο τύπος %s δεν υποστηρίζει from_tokens() στη διεπαφή GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "" +"Αδύνατος ο χειρισμός της παρεχόμενης έκδοσης της κωδικοποίησης του εικονιδίου" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Χωρίς συγκεκριμένη διεύθυνση" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Το μήκος %u είναι υπερβολικά μεγάλο για διεύθυνση" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Η διεύθυνση έχει σύνολα δυαδικών πέρα από το μήκος προθέματος" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Αδυναμία ανάλυσης του '%s' ως μάσκα διεύθυνσης IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Ανεπαρκής χώρος για την διεύθυνση υποδοχέα" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Ανυποστήρικτη διεύθυνση υποδοχέα" + +#: ../gio/ginputstream.c:193 +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:1030 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Εκκρεμεί μία ενέργεια για τη ροή" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Το στοιχείο <%s> δεν επιτρέπεται μέσα στο <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Το στοιχείο <%s> δεν επιτρέπεται στο κορυφαίο επίπεδο" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Το αρχείο %s φαίνεται πολλές φορές στην πηγή" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Αποτυχία εντοπισμού '%s' σε οποιοδήποτε κατάλογο πηγής" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Αποτυχία εντοπισμού '%s' στον τρέχοντα κατάλογο" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Άγνωστη επιλογή διαδικασίας \"%s\"" + +# gconf/gconf-internals.c:2416 +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Αποτυχία δημιουργίας προσωρινού αρχείου: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Σφάλμα επεξεργασίας αρχείου εισόδου με xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Σφάλμα επεξεργασίας αρχείου εισόδου με to-pixdata:\n" +"%s" + +# +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Σφάλμα ανάγνωσης αρχείου %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Σφάλμα αρχείου συμπίεσης %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "το κείμενο μπορεί να μην εμφανιστεί μέσα στο <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "όνομα του αρχείου εξόδου" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "ΑΡΧΕΙΟ" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Οι κατάλογοι από όπου πρόκειται να διαβαστούν αρχεία (προεπιλογή ο τρέχον " +"κατάλογος)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "ΚΑΤΑΛΟΓΟΣ" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Δημιουργία εξόδου στην επιλεγμένη μορφή από την επέκταση ονόματος αρχείου " +"προορισμού" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Δημιουργία κεφαλίδας πηγής" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Δημιουργία πηγαίου κώδικα για σύνδεση στο πηγαίο αρχείο στον κωδικά σας" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Δημιουργία λίστας εξαρτήσεων" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Να μην δημιουργείται αυτόματα και καταχωρείται ο πόρος" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Μην εξάγετε συναρτήσεις· δηλώστε τες στο G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "" +"Το χρησιμοποιούμενο όνομα ταυτοποιητή C για το δημιουργούμενο πηγαίο κώδικα" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Μεταγλώττιση προδιαγραφής πόρου σε αρχείο πόρου.\n" +"Τα αρχεία προδιαγραφής πόρου έχουν την επέκταση .gresource.xml,\n" +"και το αρχείο πόρου έχει την επέκταση που αποκαλείται .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Πρέπει να δώσετε ακριβώς ένα όνομα αρχείου\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "κενά ονόματα δεν επιτρέπονται" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "άκυρο όνομα '%s': τα ονόματα πρέπει να αρχίσουν με πεζό γράμμα" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"άκυρο όνομα '%s': άκυρος χαρακτήρας '%c'· μόνο πεζά γράμματα, αριθμοί και " +"παύλες ('-') επιτρέπονται." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "άκυρο όνομα '%s': δύο διαδοχικές παύλες ('--') δεν επιτρέπονται." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"άκυρο όνομα '%s': ο τελευταίος χαρακτήρας μπορεί να μην είναι παύλα ('-')." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "άκυρο όνομα '%s': το μέγιστο μήκος είναι 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " έχει ήδη οριστεί" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "αδυναμία προσθήκης κλειδιών σε σχήμα 'list-of'" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " έχει ήδη οριστεί" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" σκιές στο · χρησιμοποιεί " +" για τροποποίηση της τιμής" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"ακριβώς ένα από 'type', 'enum' ή 'flags' πρέπει να διευκρινιστείτε ως " +"ιδιότητα στο " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> αδιευκρίνιστη (ακόμα)." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Άκυρος τύπος αλφαριθμητικού GVariant '%s'" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " δόθηκε αλλά το σχήμα δεν επεκτείνει τίποτα" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "δεν υπάρχει για αντικατάσταση" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " έχει ήδη οριστεί" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " έχει ήδη οριστεί" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " επεκτείνει ένα μη υπάρχον ακόμα σχήμα '%s'" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " είναι λίστα ενός μη υπάρχοντος ακόμα σχήματος '%s'" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Αδυναμία ύπαρξης λίστας σχήματος με διαδρομή" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Αδυναμία επέκτασης σχήματος με διαδρομή" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +"Το είναι λίστα, που επεκτείνει το που δεν " +"είναι λίστα" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" επεκτείνει το " +"αλλά το '%s' δεν επεκτείνει το '%s'" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"μία διαδρομή, εάν έχει δοθεί, πρέπει να αρχίζει και να τελειώνει με κάθετο" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "η διαδρομή μίας λίστας πρέπει να τελειώσει με ':/'" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> είναι ήδη ορισμένο" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Το στοιχείο <%s> δεν επιτρέπεται στο κορυφαίο επίπεδο" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "ορίστηκε το --strict· γίνεται έξοδος.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Έχει παραβλεφθεί όλο αυτό το αρχείο.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Παράβλεψη αυτού του αρχείου.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Δεν υπάρχει τέτοιο κλειδί `%s' στο σχήμα `%s' όπως ορίζεται στο αρχείο " +"αντικατάστασης `%s'" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "· παράβλεψη αντικατάστασης για αυτό το κλειδί.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " και ορίστηκε το --strict· έξοδος.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +#| msgid "" +#| "error parsing key `%s' in schema `%s' as specified in override file `%s': " +#| "%s. " +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"σφάλμα ανάλυσης κλειδιού `%s' στο σχήμα `%s' όπως ορίστηκε στο αρχείο " +"αντικατάστασης `%s': %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Παράβλεψη αντικατάστασης για αυτό το κλειδί.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"η αντικατάσταση για το κλειδί `%s' στο σχήμα `%s' στο αρχείο αντικατάστασης `" +"%s' είναι εκτός της εμβέλειας που έχει δοθεί στο σχήμα" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"η αντικατάσταση για το κλειδί`%s' στο σχήμα `%s' στο αρχείο αντικατάστασης `" +"%s' δεν είναι στον κατάλογο έγκυρων επιλογών" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "πού να αποθηκευτεί το αρχείο gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Εγκατάλειψη σε κάθε σφάλμα σε σχήματα" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Μην γράφετε το αρχείο gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Μην επιβάλετε περιορισμούς στο όνομα κλειδιού" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Μεταγλώττιση όλων των αρχείων σχημάτων GSettings σε κρυφή μνήμη σχημάτων.\n" +"Τα αρχεία σχημάτων απαιτείται να έχουν την επέκταση.gschema.xml\n" +"και το αρχείο κρυφής μνήμης καλείται gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Πρέπει να δώσετε ακριβώς ένα όνομα καταλόγου\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Κανένα αρχείο σχημάτων δεν βρέθηκε: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "αδρανές.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "αφαίρεση υπάρχοντος αρχείου εξόδου.\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Δε βρέθηκε ο τύπος παρακολούθησης του προεπιλεγμένου τοπικού καταλόγου" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Άκυρο όνομα αρχείου: %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Σφάλμα λήψης πληροφοριών συστήματος αρχείων: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Αδύνατη η μετονομασία του καταλόγου root" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Σφάλμα μετονομασίας αρχείου: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Αδύνατη η μετονομασία του αρχείου, το όνομα αρχείου υπάρχει ήδη" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Άκυρο όνομα αρχείου" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Αδυναμία ανοίγματος καταλόγου" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Σφάλμα ανοίγματος αρχείου: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Σφάλμα αφαίρεσης αρχείου: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Σφάλμα μεταφοράς αρχείου στα απορρίμματα: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Αποτυχία δημιουργίας καταλόγου απορριμμάτων %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Αδυναμία εύρεσης καταλόγου ανωτάτου επιπέδου για τα απορρίμματα" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Αδύνατη η εύρεση ή δημιουργία του καταλόγου απορριμμάτων" + +# gconf/gconf-internals.c:2416 +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Αποτυχία δημιουργίας αρχείου πληροφοριών απορριμμάτων: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Αδύνατη η μεταφορά του αρχείου στα απορρίμματα: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "εσωτερικό σφάλμα" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Σφάλμα δημιουργίας καταλόγου: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Το σύστημα αρχείων δεν υποστηρίζει συμβολικούς συνδέσμους" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Σφάλμα δημιουργίας συμβολικού συνδέσμου: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Σφάλμα μετακίνησης αρχείου: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Αδυναμία μετακίνησης καταλόγου σε άλλον" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Αποτυχία δημιουργίας αντιγράφου ασφαλείας" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Σφάλμα αφαίρεσης του αρχείου προορισμού: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Δεν υποστηρίζεται η μετακίνηση μεταξύ προσαρτήσεων" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Η τιμή του γνωρίσματος πρέπει να είναι μη μηδενική" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Άκυρος τύπος γνωρίσματος (αναμενόταν αλφαριθμητικό)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Άκυρο εκτεταμένο όνομα γνωρίσματος" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Σφάλμα ορισμού εκτεταμένου γνωρίσματος '%s': %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (άκυρη κωδικοποίηση)" + +# +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Σφάλμα λήψης πληροφοριών αρχείου '%s': %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Σφάλμα λήψης πληροφοριών για περιγραφέα αρχείου: %s" + +#: ../gio/glocalfileinfo.c:2026 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Άκυρος τύπος γνωρίσματος (αναμένεται uint32)" + +#: ../gio/glocalfileinfo.c:2044 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Άκυρος τύπος γνωρίσματος (αναμένεται uint64)" + +#: ../gio/glocalfileinfo.c:2063 ../gio/glocalfileinfo.c:2082 +msgid "Invalid attribute type (byte string expected)" +msgstr "Άκυρος τύπος γνωρίσματος (αναμένεται συμβολοσειρά byte)" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileinfo.c:2117 +msgid "Cannot set permissions on symlinks" +msgstr "Αδυναμία ορισμού δικαιωμάτων σε συμβολικούς συνδέσμους" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileinfo.c:2133 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Σφάλμα ρύθμισης δικαιωμάτων: %s" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileinfo.c:2184 +#, c-format +msgid "Error setting owner: %s" +msgstr "Σφάλμα ρύθμισης ιδιοκτήτη: %s" + +#: ../gio/glocalfileinfo.c:2207 +msgid "symlink must be non-NULL" +msgstr "ο συμβολικός σύνδεσμος πρέπει να είναι μη μηδενικός" + +#: ../gio/glocalfileinfo.c:2217 ../gio/glocalfileinfo.c:2236 +#: ../gio/glocalfileinfo.c:2247 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Σφάλμα ορισμού συμβολικού συνδέσμου: %s" + +#: ../gio/glocalfileinfo.c:2226 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Σφάλμα ορισμού συμβολικού συνδέσμου: το αρχείο δεν είναι συμβολικός σύνδεσμος" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileinfo.c:2352 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Σφάλμα ρύθμισης τροποποίησης ή χρόνου πρόσβασης: %s" + +#: ../gio/glocalfileinfo.c:2375 +msgid "SELinux context must be non-NULL" +msgstr "Το περιεχόμενο SELinux πρέπει να είναι μη μηδενικό" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileinfo.c:2390 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Σφάλμα ρύθμισης του περιεχομένου SELinux: %s" + +#: ../gio/glocalfileinfo.c:2397 +msgid "SELinux is not enabled on this system" +msgstr "Το SELinux δεν έχει ενεργοποιηθεί στο σύστημά σας" + +#: ../gio/glocalfileinfo.c:2489 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Δεν υποστηρίζεται ο ορισμός του γνωρίσματος %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Σφάλμα ανάγνωσης από το αρχείο: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Σφάλμα αναζήτησης στο αρχείο: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Σφάλμα κλεισίματος αρχείου: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Δε βρέθηκε ο τύπος παρακολούθησης του προεπιλεγμένου τοπικού αρχείου" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Σφάλμα εγγραφής στο αρχείο: %s" + +# gconf/gconftool.c:1181 +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Σφάλμα αφαίρεσης παλαιού συνδέσμου αντιγράφου: %s" + +# +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Σφάλμα δημιουργίας αντιγράφου ασφαλείας: %s" + +# +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Σφάλμα μετονομασίας προσωρινού αρχείου: %s" + +# +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Σφάλμα περικοπής αρχείου: %s" + +# +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Σφάλμα ανοίγματος αρχείου '%s': %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Το αρχείο προορισμού είναι κατάλογος" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Το αρχείο προορισμού δεν είναι κανονικό αρχείο" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Το αρχείο τροποποιήθηκε εξωτερικά" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Σφάλμα αφαίρεσης παλαιού αρχείου: %s" + +#: ../gio/gmemoryinputstream.c:471 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Δόθηκε άκυρο GSeekType" + +#: ../gio/gmemoryinputstream.c:481 +msgid "Invalid seek request" +msgstr "Άκυρη αίτηση αναζήτησης" + +#: ../gio/gmemoryinputstream.c:505 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Αδυναμία περικοπής του GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Η ροή εξόδου μνήμης δεν είναι κλιμακώσιμη" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Αποτυχία κλιμάκωσης της ροής εξόδου μνήμης" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Το ποσό μνήμης που απαιτείται για την επεξεργασία της εγγραφής είναι " +"μεγαλύτερο από το διαθέσιμο χώρο διευθύνσεων" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Αίτηση αναζήτησης πριν την έναρξη της ροής" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "η προσάρτηση δεν υποστηρίζει \"αποπροσάρτηση\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "η προσάρτηση δεν υποστηρίζει την πρόβλεψη σύγχρονου τύπου περιεχομένου" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Το όνομα κεντρικού υπολογιστή '%s' περιέχει το '[' αλλά όχι το ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Απροσπέλαστο δίκτυο" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Απροσπέλαστος οικοδεσπότης" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Αδυναμία δημιουργίας παρακολούθησης δικτύου: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Αδυναμία δημιουργίας παρακολούθησης δικτύου: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Αδυναμία λήψης κατάστασης δικτύου: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Η ροή εξόδου δεν υποστηρίζει την εγγραφή" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Η ροή πηγής έχει ήδη κλείσει" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Η πηγή στο '%s' δεν υπάρχει" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Αποτυχία αποσυμπίεσης πηγής στο '%s'" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Η πηγή στο '%s' δεν είναι κατάλογος" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Η ροή εισόδου δεν υποστηρίζει αναζήτηση" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Εμφάνιση βοήθειας" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[ΕΝΤΟΛΗ]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Οι ενότητες λίστας περιέχουν πηγές σε ΑΡΧΕΙΟ elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Πηγές λίστας\n" +"Εάν δίνεται ΕΝΟΤΗΤΑ, μόνο πηγές λίστας σε αυτήν την ενότητα\n" +"Εάν δίνεται ΔΙΑΔΡΟΜΗ, μόνο λίστα που ταιριάζει στις πηγές" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "ΑΡΧΕΙΟ [ΔΙΑΔΡΟΜΗ]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "ΕΝΟΤΗΤΑ" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Πηγές λίστας με λεπτομέρειες\n" +"Εάν δίνεται ΕΝΟΤΗΤΑ, μόνο πηγές λίστας σε αυτήν την ενότητα\n" +"Εάν δίνεται ΔΙΑΔΡΟΜΗ, μόνο λίστα που ταιριάζει στις πηγές\n" +"Οι λεπτομέρειες περιλαμβάνουν την ενότητα, μέγεθος και συμπίεση" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Εξαγωγή αρχείου πηγής σε τυπική έξοδο" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "ΔΙΑΔΡΟΜΗ ΑΡΧΕΙΟΥ" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Άγνωστη εντολή %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Χρήση:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Εντολές:\n" +" help Προβολή αυτών των πληροφοριών\n" +" sections Ενότητες πηγής λίστας\n" +" list Πηγές λίστας\n" +" details Πηγές λίστας με λεπτομέρειες\n" +" extract Εξαγωγή πηγής\n" +"\n" +"Χρήση 'gresource help COMMAND' για λήψη αναλυτικής βοήθειας.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Χρήση:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Ορίσματα:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION Ένα (προαιρετικό) όνομα ενότητας elf\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND Η (προαιρετική) εντολή για επεξήγηση\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE Ένα αρχείο elf (δυαδικό ή κοινόχρηστης βιβλιοθήκης)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE Αρχείο elf (δυαδικό ή κοινόχρηστης βιβλιοθήκης)\n" +" ή μεταγλωττισμένο πηγαίο αρχείο\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[ΔΙΑΔΡΟΜΗ]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH (Προαιρετική) διαδρομή πηγής (μπορεί να είναι μερικό)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "ΔΙΑΔΡΟΜΗ" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PATH Διαδρομή πηγής\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Χωρίς τέτοιο σχήμα '%s'\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"Το σχήμα '%s' δεν μπορεί να μετακινηθεί (δεν πρέπει να ορισθεί διαδρομή)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Το σχήμα '%s' μπορεί να μετακινηθεί (πρέπει να ορισθεί διαδρομή)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Δόθηκε κενή διαδρομή.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Η διαδρομή πρέπει να αρχίζει με μια κάθετο (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Η διαδρομή πρέπει να τελειώνει με μια κάθετο (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Η διαδρομή δεν πρέπει να περιέχει δύο συνεχόμενες καθέτους (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Χωρίς τέτοιο κλειδί '%s'\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Η παρεχόμενη τιμή είναι εκτός του έγκυρου εύρους\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Απαρίθμηση των εγκατεστήμενων (μη μετακινούμενων) σχημάτων" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Απαρίθμηση των εγκατεστήμενων μετακινούμενων σχημάτων" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Απαριθμεί τα κλειδιά στο SCHEMA" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Απαριθμεί τις θυγατρικές του SCHEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Απαρίθμηση κλειδιών και τιμών, αναδρομικά\n" +"Αν δε δίνεται SCHEMA, προβολή όλων των κλειδιών\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Λήψη τιμής της KEY" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Αναζητεί το εύρος των έγκυρων τιμών για KEY" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Ορίζει την τιμή της KEY σε VALUE" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Επαναφέρει την KEY στην προεπιλεγμένη της τιμή" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Επαναφορά όλων των κλειδιών στο SCHEMA στις προεπιλογές τους" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Έλεγχος εγγραψιμότητας του KEY" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Παρακολουθεί το KEY για αλλαγές.\n" +"Αν δεν έχει ορισθεί KEY, παρακολουθεί όλα τα κλειδιά στο SCHEMA.\n" +"Χρησιμοποιείστε το ^C για τερματισμό της παρακολούθησης.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Χρήση:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Εντολές:\n" +" help Εμφάνιση αυτών των πληροφοριών\n" +" list-schemas Λίστα εγκατεστημένων σχημάτων\n" +" list-relocatable-schemas Λίστα μετακινούμενων σχημάτων\n" +" list-keys Λίστα κλειδιών σε σχήματος\n" +" list-children Λίστα θυγατρικών ενός σχήματος\n" +" list-recursively Λίστα κλειδιών και τιμών, αναδρομικά\n" +" range Αναζήτηση εύρους κλειδιού\n" +" get Λήψη τιμής κλειδιού\n" +" set Ορισμός τιμής ενός κλειδιού\n" +" reset-recursively Επαναφορά όλων των τιμών σε δεδομένο σχήμα\n" +" reset Επαναφορά τιμής κλειδιού\n" +" writable Έλεγχος εγγραψιμότητας κλειδιού\n" +" monitor Παρακολούθηση αλλαγών\n" +"\n" +"Χρησιμοποιήστε 'gsettings help COMMAND' για αναλυτική βοήθεια.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Χρήση:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR Κατάλογος αναζήτησης για πρόσθετα σχήματα\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Το όνομα του σχήματος\n" +" PATH Η διαδρομή, για μετακινούμενα σχήματα\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY Το (προαιρετικό) κλειδί στο σχήμα\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY Το κλειδί στο σχήμα\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALUE Η τιμή που θα ορισθεί\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Δόθηκε κενό όνομα σχήματος\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Άκυρος υποδοχέας, δεν αρχικοποιήθηκε" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Άκυρος υποδοχέας, η αρχικοποίηση απέτυχε λόγω του: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Ο υποδοχέας είναι ήδη κλειστός" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "Η υποδοχή I/O έληξε" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "δημιουργία GSocket από fd: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Αδυναμία δημιουργίας υποδοχέα: %s" + +#: ../gio/gsocket.c:515 +msgid "Unknown family was specified" +msgstr "Ορίστηκε άγνωστη οικογένεια" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "Ορίστηκε άγνωστο πρωτόκολλο" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "αδυναμία λήψης τοπικής διεύθυνσης: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "αδυναμία λήψης απομακρυσμένης διεύθυνσης: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "αδυναμία ακρόασης: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "Σφάλμα σύνδεσης στην διεύθυνση: %s" + +# gconf/gconftool.c:1181 +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Σφάλμα ένωσης ομάδας πολυεκπομπής: %s" + +# gconf/gconftool.c:1181 +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Σφάλμα απομάκρυνσης ομάδας πολυεκπομπής: %s" + +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "Χωρίς υποστήριξη για πολυεκπομπή ειδικής πηγής" + +# gconf/gconftool.c:1181 +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Σφάλμα αποδοχής σύνδεσης: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "Σύνδεση σε εξέλιξη" + +# gconf/gconf-internals.c:2416 +#: ../gio/gsocket.c:2330 +#| msgid "Unable to get pending error: %s" +msgid "Unable to get pending error: " +msgstr "Αδυναμία λήψης εκκρεμούς σφάλματος: " + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "Σφάλμα λήψης δεδομένων: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "Σφάλμα αποστολής δεδομένων: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Αδυναμία τερματισμού υποδοχής: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "Σφάλμα τερματισμού υποδοχέα: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Αναμονή για την συνθήκη υποδοχέα: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "Σφάλμα αποστολής μηνύματος: %s" + +#: ../gio/gsocket.c:3805 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Το GSocketControlMessage δεν υποστηρίζεται στα Windows" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4274 +#, c-format +msgid "Error receiving message: %s" +msgstr "Σφάλμα λήψης μηνύματος: %s" + +# gconf/gconf-internals.c:2416 +#: ../gio/gsocket.c:4356 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Αδυναμία λήψης εκκρεμούς σφάλματος: %s" + +#: ../gio/gsocket.c:4375 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "Το g_socket_get_credentials δεν έχει υλοποιηθεί για αυτό OS" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Αδυναμία σύνδεσης στον εξυπηρετητή μεσολαβητή %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Αδυναμία σύνδεσης στο %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Αδυναμία σύνδεσης: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Άγνωστο σφάλμα σύνδεσης" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Η προσπάθεια διαμεσολάβησης σε σύνδεση εκτός TCP δεν υποστηρίζεται." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Το πρωτόκολλο διαμεσολαβητή '%s' δεν υποστηρίζεται." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Η ακρόαση έχει ήδη κλείσει" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Ο πρόσθετος υποδοχέας είναι κλειστός" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "Το SOCKSv4 δεν υποστηρίζει τη διεύθυνση IPv6 '%s'" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Το όνομα χρήστη είναι πολύ μεγάλο για το πρωτόκολλο SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "" +"Το όνομα του οικοδεσπότη '%s' είναι πολύ μεγάλο για το πρωτόκολλο SOCKSv4" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Ο εξυπηρετητής δεν είναι διαμεσολαβητής SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Η σύνδεση μέσω εξυπηρετητή SOCKSv4 απορρίφθηκε" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Ο εξυπηρετητής δεν είναι διαμεσολαβητής SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Ο διαμεσολαβητής SOCKSv5 απαιτεί επικύρωση." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Ο διαμεσολαβητής SOCKSv5 απαιτεί μέθοδο επικύρωσης που δεν υποστηρίζεται από " +"GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"Το όνομα χρήστη ή ο κωδικός πρόσβασης είναι πολύ μεγάλα για το πρωτόκολλο " +"SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "Αποτυχία επικύρωσης SOCKSv5 οφειλόμενη σε λάθος όνομα χρήστη ή κωδικό." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Το όνομα οικοδεσπότη '%s' είναι πολύ μεγάλο για το πρωτόκολλο SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" +"Ο εξυπηρετητής διαμεσολαβητή SOCKSv5 χρησιμοποιεί άγνωστο τύπο διεύθυνσης." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Εσωτερικό σφάλμα εξυπηρετητή διαμεσολαβητή SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Η σύνδεση SOCKSv5 δεν επιτρέπεται από το σύνολο των κανόνων." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Απρόσιτος οικοδεσπότης μέσω του εξυπηρετητή SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Απροσπέλαστο δίκτυο μέσω του διαμεσολαβητή SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Η σύνδεση απορρίφθηκε από τον διαμεσολαβητή SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Ο διαμεσολαβητής SOCKSv5 δεν υποστηρίζει την εντολή 'σύνδεση'." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" +"Ο διαμεσολαβητής SOCKSv5 δεν υποστηρίζει τον παρεχόμενο τύπο διεύθυνσης." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Άγνωστο σφάλμα του διαμεσολαβητή SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Αδύνατος ο χειρισμός της έκδοσης %d της κωδικοποίησης GThemedIcon" + +# +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Σφάλμα επίλυσης του '%s': %s" + +# +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Σφάλμα ανάστροφης επίλυσης του '%s': %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Χωρίς εγγραφή DNS του αιτούμενου τύπου για '%s'" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Προσωρινή αδυναμία επίλυσης του '%s'" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Σφάλμα επίλυσης του '%s'" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Αδυναμία αποκρυπτογράφησης ιδιωτικού κλειδιού κωδικοποιημένου κατά PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Δεν βρέθηκε ιδιωτικό κλειδί κωδικοποιημένο κατά PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Αδυναμία ανάλυσης ιδιωτικού κλειδιού κωδικοποιημένου κατά PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Δεν βρέθηκε πιστοποιητικό κωδικοποιημένο κατά PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Αδυναμία ανάλυσης πιστοποιητικού κωδικοποιημένου κατά PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Αυτή είναι η τελευταία ευκαιρία εισαγωγής σωστού κωδικού πριν το κλείδωμα " +"της πρόσβασής σας." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Οι εισαγμένοι κωδικοί είναι λάθος και η πρόσβασή σας θα κλειδωθεί μετά από " +"πρόσθετες αποτυχίες." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Ο εισαγμένος κωδικός είναι λάθος." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Αναμονή 1 μηνύματος έλεγχου, λήψη %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Αναπάντεχος τύπος βοηθητικών δεδομένων" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Αναμονή για ένα fd, αλλά λήψη %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Λήψη άκυρου fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Σφάλμα στην αποστολή πιστοποιητικών: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Σφάλμα ελέγχου ενεργοποίησης SO_PASSCRED υποδοχής: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Σφάλμα ενεργοποίησης SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Αναμονή ανάγνωσης μιας μόνο byte για τη λήψη πιστοποιητικών, αλλά ανάγνωση " +"μηδέν bytes" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Χωρίς αναμονή μηνύματος έλεγχου, αλλά λήψη %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Σφάλμα απενεργοποίησης SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Σφάλμα ανάγνωσης περιγραφέα αρχείου: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Σφάλμα κλεισίματος περιγραφέα αρχείου: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Διαχειριστής συστήματος αρχείων" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Σφάλμα εγγραφής περιγραφέα αρχείου: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"Δεν υποστηρίζονται αφηρημένες διευθύνσεις υποδοχής τομέα unix σε αυτό το " +"σύστημα" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ο τόμος δεν υποστηρίζει την εξαγωγή ή eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Αδυναμία εύρεσης εφαρμογής" + +# gconf/gconftool.c:1181 +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Σφάλμα εκκίνησης εφαρμογής: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIs δεν υποστηρίζονται" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "οι αλλαγές συσχετίσεων δεν υποστηρίζονται στα win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Η δημιουργία συσχέτισης δεν υποστηρίζεται σε win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Σφάλμα ανάγνωσης χειριστηρίου: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Σφάλμα κλεισίματος χειριστηρίου: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Σφάλμα εγγραφής επεξεργασίας: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Ανεπάρκεια μνήμης" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Εσωτερικό σφάλμα: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Χρειάζεται περισσότερες εισαγωγές" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Άκυρα συμπιεσμένα δεδομένα" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Διεύθυνση ακρόασης" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Παράβλεψη συμβατότητας με GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Διεύθυνση εκτύπωσης" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Εκτύπωση διεύθυνσης σε κατάσταση κελύφους" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Εκτέλεση υπηρεσίας dbus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Εσφαλμένα ορίσματα\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Αναπάντεχο γνώρισμα '%s' για το στοιχείο '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Το γνώρισμα '%s' του στοιχείου '%s' δεν βρέθηκε" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Απρόσμενη ετικέτα '%s', αναμενόταν ετικέτα '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Απρόσμενη ετικέτα '%s' στο '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Δεν βρέθηκε έγκυρο αρχείο σελιδοδεικτών στους καταλόγους δεδομένων" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Υπάρχει ήδη ένας σελιδοδείκτης για το URI '%s'" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Δεν βρέθηκε σελιδοδείκτης για το URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Δεν αναγνωρίστηκε κανένας τύπος MIME στο σελιδοδείκτη για το URI '%s'" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"Καμιά προσωπική σημαία δεν έχει αναγνωριστεί στο σελιδοδείκτη για το URI '%s'" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Δεν ορίστηκαν ομάδες στο σελιδοδείκτη για το URI '%s'" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Καμιά εφαρμογή με όνομα '%s' δεν έχει καταχωρήσει σελιδοδείκτη για τη '%s'" + +# gconf/gconf-internals.c:2416 +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Αποτυχία ανάπτυξης της γραμμής exec '%s' με URI '%s'" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Ημιτελής σειρά χαρακτήρα στο τέλος της εισόδου" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Αδυναμία μετατροπής υποχώρησης '%s' σε σύνολο κώδικα '%s'" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Το URI '%s' δεν είναι ένα απόλυτο URI με την χρήση του σχήματος \"αρχείου\"" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Το URI τοπικού αρχείου '%s' μπορεί να μην περιέχει ένα '#'" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Το URI '%s' δεν είναι έγκυρο" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Το όνομα οικοδεσπότη του URI '%s' είναι άκυρο" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Το URI '%s' περιέχει άκυρους χαρακτήρες διαφυγής" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Το όνομα διαδρομής '%s' δεν είναι απόλυτη διαδρομή" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Άκυρο όνομα οικοδεσπότη" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ΠΜ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ΜΜ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %Y %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Ιανουάριος" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Φεβρουάριος" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Μάρτιος" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Απρίλιος" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Μάιος" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Ιούνιος" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Ιούλιος" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Αύγουστος" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Σεπτέμβριος" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Οκτώβριος" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Νοέμβριος" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Δεκέμβριος" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ιαν" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Φεβ" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Μάρ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Απρ" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Μάι" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Ιούν" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Ιούλ" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Αύγ" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Σεπ" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Οκτ" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Νοέ" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Δεκ" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Δευτέρα" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Τρίτη" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Τετάρτη" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Πέμπτη" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Παρασκευή" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Σάββατο" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Κυριακή" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Δευ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Τρί" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Τετ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Πέμ" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Παρ" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Σάβ" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Κυρ" + +# +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Σφάλμα ανοίγματος καταλόγου '%s': %s" + +# +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Αδύνατη η διάθεση %lu ψηφιολέξης για ανάγνωση αρχείου \"%s\"" +msgstr[1] "Αδύνατη η διάθεση %lu ψηφιολέξεων για ανάγνωση αρχείου \"%s\"" + +# +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Σφάλμα ανάγνωσης αρχείου '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Το αρχείο \"%s\" είναι υπερβολικά μεγάλο" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Αποτυχία ανάγνωσης από το αρχείο '%s': %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Αποτυχία ανοίγματος αρχείου '%s': %s" + +# gconf/gconfd.c:1701 +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Αδυναμία ανοίγματος αρχείου '%s': fdopen() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Αδυναμία μετονομασίας αρχείου '%s' σε '%s': g_rename() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Αποτυχία δημιουργίας αρχείου '%s': %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fwrite() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fflush() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Αδυναμία εγγραφής αρχείου '%s': fsync() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Αδυναμία κλεισίματος αρχείου '%s': fclose() απέτυχε: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Αδυναμία απομάκρυνσης του υπάρχοντος αρχείου '%s': g_unlink() απέτυχε: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Άκυρο πρότυπο '%s', δεν πρέπει να περιέχει '%s'" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Το πρότυπο '%s' δεν περιέχει XXXXXX" + +# gconf/gconf-internals.c:2416 +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Αποτυχία ανάγνωσης συμβολικού συνδέσμου '%s': %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Οι συμβολικοί σύνδεσμοι δεν υποστηρίζονται" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Αδυναμία ανοίγματος μετατροπέα από '%s' σε '%s': %s" + +#: ../glib/giochannel.c:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Εναπομείναντα αμετάτρεπτα δεδομένα σε μνήμη ανάγνωσης" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Το κανάλι τερματίζει σε ημιτελή χαρακτήρα" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Αδυναμία ανάγνωσης raw σε g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "Αδυναμία εύρεσης έγκυρου αρχείου κλειδιού στους καταλόγους αναζήτησης" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Δεν είναι κανονικό αρχείο" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Το αρχείο κλειδιού περιέχει την γραμμή '%s' που δεν είναι ζεύγος κλειδιού-" +"τιμής, ομάδας, ή σχολίου" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Άκυρο όνομα ομάδας: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Το αρχείο κλειδιού δεν ξεκινάει με ομάδα" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Άκυρο όνομα κλειδιού: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Το αρχείο κλειδιού περιέχει ανυποστήρικτη κωδικοποίηση '%s'" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Το αρχείο κλειδιού δεν έχει ομάδα '%s'" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Το αρχείο κλειδιού δεν έχει κλειδί '%s'" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Το αρχείο κλειδιού περιέχει κλειδί '%s' με τιμή '%s' που δεν είναι UTF-8" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Το αρχείο κλειδιού περιέχει κλειδί '%s' που περιέχει μια τιμή που δεν μπορεί " +"να ερμηνευθεί." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Το αρχείο κλειδιού περιέχει κλειδί '%s' στην ομάδα '%s' που η τιμή του δεν " +"μπορεί να ερμηνευθεί." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Το κλειδί '%s' στην ομάδα '%s' έχει τιμή '%s' όταν αναμενόταν %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Το αρχείο κλειδιού δεν έχει κλειδί '%s' στην ομάδα '%s'" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "Το αρχείο κλειδιού περιέχει χαρακτήρα διαφυγής στο τέλος της γραμμής" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Το αρχείο κλειδιού περιέχει άκυρη σειρά διαφυγής '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως αριθμός." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Η ακέραιη τιμή '%s' είναι εκτός εύρους" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως αριθμός κινητής υποδιαστολής." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Η τιμή '%s' δεν μπορεί να ερμηνευθεί ως Μπουλ." + +# gconf/gconfd.c:1701 +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Αποτυχία λήψης γνωρισμάτων του αρχείου '%s%s%s%s': fstat() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Αδυναμία χαρτογράφησης %s%s%s%s: mmap() απέτυχε: %s" + +# gconf/gconf-internals.c:2416 +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Αδυναμία ανοίγματος αρχείου '%s': open() απέτυχε: %s" + +# gconf/gconfd.c:1676 +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Σφάλμα στη γραμμή %d χαρακτήρας %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Άκυρο κωδικοποιημένο κείμενο UTF-8 στο όνομα - μη έγκυρο '%s'" + +#: ../glib/gmarkup.c:427 +#, c-format +#| msgid "'%s' is not a valid name " +msgid "'%s' is not a valid name" +msgstr "'%s' δεν είναι έγκυρο όνομα" + +#: ../glib/gmarkup.c:443 +#, c-format +#| msgid "'%s' is not a valid name: '%c' " +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' δεν είναι ένα έγκυρο όνομα: '%c'" + +# +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Σφάλμα στη γραμμή %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"Η αναφορά χαρακτήρα '%-.*s' δεν κωδικοποιεί έναν επιτρεπόμενο χαρακτήρα" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Κενή οντότητα '&;' παρατηρήθηκε· έγκυρες οντότητες είναι: & " < " +"> '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Το όνομα οντότητας '%-.*s' δεν είναι γνωστό" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Το έγγραφο πρέπει να ξεκινά με στοιχείο (π.χ. )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Το '%s' δεν είναι έγκυρος χαρακτήρας όταν ακολουθείται από χαρακτήρα '<'· " +"δεν μπορεί να ξεκινά όνομα στοιχείου" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ο χαρακτήρας '>' στο τέλος της " +"ετικέτας του κενού-στοιχείου '%s'" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Περίεργος χαρακτήρας '%s', αναμενόταν ένα '=' μετά το όνομα γνωρίσματος '%s' " +"του στοιχείου '%s'" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Το '%s' δεν είναι έγκυρος χαρακτήρας ακολουθούμενος από το όνομα στοιχείου " +"κλεισίματος '%s'· ο επιτρεπόμενος χαρακτήρας είναι '>'" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Το στοιχείο '%s' έκλεισε, κανένα στοιχείο δεν είναι ανοικτό" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Το στοιχείο '%s' έκλεισε, αλλά το τρέχον ανοικτό στοιχείο είναι '%s'" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Το έγγραφο ήταν κενό ή περιέχει μόνο λευκό κενό" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα αμέσως μετά από μια ανοικτή γωνιακή " +"παρένθεση '<'" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα με στοιχεία ακόμα ανοικτά - '%s' ήταν το " +"τελευταίο στοιχείο που ανοίχθηκε" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα, αναμενόταν μια γωνιακή παρένθεση " +"κλεισίματος στο τέλος της ετικέτας <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα σε όνομα στοιχείου" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα σε όνομα γνωρίσματος" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα μέσα σε ετικέτα ανοίγματος στοιχείου." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα μετά το σύμβολο ίσον ακολουθούμενο από " +"όνομα γνωρίσματος· δεν υπάρχει τιμή γνωρίσματος" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα σε τιμή γνωρίσματος" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Το έγγραφο τερματίστηκε απρόσμενα σε ετικέτα κλεισίματος για στοιχείο '%s'" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Το έγγραφο τερματίστηκε απρόσμενα σε σχόλιο ή οδηγία επεξεργασίας" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Χρήση:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ΕΠΙΛΟΓΗ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Επιλογές βοήθειας:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Εμφάνιση επιλογών βοήθειας" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Εμφάνιση όλων των επιλογών βοήθειας" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Επιλογές εφαρμογής:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Αδυναμία ανάλυσης ακέραιης τιμής '%s' για %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Ακέραιη τιμή '%s' για %s είναι εκτός περιοχής" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Αδυναμία ανάλυσης διπλής τιμής '%s' για %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Η διπλή τιμή '%s' για %s είναι εκτός περιοχής" + +# gconf/gconftool.c:1181 +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Σφάλμα επιλογής ανάλυσης %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Λείπει όρισμα για %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Άγνωστη επιλογή %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "κατεστραμμένο αντικείμενο" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "εσωτερικό σφάλμα ή κατεστραμμένο αντικείμενο" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ανεπάρκεια μνήμης" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "εξάντληση ορίου οπισθοανίχνευσης" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"το πρότυπο περιέχει στοιχεία που δεν υποστηρίζονται για μερικό ταίριασμα" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "οι οπισθοαναφορές ως συνθήκες, δεν υποστηρίζονται για μερικό ταίριασμα" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "εξάντληση ορίου αναδρομής" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "άκυρος συνδυασμός για σημαίες αλλαγής γραμμής" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "κακή μετατόπιση" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "short utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "κυκλική επανάληψη" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "άγνωστο σφάλμα" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ στο τέλος του υποδείγματος" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c στο τέλος του υποδείγματος" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "ακολουθεί άγνωστος χαρακτήρας \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "οι αριθμοί είναι εκτός σειράς στον προσδιοριστή {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "πολύ μεγάλος αριθμός στον προσδιοριστή {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "λείπει η τελική ] για την κλάση χαρακτήρων" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "άκυρη ακολουθία διαφυγής σε κλάση χαρακτήρων" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "εύρος εκτός σειράς στην κλάση χαρακτήρων" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "τίποτα για επανάληψη" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "απρόσμενη επανάληψη" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "άγνωστος χαρακτήρας μετά τα (? ή (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "Οι κλάσεις με ονόματα κατά POSIX υποστηρίζονται μόνο στις κλάσεις" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "λείπει η τελική )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "αναφορά σε ανύπαρκτο υποπρότυπο" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "λείπει η ) μετά από το σχόλιο" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "η κανονική έκφραση είναι πολύ μεγάλη" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "αποτυχία στη λήψη μνήμης" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") χωρίς άνοιγμα (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "υπερχείλιση κώδικα" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "άγνωστος χαρακτήρας μετά το (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "ο ισχυρισμός ανασκόπησης δεν έχει σταθερό μήκος" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "κακοδιατυπωμένος αριθμός ή ονόματος μετά το (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "η ομάδα υποθετικών περιέχει περισσότερους από δύο κλάδους" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "τα (?R ή (?[+-]ψηφία πρέπει να ακολουθούνται από )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "άγνωστο όνομα κλάσης POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "δεν υποστηρίζονται τα στοιχεία ταξινόμησης POSIX" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "η τιμή του χαρακτήρα στην ακολουθία \\x{...} είναι υπερβολικά μεγάλη" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "άκυρη συνθήκη (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "δεν επιτρέπεται \\C στον ισχυρισμό ανασκόπησης" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "δεν υποστηρίζονται τα escapes \\L, \\l, \\N{name}, \\U, και \\u " + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "η αναδρομική κλήση μπορεί να οδηγήσει σε ατέρμονα βρόγχο" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "άγνωστος χαρακτήρας μετά (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "λείπει το τέλος του ονόματος του υποπρότυπου" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "δύο επώνυμα υποπρότυπα έχουν το ίδιο όνομα" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "κακοδιατυπωμένο \\P ή \\p αλληλουχία" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "άγνωστο όνομα ιδιότητας μετά το \\P ή το \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" +"το όνομα του υποπροτύπου είναι υπερβολικά μεγάλο (μέγιστο 32 χαρακτήρες)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "υπερβολικά μεγάλος αριθμός υποπροτύπων (επιτρέπονται μέχρι 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "η οκταδική τιμή είναι μεγαλύτερη από \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "υπέρβαση μεταγλώττισης χώρου εργασίας" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "δε βρέθηκε το αναφερόμενο υποπρότυπο που είχε ελεγχθεί προηγουμένως" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "η ομάδα DEFINE περιέχει περισσότερους από έναν κλάδους" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "αντιφατικές επιλογές NEWLINE" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"το \\g δεν ακολουθείται από ένα άγκιστρο, γωνιώδεις αγκύλες, όνομα ή αριθμό " +"σε εισαγωγικά, ή από έναν απλό αριθμό" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "δεν πρέπει να είναι μηδέν μια αναφορά χαρακτήρα" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "δεν επιτρέπεται ένα όρισμα για το (*ACCEPT), (*FAIL), ή (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "Δεν αναγνωρίσθηκε το (*VERB)" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "ο αριθμός είναι πολύ μεγάλος" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "λείπει το όνομα του υποπρότυπου μετά το (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "αναμένεται ψηφίο μετά το (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"το ] είναι ένας μη συμβατός χαρακτήρας στη λειτουργία συμβατότητας της " +"JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "δεν επιτρέπονται διαφορετικά ονόματα για υποπρότυπα του ίδιου αριθμού" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "Το (*MARK) πρέπει να έχει ένα όρισμα" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "το \\c πρέπει να ακολουθείτε από έναν χαρακτήρα ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"το \\g δεν ακολουθείται από ένα άγκιστρο, γωνιώδεις αγκύλες, ή όνομα σε " +"εισαγωγικά" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "το \\N δεν υποστηρίζεται σε μια κλάση" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "πάρα πολλές προωθούμενες αναφορές" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "το όνομα είναι πολύ μεγάλο στο (*MARK), (*PRUNE), (*SKIP), ή (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "η τιμή του χαρακτήρα στην ακολουθία \\u.... είναι υπερβολικά μεγάλη" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Σφάλμα αντιστοίχισης της κανονικής έκφρασης %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Η βιβλιοθήκη PCRE έχει μεταγλωττιστεί χωρίς υποστήριξη UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Η βιβλιοθήκη PCRE έχει μεταγλωττιστεί χωρίς υποστήριξη ιδιοτήτων UTF8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Η βιβλιοθήκη PCRE έχει μεταγλωττιστεί με ασύμβατες επιλογές" + +# gconf/gconfd.c:1676 +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Σφάλμα κατά τη μεταγλώττιση της κανονικής έκφρασης %s στον χαρακτήρα %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Σφάλμα κατά τη βελτιστοποίηση της κανονικής έκφρασης %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "αναμένεται δεκαεξαδικό ψηφίο ή '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "αναμένεται δεκαεξαδικό ψηφίο" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "λείπει το '<' από τη συμβολική αναφορά" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "ημιτελής συμβολική αναφορά" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "συμβολική αναφορά μηδενικού μήκους" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "αναμένεται ψηφίο" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "παράνομη συμβολική αναφορά" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "αδέσποτο τελικό '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "άγνωστη ακολουθία διαφυγής" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Το παρατιθέμενο αλφαριθμητικό δεν αρχίζει με εισαγωγικό σημείο" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Αταίριαστο ερωτηματικό στη γραμμή εντολών ή άλλο παρατιθέμενο κείμενο " +"κελύφους" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Το κείμενο τερματίστηκε αμέσως μετά χαρακτήρα '\\'. (Το κείμενο ήταν '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Το κείμενο τερματίστηκε πριν να βρεθεί ταιριαστή παράθεση για %c. (Το " +"κείμενο ήταν '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Το κείμενο ήταν κενό (ή περιέχει μόνο λευκό κενό)" + +# gconf/gconf-internals.c:2416 +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Απρόσμενο σφάλμα στο select() ανάγνωσης δεδομένων από θυγατρική διεργασία " +"(%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Η θυγατρική διεργασία τερματίστηκε με κωδικό %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Η θυγατρική διεργασία τερματίστηκε από το σήμα %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Η θυγατρική διεργασία διακόπηκε από το σήμα %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Η θυγατρική διεργασία τερματίστηκε ασυνήθιστα" + +# gconf/gconftool.c:881 +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Αποτυχία ανάγνωσης από θυγατρική σωλήνωση (%s)" + +# gconf/gconf-internals.c:2416 +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Αποτυχία δικράνωσης (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Αποτυχία αλλαγής καταλόγου '%s' (%s)" + +# gconf/gconf-internals.c:2416 +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Αποτυχία εκτέλεσης θυγατρικής διεργασίας \"%s\" (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Αποτυχία ανακατεύθυνσης εισόδου ή εξόδου θυγατρικής διεργασίας (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Αποτυχία δικράνωσης θυγατρικής διεργασίας (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Άγνωστο σφάλμα εκτέλεσης θυγατρικής διεργασίας \"%s\"" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Αποτυχία ανάγνωσης επαρκών δεδομένων από θυγατρική σωλήνωση pid (%s)" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Αποτυχία δημιουργίας σωλήνωσης για την επικοινωνία με θυγατρική διεργασία " +"(%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Αποτυχία ανάγνωσης δεδομένων από θυγατρική διεργασία" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Άκυρη συμβολοσειρά σε όρισμα διανύσματος στο %d: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Άκυρη συμβολοσειρά σε περιβάλλον: %s" + +# +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Άκυρος κατάλογος εργασίας: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Αποτυχία εκτέλεσης βοηθητικού προγράμματος(%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Απρόσμενο σφάλμα στο g_io_channel_win32_poll() ανάγνωση δεδομένων από " +"θυγατρική διεργασία" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Ο χαρακτήρας είναι εκτός περιοχής UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Άκυρη σειρά στην είσοδο μετατροπής" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Ο χαρακτήρας είναι εκτός περιοχής UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Ελήφθησαν ελλιπής στοιχεία για το '%s'" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Απροσδόκητο μήκος επιλογής ελέγχου ενεργοποίησης SO_PASSCRED υποδοχής. " +#~ "Αναμονή %d bytes, λήψη %d" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Απρόσμενο σφάλμα στη waitpid() (%s)" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Ανώμαλος τερματισμός προγράμματος κατά την δημιουργία της γραμμής εντολών " +#~ "`%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "Η γραμμή εντολών `%s' τερματίστηκε με κατάσταση εξόδου διαφορετική από το " +#~ "μηδέν %d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "εξάντληση ορίου χώρου εργασίας για κενές υποσυμβολοσειρές" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "δεν επιτρέπονται εδώ οι διαφυγές εναλλαγής πεζών-κεφαλαίων (\\l, \\L, " +#~ "\\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "δεν επιτρέπεται η επανάληψη ομάδας DEFINE" + +#~ msgid "File is empty" +#~ msgstr "Το αρχείο είναι κενό" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "Το key file περιέχει key '%s' που η τιμή του δεν μπορεί να ερμηνευθεί." + +#~ msgid "This option will be removed soon." +#~ msgstr "Αυτή η επιλογή θα αφαιρεθεί σύντομα." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Σφάλμα δήλωσης αρχείου '%s': %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Δεν υπάρχει αρχείο υπηρεσιών για το '%s'" + +# +#~ msgid "Error connecting: " +#~ msgstr "Σφάλμα σύνδεσης:" + +#~ msgid "Error connecting: %s" +#~ msgstr "Σφάλμα σύνδεσης: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "Η υλοποίηση του SOCKSv4a περιορίζει το όνομα χρήστη σε %i χαρακτήρες" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "Η υλοποίηση του SOCKSv4a περιορίζει το όνομα υπολογιστή υποδοχής σε %i " +#~ "χαρακτήρες" + +# +#~ msgid "Error reading from unix: %s" +#~ msgstr "Σφάλμα ανάγνωσης από unix: %s" + +# +#~ msgid "Error closing unix: %s" +#~ msgstr "Σφάλμα κλεισίματος unix: %s" + +# gconf/gconftool.c:1181 +#~ msgid "Error writing to unix: %s" +#~ msgstr "Σφάλμα εγγραφής σε unix: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "πμ" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "μμ" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "Ο τύπος της τιμής επιστροφής είναι ανακριβής, δόθηκε `%s', αναμενόταν `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Προσπάθεια να τεθεί η ιδιότητα %s του τύπου %s αλλά σύμφωνα με την " +#~ "αναμενόμενη διεπαφή ο τύπος είναι %s" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Εντολές:\n" +#~ " help Εμφανίζει αυτές τις πληροφορίες\n" +#~ " get Επιστροφή της τιμής ενός κλειδιού\n" +#~ " set Ορισμός της τιμής ενός κλειδιού\n" +#~ " reset Επανορισμός της τιμής ενός κλειδιού\n" +#~ " monitor Παρακολούθηση ενός κλειδιού για αλλαγές\n" +#~ " writable Έλεγχος εάν ένα κλειδί είναι εγγράψιμο \n" +#~ "\n" +#~ "Χρήσημοποιήστε '%s COMMAND --help' για να πάρτε βοήθεια για μεμονωμένες " +#~ "εντολές.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Διευκρινίστε την διαδρομή για το σχήμα" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Ορίσματα:\n" +#~ " SCHEMA Η ταυτότητα του σχήματος \n" +#~ " KEY Το όνομα του κλειδιού \n" +#~ " VALUE Η τιμή για να οριστεί το κλειδί, ως σειριακή διάταξη " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Το κλειδί %s δεν είναι προς εγγραφή\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Παρακολούθηση του KEY για αλλαγές και εκτύπωση των αλλαγμένων τιμών.\n" +#~ "Η παρακολούθηση θα συνεχιστεί έως ότου ολοκληρωθεί η διαδικασία." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Δεν υπάρχει το σχήμα `%s' όπως ορίζεται στο αρχείο παράκαμψης `%s'" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "" +#~ "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 "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.po b/po/en@shaw.po new file mode 100644 index 0000000..7695d27 --- /dev/null +++ b/po/en@shaw.po @@ -0,0 +1,3809 @@ +# Shavian translation. +# Copyright (C) 2010. +# This file is distributed under the same license as the GLib package. +# Thomas Thurman , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-05-12 18:36 -0400\n" +"Last-Translator: Thomas Thurman \n" +"Language-Team: Shavian \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 '%s' 𐑓𐑹 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "𐑩𐑑𐑮𐑦𐑚𐑿𐑑 '%s' 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑯𐑪𐑑 𐑓𐑬𐑯𐑛" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑨𐑜 '%s', 𐑑𐑨𐑜 '%s' 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑨𐑜 '%s' 𐑦𐑯𐑕𐑲𐑛 '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "𐑯𐑴 𐑝𐑨𐑤𐑦𐑛 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑲𐑤 𐑓𐑬𐑯𐑛 𐑦𐑯 𐑛𐑱𐑑𐑩 𐑛𐑻𐑟" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "𐑩 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s' 𐑷𐑤𐑮𐑧𐑛𐑦 𐑧𐑒𐑟𐑦𐑕𐑑𐑕" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "𐑯𐑴 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑬𐑯𐑛 𐑓𐑹 URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "𐑯𐑴 MIME 𐑑𐑲𐑐 𐑛𐑦𐑓𐑲𐑯𐑛 𐑦𐑯 𐑞 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 𐑘𐑻𐑰 '%s'" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "𐑯𐑴 𐑐𐑮𐑲𐑝𐑩𐑑 𐑓𐑤𐑨𐑜 𐑣𐑨𐑟 𐑚𐑰𐑯 𐑛𐑦𐑓𐑲𐑯𐑛 𐑦𐑯 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s'" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "𐑯𐑴 𐑜𐑮𐑵𐑐𐑕 𐑕𐑧𐑑 𐑦𐑯 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 URI '%s'" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "𐑯𐑴 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑢𐑦𐑞 𐑯𐑱𐑥 '%s' 𐑮𐑧𐑡𐑦𐑕𐑑𐑼𐑛 𐑩 𐑚𐑫𐑒𐑥𐑸𐑒 𐑓𐑹 '%s'" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑦𐑒𐑕𐑐𐑨𐑯𐑛 𐑧𐑜𐑟𐑧𐑒 𐑤𐑲𐑯 '%s' 𐑢𐑦𐑞 URI '%s'" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑓𐑮𐑪𐑥 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑕𐑧𐑑 '%s' 𐑑 '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑴𐑐𐑩𐑯 𐑒𐑩𐑯𐑝𐑻𐑑𐑻 𐑓𐑮𐑪𐑥 '%s' 𐑑 '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑚𐑲𐑑 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "𐑻𐑼 𐑛𐑘𐑫𐑼𐑦𐑙 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "𐑐𐑸𐑑𐑦𐑨𐑤 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑦𐑯𐑐𐑫𐑑" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑒𐑩𐑯𐑝𐑻𐑑 𐑓𐑪𐑤𐑚𐑨𐑒 '%s' 𐑑 𐑒𐑴𐑛𐑕𐑧𐑑 '%s'" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "𐑞 URI '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑯 𐑨𐑚𐑕𐑴𐑤𐑵𐑑 URI 𐑿𐑟𐑦𐑙 𐑞 \"file\" 𐑕𐑒𐑰𐑥" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "𐑞 𐑤𐑴𐑒𐑩𐑤 𐑓𐑲𐑤 URI '%s' 𐑥𐑱 𐑯𐑪𐑑 𐑦𐑯𐑒𐑤𐑵𐑛 𐑩 '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "𐑞 URI '%s' 𐑦𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "𐑞 𐑣𐑴𐑕𐑑𐑯𐑱𐑥 𐑝 𐑞 URI '%s' 𐑦𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "𐑞 URI '%s' 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛𐑤𐑦 𐑦𐑕𐑒𐑱𐑐𐑑 𐑒𐑨𐑮𐑩𐑒𐑑𐑼𐑟" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "𐑞 𐑐𐑭𐑔𐑯𐑱𐑥 '%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑯 𐑨𐑚𐑕𐑴𐑤𐑵𐑑 𐑐𐑭𐑔" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑣𐑴𐑕𐑑𐑯𐑱𐑥" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑨𐑤𐑴𐑒𐑱𐑑 %lu 𐑚𐑲𐑑𐑕 𐑑 𐑮𐑰𐑛 𐑓𐑲𐑤 \"%s\"" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "𐑓𐑲𐑤 \"%s\" 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑓𐑮𐑪𐑥 𐑓𐑲𐑤 '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑜𐑧𐑑 𐑨𐑑𐑮𐑦𐑚𐑿𐑑𐑕 𐑝 𐑓𐑲𐑤 '%s': fstat() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': fdopen() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑯𐑱𐑥 𐑓𐑲𐑤 '%s' 𐑑 '%s': g_rename() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑓𐑲𐑤 '%s': %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s' 𐑓𐑹 𐑮𐑲𐑑𐑦𐑙: fdopen() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fwrite() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fflush() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑲𐑑 𐑓𐑲𐑤 '%s': fsync() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑤𐑴𐑕 𐑓𐑲𐑤 '%s': fclose() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "𐑧𐑒𐑟𐑦𐑕𐑑𐑦𐑙 𐑓𐑲𐑤 '%s' 𐑒𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑮𐑦𐑥𐑵𐑝𐑛: g_unlink() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "𐑑𐑧𐑥𐑐𐑤𐑱𐑑 '%s' 𐑦𐑯𐑝𐑨𐑤𐑦𐑛, 𐑖𐑫𐑛 𐑯𐑪𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 𐑩 '%s'" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "𐑑𐑧𐑥𐑐𐑤𐑱𐑑 '%s' 𐑛𐑳𐑟𐑯𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 𐑚𐑲𐑑" +msgstr[1] "%u 𐑚𐑲𐑑𐑕" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u 𐑚𐑲𐑑" +msgstr[1] "%u 𐑚𐑲𐑑𐑕" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑞 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒 '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑴𐑐𐑩𐑯 𐑓𐑲𐑤 '%s': open() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑥𐑨𐑐 𐑓𐑲𐑤 '%s': mmap() 𐑓𐑱𐑤𐑛: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "𐑻𐑼 𐑪𐑯 𐑤𐑲𐑯 %d 𐑗𐑸 %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 UTF-8 𐑧𐑯𐑒𐑴𐑛𐑩𐑛 𐑑𐑧𐑒𐑕𐑑 𐑦𐑯 𐑯𐑱𐑥 - 𐑯𐑪𐑑 𐑝𐑨𐑤𐑦𐑛 '%s'" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "𐑻𐑼 𐑪𐑯 𐑤𐑲𐑯 %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑮𐑧𐑓𐑼𐑩𐑯𐑕 '%-.*s' 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑧𐑯𐑒𐑴𐑛 𐑩 𐑐𐑼𐑥𐑦𐑑𐑩𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "𐑧𐑥𐑐𐑑𐑦 𐑧𐑯𐑑𐑦𐑑𐑦 '&;' 𐑕𐑰𐑯; 𐑝𐑨𐑤𐑦𐑛 𐑧𐑯𐑑𐑦𐑑𐑦𐑟 𐑸: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "𐑧𐑯𐑑𐑦𐑑𐑦 𐑯𐑱𐑥 '%-.*s' 𐑦𐑟 𐑯𐑪𐑑 𐑯𐑴𐑯" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑥𐑳𐑕𐑑 𐑚𐑩𐑜𐑦𐑯 𐑢𐑦𐑞 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 (e.g. )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑦𐑙 𐑩 '<' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼; 𐑦𐑑 𐑥𐑱 𐑯𐑪𐑑 𐑚𐑩𐑜𐑦𐑯 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 " +"𐑯𐑱𐑥" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 '>' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑑 𐑧𐑯𐑛 𐑞 𐑧𐑥𐑐𐑑𐑦-𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑑𐑨𐑜 '%s'" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "𐑪𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 '%s', 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 '=' 𐑭𐑓𐑑𐑼 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥 '%s' 𐑝 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s'" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑦𐑙 𐑞 𐑒𐑤𐑴𐑕 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑯𐑱𐑥 '%s'; 𐑞 𐑩𐑤𐑬𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 " +"𐑦𐑟 '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑢𐑪𐑟 𐑒𐑤𐑴𐑟𐑛, 𐑯𐑴 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑦𐑟 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑴𐑐𐑩𐑯" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s' 𐑢𐑪𐑟 𐑒𐑤𐑴𐑟𐑛, 𐑚𐑳𐑑 𐑞 𐑒𐑳𐑮𐑩𐑯𐑑𐑤𐑦 𐑴𐑐𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑦𐑟 '%s'" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑢𐑪𐑟 𐑧𐑥𐑐𐑑𐑦 𐑹 𐑒𐑩𐑯𐑑𐑱𐑯𐑛 𐑴𐑯𐑤𐑦 𐑢𐑲𐑑𐑕𐑐𐑱𐑕" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑡𐑳𐑕𐑑 𐑭𐑓𐑑𐑼 𐑩𐑯 𐑴𐑐𐑩𐑯 𐑨𐑙𐑜𐑤 𐑚𐑮𐑨𐑒𐑩𐑑 '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑢𐑦𐑞 𐑧𐑤𐑩𐑥𐑩𐑯𐑑𐑕 𐑕𐑑𐑦𐑤 𐑴𐑐𐑩𐑯 - '%s' 𐑢𐑪𐑟 𐑞 𐑤𐑭𐑕𐑑 " +"𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑴𐑐𐑩𐑯𐑛" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰, 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑 𐑕𐑰 𐑩 𐑒𐑤𐑴𐑕 𐑨𐑙𐑜𐑤 𐑚𐑮𐑨𐑒𐑩𐑑 𐑧𐑯𐑛𐑦𐑙 𐑞 𐑑𐑨𐑜 <" +"%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 𐑯𐑱𐑥" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑧𐑤𐑩𐑥𐑩𐑯𐑑-𐑴𐑐𐑩𐑯𐑦𐑙 𐑑𐑨𐑜." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑭𐑓𐑑𐑼 𐑞 𐑰𐑒𐑢𐑩𐑤𐑟 𐑕𐑲𐑯 𐑓𐑪𐑤𐑴𐑦𐑙 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥; 𐑯𐑴 " +"𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑢𐑲𐑤 𐑦𐑯𐑕𐑲𐑛 𐑩𐑯 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑞 𐑒𐑤𐑴𐑕 𐑑𐑨𐑜 𐑓𐑹 𐑧𐑤𐑩𐑥𐑩𐑯𐑑 '%s'" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑧𐑯𐑛𐑩𐑛 𐑩𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑛𐑤𐑰 𐑦𐑯𐑕𐑲𐑛 𐑩 𐑒𐑳𐑥𐑥𐑩𐑯𐑑 𐑹 𐑐𐑮𐑴𐑕𐑧𐑕𐑦𐑙 𐑦𐑯𐑕𐑑𐑮𐑳𐑒𐑖𐑩𐑯" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑩𐑚𐑡𐑧𐑒𐑑" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼 𐑹 𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑩𐑚𐑡𐑧𐑒𐑑" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "𐑬𐑑 𐑝 𐑥𐑧𐑥𐑼𐑦" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "𐑚𐑨𐑒𐑑𐑮𐑨𐑒𐑦𐑙 𐑤𐑦𐑥𐑦𐑑 𐑮𐑰𐑗𐑑" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "𐑞 𐑐𐑨𐑑𐑼𐑯 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑲𐑑𐑩𐑥𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓𐑹 𐑐𐑸𐑑𐑦𐑨𐑤 𐑥𐑨𐑗𐑦𐑙" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "𐑚𐑨𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑩𐑟 𐑨𐑟 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑟 𐑸 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑓𐑹 𐑐𐑸𐑑𐑦𐑨𐑤 𐑥𐑨𐑗𐑦𐑙" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "𐑮𐑦𐑒𐑻𐑖𐑩𐑯 𐑤𐑦𐑥𐑦𐑑 𐑮𐑰𐑗𐑑" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "𐑢𐑻𐑒𐑕𐑐𐑱𐑕 𐑤𐑦𐑥𐑦𐑑 𐑓𐑹 𐑧𐑥𐑐𐑑𐑦 𐑕𐑳𐑚𐑕𐑑𐑮𐑦𐑙𐑟 𐑮𐑰𐑗𐑑" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑪𐑥𐑚𐑦𐑯𐑱𐑖𐑩𐑯 𐑝 𐑯𐑿𐑤𐑲𐑯 𐑓𐑤𐑨𐑜𐑟" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑐𐑨𐑑𐑼𐑯" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑐𐑨𐑑𐑼𐑯" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑓𐑪𐑤𐑴𐑟 \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "𐑒𐑱𐑕-𐑗𐑱𐑯𐑡𐑦𐑙 𐑦𐑕𐑒𐑱𐑐𐑕 (\\l, \\L, \\u, \\U) 𐑸 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑣𐑽" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "𐑯𐑳𐑥𐑚𐑼𐑟 𐑬𐑑 𐑝 𐑹𐑛𐑼 𐑦𐑯 {} 𐑒𐑢𐑪𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "𐑯𐑳𐑥𐑚𐑼 𐑑𐑵 𐑚𐑦𐑜 𐑦𐑯 {} 𐑒𐑢𐑪𐑯𐑑𐑦𐑓𐑲𐑼" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑦𐑙 ] 𐑓𐑹 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "𐑮𐑱𐑯𐑡 𐑬𐑑 𐑝 𐑹𐑛𐑼 𐑦𐑯 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑒𐑤𐑭𐑕" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "𐑯𐑳𐑔𐑦𐑙 𐑑 𐑮𐑦𐑐𐑰𐑑" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "𐑩𐑯𐑮𐑧𐑒𐑩𐑜𐑯𐑲𐑟𐑛 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑭𐑓𐑑𐑼 (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 𐑯𐑱𐑥𐑛 𐑒𐑤𐑭𐑕𐑩𐑟 𐑸 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑴𐑯𐑤𐑦 𐑢𐑦𐑞𐑦𐑯 𐑩 𐑒𐑤𐑭𐑕" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑦𐑙 )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?𐑭𐑮 𐑹 (?[+-]𐑛𐑦𐑡𐑩𐑑𐑕 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑓𐑪𐑤𐑴𐑛 𐑚𐑲 )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "𐑮𐑧𐑓𐑼𐑩𐑯𐑕 𐑑 𐑯𐑪𐑯-𐑧𐑜𐑟𐑦𐑕𐑑𐑩𐑯𐑑 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "𐑥𐑦𐑕𐑦𐑙 ) 𐑭𐑓𐑑𐑼 𐑒𐑳𐑥𐑥𐑩𐑯𐑑" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 𐑑𐑵 𐑤𐑸𐑡" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑜𐑧𐑑 𐑥𐑧𐑥𐑼𐑦" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "𐑤𐑫𐑒𐑚𐑩𐑣𐑦𐑯𐑛 𐑩𐑕𐑻𐑕𐑩𐑯 𐑦𐑟 𐑯𐑪𐑑 𐑓𐑦𐑒𐑕𐑑 𐑤𐑧𐑙𐑔" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑹 𐑯𐑱𐑥 𐑭𐑓𐑑𐑼 (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯𐑩𐑤 𐑜𐑮𐑵𐑐 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑥𐑹 𐑞𐑨𐑯 𐑑𐑵 𐑚𐑮𐑭𐑯𐑗𐑩𐑟" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "𐑩𐑕𐑻𐑕𐑩𐑯 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑭𐑓𐑑𐑼 (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "𐑳𐑯𐑴𐑯 POSIX 𐑒𐑤𐑭𐑕 𐑯𐑱𐑥" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX 𐑒𐑪𐑤𐑱𐑑𐑦𐑙 𐑧𐑤𐑩𐑥𐑩𐑯𐑑𐑕 𐑸 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑝𐑨𐑤𐑿 𐑦𐑯 \\x{...} 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯 (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑦𐑯 lookbehind 𐑩𐑕𐑻𐑕𐑩𐑯" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "𐑮𐑦𐑒𐑻𐑕𐑦𐑝 𐑒𐑷𐑤 𐑒𐑫𐑛 𐑤𐑵𐑐 𐑦𐑯𐑛𐑧𐑓𐑩𐑯𐑩𐑑𐑤𐑦" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑻 𐑦𐑯 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑱𐑥" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "𐑑𐑵 𐑯𐑱𐑥𐑛 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯𐑟 𐑣𐑨𐑝 𐑞 𐑕𐑱𐑥 𐑯𐑱𐑥" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 \\P 𐑹 \\p 𐑕𐑰𐑒𐑢𐑩𐑯𐑕" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "𐑳𐑯𐑴𐑯 𐑐𐑮𐑪𐑐𐑼𐑑𐑦 𐑯𐑱𐑥 𐑭𐑓𐑑𐑼 \\P 𐑹 \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑱𐑥 𐑦𐑟 𐑑𐑵 𐑤𐑪𐑙 (𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 32 𐑒𐑨𐑮𐑩𐑒𐑑𐑼𐑟)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "𐑑𐑵 𐑥𐑧𐑯𐑦 𐑯𐑱𐑥𐑛 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯𐑟 (𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "𐑪𐑒𐑑𐑩𐑤 𐑝𐑨𐑤𐑿 𐑦𐑟 𐑜𐑮𐑱𐑑𐑼 𐑞𐑨𐑯 \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 𐑜𐑮𐑵𐑐 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑥𐑹 𐑞𐑨𐑯 𐑢𐑳𐑯 𐑚𐑮𐑭𐑯𐑗" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "𐑮𐑦𐑐𐑰𐑑𐑦𐑙 𐑩 DEFINE 𐑜𐑮𐑵𐑐 𐑦𐑟 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "𐑦𐑯𐑒𐑩𐑯𐑕𐑦𐑕𐑑𐑩𐑯𐑑 NEWLINE 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 𐑦𐑟 𐑯𐑪𐑑 𐑓𐑪𐑤𐑴𐑛 𐑚𐑲 𐑩 𐑚𐑮𐑱𐑕𐑑 𐑯𐑱𐑥 𐑹 𐑩𐑯 𐑪𐑐𐑖𐑩𐑯𐑩𐑤𐑦 𐑚𐑮𐑱𐑕𐑑 𐑯𐑪𐑯-𐑟𐑽𐑴 𐑯𐑳𐑥𐑚𐑼" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑮𐑦𐑐𐑰𐑑" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "𐑒𐑴𐑛 𐑴𐑝𐑼𐑓𐑤𐑴" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "𐑴𐑝𐑻𐑮𐑨𐑯 𐑒𐑩𐑥𐑐𐑲𐑤𐑦𐑙 𐑢𐑻𐑒𐑕𐑐𐑱𐑕" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "𐑐𐑮𐑰𐑝𐑦𐑩𐑕𐑤𐑦-𐑗𐑧𐑒𐑑 𐑮𐑧𐑓𐑼𐑩𐑯𐑕𐑑 𐑕𐑳𐑚𐑐𐑨𐑑𐑼𐑯 𐑯𐑪𐑑 𐑓𐑬𐑯𐑛" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑥𐑨𐑗𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 𐑤𐑲𐑚𐑮𐑼𐑦 𐑦𐑟 𐑒𐑩𐑥𐑐𐑲𐑤𐑛 𐑢𐑦𐑞𐑬𐑑 UTF8 𐑕𐑩𐑐𐑹𐑑" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 𐑤𐑲𐑚𐑮𐑼𐑦 𐑦𐑟 𐑒𐑩𐑥𐑐𐑲𐑤𐑛 𐑢𐑦𐑞𐑬𐑑 UTF8 𐑐𐑮𐑪𐑐𐑼𐑑𐑦𐑟 𐑕𐑩𐑐𐑹𐑑" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑒𐑩𐑥𐑐𐑲𐑤𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s 𐑨𐑑 𐑗𐑸 %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑪𐑐𐑑𐑦𐑥𐑲𐑟𐑦𐑙 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑦𐑒𐑕𐑐𐑮𐑧𐑖𐑩𐑯 %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "𐑣𐑧𐑒𐑕𐑩𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑡𐑦𐑑 𐑹 '}' 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "𐑣𐑧𐑒𐑕𐑩𐑛𐑧𐑕𐑦𐑥𐑩𐑤 𐑛𐑦𐑡𐑦𐑑 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "𐑥𐑦𐑕𐑦𐑙 '<' 𐑦𐑯 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "𐑩𐑯𐑓𐑦𐑯𐑦𐑖𐑑 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "𐑟𐑽𐑴-𐑤𐑧𐑙𐑔 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "𐑛𐑦𐑡𐑦𐑑 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "𐑦𐑤𐑰𐑜𐑩𐑤 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑮𐑧𐑓𐑼𐑩𐑯𐑕" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "𐑕𐑑𐑮𐑱 𐑓𐑲𐑯𐑩𐑤 '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "𐑳𐑯𐑴𐑯 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "𐑻𐑼 𐑢𐑲𐑤 𐑐𐑸𐑕𐑦𐑙 𐑮𐑦𐑐𐑤𐑱𐑕𐑥𐑩𐑯𐑑 𐑑𐑧𐑒𐑕𐑑 \"%s\" 𐑨𐑑 𐑗𐑸 %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "𐑒𐑢𐑴𐑑𐑩𐑛 𐑑𐑧𐑒𐑕𐑑 𐑛𐑳𐑟𐑯𐑑 𐑚𐑩𐑜𐑦𐑯 𐑢𐑦𐑞 𐑩 𐑒𐑢𐑴𐑑𐑱𐑖𐑩𐑯 ·𐑥𐑸𐑒" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "𐑩𐑯𐑥𐑨𐑗𐑑 𐑒𐑢𐑴𐑑𐑱𐑖𐑩𐑯 𐑥𐑸𐑒 𐑦𐑯 𐑒𐑩𐑥𐑭𐑯𐑛 𐑤𐑲𐑯 𐑹 𐑳𐑞𐑼 𐑖𐑧𐑤-𐑒𐑢𐑴𐑑𐑩𐑛 𐑑𐑧𐑒𐑕𐑑" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑧𐑯𐑛𐑩𐑛 𐑡𐑳𐑕𐑑 𐑭𐑓𐑑𐑼 𐑩 '\\' 𐑒𐑨𐑮𐑩𐑒𐑑𐑼. (𐑞 𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑧𐑯𐑛𐑩𐑛 𐑚𐑦𐑓𐑹 𐑥𐑨𐑗𐑦𐑙 𐑒𐑢𐑴𐑑 𐑢𐑪𐑟 𐑓𐑬𐑯𐑛 𐑓𐑹 %c. (𐑞 𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "𐑑𐑧𐑒𐑕𐑑 𐑢𐑪𐑟 𐑧𐑥𐑐𐑑𐑦 (𐑹 𐑒𐑩𐑯𐑑𐑱𐑯𐑛 𐑴𐑯𐑤𐑦 𐑢𐑲𐑑𐑕𐑐𐑱𐑕)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑐𐑲𐑐 𐑓𐑹 𐑒𐑩𐑥𐑿𐑯𐑦𐑒𐑱𐑑𐑦𐑙 𐑢𐑦𐑞 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑲𐑐 (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑗𐑱𐑯𐑡 𐑑 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑐𐑮𐑴𐑜𐑮𐑨𐑥 𐑯𐑱𐑥: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑑𐑮𐑦𐑙 𐑦𐑯 𐑸𐑜𐑿𐑥𐑩𐑯𐑑 𐑝𐑧𐑒𐑑𐑼 𐑨𐑑 %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑑𐑮𐑦𐑙 𐑦𐑯 𐑧𐑯𐑝𐑲𐑼𐑯𐑥𐑩𐑯𐑑: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑢𐑻𐑒𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑣𐑧𐑤𐑐𐑼 𐑐𐑮𐑴𐑜𐑮𐑨𐑥 (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 g_io_channel_win32_poll() 𐑮𐑰𐑛𐑦𐑙 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑩 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 select() 𐑮𐑰𐑛𐑦𐑙 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑩 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑼 𐑦𐑯 waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑹𐑒 (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑧𐑒𐑕𐑩𐑒𐑿𐑑 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛𐑻𐑧𐑒𐑑 𐑬𐑑𐑐𐑫𐑑 𐑹 𐑦𐑯𐑐𐑫𐑑 𐑝 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑓𐑹𐑒 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼 𐑧𐑒𐑕𐑩𐑒𐑿𐑑𐑦𐑙 𐑗𐑲𐑤𐑛 𐑐𐑮𐑴𐑕𐑧𐑕 \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑛 𐑦𐑯𐑳𐑓 𐑛𐑱𐑑𐑩 𐑓𐑮𐑪𐑥 𐑗𐑲𐑤𐑛 pid 𐑐𐑲𐑐 (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡 𐑓𐑹 UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑒𐑩𐑯𐑝𐑻𐑖𐑩𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡 𐑓𐑹 UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "𐑿𐑕𐑦𐑡:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[𐑪𐑐𐑖𐑩𐑯...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "𐑖𐑴 𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "𐑖𐑴 𐑷𐑤 𐑣𐑧𐑤𐑐 𐑪𐑐𐑖𐑩𐑯𐑟" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑪𐑐𐑖𐑩𐑯𐑟:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑐𐑸𐑕 𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑐𐑸𐑕 𐑛𐑳𐑚𐑩𐑤 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "𐑛𐑳𐑚𐑩𐑤 𐑝𐑨𐑤𐑿 '%s' 𐑓𐑹 %s 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "𐑻𐑼 𐑐𐑸𐑕𐑦𐑙 𐑪𐑐𐑖𐑩𐑯 %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "𐑥𐑦𐑕𐑦𐑙 𐑸𐑜𐑿𐑥𐑩𐑯𐑑 𐑓𐑹 %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "𐑳𐑯𐑴𐑯 𐑪𐑐𐑖𐑩𐑯 %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "𐑝𐑨𐑤𐑦𐑛 𐑒𐑰 𐑓𐑲𐑤 𐑒𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑓𐑬𐑯𐑛 𐑦𐑯 𐑕𐑻𐑗 𐑛𐑻𐑟" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "𐑯𐑪𐑑 𐑩 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑓𐑲𐑤" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "𐑓𐑲𐑤 𐑦𐑟 𐑧𐑥𐑐𐑑𐑦" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑤𐑲𐑯 '%s' 𐑢𐑦𐑗 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑒𐑰-𐑝𐑨𐑤𐑿 𐑐𐑺, 𐑜𐑮𐑵𐑐, 𐑹 𐑒𐑳𐑥𐑥𐑩𐑯𐑑" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑜𐑮𐑵𐑐 𐑯𐑱𐑥: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑕𐑑𐑸𐑑 𐑢𐑦𐑞 𐑩 𐑜𐑮𐑵𐑐" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑰 𐑯𐑱𐑥: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑧𐑯𐑒𐑴𐑛𐑦𐑙 '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑜𐑮𐑵𐑐 '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑒𐑰 '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑞 𐑝𐑨𐑤𐑿 '%s' 𐑢𐑦𐑗 𐑦𐑟 𐑯𐑪𐑑 UTF-8" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑩 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑒𐑰 '%s' 𐑦𐑯 𐑜𐑮𐑵𐑐 '%s' 𐑢𐑦𐑗 𐑣𐑨𐑟 𐑝𐑨𐑤𐑿 𐑞𐑨𐑑 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑣𐑨𐑝 𐑒𐑰 '%s' 𐑦𐑯 𐑜𐑮𐑵𐑐 '%s'" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑕𐑒𐑱𐑐 𐑒𐑨𐑮𐑩𐑒𐑑𐑼 𐑨𐑑 𐑧𐑯𐑛 𐑝 𐑤𐑲𐑯" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "𐑒𐑰 𐑓𐑲𐑤 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑕𐑒𐑱𐑐 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑯𐑳𐑥𐑚𐑼." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "𐑦𐑯𐑑𐑩𐑡𐑼 𐑝𐑨𐑤𐑿 '%s' 𐑬𐑑 𐑝 𐑮𐑱𐑯𐑡" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑓𐑤𐑴𐑑 𐑯𐑳𐑥𐑚𐑼." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "𐑝𐑨𐑤𐑿 '%s' 𐑒𐑨𐑯𐑪𐑑 𐑚𐑰 𐑦𐑯𐑑𐑻𐑐𐑮𐑩𐑑𐑩𐑛 𐑨𐑟 𐑩 𐑚𐑵𐑤𐑰𐑩𐑯." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "𐑑𐑵 𐑤𐑸𐑡 𐑒𐑬𐑯𐑑 𐑝𐑨𐑤𐑿 𐑐𐑭𐑕𐑑 𐑑 %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "𐑪𐑐𐑼𐑱𐑖𐑩𐑯 𐑢𐑪𐑟 𐑒𐑨𐑯𐑕𐑩𐑤𐑛" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑚𐑡𐑧𐑒𐑑, 𐑯𐑪𐑑 𐑦𐑯𐑦𐑖𐑩𐑤𐑲𐑟𐑛" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "𐑦𐑯𐑒𐑩𐑥𐑐𐑤𐑰𐑑 𐑥𐑳𐑤𐑑𐑦𐑚𐑲𐑑 𐑕𐑰𐑒𐑢𐑩𐑯𐑕 𐑦𐑯 𐑦𐑯𐑐𐑫𐑑" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "𐑯𐑪𐑑 𐑦𐑯𐑳𐑓 𐑕𐑐𐑱𐑕 𐑦𐑯 𐑛𐑧𐑕𐑑𐑦𐑯𐑱𐑖𐑩𐑯" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s 𐑑𐑲𐑐" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑻𐑤𐑰 𐑧𐑯𐑛-𐑝-𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "𐑳𐑯𐑴𐑯 𐑑𐑲𐑐" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "𐑻𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "𐑨𐑛𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "𐑒𐑰 %s 𐑦𐑟 𐑯𐑪𐑑 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "𐑒𐑰 %s 𐑦𐑟 𐑯𐑪𐑑 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "𐑤𐑦𐑕𐑩𐑯𐑻 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "𐑑𐑮𐑨𐑖 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "𐑒𐑩𐑥𐑭𐑯𐑛" + +#: ../gio/gdbus-tool.c:93 +#, fuzzy, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"𐑒𐑩𐑥𐑭𐑯𐑛𐑟:\n" +" help 𐑖𐑴 𐑞𐑦𐑕 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯\n" +" get 𐑜𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑩 𐑒𐑰\n" +" set 𐑕𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑩 𐑒𐑰\n" +" monitor 𐑥𐑪𐑯𐑦𐑑𐑼 𐑩 𐑒𐑰 𐑓𐑹 𐑗𐑱𐑯𐑡𐑩𐑟\n" +" writable 𐑗𐑧𐑒 𐑦𐑓 𐑩 𐑒𐑰 𐑦𐑟 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" +"\n" +"𐑿𐑟 '%s 𐑒𐑩𐑥𐑭𐑯𐑛 --help' 𐑑 𐑜𐑧𐑑 𐑣𐑧𐑤𐑐 𐑓𐑹 𐑦𐑯𐑛𐑦𐑝𐑦𐑛𐑿𐑩𐑤 𐑒𐑩𐑥𐑭𐑯𐑛𐑟.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "𐑻𐑼 𐑪𐑯 𐑤𐑲𐑯 %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "𐑻𐑼 𐑐𐑸𐑕𐑦𐑙 𐑪𐑐𐑖𐑩𐑯 %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯 𐑦𐑯 𐑐𐑮𐑴𐑜𐑮𐑧𐑕" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯 𐑦𐑯 𐑐𐑮𐑴𐑜𐑮𐑧𐑕" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑝𐑨𐑤𐑦𐑛 𐑯𐑱𐑥 " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "𐑻𐑼 𐑐𐑸𐑕𐑦𐑙 𐑪𐑐𐑖𐑩𐑯 %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "𐑻𐑼 𐑨𐑒𐑕𐑧𐑐𐑑𐑦𐑙 𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "𐑒𐑼𐑳𐑐𐑑𐑩𐑛 𐑩𐑚𐑡𐑧𐑒𐑑" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "𐑩𐑯𐑯𐑱𐑥𐑛" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑓𐑲𐑤 𐑛𐑦𐑛𐑯𐑑 𐑕𐑐𐑧𐑕𐑦𐑓𐑲 Exec 𐑓𐑰𐑤𐑛" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑑𐑻𐑥𐑦𐑯𐑩𐑤 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑓𐑹 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑒𐑩𐑯𐑓𐑦𐑜𐑘𐑼𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 %s: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 MIME 𐑒𐑩𐑯𐑓𐑦𐑜𐑘𐑼𐑱𐑖𐑩𐑯 𐑓𐑴𐑤𐑛𐑼 %s: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑮𐑦𐑱𐑑 𐑿𐑟𐑼 𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑓𐑲𐑤 %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "𐑒𐑳𐑕𐑑𐑩𐑥 𐑛𐑧𐑓𐑩𐑯𐑦𐑖𐑩𐑯 𐑓𐑹 %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑑𐑸𐑑" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "𐑛𐑮𐑲𐑝 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑑𐑪𐑐" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GEmblem 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d) 𐑦𐑯 GEmblem 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GEmblemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d) 𐑦𐑯 GEmblemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑩 GEmblem 𐑓𐑹 GEmblemedIcon" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "𐑒𐑩𐑯𐑑𐑱𐑯𐑦𐑙 𐑥𐑬𐑯𐑑 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑧𐑒𐑟𐑦𐑕𐑑" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑧𐑒𐑟𐑦𐑕𐑑𐑕" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑦𐑒𐑻𐑕𐑦𐑝𐑤𐑦 𐑒𐑪𐑐𐑦 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "𐑕𐑐𐑤𐑲𐑕 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "𐑻𐑼 𐑕𐑐𐑤𐑲𐑕𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "𐑒𐑨𐑯𐑑 𐑒𐑪𐑐𐑦 𐑕𐑐𐑧𐑖𐑩𐑤 𐑓𐑲𐑤" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑦𐑥𐑤𐑦𐑙𐑒 𐑝𐑨𐑤𐑿 𐑜𐑦𐑝𐑩𐑯" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "𐑑𐑮𐑨𐑖 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "𐑓𐑲𐑤 𐑯𐑱𐑥𐑟 𐑒𐑨𐑯𐑪𐑑 𐑒𐑩𐑯𐑑𐑱𐑯 '%c'" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "𐑝𐑪𐑤𐑿𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑥𐑬𐑯𐑑" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "𐑯𐑴 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯 𐑦𐑟 𐑮𐑧𐑡𐑦𐑕𐑑𐑼𐑛 𐑨𐑟 𐑣𐑨𐑯𐑛𐑤𐑦𐑙 𐑞𐑦𐑕 𐑓𐑲𐑤" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "𐑓𐑲𐑤 𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑣𐑨𐑟 𐑶𐑑𐑕𐑑𐑨𐑯𐑛𐑦𐑙 𐑪𐑐𐑼𐑱𐑖𐑩𐑯" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "𐑓𐑲𐑤 𐑧𐑯𐑿𐑥𐑻𐑱𐑑𐑼 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GFileIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑦𐑯𐑐𐑫𐑑 𐑛𐑱𐑑𐑩 𐑓𐑹 GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑛𐑳𐑟𐑯𐑑 𐑕𐑩𐑐𐑹𐑑 query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "𐑕𐑰𐑒 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "𐑑𐑮𐑩𐑙𐑒𐑱𐑑 𐑯𐑪𐑑 𐑩𐑤𐑬𐑛 𐑪𐑯 𐑦𐑯𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "𐑑𐑮𐑩𐑙𐑒𐑱𐑑 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "𐑮𐑪𐑙 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑑𐑴𐑒𐑩𐑯𐑟 (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "𐑯𐑴 𐑑𐑲𐑐 𐑓𐑹 𐑒𐑤𐑭𐑕 𐑯𐑱𐑥 %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "𐑑𐑲𐑐 %s 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑞 GIcon 𐑦𐑯𐑑𐑼𐑓𐑱𐑕" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "𐑑𐑲𐑐 %s 𐑦𐑟 𐑯𐑪𐑑 𐑒𐑤𐑨𐑕𐑑" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "𐑥𐑨𐑤𐑓𐑹𐑥𐑛 𐑝𐑻𐑠𐑩𐑯 𐑯𐑳𐑥𐑚𐑼: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "𐑑𐑲𐑐 %s 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 from_tokens() 𐑪𐑯 𐑞 GIcon 𐑦𐑯𐑑𐑼𐑓𐑱𐑕" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑞 𐑕𐑩𐑐𐑤𐑲𐑛 𐑝𐑻𐑠𐑩𐑯 𐑞 𐑲𐑒𐑪𐑯 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "𐑕𐑑𐑮𐑰𐑥 𐑣𐑨𐑟 𐑶𐑑𐑕𐑑𐑨𐑯𐑛𐑦𐑙 𐑪𐑐𐑼𐑱𐑖𐑩𐑯" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "𐑯𐑪𐑑 𐑦𐑯𐑳𐑓 𐑕𐑐𐑱𐑕 𐑓𐑹 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "𐑳𐑯𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "𐑑𐑮𐑨𐑖 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (𐑕𐑑𐑮𐑦𐑙 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "𐑢𐑺 𐑑 𐑕𐑑𐑹 𐑞 gschemas.compiled 𐑓𐑲𐑤" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "𐑛𐑵 𐑯𐑪𐑑 𐑮𐑲𐑑 𐑞 gschema.compiled 𐑓𐑲𐑤" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "𐑛𐑵 𐑯𐑪𐑑 𐑧𐑯𐑓𐑪𐑮𐑕 𐑒𐑰 𐑯𐑱𐑥 𐑮𐑰𐑕𐑑𐑮𐑦𐑒𐑖𐑩𐑯𐑟" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"𐑒𐑪𐑥𐑐𐑲𐑤 𐑷𐑤 GSettings 𐑕𐑒𐑰𐑥𐑩 𐑓𐑲𐑤𐑟 𐑦𐑯𐑑𐑫 𐑩 𐑕𐑒𐑰𐑥𐑩 𐑒𐑨𐑖.\n" +"𐑕𐑒𐑰𐑥𐑩 𐑓𐑲𐑤𐑟 𐑸 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑑 𐑣𐑨𐑝 𐑞 𐑩𐑒𐑕𐑑𐑧𐑯𐑖𐑩𐑯 .gschema.xml,\n" +"𐑯 𐑞 𐑒𐑨𐑖 𐑓𐑲𐑤 𐑦𐑟 𐑒𐑷𐑤𐑛 gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "𐑿 𐑖𐑫𐑛 𐑜𐑦𐑝 𐑦𐑜𐑟𐑨𐑒𐑑𐑤𐑦 𐑢𐑳𐑯 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑯𐑱𐑥\n" + +#: ../gio/glib-compile-schemas.c:2028 +#, fuzzy, c-format +msgid "No schema files found: " +msgstr "𐑯𐑴 𐑕𐑒𐑰𐑥𐑩 𐑓𐑲𐑤𐑟 𐑓𐑬𐑯𐑛\n" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑛𐑦𐑓𐑷𐑤𐑑 𐑤𐑴𐑒𐑩𐑤 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑥𐑪𐑯𐑦𐑑𐑼 𐑑𐑲𐑐" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑓𐑲𐑤𐑯𐑱𐑥 %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "𐑻𐑼 𐑜𐑧𐑑𐑦𐑙 𐑓𐑲𐑤𐑕𐑦𐑕𐑑𐑩𐑥 𐑦𐑯𐑓𐑴: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑰𐑯𐑱𐑥 𐑮𐑵𐑑 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑯𐑱𐑥𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "𐑒𐑨𐑯𐑑 𐑮𐑰𐑯𐑱𐑥 𐑓𐑲𐑤, 𐑓𐑲𐑤𐑯𐑱𐑥 𐑷𐑤𐑮𐑧𐑛𐑦 𐑧𐑒𐑟𐑦𐑕𐑑" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑓𐑲𐑤𐑯𐑱𐑥" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "𐑒𐑨𐑯𐑑 𐑴𐑐𐑩𐑯 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "𐑻𐑼 𐑑𐑮𐑨𐑖𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖 𐑛𐑻 %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑑𐑪𐑐𐑤𐑧𐑝𐑩𐑤 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑓𐑹 𐑑𐑮𐑨𐑖" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑹 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑑𐑮𐑨𐑖𐑦𐑙 𐑦𐑯𐑓𐑴 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑑𐑮𐑨𐑖 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "𐑻𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "𐑓𐑲𐑤𐑕𐑦𐑕𐑑𐑩𐑥 𐑛𐑳𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒𐑕" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "𐑻𐑼 𐑥𐑱𐑒𐑦𐑙 𐑕𐑦𐑥𐑚𐑪𐑤𐑦𐑒 𐑤𐑦𐑙𐑒: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "𐑻𐑼 𐑥𐑵𐑝𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "𐑒𐑨𐑯𐑑 𐑥𐑵𐑝 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "𐑚𐑨𐑒𐑳𐑐 𐑓𐑲𐑤 𐑒𐑮𐑰𐑱𐑖𐑩𐑯 𐑓𐑱𐑤𐑛" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "𐑥𐑵𐑝 𐑚𐑦𐑑𐑢𐑰𐑯 𐑥𐑶𐑯𐑑𐑕 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑝𐑨𐑤𐑿 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (𐑕𐑑𐑮𐑦𐑙 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑦𐑒𐑕𐑑𐑧𐑯𐑛𐑩𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑯𐑱𐑥" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑦𐑒𐑕𐑑𐑧𐑯𐑛𐑩𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "𐑻𐑼 𐑕𐑑𐑨𐑑𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑧𐑯𐑒𐑴𐑛𐑦𐑙)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "𐑻𐑼 𐑕𐑑𐑱𐑑𐑦𐑙 𐑓𐑲𐑤 𐑛𐑧𐑕𐑒𐑮𐑦𐑐𐑑𐑼: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (uint32 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (uint64 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑩𐑑𐑮𐑦𐑚𐑿𐑑 𐑑𐑲𐑐 (𐑚𐑲𐑑 𐑕𐑑𐑮𐑦𐑙 𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑕𐑧𐑑 𐑐𐑻𐑥𐑦𐑖𐑪𐑯𐑟 𐑪𐑯 𐑕𐑦𐑥𐑤𐑦𐑙𐑒𐑕" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑐𐑻𐑥𐑦𐑖𐑪𐑯𐑟: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑴𐑯𐑼: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "𐑕𐑦𐑥𐑤𐑦𐑙𐑒 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑕𐑦𐑥𐑤𐑦𐑙𐑒: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑕𐑦𐑥𐑤𐑦𐑙𐑒: 𐑓𐑲𐑤 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑕𐑦𐑥𐑤𐑦𐑙𐑒" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 𐑥𐑪𐑛𐑦𐑓𐑦𐑒𐑱𐑖𐑩𐑯 𐑹 𐑨𐑒𐑕𐑧𐑕 𐑑𐑲𐑥: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑 𐑥𐑳𐑕𐑑 𐑚𐑰 𐑯𐑪𐑯-NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑑𐑦𐑙 SELinux 𐑒𐑪𐑯𐑑𐑧𐑒𐑕𐑑: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 𐑦𐑟 𐑯𐑪𐑑 𐑦𐑯𐑱𐑚𐑩𐑤𐑛 𐑪𐑯 𐑞𐑦𐑕 𐑕𐑦𐑕𐑑𐑩𐑥" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "𐑕𐑧𐑑𐑦𐑙 𐑨𐑑𐑮𐑦𐑚𐑿𐑑 %s 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑮𐑪𐑥 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "𐑻𐑼 𐑕𐑰𐑒𐑦𐑙 𐑦𐑯 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑓𐑲𐑯𐑛 𐑛𐑦𐑓𐑷𐑤𐑑 𐑤𐑴𐑒𐑩𐑤 𐑓𐑲𐑤 𐑥𐑪𐑯𐑦𐑑𐑼 𐑑𐑲𐑐" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑴𐑤𐑛 𐑚𐑨𐑒𐑳𐑐 𐑤𐑦𐑙𐑒: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "𐑻𐑼 𐑒𐑮𐑦𐑱𐑑𐑦𐑙 𐑚𐑨𐑒𐑳𐑐 𐑒𐑪𐑐𐑦: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑯𐑱𐑥𐑦𐑙 𐑑𐑧𐑥𐑐𐑼𐑼𐑦 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "𐑻𐑼 𐑑𐑮𐑩𐑙𐑒𐑱𐑑𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "𐑻𐑼 𐑴𐑐𐑩𐑯𐑦𐑙 𐑓𐑲𐑤 '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑦𐑟 𐑩 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "𐑑𐑸𐑜𐑧𐑑 𐑓𐑲𐑤 𐑦𐑟 𐑯𐑪𐑑 𐑩 𐑮𐑧𐑜𐑘𐑫𐑤𐑼 𐑓𐑲𐑤" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "𐑞 𐑓𐑲𐑤 𐑢𐑪𐑟 𐑦𐑒𐑕𐑑𐑻𐑯𐑩𐑤𐑦 𐑥𐑪𐑛𐑦𐑓𐑲𐑛" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑥𐑵𐑝𐑦𐑙 𐑴𐑤𐑛 𐑓𐑲𐑤: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 GSeekType 𐑕𐑩𐑐𐑤𐑲𐑛" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑰𐑒 𐑮𐑦𐑒𐑢𐑧𐑕𐑑" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "𐑒𐑨𐑯𐑪𐑑 𐑑𐑮𐑩𐑙𐑒𐑱𐑑 GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "𐑥𐑧𐑥𐑼𐑦 𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥 𐑯𐑪𐑑 𐑮𐑧𐑕𐑲𐑟𐑩𐑚𐑩𐑤" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "𐑓𐑱𐑤𐑛 𐑑 𐑮𐑰𐑕𐑲𐑟 𐑥𐑧𐑥𐑼𐑦 𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "𐑩𐑥𐑬𐑯𐑑 𐑝 𐑥𐑧𐑥𐑼𐑦 𐑮𐑦𐑒𐑢𐑲𐑼𐑛 𐑑 𐑐𐑮𐑴𐑕𐑧𐑕 𐑞 𐑮𐑲𐑑 𐑦𐑟 𐑤𐑸𐑡𐑼 𐑞𐑨𐑯 𐑩𐑝𐑱𐑤𐑩𐑚𐑩𐑤 𐑩𐑛𐑮𐑧𐑕 𐑕𐑐𐑱𐑕" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "𐑮𐑦𐑒𐑢𐑧𐑕𐑑𐑩𐑛 𐑕𐑰𐑒 𐑚𐑦𐑓𐑹 𐑞 𐑚𐑩𐑜𐑦𐑯𐑦𐑙 𐑝 𐑞 𐑕𐑑𐑮𐑰𐑥" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 \"𐑳𐑯𐑥𐑬𐑯𐑑\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "𐑥𐑬𐑯𐑑 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑕𐑦𐑯𐑒𐑮𐑩𐑯𐑩𐑕 𐑒𐑪𐑯𐑑𐑧𐑯𐑑 𐑑𐑲𐑐 𐑜𐑧𐑕𐑦𐑙" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "𐑣𐑴𐑕𐑑𐑯𐑱𐑥 '%s' 𐑒𐑩𐑯𐑑𐑱𐑯𐑟 '[' 𐑚𐑳𐑑 𐑯𐑪𐑑 ']'" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "𐑬𐑑𐑐𐑫𐑑 𐑕𐑑𐑮𐑰𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑮𐑲𐑑" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "𐑕𐑹𐑕 𐑕𐑑𐑮𐑰𐑥 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "𐑻𐑼 𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s': %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "𐑻𐑼 𐑮𐑰𐑝𐑻𐑕-𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "𐑯𐑴 𐑕𐑻𐑝𐑦𐑕 𐑮𐑩𐑒𐑹𐑛 𐑓𐑹 '%s'" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "𐑑𐑧𐑥𐑐𐑼𐑼𐑦𐑤𐑦 𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑮𐑦𐑟𐑪𐑤𐑝 '%s'" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "𐑻𐑼 𐑮𐑦𐑟𐑪𐑤𐑝𐑦𐑙 '%s'" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "𐑜𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑒𐑰" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +#, fuzzy +msgid "SCHEMA[:PATH] KEY" +msgstr "𐑕𐑒𐑰𐑥𐑩 𐑒𐑰" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +#, fuzzy +msgid "Set the value of KEY to VALUE" +msgstr "𐑕𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑒𐑰" + +#: ../gio/gsettings-tool.c:583 +#, fuzzy +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "𐑕𐑒𐑰𐑥𐑩 𐑒𐑰 𐑝𐑨𐑤𐑿" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +#, fuzzy +msgid "Check if KEY is writable" +msgstr "𐑓𐑲𐑯𐑛 𐑬𐑑 𐑢𐑧𐑞𐑼 𐑒𐑰 𐑦𐑟 𐑮𐑲𐑑𐑩𐑚𐑩𐑤" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +#, fuzzy +msgid "SCHEMA[:PATH] [KEY]" +msgstr "𐑕𐑒𐑰𐑥𐑩 𐑒𐑰" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "𐑳𐑯𐑴𐑯 𐑒𐑩𐑥𐑭𐑯𐑛 '%s'\n" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +#, fuzzy +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +"𐑸𐑜𐑿𐑥𐑩𐑯𐑑𐑕:\n" +" 𐑕𐑒𐑰𐑥𐑩 𐑞 𐑦𐑛 𐑝 𐑞 schema\n" +" 𐑒𐑰 𐑞 𐑯𐑱𐑥 𐑝 𐑞 𐑒𐑰\n" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑪𐑒𐑩𐑑, 𐑯𐑪𐑑 𐑦𐑯𐑦𐑖𐑩𐑤𐑲𐑟𐑛" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑕𐑪𐑒𐑩𐑑, 𐑦𐑯𐑦𐑑𐑦𐑩𐑤𐑲𐑟𐑨𐑖𐑩𐑯 𐑓𐑱𐑤𐑛 𐑛𐑿 𐑑: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "𐑕𐑪𐑒𐑩𐑑 I/O 𐑑𐑲𐑥𐑛 𐑬𐑑" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "𐑒𐑮𐑦𐑱𐑑𐑦𐑙 GSocket 𐑓𐑮𐑪𐑥 fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑕𐑪𐑒𐑩𐑑: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "𐑳𐑯𐑴𐑯 𐑐𐑮𐑴𐑑𐑩𐑒𐑪𐑤 𐑢𐑪𐑟 𐑕𐑐𐑧𐑕𐑦𐑓𐑲𐑛" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑜𐑧𐑑 𐑤𐑴𐑒𐑩𐑤 𐑩𐑛𐑮𐑧𐑕: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑜𐑧𐑑 𐑮𐑦𐑥𐑴𐑑 𐑩𐑛𐑮𐑧𐑕: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "𐑒𐑫𐑛 𐑯𐑪𐑑 𐑤𐑦𐑕𐑩𐑯: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "𐑻𐑼 𐑚𐑲𐑯𐑛𐑦𐑙 𐑑 𐑩𐑛𐑮𐑧𐑕: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "𐑻𐑼 𐑨𐑒𐑕𐑧𐑐𐑑𐑦𐑙 𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "𐑒𐑩𐑯𐑧𐑒𐑖𐑩𐑯 𐑦𐑯 𐑐𐑮𐑴𐑜𐑮𐑧𐑕" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "𐑻𐑼 𐑒𐑩𐑯𐑧𐑒𐑑𐑦𐑙: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑜𐑧𐑑 𐑐𐑧𐑯𐑛𐑦𐑙 𐑻𐑼: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑕𐑰𐑝𐑦𐑙 𐑛𐑱𐑑𐑩: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑯𐑛𐑦𐑙 𐑛𐑱𐑑𐑩: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "𐑳𐑯𐑱𐑚𐑩𐑤 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑕𐑪𐑒𐑩𐑑: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑕𐑪𐑒𐑩𐑑: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "𐑢𐑱𐑑𐑦𐑙 𐑓𐑹 𐑕𐑪𐑒𐑩𐑑 𐑒𐑩𐑯𐑛𐑦𐑖𐑩𐑯: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "𐑻𐑼 𐑕𐑧𐑯𐑛𐑦𐑙 𐑥𐑧𐑕𐑦𐑡: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 ·𐑢𐑦𐑯𐑛𐑴𐑟" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "𐑻𐑼 𐑮𐑦𐑕𐑰𐑝𐑦𐑙 𐑥𐑧𐑕𐑦𐑡: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "𐑳𐑯𐑴𐑯 𐑻𐑼 𐑪𐑯 𐑒𐑩𐑯𐑧𐑒𐑑" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "𐑒𐑰 %s 𐑦𐑟 𐑯𐑪𐑑 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "𐑤𐑦𐑕𐑩𐑯𐑻 𐑦𐑟 𐑷𐑤𐑮𐑧𐑛𐑦 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "𐑨𐑛𐑩𐑛 𐑕𐑪𐑒𐑩𐑑 𐑦𐑟 𐑒𐑤𐑴𐑟𐑛" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "𐑒𐑨𐑯𐑑 𐑣𐑨𐑯𐑛𐑩𐑤 𐑝𐑻𐑠𐑩𐑯 %d 𐑝 GThemedIcon 𐑧𐑯𐑒𐑴𐑛𐑦𐑙" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑙 1 𐑒𐑩𐑯𐑑𐑮𐑴𐑤 𐑥𐑧𐑕𐑦𐑡, 𐑜𐑪𐑑 %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "𐑳𐑯𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑩𐑛 𐑑𐑲𐑐 𐑝 𐑨𐑯𐑕𐑩𐑤𐑧𐑮𐑰 𐑛𐑱𐑑𐑩" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑙 𐑢𐑳𐑯 fd, 𐑚𐑳𐑑 𐑜𐑪𐑑 %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "𐑮𐑦𐑕𐑰𐑝𐑛 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 fd" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "𐑻𐑼 𐑕𐑧𐑯𐑛𐑦𐑙 𐑛𐑱𐑑𐑩: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑯𐑱𐑥𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "𐑦𐑒𐑕𐑐𐑧𐑒𐑑𐑦𐑙 1 𐑒𐑩𐑯𐑑𐑮𐑴𐑤 𐑥𐑧𐑕𐑦𐑡, 𐑜𐑪𐑑 %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑮𐑪𐑥 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "𐑓𐑲𐑤𐑕𐑦𐑕𐑑𐑩𐑥 𐑮𐑵𐑑" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 ·𐑿𐑯𐑦𐑒𐑕: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "𐑨𐑚𐑕𐑑𐑮𐑨𐑒𐑑 ·𐑿𐑯𐑦𐑒𐑕 𐑛𐑴𐑥𐑱𐑯 𐑕𐑪𐑒𐑩𐑑 𐑩𐑛𐑮𐑧𐑕𐑩𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 𐑞𐑦𐑕 𐑕𐑦𐑕𐑑𐑩𐑥" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "𐑝𐑪𐑤𐑿𐑥 𐑛𐑳𐑟𐑯𐑑 𐑦𐑥𐑐𐑤𐑧𐑥𐑧𐑯𐑑 𐑦𐑡𐑧𐑒𐑑 𐑹 eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "𐑒𐑨𐑯𐑑 𐑓𐑲𐑯𐑛 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "𐑻𐑼 𐑤𐑷𐑯𐑗𐑦𐑙 𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "𐑩𐑕𐑴𐑕𐑦𐑱𐑖𐑩𐑯 𐑗𐑱𐑯𐑡𐑩𐑟 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "𐑩𐑕𐑴𐑕𐑦𐑱𐑖𐑩𐑯 𐑒𐑮𐑰𐑱𐑖𐑩𐑯 𐑯𐑪𐑑 𐑕𐑩𐑐𐑹𐑑𐑩𐑛 𐑪𐑯 win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "𐑻𐑼 𐑮𐑰𐑛𐑦𐑙 𐑓𐑮𐑪𐑥 𐑓𐑲𐑤: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "𐑻𐑼 𐑒𐑤𐑴𐑟𐑦𐑙 𐑓𐑲𐑤: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "𐑻𐑼 𐑮𐑲𐑑𐑦𐑙 𐑑 𐑓𐑲𐑤: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "𐑯𐑪𐑑 𐑦𐑯𐑳𐑓 𐑥𐑧𐑥𐑼𐑦" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑻𐑼: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "𐑯𐑰𐑛 𐑥𐑹 𐑦𐑯𐑐𐑫𐑑" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑒𐑪𐑥𐑐𐑮𐑧𐑕𐑑 𐑛𐑱𐑑𐑩" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "𐑒𐑨𐑯𐑑 𐑥𐑵𐑝 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑴𐑝𐑼 𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "𐑒𐑩𐑥𐑭𐑯𐑛𐑟:\n" +#~ " help 𐑖𐑴 𐑞𐑦𐑕 𐑦𐑯𐑓𐑼𐑥𐑱𐑖𐑩𐑯\n" +#~ " get 𐑜𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑩 𐑒𐑰\n" +#~ " set 𐑕𐑧𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑝 𐑩 𐑒𐑰\n" +#~ " monitor 𐑥𐑪𐑯𐑦𐑑𐑼 𐑩 𐑒𐑰 𐑓𐑹 𐑗𐑱𐑯𐑡𐑩𐑟\n" +#~ " writable 𐑗𐑧𐑒 𐑦𐑓 𐑩 𐑒𐑰 𐑦𐑟 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" +#~ "\n" +#~ "𐑿𐑟 '%s 𐑒𐑩𐑥𐑭𐑯𐑛 --help' 𐑑 𐑜𐑧𐑑 𐑣𐑧𐑤𐑐 𐑓𐑹 𐑦𐑯𐑛𐑦𐑝𐑦𐑛𐑿𐑩𐑤 𐑒𐑩𐑥𐑭𐑯𐑛𐑟.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "𐑕𐑐𐑧𐑕𐑦𐑓𐑲 𐑞 𐑐𐑭𐑔 𐑓𐑹 𐑞 𐑕𐑒𐑰𐑥𐑩" + +#~ msgid "PATH" +#~ msgstr "𐑐𐑭𐑔" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "𐑸𐑜𐑿𐑥𐑩𐑯𐑑𐑕:\n" +#~ " 𐑕𐑒𐑰𐑥𐑩 𐑞 𐑦𐑛 𐑝 𐑞 schema\n" +#~ " 𐑒𐑰 𐑞 𐑯𐑱𐑥 𐑝 𐑞 𐑒𐑰\n" +#~ " 𐑝𐑨𐑤𐑿 𐑞 𐑝𐑨𐑤𐑿 𐑑 𐑕𐑧𐑑 𐑒𐑰 𐑑, 𐑨𐑟 𐑩 𐑕𐑦𐑮𐑰𐑩𐑤𐑲𐑟𐑛 GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "𐑒𐑰 %s 𐑦𐑟 𐑯𐑪𐑑 𐑮𐑲𐑑𐑩𐑚𐑩𐑤\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "𐑥𐑪𐑯𐑦𐑑𐑼 𐑒𐑰 𐑓𐑹 𐑗𐑱𐑯𐑡𐑩𐑟 𐑯 𐑐𐑮𐑦𐑯𐑑 𐑞 𐑗𐑱𐑯𐑡𐑛 𐑝𐑨𐑤𐑿𐑟.\n" +#~ "𐑥𐑭𐑯𐑩𐑑𐑻𐑦𐑙 𐑢𐑦𐑤 𐑒𐑩𐑯𐑑𐑦𐑯𐑿 𐑳𐑯𐑑𐑦𐑤 𐑞 𐑐𐑮𐑴𐑕𐑧𐑕 𐑦𐑟 𐑑𐑻𐑥𐑩𐑯𐑱𐑑𐑩𐑛." diff --git a/po/en_CA.po b/po/en_CA.po new file mode 100644 index 0000000..d3cf2b7 --- /dev/null +++ b/po/en_CA.po @@ -0,0 +1,3922 @@ +# English/Canada translation of glib. +# Copyright (C) 2004-2005 Adam Weinberger +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-08-27 16:20-0400\n" +"Last-Translator: Ryan Lortie \n" +"Language-Team: Canadian English \n" +"Language: 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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s'; tag '%s' expected" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %r %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%F" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%r" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "January" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "February" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "March" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "June" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "July" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "August" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "October" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "December" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Oct" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Monday" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Tuesday" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Wednesday" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Thursday" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Friday" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Saturday" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sunday" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Mon" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Tue" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Wed" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Thu" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Fri" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sat" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sun" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" is too large" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fflush() failed: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fsync() failed: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: ../glib/gfileutils.c:1152 +#, 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:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' does not contain XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Failed to map file '%s': mmap() failed: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is not a valid name " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is not a valid name: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Empty entity '&;' seen; valid entities are: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%-.*s' is not known" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "corrupted object" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "out of memory" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "internal error" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "workspace limit for empty substrings reached" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "bad offset" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "short utf8" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "unknown error" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "unrecognized character follows \\" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "unrecognized character after (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "unrecognized character after (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "unrecognized character after (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "regular expression too large" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{...} sequence is too large" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "repeating a DEFINE group is not allowed" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "code overflow" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimizing regular expression %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "digit expected" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: ../glib/gregex.c:2360 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text does not begin with a quotation mark" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Failed to execute child process (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Invalid program name: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Invalid string in argument vector at %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unexpected error in waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Usage:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Help Options:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Show help options" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Show all help options" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Application Options:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing argument for %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: ../glib/gkeyfile.c:366 +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:401 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "File is empty" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Invalid object, not initialized" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Incomplete multibyte sequence in input" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Not enough space in destination" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials is not implemented on this OS" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "There is no GCredentials support for your platform" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Unsupported key `%s' in address entry `%s'" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Meaningless key/value pair combination in address entry `%s'" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Error in address `%s' - the port attribute is malformed" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Error in address `%s' - the family attribute is malformed" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Address element `%s', does not contain a colon (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Error in address `%s' - the host attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Error in address `%s' - the port attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Error in address `%s' - the noncefile attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Error auto-launching: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Unknown or unsupported transport `%s' for address `%s'" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error opening nonce file '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error reading from nonce file '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Error reading from nonce file `%s', expected 16 bytes, got %d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Error writing contents of nonce file `%s' to stream:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "The given address is empty" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Cannot spawn a message bus without a machine-id: " + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Error spawning command line `%s': " + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Abnormal program termination spawning command line `%s': %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Command line `%s' exited with non-zero exit status %d: %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Cannot determine session bus address (not implemented for this OS)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "Unknown bus type %d" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "Unexpected lack of content trying to read a line" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Unexpected lack of content trying to (safely) read a line" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error statting directory `%s': %s" +msgstr "Error statting directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error creating directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Error opening keyring `%s' for reading: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Didn't find cookie with id %d in the keyring at `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error deleting stale lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error creating lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error closing (unlinked) lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error unlinking lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Error opening keyring `%s' for writing: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Additionally, releasing the lock for `%s' also failed: %s) " + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "The connection is closed" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "Timeout was reached" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Unsupported flags encountered when constructing a client-side connection" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Error setting property `%s': Expected type `%s' but got `%s'" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "No such property `%s'" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Property `%s' is not readable" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Property `%s' is not writable" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "No such interface `%s'" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "No such interface" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No such interface `%s' on object at path %s" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "No such method `%s'" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Type of message, `%s', does not match expected type `%s'" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "An object is already exported for the interface %s at %s" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Method `%s' returned type `%s', but expected `%s'" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Method `%s' on interface `%s' with signature `%s' does not exist" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "A subtree is already exported for %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "type is INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL message: PATH or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Wanted to read %lu byte but got EOF" +msgstr[1] "Wanted to read %lu bytes but got EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Expected NUL byte after the string `%s' but found byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Parsed value `%s' is not a valid D-Bus object path" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Parsed value `%s' is not a valid D-Bus signature" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[1] "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Parsed value `%s' for variant is not a valid D-Bus signature" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Invalid major protocol version. Expected 1 but found %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Signature header with signature `%s' found but message body is empty" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Parsed value `%s' is not a valid D-Bus signature (for body)" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "No signature header in message but the message body is %u byte" +msgstr[1] "No signature header in message but the message body is %u bytes" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Cannot deserialize message: " + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "Cannot serialize message: " + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Message body has signature `%s' but there is no signature header" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Message body is empty but signature in the header field is `(%s)'" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Error return with body of type `%s'" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "Error return with empty body" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "Unable to load /var/lib/dbus/machine-id: " + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Error calling StartServiceByName for %s: " + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Unexpected reply %d from StartServiceByName(\"%s\") method" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "Abstract name space not supported" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "Cannot specify nonce file when creating a server" + +#: ../gio/gdbusserver.c:875 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error writing nonce file at `%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "The string `%s' is not a valid D-Bus GUID" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Cannot listen on unsupported transport `%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Error: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error parsing introspection XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Connect to the system bus" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Connect to the session bus" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Connect to given D-Bus address" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Connection Endpoint Options:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Options specifying the connection endpoint" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "No connection endpoint specified" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Multiple connection endpoints specified" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Warning: According to introspection data, interface `%s' does not exist\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Optional destination for signal (unique name)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Object path to emit signal on" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signal and interface name" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Emit a signal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Error connecting: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: object path not specified.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: %s is not a valid object path\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: signal not specified.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s is not a valid interface name\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s is not a valid member name\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s is not a valid unique bus name.\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error parsing parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error flushing connection: %s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Destination name to invoke method on" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Object path to invoke method on" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Method and interface name" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Timeout in seconds" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Invoke a method on a remote object." + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: Destination is not specified\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: Object path is not specified\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: Method name is not specified\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: Method name `%s' is invalid\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Error parsing parameter %d of type `%s': %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Destination name to introspect" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Object path to introspect" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Print XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Introspect children" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Only print properties" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Introspect a remote object." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Destination name to monitor" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Object path to monitor" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Monitor a remote object." + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Unnamed" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: ../gio/gdesktopappinfo.c:1515 +#, 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:1519 +#, 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:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "Application information lacks an identifier" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "drive doesn't implement start" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS support is not available" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Can't handle version %d of GEmblem encoding" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Malformed number of tokens (%d) in GEmblem encoding" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Can't handle version %d of GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Expected a GEmblem for GEmblemedIcon" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Target file exists" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "Splice not supported" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error splicing file: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Can't copy special file" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Trash not supported" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "File enumerator is already closed" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Can't handle version %d of GFileIcon encoding" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "Malformed input data for GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Wrong number of tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "No type for class name %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s does not implement the GIcon interface" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is not classed" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Malformed version number: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Can't handle the supplied version the icon encoding" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Not enough space for socket address" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Unsupported socket address" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "empty names are not permitted" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "invalid name '%s': names must begin with a lowercase letter" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "invalid name '%s': two successive dashes ('--') are not permitted." + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "invalid name '%s': the last character may not be a dash ('-')." + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "invalid name '%s': maximum length is 1024" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "can not add keys to a 'list-of' schema" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" shadows in ; use " +"to modify value" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> not (yet) defined." + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "invalid GVariant type string '%s'" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr " given but schema isn't extending anything" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "no to override" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " extends not yet existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " is list of not yet existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Can not be a list of a schema with a path" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Can not extend a schema with a path" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" is a list, extending which is not a list" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" extends but '%s' " +"does not extend '%s'" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "a path, if given, must begin and end with a slash" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "the path of a list must end with ':/'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> already specified" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> not allowed inside <%s>" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> not allowed at toplevel" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text may not appear inside <%s>" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "This entire file has been ignored.\n" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoring this file.\n" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "No such key `%s' in schema `%s' as specified in override file `%s'" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " and --strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "where to store the gschemas.compiled file" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "Abort on any errors in schemas" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "Do not write the gschema.compiled file" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "This option will be removed soon." + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "Do not enforce key name restrictions" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "You should give exactly one directory name\n" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "No schema files found: " + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "doing nothing.\n" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "removed existing output file.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "Can't rename file, filename already exists" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error trashing file: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create trash dir %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for trash" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create trash directory" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create trashing info file: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to trash file: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error creating directory: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filesystem does not support symbolic links" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Error stating file '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error stating file descriptor: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Cannot set permissions on symlinks" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting modification or access time: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context must be non-NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting SELinux context: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is not enabled on this system" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error removing old file: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: ../gio/gmemoryoutputstream.c:600 +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:756 +msgid "Requested seek before the beginning of the stream" +msgstr "Requested seek before the beginning of the stream" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostname '%s' contains '[' but not ']'" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error resolving '%s': %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reverse-resolving '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "No service record for '%s'" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporarily unable to resolve '%s'" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error resolving '%s'" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema '%s' is not relocatable (path must not be specified)\n" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No such schema '%s'\n" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema '%s' is relocatable (path must be specified)\n" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "Empty path given.\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Path must begin with a slash (/)\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Path must end with a slash (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Path must not contain two adjacent slashes (//)\n" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "No such key '%s'\n" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "The provided value is outside of the valid range\n" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "Print help" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "List the installed (non-relocatable) schemas" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "List the installed relocatable schemas" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "List the keys in SCHEMA" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "List the children of SCHEMA" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "Get the value of KEY" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "Query the range of valid values for KEY" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "Set the value of KEY to VALUE" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "Reset KEY to its default value" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reset all keys in SCHEMA to their defaults" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "Check if KEY is writable" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Unknown command %s\n" +"\n" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "Arguments:\n" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND The (optional) command to explain\n" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY The (optional) key within the schema\n" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr " KEY The key within the schema\n" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr " VALUE The value to set\n" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "Empty schema name given\n" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Invalid socket, not initialized" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Invalid socket, initialization failed due to: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "Socket is already closed" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "Socket I/O timed out" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creating GSocket from fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create socket: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "Unknown protocol was specified" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "could not get local address: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "could not get remote address: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "could not listen: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error binding to address: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error accepting connection: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Error connecting: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "Connection in progress" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Error connecting: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to get pending error: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error receiving data: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Error sending data: %s" + +#: ../gio/gsocket.c:2163 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Unable to shutdown socket: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error closing socket: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Waiting for socket condition: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Error sending message: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage not supported on windows" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error receiving message: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials not implemented for this OS" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Unknown error on connect" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Trying to proxy over non-TCP connection is not supported." + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy protocol '%s' is not supported." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener is already closed" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Added socket is closed" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 does not support IPv6 address '%s'" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "SOCKSv4 implementation limits username to %i characters" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "SOCKSv4a implementation limits hostname to %i characters" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "The server is not a SOCKSv4 proxy server." + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Connection through SOCKSv4 server was rejected" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "The server is not a SOCKSv5 proxy server." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "The SOCKSv5 proxy requires authentication." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "Username or password is too long for SOCKSv5 protocol (max. is %i)." + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 authentication failed due to wrong username or password." + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "The SOCKSv5 proxy server uses unknown address type." + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Internal SOCKSv5 proxy server error." + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 connection not allowed by ruleset." + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host unreachable through SOCKSv5 server." + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Network unreachable through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Connection refused through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy does not support 'connect' command." + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy does not support provided address type." + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Unknown SOCKSv5 proxy error." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Can't handle version %d of GThemedIcon encoding" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "No PEM-encoded private key found" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "Could not parse PEM-encoded private key" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "No PEM-encoded certificate found" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "Could not parse PEM-encoded certificate" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"This is the last chance to enter the password correctly before your access " +"is locked out." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "The password entered is incorrect." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Expecting 1 control message, got %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Unexpected type of ancillary data" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Expecting one fd, but got %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Received invalid fd" + +#: ../gio/gunixconnection.c:371 +msgid "Error sending credentials: " +msgstr "Error sending credentials: " + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Error checking if SO_PASSCRED is enabled for socket: %s" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" + +#: ../gio/gunixconnection.c:478 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error enabling SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Expecting to read a single byte for receiving credentials but read zero bytes" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Not expecting control message, but got %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Error while disabling SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Error reading from UNIX: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Error closing UNIX: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Error writing to UNIX: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject or eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Can't find application" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Error reading from handle: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Error closing handle: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Error writing to handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Not enough memory" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Internal error: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Need more input" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Invalid compressed data" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Can't move directory over directory" + +#, 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 "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 "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.po b/po/en_GB.po new file mode 100644 index 0000000..5df2941 --- /dev/null +++ b/po/en_GB.po @@ -0,0 +1,4536 @@ +# English (British) translation. +# Copyright (C) 2004 glib's COPYRIGHT HOLDER +# This file is distributed under the same licence as the GLIB package. +# Gareth Owen 2004 +# Bruce Cowan , 2009, 2010, 2011, 2012. +# Philip Withnall , 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-18 18:34+0100\n" +"PO-Revision-Date: 2012-09-18 18:34+0100\n" +"Last-Translator: Bruce Cowan \n" +"Language-Team: British English \n" +"Language: en_GB\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: Virtaal 0.7.1\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Seek not supported on base stream" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Cannot truncate GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Truncate not supported on base stream" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Invalid object, not initialised" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Incomplete multibyte sequence in input" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Not enough space in destination" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Cancellable initialisation not supported" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversion from character set '%s' to '%s' is not supported" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Unknown type" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s filetype" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials is not implemented on this OS" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "There is no GCredentials support for your platform" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Unsupported key `%s' in address entry `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Meaningless key/value pair combination in address entry `%s'" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Error in address `%s': the port attribute is malformed" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Error in address `%s': the family attribute is malformed" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Address element `%s' does not contain a colon (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Error in address `%s': the Unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Error in address `%s': the host attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Error in address `%s': the port attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Error in address `%s': the noncefile attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Error auto-launching: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Unknown or unsupported transport `%s' for address `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error opening nonce file `%s': %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error reading from nonce file `%s': %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Error reading from nonce file `%s': expected 16 bytes, got %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Error writing contents of nonce file `%s' to stream:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "The given address is empty" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Cannot spawn a message bus when setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Cannot spawn a message bus without a machine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Error spawning command line `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Type any character to close this window)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Session dbus not running, and autolaunch failed" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Cannot determine session bus address (not implemented for this OS)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment " +"variable: unknown value `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Unknown bus type %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Unexpected lack of content trying to read a line" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Unexpected lack of content trying to (safely) read a line" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Error when getting information for directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error creating directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Error opening keyring `%s' for reading: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Didn't find cookie with ID %d in the keyring at `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error deleting stale lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error creating lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error closing (unlinked) lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error unlinking lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Error opening keyring `%s' for writing: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Additionally, releasing the lock for `%s' also failed: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "The connection is closed" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Timeout was reached" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Unsupported flags encountered when constructing a client-side connection" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Error setting property `%s': Expected type `%s' but got `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "No such property `%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Property `%s' is not readable" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Property `%s' is not writeable" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "No such interface `%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "No such interface" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No such interface `%s' on object at path %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "No such method `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Type of message, `%s', does not match expected type `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "An object is already exported for the interface %s at %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Method `%s' returned type `%s', but expected `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Method `%s' on interface `%s' with signature `%s' does not exist" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "A subtree is already exported for %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "type is INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL message: PATH or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Wanted to read %lu byte but got EOF" +msgstr[1] "Wanted to read %lu bytes but got EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Expected NUL byte after the string `%s' but found byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Parsed value `%s' is not a valid D-Bus object path" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Parsed value `%s' is not a valid D-Bus signature" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[1] "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Parsed value `%s' for variant is not a valid D-Bus signature" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Error deserialising GVariant with type string `%s' from the D-Bus wire format" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Invalid major protocol version. Expected 1 but found %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Signature header with signature `%s' found but message body is empty" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Parsed value `%s' is not a valid D-Bus signature (for body)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "No signature header in message but the message body is %u byte" +msgstr[1] "No signature header in message but the message body is %u bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Cannot deserialise message: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Error serialising GVariant with type string `%s' to the D-Bus wire format" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Cannot serialise message: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Message body has signature `%s' but there is no signature header" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Message body is empty but signature in the header field is `(%s)'" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Error return with body of type `%s'" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Error return with empty body" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Unable to get Hardware profile: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Error calling StartServiceByName for %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Unexpected reply %d from StartServiceByName(\"%s\") method" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstract name space not supported" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Cannot specify nonce file when creating a server" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error writing nonce file at `%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "The string `%s' is not a valid D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Cannot listen on unsupported transport `%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Error: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error parsing introspection XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Connect to the system bus" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Connect to the session bus" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Connect to given D-Bus address" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Connection Endpoint Options:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Options specifying the connection endpoint" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "No connection endpoint specified" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Multiple connection endpoints specified" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Warning: According to introspection data, interface `%s' does not exist\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Optional destination for signal (unique name)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Object path to emit signal on" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signal and interface name" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Emit a signal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Error connecting: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: object path not specified.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: %s is not a valid object path\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: signal not specified.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Error: signal must be the fully-qualified name.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s is not a valid interface name\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s is not a valid member name\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s is not a valid unique bus name.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error parsing parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error flushing connection: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Destination name to invoke method on" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Object path to invoke method on" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Method and interface name" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Timeout in seconds" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Invoke a method on a remote object." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: Destination is not specified\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: Object path is not specified\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: Method name is not specified\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: Method name `%s' is invalid\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Error parsing parameter %d of type `%s': %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Destination name to introspect" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Object path to introspect" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Print XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspect children" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Only print properties" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspect a remote object." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Destination name to monitor" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Object path to monitor" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Monitor a remote object." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Unnamed" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Application information lacks an identifier" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drive doesn't implement eject or eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "drive doesn't implement polling for media" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "drive doesn't implement start" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS support is not available" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Can't handle version %d of GEmblem encoding" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Malformed number of tokens (%d) in GEmblem encoding" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Can't handle version %d of GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Expected a GEmblem for GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Target file exists" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Splice not supported" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error splicing file: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Can't copy special file" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Wastebasket not supported" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Wrong number of tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "No type for class name %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s does not implement the GIcon interface" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is not classed" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Malformed version number: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Can't handle the supplied version of the icon encoding" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "No address specified" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Length %u is too long for address" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Address has bits set beyond prefix length" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Could not parse '%s' as IP address mask" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Not enough space for socket address" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Unsupported socket address" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> not allowed inside <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> not allowed at the top level" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "File %s appears multiple times in the resource" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Failed to locate '%s' in any source directory" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Failed to locate '%s' in current directory" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Unknown processing option \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Failed to create temp file: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Error processing input file with xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Error processing input file with to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Error reading file %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Error compressing file %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text may not appear inside <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "name of the output file" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"The directories where files are to be read from (default to current " +"directory)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Generate output in the format selected for by the target filename extension" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Generate source header" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Generate sourcecode used to link in the resource file into your code" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Generate dependency list" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Don't automatically create and register resource" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "C identifier name used for the generated source code" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "You should give exactly one file name\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "empty names are not permitted" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "invalid name '%s': names must begin with a lowercase letter" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "invalid name '%s': two successive hyphens ('--') are not permitted." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "invalid name '%s': the last character may not be a hyphen ('-')." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "invalid name '%s': maximum length is 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "cannot add keys to a 'list-of' schema" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" shadows in ; use " +"to modify value" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> not (yet) defined." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "invalid GVariant type string '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " given but schema isn't extending anything" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "no to override" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " extends not-yet-existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " is list of not-yet-existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Can not be a list of a schema with a path" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Can not extend a schema with a path" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" is a list, extending which is not a list" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" extends but '%s' " +"does not extend '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "a path, if given, must begin and end with a slash" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "the path of a list must end with ':/'" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> already specified" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> not allowed at the top level" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "This entire file has been ignored.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoring this file.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "No such key `%s' in schema `%s' as specified in override file `%s'" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " and --strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "where to store the gschemas.compiled file" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Abort on any errors in schemas" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Do not write the gschema.compiled file" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Do not enforce key name restrictions" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "You should give exactly one directory name\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "No schema files found: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "doing nothing.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "removed existing output file.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Can't rename file, filename already exists" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error moving file to wastebasket: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create wastebasket dir %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for wastebasket" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create wastebasket directory" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create wastebasket info file: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to move file to the wastebasket: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "internal error" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error creating directory: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filesystem does not support symbolic links" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Error when getting information for file '%s': %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Error when getting information for file descriptor: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Cannot set permissions on symlinks" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting modification or access time: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context must be non-NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting SELinux context: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is not enabled on this system" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error removing old file: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Requested seek before the beginning of the stream" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostname '%s' contains '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Network unreachable" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Host unreachable" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Could not create network monitor: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Could not create network monitor: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Could not get network status: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error resolving '%s': %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reverse-resolving '%s': %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "No DNS record of the requested type for '%s'" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporarily unable to resolve '%s'" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error resolving '%s'" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Incomplete data received for '%s'" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "The resource at '%s' does not exist" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "The resource at '%s' failed to decompress" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "The resource at '%s' is not a directory" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Input stream doesn't implement seek" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Print help" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "List sections containing resources in an elf FILE" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extract a resource file to stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Unknown command %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS…]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Arguments:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION An (optional) elf section name\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND The (optional) command to explain\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE An elf file (a binary or a shared library)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH An (optional) resource path (may be partial)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH A resource path\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No such schema '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema '%s' is not relocatable (path must not be specified)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema '%s' is relocatable (path must be specified)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Empty path given.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Path must begin with a slash (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Path must end with a slash (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Path must not contain two adjacent slashes (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "No such key '%s'\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "The provided value is outside of the valid range\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "List the installed (non-relocatable) schemas" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "List the installed relocatable schemas" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "List the keys in SCHEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "List the children of SCHEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Get the value of KEY" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Query the range of valid values for KEY" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Set the value of KEY to VALUE" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Reset KEY to its default value" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reset all keys in SCHEMA to their defaults" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Check if KEY is writable" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS…]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR A directory to search for additional schemas\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY The (optional) key within the schema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY The key within the schema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE The value to set\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Empty schema name given\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Invalid socket, not initialised" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Invalid socket, initialisation failed due to: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket is already closed" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Socket I/O timed out" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creating GSocket from fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create socket: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Unknown family was specified" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Unknown protocol was specified" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "could not get local address: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "could not get remote address: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "could not listen: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error binding to address: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Error joining multicast group: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Error leaving multicast group: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "No support for source-specific multicast" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error accepting connection: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Connection in progress" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to get pending error: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error receiving data: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Error sending data: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Unable to shutdown socket: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error closing socket: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Waiting for socket condition: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Error sending message: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage not supported on Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error receiving message: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials not implemented for this OS" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Could not connect to proxy server %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Could not connect to %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Could not connect: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Unknown error on connect" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proxying over a non-TCP connection is not supported." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy protocol '%s' is not supported." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener is already closed" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Added socket is closed" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 does not support IPv6 address '%s'" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Username is too long for SOCKSv4 protocol" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Hostname '%s' is too long for SOCKSv4 protocol" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "The server is not a SOCKSv4 proxy server." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Connection through SOCKSv4 server was rejected" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "The server is not a SOCKSv5 proxy server." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "The SOCKSv5 proxy requires authentication." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Username or password is too long for SOCKSv5 protocol." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 authentication failed due to wrong username or password." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Hostname '%s' is too long for SOCKSv5 protocol" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "The SOCKSv5 proxy server uses unknown address type." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Internal SOCKSv5 proxy server error." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 connection not allowed by ruleset." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host unreachable through SOCKSv5 server." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Network unreachable through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Connection refused through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy does not support 'connect' command." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy does not support provided address type." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Unknown SOCKSv5 proxy error." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Can't handle version %d of GThemedIcon encoding" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Cannot decrypt PEM-encoded private key" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "No PEM-encoded private key found" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Could not parse PEM-encoded private key" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "No PEM-encoded certificate found" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Could not parse PEM-encoded certificate" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"This is the last chance to enter the password correctly before your access " +"is locked out." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "The password entered is incorrect." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Expecting 1 control message, got %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Unexpected type of ancillary data" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Expecting one fd, but got %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Received invalid fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Error sending credentials: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Error checking if SO_PASSCRED is enabled for socket: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error enabling SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Expecting to read a single byte for receiving credentials but read zero bytes" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Not expecting control message, but got %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Error while disabling SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Error reading from file descriptor: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Error closing file descriptor: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Error writing to file descriptor: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject or eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Can't find application" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Error reading from handle: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Error closing handle: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Error writing to handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Not enough memory" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Internal error: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Need more input" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Invalid compressed data" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Address to listen on" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignored, for compat with GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Print address" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Print address in shell mode" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Run a dbus service" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Wrong args\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s', tag '%s' expected" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %Y %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%l:%M:%S %P" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "January" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "February" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "March" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "June" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "July" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "August" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "October" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "December" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Oct" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Monday" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Tuesday" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Wednesday" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Thursday" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Friday" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Saturday" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sunday" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Mon" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Tue" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Wed" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Thu" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Fri" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sat" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sun" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" is too large" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fflush() failed: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fsync() failed: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' doesn't contain XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Symbolic links not supported" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Leftover unconverted data in read buffer" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Channel terminates in a partial character" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Key '%s' in group '%s' has value '%s' where %s was expected" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Failed to map %s%s%s%s: mmap() failed: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is not a valid name " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is not a valid name: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Empty entity '&;' seen; valid entities are: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%-.*s' is not known" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Usage:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Help Options:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Show help options" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Show all help options" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Application Options:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing argument for %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "corrupted object" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "out of memory" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: ../glib/gregex.c:288 +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:297 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "bad offset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "short utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "recursion loop" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "unknown error" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "unrecognised character following \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "unrecognised character after (? or (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regular expression is too large" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") without opening (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "code overflow" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "unrecognised character after (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{…} sequence is too large" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "unrecognised character after (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "a numbered reference must not be zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) not recognised" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "number is too big" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "missing subpattern name after (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "digit expected after (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] is an invalid data character in JavaScript compatibility mode" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "different names for subpatterns of the same number are not allowed" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) must have an argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c must be followed by an ASCII character" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k is not followed by a braced, angle-bracketed, or quoted name" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N is not supported in a class" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "too many forward references" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "character value in \\u.... sequence is too large" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE library is compiled with incompatible options" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimising regular expression %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "digit expected" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text doesn't begin with a quotation mark" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Unexpected error in waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Child process exited with code %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Child process killed by signal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Child process stopped by signal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Child process exited abnormally" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Failed to execute child process (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Invalid program name: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Invalid string in argument vector at %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Abnormal program termination when spawning command line `%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Command line `%s' exited with non-zero exit status %d: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "No service record for '%s'" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "workspace limit for empty substrings reached" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "repeating a DEFINE group is not allowed" + +#~ msgid "File is empty" +#~ msgstr "File is empty" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "This option will be removed soon." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Error stating file '%s': %s" + +#~ msgid "Error connecting: " +#~ msgstr "Error connecting: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Error connecting: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 implementation limits username to %i characters" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a implementation limits hostname to %i characters" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Error reading from Unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Error closing Unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Error writing to Unix: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Type of return value is incorrect: got `%s', expected `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writeable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Specify the path for the schema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Arguments:\n" +#~ " SCHEMA The ID of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set the key to, as a serialised GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Key %s is not writeable\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "No such schema `%s' specified in override file `%s'" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Can't move directory over directory" + +#~ 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 "" +#~ "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 "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.po b/po/eo.po new file mode 100644 index 0000000..3b8be25 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,4225 @@ +# Esperanto translation for glib. +# Copyright (C) 2003-2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Charles VOELGER , 2003. +# Joop EGGEN < <, 2006. +# Brian CROOM < >, 2008. +# Manuel < >, 2010. +# Ryan Lortie , 2011. +# Tiffany Antopolski , 2011, 2012. +# Kristjan SCHMIDT , 2010, 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.3.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-03-09 21:19+0000\n" +"PO-Revision-Date: 2012-03-11 12:01+0100\n" +"Last-Translator: Kristjan SCHMIDT \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Virtaal 0.7.1\n" +"X-Launchpad-Export-Date: 2011-05-15 07:40+0000\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Tro granda nombra valoro transdonita al %s" + +#: ../gio/gbufferedinputstream.c:882 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "Fluo estas jam fermita" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1834 +#: ../gio/gdbusconnection.c:1925 ../gio/gdbusconnection.c:2099 +#: ../gio/gdbusprivate.c:1413 ../gio/glocalfile.c:2133 +#: ../gio/gsimpleasyncresult.c:810 ../gio/gsimpleasyncresult.c:836 +#, c-format +msgid "Operation was cancelled" +msgstr "Operacio rezignita" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Nevalida objekto, ne pravalorizita" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Nekompleta plurbajta sekvenco en enigo" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Ne sufiĉa spaco en la cel-loko" + +#: ../gio/gcharsetconverter.c:345 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Nevalida bajtosekvenco en konverta enigo" + +#: ../gio/gcharsetconverter.c:350 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Eraro dum la konverto: %s" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:954 +msgid "Cancellable initialization not supported" +msgstr "Rezignebla pravalorizo ne estas subtenata" + +#: ../gio/gcharsetconverter.c:458 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konverto de signaro '%s' al '%s' ne estas subtenata" + +#: ../gio/gcharsetconverter.c:462 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne eblas malfermi konvertilon de '%s' al '%s'" + +#: ../gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "Nekonata tipo" + +#: ../gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s dosierotipo" + +#: ../gio/gcontenttype.c:680 +#, c-format +msgid "%s type" +msgstr "%s tipo" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ne estas realigita sur ĉi tiu operaciumo" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Estas neniu subteno por GCredentials por via platformo" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neatendata frua flufino" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nesubtenata ŝlosilo `%s' en adresenigo `%s'" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adreso `%s' estas malvalida (bezonas precize unu el 'path', 'tmpdir' aÅ­ " +"'abstract' ŝlosiloj) " + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Sensignifa ŝlosilo/valoro parokombinaĵo en adresa enigo `%s'" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Eraro en adreso `%s' - la 'port' atributo estas misformita" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Eraro en adreso `%s' - la 'family' atributo estas misformita" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Adresa elemento `%s', ne havas dupunkton (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"Ŝlosilo/valoro paro %d, `%s', en adresa elemento `%s', ne havas egalsignon" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Eraro dum malkodŝanĝo de la ŝlosilo aÅ­ la valoro en ŝlosilo/valoro paro %d, `" +"%s', en adresa elemento `%s'" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Eraro en adreso `%s' - la uniksa transporto bezonas precize unu de la " +"ŝlosiloj `path' aÅ­ `abstract' esti agordita" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Eraro en adreso `%s' - la 'host' atributo mankas aÅ­ estas misformita" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Eraro en adreso `%s' - la 'port' atributo estas maka aÅ­ estas misformita" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Eraro en adreso `%s' - la 'noncefile' atributo mankas aÅ­ estas misformita" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Eraro dum aÅ­tolanĉo:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Nekonata aÅ­ nesubtenata transporto `%s' por adreso `%s'" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Eraro dum malfermo de dosiero 'nonce' `%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Eraro dum legado de dosiero 'nonce' `%s':%s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Eraro dum legado de dosiero nonce `%s', 16 baitoj atendita, akirita %d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Eraro dum skribado de enhavo de dosiero nonce `%s' al la fluo:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "La donita adreso estas malplena" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ne eblas starti mesaĝan buson sen maŝino-identigo:" + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Eraro dum starto de la komanda linio `%s':" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Nenormala programfiniĝo dum starto de komanda linio `%s': %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Komanda linio `%s' elirinta kun nenula elira kodo %d: %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Ne eblas determini seancobusan adreson (ne estas realigita por ĉi tiu " +"operaciumo)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6688 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Ne eblas determi busadreson per DBUS_STARTER_BUS_TYPE medivariablo - " +"nekonata valoron `%s'" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6697 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Ne eblas determi busadreso ĉar la DBUS_STARTER_BUS_TYPE medivariable ne " +"estas agordita" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "Nekonata bustipo %d" + +#: ../gio/gdbusauth.c:287 +msgid "Unexpected lack of content trying to read a line" +msgstr "Neatendita manko de enhavo kiam provas legi linion" + +#: ../gio/gdbusauth.c:331 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Neatendita manko de enhavo kiam provas legi (sekure) linion" + +#: ../gio/gdbusauth.c:502 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Eluzis ĉiujn haveblajn aÅ­tentigajn metodojn (provinta: %s) (havebla: %s)" + +#: ../gio/gdbusauth.c:1158 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Resignita per GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Eraro dum akiro de informo de dosierujo `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Permesoj sur dosierujo `%s' estas misformitaj. Atendita reĝimo 0700, akirita " +"0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Eraro dum kreo de la dosierujo `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Eraro dum malfermo de la ŝlosiloringo `%s' por legi:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Linio %d de la ŝlosiloringo al `%s' kun enhavo `%s' estas misformita" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Unua ĵetono de linio %d de la ŝlosiloringo al `%s' kun enhavo `%s' estas " +"misformita" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Dua ĵetono de linio %d de la ŝlosiloringo al `%s' kun enhavo `%s' estas " +"misformita" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Ne trovas kuketon kun identigo %d en la ŝlosiloringo ĉe `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Eraro dum forigo de la malnova ŝlosdosiero `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Eraro dum kreo de la ŝlosdosiero `%s':%s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Eraro dum fermo de la (malligita) ŝlosdosiero `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Eraro dum malligado de la ŝlosdosiero `%s':%s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Eraro dum malfermo de ŝlosiringo `%s' por skribi: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Cetere, liberigo de la seruro por `%s' ankaÅ­ ne sukcesis: %s)" + +#: ../gio/gdbusconnection.c:594 ../gio/gdbusconnection.c:2402 +msgid "The connection is closed" +msgstr "La konekto estas fermita" + +#: ../gio/gdbusconnection.c:1879 +msgid "Timeout was reached" +msgstr "Tempolimo estis atingita" + +#: ../gio/gdbusconnection.c:2524 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Nesubtenataj flagoj renkontitaj dum kreo de klientflanka konekto" + +#: ../gio/gdbusconnection.c:4026 ../gio/gdbusconnection.c:4342 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Neniu tia interfaco `org.freedesktop.DBus.Properties' en objekto en vojo %s" + +#: ../gio/gdbusconnection.c:4097 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Eraro dum agordado de la atributo `%s': Atendita tipo `%s' sed akiris `%s'" + +#: ../gio/gdbusconnection.c:4192 +#, c-format +msgid "No such property `%s'" +msgstr "Neniu tia atributo `%s'" + +#: ../gio/gdbusconnection.c:4204 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Atributo `%s' ne estas legebla" + +#: ../gio/gdbusconnection.c:4215 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Atributo `%s' ne estas skribebla" + +#: ../gio/gdbusconnection.c:4285 ../gio/gdbusconnection.c:6131 +#, c-format +msgid "No such interface `%s'" +msgstr "Neniu tia interfaco `%s' " + +#: ../gio/gdbusconnection.c:4469 +msgid "No such interface" +msgstr "Neniu tia interfaco" + +#: ../gio/gdbusconnection.c:4690 ../gio/gdbusconnection.c:6637 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Neniu tia interfaco `%s' sur objekto en vojo %s" + +#: ../gio/gdbusconnection.c:4742 +#, c-format +msgid "No such method `%s'" +msgstr "Neniu tia metodo `%s'" + +#: ../gio/gdbusconnection.c:4773 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Tipo de mesaĝo, `%s', ne kongruas kun la atendita tipo `%s'" + +#: ../gio/gdbusconnection.c:4993 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Objekto jam estas elportita por la interfaco %s ĉe %s" + +#: ../gio/gdbusconnection.c:5191 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metodo `%s' redonis tipo `%s', sed estis atendata `%s' `" + +#: ../gio/gdbusconnection.c:6242 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metodo `%s' sur interfaco `%s' kun subskribo `%s' ne existas" + +#: ../gio/gdbusconnection.c:6361 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Subarbo estas jam elportita por %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tipo estas NEVALIDA" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METODO_VOKO mesaĝo: VOJO aÅ­ MEMBRO kapo-kampo mankas" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METOD_REVENO mesaĝo: RESPONDO_SERI0 kapo-kampo mankas" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERARMESAĜO: RESPONDO_SERIO kapo-kampo aÅ­ ERARO_NOMO mankas" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNALMESAĜO: VOJO, INTERFACO or MEMBRO kapo-kampo mankas" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNALMESAĜO: La VOJO-a kapo-kampo uzas la valoron reservitan org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNALMESAĜO: La kapo-kampo INTERFACO uzas la valoron reservitan org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Volis legi %lu bajto sed akiris EOF" +msgstr[1] "Volis legi %lu bajtoj sed akiris EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Atendis validan UTF-8 ĉenon sed trovitaj nevalidaj bajtoj ĉe bajto deŝovo %d " +"(longeco de ĉeno estas %d). La valida UTF-8 ĉeno ĝis tiu punkto estis `%s' " + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Atendita NUL bajto post la ĉeno `%s' sed trovita bajto %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Analizita valoro `%s' ne estas valida D-Bus objektovojo" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Analizita valoro `%s' ne estas valida D-Busa subskribo" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Renkontis matricon de longeco %u bajto. Maksimumo estas 2<<26 bajtoj (64 " +"MiB)." +msgstr[1] "" +"Renkontis matricon de longeco %u bajtoj. Maksimumo estas 2<<26 bajtoj (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Analizita valoro `%s' por variaĵo ne estas valida D-Busa subskribo" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Eraro dum malseriigo de GVariant kun tipo ĉeno `%s' de la D-Buso dratoformo" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Nevalida pezekstrem('endianness')-valoro. Atendita 0x6c ('l') aÅ­ 0x42 ('B') " +"sed trovas valoron 0x%02x" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Nevalida ĉefprotokolo versio. Atendita 1 sed trovita %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Subskriba kapo kun subskribo `%s' estis trovita sed korpo de mesaĝo estas " +"malplena" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Analizita valoro `%s' ne estas valida D-Bus subskribo (por korpo)" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Ne estas subskriba kapo en mesaĝo sed la korpo de mesaĝo estas %u bajtoj" +msgstr[1] "" +"Ne estas subskriba kapo en mesaĝo sed la korpo de mesaĝo estas %u bajtoj" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Ne eblas malseriigi mesaĝon:" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Eraro dum seriigo de GVariant kun tipoĉeno `%s' al la D-Buso dratoformo" + +#: ../gio/gdbusmessage.c:2304 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Mesaĝo havas %d dosiernumerojn sed la kapo-kampo indikas %d dosiernumeroj" + +#: ../gio/gdbusmessage.c:2312 +msgid "Cannot serialize message: " +msgstr "Ne eblas seriigi mesaĝon: " + +#: ../gio/gdbusmessage.c:2356 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Korpo de mesaĝo havas subskribon `%s' sed ne estas iu subskribokapo" + +#: ../gio/gdbusmessage.c:2366 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Korpo de mesaĝo havas tipon `%s' sed tipo en la mesaĝokapo estas `%s'" + +#: ../gio/gdbusmessage.c:2382 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Korpo de mesaĝo estas malplena sed tipo en la masaĝokapo estas `(%s)'" + +#: ../gio/gdbusmessage.c:2939 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Erara reveno kun korpo de tipo `%s'" + +#: ../gio/gdbusmessage.c:2947 +msgid "Error return with empty body" +msgstr "Erara reveno kun malplena korpo" + +#: ../gio/gdbusprivate.c:2065 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Ne eblas ŝargi na /var/lib/dbus/machine-id aÅ­ /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Eraro dum voko de StartServiceByName por %s:" + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Neatendata respondo %d de StartServiceByName(\"%s\") metodo" + +#: ../gio/gdbusproxy.c:2726 ../gio/gdbusproxy.c:2860 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Ne eblas envoki metodon; prokurilo estas por bonkonata nomo sen posedanto " +"kaj prokurilo estis kreita kun la G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flago" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakta nomspaco nesubtenatas" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Ne eblas specifi 'nonce'-dosieron dum kreo de servilo" + +#: ../gio/gdbusserver.c:872 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Eraro dum skribo de 'nonce'-dosiero ĉe `%s': %s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La ĉeno `%s' ne estas valida D-Bus GUID" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Ne eblas aÅ­skulti sur nesubtenata transporto `%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMANDO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Komandoj:\n" +" help Montri ĉi tiu informojn\n" +" introspect Introspekti foran objekton\n" +" monitor Kontroladi foran objekton\n" +" call Envoki metodon sur foran objekto\n" +" emit Sendi signalon\n" +"\n" +"Uzi \"%s KOMANDON --help\" por akiri helpon pri ĉiu komando.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Eraro: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Eraro analizanta introspektan XML-datumaron: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Konekti al la systemabuso" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Konekti al la seanca buso" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Konekti al donita D-Buso adreso" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opcioj de konekta finpunkto:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opcioj specifantaj la konektan finpunkton" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Ne konekta finpunkto specifita" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Multoblaj konektaj finpunktoj specifitaj" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Averto: LaÅ­ introspekta datumaro, interfaco `%s' ne ekzistas\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Averto: LaÅ­ introspekta datumaro, metodo `%s' ne ekzistas sur interfaco `" +"%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Malnepra celo por signalo (unika nomo)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objektovojo por sendi signalon sur" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signalo kaj interfaco nomo" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Sendi signalon." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Konekt-eraro: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Eraro: objektovojo ne specifita.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Eraro: %s ne estas valida objekto-vojo\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Eraro: signalo ne specifita.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Eraro: '%s' ne estas valida interfaco-nomo\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' ne estas valida membro-nomo\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' ne estas valida unika buso-nomo\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Eraro dum sintaksa analizo de la parametro %d: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Eraro dum elbufrigo de la konekto: %s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Nomo de celvojo por envoki sur ĝin metodon" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Vojo al objekto por envoki sur ĝin metodon" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Metodo- kaj interfaco-nomo" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Tempolimo en sekundoj" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Envoki metodon sur fora objekto." + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Eraro: Celzono ne estas specifita\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Eraro: Objektvojo ne estas specifita\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Eraro: Metodonomo ne estas specifita\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Eraro: Metodonomo`%s' estas nevalida\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Eraro dum sintaksa analizo de la parametro %d de tipo `%s': %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Nomo de celo por introspekti" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Objektvojo por introspekti" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Presi XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Introspekti idoj" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Nur presi agordojn" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Introspekti foran objekton." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Nomo de celo de kontrolota" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Vojo de kontrolota objekto" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Kontroli foran objekton." + +#: ../gio/gdesktopappinfo.c:575 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sennoma" + +#: ../gio/gdesktopappinfo.c:988 +msgid "Desktop file didn't specify Exec field" +msgstr "Labortabla dosiero ne specifis Exec-kampon" + +#: ../gio/gdesktopappinfo.c:1276 +msgid "Unable to find terminal required for application" +msgstr "Ne eblas trovi terminalon bezonata por aplikaĵo" + +#: ../gio/gdesktopappinfo.c:1563 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Ne eblas krei uzanto-aplikaĵan agordodosierujon %s: %s" + +#: ../gio/gdesktopappinfo.c:1567 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Ne eblas krei por uzanto MIME-an agordodosierujon %s: %s" + +#: ../gio/gdesktopappinfo.c:1807 ../gio/gdesktopappinfo.c:1831 +msgid "Application information lacks an identifier" +msgstr "Mankas identigilo en la aplikaĵaj informoj" + +#: ../gio/gdesktopappinfo.c:2055 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ne eblas krei por uzanto labortablan dosieron %s" + +#: ../gio/gdesktopappinfo.c:2171 +#, c-format +msgid "Custom definition for %s" +msgstr "Propra difino por %s" + +#: ../gio/gdrive.c:363 +msgid "drive doesn't implement eject" +msgstr "diskingo ne realigas elĵeton" + +#. 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 "diskingo ne realigas 'eject' aÅ­ eject_with_operation" + +#: ../gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "diskingo ne realigas demandadon pri datumportiloj" + +#: ../gio/gdrive.c:728 +msgid "drive doesn't implement start" +msgstr "diskingo ne realigas start (starton)" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "diskingo ne realigas stop (halton)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS subteno ne estas havebla" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ne eblas trakti version %d de GEmblem kodoprezento" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Misformita nombro da ĵetonoj (%d) en GEmblem kodoprezento" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ne eblas trakti version %d de GEmblemedIcon kodoprezento" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Misformita nombro da ĵetonoj (%d) en GEmblemedIcon kodoprezento" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Atendis GEmblem por GEmblemedIcon" + +#: ../gio/gfile.c:874 ../gio/gfile.c:1105 ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 ../gio/gfile.c:1531 ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 ../gio/gfile.c:1726 ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 ../gio/gfile.c:3312 ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 ../gio/gfile.c:3541 ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 ../gio/gfile.c:4359 ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 ../gio/gfile.c:4633 ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 ../gio/gfile.c:5315 ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 ../gio/gfile.c:7098 ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +msgid "Operation not supported" +msgstr "Operacio ne estas subtenata" + +#. 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:1361 ../gio/glocalfile.c:1070 ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "Enhavantan munton ne ekzistas" + +#: ../gio/gfile.c:2414 ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "Ne eblas kopii super dosierujo" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "Ne eblas kopii dosierujon super dosierujo" + +#: ../gio/gfile.c:2483 ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "Celdosiero jam ekzistas" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "Ne eblas rikure kopii dosierujon" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "Splisi ne subtenata" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "Eraro dum splisado de la dosiero: %s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "Ne eblas kopii specialan dosieron" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "Invalida simligila valoro donita" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "Rubujo ne estas subtenata" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dosiernomoj ne povas enhavi '%c'" + +#: ../gio/gfile.c:6067 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "datumportilo ne realigas 'mount'" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "Neniu aplikaĵo estas registrita kiel traktilo por ĉi tiu dosiero" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumeraciilo estas fermita" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Dosierenumeraciilo havas restantan operacion" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Dosierenumeraciilo jam estas fermita" + +#: ../gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Ne eblas trakti version %d de GFileIcon-kodoprezento" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Esti misformita eniga datumaro por GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Fluo ne subtenas query_info-on" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Serĉo ne estas subtenata en fluo" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Trunki ne permesita en eniga fluo" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Trunki ne permesita en fluo" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Malĝusta nombro de ĵetonoj (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Neniu tipo por klasnomo %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipo %s ne realigas la GIcon interfaco" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipo %s ne estas klasata" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Misformita versionumero: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tipo %s ne realigas from_tokens() sur la GIcon Interfaco" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Ne eblas trakti la provizitan version de bildsimbolo kodoprezento" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Neniu adreso specifita" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Longeco %u estas tro longa por adreso" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Ne eblas analizi na '%s' kiel IP-adresa masko" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Ne sufiĉa spaco por kontaktskatolo adreso" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nesubtenata kontaktskatolo adreso" + +#: ../gio/ginputstream.c:194 +msgid "Input stream doesn't implement read" +msgstr "Eniga fluo ne realigas legon" + +#. 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:898 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "Fluo havas restantan operacion" + +#: ../gio/glib-compile-resources.c:144 ../gio/glib-compile-schemas.c:1449 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elemento <%s> ne estas permesita interne de <%s>" + +#: ../gio/glib-compile-resources.c:148 ../gio/glib-compile-schemas.c:1453 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elemento <%s> ne estas permesita je plejsupre nivelo" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +#| msgid "Failed to change to directory '%s' (%s)" +msgid "Failed to locate '%s' in current directory" +msgstr "Malsukcesis trovi na '%s' en aktuala dosierujo" + +#: ../gio/glib-compile-resources.c:287 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Nekonata opcio de traktado \"%s\"" + +#: ../gio/glib-compile-resources.c:305 ../gio/glib-compile-resources.c:363 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Malsukcesis krei dosieron: %s" + +#: ../gio/glib-compile-resources.c:335 +#| msgid "Error setting symlink: file is not a symlink" +msgid "Error processing input file with xmllint" +msgstr "Eraro dum traktado de enig-dosiero per 'xmllint'" + +#: ../gio/glib-compile-resources.c:390 +msgid "Error processing input file with to-pixdata" +msgstr "" + +#: ../gio/glib-compile-resources.c:403 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Eraro dum legado de la dosiero %s: %s" + +#: ../gio/glib-compile-resources.c:423 +#, c-format +#| msgid "Error opening file: %s" +msgid "Error compressing file %s" +msgstr "Eraro dum kompaktigo de dosiero: %s" + +#: ../gio/glib-compile-resources.c:487 ../gio/glib-compile-schemas.c:1561 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "teksto ne povi montriĝas interne de <%s>" + +#: ../gio/glib-compile-resources.c:610 +msgid "name of the output file" +msgstr "nomo de la elig-dosiero" + +#: ../gio/glib-compile-resources.c:610 ../gio/glib-compile-resources.c:643 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "DOSIERO" + +#: ../gio/glib-compile-resources.c:611 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-schemas.c:1989 +#: ../gio/glib-compile-schemas.c:2019 +msgid "DIRECTORY" +msgstr "DOSIERUJO" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate dependency list" +msgstr "Generi liston de dependeco" + +#: ../gio/glib-compile-resources.c:616 +msgid "Don't automatically create and register resource" +msgstr "Ne aÅ­tomate generi aÅ­ registri risurcon" + +#: ../gio/glib-compile-resources.c:617 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:646 +#| msgid "" +#| "Compile all GSettings schema files into a schema cache.\n" +#| "Schema files are required to have the extension .gschema.xml,\n" +#| "and the cache file is called gschemas.compiled." +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompili risurcan specifigon al risurca dosiero.\n" +"Risurca specifiga dosiero havas la sufikson .gresource.xml,\n" +"kaj la risurca dosiero estas nomita .gresource." + +#: ../gio/glib-compile-resources.c:662 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Vi devus doni precize unu dosieran nomon\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "Malplenaj nomoj ne estas permesataj" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nevalida nomo '%s': nomoj devas komenciĝi per minusklo" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"nevalida nomo '%s: nevalida karaktro '%c'; nur minuskloj, nombroj kaj " +"streketo ('-') permesataj." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "nevalida nomo '%s': du sinsekvaj streketoj ('--') ne permesataj." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "nevalida nomo '%s': la fina karaktro ne povas esti streketo ('-')." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nevalida nomo '%s': maksimuma longeco estas 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " already specified" +msgstr " shadows in ; use " +"to modify value" +msgstr "" +" kaŝas en ; uzu " +"por modifi valoron" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"Precize unu el 'type', 'enum' aÅ­ 'flags' devas esti specifita kiel atributo " +"de " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> ne (jam) difinita." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Nevalida GVariant tipo-ĉeno '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " donita sed skemo ne etendanta io" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "neniu por superregi" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " already specified" +msgstr " jam specifita" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " etendas skemo '%s' kiu ankoraÅ­ ne ekzistas" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " estas listo de skemo '%s' kiu ankoraÅ­ ne ekzistas" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Ne eblas esti listo de skemo kun vojo" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Ne eblas etendi liston de skemo kun vojo" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" estas listo, etendanta kiu ne estas listo" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" etendas sed '%s' " +"ne etendas '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "vojo, se donita, devas komenciĝi kaj finiĝi kun oblikvo" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "la vojo de listo devas finiĝi en ':/'" + +#: ../gio/glib-compile-schemas.c:1229 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> jam specifita" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1747 ../gio/glib-compile-schemas.c:1818 +#: ../gio/glib-compile-schemas.c:1894 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict estis specifita; eliranta.\n" + +#: ../gio/glib-compile-schemas.c:1755 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Ĉi tiu tuta dosiero estas ignorita. \n" + +#: ../gio/glib-compile-schemas.c:1814 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoras ĉi tiun dosieron.\n" + +#: ../gio/glib-compile-schemas.c:1854 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Neniu tia ŝlosilo `%s' en skemo `%s' kiel estas specifite en superrego-" +"dosiero `%s'" + +#: ../gio/glib-compile-schemas.c:1860 ../gio/glib-compile-schemas.c:1918 +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoras superrego por ĉi tiu ŝlosilo.\n" + +#: ../gio/glib-compile-schemas.c:1864 ../gio/glib-compile-schemas.c:1922 +#: ../gio/glib-compile-schemas.c:1950 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " kaj --strict estis specifita; eliranta.\n" + +#: ../gio/glib-compile-schemas.c:1880 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"Eraro dum sintaksa analizo de la ŝlosilo `%s' en skemo `%s' kiel estas " +"specifita en superrego-dosiero `%s': %s." + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoras superregon por ĉi tiu ŝlosilo.\n" + +#: ../gio/glib-compile-schemas.c:1908 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"superrego por ŝlosilo `%s' en skemo `%s' en superrego-dosiero `%s' ne estas " +"en la intervalo donita en la skemo" + +#: ../gio/glib-compile-schemas.c:1936 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"superrego por ŝlosilo `%s' en skemo `%s' en superrego-dosiero `%s' ne estas " +"en la listo de la validaj elektoj" + +#: ../gio/glib-compile-schemas.c:1989 +msgid "where to store the gschemas.compiled file" +msgstr "kie enmemorigi la gschema.compiled dosieron" + +#: ../gio/glib-compile-schemas.c:1990 +msgid "Abort on any errors in schemas" +msgstr "Ĉesigi se iuj eraroj en skemoj" + +#: ../gio/glib-compile-schemas.c:1991 +msgid "Do not write the gschema.compiled file" +msgstr "Ne verki na la gschema.compiled dosieron" + +#: ../gio/glib-compile-schemas.c:1992 +msgid "Do not enforce key name restrictions" +msgstr "Ne devigi ŝlosilonomajn limigojn" + +#: ../gio/glib-compile-schemas.c:2022 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompili ciujn GSettings skemajn dosierojn en skema kaŝmemoro.\n" +"Skemaj dosieroj estas bezonas havi la sufikson .gschema.xml,\n" +"kaj la kaŝmemora dosiero estas nomita gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2038 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Vi devus doni precize unu dosierujan nomon\n" + +#: ../gio/glib-compile-schemas.c:2077 +#, c-format +msgid "No schema files found: " +msgstr "Neniuj skemaj dosieroj trovitaj:" + +#: ../gio/glib-compile-schemas.c:2080 +#, c-format +msgid "doing nothing.\n" +msgstr "faranta nenion.\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "removed existing output file.\n" +msgstr "Forigis ekzistantan eliran dosieron.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Ne eblas trovi defaÅ­ltan tipon de loka dosieruja kontrolado" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nevalida dosiernomo %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Eraro dum akiro de dosiersistema informo: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "Ne eblas alinomi radikan dosierujon" + +#: ../gio/glocalfile.c:1136 ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "Eraro dum alinomo de la dosiero: %s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "Ne eblas alinomi dosieron, dosiernomo jam ekzistas" + +#: ../gio/glocalfile.c:1158 ../gio/glocalfile.c:2162 ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nevalida dosiernomo" + +#: ../gio/glocalfile.c:1325 ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "Ne eblas malfermi dosierujon" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "Eraro dum malfermo de la dosiero: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "Eraro dum forigo de la dosiero: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "Eraro dum forŝovo de la dosiero: %s al la rubujo" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ne eblas krei rubujan dosierujon %s: %s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "Ne eblas trovi plejsupra-nivelan dosierujon por rubujo" + +#: ../gio/glocalfile.c:1964 ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "Ne eblas trovi aÅ­ krei rubujan dosierujon" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ne eblas krei trashinfo-dosieron: %s" + +#: ../gio/glocalfile.c:2047 ../gio/glocalfile.c:2052 ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ne eblas forŝovi dosieron %s al rubujo" + +#: ../gio/glocalfile.c:2140 ../glib/gregex.c:213 +msgid "internal error" +msgstr "interna eraro" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "Eraro dum kreo de la dosierujo: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Dosiersistemo ne subtenas simbolajn ligilojn" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Eraro dum kreo de la simbola ligilo: %s" + +#: ../gio/glocalfile.c:2261 ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "Eraro dum movado de la dosiero: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "Ne eblas movi dosierujon super dosierujo" + +#: ../gio/glocalfile.c:2311 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Sekurkopia kreado malsukcesis" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "Eraro dum forigo de la celdosiero: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "Movo inter muntoj ne estas subtenata" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Atributa valoro devas ne esti NUL-a" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Nevalida atributa tipo (ĉeno atendata)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Nevalida etendita atributnomo" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Eraro dum agordado de la etendita atributo '%s': %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (nevalida kodoprezento)" + +#: ../gio/glocalfileinfo.c:1527 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Eraro dum akiro de informo de dosiero `%s': %s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Eraro dum akiro informo pri dosierpriskribilo: %s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Nevalida atributa tipo (uint32 atendata)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Nevalida atributa tipo (uint64 atendata)" + +#: ../gio/glocalfileinfo.c:1861 ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "Nevalida atributa tipo (bajta ĉeno atendata)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "Ne eblas agordi permesojn sur simbolaj ligiloj " + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Eraro dum agordado de la permesoj: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "Eraro dum agordado de posedanto: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "simligilo devas ne esti NUL-a" + +#: ../gio/glocalfileinfo.c:2015 ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Eraro dum agordado de simligilo: %s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "Eraro dum agordado de simligilo: dosiero ne estas simligilo" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Eraro dum agordado de modifaĵo aÅ­ alira horo: %s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "SELinuksa kunteksto devas ne esti NUL-a " + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Eraro dum agordado de la SELinuksa kunteksto: %s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "\"SELinux\" ne estas enŝaltita sur ĉi tiu sistemo" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Agordi atributon %s ne subtenita" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Eraro dum legado de la dosiero: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Eraro dum serĉo en la dosiero: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Eraro dum fermado de la dosiero: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Ne eblas trovi defaÅ­ltan tipon de loka dosiera monitoro" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Eraro dum skribado de la dosiero: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Eraro dum forigo de la malnova sekurkopia ligilo: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Eraro dum kreado de sekurkopio: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Eraro dum alinomo de la provizora dosiero: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Eraro dum trunko de la dosiero: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Eraro dum malfermo de la dosiero '%s': %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Celdosiero estas dosierujo" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Celdosiero ne estas regula dosiero" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "La dosiero estis ekstere modifita" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Eraro dum forigo de la malnova dosiero: %s" + +#: ../gio/gmemoryinputstream.c:492 ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "Nevalida GSeekType liverita" + +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "Nevalida serĉpeto" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ne eblas trunki GMemoryInputStream-on" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Grando de memoro-eliga fluo ne estas ŝanĝebla" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Malsuksesis ŝanĝi la grandon de memoro-eliga fluo" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Sumo de memoro kiu estas bezonata por trakti de la skribo estas pli granda " +"ol havebla adresa spaco" + +#: ../gio/gmemoryoutputstream.c:760 +msgid "Requested seek before the beginning of the stream" +msgstr "Petita enpozicigo antaÅ­ la komencon de la fluo" + +#: ../gio/gmemoryoutputstream.c:769 +msgid "Requested seek beyond the end of the stream" +msgstr "Petita serĉ-loko estas preter la finon de la fluo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: ../gio/gmount.c:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "munto ne realigas \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +msgid "mount doesn't implement \"eject\"" +msgstr "munto ne realigas \"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 "munto ne realigas \"unmount\" aÅ­ \"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:611 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "munto ne realigas \"eject\" aÅ­ \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:701 +msgid "mount doesn't implement \"remount\"" +msgstr "munto ne realigas \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:785 +msgid "mount doesn't implement content type guessing" +msgstr "munto ne realigas konjektanta de enhava tipo" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "munto ne realigas konjektadon pri enhava tipo sinkrone" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Gastiga komputilnomo '%s' havas '[' sed ne ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Loka reto estas ne kontaktebla" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +#| msgid "could not get remote address: %s" +msgid "Could not create network monitor: %s" +msgstr "Ne eblas krei retmonitoron: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Ne eblas krei retmonitoron:" + +#: ../gio/gnetworkmonitornetlink.c:177 +#| msgid "could not get remote address: %s" +msgid "Could not get network status: " +msgstr "Ne eblas akiri restaton: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "Eliga fluo ne realigas skribon" + +#: ../gio/goutputstream.c:378 ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "Fontfluo jam estas fermita" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Eraro dum serĉo '%s': %s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Eraro dum inversa serĉo '%s': %s" + +#: ../gio/gresolver.c:849 ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "Ne ekzistas servorikordo por '%s'" + +#: ../gio/gresolver.c:854 ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ne eblas solvi '%s' provizore" + +#: ../gio/gresolver.c:859 ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "Eraro dum solvado de '%s'" + +#: ../gio/gresource.c:294 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:679 ../gio/gresource.c:748 ../gio/gresource.c:809 +#: ../gio/gresource.c:889 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "La risurco ĉe '%s' ne ekzistas" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:650 +#, c-format +#| msgid "Target file is a directory" +msgid "The resource at '%s' is not a directory" +msgstr "La risurco ĉe '%s' ne estas dosierujo" + +#: ../gio/gresourcefile.c:858 +#| msgid "Input stream doesn't implement read" +msgid "Input stream doesn't implement seek" +msgstr "Eniga fluo ne realigas serĉon" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "Presi helpon" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +#| msgid "COMMAND" +msgid "[COMMAND]" +msgstr "[KOMANDO]" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "DOSIERO [VOJO]" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "SEKCIO" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "Eltiri risurcan dosieron al 'stdout'" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "DOSIERA VOJO" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Nekonata komando %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uzo:\n" +" gresource [--section SEKCIO] KOMANDO [ARGUMENTOJ...]\n" +"\n" +"Komandoj:\n" +" helpo Montri ĉi tiun informon\n" +" sections Listigi risurcan sekciojn\n" +" list Listigi risurcojn\n" +" details Listigi risurcojn kun detaloj\n" +" extract Eltiri risurcon\n" +"\n" +"Uzu 'gresource help KOMANDO' por akiri helpon detale.\n" +"\n" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uzo:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "Argumentoj:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKCIO (laÅ­vola) nomo de elf-a sekcio\n" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMANDO La (laÅ­vola) komando por klarigi\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:554 +msgid "[PATH]" +msgstr "[VOJO]" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " VOJO (laÅ­vola) vojo de risurco (eble parta)\n" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "VOJO" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr " VOJO vojo de risurco\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Neniu tia skemo '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Skemo '%s' ne estas translokigebla (vojo devas ne esti specifita)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Skemo '%s' estas translokigebla (vojo devas esti specifita)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Malplena vojo estis donita.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Vojo devas komenciĝi per oblikvo (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Vojo devas finiĝi per oblikvo (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Vojo devas ne havi du apudajn oblikvojn (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Neniu tia ŝlosilo '%s'\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "La valoro provizita estas preter la valida intervalo\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "Listigi la instalitajn (ne translokigeblajn) skemojn" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "Listigi la instalintajn translokiĝeblajn skemojn" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "Listi la ŝlosilojn en SKEMO" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SKEMO[:VOJO]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "Listi la idojn de SKEMO" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Listi ŝlosilojn kaj valorojn, rikure\n" +"Se ne SKEMO estas donita, listi ĉiujn ŝlosilojn\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[SKEMO[:VOJO]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "Akiri la valoron de ŜLOSILO" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SKEMO[:VOJO] ŜLOSILO" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "Informpeti la intervalon de validaj valoroj por ŜLOSILO" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "Agordi la valoron de ŜLOSILO al VALORO" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SKEMO[:VOJO] ŜLOSILO VALORO" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "Reŝargi ŜLOSILO-n al ĝia defaÅ­lta valoro" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reŝargi ĉiujn ŝlosilojn en SKEMO al iliaj defaÅ­ltoj" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "Kontroli ĉu ŜLOSILO estas skribebla" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Kontroladi ŜLOSILO-n por ŝanĝoj.\n" +"Se ŜLOSILO ne estas specifata, kontroladi ĉiujn ŝlosilojn en SKEMO.\n" +"Uzu ^C por haltigi kontroladon.\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SKEMO[:VOJO] [ŜLOSILO]" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uzo:\n" +" gsettings [--schemadir SCHEMADIR] KOMANDO [ARGUMENTOJ...]\n" +"\n" +"Komandoj:\n" +" help Montri ĉi tiu informon\n" +" list-schemas Listi instalitajn skemojn\n" +" list-relocatable-schemas Listi translokigeblajn skemojn\n" +" list-keys Listi ŝlosilojn en skemo\n" +" list-children Listi idojn de skemo\n" +" list-recursively Listi ŝlosilojn kaj valorojn, rikure\n" +" range Informpetas la intervalon de la ŝlosilo\n" +" get Akiri la valoron de ŝlosilo\n" +" set Difini la valoron de ŝlosilo\n" +" reset RedefaÅ­ltigi la valoron de ŝlosilo\n" +" reset-recursively RedefaÅ­ltigi ĉiujn valorojn en donita skemo\n" +" writable Kontroli ĉu ŝlosilo estas skribebla\n" +" monitor Kontroladi por ŝanĝoj\n" +"\n" +"Uzu 'gsettings help KOMANDO' por akiri helpon detale.\n" +"\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uzo:\n" +" gsettings [--schemadir SCHEMADIR %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR Dosierujo por serĉi pliajn skemojn\n" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SKEMO La nomo de la skemo\n" +" VOJO La vojo, por translokigeblaj skemoj\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " ŜLOSILO La (laÅ­vola) ŝlosilo interne de la skemo\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " ŜLOSILO La ŝlosilo interne de la skemo\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " VALUE La valoro agordota\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "Malplena skemo-nomo donita\n" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "Nevalida kontaktskatolo, ne pravalorizita" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Nevalida kontaktskatolo, pravalorizo malsukcesis pro: %s" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "Kontaktskatolo estas jam fermita" + +#: ../gio/gsocket.c:305 ../gio/gsocket.c:3520 ../gio/gsocket.c:3575 +msgid "Socket I/O timed out" +msgstr "Kontaktoskatolo I/O eltempiĝis" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "Kreanta GSocket de fd: %s" + +#: ../gio/gsocket.c:506 ../gio/gsocket.c:522 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ne eblas krei kontaktskatolon: %s" + +#: ../gio/gsocket.c:506 +msgid "Unknown protocol was specified" +msgstr "Nekonata protokolo estis specifita" + +#: ../gio/gsocket.c:1713 +#, c-format +msgid "could not get local address: %s" +msgstr "ne eblas akiri lokan adreson: %s" + +#: ../gio/gsocket.c:1756 +#, c-format +msgid "could not get remote address: %s" +msgstr "ne eblas akiri foran adreson: %s" + +#: ../gio/gsocket.c:1817 +#, c-format +msgid "could not listen: %s" +msgstr "Ne eblis aÅ­skulti %s" + +#: ../gio/gsocket.c:1891 +#, c-format +msgid "Error binding to address: %s" +msgstr "Eraro dum bindado al la adreso: %s" + +#: ../gio/gsocket.c:1944 ../gio/gsocket.c:1980 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Eraro kunigante plurelsendgrupon: %s" + +#: ../gio/gsocket.c:1945 ../gio/gsocket.c:1981 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Eraro lasante plurelsendgrupon: %s" + +#: ../gio/gsocket.c:1946 +msgid "No support for source-specific multicast" +msgstr "Neniu subteno por fontspecifa plurelsendgrupo" + +#: ../gio/gsocket.c:2165 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Eraro dum akcepto de la konekto: %s" + +#: ../gio/gsocket.c:2286 +msgid "Connection in progress" +msgstr "Farata konektado" + +#: ../gio/gsocket.c:2338 ../gio/gsocket.c:4317 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ne eblas akiri okazontan eraron: %s" + +#: ../gio/gsocket.c:2508 +#, c-format +msgid "Error receiving data: %s" +msgstr "Eraro dum ricevo de la datumaro: %s" + +#: ../gio/gsocket.c:2686 +#, c-format +msgid "Error sending data: %s" +msgstr "Eraro dum sendado de la datumaro: %s" + +#: ../gio/gsocket.c:2800 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Ne eblas fermi kontaktskatolon: %s" + +#: ../gio/gsocket.c:2879 +#, c-format +msgid "Error closing socket: %s" +msgstr "Eraro malfermi kontaktskatolon: %s" + +#: ../gio/gsocket.c:3513 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Atendanta kontaktskatolon kondiĉon: %s" + +#: ../gio/gsocket.c:3791 ../gio/gsocket.c:3872 +#, c-format +msgid "Error sending message: %s" +msgstr "Eraro dum sendado de la mesaĝo: %s" + +#: ../gio/gsocket.c:3816 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ne estas subternata sur Vindozo" + +#: ../gio/gsocket.c:4096 ../gio/gsocket.c:4232 +#, c-format +msgid "Error receiving message: %s" +msgstr "Eraro dum ricevo de la mesaĝo: %s" + +#: ../gio/gsocket.c:4336 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials ne realigita por ĉi tiu mastruma sistemo" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Ne eblis konekti al prokura servilo %s:" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Ne eblis konekti al '%s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Ne eblis konekti: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Nekonata eraro okazis je konektado" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Provo prokuri tra ne-TCP-a konekto ne estas subtenata." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Prokura protokolo '%s' ne estas subtenata." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "AÅ­skultilo estas jam fermita" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Aldonita kontaktskatolo estas fermita" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ne subtenas IPv6-an adreson '%s'" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Uzantonomo estas tro longa por SOCKSv4-protokolo" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Gastiga komputilonomo '%s' estas tro longa por SOCKSv4-protokolo" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "La servilo ne estas SOCKSv5-prokura servilo." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Konekto tra SOCKSv5-servilo malakceptiĝis" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "La servilo ne estas SOCKSv5-prokura servilo." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "La SOCKSv5-prokurilo bezonas aÅ­tentokontrolon." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"La SOCKSv5-prokurilo benzonas aÅ­tentokontrolan metodon ke ne estas subtenita " +"per GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Uzantonomo aÅ­ pasvorto estas tro longa por SOCKSv5-protokolo." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5-aÅ­tentokontrolo malsukcesis pro erara uzantonomo aÅ­ pasvorto." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Gastiga komputilonomo '%s' estas tro longa por SOCKSv5-protokolo" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "La SOCKSv5-prokura servilo uzas adrestipon kiu estas nekonata." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Interna SOCKSv5-prokur-servila eraro." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-konekto ne estas permesita laÅ­ servila agordo." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Gastiga komputilo estas ne kontaktebla per SOCKSv5-servilo." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Loka reto estas ne kontaktebla per SOCKSv5-prokurilo." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Konekto ne estis akceptita per SOCKv5 prokurilo." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Komando 'connect' ne estas subtenata de SOCKSv5-prokurilo." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Provizita adrestipo ne estas subtenata de SOCKSv5-prokurilo." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Nekonata SOCKv5 prokurilo eraro." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ne eblas trakti version %d de GThemedIcon kodoprezento" + +#: ../gio/gtlscertificate.c:249 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Ne eblas malĉifri PEM-kodigitan privatan ŝlosilon" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "Neniu PEM-kodigita privata ŝlosilo trovita" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "Ne eblas analizi PEM-kodigitan privatan ŝlosilon" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "Neniu PEM-kodigita atestilo trovita" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "Ne eblas analizi PEM-kodigitan atestilon" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ĉi tiu estas la fina ebleco enigi la pasvorton ĝuste antaÅ­ ol via aliro " +"estos barita." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Kelkaj eraraj pasvortoj enigitaj, kaj via aliro estos barita se pliaj " +"malsukcesoj okazos." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "La pasvorto enigita estas ne korekta." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:580 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Atendita 1 stirmesaĝo, akirita %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:590 +msgid "Unexpected type of ancillary data" +msgstr "Ne atendita tipo de helpa datumaro" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Atendita unu fd, sed akirita %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Akirita ne valida fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Eraro dum sendo de la akreditaĵoj:" + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"Eraro kontrolanta ĉu SO_PASSCRED estas enŝaltita por kontaktskatolo: %s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Neatendita opciolongo dum kontrolanta ĉu SO_PASSCRED estas enŝaltita por " +"kontaktskatolo. Atendita %d bajtoj, akiras %d" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Eraro dum enŝalto de SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:568 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Atendanta legi unuopan bajton por ricevi akreditaĵojn sed legis neniom da " +"bajtoj" + +#: ../gio/gunixconnection.c:604 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Ne atendanta stirmesaĝon, sed akiris %d" + +#: ../gio/gunixconnection.c:630 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Eraro dum elŝalto de SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:392 ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:493 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Eraro dum legado de la dosiernumero: %s" + +#: ../gio/gunixinputstream.c:448 ../gio/gunixinputstream.c:643 +#: ../gio/gunixoutputstream.c:434 ../gio/gunixoutputstream.c:598 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Eraro dum fermado de la dosiernumero: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "Dosiersistema radiko" + +#: ../gio/gunixoutputstream.c:378 ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:479 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Eraro dum skribado de la dosiernumero: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" +"Abstraktaj uniksoretregionaj kontaktoskatolaj adresoj ne estas subtenataj " +"sur ĉi tiu sistemo" + +#: ../gio/gvolume.c:408 +msgid "volume doesn't implement eject" +msgstr "datumportilo ne realigas eject-an funkcion" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gvolume.c:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "datumportilo ne realigas eject-an aÅ­ eject_with_operation-an funkciojn" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ne eblas trovi aplikaĵon" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Eraro dum lanĉo de la aplikaĵo: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI-oj ne subtenitaj" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "asociigaj ŝanĝoj ne subtenitaj en vin32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Asociiga kreado ne subtenita en win32" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Eraro dum lego de dosiernumero: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Eraro dum fermo de dosiernumero: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Eraro dum skribo al dosiernumero: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Memoro ne sufiĉas" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Interna eraro: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Bezonas pli da enigo" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Nevalida densigita datumaro" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neatendita atributo '%s' pri elemento '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributo '%s' de elemento '%s' ne trovita" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etikedo '%s' estas neatendita, etikedo '%s' estas atendita" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neatendita etikedo '%s' interne de '%s'" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "Neniu valida legosigna dosiero estis trovita en datumaj dosierujoj" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Legosigno por URI '%s' jam ekzistas" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Neniu legosigno trovita por URI '%s'" + +#: ../glib/gbookmarkfile.c:2385 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Neniu MIME-tipo estas difinita en la legosigno por URI '%s'" + +#: ../glib/gbookmarkfile.c:2470 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Neniu privata flago estis difinita en legosigno por URI '%s'" + +#: ../glib/gbookmarkfile.c:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Neniuj grupoj agorditaj en legosigno por URI-o '%s'" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Neniu aplikaĵo kun nomo '%s' registris legosignon por '%s'" + +#: ../glib/gbookmarkfile.c:3424 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Malsukcesis ekspansii plenuman linion '%s' per URI '%s'" + +#: ../glib/gconvert.c:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Parta karaktrosekvenco ĉe enigofino" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne eblas konverti la retrodefaÅ­lton '%s' al kodaro '%s'" + +#: ../glib/gconvert.c:1874 +#, 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 \"file\"-skemon" + +#: ../glib/gconvert.c:1884 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "La loka dosiera URI '%s' devas ne havi la '#'" + +#: ../glib/gconvert.c:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "La URI '%s' estas nevalida" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "La gastiga komputilnomo de la URI '%s' ne estas valida" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "La URI '%s' havas karaktrojn kiuj estas eskapataj nevalide" + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "La vojnomo '%s' ne estas absoluta vojo" + +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "Nevalida gastiga komputilonomo" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ATM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PTM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %b %e %H:%M:%S %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%F" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "januaro" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "februaro" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "marto" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "aprilo" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "majo" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "junio" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "julio" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "aÅ­gusto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "septembro" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "oktobro" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "novembro" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "decembro" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "aÅ­g" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "lundo" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "mardo" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "merkredo" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ĵaÅ­do" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "vendredo" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sabato" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "dimanĉo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "lun" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "mar" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mer" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ĵaÅ­" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ven" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sab" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dim" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Eraro dum malfermado de la dosierujo '%s': %s" + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Ne eblis akiri %lu bajtojn por legi la dosieron \"%s\"" + +#: ../glib/gfileutils.c:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Eraro dum legado de la dosiero '%s': %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Dosiero \"%s\" estas tro granda" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Malsukcesis legi el dosiero '%s': %s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Malsukcesis malfermi dosieron '%s': %s" + +#: ../glib/gfileutils.c:855 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Malsukcesis akiri atributojn de dosiero '%s': fstat() malsukcesis: %s" + +#: ../glib/gfileutils.c:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': fdopen() malsukcesis: %s" + +#: ../glib/gfileutils.c:997 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Malsukcesis alinomi dosieron de '%s' al '%s': g_rename() malsukcesis: %s" + +#: ../glib/gfileutils.c:1039 ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Malsukcesis krei dosieron '%s': %s" + +#: ../glib/gfileutils.c:1053 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Malsukcesis malfermi dosieron '%s' por skribi: fdopen() malsukcesis: %s" + +#: ../glib/gfileutils.c:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Malsukcesis skribi dosieron '%s': fwrite() malsukcesis: %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Skribi dosieron malsukcesis '%s': fflush() malsukcesis: %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Skribi dosieron malsukcesis '%s': fsync() malsukcesis: %s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Malsukcesis fermi dosieron '%s': fclose() malsukcesis: %s" + +#: ../glib/gfileutils.c:1287 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Ne eblas forigi ekzistatan dosieron '%s': g_unlink() malsukcesis: %s" + +#: ../glib/gfileutils.c:1547 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Ŝablono '%s' ne estas valida, ĝi devas ne havi '%s'" + +#: ../glib/gfileutils.c:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Ŝablono '%s' ne havas XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Malsukcesis legi la simbolan ligilon '%s': %s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "Simbolaj ligiloj ne estas subtenataj" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne eblas fari krudan legon en g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Kroma nekonvertita datumaro en legbufro" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanalo finas per parta karaktro" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Ne eblas fari krudan legon en g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "Valida ŝlosilodosiero ne povas esti trovita en serĉaj dosierujoj" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "Ne estas regula dosiero" + +#: ../glib/gkeyfile.c:1162 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ŝlosilodosiero havas linion '%s' kiu ne estas ŝlosilo-valoro paro, grupo, aÅ­ " +"komento" + +#: ../glib/gkeyfile.c:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nevalida grupa nomo: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "Ŝlosilodosiero ne komenciĝas per grupo" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nevalida ŝlosilonomo: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ŝlosilodosiero havas nesubtenatan kodoprezenton '%s'" + +#: ../glib/gkeyfile.c:1541 ../glib/gkeyfile.c:1703 ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 ../glib/gkeyfile.c:3273 ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 ../glib/gkeyfile.c:3778 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ŝlosilodosiero ne havas grupon '%s'" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ŝlosilodosiero ne havas ŝlosilon '%s'" + +#: ../glib/gkeyfile.c:1822 ../glib/gkeyfile.c:1938 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Ŝlosildosiero havas ŝlosilon '%s' kun valoro '%s' kiu ne estas UTF-8" + +#: ../glib/gkeyfile.c:1842 ../glib/gkeyfile.c:1958 ../glib/gkeyfile.c:2327 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Ŝlosildosiero havas ŝlosilon '%s' kiu havas neinterpeteblan valoron." + +#: ../glib/gkeyfile.c:2544 ../glib/gkeyfile.c:2910 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Ŝlosilodosiero havas ŝlosilon '%s' en grupo '%s' kiu havas neinterpeteblan " +"valoron." + +#: ../glib/gkeyfile.c:2622 ../glib/gkeyfile.c:2698 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Ŝlosilo '%s' en grupo '%s' havas valoron '%s' kie %s estis atendita." + +#: ../glib/gkeyfile.c:3096 ../glib/gkeyfile.c:3288 ../glib/gkeyfile.c:3857 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ŝlosilodosiero ne havas ŝlosilon '%s' en grupo '%s'" + +#: ../glib/gkeyfile.c:4089 +msgid "Key file contains escape character at end of line" +msgstr "Ŝlosilodosiero havas kodŝanĝan signon ĉe fino de linio" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "La ŝlosildosiero havas nevalidan kodŝanĝan sekvencon '%s'" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Valoro '%s' neinterpreteblas kiel nombro." + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Entjera valoro '%s' estas ekster la intervalo" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Valoro '%s' neinterpreteblas kiel glita nombro." + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Valoro '%s' neinterpreteblas kiel bulea." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Malsukcesis akiri atributojn de dosiero '%s%s%s%s': fstat() malsukcesis: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Malsukcesis mapigi dosieron %s%s%s%s: mmap() malsukcesis: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Malsukcesis malfermi dosieron '%s': open() malsukcesis: %s" + +#: ../glib/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Eraro sur linio %d karaktro %d: " + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nevalida UTF-8-kodigita teksto en nomo - ne valida '%s'" + +#: ../glib/gmarkup.c:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ne estas valida nomo " + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ne estas valida nomo: '%c' " + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "Eraro sur linio %d: %s" + +#: ../glib/gmarkup.c:639 +#, 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 "" +"Malsukcesis analizi '%-.*s', kiu devus esti cifero en karaktra referenco " +"(ekz. ê) - la cifero estas eble tro granda" + +#: ../glib/gmarkup.c:651 +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 "" +"Karaktra referenco ne finis per punktokomo; vi verŝajne uzas kaj-signon sen " +"intenco komencigi eron - nuligu kaj-signon kiel &" + +#: ../glib/gmarkup.c:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Karaktra referenco '%-.*s' ne enkodigas permesatan karaktron" + +#: ../glib/gmarkup.c:715 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Malplena ento '&;' vidita; validaj entoj estas : & " < > " +"'" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ento-nomo '%-.*s' ne estas konata" + +#: ../glib/gmarkup.c:728 +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 "" +"Ento ne finiĝis per punktokomo; vi eble uzis kaj-signon sen intenco " +"komencigi enton - nuligu kaj-signon kiel &" + +#: ../glib/gmarkup.c:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumento devas komenci per elemento (ekz. )" + +#: ../glib/gmarkup.c:1116 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' ne estas valida karaktro post '<' karaktro; ĝi ne povas komenci " +"elementan nomon" + +#: ../glib/gmarkup.c:1184 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Malbona karaktro '%s', karaktro '>' atendita por fini la malplena-elementon " +"etikedon '%s'" + +#: ../glib/gmarkup.c:1268 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Malbona karaktro '%s', karaktro '=' estas atendita post atributnomo '%s' de " +"elemento '%s'" + +#: ../glib/gmarkup.c:1309 +#, 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 karaktro '%s', '>' aÅ­ '/' estas atendita por fini la komencan " +"etikedon de elemento '%s' aÅ­ laÅ­vole atributon; eble vi uzas nevalidan " +"karaktron en atributnomo" + +#: ../glib/gmarkup.c:1353 +#, 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 karaktro '%s', maldekstra citilo estas atendita post la egalsigno " +"kiam donanta valoron por atributo '%s' de elemento '%s'" + +#: ../glib/gmarkup.c:1486 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' ne estas valida karaktro post la fermiga elementnomo '%s'; la permesata " +"karaktro estas '>'" + +#: ../glib/gmarkup.c:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elemento '%s' estis fermita, neniu elemento estas malferma nun" + +#: ../glib/gmarkup.c:1542 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Elemento '%s' estis fermita, sed la malfermita elemento estas '%s' nun" + +#: ../glib/gmarkup.c:1710 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumento estis malpena aÅ­ ĝi havis nur blankspacon" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumento finiĝis neatendite tuj post maldekstra angulkrampon '<'" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Dokumento finiĝis neatendite kun elementoj ankoraÅ­ malfermaj - '%s' estis la " +"elemento malfermita laste" + +#: ../glib/gmarkup.c:1740 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumento finiĝis neatendite, atendis vidi etikedon finiĝanta per dekstra " +"angulkrampo <%s/>" + +#: ../glib/gmarkup.c:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumento finiĝis neatendite interne de elementnomo" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumento finiĝis neatendite interne de atributnomo" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumento finiĝis neatendite interne de elemento-malfermanta etikedo." + +#: ../glib/gmarkup.c:1763 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokumento finiĝis neatendite post la egalsigno sekvanta atributnomo; neniu " +"atributvaloro" + +#: ../glib/gmarkup.c:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumento finiĝis neatendite dum interne de atributvaloro" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumento finiĝis interne de la ferma etikedo por elemento '%s'" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumento finiĝis neatendite interne de komento aÅ­ traktada instrukcio" + +#: ../glib/goption.c:766 +msgid "Usage:" +msgstr "Uzo:" + +#: ../glib/goption.c:766 +msgid "[OPTION...]" +msgstr "[OPCIO...]" + +#: ../glib/goption.c:872 +msgid "Help Options:" +msgstr "Helpaj Opcioj:" + +#: ../glib/goption.c:873 +msgid "Show help options" +msgstr "Montri helpajn opciojn" + +#: ../glib/goption.c:879 +msgid "Show all help options" +msgstr "Montri ĉiujn helpan opciojn" + +#: ../glib/goption.c:941 +msgid "Application Options:" +msgstr "Aplikaĵaj Opcioj:" + +#: ../glib/goption.c:1003 ../glib/goption.c:1073 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Ne eblas analizi entjeran valoron '%s' de %s" + +#: ../glib/goption.c:1013 ../glib/goption.c:1081 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Entjera valoro '%s' de %s estas ekster la intervalo" + +#: ../glib/goption.c:1038 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Ne eblas analizi duoblan valoron '%s' de %s" + +#: ../glib/goption.c:1046 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Duobla valoro '%s' de %s estas ekster la intervalo" + +#: ../glib/goption.c:1309 ../glib/goption.c:1388 +#, c-format +msgid "Error parsing option %s" +msgstr "Eraro dum sintaksa analizo de la opcio %s" + +#: ../glib/goption.c:1419 ../glib/goption.c:1532 +#, c-format +msgid "Missing argument for %s" +msgstr "Mankas argumento de %s" + +#: ../glib/goption.c:1985 +#, c-format +msgid "Unknown option %s" +msgstr "Nekonata opcio %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "difektita objekto" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "interna eraro aÅ­ difektita objekto" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "memormanko" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "retrospurada limo estas atingata" + +#: ../glib/gregex.c:211 ../glib/gregex.c:219 +msgid "the pattern contains items not supported for partial matching" +msgstr "La modelo havas erojn kiuj ne estas subtenataj por parta kongruado" + +#: ../glib/gregex.c:221 +msgid "back references as conditions are not supported for partial matching" +msgstr "retroreferencoj kiel kondiĉoj ne estas subtenataj por parta kongruado" + +#: ../glib/gregex.c:230 +msgid "recursion limit reached" +msgstr "rekurslimo atingita" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "laborspaca limo por malplenaj subĉenoj estas atingitaj" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "nevalida kombinaĵo de novlinioj flagoj" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "malbona deŝovo" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "mallonga utf8" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "nekonata eraro" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ ĉe fino de modelo" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "\\c ĉe fino de modelo" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "nerekonata karaktro sekvas \\" + +#: ../glib/gregex.c:275 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"kodŝanĝaj sekvencoj kiuj ŝanĝas usklecon (\\l, \\L, \\u, \\U) ne estas " +"permesi ĉi tie" + +#: ../glib/gregex.c:278 +msgid "numbers out of order in {} quantifier" +msgstr "nombroj neordigitaj en {} kvantoro" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "nombro tro granda en {} kvantoro" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "Mankas finiga ] por karaktro-klaso" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "Nevalida kodŝanĝa sekvenco en karaktro-klaso" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "intervalo ne ordigita en karaktro-klaso" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "nenio ripetebla" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "nekonata karaktro post (?" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "nekonata karaktro post (?<" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "nekonata karaktro post (?P" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX nomitaj klasoj estas subtenataj nur ene de klaso" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "mankas finiga )" + +#: ../glib/gregex.c:314 +msgid ") without opening (" +msgstr ") sen komenca (" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R aÅ­ (?[+-]ciferoj devas esti sekvataj de )" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "referenco al ne ekzistanta submodelo" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "manka ) post komento" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "regula esprima tro granda" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "malsukcesis akiri memoron" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "retrorigarda aserto ne havas fiksitan longon" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "misformata nombro aÅ­ nomo post (?(" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "kondiĉa grupo havas pli ol du branĉigojn" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "aserto atendata post (?(" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "nekonata POSIX klasnomo" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "POSIX kunmetigaj elementoj ne estas subtenataj" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "karaktro-valoro en \\x{...} sekvenco estas tro granda" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "Nevalida kondiĉo (?(0)" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ne estas permesata en retrorigarda aserto" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "rikura voko povus iteracii senfine" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "manka finilo en submodela nomo" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "du nomitaj submodeloj havas la saman nomon" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "misformita \\P aÅ­ \\p sekvenco" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "nekonata eco-nomo post \\P aÅ­ \\p" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "submodela nomo estas tro longa (maksimume 32 karaktroj)" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "tro multaj nomitaj submodeloj (maksimume 10.000)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "okuma valoro estas pli granda ol \\377" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "DIFINI grupo havas pli ol unu branĉo" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "ripeto de DIFIN-grupo ne estas permesata" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "nekoheraj NOVLINIO-j opcioj" + +#: ../glib/gregex.c:396 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g ne estas sekvata de nomo inter kunigaj krampoj, aÅ­ de nenula nombro " +"malnepre en kunigaj krampoj" + +#: ../glib/gregex.c:401 +msgid "unexpected repeat" +msgstr "neatendita ripeto" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "koda troo" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "troplenigis kompilada laborspaco" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "antaÅ­e kontrolita referencita submodelo ne trovita" + +#: ../glib/gregex.c:631 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Eraro dum kongruado de regula esprimo %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteko estas kompilata sen UTF8-subteno" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteko estas kompilata sen UTF8-ecoj-subteno" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Eraro dum kompilo de regula esprimo %s ĉe karaktro %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Eraro dum optimumigo de regula esprimo %s: %s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "deksusuma cifero aÅ­ '}' atendata" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "deksesuma cifero atendata" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "mankas '<' en simbola referenco" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "Nefinita simbola referenco" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "nulo-longa simbola referenco" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "cifero atendata" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "malpermesita simbola referenco" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "ne bezonata fina '\\'" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "nekonata kodŝanĝa sekvenco" + +#: ../glib/gregex.c:2359 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Eraro dum sintaksa analizo de anstataÅ­a teksto \"%s\" ĉe karaktro %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citata teksto ne komenciĝas per citilo" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Ne kongrua citilo sur komanda linio aÅ­ alia teksto citis en ŝelo" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Teksto finiĝis post '\\' karaktron. (La teksto estis '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Teksto finiĝis antaÅ­ kongrua citilo por %c estis trovita. (La teksto estis " +"'%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksto estis malplena (aÅ­ havis nur blankspacon)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Malsukcesis legi datumaron de procezido (%s)" + +#: ../glib/gspawn.c:348 +#, 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:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neatendita eraro en waitpid() (%s)" + +#: ../glib/gspawn.c:1174 ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Malsukcesis legi de duktido (%s)" + +#: ../glib/gspawn.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Malsukcesis branĉiĝi (%s)" + +#: ../glib/gspawn.c:1387 ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Malsukcesis ŝanĝi al dosierujo '%s' (%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Malsukcesis plenumi procezidon \"%s\" (%s)" + +#: ../glib/gspawn.c:1407 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Malsukcesis alidirektigi enigon aÅ­ eligon de procezido (%s)" + +#: ../glib/gspawn.c:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Malsukcesis branĉiĝi procezidon (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nekonata eraro dum plenumanta de la procezido \"%s\"" + +#: ../glib/gspawn.c:1448 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Malsukcesis legi sufiĉe datumaron de pid-duktido (%s)" + +#: ../glib/gspawn.c:1521 ../glib/gspawn-win32.c:299 +#, 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:282 +msgid "Failed to read data from child process" +msgstr "Malsukesis legi datumaron de procezido" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Malsukcesis plenumi procezidon (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nevalida programa nomo: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Nevalida ĉeno en argument-vektoro ĉe %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nevalida ĉeno en medio: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nevalida kuranta dosierujo: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Malsukcesis plenumi helpan programon (%s)" + +#: ../glib/gspawn-win32.c:997 +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 datumaro de " +"procezido" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Karaktro estas ekster la intervalo de UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Nevalida sekvenco en konverta enigo" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Karaktro estas ekster la intervalo de UTF-16" + +#: ../glib/gutils.c:2166 ../glib/gutils.c:2193 ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajto" +msgstr[1] "%u bajtoj" + +#: ../glib/gutils.c:2172 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2174 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2177 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2180 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2183 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2186 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2202 ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2205 ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2207 ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2210 ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2213 ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajto" +msgstr[1] "%s bajtoj" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "File is empty" +#~ msgstr "Dosiero estas malplena" + +#~ msgid "Error connecting: " +#~ msgstr "Eraro dum la konektado: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Eraro dum konektado: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Eraro legante de unikso: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Eraro dum fermo de unikson: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Eraro dum skribo al unikso: %s" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "Ŝlosilodosiero havas ŝlosilon '%s' kiu havas neinterpreteblan valoron." + +#~ msgid "This option will be removed soon." +#~ msgstr "Ĉi tiu opcio estos forigita baldaÅ­." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Eraro dum funkcivoko de stati() sur dosierujo `%s': %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 realigo limigas uzantonomon al %i karaktroj" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a realigo limigas gastiga komputilnomo al %i karaktroj" diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..829a86e --- /dev/null +++ b/po/es.po @@ -0,0 +1,4733 @@ +# 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, 2011, 2012. +# +# Daniel Mustieles , 2010, 2011, 2012. , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-24 23:17+0000\n" +"PO-Revision-Date: 2013-01-25 10:43+0100\n" +"Last-Translator: Daniel Mustieles \n" +"Language-Team: Español \n" +"Language: \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: Gtranslator 2.91.5\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "El valor de conteo pasado a %s es demasiado largo" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "No se permite buscar en el flujo base" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "No se puede truncar GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "El flujo ya se cerró" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "No se soporta el truncado en el flujo base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Se canceló la operación" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Objeto no válido, no inicializado" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Secuencia multibyte incompleta en la entrada" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "No hay suficiente espacio en el destino" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Hay una secuencia de bytes no válida en la entrada de conversión" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Falló durante la conversión: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "La inicialización cancelable no eestá soportada" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "No se pudo abrir el conversor de «%s» a «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipo desconocido" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipo de archivo %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials no está implementado en este SO" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "No existe soporte de GCredentials para su plataforma" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials no contiene un ID de proceso en este SO" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de flujo inesperadamente prematuro" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Clave «%s» no soportada en la entrada de dirección «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"La dirección «%s» no es válida (se necesita exactamente una ruta, dirtemp o " +"claves abstractas)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Combinación del par clave/valor sin sentido en la entrada de dirección «%s»" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Error en la dirección «%s»; el atributo de puerto está mal formado" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Error en la dirección «%s»; el atributo de familia está mal formado" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "El elemento de dirección «%s» no contiene dos puntos (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"El par clave/valor %d, «%s», en el elemento de dirección «%s», no contiene un " +"signo de igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Error al desescapar la clave o el valor en el par clave/valor %d, «%s», en el " +"elemento de dirección «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Error en la dirección «%s»: el transporte UNIX requiere exactamente que una " +"de las claves «path» o «abstract» esté establecida" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Error en la dirección «%s»: falta o está mal formado el atributo para el " +"servidor" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Error en la dirección «%s»: falta o está mal formado el atributo para el " +"puerto" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Error en la dirección «%s»: falta o está mal formado el atributo para el " +"archivo de número usado una sola vez" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Error al autolanzar: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transporte «%s» desconocido o no soportado para la dirección «%s»" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error al abrir el archivo de número usado una sola vez «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error al leer el archivo de número usado una sola vez «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Error al leer el archivo de número usado una sola vez «%s», se esperaban 16 " +"bytes, se obtuvieron %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Error al escribir el contenido del archivo de número usado una sola vez «%s» " +"al flujo:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "La dirección proporcionada está vacía" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "No se puede lanzar («spawn») un mensaje al bus con setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "No se puede lanzar («spawn») un mensaje al bus sin un ID de máquina: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Error al lanzar («spawn») el comando «%s»: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Escriba un carácter cualquiera para cerrar esta ventana)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"La sesión de dbus no está en ejecución, y falló el lanzamiento automático" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"No se puede determinar la dirección del bus de sesión (no implementado para " +"este SO)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"No se puede determinar la dirección del bus desde la variable de entorno " +"DBUS_STARTER_BUS_TYPE; variable «%s» desconocida" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"No se puede determinar la dirección del bus porque la variable de entorno " +"DBUS_STARTER_BUS_TYPE no está establecida" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipo de bus %d desconocido" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Falta de contenido inesperada al intentar leer una línea" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Falta de contenido inesperada al intentar leer (de forma segura) una línea" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Se agotaron todos los mecanismos de autenticación (intentados: %s) " +"(disponibles: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelado a través de GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Error al obtener la información de la carpeta «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Los permisos de la carpeta «%s» están mal formados. Se esperaba el modo 0700, " +"se obtuvo 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error al crear la carpeta «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Error al abrir el depósito de claves «%s» para su lectura: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"La línea %d del depósito de claves en «%s» con contenido «%s» está mal formada" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El primer token de la línea %d del depósito de claves en «%s» con contenido «%" +"s» está mal formado" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"El segundo token de la línea %d del depósito de claves en «%s» con contenido «%" +"s» está mal formado" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "No se encontró la «cookie» con ID %d en el depósito de claves en «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error al eliminar el archivo de bloqueo antiguo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error al crear el archivo de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error al cerrar (desenlazar) el archivo de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error al desenlazar el archivo de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Error al abrir el depósito de claves «%s» para su escritura:" + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Adicionalmente, también falló la liberación del bloqueo para «%s»: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "La conexión está cerrada" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Se alcanzó el tiempo de expiración" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Se encontraron opciones no soportadas al construir la conexión del lado del " +"cliente" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"No existe la interfaz «org.freedesktop.DBus.Properties» en el objeto en la " +"ruta %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Error al establecer la propiedad «%s». Se esperaba el tipo «%s» pero se obtuvo " +"«%s»." + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "No existe la propiedad «%s»" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "No se puede leer la clave «%s»" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "No se puede escribir la clave «%s»" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "La interfaz «%s» no existe" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "No existe tal interfaz" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No existe la interfaz «%s» en el objeto en la ruta %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "No existe el método «%s»" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "El tipo de mensaje, «%s», no concide con el tipo esperado «%s»" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Ya existe un objeto exportado para la interfaz %s en %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "El método «%s» devolvió el tipo «%s» pero se esperaba «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "El método «%s» con interfaz «%s» y firma «%s» no existe" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ya se ha exportado un subárbol para %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "el tipo no es válido («INVALID»)" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Mensaje de METHOD_CALL: falta el campo de cabecera PATH o MEMEBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Mensaje de METHOD_RETURN: falta el campo de cabecera REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Mensaje de ERROR: falta el campo de cabecera REPLY_SERRIAL o ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Mensaje de SIGNAL: falta el campo de cabecera PATH, INTERFACE o MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Mensaje de SIGNAL: el campo de cabecera PATH está usando el valor reservado /" +"org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Mensaje de SIGNAL: el campo de cabecera INTERFACE está usando el valor " +"reservado org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Se quería leer %lu byte pero sólo se obtuvo %lu" +msgstr[1] "Se querían leer %lu bytes pero sólo se obtuvo %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"Se esperaba el byte NULL después de la cadena «%s» pero se encontró el byte %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Se esperaba una cadena válida en UTF-8 pero se encontraron bytes no válidos " +"en el byte desplazado %d (la longitud de la cadena es %d). La cadena UTF-8 " +"válida hasta ese punto era «%s»." + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "El valor analizado «%s» no es un objeto de ruta D-Bus válido" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "El valor analizado «%s» no es una firma de D-Bus válida" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Se encontró un array de longitud %u byte. La longitud máxima es 2<<26 bytes " +"(64 MiB)." +msgstr[1] "" +"Se encontró un array de longitud %u bytes. La longitud máxima es 2<<26 bytes " +"(64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"El valor analizado «%s» para la variante no es una firma de D-Bus válida" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Error al deserializar GVariant con el tipo de cadena «%s» al formato de " +"mensaje de D-Bus" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor endian no válido. Se esperaba 0x6c («l») o 0x42 («B»)» pero se obtuvo el " +"valor 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"La versión principal del protocolo no es válida. Se esperaba 1 pero se " +"encontró %d." + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Se encontró la cabecera de firma con firma «%s» pero el cuerpo del mensaje " +"está vacío" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"El valor analizado «%s» no es una firma de D-Bus válida (para el cuerpo)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"No existe la cabecera de firma en el mensaje pero el cuerpo del mensaje " +"tiene %u byte" +msgstr[1] "" +"No existe la cabecera de firma en el mensaje pero el cuerpo del mensaje " +"tiene %u bytes" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "No se puede deserializar el mensaje: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Error al serializar GVariant con el tipo de cadena «%s» al formato de mensaje " +"de D-Bus" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"El mensaje tiene %d descriptores de archivo pero el campo de cabecera indica " +"%d descriptores de archivo" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "No se puede serializar el mensaje: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"El cuerpo del mensaje tiene la firma «%s» pero no existe la cabecera de firma" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `%" +"s'" +msgstr "" +"El cuerpo del mensaje tiene un tipo de firma «%s» pero la firma en el campo " +"de cabecera es «%s»" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"El cuerpo del mensaje está vacío pero la firma en el campo de cabecera es «(%" +"s)»" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Error al devolver el cuerpo de tipo «%s»" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Error al devolver un cuepro vacío" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "No se pudo obtener el perfil de hardware: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "No se puede cargar /var/lib/dbus/machine-id o /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Error al llamar StartSereviceByName para %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Respuesta %d no esperada del método StartServiceByName(«%s»)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"No se puede invocar al método; el proxy no tiene dueño para un nombre " +"conocido y el proxy se construyó con la opción " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "No se soporta el espacio de nombres abstracto" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"No se puede especificar el archivo de número usado una sola vez al crear un " +"servidor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error al escribir el archivo de número usado una sola vez en «%s»: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La cadena «%s» no es un GUID válido de D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "No se puede escuchar en un transporte no soportado «%s»" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMANDO" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Comandos:\n" +" help Mostrar esta información\n" +" introspect Introspeccionar un objeto remoto\n" +" monitor Monitorizar un objeto remoto\n" +" call Invocar un método sobre un objeto remoto\n" +" emit Emitir una señal\n" +"\n" +"Use «%s COMANDO --help» para obtener ayuda de los comandos individuales.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Error: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error al analizar la introspección XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Conectar con el bus del sistema" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Conectar con el bus de sesión" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Conectar con la dirección de D-Bus proporcionada" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Opciones de conexión del extremo:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Opciones para especificar la conexión del extremo:" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "No se especificó ningún punto de conexión extremo" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Se especificaron varios puntos de conexión extremos" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Advertencia: según la introspección de los datos, la interfaz «%s» no existe\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Advertencia: según la introspección de los datos, el método «%s» no existe en " +"la interfaz «%s»\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Destino opcional para la señal (nombre único)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Ruta del objeto sobre el que emitir la señal" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Nombres de la interfaz y señal" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emitir una señal." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Error al conectar: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: no se especificó la ruta del objeto.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: %s no es una ruta de objeto válida\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: no se especificó la señal.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Error: la señal debe ser el nombre completamente cualificado.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s no es un nombre de interfaz válida\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s no es un nombre de miembro válido\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s no es un nombre de bus único válido.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error al analizar el parámetro %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error al limpiar la conexión: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Nombre del detino sobre el que invocar elmétodo" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Ruta del objeto sobre la que invocar el método" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Nombre de la interfaz y método" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Tiempo de expiración en segundos" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Invocar un método en un objeto remoto." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: el destino no está especificado\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: no se especificó la ruta del objeto\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: no se especificó el nombre del método\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: el nombre del método «%s» no es válido\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Error al analizar el parámetro %d del tipo «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Nombre de destino que introspeccionar" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Ruta del objeto que introspeccionar" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Imprimir XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Introspeccionar hijo" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Solo mostrar propiedades" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Introspeccionar un objeto remoto." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Nombre de destino para monitorizar" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Ruta objeto para monitorizar" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Monitorizar un objeto remoto." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sin nombre" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "El archivo de escritorio no especificó el campo Exec" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Imposible encontrar el terminal requerido por la aplicación" + +#: ../gio/gdesktopappinfo.c:1594 +#, 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:1598 +#, 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:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "La información de la aplicación carece de un identificador" + +#: ../gio/gdesktopappinfo.c:2094 +#, 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:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada para %s" + +#: ../gio/gdrive.c:394 +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:472 +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:548 +msgid "drive doesn't implement polling for media" +msgstr "la unidad no implementa el sondeo para medios" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "la unidad no implementa reproducir" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "la unidad no implementa detener" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "El soporte de TSL no está disponible" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Se esperaba un GEmblem para GEmblemedIconjo" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7115 ../gio/gfile.c:7205 ../gio/gfile.c:7289 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "El punto de montaje contenido no existe" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "No se puede copiar sobre la carpeta" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "No se puede copiar una carpeta sobre otra" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "El archivo destino ya existe" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "No se puede copiar la carpeta recursivamente" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "La unión no está soportada" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error al unir el archivo: %s" + +#: ../gio/gfile.c:2952 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Copiar (reflink/clone) entre puntos de montaje no está soportado" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Copiar (reflink/clone) no está soportado o no es válido" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Copiar (reflink/clone) no está soportado o no ha funcionado" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "No se puede copiar el archivo especial" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "El valor del enlace simbólico dado no es válido" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "No se soporta mover a la papelera" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Los nombres de archivo no pueden contener «%c»" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "el volumen no implementa el montado" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "No hay ninguna aplicación registrada para manejar este archivo" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "El enumerador está cerrado" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "El enumerador del archivo tiene una operación excepcional" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "El flujo no soporta query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "No se permite buscar en el flujo" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "No se permite truncar en el flujo de entrada" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "No se soporta el truncamiento en el flujo" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número de tokens (%d) incorrecto" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "No existe el tipo para la clase de nombre %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "El tipo %s no implementa la interfaz GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "El tipo %s no tiene clase" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versión mal formado: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "" +"No se puede manejar la versión proporcionada de la codificación de icono" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "No se especificó ninguna dirección" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "La longitud de %u es demasiado larga para una dirección" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "La dirección tiene bits más allá de la longitud del prefijo" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "No se pudo analizar «%s» como una máscara de una dirección IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "No hay suficiente espacio para la dirección del socket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Dirección del socket no soportada" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "El flujo tiene una operación excepcional" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "No se permite el elemento <%s> dentro de <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "No se permite el elemento <%s> en el nivel superior" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "El archivo %s aparece varias veces en el recurso" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Falló al buscar «%s» en cualquier carpeta fuente" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Falló al buscar «%s» en la carpeta actual" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Opción de procesado desconocida «%s»" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Falló al crear el archivo temporal: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Error al procesar el archivo de entrada con xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Error al procesar el archivo de entrada con to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Error al leer el archivo %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Error al comprimir el archivo %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "El texto no debe aparecer dentro de <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "nombre del archivo de salida" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "ARCHIVO" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"La carpeta de la que se tienen que leer los archivos (la predeterminada es " +"la carpeta actual)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "CARPETA" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Generar salida en el formato seleccionado por la extensión del nombre del " +"archivo objetivo" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Generar cabecera fuente" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Generar el código fuente usado para enlazar el archivo del recurso en su " +"código fuente" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Generar lista de dependencias" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "No crear y registrar automáticamente un recurso" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "No exportar funciones; declararlas como G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Nombre del identificador C usado para el código fuente generado" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compilar la especificación de un recurso en un archivo de recurso.\n" +"Los archivos de especificación de recursos deben tener la extensión ." +"gresource.xml,\n" +"y el archivo del recurso debe tener la extensión se llama .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Deberá proporcionar exactamente un nombre de archivo\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "no se permiten nombres vacíos" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"nombre «%s» no válido: los nombres deben comenzar por una letra minúscula" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nombre «%s» no válido: el carácter «%c» no es válido; sólo se permiten nombres " +"en minúscula, números y guión («-»)." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "nombre «%s» no válido: no se permiten dos guiones seguidos («--»)." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "nombre «%s» no válido: el último carácter no puede ser un guión («-»)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nombre «%s» no válido: la longitud máxima es 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " ya especificado" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "no se pueden añadir claves a un esquema de «lista-de»" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " ya especificada" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" eclipsa a en ; use " +" para modificar el valor" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"se debe especificar exactamente uno de «type», «enum» o «flags» como atributo " +"para " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> aún no especificado." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "tipo de cadena GVarian «%s» no válida" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "Se proporcionó pero el esquema no está extendiendo nada" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "no existe para sobrescribir" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " ya especificada" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " ya especificado" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " extiende el esquema «%s» que aún no existe" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " es una lista del esquema «%s» que aún no existe" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "No puede ser una lista de un esquema con una ruta" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "No se puede extender un esquema con una ruta" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" es una lista, extendiendo que no es una " +"lista" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" extiende pero «%" +"s» no extiende «%s»" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "si se especifica una ruta, debe comenzar y terminar con una barra" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "la ruta de la lista debe terminar con «:/»" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ya especificado" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "No se permite el elemento <%s> en el nivel superior" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "se especificó --strict; saliendo.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Se ha ignorado este archivo completamente.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorando este archivo.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"No existe la clave «%s» en el esquema «%s» como se especificó en el archivo de " +"sobrescritura «%s»" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorando la sobrescritura para esta clave.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "y se especificó --strict; saliendo.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"error al analizar la clave «%s» en el esquema «%s» como se especificó en el " +"archivo de sobrescritura «%s»: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorando la sobrescritura para esta clave.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"la clave de sobrescritura «%s» en el esquema «%s» en el archivo de " +"sobrescritura «%s» está fuera del rango proporcionado en el esquema" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"la clave de sobrescritura «%s» en el esquema «%s» en el archivo de " +"sobrescritura «%s» no está en la lista de opciones válidas" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "dónde almacenar el archivo gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Abortar ante cualquier error en los esquemas" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "No escribir el archivo gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "No forzar las restricciones de nombre de las claves" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compilar todos los archivos de esquema de GSettings en una caché de " +"esquemas.\n" +"Los archivos de esquema deben tener la extensión .gschema.xml,\n" +"y el archivo de caché se llama gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Deberá proporcionar exactamente un nombre de carpeta\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "No se encontró ningún archivo de esquemas: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "sin hacer nada.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "se quitó el archivo de salida existente.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "" +"No se pudo encontrar el tipo de monitorización de la carpeta local " +"predeterminada" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nombre de archivo no válido %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error al obtener la información del sistema de archivos: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "No se puede renombrar la carpeta raíz" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error al renombrar el archivo: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "No se puede renombrar el archivo, el nombre de archivo ya existe" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Nombre de archivo no válido" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "No se puede abrir la carpeta" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Error al abrir el archivo: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Error al eliminar el archivo: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error al mover a la papelera el archivo: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "No se pudo crear la carpeta de papelera %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "No se pudo encontrar la carpeta de nivel superior para la papelera" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "No se pudo encontrar o crear la carpeta de la papelera" + +#: ../gio/glocalfile.c:2054 +#, 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:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "No se pudo enviar a la papelera el archivo: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "error interno" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error al crear la carpeta: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "El sistema de archivos no soporta enlaces simbólicos" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error al crear el enlace simbólico: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Error al mover el archivo: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "No se puede mover una carpeta sobre una carpeta" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Falló la creación del archivo de respaldo" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error al eliminar el archivo destino: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "No se soporta mover archivos entre puntos de montaje" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "El valor del atributo de ser no nulo" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo no válido (se esperaba una cadena)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Nombre extendido del atributo no válido" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error al establecer el atributo extendido «%s»: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (codificación no válida)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Error al obtener la información del archivo «%s»: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Error al obtener la información del descriptor del archivo: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo no válido (se esperaba uint32)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo no válido (se esperaba uint64)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo no válido (se esperaba una cadena byte)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "No se pueden establecer permisos en enlaces simbólicos" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error al establecer permisos: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error al establecer el propietario: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "el enlace simbólico debe ser no nulo" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error al establecer el enlace simbólico: %s" + +#: ../gio/glocalfileinfo.c:2230 +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:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error al establecer o modificar el tiempo de acceso: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "El contexto SELinux debe ser no nulo" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error al establecer el contexto SELinux: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "SELinux no está activado en este sistema" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Establecer el atributo %s no está soportado" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error al leer del archivo: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error al buscar en el archivo: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Error al cerrar el archivo: %s" + +#: ../gio/glocalfilemonitor.c:176 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error al escribir en el archivo: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error al eliminar el enlace de respaldo antiguo: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error al crear una copia de respaldo: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error al renombrar el archivo temporal: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error al truncar el archivo: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error al abrir el archivo «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "El archivo destino es una carpeta" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "El archivo destino no es un archivo regular" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "El archivo se modificó externamente" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error al eliminar el archivo antiguo: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Se proporcionó un GSeekType no válido" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Petición de búsqueda no válida" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "No se puede truncar GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "El flujo de salida de la memoria no es redimensionable" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Falló al redimensionar el flujo de salida de la memoria" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "La búsqueda solicitada antes del inicio del flujo" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "El nombre del equipo «%s» contiene «[» pero no «]»" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Red no alcanzable" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Equipo no alcanzable" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "No se pudo crear el monitor de red: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "No se pudo crear el monitor de red: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "No se pudo obtener el estado de la red: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "El flujo de salida no implementa la escritura" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "El flujo de origen ya está cerrado" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "El recurso en «%s» no existe" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "El recurso en «%s» falló al descomprimir" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "El recurso en «%s» no es una carpeta" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "El flujo de entrada no implementa la búsqueda" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Imprimir ayuda" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMANDO]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Listar secciones que contengan recursos en un ARCHIVO elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Listar recursos\n" +"Si se da la SECCIÓN, listar solo los recursos de esta sección.\n" +"Si se da la RUTA, listar solo los recursos que coincidan" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "ARCHIVO [RUTA]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECCIÓN" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Listar recursos con detalles\n" +"Si se da la SECCIÓN, listar solo los recursos de esta sección.\n" +"Si se da la RUTA, listar solo los recursos que coincidan\n" +"Los detalles incluyen la sección, el tamaño y la compresión" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Extraer un archivo de recursos a stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "ARCHIVO RUTA" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Comando «%s» desconocido\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gresource [--section SECCIÓN] COMANDO [ARGUMENTOS...]\n" +"\n" +"Comandos:\n" +" help Mostrar esta información\n" +" sections Listar secciones de recursos\n" +" list Listar recursos\n" +" details Listar recursos con detalle\n" +" extract Extraer un recurso\n" +"\n" +"Use «gresource help COMANDO» para obtener ayuda detallada.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumentos:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECCIÓN El nombre de sección (opcional) de un elf\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMANDO El comando (opcional) que explicar\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" ARCHIVO Un archivo elf (un binario o una biblioteca compartida)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ARCHIVO Un archivo elf (un binario o una biblioteca compartida)\n" +" o un archivo de recursos compilado\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[RUTA]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " RUTA La ruta (opcional) de un recurso (puede ser parcial)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "RUTA" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " RUTA La ruta de un recurso\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No existe el esquema «%s»\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "El esquema «%s» no es reubicable (no se debe especificar la ruta)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "El esquema «%s» es reubicable (se debe especificar la ruta)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Se proporcionó una ruta vacía.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "La ruta debe comenzar con una barra (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "La ruta debe terminar con una barra (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "La ruta no debe contener dos barras adyacentes (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "No existe la clave «%s»\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "El valor proporcionado está fuera del rango válido\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Listar los esquemas instalados (no reubicables)" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Listar los esquemas reubicables instalados" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Listar las claves en el ESQUEMA" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:RUTA]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Listar los hijos del ESQUEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Listar las claves y valores recursivamente\n" +"Si no se proporciona un ESQUEMA, listar todas las claves\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:RUTA]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Obtener el valor de la CLAVE" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:RUTA] CLAVE" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Consultar el rango de valores válidos para la CLAVE" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Establecer el valor de la CLAVE a VALOR" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:RUTA] CLAVE VALOR" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Restablecer la CLAVE a su valor predeterminado" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" +"Restablecer todas las claves en un ESQUEMA a sus valores predeterminados" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Comprobar si la CLAVE se puede escribir" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizar cambios en la CLAVE.\n" +"Si no se especifica una CLAVE, monitorizar todas las claves en el ESQUEMA.\n" +"Use ^C para detener la monitorización.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:RUTA] [CLAVE]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir CARPETA_ESQUEMA] COMANDO [ARGUMENTOS...]\n" +"\n" +"Comandos:\n" +" help Mostrar esta información\n" +" list-schemas Listar los esquemas instalados\n" +" list-relocatable-schemas Listar los esquemas reubicables\n" +" list-keys Listar las claves en un esquema\n" +" list-children Listar los hijos de un esquema\n" +" list-recursively Listar claves y valores recursivamente\n" +" range Consultar el rango de una clave\n" +" get Obtener el valor de una clave\n" +" set Establecer el valor de una clave\n" +" reset Restablecer el valor de una clave\n" +" reset-recursively Restablecer todos los valores en un esquema " +"dado\n" +" writable Comprobar si una clave se puede escribir\n" +" monitor Monitorizar cambios\n" +"\n" +"Use «gsettings help COMANDO» para obtener una ayuda detallada.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir CARPETA_ESQUEMA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " CARPETA_ESQUEMA: una carpeta para buscar esquemas adicionales\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA El nombre del esquema\n" +" RUTA La ruta, para esquemas reubicables\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " CLAVE La clave (opcional) para el esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " CLAVE La clave para el esquema\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALOR El valor para establecer\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Se proporcionó un nombre de esquema vacío\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Socket no válido, no inicializado" + +#: ../gio/gsocket.c:318 +#, 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:326 +msgid "Socket is already closed" +msgstr "El socket ya está cerrado" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Expiró la E/S del socket" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando el GSocket desde fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "No se pudo crear el socket: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Se especificó una familia desconocida" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Se especificó un protocolo desconocido" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "no se pudo obtener la dirección local: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "no se pudo obtener la dirección remota: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "no se pudo escuchar: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error al vincular con la dirección: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Error al unirse al grupo de multicast: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Error al abandonar al grupo de multicast: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "No se soporta el multicast específico de la fuente" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error al aceptar la conexión: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Conexión en progreso" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "No se pudo obtener el error pendiente: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error al recibir los datos: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Error al enviar los datos: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "No se pudo desconectar el socket: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error al cerrar el socket: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Esperando la condición del socket: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Error al enviar el mensaje: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage no está soportado en Windows" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error al recibir el mensaje: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "No se pudo obtener el error pendiente: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials no está implementado en este SO" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "No se pudo conectar al servidor proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "No se pudo conectar a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "No se pudo conectar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Error desconocido al conectar" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "" +"No se soporta intentar hacer de proxy sobre una conexión que no es TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "El protocolo del proxy «%s» no está soportado." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "El «listener» ya está cerrado" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "El socket añadido está cerrado" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 no soporta la dirección de IPv6 «%s»" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "" +"El nombre de usuario o la contraseña son demasiado largos para el protocolo " +"SOCKSv5" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "El nombre de equipo «%s» es demasiado largo para el protocolo SOCKSv5" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "El servidor no es un servidor proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Se rechazó la conexión a través del servidor SOCKSv4" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "El servidor no es un servidor proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "El servidor proxy SOCKSv5 requiere autenticación." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"El servidor SOCKSv5 requiere un método de autenticación que GLib no soporta." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"El nombre de usuario o la contraseña son demasiado largos para el protocolo " +"SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Falló la autenticación SOCKSv5 debido a un nombre de usuario o contraseña " +"incorrecta." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "El nombre de equipo «%s» es demasiado largo para el protocolo SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "El servidor proxy SOCKSv5 usa un tipo de dirección desconocido." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Error interno de SOCKSv5 del servidor proxy." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "El conjunto de reglas no permite la conexión SOCKSv5." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "El servidor no es alcanzable a través del servidor SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "La red no es alcanzable a través del proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Se rechazó la conexión a través del proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "El proxy SOCKSv5 no soporta el comando «connect»." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "El proxy SOCKSv5 no soporta el tipo de dirección proporcionado." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Error desconocido del proxy SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, 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/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error al resolver «%s»: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error al resolver «%s» de forma invertida: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "No hay un registro de DNS del tipo solicitado para «%s»" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "No se puede resolver «%s» temporalmente" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error al resolver «%s»" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "No se pudo descifrar la clave privada codificada con PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "No se encontró ninguna clave privada codificada con PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "No se pudo analizar la clave privada codificada con PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "No se encontró ningún certificado codificado con PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "No se pudo analizar el certificado codificado con PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Esta es la última oportunidad para introducir la contraseña correctamente " +"antes de que su acceso se bloquee." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Se han introducido varias contraseñas incorrectas, y su acceso se bloqueará " +"después de más fallos." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "La contraseña introducida no es correcta" + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Se esperaba un mensaje de control, se obtuvieron %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Tipos de datos complementarios inesperados" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Se esperaba un fd pero se obtuvieron %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Se recibió un fd no válido" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Error al enviar las credenciales: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Error al comprobar si SO_PASSCRED está activada para el socket: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error al activar SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Se esperaba leer un solo byte para recibir las credenciales pero se leyeron " +"cero bytes" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "No se esperaba un mensaje de control, pero se obtuvo %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Error al desactivar SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Error al leer del descriptor del archivo: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Error al cerrar el descriptor del archivo: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Sistema de archivos raíz" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Error al escribir en el descriptor del archivo: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +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:276 +msgid "Can't find application" +msgstr "No se puede encontrar la aplicación" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Error al analizar la aplicación: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "No se soportan URI" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "los cambios de asociación no están soportados en win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "La creación de asociación no está soportada en win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Error al leer del manejador: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Error al cerrar el manejador: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Error al escribir en el manejador: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "No hay suficiente memoria" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Error interno: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Se necesita más entrada" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Datos comprimidos no válidos" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Dirección en la que escuchar" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Se ignora, por compatibilidad con GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Imprimir dirección" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Imprimir dirección en modo consola" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Ejecutar un servicio dbus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Argumentos incorrectos\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo inesperado «%s» para el elemento «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "El atributo «%s» del elemento «%s» no se ha encontrado" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta «%s» inesperada, se esperaba la etiqueta «%s»" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta «%s» inesperada dentro de «%s»" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"No se pudo encontrar ningún archivo de marcadores válido en las carpetas de " +"datos" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ya existe un marcador para el URI «%s»" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No se encontró un marcador para el URI «%s»" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Hay una secuencia parcial de caracteres en el final de la entrada" + +#: ../glib/gconvert.c:1053 +#, 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:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "El URI «%s» no es válido" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "El nombre del host de la URI «%s» no es válido" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "El URI «%s» contiene caracteres de escape no válidos" + +#: ../glib/gconvert.c:2021 +#, 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:2031 +msgid "Invalid hostname" +msgstr "El nombre del host no es válido" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %H:%M:%S, %e de %B de %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Enero" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Febrero" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Marzo" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Mayo" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Junio" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Julio" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agosto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Septiembre" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Octubre" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Noviembre" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Diciembre" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ene" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ago" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Oct" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dic" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Lunes" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Martes" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Miércoles" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Jueves" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Viernes" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sábado" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Domingo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Lun" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mié" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Jue" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Vie" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sáb" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Dom" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Falló al abrir la carpeta «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %ld byte to read file \"%s\"" +#| msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "No se pudo asignar %lu byte para leer el archivo «%s»" +msgstr[1] "No se pudieron asignar %lu bytes para leer el archivo «%s»" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Falló al leer el archivo «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "El archivo «%s» es demasiado grande" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falló al leer del archivo «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falló al abrir el archivo «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Falló al abrir el archivo «%s»: fdopen() falló: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falló al crear el archivo «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fwrite(): %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fflush(): %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló fsync(): %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Falló al cerrar el archivo «%s»: falló fclose(): %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "La plantilla «%s» no es válida, no debería contener un «%s»" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "La plantilla «%s» no contiene XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falló al leer el enlace simbólico «%s»: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Enlaces simbólicos no soportados" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Se han dejado datos no convertidos en el búfer de lectura" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "El canal termina en un carácter parcial" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"No se pudo encontrar la clave de archivo válida en las carpetas de búsqueda" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "No es un archivo regular" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nombre de grupo no válido: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "El archivo de claves no empieza por un grupo" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nombre de clave no válida: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "El archivo de claves contiene una codificación «%s» no soportada" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "El archivo de claves no tiene el grupo «%s»" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "El archivo de claves no tiene la clave «%s»" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "La clave «%s» en el grupo «%s» tiene el valor «%s», pero se esperaba %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +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:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "El archivo de claves contiene la secuencia de escape no válida «%s»" + +#: ../glib/gkeyfile.c:4244 +#, 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:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "El valor entero «%s» está fuera de rango" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "El valor «%s» no puede interpretarse como un booleano." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Falló al obtener los atributos del archivo «%s%s%s%s»: fstat() falló: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Falló al mapear el archivo «%s%s%s%s»: mmap() falló: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falló al abrir el archivo «%s»: open() falló: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error en la línea %d, carácter %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "«%s» no es un nombre válido" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "«%s» no es un nombre válido: «%c»" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error en la línea %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, 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:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"La entidad '&;' está vacía; las entidades válidas son: & " < " +"> '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "El nombre de la entidad «%-.*s» es desconocido" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "El documento debe comenzar con un elemento (por ejemplo: )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Se cerró el elemento «%s», pero el elemento que está abierto actualmente es «%" +"s»" + +#: ../glib/gmarkup.c:1753 +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:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "El documento termina inesperadamente justo después de un '<'" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "El documento termina inesperadamente dentro de un nombre de elemento" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "El documento termina inesperadamente dentro de un nombre de atributo" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"El documento terminó inesperadamente dentro de una etiqueta de apertura de " +"elemento." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "El documento termina inesperadamente dentro del valor de un atributo" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +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/goption.c:742 +msgid "Usage:" +msgstr "Uso:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPCIÓN…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opciones de ayuda:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Mostrar opciones de ayuda" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Muestra todas las opciones de ayuda" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opciones de la aplicación:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "No se puede analizar el valor entero «%s» para %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, 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:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "No se puede analizar el valor doble «%s» para %s" + +#: ../glib/goption.c:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Error al analizar la opción: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta un argumento para %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Opción desconocida %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objeto corrupto" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "error interno u objeto corrupto" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "sin memoria" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "se alcanzó el límite de «backtracking»" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "se alcanzó el límite de recursividad" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinación de banderas de nueva línea no válidas" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "desplazamiento erróneo" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "UTF8 corto" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "bucle de repetición" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "error desconocido" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ al final del patrón" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c al final del patrón" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "carácter no reconocido después de \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "números fuera de rango en el cuantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande en el cuantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "falta la terminación ] para la clase de carácter" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "secuencia de escape no válida en la clase de carácter" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "rango fuera de orden en la clase de carácter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nada que repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "carácter no reconocido después de (? o (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "falta el ) de terminación" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón no existente" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "falta ) después del comentario" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "la expresión regular es demasiado larga" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "falló al obtener memoria" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") sin ( que lo abriera" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "desbordamiento de código" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "carácter no reconocido después de (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "la comprobación «lookbehind» no tiene una longitud fija" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "número o nombre mal formado después de (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "el grupo condicional contiene más de dos ramas" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "se esperaba una comprobación después de (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o los dígitos (?[+-] deben estar seguidos por )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nombre de clase POSIX desconocido" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "los elementos POSIX recopilados no están soportados" + +#: ../glib/gregex.c:418 +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:421 +msgid "invalid condition (?(0)" +msgstr "condición no válida (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "no se permite \\C en comprobaciones «lookbehind»" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" +"las secuencias de escape \\L, \\l, \\N{nombre}, \\U, y \\u no están " +"soportadas" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "una llamada recursiva podrá crear un bucle infinito" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "carácter no reconocido después de (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "falta el terminador en el nombre del subpatrón" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dos subpatrones tienen el mismo nombre" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P o \\p mal formada" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nombre de propiedad desconocido después de \\P o \\p" + +#: ../glib/gregex.c:453 +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:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatrones con nombre (máximo 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "el valor octal es mayor que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "se desbordó el espacio de trabajo de compilación" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "no se encontró el subpatrón referenciado anteriormente comprobado" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "el grupo DEFINE contiene más de una rama" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opciones NEWLINE inconsistentes" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g no está seguido por un nombre entre llaves, corchetes angulares o número " +"o entre comillas, o por un número simple" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "una referencia con número no puede ser cero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "no se permite un argumento para (*ACCEPT), (*FAIL), o (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) no reconocido" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "el número es demasiado grande" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "falta el el nombre del subpatrón después de (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "se esperaba un dígito después de (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] es un carácter de datos no válido en el modo de compatibilidad de " +"JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "no se permiten diferentes nombres para subpatrones del mismo número" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) debe tener un argumento" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c debe estar seguido de un carácter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k no está seguido por un nombre entre llaves, corchetes angulares o entre " +"comillas" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N no está soportado en una clase" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "demasiadas referencias hacia adelante" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "el nombre es demasiado largo en (*MARK), (*PRUNE), (*SKIP), o (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "el valor del carácter en la secuencia \\u{…} es demasiado largo" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error al coincidir con la expresión regular %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La biblioteca PCRE está compilada sin soporte para UTF8" + +#: ../glib/gregex.c:1323 +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:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "La biblioteca PCRE está compilada con opciones incompatibles" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error al optimizar la expresión regular %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "se esperaba un dígito hexadecimal o «}»" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "se esperaba un dígito hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "falta «<» en la referencia simbólica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "referencia de símbolo sin terminar" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de longitud cero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "se esperaba un dígito" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "referencia simbólica ilegal" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "«\\» al final de la cadena" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "secuencia de escape desconocida" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "El texto entrecomillado no empieza por un signo de comilla" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "El texto está vacío (o sólo contiene espacios en blanco)" + +#: ../glib/gspawn.c:209 +#, 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:368 +#, 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:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "El proceso hijo terminó con el código %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "El proceso hijo terminado por la señal %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "El proceso hijo se detuvo por la señal %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "El proceso hijo terminó de forma anormal" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falló al leer desde el conducto hijo (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falló al bifurcar (fork) (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falló al cambiar a la carpeta «%s» (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" + +#: ../glib/gspawn.c:1522 +#, 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:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falló al bifurcar el proceso hijo (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Falló desconocido al ejecutar el proceso hijo «%s»" + +#: ../glib/gspawn.c:1563 +#, 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/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Falló al leer los datos desde un proceso hijo" + +#: ../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 no válido: %s" + +#: ../glib/gspawn-win32.c:455 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Cadena no válida en el vector del argumento en %d: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadena no válida en el entorno: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Carpeta de trabajo no válido: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falló al ejecutar el programa auxiliar (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "El carácter se sale del rango para UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Secuencia no válida en la entrada de conversión" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "El carácter se sale del rango para UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Recibidos datos incompletos de «%s»" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Opción de longitud inesperada al comprobar si SO_PASSCRED estaba activada " +#~ "para el socket. Se esperaban %d bytes, se obtuvieron %d." + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Falló inesperado en waitpid() (%s)" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Terminación anómala de programa al lanzar («spawn») el comando «%s»: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "El comando de línea «%s» finalizó con un estado de salida distinto de cero " +#~ "%d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "límite del espacio de trabajo cuando se alcanzan subcadenas vacías" + +#~ 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)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "no se permite repetir un grupo DEFINE" + +#~ msgid "No service record for '%s'" +#~ msgstr "No hay registro de servicio para «%s»" + +#~ msgid "Could not bind netlink socket: %s" +#~ msgstr "No se pudo conectar el socket netlink: %s:" + +#~ msgid "Could not set options on netlink socket: %s" +#~ msgstr "No se pudieron establecer las opciones del socket netlink: %s" + +#~ msgid "Could not send netlink request: " +#~ msgstr "No se pudo enviar la solicitud netlink:" + +#~ msgid "File is empty" +#~ msgstr "El archivo está vacío" + +#~ msgid "Error connecting: " +#~ msgstr "Error al conectar: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Error al conectar: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Error al leer de unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Error al cerrar unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Error al escribir en unix: %s" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Pronto se quitará esta opción." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Error al mostrar la información del estado del archivo «%s»: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "La implementación de SOCKSv4 limita el nombre de usuario a %i caracteres" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "La implementación de SOCKSv4a limita el nombre del servidor a %i " +#~ "caracteres" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Failed to set value\n" +#~ msgstr "Falló al establecer el valor\n" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "El tipo del valor devuelto es incorrecto, se obtuvo «%s», se esperaba «%s»" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Intentando establecer la propiedad %s del tipo %s pero según la interfaz " +#~ "esperada el tipo es %s" + +#~| msgid "" +#~| "Error in address `%s' - the noncefile attribute is missing or malformed" +#~ msgid "Error in address `%s' - missing noncefile attribute" +#~ msgstr "" +#~ "Error en la dirección «%s»: falta el atributo para el archivo de número " +#~ "usado una sola vez" + +#~| msgid "Error in address `%s' - the port attribute is malformed" +#~ msgid "Error in address `%s' - missing host attribute" +#~ msgstr "Error en la dirección «%s»; falta el atributo para el servidor" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "" +#~ "No existe el esquema «%s» especificado en el archivo de sobreescritura «%s»" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Comandos:\n" +#~ " help Mostrar esta información\n" +#~ " get Obtener el valor de una clave\n" +#~ " set Establecer el valor de una clave\n" +#~ " reset Restablecer el valor de una clave\n" +#~ " monitor Monitorizar si hay cambios en una clave\n" +#~ " writable Comprobar si una clave se puede escribir\n" +#~ "\n" +#~ "Use «%s COMANDO --help» para obtener ayuda de los comandos individuales.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especificar la ruta para el esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumentos:\n" +#~ " SCHEMA El ID del esquema\n" +#~ " KEY El nombre de la clave\n" +#~ " VALUE El valor con el que establecer una clave, serializado como " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "No se puede escribir la clave %s\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitorizar si hay cambios en una clave e imprimir los valores de " +#~ "cambio.\n" +#~ "La monitorización continuará hasta que el proceso haya terminado." + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "Error al escribir los primeros 16 bytes del mensaje en el socket: " + +#~ msgid "Encountered array of length %" +#~ msgstr "Se encontró un vector de longitud %" + +#~ msgid "Do not give error for empty directory" +#~ msgstr "No proporcionar error para un directorio vacío" + +#~ msgid "Monitor KEY for changes" +#~ msgstr "Monitorizar cambios en la CLAVE" + +#~ msgid "Manipulate GSettings configuration" +#~ msgstr "Gestionar la configuración de GSettings" + +#~ msgid "" +#~ "You must specify exactly one of --get, --set, --writable or --monitor\n" +#~ msgstr "" +#~ "Debe especificar exactamente una de --get, --set, --writable o --monitor\n" + +#~ msgid "You must specify a schema and a key\n" +#~ msgstr "Debe especificar un esquema y una clave\n" + +#~ msgid "You must specify a schema, a key and a value\n" +#~ msgstr "Debe especificar un esquema, una clave y un valor\n" + +#~ 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 "" +#~ "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 "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.po b/po/et.po new file mode 100644 index 0000000..62bf2c1 --- /dev/null +++ b/po/et.po @@ -0,0 +1,3346 @@ +# GLib'i eesti tõlge. +# Estonian translation of GLib. +# +# Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc. +# Copyright (C) 2007–2011 The GNOME Project. +# This file is distributed under the same license as the GLib package. +# +# Allan Sims , 2002. +# Ivar Smolin , 2005–2011. +# Priit Laes , 2005, 2007, 2009 +# Mattias Põldaru , 2009, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib MASTER\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-12-19 14:17+0000\n" +"PO-Revision-Date: 2012-12-18 14:43+0300\n" +"Last-Translator: Mattias Põldaru \n" +"Language-Team: Estonian \n" +"Language: et\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" + +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s-le edastati liiga suur loendi väärtus" + +#, fuzzy +msgid "Seek not supported on base stream" +msgstr "Voogu pole võimalik kerida" + +#, fuzzy +msgid "Cannot truncate GBufferedInputStream" +msgstr "GMemoryInputStream'i pole võimalik kärpida" + +msgid "Stream is already closed" +msgstr "Voog on juba suletud" + +#, fuzzy +msgid "Truncate not supported on base stream" +msgstr "Andmevoo kärpimine pole toetatud" + +#, c-format +msgid "Operation was cancelled" +msgstr "Operatsioon tühistati" + +msgid "Invalid object, not initialized" +msgstr "Vigane objekt, lähtestamata" + +msgid "Incomplete multibyte sequence in input" +msgstr "Sisendis olev mitmebaidine jada on poolik" + +msgid "Not enough space in destination" +msgstr "Sihtkohas pole piisavalt vaba ruumi" + +msgid "Invalid byte sequence in conversion input" +msgstr "Vigane baidijada sisendi teisendamisel" + +#, c-format +msgid "Error during conversion: %s" +msgstr "Viga teisendamisel: %s" + +msgid "Cancellable initialization not supported" +msgstr "Tühistatav käivitamine ei ole toetatud" + +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Teisendamine koodistikust '%s' koodistikku '%s' ei ole toetatud" + +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada" + +#, c-format +msgid "%s type" +msgstr "%s tüüp" + +msgid "Unknown type" +msgstr "Tundmatu tüüp" + +#, c-format +msgid "%s filetype" +msgstr "%s failitüüp" + +msgid "GCredentials is not implemented on this OS" +msgstr "Selle operatsioonisüsteemi jaoks pole loodud GCredentialsi tuge" + +msgid "There is no GCredentials support for your platform" +msgstr "Sinu platvormile puudub GCredentialsi tugi" + +msgid "Unexpected early end-of-stream" +msgstr "Ootamatult varajane voolõpp" + +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Toetamata võti \"%s\" aadressikirjes \"%s\"" + +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "" + +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" + +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +msgid "Error auto-launching: " +msgstr "Viga automaatsel käivitamisel: " + +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Viga nonce faili '%s' avamisel: %s" + +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Viga nonce failist '%s' lugemisel: %s" + +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Viga nonce failist '%s' lugemisel, oodati 16 baiti, saadi %d" + +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Viga faili kirjutamisel: %s" + +msgid "The given address is empty" +msgstr "Antud aadress on tühi" + +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" + +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Viga failist '%s' lugemisel: %s" + +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" + +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#, c-format +msgid "Unknown bus type %d" +msgstr "Tundmatu siinitüüp %d" + +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#, fuzzy, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Viga kataloogi '%s' avamisel: %s" + +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Viga kataloogi `%s' loomisel: %s" + +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Viga võtmerõnga `%s' avamisel lugemiseks: " + +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Rida %d võtmerõngas kohas '%s' sisuga '%s' on vigane" + +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Küpsist id-ga %d võtmerõngas kohas '%s' ei leitud" + +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Viga iganenud lukufaili '%s' kustutamisel: %s" + +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Viga lukufaili '%s' loomisel: %s" + +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Viga (kustutatud) lukufaili '%s' sulgemisel: %s" + +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Viga lukufaili '%s' kustutamisel: %s" + +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Viga võtmerõnga '%s' avamisel kirjutamiseks:" + +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +msgid "The connection is closed" +msgstr "Ühendus on suletud" + +msgid "Timeout was reached" +msgstr "Ületati ajapiirang" + +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#, c-format +msgid "No such property `%s'" +msgstr "Omadust '%s' pole" + +#, c-format +msgid "Property `%s' is not readable" +msgstr "Omadus `%s' pole loetav" + +#, c-format +msgid "Property `%s' is not writable" +msgstr "Omadus `%s' pole kirjutatav" + +#, c-format +msgid "No such interface `%s'" +msgstr "Liidest '%s' pole" + +msgid "No such interface" +msgstr "Sellist liidest pole" + +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Objektil asukohas %s pole liidest '%s'" + +#, c-format +msgid "No such method `%s'" +msgstr "Meetodit '%s' pole" + +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Kuulaja on juba suletud" + +msgid "type is INVALID" +msgstr "" + +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Analüüsitud väärtus \"%s\" pole korrektne D-Busi objekti rada" + +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Analüüsitud väärtus \"%s\" pole korrektne D-Busi signatuur" + +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +msgid "Cannot deserialize message: " +msgstr "" + +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +msgid "Cannot serialize message: " +msgstr "" + +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Viga faili kirjutamisel: %s" + +msgid "Error return with empty body" +msgstr "" + +#, fuzzy, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Faili pole võimalik prügikasti visata: %s" + +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" + +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +msgid "Abstract name space not supported" +msgstr "Abstraktne nimeruum pole toetatud" + +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Viga faili kirjutamisel: %s" + +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "String `%s' pole korrektne D-Bus GUID" + +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +msgid "COMMAND" +msgstr "KÄSK" + +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#, c-format +msgid "Error: %s\n" +msgstr "Viga: %s\n" + +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "" + +msgid "Connect to the system bus" +msgstr "" + +msgid "Connect to the session bus" +msgstr "" + +msgid "Connect to given D-Bus address" +msgstr "Ühendumine määratud D-Bus aadressiga" + +msgid "Connection Endpoint Options:" +msgstr "" + +msgid "Options specifying the connection endpoint" +msgstr "" + +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +msgid "Optional destination for signal (unique name)" +msgstr "" + +msgid "Object path to emit signal on" +msgstr "" + +msgid "Signal and interface name" +msgstr "" + +msgid "Emit a signal." +msgstr "" + +#, c-format +msgid "Error connecting: %s\n" +msgstr "Viga ühendumisel: %s\n" + +#, fuzzy, c-format +msgid "Error: object path not specified.\n" +msgstr "Viga: objekti rada on määramata\n" + +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Viga: %s pole korrektne objekti rada\n" + +#, fuzzy, c-format +msgid "Error: signal not specified.\n" +msgstr "Viga: sihtkoht on määramata\n" + +#, fuzzy, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Viga: sihtkoht on määramata\n" + +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Viga: %s pole korrektne objekti rada\n" + +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Viga: %s pole korrektne objekti rada\n" + +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Viga: %s pole korrektne objekti rada\n" + +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Viga parameetri %d analüüsimisel: %s\n" + +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Viga ühendusega nõustumisel: %s" + +msgid "Destination name to invoke method on" +msgstr "" + +msgid "Object path to invoke method on" +msgstr "" + +msgid "Method and interface name" +msgstr "" + +#, fuzzy +msgid "Timeout in seconds" +msgstr "Ületati ajapiirang" + +msgid "Invoke a method on a remote object." +msgstr "" + +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Viga: sihtkoht on määramata\n" + +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Viga: objekti rada on määramata\n" + +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Viga: meetodi nimi on määramata\n" + +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Viga: vigane meetodi nimi \"%s\"\n" + +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Viga \"%2$s\" tüüpi parameetri %1$d analüüsimisel: %3$s\n" + +msgid "Destination name to introspect" +msgstr "" + +msgid "Object path to introspect" +msgstr "" + +msgid "Print XML" +msgstr "" + +msgid "Introspect children" +msgstr "" + +msgid "Only print properties" +msgstr "" + +msgid "Introspect a remote object." +msgstr "" + +msgid "Destination name to monitor" +msgstr "" + +msgid "Object path to monitor" +msgstr "" + +msgid "Monitor a remote object." +msgstr "Kaugobjekti monitoorimine." + +msgid "Unnamed" +msgstr "Nimeta" + +msgid "Desktop file didn't specify Exec field" +msgstr "Töölauafail ei määra Exec-välja" + +msgid "Unable to find terminal required for application" +msgstr "" +"Rakenduse käivitamiseks vajalikku terminalprogrammi pole võimalik leida" + +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kasutaja rakenduse seadistustekataloogi %s pole võimalik luua: %s" + +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kasutaja MIME-seadistustekataloogi %s pole võimalik luua: %s" + +msgid "Application information lacks an identifier" +msgstr "" + +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kasutaja töölauafaili %s pole võimalik luua" + +#, c-format +msgid "Custom definition for %s" +msgstr "%s oma definitsioon" + +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. +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "seade ei toeta ei väljastamist ega väljastamist koos operatsiooniga" + +msgid "drive doesn't implement polling for media" +msgstr "seade ei toeta meediumi olemasolu pärimist" + +msgid "drive doesn't implement start" +msgstr "seade ei toeta käivitamist" + +msgid "drive doesn't implement stop" +msgstr "seade ei toeta seiskamist" + +msgid "TLS support is not available" +msgstr "" + +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem'i kodeeringu versioonid %d pole võimalik käsitseda" + +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Vigane märgiste arv (%d) GEmblem'i kodeeringus" + +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon'i kodeeringu versiooni %d pole võimalik käsitseda" + +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Vigane märgiste arv (%d) GEmblemedIcon'i kodeeringus" + +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oodati GEmblem'i GEmblemedIcon'i jaoks" + +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. +msgid "Containing mount does not exist" +msgstr "Sisalduvat haaget pole olemas" + +msgid "Can't copy over directory" +msgstr "Kataloogi peale pole võimalik kopeerida" + +msgid "Can't copy directory over directory" +msgstr "Kataloogi pole võimalik kataloogi peale kopeerida" + +msgid "Target file exists" +msgstr "Sihtfail on olemas" + +msgid "Can't recursively copy directory" +msgstr "Kataloogi pole võimalik rekursiivselt kopeerida" + +msgid "Splice not supported" +msgstr "Ühendamine ei ole toetatud" + +#, c-format +msgid "Error splicing file: %s" +msgstr "Viga faili ühendamisel: %s" + +msgid "Can't copy special file" +msgstr "Erifaili pole võimalik kopeerida" + +msgid "Invalid symlink value given" +msgstr "Määrati vigane nimeviida väärtus" + +msgid "Trash not supported" +msgstr "Prügikast pole toetatud" + +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Failinimed ei tohi sisaldada märki '%c'" + +msgid "volume doesn't implement mount" +msgstr "köide ei toeta haakimist" + +msgid "No application is registered as handling this file" +msgstr "Selle faili käsitlemiseks pole rakendust registreeritud" + +msgid "Enumerator is closed" +msgstr "Nummerdaja on suletud" + +msgid "File enumerator has outstanding operation" +msgstr "Failide nummerdajat kasutatakse väljastpoolt" + +msgid "File enumerator is already closed" +msgstr "Failinummerdaja on juba suletud" + +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon'i kodeeringu versioonid %d pole võimalik käsitseda" + +msgid "Malformed input data for GFileIcon" +msgstr "Vigaselt vormindatud andmed GFileIcon'i jaoks" + +msgid "Stream doesn't support query_info" +msgstr "Voog ei toeta query_info't" + +msgid "Seek not supported on stream" +msgstr "Voogu pole võimalik kerida" + +msgid "Truncate not allowed on input stream" +msgstr "Sisendvoo kärpimine pole lubatud" + +msgid "Truncate not supported on stream" +msgstr "Andmevoo kärpimine pole toetatud" + +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Vale arv märgiseid (%d)" + +#, c-format +msgid "No type for class name %s" +msgstr "Klassinimel %s puudub tüüp" + +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tüüp %s ei toeta GIcon liidest" + +#, c-format +msgid "Type %s is not classed" +msgstr "Liik %s pole klassifitseeritud" + +#, c-format +msgid "Malformed version number: %s" +msgstr "Vigaselt vormindatud versiooninumber: %s" + +#, 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" + +#, fuzzy +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Antud ikooni kodeerimise versiooni pole võimalik käsitseda" + +msgid "No address specified" +msgstr "" + +#, c-format +msgid "Length %u is too long for address" +msgstr "" + +msgid "Address has bits set beyond prefix length" +msgstr "" + +#, fuzzy, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "kohalikku aadressi ei suudeta määrata: %s" + +msgid "Not enough space for socket address" +msgstr "Sokliaadressi jaoks ei ole piisavalt vaba ruumi" + +msgid "Unsupported socket address" +msgstr "Toetamata sokliaadress" + +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 +msgid "Stream has outstanding operation" +msgstr "Voogu juba kasutatakse väljastpoolt" + +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#, fuzzy, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Tõrge kataloogi '%s' muutmisel (%s)" + +#, fuzzy, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Tundmatu võti %s" + +#, fuzzy, c-format +msgid "Failed to create temp file: %s" +msgstr "Tõrge faili '%s' loomisel: %s" + +#, fuzzy, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "Viga nimeviida seadmisel: fail pole nimeviide" + +#, fuzzy, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "Viga nimeviida seadmisel: fail pole nimeviide" + +#, fuzzy, c-format +msgid "Error reading file %s: %s" +msgstr "Viga failist '%s' lugemisel: %s" + +#, fuzzy, c-format +msgid "Error compressing file %s" +msgstr "Viga faili sulgemisel: %s" + +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +msgid "name of the output file" +msgstr "" + +msgid "FILE" +msgstr "" + +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +msgid "DIRECTORY" +msgstr "" + +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +msgid "Generate source header" +msgstr "" + +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +msgid "Generate dependency list" +msgstr "" + +msgid "Don't automatically create and register resource" +msgstr "" + +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "" + +msgid "C identifier name used for the generated source code" +msgstr "" + +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#, c-format +msgid "You should give exactly one file name\n" +msgstr "" + +msgid "empty names are not permitted" +msgstr "tühjad nimed pole lubatud" + +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" + +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" + +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" + +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#, c-format +msgid " already specified" +msgstr "" + +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#, c-format +msgid " already specified" +msgstr "" + +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Vigane rekvisiidi tüüp (oodatakse stringi)" + +msgid " given but schema isn't extending anything" +msgstr "" + +#, c-format +msgid "no to override" +msgstr "" + +#, c-format +msgid " already specified" +msgstr "" + +#, c-format +msgid " already specified" +msgstr "" + +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "" + +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" + +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "" + +#. Translators: Do not translate "--strict". +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Tervet faili ignoreeriti.\n" + +#, c-format +msgid "Ignoring this file.\n" +msgstr "Seda faili ignoreeritakse.\n" + +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" + +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" + +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +msgid "where to store the gschemas.compiled file" +msgstr "" + +msgid "Abort on any errors in schemas" +msgstr "" + +msgid "Do not write the gschema.compiled file" +msgstr "" + +msgid "Do not enforce key name restrictions" +msgstr "" + +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#, c-format +msgid "No schema files found: " +msgstr "Ühtegi skeemifaili ei leitud:" + +#, c-format +msgid "doing nothing.\n" +msgstr "ei tehta midagi.\n" + +#, c-format +msgid "removed existing output file.\n" +msgstr "eemaldati olemasolev väljundfail.\n" + +msgid "Unable to find default local directory monitor type" +msgstr "Vaikimisi kohaliku kataloogimonitori liiki pole võimalik leida" + +#, c-format +msgid "Invalid filename %s" +msgstr "Vigane failinimi %s" + +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Viga failisüsteemi andmete hankimisel: %s" + +msgid "Can't rename root directory" +msgstr "Juurkataloogi nime pole võimalik muuta" + +#, c-format +msgid "Error renaming file: %s" +msgstr "Viga faili nime muutmisel: %s" + +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Faili pole võimalik ümber nimetada, failinimi on juba olemas" + +msgid "Invalid filename" +msgstr "Vigane failinimi" + +msgid "Can't open directory" +msgstr "Kataloogi pole võimalik avada" + +#, c-format +msgid "Error opening file: %s" +msgstr "Viga avamisel: %s" + +#, c-format +msgid "Error removing file: %s" +msgstr "Viga faili eemaldamisel: %s" + +#, c-format +msgid "Error trashing file: %s" +msgstr "Viga faili prügikasti viskamisel: %s" + +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Prügikataloogi %s pole võimalik luua: %s" + +msgid "Unable to find toplevel directory for trash" +msgstr "Prügikasti ülemise taseme kataloogi pole võimalik leida" + +msgid "Unable to find or create trash directory" +msgstr "Prügikasti kataloogi pole võimalik leida või luua" + +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Prügiinfo faili pole võimalik luua: %s" + +#, c-format +msgid "Unable to trash file: %s" +msgstr "Faili pole võimalik prügikasti visata: %s" + +msgid "internal error" +msgstr "sisemine viga" + +#, c-format +msgid "Error creating directory: %s" +msgstr "Viga kataloogi loomisel: %s" + +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Failisüsteem ei toeta nimeviitasid" + +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Viga nimeviida loomisel: %s" + +#, c-format +msgid "Error moving file: %s" +msgstr "Viga faili ümbertõstmisel: %s" + +msgid "Can't move directory over directory" +msgstr "Kataloogi pole võimalik kataloogi peale liigutada" + +msgid "Backup file creation failed" +msgstr "Tõrge varufaili loomisel" + +#, c-format +msgid "Error removing target file: %s" +msgstr "Viga sihtfaili eemaldamisel: %s" + +msgid "Move between mounts not supported" +msgstr "Erinevate haakeseadmete vahel liigutamine pole toetatud" + +msgid "Attribute value must be non-NULL" +msgstr "Rekvisiidi väärtus ei tohi olla NULL" + +msgid "Invalid attribute type (string expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse stringi)" + +msgid "Invalid extended attribute name" +msgstr "Vigane laiendatud rekvisiidi nimi" + +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Viga laiendatud rekvisiidi '%s' seadmisel: %s" + +msgid " (invalid encoding)" +msgstr " (vigane kodeering)" + +#, fuzzy, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Viga faili '%s' avamisel: %s" + +#, fuzzy, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Viga failideskriptori kohta andmete hankimisel: %s" + +msgid "Invalid attribute type (uint32 expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse tüüpi uint32)" + +msgid "Invalid attribute type (uint64 expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse tüüpi uint64)" + +msgid "Invalid attribute type (byte string expected)" +msgstr "Vigane rekvisiidi tüüp (oodatakse baitstringi)" + +msgid "Cannot set permissions on symlinks" +msgstr "Nimeviitadele pole võimalik pääsuõiguseid määrata" + +#, c-format +msgid "Error setting permissions: %s" +msgstr "Viga pääsuõiguste määramisel: %s" + +#, c-format +msgid "Error setting owner: %s" +msgstr "Viga omaniku seadmisel: %s" + +msgid "symlink must be non-NULL" +msgstr "nimeviit ei tohi olla NULL" + +#, c-format +msgid "Error setting symlink: %s" +msgstr "Viga nimeviida seadmisel: %s" + +msgid "Error setting symlink: file is not a symlink" +msgstr "Viga nimeviida seadmisel: fail pole nimeviide" + +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Viga muutmise või kasutamise aja määramisel: %s" + +msgid "SELinux context must be non-NULL" +msgstr "SELinuxi kontekst ei tohi olla NULL" + +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Viga SELinuxi konteksti seadmisel: %s" + +msgid "SELinux is not enabled on this system" +msgstr "SELinux pole selles süsteemis lubatud" + +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Rekvisiidi %s seadmine pole toetatud" + +#, c-format +msgid "Error reading from file: %s" +msgstr "Viga failist lugemisel: %s" + +#, c-format +msgid "Error seeking in file: %s" +msgstr "Viga faili kerimisel: %s" + +#, c-format +msgid "Error closing file: %s" +msgstr "Viga faili sulgemisel: %s" + +msgid "Unable to find default local file monitor type" +msgstr "Failimonitori vaikimisi tüüpi pole võimalik leida" + +#, c-format +msgid "Error writing to file: %s" +msgstr "Viga faili kirjutamisel: %s" + +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Viga vana varuviite eemaldamisel: %s" + +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Viga varukoopia loomisel: %s" + +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Viga ajutise faili nime muutmisel: %s" + +#, c-format +msgid "Error truncating file: %s" +msgstr "Viga faili kärpimisel: %s" + +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Viga faili '%s' avamisel: %s" + +msgid "Target file is a directory" +msgstr "Sihtfail on kataloog" + +msgid "Target file is not a regular file" +msgstr "Sihtfail pole tavaline fail" + +msgid "The file was externally modified" +msgstr "Faili muudeti väljaspool" + +#, c-format +msgid "Error removing old file: %s" +msgstr "Viga vana faili eemaldamisel: %s" + +msgid "Invalid GSeekType supplied" +msgstr "Pakutud GSeekType pole sobiv" + +msgid "Invalid seek request" +msgstr "Sobimatu kerimise päring" + +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream'i pole võimalik kärpida" + +msgid "Memory output stream not resizable" +msgstr "Mäluväljundi voo suurus pole muudetav" + +msgid "Failed to resize memory output stream" +msgstr "Mäluväljundi voo suuruse muutmine nurjus" + +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" + +msgid "Requested seek before the beginning of the stream" +msgstr "Küsitud ümberpositsioneerimine osutab andmevoo algusest ettepoole" + +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. +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. +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. +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. +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. +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. +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. +msgid "mount doesn't implement synchronous content type guessing" +msgstr "haage ei toeta sünkroonset sisutüübi arvamist" + +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostinimi '%s' sisaldab '[' aga mitte ']'" + +msgid "Network unreachable" +msgstr "Võrk pole kättesaadav" + +msgid "Host unreachable" +msgstr "Host pole kättesaadav" + +#, fuzzy, c-format +msgid "Could not create network monitor: %s" +msgstr "kaugaadressi ei suudeta määrata: %s" + +msgid "Could not create network monitor: " +msgstr "Võrgumonitoriga pole võimalik ühenduda:" + +#, fuzzy +msgid "Could not get network status: " +msgstr "kaugaadressi ei suudeta määrata: %s" + +msgid "Output stream doesn't implement write" +msgstr "Väljundvoog ei toeta kirjutusoperatsiooni" + +msgid "Source stream is already closed" +msgstr "Lähtevoog on juba suletud" + +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#, fuzzy, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Sihtfail on kataloog" + +#, fuzzy +msgid "Input stream doesn't implement seek" +msgstr "Sisendvoog ei toeta lugemist" + +msgid "Print help" +msgstr "Prindi abi" + +msgid "[COMMAND]" +msgstr "[KÄSK]" + +msgid "List sections containing resources in an elf FILE" +msgstr "" + +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +msgid "FILE [PATH]" +msgstr "" + +msgid "SECTION" +msgstr "" + +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +msgid "Extract a resource file to stdout" +msgstr "" + +msgid "FILE PATH" +msgstr "" + +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Tundmatu käsk '%s'\n" +"\n" + +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +msgid "Arguments:\n" +msgstr "" + +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +msgid "[PATH]" +msgstr "" + +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +msgid "PATH" +msgstr "" + +msgid " PATH A resource path\n" +msgstr "" + +#, c-format +msgid "No such schema '%s'\n" +msgstr "Skeemi '%s' pole\n" + +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#, c-format +msgid "No such key '%s'\n" +msgstr "Võtit '%s' pole\n" + +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +msgid "List the installed relocatable schemas" +msgstr "" + +msgid "List the keys in SCHEMA" +msgstr "" + +msgid "SCHEMA[:PATH]" +msgstr "" + +msgid "List the children of SCHEMA" +msgstr "" + +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +msgid "[SCHEMA[:PATH]]" +msgstr "" + +msgid "Get the value of KEY" +msgstr "" + +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +msgid "Query the range of valid values for KEY" +msgstr "" + +msgid "Set the value of KEY to VALUE" +msgstr "" + +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +msgid "Reset KEY to its default value" +msgstr "" + +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +msgid "Check if KEY is writable" +msgstr "" + +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +msgid " KEY The key within the schema\n" +msgstr "" + +msgid " VALUE The value to set\n" +msgstr "" + +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +msgid "Invalid socket, not initialized" +msgstr "Vigane sokkel, käivitamata" + +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Vigane sokkel, käivitamine nurjus kuna: %s" + +msgid "Socket is already closed" +msgstr "Sokkel on juba suletud" + +msgid "Socket I/O timed out" +msgstr "" + +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocketi loomine fd-st: %s" + +#, c-format +msgid "Unable to create socket: %s" +msgstr "Soklit pole võimalik luua: %s" + +msgid "Unknown family was specified" +msgstr "Etteantud perekond on tundmatu" + +msgid "Unknown protocol was specified" +msgstr "Etteantud protokoll on tundmatu" + +#, c-format +msgid "could not get local address: %s" +msgstr "kohalikku aadressi ei suudeta määrata: %s" + +#, c-format +msgid "could not get remote address: %s" +msgstr "kaugaadressi ei suudeta määrata: %s" + +#, c-format +msgid "could not listen: %s" +msgstr "pole võimalik kuulata: %s" + +#, c-format +msgid "Error binding to address: %s" +msgstr "Viga aadressile sidumisel: %s" + +#, fuzzy, c-format +msgid "Error joining multicast group: %s" +msgstr "Viga rakenduse käivitamisel: %s" + +#, fuzzy, c-format +msgid "Error leaving multicast group: %s" +msgstr "Viga rakenduse käivitamisel: %s" + +msgid "No support for source-specific multicast" +msgstr "" + +#, c-format +msgid "Error accepting connection: %s" +msgstr "Viga ühendusega nõustumisel: %s" + +msgid "Connection in progress" +msgstr "Ühendumise edenemine" + +#, fuzzy +msgid "Unable to get pending error: " +msgstr "Aktiivset viga pole võimalik saada: %s" + +#, c-format +msgid "Error receiving data: %s" +msgstr "Viga andmete vastuvõtmisel: %s" + +#, c-format +msgid "Error sending data: %s" +msgstr "Viga andmete saatmisel: %s" + +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Soklit pole võimalik luua: %s" + +#, c-format +msgid "Error closing socket: %s" +msgstr "Viga sokli sulgemisel: %s" + +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Sokli ülesseadmise ootamine: %s" + +#, c-format +msgid "Error sending message: %s" +msgstr "Viga sõnumi saatmisel: %s" + +#, fuzzy +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage pole windows-platvormil toetatud" + +#, c-format +msgid "Error receiving message: %s" +msgstr "Viga sõnumi vastuvõtmisel: %s" + +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Aktiivset viga pole võimalik saada: %s" + +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Proksiserveriga %s pole võimalik ühenduda:" + +#, c-format +msgid "Could not connect to %s: " +msgstr "Pole võimalik %s-ga ühenduda:" + +msgid "Could not connect: " +msgstr "Pole võimalik ühenduda:" + +msgid "Unknown error on connect" +msgstr "Tundmatu viga ühendumisel" + +#, fuzzy +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proksimine mitte-TCP ühenduse kaudu pole toetatud." + +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proksi protokoll `%s' pole toetatud." + +msgid "Listener is already closed" +msgstr "Kuulaja on juba suletud" + +msgid "Added socket is closed" +msgstr "Lisatud sokkel on suletud" + +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ei toeta IPv6-aadressi '%s'" + +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Kasutajanimi on SOCKSv4 protokolli jaoks liiga pikk" + +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Hostinimi '%s' on SOCKSv4 protokolli jaoks liiga pikk" + +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Server ei ole SOCKSv4 proksiserver." + +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Ühendus läbi SOCKSv4-serveri lükati tagasi" + +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Server ei ole SOCKSv5 proksiserver." + +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 proksi nõuab autentimist." + +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 proksi nõuab GLibi poolt toetamata autentimismeetodit." + +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Kasutajanimi või parool on SOCKSv5 protokolli jaoks liiga pikk." + +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 autentimine nurjus vale kasutajanime või parooli tõttu." + +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Hostinimi '%s' on SOCKSv5 protokolli jaoks liiga pikk" + +#, fuzzy +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 proksi nõuab autentimist." + +msgid "Internal SOCKSv5 proxy server error." +msgstr "Sisemine SOCKSv5 proksiserveri viga." + +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +msgid "Unknown SOCKSv5 proxy error." +msgstr "SOCKSv5 proksi tundmatu viga." + +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon kodeeringu versiooni %d pole võimalik käsitseda" + +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Viga '%s' lahendamisel: %s" + +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Viga '%s' pöördlahendamisel: %s" + +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ajutiselt pole võimalik '%s' lahendada" + +#, c-format +msgid "Error resolving '%s'" +msgstr "Viga '%s' lahendamisel" + +#, fuzzy +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-kodeeritud privaatvõtit pole võimalik analüüsida" + +#, fuzzy +msgid "No PEM-encoded private key found" +msgstr "PEM-kodeeritud sertifikaati ei leitud" + +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-kodeeritud privaatvõtit pole võimalik analüüsida" + +msgid "No PEM-encoded certificate found" +msgstr "PEM-kodeeritud sertifikaati ei leitud" + +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-kodeeritud sertifikaati pole võimalik analüüsida" + +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +msgid "The password entered is incorrect." +msgstr "Sisestatud parool on vale." + +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Eeldati ühte kontrollsõnumit, aga saadi %d" + +msgid "Unexpected type of ancillary data" +msgstr "Ootamatu kõrvalteabe tüüp" + +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Eeldati ühte fd-d, aga saadi %d\n" + +msgid "Received invalid fd" +msgstr "Saadi vigane fd" + +msgid "Error sending credentials: " +msgstr "Viga tõendite saatmisel: " + +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Viga SO_PASSCRED lubamisel: %s" + +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "Eeldati ühte kontrollsõnumit, aga saadi %d" + +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Viga SO_PASSCRED keelamisel: %s" + +#, fuzzy, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Viga failideskriptori kohta andmete hankimisel: %s" + +#, fuzzy, c-format +msgid "Error closing file descriptor: %s" +msgstr "Viga failideskriptori kohta andmete hankimisel: %s" + +msgid "Filesystem root" +msgstr "Failisüsteemi juurikas" + +#, fuzzy, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Viga failideskriptori kohta andmete hankimisel: %s" + +#, fuzzy +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"Abstraktse unix-domeeni sokliaadressid ei ole sellel süsteemil toetatud" + +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. +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "köide ei toeta haakimist või haakimist koos tegevusega" + +msgid "Can't find application" +msgstr "Rakendust pole võimalik leida" + +#, c-format +msgid "Error launching application: %s" +msgstr "Viga rakenduse käivitamisel: %s" + +msgid "URIs not supported" +msgstr "URI-d ei ole toetatud" + +msgid "association changes not supported on win32" +msgstr "seose muutmine pole win32 keskkonnas toetatud" + +msgid "Association creation not supported on win32" +msgstr "Seose loomine pole win32 keskkonnas toetatud" + +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Viga pidemest lugemisel: %s" + +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Viga pideme sulgemisel: %s" + +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Viga faili kirjutamisel: %s" + +msgid "Not enough memory" +msgstr "Pole piisavalt mälu" + +#, c-format +msgid "Internal error: %s" +msgstr "Sisemine viga: %s" + +msgid "Need more input" +msgstr "Vaja on rohkem sisendit" + +msgid "Invalid compressed data" +msgstr "Vigaselt pakitud andmed" + +msgid "Address to listen on" +msgstr "" + +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +msgid "Print address" +msgstr "Prindi aadress" + +msgid "Print address in shell mode" +msgstr "" + +msgid "Run a dbus service" +msgstr "" + +#, c-format +msgid "Wrong args\n" +msgstr "" + +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Ootamatu rekvisiit '%s' elemendile '%s'" + +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Elemendil '%2$s' ei leitud rekvisiiti '%1$s'" + +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Ootamatu silt '%s', oodati silti '%s'" + +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' on ootamatu silt '%1$s'" + +msgid "No valid bookmark file found in data dirs" +msgstr "Andmekataloogidest ei leitud korrektset järjehoidjafaili" + +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI-le '%s' on juba järjehoidja olemas" + +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI-le '%s' ei leitud järjehoidjat" + +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole MIME tüüpe määratud" + +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole privaatlippu kirjeldatud" + +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' järjehoidjas pole gruppe määratud" + +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Rakendus nimega '%s' pole '%s' kohta järjehoidjat registreerinud" + +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Tõrge rea '%s' käivitamisel koos URI-ga '%s'" + +msgid "Partial character sequence at end of input" +msgstr "Osaline märgijada sisendi lõpus" + +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Taandresiimi '%s' pole võimalik teisendada kooditabelisse '%s'" + +#, 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" + +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Kohaliku faili URI '%s' ei või sisaldada märki '#'" + +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' on vigane" + +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' hostinimi on vigane" + +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sisaldab vigaseid paomärke" + +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Rajanimi '%s' ei ole absoluutne rada" + +msgid "Invalid hostname" +msgstr "Vigane hostinimi" + +#. Translators: 'before midday' indicator +msgctxt "GDateTime" +msgid "AM" +msgstr "EL" + +#. Translators: 'after midday' indicator +msgctxt "GDateTime" +msgid "PM" +msgstr "PL" + +#. Translators: this is the preferred format for expressing the date and the time +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "" + +#. Translators: this is the preferred format for expressing the date +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d. %m %y" + +#. Translators: this is the preferred format for expressing the time +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +msgctxt "full month name" +msgid "January" +msgstr "Jaanuar" + +msgctxt "full month name" +msgid "February" +msgstr "Veebruar" + +msgctxt "full month name" +msgid "March" +msgstr "Märts" + +msgctxt "full month name" +msgid "April" +msgstr "Aprill" + +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +msgctxt "full month name" +msgid "June" +msgstr "Juuni" + +msgctxt "full month name" +msgid "July" +msgstr "Juuli" + +msgctxt "full month name" +msgid "August" +msgstr "August" + +msgctxt "full month name" +msgid "September" +msgstr "September" + +msgctxt "full month name" +msgid "October" +msgstr "Oktoober" + +msgctxt "full month name" +msgid "November" +msgstr "November" + +msgctxt "full month name" +msgid "December" +msgstr "Detsember" + +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jaan" + +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Veebr" + +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Märts" + +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Juun" + +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Juul" + +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sept" + +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dets" + +msgctxt "full weekday name" +msgid "Monday" +msgstr "Esmaspäev" + +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Teisipäev" + +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Kolmapäev" + +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Neljapäev" + +msgctxt "full weekday name" +msgid "Friday" +msgstr "Reede" + +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Laupäev" + +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Pühapäev" + +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "E" + +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "T" + +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "K" + +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "N" + +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "R" + +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "L" + +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "P" + +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Viga kataloogi '%s' avamisel: %s" + +#, fuzzy, c-format +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Ei saa eraldada %lu faili \"%s\" lugemiseks" +msgstr[1] "Ei saa eraldada %lu faili \"%s\" lugemiseks" + +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Viga failist '%s' lugemisel: %s" + +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fail \"%s\" on liiga suur" + +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Tõrge failist '%s' lugemisel: %s" + +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tõrge faili '%s' avamisel: %s" + +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Tõrge faili '%s' rekvisiitide hankimisel: fstat() nurjus: %s" + +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Tõrge faili '%s' avamisel: fdopen() nurjus: %s" + +#, 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" + +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tõrge faili '%s' loomisel: %s" + +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Tõrge faili '%s' avamisel kirjutamiseks: fdopen() nurjus: %s" + +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fwrite() nurjus: %s" + +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fflush() nurjus: %s" + +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Tõrge faili '%s' kirjutamisel: fsync() nurjus: %s" + +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Tõrge faili '%s' sulgemisel: fclose() nurjus: %s" + +#, 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" + +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mall '%s' vigane, see ei tohiks sisaldada '%s'" + +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mall '%s' ei sisalda XXXXXX-i" + +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Tõrge nimeviida '%s' lugemisel: %s" + +msgid "Symbolic links not supported" +msgstr "Nimeviidad ei ole toetatud" + +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Konverterit '%s'-st '%s'-ks pole võimalik avada: %s" + +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" + +msgid "Leftover unconverted data in read buffer" +msgstr "Lugemispuhvrisse jäi teisendamata andmeid" + +msgid "Channel terminates in a partial character" +msgstr "Kanali katkestus poole märgi pealt" + +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" + +msgid "Valid key file could not be found in search dirs" +msgstr "Sobivat võtmefaili pole võimalik otsingukataloogidest leida" + +msgid "Not a regular file" +msgstr "Pole tavaline fail" + +#, 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" + +#, c-format +msgid "Invalid group name: %s" +msgstr "Vigane grupi nimi: %s" + +msgid "Key file does not start with a group" +msgstr "Võtmefail ei alga grupiga" + +#, c-format +msgid "Invalid key name: %s" +msgstr "Vigane võtme nimi: %s" + +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Võtmefail sisaldab toetamata kodeeringut '%s'" + +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Võtmefail ei sisalda gruppi '%s'" + +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Võtmefail ei sisalda võtit '%s'" + +#, 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" + +#, 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." + +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Võtmefail sisaldab võtit '%s' grupis '%s' aga selle väärtust pole võimalik " +"kasutada" + +#, fuzzy, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"Võtmefail sisaldab võtit '%s' grupis '%s' aga selle väärtust pole võimalik " +"kasutada" + +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Võtmefail ei sisalda võtit '%s' grupis '%s'" + +msgid "Key file contains escape character at end of line" +msgstr "Võtmefail sisaldab rea lõpus paomärki" + +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Võtmefail sisaldab vigast paojada '%s'" + +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Väärtust '%s' pole võimalik numbrilise väärtusena kasutada." + +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Täisarvu väärtus '%s' on väljaspool lubatud piire" + +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Väärtust '%s' pole võimalik ujukomalise väärtusena kasutada." + +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Väärtust '%s' pole võimalik tõeväärtusena kasutada." + +#, fuzzy, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Tõrge faili '%s' rekvisiitide hankimisel: fstat() nurjus: %s" + +#, fuzzy, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Tõrge faili '%s' avamisel: mmap() nurjus: %s" + +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Tõrge faili '%s' avamisel: open() nurjus: %s" + +#, c-format +msgid "Error on line %d char %d: " +msgstr "Viga real %d märgil %d: " + +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nimes on vigaselt kodeeritud UTF-8 tekst - vigane '%s'" + +#, c-format +msgid "'%s' is not a valid name" +msgstr "'%s' pole korrektne nimi " + +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' pole korrektne nimi: '%c' " + +#, c-format +msgid "Error on line %d: %s" +msgstr "Viga real %d: %s" + +#, 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' analüüsimisel. See võiks olla märgiviites olev number (näiteks " +"ê) - võib-olla on number liiga suur" + +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 &" + +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Märgiviide '%-.*s' ei teisendu lubatud märgiks" + +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Avastati tühi olem '&'; lubatud olemid on: & " < > '" + +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Olemi nimi '%-.*s' on tundmatu" + +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 &" + +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument peab algama elemendiga (nt: )" + +#, 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" + +#, 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 '>'" + +#, 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 '='" + +#, 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?" + +#, 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')" + +#, 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 '>'" + +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' on suletud, avatud elemente ei ole" + +#, 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'" + +msgid "Document was empty or contained only whitespace" +msgstr "Dokument on tühi või sisaldab ainult tühja ruumi" + +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument lõppes ootamatult ilma avatud nurksulgu '<' sulgemata" + +#, 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" + +#, 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" + +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument lõppes ootamatult elemendi nime sees" + +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument lõppes ootamatult rekvisiidi nime sees" + +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument lõppes ootamatult elemendi avamise sildi sees" + +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" + +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument lõppes ootamatult keset attribuudi väärtust" + +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument lõppes ootamatult elementi '%s' sulgemissildi sees" + +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument lõppes ootamatult kommentaaride või töötlemis juhiste sees" + +msgid "Usage:" +msgstr "Kasutamine:" + +msgid "[OPTION...]" +msgstr "[VÕTI...]" + +msgid "Help Options:" +msgstr "Abiteabe võtmed:" + +msgid "Show help options" +msgstr "Abiteabe võtmete näitamine" + +msgid "Show all help options" +msgstr "Kõikide abiteabe võtmete näitamine" + +msgid "Application Options:" +msgstr "Rakenduse võtmed:" + +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Täisarvulist väärtust '%s' pole võimalik %s jaoks parsida" + +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Täisarv '%s' %s jaoks on väljaspool lubatud piire" + +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Arvväärtust '%s' pole võimalik %s jaoks parsida" + +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Arv '%s' %s jaoks on väljaspool lubatud piire" + +#, c-format +msgid "Error parsing option %s" +msgstr "Viga võtme analüüsimisel: %s" + +#, c-format +msgid "Missing argument for %s" +msgstr "Puuduv argument %s'i jaoks" + +#, c-format +msgid "Unknown option %s" +msgstr "Tundmatu võti %s" + +msgid "corrupted object" +msgstr "rikutud objekt" + +msgid "internal error or corrupted object" +msgstr "sisemine viga või rikutud objekt" + +msgid "out of memory" +msgstr "mälu lõppes" + +msgid "backtracking limit reached" +msgstr "tagasiviidete limiit saavutatud" + +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"muster sisaldab kirjeid, mis pole osalise vastavuse otsingu puhul toetatud" + +msgid "back references as conditions are not supported for partial matching" +msgstr "osaliste vastete otsimisel pole tingimuslikud tagasiviited toetatud" + +msgid "recursion limit reached" +msgstr "suurim rekursioonide arv saavutatud" + +msgid "invalid combination of newline flags" +msgstr "vigane reavahetusmärgiste kombinatsioon" + +msgid "bad offset" +msgstr "vale nihe" + +msgid "short utf8" +msgstr "lühike utf8" + +msgid "recursion loop" +msgstr "" + +msgid "unknown error" +msgstr "tundmatu viga" + +msgid "\\ at end of pattern" +msgstr "\\ mustri lõpus" + +msgid "\\c at end of pattern" +msgstr "\\c mustri lõpus" + +msgid "unrecognized character following \\" +msgstr "\\ järel on tundmatu märk" + +msgid "numbers out of order in {} quantifier" +msgstr "{} kvantori numbrid pole järjekorras" + +msgid "number too big in {} quantifier" +msgstr "{} kvantori number liiga suur" + +msgid "missing terminating ] for character class" +msgstr "märgiklassil puudub sulgev ]" + +msgid "invalid escape sequence in character class" +msgstr "märgiklassis on vigane paojada" + +msgid "range out of order in character class" +msgstr "märgiklassi vahemik pole järjekorras" + +msgid "nothing to repeat" +msgstr "pole midagi korrata" + +msgid "unexpected repeat" +msgstr "ootamatu kordus" + +msgid "unrecognized character after (? or (?-" +msgstr "tundmatu märk pärast (? või (?-" + +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-i nimelised klassid on toetatud ainult klassi sees" + +msgid "missing terminating )" +msgstr "puudub lõpetav sulg )" + +msgid "reference to non-existent subpattern" +msgstr "viide olematule alammustrile" + +msgid "missing ) after comment" +msgstr "kommentaari järel puudub sulg )" + +msgid "regular expression is too large" +msgstr "regulaaravaldis on liiga pikk" + +msgid "failed to get memory" +msgstr "tõrge mälu hankimisel" + +msgid ") without opening (" +msgstr ") ilma algussuluta (" + +msgid "code overflow" +msgstr "koodi ületäitumine" + +msgid "unrecognized character after (?<" +msgstr "tundmatu märk pärast (?<" + +msgid "lookbehind assertion is not fixed length" +msgstr "tagasivaate esitus ei oma kindlat suurust" + +msgid "malformed number or name after (?(" +msgstr "vigane number või nimi pärast (?(" + +msgid "conditional group contains more than two branches" +msgstr "tingimusgrupp sisaldab rohkem kui kahte haru" + +msgid "assertion expected after (?(" +msgstr "(?( järel oodatakse esitust" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R või (?[+-]digits järel peab olema )" + +msgid "unknown POSIX class name" +msgstr "tundmatu POSIX-klassi nimi" + +msgid "POSIX collating elements are not supported" +msgstr "POSIX-i koondavad elemendid pole toetatud" + +msgid "character value in \\x{...} sequence is too large" +msgstr "märgi väärtus \\x{...} jadas on liiga suur" + +msgid "invalid condition (?(0)" +msgstr "vigane tingimus (?(0)" + +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ei ole tagasivaate esituses lubatud" + +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" + +msgid "recursive call could loop indefinitely" +msgstr "rekursiivne kutsung võib jääda lõpmatusse tsüklisse" + +msgid "unrecognized character after (?P" +msgstr "tundmatu märk pärast (?P" + +msgid "missing terminator in subpattern name" +msgstr "alammustri nimes puudub katkestaja" + +msgid "two named subpatterns have the same name" +msgstr "kaks nimelist alammustrit on sama nimega" + +msgid "malformed \\P or \\p sequence" +msgstr "vigane \\P või \\p jada" + +msgid "unknown property name after \\P or \\p" +msgstr "tundmatu omaduse nimi \\P või \\p järel" + +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alammustri nimi on liiga pikk (maksimaalselt 32 märki)" + +msgid "too many named subpatterns (maximum 10,000)" +msgstr "liiga palju alammustreid (suurim lubatud arv on 10 000)" + +msgid "octal value is greater than \\377" +msgstr "kaheksandväärtus on suurem kui \\377" + +msgid "overran compiling workspace" +msgstr "kompilaatori tööruumi ületäitumine" + +msgid "previously-checked referenced subpattern not found" +msgstr "varem kontrollitud viidatud alammustrid ei leitud" + +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupp sisaldab rohkem kui ühte haru" + +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE võtmed pole kooskõlalised" + +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"võtmele \\g ei järgne looksulgude, nurksulgude ega jutumärkide vahel olev " +"nimi või number ega ka lihtsalt number" + +msgid "a numbered reference must not be zero" +msgstr "" + +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" + +msgid "(*VERB) not recognized" +msgstr "" + +msgid "number is too big" +msgstr "" + +msgid "missing subpattern name after (?&" +msgstr "(?& järel puudub alammustri nimi" + +msgid "digit expected after (?+" +msgstr "(?+ järel oodati numbrit" + +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" + +msgid "different names for subpatterns of the same number are not allowed" +msgstr "sama taseme kaks nimelist alammustrit ei tohi olla sama nimega" + +msgid "(*MARK) must have an argument" +msgstr "" + +msgid "\\c must be followed by an ASCII character" +msgstr "" + +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"võtmele \\k ei järgne looksulgude, nurksulgude või jutumärkide vahel olev " +"nimi" + +msgid "\\N is not supported in a class" +msgstr "klass ei toeta \\N" + +msgid "too many forward references" +msgstr "" + +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "" + +msgid "character value in \\u.... sequence is too large" +msgstr "märgi väärtus \\u.... jadas on liiga suur" + +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Viga regulaaravaldise %s vastavuse otsimisel: %s" + +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE teek on kompileeritud ilma UTF8 toeta" + +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE teek on kompileeritud ilma UTF8 omaduste toeta" + +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE teek on kompileeritud sobimatute valikutega" + +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Viga regulaaravaldise %s kompileerimisel %d. märgi juures: %s" + +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Viga regulaaravaldise %s optimeerimisel: %s" + +msgid "hexadecimal digit or '}' expected" +msgstr "oodati kuueteistkümnendsüsteemi numbrit või '}' märki" + +msgid "hexadecimal digit expected" +msgstr "oodati kuueteistkümnendsüsteemi numbrit" + +msgid "missing '<' in symbolic reference" +msgstr "puuduv '<' märgiviites" + +msgid "unfinished symbolic reference" +msgstr "lõpetamata märgiviide" + +msgid "zero-length symbolic reference" +msgstr "nullpikkusega märgiviide" + +msgid "digit expected" +msgstr "oodati numbrit" + +msgid "illegal symbolic reference" +msgstr "keelatud märgiviide" + +msgid "stray final '\\'" +msgstr "liigne lõpp '\\'" + +msgid "unknown escape sequence" +msgstr "tundmatu paojada" + +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Viga asendusteksti \"%s\" analüüsimisel märgi %lu kohal: %s" + +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tsiteeritav tekst ei alga jutumärgiga" + +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Vastavuseta jutumärk käsureal või kestprogrammi tsiteeritud tekstis" + +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Tekst lõppes pärast '\\' märki. (Tekst on '%s')" + +#, 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')" + +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst puudus (või sisaldas ainult tühja ruumi)" + +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Tõrge andmete lugemisel alamprotsessilt (%s)" + +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ootamatu funktsiooni select() viga andmete lugemisel alamprotsessilt (%s)" + +#, c-format +msgid "Child process exited with code %ld" +msgstr "" + +#, c-format +msgid "Child process killed by signal %ld" +msgstr "" + +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "" + +#, c-format +msgid "Child process exited abnormally" +msgstr "" + +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Tõrge alamprotsessi torust lugemisel (%s)" + +#, c-format +msgid "Failed to fork (%s)" +msgstr "Viga poolitamisel funktsiooniga fork() (%s)" + +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Tõrge kataloogi '%s' muutmisel (%s)" + +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Tõrge alamprotsessi \"%s\" käivitamisel (%s)" + +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Tõrge alamprotsessi sisendi või väljundi ümbersuunamisel (%s)" + +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Tõrge alamprotsessi poolitamisel funktsiooniga fork() (%s)" + +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Tundmatu viga alamprotsessi \"%s\" käivitamisel" + +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Tõrge piisavate andmete lugemisel lapsprotsessi torust (%s)" + +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Tõrge toru loomisel alamprotsessiga suhtlemiseks (%s)" + +msgid "Failed to read data from child process" +msgstr "Tõrge andmete lugemisel alamprotsessilt" + +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Tõrge alamprotsessi käivitamisel (%s)" + +#, c-format +msgid "Invalid program name: %s" +msgstr "Vigane programmi nimi: %s" + +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Vigane string argumendivektoris %d: %s" + +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Vigane string keskkonnamuutujates: %s" + +#, c-format +msgid "Invalid working directory: %s" +msgstr "Vigane töökataloog: %s" + +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Tõrge abiprogrammi käivitamisel (%s)" + +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" + +msgid "Character out of range for UTF-8" +msgstr "Märk on väljaspool UTF-8 ulatust" + +msgid "Invalid sequence in conversion input" +msgstr "Vigane jada sisendi teisendamisel" + +msgid "Character out of range for UTF-16" +msgstr "Märk on väljaspool UTF-16 ulatust" + +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bait" +msgstr[1] "%u baiti" + +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bait" +msgstr[1] "%s baiti" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Ootamatu viga funktsioonis waitpid() (%s)" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Käsk '%s' väljus mitteväljumise olekuga %d: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' teenuskirje puudub" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "töötsooni suurim tühjade alamstringide arv saavutatud" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "tõstumuutmise märgid (\\l, \\L, \\u, \\U) pole siin lubatud" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE grupi kordused pole lubatud" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "el" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pl" + +#~ msgid "File is empty" +#~ msgstr "Fail on tühi" + +#~ 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." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Viga faili '%s' kohta andmete hankimisel: %s" + +#~ msgid "Error connecting: " +#~ msgstr "Viga ühendumisel: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Viga ühendumisel: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 implementatsioon piirab kasutajanime pikkuse %i märgiga" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4 implementatsioon piirab hostinime pikkuse %i märgiga" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Viga unix'ist lugemisel: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Viga unix'i sulgemisel: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Viga unix'isse kirjutamisel: %s" diff --git a/po/eu.po b/po/eu.po new file mode 100644 index 0000000..1e37b03 --- /dev/null +++ b/po/eu.po @@ -0,0 +1,4370 @@ +# translation of eu_to_be_translate.po to Basque +# Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# +# Joseba Bidaurrazaga van Dierdonck , 2001. +# Hizkuntza Politikarako Sailburuordetza , 2004. +# Iñaki Larrañaga Murgoitio , 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012. +# Iñaki Larrañaga Murgoitio , 2007. +msgid "" +msgstr "" +"Project-Id-Version: eu_to_be_translate\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-03-03 11:52+0100\n" +"PO-Revision-Date: 2012-03-03 14:42+0100\n" +"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"Language-Team: Basque \n" +"Language: eu\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" +"\n" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Zenbaketaren balio handiegia honi pasatuta: %s" + +#: ../gio/gbufferedinputstream.c:882 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "Korrontea jadanik itxita dago" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1834 +#: ../gio/gdbusconnection.c:1925 ../gio/gdbusconnection.c:2099 +#: ../gio/gdbusprivate.c:1413 ../gio/glocalfile.c:2133 +#: ../gio/gsimpleasyncresult.c:810 ../gio/gsimpleasyncresult.c:836 +#, c-format +msgid "Operation was cancelled" +msgstr "Eragiketa bertan behera utzi da" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Baliogabeko objektua, hasieratu gabe dago" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Byteen sekuentzia baliogabea sarreran" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Ez dago nahikoa lekurik helburuan" + +#: ../gio/gcharsetconverter.c:345 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Byteen sekuentzia baliogabea bihurketa-sarreran" + +#: ../gio/gcharsetconverter.c:350 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Errorea bihurtzean: %s" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:954 +msgid "Cancellable initialization not supported" +msgstr "Hasieratzea bertan behera uztea ez dago onartuta" + +#: ../gio/gcharsetconverter.c:458 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' karaktere-multzoa '%s' bihurtzea ez da onartzen" + +#: ../gio/gcharsetconverter.c:462 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ezin izan da '%s'(e)tik %s(e)rako bihurtzailea ireki" + +#: ../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:680 +#, c-format +msgid "%s type" +msgstr "%s mota" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ez dago inplementatuta S.E. honetan" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Ez dago GCredentials euskarririk plataforma honetan" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Ustekabeko korronte-amaiera azkarregia" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Onartu gabeko '%s' gakoa helbidearen '%s' sarreran" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"'%s' helbidea baliogabea da (gako hauetariko bat behar du: 'path' (bide-" +"izena), 'tmpdir' (aldi baterako direktorioa) edo 'abstract' (abstraktua))" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Zentzurik gabeko gakoa/balioa bikotearen konbinazioa '%s' helbidearen " +"sarreran" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Errorea '%s' helbidean - atakaren atributua gaizki osatuta dago" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Errorea '%s' helbidean - familiaren atributua gaizki osatuta dago" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "'%s' helbidearen elementuak ez dauka bi punturik (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"%d. gakoa/balioa bikoteak, '%s', '%s' helbidearen elementuan, ez dauka " +"berdina (=) ikurrik" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Errorea gakoa edo balioa iheseko modutik kentzean %d. gakoa/balioa bikotean, " +"'%s', '%s' helbidearen elementuan" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Errorea '%s' helbidean - unix-eko garraioak 'path' edo 'abstract' " +"gakoetariko bat behar du hain zuzen." + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Errorea '%s' helbidean - ostalariaren atributua falta da edo gaizki osatuta " +"dago" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Errorea '%s' helbidean - atakaren atributua falta da edo gaizki osatuta dago" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Errorea '%s' helbidean - izendapenaren fitxategiaren atributua falta da edo " +"gaizki osatuta dago" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Errorea automatikoki abiaraztean: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "'%2$s' helbidearen '%1$s' garraioa ezezaguna edo onartu gabea" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Errorea '%s' izendapeneko fitxategia irekitzean: %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Errorea '%s' izendapeneko fitxategitik irakurtzean: %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Errorea '%s' izendapeneko fitxategitik irakurtzean: 16 byte espero ziren, " +"baina %d lortu dira" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Errorea '%s' izendapeneko fitxategiko edukia korrontean idaztean:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "Emandako helbidea hutsik dago" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ezin da mezuaren deia abiarazi makinaren IDrik gabe: " + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Errorea '%s' komando-lerroa abiaraztean: " + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Ustekabeko programaren amaiera '%s' komando-lerroa abiaraztean: %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "'%s' komando-lerroa zero ez den %d egoerarekin irten da: %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Ezin da saioaren bus-eko helbidea zehaztu (ez dago S.E. honetan garatuta)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6688 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Ezin da bus-aren helbidea zehaztua inguruneko DBUS_STARTER_BUS_TYPE " +"aldagaitik. '%s' balio ezezaguna" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6697 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Ezin da bus-aren helbidea zehaztua, inguruneko DBUS_STARTER_BUS_TYPE " +"aldagaia ezarri gabe dagoelako" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "%d bus mota ezezaguna" + +#: ../gio/gdbusauth.c:287 +msgid "Unexpected lack of content trying to read a line" +msgstr "Edukiaren zati bat falta da lerro bat irakurtzean" + +#: ../gio/gdbusauth.c:331 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Edukiaren zati bat falta da lerro bat modu seguruan irakurtzean" + +#: ../gio/gdbusauth.c:502 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Autentifikazioko metodo guztiak agortuta (saiatuta: %s) (erabilgarri: %s)" + +#: ../gio/gdbusauth.c:1158 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" +"Bertan behera utzita GDBusAuthObserver::authorize-authenticated-peer erabiliz" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Errorea '%s' direktorioaren informazioa eskuratzean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"'%s' direktorioko baimenak gaizki osatuta. 0700 modua espero zen, baina 0%o " +"lortuta" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Errorea '%s' direktorioa sortzean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Errorea '%s' gako sorta irakurtzeko irekitzean: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"'%2$s'(e)ngo gako sortako %1$d. lerroa ('%3$s' edukiarekin) gaizki osatuta " +"dago" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"'%2$s'(e)ngo gako sortako %1$d. lerroko aurreneko tokena ('%3$s' " +"edukiarekin) gaizki osatuta dago" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"'%2$s'(e)ngo gako sortako %1$d. lerroko bigarren tokena ('%3$s' edukiarekin) " +"gaizki osatuta dago" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Ez da %d IDko cookie-rik aurkitu '%s'(e)ngo gako sortan" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Errorea blokeoaren '%s' fitxategi zaharkitua ezabatzean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Errorea blokeoko '%s' fitxategia sortzean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Errorea blokeoko (estekatu gabeko) '%s' fitxategia ixtean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Errorea blokeoko '%s' fitxategia desestekatzean: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Errorea '%s' gako sorta idazteko irekitzean: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Gainera, '%s'(r)en blokeoa askatzeak ere huts egin du: %s) " + +#: ../gio/gdbusconnection.c:594 ../gio/gdbusconnection.c:2402 +msgid "The connection is closed" +msgstr "Konexioa itxi egin da" + +#: ../gio/gdbusconnection.c:1879 +msgid "Timeout was reached" +msgstr "Denbora-mugara iritsi da" + +#: ../gio/gdbusconnection.c:2524 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Onartu gabeko banderak aurkitu dira bezeroaren aldeko konexioa eraikitzean" + +#: ../gio/gdbusconnection.c:4026 ../gio/gdbusconnection.c:4342 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Ez dago 'org.freedesktop.DBus.Properties' bezalako interfazerik '%s' bide-" +"izeneko objektuan" + +#: ../gio/gdbusconnection.c:4097 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Errorea '%s' propietatea ezartzean: '%s' mota espero zen, baina '%s' lortu da" + +#: ../gio/gdbusconnection.c:4192 +#, c-format +msgid "No such property `%s'" +msgstr "Ez dago '%s' bezalako propietaterik" + +#: ../gio/gdbusconnection.c:4204 +#, c-format +msgid "Property `%s' is not readable" +msgstr "%s propietatea ez da irakurgarria" + +#: ../gio/gdbusconnection.c:4215 +#, c-format +msgid "Property `%s' is not writable" +msgstr "%s propietatea ez da idazgarria" + +#: ../gio/gdbusconnection.c:4285 ../gio/gdbusconnection.c:6131 +#, c-format +msgid "No such interface `%s'" +msgstr "Ez dago '%s' bezalako interfazerik" + +#: ../gio/gdbusconnection.c:4469 +msgid "No such interface" +msgstr "Ez dago halako interfazerik" + +#: ../gio/gdbusconnection.c:4690 ../gio/gdbusconnection.c:6637 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Ez dago '%s' bezalako interfazerik '%s' bide-izeneko objektuan" + +#: ../gio/gdbusconnection.c:4742 +#, c-format +msgid "No such method `%s'" +msgstr "Ez dago '%s' bezalako metodorik" + +#: ../gio/gdbusconnection.c:4773 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "'%s' mezu mota ez dator bat espero zen '%s' motarekin" + +#: ../gio/gdbusconnection.c:4993 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Jadanik objektu bat esportatuta dago %s interfazearentzako %s(e)n" + +#: ../gio/gdbusconnection.c:5191 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "'%s' metodoak '%s' mota itzuli du, baina '%s' espero zen" + +#: ../gio/gdbusconnection.c:6242 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" +"'%2$s' interfazeko '%1$s' metodoa '%3$s' sinadurarekin ez da existitzen" + +#: ../gio/gdbusconnection.c:6361 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Azpizuhaitza jadanik %s(e)ra esportatuta" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "mota baliogabea da" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL-en mezua: goiburuko PATH edo MEMBER eremua falta da" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN-en mezua: goiburuko REPLY_SERIAL eremua falta da" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR-en mezua: goiburuko REPLY_SERIAL edo ERROR_NAME eremua falta da" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL-en mezua: goiburuko PATH, INTERFACE edo MEMBER eremua falta da" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL-en mezua: goiburuko PATH eremua '/org/freedesktop/DBus/Local' balio " +"erreserbatua erabiltzen ari da" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL-en mezua: goiburuko INTERFACE eremua '/org/freedesktop/DBus/Local' " +"balio erreserbatua erabiltzen ari da" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +"%lu byte irakurtzea nahi zen, baina fitxategiaren amaiera (EOF) lortu da" +msgstr[1] "" +"%lu byte irakurtzea nahi ziren, baina fitxategiaren amaiera (EOF) lortu da" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Baliozko UTF-8 katea espero zen, baina baliogabeko byte batzuk aurkitu dira " +"byteen %d desplazamenduan (katearen luzera: %d). Ordurarteko baliozko UTF-8 " +"katea honakoa zen: '%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"NUL bytea espero zen '%s' katearen ondoren, baina '%d' bytea aurkitu da" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" +"Analizatutako '%s' balioa ez da baliozko D-Bus objektuaren bide-izen bat" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Analizatutako '%s' balioa ez da baliozko D-Bus sinadura" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"%u byte luzerako matrizea aurkituta. Gehienezko luzera 2<<26 byte da (64 " +"MiB)." +msgstr[1] "" +"%u byte luzerako matrizea aurkituta. Gehienezko luzera 2<<26 byte da (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Analizatutako '%s' balioa aldagaiarentzat ez da baliozko D-Bus sinadura bat" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Errorea GVariant deserializatzean '%s' kate motarekin D-Bus konexioko " +"formatutik" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Baliogabeko endian balioa. 0x6c ('l') edo 0x42 ('B') espero zen, baina 0x" +"%02x balioa aurkitu da." + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Protokoloaren bertsio nagusia baliogabea. 1 espero zen, baina %d aurkitu da" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Sinaduraren goiburua '%s' sinadurarekin aurkitu da, baina gorputza hutsik " +"dago" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Analizatutako '%s' balioa ez da baliozko D-Bus sinadura (gorputzarentzako)" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Ez dago sinaduraren goibururik mezuan, baina mezuaren gorputzak %u byte du" +msgstr[1] "" +"Ez dago sinaduraren goibururik mezuan, baina mezuaren gorputzak %u byte ditu" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Ezin da mezua deserializatu: " + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Errorea GVariant serializatzean '%s' kate motarekin D-Bus konexioaren " +"formatura" + +#: ../gio/gdbusmessage.c:2304 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Mezuak fitxategi-deskriptore %d du baina goiburuko eremuak %d " +"fitxategi-deskriptore adierazten ditu" + +#: ../gio/gdbusmessage.c:2312 +msgid "Cannot serialize message: " +msgstr "Ezin da mezua serializatu: " + +#: ../gio/gdbusmessage.c:2356 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Mezuaren gorputzak '%s' sinadura du, baina ez dago sinaduraren goibururik" + +#: ../gio/gdbusmessage.c:2366 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Mezuaren gorputzak '%s' sinadura mota du, baina goiburuaren eremuko sinadura " +"'%s' da" + +#: ../gio/gdbusmessage.c:2382 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Mezuaren gorputza hutsik dago, baina goiburuaren eremuko sinadura '(%s)' da" + +#: ../gio/gdbusmessage.c:2939 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Errorearen itzulera '%s' motako gorputzarekin " + +#: ../gio/gdbusmessage.c:2947 +msgid "Error return with empty body" +msgstr "Errorearen itzulera gorputz hutsarekin" + +#: ../gio/gdbusprivate.c:2065 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Ezin da /var/lib/dbus/machine-id edo /etc/machine-id kargatu: " + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Errorea %s(r)en StartServiceByName deia egitean: " + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Ustekabeko %d erantzuna StartServiceByName(\"%s\") metodotik" + +#: ../gio/gdbusproxy.c:2726 ../gio/gdbusproxy.c:2860 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Ezin da metodoari deitu: proxy-ak jaberik gabeko izen ezaguna du eta " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START banderarekin eraiki zen" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Izen abstraktuen lekua ez dago onartuta" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Ezin da izendapeneko fitxategia zehaztu zerbitzari bat sortzean" + +#: ../gio/gdbusserver.c:872 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Errorea '%s' izendapeneko fitxategian idaztean: %s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' katea ez da baliozko D-Bus GUID bat" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Ezin da onartu gabeko '%s' garraioa entzun" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMANDOA" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Komandoak:\n" +" help Informazio hau erakusten du\n" +" introspect Urruneko objektu baten introspekzioa\n" +" monitor Urruneko objektu bat monitorizatzen du\n" +" call Urruneko objektu bateko metodo bati deitzen dio\n" +" emit Seinale bat igortzen du\n" +"\n" +"Erabili\"%s KOMANDOA --help\" komando bakoitzari dagokion laguntza " +"lortzeko.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Errorea: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Errorea introspekzioko XMLa analizatzean: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Konektatu sistemako bus-arekin" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Konektatu saioko bus-arekin" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Konektatu emandako D-Bus helbidera" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Konexioaren amaierako puntuaren aukerak:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Aukerak konexioaren amaierako puntua zehaztuz" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Ez da konexioaren amaierako punturik zehaztu" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Konexioaren hainbat amaierako puntu zehaztu dira" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Abisua: introspekzioko datuen arabera, '%s' interfazea ez da existitzen\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Abisua: introspekzioko datuen arabera, '%s' metodoa ez da existitzen '%s' " +"interfazean\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Seinalearen aukerazko helburua (izen esklusiboa)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objektuaren bide-izena bere gainera seinalea igortzeko" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Seinale eta interfazearen izena" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Igorri seinale bat." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Errorea konektatzean: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Errorea: objektuaren bide-izena ez da zehaztu.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Errorea: '%s' ez da objektuaren baliozko bide-izena\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Errorea: seinalea ez da zehaztu.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Errorea: '%s' ez da interfazearen baliozko izena\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Errorea: '%s' ez da kidearen baliozko izena\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Errorea: '%s' ez da bus-aren baliozko izen esklusiboa\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Errorea %d parametroa analizatzean: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Errorea konexioa garbitzean: %s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Helburuaren izena metodoari deitzeko" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Objektuaren bide-izena metodoari deitzeko" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Metodo eta interfazearen izena" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Denbora-muga (segundotan)" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Deitu metodo bati urruneko objektu batean." + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Errorea: helburua ez dago zehaztuta\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Errorea: objektuaren bide-izena ez dago zehaztuta\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Errorea: metodoaren izena ez dago zehaztuta\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Errorea: '%s' metodoaren izena baliogabea da\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Errorea '%2$s' motako %1$d parametroa analizatzean: %3$s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Helburuko izena introspekzioa egiteko" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Objektuaren bide-izena introspekzioa egiteko" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Inprimatu XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Aztertu umeen barnean" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Soilik inprimatzeko propietateak" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Urruneko objektu baten introspekzioa egin." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Helburuko izena monitorizatzeko" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Objektuaren bide-izena monitorizatzeko" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Monitorizatu urruneko objektu bat." + +#: ../gio/gdesktopappinfo.c:575 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Izengabea" + +#: ../gio/gdesktopappinfo.c:988 +msgid "Desktop file didn't specify Exec field" +msgstr "Mahaigaineko fitxategiak ez du Exec eremua zehaztu" + +#: ../gio/gdesktopappinfo.c:1276 +msgid "Unable to find terminal required for application" +msgstr "Ezin izan da aplikazioak eskatzen duen terminala aurkitu" + +#: ../gio/gdesktopappinfo.c:1563 +#, 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:1567 +#, 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:1807 ../gio/gdesktopappinfo.c:1831 +msgid "Application information lacks an identifier" +msgstr "Aplikazioaren informazioari identifikatzaile bat falta zaio" + +#: ../gio/gdesktopappinfo.c:2055 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ezin da erabiltzailearen mahaigaineko %s fitxategia sortu" + +#: ../gio/gdesktopappinfo.c:2171 +#, c-format +msgid "Custom definition for %s" +msgstr "%s(r)en definizio pertsonalizatua" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "gailuak ez dauka 'abiatu' inplementatuta" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "gailuak ez dauka 'gelditu' inplementatuta" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS euskarria ez dago erabilgarri" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ezin da GEmblem kodeketaren %d bertsioa kudeatu" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Gaizki osatutako token kopurua (%d) GEmblem kodeketan" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ezin da GEmblemedIcon kodeketaren %d bertsioa kudeatu" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Gaizki osatutako token kopurua (%d) GEmblemedIcon kodeketan" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblen espero zen GEmblemedIcon-entzako" + +#: ../gio/gfile.c:874 ../gio/gfile.c:1105 ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 ../gio/gfile.c:1531 ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 ../gio/gfile.c:1726 ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 ../gio/gfile.c:3312 ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 ../gio/gfile.c:3541 ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 ../gio/gfile.c:4359 ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 ../gio/gfile.c:4633 ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 ../gio/gfile.c:5315 ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 ../gio/gfile.c:7098 ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 ../gio/glocalfile.c:1070 ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "Ontziaren muntaia ez da existitzen" + +#: ../gio/gfile.c:2414 ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "Ezin da direktorioaren gainean kopiatu" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "Ezin da direktorioa kopiatu direktorio gainean" + +#: ../gio/gfile.c:2483 ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "Helburuko fitxategia existitzen da" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "Ezin da direktorioa errekurtsiboki kopiatu" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "Lotura ez da onartzen" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "Errorea fitxategia batzean: %s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "Ezin da fitxategi berezia kopiatu" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "Esteka sinbolikoaren baliogabeko balioa eman da" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "Zakarrontzira botatzea ez dago onartuta" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Fitxategi-izenek ezin dute '%c' eduki" + +#: ../gio/gfile.c:6067 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "bolumenak ez dauka muntatzea inplementatuta" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "Ez da aplikaziorik erregistratu fitxategi hau kudeatzeko" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumeratzailea itxi da" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Fitxategiaren enumeratzaileak eragiketa bat du lanean" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +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:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Korronteak ez du query_info onartzen" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Ez da bilaketarik onartzen korrontean" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Trunkatzea ez da baimentzen sarrerako korrontean" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Trunkatzea ez da onartzen korrontean" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Okerreko token kopurua (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ez dago %s klasearen izen motarik" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s motak ez du GIcon interfazea inplementatzen" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s mota ez du klaserik" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Gaizko osatutako bertsio zenbakia: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Ezin da ikonoaren kodeketaren emandako bertsioa kudeatu" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Ez da helbiderik zehaztu" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "%u luzera luzeegia da helbidearentzako" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Helbideak aurrizkiaren luzera baino harago bitak ditu ezarrita" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Ezin izan da '%s' analizatu IP helbide-maskara gisa" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Ez dago nahikoa lekurik socket helbideentzako" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Onartu gabeko socket helbidea" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "Korronteak eragiketa bat du lanean" + +#: ../gio/glib-compile-resources.c:144 ../gio/glib-compile-schemas.c:1449 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%s> elementua ez da <%s>(r)en barruan onartzen" + +#: ../gio/glib-compile-resources.c:148 ../gio/glib-compile-schemas.c:1453 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "<%s> elementua ez da maila gorenean onartzen" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "%s fitxategia hainbat aldiz agertzen da baliabidean" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Huts egin du '%s' bilatzean edozein iturburuko direktoriotan" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Huts egin du '%s' bilatzean uneko direktorioan" + +#: ../gio/glib-compile-resources.c:287 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Prozesuaren '%s' aukera ezezaguna" + +#: ../gio/glib-compile-resources.c:305 ../gio/glib-compile-resources.c:363 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Huts egin du aldi baterako fitxategia sortu: %s" + +#: ../gio/glib-compile-resources.c:335 +msgid "Error processing input file with xmllint" +msgstr "Errorea sarrerako fitxategia xmllint-ekin prozesatzean" + +#: ../gio/glib-compile-resources.c:390 +msgid "Error processing input file with to-pixdata" +msgstr "Errorea sarrerako fitxategia 'to-pixdata'-rekin prozesatzean" + +#: ../gio/glib-compile-resources.c:403 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Errorea '%s' fitxategia irakurtzean: %s" + +#: ../gio/glib-compile-resources.c:423 +#, c-format +msgid "Error compressing file %s" +msgstr "Errorea %s fitxategia konprimitzean" + +#: ../gio/glib-compile-resources.c:487 ../gio/glib-compile-schemas.c:1561 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "testua ezin da <%s>(r)en barruan egon" + +#: ../gio/glib-compile-resources.c:610 +msgid "name of the output file" +msgstr "irteerako fitxategiaren izena" + +#: ../gio/glib-compile-resources.c:610 ../gio/glib-compile-resources.c:643 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "FITXATEGIA" + +#: ../gio/glib-compile-resources.c:611 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Direktorioak, horietarik fitxategiak irakurtzeko (lehenetsia uneko " +"direktorioa)" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-schemas.c:1989 +#: ../gio/glib-compile-schemas.c:2019 +msgid "DIRECTORY" +msgstr "DIREKTORIOA" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Sortu irteera hautatutako formatuan helburuko fitxategiaren luzapenaren " +"arabera" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate source header" +msgstr "Sortu iturburuaren goiburua" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Sortu ituruburuaren kodea (baliabidearen fitxategia zure kodean estekatzeko " +"erabilita)" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate dependency list" +msgstr "Sortu mendekotasunen zerrenda" + +#: ../gio/glib-compile-resources.c:616 +msgid "Don't automatically create and register resource" +msgstr "Ez sortu eta erregistratu baliabidea automatikoki " + +#: ../gio/glib-compile-resources.c:617 +msgid "C identifier name used for the generated source code" +msgstr "C identifikatzailearen izena (sortutako iturburuaren kodean erabilita)" + +#: ../gio/glib-compile-resources.c:646 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Konpilatu baliabidearen zehaztapen bat baliabideko fitxategi batean.\n" +"Baliabideen zehaztapenen fitxategiak .gresource.xml luzapena dute,\n" +"eta baliabideen fitxategiek berriz .gresource luzapena." + +#: ../gio/glib-compile-resources.c:662 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Fitxategi baten izena bakarrik eman behar duzu\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "izen hutsak ez daude baimenduta" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "'%s' izena baliogabea: izenak letra minuskula batekin hasi behar dira" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"'%s' izena baliogabea: '%c' karakterea baliogabea. soilik letra minuskulak, " +"zenbakiak eta marratxoa (-) onartzen dira." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "'%s' izena baliogabea: bi marratxo jarraian (--) ez dago onartuta." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "'%s' izena baliogabea: azken karakterea ezin da marratxoa (-) izan." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "'%s' izena baliogabea: gehienezko luzera 1024 da" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " jadanik zehaztuta" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ezin zaio gakorik gehitu 'list-of' eskema bati" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " jadanik zehaztuta" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +"-ek iluntzen du -en; erabili " +" balioa aldatzeko" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"-rentzako hauetariko bat zehaztu behar da atributu gisa: 'type', 'enum' " +"edo 'flags'" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> ez dago (oraindik) definituta." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "baliogabeko GVariant motako '%s' katea" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " eman da, baina eskema ez da ezer hedatzen ari" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ez dago (e)rik gainidazteko" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " jadanik zehaztuta" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " jadanik zehaztuta" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " oraindik existitzen ez den '%s' eskemara hedatzen da" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " oraindik existitzen ez den '%s' eskemaren zerrenda da" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Ezin da bide-izena duen eskema baten zerrenda izan" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Ezin da eskema bat bide-izen batekin hedatu" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" zerrenda bat da, zerrenda ez den hedatzen " +"duena" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +"(e)k hedatzen du, " +"baina '%s'(e)k ez du '%s' hedatzen" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "bide-izen bat ematen bada, barra batekin (/) hasi eta amaitu behar da" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "zerrenda bateko bide-izena ':/'-rekin amaitu behar da" + +#: ../gio/glib-compile-schemas.c:1229 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> jadanik zehaztuta" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1747 ../gio/glib-compile-schemas.c:1818 +#: ../gio/glib-compile-schemas.c:1894 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict zehaztu da; irtetzen.\n" + +#: ../gio/glib-compile-schemas.c:1755 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Fitxategi oso honi ezikusi egin zaio.\n" + +#: ../gio/glib-compile-schemas.c:1814 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Fitxategi honi ezikusi egiten.\n" + +#: ../gio/glib-compile-schemas.c:1854 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Ez dago '%s' bezalako gakorik '%s' eskeman gainidazteko '%s' fitxategian " +"ageri den bezala" + +#: ../gio/glib-compile-schemas.c:1860 ../gio/glib-compile-schemas.c:1918 +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; gainidazketari ezikusi egiten gako honentzako.\n" + +#: ../gio/glib-compile-schemas.c:1864 ../gio/glib-compile-schemas.c:1922 +#: ../gio/glib-compile-schemas.c:1950 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " eta --strict zehaztu da; irtetzen.\n" + +#: ../gio/glib-compile-schemas.c:1880 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"errorea '%2$s' eskemako '%1$s' gakoa analizatzean gainidazteko '%3$s' " +"fitxategian ageri den bezala: %4$s. " + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Gainidazketari ezikusi egiten gako honentzako.\n" + +#: ../gio/glib-compile-schemas.c:1908 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"gainidazteko '%3$s' fitxategiko '%2$s' eskemako '%1$s' gakoa gainidaztea " +"barrutitik kanpo dago emandako eskeman" + +#: ../gio/glib-compile-schemas.c:1936 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"gainidazteko '%3$s' fitxategiko '%2$s' eskemako '%1$s' gakoa gainidaztea ez " +"dago baliozko aukeren zerrendan" + +#: ../gio/glib-compile-schemas.c:1989 +msgid "where to store the gschemas.compiled file" +msgstr "non gorde gschemas.compiled fitxategia" + +#: ../gio/glib-compile-schemas.c:1990 +msgid "Abort on any errors in schemas" +msgstr "Abortatu eskemetan edozer motako erroreak agertzean" + +#: ../gio/glib-compile-schemas.c:1991 +msgid "Do not write the gschema.compiled file" +msgstr "Ez idatzi gschema.compiled fitxategia" + +#: ../gio/glib-compile-schemas.c:1992 +msgid "Do not enforce key name restrictions" +msgstr "Ez derrigortu gako-izenen murriztapenik" + +#: ../gio/glib-compile-schemas.c:2022 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Konpilatu GSettings eskemen fitxategi guztiak eskema-cache batean.\n" +"Eskemen fitxategiek .gschema.xml luzapena eduki behar dute,\n" +"eta cache-ko fitxategia gschemas.compiled deitzen da." + +#: ../gio/glib-compile-schemas.c:2038 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Direktorio baten izena bakarrik eman behar duzu\n" + +#: ../gio/glib-compile-schemas.c:2077 +#, c-format +msgid "No schema files found: " +msgstr "Ez da eskemen fitxategirik aurkitu: " + +#: ../gio/glib-compile-schemas.c:2080 +#, c-format +msgid "doing nothing.\n" +msgstr "ezer ez da egiten ari.\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "removed existing output file.\n" +msgstr "existitzen den irteerako fitxategia kenduta.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Ezin da lokaleko direktorio lehenetsiaren monitorizazio mota aurkitu" + +# +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "%s fitxategi-izen baliogabea" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Errorea fitxategi-sistemako informazioa lortzean: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "Ezin da erroko direktorioa izenez aldatu" + +#: ../gio/glocalfile.c:1136 ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "Errorea fitxategia izenez aldatzean: %s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "Ezin da fitxategia izenez aldatu, fitxategi-izena badago lehendik ere" + +# +#: ../gio/glocalfile.c:1158 ../gio/glocalfile.c:2162 ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Fitxategi-izen baliogabea" + +#: ../gio/glocalfile.c:1325 ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "Ezin da direktorioa ireki" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "Errorea fitxategia irekitzean: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "Errorea fitxategia kentzean: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "Errorea fitxategia zakarrontzira botatzean: %s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ezin izan da zakarrontziaren '%s' direktorioa sortu: %s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "Ezin da zakarrontziaren goi-mailako direktorioa aurkitu" + +#: ../gio/glocalfile.c:1964 ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "Ezin da zakarrontziaren direktorioa aurkitu edo sortu" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ezin da zakarrontziaren informazio-fitxategia sortu: %s" + +#: ../gio/glocalfile.c:2047 ../gio/glocalfile.c:2052 ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ezin da fitxategia zakarrontzira bota: %s" + +#: ../gio/glocalfile.c:2140 ../glib/gregex.c:213 +msgid "internal error" +msgstr "barneko errorea" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "Errorea direktorioa sortzean: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Fitxategi-sistemak ez ditu esteka sinbolikorik onartzen" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Errorea esteka sinbolikoa sortzean: %s" + +#: ../gio/glocalfile.c:2261 ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "Errorea fitxategia lekuz aldatzean: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "Ezin da direktorioa lekuz aldatu direktorioaren gainera" + +#: ../gio/glocalfile.c:2311 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Huts egin du babeskopia sortzean" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "Errorea helburuko fitxategia kentzean: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "Muntaien artean lekuz aldatzea ez dago onartuta" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Atributuaren balioa NULL ezin da izan" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Atributu mota baliogabea (katea espero zen)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Atributu hedatuaren izen baliogabea" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Errorea '%s' atributu hedatua ezartzean: %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (baliogabeko kodeketa)" + +#: ../gio/glocalfileinfo.c:1527 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Errorea '%s' fitxategiaren informazioa eskuratzean: %s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Errorea fitxategiaren deskriptorearen informazioa irakurtzean: %s " + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Baliogabeko atributu mota (uint32 espero zen)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Baliogabeko atributu mota (uint64 espero zen)" + +#: ../gio/glocalfileinfo.c:1861 ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "Baliogabeko atributu mota (byte katea espero zen)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "Ezin da baimenik ezarri esteka sinbolikoetan" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Errorea baimenak ezartzean: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "Errorea jabea ezartzean: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "esteka sinbolikoak NULL-en desberdina izan behar du" + +#: ../gio/glocalfileinfo.c:2015 ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Errorea esteka sinbolikoa ezartzean: %s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Errorea esteka sinbolikoa ezartzean: fitxategia ez da esteka sinboliko bat" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Errorea eraldaketa edo atzipen ordua ezartzean: %s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "SELinux testuinguruak NULL-en desberdina izan behar du" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Errorea SELinux testuingurua ezartzean: %s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ez dago gaituta sistema honetan" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s atributuaren ezarpena ez dago onartuta" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Errorea fitxategitik irakurtzean: %s " + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Errorea fitxategian bilatzean: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Errorea fitxategia ixtean: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Ezin da lokaleko fitxategi lehenetsiaren monitorizazio mota aurkitu" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Errorea fitxategian idaztean: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Errorea babeskopiaren esteka zaharra kentzean: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Errorea babeskopiaren kopia sortzean: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Errorea aldi baterako fitxategia izenez aldatzean: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Errorea fitxategia trunkatzean: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Errorea '%s' fitxategia irekitzean: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Helburuko fitxategia direktorio bat da" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Helburuko fitxategia ez da fitxategi arrunta" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Fitxategia kanpotik aldatu da" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Errorea fitxategi zaharra kentzean: %s" + +#: ../gio/gmemoryinputstream.c:492 ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "Baliogabeko GSeekType eman da" + +# +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "Bilaketa-eskaera baliogabea" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ezin da GMemoryInputStream trunkatu" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Ezin da memoriaren irteeraren korrontea tamainaz aldatu" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Huts egin du memoriaren irteeraren korrontea tamainaz aldatzean" + +#: ../gio/gmemoryoutputstream.c:600 +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:760 +msgid "Requested seek before the beginning of the stream" +msgstr "Bilaketa eskatu da korrontearen hasieraren aurretik" + +#: ../gio/gmemoryoutputstream.c:769 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "muntaiak ez dauka eduki mota sinkronoa asmatzea inplementatuta" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' ostalariak '['baina ez']' dauka" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Sarea atziezina" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Ostalaria atziezina" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Ezin izan da sareko monitorea sortu: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Ezin izan da sareko monitorea sortu: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Ezin izan da sarearen egoera eskuratu: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "Irteerako korronteak ez dauka idaztea inplementatuta" + +#: ../gio/goutputstream.c:378 ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "Iturburuko korrontea jadanik itxi da" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Errorea '%s' ebaztean: %s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Errorea '%s' alderantziz ebaztean: %s" + +#: ../gio/gresolver.c:849 ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "Ez dago '%s' zerbitzuaren erregistrorik" + +#: ../gio/gresolver.c:854 ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ezin da '%s' ebatzi aldi batean" + +#: ../gio/gresolver.c:859 ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "Errorea '%s' ebaztean" + +#: ../gio/gresource.c:294 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:679 ../gio/gresource.c:748 ../gio/gresource.c:809 +#: ../gio/gresource.c:889 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s'(e)ko baliabidea ez da existitzen" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Huts egin du '%s'(e)ko baliabidea deskonprimitzean" + +#: ../gio/gresourcefile.c:650 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s'(e)ko baliabidea ez da direktorio bat" + +#: ../gio/gresourcefile.c:858 +msgid "Input stream doesn't implement seek" +msgstr "Sarrerako korronteak ez dauka bilaketa inplementatuta" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "Erakutsi laguntza" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +msgid "[COMMAND]" +msgstr "[KOMANDOA]" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "Zerrendatu baliabideak dituzten atalak elf fitxategi batean" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Zerrendatu baliabideak\n" +"ATALA ematen bada, soilik atal honetako baliabideak zerrendatu\n" +"BIDE-IZENA ematen bada, bat datozen baliabideak soilik zerrendatu" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "FITXATEGIA [BIDE-IZENA]" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "ATALA" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Zerrendatu baliabideak xehetasunez\n" +"ATALA ematen bada, soilik atal honetako baliabideak zerrendatu\n" +"BIDE-IZENA ematen bada, bat datozen baliabideak soilik zerrendatu\n" +"Xehetasunek atala, tamaina eta konpresioa daukate" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "Erauzi baliabidearen fitxategia irteera estandarrean (stdout)" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "FITXATEGIA BIDE-IZENA" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"'%s' komando ezezaguna\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Erabilera:\n" +" gresource [--section ATALA] KOMANDOA [ARGUMENTUAK...]\n" +"\n" +"Komandoak:\n" +" help Erakutsi informazio hau\n" +" sections Zerrendatu baliabidearen atalak\n" +" list Zerrendatu baliabideak\n" +" details Zerrendatu baliabideak xehetasunez\n" +" extract Erauzi baliabide bat\n" +"\n" +"Erabili 'gresource help KOMANDOA' laguntza xehea eskuratzeko.\n" +"\n" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Erabilera:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "Argumentuak:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr " ATALA elf atalaren izena (aukerakoa)\n" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMANDOA (aukerako) komandoa deskribatzeko\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FITXATEGIA Elf fitxategia (bitarra edo partekatutako liburutegia)\n" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FITXATEGIA Elf fitxategia (bitarra edo partekatutako liburutegia)\n" +" edo konpilatutako baliabidearen fitxategi bat\n" + +#: ../gio/gresource-tool.c:554 +msgid "[PATH]" +msgstr "[BIDE-IZENA]" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" +" BIDE-IZENA (aukerakoa) baliabidearen bide-izena (partziala izan " +"daiteke)\n" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "BIDE-IZENA" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr " BIDE-IZENA Baliabidearen bide-izena\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Ez dago '%s' bezalako eskemarik\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "'%s' eskema ezin da lekuz aldatu (bide-izena ez da zehaztu behar)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "'%s' eskema lekuz alda daiteke (bide-izena zehaztu behar da)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Bide-izen hutsa eman da.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Bide-izena barra batekin (/) hasi behar da\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Bide-izena barra batekin (/) amaitu behar da\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Bide-izenak ezin ditu bi barra jarraian eduki (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ez dago '%s' bezalako gakorik\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Emandako balioa baliozko barrutitik kanpo dago\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "Zerrendatu instalatutako eskemak (lekuz ezin direnak aldatu)" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "Zerrendatu instalatutako eskemak (lekuz alda daitezkeenak)" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "Zerrendatu ESKEMAko gakoak" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "ESKEMA[:bide-izena]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "Zerrendatu ESKEMAren umeak" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Zerrendatu gako eta balioak, errekurtsiboki\n" +"Ez bada ESKEMArik ematen, zerrendatu gako guztiak\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESKEMA[:BIDE-IZENA]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "Lortu GAKOAren balioa" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESKEMA[:BIDE-IZENA] GAKOA" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "Kontsultatu GAKOAren baliozko balioen barrutiari buruz" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "Ezarri GAKOAren balioa BALIOArekin" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESKEMA[:BIDE-IZENA] GAKOA BALIOA" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "Berrezarri GAKOA bere balio lehenetsira" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Berrezarri ESKEMAko gako guztiak beraien balio lehenetsietara" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "Begiratu GAKOA idazgarria den edo ez" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizatu GAKOAren aldaketak.\n" +"Ez bada GAKOA zehazten, ESKEMAko gako guztiak monitorizatuko ditu.\n" +"Erabili ^C monitorizazioa gelditzeko.\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESKEMA[:BIDE-IZENA] GAKOA" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Erabilera:\n" +" gsettings [--schemadir ESKEMA-DIREKTORIOA] KOMANDOA [ARGUMENTUAK...]\n" +"\n" +"Komandoak:\n" +" help Erakutsi informazio hau\n" +" list-schemas Zerrendatu instalatutako eskemak\n" +" list-relocatable-schemas Zerrendatu lekuz alda daitezkeen eskemak\n" +" list-keys Zerrendatu eskema bateko gakoak\n" +" list-children Zerrendatu eskema baten umeak\n" +" list-recursively Zerrendatu gako eta balioak, " +"errekurtsiboki\n" +" range Kontsultatu gako baten barrutia\n" +" get Lortu gako baten balioa\n" +" set Ezarri gako baten balioa\n" +" reset Berrezarri gako baten balioa\n" +" writable Begiratu gako bat idazgarria al den\n" +" monitor Behatu aldaketak\n" +"\n" +"Erabili 'gsettings help KOMANDOA' laguntza xehea lortzeko.\n" +"\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Erabilera:\n" +" gsettings [--schemadir ESKEMA-DIREKTORIOA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " ESKEMA-DIREKTORIOA Eskema gehigarriak bilatzeko direkotrioa\n" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ESKEMA Eskemaren izena\n" +" BIDE-IZENA Bide-izena, lekuz alda daitezkeen eskementzako\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " GAKOA Eskema barruko (aukerako) gakoa\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " GAKOA Eskema barruko gakoa\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " BALIOA Ezarriko den balioa\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "Eskemaren izen hutsa eman da\n" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "Baliogabeko socket-a, hasieratu gabe dago" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Baliogabeko socket-a, hasieratzeak huts egin du: %s" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "Socket-a jadanik itxita dago" + +#: ../gio/gsocket.c:305 ../gio/gsocket.c:3520 ../gio/gsocket.c:3575 +msgid "Socket I/O timed out" +msgstr "S/Iko socket-aren denbora-muga gaindituta" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket sortzen fd-tik: %s" + +#: ../gio/gsocket.c:506 ../gio/gsocket.c:522 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ezin da socket-a sortu: %s" + +#: ../gio/gsocket.c:506 +msgid "Unknown protocol was specified" +msgstr "Protokolo ezezaguna zehaztu da" + +#: ../gio/gsocket.c:1713 +#, c-format +msgid "could not get local address: %s" +msgstr "ezin izan da lokaleko helbidea lortu: %s" + +#: ../gio/gsocket.c:1756 +#, c-format +msgid "could not get remote address: %s" +msgstr "ezin izan da urruneko helbidea lortu: %s" + +#: ../gio/gsocket.c:1817 +#, c-format +msgid "could not listen: %s" +msgstr "ezin izan da entzun: %s" + +#: ../gio/gsocket.c:1891 +#, c-format +msgid "Error binding to address: %s" +msgstr "Errorea helbidea lotzean: %s" + +#: ../gio/gsocket.c:1944 ../gio/gsocket.c:1980 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Errorea multidifusioko taldean elkartzean: %s" + +#: ../gio/gsocket.c:1945 ../gio/gsocket.c:1981 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Errorea multidifusioko taldea uztean: %s" + +#: ../gio/gsocket.c:1946 +msgid "No support for source-specific multicast" +msgstr "Iturburu zehatzeko multidifusiorik ez da onartzen" + +#: ../gio/gsocket.c:2165 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Errorea konexioa onartzean: %s" + +#: ../gio/gsocket.c:2286 +msgid "Connection in progress" +msgstr "Konexioa lantzen" + +#: ../gio/gsocket.c:2338 ../gio/gsocket.c:4317 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ezin da falta diren erroreak lortu: %s" + +#: ../gio/gsocket.c:2508 +#, c-format +msgid "Error receiving data: %s" +msgstr "Errorea datuak jasotzean: %s" + +#: ../gio/gsocket.c:2686 +#, c-format +msgid "Error sending data: %s" +msgstr "Errorea datuak bidaltzean: %s" + +#: ../gio/gsocket.c:2800 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Ezin da socket-a itzali: %s" + +#: ../gio/gsocket.c:2879 +#, c-format +msgid "Error closing socket: %s" +msgstr "Errorea socket-a ixtean: %s" + +#: ../gio/gsocket.c:3513 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Socket-aren baldintzen zai: %s" + +#: ../gio/gsocket.c:3791 ../gio/gsocket.c:3872 +#, c-format +msgid "Error sending message: %s" +msgstr "Errorea mezua bidaltzean: %s" + +#: ../gio/gsocket.c:3816 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ez da windows sisteman onartzen" + +#: ../gio/gsocket.c:4096 ../gio/gsocket.c:4232 +#, c-format +msgid "Error receiving message: %s" +msgstr "Errorea mezua jasotzean: %s" + +#: ../gio/gsocket.c:4336 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials ez dago S.E. honetan inplementatuta" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Ezin izan da %s proxy zerbitzariarekin konektatu: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Ezin izan da %s(r)ekin konektatu: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Ezin izan da konektatu: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Errore ezezaguna konexioan" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" +"TCP motakoak ez diren konexioen gainean proxy-a egitea ez dago onartuta." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy-aren %s protokoloa ez dago onartuta." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Entzulea jadanik itxita dago" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Gehitutako socket-a itxi da" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4-ek ez du '%s' IPv6 helbidea onartzen" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Erabiltzaile-izena luzeegia da SOCKSv4 protokoloarentzako" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "'%s' ostalari-izena luzeegia da SOCKSv4 protokoloarentzako" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Zerbitzaria ez da SOCKSv4 proxy zerbitzari bat." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 zerbitzariaren bidezko konexioa ukatu da" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Zerbitzaria ez da SOCKSv5 proxy zerbitzari bat." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 proxy-ak autentifikazioa eskatzen du." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5-ek autentifikatzeko metodo bat eskatzen du (Glib-ek onartzen ez " +"duena)." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"Erabiltzaile-izena edo pasahitza luzeegia da SOCKSv5 protokoloarentzako." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 autentifikazioak huts egin du erabiltzaile-izena edo pasahitza " +"okerra delako." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "'%s' ostalari-izena luzeegia da SOCKSv5 protokoloarentzako" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 proxy zerbitzariak helbide mota ezezagunak erabiltzen ditu." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "SOCKSv5 proxy-aren zerbitzariaren barneko errorea." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Arauen multzoak ez du SOCKSv5 konexioa baimentzen." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Ostalaria atziezina SOCKSv5 zerbitzariaren bidez." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Sarea atziezina SOCKSv5 proxy-aren bidez." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Konexioa ukatuta SOCKSv5 proxy-aren bidez." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy-ak ez du 'connect' komandoa onartzen." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy-ak ez du emandako helbide mota onartzen." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "SOCKSv5 proxy-aren errore ezezaguna." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ezin da GThemedIcon kodeketaren %d bertsioa kudeatu" + +#: ../gio/gtlscertificate.c:249 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Ezin da PEMekin kodetutako gako pribatua desenkriptatu" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "Ez da PEMekin kodetutako ziurtagirik aurkitu" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "Ezin izan da PEMekin kodetutako gako pribatua analizatu" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "Ez da PEMekin kodetutako ziurtagirik aurkitu" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "Ezin izan da PEMekin kodetutako ziurtagiririk analizatu" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Hau azken aukera da pasahitza ongi sartzeko, zure sarbidetza blokeatu " +"aurretik." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Sartu diren hainbat pasahitz ez dira zuzenak, eta zure sarbidetza blokeatu " +"egin da hutsegite gehiagoren ondoren." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Sartutako pasahitza okerrekoa da." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:580 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Kontroleko mezu 1 espero zen, %d lortu dira" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:590 +msgid "Unexpected type of ancillary data" +msgstr "Ustekabeko datu-laguntzaile mota" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "fd bat espero zen, baina %d lortuta\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Baliogabeko fd jasota" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Errorea kredentzialak bidaltzean: " + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Errorea SO_PASSCRED gaituta dagoen begiratzean socket-arentzako: %s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Ustekabeko aukeraren luzera SO_PASSCRED gaituta dagoen begiratzean socket-" +"arentzako. %d byte espero ziren, baina %d lortu dira" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Errorea SO_PASSCRED gaitzean: %s" + +#: ../gio/gunixconnection.c:568 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Harrerako kredentzialentzako byte bakar bat irakurtzea espero zen, baina " +"zero byte irakurri dira." + +#: ../gio/gunixconnection.c:604 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Ez zen kontroleko mezurik espero, baina %d lortu dira" + +#: ../gio/gunixconnection.c:630 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Errorea SO_PASSCRED desgaitzean: %s" + +#: ../gio/gunixinputstream.c:392 ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:492 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Errorea fitxategiaren deskriptoretik irakurtzean: %s " + +#: ../gio/gunixinputstream.c:447 ../gio/gunixinputstream.c:642 +#: ../gio/gunixoutputstream.c:433 ../gio/gunixoutputstream.c:597 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Errorea fitxategiaren deskriptorea ixtean: %s " + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "Fitxategi-sistemaren erroa" + +#: ../gio/gunixoutputstream.c:378 ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:478 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Errorea fitxategiaren deskriptorean idaztean: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "bolumenak ez dauka 'egotzi' edo 'egotzi eragiketarekin' inplementatuta" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ezin da aplikazioa aurkitu" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Errorea aplikazioa abiaraztean: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIak ez daude onartuta" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "asoziazioaren aldaketak ez dira onartzen win32 sisteman" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Asoziazioa sortzea ez da onartzen win32 sisteman" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Errorea heldulekutik irakurtzean: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Errorea heldulekua ixtean: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Errorea heldulekuan idaztean: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Ez dago nahikoa memoriarik" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Barneko errorea: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Sarrera gehiago behar dira" + +# +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Konprimitutako datu baliogabeak" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%2$s' elementuaren ustekabeko '%1$s' atributua" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' elementuaren '%1$s' atributua ez da aurkitu" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Ustekabeko '%s' etiketa, '%s' espero zen" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' barruan ustekabeko '%1$s' etiketa" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Ezin izan da baliozko laster-marken fitxategia aurkitu datuen direktorioan" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URIaren laster-marka badago lehendik ere" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ez da '%s' URIaren laster-markarik aurkitu" + +#: ../glib/gbookmarkfile.c:2385 +#, 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:2470 +#, 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:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URIaren laster-markan ez dago talderik ezarrita" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, 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:3424 +#, 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:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Karaktere-sekuentzia partziala sarreraren amaieran" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ezin da '%s' atzerapena '%s' kode-multzo bihurtu" + +#: ../glib/gconvert.c:1874 +#, 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:1884 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Baliteke '%s' URI fitxategi lokalak '#' ez edukitzea" + +#: ../glib/gconvert.c:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' URI baliogabea da" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URIaren ostalari-izena baliogabea da" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' URIak ihes-karaktere baliogabeak ditu" + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' bide-izena ez da bide-izen absolutua" + +# +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "Ostalari-izen baliogabea" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%y-%m-%d %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Urtarrila" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Otsaila" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Martxoa" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Apirila" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maiatza" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Ekaina" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Uztaila" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Abuztua" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Iraila" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Urria" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Azaroa" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Abendua" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Urt." + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Ots." + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar." + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr." + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Eka." + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Uzt." + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Abu." + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Ira." + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Urr." + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Aza." + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Abe." + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Astelehena" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Asteartea" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Asteazkena" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Osteguna" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Ostirala" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Larunbata" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Igandea" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Al." + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Ar." + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Az." + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Og." + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Or." + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Lr." + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ig." + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Errorea '%s' direktorioa irekitzean: %s " + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, 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:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Errorea '%s' fitxategia irakurtzean: %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" fitxategia handiegia da" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ezin izan da '%s' fitxategitik irakurri: %s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Ezin izan da '%s' fitxategia ireki: %s " + +#: ../glib/gfileutils.c:855 +#, 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:889 +#, 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:997 +#, 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:1039 ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ezin izan da '%s' fitxategia sortu: %s" + +#: ../glib/gfileutils.c:1053 +#, 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:1078 +#, 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:1097 +#, 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:1141 +#, 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:1165 +#, 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:1287 +#, 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:1547 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' txantiloia baliogabea da, ez luke '%s' eduki behar" + +#: ../glib/gfileutils.c:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' txantiloiak ez dauka: XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ezin izan da '%s' esteka sinbolikorik irakurri: %s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "Esteka sinbolikoak ez dira onartzen" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Irakurketa-bufferrean geratu diren bihurtu gabeko datuak" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanala karaktere partzial batean bukatzen da" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "Ezin izan da baliozko gakoa datuen direktorioan aurkitu" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "Ez da fitxategi arrunta" + +#: ../glib/gkeyfile.c:1162 +#, 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:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "Taldearen izen baliogabea: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "Gako-fitxategiak ez da talde batekin hasten" + +# +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "Gakoaren izen baliogabea: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Gako-fitxategiak onartzen ez den '%s' kodeketa du" + +#: ../glib/gkeyfile.c:1541 ../glib/gkeyfile.c:1703 ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 ../glib/gkeyfile.c:3273 ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 ../glib/gkeyfile.c:3778 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Gako-fitxategiak ez dauka '%s' taldea" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Gako-fitxategiak ez dauka '%s' gakoa" + +#: ../glib/gkeyfile.c:1822 ../glib/gkeyfile.c:1938 +#, 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:1842 ../glib/gkeyfile.c:1958 ../glib/gkeyfile.c:2327 +#, 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:2544 ../glib/gkeyfile.c:2910 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Gako-fitxategiak '%s' gakoa dauka ('%s taldean), baina dagokion balioa ezin " +"da interpretatu." + +#: ../glib/gkeyfile.c:2622 ../glib/gkeyfile.c:2698 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "'%2$s' taldeko '%1$s' gakoaren balioa '%3$s' da, '%4$s' izan ordez." + +#: ../glib/gkeyfile.c:3096 ../glib/gkeyfile.c:3288 ../glib/gkeyfile.c:3857 +#, 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:4089 +msgid "Key file contains escape character at end of line" +msgstr "Gako-fitxategiak ihes-karakterea dauka lerro amaieran" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Gako-fitxategiak '%s' ihes-sekuentzia baliogabea dauka" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' balioa ezin da zenbaki gisa interpretatu" + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' osoko balioa barrutitik kanpo" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' balioa ezin da zenbaki mugikor gisa interpretatu." + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' balioa ezin da boolear gisa interpretatu" + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Huts egin du '%s%s%s%s' fitxategiaren atributuak lortzean. " +"fstat() funtzioak huts egin du: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Huts egin %s%s%s%s mapatzean. mmap() funtzioak huts egin du: %s" + +#: ../glib/gmappedfile.c:260 +#, 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/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Errorea %d lerroko %d karakterean: " + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, 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:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ez da baliozko izena " + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ez da baliozko izena: '%c' " + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "Errorea %d lerroan: %s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, 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:715 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"'&;' entitatea hutsik dago; baliozko entitateak hauek dira: & " " +"< > '" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "'%-.*s' entitate-izena ezezaguna da" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentuak elementu batez hasi behar du (adibidez, )" + +#: ../glib/gmarkup.c:1116 +#, 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:1184 +#, 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:1268 +#, 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:1309 +#, 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:1353 +#, 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:1486 +#, 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:1533 +#, 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:1542 +#, 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:1710 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentua hutsik dago edo zuriuneak bakarrik ditu" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentua ustekabean itxi da angelu-parentesi ireki baten ondoren '<'" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, 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:1740 +#, 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:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentua ustekabean amaitu da elementu-izen baten barruan" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentua ustekabean amaitu da atributu-izen baten barruan" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Dokumentua ustekabean amaitu da elementua irekitzeko etiketa baten barruan." + +#: ../glib/gmarkup.c:1763 +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:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentua ustekabean amaitu da atributu-balio baten barruan" + +#: ../glib/gmarkup.c:1786 +#, 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:1792 +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/goption.c:766 +msgid "Usage:" +msgstr "Erabilera:" + +#: ../glib/goption.c:766 +msgid "[OPTION...]" +msgstr "[AUKERA...]" + +#: ../glib/goption.c:872 +msgid "Help Options:" +msgstr "Laguntzako aukerak:" + +#: ../glib/goption.c:873 +msgid "Show help options" +msgstr "Erakutsi laguntzako aukerak" + +#: ../glib/goption.c:879 +msgid "Show all help options" +msgstr "Erakutsi laguntzako aukera guztiak" + +#: ../glib/goption.c:941 +msgid "Application Options:" +msgstr "Aplikazio-aukerak:" + +#: ../glib/goption.c:1003 ../glib/goption.c:1073 +#, 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:1013 ../glib/goption.c:1081 +#, 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:1038 +#, 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:1046 +#, 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:1309 ../glib/goption.c:1388 +#, c-format +msgid "Error parsing option %s" +msgstr "Errorea %s aukera analizatzean" + +#: ../glib/goption.c:1419 ../glib/goption.c:1532 +#, c-format +msgid "Missing argument for %s" +msgstr "%s(e)ko argumentua falta da" + +#: ../glib/goption.c:1985 +#, c-format +msgid "Unknown option %s" +msgstr "%s aukera ezezaguna" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "hondatutako objektua" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "barneko errorea edo hondatutako objektua" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "Memoriarik ez" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "atzera-jotzearen mugara gainditua" + +#: ../glib/gregex.c:211 ../glib/gregex.c:219 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"ereduak zenbait elementu ditu bat etortze partzialetan onartzen ez direnak" + +#: ../glib/gregex.c:221 +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:230 +msgid "recursion limit reached" +msgstr "errekurtsioaren muga gainditua" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "azpikate hutsen lan arearen muga gainditua" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "lerro-jauzien banderen baliogabeko konbinazioa" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "okerreko desplazamendua" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "utf8 laburra" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "errore ezezaguna" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ ereduaren amaieran" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "\\c ereduaren amaieran" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "karaktere ezezagunak jarraitzen dio \\ karaktereari" + +#: ../glib/gregex.c:275 +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:278 +msgid "numbers out of order in {} quantifier" +msgstr "zenbakiak barrutitik kanpo {} kuantifikatzailean" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "zenbaki handiegiak {} kuantifikatzaileak" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "karaktere-klasearen amaierako ] falta da" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "karaktere-klasean baliogabeko ihes sekuentzia" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "karaktere-klaseko barrutia barrutitik kanpo" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "ezer ez errepikatzeko" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "karaktere ezezaguna (? karaktereen atzetik" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "karaktere ezezaguna (?< karaktereen atzetik" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "karaktere ezezaguna (?P karaktereen atzetik" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX izeneko klaseak soilik onartzen dira klase baten barruan" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "amaierako ) falta da" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R edo (?[+-] digituak )-rekin jarraitu behar dira" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "existitzen ez den azpieredu baten erreferentzia" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "iruzkinaren ondoren ) falta da" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "adierazpen erregularra luzeegia" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "huts egin du memoria lortzean" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "'lookbehind' baieztapenak ez du luzera finkorik" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "gaizki osatutako zenbakia edo izena (?(-ren atzetik" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "baldintza taldeak bi adar baino gehiago ditu" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "baieztapena espero zen (?)-ren atzetik" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "POSIX klasearen izen ezezaguna" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "Tartekatutako POSIX elementuak ez daude onartuta" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} sekuentziako karaktere-balioa luzeegia da" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "baliogabeko (?(0) baldintza" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ez dago baimenduta 'lookbehind' baieztapenean" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "dei errekurtsiboa amaierarik gabeko begiztan sar daiteke" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "amaierako karakterea falta da azpiereduko izenean" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "bi azpiereduk izen berdina dute" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "gaizki osatutako \\P edo \\p sekuentzia" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "propietate-izen ezezaguna \\P edo \\p atzetik" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "azpiereduaren izena luzeegia (32 karaktere gehienez)" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "izendun azpieredu gehiegi (10.000 gehienez)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "balio zortzitarra \\377 baino handiagoa" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE taldeak adar bat baino gehiago ditu" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE taldea errepikatzea ez dago onartuta" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE aukera kontraesankorra" + +#: ../glib/gregex.c:396 +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:401 +msgid "unexpected repeat" +msgstr "ustekabeko begizta" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "kodea gainezkatua" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "konpilazioaren laneko area gainezkatua" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "ez da aurrez egiaztatutako erreferentziatutako azpieredua aurkitu" + +#: ../glib/gregex.c:631 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Errorea %s adierazpen erregularra bilatzean: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE liburutegia UTF8 euskarri gabe konpilatua" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE liburutegia UTF8 propietateen euskarri gabe konpilatua" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Errorea %s adierazpen erregularra optimizatzean: %s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "digitu hamaseitarra edo '}' espero zen" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "digitu hamaseitarra espero zen" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "'<' falta da erreferentzia sinbolikoan" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "amaitu gabeko erreferentzia sinbolikoa" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "zero luzerako erreferentzia sinbolikoa" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "digitua espero zen" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "erreferentzia sinboliko ilegala" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "'\\' katearen amaieran" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "ihes-sekuentzi ezezaguna" + +#: ../glib/gregex.c:2359 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Komatxo arteko testua ez da komatxoekin hasten" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Testua hutsik dago (edo zuriuneak bakarrik ditu)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ezin izan da daturik irakurri prozesu umetik (%s)" + +#: ../glib/gspawn.c:348 +#, 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:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ustekabeko errorea waitpid()-en (%s)" + +#: ../glib/gspawn.c:1174 ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ezin izan da kanalizazio umetik irakurri (%s) " + +#: ../glib/gspawn.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Ezin da sardetu (%s)" + +#: ../glib/gspawn.c:1387 ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ezin izan da '%s' direktoriora aldatu (%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ezin izan da \"%s\" prozesu umea exekutatu (%s)" + +#: ../glib/gspawn.c:1407 +#, 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:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ezin izan da prozesu umea sardetu (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Errore ezezaguna \"%s\" prozesu umea exekutatzean" + +#: ../glib/gspawn.c:1448 +#, 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/gspawn.c:1521 ../glib/gspawn-win32.c:299 +#, 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:282 +msgid "Failed to read data from child process" +msgstr "Ezin izan da daturik irakurri prozesu umetik" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ezin izan da prozesu umea exekutatu (%s)" + +# +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Programaren izen baliogabea: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Kate baliogabea %d(e)ko bektorearen argumentuan: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Kate baliogabea ingurunean: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Laneko direktorio baliogabea: %s" + +# +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Ezin izan da laguntza-programa exekutatu (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Karakterea UTF-8 barrutitik kanpo" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Sekuentzia baliogabea bihurketa-sarreran" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Karakterea UTF-16 barrutitik kanpo" + +#: ../glib/gutils.c:2166 ../glib/gutils.c:2193 ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "byte %u" +msgstr[1] "%u byte" + +#: ../glib/gutils.c:2172 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2174 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2177 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2180 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2183 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2186 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2202 ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2205 ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2207 ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2210 ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2213 ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "byte %s" +msgstr[1] "%s byte" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "File is empty" +#~ msgstr "Fitxategia hutsik dago" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Aukera hau laster kenduko da." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Errorea '%s' fitxategiaren egoera irakurtzean: %s" + +#~ msgid "Error connecting: " +#~ msgstr "Errorea konektatzean: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Errorea konektatzean: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "SOCKSv4 inplementazioak erabiltzaile-izena %i karakteretara mugatzen du" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4 inplementazioak ostalari-izena %i karakteretara mugatzen du" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Errorea UNIXetik irakurtzean: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Errorea UNIX ixtean: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Errorea UNIXen idaztean: %s" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "Itzulerako balioaren mota ez da zuzena: '%s' jaso da, baina '%s' espero " +#~ "zen" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "'%2$s' motaren '%1$s' propietatea ezartzen saiatzen, baina espero zen " +#~ "interfazearen arabera, mota '%3$s' da" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "" +#~ "Ez da '%s' bezalako eskemarik zehaztu gainidazketako '%s' fitxategian" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Komandoak:\n" +#~ " help Erakutsi informazio hau\n" +#~ " get Lortu gako baten balioa\n" +#~ " set Ezarri gako baten balioa\n" +#~ " reset Berrezarri gako baten balioa\n" +#~ " monitor Monitorizatu gako bat aldaketentzako\n" +#~ " writable Begiratu gakoa idazgarria den\n" +#~ "\n" +#~ "Erabili '%s KOMANDOA --help' komando bakoitzari dagokion laguntza " +#~ "lortzeko.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Zehaztu eskemaren bide-izena" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumentuak:\n" +#~ " ESKEMA Eskemaren IDa\n" +#~ " GAKOA Gakoaren izena\n" +#~ " BALIOA Gakoari ezarriko zaion balioa, serializatutako GVariant " +#~ "gisa\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s gakoa ez da idazgarria\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitorizatu GAKOA bere aldaketen jarraipena egiteko eta inprimatu " +#~ "aldatutako balioak.\n" +#~ "Monitorizazioak jarraitu egingo du prozesua amaitu bitartean." + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" diff --git a/po/fa.po b/po/fa.po new file mode 100644 index 0000000..98053ea --- /dev/null +++ b/po/fa.po @@ -0,0 +1,4192 @@ +# Translation of glib to Persian. +# Copyright (C) 2002, 2004, 2005, 2006 Sharif FarsiWeb, Inc. +# Roozbeh Pournader , 2002, 2004, 2006. +# Hamed Malek , 2005. +# Meelad Zakaria , 2006 +# Arash Mousavi , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-02-19 14:27+0000\n" +"PO-Revision-Date: 2012-02-25 01:05+0330\n" +"Last-Translator: Arash Mousavi \n" +"Language-Team: Persian <>\n" +"Language: \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" + +#: ../gio/gbufferedinputstream.c:411 +#: ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 +#: ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 +#: ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 +#: ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "مقدار شمارش بسیار بزرگی به %s ارسال شده است" + +#: ../gio/gbufferedinputstream.c:882 +#: ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 +#: ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "جریان از قبل بسته شده است" + +#: ../gio/gcancellable.c:318 +#: ../gio/gdbusconnection.c:1834 +#: ../gio/gdbusconnection.c:1925 +#: ../gio/gdbusconnection.c:2099 +#: ../gio/gdbusprivate.c:1413 +#: ../gio/glocalfile.c:2133 +#: ../gio/gsimpleasyncresult.c:810 +#: ../gio/gsimpleasyncresult.c:836 +#, c-format +msgid "Operation was cancelled" +msgstr "عملیات لغو شده" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "شیء نامعتبر، مقدار دهی اولیه نشد" + +#: ../gio/gcharsetconverter.c:284 +#: ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: ../gio/gcharsetconverter.c:318 +#: ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "فضا کافی در مقصد وجود ندارد" + +#: ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 +#: ../glib/gconvert.c:767 +#: ../glib/gconvert.c:1159 +#: ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 +#: ../glib/gutf8.c:841 +#: ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: ../gio/gcharsetconverter.c:350 +#: ../glib/gconvert.c:775 +#: ../glib/gconvert.c:1084 +#: ../glib/giochannel.c:1590 +#: ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "خطا در حین تبدیل: %s" + +#: ../gio/gcharsetconverter.c:447 +#: ../gio/gsocket.c:953 +msgid "Cancellable initialization not supported" +msgstr "مقداردهی‌های اولیه‌ی قابل لغو پشتیبانی نمی‌شود" + +#: ../gio/gcharsetconverter.c:458 +#: ../glib/gconvert.c:567 +#: ../glib/gconvert.c:645 +#: ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "تبدیل از مجموعه‌نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود" + +#: ../gio/gcharsetconverter.c:462 +#: ../glib/gconvert.c:571 +#: ../glib/gconvert.c:649 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد" + +#: ../gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "نوع نامعلوم" + +#: ../gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "نوع پرونده %s" + +#: ../gio/gcontenttype.c:680 +#, c-format +msgid "%s type" +msgstr "نوع %s" + +#: ../gio/gcredentials.c:273 +#: ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "بر روی این سیستم عامل GCredentials توسعه داده نشده است" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "پشتیبانی از GCredentials در پلتفرم شما وجود ندارد" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 +#: ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 +#: ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 +#: ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "Key/Value pair %d, `%s', in address element `%s', does not contain an equal sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "خطا در اجرا خودکار:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "خطا در بازکردن پرونده فعلی «‎%s»‏: %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏: %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏، انتظار Û±Û¶ بایت می‌رفت ولی %Id دریافت شد" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "آدرس داده شده خالی است" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 +#: ../gio/gdbusconnection.c:6688 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 +#: ../gio/gdbusconnection.c:6697 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "گزینهٔ نامعلوم %s" + +#: ../gio/gdbusauth.c:287 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:331 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:502 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1158 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "خطا در هنگام گرفتن اطلاعات برای شاخه «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "خطا در هنگام ساخت شاخه «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "خطا در هنگام باز کردن دسته‌کلید «%s» برای خواندن: " + +#: ../gio/gdbusauthmechanismsha1.c:406 +#: ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 +#: ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 +#: ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "خطا در هنگام ساخت پرونده قفل «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "خطا در هنگام شکستن پیوند پرونده‌ی قفل «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "خطا در هنگام باز کردن دسته‌کلید «%s» برای نوشتن: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:594 +#: ../gio/gdbusconnection.c:2402 +msgid "The connection is closed" +msgstr "اتصال بسته شده است" + +#: ../gio/gdbusconnection.c:1879 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2524 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:4026 +#: ../gio/gdbusconnection.c:4342 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4097 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4192 +#, c-format +msgid "No such property `%s'" +msgstr "همچین خصیصه‌ای وجود ندارد «%s»" + +#: ../gio/gdbusconnection.c:4204 +#, c-format +msgid "Property `%s' is not readable" +msgstr "خصیصه‌ی «%s» خواندنی نیست" + +#: ../gio/gdbusconnection.c:4215 +#, c-format +msgid "Property `%s' is not writable" +msgstr "خصیصه‌ی «%s» قابل نوشتن نیست" + +#: ../gio/gdbusconnection.c:4285 +#: ../gio/gdbusconnection.c:6131 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4469 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4690 +#: ../gio/gdbusconnection.c:6637 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4742 +#, c-format +msgid "No such method `%s'" +msgstr "همچین متدی وجود ندارد «%s»" + +#: ../gio/gdbusconnection.c:4773 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "نوع پیام، «%s»، با نوع مورد انتظار مطابقت ندارد «%s»" + +#: ../gio/gdbusconnection.c:4993 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "یک شیء از قبل برای واسط %s در %s صادر شده است" + +#: ../gio/gdbusconnection.c:5191 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:6242 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6361 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "نوع INVALID است" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2304 +#, c-format +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2312 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2356 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2366 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2382 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2939 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "خطا در بازگردانی با بدنه‌ای از نوع «%s»" + +#: ../gio/gdbusmessage.c:2947 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:2065 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2726 +#: ../gio/gdbusproxy.c:2860 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:708 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:872 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 +#: ../gio/gdbus-tool.c:218 +#: ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 +#: ../gio/gdbus-tool.c:691 +#: ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "خطا: %s\n" + +#: ../gio/gdbus-tool.c:173 +#: ../gio/gdbus-tool.c:231 +#: ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 +#: ../gio/gdbus-tool.c:822 +#: ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "خطا در هنگام اتصال: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "خطا: مسیر شیء مشخص نشده است.\n" + +#: ../gio/gdbus-tool.c:619 +#: ../gio/gdbus-tool.c:883 +#: ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "خطا: %s یک مسیر شیء معتبر نیست\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "خطا: %s یم نام واسط معتبر نیست\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "خطا: %s یک نام عضو معتبر نیست\n" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "نویسهٔ «%s» داخل نام نهادها مجاز نیست" + +#: ../gio/gdbus-tool.c:669 +#: ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "خطا در تجزیه پارامتر %Id: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "خطا در حین تبدیل: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "نام متد و واسط" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 +#: ../gio/gdbus-tool.c:1568 +#: ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "خطا: مقصد مشخص نشده است\n" + +#: ../gio/gdbus-tool.c:863 +#: ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "خطا: مسیر شیء مشخص نشده است\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "خطا: نام متد مشخص نشده است\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "خطا: نام متد «%s» نامعتبر است\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "خطا در هنگام تجزیه پارامتر %Id از نوع «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "چاپ XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "تنها ترجیحات را چاپ کن" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "نام مقصد جهت پایش" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "مسیر شیء جهت پایش" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "پایش یک شیء دوردست." + +#: ../gio/gdesktopappinfo.c:575 +#: ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "بدون‌نام" + +#: ../gio/gdesktopappinfo.c:988 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1276 +msgid "Unable to find terminal required for application" +msgstr "نمی‌توان پایانه‌ی لازم برای این برنامه را پیدا کرد" + +#: ../gio/gdesktopappinfo.c:1563 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1567 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1807 +#: ../gio/gdesktopappinfo.c:1831 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2055 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2171 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 +#: ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:874 +#: ../gio/gfile.c:1105 +#: ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 +#: ../gio/gfile.c:1531 +#: ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 +#: ../gio/gfile.c:1726 +#: ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 +#: ../gio/gfile.c:3312 +#: ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 +#: ../gio/gfile.c:3541 +#: ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 +#: ../gio/gfile.c:4359 +#: ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 +#: ../gio/gfile.c:4633 +#: ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 +#: ../gio/gfile.c:5315 +#: ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 +#: ../gio/gfile.c:7098 +#: ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 +#: ../gio/glocalfile.c:1070 +#: ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2414 +#: ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "نمی‌توان بر روی شاخه رونوشت کرد" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "نمي‌توان شاخه را بر روی شاخه رونوشت کرد" + +#: ../gio/gfile.c:2483 +#: ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "پرونده مقصد وجود دارد" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "نمی‌توان بطور پی‌درپی شاخه را رونوشت کرد" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "اتصال پشتیبانی نمی‌شود" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "خطا در هنگام اتصال پرونده: %s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "نمی‌توان پرونده خاص را رونوشت کرد" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "زباله پشتیبانی نمی‌شود" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "نام پرونده نمی‌تواند حاوی «%c» باشد" + +#: ../gio/gfile.c:6067 +#: ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "هیچ برنامه‌ای برای مار با این پرونده ثبت نشده است" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 +#: ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 +#: ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 +#: ../gio/gfileenumerator.c:470 +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:154 +#: ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 +#: ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 +#: ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 +#: ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "هیچ آدرسی مشخص نشده است" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, fuzzy, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "نمی‌توان آدرس محلی را دریافت کرد: %s" + +#: ../gio/ginetsocketaddress.c:206 +#: ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 +#: ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/glib-compile-resources.c:144 +#: ../gio/glib-compile-schemas.c:1449 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-resources.c:148 +#: ../gio/glib-compile-schemas.c:1453 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:259 +#, fuzzy, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "تغییر به شاخهٔ «%s» شکست خورد (%s)" + +#: ../gio/glib-compile-resources.c:287 +#, fuzzy, c-format +msgid "Unknown proprocessing options \"%s\"" +msgstr "گزینهٔ نامعلوم %s" + +#: ../gio/glib-compile-resources.c:305 +#: ../gio/glib-compile-resources.c:363 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "ساخت پرونده موقت شکست خورد: %s" + +#: ../gio/glib-compile-resources.c:335 +msgid "Error processing input file with xmllint" +msgstr "" + +#: ../gio/glib-compile-resources.c:390 +msgid "Error processing input file with to-pixdata" +msgstr "" + +#: ../gio/glib-compile-resources.c:403 +#, c-format +msgid "Error reading file %s: %s" +msgstr "خطا در خواندن پرونده %s: %s" + +#: ../gio/glib-compile-resources.c:423 +#, c-format +msgid "Error compressing file %s" +msgstr "خطا در هنگام فشرده‌سازی پرونده %s" + +#: ../gio/glib-compile-resources.c:487 +#: ../gio/glib-compile-schemas.c:1561 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#: ../gio/glib-compile-resources.c:610 +msgid "name of the output file" +msgstr "نام پرونده خروجی" + +#: ../gio/glib-compile-resources.c:610 +#: ../gio/glib-compile-resources.c:643 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:611 +msgid "The directories where files are to be read from (default to current directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:611 +#: ../gio/glib-compile-schemas.c:1989 +#: ../gio/glib-compile-schemas.c:2019 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:612 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:616 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:617 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:646 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:662 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "نام‌های خالی مجاز نیستند" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid " shadows in ; use to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "نمی‌توان با یک مسیر فهرست یک شِما بود" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "یک مسیر، اگر داده شود، باید با یک خط مورب شروع و خاتمه یابد" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "مسیر یک فهرست باید با «:/» خاتمه پیدا کند" + +#: ../gio/glib-compile-schemas.c:1229 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> از قبل مشخص شده است" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1747 +#: ../gio/glib-compile-schemas.c:1818 +#: ../gio/glib-compile-schemas.c:1894 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1755 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "تمام پرونده نادیده گرفته شده است.\n" + +#: ../gio/glib-compile-schemas.c:1814 +#, c-format +msgid "Ignoring this file.\n" +msgstr "نادیده گرفتن این پرونده.\n" + +#: ../gio/glib-compile-schemas.c:1854 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1860 +#: ../gio/glib-compile-schemas.c:1918 +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1864 +#: ../gio/glib-compile-schemas.c:1922 +#: ../gio/glib-compile-schemas.c:1950 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1880 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1908 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is out of the range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1936 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1990 +msgid "Abort on any errors in schemas" +msgstr "قطع کردن با رخدادِ هر نوع خطا در شِماها" + +#: ../gio/glib-compile-schemas.c:1991 +msgid "Do not write the gschema.compiled file" +msgstr "بر روی پرونده‌ی gschema.compiled ننویس" + +#: ../gio/glib-compile-schemas.c:1992 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2022 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2038 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "شما باید دقیقا نام یک دایرکتوری را بدهید\n" + +#: ../gio/glib-compile-schemas.c:2077 +#, c-format +msgid "No schema files found: " +msgstr "هیچ پرونده شماای پیدا نشد:" + +#: ../gio/glib-compile-schemas.c:2080 +#, c-format +msgid "doing nothing.\n" +msgstr "هیچ‌کاری انجام نمی‌شود.\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "removed existing output file.\n" +msgstr "پرونده خروجی فعلی حذف شد.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 +#: ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "نام‌پرونده نامعتبر: %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "خطا در دریافت اطلاعات سیستم‌پرونده‌: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "نمی‌توان شاخه ریشه را نام‌گذاری مجدد کرد" + +#: ../gio/glocalfile.c:1136 +#: ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "خطا در تغییر نام پرونده: %s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "نمی‌توان پرونده را مجددا نام‌گذاری کرد، نام پرونده از قبل وجود دارد" + +#: ../gio/glocalfile.c:1158 +#: ../gio/glocalfile.c:2162 +#: ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 +#: ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "نام پرونده نامعتبر" + +#: ../gio/glocalfile.c:1325 +#: ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "نمی‌توان شاخه را باز کرد" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "خطا در هنگام باز کردن پرونده: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "خطا در حذف پرونده: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "خطا در انتقال پرونده به زباله‌دان: %s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "نمی‌توان شاخه زباله‌دان %s را ساخت: %s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1964 +#: ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "نمی‌توان پرونده اطلاعات زباله‌دان را ایجاد کرد: %s" + +#: ../gio/glocalfile.c:2047 +#: ../gio/glocalfile.c:2052 +#: ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "نمی‌توان پرونده را به زباله‌دان فرستاد: %s" + +#: ../gio/glocalfile.c:2140 +#: ../glib/gregex.c:213 +msgid "internal error" +msgstr "خطا داخلی" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "خطا در هنگام ساخت شاخه: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "سیستم‌پرونده‌های از پیوندهای نمادین پشتیبانی نمی‌کند" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "خطا در در هنگام ساخت پیوند نمادین: %s" + +#: ../gio/glocalfile.c:2261 +#: ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "خطا در هنگام جابجایی پرونده: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2311 +#: ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 +#: ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 +#: ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "ساخت پرونده پشتیبان شکست خورد" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "خطا در هنگام حذف پرونده هدف: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "مقدار مشخصه نباید non-NULL باشد" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "نوع مشخصه نامعتبر است (رشته مورد انتظار بود)" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (کدگذاری نامعتبر)" + +#: ../gio/glocalfileinfo.c:1527 +#: ../gio/glocalfileoutputstream.c:843 +#, fuzzy, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "خطا در بازکردن پرونده فعلی «‎%s»‏: %s" + +#: ../gio/glocalfileinfo.c:1779 +#, fuzzy, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "خطا در هنگام تنظیم توصیف‌گر پرونده: %s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "نوع مشخصه نامعتبر (uint32 مورد انتظار بود)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "نوع مشخصه نامعتبر بود (uint64 مورد انتظار بود)" + +#: ../gio/glocalfileinfo.c:1861 +#: ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "نوع مشخصه نامعتبر (رشته بایتی مورد انتظار بود)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "نمی‌توان اجازه‌های روی پیوند نمادین را تنظیم کرد" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "خطا در هنگام تنظیم اجازه‌ها: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "خطا در هنگام تنظیم مالک: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2015 +#: ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "خطا در تنظیم پیوند نمادین: %s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "خطا در هنگام تنظیم کردن زمان دسترسی یا تغییر: %s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "خطا در تنظیم مفاد SELinux: %s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "سیستم SELinux بر روی این سیستم فعال نشده است" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "تنظیم کردن مشخصه %s پشتیبانی نمی‌شود" + +#: ../gio/glocalfileinputstream.c:185 +#: ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "خطا در هنگام خواندن از پرونده: %s" + +#: ../gio/glocalfileinputstream.c:216 +#: ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 +#: ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "خطا در هنگام جستجو در پرونده: %s" + +#: ../gio/glocalfileinputstream.c:261 +#: ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "خطا در هنگام بستن پرونده: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 +#: ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "خطا در هنگام نوشتن در پرونده: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "خطا در هنگام حذف کردن پیوند پشتیبانی قدیمی: %s" + +#: ../gio/glocalfileoutputstream.c:297 +#: ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "خطا در هنگام رونشت از پشتیبان: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "خطا خطا در تغییر نام پرونده موقت: %s" + +#: ../gio/glocalfileoutputstream.c:516 +#: ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "خطا در هنگام کوتاه کردن پرونده: %s" + +#: ../gio/glocalfileoutputstream.c:587 +#: ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 +#: ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 +#: ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "خطا در هنگام باز کردن پرونده «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "پرونده هدف یک شاخه است" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "پرونده هدف یک پرونده معمولی نیست" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "پرونده از خارج تغییر کرده است" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "خطا در هنگام حذف پرونده قدیمی: %s" + +#: ../gio/gmemoryinputstream.c:492 +#: ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "درخواست جستجو نامعتبر" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "Amount of memory required to process the write is larger than available address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:760 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:769 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "شبکه غیرقابل دسترس است" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "میزبان غیرقابل دسترسی است" + +#: ../gio/gnetworkmonitornetlink.c:97 +#: ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "نمی‌توان پایشگر شبکه را ساخت: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "نمی‌توان پایشگر شبکه را ساخت:" + +#: ../gio/gnetworkmonitornetlink.c:177 +#, fuzzy +msgid "Could not get network status: " +msgstr "نمی‌توان آدرس دوردست را دریافت کرد: %s" + +#: ../gio/goutputstream.c:212 +#: ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:378 +#: ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "جریان منبع از قبل بسته شده است" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "خطا در هنگام برطرف‌سازی «%s»: %s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "خطا در هنگام برطرف‌سازی معکوس «%s»: %s" + +#: ../gio/gresolver.c:849 +#: ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:854 +#: ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:859 +#: ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "خطا در هنگام برطرف‌سازی «%s»" + +#: ../gio/gresource.c:294 +#: ../gio/gresource.c:539 +#: ../gio/gresource.c:556 +#: ../gio/gresource.c:679 +#: ../gio/gresource.c:748 +#: ../gio/gresource.c:809 +#: ../gio/gresource.c:889 +#: ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 +#: ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:650 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "" + +#: ../gio/gresourcefile.c:858 +#, fuzzy +msgid "Input stream doesn't implement seek" +msgstr "جلد قابلیت eject ندارد" + +#: ../gio/gresource-tool.c:470 +#: ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "چاپ راهنما" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:486 +#: ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:508 +#: ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"فرمان ناشناس %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:533 +#: ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "متغییرها:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:541 +#: ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:53 +#: ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "همجین شِمایی وجود ندارد «%s»\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "شِما «%s» قابل جابه‌جایی نیست (مسیر نباید مشخص شود)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "شِما «%s» قابل جابه‌جایی نیست (مسیر باید مشخص شود)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "مسیر خالی داده شده است.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "مسیر با یک خط مورب (/) باید آغاز شود\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "مسیر با یک خط مورب (/) باید پایان یابد\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "همچین کلیدی وجود ندارد «%s»\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "مقدار فراهم شده خارج از محدود مجاز است\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "لیست کلیدها درون SCHEMA" + +#: ../gio/gsettings-tool.c:549 +#: ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "فهرست کردن فرزندان SCHEMA" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "گرفتن مقدار KEY" + +#: ../gio/gsettings-tool.c:568 +#: ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 +#: ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "تنظیم مقدار KEY به VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "تنظیم مجدد KEY به مقدار پیش‌فرض" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "تنظیم مجدد تمام کلیدها در SCHEMA به مقدار پیش‌فرض" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "بررسی اینکه KEY قابل نوشتن است" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "سوکت از قبل بسته شده است" + +#: ../gio/gsocket.c:305 +#: ../gio/gsocket.c:3467 +#: ../gio/gsocket.c:3511 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:471 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "درحال ساخت GSocket از طریق fd: %s" + +#: ../gio/gsocket.c:505 +#: ../gio/gsocket.c:521 +#, c-format +msgid "Unable to create socket: %s" +msgstr "نمی‌توان سوکت را ساخت: %s" + +#: ../gio/gsocket.c:505 +msgid "Unknown protocol was specified" +msgstr "پروتکل ناشناسی مشخص شده است" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "نمی‌توان آدرس محلی را دریافت کرد: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "نمی‌توان آدرس دوردست را دریافت کرد: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1890 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gsocket.c:1943 +#: ../gio/gsocket.c:1979 +#, fuzzy, c-format +msgid "Error joining multicast group: %s" +msgstr "خطا در راه‌اندازی برنامه: %s" + +#: ../gio/gsocket.c:1944 +#: ../gio/gsocket.c:1980 +#, fuzzy, c-format +msgid "Error leaving multicast group: %s" +msgstr "خطا در راه‌اندازی برنامه: %s" + +#: ../gio/gsocket.c:1945 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2164 +#, c-format +msgid "Error accepting connection: %s" +msgstr "خطا در هنگام پذیرفتن اتصال: %s" + +#: ../gio/gsocket.c:2285 +msgid "Connection in progress" +msgstr "اتصال در حال پیشروی است" + +#: ../gio/gsocket.c:2337 +#: ../gio/gsocket.c:4253 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ناتوان در دریافت خطای درانتظار: %s" + +#: ../gio/gsocket.c:2507 +#, c-format +msgid "Error receiving data: %s" +msgstr "خطا در دریافت داده: %s" + +#: ../gio/gsocket.c:2685 +#, c-format +msgid "Error sending data: %s" +msgstr "خطا در ارسال داده: %s" + +#: ../gio/gsocket.c:2799 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "نمی‌توان سوکت را خاموش کرد: %s" + +#: ../gio/gsocket.c:2878 +#, c-format +msgid "Error closing socket: %s" +msgstr "خط در هنگام بستن سوکت: %s" + +#: ../gio/gsocket.c:3460 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "در حال انتظار برای وضعیت سوکت: %s" + +#: ../gio/gsocket.c:3727 +#: ../gio/gsocket.c:3808 +#, c-format +msgid "Error sending message: %s" +msgstr "خطا در هنگام ارسال پیام: %s" + +#: ../gio/gsocket.c:3752 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:4032 +#: ../gio/gsocket.c:4168 +#, c-format +msgid "Error receiving message: %s" +msgstr "خطا در هنگام دریافت پیام: %s" + +#: ../gio/gsocket.c:4272 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "نمی‌توان به %s متصل شد:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "" + +#: ../gio/gsocketclient.c:976 +#: ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "خطا ناشناخته در اتصال" + +#: ../gio/gsocketclient.c:1029 +#: ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:1055 +#: ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "پروتکل پیشکار «%s» پیشتیبانی نمی‌شود." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "شنونده از قبل بسته شده است" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "سوکت اضافه شده بسته است" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "پیشکار SOCKSv4 از آدرس IPv6 «%s» پشتیبانی نمی‌کند" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "نام‌کاربری برای پروتکل SOCKSv4 بسیار بلند است" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "نام میزبان «%s» برای پروتکل SOCKSv4 بسیار بلند است" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "این کارگزار، یک کارگزار پیشکار SOCKSv4 نیست." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 +#: ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "پیشکار SOCKSv5 به تصدیق هویت نیاز دارد." + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "پیشکار SOCKSv5 به نوعی از تصدیق هویت نیاز دارد که در GLib پشتیبانی نمی‌شود." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "نام‌کاربری یا گذرواژه برای پروتکل SOCKSv5 بسیار بزرگ است." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "تصدیق هویت SOCKSv5 با توجه به اشتباه بودن گذرواژه و نام‌کاربری شکست خورد." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "نام میزبان «%s» برای پروتکل SOCKSv5 بسیار بزرگ است" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "کارگزار پیشکار SOCKSv5 از نوعی آدرس ناشناخته استفاده می‌کند." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "خطای داخلی کارگزار پیشکار SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "میزبان از طریق کارگزار SOCKSv5 در دسترس نیست." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "شبکه از طریق پیشکار SOCKSv5 غیرقابل دسترس است." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "اتصال از طریق پیشکار SOCKSv5 رد شد." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "پیشکار SOCKSv5 از فرمان «connect» پشتیبانی نمی‌کند." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "پیشکار SOCKSv5 از نوع آدرس ارائه شده پشتیبانی نمی‌کند." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "خطا ناشناس پیشکار نسخه Ûµ SOCKS." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "نمی‌توان با رمزنگاری نسخه %Id GThemedIcon را کار کرد" + +#: ../gio/gtlscertificate.c:249 +#, fuzzy +msgid "Cannot decrypt PEM-encoded private key" +msgstr "نمی‌توان کلید خصوصی رمزنگاری شده PEM را تجزیه کرد" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "هیچ کلید خصوصی رمز‌نگاری شده PEM پیدا نشد" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "نمی‌توان کلید خصوصی رمزنگاری شده PEM را تجزیه کرد" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "هیچ گواهینامه رمزنگاری شده PEM پیدا نشد" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "نمی‌توان گواهینامه رمزنگاری شده PEM را پیدا کرد" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "این آخرین شانس برای وارد کردن گذرواژه بطور صحیح قبل از قفل شدن دسترسی شما است." + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "تعدادی از گذرواژهای وارد شده نادرست بوده‌اند، و دسترسی شما بعد از اشتباهات بعدی بسته خواهد شد." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "گذرواژه وارد شده نادرست است." + +#: ../gio/gunixconnection.c:164 +#: ../gio/gunixconnection.c:580 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "انتظار Û± پیام کنترلی می‌رفت، %Id مورد دریافت شد" + +#: ../gio/gunixconnection.c:177 +#: ../gio/gunixconnection.c:590 +msgid "Unexpected type of ancillary data" +msgstr "نوع داده کمکی غیرمنتظره" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "انتظار یک fd می‌رفت، اما %Id مورد دریافت شد\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "یک fd نامعتبر دریافت شد" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "خطا در زمان ارسال گواهینامه: " + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "خطا در هنگام بررسی اینکه آیا SO_PASSCRED f برای سوکت فعال است یا خیر: %s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "Unexpected option length while checking if SO_PASSCRED is enabled for socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "خطا در هنگام فعال کردن SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:568 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "انتظار خواندن یک بایت برای دریافت گواهینامه می‌رفت اما صفر بایت خوانده شد" + +#: ../gio/gunixconnection.c:604 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "انتظار پیام کنترلی نمی‌رفت، اما %Id دریافت شد" + +#: ../gio/gunixconnection.c:630 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "خطا در هنگام غیرفعال‌سازی SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:392 +#: ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:492 +#, fuzzy, c-format +msgid "Error reading from file descriptor: %s" +msgstr "خطا در هنگام تنظیم توصیف‌گر پرونده: %s" + +#: ../gio/gunixinputstream.c:447 +#: ../gio/gunixinputstream.c:642 +#: ../gio/gunixoutputstream.c:433 +#: ../gio/gunixoutputstream.c:597 +#, fuzzy, c-format +msgid "Error closing file descriptor: %s" +msgstr "خطا در هنگام تنظیم توصیف‌گر پرونده: %s" + +#: ../gio/gunixmounts.c:1983 +#: ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "ریشه سیستم‌پرونده‌ها" + +#: ../gio/gunixoutputstream.c:378 +#: ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:478 +#, fuzzy, c-format +msgid "Error writing to file descriptor: %s" +msgstr "خطا در هنگام تنظیم توصیف‌گر پرونده: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "جلد قابلیت eject یا eject_with_operation را ندارد" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "نمی‌توان برنامه را پیدا کرد" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "خطا در راه‌اندازی برنامه: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "آدرس‌ها پشتیبانی نمی‌شود" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "تغییر ارتباط در win32 پشتیبانی نمی‌شود" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "ساخت ارتباط بر روی win32 پشتیبانی نمی‌شود" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gwin32inputstream.c:348 +#: ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../gio/gzlibcompressor.c:396 +#: ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "حافظه کافی موجود نیست" + +#: ../gio/gzlibcompressor.c:403 +#: ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "خطا داخلی: %s" + +#: ../gio/gzlibcompressor.c:416 +#: ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "ورودی بیشتر لازم است" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "داده فشرده شده نامعتبر" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "مشخصهٔ غیرمنتظرهٔ «%s» برای عنصر «%s»" + +#: ../glib/gbookmarkfile.c:771 +#: ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 +#: ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "مشخصهٔ «%s» برای عنصر «%s» پیدا نشد" + +#: ../glib/gbookmarkfile.c:1129 +#: ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 +#: ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "برچسب غیرمنتظرهٔ «%s»، برچسب «%s» انتظار می‌رفت" + +#: ../glib/gbookmarkfile.c:1154 +#: ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 +#: ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "برچسب غیرمنتظرهٔ «%s» داخل «%s»" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "پروندهٔ چوب‌الف معتبری در شاخه‌های داده پیدا نمی‌شود" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "چوب‌الفی برای نشانی «‎%s» از قبل موجود است" + +#: ../glib/gbookmarkfile.c:2053 +#: ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 +#: ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 +#: ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 +#: ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 +#: ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 +#: ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 +#: ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 +#: ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "چوب‌الفی برای نشانی «‎%s» پیدا نشد" + +#: ../glib/gbookmarkfile.c:2385 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "هیچ نوع MIME در چوب‌الف برای نشانی «‎%s» تعریف نشده است" + +#: ../glib/gbookmarkfile.c:2470 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "پرچم خصوصی‌ای برای چوب‌الف برای نشانی «%s» تعریف نشده است" + +#: ../glib/gbookmarkfile.c:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "گروهی در چوب‌الف برای نشانی «‎%s» تعیین نشده است" + +#: ../glib/gbookmarkfile.c:3244 +#: ../glib/gbookmarkfile.c:3401 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "برنامه‌ای با نام «%s» چوب‌الفی برای «‎%s» ثبت نکرده است" + +#: ../glib/gbookmarkfile.c:3424 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s" + +#: ../glib/gconvert.c:806 +#: ../glib/gutf8.c:837 +#: ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 +#: ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "دنباله نویسهٔ ناتمام در انتهای ورودی" + +#: ../glib/gconvert.c:1056 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "نمی‌توان عقب‌نشینی «%s» را به مجموعه کد «%s» تبدیل کرد" + +#: ../glib/gconvert.c:1873 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "نشانی «‎%s» یک نشانی اینترنتی مطلق با شِمای «پرونده» نیست" + +#: ../glib/gconvert.c:1883 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "نشانی پروندهٔ محلی «‎%s» نمی‌تواند «#» داشته باشد" + +#: ../glib/gconvert.c:1900 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "نشانی اینترنتی «%s» نامعتبر است" + +#: ../glib/gconvert.c:1912 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است" + +#: ../glib/gconvert.c:1928 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "نشانی اینترنتی «‎%s» نویسه‌های گریختهٔ نامعتبر دارد" + +#: ../glib/gconvert.c:2023 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "نام مسیر «‎%s» یک مسیر مطلق نیست" + +#: ../glib/gconvert.c:2033 +msgid "Invalid hostname" +msgstr "نام میزبان نامعتبر" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ق‌ظ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ب‌ظ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "‫%A %Oe %B %Oy، %OH:%OM:%OS‬" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Oy/%Om/%Od" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%OH:%OM:%OS" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%OI:%OM:%OS %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ژانویه" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "فوریه" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "مارس" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "آوریل" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "مه" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "ژوئن" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ژوئیه" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "آگوست" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "سپتامبر" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "اکتبر" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "نوامبر" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "دسامبر" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ژانویه" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "فوریه" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "مارس" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "آوریل" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "مه" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ژوئن" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ژوئیه" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "آگوست" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "سپتامبر" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "اکتبر" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "نوامبر" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "دسامبر" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "دوشنبه" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "سه‌شنبه" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "چهارشنبه" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "پنجشنبه" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "جمعه" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "شنبه" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "یکشنبه" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "دوشنبه" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "سه‌شنبه" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "چهارشنبه" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "پنجشنبه" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "جمعه" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "شنبه" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "یکشنبه" + +#: ../glib/gdir.c:121 +#: ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "خطا در باز کردن شاخهٔ «‎%s»‏: %s" + +#: ../glib/gfileutils.c:675 +#: ../glib/gfileutils.c:763 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "نمی‌توان %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص داد" + +#: ../glib/gfileutils.c:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "پرونده «%s» بسیار بزرگ است" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "خواندن از پروندهٔ «‎%s» شکست خورد: %s" + +#: ../glib/gfileutils.c:838 +#: ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: %s" + +#: ../glib/gfileutils.c:855 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "گرفتن مشخصه‌های پروندهٔ «‎%s» شکست خورد: fstat()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: fdopen()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:997 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "تغییر دادن نام پروندهٔ «‎%s» به «‎%s» شکست خورد: g_rename()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1039 +#: ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ایجاد پروندهٔ «‎%s» شکست خورد: %s" + +#: ../glib/gfileutils.c:1053 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» برای نوشتن شکست خورد: fdopen()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fdwrite()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fflush()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "نوشتن پروندهٔ «‎%s» شکست خورد: fsync()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "بستن پروندهٔ «‎%s» شکست خورد: fclose()‎ شکست خورد: %s" + +#: ../glib/gfileutils.c:1287 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "نمی‌توان پروندهٔ موجود «‎%s» را جذف کرد: g_unlink() شکست خورد: %s" + +#: ../glib/gfileutils.c:1547 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "قالب «%s» نامعتبر است، نباید «%s» داشته باشد" + +#: ../glib/gfileutils.c:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "قالب «%s» حاوی XXXXXX نیست" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "خواندن پیوند نمادی «‎%s» شکست خورد: %s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "نمی‌توان مبدل «%s» به «%s» را باز کرد: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "نمی‌توان در g_io_channel_read_line_string خوانش خام انجام داد" + +#: ../glib/giochannel.c:1807 +#: ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "دادهٔ تبدیل‌نشده در میان‌گیر خواندن باقی مانده است" + +#: ../glib/giochannel.c:1888 +#: ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "نمی‌توان در g_io_channel_read_to_end خوانش خام انجام داد" + +#: ../glib/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "پروندهٔ کلید معتبر در شاخه‌های جست‌وجو یافت نمی‌شود" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "پرونده متعارف نیست" + +#: ../glib/gkeyfile.c:1162 +#, c-format +msgid "Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "پرونده کلید حاوی خط «%s» است که جفت کلید‐مقدار، گروه یا توضیح نیست" + +#: ../glib/gkeyfile.c:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "نام گروه نامعتبر: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "پروندهٔ کلید با یک گروه آغاز نمی‌شود" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "نام کلید نامعتبر: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "پروندهٔ کلید حاوی کدگذاری پشتیبانی نشدهٔ «%s» است" + +#: ../glib/gkeyfile.c:1541 +#: ../glib/gkeyfile.c:1703 +#: ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 +#: ../glib/gkeyfile.c:3273 +#: ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 +#: ../glib/gkeyfile.c:3778 +#: ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "پروندهٔ کلید گروه «%s» را ندارد" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "پروندهٔ کلید، کلید «%s» را ندارد" + +#: ../glib/gkeyfile.c:1822 +#: ../glib/gkeyfile.c:1938 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "پروندهٔ کلید حاوی کلید «%s» با مقدار «%s» است که UTF-8 نیست" + +#: ../glib/gkeyfile.c:1842 +#: ../glib/gkeyfile.c:1958 +#: ../glib/gkeyfile.c:2327 +#, c-format +msgid "Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "پروندهٔ کلید حاوی کلید «%s» است که دارای مقداری است که قابل تفسیر نیست." + +#: ../glib/gkeyfile.c:2544 +#: ../glib/gkeyfile.c:2910 +#, fuzzy, c-format +msgid "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." +msgstr "پروندهٔ کلید حاوی کلید «%s» در گروه «%s» است که مقداری دارد که قابل تفسیر نیست" + +#: ../glib/gkeyfile.c:2622 +#: ../glib/gkeyfile.c:2698 +#, fuzzy, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "پروندهٔ کلید حاوی کلید «%s» در گروه «%s» است که مقداری دارد که قابل تفسیر نیست" + +#: ../glib/gkeyfile.c:3096 +#: ../glib/gkeyfile.c:3288 +#: ../glib/gkeyfile.c:3857 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "پروندهٔ کلید، کلید «%s» در گروه «%s» را ندارد" + +#: ../glib/gkeyfile.c:4089 +msgid "Key file contains escape character at end of line" +msgstr "پرونده کلید شامل نویسهٔ گریز در انتهای خط است" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "پروندهٔ کلید حاوی دنبالهٔ گریز نامعتبر «%s» است" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "مقدار «%s» را نمی‌توان به عدد تفسیر کرد" + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "مقدار صحیح «%s» خارج از محدوده است" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "مقدار «%s» را نمی‌توان به عدد اعشاری تفسیر کرد" + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "مقدار «%s» را نمی‌توان به مقدار بولی تفسیر کرد" + +#: ../glib/gmappedfile.c:128 +#, fuzzy, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "گرفتن مشخصه‌های پروندهٔ «‎%s» شکست خورد: fstat()‎ شکست خورد: %s" + +#: ../glib/gmappedfile.c:194 +#, fuzzy, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "تهیهٔ نقشه از پروندهٔ «‎%s» شکست خورد: mmap()‎ شکست خورد: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "باز کردن پروندهٔ «‎%s» شکست خورد: open()‎ شکست خورد: %s" + +#: ../glib/gmarkup.c:356 +#: ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "خطا در سطر %Id نویسهٔ %Id:‏ " + +#: ../glib/gmarkup.c:419 +#: ../glib/gmarkup.c:502 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر در نام - «%s» معتبر نیست" + +#: ../glib/gmarkup.c:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "نام «%s» معتبر نیست" + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "نام «%s» معتبر نیست: «%c»" + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "خطا در سطر %Id:‏ %s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ارجاع نویسه‌ای «‎%-.*s» به نویسهٔ مجاز اشاره نمی‌کند" + +#: ../glib/gmarkup.c:715 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "نهاد خالی «‎&;‎» مشاهده شد؛ نهادهای معتبر عبارتند از: ‎& " < > '‎" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "نام نهاد «%-.*s» شناخته شده نیست" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "نوشتار باید با یک عنصر (مثلاً ) شروع شود" + +#: ../glib/gmarkup.c:1116 +#, c-format +msgid "'%s' is not a valid character following a '<' character; it may not begin an element name" +msgstr "‏«%s» پس از یک نویسهٔ '‎<‎' نویسهٔ مجازی نیست؛ نمی‌شود ابتدای نام یک عنصر باشد" + +#: ../glib/gmarkup.c:1184 +#, c-format +msgid "Odd character '%s', expected a '>' character to end the empty-element tag '%s'" +msgstr "نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب عنصر خالی «%s» انتظار یک نویسهٔ «‎>‎» می‌رفت" + +#: ../glib/gmarkup.c:1268 +#, c-format +msgid "Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "نویسهٔ غیرعادی «%s»، بعد از نام مشخصهٔ «%s» عنصر «%s» انتظار یک نویسهٔ «=» می‌رفت" + +#: ../glib/gmarkup.c:1309 +#, 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:1353 +#, 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:1486 +#, c-format +msgid "'%s' is not a valid character following the characters ''" +msgstr "‏«%s» نویسهٔ معتبری برای بستن نام عنصر «%s» نیست؛ نویسهٔ مجاز «‎>» است" + +#: ../glib/gmarkup.c:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "عنصر «%s» بسته بود، در حال حاضر هیچ عنصری باز نیست" + +#: ../glib/gmarkup.c:1542 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "عنصر «%s» بسته بود، ولی عنصری که در حال حاضر باز است «%s» است" + +#: ../glib/gmarkup.c:1710 +msgid "Document was empty or contained only whitespace" +msgstr "نوشتار خالی است یا فقط فاصلهٔ خالی دارد" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "نوشتار به‌طور غیرمنتظره‌ای درست بعد از یک علامت کوچکتر '‎<‎' پایان یافت" + +#: ../glib/gmarkup.c:1732 +#: ../glib/gmarkup.c:1777 +#, c-format +msgid "Document ended unexpectedly with elements still open - '%s' was the last element opened" +msgstr "نوشتار وقتی که هنوز عناصری باز بودند به‌طور غیرمنتظره‌ای پایان یافت ‐ آخرین عنصر باز شده «%s» بود" + +#: ../glib/gmarkup.c:1740 +#, c-format +msgid "Document ended unexpectedly, expected to see a close angle bracket ending the tag <%s/>" +msgstr "نوشتار به‌طور غیرمنتظره‌ای پایان یافت، یک علامت بزرگتر برای بستن برچسب ‎<%s/>‎ انتظار می‌رفت" + +#: ../glib/gmarkup.c:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک عنصر به‌پایان رسید" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک برچسب عنصربازکن پایان یافت." + +#: ../glib/gmarkup.c:1763 +msgid "Document ended unexpectedly after the equals sign following an attribute name; no attribute value" +msgstr "نوشتار به‌طور غیرمنتظره‌ای بعد از علامت تساوی‌ای که پس از نام مشخصه‌ای آمده بود تمام شد؛ بدون مقدار برای مشخصه" + +#: ../glib/gmarkup.c:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل مقدار یک مشخصه به‌پایان رسید" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک توضیح یا دستورالعمل پردازشی پایان یافت" + +#: ../glib/goption.c:766 +msgid "Usage:" +msgstr "روش استفاده:" + +#: ../glib/goption.c:766 +msgid "[OPTION...]" +msgstr "[گزینه...]" + +#: ../glib/goption.c:872 +msgid "Help Options:" +msgstr "گزینه‌های راهنما:" + +#: ../glib/goption.c:873 +msgid "Show help options" +msgstr "نمایش گزینه‌های راهنما" + +#: ../glib/goption.c:879 +msgid "Show all help options" +msgstr "نمایش همهٔ گزینه‌های راهنما" + +#: ../glib/goption.c:941 +msgid "Application Options:" +msgstr "گزینه‌های برنامه:" + +#: ../glib/goption.c:1003 +#: ../glib/goption.c:1073 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "نمی‌توان مقدار صحیح «%s» برای %s را تجزیه کرد" + +#: ../glib/goption.c:1013 +#: ../glib/goption.c:1081 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "مقدار صحیح «%s» خارج از محدودهٔ %s است" + +#: ../glib/goption.c:1038 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "نمی‌توان مقدار صحیح با دقت مضاعف «%s» برای %s را تجزیه کرد" + +#: ../glib/goption.c:1046 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "مقدار صحیح با دقت مضاعف «%s» خارج از محدودهٔ %s است" + +#: ../glib/goption.c:1309 +#: ../glib/goption.c:1388 +#, c-format +msgid "Error parsing option %s" +msgstr "خطا در تجزیهٔ گزینهٔ %s" + +#: ../glib/goption.c:1419 +#: ../glib/goption.c:1532 +#, c-format +msgid "Missing argument for %s" +msgstr "‏%s یک آرگومان کم دارد" + +#: ../glib/goption.c:1985 +#, c-format +msgid "Unknown option %s" +msgstr "گزینهٔ نامعلوم %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "شیء ناقص" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "خطا داخلی یا شیء ناقص" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "حافظه کم است" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "محدودیت backtracking فرارسید" + +#: ../glib/gregex.c:211 +#: ../glib/gregex.c:219 +msgid "the pattern contains items not supported for partial matching" +msgstr "الگو حاوی مواردی است که برای مطابقت جزئی مناسب نیست" + +#: ../glib/gregex.c:221 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:230 +msgid "recursion limit reached" +msgstr "محدودیت تکرار فرارسید" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "ترکیب نادرست پرچم‌های خط جدید" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "افست نادرست" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "utf8 کوتاه" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "خطا نادرست" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ در پایان الگو" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "\\c در پایان الگو" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "نویسه ناشناخته پس از \\" + +#: ../glib/gregex.c:275 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:278 +msgid "numbers out of order in {} quantifier" +msgstr "اعداد بدون ترتیل در کمیت‌سنج {}" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "اعداد در کمیت‌سنج {} بسیار بزرگ هستند" + +#: ../glib/gregex.c:284 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد" + +#: ../glib/gregex.c:287 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "محدوده در کلاس نویسه بدون ترتیب است" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "چیزی برای تکرار نیست" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "نویسه ناشناس بعد از (?" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "نویسه ناشناس بعد از (?<" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "نویسه ناشناس بعد از (?P" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "عبارت باقاعده بسیار بلند است" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "گرفتن حافظه شکست خورد" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "نام کلاس POSIX ناشناخته" + +#: ../glib/gregex.c:351 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "خصیصه‌ی ناشناس پس از \\P یا \\p" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:396 +msgid "\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:401 +msgid "unexpected repeat" +msgstr "تکرار غیرمنتظره" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:631 +#: ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "خطا در هنگام منطبق کردن عبارت باقاعده %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "کتابخانه PCRE بدون پشتیبانی از UTF8 کامپایل شده است" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "کتابخانه PCRE بدون پشتیبانی از گزینه‌های UTF8 کامپایل شده است" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "خطا در هنگام کامپایل عبارت با قاعده %s در نویسه %Id: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "خطا در هنگام بهینه کردن عبارت باقاعده %s: %s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "رقم هگزادسیمال یا «}» مورد انتظار بود" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "رقم هگزادسیمال مورد انتظار بود" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "ارجاع نمادین ناتمام" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "انتظار رقم می‌رفت" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "ارجاع نمادین غیرقانونی" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "«\\» پایانی سرگردان" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2359 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "خطا در هنگام تجزیه کردن متن جایگزین «%s» در نویسه %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "متن نقل شده با علامت نقل قول شروع نمی‌شود" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "علامت نقل قول تکی در سطر دستور یا متون داخل پوستهٔ دیگر" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "متن دقیقاً پس از یک نویسهٔ «\\» پایان یافت. (متن عبارت بود از «%s»)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "متن پیش از آن که علامت نقل قول متناظر برای %c پیدا شود پایان یافت. (متن عبارت بود از «%s»)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "متن خالی بود (یا فقط فاصلهٔ خالی داشت)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد (%s)" + +#: ../glib/gspawn.c:348 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "خطای غیرمنتظره در select()‎ هنگام خواندن داده‌ها از یک فراروند فرزند (%s)" + +#: ../glib/gspawn.c:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "خطای غیرمنتظره در waitpid()‎ ‏(%s)" + +#: ../glib/gspawn.c:1174 +#: ../glib/gspawn-win32.c:338 +#: ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "خواندن از لولهٔ فرزند شکست خورد (%s)" + +#: ../glib/gspawn.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "انشعاب شکست خورد (%s)" + +#: ../glib/gspawn.c:1387 +#: ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "تغییر به شاخهٔ «%s» شکست خورد (%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "اجرای فراروند فرزند «%s» شکست خورد (%s)" + +#: ../glib/gspawn.c:1407 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "تغییر مسیر خروجی یا ورودی فراروند فرزند شکست خورد (%s)" + +#: ../glib/gspawn.c:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "انشعاب فراروند فرزند شکست خورد (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "خطای ناشناخته هنگام اجرای فراروند فرزند «%s»" + +#: ../glib/gspawn.c:1448 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "خواندن دادهٔ کافی از لولهٔ pid فرزند شکست خورد (%s)" + +#: ../glib/gspawn.c:1521 +#: ../glib/gspawn-win32.c:299 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ایجاد لوله برای ارتباط با فراروند فرزند شکست خورد (%s)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "خواندن داده‌ها از فراروند فرزند شکست خورد" + +#: ../glib/gspawn-win32.c:375 +#: ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "اجرای فراروند فرزند شکست خورد (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "نام برنامهٔ نامعتبر: %s" + +#: ../glib/gspawn-win32.c:454 +#: ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "رشتهٔ نامعتبر در بردار آرگومان درآیهٔ %Id: %s" + +#: ../glib/gspawn-win32.c:465 +#: ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "رشتهٔ نامعتبر در محیط: %s" + +#: ../glib/gspawn-win32.c:718 +#: ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "شاخهٔ کاری نامعتبر‏: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "اجرای برنامهٔ راهنما (‎%s) شکست خورد" + +#: ../glib/gspawn-win32.c:997 +msgid "Unexpected error in g_io_channel_win32_poll() reading data from a child process" +msgstr "خطای غیرمنتظره در g_io_channel_win32_poll()‎ هنگام خواندن داده‌ها از یک فراروند فرزند" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "نویسهٔ خارج از محدوده برای UTF-8" + +#: ../glib/gutf8.c:1015 +#: ../glib/gutf8.c:1024 +#: ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 +#: ../glib/gutf8.c:1302 +#: ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "دنبالهٔ نامعتبر در ورودی تبدیل" + +#: ../glib/gutf8.c:1313 +#: ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "نویسهٔ خارج از محدوده برای UTF-16" + +#: ../glib/gutils.c:2166 +#: ../glib/gutils.c:2193 +#: ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%Iu بایت" +msgstr[1] "%Iu بایت" + +#: ../glib/gutils.c:2172 +#, c-format +msgid "%.1f KiB" +msgstr "%I.1f KiB" + +#: ../glib/gutils.c:2174 +#, c-format +msgid "%.1f MiB" +msgstr "%I.1f MiB" + +#: ../glib/gutils.c:2177 +#, c-format +msgid "%.1f GiB" +msgstr "%I.1f GiB" + +#: ../glib/gutils.c:2180 +#, c-format +msgid "%.1f TiB" +msgstr "%I.1f TiB" + +#: ../glib/gutils.c:2183 +#, c-format +msgid "%.1f PiB" +msgstr "%I.1f PiB" + +#: ../glib/gutils.c:2186 +#, c-format +msgid "%.1f EiB" +msgstr "%I.1f EiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f kB" +msgstr "%I.1f کیلوبایت" + +#: ../glib/gutils.c:2202 +#: ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%I.1f مگابایت" + +#: ../glib/gutils.c:2205 +#: ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%I.1f گیگابایت" + +#: ../glib/gutils.c:2207 +#: ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%I.1f تترابایت" + +#: ../glib/gutils.c:2210 +#: ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%I.1f پتابایت" + +#: ../glib/gutils.c:2213 +#: ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%I.1f اگزابایت" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s بایت" +msgstr[1] "%s بایت" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%I.1f کیلوبایت" + +#~ msgid "File is empty" +#~ msgstr "پرونده خالی است" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "پروندهٔ کلید حاوی کلید «%s» است که مقداری دارد که قابل تفسیر نیست." + +#, fuzzy +#~ msgid "Error stating file '%s': %s" +#~ msgstr "خطا در خواندن پروندهٔ «‎%s»‏: %s" + +#~ msgid "Error connecting: " +#~ msgstr "خطا در هنگام برقراری ارتباط" + +#~ msgid "Error connecting: %s" +#~ msgstr "خطا در هنگام برقراری ارتباط: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "خطا در خواندن از یونیکس: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "خطا در هنگام بستن یونیکس: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "خطا در زمان نوشتن در یونیکس: %s" + +#, 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 "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 "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.po b/po/fi.po new file mode 100644 index 0000000..7075138 --- /dev/null +++ b/po/fi.po @@ -0,0 +1,3835 @@ +# 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-2010. +# Harri Pitkänen , 2009. +# Tommi Vainikainen , 2009-2011. +# +# Sanasto: +# D-Bus-metodin ”signature” = tyyppimääritys +# +# Gnome 2012-03 Finnish translation sprint participants: +# Flammie Pirinen +# Niklas Laxström +msgid "" +msgstr "" +"" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-02-25 20:54+0000\n" +"PO-Revision-Date: 2012-03-12 08:36:57+0000\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" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-POT-Import-Date: 2012-03-05 14:50:02+0000\n" +"X-Generator: MediaWiki 1.20alpha (r113129); Translate 2012-03-02\n" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Liian suuri laskuriarvo välitetty kohteelle %s" + +#: ../gio/gbufferedinputstream.c:882 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "Virta on jo suljettu" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1834 +#: ../gio/gdbusconnection.c:1925 ../gio/gdbusconnection.c:2099 +#: ../gio/gdbusprivate.c:1413 ../gio/glocalfile.c:2133 +#: ../gio/gsimpleasyncresult.c:810 ../gio/gsimpleasyncresult.c:836 +#, c-format +msgid "Operation was cancelled" +msgstr "Toiminto oli peruttu" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Virheellinen olio, alustamaton" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Virheellinen monitavusarja syötteessä" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Kohteessa ei ole tarpeeksi tilaa" + +#: ../gio/gcharsetconverter.c:345 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Virheellinen tavusarja muunnettavassa syötteessä" + +#: ../gio/gcharsetconverter.c:350 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Virhe muunnoksen aikana: %s" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:954 +msgid "Cancellable initialization not supported" +msgstr "Keskeytyskelpoinen alustus ei ole tuettu" + +#: ../gio/gcharsetconverter.c:458 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Muunnos merkistöstä ”%s” merkistöön ”%s” ei ole tuettu" + +#: ../gio/gcharsetconverter.c:462 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Muunninta merkistöstä ”%s” merkistöön ”%s” ei voitu avata" + +#: ../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:680 +#, c-format +msgid "%s type" +msgstr "%s-tyyppi" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ei ole toteutettu tälle käyttöjärjestelmälle" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Alustallesi ei ole GCredentials-tukea" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Odottamaton aikainen virran loppu" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Ei-tuettu avain ”%s” osoitekentässä ”%s”" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "Osoite ”%s” on virheellinen (pitää olla täsmälleen näistä: yksi polku, tilapäishakemisto tai abstraktit avaimet)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Merkityksetön avain/arvo-pariyhdistelmä osoitekentässä ”%s”" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Virhe osoitteessa ”%s” - porttiattribuutti on epämuodostunut" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Virhe osoitteessa ”%s” - perheattribuutti on epämuodostunut" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Osoite-elementti ”%s” ei sisällä kaksoispistettä (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "Key/Value pair %d, `%s', in address element `%s', does not contain an equal sign" +msgstr "Avain/Arvo-pari %d, ”%s” osoite-elementissä ”%s\" ei sisällä yhtäsuuruusmerkkiä" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "Virhe ohjausmerkeissä avaimessa tai arvossa Avain/Arvo-parissa %d, ”%s” osoite-elementissä ”%s”" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "Virhe osoitteessa ”%s” - unix-liikenne vaatii täsmälleen yhden avaimista ”path” tai ”abstract” asetettuksi" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Virhe osoitteessa ”%s” - konenimiattribuutti puuttuu tai on epämuodostunut" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Virhe osoitteessa ”%s” - porttiattribuutti puuttuu tai on epämuodostunut" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Virhe osoitteessa ”%s” - kertakäyttötiedostoattribuutti puuttuu tai on epämuodostunut" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Virhe automaattikäynnistyksessä: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Tuntematon tai ei-tuettu siirtotapa ”%s” osoitteelle ”%s”" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Virhe avattaessa kertakäyttölukujen tiedostoa ”%s”: %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Virhe kertakäyttölukujen tiedoston ”%s” lukemisessa: %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Virhe kertakäyttölukujen tiedoston ”%s” lukemisessa, odotettiin 16 tavua, saatiin %d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Virhe kirjoitettaessa kertakäyttölukujen tiedoston ”%s” sisältöä virtaan:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "Annettu osoite on tyhjä" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ei voida käynnistää viestiväylää ilman tietokonetunnistetta: " + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Virhe käynnistettäessä komentoriviä ”%s”: " + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Epänormaali ohjelman päättyminen käynnistettäessä komentoriviä ”%s”: %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Komentorivi ”%s” lopetti nollasta eroavaan lopetustilaan %d: %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Ei voi päätellä istuntoväylän osoitetta (ei toteutettu tälle käyttöjärjestelmälle)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6688 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "Ei voitu päätellä väyläosoitetta DBUS_STARTER_BUS_TYPE-ympäristömuuttujasta - tuntematon arvo ”%s”" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6697 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "Ei voitu päätellä väyläosoitetta, koska DBUS_STARTER_BUS_TYPE-ympäristömuuttujaa ei ole asetettu" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tuntematon väylätyyppi %d" + +#: ../gio/gdbusauth.c:287 +msgid "Unexpected lack of content trying to read a line" +msgstr "Odottamaton sisällön puute yritettäessä lukea riviä" + +#: ../gio/gdbusauth.c:331 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Odottamaton sisällön puute yritettäessä (turvallisest) lukea riviä" + +#: ../gio/gdbusauth.c:502 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "Kulutettu kaikki saatavilla olevat todennusmenetelmät (kokeiltu: %s) (saatavilla: %s)" + +#: ../gio/gdbusauth.c:1158 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Peruutus kohteen GDBusAuthObserver::authorize-authenticated-peer kautta" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Virhe haettaessa tietoja hakemistosta ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "Hakemiston ”%s” oikeudet ovat väärät. Odotettiin oikeuksia 0700, saatiin 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Virhe luotaessa hakemistoa ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Virhe avattaessa avainrengasta ”%s” lukua varten: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Rivi %d avainrenkaassa polussa ”%s” sisällöllä ”%s” on epämuodostunut" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Ensimmäinen sana rivillä %d avainrenkaassa polussa ”%s” sisällöllä ”%s” on epämuodostunut" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Toinen sana rivillä %d avainrenkaassa polussa ”%s” sisällöllä ”%s” on epämuodostunut" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Ei löytynyt evästettä tunnisteella %d avainrenkaasta polusta ”%s”" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Virhe poistettaessa mätää lukkotiedostoa ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Virhe luotaessa lukkotiedostoa ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Virhe suljettaessa (linkitöntä) lukkotiedostoa ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Virhe epälinkitettäessä lukkotiedostoa ”%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Virhe avattaessa avainrengasta ”%s” kirjoitusta varten: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Lisäksi myös tiedoston ”%s” lukon vapauttaminen epäonnistui: %s) " + +#: ../gio/gdbusconnection.c:594 ../gio/gdbusconnection.c:2402 +msgid "The connection is closed" +msgstr "Yhteys on suljettu" + +#: ../gio/gdbusconnection.c:1879 +msgid "Timeout was reached" +msgstr "Aikakatkaisu saavutettiin" + +#: ../gio/gdbusconnection.c:2524 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "Ei-tuettuja lippuja kohdattu muodostettaessa asiakaspuolen yhteyttä" + +#: ../gio/gdbusconnection.c:4026 ../gio/gdbusconnection.c:4342 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "Ei rajapintaa ”org.freedesktop.DBus.Properties” oliolla polussa %s" + +#: ../gio/gdbusconnection.c:4097 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Virhe asetettaessa ominaisuutta ”%s”: Odotettiin tyyppiä ”%s” mutta saatiin ”%s”" + +#: ../gio/gdbusconnection.c:4192 +#, c-format +msgid "No such property `%s'" +msgstr "Ei ominaisuutta ”%s”" + +#: ../gio/gdbusconnection.c:4204 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Ominaisuus ”%s” ei ole luettavissa" + +#: ../gio/gdbusconnection.c:4215 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Ominaisuus ”%s” ei ole kirjoitettavissa" + +#: ../gio/gdbusconnection.c:4285 ../gio/gdbusconnection.c:6131 +#, c-format +msgid "No such interface `%s'" +msgstr "Ei rajapintaa ”%s”" + +#: ../gio/gdbusconnection.c:4469 +msgid "No such interface" +msgstr "Ei rajapintaa" + +#: ../gio/gdbusconnection.c:4690 ../gio/gdbusconnection.c:6637 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Ei rajapintaa ”%s” oliolla polussa %s" + +#: ../gio/gdbusconnection.c:4742 +#, c-format +msgid "No such method `%s'" +msgstr "Ei metodia ”%s”" + +#: ../gio/gdbusconnection.c:4773 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Viestin tyyppi ”%s” ei täsmää odotettuun tyyppiin ”%s”" + +#: ../gio/gdbusconnection.c:4993 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Olio on jo viety rajapintana %s polussa %s" + +#: ../gio/gdbusconnection.c:5191 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metodi ”%s” palautti tyypin ”%s” mutta odotettiin ”%s”" + +#: ../gio/gdbusconnection.c:6242 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metodi ”%s” rajapinnassa ”%s” tyyppimäärittelyllä ”%s” ei ole olemassa" + +#: ../gio/gdbusconnection.c:6361 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Alipuu on jo viety polkuun %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tyyppi on VIRHEELLINEN" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL-viesti: PATH- tai MEMBER-otsakekenttä puuttuu" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN-viesti: REPLY_SERIAL-otsakekenttä puuttuu" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR-viesti: REPLY_SERIAL- tai ERROR_NAME-otsakekenttä puuttuu" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL-viesti: PATH-, INTERFACE- tai MEMBER-otsakekenttä puuttuu" + +#: ../gio/gdbusmessage.c:914 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "SIGNAL-viesti: PATH-otsakekenttä käyttää varattua arvoa /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "SIGNAL-viesti: INTERFACE-otsakekenttä käyttää varattua arvoa org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Yritettiin lukea %lu tavu, mutta saatiin tiedostonloppumerkki EOF" +msgstr[1] "Yritettiin lukea %lu tavua, mutta saatiin tiedostonloppumerkki EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "Odotettiin eheää UTF-8-merkkijonoa, mutta löydettiin virheellisiä tavuja kohdassa %d (merkkijonon pituus on %d). Eheä UTF-8-merkkijono tähän kohtaan saakka oli ”%s”" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Odotettiin NUL-tavua merkkijonon ”%s” jälkeen, mutta löydettiin tavu %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Jäsennetty arvo ”%s” ei ole kelvollinen D-Bus-oliopolku" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Jäsennetty arvo ”%s” ei ole kelvollinen D-Bus-tyyppimäärittely" + +#: ../gio/gdbusmessage.c:1324 +#, c-format, fuzzy +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "Kohdattiin %u tavua pitkä taulukko. Pituuden yläraja on 2<<26 tavua (64 MiB)." +msgstr[1] "Kohdattiin %u tavua pitkä taulukko. Pituuden yläraja on 2<<26 tavua (64 MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Jäsennetty arvo ”%s” variantille ei ole kelvollinen D-Bus-tyyppimäärittely" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "Virhe GVariantin sarjamuodon tulkinnassa tyyppikoodilla ”%s” D-Bus-piuhamuodosta" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "Virheellinen tavujärjestysarvo. Odotettiin joko 0x6c (’l’) tai 0x42 (’B’) mutta löydettiin arvo 0x%02x" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Virheellinen yhteyskäytännön pääversio. Odotettiin 1 mutta löydettiin %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Tyyppimääritysotsake tyyppimäärityksellä ”%s” löydettiin mutta viestin runko oli tyhjä" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Jäsennetty arvo ”%s” ei ole kelvollinen D-Bus-tyyppimäärittely (rungolle)" + +#: ../gio/gdbusmessage.c:1821 +#, c-format, fuzzy +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Ei tyyppimääritysotsaketta viestissä mutta viestin runko on %u tavua" +msgstr[1] "Ei tyyppimääritysotsaketta viestissä mutta viestin runko on %u tavua" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Ei voitu tulkita viestiä sarjamuodosta: " + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Virhe GVariantin sarjallistamisessa tyyppikoodilla ”%s” D-Bus-piuhamuotoon" + +#: ../gio/gdbusmessage.c:2304 +#, c-format, fuzzy +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "Viestissä on %d tiedostokahvaa mutta otsakekenttä ilmoittaa %d tiedostokahvaa" + +#: ../gio/gdbusmessage.c:2312 +msgid "Cannot serialize message: " +msgstr "Ei voitu sarjallistaa viestiä: " + +#: ../gio/gdbusmessage.c:2356 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Viestin rungossa on tyyppimääritys ”%s” mutta siellä ei ole tyyppimääritysotsaketta" + +#: ../gio/gdbusmessage.c:2366 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "Viestin rungossa on tyyppimääritys ”%s” mutta tyyppimääritys otsakekentässä on ”%s”" + +#: ../gio/gdbusmessage.c:2382 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Viestin runko on tyhjä mutta tyyppimääritys otsakekentässä on ”(%s)”" + +#: ../gio/gdbusmessage.c:2939 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Virhepaluu runkotyypillä ”%s”" + +#: ../gio/gdbusmessage.c:2947 +msgid "Error return with empty body" +msgstr "Virhepaluu tyhjällä rungolla" + +#: ../gio/gdbusprivate.c:2065 +#, fuzzy +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Ei voitu ladata /var/lib/dbus/machine-id: " + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Virhe kutsuttaessa StartServiceByName kohteelle %s: " + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Odottamaton vastaus %d metodilta StartServiceByName(”%s”)" + +#: ../gio/gdbusproxy.c:2726 ../gio/gdbusproxy.c:2860 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "Ei voitu kutsua metodia; välittäjä on hyvin tunnetuille nimille ilman omistajaa ja välittäjä muodostettiin lipulla G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakti nimiavaruus ei ole tuettu" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Ei voi määrittää kertakäyttälukujen tiedostoa kun luodaan palvelinta" + +#: ../gio/gdbusserver.c:872 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Virhe kirjoitettaessa kertakäyttölukujen tiedostoon ”%s”: %s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Merkkijono ”%s” ei ole kelvollinen D-Bus GUID" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Ei voida kuunnella tukemattomassa liikennemuodossa ”%s”" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMENTO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "Commands:\n help Shows this information\n introspect Introspect a remote object\n monitor Monitor a remote object\n call Invoke a method on a remote object\n emit Emit a signal\n\nUse \"%s COMMAND --help\" to get help on each command.\n" +msgstr "Komennot:\n help Näytä nämä tiedot\n introspect Katsasta etäolio\n monitor Monitoroi etäoliota\n call Suorita metodi etäoliolla object\n emit Lähetä signaali\n\nKäytä ”%s KOMENTO --help” saadaksesi ohjeen kustakin komennosta.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Virhe: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Virhe jäsennettäessä introspektio-XML:ää: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Yhdistä järjestelmäväylään" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Yhdistä istuntoväylään" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Yhdistä annettuun D-Bus-osoitteeseen" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Yhteyden päätepisteen valitsimet:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Valitsimet määrittämään yhteyden päätepiste" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Yhteyden päätepistettä ei määritetty" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Useita yhteyden päätepisteitä määritetty" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Varoitus: Katsastustietojen mukaan rajapintaa ”%s” ei ole olemassa\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "Varoitus: Katsastustietojen mukaan metodia ”%s” ei ole olemassa rajapinnassa ”%s”\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Valinnainen kohde signaalille (yksikäsitteinen nimi)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Oliopolku johon lähetetään signaali" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signaalin ja rajapinnan nimi" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Lähetä signaali." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Virhe yhteydenotossa: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Virhe: oliopolkua ei määritelty\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Virhe: %s ei ole kelvollinen oliopolku\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Virhe: signaalia ei määritetty.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Virhe: %s ei ole kelvollinen rajapinnan nimi\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Virhe: %s ei ole kelvollinen jäsenen nimi\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Virhe: %s ei ole kelvollinen yksikäsitteinen väylänimi\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Virhe jäsennettäessä parametriä %d: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Virhe huuhdottaessa yhteyttä: %s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Kohdenimi jossa metodia kutsutaan" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Oliopolku jossa metodia kutsutaan" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Metodi ja rajapinnan nimi" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Aikakatkaisu sekunteina" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Kutsu metodia etäoliolla" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Virhe: Kohdetta ei määritelty\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Virhe: Oliopolkua ei määritelty\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Virhe: Metodin nimeä ei määritelty\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Virhe: Metodin nimi ”%s” on virheellinen\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Virhe jäsennettäessä parametria %d tyyppiä ”%s”: %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Kohdenimi joka katsastetaan" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Oliopolku joka katsastetaan" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Tulosta XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Katsasta lapset" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Tulosta vain ominaisuudet" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Katsasta etäolio" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Kohdenimi jota monitoroidaan" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Oliopolku jota monitoroidaan" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Monitoroi etäoliota." + +#: ../gio/gdesktopappinfo.c:575 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Nimeämätön" + +#: ../gio/gdesktopappinfo.c:988 +msgid "Desktop file didn't specify Exec field" +msgstr "Työpöytätiedosto ei määrittele Exec-kenttää" + +#: ../gio/gdesktopappinfo.c:1276 +msgid "Unable to find terminal required for application" +msgstr "Sovelluksen vaatimaa päätettä ei löydy" + +#: ../gio/gdesktopappinfo.c:1563 +#, 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:1567 +#, 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:1807 ../gio/gdesktopappinfo.c:1831 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2055 +#, 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:2171 +#, c-format +msgid "Custom definition for %s" +msgstr "Oma määrittely kohteelle %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "asema ei toteuta käynnistystä" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "asema ei toteuta pysäytystä" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-tukea ei ole saatavilla" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem-koodauksen versiota %d ei voi käsitellä" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Virheellinen määrä tunnisteita (%d) GEmblem-koodauksessa" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon-koodauksen versiota %d ei voi käsitellä" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Virheellinen määrä tunnisteita (%d) GEmblemedIcon-koodauksessa" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oletettiin GEmblen kohteelle GEmblemedIcon" + +#: ../gio/gfile.c:874 ../gio/gfile.c:1105 ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 ../gio/gfile.c:1531 ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 ../gio/gfile.c:1726 ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 ../gio/gfile.c:3312 ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 ../gio/gfile.c:3541 ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 ../gio/gfile.c:4359 ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 ../gio/gfile.c:4633 ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 ../gio/gfile.c:5315 ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 ../gio/gfile.c:7098 ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 ../gio/glocalfile.c:1070 ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "Yllä olevaa liitospistettä ei löydy" + +#: ../gio/gfile.c:2414 ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "Kansion päälle ei voi kopioida" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "Kansiota ei voi kopioida kansion päälle" + +#: ../gio/gfile.c:2483 ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "Kohdetiedosto on olemassa" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "Kansiota ei voi kopioida rekursiivisesti" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "Splice-operaatiota ei tueta" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "Virhe suoritettaessa splice-operaatiota tiedostolle: %s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "Erikoistiedostoa ei voi kopioida" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "Saatiin virheellinen symbolisen linkin arvo" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "Roskakori ei ole tuettu" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Tiedostonimi ei voi sisältää merkkiä ”%c”" + +#: ../gio/gfile.c:6067 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "taltio ei toteuta liittämistä" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "Tiedoston käsittelyyn ei ole rekisteröity mitään sovellusta" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Numeraattori on suljettu" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Tiedoston numeraattorilla on odottavia toimintoja" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +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:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Virta ei tue komentoa query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Virta ei tue siirtymistä" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Syötevirtaa ei voi kutistaa" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Virta ei tue kutistamista" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Väärä määrä tunnisteita (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Luokan nimelle %s ei ole tyyppiä" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tyyppi %s ei toteuta GIcon-määritystä" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tyyppi %s ei ole luokkatyyppi" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Virheellinen versionumero: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Annettua kuvakkeen koodauksen versiota ei voi käsitellä" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Tekstiä %s ei voitu jäsentää IP-osoitepeitteeksi" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Pistokeosoitteelle ei ole tarpeeksi tilaa" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Ei-tuettu pistokeosoite" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "Virrassa on toiminto odottamassa" + +#: ../gio/glib-compile-resources.c:144 ../gio/glib-compile-schemas.c:1449 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elementti <%s> ei ole sallittu elementin <%s> sisällä" + +#: ../gio/glib-compile-resources.c:148 ../gio/glib-compile-schemas.c:1453 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elementti <%s> ei ole sallittu päätasolla" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:259 +#, c-format, fuzzy +msgid "Failed to locate '%s' in current directory" +msgstr "Hakemistoon ”%s” siirtyminen epäonnistui (%s)" + +#: ../gio/glib-compile-resources.c:287 +#, c-format, fuzzy +msgid "Unknown processing option \"%s\"" +msgstr "Tuntematon valitsin %s" + +#: ../gio/glib-compile-resources.c:305 ../gio/glib-compile-resources.c:363 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Väliaikaistiedoston luominen epäonnistui: %s" + +#: ../gio/glib-compile-resources.c:335 +#, fuzzy +msgid "Error processing input file with xmllint" +msgstr "Virhe asetettaessa symbolista linkkiä: tiedosto ei ole symbolinen linkki" + +#: ../gio/glib-compile-resources.c:390 +msgid "Error processing input file with to-pixdata" +msgstr "" + +#: ../gio/glib-compile-resources.c:403 +#, c-format, fuzzy +msgid "Error reading file %s: %s" +msgstr "Virhe tiedoston ”%s” lukemisessa: %s" + +#: ../gio/glib-compile-resources.c:423 +#, c-format, fuzzy +msgid "Error compressing file %s" +msgstr "Virhe avattaessa tiedostoa: %s" + +#: ../gio/glib-compile-resources.c:487 ../gio/glib-compile-schemas.c:1561 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "teksti ei voi esiintyä elementin <%s> sisällä" + +#: ../gio/glib-compile-resources.c:610 +#, fuzzy +msgid "name of the output file" +msgstr "Kuvakkeen nimi" + +#: ../gio/glib-compile-resources.c:610 ../gio/glib-compile-resources.c:643 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "" + +#: ../gio/glib-compile-resources.c:611 +msgid "The directories where files are to be read from (default to current directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-schemas.c:1989 +#: ../gio/glib-compile-schemas.c:2019 +msgid "DIRECTORY" +msgstr "HAKEMISTO" + +#: ../gio/glib-compile-resources.c:612 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:616 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:617 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:646 +#, fuzzy +msgid "Compile a resource specification into a resource file.\nResource specification files have the extension .gresource.xml,\nand the resource file have the extension called .gresource." +msgstr "Käännä kaikki GSettings-skeematiedostot skeema-välimuistiin.\nSkeematiedostoilla tulee olla pääte .gschema.xml ja\nvälimuistitiedoston nimi on gschemas.compiled." + +#: ../gio/glib-compile-resources.c:662 +#, c-format, fuzzy +msgid "You should give exactly one file name\n" +msgstr "Sinun tulisi antaa täsmälleen yksi hakemistonimi\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "tyhjät nimet eivät ole sallittuja" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "virheellinen nimi ”%s”: nimien täytyy alkaa pienaakkosella" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and dash ('-') are permitted." +msgstr "virheellinen nimi ”%s”: virheellinen merkki ’%c’; vain pienaakkosia, numeroita sekä viiva (’-’) sallitaan." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "virheellinen nimi ”%s”: kaksi peräkkäistä viivaa (’--’) ei ole sallittu." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "virheellinen nimi ”%s”: viimeinen merkki ei saa olla viiva (’-’)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format, fuzzy +msgid "invalid name '%s': maximum length is 1024" +msgstr "virheellinen nimi ”%s”: pituuden yläraja on 32" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " on jo määritetty" + +#: ../gio/glib-compile-schemas.c:917 +#, fuzzy +msgid "cannot add keys to a 'list-of' schema" +msgstr "ei voi lisätä avaimia ”list-of”-skeemaan" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " on jo määritetty" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid " shadows in ; use to modify value" +msgstr " peittää skeemassa ; laita muokataksesi arvoa" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr "täsmälleen yksi ’type’ (tyyppi), ’enum’ tai ’flags’ (liput) täytyy määrittää attribuuttina kohdassa " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> ei ole (vielä) määritetty." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "virheellinen GVariant-tyyppimerkkijono ”%s”" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " annettu mutta skeema ei laajenna mitään" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ei avainta joka syrjäytettäisiin" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " on jo määritetty" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " on jo määritetty" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " laajentaa ei vielä olemassaolevaa skeemaa ”%s”" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " on luettelo ei vielä olemassaolevista skeemoista ”%s”" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Ei voi olla luettelo skeemasta polun kera" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Ei voi laajentaa skeemaa polun kera" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr " on luettelo laajentamassa skeemaa joka ei ole luettelo" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr " laajentaa skeemaa mutta ”%s” ei laajenna ”%s”" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "polku, jos annettu, täytyy aloittaa ja lopettaa kauttaviivalla" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "luettelon polun täytyy alkaa ’:/’" + +#: ../gio/glib-compile-schemas.c:1229 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> on jo määritetty" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1747 ../gio/glib-compile-schemas.c:1818 +#: ../gio/glib-compile-schemas.c:1894 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict annettu; lopetetaan.\n" + +#: ../gio/glib-compile-schemas.c:1755 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Tämä koko tiedosto on ohitettu.\n" + +#: ../gio/glib-compile-schemas.c:1814 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ohitetaan tämä tiedosto.\n" + +#: ../gio/glib-compile-schemas.c:1854 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "Avainta ”%s” skeemassa ”%s” ei ole määritetty syrjäytystiedostossa ”%s”" + +#: ../gio/glib-compile-schemas.c:1860 ../gio/glib-compile-schemas.c:1918 +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ohitetaan syrjäytys tälle avaimelle.\n" + +#: ../gio/glib-compile-schemas.c:1864 ../gio/glib-compile-schemas.c:1922 +#: ../gio/glib-compile-schemas.c:1950 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ja --strict oli määritetty; lopetetaan.\n" + +#: ../gio/glib-compile-schemas.c:1880 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s. " +msgstr "virhe jäsennettäessä avainta ”%s” skeemassa ”%s” kuten määrittetty syrjäytystiedostossa ”%s”: %s. " + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ohitetaan syrjäytys tälle avaimelle.\n" + +#: ../gio/glib-compile-schemas.c:1908 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is out of the range given in the schema" +msgstr "syrjäytys avaimelle ”%s” skeemassa ”%s” syrjäytystiedostossa ”%s” on yli skeemassa annettujen rajojen" + +#: ../gio/glib-compile-schemas.c:1936 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "syrjäytys avaimelle ”%s” skeemassa ”%s” syrjäytystiedostossa ”%s” ei ole sallittujen vaihtoehtojen listassa" + +#: ../gio/glib-compile-schemas.c:1989 +msgid "where to store the gschemas.compiled file" +msgstr "mihin tallennetaan gschemas.compiled-tiedosto" + +#: ../gio/glib-compile-schemas.c:1990 +msgid "Abort on any errors in schemas" +msgstr "Keskeytä minkä tahansa virheen kohdalla skeemoissa" + +#: ../gio/glib-compile-schemas.c:1991 +msgid "Do not write the gschema.compiled file" +msgstr "Älä kirjoita gschema.compiled-tiedostoa" + +#: ../gio/glib-compile-schemas.c:1992 +msgid "Do not enforce key name restrictions" +msgstr "Älä pakota avainnimirajoituksia" + +#: ../gio/glib-compile-schemas.c:2022 +msgid "Compile all GSettings schema files into a schema cache.\nSchema files are required to have the extension .gschema.xml,\nand the cache file is called gschemas.compiled." +msgstr "Käännä kaikki GSettings-skeematiedostot skeema-välimuistiin.\nSkeematiedostoilla tulee olla pääte .gschema.xml ja\nvälimuistitiedoston nimi on gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2038 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Sinun tulisi antaa täsmälleen yksi hakemistonimi\n" + +#: ../gio/glib-compile-schemas.c:2077 +#, c-format +msgid "No schema files found: " +msgstr "Skeema-tiedostoja ei löytynyt: " + +#: ../gio/glib-compile-schemas.c:2080 +#, c-format +msgid "doing nothing.\n" +msgstr "ei tehdä mitään.\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "removed existing output file.\n" +msgstr "poistettiin olemassaoleva tulostetiedosto.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Paikallista kansiontarkkailun oletustyyppiä ei voi selvittää" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Virheellinen tiedostonimi %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Virhe haettaessa tietoja tiedostojärjestelmästä: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "Juurikansiota ei voi nimetä uudestaan" + +#: ../gio/glocalfile.c:1136 ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "Virhe nimettäessä tiedostoa uudestaan: %s" + +#: ../gio/glocalfile.c:1145 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Tiedostoa ei voi nimetä uudestaan, tiedosto on jo olemassa" + +#: ../gio/glocalfile.c:1158 ../gio/glocalfile.c:2162 ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Virheellinen tiedostonimi" + +#: ../gio/glocalfile.c:1325 ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "Kansiota ei voi avata" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "Virhe avattaessa tiedostoa: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "Virhe poistettaessa tiedostoa: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "Virhe siirrettäessä tiedostoa roskakoriin: %s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Roskakorikansiota %s ei voi luoda: %s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "Päätasoa roskakoria varten ei löydy" + +#: ../gio/glocalfile.c:1964 ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "Roskakori kansiota ei löydy tai sitä ei voi luoda" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Roskakorin informaatiotiedostoa ei voi luoda: %s" + +#: ../gio/glocalfile.c:2047 ../gio/glocalfile.c:2052 ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Tiedosto ei voi siirtää roskakoriin: %s" + +#: ../gio/glocalfile.c:2140 ../glib/gregex.c:213 +msgid "internal error" +msgstr "sisäinen virhe" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "Virhe luotaessa kansiota: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Tiedostojärjestelmä ei tue symbolisia linkkejä" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Virhe luotaessa symbolista linkkiä: %s" + +#: ../gio/glocalfile.c:2261 ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "Virhe siirrettäessä tiedostoa: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "Kansiota ei voi siirtää kansion päälle" + +#: ../gio/glocalfile.c:2311 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Varmuuskopiotiedoston luonti epäonnistui" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "Virhe poistettaessa kohdetiedostoa: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "Siirto liitospisteiden välillä ei ole tuettu" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Ominaisuuden arvo ei voi olla NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Virheellinen ominaisuustyyppi (piti olla merkkijono)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Virheellinen laajennetun ominaisuuden nimi" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Virhe asetettaessa laajennettua ominaisuutta ”%s”: %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (virheellinen merkistökoodaus)" + +#: ../gio/glocalfileinfo.c:1527 ../gio/glocalfileoutputstream.c:843 +#, c-format, fuzzy +msgid "Error when getting information for file '%s': %s" +msgstr "Virhe avattaessa kertakäyttölukujen tiedostoa ”%s”: %s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format, fuzzy +msgid "Error when getting information for file descriptor: %s" +msgstr "Virhe tarkkailtaessa tiedostokuvaajaa: %s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla uint32)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla uint64)" + +#: ../gio/glocalfileinfo.c:1861 ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "Virheellinen ominaisuuden tyyppi (piti olla tavujono)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "Symbolisille linkeille ei voi asettaa oikeuksia" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Virhe asetettaessa oikeuksia: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "Virhe asetettaessa omistajaa: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "symbolinen linkki ei voi olla NULL" + +#: ../gio/glocalfileinfo.c:2015 ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Virhe asetettaessa symbolista linkkiä: %s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "Virhe asetettaessa symbolista linkkiä: tiedosto ei ole symbolinen linkki" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Virhe asetettaessa muokkaus- tai käyttöaikaa: %s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-konteksti ei voi olla NULL" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Virhe asetettaessa SELinux-kontekstia: %s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ei ole käytössä tässä tietokoneessa" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Ominaisuuden %s asetus ei ole tuettu" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Virhe luettaessa tiedostosta: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Virhe siirryttäessä tiedostossa: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Virhe suljettaessa tiedostoa: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Paikallisen tiedostomonitoroinnin oletustapaa ei voitu selvittää" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Virhe kirjoitettaessa tiedostoon: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Virhe poistettaessa vanhaa varmuuskopiolinkkiä: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Virhe luotaessa varmuuskopiota: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Virhe nimettäessä uudestaan väliaikaistiedostoa: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Virhe katkaistaessa tiedostoa: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Virhe avattaessa tiedostoa ”%s”: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Kohdetiedosto on kansio" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Kohdetiedosto ei ole tavallinen tiedosto" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Tiedostoa muokattiin muualta" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Virhe poistettaessa vanhaa tiedostoa: %s" + +#: ../gio/gmemoryinputstream.c:492 ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "Saatiin virheellinen GSeekType" + +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "Virheellinen siirtymispyyntö" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream-kohdetta ei voi kutistaa" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Muistin tulostevirran koko ei ole muutettavissa" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Muistin tulostevirran koon muutos epäonnistui" + +#: ../gio/gmemoryoutputstream.c:600 +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:760 +msgid "Requested seek before the beginning of the stream" +msgstr "Pyydetty kelausta virtauksen alkua edeltävään kohtaan" + +#: ../gio/gmemoryoutputstream.c:769 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount ei toteuta synkronista sisältötyypin arvausta" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Isäntänimi ”%s” sisältää merkin ”[”, mutta ei ”]”" + +#: ../gio/gnetworkmonitorbase.c:178 +#, fuzzy +msgid "Network unreachable" +msgstr "Verkkoa ei tavoitettu SOCKSv5-välityspalvelimen kautta." + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format, fuzzy +msgid "Could not create network monitor: %s" +msgstr "ei saatu etäosoitetta: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:177 +#, fuzzy +msgid "Could not get network status: " +msgstr "ei saatu etäosoitetta: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "Tulostevirta ei toteuta kirjoitusta" + +#: ../gio/goutputstream.c:378 ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "Lähdevirta on jo suljettu" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Virhe selvitettäessä osoitetta ”%s”: %s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Virhe selvitettäessä käänteisosoitetta ”%s”: %s" + +#: ../gio/gresolver.c:849 ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "Ei palvelutietuetta ”%s”" + +#: ../gio/gresolver.c:854 ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Tilapäisesti ei voida selvittää palvelua ”%s”" + +#: ../gio/gresolver.c:859 ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "Virhe selvitettäessä palvelua ”%s”" + +#: ../gio/gresource.c:294 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:679 ../gio/gresource.c:748 ../gio/gresource.c:809 +#: ../gio/gresource.c:889 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:650 +#, c-format, fuzzy +msgid "The resource at '%s' is not a directory" +msgstr "Kohdetiedosto on kansio" + +#: ../gio/gresourcefile.c:858 +#, fuzzy +msgid "Input stream doesn't implement seek" +msgstr "Syötevirta ei toteuta lukua" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "Tulosta ohje" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +#, fuzzy +msgid "[COMMAND]" +msgstr "KOMENTO" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:482 +msgid "List resources\nIf SECTION is given, only list resources in this section\nIf PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "TIEDOSTO [POLKU]" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "" + +#: ../gio/gresource-tool.c:491 +msgid "List resources with details\nIf SECTION is given, only list resources in this section\nIf PATH is given, only list matching resources\nDetails include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "TIEDOSTO POLKU" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "Unknown command %s\n\n" +msgstr "Tuntematon komento %s\n\n" + +#: ../gio/gresource-tool.c:516 +msgid "Usage:\n gresource [--section SECTION] COMMAND [ARGS...]\n\nCommands:\n help Show this information\n sections List resource sections\n list List resources\n details List resources with details\n extract Extract a resource\n\nUse 'gresource help COMMAND' to get detailed help.\n\n" +msgstr "" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "Usage:\n gresource %s%s%s %s\n\n%s\n\n" +msgstr "Käyttö:\n gsettings %s%s%s %s\n\n%s\n\n" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "Argumentit:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMENTO (valinnainen) selitettävä komento\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:550 +msgid " FILE An elf file (a binary or a shared library)\n or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:554 +#, fuzzy +msgid "[PATH]" +msgstr "SKEEMA[:POLKU]" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Ei tällaista skeemaa ”%s”\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Skeema ”%s” ei ole siirrettävä (polkua ei saa määrittää)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Skeema ”%s” on siirrettävä (polku täytyy määrittää)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Annettu tyhjä polku.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Polun täytyy alkaa kauttaviivalla (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Polun täytyy päättyä kauttaviivaan (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Polku ei saa sisältää kahta perättäistä kauttaviivaa (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ei avainta ”%s”\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Annettu arvo on yli sallittujen rajojen\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "Luettelo asennetuista (ei-siirrettävistä) skeemoista" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "Luettelo asennetuista siirrettävistä skeemoista" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "Luettelo avaimsta SKEEMAssa" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SKEEMA[:POLKU]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "Luettelo SKEEMAn lapsista" + +#: ../gio/gsettings-tool.c:560 +msgid "List keys and values, recursively\nIf no SCHEMA is given, list all keys\n" +msgstr "Luettelo avaimista ja arvoista rekursiivisesti\nJos SKEEMA ei annettu, luettele kaikki avaimet\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[SKEEMA[:POLKU]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "Hae avaimen AVAIN arvo" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SKEEMA:[POLKU] AVAIN" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "Kysy AVAIMEN sallittujen arvojen rajat" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "Aseta avaimelle AVAIN arvoksi ARVO" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SKEEMA[:POLKU] AVAIN ARVO" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "Palauta AVAIN sen oletusarvoon" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Palauta kaikki avaimet SKEEMAssa oletusarvoihin" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "Tarkista onko AVAIN kirjoitettavissa" + +#: ../gio/gsettings-tool.c:603 +msgid "Monitor KEY for changes.\nIf no KEY is specified, monitor all keys in SCHEMA.\nUse ^C to stop monitoring.\n" +msgstr "Monitoroi avaimen AVAIN muutoksia.\nJos AVAIN ei ole määrietty, monitoroi kaikkia avaimia SKEEMAssa.\nPaina ^C lopettaaksesi monitorointi.\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SKEEMA:[POLKU] [AVAIN]" + +#: ../gio/gsettings-tool.c:618 +#, fuzzy +msgid "Usage:\n gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n\nCommands:\n help Show this information\n list-schemas List installed schemas\n list-relocatable-schemas List relocatable schemas\n list-keys List keys in a schema\n list-children List children of a schema\n list-recursively List keys and values, recursively\n range Queries the range of a key\n get Get the value of a key\n set Set the value of a key\n reset Reset the value of a key\n reset-recursively Reset all values in a given schema\n writable Check if a key is writable\n monitor Watch for changes\n\nUse 'gsettings help COMMAND' to get detailed help.\n\n" +msgstr "Käyttö:\n gsettings KOMENTO [ARGUMENTIT...]\n\nKomennot:\n help Näytä tämä tieto\n list-schemas Luettele asennetut skeemat\n list-relocatable-schemas Luettele siirrettävät skeemat\n list-keys Luettele avaimet skeemassa\n list-children Luettele skeeman lapset\n list-recursively Luettele avaimet ja arvot rekursiivisesti\n range Kysy avaimen arvon rajat\n get Hae avaimen arvo\n set Aseta avaimen arvo\n reset Palauta avaimen arvo oletukseksi\n reset-recursively Palauta kaikki arvot annetussa skeemassa\n writable Tarkista onko avain kirjoitettavissa\n monitor Tarkkaile muutoksia\n\nKomenna ”gsettings help KOMENTO” saadaksesi tarkemman ohjeen.\n\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format, fuzzy +msgid "Usage:\n gsettings [--schemadir SCHEMADIR] %s %s\n\n%s\n\n" +msgstr "Käyttö:\n gsettings %s %s\n\n%s\n\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:654 +msgid " SCHEMA The name of the schema\n PATH The path, for relocatable schemas\n" +msgstr " SKEEMA Skeeman nimi\n POLKU Polku, uudelleensijoiteltaville skeemoille\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " AVAIN (Valinnainen) avain skeemassa\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " AVAIN Avain skeemassa\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " ARVO Asetettava arvo\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "Annettu tyhjä skeemanimi\n" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "Virheellinen pistoke, alustamaton" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Virheellinen pistoke, alustus epäonnistui: %s" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "Pistoke on jo suljettu" + +#: ../gio/gsocket.c:305 ../gio/gsocket.c:3520 ../gio/gsocket.c:3575 +msgid "Socket I/O timed out" +msgstr "Pistoke I/O:n aikakatkaisu" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "luodaan GSocket tiedostokahvasta: %s" + +#: ../gio/gsocket.c:506 ../gio/gsocket.c:522 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Pistoketta ei voi luoda: %s" + +#: ../gio/gsocket.c:506 +msgid "Unknown protocol was specified" +msgstr "Tuntematon yhteyskäytäntö määritetty" + +#: ../gio/gsocket.c:1713 +#, c-format +msgid "could not get local address: %s" +msgstr "ei saatu paikallista osoitetta: %s" + +#: ../gio/gsocket.c:1756 +#, c-format +msgid "could not get remote address: %s" +msgstr "ei saatu etäosoitetta: %s" + +#: ../gio/gsocket.c:1817 +#, c-format +msgid "could not listen: %s" +msgstr "ei voitu kuunnella: %s" + +#: ../gio/gsocket.c:1891 +#, c-format +msgid "Error binding to address: %s" +msgstr "Virhe sidottaessa osoitetta: %s" + +#: ../gio/gsocket.c:1944 ../gio/gsocket.c:1980 +#, c-format, fuzzy +msgid "Error joining multicast group: %s" +msgstr "Virhe käynnistettäessä ohjelmaa: %s" + +#: ../gio/gsocket.c:1945 ../gio/gsocket.c:1981 +#, c-format, fuzzy +msgid "Error leaving multicast group: %s" +msgstr "Virhe käynnistettäessä ohjelmaa: %s" + +#: ../gio/gsocket.c:1946 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2165 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Virhe hyväksyttäessä yhteyttä: %s" + +#: ../gio/gsocket.c:2286 +msgid "Connection in progress" +msgstr "Yhteydenotto meneillään" + +#: ../gio/gsocket.c:2338 ../gio/gsocket.c:4317 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ei saatu tulossa olevaa virhettä: %s" + +#: ../gio/gsocket.c:2508 +#, c-format +msgid "Error receiving data: %s" +msgstr "Virhe vastaanotettaessa dataa: %s" + +#: ../gio/gsocket.c:2686 +#, c-format +msgid "Error sending data: %s" +msgstr "Virhe lähetettäessä dataa: %s" + +#: ../gio/gsocket.c:2800 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Pistoketta ei voi sammuttaa: %s" + +#: ../gio/gsocket.c:2879 +#, c-format +msgid "Error closing socket: %s" +msgstr "Virhe suljettaessa pistoketta: %s" + +#: ../gio/gsocket.c:3513 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Odotetaan pistoke-ehtoa: %s" + +#: ../gio/gsocket.c:3791 ../gio/gsocket.c:3872 +#, c-format +msgid "Error sending message: %s" +msgstr "Virhe lähetettäessä viestiä: %s" + +#: ../gio/gsocket.c:3816 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage ei ole tuettu windows-alustalla" + +#: ../gio/gsocket.c:4096 ../gio/gsocket.c:4232 +#, c-format +msgid "Error receiving message: %s" +msgstr "Virhe vastaanotettaessa viestiä: %s" + +#: ../gio/gsocket.c:4336 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials ei ole toteutettu tälle käyttöjärjestemälle" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "" + +#: ../gio/gsocketclient.c:188 +#, c-format, fuzzy +msgid "Could not connect to %s: " +msgstr "Muunninta merkistöstä ”%s” merkistöön ”%s” ei voitu avata: %s" + +#: ../gio/gsocketclient.c:190 +#, fuzzy +msgid "Could not connect: " +msgstr "ei voitu kuunnella: %s" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Tuntematon virhe yhteydenotossa" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Yritys välittää muun kuin TCP-yhteyden yli ei ole tuettu." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Välitysyhteyskäytäntö ”%s” ei ole tuettu." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Kuuntelija on jo suljettu" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Lisätty pistoke on suljettu" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ei tue IPv6-osoitetta ”%s”" + +#: ../gio/gsocks4aproxy.c:139 +#, fuzzy +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Liian pitkä käyttäjänimi tai salasana SOCKSv5-yhteyskäytäntöön (enintään %i)." + +#: ../gio/gsocks4aproxy.c:156 +#, c-format, fuzzy +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Tietokonenimi ”%s” on liian pitkä SOCKSv5-yhteyskäytäntöön (enintään %i tavua)" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Palvelin ei ole SOCKSv4-välityspalvelin." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Yhteys SOCKSv4-palvelimen läpi hylättiin" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Palvelin ei ole SOCKSv5-välityspalvelin" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5-välityspalvelin vaatii todennuksen." + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "SOCKSv5-välityspalvelin vaatii todennustapaa, jota GLib ei tue." + +#: ../gio/gsocks5proxy.c:208 +#, fuzzy +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Liian pitkä käyttäjänimi tai salasana SOCKSv5-yhteyskäytäntöön (enintään %i)." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5-todennus epäonnistui väärän käyttäjätunnuksen tai salasanan vuoksi." + +#: ../gio/gsocks5proxy.c:288 +#, c-format, fuzzy +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Tietokonenimi ”%s” on liian pitkä SOCKSv5-yhteyskäytäntöön (enintään %i tavua)" + +#: ../gio/gsocks5proxy.c:350 +#, fuzzy +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5-välityspalvelin käyttää tuntematonta osoitetyyppiä." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Sisäinen SOCKSv5-välityspalvelinvirhe." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-yhteys ei ole sallittu sääntöjoukossa." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Laitetta ei tavoitettu SOCKSv5-palvelimen kautta." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Verkkoa ei tavoitettu SOCKSv5-välityspalvelimen kautta." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Yhteyden muodostus SOCKSv5-välityspalvelimen kautta evätty." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-välityspalvelin ei tue ”connect”-komentoa." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-välityspalvelin ei tue annettua osoitetyyppiä." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Tuntematon SOCKSv5-välityspalvelinvirhe." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemeIcon-koodauksen versiota %d ei voi käsitellä" + +#: ../gio/gtlscertificate.c:249 +#, fuzzy +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-koodattua yksityistä avainta ei voitu jäsentää" + +#: ../gio/gtlscertificate.c:254 +#, fuzzy +msgid "No PEM-encoded private key found" +msgstr "PEM-koodattua varmennetta ei löytynyt" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-koodattua yksityistä avainta ei voitu jäsentää" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "PEM-koodattua varmennetta ei löytynyt" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-koodattu varmennetta ei voitu jäsentää" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Syötetty salasana on väärä." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:580 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Odotettiin yhtä ohjausviestiä, saatiin %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:590 +msgid "Unexpected type of ancillary data" +msgstr "Odottamaton lisädatan tyyppi" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Odotettiin yhtä tiedostokahvaa, mutta saatiin %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Vastaanotettiin kelvoton tiedostokahva" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Virhe lähetettäessä valtuutusta: " + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Virhe tarkistettaessa onko SO_PASSCRED käytössä pistokkeelle: %s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "Unexpected option length while checking if SO_PASSCRED is enabled for socket. Expected %d bytes, got %d" +msgstr "Odottamaton valitsinpituus tarkistettaessa onko SO_PASSCRED käytössä pistokkeelle. Odotettiin %d tavua, saatiin %d" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Virhe otettaessa käyttöön SO_PASSCRED-lippua: %s" + +#: ../gio/gunixconnection.c:568 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "Odotettiin saada lukea yksi tavu vastaanottovaltuuksia mutta luettiin nolla tavua" + +#: ../gio/gunixconnection.c:604 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Ei odotetu ohjausviestiä, mutta saatiin %d" + +#: ../gio/gunixconnection.c:630 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Virhe kytkettäessä pois SO_PASSCRED-lippua: %s" + +#: ../gio/gunixinputstream.c:392 ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:492 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Tiedostokahvasta lukeminen epäonnistui: %s" + +#: ../gio/gunixinputstream.c:447 ../gio/gunixinputstream.c:642 +#: ../gio/gunixoutputstream.c:433 ../gio/gunixoutputstream.c:597 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Tiedostokahvan sulkeminen epäonnistui: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "Tiedostojärjestelmän juuri" + +#: ../gio/gunixoutputstream.c:378 ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:478 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Tiedostokahvaan kirjoittaminen epäonnistui: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "taltio ei toteuta aseman avausta (eject tai eject_with_operation)" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ohjelmaa ei löydy" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Virhe käynnistettäessä ohjelmaa: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI:ja ei tueta" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "assosiaation muutokset eivät ole tuettu win32-alustalla" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Assosiaation luonti ei ole tuettu win32-alustalla" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Virhe luettaessa kahvasta: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Virhe suljettaessa kahvaa: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Virhe kirjoitettaessa kahvaan: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Muisti loppui" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Sisäinen virhe: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Tarvitaan lisää syötettä" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Virheellinen pakattu data" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Odottamaton ominaisuus ”%s” elementille ”%s”" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Ominaisuutta ”%s” elementille ”%s” ei löydy" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Odottamaton merkintä ”%s”, odotettiin merkintää ”%s”" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Odottamaton merkintä ”%s” kohdassa ”%s”" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "Kelvollista kirjanmerkkitiedostoa ei löytynyt datahakemistoista" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI:lle ”%s” on jo olemassa kirjanmerkki" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI:lle ”%s” ei löydy kirjanmerkkiä" + +#: ../glib/gbookmarkfile.c:2385 +#, 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:2470 +#, 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:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI:n ”%s” kirjanmerkissä ei ole asetettu ryhmiä" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, 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:3424 +#, 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:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Osittainen tavusarja syötteen lopussa" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Koodausmerkkijonoa ”%s” ei voi muuntaa merkistöön ”%s”" + +#: ../glib/gconvert.c:1874 +#, 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:1884 +#, 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:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI ”%s” on virheellinen" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI:n ”%s” isäntänimi on virheellinen" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI ”%s” sisältää virheellisesti suojattuja merkkejä" + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Polku ”%s” ei ole absoluuttinen" + +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "Virheellinen isäntänimi" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ap." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ip." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e. %Bta %Y %H.%M.%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%-d.%-m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H.%M.%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +#, fuzzy +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H.%M.%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "tammikuu" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "helmikuu" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "maaliskuu" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "huhtikuu" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "toukokuu" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "kesäkuu" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "heinäkuu" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "elokuu" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "syyskuu" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "lokakuu" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "marraskuu" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "joulukuu" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "tam" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "hel" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "maa" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "huh" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "tou" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "kes" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "hei" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "elo" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "syy" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "lok" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "mar" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "jou" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "maanantai" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "tiistai" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "keskiviikko" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "torstai" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "perjantai" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "lauantai" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "sunnuntai" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ma" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ti" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ke" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "to" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "pe" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "la" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "su" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Virhe hakemiston ”%s” avaamisessa: %s" + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, 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:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Virhe tiedoston ”%s” lukemisessa: %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tiedosto ”%s” on liian suuri" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Tiedoston ”%s” lukeminen epäonnistui: %s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: %s" + +#: ../glib/gfileutils.c:855 +#, 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:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: fdopen() epäonnistui: %s" + +#: ../glib/gfileutils.c:997 +#, 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:1039 ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tiedoston ”%s” luominen epäonnistui: %s" + +#: ../glib/gfileutils.c:1053 +#, 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:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fwrite() epäonnistui: %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fflush() epäonnistui: %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Tiedoston ”%s” kirjoittaminen epäonnistui: fsync() epäonnistui: %s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Tiedoston ”%s” sulkeminen epäonnistui: fclose() epäonnistui: %s" + +#: ../glib/gfileutils.c:1287 +#, 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:1547 +#, 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:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Malli ”%s” ei sisällä merkkijonoa XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Symbolisen linkin ”%s” lukeminen epäonnistui: %s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "Symbolisia linkkejä ei tueta" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Jäljelle jäänyt muuntamaton data lukupuskurissa" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanava päättyy osittaiseen merkkiin" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "Kelvollista avaintiedostoa ei löytynyt haetuista kansioista" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "Ei tavallinen tiedosto" + +#: ../glib/gkeyfile.c:1162 +#, 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:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "Virheellinen ryhmän nimi: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "Avaintiedosto ei ala ryhmällä" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "Virheellinen avaimen nimi: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Avaintiedosto sisältää ei-tuetun koodauksen ”%s”" + +#: ../glib/gkeyfile.c:1541 ../glib/gkeyfile.c:1703 ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 ../glib/gkeyfile.c:3273 ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 ../glib/gkeyfile.c:3778 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Avaintiedostossa ei ole ryhmää ”%s”" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Avaintiedostossa ei ole avainta ”%s”" + +#: ../glib/gkeyfile.c:1822 ../glib/gkeyfile.c:1938 +#, 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:1842 ../glib/gkeyfile.c:1958 ../glib/gkeyfile.c:2327 +#, 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:2544 ../glib/gkeyfile.c:2910 +#, c-format, fuzzy +msgid "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." +msgstr "Avaintiedosto sisältää avaimen ”%s”, jolla on arvo, jota ei voida tulkita, ryhmässä ”%s”." + +#: ../glib/gkeyfile.c:2622 ../glib/gkeyfile.c:2698 +#, c-format, fuzzy +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Avaintiedosto sisältää avaimen ”%s”, jolla on arvo, jota ei voida tulkita, ryhmässä ”%s”." + +#: ../glib/gkeyfile.c:3096 ../glib/gkeyfile.c:3288 ../glib/gkeyfile.c:3857 +#, 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:4089 +msgid "Key file contains escape character at end of line" +msgstr "Avaintiedosto sisältää escape-jonon rivin lopussa" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Avaintiedostossa on virheellinen escape-jono ”%s”" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Arvoa ”%s” ei voida tulkita numeroksi." + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Kokonaisluku ”%s” on sallitun alueen ulkopuolella" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Arvoa ”%s” ei voida tulkita liukuluvuksi." + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Arvoa ”%s” ei voida tulkita totuusarvoksi." + +#: ../glib/gmappedfile.c:128 +#, c-format, fuzzy +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Tiedoston ”%s” ominaisuuksien lukeminen epäonnistui: fstat() epäonnistui: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format, fuzzy +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Tiedoston ”%s” mappaaminen epäonnistui: mmap() epäonnistui: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Tiedoston ”%s” avaaminen epäonnistui: open() epäonnistui: %s" + +#: ../glib/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Virhe rivillä %d merkissä %d: " + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, 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:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "”%s” ei ole kelvollinen nimi" + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "”%s” ei ole kelvollinen nimi: ”%c” " + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "Virhe rivillä %d: %s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Merkkiviite ”%-.*s” ei ole sallitun merkin koodaus" + +#: ../glib/gmarkup.c:715 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Havaittu tyhjä entiteetti ”&;”; kelvolliset ovat: & " < > '" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entiteetin nimi ”%-.*s” on tuntematon" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "Asiakirjan on alettava elementillä (esim. )" + +#: ../glib/gmarkup.c:1116 +#, 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:1184 +#, 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:1268 +#, 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:1309 +#, 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:1353 +#, 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:1486 +#, 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:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Elementti ”%s” on suljettu, ei avoimia elementtejä" + +#: ../glib/gmarkup.c:1542 +#, 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:1710 +msgid "Document was empty or contained only whitespace" +msgstr "Asiakirja oli tyhjä tai sisälsi vain tyhjiä merkkejä" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Asiakirja loppui odottamattomasti heti avoimen kulmasulkeen ”<” jälkeen" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, 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:1740 +#, 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:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "Asiakirja loppui odottamattomasti elementin nimen kohdalla" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Asiakirja loppui odottamattomasti ominaisuuden nimen kohdalla" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Asiakirja loppui odottamattomasti elementin avauslipun kohdalla" + +#: ../glib/gmarkup.c:1763 +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:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Asiakirja loppui odottamattomasti ominaisuuden arvon kohdalla" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Asiakirja loppui odottamattomasti elementin ”%s” sulkulipun kohdalla" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Asiakirja loppui odottamattomasti kommentin tai käsittelykomennon kohdalla" + +#: ../glib/goption.c:766 +msgid "Usage:" +msgstr "Käyttö:" + +#: ../glib/goption.c:766 +msgid "[OPTION...]" +msgstr "[VALITSIN…]" + +#: ../glib/goption.c:872 +msgid "Help Options:" +msgstr "Ohjevalitsimet:" + +#: ../glib/goption.c:873 +msgid "Show help options" +msgstr "Näytä ohjevalitsimet" + +#: ../glib/goption.c:879 +msgid "Show all help options" +msgstr "Näytä kaikki ohjevalitsimet" + +#: ../glib/goption.c:941 +msgid "Application Options:" +msgstr "Sovelluksen valitsimet:" + +#: ../glib/goption.c:1003 ../glib/goption.c:1073 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kokonaislukua ”%s” ei voida tulkita kohteelle %s" + +#: ../glib/goption.c:1013 ../glib/goption.c:1081 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Kokonaisluku ”%s” kohteelle %s on ylittää sallitun alueen" + +#: ../glib/goption.c:1038 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kokonaislukua ”%s” ei voida tulkita kohteelle %s" + +#: ../glib/goption.c:1046 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double-arvo ”%s” kohteelle %s ylittää sallitun alueen" + +#: ../glib/goption.c:1309 ../glib/goption.c:1388 +#, c-format +msgid "Error parsing option %s" +msgstr "Virhe käsiteltäessä valitsinta %s" + +#: ../glib/goption.c:1419 ../glib/goption.c:1532 +#, c-format +msgid "Missing argument for %s" +msgstr "Puuttuva argumentti kohteelle %s" + +#: ../glib/goption.c:1985 +#, c-format +msgid "Unknown option %s" +msgstr "Tuntematon valitsin %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "vioittunut kohde" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "sisäinen virhe tai vioittunut kohde" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "muisti loppui" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "taakseviittausten raja saavutettu" + +#: ../glib/gregex.c:211 ../glib/gregex.c:219 +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:221 +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:230 +msgid "recursion limit reached" +msgstr "rekursion enimmäissyvyys saavutettiin" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "työtilan raja tyhjille alamerkkijonoille saavutettiin" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "virheellinen yhdistelmä rivinvaihtolippuja" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "virheellinen siirros" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "lyhyt utf8" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "tuntematon virhe" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ mallin lopussa" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "\\c mallin lopussa" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows " +msgstr "Tuntematon merkki \\:n jälkeen" + +#: ../glib/gregex.c:275 +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:278 +msgid "numbers out of order in {} quantifier" +msgstr "numerot epäjärjestyksessä {}-määreessä" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "numerot liian suuria {}-määreessä" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "merkkiluokasta puuttuu päättävä ]" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "virheellinen escape-jono merkkiluokassa" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "alue epäjärjestyksessä merkkijoukolle" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "ei mitään toistettavaa" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "tuntematon merkki (? jälkeen" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "tuntematon merkki (?< jälkeen" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "tuntematon merkki (?P jälkeen" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX:in nimetyt luokat on tuettu vain luokan sisällä" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "päättävä ) puuttuu" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R tai (?[+-]numeroita täytyy seurata )" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "viittaus olemattomaan alitäsmäykseen" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "puuttuva ) kommentin jälkeen" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "säännöllinen lauseke on liian suuri" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "muistia ei voitu varata" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-tyyppinen assert-makro ei ole kiinteäpituinen" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "virheellinen numero tai nimi (?( jälkeen" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "ehdollisessa ryhmässä on enemmän kuin kaksi haaraa" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "assert-makrotoiminto odotettu merkkien (?( jälkeen" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "tuntematon POSIX-luokan nimi" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-vertailuelementtejä ei tueta" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "Merkin arvo sekvenssissä \\x{…} on liian suuri" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "virheellinen ehto (?(0)" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ei ole sallittu lookbehind-tyyppisissä assert-makroissa" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "rekursiivinen kutsu voisi olla päättymätön" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "alimallin nimestä puuttuu päätösmerkki" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "kahdella nimetyllä alimallilla on sama nimi" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "väärin muotoiltu \\P- tai \\p-sekvenssi" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "tuntematon ominaisuuden nimi \\P- tai \\p-sekvenssin jälkeen" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alimallin nimi on liian pitkä (enintään 32 merkkiä)" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "liian monta nimettyä alimallia (enintään 10000)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "oktaaliarvo on suurempi kuin \\377" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-ryhmä sisältää useampia kuin yhden haaran" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "DEFINE-ryhmän toisto ei ole sallittu" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "epäyhtenäisiä NEWLINE-valitsimia" + +#: ../glib/gregex.c:396 +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:401 +msgid "unexpected repeat" +msgstr "odottamaton toisto" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "koodin ylivuoto" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "käännöksen työalueen koko loppui kesken" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "aiemmin tarkistettua ja viitattua alimallia ei löydy" + +#: ../glib/gregex.c:631 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Virhe täsmätessä säännöllistä lauseketta %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-kirjasto on käännetty ilman UTF8-tukea" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-kirjasto on käännetty ilman UTF8-ominaisuuksien tukea" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Virhe optimoitaessa säännöllistä lauseketta %s: %s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "odotettiin heksadesimaalista numeroa tai merkkiä ”}”" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "odotettiin heksadesimaalista numeroa" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "merkki '<' puuttuu symbolisesta viitteestä" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "päättämätön symbolinen viite" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "nollan mittainen symbolinen viite" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "odotettiin numeroa" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "virheellinen symbolinen viite" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "ylimääräinen päättävä '\\'" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "tuntematon escape-jono" + +#: ../glib/gregex.c:2359 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Lainattu teksti ei ala lainausmerkillä" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Pariton lainausmerkki komentorivillä tai muussa kuorisuojatussa tekstissä" + +#: ../glib/gshell.c:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksti oli tyhjä (tai sisälsi vain tyhjiä merkkejä)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Datan lukeminen lapsiprosessilta epäonnistui (%s)" + +#: ../glib/gspawn.c:348 +#, 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:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Odottamaton virhe funktiossa waitpid() (%s)" + +#: ../glib/gspawn.c:1174 ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lukeminen lapsiprosessin putkesta epäonnistui (%s)" + +#: ../glib/gspawn.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Haarauttaminen epäonnistui (%s)" + +#: ../glib/gspawn.c:1387 ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Hakemistoon ”%s” siirtyminen epäonnistui (%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Lapsiprosessin ”%s” käynnistäminen epäonnistui (%s)" + +#: ../glib/gspawn.c:1407 +#, 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:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Lapsiprosessin haarauttaminen epäonnistui (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Tuntematon virhe käynnistettäessä lapsiprosessia ”%s”" + +#: ../glib/gspawn.c:1448 +#, 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/gspawn.c:1521 ../glib/gspawn-win32.c:299 +#, 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:282 +msgid "Failed to read data from child process" +msgstr "Datan lukeminen lapsiprosessilta epäonnistui" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Lapsiprosessin käynnistys epäonnistui (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Virheellinen ohjelman nimi: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Virheellinen merkkijono argumenttivektorin kohdassa %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Virheellinen merkkijono ympäristössä: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Virhe työhakemisto: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Apuohjelman suoritus epäonnistui (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Merkki on sallitun UTF-8-välin ulkopuolella" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Virheellinen sarja muunnettavassa syötteessä" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Merkki on sallitun UTF-16-välin ulkopuolella" + +#: ../glib/gutils.c:2166 ../glib/gutils.c:2193 ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u tavu" +msgstr[1] "%u tavua" + +#: ../glib/gutils.c:2172 +#, c-format, fuzzy +msgid "%.1f KiB" +msgstr "%.1f kt" + +#: ../glib/gutils.c:2174 +#, c-format, fuzzy +msgid "%.1f MiB" +msgstr "%.1f Mt" + +#: ../glib/gutils.c:2177 +#, c-format, fuzzy +msgid "%.1f GiB" +msgstr "%.1f Gt" + +#: ../glib/gutils.c:2180 +#, c-format, fuzzy +msgid "%.1f TiB" +msgstr "%.1f Tt" + +#: ../glib/gutils.c:2183 +#, c-format, fuzzy +msgid "%.1f PiB" +msgstr "%.1f Pt" + +#: ../glib/gutils.c:2186 +#, c-format, fuzzy +msgid "%.1f EiB" +msgstr "%.1f Et" + +#: ../glib/gutils.c:2199 +#, c-format, fuzzy +msgid "%.1f kB" +msgstr "%.1f kt" + +#: ../glib/gutils.c:2202 ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mt" + +#: ../glib/gutils.c:2205 ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Gt" + +#: ../glib/gutils.c:2207 ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%.1f Tt" + +#: ../glib/gutils.c:2210 ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%.1f Pt" + +#: ../glib/gutils.c:2213 ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%.1f Et" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format, fuzzy +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u tavu" +msgstr[1] "%u tavua" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%.1f kt" + diff --git a/po/fr.po b/po/fr.po new file mode 100644 index 0000000..cd3c64f --- /dev/null +++ b/po/fr.po @@ -0,0 +1,4523 @@ +# French translation of glib. +# Copyright (C) 2001-2012 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-2011. +# Bruno Brouard , 2010-2012. +# Gérard Baylard , 2010. +# Alexandre Franke , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 07:23+0000\n" +"PO-Revision-Date: 2012-09-14 09:44+0200\n" +"Last-Translator: Alexandre Franke \n" +"Language-Team: GNOME French Team \n" +"Language: fr\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "La valeur de comptage fournie à %s est trop grande" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Le positionnement n'est pas pris en charge sur le flux de base" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Impossible de tronquer GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Le flux est déjà fermé" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "La troncature n'est pas prise en charge sur le flux de base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "L'opération a été annulée" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Objet non valide, non initialisé" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Séquence multi-octet incomplète en entrée" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Espace insuffisant dans la destination" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Séquence d'octets incorrecte en entrée du convertisseur" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erreur lors de la conversion : %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Initialisation annulable non prise en charge" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Impossible d'ouvrir le convertisseur de « %s » vers « %s »" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "Type %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Type inconnu" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "Type de fichier %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials n'est pas implémenté sur ce système d'exploitation" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Il n'y a pas de prise en charge de GCredentials pour votre plate-forme" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Fin précoce de flux inattendue" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Clé « %s » non prise en charge dans l'élément d'adresse « %s »" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"L'adresse « %s » n'est pas valide (nécessite exactement une des clés de " +"« path », « tmpdir » ou « abstract »)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Combinaison clé/valeur sans signification dans l'élément d'adresse « %s »" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Erreur dans l'adresse « %s » — l'attribut du port est mal formé" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Erreur dans l'adresse « %s » — l'attribut de la famille est mal formé" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "" +"L'élément d'adresse « %s » ne comporte pas de caractère deux-points (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Le couple clé/valeur %d, « %s », dans l'élément d'adresse « %s » ne comporte " +"pas de signe égal" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Erreur lors du décodage de la clé ou de la valeur dans le couple clé/valeur " +"%d, « %s », dans l'élément d'adresse « %s »" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Erreur dans l'adresse « %s » — le transport Unix requiert que soit " +"exactement définie une des clés « path » ou « abstract »" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Erreur dans l'adresse « %s » — l'attribut de l'hôte est manquant ou mal formé" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Erreur dans l'adresse « %s » — l'attribut du port est manquant ou mal formé" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Erreur dans l'adresse « %s » — l'attribut du fichier à dénomination unique " +"est manquant ou mal formé" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Erreur de lancement automatique :" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transport « %s » inconnu ou non pris en charge pour l'adresse « %s »" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "" +"Erreur lors de l'ouverture du fichier à dénomination unique « %s » : %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Erreur de lecture du fichier à dénomination unique « %s » : %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Erreur de lecture du fichier à dénomination unique « %s », 16 octets " +"attendus, %d reçus" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Erreur d'écriture du contenu du fichier à numérotation unique « %s » sur le " +"flux :" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "L'adresse indiquée est vide" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" +"Impossible de générer dynamiquement un bus messages quand le drapeau setuid " +"est mis" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Impossible de générer dynamiquement un bus messages sans identifiant " +"machine : " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Erreur lors de la génération de la ligne de commande « %s » : " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(saisissez n'importe quel caractère pour fermer cette fenêtre)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"La session dbus n'est pas lancée et autolaunch (le lancement automatique) a " +"échoué" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Impossible de déterminer l'adresse du bus de session (non pris en charge " +"pour ce système d'exploitation)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Impossible de déterminer l'adresse du bus à partir de la variable " +"d'environnement DBUS_STARTER_BUS_TYPE — valeur inconnue « %s »" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Impossible de déterminer l'adresse du bus étant donné que la variable " +"d'environnement DBUS_STARTER_BUS_TYPE n'est pas définie" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Type de bus %d inconnu" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Manque de contenu imprévu lors de la tentative de lecture d'une ligne" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Manque de contenu imprévu lors de la tentative de lecture (sécurisée) d'une " +"ligne" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Tous les mécanismes d'authentification disponibles ont été épuisés (tentés : " +"%s) (disponibles : %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Annulé via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "" +"Erreur lors de la récupération d'information sur le répertoire « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Les droits d'accès au répertoire « %s » sont mal formés. Mode 0700 attendu, " +"0%o obtenu" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Erreur à la création du répertoire « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Erreur lors de l'ouverture du trousseau de clés « %s » en lecture : " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"La ligne %d du trousseau de clés de « %s » avec le contenu « %s » est mal " +"formée" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Le premier jeton de la ligne %d du trousseau de clés de « %s » avec le " +"contenu « %s » est mal formé" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Le deuxième jeton de la ligne %d du trousseau de clés de « %s » avec le " +"contenu « %s » est mal formé" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"Impossible de trouver un cookie avec l'identifiant %d dans le trousseau de " +"clés de « %s »" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Erreur lors de la destruction de l'ancien fichier verrou « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Erreur lors de la création du fichier verrou « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Erreur lors de la fermeture du fichier verrou (non lié) « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "" +"Erreur lors de la suppression du lien avec le fichier verrou « %s » : %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Erreur lors de l'ouverture du trousseau de clés « %s » en écriture : " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(en outre, le relèvement du verrou pour « %s » a aussi échoué : %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "La connexion est fermée" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Le délai d'attente est dépassé" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Marqueurs non pris en charge rencontrés lors de la construction d'une " +"connexion côté client" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Pas d'interface « org.freedesktop.DBus.Properties » pour l'objet à " +"l'emplacement %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Erreur lors de la définition de la propriété « %s » : type attendu « %s », " +"« %s » obtenu" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "La propriété « %s » n'existe pas" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "La propriété « %s » ne peut pas être lue" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "La propriété « %s » ne peut pas être écrite" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "L'interface « %s » n'existe pas" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Interface non reconnue" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "L'interface « %s » n'existe pas pour l'objet à l'emplacement %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "La méthode « %s » n'existe pas" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Le type du message, « %s », ne correspond pas au type attendu « %s »" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Un objet est déjà exporté pour l'interface « %s » en « %s »" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "La méthode « %s » a renvoyé le type « %s », mais « %s » était attendu" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" +"La méthode « %s » sur l'interface « %s » avec la signature « %s » n'existe " +"pas" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Une sous-arborescence est déjà exportée pour « %s »" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "le type est « INVALID »" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Message de METHOD_CALL : champ d'en-tête PATH ou MEMBER manquant" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Message de METHOD_RETURN : champ d'en-tête REPLY_SERIAL manquant" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Message d'ERREUR : champ d'en-tête REPLY_SERIAL ou ERROR_NAME manquant" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Message de SIGNAL : champ d'en-tête PATH, INTERFACE ou MEMBER manquant" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Message de SIGNAL : le champ d'en-tête PATH utilise la valeur réservée /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Message de SIGNAL : le champ d'en-tête INTERFACE utilise la valeur réservée " +"org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Lecture de %lu octet demandée, mais fin de fichier atteinte" +msgstr[1] "Lecture de %lu octets demandée, mais fin de fichier atteinte" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Une chaîne UTF-8 valide est attendue mais des octets non valides sont " +"rencontrés à la position %d (longueur de la chaîne : %d octets). La chaîne " +"UTF-8 valide jusqu'à cet endroit est « %s »" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"Octet 00 (NUL) attendu à la fin de la chaîne « %s » mais un octet %d a été " +"trouvé" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" +"La valeur analysée « %s » n'est pas un chemin vers un objet D-Bus valide" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "La valeur analysée « %s » n'est pas une signature D-Bus valide" + +# 2<<26 donne 128 Mo, 2^26 donne 64 Mo, 1<<26 donne 64 Mo +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Un tableau de %u octet de long a été trouvé. La longueur maximale est de " +"2<<26 octets (64 Mo)." +msgstr[1] "" +"Un tableau de %u octets de long a été trouvé. La longueur maximale est de " +"2<<26 octets (64 Mo)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"La valeur « %s » analysée en tant que variant n'est pas une signature valide " +"de D-Bus" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Erreur en désérialisant le GVariant en chaîne de type « %s » à partir du " +"format de transmission D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valeur de boutisme non valide. 0x6c (« l ») ou 0x42 (« B ») attendus, mais 0x" +"%02x trouvé" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Version majeure du protocole non valide. 1 attendu, %d trouvé" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"En-tête de signature trouvé avec la signature « %s », mais le corps du " +"message est vide" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"La valeur analysée « %s » n'est pas une signature valide de D-Bus (pour le " +"corps)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Pas de signature d'en-tête dans le message, mais le corps du message est de " +"%u octet" +msgstr[1] "" +"Pas de signature d'en-tête dans le message, mais le corps du message est de " +"%u octets" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Impossible de désérialiser le message : " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Erreur en sérialisant le GVariant en chaîne de type « %s » dans le format de " +"transmission D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Le message comporte %d descripteurs de fichiers alors que le champ d'en-tête " +"indique %d descripteurs de fichiers" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Impossible de sérialiser le message : " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Le corps du message a la signature « %s », mais il n'y a pas d'en-tête de " +"signature" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Le corps du message a une signature de type « %s », mais celle dans le champ " +"d'en-tête est « %s »" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Le corps du message est vide mais sa signature dans le champ d'en-tête est " +"« (%s) »" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Retour d'erreur avec un corps de type « %s »" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Retour d'erreur avec un corps vide" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Impossible d'obtenir le profil matériel : %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"Chargement de /var/lib/dbus/machine-id ou /etc/machine-id impossible : " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Erreur lors de l'appel de StartServiceByName pour %s : " + +# Guillemets anglais laissés volontairement +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Réponse %d inattendue de la méthode StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Impossible d'appeler la méthode ; le serveur est mandataire d'un nom connu " +"sans propriétaire alors que le proxy a été construit avec le marqueur " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "L'espace de noms abstrait n'est pas pris en charge" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"Impossible de définir un fichier à dénomination unique lors de la création " +"d'un serveur" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" +"Erreur lors de l'écriture du fichier à dénomination unique à « %s » : %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La chaîne « %s » n'est pas un GUID valide de D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Impossible d'écouter sur le transport « %s » non pris en charge" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMANDE" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Commandes :\n" +" help Affiche la présente information\n" +" introspect Inspecte la constitution d'un objet distant\n" +" monitor Surveille un objet distant\n" +" call Appelle une méthode sur un objet distant\n" +" emit Émet un signal\n" +"\n" +"Utiliser « %s COMMANDE --help » pour obtenir une aide sur chaque commande.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Erreur : %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Erreur lors de l'analyse du XML d'introspection : %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Connexion au bus système" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Connexion au bus de session" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Connexion à l'adresse D-Bus donnée" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Options de connexion au point terminal :" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Options définissant la connexion au point terminal" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Aucun point terminal de connexion défini" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Plusieurs points terminaux de connexion définis" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Avertissement : selon les données de l'examen interne, l'interface « %s » " +"n'existe pas\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Avertissement : selon les données de l'examen interne, la méthode « %s » " +"n'existe pas sur l'interface « %s »\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Destination facultative pour le signal (nom unique)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Chemin de l'objet sur lequel émettre le signal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Noms de signal et d'interface" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Émet un signal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Erreur de connexion : %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Erreur : le chemin pour l'objet n'est pas précisé.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Erreur : « %s » n'est pas un chemin d'objet valide\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Erreur : le signal n'est pas précisé.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Erreur : le signal doit être le nom complètement qualifié.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Erreur : %s n'est pas un nom d'interface valide\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Erreur : %s n'est pas un nom de membre valide\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Erreur : %s n'est pas un nom unique de bus valide.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Erreur lors de l'analyse du paramètre %d : %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Erreur de purge de la connexion : %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nom de la destination sur laquelle appeler une méthode" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Chemin de l'objet sur lequel appeler une méthode" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Noms de méthode et d'interface" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Délai d'attente en secondes" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Appeler une méthode sur un objet distant." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Erreur : la destination n'est pas précisée\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Erreur : le chemin pour l'objet n'est pas précisé\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Erreur : le nom de la méthode n'est pas défini\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Erreur : le nom de méthode « %s » n'est pas valide\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Erreur d'analyse du paramètre %d de type « %s » : %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nom de la destination à examiner en interne" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Chemin de l'objet à examiner en interne" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Imprimer le XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Examiner en interne les enfants" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "N'afficher que les propriétés" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Examiner en interne un objet distant." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nom de la destination à surveiller" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Chemin de l'objet à surveiller" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Surveiller un objet distant." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sans nom" + +# Un fichier Desktop n'est pas forcément sur le bureau... +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Le fichier .desktop n'a pas précisé son champ Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Impossible de trouver le terminal requis par l'application" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Impossible de créer le dossier de configuration utilisateur d'application " +"%s : %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" +"Impossible de créer le dossier de configuration utilisateur MIME %s : %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Les informations de l'application ne comportent pas d'identifiant" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Impossible de créer le fichier .desktop utilisateur %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Définition personnalisée pour %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"le lecteur n'implémente pas l'éjection combinée ou non (« eject » ou " +"« eject_with_operation »)" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "le lecteur n'implémente pas la scrutation du média (« polling »)" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "le lecteur n'implémente pas le démarrage (« start »)" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "le lecteur n'implémente pas l'arrêt (« stop »)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "La prise en charge TLS n'est pas disponible" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Nombre de jetons incorrect (%d) dans le codage GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, 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:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nombre de jetons incorrect (%d) dans le codage GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Un GEmblem est attendu pour le GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Le point de montage conteneur n'existe pas" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Impossible d'écraser un répertoire" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Impossible d'écraser un répertoire par un autre répertoire" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Le fichier cible existe" + +#: ../gio/gfile.c:2547 +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:2811 +msgid "Splice not supported" +msgstr "L'opération « splice » n'est pas prise en charge" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erreur lors de l'opération de « splicing » sur le fichier : %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Impossible de copier le fichier spécial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Valeur de lien symbolique donnée non valide" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "La corbeille n'est pas prise en charge" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Les noms de fichiers ne peuvent comporter de « %c »" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "le volume n'implémente pas le montage" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Aucune application n'est enregistrée pour gérer ce fichier" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "L'énumérateur est fermé" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "L'énumérateur de fichiers est en cours d'opération" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +msgid "File enumerator is already closed" +msgstr "L'énumérateur de fichiers 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 de GFileIcon" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Données d'entrée incorrectes pour GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Le flux ne prend pas en charge query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Le positionnement n'est pas pris en charge sur le flux" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "La troncature n'est pas autorisée sur un flux d'entrée" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "La troncature n'est pas prise en charge sur le flux" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nombre de jetons incorrect (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Aucun type pour le nom de classe %s" + +#: ../gio/gicon.c:314 +#, 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:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Le type %s n'est pas classé" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Numéro de version incorrect : %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Impossible de gérer la version fournie du codage de l'icône" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Aucune adresse indiquée" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "La longueur %u est trop importante pour l'adresse" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "L'adresse possède des bits définis au delà de la longueur du préfixe" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Impossible d'analyser « %s » comme masque d'adresse IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Espace insuffisant pour une adresse de connecteur réseau" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Adresse de connecteur réseau non prise en charge" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Le flux a une opération en cours" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Élément <%s> interdit dans <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Élément <%s> interdit au premier niveau" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Le fichier %s apparaît plusieurs fois dans la ressource" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "La localisation de « %s » dans tous les répertoires source a échoué" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "La localisation de « %s » dans le répertoire actuel a échoué" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Option de traitement inconnue « %s »" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "La création du fichier temporaire a échoué : %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Erreur lors du traitement du fichier d'entrée avec xmllint :\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Erreur lors du traitement du fichier d'entrée avec to-pixdata :\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Erreur de lecture du fichier %s : %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Erreur à la compression du fichier %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> ne peut pas contenir du texte" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "nom du fichier de sortie" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FICHIER" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Les répertoires à partir desquels les fichiers seront lus (par défaut le " +"répertoire actuel)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "RÉPERTOIRE" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Générer la sortie dans le format sélectionné par l'extension du nom de " +"fichier cible" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Générer l'en-tête de la source" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Générer le code source utilisé pour lier vers le fichier ressource dans " +"votre code" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Générer la liste des dépendances" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Ne pas créer et enregistrer automatiquement la ressource" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Nom d'identifiant C utilisé pour le code source généré" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compiler une spécification de ressource dans un fichier de ressource.\n" +"Les fichiers de spécification de ressource possèdent l'extension .gresource." +"xml\n" +"et le fichier de ressource possède l'extension .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Vous devez indiquer un et un seul nom de fichier\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "les noms vides ne sont pas autorisés" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"nom « %s » non valide : les noms doivent commencer par une lettre minuscule" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nom « %s » non valide : caractère « %c » non valide ; seuls les minuscules, " +"les nombres et le tiret (« - ») sont autorisés." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"nom « %s » non valide : deux tirets successifs (« -- ») ne sont pas " +"autorisés." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"nom « %s » non valide : le dernier caractère ne peut pas être un tiret (« -" +" »)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nom « %s » non valide : la longueur maximale est 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " a déjà été défini" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "impossible d'ajouter des clés à un schéma « list-of »" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " a déjà été défini" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" masque dans  ; utilisez " +" pour modifier la valeur" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +" ne peut recevoir qu'un et un seul attribut parmi « type », « enum » ou " +"« flags »" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> pas (encore) défini." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "chaîne de type GVariant « %s » non valide" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "un est donné mais son schéma n'étend rien du tout" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "aucune à redéfinir" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " déjà défini" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " déjà défini" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " étend le schéma « %s » qui n'existe pas encore" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" +" est une liste du schéma « %s » qui n'existe pas encore" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Un schéma avec un chemin ne peut contenir de liste" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Impossible d'étendre un schéma avec un chemin" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" est une liste ; elle étend qui n'est pas " +"une liste" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" étend mais " +"« %s » n'étend pas « %s »" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"si un chemin est indiqué, il doit commencer et finir par une barre oblique" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "le chemin d'une liste doit finir par « :/ »" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> est déjà défini" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Élément <%s> interdit au premier niveau" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict a été spécifié ; sortie en cours.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Le fichier complet a été ignoré.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ce fichier est ignoré.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Aucune clé nommée « %s » dans le schéma « %s » comme défini dans le fichier " +"« %s » de redéfinition" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr " ; la redéfinition de cette clé a été ignorée.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " et --strict a été spécifié ; sortie en cours.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"Erreur d'analyse de la clé nommée « %s » dans le schéma « %s » comme défini " +"dans le fichier « %s » de redéfinition : %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "La redéfinition de cette clé a été ignorée.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"la redéfinition de la clé « %s » dans le schéma « %s » du fichier de " +"redéfinition « %s » n'est pas dans la plage indiquée par le schéma" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"la redéfinition de la clé « %s » dans le schéma « %s » du fichier de " +"redéfinition « %s » n'est pas dans la liste des choix valides" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "endroit où enregistrer le fichier gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Annulation en cas d'erreurs dans des schémas" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Ne pas écrire de fichier gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Ne pas appliquer les limitations de nom de clé" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compiler tous les fichiers schémas GSettings dans un cache.\n" +"L'extension .gschema.xml est requise pour les fichiers schémas,\n" +"et le fichier cache est nommé gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Vous devez indiquer un et un seul nom de répertoire\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Aucun fichier schéma trouvé : " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "aucune action effectuée.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "fichier de sortie existant supprimé.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nom de fichier non valide : %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Impossible d'obtenir les informations du système de fichiers : %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Impossible de renommer le répertoire racine" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erreur au renommage du fichier : %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Impossible de renommer le fichier car ce nom est déjà utilisé" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nom de fichier non valide" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Impossible d'ouvrir le répertoire" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Erreur à l'ouverture du fichier : %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Erreur à la suppression du fichier : %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erreur lors de la mise à la corbeille du fichier : %s" + +#: ../gio/glocalfile.c:1883 +#, 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:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Impossible de trouver le répertoire racine pour la corbeille" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Impossible de trouver ou créer le répertoire de la corbeille" + +#: ../gio/glocalfile.c:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Impossible de mettre à la corbeille le fichier : %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "erreur interne" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erreur à la création du répertoire : %s" + +#: ../gio/glocalfile.c:2214 +#, 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:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erreur lors de la création du lien symbolique : %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Erreur lors du déplacement du fichier : %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Impossible de déplacer un répertoire par dessus un autre" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "La création du fichier de sauvegarde a échoué" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erreur lors de la suppression du fichier cible : %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Le déplacement entre points de montage n'est pas pris en charge" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "La valeur d'attribut ne doit pas être « NULL »" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Type d'attribut non valide (une chaîne est attendue)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Nom d'attribut étendu non valide" + +#: ../gio/glocalfileinfo.c:772 +#, 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:1425 +msgid " (invalid encoding)" +msgstr " (codage non valide)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Erreur lors de l'obtention des informations du fichier « %s » : %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "" +"Erreur lors de l'obtention des informations du descripteur de fichier : %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Type d'attribut non valide (uint32 attendu)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Type d'attribut non valide (uint64 attendu)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Type d'attribut non valide (chaîne d'octets attendue)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Impossible de définir des permissions sur les liens symboliques" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erreur lors de la définition des permissions : %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erreur lors de la définition du propriétaire : %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "un lien symbolique ne doit pas être « NULL »" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erreur lors de la définition du lien symbolique : %s" + +#: ../gio/glocalfileinfo.c:2097 +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:2223 +#, 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:2246 +msgid "SELinux context must be non-NULL" +msgstr "Le contexte SELinux ne doit pas être « NULL »" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erreur lors de la définition du contexte SELinux : %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux n'est pas activé sur ce système" + +#: ../gio/glocalfileinfo.c:2360 +#, 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:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erreur lors de la lecture du fichier : %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erreur de positionnement dans le fichier : %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Erreur lors de la fermeture du fichier : %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erreur lors de l'écriture du fichier : %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Erreur lors de la création de la copie de sauvegarde : %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erreur lors du renommage du fichier temporaire : %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erreur lors de la troncature du fichier : %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erreur lors de l'ouverture du fichier « %s » : %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Le fichier cible est un répertoire" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Le fichier cible n'est pas un fichier standard" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Le fichier a été modifié extérieurement" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erreur à la suppression de l'ancien fichier : %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Le type GSeekType fourni n'est pas valide" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Requête « seek » non valide" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Impossible de tronquer GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Le flux de sortie mémoire n'est pas redimensionnable" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Le redimensionnement du flux de sortie mémoire a échoué" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Positionnement demandé avant le début du flux" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount n'implémente pas la supposition d'un type de contenu synchrone" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Le nom d'hôte « %s » comporte « [ » mais pas « ] »" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Réseau inaccessible" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Hôte inaccessible" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Impossible de créer le moniteur de réseau : %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Impossible de créer le moniteur de réseau : " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Impossible d'obtenir le statut du réseau : " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Le flux de sortie n'implémente pas « write »" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Le flux source est déjà fermé" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erreur de résolution de « %s » : %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erreur de résolution inverse de « %s » : %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Aucun enregistrement DNS du type demandé pour « %s »" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Impossible temporairement de résoudre « %s »" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erreur de résolution de « %s »" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Données incomplètes reçues pour « %s »" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "La ressource dans « %s » n'existe pas" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "La décompression de la ressource dans « %s » n'a pas réussi" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "La ressource dans « %s » n'est pas un répertoire" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Le flux en entrée n'implémente pas « seek » (le positionnement)" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Imprimer l'aide" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMANDE]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Énumère les sections contenant les ressources dans un fichier « elf »" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Énumère les ressources\n" +"Si SECTION est fournie, énumère seulement les ressources de cette section\n" +"Si CHEMIN est fourni, énumère seulement les ressources correspondantes" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FICHIER [CHEMIN]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Énumère les ressources en détail\n" +"Si SECTION est fournie, énumère seulement les ressources de cette section\n" +"Si CHEMIN est fourni, énumère seulement les ressources correspondantes\n" +"Les détails incluent la section, la taille et la compression" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extrait un fichier ressource vers la sortie standard" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "CHEMIN DU FICHIER" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Commande inconnue %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilisation :\n" +" gresource [--section SECTION] COMMANDE [ARGUMENTS...]\n" +"\n" +"Commandes :\n" +" help Affiche cette information\n" +" sections Énumère les sections de ressources\n" +" list Énumère les ressources\n" +" details Énumère les ressources en détail\n" +" extract Extrait une ressource\n" +"\n" +"Utilisez « gresource help COMMANDE » pour obtenir de l'aide détaillée.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilisation :\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Paramètres :\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION Un nom de section elf (facultatif)\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMANDE La commande (facultative) à expliquer\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FICHIER Un fichier elf (un binaire ou une bibliothèque partagée)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FICHIER Un fichier elf (un binaire ou une bibliothèque partagée)\n" +" ou un fichier ressource compilé\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CHEMIN]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" +" CHEMIN Un chemin (facultatif) de ressource (peut être partiel)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CHEMIN" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CHEMIN Un chemin de ressource\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Le schéma « %s » n'existe pas\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"Le schéma « %s » n'est pas réadressable (le chemin ne doit pas être " +"indiqué)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Le schéma « %s » est réadressable (le chemin doit être indiqué)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Chemin indiqué vide.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Un chemin doit commencer par une barre oblique (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Un chemin doit se terminer par une barre oblique (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Un chemin ne doit pas contenir deux barres obliques à la suite (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "La clé « %s » n'existe pas\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "La valeur donnée est en dehors du domaine de validité\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Lister les schémas (non-réadressables) installés" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Lister les schémas réadressables installés" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Lister les clés du SCHÉMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHÉMA[:CHEMIN]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Lister les enfants du SCHÉMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Lister les clés et les valeurs récursivement\n" +"Si aucun SCHÉMA n'est indiqué, lister toutes les clés\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHÉMA[:CHEMIN]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Obtenir la valeur de KEY" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHÉMA[:CHEMIN] CLÉ" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Demander la plage de validité des valeurs de la CLÉ" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Définir la valeur de CLÉ à VALEUR" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHÉMA[:CHEMIN] CLÉ VALEUR" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Rétablir CLÉ à sa valeur par défaut" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Réinitialiser toutes les clés de SCHÉMA à leurs valeurs par défaut" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Tester si CLÉ est inscriptible" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Contrôler les modifications de CLÉ.\n" +"Si CLÉ n'est pas défini, contrôle toutes les clés dans SCHÉMA.\n" +"Presser ^C pour mettre fin au contrôle.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHÉMA[:CHEMIN] [CLÉ]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilisation :\n" +" gsettings [--schemadir RÉPERTOIRE2SCHÉMA] COMMANDE [PARAMÈTRES...]\n" +"\n" +"Commandes :\n" +" help Affiche la présente information\n" +" list-schemas Liste les schémas installés\n" +" list-relocatable-schemas Liste les schémas réadressables\n" +" list-keys Liste les clés dans un schéma\n" +" list-children Liste les enfants d'un schéma\n" +" list-recursively Liste les clés et les valeurs, récursivement\n" +" range Demande le domaine de validité de la clé\n" +" get Renvoie la valeur d'une clé\n" +" set Définit la valeur d'une clé\n" +" reset Rétablit la valeur par défaut d'une clé\n" +" reset-recursively Rétablit toutes les valeurs dans un schéma " +"donné\n" +" writable Teste si la clé est inscriptible\n" +" monitor Contrôle les modifications\n" +"\n" +"Saisissez 'gsettings help COMMANDE' pour une aide détaillée.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilisation :\n" +" gsettings [--schemadir RÉPERTOIRE2SCHÉMA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" +" RÉPERTOIRE2SCHÉMA Un répertoire de recherche de schémas supplémentaires\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHÉMA Le nom du schéma\n" +" CHEMIN Le chemin, pour les schémas réadressables\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " CLÉ La clé (optionnelle) dans le schéma\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " CLÉ La clé dans le schéma\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALEUR La valeur à définir\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Nom de schéma fourni vide\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Connecteur non valide, non initialisé" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Connecteur non valide, l'initialisation a échoué en raison de : %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Le connecteur est déjà fermé" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Entrées/sorties hors délai sur le connecteur" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "création de GSocket à partir du descripteur de fichier : %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Impossible de créer le connecteur : %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Indication d'une famille inconnue" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Indication d'un protocole inconnu" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "impossible d'obtenir l'adresse locale : %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "impossible d'obtenir l'adresse distante : %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "impossible d'écouter : %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erreur lors de liaison à l'adresse : %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Erreur lors de la connexion au groupe multicast : %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Erreur lors de la déconnexion du groupe multicast : %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Aucune prise en charge pour le multicast spécifique à la source" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erreur d'acceptation de la connexion : %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Connexion en cours" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Impossible d'obtenir l'erreur actuelle : %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erreur lors de la réception des données : %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Erreur lors de l'envoi des données : %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Impossible de fermer le connecteur : %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erreur lors de la fermeture du connecteur : %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "En attente de l'état du connecteur : %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Erreur d'envoi de message : %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage n'est pas pris en charge par Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erreur lors de la réception du message : %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials n'est pas implémenté sur ce système d'exploitation" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Impossible de se connecter au serveur mandataire %s : " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Impossible de se connecter à %s : " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Impossible de se connecter : " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Erreur inconnue à la connexion" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "" +"L'usage d'un proxy n'est pas pris en charge dans une connexion non-TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Le protocole du proxy « %s » n'est pas pris en charge." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Le processus d'écoute est déjà fermé" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Le connecteur réseau ajouté est fermé" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ne prend pas en charge l'adresse IPv6 « %s »" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Le nom d'utilisateur est trop long pour le protocole SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Le nom d'hôte « %s » est trop long pour le protocole SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Le serveur n'est pas un serveur mandataire SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "La connexion à travers le serveur SOCKSv4 a été rejetée" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Le serveur n'est pas un serveur mandataire SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Le serveur mandataire SOCKSv5 nécessite une authentification." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Le protocole SOCKSv5 nécessite une méthode d'authentification qui n'est pas " +"prise en charge par GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"Le nom d'utilisateur ou le mot de passe est trop long pour le protocole " +"SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"L'authentification SOCKSv5 a échoué à cause d'un mauvais nom d'utilisateur " +"ou mot de passe." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Le nom d'hôte « %s » est trop long pour le protocole SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Le serveur mandataire SOCKSv5 utilise un type d'adresse inconnu." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Erreur interne de serveur mandataire SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "La connexion SOCKSv5 n'est pas autorisée par la règle." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "L'hôte n'est pas accessible à travers le serveur SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Le réseau n'est pas accessible à travers le proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Connexion à travers le serveur mandataire SOCKSv5 refusée." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" +"Le serveur mandataire SOCKSv5 ne prend pas en charge la commande « connect »." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" +"Le serveur mandataire SOCKSv5 ne prend pas en charge le type d'adresse " +"fourni." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Erreur inconnue du serveur mandataire SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Impossible de gérer la version %d du codage GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Impossible de déchiffrer la clé privée codée-PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Aucune clé privée codée PEM trouvée" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Impossible d'analyser la clé privée codée-PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Aucun certificat codé-PEM trouvé" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Impossible d'analyser le certificat codé-PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ceci est votre dernière chance de saisir un mot de passe correct avant que " +"votre accès soit bloqué." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Plusieurs mots de passe saisis ont été incorrects, votre accès sera bloqué " +"après quelques échecs de plus." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Le mot de passe saisi est incorrect." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 message de contrôle attendu, %d reçu(s)" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Type de données auxiliaires inattendu" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Un descripteur de fichier attendu, %d obtenu(s)\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Le descripteur de fichier reçu n'est pas valide" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Erreur lors de l'envoi de l'identification : " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"Erreur lors de la vérification de l'activation de SO_PASSCRED pour le " +"connecteur : %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Option de longueur inattendue lors de la vérification de l'activation de " +"SO_PASSCRED pour le connecteur. %d octets attendus, %d reçus" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Erreur lors de l'activation de SO_PASSCRED : %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Lecture d'un unique octet attendue à la réception de l'identification, mais " +"aucun octet lu" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Pas de message de contrôle attendu, %d reçu(s)" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Erreur lors de la désactivation de SO_PASSCRED : %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Erreur de lecture à partir du descripteur de fichier : %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Erreur de fermeture du descripteur de fichier : %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Racine du système de fichiers" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Erreur d'écriture vers le descripteur de fichier : %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +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:276 +msgid "Can't find application" +msgstr "Impossible de trouver l'application" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Erreur lors du lancement de l'application : %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI non pris en charge" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "" +"Les modifications d'association ne sont pas prises en en charge sur win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "La création d'associations n'est pas prise en charge sur win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Erreur de lecture à partir de l'identificateur : %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Erreur de fermeture de l'identificateur : %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Erreur lors de l'écriture vers l'identificateur : %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Mémoire insuffisante" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Erreur interne : %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Entrée nécessitant plus de données" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Données compressées non valides" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresse à écouter" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignoré, pour compatibilité avec GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Imprimer l'adresse" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Imprimer l'adresse en mode shell" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Exécuter un service dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Arguments incorrects\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Attribut « %s » inattendu pour l'élément « %s »" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "L'attribut « %s » de l'élément « %s » est introuvable" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Balise « %s » inattendue. La balise « %s » était attendue" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Balise « %s » inattendue à l'intérieur de « %s »" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Un signet pour l'URI « %s » existe déjà" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Aucun signet trouvé pour l'URI « %s »" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" +"Échec du développement de la ligne de commande « %s » pour l'URI « %s »" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Séquence de caractères incomplète en fin d'entrée" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Impossible de convertir le caractère de repli « %s » dans le jeu de codes " +"« %s »" + +#: ../glib/gconvert.c:1870 +#, 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 protocole « file »" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "L'URI de fichier local « %s » ne peut pas inclure un caractère « # »" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI « %s » n'est pas valide" + +#: ../glib/gconvert.c:1909 +#, 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:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI « %s » contient des caractères d'échappement incorrects" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Le chemin « %s » n'est pas un chemin absolu" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Nom d'hôte non valide" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "janvier" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "février" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "mars" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "avril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "mai" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "juin" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "juillet" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "août" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "septembre" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "octobre" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "novembre" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "décembre" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "janv." + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "févr." + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mars" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "avril" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "juin" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "juil." + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "août" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sept." + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "oct." + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov." + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "déc." + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "lundi" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "mardi" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "mercredi" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "jeudi" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "vendredi" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "samedi" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "dimanche" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "lun." + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "mar." + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mer." + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "jeu." + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ven." + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sam." + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dim." + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erreur à l'ouverture du répertoire « %s » : %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erreur de lecture du fichier « %s » : %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Le fichier « %s » est trop grand" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "La lecture depuis le fichier « %s » a échoué : %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "L'ouverture du fichier « %s » a échoué : %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"L'obtention des attributs du fichier « %s » a échoué : échec de fstat() : %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "L'ouverture du fichier « %s » a échoué : échec de fdopen() : %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Le renommage du fichier « %s » vers « %s » a échoué : échec de g_rename() : " +"%s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "La création du fichier « %s » a échoué : %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"L'ouverture du fichier « %s » en écriture a échoué : échec de fdopen() : %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "L'écriture dans le fichier « %s » a échoué : échec de fwrite() : %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "L'écriture dans le fichier « %s » a échoué : échec de fflush() : %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "L'écriture dans le fichier « %s » a échoué : échec de fsync() : %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "La fermeture du fichier « %s » a échoué : échec de fclose() : %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Le fichier existant « %s » ne peut pas être supprimé : échec de g_unlink() : " +"%s" + +#: ../glib/gfileutils.c:1542 +#, 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 un « %s »" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Le modèle « %s » ne contient pas XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "La lecture du lien symbolique « %s » a échoué : %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Liens symboliques non pris en charge" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Lecture de données brutes impossible dans g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Données restantes non converties dans le tampon de lecture" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "La canal se termine avec un caractère partiel" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Lecture de données brutes impossible dans g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "N'est pas un fichier standard" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nom de groupe non valide : %s" + +#: ../glib/gkeyfile.c:1235 +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:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nom de clé non valide : %s" + +#: ../glib/gkeyfile.c:1288 +#, 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:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, 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:1705 +#, 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:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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 » dont une valeur est impossible à " +"interpréter." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"La clé « %s » dans le groupe « %s » a une valeur « %s » alors que %s était " +"attendu" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, 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:4242 +#, 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:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "La valeur entière « %s » est hors plage" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, 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." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"L'obtention des attributs du fichier « %s%s%s%s » a échoué : échec de fstat" +"() : %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Le mappage %s%s%s%s a échoué : échec de mmap() : %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "L'ouverture du fichier « %s » a échoué : échec de open() : %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erreur à la ligne %d, caractère %d : " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Codage UTF-8 non valide dans le nom - « %s » n'est pas valide" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "« %s » n'est pas un nom valide " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "« %s » n'est pas un nom valide : « %c » " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erreur à la ligne %d : %s" + +#: ../glib/gmarkup.c:636 +#, 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 "" +"Échec de l'analyse de « %-.*s » qui devrait être un nombre dans la plage de " +"référence des caractères (ê par exemple) - peut-être que le nombre est " +"trop grand" + +#: ../glib/gmarkup.c:648 +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 du caractère ne se termine pas par un point-virgule ; vous avez " +"vraisemblablement utilisé une esperluette sans intention d'écrire une entité " +"- échappez l'esperluette avec &" + +#: ../glib/gmarkup.c:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "La référence au caractère « %-.*s » ne code pas un caractère autorisé" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entité vide « &; » rencontrée : les entités valides sont : & " < " +"> '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "L'entité nommée « %-.*s » est inconnue" + +#: ../glib/gmarkup.c:725 +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 par un point-virgule ; vous avez probablement " +"utilisé une esperluette sans intention d'écrire une entité - échappez " +"l'esperluette avec &" + +#: ../glib/gmarkup.c:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Le document doit commencer avec un élément (par ex. )" + +#: ../glib/gmarkup.c:1113 +#, 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 à la suite du caractère « < » ; il ne " +"semble pas commencer un nom d'élément" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Caractère anormal « %s », un caractère « > » est requis pour terminer la " +"balise d'élément vide « %s »" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Caractère anormal « %s », un caractère « = » est requis après le nom de " +"l'attribut « %s » de l'élément « %s »" + +#: ../glib/gmarkup.c:1306 +#, 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 anormal « %s », il est requis un caractère « > » ou « / », ou " +"optionnellement un attribut, pour clore la balise de début de l'élément " +"« %s » ; peut-être avez-vous utilisé un caractère non valide dans un nom " +"d'attribut" + +#: ../glib/gmarkup.c:1350 +#, 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 anormal « %s », un guillemet d'ouverture après le signe égal est " +"requis quand on affecte une valeur à l'attribut « %s » de l'élément « %s »" + +#: ../glib/gmarkup.c:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"« %s » n'est pas un caractère valide à la suite du nom d'élément « %s » à " +"fermer ; le caractère autorisé est « > »" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "L'élément « %s » a été fermé, aucun élément n'est actuellement ouvert" + +#: ../glib/gmarkup.c:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Le document était vide ou ne contenait que des espaces" + +#: ../glib/gmarkup.c:1721 +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:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +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:1749 +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:1754 +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:1760 +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:1767 +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:1783 +#, 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:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Utilisation :" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Options de l'aide :" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Affiche les options de l'aide" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Affiche toutes les options de l'aide" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Options de l'application :" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Impossible d'analyser la valeur entière « %s » pour %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, 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:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Impossible d'analyser la valeur double « %s » pour %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "La valeur double « %s » pour %s est hors plage" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Erreur lors de l'analyse de l'option %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument manquant pour %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Option inconnue %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objet endommagé" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "erreur interne ou objet endommagé" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "mémoire insuffisante" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "limite de suivi arrière atteinte" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"le motif contient des éléments non pris en charge pour une correspondance " +"partielle" + +#: ../glib/gregex.c:288 +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 pour une correspondance partielle" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "limite de récursivité atteinte" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinaison de marqueurs de nouvelle ligne non valide" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "mauvais décalage" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 court" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "boucle récursive" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "erreur inconnue" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ à la fin du motif" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c à la fin du motif" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "un caractère non reconnu suit \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "nombres en désordre dans le quantificateur {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "nombre trop grand dans le quantificateur {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "caractère terminaison ] manquant pour la classe de caractère" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "séquence d'échappement non valide dans la classe de caractère" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "plage déclassée dans la classe de caractère" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "rien à répéter" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "répétition inattendue" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "caractère non reconnu après (? ou (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "" +"Les classes nommées selon la norme POSIX sont uniquement prises en charge " +"dans une classe" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr ") de terminaison manquante" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "référence à un sous-motif inexistant" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "« ) » manquante après un commentaire" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "l'expression régulière est trop grande" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "l'obtention de la mémoire a échoué" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") sans ( d'ouverture" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "dépassement de code" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "caractère non reconnu après (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "l'assertion « lookbehind » n'a pas de longueur fixe" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "nom ou nombre non conforme après (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "un groupe conditionnel contient plus de deux branches" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "une assertion est attendue après (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "« (?R » ou « (?[+-]chiffres » doivent être suivis d'une « ) »" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nom de classe POSIX inconnu" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "les éléments d'interclassement POSIX ne sont pas pris en charge" + +#: ../glib/gregex.c:418 +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:421 +msgid "invalid condition (?(0)" +msgstr "condition (?(0) non valide" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C n'est pas autorisé dans l'assertion « lookbehind »" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" +"les échappements \\L, \\l, \\N{name}, \\U et \\u ne sont pas pris en charge" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "un appel récursif peut effectuer des boucles indéfiniment" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "caractère non reconnu après (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "terminaison manquante dans le nom du sous-motif" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "deux sous-motifs nommés possèdent le même nom" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "séquence \\P ou \\p mal formée" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nom de propriété inconnu après \\P ou \\p" + +#: ../glib/gregex.c:453 +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:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "trop de sous-motifs nommés (10 000 maximum)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "la valeur octale est plus grande que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "dépassement de capacité en compilant l'espace de travail" + +#: ../glib/gregex.c:467 +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:470 +msgid "DEFINE group contains more than one branch" +msgstr "le groupe DEFINE contient plus d'une branche" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "options NEWLINE inconsistantes" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g n'est pas suivi d'un nom ou nombre entre accolades, chevrons, guillemets " +"simples ou d'un nombre simple" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "une référence numérotée ne doit pas être zéro" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "un argument n'est pas permis pour (*ACCEPT), (*FAIL) ou (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) non reconnu" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "le nombre est trop grand" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "nom de sous-motif manquant après (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "chiffre attendu après (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] est un caractère de données invalide en mode de compatibilité JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "" +"il n'est pas permis d'avoir des noms différents pour des sous-motifs du même " +"nombre" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) doit avoir un argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c doit être suivi d'un caractère ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k n'est pas suivi d'un nom entre accolades, chevrons ou guillemets simples" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N n'est pas pris en charge dans une classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "trop de références en avant" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "le nom est trop long dans (*MARK), (*PRUNE), (*SKIP) ou (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "la valeur du caractère dans la séquence \\u.... est trop grande" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +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:1323 +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:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "La bibliothèque PCRE est compilée avec des options incompatibles" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Erreur lors de l'optimisation de l'expression régulière %s : %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "chiffre hexadécimal ou « } » attendu" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "chiffre hexadécimal attendu" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "« < » manquant dans la référence symbolique" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "référence symbolique non terminée" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "référence symbolique de longueur nulle" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "chiffre attendu" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "référence symbolique illégale" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "terminaison parasite « \\ »" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "séquence d'échappement inconnue" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Le texte cité ne commence pas par des guillemets" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Guillemets de fermeture introuvables dans la ligne de commande ou autre " +"texte rapporté" + +#: ../glib/gshell.c:574 +#, 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:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Le texte s'est terminé avant que des guillemets correspondants ne soient " +"rencontrés pour %c (le texte était « %s »)." + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Le texte était vide (ou ne contenait que des espaces)" + +#: ../glib/gspawn.c:208 +#, 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:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erreur inattendue dans waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Le processus fils s'est terminé avec le code %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Le processus fils a été tué par le signal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Le processus fils a été arrêté par le signal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Le processus fils s'est terminé anormalement" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "La lecture depuis un tube fils a échoué (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Le clonage a échoué (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Le changement de répertoire « %s » a échoué (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "L'exécution du processus fils « %s » a échoué (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Le clonage du processus fils a échoué (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erreur inconnue à l'exécution du processus fils « %s »" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "La lecture des données depuis le processus fils a échoué" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "L'exécution du processus fils a échoué (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nom de programme non valide : %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Chaîne non valide dans l'argument vecteur à %d : %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Chaîne non valide dans l'environnement : %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Répertoire de travail non valide : %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "L'exécution du programme d'aide a échoué (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Caractère hors plage pour UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Séquence non valide dans l'entrée du convertisseur" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Caractère hors plage pour UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octets" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f Kio" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f Mio" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f Gio" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f Tio" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f Pio" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f Eio" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f ko" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mo" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Go" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f To" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f Po" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f Eo" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s octet" +msgstr[1] "%s octets" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f Ko" diff --git a/po/ga.po b/po/ga.po new file mode 100644 index 0000000..010b86f --- /dev/null +++ b/po/ga.po @@ -0,0 +1,3744 @@ +# Irish translations for glib package. +# Copyright (C) 2002-2011 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Alastair McKinstry , 2003. +# Seán de Búrca , 2007-2011. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-05-22 08:14-0600\n" +"Last-Translator: Seán de Búrca \n" +"Language-Team: Irish \n" +"Language: ga\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Earráid le linn cumarsáide: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Is neamhbhailí an URI '%s'" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Is neamhbhailí an t-óstainm an URI '%s'" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Óstainm neamhbhailí" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +#, fuzzy +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Eanáir" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Feabhra" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Márta" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Aibreán" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Bealtaine" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Meitheamh" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Iúil" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "Lúnasa" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "Meán Fómhair" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "Deireadh Fómhair" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "Samhain" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "Nollaig" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ean" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feabh" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Márta" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Aib" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Beal" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Meith" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Iúil" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Lún" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "MFómh" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "DFómh" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Samh" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Noll" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Dé Luain" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dé Máirt" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Dé Céadaoin" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Déardaoin" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Dé hAoine" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Dé Sathairn" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Dé Domhnaigh" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Luan" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Máirt" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Céad" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Déar" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Aoine" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sath" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Domh" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Earráid agus comhadlann '%s' á oscailt: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tá comhad \"%s\" ró-mhór" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Theip ar léamh ó chomhad '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Theip ar oscailt comhaid '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Theip ar oscailt comhaid '%s': theip fdopen(): %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Theip ar chruthú comhaid '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fwrite(): %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fflush(): %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Theip ar scríobh comhaid '%s': theip fsync(): %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Theip ar dhúnadh comhaid '%s': theip fclose(): %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Níl XXXXXX ann sa teimpléad '%s'" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Theip ar léamh nasc siombalach '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Theip ar oscailt comhad '%s': theip open(): %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Theip ar mapáil comhad '%s': theip mmap(): %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Earraidh ar líne %d carachtar %d:" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Earráid ar líne %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "réad truaillithe" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "earráid inmheánach nó réad truaillithe" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "cuimhne ídithe" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "earráid inmheánach" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "earráid anaithnid" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "theip ar fháil cuimhne" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "bhíothas ag súil le digit" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Theip ar léamh sonraí ó mhacphróiseas" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Theip ar léamh ó mhacphíopa (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ainm cláir neamhbhailí: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Comhadlann oibre neamhbhailí: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Theip ar rith cláir cabhrach (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Theip ar dhéanamh forc (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Earráid anaithnid agus macphróiseas \"%s\" á rith" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Úsáid:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ROGHA...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Roghanna Cabhrach:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Taispeáin roghanna cabhrach" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Taispeáin gach rogha cabhrach" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Roghanna Feidhmchláir:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Earráid agus rogha %s á pharsáil" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Rogha anaithnid %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Ní gnáthchomhad é" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Is folamh é an comhad" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ainm grúpa neamhbhailí: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ainm eocrach neamhbhailí: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "cineál %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Earráid agus á nasc: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Earráid agus comhad á scríobh: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Cineál anaithnid" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Earráid agus comhadlann '%s' á oscailt: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Earráid agus comhadlann á cruthú: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Earráid agus comhad '%s' á léamh: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Earráid agus comhad á dhúnadh: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Earráid agus comhad á scríobh: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Ní thaicaítear leis na URIanna" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Earráid agus comhad á scríobh: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Earráid ar líne %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Earráid agus rogha %s á pharsáil" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Earráid agus á nasc: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Earráid agus rogha %s á pharsáil" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Earráid agus ag glacadh leis an gceangal: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Earráid agus comhadlann '%s' á oscailt: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "réad truaillithe" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Gan ainm" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Ní thaicaítear leis na URIanna" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Earráid agus comhad á oscailt: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Ní thaicaítear leis na URIanna" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ainm comhaid %s neamhbhailí" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Earráid agus eolas chóras comhad á fháil: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Earráid agus comhad á athainmniú: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Ainm comhaid neamhbhailí" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Earráid agus comhad á oscailt: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Earráid agus comhad á bhaint: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Earráid agus comhad á chur sa bhruscar: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ní féidir comhadlann bhruscair %s a chruthú: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ní féidir comhad eolas bruscair a chruthú: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ní féidir comhad a chur sa bhruscar: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Earráid agus comhadlann á cruthú: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Theip ar léamh nasc siombalach '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Earráid agus nasc siombalach á dhéanamh: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Earráid agus comhad á bhogadh: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Earráid agus spriocchomhad á bhaint: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Earráid agus tréith bhreisithe '%s' á shocrú: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Earráid agus staid chomhaid '%s' á fáil: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (ionchódú neamhbhailí)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Earráid agus staid tuairisceora comhaid á fáil: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Earráid agus ceadanna á socrú: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Earráid agus ceadanna á socrú: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Earráid agus úinéir á shocrú: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "ní mór an nasc siombalach bheith neamh-NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Earráid agus nasc siombalach á shocrú: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Earráid agus am athraithe nó rochtana á shocrú: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Earráid agus comhthéacs SELinux á shocrú: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Earráid agus comhad á léamh: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Earráid agus ag cuardach i gcomhad: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Earráid agus comhad á dhúnadh: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Earráid agus comhad á scríobh: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Earráid agus sean-nasc cúltaca á bhaint: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Earráid agus cóip cúltaca á chruthú: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Earráid agus comhad sealadach á athainmniú: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Earráid agus comhad á theascadh: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Earráid agus comhad '%s' á oscailt: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Earráid agus seanchomhad á bhaint: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Iarratas cuardaigh neamhbhailí" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Earráid agus '%s' á réiteach: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Earráid agus '%s' á réiteach aisiompaithe: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Earráid agus '%s' á réiteach" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Rogha anaithnid %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket á chruthú ó fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ní féidir soicéad a chruthú: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Earráid agus á cheangal le seoladh: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Earráid agus ag glacadh leis an gceangal: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Earráid agus á nasc: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Earráid agus á nasc: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ní féidir earráid ar feitheamh a fháil: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Earráid agus sonraí á bhfáil: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Earráid agus sonraí á seoladh: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Ní féidir soicéad a chruthú: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Earráid agus soicéad á dhúnadh: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Earráid agus teachtaireacht á seoladh: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Earráid agus teachtaireacht á fáil: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Earráid anaithnid ag am naisc" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Earráid agus sonraí á seoladh: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Earráid agus comhad á athainmniú: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Earráid agus unix á léamh: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Earráid agus unix á dhúnadh: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Fréamh an chóras comhad" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Earráid agus unix á scríobh: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ní féidir feidhmchlár a aimsiú" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Earráid agus feidhmchlár á thosú: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "Ní thaicaítear leis na URIanna" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Earráid agus comhad á léamh: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Earráid agus comhad á dhúnadh: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Earráid agus comhad á scríobh: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "cuimhne ídithe" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "earráid inmheánach" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Óstainm neamhbhailí" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#, fuzzy +#~ msgid "Failed to set value\n" +#~ msgstr "theip ar fháil cuimhne" diff --git a/po/gl.po b/po/gl.po new file mode 100644 index 0000000..e14a6f6 --- /dev/null +++ b/po/gl.po @@ -0,0 +1,4617 @@ +# Galician translation of GLib. +# Copyright (C) 2001, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas +# colaborar connosco, podes atopar máis información en http://www.trasno.net +# Manuel A. Fernández Montecelo , 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, 2011, 2012. +# Leandro Regueiro , 2012. +# Fran Dieguez , 2012, 2013. +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-06 18:20+0100\n" +"PO-Revision-Date: 2013-02-06 18:20+0200\n" +"Last-Translator: Fran Dieguez \n" +"Language-Team: gnome-l10n-gl@gnome.org\n" +"Language: gl\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: Virtaal 0.7.1\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "O valor de conta pasado a %s é demasiado longo" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Non se permite buscar no fluxo base" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Non é posíbel truncar GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "O fluxo xa se pechou" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Non se permite truncar no fluxo base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "A operación foi cancelada" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "O socket non é válido, non se inicializou" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "A secuencia de bytes non é válida na entrada da conversión" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Non hai espazo abondo para o enderezo do socket" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "A secuencia de bytes non é válida na entrada da conversión" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Produciuse un erro durante a conversión: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Non se permite a inicialización cancelábel" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, 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»" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Non foi posíbel abrir o conversor de «%s» a «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipo descoñecido" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipo de ficheiro %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials non está implementado neste SO" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "A súa plataforma non ten compatibilidade con GCredentials" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials non contén un ID de proceso para este SO" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final de fluxo inesperadamente prematuro" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Clave «%s» non admitida na entrada do enderezo «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"O enderezo «%s» non é válido (necesítase exactamente unha ruta, tmpdir ou " +"claves abstractas)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Combinación de par clave/valor sen sentido na entrada do enderezo «%s»" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Erro no enderezo «%s» o atributo do porto está mal formado" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Erro no enderezo «%s» - o atributo da familia está mal formada" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "O elemento do enderezo «%s» non contén un caracter dous puntos (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"O par clave/valor %d, «%s» no elemento do enderezo «%s» non contén un signo " +"de igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Produciuse un erro ao desescapar a clave ou o valor no par clave/valor %d, " +"«%s», no elemento de enderezo «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Erro no enderezo «%s» - o transporte unix require que se estabeleza " +"exactamente unha das claves «path» ou «abstract»" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Erro no enderezo «%s» - falta o atributo do equipo ou está mal formado" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Erro no enderezo «%s» - falta o atributo do porto ou está mal formado" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Produciuse un erro no enderezo «%s» - falta o atributo do ficheiro de uso de " +"unha vez ou está mal formado" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Produciuse un erro ao autoiniciar: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transporte «%s» descoñecido ou non compatíbel para o enderezo «%s»" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Produciuse un erro ao abrir o ficheiro de uso de unha vez «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Produciuse un erro ao ler o ficheiro de uso de unha vez «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Produciuse un erro ao ler o ficheiro de uso de unha vez «%s»:, esperábanse " +"16 bytes, obtivéronse %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Produciuse un erro ao gravar os contidos do ficheiro de uso de unha vez «%s» " +"ao fluxo:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "O enderezo fornecido está baleiro" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Non é posíbel iniciar («spawn») unha bus de mensaxe sen setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Non é posíbel iniciar («spawn») unha mensaxe ao bus sen un ID de máquina:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Produciuse un erro ao iniciar («spawn») a orde «%s»:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Prema calquera caracter para pechar esta xanela)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "O DBus de sesión non está executándose e o autoiniciado fallou" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Non é posíbel determinar o enderezo do bus de sesión (non está implementado " +"para este SO)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Non é posíbel determinar o enderezo do bus desde a variábel de ambiente " +"DBUS_STARTER_BUS_TYPE - valor descoñecido «%s»" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Non é posíbel determinar o enderezo do bus xa que a variábel de ambiente " +"DBUS_STARTER_BUS_TYPE non está estabelecida" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipo de bus %d descoñecido" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Falta o contido inesperada ao tentar ler unha liña" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Falta de contido inesperada ao tentar ler (de forma segura) unha liña" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Agotáronse todos os mecanismos de autenticación dispoñíbel (tentaronse: %s) " +"(dispoñíbeis: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelando mediante GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Produciuse un erro ao obter a información do directorio «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Os permisos no cartafol «%s» están malformados. Esperábase o modo 0700 e " +"obtívose 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Produciuse un erro ao crear o directorio «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Produciuse un erro ao abrir o anel de chaves «%s» para a súa lectura:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "A liña %d do anel de chaves en «%s» con contido «%s» está malformada" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O primeiro token da liña %d no anel de chaves en «%s» co contido «%s» está " +"malformado" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O segundo token da liña %d no anel de chaves en «%s» co contido «%s» está " +"malformado" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Non foi posíbel atopar a cookie co id %d no anel de chave en «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Produciuse un erro ao eliminar o ficheiro de bloqueo antigo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Produciuse un erro ao crear o ficheiro de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Produciuse un erro ao pechar o ficheiro de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Produciuse un erro ao abrir o ficheiro de bloqueo «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Produciuse un erro ao abrir o anel de chaves «%s» para escribir:" + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Ademais, a liberación do bloqueo para «%s» tamén fallou: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "A conexión está pechado" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Tempo de espera máximo alcanzado" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Atopáronse opcións non compatíbeis ao construír a conexión da parte cliente" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Non existe a interface «org.freedesktop.DBus.Properties» no obxecto coa ruta " +"%s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Produciuse un erro ao estabelecer a propiedade «%s»: Esperábase o tipo «%s» " +"pero obtívose «%s»" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Non existe a propiedade «%s»" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Non é posíbel escribir a propiedade %s" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Non é posíbel escribir a propiedade %s" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Non existe a interface «%s»" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Non existe a interface" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Non existe a interface «%s» no obxecto coa ruta %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Non existe o método «%s»" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "O tipo da mensaxe, «%s», non coincide co tipo «%s» esperado" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Xa hai un obxecto exportado para a interface %s en %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "O método «%s» devolveu un tipo «%s» máis esperábase «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "O método «%s» na interface «%s» coa sinatura «%s» non existe" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Xa se exportou un subárbore para %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "o tipo é INVALID" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "mensaxe METHOD_CALL: falta o campo da cabeceira PATH ou MEMBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "mensaxe METHOD_RETURN: falta o campo da cabeceira REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "mensaxe ERROR: falta o campo da cabeceira REPLY_SERIAL ou ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "mensaxe SIGNAL: falta o campo da cabeceira PATH, INTERFACE ou MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"mensaxe SIGNAL: o campo da cabeceira PATH está usando un valor reservado /" +"org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"mensaxe SIGNAL: O campo da cabeceira INTERFACE está usando un valor " +"reservado org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Quíxose ler %lu byte pero obtívose un %lu" +msgstr[1] "Quixéronse ler %lu bytes pero obtívose un %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Esperábase un byte NUL despois da cadea «%s» pero atopouse o byte %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Esperábase unha cadea UTF-8 correcta pero atopáronse bytes non válidos no " +"byte desvío %d (a lonxitude da cadea é %d). A cadea UTF-8 correcta até ese " +"punto foi «%s»" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "O valor analizado «%s» non é unha ruta de obxecto D-Bus correcta" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "O valor analizado «%s» non é unha sinatura D-Bus correcta" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Atopouse unha matriz cunha lonxitude de %u byte. A lonxitude máxima é 2<<26 " +"bytes (64 MiB)." +msgstr[1] "" +"Atopouse unha matriz cunha lonxitude de %u bytes. A lonxitude máxima é 2<<26 " +"bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"O valor «%s» analizado para a variante non é unha sinatura de D-Bus correcta" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Produciuse un erro ao deserializar o GVariant co tipo cadea «%s» desde o " +"formato ligado D-Bus" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor de «endianness» non válido. Esperábase 0x6c («|») ou 0x42 («B») pero " +"atopouse 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"A versión maior do protocolo non é válida. Esperábase 1 pero atopouse a %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Atopouse a cabeceira de sinatura coa sinatura «%s» máis o corpo da mensaxe " +"está baleiro" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"O valor analizado «%s» non é unha sinatura D-Bus correcta (para o corpo)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Non hai unha cabeceira da sinatura na mensaxe pero o corpo da mensaxe ten %u " +"byte" +msgstr[1] "" +"Non hai unha cabeceira da sinatura na mensaxe pero o corpo da mensaxe ten %u " +"bytes" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Non foi posíbel deserializar a mensaxe: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Produciuse un erro ao serializar o GVariant co tipo cadea «%s» desde o " +"formato ligado D-Bus" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"A mensaxe ten %d descritores de ficheiro pero o campo da cabeceira indica %d " +"descritores de ficheiro" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Non foi posíbel serializar a mensaxe: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"O corpo da mensaxe ten a sinatura «%s» máis non está presente a cabeceira de " +"sinatura" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"O corpo da mensaxe ten a sinatura de tipo «%s» pero a sintura no campo da " +"cabeceira é «%s»" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"O corpo da mensaxe está baleiro máis a sinatura do campo da cabeceira é " +"«(%s)»" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Produciuse un erro ao devolver co corpo de tipo «%s»" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Produciuse un erro ao devolver co corpo baleiro" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Non é posíbel obter o perfil de hardware: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Non é posíbel ler /var/lib/dbus/machine-id ou /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Produciuse un erro ao chamar a StartServiceByName para %s:" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Resposta %d non esperada desde o método StartServiceByName(«%s»)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Non é posíbel invocar ao método; o proxy non ten dono para un nome coñecido " +"e o proxy construíuse coa opción G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "Non se admite un espazo de nomes abstracto" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"Non é posíbel especificar o ficheiro de uso de unha vez ao crear un servidor" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" +"Produciuse un erro ao escribir no ficheiro de uso de unha vez en «%s»: %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "A cadea «%s» non é un GUID de D-BUS correcta" + +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Non é posíbel escoitar nun transporte «%s» non admitido" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "ORDE" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Ordes:\n" +" help Mostra esta axuda\n" +" introspect Instrospecciona un obxecto remoto\n" +" monitor Monitorizar un obxecto remoto\n" +" call Invoca un método nun obxecto remoto\n" +"\n" +"Use '%s ORDE --help' para obter axuda sobre cada orde.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Erro: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Produciuse un erro ao analizar o XML de introspección: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Conectar ao bus do sistema" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Conectar ao bus de sesión" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Conectar a un enderezo D-Bus fornecido" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Opcións da conexión do extremo:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Opción para especificar a conexión do extremo" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Non se especificou o punto final da conexión" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Especificáronse varios puntos finais da conexión" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Aviso: segundo os datos de introspección a interface «%s» non existe\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Aviso: segundo os datos de introspección o método «%s» non existe na " +"interface «%s»\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Destino opcional para o sinal (nome único)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Ruta do obxecto sobre o que emitir o sinal" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Nomes da interface e sinal" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emitir un sinal." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Produciuse un erro ao conectar: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Erro: non se especificou unha ruta de obxecto.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Erro: %s non é unha ruta a un obxecto correcta\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Erro: non se especificou o sinal.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Erro: o sinal debe ser un nome cualificado completo.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Erro: %s non é un nome de interface correcto\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Erro: %s non é un nome de membro correcto\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Erro: %s non é un nome de bus único correcto.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Produciuse un erro ao analizar a opción %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Produciuse un erro ao limpar a conexión: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Nome do destino onde invocar o método" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Ruta ao obxecto onde invocar o método" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Método e nome da interface" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Tempo de expiración en segundos" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Invocar un método nun obxecto remoto." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Erro: non se especificou un destino\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Erro: non se especificou unha ruta de obxecto\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Erro: non se especificou o nome do método\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Erro: o nome do método «%s» non é válido\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Produciuse un erro ao analizar o parámetro %d do tipo «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Nome de destino a introspeccionar" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Ruta do obxecto a introspeccionar" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Imprimir XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Introspeccionar fillo" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Só mostrar propiedades" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Introspecciona un obxecto remoto." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Nome de destino a monitorizar" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Ruta do obxecto a monitorizar" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Monitoriza un obxecto remoto." + +#: ../gio/gdesktopappinfo.c:594 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sen nome" + +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "O ficheiro de escritorio non especificou o campo Exec" + +#: ../gio/gdesktopappinfo.c:1295 +msgid "Unable to find terminal required for application" +msgstr "Non é posíbel atopar o terminal requirido polo aplicativo" + +#: ../gio/gdesktopappinfo.c:1597 +#, 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:1601 +#, 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:1841 ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "A información do aplicativo carece dun identificador" + +#: ../gio/gdesktopappinfo.c:2097 +#, 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:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Definición personalizada para %s" + +#: ../gio/gdrive.c:394 +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:472 +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:548 +msgid "drive doesn't implement polling for media" +msgstr "a unidade non implementa a consulta para medios" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "a unidade non implementa o inicio" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "a unidade non implementa a detención" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "A compatibilidade de TLS non está dispoñíbel" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperábase un GEmblem para o GEmblemedIcon" + +#: ../gio/gfile.c:917 ../gio/gfile.c:1156 ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 ../gio/gfile.c:1590 ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 ../gio/gfile.c:1789 ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 ../gio/gfile.c:3468 ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 ../gio/gfile.c:3711 ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 ../gio/gfile.c:4610 ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 ../gio/gfile.c:4884 ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 ../gio/gfile.c:5536 ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 ../gio/gfile.c:7225 ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "O punto de montaxe contido non existe" + +#: ../gio/gfile.c:2474 ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Non é posíbel copiar sobre o directorio" + +#: ../gio/gfile.c:2534 +msgid "Can't copy directory over directory" +msgstr "Non é posíbel copiar un directorio sobre o directorio" + +#: ../gio/gfile.c:2542 ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "O ficheiro de destino xa existe" + +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Non é posíbel copiar o directorio recursivamente" + +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Non se admite a unión" + +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Produciuse un erro ao empalmar o ficheiro: %s" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Copiar (reflink/clonar) entre montaxes non é compatíbel" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Copiar (reflink/clone) non é compatíbel ou non é válido" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Copiar (reflink/clone) non é compatíbel ou non funciona" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Non é posíbel copiar o ficheiro especial" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "O valor da ligazón simbólica dada non é válido" + +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "O Lixo non é compatíbel" + +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Os nomes de ficheiro non poden conter '%c'" + +#: ../gio/gfile.c:6258 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "o volume non implementa o montado" + +#: ../gio/gfile.c:6367 +msgid "No application is registered as handling this file" +msgstr "Non hai ningún aplicativo rexistrado para manexar este ficheiro" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "O enumerador está pechado" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "O enumerador do ficheiro ten unha operación excepcional" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "O fluxo non permite query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Non se permite buscar no fluxo" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Non se permite truncar no fluxo de entrada" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Non se permite truncar no fluxo" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número incorrecto de tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Non hai un tipo para o nome de clase %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s non implementa unha interface GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s non ten unha clase" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versión formado incorrectamente: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Non é posíbel manipular a versión fornecida da codificación da icona" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Non se especificou ningún enderezo" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "A lonxitude %u é demasiado longa para un enderezo" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "O enderezo ten bits máis aló da lonxitude do prefixo" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Non foi posíbel analizar «%s» como unha máscara dun enderezo IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Non hai espazo abondo para o enderezo do socket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Non se admite o enderezo do socket" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "O fluxo ten unha operación excepcional" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Non se permite o elemento <%s> dentro de <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Non se permite o elemento <%s> non nivel superior" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "O ficheiro %s aparece varias veces no recurso" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Produciuse un erro ao buscar «%s» en calquera directorio fonte" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Produciuse un erro ao buscar «%s» no cartafol actual" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Opción de procesado descoñecida «%s»" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Produciuse un erro ao crear o ficheiro temporal: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Produciuse un erro ao procesar o ficheiro de entrada con xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Produciuse un erro ao procesar o ficheiro de entrada con to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Produciuse un erro ao ler o ficheiro %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Produciuse un erro ao comprimir o ficheiro: %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "o texto non debe aparecer dentro de <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "o nome do ficheiro de saída" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FICHEIRO" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"O cartafol da que se ten que ler os ficheiros (o predeterminado é o cartafol " +"actual)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORIO" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Xerar saída no formato seleccionado pola extensión do nome do ficheiro " +"obxetivo" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Xerar unha cabeceira de orixe" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Xera o código fonte usado para ligar o ficheiro do recurso no seu código" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Xerar lista de dependencias" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Non crear e rexistrar o recurso automaticamente" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Non exporte as funcións; decláreas en G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "O nome de identificador C usado para xerar o código fonte" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compilaa unha especificación de recurso nun ficheiro de recurso.\n" +"Os ficheiros de especificación de recursos teñen a extensión .gresource." +"xml,\n" +"e o ficheiro do recurso ten a extensión .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Debería fornecer exactamente un nome de ficheiro\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "non se permiten nomes baleiros" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nome «%s» non válido: os nomes deben comezar por unha letra minúscula" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nome «%s» non válido: o carácter «%c» non é válido; só se permiten letras en " +"minúsculas, números e guións («-»)." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "nome «%s» non válido: non se permiten dous guións seguidos («--»)." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "nome «%s» non válido: o último carácter non pode ser un guión («-»)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nome «%s» non válido: a lonxitude máxima é 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " xa especificado" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "non é posíbel engadir claves a un esquema «lista-de»" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " xa especificada" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" enmascara a en ; use " +" para modificar o valor" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"debe especificar exactamente un de «type», «enum» ou «flags» como un " +"atributo de " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> aínda non especificado." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "tipo de cadea GVarian «%s» non válida" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " fornecido pero o esquema non estende nada" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "non existe para sobrescribir" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " xa foi especificada" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " xa especificado" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " estende ao esquema inexistente «%s»" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " é unha lista de esquemas inexistente «%s»" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Non é posíbel que sexa unha lista de esquemas con unha ruta" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Non é posíbel estender un esquema con unha ruta" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" é unha lista, estase estendendo que non é " +"unha lista" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" estende pero " +"«%s» non estende a «%s»" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "unha ruta, se se especifica, debe comezar e rematar con unha barra" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "a ruta dunha lista debe rematar con «:/»" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> xa especificado" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Non se permite o elemento <%s> no nivel superior" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict foi especificado; saíndo.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Ignorouse este ficheiro completamente.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorando este ficheiro.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Non existe a clave «%s» no esquema «%s» como se especificou no ficheiro de " +"sobrescritura «%s»" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorando a sobrescritura para esta clave.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "e --strict foi especificado; saíndo.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"produciuse un erro ao analizar a clave «%s» no esquema «%s» como se " +"especificou no ficheiro de sobrescritura «%s»: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorando a sobrescritura para esta clave.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"a clave de sobrescritura «%s» no esquema «%s» no ficheiro de sobrescritura " +"«%s» está fora do intervalo indicado no esquema" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"a clave de sobrescritura «%s» no esquema «%s» no ficheiro de sobrescritura " +"«%s» non está na lista de opcións válidas" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "onde almacenar o ficheiro compilado de gschemas" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Interromper ao atopar calquera erro nos esquemas" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Non escribir o ficheiro compilado de gschema" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Non respetar as restricións de nome de clave" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compilar todos os ficheiros de esquema GSettings nunha caché\n" +"de esquemas. Os ficheiros de esquema deben ter a extensión\n" +".gschema.xml e o ficheiro de caché chámase gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Debería fornecer exactamente un nome de cartafol\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Non se atoparon ficheiros de esquema: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "sen facer nada.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "retirouse o ficheiro de saída existente.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Non é posíbel atopar o tipo de monitorización do directorio local " +"predeterminado" + +#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "O nome do ficheiro non é válido %s" + +#: ../gio/glocalfile.c:974 +#, 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:1142 +msgid "Can't rename root directory" +msgstr "Non é posíbel renomear o directorio raíz" + +#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Produciuse un erro ao renomear o ficheiro: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Non é posíbel renomear o ficheiro, o ficheiro xa existe" + +#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "O nome do ficheiro non é válido" + +#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Non é posíbel abrir o directorio" + +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Produciuse un erro ao abrir o ficheiro: %s" + +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Produciuse un erro ao retirar o ficheiro: %s" + +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Produciuse un erro ao mover ao lixo o ficheiro: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Non é posíbel crear o directorio do lixo %s: %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Non é posíbel atopar o directorio de nivel superior para o lixo" + +#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023 +msgid "Unable to find or create trash directory" +msgstr "Non é posíbel atopar ou crear o directorio do lixo" + +#: ../gio/glocalfile.c:2057 +#, 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:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Non é posíbel mover ao lixo o ficheiro: %s" + +#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280 +msgid "internal error" +msgstr "erro interno" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Produciuse un erro ao crear o directorio: %s" + +#: ../gio/glocalfile.c:2234 +#, 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:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Produciuse un erro ao crear a ligazón simbolica: %s" + +#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Produciuse un erro ao mover o ficheiro: %s" + +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Non é posíbel mover o directorio sobre un directorio" + +#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Fallou a creación do ficheiro de seguranza" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Produciuse un erro ao retirar o ficheiro obxectivo: %s" + +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Non se permite mover entre puntos de montaxe" + +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "O valor do atributo debe ser non nulo" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo non válido (esperábase unha cadea)" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Nome estendido do atributo non válido" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Produciuse un erro ao estabelecer o atributo estendido «%s»: %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (codificación non válida)" + +#: ../gio/glocalfileinfo.c:1740 ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Produciuse un erro ao obter a información do ficheiro «%s»: %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Produciuse un erro ao obter información do descritor do ficheiro: %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "O tipo de atributo non é válido (esperábase uint32)" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "O tipo de atributo non é válido (esperábase uint64)" + +#: ../gio/glocalfileinfo.c:2068 ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "O tipo de atributo non é válido (esperábase unha cadea de bytes)" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Non foi posíbel estabelecer os permisos nas ligazóns simbólicas" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Produciuse un erro ao estabelecer os permisos: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Produciuse un erro ao estabelecer o propietario: %s" + +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "a ligazón simbólica debe ser non nula" + +#: ../gio/glocalfileinfo.c:2222 ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Produciuse un erro ao estabelecer a ligazón simbólica: %s" + +#: ../gio/glocalfileinfo.c:2231 +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:2357 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" +"Produciuse un erro ao modificar a configuración ou o tempo de acceso: %s" + +#: ../gio/glocalfileinfo.c:2380 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux debe ser non-NULL" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Produciuse un erro ao estabelecer o contexto SELinux: %s" + +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux non está activado neste sistema" + +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Non se permite estabelecer o atributo %s " + +#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Produciuse un erro ao ler do ficheiro: %s" + +#: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Produciuse un erro ao buscar no ficheiro: %s" + +#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Produciuse un erro ao pechar o ficheiro: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "" +"Non é posíbel atopar o tipo de monitorización do ficheiro local " +"predeterminado" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Produciuse un erro ao escribir no ficheiro: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" +"Produciuse un erro ao retirar a ligazón da copia de seguranza antiga: %s" + +#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Produciuse un erro ao crear a copia de seguranza: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Produciuse un erro ao renomear o ficheiro temporal: %s" + +#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Produciuse un erro ao truncar o ficheiro: %s" + +#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Produciuse un erro ao abrir o ficheiro «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "O ficheiro destino é un directorio" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "O ficheiro destino non é un ficheiro normal" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "O ficheiro foi modificado externamente" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Produciuse un erro ao retirar o ficheiro antigo: %s" + +#: ../gio/gmemoryinputstream.c:476 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Proporcionouse un GSeekType non válido" + +#: ../gio/gmemoryinputstream.c:486 +msgid "Invalid seek request" +msgstr "Petición de busca non válida" + +#: ../gio/gmemoryinputstream.c:510 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Non é posíbel truncar GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "O fluxo de saída da memoria non é redimensionábel" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Produciuse un erro ao redimensionar o fluxo de saída da memoria" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Solicitouse unha busca antes do inicio do fluxo" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "O nome do host «%s» contén '[' mais non ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "A rede non é atinxíbel" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Equipo non atinxíbel" + +#: ../gio/gnetworkmonitornetlink.c:98 ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Non foi posíbel crear un monitor de rede: %s" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "Non foi posíbel crear un monitor de rede: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Non foi posíbel obter o estado da rede: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "O fluxo de saída non implementa a escritura" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "O fluxo de orixe xa está pechado" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Non existe o recurso en «%s»" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Produciuse un erro ao descomprimir o recurso en «%s»" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "O recurso en «%s» non é un cartafol" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "O fluxo de entrada non implementa seek" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Imprimir axuda" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[ORDE]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Lista as seccións que conteñen recursos nun ficheiro elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Listar os recursos\n" +"Se se fornece SECCIÓN, só se listarán os recursos desta sección\n" +"Se se fornece RUTA, só se listarán os recursos que coincidan" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FICHEIRO [RUTA]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECCIÓN" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Listar os recursos con detalles\n" +"Se se fornece SECCIÓN, só se listarán os recursos desta sección\n" +"Se se fornece RUTA, só se listarán os recursos que coincidan\n" +"Os detalles inclúen a sección, tamaño e compresión" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Extraer un ficheiro de recurso a stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FICHEIRO RUTA" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Orde «%s» descoñecida\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gresource [--section SECCIÓN] ORDE [ARGS...]\n" +"\n" +"Ordes:\n" +" help Mostra esta información\n" +" sections Mostra as seccións do recurso\n" +" list Mostra os recursos\n" +" details Mostra os recursos con detalles\n" +" extract Extraer un recurso\n" +"\n" +"Use 'gresource help ORDE' para obter axuda detallada.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumentos:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECCIÓN Un nome de sección elf (opcional)\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " ORDE A orde que explicar (opcional)\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FICHEIRO Un ficheiro elf (un binario ou biblioteca compartida)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FICHEIRO Un ficheiro elf (un binario ou unha biblioteca compartida)\n" +" ou un ficheiro de recurso compilado\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[RUTA]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " RUTA Unha ruta (optional) de recurso (pode ser parcial)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "CAMIÑO" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " RUTA Unha ruta dun recurso\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Non existe o esquema «%s»\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "O esquema «%s» non pode reposicionarse (non debe especificar a ruta)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "O esquema «%s» pode reposicionarse (debe especificarse a ruta)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Forneceuse unha ruta baleira.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "A ruta debe comezar cunha barra (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "A ruta debe rematar cunha barra (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "A ruta non debe conter dúas barras adxacentes (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Non existe a clave «%s»\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "O valor fornecido está fora do intervalo válido\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Lista dos esquemas instalados (non reposicionábeis)" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Lista dos esquemas instalados reposicionábeis" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Lista das claves de ESQUEMA" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:RUTA]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Lista dos fillos do SCHEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Lista as clave e valores, recursivamente\n" +"Se non se fornece un ESQUEMA, lista todas as claves\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:RUTA]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Obtén o valor de CLAVE" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:RUTA] CLAVE" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Consulta o intervalo de valores válidos de CLAVE" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Estabelece o valor de CLAVE a VALOR" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:RUTA] CLAVE VALOR" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Estabelece a CLAVE ao seu valor predeterminado" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" +"Restabelecer todas as claves nun ESQUEMA aos seus valores predeterminados" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Comproba se a CLAVE é escribíbel" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizar os cambios da CLAVE.\n" +"Se non se especifica a CLAVE, monitoriza todos os cambios en ESQUEMA.\n" +"Use ^C para deter a monitorización.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:RUTA] [CLAVE]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings ORDE [--schemadir CARTAFOL_ESQUEMA] COMMAND [ARGS…]\n" +"\n" +"Ordes:\n" +" help Mostra esta información\n" +" list-schemas Mostra os esquemas instalados\n" +" list-relocatable-schemas Mostra os esquemas instalados reubicábeis\n" +" list-keys Mostra as claves dun esquema\n" +" list-children Mostra os fillos nun esquema\n" +" list-recursively Lista de claves e valores, recursivamente\n" +" range Consulta o rango dunha clave\n" +" get Obtén os valores dunha clave\n" +" set Estabelece o valor dunha clave\n" +" reset Restabelece o valor dunha clave\n" +" reset-recursively Restabelecer todos os valores dun esquema " +"fornecido\n" +" writable Comproba se a clave é escribíbel\n" +" monitor Monitoriza cambios\n" +"\n" +"Use 'gsettings help ORDE' para obter máis axuda.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir DIRECTORIO_ESQUEMA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " CARTAFOL_ESQUEMA: un cartafol para buscar esquemas adicionais\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA O nome do esquema\n" +" KEY A ruta, para os esquemas reposicionábeis\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY A clave (opcional) no esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY A clave nun esquema\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALUE O valor a estabelecer\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Forneceuse un nome de esquema baleiro\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "O socket non é válido, non se inicializou" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "O socket non é válido, a inicialización fallou debido a: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "O fluxo de orixe xa está pechado" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Tempo de espera do Socket de E/S superado" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creando o GSocket a partir de fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Non é posíbel crear o socket: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Especificouse unha familia descoñecida" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Especificouse un protocolo descoñecido" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "non foi posíbel obter un enderezo local: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "non foi posíbel obter un enderezo remoto: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "non foi posíbel escoitar: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Produciuse un erro ao conectar co enderezo: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Produciuse un erro ao unirse ao grupo multicast: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Produciuse un erro ao deixar o grupo multicast: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Non se admite o multicast específico da fonte" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Produciuse un erro ao aceptar a conexión: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Conexión en marcha" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Non é posíbel obter o erro pendente:" + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Produciuse un erro ao recibir datos: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Produciuse un erro ao enviar datos: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Non é posíbel desconectar o socket: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Produciuse un erro ao pechar o socket: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Agardando pola situación do socket: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Produciuse un erro ao enviar a mensaxe: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "O GSocketControlMessage non está permitido en Windows" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Produciuse un erro ao recibir a mensaxe: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Non é posíbel obter o erro pendente: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials non está implementado para este sistema operativo" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Non foi posíbel conectarse ao servidor proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Non foi posíbel conectar a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Non foi posíbel conectar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Erro descoñecido ao conectar" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "" +"Non se permite a conexión ao proxy mediante unha conexión que non sexa TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Non é posíbel usar o proxy co protocolo «%s»." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "O porto de escoita xa está pechado" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "O socket engadido está pechado" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 non ten compatibilidade para enderezos IPv6 «%s»" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "O nome de usuario é demasiado longo para o protocolo SOCKSv5" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "O nome do equipo «%s» é demasiado longo para o protocolo SOCKSv5" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "O servidor non é un servidor proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "A conexión a través do servidor SOCKSv4 foi rexeitada" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "O servidor non é un servidor proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "O proxy SOCKSv5 require autenticación." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 require un método de autenticación que non é compatíbel con GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"O nome de usuario ou contrasinal son demasiado longos para o protocolo " +"SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"A autenticación SOCKSv5 fallou debido a un nome de usuario ou contrasinal " +"incorrectos." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "O nome do equipo «%s» é demasiado longo para o protocolo SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "O servidor proxy SOCKSv5 usa un tipo de enderezo descoñecido." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Produciuse un erro interno no servidor proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Non se permite a conexión SOCKSv5 debido ao conxunto de regras." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "O equipo non é atinxíbel mediante o servidor SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "A rede non é atinxíbel mediante o proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Rexeitouse a conexión mediante o proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "O proxy SOCKSv5 non é compatíbel coa orde «connect»." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "O proxy SOCKSv5 non é compatíbel co tipo de enderezo fornecido." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Erro no proxy SOCKSv5 descoñecido." + +#: ../gio/gthemedicon.c:498 +#, 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/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Produciuse un erro ao resolver «%s»: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Produciuse un erro ao resolver inversamente «%s»: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Non hai un rexistro de DNS do tipo solicitado para «%s»" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Non é posíbel resolver temporalmente «%s»" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Produciuse un erro ao resolver: «%s»" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Non foi posíbel descifrar a chave privada codificada con PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Non se atopou ningún certificado PEM codificado" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Non foi posíbel analizar a chave privada PEM codificada" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Non se atopou ningún certificado PEM codificado" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Non foi posíbel analizar o certificado PEM codificado" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Esta é a última oportunidade para escribir o contrasinal corretamente antes " +"de que se bloquee o acceso." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Escribiu varias veces o contrasinal incorrecto, falla de novo bloquearase o " +"acceso." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "O contrasinal introducido é incorrecto." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperando 1 mensaxe de control, obtívose %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Tipo de datos subsidiarios inesperados" + +#: ../gio/gunixconnection.c:190 +#, 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:206 +msgid "Received invalid fd" +msgstr "Recibiuse un descritor de ficheiro (fd) incorrecto" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Produciuse un erro ao enviar as credenciais:" + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"Produciuse un erro ao comprobar se SO_PASSCRED está activado para o socket: " +"%s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Produciuse un erro ao activar SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Esperábase ler un só byte para recibir as credenciais pero léronse creo bytes" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Non se esperaba unha mensaxe de control, pero obtívose %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Produciuse un erro ao desactivar SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Produciuse un erro ao ler do descritor do ficheiro: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Produciuse un erro ao pechar o descritor do ficheiro: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Raíz do sistema de ficheiros" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Produciuse un erro ao escribir no descritor do ficheiro: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"Neste sistema non se permiten enderezos de socket de dominios UNIX abstractos" + +#: ../gio/gvolume.c:439 +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:516 +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:276 +msgid "Can't find application" +msgstr "Non é posíbel atopar o aplicativo" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Produciuse un erro ao iniciar o aplicativo: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Os URI non son compatíbeis" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "os cambios de asociación non son compatíbeis con win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "A creación de asociación non é compatíbel con win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Produciuse un erro ao ler do manexador: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Produciuse un erro ao pechar o manexador: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Produciuse un erro ao escribir no manexador: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Sen memoria dabondo" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Necesítase máis entrada" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Datos comprimidos incorrectos" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Enderezo no que escoitar" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorado, para compatibilidade con GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Imprimir enderezo" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Imprimir enderezo en modo consola" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Executar servizo dbus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Argumentos incorrectos\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo «%s» inesperado para o elemento «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Non se atopou o atributo «%s» do elemento «%s»" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta «%s» inesperada, esperábase a etiqueta «%s»" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta «%s» inesperada dentro de «%s»" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Non foi posíbel atopar un ficheiro de marcadores válido nos directorios de " +"datos" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Xa existe un marcador para o URI «%s»" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Non se atopou ningún marcador para o URI «%s»" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Produciuse un erro ao expandir a liña executábel «%s» co URI «%s»" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Hai unha secuencia de carácter parcial ao final da entrada" + +#: ../glib/gconvert.c:1053 +#, 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:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI «%s» non é válido" + +#: ../glib/gconvert.c:1910 +#, 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:1926 +#, 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:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "O nome da ruta «%s» non é un camiño absoluto" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "O nome do host non é válido" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %H:%M:%S, %e de %B de %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Xaneiro" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Febreiro" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Marzo" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maio" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Xuño" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Xullo" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agosto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Setembro" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Outubro" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembro" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Decembro" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Xan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Maio" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Xuño" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Xul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ago" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Out" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Luns" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Martes" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Mércores" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Xoves" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Venres" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sábado" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Domingo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Lun" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mer" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Xov" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Ven" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sáb" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Dom" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Produciuse un erro ao abrir o directorio «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Non foi posíbel asignar %lu byte para ler o ficheiro \"%s\"" +msgstr[1] "Non foi posíbel asignar %lu bytes para ler o ficheiro \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Produciuse un erro ao ler o ficheiro «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "O ficheiro «%s» é demasiado grande" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Produciuse un erro ao ler desde o ficheiro «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Produciuse un erro ao abrir o ficheiro «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Produciuse un erro ao obter os atributos do ficheiro «%s»: fstat() fallou: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Produciuse un erro ao abrir o ficheiro «%s»: fdopen() fallou: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Produciuse un erro ao renomear o ficheiro «%s» como «%s»: g_rename() fallou: " +"%s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Produciuse un erro ao crear o ficheiro «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Produciuse un erro ao abrir o ficheiro «%s» para escritura: fdopen() fallou: " +"%s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Produciuse un erro ao escribir o ficheiro «%s»: fwrite() fallou: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Produciuse un erro ao escribir o ficheiro «%s»: fflush() fallou: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Produciuse un erro ao escribir o ficheiro «%s»: fsync() fallou: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Produciuse un erro ao pechar o ficheiro «%s»: fclose() fallou: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Non foi posíbel retirar o ficheiro existente «%s»: g_unlink() fallou: %s" + +#: ../glib/gfileutils.c:1556 +#, 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:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "O modelo «%s» non contén XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Produciuse un erro ao ler a ligazón simbólica «%s»: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "As ligazóns simbólicas non se admiten" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Datos restantes non convertidos no búfer de lectura" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "O canal termina nun carácter parcial" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Non é posíbel atopar un ficheiro de clave correcto nos directorios de busca" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Non é un ficheiro normal" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"O ficheiro clave contén a liña «%s» que non é un par valor-clave, grupo ou " +"comentario" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo non válido: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "O ficheiro clave non comeza cun grupo" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de clave non válido: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "O ficheiro clave contén unha codificación non permitida «%s»" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "O ficheiro clave non ten un grupo «%s»" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "O ficheiro clave non ten a chave «%s»" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "O ficheiro clave contén a clave «%s» co valor «%s» que non é UTF-8" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"O ficheiro clave contén a clave «%s» que ten un valor que non é posíbel " +"interpretar." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"O ficheiro clave contén a clave «%s» no grupo «%s» que ten un valor que non " +"é posíbel interpretar." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "A clave «%s» do grupo «%s» ten o valor «%s», pero agardábase %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "O ficheiro clave non ten a clave «%s» no grupo «%s»" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "O ficheiro clave contén un carácter de escape ao final da liña" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "O ficheiro clave contén a secuencia de escape non válida «%s»" + +#: ../glib/gkeyfile.c:4244 +#, 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:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "O valor enteiro «%s» está fóra do intervalo" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Non é posíbel interpretar o valor «%s» como un booleano." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Produciuse un erro ao obter os atributos do ficheiro «%s%s%s%s»: fstat() " +"fallou: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Produciuse un erro ao mapear «%s%s%s%s»: mmap() fallou: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Produciuse un erro ao abrir o ficheiro «%s»: open() fallou: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na liña %d carácter %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "«%s» non é un nome válido" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "«%s» non é un nome válido: '%c'" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na liña %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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 erro 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:694 +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:720 +#, 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:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Detectada unha entidade baleira '&;'; as entidades válidas son: & " " +"< > '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Non se coñece o nome de entidade '%-.*s'" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "O documento debe comezar cun elemento (por exemplo )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "O documento estaba baleiro ou só contiña espazos en branco" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "O documento rematou inesperadamente despois dun símbolo menor que '<'" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"O documento rematou inesperadamente con elementos aínda abertos - «%s» foi o " +"último elemento aberto" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"O documento rematou inesperadamente, esperábase ver un símbolo maior que '>' " +"que pechase a etiqueta <%s/>" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "O documento rematou inesperadamente dentro dun nome de elemento" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "O documento rematou inesperadamente dentro dun nome de atributo" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"O documento rematou inesperadamente dentro dunha etiqueta de comezo de " +"elemento." + +#: ../glib/gmarkup.c:1806 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"O documento rematou inesperadamente despois do signo igual que segue a un " +"nome de atributo; non hai valor de atributo" + +#: ../glib/gmarkup.c:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "O documento rematou inesperadamente dentro dun valor de atributo" + +#: ../glib/gmarkup.c:1829 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"O documento rematou inesperadamente dentro da etiqueta que pechaba o " +"elemento «%s»" + +#: ../glib/gmarkup.c:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"O documento rematou inesperadamente dentro dun comentario ou instrución de " +"procesamento" + +#: ../glib/goption.c:754 +msgid "Usage:" +msgstr "Uso:" + +#: ../glib/goption.c:754 +msgid "[OPTION...]" +msgstr "[OPCIÓN…]" + +#: ../glib/goption.c:864 +msgid "Help Options:" +msgstr "Opcións de axuda:" + +#: ../glib/goption.c:865 +msgid "Show help options" +msgstr "Mostrar as opcións de axuda" + +#: ../glib/goption.c:871 +msgid "Show all help options" +msgstr "Mostrar todas as opcións de axuda" + +#: ../glib/goption.c:933 +msgid "Application Options:" +msgstr "Opcións do aplicativo:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Non é posíbel analizar o valor enteiro «%s» para %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Non é posíbel analizar o valor \"double\" «%s» para %s" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Produciuse un erro ao analizar a opción %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumento que falta para %s" + +#: ../glib/goption.c:1979 +#, c-format +msgid "Unknown option %s" +msgstr "Opción %s descoñecida" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "obxecto danado" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "erro interno ou obxecto danado" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "sen memoria" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "alcanzouse o límite de \"backtracking\"" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "atinxiuse o límite de recursividade" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinación non válida de marcas de liña nova" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "desplazamento erróneo" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "UTF8 curto" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "bucle de repetición" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "erro descoñecido" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ao final do patrón" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ao final do patrón" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "carácter non recoñecido despois de \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "números fóra do intervalo no cuantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande no cuantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "falta a terminación ] para a clase de carácter" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "secuencia de escape non válida na clase de carácter" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "intervalo fóra de orde na clase de carácter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nada que repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetición inesperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "carácter non recoñecido despois de (? ou (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "falta o ) de terminación" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referencia a un subpatrón non existente" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "falta un ) despois do comentario" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "a expresión regular é demasiado longa" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "produciuse un erro ao obter a memoria" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") sen ( que o abra" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "desbordamento de código" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "carácter non recoñecido despois de (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "a aserción lockbehind non ten unha lonxitude fixa" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "número ou nome formado incorrectamente despois de (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "o grupo condicional contén máis de dúas ramas" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "esperábase unha aserción despois de (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ou os díxitos (?[+-] deben estar seguidos por )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nome de clase POSIX descoñecida" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "os elementos de colación POSIX non se admiten" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "o valor do carácter na secuencia \\x{…} é demasiado longo" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "condición non válida (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "non se permite \\C en asercións lookbehind" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "as secuencias de escape \\L, \\l, \\N{nome}, \\U, e \\u non se admiten" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "unha chamada recursiva pode crear un bucle infinito" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "carácter non recoñecido despois de (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "falta a terminación no nome do subpatrón" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dous subpatróns teñen o mesmo nome" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "secuencia \\P ou \\p formada incorrectamente" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propiedade descoñecido despois de \\P ou \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "o nome do subpatrón é demasiado longo (máximo 32 caracteres)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpatróns con nome (máximo 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "o valor octal é maior que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "desbordouse o espazo de traballo de compilación" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "non se atopou o subpatrón referenciado comprobado previamente" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "o grupo DEFINE contén máis dunha rama" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opcións NEWLINE inconsistentes" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g non está seguido por un nome entre chaves, corchetes angulares ou un " +"número entre comiñas, ou por un número simple" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "unha referencia co número non pode ser cero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "non se permite un argumento para (*ACCEPT), (*FAIL), ou (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) no recoñecido" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "o número é demasiado grande" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "falta o nome do subpatrón despois de (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "agardábase un díxito despois de (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] é un carácter de datos non válido no modo de compatibilidade de JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "non se permiten diferentes nomes para subpatróns do mesmo número" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) debe ter un argumento" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c debe estar seguido dun carácter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k non está seguido por un nome entre chaves, corchetes angulares ou entre " +"comiñas" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "non se permite \\N nunha clase" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "demasiadas referencias cara adiante" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "o nome é demasiado longo en (*MARK), (*PRUNE), (*SKIP), ou (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "o valor do carácter na secuencia \\u.... é demasiado longo" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "A biblioteca PCRE está compilada sen compatibilidade con UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"A biblioteca PCRE está compilada sen compatibilidade con propiedades UTF8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "A biblioteca PCRE está compilada con opcións non compatíbeis" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "esperábase un díxito hexadecimal ou '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "esperábase un díxito hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "falta '<' na referencia simbólica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "referencia simbólica sen finalizar" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referencia simbólica de lonxitude cero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "esperábase un díxito" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "referencia simbólica ilegal" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "'\\' final perdido" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "secuencia de escape descoñecida" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "O texto citado non comeza con comiñas" + +#: ../glib/gshell.c:178 +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:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "O texto rematou despois dun carácter '\\'. (O texto era «%s»)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"O texto rematou antes de atopar a comiña final para %c. (O texto era «%s»)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "O texto estaba baleiro (ou só contiña espazos en branco)" + +#: ../glib/gspawn.c:203 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Produciuse un erro ao ler datos desde un proceso fillo (%s)" + +#: ../glib/gspawn.c:362 +#, 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:853 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "O proceso fillo rematou co código %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "O proceso fillo rematou polo sinal %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "O proceso fillo detívose polo sinal %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "O proceso fillo rematou de forma anormal" + +#: ../glib/gspawn.c:1280 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Produciuse un erro ao ler desde a canalización filla (%s)" + +#: ../glib/gspawn.c:1348 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Produciuse un erro ao facer fork (%s)" + +#: ../glib/gspawn.c:1496 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Produciuse un erro ao cambiar ao directorio «%s» (%s)" + +#: ../glib/gspawn.c:1506 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Produciuse un erro ao executar o proceso fillo «%s» (%s)" + +#: ../glib/gspawn.c:1516 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"Produciuse un erro ao redireccionar a saída ou entrada do proceso fillo (%s)" + +#: ../glib/gspawn.c:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Produciuse un erro ao facer fork ao proceso fillo (%s)" + +#: ../glib/gspawn.c:1533 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Produciuse un erro descoñecido ao executar o proceso fillo «%s»" + +#: ../glib/gspawn.c:1557 +#, 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/gspawn.c:1630 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" +"Produciuse un erro ao crear a canalización para comunicarse co proceso fillo " +"(%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Produciuse un erro ao ler datos desde un proceso fillo" + +#: ../glib/gspawn-win32.c:376 ../glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Produciuse un erro 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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Cadea non válida no ambiente: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directorio de traballo non válido: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Produciuse un erro ao executar o programa asistente (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Carácter fóra do intervalo para UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Secuencia non válida na entrada da conversión" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Carácter fóra de intervalo para UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kiB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Datos recibidos incompletos para «%s»" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Opción de lonxitude inesperada ao comprobar se SO_PASSCRED estaba " +#~ "activada para o socket. Esperábanse %d bytes, obtivéronse %d" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Erro inesperado en waitpid() (%s)" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Terminación anómala do programa ao iniciar («spawn») a orde «%s»:%s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "A orde de liña «%s» rematou con un estado de saída distinto de cero %d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "atinxiuse o límite do espazo de traballo para subcadeas baleiras" + +#~ 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)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "non se permite repetir un grupo DEFINE" + +#~ msgid "No service record for '%s'" +#~ msgstr "Non hai rexistro de servizo de «%s»" + +#~ msgid "Could not bind netlink socket: %s" +#~ msgstr "Non foi posíbel conectar ao socket netlink: %s:" + +#~ msgid "Could not set options on netlink socket: %s" +#~ msgstr "Non foi posíbel estabelecer as opcións do socket netlink: %s" + +#, fuzzy +#~ msgid "Could not wrap netlink socket: " +#~ msgstr "Non é posíbel envolver o socket netlink:" + +#~ msgid "Could not send netlink request: " +#~ msgstr "Non foi posíbel enviar a solicitude netlink:" + +#~ msgid "File is empty" +#~ msgstr "O ficheiro está baleiro" + +#~ msgid "Error connecting: " +#~ msgstr "Produciuse un erro ao conectar: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Produciuse un erro ao conectar: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Produciuse un erro ao ler de unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Produciuse un erro ao pechar unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Produciuse un erro ao escribir a unix: %s" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Esta opción eliminarase pronto" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Produciuse un erro ao iniciar o ficheiro «%s»: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "" +#~ "A implementación de SOCKSv4 limita o nome de usuario a %i caracteres" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "A implementación de SOCKSv4a limita o nome de computador a %i caracteres" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "O tipo do valor de retorno é incorrecto, obtívose «%s» e esperábase «%s»" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Tentouse estabelecer a propiedade %s do tipo %s pero segundo á interface " +#~ "esperada o tipo é %s" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Ordes:\n" +#~ " help Mostrar esta información\n" +#~ " get Obter o valor dunha chave\n" +#~ " set Estabelecer o valor dunha chave\n" +#~ " reset Restabelecer o valor dunha chave\n" +#~ " monitor Monitorizar se hai cambios nunha chave\n" +#~ " writable Comprobar se se pode escribir unha clave\n" +#~ "\n" +#~ "Use «%s COMANDO --help» para obter axuda das ordes individualmente.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especifique o camiño para o esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumentos:\n" +#~ " SCHEMA O id do esquema\n" +#~ " KEY O nome da chave\n" +#~ " VALUE O valor da chave para estabelecer como unha GVariant " +#~ "serializada\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Non é posíbel escribir a chave %s\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitorizar a CHAVE por cambios e imprimir os valores cambiados.\n" +#~ "A monitorización continuará até que o proceso remate." + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "" +#~ "Non existe o esquema «%s» especificado no ficheiro de sobrescritura «%s»" + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "" +#~ "Produciuse un erro ao escribir os primeiros 16 bytes da mensaxe no socket:" + +#~ msgid "The nonce-file `%s' was %lu bytes. Expected 16 bytes." +#~ msgstr "" +#~ "O ficheiro de uso de unha vez «%s» tiña %lu bytes. Esperábanse 16 bytes." + +#~ msgid "Encountered array of length %" +#~ msgstr "Encontrouse unha matriz de lonxitude %" + +#~ msgid "Do not give error for empty directory" +#~ msgstr "Non é posíbel mover o directorio sobre un directorio" + +#~ msgid "Error: Result is type `%s', expected `(s)'\n" +#~ msgstr "Erro: o tipo do resultado é «%s», esperábase «(s)»\n" + +#~ msgid "Error: Result is type `%s', expected `(as)'\n" +#~ msgstr "Erro: o tipo do resultado «%s» esperábase «(as)»\n" diff --git a/po/gu.po b/po/gu.po new file mode 100644 index 0000000..7f9f639 --- /dev/null +++ b/po/gu.po @@ -0,0 +1,4268 @@ +# translation of gu.po to Gujarati +# Ankit Patel , 2005, 2006. +# Ankit Patel , 2007, 2008. +# Sweta Kothari , 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: gu\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug." +"cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-11-02 14:00+0000\n" +"PO-Revision-Date: 2012-11-05 11:32+0530\n" +"Last-Translator: \n" +"Language-Team: gu_IN \n" +"Language: \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" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ને ખૂબ મોટી ગણક કિંમત પસાર કરેલ છે" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#, fuzzy +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "સ્ટ્રીમ પર પહોંચવાનું આધારભૂત નથી" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream કાપી શકાતુ નથી" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "સ્ટ્રીમ પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#, fuzzy +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "સ્ટ્રીમ પર કાપવાનું માન્ય નથી" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "પ્રક્રિયા રદ થઈ ગઈ હતી" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "અયોગ્ય ઓબ્જેક્ટ, પ્રારંભ થયેલ નથી" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ઇનપુટમાં અસંપૂર્ણ મલ્ટીબાઇટ કતાર" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "લક્ષ્યમાં પૂરતી જગ્યા નથી" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1584 ../glib/giochannel.c:1626 +#: ../glib/giochannel.c:2470 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "રુપાંતર ઈનપુટની બાઇડ શ્રેણી અપ્રમાણીત છે" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1591 ../glib/giochannel.c:2482 +#, c-format +msgid "Error during conversion: %s" +msgstr "રુપાંતર વખતે ભૂલ: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "રદ કરી શકાય તેવુ પ્રારંભ આધારભૂત નથી" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1412 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' અક્ષર સમૂહમાંથી '%s' માં રુપાંતરણ માટે આધાર નથી" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' માંથી '%s' માટેનો પરીવર્તક ખોલી શકતો નથી" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s પ્રકાર" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "અજ્ઞાત પ્રકાર" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ફાઈલપ્રકાર" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials એ આ OS પર અમલીકરણ થયેલ નથી" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "તમારાં પ્લેટફોર્મ માટે GCredentials આધાર નથી" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "સ્ટ્રીમનો-અંત અનિચ્છનીય રીતે જલદી" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "બિનઆધારિત સોકેટ સરનામું" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "સરનામું `%s' અમાન્ય છે (ફક્ત એક પાથની જરૂર છે, tmpdir અથવા ઍબસ્ટ્રેક કી)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "સરનામાં નોંધણી `%s' માં મતલબવગરની કી/કિંમત જોડી સંયોજન" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "સરનામું `%s' માં ભૂલ - પોર્ટ ગુણધર્મ મેલફોર્મ થયેલ છે" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "સરનામું `%s' માં ભૂલ - કુટુંબ ગુણધર્મ મેલફોર્મ થયેલ છે" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "સરનામાં ઘટક `%s' વિરામચિહ્ન (:) ને સમાવતુ નથી" + +#: ../gio/gdbusaddress.c:475 +#, fuzzy, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "સરનામાં ઘટક `%s' વિરામચિહ્ન (:) ને સમાવતુ નથી" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "સરનામાં `%s' માં ભૂલ - યજમાન ગુણધર્મ ગેરહાજર અથવા મેલફોર્મ થયેલ છે" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "સરનામાં `%s' માં ભૂલ - પોર્ટ ગુણધર્મ ગેરહાજર અથવા મેલફોર્મ થયેલ છે" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "સરનામાં `%s' માં ભૂલ - noncefile ગુણધર્મ ગેરહાજર અથવા મેલફોર્મ થયેલ છે" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "સ્વયં શરૂ કરી રહ્યા હોય ત્યારે ભૂલ: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "સરનામું `%s' માટે અજ્ઞાત અથવા બિનઆધારભૂત ટ્રાન્સપોર્ટ `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "nonce ફાઇલ `%s' ને ખોલી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "nonce ફાઇલ `%s' માંથી વાંચી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusaddress.c:723 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "સ્ટ્રીમમાં nonce ફાઇલ `%s' નાં સમાવિષ્ટોને લખી રહ્યા હોય ત્યારે ભૂલ:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "આપેલ સરનામું ખાલી છે" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1079 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(આ વિન્ડોને બંધ કરવા માટે કોઇપણ અક્ષરને ટાઇપ કરો)\n" + +#: ../gio/gdbusaddress.c:1419 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "સત્ર dbus ચાલી રહ્યુ નથી, અને autolaunch નિષ્ફળ" + +#: ../gio/gdbusaddress.c:1440 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "સત્ર બસ સરનામાંને નક્કી કરી શકાતુ નથી (આ OS માટે અમલીકરણ થયેલ નથી)" + +#: ../gio/gdbusaddress.c:1539 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1548 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1558 +#, c-format +msgid "Unknown bus type %d" +msgstr "અજ્ઞાત બસ પ્રકાર %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "જ્યારે ડિરેક્ટરી `%s' માટે જાણકારીને મેળવી રહ્યા હોય ત્યારે ભૂલ : %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "ડિરેક્ટરી `%s' ને બનાવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "વાંચવા માટે કીરીંગ `%s' ને ખોલી રહ્યા હોય ત્યારે ભૂલ: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "તાળુ ફાઇલ `%s' ને બનાવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(કડી ન થયેલ) તાળુ ફાઇલ `%s' ને બંધ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "તાળુ ફાઇલ `%s' કડી ન કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "લખવા માટે કીરીંગ `%s' ને ખોલી રહ્યા હોય ત્યારે ભૂલ: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "જોડાણ બંધ થયેલ છે" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "સમયસમાપ્તિ પહોંચી ગઇ" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "બિનઆધારભૂત ફ્લેગ મળ્યો જ્યારે ક્લાઇન્ટ બાજુનું જોડાણને બંધારિત કરી રહ્યા હોય" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "પાથ %s પર ઓબ્જેક્ટ પર આવો ઇન્ટરફેસ `org.freedesktop.DBus.Properties' નથી" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "ગુણધર્મ `%s' સુયોજિત કરતી વખતે ભૂલ: ઇચ્છિત પ્રકાર `%s' પરંતુt `%s' મળ્યુ" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "આવો પ્રૉપર્ટી `%s' નથી" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "ગુણધર્મ `%s' વાંચી શકાય તેમ નથી" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "ગુણધર્મ `%s' લખી શકાય તેમ નથી" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "આવો ઇન્ટરફેસ `%s' નથી" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "આવો ઇન્ટરફેસ નથી" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "પાથ %s પર ઑબ્જેક્ટ પર આવો ઇન્ટરફેસ `%s' નથી" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "આવી પદ્દતિ `%s' નથી" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "સંદેશા `%s' નો પ્રકાર, ઇચ્છિત પ્રકાર `%s' બંધબેસતુ નથી" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "ઓબ્જેક્ટ એ %s પર ઇન્ટરફેસ %s માટે પહેલેથી જ નિકાસ થયેલ છે" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "હસ્તાક્ષર `%s' સાથે ઇન્ટરફેસ `%s' પર પદ્દતિ `%s' અસ્તિત્વ ધરાવતુ નથી" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "સબટ્રી પહેલેથી %s માટે નિકાસ થયેલ છે" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "પ્રકાર INVALID છે" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL સંદેશો: PATH અથવા MEMBER હેડર ક્ષેત્ર ગેરહાજર છે" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN સંદેશો: REPLY_SERIAL હેડર ક્ષેત્ર ગેરહાજર છે" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR સંદેશો: REPLY_SERIAL અથવા ERROR_NAME હેડર ક્ષેત્ર ગેરહાજર છે" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL સંદેશો: PATH, INTERFACE અથવા MEMBER હેડર ક્ષેત્ર ગેરહાજર છે" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL સંદેશો: PATH હેડર ક્ષેત્ર આરક્ષિત કિંમત /org/freedesktop/DBus/Local ને વાપરી રહ્યા " +"છે" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL સંદેશો: INTERFACE હેડર ક્ષેત્ર એ આરક્ષિત કિંમત org.freedesktop.DBus.Local ને વાપરી " +"રહ્યા છે" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu બાઇટને વાંચવાની ઇચ્છા રાખેલ છે પરંતુ EOF મળ્યુ" +msgstr[1] "%lu બાઇટને વાંચવાની ઇચ્છા રાખેલ છે પરંતુ EOF મળ્યુ" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "શબ્દમાળા `%s' પછી ઇચ્છિત NUL બાઇટ પરંતુ બાઇટ %d મળ્યુ" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "પદચ્છેદન થયેલ કિંમત `%s' એ યોગ્ય D-Bus ઓબ્જેક્ટ પાથ નથી" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "પદચ્છેદન થયેલ `%s' એ યોગ્ય D-Bus હસ્તાક્ષર નથી" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "અયોગ્ય endianness કિંમત. ઇચ્છિત 0x6c ('l') અથવા 0x42 ('B') પરંતુ કિંમત 0x%02x મળી" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "અયોગ્ય મુખ્ય પ્રોટોકોલ આવૃત્તિ. ઇચ્છિત 1 પરંતુ %d મળ્યુ" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2932 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ફાઈલમાં લખવામાં ભૂલ: %s" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "હાર્ડવેર રૂપરેખાને મેળવવાનુ અસમર્થ: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id અથવા /etc/machine-id લાવવાનું અસમર્થ: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s માટે StartServiceByName કોલ કરતી વખતે ભૂલ: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "અનિચ્છનીય જવાબ %d StartServiceByName(\"%s\") પદ્દતિમાંથી" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"પદ્દતિને બોલાવી શકાતી નથી; પ્રોક્સી એ માલિક વગર સારી રીતે જાણીતી છે અને પ્રોક્સી " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ફ્લેગ સાથે બંધારિત થયેલ હતુ" + +#: ../gio/gdbusserver.c:708 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "કચરાપેટી આધારભૂત નથી" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "nonce ફાઇલને સ્પષ્ટ કરી શકાતુ નથી જ્યારે સર્વરને બનાવી રહ્યા છે" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' પર nonce ફાઇલને લખી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "શબ્દમાળા `%s' એ યોગ્ય D-Bus GUID નથી" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "બિનઆધારભૂત ટ્રાન્સપોર્ટ `%s' પર સાંભળી શકાતુ નથી" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "ભૂલ: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "ભૂલ પદચ્છેદન વિકલ્પ %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "સિસ્ટમ બસ સાથે જોડાવો" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "સત્ર બસ સાથે જોડાવો" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "આપેલ D-Bus સરનામાં જોડાવ" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "એન્ડપોઇંટ વિકલ્પોનું જોડાણ:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "વિકલ્પો જોડાણ અંતિમબિંદુને સ્પષ્ટ કરી રહ્યા છે" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "જોડાણ એન્ડપોઇંટ સ્પષ્ટ થયેલ નથી" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "ઘણાં જોડાણ એન્ડપોઇંટ સ્પષ્ટ થયેલ છે" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "સંકેત માટે વૈકલ્પિક લક્ષ્ય (અનન્ય નામ)" + +#: ../gio/gdbus-tool.c:535 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "મોનિટર કરવા માટે ઑબ્જેક્ટ પાથ" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "સંકેત અને ઇન્ટરફેસ નામ" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "જોડાઇ રહ્યા હોય ત્યારે ભૂલ: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "ભૂલ: ઑબ્જેક્ટ પાથ સ્પષ્ટ થયેલ નથી.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "ભૂલ: %s એ યોગ્ય ઑબ્જેક્ટ પાથ નથી\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "ભૂલ: સંકેત સ્પષ્ટ થયેલ નથી.\n" + +#: ../gio/gdbus-tool.c:632 +#, fuzzy, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "ભૂલ: સંકેત સ્પષ્ટ થયેલ નથી.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ભૂલ: %s એ યોગ્ય ઇન્ટરફેસ નામ નથી\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ભૂલ: %s એ યોગ્ય સભ્ય નામ નથી\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ભૂલ: %s એ યોગ્ય અનન્ય બસ નામ નથી.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "પરિમાણ %d ને પદચ્છેદન કરતી વખતે ભૂલ: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "જોડાણને સ્વીકારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "તેની પર પદ્દતિ બોલાવવા માટે લક્ષ્ય નામ" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "તેની પર પદ્દતિને બોલાવવા માટે ઓબ્જેક્ટ પાથ" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "પદ્દતિ અને ઇન્ટરફેસ નામ" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "સેકંડોમાં સમયસમાપ્તિ" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "દૂરસ્થ ઓબ્જેક્ટ પર પદ્દતિને બોલાવો." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "ભૂલ: લક્ષ્ય સ્પષ્ટ થયેલ નથી\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "ભૂલ: ઑબ્જેક્ટ પાથ સ્પષ્ટ થયેલ નથી\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "ભૂલ: પદ્દતિ નામ સ્પષ્ટ થયેલ નથી\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "ભૂલ: પદ્દતિ નામ `%s' અયોગ્ય છે\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "પરિમાણ %d પ્રકાર `%s' નાં પદચ્છેદન કરતી વખતે ભૂલ: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "નિરીક્ષા કરવા માટે લક્ષ્ય નામ" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "નિરીક્ષા કરવા માટે ઓબ્જેક્ટ પાથ" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML છાપો" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "ફક્ત પ્રિન્ટ ગુણધર્મો" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "દૂરસ્થ ઓબ્જેક્ટનું નિરીક્ષણ કરો." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "મોનિટર કરવા માટે લક્ષ્ય પાથ" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "મોનિટર કરવા માટે ઑબ્જેક્ટ પાથ" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "દૂરસ્થ ઑબ્જેક્ટને મોનિટર કરો." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "શીર્ષકવીહિન" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "ડેસ્કટોપ ફાઈલે Exec ક્ષેત્ર સ્પષ્ટ કરેલ નથી" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "કાર્યક્રમ માટે જરૂરી ટર્મિનલ શોધવામાં અસમર્થ" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "વપરાશકર્તા કાર્યક્રમ રૂપરેખાંકન ફોલ્ડર %s બનાવી શક્યા નહિં: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "વપરાશકર્તા MIME રૂપરેખાંકન ફોલ્ડર %s બનાવી શક્યા નહિં: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "વપરાશકર્તા ડેસ્કટોપ ફાઈલ %s બનાવી શકતા નથી" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s માટે વૈવિધ્યપૂર્ણ વ્યાખ્યા" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ડ્રાઇવ એ eject અથવા eject_with_operation નું અમલીકરણ કરતુ નથી" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ડ્રાઈવ મીડિયા માટે પોલીંગને અમલમાં મૂકતું નથી" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ડ્રાઈવ શરૂ કરો નું અમલીકરમ કરતુ નથી" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ડ્રાઇવ એ બંધ કરોનું અમલીકરણ કરતુ નથી" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS આધાર ઉપલબ્ધ નથી" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem એનકોડીંગ ની આવૃત્તિ %d ને સંભાળી શકાતી નથી" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem એનકોડીંગ માં ટોકનો (%d) ની મેલફોર્મ થયેલ નંબર" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon એનકોડીંગ નાં આવૃત્તિ %d ને સંભાળી શકાતી નથી" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon એનકોડીંગ માં ટોકનો (%d) ની મેલફોર્મ થયેલ નંબર" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon માટે GEmblem એ અપેક્ષિત છે" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7214 ../gio/gfile.c:7304 ../gio/gfile.c:7388 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "સમાવનાર માઉન્ટ અસ્તિત્વમાં નથી" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "ડિરેક્ટરી ઉપર નકલ કરી શકતા નથી" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "ડિરેક્ટરીને ડિરેક્ટરી ઉપર નકલ કરી શકતા નથી" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "લક્ષ્ય ફાઈલ અસ્તિત્વમાં નથી" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "પુનરાવર્તિત રીતે ડિરેક્ટરીની નકલ કરી શકતા નથી" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "જોડવાનું આધારભૂત નથી" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "ફાઈલ ને જોડવામાં ભૂલ: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "વિશિષ્ટ ફાઇલ ની નકલ કરી શકતા નથી" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "અયોગ્ય સાંકેતિક કડી કિંમત અપાયેલ છે" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "કચરાપેટી આધારભૂત નથી" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ફાઈલ નામો '%c' સમાવી શકતા નથી" + +#: ../gio/gfile.c:6279 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "વોલ્યુમ માઉન્ટ અમલમાં મૂકતું નથી" + +#: ../gio/gfile.c:6387 +msgid "No application is registered as handling this file" +msgstr "આ ફાઈલ સંભાળવા માટે કોઈ કાર્યક્રમ રજીસ્ટર થયેલ નથી" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ઈન્યૂમેરેટર બંધ થયેલ છે" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "ફાઈલ ઈન્યૂમેરેટરને ભરપૂર પ્રક્રિયા છે" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "સ્ટ્રીમ query_info ને આધાર આપતું નથી" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "સ્ટ્રીમ પર પહોંચવાનું આધારભૂત નથી" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "ઈનપુટ સ્ટ્રીમ પર કાપવાનું માન્ય નથી" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "સ્ટ્રીમ પર કાપવાનું માન્ય નથી" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ટોકનો (%d) નાં ખોટા નંબર" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "વર્ગ નામ %s માટે પ્રકાર નથી" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "પ્રકાર %s એ GIcon ઇન્ટરફેસ ને અમલમાં મૂકતો નથી" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "પ્રકાર %s એ વર્ગ થયેલ નથી" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "મેલફોર્મ થયેલ આવૃત્તિ નંબર: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "પ્રકાર %s એ GIcon ઇન્ટરફેસ પર tokens() માંથી અમલીકરણ થતુ નથી (_t)" + +#: ../gio/gicon.c:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "આઇકોન એનકોડીંગ ની પૂરી પાડેલ આવૃત્તિ ને સંભાળી શકાતી નથી" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "સરનામું સ્પષ્ટ થયેલ નથી" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "લંબાઇ %u સરનામાં માટે ઘણુ લાંબુ છે" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "IP સરનામાં માસ્ક તરીકે '%s' નુ પદચ્છેદન કરી શક્યા નહિં" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "સોકેટ સરનામાં માટે પૂરતી જગ્યા નથી" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "બિનઆધારિત સોકેટ સરનામું" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "સ્ટ્રીમને ભરપૂર પ્રક્રિયા છે" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "ઘટક <%s> અંદર પરવાનગી થયેલ નથી <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "ઘટક <%s> ઊંચા સ્તરે પરવાનગી થયેલ નથી" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "ફાઇલ %s એ સ્ત્રોતમાં ઘણો સમય દેખાય છે" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "કોઇપણ સ્ત્રોત ડિરેક્ટરીમાં '%s' ને સ્થિત કરવામાં નિષ્ફળતા" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "વર્તમાન ડિરેક્ટરીમાં '%s' ને સ્થિત કરવામાં નિષ્ફળતા" + +#: ../gio/glib-compile-resources.c:287 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "અજ્ઞાત પ્રક્રિયા વિકલ્પ \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:366 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "temp ફાઇલને બનાવવામાં નિષ્ફળતા: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint સાથે ઇનપુટ ફાઇલની પ્રક્રિયા કરી રહ્યા હોય ત્યારે ભૂલ:\n" +"%s" + +#: ../gio/glib-compile-resources.c:392 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" + +#: ../gio/glib-compile-resources.c:406 +#, c-format +msgid "Error reading file %s: %s" +msgstr "ફાઇલ %s ને વાંચી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/glib-compile-resources.c:426 +#, c-format +msgid "Error compressing file %s" +msgstr "ફાઇલ %s ને સંકોચી રહ્યા હોય ત્યારે ભૂલ" + +#: ../gio/glib-compile-resources.c:490 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "લખાણ કદાચ <%s> માં દેખાશે નહિં" + +#: ../gio/glib-compile-resources.c:613 +msgid "name of the output file" +msgstr "આઉટપુટ ફાઇલનુ નામ" + +#: ../gio/glib-compile-resources.c:613 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:614 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:614 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "લક્ષ્ય ફાઇલનામ ઍક્સટેન્શન દ્દારા પસંદ થયેલ બંધારણમાં આઉટપુટ ઉત્પન્ન કરો" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate source header" +msgstr "સ્ત્રોત હેડરને ઉત્પન્ન કરો" + +#: ../gio/glib-compile-resources.c:617 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "તમારા કોડમાં સ્ત્રોત ફાઇલમાં કડી કરવા માટે વાપરેલ સ્ત્રોતકોડને ઉત્પન્ન કરો" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:619 +msgid "Don't automatically create and register resource" +msgstr "સ્ત્રોતને આપમેળે બનાવી અને રજીસ્ટર કર્યુ નહિં" + +#: ../gio/glib-compile-resources.c:620 +msgid "C identifier name used for the generated source code" +msgstr "ઉત્પન્ન થયેલ સ્ત્રોત કરો માટે વાપરેલ C ઓળખકર્તા નામ" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "તમારે એક ડિરેક્ટરી નામ આપવુ જ જોઇએ\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "ખાલી નામોને પરવાનગી આપેલ નથી" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "અયોગ્ય નામ '%s': નામો નાનાં અક્ષરોથી જ શરૂ થવા જોઇએ" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"અયોગ્ય નામ '%s': અયોગ્ય અક્ષર '%c'; ફક્ત નાનાં અક્ષરો, નંબરો" +"અને હાઇફન ('-') ની પરવાનગી મળેલ છે." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "અમાન્ય નામ '%s': છેલ્લો અક્ષર હાઇફન ('-') હોઇ શકે નહિં." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "અયોગ્ય નામ '%s': મહત્તમ લંબાઇ 1024 છે" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " પહેલેથી જ સ્પષ્ટ થયેલ છે" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "'list-of' યોજનામાં કીઓને ઉમેરી શકાતી નથી" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " પહેલેથી સ્પષ્ટ થયેલ છે" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" માં શૅડો ; કિંમતને બદલવા માટે " +"વાપરો" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> હજુ વ્યાખ્યાયિત નથી." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "અમાન્ય GVariant પ્રકાર શબ્દમાળા '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " આપેલ છે પરંતુ યોજના કંઇપણ વિસ્તારતુ નથી" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " પહેલેથી સ્પષ્ટ થયેલ છે" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " પહેલેથી સ્પષ્ટ થયેલ છે" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "પાથ સાથે યોજનાની યાદી કરી શકાતી નથી" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "પાથ સાથે યોજનાને વિસ્તારી શકાતુ નથી" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr " એક યાદી છે, ને વિસ્તારી રહ્યા છે કે જે યાદી નથી" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" એ ને વિસ્તારે છે પરંતુ '%s' એ " +"'%s' ને વિસ્તારતુ નથી" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "પાથ જો આપેલ હોય તો સ્લેશ સાથે શરૂ અને અંત હોવો જોઇએ" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "યાદીનો પાથે ':/' સાથે અંત થવો જ જોઇએ" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> પહેલેથી જ સ્પષ્ટ થયેલ છે" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "ટોચ સ્તરે ઘટક <%s> પરવાનગી મળેલ નથી" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "આખી ફાઇલને અવગણી દેવામાં આવી છે.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "આ ફાઇલને અવગણી રહ્યા છે.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ફાઇલને ક્યાં સંગ્રહવુ" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled ફાઇલને લખો નહિં" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "તમારે એક ડિરેક્ટરી નામ આપવુ જ જોઇએ\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "યોજના ફાઇલો મળી નથી: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "કઇ જ કરી રહ્યા નથી.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "હાલની આઉટપુટ ફાઇલને દૂર કરેલ છે.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "મૂળભૂત સ્થાનિક ડિરેક્ટરી મોનીટર પ્રકાર શોધવામાં અસમર્થ" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "અયોગ્ય ફાઈલનામ %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ફાઈલસિસ્ટમ જાણકારી મેળવવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "રુટ ડિરેક્ટરીનું નામ બદલી શકતા નથી" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "ફાઈલનું નામ બદલવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "ફાઈલનું નામ બદલી શકતા નથી, ફાઈલનામ પહેલાથી જ હાજર છે" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "અયોગ્ય ફાઈલનામ" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "ડિરેક્ટરી ખોલી શકતા નથી" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "ફાઈલ ખોલવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "ફાઈલ દૂર કરવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "ફાઈલને કચરાપેટીમાં નાંખવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "કચરાપેટી ડિરેક્ટરી %s બનાવવામાં અસમર્થ: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "કચરાપેટી માટે ટોચસ્તરની ડિરેક્ટરી શોધવામાં અસમર્થ" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "કચરાપેટી ડિરેક્ટરી શોધવામાં કે બનાવવામાં અસમર્થ" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "કચરાપેટી જાણકારી ફાઈલ બનાવવામાં અસમર્થ: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ફાઈલને કચરાપેટીમાં મોકલવામાં અસમર્થ: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "આંતરિક ભૂલ" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "ડિરેક્ટરી બનાવવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ફાઇલસિસ્ટમ એ સાંકેતિક કડીને આધાર આપતુ નથી" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "સાંકેતિક કડી બનાવવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "ફાઈલ ખસેડવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "ડિરેક્ટરીને ડિરેક્ટરી ઉપર ખસેડી શકતા નથી" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "બેકઅપ ફાઈલ બનાવટ નિષ્ફળ" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "લક્ષ્ય ફાઈલ દૂર કરવામાં ભૂલ: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "માઉન્ટો વચ્ચે ખસેડવાનું આધારભૂત નથી" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "લક્ષણ કિંમત બિન-શૂન્ય જ હોવી જોઈએ" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (શબ્દમાળા ઈચ્છિત)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "અયોગ્ય વિસ્તૃત લક્ષણ નામ" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "વિસ્તૃત લક્ષણ '%s' સુયોજીત કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:1434 +msgid " (invalid encoding)" +msgstr " (અયોગ્ય સંગ્રહપદ્ધતિ)" + +#: ../gio/glocalfileinfo.c:1628 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "જ્યારે ફાઇલ '%s' માટે જાણકારીને મેળવી રહ્યા હોય ત્યારે ભૂલ : %s" + +#: ../gio/glocalfileinfo.c:1863 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "જ્યારે ફાઇલ વર્ણનકર્તા માટે જાણકારીને મેળવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:1908 +msgid "Invalid attribute type (uint32 expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (uint32 ઈચ્છિત)" + +#: ../gio/glocalfileinfo.c:1926 +msgid "Invalid attribute type (uint64 expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (uint64 ઈચ્છિત)" + +#: ../gio/glocalfileinfo.c:1945 ../gio/glocalfileinfo.c:1964 +msgid "Invalid attribute type (byte string expected)" +msgstr "અયોગ્ય લક્ષણ પ્રકાર (બાઈટ શબ્દમાળા ઈચ્છિત)" + +#: ../gio/glocalfileinfo.c:1999 +msgid "Cannot set permissions on symlinks" +msgstr "સંકેત કડીઓ પર પરવાનગીઓને સુયોજિત કરી શકાતી નથી" + +#: ../gio/glocalfileinfo.c:2015 +#, c-format +msgid "Error setting permissions: %s" +msgstr "પરવાનગીઓ સુયોજીત કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:2066 +#, c-format +msgid "Error setting owner: %s" +msgstr "માલિક સુયોજીત કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:2089 +msgid "symlink must be non-NULL" +msgstr "સાંકેતિક કડી non-NULL જ હોવી જોઈએ" + +#: ../gio/glocalfileinfo.c:2099 ../gio/glocalfileinfo.c:2118 +#: ../gio/glocalfileinfo.c:2129 +#, c-format +msgid "Error setting symlink: %s" +msgstr "સાંકેતિક કડી સુયોજીત કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:2108 +msgid "Error setting symlink: file is not a symlink" +msgstr "સાંકેતિક કડી સુયોજીત કરવામાં ભૂલ: ફાઈલ સાંકેતિક કડી નથી" + +#: ../gio/glocalfileinfo.c:2234 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "બદલાવ અથવા પ્રવેશ સમય ને સુયોજન કરતી વખતે ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:2257 +msgid "SELinux context must be non-NULL" +msgstr "SELinux સંદર્ભ non-NULL જ હોવી જોઈએ" + +#: ../gio/glocalfileinfo.c:2272 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux સંદર્ભ ને સુયોજન કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileinfo.c:2279 +msgid "SELinux is not enabled on this system" +msgstr "SELinux એ આ સિસ્ટમ પર સક્રિય થયેલ નથી" + +#: ../gio/glocalfileinfo.c:2371 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "લક્ષણ %s સુયોજીત કરવાનું આધારભૂત નથી" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "ફાઈલમાંથી વાંચવામાં ભૂલ: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ફાઈલમાં પહોંચવામાં ભૂલ: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ફાઈલ બંધ કરવામાં ભૂલ: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "મૂળભૂત સ્થાનિક ફાઈલ મોનીટર પ્રકાર શોધવામાં અસમર્થ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "ફાઈલમાં લખવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "જૂની બેકઅપ કડી દૂર કરવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "બેકઅપ નકલ બનાવવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "કામચલાઉ ફાઈલનું નામ બદલવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "ફાઈલ કાપવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ફાઈલ '%s' ખોલવામાં ભૂલ: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "લક્ષ્ય ફાઈલ ડિરેક્ટરી છે" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "લક્ષ્ય ફાઈલ નિયમિત ફાઈલ નથી" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ફાઈલ બાહ્ય રીતે સુધારેલ હતી" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "જૂની ફાઇલને દૂર કરવા દરમ્યાન ભૂલ: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "અયોગ્ય GSeekType પૂરું પાડેલ" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "અયોગ્ય પહોંચ અરજી" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream કાપી શકતા નથી" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "મેમરી આઉટપુટ સ્ટ્રીમનું માપ બદલી શકાય તેમ નથી" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "મેમરી આઉટપુટ સ્ટ્રીમનું માપ બદલવામાં નિષ્ફળ" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "લખવાની પ્રક્રિયા કરવા માટે જરૂરી મેમરી ઉપલબ્ધ જગ્યા કરતા વધારે છે" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "સ્ટ્રીમને શરૂ કરતા પહેલાં સીક સૂચના શોધેલ છે" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "માઉન્ટ એ સમાવિષ્ટ પ્રકાર અંદાજિત કરવાનું એકી સાથે અમલીકરણ કરતુ નથી" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "યજમાનનામ '%s' સમાવે છે '[' પરંતુ નથી ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "નેટવર્ક પહોંચી શકે તેમ નથી" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "યજમાન પહોંચી શકે તેમ નથી" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "નેટવર્ક મોનિટરને બનાવી શક્યા નહિં: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "નેટવર્ક મોનિટરને બનાવી શક્યા નહિં: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "નેટવર્ક પરિસ્થિતિને મેળવી શક્યા નહિં: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "આઉટપુટ સ્ટ્રીમ લેખનને અમલમાં મૂકતું નથી" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "સ્રોત સ્ટ્રીમ પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: ../gio/gresolver.c:912 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ને સુધારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gresolver.c:962 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ને વિપરીત-સુધારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gresolver.c:1165 ../gio/gresolver.c:1364 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' માટે સૂચિત પ્રકારનો DNS અહેવાલ નથી" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ને સુધારવા માટે થોડા વખત અસમર્થ" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ને સુધારી રહ્યા હોય ત્યારે ભૂલ" + +#: ../gio/gresolver.c:1203 ../gio/gresolver.c:1264 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s' માટે અપૂરતી માહિતી મળેલ છે" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' પર સ્ત્રોત અસ્તિત્વ ધરાવતુ નથી" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s' પર સ્ત્રોત ડિરેક્ટરી નથી" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "ઈનપુટ સ્ટ્રીમ વાંચનને અમલમાં મૂકતું નથી" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "મદદને છાપો" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "stdout માં સ્ત્રોત ફાઇલનો અર્ક કાઢો" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"અજ્ઞાત આદેશ %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"વપરાશ:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "દલીલો:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND વર્ણન કરવા માટે (વૈકલ્પિક) આદેશ\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH સ્ત્રોત પાથ\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "આવી યોજના '%s' નથી\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "યોજના '%s' પુન:સ્થિત કરાતુ નથી (પાથને સ્પષ્ટ કરવો જોઇએ નહિં)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "ખાલી પાથ આપેલ છે.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "પાથ સ્લેશ (/) સાથે શરૂ થવુ જ જોઇએ\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "પાથ સ્લેશ (/) સાથે બંધ થવો જ જોઇએ\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "આવી કી '%s' નથી\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "પૂરી પાડેલ કિંમત માન્ય સીમાની બહાર છે\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA માં કીઓની યાદી કરો" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "SCHEMA નાં બાળકોની યાદી કરો" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "KEY ની કિંમતને મેળવો" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "VALUE માટે KEY ની કિંમત સુયોજિત કરો" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "તેની મૂળભૂત કિંમતમાં KEY ને પુન:સુયોજિત કરો" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "તેનાં મૂળભૂતોમાં SCHEMA માં બધા કીઓને પુન:સુયોજિત કરો" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "ચકાસો જો KEY લખી શકાય તેમ છે" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"વપરાશ:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY યોજનામાં (વૈકલ્પિક) કી\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY યોજનામાં કી\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE સુયોજિત કરવા માટે કિંમત\n" + +#: ../gio/gsettings-tool.c:781 +#, c-format +msgid "Empty schema name given\n" +msgstr "ખાલી યોજના નામ આપેલ છે\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "અયોગ્ય સોકેટ, પ્રારંભ થયેલ નથી" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "અયોગ્ય સોકેટ, દરમ્યાન પ્રારંભ નિષ્ફળ: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "સોકેટ પહેલેથી જ બંધ થયેલ છે" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "સોકેટ I/O સમય સમાપ્તિ" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd માંથી GSocket ને બનાવી રહ્યા છે: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "સોકેટ ને બનાવવામાં અસમર્થ: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "અજ્ઞાત કુટુંબ સ્પષ્ટ થયેલ ન હતુ" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "અજ્ઞાત પ્રોટોકોલ સ્પષ્ટ થયેલ હતુ" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "સ્થાનિય સરનામાંને મેળવી શકાયુ નહિં: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "દૂરસ્થ સરનામાંને મેળવી શકાયુ નહિં: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "સાંભળી શકાયુ નહિં: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "સરનામાંને બાઇન્ડ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "મલ્ટીકાસ્ટ જૂથને જોડી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "મલ્ટીકાસ્ટ જૂથને છોડી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "જોડાણને સ્વીકારી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "જોડાણ પ્રગતિમાં છે" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "પેન્ડિંગ ભૂલ ને મેળવવામાં અસમર્થ: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "માહિતી મેળવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "માહિતી મોકલી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "સોકેટને બંધ કરવાનું અમસર્થ: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "સોકેટને બંધ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "સોકેટ શરત માટે રાહ જોઇ રહ્યા છે: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "સંદેશો મોકલી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage એ Windows પર આધારભૂત નથી" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "ભૂલ મેળવી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials આ OS માટે અમલીકરણ થયેલ નથી" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "પ્રોક્સી સર્વર %s સાથે જોડી શક્યા નહિં: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s સાથે જોડી શક્યા નહિં: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "જોડી શક્યા નહિં: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "જોડાણ પર અજ્ઞાત ભૂલ" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "બિન-TCP જોડાણ પર પ્રોક્સીંગ આધારભૂત નથી." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "પ્રોક્સી પ્રોટોકોલ '%s' આધારભૂત નથી." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "સાંભળનાર પહેલાથી જ બંધ થઈ ગયેલ છે" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ઉમેરાયેલ સોકેટ બંધ થયેલ છે" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 એ IPv6 સરનામું '%s' ને આધાર આપતુ નથી" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 પ્રોટોકોલ માટે વપરાશકર્તાનામ ઘણું લાંબુ છે." + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 પ્રોટોકોલ માટે યજમાનનામ '%s' ઘણુ લાંબુ છે" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "સર્વર SOCKSv4 પ્રોક્સી સર્વર નથી." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 સર્વર મારફેત જોડાણ રદ કરેલ હતુ" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "સર્વર SOCKSv5 પ્રોક્સી સર્વર નથી." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 પ્રોક્સીને સત્તાધિકરણની જરૂર છે." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 પ્રોક્સીને સત્તાધિકરણ પદ્દતિની જરૂર છે કે જે GLib દ્દારા આધારભૂત નથી." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 પ્રોટોકોલ માટે વપરાશકર્તાનામ અથવા પાસવર્ડ ઘણુ લાંબુ છે." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "ખોટો વપરાશકર્તાનામ અથવા પાસવર્ડ આપવા દરમ્યાન SOCKSv5 સત્તાધિકરણ નિષ્ફળ." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 પ્રોટોકોલ માટે યજમાનનામ '%s' ઘણુ લાંબુ છે" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 પ્રોક્સી સર્વર અજ્ઞાત સરનામાં પ્રકારને વાપરે છે." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "આંતરિક SOCKSv5 પ્રોક્સી સર્વર ભૂલ." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 જોડાણ ruleset દ્દારા પરવાનગી થયેલ નથી." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 સર્વર મારફતે પહોંચી ન શકાય તેવુ યજમાનનામ." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 પ્રોક્સી મારફતે ન પહોંચી શકાય તેવુ નેટવર્ક." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 પ્રોક્સી મારફતે રદ કરાયેલ જોડાણ." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 પ્રોક્સી 'connect' આદેશને આધાર આપતુ નથી." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 પ્રોક્સી પૂરુ પાડેલ સરનામાં પ્રકારને આધાર આપતુ નથી." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "અજ્ઞાત SOCKSv5 પ્રોક્સી ભૂલ." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon એનકોડીંગ ની આવૃત્તિ %d ને સંભાળી શકાતુ નથી" + +#: ../gio/gtlscertificate.c:248 +#| msgid "Could not parse PEM-encoded private key" +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-એનકોડ થયેલ ખાનગી કીને ડિક્રિપ્ટ કરી શકાતુ નથી" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "PEM-એનકોડ થયેલ ખાનગી કી મળી નથી" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-એનકોડ થયેલ ખાનગી કીનું પદચ્છેદન કરી શક્યા નહિં" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "PEM-એનકોડ થયેલ પ્રમાણપત્ર મળ્યુ નથી" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-એનકોડ થયેલ પ્રમાણપત્રનું પદચ્છેદન કરી શક્યા નહિં" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"તમારા પ્રવેશનું તાળુ થઇ જાય તે પહેલાં યોગ્ય રીતે પાસવર્ડને દાખલ કરવા માટે છેલ્લી અપેક્ષા " +"છે." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"દાખલ થયેલ ઘણાં પાસવર્ડ અયોગ્ય થઇ ગયા છે, અને તમારો પ્રવેશ આગળની નિષ્ફળતા પછી તાળુ મારેલ " +"હશે." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "દાખલ થયેલ પાસવર્ડ ખોટો છે." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:566 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "à«§ નિયંત્રણ સંદેશાની ઇચ્છા રાખી રહ્યા છે, %d મળ્યુ" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:576 +msgid "Unexpected type of ancillary data" +msgstr "ગૌણ માહિતીનો અનચ્છિનીય પ્રકાર" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "એક fd ની ઇચ્છા રાખી રહ્યા છે, પરંતુ %d મળ્યુ\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "મેળવેલ અયોગ્ય fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "શ્રેયને મોકલતી વખતે ભૂલ: " + +#: ../gio/gunixconnection.c:497 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "ચકાસી કરી રહ્યા હોય ત્યારે ભૂલ જો SO_PASSCRED સોકેટ માટે સક્રિય થયેલ છે: %s" + +#: ../gio/gunixconnection.c:506 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"અનિચ્છનીય વિકલ્પ લંબાઇ જ્યારે ચકાસી રહ્યા હોય જો SO_PASSCRED સોકેટ માટે સક્રિય થયેલ છે. " +"ઇચ્છિત %d bytes, %d મળ્યું" + +#: ../gio/gunixconnection.c:523 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED ને સક્રિય કરતી વખતે ભૂલ: %s" + +#: ../gio/gunixconnection.c:552 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:590 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "નિયંત્રણ સંદેશાની ઇચ્છા રાખી રહ્યા નથી, પરંતુ %d મળ્યુ" + +#: ../gio/gunixconnection.c:616 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "જ્યારે SO_PASSCRED નિષ્ક્રિય કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ફાઇલ વર્ણનકર્તામાંથી વાંચી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ફાઈલ વર્ણનકર્તાને બંધ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ફાઈલસિસ્ટમ રુટ" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ફાઈલ વર્ણનકર્તામાં લખી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gunixsocketaddress.c:244 +#, fuzzy +#| msgid "Abstract unix domain socket addresses not supported on this system" +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Abstract unix ડોમેઇન સરનામાંઓ આ સિસ્ટમ પર આધારભૂત નથી" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "વોલ્યુમ એ eject અથવા eject_with_operation ને અમલીકરણ કરતુ નથી" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "કાર્યક્રમ શોધી શકતા નથી" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "કાર્યક્રમ લાવતી વખતે ભૂલ: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIs આધારભૂત નથી" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "સંડોવણી ફેરફારો win32 પર આધારભૂત નથી" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "સંડોવણી બનાવટ win32 પર આધારભૂત નથી" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "સંચાલનમાંથી વાંચી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "સંચાલનને બંધ કરી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "સંચાલન માટે લખી રહ્યા હોય ત્યારે ભૂલ: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "પૂરતી મેમરી નથી" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "આંતરિક ભૂલ: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "વધારે ઇનપુટની જરૂર" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "અયોગ્ય સંકોચાયેલ માહિતી" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "તેની પર સાંભળવા માટે સરનામું" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "સરનામું છાપો" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "શેલ સ્થિતિમાં સરનામાંને છાપો" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "dbus સેવાને ચલાવો" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "ખોટી દલીલો\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "ઘટક '%s' માટે અનિચ્છનીય લક્ષણ '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ઘટક '%s' નું લક્ષણ '%s' મળ્યું નહિં" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "અનિચ્છનીય ટેગ '%s', ટેગ '%s' ઈચ્છિત" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "અનિચ્છનીય ટેગ '%s' એ '%s' માં" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "માહિતી ડિરેક્ટરીઓ માટે કોઈ માન્ય બુકમાર્ક ફાઈલ મળી નહિં" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' માટેની બુકમાર્ક પહેલાથી જ હાજર છે" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' માટે કોઈ બુકમાર્ક મળી નહિં" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ MIME પ્રકાર વ્યાખ્યાયિત નથી" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ ખાનગી ફ્લેગ વ્યાખ્યાયિત થયેલ નથી" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' માટે બુકમાર્કમાં કોઈ જૂથો સુયોજિત નથી" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' નામવાળા કોઈ કાર્યક્રમે '%s' માટે બુકમાર્ક રજીસ્ટર કરી નથી" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec લીટી '%s' ને URI '%s' સાથે વિસ્તારવામાં નિષ્ફળ" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "ઈનપુટ ના છેડા પર અપૂર્ણ અક્ષર શ્રેણી છે" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ફૈલબેક '%s' ને '%s' કોડના સમૂહમાં પરીવર્તિત કરી શકાતું નથી " + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' કે જે \"ફાઈલ\" યોજના વાપરે છે તે ચોક્કસ URI નથી" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "સ્થાનીય ફાઈલ URI '%s' માં કદાય '#' સમાવિષ્ટ નથી" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' URI અયોગ્ય છે" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URIનું યજમાનનુ નામ અયોગ્ય છે" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' URI અયોગ્ય બહાર નીકળવાના અક્ષરો ધરાવે છે " + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' પથ નામ એ ચોક્કસ પથ નથી" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "અયોગ્ય યજમાન નામ" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "જાન્યુઆરી" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ફેબ્રુઆરી" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "માર્ચ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "એપ્રિલ" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "મે" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "જુન" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "જુલાઇ" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ઑગસ્ટ" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "સેપ્ટેમ્બર" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ઑક્ટોબર" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "નવેમ્બર" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ડિસેમ્બર" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "જાન્યુઆરી" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ફેબ્રુઆરી" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "માર્ચ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "એપ્રિલ" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "મે" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "જુન" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "જુલાઇ" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ઑગસ્ટ" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "સેપ્ટેમ્બર" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ઑક્ટો" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "નવેમ્બર" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ડિસેમ્બર" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "સોમવાર" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "મંગળવાર" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "બુધવાર" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ગુરુવાર" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "શુક્રવાર" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "શનિવાર" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "રવિવાર" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "સોમ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "મંગળ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "બુધ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ગુરુ" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "શુક્ર" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "શનિ" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "રવિ" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ડિરેક્ટરી ખોલતા ભૂલ: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu બાઈટ \"%s\" ફાઈલ વાંચવા માટે આપવામાં આવતા નથી" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ફાઈલ વાંચતી વખતની ભૂલ: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ફાઇલ \"%s\" એ ઘણી વિશાળ છે" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ફાઈલમાંથી વાંચવામા નિષ્ફળતા: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા : %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ફાઈલની લાક્ષણિકતા મેળવતી વખતે નિષ્ફળતા: fstate() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ફાઈલ ખોલવામાં નિષ્ફળતા: fdopen() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ફાઈલ '%s' નું નામ '%s' માં બદલવામાં નિષ્ફળ: g_rename() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ફાઈલ બનાવવામાં નિષ્ફળતા : %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ફાઈલ '%s' ને લખવા માટે ખોલવામાં નિષ્ફળ: fdopen() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fwrite() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fflush() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ફાઈલ '%s' પર લખવામાં નિષ્ફળ: fsync() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ફાઈલ '%s' બંધ કરવામાં નિષ્ફળ: fclose() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "વર્તમાન ફાઈલ '%s' દૂર કરી શકાઈ નહિં: g_unlink() નિષ્ફળ: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr " '%s' ટેમ્પલેટ અયોગ્ય છે, તે '%s' ધરાવતું નથી" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ટેમ્પલેટ '%s' એ XXXXXX સમાવતું નથી" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' સાંકેતિક કડી વાંચવામાં નિષ્ફળતા: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "સાંકેતિક કડી આધાર આપતી નથી" + +#: ../glib/giochannel.c:1416 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' માંથી '%s' માટેનું રુપાંતરક ખોલી શકાયું નહિં: %s" + +#: ../glib/giochannel.c:1761 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_10_channe_lread_line_string માં આડી હરોળ માં વાંચી શકાતું નથી" + +#: ../glib/giochannel.c:1808 ../glib/giochannel.c:2066 +#: ../glib/giochannel.c:2153 +msgid "Leftover unconverted data in read buffer" +msgstr "" +"વાંચવા માટેના બફર(થોડા સમય માટેનું સંગ્રહસ્થાન) માં ઢાંકેલી ન હોય તે માહિતી છોડી દીધેલ છે" + +#: ../glib/giochannel.c:1889 ../glib/giochannel.c:1966 +msgid "Channel terminates in a partial character" +msgstr "માધ્યમ અપુર્ણ અક્ષરથી અંત પામે છે" + +#: ../glib/giochannel.c:1952 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end માં આડી હરોળ વાંચી શકાતી નથી" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "શોધ ડિરેક્ટરીઓમાં માન્ય કી ફાઈલ શોધી શક્યા નહિં" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "નિયમિત ફાઈલ નથી" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "કી ફાઈલ વાક્ય '%s' સમાવે છે કે જે કી-કિંમત જોડ, જૂથ, અથવા ટિપ્પણી નથી" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "અયોગ્ય જૂથ નામ: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "કી ફાઈલ જૂથ સાથે શરૂ થતી નથી" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "અયોગ્ય કી નામ: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "કી ફાઈલ બિનઆધારભૂત અક્ષર સંગ્રહપદ્ધતિ '%s' સમાવે છે" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "કી ફાઈલ પાસે જૂથ '%s' નથી" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "કી ફાઈલ પાસે કી '%s' નથી" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "કી ફાઈલ '%s' કીને કિંમત '%s' સાથે સમાવે છે કે જે UTF-8 નથી" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "કી ફાઈલ '%s' કી સમાવે છે કે જેની પાસે કિંમત છે જે ઈન્ટરપ્રીટ કરી શકાતી નથી." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, fuzzy, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"કી ફાઈલ '%s' કી જૂથ '%s' માં સમાવે છે કે જેની પાસે કિંમત છે કે જે ઈન્ટરપ્રીટ કરી શકાતી " +"નથી." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, fuzzy, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"કી ફાઈલ '%s' કી જૂથ '%s' માં સમાવે છે કે જેની પાસે કિંમત છે કે જે ઈન્ટરપ્રીટ કરી શકાતી " +"નથી." + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "કી ફાઈલ પાસે કી '%s' એ જૂથ '%s' માં નથી" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "કી ફાઈલ એસ્કેપ અક્ષર વાક્યના અંતે સમાવે છે" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "કી ફાઈલ અયોગ્ય એસ્કેપ ક્રમ '%s' સમાવે છે" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "કિંમત '%s' નંબર તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "પૂર્ણાંક કિંમત '%s' એ મર્યાદાની બહાર છે" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "કિંમત '%s' એ અપૂર્ણાંક સંખ્યા તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "કિંમત '%s' બુલિયન તરીકે ઈન્ટરપ્રીટ કરી શકાતું નથી." + +#: ../glib/gmappedfile.c:128 +#, fuzzy, c-format +#| msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "'%s' ફાઈલની લાક્ષણિકતા મેળવતી વખતે નિષ્ફળતા: fstate() નિષ્ફળ: %s" + +#: ../glib/gmappedfile.c:194 +#, fuzzy, c-format +#| msgid "Failed to map file '%s': mmap() failed: %s" +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "ફાઈલ '%s' નો નકશો કરવામાં નિષ્ફળ: mmap() નિષ્ફળ: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ફાઈલ '%s' ખોલવામાં નિષ્ફળ: open() નિષ્ફળ: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d લીટી પર %d અક્ષરમાં ભૂલ: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "નામ માં અયોગ્ય UTF-8 સંગ્રહપદ્ધતિવાળું લખાણ - માન્ય '%s' નથી" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' એ યોગ્ય નામ નથી" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' એ યોગ્ય નામ નથી: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d લીટી પર ભૂલ: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "અક્ષર સંદર્ભ '%-.*s' પરવાનગી આપેલ અક્ષરને એનકોડ કરતો નથી" + +#: ../glib/gmarkup.c:712 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "'&;' વસ્તુ ખાલી દેખાય છે: યોગ્ય વસ્તુઓ છે:& " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity નામ '%-.*s' જાણીતુ નથી" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "દસ્તાવેજ કોઈ વસ્તુ સાથે શરુ થાય તે જરુરી છે(ઉદાહરણ )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' એ '<' અક્ષર પછી આવતો યોગ્ય અક્ષર નથી; તે કોઈ વસ્તુના નામથી શરુ થતુ નથી" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "અસંગત અક્ષર '%s', વસ્તુ ટેગ '%s' નાં ખાલી ઘટક ને સમાપ્ત કરવા '>' અક્ષર ની આશા છે" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "અસંગત અક્ષર '%s', '%s' વસ્તુના '%s' લાક્ષણિકતા નામ પછી '=' જરુરી છે" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' એ '%s' વસ્તુનામ પછીનો બંધ કરવાનો યોગ્ય અક્ષર નથી; '>' એ યોગ્ય અક્ષર છે. " + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' વસ્તુ બંધ હતી, અત્યારે એક પણ વસ્તુ ખુલ્લી નથી" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' વસ્તુ બંધ હતી, પણ અત્યારે '%s'એ ખુલ્લી વસ્તુ છે" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "દસ્તાવેજ ખાલી છે અથવા ફક્ત ખાલી જ્ગ્યા ધરાવે છે" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' ચિન્હ વાપરતા પછી દસ્તાવેજનો અણધારી રીતે અંત આવે છે" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "વસ્તુ ખુલ્લી હોવા છતાં દસ્તાવેજનો અણધારી રીતે અંત આવે છે- છેલ્લે ખોલેલ વસ્તુ '%s' છે" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"દસ્તાવેજનો અણધારી રીતે અંત થાય છે, તે અંતિમ ટેગ <%s/> માં કૌંસને બંધ કરતુ ખૂણાનુ ચિન્હ " +"જોવા માગે છે" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "વસ્તુ નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "લાક્ષણિકતાના નામની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "વસ્તુની શરુઆતની ટેગમા દસ્તાવેજનો અણધારી રીતે અંત થાય છે." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"લાક્ષણિકતા નામ પછીની બરાબરની નિશાની પછી દસ્તાવેજ નો અણધારી રીતે અંત થાય છે. " +"લાક્ષણિકતાના મુલ્ય નથી" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "લાક્ષણિકતા મુલ્ય અંદર હોવા છતાં દસ્તાવેજ નો અણધારી રીતે અંત થાય છે" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' વસ્તુના બંદ ટેગની અંદર દસ્તાવેજનો અણધારી રીતે અંત થાય છે" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ટિપ્પણી અથવા પ્રક્રિયા સુચનાની અંદર અણધારી રીતે દસ્તાવેજનો અંત થાય છે" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "વપરાશ:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "મદદ વિકલ્પો:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "મદદ વિકલ્પો બતાવો" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "બધા મદદ વિકલ્પો બતાવો" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "કાર્યક્રમ વિકલ્પો:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "પૂર્ણાંક કિંમત '%s' ને %s માટે પદચ્છેદન કરી શકતા નથી" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "પૂર્ણાંક કિંમત '%s' એ %s માટે મર્યાદા બહાર છે" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "બમણી કિંમત '%s' ને %s માટે પદચ્છેદિત કરી શકતા નથી" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "બમણી કિંમત '%s' જે %s માટે છે તે વિસ્તારની બહાર છે" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "ભૂલ પદચ્છેદન વિકલ્પ %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s માટેની દલીલ ગુમ થયેલ છે" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "અજ્ઞાત વિકલ્પ %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ભાંગી પડેલ ઓબ્જેક્ટ" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "આંતરિક ભૂલ અથવા બગડેલ ઓબ્જેક્ટ" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "મેમરી બહાર" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "પાછળ જવાની મર્યાદાએ પહોંચી ગયા" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "ભાત અંશતઃ જોડણી માટે આધારભૂત વસ્તુઓ સમાવતી નથી" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "શરતો તરીકે પાછળના સંદર્ભો અંશતઃ સરખામણી માટે આધારભૂત નથી" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "પુનરાવર્તન મર્યાદાએ પહોંચી ગયું" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "નવીલીટી ફ્લેગોનું અયોગ્ય જોડકું" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ખરાબ ઓફસેટ" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "ટૂંકુ utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "અજ્ઞાત ભૂલ" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ભાતના અંતે" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ભાતના અંતે" + +#: ../glib/gregex.c:335 +#, fuzzy +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "નહિં ઓળખાયેલ અક્ષર અનુસરે છે \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} ગણકમાં નંબરો હદ બહાર છે" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} ગણકમાં ખૂબ મોટી સંખ્યા" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "અક્ષર વર્ગ માટે અંત કરતો ] ગુમ છે" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "અક્ષર વર્ગમાં અયોગ્ય એસ્કેપ ક્રમ" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "અક્ષર વર્ગમાં ક્રમ વિસ્તારની બહાર છે" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "પુનરાવર્તન કરવા માટે કંઈ નથી" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "અનિચ્છનિય પુનરાવર્તન" + +#: ../glib/gregex.c:360 +#, fuzzy +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "(? પછી નહિં ઓળખાતો અક્ષર" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named વર્ગો માત્ર વર્ગમાં જ આધારભૂત છે" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "અંત કરતો ) ગુમ છે" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "બિન-હયાત ઉપભાતનો સંદર્ભ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ટિપ્પણી પછી ગુમ થયેલ )" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "નિયમિત સમીકરણ ખૂબ મોટું છે" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "મેમરી મેળવવામાં નિષ્ફળ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") એ ખૂલતા ( વિના છે" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "કોડ ઉભરાટ" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< પછી નહિં ઓળખાતો અક્ષર" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind ગોઠવણ એ નિયમિત લંબાઈ નથી" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( પછી મલીન નંબર અથવા નામ" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "શરતી જૂથ બે કરતાં વધુ શાખાઓ સમાવે છે" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R અથવા (?[+-]અંકો ) ને અનુસરતા જ હોવા જોઈએ" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "અજ્ઞાત POSIX વર્ગ નામ" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ક્રમાંકિત ઘટકો આધારભૂત નથી" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ક્રમમાંની અક્ષર કિંમત ખૂબ મોટી છે" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "અયોગ્ય શરત (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind ગોઠવણીમાં માન્ય નથી" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, અને \\u આધારભૂત નથી" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "પુનરાવર્તી કોલ અવ્યાખ્યાયિત લુપમાં જઈ શકે" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P પછી નહિં ઓળખાતો અક્ષર" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "ઉપભાત નામમાં ગુમ થયેલ અંત કરનાર" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "બે નામવાળી ઉપભાતોને એક જ નામ હોય છે" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "મલીન \\P અથવા \\p ક્રમ" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P અથવા \\p પછી અજ્ઞાત ગુણધર્મ નામ" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ઉપભાત નામ ખૂબ લાંબુ છે (મહત્તમ ૩૨ અક્ષરો)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ઘણાબધા નામવાળી ઉપભાતો (મહત્તમ ૧૦,૦૦૦)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "અષ્ટાંક કિંમત \\377 કરતાં મોટી છે" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "વધુ પડતું કમ્પાઈલીંગ કાર્યસ્થળ" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "પહેલાં-ચકાસાયેલ સંદર્ભવાળી ભાત મળી નહિં" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE જૂથ એક શાખા કરતાં વધુ સમાવે છે" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "વિચલ NEWLINE વિકલ્પો" + +#: ../glib/gregex.c:476 +#, fuzzy +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g એ કૌંસવાળા નામ દ્વારા અનુસરવામાં આવતું નથી કે વૈકલ્પિક રીતે કૌંસવાળા બિન-શૂન્ય નંબરથી" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "ક્રમાંકિત થયેલ સંદર્ભ શૂન્ય ન હોવુ જ જોઇએ" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "દલીલને (*ACCEPT), (*FAIL), અથવા (*COMMIT) માટે પરવાનગી મળેલ નથી" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ઓળખાયેલ નથી" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "નંબર ઘણો મોટો છે" + +#: ../glib/gregex.c:492 +#, fuzzy +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "ઉપભાત નામમાં ગુમ થયેલ અંત કરનાર" + +#: ../glib/gregex.c:495 +#, fuzzy +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "અંક ઈચ્છિત" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "JavaScript સુસંગત સ્થિતિમાં ] એ અયોગ્ય માહિતી અક્ષર છે" + +#: ../glib/gregex.c:501 +#, fuzzy +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "બે નામવાળી ઉપભાતોને એક જ નામ હોય છે" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) પાસે દલીલ હોવી જ જોઇએ" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c એ ASCII અક્ષર દ્દારા અનુસરવુ જ જોઇએ" + +#: ../glib/gregex.c:510 +#, fuzzy +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\g એ કૌંસવાળા નામ દ્વારા અનુસરવામાં આવતું નથી કે વૈકલ્પિક રીતે કૌંસવાળા બિન-શૂન્ય નંબરથી" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N એ વર્ગમાં આધારભૂત નથી" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), અથવા (*THEN) માં નામ ઘણુ લાંબુ છે" + +#: ../glib/gregex.c:522 +#, fuzzy +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\x{...} ક્રમમાંની અક્ષર કિંમત ખૂબ મોટી છે" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "નિયમિત સમીકરણ %s સરખાવતી વખતે ભૂલ: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE લાઈબ્રેરી UTF8 આધાર વિના કમ્પાઈલ થયેલ છે" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE લાઈબ્રેરી UTF8 ગુણધર્મો આધાર વિના કમ્પાઈલ થયેલ છે" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE લાઈબ્રેરી અસુસંગત વિકલ્પો સાથે કમ્પાઈલ થયેલ છે" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "નિયમિત સમીકરણ %s ને કમ્પાઈલ કરવામાં અક્ષર %d આગળ ભૂલ: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "નિયમિત સમીકરણ %s શ્રેષ્ઠ બનાવતી વખતે ભૂલ: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "હેક્ઝાડેસીમલ અંક અથવા '}' ઈચ્છિત છે" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "હેક્ઝાડેસીમલ અંક ઈચ્છિત છે" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "સંજ્ઞાકીય સંદર્ભમાં '<' ગુમ થયેલ છે" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "અપૂર્ણ સંજ્ઞાકીય સંદર્ભ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "શૂન્ય-લંબાઈ સંજ્ઞાકીય સંદર્ભ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "અંક ઈચ્છિત" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "અયોગ્ય સંજ્ઞાકીય સંદર્ભ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "સ્ટ્રે અંત '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "અજ્ઞાત એસ્કેપ ક્રમ" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "બદલી લખાણ \"%s\" નું પદચ્છેદન કરતી વખતે અક્ષર %lu આગળ ભૂલ: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "અવતરણ ચિહ્નવાળુ વાક્ય અવતરણ ચિહ્નથી શરુ થતુ નથી" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "આદેશ વાક્યમાં અથવા બીજા શેલ ચિહ્નિત બંધબેસતા ન હોય તેવા અવતરણ ચિહ્ન" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "લખાણનો '\\' અક્ષર પછી તરત જ અંત આવે છે (લખાણનો '%s' હતુ)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c માટે અવતરણ ચિહ્ન મળે તે પહેલા લખાણનો અંત થાય છે(લખાણ '%s' હતુ)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "વાક્ય ખાલી છે (અથવા તેમાં ફક્ત ખાલી જગ્યા છે)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) બાળપ્રક્રિયામાંથી માહિતી વાંચવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "(%s)બાળપ્રક્રિયામાંથી માહિતી વાંચતી વખતે select() માં આવતી અણધારી ભૂલ" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "કોડ %ld સાથે બાળ પ્રક્રિયા બહાર નીકળી ગઇ" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "બાળ પ્રક્રિયા સંકેત %ld દ્દારા મરેલ છે" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "બાળ પ્રક્રિયા સંકેત %ld દ્દારા બંધ થયેલ છે" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "બાળ પ્રક્રિયા અસાધારણ રીતે બહાર નીકળી ગઇ" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "બાળ પાઈપ (%s)માંથી વાંચવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ડિરેક્ટરી બદલવામાં નિષ્ફળ(%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\"બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "બાળપ્રક્રિયા (%s)ના ઈનપુટ અથવા આઉટપુટને ફરીથી દિશા આપવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "બાળપ્રક્રિયા (%s)ની બાળપ્રક્રિયા બનાવવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "\"%s\" બાળપ્રક્રિયા ચલાવતી વખતની અજ્ઞાત ભૂલ" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "(%s)બાળ pid પાઈપમાંથી જરુરી માહિતી વાંચવામાં નિષ્ફળ" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr " (%s) બાળપ્રક્રિયા સાથે સંપર્ક માટે પાઈપ બનાવવામાં નિષ્ફળ" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "બાળ-પ્રક્રિયા માંથી માહિતી વાંચવા માં નિષ્ફળ છે" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr " (%s) બાળપ્રક્રિયા ચલાવવામાં નિષ્ફળ" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "અયોગ્ય કાર્યક્રમ નામ: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "દલીલ વેક્ટરમાં %d આગળ અયોગ્ય શબ્દમાળા: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "પર્યાવરણમાં અયોગ્ય શબ્દમાળા: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "અયોગ્ય કામ આપતી ડિરેક્ટરી: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "મદદગાર કાર્યક્રમ (%s) ચલાવવામાં નિષ્ફળ" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "બાળ-પ્રક્રિયામાંથી માહિતી વાંચતી વખતે g_io_channel_win32_poll() માં આવતી અણધારી ભૂલ" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "અક્ષર UTF-à«® ની સીમાની બહાર" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "પરીવર્તિત ઈનપુટની અંદર અયોગ્ય શ્રેણી" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-૧૬ ની સીમાની બહાર નો અક્ષર" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u બાઇટ" +msgstr[1] "%u બાઇટ" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2329 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s બાઇટ" +msgstr[1] "%s બાઇટ" + +#: ../glib/gutils.c:2324 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "(%s) waitpid() માં અાવતી અણાધારી ભૂલ" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ખાલી શબ્દમાળાઓ માટે કાર્યસ્થળ મર્યાદાએ પહોંચી ગયા" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "કેસ-બદલતા એસ્કેપો (\\l, \\L, \\u, \\U) અંહિ માન્ય નથી" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE જૂથનું પુનરાવર્તન કરવાનું માન્ય નથી" + +#~ msgid "File is empty" +#~ msgstr "ફાઈલ ખાલી છે" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "કી ફાઈલ '%s' કી સમાવે છે કે જેની પાસે કિંમત છે જે ઈન્ટરપ્રીટ કરી શકાતી નથી." + +#~ msgid "This option will be removed soon." +#~ msgstr "આ વિકલ્પ ઝલ્દીથી દૂર થઇ જશે." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "ફાઈલ '%s' કહેવામાં ભૂલ: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' માટે સેવાનો અહેવાલ નથી" + +#~ msgid "Error connecting: " +#~ msgstr "જોડાઇ રહ્યા હોય ત્યારે ભૂલ: " + +#~ msgid "Error connecting: %s" +#~ msgstr "જોડાઇ રહ્યા હોય ત્યારે ભૂલ: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix માંથી વાંચતી વખતે ભૂલ: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix બંધ કરતી વખતે ભૂલ: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unix માં લખતી વખતે ભૂલ: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" diff --git a/po/he.po b/po/he.po new file mode 100644 index 0000000..eec5c89 --- /dev/null +++ b/po/he.po @@ -0,0 +1,4637 @@ +# 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. +# Yaron Shahrabani , 2010. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD.he\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-02 11:22+0200\n" +"PO-Revision-Date: 2013-02-02 11:23+0200\n" +"Last-Translator: Yaron Shahrabani \n" +"Language-Team: Gezer (Hebrew)\n" +"Language: he\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: Virtaal 0.6.1\n" + +#: ../gio/gbufferedinputstream.c:427 +#: ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 +#: ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 +#: ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 +#: ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 +#: ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: ../gio/gbufferedinputstream.c:899 +#: ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Seek not supported on base stream" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Cannot truncate GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 +#: ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 +#: ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Stream is already closed" + +#: ../gio/gbufferedoutputstream.c:618 +#: ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Truncate not supported on base stream" + +#: ../gio/gcancellable.c:318 +#: ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 +#: ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 +#: ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Operation was cancelled" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Invalid object, not initialized" + +#: ../gio/gcharsetconverter.c:283 +#: ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Incomplete multibyte sequence in input" + +#: ../gio/gcharsetconverter.c:317 +#: ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Not enough space in destination" + +#: ../gio/gcharsetconverter.c:344 +#: ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 +#: ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 +#: ../glib/giochannel.c:1586 +#: ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 +#: ../glib/gutf8.c:841 +#: ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Invalid byte sequence in conversion input" + +#: ../gio/gcharsetconverter.c:349 +#: ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 +#: ../glib/giochannel.c:1593 +#: ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error during conversion: %s" + +#: ../gio/gcharsetconverter.c:446 +#: ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Cancellable initialization not supported" + +# *** This file should not be translated to hebrew, please only copy the english text *** +# *** Old hebrew ranslation is commented for backup sake *** +#: ../gio/gcharsetconverter.c:457 +#: ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 +#: ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Conversion from character set '%s' to '%s' is not supported" + +#: ../gio/gcharsetconverter.c:461 +#: ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Could not open converter from '%s' to '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s type" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Unknown type" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s filetype" + +#: ../gio/gcredentials.c:264 +#: ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials is not implemented on this OS" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "There is no GCredentials support for your platform" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials does not contain a process ID on this OS" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Unexpected early end-of-stream" + +#: ../gio/gdbusaddress.c:150 +#: ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Unsupported key `%s' in address entry `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Meaningless key/value pair combination in address entry `%s'" + +#: ../gio/gdbusaddress.c:253 +#: ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Error in address `%s' - the port attribute is malformed" + +#: ../gio/gdbusaddress.c:264 +#: ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Error in address `%s' - the family attribute is malformed" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Address element `%s' does not contain a colon (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "Key/Value pair %d, `%s', in address element `%s' does not contain an equal sign" +msgstr "Key/Value pair %d, `%s', in address element `%s' does not contain an equal sign" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Error in address `%s' - the host attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Error in address `%s' - the port attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Error in address `%s' - the noncefile attribute is missing or malformed" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Error auto-launching: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Unknown or unsupported transport `%s' for address `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error opening nonce file `%s': %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error reading from nonce file `%s': %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Error reading from nonce file `%s', expected 16 bytes, got %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Error writing contents of nonce file `%s' to stream:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "The given address is empty" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Cannot spawn a message bus when setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Cannot spawn a message bus without a machine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Error spawning command line `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Type any character to close this window)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Session dbus not running, and autolaunch failed" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Cannot determine session bus address (not implemented for this OS)" + +#: ../gio/gdbusaddress.c:1541 +#: ../gio/gdbusconnection.c:6757 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" + +#: ../gio/gdbusaddress.c:1550 +#: ../gio/gdbusconnection.c:6766 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Unknown bus type %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Unexpected lack of content trying to read a line" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Unexpected lack of content trying to (safely) read a line" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Error when getting information for directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error creating directory `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Error opening keyring `%s' for reading: " + +#: ../gio/gdbusauthmechanismsha1.c:406 +#: ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:420 +#: ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "First token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:435 +#: ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Second token of line %d of the keyring at `%s' with content `%s' is malformed" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Didn't find cookie with id %d in the keyring at `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error deleting stale lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error creating lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error closing (unlinked) lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error unlinking lock file `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Error opening keyring `%s' for writing: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Additionally, releasing the lock for `%s' also failed: %s) " + +#: ../gio/gdbusconnection.c:597 +#: ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "The connection is closed" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Timeout was reached" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "Unsupported flags encountered when constructing a client-side connection" + +#: ../gio/gdbusconnection.c:4065 +#: ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "No such interface `org.freedesktop.DBus.Properties' on object at path %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Error setting property `%s': Expected type `%s' but got `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "No such property `%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Property `%s' is not readable" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Property `%s' is not writable" + +#: ../gio/gdbusconnection.c:4324 +#: ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "No such interface `%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "No such interface" + +#: ../gio/gdbusconnection.c:4726 +#: ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "No such interface `%s' on object at path %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "No such method `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Type of message, `%s', does not match expected type `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "An object is already exported for the interface %s at %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Method `%s' returned type `%s', but expected `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Method `%s' on interface `%s' with signature `%s' does not exist" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "A subtree is already exported for %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "type is INVALID" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL message: PATH or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" + +#: ../gio/gdbusmessage.c:1326 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Wanted to read %lu bytes but only got %lu" +msgstr[1] "Wanted to read %lu byte but only got %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Expected NUL byte after the string `%s' but found byte %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Parsed value `%s' is not a valid D-Bus object path" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' is not a valid name " + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[1] "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Parsed value `%s' for variant is not a valid D-Bus signature" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "Error deserializing GVariant with type string `%s' from the D-Bus wire format" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Invalid major protocol version. Expected 1 but found %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Signature header with signature `%s' found but message body is empty" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Parsed value `%s' is not a valid D-Bus signature (for body)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "No signature header in message but the message body is %u byte" +msgstr[1] "No signature header in message but the message body is %u bytes" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Cannot deserialize message: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Error serializing GVariant with type string `%s' to the D-Bus wire format" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "Message has %d file descriptors but the header field indicates %d file descriptors" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Cannot serialize message: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Message body has signature `%s' but there is no signature header" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "Message body has type signature `%s' but signature in the header field is `%s'" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Message body is empty but signature in the header field is `(%s)'" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Error return with body of type `%s'" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Error return with empty body" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Unable to get Hardware profile: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Error calling StartServiceByName for %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Unexpected reply %d from StartServiceByName(\"%s\") method" + +#: ../gio/gdbusproxy.c:2763 +#: ../gio/gdbusproxy.c:2900 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" + +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "Abstract name space not supported" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "Cannot specify nonce file when creating a server" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error writing nonce file at `%s': %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "The string `%s' is not a valid D-Bus GUID" + +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Cannot listen on unsupported transport `%s'" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" + +#: ../gio/gdbus-tool.c:166 +#: ../gio/gdbus-tool.c:222 +#: ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 +#: ../gio/gdbus-tool.c:701 +#: ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Error: %s\n" + +#: ../gio/gdbus-tool.c:177 +#: ../gio/gdbus-tool.c:235 +#: ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error parsing introspection XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Connect to the system bus" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Connect to the session bus" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Connect to given D-Bus address" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Connection Endpoint Options:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Options specifying the connection endpoint" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "No connection endpoint specified" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Multiple connection endpoints specified" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Warning: According to introspection data, interface `%s' does not exist\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Optional destination for signal (unique name)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Object path to emit signal on" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Signal and interface name" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emit a signal." + +#: ../gio/gdbus-tool.c:606 +#: ../gio/gdbus-tool.c:832 +#: ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Error connecting: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Error: object path not specified.\n" + +#: ../gio/gdbus-tool.c:623 +#: ../gio/gdbus-tool.c:893 +#: ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Error: %s is not a valid object path\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Error: signal not specified.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Error: signal must be the fully-qualified name.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Error: %s is not a valid interface name\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Error: %s is not a valid member name\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Error: %s is not a valid unique bus name.\n" + +#: ../gio/gdbus-tool.c:679 +#: ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error parsing parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error flushing connection: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Destination name to invoke method on" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Object path to invoke method on" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Method and interface name" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Timeout in seconds" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Invoke a method on a remote object." + +#: ../gio/gdbus-tool.c:852 +#: ../gio/gdbus-tool.c:1578 +#: ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Error: Destination is not specified\n" + +#: ../gio/gdbus-tool.c:873 +#: ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Error: Object path is not specified\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Error: Method name is not specified\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Error: Method name `%s' is invalid\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Error parsing parameter %d of type `%s': %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Destination name to introspect" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Object path to introspect" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Print XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Introspect children" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Only print properties" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Introspect a remote object." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Destination name to monitor" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Object path to monitor" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "corrupted object" + +#: ../gio/gdesktopappinfo.c:594 +#: ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Unnamed" + +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop file didn't specify Exec field" + +#: ../gio/gdesktopappinfo.c:1295 +msgid "Unable to find terminal required for application" +msgstr "Unable to find terminal required for application" + +#: ../gio/gdesktopappinfo.c:1597 +#, 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:1601 +#, 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:1841 +#: ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "Application information lacks an identifier" + +#: ../gio/gdesktopappinfo.c:2097 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Can't create user desktop file %s" + +#: ../gio/gdesktopappinfo.c:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Custom definition for %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "drive doesn't implement eject or eject_with_operation" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "drive doesn't implement polling for media" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "drive doesn't implement start" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "drive doesn't implement stop" + +#: ../gio/gdummytlsbackend.c:168 +#: ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS support is not available" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Can't handle version %d of GEmblem encoding" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Malformed number of tokens (%d) in GEmblem encoding" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Can't handle version %d of GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Expected a GEmblem for GEmblemedIcon" + +#: ../gio/gfile.c:917 +#: ../gio/gfile.c:1156 +#: ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 +#: ../gio/gfile.c:1590 +#: ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 +#: ../gio/gfile.c:1789 +#: ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 +#: ../gio/gfile.c:3468 +#: ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 +#: ../gio/gfile.c:3711 +#: ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 +#: ../gio/gfile.c:4610 +#: ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 +#: ../gio/gfile.c:4884 +#: ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 +#: ../gio/gfile.c:5536 +#: ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 +#: ../gio/gfile.c:7225 +#: ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 +#: ../gio/glocalfile.c:1096 +#: ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "Containing mount does not exist" + +#: ../gio/gfile.c:2474 +#: ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Can't copy over directory" + +#: ../gio/gfile.c:2534 +msgid "Can't copy directory over directory" +msgstr "Can't copy directory over directory" + +#: ../gio/gfile.c:2542 +#: ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "Target file exists" + +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Can't recursively copy directory" + +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Symbolic links not supported" + +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Error opening file: %s" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Copy (reflink/clone) between mounts is not supported" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Copy (reflink/clone) is not supported or invalid" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Copy (reflink/clone) is not supported or didn't work" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Can't copy special file" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "Invalid symlink value given" + +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "Trash not supported" + +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "File names cannot contain '%c'" + +#: ../gio/gfile.c:6258 +#: ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "volume doesn't implement mount" + +#: ../gio/gfile.c:6367 +msgid "No application is registered as handling this file" +msgstr "No application is registered as handling this file" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: ../gio/gfileenumerator.c:211 +#: ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 +#: ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: ../gio/gfileenumerator.c:358 +#: ../gio/gfileenumerator.c:458 +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:154 +#: ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 +#: ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Stream doesn't support query_info" + +#: ../gio/gfileinputstream.c:331 +#: ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Seek not supported on stream" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Truncate not allowed on input stream" + +#: ../gio/gfileiostream.c:459 +#: ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Truncate not supported on stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Wrong number of tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "No type for class name %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s does not implement the GIcon interface" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is not classed" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Malformed version number: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Can't handle the supplied version of the icon encoding" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "No address specified" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Length %u is too long for address" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Address has bits set beyond prefix length" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Could not parse '%s' as IP address mask" + +#: ../gio/ginetsocketaddress.c:206 +#: ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Not enough space for socket address" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Unsupported socket address" + +#: ../gio/ginputstream.c:194 +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:1033 +#: ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: ../gio/glib-compile-resources.c:145 +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> not allowed inside <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> not allowed at toplevel" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "File %s appears multiple times in the resource" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Failed to locate '%s' in any source directory" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Failed to locate '%s' in current directory" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Unknown processing option \"%s\"" + +#: ../gio/glib-compile-resources.c:310 +#: ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Failed to create temp file: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Error processing input file with xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Error processing input file with to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Error reading file %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Error compressing file %s" + +#: ../gio/glib-compile-resources.c:494 +#: ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text may not appear inside <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "name of the output file" + +#: ../gio/glib-compile-resources.c:619 +#: ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 +#: ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "The directories where files are to be read from (default to current directory)" +msgstr "The directories where files are to be read from (default to current directory)" + +#: ../gio/glib-compile-resources.c:620 +#: ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "Generate output in the format selected for by the target filename extension" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Generate source header" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Generate sourcecode used to link in the resource file into your code" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Generate dependency list" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Don't automatically create and register resource" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Don't export functions; declare them G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "C identifier name used for the generated source code" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "You should give exactly one file name\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "empty names are not permitted" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "invalid name '%s': names must begin with a lowercase letter" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and hyphen ('-') are permitted." +msgstr "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and hyphen ('-') are permitted." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "invalid name '%s': two successive hyphens ('--') are not permitted." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "invalid name '%s': the last character may not be a hyphen ('-')." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "invalid name '%s': maximum length is 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "cannot add keys to a 'list-of' schema" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid " shadows in ; use to modify value" +msgstr " shadows in ; use to modify value" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> not (yet) defined." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "invalid GVariant type string '%s'" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " given but schema isn't extending anything" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "no to override" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " already specified" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " extends not-yet-existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " is list of not-yet-existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Can not be a list of a schema with a path" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Can not extend a schema with a path" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid " is a list, extending which is not a list" +msgstr " is a list, extending which is not a list" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr " extends but '%s' does not extend '%s'" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "a path, if given, must begin and end with a slash" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "the path of a list must end with ':/'" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> already specified" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> not allowed at the top level" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 +#: ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "This entire file has been ignored.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoring this file.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "No such key `%s' in schema `%s' as specified in override file `%s'" + +#: ../gio/glib-compile-schemas.c:1870 +#: ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1874 +#: ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " and --strict was specified; exiting.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "error parsing key `%s' in schema `%s' as specified in override file `%s': %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoring override for this key.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is outside the range given in the schema" +msgstr "override for key `%s' in schema `%s' in override file `%s' is outside the range given in the schema" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "where to store the gschemas.compiled file" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Abort on any errors in schemas" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Do not write the gschema.compiled file" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Do not enforce key name restrictions" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "You should give exactly one directory name\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "No schema files found: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "doing nothing.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "removed existing output file.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Unable to find default local directory monitor type" + +#: ../gio/glocalfile.c:597 +#: ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Invalid filename %s" + +#: ../gio/glocalfile.c:974 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error getting filesystem info: %s" + +#: ../gio/glocalfile.c:1142 +msgid "Can't rename root directory" +msgstr "Can't rename root directory" + +#: ../gio/glocalfile.c:1162 +#: ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Error renaming file: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Can't rename file, filename already exists" + +#: ../gio/glocalfile.c:1184 +#: ../gio/glocalfile.c:2201 +#: ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 +#: ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 +#: ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "Invalid filename" + +#: ../gio/glocalfile.c:1351 +#: ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Can't open directory" + +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Error opening file: %s" + +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Error removing file: %s" + +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Error trashing file: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Unable to create trash dir %s: %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Unable to find toplevel directory for trash" + +#: ../gio/glocalfile.c:2003 +#: ../gio/glocalfile.c:2023 +msgid "Unable to find or create trash directory" +msgstr "Unable to find or create trash directory" + +#: ../gio/glocalfile.c:2057 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Unable to create trashing info file: %s" + +#: ../gio/glocalfile.c:2086 +#: ../gio/glocalfile.c:2091 +#: ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Unable to trash file: %s" + +#: ../gio/glocalfile.c:2179 +#: ../glib/gregex.c:280 +msgid "internal error" +msgstr "internal error" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error creating directory: %s" + +#: ../gio/glocalfile.c:2234 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filesystem does not support symbolic links" + +#: ../gio/glocalfile.c:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Error making symbolic link: %s" + +#: ../gio/glocalfile.c:2300 +#: ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Error moving file: %s" + +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Can't move directory over directory" + +#: ../gio/glocalfile.c:2350 +#: ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 +#: ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 +#: ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Backup file creation failed" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Error removing target file: %s" + +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Move between mounts not supported" + +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "Attribute value must be non-NULL" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Invalid attribute type (string expected)" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Invalid extended attribute name" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error setting extended attribute '%s': %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (invalid encoding)" + +#: ../gio/glocalfileinfo.c:1740 +#: ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Error when getting information for file '%s': %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Error when getting information for file descriptor: %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Invalid attribute type (uint32 expected)" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Invalid attribute type (uint64 expected)" + +#: ../gio/glocalfileinfo.c:2068 +#: ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "Invalid attribute type (byte string expected)" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Cannot set permissions on symlinks" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Error setting permissions: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Error setting owner: %s" + +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "symlink must be non-NULL" + +#: ../gio/glocalfileinfo.c:2222 +#: ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Error setting symlink: %s" + +#: ../gio/glocalfileinfo.c:2231 +msgid "Error setting symlink: file is not a symlink" +msgstr "Error setting symlink: file is not a symlink" + +#: ../gio/glocalfileinfo.c:2357 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error setting modification or access time: %s" + +# c-format +#: ../gio/glocalfileinfo.c:2380 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context must be non-NULL" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error setting SELinux context: %s" + +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is not enabled on this system" + +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Setting attribute %s not supported" + +#: ../gio/glocalfileinputstream.c:186 +#: ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Error reading from file: %s" + +#: ../gio/glocalfileinputstream.c:217 +#: ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 +#: ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Error seeking in file: %s" + +#: ../gio/glocalfileinputstream.c:258 +#: ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Error closing file: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Unable to find default local file monitor type" + +#: ../gio/glocalfileoutputstream.c:202 +#: ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Error writing to file: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Error removing old backup link: %s" + +#: ../gio/glocalfileoutputstream.c:295 +#: ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Error creating backup copy: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error renaming temporary file: %s" + +#: ../gio/glocalfileoutputstream.c:510 +#: ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Error truncating file: %s" + +#: ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 +#: ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Error opening file '%s': %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "Target file is a directory" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "Target file is not a regular file" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "The file was externally modified" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Error removing old file: %s" + +#: ../gio/gmemoryinputstream.c:475 +#: ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Invalid GSeekType supplied" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Invalid seek request" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Cannot truncate GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Memory output stream not resizable" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Failed to resize memory output stream" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Requested seek before the beginning of the stream" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Hostname '%s' contains '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Network unreachable" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Host unreachable" + +#: ../gio/gnetworkmonitornetlink.c:98 +#: ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Could not create network monitor: %s" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "Could not create network monitor: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Could not get network status: " + +#: ../gio/goutputstream.c:212 +#: ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Output stream doesn't implement write" + +#: ../gio/goutputstream.c:425 +#: ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Source stream is already closed" + +#: ../gio/gresource.c:291 +#: ../gio/gresource.c:539 +#: ../gio/gresource.c:556 +#: ../gio/gresource.c:677 +#: ../gio/gresource.c:746 +#: ../gio/gresource.c:807 +#: ../gio/gresource.c:887 +#: ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 +#: ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "The resource at '%s' does not exist" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "The resource at '%s' failed to decompress" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "The resource at '%s' is not a directory" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Input stream doesn't implement seek" + +#: ../gio/gresource-tool.c:475 +#: ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Print help" + +#: ../gio/gresource-tool.c:476 +#: ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "List sections containing resources in an elf FILE" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" + +#: ../gio/gresource-tool.c:490 +#: ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:491 +#: ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Extract a resource file to stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:513 +#: ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Unknown command %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 +#: ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Arguments:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION An (optional) elf section name\n" + +#: ../gio/gresource-tool.c:546 +#: ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND The (optional) command to explain\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE An elf file (a binary or a shared library)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH An (optional) resource path (may be partial)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PATH A resource path\n" + +#: ../gio/gsettings-tool.c:57 +#: ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "No such schema '%s'\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema '%s' is not relocatable (path must not be specified)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema '%s' is relocatable (path must be specified)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Empty path given.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Path must begin with a slash (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Path must end with a slash (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Path must not contain two adjacent slashes (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "No such key '%s'\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "The provided value is outside of the valid range\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "List the installed (non-relocatable) schemas" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "List the installed relocatable schemas" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "List the keys in SCHEMA" + +#: ../gio/gsettings-tool.c:548 +#: ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "List the children of SCHEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Get the value of KEY" + +#: ../gio/gsettings-tool.c:567 +#: ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 +#: ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Query the range of valid values for KEY" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Set the value of KEY to VALUE" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Reset KEY to its default value" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Reset all keys in SCHEMA to their defaults" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Check if KEY is writable" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR A directory to search for additional schemas\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY The (optional) key within the schema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY The key within the schema\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALUE The value to set\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Empty schema name given\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Invalid socket, not initialized" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Invalid socket, initialization failed due to: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Socket is already closed" + +#: ../gio/gsocket.c:334 +#: ../gio/gsocket.c:3525 +#: ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Socket I/O timed out" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creating GSocket from fd: %s" + +#: ../gio/gsocket.c:509 +#: ../gio/gsocket.c:563 +#: ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Unable to create socket: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Unknown family was specified" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Unknown protocol was specified" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "could not get local address: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "could not get remote address: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "could not listen: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Error binding to address: %s" + +#: ../gio/gsocket.c:1957 +#: ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Error joining multicast group: %s" + +#: ../gio/gsocket.c:1958 +#: ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Error leaving multicast group: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "No support for source-specific multicast" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Error accepting connection: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Connection in progress" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Unable to get pending error: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Error receiving data: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Error sending data: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Unable to shutdown socket: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Error closing socket: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Waiting for socket condition: %s" + +#: ../gio/gsocket.c:3796 +#: ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Error sending message: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage not supported on Windows" + +#: ../gio/gsocket.c:4155 +#: ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Error receiving message: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Unable to get pending error: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials not implemented for this OS" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Could not connect to proxy server %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Could not connect to %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Could not connect: " + +#: ../gio/gsocketclient.c:976 +#: ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Unknown error on connect" + +#: ../gio/gsocketclient.c:1029 +#: ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proxying over a non-TCP connection is not supported." + +#: ../gio/gsocketclient.c:1055 +#: ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy protocol '%s' is not supported." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener is already closed" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Added socket is closed" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 does not support IPv6 address '%s'" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Username is too long for SOCKSv4 protocol" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Hostname '%s' is too long for SOCKSv4 protocol" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "The server is not a SOCKSv4 proxy server." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Connection through SOCKSv4 server was rejected" + +#: ../gio/gsocks5proxy.c:155 +#: ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "The server is not a SOCKSv5 proxy server." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "The SOCKSv5 proxy requires authentication." + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Username or password is too long for SOCKSv5 protocol." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 authentication failed due to wrong username or password." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Hostname '%s' is too long for SOCKSv5 protocol" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "The SOCKSv5 proxy server uses unknown address type." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Internal SOCKSv5 proxy server error." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 connection not allowed by ruleset." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host unreachable through SOCKSv5 server." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Network unreachable through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Connection refused through SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy does not support 'connect' command." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy does not support provided address type." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Unknown SOCKSv5 proxy error." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Can't handle version %d of GThemedIcon encoding" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Error resolving '%s': %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error reverse-resolving '%s': %s" + +#: ../gio/gthreadedresolver.c:397 +#: ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "No DNS record of the requested type for '%s'" + +#: ../gio/gthreadedresolver.c:402 +#: ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporarily unable to resolve '%s'" + +#: ../gio/gthreadedresolver.c:407 +#: ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Error resolving '%s'" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Cannot decrypt PEM-encoded private key" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "No PEM-encoded private key found" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Could not parse PEM-encoded private key" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "No PEM-encoded certificate found" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Could not parse PEM-encoded certificate" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "This is the last chance to enter the password correctly before your access is locked out." + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "Several password entered have been incorrect, and your access will be locked out after further failures." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "The password entered is incorrect." + +#: ../gio/gunixconnection.c:159 +#: ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Expecting 1 control message, got %d" + +#: ../gio/gunixconnection.c:172 +#: ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Unexpected type of ancillary data" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Expecting one fd, but got %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Received invalid fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Error sending data: %s" + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Error checking if SO_PASSCRED is enabled for socket: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error renaming file: %s" + +#: ../gio/gunixconnection.c:534 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "Expecting to read a single byte for receiving credentials but read zero bytes" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Not expecting control message, but got %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Error while disabling SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 +#: ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Error reading from file descriptor: %s" + +#: ../gio/gunixinputstream.c:436 +#: ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Error closing file descriptor: %s" + +#: ../gio/gunixmounts.c:1983 +#: ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Filesystem root" + +#: ../gio/gunixoutputstream.c:368 +#: ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Error writing to file descriptor: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume doesn't implement eject or eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Can't find application" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Error launching application: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIs not supported" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "association changes not supported on win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Association creation not supported on win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Error reading from file: %s" + +#: ../gio/gwin32inputstream.c:387 +#: ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Error closing file: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Error writing to file: %s" + +#: ../gio/gzlibcompressor.c:396 +#: ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "out of memory" + +#: ../gio/gzlibcompressor.c:403 +#: ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Internal error: %s" + +#: ../gio/gzlibcompressor.c:416 +#: ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Need more input" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Invalid hostname" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Address to listen on" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignored, for compat with GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Print address" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Print address in shell mode" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Run a dbus service" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Wrong args\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Unexpected attribute '%s' for element '%s'" + +#: ../glib/gbookmarkfile.c:771 +#: ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 +#: ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribute '%s' of element '%s' not found" + +#: ../glib/gbookmarkfile.c:1129 +#: ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 +#: ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Unexpected tag '%s', tag '%s' expected" + +#: ../glib/gbookmarkfile.c:1154 +#: ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 +#: ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Unexpected tag '%s' inside '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "No valid bookmark file found in data dirs" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "A bookmark for URI '%s' already exists" + +#: ../glib/gbookmarkfile.c:2045 +#: ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 +#: ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 +#: ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 +#: ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 +#: ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 +#: ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 +#: ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 +#: ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "No bookmark found for URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "No groups set in bookmark for URI '%s'" + +#: ../glib/gbookmarkfile.c:3239 +#: ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 +#: ../glib/gutf8.c:837 +#: ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 +#: ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Partial character sequence at end of input" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Cannot convert fallback '%s' to codeset '%s'" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "The URI '%s' is invalid" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "The hostname of the URI '%s' is invalid" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "The URI '%s' contains invalidly escaped characters" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "The pathname '%s' is not an absolute path" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Invalid hostname" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Z %H:%M:%S %Y %b %d %a" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %P" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ינואר" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "פברואר" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "מרץ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "אפריל" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "מאי" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "יוני" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "יולי" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "אוגוסט" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "ספטמבר" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "אוקטובר" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "נובמבר" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "דצמבר" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ינו" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "פבר" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "מרץ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "אפר" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "מאי" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "יונ" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "יול" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "אוג" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "ספט" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "אוק" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "נוב" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "דצמ" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "יום שני" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "יום שלישי" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "יום רביעי" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "יום חמישי" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "יום שישי" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "שבת" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "יום ראשון" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ב׳" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ג׳" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ד׳" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ה" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ו׳" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ש׳" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "א׳" + +#: ../glib/gdir.c:120 +#: ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error opening directory '%s': %s" + +#: ../glib/gfileutils.c:671 +#: ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Could not allocate %lu byte to read file \"%s\"" +msgstr[1] "Could not allocate %lu bytes to read file \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error reading file '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" is too large" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Failed to read from file '%s': %s" + +#: ../glib/gfileutils.c:834 +#: ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Failed to open file '%s': %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Failed to open file '%s': fdopen() failed: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 +#: ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Failed to create file '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Failed to write file '%s': fwrite() failed: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Failed to write file '%s': fflush() failed: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Failed to write file '%s': fsync() failed: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Failed to close file '%s': fclose() failed: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' invalid, should not contain a '%s'" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Template '%s' doesn't contain XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Failed to read the symbolic link '%s': %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Symbolic links not supported" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 +#: ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Left over unconverted data in read buffer" + +#: ../glib/giochannel.c:1891 +#: ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Channel terminates in a partial character" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +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:758 +msgid "Not a regular file" +msgstr "Not a regular file" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Invalid group name: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Key file does not start with a group" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Invalid key name: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Key file contains unsupported encoding '%s'" + +#: ../glib/gkeyfile.c:1533 +#: ../glib/gkeyfile.c:1695 +#: ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 +#: ../glib/gkeyfile.c:3265 +#: ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 +#: ../glib/gkeyfile.c:3770 +#: ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Key file does not have group '%s'" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Key file does not have key '%s'" + +#: ../glib/gkeyfile.c:1814 +#: ../glib/gkeyfile.c:1930 +#, 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:1834 +#: ../glib/gkeyfile.c:1950 +#: ../glib/gkeyfile.c:2319 +#, 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:2536 +#: ../glib/gkeyfile.c:2902 +#, c-format +msgid "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." +msgstr "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." + +#: ../glib/gkeyfile.c:2614 +#: ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Key '%s' in group '%s' has value '%s' where %s was expected" + +#: ../glib/gkeyfile.c:3088 +#: ../glib/gkeyfile.c:3280 +#: ../glib/gkeyfile.c:3848 +#, 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:4080 +msgid "Key file contains escape character at end of line" +msgstr "Key file contains escape character at end of line" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Key file contains invalid escape sequence '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Value '%s' cannot be interpreted as a number." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Integer value '%s' out of range" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Value '%s' cannot be interpreted as a boolean." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Failed to map %s%s%s%s: mmap() failed: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Failed to open file '%s': open() failed: %s" + +#: ../glib/gmarkup.c:397 +#: ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Error on line %d char %d: " + +#: ../glib/gmarkup.c:461 +#: ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "'%s' is not a valid name" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' is not a valid name: '%c'" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error on line %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, 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:758 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Empty entity '&;' seen; valid entities are: & " < > '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entity name '%-.*s' is not known" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Document must begin with an element (e.g. )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Document was empty or contained only whitespace" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Document ended unexpectedly just after an open angle bracket '<'" + +#: ../glib/gmarkup.c:1775 +#: ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Document ended unexpectedly inside an element name" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Document ended unexpectedly inside an attribute name" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Document ended unexpectedly inside an element-opening tag." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Document ended unexpectedly while inside an attribute value" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Document ended unexpectedly inside a comment or processing instruction" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Usage:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Help Options:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Show help options" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Show all help options" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Application Options:" + +#: ../glib/goption.c:979 +#: ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Cannot parse integer value '%s' for %s" + +#: ../glib/goption.c:989 +#: ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Integer value '%s' for %s out of range" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Cannot parse double value '%s' for %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Double value '%s' for %s out of range" + +#: ../glib/goption.c:1285 +#: ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Error parsing option %s" + +#: ../glib/goption.c:1395 +#: ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Missing·argument·for·%s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Unknown option %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "corrupted object" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "internal error or corrupted object" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "out of memory" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "backtracking limit reached" + +#: ../glib/gregex.c:278 +#: ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "the pattern contains items not supported for partial matching" + +#: ../glib/gregex.c:288 +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:297 +msgid "recursion limit reached" +msgstr "recursion limit reached" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "invalid combination of newline flags" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "bad offset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "short utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "recursion loop" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "unknown error" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "unrecognized character following \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "numbers out of order in {} quantifier" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "number too big in {} quantifier" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "missing terminating ] for character class" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "invalid escape sequence in character class" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "range out of order in character class" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nothing to repeat" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "unexpected repeat" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "unrecognized character after (? or (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named classes are supported only within a class" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "missing terminating )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "reference to non-existent subpattern" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "missing ) after comment" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regular expression is too large" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "failed to get memory" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") without opening (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "code overflow" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "unrecognized character after (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind assertion is not fixed length" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "malformed number or name after (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "conditional group contains more than two branches" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]digits must be followed by )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "unknown POSIX class name" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "character value in \\x{...} sequence is too large" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "invalid condition (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "recursive call could loop indefinitely" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "unrecognized character after (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "missing terminator in subpattern name" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "two named subpatterns have the same name" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "malformed \\P or \\p sequence" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "unknown property name after \\P or \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern name is too long (maximum 32 characters)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "too many named subpatterns (maximum 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "octal value is greater than \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "previously-checked referenced subpattern not found" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE group contains more than one branch" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inconsistent NEWLINE options" + +#: ../glib/gregex.c:476 +msgid "\\g is not followed by a braced, angle-bracketed, or quoted name or number, or by a plain number" +msgstr "\\g is not followed by a braced, angle-bracketed, or quoted name or number, or by a plain number" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "a numbered reference must not be zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) not recognized" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "number is too big" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "missing subpattern name after (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "digit expected after (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] is an invalid data character in JavaScript compatibility mode" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "different names for subpatterns of the same number are not allowed" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) must have an argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c must be followed by an ASCII character" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k is not followed by a braced, angle-bracketed, or quoted name" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N is not supported in a class" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "too many forward references" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "character value in \\u.... sequence is too large" + +#: ../glib/gregex.c:745 +#: ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Error while matching regular expression %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE library is compiled without UTF8 support" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE library is compiled without UTF8 properties support" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE library is compiled with incompatible options" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Error while optimizing regular expression %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal digit or '}' expected" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "hexadecimal digit expected" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "missing '<' in symbolic reference" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "unfinished symbolic reference" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "digit expected" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "illegal symbolic reference" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "unknown escape sequence" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Quoted text doesn't begin with a quotation mark" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text was empty (or contained only whitespace)" + +#: ../glib/gspawn.c:203 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Failed to read data from child process (%s)" + +#: ../glib/gspawn.c:362 +#, 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:853 +#: ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Child process exited with code %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Child process killed by signal %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Child process stopped by signal %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "Child process exited abnormally" + +#: ../glib/gspawn.c:1280 +#: ../glib/gspawn-win32.c:339 +#: ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Failed to read from child pipe (%s)" + +#: ../glib/gspawn.c:1348 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Failed to fork (%s)" + +#: ../glib/gspawn.c:1496 +#: ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Failed to change to directory '%s' (%s)" + +#: ../glib/gspawn.c:1506 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Failed to execute child process \"%s\" (%s)" + +#: ../glib/gspawn.c:1516 +#, 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:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Failed to fork child process (%s)" + +#: ../glib/gspawn.c:1533 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Unknown error executing child process \"%s\"" + +#: ../glib/gspawn.c:1557 +#, 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/gspawn.c:1630 +#: ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Failed to read data from child process" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Invalid string in environment: %s" + +#: ../glib/gspawn-win32.c:718 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Invalid working directory: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Failed to execute helper program (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Character out of range for UTF-8" + +#: ../glib/gutf8.c:1015 +#: ../glib/gutf8.c:1024 +#: ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 +#: ../glib/gutf8.c:1302 +#: ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Invalid sequence in conversion input" + +#: ../glib/gutf8.c:1313 +#: ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Character out of range for UTF-16" + +#: ../glib/gutils.c:2185 +#: ../glib/gutils.c:2212 +#: ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "בית אחד" +msgstr[1] "%u בתים" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f ק״ב" + +#: ../glib/gutils.c:2221 +#: ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f מ״ב" + +#: ../glib/gutils.c:2224 +#: ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f ג״ב" + +#: ../glib/gutils.c:2226 +#: ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ט״ב" + +#: ../glib/gutils.c:2229 +#: ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f פ״ב" + +#: ../glib/gutils.c:2232 +#: ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f א״ב" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "בית אחד" +msgstr[1] "%s בתים" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f ק״ב" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Incomplete data received for '%s'" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Unexpected error in waitpid() (%s)" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Abnormal program termination spawning command line `%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Command line `%s' exited with non-zero exit status %d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "workspace limit for empty substrings reached" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "repeating a DEFINE group is not allowed" + +#~ msgid "No service record for '%s'" +#~ msgstr "No service record for '%s'" + +#~ msgid "Error connecting: " +#~ msgstr "Error connecting: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Error connecting: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Error reading from unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Error closing unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Error writing to unix: %s" + +#~ msgid "File is empty" +#~ msgstr "File is empty" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "This option will be removed soon." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Error stating file '%s': %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 implementation limits username to %i characters" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a implementation limits hostname to %i characters" +#~ msgctxt "GDateTime" + +#~ msgid "am" +#~ msgstr "am" +#~ msgctxt "GDateTime" + +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Failed to set value\n" +#~ msgstr "Failed to set value\n" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Type of return value is incorrect, got `%s', expected `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "No such schema `%s' specified in override file `%s'" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Specify the path for the schema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Key %s is not writable\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "Error writing first 16 bytes of message to socket: " + +#~ msgid "The nonce-file `%s' was %lu bytes. Expected 16 bytes." +#~ msgstr "The nonce-file `%s' was %lu bytes. Expected 16 bytes." + +#~ msgid "Encountered array of length %" +#~ msgstr "Encountered array of length %" + +#~ msgid "Do not give error for empty directory" +#~ msgstr "Can't move directory over directory" + +#, 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 "" +#~ "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 "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.po b/po/hi.po new file mode 100644 index 0000000..3d53c28 --- /dev/null +++ b/po/hi.po @@ -0,0 +1,4474 @@ +# 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. +# chandankumar(ciypro) , 2012. +# rajesh , 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 23:40+0000\n" +"PO-Revision-Date: 2012-09-18 13:10+0530\n" +"Last-Translator: rajesh \n" +"Language-Team: Hindi \n" +"Language: hi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "बड़ी गणना मान को %s में भेजा गया" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "खोज बेस स्ट्रीम पर समर्थित नहीं है" + +#: ../gio/gbufferedinputstream.c:951 +#| msgid "Cannot truncate GMemoryInputStream" +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream काट नहीं सकता है" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "धारा पहले से बंद है" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "बेस स्ट्रीम पर कटान समर्थित नहीं है" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "ऑपरेशन रद्द था" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "अवैध वस्तु, आरंभीकृत नहीं" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "इनपुट में अधूरा multibyte अनुक्रम" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "गंतव्य में पर्याप्त स्थान नहीं" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "परिवर्तन इनपुट में अवैध बाइट अनुक्रम" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "परिवर्तन के दौरान त्रुटि: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "रद्द करने योग्य आरंभीकरण समर्थित नहीं है" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "वर्ण समूह '%s' से '%s' में परिवर्तन समर्थित नहीं है" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "अज्ञात प्रकार" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s फ़ाइल प्रकार" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials इस OS पर लागू नहीं है" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "आपके प्लेटफ़ार्म के लिए कोई GCredentials समर्थन नहीं है" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "अप्रत्याशित स्ट्रीम का समय से पहले अंत" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "पता प्रविष्ठि `%s' में असमर्थित कुंजी `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"पता '%s' अमान्य है (वास्तव में एक पथ, tmpdir, या सार कुंजी की जरूरत है)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "पता प्रविष्ठि '%s' में अर्थहीन कुंजी/मान जोड़े का संयोजन" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "पता `%s' में त्रुटि - पोर्ट की विशेषता सही नहीं हैं." + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "पता `%s' में त्रुटि - परिवार की विशेषता सही नहीं हैं." + +#: ../gio/gdbusaddress.c:454 +#, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "पता तत्व `%s' किसी कॉलन (:) समाहित नहीं करता है" + +#: ../gio/gdbusaddress.c:475 +#, c-format +#| msgid "" +#| "Key/Value pair %d, `%s', in address element `%s', does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "कुंजी/मान युग्म %d, `%s', पता तत्व `%s' में समान चिह्न नहीं समाहित है" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +" unescaping या कुंजी मान त्रुटि कुंजी/मान युग्म %d में, `%s', पता तत्व `%s' " +"में" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"त्रुटि पता `%s' में - इस यूनिक्स परिवहन कुंजी `पथ' या 'सार' में से एक को " +"वास्तव में सेट करने " +"की आवश्यकता है" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "पता `%s' में त्रुटि - होस्ट गुण नहीं है या विरूपित है" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "पता `%s' में त्रुटि - पोर्ट गुण नहीं है या विरूपित है" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "पता `%s' में त्रुटि - noncefile गुण नहीं है या विरूपित है" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "कनेक्ट करने में त्रुटि: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "अज्ञात या असमर्थित परिवहन `%s' पता `%s' के लिए" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' फ़ाइल खोलने में त्रुटि: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' फ़ाइल को पढ़ने में त्रुटि: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "`%s' फ़ाइल को पढ़ने में त्रुटि, अपेक्षित 16 बाइट्स, प्राप्त %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "फ़ाइल में लिखने में त्रुटि: %s" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "दिए गए पते रिक्त है" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "जब setuid होता है तो एक संदेश बस का विस्तार नहीं कर सकता है" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "मशीन आईडी के बिना एक संदेश बस संतति प्रक्रिया जनन नहीं कर सकते:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "`%s' कमांड लाइन स्पॉन करने में त्रुटि:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(इस विंडो को बंद करने के लिए किसी वर्ण को टाइप करें)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "सत्र dbus चल नहीं रहा है, और स्वतः लॉन्च विफल" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "सत्र बस पता (इस ओएस के लिए लागू नहीं) निर्धारित नहीं कर सकते" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE परिवेश चर से बस पता नहीं निर्धारित कर सकते हैं - अज्ञात " +"मान `" +"%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"बस पता निर्धारित नहीं कर सकते है क्योंकि DBUS_STARTER_BUS_TYPE वातावरण चर सेट " +"नहीं है" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "अज्ञात बस प्रकार %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr " पंक्ति को पढ़ने की कोशिश कर रहे सामग्री की अप्रत्याशित कमी" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "पंक्ति को (सुरक्षित) पढ़ने की कोशिश कर रहे सामग्री की अप्रत्याशित कमी" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "सभी उपलब्ध प्रमाणीकरण तंत्र समाप्त (कोशिश: %s) (उपलब्ध: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver के माध्यम से रद्द :: अधिकृत प्रमाणीकृत - सहकर्मी " + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "निर्देशिका '%s' को खोलने में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"निर्देशिका `%s' पर अनुमतियाँ विरूपित कर रहे हैं. उम्मीद मोड 0700, 0%o पाया" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "निर्देशिका `%s' बनाने में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "पढ़ने के लिए `%s' कीरिंग खोलने में त्रुटि: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "लाइन %d का टोकन विरूपित है सामग्री `%s' के साथ `%s' पर कीरिंग के " + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "लाइन %d का पहले टोकन विरूपित है सामग्री `%s' के साथ `%s' पर कीरिंग के" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"लाइन %d का दूसरी टोकन विरूपित है सामग्री `%s' के साथ `%s' पर कीरिंग के " + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "आईडी %d के साथ कुकी नहीं मिला `%s' पर कीरिंग में " + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' पुराना लॉक फ़ाइल को मिटाने में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "फाइल `%s लॉक बनाने में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(unlinked) लॉक फ़ाइल `%s' बंद करने में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "`%s' लॉक फ़ाइल unlinking में त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "लिखने के लिए `%s' कीरिंग खोलने में त्रुटि: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(इसके अतिरिक्त, `%s' के लिए लॉक जारी करने में विफल: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "कनेक्शन बंद है" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "समय समाप्ति तक पहुँच गया था" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"क्लाइंट-साइड कनेक्शन का निर्माण के दौरान असमर्थित ध्वजों का सामना करना पड़ा" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"ऐसा कोई अंतरफलक `org.freedesktop.DBus.Properties' पथ %s पर वस्तु पर नही" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "त्रुटि सेटिंग गुण `%s': अपेक्षित प्रकार `%s' लेकिन `%s' मिल गया" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "ऐसी कोई गुण `%s' नही" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' गुण पढ़ने योग्य नहीं है" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' गुण लिखने योग्य नहीं है" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "कोई अंतरफलक `%s' नहीं" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "कोई अंतरफलक नहीं" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "ऐसा कोई अंतरफलक `%s' पथ %s पर वस्तु पर नही" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "ऐसी कोई विधि `%s' नहीं है" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "संदेश का प्रकार, `%s', का मेल उम्मीद प्रकार `%s' से नहीं है" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "ऑब्जेक्ट पहले से ही %s पर अंतरफलक %s के लिए निर्यात किया गया है." + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "विधि `%s' लौटा प्रकार `%s', लेकिन `%s' की आशा" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "विधि `%s' अंतराफलक `%s' पर हस्ताक्षर `%s' के साथ मौजूद नहीं है" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "उपतरू %s के लिए पहले से ही निर्यात किया जाता है" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "छवि अवैध है" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL संदेश: PATH या MEMBER शीर्षक क्षेत्र गुम है" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN संदेश: REPLY_SERIAL शीर्षक क्षेत्र गुम है" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR संदेशशीर्षक: REPLY_SERIAL या ERROR_NAME शीर्षक क्षेत्र गुम है" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL संदेश: PATH, INTERFACE या MEMBER शीर्षक क्षेत्र गुम है" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL संदेश: पथ शीर्षक क्षेत्र आरक्षित मान /org/freedesktop/DBus/Localका " +"उपयोग कर " +"रहा है " + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL संदेश: The INTERFACE शीर्षक क्षेत्र आरक्षित मान org.freedesktop.DBus." +"Local " +"का उपयोग कर रहा है" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu बाइट पढ़ना चाहता था, लेकिन EOF मिला है" +msgstr[1] "%lu बाइट पढ़ना चाहता था, लेकिन EOF मिला है" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"अपेक्षित मान्य UTF-8 स्ट्रिंग लेकिन बाइट ऑफसेट %d (स्ट्रिंग की लंबाई %d है) " +"पर अवैध बाइट " +"पाया. वैध UTF-8 स्ट्रिंग उस बिंदु तक `%s' था." + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "अपेक्षित NUL बाइट स्ट्रिंग `%s' के बाद लेकिन बाइट %d पाया है" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "विश्लेषित मान `%s' एक वैध ऑब्जेक्ट डी बस पथ नहीं है" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "विश्लेषित मान `%s' एक वैध हस्ताक्षर डी बस नहीं है" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"लम्बाई %u बाइट की आकस्मिक सरणी. अधिकतम लंबाई 2<<26 बाइट्स (64 मेबा) है." +msgstr[1] "" +"लम्बाई %u बाइट की आकस्मिक सरणी. अधिकतम लंबाई 2<<26 बाइट्स (64 मेबा) है." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "विश्लेषित मान `%s' संस्करण के लिए एक मान्य हस्ताक्षर डी बस नहीं है" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"डी-बस तार प्रारूप से प्रकार स्ट्रिंग '%s' के साथ GVariant deserializing में " +"त्रुटि" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +" अवैध endianness मान. अपेक्षित 0x6c ('l') or 0x42 ('B') लेकिन प्राप्त मान0x%" +"02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "अवैध प्रमुख प्रोटोकॉल संस्करण. अपेक्षित 1 लेकिन %d पाया" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"हस्ताक्षर `%s' के साथ हस्ताक्षर शीर्षक लेकिन संदेश के मुख्य भाग खाली है" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "विश्लेषित मान `%s' एक वैध हस्ताक्षर डी बस (शरीर के लिए) नहीं है" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"कोई हस्ताक्षर शीर्षक संदेश में नहीं लेकिन संदेश के मुख्य भाग %u बाइट का है" +msgstr[1] "" +"कोई हस्ताक्षर शीर्षक संदेश में नहीं लेकिन संदेश के मुख्य भाग %u बाइट का है" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "संदेश डीसीरियलाइज़ नहीं कर सकते हैं:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"प्रकार स्ट्रिंग`%s' के साथ डी बस तार प्रारूप का क्रमागत GVariant त्रुटि" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"संदेश में %d फाइल विवरणकर्ता है, लेकिन शीर्षक क्षेत्र में %d फाइल विवरणकर्ता " +"इंगित है" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "संदेश को क्रमागत नहीं कर सकते हैं:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"संदेश का शरीर हस्ताक्षर `%s' है लेकिन वहाँ कोई हस्ताक्षर शीर्षक नहीं है" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"संदेश शरीर के प्रकार हस्ताक्षर '%s' है लेकिन शीर्षक क्षेत्र में हस्ताक्षर `% " +"s' है" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "संदेश शरीर रिक्त है, लेकिन शीर्षक क्षेत्र में हस्ताक्षर '(%s)' है" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "`%s' प्रकार के शरीर के साथ त्रुटि लौटा" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "रिक्त शरीर के साथ त्रुटि वापसी" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +#| msgid "Unable to trash file: %s" +msgid "Unable to get Hardware profile: %s" +msgstr "हार्डवेयर प्रोफ़ाइल पाने में विफल: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr " /var/lib/dbus/machine-id or /etc/machine-id लोड करने में असमर्थ: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "StartServiceByName के आह्वान में त्रुटि %s के लिए: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "अप्रत्याशित जवाब %d StartServiceByName(\"%s\") विधि से" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"विधि का आह्वान नहीं कर सकते; प्रॉक्सी एक मालिक के बिना एक जाने - माने नाम के " +"लिए है " +"औरप्रॉक्सी G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ध्वज के साथ निर्माण किया गया " +"था" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "सार नामस्थान समर्थित नहीं है" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "सर्वर का निर्माण के दौरान अस्थायी फ़ाइल निर्दिष्ट नहीं करें" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' पर अस्थायी फाइल लिखने में त्रुटि: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "स्ट्रिंग '%s' एक वैध डी बस GUID नहीं है" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "असमर्थित परिवहन `%s' पर नहीं सुन सकते हैं " + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "कमांड" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"आदेशों:\n" +" मदद यह जानकारी दिखाता है\n" +" आत्म - निरीक्षण दूरस्थ वस्तु का आत्मनिरीक्षण करें\n" +" निगरानी दूरस्थ वस्तु की निगरानी करें\n" +" कॉल दूरस्थ वस्तु पर एक विधि का आह्वान\n" +" उत्सर्जन संकेत का उत्सर्जन करें\n" +"\n" +"प्रयोग करें \"%s COMMAND --help\" प्रत्येक कमांड पर मदद पाने के लिए.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "त्रुटि: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "आत्मनिरीक्षण XML विश्लेषण में त्रुटि: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "तंत्र बस से कनेक्ट करें" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "सत्र बस से कनेक्ट करें" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "दिए गए डी बस पते से कनेक्ट करें" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "कनेक्शन समापन बिंदु विकल्प:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "कनेक्शन समापन बिंदु निर्दिष्ट विकल्प" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "कोई कनेक्शन अंतबिंदु निर्दिष्ट नहीं" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "एकाधिक कनेक्शन अंतबिंदु निर्दिष्ट नहीं" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "चेतावनी: आत्मनिरीक्षण डेटा के अनुसार, अंतरफलक `%s' मौजूद नहीं है\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"चेतावनी: आत्मनिरीक्षण डेटा के अनुसार, विधि `%s' अंतरफलक `%s' पर मौजूद नहीं " +"नहीं है\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "संकेत के लिए वैकल्पिक गंतव्य (अद्वितीय नाम)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "वस्तु पथ पर संकेत उत्सर्जन" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "संकेत और अंतरफलक नाम" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "संकेत का उत्सर्जन." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "कनेक्ट करने में त्रुटि: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "त्रुटि: वस्तु निर्दिष्ट पथ नहीं.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "त्रुटि: %s एक मान्य वस्तु पथ नहीं है\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "त्रुटि: संकेत निर्दिष्ट नहीं.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "त्रुटि: संकेत जरूर पूर्ण गुणवत्ता वाला नाम होना चाहिए.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "त्रुटि: %s एक वैध अंतरफलक नाम नहीं है\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "त्रुटि: %s एक मान्य सदस्य नाम नहीं है\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "त्रुटि: %s एक वैध अद्वितीय बस नाम नहीं है.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "पैरामीटर %d पार्स करने में त्रुटि: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "कनेक्शन निस्तब्धता में त्रुटि: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "गंतव्य नाम पर विधि आह्वान" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "वस्तु पथ पर विधि आह्वान" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "विधि और अंतरफलक नाम" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "सेकण्ड में समयसीमा" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr " दूरस्थ वस्तु पर एक विधि आह्वान." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "त्रुटि: गंतव्य निर्दिष्ट नहीं है\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "त्रुटि: ऑब्जेक्ट पथ निर्दिष्ट नहीं है\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "त्रुटि: विधि नाम निर्दिष्ट नहीं है\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "त्रुटि: विधि नाम `%s' अमान्य है\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "पैरामीटर %d पार्स करने में त्रुटि `%s' प्रकार का: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "आत्मविश्लेषण के लिए गंतव्य नाम" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "वस्तु आत्मविश्लेषण करने के लिए पथ" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "छापें XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "आत्मनिरीक्षण शिशु" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "केवल गुण मुद्रित" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "दूरस्थ वस्तु का आत्मनिरीक्षण." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "गंतव्य नाम की निगरानी करने के लिए" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "वस्तु पथ पर नजर रखने के लिए" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "दूरस्थ वस्तु का मॉनिटर करें." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "बेनाम" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "डेस्कटॉप फ़ाइल एक्स क्षेत्र को निर्दिष्ट नहीं करता है" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "अनुप्रयोग के लिए जरूरी टर्मिनल ढूँढ़ने में असमर्थ" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "उपयोक्ता अनुप्रयोग विन्यास फ़ोल्डर %s नहीं बना सकता है: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "MIME विन्यास फ़ोल्डर %s नहीं बना सकता है: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "अनुप्रयोग जानकारी में पहचानकर्ता का अभाव है" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "उपयोक्ता डेस्कटॉप फ़ाइल %s नहीं बना सकता है" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s के लिए मनपसंग परिभाषा" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ड्राइव बाहर निकालने या eject_with_operation को लागू नहीं करता है" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ड्राइव मीडिया प्रोफ़ाइलिंग कार्यान्वित नहीं करता है" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ड्राइव आरंभ करें कार्यान्वित नहीं करता है" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ड्राइव रोकें को कार्यान्वित नहीं करता है" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS समर्थन उपलब्ध नहीं है" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem एन्कोडिंग में (%d) टोकन की विरूपित संख्या" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon एन्कोडिंग में (%d) टोकन की विरूपित संख्या" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon के लिए एक GEmblem प्रत्याशित" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "समाहित करने वाला माउंट मौजूद नहीं है" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "निर्देशिका पर नक़ल नहीं कर सकता है" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "निर्देशिका पर निर्देशिका नक़ल नहीं कर सकता है" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "लक्ष्य फ़ाइल मौजूद है" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "निर्देशिका पुनरावर्ती रूप से नक़ल नहीं कर सकता है" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "जोडना समर्थित नहीं" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "फ़ाइल जोड़ने में त्रुटि: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "विशेष फ़ाइल नक़ल नहीं कर सकता है" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "अवैध सांकेतिक कड़ी प्रदत्त मान" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "रद्दी समर्थित नहीं है" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फ़ाइल नाम में '%c' नहीं हो सकता है" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "आवाज माउंट लागू नहीं कर सकता है" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "इस फ़ाइल के नियंत्रण के रूप में कोई अनुप्रयोग पंजीकृत नहीं है" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "इन्यूमेरेटर बंद है" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "फ़ाइल इन्यूमेरेटर में बचा ऑपरेशन है" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "स्ट्रीम query_info का समर्थन नहीं करती है" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "प्राप्ति स्ट्रीम पर समर्थित नहीं है" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "कटान इनपुट स्ट्रीम पर समर्थित नहीं है" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "कटान स्ट्रीम पर समर्थित नहीं है" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "(%d) टोकन की गलत संख्या" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s वर्ग नाम के लिए कोई प्रकार नहीं" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s प्रकार GIcon अंतरफलक लागू नहीं करता है" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s प्रकार वर्गीकृत नहीं है" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "विरूपित संस्कण संख्या: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s प्रकार from_tokens() को GIcon अंतरफलक पर लागू नहीं करता है" + +#: ../gio/gicon.c:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "चिह्न एन्कोडिंग का आपूर्ति संस्करण को नियंत्रित नहीं कर सकता है" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "कोई पता उल्लेखित नहीं" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "लम्बाई %u पते के लिए बहुत लंबा है" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "पता उपसर्ग लम्बाई से बाहर सेट बिट्स है" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "आईपी ​​पता मास्क की तरह '%s' व्याख्या नहीं कर सका" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "सॉकेट पता के लिए पर्याप्त स्थान नहीं" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "असमर्थित सॉकेट पता" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "स्ट्रीम के पास बची ऑपरेशन है" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "तत्व <%s> इसके अंदर स्वीकार्य नहीं है <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "तत्व <%s> शीर्षस्तर पर अनुमतिप्राप्त नहीं है" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "%s फाइल संसाधन में कई बार प्रकट होता है" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "किसी भी स्रोत निर्देशिका में '%s' का पता लगाने में विफल" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "वर्तमान निर्देशिका में '%s' का पता लगाने में विफल" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "अज्ञात प्रसंस्करण विकल्प \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "temp फ़ाइल बनाने में विफल: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +#| msgid "Error processing input file with xmllint" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint के साथ इनपुट फ़ाइल की प्रक्रिया में त्रुटि:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +#| msgid "Error processing input file with to-pixdata" +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata के साथ इनपुट फ़ाइल की प्रक्रिया में त्रुटि:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s फाइल पढ़ने में त्रुटि: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "%s फाइल संपीड़ित करने में त्रुटि" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "पाठ इसके अंदर प्रकट नहीं हो सकता है <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "आउटपुट फ़ाइल का नाम" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "फ़ाइल" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"निर्देशिका जहाँ फ़ाइलों (वर्तमान निर्देशिका का डिफ़ॉल्ट) के लिए पढ़ा जा रहे " +"हैं" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "निर्देशिका" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "लक्ष्य फ़ाइल नाम एक्सटेंशन के लिए चयनित प्रारूप में आउटपुट उत्पन करें " + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "स्रोत शीर्षक उत्पन्न करें" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"स्रोत कोड उत्पन्न करें अपने कोड में संसाधन फ़ाइल में लिंक का उपयोग करने के " +"लिए " + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "निर्भरता सूची उत्पन्न करें" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "स्वचालित रूप से संसाधन पंजीकृत और निर्माण नहीं करें" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "सी पहचानकर्ता नाम उत्पन्न किया गए स्रोत कोड के लिए इस्तेमाल किया" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"संसाधन फ़ाइल में एक संसाधन विनिर्देश संकलित.\n" +"संसाधन विनिर्देश फाइल एक्सटेंशन .gresource.xml है,\n" +"और संसाधन का फ़ाइल एक्सटेंशन .gresource से कहा जाता है." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "आपको वास्तव में एक फ़ाइल नाम देना चाहिए\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "खाली नाम की अनुमति नहीं हैं" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "अवैध नाम '%s': नाम लोअरकेस अक्षर के साथ शुरू करना चाहिए" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +#| msgid "" +#| "invalid name '%s': invalid character '%c'; only lowercase letters, " +#| "numbers and dash ('-') are permitted." +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"अमान्य नाम '%s': अमान्य वर्ण '%c'; केवल लोअरकेस अक्षर, संख्या और योजक चिह्न " +"('-') ही स्वीकृत हैं." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +#| msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "अवैध नाम '%s': दो लगातार योजक चिह्न ('--') की अनुमति नहीं है." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "अवैध नाम '%s': अंतिम वर्ण एक डैश ('-') नहीं हो सकता है." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "अवैध नाम '%s': अधिकतम लम्बाई 1024 है" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " हले से निर्दिष्ट किया जा चुका है" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "'सूची के' स्कीमा के लिए कुंजी नहीं जोड़ सकते हैं" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " हले से निर्दिष्ट किया जा चुका है" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" छाया है में; प्रयोग करें " +" मान को संशोधित करने के लिए" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"वास्तव में 'प्रकार', 'enum' या ;ध्वजों ' को किसी विशेषता के रूप में " +"निर्दिष्ट किया " +"जाना चाहिए" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> पारिभाषित (अभी तक) नहीं." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "अवैध GVariant प्रकार स्ट्रिंग '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " दी लेकिन स्कीमा कुछ भी नहीं प्रदान कर रहा है" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "कोई ओवरराइड करने के लिए नहीं" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " पहले से निर्दिष्ट किया जा चुका है" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " पहले से निर्दिष्ट किया जा चुका है" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr " का विस्तार मौजूदा स्कीमा '%s' अभी तक नहीं है" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr " का मौजूदा स्कीमा '%s' अभी तक की सूची नहीं है." + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr " पथ के साथ स्कीमा की एक सूची नहीं हो सकता है " + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "थ के साथ एक स्कीमा का विस्तार नहीं कर सकते हैं" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" एक सूची है, विस्तार जो एक सूची नहीं है" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" का विस्तार लेकिन " +"'%s' का विस्तार '%s' नहीं करता है" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "पथ, अगर दिया, शुरू करने के लिए और एक स्लेश के साथ अंत करना चाहिए" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "सूची के पथ ':/' के साथ समाप्त होना चाहिए" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> पहले से निर्दिष्ट किया जा चुका है" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "तत्व <%s> शीर्षस्तर पर अनुमतिप्राप्त नहीं है" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--सख्त निर्दिष्ट किया गया था, बाहर निकल रहा है.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "इस पूरे फ़ाइल को नजरअंदाज कर दिया गया है.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "इस फ़ाइल की उपेक्षा करें.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"ऐसा कोई कुंजी '%s' स्कीमा में `%s' रूप ओवरराइड फ़ाइल `%s' में निर्दिष्ट नहीं " + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; इस कुंजी के लिए ओवरराइड की अनदेखी करें.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " और --सख्त निर्दिष्ट किया गया था, बाहर निकल रहा है.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"पार्सिंग के दौरान त्रुटि कुंजी '%s' स्कीमा में `%s' के रूप इस ओवरराइड फ़ाइल`%" +"s' में " +"निर्दिष्ट: %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "इस कुंजी के लिए ओवरराइड की अनदेखी करें.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +#| msgid "" +#| "override for key `%s' in schema `%s' in override file `%s' is out of the " +#| "range given in the schema" +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"कुंजी `%s' के लिए ओवरराइड ओवरराइड फ़ाइल `%s' स्कीमा में `%s' स्कीमा में दी गई " +"श्रृंखला के " +"बाहर है" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"कुंजी `%s' के लिए ओवरराइड ओवरराइड फ़ाइल`%s' में स्कीमा `%s' में वैध विकल्पों " +"की सूची में " +"नहीं है" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled फ़ाइल को संग्रहीत कहाँ करें " + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "स्कीमा में किसी भी त्रुटि पर विफल" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Gschema.compiled फ़ाइल नहीं लिखना है " + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "कुंजी नाम प्रतिबंध लागू नहीं करेगी" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"स्कीमा कैश में सभी GSettings स्कीमा फ़ाइलों को संकलित करें.\n" +"स्कीमा फ़ाइलों के लिए विस्तार करने के लिए आवश्यक हैं .gschema.xml,\n" +"और कैश फ़ाइल नामक gschemas.compiled है." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "आपको वास्तव में एक निर्देशिका नाम देना चाहिए\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "कोई स्कीमा फाइल नहीं मिली: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "कुछ नहीं कर रही.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "मौजूदा आउटपुट फ़ाइल हटा दिया.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "तयशुदा स्थानीय निर्देशिका मॉनिटर प्रकार ढूँढ़ने में असमर्थ" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फ़ाइलनाम: %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फ़ाइलतंत्र सूचना पाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "रूट निर्देशिका का नाम नहीं बदल सकता है" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "फ़ाइल का नाम बदलने में त्रुटि: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "फ़ाइल का नाम नहीं बदल सकता है, फ़ाइलनाम पहले से मौजूद है" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "अवैध फ़ाइलनाम" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "डैरक्टरी नहीं खोल सकते है" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "फ़ाइल खोलने में त्रुटि: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "फ़ाइल हटाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "फ़ाइल रद्दी में भेजने में त्रुटि: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "रद्दी निर्देशिका %s बनाने में असमर्थ: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "रद्दी के लिए उच्च स्तरयी निर्देशिका ढूँढ़ने में असमर्थ" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "रद्दी निर्देशिका ढूँढ़ने और बनाने में असमर्थ" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "रद्दी सूचना फ़ाइल बनाने में असमर्थ: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "फ़ाइल रद्दी में भेजने में असमर्थ: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "आंतरिक त्रुटि" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "निर्देशिका बनाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "फ़ाइलतंत्र प्रतीकात्मक लिंक का समर्थन नहीं करता है" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "सांकेतिक कड़ी बनाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "फ़ाइल खिसकाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "निर्देशिका पर निर्देशिका नहीं खिसका सकता है" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "बैकअप फ़ाइल निर्माण विफल" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्ष्य फ़ाइल हटाने में त्रुटि: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "माउंट के बीच खिसकाना समर्थित नहीं" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "विशेषता मान को जरूर रिक्त होना चाहिए" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "अवैध विशेषता प्रकार (स्ट्रिंग प्रत्याशित)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "अवैध विस्तारित विशेषता नाम" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारित विशेषता '%s' सेट करने में त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (अवैध एन्कोडिंग)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "फाइल '%s' के लिए जानकारी प्राप्त करने में त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "फ़ाइल विवरणक के लिए जानकारी प्राप्त करने के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अवैध विशेषता प्रकार (uint32 प्रत्याशित)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अवैध विशेषता प्रकार (uint64 प्रत्याशित)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "अवैध विशेषता प्रकार (बाइट स्ट्रिंग प्रत्याशित)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "सिमलिंक पर अनुमति सेट नहीं कर सकता है" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "अनुमति सेट करने के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "स्वामी सेट करने के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "सांकेतिक कड़ी जरूर रिक्त होनी चाहिए" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "सांकेतिक कड़ी की सेटिंग में त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "सांकेतिक कड़ी की सेटिंग में त्रुटि: फ़ाइल एक सांकेतिक कड़ी नहीं है" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "रूपांतरण या पहुँच समय सेट करने के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ जरूर शून्येतर होना चाहिए" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ सेटिंग के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux इस तंत्र पर समर्थित नहीं है" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "विशेषता %s की सेटिंग समर्थित नहीं है" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "फ़ाइल से पढ़ने के दौरान त्रुटि: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फ़ाइल से प्राप्त करने में त्रुटि: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "फ़ाइल बंद करने में त्रुटि: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "तयशुदा स्थानीय फ़ाइल मॉनिटर प्रकार ढूँढ़ने में असमर्थ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "फ़ाइल में लिखने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "पुराने बैकअप कड़ी हटाने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "बैकअप की नक़ल बनाने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "अस्थाई फ़ाइल का नाम बदलने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "फ़ाइल काटने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फ़ाइल खोलने में त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "लक्ष्य फ़ाइल एक निर्देशिका है" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "लक्ष्य फ़ाइल एक सामान्य फ़ाइल नहीं है" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "यह फ़ाइल बाह्य स्तर पर रूपांतरित था" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "पुरानी फ़ाइल हटाने में त्रुटि: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "अवैध GSeekType की आपूर्ति" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "अवैध प्राप्ति आग्रह" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream काट नहीं सकता है" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "स्मृति आउटपुट स्ट्रीम का आकार बदलना संभव हीं" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "स्मृति आउटपुट स्ट्रीम का आकार बदलने में विफल" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"लिखने की प्रक्रिया के लिए आवश्यक स्मृति की मात्रा उपलब्ध पता स्थान से बड़ा है" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "अनुरोधित तलाश स्ट्रीम की शुरुआत से पहले" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउंट तुल्यकालित अंतर्वस्तु प्रकार गेसिंग लागू नहीं करता है" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "मेजबाननाम में '%s' शामिल है '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "संजाल तक पहुँच सम्भव नहीं है" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "होस्ट तक पहुँच सम्भव नहीं है" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "नेटवर्क मॉनिटर नहीं बना सका: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "नेटवर्क मॉनिटर नहीं बना सका:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "नेटवर्क स्थिति प्राप्त नहीं किया जा सका:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "आउटपुट स्ट्रीम लेखन लागू नहीं करता है" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "स्रोत स्ट्रीम पहले से बंद है" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' को हल करने में त्रुटि: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' के विलोम समाधान में त्रुटि: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' के लिए अनुरोधित प्रकार की कोई DNS रिकॉर्ड नहीं" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "अस्थायी रूप से '%s' हल करने में असमर्थ" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' हल करने में त्रुटि" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s' के लिए अपूर्ण आँकड़ा प्राप्त" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' में संसाधन मौजूद नहीं है" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' में संसाधन के लिए असंपीड़ित करने में विफल रहा है" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "संसाधन '%s' पर एक निर्देशिका नहीं है" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "इनपुट स्ट्रीम की तलाश लागू नहीं करता है" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "छपाई मदद" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "सूची वर्गों से युक्त elf फ़ाइल में संसाधनों" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"सूची संसाधन\n" +"यदि अनुभाग दिया है, केवल इस अनुभाग में संसाधनों की सूची\n" +"यदि पथ दिया जाता है, केवल मेल खाते संसाधनों की सूची" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "भाग" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"विवरण के साथ सूची संसाधनों\n" +"यदि अनुभाग दिया है, केवल इस अनुभाग में संसाधनों की सूची\n" +"यदि पथ दिया जाता है, केवल मेल खाते संसाधनों की सूची\n" +"विवरण में अनुभाग, आकार और संपीड़न शामिल हैं" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Stdout में संसाधन फ़ाइल को निकालें" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "फ़ाइल पथ" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"अज्ञात कमांड %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"प्रयोग:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"आदेशों:\n" +" मदद यह जानकारी दिखाएँ\n" +" अनुभागों सूची संसाधन अनुभागों\n" +" सूची सूची संसाधन\n" +" विवरण विवरण के साथ सूची संसाधनों\n" +" उद्धरण संसाधन को निकालें\n" +"\n" +"प्रयोग करें 'gresource help COMMAND' विस्तृत मदद पाने के लिए.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"प्रयोग:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "आर्गुमेंट:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " अनुभाग एक (वैकल्पिक) elf अनुभाग नाम\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " आदेश (वैकल्पिक) की व्याख्या के लिए आदेश\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " फ़ाइल elf फ़ाइल (एक द्विआधारी या एक साझा पुस्तकालय)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" फ़ाइल elf फ़ाइल (एक द्विआधारी या एक साझा पुस्तकालय)\n" +" या संकलित संसाधन फ़ाइल\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " पथ (वैकल्पिक) संसाधन पथ (आंशिक हो सकता है)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "पथ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " पथ संसाधन पथ\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "ऐसा कोई स्कीमा '%s' नहीं\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"स्कीमा '%s' पुनर्निधारणीय (पथ निर्दिष्ट नहीं किया जाना चाहिए) नहीं है\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "स्कीमा '%s' पुनर्निधारणीय (पथ निर्दिष्ट किया जाना चाहिए)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "पथ खाली दिए गए.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "पथ एक स्लैश (/) के साथ शुरू करना चाहिए\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "पथ एक स्लैश (/) के साथ समाप्त होना चाहिए\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "पथ दो आसन्न स्लैश (/ /) नहीं होना चाहिए\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "ऐसा कोई कुंजी '%s' नहीं\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "उपलब्ध कराई मान मान्य सीमा के बाहर है\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "सूची में स्थापित (गैर पुनर्निधारणीय) स्कीमा " + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "पुनर्निधारणीय स्कीमा स्थापित सूची" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "स्कीमा में कुंजी की सूची" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "स्कीमा के बच्चों की सूची" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"सूची कुंजी और मूल्यों, बारी बारी से\n" +"यदि कोई स्कीमा नहीं दिया जाता है, सभी कुंजी की सूची\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "कुंजी का मान पाया" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] कुंजी" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "कुंजी के लिए मान्य मानों की श्रृंखला क्वेरी" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "मान के लिए कुंजी का मान निर्धारित" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] कुंजी का मान" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "अपने डिफ़ॉल्ट मान के लिए कुंजी रीसेट करें" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "स्कीमा में अपने मूलभूत के लिए सभी कुंजी रीसेट करें" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "जाँचें अगर कुंजी लिखने योग्य है" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"परिवर्तन के लिए कुंजी मॉनिटर.\n" +"यदि कोई कुंजी निर्दिष्ट किया जाता है, स्कीमा में सभी कुंजी की निगरानी.\n" +"^C का उपयोग कर निगरानी रोके.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"प्रयोग:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"कमांड:\n" +"मदद इस जानकारी को दिखाएँ\n" +" सूची-स्कीमा अधिष्ठापित स्कीमाज़ की सूची\n" +" सूची पुनर्निधारणीय - स्कीमा सूची पुनर्निधारणीय - स्कीमा\n" +" सूची कुंजी स्कीमा में सूची कुंजी\n" +" सूची बच्चों स्कीमा की सूची बच्चों\n" +" सूची पुनरावर्ती सूची कुंजी और मूल्यों, बारी बारी से\n" +" श्रृंखला क्वेरीज़ एक कुंजी की श्रृंखला\n" +" प्राप्त कुंजी का मान प्राप्त\n" +" सेट कुंजी का मान सेट करें\n" +" रीसेट कुंजी का मान रीसेट करें\n" +" रीसेट रिकर्सिवली दिए गए स्कीमा में सभी मूल्यों को रीसेट करें\n" +" लिखने योग्य जांचें अगर एक कुंजी लिखने योग्य है\n" +" मानीटर परिवर्तन के लिए देखें\n" +"\n" +"प्रयोग करें 'gsettings help COMMAND' विस्तृत मदद पाने के लिए.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"प्रयोग:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR अतिरिक्त स्कीमा के लिए खोज निर्देशिका\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA स्कीमा का नाम\n" +" PATH पुनर्निधारणीय स्कीमा के लिए पथ\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " कुंजी स्कीमा के भीतर कुंजी (वैकल्पिक)\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " कुंजी स्कीमा के भीतर कुंजी\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " मान निर्धारित के लिए मान\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "खाली स्कीमा नाम दिए गए \n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "अवैध सॉकेट, आरंभीकृत नहीं" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "अवैध सॉकेट, इसके कारण आरंभीकरण विफल: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "सॉकेट पहले से बंद है" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "सॉकेट I/O टाइम आउट हो गया" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd से GSocket बना रहा है: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "सॉकेट बनाने में असमर्थ: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "अज्ञात परिवार निर्दिष्ट किया गया था." + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "अज्ञात प्रोटोकॉल निर्दिष्ट किया गया था" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "स्थानीय पता नहीं पा सका: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "दूरस्थ पता नहीं पा सका: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "सुन नहीं सका: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "पता में बांधने में त्रुटि: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "मल्टीकास्ट समूह में शामिल होने में त्रुटि: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "मल्टीकास्ट समूह छोड़ने में त्रुटि: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "स्रोत - विशिष्ट बहुस्त्र्पीय के लिए कोई समर्थन नहीं" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "कनेक्शन स्वीकार करने में त्रुटि: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "कनेक्शन प्रगति में" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "स्थगित त्रुटि पाने में असमर्थ: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "आंकड़ा पाने में त्रुटि: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "आंकड़ा भेजने में त्रुटि: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "सॉकेट बंद करने में असमर्थ: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "सॉकेट बंद करने में त्रुटि: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "सॉकेट स्थिति के लिए प्रतीक्षारत: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "संदेश भेजने में त्रुटि: %s" + +#: ../gio/gsocket.c:3825 +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage विंडोज़ पर समर्थित नहीं" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "संदेश पाने में त्रुटि: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials निर्धारित नहीं कर सकते इस ओएस के लिए" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "प्रॉक्सी सर्वर %s से कनेक्ट नहीं हो सका: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s से कनेक्ट नहीं हो सका: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "कनेक्ट नहीं हो सका:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "कनेक्ट करने पर अज्ञात त्रुटि" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +#| msgid "Trying to proxy over non-TCP connection is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "गैर-TCP कनेक्शन पर प्रॉक्सी समर्थित नहीं" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "प्रॉक्सी प्रोटोकॉल '%s' समर्थित नहीं है." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "श्रोता पहले से बंद है" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "जोड़ा गया सॉकेट बंद है" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 IPv6 पते '%s' समर्थन नहीं करता है" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "उपयोगकर्ता नाम SOCKSv4 प्रोटोकॉल के लिए भी लंबे है" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "होस्टनाम '%s' SOCKSv4 प्रोटोकॉल के लिए भी लंबे है" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "सर्वर एक SOCKSv4 प्रॉक्सी सर्वर नहीं है." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 सर्वर के माध्यम से कनेक्शन अस्वीकार कर दिया था" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "सर्वर एक SOCKSv5 प्रॉक्सी सर्वर नहीं है." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 प्रॉक्सी प्रमाणीकरण की आवश्यकता है." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 प्रॉक्सी प्रमाणीकरण पद्धति की आवश्यकता है जो glib द्वारा समर्थन नहीं " +"प्राप्त है." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "उपयोगकर्ता नाम या कूटशब्द SOCKSv5 प्रोटोकॉल के लिए बहुत लंबा है." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 प्रमाणीकरण गलत उपयोगकर्ता नाम या कूटशब्द के कारण विफल रहा है." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "होस्टनाम '%s' SOCKSv5 प्रोटोकॉल के लिए भी लंबे है" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 प्रॉक्सी सर्वर अज्ञात पते प्रकार का उपयोग करता है." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "आंतरिक SOCKSv5 प्रॉक्सी सर्वर त्रुटि." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Ruleset द्वारा SOCKSv5 कनेक्शन की अनुमति नहीं है." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 सर्वर के माध्यम से होस्ट तक पहुँच सम्भव नहीं." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 प्रॉक्सी के माध्यम से संजाल तक पहुँच सम्भव नहीं." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 प्रॉक्सी के माध्यम से कनेक्शन से इनकार कर दिया." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 प्रॉक्सी 'कनेक्ट' कमांड समर्थन नहीं करता है." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 प्रॉक्सी पते प्रकार का समर्थन प्रदान नहीं करता है." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "अज्ञात SOCKSv5 प्रॉक्सी त्रुटि." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon एन्कोडिंग का %d संस्करण नियंत्रित नहीं कर सकता है" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "पीईएम इनकोडिंग निजी कुंजी डिक्रिप्ट नहीं कर सकते" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "पीईएम इनकोडिंग निजी कुंजी नहीं पाया" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "पीईएम इनकोडिंग निजी कुंजी नहीं विश्लेषित कर सकता है" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "पीईएम इनकोडिंग प्रमाण पत्र नहीं पाया" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "पीईएम - इनकोडिंग प्रमाणपत्र नहीं विश्लेषित कर सकता है" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"आपकी पहुँच से आउट लॉक होने से पहले पासवर्ड सही ढंग से प्रवेश करने का यह आखिरी " +"मौका है." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"अनेक दाखिल पासवर्ड गलत कर दिया गया है, और अपने एक्सेस आगे विफलताओं के बाद " +"लॉक आउट हो " +"जाएगा." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "दाखिल कूटशब्द गलत है." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 नियंत्रण संदेश की आशा कर रहा है, %d पाया" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "सहायक आंकड़ा का अप्रत्याशित प्रकार" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "किसी एक fd की आशा कर रहा है, लेकिन %d पाया\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "अवैध fd पाया" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "क्रेडेंशियल्स भेजने में त्रुटि: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "त्रुटि जाँच कर रहा है अगर SO_PASSCRED गर्तिका के लिए सक्षम है: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +" जाँच के दौरान अप्रत्याशित विकल्प लंबाई अगर SO_PASSCRED सॉकेट के लिए सक्षम है." +" अपेक्षित " +"%d बाइट्स, प्राप्त %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "फ़ाइल का नाम बदलने में त्रुटि: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"क्रेडेंशियल्स प्राप्त करने के लिए एक एकल बाइट पढ़ा है, लेकिन शून्य बाइट्स " +"पढ़ने की उम्मीद थी" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "1 नियंत्रण संदेश की आशा कर रहा है, %d पाया" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED अक्षम के दौरान त्रुटि: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "फ़ाइल विवरणकर्ता व्यक्त करने में त्रुटि: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "फ़ाइल विवरणकर्ता व्यक्त करने में त्रुटि: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "फ़ाइलतंत्र रूट" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "फ़ाइल विवरणकर्ता व्यक्त करने में त्रुटि: %s" + +#: ../gio/gunixsocketaddress.c:244 +#| msgid "Abstract unix domain socket addresses not supported on this system" +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "अमूर्ति UNIX डोमेन सॉकेट पता इस तंत्र पर समर्थित नहीं" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "आयतन बाहर करें या eject_with_operation को लागू नहीं करता है" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "अनुप्रयोग ढूँढ़ नहीं सकता है" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग लॉन्च करने में त्रुटि: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "यूआरआई समर्थित नहीं" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 पर संगठन परिवर्तन समर्थित नहीं" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 पर संगठन निर्माण समर्थित नहीं" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "फ़ाइल से पढ़ने के दौरान त्रुटि: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "फ़ाइल बंद करने में त्रुटि: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "फ़ाइल में लिखने में त्रुटि: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "स्मृति के बाहर" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "आंतरिक त्रुटि: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "अधिक इनपुट की जरूरत है" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "अवैध होस्ट-नाम" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "पता जिसपर सुनना है" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "अनदेखा किया गया, GTestDbus के साथ संहत" + +#: ../gio/tests/gdbus-daemon.c:20 +#| msgid "Print help" +msgid "Print address" +msgstr "पता छापें" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "शेल अवस्था में पता छापें" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "कोई डीबस सेवा चलाएँ" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "गलत तर्क\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' अप्रत्याशित गुण '%s' तत्व के लिए" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' तत्व '%s' का गुण नहीं मिला" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' अप्रत्याशित टैग, '%s' टैग प्रत्याशित" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "अप्रत्याशित टैग '%s' '%s' के अंदर" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "कोई वैध पुस्तचिह्न आँकड़ा निर्देशिका में नहीं मिला" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न पहले से मौजूद है" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "यूआरआई '%s' के लिए कोई पुस्तचिह्न नहीं मिला" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "कोई MIME प्रकार यूआरआई '%s' के लिए पुस्तचिह्न में परिभाषित नहीं है" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न में कोई निजी फ्लैग परिभाषित नहीं है" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "यूआरआई '%s' के लिए पुस्तचिह्न में कोई समूह सेट नहीं है" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' के नाम से कोई अनुप्रयोग ने '%s' के लिए पुस्तचिह्न पंजीकृत नहीं है" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' एक्स पंक्ति यूआरआई '%s' से फैलाने में विफल रहा" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "इनपुट के अंत में आंशिक वर्ण अनुक्रम" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फालबैक '%s' को कोड सेट '%s' में परिवर्तित नहीं कर सका" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"\"file\" योजना का उपयोग करने वाली यूआरआई '%s' एक निरपेक्ष यूआरआई नहीं है" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फ़ाइल यूआरआई '%s' में एक '#' सम्मिलित नहीं है" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "यूआरआई '%s' अवैध है" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "यूआरआई '%s' का मेजबाननाम अवैध है" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "यूआरआई '%s' में अवैध एस्केप्ड वर्ण सम्मिलित हैं" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "पथनाम '%s' एक निरपेक्ष पथ नहीं है" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "अवैध होस्ट-नाम" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "पूर्वाह्न" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "अपराह्न" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "मार्च" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "जून" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "अगस्त" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "सितम्बर" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "अक्टूबर" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "नवम्बर" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "दिसम्बर" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "मार्च" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "जून" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "अग." + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "सित." + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "अक्तू." + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "नवं." + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "दिसं." + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "सोमवार " + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "मंगलवार " + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "बुधवार " + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "गुरुवार " + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "शुक्रवार " + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "शनिवार" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "रविवार " + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "सोम " + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "मंगल " + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "बुध " + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "गुरु " + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "शुक्र " + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "शनि" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "रवि " + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "निर्देशिका '%s' को खोलने में त्रुटि: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " %lu बाइट आबंटित नहीं किया जा सकता फ़ाइल \"%s\" को पढ़ने हेतु" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फ़ाइल को पढ़ने में त्रुटि: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" फ़ाइल काफी बड़ी है" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "फ़ाइल '%s' से पढ़ने में असफल: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फ़ाइल खोलने में असफल :%s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फ़ाइल '%s' की विशेषता ज्ञात करने में असफल: fstat() असफल: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "फ़ाइल '%s': fdopen() खोलने में असफल: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फ़ाइल '%s' को '%s' में नाम बदलने में विफल: g_rename() विफल: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फ़ाइल '%s' बनाने में असफल: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "फ़ाइल '%s' को लिखने के लिए खोलने में विफल: fdopen() विफल: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फ़ाइल को लिखने में विफल: fwrite() विफल: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फ़ाइल में लिखने में विफल: fflush() विफल: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फ़ाइल में लिखने में विफल: fwrite() विफल: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फ़ाइल बंद करने में विफल: fclose() विफल: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' मौजूदा फ़ाइल हटाया नहीं जा सकता: g_unlink() विफल: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "टैम्पलेट '%s' अवैध है, इसमें '%s' शामिल नहीं है" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "टैम्पलेट '%s' में XXXXXX समाहित नहीं है" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सिंबालिक लिंक '%s' से प्रसंग पढ़ने में असफल %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "सिंबालिक लिंक समर्थित नहीं है" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' से '%s' परिवर्तक नहीं खोला जा सका: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "यहाँ एक रॉ रीड नहीं कर सकता g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "रीड बफ़र में शेष है अपरिवर्तित बचा हुआ डेटा" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "आंशिक वर्ण में चैनल समाप्त होता है" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "यहाँ एक रॉ रीड नहीं कर सकता - g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "खोज निर्देशिका में वैध कुंजी फ़ाइल नहीं मिल सका" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "एक सामान्य फ़ाइल नहीं" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"कुंजी फ़ाइल में '%s' पंक्ति समाहित है जो कि एक कुंजी मान जोड़ा, समूह, या " +"टिप्पणी नहीं है" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध समूह नाम: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "कुंजी फ़ाइल एक समूह के साथ शुरू नहीं होता" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कुंजी नाम: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुंजी फ़ाइल में असमर्थित एनकोडिंग '%s' समाहित है" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुंजी फ़ाइल में '%s' समूह नहीं है" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुंजी फ़ाइल में '%s' कुंजी नहीं है" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुंजी फ़ाइल में '%s' कुंजी समाहित है '%s' मान के साथ जो UTF-8 नहीं है" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"कुंजी फ़ाइल में '%s' कुंजी है जिसमें स्थित मान का विश्लेषण नहीं किया जा सकता " +"है." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"कुंजी फ़ाइल में '%s' कुंजी है '%s' समूह में जिसके मान का विश्लेषण नहीं किया " +"जा सकता." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "कुंजी '%s' का मान '%s' है '%s' समूह में जहाँ %s अपेक्षित था" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुंजी फ़ाइल में '%s' कुंजी नहीं है '%s' समूह में" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "कुंजी फ़ाइल में पंक्ति के अंत में एस्केप संप्रतीक रहता है" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुंजी फ़ाइल में '%s' अमान्य शृंखला समाहित है" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान्य '%s' को एक संख्या की तरह नहीं विश्लेषित किया जा सकता." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "पूर्णांक मान '%s' दायरा के बाहर है" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' को एक फ्लोट संख्या की तरह नहीं विश्लेषित किया जा सकता." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' को बुलियन के तौर पर विश्लेषित नहीं किया जा सकता." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "फ़ाइल'%s%s%s%s' की विशेषता ज्ञात करने में असफल: fstat() असफल: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr " %s%s%s%s फ़ाइल चित्रित करने में विफल: mmap() विफल: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "फ़ाइल '%s' खोलने में असफल: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "पंक्ति %d वर्ण %d पर त्रुटि:" + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "नाम में अवैध यूटीएफ़-8 एनकोडेड पाठ - वैध '%s' नहीं" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' कोई वैध नाम नहीं है" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' कोई वैध नाम नहीं है: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "पंक्ति %d: पर त्रुटि %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "संप्रतीक संदर्भ '%-.*s' एक अनुमति प्राप्त संप्रतीक को एनकोड नहीं करता" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "खाली एंटिटी '&;' देखा; वैध एंटिटी हैं: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "एंटिटी नाम '%-.*s' ज्ञात नहीं है" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "" +"दस्तावेज़ एक अवयव के नाम से प्रारंभ होना चाहिए (उदाहरण के लिए- <पुस्तक>)" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"< के पश्चात आया '%s' एक वैध वर्ण नहीं है; यह अवयव नाम से प्रारंभ नहीं होता" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"'%s' विसम वर्ण, एक '>' संप्रतीक प्रत्याशित रिक्त तत्व टैग '%s' समाप्त करने के " +"लिए" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"विसम वर्ण '%s', प्रत्याशित है एक '=' लक्षण नाम '%s' अवयव '%s' के पश्चात्" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' एक वैध वर्ण नहीं है क्लोज़ अवयव नाम '%s' के बाद; स्वीकार्य वर्ण है '>'" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "अवयव '%s' बन्द था, कोई अवयव वर्तमान में खुला नहीं है" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "दस्तावेज़ '%s' बन्द था, परन्तु वर्तमान खुला अवयव है '%s'" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "दस्तावेज़ खाली था या उसमें सिर्फ श्वेत रिक्ति ही था" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से एक खुला एंगल ब्रेकेट '<' के पश्चात ही हो " +"गया" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से अवयवों के खुला होने पर भी हो गया - '%s' " +"अंतिम खुला हुआ " +"अवयव था" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से हो गया, वांछित था देखना एक क्लोज़ एंगल " +"ब्रेकेट टैग को बन्द " +"करता हुआ <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव नाम के भीतर हो गया" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता नाम के भीतर हो गया" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव-खोलने के टैग के भीतर हो गया." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से बराबर के चिह्न के बाद एक विशेषता नाम के " +"पश्चात् हो गया; " +"कोई विशेषता मूल्य नहीं" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "दस्तावेज़ का अंत अप्रत्याशित रूप से विशेषता मान के भीतर हो गया" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से अवयव '%s' हेतु बन्द टैग के भीतर हो गया" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"दस्तावेज़ का अंत अप्रत्याशित रूप से टिप्पणी या प्रक्रिया निर्देश के भीतर हो " +"गया" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "प्रयोग:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[विकल्प...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "मदद विकल्प:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "मदद विकल्प दिखाएँ" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "सभी मदद विकल्प दिखाएँ" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्प:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "पूर्णांक मान '%s' को %s के लिए विश्लेषण नहीं कर सकता" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "पूर्णांक मान '%s' %s के लिए दायरा के बाहर है" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' दोहरे मान का विश्लेषण %s के लिए नहीं कर सकता है" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' दोहरा मान %s के लिए परिसर से बाहर है" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "%s विकल्प विश्लेषण में त्रुटि" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s के लिए गुम तर्क" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "अनजान विकल्प %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "खराब वस्तु" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "आंतरिक त्रुटि या खराब वस्तु" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "स्मृति के बाहर" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "बैकट्रैकिंग सीमा पहुँच गई" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"प्रारूप में वे वस्तुएँ समाहित हैं जो आंशिक मिलान के लिए समर्थित नहीं हैं" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "प्रति संदर्भ क्योंकि परिस्थिति आंशिक मिलान के लिए समर्थित नहीं है" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "रिकर्सन सीमा समाप्त" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "न्यूलाइन फ्लैग का अवैध संयोग" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "खराब ऑफसेट" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "छोटा utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "रिकर्सन लूप" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "अज्ञात त्रुटि" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ प्रारूप के अंत में" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c प्रारूप के अंत में" + +#: ../glib/gregex.c:335 +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "अपरिचित वर्ण \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} क्वांटिफाइर में संख्या क्रमबद्ध नहीं" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} क्वांटिफायर में संख्या बहुत बड़ी" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "अनुपस्थित समाप्त करता ] वर्ण वर्ग के लिए" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "वर्ण वर्ग में अवैध एस्केप शृंखला" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "वर्ण वर्ग में दायरा क्रमबद्ध नहीं" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "दुहराने के लिए कुछ नहीं" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "अप्रत्याशित दुहराव" + +#: ../glib/gregex.c:360 +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "(? या (?- के बाद अपरिचित वर्ण" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "पोसिक्स नामित वर्ग केवल वर्ग के अंदर समर्थित है" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "समाप्ति चिह्न अनुपस्थित है )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "गैर मौजूद उप प्रारूप का संदर्भ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "अनुपस्थित ) टिप्पणी के बाद" + +#: ../glib/gregex.c:375 +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "नियमित अभिव्यक्ति काफी बड़ी है" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "स्मृति पाने में विफल" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") बिना द्वार के (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "कोड अतिप्रवाह" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< के बाद अपरिचित वर्ण" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "लुकबिहाइंड तथ्य स्थिर लंबाई की नहीं है" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "विरूपित संख्या या नाम के बाद (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "गोपनीय समूह में दो शाखाओं से अधिक समाहित है" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R या (?[+-]अंक को जरूर इसके साथ आना चाहिए )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "अज्ञात पोसिक्स वर्ग नाम" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "पोसिक्स कोलेटिंग तत्व समर्थित नहीं है" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} में वर्ण शृंखला काफी बड़ी है" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "अवैध परिस्थिति (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C लुकबिहाइंड तथ्य में स्वीकृत नहीं है" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, और \\u समर्थित नहीं है" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "पुनरावर्ती आह्वान अनिश्चित काल के लिए लूप कर सकता है" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P के बाद अपरिचित वर्ण" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "उप प्रारूप नाम में अनुपस्थित टर्मिनेटर" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "दो नाम उप प्रारूप के पास समान नाम हैं" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "विरूपित \\P या \\p शृंखला" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P या \\p के बाद अज्ञात गुण नाम" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "उप प्रारूप नाम काफी बड़ा है (अधिकतम 32 वर्ण का)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "कई नामित उप प्रारूप (अधिकतम 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "ओक्टल मान से बड़ा है \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "ओवररैन कंपाइलिंग कार्यस्थान" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "पहले से जाँचे गए संदर्भित उप प्रारूप नहीं मिला" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "परिभाषा समूह में एक से अधिक शाखाएँ हैं" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "असंगत न्यूलाइन विकल्प" + +#: ../glib/gregex.c:476 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g कोष्ठक, सर्पिल कोष्ठक, उद्धरित नाम या संख्या या बस संख्या के बाद नहीं आता " +"है" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "एक संख्या संदर्भ जरूर शून्य होना चाहिए" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" +"(*ACCEPT), (*FAIL), या (*COMMIT) के लिए कोई तर्क नहीं पालन किया जाता है" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) परिचित नहीं है" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "संख्या काफी बड़ी है" + +#: ../glib/gregex.c:492 +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "(?& के बाद अनुपस्थित उपप्रारूप नाम" + +#: ../glib/gregex.c:495 +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "(?+ के बाद प्रत्याशित अंक" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] अवैध आँकड़ा वर्ण है जावास्क्रिप्ट सुसंगतता अवस्था में" + +#: ../glib/gregex.c:501 +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "समान संख्या के उप प्रारूप के लिए भिन्न नाम की अनुमति नहीं है" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) को जरूर वितर्क होना चाहिए" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c को किसी ASCII वर्ण के बाद आना चाहिए" + +#: ../glib/gregex.c:510 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k कोष्ठक, सर्पिल कोष्ठक या उद्धरित नाम के बाद नहीं पालन किया जाता है" + +#: ../glib/gregex.c:513 +#| msgid "URIs not supported" +msgid "\\N is not supported in a class" +msgstr "\\N किसी वर्ग में समर्थित नहीं है" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "कई अग्रसारित संदर्भ" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), या (*THEN) में नाम काफी लंबा है" + +#: ../glib/gregex.c:522 +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... शृंखला में वर्ण मान काफी बड़ा है" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "नियमित अभिव्यक्ति %s मिलान के दौरान त्रुटि: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE लाइब्रेरी को बिना UTF8 समर्थन के कंपाइल किया गया है" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE लाइब्रेरी को बिना UTF8 गुण समर्थन के कंपाइल किया गया है" + +#: ../glib/gregex.c:1331 +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE लाइब्रेरी को असंगत विकल्प के साथ कंपाइल किया गया है" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "नियमित अभिव्यक्ति %s को वर्ण %d पर कंपाइल करने के दौरान त्रुटि: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "नियमित अभिव्यक्ति %s के अनुकूलित किए जाने के दौरान त्रुटि: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "हेस्काडेसीमल अंक या '}' प्रत्याशित" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "हेस्काडेसीमल अंक प्रत्याशित" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "अनुपस्थित '<' सांकेतिक संदर्भ में" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "अपूर्ण सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "शून्य लंबाई सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "अंक प्रत्याशित" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "अवैध सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "स्ट्रे फाइनल '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "अज्ञात एस्केप शृंखला" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "प्रतिस्थापन पाठ \"%s\" को %lu पर विश्लेषण के दौरान त्रुटि: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "कोटेड पाठ कोटेशन चिह्न के साथ प्रारंभ नहीं होता" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "कमांड पंक्ति में मेल नहीं खाते कोटेशन चिह्न या अन्य शैल-कोटेड पाठ" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ का अंत सिर्फ '\\' वर्ण के बाद हो गया. (पाठ था '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr " %c हेतु मैचिंग कोट से पहले पाठ अंत पाया. (पाठ था '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ खाली था (या उसमें सिर्फ श्वेत रिक्ति ही था)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "संतति प्रक्रिया (%s) से डेटा पढ़ने में असफल" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"एक संतति प्रक्रिया (%s) से चुनें() पढ़ने का डेटा में अप्रत्याशित त्रुटि हुई" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) में अप्रत्याशित त्रुटि" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "संतति प्रक्रिया %ld से बाहर निकल गया" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "संतति प्रक्रिया %ld के द्वारा समाप्त किया गया" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "संतति प्रक्रिया %ld संकेत के द्वारा रोका गया" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "संतति प्रक्रिया असामान्य रूप से बाहर निकल गया" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "संतति पाइप (%s) से पढ़ने में असफल" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फॉर्क करने में असफल" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "निर्देशिका '%s' (%s) पर बदलने में असफल" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "संतति प्रक्रिया \"%s\" (%s) कार्यान्वित करने में असफल" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "आउटपुट या संतति प्रक्रिया (%s) के इनपुट को अनुप्रेषित करने में असफल" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "संतति प्रक्रिया (%s) फॉर्क करने में असफल" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "संतति प्रक्रिया \"%s\" कार्यान्वित करने में अज्ञात त्रुटि" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "संतति पीआईडी पाइप (%s) से पर्याप्त डेटा पढ़ने में असफल" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "संतति प्रक्रिया (%s) से संचारण हेतु पाइप बनाने में असफल" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "संतति प्रक्रिया से डेटा पढ़ने में असफल" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "संतति प्रक्रिया (%s) कार्यान्वित करने में असफल" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध प्रोग्राम नाम: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d पर तर्क सदिश में अवैध स्ट्रिंग: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरण में अवैध स्ट्रिंग: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यशील निर्देशिका: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "हेल्पर प्रोग्राम (%s) कार्यान्वित करने में असफल" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"एक संतति प्रक्रिया से डेटा पढ़ने में g_io_channel_win32_poll() में " +"अप्रत्याशित त्रुटि" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "यूटीएफ-8 हेतु वर्ण सीमा से बाहर" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "परिवर्तन इनपुट में अवैध अनुक्रम" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "यूटीएफ-16 हेतु वर्ण सीमा से बाहर" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u बाइट" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f मे.बा." + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f गी.बा." + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f मे.बा." + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f गी.बा." + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f कि.बा." + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f कि.बा." + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s बाइट" +msgstr[1] "%s बाइट्स" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f कि.बा." + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "असामान्य प्रोग्राम समापन स्पॉनिंग कमांड लाइन `%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "कमांड लाइन `%s' गैर शून्य निकास स्थिति %d के साथ बाहर निकल गया: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "रिक्त उपस्ट्रिंग के लिए कार्य स्थान सीमा समाप्त" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "केस परिवर्तन एस्केप (\\l, \\L, \\u, \\U) यहाँ अनुमति प्राप्त नहीं है" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "किसी परिभाषा समूह को दुहराना स्वीकृत नहीं है" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' के लिए कोई सेवा रिकार्ड नहीं" + +#~ msgid "File is empty" +#~ msgstr "फ़ाइल खाली है" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "कुंजी फ़ाइल में '%s' कुंजी है जिसके मान का विश्लेषण नहीं किया जा सकता." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' फ़ाइल व्यक्त करने में त्रुटि: %s" + +#~ msgid "Error connecting: " +#~ msgstr "कनेक्ट करने में त्रुटि: " + +#~ msgid "Error connecting: %s" +#~ msgstr "कनेक्ट करने में त्रुटि: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "यूनिक्स से पढ़ने में त्रुटि: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "यूनिक्स बंद करने में त्रुटि: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "यूनिक्स में लिखने में त्रुटि: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "निर्देशिका पर निर्देशिका नहीं खिसका सकता है" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s प्रकार वर्गीकृत नहीं है" + +#, 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 "लंबी सूची प्रारूप का प्रयोग करें" diff --git a/po/hr.po b/po/hr.po new file mode 100644 index 0000000..da25725 --- /dev/null +++ b/po/hr.po @@ -0,0 +1,3816 @@ +# Translation of glib to Croatiann +# Copyright (C) Croatiann team +# Translators: Denis Lackovic ,Robert Sedak , +msgid "" +msgstr "" +"Project-Id-Version: glib 0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2008-05-18 15:38+0000\n" +"Last-Translator: Launchpad Translations Administrators \n" +"Language-Team: Croatian \n" +"Language: hr\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne mogu otvoriti pretvornik iz %s' u '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Djelomična znakovna sekvenca pri kraju izlaza" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne mogu prevesti '%s' u znakovni skup '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI lokalne datoteke '%s' ne smije uključivati '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' nije ispravan" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime računala URI-ja '%s' je neispravno" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' sadrži neispravne escape znakove" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja '%s' nije apsolutna putanja" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Neispravno ime računala" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Siječanj" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Veljača" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Ožujak" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Travanj" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Svibanj" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Lipanj" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Srpanj" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Sij" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Vel" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Ožu" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Tra" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Svi" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Lip" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Srp" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Ponedjeljak" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Utorak" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Srijeda" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Četvrtak" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Petak" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Subota" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Nedjelja" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pon" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Uto" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Sri" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Čet" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pet" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sub" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ned" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "GreÅ¡ka pri čitanju iz datoteke '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "GreÅ¡ka pri otvaranju datoteke '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Predložak '%s' ne zavrÅ¡ava sa XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka na retku %d znak %d: %s " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Neispravno Å¡ifrirani UTF-8 tekst" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Znakovna referenca '%-.*s' ne kodira dozvoljeni znak" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Prazan entitet '&;' ; ispravni entiteti su: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ime entiteta '%s' nije poznato" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi sa elementom(npr. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element '%s' je zatvoren, trenutno nema otvorenog elementa" + +#: ../glib/gmarkup.c:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je bio prazan ili je sadržavao samo znakove prazne znakove" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument je zavrÅ¡io neočekivano nakon otvaranja zagrade '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena elementa" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena atributa" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument je zavrÅ¡io neočekivano unutar vrijednosti atributa" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Kanal zavrÅ¡ava sa djelomičnim znakom" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "NezavrÅ¡ena znakovna referenca" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "NezavrÅ¡ena referenca entiteta" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tekst pod navodnicima ne počinje sa navodnikom" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Navodnik nije uparen u naredbenoj liniji" + +#: ../glib/gshell.c:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst je bio prazan (ili je sadržavao samo prazne znakove)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Nisam uspio čitati podatke od procesa djeteta" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nisam uspio čitati iz cjevovoda djeteta (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nisam mogao promijeniti putanju u mapu '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nisam mogao izvesti proces dijete (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Neispravno ime programa: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Neispravan niz znakova u argumentima na %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neispravan niz znakova u okružju: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neispravni radni direktorij: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Neuspjelo izvrÅ¡avanje pomoćnog programa (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Neuspjeh u čitanju podataka od procesa djeteta(%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Neočekivana greÅ¡ka u waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Pokretanje nije uspio (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Neuspjeh u izvrÅ¡avanju procesa djeteta \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nisam uspio pokrenuti proces dijete (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka u izvrÅ¡avanju procesa djeteta \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Znak je izvan raspona za UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Neispravna sekvenca u pretvaranju ulaza" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Znak je izvan raspona za UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Uporaba:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Opcije pomoći:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Prikaži opcije pomoći" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Prikaži sve opcije pomoći" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Prikaži sve opcije pomoći" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Analiza brojčane vrijednosti '%s' za %s nije uspjela" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Brojčana vrijednost '%s' za '%s' izvan opsega" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka prilikom analize opcije %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Nedostaje parametar za %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Nepoznata opcija %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Nije regularna datoteka" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Datoteka je prazna" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Datoteka s ključem ne započinje s grupom" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka s ključem sadrži nepodržano kodiranje '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka s ključem ne sadrži grupu '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka s ključem ne sadrži ključ '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "Datoteka s ključem na kraju retka ima izbjegnute znakove" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka s ključem sadrži neispravno izbjegnuti niz '%s'" + +#: ../glib/gkeyfile.c:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Brojčana vrijednost '%s' je izvan opsega" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Neispravna sekvenca bajtova u izlazu konverzije" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Nepoznata opcija %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "GreÅ¡ka na retku %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "GreÅ¡ka prilikom analize opcije %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Znak '%s' nije dozvoljen unutar imena entiteta" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Znak '%s' nije dozvoljen unutar imena entiteta" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Znak '%s' nije dozvoljen unutar imena entiteta" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "GreÅ¡ka prilikom analize opcije %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Neispravno ime računala" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Neispravno ime računala" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Nisam uspio pročitati simboličku vezu '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokument je zavrÅ¡io neočekivano unutar imena atributa" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka pri otvaranju mape '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Neispravno ime računala" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Nepoznata opcija %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "GreÅ¡ka pri stvaranju datoteke '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Nisu podržane simboličke veze" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "GreÅ¡ka na retku %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka prilikom konverzije: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Nisu podržane simboličke veze" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "GreÅ¡ka pri čitanju datoteke '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/hu.po new file mode 100644 index 0000000..9fe857f --- /dev/null +++ b/po/hu.po @@ -0,0 +1,4368 @@ +# Hungarian translation of glib +# This file is distributed under the same license as the glib package. +# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, Free Software Foundation, Inc. +# +# Szabolcs Varga , 2005. +# Gabor Kelemen , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-13 22:38+0000\n" +"PO-Revision-Date: 2012-09-18 01:20+0200\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"Language: hu\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, 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:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "Az alap adatfolyam nem támogatja a pozicionálást" + +#: ../gio/gbufferedinputstream.c:951 +#| msgid "Cannot truncate GMemoryInputStream" +msgid "Cannot truncate GBufferedInputStream" +msgstr "A GBufferedInputStream nem csonkítható" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Az adatfolyam már le van zárva" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "Az alap adatfolyam csonkítása nem engedélyezett" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "A művelet megszakítva" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Érvénytelen objektum, nincs előkészítve" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Érvénytelen több bájtos sorozat a bemenetben" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Nincs elég hely a célon" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Érvénytelen bájtsorrend az átalakítás bemenetében" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Hiba az átalakítás során: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "A megszakítható előkészítés nem támogatott" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, 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" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s típus" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Ismeretlen típus" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s fájltípus" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "A GCredentials nincs megvalósítva ezen a rendszeren" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "A platformhoz nincs GCredentials támogatás" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Váratlan korai adatfolyam vége" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nem támogatott „%s” kulcs a(z) „%s” címbejegyzésben" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"A(z) „%s” cím érvénytelen (csak az útvonal, tmp könyvtár vagy absztrakt " +"kulcs egyike lehet)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Értelmetlen kulcs/érték párkombináció a(z) „%s” címbejegyzésben" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Hiba a(z) „%s” címben – a port attribútum rosszul formázott" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Hiba a(z) „%s” címben – a család attribútum rosszul formázott" + +#: ../gio/gdbusaddress.c:454 +#, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "A(z) „%s” címelem nem tartalmaz kettőspontot (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +#| msgid "" +#| "Key/Value pair %d, `%s', in address element `%s', does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "%d. kulcspár: „%s” a(z) „%s” címelemben nem tartalmaz egyenlőségjelet" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Hiba a(z) „%3$s” címelemben található a(z) %1$d. kulcspárban lévő „%2$s” " +"kulcs vagy érték értelmezésekor." + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Hiba a(z) „%s” címben – a unix szállítás a „path” vagy „abstract” kulcsok " +"pontosan egyikének jelenlétét igényli" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Hiba a(z) „%s” címben – a host attribútum hiányzik vagy rosszul formázott" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Hiba a(z) „%s” címben – a port attribútum hiányzik vagy rosszul formázott" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Hiba a(z) „%s” címben – a noncefile attribútum hiányzik vagy rosszul " +"formázott" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Hiba az automatikus indításkor: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Ismeretlen vagy nem támogatott szállítás („%s”) a címhez („%s”)" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Hiba a(z) „%s” ideiglenes fájl megnyitásakor: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Hiba a(z) „%s” ideiglenes fájl olvasása közben: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Hiba a(z) „%s” ideiglenes fájl olvasása közben, a várt 16 bájt helyett %d " +"érkezett" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Hiba az ideiglenes fájl („%s”) tartalmának írásakor az adatfolyamba:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "A megadott cím üres" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "Nem indítható üzenetbusz setuid módban" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Nem indítható üzenetbusz gépazonosító nélkül: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Hiba a(z) „%s” parancssor indításakor: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Az ablak bezárásához nyomjon le egy gombot)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "A munkamenet D-Bus nem fut, és az automatikus indítás sikertelen" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Nem határozható meg a munkamenetbusz címe (nincs megvalósítva erre az OS-re)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nem határozható meg a busz címe a DBUS_STARTER_BUS_TYPE környezeti " +"változóból – ismeretlen „%s” érték" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nem határozható meg a busz címe, mivel a DBUS_STARTER_BUS_TYPE környezeti " +"változó nincs beállítva" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Ismeretlen busztípus: %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "A tartalom váratlanul hiányzik a sor olvasásakor" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "A tartalom váratlanul hiányzik a sor (biztonságos) olvasásakor" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Minden elérhető hitelesítési mechanizmus kimerítve (próbálva: %s, elérhető: " +"%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Megszakítva a GDBusAuthObserver::authorize-authenticated-peer használatával" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Hiba a(z) „%s” könyvtár információinak lekérésekor: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"A(z) „%s” könyvtár jogosultságai rosszul formázottak. A várt 0700 mód " +"helyett 0%o érkezett." + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Hiba a(z) „%s” könyvtár létrehozásakor: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Hiba a(z) „%s” kulcstartó megnyitásakor olvasásra: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "A(z) „%2$s” kulcstartó „%3$s” tartalmú „%1$d”. sora rosszul formázott" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"A(z) „%2$s” kulcstartó „%3$s” tartalmú „%1$d”. sorának első egysége rosszul " +"formázott" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"A(z) „%2$s” kulcstartó „%3$s” tartalmú „%1$d”. sorának második egysége " +"rosszul formázott" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Nem található %d azonosítójú süti a kulcstartóban itt: „%s ”" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Hiba az elavult „%s” zárolásfájl törlése közben: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Hiba a(z) „%s” zárolási fájl létrehozásakor: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Hiba a (törölt) „%s” zárolási fájl lezárásakor: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Hiba a(z) „%s” zárolási fájl törlésekor: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Hiba a(z) „%s” kulcstartó írásra való megnyitásakor: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Ezen kívül a(z) „%s” zárolásának feloldása is meghiúsult: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "A kapcsolat le van zárva" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Az időkorlát elérve" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "Nem támogatott jelzők találhatók a kliensoldali kapcsolat létrehozásakor" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nincs „org.freedesktop.DBus.Properties” felület a(z) %s útvonalon lévő " +"objektumon" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Hiba a(z) „%s” tulajdonság beállításakor: a várt „%s” típus helyett „%s” " +"érkezett" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Nincs „%s” tulajdonság" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "A tulajdonság („%s”) nem olvasható" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "A tulajdonság („%s”) nem írható" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Nincs „%s” felület" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Nincs ilyen felület" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nincs „%s” felület a(z) %s útvonalon lévő objektumon" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Nincs „%s” metódus" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Az üzenet „%s” típusa nem felel meg a várt „%s” típusnak" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Már exportálva van egy objektum a(z) %s felülethez itt: %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "A metódus („%s”) a(z) „%s” típust adta vissza a várt „%s” helyett" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "A metódus („%s”) nem létezik a(z) „%s” felületen „%s” aláírással" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Egy részfa már exportálva van a következőhöz: %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "a típus érvénytelen" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL üzenet: a PATH vagy MEMBER fejlécmező hiányzik" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN üzenet: a REPLY_SERIAL fejlécmező hiányzik" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR üzenet: a REPLY_SERIAL vagy ERROR_NAME fejlécmező hiányzik" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL üzenet: a PATH, INTERFACE vagy MEMBER fejlécmező hiányzik" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL üzenet: a PATH fejlécmező a fenntartott /org/freedesktop/DBus/Local " +"értéket használja" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL üzenet: az INTERFACE fejlécmező a fenntartott value org.freedesktop." +"DBus.Local értéket használja" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Az olvasandó %lu bájt helyett EOF érkezett" +msgstr[1] "Az olvasandó %lu bájt helyett EOF érkezett" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"A várt érvényes UTF-8 karakterlánc helyett érvénytelen bájtok találhatók a" +"(z) %d bájteltolásnál (a karakterlánc hossza: %d). Az érvényes UTF-8 " +"karakterlánc az adott pontig: „%s”" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "A(z) „%s” karakterlánc után várt NULL bájt helyett %d bájt található" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "A feldolgozott „%s” érték nem érvényes D-Bus objektumútvonal" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "A feldolgozott „%s” érték nem érvényes D-Bus aláírás" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "%u bájt hosszú tömb található. A maximális hossz 2<<26 bájt (64 MiB)." +msgstr[1] "%u bájt hosszú tömb található. A maximális hossz 2<<26 bájt (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "A változat feldolgozott „%s” értéke nem érvényes D-Bus aláírás" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "Hiba a(z) „%s” típusú GVariant visszafejtésekor a D-Bus átviteli formátumból" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Érvénytelen bájtsorrend-érték. A várt 0x6c („l”) vagy 0x42 („B”) helyett 0x" +"%02x érték található" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Érvénytelen fő protokollverzió. A várt 1 helyett %d található" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Aláírásfejléc található „%s” aláírással, de az üzenettörzs üres" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "A feldolgozott „%s” érték nem érvényes D-Bus aláírás (a törzshöz)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Nincs aláírásfejléc az üzenetben, de az üzenettörzs %u bájt" +msgstr[1] "Nincs aláírásfejléc az üzenetben, de az üzenettörzs %u bájt" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Nem fejthető sorba az üzenet: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Hiba a(z) „%s” típusú GVariant sorbafejtésekor a D-Bus átviteli formátumba" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "Az üzenethez %d fájlleíró tartozik, de a fejlécmező %d fájlleírót jelez" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Az üzenet nem fejthető sorba: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Az üzenettörzs „%s” aláírással rendelkezik, de nincs aláírásfejléc" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Az üzenettörzs „%s” típusaláírással rendelkezik, de az aláírásfejlécben lévő " +"aláírás: „%s”" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Az üzenettörzs üres, de az aláírásfejlécben lévő aláírás: „%s”" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Hiba került visszaadásra a(z) „%s” típusú törzzsel" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Hiba került visszaadásra az üres törzzsel" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +#| msgid "Unable to trash file: %s" +msgid "Unable to get Hardware profile: %s" +msgstr "Nem kérhető le hardverprofil: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nem tölthető be a /var/lib/dbus/machine-id vagy az /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Hiba a StartServiceByName hívásakor ehhez: %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Váratlan válasz (%d) a StartServiceByName(\"%s\") metódustól" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"A metódus nem hívható; a proxy egy jól ismert névhez tartozik tulajdonos " +"nélkül, és a proxy a G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START jelzővel készült" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Az absztrakt névtér nem támogatott" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Kiszolgáló létrehozásakor nem adható meg az ideiglenes fájl" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Hiba az ideiglenes fájl („%s”) írásakor: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "A(z) „%s” karakterlánc nem érvényes D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nem figyelhető a nem támogatott „%s” szállítás" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "PARANCS" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Parancsok:\n" +" help Ezen súgó megjelenítése\n" +" introspect Betekintés távoli objektumba\n" +" monitor Távoli objektum figyelése\n" +" call Metódushívás távoli objektumon\n" +" emit Szignál kibocsátása\n" +"\n" +"Az egyes parancsok súgója a „%s PARANCS --help” kiadásával érhető el.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Hiba: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Hiba a betekintési XML feldolgozása során: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Csatlakozás a rendszerbuszhoz" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Csatlakozás a munkamenetbuszhoz" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Csatlakozás a megadott D-Bus címhez" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Kapcsolatvégpont beállításai:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "A kapcsolat végpontját megadó beállítások" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nincs megadva kapcsolatvégpont" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Több kapcsolatvégpontot adott meg" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Figyelmeztetés: a betekintési adatok szerint a(z) „%s” felület nem létezik\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Figyelmeztetés: a betekintési adatok szerint a felületen („%2$s”) nem " +"létezik „%1$s” metódus\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "A szignál elhagyható célja (egyedi név)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Szignál kibocsátása ezen az objektumútvonalon" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Szignál és felület neve" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Szignál kibocsátása." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Hiba a csatlakozáskor: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Hiba: az objektumútvonal nincs megadva.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Hiba: a(z) %s nem érvényes objektumútvonal\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Hiba: a szignál nincs megadva.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Hiba: a szignálnak teljes képzésű névnek kell lennie.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Hiba: a(z) %s nem érvényes felületnév\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Hiba: a(z) %s nem érvényes tagnév\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Hiba: a(z) %s nem érvényes egyedi busznév.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Hiba a(z) %d. paraméter feldolgozásakor: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Hiba a kapcsolat kiürítésekor: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "A cél neve a metódushíváshoz" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Objektum útvonala a metódushíváshoz" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Metódus és felület neve" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Időkorlát másodpercben" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Metódus hívása távoli objektumon." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Hiba: a cél nincs megadva\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Hiba: az objektumútvonal nincs megadva\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Hiba: a metódusnév nincs megadva\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Hiba: a metódusnév („%s”) érvénytelen\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Hiba a(z) „%2$s” típusú %1$d. paraméter feldolgozásakor: %3$s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "A cél neve a betekintéshez" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Az objektumútvonal a betekintéshez" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML kiírása" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Betekintés gyermekekbe" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Csak a tulajdonságok kiírása" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Betekintés távoli objektumba." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Megfigyelendő cél neve" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Megfigyelendő objektumútvonal" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Távoli objektum megfigyelése." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Névtelen" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "A desktop fájl nem adta meg az Exec mezőt" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Nem található az alkalmazáshoz szükséges terminál" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Az alkalmazásinformációkból hiányzik az azonosító" + +#: ../gio/gdesktopappinfo.c:2069 +#, 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:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s egyéni meghatározása" + +#: ../gio/gdrive.c:393 +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:470 +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:543 +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:746 +msgid "drive doesn't implement start" +msgstr "a meghajtó nem valósítja meg a indítást" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "a meghajtó nem valósítja meg a leállítást" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "A TLS-támogatás nem érhető el" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Egy GEmblem kellene a GEmblemedIconhoz" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "A tartalmazó csatolás nem létezik" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Nem lehet a könyvtárra másolni" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "A könyvtár nem másolható könyvtárba" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "A célfájl létezik" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "A könyvtár nem másolható rekurzívan" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "A fájlillesztés nem támogatott" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Hiba a fájl illesztése közben: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "A speciális fájl nem másolható" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Érvénytelen szimbolikus link érték került megadásra" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "A Kuka nem támogatott" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "A fájlnevek nem tartalmazhatnak „%c” karaktert" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "a kötet nem valósítja meg a csatolást" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Nincs alkalmazás regisztrálva a fájl kezeléséhez" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Az enumerátor le van zárva" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "A fájlenumerátor hátralévő művelettel rendelkezik" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Az adatfolyam nem támogatja a query_info-t" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Az adatfolyam nem támogatja a pozicionálást" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "A bemeneti adatfolyam csonkítása nem engedélyezett" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Az adatfolyam csonkítása nem engedélyezett" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "A jelsorok száma hibás (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Nincs típus az osztálynévhez: %s" + +#: ../gio/gicon.c:314 +#, 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:325 +#, c-format +msgid "Type %s is not classed" +msgstr "A típus (%s) nem tartalmaz osztályokat" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Rosszul formált verziószám: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Az ikonkódolás megadott verziója nem kezelhető" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nincs megadva cím" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "A(z) %u cím túl rövid a címhez" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "A címben az előtag hosszán túl is be vannak állítva bitek" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Nem dolgozható fel a(z) „%s” IP-cím maszkként" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nincs elég hely a foglalat címének" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nem támogatott foglalatcím" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Az adatfolyam hátralévő művelettel rendelkezik" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%s> elem nem engedélyezett ezen belül: <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "<%s> elem nem engedélyezett a felső szinten" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "A(z) %s fájl többször is megjelenik az erőforrásban" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "A(z) „%s” nem található egyik forráskönyvtárban sem" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "A(z) „%s” nem található a jelenlegi könyvtárban" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Ismeretlen feldolgozási kapcsoló: „%s”" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Nem sikerült létrehozni az ideiglenes fájlt: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +#| msgid "Error processing input file with xmllint" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Hiba a bemeneti fájl feldolgozásakor az xmllint-tel:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +#| msgid "Error processing input file with to-pixdata" +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Hiba a bemeneti fájl feldolgozásakor a to-pixdata-val:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Hiba a(z) %s fájl olvasása közben: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Hiba a fájl tömörítése közben: %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "nem jelenhet meg szöveg ezen belül: <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "a kimeneti fájl neve" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FÁJL" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "A fájlok olvasása ebből a könyvtárból (alapértelmezett: aktuális könyvtár)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "KÖNYVTÁR" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "Kimenet előállítása a célfájl kiterjesztése által kiválasztott formátumban" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Forrásfejléc előállítása" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Az erőforrásfájl kódba linkelésére használt forráskód előállítása" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Függőséglista előállítása" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Ne hozza létre és ne regisztrálja automatikusan az erőforrást" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Az előállított forráskódhoz használt C azonosító neve" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Erőforrás-specifikáció erőforrásfájlba fordítása.\n" +"Az erőforrás-specifikációs fájlok kiterjesztése .gresource.xml,\n" +"az erőforrásfájl kiterjesztése pedig .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Pontosan egy fájlnevet kell megadnia\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "az üres nevek nem engedélyezettek" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "érvénytelen név („%s”): a neveknek kisbetűvel kell kezdődniük" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +#| msgid "" +#| "invalid name '%s': invalid character '%c'; only lowercase letters, " +#| "numbers and dash ('-') are permitted." +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"érvénytelen név („%s”): érvénytelen karakter: „%c”. Csak kisbetűk, számok és " +"kötőjel („-”) engedélyezettek." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +#| msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "érvénytelen név („%s”): két egymást követő kötőjel („--”) nem engedélyezett." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "érvénytelen név („%s”): az utolsó karakter nem lehet kötőjel („-”)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "érvénytelen név („%s”): a maximális hossz 1024 karakter" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " már meg van adva" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "nem adhatók kulcsok „list-of” sémához" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " már meg van adva" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" leárnyékolja ezt: ebben: ; " +"az érték módosításához használja az címkét" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "a attribútumaként csak a „type”, „enum” vagy „flags” egyike adható meg" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (még) nincs megadva." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "érvénytelen GVariant típuskarakterlánc: „%s”" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "az megadva, de a séma nem terjeszt ki semmit" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "nincs felülírandó " + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " már megadva" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " már megadva" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr "a a még nem létező „%s” sémát terjeszti ki" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr "a a még nem létező „%s” séma listája" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nem lehet séma listája útvonallal" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nem terjeszthet ki sémát útvonallal" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr "a lista a nem lista sémát terjeszti ki" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +"a kiterjeszti ezt: , de „%s” nem terjeszti ki ezt: „%s”" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ha meg van adva útvonal, akkor osztásjellel kell kezdődnie és végződnie" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "a lista útvonalának „:/” karakterekkel kell végződnie" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> már meg van adva" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "<%s> elem nem engedélyezett a felső szinten" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "a --strict meg lett adva, kilépés.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Ez az egész fájl figyelmen kívül marad.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Fájl figyelmen kívül hagyása.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nincs „%s” kulcs a(z) „%s” sémában a(z) „%s” felülbírálási fájlban megadott " +"módon" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; kulcs felülbírálásának figyelmen kívül hagyása.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " és a --strict meg lett adva, kilépés.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"hiba a(z) „%s” kulcs feldolgozásakor a(z) „%s” sémában a(z) „%s” " +"felülbírálási fájlban megadott módon: %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Kulcs felülbírálásának figyelmen kívül hagyása.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +#| msgid "" +#| "override for key `%s' in schema `%s' in override file `%s' is out of the " +#| "range given in the schema" +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"a(z) „%2$s” séma „%1$s” kulcsának felülbírálása a(z) „%3$s” felülbírálási " +"fájlban a sémában megadott tartományon kívül esik" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"a(z) „%2$s” séma „%1$s” kulcsának felülbírálása a(z) „%3$s” felülbírálási " +"fájlban nincs az érvényes lehetőségek listájában" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "a gschemas.compiled fájl tárolási helye" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Megszakítás a sémák bármely hibája esetén" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Ne írja ki a gschema.compiled fájlt" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Ne kényszerítse ki a kulcsnévmegszorításokat" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Minden GSettings sémafájl sémagyorsítótárba fordítása.\n" +"A sémafájloknak .gschema.xml kiterjesztéssel kell rendelkezniük,\n" +"és a gyorsítótárfájl neve gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Pontosan egy könyvtárnevet kell megadnia\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Nem találhatók sémafájlok: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "nem történik semmi.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "meglévő kimeneti fájl eltávolítva.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Érvénytelen fájlnév: %s" + +#: ../gio/glocalfile.c:967 +#, 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:1135 +msgid "Can't rename root directory" +msgstr "Nem nevezhető át a gyökérkönyvtár" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Hiba a fájl átnevezése közben: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "A fájl nem nevezhető át, a fájlnév már létezik" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Érvénytelen fájlnév" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "A könyvtár nem nyitható meg" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Hiba a fájl megnyitása közben: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Hiba a fájl eltávolítása közben: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Hiba fájl kidobása közben: %s" + +#: ../gio/glocalfile.c:1883 +#, 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:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Nem található a Kuka felső szintű könyvtára" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +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:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nem lehet a Kukába dobni a fájlt: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "belső hiba" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Hiba a könyvtár létrehozásakor: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "A fájlrendszer nem támogatja a szimbolikus linkeket" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Hiba a szimbolikus link létrehozása során: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Hiba a fájl áthelyezésekor: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "A könyvtár nem helyezhető át könyvtárba" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "A mentési fájl létrehozása meghiúsult" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Hiba a célfájl eltávolításakor: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "A csatolások közti áthelyezés nem támogatott" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Az attribútum értéke nem lehet NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Érvénytelen attribútumtípus (a várt karakterlánc helyett)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Érvénytelen kiterjesztett attribútumnév" + +#: ../gio/glocalfileinfo.c:772 +#, 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:1425 +msgid " (invalid encoding)" +msgstr " (érvénytelen kódolás)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Hiba a(z) „%s” fájl információinak lekérésekor: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Hiba a fájlleíró információinak lekérésekor: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Érvénytelen attribútumtípus (a várt uint32 helyett)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Érvénytelen attribútumtípus (a várt uint64 helyett)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Érvénytelen attribútumtípus (a várt bájtkarakterlánc helyett)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Nem állíthatók be a szimbolikus linkek jogosultságai" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Hiba a jogosultságok beállításakor: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Hiba a tulajdonos beállításakor: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "a szimbolikus link nem lehet NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Hiba a szimbolikus link beállításakor: %s" + +#: ../gio/glocalfileinfo.c:2097 +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:2223 +#, 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:2246 +msgid "SELinux context must be non-NULL" +msgstr "A SELinux környezet nem lehet NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Hiba a SELinux környezet beállításakor: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "A SELinux nem engedélyezett ezen rendszeren" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "A(z) %s attribútum beállítása nem támogatott" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Hiba a fájl olvasásakor: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Hiba a fájlban kereséskor: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Hiba a fájl lezárásakor: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Nem található az alapértelmezett helyi fájlfigyelő típus" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Hiba a fájl írásakor: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Hiba a mentés létrehozásakor: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Hiba az ideiglenes fájl átnézésekor: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Hiba a fájl csonkításakor: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Hiba a(z) „%s” fájl megnyitásakor: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "A célfájl egy könyvtár" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "A célfájl nem szabályos fájl" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "A fájlt külső program módosította" + +#: ../gio/glocalfileoutputstream.c:1058 +#, 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:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "A megadott GSeekType nem támogatott" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Érvénytelen keresési kérés" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "A GMemoryInputStream nem csonkítható" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "A memóriakimeneti adatfolyam nem méretezhető át" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "A memóriakimeneti adatfolyam átméretezése meghiúsult" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Pozicionálási kérés az adatfolyam eleje elé" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "A gépnév („%s”) „[” karaktert tartalmaz „]” nélkül" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "A hálózat elérhetetlen" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "A gép elérhetetlen" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Nem hozható létre a hálózatfigyelő: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Nem hozható létre a hálózatfigyelő: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Nem kérhető le a hálózat állapota: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "A kimeneti adatfolyam nem valósítja meg az írást" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "A forrás adatfolyam már le van zárva" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Hiba a(z) „%s” feloldása közben: %s" + +#: ../gio/gresolver.c:967 +#, 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:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nincs kért típusú DNS-rekord ehhez: „%s”" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ideiglenesen nem oldható fel: „%s”" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Hiba a(z) „%s” feloldása közben" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Hiányos adatok érkeztek ehhez: „%s”" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Az erőforrás nem létezik itt: „%s”" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Az erőforrás kicsomagolása meghiúsult itt: „%s”" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Az erőforrás nem könyvtár itt: „%s”" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "A bemeneti adatfolyam nem valósítja meg a pozícionálást" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Súgó kiírása" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[PARANCS]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Elf FÁJLBAN erőforrásokat tartalmazó szakaszok felsorolása" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Erőforrások felsorolása\n" +"Ha a SZAKASZ meg van adva, akkor csak az adott szakasz erőforrásainak " +"felsorolása\n" +"Ha az ÚTVONAL meg van adva, akkor csak az illeszkedő erőforrások felsorolása" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FÁJL [ÚTVONAL]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SZAKASZ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Erőforrások felsorolása részletekkel együtt\n" +"Ha a SZAKASZ meg van adva, akkor csak az adott szakasz erőforrásainak " +"felsorolása\n" +"Ha az ÚTVONAL meg van adva, akkor csak az illeszkedő erőforrások " +"felsorolása\n" +"A részletek közé a szakasz, méret és tömörítés tartozik" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Erőforrásfájl kibontása a szabványos kimenetre" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FÁJL ÚTVONAL" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Ismeretlen parancs: %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Használat:\n" +" gresource [--section SZAKASZ] PARANCS [ARG…]\n" +"\n" +"Parancsok:\n" +" help Ezen súgó kiírása\n" +" sections Erőforrásszakaszok felsorolása\n" +" list Erőforrások felsorolása\n" +" details Erőforrások felsorolása részletekkel együtt\n" +" extract Erőforrás kibontása\n" +"\n" +"Részletes segítségért adja ki a „gresource help PARANCS” parancsot.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Használat:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumentumok:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SZAKASZ Egy elhagyható elf szakasznév\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " PARANCS A megmagyarázandó (elhagyható) parancs\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FÁJL Egy elf fájl (bináris vagy megosztott programkönyvtár)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FÁJL Egy elf fájl (bináris vagy megosztott programkönyvtár)\n" +"\n" +" vagy lefordított erőforrásfájl\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[ÚTVONAL]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " ÚTVONAL Egy elhagyható erőforrás-útvonal (részleges is lehet)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "ÚTVONAL" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " ÚTVONAL Egy erőforrás-útvonal\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nincs „%s” séma\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "A(z) „%s” séma nem helyezhető át (az útvonal nem adható meg)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "A(z) „%s” séma áthelyezhető (az útvonalat meg kell adni)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "A megadott útvonal üres.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Az útvonalnak osztásjellel (/) kell kezdődnie\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Az útvonalnak osztásjellel (/) kell végződnie\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Az útvonal nem tartalmazhat két szomszédos osztásjelet (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nincs „%s” kulcs\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "A megadott érték kívül esik az érvényes tartományon\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "A telepített (át nem helyezhető) sémák felsorolása" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "A telepített áthelyezhető sémák felsorolása" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "A SÉMA kulcsainak felsorolása" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SÉMA[:ÚTVONAL]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "A SÉMA gyermekeinek felsorolása" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Kulcsok és értékek rekurzív felsorolása\n" +"Ha nincs megadva SÉMA, az összes kulcs felsorolása\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SÉMA[:ÚTVONAL]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "A KULCS értékének lekérése" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SÉMA[:ÚTVONAL] KULCS" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "A KULCS érvényes értékeinek tartományának lekérése" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "A KULCS értékének beállítása az ÉRTÉKRE" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SÉMA[:ÚTVONAL] KULCS ÉRTÉK" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "A KULCS visszaállítása az alapértékére" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "A SÉMA minden kulcsának visszaállítása az alapértékekre" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "A KULCS írhatóságának ellenőrzése" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"A KULCS változásainak figyelése.\n" +"Ha nincs megadva KULCS, akkor a SÉMA összes kulcsának figyelése.\n" +"A figyelés befejezéséhez nyomja meg a ^C kombinációt.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SÉMA[:ÚTVONAL] [KULCS]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Használat:\n" +" gsettings [--schemadir SÉMAKVT] PARANCS [ARGUMENTUMOK…]\n" +"\n" +"Parancsok:\n" +" help Ez a súgó\n" +" list-schemas Telepített sémák felsorolása\n" +" list-relocatable-schemas Áthelyezhető sémák felsorolása\n" +" list-keys Séma kulcsainak felsorolása\n" +" list-children Séma gyermekeinek felsorolása\n" +" list-recursively Kulcsok és értékek rekurzív felsorolása\n" +" range Kulcs tartományának lekérése\n" +" get Kulcs értékének lekérése\n" +" set Kulcs értékének beállítása\n" +" reset Kulcs értékének visszaállítása\n" +" reset-recursively Reset all values in a given schema\n" +" writable Kulcs írhatóságának ellenőrzése\n" +" monitor Változások figyelése\n" +"\n" +"Részletes segítségért adja ki a „gsettings help PARANCS” parancsot.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Használat:\n" +" gsettings [--schemadir SÉMAKVT] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SÉMAKVT További sémák keresése ebben a könyvtárban\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SÉMA A séma neve\n" +" ÚTVONAL Az áthelyezhető sémák útvonala\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KULCS A sémán belüli (elhagyható) kulcs\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KULCS A sémán belüli kulcs\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " ÉRTÉK A beállítandó érték\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Üres sémanevet adott meg\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Érvénytelen foglalat, nincs előkészítve" + +#: ../gio/gsocket.c:293 +#, 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:301 +msgid "Socket is already closed" +msgstr "A foglalat már le van zárva" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "A foglalat I/O túllépte az időkorlátot" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket létrehozása fájlleíróból: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nem sikerült létrehozni foglalatot: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Ismeretlen családot adtak meg" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Ismeretlen protokollt adtak meg" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "nem kérhető le a helyi cím: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "nem kérhető le a távoli cím: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "nem lehet figyelni: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Hiba a címhez csatlakozáskor: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Hiba a multicast csoporthoz csatlakozáskor: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Hiba a multicast csoport elhagyásakor: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "A forrásspecifikus multicast nem támogatott" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Hiba a kapcsolat elfogadásakor: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Csatlakozás folyamatban" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, 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:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Hiba az adatok fogadásakor: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Hiba az adatok küldésekor: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nem sikerült leállítani a foglalatot: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Hiba a foglalat lezárásakor: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Várakozás a foglalat állapotára: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Hiba az üzenet küldésekor: %s" + +#: ../gio/gsocket.c:3825 +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "A GSocketControlMessage nem támogatott Windowson" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Hiba az üzenet fájl eltávolítása fogadásakor: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "a g_socket_get_credentials nincs megvalósítva erre az OS-re" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nem sikerült kapcsolódni a(z) %s proxy kiszolgálóhoz: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nem sikerült kapcsolódni a következőhöz: %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Nem sikerült kapcsolódni: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Ismeretlen csatlakozási hiba" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +#| msgid "Trying to proxy over non-TCP connection is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "A proxyzás nem TCP kapcsolaton keresztül nem támogatott." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "A proxyprotokoll („%s”) nem támogatott." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "A figyelő már le van zárva" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "A hozzáadott foglalat le van zárva" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "A SOCKSv4 nem támogatja ezt az IPv6 címet: „%s”" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "A felhasználónév túl hosszú a SOCKSv4 protokollhoz" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "A gépnév („%s”) túl hosszú a SOCKSv4 protokollhoz" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "A kiszolgáló nem SOCKSv4 proxy kiszolgáló." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "A SOCKSv4 kiszolgálón keresztüli kapcsolat visszautasítva" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "A kiszolgáló nem SOCKSv5 proxy kiszolgáló." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "A SOCKSv5 proxy hitelesítést igényel." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "A SOCKSv5 a GLib által nem támogatott hitelesítési módszert igényel." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "A felhasználónév vagy jelszó túl hosszú a SOCKSv5 protokollhoz." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "A SOCKSv5 hitelesítés hibás felhasználónév vagy jelszó miatt meghiúsult." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "A gépnév („%s”) túl hosszú a SOCKSv5 protokollhoz" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "A SOCKSv5 proxy kiszolgáló ismeretlen címtípust használ." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Belső SOCKSv5 proxy kiszolgáló hiba." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "A SOCKSv5 kapcsolatot a szabálykészlet nem engedélyezi." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "A gép nem érhető el a SOCKSv5 kiszolgálón keresztül." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "A hálózat nem érhető el a SOCKSv5 proxyn keresztül." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "A kapcsolat visszautasítva a SOCKSv5 proxyn keresztül." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "A SOCKSv5 proxy nem támogatja a „connect” parancsot." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "A SOCKSv5 proxy nem támogatja a megadott címtípust." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Ismeretlen SOCKSv5 proxy hiba." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "A GThemedIcon kódolás %d. verziója nem kezelhető" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nem fejthető vissza a PEM-kódolású személyes kulcs" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nem található PEM-kódolású személyes kulcs" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nem dolgozható fel a PEM-kódolású személyes kulcs" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nem található PEM-kódolású tanúsítvány" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nem dolgozható fel a PEM-kódolású tanúsítvány" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ez az utolsó lehetősége a helyes jelszó megadására, mielőtt hozzáférése " +"zárolásra kerül. " + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Több helytelen jelszót adott meg, és a további sikertelen próbálkozások után " +"hozzáférése zárolásra kerül." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "A megadott jelszó helytelen." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "A várt 1 vezérlőüzenet helyett %d érkezett" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Váratlan típusú kiegészítő adatok" + +#: ../gio/gunixconnection.c:195 +#, 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:211 +msgid "Received invalid fd" +msgstr "Érvénytelen fájlleíró érkezett" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Hiba a hitelesítési adatok küldésekor: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Hiba a SO_PASSCRED engedélyezettségének ellenőrzésekor a foglalathoz: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Váratlan beállításhossz a SO_PASSCRED engedélyezettségének ellenőrzésekor a " +"foglalathoz. A várt %d bájt helyett %d érkezett" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Hiba a SO_PASSCRED engedélyezése közben: %s" + +#: ../gio/gunixconnection.c:565 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"A hitelesítési adatok fogadásához várt egyetlen bájt helyett nulla bájt lett " +"beolvasva" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "A program nem várt vezérlőüzenetet, de %d érkezett" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Hiba a SO_PASSCRED letiltásakor: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Hiba a fájlleíróból olvasáskor: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Hiba a fájlleíró lezárásakor: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Fájlrendszer gyökere" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Hiba a fájlleíróba íráskor: %s" + +#: ../gio/gunixsocketaddress.c:244 +#| msgid "Abstract unix domain socket addresses not supported on this system" +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:436 +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:512 +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:276 +msgid "Can't find application" +msgstr "Nem található az alkalmazás" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Hiba az alkalmazás indításakor: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Az URI címek nem támogatottak" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "a társításmódosítások nem támogatottak win32 rendszeren" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "A társítás létrehozása nem támogatott win32 rendszeren" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Hiba a leíróból való olvasáskor: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Hiba a leíró lezárásakor: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Hiba a leíróba íráskor: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nincs elég memória" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Belső hiba: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "További bemenet szükséges" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Érvénytelen tömörített adatok" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Ezen cím figyelése" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Figyelmen kívül marad, csak a GTestDbus-kompatibilitás miatt" + +#: ../gio/tests/gdbus-daemon.c:20 +#| msgid "Print help" +msgid "Print address" +msgstr "Cím kiírása" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Cím kiírása shell módban" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "D-Bus szolgáltatás futtatása" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Hibás argumentumok\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Váratlan attribútum („%s”) a(z) „%s” elemhez" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, 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:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Váratlan címke: „%s” a várt „%s” helyett" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Váratlan címke: „%s” a következőn belül: „%s”" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, 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:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, 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:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Részleges karaktersorozat a bemenet végén" + +#: ../glib/gconvert.c:1053 +#, 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:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "A(z) „%s” URI érvénytelen" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "A(z) „%s” gépneve érvénytelen" + +#: ../glib/gconvert.c:1925 +#, 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:2020 +#, 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:2030 +msgid "Invalid hostname" +msgstr "Érvénytelen gépnév" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "DE" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "DU" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y. %b. %e., %A, %H.%M.%S %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y. %m %e." + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%k.%M.%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H.%M.%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Január" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Február" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Március" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Április" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Május" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Június" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Július" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Augusztus" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Szeptember" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Október" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "December" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Febr" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Már" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Ápr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Máj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jún" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Júl" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Szept" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Hétfő" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Kedd" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Szerda" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Csütörtök" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Péntek" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Szombat" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Vasárnap" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Hé" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Ke" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Sze" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Csü" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pé" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Szo" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Va" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Hiba a(z) „%s” könyvtár megnyitásakor: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Hiba a(z) „%s” fájl olvasása közben: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "A fájl („%s”) túl nagy" + +#: ../glib/gfileutils.c:783 +#, 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:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "A(z) „%s” sablon nem tartalmaz XXXXXX karaktersorozatot" + +#: ../glib/gfileutils.c:2083 +#, 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:2104 +msgid "Symbolic links not supported" +msgstr "A szimbolikus linkek használata nem támogatott" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Át nem alakított adatok maradtak az olvasási pufferben" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "A csatorna töredék karakterrel ér véget" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Nem szabályos fájl" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Érvénytelen csoportnév: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "A kulcsfájl nem csoporttal kezdődik" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Érvénytelen kulcsnév: %s" + +#: ../glib/gkeyfile.c:1288 +#, 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:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "A kulcsfájlból hiányzik a(z) „%s” csoport" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "A kulcsfájlban nincs „%s” kulcs" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"A(z) „%s” kulcs a(z) „%s” csoportban „%s” értékkel rendelkezik a várt %s " +"helyett" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "A kulcsfájl érvénytelen escape sorozatot tartalmaz („%s”)" + +#: ../glib/gkeyfile.c:4242 +#, 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:4256 +#, 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:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "A(z) „%s” érték nem értelmezhető logikai értékként." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Nem sikerült lekérni a(z) „%s%s%s%s” fájl attribútumait. Az fstat() " +"sikertelen: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Nem sikerült leképezni a(z) %s%s%s%s fájlt: Az mmap() sikertelen: %s" + +#: ../glib/gmappedfile.c:260 +#, 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/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Hiba a(z) %d. sor %d. karakterénél: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s” nem érvényes név" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s” nem érvényes név: „%c”" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Hiba a(z) %d. sorban: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Üres „&;” entitás; az érvényes entitások: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "A(z) „%-.*s” entitásnév ismeretlen" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "A dokumentumnak egy elemmel kell kezdődnie (például: )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "A dokumentum üres volt, vagy csak üres hely karaktereket tartalmazott" + +#: ../glib/gmarkup.c:1721 +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:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "A dokumentum váratlanul véget ért egy elemnéven belül" + +#: ../glib/gmarkup.c:1749 +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:1754 +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:1760 +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:1767 +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:1783 +#, 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:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Használat:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[KAPCSOLÓ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Súgólehetőségek:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Súgólehetőségek megjelenítése" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Minden súgólehetőség megjelenítése" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Alkalmazás kapcsolói:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, 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:989 ../glib/goption.c:1057 +#, 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:1014 +#, 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:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Hiba a kapcsoló feldolgozása során: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Hiányzó paraméter a következőhöz: %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Ismeretlen kapcsoló: %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "sérült objektum" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "belső hiba vagy sérült objektum" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "elfogyott a memória" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "a visszakövetési korlát elérve" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "az ismétlési korlát elérve" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "újsor-jelzők érvénytelen kombinációja" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "hibás eltolás" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "rövid utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekurzív ciklus" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ismeretlen hiba" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ a minta végén" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c a minta végén" + +#: ../glib/gregex.c:335 +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "ismeretlen karakter következik a \\ után" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "a számok nincsenek sorrendben a {} kvantálóban" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "a szám túl nagy a a {} kvantálóban" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "a karakterosztály befejező ] jele hiányzik" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "érvénytelen escape-sorozat a karakterosztályban" + +#: ../glib/gregex.c:350 +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:353 +msgid "nothing to repeat" +msgstr "nincs mit ismételni" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "váratlan ismétlés" + +#: ../glib/gregex.c:360 +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "ismeretlen karakter a (? vagy (?- után" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "hiányzó befejező )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "hivatkozás nem létező almintára" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "a megjegyzés utáni ) hiányzik" + +#: ../glib/gregex.c:375 +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "a reguláris kifejezés túl nagy" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "a memóriakérés meghiúsult" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") nyitó ( nélkül" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "kódtúlcsordulás" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "ismeretlen karakter a (?< után" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "a lookbehind kijelentés nem rögzített hosszúságú" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "hibásan formázott szám vagy név a (?( után" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "a feltételes csoport kettőnél több ágat tartalmaz" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "a (?( után kijelentésnek kellene állnia" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "a (?R vagy (?[+-]számjegyek elemeket )-nek kell követnie" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ismeretlen POSIX osztálynév" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "a POSIX leválogató elemek nem támogatottak" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "a \\x{...} sorozaton belüli karakterérték túl nagy" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "érvénytelen feltétel: (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "A \\C nem engedélyezett a lookbehind kijelentésben" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "a \\L, \\l, \\N{name}, \\U és \\u escape-sorozatok nem támogatottak" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "a rekurzív hívás végtelen ciklushoz vezethet" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "ismeretlen karakter a (?P után" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "hiányzó befejező az alminta nevében" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "két elnevezett alminta neve azonos" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "rosszul formázott \\P vagy \\p sorozat" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "ismeretlen tulajdonságnév a \\P vagy \\p után" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "az alminta neve túl hosszú (legfeljebb 32 karakter)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "túl sok elnevezett alminta (legfeljebb 10 000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "az oktális érték nagyobb, mint \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "a fordítási munkaterület túlcsordult" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "a korábban ellenőrzött hivatkozott alminta nem található" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "a DEFINE csoport több ágat tartalmaz" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inkonzisztens NEWLINE beállítások" + +#: ../glib/gregex.c:476 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"a \\g után nem egy (szögletes) zárójelezett név, idézőjelezett név vagy szám " +"vagy egyszerű szám áll" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "számozott hivatkozás nem lehet nulla" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "nem engedélyezett argumentum a (*ACCEPT), (*FAIL) vagy (*COMMIT) egyikéhez sem" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ismeretlen" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "a szám túl nagy" + +#: ../glib/gregex.c:492 +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "hiányzó almintanév a (?& után" + +#: ../glib/gregex.c:495 +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "a rendszer számjegyet várt a (?+ után" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "a ] érvénytelen adatkarakter JavaScript kompatibilitási módban" + +#: ../glib/gregex.c:501 +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ugyanazon szám almintáihoz nem engedélyezettek különböző nevek" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "a (*MARK) után argumentumnak kell állnia" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "a \\c után ASCII karakternek kell állnia" + +#: ../glib/gregex.c:510 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "a \\k után nem egy (szögletes) zárójelezett vagy idézőjelezett név áll" + +#: ../glib/gregex.c:513 +#| msgid "URIs not supported" +msgid "\\N is not supported in a class" +msgstr "a \\N nem támogatott osztályban" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "túl sok előre hivatkozás" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "a név túl hosszú a (*MARK), (*PRUNE), (*SKIP) vagy (*THEN) egyikében" + +#: ../glib/gregex.c:522 +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "a \\u.... sorozaton belüli karakterérték túl nagy" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +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:1323 +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:1331 +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "A PRCE programkönyvtár inkompatibilis beállításokkal lett fordítva" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "a program hexadecimális számjegyet vagy „}” jelet várt" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "a program hexadecimális számjegyet várt" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "hiányzó „<” jel a szimbolikus hivatkozásban" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "befejezetlen szimbolikus hivatkozás" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "nulla hosszúságú szimbolikus hivatkozás" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "re rendszer számjegyet várt" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "illegális szimbolikus hivatkozás" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "a záró „\\” helye nem megfelelő" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ismeretlen escape sorozat" + +#: ../glib/gregex.c:2508 +#, 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:88 +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:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "A szöveg üres volt (vagy legfeljebb üres hely karaktereket tartalmazott)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nem sikerült adatokat olvasni a gyermekfolyamatból (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Váratlan hiba a waitpid()-ben (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "A gyermekfolyamat a következő kóddal lépett ki: %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "A gyermekfolyamat kilőve %ld szignállal" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "A gyermekfolyamat megállítva %ld szignállal" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "A gyermekfolyamat abnormálisan lépett ki" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nem sikerült olvasni a gyermek csővezetékből (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nem sikerült folyamatot indítani (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, 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.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nem sikerült a gyermekfolyamat („%s”) végrehajtása (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nem sikerült a gyermekfolyamat elindítása (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ismeretlen hiba a gyermekfolyamat („%s”) végrehajtása közben" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Nem sikerült adatokat kiolvasni a gyermekfolyamatból" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nem sikerült végrehajtani a gyermekfolyamatot (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Érvénytelen programnév: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Érvénytelen karaktersorozat a környezetben: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Érvénytelen munkakönyvtár: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nem sikerült végrehajtani a segítő programot (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "A karakter az UTF-8 tartományon kívülre esik" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Érvénytelen sorozat az átalakítási bemenetben" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "A karakter az UTF-16 tartományon kívülre esik" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bájt" +msgstr[1] "%u bájt" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bájt" +msgstr[1] "%s bájt" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + diff --git a/po/hy.po b/po/hy.po new file mode 100644 index 0000000..7f95fe5 --- /dev/null +++ b/po/hy.po @@ -0,0 +1,3956 @@ +# Translation of glib to Armenian +# This file is distributed under the same license as the glib package. +# Copyright (C) 2010, Karo Mkrtchyan +# Karo Mkrtchyan <020113@mail.ru> +# +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-08-31 16:47+0400\n" +"Last-Translator: Nune \n" +"Language-Team: Armenian \n" +"Language: hy\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« ատրիբուտ '%s' տարրի համար" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Չգտնվեց '%s' ատրիբուտ %s' տարրի համար" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Ô±Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« '%s' Õ¿Õ¥Õ£, սպասվում էր '%s Õ¿Õ¥Õ£Õ¨" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Ô±Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« '%s' Õ¿Õ¥Õ£ '%s' -Õ« ներսում" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Չհաջողվեց Õ£Õ¿Õ¶Õ¥Õ¬ Õ§Õ»Õ¡Õ¶Õ«Õ· ֆայլ որոնման պանակներում" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' -Õ« համար արդեն գոյություն ունի Õ§Õ»Õ¡Õ¶Õ«Õ·" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' -Õ« համար Õ§Õ»Õ¡Õ¶Õ«Õ· Õ£Õ¿Õ¶Õ¾Õ¡Õ® Õ¹Õ§" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' Õ« էջանիշում Õ£Õ¿Õ¶Õ¾Õ¡Õ® Õ¹Õ§ MIME Õ¿Õ¥Õ½Õ¡Õ¯" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' Õ« էջանիշում Õ£Õ¿Õ¶Õ¾Õ¡Õ® Õ¹Õ§ նշում տվյալների գատղնիության Õ´Õ¡Õ½Õ«Õ¶" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' Õ« էջանիշում Õ£Õ¿Õ¶Õ¾Õ¡Õ® Õ¹Õ§ խմբերի բազմություն " + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"Գոյություն չունի '%s' անունով աշխատածրագիր՝ որն Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ§Õ»Õ¡Õ¶Õ«Õ· '%s' -Õ« համար" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ լրացնել'%s' կատարման Õ¿Õ¸Õ²Õ¨ %s URI -Õ« միջոցով" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Նշանների '%s' բազմությունից '%s' փոխարկում Õ¹Õ« ապահովվում։" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Չհաջողվեց բացել '%s' -ից '%s' փոխարկիչ" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Փոխարկման մուտքում անվավեր բայթերի հաջորդականություն " + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Սխալ փոխարկման ընթացքում․ %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Մուտքի վերջում նշանների Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« հաջորդականություն" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ ճշգրիտ փոխարկել «%s» Õ¶Õ«Õ·Õ¨ «%s» նիշերի հավաքածուի որևէ Õ¶Õ«Õ·Õ«" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI '%s' Õ¹Õ« հանդիսանում բացարձակ URI \"file\" համակարգի օգտագործման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'%s' Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ ֆայլի URI -Õ¨ Õ¹Õ« կարող պարունակել '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' անվավեր Õ§" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Անվավեր Õ°Õ¸Õ½Õ©Õ« անուն '%s' -ում" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' պարունակում Õ§ անթույլատրելի էկրանավորող նիշեր" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ճանապարհի '%s' անվանումը բացարձակ Õ¹Õ§" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Անվավեր Õ°Õ¸Õ½Õ©Õ« անուն " + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %r %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%r" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Հունվարի" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Փետրվարի" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Մարտի" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Ապրիլի" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Մայիսի" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Հունիսի" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Հուլիսի" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Հնվ" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Փտր" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Մար" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Ապր" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Մայ" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Հնս" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Հլս" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Երկուշաբթի" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Երեքշաբթի" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Չորեքշաբթի" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Հինգշաբթի" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Ուրբաթ" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Շաբաթ" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Կիրակի" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Երկ" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Երք" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Չրք" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Հնգ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Ուր" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Շբթ" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Կրկ" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու սխալ՝ %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Չի հաջովում հատկացնել %lu Õ¢Õ¡ÕµÕ© \"%s\" ֆայլը կարդալու համար" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ֆայլը կարդալու սխալ՝ %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "\"%s\" ֆայլը չափազանց Õ´Õ¥Õ® Õ§" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Չի հաջողվում կարդալ '%s' ֆայլից՝ %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Չհաջողվեց Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ '%s' ֆայլի ատրիբուտները ․ Ձախողում fstat() ֆունկցիայում․ %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ fdopen() խափանվեց՝ %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ վերանվանել '%s' ֆայլը որպես '%s'՝ g_rename() խափանվեց՝ %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ֆայլ '%s'՝ %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը գրելու համար՝ fdopen() խափանվել է՝ %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Չի Õ°Õ¡Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլ՝ fwrite() խափանվեց՝ %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլը․ fflush() -Õ¨ խափանվեց․ %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ գրել '%s' ֆայլը․ fsync() -Õ¨ խափանվեց․ %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ¾Õ¥Õ¬ փակել '%s' ֆայլը՝ fclose() խափանվեց՝ %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' ֆայլը Õ¹Õ« կարող վերացվել՝ g_unlink() խափանվեց՝ %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ձևանմուշը անվավեր Õ§, Õ¡ÕµÕ¶ պետք Õ§ չպարունակի '%s'" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ձևանմուշը Õ¹Õ« պարունակում XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f Ô¿Ô²" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f ՄԲ" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f Ô³Ô²" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f ՏԲ" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f ՊԲ" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f ÔµÔ²" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f Ô¿Ô²" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f ՄԲ" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Ô³Ô²" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ՏԲ" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ՊԲ" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ÔµÔ²" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f Ô¿Ô²" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ '%s' Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղումը՝ %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բացել '%s' ֆայլը՝ open() խափանվեց՝ %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Չհաջողվեց ցուցադրել '%s' ֆայլը ․ Ձախողում mmap() ֆունկցիայում․ %s " + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Սխալ %d Õ¿Õ¸Õ²Õ« %d նիշում․" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Սխալ UTF-8 կոդավորված տեքստ Õ¡Õ¶Õ¾Õ¡Õ¶ Õ´Õ¥Õ» - անվավեր '%s'" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' անվավեր անուն " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' անվավեր անուն ․ '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Սխալ %d տողում՝ %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' Õ¶Õ«Õ·Õ« վրա հղումը Õ¹Õ« այլագրում թույլատրելի Õ¶Õ«Õ·" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Հայտնաբերվել Õ§ դատարկ կառուցվածք '&;' , թույլատրելի կառուցվածքներն են․ " +"& " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "'%-.*s' կառուցվածքի անունը Õ°Õ¡ÕµÕ¿Õ¶Õ« Õ¹Õ§" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Փաստաթուղթը պետք Õ§ Õ½Õ¯Õ½Õ¾Õ« որևէ Õ§Õ¬Õ§Õ´Õ¥Õ¶Õ¿Õ¸Õ¾ (օրինակ )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' Õ¶Õ«Õ·Õ¨ հանդիսանում Õ§ անվավեր '<' նիշից Õ°Õ¥Õ¿Õ¸; տարրի անվանումը Õ¹Õ« կարող " +"Õ½Õ¯Õ½Õ¾Õ¥Õ¬ Õ¡ÕµÕ¤ Õ¶Õ«Õ·Õ¸Õ¾" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Հանդիպեց '%s' ավելորդ Õ¶Õ«Õ·Õ¨, սպասվում Õ§ '>' Õ¶Õ«Õ·Õ¨ '%s' դատարկ Õ¿Õ¥Õ£Õ« փակման համար" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Հանդիպեց '%s' ավելորդ Õ¶Õ«Õ·Õ¨ , սպասվում Õ§ '=' Õ¶Õ«Õ·Õ¨ '%s' ատրիբուտի անվանումից " +"Õ°Õ¥Õ¿Õ¸, որը պատկանում Õ§ '%s' տարրին" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' Õ¶Õ«Õ·Õ¨ հանդիսանում Õ§ անվավեր փակող տարրի «%s» անվանումից Õ°Õ¥Õ¿Õ¸; " +"թույլատրելի արժեքն Õ§ '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' տարրը փակված Õ§, ներկա ÕºÕ¡Õ°Õ«Õ¶ Õ¸Õ¹ Õ´Õ« տարր բացված Õ§Õ¹" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' տարրը փակված Õ§, բայց ներկա ÕºÕ¡Õ°Õ«Õ¶ բացված համարվում Õ§ '%s' տարրը " + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Փաստաթուղթը դատարկ էր Õ¯Õ¡Õ´ պարունակում էր Õ´Õ«Õ¡ÕµÕ¶ բացատներ" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Փաստաթուղթը անսպասելիորեն ավարտվեց Õ¡Õ¶Õ´Õ«Õ»Õ¡ÕºÕ¥Õ½ անկյունաձև բացող փակագծից Õ°Õ¥Õ¿Õ¸ " +"'<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Փաստաթուղթը անսպասելիորեն ավարտվեց, երբ Õ¤Õ¥Õ¼ բացված Õ§Õ«Õ¶ տարրերը - '%s' -Õ¨ " +"վերջին բացված տարրն Õ§" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Փաստաթուղթը անսպասելիորեն ավարտվեց, սպասվում էր <%s/> Õ¿Õ¥Õ£Õ« ավարտը Õ¶Õ·Õ¸Õ² փակող " +"անկյունաձև փակագիծ" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Փաստաթուղթը անսպասելիորեն ավարտվեց տարրի Õ¡Õ¶Õ¾Õ¡Õ¶ ներսում" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Փաստաթուղթը անսպասելիորեն ավարտվեց ատրիբուտի Õ¡Õ¶Õ¾Õ¡Õ¶ ներսում" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Փաստաթուղթը անսպասելիորեն ավարտվեց Õ§Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¨ բացող Õ¿Õ¥Õ£Õ« ներսում" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Փաստաթուղթը անսպասելիորեն ավարտվեց ատրիբուտի Õ¡Õ¶Õ¾Õ¡Õ¶Õ¨ հաջորդող հավասարության " +"նշանից Õ°Õ¥Õ¿Õ¸ ;ատրիբուտի արժեքը որոշված Õ¹Õ§" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Փաստաթուղթը անսպասելիորեն ավարտվեց ատրիբուտի արժեքի ներսում" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Փաստաթուղթը անսպասելիորեն ավարտվեց '%s' տարրը փակող Õ¿Õ¥Õ£Õ« ներսում" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Փաստաթուղթը անսպասելիորեն ավարտվեց մեկնաբանության Õ¯Õ¡Õ´ հրահանգի Õ´Õ·Õ¡Õ¯Õ´Õ¡Õ¶ " +"ներսում" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "Õ¾Õ¶Õ¡Õ½Õ¾Õ¡Õ® օբյեկտ" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "Արտաքի Õ½Õ­Õ¡Õ¬ Õ¯Õ¡Õ´ Õ¾Õ¶Õ¡Õ½Õ¾Õ¡Õ® օբյեկտ" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "հիշողությունը վերջացավ" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "Հասել Õ§ հետադարձ վերահսկողության Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ«Õ¶" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"օրինակը պարունակում Õ§ տարրեր, որոնք Õ¹Õ¥Õ¶ ապահովվում Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« համընկնումների " +"համար " + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "ներքին Õ½Õ­Õ¡Õ¬ " + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"Õ¥Õ¿ հղումները, Õ«Õ¶Õ¹ÕºÕ¥Õ½ պայմանները Õ¹Õ¥Õ¶ ապահովվում Õ´Õ¡Õ½Õ¶Õ¡Õ¯Õ« համընկնումների համար " + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "Õ°Õ¡Õ½Õ¥Õ¬ Õ§ ռեկուրսիայի Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ«Õ¶" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "դատարկ ենթատողերի համար աշխատատարածքի Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¨ " + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "տողադարձի դրոշների անվավեր համակցում" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "Չհայտնաբերված Õ½Õ­Õ¡Õ¬ " + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« վերջում" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« վերջում" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "հաջորդում Õ§ Õ¡Õ¶Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬Õ« տարր \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"ռեգիստրի փոփոխման էկրանավորումն (\\l, \\L, \\u, \\U) Õ¡ÕµÕ½Õ¿Õ¥Õ² արգելված Õ§ " + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "Թվերի հաջորդականությունը {} քվանտորում Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "Չաձազանց Õ´Õ¥Õ® Õ©Õ«Õ¾ քվանտորում" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "բացակայում Õ§ փակող ] նիշերի Õ¤Õ¡Õ½Õ« համար" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "Անվավեր էկրանավորում տարրերի դասում" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "Տարրերի դասում միջակայքը Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "Õ¸Õ¹Õ«Õ¶Õ¹ Õ¹Õ¯Õ¡ կրկնելու" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "Õ¡Õ¶Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬Õ« տարր (? -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "Õ¡Õ¶Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬Õ« տարր (?< -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "Õ¡Õ¶Õ³Õ¡Õ¶Õ¡Õ¹Õ¥Õ¬Õ« տարր (?P -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX Õ¤Õ¡Õ½Õ« փոփոխությունը Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¾Õ¡Õ® Õ§ Õ´Õ«Õ¡ÕµÕ¶ Õ¤Õ¡Õ½Õ« ներսում" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "բացակայում Õ§ փակվող փակագիծը )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R Õ¯Õ¡Õ´ (?[+-] թվերը պետք Õ§ հաջորդեն )-Õ«Õ¶" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "Հղում Õ¤Õ¥ÕºÕ« գոյություն չունեցող Õ¥Õ¶Õ©Õ¡Õ·Õ¡Õ¢Õ¬Õ¸Õ¶" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "բացակայում Õ§ ) մեկնաբանությունից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "անչափ Õ´Õ¥Õ® կանոնավոր արտահայտություն" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "չստացվեց Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ հիշողություն" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind - հաստատումը չունի հաստատուն երկարություն" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "Սխալ Õ©Õ«Õ¾ Õ¯Õ¡Õ´ անուն (?( -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "Պայմանական խումբը պարունակում Õ§ երկուսից Õ¡Õ¾Õ¥Õ¬ ճյուղեր" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "սպասվում էր հաստատում (?( -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "Չհայտնաբերված POSIX Õ¤Õ¡Õ½Õ« անուն " + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX տեսակավորող տարրերը Õ¹Õ¥Õ¶ ապահովվում" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "Õ¶Õ«Õ·Õ« արժեք \\x{...} հաջորդականությունում չափազանց Õ´Õ¥Õ® Õ§" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "Õ½Õ­Õ¡Õ¬ ÕºÕ¡ÕµÕ´Õ¡Õ¶ (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind - հաստատումներում Õ¹Õ« թույլատրվում \\C" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "ռեկուրսիվ Õ¯Õ¡Õ¶Õ¹Õ¨ կարող Õ§ կրկնվել Õ¡Õ¶Õ½Õ¡Õ°Õ´Õ¡Õ¶ քանակությամբ" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "Õ¥Õ¶Õ©Õ¡Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ Õ´Õ¥Õ» բացակայում Õ§ փակող Õ¶Õ«Õ·Õ¨" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "երկու Õ¡Õ¶Õ¾Õ¡Õ¶Õ¾Õ¡Õ® ենթաշաբլոններ ունեն միևնույն անունըv" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "Õ½Õ­Õ¡Õ¬ հաջորդականություն \\P Õ¯Õ¡Õ´ \\p" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "չհայտնաբերված հատկության անուն \\P -ից Õ¯Õ¡Õ´ \\p -ից Õ°Õ¥Õ¿Õ¸" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "Õ¥Õ¶Õ©Õ¡Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« անունը չափազանց երկար Õ§ (32 նիշից Õ¡Õ¾Õ¥Õ¬ Õ¹Õ« կարող Õ¬Õ«Õ¶Õ¥Õ¬)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "չափազանց Õ·Õ¡Õ¿ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¾Õ¡Õ® ենթաշաբլոններ (Õ¹Õ« կարող Õ¬Õ«Õ¶Õ¥Õ¬ 10,000 -ից Õ¡Õ¾Õ¥Õ¬Õ«)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "ութական արժեքը գերազանցում Õ§ \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE խումբը պարունակում Õ§ մեկից Õ¡Õ¾Õ¥Õ¬Õ« ճյուղեր " + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "Արգելված Õ§ կրկնել DEFINE խումբը" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "Ô±Õ¶Õ°Õ¡Õ´Õ¡Õ¿Õ¥Õ²Õ¥Õ¬Õ« NEWLINE ընտրանքներ" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g -Õ«Õ¶ Õ¹Õ« հաջորդում անուն փակագծերի Õ´Õ¥Õ» Õ¯Õ¡Õ´ Õ¸Õ¹ բացասական Õ©Õ«Õ¾ (հնարավոր Õ§ " +"փակագծերում)" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "Õ¹Õ½ÕºÕ¡Õ½Õ¾Õ¡Õ® կրկնում" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "Õ¯Õ¸Õ¤Õ« գերլցում" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "Õ¯Õ¡Õ¦Õ´Õ¡Õ¯Õ¾Õ¸Õ² աշխատատիրույթի գերածախս " + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "արդեն ստուգված հղումով Õ¥Õ¶Õ©Õ¡Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ£Õ¿Õ¶Õ¾Õ¡Õ® Õ¹Õ§" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"%s կանոնավոր արտահայտության Õ°Õ¥Õ¿ Õ°Õ¡Õ´Õ¨Õ¶Õ¯Õ¶Õ´Õ¡Õ¶ որոնման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ առաջացելե Õ§ սխալ․ " +"%s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE գրադարանը կազմարկված Õ§ առանց UTF8 -Õ« աջակցման" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE գրադարանը կազմարկված Õ§ առանց UTF8 -Õ« հատկությունների Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ´Õ¡Õ¶" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Սխալ՝ առաջացած %s կանոնավոր արտահայտության կազմարկման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ %d նիշում․ %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s կանոնավոր արտահայտության օպտիմիզացման սխալ․ %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "սպասվում Õ§ տասնվեցական Õ©Õ«Õ¾ Õ¯Õ¡Õ´ '}' Õ¶Õ«Õ·" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "սպասվում Õ§ տասնվեցական Õ©Õ«Õ¾" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "Õ¶Õ«Õ·Õ¡ÕµÕ«Õ¶ հղումում բացակայում Õ§ '<'" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "չվերջացած Õ¶Õ«Õ·Õ¡ÕµÕ«Õ¶ հղու" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "զրոյական երկարությամբ Õ¶Õ«Õ·Õ¡ÕµÕ«Õ¶ հղում" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "սպասվում Õ§ Õ©Õ«Õ¾" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "չթույլատրված Õ¶Õ«Õ·Õ¡ÕµÕ«Õ¶ հղում" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "ավելորդ '\\' վերջում" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "Ô±Õ¶Õ°Õ¡ÕµÕ¿ էկրանավորող հաջորդականություն" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Տեղի Õ§ ունեցել Õ½Õ­Õ¡Õ¬ \"%s\" փոխարինվող տեքստի վերլուծության Õ´Õ¥Õ» %lu համարի " +"նիշում․ %s " + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" +"Տեղի Õ§ ունեցել Õ½Õ­Õ¡Õ¬ \"%s\" փոխարինվող տեքստի վերլուծության Õ´Õ¥Õ» %lu համարի " +"նիշում․ %s " + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Հայտնաբերված Õ§ չփակված չակերտ հրամանատողում Õ¯Õ¡Õ´ Õ©Õ¡Õ²Õ¡Õ¶Õ©Õ« Õ¡ÕµÕ¬ տեքստում" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"Տեքստը ավարտվել Õ§ '\\' նիշից Õ¡Õ¶Õ´Õ«Õ»Õ¡ÕºÕ¥Õ½ հետո։ (Տեքստը հետևյալն էր '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Տեքստը ավարտվել Õ§ %c -Õ« համար փակվող փակագիծը գտնելուց առաջ։ (Տեքստը " +"հետևյալն էր '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Տեքստը դատարկ էր (Õ¯Õ¡Õ´ պարունակում Õ§ Õ´Õ«Õ¡ÕµÕ¶ բացատներ) " + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ տվյալները ենթապրոցեսից" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ (%s) ենթապրոցեսի Õ°Õ¥Õ¿ կապուղի Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ¨" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ Õ¦Õ¡Õ¾Õ¡Õ¯Õ« (%s) կապուղուց" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ տեղափոխվել '%s' ÕºÕ¡Õ¶Õ¡Õ¯ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ աշխատացնել (%s) ենթապրոցեսը" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Անվավեր ծրագրի անուն․ %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Անթույլատրելի Õ¿Õ¸Õ² արգումենտների վեկտորի %d համարով տողում․ %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Անթույլատրելի Õ¿Õ¸Õ² միջավայրում․ %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Անթույլատրելի աշխատանքային պանակ․ %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ աշխատեցնել (%s) օգնական ծրագիրը" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Չնախատեսված Õ½Õ­Õ¡Õ¬ g_io_channel_win32_poll()-ում ենթապրոցեսից տվյալներ կարդալիս" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ կարդալ տվյալները (%s) ենթապոցեսից" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Չնախատեսված Õ½Õ­Õ¡Õ¬ select()-ում (%s) ենթապրոցեսից տվյալներ կարդալիս" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Չնախատեսված Õ½Õ­Õ¡Õ¬ waitpid()-ում (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork ֆունկցիան Õ¡Õ¶Õ°Õ¡Õ»Õ¸Õ² Õ§ ավարտվել (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ աշխատեցնել \"%s\" ենթապրոցեսը (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ վերաուղղորդել (%s) ենթապրոցեսի ներածումը Õ¯Õ¡Õ´ արտածումը" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "fork ֆունցիայի ձախողում ենթապրոցեսի Õ½Õ¿Õ¥Õ²Õ®Õ´Õ¡Õ¶ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Չհայտնաբերված Õ½Õ­Õ¡Õ¬ \"%s\" ենթապրոցեսի կատարման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ " + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բավականաչափ տվյալներ կարդալ Õ¦Õ¡Õ¾Õ¡Õ¯Õ« կապուղուց (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "Նիշը դուրս Õ§ UTF-8-Õ« սահմանից" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Փոխակերպման մուտքի տողում հայտնաբերվել Õ§ անթույլատրելի Õ¿Õ¸Õ²" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Նիշը դուրս Õ§ UTF-16-Õ« սահմանից" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Կիրառում՝" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ընտրանք...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Օգնության Ընտրանքներ․" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Ցուցադրել Ձեռնարկի հատկությունները" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Ցույց Õ¿Õ¡Õ¬ օգնության բոլոր ընտրանքները" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Աշխատածրագրի ընտրանքները․" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Չի ստացվել վերլուծել '%s' Õ¡Õ´Õ¢Õ¸Õ²Õ»Õ« արժեքը %s համար" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' Õ¡Õ´Õ¢Õ¸Õ²Õ» արժեքը %s համար դուրս Õ§ սահմանից " + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Չի ստացվել վերլուծել '%s' կոտորակային արժեքը %s համար" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' կոտորակային արժեքը %s համար դուրս Õ§ սահմանից " + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Ընտրանքի վերլուծության Õ½Õ­Õ¡Õ¬ %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Բացակայում Õ§ %s-Õ« արգումենտը" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Ô±Õ¶Õ°Õ¡ÕµÕ¿ ընտրանք %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Թույլատրելի բանալիների ֆայլը Õ¹Õ« Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ որոնման պանակներում" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Ֆայլը կանոնավոր Õ¹Õ«" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Ֆայլը դատարկ Õ§" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ '%s' Õ¿Õ¸Õ²Õ¨ , որը Õ¢Õ¡Õ¶Õ¡Õ¬Õ«-արժեք զույգ, խումբ " +"Õ¯Õ¡Õ´ մեկնաբանություն Õ¹Õ§" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ô½Õ´Õ¢Õ« անվավար անվանում․ %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Բանալներիի ֆայլը Õ¹Õ« Õ½Õ¯Õ½Õ¾Õ¥Õ¬ Õ­Õ´Õ¢Õ« Õ°Õ¥Õ¿" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Անվավեր բանալու անուն․ %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Բանալիների ֆայլը պարունակում Õ§ Õ¹Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¾Õ¸Õ² '%s' կոդավորում" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Բանալիների ֆայլը չունի '%s' խումբը" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Բանալիների ֆայլը չունի '%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ '%s' բանալի՝ '%s' արժեքով, որը UTF-8 Õ¹Õ«" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ '%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«, որի արժեքը Õ¹Õ« կարող մեկնաբանվել։" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ '%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«, որի արժեքը Õ¹Õ« կարող մեկնաբանվել։" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ '%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ« '%s' խմբում, որի արժեքը Õ¹Õ« կարող " +"մեկնաբանվել։" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Բանալիների ֆայլը Õ¹Õ« պարունակում '%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ« '%s' խմբում" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "Բանալիների ֆայլը պարունակում Õ§ escape Õ¶Õ«Õ· Õ¿Õ¸Õ²Õ« վերջում" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" +"Բանալիների ֆայլը պարունակում Õ§ անթույլատրելի escape հաջորդականություն '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' արժեքը Õ¹Õ« կարող Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¾Õ¥Õ¬ որպես թիվ։" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' Õ¡Õ´Õ¢Õ¸Õ¦Õ» արժեքը դուրս Õ§ սահմանից" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "%s' արժեքը Õ¹Õ« կարող Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¾Õ¥Õ¬ որպես Õ½Õ¡Õ°Õ¸Õ² ստորակոտով թիվ։" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "%s' արժեքը Õ¹Õ« կարող Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¾Õ¥Õ¬ որպես տրամաբանական արժեք։" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Քանակի չափազանց Õ´Õ¥Õ® արժեք Õ§ փոխանցվել %s-Õ«Õ¶" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Հոսքն արդեն փակ Õ§" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Գործողությունը Õ¹Õ¥Õ²ÕµÕ¡Õ¬ Õ§ հայտարարվել" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Անվավեր օբյեկտ, Õ¹Õ« սկզբնարժեքավորվել" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Ոչ լրիվ Õ¢Õ¡Õ¦Õ´Õ¡Õ¢Õ¡ÕµÕ© հաջորդականություն մուտքային տվյալներում" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Տարածությունը բավարար Õ¹Õ§ արդյունքի համար" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s Õ¿Õ«Õº" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials-Õ¨ իրականացված Õ¹Õ§ Õ¡ÕµÕ½ ՕՀ-Õ« վրա" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Գոյություն չունի GCredentials աջակցում ձեր պլատֆորմայի համար" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Հոսքի Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« Õ¾Õ¡Õ²Õ¡ÕªÕ¡Õ´ ավարտ" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Չաջակցվող `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ« `%s' հասցեում" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"`%s' հասցեն անվավեր Õ§ (պետք Õ§ ուղիներից Õ³Õ«Õ·Õ¿ Õ´Õ¥Õ¯Õ¨, tmpdir Õ¯Õ¡Õ´ աբստրակտ " +"բանալիներ)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Ô²Õ¡Õ¶Õ¡Õ¬Õ«/արժեք զույգի Õ¡Õ¶Õ«Õ´Õ¡Õ½Õ¿ համադրություն `%s' հասցեում" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Սխալ `%s' հասցեում - port-Õ« ատրիբուտը Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Սխալ `%s' հասցեում - family-Õ« ատրիբուտը Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "`%s' հասցեի Õ§Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¨ Õ¹Õ« պարունակում (:) երկու Õ¯Õ¥Õ¿" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"%d, `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«/արժեք զույգը `%s' հասցեի տարրում Õ¹Õ« պարունակում հավասարման " +"Õ¶Õ·Õ¡Õ¶" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Բանալու Õ¯Õ¡Õ´ արժեքի կոդավորման Õ½Õ­Õ¡Õ¬ %d Ô²Õ¡Õ¶Õ¡Õ¬Õ«/Արժեք զույգում, `%s', `%s' " +"հասցեի տարրում" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Սխալ `%s' հասցեում - unix-Õ« փոխադրումը պահանջում Õ§ տեղադրված Õ¬Õ«Õ¶Õ« " +"բանալիներից Õ³Õ«Õ·Õ¿ մեկը՝ `path' Õ¯Õ¡Õ´ `abstract'" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Սխալ `%s' հասցեում - host ատրիբուտը բացակայում Õ§ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Սխալ `%s' հասցեում - port ատրիբուտը բացակայում Õ§ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Սխալ `%s' հասցեում - noncefile ատրիբուտը բացակայում Õ§ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Չհաջողվեց Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ կերպով Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ կապ․" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Չհայտնաբերված Õ¯Õ¡Õ´ չաջակցվող `%s' փոխադրում `%s' հասցեի համար" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' ֆայլը բացելու սխալ․ %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "`%s' ֆայլը կարդալու Õ½Õ­Õ¡Õ¬ %s․" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "`%s' ֆայլը կարդալու Õ½Õ­Õ¡Õ¬, սպասվում էր 16 Õ¢Õ¡ÕµÕ©, ստացվել Õ§ %d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ գրել `%s' file-Õ« պարունակությունը հոսքում․" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "Տրված հասցեն դատարկ Õ§" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ բազմացնել հաղորդագրության կապուղին առանց մեքենայի իդենտիֆիկատորի" + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "`%s' հրամանային Õ¿Õ¸Õ²Õ« բազմացման սխալ․" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Ծրագրի Õ¸Õ¹ նորմալ ավարտ `%s' հրամանային Õ¿Õ¸Õ²Õ¨ բազմացնելիս․ %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "`%s' հրամանային Õ¿Õ¸Õ²Õ¨ ավարտվել Õ§ Õ¸Õ¹ զրոյական %d կարգավիճակով․ %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ որոշել Õ½Õ¥Õ½Õ«Õ¡ÕµÕ« կապուղու հասցեն (իրականացված Õ¹Õ§ Õ¡ÕµÕ½ օպերացիոն " +"համակարգում)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ որոշել կապուղու հասցեն DBUS_STARTER_BUS_TYPE միջավայրային " +"փոփոխականից - Õ¡Õ¶Õ°Õ¡ÕµÕ¿ արժեք `%s'" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ որոշել կապուղու հասցեն, քանի որ DBUS_STARTER_BUS_TYPE " +"միջավայրային փոփոխականը տեղադրված Õ¹Õ§" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "%d չհայտնաբերված bus - Õ« Õ¿Õ«Õº" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "Պարունակության Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« ÕºÕ¡Õ¯Õ¡Õ½ Õ¿Õ¸Õ²Õ¨ կարդալու փորձ կատարելիս" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Պարունակության Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« ÕºÕ¡Õ¯Õ¡Õ½ Õ¿Õ¸Õ²Õ¨ (Õ¡ÕºÕ¡Õ°Õ¸Õ¾) կարդալու փորձ կատարելիս" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Վավերացման բոլոր Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« մեխանիզմները Õ½ÕºÕ¡Õ¼Õ¾Õ¥Õ¬ Õ¥Õ¶ (փորձվել են․ %s) (Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« " +"են․ %s)" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Ô±Õ¶Õ»Õ¡Õ¿Õ¾Õ¥Õ¬ Õ§ GDBusAuthObserver -ով։։հաստատված-վավերացված-հավասարազոր" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error statting directory `%s': %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ բացելու Õ½Õ­Õ¡Õ¬. %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"`%s' ÕºÕ¡Õ¶Õ¡Õ¯Õ« թույլտվությունները Õ½Õ­Õ¡Õ¬ են։ Սպասվում էր 0700 Õ¼Õ¥ÕªÕ«Õ´, ստացվել Õ§ 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "'%s' ÕºÕ¡Õ¶Õ¡Õ¯ ստեղծելու սխալ․ %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Կարդալու համար Õ¶Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® '%s' ֆայլը բացելու սխալ․" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "keyring-Õ« %d Õ¿Õ¸Õ²Õ¨ `%s' -ում, որի պարունակությունը `%s' Õ§, Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"%d Õ¿Õ¸Õ²Õ« Õ¡Õ¼Õ¡Õ»Õ«Õ¶ Õ¢Õ¡Õ¼Õ¡Õ¶Õ«Õ·Õ¨ `%s' - ում, որի պարունակությունը `%s' Õ§, Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"keyring-Õ« %d Õ¿Õ¸Õ²Õ« երկրորդ Õ¢Õ¡Õ¼Õ¡Õ¶Õ«Õ·Õ¨ `%s' -ում, որի պարունակությունը `%s' Õ§, " +"Õ½Õ­Õ¡Õ¬ Õ§" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Չի Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ %d id-Õ¸Õ¾ cookie `%s' keyring-ում" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' արգելափակման ֆայլը ջնջելու սխալ․ %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' արգելափակման ֆայլի Õ½Õ¿Õ¥Õ²Õ®Õ´Õ¡Õ¶ սխալ․ %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "" +"'%s' արգելափակման (հղում չպարունակող) ֆայլի փակման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ առաջացած սխալ․ %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' արգելափակման ֆայլի կապերն անջատելու սխալ․ %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Գրելու համար Õ¶Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® '%s' ֆայլը բացելու սխալ․" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Լրացուցիչ, `%s' - Õ« արգելափակման թողարկումը ևս Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Õ¬ է․ %s)" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "Ô¿Õ¡ÕºÕ¨ փակ Õ§" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "Հասել Õ§ timeout" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Հանդիպել Õ¥Õ¶ չաջակցվող դրոշներ client-side միացումը Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬Õ«Õ½" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Գոյություն չունի `org.freedesktop.DBus.Properties' ինտերֆեյս %s ուղու վրա " +"Õ£Õ¿Õ¶Õ¾Õ¸Õ² օբյեկտի համար" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Տեղի Õ§ ունեցել Õ½Õ­Õ¡Õ¬`%s' հատկությունը սահմանելիս․ Սպասվում էր `%s' Õ¿Õ«ÕºÕ¨ , " +"բայց ստացվել Õ§`%s'" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' հատկությունը գոյություն չունի " + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' հատկությունը կարդացվող Õ¹Õ§" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' հատկությունը գրվող Õ¹Õ§" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "Գոյություն չունի `%s' ինտերֆեյս" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "Ô±ÕµÕ¤ÕºÕ«Õ½Õ« ինտերֆեյս գոյություն չունի" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Գոյություն չունի `%s' ինտերֆեյս %s ուղու վրա Õ£Õ¿Õ¶Õ¾Õ¸Õ² օբյեկտի համար" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "Ô±ÕµÕ¤ÕºÕ«Õ½Õ« `%s' Õ´Õ¥Õ©Õ¸Õ¤ գոյություն չունի " + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "`%s' հաղորդագրության Õ¿Õ«ÕºÕ¨ Õ¹Õ« համապատասխանում `%s' Õ½ÕºÕ¡Õ½Õ¾Õ¸Õ² Õ¿Õ«ÕºÕ«Õ¶" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Օբյեկտը արդեն արտածվել Õ§ %s ինտերֆեյսի համար %s ում" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "`%s'Õ´Õ¥Õ©Õ¥Õ¤Õ¨ վերադարձնում Õ§ `%s' Õ¿Õ«ÕºÕ¨, բայց սպասվում էր `%s'" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "`%s' Õ´Õ¥Õ©Õ¸Õ¤Õ¨ `%s' ինտերֆեյսի վրա `%s' նկարագրությամբ գոյություն չունի" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "ÔµÕ¶Õ©Õ¡Õ®Õ¡Õ¼Õ¶ արդեն արտածվել Õ§ %s համար" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "Õ¿Õ«ÕºÕ¨ ԱՆՎԱՎԱԵՐ Ô·" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"METHOD_CALL հաղորդագրություն․ PATH Õ¯Õ¡Õ´ MEMBER Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ բացակայում Õ§" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" +"METHOD_RETURN հաղորդագրություն․ REPLY_SERIAL Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ բացակայում Õ§" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"ՍԽԱԼԻ հաղորդագրություն․ REPLY_SERIAL Õ¯Õ¡Õ´ ERROR_NAME Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ " +"բացակայում Õ§" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"SIGNAL հաղորդագրություն․ PATH, INTERFACE Õ¯Õ¡Õ´ MEMBER Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ դաշտերը " +"բացակայում Õ¥Õ¶" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL հաղորդագրություն․ PATH Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ օգտագործում Õ§ /org/" +"freedesktop/DBus/Local ռեզերվացված արժեքը" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL հաղորդագրություն․ INTERFACE Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ¨ օգտագործում Õ§ org." +"freedesktop.DBus.Local ռեզերվացված արժեքը" + +#: ../gio/gdbusmessage.c:998 +#, fuzzy, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Ցանկանում Õ§ կարդալ %lu Õ¢Õ¡ÕµÕ©, բայց ստացվել Õ§ EOF" +msgstr[1] "Ցանկանում Õ§ կարդալ %lu Õ¢Õ¡ÕµÕ©, բայց ստացվել Õ§ EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Սպասվում Õ§ վավերական UTF-8 Õ¿Õ¸Õ², բայց Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ Õ§ անվավեր բայթեր %d տեղաշարժի " +"վրա (Õ¿Õ¸Õ²Õ« երկարությունը %d Õ§)։ Վավերական UTF-8 Õ¿Õ¸Õ², որի համար Õ´Õ«Õ¶Õ¹ Õ¡ÕµÕ¤ Õ¯Õ¥Õ¿Õ¨ `" +"%s' էր։" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "`%s' տողից Õ°Õ¥Õ¿Õ¸ սպասվում էր NUL Õ¢Õ¡ÕµÕ©, բայց Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ Õ§ %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "`%s' վերլուծված արժեքը D-Bus օբյեկտի վավեր ճանապարհ Õ¹Õ§" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "`%s' վերլուծված արժեքը D-Bus օբյեկտի վավեր նկարագրություն Õ¹Õ§" + +#: ../gio/gdbusmessage.c:1324 +#, fuzzy, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Հաշվվել Õ§ %u բայթերի երկարության զանգվածը։ Առավելագույն երկարությունը 2<<26 " +"Õ¢Õ¡ÕµÕ© Õ§ (64 MiB)։" +msgstr[1] "" +"Հաշվվել Õ§ %u բայթերի երկարության զանգվածը։ Առավելագույն երկարությունը 2<<26 " +"Õ¢Õ¡ÕµÕ© Õ§ (64 MiB)։" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"`%s' վերլուծված արժեքը տարբերակի համար D-Bus օբյեկտի վավեր նկարագրություն Õ¹Õ§" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Սխալ D-Bus լարի ֆորմատից `%s' Õ¿Õ«ÕºÕ« Õ¿Õ¸Õ²Õ¸Õ¾ GVariant-Õ« զուգահեռացման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Անվավեր endianness արժեք։ Սպասվում էր 0x6c ('l') Õ¯Õ¡Õ´ 0x42 ('B') ', բայց " +"Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ Õ§ 0x%02x արժեքը" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Հիմնական պրոտոկոլի ավավեր տարբերակ։ Սպասվում էր 1, բայց Õ£Õ¿Õ¶Õ¾Õ¥Õ¬ Õ§ %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Ô³Õ¿Õ¶Õ¾Õ¥Õ¬ Õ§ `%s' նկարագրությամբ նկարագրության Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¨, բայց հաղորդագրության " +"մարմինը դատարկ Õ§" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Վերլուծված `%s' արժեքը վավեր D-Bus նկարագրությաություն Õ¹Õ§ (մարմնի համար)" + +#: ../gio/gdbusmessage.c:1821 +#, fuzzy, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Հաղորդագրության Õ´Õ¥Õ» Õ¹Õ¯Õ¡ նկարագրության Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½, բայց հաղորդագրության մարմինը " +"%u Õ¢Õ¡ÕµÕ© Õ§" +msgstr[1] "" +"Հաղորդագրության Õ´Õ¥Õ» Õ¹Õ¯Õ¡ նկարագրության Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½, բայց հաղորդագրության մարմինը " +"%u Õ¢Õ¡ÕµÕ© Õ§" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ զուգահեռացնել հաղորդագրությունը" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Սխալ `%s' Õ¿Õ«ÕºÕ« Õ¿Õ¸Õ²Õ¸Õ¾ GVariant-Õ¨ D-Bus լարի ֆորմատի փոխելիս" + +#: ../gio/gdbusmessage.c:2303 +#, fuzzy, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "Հաղորդագրությունը ուներ %d fds, բայց header Õ¤Õ¡Õ·Õ¿Õ¨ ցույց Õ§ Õ¿Õ¡Õ¬Õ«Õ½ %d fds" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ հաջորդական ձևով ներկայացնել հաղորդագրությունը" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Հաղորդագրության մարմինն ունի `%s' նկարագրություն, բայց գոյություն չունի " +"նկարագրության Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Հաղորդագրության մարմինն ունի Õ¿Õ«ÕºÕ« `%s' նկարագրություն, բայց նկարագրությունը " +"Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ դաշտում `%s' Õ§" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Հաղորդագրության մարմինը դատարկ Õ§, բայց նկարագրությունը Õ£Õ¬Õ­Õ¡Õ´Õ¡Õ½Õ¡ÕµÕ«Õ¶ դաշտում " +"(`%s') Õ§" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "'%s' Õ¿Õ«ÕºÕ« մարմնով ֆայլի վերադարձման Õ½Õ­Õ¡Õ¬" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "Սխալ վերադարձ դատարկ մարմնով" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ /var/lib/dbus/machine-id․" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s - Õ« համար StartServiceByName-Õ« Õ¯Õ¡Õ¶Õ¹Õ´Õ¡Õ¶ սխալ․ " + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Չսպասված ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ %d StartServiceByName(\"%s\") մեթոդից" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ¯Õ¡Õ¶Õ¹Õ¥Õ¬ մեթոդ․ պրոքսին առանց տիրոջ Õ¬Õ¡Õ¾ Õ°Õ¡ÕµÕ¿Õ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ համար Õ§ և " +"պրոքսին կառուցված Õ§ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START դրոշի միջոցով" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "Աբստրակտ անվանումների տիրույթները Õ¹Õ¥Õ¶ ապահովվում" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ¶Õ·Õ¥Õ¬ nonce ֆայլ սերվեր Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ«Õ½" + +#: ../gio/gdbusserver.c:875 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Ֆայլը գրելու Õ½Õ­Õ¡Õ¬ `%s' - ում․ %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "`%s' Õ¿Õ¸Õ²Õ¨ վավեր D-Bus GUID Õ¹Õ§" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Չի կարող Õ¬Õ½Õ¥Õ¬ `%s' չաջակցվող փոխադրումը" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "Հրաման" + +#: ../gio/gdbus-tool.c:93 +#, fuzzy, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Հրամաններ․ \n" +" օգնություն Ցուցադրում Õ§ Õ¡ÕµÕ½ տեղեկությունը\n" +" Õ¦Õ¶Õ¶Õ¥Õ¬ Զննում Õ§ հեռադիր օբյեկտը\n" +" հետևել Հետևում Õ§ Õ°Õ¥Õ¼Õ¡Õ¯Õ¡ օբյեկտը\n" +" Õ¯Õ¡Õ¶Õ¹ Կանչում Õ§ մեթոդ՝ հեռացված օբյեկտի վրա\n" +"\n" +"Օգտագործել \"%s ՀՐԱՄԱՆ --օգնություն\" յուրաքանչյուր հրամանի օգնությունն " +"ստանալու համար։\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Սխալ․ %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "XML զննումը վերլուծելու սխալ․ %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Միանում Õ§ համակարգի կապուղուն" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Կապվում Õ§ Õ½Õ¥Õ½Õ«Õ¡ÕµÕ« կապուղուն" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Կապվում Õ§ տրված D-Bus հասցեին" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Ô¿Õ¡ÕºÕ« Վերջնակետի Ընտրանքներ․" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Ô¿Õ¡ÕºÕ« վերջնակետը նշելու ընտրանքներ" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Ô¿Õ¡ÕºÕ« վերջկակետը Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Նշված Õ¥Õ¶ Õ¯Õ¡ÕºÕ« Õ¢Õ¡Õ¦Õ´Õ¡Õ¯Õ« վերջնակետեր" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Զգուշացում․ Հաշվի Õ¡Õ¼Õ¶Õ¥Õ¬Õ¸Õ¾ զննում Õ¿Õ¾ÕµÕ¡Õ¬Õ¨, `%s' ինտերֆեյսը գոյություն չունի\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Զգուշացում․ Հաշվի Õ¡Õ¼Õ¶Õ¥Õ¬Õ¸Õ¾ զննում Õ¿Õ¾ÕµÕ¡Õ¬Õ¨, `%s'Õ´Õ¥Õ©Õ¸Õ¤Õ¨ գոյություն չունի `%s' " +"ինտերֆեյսի համար\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "Օբյեկտի ուղին, որին պետք Õ§ հետևել" + +#: ../gio/gdbus-tool.c:536 +#, fuzzy +msgid "Signal and interface name" +msgstr "Մեթոդի և ինտերֆեյսի անունը" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Միացման ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ առաջացած սխալ․ %s\n" + +#: ../gio/gdbus-tool.c:614 +#, fuzzy, c-format +msgid "Error: object path not specified.\n" +msgstr "Սխալ․ Օբյեկտի ուղին Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Սխալ․ %s - Õ¨ օբյեկտի վավեր ուղի Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:625 +#, fuzzy, c-format +msgid "Error: signal not specified.\n" +msgstr "Սխալ․ Նպատակակետը Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Սխալ․ %s - Õ¨ օբյեկտի վավեր ուղի Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Սխալ․ %s - Õ¨ օբյեկտի վավեր ուղի Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Սխալ․ %s - Õ¨ օբյեկտի վավեր ուղի Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%d պարամետրի վերլուծման սխալ․ %s\n" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Չհաջողվեց Õ¯Õ¡ÕºÕ« հաստատումը ընդունել՝ %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Նպատակետի անունը, որի վրա պետք Õ§ Õ¯Õ¡Õ¶Õ¹Õ¾Õ« Õ´Õ¥Õ©Õ¸Õ¤Õ¨" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Օբյեկտի ուղին, որի վրա պետք Õ§ Õ¯Õ¡Õ¶Õ¹Õ¾Õ« Õ´Õ¥Õ©Õ¸Õ¤Õ¨" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Մեթոդի և ինտերֆեյսի անունը" + +#: ../gio/gdbus-tool.c:728 +#, fuzzy +msgid "Timeout in seconds" +msgstr "Հասել Õ§ timeout" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Ô¿Õ¡Õ¶Õ¹Õ¥Õ¬ Õ´Õ¥Õ©Õ¸Õ¤Õ¨ հեռադիր օբյեկտի համար" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Սխալ․ Նպատակակետը Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Սխալ․ Օբյեկտի ուղին Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Սխալ․ Մեթոդի անունը Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ§\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Սխալ․ Մեթոդի `%s' անունը անվավեր Õ§\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "%d պարամետրի վերլուծման Õ½Õ­Õ¡Õ¬, որը `%s' Õ¿Õ«ÕºÕ« է․ %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Նպատակետի անունը, որը պետք Õ§ Õ¦Õ¶Õ¶Õ¥Õ¬" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Օբյեկտի ուղին, որը պետք Õ§ Õ¦Õ¶Õ¶Õ¥Õ¬" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Տպել XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Ô¶Õ¶Õ¶Õ¥Õ¬ հեռադիր օբյեկտը։" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Նպատակակետի անունը, որին պետք Õ§ հետևել" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Օբյեկտի ուղին, որին պետք Õ§ հետևել" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Հետևել հեռադիր օբյեկտը" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Անանուն" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop ֆայլում Õ¶Õ·Õ¾Õ¡Õ® Õ¹Õ« Exec Õ¤Õ¡Õ·Õ¿Õ¨" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ աշխատածրագրի համար ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¡Õ® տերմինալը Õ£Õ¿Õ¶Õ¥Õ¬" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ %s կոնֆիգուրացիոն ÕºÕ¡Õ¶Õ¡Õ¯ օգտագործողի աշխատածրագրի համար. " +"%s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Օգտագործողի համար Õ¹Õ« Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ %s MIME կոնֆիգուրացիոն ÕºÕ¡Õ¶Õ¡Õ¯. %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ օգտագործողի desktop ֆայլ %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Պատվիրված սահմանում %s համար" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "Սարքը Õ¹Õ« իրականացնում Õ½Õ¯Õ«Õ¦Õ¢Õ¨" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "Սարքը Õ¹Õ« իրականացնում ավարտը" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ GEmblem կոդավորման %d տարբերակը" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem կոդավորման Õ´Õ¥Õ» Õ½Õ­Õ¡Õ¬ քանակությամբ բառանիշեր (%d)" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ GEmblemedIcon կոդավորման %d տարբերակը" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon կոդավորման Õ´Õ¥Õ» Õ½Õ­Õ¡Õ¬ քանակությանմ բառանիշեր (%d)" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-Õ« համար սպասվում Õ§ GEmblem" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Ô´Õ«Õ¿Õ´Õ¡Õ¶ Õ¯Õ¥Õ¿ պարունակող գոյություն չունի" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Չի ստացվում ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ պանակից վերև " + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Չի ստացվում ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ ÕºÕ¡Õ¶Õ¡Õ¯Õ« վրայից " + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Գոյություն ունի Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¡Õ¯Õ¡Õ¯Õ¥Õ¿Õ« ֆայլ" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Չի ստացվում ռեկուրսիվ ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ ÕºÕ¡Õ¶Õ¡Õ¯Õ¨" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "Միավորումն Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¾Õ¡Õ® Õ¹Õ§" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "Ֆայլը միավորելու սխալ․ %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Չի ստացվում ÕºÕ¡Õ¿Õ³Õ¥Õ¶Õ¥Õ¬ հատուկ ÕºÕ¡Õ¶Õ¡Õ¯Õ¨" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Տրված Õ§ Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ Õ°Õ²Õ´Õ¡Õ¶ անվավեր արժեք" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Ô±Õ¦Õ¢Õ¡Õ´Õ¡Õ¶Õ¨ Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¾Õ¡Õ® Õ¹Õ§" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Ֆայլի անունը Õ¹Õ« կարող պարունակել '%c'" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "Հատորը Õ¹Õ« կարող իրականացնել միացումը" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Ô±ÕµÕ½ ֆայլի Õ´Õ·Õ¡Õ¯Õ´Õ¡Õ¶ համար աշխատածրագիր գրանցված Õ¹Õ«" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Հաշվիչը փակ Õ§" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Ֆայլի Õ°Õ¡Õ·Õ¾Õ«Õ¹Õ¨ պարունակում Õ§ անավարտ գործողություն" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Ֆայլի Õ°Õ¡Õ·Õ¾Õ«Õ¹Õ¨ արդեն փակ Õ§" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ փոխել GFileIcon կոդավորման %d Õ¿Õ¥Õ½Õ¡Õ¯Õ¨" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "Սխալ ձևավորված մուտքային Õ¿Õ¾ÕµÕ¡Õ¬ GFileIcon համար" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Հոսքը Õ¹Õ« ապահովում query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Հոսքով տեղաշարժվելը Õ¹Õ« ապահովվում" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Վնասում թույլատրված Õ¹Õ« ելքային հոսքում" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Վնասում Õ¹Õ« ապահովվում հոսքում" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Բառանիշերի Õ½Õ­Õ¡Õ¬ քանակություն (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s Õ¤Õ¡Õ½Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ համար Õ¿Õ«Õº գոյություն չունի" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s Õ¿Õ«ÕºÕ¨ Õ¹Õ« իրականավնում GIcon ինտերֆեյսը" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s Õ¿Õ«ÕºÕ¨ Õ¹Õ« համարվում դասակարգված" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Վատ ձևավորված Õ¿Õ¥Õ½Õ¡Õ¯Õ« անուն․ %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s Õ¿Õ«ÕºÕ¨ Õ¹Õ« իրականացնում GIcon ինտերֆեյսի from_tokens()-Õ¨" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ պատկերակի տեքստային ներկայացման Õ¿Õ¾ÕµÕ¡Õ¬ տարբերակը" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Հոսքը պարունակում Õ§ անավարտ գործողություն" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Սոկետի հասցեի համար բավականաչափ Õ¿Õ¥Õ² Õ¹Õ¯Õ¡" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Սոկետի չաջակցվող անուն" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "Դատարկ անվանումները թույլատրելի Õ¹Õ¥Õ¶" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "Անվավեր անուն '%s'․ Անունները պետք Õ§ Õ½Õ¯Õ½Õ¾Õ¥Õ¶ փոքրատառով" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"անվավեր անուն '%s'․ անվավեր Õ¶Õ«Õ· '%c'; Õ´Õ«Õ¡ÕµÕ¶ փոքրատառեր, թվեր և գծիկներ ('-') " +"Õ¥Õ¶ թույլատրվում։" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "անվավեր անուն '%s': որկու հաջորդական գծիկներ ('--') թույլատրելի չեն։" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "անվավեր անուն '%s'․ վերջին Õ¶Õ«Õ·Õ¨ Õ¹Õ« կարող Õ¬Õ«Õ¶Õ¥Õ¬Õ£Õ®Õ«Õ¯ ('-')։" + +#: ../gio/glib-compile-schemas.c:789 +#, fuzzy, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "անվավեր անուն '%s'․ առավելագույն երկարությունը 32 Õ§" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "<ենթատարրի անունը='%s'> արդեն Õ¶Õ·Õ¾Õ¡Õ® Õ§" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "Õ¹Õ« Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ ավելացնել բանալիներ 'list-of' Õ½Õ­Õ¥Õ´Õ¡ÕµÕ«Õ¶" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "<բանալու անուն='%s'> արդեն Õ¶Õ·Õ¾Õ¡Õ® Õ§" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +"<բանալու անուն='%s'> ծածկում Õ§ <բանալու անուն='%s'> <Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'> -ում; " +"օգտագործել արժեքը փոփոխելու համար" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"Õ³Õ«Õ·Õ¿ Õ´Õ¥Õ¯Õ¨ հետևյալներից՝ 'Õ¿Õ«Õº', 'enum' Õ¯Õ¡Õ´ 'դրոշներ', պետք Õ§ Õ¶Õ·Õ¾Õ¡Õ® Õ¬Õ«Õ¶Õ« որպես " +"<Õ¢Õ¡Õ¶Õ¡Õ¬Õ«> ատրիբուտ" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> դեռևս Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® չէ։" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Անվավեր GVariant Õ¿Õ«ÕºÕ« Õ¿Õ¸Õ²Õ« անուն '%s'" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr " տրված Õ§, բայց Õ½Õ­Õ¥Õ´Õ¡Õ¶ Õ¹Õ« ընդլայնում որևէ Õ¢Õ¡Õ¶" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "գոյություն չունի <բանալու անուն='%s'> վերագրելու համար" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr " արդեն Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ§" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "<Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'> արդեն Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ§" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "<Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'> ընդլայնում Õ§ դեռևս գոյություն չունեցող Õ½Õ­Õ¥Õ´Õ¡Õ¶ '%s'" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "<Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'> դեռևս գոյություն չունեցող '%s' Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« ցուցակ Õ§" + +#: ../gio/glib-compile-schemas.c:1116 +#, fuzzy, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Õ¹Õ« Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ ավելացնել բանալիներ 'list-of' Õ½Õ­Õ¥Õ´Õ¡ÕµÕ«Õ¶" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +"<Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'> ցուցակ Õ§, որն ընդլայնում Õ§ <Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s'>, որը ցուցակ Õ¹Õ§" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +"<Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s' list-of='%s'> ընդլայնում Õ§ <Õ½Õ­Õ¥Õ´Õ¡ÕµÕ« id='%s' list-of='%s'> " +"բայց '%s' Õ¹Õ« ընդլայնում '%s'" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ճանապարհը, Õ¥Õ©Õ¥ տրված Õ§, պետք Õ§ Õ½Õ¯Õ½Õ¾Õ« և ավարտվի թեք Õ£Õ®Õ¸Õ¾" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> արդեն Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ§" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%s> տարրըը Õ¹Õ« թույլատրվում <%s> -Õ« ներսում" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "<%s> տարրը Õ¹Õ« թույլատրվում վերին մակարդակում" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "տեքստը կարող Õ§ Õ¹Õ°Õ¡Õ¶Õ¤Õ«ÕºÕ¥Õ¬ <%s> -Õ« ներսում" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Գոյություն չունի `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ« '%s' սխեմայում, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ§ նորից " +"վերագրվող `%s' ֆայլում" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, fuzzy, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"Գոյություն չունի `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ« '%s' սխեմայում, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ§ նորից " +"վերագրվող `%s' ֆայլում" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"վերագրելու համար `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶ `%s' սխեմայում `%s' վերագրվող ֆայլում " +"սխեմայում տրված սահմաններից դուրս Õ§" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"վերագրելու համար `%s' Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶ `%s' սխեմայում `%s' վերագրվող ֆայլում վավեր " +"ընտրությունների ցուցակում Õ¹Õ§" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "Որտեղ տեղավորել gschemas.compiled ֆայլը" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "Պանակ" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "Չգրել gschemas.compiled ֆայլը" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "Ô±ÕµÕ½ ընտրանքը շուտով կհեռացվի" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "Չպարտադրել բանալու Õ¡Õ¶Õ¾Õ¡Õ¶ սահմանապակումները" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Կազմարկել բոլոր GSettings schema ֆայլերը schema cache-ում։\n" +"Schema ֆայլերը պետք Õ§ ունենան .gschema.xml ընդլայնում,\n" +"և cache ֆայլը կոչվում Õ§ gschemas.compiled։" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Պետք Õ§ Õ¶Õ·Õ¥Õ¬ Õ³Õ«Õ·Õ¿ Õ´Õ¥Õ¯ ÕºÕ¡Õ¶Õ¡Õ¯Õ« անուն\n" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "schema ֆայլ Õ¹Õ« գտնվել․" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "Õ¸Õ¹Õ«Õ¶Õ¹ չանել։\n" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "հեռացվել Õ§ գոյություն ունեցող ելքային ֆայլը։\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Չի հաջողվում Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ պանակների համար Õ£Õ¿Õ¶Õ¥Õ¬ ցուցարկչի Õ¿Õ«ÕºÕ¨" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ֆայլի %s անունը անվավեր Õ§" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Սխալ՝ ֆայլային համակրգի Õ´Õ¡Õ½Õ«Õ¶ տեղեկատվություն ստանալիս․ %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Չի հաջողվում վերանվանել root ÕºÕ¡Õ¶Õ¡Õ¯Õ¨" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Ֆայլը անվանափոխելու սխալ․ %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Չի հաջողվում վերանվանել ֆայլը, ֆայլի անունն արդեն գոյություն ունի" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Անվավեր ֆայլի անունը" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Ֆայլ բացելու սխալ․ %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Չի ստացվում բացել ÕºÕ¡Õ¶Õ¡Õ¯" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Ֆայլ ջնջելու սխալ․ %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Ֆայլը Õ¡Õ²Õ¢Õ¡Õ´Õ¡Õ¶Õ« Õ´Õ¥Õ» ուղարկելու սխալ․ %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ '%s' Õ¡Õ²Õ¢Õ¡Õ´Õ¡Õ¶ պանակ․ %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ£Õ¿Õ¶Õ¥Õ¬ վերին մակարդակի ÕºÕ¡Õ¶Õ¡Õ¯ Õ¡Õ²Õ¢Õ¡Õ´Õ¡Õ¶Õ« համար" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr " Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ£Õ¿Õ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¡Õ²Õ¢Õ¡Õ´Õ¡Õ¶ ÕºÕ¡Õ¶Õ¡Õ¯Õ¨" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ ինֆորմացիա աղբամանում Õ£Õ¿Õ¶Õ¾Õ¸Õ² ֆայլի մասին․ %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ ուղարկել ֆայլը Õ¡Õ²Õ¢Õ¡Õ´Õ¡Õ¶Õ« մեջ․ %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Պանակ ստեղծելու սխալ․ %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Ֆայլային համակարգը Õ¹Õ« ապահովում Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղումներ" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Սիմվոլիկ հղում ստեղծելու սխալ․ %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Ֆայլի տեղափոխման սխալ․ %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Հնարավոր Õ¹Õ§ տեղափոխել ÕºÕ¡Õ¶Õ¡Õ¯Õ¨ ÕºÕ¡Õ¶Õ¡Õ¯Õ« վրայով" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ պահուստային ֆայլ" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Նպատակակետի ֆայլը հեռացնելու սխալ․ %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Տեղադրումների կետերի միջև տեղափոխությունը Õ¹Õ« աջակցվում" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Ատրիբուտի անունը չպետք Õ§ Õ¬Õ«Õ¶Õ« NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Ատրիբուտի անվավեր անուն (սպասվում Õ§ Õ¿Õ¸Õ²)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® ատրիբուտի անվավեր անուն" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' Õ¨Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® ատրիբուտը սահմանելու սխալ․ %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ֆայլի Õ´Õ¡Õ½Õ«Õ¶ տեղեկություններ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬Õ«Õ½ առաջացած սխալ․ %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "(անվավեր կոդավորում)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Ֆայլի դեսկրիպտորը Õ½Õ¿Õ¡Õ¶Õ¡Õ¬Õ«Õ½ առաջացած սխալ․ %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ատրիբուտի անվավեր Õ¿Õ¥Õ½Õ¡Õ¯ (սպասվում Õ§ uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ատրիբուտի անվավեր Õ¿Õ¥Õ½Õ¡Õ¯ (սպասվում Õ§ uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ատրիբուտի անվավեր Õ¿Õ¥Õ½Õ¡Õ¯ (սպասվում Õ§ byte Õ¿Õ¸Õ²)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Չհաջողվեց Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ արտոնություններ Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ Õ°Õ²Õ´Õ¡Õ¶ համար․ %s" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Արտոնություններ սահմանելու սխալ․ %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Սխալ սեփականատեր սահմանելիս․ %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "Սիմվոլիկ հղումը պետք Õ§ Õ¬Õ«Õ¶Õ« Õ¸Õ¹ NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Սխալ Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղում սահմանելիս․ %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղում․ ֆայլը Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ«Õ¯ հղում Õ¹Õ§" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" +"Սխալ՝ առաջացած փոփություններ Õ¯Õ¡Õ´ հասանելիության ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ սահմանելիս․ %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux կոնտեքստը պետք Õ§ Õ¬Õ«Õ¶Õ« Õ¸Õ¹ NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux կոնտեքստի Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ´Õ¡Õ¶ սխալ․ %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ¹Õ§ Õ¡ÕµÕ½ համակարգում" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s ատրիբուտի սահմանումը Õ¹Õ« ապահովվում" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Ֆայլից կարդալու սխալ․ %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Ֆայլի վրայով անցնելու սխալ․ %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Ֆայլը փակելու սխալ․ %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ£Õ¿Õ¶Õ¥Õ¬ Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ ֆայլերի մոնիտորի Õ¿Õ«ÕºÕ¨ " + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Ֆայլում գրելու սխալ․ %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ»Õ¶Õ»Õ¥Õ¬ Õ°Õ«Õ¶ պահուստային ֆայլերը․ %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Պահեստային կրկնօրինակ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ«Õ½ առաջացած սխալ․ %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Ժամանակավոր ֆայլն անվանափոխելու սխալ․ %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Ֆայլը կտրելու սխալ․ %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' Ֆայլը բացելու սխալ․ %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Նպատակակետի ֆայլը ÕºÕ¡Õ¶Õ¡Õ¯ Õ§" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Նպատակակետի ֆայլը կանոնավոր ֆայլ Õ¹Õ§" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Ֆայլը արտաքինից փոփոխվել Õ§" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Հին ֆայլը ջնջելու սխալ․ %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Փոխանցված Õ§ անվավեր GSeekType" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Չի կարելի Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ GMemoryInputStream-Õ¨" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Չի կարելի Õ¾Õ¶Õ¡Õ½Õ¥Õ¬ GMemoryInputStream-Õ¨" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Ելքային հոսքի չափը հիշողության Õ´Õ¥Õ» փոփոխելի Õ¹Õ§" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ փոփոխել ելքային հոսքի չափը հիշողության Õ´Õ¥Õ»" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Գրելու համար ÕºÕ¡Õ°Õ¡Õ¶Õ»Õ¾Õ¸Õ² հիշողության չափը Õ¡Õ¾Õ¥Õ¬Õ« Õ´Õ¥Õ® Õ§ քան Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« հասցեների " +"տիրույթը" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "Պահանջվել Õ§ տեղափոխում հոսքը սկսվելուց Õ¡Õ¼Õ¡Õ»" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "Տեղադրումը Õ¹Õ« իրականացրել \"ապամոնտաժումը\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "Տեղադրումը Õ¹Õ« իրականացնում պարունակության Õ¿Õ«ÕºÕ« սինխրոն որոշումը " + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' Hostname-Õ¨ պարունակում Õ§ '[' բայց Õ¸Õ¹ ']' " + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "Ելքային հոսքը Õ¹Õ« իրականացնում գրելը" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Սկզբնական հոսքը արդեն փակ Õ§" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' - Õ« լուծման սխալ․ %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' - Õ« հակադարձ լուծման սխալ․ %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "Գոյություն չունի Õ®Õ¡Õ¼Õ¡ÕµÕ¸Õ²Õ¡Õ¯Õ¡Õ¶ գրառում '%s' -Õ« համար" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Ժամանակավորապես հնարավոր Õ¹Õ§ լուծել '%s'" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Լուծման սխալ․ %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, fuzzy, c-format +msgid "No such schema '%s'\n" +msgstr "Գոյություն չունի `%s' ինտերֆեյս" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, fuzzy, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "ճանապարհը, Õ¥Õ©Õ¥ տրված Õ§, պետք Õ§ Õ½Õ¯Õ½Õ¾Õ« և ավարտվի թեք Õ£Õ®Õ¸Õ¾" + +#: ../gio/gsettings-tool.c:104 +#, fuzzy, c-format +msgid "Path must end with a slash (/)\n" +msgstr "ճանապարհը, Õ¥Õ©Õ¥ տրված Õ§, պետք Õ§ Õ½Õ¯Õ½Õ¾Õ« և ավարտվի թեք Õ£Õ®Õ¸Õ¾" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, fuzzy, c-format +msgid "No such key '%s'\n" +msgstr "`%s' հատկությունը գոյություն չունի " + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +#, fuzzy +msgid "Print help" +msgstr "Տպել XML" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "Ստանալ բանալու արժեքը" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +#, fuzzy +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA-Ô» ԲԱՆԱԼԻ" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +#, fuzzy +msgid "Set the value of KEY to VALUE" +msgstr "Տեղադրել ԲԱՆԱԼՈՒ արժեքը" + +#: ../gio/gsettings-tool.c:583 +#, fuzzy +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ՍԽԵՄԱՅԻ ԲԱՆԱԼՈՒ ԱՐԺԵՔ" + +#: ../gio/gsettings-tool.c:588 +#, fuzzy +msgid "Reset KEY to its default value" +msgstr "Սահմանում Õ§ ԲԱՆԱԼԻՆ իր Õ¬Õ¼Õ¥Õ¬ÕµÕ¡ÕµÕ¶ արժեքով" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +#, fuzzy +msgid "Check if KEY is writable" +msgstr "Պարզել արդյոք ԲԱՆԱԼԻՆ գրվող Õ§" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +#, fuzzy +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA-Ô» ԲԱՆԱԼԻ" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Ô±Õ¶Õ°Õ¡ÕµÕ¿ հրաման '%s'\n" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +#, fuzzy +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +"Արգումենտներ․\n" +" ՍԽԵՄԱ Սխեմայի id\n" +" ԲԱՆԱԼԻ Բանալու անուն\n" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Անվավեր Õ½Õ¸Õ¯Õ¥Õ¿, սկզբնարժեքավորված Õ¹Õ§" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Անվավեր Õ½Õ¸Õ¯Õ¥Õ¿, սկզբնարժեքավորումը Õ¹Õ« իրականացվել հետևյալ պատճառով․ %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "Սոկետը արդեն փակ Õ§" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "I/O Õ½Õ¸Õ¯Õ¥Õ¿Õ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¨ լրացել Õ§" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "Ստեղծել GSocket fd-ից․ %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ սոկետ․ %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "Նշված Õ§ Õ¡Õ¶Õ°Õ¡ÕµÕ¿ պրոտոկոլ" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "Չի կարող Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ¿Õ¥Õ²Õ¡ÕµÕ«Õ¶ հասցեն․ %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "Չի կարող Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ հեռադիր հասցեն․ %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "Չի կարող լսել․ %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Հասցեին կապվելու սխալ․ %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Չհաջողվեց Õ¯Õ¡ÕºÕ« հաստատումը ընդունել՝ %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Չհաջողվեց Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ կապ․" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "Կատարվում Õ§ միացում" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Չհաջողվեց Õ°Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Õ¬ կապ․ %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Õ½ÕºÕ¡Õ½Õ¾Õ¡Õ® սխալը․ %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Սխալ՝ առաջացած տվյալներն ստանալիս․ %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Սխալ՝ առաջացած տվյալներն ուղարկելիս․ %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬ սոկետ․ %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Սխալ՝ առաջացած Õ½Õ¸Õ¯Õ¥Õ¿Õ¨ փակելիս․ %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Սպասում Õ§ Õ½Õ¸Õ¯Õ¥Õ¿Õ« վիճակին․ %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Հաղորդագրության ուղարկման սխալ․ %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "SocketControlMessage-Õ¨ Õ¹Õ« աջակցվում windows-ում " + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Հաղորդագրություն ստանալու ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯ առաջացած սխալ․ %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials-Õ¨ իրականացված Õ¹Õ§ Õ¡ÕµÕ½ ՕՀ-Õ« վրա" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Չհայտնաբերված Õ½Õ­Õ¡Õ¬ Õ¯Õ¡ÕºÕ« ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Ոչ TCP Õ¯Õ¡ÕºÕ« միջոցով փորձել պրոքսիի սահմանումը Õ¹Õ« աջակցվում" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "`%s' պրոքսի պրոտոկոլը Õ¹Õ« աջակցվում" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Ô¼Õ½Õ¸Õ²Õ¨ արդեն փակ Õ§" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Ավելացված Õ½Õ¸Õ¯Õ¥Õ¿Õ¨ փակ Õ§" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 Õ¹Õ« աջակցում IPv6 '%s' հասցեն" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" +"SOCKSv4 իրականացումը սահմանափակում Õ§ ՛օգտագործողի անունը՛ մինչև %i Õ¶Õ«Õ·Õ«" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "SOCKSv4a իրականացումը սահմանափակում Õ§ Õ°Õ¸Õ½Õ©Õ« անունը մինչև %i Õ¶Õ«Õ·Õ«" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Սերվերը SOCKSv4 պրոքսի սերվեր չէ։" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 սերվերի միջոցով Õ¯Õ¡ÕºÕ¨ մերժվել Õ§" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Սերվերը SOCKSv5 պրոքսի սերվեր չէ։" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 պրոքսին պահանջում Õ§ վավերացում" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 պահանջում Õ§ վավերացման Õ´Õ¥Õ©Õ¸Õ¤, որը Õ¹Õ« աջակցվում GLib-Õ« կողմից։" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" +"Օգտագործողի անունը Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ¨ չափազանց երկար Õ§ SOCKSv5 պրոտոկոլի համար " +"(առավելագույնը %i)։" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 վավերացումը Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Õ¬ Õ§ Õ½Õ­Õ¡Õ¬ օգտագործողի Õ¡Õ¶Õ¾Õ¡Õ¶ Õ¯Õ¡Õ´ Õ£Õ¡Õ²Õ¿Õ¶Õ¡Õ¢Õ¡Õ¼Õ« " +"պատճառով։" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" +"'%s' Õ°Õ¸Õ½Õ©Õ« անունը չափազանց երկար Õ§ SOCKSv5 պրոտոկոլի համար (առավելագույնը %i " +"Õ¢Õ¡ÕµÕ©)" + +#: ../gio/gsocks5proxy.c:352 +#, fuzzy +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 պրոքսի սերվերը օգտագործում Õ§ Õ¡Õ¶Õ°Õ¡ÕµÕ¿ հասցեի տիպ։" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Ինտերնալ SOCKSv5 պրոքսի սերվերի սխալ։" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 Õ¯Õ¡ÕºÕ¨ Õ¹Õ« թույլատրվում կանոնները Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¸Õ²Õ« կողմից։" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Հոսթը Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ SOCKSv սերվերի միջոցով։" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Ցանցը Õ¡Õ¶Õ°Õ¡Õ½Õ¡Õ¶Õ¥Õ¬Õ« Õ§ SOCKSv պրոքսիի միջոցով։" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 պրոքսիի միջոցով Õ¯Õ¡ÕºÕ¨ մերժվել է։" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 պրոքսին Õ¹Õ« աջակցում 'միացնել' հրամանը։" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 պրոքսին Õ¹Õ« աջակցում տրված հասցեի տիպը։" + +#: ../gio/gsocks5proxy.c:402 +#, fuzzy +msgid "Unknown SOCKSv5 proxy error." +msgstr "Ô±Õ¶Õ°Õ¡ÕµÕ¿ SOCKSv5 պրոքսի սխալ։" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ´Õ·Õ¡Õ¯Õ¥Õ¬ GThemedIcon կոդավորման %d տարբերակը" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Սպասվոմ Õ§ 1 Õ°Õ½Õ¯Õ«Õ¹ հաղորդագրություն, ստացվել Õ§ %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Լրացուցիչ տվյալների Õ¡Õ¶Õ½ÕºÕ¡Õ½Õ¥Õ¬Õ« Õ¿Õ«Õº" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Սպասվում Õ§ Õ´Õ¥Õ¯ ֆայլի դեսկրիպտոր, բայց ստացվել Õ§ %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Ստացվել Õ§ անվավեր ֆայլի դեսկրիպտոր" + +#: ../gio/gunixconnection.c:371 +msgid "Error sending credentials: " +msgstr "Տվյալներն ուղարկելու սխալ․" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Սխալ՝ ստուգելիս արդյոք SO_PASSCRED-Õ¨ միացված Õ§ սոկետին․ %s" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Հատկության անվավեր երկարություն՝ ստուգելիս, արդյոք SO_PASSCRED-Õ¨ Õ½Õ¸Õ¯Õ¥Õ¿Õ« " +"համար միացված է։ Սպասվում էր %d Õ¢Õ¡ÕµÕ©, ստացվել Õ§ %d" + +#: ../gio/gunixconnection.c:478 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Սխալ՝ առաջացած SO_PASSCRED - Õ¨ միացնելու ժամանակ․ %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Սպասվում էր կարդալ Õ´Õ¥Õ¯ Õ¢Õ¡ÕµÕ© ստացված տվյալներից, բայց կարդացվել Õ§ զրո Õ¢Õ¡ÕµÕ©" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "Սպասվոմ Õ§ 1 Õ°Õ½Õ¯Õ«Õ¹ հաղորդագրություն, ստացվել Õ§ %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Սխալ SO_PASSCRED անջատելիս․ %s" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Սխալ՝ առաջացած unix - ից կարդալու ժամանակ․ %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Սխալ՝ առաջացած unix - Õ¨ փակելու ժամանակ․ %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Ֆայլալին համակարգի արմատը" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Սխալ՝ առաջացած unix - ում գրելիս․ %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Ô±ÕµÕ½ համակարգը Õ¹Õ« աջակցում unix domain սոկետների աբստրակտ հասցեները" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "Սարքը Õ¹Õ« իրականացնում դուրս հանումը Õ¯Õ¡Õ´ դուրս հանումը գործողությամբ" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Չի Õ°Õ¡Õ»Õ¸Õ²Õ¾Õ¥Õ¬ Õ£Õ¿Õ¶Õ¥Õ¬ աշխատածրագիրը" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Աշխատածրագրի թողարկման սխալ․ %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "Սիմվոլիկ հղումներն Õ¡ÕºÕ¡Õ°Õ¸Õ¾Õ¾Õ¡Õ® Õ¹Õ¥Õ¶" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "Համադրման փոփոխությունները Õ¹Õ¥Õ¶ աջակցվում win32-ում" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Համադրման ստեղծումը Õ¹Õ« աջակցվում win32-ում " + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Սխալ՝ ֆայլից կարդալիս․ %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Սխալ՝ ֆայլը փակելիս․ %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Տեղի Õ§ ունեցել Õ½Õ­Õ¡Õ¬ ֆայլում գրելու ժամանակ․ %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Հիշողությունը Õ¢Õ¡Õ¾Õ¡Õ¯Õ¡Õ¶ Õ¹Õ§" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Ներքին սխալ․ %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Ô±Õ¾Õ¥Õ¬Õ« Õ·Õ¡Õ¿ մուտքային տվյալների կարիք Õ¯Õ¡" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Անվավեր Õ½Õ¥Õ²Õ´Õ¾Õ¡Õ® տվյալներ" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Վերադարձվող արժեքի Õ¿Õ«ÕºÕ¨ անվավեր Õ§, ստացվել Õ§ `%s', սպասվում էր `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Փորձում Õ§ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¥Õ¬ %s հատկությունը %s տիպում, բայց Õ°Õ¡Õ·Õ¾Õ« Õ¡Õ¼Õ¶Õ¥Õ¬Õ¸Õ¾ ստացված " +#~ "ինտերֆեյսը Õ¿Õ«ÕºÕ¨ %s Õ§" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Գոյություն չունի `%s' Õ½Õ­Õ¥Õ´Õ¡ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® վերագրվող `%s' ֆայլում" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Հրամաններ․\n" +#~ " օգնություն Ցուցադրում Õ§ Õ¡ÕµÕ½ տեղեկությունը\n" +#~ " Õ½Õ¿Õ¡Õ¶Õ¡Õ¬ Ստանում Õ§ բանալու արժեքը\n" +#~ " տեղադրել Տեղադրում Õ§ բանալու արժեքը\n" +#~ " վերադնել Վերադնում Õ§ բանալու արժեքը\n" +#~ " հետևել Հետևում Õ§ բանալու փոփոխությունները\n" +#~ " գրվող Ստուգում Õ§ արդյոք Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶ գրվող Õ§\n" +#~ "\n" +#~ "Օգտագործել '%s ՀՐԱՄԱՆ --օգնություն' յուրաքանչյուր հրամանի Õ´Õ¡Õ½Õ«Õ¶ " +#~ "օգնություն ստանալու համար.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Նշել schema-Õ« ուղին" + +#~ msgid "PATH" +#~ msgstr "ՈՒՂԻ" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Արգումենտներ․\n" +#~ " ՍԽԵՄԱ Սխեմայի id\n" +#~ " ԲԱՆԱԼԻ Բանալու անուն\n" +#~ " Արժեք Բանալու արժեք, որը պետք Õ§ տեղադրվի, որպես սերիալիզացված " +#~ "GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s Õ¢Õ¡Õ¶Õ¡Õ¬Õ«Õ¶ գրվող Õ¹Õ§\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Հետևել բանալու փոփոխություններին և Õ¿ÕºÕ¥Õ¬ փոփոխված արժեքները։\n" +#~ "Հետևելը կշարունակվի մինչև պրոցեսի ավարտը։" diff --git a/po/id.po b/po/id.po new file mode 100644 index 0000000..6caf59c --- /dev/null +++ b/po/id.po @@ -0,0 +1,4349 @@ +# Indonesian 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. +# Dirgita , 2010, 2012. +# Andika Triwidada , 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 10:30+0000\n" +"PO-Revision-Date: 2012-09-14 19:26+0700\n" +"Last-Translator: Andika Triwidada \n" +"Language-Team: Indonesian \n" +"Language: id\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: Poedit 1.5.3\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Nilai cacah yang dilewatkan ke %s terlalu besar" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Seek tak didukung pada stream basis" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Tak bisa memenggal GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Stream telah ditutup" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Pemenggalan tak didukung pada stream basis" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Operasi dibatalkan" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Objek tak valid, tak diinisialisasi" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Rangkaian bita tak lengkap dalam input" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Tak cukup ruang di tujuan" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Rangkaian bita dalam input konversi tidak benar" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Galat ketika konversi: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Inisialisasi yang dapat dibatalkan tak didukung" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konversi dari gugus karakter '%s' ke '%s' tak didukung" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Tidak dapat membuka pengubah dari '%s' ke '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipe %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipe tak dikenal" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipe berkas %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials tak diimplementasikan di OS ini" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Tidak ada dukungan GCredentials bagi platform Anda" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Akhir stream terlalu dini, tak diharapkan" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Kunci '%s' tak didukung pada entri alamat '%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Alamat '%s' tak valid (perlu hanya salah satu dari path, tmpdir, atau kunci " +"abstrak)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Kombinasi pasangan kunci/nilai tanpa arti di entri alamat '%s'" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Galat di alamat '%s' - atribut port salah bentuk" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Galat di alamat '%s' - atribut family salah bentuk" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Elemen alamat '%s' tak memuat titik dua (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Pasangan kunci/nilai %d, '%s', di elemen alamat '%s' tak memuat tanda sama " +"dengan" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Galat saat membongkar kunci atau nilai dalam pasangan Key/Value %d, '%s', " +"dalam elemen alamat '%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Galat di alamat '%s' - transport unix memerlukan hanya satu dari kunci " +"`path' atau `abstract' untuk ditata" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Galat di alamat '%s' - atribut host hilang atau salah bentuk" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Galat di alamat '%s' - atribut portt hilang atau salah bentuk" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Galat di alamat '%s' - atribut berkas nonce hilang atau salah bentuk" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Galat saat meluncurkan otomatis: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transport '%s' tak dikenal atau tak didukung bagi alamat '%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Galat saat membuka berkas nonce '%s': %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Galat saat membaca berkas nonce '%s': %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Galat saat membaca berkas nonce '%s', berharap 16 bita, mendapat %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Galat saat menulis isi dari berkas nonce '%s' ke stream:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Tidak ada alamat yang diberikan" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "Tidak bisa spawn suatu bus pesan ketika setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Tidak bisa spawn suatu bus pesan tanpa id-mesin: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Galat saat spawn baris perintah '%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Ketikkan karakter apapun untuk menutup jendela ini)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "dbus sesi tak sedang berjalan, dan peluncuran-otomatis gagal" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Tidak bisa menentukan alamat bus sesi (tidak diimplementasi bagi OS ini)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Tak bisa menentukan alamat bus dari variabel lingkungan " +"DBUS_STARTER_BUS_TYPE - nilai tak dikenal '%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Tak bisa menentukan alamat bus karena variabel lingkungan " +"DBUS_STARTER_BUS_TYPE tak diisi" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipe bus %d tak dikenal" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Ketiadaan isi yang tak diharapkan ketika membaca suatu baris" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Ketiadaan isi yang tak diharapkan ketika membaca suatu baris (secara aman)" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Menghabiskan semua mekanisme otentikasi yang tersedia (dicoba: %s) " +"(tersedia: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Dibatalkan melalui GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Galat ketika mengambil informasi untuk direktori '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Ijin pada direktori '%s' salah bentuk. Diharapkan mode 0700, diperoleh 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Galat membuat direktori '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Galat saat membuka gantungan kunci '%s' untuk dibaca: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Baris %d dari gantungan kunci pada '%s' dengan isi '%s' salah bentuk" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Token pertama dari baris %d dari gantungan kunci pada '%s' dengan isi '%s' " +"salah bentuk" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Token kedua dari baris %d dari gantungan kunci pada '%s' dengan isi '%s' " +"salah bentuk" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Tak menemukan cookie dengan id %d dalam gantungan kunci pada '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Galat saat menghapus berkas kunci yang basi '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Galat saat membuat berkas kunci '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Galat saat menutup berkas kunci (tak terkait) '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Galat saat membuka kait berkas kunci '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Galat saat membuka gantungan kunci '%s' untuk ditulisi: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Selain itu, melepas kunci bagi '%s' juga gagal: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Sambungan tertutup" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Kehabisan waktu" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Ditemui flag yang tak didukung ketika membangun sambungan di sisi klien" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Tidak ada antarmuka `org.freedesktop.DBus.Properties' pada objek di lokasi %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Galat menata properti '%s': Tipe yang diharapkan '%s' tapi diperoleh '%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Tak ada properti '%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Properti '%s' tidak dapat dibaca" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Properti '%s' tidak dapat ditulisi" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Tak ada antar muka '%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Tak ada antar muka begitu" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Tak ada antar muka '%s' pada objek di lokasi %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Tak ada metoda '%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Tipe pesan '%s' tak cocok dengan tipe yang diharapkan '%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Suatu objek telah diekspor bagi antar muka %s pada %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoda '%s' mengembalikan tipe '%s', tapi yang diharapkan '%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoda '%s' pada antar muka '%s' dengan tanda tangan '%s' tak ada" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Subtree telah diekspor bagi %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "jenisnya INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Pesan METHOD_CALL: ruas header PATH atau MEMBER hilang" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Pesan METHOD_RETURN: ruas header REPLY_SERIAL hilang" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Pesan ERROR: ruas header REPLY_SERIAL atau ERRORN_NAME hilang" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Pesan SIGNAL: ruas header PATH, INTERFACE, atau MEMBER hilang" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Pesan SIGNAL: ruas header PATH memakai nilai khusus /org/freedesktop/DBus/" +"Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Pesan SIGNAL: ruas header INTERFACE memakai nilai khusus org.freedesktop." +"DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Ingin membaca %lu bita tapi memperoleh EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Berharap string UTF-8 yang valid tapi menjumpai bita tak valid pada lokasi " +"%d (panjang string adalah %d). String UTF-8 yang valid sampai titik itu " +"adalah '%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Mengharapkan bita NUL setelah string '%s' tapi menemui bita %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Nilai terurai '%s' bukan lokasi objek D-Bus yang valid" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Nilai terurai '%s' bukan tanda tangan D-Bus yang valid" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Menjumpai larik dengan panjang %u bita. Panjang maksimal adalah 2<<26 bita " +"(64 MiB). " + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Nilai terurai '%s' bagi varian bukan tanda tangan D-Bus yang valid" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Galat saat deserialisasi GVariant dengan type string '%s' dari format kabel " +"D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Nilai ke-endian-an tak valid. Berharap 0x6c ('l') atau (0x42) 'B' tapi " +"menemui 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versi protokol mayor tak valid. Berharap 1 tapi menemui %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Header tanda tangan dengan tanda tangan '%s' ditemukan tapi body pesan kosong" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Nilai terurai '%s' bukan tanda tangan D-Bus yang valid (bagi body)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Tidak terdapat tajuk tanda tangan pada pesan, tetapi panjang badan pesan " +"adalah %u bita" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Tidak bisa men-deserialisasi pesan: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Kesalahan serialisasi GVariant dengan type string '%s' ke format kabel D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Pesan punya %d deskriptor berkas tapi ruas header mengindikasikan %d " +"deskriptor berkas" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Tidak bisa men-serialisasi pesan: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Body pesan punya tanda tangan '%s' tapi tak ada header tanda tangan" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Body pesan memiliki tanda tangan tipe '%s' tapi tanda tangan di ruas header " +"adalah '(%s)'" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Body pesan kosong tapi tanda tangan pada ruas header adalah '(%s)'" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Galat balikan dengan body bertipe '%s'" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Galat balikan dengan body kosong" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Tak bisa mendapat profil perangkat keras: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Tak bisa memuat /var/lib/dbus/machine-id ata /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Galat sewaktu memanggil StartServiceByName untuk %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Balasan tak diharapkan %d dari metode StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Tidak bisa menjalankan metoda; proksi adalah nama terkenal tanpa pemilik dan " +"proksi dibangun dengan flag G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Ruang nama abstrak tak didukung" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Tidak dapat menyatakan berkas nonce ketika membuat suatu server" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Galat saat menulis berkas nonce pada '%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "String '%s' bukan suatu GUID D-Bus yang valid" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Tidak dapat mendengarkan pada transport yang tak didukung '%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "PERINTAH" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Perintah:\n" +" help Tampilkan informasi ini\n" +" introspect Introspeksi suatu objek jauh\n" +" monitor Pantau suatu objek jauh\n" +" call Jalankan suatu metode pada suatu objek jauh\n" +" emit Pancarkan sinyal\n" +"\n" +"Gunakan \"%s PERINTAH --help\" untuk memperoleh bantuan pada setiap " +"perintah.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Galat: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Galat saat mengurai XML introspeksi: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Menyambung ke bus sistem" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Menyambung ke bus sesi" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Menyambung ke alamat D-Bus yang diberikan" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opsi Titik Ujung Sambungan:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opsi yang menyatakan titik ujung sambungan" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Titik ujung sambungan tak dinyatakan" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Telah dinyatakan titik ujung sambungan berganda" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Peringatan: Menurut data introspeksi, antar muka '%s' tak ada\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Peringatan: Menurut data introspeksi, metoda '%s' tak ada pada antar muka " +"'%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Tujuan opsional bagi sinyal (nama unik)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Path objek untuk dipancari sinyal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Nama antar muka dan sinyal" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Pancarkan sinyal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Galat saat menyambung: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Galat: path objek tak dinyatakan\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Galat: '%s' bukan suatu lokasi objek yang valid\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Galat: sinyal tak dinyatakan\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Galat: sinyal harus berupa nama yang berkualifikasi penuh.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Galat: '%s' bukan nama antar muka yang valid\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Galat: '%s' bukan nama anggota yang valid\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Galat: '%s' bukan nama bus unik yang valid\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Galat saat mengurai parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Galat saat menggelontor sambungan: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nama tujuan tempat menjalankan metoda" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Lokasi objek tempat menjalankan metoda" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Nama metoda dan antar muka" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Tenggat waktu dalam detik" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Jalankan suatu metoda pada suatu objek jauh." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Galat: Tujuan tak dinyatakan\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Galat: Lokasi objek tak dinyatakan\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Galat: Nama metoda tak dinyatakan\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Galat: Nama metoda '%s' tak valid\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Galat ketika mengurai parameter ke-%d dari jenis `%s': %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nama tujuan untuk introspeksi" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Lokasi objek untuk introspeksi" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Cetak XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspeksi anak" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Hanya cetak properti" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspeksi suatu objek jauh." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nama tujuan untuk dipantau" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Lokasi objek untuk dipantau" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Memantau suatu objek jauh." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Tanpa nama" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Berkas desktop tak menyatakan ruas Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Tak bisa temukan terminal yang diperlukan bagi aplikasi" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Tak bisa membuat folder %s untuk konfigurasi aplikasi bagi pengguna: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Tak bisa membuat folder %s untuk konfigurasi MIME bagi pengguna: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Informasi aplikasi tak punya identifier" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Tak bisa membuat berkas desktop pengguna %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Definisi gubahan bagi %s" + +#: ../gio/gdrive.c:393 +msgid "drive doesn't implement eject" +msgstr "kandar tidak mengimplementasikan eject" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gdrive.c:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "kandar tidak mengimplementasikan eject atau eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "kandar tidak mengimplementasi poll bagi media" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "kandar tidak mengimplementasi start" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "kandar tidak mengimplementasi stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Dukungan TLS tak tersedia" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Tak bisa menangani pengkodean GEmblem versi %d" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Cacah token (%d) salah bentuk di pengkodean GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Tak bisa menangani pengkodean versi %d dari GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Cacah token (%d) salah bentuk di pengkodean GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Berharap suatu GEmblem bagi GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +msgid "Operation not supported" +msgstr "Operasi tak didukung" + +#. 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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Kait yang memuat tak ada" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Tak bisa menyalin atas direktori" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Tak bisa menyalin direktori atas direktori" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Berkas tujuan telah ada" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Tak bisa menyalin direktori secara rekursif" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Splice tidak didukung" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Galat saat men-splice berkas: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Tak bisa menyalin berkas spesial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Diberikan nilai link simbolik yang tak valid" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Tong sampah tak didukung" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nama berkas tak boleh mengandung '%c'" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "volume tak mengimplementasi pengaitan" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Tak ada aplikasi terdaftar yang menangani berkas ini" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator ditutup" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Enumerator berkas memiliki operasi tertunda" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +msgid "File enumerator is already closed" +msgstr "Enumerator berkas telah ditutup" + +#: ../gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Tak bisa menangani pengkodean versi %d dari GFileIcon" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Data masukan salah bentuk bagi GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Stream tak mendukung query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Seek tak didukung pada stream" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Pemenggalan tak diijinkan pada stream masukan" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Pemenggalan tak didukung pada stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Cacah token yang salah (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Tak ada tipe bagi nama kelas %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipe %s tak mengimplementasi antar muka GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipe %s tak dikelaskan" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Nomor versi salah bentuk: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tipe %s tak mengimplementasi from_tokens() pada antar muka GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Tak bisa menangani versi pengkodean ikon yang diberikan" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Tak ada alamat yang dinyatakan" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Panjang %u terlalu panjang bagi alamat" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Alamat memiliki bit yang ditata diluar panjang prefiks" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Tak bisa mengurai '%s' sebagai mask alamat IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Tak cukup ruang bagi alamat soket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Alamat soket tak didukung" + +#: ../gio/ginputstream.c:194 +msgid "Input stream doesn't implement read" +msgstr "Stream masukan tak mengimplementasi pembacaan" + +#. 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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Stream memiliki operasi tertunda" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elemen <%s> tidak diijinkan di dalam <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elemen <%s> tidak diijinkan pada aras puncak" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Berkas %s muncul beberapa kali dalam sumber daya" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Gagal menemukan '%s' dalam direktori sumber manapun" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Gagal menemukan '%s' pada direktori kini" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Pilihan pemrosesan tidak diketahui \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Gagal membuat berkas temporer: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Galat saat memroses berkas masukan dengan xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Galat saat memroses berkas masukan dengan to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Galat saat membaca berkas %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Galat saat memampatkan berkas %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "teks tidak boleh muncul di dalam <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "nama berkas keluaran" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "BERKAS" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Direktori tempat berkas akan dibaca darinya (baku ke direktori kini)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIREKTORI" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Buat keluaran dalam format yang dipilih bagi ekstensi nama berkas target" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Buat tajuk sumber" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Buat kode sumber yang dipakai untutk menaut berkas sumber daya ke dalam kode " +"Anda" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Buat daftar kebergantungan" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Jangan buat dan daftarkan sumber daya secara otomatis" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Nama identifier C yang dipakai bagi kode sumber yang dibuat" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompail spesifikasi sumber daya ke dalam berkas sumber daya.\n" +"Berkas spesifikasi sumber daya memiliki ekstensi .gresource.xml,\n" +"dan berkas sumber daya memiliki ekstensi bernama .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Anda mesti memberikan hanya satu nama berkas\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "nama yang kosong tidak diperbolehkan" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nama '%s' tak valid: nama mesti diawali dengan huruf kecil" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nama '%s' tak valid: karakter '%c' tak valid; hanya huruf kecil, angka, dan " +"tanda hubung ('-') yang diijinkan." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "nama '%s' tak valid: dua tanda hubung berturutan ('--') tak diijinkan." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "nama '%s' tak valid: karakter terakhir tak boleh tanda hubung ('-')." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nama '%s' tak valid: panjang maksimum 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " telah dinyatakan" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "tak bisa menambah kunci ke skema 'list-of'" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " telah dinyatakan" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" membayangi di ; gunakan " +" untuk mengubah nilai" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"persis satu dari 'type', 'enum', atau 'flags' mesti dinyatakan sebagai " +"atribut dari " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> belum didefinisikan." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "string jenis GVariant '%s' tidak sah" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " diberikan tapi skema tak memperluas apapun" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "tak ada untuk ditimpa" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " telah dinyatakan" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " sudah ditentukan" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " memperluas skema '%s' yang belum ada" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " adalah daftar dari skema '%s' yang belum ada" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Tak mungkin berupa suatu daftar skema dengan path" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Tak bisa memperluas suatu skema dengan path" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" adalah daftar, memperluas yang bukan daftar" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" memperluas tapi " +"'%s' tak memperluas '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"suatu path, bila diberikan, harus dimulai dan diakhiri dengan garis miring" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "path dari suatu daftar mesti diakhiri dengan ':/'" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> sudah ditentukan" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elemen <%s> tidak diijinkan pada aras puncak" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict dinyatakan; keluar.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Seluruh berkas telah diabaikan.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Mengabaikan berkas ini.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Tak ada kunci '%s' dalam skema '%s' sebagaimana dinyatakan di berkas penimpa " +"'%s'" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; mengabaikan penimpaan kunci ini.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " dan --strict dinyatakan; keluar.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"galat mengurai kunci '%s' dalam skema '%s' sebagaimana dinyatakan di berkas " +"penimpa '%s': %s." + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Mengabaikan penimpaan bagi kunci ini.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"penimpa bagi kunci '%s' dalam skema '%s' di berkas penimpa '%s' di luar " +"jangkauan yang diberikan di dalam skema" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"penimpa bagi kunci '%s' dalam skema '%s' di berkas penimpa '%s' tak ada di " +"dalam daftar pilihan yang valid" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "dimana menyimpan berkas gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Gugurkan pada sebarang galat dalam skema" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Jangan menulis berkas gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Jangan paksakan pembatasan nama kunci" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompail semua berkas skema GSettings into suatu singgahan skema.\n" +"Berkas skema diharuskan memiliki ekstensi .gschema.xml,\n" +"dan berkas singgahan dinamai gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Anda mesti memberikan hanya satu nama direktori\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Tidak menemukan berkas skema: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "tak melakukan apapun.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "menghapus berkas keluaran yang telah ada.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Tak bisa temukan tipe pemantau direktori lokal baku" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nama berkas tak valid: %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Galat saat mengambil info sistem berkas: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Tak bisa mengubah nama direktori root" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Galat saat mengubah nama berkas: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Tak bisa mengubah nama berkas, nama telah dipakai" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nama berkas tak valid" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Tak bisa membuka direktori" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Galat saat membuka berkas: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Galat saat menghapus berkas: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Galat saat membuang berkas ke tong sampah: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Tak bisa membuat direktori tong sampah %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Tak bisa temukan direktori puncak bagi tong sampah" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Tak bisa temukan atau buat direktori tong sampah" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Tak bis membuat berkas informasi pembuangan ke tong sampah: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Tak bisa membuang berkas ke tong sampah: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "kesalahan internal" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Galat saat membuat direktori: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sistem berkas tak mendukung taut simbolik" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Galat saat membuat taut simbolis: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Galat saat memindah berkas: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Tak bisa memindah direktori atas direktori" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Pembuatan berkas cadangan gagal" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Galat saat menghapus berkas tujuan: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Perpindahan antar kait tak didukung" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Nilai atribut tak boleh NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Tipe atribut tak valid (diharapkan string)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Nama atribut tambahan yang tak valid" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Galat saat menata atribut tambahan '%s': %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (pengkodean tak valid)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Galat saat mengambil informasi bagi berkas '%s': %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Galat saat mengambil informasi bagi descriptor berkas: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipe atribut tak valid (diharapkan uint32)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipe atribut tak valid (diharapkan uint64)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Jenis atribut tidak sah (diharapkan bita berjenis string)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Tak bisa menata ijin pada taut simbolik" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Galat saat menata ijin: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Galat saat menata pemilik: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "symlink tak boleh NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Galat saat menata taut simbolis: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "Galat saat menata symlink: berkas bukan suatu link simbolik" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Galat saat menata waktu modifikasi atau akses: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "Konteks SELinux tak boleh NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Galat saat menata konteks SELinux: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux tak diaktifkan di sistem ini" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Penataan atribut %s tak didukung" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Galat saat membaca dari berkas: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Galat saat men-seek di berkas: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Galat saat menutup berkas: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Tak bisa temukan tipe pemantauan berkas lokal baku" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Galat saat menulis ke berkas: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Galat saat menghapus taut cadangan lama: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Galat saat membuat salinan cadangan: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Galat saat mengubah nama berkas sementara: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Galat saat memenggal berkas: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Galat saat membuka berkas '%s': %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Berkas tujuan adalah suatu direktori" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Berkas tujuan bukan berkas biasa" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Berkas telah diubah secara eksternal" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Galat saat menghapus berkas lama: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "GSeekType yang tak valid diberikan" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Permintaan seek yang tak valid" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Tak bisa memenggal GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Memori stream keluaran tak bisa diubah ukuran" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Gagal mengubah ukuran memori stream keluaran" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Banyaknya memori yang diperlukan untuk memroses penulisan lebih besar " +"daripada ruang tersedia" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Seek yang diminta sebelum awal stream" + +#: ../gio/gmemoryoutputstream.c:753 +msgid "Requested seek beyond the end of the stream" +msgstr "Seek yang diminta setelah akhir stream" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: ../gio/gmount.c:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount tak mengimplementasi \"unmount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +msgid "mount doesn't implement \"eject\"" +msgstr "mount tak mengimplementasi \"eject\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: ../gio/gmount.c:547 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "mount tak mengimplementasi \"unmount\" atau \"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:631 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount tak mengimplementasi \"eject\" atau \"eject_with_operation\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:717 +msgid "mount doesn't implement \"remount\"" +msgstr "mount tak mengimplementasi \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:797 +msgid "mount doesn't implement content type guessing" +msgstr "mount tak mengimplementasi penebakan jenis isi" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount tak mengimplementasi penebakan sinkron jenis isi" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nama host '%s' memuat '[' tapi tanpa ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Jaringan tak dapat dijangkau" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Host tak dapat dihubungi" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Tak bisa membuat pemantau jaringan: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Tak bisa membuat pemantau jaringan: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Tak bisa mendapat status jaringan: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Stream keluaran tak mengimplementasi penulisan" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Stream sumber telah ditutup" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Galat saat menguraikan '%s': %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Galat saat mengurai balik '%s': %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Tak ada record DNS dengan tipe yang diminta bagi '%s'" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Sementara tidak dapat menguraikan '%s'" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Galat saat menguraikan '%s'" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Data tak lengkap diterima bagi '%s'" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Sumber daya pada '%s' tak ada" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Sumber daya pada '%s' gagal dibuka pemampatannya" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Sumber daya pada '%s' bukan suatu direktori" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Stream masukan tak mengimplementasi seek" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Cetak bantuan" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[PERINTAH]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Seksi daftar memuat sumber daya dalam BERKAS elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Daftar sumber daya\n" +"Bila SEKSI diberikan, hanya mendaftar sumber daya dalam seksi ini\n" +"Bila PATH diberikan, hanya mendaftar sumber daya yang cocok" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "BERKAS [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SEKSI" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Daftar sumber daya dengan rincian\n" +"Bila SEKSI diberikan, hanya mendaftar sumber daya dalam seksi ini\n" +"Bila PATH diberikan, hanya mendaftar sumber daya yang cocok\n" +"Rincian termasuk seksi, ukuran, dan kompresi" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Ekstrak berkas sumber daya ke stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "BERKAS PATH" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Perintah tidak dikenal %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Cara pakai:\n" +" gresource [--section SEKSI] PERINTAH [ARG...]\n" +"\n" +"Perintah:\n" +" help Tampilkan informasi ini\n" +" sections Lihat daftar seksi sumber daya\n" +" list Lihat daftar sumber daya\n" +" details Lihat daftar sumber daya dengan rincian\n" +" extract Ekstrak sumber daya\n" +"\n" +"Gunakan 'gresource help PERINTAH' untuk memperoleh bantuan terrinci.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Cara pakai:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumen:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKSI Nama seksi elf (opsional)\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " PERINTAH Perintah (opsional) untuk dijelaskan\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " BERKAS Berkas elf (biner atau pustaka bersama)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" BERKAS Berkas elf (biner atau pustaka bersama)\n" +" atau berkas sumber daya terkompail\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH Path sumber daya (opsional, mungkin parsial)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH Path sumber daya\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Tak ada skema '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Skema '%s' tak dapat dipindahkan (path tak boleh dinyatakan)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Skema '%s' dapat dipindahkan (path mesti dinyatakan)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Path yang diberikan kosong.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Path harus dimulai dengan garis miring (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Path harus diakhiri dengan garis miring (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Path tak boleh memuat dua slash berturutan (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Tak ada kunci '%s'\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Nilai yang diberikan diluar rentang yang valid\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Daftar skema (yang tak bisa dipindah) yang terpasang" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Daftar skema yang dapat dipindah yang terpasang" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Daftar kunci di SKEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SKEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Daftar anak dari SKEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Daftar kunci dan nilai, secara rekursif\n" +"Bila tak ada SKEMA diberikan, daftar semua kunci\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SKEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Ambil nilai dari KUNCI" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SKEMA[:PATH] KUNCI" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Kueri rentang nilai yang valid bagi KUNCI" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Menata nilai KUNCI ke NILAI" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SKEMA[:PATH] KUNCI NILAI" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Menata KUNCI ke nilai bawaannya" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Tata ulang semua kunci dalam SKEMA ke nilai baku" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Periksa apakah KUNCI dapat ditulisi" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Pantau perubahan atas KUNCI.\n" +"Bila tak ada KUNCI yang dinyatakan, memantau semua kunci dalam SKEMA.\n" +"Gunakan ^C untuk berhenti memantau.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SKEMA[:PATH] [KUNCI]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Cara pakai:\n" +" gsettings [--schemadir DIRSKEMA] PERINTAH [ARG...]\n" +"\n" +"Perintah:\n" +" help Tampilkan informasi ini\n" +" list-schemas Lihat daftar skema terpasang\n" +" list-relocatable-schemas Lihat daftar skema yang dapat dipindah\n" +" list-keys Lihat daftar kunci dalam sebuah skema\n" +" list-children Lihat daftar anak dari sebuah skema\n" +" list-recursively Lihat daftar kunci dan nilai secara rekursif\n" +" range Kueri rentang dari suatu kunci\n" +" get Ambil nilai dari suatu kunci\n" +" set Atur nilai dari suatu kunci\n" +" reset Reset nilai dari suatu kunci\n" +" reset-recursively Reset semua nilai dari skema yang diberikan\n" +" writable Periksa apakah suatu kunci dapat ditulisi\n" +" monitor Pantau perubahan\n" +"\n" +"Gunakan 'gsettings help PERINTAH' untuk memperoleh bantuan rinci.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Cara pakai:\n" +" gsettings [--schemadir DIRSKEMA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " DIRSKEMA Adalah direktori tempat mencari skema tambahan\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SKEMA Nama skema\n" +" PATH Path, bagi skema yang dapat dipindah\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KUNCI Kunci (opsional) dalam skema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KUNCI Kunci dalam skema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " NILAI Tatanan nilai\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Nama skema yang diberikan kosong\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Soket tak valid, tak diinisialisasi" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Soket tak valid, inisialisasi gagal karena: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Soket telah ditutup" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "I/O soket kehabisan waktu" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "membuat GSocket dari fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Tak bisa membuat soket: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Famili tak dikenal dinyatakan" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Protokol tak dikenal dinyatakan" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "tak bisa mendapat alamat lokal: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "tak bisa mendapat alamat jauh: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "tak bisa mendengarkan: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Galat saat mengikat ke alamat: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Galat saat bergabung dengan grup multicast: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Galat saat meninggalkan grup multicast: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Tak ada dukungan bagi multicast spesifik sumber" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Galat saat menerima sambungan: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Penyambungan tengah berlangsung" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Tak bisa mendapat kesalahan yang tertunda: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Galat saat menerima data: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Galat saat mengirim data: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Tak bisa mematikan soket: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Galat saat menutup soket: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Menunggu kondisi soket: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Galat saat menerima pesan: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage tak didukung pada Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Galat saat menerima pesan: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials tidak diimplementasikan untuk OS ini" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Tak bisa menyambung ke server proxi %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Tak bisa menyambung ke %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Tak bisa menyambung: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Galat tak dikenal saat hubungan" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proksi melalui koneksi bukan TCP tidak didukung." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokol proksi '%s' tidak didukung." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Pendengar telah ditutup" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Soket yang ditambahkan tertutup" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 tidak mendukung alamat IPv6 '%s'" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Nama pengguna terlalu panjang bagi protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Nama host '%s' terlalu panjang untuk protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Server bukan server proksi SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Koneksi melalui server SOCKSv4 ditolak" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Server bukan server proksi SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Proksi SOCKv5 memerlukan otentikasi." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 memerlukan metoda otentikasi yang tidak didukung oleh GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Nama pengguna atau kata sandi terlalu panjang bagi protokol SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "Otentikasi SOCKSv5 gagal karena nama pengguna atau kata sandi salah." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Nama host '%s' terlalu panjang untuk protokol SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Server proksi SOCKSv5 memakai jenis alamat yang tidak dikenal." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Galat internal server proksi SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Koneksi SOCKSv5 tidak diijinkan oleh ruleset." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host tidak dapat dijangkau melalui server SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Jaringan tidak dapat dijangkau melalui proksi SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Koneksi melalui proksi SOCKSv5 ditolak." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Proksi SOCKSv5 tidak mendukung perintah 'connect'." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Proksi SOCSKv5 tidak mendukung jenis alamat yang diberikan." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Galat tak dikenal pada proksi SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Tak bisa menangani pengkodean versi %d dari GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Tak bisa mendekripsi kunci privat terenkode-PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Tak ditemukan sertifikat terenkode-PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Tak bisa mengurai kunci privat terenkode-PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Tak ditemukan sertifika terenkode-PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Tak bisa mengurai sertifikat terenkode-PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ini adalah kesempatan terakhir untuk memasukkan sandi secara benar sebelum " +"akses Anda diblokir." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Beberapa sandi yang dimasukkan salah, dan akses Anda akan diblokir setelah " +"gagal lagi." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Sandi yang dimasukkan salah." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Mengharapkan 1 pesan kendali, memperoleh %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Tipe yang tak diharapkan dari data ancillary" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Mengharapkan satu fd, tapi mendapat %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Menerima fd yang tak valid" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Galat saat mengirim kredensial: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Galat ketika memeriksa apakah SO_PASSCRED diaktifkan bagi soket: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Panjang opsi yang tak diduga ketika memeriksa apakah SO_PASSCRED diaktifkan " +"bagi soket. Berharap %d byte, mendapat %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Galat saat mengaktifkan SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Berharap membaca byte tunggal untuk penerimaan kredensial tapi membaca nol " +"byte" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Tak mengharapkan pesan kendali, tapi memperoleh %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Galat ketika mematikan SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Galat saat membaca dari descriptor berkas: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Galat saat menutup descriptor berkas: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Akar sistem berkas" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Galat saat menulis ke descriptor berkas: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Alamat soket domain UNIX abstrak tak didukung pada sistem ini" + +#: ../gio/gvolume.c:436 +msgid "volume doesn't implement eject" +msgstr "volume tak mengimplementasi eject" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gvolume.c:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume tak mengimplementasi eject atau eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Tak bisa menemukan aplikasi" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Galat saat meluncurkan aplikasi: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI tak didukung" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "perubahan asosiasi tak didukung pada win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Pembuatan asosiasi tak didukung pada win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Galat saat membaca dari handle: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Galat saat menutup handle: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Galat saat menulis ke handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Tidak cukup memori" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Galat internal: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Perlu masukan lagi" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Data terkompresi tak valid" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Alamat tempat mendengarkan" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Diabaikan, bagi kompatibilitas dengan GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Cetak alamat" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Cetak alamat dalam mode shell" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Jalankan layanan dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Arg salah\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atribut '%s' yang tak diduga bagi elemen '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atribut '%s' dari elemen '%s' tak ditemukan" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag '%s' yang tak diduga, diharapkan tag '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag '%s' yang tak diduga di dalam '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Tak ditemukan penanda buku yang valid di direktori data" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Penanda buku bagi URI '%s' telah ada" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Tak ditemukan penanda buku bagi URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Tipe MIME tak didefinisikan pada penanda buku bagi URI '%s'" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Flag privat tak didefinisikan di penanda buku bagi URI '%s'" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Grup tak ditata di penanda buku bagi URI '%s'" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Tak ada aplikasi dengan nama '%s' mendaftarkan penanda buku bagi '%s'" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Gagal mengembangkan baris eksekusi '%s' dengan URI '%s'" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Rangkaian karakter sebagian pada akhir input" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Tidak dapat mengkonversi, kembalikan '%s' ke gugus kode '%s'" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI berkas lokal '%s' tak boleh memuat '#'" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' tidak sah" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Nama host URI '%s' tidak sah" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' berisi karakter escape yang salah" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nama lokasi '%s' bukan lokasi absolut" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Nama host salah" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %r %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Januari" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februari" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Maret" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agustus" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Desember" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ags" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Des" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Senin" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Selasa" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Rabu" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Kamis" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Jumat" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sabtu" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Minggu" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Sen" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Sel" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Rab" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Kam" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Jum" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sab" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Min" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Galat ketika membuka direktori '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Tidak dapat mengalokasikan %lu byte untuk membaca berkas \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Galat ketika membaca berkas '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Berkas \"%s\" terlalu besar" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gagal membaca dari berkas '%s': %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gagal membuka berkas '%s': %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Gagal saat mengambil atribut berkas '%s': fstat() gagal: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Gagal saat membuka berkas '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Gagal untuk mengubah nama berkas '%s' menjadi '%s': g_rename() gagal: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Gagal membuat berkas '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Gagal untuk membuka berkas '%s' untuk menulis: fdopen() gagal: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Gagal untuk menulis berkas '%s': fwrite() gagal: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Gagal untuk menulis berkas '%s': fflush() gagal: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Gagal untuk menulis berkas '%s': fsync() gagal: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Gagal untuk menutup berkas '%s': fclose() gagal: '%s'" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Berkas '%s' tidak dapat dibuang: g_unlink() gagal: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Palet '%s' tidak sah, seharusnya tidak mengandung '%s'" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Palet '%s' tidak memuat XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Gagal saat membaca taut simbolik '%s': %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Taut simbolik tidak didukung" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Tidak dapat melakukan proses baca mentah di g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Ada data tersisa yang belum dikonversi pada penyangga read" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanal terputus pada karakter sebagian" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Tidak dapat melakukan proses baca mentah di g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "Berkas kunci yang valid tak ditemukan pada direktori yang dicari" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "Bukan berkas biasa" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Berkas kunci berisi baris '%s' yang bukan pasangan nilai kunci, kelompok " +"atau komentar" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nama grup tak valid: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Berkas kunci tidak mulai dengan sebuah kelompok" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nama kunci tak valid: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Berkas kunci mengadung encoding yang tidak didukung '%s'" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Berkas kunci tidak memiliki kelompok '%s'" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Berkas kunci tidak memiliki kunci '%s'" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Berkas kunci mengandung kunci '%s' dengan nilai '%s' yang bukan UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Berkas kunci mengandung kunci '%s' yang nilainya tidak dapat diterjemahkan." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Berkas kunci mengandung kunci '%s' dalam kelompok '%s' yang memiliki nilai " +"yang tidak dapat diterjemahkan." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Kunci '%s' dalam grup '%s' bernilai '%s' padahal diharapkan %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Berkas kunci tidak memiliki kunci '%s' pada kelompok '%s'" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "Berkas kunci mengandung karakter escape pada akhir baris" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Berkas kunci berisi '%s'" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai sebuah nomor." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Nilai integer '%s' di luar jangkauan" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai angka pecahan." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nilai '%s' tidak dapat diterjemahkan sebagai suatu nilai boolean." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Gagal mengambil atribut berkas '%s%s%s%s': fstat() gagal: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Gagal memetakan %s%s%s%s: mmap() gagal: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Gagal saat membuka berkas '%s': open() gagal: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Galat pada baris %d karakter ke-%d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Teks UTF-8 dalam nama tak valid - bukan '%s' yang valid" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' bukan suatu nama yang valid " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' bukan suatu nama yang valid: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Galat pada baris ke-%d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"Referensi karakter '%-.*s' tidak mengencodekan karakter yang diperbolehkan" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Ada entitas '&;' yang kosong; Entitas yang benar antara lain adalah: & " +"" < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nama entitas '%-.*s' tak dikenal" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumen harus dimulai dengan elemen (misalnya )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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 elemen " +"kosong '%s'" + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumen kosong atau berisi whitespace saja" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Dokumen terpotong tidak sempurna sesaat setelah membuka kurung siku '<'" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumen terpotong tidak sempurna pada dalam nama elemen" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumen terpotong tidak sempurna di dalam nama atribut" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumen terpotong tidak sempurna di dalam tag pembukaan elemen." + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumen tidak sempura saat ada dalam nilai atribut" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumen terpotong tidak sempurna di dalam keterangan atau instruksi " +"pemrosesan" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Penggunaan:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPSI...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opsi Bantuan:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Menampilkan opsi bantuan" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Menampilkan semua opsi bantuan" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opsi Aplikasi:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Tidak dapat menguraikan nilai integer '%s' untuk %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Nilai integer '%s' untuk %s di luar jangkauan" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Tidak dapat mengurai nilai ganda '%s' untuk %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Nilai double '%s' untuk %s di luar jangkauan" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Galat saat mengurai opsi %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumen untuk %s tidak lengkap" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Pilihan tidak diketahui %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objek rusak" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "kesalahan internal atau objek rusak" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "kehabisan memori" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "batas pelacakan balik tercapai" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "pola memuat butir yang tak didukung bagi pencocokan sebagian" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "acuan balik sebagai persyaratan tak didukung bagi pencocokan sebagian" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "batas rekursi dicapai" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "kombinasi bendera baris baru yang tak valid" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "nilai offset salah" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 pendek" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "pengulangan rekursi" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "galat tak dikenal" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ di akhir pola" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c di akhir pola" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "karakter tak dikenal setelah \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "angka tak urut di quantifier {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "angka terlalu besar di quantifier {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "pengakhiran ] hilang bagi kelas karakter" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "rangkaian escape tak valid dalam kelas karakter" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "jangkauan tak terurut dalam kelas karakter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "tak ada yang dapat diulang" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "pengulangan yang tak diharapkan" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "karakter tak dikenal setelah (? atau (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "kelas POSIX yang bernama hanya didukung di dalam suatu kelas" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "pengakhiran ) hilang" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "acuan ke sub pola yang tak ada" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "tak ada ) setelah komentar" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "ekspresi reguler terlalu besar" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "gagal memperoleh memori" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") tanpa pembuka (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "kode tumpah (overflow)" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "karakter tak dikenal setelah (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "panjang asersi lookbehind tak tetap" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "angka atau nama salah bentuk setelah (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "grup bersyarat mengandung lebih dari dua cabang" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "berharap asersi setelah (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R atau (?[+-]digit mesti diikuti oleh )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nama kelas POSIX tak dikenal" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "elemen kolasi POSIX tak didukung" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "nilai karakter dalam urutan \\x{...} terlalu besar" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "kondisi tak valid (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C tak diijinkan di asersi lookbehind" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escape \\L, \\l, \\N{name}, \\U, dan \\u tak didukung" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "pemanggilan rekursif bisa berulang tak terhingga" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "karakter tak dikenal setelah (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "terminator di nama sub pola hilang" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dua sub pola yang bernama memiliki nama sama" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "urutan \\P atau \\p salah bentuk" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nama properti tak dikenal setelah \\P atau \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nama sub pola terlalu panjang (maksimum 32 karakter)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "terlalu banyak sub pola yang dinamai (maksimum 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "nilai oktal lebih dari \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "menimpa ruang kerja kompilasi" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "sub pola yang diacu yang sebelumnya diperiksa tak ditemukan" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "grup DEFINE mengandung lebih dari satu cabang" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opsi NEWLINE tak konsisten" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g tak diikuti oleh bilangan atau nama dalam tanda kutip, kurung siku, atau " +"kurung kurawal, atau bilangan polos" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "acuan bernomor tak boleh nol" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "argumen tak diijinkan bagi (*ACCEPT), (*FAIL), atau (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) tak dikenal" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "angka terlalu besar" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "kurang nama sub pola setelah (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "diharapkan digit setelah (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] adalah karakter data tak valid dalam mode kompatibilitas JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "nama-nama berbeda bagi sub pola dari bilangan yang sama tak diijinkan" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) mesti punya argumen" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c mesti diikuti oleh sebuah karakter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k tak diikuti oleh nama yang diapit tanda kutip, kurung siku, atau kurung " +"kurawal" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N tak didukung dalam suatu kelas" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "terlalu banyak acuan maju" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nama terlalu panjang dalam (*MARK), (*PRUNE), (*SKIP), atau (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "nilai karakter dalam urutan \\u.... terlalu besar" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Galat saat mencocokkan ekspresi reguler %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Pustaka PCRE dikompail tanpa dukungan UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Pustaka PCRE dikompail tanpa dukungan properti UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Pustaka PCRE dikompail dengan opsi yang tak kompatibel" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Galat saat mengkompail ekspresi reguler %s pada karakter %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Galat saat mengoptimasi ekspresi reguler %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "digit heksadesimal atau '}' diharapkan" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "digit heksadesimal diharapkan" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "kehilangan '<' di acuan simbolis" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "acuan simbolis yang belum selesai" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "acuan simbolis dengan panjang nol" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "diharapkan digit" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "acuan simbolis yang tak legal" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "'\\' akhir yang tercecer" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "urutan escape tak dikenal" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Galat saat mengurai teks penggani \"%s\" pada karakter %lu: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teks yang dikutip tidak dimulai dengan tanda kutip" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksnya kosong (atau hanya berisi whitespace)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gagal saat membaca data dari proses child (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Terjadi galat pada fungsi select() ketika membaca data dari anak proses (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Terjadi galat pada fungsi waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Proses anak keluar dengan kode %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Proses anak dimatikan oleh sinyal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Proses anak dihentikan oleh sinyal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Proses anak keluar secara tak normal" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gagal saat membaca dari pipe child (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gagal saat fork (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gagal saat mengganti direktori ke '%s' (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gagal saat menjalankan proses child '%s' (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gagal saat fork proses child (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Terjadi galat ketika mengeksekusi anak proses \"%s\"" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Gagal untuk membaca data dari proses child" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gagal saat menjalankan proses child (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nama program salah: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "String tidak benar pada variabel lingkungan: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Direktori aktif salah: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gagal saat menjalankan program bantuan (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Terjadi galat pada g_io_channel_win32_poll() ketika membaca data dari anak " +"proses" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Karakter di luar jangkauan UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Rangkaian input konversi salah" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Karakter di luar jangkauan UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bita" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bita" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/is.po b/po/is.po new file mode 100644 index 0000000..1acdcc0 --- /dev/null +++ b/po/is.po @@ -0,0 +1,3808 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2003-08-18 18:05+0000\n" +"Last-Translator: Richard Allen \n" +"Language-Team: is \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, 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:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Gat ekki opnað umbreyti úr '%s' í '%s': %s" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Ókláruð stafaruna í enda ílags" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Gat ekki umbreytt '%s' í stafatöflu '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Skráar-URI '%s' má ekki innihalda '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' er ógilt" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Vélarheitið í URI '%s' er ógilt" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' inniheldur ógild sértákn" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Slóðin '%s' er ekki full slóð" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Ógilt vélarheiti" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "fh" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "eh" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e.%b %Y, %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%a %e.%b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "janúar" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "febrúar" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "mars" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "apríl" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "maí" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "júní" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "júlí" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maí" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jún" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "júl" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "mánudagur" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "þriðjudagur" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "miðvikudagur" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "fimmtudagur" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "föstudagur" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "laugardagur" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "sunnudagur" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "mán" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "þri" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mið" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "fim" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "fös" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "lau" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "sun" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gat ekki lesið úr skránni '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gat ekki opnað skrána '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Sniðmátið '%s' endar ekki á XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Villa á línu %d tákn %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Ógildur UTF-8 þýddur texti" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Villa á línu %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tómt viðfang '&;' fannst; gild viðföng eru: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Viðfangið '%s' er óþekkt" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Skjalið verður að byrja á viðfangi (t.d. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Skjalið var tómt eða innihélt einungis orðabil" + +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Skjalið endar óvænt inn í heiti mengis" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Skjalið endar óvænt inn í heiti eiginleika" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Skjalið endar óvænt inn í tagi sem opnar mengi." + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Skjalið endar óvænt inn í gildi eiginleika" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Rásin endar á hluta úr tákni" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Hálfkláruð tákntilvísun" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Hálfkláruð tákntilvísun" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Hálfkláruð tákntilvísun" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Hálfkláruð viðfangatilvísun" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tilvísunin byrjar ekki á spurningarmerki" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +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:282 +msgid "Failed to read data from child process" +msgstr "Gat ekki lesið gögn frá undirferli" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gat ekki lesið úr undirferlispípu (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gat ekki farið í möppuna '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gat ekki keyrt undirferli (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Ógilt vélarheiti" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Ógild runa í ílagi umbreytingar" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gat ekki keyrt hjálparforrit" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gat ekki lesið gögn frá undirferli (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Óvæn villa í waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gat ekki ræst (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gat ekki ræst undirferli \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gat ekki ræst undirferli (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Óþekkt villa við keyrslu undirferlis \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Táknið er utan UTF-8 sviðsins" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Ógild runa í ílagi umbreytingar" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Táknið er utan UTF-16 sviðsins" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Villa við umbreytingu: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Ógilt vélarheiti" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Ógilt vélarheiti" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' inniheldur ógild sértákn" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ógild bætaruna í ílagi umbreytingar" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Villa á línu %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Táknið '%s' er ekki gilt í heitum viðfanga" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Táknið '%s' er ekki gilt í heitum viðfanga" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Táknið '%s' er ekki gilt í heitum viðfanga" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Ógilt vélarheiti" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Ógilt vélarheiti" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "gat ekki lesið tákntengið '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Skjalið endar óvænt inn í heiti eiginleika" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Villa við að opna möppuna '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Villa á línu %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Ógilt vélarheiti" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, 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:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "gat ekki búið til skrána '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Tákntengi eru ekki studd" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Villa á línu %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Villa við umbreytingu: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Tákntengi eru ekki studd" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Villa við lestur skráarinnar '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/it.po new file mode 100644 index 0000000..ca4f57b --- /dev/null +++ b/po/it.po @@ -0,0 +1,4547 @@ +# Italian translation for glib. +# This file is distributed under the same license as glib package +# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Christopher R. Gabriel 2002. +# +# 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) +# Luca Ferretti , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. +# Milo Casagrande , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.29.x\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-05 19:05+0100\n" +"PO-Revision-Date: 2013-02-05 19:21+0100\n" +"Last-Translator: Milo Casagrande \n" +"Language-Team: Italian \n" +"Language: it\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" + +# count (gssize) è un parametro delle funzione +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valore count troppo grande passato a %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Posizionamento non supportato sullo stream di base" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Impossibile troncare GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Lo stream è già chiuso" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Troncamento non supportato sullo stream di base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "L'operazione è stata annullata" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Oggetto non valido, non inizializzato" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Sequenza multi-byte non valida in ingresso" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Spazio non sufficiente nella destinazione" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Sequenza di byte non valida nell'ingresso per la conversione" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Errore durante la conversione: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Inizializzazione annullabile non supportata" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Impossibile aprire il convertitore da \"%s\" a \"%s\"" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "Tipo %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipo sconosciuto" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "Tipo di file %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials non è implementato su questo S.O." + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Non c'è alcun supporto a GCredentials per la piattaforma in uso" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials non contiene un ID di processo su questo S.O." + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "End-of-stream prematuro inatteso" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "La chiave \"%s\" non è valida nella voce indirizzo \"%s\"" + +# Come chiarito in un messaggio seguente, path, tmpdir e abstract sono nomi chi chiavi (NdT) +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"L'indirizzo \"%s\" non è valido (necessario esattamente una tra le chiavi " +"path, tmpdir o abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Combinazione coppia chiave/valore senza significato nella voce indirizzo \"%s" +"\"" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Errore nell'indirizzo \"%s\" - l'attributo port è malformato" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Errore nell'indirizzo \"%s\" - l'attributo family è malformato" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "L'elemento indirizzo \"%s\" non contiene due punti (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"La coppia chiave/valore %d, \"%s\", nell'elemento indirizzo \"%s\", non " +"contiene un segno di uguale" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Errore nell'eseguire l'unescaping sulla chiave o sul valore nella coppia " +"chiave/valore %d, \"%s\", nell'elemento di indirizzo \"%s\"" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Errore nell'indirizzo \"%s\" -- il trasporto unix richiede espressamente " +"l'impostazione di una tra le chiavi \"path\" o \"abstract\"" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Errore nell'indirizzo \"%s\" - l'attributo host manca oppure è malformato" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Errore nell'indirizzo \"%s\" - l'attributo port manca oppure è malformato" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Errore nell'indirizzo \"%s\" - l'attributo noncefile manca oppure è " +"malformato" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Errore nell'avvio automatico: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Trasporto \"%s\" sconosciuto o non supportato per l'indirizzo \"%s\"" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Errore nell'aprire il file nonce «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Errore nel leggere dal file nonce \"%s\": %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Errore nel leggere dal file nonce \"%s\": attesi 16 byte, ottenuti %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Errore nello scrivere i contenuti del file nonce \"%s\" sullo stream:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "L'indirizzo fornito è vuoto" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Impossibile eseguire lo spawn di un bus di messaggi quando in setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Impossibile eseguire lo spawn di un bus di messaggi senza un machine-id:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Errore nell'eseguire lo spawn della riga di comando \"%s\":" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(digitare un carattere qualsiasi per chiudere questa finestra)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "dbus di sessione non in esecuzione e autolaunch non riuscito" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Impossibile determinare l'indirizzo del bus di sessione (non implementato " +"per questo S.O.)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Impossibile determinare l'indirizzo del bus dalla variabile d'ambiente " +"DBUS_STARTER_BUS_TYPE - valore \"%s\" sconosciuto" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Impossibile determinare l'indirizzo del bus poiché la variabile d'ambiente " +"DBUS_STARTER_BUS_TYPE non è impostata" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipo di bus %d sconosciuto" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Assenza di contenuto inattesa nel tentativo di leggere una riga" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Assenza di contenuto inattesa nel tentativo di leggere (in modo sicuro) una " +"riga" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Esauriti tutti i meccanismi di autenticazione disponibili (provati: %s) " +"(disponibili: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Annullato attraverso GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Errore nell'ottenere informazioni per la directory \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"I permessi sulla directory \"%s\" sono malformati. Attesa la modalità 0700, " +"ottenuta 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Errore nel creare la directory \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Errore nell'aprire il portachiavi \"%s\" in lettura: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "La riga %d del portachiavi su \"%s\" con contenuto \"%s\" è malformata" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Il primo token della riga %d del portachiavi su \"%s\" con contenuto \"%s\" " +"è malformato" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Il secondo token della riga %d del portachiavi su \"%s\" con contenuto \"%s" +"\" è malformato" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Non è stato trovato il cookie con ID %d nel portachiavi su \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Errore nell'eliminare il file lock stale \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Errore nel creare il file lock \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Errore nel chiudere (unlinked) il file lock \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Errore nell'eseguire l'unlink del file lock \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Errore nell'aprire il portachiavi \"%s\" in scrittura: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(inoltre non è riuscito il rilascio del lock per \"%s\": %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "La connessione è chiusa" + +# Sarebbe anche "il tempo è scaduto", ma non so +# se la forma in cui l'hanno messo ha un particolare +# senso, per cui la mantengo assieme a timeout +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "È stato raggiunto il timeout" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Incontrate flag non supportate durante la costruzione di una connessione " +"client-side" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Interfaccia \"org.freedesktop.DBus.Properties\" inesistente sull'oggetto nel " +"percorso %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Errore nell'impostare la proprietà \"%s\": atteso il tipo \"%s\", ottenuto " +"\"%s\"" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Proprietà \"%s\" inesistente" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "La proprietà \"%s\" non è leggibile" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "La proprietà \"%s\" non è scrivibile" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Interfaccia \"%s\" inesistente" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Interfaccia inesistente" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Interfaccia \"%s\" inesistente sull'oggetto nel percorso %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Metodo \"%s\" inesistente" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Il tipo di messaggio (%s) non corrisponde al tipo atteso (%s)" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Risulta già esportato un oggetto per l'interfaccia %s su %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Il metodo \"%s\" ha restituito il tipo \"%s, ma era atteso \"%s\"" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Il metodo \"%s\" sull'interfaccia \"%s\" con firma \"%s\" non esiste" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Un sottoalbero per %s è già esportato" + +# suppongo INVALID sia parola chiave +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "il tipo è INVALID" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "messaggio METHOD_CALL: manca il campo header PATH o MEMBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "messaggio METHOD_RETURN: manca il campo header REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "messaggio ERROR: manca il campo header REPLY_SERIAL o ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "messaggio SIGNAL: manca il campo header PATH, INTERFACE o MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"messaggio SIGNAL: il campo header PATH sta usando il valore riservato /org/" +"freedestkop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"messaggio SIGNAL: il campo header INTERFACE sta usando il valore riservato " +"org.freedestkop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Si voleva leggere %lu byte, ma ne sono stati ottenuti %lu" +msgstr[1] "Si volevano leggere %lu byte, ma ne sono stati ottenuti %lu" + +# FIXME? plurale? +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Atteso byte NUL dopo la stringa \"%s\" ma trovato %d byte" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Attesa stringa UTF-8 valida, ma trovati byte non validi a %d byte di offset " +"(la lunghezza della stringa è %d). La stringa UTF-8 valida fino a quel punto " +"era \"%s\"" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Il valore \"%s\" analizzato non è un percorso oggetto D-Bus valido" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Il valore \"%s\" analizzato non è una firma D-Bus valida" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Incontrato un array lungo %u byte. La lunghezza massima è 2<<26 byte (64 " +"MiB). " +msgstr[1] "" +"Incontrato un array lungo %u byte. La lunghezza massima è 2<<26 byte (64 " +"MiB). " + +# VARIANT è uno dei container type di D-Bus +# anche signature sono cose specifiche del protocollo +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Il valore \"%s\" analizzato per il variant non è una signature D-Bus valida" + +# eeeehh????? +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Errore nel deserializzare il GVariant con la stringa di tipo \"%s\" dal " +"formato wire D-Bus" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valore endianness non valido. Atteso 0x6c (\"l\") o 0x42 (\"B\"), trovato " +"invece il valore 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versione major del protocollo non valida. Atteso 1, ma trovato %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Trovata signature header con signature \"%s\", ma il corpo del messaggio è " +"vuoto" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Il valore \"%s\" analizzato non è una signature D-Bus valida (per il corpo)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Nessun signature header nel messaggio, ma il corpo del messaggio è di %u byte" +msgstr[1] "" +"Nessun signature header nel messaggio, ma il corpo del messaggio è di %u byte" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Impossibile deserializzare il messaggio: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Errore nel serializzare il GVariant con la stringa di tipo \"%s\" al formato " +"wire D-Bus" + +# fds == plurale per file descriptor (I suppose) +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Il messaggio presentava %d file descriptor, ma il campo header indica %d " +"file descriptor" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Impossibile serializzare il messaggio: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Il corpo del messaggio presenta la signature \"%s\", ma non c'è alcun " +"signature header" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Il corpo del messaggio presenta la signature \"%s\", ma la signature nel " +"campo header è \"%s\"" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Il corpo del messaggio è vuoto, ma la signature nel campo header è \"(%s)\"" + +# non mi convincono "di ritorno" e "corpo" +# ma altrove corpo non ci stava male +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Errore di ritorno con corpo di tipo \"%s\"" + +# come sopra +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Errore di ritorno con corpo vuoto" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Impossibile ottenere profilo hardware: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Impossibile caricare /var/lib/dbus/machine-id o /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Errore nel chiamare StartServiceByName per %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Risposta %d inattesa dal metodo StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Impossibile invocare il metodo; il proxy è per un nome well-known senza un " +"owner e il proxy è stato costruito con il flag " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "Spazio nomi astratti non supportato" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "Impossibile specificare il file nonce quando si crea un server" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Errore nello scrivere il file nonce su \"%s\": %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "La stringa \"%s\" non è un GUID D-Bus valido" + +# anche transport sono cose specifiche di D-Bus +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Impossibile ascoltare sul transport \"%s\" non supportato" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMANDO" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Comandi:\n" +" help Mostra queste informazioni\n" +" introspect Introspezione di un oggetto remoto\n" +" monitor Monitoraggio di un oggetto remoto\n" +" call Invoca di un metodo su un oggetto remoto\n" +" emit Emette un segnale\n" +"\n" +"Usare \"%s COMANDO --help\" per informazioni su ciascun comando.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Errore: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Errore nell'analizzare XML introspection: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Connette al bus di sistema" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Connette al bus di sessione" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Connette all'indirizzo D-Bus fornito" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Opzioni endpoint connessione:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Opzioni per specificare gli endpoint di connessione" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nessun endpoint di connessione specificato" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Specificati endpoint di connessione multipli" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Attenzione: secondo dati di introspezione, l'interfaccia \"%s\" non esiste\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Attenzione: in accordo ai dati di introspezione, il metodo \"%s\" non esiste " +"sull'interfaccia \"%s\"\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Destinazione opzionale per il segnale (nome univoco)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Percorso oggetto su cui emettere il segnale" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Segnale e nome dell'interfaccia" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emette un segnale." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Errore nel connettersi: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Errore: non è specificato il percorso dell'oggetto.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Errore: \"%s\" non è un percorso di oggetto valido\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Errore: segnale non specificato.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Errore: il segnale deve essere il nome fully-qualified.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Errore: \"%s\" non è un nome di interfaccia valido\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Errore: \"%s\" non è un nome di membro valido\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Errore: \"%s\" non è un nome di bus univoco valido.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Errore nell'analizzare il parametro %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Errore nell'eseguire il flush della connessione: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Nome della destinazione su cui invocare il metodo" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Percorso dell'oggetto su cui invocare il metodo" + +# oppure "Nome del metodo e dell'interfaccia" ??? +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Metodo e nome dell'interfaccia" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Timeout in secondi" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Invoca un metodo su un oggetto remoto." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Errore: non è specificata la destinazione\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Errore: non è specificato il percorso dell'oggetto\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Errore: non è specificato il nome del metodo\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Errore: il nome di metodo \"%s\" non è valido\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Errore nell'analizzare il parametro %d di tipo \"%s\": %s\n" + +# predicato > sostantivo per introspezione, direi che funziona +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Nome destinazione per l'introspezione" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Percorso oggetto per l'introspezione" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Stampa XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Figli introspezione" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Stampa solo le proprietà" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Esegue l'introspezione su un oggetto remoto." + +# predicato > sostantivo per monitor, direi che funziona +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Nome destinazione per il monitoraggio" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Percorso oggetto per il monitoraggio" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Esegue il monitoraggio su un oggetto remoto." + +# NdT: nome di applicazione (quando manca) +#: ../gio/gdesktopappinfo.c:594 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Senza nome" + +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "Il file .desktop non specifica il campo Exec" + +#: ../gio/gdesktopappinfo.c:1295 +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:1597 +#, 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:1601 +#, 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:1841 ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "Manca un identificatore nelle informazioni dell'applicazione" + +#: ../gio/gdesktopappinfo.c:2097 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Impossibile creare il file .desktop utente %s" + +#: ../gio/gdesktopappinfo.c:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Definizione personalizzata per %s" + +#: ../gio/gdrive.c:394 +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:472 +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:548 +msgid "drive doesn't implement polling for media" +msgstr "l'unità non implementa il controllo sistematico dei supporti" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "l'unità non implementa l'azione start" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "l'unità non implementa l'azione stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Non è disponibile il supporto a TLS" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Impossibile gestire la versione %d della codifica GEmblem" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Numero di token malformato (%d) nella codifica GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Impossibile gestire la versione %d della codifica GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Numero di token malformato (%d) nella codifica GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Atteso un GEmblem per GEmblemedIcon" + +#: ../gio/gfile.c:917 ../gio/gfile.c:1156 ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 ../gio/gfile.c:1590 ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 ../gio/gfile.c:1789 ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 ../gio/gfile.c:3468 ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 ../gio/gfile.c:3711 ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 ../gio/gfile.c:4610 ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 ../gio/gfile.c:4884 ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 ../gio/gfile.c:5536 ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 ../gio/gfile.c:7225 ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "L'oggetto mount contenuto non esiste" + +#: ../gio/gfile.c:2474 ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Impossibile copiare sopra la directory" + +#: ../gio/gfile.c:2534 +msgid "Can't copy directory over directory" +msgstr "Impossibile copiare la directory sopra la directory" + +#: ../gio/gfile.c:2542 ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "Il file destinazione esiste" + +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Impossibile copiare la directory ricorsivamente" + +# see man splice(2) :) +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Splice non supportato" + +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Errore nell'eseguire lo splice del file: %s" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Copia (reflink/clone) tra oggetti mount non supportato" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Copia (reflink/clone) non supportato o non valido" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Copia (reflink/clone) non supportato o non ha funzionato" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Impossibile copiare il file speciale" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "Fornito valore di collegamento simbolico non valido" + +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "Cestino non supportato" + +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "I nomi di file non possono contenere '%c'" + +#: ../gio/gfile.c:6258 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "il volume non implementa l'azione mount" + +#: ../gio/gfile.c:6367 +msgid "No application is registered as handling this file" +msgstr "Non risulta registrata alcuna applicazione per gestire questo file" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "L'enumeratore è chiuso" + +# una sola ???? +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "L'enumeratore di file presenta un'operazione in sospeso" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Lo stream non supporta query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Posizionamento non supportato sullo stream" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Troncamento non consentito sullo stream di input" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Troncamento non supportato sullo stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Numero di token errato (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Nessun tipo per il nome di classe %s" + +#: ../gio/gicon.c:314 +#, 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:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Il tipo %s non presenta una classe" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Numero di versione malformato: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Impossibile gestire la versione fornita della codifica di icona" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nessun indirizzo specificato" + +# eh... miglorabile? +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "La lunghezza %u è troppo lunga per l'indirizzo" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "L'indirizzo presenta bit impostati oltre la lunghezza del prefisso" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Impossibile analizzare \"%s\" come maschera di indirizzo IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Spazio non sufficiente per l'indirizzo del socket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Indirizzo del socket non supportato" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Lo stream presenta un'operazione in sospeso" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elemento <%s> non ammesso dentro <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elemento <%s> non ammesso come primo livello" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Il file %s appare diverse volte nella risorsa" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Localizzazione di \"%s\" non riuscita in alcuna directory sorgente" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Localizzazione di \"%s\" non riuscita nella directory corrente" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Opzione di processing \"%s\" sconosciuta" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Creazione del file temporaneo non riuscita: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Errore nell'elaborare il file di input con xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Errore nell'elaborare il file di input con to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Errore nel leggere il file %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Errore nel comprimere il file %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "il testo non può apparire all'interno di <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "nome del file di output" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Le directory da cui leggere i file (come predefinita la directory corrente)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Genera l'output nel formato selezionato in base all'estensione del nome di " +"file della destinazione" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Genera header sorgente" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Genera codice sorgente usato per collegare il file risorsa all'interno del " +"codice" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Genera elenco delle dipendenze" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Non crea e registra automaticamente la risorsa" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Non esporta le funzioni, le dichiara G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Nome identificatore C usato per il codice sorgente generato" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compila una specifica di risorsa in un file risorsa.\n" +"I file di specifica di risorsa hanno estensione .gresource.xml\n" +"e i file risorsa hanno estensione .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "È necessario indicare esattamente un nome di file\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "non sono permessi nomi vuoti" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"nome \"%s\" non valido: i nomi devono cominciare con una lettera minuscola" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nome \"%s\" non valido: carattere '%c' non valido; sono permessi sono " +"lettere minuscole, numeri e trattino ('-')." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"nome \"%s\" non valido: non sono permessi due trattini consecutivi ('--')." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"nome \"%s\" non valido: l'ultimo carattere non può essere un trattino ('-')." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nome \"%s\" non valido: la lunghezza massima è 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " già specificato" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "impossibile aggiungere chiavi a uno schema \"list-of\"" + +# maschile, inteso come elemento +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " già specificato" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" esegue lo shadow di in ; " +"usare per modificare il valore" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"è necessario specificare come un attributo per solo uno tra \"type\", " +"\"enum\" o \"flags\"" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> non (ancora) definito." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "stringa tipo GVariant \"%s\" non valida" + +# direi che la doppia negazione qui possiamo lasciarla +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " indicato, ma lo schema non sta estendendo nulla" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "nessun da scavalcare" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " già specificato" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " già specificato" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " estende lo schema \"%s\" non ancora esistente" + +# o esistenti?? +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " è un elenco di schema \"%s\" non ancora esistente" + +# diciamocelo, gira roba forte... +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Non può essere un elenco di uno schema con un percorso" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Non può estendere uno schema con un percorso" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" è un elenco, che estende che non è un " +"elenco" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" estende , ma \"%s" +"\" non estende \"%s\"" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "un percorso, se fornito, deve iniziare e terminare con uno slash" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "il percorso di una list deve terminare con \":/\"" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> già specificato" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elemento <%s> non ammesso come primo livello" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "è stato specificato --strict, uscita\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Questo intero file è stato ignorato.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorato questo file.\n" + +# override... +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nessuna chiave \"%s\" nello schema \"%s\" come specificato nel file di " +"override \"%s\"" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorato lo scavalcamento per questa chiave.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ed è stato specificato --strict; uscita.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"errore nell'analizzare la chiave \"%s\" nello schema \"%s\" come specificato " +"nel file di override \"%s\": %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorato l'override per questa chiave.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"l'override per la chiave \"%s\" nello schema \"%s\" nel file di override \"%s" +"\" è fuori dall'intervallo indicato nello schema" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"l'override per la chiave \"%s\" nello schema \"%s\" nel file di override \"%s" +"\" non è nell'elenco delle scelte valide" + +# FIXME: le altre sono maiuscole +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "Dove memorizzare il file gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Interrompe l'esecuzione per ogni errore negli schemas" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Non scrive il file gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Non forza le limitazioni sui nomi di chiave" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compila tutti i file schema GSettings in una cache schema.\n" +"I file schema devo avere estensione .gschema.xml,\n" +"e il file cache è chiamato gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "È necessario indicare esattamente un nome di directory\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Nessun file schema trovato: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "nessuna azione.\n" + +# visto che se lo rimuovo esisto, proviamo con preesistente +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "rimosso il file di output preesistente.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "" +"Impossibile trovare il tipo di monitor predefinito per directory locali" + +#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome di file %s non valido" + +#: ../gio/glocalfile.c:974 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Errore nell'ottenere informazioni sul file system: %s" + +#: ../gio/glocalfile.c:1142 +msgid "Can't rename root directory" +msgstr "Impossibile rinominare la directory root" + +#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Errore nel rinominare il file: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Impossibile rinominare il file, il nome di file esiste già" + +#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "Nome di file non valido" + +#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Impossibile aprire la directory" + +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Errore nell'aprire il file: %s" + +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Errore nel rimuovere il file: %s" + +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Errore nel cestinare il file: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Impossibile creare la directory cestino \"%s\": %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Impossibile trovare la directory di livello superiore per il cestino" + +#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023 +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:2057 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Impossibile creare il file informazioni cestinamento: %s" + +#: ../gio/glocalfile.c:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Impossibile cestinare il file: %s" + +#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280 +msgid "internal error" +msgstr "errore interno" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Errore nel creare la directory: %s" + +#: ../gio/glocalfile.c:2234 +#, 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:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Errore nel creare il collegamento simbolico: %s" + +#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Errore nello spostare il file: %s" + +# ma che senso ha??? +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Impossibile spostare la directory sopra la directory" + +#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Creazione del file backup non riuscita" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Errore nel rimuovere il file destinazione: %s" + +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Spostamento tra oggetti mount non supportato" + +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "Il valore dell'attributo deve essere non-NULL" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo di attributo non valido (attesa stringa)" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Nome di attributo esteso non valido" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Errore nell'impostare l'attributo esteso \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (codifica non valida)" + +#: ../gio/glocalfileinfo.c:1740 ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Errore nel recuperare informazioni per il file «%s»: %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Errore nel recuperare informazioni per il descrittore di file: %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo di attributo non valido (atteso unit32)" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo di attributo non valido (atteso uint64)" + +#: ../gio/glocalfileinfo.c:2068 ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo di attributo non valido (attesa stringa di byte)" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Impossibile impostare i permessi sui collegamenti simbolici" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Errore nell'impostare i permessi: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Errore nell'impostare il proprietario: %s" + +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "il collegamento simbolico deve essere non-NULL" + +#: ../gio/glocalfileinfo.c:2222 ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Errore nell'impostare il collegamento simbolico: %s" + +#: ../gio/glocalfileinfo.c:2231 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Errore nell'impostare il collegamento simbolico: il file non è un " +"collegamento" + +#: ../gio/glocalfileinfo.c:2357 +#, 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:2380 +msgid "SELinux context must be non-NULL" +msgstr "il contesto SELinux deve essere non-NULL" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Errore nell'impostare il contesto SELinux: %s" + +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux non è abilitato su questo sistema" + +# %s è l'attributo +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Impostazione dell'attributo %s non supportata" + +#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Errore nel leggere dal file: %s" + +#: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Errore nel posizionarsi all'interno del file: %s" + +#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Errore nel chiudere il file: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Impossibile trovare il tipo di monitor predefinito per file locali" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Errore nello scrivere sul file: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Errore nel rimuovere il vecchio collegamento di backup: %s" + +#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Errore nel creare la copia di backup: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Errore nel rinominare il file temporaneo: %s" + +#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Errore nel troncare il file: %s" + +#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Errore nell'aprire il file «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "Il file destinazione è una directory" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "Il file destinazione non è un file normale" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "Il file è stato modificato dall'esterno" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Errore nel rimuovere il vecchio file: %s" + +#: ../gio/gmemoryinputstream.c:476 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Fornito GSeekType non valido" + +#: ../gio/gmemoryinputstream.c:486 +msgid "Invalid seek request" +msgstr "Richiesta di posizionamento non valida" + +#: ../gio/gmemoryinputstream.c:510 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Impossibile troncare GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Stream di output di memoria non ridimensionabile" + +#: ../gio/gmemoryoutputstream.c:560 +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:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Richiesto posizionamento prima dell'inizio dello stream" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "L'hostname \"%s\" contiene '[' ma non ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Rete irraggiungibile" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Host irraggiungibile" + +#: ../gio/gnetworkmonitornetlink.c:98 ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Impossibile creare il monitor di rete: %s" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "Impossibile creare il monitor di rete: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "impossibile ottenere lo stato della rete: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Lo stream di output non implementa la scrittura" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Lo stream sorgente è già chiuso" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "La risorsa presso \"%s\" non esiste" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Decompressione della risorsa presso \"%s\" non riuscita" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "La risorsa presso \"%s\" non è una directory" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Lo stream di input non implementa il posizionamento" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Stampa l'aiuto" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMANDO]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Elenca le sezioni che contengono risorse in un FILE elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Elenca le risorse\n" +"Se è indicato SEZIONE, elenca solo le risorse in quella sezione\n" +"Se è indicato PERCORSO, elenca solo le risorse che corrispondono" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PERCORSO]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SEZIONE" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Elenca le risorse con i dettagli\n" +"Se è indicato SEZIONE, elenca solo le risorse in quella sezione\n" +"Se è indicato PERCORSO, elenca solo le risorse che corrispondono\n" +"I dettagli includono la sezione, la dimensione e la compressione" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Estrare un file risorsa su stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PERCORSO" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Comando \"%s\" sconosciuto\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gresource [--section SEZIONE] COMANDO [ARGOMENTO...]\n" +"\n" +"Comandi:\n" +" help Mostra queste informazioni\n" +" sections Elenca le sezioni risorse\n" +" list Elenca le risorse\n" +" details Elenca le risorse coi dettagli\n" +" extract Estrae una risorsa\n" +"\n" +"Usare 'gresource help COMANDO' per ottenere un aiuto dettagliato.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argomenti:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEZIONE Un nome sezione elf (opzionale)\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" +" COMANDO Il comando (opzionale) da spiegare\n" +"\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE Un file elf (un binario o una libreria condivisa)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE Un file elf (un binario o una libreria condivisa)\n" +" o un file risorsa compilato\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PERCORSO]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PERCORSO Un (opzionale) percorso risorsa (può essere parziale)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PERCORSO" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PERCORSO Un percorso risorsa\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Schema \"%s\" inesistente\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"Lo schema \"%s\" non è rilocabile (non deve essere specificato il percorso)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Lo schema \"%s\" è rilocabile (deve essere specificato il percorso)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Indicato percorso vuoto.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Il percorso deve cominciare con uno slash (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Il percorso deve terminare con uno slash (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Il percorso non deve contenere due slash adiacenti (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Chiave \"%s\" inesistente\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Il valore fornito è fuori dell'intervallo valido\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Elenca gli schemi (non rilocabili) installati" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Elenca gli schemi rilocabili installati" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Elenca le chiavi in SCHEMA" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PERCORSO]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Elenca i figli di SCHEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Elenca chiavi e valori, ricorsivamente\n" +"Se non è fornito alcuno SCHEMA elenca tutte le chiavi\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PERCORSO]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Ottiene il valore di CHIAVE" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PERCORSO] CHIAVE" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Interroga l'intervallo di valori ammessi per CHIAVE" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Imposta il valore di CHIAVE a VALORE" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PERCORSO] CHIAVE VALORE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Azzera CHIAVE al suo valore predefinito" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Azzera tutte le chiavi in SCHEMA ai rispettivi valori predefiniti" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Verifica se CHIAVE è scrivibile" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizza le modifiche a CHIAVE.\n" +"Se CHIAVE non è specificato, monitorizza tutte le chiavi in SCHEMA.\n" +"Usare ^C per fermare il monitoraggio.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PERCORSO] [CHIAVE]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir DIR_SCHEMA] COMANDO [ARGOMENTO...]\n" +"\n" +"Comandi:\n" +" help Mostra queste informazioni\n" +" list-schemas Elenca gli schemi installati\n" +" list-relocatable-schemas Elenca gli schemi rilocabili\n" +" list-keys Elenca le chiavi in uno schema\n" +" list-children Elenca i figli di uno schema\n" +" list-recursively Elenca chiavi e valori, ricorsivamente\n" +" range Interroga l'intervallo di una chiave\n" +" get Ottiene il valore di una chiave\n" +" set Imposta il valore di una chiave\n" +" reset Azzera il valore di una chiave\n" +" reset-recursively Azzera tutti i valori di uno schema fornito\n" +" writable Verifica se una chiave è scrivibile\n" +" monitor Controlla le modifiche\n" +"\n" +"Usare 'gsettings help COMANDO' per ottenere un aiuto dettagliato.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir DIR_SCHEMA] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " DIR_SCHEMA Una directory in cui cercare schemi aggiuntivi\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Il nome dello schema\n" +" PERCORSO Il percorso, per gli schemi rilocabili\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " CHIAVE La chiave (opzionale) all'interno dello schema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " CHIAVE La chiave all'interno dello schema\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALORE Il valore da impostare\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Fornito un nome di schema vuoto\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Socket non valido, non inizializzato" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket non valido, inizializzazione non riuscita a causa di: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Il socket è già chiuso" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "I/O sul socket scaduto" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "creazione di GSocket da FD: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Impossibile creare il socket: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "È stata specificata una famiglia sconosciuta" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "È stato specificato un protocollo sconosciuto" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "impossibile ottenere l'indirizzo locale: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "impossibile ottenere l'indirizzo remoto: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "impossibile restare in ascolto: %s" + +# oppure "nell'eseguire il binding" ?? +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Errore nel legarsi all'indirizzo: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Errore nel fare il join al gruppo multicast: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Errore nel lasciare il gruppo multicast: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Nessun supporto per multicast source-specific" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Errore nell'accettare la connessione: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Connessione in corso" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Impossibile ottenere l'errore in sospeso: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Errore nel ricevere i dati: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Errore nell'inviare i dati: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Impossibile arrestare il socket: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Errore nel chiudere il socket: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "In attesa della condizione del socket: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Errore nell'inviare il messaggio: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage non supportato su Windows" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Errore nel ricevere il messaggio: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Impossibile ottenere l'errore in sospeso: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials non implementata per questo S.O." + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Impossibile connettersi al server proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Impossibile connettersi a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Impossibile connettersi: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Errore sconosciuto nella connessione" + +# FIXME: il tentativo o la connessione? +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "L'esecuzione del proxy su una connessione non-TCP non è supportato." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Il protocollo proxy \"%s\" non è supportato." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Il listener è già chiuso" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Il socket aggiunto è chiuso" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 non supporta l'indirizzo IPv6 \"%s\"" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Il nome utente è troppo lungo per il protocollo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "L'hostname \"%s\" è troppo lungo per il protocollo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Il server non è un server proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "La connessione attraverso il server SOCKSv3 è stata rifiutata" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Il server non è un server proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Il proxy SOCKSv5 richiede l'autenticazione." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Il proxy SOCKSv5 richiede un metodo di autenticazione che non è supportato " +"da GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"Il nome utente o la password sono troppo lunghi per il protocollo SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"L'autenticazione SOCKSv5 non è riuscita a causa di un nome utente o password " +"errati." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "L'hostname \"%s\" è troppo lungo per il protocollo SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Il proxy server SOCKSv5 utilizza un tipo di indirizzo sconosciuto." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Errore interno del server proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "La connessione SOCKSv5 non è consentita dal ruleset." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host irraggiungibile attraverso il server SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Rete irraggiungibile attraverso il proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Connessione rifiutata attraverso il proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Il proxy SOCKSv5 non supporta il comando \"connect\"." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Il proxy SOCKSv5 non supporta il tipo di indirizzo fornito." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Errore sconosciuto del proxy SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Impossibile gestire la versione %d della codifica GThemedIcon" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Errore nel risolvere \"%s\": %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Errore nella risoluzione inversa di \"%s\": %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nessun record DNS del tipo richiesto per \"%s\"" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Momentaneamente impossibile risolvere \"%s\"" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Errore nel risolvere \"%s\"" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Impossibile decifrare la chiave privata codificata con PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Non è stato trovata alcuna chiave privata codificata con PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Impossibile analizzare la chiave privata codificata con PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Non è stato trovato alcun certificato codificato con PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Impossibile analizzare il certificato codificato con PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Questa è l'ultima opportunità di inserire la password correta prima che " +"venga bloccato l'accesso." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Sono state inserite diverse password non corrette, altri errori e l'accesso " +"verrà bloccato." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "La password inserita non è corretta." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Atteso 1 messaggio di controllo, ottenuti %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Tipo di dati ausiliari inatteso" + +# tolto il "but" per omogeneità con l'altro simile +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Atteso un FD, ottenuti %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Ricevuto FD non valido" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Errore nell'inviare le credenziali: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Errore nel verificare se SO_PASSCRED è abilitato per il socket: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Errore nell'abilitare SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Attesa la lettura di un singolo byte per la ricezione delle credenziali, ma " +"sono stati letti zero byte" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Messaggio di controllo inatteso, ottenuti %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Errore durante la disabilitazione di SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Errore nel leggere dal descrittore di file: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Errore nel chiudere il descrittore di file: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "File system radice" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Errore nello scrivere sul descrittore di file: %s" + +# a chi è riferito abstract?? +# a addresses o a domain? +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +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:276 +msgid "Can't find application" +msgstr "Impossibile trovare l'applicazione" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Errore nel lanciare l'applicazione: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI non supportati" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "cambi di associazioni non supportati su win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Creazione di associazioni non supportata su win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Errore nel leggere dall'handle: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Errore nel chiudere l'handle: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Errore nello scrivere sull'handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Memoria non sufficiente" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Errore interno: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Necessario ulteriore input" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Dati compressi non validi" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Indirizzi su cui ascoltare" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorato, per compatibilità con GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Stampa l'indirizzo" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Stampa l'indirizzo in modalità shell" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Esegue un servizio dbus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Argomenti errati\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Attributo \"%s\" inatteso per l'elemento \"%s\"" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributo \"%s\" dell'elemento \"%s\" non trovato" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag \"%s\" inatteso; atteso il tag \"%s\"" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag \"%s\" inatteso all'interno di \"%s\"" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, 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:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Non è stato trovato alcun segnalibro per l'URI «%s»" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Impossibile convertire \"%s\" nel set di caratteri \"%s\"" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "L'URI \"%s\" non è valido" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Il nome dell'host nell'URI \"%s\" non è valido" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "L'URI \"%s\" contiene sequenze di escape non valide" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Il nome di percorso \"%s\" non è un percorso assoluto" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Nome host non valido" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "A.M." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "P.M." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %Y %-H.%M.%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%-H.%M.%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%-I.%M.%S %P" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Gennaio" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Febbraio" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Marzo" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Aprile" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maggio" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Giugno" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Luglio" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agosto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Settembre" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Ottobre" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembre" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Dicembre" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Gen" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mag" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Giu" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Lug" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ago" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Set" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Ott" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dic" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Lunedì" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Martedì" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Mercoledì" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Giovedì" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Venerdì" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sabato" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Domenica" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Lun" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mer" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Gio" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Ven" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sab" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Dom" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Errore nell'aprire la directory \"%s\": %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Impossibile allocare %lu byte per leggere il file \"%s\"" +msgstr[1] "Impossibile allocare %lu byte per leggere il file \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Errore nel leggere il file \"%s\": %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Il file \"%s\" è troppo grande" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Lettura dal file \"%s\" non riuscita: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Apertura del file \"%s\" non riuscita: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Creazione del file \"%s\" non riuscita: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1556 +#, 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:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Il modello \"%s\" non contiene XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Lettura del collegamento simbolico \"%s\" non riuscita: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Collegamenti simbolici non supportati" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Sono rimasti dei dati non convertiti nel buffer di lettura" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Il canale termina in un carattere parziale" + +#: ../glib/giochannel.c:1954 +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" + +# 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:722 +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:758 +msgid "Not a regular file" +msgstr "Non è un file normale" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome gruppo non valido: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Il file chiavi non inizia con un gruppo" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome chiave non valido: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Il file chiavi contiene la codifica non supportata \"%s\"" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Il file chiavi non presenta il gruppo \"%s\"" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Il file chiavi non presenta la chiave \"%s\"" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Il file chiavi contiene la chiave \"%s\" nel gruppo \"%s\" che presenta un " +"valore che non può essere interpretato." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"La chiave \"%s\" nel gruppo \"%s\" presenta il valore \"%s\" mentre era " +"atteso %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +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:4102 +#, 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:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Impossibile interpretare il valore \"%s\" come un numero." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Il valore intero \"%s\" è fuori dall'intervallo" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Impossibile interpretare il valore \"%s\" come un booleano." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Recupero degli attributi del file \"%s%s%s%s\" non riuscito: fstat() non " +"riuscita: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Mappatura del file \"%s%s%s%s\" non riuscita: mmap() non riuscita: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Apertura del file \"%s\" non riuscita: open() non riuscita: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Errore alla riga %d carattere %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "\"%s\" non è un nome valido" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "\"%s\" non è un nome valido: '%c'" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Errore alla riga %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, 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:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Rilevata entità vuota '&;' (sono entità valide & " < > ')" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Il nome di entità \"%-.*s\" è sconosciuto" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Il documento deve iniziare con un elemento (es. )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Il documento era vuoto oppure conteneva unicamente spazi" + +#: ../glib/gmarkup.c:1767 +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:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +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:1795 +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:1800 +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:1806 +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:1813 +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:1829 +#, 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:1835 +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" + +#: ../glib/goption.c:754 +msgid "Usage:" +msgstr "Uso:" + +#: ../glib/goption.c:754 +msgid "[OPTION...]" +msgstr "[OPZIONE...]" + +#: ../glib/goption.c:864 +msgid "Help Options:" +msgstr "Opzioni di aiuto:" + +#: ../glib/goption.c:865 +msgid "Show help options" +msgstr "Mostra le opzioni di aiuto" + +#: ../glib/goption.c:871 +msgid "Show all help options" +msgstr "Mostra tutte le opzioni di aiuto" + +#: ../glib/goption.c:933 +msgid "Application Options:" +msgstr "Opzioni dell'applicazione:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Impossibile analizzare il valore intero \"%s\" per %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Il valore intero \"%s\" per %s è fuori dall'intervallo" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Impossibile analizzare il valore double \"%s\" per %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Il valore double \"%s\" per %s è fuori dall'intervallo" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Errore nell'analizzare l'opzione %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Argomento mancante per %s" + +#: ../glib/goption.c:1979 +#, c-format +msgid "Unknown option %s" +msgstr "Opzione %s sconosciuta" + +# corrotto sembrava brutto, cfr revisione su TP +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "oggetto non attendibile" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "errore interno oppure oggetto non attendibile" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "memoria esaurita" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "raggiunto limite di backtracking" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"il modello contiene elementi non supportati per la corrispondenza parziale" + +#: ../glib/gregex.c:288 +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:297 +msgid "recursion limit reached" +msgstr "raggiunto limite di ricorsione" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinazione non valida di flag di fine riga" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "offset errato" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 corto" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "ciclo ricorsivo" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "errore sconosciuto" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ alla fine del modello" + +#: ../glib/gregex.c:332 +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:335 +msgid "unrecognized character following \\" +msgstr "carattere non riconosciuto dopo \\" + +# quantificatore: esiste come termine per log. mat. e gramm. +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "numeri fuori ordine nel quantificatore {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "numero troppo grande nel quantificatore {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "] terminante mancante per classe di caratteri" + +#: ../glib/gregex.c:347 +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:350 +msgid "range out of order in character class" +msgstr "intervallo disordinato nella classe di caratteri" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nulla da ripetere" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "ripetizione inattesa" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "carattere non riconosciuto dopo (? o (?-" + +# classi nominate?? +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr ") terminante mancante" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "riferimento a sotto-modello non esistente" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr ") mancante dopo il commento" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "l'espressione regolare è troppo grande" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "recupero della memoria non riuscito" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") senza ( di apertura" + +# secondo garzantilinguistica.it eccedenza (di dati) è la +# traduzione di overflow secondo IBM. La traduzione generica +# per ambito infomatico è superamento di capacità +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "eccedenza di codice" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "carattere non riconosciuto dopo (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "l'asserzione lookbehind non ha lunghezza fissata" + +# malformato si riferisce a entrambi???? +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "numero o nome malformato dopo (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "il gruppo condizionale contiene più di due diramazioni" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "asserzione attesa dopo (?" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R o (?[+-]cifre deve essere seguito da )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nome di classe POSIX sconosciuto" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "gli elementi di collazione POSIX non sono supportati" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "il valore del carattere nella sequenza \\x{...} è troppo grande" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "condizione (?(0) non valida" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C non consentito in asserzione lookbehind" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "gli escape \\L, \\l \\N{name}, \\U, e \\u non sono supportati" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "la chiamata ricorsiva potrebbe entrare in ciclo infinito" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "carattere non riconosciuto dopo (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "terminatore mancante nel nome di sotto-modello" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "due sotto-modelli nominati presentano lo stesso nome" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "sequenza \\P o \\p malformata" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nome di proprietà sconosciuto dopo \\P o \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "il nome di sotto-modello è troppo lungo (massimo 32 caratteri)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "troppi sotto-modelli nominati (massimo 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "il valore ottale è maggiore di \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "sconfinamento compilando l'area di lavoro" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "sotto-modello referenziato precedentemente controllato non trovato" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "il gruppo DEFINE contiene più di una diramazione" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opzioni NEWLINE incoerenti" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g non è seguito da un nome o un numero tra parentesi, parentesi angolari, " +"tra virgolette o da un numero semplice" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "un riferimento numerato deve essere diverso da zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "non è consentito un argomento per (*ACCEPT), (*FAIL) o (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) non riconosciuto" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "il numero è troppo grande" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "nome di sotto-modello mancante dopo (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "attesa cifra dopo (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] è un caratteri dati non valido in modalità compatibilità JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "non sono ammessi diversi nomi per sotto-modelli dello stesso numero" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) deve avere un argomento" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c deve essere seguito da un carattere ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\g non è seguito da un nome tra parentesi, parentesi angolari o virgolette" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N non è supportato in una classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "troppi riferimenti anteriori" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nome troppo lungo in (*MARK), (*PRUNE), (*SKIP) o (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "il valore del carattere nella sequenza \\u.... è troppo grande" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "La libreria PCRE è compilata senza supporto per UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "La libreria PCRE è compilata senza supporto per le proprietà UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "La libreria PCRE è compilata con opzioni incompatibili\t" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Errore durante l'ottimizzazione dell'espressione regolare %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "attesa cifra esadecimale o '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "attesa cifra esadecimale" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "'<' mancante nel riferimento simbolico" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "riferimento simbolico non terminato" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "riferimento simbolico di lunghezza zero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "attesa cifra" + +#: ../glib/gregex.c:2432 +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:2494 +msgid "stray final '\\'" +msgstr "'\\' finale isolato" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "sequenza di escape sconosciuta" + +# da sostituire crea confusione... +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Il testo citato non inizia con un carattere di quoting" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Il testo era vuoto (oppure conteneva unicamente spazi bianchi)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: ../glib/gspawn.c:203 +#, 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:362 +#, 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)" + +#: ../glib/gspawn.c:853 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Processo figlio uscito con codice %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Processo figlio ucciso dal segnale %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Processo figlio fermato dal segnale %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "Il processo figlio è uscito in modo anomalo" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: ../glib/gspawn.c:1280 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, 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.c:1348 +#, 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:1496 ../glib/gspawn-win32.c:370 +#, 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.c:1506 +#, 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:1516 +#, 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:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Esecuzione del fork per processo figlio non riuscita (%s)" + +#: ../glib/gspawn.c:1533 +#, 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:1557 +#, 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)" + +# (%s) è in fondo perché risolto in g_strerror (gint) +#: ../glib/gspawn.c:1630 ../glib/gspawn-win32.c:300 +#, 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)" + +#: ../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: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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Stringa non valida nell'ambiente: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, 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:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Esecuzione del programma helper non riuscita (%s)" + +#: ../glib/gspawn-win32.c:997 +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" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Carattere fuori dall'intervallo per UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Sequenza non valida in ingresso per la conversione" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Carattere fuori dall'intervallo per UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s byte" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f kB" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 0000000..6d87f8c --- /dev/null +++ b/po/ja.po @@ -0,0 +1,4296 @@ +# Japanese translation of glib message catalog. +# Copyright (C) 2001-2012 glib's COPYRIGHT HOLDER +# Takayuki KUSANO , 2001-2002, 2009-2010. +# KAMAGASAKO Masatoshi , 2003. +# Takeshi AIHANA , 2004-2009. +# Ryoichi INAGAKI , 2004. +# Takayuki KUSANO , 2010. +# OKANO Takayoshi , 2011. +# Jiro Matsuzawa , 2012. +# +# 訳語: +# be malformed: 不正です +# bus: バス +# bus address: バスアドレス +# object path: オブジェクトパス (D-Bus 関連) +# serialize: シリアライズ +# deserialize: デシリアライズ +# signature: シグネチャ +# D-Bus write format: D-Bus 書き出し形式 +# type: 型 あるいは 種類 +# abstract key: 抽象キー +# message body: メッセージボディ +# list: 一覧 +# リスト (schema 関連) +# +msgid "" +msgstr "" +"Project-Id-Version: glib glib-2-28\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-08-21 12:29+0000\n" +"PO-Revision-Date: 2012-08-21 20:24+0900\n" +"Last-Translator: OKANO Takayoshi \n" +"Language-Team: Japanese \n" +"Language: ja\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s に引き渡した値が大きすぎます" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#, fuzzy +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "ストリーム上のシークはサポートしていません" + +#: ../gio/gbufferedinputstream.c:951 +#, fuzzy +#| msgid "Cannot truncate GMemoryInputStream" +msgid "Cannot truncate GBufferedInputStream" +msgstr "GMemoryInputStream を切りつめることはできません" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "既にストリームは閉じています" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#, fuzzy +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "ストリーム上での切りつめはサポートしていません" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "操作がキャンセルされました" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "無効なオブジェクトです。初期化されていません" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "入力に不完全なバイトの並びがあります" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "変換先に充分な空きがありません" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "変換する入力に無効なバイトの並びがあります" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "変換中にエラー: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "キャンセル可能な初期化はサポートされていません" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' から '%s' という文字集合への変換はサポートしていません" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' から '%s' への変換処理を開けませんでした" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s (情報)" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "不明な種類" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s (ファイルの種類)" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials はこのOSでは実装されていません" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "このプラットフォームでは GCredentials はサポートされていません" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "想定していたよりも早くストリームの最後に到達しました" + +#: ../gio/gdbusaddress.c:149 ../gio/gdbusaddress.c:237 +#: ../gio/gdbusaddress.c:318 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "サポートしていないキー '%s' がアドレスエントリ '%s' にあります" + +#: ../gio/gdbusaddress.c:176 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "アドレス '%s' は正しくありません (パス、tmpdir、または抽象キーのいずれか一つが必要)" + +#: ../gio/gdbusaddress.c:189 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "アドレスエントリ '%s' に意味の無いキー/値のペアの組み合わせがあります" + +#: ../gio/gdbusaddress.c:252 ../gio/gdbusaddress.c:333 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "アドレス '%s' 中にエラー - port 属性が不正です" + +#: ../gio/gdbusaddress.c:263 ../gio/gdbusaddress.c:344 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "アドレス '%s' 中にエラー - family 属性が不正です" + +#: ../gio/gdbusaddress.c:453 +#, fuzzy, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "アドレス要素 '%s' がコロン ':' を含んでいません" + +#: ../gio/gdbusaddress.c:474 +#, fuzzy, c-format +#| msgid "Key/Value pair %d, `%s', in address element `%s', does not contain an equal sign" +msgid "Key/Value pair %d, `%s', in address element `%s' does not contain an equal sign" +msgstr "アドレス要素 '%3$s'中の %1$d 番目のキー/値のペア '%2$s' が等号記号を含んでいません" + +#: ../gio/gdbusaddress.c:488 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "アドレス要素 '%3$s' 中の %1$d 番目のキー/値のペア '%2$s' 中のキーまたは値をアンエスケープする際にエラー" + +#: ../gio/gdbusaddress.c:566 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "アドレス '%s' 中にエラー - UNIX トランスポートはキー 'path' または 'abstract' のうち一つが設定されている必要があります" + +#: ../gio/gdbusaddress.c:602 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "アドレス '%s' 中にエラー - host 属性が無いか不正です" + +#: ../gio/gdbusaddress.c:616 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "アドレス '%s' 中にエラー - port 属性が無いか不正です" + +#: ../gio/gdbusaddress.c:630 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "アドレス '%s' 中にエラー - noncefile 属性が無いか不正です" + +#: ../gio/gdbusaddress.c:651 +msgid "Error auto-launching: " +msgstr "自動起動時にエラー: " + +#: ../gio/gdbusaddress.c:659 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "アドレス '%2$s' に不明なあるいはサポートしていないトランスポート '%1$s'" + +#: ../gio/gdbusaddress.c:695 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "nonce ファイル '%s' をオープンする際にエラー: %s" + +#: ../gio/gdbusaddress.c:713 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "nonce ファイル '%s' の読み出し中にエラー: %s" + +#: ../gio/gdbusaddress.c:722 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "nonce ファイル '%s' の読み出し中にエラー。16 バイトを期待しましたが、%d バイトでした" + +#: ../gio/gdbusaddress.c:740 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "nonce ファイル '%s' の内容をストリームに書き込む際にエラー:" + +#: ../gio/gdbusaddress.c:959 +msgid "The given address is empty" +msgstr "与えられたアドレスが空です" + +#: ../gio/gdbusaddress.c:1028 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "machine-id 無でメッセージバスを起動できません: " + +#: ../gio/gdbusaddress.c:1070 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "コマンドライン '%s' の spawn 時にエラー: " + +#: ../gio/gdbusaddress.c:1287 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" + +#: ../gio/gdbusaddress.c:1412 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#: ../gio/gdbusaddress.c:1433 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "セッションバスのアドレスを決定できません (このOSでは実装されていません)" + +#: ../gio/gdbusaddress.c:1532 ../gio/gdbusconnection.c:6755 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "DBUS_STARTER_BUS_TYPE 環境変数からバスアドレスを決定できません - 不明な値 '%s'" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6764 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "DBUS_STARTER_BUS_TYPE 環境変数が設定されていないため、バスアドレスを決定できません" + +#: ../gio/gdbusaddress.c:1551 +#, c-format +msgid "Unknown bus type %d" +msgstr "不明なバスの種類 %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "行を読みこもうとしましたが内容が意図せず欠落しています" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "(安全に)行を読みこもうとしましたが内容が意図せず欠落しています" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "すべての利用可能な認証メカニズムを試し尽くしました (試行: %s) (利用可能: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer 経由でキャンセルされました" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "ディレクトリ `%s' の情報を取得する際にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "ディレクトリ '%s' が不正なパーミッションです。0700 モードを期待しましたが、0%o でした" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "ディレクトリ'%s' を生成する際にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ファイル '%s' をオープンする際にエラー: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "'%2$s' のキーリングの、内容が '%3$s' の %1$d 行目が不正です" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "'%2$s' のキーリングの、内容が '%3$s' の %1$d 行目の最初のトークンが不正です" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "'%2$s' のキーリングの、内容が '%3$s' の %1$d 行目の2番目のトークンが不正です" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "'%2$s' のキーリング中の id %1$d のクッキーを見つけられませんでした" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "stale したロックファイル '%s' の削除中にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "ロックファイル '%s' の作成中にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(unlink した)ロックファイル '%s' を閉じる際にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ロックファイル '%s' を unlink する際にエラー: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "キーリング '%s' を書き込み用にオープンする際にエラー: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(さらに、'%s' のロックの解放も失敗しました: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "接続が閉じています" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "タイムアウトしました" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "クライアントサイドの接続を作成しようとしましたがサポートしていないフラグに遭遇しました" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "パス %s のオブジェクト上にインターフェース 'org.freedesktop.DBus.Properties' がありません" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "プロパティ '%s' の設定時にエラー: 期待した型は '%s' ですが '%s' でした" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "'%s' というプロパティが存在しません" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "プロパティ '%s' が読み込み可能ではありません" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "プロパティ '%s' が書き込み可能ではありません" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6198 +#, c-format +msgid "No such interface `%s'" +msgstr "'%s' というインターフェースがありません" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "そのようなインターフェースがありません" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6704 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "パス %2$s のオブジェクト上にインターフェース '%1$s' がありません" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "'%s' というメソッドがありません" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "メッセージの型 '%s' は期待した型 '%s' に一致しません" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s のインターフェース %1$s にオブジェクトは既にエクスポートされています" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "メソッド '%s' は '%s' 型を返しましたが、'%s' を期待していました" + +#: ../gio/gdbusconnection.c:6309 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "シグネチャ '%3$s' を持ったインターフェース '%2$s' にメソッド '%1$s' が存在しません" + +#: ../gio/gdbusconnection.c:6428 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "サブツリーは既に %s に export されています" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "型が INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL メッセージ: PATH または MEMBER ヘッダーフィールドがありません" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN メッセージ: REPLY_SERIAL ヘッダーフィールドがありません" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR メッセージ: REPLY_SERIAL または ERROR_NAME ヘッダーフィールドがありません" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL メッセージ: PATH、INTERFACE あるいは MEMBER ヘッダーフィールドがありません" + +#: ../gio/gdbusmessage.c:914 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "SIGNAL メッセージ: PATH ヘッダーフィールドが予約された値 /org/freedesktop/DBus/Local を使っています" + +#: ../gio/gdbusmessage.c:922 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "SIGNAL メッセージ: INTERFACE ヘッダーフィールドが予約された値 org.freedesktop.DBus.Local を使っています" + +#: ../gio/gdbusmessage.c:998 +#, fuzzy, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu バイト読もうとしましたが、EOF になりました" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "UTF-8 文字列を期待しましたが、正しくないバイト列がオフセット %d にありました (文字列の長さは %d です)。正しい UTF-8 文字列は '%s' までです。" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "'%s' 文字列の後に NUL を期待していましたが、%d がありました" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "解析した値 '%s' は正しい D-Bus オブジェクトパスではありません" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "解析された値 '%s' は妥当な D-Bus のシグネチャではありません" + +#: ../gio/gdbusmessage.c:1325 +#, fuzzy, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "%u バイトの長さの配列に出会いました。最大の長さは 2<<26 バイト (64 MiB) です。" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Variant 型として解析した値 '%s' は正しい D-Bus のシグネチャではありません" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "D-Bus 書き出し形式から GVariant を型文字列 '%s' でデシリアライズしようとしたらエラー" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "エンディアンについての値が正しくありません。0x6c ('l') または 0x42 ('B') のところ、0x%02x でした" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "プロトコルのメジャーバージョンが正しくありません。1 を期待したところ %d でした" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "シグネチャ '%s' のシグネチャヘッダーが見つかりましたが、メッセージボディが空です" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "値 '%s' を解析しましたが、D-Bus のシグネチャとして正しくありません (ボディ)" + +#: ../gio/gdbusmessage.c:1814 +#, fuzzy, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "メッセージ中にシグネチャヘッダーがありませんが、メッセージボディが %u バイトあります" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "メッセージをデシリアライズできません: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "GVariant を型文字列 '%s' で D-Bus 書き出し形式にシリアライズしようとしましたがエラーです" + +#: ../gio/gdbusmessage.c:2297 +#, fuzzy, c-format +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "メッセージには %d 個の fd が含まれていますが、ヘッダーフィールドでは %d 個の fd があることになってます" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "メッセージをシリアライズできません: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "メッセージボディにはシグネチャ '%s' がありますが、シグネチャのヘッダーがありません" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "メッセージボディには型シグネチャ '%s' がありますが、ヘッダーフィールド中のシグネチャは '%s' です" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "メッセージボディは空ですが、ヘッダーフィールド中のシグネチャは '(%s)' です" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "型 '%s' のボディでエラーが返りました" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "空のボディでエラーが返りました" + +#: ../gio/gdbusprivate.c:2062 +#, fuzzy, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "ファイルをゴミ箱へ移動できません: %s" + +#: ../gio/gdbusprivate.c:2107 +#, fuzzy +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id を読みこめません: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s を StartServiceByName で呼び出そうとしてエラー: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "StartServiceByName(\"%2$s\") メソッドから期待してない応答 %1$d" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "メソッドを起動できません: proxy がオーナーの無い既知の名前で、G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START フラグで proxy が作成されていました" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "抽象名前空間はサポートされていません" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "サーバーを作成する際、nonce ファイルを指定できません" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "nonce ファイルを '%s' に書き込む際にエラー: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' は妥当な D-Bus GUID ではありません" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "サポートしていないトランスポート '%s' で listen できません" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, fuzzy, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"コマンド:\n" +" help この情報を表示\n" +" introspect リモートオブジェクトをイントロスペクト\n" +" monitor リモートオブジェクトをモニター\n" +" call リモートオブジェクトでメソッドを起動\n" +"\n" +"\"%s COMMAND --help\" を使えば、それぞれのコマンドのヘルプを表示できます。\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "エラー: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "イントロスペクション XML の解析中にエラー: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "システム bus へ接続" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "セッション bus へ接続" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "指定された D-Bus アドレスに接続" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "接続の終端のオプション:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "接続の終端を指定するオプション" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "接続の終端が指定されていません" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "複数の接続の終端が指定されています" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "警告: イントロスペクションのデータによれば、インターフェース '%s' は存在しません\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "警告: イントロスペクションのデータによれば、メソッド '%s' はインターフェース '%s' に存在しません\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "モニターするオブジェクトパス" + +#: ../gio/gdbus-tool.c:536 +#, fuzzy +msgid "Signal and interface name" +msgstr "メソッドとインターフェースの名前" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "接続中にエラー: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, fuzzy, c-format +msgid "Error: object path not specified.\n" +msgstr "エラー: オブジェクトパスが指定されていません\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "エラー: %s は妥当なオブジェクトのパス名ではありません\n" + +#: ../gio/gdbus-tool.c:625 +#, fuzzy, c-format +msgid "Error: signal not specified.\n" +msgstr "エラー: 対象が指定されていません\n" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "エラー: %s は妥当なオブジェクトのパス名ではありません\n" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "エラー: %s は妥当なオブジェクトのパス名ではありません\n" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "エラー: %s は妥当なオブジェクトのパス名ではありません\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "パラメーター %d の解析中にエラー: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "接続を accept する時にエラー: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "メソッドを起動する対象の名前" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "メソッドを起動するオブジェクトパス" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "メソッドとインターフェースの名前" + +#: ../gio/gdbus-tool.c:728 +#, fuzzy +msgid "Timeout in seconds" +msgstr "タイムアウトしました" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "リモートオブジェクトでメソッドを起動します。" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "エラー: 対象が指定されていません\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "エラー: オブジェクトパスが指定されていません\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "エラー: メソッド名が指定されていません\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "エラー: メソッド名 '%s' が正しくありません\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "型 %2$s のパラメーター %1$d を解析中にエラー: %3$s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "イントロスペクトする対象の名前" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "イントロスペクトするオブジェクトパス" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "XML を表示" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "リモートオブジェクトをイントロスペクト。" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "モニターする対象の名前" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "モニターするオブジェクトパス" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "リモートのオブジェクトをモニターします。" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "名前なし" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "デスクトップ・ファイルで Exec 項目を指定してませんでした" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "アプリケーションで必要な端末が見つかりませんでした" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ユーザーのアプリケーション設定フォルダー %s を生成できません: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ユーザーの MIME 型設定フォルダー %s を生成できません: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ユーザーのデスクトップ・ファイル %s を生成できません" + +#: ../gio/gdesktopappinfo.c:2191 +#, c-format +msgid "Custom definition for %s" +msgstr "%s に対する独自の設定" + +#: ../gio/gdrive.c:363 +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:440 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ドライブは eject あるいは eject_with_operation を実装していません" + +#: ../gio/gdrive.c:513 +msgid "drive doesn't implement polling for media" +msgstr "ドライブ側でポーリングによるメディアの検出を実装していません" + +#: ../gio/gdrive.c:716 +msgid "drive doesn't implement start" +msgstr "ドライブは「開始」を実装していません。" + +#: ../gio/gdrive.c:815 +msgid "drive doesn't implement stop" +msgstr "ドライブは「停止」を実装していません" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "バージョン %d の GEmblem のエンコーディングはサポートしていません" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem のエンコーディングにあるトークンの数 (%d) が間違っています" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "バージョン %d の GEmblemedIcon のエンコーディングはサポートしていません" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon のエンコーディングにあるトークンの数 (%d) が間違っています" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon に対する GEmblem を想定していました" + +#: ../gio/gfile.c:884 ../gio/gfile.c:1111 ../gio/gfile.c:1242 +#: ../gio/gfile.c:1471 ../gio/gfile.c:1525 ../gio/gfile.c:1582 +#: ../gio/gfile.c:1665 ../gio/gfile.c:1720 ../gio/gfile.c:1780 +#: ../gio/gfile.c:1834 ../gio/gfile.c:3273 ../gio/gfile.c:3327 +#: ../gio/gfile.c:3470 ../gio/gfile.c:3511 ../gio/gfile.c:3901 +#: ../gio/gfile.c:4303 ../gio/gfile.c:4385 ../gio/gfile.c:4470 +#: ../gio/gfile.c:4564 ../gio/gfile.c:4647 ../gio/gfile.c:4737 +#: ../gio/gfile.c:5067 ../gio/gfile.c:5391 ../gio/gfile.c:5459 +#: ../gio/gfile.c:7083 ../gio/gfile.c:7169 ../gio/gfile.c:7251 +#: ../gio/win32/gwinhttpfile.c:439 +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:1359 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "マウントを含んでいるものはありません" + +#: ../gio/gfile.c:2380 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "ディレクトリ全体をコピーできません" + +#: ../gio/gfile.c:2441 +msgid "Can't copy directory over directory" +msgstr "ディレクトリからディレクトリへコピーできません" + +#: ../gio/gfile.c:2449 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "対象となるファイルが存在しています" + +#: ../gio/gfile.c:2467 +msgid "Can't recursively copy directory" +msgstr "ディレクトリを再帰的にコピーできません" + +#: ../gio/gfile.c:2727 +msgid "Splice not supported" +msgstr "splice はサポートしていません" + +#: ../gio/gfile.c:2731 +#, c-format +msgid "Error splicing file: %s" +msgstr "ファイルを splice する際にエラー: %s" + +#: ../gio/gfile.c:2878 +msgid "Can't copy special file" +msgstr "特別なファイルはコピーできません" + +#: ../gio/gfile.c:3460 +msgid "Invalid symlink value given" +msgstr "指定したシンボリックリンクは間違っています" + +#: ../gio/gfile.c:3618 +msgid "Trash not supported" +msgstr "ゴミ箱はサポートしていません" + +#: ../gio/gfile.c:3667 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ファイル名に '%c' を含めることはできません" + +#: ../gio/gfile.c:6146 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "ボリュームはマウントを実装していません" + +#: ../gio/gfile.c:6253 +msgid "No application is registered as handling this file" +msgstr "このファイルを扱うアプリケーションが登録されていません" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator は閉じています" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "ストリームは query_info をサポートしていません" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "ストリーム上のシークはサポートしていません" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "入力ストリームを切りつめることはできません" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "ストリーム上での切りつめはサポートしていません" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "トークンの数 (%d) が間違っています" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s というクラス名の型がありません" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s という型は GIcon のインターフェースを実装していません" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s という型がクラスになっていません" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "バージョン番号が間違っています: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s という型は GIcon のインターフェースで from_tokens() を実装していません" + +#: ../gio/gicon.c:428 +#, fuzzy +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "提供したバージョンの Icon のエンコーディングはサポートしていません" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, fuzzy, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "ローカルのアドレスを取得できませんでした: %s" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "ソケット・アドレスを作成するために充分な空きがありません" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "サポートしていないソケット・アドレスです" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Stream has outstanding operation" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "要素 <%s> は <%s> 中では使えません" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "要素 <%s> はトップレベルでは使えません" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" + +#: ../gio/glib-compile-resources.c:259 +#, fuzzy, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "'%s' というディレクトリへ移動できませんでした (%s)" + +#: ../gio/glib-compile-resources.c:288 +#, fuzzy, c-format +msgid "Unknown processing option \"%s\"" +msgstr "%s は不明なオプションです" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, fuzzy, c-format +msgid "Failed to create temp file: %s" +msgstr "'%s' というファイルを生成できませんでした: %s" + +#: ../gio/glib-compile-resources.c:336 +#, fuzzy, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "シンボリックリンクの指定でエラー: ファイルがリンクではない" + +#: ../gio/glib-compile-resources.c:391 +#, fuzzy, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "シンボリックリンクの指定でエラー: ファイルがリンクではない" + +#: ../gio/glib-compile-resources.c:404 +#, fuzzy, c-format +msgid "Error reading file %s: %s" +msgstr "'%s' の読み出し中にエラー: %s" + +#: ../gio/glib-compile-resources.c:424 +#, fuzzy, c-format +msgid "Error compressing file %s" +msgstr "ファイルをオープンする際にエラー: %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> 中では文字列は出現しません" + +#: ../gio/glib-compile-resources.c:611 +#, fuzzy +msgid "name of the output file" +msgstr "アイコンの名前です" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +#, fuzzy +msgid "FILE" +msgstr "[ファイル...]" + +#: ../gio/glib-compile-resources.c:612 +msgid "The directories where files are to be read from (default to current directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:613 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "空の名前は許されていません" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "正しくない名前 '%s': 名前は小文字で始まっていなければなりません" + +#: ../gio/glib-compile-schemas.c:796 +#, fuzzy, c-format +#| msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and dash ('-') are permitted." +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and hyphen ('-') are permitted." +msgstr "正しくない名前 '%s': 正しくない文字 '%c' があります。小文字、数字、およびダッシュ ('-') のみが許可されている文字です" + +#: ../gio/glib-compile-schemas.c:805 +#, fuzzy, c-format +#| msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "正しくない名前 '%s': 2つ連続するダッシュ ('--') は許可されません" + +#: ../gio/glib-compile-schemas.c:814 +#, fuzzy, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "正しくない名前 '%s': 最後の文字はダッシュ ('-') ではいけません。" + +#: ../gio/glib-compile-schemas.c:822 +#, fuzzy, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "正しくない名前 '%s': 最大長は 32 です" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " は既に指定されています" + +#: ../gio/glib-compile-schemas.c:917 +#, fuzzy +msgid "cannot add keys to a 'list-of' schema" +msgstr "キーを 'list-of' スキーマに追加することができません" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " は既に指定されています" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid " shadows in ; use to modify value" +msgstr " は 中の を隠してしまいます。値の変更は を使ってください" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr " の属性としては、'type'、'enum'、あるいは 'flags' のうち一つだけが指定できます" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> は (まだ) 定義されていません。" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "正しくない GVariant 型の文字列 '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " が指定されましたが、スキーマはまだ何も拡張していません" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "上書きする がありません" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " は既に指定されています" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " は既に指定されています" + +#: ../gio/glib-compile-schemas.c:1125 +#, fuzzy, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr " がまだ存在していないスキーマ '%s' を拡張しています" + +#: ../gio/glib-compile-schemas.c:1141 +#, fuzzy, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr " はまだ存在していないスキーマ '%s' のリストです" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr " はリストですが、リストではない を拡張しています" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "パスは、与えられていれば、スラッシュで始まり、スラッシュで終わってなくてはなりません" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> は既に指定されています" + +#: ../gio/glib-compile-schemas.c:1459 +#, fuzzy, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "要素 <%s> はトップレベルでは使えません" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is outside the range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "ローカル・ディレクトリを監視するデフォルト・モニターの種類が見つかりません" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ファイル名が無効です: %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ファイルシステムの情報を取得する際にエラー: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "ルート・ディレクトリの名前は変更できません" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "ファイル名を変更する際にエラー: %s" + +#: ../gio/glocalfile.c:1164 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "ファイル名を変更できません (既に存在しているため)" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "無効なファイル名です" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "ディレクトリをオープンできません" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "ファイルをオープンする際にエラー: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "ファイルを削除する際にエラー: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "ファイルをゴミ箱へ移動する際にエラー: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ゴミ箱のディレクトリ (%s) の生成に失敗しました: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "ゴミ箱のトップレベルなディレクトリが見つかりません" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "ゴミ箱ディレクトリが存在しないか生成できません" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ゴミ箱の情報ファイルを生成できません: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ファイルをゴミ箱へ移動できません: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "内部エラー" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "ディレクトリを生成する際にエラー: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "シンボリックリンクをファイルシステムがサポートしていません" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "シンボリックリンクを生成する際にエラー: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "ファイルを移動する際にエラー: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "ディレクトリからディレクトリへ移動できません" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "バックアップ・ファイルの生成に失敗しました" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "対象となるファイルを削除する際にエラー: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "マウント間の移動はサポートしていません" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "属性値を NULL にしないでください" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "属性の種類が無効です (文字列を想定していた)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "拡張属性の名前が無効です" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' という拡張属性をセットする際にエラー: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (無効なエンコーディング)" + +#: ../gio/glocalfileinfo.c:1526 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ファイル '%s' の情報を取得する際にエラー: %s" + +#: ../gio/glocalfileinfo.c:1778 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "ファイルディスクリプターの情報を取得する際にエラー: %s" + +#: ../gio/glocalfileinfo.c:1823 +msgid "Invalid attribute type (uint32 expected)" +msgstr "属性の種類が無効です (uint32 型を想定していた)" + +#: ../gio/glocalfileinfo.c:1841 +msgid "Invalid attribute type (uint64 expected)" +msgstr "属性の種類が無効です (uint64 型を想定していた)" + +#: ../gio/glocalfileinfo.c:1860 ../gio/glocalfileinfo.c:1879 +msgid "Invalid attribute type (byte string expected)" +msgstr "属性の種類が無効です (バイト型の文字列を想定していた)" + +#: ../gio/glocalfileinfo.c:1914 +msgid "Cannot set permissions on symlinks" +msgstr "シンボリックリンクにはアクセス権をセットできません" + +#: ../gio/glocalfileinfo.c:1930 +#, c-format +msgid "Error setting permissions: %s" +msgstr "アクセス権をセットする際にエラー: %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error setting owner: %s" +msgstr "所有者をセットする際にエラー: %s" + +#: ../gio/glocalfileinfo.c:2004 +msgid "symlink must be non-NULL" +msgstr "シンボリックリンクを NULL にしないでください" + +#: ../gio/glocalfileinfo.c:2014 ../gio/glocalfileinfo.c:2033 +#: ../gio/glocalfileinfo.c:2044 +#, c-format +msgid "Error setting symlink: %s" +msgstr "シンボリックリンクをセットする際にエラー: %s" + +#: ../gio/glocalfileinfo.c:2023 +msgid "Error setting symlink: file is not a symlink" +msgstr "シンボリックリンクの指定でエラー: ファイルがリンクではない" + +#: ../gio/glocalfileinfo.c:2149 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "最終更新日時、あるいは最終アクセス日時をセットする際にエラー: %s" + +#: ../gio/glocalfileinfo.c:2172 +msgid "SELinux context must be non-NULL" +msgstr "SELinux のコンテキストを NULL にしないでください" + +#: ../gio/glocalfileinfo.c:2187 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux のコンテキストを指定する際にエラー: %s" + +#: ../gio/glocalfileinfo.c:2194 +msgid "SELinux is not enabled on this system" +msgstr "このシステムでは SELinux が有効になっていません" + +#: ../gio/glocalfileinfo.c:2286 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s という属性値はセットできません" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "ファイルから読み込む際にエラー: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ファイルでシークする際にエラー: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ファイルを閉じる際にエラー: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "ローカルファイルを監視するデフォルト・モニターの種類が見つかりません" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "ファイルに書き込む際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "古いバックアップのリンクを削除する際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "バックアップのコピーを生成する際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "作業用のファイル名を変更する際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "ファイルを切りつめる際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' というファイルをオープンする際にエラー: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "対象となるファイルはディレクトリです" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "対象となるファイルは通常のファイルではありません" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ファイルが外部で変更されました" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "古いファイルを削除する際にエラー: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "不正な GSeekType が指定されました" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "無効なシークの要求です" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream を切りつめることはできません" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "メモリ出力ストリームの大きさは変更できません" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "メモリ出力ストリームの大きさを変更できませんでした" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "Amount of memory required to process the write is larger than available address space" +msgstr "書き込むプロセスに必要なメモリの量が利用可能なアドレススペースより大きいです" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "ストリームの先端より前へシークするようリクエストされました" + +#: ../gio/gmemoryoutputstream.c:753 +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:363 +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:438 +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:515 +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:599 +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:685 +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:765 +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:850 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount には同期させてメディアの種類を推測するような実装はありません" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ホスト名 '%s' に '[' が含まれていますが ']' がありません" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, fuzzy, c-format +msgid "Could not create network monitor: %s" +msgstr "リモートのアドレスを取得できませんでした: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:177 +#, fuzzy +msgid "Could not get network status: " +msgstr "リモートのアドレスを取得できませんでした: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "出力ストリームは書き込みを実装していません" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "ソース・ストリームは既に閉じています" + +#: ../gio/gresolver.c:922 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' の解決中にエラー: %s" + +#: ../gio/gresolver.c:972 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' の逆引き中にエラー: %s" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "一時的に '%s' を解決することができません" + +#: ../gio/gresolver.c:1185 ../gio/gresolver.c:1384 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' の解決時にエラー" + +#: ../gio/gresolver.c:1213 ../gio/gresolver.c:1274 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "" + +#: ../gio/gresource.c:295 ../gio/gresource.c:543 ../gio/gresource.c:560 +#: ../gio/gresource.c:681 ../gio/gresource.c:750 ../gio/gresource.c:811 +#: ../gio/gresource.c:891 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:460 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:651 +#, fuzzy, c-format +msgid "The resource at '%s' is not a directory" +msgstr "対象となるファイルはディレクトリです" + +#: ../gio/gresourcefile.c:859 +#, fuzzy +msgid "Input stream doesn't implement seek" +msgstr "入力ストリームで読み込みを実装していません" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "ヘルプを表示する" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +#, fuzzy +msgid "[COMMAND]" +msgstr "COMMAND" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:502 +#, fuzzy +msgid "FILE PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"不明なコマンド: %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:530 +#, fuzzy, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "引数:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND 対象のコマンド (任意)\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:554 +#, fuzzy +msgid "[PATH]" +msgstr "PATH" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, fuzzy, c-format +msgid "No such schema '%s'\n" +msgstr "'%s' というインターフェースがありません" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:100 +#, fuzzy, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "パスは、与えられていれば、スラッシュで始まり、スラッシュで終わってなくてはなりません" + +#: ../gio/gsettings-tool.c:106 +#, fuzzy, c-format +msgid "Path must end with a slash (/)\n" +msgstr "パスは、与えられていれば、スラッシュで始まり、スラッシュで終わってなくてはなりません" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:133 +#, fuzzy, c-format +msgid "No such key '%s'\n" +msgstr "'%s' というプロパティが存在しません" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "インストール済みの (再配置不可能な) スキーマの一覧を表示する" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "インストール済みの再配置可能なスキーマの一覧を表示する" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA 内のキーの一覧を表示する" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "SCHEMA のサブスキーマの一覧を表示する" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"キーと値の一覧を再帰的に表示する\n" +"SCHEMA を指定しない場合、すべてのキーにたいして一覧を表示する\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "KEY の値を取得する" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "KEY の値の有効な範囲を確認する" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "KEY の値を VALUE に設定する" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "KEY をデフォルト値にリセットする" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA 内のすべてのキーをデフォルト値にリセットする" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "KEY が書き込み可能か確認する" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"KEY の値が変更されるのを監視する。\n" +"KEY を指定しない場合、SCHEMA 内のすべてのキーを監視する。\n" +"^C で監視を止める。\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"コマンド:\n" +" help この情報を表示する\n" +" list-schemas インストール済みのスキーマの一覧を表示する\n" +" list-relocatable-schemas 再配置可能なスキーマの一覧を表示する\n" +" list-keys スキーマ内のキーの一覧を表示する\n" +" list-children 指定したスキーマのサブスキーマの一覧を表示する\n" +" list-recursively キーと値の一覧を再帰的に表示する\n" +" range キーの値の有効な範囲を確認する\n" +" get キーの値を取得する\n" +" set キーの値を設定する\n" +" reset キーの値をリセットする\n" +" reset-recursively 指定したスキーマのすべての値をリセットする\n" +" writable キーが書き込み可能か確認する\n" +" monitor 変更を監視する\n" +"\n" +"詳細なヘルプを参照するには 'gsettings help COMMAND' を実行します。\n" +"\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR 追加スキーマを検索するディレクトリ\n" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA スキーマ名\n" +" PATH 再配置可能なスキーマの場合、そのパス\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY スキーマ内のキー (任意)\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " KEY スキーマ内のキー\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " VALUE 設定する値\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "無効なソケットです。初期化されていません" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無効なソケットです。初期化に失敗しました: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "ソースは既に閉じられています" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ファイルディスクリプター GSocket を作成: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ソケットを作成できません: %s" + +#: ../gio/gsocket.c:510 +#, fuzzy +msgid "Unknown family was specified" +msgstr "不明なプロトコルが指定されました" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "不明なプロトコルが指定されました" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "ローカルのアドレスを取得できませんでした: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "リモートのアドレスを取得できませんでした: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "listen できませんでした: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "アドレスに bind 時にエラー: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, fuzzy, c-format +msgid "Error joining multicast group: %s" +msgstr "アプリケーションを起動する際にエラー: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, fuzzy, c-format +msgid "Error leaving multicast group: %s" +msgstr "アプリケーションを起動する際にエラー: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接続を accept する時にエラー: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "接続中" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "エラーをペンディングできません: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "データの受信時にエラー: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "データの送信時にエラー: %s" + +#: ../gio/gsocket.c:2809 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ソケットを作成できません: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "ソケットを閉じる際にエラー: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ソケットの指定された状態を wait: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "メッセージを送信中にエラー: %s" + +#: ../gio/gsocket.c:3825 +#, fuzzy +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage は Windows ではサポートされていません" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "メッセージを受信中にエラー: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "" + +#: ../gio/gsocketclient.c:188 +#, fuzzy, c-format +msgid "Could not connect to %s: " +msgstr "'%s' から '%s' へ変換するコンバーターを開けませんでした: %s" + +#: ../gio/gsocketclient.c:190 +#, fuzzy +msgid "Could not connect: " +msgstr "listen できませんでした: %s" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "接続時に原因不明のエラー" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +#, fuzzy +#| msgid "Proxy protocol '%s' is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "プロキシのプロトコル '%s' がサポートされていません" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "プロキシのプロトコル '%s' がサポートされていません" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "受信を待つ Listener は既に閉じています" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "追加されたソケットは閉じています" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "バージョン %d の GThemedIcon のエンコーディングはサポートしていません" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "コントロールメッセージを一つ待ち受けていましたが、%d 受信しました" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "想定してない種類の補助データです" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ファイルディスクリプターを一つ待ち受けていましたが、%d 受信しました\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "無効なファイルディスクリプターを受けとりました" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "クレデンシャル送信時にエラー: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "Unexpected option length while checking if SO_PASSCRED is enabled for socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED を有効にする際にエラー: %s" + +#: ../gio/gunixconnection.c:565 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:603 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "コントロールメッセージを一つ待ち受けていましたが、%d 受信しました" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, fuzzy, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ファイル・ディスクリプターの状態を取得する際にエラー: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, fuzzy, c-format +msgid "Error closing file descriptor: %s" +msgstr "ファイル・ディスクリプターの状態を取得する際にエラー: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "ファイルシステムのルート" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, fuzzy, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ファイル・ディスクリプターの状態を取得する際にエラー: %s" + +#: ../gio/gunixsocketaddress.c:244 +#, fuzzy +#| msgid "Abstract unix domain socket addresses not supported on this system" +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "抽象化されたUNIXドメインソケットのアドレスはこのシステムではサポートされていません" + +#: ../gio/gvolume.c:404 +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:480 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ボリュームは eject あるいは eject_with_operation を実装していません" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "アプリケーションが見つかりません" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "アプリケーションを起動する際にエラー: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI はサポートしていません" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 で組み合わせの変更はサポートしていません" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 で組み合わせの生成はサポートしていません" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "ハンドルから読み込む際にエラー: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "ハンドルを閉じる際にエラー: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "ハンドルに書き込む際にエラー: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "メモリが足りません" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "内部エラー: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "無効な圧縮データです" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +#, fuzzy +#| msgid "Print help" +msgid "Print address" +msgstr "ヘルプを表示する" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' は '%s' という要素に対して想定外の属性です" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' という属性は '%s' という要素にはありません" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' は想定外のタグです (想定していたタグは '%s')" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' は '%s' の中では想定外のタグです" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "データ・ディレクトリの中に妥当なブックマーク・ファイルはありません" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' という URI のブックマークが既に存在しています" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' という URI のブックマークが見つかりませんでした" + +#: ../glib/gbookmarkfile.c:2385 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' という URI のブックマークには MIME 型が定義されていません" + +#: ../glib/gbookmarkfile.c:2470 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "'%s' という URI のブックマークにはプライベートではないフラグが定義されています" + +#: ../glib/gbookmarkfile.c:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' という URI のブックマークにはグループがありません" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "アプリケーションの '%s' は '%s' というブックマークを登録していません" + +#: ../glib/gbookmarkfile.c:3424 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "コマンドラインの '%s' を '%s' という URI に展開できませんでした" + +#: ../glib/gconvert.c:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "入力の最後に不完全な文字シーケンスがあります" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "フォールバック '%s' を '%s' という文字集合に変換できません" + +#: ../glib/gconvert.c:1874 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "'%s' は \"file\" スキームの絶対 URI ではありません" + +#: ../glib/gconvert.c:1884 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'#' を含んだ '%s' はローカルファイルの URI としては正しくありません" + +#: ../glib/gconvert.c:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' という URI は正しくありません" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI に含まれる '%s' というホスト名は間違っています" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' という URI に無効なエスケープ文字が含まれています" + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' は絶対パスではありません" + +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "無効なホスト名です" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "午前" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "午後" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Yå¹´%m月%d日 %H時%M分%S秒" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p%I時%M分%S秒" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "1月" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "2月" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "3月" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "4月" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "5月" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "6月" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "7月" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "8月" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "9月" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "10月" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "11月" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "12月" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr " 1月" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr " 2月" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr " 3月" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr " 4月" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr " 5月" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr " 6月" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr " 7月" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr " 8月" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr " 9月" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "10月" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "11月" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "12月" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "月曜日" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "火曜日" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "水曜日" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "木曜日" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "金曜日" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "土曜日" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "日曜日" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "月" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "火" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "æ°´" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "木" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "金" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "土" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "日" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' を開く時にエラー: %s" + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu バイトを確保できませんでした (ファイル \"%s\" の読み込みに必要)" + +#: ../glib/gfileutils.c:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' の読み出し中にエラー: %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "'%s' のサイズが大きすぎます" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' が読めません: %s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' を開けません: %s" + +#: ../glib/gfileutils.c:855 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' の属性を取得できません: fstat() に失敗しました: %s" + +#: ../glib/gfileutils.c:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' を開けません: fdopen() に失敗しました: %s" + +#: ../glib/gfileutils.c:997 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' から '%s' にファイル名を変更できません: g_rename() に失敗しました: %s" + +#: ../glib/gfileutils.c:1039 ../glib/gfileutils.c:1583 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' というファイルを生成できませんでした: %s" + +#: ../glib/gfileutils.c:1053 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' を書き込みモードで開けませんでした: fdopen() に失敗しました: %s" + +#: ../glib/gfileutils.c:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fwrite() に失敗しました: %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fflush() に失敗しました: %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' への書き込みに失敗しました: fsync() に失敗しました: %s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' をクローズできません: fclose() に失敗しました: %s" + +#: ../glib/gfileutils.c:1286 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' という既存のファイルを削除できませんでした: g_unlink() に失敗しました: %s" + +#: ../glib/gfileutils.c:1546 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' というテンプレートは間違っています ('%s' を含めないこと)" + +#: ../glib/gfileutils.c:1559 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' というテンプレートに XXXXXX が含まれていません" + +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "シンボリックリンク '%s' の読み込みが失敗: %s" + +#: ../glib/gfileutils.c:2108 +msgid "Symbolic links not supported" +msgstr "シンボリックリンクはサポートしていません" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' から '%s' へ変換するコンバーターを開けませんでした: %s" + +#: ../glib/giochannel.c:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "変換されていないデータが読みこみバッファーに残っています" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "チャンネルが不完全な文字で終わっています" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end では raw モードで読めません" + +#: ../glib/gkeyfile.c:725 +msgid "Valid key file could not be found in search dirs" +msgstr "検索ディレクトリには妥当なキー・ファイルがありませんでした" + +#: ../glib/gkeyfile.c:761 +msgid "Not a regular file" +msgstr "通常のファイルではありません" + +#: ../glib/gkeyfile.c:1161 +#, c-format +msgid "Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "キー・ファイルの行 '%s' がキー/値のペア、グループ、またはコメントではありません" + +#: ../glib/gkeyfile.c:1218 +#, c-format +msgid "Invalid group name: %s" +msgstr "グループ名が無効です: %s" + +#: ../glib/gkeyfile.c:1240 +msgid "Key file does not start with a group" +msgstr "キー・ファイルがグループで始まっていません" + +#: ../glib/gkeyfile.c:1266 +#, c-format +msgid "Invalid key name: %s" +msgstr "キーの名前が無効です: %s" + +#: ../glib/gkeyfile.c:1293 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "キー・ファイルにサポートしてないエンコーディング '%s' があります" + +#: ../glib/gkeyfile.c:1536 ../glib/gkeyfile.c:1698 ../glib/gkeyfile.c:3076 +#: ../glib/gkeyfile.c:3142 ../glib/gkeyfile.c:3268 ../glib/gkeyfile.c:3401 +#: ../glib/gkeyfile.c:3543 ../glib/gkeyfile.c:3773 ../glib/gkeyfile.c:3840 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "キー・ファイルにグループ '%s' がありません" + +#: ../glib/gkeyfile.c:1710 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "キー・ファイルにキー '%s' がありません" + +#: ../glib/gkeyfile.c:1817 ../glib/gkeyfile.c:1933 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "キー・ファイルのキー '%s' の値 '%s' が UTF-8 ではありません" + +#: ../glib/gkeyfile.c:1837 ../glib/gkeyfile.c:1953 ../glib/gkeyfile.c:2322 +#, c-format +msgid "Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "キー・ファイルに解釈できない値を持つキー '%s' が含まれています。" + +#: ../glib/gkeyfile.c:2539 ../glib/gkeyfile.c:2905 +#, fuzzy, c-format +msgid "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." +msgstr "キー・ファイルのグループ '%2$s' にあるキー '%1$s' の値を解釈できませんでした" + +#: ../glib/gkeyfile.c:2617 ../glib/gkeyfile.c:2693 +#, fuzzy, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "キー・ファイルのグループ '%2$s' にあるキー '%1$s' の値を解釈できませんでした" + +#: ../glib/gkeyfile.c:3091 ../glib/gkeyfile.c:3283 ../glib/gkeyfile.c:3851 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "キー・ファイルにはグループ '%2$s' のキー '%1$s' がありません" + +#: ../glib/gkeyfile.c:4083 +msgid "Key file contains escape character at end of line" +msgstr "キー・ファイルの行末にエスケープ文字が含まれています" + +#: ../glib/gkeyfile.c:4105 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "キー・ファイルに無効なエスケープ・シーケンス '%s' が含まれています" + +#: ../glib/gkeyfile.c:4247 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "値 '%s' を数値として解釈できません" + +#: ../glib/gkeyfile.c:4261 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整数値 '%s' は範囲外の値です" + +#: ../glib/gkeyfile.c:4294 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "値 '%s' を実数値として解釈できません" + +#: ../glib/gkeyfile.c:4318 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "値 '%s' を論理値として解釈できません" + +#: ../glib/gmappedfile.c:128 +#, fuzzy, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "'%s' の属性の取得できません: fstat() に失敗しました: %s" + +#: ../glib/gmappedfile.c:194 +#, fuzzy, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "ファイル '%s' のマップに失敗しました: mmap() が失敗: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ファイル '%s' を開けません: open() が失敗: %s" + +#: ../glib/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d 行の %d 文字目でエラー: " + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名前はUTF-8として正しくない文字列です - '%s' は妥当ではありません" + +#: ../glib/gmarkup.c:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' は妥当な名前ではありません " + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' は妥当な名前ではありません: '%c' " + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d 行目でエラー: %s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "文字参照 '%-.*s' が使用可能な文字をエンコードしていません" + +#: ../glib/gmarkup.c:715 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "空のエンティティ '&;' があります; 正しいエンティティは: & " < > '" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "エンティティ名 '%-.*s' というのは不明です" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "ドキュメントは要素 (例 ) で始まってなくてはなりません" + +#: ../glib/gmarkup.c:1116 +#, c-format +msgid "'%s' is not a valid character following a '<' character; it may not begin an element name" +msgstr "'%s' は '<' に続く文字としては正しくありません。おそらく要素名の開始になっていません" + +#: ../glib/gmarkup.c:1184 +#, c-format +msgid "Odd character '%s', expected a '>' character to end the empty-element tag '%s'" +msgstr "おかしな文字 '%s' があります。空の要素のタグ '%s' の最後は '>' でなくてはなりません" + +#: ../glib/gmarkup.c:1268 +#, c-format +msgid "Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "おかしな文字 '%s' です。属性名'%s' (要素 '%s') の後には '=' が必要です" + +#: ../glib/gmarkup.c:1309 +#, 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:1353 +#, 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:1486 +#, c-format +msgid "'%s' is not a valid character following the characters ''" +msgstr "'%s' は閉じ要素名 '%s' に続く文字としては正しくありあません。'>' のみが使用できます" + +#: ../glib/gmarkup.c:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "要素 '%s' は閉じています。要素は何も開かれてません" + +#: ../glib/gmarkup.c:1542 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "要素'%s' が閉じました。しかし現在開いている要素は '%s' です" + +#: ../glib/gmarkup.c:1710 +msgid "Document was empty or contained only whitespace" +msgstr "ドキュメントが空か、空白だけが含まれています" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ドキュメントが開きカギカッコ '<' の直後で終了しています" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, c-format +msgid "Document ended unexpectedly with elements still open - '%s' was the last element opened" +msgstr "ドキュメントが突然終了しています。要素が開きっぱなしです。最後に開いた要素は '%s' です。" + +#: ../glib/gmarkup.c:1740 +#, c-format +msgid "Document ended unexpectedly, expected to see a close angle bracket ending the tag <%s/>" +msgstr "ドキュメントはタグ <%s/> で終了しているものと想定していましたが、突然終了しています。" + +#: ../glib/gmarkup.c:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "要素名の途中でドキュメントが突然終了しています" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "属性名の途中でドキュメントが突然終了しています" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "要素の開始タグの途中でドキュメントが突然終了しています" + +#: ../glib/gmarkup.c:1763 +msgid "Document ended unexpectedly after the equals sign following an attribute name; no attribute value" +msgstr "属性名の後にある等号記号の次でドキュメントが突然終了しています: 属性値がありません" + +#: ../glib/gmarkup.c:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ドキュメントが属性値の途中で突然終了しています" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ドキュメントが要素 '%s' の閉じタグの途中で突然終了しています" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ドキュメントがコメントあるいはプロセシング指示子の途中で突然終了しています" + +#: ../glib/goption.c:747 +msgid "Usage:" +msgstr "用法:" + +#: ../glib/goption.c:747 +msgid "[OPTION...]" +msgstr "[オプション...]" + +#: ../glib/goption.c:853 +msgid "Help Options:" +msgstr "ヘルプのオプション:" + +#: ../glib/goption.c:854 +msgid "Show help options" +msgstr "ヘルプのオプションを表示する" + +#: ../glib/goption.c:860 +msgid "Show all help options" +msgstr "ヘルプのオプションをすべて表示する" + +#: ../glib/goption.c:922 +msgid "Application Options:" +msgstr "アプリケーションのオプション:" + +#: ../glib/goption.c:984 ../glib/goption.c:1054 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s の整数値 '%1$s' を解析できません" + +#: ../glib/goption.c:994 ../glib/goption.c:1062 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s の整数値 '%1$s' は範囲外の値です" + +#: ../glib/goption.c:1019 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s の実数値 '%1$s' を解析できません" + +#: ../glib/goption.c:1027 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s の実数値 '%1$s' は範囲外の値です" + +#: ../glib/goption.c:1290 ../glib/goption.c:1369 +#, c-format +msgid "Error parsing option %s" +msgstr "オプション %s の解析中にエラー" + +#: ../glib/goption.c:1400 ../glib/goption.c:1513 +#, c-format +msgid "Missing argument for %s" +msgstr "%s の引数がありません" + +#: ../glib/goption.c:1966 +#, c-format +msgid "Unknown option %s" +msgstr "%s は不明なオプションです" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "不正なオブジェクト" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "内部エラーまたは不正なオブジェクト" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "メモリが足りません" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "バックトラック処理の上限に達しました" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "パターンに含まれているアイテムは部分マッチングをサポートしていません" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "条件の後方参照は部分マッチングをサポートしていません" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "再帰の上限に達しました" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "改行フラグの連携が間違っています" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "原因不明のエラー" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "パターンの終端に \\ があります" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "パターンの終端に \\c があります" + +#: ../glib/gregex.c:335 +#, fuzzy +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "認識できない文字の後ろに \\ があります" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "量指定子 '{}' の中にある数値の順番が間違っています" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "量指定子 '{}' の中にある数値が大きすぎます" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "文字クラスを表す終端文字 '] ' がありません" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "文字クラスの中に無効なエスケープ・シーケンスがあります" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "文字クラスで文字の順番が間違っています" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "繰り返すものがありません" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "想定外の繰り返しです" + +#: ../glib/gregex.c:360 +#, fuzzy +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "'(?' の後ろに認識できない文字があります" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX の名前付きクラスはクラスの内部でのみ利用できます" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "終端文字の ')' がありません" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "存在しないサブパターンへの参照です" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "コメントの後ろに ')' がありません" + +#: ../glib/gregex.c:375 +#, fuzzy +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "正規表現が長すぎます" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "メモリの確保に失敗しました" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "開始文字 '(' が無い終端文字 ')'" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "コードがオーバーフローしました" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "'(?<' の後ろに認識できない文字があります" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "後読み (lookbehind assertion) が固定長ではありません" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "'(?(' の後ろに不正な形式の数値または名前があります" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "条件グループに二つ以上のブランチがあります" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "'(?R' または '(?[+-]数値' の後には ')' が続く必要があります" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "不明な POSIX のクラス名" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX では照合順序の要素はサポートしていません" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} の中にある文字値が大きすぎます" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "条件の '(?(0)' が間違っています" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "後読みのアサーションでは \\C を指定できません" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "繰り返しの呼び出しが無限ループになっています" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P の後ろに認識できない文字があります" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "サブパターンの名前に終端文字がありません" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "二つある名前付きサブパターンが同じ名前です" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "不正な \\P または \\p のシーケンスです" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P または \\p の後ろにあるプロパティ名が不明です" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "サブパターンの名前が長すぎます (32 文字以下にしてください)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "名前付きサブパターンが多すぎます (10,000 個以下にしてください)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "8進数値が \\377 よりも大きいです" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "正規表現をコンパイルする領域で上限を超えました" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "直前にチェックしたサブパターンのリファレンスが見つかりませんでした" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE グループに1つ以上のブランチが含まれています" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "NEWLINE オプションに矛盾があります" + +#: ../glib/gregex.c:476 +#, fuzzy +#| msgid "\\g is not followed by a braced name or an optionally braced non-zero number" +msgid "\\g is not followed by a braced, angle-bracketed, or quoted name or number, or by a plain number" +msgstr "ブレース名の後ろに \\g が存在していないか、または0以外の数値でブレースしています" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "" + +#: ../glib/gregex.c:492 +#, fuzzy +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "サブパターンの名前に終端文字がありません" + +#: ../glib/gregex.c:495 +#, fuzzy +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "数値を想定していました" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" + +#: ../glib/gregex.c:501 +#, fuzzy +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "二つある名前付きサブパターンが同じ名前です" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "" + +#: ../glib/gregex.c:510 +#, fuzzy +#| msgid "\\g is not followed by a braced name or an optionally braced non-zero number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "ブレース名の後ろに \\g が存在していないか、または0以外の数値でブレースしています" + +#: ../glib/gregex.c:513 +#, fuzzy +#| msgid "URIs not supported" +msgid "\\N is not supported in a class" +msgstr "URI はサポートしていません" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "" + +#: ../glib/gregex.c:522 +#, fuzzy +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\x{...} の中にある文字値が大きすぎます" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1908 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "正規表現 %s でマッチングしている際にエラー: %s" + +#: ../glib/gregex.c:1328 +msgid "PCRE library is compiled without UTF8 support" +msgstr "お使いの PCRE ライブラリは UTF-8 をサポートしていません" + +#: ../glib/gregex.c:1332 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "お使いの PCRE ライブラリは UTF-8 のプロパティをサポートしていません" + +#: ../glib/gregex.c:1340 +#, fuzzy +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "お使いの PCRE ライブラリは UTF-8 のプロパティをサポートしていません" + +#: ../glib/gregex.c:1399 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "正規表現 %s をコンパイルする際にエラー (%d 文字目): %s" + +#: ../glib/gregex.c:1441 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "正規表現 %s を最適化する際にエラー: %s" + +#: ../glib/gregex.c:2340 +msgid "hexadecimal digit or '}' expected" +msgstr "16進数の数値または '}' を想定していました" + +#: ../glib/gregex.c:2356 +msgid "hexadecimal digit expected" +msgstr "16進数の数値を想定していました" + +#: ../glib/gregex.c:2396 +msgid "missing '<' in symbolic reference" +msgstr "シンボル参照の中に '<' がありません" + +#: ../glib/gregex.c:2405 +msgid "unfinished symbolic reference" +msgstr "中途半端なシンボル参照です" + +#: ../glib/gregex.c:2412 +msgid "zero-length symbolic reference" +msgstr "サイズが0のシンボル参照です" + +#: ../glib/gregex.c:2423 +msgid "digit expected" +msgstr "数値を想定していました" + +#: ../glib/gregex.c:2441 +msgid "illegal symbolic reference" +msgstr "シンボル参照が間違っています" + +#: ../glib/gregex.c:2503 +msgid "stray final '\\'" +msgstr "最後の '\\' に対応するシンボルがありません" + +#: ../glib/gregex.c:2507 +msgid "unknown escape sequence" +msgstr "不明なエスケープ・シーケンスです" + +#: ../glib/gregex.c:2517 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "代替文字列 \"%s\" の %lu 文字目を解析する際にエラー: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "引用テキストが引用記号で始まっていません" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "コマンドライン、あるいはシェルの引用テキストにおいて引用記号の対応が取れていません" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "テキストが '\\' 文字の直後で終了しています (テキストは '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c に対応する引用記号の前でテキストが終了しています (テキストは '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "テキストが空です (あるいは空白のみ)" + +#: ../glib/gspawn.c:216 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "子プロセスからデータを読めません (%s)" + +#: ../glib/gspawn.c:359 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "子プロセスからデータを読み出す際に select() で想定外のエラー (%s)" + +#: ../glib/gspawn.c:444 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() で想定外のエラー (%s)" + +#: ../glib/gspawn.c:863 ../glib/gspawn-win32.c:1239 +#, c-format +msgid "Child process exited with code %ld" +msgstr "" + +#: ../glib/gspawn.c:871 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "" + +#: ../glib/gspawn.c:878 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "" + +#: ../glib/gspawn.c:885 +#, c-format +msgid "Child process exited abnormally" +msgstr "" + +#: ../glib/gspawn.c:1290 ../glib/gspawn-win32.c:344 ../glib/gspawn-win32.c:352 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "子のパイプからデータを取得できませんでした (%s)" + +#: ../glib/gspawn.c:1358 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork 失敗 (%s)" + +#: ../glib/gspawn.c:1506 ../glib/gspawn-win32.c:375 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' というディレクトリへ移動できませんでした (%s)" + +#: ../glib/gspawn.c:1516 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "%s を子プロセスとして起動できませんでした: %s" + +#: ../glib/gspawn.c:1526 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "子プロセスの出力または入力をリダイレクトできません (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "子プロセスを fork できません (%s)" + +#: ../glib/gspawn.c:1543 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "子プロセスの実行時に不明なエラー \"%s\"" + +#: ../glib/gspawn.c:1567 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "子プロセスのパイプから十分なデータを取得できません (%s)" + +#: ../glib/gspawn.c:1640 ../glib/gspawn-win32.c:305 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "子プロセスとの通信用のパイプを作成できませんでした (%s)" + +#: ../glib/gspawn-win32.c:288 +msgid "Failed to read data from child process" +msgstr "子プロセスからデータを取得できませんでした" + +#: ../glib/gspawn-win32.c:381 ../glib/gspawn-win32.c:500 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "子プロセスを起動できませんでした (%s)" + +#: ../glib/gspawn-win32.c:450 +#, c-format +msgid "Invalid program name: %s" +msgstr "プログラム名が無効です: %s" + +#: ../glib/gspawn-win32.c:460 ../glib/gspawn-win32.c:728 +#: ../glib/gspawn-win32.c:1303 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d の引数ベクターに不正な文字列があります: %s" + +#: ../glib/gspawn-win32.c:471 ../glib/gspawn-win32.c:743 +#: ../glib/gspawn-win32.c:1336 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境変数に不正な文字列があります: %s" + +#: ../glib/gspawn-win32.c:724 ../glib/gspawn-win32.c:1284 +#, c-format +msgid "Invalid working directory: %s" +msgstr "作業ディレクトリが不正です: %s" + +#: ../glib/gspawn-win32.c:789 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ヘルパー・プログラムを起動できませんでした (%s)" + +#: ../glib/gspawn-win32.c:1003 +msgid "Unexpected error in g_io_channel_win32_poll() reading data from a child process" +msgstr "g_io_channel_win32_poll() が子プロセスからデータを読み出す際に想定外のエラー" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 の範囲外の文字です" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "変換する入力で無効なシーケンスがあります" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 の範囲外の文字です" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u バイト" + +#: ../glib/gutils.c:2190 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2192 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2195 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2198 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2201 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2204 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gutils.c:2217 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u バイト" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "コマンドライン '%s' の起動が異常終了しました: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "コマンドライン '%s' が非ゼロの終了コード %d で終了しました: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' に対応するサービスレコードがありません" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "空の部分文字列に対する作業領域の上限に達しました" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "ここに大/小文字の変換を行うエスケープ (\\l、\\L、\\u、\\U) を挿入できません" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE グループは繰り返せません" + +#~ msgid "File is empty" +#~ msgstr "ファイルが空です" + +#~ msgid "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "キー・ファイルのキー '%s' の値を解釈できませんでした" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' というファイルの状態を取得する際にエラー: %s" + +#~ msgid "Error connecting: " +#~ msgstr "接続エラー: " + +#~ msgid "Error connecting: %s" +#~ msgstr "接続中にエラー: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix から読み込む際にエラー: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix を閉じる際にエラー: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "UNIXストリームに書き込む際にエラー: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "午前" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "午後" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "返り値の型が正しくありません。'%s' を受け取りましたが、期待したのは '%s' です" + +#~ msgid "Trying to set property %s of type %s but according to the expected interface the type is %s" +#~ msgstr "型 %2$s のプロパティ %1$s を設定しようとしましたが、期待するインターフェイスによれば型は %3$s です" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "コマンド:\n" +#~ " help この情報を表示\n" +#~ " get キーの値を取得\n" +#~ " set キーの値を設定\n" +#~ " reset キーの値をリセット\n" +#~ " monitor キーの変更を監視\n" +#~ " writable キーが書き込み可能かどうか確認\n" +#~ "\n" +#~ "'%s COMMAND --help' でここのコマンドのヘルプを表示できます。\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "スキーマのパスを指定してください" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "キー %s が書き込み可能ではありません\n" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "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 "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.po b/po/ka.po new file mode 100644 index 0000000..ab32f65 --- /dev/null +++ b/po/ka.po @@ -0,0 +1,3826 @@ +# translation of ka.po to Georgian +# Georgian translation for GLIB. +# Copyright © 2006 Ubuntu Georgian Translators. +# This file is distributed under the same license as the GLIB package. +# +# Gia Shervashidze , 2006. +# Vladimer Sichinava ვლადიმერ სიჭინავა , 2007. +msgid "" +msgstr "" +"Project-Id-Version: ka\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2007-09-14 12:15+0200\n" +"Last-Translator: Vladimer Sichinava ვლადიმერ სიჭინავა \n" +"Language-Team: Georgian \n" +"Language: ka\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "მოულოდნელი ატრიბუტი '%s' ელემენტ '%s'-თვის" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ატრიბუტი'%s' ელემენტისთვის '%s' ვერ მოიძებნა" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "უცნობი ჭდე '%s', მოსალოდნელი იყო '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "უცნობი ჭდე '%s' - '%s'-ში" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "მონაცემთა დასტებში მართებული საკვანძო ფაილი ვერ მოიძებნა" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' სანიშნე უკვე არსებობს" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-თვის სანიშნე ვერ მოიძებნა" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში MIME ტიპი არ მითითებულა" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში პირადი ალამი არ მითითებულა" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' სანიშნეში ჯგუფები არ მითითებულა" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "პროგრამისთვის სახელით '%s' არ მითითებულა სანიშნე '%s'" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "შეუძლებელია '%s' exec line-ს გაფართოება, მისამართით URI '%s'" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "კოდური გვერდის \"%s\" გარდაქმნა \"%s\" კოდირებაში არაა რეალიზებული" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ვერ ხერხდება \"%s\" - \"%s\" გარდამქმნელის გახსნა" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "არასრული სიმბოლო შეტანის ტექსტის ბოლოს" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ვერ ხერხდება \"%s\" სიმბოლოს გარდაქმნა კოდირებაში \"%s\"" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI \"%s\" არ გახლავთ აბსოლუტური იდენტიფიკატორი \"file\" სქემის გამოყენებისას" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" +"ლოკალური ფაილის URI იდენტიფიკატორი \"%s\" არ შეიძლება შეიცავდეს სიმბოლოს \"#" +"\"" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI იდენტიფიკატორი \"%s\" მცდარია" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI იდენტიფიკატორის \"%s\" მასპინძლის სახელი მცდარია" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI იდენტიფიკატორი \"%s\" შეიცავ მცდარ საკონტროლო სიმბოლოებს" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "გეზი \"%s\" აბსოლუტური არ გახლავთ" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "მასპინძლის მცდარი სახელი" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y წლის %d %B, %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "იანვარი" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "თებერვალი" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "მარტი" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "აპრილი" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "მაისი" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "ივნისი" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "ივლისი" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "იან" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "თებ" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "მარ" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "აპრ" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "მაი" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ივნ" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ივლ" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ორშაბათი" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "სამშაბათი" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ოთხშაბათი" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ხუთშაბათი" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "პარასკევი" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "შაბათი" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "კვირა" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ორშ" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "სამ" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ოთხ" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ხუთ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "პარ" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "შაბ" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "კვი" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ვერ ხერხდება %lu ბაიტის გამოყოფა \"%s\" ფაილის წასაკითხად" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ფაილიდან \"%s\" წაკითხვის შეცდომა: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ფაილის \"%s\" გახსნის შეცდომა: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ფაილის \"%s\" ატრიბუტების წაკითხვის შეცდომა: ფუნქცია - fstat(): %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ფაილის \"%s\" გახსნის შეცდომა: ფუნქცია - fdopen(): %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის გადარქმევა - '%s': g_rename() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ვერ ვხსნი '%s' ფაილს ჩასაწერად: fdopen() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ვერ ვხურავ '%s' ფაილს: fclose() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "არსებული '%s' ფაილი ვერ ამოიშლება: g_unlink() ვერ შედგა: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "თარგი '%s' მცდარია და '%s'-ს არ უნდა შეიცავდეს" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ნიმუში '%s' არ შეიცავს XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის გახსნა: open() ვერ შედგა: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ვერ მოხერხდა '%s' ფაილის განთავსება: mmap() ვერ შედგა: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "შეცდომა სტრიქონში %d სიმბოლო %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ტექსტი მიუღებელი UTF-8 კოდირებით - მიუღებელი '%s'" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "სიმბოლოს ნომერი '%-.*s' დაუშვებელია" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ცარიელი ერთეული \"&;\"; შესაძლო ერთეულებია: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ერთეულის სახელი \"%s\" უცნობია" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "დოკუმენტი უნდა დაიწყოს ელემეტით (მაგალითად )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"სიმბოლო \"%s\" დაუშვებელია \"<\" სიმბოლოს შემდეგ; ამ სიმბოლოთი ელემენტის " +"სახელის დაწყება არ შეიძლება" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \">\" სიმბოლო ელემენტის \"%s\" ჭდის " +"დასახურად" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ზედმეტი სიმბოლო \"%s\", მოსალოდნელია \"=\"ატრიბუტის სახელის \"%s\" შემდეგ " +"ელემენტისთვის \"%s\"" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"სიმბოლო \"%s\" დაუშვებელია ელემენტის \"%s\" დახურვის ჭდის შემდეგ; დასაშვები " +"სიმბოლოა \">\"" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ელემენტი \"%s\" დაიხურა, არცერთი ელემენტი არაა გახსნილი" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ელემენტი \"%s\" დაიხურა, მაგრამ გახსნილია ელემენტი \"%s\"" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "დოკუმენტი ცარიელია ან მხოლოდ ხარეებს შეიცავს" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "დოკუმენტი დასრულდა უშუალოდ კუთხოვანი ფრჩხილის \"<\" შემდეგ" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა გახსნილი ელემენტებით - \"%s\" ბოლო გახსნილი " +"ელემენტია" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა, მოსალოდნელია ჩამკეტი კუთხოვანი ფრჩხილი <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის სახელის შიგნით" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის გამხსნელი ჭდის შიგნით." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შემდგომი ტოლობის ნიშნის " +"შემდეგ; ატრიბუტის მნიშვნელობა არ მითითებულა" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის მნიშვნელობის შიგნით" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის \"%s\" ჩამკეტი ჭდის შიგნით" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"დოკუმენტი მოულოდნელად დასრულდა კომენტარის ან დამუშავების ინსტრუქციის შიგნით" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "დაზიანებული ობიექტი" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "შიდა შეცდომა ან დაზიანებული ობიექტი" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "მეხსიერებას გარეთ" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "უკან დაბრუნების ლიმიტი ამოწურულია" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "თარგი შეიცავს ნაწილობრივი დამთხვევისთვის მხარდაუჭერელ ელემეტებს" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "შიდა შეცდომა" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "უკუ მიმართვა პირობების სახით მხარდაუჭერელია ნაწილობრივი დამთხვევისთვის" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "რეკურსიის ლიმიტი მიღწეულია" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "სამუშაო გარემოს ცარიელი ქვესტრინგების ლიმიტი მიღწეულია" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "სტრიქონების გადაყვანის ალმების არასწორი კომბინაცია" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "უცნობი შეცდომა" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "არხი არასრული სიმბოლოთი იხურება" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "სიმბოლოს დამოწმება არაა დასრულებული" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "დაიშვა შეცდომა სტანდარტული გამოსახულების %s დამთხვევის ძიების დროს: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ბიბლიოთეკა PCRE-ს არ გააჩნია UTF8-ის მხარდაჭერა" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE ბიბლიოთეკა კომპილირებულია UTF8 კოდირების პარამეტრების მხარდაჭერის გარეშე" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"შეცდომა სტანდარტული გამოსახულება %s-ის კომპილირებისას, სიმბოლო ნომრით %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "შეცდომა სტანდარტული გამოსახულების ოპტიმიზირებისას %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო, ან '}' ბრჭყალი" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "არ მოიძებნა '<', სიმბოლურ მითითებაში" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "დაუსრულებელი სიმბოლური მითითება" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "ნულოვანი სიგრძის სიმბოლური მითითება" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "მოსალოდნელი ნომერი" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "მიუღებელი სიმბოლური მითითება" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "დაბოლოვება '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "უცნობი escape სეკვენცია" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"შეცდომა ჩასანაცვლებელი ტექსტის \"%s\" განაალიზებისას, სიმბოლო ნომრით %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ციტირებული ტექსტი ბრჭყალებით არ იწყება" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "უმართებლო ბრჭყალი ბრძანებაში ან სხვა ტექსტურ გარსში" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ტექსტი დასრულდა უშუალოდ \"\\\" სიმბოლოს შემდეგ. (ტექსტი - \"%s\")" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "ტექსტი დასრულდა %c შესაბამისი ბრჭყალის წინ. (ტექსტი - \"%s\")" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "ტექსტი ცარიელი იყო (ან მხოლოდ ხარეებს შეიცავდა)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "არხის შექმნა ქვეპროცესთან დასაკავშირებლად ვერ მოხერხდა (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "მონაცემთა წაკითხვა ქვეპროცესის არხიდან ვერ მოხერხდა (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "დასტის შექმნა ვერ მოხერხდა \"%s\" (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "პროგრამის მცდარი სახელი: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "მცდარი სტრიქონი არგუმენტის ვექტორში - %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "მცდარი სტრიქონი გარემოში: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "უმართებლო სამუშაო დასტა: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "დახმარების პროგრამის (%s) გამოყენება ვერ მოხერხდა" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"მოულოდნელი შეცდომა ფუნქციაში g_io_channel_win32_poll() ქვეპროცესიდან " +"მონაცემთა წაკითხვისას" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"მოულოდნელი შეცდომა ფუნქციაში select() ქვეპროცესიდან მონაცემთა წაკითხვისას " +"(%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "მოულოდნელი შეცდომა ფუნქციაში waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "განტოტების შეცდომა (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ქვეპროცესის გამოყენება ვერ მოხერხდა \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"ქვეპროცესში შეტანის ან მიღების გადამისამართება გამოყენება ვერ მოხერხდა (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ქვეპროცესის განტოტების შეცდომა (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ქვეპროცესის უცნობი შეცდომა \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ქვეპროცესის არხიდან საკმარის მონაცემთა წაკითხვა ვერ მოხერხდა (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "სიმბოლო UTF-8 რანგს გარეთაა" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "შეტანის ტექსტის გარდაქმნის მცდარი მიმდევრობა" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "სიმბოლო UTF-16 რანგს გარეთაა" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "გამოყენება:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ოპცია...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "დახმარების პარამეტრები:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "დახმარების პარამეტრების ჩვენება" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "დახმარების ყველა პარამეტრის ჩვენება" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "პროგრამის პარამეტრები:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ვერ ვახერხებ მნიშვნელობის წაკითხვას '%s' ელემენტისთვის %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "ვერ ვახერხებ მთელ მნიშვნელობის '%s' წაკითხვას %s ელემენტისთვის" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s რანგს გარეთაა" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "არ არსებული არგუმენტი - %s-თვის" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "უცნობი პარამეტრი %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "ძიების კატალოგებში შეუძლებელია დამოწმებული გასაღების პოვნა" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "ფაილი ჩვეულებრივი არაა" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "ფაილი ცარიელია" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"საკვანძო ფაილი '%s' შეიცავს სტრიქონს, რომელიც არ წარმოადგენს კოდურ წყვილს, " +"ჯგუფს ან კომენტარს" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "ჯგუფის მიუღებელი სახელი: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "საკვანძო ფაილი ჯგუფით არ იწყება" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "საკვანძო ფაილი შეიცავს არარეალიზებულ კოდირებას '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს ჯგუფებს '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც '%s' არაა UTF-8 " +"კოდირებაში" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც ვერ იშიფრება." + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "საკვანძო ფაილი შეიცავს კოდს '%s', რომლის მნიშვნელობაც ვერ იშიფრება." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"საკვანძო ფაილი შეიცავს კოდს '%s' ჯგუფში '%s', რომლის მნიშვნელობაც ვერ " +"იშიფრება." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "საკვანძო ფაილი არ შეიცავს კოდს '%s' ჯგუფში '%s'" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "საკვანძო ფაილი სტრიქონის ბოლოს შეიცავს escape სიმბოლოს" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "საკვანძო ფაილი შეიცავს მცდარ escape მიმდევრობას '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც რიცხვი." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "მთელი მნიშვნელობა '%s' რანგს გარეთაა" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც მძიმის მქონე რიცხვი." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "მნიშვნელობა '%s' ვერ აღიქმება როგორც ლოგიკური ოპერატორი." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "უცნობი შეცდომა" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "სიმბოლო \"%s\" ერთეულის სახელში დაუშვებელია" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "სიმბოლო \"%s\" ერთეულის სახელში დაუშვებელია" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "სიმბოლო \"%s\" ერთეულის სახელში დაუშვებელია" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "დაზიანებული ობიექტი" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +#, fuzzy +msgid "No application is registered as handling this file" +msgstr "პროგრამისთვის სახელით '%s' არ მითითებულა სანიშნე '%s'" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "მასპინძლის მცდარი სახელი" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "შეცდომ \"%s\" დასტის გახსნისას: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "ფაილი ჩვეულებრივი არაა" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "გასაღების მიუღებელი სახელი: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "უცნობი პარამეტრი %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "გარდაქმნის შეცდომა: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ვერ ვქმნი '%s' ფაილს: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "უცნობი შეცდომა" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "შეცდომა სტრიქონში %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "შეცდომის გაანალიზების პარამეტრი: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "მეხსიერებას გარეთ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "შიდა შეცდომა" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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/kk.po b/po/kk.po new file mode 100644 index 0000000..56d7fb5 --- /dev/null +++ b/po/kk.po @@ -0,0 +1,3707 @@ +# glib to kazakh. +# Copyright (C) 2010 HZ +# This file is distributed under the same license as the glib package. +# Baurzhan Muftakhidinov , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-07-11 22:09+0600\n" +"Last-Translator: Baurzhan Muftakhidinov \n" +"Language-Team: Kazakh \n" +"Language: kk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' қате" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Қаңтар" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Ақпан" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Наурыз" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Сәуір" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Мамыр" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Маусым" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Шілде" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Қаң" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Ақп" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Нау" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Сәу" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Мам" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Мау" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Шіл" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Дүйсенбі" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Сейсенбі" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Сәрсенбі" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Бейсенбі" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Жұма" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Сенбі" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Жексенбі" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Дс" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Сс" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Ср" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Бс" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Жм" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Сн" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Жк" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' файлын оқу қатесі: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' файлынан оқу қатесі: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' файлын ашу сәтсіз: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' файлын жасау сәтсіз: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, fuzzy, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%'u байт" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f КБ" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f МБ" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f ГБ" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f ТБ" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f ПБ" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f ЭБ" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f КБ" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f МБ" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f ГБ" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ТБ" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ПБ" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ЭБ" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%'u байт" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f КБ" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' файлын ашу сәтсіз: open() сәтсіз: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' дұрыс аты емес" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' дұрыс аты емес: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "жады жеткіліксіз" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "ішкі қате" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "белгісіз қате" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Қолданылуы:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ОПЦИЯ...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Белгісіз опция %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Қалыпты файл емес" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Файл бос" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Қате топ аты: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Әрекеттен бас тартылды" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s түрі" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' файлын ашу қатесі: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Файлдан оқу қатесі: %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Файлға жазу қатесі: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error statting directory `%s': %s" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "`%s' бумасын жасау қатесі: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' файлын басқару қатесі: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' файлын оқу қатесі: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Файлды жабу қатесі: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' файлын ашу қатесі: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Қате: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' дұрыс аты емес" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' дұрыс аты емес" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' дұрыс аты емес" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Қолданбаны жөнелту қатесі: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Атаусыз" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Мақсат файлы бар болып тұр" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Буманы рекурсивті көшіру мүмкін емес" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "БУМА" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Қате файл аты %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Түбірлік буманың атын ауыстыру мүмкін емес" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Файл атын ауыстыру қатесі: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Файл аты қате" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Файлды ашу қатесі: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Буманы ашу мүмкін емес" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Файлды өшіру қатесі: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Файлды қоқысқа тастау қатесі: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Файлды қоқысқа тастау мүмкін емес: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Буманы жасау қатесі: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Файлды жылжыту қатесі: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Мақсат файлын өшіру қатесі: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' файлын басқару қатесі: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Рұқсаттарды орнату қатесі: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Иесін орнату қатесі: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Файлдан оқу қатесі: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Файлдан іздеу қатесі: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Файлды жабу қатесі: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Файлға жазу қатесі: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' файлын ашу қатесі: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Мақсат файлы бума болып тұр" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Ескі файлды өшіру қатесі: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Белгісіз опция %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Файлды қоқысқа тастау мүмкін емес: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Хабарламаны жіберу сәтсіз: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Символдық сілтемелерге қолдау жоқ" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +msgid "Error sending credentials: " +msgstr "" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Файлдық жүйе түбірі" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Қолданбаны табу мүмкін емес" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Қолданбаны жөнелту қатесі: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Жады жеткіліксіз" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Ішкі қате: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "" + +#~ msgid "PATH" +#~ msgstr "ЖОЛ" diff --git a/po/kn.po b/po/kn.po new file mode 100644 index 0000000..897e521 --- /dev/null +++ b/po/kn.po @@ -0,0 +1,4316 @@ +# 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, 2010, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.kn\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-11-20 06:13+0000\n" +"PO-Revision-Date: 2012-09-23 02:26+0530\n" +"Last-Translator: Shankar Prasad \n" +"Language-Team: American English \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ಗೆ ಬಹಳ ದೊಡ್ಡದಾದ ಎಣಿಕೆ ಮೌಲ್ಯವನ್ನು ರವಾನಿಸಲಾಗಿದೆ" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "ಮೂಲ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕೋರುವಿಕೆಗೆ ಬೆಂಬಲವಿಲ್ಲ" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream ಅನ್ನು ಕಡಿತಗೊಳಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "ಸ್ಟ್ರೀಮ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "ಮೂಲ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಡಿತಗೊಳಿಸಲು ಅನುಮತಿಯ ಇಲ್ಲ" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2129 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "ಕಾರ್ಯವು ರದ್ದುಗೊಂಡಿದೆ" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "ಅಮಾನ್ಯವಾದ ವಸ್ತು, ಆರಂಭಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ಆದಾನದಲ್ಲಿನ ಅಪೂರ್ಣವಾದ ಮಲ್ಟಿಬೈಟ್ ಅನುಕ್ರಮ" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "ಗುರಿಯಲ್ಲಿ ಸಾಕಷ್ಟು ಸ್ಥಳವಿಲ್ಲ" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1584 ../glib/giochannel.c:1626 +#: ../glib/giochannel.c:2470 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "ಪರಿವರ್ತಿತ ಆದಾನದಲ್ಲಿನ ಬೈಟ್ ಅನುಕ್ರಮ ಅಮಾನ್ಯವಾಗಿದೆ" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1591 ../glib/giochannel.c:2482 +#, c-format +msgid "Error during conversion: %s" +msgstr "ಪರಿವರ್ತಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:997 +msgid "Cancellable initialization not supported" +msgstr "ರದ್ದುಗೊಳಿಸಬಹುದಾದ ಆರಂಭಕ್ಕೆ ಬೆಂಬಲವಿಲ್ಲ" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1412 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "'%s' ಅಕ್ಷರಗಳಿಂದ '%s' ಗೆ ಪರಿವರ್ತಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' ನಿಂದ '%s'ಗೆ ಪರಿವರ್ತಕವನ್ನು ತೆರೆಯಲಾಗುತ್ತಿಲ್ಲ" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s ಬಗೆ" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "ಗೊತ್ತಿರದ ಬಗೆ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ಕಡತದ ಬಗೆ" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "ಈ OS ನಲ್ಲಿ GCredentials ಅನ್ನು ಅಳವಡಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "ನಿಮ್ಮ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿಗೆ GCredentials ಬೆಂಬಲವಿಲ್ಲ" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನ ಅನಿರೀಕ್ಷಿತ ಕ್ಷಿಪ್ರ ಅಂತ್ಯ" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "ಬೆಂಬಲವಿರದ `%s' ಕೀಲಿ, `%s' ಎಂಬ ವಿಳಾಸ ನಮೂದಿನಲ್ಲಿ" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "`%s' ಎಂಬ ವಿಳಾಸದಲ್ಲಿ ದೋಷ - ಸಂಪರ್ಕಸ್ಥಾನವು ಗುಣವಿಶೇಷವು ತಪ್ಪಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "`%s' ಎಂಬ ವಿಳಾಸದಲ್ಲಿ ದೋಷ - ಕುಲದ ಗುಣವಿಶೇಷವು ತಪ್ಪಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "`%s' ಎಂಬ ವಿಳಾಸದಲ್ಲಿ ದೋಷ - ಆತಿಥೇಯ ಗುಣವಿಶೇಷವು ಇಲ್ಲ ಅಥವ ತಪ್ಪಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "`%s' ಎಂಬ ವಿಳಾಸದಲ್ಲಿ ದೋಷ - ಸಂಪರ್ಕಸ್ಥಾನ ಗುಣವಿಶೇಷವು ಇಲ್ಲ ಅಥವ ತಪ್ಪಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "`%s' ಎಂಬ ವಿಳಾಸದಲ್ಲಿ ದೋಷ - noncefile ಗುಣವಿಶೇಷವು ಇಲ್ಲ ಅಥವ ತಪ್ಪಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "ಸ್ವಯಂ-ಆರಂಭಗೊಳಿಕೆ ದೋಷ: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "nonce '%s' ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "nonce '%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"nonce '%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: 16 ಬೈಟ್‌ಗಳನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, %d ಅನ್ನು " +"ಪಡೆಯಲಾಗಿದೆ" + +#: ../gio/gdbusaddress.c:741 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "ಆಯ್ಕೆ ಮಾಡಲಾದ ವಿಳಾಸವು ಖಾಲಿ ಇದೆ" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1079 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "ಗೊತ್ತಿರದ ಬಸ್ ಬಗೆ %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "'%s' ಎಂಬ ಕಡತ ಕೋಶಕ್ಕಾಗಿ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"`%s' ಎಂಬ ಕೋಶದ ಅನುಮತಿಗಳು ತಪ್ಪಾಗಿವೆ. 0700 ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, 0%o ಕಂಡುಬಂದಿದೆ" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "%s ಎಂಬ ಕಡತ ಕೋಶವನ್ನು ರಚಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' ಕೀರಿಂಗ್ ಅನ್ನು ಓದಲು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' ಎಂಬ ಹಳೆಯ ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' ಎಂಬ ಲಾಕ್ ಕಡತವನ್ನು ರಚಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "`%s' ಎಂಬ ಲಾಕ್ ಕಡತವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ (ಸಂಪರ್ಕ ತಪ್ಪಿಸಲು) ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "`%s' ಎಂಬ ಲಾಕ್ ಕಡತವನ್ನು ಸಂಪರ್ಕ ತಪ್ಪಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' ಕಡತವನ್ನು ಬರೆಯಲು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(ಅಲ್ಲದೆ, `%s' ಗಾಗಿ ಲಾಕ್ ಅನ್ನು ಮುಕ್ತಗೊಳಿಸುವುದೂ ಸಹ ವಿಫಲಗೊಂಡಿದೆ: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "ಸಂಪರ್ಕವನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "ಕಾಲಾವಕಾಶ ಮುಗಿಯು ಹಂತ ತಲುಪಿದೆ" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"%s ಮಾರ್ಗದಲ್ಲಿನ ಆಬ್ಜೆಕ್ಸಿನಲ್ಲಿ ಅಂತಹ ಯಾವುದೆ ಸಂಪರ್ಕಸಾಧನ `org.freedesktop.DBus." +"Properties' ಲಭ್ಯವಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"`%s' ಗುಣವನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ ಎದುರಾಗಿದೆ: ನಿರೀಕ್ಷಿತ ಬಗೆ `%s' ಆಗಿದೆ ಆದರೆ `%s' " +"ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' ಅಂತಹ ಯಾವುದೆ ಗುಣವಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "%s ಎಂಬ ಗುಣವನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' ಎಂಬ ಗುಣವನ್ನು ಬರೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' ಅಂತಹ ಯಾವುದೆ ಸಂಪರ್ಕಸಾಧನವಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "ಅಂತಹ ಯಾವುದೆ ಸಂಪರ್ಕಸಾಧನವಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "`%s' ಅಂತಹ ಯಾವುದೆ ಸಂಪರ್ಕಸಾಧನವಿಲ್ಲ (%s ಮಾರ್ಗದಲ್ಲಿನ ವಸ್ತುವಿನಲ್ಲಿ)" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "`%s' ಅಂತಹ ಯಾವುದೆ ವಿಧಾನವಿಲ್ಲ" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "ಸಂದೇಶದ ಬಗೆ, `%s', ನಿರೀಕ್ಷಿತ ಬಗೆಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6430 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "ಆಲಿಸುವುವುದನ್ನು ಈಗಾಗಲೆ ಮುಚ್ಚಲಾಗಿದೆ" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "ಬಗೆಯು INVALID ಆಗಿದೆ" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2932 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:2068 +#, fuzzy, c-format +#| msgid "Unable to trash file: %s" +msgid "Unable to get Hardware profile: %s" +msgstr "ಕಡತವನ್ನು ಟ್ರ್ಯಾಶ್ ಮಾಡುವಲ್ಲಿ ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"/var/lib/dbus/machine-id ಅನ್ನು ಅಥವ /etc/machine-id ಅನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:708 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "ಟ್ರ್ಯಾಶ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "'%s' ಎಂಬಲ್ಲಿ nonce ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gdbusserver.c:1041 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "ದೋಷ: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s ಆಯ್ಕೆಯ ಶಬ್ಧಲಕ್ಷಣವನ್ನು ಹೇಳುವಾಗ ದೋಷ" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "ವ್ಯವಸ್ಥೆಯ ಬಸ್‌ಗೆ ಸಂಪರ್ಕ ಕಲ್ಪಿಸು" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "ಅಧಿವೇಶನದ ಬಸ್‌ಗೆ ಸಂಪರ್ಕ ಕಲ್ಪಿಸು" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "ಒದಗಿಸಲಾದ D-ಬಸ್ ವಿಳಾಸ ಬಸ್‌ಗೆ ಸಂಪರ್ಕ ಕಲ್ಪಿಸು" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "ಸಂಪರ್ಕದ ಅಂತ್ಯಬಿಂದುವಿನ ಆಯ್ಕೆಗಳು:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "ಸಂಪರ್ಕದ ಅಂತ್ಯಬಿಂದುವನ್ನು ಸೂಚಿಸುವ ಆಯ್ಕೆಗಳು" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "ಯಾವುದೆ ಸಂಪರ್ಕ ಅಂತ್ಯಬಿಂದುವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "ಅನೇಕ ಸಂಪರ್ಕ ಅಂತ್ಯಬಿಂದುಗಳನ್ನು ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "ಸಂಕೇತ ಮತ್ತು ಸಂಪರ್ಕಸಾಧನದ ಹೆಸರು" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "ಸಂಪರ್ಕ ಸಾಧಿಸುವಲ್ಲಿ ದೋಷ: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "ದೋಷ: ವಸ್ತುವಿನ ಮಾರ್ಗವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "ದೋಷ: %s ಎನ್ನುವುದು ಒಂದು ಮಾನ್ಯವಾದ ಮಾರ್ಗವಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "ದೋಷ: ಸಂಕೇತವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ.\n" + +#: ../gio/gdbus-tool.c:636 +#, fuzzy, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "ದೋಷ: ಸಂಕೇತವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ದೋಷ: %s ಎನ್ನುವುದು ಒಂದು ಮಾನ್ಯವಾದ ಸಂಪರ್ಕಸಾಧನದ ಹೆಸರಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ದೋಷ: %s ಎನ್ನುವುದು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ದೋಷ: %s ಎನ್ನುವುದು ಒಂದು ವಿಶಿಷ್ಟವಾದ ಹೆಸರಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%d ನಿಯತಾಂಕವನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "ಸಂಪರ್ಕವನ್ನು ಅಂಗೀಕರಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "ವಿಧಾನ ಮತ್ತು ಸಂಪರ್ಕಸಾಧನದ ಹೆಸರು" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "ಕಾಲತೀರಿಕೆ ಸೆಕೆಂಡುಗಳು" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "ದೋಷ: ಗುರಿಯನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "ದೋಷ: ವಿಧಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "ದೋಷ: `%s' ವಿಧಾನದ ಹೆಸರನ್ನು ಅಮಾನ್ಯವಾಗಿದೆ\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "%d ನಿಯತಾಂಕವನ್ನು (`%s' ಎಂಬ ಬಗೆ) ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "ಮುದ್ರಣ XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "ಕೇವಲ ಗುಣಗಳನ್ನು ಮಾತ್ರ ಮುದ್ರಿಸು" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1743 +#, fuzzy +msgid "Monitor a remote object." +msgstr "ಭ್ರಷ್ಟಗೊಂಡ ವಸ್ತು" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "ಹೆಸರಿಸಲಾಗದ" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "ಗಣಕತೆರೆ ಕಡತವು Exec ಕ್ಷೇತ್ರವನ್ನು ಸೂಚಿಸಿಲ್ಲ" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "ಅನ್ವಯಕ್ಕೆ ಅಗತ್ಯವಿರುವ ಟರ್ಮಿನಲ್‍ ಅನ್ನು ಪತ್ತೆಮಾಡಲಾಗಲಿಲ್ಲ" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ಬಳಕೆದಾರ ಅನ್ವಯ ಸಂರಚನಾ ಫೋಲ್ಡರ್ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ಬಳಕೆದಾರ MIME ಸಂರಚನಾ ಫೋಲ್ಡರ್ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ಬಳಕೆದಾರನ ಡೆಸ್ಕ್‍ಟಾಪ್ ಕಡತ %s ಅನ್ನು ತೆರೆಯಲಾಗಿಲ್ಲ" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ಗಾಗಿನ ಕಸ್ಟಮ್ ವಿವರಣೆ" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ಡ್ರೈವ್ ಹೊರತಳ್ಳುವುದನ್ನು ಅಥವ eject_with_operation ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ಮಾಧ್ಯಮಕ್ಕಾಗಿ ಪೋಲ್ ಮಾಡುವುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ಆರಂಭಿಸುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ನಿಲ್ಲಿಸುವುದನ್ನು ಡ್ರೈವ್ ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS ಬೆಂಬಲವು ಲಭ್ಯವಿಲ್ಲ" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ಎನ್ಕೋಡಿಂಗಿನಲ್ಲಿ ತಪ್ಪಾದ ಸಂಖ್ಯೆಯ ಟೋಕನ್‌ಗಳು (%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ಎನ್ಕೋಡಿಂಗಿನಲ್ಲಿ ತಪ್ಪಾದ ಸಂಖ್ಯೆಯ ಟೋಕನ್‌ಗಳು (%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ಗಾಗಿ GEmblem ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7214 ../gio/gfile.c:7304 ../gio/gfile.c:7388 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "ಹೊಂದಿರುವ ಮೌಂಟ್ ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2285 +msgid "Can't copy over directory" +msgstr "ಕೋಶಕ್ಕೆ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "ಕೋಶವನ್ನು ಕೋಶಕ್ಕೆ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2294 +msgid "Target file exists" +msgstr "ಸೂಚಿತ ಕಡತವು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "ಕೋಶವನ್ನು ಪುನರಾವರ್ತಿತವಾಗಿ ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:2811 +#, fuzzy +msgid "Splice not supported" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕುಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:2815 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "ವಿಶೇಷ ಕಡತವನ್ನು ಕಾಪಿ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "ಅಮಾನ್ಯವಾದ ಸಿಮ್‍ಲಿಂಕ್ ಮೌಲ್ಯವನ್ನು ಒದಗಿಸಲಾಗಿದೆ" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "ಟ್ರ್ಯಾಶ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ಕಡತದ ಹೆಸರುಗಳು '%c' ಅನ್ನು ಹೊಂದುವಂತಿಲ್ಲ" + +#: ../gio/gfile.c:6279 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "ಪರಿಮಾಣವು ಆರೋಹಿಸುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gfile.c:6387 +msgid "No application is registered as handling this file" +msgstr "ಈ ಪುಟವನ್ನು ನಿಭಾಯಿಸಲು ಯಾವುದೆ ಅನ್ವಯವು ಅನುಸ್ಥಾಪಿತಗೊಂಡಿಲ್ಲ" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ಎನ್ಯುಮರೇಟರ್ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "ಕಡತ ಎನ್ಯುಮರೇಟರಿನಲ್ಲಿ ಕಾರ್ಯವು ಬಾಕಿ ಇದೆ" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "ಸ್ಟ್ರೀಮ್ query_info ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕೋರುವುದು (seek) ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "ಆದಾನ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಡಿತಗೊಳಿಸಲು ಅನುಮತಿಯ ಇಲ್ಲ" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಡಿತಗೊಳಿಸಲು ಅನುಮತಿಯ ಇಲ್ಲ" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ಟೋಕನ್‌ಗಳ ತಪ್ಪಾದ ಸಂಖ್ಯೆ (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "ವರ್ಗದ ಹೆಸರು %s ಗೆ ಪ್ರಕಾರವಿಲ್ಲ" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ಪ್ರಕಾರ %s ವು GIcon ಸಂಪರ್ಕಸಾಧನವನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "ಪ್ರಕಾರ %s ಅನ್ನು ವರ್ಗವಾಗಿಸಿಲ್ಲ" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "ತಪ್ಪಾದ ಆವೃತ್ತಿ ಸಂಖ್ಯೆ: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ಪ್ರಕಾರ %s ವು from_tokens() ಅನ್ನು GIcon ಸಂಪರ್ಕಸಾಧನದ ಮೇಲೆ ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: ../gio/gicon.c:428 +#, fuzzy +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "ಒದಗಿಸಲಾದ ಚಿಹ್ನೆಯ ಎನ್ಕೋಡಿಂಗ್ ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "ಯಾವ ವಿಳಾಸವನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "%u ಎನ್ನುವ ಉದ್ದವು ವಿಳಾಸಕ್ಕೆ ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, fuzzy, c-format +#| msgid "could not get local address: %s" +msgid "Could not parse '%s' as IP address mask" +msgstr "ಸ್ಥಳೀಯ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "ಸಾಕೆಟ್‌ ವಿಳಾಸಕ್ಕಾಗಿ ಸಾಕಷ್ಟು ಸ್ಥಳವಿಲ್ಲ" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "ಬೆಂಬಲವಿರದ ಸಾಕೆಟ್ ವಿಳಾಸ" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಕಾರ್ಯವು ಬಾಕಿ ಇದೆ" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "ಯಾವುದೆ ಮೂಲ ಕೋಶದಲ್ಲಿ '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "ಮೂಲ ಕೋಶದಲ್ಲಿ '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "ಗೊತ್ತಿರದ ಸಂಸ್ಕರಣಾ ಆಯ್ಕೆ \"%s\"" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "ತಾತ್ಕಾಲಿಕ ಕಡತವನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: ../gio/glib-compile-resources.c:340 +#, fuzzy, c-format +#| msgid "Error processing input file with xmllint" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "xmllint ಇನ್‌ಪುಟ್ ಕಡತವನ್ನು ಸಂಸ್ಕರಿಸುವಲ್ಲಿ ದೋಷ" + +#: ../gio/glib-compile-resources.c:396 +#, fuzzy, c-format +#| msgid "Error processing input file with to-pixdata" +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "to-pixdata ಇನ್‌ಪುಟ್ ಕಡತವನ್ನು ಸಂಸ್ಕರಿಸುವಲ್ಲಿ ದೋಷ" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "%s ಕಡತವನ್ನು ಸಂಕುಚನಗೊಳಿಸುವಲ್ಲಿ ದೋಷ" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "ಪಠ್ಯವು <%s> ನ ಒಳಗೆ ಕಾಣಿಸದೆ ಇರಬಹುದು" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "ಓಟ್‌ಪುಟ್ ಕಡತದ ಹೆಸರು" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "ಆಕರದ ತಲೆಬರಹವನ್ನು ಉತ್ಪಾದಿಸು" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "ಅವಲಂಬನೆಯ ಪಠ್ಯವನ್ನು ಉತ್ಪಾದಿಸು" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "ಸಂಪನ್ಮೂಲವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ರಚಿಸಬೇಡ ಮತ್ತು ನೋಂದಾಯಿಸಬೇಡ" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "ನೀವು ಖಚಿತವಾಗಿ ಒಂದು ಕಡತದ ಹೆಸರನ್ನು ಒದಗಿಸಬೇಕು\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " ಅನ್ನು ಈಗಾಗಲೆ ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " ಅನ್ನು ಈಗಾಗಲೆ ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> ಅನ್ನು (ಇನ್ನೂ ಸಹ) ಸೂಚಿಸಲಾಗಿಲ್ಲ." + +#: ../gio/glib-compile-schemas.c:995 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (ನಿರೀಕ್ಷಿತ ಸಾಲು)" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " ಅನ್ನು ಈಗಾಗಲೆ ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " ಅನ್ನು ಈಗಾಗಲೆ ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ಅನ್ನು ಈಗಾಗಲೆ ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "ಈ ಸಂಪೂರ್ಣ ಕಡತವನ್ನು ಕಡೆಗಣಿಸಲಾಗುತ್ತಿದೆ.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "ಈ ಕಡತವನ್ನು ಕಡೆಗಣಿಸಲಾಗುತ್ತಿದೆ.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "ಪೂರ್ವನಿಯೋಜಿತವಾದ ಕೋಶ ಮೇಲ್ವಿಚಾರಕ ಬಗೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ಅಮಾನ್ಯ ಕಡತದ ಹೆಸರು %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ಕಡತವ್ಯವಸ್ಥೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "ಮೂಲ ಕಡತಕೋಶದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗುವುದಿಲ್ಲ" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:1168 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಲಿಲ್ಲ, ಈ ಹೆಸರಿನ ಕಡತವು ಈಗಾಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2158 ../gio/glocalfile.c:2187 +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "ಅಮಾನ್ಯ ಕಡತದ ಹೆಸರು" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "ಕೋಶವನ್ನು ತೆರೆಯಲಾಗಿಲ್ಲ" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:1837 +#, c-format +msgid "Error trashing file: %s" +msgstr "ಕಡತವನ್ನು ಕಸದ ಬುಟ್ಟಿಗೆ ವರ್ಗಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ಕಸದ ಬುಟ್ಟಿ ಕೋಶ %s ಅನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ: %s" + +#: ../gio/glocalfile.c:1881 +msgid "Unable to find toplevel directory for trash" +msgstr "ಕಸದ ಬುಟ್ಟಿಗಾಗಿ ಮೇಲ್ಮಟ್ಟದ ಕೋಶವನ್ನು ಪತ್ತೆಮಾಡಲಾಗಲಿಲ್ಲ" + +#: ../gio/glocalfile.c:1960 ../gio/glocalfile.c:1980 +msgid "Unable to find or create trash directory" +msgstr "ಕಸದ ಬುಟ್ಟಿ ಕಡತಕೋಶವನ್ನು ಪತ್ತೆಮಾಡಲು ಅಥವ ರಚಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/glocalfile.c:2014 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ಟ್ರ್ಯಾಶಿಂಗ್ ಮಾಹಿತಿ ಕಡತವನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/glocalfile.c:2043 ../gio/glocalfile.c:2048 ../gio/glocalfile.c:2128 +#: ../gio/glocalfile.c:2135 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ಕಡತವನ್ನು ಟ್ರ್ಯಾಶ್ ಮಾಡುವಲ್ಲಿ ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/glocalfile.c:2136 ../glib/gregex.c:280 +msgid "internal error" +msgstr "ಆಂತರಿಕ ದೋಷ" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Error creating directory: %s" +msgstr "ಕಡತ ಕೋಶವನ್ನು ರಚಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:2191 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ಕಡತವ್ಯವಸ್ಥೆಯು ಸಾಂಕೇತಿಕ ಕೊಂಡಿಗಳನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಮಾಡುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:2257 ../gio/glocalfile.c:2351 +#, c-format +msgid "Error moving file: %s" +msgstr "ಕಡತವನ್ನು ಸ್ಥಳಾಂತರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:2280 +msgid "Can't move directory over directory" +msgstr "ಕೋಶವನ್ನು ಇನ್ನೊಂದು ಕೋಶಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದಿಲ್ಲ" + +#: ../gio/glocalfile.c:2307 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "ಬ್ಯಾಕ್ ಕಡತವನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ವಿಫಲತೆ" + +#: ../gio/glocalfile.c:2326 +#, c-format +msgid "Error removing target file: %s" +msgstr "ಸೂಚಿತ ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfile.c:2340 +msgid "Move between mounts not supported" +msgstr "ಎರಡು ಆರೋಹಣ ತಾಣಗಳ ನಡುವೆ ವರ್ಗಾಯಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "ವೈಶಿಷ್ಟ್ಯದ ಮೌಲ್ಯವು ಶೂನ್ಯವಲ್ಲದುದಾಗಿರಬೇಕು" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (ನಿರೀಕ್ಷಿತ ಸಾಲು)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "ಅಮಾನ್ಯವಾದ ವಿಸ್ತರಿಸಲ್ಪಟ್ಟ ವೈಶಿಷ್ಟ್ಯದ ಹೆಸರು" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ವಿಸ್ತರಿಸಲ್ಪಟ್ಟ ವೈಶಿಷ್ಟ್ಯ '%s' ಅನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:1435 +msgid " (invalid encoding)" +msgstr " (ಅಮಾನ್ಯ ಸಂಕೇತಿಕರಣ)" + +#: ../gio/glocalfileinfo.c:1629 ../gio/glocalfileoutputstream.c:843 +#, fuzzy, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:1864 +#, fuzzy, c-format +#| msgid "Error stating file descriptor: %s" +msgid "Error when getting information for file descriptor: %s" +msgstr "ಕಡತ ಡಿಸ್ಕ್ರಿಪ್ಟರನ್ನು ವ್ಯಕ್ತಪಡಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:1909 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (uint32 ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: ../gio/glocalfileinfo.c:1927 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (uint64 ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: ../gio/glocalfileinfo.c:1946 ../gio/glocalfileinfo.c:1965 +msgid "Invalid attribute type (byte string expected)" +msgstr "ಅಮಾನ್ಯವಾದ ವೈಶಿಷ್ಟ್ಯದ ಬಗೆ (ಬೈಟ್ ಸಾಲನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು)" + +#: ../gio/glocalfileinfo.c:2000 +msgid "Cannot set permissions on symlinks" +msgstr "ಸಾಂಕೇತಿಕಕೊಂಡಿಗಳಲ್ಲಿ ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/glocalfileinfo.c:2016 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:2067 +#, c-format +msgid "Error setting owner: %s" +msgstr "ಮಾಲಿಕನನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:2090 +msgid "symlink must be non-NULL" +msgstr "ಸಾಂಕೇತಿಕಕೊಂಡಿಯು ಶೂನ್ಯವಾಗಿರುವಂತಿಲ್ಲ" + +#: ../gio/glocalfileinfo.c:2100 ../gio/glocalfileinfo.c:2119 +#: ../gio/glocalfileinfo.c:2130 +#, c-format +msgid "Error setting symlink: %s" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:2109 +msgid "Error setting symlink: file is not a symlink" +msgstr "ಸಾಂಕೇತಿಕ ಕೊಂಡಿಯನ್ನು ಹೊಂದಿಸುವಲ್ಲಿ ದೋಷ: ಕಡತವು ಒಂದು ಸಾಂಕೇತಿಕಕೊಂಡಿಯಾಗಿಲ್ಲ" + +#: ../gio/glocalfileinfo.c:2235 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ಮಾರ್ಪಡಣೆ ಅಥವ ನಿಲುಕಣಾ ಸಮಯವನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:2258 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ಸನ್ನಿವೇಶವು NULL ಆಗಿರಬಾರದು" + +#: ../gio/glocalfileinfo.c:2273 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ಸನ್ನಿವೇಶವನ್ನು ಹೊಂದಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/glocalfileinfo.c:2280 +msgid "SELinux is not enabled on this system" +msgstr "ಈ ಗಣಕದಲ್ಲಿ SELinux ಶಕ್ತವಾಗಿಲ್ಲ" + +#: ../gio/glocalfileinfo.c:2372 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿಸುವುದು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "ಕಡತದಿಂದ ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ಕಡತದಲ್ಲಿ ಕೋರುವಾಗ ದೋಷ: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ಕಡತವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "ಪೂರ್ವನಿಯೋಜಿತವಾದ ಸ್ಥಳೀಯ ಕಡತ ಮೇಲ್ವಿಚಾರಕದ ಬಗೆಯನ್ನು ಪತ್ತೆ ಮಾಡಲಾಗಿಲ್ಲ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "ಕಡತಕ್ಕೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ಹಳೆಯ ಬ್ಯಾಕ್ಅಪ್ ಕೊಂಡಿಯನ್ನು ತೆಗೆದುಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ಬ್ಯಾಕ್ಅಪ್ ಪ್ರತಿಯನ್ನು ನಿರ್ಮಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ತಾತ್ಕಾಲಿಕ ಕಡತದ ಹೆಸರನ್ನು ಬದಲಾಯಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "ಕಡತವನ್ನು ಟ್ರಂಕೇಟ್‍ ಮಾಡುವಲ್ಲಿ ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "ಸೂಚಿತ ಕಡತವು ಒಂದು ಕೋಶವಾಗಿದೆ" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "ಸೂಚಿತ ಕಡತವು ಒಂದು ಸಾಮಾನ್ಯ ಕಡತವಲ್ಲ" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ಕಡತವು ಹೊರಗಿನಿಂದ ಮಾರ್ಪಡಿಸಲ್ಪಟ್ಟಿದೆ" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "ಹಳೆಯ ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "ಅಮಾನ್ಯವಾದ GSeekType ಅನ್ನು ಒದಗಿಸಲಾಗಿದೆ" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "ಅಮಾನ್ಯವಾದ ಕೋರಿಕೆ" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ಅನ್ನು ಕಡಿತಗೊಳಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "ಮೆಮೊರಿ ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಪುನರ್ ಗಾತ್ರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "ಮೆಮೊರಿ ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಪುನರ್ ಗಾತ್ರಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಉಂಟಾಗಿದೆ" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +#, 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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ಆರೋಹಣವು ಹೊಂದಿಕೊಳ್ಳುವ ವಿಷಯದ ಬಗೆಯ ಊಹೆಯನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ಅತಿಥೇಯದ ಹೆಸರು '%s' '[' ಅನ್ನು ಹೊಂದಿದೆ ಆದರೆ ']' ಅನ್ನು ಹೊಂದಿಲ್ಲ" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, fuzzy, c-format +#| msgid "could not get remote address: %s" +msgid "Could not create network monitor: %s" +msgstr "ದೂರಸ್ಥ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:177 +#, fuzzy +#| msgid "could not get remote address: %s" +msgid "Could not get network status: " +msgstr "ದೂರಸ್ಥ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "ಪ್ರದಾನ ಸ್ಟ್ರೀಮ್ ಬರೆಯುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "ಮೂಲ ಸ್ಟ್ರೀಮ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: ../gio/gresolver.c:912 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gresolver.c:962 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ಅನ್ನು ವಿಲೋಮವಾಗಿ ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gresolver.c:1165 ../gio/gresolver.c:1364 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ತಾತ್ಕಾಲಿಕ ದೋಷ ಉಂಟಾಗಿದೆ" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ಅನ್ನು ಪರಿಹರಿಸುವಲ್ಲಿ ದೋಷ" + +#: ../gio/gresolver.c:1203 ../gio/gresolver.c:1264 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:653 +#, fuzzy, c-format +#| msgid "Target file is a directory" +msgid "The resource at '%s' is not a directory" +msgstr "ಸೂಚಿತ ಕಡತವು ಒಂದು ಕೋಶವಾಗಿದೆ" + +#: ../gio/gresourcefile.c:861 +#, fuzzy +#| msgid "Input stream doesn't implement read" +msgid "Input stream doesn't implement seek" +msgstr "ಆದಾನ ಸ್ಟ್ರೀಮ್‍ನಲ್ಲಿ ಓದುವುದನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವುದಿಲ್ಲ" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "ಮುದ್ರಣ ಸಹಾಯ" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"ಗೊತ್ತಿರದ ಆಜ್ಞೆ %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ಬಳಕೆ:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "'%s' ನಂತಹ ಯಾವುದೆ ಕೀಲಿ ಇಲ್ಲ\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "ಒದಗಿಸಲಾದ ಮೌಲ್ಯವು ಮಾನ್ಯವಾದ ವ್ಯಾಪ್ತಿಯ ಹೊರಗಿದೆ\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "KEY ಯ ಮೌಲ್ಯವನ್ನು ಪಡೆದುಕೊ" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "KEY ಮೌಲ್ಯವನ್ನು VALUE ಗೆ ಹೊಂದಿಸು" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "KEY ಅನ್ನು ಪೂರ್ವನಿಯೋಜಿತ ಮೌಲ್ಯಕ್ಕೆ ಮರುಹೊಂದಿಸು" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA ದಲ್ಲಿನ ಎಲ್ಲಾ ಕೀಲಿಗಳನ್ನು ಪೂರ್ವನಿಯೋಜಿತಗಳಿಗೆ ಮರುಹೊಂದಿಸು" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "KEY ಗೆ ಬರೆಯಬಹುದೆ ಎಂದು ಪರೀಕ್ಷಿಸಿ" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ಬಳಕೆ:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:310 +msgid "Invalid socket, not initialized" +msgstr "ಅಮಾನ್ಯವಾದ ಸಾಕೆಟ್, ಆರಂಭಿಸಲಾಗಿಲ್ಲ" + +#: ../gio/gsocket.c:317 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ಅಮಾನ್ಯವಾದ ಸಾಕೆಟ್, ಆರಂಭಿಸುವಿಕೆಯು ವಿಫಲಗೊಂಡಿದೆ ಏಕೆಂದರೆ: %s" + +#: ../gio/gsocket.c:325 +msgid "Socket is already closed" +msgstr "ಸಾಕೆಟ್ ಈಗಾಗಲೆ ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ" + +#: ../gio/gsocket.c:333 ../gio/gsocket.c:3562 ../gio/gsocket.c:3617 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:500 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ಇಂದ GSocket ಅನ್ನು ರಚಿಸಲಾಗುತ್ತಿದೆ: %s" + +#: ../gio/gsocket.c:534 ../gio/gsocket.c:541 ../gio/gsocket.c:557 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ಸಾಕೆಟ್‌ ಅನ್ನು ರಚಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:534 +msgid "Unknown family was specified" +msgstr "ಅಜ್ಞಾತವಾದ ಕುಟುಂಬವನ್ನು ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/gsocket.c:541 +msgid "Unknown protocol was specified" +msgstr "ಅಜ್ಞಾತವಾದ ಪ್ರೊಟೊಕಾಲ್ ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ" + +#: ../gio/gsocket.c:1756 +#, c-format +msgid "could not get local address: %s" +msgstr "ಸ್ಥಳೀಯ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:1799 +#, c-format +msgid "could not get remote address: %s" +msgstr "ದೂರಸ್ಥ ವಿಳಾಸವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:1860 +#, c-format +msgid "could not listen: %s" +msgstr "ಆಲಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:1934 +#, c-format +msgid "Error binding to address: %s" +msgstr "ವಿಳಾಸಕ್ಕೆ ಬದ್ದವಾಗಿರುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:1988 ../gio/gsocket.c:2025 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್‍ ಗುಂಪನ್ನು ಸೇರುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:1989 ../gio/gsocket.c:2026 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "ಮಲ್ಟಿಕ್ಯಾಸ್ಟ್‍ ಗುಂಪನ್ನು ತೊರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:1990 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2210 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ಸಂಪರ್ಕವನ್ನು ಅಂಗೀಕರಿಸುವಾಗ ದೋಷ: %s" + +#: ../gio/gsocket.c:2331 +msgid "Connection in progress" +msgstr "ಸಂಪರ್ಕವು ಪ್ರಗತಿಯಲ್ಲಿದೆ" + +#: ../gio/gsocket.c:2383 ../gio/gsocket.c:4406 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ಬಾಕಿ ಇರುವ ದೋಷವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:2549 +#, c-format +msgid "Error receiving data: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಸ್ವೀಕರಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:2727 +#, c-format +msgid "Error sending data: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಕಳಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:2841 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ಸಾಕೆಟ್‌ ಅನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ: %s" + +#: ../gio/gsocket.c:2920 +#, c-format +msgid "Error closing socket: %s" +msgstr "ದತ್ತಾಂಶವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:3555 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ಸಾಕೆಟ್‌ ಸ್ಥಿತಿಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ: %s" + +#: ../gio/gsocket.c:3833 ../gio/gsocket.c:3914 +#, c-format +msgid "Error sending message: %s" +msgstr "ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:3858 +#, fuzzy +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "ವಿಂಡೋಸ್‌ನಲ್ಲಿ GSocketControlMessage ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gsocket.c:4192 ../gio/gsocket.c:4324 +#, c-format +msgid "Error receiving message: %s" +msgstr "ಸಂದೇಶವನ್ನು ಪಡೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gsocket.c:4425 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "ಪ್ರಾಕ್ಸಿ ಪರಿಚಾರಕ %s ಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಲಾಗಿಲ್ಲ: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s ದೊಂದಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಲಾಗಿಲ್ಲ: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "ಸಂಪರ್ಕ ಹೊಂದಲಾಗಿಲ್ಲ: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "ಸಂಪರ್ಕಸಾಧಿಸುವಲ್ಲಿ ಗೊತ್ತಿರದ ದೋಷ" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +#, fuzzy +msgid "Proxying over a non-TCP connection is not supported." +msgstr "ಪ್ರಕಾರ %s ಅನ್ನು ವರ್ಗವಾಗಿಸಿಲ್ಲ" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "'%s' ಎಂಬ ಪ್ರಾಕ್ಸಿ ಪ್ರೊಟೊಕಾಲ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "ಆಲಿಸುವುವುದನ್ನು ಈಗಾಗಲೆ ಮುಚ್ಚಲಾಗಿದೆ" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ಸೇರಿಸಲಾದ ಸಾಕೆಟ್ ಅನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 '%s' ಎಂಬ IPv6 ವಿಳಾಸವನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 ಪ್ರೊಟೊಕಾಲ್‌ಗಾಗಿ ಬಳಕೆದಾರ ಹೆಸರು ಬಹಳ ಉದ್ದವಾಗಿದೆ." + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 ಪ್ರೊಟೊಕಾಲ್‌ಗಾಗಿನ '%s' ಆತಿಥೇಯಗಣಕದ ಹೆಸರು ಬಹಳದ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "ಪೂರೈಕೆಗಣಕವು ಒಂದು SOCKSv4 ಪ್ರಾಕ್ಸಿ ಪೂರೈಕೆಗಣಕವಾಗಿಲ್ಲ" + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 ಪೂರೈಕೆಗಣಕದ ಮುಖಾಂತರದ ಸಂಪರ್ಕವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "ಪೂರೈಕೆಗಣಕವು SOCKSv5 ಪ್ರಾಕ್ಸಿ ಪೂರೈಕೆಗಣಕವಾಗಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಗಾಗಿ ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಗಾಗಿ GLib ನಿಂದ ಬೆಂಬಲಿತವಾಗಿರದ ದೃಢೀಕರಣ ವಿಧಾನದ ಅಗತ್ಯವಿದೆ." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 ಪ್ರೊಟೊಕಾಲ್‌ಗಾಗಿ ಬಳಕೆದಾರ ಹೆಸರು ಅಥವ ಗುಪ್ತಪದವು ಬಹಳ ಉದ್ದವಾಗಿದೆ." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"ತಪ್ಪು ಬಳಕೆದಾರ ಹೆಸರು ಅಥವ ಗುಪ್ತಪದದ ಕಾರಣದಿಂದಾಗಿ SOCKSv5 ದೃಢೀಕರಣವು ವಿಫಲಗೊಂಡಿದೆ." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 ಪ್ರೊಟೊಕಾಲ್‌ಗಾಗಿನ '%s' ಆತಿಥೇಯಗಣಕದ ಹೆಸರು ಬಹಳದ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಯ ಪೂರೈಕೆಗಣಕವು ಗೊತ್ತಿರದ ವಿಳಾಸದ ಬಗೆಯನ್ನು ಬಳಸುತ್ತದೆ." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "ಆಂತರಿಕ SOCKSv5 ಪ್ರಾಕ್ಸಿಯ ಪೂರೈಕೆಗಣಕ ದೋಷ." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 ಸಂಪರ್ಕವನ್ನು ನಿಯಮಗಳಿಂದ ಅನುಮತಿಸಲ್ಪಟ್ಟಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 ಪೂರೈಕೆಗಣಕ ಮೂಲಕ ಆತಿಥೇಯವನ್ನು ತಲುಪಲಾಗಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಯ ಮೂಲಕ ಜಾಲಬಂಧವನ್ನು ತಲುಪಲಾಗಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಯ ಮೂಲಕದ ಸಂಪರ್ಕವನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಯು 'connect' ಆಜ್ಞೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 ಪ್ರಾಕ್ಸಿಯು ಒದಗಿಸಲಾದ ವಿಳಾಸದ ಬಗೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "ಅಜ್ಞಾತ SOCKSv5 ಪ್ರಾಕ್ಸಿ ದೋಷ." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ಎನ್ಕೋಡಿಂಗ್‌ನ ಆವೃತ್ತಿ %d ಅನ್ನು ನಿಭಾಯಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-ಎನ್ಕೋಡ್ ಮಾಡಲಾದ ಖಾಸಗಿ ಕೀಲಿಯನ್ನು ಡಿಕೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "ಯಾವುದೆ PEM-ಎನ್ಕೋಡ್ ಮಾಡಲಾದ ಖಾಸಗಿ ಕೀಲಿಯು ಕಂಡುಬಂದಿಲ್ಲ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-ಎನ್ಕೋಡ್ ಮಾಡಲಾದ ಖಾಸಗಿ ಕೀಲಿಯನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "ಯಾವುದೆ PEM-ಎನ್ಕೋಡ್ ಮಾಡಲಾದ ಪ್ರಮಾಣಪತ್ರವು ಕಂಡುಬಂದಿಲ್ಲ" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-ಎನ್ಕೋಡ್ ಮಾಡಲಾದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"ಇದು ನಿಮ್ಮ ಪ್ರವೇಶಾಧಿಕಾರವನ್ನು ಬಂಧಿಸುವ ಮುಂಚೆ ಸರಿಯಾದ ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸುವ ನಿಮ್ಮ ಕಡೆಯ " +"ಅವಕಾಶವಾಗಿರುತ್ತದೆ." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"ನಮೂದಿಸಲಾದ ಹಲವಾರು ಗುಪ್ತಪದಗಳು ತಪ್ಪಾಗಿವೆ, ಮತ್ತು ಮುಂದಿನ ಬಾರಿ ನೀವು ವಿಫಲಗೊಂಡರೆ ನಿಮ್ಮ " +"ಪ್ರವೇಶಾಧಿಕಾರವನ್ನು ಬಂಧಿಸಲಾಗುತ್ತದೆ." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "ನಮೂದಿಸಲಾದ ಗುಪ್ತಪದವು ಸರಿಯಾಗಿಲ್ಲ." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:566 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ನಿಯಂತ್ರಣ ಸಂದೇಶವನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, %d ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:576 +msgid "Unexpected type of ancillary data" +msgstr "ಅನಿರೀಕ್ಷಿತ ಬಗೆಯ ಪೂರಕ ದತ್ತಾಂಶ" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ಒಂದು fd ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, ಆದರೆ %d ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "ಅಮಾನ್ಯವಾದ fd ಯನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "ರುಜುವಾತುಗಳನ್ನು ಕಳುಹಿಸುವಲ್ಲಿ ದೋಷ: " + +#: ../gio/gunixconnection.c:497 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "SO_PASSCRED ಅನ್ನು ಸಾಕೆಟ್‌ಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದ್ದರೆ ದೋಷ: %s" + +#: ../gio/gunixconnection.c:506 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:523 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gunixconnection.c:552 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:590 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "ನಿಯಂತ್ರಣ ಸಂದೇಶವನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿರಲಿಲ್ಲ, ಆದರೆ %d ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ" + +#: ../gio/gunixconnection.c:616 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ಕಡತ ವಿವರಣೆಗಾರನನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ಕಡತ ವಿವರಣೆಗಾರನನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ಕಡತವ್ಯವಸ್ಥೆ ಮೂಲ" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ಕಡತ ವಿವರಣೆಗಾರನಿಗೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "ಅಬ್‌ಸ್ಟ್ರಾಕ್ಟ್ ಯುನಿಕ್ಸ್ ಡೊಮೈನ್ ಸಾಕೆಟ್ ವಿಳಾಸಗಳಿಗೆ ಈ ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ಪರಿಮಾಣವು ಹೊರ ತಳ್ಳುವುದನ್ನು ಅಥವ eject_with_operation ಅನ್ನು ಅನ್ವಯಿಸುವುದಿಲ್ಲ" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "ಅನ್ವಯವನ್ನು ಪತ್ತೆಮಾಡಲಾಗುವುದಿಲ್ಲ" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "ಅನ್ವಯವನ್ನು ಆರಂಭಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI ಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 ನಲ್ಲಿ ಅಸೋಸಿಯೇಶನ್ ಬದಲಾವಣೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 ನಲ್ಲಿ ಅಸೋಸಿಯೇಶನ್ ರಚನೆಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "ಹಿಡಿಕೆಯಿಂದ ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "ಹಿಡಿಕೆಯನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "ಹಿಡಿಕೆಗೆ ಬರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "ಸಾಕಷ್ಟು ಮೆಮೊರಿಯು ಲಭ್ಯವಿಲ್ಲ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "ಆಂತರಿಕ ದೋಷ: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "ಹೆಚ್ಚಿನ ಇನ್‌ಪುಟ್‌ನ ಅಗತ್ಯವಿದೆ" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "ಅಮಾನ್ಯವಾದ ಸಂಕುಚನಗೊಂಡ ದತ್ತಾಂಶ" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "ಆಲಿಸಬೇಕಿರುವ ವಿಳಾಸ" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "ವಿಳಾಸವನ್ನು ಮುದ್ರಿಸು" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "ಶೆಲ್ ಸ್ಥಿತಿಯಲ್ಲಿ ವಿಳಾಸವನ್ನು ಮುದ್ರಿಸು" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "ಒಂದು dbus ಸೇವೆಯನ್ನು ಚಲಾಯಿಸು" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "ತಪ್ಪು ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳು\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s'ಘಟಕಕ್ಕೆ ಅನಪೇಕ್ಷಿತ ಗುಣ ವಿಶೇಷ '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' ದ ಘಟಕಕ್ಕೆ '%s' ಗುಣವಿಶೇಷ ಪತ್ತೆಯಾಗಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ಅನಪೇಕ್ಷಿತ ಪದಗುಚ್ಛ '%s', ಪದಗುಚ್ಛ '%s' ವನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' ದ ಒಳಗೆ ಅನಪೇಕ್ಷಿತ ಪದಗುಚ್ಛ '%s" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "ದತ್ತಾಂಶ ಕೋಶದಲ್ಲಿ ಯಾವುದೇ ಮಾನ್ಯ ಬುಕ್ ಮಾರ್ಕ್ ಕಂಡು ಬಂದಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' ಗೆ ಈಗಾಗಲೆ ಒಂದು ಬುಕ್ ಮಾರ್ಕ್ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' ಗೆ ಯಾವುದೇ ಬುಕ್ ಮಾರ್ಕ್ ಕಂಡು ಬಂದಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' ಗಾಗಿನ ಬುಕ್ ಮಾರ್ಕಿನಲ್ಲಿ ಯಾವುದೇ MIME ಪ್ರಕಾರವು ಕಂಡುಬಂದಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' ನ ಬುಕ್ ಮಾರ್ಕಿನಲ್ಲಿ ಯಾವುದೇ ಖಾಸಗಿ ನಿಶಾನೆಯು ಸೂಚಿತವಾಗಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' ಗಾಗಿ ಯಾವುದೇ ಸಮೂಹವು ಸಂಯೋಜಿತವಾಗಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' ಎಂಬ ಹೆಸರಿನ ಯಾವುದೇ ಅನ್ವಯವು '%s' ಗಾಗಿ ಒಂದು ಬುಕ್-ಮಾರ್ಕನ್ನು ನೊಂದಾಯಿಸಿಲ್ಲ" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec ಸಾಲು '%s' ಅನ್ನು URI '%s' ನೊಂದಿಗೆ ವಿಸ್ತರಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "ಆದಾನದ ಕೊನೆಯಲ್ಲಿ ಆಂಶಿಕ ಅಕ್ಷರ ಅನುಕ್ರಮಣೆ" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "fallback '%s' ಅನ್ನು ಸಂಕೇತಸೆಟ್ '%s' ಗೆ ಪರಿವರ್ತಿಸಲಾಗಿಲ್ಲ" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"ಕಡತ\" ವಿಧಾನವನ್ನು ಬಳಸುವ ಒಂದು ಪರಿಪೂರ್ಣವಾದ URI ಅಲ್ಲ" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ಸ್ಥಳೀಯ ಕಡತ URI '%s' ಒಂದು '#' ಅನ್ನು ಹೊಂದಿಲ್ಲದಿರಬಹುದು" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ಅಮಾನ್ಯವಾಗಿದೆ" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' ನ ಅತಿಥೇಯದ ಹೆಸರು ಸರಿಯಿಲ್ಲ" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ಅಮಾನ್ಯವಾಗಿ ನುಣುಚಿಕೊಂಡ ಚಿಹ್ನೆಗಳನ್ನು ಒಳಗೊಂಡಿದೆ" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ಪಥದ ಹೆಸರು '%s' ಒಂದು ಪರಿಪೂರ್ಣವಾದ ಪಥವಲ್ಲ" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "ಅಮಾನ್ಯವಾದ ಅತಿಥೇಯದ ಹೆಸರು" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ಪೂರ್ವಾಹ್ನ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ಅಪರಾಹ್ನ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ಜನವರಿ" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ಫೆಬ್ರವರಿ" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "ಮಾರ್ಚ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ಏಪ್ರಿಲ್" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "ಮೇ" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "ಜೂನ್" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ಜುಲಾಯಿ" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ಆಗಸ್ಟ್‍" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "ಸಪ್ಟೆಂಬರ್" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ಅಕ್ಟೋಬರ್" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "ನವೆಂಬರ್" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ಡಿಸೆಂಬರ್" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ಜನ" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ಫೆಬ್ರ" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "ಮಾ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ಏ" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "ಮೇ" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ಜೂ" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ಜು" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ಆಗಸ್ಟ್‍" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "ಸಪ್ಟೆಂ" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ಅಕ್ಟೊ" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ನವೆಂ" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ಡಿಸೆಂ" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ಸೋಮವಾರ" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "ಮಂಗಳವಾರ" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ಬುಧವಾರ" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ಗುರುವಾರ" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "ಶುಕ್ರವಾರ" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "ಶನಿವಾರ" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ರವಿವಾರ" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ಸೋ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ಮಂ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ಬು" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ಗು" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ಶು" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ಶ" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ರ" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ಕಡತ ಕೋಶ '%s' ವನ್ನು ತೆರೆಯುವಲ್ಲಿ ದೋಷ: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, fuzzy, c-format +#| msgid "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "%lu ಬೈಟ್‍ಗಳನ್ನು, \"%s\" ಕಡತವನ್ನು ಓದುವಂತೆ ನಿಯೋಜಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" +msgstr[1] "%lu ಬೈಟ್‍ಗಳನ್ನು, \"%s\" ಕಡತವನ್ನು ಓದುವಂತೆ ನಿಯೋಜಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ಕಡತ \"%s\" ವು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ಕಡತದಿಂದ ಓದುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ಅನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ಕಡತದಿಂದ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fstat() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ಕಡತವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ: fdopen() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ಕಡತವನ್ನು '%s' ಕ್ಕೆ ಪುನರ್ ನಾಮಕರಣ ಮಾಡುವಲ್ಲಿ: g_rename() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ಕಡತವನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"ಕಡತ '%s' ವನ್ನು ಬರೆಯಲು ಅನುವಾಗುವಣ್ತೆ ತೆರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fdopen() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fwrite() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fflush() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ಕಡತ '%s'ವನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fsync()) ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ಕಡತ '%s' ವನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ವಿಫಲತೆ: fclose() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ '%s' ಕಡತವನ್ನು ತೆಗೆದು ಹಾಕಲಾಗುವುದಿಲ್ಲ: g_unlink() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ಮಾದರಿ '%s' ಅಮಾನ್ಯವಾಗಿದೆ, ಅದು ಒಂದು '%s' ಅನ್ನು ಹೊಂದಿರುವಂತಿಲ್ಲ" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ಮಾದರಿ '%s' ಯು XXXXXX ಅನ್ನು ಹೊಂದಿಲ್ಲ" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕ್ '%s' ಅನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "ಸಾಂಕೇತಿಕ ಲಿಂಕುಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../glib/giochannel.c:1416 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' ನಿಂದ '%s' ಗೆ ಪರಿವರ್ತಕವನ್ನು ತೆರೆಯಲು ಆಗಿಲ್ಲ: %s" + +#: ../glib/giochannel.c:1761 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ನಲ್ಲಿ ಒಂದು ಹಗುರ ಓದನ್ನು ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: ../glib/giochannel.c:1808 ../glib/giochannel.c:2066 +#: ../glib/giochannel.c:2153 +msgid "Leftover unconverted data in read buffer" +msgstr "ಪರಿವರ್ತಿತವಾಗದೆ ಬಾಕಿ ಉಳಿದ ದತ್ತಾಂಶಗಳು ಓದು-ಬಫರಿನಲ್ಲಿ" + +#: ../glib/giochannel.c:1889 ../glib/giochannel.c:1966 +msgid "Channel terminates in a partial character" +msgstr "ಮಾರ್ಗವು ಒಂದು ಆಂಶಿಕ ಅಕ್ಷರದಲ್ಲಿ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ" + +#: ../glib/giochannel.c:1952 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ನಲ್ಲಿ ಒಂದು ಹಗುರ ಓದನ್ನು ಮಾಡಲಾಗಲಿಲ್ಲ" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "ಹುಡುಕು ಕೋಶದಲ್ಲಿ ಮಾನ್ಯ ಕೀಲಿ ಪತ್ತೆಯಾಗಿಲ್ಲ" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "ಒಂದು ಸಾಮಾನ್ಯ ಕಡತವಲ್ಲ" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ಕೀಲಿ ಕಡತವು '%s' ಸಾಲನ್ನು ಹೊಂದಿದೆ, ಇದು ಒಂದು ಕೀಲಿ-ಮೌಲ್ಯ ಜೋಡಿ, ಸಮೂಹ, ಅಥವ ಹೇಳಿಕೆಯಲ್ಲ" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "ಅಮಾನ್ಯ ಸಮೂಹ ಹೆಸರು: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "ಕೀಲಿ ಕಡತವು ಒಂದು ಸಮೂಹದೊಂದಿಗೆ ಆರಂಭಗೊಳ್ಳುವುದಿಲ್ಲ" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "ಅಮಾನ್ಯ ಕೀಲಿ ಹೆಸರು: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಬೆಂಬಲಿತವಲ್ಲದ encoding '%s'ಅನ್ನು ಹೊಂದಿದೆ" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಸಮೂಹ '%s'ವನ್ನು ಹೊಂದಿಲ್ಲ" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿಲ್ಲ" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು UTF-8 ಅಲ್ಲದ ಮೌಲ್ಯವಾದ '%s'ವನ್ನು ಹೊಂದಿದೆ " + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ಕೀಲಿ ಕಡತವು ವಿವರಿಸಲು ಸಾಧ್ಯವಾಗದೆ ಇರುವಂತಹ ಕೀಲಿ '%s'ಯ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿದೆ." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, fuzzy, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು ಸಮೂಹ '%s'ದ್ದಾಗಿದ್ದು ಹಾಗು ಅದರ ಮೌಲ್ಯವನ್ನು " +"ವಿವರಿಸಲಾಗುವುದಿಲ್ಲ." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, fuzzy, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು ಸಮೂಹ '%s'ದ್ದಾಗಿದ್ದು ಹಾಗು ಅದರ ಮೌಲ್ಯವನ್ನು " +"ವಿವರಿಸಲಾಗುವುದಿಲ್ಲ." + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ'%s' ಯನ್ನು ಗುಂಪು '%s'ನಲ್ಲಿ ಹೊಂದಿಲ್ಲ" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "ಕೀಲಿ ಕಡತವು ಸಾಲಿನ ಕೊನೆಯಲ್ಲಿ ಪಾರು ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿದೆ" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ಕೀಲಿ ಕಡತವು ಅಮಾನ್ಯ ಪಾರು ಅನುಕ್ರಮವನ್ನು ಹೊಂದಿದೆ '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ಸಂಖ್ಯೆಯಾಗಿ ಸೂಚಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ವು ವ್ಯಾಪ್ತಿಯನ್ನು ಮೀರಿದೆ" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ತೇಲು ಸಂಖ್ಯೆ ಆಗಿ ವಿವರಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ಮೌಲ್ಯ '%s' ವನ್ನು ಒಂದು ಬೂಲಿಯನ್ ಆಗಿ ವಿವರಿಸಲು ಆಗುವುದಿಲ್ಲ." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"'%s%s%s%s' ಕಡತದಿಂದ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯುವಲ್ಲಿ ವಿಫಲತೆ: fstat() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s ಮಾಡುವಲ್ಲಿ ವಿಫಲತೆ: mmap() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ಕಡತ '%s' ವನ್ನು ತೆರೆಯಲು ವಿಫಲವಾಗಿದೆ: ತೆರೆಯುವುದು() ವಿಫಲಗೊಂಡಿದೆ: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d ಸಾಲಿನ %d ಚಿಹ್ನೆಯಲ್ಲಿ ದೋಷ: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ಹೆಸರಿನಲ್ಲಿ ಅಮಾನ್ಯ UTF-8 ಎನ್ಕೋಡ್ ಆದ ಪಠ್ಯವಿದೆ - ಮಾನ್ಯವಾದ '%s' ಅಲ್ಲ" + +#: ../glib/gmarkup.c:427 +#, fuzzy, c-format +#| msgid "'%s' is not a valid name " +msgid "'%s' is not a valid name" +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ" + +#: ../glib/gmarkup.c:443 +#, fuzzy, c-format +#| msgid "'%s' is not a valid name: '%c' " +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' ಯು ಒಂದು ಮಾನ್ಯವಾದ ಹೆಸರಾಗಿಲ್ಲ: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d ಸಾಲಿನಲ್ಲಿ ದೋಷ: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ಅಕ್ಷರ ಉಲ್ಲೇಖ '%-.*s' ವು ಒಂದು ಅನುಮತಿ ಇರುವ ಅಕ್ಷರವನ್ನು encode ಮಾಡುವುದಿಲ್ಲ" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ಖಾಲಿ ಘಟಕ '&;' ಕಂಡು ಬಂದಿದೆ; ಮಾನ್ಯ ನಮೂದುಗಳೆಂದರೆ: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ನಮೂದಿನ ಹೆಸರು '%-.*s' ತಿಳಿದಿಲ್ಲ" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "ದಸ್ತಾವೇಜುಗಳು ಒಂದು ಅಂಶದಿಂದ ಆರಂಭಗೊಳ್ಳಬೇಕು (e.g. )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' ಅಕ್ಷರವು ಬಂದ ನಂತರ, '%s' ವು ಒಂದು ಮಾನ್ಯವಲ್ಲದ ಅಕ್ಷರವಾಗಿದೆ; ಅದು ಒಂದು ಅಂಶದ ಹೆಸರನ್ನು " +"ಆರಂಭಿಸದೇ ಇರಬಹುದು" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', '%s' ಖಾಲಿ ಅಂಶದ ಟ್ಯಾಗಿನ ಆರಂಭವು ಒಂದು '>' ಅಕ್ಷರದಿಂದ " +"ಕೊನೆಗೊಳ್ಳಬೇಕು ಎಂದು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ಸರಿಯಲ್ಲದ ಅಕ್ಷರ '%s', '%s'ವು '%s' ಅಂಶದ ಗುಣಲಕ್ಷಣ ಹೆಸರಾಗಿದ್ದು ಅದರ ನಂತರ ಒಂದು '=' " +"ಅನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' ವು ಮುಚ್ಚಲ್ಪಟ್ಟ ಅಂಶ ಹೆಸರು '%s' ನಂತರ ಬರುವ ಒಂದು ಮಾನ್ಯವಾದ ಅಕ್ಷರವಲ್ಲ; '>' ವು " +"ಅನುಮತಿ ಇರುವ ಅಕ್ಷರವಾಗಿರುತ್ತದೆ" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ಅಂಶವು '%s' was closed, no element is currently open" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ಅಂಶ '%s' ವು ಮುಚ್ಚಲ್ಪಟ್ಟಿದೆ, ಆದರೆ ಪ್ರಸ್ತುತ ಮುಕ್ತವಾಗಿರುವ ಅಂಶವೆಂದರೆ '%s' ಆಗಿದೆ" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "ದಸ್ತಾವೇಜು ಖಾಲಿಯಾಗಿತ್ತು ಅಥವ ಕೇವಲ ಕೇವಲ ಖಾಲಿ ಜಾಗಗಳನ್ನು ಹೊಂದಿತ್ತು" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಮುಕ್ತ ಕೋನ ಆವರಣ ಚಿಹ್ನೆ '<' ಯ ನಂತರ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ಅಂಶಗಳು ತೆರೆದಿರುವಾಗಲೇ ದಸ್ತಾವೇಜು ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ - '%s' ಯು ತೆರೆಯಲ್ಪಟ್ಟ " +"ಕೊನೆಯ ಅಂಶ" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ದಸ್ತಾವೇಜು ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ, <%s/> ಟ್ಯಾಗಿನ ಕೊನೆಯಲ್ಲಿ ಒಂದು ಮುಕ್ತ ಕೋನ ಆವರಣ " +"ಚಿಹ್ನೆಯನ್ನು ಕಾಣಲು ಅಪೇಕ್ಷಿಸಲಾಗಿತ್ತು" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶದ ಹೆಸರಿನಲ್ಲಿ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣ ಹೆಸರಿನಲ್ಲಿ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶ ತೆರೆಯುವ ಟ್ಯಾಗಿನ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣದ ಹೆಸರಿನ ನಂತರದ ಸಮ ಚಿಹ್ನೆಯ ನಂತರ ಅನಿರೀಕ್ಷಿತವಾಗಿ " +"ಕೊನೆಗೊಂಡಿದೆ; ಯಾವುದೇ ಗುಣಲಕ್ಷಣ ಮೌಲ್ಯವಿಲ್ಲ" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಗುಣಲಕ್ಷಣ ಮೌಲ್ಯದ ಒಳಗಿರುವಾಗ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಅಂಶ'%s'ದ ಮುಚ್ಚಲ್ಪಟ್ಟ ಟ್ಯಾಗಿನ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ದಸ್ತಾವೇಜು ಒಂದು ಹೇಳಿಕೆ ಅಥವ ಪ್ರಕ್ರಿಯೆ ಸೂಚನೆಯ ಒಳಗೆ ಅನಿರೀಕ್ಷಿತವಾಗಿ ಕೊನೆಗೊಂಡಿದೆ" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ಬಳಕೆ:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "ಸಹಾಯ ಆಯ್ಕೆಗಳು:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "ಸಹಾಯ ಆಯ್ಕೆಯನ್ನು ತೋರಿಸು" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "ಎಲ್ಲಾ ಸಹಾಯ ಅಂಶಪಟ್ಟಿಯನ್ನು ತೋರಿಸು" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "ಅನ್ವಯದ ಆಯ್ಕೆಗಳು:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr " for %s ಕ್ಕಾಗಿನ ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ಅನ್ನು ಶಬ್ಧಲಕ್ಷಣ ಹೇಳಲಾಗಿಲ್ಲ" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s ಕ್ಕಾಗಿನ ಪೂರ್ಣಾಂಕ ಮೌಲ್ಯ '%s' ವು ವ್ಯಾಪ್ತಿಯಿಂದ ಹೊರಗಿದೆ" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' ದ %s ಕ್ಕಾಗಿನ ದ್ವಿಮೌಲ್ಯವನ್ನು parse ಮಾಡಲಾಗಿಲ್ಲ" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%s ಕ್ಕಾಗಿನ '%s' ದ್ವಿ ಮೌಲ್ಯವು ವ್ಯಾಪ್ತಿಯಿಂದ ಹೊರಗಿದೆ" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "%s ಆಯ್ಕೆಯ ಶಬ್ಧಲಕ್ಷಣವನ್ನು ಹೇಳುವಾಗ ದೋಷ" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ಗೆ ಆರ್ಗ್ಯುಮೆಂಟ್ ಕಾಣುತ್ತಿಲ್ಲ" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "ಗೊತ್ತಿರದ ಆಯ್ಕೆ %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ಭ್ರಷ್ಟಗೊಂಡ ವಸ್ತು" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "ಆಂತರಿಕ ದೋಷ ಅಥವ ಭ್ರಷ್ಟಗೊಂಡ ವಸ್ತು" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ಮೆಮೊರಿ ಖಾಲಿಯಾಗಿದೆ" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "ಹಿಂಬಾಲಿಸುವ ಮಿತಿ ತಲುಪಿದೆ" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "ಆಂಶಿಕ ಹೊಂದಾಣಿಕೆಗೆ ಬೆಂಬಲಿತವಾಗದ ಅಂಶಗಳನ್ನು ಈ ವಿನ್ಯಾಸವು ಹೊಂದಿದೆ" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"ಆಂಶಿಕ ತಾಳೆಗೆ ಪರಿಸ್ಥಿತಿಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ ಆದ್ದರಿಂದ ಹಿಂಬದಿಯ ಉಲ್ಲೇಖಗಳನ್ನು ಬಳಸಲಾಗುವುದು" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "ರಿಕರ್ಶನ್ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ಹೊಸಸಾಲು ಗುರುತುಗಳ ಅಮಾನ್ಯ ಸಂಯೋಜನೆ" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ತಪ್ಪು ಆಫ್‌ಸೆಟ್‌" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "ಚಿಕ್ಕ utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "ಪುನರಾವರ್ತಿತ ಕುಣಿಕೆ" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ಗೊತ್ತಿರದ ದೋಷ" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ನಮೂನೆಯ ಕೊನೆಯಲ್ಲಿ" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ನಮೂನೆಯ ಕೊನೆಯಲ್ಲಿ" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರಗಳು ಕಂಡುಬರುತ್ತವೆ \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} ಕ್ವಾಂಟಿಫೈರಿನಲ್ಲಿ ಸಂಖ್ಯೆಗಳು ಕ್ರಮದಲ್ಲಿ ಇಲ್ಲ" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} ಕ್ವಾಂಟಿಫಯರಿನಲ್ಲಿನ ಸಂಖ್ಯೆಯು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗವು ಕೊನೆಗೊಳ್ಳಬೇಕಿದ್ದ ] ಕಾಣೆಯಾಗಿದೆ" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗದಲ್ಲಿನ ಪಾರು ಅನುಕ್ರಮವು ಅಮಾನ್ಯವಾಗಿದೆ" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "ಕ್ಯಾರೆಕ್ಟರ್ ವರ್ಗದಲ್ಲಿ ವ್ಯಾಪ್ತಿಯು ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "ಪುನರಾವರ್ತಿಸಲು ಏನೂ ಇಲ್ಲ" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "ಅನಿರೀಕ್ಷಿತ ಪುನರಾವರ್ತನೆ" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? ಅಥವ (?- ನ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ಹೆಸರಿಸಲಾದ ವರ್ಗಗಳು ಕೇವಲ ಒಂದು ವರ್ಗದಲ್ಲಿ ಮಾತ್ರ ಬೆಂಬಲ ಹೊಂದಿರುತ್ತವೆ" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ಕೊನೆಗೊಳಿಸುವ ) ಕಾಣೆಯಾಗಿದೆ" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "ಅಸ್ತಿತ್ವದಲ್ಲಿ ಇರದ ಉಪವಿನ್ಯಾಸದ ಉಲ್ಲೇಖ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ಕಮೆಂಟ್‍ನ ನಂತರ ) ವು ಕಾಣೆಯಾಗಿದೆ" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "ಸಾಧಾರಣ ಗಣಿತೋಕ್ತಿಯು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ಮೆಮೊರಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳಲು ವಿಫಲವಾಗಿದೆ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ತೆರೆಯಲ್ಪಡದೆ (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "ಕೋಡ್ ಓವರ್-ಫ್ಲೋ" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< ಯ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "ಹಿಂದೆನೋಡು ಪ್ರತಿಪಾದನೆಯು ನಿಗದಿತ ಉದ್ದವನ್ನು ಹೊಂದಿಲ್ಲ" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( ನಂತರದ ಸಂಖ್ಯೆ ಅಥವ ಹೆಸರು ವಿರೂಪಗೊಂಡಿದೆ" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "ಶರತ್ತಿನ ಸಮೂಹವು ಎರಡಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಶಾಖೆಗಳನ್ನು ಹೊಂದಿದೆ" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ಅಥವ (?[+-] ಡಿಜಿಟ್‍ಗಳು ) ಅನ್ನು ಅನುಸರಿಸಬೇಕು" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ಗೊತ್ತಿರದ POSIX ವರ್ಗದ ಹೆಸರು" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "ಘಟಕಗಳ POSIX ಹೋಲಿಕೆಯು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ಅನುಕ್ರಮದಲ್ಲಿನ ಅಕ್ಷರ ಮೌಲ್ಯವು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ಸರಿಯಲ್ಲದ (?(0) ಸ್ಥಿತಿ" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ಹಿಂದೆನೋಡು ಪ್ರತಿಪಾದನೆಯಲ್ಲಿ \\C ಗೆ ಅನುಮತಿ ಇಲ್ಲ" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "\\L, \\l, \\N{name}, \\U, ಮತ್ತು \\u ಎಸ್ಕೇಪ್‌ಗಳಿಗೆ ಬೆಂಬಲವಿಲ್ಲ" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "ಪುನರಾವರ್ತಿತ ಕರೆಯು ಅನಿರ್ದಿಷ್ಟವಾಗಿ ಆವರ್ತಿತಗೊಳ್ಳಬಹುದು" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P ಯ ನಂತರ ಗುರುತಿಸಲಾಗದ ಅಕ್ಷರ" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "ಉಪನಮೂನೆಯ ಹೆಸರಿನಲ್ಲಿ ಟರ್ಮಿನೇಟರ್ ಕಾಣಿಸುತ್ತಿಲ್ಲ" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "ಹೆಸರಿಸಲಾದ ಎರಡು ಉಪನಮೂನೆಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "ವಿರೂಪಗೊಂಡ\\P ಅಥವ \\p ಅನುಕ್ರಮ" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ಅಥವ \\p ಯ ನಂತರ ಗೊತ್ತಿರದ ಗುಣಲಕ್ಷಣದ ಹೆಸರು" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ಉಪನಮೂನೆಯ ಹೆಸರು ಬಹಳ ಉದ್ದವಾಗಿದೆ (ಗರಿಷ್ಟ 32 ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬಹುದು)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ಬಹಳಷ್ಟು ಹೆಸರಿಸಲ್ಪಟ್ಟ ಉಪನಮೂನೆಗಳು (ಗರಿಷ್ಟ 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "\\377 ಕ್ಕೂ ದೊಡ್ಡದಾದ ಆಕ್ಟಲ್ ಮೌಲ್ಯ" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "ಸಂಕಲಿಸುವ ಕಾರ್ಯಕ್ಷೇತ್ರವು overran ಆಗಿದೆ" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "ಈ ಮೊದಲು ಪರೀಕ್ಷಿಸಲಾದ ಉಲ್ಲೇಖ ಉಪವಿನ್ಯಾಸ ಕಂಡುಬಂದಿಲ್ಲ" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಶಾಖೆಯನ್ನು ಹೊಂದಿರುವ ಸಮೂಹವನ್ನು DEFINE ಮಾಡು" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "ಅಸಂಜಸವಾದ NEWLINE ಆಯ್ಕೆಗಳು" + +#: ../glib/gregex.c:476 +#, fuzzy +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g ದ ನಂತರ ಒಂದು ಬ್ರೇಸ್ ಆದ ಹೆಸರು ಅಥವ ಆಯ್ಕಾತ್ಮಕ ಬ್ರೇಸ್ ಆದಂತಹ ಶೂನ್ಯವಲ್ಲದ ಸಂಖ್ಯೆ ಇಲ್ಲ" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "ಒಂದು ಸಂಖ್ಯೆಯ ಉಲ್ಲೇಖವು ಶೂನ್ಯವಾಗಿರಬಾರದು" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "(*ACCEPT), (*FAIL), ಅಥವ (*COMMIT) ಗಾಗಿ ಒಂದು ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗೆ ಅನುಮತಿ ಇಲ್ಲ" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ಗುರುತಿಸಲಾಗಿಲ್ಲ" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "ಸಂಖ್ಯೆಯು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& ನಂತರ ಉಪನಮೂನೆಯ ಹೆಸರು ಕಾಣಿಸುತ್ತಿಲ್ಲ" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ ನಂತರ ನಿರೀಕ್ಷಿಸಿಲಾದ ಅಂಕಿ" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" + +#: ../glib/gregex.c:501 +#, fuzzy +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ಹೆಸರಿಸಲಾದ ಎರಡು ಉಪನಮೂನೆಗಳು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿವೆ" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) ಒಂದು ಆರ್ಗ್ಯುಮೆಂಟ್ ಅನ್ನು ಹೊಂದಿರಬೇಕು" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c ನಂತರ ಒಂದು ASCII ಅಕ್ಷರವಿರಬೇಕು" + +#: ../glib/gregex.c:510 +#, fuzzy +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\g ದ ನಂತರ ಒಂದು ಬ್ರೇಸ್ ಆದ ಹೆಸರು ಅಥವ ಆಯ್ಕಾತ್ಮಕ ಬ್ರೇಸ್ ಆದಂತಹ ಶೂನ್ಯವಲ್ಲದ ಸಂಖ್ಯೆ ಇಲ್ಲ" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N ಈ ವರ್ಗದಲ್ಲಿ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "ಬಹಳಷ್ಟು ಮುಂದಿನ ಉಲ್ಲೇಖಗಳು" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), ಅಥವ (*THEN) ದಲ್ಲಿನ ಹೆಸರು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:522 +#, fuzzy +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\x{...} ಅನುಕ್ರಮದಲ್ಲಿನ ಅಕ್ಷರ ಮೌಲ್ಯವು ಬಹಳ ದೊಡ್ಡದಾಗಿದೆ" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು ಹೊಂದಾಣಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "UTF8 ಬೆಂಬಲವಿಲ್ಲದೆ PCRE ಭಂಡಾರವು ಸಂಕಲಿತಗೊಂಡಿದೆ" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "UTF8 ಗುಣಲಕ್ಷಣಗಳ ಬೆಂಬಲವಿಲ್ಲದೆ PCRE ಭಂಡಾರವು ಸಂಕಲಿತಗೊಂಡಿದೆ" + +#: ../glib/gregex.c:1331 +#, fuzzy +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "UTF8 ಗುಣಲಕ್ಷಣಗಳ ಬೆಂಬಲವಿಲ್ಲದೆ PCRE ಭಂಡಾರವು ಸಂಕಲಿತಗೊಂಡಿದೆ" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು char %d ನಲ್ಲಿ ಸಂಕಲಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "ಸಾಮಾನ್ಯ ನಿರೂಪಣೆಯ %s ಅನ್ನು ಸರಳೀಕರಿಸುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "ಷೋಡ-ದಶಮಾನ ಅಂಕಿ ಅಥವ '}' ಅನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿದೆ" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "ಷೋಡ-ದಶಮಾನ ಅಂಕಿಯನ್ನು ಅಪೇಕ್ಷಿಸಲಾಗಿದೆ" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖದಲ್ಲಿ '<' ಕಾಣೆಯಾಗಿದೆ" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "ಅಪೂರ್ಣಗೊಂಡಿರುವ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "ಶೂನ್ಯ-ಉದ್ದದ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "ಅಪೇಕ್ಷಿತ ಅಂಕಿ" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ನಿಯಮ ಬಾಹಿರವಾದ ಸಾಂಕೇತಿಕ ಉಲ್ಲೇಖ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "ಅಪರೂಪದ ಅಂತ್ಯ '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ಗೊತ್ತಿರದ ಪಾರು ಅನುಕ್ರಮ" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ಬದಲಾಯಿಸಲ್ಪಟ್ಟ ಪಠ್ಯ \"%s\"ಅನ್ನು char %lu ನಲ್ಲಿ ಪಾರ್ಸಿಂಗ್ ಮಾಡುವಾಗಿನ ದೋಷ: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ಉದ್ಧರಿತ ಪಠ್ಯವು ಒಂದು ಉದ್ಧರನ ಚಿಹ್ನೆಯಿಂದ ಆರಂಭಗೊಳ್ಳುವುದಿಲ್ಲ" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"ಆಜ್ಞಾ ಸಾಲಿನಲ್ಲಿ ಅಥವ ಇತರೆ ಶೆಲ್ಲಿನಲ್ಲಿ ಉದ್ಧರಿಸಲಾದ ಪಠ್ಯದಲ್ಲಿ ತಾಳೆಯಾಗದ ಉದ್ಧರಣಚಿಹ್ನೆಗಳು" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ಪಠ್ಯವು ಒಂದು '\\' ಅಕ್ಷರದ ನಂತರ ಅಂತ್ಯಗೊಂಡಿತು. (ಪಠ್ಯವು '%s' ಆಗಿತ್ತು)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c ಗಾಗಿನ (ಪಠ್ಯವು '%s' ಆಗಿತ್ತು)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "ಪಠ್ಯವು ಖಾಲಿಯಾಗಿತ್ತು (ಅಥವ ಕೇವಲ ಖಾಲಿಜಾಗಗಳನ್ನು ಹೊಂದಿತ್ತು)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ (%s) ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲ" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ (%s) ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಾಗ select() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ ದೋಷ" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "ಚೈಲ್ಡ್ ಪ್ರಕ್ರಿಯೆ ಸಾಮಾನ್ಯವಲ್ಲದ ರೀತಿಯಲ್ಲಿ ನಿರ್ಗಮಿಸಿದೆ" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "child pipe (%s) ನಿಂದ ಓದುವಲ್ಲಿ ವಿಫಲತೆ" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ಕವಲೊಡೆಸುವಲ್ಲಿ ವಿಫಲತೆ (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ಕೋಶಕ್ಕೆ ಬದಲಾಯಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆ \"%s\" (%s) ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"child ಪ್ರಕ್ರಿಯೆಯ ಆದಾನ ಅಥವ ಪ್ರದಾನವನ್ನು ಪುನರ್ನಿರ್ದೇಶಿಸುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "child ಪ್ರಕ್ರಿಯೆಯನ್ನು ಕವಲೊಡೆಯಲು ವಿಫಲಗೊಂಡಿದೆ (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "child ಪ್ರಕ್ರಿಯೆ \"%s\" ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಾಗ ಗೊತ್ತಿರದ ದೋಷ" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "child pid pipe (%s) ಇಂದ ಸಾಕಷ್ಟು ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ಉಪ ಪ್ರಕ್ರಿಯೆಯೊಂದಿಗೆ ಸಂವಹನಕ್ಕೆ ಪೈಪನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "child ಪ್ರಕ್ರಿಯೆಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಲ್ಲಿ ವಿಫಲತೆ ಎದುರಾಗಿದೆ" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ದಲ್ಲಿರುವ ಆರ್ಗ್ಯುಮೆಂಟ್ ವೆಕ್ಟರಿನಲ್ಲಿನ ಅಮಾನ್ಯ ಸಾಲು: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ಪರಿಸರದಲ್ಲಿನ ಅಮಾನ್ಯ ಸಾಲು: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ಅಮಾನ್ಯ ಕಾರ್ಯಕಾರಿ ಕೋಶ: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ಸಹಾಯಕ ಪ್ರೊಗ್ರಾಂ (%s) ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲತೆ" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"child ಪ್ರಕ್ರಿಯೆ ಯಿಂದ ದತ್ತಾಂಶವನ್ನು ಓದುವಾಗ g_io_channel_win32_poll() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ " +"ದೋಷ" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "ಅಕ್ಷರವು UTF-8 ನ ವ್ಯಾಪ್ತಿ ಇಂದ ಹೊರಗಿದೆ" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "ಆದಾನ ಪರಿವರ್ತನೆಯಲ್ಲಿ ಅಮಾನ್ಯ ಅನುಕ್ರಮ" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "ಅಕ್ಷರವು UTF-16 ನ ವ್ಯಾಪ್ತಿ ಇಂದ ಹೊರಗಿದೆ" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u ಬೈಟ್" +msgstr[1] "%u ಬೈಟ್‌ಗಳು" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s ಬೈಟ್" +msgstr[1] "%s ಬೈಟ್‌ಗಳು" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "waitpid() ನಲ್ಲಿ ಅನಪೇಕ್ಷಿತ ದೋಷ (%s)" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' ಗೆ ಯಾವುದೆ ಸೇವಾ ದಾಖಲೆ ಇಲ್ಲ" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ಖಾಲಿ ಉಪಸಾಲುಗಳಿಗಾಗಿನ ಕಾರ್ಯಕ್ಷೇತ್ರದ ಮಿತಿಯನ್ನು ತಲುಪಲ್ಪಟ್ಟಿದೆ" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "ಕೇಸ್-ಬದಲಾವಣೆಗಳ ಎಸ್ಕೇಪ್‍ಗಳಿಗೆ (\\l, \\L, \\u, \\U) ಅನುಮತಿ ಇಲ್ಲ" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "ಒಂದು ಸಮೂಹವನ್ನು ಮತ್ತೆ ಮತ್ತೆ DEFINE ಮಾಡಲು ಅನುಮತಿ ಇಲ್ಲ" + +#~ msgid "File is empty" +#~ msgstr "ಕಡತವು ಖಾಲಿ ಇದೆ" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "ಕೀಲಿ ಕಡತವು ಕೀಲಿ '%s'ಯನ್ನು ಹೊಂದಿದ್ದು ಅದು ಮೌಲ್ಯವನ್ನು ವಿವರಿಸಲಾಗುವುದಿಲ್ಲ." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' ಕಡತವನ್ನು ವ್ಯಕ್ತಪಡಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#~ msgid "Error connecting: " +#~ msgstr "ಸಂಪರ್ಕಸಾಧಿಸುವಲ್ಲಿ ದೋಷ: " + +#~ msgid "Error connecting: %s" +#~ msgstr "ಸಂಪರ್ಕ ಸಾಧಿಸುವಲ್ಲಿ ದೋಷ: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "ಯುನಿಕ್ಸ್‍ನಿಂದ ಓದುವಲ್ಲಿ ದೋಷ: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "ಯುನಿಕ್ಸ್ ಅನ್ನು ಮುಚ್ಚುವಲ್ಲಿ ದೋಷ: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "ಯುನಿಕ್ಸ್‍ಗೆ ಬರೆಯುವಲ್ಲೆ ದೋಷ: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ಕೋಶವನ್ನು ಇನ್ನೊಂದು ಕೋಶಕ್ಕೆ ಸ್ಥಳಾಂತರಿಸಲಾಗುವುದಿಲ್ಲ" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "ಪ್ರಕಾರ %s ಅನ್ನು ವರ್ಗವಾಗಿಸಿಲ್ಲ" + +#~ msgid "Reached maximum data array limit" +#~ msgstr "ಗರಿಷ್ಟ ದತ್ತಾಂಶ ಅರೆ(array) ಮಿತಿಯನ್ನು ತಲುಪಿದೆ" + +#~ msgid "do not hide entries" +#~ msgstr "ನಮೂದುಗಳನ್ನು ಅಡಗಿಸಬೇಡ" + +#~ msgid "use a long listing format" +#~ msgstr "ದೊಡ್ಡದಾದ ಪಟ್ಟಿಯ ನಮೂನೆಯನ್ನು ಬಳಸು" diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000..458ee53 --- /dev/null +++ b/po/ko.po @@ -0,0 +1,4309 @@ +# 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-2011. +# Seong-ho Cho , 2011-2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-13 22:38+0000\n" +"PO-Revision-Date: 2012-09-15 15:06+0900\n" +"Last-Translator: Seong-ho Cho \n" +"Language-Team: GNOME Korea \n" +"Language: Korean\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s에 넘긴 카운트 값이 너무 큽니다" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "기반 스트림에서 탐색을 지원하지 않습니다" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GMemoryInputStream을 자를 수 없습니다" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "스트림을 이미 닫았습니다" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "기반 스트림에서 자르기를 지원하지 않습니다" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "동작이 취소되었습니다" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "올바른 객체가 아닙니다. 초기화되지 않았습니다" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "입력에서 잘못된 멀티 바이트 시퀀스가 불완전합니다" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "대상에 공간이 부족합니다" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "변환 입력에서 잘못된 바이트 순서" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "변환 중 오류: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "취소 가능한 초기화를 지원하지 않습니다" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "문자셋 '%s'에서 '%s'(으)로 변환은 지원되지 않습니다" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'에서 '%s'(으)로 변환하는 변환기를 열 수 없습니다" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s 형식" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "알 수 없는 형식" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s 파일 형식" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials는 이 OS에서 구현되지 않았습니다" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "이 플랫폼에서는 GCredentials를 지원하지 않습니다" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "예기치 않게 일찍 스트림이 끝났습니다" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "`%s' 키를 주소 항목 `%s'에서 지원하지 않습니다" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"`%s' 주소는 올바르지 않습니다(정확히 1개의 경로, 임시 폴더, 절대 키 중 하나" +"가 필요합니다)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "`%s' 주소 항목에서 의미 없는 키/값의 쌍" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "`%s' 주소에서 오류 - 포트 속성의 형식이 잘못되었습니다" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "`%s' 주소에서 오류 - 패밀리 속성의 형식이 잘못되었습니다" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "주소 항목 `%s'에 콜론(:)이 없습니다" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "키/값 쌍 %d번에(`%s', 주소 항목 `%s') 등호 기호가 없습니다" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "키/값 쌍 %d번에(`%s', 주소 요소 `%s') 키/값의 이스케이프 제거 오류" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"`%s' 주소에서 오류 - unix 트랜스포트에서는 `path'나 `abstract' 키 중 하나를 " +"설정해야 합니다." + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "`%s' 주소에서 오류 - host 속성이 없거나 형식이 잘못되었습니다" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "`%s' 주소에서 오류 - port 속성이 없거나 형식이 잘못되었습니다" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "`%s' 주소에서 오류 - noncefile 속성이 없거나 형식이 잘못되었습니다" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "자동 실행 오류: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"주소 `%2$s'에 대한 `%1$s' 트랜스포트는 알려지지 않았거나 지원하지 않습니다." + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "`%s' nonce 파일을 여는 중 오류: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "`%s' nonce 파일을 읽는 중 오류: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "`%s' nonce 파일을 읽는 중 오류, 16바이트가 있어야 하지만 %d바이트" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "`%s' nonce 파일의 내용을 스트림에 쓰는 중 오류:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "지정된 주소가 빈 문자열입니다" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "setuid 없이 메시지 버스를 시작할 수 없습니다: " + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "machine-id 없이 메시지 버스를 시작할 수 없습니다: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "`%s' 명령을 시작하는데 오류: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(이 창을 닫으려면 아무 글자나 입력하십시오)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "dbus 세션이 실행중이 아니며, 자동실행에 실패했습니다" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"세션 버스 주소를 알아낼 수 없습니다(이 운영체제에서는 구현되지 않았습니다)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE 환경 변수에서 세션 버스 주소를 알아낼 수 없습니다 - 알 " +"수 없는 값 `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"DBUS_STARTER_BUS_TYPE 환경 변수를 설정하지 않았으므로 세션 버스 주소를 알아" +"낼 수 없습니다" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "알 수 없는 버스 형식 (%d)" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "한 줄을 읽으려고 시도하는 중 예상치 못하게 읽을 내용이 부족합니다." + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"한 줄을(안전하게) 읽으려고 시도하는 중 예상치 못하게 읽을 내용이 부족합니다." + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "사용 가능한 모든 인증 방법을 시도했습니다(시도: %s) (사용 가능: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer를 통해 취소됨" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "디렉터리 `%s'의 정보를 가져오는 중 오류 : %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "`%s' 디렉터리의 권한이 잘못되었습니다. 0700이어야 하지만 0%o입니다" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "`%s' 디렉터리를 만드는 중 오류: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "`%s' 키 모음을 읽기 용도로 여는 중 오류: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "`%2$s'의 키 모음 %1$d번 줄의 내용 `%3$s'의 형식이 잘못되었습니다." + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s'의 키 모음 %1$d번 줄의 첫번째 토큰의 내용 `%3$s'의 형식이 잘못되었습니" +"다." + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s'의 키 모음 %1$d번 줄의 두번째 토큰의 내용 `%3$s'의 형식이 잘못되었습니" +"다." + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "`%2$s'의 키 모음 아이디 %1$d의 쿠키를 찾을 수 없습니다" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "오래된 `%s' 잠금 파일을 만드는 중 오류: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "`%s' 잠금 파일을 만드는 중 오류: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(링크가 끊어진) `%s' 잠금 파일을 닫는 중 오류: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "`%s' 잠금 파일을 삭제하는 중 오류: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "`%s' 키 모음을 쓰기 용도로 여는 중 오류: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(추가로 `%s'에 대한 잠금 해제도 실패했습니다: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "연결이 닫혔습니다" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "시간 제한을 넘었습니다" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "클라이언트 연결을 만드는 중 지원하지 않는 플래그가 있습니다" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"경로 %s의 객체에 `org.freedesktop.DBus.Properties' 인터페이스가 없습니다" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "`%s' 속성 설정 오류: `%s' 형식이어야 하지만 `%s'입니다" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' 속성이 없습니다" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' 속성을 읽을 수 없습니다" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' 속성을 쓸 수 없습니다" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' 인터페이스가 없습니다" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "인터페이스가 없습니다" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "경로 %2$s의 객체에 `%1$s' 인터페이스가 없습니다" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "`%s' 메소드가 없습니다" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "메시지 형식이 (`%s') 예상한 `%s' 형식에 맞지 않습니다." + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s의 %1$s 인터페이스 용도로 객체를 이미 내보냈습니다" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "`%s' 메소드가 `%s' 형식을 리턴했지만, `%s' 형식이어야 합니다" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "`%3$s' 서명이 있는 `%2$s' 인터페이스의 `%1$s' 메서드가 없습니다" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "하위 트리를 이미 %s 용도로 내보냈습니다" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "형식이 올바르지 않습니다" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL 메시지: PATH 혹은 MEMBER 헤더 필드가 없습니다" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_CALL 메시지: REPLY_SERIAL 헤더 필드가 없습니다" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR 메시지: REPLY_SERIAL 혹은 ERROR_NAME 헤더 필드가 없습니다" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL 메시지: PATH, INTERFACE 혹은 MEMBER 헤더 필드가 없습니다" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL 메시지: PATH 헤더 필드가 /org/freedesktop/DBus/Local 예약 값을 사용하" +"ê³  있습니다" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL 메시지: INTERFACE 헤더 필드가 org.freedesktop.DBus.Local 예약 값을 사" +"용하고 있습니다" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu 바이트를 읽어야 하지만 파일이 끝났습니다" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"올바른 UTF-8 문자열이 와야 하지만 오프셋 %d에(문자열 길이 %d) 잘못된 바이트" +"가 있습니다. ê·¸ 부분까지 올바른 UTF-8 문자열은 `%s'입니다." + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "`%s' 문자열 뒤에 NUL 바이트가 와야 하지만 %d바이트가 있습니다" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "해석한 `%s' 값이 올바른 D-Bus 객체 경로가 아닙니다" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "해석한 `%s' 값이 올바른 D-Bus 시그너쳐가 아닙니다" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"길이가 %u 바이트인 배열이 있습니다. 최대 길이는 2<<26 바이트입니다. (64MiB)" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "variant에 대해 해석한 값 `%s'은(는) 올바른 D-Bus 시그너쳐가 아닙니다." + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "`%s' 형식 문자열로 GVariant를 D-Bus 전송 형식에서 재구성하는데 오류" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"엔디안 값이 잘못되었습니다. 0x6c ('l') 혹은 0x42가 ('B') 와야 하지만 0x%02x " +"값이 있습니다" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "메이저 프로토콜 버전이 잘못되었습니다. 1이어야 하지만 %d입니다." + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "시그너쳐 `%s'인 시그너쳐 헤더가 있지만 메시지 본문이 비었습니다" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "해석한 `%s' 값이(본문에 대해) 올바른 D-Bus 시그너쳐가 아닙니다" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "메시지에 시그너쳐 헤더가 없지만 메시지 본문이 %u 바이트입니다" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "메시지를 재구성할 수 없습니다: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "`%s' 형식 문자열로 GVariant를 D-Bus 전송 형식으로 만드는데 오류" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "메시지에 파일 서술자가 %d개이지만 헤더 필드에는 %d개입니다 " + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "메시지를 전송 형식으로 만들 수 없습니다: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "메시지 본문에 `%s' 시그너쳐가 있지만 시그너쳐 헤더가 없습니다" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"메시지 본문에 `%s' 형식 시그너쳐가 있지만 헤더 필드의 시그너쳐가 `%s'입니다" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "메시지 본문이 비었지만 헤더 필드의 시그너쳐가 `(%s)'입니다" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "오류 리턴, `%s' 형식의 본문" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "오류 리턴, 빈 본문" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "하드웨어 프로파일을 가져올 수 없습니다: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id나 /etc/machine-id를 읽어들일 수 없습니다:" + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s에 대해 StartServiceByName 호출이 실패했습니다: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr " StartServiceByName(\"%2$s\") 메소드에서 예상치 못한 응답 %1$d번" + +# FIXME: 무슨 뜻? +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"메소드를 호출할 수 없습니다. 프록시는 소유자 없는 알려진 이름이고 프록시가 " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 플래그를 포함해 만들어졌습니다" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "추상 네임스페이스를 지원하지 않습니다" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "서버를 만들 때 nonce 파일을 지정할 수 없습니다" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s'의 nonce 파일에 쓰는 중 오류: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' 문자열은 올바른 D-BUS GUID가 아닙니다" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "지원하지 않는 transport `%s'에서 연결을 받아들일 수 없습니다" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "<명령>" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"명령:\n" +" help 이 정보를 표시합니다\n" +" introspect 원격 객체를 조사합니다\n" +" monitor 원격 객체를 검사합니다\n" +" call 원격 객체를 메소드를 호출합니다\n" +" emit 시그널을 발생합니다\n" +"\n" +"각 명령어의 도움말을 보려면 \"%s <명령> --help\" 명령을 사용하십시오.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "오류: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "introspection XML을 해석하는 중에 오류: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "시스템 버스에 연결" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "세션 버스에 연결" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "지정된 D-Bus 주소에 연결" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "연결 종점 옵션:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "연결 종점을 지정하는 옵션" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "연결 종점을 지정하지 않았습니다" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "여러 개의 연결 종점을 지정했습니다" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "경고: introspection 데이터에 따르면 `%s' 인터페이스가 없습니다\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"경고: introspection 데이터에 따르면 `%s' 메소드가 `%s' 인터페이스에 없습니" +"다\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "추가로 지정할 수 있는 시그널의 대상(고유 이름)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "시그널을 발생할 객체 경로" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "시그널 및 인터페이스 이름" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "시그널을 발생합니다." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "연결하는데 오류: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "오류: 객체 경로를 지정하지 않았습니다.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "오류: '%s'은(는) 올바른 객체 경로가 아닙니다\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "오류: 시그널을 지정하지 않았습니다.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "오류: 시그널은 반드시 완전히 갖춘 이름이어야 합니다.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "오류: '%s'은(는) 올바른 인터페이스 이름이 아닙니다\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "오류: '%s'은(는) 올바른 멤버 이름이 아닙니다\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "오류: '%s'은(는) 올바른 고유 버스 이름이 아닙니다.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "파라미터 %d번 해석 오류: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "연결의 버퍼 내용을 적용하는데 오류: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "메소드를 호출할 대상 이름" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "메소드를 호출할 오브젝트 경로" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "메소드 및 인터페이스 이름" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "시간 제한, 초 단위" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "원격 객체에 대해 메소드를 호출합니다." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "오류: 대상을 지정하지 않았습니다\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "오류: 객체 경로를 지정하지 않았습니다\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "오류: 메소드 이름을 지정하지 않았습니다\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "오류: 메소드 이름 `%s'이(가) 올바르지 않습니다\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "형식 `%2$s'의 파라미터 %1$d번 해석 오류: %3$s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "조사할 대상 이름" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "조사할 객체 경로" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML을 표시합니다" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "하위 항목에 인트로스펙트 적용" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "속성을 표시하기만 합니다" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "원격 객체를 조사합니다." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "감시할 대상 이름" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "감시할 객체 경로" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "원격 객체를 감시합니다." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "이름없음" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "desktop 파일에 Exec 필드를 지정하지 않았습니다" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "프로그램에 필요한 터미널을 찾을 수 없습니다" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "사용자 프로그램 설정 폴더(%s)를 만들 수 없습니다: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "사용자 MIME 설정 폴더(%s)를 만들 수 없습니다: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "프로그램 정보에 아이디가 없습니다" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "%s 사용자 desktop 파일을 만들 수 없습니다" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s에 대한 사용자 설정 정의" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "드라이브가 eject 기능을 구현하지 않았습니다" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "드라이브가 미디어의 폴링을 구현하지 않았습니다" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "드라이브가 start 기능을 구현하지 않았습니다" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "드라이브가 stop 기능을 구현하지 않았습니다" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS 기능을 사용할 수 없습니다" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem 인코딩의 %d 버전을 처리할 수 없습니다" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 인코딩에서 토큰 수가 잘못되었습니다 (%d개)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon 인코딩의 %d 버전을 처리할 수 없습니다" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 인코딩에서 토큰 수가 잘못되었습니다 (%d개)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon에 GEmblem이 없습니다" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "들어 있는 마운트가 없습니다" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "디렉터리를 덮어 써서 복사할 수 없습니다" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "디렉터리를 덮어 써서 디렉터리를 복사할 수 없습니다" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "대상 파일이 있습니다" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "디렉터리를 재귀적으로 복사할 수 없습니다" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "잇기를 지원하지 않습니다" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "파일 쪼개기 오류: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "특수 파일은 복사할 수 없습니다" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "잘못된 심볼릭 링크 값이 주어졌습니다" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "휴지통을 지원하지 않습니다" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "파일 이름에 '%c' 문자가 들어갈 수 없습니다" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "볼륨이 mount를 구현하지 않았습니다" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "이 파일을 처리하는 프로그램을 아무 것도 등록하지 않았습니다" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "이뉴머레이터를 이미 닫았습니다 " + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "파일 이뉴머레이터에 진행 중인 동작이 있습니다" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "스트림이 query_info를 지원하지 않습니다" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "스트림에서 seek를 지원하지 않습니다" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "입력 스트림이 truncate를 허용하지 않습니다" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "스트림에서 truncate를 지원하지 않습니다" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "토큰 수가 잘못되었습니다 (%d개)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "클래스 이름 \"%s\"에 대한 형식이 없습니다" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "\"%s\" 형식은 GIcon 인터페이스를 구현하지 않습니다" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "\"%s\" 형식에 대한 클래스가 없습니다" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "버전 형식이 잘못되었습니다: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "\"%s\" 형식은 GIcon 인터페이스에서 from_token()를 구현하지 않습니다" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "아이콘 인코딩에 저장한 버전을 처리할 수 없습니다" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "주소가 지정되지 않았습니다" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "주소의 길이 %u이(가) 너무 깁니다" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "주소에 접두 길이 이전에 지정된 비트를 포함하고 있습니다" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s'을(를) IP주소 마스크로 해석할 수 없습니다" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "소켓 주소에 공간이 부족합니다" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "소켓 주소를 지원하지 않습니다" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "스트림에 진행 중인 동작이 있습니다" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%s> 요소는 <%s> 안에 쓸 수 없습니다" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "<%s> 요소는 최상위에 쓸 수 없습니다" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "자원에서 %s 파일이 여러번 나타납니다" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "임의의 소스 디렉터리에서 '%s'을(를) 지정하는데 실패" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "현재 디렉터리의 '%s' 지정 실패" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "알 수 없는 처리 옵션 \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "임시 파일 만들기 실패: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint와 입력 파일 처리 중 오류:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata와 입력 파일 처리중 오류:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s 파일 읽는 중 오류: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "%s 파일 압축 중 오류" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> 안에는 문자가 들어갈 수 없습니다" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "출력 파일의 이름" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "<파일>" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "파일들이 어디 있는지 읽어야 할 디렉터리(현재 디렉터리가 기본)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "<디렉터리>" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "대상 파일 이름 확장자가 선택한 형식의 출력을 생성" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "소스 헤더 생성" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "자원 파일에 연결하는데 사용하는 소스코드를 여러분의 코드에 생성" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "의존성 목록 생성" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "자원을 자동으로 만들고 등록하지 마십시오" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "C 식별자 이름은 생성한 소스코드에 대해 사용합니다" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"자원 명세를 자원 파일로 컴파일합니다.\n" +"자원 명세 파일은 .gresource.xml 확장자를 지니며,\n" +"자원 파일은 .gresource라는 확장자를 지닙니다." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "정확히 파일 이름을 하나 지정해야 합니다\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "빈 이름은 허용하지 않습니다" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "'%s' 이름이 잘못되었습니다: 소문자로 시작해야 합니다" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"잘못된 이름 '%s': '%c' 문자가 잘못되었습니다. 소문자, 숫자, 빼기 문자('-')만 " +"허용합니다." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "잘못된 이름 '%s': 두 개 연속된 빼기 기호는 ('--') 허용하지 않습니다." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "잘못된 이름 '%s': 마지막 문자로서 빼기 기호('-')는 안됩니다." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "이름이 올바르지 않습니다 ('%s'): 최대 길이는 1024입니다" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " 태그를 이미 지정했습니다" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "'list-of' 스키마에 키를 추가할 수 없습니다" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " 태그가 이미 있습니다" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" 태그는 태그를 ( 스키마) 감춥" +"니다; 값을 수정하려면 태그를 사용하십시오" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"의 속성으로 'type', 'enum', 'flags' 중에 정확히 하나를 지정해야 합니다" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> 태그를(아직) 정의하지 않았습니다." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "GVariant 형식 문자열('%s')이 올바르지 않습니다" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " 태그가 있지만 스키마는 아무 것도 확장하지 않습니다" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "덮어쓸 태그가 없습니다" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " 태그가 이미 있습니다" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " 태그가 이미 있습니다" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "는 아직 존재하지 않는 '%s' 스키마를 확장합니다" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "는 아직 존재하지 않는 '%s' 스키마의 목록입니다" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "경로와 같이 스키마의 목록이 될 수 없습니다" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "경로와 같이 스키마를 확장할 수 없습니다" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" 태그는 목록이 아닌 스키마를 확장하는 목록입" +"니다" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" 태그는 스키마를 " +"확장하지만, '%s'은(는) '%s'을(를) 확장하지 않습니다." + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "경로를 지정할 경우 슬래시로 시작하고 끝나야 합니다" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "목록의 경로는 ':/'로 끝나야 합니다" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> 태그가 이미 있습니다" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "<%s> 요소는 최상위에 사용할 수 없습니다" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict 옵션을 지정했습니다. 끝냅니다.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "이 파일 전체를 무시합니다.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "이 파일을 무시합니다.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "`%s' 키가 `%s' 스키마에 없습니다(override 파일 `%s')" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; 이 키의 덮어쓰기를 무시합니다.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " 그리고 --strict 옵션을 지정했습니다. 끝냅니다.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "`%s' 키를(`%s' 스키마) 해석하는데 오류(override 파일 `%s'): %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "이 키에 대해 override 무시.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"덮어 쓸 파일 `%3$s', `%2$s' 스키마의 `%1$s' 키 덮어쓰기는 주어진 스키마의 범" +"위에서 벗어납니다" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"override 파일 `%3$s', `%2$s' 스키마의 `%1$s' 키는 올바른 값 중 하나가 아닙니" +"다" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled 파일을 저장할 위치" + +# 옵션 설명 +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "스키마에 오류가 하나라도 있으면 중지합니다" + +# 옵션 설명 +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled 파일을 쓰지 않습니다" + +# 옵션 설명 +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "키 이름을 제한하지 않습니다" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"모든 GSettings 스키마 파일을 스키마 캐시 하나로 컴파일합니다.\n" +"스키마 파일 확장자는 .schema.xml이어야 하고,\n" +"캐시 파일 이름은 gschemas.compile이어야 합니다." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "정확히 디렉터리 이름을 하나 지정해야 합니다\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "스키마 파일이 없습니다: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "아무 것도 하지 않습니다.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "현재 출력 파일을 제거합니다.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "기본 로컬 디렉터리 감시자 형식을 찾을 수 없습니다" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "잘못된 파일 이름 %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "파일 시스템 정보를 가져오는 중 오류: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "루트 디렉터리의 이름을 바꿀 수 없습니다" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "파일 이름 바꾸기 오류: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "파일 이름을 바꿀 수 없습니다. 파일이 이미 있습니다" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "잘못된 파일 이름" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "디렉터리를 열 수 없습니다" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "파일 열기 오류: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "파일 제거 오류: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "파일 버리기 오류: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "휴지통 디렉터리(%s)를 만들 수 없습니다: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "휴지통의 상위 디렉터리를 찾을 수 없습니다" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "휴지통 디렉터리를 찾을 수 없거나 만들 수 없습니다" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "휴지통 정보 파일을 만들 수 없습니다: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "파일을 버릴 수 없습니다: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "내부 오류" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "디렉터리를 만드는 중 오류: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "파일 시스템이 심볼릭 링크를 지원하지 않습니다" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "심볼릭 링크를 만드는 중 오류: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "파일 옮기는 중 오류: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "디렉터리를 덮어 써서 디렉터리를 옮길 수 없습니다" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "백업 파일 만들기가 실패했습니다" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "대상 파일을 제거하는 중 오류: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "다른 마운트 사이에 옮기기는 지원하지 않습니다" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "속성 값은 NULL이 아니어야 합니다" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "잘못된 속성 형식(문자열 필요)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "잘못된 확장 속성 이름" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "확장 속성 '%s' 설정 중 오류: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (잘못된 인코딩)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "`%s' 파일 정보를 가져오는 중 오류: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "파일 서술자 정보를 가져오는 중 오류: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "잘못된 속성 형식(uint32 필요)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "잘못된 속성 형식(uint64 필요)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "잘못된 속성 형식(바이트 문자열 필요)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "심볼릭 링크에는 권한을 설정할 수 없습니다" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "권한 설정 중 오류: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "소유자 설정 중 오류: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "심볼릭 링크는 NULL이 아니어야 합니다" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "심볼릭 링크 설정 중 오류: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "심볼릭 링크 설정 중 오류: 파일이 심볼릭 링크가 아닙니다" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "수정 시각이나 접근 시각을 설정하는데 오류: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 컨텍스트는 NULL이 아니어야 합니다" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux 컨텍스트 설정 중 오류: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "이 시스템은 SELinux를 사용하지 않습니다" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s 속성 설정은 지원하지 않습니다" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "파일을 읽는 중 오류: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "파일을 탐색하는 중 오류: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "파일을 닫는 중 오류: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "기본 로컬 파일 감시자 형식을 찾을 수 없습니다" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "파일에 쓰는 중 오류: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "예전 백업 링크를 제거하는 중 오류: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "백업 사본을 만드는 중 오류: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "임시 파일의 이름을 바꾸는 오류: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "파일을 자르는 중 오류: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' 파일을 여는 중 오류: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "대상 파일이 디렉터리입니다" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "대상 파일이 일반 파일이 아닙니다" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "파일이 외부에서 바뀌었습니다" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "예전 파일을 제거하는 중 오류: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "잘못된 GSeekType이 주어졌습니다" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "잘못된 탐색 요청" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream은 자를 수 없습니다" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "메모리 출력 스트림은 크기를 바꿀 수 없습니다" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "출력 스트림의 크기를 바꾸는데 실패했습니다" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "쓰기를 처리하는데 필요한 메모리 용량이 빈 공간보다 더 큽니다" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "요청한 파일 이동 위치가 스트림의 맨 앞보다 더 앞쪽입니다" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "마운트가 동기식 content type guessing 기능을 구현하지 않았습니다" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' 호스트 이름에 '[' 괄호가 있는데 ']' 괄호가 없습니다" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "도달할 수 없는 네트워크" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "도달할 수 없는 호스트" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "네트워크 감시자를 만들 수 없습니다: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "네트워크 감시자를 만들 수 없습니다:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "네트워크 상태를 가져올 수 없습니다:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "출력 스트림이 write를 구현하지 않았습니다" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "원본 스트림을 이미 닫았습니다" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'의 주소를 알아내는 데 오류: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' 주소의 호스트 이름을 알아내는 데 오류: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s'에 대한 요청 형식에 DNS 레코드가 없습니다" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "일시적으로 '%s' 주소를 알아낼 수 없습니다" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s'의 주소를 알아내는 데 오류" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s'에 대해 수신한 데이터가 마무리 되지 않았습니다" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s'에 있는 자원이 존재하지 않습니다" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s'에 있는 자원에 대해 압축을 푸는데 실패했습니다" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s'에 있는 자원은 디렉터리가 아닙니다" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "입력 스트림에 탐색을 구현하지 않았습니다" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "도움말을 표시합니다" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[<명령>]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "elf 파일에 들어있는 자원의 섹션 나열" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"자원을 나열합니다\n" +"<섹션>이 주어졌다면 이 섹션에 있는 자원만 나열합니다\n" +"<경로>가 주어졌다면 일치하는 자원들만 나열합니다" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "<파일> [<경로>]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "<섹션>" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"자원을 세부적으로 나열합니다\n" +"<섹션>이 주어졌다면 이 섹션의 자원만 나열합니다\n" +"<경로>가 주어졌다면 일치하는 자원들만 나열합니다\n" +"세부사항에는 섹션, 크기, 압축을 포함합니다" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "자원 파일을 stdout으로 추출하기" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "<파일 경로>" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"알 수 없는 명령 %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Usage:\n" +" gresource [--section <섹션>] <명령> [<인수>...]\n" +"\n" +"명령:\n" +" help 이 정보를 보여줍니다\n" +" sections 자원 섹션을 나열합니다\n" +" list 자원을 나열합니다\n" +" details 자원을 세부적으로 나열합니다\n" +" extract 자원을 추출합니다\n" +"\n" +"자세한 도움말을 보려면 'gresource help <명령>' 명령을 실행하십시오.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"사용법:\n" +" gsettings %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "인수:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " <섹션> (추가적) ELF 섹션 이름\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " <명령> 설명할 명령어(옵션)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " <파일> ELF 파일(바이너리 혹은 공유 라이브러리)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" <파일> ELF 파일(바이너리 혹은 공유 라이브러리)\n" +" 혹은 컴파일한 자원 파일\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[<경로>]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " <경로> (추가적) 자원 경로(부분적일 수 있음)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "<경로>" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " <경로> 자원 경로\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "'%s' 스키마가 없습니다\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "'%s' 스키마는 이동 가능하지 않습니다(경로를 지정해서는 안 됩니다)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "'%s' 스키마는 이동 가능합니다(경로를 지정해야 합니다)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "빈 경로를 지정했습니다.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "경로는 슬래시(/)로 시작해야 합니다\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "경로는 슬래시(/)로 끝나야 합니다\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "경로에는 두 개의 연속된 슬래시(//)가 들어 있어서는 안 됩니다\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "'%s' 키가 없습니다\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "지정한 값이 올바른 범위에서 벗어납니다\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "설치한(이동 가능하지 않은) 스키마의 목록을 표시합니다" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "설치한 이동 가능한 스키마의 목록을 표시합니다" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "<스키마>의 키 목록을 표시합니다" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "<스키마>[:<경로>]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "<스키마>의 하위 항목의 목록을 표시합니다" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"키와 값의 목록을 재귀적으로 표시합니다.\n" +"<스키마>가 없으면 모든 키를 표시합니다.\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[<스키마>[:<경로>]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "<키>의 값을 가져옵니다" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "<스키마>:[<경로>] <키>" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "<키>에 대한 올바른 값의 범위를 찾아 봅니다" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "<키>의 값을 <값>으로 설정합니다" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "<스키마>:[<경로>] <키> <값>" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "<키>의 값을 기본값으로 초기화합니다" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "<스키마>에 있는 모든 키의 값을 기본값으로 초기화합니다" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "<키>가 쓰기 가능한지 검사합니다" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"<키>가 바뀌는 사항을 감시합니다.\n" +"<키>를 지정하지 않으면, <스키마>의 모든 키를 감시합니다.\n" +"감시를 중단하려면 ^C를 누르십시오.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "<스키마>[:<경로>] [<키>]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"사용법:\n" +" gsettings [--schemadir <스키마 경로>] <명령> [<인수>...]\n" +"\n" +"명령:\n" +" help 이 정보를 표시합니다\n" +" list-schemas 설치한 스키마 목록을 표시합니다\n" +" list-relocatable-schemas 이동 가능한 스키마 목록을 표시합니다\n" +" list-keys 스키마의 키 목록을 표시합니다\n" +" list-children 스키마의 하위 항목 목록을 표시합니다\n" +" list-recursively 키와 값 목록을 재귀적으로 표시합니다\n" +" range 키의 범위를 알아봅니다\n" +" get 키의 값을 가져옵니다\n" +" set 키의 값을 설정합니다\n" +" reset 키의 값을 초기화합니다\n" +" reset-recursively 키의 값을 재귀적으로 초기화합니다\n" +" writable 키가 쓰기 가능한지 검사합니다\n" +" monitor 바뀌는 사항을 감시합니다\n" +"\n" +"자세한 도움말을 보려면 'gsettings help <명령>' 명령을 실행하십시오.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"사용법:\n" +" gsettings [--schemadir <스키마 경로>] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " <스키마 경로> 추가적인 스키마를 검색하려는 디렉터리\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" <스키마> 스키마의 이름\n" +" <경로> 경로, 이동 가능한 스키마의 경우\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " <키> 스키마 안의 키(옵션)\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " <키> 스키마 안의 키\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " <값> 설정할 값\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "지정한 스키마 이름이 빈 문자열입니다\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "올바른 소켓이 아닙니다. 초기화되지 않았습니다" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "올바른 소켓이 아닙니다. 초기화가 다음 이유로 실패했습니다: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "소켓을 이미 닫았습니다" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "소켓 입출력 시간 제한이 넘었습니다" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "파일 서술자에서 GSocket을 만드는 중: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "소켓을 만들 수 없습니다: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "알 수 없는 계열을 지정했습니다" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "알 수 없는 프로토콜을 지정했습니다" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "로컬 주소를 알아낼 수 없습니다: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "원격 주소를 알아낼 수 없습니다: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "연결을 받을 수 없습니다: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "주소에 연결하는데 오류: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "멀티캐스트 그룹에 참여하는 중 오류: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "멀티캐스트 그룹을 나오는 중 오류: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "소스 지향 멀티캐스트를 지원하지 않습니다" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "연결을 받아들이는데 오류: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "연결이 진행 중입니다" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "밀린 오류를 알아낼 수 없습니다: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "데이터를 받는데 오류: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "데이터를 보내는데 오류: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "소켓을 닫을 수 없습니다: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "소켓을 닫는데 오류: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "소켓 조건을 기다리는 중: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "메시지를 보내는 중 오류: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "윈도우즈에서 GSocketControlMessage를 지원하지 않습니다" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "메시지를 받는데 오류: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials가 이 OS에서 구현되지 않았습니다" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "프록시 서버 %s에 연결할 수 없습니다: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s(으)로 연결할 수 없습니다: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "연결할 수 없습니다: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "연결에 알 수 없는 오류" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "TCP가 아닌 프록시 연결은 지원하지 않습니다." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "\"%s\" 프록시 프로토콜은 지원하지 않습니다." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "리스너를 이미 닫았습니다" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "추가한 소켓이 닫혔습니다" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4는 '%s' IPv6 주소를 허용하지 않습니다" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 프로토콜에 대한 사용자 이름이 너무 깁니다" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 프로토콜에 대한 호스트 이름 '%s'이(가) 너무 깁니다." + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "이 서버는 SOCKSv4 프록시 서버가 아닙니다." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 서버를 통한 연결이 거부되었습니다." + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "이 서버는 SOCKSv5 프록시 서버가 아닙니다." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 프록시에 인증이 필요합니다." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "이 SOCKSv5 프록시는 GLib이 지원하지 않는 인증 방식을 사용합니다." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 프로토콜에 대한 사용자 이름 또는 암호가 너무 깁니다." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 인증이 잘못된 사용자 이름이나 암호 때문에 실패했습니다." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 프로토콜에 대한 호스트 이름 '%s'이(가) 너무 깁니다" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 프로시 서버가 알 수 없는 주소 형식을 사용합니다." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "내부 SOCKSv5 프로시 서버 오류." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 연결을 규칙에 따라 허용하지 않습니다." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 프록시를 통해 호스트에 연결할 수 없습니다." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 프록시를 통해 네트워크에 연결할 수 없습니다." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 프록시를 통한 연결이 거부되었습니다." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 프록시가 'connect' 명령을 지원하지 않습니다." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 프록시가 해당 주소 형식을 지원하지 않습니다." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "알 수 없는 SOCKSv5 프록시 오류." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon 인코딩의 %d 버전을 처리할 수 없습니다" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM 인코딩된 개인 키를 해독할 수 없습니다" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "PEM 인코딩된 개인 키가 없습니다" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM 인코딩된 개인 키를 해석할 수 없습니다" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "PEM 인코딩된 인증서가 없습니다" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM 인코딩된 인증서를 해석할 수 없습니다" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "이번에 암호를 올바르게 입력하지 않으면 접근이 막힙니다." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "암호 입력이 여러 차례 잘못되었습니다. 계속 실패하면 접근이 막힙니다." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "입력한 암호가 올바르지 않습니다." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "한 개의 제어 메시지가 와야 하지만, %d개를 받았습니다" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "예상치 못한 부속 데이터의 형식입니다" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "한 개의 파일 서술자가 와야 하지만, %d개를 받았습니다\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "올바르지 않은 파일 서술자를 받았습니다" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "암호 데이터를 보내는데 오류: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "소켓에 SO_PASSCRED를 사용하는지 검사하는데 오류: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"소켓에 SO_PASSCRED를 사용하는지 검사하는데 예상치 못한 옵션 길이. %d바이트여" +"야 하지만 %d바이트" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED 사용 오류: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "암호 데이터 1바이트를 읽어야 하지만 0바이트 읽음" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "제어 메시지가 올 수 없지만, %d개를 받았습니다" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED 사용 해제 오류: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "파일 서술자로부터 읽어오는 중 오류: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "파일 서술자를 닫는 중 오류: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "파일 시스템 루트" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "파일 서술자에 쓰는 중 오류: %s" + +# abstract unix domain socket address: 파일시스템과 관계없는 소켓을 말함 +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "추상 유닉스 도메인 소켓 주소는 이 시스템에서 지원하지 않습니다" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "볼륨이 eject 혹은 eject_with_operation 기능을 구현하지 않았습니다" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "프로그램을 찾을 수 없습니다" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "프로그램을 실행하는 중에 오류: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI를 지원하지 않습니다" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "연결 프로그램 바꾸기는 WIN32에서 지원하지 않습니다" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "연결 프로그램 만들기는 WIN32에서 지원하지 않습니다" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "핸들에서 읽는 중 오류: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "핸들을 닫는 중 오류: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "핸들에 쓰는 중 오류: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "메모리가 부족합니다" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "내부 오류: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "입력이 더 필요합니다" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "잘못된 압축 데이터" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "연결을 받아들일 주소" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "GTestDbus와의 호환을 위해 무시합니다" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "주소 출력" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "쉘 모드에서 주소 출력" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "dbus 서비스 실행" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "잘못된 인자\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "예상치 못하게 '%2$s' 요소에 '%1$s' 속성이 있습니다" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' 요소에 '%1$s' 속성이 없습니다" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "예상치 못하게 '%s' 태그가 있습니다. '%s' 태그가 있어야 합니다" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "예상치 못하게 '%2$s' 안에 '%1$s' 태그가 있습니다" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "데이터 디렉터리에 올바른 북마크 파일이 없습니다" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URL에 대한 북마크가 이미 있습니다" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' URL에 대한 북마크가 없습니다" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 MIME 형식이 없습니다" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 개인 플래그가 없습니다" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URL에 대한 북마크에 그룹이 설정되어 있지 않습니다" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s'에 대해 북마크를 등록한 '%s' 이름을 가진 프로그램이 없습니다" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "URI '%s'을(를) 사용해 '%s' 실행줄 확장하기에 실패했습니다" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "입력의 끝에서 부분적인 문자 순서" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "대체 코드셋 '%s'을(를) '%s'(으)로 변환할 수 없습니다" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s'은(는) \"file\" 스키마를 사용하는 절대 경로 URI가 아닙니다" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "로컬 파일 URI '%s'에는 '#'이 들어갈 수 없습니다" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s'이(가) 잘못되었습니다" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'의 호스트 이름이 잘못되었습니다" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'은(는) 잘못된 이스케이프 문자가 들어 있습니다" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "경로이름 '%s'은(는) 절대 경로가 아닙니다" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "잘못된 호스트 이름" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "오전" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "오후" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y년 %b %e일 (%a) %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p %I:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "1월" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "2월" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "3월" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "4월" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "5월" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "6월" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "7월" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "8월" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "9월" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "10월" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "11월" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "12월" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "1월" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "2월" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "3월" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "4월" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "5월" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "6월" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "7월" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "8월" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "9월" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "10월" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "11월" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "12월" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "월요일" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "화요일" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "수요일" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "목요일" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "금요일" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "토요일" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "일요일" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "월" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "화" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "수" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "목" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "금" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "토" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "일" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "디렉터리 '%s' 여는 중 오류 : %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "파일 \"%2$s\"을(를) 읽기 위해 %1$lu 바이트를 할당할 수 없습니다" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "파일 '%s'을(를) 읽는 중 오류: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "파일 \"%s\"이(가) 너무 큽니다" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "파일 '%s'에서 읽기 실패 : %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "파일 '%s' 열기 실패 : %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "파일 '%s'의 속성 가져오기 실패 : fstat() 실패: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "파일 '%s' 열기 실패: fdopen() 실패: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "파일 '%s'의 이름을 '%s'(으)로 바꾸는데 실패: g_rename() 실패: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "파일 '%s' 만들기 실패: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "파일 '%s' 쓰기 용도로 열기 실패: fdopen() 실패: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fwrite() 실패: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fflush() 실패: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "파일 '%s' 쓰기 실패: fsync() 실패: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "파일 '%s' 닫기 실패: fclose() 실패: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "기존의 '%s' 파일을 지울 수 없습니다: g_unlink() 실패: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "서식 '%s'이(가) 잘못되었습니다, '%s'이(가) 들어 있으면 안 됩니다" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "서식 '%s'에 XXXXXX가 없습니다" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "심볼릭 링크 '%s' 읽기 실패: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "심볼릭 링크를 지원하지 않습니다" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "`%s'에서 `%s'(으)로 변환하는 변환기를 열 수 없음: %s" + +#: ../glib/giochannel.c:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "읽기 버퍼에서 변환되지 않은 데이터를 남겨둠" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "일부 문자에서 채널 끝냄" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_endi로 raw 읽기를 할 수 없습니다" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "검색 디렉터리 안에 올바른 키 파일이 없습니다" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "일반 파일이 아닙니다" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"키 파일에 들어 있는 '%s' 줄은 키-값 쌍도 아니고, 그룹도 아니고, 주석도 아닙니" +"다" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "잘못된 그룹 이름: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "키 파일이 그룹으로 시작하지 않습니다" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "잘못된 키 이름: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "키 파일에 지원하지 않는 '%s' 인코딩이 들어 있습니다" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "키 파일에 '%s' 그룹이 없습니다" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "키 파일에 '%s' 키가 없습니다" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "키 파일에 있는 '%s' 키와 '%s' 값은 UTF-8이 아닙니다" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "키 파일에 있는 '%s' 키의 값을 해석할 수 없습니다." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"키 파일에 해석할 수 없는 값을 지닌 '%2$s' 그룹의 '%1$s' 키가 키 파일에 있습니" +"다." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "%4$s값이 있어야 할 '%2$s'그룹의 '%1$s'키가 '%3$s'값을 지니고 있습니다" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "키 파일에 있는 '%2$s' 그룹의 '%1$s' 키가 없습니다" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "키 파일의 줄 끝에 이스케이프 문자가 있습니다" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "키 파일에 잘못된 이스케이프 시퀀스 '%s'이(가) 들어 있습니다" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "값 '%s'을(를) 숫자로 해석할 수 없습니다." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "정수 값 '%s'이(가) 범위를 벗어났습니다" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "값 '%s'을(를) 단정도 실수로 해석할 수 없습니다." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "값 '%s'을(를) 불리언 값으로 해석할 수 없습니다." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "'%s%s%s%s'파일의 속성 가져오기 실패: fstat() 실패: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s 매핑 실패: mmap() 실패: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "파일 '%s' 열기 실패: dopen() 실패: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d째 줄 %d 문자에서 오류: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "이름에 잘못 UTF-8 인코딩된 텍스트 - '%s' 부분이 올바르지 않습니다" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s'은(는) 올바른 이름이 아닙니다 " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s'은(는) 올바른 이름이 아닙니다: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d째 줄에서 오류: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "문자 참조 '%-*s'에 대응되는 문자는 허용되지 않습니다" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"비어있는 엔티티 '&;'를 찾았습니다; 올바른 엔티티는 : & " < > " +"' 입니다" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "엔티티 이름 '%-.*s'이(가) 알려져 있지 않습니다" + +# FIXME: "escape"라는 동사를 번역? +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "문서는 요소로 시작하여야 합니다(예 )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s'은(는) '<' 문자 다음에 쓸 수 없습니다; 이 문자로는 요소 이름을 시작할 수 " +"없습니다" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"이상한 문자 '%s'. 빈 요소 '%s' 태그를 끝내는 '>' 문자가 나타나야 합니다" + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s'은(는) 요소 '%s'을(를) 닫은 다음에 쓸 수 있는 문자가 아닙니다; '>' 문자" +"를 쓸 수 있습니다" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' 요소는 닫혔고, 현재 아무 요소도 열려 있지 않습니다" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' 요소는 닫혔고, 현재 열려 있는 요소는 '%s'입니다" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "문서가 비어있거나 공백문자만 들어 있습니다" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' 바로 다음에 문서가 갑작스럽게 끝났습니다" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"요소가 열려 있는 상태로 문서가 갑작스럽게 끝났습니다 - 마지막에 열려 있던 요" +"소는 '%s'입니다" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"문서가 갑작스럽게 끝났습니다. <%s/> 태그를 끝내는 > 기호가 나타나야 합니다" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "요소 이름에서 문서가 갑작스럽게 끝났습니다" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "에트리뷰트 이름에서 문서가 갑작스럽게 끝났습니다" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "요소의 열기 태그 안에서 문서가 갑작스럽게 끝났습니다." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"속성 이름 다음의 = 기호 다음에서 문서가 갑작스럽게 끝났습니다; 속성 값이 없습" +"니다" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "속성 값 안에서 문서가 갑작스럽게 끝났습니다" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s'요소의 닫기 태그 안에서 문서가 갑작스럽게 끝났습니다" + +# FIXME: processing instruction? +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "주석문 혹은 처리 안내자 태그 안에서 문서가 갑작스럽게 끝났습니다" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "사용법:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[옵션...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "도움말 옵션:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "도움말 옵션을 봅니다" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "모든 도움말 옵션을 봅니다" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "프로그램 옵션:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s에 대한 정수 값 '%1$s'을(를) 분석할 수 없습니다" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s에 대한 정수 값 '%1$s'이(가) 범위를 벗어났습니다" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s에 대한 배정도 실수 값 '%1$s'을(를) 분석할 수 없습니다" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s에 대한 배정도 실수 값 '%1$s'이(가) 범위를 벗어났습니다" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "옵션 읽는 중에 오류: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s에 대한 인자가 빠졌습니다" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "알 수 없는 옵션 %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "개체가 손상되었습니다" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "내부 오류 또는 개체가 손상되었습니다" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "메모리 부족" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "역추적 최대값에 도달했습니다" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "패턴 안에 부분 매치에서 지원하지 않는 항목이 들어 있습니다." + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "후위 참조를 조건으로 사용하면 부분 매치에서 지원하지 않습니다." + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "재귀 최대값에 도달했습니다" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "줄바꿈 플래그의 조합이 잘못되었습니다" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "오프셋이 잘못되었습니다" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "UTF-8 문자열이 끊겼습니다" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "재귀 순환" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "알 수 없는 오류" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "패턴 끝에 \\\\" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "패턴 끝에 \\\\c" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "\\ 다음에 인식할 수 없는 문자가 있습니다" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} 안의 숫자가 순서를 벗어났습니다" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} 안의 숫자가 너무 큽니다" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "문자 클래스에서 끝나는 ] 괄호가 빠졌습니다" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "문자 클래스에서 이스케이프 시퀀스가 잘못되었습니다" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "문자 클래스에서 범위가 순서를 벗어났습니다" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "반복할 사항 없음" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "예상하지 못한 반복" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? 또는 (?- 다음에 알 수 없는 문자가 있습니다" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 네임드 클래스는 클래스 안에서만 지원합니다" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "끝나는 ) 괄호가 없습니다" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "없는 하위 패턴을 참조합니다" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "주석 다음에 ) 괄호가 빠졌습니다" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "정규식이 너무 깁니다" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "메모리를 확보하는데 실패했습니다" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "( 여는 괄호 없이 ) 괄호가 있습니다" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "코드 오버플로우" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< 다음에 알 수 없는 문자" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "룩비하인드 어서션이 고정된 길이가 아닙니다" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( 다음에 숫자나 이름의 형식이 잘못되었습니다" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "조건문 그룹에 브랜치가 2개보다 많이 들어 있습니다" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 혹은 (?[+-]digits 다음에는 ) 괄호가 와야 합니다" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "알 수 없는 POSIX 클래스 이름" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX 사전 순서 항목은 지원하지 않습니다" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 시퀀스의 문자 값이 너무 큽니다" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "잘못된 조건문 (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C는 룩비하인드 어서션에서 사용할 수 없습니다" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "\\L, \\l, \\N{name}, \\U, and \\u 이스케이프는 지원하지 않습니다" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "재귀 호출때문에 무한히 반복할 수 있습니다" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P 다음에 알 수 없는 문자" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "하위 패턴 이름에 끝나는 글자가 빠졌습니다" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "이름 있는 2개의 하위 패턴의 이름이 같습니다" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "\\P 혹은 \\p 시퀀스의 형식이 잘못되었습니다" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P 혹은 \\p 다음에 속성 이름을 알 수 없습니다" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "하위 패턴 이름이 너무 깁니다(최대 32글자)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "이름 있는 하위 패턴이 너무 많습니다(최대 10,000개)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "8진수값이 \\377보다 큽니다" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "컴파일 작업 공간을 넘어갔습니다" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "이전에 검사한 참조할 하위 패턴이 없습니다" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 그룹에 브랜치가 여러 개 들어 있습니다" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "일관성 없는 NEWLINE 옵션" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"중괄호, 각괄호, 따옴표가 붙은 이름 또는 숫자, 또는 순수한 숫자가 따라오지 않" +"았습니다" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "번호를 매긴 참조는 0이 되어서는 안됩니다" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "(*ACCEPT), (*FAIL), 또는 (*COMMIT)을 감안하여 인자를 허용하지 않습니다" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB)를 인식하지 않았습니다" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "숫자가 너무 큽니다" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& 다음에 하위 패턴 이름이 빠졌습니다" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ 다음에 숫자가 있어야 합니다" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "]는 자바스크립트 호환 모드에서 잘못된 데이터 문자 입니다" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "동일한 갯수의 하위 패턴에 대해 다른 이름을 허용하지 않습니다" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK)에 인자가 있어야 합니다" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c 다음에 아스키 문자가 있어야 합니다" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k 다음에 중괄호, 각괄호, 따옴표가 붙은 이름이 따라오지 않았습니다" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "클래스에서 \\N을 지원하지 않습니다" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "너무 많은 참조를 전달했습니다" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), 또는 (*THEN)의 이름이 너무 깁니다" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... 시퀀스의 문자 값이 너무 큽니다" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "정규 표현식 %s을(를) 맞추는 도중 오류가 발생했습니다: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 라이브러리가 UTF8 지원 없이 컴파일되었습니다" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 라이브러리는 UTF8 속성을 지원하지 않고 컴파일되었습니다" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "비호환 옵션을 사용하여 PCRE 라이브러리 컴파일했습니다" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"정규 표현식 %s을(를) 컴파일하는 중 %d번째 문자에서 오류가 발생했습니다: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "정규 표현식 %s을(를) 최적화하는 도중 오류 발생: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "16 진수 또는 '}'가 있어야 합니다" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "16 진수가 있어야 합니다" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "심볼 참조에 '<' 기호가 없습니다" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "심볼 참조가 끝나지 않았습니다" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "심볼 참조에 내용이 없습니다" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "숫자가 있어야 합니다" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "심볼 참조가 잘못되었습니다" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "마지막 '\\'가 없습니다" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "알 수 없는 이스케이프 시퀀스" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "따옴표된 텍스트가 따옴표로 시작하지 않습니다" + +# FIXME: 위 참조, "quoted" +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "명령줄에서 따옴표가 맞지 않거나 셸 따옴표된 텍스트가 또 있습니다" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "텍스트가 '\\' 문자 다음에 끝났습니다. (텍스트는 '%s'입니다)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"텍스트가 %c에 대응되는 따옴표가 나타나기 전에 끝났습니다. (텍스트는 '%s'입니" +"다)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "텍스트가 비어 있음(또는 공백만 들어 있음)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "하위 프로세스에서 데이터를 읽기 실패(%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"하위 프로세스에서 데이터를 읽는 중 select()에서 예상되지 않은 오류 (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()에서 예상되지 않은 오류 (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "하위 프로세스가 %ld 코드로 끝났습니다" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "하위 프로세스가 %ld 시그널로 죽었습니다" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "하위 프로세스가 %ld 시그널로 멈췄습니다" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "하위 프로세스가 예기치 않게 끝났습니다" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "하위 파이프로 부터 읽기 실패 (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "포크 실패(%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "디렉터리 '%s'(으)로 바꾸기 실패 (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "하위 프로세스 \"%s\"을(를) 실행하기 실패 (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "하위 프로세스 (%s)의 입력 또는 출력의 리다이렉트 실패" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "하위 프로세스 (%s) 생성 실패" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "하위 프로세스 \"%s\"을(를) 실행하는 중 알 수 없는 오류" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "하위 PID 파이프에서 필요한 데이터를 읽는데 실패했습니다 (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "하위 프로세스와 통신을 위한 파이프를 만드는 중 실패 (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "하위 프로세스에서 데이터 읽기 실패" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "하위 프로세스 실행 실패 (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "잘못된 프로그램 이름: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "인자에서 잘못된 문자열, %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "환경에서 잘못된 문자열: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "잘못된 현재 디렉터리: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "도움 프로그램 실행 실패 (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"하위 프로세스에서 데이터를 읽는중 g_io_channel_win32_poll()에서 예기치 못한 " +"오류" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 문자 범위를 벗어났습니다" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "변환 입력 순서가 잘못되었습니다" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 문자 범위를 벗어났습니다" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 바이트" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s 바이트" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/ku.po b/po/ku.po new file mode 100644 index 0000000..c03b369 --- /dev/null +++ b/po/ku.po @@ -0,0 +1,3721 @@ +# translation of glib.glib-2-8.po to Kurdish +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Erdal Ronahi , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: glib.glib-2-8\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2006-04-20 17:33+0000\n" +"Last-Translator: Erdal Ronahi \n" +"Language-Team: Kurdish \n" +"Language: ku\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ne derbasdar e" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Navê hostê nederbasdar e" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %B %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Çile" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Sibat" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Adar" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Nîsan" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Gulan" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Hezîran" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Tîrmeh" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Çil" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Sib" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Ada" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Nîs" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Gul" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Hez" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Tîr" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "dusêm" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "sêsêm" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "çarsêm" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "pêncsêm" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "înî" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sept" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "yêksêm" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "dus" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "sês" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "çar" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "pên" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "înî" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sep" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "yêk" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Di rêza %d tîpa %d de çewtî: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Bikaranîn:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Vebijêrkên Sepanê:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Vebijêrka nenas %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Dosya vala ye" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Vebijêrka nenas %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Navê hostê nederbasdar e" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Navê bernameyê nederbasdar e: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Vebijêrka nenas %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Vekirina dosiya '%s' serneket: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Di rêza %d de çewtî: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Di xwendina dosyeya '%s' de çewtî: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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.po b/po/lt.po new file mode 100644 index 0000000..4cacf3a --- /dev/null +++ b/po/lt.po @@ -0,0 +1,4396 @@ +# Lithuanian translation of Glib library. +# Copyright © 2003-2005, 2007, 2008, 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Tomas Kuliavas , 2003-2004. +# Žygimantas Beručka , 2004-2007, 2010, 2012. +# Mantas KriaučiÅ«nas , 2006-2007. +# Gintautas Miliauskas , 2007, 2008. +# Rimas Kudelis , 2010. +# Algimantas Margevičius , 2011. +# Aurimas Černius , 2010, 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: lt\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-24 23:17+0000\n" +"PO-Revision-Date: 2013-01-26 20:23+0200\n" +"Last-Translator: Aurimas Černius \n" +"Language-Team: Lietuvių \n" +"Language: lt\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" +"%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Gtranslator 2.91.6\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Per didelė skaičiavimo reikÅ¡mė perduota %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Pozicijos perkėlimas sraute nepalaikomas" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Nepavyko sutrumpinti GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Srautas jau užvertas" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Trumpinimas sraute nepalaikomas" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Operacija nutraukta" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Netinkamas objektas, nepavyko inicijuoti" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Klaidinga baitų seka įvestyje" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Nepakanka paskirties vietos" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Klaidinga baitų seka keitimo įvedime" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Klaida keitimo metu: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "AtÅ¡aukiamas inicijavimas nepalaikomas" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Keitimas iÅ¡ koduotės „%s“ į koduotę „%s“ nepalaikomas" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nepavyko atverti keitiklio iÅ¡ „%s“ į „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s tipas" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Nežinomas tipas" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s failo tipos" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials nerealizuota Å¡ioje operacinėje sistemoje" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "JÅ«sų platformoje nėra GCredentials palaikymo" + +#: ../gio/gcredentials.c:480 +#| msgid "GCredentials is not implemented on this OS" +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials neturi proceso ID Å¡ioje OS" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Netikėta ankstyva srauto pabaiga" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nepalaikomas raktas „%s“ adreso įvestyje „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresas „%s“ nėra tinkamas (reikia įvesti vienintelį raktą path, tmpdir arba " +"abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Beprasmė rakto/reikÅ¡mės poros kombinacija adreso įvestyje „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Klaida adrese „%s“ - neteisingai suformuotas prievado atributas" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Klaida adrese „%s“ - neteisingai suformuotas Å¡eimos atributas" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adreso elementas „%s“ neturi dvitaÅ¡kio (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Rakto/reikÅ¡mės pora %d, „%s“, adreso elementas „%s“ neturi lygybės ženklo" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Klaida Å¡alinant kaitą rakte ar reikÅ¡mėje rakto/reikÅ¡mės poroje %d, „%s“ " +"adreso elemente „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Klaida adrese „%s“ - unix duomenų perdavimas reikalauja nustatyti vienintelį " +"iÅ¡ raktų `path' arba `abstract'" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Klaida adrese „%s“ - pagrindinio kompiuterio atributas neįvestas arba blogai " +"suformuotas" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Klaida adrese „%s“ - prievado atributas neįvestas arba blogai suformuotas" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Klaida adrese „%s“ - laikino failo atributas neįvestas arba blogai " +"suformuotas" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Klaida automatiÅ¡kai paleidžiant: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Nežinomas arba nepalaikomas duomenų perdavimas „%s“ adresui „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Klaida atveriant laikiną failą „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Klaida skaitant iÅ¡ laikino failo „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Klaida skaitant iÅ¡ laikino failo „%s“, tikėtasi 16 baitų, gauta %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Klaida raÅ¡ant į laikino failo turinį „%s“ į srautą:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Pateiktasis adresas yra tuščias" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Negalima paleisti praneÅ¡imų magistralės kai vyksta setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Negalima paleisti praneÅ¡imų magistralės be maÅ¡inos id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Klaida paleidžiant komandų eilutę „%s“: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Spauskite bet kurį klavišą Å¡iam langui užverti)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Seanso dbus neveikia, automatinis paleidimas nepavyko" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Nepavyko nustatyti sesijos magistralės adreso (nerealizuota Å¡iai operacinei " +"sistemai)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nepavyko nustatyti magistralės adreso iÅ¡ DBUS_STARTER_BUS_TYPE aplinkos " +"kintamojo - nežinoma reikÅ¡mė „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nepavyko nustatyti magistralės adreso, kadangi DBUS_STARTER_BUS_TYPE " +"aplinkos kintamasis nenustatytas" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Nežinomas magistralės tipas %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Netikėtas turinio trÅ«kumas bandant nuskaityti eilutę" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Netikėtas turinio trÅ«kumas bandant (saugiai) nuskaityti eilutę" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Baigėsi visi turimi tapatybės patvirtinimo mechanizmai (bandyta: %s) " +"(turimi: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "AtÅ¡aukta per GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Klaida gaunant informaciją apie katalogą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Katalogo „%s“ leidimai yra suformuoti neteisingai. Tikėtasi mode 0700, gauta " +"0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Klaida kuriant katalogą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Klaida atveriant raktinę „%s“ skaitymui: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"%d eilutė raktinės vietoje „%s“ su turiniu „%s“ yra suformuota neteisingai" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Pirmoji leksema raktinės %d eilutės vietoje „%s“ su turiniu „%s“ yra " +"suformuota neteisingai" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Antroji leksema raktinės %d eilutės vietoje „%s“ su turiniu „%s“ yra " +"suformuota neteisingai" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Nerastas slapukas su id %d raktinės vietoje „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Klaida trinant nebegaliojantį rakinimo failą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Klaida kuriant rakinimo failą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Klaida užveriant (nesusietą) rakinimo failą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Klaida atsiejant rakinimo failą „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Klaida atveriant raktinė „%s“ raÅ¡ymui: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Papildomai, užrakto atlaisvinimas „%s“ taip pat nepavyko: %s)." + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "RyÅ¡ys yra užvertas" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Baigėsi laikas" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Nepalaikomi požymiai aptikti konstruojant kliento pusės ryšį" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nėra sąsajos „org.freedesktop.DBus.Properties“ objektui, kurio kelias %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Klaida nustatant savybę „%s“: tikėtasi tipo „%s“, bet gauta „%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Nėra savybės „%s“" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Savybė „%s“ yra neskaitoma" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Savybė „%s“ nėra raÅ¡oma" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Nėra sąsajos „%s“" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Nėra tokios sąsajos" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nėra sąsajos „%s“ objektui, kurio kelias %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Nėra metodo „%s“" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "PraneÅ¡imo tipas „%s“ neatitinka laukiamo tipo „%s“" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Jau yra eksportuotas objektas sąsajai %s vietoje %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metodas „%s“ grąžino tipą „%s“, bet laukta „%s“" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metodas „%s“ sąsajoje „%s“ su signatÅ«ra „%s“ neegzistuoja" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Pomedis %s jau yra eksportuotas" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "tipas yra NETINKAMAS" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL praneÅ¡imas: trÅ«ksta antraÅ¡tės lauko PATH arba MEMBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN praneÅ¡imas: trÅ«ksta REPLY_SERIAL antraÅ¡tės" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR praneÅ¡imas: antraÅ¡tės lauke trÅ«ksta REPLY_SERIAL arba ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL praneÅ¡imas: trÅ«ksta antraÅ¡tės lauko PATH, INTERFACE arba MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL praneÅ¡imas: antraÅ¡tės laukas PATH naudoja rezervuotą reikÅ¡mę /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL praneÅ¡imas: antraÅ¡tės laukas INTERFACE naudoja rezervuotą reikÅ¡mę org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +#| msgid "Wanted to read %lu byte but got EOF" +#| msgid_plural "Wanted to read %lu bytes but got EOF" +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Norėta nuskaityti %lu baitą, bet gauta %lu" +msgstr[1] "Norėta nuskaityti %lu baitus, bet gauta %lu" +msgstr[2] "Norėta nuskaityti %lu baitų, bet gauta %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Tikėtasi NUL baito po simbolių eilutės „%s“, bet rastas baitas %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Tikėtasi teisingos UTF-8 eilutės, bet rasta neteisingų baitų poslinkiu %d " +"(eilutės ilgis yra %d). Teisinga UTF-8 eilutė iki tos vietos buvo „%s“" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Perskaityta reikÅ¡mė „%s“ nėra tinkamas D-Bus objekto kelias" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Perskaityta reikÅ¡mė „%s“ nėra tinkama D-Bus signatÅ«ra" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Aptiktas %u baito ilgio masyvas. Maksimalus ilgis yra 2<<26 baitų (64 MiB)." +msgstr[1] "" +"Aptiktas %u baitų ilgio masyvas. Maksimalus ilgis yra 2<<26 baitų (64 MiB)." +msgstr[2] "" +"Aptiktas %u baitų ilgio masyvas. Maksimalus ilgis yra 2<<26 baitų (64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Perskaityta reikÅ¡mė „%s“ variantui nėra tinkama D-Bus signatÅ«ra" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Klaida atstatant GVariant su tipo eilute „%s“ iÅ¡ D-Bus telegramos formato" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Netinkama baitų eiliÅ¡kumo reikÅ¡mė. Tikėtasi 0x6c („l“) arba 0x42 („B“), bet " +"rasta 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Netinkama pagrindinė protokolo versija. Tikėtasi 1, bet rasta %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"SignatÅ«ros antraÅ¡tė su signatÅ«ra „%s“ rasta, bet praneÅ¡imo pagrindinė dalis " +"tuščia" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Perskaityta reikÅ¡mė „%s“ nėra tinkama D-Bus signatÅ«ra (pagrindinei daliai)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Nėra signatÅ«ros antraÅ¡tės praneÅ¡ime, bet praneÅ¡imo pagrindinė dalis yra %u " +"baito" +msgstr[1] "" +"Nėra signatÅ«ros antraÅ¡tės praneÅ¡ime, bet praneÅ¡imo pagrindinė dalis yra %u " +"baitų" +msgstr[2] "" +"Nėra signatÅ«ros antraÅ¡tės praneÅ¡ime, bet praneÅ¡imo pagrindinė dalis yra %u " +"baitų" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Nepavyko atstatyti praneÅ¡imo: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Klaida paverčiant GVariant su tipo eilute „%s“ į D-Bus telegramos formatą" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"PraneÅ¡imas turi %d failų deskriptorių, bet antraÅ¡tės laukas nurodo %d failų " +"deskriptorius" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Nepavyko iÅ¡saugoti praneÅ¡imo: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"PraneÅ¡imo pagrindinė dalis turi signatÅ«rą „%s“, bet nėra signatÅ«ros antraÅ¡tės" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"PraneÅ¡imo pagrindinė dalis turi tipo signatÅ«rą „%s“, bet signatÅ«ra antraÅ¡tės " +"lauke yra „%s“" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"PraneÅ¡imo pagrindinė dalis yra tuščia, bet signatÅ«ra antraÅ¡tės lauke yra " +"„(%s)“" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Klaidos grąžinimas su pagrindinės dalies tipu „%s“" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Klaidos grąžinimas su tuščia pagrindine dalimi" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Nepavyko gauti aparatÅ«ros profilio: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nepavyko įkelti /var/lib/dbus/machine-id or /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Klaida kviečiant StartServiceByName elementui %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Nelauktas atsakas %d iÅ¡ StartServiceByName(\"%s\") metodo" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Nepavyko iÅ¡kviesti metodo; proxy nėra gerai žinoma pavadinimas be savininko " +"ir proxy buvo sukonstruotas su G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START požymiu" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakti vardų sritis nepalaikoma" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Negalima nurodyti laikino failo kuriant serverį" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Klaida raÅ¡ant laikiną failą vietoje „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Eilutė „%s“ nėra tinkamas D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Negalima laukti duomenų iÅ¡ nepalaikomo perdavimo „%s“" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "KOMANDA" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Komandos:\n" +" help Parodo Å¡ią informaciją\n" +" introspect Nagrinėti nutolusį objektą\n" +" monitor Stebėti nutolusį objektą\n" +" call IÅ¡kviesti nutolusio objekto metodą\n" +" emit SiÅ«sti signalą\n" +"Naudokite „%s KOMANDA --help“ kiekvienos komandos pagalbos gavimui.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Klaida: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Klaida skaitant introspekcijos XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Prisijungti prie sistemos magistralės" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Prisijungti prie sesijos magistralės" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Prisijungti prie pateikto D-Bus adreso" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "RyÅ¡io pabaigos parinktys:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Parinktys, nurodančios ryÅ¡io pabaigą" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nėra nurodytos ryÅ¡io pabaigos" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Nurodytos kelio ryÅ¡io pabaigos" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Perspėjimas: pagal introspekcijos duomenis, sąsaja „%s“ neegzistuoja\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Perspėjimas: pagal introspekcijos duomenis, metodas „%s“ neegzistuoja " +"sąsajoje „%s“\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "NebÅ«tinas signalo tikslas (unikalus vardas)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Objekto, kuriame siunčiamas signalas, kelias" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Signalo ir sąsajos vardai" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "SiÅ«sti signalą." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Klaida prisijungiant: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Klaida: nenurodytas objekto kelias.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Klaida: %s nėra tinkamas objekto kelias\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Klaida: nenurodytas signalas.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Klaida: signalas turi bÅ«ti pilnai-kvalifikuotas pavadinimas.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Klaida: %s nėra tinkamas sąsajos vardas\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Klaida: %s nėra tinkamas nario vardas\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Klaida: %s nėra tinkamas unikalus magistralės vardas.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Klaida skaitant parametrą %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Klaida iÅ¡siunčiant ryšį: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Tikslo vardas metodo iÅ¡kvietimui" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Objekto kelias metodo iÅ¡kvietimui" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Metodo ir sąsajos vardai" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Laiko limitas sekundėmis" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "IÅ¡kviesti metodą nutolusiame objekte." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Klaida: nenurodytas tikslas\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Klaida: nenurodytas objekto kelias\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Klaida: nenurodytas metodo vardas\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Klaida: metodo vardas „%s“ yra netinkamas\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Klaida skaitant parametrą %d, kurio tipas „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Tikslo vardas introspekcijai" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Objekto kelias introspekcijai" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Spausdinti XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Nagrinėti vaiką" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Spausdinti tik savybes" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Introspekcija nutolusiam objektui." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Tikslo vardas stebėjimui" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Objekto kelias stebėjimui" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Stebėti nutolusį objektą." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Nepavadinta" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Darbalaukio failas nenurodė Exec lauko" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Nerastas terminalas, reikalingas programai" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nepavyko sukurti naudotojo nustatymų aplanko %s: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nepavyko sukurti naudotojo MIME nustatymų aplanko %s: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "Programos informacijai trÅ«ksta identifikatoriaus" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nepavyko sukurti naudotojo darbalaukio failo %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Specialus apibrėžimas %s" + +#: ../gio/gdrive.c:394 +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:472 +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:548 +msgid "drive doesn't implement polling for media" +msgstr "įrenginys nerealizuoja laikmenos tikrinimo užklausimo" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "įrenginys nerealizuoja startavimo" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "įrenginys nerealizuoja stabdymo" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Nėra TLS palaikymo" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nepavyko apdoroti GEmblem koduotės versijos %d" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Netinkamas leksemų skaičius (%d) GEmblem koduotėje" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nepavyko apdoroti GEmblemedIcon koduotės versijos %d" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Netinkamas leksemų skaičius (%d) GEmblemedIcon koduotėje" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Tikėtasi GEmblem skirto GEmblemedIcon" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7115 ../gio/gfile.c:7205 ../gio/gfile.c:7289 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Tėvinis prijungimo taÅ¡kas neegzistuoja" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Negalima kopijuoti ant aplanko" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "Negalima kopijuoti aplanko ant aplanko" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Nurodytas failas jau egzistuoja" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "Negalima rekursyviai kopijuoti aplanko" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "Skaidymas nepalaikomas" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "Klaida skaidant failą: %s" + +#: ../gio/gfile.c:2952 +#| msgid "Move between mounts not supported" +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Kopijavimas (reflink/clone) tarp prijungimo taÅ¡kų nepalaikomas" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Kopijavimas (reflink/clone) nepalaikomas arba netinkamas" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Kopijavimas (reflink/clone) nepalaikomas arba nesuveikė" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "Nepavyksta nukopijuoti specialaus failo" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "Netaisyklinga simbolinės nuorodos reikÅ¡mė" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "Å iukÅ¡lės nepalaikomos" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Failų varduose negali bÅ«ti '%c'" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "skirsnis nepalaiko prijungimo" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "Nėra programos, priregistruotos kaip skaitančios šį failą" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumeratorius užvartas" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Failų enumeratoriui liko neatlikta operacija" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Srautas nepalaiko query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Pozicijos perkėlimas sraute nepalaikomas" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Trumpinimas įėjimo srauto nepalaikomas" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Trumpinimas srauto nepalaikomas" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Neteisingas leksemų skaičius (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Nėra tipo klasės pavadinimui %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipas %s nerealizuoja GIcon sąsajos" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipas %s neklasifikuotas" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Netinkamas versijos numeris: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Nepavyko apdoroti pateiktosios piktogramos koduotės versijos" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nenurodytas adresas" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "%u yra per didelis ilgis adresui" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adresas turi nustatytus bitus už prieÅ¡dėlio ilgio" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Nepavyko perskaityti „%s“ kaip IP adreso kaukės" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nepakanka vietos lizdo adresui" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nepalaikomas lizdo adresas" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Srautui liko neįvykdyta operacija" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elementas <%s> neleidžiamas viduje <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elementas <%s> neleidžiamas aukščiausiame lygyje" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Failas %s resurse aptinkamas kelis kartus" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Nepavyko rasti „%s“ jokiame Å¡altinio kataloge" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Nepavyko rasti „%s“ esamame kataloge" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Nežinomas apdorojimo parametras „%s“" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Nepavyko sukurti laikino failo: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Klaida apdorojant įvesties failą su xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Klaida apdorojant įvesties failą su to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Klaida skaitant failą %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Klaida spaudžiant failą: %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "tekstas negali bÅ«ti viduje <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "iÅ¡vesties failo pavadinimas" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FAILAS" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Katalogai, iÅ¡ kurių skaityti failus (numatyta iÅ¡ esamo katalogo)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "KATALOGAS" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Generuoti iÅ¡vestį formatu pagal pasirinkto tikslo failo plėtinį" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Generuoti Å¡altinio antraÅ¡tę" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Generuoti kodą, naudojamą resursų failo įriÅ¡imui į jÅ«sų kodą" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Generuoti priklausomybių sąrašą" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "AutomatiÅ¡kai negeneruoti ir neregistruoti resurso" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Neeksportuoti funkcijų; deklaruoti jas G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "C identifikatoriaus vardas, naudojamas generuojamame kode" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompiliuoti resurso specifikaciją į resurso failą.\n" +"Resursų specifikacijos failai turi turėti plėtinį .gresource.xml,\n" +"o resurso failas turi plėtinį gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Turite nurodyti vienintelį failo pavadinimą\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "neleidžiami tuÅ¡ti pavadinimai" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"netinkamas pavadinimas „%s“: pavadinimai turi prasidėti mažosiomis raidėmis" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"netinkamas pavadinimas „%s“: netinkamas simbolis „%c“; leidžiamos tik " +"mažosios raidės, skaitmenys ir brÅ«kÅ¡niai („-“)." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"netinkamas pavadinimas „%s“: du brÅ«kÅ¡niai („--“) vienos po kito neleidžiami." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"netinkamas pavadinimas „%s“: paskutinis simbolis negali bÅ«ti brÅ«kÅ¡nys („-“)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "netinkamas pavadinimas „%s“: didžiausias leistinas ilgis yra 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " jau nurodyta" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "nepavyko pridėti raktų į „list-of“ schemą" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " jau nurodytas" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" paslėpia elemente ; " +"naudokite reikÅ¡mei pakeisti" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"Kaip atributas elementui turi bÅ«ti nurodytas vienintelis iÅ¡ „type“, " +"„enum“ arba „flags“" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (dar) neapibrėžta." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "netinkama GVariant tipo eilutė „%s“" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " nurodytas, bet schema nieko neiÅ¡plečia" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "nėra perraÅ¡omo " + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " jau nurodytas" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " jau nurodytas" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " iÅ¡plečia dar neegzistuojančią schemą „%s“" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " yra dar neegzistuojanti schema „%s“" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Negali bÅ«ti schemos sąraÅ¡as su keliu" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Negalima iÅ¡plėsti schemos su keliu" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" yra sąraÅ¡as, iÅ¡plečiantis , kuris nėra " +"sąraÅ¡as" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" iÅ¡plečia , bet " +"„%s“ neiÅ¡plečia „%s“" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "kelias, jei pateiktas, turi prasidėti ir baigtis pasviruoju brÅ«kÅ¡niu" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "sąraÅ¡o kelias turi baigtis „:/“" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> jau nurodytas" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elementas <%s> neleidžiamas aukščiausiame lygyje" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict buvo nurodyta; iÅ¡einama.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Visas failas nepaisomas.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Nepaisoma Å¡io failo.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "Nėra rakto „%s“ schemoje „%s“ kaip nurodyta perraÅ¡ančiame faile „%s“" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; nepaisoma Å¡io rakto perraÅ¡ymo.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ir --strict nurodyta; iÅ¡einama.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"klaida skaitant raktą „%s“ schemoje „%s“ kaip nurodyta perraÅ¡ančiame faile " +"„%s“: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Nepaisoma Å¡io rakto perraÅ¡ymo.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"rakto „%s“ perraÅ¡ymas schemoje „%s“ perraÅ¡ančiame faile „%s“ yra už schemoje " +"nurodytų ribų" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"rakto „%s“ perraÅ¡ymas schemoje „%s“ perraÅ¡ančiame faile „%s“ nėra iÅ¡ " +"leistinų pasirinkimų" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "kur saugoti gschemas.compiled failą" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Nutraukti darbą esant bet kokiai klaidai schemoje" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "NeraÅ¡yti gschema.compiled failo" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Nereikalauti raktų vardų apribojimų" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompiliuoti visus GSettings schamų failus į schemų podėlį.\n" +"Schemų failai turi turėti plėtinį .gschema.xml,\n" +"o podėlio failas yra vadinamas gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Turite nurodyti vienintelį katalogo vardą\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Nerasti schemų failai: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "nedaro nieko.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "paÅ¡alintas egzistuojanti iÅ¡vesties failas.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Nepavyko rasti įprasto vietinių aplankų stebėjimo tipo" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Netaisyklingas failo vardas %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Klaida skaitant failų sistemos informaciją: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Nepavyko pervadinti Å¡akninio aplanko" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Klaida pervadinant failą: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Nepavyko pervadinti failo, failo vardas jau užimtas" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Netaisyklingas failo vardas" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Nepavyko atverti aplanko" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Klaida atveriant failą: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Klaida trinant failą: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Klaida perkeliant į Å¡iukÅ¡les failą: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nepavyko sukurti Å¡iukÅ¡lių aplanko %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Nepavyko rasti Å¡akninio aplanko Å¡iukÅ¡lėms" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Nepavyko rasti ar sukurti Å¡iukÅ¡lių aplanko" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nepavyko Å¡iukÅ¡lių informacijos failo: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nepavyko į Å¡iukÅ¡les perkelti failo: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "vidinė klaida" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Klaida atveriant aplanką: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Failų sistema nepalaiko simbolinių nuorodų" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Klaida kuriant simbolinę nuorodą: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Klaida perkeliant failą: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Negalima perkelti aplanko per aplanką" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Atsarginės kopijos sukÅ«rimas nesėkmingas" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Klaida trinant nurodytą failą: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Perkėlimas tarp prijungimo taÅ¡kų nepalaikomas" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Atributo reikÅ¡mė turi bÅ«ti netuščia" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "netaisyklingas atributo tipas (tikimasi simbolių sekos)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "netaisyklingas iÅ¡plėstinio atributo pavadinimas" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Klaida nurodant iÅ¡plėstinį atributą „%s“: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (netaisyklinga koduotė)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Klaida gaunant informaciją apie failą „%s“: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Klaida gaunant informaciją failo apraÅ¡ymui: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Klaidingas atributo tipas (tikimasi uint32)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Klaidingas atributo tipas (tikimasi uint64)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Klaidingas atributo tipas (tikimasi baitų sekos)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "Simbolinėms nuorodoms teisių nustatyti negalima" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Klaida nustatant teises: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "Klaida nustatant savininką: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "Simbolinė nuoroda turi bÅ«ti netuščia" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Klaida nustatant simbolinę nuorodą: %s" + +#: ../gio/glocalfileinfo.c:2230 +msgid "Error setting symlink: file is not a symlink" +msgstr "Klaida nustatant simbolinę nuorodą: failas nėra simbolinė nuoroda" + +#: ../gio/glocalfileinfo.c:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Klaida nustatant pakeitimo arba prieigos laiką: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "SELinux kontekstas bÅ«ti nelygus NULL" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Klaida nustatant SELinux kontekstą: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "SELinux Å¡ioje sistemoje neįjungtas" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Atributo %s nustatymas nepalaikomas" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Klaida skaitant failą: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Klaida keičiant poziciją faile: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Klaida užveriant failą: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Nepavyko rasti numatytojo vietinių failų stebyklės tipo" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Klaida raÅ¡ant į failą: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Klaida Å¡alinant senos atsarginės kopijos nuorodą: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Klaida kuriant atsarginę kopiją: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Klaida pervadinant laikinąjį failą: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Klaida trumpinant failą: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Klaida atveriant failą „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Paskirties failas yra aplankas" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Paskirties failas nėra paprastas failas" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Failas buvo pakeistas kitos programos" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Klaida iÅ¡trinant senąjį failą: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Netaisyklingas GSeekType" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Netinkama pozicijos keitimo užklausa" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nepavyko sutrumpinti GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Atminties iÅ¡vedimo srauto dydis nekeičiamas" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Nepavyko pakeisti atminties iÅ¡vedimo srauto dydžio" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "PraÅ¡oma perkelti poziciją dar prieÅ¡ srauto pradžią" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "prijungimo taÅ¡kas nepalaiko sinchroninio turinio tipo spėjimo" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Mazgo varde „%s“ yra ženklas „[“, bet nėra „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Tinklas nepasiekiamas" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Serveris nepasiekiamas" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Nepavyko sukurti tinklo stebyklės: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Nepavyko sukurti tiklo stebėtojo: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Nepavyko gauti tinklo bÅ«senos: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "IÅ¡vedimo srautas nepalaiko raÅ¡ymo" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Å altinio srautas jau užvertas" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Resursas vietoje „%s“ neegzistuoja" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Resurso vietoje „%s“ nepavyko iÅ¡skleisti" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Resursas vietoje „%s“ nėra katalogas" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Å vesties srautas nerealizuoja paieÅ¡kos" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Spausdinti pagalbą" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[KOMANDA]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "IÅ¡vardinti sekcijas, turinčias resursus elf FAILE" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"IÅ¡vardinti resursus\n" +"Jei SEKCIJA pateikta, iÅ¡vardinti tik resursus Å¡ioje sekcijoje\n" +"Jei KELIAS yra pateiktas, iÅ¡vardinti tik atitinkančius resursus" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FAILAS [KELIAS]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SEKCIJA" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"IÅ¡vardinti resursus su detalėmis\n" +"Jei SEKCIJA pateikta, iÅ¡vardinti tik resursus Å¡ioje sekcijoje\n" +"Jei KELIAS pateiktas, iÅ¡vardinti tik atitinkamus resursus\n" +"Detalės įtraukia sekciją, dydį ir suspaudimą" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "IÅ¡gauti resurso failą į standartinę iÅ¡vastį" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FAILO KELIAS" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Nežinoma komanda „%s“\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Naudojimas:\n" +" gresource [--section SEKCIJA] KOMANDA [ARGUMENTAI...]\n" +"\n" +"Komandos:\n" +" help Rodyti Å¡ią informaciją\n" +" sections IÅ¡vardinti sekcijas\n" +" list IÅ¡vardinti resursus\n" +" details IÅ¡vardinti resursus su detalėmis\n" +" extract IÅ¡gauti resursą\n" +"\n" +"Naudokite „gresource help KOMANDA“ detalesnei pagalbai.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Naudojimas:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumentai:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKCIJA (NebÅ«tinas) elf sekcijos pavadinimas\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMANDA Komanda (nebÅ«tina) paaiÅ¡kinimui\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FAILAS elf failas (dvejetainis arba bendro naudojimo biblioteka)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FAILAS elf failas (dvejetainis arba bendro naudojimo biblioteka)\n" +" arba kompiliuotas resurso failas\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[KELIAS]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " KELIAS (NebÅ«tinas) resurso kelias (gali bÅ«ti dalinis)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "KELIAS" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " KELIAS Resurso kelias\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nėra schemos „%s“\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema „%s“ yra neperkeliama (kelias neturi bÅ«ti nurodomas)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema „%s“ yra perkeliama (kelias turi bÅ«ti nurodytas)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Pateiktas tuščias kelias.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Kelias turi prasidėti pasviruoju brÅ«kÅ¡niu (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Kelias turi baigtis pasviruoju brÅ«kÅ¡niu (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Kelias neturi turėti dviejų gretimų pasvirųjų brÅ«kÅ¡nių (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nėra rakto „%s“\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Pateikta reikÅ¡mė yra už leistinų ribų\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "IÅ¡vardinti įdiegtas (neperkeliamas) schemas" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "IÅ¡vardinti įdiegtas perkeliamas schemas" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "IÅ¡vardinti raktus SCHEMOJE" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:KELIAS]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "IÅ¡vardina vaikus SCHEMOJE" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Rekursyviai iÅ¡vardinti raktus ir reikÅ¡mes\n" +"Jei SCHEMA nepateikta, iÅ¡vardinti visus raktus\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:KELIAS]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Gauti RAKTO reikÅ¡mę" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMOS[:KELIO] RAKTAS" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Užklausti galimų reikÅ¡mių rėžių RAKTUI" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Nustatyti RAKTO REIKÅ MĘ" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMOS[:KELIO] RAKTO REIKÅ MĖ" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Nustatyti RAKTĄ į jo numatytąją reikÅ¡mę" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Atstatyti visus SCHEMOS raktus į jų numatytasias reikÅ¡mes" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Patikrinti, ar RAKTAS yra raÅ¡omas" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Stebėti RAKTO pasikeitimus.\n" +"Jei RAKTAS nenurodytas, stebėti visus raktus SCHEMOJE.\n" +"Naudoti ^C stebėjimo nutraukimui.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:KELIAS] [RAKTAS]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Naudojimas:\n" +" gsettings [--schemadir SCHEMADIR] KOMANDA [ARGUMENTAI...]\n" +"\n" +"Komandos:\n" +" help Rodyti Å¡ią informaciją\n" +" list-schemas IÅ¡vardinti įdiegtas schemas\n" +" list-relocatable-schemas IÅ¡vardinti perskeliamas schemas\n" +" list-keys IÅ¡vardinti raktus schemoje\n" +" list-children IÅ¡vardinti schemos vaikus\n" +" list-recursively Rekursyviai iÅ¡vardinti raktus ir reikÅ¡mes\n" +" range Užklausia rakto rėžių\n" +" get Gauti rakto reikÅ¡mę\n" +" set Nustatyti rakto reikÅ¡mę\n" +" reset Nuvalyti rakto reikÅ¡mę\n" +" writable Patikrinti, ar raktas yra raÅ¡omas\n" +" monitor Stebėti pasikeitimus\n" +"\n" +"Naudokite 'gsettings help KOMANDA' detalesnei pagalbai gauti.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Naudojimas:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMOSKAT Katalogas, kur ieÅ¡koti papildomų schemų\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Schemos pavadinimas\n" +" KELIAS Kelias perkeliamoms schemoms\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " RAKTAS Raktas schemoje (nebÅ«tinas)\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " RAKTAS Raktas schemoje\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " REIKÅ MĖ ReikÅ¡mė, kurią nustatyti\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Pateiktas tuščias schemos pavadinimas\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Netinkamas lizdas, nepavyko inicijuoti" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Netinkamas lizdas, nepavyko inicijuoti: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Lizdas jau užvertas" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Lizdo I/O baigėsi laikas" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "iÅ¡ fd kuriamas GSocket: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nepavyko sukurti lizdo: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Nurodyta nežinoma Å¡eima" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Nurodytas nežinomas protokolas" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "nepavyko gauto lokalaus adreso: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "nepavyko gauti nuotolinio adreso: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "nepavyko klausytis: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Susiejimo su adresu klaida: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Klaida prisijungian prie transliavimo grupės: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Klaida paliekant transliavimo grupę: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Nėra resursams specifinio transliavimo palaikymo" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Klaida priimant ryšį: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Prisijungiama" + +#: ../gio/gsocket.c:2346 +#| msgid "Unable to get pending error: %s" +msgid "Unable to get pending error: " +msgstr "Nepavyko gauti laukiančios klaidos: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Klaida priimant duomenis: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Klaida siunčiant duomenis: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nepavyko iÅ¡jungti lizdo: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Klaida užveriant lizdą: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Laukiama lizdo bÅ«senos: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Klaida siunčiant praneÅ¡imą: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "„Windows“ sistemoje „GSocketControlMessage“ nepalaikoma" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Klaida priimant praneÅ¡imą: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nepavyko gauti laukiančios klaidos: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials nerealizuota Å¡iai operacinei sistemai" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nepavyko prisijungti prie tarpinio serverio %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nepavyko prisijungti prie %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Nepavyko prisijungti: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Nežinoma klaida prisijungiant" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Bandymas naudoti proxy ne per TCP ryšį nepalaikomas." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Tarpinio serverio protokolas „%s“ nepalaikomas." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Gavėjas jau užvertas" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Pridėtasis lizdas yra užvertas" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nepalaiko IPv6 adreso „%s“" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Naudotojo vardas yra per ilgas SOCKSv4 protokolui" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Kompiuterio vardas „%s“ yra per ilgas SOCKSv4 protokolui" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Serveris nėra SOCKSv4 proxy serveris." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "RyÅ¡ys per SOCKSv4 serverį buvo atmestas" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Serveris nėra SOCKSv5 proxy serveris." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 proxy reikalauja tapatybės patvirtinimo." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 reikalauja tapatybės patvirtinimo metodo, kurio GLib nepalaiko." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Naudotojo vardas arba slaptažodis yra per ilgas SOCKSv5 protokolui." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 tapatybės patvirtinimas nepavyko dėl neteisingo naudotojo vardo arba " +"slaptažodžio." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Kompiuterio vardas „%s“ yra per ilgas SOCKSv5 protokolui" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 proxy serveris naudoja nežinomą adresų tipą." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Vidinė SOCKSv5 proxy serverio klaida." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 ryÅ¡ys neleidžiamas pagal taisykles." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Kompiuteris nepasiekiamas per SOCKSv5 serverį." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Tinklas nepasiekiamas per SOCKSv5 proxy." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "RyÅ¡ys per SOCKSv5 proxy atmestas." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 proxy nepalaiko „connect“ komandos." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 proxy nepalaiko pateikto adreso tipo." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Nežinoma SOCKSv5 proxy klaida." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nepavyko apdoroti GThemedIcon koduotės versijos %d" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Klaida iÅ¡riÅ¡ant „%s“: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Klaida atvirkščiai iÅ¡riÅ¡ant „%s“: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nėra DNS įraÅ¡o praÅ¡omam tipui „%s“" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Laikinai nepavyko iÅ¡riÅ¡ti „%s“" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Klaida iÅ¡riÅ¡ant „%s“" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nepavyko perskaityti PEM užkoduoto privataus rakto" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nerastas PEM užkoduotas privatus raktas" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nepavyko perskaityti PEM užkoduoto privataus rakto" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nerastas PEM užkoduotas sertifikatas" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nepavyko perskaityti PEM užkoduoto sertifikato" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Tai yra paskutinis Å¡ansas įvesti teisingą slaptažodį, kitaip jÅ«sų prieiga " +"bus užrakinta." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Keli įvesti slaptažodžiai buvo neteisingi ir jÅ«sų prieiga bus užblokuota po " +"tolesnių nesėkmių." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Ä®vestas slaptažodis yra neteisingas." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Tikėtasi vieno kontrolinio praneÅ¡imo, bet sulaukta %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Netikėtas tarnybinių duomenų tipas" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Tikėtasi vieno fd, bet sulaukta %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Gautas netinkamas fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Klaida siunčiant įgaliojimus: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Klaida tikrinant, ar SO_PASSCRED įjungta lizdui: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Klaida leidžiant SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Tikimasi nustatyti vienintelį baitą įgaliojimų gavimui, bet nuskaityta nulis " +"baitų" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Nesitikėta kontrolinio praneÅ¡imo, bet sulaukta %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Klaida iÅ¡jungiant SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Klaida skaitant failą: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Klaida užveriant failą: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Failų sistemos Å¡aknis" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Klaida raÅ¡ant į failą: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +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:276 +msgid "Can't find application" +msgstr "Nepavyko rasti programos" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Klaida paleidžiant programą: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI nepalaikomi" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "saitų keitimai win32 sistemose nepalaikomi" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Saitų kÅ«rimas win32 sistemose nepalaikomas" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Klaida skaitant iÅ¡ rankenėlės: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Klaida užveriant rankenėlę: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Klaida raÅ¡ant į rankenėlę: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nepakanka atminties" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Vidinė klaida: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Reikia daugiau įvesties" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Netinkami suspausti duomenys" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresas, kurio klausytis" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Nepaisoma, suderinamumui su GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Spausdinti adresą" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Spausdinti adresą apvalkalo veiksenoje" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Paleisti dbus tarnybą" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Blogi argumentai\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Netikėtas atributas „%s“ elementui „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Nerastas elemento „%2$s“ atributas „%1$s“" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Netikėta žyma „%s“, tikėtasi žymos „%s“" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Netikėta žyma „%s“ „%s“ viduje" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Duomenų aplankuose nerasta tinkamo žymelių failo" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI „%s“ žymelė jau yra" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nerasta žymelė URI „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI „%s“ žymelėje nenurodyta jokia grupė" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Nepilna simbolio seka įvedimo pabaigoje" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Negalima keisti atgalinio varianto „%s“ į koduotę „%s“" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Vietinio failo adresas „%s“ negali turėti simbolio „#“" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adresas „%s“ yra klaidingas" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Kompiuterio vardas „%s“ adrese yra klaidingas" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adrese „%s“ yra klaidingai perkoduoti symboliai" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Kelias „%s“ nėra absoliutus" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Klaidingas kompiuterio vardas" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a, %Y m. %b %e d., %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Y-%m-%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Sausis" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Vasaris" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Kovas" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Balandis" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Gegužė" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Birželis" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Liepa" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "RugpjÅ«tis" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Rugsėjis" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Spalis" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Lapkritis" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Gruodis" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Sau" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Vas" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Kov" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Bal" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Geg" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Bir" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Lie" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Rgp" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Rgs" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Spa" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Lap" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Grd" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Pirmadienis" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Antradienis" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Trečiadienis" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Ketvirtadienis" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Penktadienis" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Å eÅ¡tadienis" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sekmadienis" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pir" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Ant" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Tre" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Ket" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pen" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Å eÅ¡" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sek" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Klaida atidarant aplanką „%s“: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %ld byte to read file \"%s\"" +#| msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Nepavyko iÅ¡skirti %lu baito failo „%s“ perskaitymui" +msgstr[1] "Nepavyko iÅ¡skirti %lu baitų failo „%s“ perskaitymui" +msgstr[2] "Nepavyko iÅ¡skirti %lu baitų failo „%s“ perskaitymui" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Klaida skaitant failą „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Failas „%s“ per didelis" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nepavyko perskaityti failo „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nepavyko atverti failo „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Nepavyko gauti failo „%s“ atributų: fstat() klaida: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Nepavyko atverti failo „%s“: fdopen() klaida: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nepavyko sukurti failo „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fwrite() klaida: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fflush() klaida: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Nepavyko įraÅ¡yti failo „%s“: fsync() klaida: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Nepavyko užverti failo „%s“: fclose() klaida: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablonas „%s“ klaidingas, jame negali bÅ«ti „%s“" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablone „%s“ nėra XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nepavyko perskaityti simbolinės nuorodos „%s“: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Simbolinės nuorodos nepalaikomos" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nepavyko atverti keitiklio iÅ¡ „%s“ į „%s“: %s" + +#: ../glib/giochannel.c:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Nepakeistų duomenų likučiai skaitymo buferyje" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanalas pasibaigia nepilnu simboliu" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "PaieÅ¡kos aplankuose nepavyko rasti tinkamo raktų failo" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Nėra paprastas failas" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Netinkamas grupės pavadinimas: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Raktų failas neprasideda grupe" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Netinkamas rakto pavadinimas: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Raktų faile yra nepalaikoma koduotė „%s“" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Raktų failas neturi grupės „%s“" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Raktų failas neturi rakto „%s“" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Raktų faile yra raktas „%s“ grupėje „%s“, kuriame yra reikÅ¡mė, kurios " +"negalima suprasti." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Raktas „%s“ grupėje „%s“ turi reikÅ¡mę „%s“, nors tikimasi %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +msgid "Key file contains escape character at end of line" +msgstr "Raktų faile, eilutės pabaigoje yra pabėgimo simbolis" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Raktų faile yra klaidinga pabėgimo eilutė „%s“" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ReikÅ¡mės „%s“ negalima interpretuoti kaip skaičiaus." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Sveikoji reikÅ¡mė „%s“ virÅ¡ija ribas" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ReikÅ¡mės „%s“ negalima interpretuoti kaip loginės." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Nepavyko gauti failo „%s%s%s%s“ atributų: fstat() klaida: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Nepavyko pažymėti failo %s%s%s%s: mmap() klaida: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Nepavyko atverti failo „%s“: open() klaida: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Klaida eilutėje %d simbolyje %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "„%s“ nėra tinkamas vardas" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "„%s“ nėra tinkamas vardas: „%c“" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Klaida eilutėje %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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 perskaityti „%-.*s“, kuris galėjo turėti skaičius simbolio apraÅ¡yme " +"(pvz., ê) - gal skaičius per didelis" + +#: ../glib/gmarkup.c:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Simbolio apraÅ¡ymas „%-.*s“ neatitinka leistinų simbolių" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Aptiktas tuščias elementas '&;'; galimi elementai yra: & " < " +"> '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Elemento vardas „%-.*s“ nežinomas" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentas turėtų prasidėti elementu (pvz., )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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ą žymą „%s“" + +#: ../glib/gmarkup.c:1311 +#, 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:1352 +#, 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ų žymą „%s“, arba papildomo požymio; gal JÅ«s panaudojote " +"netinkama simbolį požymio varde" + +#: ../glib/gmarkup.c:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentas tuščias arba susideda tik iÅ¡ tarpų" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentas netikėtai pasibaigė tuoj po atidarančių skliaustų '<'" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokumentas netikėtai pasibaigė, tikėtasi uždarančių skliaustų simbolio, " +"užbaigiančio žymą <%s/>" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentas netikėtai pasibaigė elemento varde" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentas netikėtai pasibaigė požymio varde" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentas netikėtai pasibaigė elemento atvėrimo žyma." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentas netikėtai pasibaigė požymio verte" + +#: ../glib/gmarkup.c:1829 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokumentas netikėtai pasibaigė žymos „%s“ uždarančiame simbolyje" + +#: ../glib/gmarkup.c:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentas netikėtai pasibaigė komentaruose arba apdorojimo instrukcijose" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Naudojimas:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[PARINKTIS…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Pagalbos parinktys:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Rodyti pagalbos parinktis" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Rodyti visas pagalbos parinktis" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Programos parinktys:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nepavyko apdoroti sveikosios reikÅ¡mės „%s“, reikalingos %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Sveikoji reikÅ¡mė „%s“, reikalinga %s, virÅ¡ija ribas" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nepavyko apdoroti dvigubos reikÅ¡mės „%s“, reikalingos %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Dviguboji reikÅ¡mė „%s“, reikalinga %s, virÅ¡ija ribas" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Klaida apdorojant parinktį %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s trÅ«ksta argumento" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Nežinoma parinktis %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "sugadintas objektas" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "vidinė klaida arba sugadintas objektas" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "nebėra atminties" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "pasiekta atgalinio sekimo riba" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "Å¡ablone yra dalinio atitikimo nepalaikomų elementų " + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "atgalinės nuorodos kaip sąlygos nepalaikomos daliniam atitikimui" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "pasiekta rekursijos riba" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "netinkama naujos eilutės vėliavėlių kombinacija" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "blogas poslinkis" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "trumpas utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekursijos ciklas" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "nežinoma klaida" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ Å¡ablono pabaigoje" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c Å¡ablono pabaigoje" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "neatpažintas simbolis po \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "skaičiai ne iÅ¡ eilės {} kvantoriuje" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "skaičius per didelis {} kvantoriuje" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "trÅ«ksta baigiamojo ] simbolio klasei" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "klaidinga speciali seka simbolio klasėje" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "ruožas ne iÅ¡ eilės simbolio klasėje" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nėra ką kartoti" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "netikėtas pakartojimas" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "neatpažintas simbolis po (? arba (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "klasės POSIX vardais leidžiamos tik klasių viduje" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "trÅ«ksta baigiamojo )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "nuoroda į neegzistuojantį poÅ¡ablonį" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "trÅ«ksta ) po komentaro" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "reguliarioji iÅ¡raiÅ¡ka per didelė" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "nepavyko rezervuoti atminties" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") be atveriamojo (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "kodo pervirÅ¡is" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "neatpažintas simbolis po (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "žiÅ«ros atgal teiginys nefiksuoto ilgio" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "netaisyklingas skaičius ar vardas po (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "sąlyginė grupė turi daugiau negu dvi Å¡akas" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "tikimasi teiginio po (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "po (?R arba (?[+-]skaitmenys turi bÅ«ti )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nežinomas POSIX klasės vardas" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX gretinimo elementai nepalaikomi" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "simbolio reikÅ¡mė \\x{…} sekoje per didelė" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "netaisyklinga sąlygą (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C neleistinas žiÅ«ros atgal teiginyje" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "pakaitos simboliai \\L, \\l, \\N{name}, \\U, and \\u nepalaikomi" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekursyvus iÅ¡kvietimas gali veikti be galo" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "neatpažintas simbolis po (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "trÅ«ksta baigiamojo simbolio poÅ¡ablonio pavadinime" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "du vardiniai poÅ¡abloniai turi tą patį vardą" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "netaisyklinga \\P arba \\p seka" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nežinomas savybės vardas po \\P arba \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "poÅ¡ablonio vardas per ilgas (turi bÅ«ti iki 32 simbolių)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "per daug vardinių poÅ¡ablonių (iki 10000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "aÅ¡tuntainė reikÅ¡mė didesnė už \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "perpildyta kompiliavimo sritis" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "anksčiau tikrintas nurodytas poÅ¡ablonis nerastas" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupėje yra daugiau negu viena Å¡aka" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "nenuoseklios NEWLINE savybės" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"po \\g nėra vardo riestiniuose arba lenktiniuose skliaustuose ar teigiamo " +"skaičiaus, ar tiesiog skaičiaus" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "numeruota nuoroda turi bÅ«ti ne nulis" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "argumentas neleidžiamas veiksmams (*ACCEPT), (*FAIL), ir (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) neatpažintas" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "numeris per didelis" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "trÅ«ksta baigiamojo simbolio poÅ¡ablonio po (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "laukta skaitmens po (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] yra netinkamas duomenų simbolis JavaScript suderinamumo veiksenoje" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "skirtingi vardai to paties skaičiaus poÅ¡abloniams nėra leistini" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) privalo turėti argumentą" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "Po \\c turi bÅ«ti ASCII simbolis" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"po \\k nėra vardo riestiniuose arba lenktiniuose skliaustuose arba kabutėse" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N nepalaikomas klasėje" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "per daug nuorodų tolyn" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "pavadinimas yra per ilgas (*MARK), (*PRUNE), (*SKIP), ir (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "simbolio reikÅ¡mė \\u… sekoje per didelė" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Klaida ieÅ¡kant reguliariosios iÅ¡raiÅ¡kos %s atitikmens: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE biblioteka sukompiliuota be UTF8 palaikymo" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE biblioteka sukompiliuota be UTF8 ypatybių palaikymo" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE biblioteka sukompiliuota su nesuderinamomis parinktimis" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Klaida optimizuojant reguliariąją iÅ¡raiÅ¡ką %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "laukta Å¡eÅ¡ioliktainio skaitmens arba „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "laukta Å¡eÅ¡ioliktainio skaitmens" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "simbolinėje nuorodoje trÅ«ksta „<“" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "nebaigta simbolinė nuoroda" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "nulinio ilgio simbolinė nuoroda" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "laukta skaitmens" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "neleistina simbolinė nuoroda" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "nevietoje galutinis „\\“" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "nežinoma kaitos seka" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Cituojamas tekstas neprasideda citavimo ženklu" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekstas buvo tuščias arba turėjo vien tik tarpo simbolius)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nepavyko gauti duomenis iÅ¡ antrinio proceso (%s)" + +#: ../glib/gspawn.c:368 +#, 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:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Vaikinis procesas išėjo su kodu %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Vaikinis procesas nutrauktas signalu %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Vaikinis procesas sustabdytas signalu %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Vaikinis procesas išėjo nenormaliai" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nepavyko perskaityti duomenų iÅ¡ antrinio konvejerio (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nepavyko atskirti (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nepavyko pakeisti į aplanką „%s“ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" + +#: ../glib/gspawn.c:1522 +#, 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:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nepavyko atskirti antrinio proceso (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nežinoma klaida vykdant antrinį procesą „%s“" + +#: ../glib/gspawn.c:1563 +#, 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/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Nepavyko gauti duomenų iÅ¡ antrinio proceso" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Netinka seka aplinkoje: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Netinkamas darbinis aplankas: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nepavyko paleisti pagalbinės programos (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Simbolis neatitinka UTF-8 simbolių diapazono" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Klaidinga seka keitimo įvestyje" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Simbolis neatitinka UTF-16 simbolių diapazono" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u baitas" +msgstr[1] "%u baitai" +msgstr[2] "%u baitų" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s baitas" +msgstr[1] "%s baitai" +msgstr[2] "%s baitų" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + diff --git a/po/lv.po b/po/lv.po new file mode 100644 index 0000000..6a82c07 --- /dev/null +++ b/po/lv.po @@ -0,0 +1,4459 @@ +# glib for Latvian. +# Copyright (C) 2002 Free Software Foundation, Inc. +# +# Artis Trops , 2002. +# RÅ«dofls Mazurs , 2011, 2012. +# RÅ«dolfs Mazurs , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-22 20:32+0300\n" +"PO-Revision-Date: 2012-09-22 20:02+0300\n" +"Last-Translator: RÅ«dolfs Mazurs \n" +"Language-Team: LatvieÅ¡u \n" +"Language: lv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Gtranslator 2.91.5\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " +"2);\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Pārāk liela vērtÄ«ba tika padota %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Uz bāzes plÅ«smas meklēšana netiek atbalstÄ«ta" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Nevar apraut GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "PlÅ«sma jau ir aizvērta" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Uz bāzes plÅ«smas aprauÅ¡ana nav atbalstÄ«ta" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "DarbÄ«ba tika atcelta" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "NederÄ«gs objekts, nav inicializēts" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "NepilnÄ«ga vairāku baitu sekvence ievadē" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "MērÄ·Ä« nepietiek brÄ«vās vietas" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Nepareiza baitu secÄ«ba konversijas ievadē" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Kļūda, konversējot — %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Atceļama inicializācija nav atbalstÄ«ta" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "PārveidoÅ¡ana no rakstzÄ«mju kopas “%s” uz “%s” nav atbalstÄ«ta" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nevarēja atvērt pārveidotāju no “%s” uz “%s”" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s tips" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Nezināms tips" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s datnes tips" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials nav implementēti Å¡ajā OS" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Å ajā platformā nav GCredentials atbalsta" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "NegaidÄ«ti agras plÅ«smas beigas" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "NeatbalstÄ«ta atslēga “%s” adreses ierakstā “%s”" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adrese “%s” ir nederÄ«ga (vajag tieÅ¡i vienu ceļu, pagaidu mapi vai abstraktas " +"atslēgas)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "BezjēdzÄ«gas atslēgu/vērtÄ«bu pāru kombinācijas adreÅ¡u ierakstā “%s”" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Kļūda adresē “%s” — porta atribÅ«ts ir slikti noformēts" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Kļūda adresē “%s” — saimes atribÅ«ts ir slikti noformēts" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adreses elements “%s” nesatur kolu (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Atslēgas/vērtÄ«bas pāris %d, “%s”, adreses elementā “%s”, nesatur vienādÄ«bas " +"zÄ«mi" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Kļūda, noņemot atsoli atslēgai vai vērtÄ«bai atslēga/vērtÄ«ba pārÄ« %d. “%s”, " +"adreses elementā “%s”" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Kļūda adresē “%s” — unix transportam nepiecieÅ¡ams iestatÄ«t tieÅ¡i vienu " +"atslēgu “path” vai “abstract”" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Kļūda adresē “%s” — trÅ«kst vai slikti noformēts resursdatora atribÅ«ts" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Kļūda adresē “%s” — trÅ«kst vai slikti noformēts porta atribÅ«ts" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Kļūda adresē “%s” — trÅ«kst vai slikti noformēts noncefile atribÅ«ts" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Kļūda, automātiski palaižot: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Nezināms vai neatbalstÄ«ts transports “%s” adresei “%s”" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Kļūda, atverot nonce datni “%s” — %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Kļūda, nolasot no nonce datnes “%s” — %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Kļūda, nolasot no nonce datnes “%s” — gaidÄ«ja 16 baitus, saņēma %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Kļūda, rakstot nonce datnes “%s” saturu uz straumi:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Dotā adrese ir tukÅ¡a" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Nevar izveidot ziņojumu kopni, kad veic machine-id" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Nevar izveidot ziņojumu kopni bez machine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Kļūda, izveidojot komandrindu “%s”: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Ievadiet jebkuru rakstzÄ«mi, lai aizvērtu Å¡o logu)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Sesijas dbus nav palaists un automātiskā palaiÅ¡ana cieta neveiksmi" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Nevar noteikt sesijas kopnes adresi (nav implementēts Å¡ai OS)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nevar noteikt kopnes adresi no DBUS_STARTER_BUS_TYPE vides mainÄ«gā — " +"nezināma vērtÄ«ba “%s”" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nevar noteikt kopnes adresi, jo DBUS_STARTER_BUS_TYPE vides mainÄ«gais nav " +"iestatÄ«ts" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Nezināms kopnes tips %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "NegaidÄ«ts satura trÅ«kums, mēģinot lasÄ«t rindu" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "NegaidÄ«ts satura trÅ«kums, mēģinot (droÅ¡i) lasÄ«t rindu" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Izsmelti visi pieejamie autentifikācijas mehānismi (mēģināti: %s) (pieejami: " +"%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Atcelts caur GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Kļūda, saņemot informāciju par mapi “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Atļaujas mapei “%s” ir slikti formatētas. GaidÄ«ja režīmu 0700, saņēma 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Kļūda, veidojot mapi “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Kļūda, atverot atslēgu saišķi “%s” lasīšanai: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Rinda %d atslēgu saišķim “%s” ar saturu “%s” ir slikti formatēts" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Pirmais marÄ·ieris rindai %d atslēgu saišķim “%s” ar saturu “%s” ir slikti " +"formatēts" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Otrais marÄ·ieris rindai %d atslēgu saišķim “%s” ar saturu “%s” ir slikti " +"formatēts" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Neatrada sÄ«kdatni ar id %d atslēgu saišķī “%s”" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Kļūda, dzēšot neesoÅ¡u slēgÅ¡anas datni “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Kļūda, veidojot slēgÅ¡anas datni “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Kļūda, aizverot (atsaitējot) slēgÅ¡anas datni “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Kļūda, atsaitējot slēgÅ¡anas datni “%s” — %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Kļūda, atverot atslēgu saišķi “%s” rakstīšanai: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Un vēl, “%s” slēguma atbrÄ«voÅ¡ana neizdevās — %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Savienojums ir aizvērts" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Iestājās noildze" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Sastapās ar neatbalstÄ«tiem slēdžiem (flag), veidojot klienta puses " +"savienojumu" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nav tādas saskarnes “org.freedesktop.DBus.Properties” uz objekta ceļa %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Kļūda, iestatot Ä«pašību “%s” — gaidÄ«ja tipu “%s”, bet saņēma “%s”" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Nav tādas Ä«pašības “%s”" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Īpašība “%s” nav lasāma" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Īpašība “%s” nav rakstāma" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Nav tādas saskarnes “%s”" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Nav tādas saskarnes" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nav tādas saskarnes “%s” uz objekta ceļa %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Nav tādas metodes “%s”" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Ziņojuma tips “%s” neatbilda gaidÄ«tajam tipam “%s”" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Objekts jau ir eksportēts saskarnei %s pie %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metode “%s” atgrieza tipu “%s”, bet gaidÄ«ja “%s”" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metode “%s” uz saskarnes “%s” ar parakstu “%s” neeksistē" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s apakÅ¡koks jau ir eksportēts " + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tips ir INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL ziņojums — trÅ«kst PATH vai MEMBER galvene" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN ziņojums — trÅ«kst REPLY_SERIAL galvenes lauks" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR ziņojums — trÅ«kst REPLY_SERIAL vai ERROR_NAME galvenes lauks" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL ziņojums — trÅ«kst PATH, INTERFACE vai MEMBER galvenes datne" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL ziņojums — PATH galvenes datne izmanto rezervēto vērtÄ«bu /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL ziņojums — INTERFACE galvenes dante izmanto rezervēto vērtÄ«bu org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Vēlējās lasÄ«t %lu baitu, bet saņēma EOF" +msgstr[1] "Vēlējās lasÄ«t %lu baitus, bet saņēma EOF" +msgstr[2] "Vēlējās lasÄ«t %lu baitus, bet saņēma EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"GaidÄ«ja derÄ«gu UTF-8 virkni, bet atrada nederÄ«gus baitus pie baitu nobÄ«des " +"%d (virknes garums ir %d). DerÄ«gā UTF-8 virkne lÄ«dz tai vietai bija “%s”" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "GaidÄ«ja NUL baitu pēc virknes “%s”, bet atrada baitu %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Parsētā vērtÄ«ba “%s” nav derÄ«gs D-Bus objekta ceļš" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Parsētā vērtÄ«ba “%s” nav derÄ«gs D-Bus objekta paraksts" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Saskārās ar %u baitu garu masÄ«vu. Maksimālais garums ir 2<<26 baiti (64 " +"MiB)." +msgstr[1] "" +"Saskārās ar %u baitus garu masÄ«vu. Maksimālais garums ir 2<<26 baiti (64 " +"MiB)." +msgstr[2] "" +"Saskārās ar %u baitu garu masÄ«vu. Maksimālais garums ir 2<<26 baiti (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Parsētā vērtÄ«ba “%s” variantam nav derÄ«gs D-Bus paraksts" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Kļūda, deserializējot GVariant ar tipa virkni “%s” no D-Bus vadu formāta" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"NederÄ«ga secÄ«bas (endian) vērtÄ«ba. GaidÄ«ja 0x6c ('l') vai 0x42 ('B'), bet " +"atrada vērÄ«bu 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "NederÄ«ga lielā protokola vērtÄ«ba. GaidÄ«ja 1, bet saņēma %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Paraksta galvene ar parakstu “%s” atrasta, bet vēstules pamatteksts ir tukÅ¡s" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Parsētā vērtÄ«ba “%s” nav derÄ«gs D-Bus paraksts (pamattekstam)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Ziņojumā nav paraksta galvenes, bet ziņojuma pamatteksts ir %u baits" +msgstr[1] "" +"Ziņojumā nav paraksta galvenes, bet ziņojuma pamatteksts ir %u baiti" +msgstr[2] "" +"Ziņojumā nav paraksta galvenes, bet ziņojuma pamatteksts ir %u baitu" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Nevar deserializēt ziņojumu: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Kļūda, serializējot GVariant ar tipa virkni “%s” uz D-Bus vadu formātu" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Ziņojumam ir %d datņu deskriptori, bet galvenes lauks norāda %d datņu " +"deskriptorus" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Nevar serializēt ziņojumu: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Ziņojuma pamattekstam ir paraksts “%s”, bet nav paraksta galvenes" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Vēstules pamattekstam ir tipa paraksts “%s”, bet paraksts galvenes laukā ir " +"“%s”" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Ziņojuma pamatteksts ir tukÅ¡s, bet paraksta galvenes lauks ir “(%s)”" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Kļūdas atgrieÅ¡ana ar pamattekstu ar tipu “%s”" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Kļūdas atgrieÅ¡ana ar tukÅ¡u pamattekstu" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Nevar saņemt aparatÅ«ras profilu — %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nevarēja ielādēt /var/lib/dbus/machine-id vai /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Kļūda, izsaucot StartServiceByName priekÅ¡ %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "NegaidÄ«ta atbilde %d no StartServiceByName(“%s”) metodes" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Nevar izsaukt metodi; starpnieks ir labi zināmam nosaukumam bez Ä«paÅ¡nieka un " +"starpnieks tika veidots ar G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START slēdzi (flag)" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstraktas vārdu telpas nav atbalstÄ«tas" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Nevar norādÄ«t nonce datni, kad veido serveri" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Kļūda, rakstot nonce datni pie “%s” — %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Virkne “%s” nav derÄ«ga D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nevar klausÄ«ties uz neatbalstÄ«ta transporta “%s”" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMANDA" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Komandas:\n" +" help Rāda Å¡o informāciju\n" +" introspect Introspektēt attālinātu objektu\n" +" monitor PārraudzÄ«t attālinātu objektu\n" +" call Izsaukt metodi uz attālināta objekta\n" +" emit IzplatÄ«t signālu\n" +"\n" +"Lieto “%s KOMANDA --help”, lai saņemtu palÄ«dzÄ«bu par katru komandu.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Kļūda: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Kļūda, parsējot introspekcijas XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Savienoties ar sistēmas kopni" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Savienoties ar sesijas kopni" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Savienoties ar doto D-Bus adresi" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Savienojuma galapunktu opcijas:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opcijas, kas norāda savienojuma galapunktus" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nav norādÄ«ti savienojuma galapunkti" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "NorādÄ«ti vairāki savienojuma galapunkti" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"BrÄ«dinājums — spriežot pēc introspekcijas datiem, saskarne “%s” neeksistē\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"BrÄ«dinājums — spriežot pēc introspekcijas datiem, metode “%s” neeksistē uz " +"saskarnes “%s”\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Neobligāts mērÄ·is signālam (unikāls nosaukums)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objekta ceļš, uz kura izplatÄ«t signālu" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signāls un saskarnes nosaukums" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "IzplatÄ«t signālu." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Kļūda savienojot — %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Kļūda — nav norādÄ«ts objekta ceļš.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Kļūda — %s nav derÄ«gs objekta ceļš\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Kļūda — nav norādÄ«ts signāls.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Kļūda — nav norādÄ«ts signāls.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Kļūda — %s nav derÄ«gs saskarnes nosaukums.\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Kļūda — %s nav derÄ«gs dalÄ«bnieka nosaukums.\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Kļūda — %s nav derÄ«gs unikāls kopnes nosaukums.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Kļūda, parsējot parametru %d — %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Kļūda, nopludinot savienojumu — %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "MērÄ·a nosaukums, uz kura izsaukt metodi" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Objekta ceļš, uz kura izsaukt metodi" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Metode un saskarnes nosaukums" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Noildze sekundēs" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Izsaukt metodi uz attālināta objekta." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Kļūda — nav norādÄ«ts galamērÄ·is\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Kļūda — nav norādÄ«ts objekta ceļš\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Kļūda — nav norādÄ«ts metodes nosaukums\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Kļūda — metodes nosaukums “%s” nav derÄ«gs\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Kļūda, parsējot parametru %d ar tipu “%s” — %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "MērÄ·a nosaukums, kam veikt introspekciju" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Objekta ceļš, kam veikt introspekciju" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Drukāt XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Veikt introspekciju bērniem" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Tikai drukāšanas Ä«pašības" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Veikt introspekciju attālinātam objektam." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "MērÄ·a nosaukums uz pārraugu" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Objekta ceļš uz pārraugu" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "PārraudzÄ«t attālinātu objektu." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Nenosaukts" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Darbvirsmas datne nenorādÄ«ja Exec lauku" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Nevarēja atrast termināli, kas ir nepiecieÅ¡ams lietotnei" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nevar izveidot lietotāja lietotnes konfigurācijas mapi %s — %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nevar izveidot lietotāja MIME konfigurācijas mapi %s — %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Lietotnes informācijai trÅ«kst identifikatora" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nevar izveidot lietotāja darbvirsmas datni %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Pielāgotas %s definÄ«cijas" + +#: ../gio/gdrive.c:393 +msgid "drive doesn't implement eject" +msgstr "dzinis neatbalsta izgrūšanu" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gdrive.c:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "dzinis neatbalsta izgrūšanu vai eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "dzinis neatbalsta medija aptauju" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "dzinis neatbalsta startēšanu" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "dzinis neatbalsta apturēšanu" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS atbalsts nav pieejams" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nevar apstrādāt GEmblem versijas %d kodējumu" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Vairāki slikti formēti marÄ·ieri (%d) GEmblem kodējumā" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nevar apstrādāt GEmblemedIcon versijas %d kodējumu" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Vairāki slikti formēti marÄ·ieri (%d) GEmblemedIcon kodējumā" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GaidÄ«ja GEmblem priekÅ¡ GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +msgid "Operation not supported" +msgstr "DarbÄ«ba nav atbalstÄ«ta" + +#. 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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "SaturoÅ¡ais montēšanas punkts neeksistē" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Nevar kopēt virsÅ« mapei" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Nevar uzkopēt mapi virsÅ« mapei" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "MērÄ·a datne eksistē" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Nevar rekursÄ«vi kopēt mapi" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Splice nav atbalstÄ«ts" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Kļūda, datnei veicot splice — %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Nevar kopēt Ä«paÅ¡u datni" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Ir dota nederÄ«ga simboliskās saites vērtÄ«ba" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Miskaste nav atbalstÄ«ta" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Datņu nosaukums nevar saturēt “%c”" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "sējums neatbalsta montēšanu" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Neviena lietotne nav reÄ£istrēta, kā Å¡o datni apstrādājoÅ¡a" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "SkaitÄ«tājs ir aizvērts" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Datņu skaitÄ«tājam ir neizpildÄ«ta darbÄ«ba" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +msgid "File enumerator is already closed" +msgstr "Datņu skaitÄ«tājs jau ir aizvērts" + +#: ../gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nevar apstrādāt GFileIcon versijas %d kodējumu" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Slikti formēti GFileIcon ievades dati" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "PlÅ«sma neatbalsta query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Uz plÅ«smas meklēšana netiek atbalstÄ«ta" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Uz ievades plÅ«smas aprauÅ¡ana nav atbalstÄ«ta" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Uz plÅ«smas aprauÅ¡ana nav atbalstÄ«ta" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nepareizs marÄ·ieru skaits (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Nav tips klases nosaukumam %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tips %s nav realizējis GIcon saskarni" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tips %s nav klasē" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Slikti formēts versijas numurs — %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Tips %s nerealizē from_tokens() uz GIcon saskarnes" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Nevar apstrādāt piegādāto ikonu kodējumu versiju" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nav norādÄ«tas adreses" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Garums “%u” ir pārāk liels adresēm" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adresei ir biti, kas ir iestatÄ«ti pēc prefiksa garuma" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Neizdevās parsēt “%s” kā IP adreses masku" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nepietiek vietas ligzdas adresei" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "NeatbalstÄ«ta soketa adrese" + +#: ../gio/ginputstream.c:194 +msgid "Input stream doesn't implement read" +msgstr "Ievades plÅ«sma neatbalsta lasīšanu" + +#. 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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "PlÅ«smai ir neizpildÄ«ta darbÄ«ba" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elements <%s> nav atļauts iekÅ¡ <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elements <%s> nav atļauts augšējā lÄ«menÄ«" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Datne %s resursā parādās vairākas reizes" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Neizdevās atrast “%s” nevienā avotu mapē" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Neizdevās atrast “%s” paÅ¡reizējā mapē" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Nezināma apstrādes opcija “%s”" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Neizdevās izveidot pagaidu datni — %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Kļūda, apstrādājot ievades datni ar xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Kļūda, apstrādājot ievades datni ar to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Kļūda, nolasot datni %s — %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Kļūda, saspiežot datni %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "teksts nevar atrasties iekÅ¡ <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "izvades datnes nosaukums" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "DATNE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Mapes, no kurām nolasÄ«t datnes (pēc noklusējuma paÅ¡reizējā mape)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "MAPE" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Veidot izvadi, kas ir mērÄ·a datnes nosaukuma paplaÅ¡inājuma formātā" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Veidot avota galveni" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Veidot pirmkodu, ko izmantot, lai saistÄ«tu resursu datni jÅ«su kodā" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Veidot atkarÄ«bu sarakstu" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Resursu neveidot un nereÄ£istrēt automātiski" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "C identifikatora nosaukums veidotajam pirmkodam" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompilēt resursu specifikāciju resursa datnē.\n" +"Resursu specifikācijas datnēm ir jābÅ«t ar paplaÅ¡inājumu .gresource.xml,\n" +"un resursu datnēm jābÅ«t ar paplaÅ¡inājumu .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Jums jānorāda tieÅ¡i viens datnes nosaukums\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "nav atļauti tukÅ¡i nosaukumi" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nederÄ«gs nosaukums “%s” — nosaukumiem jāsākas ar mazo burtu" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nederÄ«gs nosaukums “%s” — nederÄ«ga rakstzÄ«me “%c”; ir atļauti tikai burti, " +"skaitļi un defise (“-”)." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "nederÄ«gs nosaukums “%s” — divas secÄ«gas defises (“--”) nav atļautas." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "nederÄ«gs nosaukums “%s” — pēdējā rakstzÄ«me nevar bÅ«t defise (“-”)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nederÄ«gs nosaukums “%s” — maksimālais garums ir 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " jau norādÄ«ts" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "nevar pievienot atslēgas “list-of” shēmai" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " jau norādÄ«ts" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" ēnas iekÅ¡ ; izmantojiet " +", lai mainÄ«tu vērtÄ«bu" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"jānorāda tieÅ¡i viens tips “type”, “enum” vai “flags” kā atribÅ«ts atslēgai " +"" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (vēl) nav definēts." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "nederÄ«ga GVariant tipa virkne “%s”" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " dots, bet shēma neko nepaplaÅ¡ina" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "nav ko pārrakstÄ«t" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " jau norādÄ«ts" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " jau eksistē" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " paplaÅ¡ina vēl neesoÅ¡u shēmu “%s”" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " ir saraksts ar vēl neesošām shēmām “%s”" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nevar bÅ«t shēmu saraksts ar ceļu" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nevar paplaÅ¡ināt shēmu ar ceļu" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" ir saraksts, paplaÅ¡ina , kas nav saraksts" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" paplaÅ¡ina bet " +"“%s” nepaplaÅ¡ina “%s”" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ceļam, ja tāds ir dots, jābeidzas ar slÄ«psvÄ«tru" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ceļam jābeidzas ar “:/”" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> jau norādÄ«ts" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elements <%s> nav atļauts augšējā lÄ«menÄ«" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict tika norādÄ«ts; iziet.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Tikai ignorēta visa datne.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorē Å¡o datni.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nav tādas atslēgas “%s” shēmā “%s” kā norādÄ«ts pārrakstīšanas datnē “%s”" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorē pārrakstīšanu Å¡ai atslēgai.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " un tika norādÄ«ts --strict; iziet.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"kļūda, parsējot atslēgu “%s” shēmā “%s” kā norādÄ«ts pārrakstīšanas datnē " +"“%s” — %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorē pārrakstīšanu Å¡ai atslēgai.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"pārrakstīšana atslēgai “%s” shēmā “%s” pārrakstīšanas datnē “%s” ir ārpus " +"dotās shēmas apgabala" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"pārrakstīšana atslēgai “%s” shēmā “%s” pārrakstīšanas datnē “%s” nav derÄ«go " +"izvēļu sarakstā" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "kur uzglabāt gschemas.compiled datni" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Atcelt pie jebkuras kļūdas shēmās" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "NerakstÄ«t gschema.compiled datni" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Neuzspiest atslēgu nosaukumu ierobežojumus" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompilēt visas GSettings shēmas datnes uz shēmas keÅ¡u.\n" +"Shēmu datņu nosaukumiem ir jābÅ«t ar paplaÅ¡inājumu .gschema.xml,\n" +"un keÅ¡a datnēm ir jāsaucas gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Jums jānorāda tieÅ¡i viens mapes nosaukums\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Nav atrastas shēmu datnes: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "neko nedarÄ«t.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "izņēma esoÅ¡o izvades datni.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Nevar atrast noklusēto lokālo mapi novēroÅ¡anas tipu" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "NederÄ«gs datnes nosaukums %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Kļūda, saņemot datņu sistēmas informāciju — %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Nevar pārsaukt saknes mapi" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Kļūda, pārsaucot datni — %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Nevar pārsaukt datni; datnes nosaukums jau eksistē" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "NederÄ«gs datnes nosaukums" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Nevar atvērt mapi" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Kļūda, atverot datni — %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Kļūda, dzēšot datni — %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Kļūda, izmetot datni miskastē — %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nevar izveidot miskastes mapi %s — %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Nevar atrast augšējā lÄ«meņa mapi miskastei" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Nevar atrast vai izveidot miskastes mapi" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nevar izveidot miskastes informācijas datni — %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nevar izmest datni miskastē — %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "iekšēja kļūda" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Kļūda, izveidojot mapi — %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Datņu sistēma neatbalsta simboliskās saites" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Kļūda, veidojot simbolisko saiti — %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Kļūda, pārvietojot datni — %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Nevar pārvietot mapi virsÅ« mapei" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Neizdevās izveidot rezerves kopijas datni" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Kļūda, dzēšot mērÄ·a datni — %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "PārvietoÅ¡ana starp montētiem sējumiem nav atbalstÄ«ta" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "AtribÅ«ta vērtÄ«bai ir jābÅ«t ne NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "NederÄ«gs atribÅ«ta tips (tika gaidÄ«ta virkne)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "NederÄ«gs paplaÅ¡inātais atribÅ«ta nosaukums" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Kļūda, iestatot paplaÅ¡ināto atribÅ«tu “%s” — %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (nederÄ«gs kodējums)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Kļūda, saņemot informāciju par datni “%s” — %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Kļūda, saņemot informāciju datnes deskriptoram — %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "NederÄ«gs atribÅ«ta tips (tika gaidÄ«ts uint32)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "NederÄ«gs atribÅ«ta tips (tika gaidÄ«ts uint64)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "NederÄ«gs atribÅ«ta tips (tika gaidÄ«ta bitu virkne)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "Nevar iestatÄ«t atļaujas simboliskajām saitēm" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Kļūda, iestatot tiesÄ«bas — %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "Kļūda, iestatot Ä«paÅ¡nieku — %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "simboliskajai saitei ir jābÅ«t ne NULL" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Kļūda, iestatot simbolisko saiti — %s" + +#: ../gio/glocalfileinfo.c:2099 +msgid "Error setting symlink: file is not a symlink" +msgstr "Kļūda, iestatot simbolisko saiti — datne nav simboliskā saite" + +#: ../gio/glocalfileinfo.c:2225 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Kļūda, iestatot izmaiņu vai piekļuves laiku — %s" + +#: ../gio/glocalfileinfo.c:2248 +msgid "SELinux context must be non-NULL" +msgstr "SELinux kontekstam ir jābÅ«t ne NULL" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Kļūda, iestatot SELinux kontekstu — %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nav ieslēgts uz šīs sistēmas" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s atribÅ«ta iestatīšana nav atbalstÄ«ta" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Kļūda, lasot no datnes — %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Kļūda, meklējot datnē — %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Kļūda, aizverot datni — %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Nevar atrast noklusēto lokālo datņu novēroÅ¡anas tipu" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Kļūda, rakstot datnē — %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Kļūda, dzēšot vecu rezerves kopijas saiti — %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Kļūda, veidojot rezerves kopiju — %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Kļūda, pārsaucot pagaidu datni — %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Kļūda, apraujot datni — %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Kļūda, atverot datni “%s” — %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "MērÄ·a datne ir mape" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "MērÄ·a datne nav parasta datne" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Datne tika mainÄ«ta no ārpuses" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Kļūda, dzēšot veco datni — %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Piegādāts nederÄ«gs GSeekType" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "NederÄ«gs meklēšanas pieprasÄ«jums" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nevar apraut GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Atmiņas izvades plÅ«smai nav maināms izmērs" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Neizdevās mainÄ«t atmiņas izvades plÅ«smas izmēru" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Atmiņas apjoms, kas nepiecieÅ¡ams, lai apstrādātu rakstīšanu, ir lielāks nekā " +"pieejamā atmiņas telpa" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "PieprasÄ«tā meklēšana ir pirms plÅ«smas sākuma" + +#: ../gio/gmemoryoutputstream.c:753 +msgid "Requested seek beyond the end of the stream" +msgstr "PieprasÄ«tā meklēšana ir pēc plÅ«smas beigām" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: ../gio/gmount.c:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "montējums neatbalsta “unmount” (atmontēšanu)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +msgid "mount doesn't implement \"eject\"" +msgstr "montējums neatbalsta “eject” (izgrūšanu)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: ../gio/gmount.c:547 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"montējums neatbalsta “unmount” (atmontēšanu) vai “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:631 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "montējums neatbalsta “eject” (izgrūšanu) vai “eject_with_operation”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:717 +msgid "mount doesn't implement \"remount\"" +msgstr "montējums neatbalsta “remount” (atkārtotu montēšanu)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:797 +msgid "mount doesn't implement content type guessing" +msgstr "montējums neatbalsta satura tipa minēšanu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "montējums neatbalsta sinhrono satura tipa minēšanu" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Datora nosaukums “%s” satur “[” bet ne “]”" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "TÄ«kls nav sasniedzams" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Dators nav sasniedzams" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Neizdevās izveidot tÄ«kla pārraugu — %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Neizdevās izveidot tÄ«kla pārraugu:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Neizdevās saņemt tÄ«kla statusu:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Izvades plÅ«sma neatbalsta rakstīšanu" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Avota plÅ«sma jau ir aizvērta" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Kļūda, sameklējot “%s” — %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Kļūda, apgriezti sameklējot “%s” — %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nav DNS ierakstu “%s” pieprasÄ«tajam tipam" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Pagaidām nevar sameklēt “%s”" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Kļūda, sameklējot “%s”" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Saņemti nepilnÄ«gi “%s” dati " + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Resurss pie “%s” neeksistē" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Resursam pie “%s” neizdevās atspiesties" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Resurss pie “%s” nav mape" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Ievades plÅ«sma neatbalsta meklēšanu" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Drukāšanas palÄ«dzÄ«ba" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[KOMANDA]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "UzskaitÄ«t sadaļas, kas satur resursus elf DATNĒ" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"UzskaitÄ«t resursus\n" +"Ja ir norādÄ«ta SADAÄ»A, uzskaitÄ«t resursus Å¡ajā sadaļā\n" +"Ja ir norādÄ«ts CEĻŠ, uzskaitÄ«t tikai atbilstoÅ¡us resursus" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "DATNE [CEĻŠ]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SADAÄ»A" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"UzskaitÄ«t resursus ar informāciju\n" +"Ja ir norādÄ«ta SADAÄ»A, uzskaitÄ«t resursus Å¡ajā sadaļā\n" +"Ja ir norādÄ«ts CEĻŠ, uzskaitÄ«t tikai atbilstoÅ¡us resursus\n" +"Informācija iekļauj sadaļu, izmēru un saspieÅ¡anu" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Izvilkt resursu datni uz stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "DATNE CEĻŠ" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Nezināma komanda %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Lietojums:\n" +" gresource [--section SADAÄ»A] KOMANDA [PARAMETRI...]\n" +"\n" +"Komandas:\n" +" help Rāda Å¡o informāciju\n" +" sections UzskaitÄ«t resursa sadaļas\n" +" list UzskaitÄ«t resursus\n" +" details UzskaitÄ«t resursus ar informāciju\n" +" extract Izvilkt resursu\n" +"\n" +"Lietojiet “gresource help KOMANDA”, lai saņemtu detalizētu palÄ«dzÄ«bu.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Lietojums:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Parametri:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SADAÄ»A (Neobligāts) elf sadaļas nosaukums\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMANDA (neobligāta) komanda, ko izskaidrot\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " DATNE elf datne (bināra datne vai koplietota bibliotēka)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" DATNE elf datne (bināra datne vai koplietota bibliotēka)\n" +" vai saspiests resursu datne\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CEĻŠ]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CEĻŠ (Neobligāts) resursa ceļš (var bÅ«t daļējs)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CEĻŠ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CEĻŠ Resursa ceļš\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nav tādas shēmas “%s”\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Shēma “%s” nav pārvietojama (nedrÄ«kst norādÄ«t ceļu)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Shēma “%s” ir pārvietojama (jānorāda ceļš)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Dots tukÅ¡s ceļš.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Ceļam jāsākas ar slÄ«psvÄ«tru (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Ceļam jābeidzas ar slÄ«psvÄ«tru (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Ceļš nedrÄ«kst saturēt divas blakus esoÅ¡as slÄ«psvÄ«tras (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nav tādas atslēgas “%s”\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Dotā vērtÄ«ba ir ārpus derÄ«go vērtÄ«bu intervāla\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Saraksts ar instalētām (nepārvietojamām) shēmām" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Saraksts ar instalētam pārvietojamām shēmām" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Atslēgu saraksts SHĒMĀ" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SHĒMA[:CEĻŠ]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Bērnu skaits SHĒMĀ" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Saraksts ar atslēgām un vērtÄ«bām; rekursÄ«vi\n" +"Ja nav dota shēma, rādÄ«t visas atslēgas\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SHĒMA[:CEĻŠ]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Saņemt vērtÄ«bu ATSLĒGAI" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SHĒMA[:CEĻŠ] ATSLĒGA" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Vaicājums derÄ«go vērtÄ«bu intervālam ATSLĒGAI" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "IestatÄ«t ATSLĒGTAS vērtÄ«bu uz VĒRTĪBA" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SHĒMA[:CEĻŠ] ATSLĒGA VĒRTĪBA" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "PārstatÄ«t ATSLĒGAS vērtÄ«bu uz tās noklusēto" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "AtstatÄ«t visas atslēgas SHĒMĀ uz to noklusētajām vērtÄ«bām" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "PārbaudÄ«t, vai ATSLĒGA ir rakstāma" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Novērot ATSLĒGA uz izmaiņām.\n" +"Ja nav norādÄ«ta ATSLĒGA, novērot visas atslēgas SHĒMĀ.\n" +"Izmantojiet ^C, lai pārtrauktu novēroÅ¡anu.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SHĒMA[:CEĻŠ] [ATSLĒGA]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Lietojums:\n" +" gsettings [--schemadir SHĒMAS_MAPE] KOMANDA [PARAM...]\n" +"\n" +"Commands:\n" +" help Rāda Å¡o informāciju\n" +" list-schemas Uzrāda instalētās shēmas\n" +" list-relocatable-schemas Uzrāda pārvietojamās shēmas\n" +" list-keys Uzrāda atslēgas shēmās\n" +" list-children Uzrāda shēmas bērnus\n" +" list-recursively Uzrāda atslēgas un vērtÄ«bas, rekursÄ«vi\n" +" range Vaicā atslēgu apgabalu\n" +" get Saņem atslēgas vērtÄ«bu\n" +" set Iestata atslēgas vērtÄ«bu\n" +" reset Atstata atslēgas vērtÄ«bu\n" +" reset-recursively Atstata visas vērtÄ«bas dotajai shēmai\n" +" writable Pārbauda, vai atslēga ir rakstāma\n" +" monitor Uzrauga izmaiņas\n" +"\n" +"Lietojiet “gsettings help KOMANDA”, lai saņemtu sÄ«kāku palÄ«dzÄ«bu.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Lietojums:\n" +" gsettings [--schemadir SHĒMAS_MAPE] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SHĒMAS_MAPE Mape, kurā meklēt papildu shēmas\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SHĒMA Shēmas nosaukums\n" +" CEĻŠ Ceļš pārvietojamām shēmām\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " ATSLĒGA (neobligāta) atslēga shēmā\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " ATSLĒGA Atslēga shēmā\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VĒRTĪBA VērtÄ«ba, ko iestatÄ«t\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Dots tukÅ¡s shēmas nosaukums\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "NederÄ«ga ligzda, nav inicializēta" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "NederÄ«ga ligzda, inicializācija neizdevās, jo — %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Ligzda jau ir aizvērta" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Ligzdai I/O iestājās noildze" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "izveido GSocket no fd — %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nevarēja izveidot ligzdu — %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Tika norādÄ«ta nezināma saime" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Tika norādÄ«ts nezināms protokols" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "nevarēja iegÅ«t lokālo adresi — %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "nevarēja iegÅ«t attālināto adresi — %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "nevar klausÄ«ties — %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Kļūda, sasaistoties ar adresi — %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Kļūda, pievienojoties multiraides grupai — %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Kļūda, pametot multiraides grupu — %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Nav atbalsta avotam specifiskām multiraidēm" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Kļūda, pieņemot savienojumu — %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Notiek savienoÅ¡anās" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nevar saņemt izpildes gaidīšanas kļūdu — %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Kļūda, saņemot datus — %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Kļūda, sÅ«tot datus — %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Neizdevās izslēgt ligzdu — %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Kļūda, aizverot ligzdu — %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Gaida ligzdas nosacÄ«jumu — %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Kļūda, sÅ«tot ziņojumu — %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage nav atbalstÄ«ts uz Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Kļūda, saņemot ziņojumu — %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials nav implementēts Å¡ai OS" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nevarēja savienoties ar starpniekserveri %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nevarēja savienoties ar %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Nevarēja savienoties:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Nezināma kļūda savienojoties" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Starpnieka mēģināšana caur ne-TCP savienojumu nav atbalstÄ«ta." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Starpnieka protokols “%s” nav atbalstÄ«ts." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "KlausÄ«tājs jau ir aizvērts" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Pievienotā ligzda ir aizvērta" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 neatbalsta IPv6 adreses “%s”" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Lietotāja vārds ir pārāk garÅ¡ SOCKSv4 protokolam" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Datora nosaukums “%s” ir pārāk garÅ¡ SOCKSv4 protokolam" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Serveris nav SOCKSv4 starpniekserveris." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Savienojums caur SOCKSv4 serveri tika noraidÄ«ts" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Serveris nav SOCKSv5 starpniekserveris." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 starpnieks pieprasa autentificēšanos." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 starpnieks pieprasa autentificēšanos metodi, ko GLib neatbalsta." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Lietotājvārds vai parole pārāk gara SOCKSv5 protokolam" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 autentificēšanās neizdevās dēļ nepareiza lietotājvārda vai paroles." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Datora nosaukums “%s” ir pārāk garÅ¡ SOCKSv5 protokolam" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 starpnieka serveris izmanto nezināmu adreses tipu." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Iekšēja SOCKSv5 starpnieka servera kļūda." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Noteikumu kopa neļauj SOCKSv5 savienojumu." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Dators nav sasniedzams caur SOCKSv5 serveri." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "TÄ«kls nav sasniedzams caur SOCKSv5 serveri." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Savienojums atteikts caur SOCKSv5 serveri." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 starpnieks neatbalsta “connect” komandu." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 starpnieks neatbalsta doto adreses tipu." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Nezināma SOCKSv5 starpnieka kļūda." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nevar apstrādāt GThemedIcon versijas %d kodējumu" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nevarēja atÅ¡ifrēt PEM-iekodētu privāto atslēgu" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nav atrasts PEM iekodēta privāta atslēga" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nevarēja parsēt PEM-iekodētu privāto atslēgu" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nav atrasts PEM-iekodēts sertifikāts" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nevarēja parsēt PEM-iekodētu sertifikātu" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Å Ä« ir pēdējā iespēja ievadÄ«t pareizu paroli, pirms jums tiek bloķēta pieeja." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Vairākas ievadÄ«tās paroles ir bijuÅ¡as nepareizas, un jÅ«s tiksiet izslēgts " +"pēc turpmākām neveiksmēm." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "IevadÄ«tā parole ir nepareiza." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "GaidÄ«ja 1 kontroles ziņojumu, saņēma %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "NegaidÄ«ts palÄ«gdatu tips" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "GaidÄ«ja vienu fd, bet saņēma %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Saņemts nederÄ«gs fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Kļūda, sÅ«tot rekvizÄ«tus: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Kļūda, pārbaudot, vai SO_PASSCRED ir aktivēts ligzdai — %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"NegaidÄ«ts opciju garums, pārbaudot, vai SO_PASSCRED ir aktivēts ligzdai. " +"Tika gaidÄ«ti %d baiti, saņēma %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Kļūda, aktivējot SO_PASSCRED — %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Tikai gaidÄ«ts saņemt vienu baitu, lai saņemtu rekvizÄ«tus, bet nolasÄ«ja nulle " +"baitu" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Negaida kontroles ziņojumu, bet saņēma %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Kļūda, deaktivējot SO_PASSCRED — %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Kļūda, nolasot datnes deskriptoru — %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Kļūda, aizverot datnes deskriptoru — %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Datņu sistēmas sakne" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Kļūda, rakstot datnes deskriptorā — %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Abstraktas unix domēna ligzdas uz šīs sistēmas nav atbalstÄ«tas" + +#: ../gio/gvolume.c:436 +msgid "volume doesn't implement eject" +msgstr "sējums neatbalsta izgrūšanu" + +#. Translators: This is an error +#. * message for volume objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gvolume.c:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "sējums neatbalsta izgrūšanu vai eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Nevar atrast lietotni" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Kļūda, palaižot lietotni — %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI nav atbalstÄ«ti" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "asociāciju mainīšana nav atbalstÄ«ta uz win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Asociāciju veidoÅ¡ana nav atbalstÄ«ta uz win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Kļūda, lasot no tura — %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Kļūda, aizverot turi — %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Kļūda, rakstot turÄ« — %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nepietiek atmiņas" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Iekšēja kļūda — %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Vajag vairāk ievades" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "NederÄ«gi saspiestie dati" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adrese, ko klausÄ«ties" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorēts priekÅ¡ compat ar GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Drukāšanas adrese" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Drukāt adresi čaulas režīmā" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Palaist dbus servisu" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Nepareizi parametri\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "NegaidÄ«ts atribÅ«ts “%s” elementam “%s”" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "AtribÅ«ts “%s” elementam “%s” netika atrasts" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "NegaidÄ«ta birka “%s”, tika gaidÄ«t birka “%s”" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "NegaidÄ«ta birka “%s” iekÅ¡ “%s”" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Nav atrasts derÄ«ga grāmatzÄ«mes datne datu mapēs" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "GrāmatzÄ«me ar URI “%s” jau eksistē" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nav atrasta grāmatzÄ«me URI “%s”" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Nav definēts MIME tips grāmatzÄ«mē URI “%s”" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Nav definēti privātie karogi grāmatzÄ«mēs URI “%s”" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nav iestatÄ«tas grupas grāmatzÄ«mēs URI “%s”" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Neviena lietotne ar nosaukumu “%s” nav reÄ£istrējusi “%s” grāmatzÄ«mi" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Neizdevās izvērst exec rindu “%s” ar URI “%s”" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Daļēja simbolu secÄ«ba ievades beigās" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nevar pārveidot atkāpÅ¡anos “%s” uz rakstzÄ«mju kopu “%s”" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI “%s” nav absolÅ«tais URI, lietojot “file” shēmu" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Lokālās datnes URI “%s” nedrÄ«kst saturēt “#”" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI “%s” nav pareizs" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Resursdatora nosaukuma URI “%s” nav pareizs" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI “%s” satur nepareizi veidotas atsoļa rakstzÄ«mes" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ceļa nosaukums “%s” nav absolÅ«ts ceļš" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Nepareizs resursdatora nosaukums" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %Y. gada %e. %B, plkst. %H un %M" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Janvāris" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februāris" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Marts" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "AprÄ«lis" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maijs" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "JÅ«nijs" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "JÅ«lijs" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Augusts" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Septembris" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktobris" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembris" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Decembris" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "JÅ«n" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "JÅ«l" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Oct" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Pirmdiena" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Otrdiena" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "TreÅ¡diena" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Ceturdiena" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Piektdiena" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sestdiena" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Svētdiena" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pr" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Ot" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Tr" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Ct" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pk" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Se" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sv" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Kļūda, atverot direktoriju “%s” — %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Nevarēja atrast %lu baitus, lai nolasÄ«tu datni \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Kļūda, nolasot datni “%s” — %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datne \"%s\" ir pārāk liela" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Neizdevās nolasÄ«t no datnes “%s” — %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Neizdevās atvērt datni “%s” — %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Neizdevās dabÅ«t datnes “%s” atribÅ«tus — fstat() neizdevās — %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Neizdevās atvērt “%s” — fdopen() neizdevās — %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Neizdevās pārsaukt datni “%s” uz “%s” — g_rename() neizdevās — %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Neizdevās izveidot datni “%s” — %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Neizdevās atvērt datni “%s” rakstīšanai — fdopen() neizdevās — %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Neizdevās rakstÄ«t datnē “%s” — fwrite() neizdevās — %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Neizdevās rakstÄ«t datnē “%s” — fflush() neizdevās — %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Neizdevās rakstÄ«t datnē “%s” — fsync() neizdevās — %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Neizdevās aizvērt datni “%s” — fclose() neizdevās — %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Nevarēja izdzēst esoÅ¡o datni “%s” — g_unlink() neizdevās — %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Veidne “%s” ir nepareiza, nedrÄ«kstētu saturēt “%s”" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Veidne “%s” nesatur XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Neizdevās nolasÄ«t simbolisko saiti “%s” — %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Simboliskās saites nav atbalstÄ«tas" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Nevarēja atvērt pārveidotāju no “%s” uz “%s” — %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Neizdevās izpildÄ«t jēllasīšanu iekÅ¡ g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "PāpalikuÅ¡ie nepārveidotie dati nolasīšanas buferÄ«" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanāls pārtrÅ«kst daļējā rakstzÄ«mē" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Neizdevās izpildÄ«t jēllasīšanu iekÅ¡ g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "Meklēšanas mapēs nevarēja atrast derÄ«gu atslēgu" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "Nav parasta datne" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Atslēgu datne satur rindu “%s”, kura nav atslēgas vērtÄ«bas pāris, grupa vai " +"komentārs" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "NederÄ«gs grupas nosaukums — %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Atslēgu datne nesākas ar grupu" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "NederÄ«gs atslēgas nosaukums — %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Atslēgu datne satur neatbalstÄ«tu kodējumu “%s”" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Atslēgu datnei nav grupa “%s”" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Atslēgy datnei nav atslēga “%s”" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Atslēgu datne satur atslēgu “%s” ar vērtÄ«bu “%s” kas nav UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Atslēgu datne satur atslēgu “%s”. kurai ir vērtÄ«ba, kuru nevar interpretēt." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Atslēgu datne satur atslēgu “%s” grupā “%s” kurai ir vērtÄ«ba, ko nevar " +"interpretēt." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Atslēgai “%s” grupā “%s” ir vērtÄ«ba “%s”, kur bija jābÅ«t %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Atslēgu datnei nav atslēgas “%s” grupā “%s”" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "Atslēgu datne satur atsoļa rakstzÄ«me rindas beigās" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Atslēgu datne satur nederÄ«gu atsoļa sekvenci “%s”" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "VērtÄ«bu “%s” nevar interpretēt kā skaitli." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Veselā skaitļa “%s” vērtÄ«ba ir ārpus apgabala" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "VērtÄ«bu “%s” nevar interpretēt kā peldoÅ¡o komatu." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "VērtÄ«bu “%s” nevar interpretēt kā BÅ«la vērtÄ«bu." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Nevarēja dabÅ«t datnes “%s%s%s%s” atribÅ«tus — fstat() neizdevās — %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Neizdevās kartēt %s%s%s%s — mmap() neizdevās — %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Neizdevās atvērt datni “%s” — open() neizdevās — %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Kļūda rindā %d rakstzÄ«me %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Nepareizi kodēts UTF-8 teksts — nav derÄ«gs “%s”" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "“%s” nav derÄ«gs nosaukums " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "“%s” nav derÄ«gs nosaukums — '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Kļūda rindā %d — %s" + +#: ../glib/gmarkup.c:636 +#, 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 "" +"Neizdevās apstrādāt “%-.*s”, kur vajadzētu bÅ«t ciparam rakstzÄ«mes atsaucē " +"(piemēram, ê) — iespējams, ka cipars ir pārāk liels" + +#: ../glib/gmarkup.c:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "RakstzÄ«mes atsauce “%-.*s” neiekodē atļautu rakstzÄ«mi" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"PamanÄ«ta tukÅ¡a entÄ«tija “&;”; derÄ«gas entÄ«tijas ir: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "EntÄ«tijas nosaukums “%-.*s” nav zināms" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentam jāsākas ar elementu (piemēram, )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Savāda rakstzÄ«me “%s”. Tika gaidÄ«ta “>” rakstzÄ«me, kas nobeigtu sākuma birku " +"elementam “%s”" + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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”, tika gaidÄ«ta “>” vai “/” rakstzÄ«me, kas nobeigtu " +"sākuma birku elementam “%s” vai fakultatÄ«vi atribÅ«tu; iespējams, jÅ«s " +"lietojāt nepareizu rakstzÄ«mi atribÅ«ta nosaukumā" + +#: ../glib/gmarkup.c:1350 +#, 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”, tika gaidÄ«tas atvērtās pēdiņas pēc vienādÄ«bas zÄ«me, " +"nosakot vērtÄ«bu atribÅ«tam “%s” no elementa “%s”" + +#: ../glib/gmarkup.c:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"“%s” nav derÄ«ga rakstzÄ«me, sekojot aizverošā elementa nosaukumam “%s”; " +"atļautā rakstzÄ«me ir “>”" + +#: ../glib/gmarkup.c:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokuments bija tukÅ¡s vai saturēja tikai tukÅ¡u atstarpi" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokuments negaidÄ«ti izbeidzās tieÅ¡i pēc atvērtās leņķa iekavas “<”" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Dokuments negaidÄ«ti izbeidzās, gaidÄ«ja ieraudzÄ«t aizveroÅ¡o leņķa iekavu, " +"beidzoties ar tagu <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokuments negaidÄ«ti izbeidzās elementa nosaukumā" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokuments negaidÄ«ti izbeidzās atribÅ«ta nosaukumā" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokuments negaidÄ«ti izbeidzās elementa atveroÅ¡ajā birkā." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokuments negaidÄ«ti beidzās aiz vienādÄ«bas zÄ«mes, sekojot atribÅ«ta " +"nosaukumam; nav atribÅ«ta vērtÄ«bas" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokuments negaidÄ«ti beidzās kamēr atradās atribÅ«ta vērtÄ«bā" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokuments negaidÄ«ti beidzās elementa “%s” aizveroÅ¡ajā birkā" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokuments negaidÄ«ti izbeidzās komentārā vai apstrādes instrukcijā" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "LietoÅ¡ana:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPCIJA...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "PalÄ«dzÄ«bas opcijas:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "RādÄ«t palÄ«dzÄ«bas opcijas" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "RādÄ«t visas palÄ«dzÄ«bas opcijas" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Lietotnes opcijas:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nevar apstrādāt veselā skaitļa vērtÄ«bu “%s” priekÅ¡ %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Veselā skaitļa vērtÄ«ba “%s” priekÅ¡ %s ir ārpus apgabala" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nevar apstrādāt dubulto vērtÄ«bu “%s” priekÅ¡ %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Dubultā vērtÄ«ba “%s” priekÅ¡ %s ir ārpus apgabala" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Kļūda, parsējot opciju %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "TrÅ«kst %s parametrs" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Nezināma opcija %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "bojāts objekts" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "Iekšējā kļūda vai bojāts objekts" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "beigusies atmiņa" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "atpakaļ izsekoÅ¡anas limits ir sasniegts" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "raksts satur elementus, kurus neatbalsta daļējā atbilstÄ«ba" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "atpakaļ atsauces kā nosacÄ«jumus neatbalsta daļējā atbilstÄ«ba" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "rekursiju limits ir sasniegts" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "nederÄ«ga jauno rindu karogu kombinācija" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "slikta nobÄ«de" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "Ä«ss utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekursijas cikls" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "nezināma kļūda" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ raksta beigās" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c raksta beigās" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "pēc \\ seko neatpazÄ«ta rakstzÄ«me" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "skaitļi nav pareizā secÄ«bā {} kvantorā" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "skaitlis pārāk liels {} kvantorā" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "trÅ«kst beigu “]” rakstzÄ«mju klasei" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "nederÄ«ga atsoļu sekvence rakstzÄ«mju klasē" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "rakstzÄ«mju klasē apgabals ir ārpus secÄ«bas" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nav ko atkārtot" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "negaidÄ«ta atkārtoÅ¡anās" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "neatpazÄ«ta rakstzÄ«me pēc (? vai (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX nosauktās klases ir atbalstÄ«tas tikai klasēs" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "trÅ«kst beigu )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "atsauce uz neesoÅ¡u apakÅ¡rakstu" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "trÅ«kst ) pēc komentāra" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regulārā izteiksme ir pārāk gara" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "neizdevās iegÅ«t atmiņu" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") bez atverošās (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "koda pārpilde" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "neatpazÄ«ta rakstzÄ«me pēc (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind pieņēmums nav fiksēta garuma" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "slikti formatēts skaitlis vai nosaukums pēc (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "nosacÄ«juma grupa satur vairāk kā divus zarus" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "pēc (?( tiek sagaidÄ«ts pieņēmums" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "pēc (?R vai (?[+-]digits ir jāseko )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nezināms POSIX klases nosaukums" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX savāktie elementi nav atbalstÄ«ti" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "rakstzÄ«mes vērtÄ«ba \\x{...} sekvencē ir pārāk liela" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "nederÄ«gs nosacÄ«jums (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nav atļauts lookbehind pieņēmumā" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "atsoļi \\L, \\l, \\N{nosaukums}, \\U un \\u nav atbalstÄ«ti" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekursÄ«vais izsaukums varētu cikloties bezgalÄ«gi" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "neatpazÄ«ta rakstzÄ«me pēc (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "trÅ«kst nobeiguma apakÅ¡raksta nosaukumā" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "divi nosaukti apakÅ¡raksti ir ar vienādiem nosaukumiem" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "slikti formatēta \\P vai \\p sekvence" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nezināms Ä«pašības nosaukums pēc \\P vai \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "apakÅ¡raksta nosaukums ir pārāk liels (maksimums ir 32 rakstzÄ«mes)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "pārāk daudz nosauktu apakÅ¡rakstu (maksimums ir 10 000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "astotnieku vērtÄ«ba ir lielāka nekā \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "pārtērēta kompilēšanas darba telpa" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "iepriekÅ¡ pārbaudÄ«ts norādÄ«tais apakÅ¡raksts nav atrasts" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupa satur vairāk kā vienu zaru" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "nekonsekventas NEWLINE opcijas" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"pēc \\g neseko nosaukums iekavās, leņķa iekavās vai pēdiņās vai vienkārÅ¡s " +"skaitlis" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "skaitliska atsauce nevar bÅ«t nulle" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "parametrs nav atļauts priekÅ¡ (*ACCEPT), (*FAIL) vai (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) nav atpazÄ«ts" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "skaitlis ir pārāk liels" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "trÅ«kst apakÅ¡raksta nosaukums pēc (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "tika gaidÄ«ts cipars pēc (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] ir nederÄ«ga datu rakstzÄ«me JavaScript savietojamÄ«bas režīmā" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "dažādi nosaukumi apakÅ¡rakstiem ir ar vienādiem numuriem nav atļauti" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) jābÅ«t parametram" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c jāseko ASCII rakstzÄ«mei" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "pēc \\k neseko nosaukums iekavās, leņķa iekavās vai pēdiņās" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N nav atbalstÄ«ts klasē" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "pārāk daudz atsauču uz priekÅ¡u" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nosaukums ir pārāk garÅ¡ iekÅ¡ (*MARK), (*PRUNE), (*SKIP) vai (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "rakstzÄ«mes vērtÄ«ba \\u.... sekvencē ir pārāk liela" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Kļūda, kamēr meklē atbilstÄ«bas regulārajai izteiksmei %s — %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE bibliotēka ir kompilēta bez UTF8 atbalsta" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE bibliotēka ir kompilēta bez UTF8 Ä«pašību atbalsta" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE bibliotēka ir kompilēta ar UTF8 Ä«pašību atbalstu" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Kļūda, kompilējot regulāro izteiksmi %s pie rakstzÄ«mes %d — %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Kļūda, optimizējot regulāro izteiksmi %s — %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "tika gaidÄ«ts heksadecimālais cipars vai “}”" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "tika gaidÄ«ts heksadecimālais cipars" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "simboliskajā norādē trÅ«kst “<”" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "nepabeigta simboliskā norāde" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "simboliskās norādes garums ir nulle" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "tika gaidÄ«ts cipars" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "neatļauta simboliskā norāde" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "noklÄ«dis beigu “\\”" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "nezināma atsoļa sekvence" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Kļūda, apstrādājot aizvietoÅ¡anas tekstu “%s” pie rakstzÄ«mes %lu — %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citētais teksts nesākas ar jautājuma zÄ«mi" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksts bija tukÅ¡s (vai saturēja tikai tukÅ¡umus)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Nevarēja nolasÄ«t datus no bērnprocesa (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "NegaidÄ«ta kļūda waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Bērna process beidza darbu ar kodu %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Bērna process tika pārtraukts ar signālu %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Bērna process tika apturēts ar signālu %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Bērna process beidza darbu nenormāli" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nevarēja nolasÄ«t no bērna programkanāla (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Neizdevās sadalÄ«t (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nevarēja pāriet uz direktoriju “%s” (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nevarēja izpildÄ«t bērnprocesu “%s” (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nevarēja novadÄ«t bērnprocesa (%s) izvadi vai ievadi" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nevarēja sazarot bērnprocesu (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nezināma kļūda, izpildot bērnprocesu “%s”" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Nevarēja nolasÄ«t pietiekami daudz datus no bērna pid programkanāla (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nevarēja izveidot programkanālu komunikācijai ar bērnprocesu (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "Nevarēja nolasÄ«t datus no bērnprocesa" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nevarēja izpildÄ«t bērnprocesu (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "NederÄ«gs programmas nosaukums — %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "NederÄ«ga virkne parametra vektorā pie %d — %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "NederÄ«ga virkne vidē — %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "NederÄ«ga darba mape — %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Neizdevās izpildÄ«t palÄ«ga programmu (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "RakstzÄ«me nav UTF-8 apgabalā" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Nepareiza secÄ«ba konversijas ievadē" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "RakstzÄ«me nav UTF-16 apgabalā" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u baits" +msgstr[1] "%u baiti" +msgstr[2] "%u baitu" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s baits" +msgstr[1] "%s baiti" +msgstr[2] "%s baitu" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Anormāla programmas apture, izveidojot komandrindu `%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Komandrinda `%s' izgāja ar nenulles izieÅ¡anas statusu %d: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' nav servisa ierakstu" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "tukÅ¡o apakÅ¡virkņu darba telpas limits ir sasniegts" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "reÄ£istru mainoÅ¡i atsoļi (\\l, \\L, \\u, \\U) Å¡eit nav atļauti" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE grupas atkārtoÅ¡ana nav atļauta" + +#~ msgid "File is empty" +#~ msgstr "Fails ir tukÅ¡s" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "Atslēgas fails satur atslēgu '%s'. kurai ir vērtÄ«ba, kuru nevar " +#~ "interpretēt." + +#~ msgid "This option will be removed soon." +#~ msgstr "Å Ä« opcija drÄ«z tiks izņemta." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Kļūda, palaižot failu '%s': %s" + +#~ msgid "Error connecting: " +#~ msgstr "Kļūda savienojoties: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Kļūda savienojoties: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 realizācija ierobežo lietotāja vārdu lÄ«dz %i rakstzÄ«mēm" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a realizācija ierobežo datora nosaukumu lÄ«dz %i rakstzÄ«mēm" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Kļūda, lasot no unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Kļūda, aizverot unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Kļūda, rakstot uz unix: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#, 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 "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 "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.po b/po/mai.po new file mode 100644 index 0000000..d828ecf --- /dev/null +++ b/po/mai.po @@ -0,0 +1,3845 @@ +# translation of glib.HEAD.po to maithili +# BOSS GNU/Linux , 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2009-02-27 17:15+0530\n" +"Last-Translator: Rajesh Ranjan \n" +"Language-Team: maithili \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' अप्रत्याशित गुण '%s' तत्व क' लेल" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' तत्व '%s' क' गुण नहि भेटल" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s' अप्रत्याशित टैग, '%s' टैग प्रत्याशित" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "अप्रत्याशित टैग '%s' '%s' क' भीतर" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "कोनो वैध पुस्तकचिह्न फाइल आँकड़ा निर्देशिकामे नहि मिलल" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' क' लेल पुस्तकचिह्न पहिनेसँ मोजुद अछि" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' क' लेल कोनो पुस्तकचिह्न नहि मिलल" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "कोनो MIME प्रकार URI '%s' क' लेल पुस्तकचिह्नमे परिभाषित नहि अछि" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' क' लेल पुस्तकचिह्नमे कोनो निज फ्लैग परिभाषित नहि अछि" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' क' लेल पुस्तकचिह्नमे कोनो समूह सेट नहि अछि" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' क' नामसँ कोनो अनुप्रयोग '%s' क' लेल पुस्तकचिह्न पंजीकृत नहि अछि" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "अक्षर समूह '%s' सँ '%s' मे परिवर्तन समर्थित नहि अछि" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' सँ '%s' परिवर्तक नहि खोलल जाए सकल" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "परिवर्तन इनपुटमे अवैध बाइट अनुक्रम" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "परिवर्तनक दौरान त्रुटि: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "इनपुट क' अंतमे आंशिक अक्षर अनुक्रम" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फालबैक '%s' केँ कोड सेट '%s' मे बदएल नहि कए सकल" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"file\" योजना क' उपयोग करैबला URI '%s' एकटा निरपेक्ष यूआरआई नहि अछि" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फाइल यूआरआई '%s' मे एकटा '#' सम्मिलित नहि अछि" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "यूआरआई '%s' अवैध अछि" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "यूआरआई '%s' क' होस्टनाम अवैध अछि" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "यूआरआई '%s' मे अवैध एस्केप्ड अक्षर सम्मिलित अछि" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "पथनाम '%s' एकटा निरपेक्ष पथ नहि अछि" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "अवैध होस्ट-नाम" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "पूर्वाह्न" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "अपराह्न" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "मार्च" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "जून" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "मार्च" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "जून" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "सोमवार " + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "मंगलवार " + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "बुधवार " + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "गुरुवार " + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "शुक्रवार " + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "शनिवार" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "रविवार " + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "सोम " + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "मंगल " + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "बुध " + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "गुरु " + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "शुक्र " + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "शनि" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "रवि " + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "निर्देशिका '%s' केँ खोलबामे त्रुटि: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " %lu बाइट आबंटित नहि कएल जाए सकल फाइल \"%s\" केँ पढ़ै हेतु" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "फाइल '%s' सँ पढ़एमे असफल: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फाइल खोलबामे असफल :%s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फाइल '%s' क विशेषतासभ पता करबामे असफल: fstat() असफल: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "फाइल '%s': fdopen() खोलबामे असफल: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फाइल '%s' केँ '%s' मे नाम बदलए मे विफल: g_rename() विफल: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फाइल '%s' बनाबैमे असफल: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "फाइल '%s' केँ लिखबाक लेल खोलबा मे विफल: fdopen() विफल: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइलकेँ लिखबामे विफल: fwrite() विफल: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बन्न करबामे विफल: fclose() विफल: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "'%s' मोजुदा फाइल हटाएल नहि जा सकैत अछि: g_unlink() विफल: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "टैम्पलेट '%s' अवैध अछि. एहिमे '%s' सामिल नहि अछि" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "टैम्पलेट '%s' मे XXXXXX समाहित नहि अछि" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f मे.बा." + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f गी.बा." + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f मे.बा." + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f गी.बा." + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f कि.बा." + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f कि.बा." + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सिंबालिक लिंक '%s' सँ थीम पढ़बामे असफल %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "फाइल '%s' खोलबामे असफल: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फाइल चित्रित करबामे विफल: mmap() विफल: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "पँक्ति %d पर त्रुटि: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "संप्रतीक संदर्भ '%-.*s' एकटा अनुमति प्राप्त संप्रतीक केँ एनकोड नहि करैत अछि" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "रिक्त एंटिटी '&;' देखलक; वैध एंटिटी अछि: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "एंटिटी नाम '%s' ज्ञात नहि अछि" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "दस्ताबेज एकटा अवयव क' नामसँ प्रारंभ होनाइ चाही (उदाहरण क' लेल- <पुस्तक>)" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "< क' पश्चात आबल '%s' एकटा वैध वर्ण नहि अछि. ई अवयव नामसँ प्रारंभ नहि होइछ" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "विषम अक्षर '%s', प्रत्याशित अछि एकटा '=' लक्षण नाम '%s' अवयव '%s' क' पश्चात" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' एकटा वैध अक्षर नहि अछि क्लोज़ अवयव नाम '%s' क' बाद; स्वीकार्य अक्षर अछि '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "अवयव '%s' बन्द छला, कोनो अवयव वर्तमानमे खुलल नहि अछि" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "दस्ताबेज '%s' बन्द छला, मुदा वर्तमान खुलल अवयव अछि '%s'" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "दस्ताबेज खाली छला अथवा ओकरामे सिर्फ श्वेत रिक्ति छला" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूप सँ एकटा खुलल एंगल ब्रेकेट '<' क' पश्चाते भ' गेल" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूप सँ अवयवसभ क' खुलल हए पर भ' गेल - '%s' अंतिम खुलल अवयव " +"छला" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूप सँ भ' गेल, वांछित छला देखनाइ टैगकेँ बन्द करैत एकटा क्लोज एंगल " +"ब्रेकेट <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव नाम क' भीतर भ' गेल" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूप सँ विशेषता नाम क' भीतर भ' गेल" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव-खोलबाक टैगक भीतर भ' गेल." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"दस्ताबेज क' अंत अप्रत्याशित रूपसँ बराबर क' चिह्न क' बाद एकटा विशेषता नाम क' पश्चात भ' " +"गेल; कोनो विशेषता मान नहि" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ विशेषता मान क' भीतर भ' गेल" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ अवयव '%s' लेल बन्द टैग क' भीतर भ' गेल" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "दस्ताबेज क' अंत अप्रत्याशित रूपसँ टिप्पणी अथवा प्रक्रिया निर्देश क' भीतर भ' गेल" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "स्मृतिक बाहर" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "अज्ञात त्रुटि" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "नियमित अभिव्यक्ति बहुत पैघ अछि" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "स्मृति पाबैमे विफल" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "assertion expected after (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "असंगत NEWLINE विकल्प" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "अप्रत्यासित दोहराएल" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "कोड ओवरफ्लो" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "हेक्साडेसीमल अंक या '}' प्रत्याशित" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "हेक्साडेसीमल अंक प्रत्याशित" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "नहि समाप्त भेल सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "शून्य नमाइ सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "अंक प्रत्याशित" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "अमान्य सांकेतिक संदर्भ" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "कोटेड पाठ कोटेशन चिह्न क' सँग प्रारंभ नहि होइछ" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "कमाँड पंक्तिमे मेल नहि खाएत उद्धरण चिह्न अथवा आन शैल-कोटेड पाठ" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ क' अंत सिर्फ '\\' अक्षर क' बाद भ' गेल. (पाठ छला '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr " %c लेल मैचिंग कोट सँ पहिने पाठ अंत पएलक. (पाठ छला '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ रिक्त छला (अथवा ओकरामे सिर्फ श्वेत रिक्ति छला)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "शिशु प्रक्रियासँ आँकड़ा पढ़बामे असफल" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "शिशु प्रक्रिया (%s) सँ संचारण लेल पाइप बनाबैमे असफल" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "चाइल्ड पाइप (%s) सँ पढ़बामे असफल" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "निर्देशिका '%s' (%s) पर बदलबामे असफल" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "शिशु प्रक्रिया (%s) कार्यान्वित करबामे असफल" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध प्रोग्राम नाम: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d पर तर्क सदिशमे अवैध स्ट्रिंग: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणमे अवैध स्ट्रिंग: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यशील निर्देशिका: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "हेल्पर प्रोग्राम (%s) कार्यान्वित करबामे असफल" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"एकटा शिशु प्रक्रिया सँ आँकड़ा पढ़बामे g_io_channel_win32_poll() मे अप्रत्याशित त्रुटि" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "शिशु प्रक्रिया (%s) सँ आँकड़ा पढ़बामे असफल" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "एकटा चाइल्ड प्रक्रिया (%s) सँ चुनें() पढ़बाक आँकड़ामे अप्रत्याशित त्रुटि हुई" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मे अप्रत्याशित त्रुटि" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फोर्क करबामे असफल" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "शिशु प्रक्रिया \"%s\" (%s) कार्यान्वित करबामे असफल" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "आउटपुट अथवा शिशु प्रक्रिया (%s) क' इनपुट केँ अनुप्रेषित करब मे असफल" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "शिशु प्रक्रिया (%s) फॉर्क करब मे असफल" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "शिशु प्रक्रिया \"%s\" कार्यान्वित करबामे अज्ञात त्रुटि" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "शिशु पीआईडी पाइप (%s) सँ पर्याप्त आँकड़ा पढ़बामे असफल" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "यूटीएफ-8 लेल अक्षर सीमासँ बाहर" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "परिवर्तन इनपुटमे अवैध अनुक्रम" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "यूटीएफ-16 लेल अक्षर सीमासँ बाहर" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "प्रयोग:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[विकल्प...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "मद्दति विकल्प:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "मद्दति विकल्प देखाबू" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "सभटा मद्दति विकल्प देखाबू" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्प:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "पूर्णांक मान '%s' केँ %s क' लेल विश्लेषण नहि कए सकैत अछि" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "पूर्णांक मान '%s' %s क' लेल रेंज क' बाहर अछि" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' दोहराएल मान क' विश्लेषण %s क' लेल नहि कए सकैत अछि" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' दोहराएल मान %s क' लेल परिसरसँ बाहर अछि" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "%s विकल्प विश्लेषणमे त्रुटि" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s क' लेल गुम तर्क" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "अनजान विकल्प %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "एकटा सामान्य फाइल नहि" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "फाइल खाली अछि" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"कुंजी फाइलमे '%s' पंक्ति समाहित अछि जे एकटा कुँजी मान जोड़ा, समूह, अथवा टिप्पणी नहि अछि" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध समूह नाम: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "कुंजी फाइल एकटा समूहक सँग शुरू नहि होइछ" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कुँजी नाम: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुँजी फाइल मे असमर्थित एनकोडिंग '%s' समाहित अछि" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुँजी फाइल मे '%s' समूह नहि अछि" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुँजी फाइलमे '%s' कुँजी नहि अछि" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुँजी फाइलमे '%s' कुँजी समाहित अछि '%s' मान क' सँग जे UTF-8 नहि अछि" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "कुँजी फाइलमे '%s' कुँजी अछि जकरा मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कुँजी फाइलमे '%s' कुँजी अछि जकरा मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"कुँजी फाइलमे '%s' कुँजी अछि '%s' समूह मे जकर मान क' विश्लेषण नहि कएल जाए सकैत अछि." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुँजी फाइलमे '%s' कुँजी नहि अछि '%s' समूहमे" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "कुँजी फाइलमे पँक्ति क' अंतमे एस्केप संप्रतीक रहैत अछि" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुँजी फाइल मे '%s' अमान्य श्रृंखला समाहित अछि" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान '%s' केँ एकटा सँख्याक तरह नहि विश्लेषित कएल जाए सकैत अछि." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "पूर्णांक मान '%s' रेंज क' बाहर अछि" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' केँ एकटा फ्लोट सँख्याक तरह नहि विश्लेषित कएल जाए सकैत अछि." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' केँ बुलियन क' तौर पर विश्लेषित नहि कएल जाए सकैत अछि." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Too large count value passed to %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "स्ट्रीन पहिनेसँ बन्न अछि" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "ऑपरेशन रद्द छल" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "परिवर्तन इनपुटमे अवैध बाइट अनुक्रम" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "फाइलकेँ काटबामे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "अज्ञात प्रकार" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "निर्देशिका '%s' केँ खोलबामे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "निर्देशिका बनाबैमे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Enumerator is closed" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "स्ट्रीन पहिनेसँ बन्न अछि" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "ऑपरेशन समर्थित नहि अछि" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "पँक्ति %d पर त्रुटि: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s विकल्प विश्लेषणमे त्रुटि" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "अक्षर '%s' एकटा एंटिटी नाम क' भीतर वैध नहि अछि" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "अक्षर '%s' एकटा एंटिटी नाम क' भीतर वैध नहि अछि" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "अक्षर '%s' एकटा एंटिटी नाम क' भीतर वैध नहि अछि" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%s विकल्प विश्लेषणमे त्रुटि" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "परिवर्तनक दौरान त्रुटि: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "निर्देशिका '%s' केँ खोलबामे त्रुटि: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "बेनाम" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "प्रयोक्ता डेस्कटाप फाइल %s नहि बनाए सकैत अछि" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "%s कए लेल पसंदीदा परिभाषित" + +#: ../gio/gdrive.c:363 +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:728 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: ../gio/gdrive.c:831 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblem प्रत्याशित GEmblemedIcon केँ लेल" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "माउंट नहि समाहित मोजुद नहि अछि" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "निर्देशिका पर कापी नहि कए सकैत अछि" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "निर्देशिकाकेँ उप्पर निर्देशिका कापी नहि कए सकैत अछि" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "लक्षित फाइल मोजुद अछि" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "निर्देशिकाकेँ बेरबेर सँ नहि कापी कए सकैछ" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "सिंबालिक लिंक समर्थित नहि अछि" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "विशेष फाइलकेँ कापी नहि कए सकल" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फाइल नाम मे '%c' नहि रहि सकैत अछि" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "आवाज माउंटकेँ लागू नहि करैत अछि" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "कोनो अनुप्रयोग ई फाइलकेँ नियंत्रणकेँ लेल पंजीकृत नहि अछि" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerator is closed" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "File enumerator has outstanding operation" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon एन्कोडिंगकेँ %d संस्करणकेँ नियंत्रित नहि कए सकैत अछि" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon केँ लेल विरूपित इनपुट डेटा" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "विरूपित संस्करण संख्या: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "स्ट्रीमकेँ संग बचल आपरेशन अछि" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "ऑपरेशन समर्थित नहि अछि" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "अमान्य गुण प्रकार (string expected)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फाइलनाम %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फाइलसिस्टम सूचना पाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "रूट निर्देशिकाकेँ नाम नहि बदलि सकल" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "फाइलक फेर नाम देबामे त्रुटि: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "फाइलकेँ फेर नाम नहि बदलि सकैत छी, फाइलनाम पहिनेसँ मोजुद अछि" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "अवैध फाइलनाम" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "निर्देशिका नहि खोलि सकैछ" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ट्रैश निर्देशिका %s बनाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "ट्रैशक लेल उच्च स्तरीय निर्देशिका ताकबामे असमर्थ" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "ट्रेश निर्देशिका बनाबैमे या ताकबामे असमर्थ" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ट्रेशिंग सूचनाकेँ फाइलमे बनाबैमे असमर्थ: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "निर्देशिका बनाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "सिंबालिक लिंक '%s' सँ थीम पढ़बामे असफल %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "सिंबलिंक बनाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "फाइल घुसकाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "निर्देशिका पर निर्देशिका नहि घुसकाए सकैछ" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "बैकअप फाइल निर्माण विफल" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्षित फाइल हटाबैमे त्रुटि: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "माउंटकेँ बीच चलनाइ समर्थित नहि अछि" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "गुणकेँ जरूर गैर-NULL होबा चाही" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "अमान्य गुण प्रकार (string expected)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "अमान्य विस्तारित गुण नाम" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारित गुण '%s' सेटिंगमे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' फाइल बताबैमे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (अमान्य एन्कोडिंग)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "फाइल विवरण कथित करने मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अमान्य गुण प्रकार (uint32 expected)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अमान्य गुण प्रकार (uint64 expected)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "अमान्य गुण प्रकार (byte string expected)" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "स्वामी सेटिंग मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "symlink जरूर गैर-NULL होबा चाही" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink सेटिंग मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink सेटिंग मे त्रुटि: फाइल एकटा symlink नहि अछि" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "अनुमति सेटिंग मे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ गैर-NULL होबा चाही" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ सेट करबामे त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ई सिस्टम पर सक्रिय नहि अछि" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "सेटिंग गुण %s समर्थित नहि" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "फाइल पढबामे त्रुटि: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फाइल खोजबामे त्रुटि: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "पूर्वनिर्धारित स्थानीय फाइल मानिटरक प्रकार तकबामे असमर्थ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "पुरान बैकअप लिंक हटाबैमे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "बैकअप कापी बनाबैमे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "अस्थाई फाइलकेँ नाम देबामे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "फाइलकेँ काटबामे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फाइल खोलबमे त्रुटि: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "लक्षित फाइल निर्देशिका अछि" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "लक्षित फाइल एकटा नियमित फाइल नहि अछि" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "फाइल बाहरी रूपेँ बदलल अछि" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "पुरान फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "अमान्य GSeekType कए आपूर्ति" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "अमान्य प्राप्ति आग्रह" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream केँ काटि नहि सकल" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "स्मृति आउटपुट स्ट्रीमकेँ फेर आकार देनाइ संभव नहि" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "स्मृति आउटपुट स्ट्रीमकेँ फेर आकार देनाइ विफल" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउंट तुल्यकालित कंटेंट प्रकार गेसिंगकेँ लागू नहि करैछ" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "आउटपुट स्ट्रीम लेखन केँ लागू नहि करैछ" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "स्रोत स्ट्रीम पहिनेसँ बन्न अछि" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' फाइल केँ पढ़बामे त्रुटि: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "अनजान विकल्प %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +#, fuzzy +msgid "Socket is already closed" +msgstr "स्रोत स्ट्रीम पहिनेसँ बन्न अछि" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "फाइल पढबामे त्रुटि: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ट्रैश निर्देशिका %s बनाबैमे त्रुटि: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "परिवर्तनक दौरान त्रुटि: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "फाइलकेँ काटबामे त्रुटि: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "फाइलकेँ रद्दीमे भेजबामे त्रुटि: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ट्रैश निर्देशिका %s बनाबैमे त्रुटि: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gsocket.c:3081 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "संयोजन परिवर्तन win32 पर समर्थित नहि अछि" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "फाइल हटाबै मे त्रुटि: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "अज्ञात त्रुटि" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#: ../gio/gsocketlistener.c:191 +#, fuzzy +msgid "Listener is already closed" +msgstr "स्ट्रीन पहिनेसँ बन्न अछि" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "%d संस्करण GThemedIcon एन्कोडिंगकेँ नियंत्रित नहि कए सकल" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "फाइलकेँ खोलबामे त्रुटि: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "फाइलक फेर नाम देबामे त्रुटि: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "unix सँ पढ़बामे त्रुटि: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "unix केँ बन्न करबामे त्रुटि: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "फाइल सिस्टम रूट" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "unix मे लिखबामे त्रुटि: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "आवाज बाहर निकालबकेँ लागू नहि करैछ" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "अनुप्रयोग नहि पाबि सकल" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग लान्च करबामे त्रुटि: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI समर्थित नहि" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "संयोजन परिवर्तन win32 पर समर्थित नहि अछि" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "संयोजन निर्माण win32 पर समर्थित नहि अछि" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "फाइल पढबामे त्रुटि: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "फाइल बन्न करबामे त्रुटि: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "फाइलमे लिखबामे त्रुटि: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "स्मृतिक बाहर" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "अवैध होस्ट-नाम" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "निर्देशिका पर निर्देशिका नहि घुसकाए सकैछ" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "प्रकार %s वर्गीकृत नहि अछि" + +#, 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 "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.po b/po/mg.po new file mode 100644 index 0000000..0485b17 --- /dev/null +++ b/po/mg.po @@ -0,0 +1,3845 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2007-03-03 19:00+0300\n" +"Last-Translator: Fanomezana Rajaonarisoa \n" +"Language-Team: MALAGASY \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Marika manokana '%s' ho an'ny '%s' tsy nampoizina" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Tsy hita ny marika manokana '%s' ho an'ny '%s'" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tsy nampoizina ny taf '%s', nantenaina ny tag '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Misy tag '%s' tsy nampoizina anatin'ny '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Tsy misy raki-drohy mitombina anatin'ny lahatahiry misy ny data" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Efa misy rohy ny URI '%s'" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Tsy nahitana rohy ny URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Tsy voasokatra ny mpanova rakitra '%s' ho '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Tsy feno ny filaharan'ny marika amin'ny faran'ny zavatra ovaina" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ny fallback '%s' tsy voaova ho amboaram-pango '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Tsy mitombina ny URI '%s'" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Tsy mitombina ny anaram-mpampiantranon'ny URI '%s'" + +#: ../glib/gconvert.c:1941 +#, 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:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "Anaram-pampiantrano diso" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "janoary" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "febroary" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "martsa" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "aprily" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "mey" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "jona" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "jolay" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "mey" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jon" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jol" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "alatsinainy" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "talata" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "alarobia" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "alakamisy" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "zoma" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sabotsy" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "alahady" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "lts" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "tlt" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "lrb" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "lkm" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "zom" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sab" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "lhd" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Tsy nahatokana %lu byte hamakiana ny rakitra \"%s\"" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ny nahavaky ny mpiatin'ny rakitra '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Tsy voasokatran y rakitra '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Tsy mitombina ny lasitra '%s'; tsy tokony hisy '%s'" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Tsy misy XXXXXX ny lasitra '%s'" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Misy tsy fetezana amin'ny andalana %d marika %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Lahabolana voafango UTF-8 tsy mitombina" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nahita ary '&;' foana; ireto no fidirana ekena: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Tsy fantatra ny anaran'ary '%s'" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" +"Tsy maintsy manomboka amina singantaharo ilay tahirin-kevitra (oh. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Foana na tsy misy afa-tsy elanelana ilay tahirin-kevitra" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Nifarana tampoka taoriana fonon-teny kitso loha '<' ilay tahirin-kevitra" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Nifarana tampoka tanaty anaran-tsingataharo ilay tahirin-kevitra" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Nifarana tampoka tanaty anarana marika manokana ilay tahirin-kevitra" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Nifarana tampoka tanaty tag manomboka singantaharo ilay tahirin-kevitra." + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Nifarana tampoka ilay tahirin-kevitra raha mbola tanaty sanda-marika manokana" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Marika tsy feno no mamarana ilay canal" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Fiantsoana marika tsy vita" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Fiantsoana marika tsy vita" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Fiantsoana marika tsy vita" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Fiantsoana ary tsy vita" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Tsy manomboka amin'ny farango ny teny nalaina" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Foana ilay lahabolana (na tsy misy afa-tsy elanelana)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Tsy voavaky ny datan'ny fizotra zanaka" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Tsy voavaky ny mpiatin'ny fantson'ny zanaka (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Tsy nahomby ny fanovana lahatahiry ho '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Tsy nahavita nanatanteraka ny fizotra zanaka (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Anaran-drindranasa diso: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Tsy mitombina ny laha-daza anatin'ny tontolo: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Lahatahiry fiasana tsy mitombina: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Tsy nahavita nandefa ny rindranasa mpanampy (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Tsy voavaky ny datan'ny fizotra zanaka (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Nisy olana tsy nampoizina tanatin'ny waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Tsy nahavita nanasaka (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Tsy nahavita nandefa ny fizotra zanaka \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Tsy nahavita nanasaka ny fizotra zanaka (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" +"Nisy olana tsy fantatra teo am-panatanterahana ny fizotra zanaka \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Mihoatra ny fetran'ny UTF-8 ilay marika" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Tsy mitombina ny filaharana amin'ny fidiran'ny fanovana" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Mihoatra ny fetran'ny UTF-16 ilay marika" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Fampiasa:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[SAFIDY...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Safidy momba ny toro-làlana:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Asehoy ny safidy momba ny toro-làlana" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Asehoy ny safidy rehetra momba ny toro-làlana" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Safidy momba ny rindranasa:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, 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:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Tsy afaka mizarazara sanda roa '%s' ho an'ny '%s'" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Tondrikin'ny %s tsy eo" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Safidy %s tsy fantatra" + +#: ../glib/gkeyfile.c:366 +#, 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:401 +msgid "Not a regular file" +msgstr "Rakitra tsy mahazatra" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Foana ilay rakitra" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Anaram-bondrona diso: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Tsy manomboka amina vondrona ilay raki-pamaha" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Anaram-pamaha diso: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Misy fango '%s' tsy raisina an-tànana ilay raki-pamaha" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Tsy manana vondrona '%s' ilay raki-pamaha" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Tsy manana famaha '%s' ilay raki-pamaha" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Misy fisesisesim-pialana '%s' tsy mitombina anatin'ilay raki-pamaha" + +#: ../glib/gkeyfile.c:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Mihoatra ny fetra ny sanda feno '%s'" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Tsy mitombina filaharan'ny byte amin'ny zavatra ovaina" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Safidy %s tsy fantatra" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Tsy mety atao amin'ny anaran'ary ny marika '%s'" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Tsy mety atao amin'ny anaran'ary ny marika '%s'" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Tsy mety atao amin'ny anaran'ary ny marika '%s'" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +#, 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:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Anaram-pamaha diso: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Anaram-pampiantrano diso" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Tsy voavaky ny rohy misolotena '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Nifarana tampoka tanaty anarana marika manokana ilay tahirin-kevitra" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Nisy olana teo am-panokafana ny lahatahiry '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Rakitra tsy mahazatra" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Anaram-pamaha diso: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Safidy %s tsy fantatra" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Nisy olana teo am-panovana: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Tsy voaforona ny rakitra '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Misy tsy fetezana amin'ny andalana %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Nisy olana teo am-pizarazarana ny safidy %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Tsy raisina an-tànana ny rohy misolotena" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Nisy olana teo am-pamakiana ny rakitra '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/mk.po new file mode 100644 index 0000000..22006ac --- /dev/null +++ b/po/mk.po @@ -0,0 +1,3874 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2008-02-04 04:11+0100\n" +"Last-Translator: Jovan Naumovski \n" +"Language-Team: Macedonian \n" +"Language: mk\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочекуван атрибут „%s“ за елементот „%s“" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибутот „%s“ на елементот „%s“ не е пронајден" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочекувана етикета „%s“, се очекуваше „%s“" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочекувана етикета „%s“ во „%s“" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Не е пронајдена валидна датотека за обележувач во дирекориумите со податоци" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Обележувач за URI „%s“ веќе постои" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не е пронајден обележувач за URI „%s“" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не е дефиниран MIME тип во обележувачот за URI „%s“" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не е дефинирано приватно знаме за обележувачот за URI „%s“" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не се поставени групи во обележувачот за URI „%s“" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Нема апликација со име „%s“ која регистрирала обележувач за „%s“" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не успеав да ја проширам линијата за извршување „%s“ со URI „%s“" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Конвертирањето од %s' во „%s“ не е поддржано" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не можам да го отворам конверторот од „%s“ до „%s“" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Невалидна секвенца на бајти во влезот на конвертирањето" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка при конвертирање: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Парцијална секвенца на карактер на крајот од влезот" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не можам да го конвертирам „%s“ во енкодингот „%s“" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "„%s“ не е апсолутна адреса која што ја користи шемата на датотеката" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Локалното URI „%s“ може да не користи '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "„%s“ е невалиден URI" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Името на хостот на URI %s е невалидно" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "„%s“ содржи невалидни посебни карактери" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Патеката „%s“ не е апсолутна патека" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Невалидно име на хост" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a, %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "јануари" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "февруари" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "март" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "април" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "мај" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "јуни" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "јули" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "јан" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "фев" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "мар" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "апр" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "мај" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "јун" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "јул" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "понеделник" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "вторник" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "среда" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "четврток" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "петок" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "сабота" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "недела" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "пон" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "вто" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "сре" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "чет" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "пет" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "саб" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "нед" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не можам да алоцирам %lu бајти за да ја прочитам датотеката \"%s\"" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не успеав да прочитам од датотеката „%s“: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не успеав да ја отворам датотеката „%s“: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Не успеав да ги добијам атрибутите на датотеката „%s“: fstat() failed: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не успеав да ја отворам датотеката „%s“: fdopen() failed: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Не успеав да ја реименувам датотеката „%s“ во „%s“: g_rename() не успеа: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не успеав да ја креирам датотеката „%s“: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Не успеав да ја отворам датотеката „%s“ за запишување: fdopen() не успеа: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не успеав да запишам во датотеката „%s“: fwrite() не успеа: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не успеав да ја затворам датотeката „%s“: fclose() не успеа: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Постоечката датотека „%s“ не може да биде отстранета: g_unlink()·не успеа " +"за: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Мострата „%s“ е невалидна, не треба да содржи „%s“" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Мострата „%s“ не содржи со XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u бајт" +msgstr[1] "%u бајти" +msgstr[2] "%u бајти" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u бајт" +msgstr[1] "%u бајти" +msgstr[2] "%u бајти" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не успеав да ја прочитам симболичката врска „%s“: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не успеав да ја отворам датотеката „%s“: open() не успеа: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не успеав да ја означам датотеката „%s“: mmap() не успеа: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка на линија %d знак %d" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Невалиден UTF-8 енкодиран текст - невалидно „%s“" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка на линија %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Параметарот на карактерот '%-.*s' не енкодира забранет карактер" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Празен ентитет '&;' видени; валидни ентитети се: & " < > " +"'" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Името на ентитетот „%s“ е познато" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Документите мора да започнуваат со елемент (пр. )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не е валиден карактер по '<' карактер; не може да започне име на елемент" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Чуден карактер „%s“, очекував '>' карактер да го заврши почетниот таг на " +"елементот „%s“" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Чуден карактер „%s“, очекував '=' по името на атрибутот „%s“ од елементот " +"'%s'" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“·не е валиден карактер што би можел да доје по името на елементот „%s“, " +"дозволениот карактер е '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елементот „%s“ е затворен. Во моментов не е отворен ниеден елемент" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елементот „%s“ е затворен, но тековно отворениот елемент е „%s“" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Документот е празен или содржи само празни места" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документот заврши неочекувано веднаш по заградата за отворениот агол '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документот заврши неочекувано со сеуште отворени елементи - „%s“ беше " +"последниот отворен елемент" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документот заврши неочекувано, очекував да видам го видам аголот на " +"заградата за затворање на тагот <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документот заврши неочекувано внатре во иметп на елементот" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документот заврши неочекувано внатре во името на атрибутот" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документот заврши неочекувано внатре во тагот за отворање на елементи." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "Нема вредност за атрибутот" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Документот заврши неочекувано додека беше внатре во вредноста на атрибутот" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Документот заврши неочекувано внатре во тагот за затворање на елементи „%s“" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Документот заврши неочекувано внатре во коментар или инструкција за " +"процесирање" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "корумпиран објект" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "интерна грешка или корумпиран објект" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "нема повеќе меморија" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "ограничувањето за следење е достигнато" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "шаблонот содржи предмети кои не се поддржани за парцијално совпаѓање" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "внатрешна грешка" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "задните референци не се поддржани како услови за парцијално совпаѓање" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "достигнато е ограничувањето за рекурзија" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "достигнато е ограничувањето за празни поднизи за работните простори" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "невалидна комбинација од ознаки за нов ред" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "непозната грешка" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ на крајот на шаблонот" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c на крајот на шаблонот" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "непрепознатиот знак после \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" +"знаците за промена на мала-голема буква (\\l, \\L, \\u, \\U) не се дозволени " +"овде" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "броевите се преголеми за во {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "бројот е преголем за ознаката {}" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "недостасува ] за прекин за класата знаци" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "невалидна секвенца за излез во класата за знаци" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "опсегот е преминат во класата на знаци" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "нема ништо за повторување" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "непрепознат знак после (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "непрепознат знак после (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "непрепознат знак после (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "Класите со POSIX имиња се поддржани само внатре во класа" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "недостасува ) за прекин" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "цифрите (?R или (?[+-] мора да бидат проследени со )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "референца до непостоечки подшаблон" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "недостасува ) после коментарот" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "регуларниот израз е преголем" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "не успеав да добијам меморија" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "тврдењето за поглед наназад не е со фиксна должина" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "неправилен број или име после (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "условната група содржи повеќе од две гранки" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "се очекува барање после (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "непознато име на POSIX класа" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX елементите не се поддржани" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "вредноста на знакот во секвенцата \\x{...} е преголема" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "невалиден услов (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C не е дозволено во барање за поглед наназад" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "рекурзивниот повик може да се повикува бесконечно" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "недостасува прекинувач во името на подшаблонот" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "два подшаблони имаат исти имиња" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "неправилна \\P или \\p секвенца" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "непознато име на својство после \\P или \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "името на подшаблонот е предолго (максимум 32 знаци)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "премногу именувани подшаблони (максимум 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "окталната вредност е поголема од \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE групата содржи повеќе од една гранка" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "повторувањето на DEFINE група не е дозволено" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "нецелосни NEWLINE опции" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g не е проследено со име во загради или опционално ненулти број во загради" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "неочекувано повторување" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "overflow на код" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "преминато место за компајлирање" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "претходно проверениот референциран подшаблон не е пронајден" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка при совпаѓањето на регуларни изрази %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE библиотеката е компајлирана без UTF-8 поддршка" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE библиотеката е компајлирана без поддршка за својствата на UTF8" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при компајлирање на регуларниот израз %s кај знакот %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка во оптимизирањето на регуларниот израз %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "Се очекува хексдецимална цифра или „}“" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "Се очекува хексдецимална цифра" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "недостасува „<“ во симболичката референца" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "Недовршена симболичка референца" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "симболичка референца со нулта должина" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "се очекува цифра" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "нелегална симболичка референца" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "занемари го финалното „\\“" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "непозната излезна секвенца" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка при парсирањето на текстот за замена „%s“ на знакот %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Цитираниот текст не започнува со знакот за цитирање" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Несовпаѓачки знак за цитирање на командната линија или друг текст цитиран во " +"школка" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текстот заврши веднаш по '\\' карактер. (Текстот беше „%s“)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текстот заврши пред да биде пронајден совпаѓачки цитат за %c. (Текстот беше " +"„%s“)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текстот беше празен (или содржеше само празни места)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Не успеав да ги прочитам податоците од подпроцесот" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Не успеав да креирам цевка за комуникација со другите подпроцеси (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Не успеав да прочитам од под-цевката (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Не успеав да го променам директориумот„%s“ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Не успеав да го извршам подпроцесот (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Невалидно име на програма: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Невалиден стринг во аргументот за векторот кај %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Невалиден стринг во околината: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Невалиден работен директориум: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не успеав да ја извршам програмата за помош (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекувана грешка во g_io_channel_win32_poll() при читање на податоциод " +"подпроцесот" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Не успеав да ги прочитам податоците од подпроцесите (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочекувана грешка во select() при читањето на податоци од подпроцесот (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочекувана грешка во waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Не успеав да форкувам (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Не успеав да го извршам подпроцесот \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Не успеав да го пренасочам излезот или влезот на подпроцесот (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Не успеав да го форкувам подпроцесот (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршувањето на подпроцесот \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Не успеав да прочитам доволно податоци од pid подцевката (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "Карактерот е надвор од опсегот за UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Невалидна секвенца во излезот од конвертирањето" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Карактерот е надвор од опсег за UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Употреба:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ОПЦИЈА...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Опции за помош:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Покажи ги сите опции за помош" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Покажи ги сите опции за помош" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Опции на апликацијата:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не можам да парсирам вредност за целобројната вредност „%s“ за %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Вредноста на целиот број „%s“ за %s е надвор од опсегот" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не можам да ја анализирам целобројната вредност „%s“ за %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Вредноста на целиот број „%s“ за %s е надвор од опсегот" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при парсирањето на опцијата %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Недостига аргумент за %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опција „%s“·" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Не е пронајден валиден клуч во директориумите за пребарување" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Не е обична датотека" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Датотеката е празна" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Клучната датотека содржи линија „%s“· која што не е пар на клучна вредност, " +"група или коментар" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Невалидно име на група: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Клучната датотека не започнува со група" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Невалидно име на клуч: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Клучната датотека содржи неподдржан енкодинг „%s“·" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Клучната датотека не ја содржи групата „%s“" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Клучната датотека не го содржи клучот „%s“" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Клучната датотека го содржи клучот „%s“ со вредноста „%s“ која што не е UTF-8" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ чија што вредност неможе да биде " +"препознаена." + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ чија што вредност неможе да биде " +"препознаена." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Клучната датотека го содржи клучот „%s“ во групата „%s“ која што има " +"вредност која што неможе да биде препознаена." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Клучната датотека не содржи клуч во „%s“ во групата „%s“" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "Клучната датотека содржи специјални карактери на крајот на линијата" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Клучната датотека содржи невалидни посебни карактери „%s“" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Вредноста „%s“ неможе да биде препознаена како број." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целобројната вредност „%s“ е надвор од опсегот" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Вредноста „%s“ неможе да биде препознаена како рационален број." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Вредноста „%s“ не може да биде препознаена како boolean." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Преголема бројна вредност дадена на %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Стримот е веќе затворен" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Операцијата беше прекината" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Невалидна секвенца на бајти во влезот на конвертирањето" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "%s тип" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочекувано прерано завршување на стрим" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Грешка при скратувањето на датотеката: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Непознат тип" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Енумераторот е затворен" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Стримот е веќе затворен" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Ѓубрето не е поддржано" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Грешка на линија %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Грешка при парсирањето на опцијата %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Карактерот „%s“ не е валиден внатре во името на ентитетот" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Карактерот „%s“ не е валиден внатре во името на ентитетот" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Карактерот „%s“ не е валиден внатре во името на ентитетот" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Грешка при парсирањето на опцијата %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Грешка при конвертирање: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "корумпиран објект" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Неименувано" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop датотеката не одреди Exec поле" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "не успеав да најдам терминал потребен за апликација" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" +"Не можам да креирам папка за конфигурација на корисничките апликации %s: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не можам да креирам папка за MIME конфигурации %s: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не можам да креирам корисничка desktop датотека %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Сопствена дефиниција на %s" + +#: ../gio/gdrive.c:363 +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:728 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "уредот нема имплементирано вадење" + +#: ../gio/gdrive.c:831 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "уредот нема имплементирано вадење" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Монтирањето кое се содржи не постои" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Не можам да копирам над директориум" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Не можам да копирам директориум над директориум" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Целната датотека постои" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Не можам рекурзивно да го ископирам директориумот" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Симболичките врски не се поддржани" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gfile.c:2909 +#, fuzzy +msgid "Can't copy special file" +msgstr "Не можам да копирам над директориум" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Дадена е невалидна вредност за симболичката врска" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Ѓубрето не е поддржано" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имињата на датотеки не можат да содржат „%c“" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "просторот нема имплементирано монтирање" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Не е регистрирана апликација за справување со оваа датотека" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Енумераторот е затворен" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Енумераторот на датотеки има преголема операција " + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Енумераторот за датотеки веќе е затворен" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Стримот не поддржува query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Барањето не е поддржано за стрим" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Смалувањето не е дозволено на влезен стрим" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Смалувањето не е поддржано на стрим" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Стримот има преголема операција" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Ѓубрето не е поддржано" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Невалиден тип на атрибут (се очекуваше знаковна низа)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Не можам да најдам локален директориум за тип на надгледување" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Невалидно име на датотека %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при добивањето на информации за датотечниот систем: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Не можам да го преименувам директориумот root" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка во преименувањето на директоруимот: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Не можам да ја преименувам датотеката, името на датотеката веќе постои" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Невалидно име на датотека" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Не можам да го отворам директориумот" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при преместувањето на датотеката во ѓубре: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не успеав да креирам директориум за ѓубре %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Не успеав да го најдам директориумот од највисоко ниво за ѓубрето" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Не успеав да го најдам или креирам директориумот за ѓубре" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" +"Не успеав да креирам датотека со информации за преместувањето во ѓубре: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не успеав да ја преместам датотеката во ѓубрето: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при отворање на директориумот „%s“: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Не успеав да ја прочитам симболичката врска „%s“: %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка во креирањето на симболичка врска: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка во преместувањето на датотеката: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Не можам да го преместам директориумот над друг директориум" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Не успеа креирањето на бекап датотеката" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка во отстранувањето на целната датотека: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Движењето меѓу монтирањата не е поддржано" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Вредноста на атрибутот не смее да е NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Невалиден тип на атрибут (се очекуваше знаковна низа)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Невалидно име на проширениот атрибут" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка во поставувањето на проширениот атрибут „%s“: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка во стартувањето на датотеката „%s“: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (невалидно енкодирање)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка во поставувањето на опишувач на датотека: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Невалиден тип на атрибут (се очекуваше uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Невалиден тип на атрибут (се очекуваше uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Невалиден тип на атрибут (се очекуваше низа од бајти)" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при поставувањето на сопственикот: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "симболичката врска не треба да е NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка во поставувањето на симболичката врска: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Грешка при креирањето на симболичката врска: датотеката не е симболичка врска" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка во поставувањето на пермисиите: %s" + +#: ../gio/glocalfileinfo.c:2162 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "симболичката врска не треба да е NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при поставувањето на сопственикот: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Поставувањето на атрибутот %s не е поддржано" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при читањето од датотеката: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при барањето во датотеката: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Не можам да го откријам типот на локалниот надгледувач на датотеки" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка во отстранувањето на старата бекап врска: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при креирањето на бекап копија: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка во преименувањето на привремената датотека: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при скратувањето на датотеката: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при отворањето на датотеката „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Целната датотека е директориум" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Целната датотека не е обична датотека" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Датотеката беше надворешно изменета" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Обезбеден е невалиден GSeekType" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Невалидно барање за барање" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не можам да го смалам GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Меморијата на излезниот стрим не може да си ја промени големината" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Не успеав да ја променам големината на меморијата на излезниот стрим" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +#, 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:874 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount нема имплементирано одмонтирање" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "Излезниот стрим нема имплементирано запишување" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Изворот на стримот веќе е затворен" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при читањето на датотеката „%s“: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Непозната опција „%s“·" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +#, fuzzy +msgid "Socket is already closed" +msgstr "Изворот на стримот веќе е затворен" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Грешка при читањето од датотеката: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Не успеав да креирам директориум за ѓубре %s: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при конвертирање: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Грешка при скратувањето на датотеката: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Не успеав да ја преместам датотеката во ѓубрето: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не успеав да креирам директориум за ѓубре %s: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gsocket.c:3081 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "промените на асоцијации не се поддржани на win32" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при отстранувањето на датотеката: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "непозната грешка" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Симболичките врски не се поддржани" + +#: ../gio/gsocketlistener.c:191 +#, fuzzy +msgid "Listener is already closed" +msgstr "Стримот е веќе затворен" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Неочекувано прерано завршување на стрим" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Грешка во отворањето на директоруимот: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Грешка во преименувањето на директоруимот: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при читањето од unix: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Грешка во затворањето на unix: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Root на датотечниот систем" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Грешка во запишувањето на unix: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "просторот нема имплементирано вадење" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Не можам да ја најдам апликацијата" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка во пуштањето на апликацијата: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI-те не се поддржани" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "промените на асоцијации не се поддржани на win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Креирањето на асоцијација не е поддржано на win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Грешка при читањето од датотеката: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Грешка во затворањето на датотеката: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Грешка во запишувањето во датотеката: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "нема повеќе меморија" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "внатрешна грешка" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Невалидно име на хост" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "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.po b/po/ml.po new file mode 100644 index 0000000..0f3f97d --- /dev/null +++ b/po/ml.po @@ -0,0 +1,3785 @@ +# translation of glib.master.ml.po to +# translation of glib.HEAD.ml.po to +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# FSF-India , 2003. +# Ani Peter , 2006, 2007, 2008, 2009. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.ml\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2009-09-20 20:08+0530\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' എലമെന്റിന് അപ്രതീക്ഷിതമായ സവിശേഷത '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "എലമെന്റ് '%s'-ന്റെ സവിശേഷതയായ '%s' കണ്ടുകിട്ടിയില്ല" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "അപ്രതീക്ഷിതമായ ടാഗ് '%s', ടാഗ് '%s' പ്രതീക്ഷിച്ചിരുന്നു" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s'-ന്റെ ഉളളില്‍ അപ്രതീക്ഷിതമായ ടാഗ് '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "ഡേറ്റാ ഡയറക്ടറികളില്‍ സാധുതയുളള ബുക്ക് മാര്‍ക്ക് കണ്ടുകിട്ടിയില്ല" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് നിലവിലുണ്ട് " + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്ക് ലഭ്യമല്ല" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ MIME തരം വ്യക്തമാക്കിയിട്ടില്ല" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ സ്വകാര്യ ഫ്ളാഗ് വ്യക്തമാക്കിയിട്ടില്ല" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ ഗ്രൂപ്പുകളൊന്നും ക്രമീകരിച്ചിട്ടില്ല" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' എന്ന് പേരുളള ഒരു പ്രയോഗവും '%s'-നുളള ബുക്ക് മാര്‍ക്കില്‍ രജിസ്ടര്‍ ചെയ്തിട്ടില്ല" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' എന്ന URI ഉളള '%s' എന്ന exec വരി വികസിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "അക്ഷരക്കൂട്ടം'%s'ല് നിന്നും '%s'ലേക്കുളള മാറ്റം പിന്തുണയ്ക്കുന്നില്ല" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'-ല്‍ നിന്നും '%s'-ലേക്ക് വേര്‍തിരിക്കുന്ന സംവിധാനം ലഭ്യമായില്ല" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "മാറ്റം വരുത്തുന്ന ഇന്‍പുട്ടില്‍ തെറ്റായ ബൈറ്റ് ക്രമം" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "മാറ്റം വരുത്തുന്നതില്‍ പരാജയം : %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "ഇന്‍പുട്ടിന്റെ അവസാനം ഭാഗികമായ അക്ഷര ക്രമം" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ഫോള്‍സെറ്റ് '%s'-ല്‍ നിന്നും കോഡ്സെറ്റ് '%s'-ലേക്ക് മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI %s \"file\" സ്കീം ഉപയോഗിക്കുന്ന പൂര്‍ണ്ണമായ ഒരു URI അല്ല" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ലോക്കല്‍ ഫയല്‍ URI %s-ല്‍ '#' ഉല്‍പ്പെടുത്താന്‍ പാടില്ല" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' അസാധുവാണ്" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s'-ന്റെ ഹോസ്റ്റ് നാമം അസാധുവാണ്" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s'-ല്‍ അസാധുവായ എസ്കേപ്ഡ് അക്ഷരങ്ങള്‍ ഉണ്ട്" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' പാഥ് നാമം പൂര്‍ണ്ണമായ ഒരു പാഥ് അല്ല" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "സാധുതയില്ലാത്ത ഹോസ്റ്റ് നാമം" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "രാവിലെ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "വൈകു" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %B %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %B %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "ജനുവരി" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "ഫെബ്രുവരി" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "മാര്‍ച്ച്" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "ഏപ്രില്‍ " + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "മെയ്" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "ജൂണ്‍" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "ജൂലൈ" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ജനു" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ഫെബ്" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "മാര്‍" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ഏപ്ര" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "മെ" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ജൂണ്‍" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ജൂലൈ" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "തിങ്കള്‍" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "ചൊവ്വ" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ബുധന്‍" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "വ്യാഴം" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "വെള്ളി" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "ശനി" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ഞായര്‍" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "തി" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ചൊ" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ബു" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "വ്യാ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "വെ" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "à´¶" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ഞാ" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ഡയറക്ടറി '%s' തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu ബൈറ്റ്സ് ഫയല്‍ \"%s\" വായിക്കുന്നതിനായി നീക്ക് വയ്ക്കുവാന്‍ സാധ്യമല്ല" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ഫയല്‍ \"%s\" വളരെ വലുതാണു്." + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ഫയല്‍ '%s'-ല്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയം: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "%s തുറക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "%s-ന്റെ വിശേഷതകള്‍ കണ്ടെത്തുന്നതില്‍ പരാജയം: fstat() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' തുറക്കുന്നതില്‍ പരാജയം: fdopen() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"ഫയല്‍ '%s'-ന്റെ പേര് '%s' ആയി മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: g_rename() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ഫയല്‍ '%s' സൃഷ്ടിക്കുന്നതില്‍ പരാജയം: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "എഴുതുന്നതിനായി '%s' തുറക്കുവാന്‍ പരാജയപ്പെട്ടു: fdopen() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fwrite() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fflush() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ഫയല്‍ '%s' എഴുതുവാന്‍ പരാജയപ്പെട്ടു: fsync() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ഫയല്‍ '%s' അടയ്ക്കുന്നതില്‍ പരാജയപ്പെട്ടു: fclose() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "നിലവിലുളള ഫയല്‍ '%s' നീക്കം ചെയ്യുവാന്‍ സാധ്യമല്ല: g_unlink() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ടെംപ്ളേറ്റ് \"%s\" അസാധുവാണ്,ഇതില്‍ \"%s\" ഉണ്ടാകുവാന്‍ പാടില്ല" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ടെംപ്ളേറ്റ് \"%s\"-ല്‍ XXXXXX ലഭ്യമല്ല" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ഫയല്‍ '%s' തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: open() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ഫയല്‍ '%s' മാപ്പ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: mmap() പരാജയപ്പെട്ടു: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "%d-ആം വരിയില്‍ %d-ആം അക്ഷരത്തില്‍ പിശക്:" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "പേരില്‍ സാധുതയില്ലാത്ത UTF-8 രഹസ്യ വാചകം - '%s' തെറ്റാകുന്നു" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "വരി %d-ല്‍ പിശക്: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" +"അക്ഷരത്തിന്റെ സൂചനയായ '%-.*s' ഒരു അനുവദനീയമായ രഹസ്യ അക്ഷരത്തിലേക്കല്ല വേര്‍തിരിക്കുന്നത്" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"‌ശൂന്യമായ എന്റിന്റി '&;' കണ്ടു; അനുവദനീയമായവ ഇവയാണ്: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "എന്റിന്റി നാമം '%-.*s' അപരിചിതമാണ്" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "രേഖ തുടങ്ങേണ്ടത് ഒരു എലമെന്റിലാണ് (ഉദാ )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' അക്ഷരത്തിന് പിന്നിലുളള '%s' ഒരു അസാധുവായ അക്ഷരമാണ്; ഇത് ഒരു എലമെന്റ് പേരില്‍ തുടങ്ങില്ല" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ഓഡ് അക്ഷരം '%s', '%s' എന്ന ശൂന്യ-എലമെന്റ് റ്റാഗ് അവസാനിപ്പിക്കുന്നതിനായി '>' പ്രതീക്ഷിച്ചു" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"ഓഡ് അക്ഷരം '%s', എലമെന്റ് '%s'-ന്റെ സവിശേഷത നാമം '%s'-ന് ശേഷം ഒരു '=' പ്രതീക്ഷിക്കുന്നു" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"എലമെന്റ് നാമം '%s'-ന് ശേഷം ഉളള '%s', ഒരു അസാധുവായ അക്ഷരമാണ്; '>' അക്ഷരമാണ് അനുവദിക്കുന്നത്" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "എലമെന്റ് '%s' അടച്ചിരിക്കുന്നു, ഒരു എലമെന്റുകളും നിലവില്‍ തുറന്നിട്ടില്ല" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "എലമെന്റ് '%s' അടച്ചിരിക്കുന്നു, പക്ഷേ നിലവില്‍ ലഭ്യമായ എലമെന്റ് '%s' ആണ്" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "രേഖ ശൂന്യമാണ് അല്ലെങ്കില്‍ അതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉള്ളൂ" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ഒരു '<' ബ്രാക്കറ്റിന് ശേഷം രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചിരിക്കുന്നു " + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"എലമെന്റുകള്‍ തുറന്നു കിടക്കുമ്പോള്‍ തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു - ഒടുവില്‍ തുറന്ന എലമെന്റ് " +"'%s' ആണ്" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"തന്നെ രേഖ അപ്രതീക്ഷമായ അടഞ്ഞിരിക്കുന്നു, ടാഗ് <%s/>-ന് അവസാനമായി ഒരു ക്ളോസ് ആങ്കില്‍ ബ്രാക്കറ്റ് " +"പ്രതീക്ഷിക്കുന്നു" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "ഒരു എലമെന്റിന്റെ നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ഒരു എലമെന്റ്-ഓപ്പണിങ് ടാഗിനുളളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"സമം ചിഹ്നത്തിന് ശേഷം ഒരു വിശേഷതയുടെ പേര് ആയതിനാല്‍ അപ്റതീക്ഷിതമായി ഡോക്യുമെന്റ് അവസാനിച്ചു; " +"വിശേഷതയ്ക്കു് മൂല്ല്യം ലഭ്യമല്ല" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ഒരു സവിശേഷത നാമത്തിനുളളില്‍ വച്ച് രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "എലമെന്റ് '%s'-ന്റെ ക്ലോസ് ടാഗിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി അവസാനിച്ചു" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"ഒരു അഭിപ്രായം അല്ലെങ്കില്‍ ഒരു പ്രക്രിയ നടത്തുന്ന നിര്‍ദ്ദേശത്തിനുള്ളില്‍ രേഖ അപ്രതീക്ഷിതമായി " +"അവസാനിച്ചു" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "തകരാറുളള ഒബ്ജക്ട്" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "ആന്തരിക പിശക് അല്ലെങ്കില്‍ തകരാറുളള ഒബ്ജക്ട്" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "ആവശ്യമായ മെമ്മറി ലഭ്യമല്ല" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "ബാക്ക്ട്രാക്കിങ് പരിധി എത്തിയിരിക്കുന്നു" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "പാറ്‍ഷ്യല്‍ മാച്ചിങിന് പിന്തുണ ലഭ്യമല്ലാത്ത വസ്തുക്കള്‍ ഈ മാതൃകയിലുണ്ട്" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "ആന്തരിക പിശക്" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "പാറ്‍ഷ്യല്‍ മാച്ചിങിനുളള പിന്തുണ ലഭ്യമല്ലാത്തതിനാല്‍ ബാക്ക് റിഫറന്‍സുകള്‍" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "റിക്കേറ്‍ഷന്‍ പരിധി എത്തിയിരിക്കുന്നു" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "ശൂന്യമായ സബ് സ്ട്രിങ്ങളുകള്‍ക്കുളള പണിയിടത്തിനുളള പരിധി എത്തിയിരിക്കുന്നു" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "ന്യൂലൈന്‍ ഫ്ളാഗുകളുടെ അസാധുവായ കൂട്ടായ്മ" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "അപരിചിതമായ പിശക്" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "മാതൃകയുടെ അവസാനം \\" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "മാതൃകയുടെ അവസാനം \\c" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "\\-ന് ശേഷം അപരിചിതമായ അക്ഷരം" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "കെയിസ്-ചെഞ്ചിങ് എസ്കേപ്പുകള്‍ (\\l, \\L, \\u, \\U) ഇവിടെ അനുവദിക്കുന്നതല്ല" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "{} ക്വാണ്ടിഫയറില്‍ നമ്പറുകള്‍ ക്രമത്തിലല്ല" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "{} ക്വാണ്ടിഫയറില്‍ നമ്പര്‍ വളരെ വലുതാണു്" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സിന് അവസാനമുള്ള ] ലഭ്യമല്ല" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സില്‍ തെറ്റായ എസ്കേപ്പ് സീക്വന്‍സ്" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "ക്യാരക്ടര്‍ ക്ലാസ്സില്‍ പരിധി പുറത്ത് കടക്കുന്നു" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "ആവര്‍ത്തനത്തിന്റെ ആവശ്യകതയില്ല" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "(?-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "(?<-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "(?P-ന് ശേഷം അപരിചിതമായ ക്യാരക്ടര്‍" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX named ക്ലാസ്സുകള്‍ക്കു് ഒരു ക്ലാസ്സില്‍ മാത്രമേ പിന്തുണ ലഭ്യമുള്ളൂ" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "അവസാനത്തിലുള്ള ) ലഭ്യമല്ല" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R അല്ലെങ്കില്‍ (?[+-]digits എന്നിവയ്ക്ക് ശേഷം ) ഉണ്ടായിരിക്കണം" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "നിലവിലില്ലാത്ത ഉപമാതൃകയ്ക്കുള്ള സൂചന" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "കമന്റിന് ശേഷം ) ലഭ്യമല്ല" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "റെഗുലര്‍ എക്സ്പ്രെഷന്‍ വളരെ വലുതാണു്" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "മെമ്മറി ലഭ്യമാക്കുന്നതില്‍ പരാജയം" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind അസേര്‍ഷന്റെ വ്യാപ്തി സ്ഥിരമല്ല" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "(?(-ന് ശേഷം തെറ്റായ അക്കം അല്ലെങ്കില്‍ പേര്" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "കണ്ടീഷനല്‍ ഗ്രൂപ്പില്‍ രണ്ടു് ബ്രാഞ്ചില്‍ കൂടുതലുണ്ടു്" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "(?(-നു് ശേഷം അസേര്‍ഷന്‍ പ്രതീക്ഷിക്കുന്നു" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "അപരിചിതമായ പോസിക്സ് ക്ലാസ്സ് നാമം" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX കോളേറ്റിങ് എലമെന്റുകള്‍ക്കുള്ള പിന്തുണ ലഭ്യമല്ല" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...}-ലുള്ള അക്ഷര മൂല്ല്യം വളരെ വലുതു്" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "തെറ്റായ അവസ്ഥ (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C not allowed in lookbehind assertion" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "റിക്കേര്‍സീവ് കോള്‍ ലൂപില്‍ അനിശ്ചിതമായി പ്രവര്‍ത്തിക്കുന്നു" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "ഉപമാതൃകയുടെ പേരില്‍ ടെര്‍മിനേറ്റര്‍ ലഭ്യമല്ല" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "രണ്ടു് named ഉപമാതൃകകള്‍ക്കു് ഒരേ പേരു്" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "തെറ്റായ \\P അല്ലെങ്കില്‍ \\p ക്രമം" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "അപരിചിതമായ വിശേഷത നാമം \\P അല്ലെങ്കില്‍ \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ഉപമാതൃക നാമം വളരെ വലുതാണു് (കൂടിയതു് 32 അക്ഷരങ്ങള്‍)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "അവനധി named ഉപമാതൃകകള്‍ (കൂടിയാല്‍ 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "ഒക്ടല്‍ മൂല്ല്യം \\377-നേക്കാള്‍ വലുതാകുന്നു" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ഗ്രൂപ്പില്‍ ഒന്നില്‍ കൂടുതല്‍ ബ്രാഞ്ചുകളുണ്ടു്" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "ഒരു DEFINE ഗ്രൂപ്പ്" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "സ്ഥിരതയില്ലാത്ത NEWLINE ഉപാധികള്‍" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "അപ്രതീക്ഷിതമായ ആവര്‍ത്തനം" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "കോഡ് ഓവര്‍ഫ്ലോ" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "overran compiling workspace" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "മുമ്പു് പരിശോധിച്ചിട്ടുള്ള സൂചന ഉപമാതൃകകള്‍ ലഭ്യമല്ല" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "സാധാരണ എക്സ്പ്രെഷന്‍ ആയ %s-നൊപ്പം പൊരുത്തപ്പെടുത്തുമ്പോള്‍ പിശക്: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "UTF8 പിന്തുണ ഇല്ലാതെയാണ് PCRE ലൈബ്ററി സംഗ്റഹിച്ചിരിക്കുന്നത്" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "UTF8 ഗുണഗണങ്ങളുടെ പിന്തുണ ഇല്ലാതെയാണ് PCRE ലൈബ്ററി സംഗ്റഹിച്ചിരിക്കുന്നത്" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "സാധാരണ എക്സ്പ്രെഷന്‍ ആയ %s കംപൈല്‍ ചെയ്യുമ്പോള്‍ %d എന്ന അക്ഷരത്തില്‍ പിശക് : %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s എന്ന സാധാരണ എക്സ്പ്രെഷന്‍ കൈകാര്യം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "ഹെക്സാ ഡെസിമല്‍ അക്കം അല്ലെങ്കില്‍ '}' ആവശ്യമുണ്ട് " + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "ഹെക്സാ ഡെസിമല്‍ അക്കം ആവശ്യമുണ്ട്" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "സിംപോളിക് സൂചനയില്‍ '<' ലഭ്യമല്ല" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "പൂര്‍ണ്ണമാകാത്ത സിംപോളിക് സൂചനാ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "zero-length symbolic reference" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "അക്കം ആവശ്യമുണ്ട്" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "തെറ്റായ സിംപോളിക് സൂചനാ" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "stray final '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "അപരിചിതമായ എസ്കേപ്പ് സീക്വന്‍സ്" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "പകരമായുളള ടെക്സ്റ്റ് ആയ \"%s\" %lu-ല്‍ പാഴ്സ് ചെയ്യുന്നതിനിടയില്‍ പിശക്: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "എടുത്ത് കാണിക്കുന്ന ടെസ്റ്റിന്റെ ആരംഭത്തില്‍ കൊട്ടേഷന്‍ മാറ്‍ക്ക് ലഭ്യമല്ല" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "കമാന്‍ഡ് ലൈന്‍ അല്ലെങ്കില്‍ മറ്റ് ഷെല്‍-കോട്ടട് ടെക്സ്റ്റില്‍ ചേറ്‍ച്ചയില്ലാത്ത അടയാളം" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' അക്ഷരത്തിന് ശേഷം ഉടന്‍ തന്നെ വാചകം അവസാനിച്ചു. ('%s' ആയിരുന്നു വാചകം)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c-ന്റെ അവസാനം കോട്ട് ഇട്ടിട്ടില്ല. ('%s' ആണ് ടെക്സ്റ്റ്)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "വാചകം ശൂന്യമായിരുന്നു (അല്ലെങ്കില്‍ ഇതില്‍ വയിറ്റ് സ്പെയിസ് മാത്രമേ ഉളളൂ)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയുമായി ബന്ധപ്പെടുന്നതിനുളള പൈപ്പ് ഉണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ചൈള്‍ഡ് പൈപ്പില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "ഡയറക്ടറി '%s'-ലേക്ക് മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "അസാധുവായ പ്രോഗ്രാം നാമം: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d-ല്‍ ആര്‍ഗ്യുമെന്റ് വെക്റ്ററില്‍ അസാധുവായ സ്ട്രിങ്: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "എന്‍വിറോണ്‍മെന്റില്‍ അസാധുവായ സ്ട്രിങ്: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "പ്രവര്‍ത്തിക്കുന്ന ഡയറക്ടറി അസാധുവാണ്: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "സഹായത്തിനുളള പ്രോഗ്രാം പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും ഡേറ്റാ വായിക്കുമ്പോള്‍ g_io_channel_win32_poll()-ല്‍ " +"അപ്രതീക്ഷിതമായ പിശക് " + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയില്‍ നിന്നും വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"ചൈള്‍ഡ് പ്രക്രിയയില്‍ (%s) നിന്നും ഡേറ്റാ വായിക്കുമ്പോള്‍ select()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് " + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()-ല്‍ അപ്രതീക്ഷിതമായ പിശക് (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" (%s) പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു " + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയയുടെ ഔട്ട് പുട്ട് അല്ലെങ്കില്‍ ഇന്‍പുട്ട് തിരിച്ച് വിടുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ fork ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ചൈള്‍ഡ് പ്രക്രിയ \"%s\" പ്രവര്‍ത്തിപ്പിക്കുന്നതില്‍ അപ്രതീക്ഷിതമായ പിശക്" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ചൈള്‍ഡ് pid പൈപ്പിന്‍ നിന്നും ആവശ്യത്തിനുളള ഡേറ്റാ വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "ഇന്‍പുട്ട് വേര്‍തിരിക്കുന്നതില്‍ അസാധുവായ ക്രമം" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 പരിധിയില്‍ നിന്നും പുറത്താണ് അക്ഷരം" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "ഉപയോഗിക്കേണ്ട വിധം:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "സഹായ ഉപാധികള്‍:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "സഹായ ഉപാധികള്‍ കാണിക്കുക" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "എല്ലാ സഹായ ഉപാധികളും കാണിക്കുക" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "പ്രയോഗത്തിനുളള ഉപാധികള്‍:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s-ന് വേണ്ടി ഇന്റിജര്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s-ന് വേണ്ടിയുളള ഇന്റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%s-ന് വേണ്ടി ഡബിള്‍ മൂല്ല്യം '%s' പാഴ്സ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%s-ന് വേണ്ടിയുളള ഡബിള്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്താണ്" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "%s ഉപാധി പാഴ്സ് ചെയ്യുന്നതില്‍ പിശക്" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s-നുളള ആര്‍ഗ്യുമെന്റ് ലഭ്യമല്ല" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "അപരിചിതമായ ഉപാധി %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "തിരച്ചില്‍ നടത്തിയ ഡയറക്ടറികളില്‍ സാധുതയുളള കീ ഫയല്‍ ലഭ്യമല്ല" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "ഒരു സാധാരണ ഫയല്‍ അല്ല" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "ഫയല്‍ ശൂന്യമാണ്" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"കീ ഫയലില്‍ ഉളള '%s' എന്ന വരി ഒരു കീ-മൂല്ല്യം ജോടി അല്ലെങ്കില്‍ ഒരു ഗ്റൂപ്പോ അഭിപ്റായമോ അല്ല" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "അസാധുവായ ഗ്രൂപ്പ് നാമം: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "കീ ഫയല്‍ ആരംഭിക്കുന്നത് ഒരു ഗ്രൂപ്പിലല്ല" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "അസാധുവായ കീ നാമം: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "പിന്തുണയ്ക്കാത്ത രഹസ്യ ഭാഷ '%s' കീ ഫയല്‍ പിന്തുണയ്ക്കുന്നു" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "കീ ഫയലിന് '%s' എന്ന ഗ്രൂപ്പില്ല" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "കീ ഫയലിന് '%s' എന്ന കീയില്ല" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "UTF-8 അല്ലാത്ത '%s' മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s' കീ ഫയലിലുണ്ട്." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "തിരിച്ചറിയുവാന്‍ കഴിയാത്ത മൂല്ല്യമുളള കീ '%s', '%s' എന്ന ഗ്രൂപ്പില്‍ കീ ഫയലിലുണ്ട്." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ഗ്രൂപ്പ് '%s'-ല്‍ കീ ഫയലിന് കീ '%s' ലഭ്യമല്ല" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "കീ ഫയലിന്റെ വരിയുടെ അവസാനം എസ്കെയിപ്പ് അക്ഷരം ലഭ്യമാണ്" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "കീ ഫയലില്‍ അസാധുവായ എസ്കെയിപ്പ് സീക്വന്‍സ് '%s' ലഭ്യമാണ്" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "മൂല്ല്യം '%s' ഒരു അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ഇന്റിജര്‍ മൂല്ല്യം '%s' പരിധിയ്ക്ക് പുറത്ത്" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "മൂല്ല്യം '%s' ഒരു ഫ്ളോട്ട് അക്കമായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "മൂല്ല്യം '%s' ഒരു ബൂളിയനായി കണക്കാക്കുവാന്‍ സാധ്യമല്ല." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "വളരെ വലിയ കൌണ്ട് മൂല്ല്യം %s-നു് നല്‍കിയിരിക്കുന്നു" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "സ്ട്രീം നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "പ്രക്രിയ റദ്ദാക്കിയിരിക്കുന്നു" + +#: ../gio/gcharsetconverter.c:263 +#, fuzzy +msgid "Invalid object, not initialized" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിച്ചിട്ടില്ല" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "മാറ്റം വരുത്തുന്ന ഇന്‍പുട്ടില്‍ തെറ്റായ ബൈറ്റ് ക്രമം" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +#, fuzzy +msgid "Not enough space in destination" +msgstr "സോക്കറ്റ് വിലാസത്തിനു് ആവശ്യമുള്ള സ്ഥലം ലഭ്യമല്ല" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s തരത്തിലുള്ള" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "end-of-stream അപ്രതീക്ഷിതമായി സമയത്തിനു് മുമ്പു്" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "പിന്തുണയില്ലാത്ത സോക്കറ്റ് വിലാസം" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക്: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "അപരിചിതമായ തരത്തിലുള്ളത്" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "ഡയറക്ടറി '%s' തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "ഡയറക്ടറി ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "%s വായിക്കുന്നതില്‍‌ പരാജയം : %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ഫയല്‍ അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "ചേര്‍ത്തിരിക്കുന്ന സോക്കറ്റ് അടച്ചിരിക്കുന്നു" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "ലിസണര്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "ചവറ്റുകുട്ട പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "വരി %d-ല്‍ പിശക്: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s ഉപാധി പാഴ്സ് ചെയ്യുന്നതില്‍ പിശക്" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "കണക്ഷന്‍ പുരോഗതിയില്‍" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "കണക്ഷന്‍ പുരോഗതിയില്‍" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക് : %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' തെറ്റായ നാമം ആകുന്നു" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%s ഉപാധി പാഴ്സ് ചെയ്യുന്നതില്‍ പിശക്" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "കണക്ഷന്‍ സ്വീകരിക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "ഡയറക്ടറി '%s' തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "തകരാറുളള ഒബ്ജക്ട്" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "പേരിടാത്ത" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "പണിയിട ഫയല്‍ Exec ഫീള്‍ഡ് വ്യക്തമാക്കിയിട്ടില്ല" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "പ്രയോഗത്തിനു് ആവശ്യമായ ടെര്‍മിനല്‍ ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ഉപയോക്താവിനു് പ്രയോഗത്തിനുള്ള ക്രമീകരണ ഫോള്‍ഡര്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ഉപയോക്താവിനുള്ള MIME ക്രമികരണ ഫയല്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ഉപയോക്താവിനുള്ള ഡസ്ക്ടോപ്പ് ഫയല്‍ %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "യഥേഷ്ടം %s നിഷ്കര്‍ഷിക്കുക" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "ഡ്രൈവര്‍ start അനുവദിക്കുന്നതില്ല" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "ഡ്രൈവര്‍ stop അനുവദിക്കുന്നതില്ല" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem എന്‍കോഡിങിലുള്ള തെറ്റായ ടോക്കനുകളുടെ എണ്ണം (%d)" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon എന്‍കോഡിങിലുള്ള തെറ്റായ ടോക്കനുകളുടെ എണ്ണം (%d)" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon-നു് ഒരു GEmblem പ്രതീക്ഷിച്ചു" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "മൌണ്ട് ലഭ്യമല്ല" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "ഡയറക്ടറിയില്‍ പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "ഒരു ഡയറക്ടറിയില്‍ മറ്റൊരു ഡയറക്ടറി പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ നിലവിലുണ്ട്" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "ആവര്‍ത്തിച്ച് ഡയറക്ടറി പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "സിബോളിക്ക് ലിങ്ക് പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "ഫയല്‍ തുറക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "പ്രത്യേക ഫയല്‍ പകര്‍ത്തുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "തെറ്റായ symlink മൂല്ല്യം" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "ചവറ്റുകുട്ട പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ഫയലിന്റെ പേരില്‍ '%c' ഉണ്ടാകുവാന്‍ പാടില്ല" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "വോള്യം മൌണ്ടിനെ ലഭ്യമാക്കുന്നില്ല" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "ഈ ഫയല്‍ കൈകാര്യം ചെയ്യുന്നതിനായി ഒരു പ്രയോഗവും രജിസ്ടര്‍ ചെയ്തിട്ടില്ല" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "എന്യൂമറേറ്റര്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "ഫയല്‍ എന്യൂമറേറ്റര്‍ നന്നായി പ്രവര്‍ത്തിക്കുന്നു" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "ഫയല്‍ എന്യൂമറേറ്റര്‍ നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon എന്‍കോഡിങിനുള്ള പതിപ്പു് %d കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon-നില്‍ തെറ്റായ ഡേറ്റാ" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "സ്ട്രീം query_info പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "സ്ട്രീമില്‍ Seek പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "ഇന്‍പുട്ട് സ്ട്രീമില്‍ Truncate അനുവദിക്കുന്നില്ല" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "സ്ട്രീമില്‍ Truncate അനുവദിക്കുന്നില്ല" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "തെറ്റായ ടോക്കന്റെ എണ്ണം (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "%s എന്ന ക്ലാസ് നാമത്തിനു് ഏതു് തരം എന്നു് ലഭ്യമല്ല" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s തരത്തിലുള്ളതു് GIcon ഇന്റര്‍ഫെയിസ് ലഭ്യമാക്കുന്നില്ല" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "തെറ്റായ പതിപ്പു്: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "GIcon ഇന്റര്‍ഫെയിസില്‍ %s തരത്തിലുള്ളവ from_tokens() ലഭ്യമാക്കുന്നില്ല" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ലഭ്യമാക്കിയ ചിഹ്നം എന്‍കോഡിങിന്റെ പതിപ്പ് കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "സ്ട്രീമില്‍ തെറ്റായ പ്രക്രിയ" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "സോക്കറ്റ് വിലാസത്തിനു് ആവശ്യമുള്ള സ്ഥലം ലഭ്യമല്ല" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "പിന്തുണയില്ലാത്ത സോക്കറ്റ് വിലാസം" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "ചവറ്റുകുട്ട പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "തെറ്റായ ആട്രിബ്യൂട്ട് തരം (സ്ട്രിങ് പ്രതീക്ഷിച്ചു)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "സ്വതവേയുള്ള ലോക്കല്‍ ഡയറക്ടറി തരത്തിലുള്ള മോണിറ്റര്‍ ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "തെറ്റായ ഫയല്‍ നാമം %s " + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ഫയല്‍സിസ്റ്റം വിവരം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "റൂട്ട് ഡയറക്ടറിയുടെ പേര് മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "ഫയലിന്റെ പേര് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "ഫയലിന്റെ പേര് മാറ്റുവാന്‍ സാധ്യമല്ല, കാരണം ഈ പേര് നിലവിലുണ്ട്" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "തെറ്റായ ഫയല്‍നാമം" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "ഫയല്‍ തുറക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "ഡയറക്ടറി തുറക്കുവാന്‍ സാധ്യമല്ല" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "ഫയല്‍ ചവറ്റുകുട്ടയിലേക്കു് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ഡയറക്ടറി %s ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ടോപ് ലവല്‍ ഡയറക്ടറി ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "ചവറ്റുകുട്ടയ്ക്കുള്ള ഡയറക്ടറി ഉണ്ടാക്കുവാനോ ലഭ്യമാക്കുവാനോ സാധ്യമായില്ല" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "വിവരങ്ങള്‍ സംബന്ധിച്ചുള്ള ഫയല്‍ ഉണ്ടാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ഫയല്‍ ചവറ്റുകുട്ടയിലേക്ക് നീക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "ഡയറക്ടറി ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "സിബോളിക്ക് ലിങ്ക് '%s' വായിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "സിംബോളിക് ലിങ്ക് ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "ഫയല്‍ നീക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "ഒരു ഡയറക്ടറിയില്‍ മറ്റൊരു ഡയറക്ടറി നീക്കുവാന്‍ സാധ്യമല്ല" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "ബാക്കപ്പ് ഫയല്‍ ഉണ്ടാക്കുന്നതില്‍ പരാജയം" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "മൌണ്ട് പോയിന്റുകളില്‍ തമ്മില്‍ നീക്കം ചെയ്യുന്നതില്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "ആട്രിബ്യൂട്ട് മൂല്ല്യം non-NULL ആയിരിക്കണം" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "തെറ്റായ ആട്രിബ്യൂട്ട് തരം (സ്ട്രിങ് പ്രതീക്ഷിച്ചു)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "തെറ്റായ എക്സ്റ്റെന്‍ഡട് ആട്രിബ്യൂട്ട് നാമം" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "എക്സ്റ്റെന്‍ഡട് ആട്രിബ്യൂട്ട് ആയ '%s' ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' എന്ന ഫയല്‍ സ്റ്റാറ്റ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (തെറ്റായ എന്‍കോഡിങ്)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "ഫയല്‍ വിശദീകരണ സംവിധാനം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (uint32 പ്രതീക്ഷിച്ച)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (uint64 പ്രതീക്ഷിച്ച)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "തെറ്റായ തരത്തിലുള്ള വിശേഷത (ബൈറ്റ് സ്ട്രിങ് പ്രതീക്ഷിച്ച)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "സിംലിങ്കുകള്‍ക്കുള്ള അനുമതികള്‍ സജ്ജമാക്കുവാന്‍ സാധ്യമല്ല" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "അനുവാദങ്ങള്‍ ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "ഉടമസ്ഥനെ ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "സിംലിങ്ക് non-NULL ആയിരിക്കണം" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "സിംലിങ്ക് ക്രമികരിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink സജ്ജീകരണത്തില്‍ പിശക്: ഫയല്‍ ഒരു symlink അല്ല" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "മാറ്റങ്ങള്‍ അല്ലെങ്കില്‍ ആക്സസ് സമയം സജ്ജമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux കോണ്‍ടെക്സ്റ്റ് non-NULL ആയിരിക്കണം" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux കോണ്‍ടെക്സ്റ്റ് സജ്ജാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ഈ സിസ്റ്റത്തില്‍ സജ്ജമല്ല" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s ആട്രിബ്യൂട്ട് ക്രമികരണം പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "ഫയലില്‍ നിന്നും വായിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ഫയലില്‍ തിരയുന്നതില്‍ പിശക് : %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ഫയല്‍ അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "സ്വതവേയുള്ള ലോക്കല്‍ ഫയല്‍ മോണിറ്റര്‍ തരത്തിലുള്ളതു് ലഭ്യമാക്കുവാന്‍ സാധിച്ചില്ല" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "പഴയ ബാക്കപ്പിലേക്കുള്ള ലിങ്ക് നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ബാക്കപ്പ് പകര്‍പ്പ് ഉണ്ടാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "താല്‍ക്കാലിക ഫയലിന്റെ പേര് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "ഫയല്‍ ട്രങ്‌കേറ്റ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ഫയല്‍ തുറക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ ഒരു ഡയറക്ടറി ആകുന്നു" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "ലക്ഷ്യസ്ഥാനത്തുള്ള ഫയല്‍ ഒരു സാധാരണ ഫയല്‍ അല്ല" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "ഫയല്‍ പുറമേ നിന്നും മാറ്റം വരുത്തിയിരിക്കുന്നു" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "പഴയ ഫയല്‍ നീക്കം ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "തെറ്റായ GSeekType നല്‍കിയിരിക്കുന്നു" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "തെറ്റായ seek ആവശ്യപ്പെട്ടിരിക്കുന്നു" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ട്രങ്‌കേറ്റ് ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "മെമ്മറി ഔട്ട്പുട്ട് സ്ട്രീമിന്റെ വ്യാപ്തി മാറ്റുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "മെമ്മറി ഔട്ട്പുട്ട് സ്ട്രീമിന്റെ വ്യാപ്തി മാറ്റുന്നതില്‍ പരാജയം" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount doesn't implement synchronous content type guessing" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ഹോസ്റ്റ്നെയിം '%s'-ല്‍ '[' but not ']' അടങ്ങുന്നു" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "ഔട്ട്പുട്ട് സ്ട്രീം റൈറ്റ് ലഭ്യമാക്കുന്നില്ല" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "സോഴ്സ് സ്ട്രീം നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'പരിഹരിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "റിവേഴ്സ്-റിസോള്‍വിങ് '%s'-ല്‍ പിശക്: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s'-നു് സര്‍വീസ് റിക്കോര്‍ഡ് ലഭ്യമല്ല" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' പരിഹരിക്കുന്നതിനു് താല്‍ക്കാലം സാധ്യമല്ല" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' പരിഹരിക്കുന്നതില്‍ പിശക്" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "അപരിചിതമായ ഉപാധി %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിച്ചിട്ടില്ല" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "തെറ്റായ സോക്കറ്റ്, ആരംഭിക്കാത്തിതിനുള്ള കാരണം: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "സോക്കറ്റ് നിലവില്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd-ല്‍ നിന്നും GSocket ഉണ്ടാക്കുന്നു: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "സോക്കറ്റ് ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "അപരിചിതമായ കീഴ്വഴക്കം നല്‍കിയിരിക്കുന്നു" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "ലോക്കല്‍ വിലാസം ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "റിമോട്ട് വിലാസം ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "ശ്രദ്ധിക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "വിലാസത്തിലേക്ക് ബൈന്‍ഡ് ചെയ്യുന്നതില്‍ പിശക്: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "കണക്ഷന്‍ സ്വീകരിക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക്: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "കണക്ഷന്‍ പുരോഗതിയില്‍" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "കണക്ട് ചെയ്യുന്നതില്‍ പിശക് : %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ബാക്കിയുള്ള പിശക് ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "ഡേറ്റാ ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "ഡേറ്റാ അയയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "സോക്കറ്റ് ഉണ്ടാക്കുവാന്‍ സാധ്യമല്ല: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "സോക്കറ്റ് അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "സോക്കറ്റ് അവസ്ഥയ്ക്കായി കാത്തിരിക്കുന്നു: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "സന്ദേശം അയയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage വിന്‍ഡോസില്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "സന്ദേശം ലഭിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "കണക്ട് ചെയ്യുമ്പോള്‍ അപരിചിതമായ പിശക്" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "ലിസണര്‍ അടച്ചിരിക്കുന്നു" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ചേര്‍ത്തിരിക്കുന്ന സോക്കറ്റ് അടച്ചിരിക്കുന്നു" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon എന്‍കോഡിങിനുള്ള %d പതിപ്പു് കൈകാര്യം ചെയ്യുവാന്‍ സാധ്യമല്ല" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 നിയന്ത്രണ സന്ദേശം പ്രതീക്ഷിക്കുന്നു, %d ലഭിച്ചിരിക്കുന്നു" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "അപ്രതീക്ഷിതമായ രീതിയിലുള്ള ആന്‍സിലിയറി ഡേറ്റാ" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ഒരു fd പ്രതീക്ഷിക്കുന്നു, പക്ഷേ %d ലഭിച്ചിരിക്കുന്നു\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "തെറ്റായ fd ലഭിച്ചിരിക്കുന്നു" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "ഡേറ്റാ അയയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "ഫയലിന്റെ പേര് മാറ്റുന്നതില്‍ പിശക്: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "1 നിയന്ത്രണ സന്ദേശം പ്രതീക്ഷിക്കുന്നു, %d ലഭിച്ചിരിക്കുന്നു" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "യൂണിക്സില്‍ നിന്നും ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "യൂണിക്സ് അടയ്ക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "ഫയല്‍സിസ്റ്റം റൂട്ട്" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "യൂണിക്സിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ഈ സിസ്റ്റമില്‍ അബ്സ്ട്രാക്ട് യൂണിക്സ് ഡൊമെയിന്‍ സോക്കറ്റ് വിലാസങ്ങള്‍ പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "വോള്യം പുറത്തിറക്കല്‍ eject അല്ലെങ്കില്‍ eject_with_operation അനുവദിക്കുന്നില്ല" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "പ്രയോഗം ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "പ്രയോഗം ലഭ്യമാക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "യുആര്‍ഐ പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "win32-ല്‍ അസോസിയേഷന്‍ സൃഷ്ടി പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "win32-ല്‍ അസോസിയേഷന്‍ സൃഷ്ടി പിന്തുണയ്ക്കുന്നില്ല" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "ഫയലില്‍ നിന്നും വായിക്കുന്നതില്‍ പിശക്: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "ഫയല്‍ അടയ്ക്കുന്നതില്‍ പിശക് : %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "ഫയലിലേക്ക് എഴുതുന്നതില്‍ പിശക്: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "ആവശ്യമായ മെമ്മറി ലഭ്യമല്ല" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "ആന്തരിക പിശക്" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "സാധുതയില്ലാത്ത ഹോസ്റ്റ് നാമം" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ഒരു ഡയറക്ടറിയില്‍ മറ്റൊരു ഡയറക്ടറി നീക്കുവാന്‍ സാധ്യമല്ല" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "%s തരത്തിലുള്ളതു് ക്ലാസ്സ് ചെയ്തിട്ടില്ല" + +#, 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.po b/po/mn.po new file mode 100644 index 0000000..2ea2867 --- /dev/null +++ b/po/mn.po @@ -0,0 +1,3855 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-05-30 01:07-0800\n" +"Last-Translator: Бадрал \n" +"Language-Team: Mongolian \n" +"Language: mn\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:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« " +"хүлээгдэж байна" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Тэмдэгт олонлог »%s« ээс »%s« рүү хөрвүүлэх дэмжигдээгүй байна" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "»%s« ээс »%s« рүү хөрвүүлэгч нээгдсэнгүй" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Оролтын төгсгөлд хагас тэмдэгтийн дараалал" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "»%s« ухарч »%s« кодчилол руу хөрвөхгүй байна" + +# CHECK +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI »%s« нь файл схемд хэрэглэгддэг үнэмлэхүй хаяг биш" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Дотоод URI »%s« нь »#« -г агуулж болохгүй" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "»%s« URI хүчингүй" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI »%s« -н хостын нэр хүчингүй" + +# CHECK +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "»%s« URI хүчингүй Escape-тэмдэгт агуулж байна" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "»%s« замын нэр үнэмлэхүй зам биш" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Хүчингүй хостын нэр" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y %b %d, %a %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Y.%m.%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Хулгана сарын" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Үхэр сарын" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Бар сарын" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Туулай сарын" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Луу сарын" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Могой сарын" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Морь сарын" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Хул" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Үхэ" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Бар" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Туу" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Луу" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Мог" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Мор" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Даваа" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Мягмар" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Лхагва" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Пүрэв" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Баасан" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Бямба" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Ням" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Да" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Мя" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Лх" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Пү" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Ба" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Бя" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ня" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "»%s« файлаас уншиж болохгүй байна: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "»%s« файл нээгдэхгүй байна: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "»%s« файлын аттрибут тодорхойлогдсонгүй: fstat() нурлаа: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:862 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../glib/gfileutils.c:918 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "»%s« хэв хүчингүй, »%s« -г агуулах хэрэггүй" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "»%s« хэв XXXXXX -р төгсөхгүй байна" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "»%s« файл нээгдэхгүй байна: fdopen() нурлаа: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Хүчингүй UTF-8-р кодлогдсон текст" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "»%-.*s« тэмдэгт холбоос зөвшөөрөгдөөгүй тэмдэгтээр кодлогдсон байна" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Хоосон абт »&;« олдлоо; хүчинтэй абтууд & " < > ' юм. " +"(абт=аский биш тэмдэгт)" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Абтын нэр »%s« тодорхойгүй" + +# CHECK +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Баримт ямар нэгэн элементээр эхлэх ёстой (Ж.нь )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"»%s« нь »<«-тэмдэгтийн арын хүчингүй тэмдэгт; Энэ нь элементийн нэрээр эхэлж " +"болохгүй." + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн эхлэлийн тагийг хаахад »>« тэмдэгт дутуу " +"байна" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Сонин тэмдэгт »%s«, »%s« элементийн »%s« аттрибутын нэрийн дараа »=« " +"хүлээгдэж байна" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"»%s« хүчингүй тэмдэгт, хэрвээ энэ нь хааж буй »%s« элементийн нэрийн ард " +"байгаа бол; »>« тэмдэгт хүчинтэй" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "»%s« элемент хаагдсан, Одоогоор ямарч элемент нээлттэй бус байна" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "»%s« элемент хаагдсан, харин одоогоор »%s« элемент нээлттэй байна" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Баримт хоосон эсвэл зүгээр цагаан зай агуулж байна" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Баримт нээлттэй өнцөгтэй хаалт »<« -н дараа гэнэт төгсөв" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Баримт нээлттэй элементүүдтэйгээр гэнэтийн байдлаар төгсөв - »%s« сүүлчийн " +"нээлттэй элемент нь" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Баримт гэнэтийн байдлаар төгсөв, таг <%s/> -г хаах өнцөгтэй хаалт " +"»>«хүлээгдэж байна" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Баримт нэгэн элементийн нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Баримт нэгэн аттрибут нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Баримт нээгдэж буй тагийн нэгэн элементийн нэрийн дотор гэнэтийн байдлаар " +"төгсөв." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Баримт аттрибут нэрийн дараах тэнцүүгийн тэмдэгийн дараа гэнэтийн байдлаар " +"төгсөв; аттрибутын утга алга" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Баримт нэгэн аттрибутын утгын дотор гэнэтийн байдлаар төгсөв" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Баримт гэнэтийн байдлаар нэгэн хаагдаж буй »%s« элементийн тагийн дотор " +"төгсөв" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Баримт тайлбар эсвэл заавар боловсруулалтын дотор гэнэтийн байдлаар төгсөв" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Суваг тал тэмдэгтээр төгслөө" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Төгсгөлгүй тэмдэгт холбоос" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%d мөрөнд %d тэмдэгт алдаатай байна: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Төгсгөлгүй абт холбоос" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Хашилтан доторхи текст хашилтаар эхлэхгүй" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Тушаалын мөр дэх эсвэл өөр shell-quoted текст доторхи хашилтын тоо " +"балансжаагүй байна" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст »\\«-тэмдэгтийн дараа төгслөө. (Текст »%s« байсан)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "Текст %c -н тохирох хашилт олдохоос өмнө төгслөө. (Текст »%s« байсан)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст хоосон байв (эсвэл зөвхөн цагаан зай агуулсан)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Өгөгдөл хүү процессоор уншигдсангүй" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процесстой (%s) холбогдох шугам үүсгэж чадсангүй" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) шугамаас унших бүтэлгүйтлээ" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "»%s« (%s) лавлах солигдсонгүй" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процесс ажилласангүй (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Хүчингүй хостын нэр" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Тусламж программ ажиллахгүй байна" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Ð¥Ò¯Ò¯ процессоос өгөгдөл уншиж байхад g_io_channel_win32_poll() дотор " +"санамсаргүй алдаа гарлаа" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) өгөгдөл уншигдсаж чадсангүй" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Ð¥Ò¯Ò¯ процессоос (%s) өгөгдөл уншиж байхад select() дотор санамсаргүй алдаа " +"гарлаа" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Санамсаргүй алдаа waitpid() дотор (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Салаалалт нурлаа (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ð¥Ò¯Ò¯ процесс »%s« -г ажиллуулах нурлаа (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессийн (%s) гаралт эсвэл оролтыг солих нурлаа" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ð¥Ò¯Ò¯ процессын (%s) салаалалт нурлаа" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "»%s« хүү процессыг ажиллуулж байхад тодорхойгүй алдаа" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Ð¥Ò¯Ò¯ процессын процессын дугаарын шугамаас (%s) хангалттай өгөгдөл уншиж " +"чадсангүй" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 хязгаараас гаднах тэмдэгт" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй дараалал" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 хязгаараас гаднах тэмдэгт" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Хэрэглээ:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Тусламж:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Тусламж харуулах" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Бүх тусламж харуулах" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Програм:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: ../glib/goption.c:1032 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' бүхэл тоог --%s -н хувьд шинжлэх боломжгүй" + +#: ../glib/goption.c:1040 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Тодорхойгүй утга %s" + +#: ../glib/gkeyfile.c:366 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Өгөгдлийн лавлахаас хүчинтэй утга олдсонгүй" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Тохиромжгүй файл" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Файл хоосон" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Түлхүүр файл түлхүүр утга, бүлэг, эсвэл тайлбаргүй '%s' мөр агуулж байна." + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Хүчингүй хостын нэр" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Түлхүүр файл бүлэг утгаар эхлэх боломжгүй" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Хүчингүй хостын нэр" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Түлхүүр файлд дэмжигдээгүй кодчилол '%s' байна" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Түлхүүр файлд '%s' бүлэг алга" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Түлхүүр файлд '%s' түлхүүр алга" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Түлхүүр файлд '%s' мөр '%s' гэсэн UTF-8 бус утгатай байна" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "Түлхүүр файлд илэрхийлэх боломжгүй '%s' утга байна." + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Түлхүүр файлд илэрхийлэх боломжгүй '%s' утга байна." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Түлхүүр файлын '%2$s' бүлэгт '%1$s' түлхүүр алга" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "Түлхүүр файлын мөрийн төгсгөлд ESC тэмдэгт байна" + +# CHECK +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Түлхүүр файлд »%s« хүчингүй escape-тэмдэгт байна" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй." + +#: ../glib/gkeyfile.c:3886 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' бүхэл %s -н хувьд хязгаараас хальжээ" + +#: ../glib/gkeyfile.c:3919 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' утга бүхэл тоогоор илэрхийлэгдэх боломжгүй." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' утга бүүл утгаар дүрслэгдэх боломжгүй ." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Хөрвүүлэлтийн оролтод хүчингүй байт дараалал байна" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Тодорхойгүй утга %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%d мөрөнд алдаа: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "»%s« тэмдэгт абтын нэрэнд хүчингүй" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "»%s« тэмдэгт абтын нэрэнд хүчингүй" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "»%s« тэмдэгт абтын нэрэнд хүчингүй" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Хүчингүй хостын нэр" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Хүчингүй хостын нэр" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "»%s« символик холбоос уншигдсангүй: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Баримт нэгэн аттрибут нэрийн дотор гэнэтийн байдлаар төгсөв" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "»%s« лавлахыг нээхэд алдаа: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Тохиромжгүй файл" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Хүчингүй хостын нэр" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Тодорхойгүй утга %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "%lu байтуудыг »%s« файлыг уншихдаа байрлуулж чадсангүй" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "»%s« файл үүсгэгдсэнгүй: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d мөрөнд алдаа: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Хөрвүүлж байхад алдаа: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Символик холбоос дэмжигдээгүй" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Файл »%s« -ыг уншиж байхад алдаа: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/mr.po new file mode 100644 index 0000000..b2f04e5 --- /dev/null +++ b/po/mr.po @@ -0,0 +1,4400 @@ +# translation of mr.po to Marathi +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Sandeep Shedmake , 2008, 2009. +# Sandeep Shedmake , 2009, 2010, 2012. +msgid "" +msgstr "" +"Project-Id-Version: mr\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 23:40+0000\n" +"PO-Revision-Date: 2012-09-18 13:11+0530\n" +"Last-Translator: Sandeep Shedmake \n" +"Language-Team: Marathi \n" +"Language: mr\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: Lokalize 1.4\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s करीता खूप मोठी प्रमाण संख्या पुरविले गेली" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "बेस स्ट्रीमवर सीक समर्थीत नाही" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream ट्रंकेट करणे अशक्य" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "श्रृंखला आधिपासूनच बंद आहे" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "बेस स्ट्रीमवर ट्रंकेट समर्थीत नाही" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "कार्य रद्द करण्यात आले" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "अवैध ऑब्जेक्ट, सुरू केले नाही" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "इंपुटमधील अपूर्ण मल्टिबाईट श्रृंखला" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "लक्ष्यमध्ये अतिरीक्त जागा आढळली नाही" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "रूपांतर आगत मध्ये अवैध बाईट श्रृंखला" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "रूपांतर करतेवेळी त्रूटी: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "रद्द करण्याजोगी प्रारंभ समर्थीत नाही" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "अक्षर संच '%s' पासून '%s' असे रूपांतर समर्थित नाही" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' पासून '%s' असे रूपांतरक उघडू शकले नाही" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s प्रकार" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "अपरिचीत प्रकार" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s फाइलप्रकार" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials या OS वर लागू केले नाही" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "तुमच्या प्लॅटफॉर्मकरीता GCredentials समर्थन आढळले नाही" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "अपरिचीत पूर्वरत end-of-stream" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "पत्ता नोंदणी `%2$s' मध्ये असमर्थीत कि `%1$s' आढळली" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"पत्ता `%s' अवैध आहे (हुबेहुब एक मार्ग, tmpdir किंवा ॲब्स्ट्रॅक्ट किज् आवश्यक " +"आहे)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "पत्ता नोंदणी `%s' मध्ये अयोग्य कि/वॅल्यु जोड आढळली" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "पत्ता `%s' मध्ये त्रुटी - पोर्ट गुणधर्म सदोषीत आहे" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "पत्ता `%s' मध्ये त्रुटी - फॅमिलि गुणधर्म सदोषीत आहे" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "पत्ता घटक `%s'मध्ये स्वल्पविराम (:) समाविष्टीत नाही" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"कि/वॅल्यु जोड %d, `%s', पत्ता घटक `%s' मध्ये, समांतर चिन्ह समाविष्टीत नाही" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"कि/वॅल्यु जोड %d, `%s', पत्ता घटक `%s' मध्ये कि किंवा वॅल्यु सोडतेवेळी त्रुटी " +"आढळली" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"पत्ता `%s' मध्ये त्रुटी- युनिक्स् ट्रांसपोर्टला हुबेहुब एक किज् `path' किंवा " +"`abstract' " +"करीता निश्चित असावे" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "पत्ता `%s' मध्ये त्रुटी - यजमान गुणधर्म आढळले नाही किंवा सदोषीत आहे" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"पत्ता `%s' मध्ये त्रुटी आढळली - पोर्ट गुणधर्म आढळले नाही किंवा सदोषीत आहे" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"पत्ता `%s' मध्ये त्रुटी आढळली - noncefile गुणधर्म आढळले नाही किंवा सदोषीत आहे" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "स्वयं सुरू करतेवेळी त्रुटी: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "अपरिचीत किंवा असमर्थीत ट्रांस्पोर्ट `%s' पत्ता `%s' करीता" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "नाँस् फाइल `%s': %s उघडतेवेळी त्रुटी" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "नाँस् फाइल `%s': %s पासून वाचतेवेळी त्रुटी" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"नाँस् फाइल `%s' पासून वाचतेवेळी त्रुटी, अपेक्षीत 16 बाइटस्, %d प्राप्त झाले" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "नाँस् फाइल `%s' मधील अंतर्भुत माहिती स्ट्रिमकरीता लिहतेवेळी त्रुटी:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "दिलेला पत्ता रिकामा आहे" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "setuid असल्यास संदेशला स्पॉन करणे अशक्य" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "मशीन-id विना संदेश बस स्पॉन करणे अशक्य: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "आदेश ओळ `%s' स्पॅन करतेवेळी त्रुटी: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(हे पटल बंद करण्यासाठी कोणतेहि अक्षर टाइप करा)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "सत्र dbus सुरू नाही, व autolaunch अपयशी" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "सत्र बस पत्ता (या OS करीता लागू केले नाही) ओळखणे अशक्य" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE एंवार्यंमेंट वेरियेबल पासून बस पत्ता ओळखणे अशक्य - " +"अपरिचीत मूल्य `" +"%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"DBUS_STARTER_BUS_TYPE एंवार्यंमेंट वेरियेबल सुरू न केल्याने बस पत्ता ओळखणे " +"अशक्य" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "अपरिचीत बस प्रकार %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "ओळ वाचतेवेळी अंतर्भुत माहिती अनपेक्षीतरित्या आढळली नाही" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "ओळ सुरक्षितपणे वाचतेवेळी अंतर्भुत माहिती अनपेक्षितरित्या आढळली नाही" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"सर्व उपलब्ध ओळखपटवण्याच्या पद्धती (वापरलेले: %s) (उपलब्ध: %s) रिक्त झाले" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer तर्फे रद्द केले" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "डिरेक्ट्री `%s': %s करीता माहिती प्राप्त करतेवेळी त्रुटी आढळली" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "डिरेक्ट्री `%s' वरील सदोषीत आहे. अपेक्षीत मोड 0700, 0%o प्राप्त झाले" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "डिरेक्ट्री `%s': %s निर्माण करतेवेळी त्रुटी" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "वाचण्याकरीता किरिंग `%s' उघडतेवेळी त्रुटी: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s' येथील किरिंगमधील ओळ %1$d यावरील अंतर्भुत माहिती `%3$s' सदोषीत आहे" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"अंतर्भुत माहिती `%3$s' सह `%2$s' येथील किरिंगमधील ओळ %1$d मधील पहिले टोकन " +"सदोषीत आहे" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"अंतर्भुत माहिती `%3$s' सह `%2$s' येथील किरिंगमधील ओळ %1$d मधील दुसरे टोकन " +"सदोषीत आहे" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "`%2$s' येथे किरिंगमध्ये id %1$d सह कूकि आढळले नाही" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "जुणी लॉक फाइल `%s': %s नष्ट करतेवेळी त्रुटी आढळली" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "लॉक फाइल `%s': %s निर्माण करतेवेळी त्रुटी आढळली" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "लॉक फाइल `%s': %s बंद करतेवेळी (अनलिंक्ड्) त्रुटी आढळली" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "लॉक फाइल `%s': %s जोडणी अशक्य करतेवेळी त्रुटी" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "लिहण्याकरीता किरिंग `%s' उघडतेवेळी त्रुटी: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(वैकल्पिकरित्या, `%s' करीता कुलूपबंद मोकळे करणे अपयशी झाले: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "जोडणी बंद झाली" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "वेळसमाप्ति पोहचली" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "क्लाएंट-साइड जोडणी बांधतेवेळी असमर्थीत फ्लॅग्स् आढळली" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"मार्ग %s वर ऑब्जेक्टकरीता इंटरफेस `org.freedesktop.DBus.Properties' आढळले नाही" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"गुणधर्म `%1$s' निश्चित करतेवेळी त्रुटी: अपेक्षीत प्रकार `%2$s' परंतु `%3$s' " +"प्राप्त झाले" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "गुणधर्म `%s' आढळले नाही" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "गुणधर्म `%s' वाचनजोगी नाही" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "गुणधर्म `%s' लेखनजोगी नाही" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "इंटरफेस `%s' आढळले नाही" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "इंटरफेस आढळले नाही" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "मार्ग %2$s येथे ऑब्जेक्टवर इंटरफेस `%1$s' आढळले नाही" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "मेथड `%s' आढळले नाही" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "संदेशचे प्रकार, `%s', अपेक्षीत प्रकार `%s' सह जुळणी अशक्य" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s येथे इंटरफेस %1$s करीता ऑब्जेक्ट आधिपासूनच एक्सपोर्ट केले आहे" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "मेथड `%1$s' ने प्रकार `%2$s' पुरवले, परंतु `%3$s' अपेक्षीत आहे" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "इंटरफेस `%2$s' वरील मेथड `%1$s', स्वाक्षरी `%3$s' सह आढळले नाही" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s करीता सबट्रि आधिपासून एक्सपोर्ट केले आहे" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "प्रकार INVALID आहे" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL संदेश: PATH किंवा MEMBER हेडर क्षेत्र आढळले नाही" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN संदेश: REPLY_SERIAL हेडर क्षेत्र आढळले नाही" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR संदेश: REPLY_SERIAL किंवा ERROR_NAME हेडर क्षेत्र आढळले नाही" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL संदेश: PATH, INTERFACE किंवा MEMBER हेडर क्षेत्र आढळले नाही" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL संदेश: PATH हेडर क्षेत्र आरक्षीत मूल्य /org/freedesktop/DBus/Local " +"याचा वापर " +"करत आहे" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL संदेश: INTERFACE हेडर क्षेत्र आरक्षीत मूल्य org.freedesktop.DBus.Local " +"याचा " +"वापर करत आहे" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu बाइट वाचायचे होते परंतु EOF प्राप्त झाले" +msgstr[1] "%lu बाइटस् वाचायचे होते परंतु EOF प्राप्त झाले" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"वैध UTF-8 स्ट्रिंग अपेक्षीत परंतु बाइट ऑफसेट %d (स्ट्रिंगची लांबी %d आहे) " +"करीता अवैध बाईटस् " +"आढळले. वैध UTF-8 स्ट्रिंग त्यावेळ पर्यंत `%s' होते" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "स्ट्रिंग `%s' नंतर NUL बाइट अपेक्षीत परंतु बाइट %d आढळले" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "वाचलेले मूल्य `%s' वैध D-Bus ऑब्जेक्ट मार्ग नाही" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "वाचलेले मूल्य `%s' वैध D-Bus स्वाक्षरी नाही" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "%u बाइट लांबीचा अरे आढळले. कमाल लांबी 2<<26 bytes (64 MiB) आहे." +msgstr[1] "%u बाइटस् लांबीचे अरे आढळले. कमाल लांबी 2<<26 bytes (64 MiB) आहे." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "वेरियंटकरीता वाचलेले मूल्य `%s' वैध D-Bus स्वाक्षरी नाही" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"D-Bus वायर रूपणपासून स्ट्रिंग `%s' सह GVariant डिसिरिअलाइज करतेवेळी त्रुटी" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"अवैध एंडियननेस् मूल्य. 0x6c ('l') किंवा 0x42 ('B') अपेक्षीत परंतु मूल्य 0x%" +"02x आढळले" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "अवैध मुख्य प्रोटोकॉल आवृत्ती. 1 अपेक्षीत परंतु %d आढळले" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "स्वाक्षरी `%s' सह स्वाक्षरि हेडर आढळले परंतु संदेश बॉडि रिकामे आहे" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "वाचलेले मूल्य `%s' वैध D-Bus स्वाक्षरी नाही (बॉडिकरीता)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "संदेशमध्ये स्वाक्षरि हेडर आढळले नाही परंतु संदेश बॉडि %u बाइट आहे" +msgstr[1] "संदेशमध्ये स्वाक्षरि हेडर आढळले नाही परंतु संदेश बॉडि %u बाइटस् आहे" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "संदेश डिसिरिअलाइज करणे अशक्य: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"D-Bus वायर रूपणकरीता स्ट्रिंग `%s' सह GVariant डिसिरिअलाइज करतेवेळी त्रुटी" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"%d फाइल डिस्क्रिप्टर्सकडे संदेश आढळले परंतु हेडर क्षेत्र %d फाइल " +"डिस्क्रिप्टर्स् निर्देशीत करते" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "संदेशला सिरिअलाइज करणे अशक्य: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "संदेश बॉडिमध्ये स्वाक्षरी `%s' आढळले परंतु स्वाक्षरी हेडर आढळले नाही" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"संदेश बॉडिमध्ये स्वाक्षरी `%s' आढळले परंतु स्वाक्षरी हेडरमध्ये स्वाक्षरी `%s' " +"आहे" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"संदेश बॉडि रिकामे आहे परंतु परंतु स्वाक्षरी हेडरमध्ये स्वाक्षरी `(%s)' आहे" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "`%s' प्रकारच्या बॉडिसह त्रुटी आढळली" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "रिकाम्या बॉडिसह त्रुटी आढळली" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "हार्डवेअर प्रोफाइल: %s प्राप्त करण्यास अशक्य" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id किंवा /etc/machine-id लोड करणे अशक्य: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s करीता StartServiceByName ला कॉलकरतेवेळी त्रुटी: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "StartServiceByName(\"%2$s\") मेथडपासून अनपेक्षीत प्रतिसाद %1$d" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"मेथड सुरू करणे अशक्य; प्रॉक्सी मालकविना परिचीत नावकरीता आहे व प्रॉक्सी " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START फ्लॅगसह बांधले गेले" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "ॲब्स्ट्रॅक्ट नेम स्पेसकरीता समर्थन नाही" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "सर्व्हर निर्माण करतेवेळी nonce फाइल निर्देशीत करणे अशक्य" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s': %s येथे nonce फाइलकरीता लिहतेवेळी त्रुटी" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "स्ट्रिंग `%s' वैध D-Bus GUID नाही" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "समर्थीत ट्रांस्पोर्ट `%s' वर एकणे अशक्य" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"आदेश:\n" +" help हि माहिती दाखवतो\n" +" introspect रिमोट ऑब्जेक्टची चौकशी करा\n" +" monitor रिमोट ऑब्जेक्ट मॉनिटर करा\n" +" call रिमोट ऑब्जेक्टवर मेथड सुरू करा\n" +" emit सिग्नल काढा\n" +"\n" +"प्रत्येक आदेशवर मदत प्राप्त करण्यासाठी \"%s COMMAND --help\" याचा वापर करा.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "त्रुटी: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "इंट्रोस्पेक्शन XML: %s वाचतेवेळी त्रुटी\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "सिस्टम बससह जोडणी करा" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "सेशन बससह जोडणी करा" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "दिलेल्या D-Bus पत्त्याशी जोडणी करा" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "कनेक्शन एंटपॉईंट पर्याय:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "जोडणी एंडपॉईंट निर्देशीत करणारे पर्याय" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "जोडणी एंडपॉईंट निर्देशीत केले नाही" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "एकापेक्षा जास्त जोडणी एंडपॉईंटस् निर्देशीत केले" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "सावधानता: इंट्रोस्पेक्शन डाटा प्रमाणे, इंटरफेस `%s' अस्तित्वात नाही\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"सावधानता: इंट्रोस्पेक्शन डाटाप्रमाणे, मेथड `%s' इंटरफेस `%s' वर आढळली नाही\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "सिग्नलकरीता (एकमेव नाव) वैकल्पिक लक्ष्य" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "सिग्नलकरीता ऑब्जेक्टचा मार्ग" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "सिग्नल व इंटरफेसचे नाव" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "सिग्नल काढा." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "जोडणी करतेवेळी त्रुटी: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "त्रुटी: ऑब्जेक्ट मार्ग निर्देशीत केले नाही.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "त्रुटी: %s वैध ऑब्जेक्ट मार्ग नाही\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "त्रुटी: सिग्नल निर्देशीत नाही.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "त्रुटी: सिग्नल फूल्लि-क्वालिफाइड नाव पाहिजे.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "त्रुटी: %s वैध इंटरफेस नाव नाही\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "त्रुटी: %s वैध सदस्य नाव नाही\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "त्रुटी: %s वैध युनिक बस नाव नाही.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "घटक %d: %s वाचतेवेळी त्रुटी\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "जोडणी फ्लश करतेवेळी त्रुटी: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "मेथड सुरू करण्यासाठी लक्ष्य नाव" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "मेथड सुरू करण्यासाठी ऑब्जेक्ट मार्ग" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "मेथड व इंटरफेसचे नाव" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "सेकंदातील वेळसमाप्ति" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "रिमोट ऑब्जेक्टकरीता मेथड सुरू करा." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "त्रुटी: लक्ष्य निर्देशीत नाही\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "त्रुटी: ऑब्जेक्ट मार्ग निर्देशीत नाही\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "त्रुटी: मेथडचे नाव निर्देशीत नाही\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "त्रुटी: मेथडचे नाव `%s' अवैध आहे\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "प्रकार `%2$s': %3$s असलेले घटक %1$d वाचतेवेळी त्रुटी\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "चैकशीकरीताचे लक्ष्य नाव" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "चौकशी करण्याजोगी ऑब्जेक्ट मार्ग" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML ची छपाई करा" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "चिल्डरनची चौकशी करा" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "फक्त गुणधर्मांची छपाई करा" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "रिमोट ऑब्जेक्टची चौकशी करा." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "मॉनिटर करण्याजोगी लक्ष्य नाव" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "मॉनिटर करण्याजोगी ऑब्जेक्ट मार्ग" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "रिमोट ऑब्जेक्ट मॉनिटर करा." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "निनावी" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "डेस्कटॉप फाइल मध्ये Exec नोंदणी निश्चित नाही" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "अनुप्रयोगकरीता आवश्यक टर्मिनल आढळले नाही" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "वापरकर्ता अनुप्रयोग संयोजन संचयीका %s बनवू शकले नाही: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "वापरकर्ता MIME संयोजन संचयीका %s बनवू शकले नाही: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "ॲप्लिकेशन माहितीमध्ये आइडेंटिफायर आढळले नाही" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "वापरकर्ता डेस्कटॉप फाइल %s बनवू शकत नाही" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s करीता इच्छिक व्याख्या" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ड्राइव्ह eject किंवा eject_with_operation लागू करत नाही" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ड्राइव्ह मिडीयाकरीता पोलींग लागू करत नाही" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ड्राइव्ह start लागू करत नाही" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ड्राइव्ह stop लागू करत नाही" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS समर्थन उपलब्ध नाही" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem एनकोडींगची आवृत्ती %d हाताळू शकत नाही" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem एनकोडींग अंतर्गत सदोषीत टोकन (%d) आढळले" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblem एनकोडींग ची आवृत्ती (%d) हाताळू शकत नाही" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblem एनकोडींग अंतर्गत सदोषीत टोकन (%d) आढळले" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon करीता GEmblem अपेक्षीत" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "समाविष्टीत आरोहन अस्तीत्वात नाही" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "संचयीकेवर प्रत बनवू शकत नाही" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "संचयीकेवर संचयीकेची प्रत बनवू शकत नाही" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "लक्ष्य फाइल अस्तित्वात आहे" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "संचयीकेची पुनः प्रत बनवू शकत नाही" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "स्प्लाइस समर्थीत नाही" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "फाइल स्प्लाइस करतेवेळी त्रुटी: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "विशेष फाइलचे प्रत बनवू शकत नाही" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "अवैध symlink मुल्य दिले गेले" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "कचरापेटी समर्थित नाही" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "फाइल नावात '%c' असू शकत नाही" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "खंड आरोहन कार्यारत करत नाही" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "ही फाइल हाताळण्याकरीता कुठलेही अनुप्रयोग पंजीकृत नाही" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ऐन्युमरेटर बंद आहे" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "फाइल ऐन्युमरेटरची अप्रतिम कार्यक्षमता" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "श्रृंखला query_info ला समर्थन देत नाही" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "श्रृंखलेवर सीक समर्थित नाही" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "आगत श्रृंखलेवर ट्रंकेट वापरू शकत नाही" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "श्रृंखलेवर ट्रंकेट समर्थित नाही" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "चुकीचे टोकन क्रमांक (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "वर्ग नाव %s करीता प्रकार आढळले नाही" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "प्रकार %s GIcon संवाद लागू करण्यास अशक्य ठरले" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "प्रकार %s वर्गीकृत केले गेले नाही" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "सदोषीत आवृत्ती क्रमांक: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "प्रकार %s GIcon संवादवर from_tokens() लागू करत नाही" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "आयकन एनकोडिंगचे पुरवलेली आवृत्ती हाताळणे अशक्य" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "पत्ता निर्देशीत केले नाही" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "पत्ताकरीता लांबी %u खूप लांब आहे" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "पत्तामध्ये सेट बियाँड प्रिफिक्स लांबीचे बिट आढळले" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' ला IP पत्ता मास्क म्हणून वाचणे अशक्य" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "सॉकेट पत्त्यांकरीता अतिरीक्त जागा आढळली नाही" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "असमर्थीत सॉकेट पत्ता" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "श्रृंखलाचे अप्रतिम कार्यक्षमता" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "घटक <%s> यास <%s> अंतर्गत स्वीकारले जात नाही" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "घटक <%s> यास उच्चस्तराकरीता स्वीकार्य नाही" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "स्रोतमध्ये फाइल %s एकापेक्षाजास्तवेळी आढळलते" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "'%s' ला कोणत्याहि स्रोत डिरेक्ट्रीमध्ये शोधण्यास अपयशी" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "सध्याच्या डिरेक्ट्रीमध्ये '%s' शोधणे अशक्य" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "अपरिचीत विश्लेषण पर्याय \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "temp फाइल निर्माण करण्यास अपयशी: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint सह इंपुट फाइलचे विश्लेषण करतेवेळी त्रुटी:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata सह इंपुट फाइलचे विश्लेषण करतेवेळी त्रुटी:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "फाइल %s: %s वाचतेवेळी त्रुटी" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "फाइल %s संकोचीत करतेवेळी त्रुटी" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "मजकूर <%s> अंतर्गत कदाचित आढळणार नाही" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "आऊटपुट फाइलचे नाव" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"फाइल्स् वाचण्यासाठी डिरेक्ट्रीज् (सध्याच्या डिरेक्ट्रीकरीता पूर्वनिर्धारित)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "लक्ष्य फाइलनाव एक्सटेंशनतर्फे निवडलेल्या रूपण करीता आऊटपुट निर्माण करा" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "स्रोत हेडर निर्माण करा" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"सोअर्सकोड निर्माण करतेवेळी स्रोत फाइलपासून कोडपर्यंत दुवा निर्माण होत असे" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "अवलंबन सूची निर्माण करा" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "स्वयंरित्या स्रोत निर्माण व नोंदणी करू नका" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "निर्मीत सोअर्स् कोडकरीता वापरण्याजोगी C आइडेंटिफायर नाव" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"स्रोत सूचनाला स्रोत फाइलमध्ये कंपाइल करा.\n" +"रिसोअर्स् स्पेसिफिकेशन फाइल्स्मध्ये एक्सटेंशन .gresource.xml असते,\n" +"व स्रोत फाइलमध्ये .gresource नामाक एक्सटेंशन असते." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "हुबेहुब एक फाइल नाव पुरवणे आवश्यक आहे\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "रिकामे नावांकरीता परवानगी दिली जात नाही" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "अवैध नाव '%s': नावे छोट्या आकाराचे अक्षरांसह सुरू व्हायला हवे" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"अवैध नाव '%s': अवैध अक्षर '%c'; फक्त छोटे अक्षरे, संख्या व डॅश ('-') करीता " +"परवानगी असते." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "अवैध नाव '%s': दोन परस्पर हायफन्स् ('--') करीता परवानगी नाही." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "अवैध नाव '%s': शेटवचे अक्षर हायफेन ('-') असणे अशक्य." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "अवैध नाव '%s': कमाल लांबी 1024 आहे" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " आधिपासूनच निर्देशीत केले" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "'list-of' स्किमामध्ये किज् समाविष्ट करणे अशक्य" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " आधिपासूनच निर्देशीत" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" मध्ये shadows ; मूल्य संपादित " +"करण्यासाठी याचा वापर करा" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +" करीता गुणधर्म म्हणून 'type', 'enum' किंवा 'flags' पैकी एक निर्देशीत " +"करणे आवश्यक " +"आहे" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> अजूनही ठरवले नाही." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "अवैध GVariant प्रकार स्ट्रिंग '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " दिले परंतु स्किमा कशालाच एक्सटेंड करत नाही" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ओव्हरराइडकरीता आढळले नाही" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " आधिपासूनच निर्देशीत केले" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " आधिपासूनच निर्देशीत केले" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " सुत्रयोजना '%s'ला विस्तारित करतो" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " not-yet-existing स्किमा '%s' ची सूची आहे" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "मार्गसह स्किमाची सूची असणे अशक्य" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "मार्गसह स्किमा एक्सटेंड करणे अशक्य" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" लिस्ट आहे, ला एक्सटेंड केले जि लिस्ट नाही" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" हे ला एक्सटेंड " +"करते " +"परंतु '%s' हे '%s' यास एक्सटेंड करत नाही" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "मार्ग, दिले असल्यास, स्लॅशसह सुरू व समाप्त व्हायला हवे" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "सूचीचे मार्ग ':/' सह समाप्त व्हायला हवे" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> आधिपासूनच निर्देशीत केले" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "एलिमेंट <%s> शीर्ष स्तरकरीता स्वीकारले जात नाही" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict निर्देशीत केले; बाहेर पडत आहे.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "संपूर्ण फाइलकडे दुलक्ष केले.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "या फाइलकडे दुर्लक्ष केले.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"ओव्हरराइड फाइल `%3$s' मध्ये निर्देशीत केल्याप्रमाणे स्किमा `%2$s' मध्ये कि `%" +"1$s' आढळली " +"नाही" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; या किसाठी ओव्हरराइडकडे दुर्लक्ष केले.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " व --strict निर्देशीत केले; बाहेर पडत आहे.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"ओव्हरराइड फाइल `%3$s': %4$s मध्ये निर्देशीत केल्याप्रमाणे स्किमा `%2$s' मधील " +"कि `%1$s' " +"वाचतेवेळी त्रुटी आढळली. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "या किसाठी ओव्हरराइडकडे दुर्लक्ष केले.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"ओव्हरराइड फाइल `%3$s' मध्ये स्किमा `%2$s' करीता कि `%1$s' दिलेल्या " +"सुत्रयोजनेच्या " +"व्याप्ति बाहेर आहे" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"ओव्हरराइड फाइल `%3$s' मध्ये स्किमा `%2$s' करीता कि `%1$s' वैध पर्यायांच्या " +"सूचीत नाही" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled फाइल कुठे साठवायची" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "schemas मधील कोणत्याहि त्रुटी रद्द करा" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled फाइल लिहू नका" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "किचे नाव प्रतिबंध जबरनपणे लागू करू नका" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"सर्व GSettings स्किमा फाइल्स्ला स्किमा कॅशेमध्ये कंपाइल करा.\n" +"स्किमा फाइल्स्कडे .gschema.xml एक्सटेंशन आवश्यक आहे,\n" +"व कॅश फाइलला gschemas.compiled असे म्हटले जाते." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "हुबेहुब एक डिरेक्ट्री नाव द्या\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "स्किमा फाइल्स् आढळले नाही: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "काहिच करू नका.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "अस्तित्वातील आऊटपुट फाइल काढून टाकले.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "मुलभूत संचयीका मॉनीटर प्रकार शोधता आली नाही" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "अवैध फाइलनाव %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "फाइलप्रणाली विषयी माहिती मिळवतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "रूट संचयीका पुनःनामांकीत करू शकत नाही" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "फाइल पुनःनामांकीत करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "फाइलचे पुनःनामांकन अशक्य, फाइलचेनाव आधिपासूनच अस्तित्वात आहे" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "अवैध फाइल नाव" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "संचयीका उघडू शकत नाही" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "फाइल उघडतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "फाइल काढून टाकतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "फाइल कचरापेटीत हलवितेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "कचरापेटी संचयीका %1$s निर्माण करती आली नाही: %2$s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "कचरापेटी करीता उच्चस्थरीय संचयीका शोधता आली नाही" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "कचरापेटी करीता उच्चस्थरीय संचयीका शोधता आली नाही" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "कचरापेटी माहिती फाइल बनविता आली नाही: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "कचरापेटीकडे फाइल हलवितेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "आंतरीक त्रूटी" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "संचयीका बनवितेवेळी त्रूटी आढळली: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "फाइलप्रणाली सिम्बॉलीक लिंक्स् करीता समर्थन पुरवत नाही" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "बोधचिन्ह लिंक बनवितेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "फाइल स्थानांतरन करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "संचयीकेवर संचयीका हलवू शकत नाही" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "प्रतिकृत फाइल निर्माण अपयशी" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "लक्ष्य फाइल काढून टाकतेवेळी त्रूटी: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "आरोहन मधिल स्थानांतरन समर्थीत नाही" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "गुणधर्म मुल्य शून्य नसायला हवे" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "अवैध गुणधर्म प्रकार (अक्षरमाळा अपेक्षीत)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "अवैध विस्तारीत गुणधर्म नाव" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "विस्तारीत गुणधर्म निश्चित करतेवेळी त्रूटी '%s': %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (अवैध ऐंकोडींग)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "फाइल '%s': %s करीता माहिती प्राप्त करतेवेळी त्रुटी" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "फाइल डिस्क्रिप्टर: %s करीता माहिती प्राप्त करतेवेळी त्रुटी" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "अवैध गुणधर्म प्रकार (uint32 अपेक्षीत)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "अवैध गुणधर्म प्रकार (uint64 अपेक्षीत)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "अवैध गुणधर्म प्रकार (बाईट अक्षरमाळा अपेक्षीत)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "symlinks करीता परवानगी सेट करण्यास अशक्य" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "परवानगी स्थापित करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "मालक स्थापित करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "symlink शून्य नसायला हवे" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink स्थापीत करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink निश्चित करतेवेळी त्रूटी: फाइल symlink नाही" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "संपादन किंवा प्रवेशवेळ ठरवतेवेळी त्रुटी: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux संदर्भ विना-शून्य असायला हवे" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux संदर्भ संयोजीत करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux या प्रणालीवर कार्यान्वीत नाही" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s गुणधर्म स्थापित करणे समर्थित नाही" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "फाइल पासून वाचतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "फाइल शोधतेवळी त्रूटी: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "फाइल बंद करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "मुलभूत स्थानीक फाइल मॉनीटर प्रकार शोधता आले नाही" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "फाइलवर लिहीतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "जुने प्रतिकृत लिंक काढून टाकतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "प्रतिकृत प्रत बनवितेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "तातपूरती फाइल पुनःनामांकीत करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "फाइल ट्रंकेट करतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "फाइल '%s' उघडतेवेळी त्रूटी: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "लक्ष्य फाइल संचयीका आहे" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "लक्ष्य फाइल सामान्य फाइल नाही" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "फाइल बाहेरुन संपादित करण्यात आली" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "जुणी फाइल काढूण टाकतेवेळी त्रूटी: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "अवैध GSeekType पुरविले गेले" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "अवैध संचयन विनंती" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ट्रंकेट करू शकत नाही" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "स्मृती आउटपुट श्रृंखला पुन्हआकार देण्यजोगी नाही" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "स्मृती आउटपुट स्ट्रीम पुन्ह आकार देण्यास अपयशी" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"राईट प्रोसेस् करण्यासाठी आवश्यक मेमरी उपलब्ध ऍड्रेस् स्पेस् पेक्षा जास्त आहे" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "स्ट्रीमच्या सुरवातीस, सीक करीता विनंती केली" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "माउन्ट समजुळवणी अनुक्रम प्रकार अंदाज लागू करत नाही" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "यजमाननाव '%s' मध्ये '[' समाविष्टीत आहे परंतु ']' समाविष्टीत नाही" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "नेटवर्क पोहचण्याजोगी नाही" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "यजमान पोहचण्याजोगी नाही" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "नेटवर्क मॉनिटर निर्माण करणे अशक्य: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "नेटवर्क मॉनिटर निर्माण करणे अशक्य: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "नेटवर्क स्टटस् प्राप्त करणे अशक्य: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "आऊटपुट स्ट्रिम राइट लागू करत नाही" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "स्त्रोत श्रृंखला आधिपासून बंद" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' च्या निर्धारणवेळी त्रुटी: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s'च्या उलट-निर्धारणवेळी त्रुटी: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' करीता विनंती केलेल्या प्रकारचे DNS रेकॉर्ड आढळले नाही" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "तात्पुर्ते '%s'चे निर्धारण करण्यास अशक्य" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "त्रुटीच्या निर्धारणवेळी त्रुटी: %s" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s' करीता अपुरे डाटा प्राप्त झाले" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' येथील स्रोत अस्तित्वात नाही" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' येथील स्रोत डिकंप्रेस होण्यास अपयशी झाले" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s' येथील स्रोत डिरेक्ट्रि नाही" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "इंपुट स्ट्रिम सीक लागू करत नाही" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "मदतची छपाई करा" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "elf FILE मध्ये स्रोत समाविष्टीत असणारे विभागांची सूची दाखवा" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"स्रोत दाखवा\n" +"SECTION दिले असल्यास, फक्त या विभागतले स्रतो दाखवा\n" +"PATH दिले असल्यास, फक्त जुळणारे स्रोत दाखवा" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"स्रोतला तपशीलसह सूचीत दाखवा\n" +"SECTION दिले असल्यास, फक्त या विभागातील स्रोत दाखवा\n" +"PATH दिले असल्यास, फक्त जुळण्याजोगी स्रोतची सूची दाखवा\n" +"तपशीलमध्ये विभाग, आकार व कम्प्रेशन समाविष्टीत आहे" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "स्रोत फाइलला stdout करीता काढा" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"अपरिचीत आदेश %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"वापर:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"आदेश:\n" +" help हि माहिती दाखवा\n" +" sections स्रोत विभाग दाखवा\n" +" list स्रोत दाखवा\n" +" details तपशीलसह स्रोतची सूची दाखवा\n" +" extract स्रोत प्राप्त करा\n" +"\n" +"तपशीलमध्ये मदत प्राप्त करायचे असल्यास 'gresource help COMMAND' याचा वापर " +"करा.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"वापर:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "बाब:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION एक (वैकल्पिक) elf विभागाचे नाव\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND समझवण्यासाठीचे आदेश (वैकल्पिक)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE एक elf फाइल (बाइनरि किंवा शेअर्ड् लाइब्ररि)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE एक elf फाइल (बाइनरि किंवा शेअर्ड् लाइब्ररि)\n" +" किंवा कंपाइल्ड् स्रोत फाइल\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH एक (वैकल्पिक) स्रोत मार्ग (अपुरे असू शकते)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH स्रोतचे मार्ग\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "स्किमा '%s' आढळले नाही\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "स्किमा '%s' पुनःस्थानांतरनजोगी नाही (मार्ग निर्देशीत करणे आवश्यक)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "स्किमा '%s' पुनःस्थानांतरनजोगी आहे (मार्ग निर्देशीत करणे आवश्यक आहे)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "रिकामे मार्ग दिले.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "मार्ग स्लॅशसह सुरू व्हायला हवे (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "मार्ग स्लॅशसह समाप्त व्हायला हवे (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "मार्गमध्ये दोन परस्पर स्लॅशेस् समाविष्टीत नाही पाहिजे (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "कि '%s' आढळली नाही\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "दिलेले मूल्य वैध व्याप्तिच्या बाहेर आहे\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "प्रतिष्ठापीत (विना-पुनःशोधण्याजोगी) स्किमाज् दाखवा" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "प्रतिष्ठापीत पुनःशोधण्याजोगी स्किमाज् दाखवा" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA मधील किज् दाखवा" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "SCHEMA चे चिल्डरन दाखवा" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"किज् व मूल्यांची सूची दाखवा, पुनः\n" +"SCHEMA दिले नसल्यास, सर्व किज् दाखवा\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "KEY किचे मूल्य प्राप्त करा" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "KEY करीता वैध मूल्यांची व्याप्तिची चौकशी करा" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "VALUE करीता KEY चे मूल्य ठरवा" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "KEY ला पूर्वनिर्धारित मूल्यकरीता पूर्ववत् करा" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA मधील सर्व किज्ला परस्पर पूर्वनिर्धारितकरीता पूर्ववत् करा" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "KEY लेखनजोगी आहे याची तपासणी करा" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"बदलांकरीता KEY मॉनिटर करा.\n" +"KEY निर्देशीत केले नसल्यास, SCHEMA मधील सर्व किज मॉनिटर करा.\n" +"मॉनिटरिंग थांबवण्याकरीता ^C याचा वापर करा.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"वापर:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"आदेश:\n" +" help हि माहिती दाखवा\n" +" list-schemas प्रतिष्ठापीत स्किमा दाखवा\n" +" list-relocatable-schemas पुनःस्थानांतरनजोगी स्किमाज् दाखवा\n" +" list-keys स्किमामध्ये किज् दाखवा\n" +" list-children स्किमाचे चिल्डरन दाखवा\n" +" list-recursively किज् व वॅल्युज् दाखवा, पुनः\n" +" range किच्या व्याप्तिकरीता चौकशी करतो\n" +" get किचे मूल्य प्राप्त करा\n" +" set किचे मूल्य ठरवा\n" +" reset किचे मूल्य पूर्ववत् करा\n" +" reset-recursively दिलेल्या स्किमामध्ये सर्व मूल्ये पूर्ववत् करा\n" +" writable कि लेखनजोगी आहे याची तपासणी करा\n" +" monitor बदल तपासा\n" +"\n" +"तपशीलमध्ये मदतकरीता 'gsettings help COMMAND' याचा वापर करा.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"वापर:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR अगाऊ स्किमाज् शोधण्याकरीता डिरेक्ट्री\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA स्किमाचे नाव\n" +" PATH मार्ग, पुनःस्थानांतरनजोगी स्किमाज् करीता\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY स्किमा अंतर्गत (वैकल्पिक) कि\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY स्किमामधील कि\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE ठरवण्याजोगी मूल्य\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "रिकामे स्किमा नाव दिले\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "अवैध सॉकेट, सुरू केले नाही" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "अवैध सॉकेट, कारणास्तव अपयशी: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "सॉकेट आधिपासून बंद आहे" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "सॉकेट I/O वेळ समाप्ति आढळली" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd पासून GSocket बनवत आहे: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "सॉकेट निर्माण करणे अशक्य: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "अपरिचीत फॅमिलि निर्देशीत केली" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "अपरिचीत प्रोटोकॉल निर्देशीत केले" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "स्थानीय पत्ता प्राप्त करण्यास अशक्य: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "दूरस्थ पत्ता प्राप्त करण्यास अशक्य: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "ऐकणे अशक्य: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "पत्त्याशी बांधणी करतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "मल्टिकास्ट गट: %s समाविष्ट करतेवेळी त्रुटी" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "मल्टिकास्ट गट: %s सोडतेवेळी त्रुटी" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "स्रोत-निर्देशीत मल्टिकास्टकरीता समर्थन नाही" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "त्रुटी स्वीकारतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "जुळवणी चालू आहे" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "स्थागीत त्रुटी प्राप्त करणे अशक्य: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "डाटा प्राप्त करतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "डाटा पाठवतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "सॉकेट: %s पूर्णपणेबंद करणे अशक्य" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "सॉकेट बंद करतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "सॉकेट अटची प्रतिक्षा करत आहे: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "फाइल पाठवतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Windows वर GSocketControlMessage समर्थीत नाही" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "संदेश प्राप्त करतेवेळी त्रुटी: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "या OS करीता g_socket_get_credentials लागू केले नाही" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "प्रॉक्सी सर्व्हर %s सह जोडणी अशक्य: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s सह जोडणी अशक्य: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "जोडणी अशक्य: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "जुळवणीनंतर अपरिचीत त्रुटी आढळली" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "विना-TCP जोडणी वरील प्रॉक्सिइंग समर्थीत नाही." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "प्रॉक्सी प्रोटोकॉल '%s' समर्थीत नाही." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener आधिपासूनच बंद आहे" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "समावेश केलेले सॉकेट बंद आहे" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 हे IPv6 पत्ता '%s' करीता समर्थन पुरवत नाही" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "वापरकर्तानाव SOCKSv4 प्रोटोकॉलकरीता खूप लांब आहे" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 प्रोटोकॉलकरीता यजमाननाव '%s' खूप लांब आहे" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "सर्व्हर SOCKSv4 प्रॉक्सी सर्व्हर नाही." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 सर्व्हरतर्फे जोडणी नकारली गेली" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "सर्व्हर SOCKSv5 प्रॉक्सी सर्व्हर नाही." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 प्रॉक्सीकरीता ओळखपटवणे आवश्यक." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 प्रॉक्सीला ऑथेंटिकेशन मेथड आवश्यक आहे ज्यास GLib तर्फे समर्थन पुरवले " +"जात नाही." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 प्रोटोकॉलकरीता वापरकर्तानाव किंवा पासवर्ड खूप लांब आहे." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"चुकिच्या वापरकर्तानाव किंवा पासवर्डमुळे SOCKSv5 ओळखपटवण्याची पद्धत अपयशी झाली." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 प्रोटोकॉलकरीता यजमाननाव '%s' खूप लांब आहे" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 प्रॉक्सी सर्व्हर अपरिचीत पत्ता प्रकारचा वापर करते." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "आंतरिक SOCKSv5 प्रॉक्सी सर्व्हर त्रुटी." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 जोडणी रूलसेटतर्फे स्वीकारले जात नाही." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 सर्व्हरतर्फे यजमान पोहचण्याजोगी नाही." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 प्रॉक्सीतर्फे नेटवर्क पोहचण्याजोगी नाही." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 प्रॉक्सीतर्फे जोडणी नकारली गेली." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 प्रॉक्सी 'connect' आदेशकरीता समर्थन पुरवत नाही." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 प्रॉक्सी पुरवलेल्या पत्ता प्रकारकरीता समर्थन पुरवत नाही." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "अपरिचीत SOCKSv5 प्रॉक्सी त्रुटी." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon एनकोडींगची आवृत्ती %d हाताळू शकत नाही" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-एंकोडेड प्राइव्हेट कि डिक्रिप्ट करणे अशक्य" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "PEM-एंकोडेड प्राइव्हेट कि आढळली नाही" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-एंकोडेड प्राइव्हेट कि वाचणे अशक्य" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "PEM-एंकोडेड प्रमाणपत्र आढळले नाही" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-एंकोडेड प्रमाणपत्र वाचणे अशक्य" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"प्रवेश कुलूपबंद करण्यापूर्वी पासवर्ड योग्यरित्या देण्याचा हा शेवटचा पर्याय " +"आहे." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"बरेच दिलेले पासवर्ड अयोग्य आहेत, व पुढील अपयशनंतर तुमचे प्रवेश कुलूपबंद केले " +"जाईल." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "दिलेले पासवर्ड अयोग्य आहे." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 कंट्रोल संदेश अपेक्षीत, %d प्राप्त झाले" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "ancillary डाटाचा अनपेक्षीत प्रकार" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "एक fd अपेक्षीत, परंतु %d प्राप्त\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "अवैध fd प्राप्त झाले" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "श्रेय पाठवतेवेळी त्रुटी: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "सॉकेट: %s करीता SO_PASSCRED सुरू केले आहे याची तपासणी करतेवेळी त्रुटी" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"सॉकेटकरीता SO_PASSCRED सुरू असल्याची तपासणी करतेवेळी अनपेक्षीत पर्याय लांबी " +"आढळली. %d " +"बाइटस् अपेक्षीत, %d प्राप्त" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED: %s सुरू करतेवेळी त्रुटी" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"श्रेय प्राप्त करण्यासाठी सिंगल बाइट वाचणे अपक्षीत आहे परंतु झीरो बाइटस् वाचले" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "कंट्रोल संदेश अपेक्षीत नाही, परंतु %d प्राप्त झाले" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED: %s बंद करतेवेळी त्रुटी आढळली" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "फाइल डिस्क्रिप्टर: %s पासून वाचतेवेली त्रुटी" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "फाइल डिस्क्रिप्टर: %s बंद करतेवेळी त्रुटी" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "फाइलसिस्टम रूट" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "फाइल डिस्क्रिप्टर: %s करीता लिहतेवेळी त्रुटी" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "ॲब्स्ट्रॅक्ट UNIX डोमैन सॉकेट पत्ता या प्रणालीवर समर्थीत नाही" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "खंड eject किंवा eject_with_operation लागू करत नाही" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "अनुप्रयोग आढळले नाही" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "अनुप्रयोग प्रक्षेपीत करतेवेळी त्रूटी: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI समर्थित नाही" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "संबंधीत बदल win32 वर समर्थित नाही" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 वर ग निर्माण समर्थित नाही" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "हँडल: %s पासून वाचतेवेळी त्रुटी" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "हँडल: %s बंद करतेवेळी त्रुटी" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "हँडल: %s करीता लिहतेवेळी त्रुटी" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "अतिरीक्त मेमरी आढळली नाही" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "आंतरीक त्रुटी: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "आणखी इंपुट आवश्यक" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "अवैध संकोचीत डाटा" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "ऐकण्याजोगी पत्ता" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "GTestDbus सह सहत्वताकरीता दुर्लक्ष केले" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "पत्ताची छपाई करा" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "शेल मोडमध्ये पत्त्याची छपाई करा" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "dbus सर्व्हिस चालवा" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "चुकिचे आर्ग्स्\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' घटक करीता '%s' अनपेक्षित गुणधर्म" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' घटकाकरीता '%s' गुणधर्म आढळले नाही" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "अनपेक्षीत टॅग '%s', टॅग '%s' अपेक्षीत" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' च्या आत, '%1$s' अनपेक्षीत टॅग" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "माहिती संचयीकेत वैध ओळखचिन्ह आढळले नाही" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' करीता ओळखचिन्ह आधिपासूनच अस्तित्वात आहे" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्ह आढळले नाही" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात MIME प्रकार व्याख्यीत नाही" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात वैयक्तिक बाब व्याख्यीत नाही" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' करीता ओळखचिन्हात गट निश्चित नाही" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"'%s' नामांकीत कुठल्याही अनुप्रयोगाने '%s' करीता ओळखचिन्ह पंजीकृत केले नाही" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' पासून कार्यान्वीत ओळ '%s' विस्तारीत करू शकले नाही" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "आगतच्या शेवटी अपूरे अक्षर श्रृंखला" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फॉलबॅक '%s' ला कोडसंच '%s' असे रूपांतर करू शकत नाही" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" योजना वापरणारी संपूर्ण URI नाही" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानिक फाइल URI '%s' बहुदा '#' समाविष्टीत करणार नाही" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' अवैध आहे" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' चे यजमान अवैध आहे" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' मध्ये अवैध निसटती अक्षरे समाविष्टीत आहे" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "मार्गनाव '%s' संपूर्ण मार्ग नाही" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "अवैध यजमान" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "म.पू." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "म.नं." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "जानेवारी" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "फेब्रुवारी" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "मार्च" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "एप्रिल" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "मे" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "जून" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "जुलै" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ऑगस्ट" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "सप्टेंबर" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ऑक्टोबर" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "नोव्हेंबर" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "डिसेंबर" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "जाने" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "फेब्रु" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "मार्च" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "एप्रि" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "मे" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "जून" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "जुलै" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ऑग" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "सप्टें" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ऑक्टो" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "नोव्हें" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "डिसें" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "सोमवार" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "मंगळवार" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "मंगळवार" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "गुरुवार" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "शुक्रवार" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "शनिवार" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "रविवार" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "सोम" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "मंगळ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "बुध" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "गुरु" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "शुक्र" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "शनि" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "रवि" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "संचयीका '%s' उघडतेवेळी त्रूटी: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "वाचतायेण्याजोगी फाइल \"%2$s\" करीता %1$lu बाइट वाटप करू शकले नाही" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल वाचताना त्रुटि : %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "फाइल \"%s\" खूप मोठे आहे" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' फाइल वाचतेवेळी त्रूटी: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "फाइल '%s'चे गुणधर्म प्राप्त करण्यास अयशस्वी: fstat() अपयशी: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: fdopen() अपयशी : %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"फाइलला '%s पासून '%s' असे पुनर्नामांकन करण्यास अपयशी: g_rename() अपयशी: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "फाइल बनविण्यास अपयशी '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "लिहण्यासाठी '%s' फाइल उघडण्यास अपयशी: fdopen() अपयशी: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fwrite() अपयशी: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fflush() अपयशी: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइलवर लिहण्यास अपयशी: fsync() अपयशी: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बंद करण्यास अपयशी: fclose() अपयशी: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "उपलब्ध फाइल '%s' काढूण टाकल्या जाऊ शकत नाही: g_unlink() अपयशी: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "आराखडा '%s' अवैध, '%s' समाविष्टीत नसायला हवे" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "आराखडा '%s' मध्ये XXXXXX समाविष्टीत नाही" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "बोधचिन्ह लिंक '%s' वाचण्यास अपयशी: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "बोधचिन्ह लिंक समर्थीत नाही" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' पासून '%s' असे रूपांतरक उघडू शकले नाही: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string वाचता येऊ शकले नाही" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "वाचन बफरमध्ये उर्वरीत बिनरूपांतरीत माहिती" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "अपूरे अक्षर असल्यास मार्ग बंद होते" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end वाचता येऊ शकले नाही" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "शोध संचयीकेत वैध किल्ली फाइल आढळली नाही" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "नियमीत फाइल नाही" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"की फाइल मध्ये ओळ '%s' अंतर्भूत आहे जे की-मुल्य जोड, गट, किंवा टिपप्णी नाही" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "अवैध गट नाव: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "की फाइल गटासह सुरू होत नाही" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "अवैध की नाव: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "की फाइल मध्ये असमर्थित ऐनकोडींग '%s' समाविष्टीत आहे" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "की फाइलमध्ये '%s' गट समाविष्टीत नाही" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "की फाइल मध्ये '%s' की नाही" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"कि फाइल मध्ये '%s' कि समाविष्टीत आहे ज्याचे मुल्य विश्लेषीत करणे अशक्य आहे." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"कि फाइलमध्ये गट '%2$s' मध्ये कि '%1$s' समाविष्टीत आहे ज्याचे मूल्य विश्लेषीत " +"करणे अशक्य आहे." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"गट '%2$s' मधील कि '%1$s' याचे मूल्य '%3$s' आहे, जेथे %4$s अपेक्षित होते" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "गट '%s' मधिल '%s' किल्ली किल्ली फाइल मध्ये समाविष्टीत नाही" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "किल्ली फाइलीत निसटते अक्षर ओळीच्या अखेरस समाविष्टीत आहे" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "किल्ली फाइल मध्ये अवैध '%s' निसटती श्रृंखला समाविष्टीत आहे" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मुल्य '%s' संख्या म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "संख्यात्मक मुल्य '%s' क्षेत्राच्या अंतर्गत नाही" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मुल्य '%s' फ्लोट संख्या म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मुल्य '%s' बूलीयन म्हणून विश्लेषीत केले जाऊ शकत नाही." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "फाइल '%s%s%s%s' चे गुणधर्म प्राप्त करण्यास अपयशी: fstat() अपयशी: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s ला मॅप करण्यास अपयशी: mmap() अपयशी: %s " + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' फाइल उघडण्यास अपयशी: open() अपयशी: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ओळ %d अक्षर %d वर त्रूटी आढळली: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "नावातील अवैध UTF-8 ऐनकोड मजकूर - वैध '%s' नाही" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' वैध नाव नाही " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' वैध नाव नाही: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "ओळ %d वर त्रूटी: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "अक्षर संदर्भ '%-.*s' परवानगीय अक्षरास एनकोड करीत नाही" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"रिकामी वस्तु '&;' आढळली; वैध वस्तू याप्रकारे आहेत: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "घटकाचे नाव '%-.*s' अपरिचीत आहे" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "दस्तऐवजची सुरवात घटकाशी व्हावी (उ.दा. )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' अक्षरानंतर '%s' वैध अक्षर नाही; त्यामुळे घटक नाव सुरू होऊ शकणार नाही" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "असाधारण अक्षर '%1$s', रिकामे-घटक टॅग '%2$s' करीता '>' अक्षर अपेक्षीत" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' असाधारण अक्षर आहे, घटक '%s' च्या '%s' गुणधर्म नावानंतर '=' अपेक्षीत" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' घटक नावानंतर '%s' वैध अक्षर नाही; परवानगीय अक्षर '>' आहे" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "घटक '%s' बंद केले गेले,कुठलेही घटक आता उघडे नाही" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "घटक '%s' बंद केले गेले, पण सद्या '%s' हे घटक उघडे आहे" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "दस्तऐवज रिकामे होते किंवा फक्त रिक्त जागा समाविष्टीत होती" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "उघडे कोन कंस '<' नंतरच दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"घटक उघडे असूनही दस्तऐवज अनपेक्षितरित्या समाप्त झाले - '%s'शेवटचे उगडे घटक होते" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"दस्तऐवज अनपेक्षितरित्या समाप्त झाले, टॅग <%s/> ला बंद करण्याकरीता समाप्तीय " +"कोन कंस " +"उपेक्षीत" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "घटकाच्या नावाअंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "गुणधर्माच्या नावाअंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "घटकाच्या-खुल्या टॅग अंतर्गत दस्तऐवज अनपेक्षितरित्या समाप्त झाले." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"गुणधर्म नावा पाठोपाठ समांतर चिन्हानंतर दस्तऐवज अनपेक्षितरित्या समाप्त झाले; " +"गुणधर्माचे मुल्य " +"नाही" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"गुणधर्म मुल्यच्या अंतर्भूत राहतेवेळी दस्तऐवज अनपेक्षितरित्या समाप्त झाले" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "दस्तऐवज अनपेक्षितरित्या घटक '%s' करीता बंद टॅगच्या आत समाप्त झाले" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"दस्तऐवज अनपेक्षितरित्या टिप्पणी किंवा सुचनाचे विषलेशन करतेवेळी समाप्त झाले" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "वापर:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "माहिती पर्याय:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "मदत पर्याय दार्शवा" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "सर्व मदत पर्याय दर्शवा" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "अनुप्रयोग पर्याय:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s करीता संख्यात्मक मुल्य '%1$s' वाचता आले नाही" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s करीता संख्यात्मक मुल्य '%1$s' क्षेत्राच्या अंतर्गत नाही" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s करीता दुहेरी मुल्य '%1$s' वाचता आले नाही" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s करीता दुहेरी मुल्य '%1$s' क्षेत्राच्या अंतर्गत नाही" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "%s पर्याय वाचतेवेळी त्रूटी" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s करीता बाब आढळले नाही" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "अपरिचीत पर्याय %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "वस्तु भ्रष्ट आहे" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "आंतरीक त्रुटी किंवा भ्रष्ट वस्तु" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "अतिरीक्त स्मृती नाही" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "संयुक्त शोध सीमा पोहचले" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "रचनेत अपूरे जुळवणीकरीता समाविष्टीत घटक जी समर्थित नाही" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "पुनः संदर्भ कारण अपूरे जुळविणीकरीता स्थिती समर्थित नाही" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "पुनःनिर्मीत सीमा पोहचले" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "नविनओळ बाबींचे अवैध संयोग" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "अयोग्य ऑफसेट" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "शार्ट utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "रिकर्शन लूप" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "अपरिचीत त्रुटी" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "रचनाच्या शेवटी \\" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "रचनाच्या शेवटी \\c" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "पाठोपाठ अनोळखी कॅरेक्टर \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} quantifier मधील संख्या क्रमात नाही" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} quantifier मधील संख्या खूप मोठे आहे" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "अक्षर वर्गकरीता समाप्ती ] चिन्ह आढळत नाही" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "अक्षर वर्गामध्ये अवैध एसकेप श्रृंखला" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "अक्षर वर्गातले क्रमाच्या क्षेत्रा पलीकडे गेले आहे" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "पुन्हाकृती करीता काहीच नाही" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "अपरिचीत पुनःकृती" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? किंवा (?- नंतर अनोळखी अक्षर" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX नामांकीत वर्ग फक्त वर्ग अंतर्गत समर्थीत आहे" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "समाप्ती ) आढळले नाही" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "विना-अस्तित्वातील उपरचना करीता संदर्भ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "टिप्पणी नंतर ) आढळले नाही" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "रेग्युलर एक्सप्रेशन खूप मोठे आहे" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "स्मृती प्राप्त करण्यास अपयशी" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ( ला न उघडता" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "कोड उत्प्रवाह" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< नंतर अपरिचीत अक्षर" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind निश्चित आकाराचे नाही" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( नंतर सदोष संख्या किंवा नाव" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "स्थिती समुह मध्ये एका पेक्षा जास्त शाखा आहेत" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R किंवा (?[+-]अंक पाठोपाठ ) असायला पाहिजे" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "अपरिचीत POSIX वर्ग नाव" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX कोलेटींग घटक समर्थीत नाही" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} श्रृंखला मधिल अक्षर मूल्य खूप मोठे आहे" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "अवैध स्थिती (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind assertion अंतर्गत स्वीकार्य नाही" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "एक्सेप्स् \\L, \\l, \\N{name}, \\U, व \\u समर्थीत नाही" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "recursive call चक्र अनिश्चितरित्या चालू राहू शकते" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P नंतर अपरिचीत अक्षर" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "उपरचना नावा मध्ये समाप्ती आढळली नाही" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "दोन नामांकीत उपरचनाकडे समान नाव आहे" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "सदोषीत \\P किंवा \\p श्रृंखला" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P किंवा \\p नंतर अपरिचीत गुणधर्म नाव" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "उपरचना नाव खूपच लांब आहे (कमाल 32 अक्षरे)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "खूपच नामांकीत उपरचना आहेत (कमाल 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "ऑक्टल मूल्य \\377 पेक्षा जास्त आहे" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "उत्पकार्यन्वीत कंपाइल कार्यस्थळ" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "पूर्वी-तपासलेले संदर्भीत उपरचना आढळले नाही" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE समुहात एका पेक्षा जास्त शाखा आहे" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "अस्थीर NEWLINE पर्याय" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"ब्रेस्ड्, अँगल-ब्रॅकेटेड्, किंवा क्वोटेड् नाव किंवा क्रमांक, किंवा सोपे " +"क्रमांक पाठोपाठ \\g येत " +"नाही" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "नंबर्ड् संदर्भ झिरो असयला हवे" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" +"(*ACCEPT), (*FAIL), किंवा (*COMMIT) करीता आर्ग्युमेंटकरीता परवानगी नाही" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ओळखीचे नाही" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "क्रमांक खूपच मोठे आहे" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& नंतर उपपॅटर्न नाव आढळले नाही" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ नंतर अंक अपेक्षित आहे" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "जावास्क्रिप्ट सहत्वता मोडमध्ये ] हे अवैध डाटा अक्षर आहे " + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "एकाच क्रमांकाच्या उपरचनाकरीता विविध नावे स्वीकारले जात नाही" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) कडे आर्ग्युमेंट असणे आवश्यक" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "ASCII अक्षराच्या पाठोपाठ \\c असायला हवे" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "ब्रेस्ड्, अँगल-ब्रॅकेटेड्, किंवा क्वोटेड् नाव पाठोपाठ \\k येत नाही" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N क्लास अंतर्गत समर्थीत नाही" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "फॉरवर्ड रेफरेंस एक किंवा त्यापेक्षा जास्त आहे" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), किंवा (*THEN) मध्ये नाव खूपच लांब आहे " + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... श्रृंखला अंतर्गत कॅरेक्टर मूल्य खूप मोठे आहे" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "रेगुलर एक्सप्रेशन %s जुळवणी करतेवेळी त्रूटी: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE लायब्ररी बिना UTF8 समर्थन कंपाईल केले गेले" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE लायब्ररी बिना UTF8 गुणधर्म समर्थन कंपाईल केले गेले" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE लायब्ररी असहत्व पर्यायसह कंपाइल केले" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"अक्षर %2$d वरील रेगुलर एक्सप्रेशन %1$s जुळवणी कंपाईल करतेवेळी त्रूटी: %3$s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "रेगुलर एक्सप्रेशन %s अधिक कार्यक्षम करतेवेळी त्रूटी: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "हेक्जाडेसीमल अंक किंवा '}' अपेक्षीत" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "क्जाडेसीमल अंक अपेक्षीत" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "बोधचिन्ह संदर्भात '<' आढळले नाही" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "अपूरे बोधचिन्ह संदर्भ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "शून्य-लांबीचे बोधचिन्ह संदर्भ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "अंक अपेक्षीत" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "अवैध बोधचिन्ह संदर्भ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "अंतिम '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "अपरिचीत निसटती श्रृंखला" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "अक्षर %2$lu वरील बदलाव पाठ्य \"%1$s\" वाचतेवेळी त्रूटी: %3$s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "क्वोट मध्ये असलेले पाठ्य क्वोटेशन चिन्हापासून सुरू होत नाही" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "आदेश ओळ किंवा इतर शेल-क्वोट पाठ्य मध्ये बिनजुळलेली क्वोटेशन चिन्ह" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ्य '\\' अक्षर संपल्यावर संपते. ('%s' पाठ्य होते)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"%c करीता जुळते क्वोट आढळण्यापूर्वी पाठ्य समाप्त झाले. ('%s' पाठ्य होते)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ्य रिकामे होते (किंवा त्यात फक्त रिक्त जागा समाविष्टीत होते)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "उप कार्य पासून वाचतेवेळी त्रूटी आढळली (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"उप कार्य (%s) पासून माहिती वाचतेवेळी select() मध्ये अपरिचीत त्रूटी आढळली" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मध्ये अपरिचीत त्रूटी आढळली" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "कोड %ld सह चाइल्ड प्रोसेस् बंद झाली" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "सिग्नल %ld तर्फे चाइल्ड प्रोसेस नष्ट झाली" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "सिग्नल %ld तर्फे चाइल्ड प्रोसेस बंद झाली" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "चाइल्ड प्रोसेस् अनपेक्षितरित्या बंद झाले" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "उप कार्य (%s) पासून वाचतेवेळी त्रूटी" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) विभाजीत करण्यास अपयशी" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' संचयीकेत बदल करण्यास अपयशी (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "उप कार्य \"%s\" कार्यान्वीत करण्यास अपयशी (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "उप कार्य (%s) चे प्रदान किंवा आगत परत पाठवू शकले नाही" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "उप कार्य (%s) चे विभाजन करण्यास अपयशी" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "उप कार्य \"%s\" कार्यान्वीत करतेवेळी त्रूटी" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "उप pid पाईप (%s) पासून वाचतेवेळी त्रूटी" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "उप कार्य पासून संभाषाणाकरीता पाईप बनविण्यास अपयशी (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "उप कार्य पासून माहिती वाचतेवेळी त्रूटी" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "उप कार्य (%s) कार्यान्वीत करतेवेळी त्रूटी" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध कार्यक्रम नाव: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%1$d वरील बाबी वेक्टर मध्ये अवैध अक्षरमाळा: %2$s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणात अवैध अक्षरमाळा: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्यक्षम संचयीका: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "मदतीय कार्यक्रम कार्यान्वीत करण्यास अपयशी (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"g_io_channel_win32_poll() मध्ये उप कार्य पासून माहिती वाचतवेली अपरिचीत त्रूटी " +"आढळली" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 करीता अक्षर क्षेत्राच्या अंतर्गत नाही" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "रूपांतर आगत मध्ये अवैध श्रृंखला" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 करीता अक्षर क्षेत्राच्या अंतर्गत नाही" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u बाइट" +msgstr[1] "%u बाइटस्" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s बाइट" +msgstr[1] "%s बाइटस्" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "आदेश ओळ `%s': %s स्पॅनकरतेवेळी अयोग्य प्रोग्राम टर्मिनेशन" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "आदेश ओळ `%s' नॉन-झिरो एक्जिट स्टेटस %d: %s सह बाहेर पडले" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' करीता सर्व्हीस रेकॉर्ड आढळले नाही" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "कार्यक्षेत्र सीमा रिक्त उपअक्षरओळीकरीता पोहचले" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "case-changing escapes (\\l, \\L, \\u, \\U) चा वापर येथे शक्य नाही" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE समुहचे पुनःकृती करू शकत नाही" + +#~ msgid "File is empty" +#~ msgstr "फाइल रिकामी आहे" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "किल्ली फाइल मध्ये '%1$s' किल्ली समाविष्टीत आहे ज्याचे मुल्य विश्लेषीत केल्या जाऊ शकत " +#~ "नाही." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "फाइल '%s' सुरू करतेवेळी त्रूटी: %s" + +#~ msgid "Error connecting: " +#~ msgstr "जुळवणीवेळी त्रुटी: " + +#~ msgid "Error connecting: %s" +#~ msgstr "जुळवणीवेळी त्रुटी: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix पासून वाचतेवेळी त्रूटी: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix बंद करतेवेळी त्रूटी: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unixकरीता लिहितेवेळी त्रूटी: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "संचयीकेवर संचयीका हलवू शकत नाही" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "प्रकार %s वर्गीकृत केले गेले नाही" diff --git a/po/ms.po b/po/ms.po new file mode 100644 index 0000000..53af12a --- /dev/null +++ b/po/ms.po @@ -0,0 +1,3814 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2004-02-03 02:11+0730\n" +"Last-Translator: Hasbullah Bin Pit \n" +"Language-Team: Projek Gabai \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Aksara ganjil '%s', dijangkakan '=' selepas nama atribut '%s' unsur '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, 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:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Sebahagian turutan aksara berada di penghujung input" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Tak dapat tukar unduran '%s' ke set kod '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI Fail local '%s' mungkin tidak disertakan dengan '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' adalah tidak sah" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Namahos URI '%s' tidak sah" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' mengandungi aksara escaped yang tidak sah" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Nama laluan '%s' adalah bukan laluan mutlak" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Namahos tidak sah" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Januari" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Februari" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Mac" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Jun" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Julai" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mac" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mei" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Isnin" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Selasa" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Rabu" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Khamis" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Jumaat" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sabtu" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Ahad" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Isn" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Sel" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Rab" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Kha" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Jum" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sab" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ahd" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Gagal membaca fail '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Gagal membuka fail '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Templet '%s' tidak sah, sepatutnya tidak mengandungi '%s'" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Templet '%s' tidak berakhir dengan XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Gagal membuka fail '%s': fdopen() gagal: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Ralat pada baris %d aksara %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Teks terenkod UTF-8 tidak sah" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Ralat pada baris %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entiti kosong '&;' kelihatan; entiti sah ialah : & " < > " +"'" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nama entiti '%s' tidak diketahui" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumen mesti dimulakan dengan unsur (e.g. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Unsur '%s' telah ditutup, tiada unsur yang dibuka" + +#: ../glib/gmarkup.c:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumen kosong atau hanya menandungi ruangputih" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumen berakhir tanpa diduga sebaik selepas membuka '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama unsur" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama atribut" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumen berakhir tanpa diduga di dalam tag element-opening" + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumen berakhir tanpa diduga semasa di dalam nilai atribut" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumen berakhir tanpa diduga di dalam komen atau memproses arahan" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Saluran terhenti pada sebahagian aksara" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Rujukan aksara tidak tamat" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Rujukan aksara tidak tamat" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Rujukan aksara tidak tamat" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Rujukan entiti tidak tamat" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teks dipetik tidak bermula dengan tanda petikan" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teks telah kosong (atau mengandungi hanya ruangputih)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Gagal membaca data daripada proses anak" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Gagal membaca daripada paip anak (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Gagal menukar direktori '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Gagal melaksanakan proses anak (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Namahos tidak sah" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Turutan tidak sah semasa penukaran input" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Gagal melaksanakan program pembantu" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Gagal membaca data daripada proses anak (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ralat tanpa diduga pada waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Gagal untuk sepit (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Gagal melaksanakan proses anak \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Gagal menyepit proses anak (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ralat misteri ketika melaksanakan proses anak \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Aksara di luar julat UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Turutan tidak sah semasa penukaran input" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Aksara di luar julat UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Namahos tidak sah" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Namahos tidak sah" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' mengandungi aksara escaped yang tidak sah" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Turutan byte tidak sah pada penukaran iput" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Ralat pada baris %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Aksara '%s' adalah tidak sah di dalam nama entiti" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Aksara '%s' adalah tidak sah di dalam nama entiti" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Aksara '%s' adalah tidak sah di dalam nama entiti" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Ralat membuka direktori %s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Namahos tidak sah" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Namahos tidak sah" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Gagal membaca pautan simbolik '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Dokumen berakhir tanpa diduga di dalam nama atribut" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Ralat membuka direktori %s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Ralat pada baris %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Namahos tidak sah" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Tak dapat memperuntukkan %lu byte untuk membaca fail \"%s\"" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Gagal mencipta fail %s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Ralat pada baris %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Ralat semasa penukaran: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Pautan simbolik tidak disokong" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Ralat membaca fail '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/nb.po new file mode 100644 index 0000000..ca529db --- /dev/null +++ b/po/nb.po @@ -0,0 +1,4339 @@ +# Norwegian bokmÃ¥l translation of glib. +# Copyright (C) 2001-2003, 2005 Free Software Foundation, Inc. +# Kjartan Maraas , 2001-2013. +# Terance Edward Sola , 2005. +# Torstein Adolf Winterseth , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.35.x\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-01-29 19:36+0100\n" +"PO-Revision-Date: 2013-01-29 19:36+0100\n" +"Last-Translator: Kjartan Maraas \n" +"Language-Team: Norwegian bokmÃ¥l \n" +"Language:\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Tellerverdi gitt til %s er for stor" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Søk er ikke støttet pÃ¥ grunnstrøm" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Kan ikke avkorte GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Strømmen er allerede lukket" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Avkorting er ikke støttet pÃ¥ grunnstrøm" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Operasjonen ble avbrutt" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Ugyldig objekt, ikke initiert" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Ugyldig multibytesekvens i inndata" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Ikke nok plass i mÃ¥l" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Feil under konvertering: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Avbrytbar initiering er ikke støttet" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertering fra tegnsett «%s» til «%s» er ikke støttet" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunne ikke Ã¥pne program for Ã¥ konvertere fra «%s» til «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "type %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Ukjent type" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "filtype %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials er ikke implementert pÃ¥ dette OSet" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Det finnes ingen støtte for GCredentials for din plattform" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials har ikke en prosess-ID pÃ¥ dette OSet" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventet tidlig slutt pÃ¥ strøm" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Ikke støttet nøkkel «%s» i adresseoppføring «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adressen «%s» er ugyldig (trenger eksakt en av følgende: sti, tmpdir eller " +"abstrakte nøkler)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Meningsløst nøkkel-/verdi-par i adresseoppføring «%s»" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Feil i adresse «%s» - portattributten er feilutformet" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Feil i adresse «%s» - familieattributten er feilutformet" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adresseelement «%s» inneholder ikke et kolon (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Nøkkel/verdi-par %d, «%s», i adresseelement «%s» inneholder ikke et " +"likhetstegn" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Feil ved unescaping av nøkkel eller verdi i nøkkel/verdi par %d, «%s», i " +"adresseelement «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Feil i adresse «%s» - unix-transport krever at eksakt en av nøklene «path» " +"eller «abstract» er satt" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Feil i adresse «%s» - vertsattributt mangler eller er feilutformet" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Feil i adresse «%s» - portattributt mangler eller er feilutformet" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Feil i adresse «%s» - noncefil-attributt mangler eller er feilutformet" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Feil under automatisk oppstart: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Ukjent eller ikke støttet transport «%s» for adresse «%s»" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Feil under Ã¥pning av nonce-fil «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Feil under lesing fra nonce-fil «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Feil under lesing fra nonce-fil «%s», forventet 16 bytes, fikk %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Feil under skriving av innhold i nonce-fil «%s» til strøm:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Gitt adresse er tom" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Kan ikke starte en meldingsbuss med setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Kan ikke starte en meldingsbuss uten en machine-id: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Feil under start av kommandolinje «%s»: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Trykk en tast for Ã¥ lukke dette vinduet)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "D-Bus for økten kjører ikke og automatisk start feilet" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Kan ikke bestemme adresse til øktbussen (ikke implementert pÃ¥ dette OSet)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Kan ikke bestemme adresse for buss fra miljøvariabelen DBUS_STARTER_BUS_TYPE " +"- ukjent verdi «%s»" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Kan ikke bestemme adressen til bussen fordi miljøvariabelen " +"DBUS_STARTER_BUS_TYPE ikke er satt" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Ukjent type buss %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Uventet mangel pÃ¥ innhold ved forsøk pÃ¥ Ã¥ lese en linje" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Uventet mangel pÃ¥ innhold ved forsøk pÃ¥ Ã¥ lese en linje pÃ¥ trygg mÃ¥te" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Brukte opp alle tilgjengelige autentiseringsmekanismer (forsøkt: %s) " +"(tilgjengelig: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Avbrutt via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Feil under henting av informasjon for katalog «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Rettigheter for katalog «%s» er feilutformet. Forventet modus 0700, fikk 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Feil under oppretting av katalog «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Feil under Ã¥pning av nøkkelring «%s» for lesing: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Linje %d av nøkkelring ved «%s» med innhold «%s» er feilutformet" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Første symbol pÃ¥ linje %d av nøkkelring ved «%s» med innhold «%s» er " +"feilutformet" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Andre symbol av linje %d i nøkkelring ved «%s» med innhold «%s» er " +"feilutformet" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Fant ingen informasjonskapsel med id %d i nøkkelring ved «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Feil under sletting av gammel lÃ¥sfil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Feil under oppretting av lÃ¥sfil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Feil under lukking av (unlink()et) lÃ¥sfil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Feil under unlink()ing av lÃ¥sfil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Feil under Ã¥pning av nøkkelring «%s» for skriving: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(I tillegg feilet frislipp av lÃ¥s for «%s» ogsÃ¥: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Tilkoblingen er lukket" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Tidsavbrudd ble nÃ¥dd" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Ikke støttede flagg funnet ved oppretting av en klientside tilkobling" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Grensesnitt «org.freedesktop.DBus.Properties» finnes ikke pÃ¥ objekt i sti %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Feil ved setting av egenskap «%s»: Forventet type «%s», men fikk «%s»" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Egenskap «%s» finnes ikke" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Egenskap «%s» er er ikke lesbar" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Egenskap «%s» er er ikke skrivbar" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Grensesnitt «%s» finnes ikke" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Grensesnittet finnes ikke" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Grensesnitt «%s» finnes ikke pÃ¥ objektsti %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Metoden «%s» finnes ikke" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Type melding, «%s», stemmer ikke overens med forventet type «%s»" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Et objekt er allerede eksportert for grensesnitt %s ved %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metode «%s» returnerte type «%s», men forventet «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metode «%s» pÃ¥ grensesnitt «%s» med signatur «%s» eksisterer ikke" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Et undertre er allerede eksportert for %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "UGYLDIG type" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL melding: Topptekstfelt PATH eller MEMBER mangler" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN melding: Topptekstfelt REPLY_SERIAL mangler" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR melding: Topptekstfelt REPLY_SERIAL eller ERROR_NAME mangler" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL melding: Topptekstfelt for PATH, INTERFACE eller MEMBER mangler" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL-melding: Topptekstfelt for PATH bruker reservert verdi /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL melding: Topptekstfelt for INTERFACE bruker reservert verdi org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Ønsket Ã¥ lese %lu byte men fikk bare %lu" +msgstr[1] "Ønsket Ã¥ lese %lu bytes men fikk bare %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Forventet NUL-byte etter strengen «%s», men fant byte %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Forventet en gyldig UTF-8 streng, men fant ugyldige bytes ved byteavstand %d " +"(lengden av strengen er %d). Gydldig UTF-8 streng opp til det punktet var " +"«%s»" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Lest verdi «%s» er ikke en gyldig objektsti for D-Bus" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Tolket verdi «%s» er ikke en gyldig D-Bus-signatur" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Fant en array med lengde %u byte. Maksimal lengde er 2<<26 byte (64 MiB)." +msgstr[1] "" +"Fant en array med lengde %u bytes. Maksimal lengde er 2<<26 byte (64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Lest verdi «%s» for variant er ikke en gyldig D-Bus-signatur" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Feil ved deserialisering av GVariant med strengtype «%s» fra D-Bus-format" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Ugyldig verdi for endianness. Forventet 0x6c ('l') eller 0x42 ('B'), men " +"fant verdien 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Ugyldig hovedversjon for protokoll. Forventet en men fikk %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Signaturtopptekst med signatur «%s» funnet, men meldingskroppen er tom" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Lest verdi «%s» er ikke en gyldig D-Bus-signatur (for kropp)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Ingen signaturtopptekst i meldingen, men meldingskroppen er %u byte" +msgstr[1] "" +"Ingen signaturtopptekst i meldingen, men meldingskroppen er %u bytes" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Kan ikke deserialisere melding: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Feil ved serialisering av GVariant med strengtype «%s» til D-Bus-format" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Meldingen har %d fildeskriptorer men topptekstfeltet indikerer %d " +"fildeskriptorer" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Kan ikke serialisere melding: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Meldingskroppen har signatur «%s» men det finnes ingen signaturtopptekst" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Meldingskroppen har signaturtype «%s», men signaturen i topptekstfeltet et " +"«%s»" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Meldingskroppen er tom men signatur i topptekstfeltet er «(%s)»" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Feil retur med kropp av type «%s»" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Feil retur med tom kropp" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Kan ikke hente maskinvareprofil: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Kan ikke laste /var/lib/dbus/machine-id eller /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Feil ved kall til StartServiceByName for %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Uventet svar %d fra metoden StartServiceByName(«%s»)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Kan ikke invokere metode; proxy er for et velkjent navn uten en eier og " +"proxy ble opprettet med flagget G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "Abstrakt navneomrÃ¥de er ikke støttet" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "Kan ikke oppgi nonce-fil nÃ¥r en tjener opprettes" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Feil under skriving av nonce-fil i «%s»: %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Strengen «%s» er ikke en gyldig D-Bus-GUID" + +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Kan ikke lytte pÃ¥ ikke-støttet transport «%s»" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "KOMMANDO" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Kommandoer:\n" +" help Viser denne informasjonen\n" +" introspect Introspekt et eksternt objekt\n" +" monitor OvervÃ¥k et eksternt objekt\n" +" call Kjør en metode pÃ¥ et eksternt objekt\n" +" emit Send ut et signal\n" +"\n" +"Bruk «%s COMMAND --help» for Ã¥ fÃ¥ hjelp om hver kommando.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Feil: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Feil under tolking av introspeksjons-XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Koble til systembussen" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Koble til øktbussen" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Koble til gitt D-Bus-adresse" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Alternativer for tilkoblingssluttpunkt:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Alternativer som spesifiserer sluttpunkt for tilkobling" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Sluttpunkt for tilkobling ikke oppgitt" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Flere sluttpunkt oppgitt for tilkobling" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Advarsel: I følge introspeksjonsdata eksisterer ikke grensesnitt «%s»\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Advarsel: I følge introspeksjonsdata eksisterer ikke metode «%s» pÃ¥ " +"grensesnitt «%s»\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Valgfri destinasjon for signal (unikt navn)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Objektsti signal skal sendes ut pÃ¥" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Navn pÃ¥ signal og grensesnitt" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Send ut et signal." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Feil under tilkobling: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Feil: Objektsti er ikke oppgitt.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Feil: %s er ikke en gyldig objektsti\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Feil: signal er ikke oppgitt.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Feil: signalet mÃ¥ være et full-kvalifisert navn.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Feil: %s er ikke en gyldig navn pÃ¥ grensesnitt\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Feil: %s er ikke et gyldig medlemsnavn\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Feil: %s er ikke et gyldig unikt bussnavn.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Feil under tolking av parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Feil ved nullstilling av tilkobling: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "MÃ¥lnavn metoden skal invokeres pÃ¥" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Objektsti metoden skal invokeres pÃ¥" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Navn pÃ¥ metode og grensesnitt" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Tidsavbrudd i sekunder" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Kjør en metode pÃ¥ et eksternt objekt." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Feil: MÃ¥l er ikke oppgitt\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Feil: Objektsti er ikke oppgitt\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Feil: metodenavn er ikke oppgitt\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Feil: metodenavn «%s» er ugyldig\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Feil under tolking av parameter %d av type «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "MÃ¥lnavn som skal inspiseres" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Objektsti som skal inspiseres" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Skriv ut XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Bruk introspeksjon for barn" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Skriv kun ut egenskaper" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Inspiser et eksternt objekt." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Navn pÃ¥ mÃ¥l som skal overvÃ¥kes" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Objektsti som skal overvÃ¥kes" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "OvervÃ¥k et eksternt objekt." + +#: ../gio/gdesktopappinfo.c:594 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Uten navn" + +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop-filen hadde ingen verdi i Exec-feltet" + +#: ../gio/gdesktopappinfo.c:1295 +msgid "Unable to find terminal required for application" +msgstr "Kan ikke finne terminalen som kreves for programmet" + +#: ../gio/gdesktopappinfo.c:1597 +#, 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:1601 +#, 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:1841 ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "Programinformasjonen mangler en identifikator" + +#: ../gio/gdesktopappinfo.c:2097 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikke opprette brukers desktop-fil %s" + +#: ../gio/gdesktopappinfo.c:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Egendefinert definisjon for %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "stasjonen implementerer ikke eject eller eject_with_operation" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "stasjonen implementerer ikke sjekk om medie er satt inn" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "stasjonen implementerer ikke start" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "stasjonen implementerer ikke stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-støtte er ikke tilgjengelig" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GEmblem-koding" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Feil antall tegn (%d) i GEmblem-koding" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GEmblemedIcon-koding" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Feil antall tegn (%d) i GEmblemedIcon-koding" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Ventet et GEmblem for GEmblemedIcon" + +#: ../gio/gfile.c:917 ../gio/gfile.c:1156 ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 ../gio/gfile.c:1590 ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 ../gio/gfile.c:1789 ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 ../gio/gfile.c:3468 ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 ../gio/gfile.c:3711 ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 ../gio/gfile.c:4610 ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 ../gio/gfile.c:4884 ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 ../gio/gfile.c:5536 ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 ../gio/gfile.c:7225 ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "Omsluttende monteringspunkt finnes ikke" + +#: ../gio/gfile.c:2474 ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Kan ikke kopiere over katalog" + +#: ../gio/gfile.c:2534 +msgid "Can't copy directory over directory" +msgstr "Kan ikke kopiere katalog over katalog" + +#: ../gio/gfile.c:2542 ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "MÃ¥lfilen eksisterer" + +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Kan ikke kopiere katalog rekursivt" + +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Splice er ikke støttet" + +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Feil ved bruk av splice(2) pÃ¥ fil: %s" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Kopiering (reflink/clone) mellom monteringspunkter er ikke støttet" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Kopiering (reflink/clone) er ikke støttet eller ugyldig" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Kopiering (reflink/clone) er ikke støttet eller virket ikke" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Kan ikke kopiere spesiell fil" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "Ugyldig verdi oppgitt for symbolsk lenke" + +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "Papirkurv er ikke støttet" + +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnavn kan ikke inneholde «%c»" + +#: ../gio/gfile.c:6258 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "volumet implementerer ikke montering" + +#: ../gio/gfile.c:6367 +msgid "No application is registered as handling this file" +msgstr "Ingen program registrert for Ã¥ hÃ¥ndtere denne filen" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumerator er lukket" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Filenumerator har utestÃ¥ende operasjon" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Strømmen støtter ikke query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Søking ikke støttet pÃ¥ strøm" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Avkorting er ikke tillatt pÃ¥ en inndatastrøm" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Avkorting er ikke støttet pÃ¥ strømmen" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Feil antall tegn (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen type for klassenavn %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Type %s implementerer ikke GIcon-grensesnittet" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s er er ikke en klasse" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Feil versjonsnummer: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Kan ikke hÃ¥ndtere oppgitt versjon i ikon-koding" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Ingen adresse oppgitt" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Lengde %u er for lang for adressen" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adressen har biter satt forbi lengde pÃ¥ prefiks" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Kunne ikke lese «%s» som IP-adressemaske" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Ikke nok plass til adresse for plugg" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Adresse for plugg er ikke støttet" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Strømmen har utestÃ¥ende operasjoner" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> er ikke tillatt inne i <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> er ikke tillatt pÃ¥ toppnivÃ¥" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Filen %s finnes flere ganger i ressursen" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Klarte ikke Ã¥ finne «%s» i noen kildekatalog" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Klarte ikke Ã¥ finne «%s» i aktiv katalog" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Ukjente flagg for preprosessering «%s»" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Klarte ikke Ã¥ opprette midlertidig fil: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Feil ved prosessering av inndatafil med xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Feil ved prosessering av inndatafil med to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Feil ved lesing av fil %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Feil ved komprimering av fil %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "tekst kan ikke forekomme inne i <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "navn pÃ¥ utdatafil" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FIL" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Kataloger filene skal leses fra (aktiv katalog er forvalgt)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "KATALOG" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Lag utdata i formatet som er valgt for mÃ¥lets filtype" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Lag hode for kildekode" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Lag kildekode som skal brukes til Ã¥ lenke inn ressursfilen i din kode" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Lag listet med avhengigheter" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Ikke lag og registrer ressursen automatisk" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Ikke ekporter funksjoner. Deklarer dem som G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Navn pÃ¥ C-identifikator som brukes for generert kildekode" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompiler en ressursspesifikasjon til en ressursfil.\n" +"Ressursspesifikasjonsfiler har type .gresource.xml,\n" +"og ressufsfilen har etternavn .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Du mÃ¥ kun oppgi ett filnavn\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "tomme navn er ikke tillatt" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ugyldig navn «%s»: navn mÃ¥ starte med liten bokstav" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"ugyldig navn «%s»: ugyldig tegn «%c»; kun smÃ¥ bokstaver, tall og bindestrek " +"(«-») er tillatt." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"ugyldig navn «%s»: to etterfølgende bindestreker («--») er ikke tillatt." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "ugyldig navn «%s»: siste tegn kan ikke være en bindestrek («-»)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ugyldig navn «%s»: maksimal lengde er 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " allerede oppgitt" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "kan ikke legge til nøkler i et «list-of»-schema" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " allerede oppgitt" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" overskygger i ; bruk " +" for Ã¥ endre verdien" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"eksakt en av 'type', 'enum' eller 'flags' mÃ¥ oppgis som en attributt for " +"" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'>ikke definert ennÃ¥." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ugyldig GVariant-typestreng «%s»" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " ble gitt men schema utvider ingenting" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "ingen Ã¥ overstyre" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " allerede oppgitt" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " allerede oppgitt" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " utvider et ikke-eksisterende schema '%s'" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " er en liste med ikke-eksisterende schema «%s»" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Kan ikke være en liste av et schema med en sti" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Kan ikke utvide et schema med en sti" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" er en liste som utvider som ikke er en " +"liste" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" utvider men '%s' " +"utvider ikke '%s'" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "hvis en sti oppgis mÃ¥ denne begynne med «slash»" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "stien for en liste mÃ¥ slutte med «:/»" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id=«%s»> er allerede spesifisert" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> er ikke tillatt pÃ¥ toppnivÃ¥" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict ble oppgitt; avslutter.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Hele filen ble ignorert.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorerer denne filen.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "Ingen nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil «%s»" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorerer overstyring for denne nøkkelen.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " og --strict ble oppgitt; avslutter.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"feil ved lesing av nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil " +"«%s»: %s. " + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorerer overstyring for denne nøkkelen.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er utenfor " +"omrÃ¥det som er oppgitt i skjema" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er ikke i " +"listen med gyldige valg" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled filen lagres her" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Avbryt ved feil i schema" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Ikke skriv filen gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Ikke sett restriksjoner pÃ¥ navn pÃ¥ nøkler" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompiler alle GSettings-skjemafiler til et mellomlager for skjema.\n" +"Skjemafiler mÃ¥ ha type .gschema.xml, og mellomlagerfilen\n" +"kalles gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Du mÃ¥ kun oppgi navn pÃ¥ én katalog\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Ingen schema-filer funnet: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "gjør ingenting.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "fjernet eksisterende utdatafil.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Klarte ikke Ã¥ finne forvalgt type overvÃ¥ker for lokal katalog" + +#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldig filnavn %s" + +#: ../gio/glocalfile.c:974 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Feil under lesing av informasjon om filsystem: %s" + +#: ../gio/glocalfile.c:1142 +msgid "Can't rename root directory" +msgstr "Kan ikke endre navn pÃ¥ rotkatalogen" + +#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Feil under endring av navn pÃ¥ fil: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Kan ikke endre navn pÃ¥ filen. Filnavnet eksisterer allerede" + +#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "Ugyldig filnavn" + +#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Kan ikke Ã¥pne mappe" + +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Feil under Ã¥pning av fil: %s" + +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Feil ved fjerning av fil: %s" + +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Feil ved plassering av fil i papirkurv: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan ikke legge katalog %s i papirkurven: %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan ikke finne toppnivÃ¥ for papirkurv" + +#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023 +msgid "Unable to find or create trash directory" +msgstr "Kan ikke finne eller opprette mappe for papirkurv" + +#: ../gio/glocalfile.c:2057 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan ikke opprette informasjonsfil for papirkurv: %s" + +#: ../gio/glocalfile.c:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan ikke legge fil i papirkurven: %s" + +#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280 +msgid "internal error" +msgstr "intern feil" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Feil under oppretting av katalog: %s" + +#: ../gio/glocalfile.c:2234 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet støtter ikke symbolske lenker" + +#: ../gio/glocalfile.c:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Feil ved oppretting av symbolsk lenke: %s" + +#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Feil under flytting av fil: %s" + +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Kan ikke flytte katalog over katalog" + +#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Oppretting av sikkerhetskopi feilet" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Feil under fjerning av mÃ¥lfil: %s" + +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Flytting mellom monteringspunkter er ikke støttet" + +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "Attributtverdi mÃ¥ ikke være NULL" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig type attributt (streng forventet)" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Ugyldig navn pÃ¥ utvidet attributt" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Feil under setting av utvidet attributt «%s»: %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (ugyldig koding)" + +#: ../gio/glocalfileinfo.c:1740 ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Feil ved henting av informasjon for fil «%s»: %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Feil ved henting av informasjon om fildeskriptor: %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig type attributt (uint32 forventet)" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig type attributt (uint64 forventet)" + +#: ../gio/glocalfileinfo.c:2068 ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig type attributt (byte-streng forventet)" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Kan ikke sette rettigheter pÃ¥ symbolske lenker" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Feil ved setting av rettigheter: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Feil ved setting av eier: %s" + +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "symbolsk lenke kan ikke være NULL" + +#: ../gio/glocalfileinfo.c:2222 ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Feil ved setting av symbolsk lenke: %s" + +#: ../gio/glocalfileinfo.c:2231 +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:2357 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Feil ved setting av endrings- eller aksesstid: %s" + +#: ../gio/glocalfileinfo.c:2380 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontekst kan ikke være NULL" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Feil ved setting av SELinux-kontekst: %s" + +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux er ikke slÃ¥tt pÃ¥ pÃ¥ dette systemet" + +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Støtter ikke Ã¥ sette attributt %s" + +#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Feil under lesing fra fil: %s" + +#: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Feil under søking i fil: %s" + +#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Feil under lukking av fil: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Kan ikke finne forvalgt lokal filovervÃ¥kingstype" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Feil under skriving til fil: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Feil ved fjerning av gammel sikkerhetskopi av lenke: %s" + +#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Feil under oppretting av sikkerhetskopi: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Feil ved endring av navn pÃ¥ midlertidig fil: %s" + +#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Feil under avkorting av fil: «%s»" + +#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Feil under Ã¥pning av fil «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen er en katalog" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen er ikke en vanlig fil" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "Filen ble endret eksternt" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Feil ved fjerning av gammel fil: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType oppgitt" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Ugyldig søkeforespørsel" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikke avkorte GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Kan ikke endre størrelse pÃ¥ utdatastrøm for minne" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Klarte ikke Ã¥ endre størrelse pÃ¥ utdatastrøm for minne" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Forespurt søk før begynnelsen pÃ¥ strømmen" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount implementerer ikke synkron gjetting av innholdstype" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Vertsnavn «%s» inneholder «[» men ikke «]»" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Nettverk kan ikke nÃ¥s" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Kan ikke nÃ¥ vert" + +#: ../gio/gnetworkmonitornetlink.c:98 ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Kunne ikke lage nettverksovervÃ¥ker: %s" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "Kunne ikke lage nettverksovervÃ¥ker: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Kunne ikke hente nettverksstatus: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Ut-strømmen implementerer ikke skriving" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Kildestrømmen er allerede lukket" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Ressurs ved «%s» eksisterer ikke" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Ressursen ved «%s» kunne ikke dekomprimeres" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Ressurs ved «%s» er ikke en katalog" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Inndatastrøm implementerer ikke søk" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Skriv ut hjelp" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[KOMMANDO]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Vis seksjoner som inneholder ressurser i en elf FIL" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Vis ressurser\n" +"Hvis SEKSJON oppgis skal kun ressurser i denne seksjonen vises\n" +"Hvis STI oppgis skal kun relevante ressurser vises" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FIL [STI]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SEKSJON" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Vis ressurser med detaljer\n" +"Hvis SEKSJON oppgis skal kun ressurser i denne seksjonen vises\n" +"Hvis STI oppgis vises kun relevante ressurser\n" +"Detaljer inkluderer seksjon, størrelse og komprimering" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Hent ut en ressursfil til stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "STI TIL FIL" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Ukjent kommando «%s»\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Bruk:\n" +" gresource [--section SEKSJON] KOMMANDO [ARGUMENTER …]\n" +"\n" +"Kommandoer:\n" +" help Vis denne informasjonen\n" +" sections Vis ressursseksjoner\n" +" list Vis ressurser\n" +" details Vis ressurser med detaljer\n" +" extract Hent ut en ressurs\n" +"\n" +"Bruk «gresource help KOMMANDO» for Ã¥ fÃ¥ detaljert hjelp.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Bruk:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumenter:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKSJON Et valgfritt navn pÃ¥ en elf seksjon\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMMANDO Valgfri kommando som skal forklares\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FIL En elf-fil. Binærfil eller delt bibliotek\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FIL En elf-fil - binær eller delt bibliotek\n" +" eller en kompilert ressursfil\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[STI]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " STI En valgfri ressurssti - kan være ufullstendig\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "STI" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " STI En ressurssti\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Skjema «%s» finnes ikke\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Skjema «%s» er ikke omplasserbar (stien mÃ¥ ikke oppgis)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Skjema «%s» er omplasserbart (sti mÃ¥ oppgis)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Stien som ble oppgitt er tom.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Stien mÃ¥ starte med en skrÃ¥strek (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Stien mÃ¥ slutte med skrÃ¥strek (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Sti mÃ¥ ikke inneholde to etterfølgende skrÃ¥streker (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nøkkel «%s» finnes ikke\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Oppgitt verdi er utenfor gyldig omrÃ¥de\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Vis installerte (ikke-flyttbare) schema" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Vis installerte flyttbare schema" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Vis nøklene i SCHEMA" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SKJEMA[:STI]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Vis barn av SCHEMA" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Vis nøkler og verdier rekursivt\n" +"Vis alle nøkler hvis SKJEMA ikke oppgis\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "SKJEMA[:STI]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Hent verdi for NØKKEL" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SKJEMA[:STI] NØKKEL" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Spør pÃ¥ gyldig verdiomrÃ¥de for NØKKEL" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Sett verdien for NØKKEL til VERDI" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SKJEMA[:STI] NØKKEL VERDI" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Nullstill NØKKEL til forvalgt verdi" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Nullstill alle nøkler i SKJEMA til sine forvalgte verdier" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Sjekk om NØKKEL er skrivbar" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"OvervÃ¥k endringer i NØKKEL.\n" +"Hvis ingen NØKKEL oppgis overvÃ¥kes alle nøkler i SKJEMA.\n" +"Bruk Ctrl+C for Ã¥ stoppe overvÃ¥king.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:STI] [NØKKEL]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Bruk\n" +" gsettings KOMMANDO [ARGUMENTER …]\n" +"\n" +"Kommandoer\n" +" help Vis denne informasjonen\n" +" list-schemas Vis liste med installerte skjema\n" +" list-relocatable-schemas Vis liste med omplasserbare skjema\n" +" list-keys Vis liste med nøkler i et skjema\n" +" list-children Vis liste med barn i et skjema\n" +" list-recursively Vis liste med nøkler og verdier rekursivt\n" +" range Spør etter omrÃ¥de for en nøkkel\n" +" get Hent verdi for en nøkkel\n" +" set Sett verdi for en nøkkel\n" +" reset Nullstill verdi for en nøkkel\n" +" reset-recursively Nullstill alle verdier i et gitt skjema\n" +" writable Sjekk om en nøkkel er skrivbar\n" +" monitor OvervÃ¥k endringer\n" +"\n" +"Bruk «gsettings help KOMMANDO» for Ã¥ fÃ¥ detaljert hjelp.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Bruk:\n" +" gsettings [--schemadir SCHEMAKATALOG] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMAKATALOG en katalog for søk etter ekstra schemas\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +"Argumenter:\n" +" SCHEMA Id for schema\n" +" PATH Sti, for schema som kan relokeres\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " NØKKEL Valgfri nøkkel i schema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " NØKKEL Nøkkel i schema\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VERDI Verdi som skal settes\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Tomt navn pÃ¥ schema oppgitt\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Ugyldig plugg, ikke initiert" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ugyldig plugg, initiering feilet pga: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Pluggen er allerede lukket" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Tidsavbrudd for I/U mot plugg" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "lager GSocket fra fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kunne ikke lage plugg: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Ukjent familie ble oppgitt" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Ukjent protokoll ble oppgitt" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "kunne ikke hente lokal adresse: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "kunne ikke hente ekstern adresse: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "kunne ikke lytte: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Feil ved binding til adresse: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Feil ved forsøk pÃ¥ Ã¥ bli med i multicast-gruppe: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Feil ved forsøk pÃ¥ Ã¥ forlate multicast-gruppe: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Ingen støtte for kildespesifikk multicast" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Feil ved godkjenning av tilkobling: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Tilkobling pÃ¥gÃ¥r" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Kan ikke hente utestÃ¥ende feil: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Feil ved mottak av data: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Feil ved sending av data: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Kan ikke stenge ned plugg: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Feil ved lukking av plugg: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Venter pÃ¥ tilstand for plugg: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Feil ved sending av melding: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage er ikke støttet pÃ¥ Windows" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Feil ved mottak av melding: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan ikke hente utestÃ¥ende feil: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials ikke implementert for dette OSet" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Kunne ikke koble til proxy-tjener %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Kunne ikke koble til «%s»: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Kunne ikke koble til: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Ukjent feil ved tilkobling" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proxy over annet enn TCP-forbindelser er ikke støttet." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokoll «%s» er er ikke støttet" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Lytter er allerede lukket" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Tillagt plugg er lukket" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 støtter ikke IPv6-adresse «%s»" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Brukernavn er for langt for SOCKSv4-protokollen" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Vertsnavn «%s» er for langt for SOCKSv4-protokollen" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Tjeneren er ikke en SOCKSv4-proxytjener." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Tilkobling gjennom SOCKSv4-tjener ble avvist" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Tjeneren er ikke en SOCKSv5-proxytjener." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCSv5-proxy krever autentisering." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5-proxy krever en autentiseringsmetode som ikke støttes av GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Brukernavn eller passord er for langt for SOCKSv5-protokollen." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5-autentisering feilet pÃ¥ grunn av feil brukernavn eller passord." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Vertsnavn «%s» er for langt for SOCKSv5-protokollen" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5-proxytjener bruker ukjent adressetype." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Intern feil i SOCKSv5-proxytjener." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-tilkobling tillates ikke av regelsett." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Vert kan ikke nÃ¥s via SOCKSv5-tjener." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Nettverk kan ikke nÃ¥s via SOCKSv5-proxy." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Tilkobling nektet via SOCKSv5-proxy." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-proxy støtter ikke «connect»-kommando." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-proxy støtter ikke oppgitt type adresse." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Ukjent feil i SOCKSv5-proxy." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan ikke hÃ¥ndtere versjon %d av GThemedIcon-koding" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Feil under oppslag av «%s»: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Feil under omvendt oppslag av «%s»: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Ingen DNS-oppføring av forespurt type for «%s»" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Midlertidig ute av stand til Ã¥ slÃ¥ opp «%s»" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Feil ved oppslag av «%s»" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Kunne ikke dekryptere PEM-kodet privat nøkkel" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Fant ikke PEM-kodet privat nøkkel" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Kunne ikke lese PEM-kodet privat nøkkel" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Fant ikke PEM-kodet sertifikat" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Kunne ikke lese PEM-kodet sertifikat" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Dette er siste sjanse til Ã¥ oppgi korrekt passord før tilgangen blir lÃ¥st." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Passord har blitt oppgitt feil flere ganger, og tilgangen vil bli lÃ¥st hvis " +"det oppgis feil pÃ¥ nytt." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Oppgitt passord er ikke korrekt." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Ventet 1 kontrollmelding, fikk %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Uventet type data" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ventet en fd, men fikk %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Mottok ugyldig fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Feil ved sending av pÃ¥loggingsinformasjon: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Feil under sjekk om SO_PASSCRED er slÃ¥tt pÃ¥ for plugg: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Feil under forsøk pÃ¥ Ã¥ slÃ¥ pÃ¥ SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Forventer Ã¥ lese en enkelt byte for mottak av pÃ¥loggingsinformasjon, men " +"leste null byte" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Forventet ikke kontrollmelding, men fikk %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Feil ved forsøk pÃ¥ Ã¥ slÃ¥ av SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Feil under lesing fra fildeskriptor: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Feil under lukking av fildeskriptor: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Filsystemrot" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Feil under skriving til fildeskriptor: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumet implementerer ikke eject eller eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Kan ikke finne program" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Feil ved oppstart av program: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIer er ikke støttet" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "endringer i assosiasjon er ikke støttet pÃ¥ win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Oppretting av assosiasjon er ikke støttet pÃ¥ win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Feil under lesing fra hÃ¥ndtak: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Feil under lukking av hÃ¥ndtak: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Feil under skriving til hÃ¥ndtak: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Ikke nok minne" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Intern feil: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Trenger med inndata" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ugyldige komprimerte data" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Lytteadresse" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Oversett. For kompatibilitet med GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Skriv ut adresse" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Skriv ut adresse i skallmodus" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Kjør en dbus-tjeneste" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Feil argument\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventet attributt «%s» for element «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributt «%s» i element «%s» ble ikke funnet" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventet tagg «%s», tagg «%s» forventet" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventet tagg «%s» i «%s»" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen gyldig bokmerkefil ble funnet i datakatalogene" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Et bokmerke eksisterer allerede for URI «%s»" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ingen bokmerker funnet for URI «%s»" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Ingen grupper satt i bokmerke for URI «%s»" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Ufullstendig tegnsekvens ved slutten pÃ¥ inndata" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan ikke konvertere \"fallback\" «%s» til tegnsett «%s»" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Lokal fil-URI «%s» kan ikke inneholde en «#»" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI «%s» er ugyldig" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Vertsnavnet for URI «%s» er ugyldig" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Vertsnavnet for URI «%s» inneholder ugyldige escape-tegn" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Stinavnet «%s» er ikke en absolutt sti" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Ugyldig vertsnavn" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %H.%M.%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H.%M.%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H.%M.%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Januar" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februar" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Mars" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "August" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Desember" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Des" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Mandag" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Tirsdag" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Onsdag" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Torsdag" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Fredag" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Lørdag" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Søndag" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Man" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Tir" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Ons" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Tor" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Fre" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Lør" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Søn" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Feil under Ã¥pning av katalog «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Kunne ikke allokere %lu byte til lest fil «%s»" +msgstr[1] "Kunne ikke allokere %lu bytes til lest fil «%s»" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Feil under lesing av fil «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fil «%s» er for stor" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Feil under lesing fra fil «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Feil under Ã¥pning av fil «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Feil under Ã¥pning av fil «%s»: fdopen() feilet: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Feil under oppretting av fil «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fwrite() feilet: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fflush() feilet: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kunne ikke skrive fil «%s»: fsync() feilet: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kunne ikke lukke fil «%s»: fclose() feilet: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Mal «%s» er ugyldig, mÃ¥ ikke inneholde «%s»" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mal «%s» inneholder ikke XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Feil under lesing av symbolsk lenke «%s»: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Symbolske lenker er ikke støttet" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Overflødig ikke-konvertert data i innlesingsbuffer" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanalen terminerer i et oppdelt tegn" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "Gyldig nøkkelfil ble ikke funnet i søkemapper" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Ikke en vanlig fil" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldig navn pÃ¥ gruppe: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Nøkkelfil starter ikke med en gruppe" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldig navn pÃ¥ nøkkel: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøkkelfil inneholder ustøttet tegnkoding «%s»" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøkkelfil har ikke gruppe «%s»" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøkkelfil har ikke nøkkelen «%s»" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Nøkkel «%s» i gruppe «%s» har en verdi «%s» hvor %s var forventet" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +msgid "Key file contains escape character at end of line" +msgstr "Nøkkelfilen inneholder skiftetegn ved linjeslutt" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøkkelfil inneholder ugyldig skiftesekvens «%s»" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vedien «%s» kan ikke bli tolket som et tall." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltallsverdi «%s» er utenfor gyldig omrÃ¥de" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Verdi «%s» kan ikke tolkes som et flyttall." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Verdi «%s» kan ikke tolkes som en bolsk verdi." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Klarte ikke Ã¥ hente attributter for fil «%s%s%s%s»: fstat() feilet: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Kunne ikke lese fil «%s%s%s%s» inn i minnet: mmap() feilet: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kunne ikke Ã¥pne fil «%s»: open() feilet: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Feil pÃ¥ linje %d tegn %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "«%s» er ikke et gyldig navn" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "«%s» er ikke et gyldig navn: «%c»" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Feil pÃ¥ linje %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tegnreferanse «%-.*s» koder ikke et tillatt tegn" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Tom entitet «&;» funnet; gyldige entiteter er: & " < > '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnavn «%-.*s» er ikke kjent" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet mÃ¥ starte med et element (f.eks )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element «%s» ble lukket, ingen Ã¥pne elementer nÃ¥" + +#: ../glib/gmarkup.c:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller inneholdt kun blanke tegn" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet sluttet uventet rett etter en Ã¥pen vinkelparantes «<»" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet sluttet uventet inni et elementnavn" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet sluttet uventet inni et attributtnavn" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet sluttet uventet inni en tagg for Ã¥pning av element." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet sluttet uventet inni en attributtverdi" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Dokumentet sluttet uventet inni en kommentar eller prosesseringsinstruksjon" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Bruk:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[FLAGG …]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Flagg for hjelp:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Vis flagg for hjelp" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Vis alle flagg for hjelp" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Flagg for applikasjonen" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikke lese heltallsverdi «%s» for %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heltallsverdi «%s» for %s er utenfor gyldig omrÃ¥de" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikke lese verdi for double «%s» for %s" + +#: ../glib/goption.c:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Feil under tolking av flagg %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Mangler argument for %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Ukjent flagg %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "korrupt objekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "intern feil eller korrupt objekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ikke mer minne" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "grense for liste av funksjonskall nÃ¥dd" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "rekursjonsgrense nÃ¥dd" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombinasjon av flagg for nye linjer" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ugyldig offset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "kort utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekursjonsløkke" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ukjent feil" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutten av mønsteret" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutten av mønsteret" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "ugjenkjennelig tegn følger \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "tall ute av rekkefølge i {}-kvantifikator" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "for stort tall i {}-kvantifikator" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "mangler terminerende ] for tegnklassen" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ugyldig escape-sekvens i tegnklassen" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "omrÃ¥de utenfor rekkefølge i tegnklassen" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "ingenting Ã¥ gjenta" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "uventet gjentagelse" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "ikke gjenkjent tegn etter (? eller (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "klasser med POSIX-navngivning støttes kun innen en klasse" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "mangler terminerende )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referanse til ikke-eksisterende undermønster" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "mangler ) etter kommentar" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regulært uttrykk er for stort" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ikke nok minne" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") uten Ã¥pnende (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "kodeoverflyt" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "ikke gjenkjent tegn etter (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-regel er ikke av fast lengde" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "ugyldig tall eller navn etter (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "betinget gruppe inneholder mer enn to grener" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "assert forventet etter (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]tall mÃ¥ følges av )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ukjent navn pÃ¥ POSIX-klasse" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX elementer for sammenslÃ¥ing er ikke støttet" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "tegnverdi i \\x{…} sekvens er for stor" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ugyldig betingelse (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C er ikke tillatt i «lookbehind assertion»" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escape-verdier \\L, \\l, \\N{name}, \\U og \\u er ikke støttet" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt kall kunne gÃ¥ i uendelig løkke" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "ikke gjenkjent tegn etter (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "mangler terminering av navn pÃ¥ undermønster" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "to navngitte undermønster har samme navn" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "ugyldig \\P- eller \\p-sekvens" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "ukjent navn pÃ¥ egenskap etter \\P eller \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "navn pÃ¥ undermønster er for langt (maks 32 tegn)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange navngitte undermønster (maks 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "oktal verdi er større enn \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "gikk ut over arbeidsomrÃ¥de for kompilering" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "tidligere sjekket og referert undermønster ikke funnet" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe inneholder mer enn en gren" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-alternativer" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g etterfølges ikke av et navn, eller tall i klammeparanteser, hakeparantes " +"eller sitattegn" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "en nummerert referanse mÃ¥ ikke være null" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "et argument tillates ikke for (*ACCEPT), (*FAIL) eller (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) gjenkjennes ikke" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "tallet er for stort" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "mangler navn pÃ¥ undermønster etter (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "tall forventet etter (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] er et ugyldig datategn i kompatibilitetsmodus for JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "forskjellige navn for undermønster med samme nummer tillates ikke" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) mÃ¥ ha et argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c mÃ¥ etterfølges av et ASCII-tegn" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k etterfølges ikke av et navn i klammeparanteser, hakeparantes eller " +"sitattegn" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N er ikke støttet i en klasse" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "for mange fremoverreferanser" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "for langt navn i (*MARK), (*PRUNE), (*SKIP) eller (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "tegnverdi i \\u.... sekvens er for stor" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Feil under treff pÃ¥ regulært uttrykk %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8-egenskaper" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE-biblioteket er kompilert med inkompatible alternativer" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Feil under optimering av reguært utrykk %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "heksadesimalt tall eller «}» forventet" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "heksadesimalt tall forventet" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "mangler «<» i symbolsk referanse" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "uferdig symbolsk referanse" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "symbolsk referanse med null lengde" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "tall forventet" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk referanse" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "feilplassert siste «\\\\»" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ukjent escapesekvens" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Sitert tekst begynner ikke med sitattegn" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksten var tom (eller inneholdt kun blanke tegn)" + +#: ../glib/gspawn.c:203 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Feil under lesing av data fra underprosess (%s)" + +#: ../glib/gspawn.c:362 +#, 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:853 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Underprosess avsluttet med kode %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Underprosess terminert av signal %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Underprosess stoppet av signal %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "Underprosess avsluttet unormalt" + +#: ../glib/gspawn.c:1280 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Feil under lesing fra \"child pipe\" (%s)" + +#: ../glib/gspawn.c:1348 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Feil under kjøring av fork (%s)" + +#: ../glib/gspawn.c:1496 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Feil ved skifte til katalog «%s» (%s)" + +#: ../glib/gspawn.c:1506 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Feil under kjøring av underprosess «%s» (%s)" + +#: ../glib/gspawn.c:1516 +#, 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:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Feil under kjøring av fork() for underprosess (%s)" + +#: ../glib/gspawn.c:1533 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukjent feil under kjøring av underprosess «%s»" + +#: ../glib/gspawn.c:1557 +#, 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/gspawn.c:1630 ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Feil under lesing av data fra underprosess" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldig arbeidsmappe: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Feil under kjøring av hjelpeprogram (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Tegn utenfor gyldig omrÃ¥de for UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i inndata for konvertering" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Tegn utenfor gyldig omrÃ¥de for UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/nds.po b/po/nds.po new file mode 100644 index 0000000..0fa0f19 --- /dev/null +++ b/po/nds.po @@ -0,0 +1,3707 @@ +# Low German translation for glib. +# Copyright (C) 2010 glib's COPYRIGHT HOLDER +# This file is distributed under the same license as the glib package. +# Nils-Christoph Fiedler , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-03-18 13:53+0100\n" +"Last-Translator: Nils-Christoph Fiedler \n" +"Language-Team: Low German \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Een Leseteken för de URI '%s' givt dat all" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Keen Leseteken funnen för URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "De URI '%s' is nich akerat" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Nich akerater Hostnaam" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d. %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Jannuaar" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Feberwaar" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "März" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mär" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Maandag" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Dingsdag" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Middeweek" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Dunnersdag" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Freedag" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sünnavend" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Sünndag" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Maan" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Ding" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Migg" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Dunn" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Free" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Svd." + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sdag" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datei \"%s\" is to grot" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Dat Opmaken vun de Datei '%s' is fehlslagen: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' is keen akerater Naam" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' is kee akerater Naam: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fehler in Reeg %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "keen Spieker" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "Binnenfehler" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "unbekannter Fehler" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "nix to wedderholen" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "Code Överlööp" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nich akerate Reeg in Umgeven: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nich akerates Orbietsverteeknis: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Künn nich opgaveln (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Gebruk:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Hölpoptschoonen:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Hölpoptschoonen opwiesen" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "All Hölpoptschoonen opwiesen" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Programmoptschoonen:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Unbekannte Optschoon %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Keene normale Datei" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "De Datei is leer" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nich akerater Slötelnaam: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "De Operatschoon weur avbreken" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s Typ" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nich unnerstütte Sockelanskrivt" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Fehler bi'm Verbinnen:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Unbekannter Typ" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Künn de Datei nich sluten: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Tääler is sluten" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Fehler in Reeg %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Fehler bi'm Verbinnen:" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' is keen akerater Naam" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fehler in Reeg %d: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fehler bi'm Verbinnen:" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Ohn Naam" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Eegen Definitschoon för %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Tääldatei givt dat all" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Tääler is sluten" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nich genug Spieker för Sockelanskrivt" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Nich unnerstütte Sockelanskrivt" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nich akerater Dateinaam %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Künn dateisysteminfo nich kregen: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Künn root Verteeknisnaam nich ännern" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fehler bi'm Naam ännern vun de Datei: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Nich akerater Dateinaam" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Künn de Datei nich opmaken: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Künn dat verteeknis nich opmaken" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "(nich akerate Koderen)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Künn de Datei nich sluten: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Tääldatei is een Verteeknis" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Tääldatei is keene normale Datei" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Nich akerate Sökanfrage" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Unbekannte Optschoon %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Fehler bi'm Verbinnen:" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "" + +#: ../gio/gsocket.c:2163 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Unbekannter Fehler bi'm Verbinnen" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Künn de Datei nich opmaken: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fehler bi'm Naam ännern vun de Datei: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Dateisystem root" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Künn dat Programm nich finnen" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URIs nich unnerstütt" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Fehler bi'm Naam ännern vun de Datei: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Künn de Datei nich sluten: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Problem bi'm Lesen vun de Datei '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nich genug Spieker" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Binnenfehler: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Bruk mehr Ingaven" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "" diff --git a/po/ne.po b/po/ne.po new file mode 100644 index 0000000..9a30343 --- /dev/null +++ b/po/ne.po @@ -0,0 +1,3812 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2006-04-27 00:00+0545\n" +"Last-Translator: Shyam Krishna Bal \n" +"Language-Team: Nepali \n" +"Language: ne\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:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' " + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "क्यारेक्टर सेट '%s' बाट '%s' मा रूपान्तरण समर्थित छैन" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' बाट '%s'मा रूपान्तरणकर्ता खोल्न सकेन" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "आगतको अन्त्यमा आंशिक क्यारेक्टर" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "फलब्याक '%s' बाट कोड सेट'%s' मा रूपान्तरण गर्न सक्दैन" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" योजना प्रयोग गर्ने एउटा निश्चित URI होइन" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "स्थानीय फाइल URI '%s' मा एउटा '#' समावेश नहुनसक्छ" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' अवैध छ " + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' को होस्टनाम अवैध छ" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' मा अवैध रूपमा निस्किएका क्यारेक्टरहरू देखिन्छन्" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "बाटोनाम '%s' निश्चित मार्ग होइन" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "अवैध होस्टनाम " + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "पूर्वाह्न" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "अपराह्न" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "मार्च" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "जून" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "जनवरी" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "फ़रवरी" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "मार्च" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "अप्रेल" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "मई" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "जून" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "जुलाई" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "सोमबार " + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "मंगलबार " + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "बुधबार " + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "बिहिबार " + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "शुक्रबार " + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "शनिबार" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "आइतबार " + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "सोम " + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "मंगल " + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "बुध " + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "बिहि " + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "शुक्र " + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "शनि" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "आइत " + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "फाइल \"%2$s\" पढ्न %1$lu बाईट्स बाँडफाँड गर्न सकिएन" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' फाइलबाट पढ्न असफल : %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s'फाइल खोल्न असफल : %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' फाइलको विशेषता पाउन असफल: fstat() असफल भयो: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' फाइल खोल्न असफल : fdopen() खोल्न असफल : %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "फाइल '%s लाई '%s' मा पुन: नामकरण गर्न असफल:g_rename() असफल: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "लेख्नका लागि '%s' फाइल खोल्न असफल : fdopen() असफल : %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' फाइल लेख्न असफल : fलेख्न() असफल : %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' फाइल बन्द गर्न असफल : fबन्द गर्न() असफल : %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "अवस्थित फाइल '%s' हटाउन सकिएन:g_unlink() असफल: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s ' टेम्प्लेट अवैध, एउटा '%s' सम्मिलित हुनु हुँदैन" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' टेम्प्लेट XXXXXX संगसमाप्त हुँदैन" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' फाइल खोल्न असफल : खोल्न() असफल : %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' फाइल नक्सा असफल : m नक्सा() असफल : %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "अवैध UTF-8 सङ्केतन गरिएको पाठ" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "क्यारेक्टर सन्दर्भ '%-.*s' ले स्वीकृत क्यारेक्टरको सङ्केतन गर्दैन " + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"खाली अस्तित्व '&;' देखियो; वैध अस्तित्वहरू निम्न हुन : & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "अस्तित्व नाम '%s' ज्ञात होइन" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "कागजात एउटा तत्व बाट सुरु हुनैपर्छ (जस्तै: )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"एउटा '<' क्यारेक्टर पछ्याउन '%s' वैधानिक क्यारेक्टर होइन; यस्ले एउटा तत्व नाम प्रारम्भ " +"नगर्न सक्छ" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"बिजोड क्यारेक्टर '%s', एउटा अपेक्षा गरिएको क्यारेक्टर '>', '%s' को सुरु ट्याग अन्त्य " +"गर्नलाइ" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "विजोड क्यारेक्टर '%s' ले,'%s' तत्वको गुण नाम '%s' पछि अपेक्षा गरिएको एउटा '=' " + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"बन्द तत्व नाम '%s' को पछि लाग्ने '%s' मान्य क्यारेक्टर होइन; अनुमति पाएको क्यारेक्टर '>' " +"हो।" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "तत्व '%s' बन्द थियो, हाल कुनै तत्व खुलेको छैन" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "तत्व '%s' बन्द थियो, तर हाल खुला तत्व '%s' हो" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "कागजात खाली छ वा सेतो खाली स्थान मात्र राखिएको छ" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "एउटा खुल्ला कोण कोष्ठ पछि '<' कागजात अनपेक्षित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "'%s' खोलिएको अन्तिम तत्व संगकागजात अप्रत्याशित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"कागजपत्र अप्रत्याशित रूपले समाप्त भयो, ट्याग <%s/> को अन्तमा बन्द कोण कोष्ठको अपेक्षा " +"गर्दछ।" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "तत्व नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "विशेषता नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "तत्व-खुल्ला ट्याग भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"बिशेषता नाम पछ्याउन बराबर चिन्ह पछि कागजातपत्र अप्रत्याशित रूपले समाप्त भयो; गुण मान " +"होइन" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "गुण मान भित्र भएको बेला कागजपत्र अप्रत्याशित रूपले समाप्त भयो" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "तत्व '%s' का लागि बन्द ट्याग भित्र कागजात अनपेक्षित रूपले समाप्त भयो।" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "एउटा टिप्पणी वा प्रक्रिया निर्देशन भित्र कागजपत्र अप्रत्याशित रूपले समाप्त भयो" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "आंशिक-क्यारेक्टरमा माध्यम टुङ्गिन्छ" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "अधुरो क्यारेक्टर सन्दर्भ" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "लाइन %d क्यारेक्टर %d मा त्रुटि: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "अधुरो अस्तित्व सन्दर्भ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "उद्धरण गरिएको पाठ उद्धरण चिन्ह बाट सुरु हुँदैन" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "आदेश रेखामा वा अरू कवच-उद्धरण गरिएको पाठमा नमिलेको उद्धरण चिन्ह" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "पाठ चाँही '\\' क्यारेक्टर पछि मात्र समाप्त भयो। (पाठ '%s' थियो)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c का लागि मिल्ने उद्धरण फेला पर्नु अगाडि पाठ समाप्त भयो। (पाठ '%s' थियो)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "पाठ खाली थियो (वा सेतो खाली स्थान मात्र समावेश थियो)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "शाखा प्रक्रियाबाट डेटा पढ्न असफल भयो" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "शाखा प्रक्रिया (%s)सँग कुराकानीका लागि पाइप सिर्जना गर्न असफल" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "शाखा प्रक्रिया (%s)बाट पढ्न असफल" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "डाइरेक्टरी '%s' (%s) मा परिवर्तन गर्न असफल" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "शाखा प्रक्रिया (%s) कार्यान्वयन गर्न असफल" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr " अार्गुमेन्ट भेक्टरको %d मा अवैध स्ट्रीङ: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "वातावरणमा अवैध स्ट्रीङ: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "अवैध कार्य डाइरेक्टरी : %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "मद्दत गर्ने कार्यक्रम कार्यान्वयन गर्न असफल (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "शाखा प्रक्रियाबाट डेटा पढ्दा g_io_channel_win32_poll() अनपेक्षित त्रुटि" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्न असफल" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "शाखा प्रक्रिया (%s) बाट डेटा पढ्दा () चयनमा अनपेक्षित त्रुटि" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) मा अनपेक्षित त्रुटि" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) फोर्क गर्न असफल" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "शाखा प्रक्रिया \"%s\" (%s) कार्यान्वयन गर्न असफल" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "शाखा प्रक्रिया (%s) को निर्गत वा आगत पुन:निर्देशिन गर्न असफल" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "शाखा प्रक्रिया (%s) फोर्क गर्न असफल" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "शाखा प्रक्रिया \"%s\" कार्यान्वयन गर्दा अज्ञात त्रुटि" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "शाखा पिड पाईप (%s) बाट प्रशस्त डेटाहरू पढ्न असफल" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "रूपान्तरण आगतमा अवैध अनुक्रम" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 का लागि क्यारेक्टर दायरा भन्दा बाहिर छ" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "प्रयोग:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "मद्दत विकल्पहरू:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "मद्दत विकल्पहरू देखाउनुहोस्" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "सबै मद्दत विकल्पहरू देखाउनुहोस्" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "अनुप्रयोग विकल्पहरू:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ" + +#: ../glib/goption.c:1032 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%s का लागि इन्टेजर मान %s को पद वर्णन गर्न सक्दैन" + +#: ../glib/goption.c:1040 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "इन्टेजर मान '%s' %s का लागि दायरा भन्दा बाहिर छ" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s का छुटेको तर्क" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "अज्ञात विकल्प %s" + +#: ../glib/gkeyfile.c:366 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "वैध कुञ्जी फाइल डेटा डाइरेक्टरीहरूमा फेला परेन" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "नियमित फाइल होइन" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "फाइल खाली छ" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "कुञ्जी फाइलमा पङ्गति '%s' समावेश छ जुन कुञ्जी-मान जोडि, समूह, वा टिप्पणी होइन।" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "कुञ्जी फाइल एउटा समूहबाट सुरु हुँदैन" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "कुञ्जी फाइलमा समर्थन प्राप्त नभएको सङ्केतन '%s' समावेश छ।" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "कुञ्जी फाइलसंगसमूह '%s' छैन" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "कुञ्जी फाइलसंगकुञ्जी '%s' हुँदैन" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "कुञ्जी फाइलमा मान '%s'सँगै कुञ्जी '%s' समावेश छ जुन UTF-8 होइन" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "कुञ्जी फाइलमा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: ../glib/gkeyfile.c:1566 +#, fuzzy, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "कुञ्जी फाइलमा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' समावेश छ जसको मानलाई व्याख्या गर्न सकिँदैन।" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "कुञ्जी फाइलमा समूह '%s' मा कुञ्जी '%s' हुँदैन" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "कुञ्जी फाइलमा पङ्गतिको अन्त्यमा निकास क्यारेक्टर समावेश छ।" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "कुञ्जी फाइलमा अवैध निकास अनुक्रम '%s' समावेस छ।" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "इन्टेजर मान '%s' क्षेत्र भन्दा बाहिर छ" + +#: ../glib/gkeyfile.c:3919 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "मान '%s' लाई सङ्ख्याको रूपमा व्याख्या गर्न सकिँदैन" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "मान '%s' एउटा बुलिएनको रूपमा व्याख्या गर्न सकिँदैन।" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "रूपान्तरण आगतमा अवैध बाइट अनुक्रम" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "अज्ञात विकल्प %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "लाइन %d मा त्रुटि: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "अस्तित्व नाम भित्रको क्यारेक्टर '%s' वैध छैन" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "अस्तित्व नाम भित्रको क्यारेक्टर '%s' वैध छैन" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "अस्तित्व नाम भित्रको क्यारेक्टर '%s' वैध छैन" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "अवैध होस्टनाम " + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "सांकेतिक सम्बन्ध '%s' पढ्न असफल: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "विशेषता नाम भित्र कागजात अपेक्षित रूपले समाप्त भयो।" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "डाइरेक्टरी '%s' खोल्दा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "नियमित फाइल होइन" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "अवैध कार्यक्रम नाम : %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "अज्ञात विकल्प %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "रूपान्तरण अवधिमा त्रुटि: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "'%s' फाइल सिर्जना गर्न असफल: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "लाइन %d मा त्रुटि: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "पद वर्णन विकल्पमा त्रुटि %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "सांकेतिक सम्बन्ध समर्थन गरिएन" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "'%s' फाइल पढ्दा त्रुटि : %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/nl.po new file mode 100644 index 0000000..e7c90f0 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,4455 @@ +# 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–2013 +# Rachid , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-09 17:50+0100\n" +"PO-Revision-Date: 2013-02-09 17:49+0100\n" +"Last-Translator: Wouter Bolsterlee \n" +"Language-Team: Dutch \n" +"Language: nl\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "De telwaarde die aan %s werd gegeven is te groot" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Zoeken binnen datastroom niet mogelijk" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Kan GMemoryInputStream niet afkappen" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "De stroom is al gesloten" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Afkappen wordt niet ondersteund op een datastroom" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "De bewerking werd afgebroken" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Ongeldig object, niet geïnitialiseerd" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Onvolledige multibyte-reeks in invoer" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Niet genoeg ruimte op bestemming" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Ongeldige bytereeks in conversie-invoer" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fout tijdens omzetten: %s" + +# niet ondersteund/niet mogelijk +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Annuleerbare initialisatie wordt niet ondersteund" + +# is niet mogelijk/wordt niet ondersteund +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, 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) +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" +"Kon het conversieprogramma voor het omzetten van ‘%s’ naar ‘%s’ niet openen" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "type %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Onbekend type" + +# bestandssoort/bestandstype +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "bestandstype %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials is niet geïmplementeerd op dit besturingssysteem" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "GCredentials wordt niet ondersteund op uw platform" + +#: ../gio/gcredentials.c:480 +#, fuzzy +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials is niet geïmplementeerd op dit besturingssysteem" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Voortijdig einde aan gegevensstroom" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Niet ondersteunde sleutel ‘%s’ in adres ‘%s’" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "Adres ‘%s’ is ongeldig (pad, tmpdir of abstracte sleutel nodig)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Onzinnige sleutel- en waardecombinatie in adres ‘%s’" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Fout in adres ‘%s’ - het poort-attribuut is onjuist gevormd" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Fout in adres ‘%s’ - het family-attribuut is onjuist gevormd" + +#: ../gio/gdbusaddress.c:454 +#, fuzzy, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Adreselement ‘%s’ bevat geen dubbele punt (:)" + +#: ../gio/gdbusaddress.c:475 +#, fuzzy, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Sleutel/waarde-paar %d, ‘%s’ in adreselement ‘%s’ bevat geen is-gelijk-teken." + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Fout bij het ‘unescapen’ van sleutel of waarde in sleutel/waarde-paar %d, " +"‘%s’, in adreselement ‘%s’" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Fout in adres ‘%s’ — Unix-transport heeft ofwel de sleutel ‘path’ ofwel de " +"sleutel ‘abstract’ nodig" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Fout in adres ‘%s’ — het host-attribuut ontbreekt of is onjuist gevormd" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Fout in adres ‘%s’ — het port-attribuut ontbreekt of is onjuist gevormd" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Fout in adres ‘%s’ — het noncefile-attribuut ontbreekt of is onjuist gevormd" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Fout bij automatisch opstarten: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Onbekend of niet ondersteund transport ‘%s’ voor adres ‘%s’" + +# lezen/openen +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fout bij het openen van nonce-bestand ‘%s’: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fout bij het lezen van nonce-bestand ‘%s’: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Fout bij het lezen van nonce-bestand ‘%s’, 16 bytes werden verwacht, maar %d " +"bytes ontvangen" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Fout tijdens het schrijven van de inhoud van nonce-bestand ‘%s’ naar " +"gegevensstroom:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Het opgegeven adres is leeg" + +#: ../gio/gdbusaddress.c:1030 +#, fuzzy, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Kan geen message-bus starten zonder machine-ID: " + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Kan geen message-bus starten zonder machine-ID: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Fout bij starten van de opdrachtregel ‘%s’: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Typ een willekeurige letter om dit venster te sluiten)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Sessie-dbus is niet actief, en autolauch is mislukt" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Kan adres van sessiebus niet bepalen (niet geïmplementeerd voor dit " +"besturingssysteem)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Kan adres van bus niet bepalen van DBUS_STARTER_BUS_TYPE omgevingsvariabele " +"- onbekende waarde ‘%s’" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Kan adres van bus niet bepalen omdat de omgevingsvariabele " +"DBUS_STARTER_BUS_TYPE niet is ingesteld" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Onbekend bustype %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Fout bij ophalen van informatie voor de map ‘%s’: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fout bij het aanmaken van map ‘%s’: %s" + +# lezen/openen +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fout bij het openen van sleutelbos ‘%s’: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Regel %d van de sleutelbos in ‘%s’ met inhoud ‘%s’ is onjuist gevormd" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Eerste token op regel %d van de sleutelbos in ‘%s’ met inhoud ‘%s’ is " +"onjuist gevormd" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fout bij aanmaken vergrendelingsbestand ‘%s’: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fout bij het sluiten van (ontkoppeld) vergrendelingsbestand ‘%s’: %s" + +# lezen/openen +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fout bij het ontkoppelen van bestand ‘%s’: %s" + +# lezen/openen +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fout bij het openen van sleutelbos ‘%s’ voor schrijven:" + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(vrijgeven van vergrendeling voor `%s' ook mislukt: %s) " + +# opsomming/teller +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "De verbinding is gesloten" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Tijd is verlopen" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "Geen interface ‘org.freedesktop.DBus.Properties’ op object met pad %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Fout bij het instellen van eigenschap ‘%s’: verwachte type ‘%s’, maar ‘%s’ " +"ontvangen" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Geen eigenschap ‘%s’" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Eigenschap ‘%s’ is niet leesbaar" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Eigenschap ‘%s’ is niet schrijfbaar" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Interface ‘%s’ bestaat niet" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Interface bestaat niet" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Interface ‘%s’ op object met pad %s bestaat niet" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Methode ‘%s' bstaat niet" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Berichttype ‘%s’ komt niet overeen met verwachte type ‘%s’" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Er is al een object geëxporteerd voor de interface %s op %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Methode ‘%s’ gaf type ‘%s’ terug, maar ‘%s’ werd verwacht" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Methode ‘%s’ op interface ‘%s’ met signature ‘%s’ bestaat niet" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Er is reeds een sub-boom geëxporteerd voor %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "type is INVALID" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL-bericht: veld PATH of MEMBER ontbreekt in koptekst" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN-bericht: veld REPLY_SERIAL ontbreekt in koptekst" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR-bericht: veld REPLY_SERIAL of ERROR_NAME ontbreekt in koptekst" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL message: veld PATH, INTERFACE of MEMBER ontbreekt in koptekst" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL-bericht: veld PATH in koptekst gebruikt de gereserveerde waarde /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL-bericht: veld PATH in koptekst gebruikt de gereserveerde waarde org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Kan hardware-profiel niet verkrijgen: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +# wordt hier niet ondersteund +# (dus bijv. op een aangekoppelde externe opslag?) +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fout bij schrijven van nonce-bestand naar `%s': %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "De tekenreeks ‘%s’ is geen geldige GUID voor D-Bus" + +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Kan niet luisteren op niet ondersteund transport ‘%s’" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "OPDRACHT" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Fout: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fout bij verwerken van introspectie-XML %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Verbinden met systeembus" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Verbinden met sessiebus" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Verbinden met opgegeven D-Bus-adres" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:539 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "Te monitoren object-pad" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "" + +# openen/lezen +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Fout bij verbinden: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Fout: ‘%s’ is geen geldige interface-naam\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Fout: ‘%s’ is geen geldige member-naam\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Fout: %s is geen geldige unieke busnaam.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fout bij ontleden van parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fout bij accepteren van verbinding: %s" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Tijdslimiet in seconden" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Methode aanroepen op een object op afstand" + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Fout: bestemming is niet opgegeven\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Fout: methodenaam is niet opgegeven\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Fout: methodenaam ‘%s’ is ongeldig\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "XML tonen" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Alleen eigenschappen tonen" + +# Ugh, anglicisme :( (Wouter Bolsterlee) +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Een object op afstand introspecteren" + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Te monitoren object-pad" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Een object op afstand monitoren." + +# naamloos/zonder naam/onbenoemd +#: ../gio/gdesktopappinfo.c:594 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Zonder naam" + +# bureaubladbestand/desktopbestand +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktopbestand bevat geen Exec-veld" + +#: ../gio/gdesktopappinfo.c:1295 +msgid "Unable to find terminal required for application" +msgstr "Kan geen terminalvenster vinden voor het uitvoeren van het programma" + +#: ../gio/gdesktopappinfo.c:1597 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan persoonlijke programmaconfiguratiemap %s niet aanmaken: %s" + +#: ../gio/gdesktopappinfo.c:1601 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan persoonlijke MIME-configuratiemap %s niet aanmaken: %s" + +#: ../gio/gdesktopappinfo.c:1841 ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2097 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan desktopbestand %s niet aanmaken" + +#: ../gio/gdesktopappinfo.c:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Zelfgemaakte definitie voor %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"dit station begrijpt de opdracht ‘uitwerpen’ of ‘eject_with_operation’ niet" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "dit station kan niet onderzocht worden op de aanwezigheid van media" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "dit station begrijpt de opdracht ‘start’ niet" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "dit station begrijpt de opdracht ‘stop’ niet" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-ondersteuning niet beschikbaar" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan versie %d van GEmblem-codering niet verwerken" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Onjuist aantal tokens (%d) in GEmblem-codering" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan versie %d van GEmblemedIcon-codering niet verwerken" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Onjuist aantal tokens (%d) in GEmblemedIcon-codering" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblem voor GEmblemedIcon verwacht" + +# niet ondersteund/niet mogelijk +#: ../gio/gfile.c:917 ../gio/gfile.c:1156 ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 ../gio/gfile.c:1590 ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 ../gio/gfile.c:1789 ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 ../gio/gfile.c:3468 ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 ../gio/gfile.c:3711 ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 ../gio/gfile.c:4610 ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 ../gio/gfile.c:4884 ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 ../gio/gfile.c:5536 ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 ../gio/gfile.c:7225 ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "Het koppelpunt hiervan bestaat niet" + +#: ../gio/gfile.c:2474 ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Kan niet over map kopiëren" + +#: ../gio/gfile.c:2534 +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:2542 ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "Doelbestand bestaat al" + +# map/de map +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Kan map niet recursief kopiëren" + +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Splice wordt niet ondersteund" + +# openen/lezen +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fout bij splicen van bestand: %s" + +# (nog) niet mogelijk/niet ondersteund +#: ../gio/gfile.c:2960 +#, fuzzy +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Verplaatsen tussen aankoppelpunten is niet mogelijk" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Kan speciaal bestand niet kopiëren" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "Ongeldige symbolische verwijzing gegeven" + +# wordt hier niet ondersteund +# (dus bijv. op een aangekoppelde externe opslag?) +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "Prullenbak wordt ondersteund" + +# Een bestandsnaam mag het teken / niet bevatten +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Het teken ‘%c’ mag niet in een bestandsnaam voorkomen" + +#: ../gio/gfile.c:6258 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "volumen begrijpt de opdracht ‘aankoppelen’ niet" + +#: ../gio/gfile.c:6367 +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:204 +msgid "Enumerator is closed" +msgstr "Teller is gesloten" + +# hmm +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Bestandsteller bevat een lopende bewerking" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Gegevensstroom ondersteunt query_info niet" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Zoeken binnen gegevensstroom niet mogelijk" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Afkappen is niet toegestaan op een invoerdatastroom" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Afkappen wordt niet ondersteund op een gegevensstroom" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Verkeerd aantal tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Geen type voor klassenaam %s" + +#: ../gio/gicon.c:314 +#, 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:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Type %s is niet ‘classed’" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Onjuist versienummer: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +#, fuzzy +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Kan de opgegeven versie in de pictogram-codering niet verwerken" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Geen adres opgegeven" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Lengte %u is te lang voor een adres" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Kon ‘%s’ niet ontleden als IP-adres" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Niet genoeg ruimte voor socket-adres" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Niet ondersteund socket-adres" + +# huh? +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Gegevensstroom is nog bezig" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> is niet toegestaan binnen <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> is niet toegestaan op het hoogste niveau" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "‘%s’ kon niet gevonden worden in de bronmap" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "‘%s’ kon niet gevonden worden in de huidige map" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Onbekende verwerkingsoptie ‘%s’" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Aanmaken van tijdelijk bestand mislukt: %s" + +# openen/lezen +#: ../gio/glib-compile-resources.c:340 +#, fuzzy, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "Fout bij comprimeren van bestand: %s" + +# openen/lezen +#: ../gio/glib-compile-resources.c:396 +#, fuzzy, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "Fout bij comprimeren van bestand: %s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Fout bij lezen van bestand %s: %s" + +# openen/lezen +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Fout bij comprimeren van bestand: %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "er mag geen tekst staan binnen <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "naam van uitvoerbestand" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "BESTAND" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "MAP" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Bronheader genereren" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "U dient exact één bestandsnaam op te geven\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "lege namen zijn niet toegestaan" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ongeldige naam ‘%s’: namen moet met een kleine letter beginnen" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ongeldige naam ‘%s’: maximale lengte is 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1463 +#, fuzzy, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> is niet toegestaan op het hoogste niveau" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "waar het bestand ‘gschemas.compiled’ opgeslagen wordt" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Afbreken bij een fout in een schema" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Het bestand ‘gschema.compiled’ niet schrijven" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "U dient exact één mapnaam op te geven\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Geen schemabestanden gevonden:" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "niets doen.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Kon de standaard ‘directory monitor type’ niet vinden" + +#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ongeldige bestandsnaam: %s" + +#: ../gio/glocalfile.c:974 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fout bij het ophalen van informatie over bestandssysteem: %s" + +#: ../gio/glocalfile.c:1142 +msgid "Can't rename root directory" +msgstr "Kan de root-map niet hernoemen" + +#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fout bij het hernoemen van bestand: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Kan het bestand niet hernoemen, de bestandsnaam bestaat al" + +# ongeldige naam voor bestand/ongeldige bestandsnaam +#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "Ongeldige bestandsnaam" + +#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Kan map niet openen" + +# openen/lezen +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Fout bij het openen van bestand: %s" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Fout bij het verwijderen van bestand: %s" + +# naar prullenbak verplaatsen/verwijderen +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fout bij het verplaatsen naar de prullenbak van bestand: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kan de prullenbakmap %s niet aanmaken: %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Kan de bovenliggende map voor de prullenbak niet vinden" + +#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023 +msgid "Unable to find or create trash directory" +msgstr "Kan prullenbakmap niet vinden of aanmaken" + +#: ../gio/glocalfile.c:2057 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kan prullenbak-informatiebestand ‘%s’ niet aanmaken" + +#: ../gio/glocalfile.c:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kan het bestand ‘%s’ niet naar de prullenbak verplaatsen" + +#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280 +msgid "internal error" +msgstr "interne fout" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fout bij het aanmaken van map: %s" + +#: ../gio/glocalfile.c:2234 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Bestandssysteem ondersteund geen symbolische verwijzingen" + +#: ../gio/glocalfile.c:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fout bij het maken van symbolische verwijzing: %s" + +#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Fout bij het verplaatsen van bestand: %s" + +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Kan map niet over map verplaatsen" + +#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Aanmaken van backupbestand is mislukt" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fout bij het verwijderen doelbestand: %s" + +# (nog) niet mogelijk/niet ondersteund +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Verplaatsen tussen aankoppelpunten is niet mogelijk" + +# technotalk +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "Attribuutwaarde moet niet-NULL zijn" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Ongeldig attribuuttype (hoort een tekenreeks te zijn)" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Ongeldige uitgebreide attribuutnaam" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fout bij het instellen van uitgebreid attribuut ‘%s’: %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (ongeldige codering)" + +# lezen/openen +#: ../gio/glocalfileinfo.c:1740 ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Fout bij het verkrijgen van informatie over het bestand ‘%s’: %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Fout bij het verkrijgen van informatie over het bestanddescriptor %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ongeldig attribuuttype (hoort een uint32 te zijn)" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ongeldig attribuuttype (hoort een uint64 te zijn)" + +#: ../gio/glocalfileinfo.c:2068 ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ongeldig attribuuttype (hoort een byte-tekenreeks te zijn)" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Kan geen toegangsrechten instellen voor symbolische verwijzing: %s" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fout bij instellen toegangsrechten: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fout bij instellen eigenaar: %s" + +# technotalk +# symlink/symbolische verwijzing +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "symbolische verwijzing moet niet-NULL zijn" + +#: ../gio/glocalfileinfo.c:2222 ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fout bij instellen symbolische verwijzing: %s" + +#: ../gio/glocalfileinfo.c:2231 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Fout bij instellen symbolische verwijzing: bestand is geen symbolische " +"verwijzing" + +#: ../gio/glocalfileinfo.c:2357 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "" + +# technotalk +#: ../gio/glocalfileinfo.c:2380 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-context moet niet-NULL zijn" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fout bij instellen SELinux-context: %s" + +# geactiveerd/aangezet +# systeem/computer +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux is niet geactiveerd op dit systeem" + +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Instellen van attribuut %s is niet mogelijk" + +#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fout bij het lezen van bestand: %s" + +#: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fout bij het doorzoeken van bestand: %s" + +#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Fout bij het sluiten van bestand: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Kon de standaard ‘file monitor type’ niet vinden" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fout bij het schrijven naar bestand: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fout bij verwijderen van oude verwijzing naar reservekopie: %s" + +#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fout bij het aanmaken van reservekopie: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fout bij het hernoemen van tijdelijk bestand: %s" + +#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fout bij het afkappen bestand: %s" + +# lezen/openen +#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fout bij het openen van bestand ‘%s’: %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "Doelbestand is geen map" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "Doelbestand is geen gewoon bestand" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "Het bestand is door een ander programma gewijzigd" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fout bij verwijderen van oude bestand: %s" + +#: ../gio/gmemoryinputstream.c:476 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Ongeldig GSeekType geleverd" + +#: ../gio/gmemoryinputstream.c:486 +msgid "Invalid seek request" +msgstr "Ongeldige zoekopdracht" + +#: ../gio/gmemoryinputstream.c:510 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan GMemoryInputStream niet afkappen" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Wijzigen van geheugenruimte uitvoerdatastroom is niet mogelijk" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Wijzigen van geheugenruimte uitvoerdatastroom is mislukt" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"De benodigde geheugenruimte om de schrijfactie te verwerken is groter dan de " +"beschikbare adresruimte" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "‘Seek’-aanvraag ligt voor het beginpunt van de stroom" + +#: ../gio/gmemoryoutputstream.c:758 +msgid "Requested seek beyond the end of the stream" +msgstr "‘Seek’-aanvraag ligt na het eindpunt van de stroom" + +# 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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "mount heeft geen ondersteuning voor ontkoppelen (unmount)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:471 +msgid "mount doesn't implement \"eject\"" +msgstr "mount heeft geen ondersteuning voor uitwerpen (eject)" + +# 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:549 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"mount heeft geen ondersteuning voor ‘unmount’ of ‘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:634 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "mount heeft geen ondersteuning voor ‘eject’ of ‘eject_with_operation’" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:722 +msgid "mount doesn't implement \"remount\"" +msgstr "mount heeft geen ondersteuning voor remount (opnieuw koppelen)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:803 +msgid "mount doesn't implement content type guessing" +msgstr "mount heeft geen ondersteuning voor inhoudstype raden" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"mount heeft geen ondersteuning voor inhoudstype raden op synchrone wijze" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Host-naam ‘%s’ bevat ‘[’ maar geen ‘]’" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Netwerk onbereikbaar" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Host onbereikbaar" + +#: ../gio/gnetworkmonitornetlink.c:98 ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Kon geen netwerkstatus verkrijgen: " + +# uitvoerdatastroom begrijpt de opdracht 'scrijven' niet +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "schrijven wordt niet ondersteund door de uitvoerdatastroom" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Brongegevensstroom is al gesloten" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:653 +#, fuzzy, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Doelbestand is geen map" + +# huh? +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Invoerdatastroom ondersteunt ‘lezen’ (seek) niet" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +#, fuzzy +msgid "[COMMAND]" +msgstr "OPDRACHT" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Onbekende opdracht %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Geen schema zoals ‘%s’\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema ‘%s’ is niet verplaatsbaar (pad mag niet opgegeven worden)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Sleutel ‘%s’ niet gevonden\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:561 +#, fuzzy +msgid "[SCHEMA[:PATH]]" +msgstr "SCHEMA[:PAD] KEY" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "De waarde van KEY opvragen" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PAD] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Ongeldige socket, niet geïnitialiseerd" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ongeldige socket, initialisatie mislukt door: %s" + +# bronstroom/datastroom van de bron +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Socket is al gesloten" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Time-out bij socket I/O" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocket maken van fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kan socket niet aanmaken: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Onbekende familie opgegeven" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Onbekend protocol opgegeven" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "kon lokaal adres niet verkrijgen: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "kon adres op afstand niet verkrijgen: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "kon niet luisteren: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fout bij het koppelen aan adres: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, fuzzy, c-format +msgid "Error joining multicast group: %s" +msgstr "Fout bij opstarten van het programma: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, fuzzy, c-format +msgid "Error leaving multicast group: %s" +msgstr "Fout bij opstarten van het programma: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fout bij accepteren van verbinding: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Verbinding bezig" + +#: ../gio/gsocket.c:2346 +#, fuzzy +msgid "Unable to get pending error: " +msgstr "Kan fout niet verkrijgen: %s" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fout bij ontvangen van gegevens: %s" + +# openen/lezen +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Fout bij versturen van gegevens: %s" + +#: ../gio/gsocket.c:2804 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Kan socket niet aanmaken: %s" + +#: ../gio/gsocket.c:2883 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Fout bij het sluiten van bestand: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# openen/lezen +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Fout bij versturen van bericht: %s" + +#: ../gio/gsocket.c:3821 +#, fuzzy +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage wordt niet ondersteund op windows" + +# volledig verwijderen/definitief verwijderen/verwijderen +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fout bij ontvangen van bericht: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kan fout niet verkrijgen: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "" + +# Openen van converteerder van '%s' naar '%s' mislukt: %s +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Kon niet verbinden met %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Kon niet verbinden: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Onbekende fout bij verbinden" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +#, fuzzy +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Proxy-protocol ‘%s’ wordt niet ondersteund." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxy-protocol ‘%s’ wordt niet ondersteund." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener is al gesloten" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Toegevoegde socket is gesloten" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ondersteunt IPv6-adres ‘%s’ niet" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Gebruikersnaam is te lang voor het SOCKSv4-protocol" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Hostname ‘%s’ is te lang voor het SOCKSv4-protocol" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "De server is geen SOCKSv4-proxyserver." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Verbinding via SOCKSv4-server is geweigerd" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "De server is geen SOCKSv5-proxyserver." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "De SOCKSv5-proxy vereist authenticatie." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"De SOCKSv5-proxy vereist een authenticatiemethode die niet door GLib wordt " +"ondersteund." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Gebruikersnaam of wachtwoord is te lang voor het SOCKSv5-protocol" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5-authenticatie mislukt wegens onjuiste gebruikersnaam of wachtwoord." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Hostname ‘%s’ is te lang voor het SOCKSv5-protocol" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "De SOCKSv5-proxyserver gebruikt een onbekend adrestype." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Interne SOCKSv5-proxyserverfout" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-verbinding niet toegestaan door regelset." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Host onbereikbaar via SOCKSv5-server." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Netwerk onbereikbaar via SOCKSv5-server." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Verbinding geweigerd via SOCKSv5-server." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-proxy ondersteunt de ‘connect’-opdracht niet." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-proxy ondersteunt het opgegeven adrestype niet." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Onbekende SOCKSv5-proxyfout" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan versie %d van GThemedIcon-codering niet verwerken" + +#: ../gio/gthreadedresolver.c:110 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: ../gio/gthreadedresolver.c:195 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Kan tijdelijk geen resolve doen voor ‘%s’" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Fout bij het verwijderen van bestand: %s" + +#: ../gio/gtlscertificate.c:248 +#, fuzzy +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Kon PEM-gecodeerde privésleutel niet verwerken" + +#: ../gio/gtlscertificate.c:253 +#, fuzzy +msgid "No PEM-encoded private key found" +msgstr "Geen PEM-gecodeerd certificaat gevonden" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Kon PEM-gecodeerde privésleutel niet verwerken" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Geen PEM-gecodeerd certificaat gevonden" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Kon PEM-gecodeerd certificaat niet verwerken" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Dit is de laatste kans om uw wachtwoord correct in te voeren voordat u de " +"toegang ontzegd wordt." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Het ingevoerde wachtwoord is onjuist." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 control-bericht verwacht, maar %d gekregen" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Voortijdig einde aan gegevensstroom" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Eén fd verwacht, maar %d ontvangen\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Ongeldige fd ontvangen" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Fout bij het sturen van credentials:" + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Fout bij controleren of SO_PASSCRED is ingeschakeld voor de socket: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fout bij inschakelen van SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Een enkele byte werd verwacht voor het lezen van credentials, maar geen " +"enkele byte werd gelezen." + +#: ../gio/gunixconnection.c:572 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "1 control-bericht verwacht, maar %d gekregen" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Fout bij het uitschakelen van SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Fout bij lezen van bestandsdescriptor: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Fout bij sluiten van bestandsdescriptor: %s" + +# hoofdmap van bestandssysteem +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Hoofdmap van bestandssysteem" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Fout bij schrijven van bestandsdescriptor: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:439 +msgid "volume doesn't implement eject" +msgstr "volumen 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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"volumen begrijpt de opdracht ‘uitwerpen’ of ‘eject_with_operation’ niet" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Kan het programma niet vinden" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Fout bij opstarten van het programma: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI's worden niet ondersteund" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "associatiewijzigingen niet mogelijk op win32" + +# Associeren/associaties aanmaken +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Associaties aanmaken niet mogelijk op win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Fout bij het lezen van handle: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Fout bij het sluiten van handle: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Fout bij het schrijven naar handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Onvoldoende geheugen" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Interne fout: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Meer invoer nodig" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ongeldige gecomprimeerde gegevens" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adres om op te luisteren" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Adres tonen" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Adres tonen in shell-modus" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Een dbus-service uitvoeren" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Verkeerde argumenten\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Onverwacht attribuut ‘%s’ voor element ‘%s’" + +# aangetroffen hier mooier dan gevonden +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attribuut ‘%s’ van element ‘%s’ is niet aangetroffen" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Onverwachte tag ‘%s’, tag ‘%s’ werd verwacht" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Onverwachte tag ‘%s’ binnen ‘%s’" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Er is geen geldig bladwijzerbestand gevonden in de datamappen" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Er bestaat al een bladwijzer voor de URI ‘%s’" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Geen bladwijzer gevonden voor URI ‘%s’" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Exec-regel ‘%s’ kon niet worden verwerkt met URI ‘%s’" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan vanaf codeverzameling ‘%s’ niet terugvallen op ‘%s’" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "De URI ‘%s’ is ongeldig" + +#: ../glib/gconvert.c:1910 +#, 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:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "De URI ‘%s’ bevat tekens met een foutief controleteken" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Het pad ‘%s’ is geen absoluut pad" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Ongeldige hostnaam" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d-%m-%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "januari" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "februari" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "maart" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "april" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "mei" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "augustus" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "september" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "november" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "december" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mrt" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "mei" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "maandag" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "dinsdag" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "woensdag" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "donderdag" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "vrijdag" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "zaterdag" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "zondag" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ma" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "di" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "wo" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "do" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "vr" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "za" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "zo" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, 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:671 ../glib/gfileutils.c:759 +#, fuzzy, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "" +"Kon geen %lu byte geheugenruimte reserveren om bestand ‘%s’ te lezen" +msgstr[1] "" +"Kon geen %lu byte geheugenruimte reserveren om bestand ‘%s’ te lezen" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fout bij lezen van bestand ‘%s’: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Bestand ‘%s’ is te groot" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Lezen uit bestand ‘%s’ is mislukt: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Openen van bestand ‘%s’ is mislukt: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Aanmaken van bestand ‘%s’ is mislukt: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Schrijven van bestand ‘%s’ is mislukt: fflush() is mislukt: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Schrijven van bestand ‘%s’ is mislukt: fsync() is mislukt: %s" + +#: ../glib/gfileutils.c:1161 +#, 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:1282 +#, 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:1556 +#, 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:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Sjabloon ‘%s’ bevat geen XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Lezen van symbolische verwijzing ‘%s’ is mislukt: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Symbolische verwijzingen zijn niet mogelijk" + +# Openen van converteerder van '%s' naar '%s' mislukt: %s +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Restant aan ongeconverteerde data in de leesbuffer" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanaal eindigt in een gedeeltelijk teken" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +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:758 +msgid "Not a regular file" +msgstr "Geen gewoon bestand" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ongeldige groepsnaam: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Het sleutelbestand start niet met een groep" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ongeldige sleutelnaam: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Het sleutelbestand bevat de niet-ondersteunde tekenset ‘%s’" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Het sleutelbestand bevat geen groep ‘%s’" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Het sleutelbestand bevat geen sleutel ‘%s’" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Sleutel ‘%s’ in groep ‘%s’ heeft de waarde ‘%s’ waar %s werd verwacht" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +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:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Het sleutelbestand bevat ongeldige ontsnappingstekens ‘%s’" + +#: ../glib/gkeyfile.c:4244 +#, 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:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Het geheel getal ‘%s’ valt buiten het bereik" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "De waarde ‘%s’ kan niet geïnterpreteerd worden als een boolese." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Ophalen van eigenschappen van bestand ‘%s%s%s%s’ is mislukt: fstat() is " +"mislukt: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Toewijzen van %s%s%s%s is mislukt: mmap() is mislukt: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Openen van bestand ‘%s’ is mislukt: open() is mislukt: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fout in regel %d teken %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, fuzzy, c-format +msgid "'%s' is not a valid name" +msgstr "‘%s’ is geen geldige naam" + +#: ../glib/gmarkup.c:488 +#, fuzzy, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "‘%s’ is geen geldige naam: ‘%c’" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fout in regel %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Tekenreferentie ‘%-.*s’ staat niet voor een geoorloofd teken" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Lege entiteit ‘&;’ gevonden; geldige entiteiten zijn: & " < " +"> '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entiteitnaam ‘%-.*s’ is onbekend" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Het document moet beginnen met een element (bijv. )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Het document was leeg of bevatte slechts lege ruimte" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Het document eindigde onverwacht na een openingshaakje: ‘<’" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Het document eindigde onverwacht in een elementnaam" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Het document eindigde onverwacht in een attribuutnaam" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Het document eindigde onverwacht in een element-openingstag." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Het document eindigde onverwacht in een attribuutwaarde" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Het document eindigde onverwacht in commentaar of een bewerkingsinstructie" + +#: ../glib/goption.c:754 +msgid "Usage:" +msgstr "Gebruik:" + +#: ../glib/goption.c:754 +msgid "[OPTION...]" +msgstr "[OPTIE…]" + +#: ../glib/goption.c:864 +msgid "Help Options:" +msgstr "Hulpopties:" + +#: ../glib/goption.c:865 +msgid "Show help options" +msgstr "Deze hulptekst tonen" + +#: ../glib/goption.c:871 +msgid "Show all help options" +msgstr "Alle hulpteksten tonen" + +#: ../glib/goption.c:933 +msgid "Application Options:" +msgstr "Programmaopties:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan het geheel getal ‘%s’ voor %s niet verwerken" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan het lange geheel getal ‘%s’ voor %s niet verwerken" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Fout bij verwerken van optie %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Ontbrekend argument voor %s" + +#: ../glib/goption.c:1979 +#, c-format +msgid "Unknown option %s" +msgstr "Onbekende optie %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "beschadigd object" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "interne fout of beschadigd object" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "onvoldoende geheugen" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "limiet voor backtracking bereikt" + +# voor deelzoeken +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "het patroon bevat niet-ondersteunde tekens" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "achterwaartse referenties als condities zijn niet mogelijk" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "recursielimiet bereikt" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ongeldige combinatie van nieuwe-regelvlaggen" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "verkeerde offset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "te korte UTF-8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "recursie-loop" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "onbekende fout" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ aan het einde van het patroon" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c aan het einde van het patroon" + +# onbekend/niet herkend +#: ../glib/gregex.c:335 +#, fuzzy +msgid "unrecognized character following \\" +msgstr "onbekend teken volgt na \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "getallen in verkeerde volgorde in {} waardegever" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "getal te groot in {} waardegever" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "sluithaakje ] ontbreekt bij lettertekenklasse" + +# controleteken/sturingsteken/stuurcode/escape-teken +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ongelde stuurcode in lettertekenklasse" + +# [Z-a] +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "bereik in verkeerde volgorde in lettertekenklasse" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "niets te herhalen" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "onverwachte herhaling" + +#: ../glib/gregex.c:360 +#, fuzzy +msgid "unrecognized character after (? or (?-" +msgstr "onbekend teken na (?" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX benoemde klassen zijn alleen ondersteund binnen een klasse" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ontbrekend sluithaakje: )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "verwijzing naar een niet-bestaand subpatroon" + +# opmerking/commentaar +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ontbrekend sluithaakje ) na commentaar" + +# te groot/te lang +#: ../glib/gregex.c:375 +#, fuzzy +msgid "regular expression is too large" +msgstr "reguliere expressie te groot" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "kon onvoldoende geheugen krijgen" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") zonder openingshaakje: (" + +# te weinig geheugen voor code/code overstroomt/ +# programmacode loopt over +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "overstroming programmacode" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "onbekend teken na (?<" + +# terugkijkbewering +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "‘lookbehind assertion’ heeft geen vaste lengte" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "foutief getal of naam na (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "voorwaardelijke groep bevat meer dan twee vertakkingen" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "bewering verwacht na (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R of (?[+-]cijfers moeten gevolgd worden door )" + +#: ../glib/gregex.c:412 +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:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-samengestelde elementen worden niet ondersteund" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "lettertekenwaarde in de reeks \\x{...} is te groot" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ongeldige voorwaarde (?(0)" + +# terugkijkbewering +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C niet toegestaan in ‘lookbehind assertion’" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "Escapes \\L, \\l, \\N{name}, \\U, en \\u worden niet ondersteund" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "recursieve aanroep zou oneindig kunnen doorlopen" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "onbekend teken na (?P" + +# afsluiter/afsluitteken +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "afsluitteken ontbreekt in naam subpatroon" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "twee genoemde subpatronen hebben dezelfde naam" + +# onjuist samengesteld/gevormd +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "onjuist gevormde \\P of \\p reeks" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "onbekende eigenschapnaam na \\P of \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "naam van subpatroon is te lang (maximaal 32 tekens)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "teveel genoemde subpatronen (maximaal 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "octale waarde is groter dan \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "compile-werkruimte is overlopen" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "eerder nagekeken gerefereerd subpatroon niet gevonden" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-groep bevat meer dan één vertakking" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "inconsistente NEWLINE-opties" + +#: ../glib/gregex.c:476 +#, fuzzy +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g wordt niet gevolgd door een naam tussen haakjes, of getal niet gelijk " +"aan nul, optioneel tussen haakjes" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "" + +# afsluiter/afsluitteken +#: ../glib/gregex.c:492 +#, fuzzy +msgid "missing subpattern name after (?&" +msgstr "afsluitteken ontbreekt in naam subpatroon" + +#: ../glib/gregex.c:495 +#, fuzzy +msgid "digit expected after (?+" +msgstr "cijfer verwacht" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" + +#: ../glib/gregex.c:501 +#, fuzzy +msgid "different names for subpatterns of the same number are not allowed" +msgstr "twee genoemde subpatronen hebben dezelfde naam" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "" + +#: ../glib/gregex.c:510 +#, fuzzy +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\g wordt niet gevolgd door een naam tussen haakjes, of getal niet gelijk " +"aan nul, optioneel tussen haakjes" + +#: ../glib/gregex.c:513 +#, fuzzy +msgid "\\N is not supported in a class" +msgstr "Zoeken binnen datastroom niet mogelijk" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "" + +#: ../glib/gregex.c:522 +#, fuzzy +msgid "character value in \\u.... sequence is too large" +msgstr "lettertekenwaarde in de reeks \\x{...} is te groot" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fout bij reguliere expressie %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-bibliotheek is gecompileerd zonder ondersteuning voor UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" +"PCRE-bibliotheek is gecompileerd zonder ondersteuning voor UTF8-eigenschappen" + +#: ../glib/gregex.c:1331 +#, fuzzy +msgid "PCRE library is compiled with incompatible options" +msgstr "" +"PCRE-bibliotheek is gecompileerd zonder ondersteuning voor UTF8-eigenschappen" + +# opbouwen/compileren +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fout bij optimaliseren van reguliere expressie %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimaal getal of ‘}’ verwacht" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "hexadecimaal getal verwacht" + +# tekort/ontbreekt/te weinig +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "‘<’ ontbreekt in verwijzing" + +# symbolische verwijzing +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "onafgemaakte verwijzing" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "verwijzing heeft nullengte" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "cijfer verwacht" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ongeldige verwijzing" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "extra afsluiting ‘\\’" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "onbekende escape-reeks" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Aangehaalde tekst begint niet met een ‘\"’-teken" + +# solitair "-teken/ongebalanceerd +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "De tekst was leeg (of bevatte slechts lege ruimte)" + +#: ../glib/gspawn.c:203 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Lezen van data van dochterproces is mislukt (%s)" + +#: ../glib/gspawn.c:362 +#, 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:853 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Dochterproces eindigde met code %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Dochterproces afgesloten met signaal %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Dochterproces gestopt met signaal %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "Dochterproces eindigde niet normaal" + +#: ../glib/gspawn.c:1280 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Lezen van pijplijn naar dochter (%s) is mislukt" + +#: ../glib/gspawn.c:1348 +#, c-format +msgid "Failed to fork (%s)" +msgstr "De fork is mislukt (%s)" + +#: ../glib/gspawn.c:1496 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Wijzigen naar map ‘%s’ is mislukt (%s)" + +#: ../glib/gspawn.c:1506 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Uitvoeren van dochterproces ‘%s’ is mislukt (%s)" + +# was eerst: herleiden +#: ../glib/gspawn.c:1516 +#, 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:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Het forken van een dochterproces is mislukt (%s)" + +#: ../glib/gspawn.c:1533 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Onbekende fout bij het uitvoeren van dochterproces ‘%s’" + +#: ../glib/gspawn.c:1557 +#, 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/gspawn.c:1630 ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Lezen van data van dochterproces is mislukt" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ongeldige tekenreeks in omgeving: %s" + +# werkmap/huidige map +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ongeldige werkmap: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Uitvoeren van het hulpprogramma (%s) is mislukt" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Teken valt buiten het bereik van UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Ongeldige reeks in conversieinvoer" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Teken valt buiten het bereik van UTF-16" + +# ook byte voor meervoud (het bestand is 29 byte groot) +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +# ook byte voor meervoud (het bestand is 29 byte groot) +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Ongebruikelijk beëindiging van programma tijdens starten van " +#~ "opdrachtregel ‘%s’: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Opdrachtregel ‘%s’ beëindigd met exit-status %d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "limiet voor lege substrings bereikt" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "tekens die hoofd,- en kleine letters wijzigen zijn hier niet toegestaan" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "herhalen van een DEFINE-groep is niet toegestaan" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Onverwachte fout in waitpid() (%s)" + +#~ msgid "File is empty" +#~ msgstr "Bestand is leeg" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Deze optie zal binnenkort verwijderd worden." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Fout bij het benaderen van bestand ‘%s’: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Geen service-record voor ‘%s’" + +#~ msgid "Error connecting: " +#~ msgstr "Fout tijdens verbinden: " + +# openen/lezen +#~ msgid "Error connecting: %s" +#~ msgstr "Fout bij verbinden: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "De SOCKSv4-implementatie limiteert de gebruikersnaam tot %i tekens" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "De SOCKSv4-implementatie limiteert de host-naam tot %i tekens" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Fout bij lezen van unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Fout bij sluiten van unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Fout bij schrijven naar unix: %s" + +#, fuzzy +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "naam" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" diff --git a/po/nn.po b/po/nn.po new file mode 100644 index 0000000..090cea2 --- /dev/null +++ b/po/nn.po @@ -0,0 +1,3916 @@ +# translation of nn.po to Norwegian Nynorsk +# Roy-Magne Mo , 2002. +# Åsmund Skjæveland , 2003-2008, 2011. +# Norwegian (Nynorsk) translation of glib +# Copyright (C) Free Software Foundation, 2002. +msgid "" +msgstr "" +"Project-Id-Version: nn\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-12-26 17:14+0100\n" +"Last-Translator: Åsmund Skjæveland \n" +"Language-Team: Norwegian Nynorsk \n" +"Language: nn\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Uventa attributt «%s» til elementet «%s»" + +#: ../glib/gbookmarkfile.c:791 +#: ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 +#: ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributt «%s» til elementet «%s» ikkje funnen" + +#: ../glib/gbookmarkfile.c:1149 +#: ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 +#: ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Uventa merke «%s», venta merket «%s»" + +#: ../glib/gbookmarkfile.c:1174 +#: ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 +#: ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Uventa merke «%s» inni «%s»" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Klarte ikkje Ã¥ finna gyldig bokmerkefil i datamappene" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Eit bokmerke for adressa «%s» finst frÃ¥ før" + +#: ../glib/gbookmarkfile.c:2081 +#: ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 +#: ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 +#: ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 +#: ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 +#: ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 +#: ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 +#: ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 +#: ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Klarte ikkje Ã¥ finna noko bokmerke for adressa «%s»" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 +#: ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 +#: ../glib/gconvert.c:645 +#: ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller innheldt berre tomme teikn" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument avslutta uventa rett etter ei open vinkelhake «<»" + +#: ../glib/gmarkup.c:1734 +#: ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet tok uventa slutt inni eit elementnamn" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet tok uventa slutt inni eit attributtnamn" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet avslutta uventa medan det var inne i ein attributtverdi" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumentet avslutta uventa inne i ein merknad eller prosseseringsinstruksjon" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "øydelagt objekt" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "intern feil eller øydelagt objekt" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "tom for minne" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "tilbakesporingsgrensa nÃ¥dd" + +#: ../glib/gregex.c:210 +#: ../glib/gregex.c:218 +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:212 +#: ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "intern feil" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "rekursjonsgrensa nÃ¥dd" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "arbeidsomrÃ¥degrensa for tomme understrengar nÃ¥dd" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "ugyldig kombinasjon av nylinjeflagg" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "ukjend feil" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutten av mønsteret" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutten av mønsteret" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "ukjend teikn etter \\" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "tal ikkje i rekkefølgje i {}-kvantor" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "tal for stort i {}-kvantor" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "manglar avsluttande ] i teiknklassen" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "ugyldig skiftesekvens i teiknklassen" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "spenn ikkje i rekkefølgje i teiknklassen" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "ikkje noko Ã¥ gjenta" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "kjenner ikkje att teiknet etter (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "kjenner ikkje att teiknet etter (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "kjenner ikkje att teiknet etter (?P" + +#: ../glib/gregex.c:306 +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:309 +msgid "missing terminating )" +msgstr "manglar avsluttande )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]tal mÃ¥ følgjast av )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "referanse til undermønster som ikkje finst" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "manglar ) etter kommentar" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "regulært uttrykk for stort" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "klarte ikkje Ã¥ fÃ¥ minne" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "bakoversøk-pÃ¥stand har ikkje fast lengde" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "uleseleg tal eller namn etter (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "vilkÃ¥rgruppa inneheld meir enn to greiner" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "pÃ¥stand venta etter (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "ukjend POSIX-klassenamn" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-type sorterte element er ikkje støtta" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "teiknverdi i \\x{...}-sekvens er for stor" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "ugyldig vilkÃ¥r (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ikkje tillate i bakoversøk-pÃ¥stand" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt kall kan kanskje gÃ¥ til evig tid" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "manglar lukketeikn i undermønsternamn" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "to namngjevne undermønster har same namn" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "feilskriven \\P- eller \\p-sekvens" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "ukjend eigenskapnamn etter \\P eller \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermønsternamn for langt (toppen 32 teikn)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "for mange namngjevne undermønster (toppen 10 000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "oktalverdi er større enn \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-gruppe inneheld meir enn ei grein" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "det er ikkje tillate Ã¥ gjenta ei DEFINE-gruppe" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistente NEWLINE-val" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "uventa gjentaking" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "kode-overflyt" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "gjekk utanfor kompileringsarbeidsomrÃ¥det" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "tidlegare kontrollert referert undermønster ikkje funne" + +#: ../glib/gregex.c:630 +#: ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Feil under samanlikning med regulært uttrykk %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-bibliotek er kompilert utan støtte for UTF-8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-bibliotek er kompilert utan støtte for UTF-8-eigenskapar" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Feil under optimering av regulært uttrykk %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "heksadesimalt teikn eller «}» venta" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "heksadesimalt teikn venta" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "manglar «<» i symbolsk referanse" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "uferdig symbolsk referanse" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "null-lengd symbolsk referanse" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "venta siffer" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "ugyldig symbolsk referanse" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "laus avsluttande «\\»" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "ukjend skiftesekvens" + +#: ../glib/gregex.c:2360 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Sitert tekst startar ikkje med eit siteringsmerke" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksten var tom (eller inneheldt berre tomme teikn)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Klarte ikkje Ã¥ lesa data frÃ¥ barneprosess" + +#: ../glib/gspawn-win32.c:299 +#: ../glib/gspawn.c:1517 +#, 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:338 +#: ../glib/gspawn-win32.c:346 +#: ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Klarte ikkje Ã¥ lesa frÃ¥ røyr frÃ¥ barn (%s)" + +#: ../glib/gspawn-win32.c:369 +#: ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Klarte ikkje Ã¥ skifta til katalogen «%s» (%s)" + +#: ../glib/gspawn-win32.c:375 +#: ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Klarte ikkje Ã¥ utføra barneprosess (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ugyldig programnamn: %s" + +#: ../glib/gspawn-win32.c:454 +#: ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ugyldig streng i argumentvektor plass %d: %s" + +#: ../glib/gspawn-win32.c:465 +#: ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ugyldig streng i miljø: %s" + +#: ../glib/gspawn-win32.c:718 +#: ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ugyldig arbeidskatalog: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Klarte ikkje Ã¥ køyra hjelpeprogram (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Klarte ikkje Ã¥ lesa data frÃ¥ barneprosess (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Uventa feil i waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Kunne ikkje starta barneprosess (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Klarte ikkje Ã¥ utføra barnprosess «%s» (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Kunne ikkje starta barneprosess (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ukjend feil ved køyring av barneprosess «%s»" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Teikn ikkje gyldig for UTF-8" + +#: ../glib/gutf8.c:1186 +#: ../glib/gutf8.c:1195 +#: ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 +#: ../glib/gutf8.c:1473 +#: ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Ugyldig sekvens i inndata-konvertering" + +#: ../glib/gutf8.c:1484 +#: ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Teikn ikkje gyldig for UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Bruk:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[VAL...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Hjelpeval:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Vis hjelpeval" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Vis alle hjelpevala" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Programval:" + +#: ../glib/goption.c:997 +#: ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan ikkje tolka heiltalsverdien «%s» til %s" + +#: ../glib/goption.c:1007 +#: ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Heiltalsverdien «%s» til «%s» utanfor gyldig omrÃ¥de" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan ikkje tolka flyttalsverdien «%s» til «--%s»" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Flyttalsverdien «%s» til «%s» utanfor gyldig omrÃ¥de" + +#: ../glib/goption.c:1303 +#: ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Feil under tolking av val %s" + +#: ../glib/goption.c:1413 +#: ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument manglar for %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Ukjend val «%s»" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Klarte ikkje Ã¥ finna gyldig nøkkelfil i søkjemappene" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Ikkje ei vanleg fil" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Fila er tom" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ugyldig gruppenamn: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Nøkkelfila startar ikkje med ei gruppe" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ugyldig nøkkelnamn: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nøkkelfila inneheld den ikkje støtta kodinga «%s»" + +#: ../glib/gkeyfile.c:1149 +#: ../glib/gkeyfile.c:1311 +#: ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 +#: ../glib/gkeyfile.c:2887 +#: ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 +#: ../glib/gkeyfile.c:3394 +#: ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nøkkelfila manglar gruppa «%s»" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nøkkelfila manglar nøkkelen «%s»" + +#: ../glib/gkeyfile.c:1430 +#: ../glib/gkeyfile.c:1546 +#, 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:1450 +#: ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 +#: ../glib/gkeyfile.c:2515 +#, 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:2701 +#: ../glib/gkeyfile.c:2902 +#: ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "Nøkkelfila inneheld escape-teikn pÃ¥ slutten av linja" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nøkkelfila inneheld ugyldig escape-sekvens «%s»" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Verdien «%s» kan ikkje tolkast som eit tal." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heiltalsverdien «%s» er utanfor gyldig omrÃ¥de" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Verdien «%s» kan ikkje tolkast som eit flyttal." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Verdien «%s» kan ikkje tolkast som ein boolsk verdi." + +#: ../gio/gbufferedinputstream.c:411 +#: ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 +#: ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 +#: ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 +#: ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "For stor teljingsverdi sendt til %s" + +#: ../gio/gbufferedinputstream.c:881 +#: ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 +#: ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Straumen er allereie stengt" + +#: ../gio/gcancellable.c:321 +#: ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 +#: ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 +#: ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Operasjonen vart avbroten" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 +#: ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: ../gio/gcharsetconverter.c:318 +#: ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 +#: ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "%s-type" + +#: ../gio/gcredentials.c:273 +#: ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Uventa tidleg slutt pÃ¥ straumen" + +#: ../gio/gdbusaddress.c:142 +#: ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 +#: ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 +#: ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "Key/Value pair %d, `%s', in address element `%s', does not contain an equal sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Feil ved trunkering av fila: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Feil ved opning av fila «%s»: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 +#: ../gio/gdbusconnection.c:6409 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 +#: ../gio/gdbusconnection.c:6418 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Ukjend type" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Feil ved opning av katalog «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Feil ved opning av katalog «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Feil ved opning av fila «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 +#: ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 +#: ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 +#: ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Feil ved stenging av fila: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Feil ved opning av fila «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Feil ved opning av fila «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 +#: ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 +#: ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Teljaren er stengt" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 +#: ../gio/gdbusconnection.c:4086 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 +#: ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 +#: ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Straumen er allereie stengt" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 +#: ../gio/gdbusproxy.c:2734 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Papirkorg er ikkje støtta" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 +#: ../gio/gdbus-tool.c:218 +#: ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 +#: ../gio/gdbus-tool.c:691 +#: ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Feil pÃ¥ linje %d: %s" + +#: ../gio/gdbus-tool.c:173 +#: ../gio/gdbus-tool.c:231 +#: ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Feil under tolking av val %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 +#: ../gio/gdbus-tool.c:822 +#: ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 +#: ../gio/gdbus-tool.c:883 +#: ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Teiknet «%s» er ikkje gyldig inne i eit entitetsnamn" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Teiknet «%s» er ikkje gyldig inne i eit entitetsnamn" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Teiknet «%s» er ikkje gyldig inne i eit entitetsnamn" + +#: ../gio/gdbus-tool.c:669 +#: ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Feil under tolking av val %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Feil under konvertering: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 +#: ../gio/gdbus-tool.c:1568 +#: ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 +#: ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Feil ved opning av katalog «%s»: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "øydelagt objekt" + +#: ../gio/gdesktopappinfo.c:572 +#: ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Utan namn" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivebordfila oppgav ikkje Exec-felt" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Klarte ikkje Ã¥ finna terminalen programmet krev" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Kan ikkje laga programoppsettmappe %s for brukaren: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Kan ikkje laga MIME-oppsettmappe %s: %s" + +#: ../gio/gdesktopappinfo.c:1785 +#: ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan ikkje laga skrivebordfila %s for brukaren" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Sjølvvald definisjon av %s" + +#: ../gio/gdrive.c:363 +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:728 +#, fuzzy +msgid "drive doesn't implement start" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#: ../gio/gdrive.c:831 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "stasjonen støttar ikkje Ã¥ løysa ut" + +#: ../gio/gdummytlsbackend.c:168 +#: ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 +#: ../gio/gfile.c:1102 +#: ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 +#: ../gio/gfile.c:1528 +#: ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 +#: ../gio/gfile.c:1723 +#: ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 +#: ../gio/gfile.c:3307 +#: ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 +#: ../gio/gfile.c:3534 +#: ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 +#: ../gio/gfile.c:4352 +#: ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 +#: ../gio/gfile.c:4626 +#: ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 +#: ../gio/gfile.c:5308 +#: ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 +#: ../gio/gfile.c:7037 +#: ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 +#: ../gio/glocalfile.c:1051 +#: ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Omsluttande monteringspunkt finst ikkje" + +#: ../gio/gfile.c:2411 +#: ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Kan ikkje skriva over mappe" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Kan ikkje skriva ei mappe over ei mappe" + +#: ../gio/gfile.c:2480 +#: ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "MÃ¥lfila finst" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Kan ikkje kopiera katalog rekursivt" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Symbolske lenkjer er ikkje støtta" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gfile.c:2909 +#, fuzzy +msgid "Can't copy special file" +msgstr "Kan ikkje skriva over mappe" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Ugyldig symlink-verdi oppgjeven" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Papirkorg er ikkje støtta" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnamn kan ikkje innehalda «%c»" + +#: ../gio/gfile.c:6006 +#: ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "volumet støttar ikkje montering" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Ingen program er registrert til Ã¥ handtera denne fila" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Teljaren er stengt" + +#: ../gio/gfileenumerator.c:212 +#: ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 +#: ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Filteljaren har ventande operasjon" + +#: ../gio/gfileenumerator.c:361 +#: ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Filteljaren er allereie lukka" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 +#: ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 +#: ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Straumen støttar ikkje query_info" + +#: ../gio/gfileinputstream.c:335 +#: ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Søking ikkje støtta i straumen" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Trunkering ikkje tillate pÃ¥ innstraumen" + +#: ../gio/gfileiostream.c:463 +#: ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Trunkerung ikkje tillate pÃ¥ straumen" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 +#: ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Straumen har ventande operasjon" + +#: ../gio/ginetsocketaddress.c:181 +#: ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Papirkorg er ikkje støtta" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid " shadows in ; use to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Ugyldig attributtype (venta streng)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid " is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 +#: ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 +#: ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 +#: ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is out of the range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +#: ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Klarer ikkje Ã¥ finna typen standard lokal mappeovervakar" + +#: ../gio/glocalfile.c:571 +#: ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ugyldig filnamn %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Feil ved henting av filsysteminfo: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Kan ikkje gje rotmappa nytt namn" + +#: ../gio/glocalfile.c:1117 +#: ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Feil ved namnebyte pÃ¥ fila: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Kan ikkje gje fila nytt namn, filnamnet finst frÃ¥ før" + +#: ../gio/glocalfile.c:1139 +#: ../gio/glocalfile.c:2129 +#: ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 +#: ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 +#: ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Ugyldig filnamn" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Kan ikkje opna mappa" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Feil under fjerning av fila: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Feil under kassering av fila: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Klarte ikkje Ã¥ laga papirkorgmappa %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Klarar ikkje Ã¥ finna toppnivÃ¥mappe for papirkorga" + +#: ../gio/glocalfile.c:1931 +#: ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Klarar ikkje Ã¥ finna eller laga papirkorgmappa" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Klarte ikkje Ã¥ laga infofil om kassering: %s" + +#: ../gio/glocalfile.c:2014 +#: ../gio/glocalfile.c:2019 +#: ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Klarte ikkje Ã¥ kassera fila: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Feil ved opning av katalog «%s»: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Klarte ikkje Ã¥ lesa den symbolske lenkja «%s»: %s" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Klarte ikkje Ã¥ laga symbolsk lenkje: %s" + +#: ../gio/glocalfile.c:2228 +#: ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Feil under flytting av fil: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Kan ikkje flytta mappa over ei mappe" + +#: ../gio/glocalfile.c:2278 +#: ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 +#: ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 +#: ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Klarte ikkje Ã¥ laga tryggleikskopi av fila" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Klarte ikkje Ã¥ sletta mÃ¥lfila: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Flytting mellom monteringar ikkje støtta" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Attributtverdien mÃ¥ vera ikkje-NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Ugyldig attributtype (venta streng)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Ugyldig utvida attributtnamn" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Feil under endring av utvida attributtverdi «%s»: %s" + +#: ../gio/glocalfileinfo.c:1482 +#: ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Feil under lesing av informasjon om fila «%s»: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "(ugyldig teiknkoding)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Feil under lesing av info om fildeskriptoren: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ugyldig attributtype (venta uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ugyldig attributtype (venta uint64)" + +#: ../gio/glocalfileinfo.c:1850 +#: ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ugyldig attributtype (venta byte-streng)" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Feil endring av løyve: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Feil endring av løyve: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Feil under eigarskifte: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "symbolsk lenkje mÃ¥ vera ikkje-NULL" + +#: ../gio/glocalfileinfo.c:2004 +#: ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fil under oppretting av symbolsk lenkje: %s" + +#: ../gio/glocalfileinfo.c:2013 +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:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Feil endring av løyve: %s" + +#: ../gio/glocalfileinfo.c:2162 +#, fuzzy +msgid "SELinux context must be non-NULL" +msgstr "symbolsk lenkje mÃ¥ vera ikkje-NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Feil under eigarskifte: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Å setja attributten %s er ikkje støtta" + +#: ../gio/glocalfileinputstream.c:185 +#: ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Feil ved lesing frÃ¥ fila: %s" + +#: ../gio/glocalfileinputstream.c:216 +#: ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 +#: ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Feil ved søking i fila: %s" + +#: ../gio/glocalfileinputstream.c:261 +#: ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Feil ved stenging av fila: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Klarer ikkje Ã¥ finna typen standard lokal filovervakar" + +#: ../gio/glocalfileoutputstream.c:202 +#: ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Feil under fjerning av gamal tryggleikskopilenkje: %s" + +#: ../gio/glocalfileoutputstream.c:297 +#: ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Feil ved oppretting av tryggleikskopi: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Feil ved namnebyte pÃ¥ mellombels fil: %s" + +#: ../gio/glocalfileoutputstream.c:516 +#: ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Feil ved trunkering av fila: %s" + +#: ../gio/glocalfileoutputstream.c:577 +#: ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 +#: ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 +#: ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Feil ved opning av fila «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "MÃ¥lfila er ei mappe" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfila er ikkje ei vanleg fil" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Fila vart endra utanfrÃ¥" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Feil under fjerning av fila: %s" + +#: ../gio/gmemoryinputstream.c:486 +#: ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Ugyldig GSeekType sendt med" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Ugyldig søkeførespurnad" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan ikkje trunkera GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Utstraumen frÃ¥ minnet kan ikkje endra storleik" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Klarte ikkje Ã¥ endra storleik pÃ¥ utstraumen frÃ¥ minnet" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "Amount of memory required to process the write is larger than available address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +#, 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:874 +#, fuzzy +msgid "mount doesn't implement synchronous content type guessing" +msgstr "monteringspunktet støttar ikkje avmontering" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 +#: ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "utstraumen støttar ikkje skriving" + +#: ../gio/goutputstream.c:372 +#: ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Kjeldestraumen er allereie stengt" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Feil ved lesing av fil «%s»: %s" + +#: ../gio/gresolver.c:864 +#: ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 +#: ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 +#: ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Feil under fjerning av fila: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 +#: ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 +#: ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 +#: ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Ukjend val «%s»" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +#, fuzzy +msgid "Socket is already closed" +msgstr "Kjeldestraumen er allereie stengt" + +#: ../gio/gsocket.c:298 +#: ../gio/gsocket.c:2798 +#: ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Feil ved lesing frÃ¥ fila: %s" + +#: ../gio/gsocket.c:498 +#: ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Klarte ikkje Ã¥ laga papirkorgmappa %s: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Feil under konvertering: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Feil ved trunkering av fila: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gsocket.c:1738 +#: ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Klarte ikkje Ã¥ kassera fila: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Feil under fjerning av fila: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Klarte ikkje Ã¥ laga papirkorgmappa %s: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Feil ved stenging av fila: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 +#: ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gsocket.c:3081 +#, fuzzy +msgid "GSocketControlMessage not supported on windows" +msgstr "Ã¥ endra assosiasjonar er ikkje støtta pÃ¥ win32" + +#: ../gio/gsocket.c:3358 +#: ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Feil under fjerning av fila: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 +#: ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "ukjend feil" + +#: ../gio/gsocketclient.c:836 +#: ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 +#: ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Symbolske lenkjer er ikkje støtta" + +#: ../gio/gsocketlistener.c:191 +#, fuzzy +msgid "Listener is already closed" +msgstr "Straumen er allereie stengt" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 +#: ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 +#: ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 +#: ../gio/gunixconnection.c:531 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "Uventa tidleg slutt pÃ¥ straumen" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Feil ved opning av fila: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "Unexpected option length while checking if SO_PASSCRED is enabled for socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Feil ved namnebyte pÃ¥ fila: %s" + +#: ../gio/gunixconnection.c:509 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 +#: ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Feil ved lesing frÃ¥ unix: %s" + +#: ../gio/gunixinputstream.c:421 +#: ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 +#: ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Feilved lukking av: %s" + +#: ../gio/gunixmounts.c:1900 +#: ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Filsystemrot" + +#: ../gio/gunixoutputstream.c:353 +#: ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Feil under skriving til unix: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +#, fuzzy +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volumet støttar ikkje Ã¥ løysa ut" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Kan ikkje finna programmet" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Feil under oppstart av programmet: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI-ar er ikkje støtta" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "Ã¥ endra assosiasjonar er ikkje støtta pÃ¥ win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Å laga assosiasjonar er ikkje støtta pÃ¥ win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Feil ved lesing frÃ¥ fila: %s" + +#: ../gio/gwin32inputstream.c:348 +#: ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Feil ved stenging av fila: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Feil ved skriving til fila: %s" + +#: ../gio/gzlibcompressor.c:396 +#: ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "tom for minne" + +#: ../gio/gzlibcompressor.c:403 +#: ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "intern feil" + +#: ../gio/gzlibcompressor.c:416 +#: ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Ugyldig vertsnamn" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Kan ikkje flytta mappa over ei mappe" + +#, 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 "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.po b/po/oc.po new file mode 100644 index 0000000..9afbaf4 --- /dev/null +++ b/po/oc.po @@ -0,0 +1,3718 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2008-04-23 10:42+0200\n" +"Last-Translator: Yannig Marchegay (Kokoyaya) \n" +"Language-Team: Occitan \n" +"Language: oc\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "genièr" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "febrièr" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "març" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "abrial" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "mai" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "junh" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "julhet" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "gen" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "abr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "mai" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "diluns" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "dimars" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "dimecres" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "dijóus" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "divendres" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "disabte" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "dimenge" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "lun" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "mar" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mec" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "jòu" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ven" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sab" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dim" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Impossible de dobrir le fichièr '%s' : %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octets" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f Mo" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f Go" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Mo" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Go" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f ko" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octets" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f ko" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Sintaxi :" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPCION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opcions de l'aplicacion :" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Lo fichièr es void" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Tipe desconegut" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sens nom" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Nom d'òste invalid" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gsocket.c:2163 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error al moment de crear lo repertòri : %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Error de lectura del fichièr '%s' : %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "" + +#~ msgid "[FILE...]" +#~ msgstr "[FICHIÈR...]" + +#~ msgid "name" +#~ msgstr "nom" + +#~ msgid "names" +#~ msgstr "noms" diff --git a/po/or.po b/po/or.po new file mode 100644 index 0000000..d45d705 --- /dev/null +++ b/po/or.po @@ -0,0 +1,4506 @@ +# 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, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.or\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-11-11 13:18+0000\n" +"PO-Revision-Date: 2012-11-27 19:16+0530\n" +"Last-Translator: Manoj Kumar Giri \n" +"Language-Team: Oriya \n" +"Language: or\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "ଅତ୍ୟଧିକ ବଡ଼ ଗଣନା ମୂଲ୍ୟ %sକୁ ପଠାଯାଇଛି" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "ମୂଳ ଧାରାରେ ଦୁର୍ବଳତା ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gbufferedinputstream.c:951 +#| msgid "Cannot truncate GMemoryInputStream" +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream କୁ ବିଚ୍ଛିନ୍ନ କରିହେବ ନାହିଁ" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "ଧାରା ପୂର୍ବରୁ ବନ୍ଦଅଛି" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "ମୂଳ ଧାରାରେ କାଟିବା ଅନୁମୋଦିତ ନୁହଁ" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2125 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "ପ୍ରୟୋଗଟି ବାତିଲ ହୋଇଛି" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "ଅବୈଧ ବସ୍ତୁ, ଆରମ୍ଭ ହୋଇନାହିଁ" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ନିବେଶରେ ଅସମ୍ପୂର୍ଣ୍ଣ ଏକାଧିକ ବାଇଟ କ୍ରମ" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "ଲକ୍ଷ୍ଯସ୍ଥଳରେ ଯଥେଷ୍ଟ ସ୍ଥାନ ନାହିଁ" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2469 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ବାଇଟ୍ ଅନୁକ୍ରମ" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2481 +#, c-format +msgid "Error during conversion: %s" +msgstr "ରୁପାନ୍ତରଣରେ ତ୍ରୁଟି: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "ବାତିଲଯୋଗ୍ୟ ପ୍ରାରମ୍ଭିକରଣ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ଅକ୍ଷର ସେଟ୍ '%s'କୁ '%s'େର ରୂପାନ୍ତରିତ କରିବା ଅସହାୟକ" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s'ରୁ '%s'ର ରୁପାନ୍ତରକ ଖୋଲି ହେଲା ନାହିଁ" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s ପ୍ରକାର" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "ଅଜଣା ପ୍ରକାର" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ଫାଇଲପ୍ରକାର" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "ଏହି OS ରେ GCredentials କୁ କାର୍ଯ୍ୟକାରୀ କରାଯାଇନାହିଁ" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "ଆପଣଙ୍କ ପ୍ଲାଟଫର୍ମ ପାଇଁ କୌଣସି GCredentials ସହାୟତା ନାହିଁ" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ପ୍ରାରମ୍ଭିକ ଧାରାର ଶେଷ" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "ଠିକଣା ଭରଣ `%s' ରେ ଅସମର୍ଥିତ କି `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"ଠିକଣା `%s' ଟି ଅବୈଧ ଅଟେ (କେବଳ ଗୋଟିଏ ପଥ ଆବଶ୍ୟକ, tmpdir କିମ୍ବା କଢ଼ାଯାଇଥିବା " +"କିଗୁଡ଼ିକ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "ଠିକଣା ଭରଣ `%s' ରେ ଅର୍ଥହୀନ କି/ମୂଲ୍ୟ ଯୁଗଳ" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "ଠିକଣା `%s' ରେ ତ୍ରୁଟି - ପୋର୍ଟ ଗୁଣଧର୍ମଟି ତ୍ରୁଟିଯୁକ୍ତ ଅଟେ" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "ଠିକଣା `%s' ରେ ତ୍ରୁଟି - ପରିବାର ଗୁଣଧର୍ମଟି ତ୍ରୁଟିଯୁକ୍ତ ଅଟେ" + +#: ../gio/gdbusaddress.c:454 +#, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "ଠିକଣା ଉପାଦନ `%s' ରେ କୌଣସି କଲନ (:) ନଥାଏ" + +#: ../gio/gdbusaddress.c:475 +#, c-format +#| msgid "" +#| "Key/Value pair %d, `%s', in address element `%s', does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "କି/ମୂଲ୍ୟ ଯୁଗଳ %d, `%s', ଠିକଣା ଉପାଦାନ `%s' ରେ ସମାନ ଚିହ୍ନ ଧାରଣ କରିନଥାଏ" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"କି/ମୂଲ୍ୟ ଯୁଗଳ %d, `%s' ରେ କି କିମ୍ବା ମୂଲ୍ୟକୁ ନଛଡ଼ାଇବାରେ ତ୍ରୁଟି, ଠିକଣା ଉପାଦାନ" +"`%s' ରେ" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"ଠିକଣା `%s' ରେ ତ୍ରୁଟି - unix ପରିବହନ `path' ଅଥବା `abstract' କିଗୁଡ଼ିକ ମଧ୍ଯରୁ " +"ଗୋଟିଏକୁ " +"ସେଟ କରିବା ପାଇଁ ଆବଶ୍ୟକ କରିଥାଏ" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "ଠିକଣା `%s' ରେ ତ୍ରୁଟି - ହୋଷ୍ଟ ଗୁଣଧର୍ମ ନାହିଁ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "ଠିକଣା `%s' ରେ ତ୍ରୁଟି - ପୋର୍ଟ ଗୁଣଧର୍ମ ନାହିଁ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "ଠିକଣା `%s' ରେ ତ୍ରୁଟି - ନୋନସ ଫାଇଲ ଗୁଣଧର୍ମ ନାହିଁ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "ସ୍ୱୟଂ-ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "ଠିକଣା `%s' ପାଇଁ ଅଜଣା କିମ୍ବା ଅସମର୍ଥିତ ପରିବହନ `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ଫାଇଲ '%s' କୁ ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "ନୋନସ ଫାଇଲ '%s' ରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "ନୋନସ ଫାଇଲ '%s' ରୁ ପଢିବାରେ ତ୍ରୁଟି,16 ବାଇଟ ଆଶାକରାଯାଇଥାଏ, %d ପାଇଅଛି" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ନୋନସ ଫାଇଲ '%s' ର ବିଷୟବସ୍ତୁକୁ ଧାରାରେ ଲେଖିବାରେ ତ୍ରୁଟି:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "ପ୍ରଦତ୍ତ ଠିକଣାଟି ଖାଲି ଅଛି" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "uid ସେଟ କରିବା ସମୟରେ ଏକ ସନ୍ଦେଶକୁ ଉତ୍ପନ୍ନ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "ତନ୍ତ୍ର-id ବିନା କୌଣସି ସନ୍ଦେଶକୁ ଉତ୍ପନ୍ନ କରି ପାରିବେ ନାହିଁ:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "ନିର୍ଦ୍ଦେଶ '%s' କୁ ଉତ୍ପନ୍ନ କରିବାରେ ତ୍ରୁଟି:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(ଏହି ୱିଣ୍ଡୋକୁ ବନ୍ଦ କରିବା ପାଇଁ କୌଣସି ଅକ୍ଷରକୁ ଲେଖନ୍ତୁ)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "ଅଧିବେଶନ dbus ଚାଲୁନାହିଁ, ଏବଂ ସ୍ୱୟଂ ପ୍ରାରମ୍ଭ ବିଫଳ ହୋଇଛି" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"ଅଧିବେଶନ ବସ ଠିକଣାକୁ ନିର୍ଦ୍ଧାରଣ କରିପାରିବେ ନାହିଁ (ଏହି OS ପାଇଁ ନିୟୋଜିତ ହୋଇନାହିଁ)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE ପରିବେଶ ପ୍ରାଚଳରୁ ବସ ଠିକଣାକୁ ନିର୍ଦ୍ଧାରଣ କରିପାରିବେ ନାହିଁ" +"- ଅଜଣା ମୂଲ୍ୟ `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"ବସ ଠିକଣା ନିର୍ଦ୍ଧାରଣ କରିପାରିବେ ନାହିଁ କାରଣ DBUS_STARTER_BUS_TYPE ପରିବେଶ ପ୍ରାଚଳ " +"ସେଟ ହୋଇନାହିଁ" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "ଅଜଣା ବସ ପ୍ରକାର %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ବିଷୟବସ୍ତୁ ଅଭାବ ଏକ ଧାଡ଼ି ପଢ଼ିବାକୁ ଚେଷ୍ଟା କରୁଅଛି" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"ଅପ୍ରତ୍ୟାଶିତ ବିଷୟବସ୍ତୁର ଅଭାବ (ସୁରକ୍ଷିତ ଭାବରେ) ଏକ ଧାଡ଼ିକୁ ପଢ଼ିବାକୁ ଚେଷ୍ଟାକରୁଅଛି" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "ବହିଷ୍କୃତ ସମସ୍ତ ଉପଲବ୍ଧ ବୈଧିକରଣ କୌଶଳ (ପ୍ରୟାସ: %s) (ଉପଲବ୍ଧ: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer ମାଧ୍ଯମରେ ବାତିଲ ହୋଇଛି" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "`%s' ଡିରେକ୍ଟୋରି ପାଇଁ ସୂଚନା ପାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"ଡିରେକ୍ଟୋରୀ `%s' ଉପରେ ଅନୁମତିଗୁଡ଼ିକ ତ୍ରୁଟିଯୁକ୍ତ ହୋଇଛି। ଆଶାକରାଯାଇଥିବା ଧାରା 0700, " +"ମିଳିଛି 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "ଡିରେକ୍ଟୋରି `%s' କୁ ନିର୍ମାଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ପଢ଼ିବା ପାଇଁ କିରିଙ୍ଗ `%s' କୁ ଖୋଲିବାରେ ତ୍ରୁଟି: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "କିରିଙ୍ଗ ର %d ଧାଡ଼ି `%s' ଠାରେ ବିଷୟବସ୍ତୁ `%s' ସହିତ ତ୍ରୁଟିଯୁକ୍ତ ଅଟେ" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"କିରିଙ୍ଗର ଧାଡ଼ି %d ର ପ୍ରଥମ ଟକେନ `%s' ରେ ବିଷୟବସ୍ତୁ `%s' ସହିତ ତ୍ରୁଟିଯୁକ୍ତ ହୋଇଛି" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"କିରିଙ୍ଗର ଧାଡ଼ି %d ର ଦ୍ୱିତୀୟ ଟକେନ `%s' ରେ ବିଷୟବସ୍ତୁ `%s' ସହିତ ତ୍ରୁଟିଯୁକ୍ତ ହୋଇଛି" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "id %d ସହିତ `%s' ରେ ଥିବା କିରିଙ୍ଗରେ କୁକି ମିଳିଲା ନାହିଁ" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ଷ୍ଟେଲ ଲକ ଫାଇଲ '%s' କୁ ଅପସାରଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "ଲକ ଫାଇଲ `%s' ନିର୍ମାଣ କରିବାେର ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "ଲକ ଫାଇଲ (ଅସଂଯୁକ୍ତ) `%s' କୁ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ଲକ ଫାଇଲ `%s' କୁ ଅସଂଯୁକ୍ତ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ଲେଖିବା ପାଇଁ କିରିଙ୍ଗ `%s' କୁ ଖୋଲିବାରେ ତ୍ରୁଟି:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(ଅତିରିକ୍ତ ଭାବରେ, `%s' ପାଇଁ ମଧ୍ଯ ତାଲାକୁ ଖୋଲିବାରେ ବିଫଳ: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "ସଂଯୋଗ ବନ୍ଦ ହୋଇଯାଇଛି" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "ସମୟ ସୀମା ପହଞ୍ଚିଯାଇଛି" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"କ୍ଲାଏଣ୍ଟ ପାଖ ସଂଯୋଗକୁ ସ୍ଥାପନ କରିବା ସମୟରେ ଅସମର୍ଥିତ ସୂଚକଗୁଡ଼ିକର ସମ୍ମୁଖିନ ହୋଇଛି" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"ପଥ %s ରେ ବସ୍ତୁ ଉପରେ ଏପରି କୋଣସି ଅନ୍ତରାପୃଷ୍ଠ `org.freedesktop.DBus.Properties' " +"ନାହିଁ" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"ଗୁଣଧର୍ମ `%s' ସେଟ କରିବାରେ ତ୍ରୁଟି: ଆଶାକରାଯାଇଥିବା ପ୍ରକାର `%s' କିନ୍ତୁ `%s' ପାଇଛି" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' ପରି କୌଣସି ଗୁଣଧର୍ମ ନାହିଁ" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' ବିଶେଷତାଗୁଡିକ ପଢ଼ିବା ଯୋଗ୍ୟ ନୁହିଁ" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' ବିଶେଷତାଗୁଡିକ ଲେଖିବା ଯୋଗ୍ୟ ନୁହିଁ" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' ପରି କୌଣସି ଅନ୍ତରାପୃଷ୍ଠ ନାହିଁ" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "ଏପରି କୌଣସି ଅନ୍ତରାପୃଷ୍ଠ ନାହିଁ" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "%s ପଥରେ ବସ୍ତୁ ଉପରେ `%s' ପରି କୌଣସି ଅନ୍ତରାପୃଷ୍ଠ ନାହିଁ" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "`%s' ପରି କୌଣସି ପଦ୍ଧତି ନାହିଁ" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "ସନ୍ଦେଶ ପ୍ରକାର, `%s', ଆଶା କରାଯାଇଥିବା ପ୍ରକାର `%s' ସହିତ ମିଶୁ ନାହିଁ" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "ଅନ୍ତରାପୃଷ୍ଠ %s ପାଇଁ %s ରେ ଗୋଟିଏ ବସ୍ତୁକୁ ପୂର୍ବରୁ ପଠାଯାଇଛି" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "ପଦ୍ଧତି `%s' ପ୍ରକାର `%s' ଫେରାଇଥାଏ, କିନ୍ତୁ `%s' କୁ ଆଶାକରିଥାଏ" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "ଅନ୍ତରାପୃଷ୍ଠ `%s' ଉପରେ ହସ୍ତାକ୍ଷର `%s' ସହିତ `%s' ପଦ୍ଧତି ଅବସ୍ଥିତ ନାହିଁ" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s ପାଇଁ ପୂର୍ବରୁ ଏକ ସବଟ୍ରୀ ପଠାଯାଇଛି" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "ପ୍ରକାରଟି ଅବୈଧ ଅଟେ" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL ସନ୍ଦେଶ: PATH କିମ୍ବା MEMBER ଶୀର୍ଷକ ସ୍ଥାନ ଅନୁପସ୍ଥିତ ଅଛି" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN ସନ୍ଦେଶ: REPLY_SERIAL ଶୀର୍ଷକ ସ୍ଥାନ ଅନୁପସ୍ଥିତ ଅଛି" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"ତ୍ରୁଟି ସନ୍ଦେଶ: REPLY_SERIAL କିମ୍ବା ERROR_NAME ଶୀର୍ଷକ ସ୍ଥାନ ଅନୁପସ୍ଥିତ ଅଛି" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "ସଂକେତ ସନ୍ଦେଶ: ପଥ, ଅନ୍ତରାପୃଷ୍ଠ କିମ୍ବା ସଦସ୍ୟ ଶୀର୍ଷକ ସ୍ଥାନ ଅନୁପସ୍ଥିତ ଅଛି" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"ସଂକେତ ସନ୍ଦେଶ: ପଥ ଶୀର୍ଷକ ସ୍ଥାନଟି ସଂରକ୍ଷିତ ମୂଲ୍ୟ /org/" +"freedesktop/DBus/Local ବ୍ୟବହାର କରିଥାଏ" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"ସଂକେତ ସନ୍ଦେଶ: ଅନ୍ତରାପୃଷ୍ଠ ଶୀର୍ଷକ ସ୍ଥାନ ସଂରକ୍ଷିତ ମୂଲ୍ୟ org." +"freedesktop.DBus.Local କୁ ବ୍ୟବହାର କରିଥାଏ" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu ବାଇଟ ପଢ଼ିବା ପାଇଁ ଚାହୁଁଛି କିନ୍ତୁ EOF ମିଲିଲା" +msgstr[1] "%lu ବାଇଟ ପଢ଼ିବା ପାଇଁ ଚାହୁଁଛି କିନ୍ତୁ EOF ମିଲିଲା" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"ବୈଧ UTF-8 ବାକ୍ୟଖଣ୍ଡ ଆଶାକରାଯାଇଥିଲା କିନ୍ତୁ ବାଇଟ ଅଫସେଟ %d ରେ ଅବୈଧ ବାଇଟ ମିଳିଲା" +"(ବାକ୍ୟଖଣ୍ଡର ଲମ୍ବ ହେଉଛି %d)। ସେହି ବିନ୍ଦୁ ପର୍ଯ୍ୟନ୍ତ ଉଠିଥିବା ବାକ୍ୟଖଣ୍ଡଟି ହେଉଛି " +"ବୈଧ UTF-8 ବାକ୍ୟଖଣ୍ଡ `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "ବାକ୍ୟଖଣ୍ଡ `%s' ପରେ ଶୂନ୍ୟ ବାଇଟ ଆଶାକରାଯାଇଥିଲା କିନ୍ତୁ ବାଇଟ %d ମିଳିଲା" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "ବିଶ୍ଳେଷିତ ମୂଲ୍ୟ `%s' ଟି ଏକ ବୈଧ D-Bus ବସ୍ତୁ ପଥ ନୁହଁ" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "ବିଶ୍ଳେଷିତ ମୂଲ୍ୟ `%s' ଟି ଏକ ବୈଧ D-Bus ହସ୍ତାକ୍ଷର ନୁହଁ" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"%u ବାଇଟ ଲମ୍ବ ବିଶିଷ୍ଟ ଆରେର ସମ୍ମୁଖିନ ହୋଇଛି। ସର୍ବାଧିକ ଲମ୍ବ ହେଉଛି 2<<26 ବାଇଟ (64 " +"MiB)." +msgstr[1] "" +"%u ବାଇଟ ଲମ୍ବ ବିଶିଷ୍ଟ ଆରେର ସମ୍ମୁଖିନ ହୋଇଛି। ସର୍ବାଧିକ ଲମ୍ବ ହେଉଛି 2<<26 ବାଇଟ (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "ପ୍ରାଚଳ ପାଇଁ ବିଶ୍ଳଷିତ ମୂଲ୍ୟ `%s' ଟି ଏକ ବୈଧ D-ବସ ହସ୍ତାକ୍ଷର ନୁହଁ" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "D-Bus ତାରମୟ ଶୈଳୀରୁ`%s' ପ୍ରକାରର ବାକ୍ୟଖଣ୍ଡ ସହିତ ତ୍ରୁଟି କ୍ରମଭଙ୍ଗ GVariant" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"ଅବୈଧ endianness ମୂଲ୍ୟ। 0x6c ('l') କିମ୍ବା 0x42 ('B') ଆଶାକରିଥିଲା କିନ୍ତୁ" +"0x%02x ମୂଲ୍ୟମିଳିଲା" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "ଅବୈଧ ମୂଖ୍ୟ ପ୍ରଟୋକଲ ସଂସ୍କରଣ। 1 ଆଶାକରାଯାଇଥିଲା କିନ୍ତୁ %d ମିଳିଲା" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "ହସ୍ତାକ୍ଷର `%s' ସହିତ ହସ୍ତାକ୍ଷର ଶୀର୍ଷକ ମିଳିଛି କିନ୍ତୁ ସନ୍ଦେଶ ଖାଲିଅଛି" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "ବିଶ୍ଳେଷିତ ମୂଲ୍ୟ `%s' ଟି ଏକ ବୈଧ D-Bus ହସ୍ତାକ୍ଷର ନୁହଁ (ସନ୍ଦେଶ ପାଇଁ)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "ସନ୍ଦେଶରେ କୌଣସି ହସ୍ତାକ୍ଷର ଶୀର୍ଷକ ନାହିଁ କିନ୍ତୁ ସନ୍ଦେଶଟି %u ବାଇଟର" +msgstr[1] "ସନ୍ଦେଶରେ କୌଣସି ହସ୍ତାକ୍ଷର ଶୀର୍ଷକ ନାହିଁ କିନ୍ତୁ ସନ୍ଦେଶଟି %u ବାଇଟର" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "ସନ୍ଦେଶକୁ କ୍ରମହୀନ କରିପାରିବେ ନାହିଁ: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"D-Bus ତାରମୟ ଶୈଳୀରୁ`%s' ପ୍ରକାରର ବାକ୍ୟଖଣ୍ଡ ସହିତ GVariant କୁ କ୍ରମରେ ରଖିବାରେ " +"ତ୍ରୁଟି" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"ସନ୍ଦେଶରେ %d ଫାଇଲ ବର୍ଣ୍ଣନାକାରୀମାନେ ଅଛନ୍ତି କିନ୍ତୁ ଶୀର୍ଷକ ସ୍ଥାନ %d ଫାଇଲ " +"ବର୍ଣ୍ଣନାକାରୀମାନଙ୍କୁ ସୂଚାଇଥାଏ" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "ସନ୍ଦେଶକୁ କ୍ରମରେ ସଜାଇପାରିବେ ନାହିଁ: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "ସନ୍ଦେଶରେ ହସ୍ତାକ୍ଷର `%s' ଅଛି କିନ୍ତୁ ସେଠାରେ କୌଣସି ହସ୍ତାକ୍ଷର ଶୀର୍ଷକ ନାହିଁ" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"ସନ୍ଦେଶରେ ହସ୍ତାକ୍ଷର ପ୍ରକାର `%s' ଅଛି କିନ୍ତୁ ଶୀର୍ଷକରେ ଥିବା ହସ୍ତାକ୍ଷରଟି ହେଉଛି `" +"%s'" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "ସନ୍ଦେଶଟି ଖାଲି ଅଛି କିନ୍ତୁ ଶୀର୍ଷକରେ ଥିବା ହସ୍ତାକ୍ଷରଟି ହେଉଛି `(%s)'" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "`%s' ପ୍ରକାରର ସନ୍ଦେଶରେ ତ୍ରୁଟି ଦେଖାଦେଇଛି" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "ଖାଲି ସ୍ଥାନ ସହିତ ତ୍ରୁଟି ଫେରାଇଥାଏ" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +#| msgid "Unable to trash file: %s" +msgid "Unable to get Hardware profile: %s" +msgstr "ହାର୍ଡୱେର ରୂପରେଖା ପାଇବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"/var/lib/dbus/machine-id କିମ୍ବା /etc/machine-id କୁ ଧାରଣ କରିବାରେ ଅସମର୍ଥ: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s ପାଇଁ ନାମ ଅନୁଯାୟୀ ସର୍ଭିସ ଆରମ୍ଭ କରନ୍ତୁକୁ ଡ଼ାକିବାରେ ତ୍ରୁଟି: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ଉତ୍ତର %d StartServiceByName(\"%s\") ପଦ୍ଧତିରୁ ମିଳିଛି " + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"ପଦ୍ଧତିକୁ କାଢ଼ିପାରିବେ ନାହିଁ; ପ୍ରକ୍ସିଟି ହେଉଛି ମାଲିକ ନଥିବା ଏକ ସୁପରିଚିତ ନାମ ଏବଂ " +"ପ୍ରକ୍ସିଟି " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ସୂଚକ ଦ୍ୱାରା ନିର୍ମିତ" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "ବାହାର କରାଯାଇଥିବା ନାମ ସ୍ଥାନଟି ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "ଏକ ସର୍ଭର ନିର୍ମାଣ କରିବା ସମୟରେ ନୋନସ ଫାଇଲକୁ ଉଲ୍ଲେଖ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "ନୋନସ ଫାଇଲକୁ `%s' ରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' ବାକ୍ୟଖଣ୍ଡଟି ଗୋଟିଏ ବୈଧ D-Bus GUID ନୁହଁ" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "ଅସମର୍ଥିତ ପରିବହନ `%s' ଉପରେ ଶୁଣିପାରିବେ ନାହିଁ" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"ନିର୍ଦ୍ଦେଶଗୁଡ଼ିକ:\n" +" help ଏହି ସୂଚନାକୁ ଦର୍ଶାଇଥାଏ\n" +" introspect ଏକ ସୁଦୂର ବସ୍ତୁକୁ ଆତ୍ମନିରୀକ୍ଷଣ କରିଥାଏ\n" +" monitor ଏକ ସୁଦୂର ବସ୍ତୁକୁ ନିରୀକ୍ଷଣ କରିଥାଏ\n" +" call ଏକ ସୁଦୂର ବସ୍ତୁ ଉପରେ ପଦ୍ଧତିକୁ ବାହାର କରିଥାଏ\n" +" emit ଏକ ସଂକେତକୁ ଲୁଚାଇଥାଏ\n" +"\n" +"ପ୍ରତ୍ୟେକ ନିର୍ଦ୍ଦେଶ ବିଷୟରେ ସହାୟତା ପାଇବା ପାଇଁ \"%s COMMAND --help\" କୁ ବ୍ୟବହାର " +"କରନ୍ତୁ।\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "ଆତ୍ମନିରୀକ୍ଷଣ XML କୁ ବିଶ୍ଳେଷଣ କରିବାରେ ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "ତନ୍ତ୍ର ବସ ସହିତ ସଂଯୋଗ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "ଅଧିବେଶନ ବସ ସହିତ ସଂଯୋଗ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "ପ୍ରଦତ୍ତ D-ବସ ଠିକଣା ସହିତ ସଂଯୋଗ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "ସଂଯୋଗ ଶେଷବିନ୍ଦୁ ବିକଳ୍ପଗୁଡ଼ିକ:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "ସଂଯୋଗ ଶେଷବିନ୍ଦୁକୁ ଉଲ୍ଲେଖ କରିବା ବିକଳ୍ପଗୁଡ଼ିକ" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "କୌଣସି ସଂଯୋଗ ଶେଷବିନ୍ଦୁ ଉଲ୍ଲେଖ ହୋଇନାହିଁ" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "ଏକାଧିକ ସଂଯୋଗ ଶେଷବିନ୍ଦୁଗୁଡ଼ିକୁ ଉଲ୍ଲେଖ ହୋଇଛି" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "ଚେତାବନୀ: ଆତ୍ମନିରୀକ୍ଷଣ ତଥ୍ୟ ଅନୁସାରେ, ଅନ୍ତରାପୃଷ୍ଠ `%s' ଅବସ୍ଥିତ ନାହିଁ\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"ଚେତାବନୀ: ଆତ୍ମନିରୀକ୍ଷଣ ତଥ୍ୟ ଅନୁସାରେ, ପଦ୍ଧତି `%s' ଅନ୍ତରାପୃଷ୍ଠ `%s' ଉପରେ " +"ଅବସ୍ଥିତ ନାହିଁ\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "ସଂକେତ ପାଇଁ ବୈକଳ୍ପିକ ଲକ୍ଷ୍ଯସ୍ଥଳ (ଅନନ୍ୟ ନାମ)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "ସଂକେତ ବନ୍ଦ କରିବା ପାଇଁ ବସ୍ତୁ ପଥ" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "ସଂକେତ ଏବଂ ଅନ୍ତରାପୃଷ୍ଠ ନାମ" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "ଏକ ସଂକେତକୁ ବନ୍ଦ କରନ୍ତୁ।" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "ସଂଯୋଗ କରିବାରେ ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "ତ୍ରୁଟି: ବସ୍ତୁ ପ୍ରକାର ଉଲ୍ଲେଖ ହୋଇନାହିଁ।\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "ତ୍ରୁଟି: '%s' ଟି ଗୋଟିଏ ବୈଧ ବସ୍ତୁ ପଥ ନୁହଁ\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "ତ୍ରୁଟି: ସଂକେତ ନିର୍ଦ୍ଦିଷ୍ଟ ହୋଇ ନାହିଁ।\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "ତ୍ରୁଟି: ସଂକେତଟି ଏକ ସମ୍ପୂର୍ଣ୍ଣ ନାମ ହୋଇଥିବା ଉଚିତ।\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ତ୍ରୁଟି: %s ଟି ଗୋଟିଏ ବୈଧ ଅନ୍ତରାପୃଷ୍ଠ ନାମ ନୁହଁ\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ତ୍ରୁଟି:%s ଟି ଗୋଟିଏ ବୈଧ ସଦସ୍ଯ ନାମ ନୁହଁ\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ତ୍ରୁଟି:%s ଟି ଗୋଟିଏ ବୈଧ ଅନନ୍ୟ ବସ ନାମ ନୁହଁ।\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "ପ୍ରାଚଳ %d କୁ ବିଶ୍ଳେଷଣ କରିବାରେ ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "ସଂଯୋଗ ଦେଖାଇବାରେ ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "ପଦ୍ଧତି ବାହାର ଜାଣିବା ପାଇଁ ଲକ୍ଷ୍ଯସ୍ଥଳ ନାମ" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "ପଦ୍ଧତିକୁ ଜାଣିବା ପାଇଁ ବସ୍ତୁ ପଥ" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "ପଦ୍ଧତି ଏବଂ ଅନ୍ତରାପୃଷ୍ଠ ନାମ" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "ସମୟ ସମାପ୍ତି ସେକଣ୍ଡରେ" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "ସୁଦୂର ବସ୍ତୁ ଉପରେ ଏକ ପଦ୍ଧତିକୁ ପ୍ରୟୋଗ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "ତ୍ରୁଟି: ଲକ୍ଷ୍ଯସ୍ଥଳ ଉଲ୍ଲେଖ ହୋଇନାହିଁ\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "ତ୍ରୁଟି: ବସ୍ତୁ ପଥ ଉଲ୍ଲେଖ ହୋଇନାହିଁ\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "ତ୍ରୁଟି: ପଦ୍ଧତି ନାମ ଉଲ୍ଲେଖ ହୋଇନାହିଁ\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "ତ୍ରୁଟି: ପଦ୍ଧତି ନାମ `%s' ଟି ଅବୈଧ ଅଟେ\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "ପ୍ରାଚଳ %d କୁ `%s' ପ୍ରକାରରେ ବିଶ୍ଳେଷଣ କରିବାରେ ତ୍ରୁଟି: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "ଆତ୍ମନୀରିକ୍ଷଣ କରିବାକୁ ଲକ୍ଷ୍ଯସ୍ଥଳ ନାମ" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "ଆତ୍ମନୀରିକ୍ଷଣ କରିବାକୁ ବସ୍ତୁ ପଥ" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML ମୁଦ୍ରଣ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "ନିର୍ଭରକକୁ ଆତ୍ମନୀରିକ୍ଷଣ କରନ୍ତୁ" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "କେବଳ ମୁଦ୍ରଣ ଗୁଣଧର୍ମଗୁଡ଼ିକ" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "ସୁଦୂର ବସ୍ତୁର ଆତ୍ମନିରୀକ୍ଷଣ କରନ୍ତୁ।" + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "ନିରୀକ୍ଷଣ କରିବା ପାଇଁ ଲକ୍ଷ୍ଯସ୍ଥଳ ନାମ" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "ନିରୀକ୍ଷଣ କରିବା ପାଇଁ ବସ୍ତୁ ପଥ" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "ଏକ ସୁଦୂର ବସ୍ତୁକୁ ନିରୀକ୍ଷଣ କରନ୍ତୁ" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "ବେନାମୀ" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "ଡେସ୍କଟପ ଫାଇଲ Exec କ୍ଷେତ୍ର ଉଲ୍ଲେଖ କରିନଥିଲା" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "ପ୍ରୟୋଗ ପାଇଁ ଆବଶ୍ୟକ ଟର୍ମିନାଲ ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ଚାଳକ ପ୍ରୟୋଗ ବିନ୍ୟାସ ଫୋଲଡର %s କୁ ନିର୍ମାଣ କରିପାରିବେ ନାହିଁ: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ଚାଳକ MIME ବିନ୍ୟାସିତ ଫୋଲଡର %s ନିର୍ମାଣ କରିପାରିବ ନାହିଁ: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "ପ୍ରୟୋଗ ସୂଚନାରେ ଏକ ପରିଚାୟକର ଅଭାବ" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ଚାଳକ ଡେସ୍କଟପ ଫାଇଲ %s ନିର୍ମାଣ କରିପାରିବ ନାହିଁ" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ପାଇଁ ଇଚ୍ଛାରୂପୀ ପରିଭାଷା" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ଡ୍ରାଇଭ ବାହାର କରିବା କିମ୍ବା eject_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ଡ୍ରାଇଭ ସଞ୍ଚାର ମାଧ୍ଯମ ପାଇଁ ଚୟନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ଡ୍ରାଇଭ ଆରମ୍ଭ କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ଡ୍ରାଇଭ ବନ୍ଦ କରିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS ସହାୟତା ଉପଲବ୍ଧ ନାହିଁ" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରୁଅଛି" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ସାଙ୍କେତିକରଣରେ ତ୍ରୁଟିଯୁକ୍ତ ଟକେନ ସଂଖ୍ୟା (%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରିପାରୁ ନାହିଁ" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ସାଙ୍କେତିକରଣରେ ତ୍ରୁଟିଯୁକ୍ତ ଟକେନ ସଂଖ୍ୟା (%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ପାଇଁ ଗୋଟିଏ GEmblem ଆଶାକରାଯାଉଅଛି" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "ଧାରଣ କରିଥିବା ସ୍ଥାପନ ଅବସ୍ଥିତ ନାହିଁ" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2281 +msgid "Can't copy over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ଡିରେକ୍ଟୋରୀ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2290 +msgid "Target file exists" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲ ଅବସ୍ଥିତ" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "ପୁନରାବର୍ତ୍ତୀ ଭାବରେ ଡିରେକ୍ଟୋରୀ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "ବନ୍ଧନ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "ଫାଇଲକୁ ଗୁନ୍ଥିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "ବିଶେଷ ଫାଇଲକୁ ନକଲ କରିପାରିବେ ନାହିଁ" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "ଅବୈଧ symlink ମୂଲ୍ୟ ପ୍ରଦାନ କରାଯାଇଛି" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "ଆବର୍ଜନା ପାତ୍ର ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ଫାଇଲ ନାମଗୁଡ଼ିକ '%c' ଧାରଣ କରିପାରେ ନାହିଁ" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "ଆକାର ସ୍ଥାପନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "ଏହି ଫାଇଲକୁ ନିୟନ୍ତ୍ରମ କରିବା ଫଳରେ କୌଣସି ପ୍ରୟୋଗ ପଞ୍ଜିକୃତ ହୋଇନାହିଁ" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ଗଣନାକାର ବନ୍ଦ ହୋଇଯାଇଛି" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "ଫାଇଲ ଗଣନାକାର ପାଖରେ ଉତ୍କୃଷ୍ଟ ପ୍ରୟୋଗ ଅଛି" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "ଧାରା query_info କୁ ସମର୍ଥନ କରେନାହିଁ" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "ଧାରାରେ Seek ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "ନିବେଶ ଧାରାରେ କାଟିବା ଅନୁମୋଦିତ ନୁହଁ" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "ଧାରାରେ କାଟିବା ଅନୁମୋଦିତ ନୁହଁ" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ଭୁଲ ସଂଖ୍ୟକ ଟକେନ (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "ଶ୍ରେଣୀ ନାମ %s ପାଇଁ କୌଣସି ପ୍ରକାର ନାହିଁ" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ପ୍ରକାର %s GIcon ଅନ୍ତରାପୃଷ୍ଠକୁ କାର୍ଯ୍ୟକାରି କରେନାହିଁ" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "ପ୍ରକାର %s ଶ୍ରେଣୀଭୁକ୍ତ ନୁହଁ" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "ତ୍ରୁଟିଯୁକ୍ତ ସଂସ୍କରଣ ସଂଖ୍ୟା: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ପ୍ରକାର %s GIcon ଅନ୍ତରାପୃଷ୍ଠରେ ଟକେନ()ରୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gicon.c:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "ଚିତ୍ରସଂକେତ ସାଙ୍କେତିକରଣର ପ୍ରଦତ୍ତ ସଂସ୍କରଣକୁ ନିୟନ୍ତ୍ରଣ କରାଯାଇପାରିବ ନାହିଁ" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "କୌଣସି ଠିକଣା ଉଲ୍ଲେଖ କରାଯାଇ ନାହିଁ" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "ଲମ୍ବ %u ଟି ଠିକଣା ପାଇଁ ଅତ୍ଯଧିକ ବଡ଼" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "ଉପସର୍ଗ ଲମ୍ବଠାରୁ ଠିକଣାରେ ବିଟଗୁଡ଼ିକୁ ସେଟ କରାଯାଇଥାଏ" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +#| msgid "could not get local address: %s" +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' କୁ IP ଠିକଣା ମାସ୍କ ଭାବରେ ବିଶ୍ଳେଷଣ କରିପାରିଲା ନାହିଁ" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "ସକେଟ ଠିକଣା ପାଇଁ ଯଥେଷ୍ଟ ସ୍ଥାନ ନାହିଁ" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "ଅସମର୍ଥିତ ସକେଟ ଠିକଣା" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "ଧାରା ପାଖରେ ଉତ୍କୃଷ୍ଟ ପ୍ରୟୋଗ ଅଛି" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "ଉପାଦାନ <%s> କୁ <%s> ଭିତରେ ଅନୁମୋଦିତ ନୁହଁ" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "ଉପାଦାନ <%s> ଉପର ସ୍ତରରେ ଅନୁମୋଦିତ ନୁହଁ" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "ଫାଇଲ %s ଟି ଉତ୍ସରେ ଏକାଧିକ ଥର ଦୃଶ୍ୟମାନ ହୋଇଥାଏ" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "'%s' କୁ କୌଣସି ଉତ୍ସ ଡିରେକ୍ଟୋରୀରେ ଦେଖିବାରେ ବିଫଳ" + +# Gora: "change to directory" means "go to directory" here +#: ../gio/glib-compile-resources.c:259 +#, c-format +#| msgid "Failed to change to directory '%s' (%s)" +msgid "Failed to locate '%s' in current directory" +msgstr "ପ୍ରଚଳିତ ଡିରେକ୍ଟୋରିରେ '%s' କୁ ପାଇବାରେ ଅସଫଳ" + +#: ../gio/glib-compile-resources.c:287 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "ଅଜଣା କାର୍ଯ୍ୟକାରୀ ବିକଳ୍ପ \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:366 +#, c-format +#| msgid "Failed to create file '%s': %s" +msgid "Failed to create temp file: %s" +msgstr "ଅସ୍ଥାୟୀ ଫାଇଲ ସ୍ରୁଷ୍ଟି କରିବାରେ ବିଫଳ: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +#| msgid "Error setting symlink: file is not a symlink" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"ନିବେଶ ଫାଇଲକୁ xmllint ସହିତ କାର୍ଯ୍ୟକାରୀ କରିବାରେ ତ୍ରୁଟି:\n" +"%s" + +#: ../gio/glib-compile-resources.c:392 +#, c-format +#| msgid "Error setting symlink: file is not a symlink" +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"ନିବେଶ ଫାଇଲକୁ ପିକ୍ସ ତଥ୍ୟ ସହିତ କାର୍ଯ୍ୟକାରୀ କରିବାରେ ତ୍ରୁଟି:\n" +"%s" + +#: ../gio/glib-compile-resources.c:406 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s ଫାଇଲ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glib-compile-resources.c:426 +#, c-format +msgid "Error compressing file %s" +msgstr "%s ଫାଇଲକୁ ସଙ୍କୋଚନ କରିବାରେ ତ୍ରୁଟି" + +#: ../gio/glib-compile-resources.c:490 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> ଭିତରେ ପାଠ୍ୟ ଦେଖାଯାଇ ନପାରେ" + +#: ../gio/glib-compile-resources.c:613 +msgid "name of the output file" +msgstr "ଫଳାଫଳ ଫାଇଲର ନାମ" + +#: ../gio/glib-compile-resources.c:613 ../gio/glib-compile-resources.c:646 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:614 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ିବାକୁ ଥିବା ଡିରେକ୍ଟୋରୀ (ପ୍ରଚଳିତ ଡିରେକ୍ଟୋରୀ ପାଇଁ " +"ପୂର୍ବନିର୍ଦ୍ଧାରିତ)" + +#: ../gio/glib-compile-resources.c:614 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:615 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "ବଚ୍ଛିତ ଶୈଳୀରେ ଲକ୍ଷ୍ଯସ୍ଥଳ ଫାଇଲ ନାମ ଅନୁଲଗ୍ନ ଦ୍ୱାରା ଫଳାଫଳ କାଢନ୍ତୁ" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate source header" +msgstr "ଉତ୍ସ ଶୀର୍ଷକ ସୃଷ୍ଟି କରନ୍ତୁ" + +#: ../gio/glib-compile-resources.c:617 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "ଉତ୍ସ ଫାଇଲରେ ଆପଣଙ୍କ ସଂକେତରେ ଉତ୍ସ ସଂକେତ ସୃଷ୍ଟି କରନ୍ତୁ" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate dependency list" +msgstr "ନିର୍ଭୋରକ ତାଲିକା ସୃଷ୍ଟି କରନ୍ତୁ" + +#: ../gio/glib-compile-resources.c:619 +msgid "Don't automatically create and register resource" +msgstr "ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଉତ୍ସକୁ ନିର୍ମାଣ କରି ପଞ୍ଜିକୃତ କରନ୍ତୁ ନାହିଁ" + +#: ../gio/glib-compile-resources.c:620 +msgid "C identifier name used for the generated source code" +msgstr "ନିର୍ମିତ ଉତ୍ସ ସଂକେତ ପାଇଁ ବ୍ୟବହୃତ C ପରିଚାୟକ ନାମ" + +#: ../gio/glib-compile-resources.c:649 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"ଏକ ଉତ୍ସ ଫାଇଲରେ ଉତ୍ସ ବିଶେଷାଙ୍କ ସଙ୍କଳନ କରନ୍ତୁ।\n" +"ଉତ୍ସ ବିଶେଷାଙ୍କ ଫାଇଲଗୁଡ଼ିକରେ extension .gresource.xml,\n" +"ଏବଂ ଉତ୍ସ ଫାଇଲ ଥାଏ ଯାହାକୁ .gresource କୁହାଯାଏ।" + +#: ../gio/glib-compile-resources.c:665 +#, c-format +#| msgid "You should give exactly one directory name\n" +msgid "You should give exactly one file name\n" +msgstr "ଆପଣଙ୍କୁ କେବଳ ଗୋଟିଏ ଫାଇଲ ନାମ ଦେବା ଉଚିତ\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "ଖାଲି ନାମଗୁଡ଼ିକ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ଅବୈଧ ନାମ '%s': ନାମଗୁଡ଼ିକ ନିଶ୍ଚିତ ଭାବରେ ଛୋଟ ଅକ୍ଷରରେ ଆରମ୍ଭ ହୋଇଥିବା ଉଚିତ" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"ଅବୈଧ ନାମ '%s': ଅବୈଧ ଅକ୍ଷର '%c'; କେବଳ ଛୋଟ ଅକ୍ଷର, ଗଣନ ସଂଖ୍ୟା " +"ଏବଂ ହାଇଫେନ ('-') ଗୁଡ଼ିକ ଅନୁମତି ପ୍ରାପ୍ତ।" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "ଅବୈଧ ନାମ '%s': ଦୁଇଟି କ୍ରମାନୟ ହାଇଫେନଗୁଡ଼ିକ ('--') ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ।" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "ଅବୈଧ ନାମ '%s': ଶେଷ ଅକ୍ଷର ହୁଏତଃ ହାଇଫେନ ('-') ହୋଇନପାରେ।" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ଅବୈଧ ନାମ '%s': ସର୍ବାଧିକ ଲମ୍ବ ହେଉଛି 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " ପୂର୍ବରୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ଯୋଜନା 'ତାଲିକାରେ' କି ଗୁଡ଼ିକୁ ଯୋଗ କରିପାରିବେ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " ପୂର୍ବରୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" ଶାୟା ରେ; ମୂଲ୍ୟ ପରିବର୍ତ୍ତନ " +"ପାଇଁ " +"କୁ ବ୍ୟବହାର କରନ୍ତୁ" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"କେବଳ ଗୋଟିଏ 'ପ୍ରକାର', 'enum' କିମ୍ବା 'flags' ନିଶ୍ଚିତ ଭାବରେ ପାଇଁ ଉଲ୍ଲେଖ " +"ହେବା ଉଚିତ" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> କୁ ଏପର୍ଯ୍ୟନ୍ତ ବ୍ୟାଖ୍ୟା କରାଯାଇ ନାହିଁ।" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ଅବୈଧ GVariant ପ୍ରକାରର ବାକ୍ୟଖଣ୍ଡ '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " ଦିଆଯାଇଛି କିନ୍ତୁ ଯୋଜନାଟି କାହାକୁ ବଢ଼ାଉନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ନବଲିଖନ କରିବା ପାଇଁ କୌଣସି ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " ପୂର୍ବରୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " ପୂର୍ବରୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr " extends not yet existing schema '%s'" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr "" +" ଟି ହେଉଛି ଏପର୍ଯ୍ୟନ୍ତ ଅନୁଲମ୍ବିତ ହୋଇନଥିବା ଯୋଜନା '%s' ର ତାଲିକା" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "କୌଣସି ଯୋଜନାକୁ ପଥ ସହିତ ତାଲିକାଭୁକ୍ତ କରିହେବ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "କୌଣସି ଯୋଜନାକୁ ପଥ ସହିତ ଅନୁଲମ୍ବିତ କରିହେବ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" ଟି ଗୋଟିଏ ତାଲିକା, କୁ ଅନୁଲମ୍ବିତ କରାଯାଉଛି " +"ଯାହାକି ଗୋଟିଏ " +"ତାଲିକା ନୁହଁ" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" କୁ ବଢ଼ାଇଥାଏ " +"କିନ୍ତୁ " +"'%s' '%s' କୁ ବଢ଼ାଇନଥାଏ" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"ଯଦି ଗୋଟିଏ ପଥ ଦିଆଯାଇଥାଏ, ତେବେ ତାହା ଗୋଟିଏ ସ୍ଲାଶ ସହିତ ଆରମ୍ଭ ଏବଂ ଶେଷ ହେବା ଉଚିତ" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ତାଲିକାର ପଥ ନିଶ୍ଚିତ ଭାବରେ ':/' ସହିତ ସମାପ୍ତ ହେବା ଉଚିତ" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ପୂର୍ବରୁ ଉଲ୍ଲେଖ ହୋଇଛି" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "ଉପାଦାନ <%s> ଉପର ସ୍ତରରେ ଅନୁମୋଦିତ ନୁହଁ" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict କୁ ଉଲ୍ଲେଖ କରାଯାଇଛି; ପ୍ରସ୍ଥାନ କରୁଅଛି।\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "ଏହି ଫାଇଲକୁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି।\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "ଏହି ଫାଇଲକୁ ଅଗ୍ରାହ୍ୟ କରୁଅଛି।\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"ଏପରି କୌଣସି କି `%s' ଯୋଜନା `%s' ରେ ଉଲ୍ଲିଖିତ ଭାବରେ ନବଲିଖନ ଫାଇଲ `%s' ରେ ଉଲ୍ଲେଖ " +"ହୋଇନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ଏହି କି ପାଇଁ ନବଲିଖନକୁ ଅଗ୍ରାହ୍ୟ କରୁଅଛି।\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ଏବଂ --strict କୁ ଉଲ୍ଲେଖ କରାଯାଇଛି; ପ୍ରସ୍ଥାନ କରୁଅଛି।\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"କି `%s' କୁ ଯୋଜନା `%s' ରେ ନବଲିଖନ ଫାଇଲ `%s' ଭାବରେ ଉଲ୍ଲେଖ ହୋଇନାହିଁ: " +"%s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "ଏହି କି ପାଇଁ ନବଲିଖନକୁ ଅଗ୍ରାହ୍ୟ କରୁଅଛି।\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"କି `%s' ପାଇଁ ଯୋଜନା `%s' ରେ ନବଲିଖନ ଫାଇଲ `%s' କୁ ପ୍ରଦତ୍ତ ସୀମା ବାହାରେ ନବଲିଖନ" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"କି `%s' ପାଇଁ ଯୋଜନା `%s' ରେ ନବଲିଖନ ଫାଇଲ `%s' କୁ ପ୍ରଦତ୍ତ ସୀମା ବାହାରେ ନବଲିଖନ " +"ତାଲିକାରେ ବୈଧ ପସନ୍ଦ ଭାବରେ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ଫାଇଲକୁ କେଉଁଠି ସଂରକ୍ଷଣ କରିବେ" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "ଯୋଜନାନରେ କୌଣସି ତ୍ରୁଟିକୁ ପରିତ୍ୟାଗ କରନ୍ତୁ" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled ଫାଇଲକୁ ଲେଖନ୍ତୁ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "କି ନାମ ପ୍ରତିବନ୍ଧକୁ ବାଧ୍ୟ କରନ୍ତୁ ନାହିଁ" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"ସମସ୍ତ GSettings ଯୋଜନା ଫାଇଲଗୁଡ଼ିକୁ ଯୋଜନା କ୍ୟାଶେ ମଧ୍ଯରେ ସଙ୍କଳନ କରନ୍ତୁ।\n" +"ଯୋଜନା ଫାଇଲଗୁଡ଼ିକରେ ଅନୁଲଗ୍ନ .gschema.xml,\n" +"ଏବଂ gschemas.compiled ନାମକ କ୍ୟାଶେ ଫାଇଲ ଥିବା ଉଚିତ।" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "ଆପଣଙ୍କୁ କେବଳ ଗୋଟିଏ ଡିରେକ୍ଟୋରୀ ନାମ ଦେବା ଉଚିତ\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "କୌଣସି ଯୋଜନା ଫାଇଲ ମିଳିଲା ନାହିଁ: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "କିଛି କରୁନାହିଁ।\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "ସ୍ଥିତବାନ ଫଳାଫଳ ଫାଇଲକୁ କଢ଼ାଯାଇଛି।\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସ୍ଥାନୀୟ ଡିରେକ୍ଟୋରୀ ମନିଟର ପ୍ରକାର ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ଅବୈଧ ଫାଇଲ ନାମ %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ଫାଇଲତନ୍ତ୍ର ସୂଚନା ପାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "ମୂଳ ଡିରେକ୍ଟୋରୀର ନାମ ବଦଳାଯାଇପାରିବ ନାହିଁ" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "ଫାଇଲର ନାମ ବଦଳାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "ଫାଇଲର ନାମ ବଦଳାଯାଇପାରିବେ ନାହିଁ, ଫାଇଲ ନାମ ପୂର୍ବରୁ ଅବସ୍ଥିତ" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2154 ../gio/glocalfile.c:2183 +#: ../gio/glocalfile.c:2343 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "ଅବୈଧ ଫାଇଲ ନାମ" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଖୋଲିପାରିବେ ନାହିଁ" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "ଫାଇଲ ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "ଫାଇଲ ଅପସାରଣରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:1833 +#, c-format +msgid "Error trashing file: %s" +msgstr "ଫାଇଲକୁ ବର୍ଜନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:1856 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ଆବର୍ଜନା ପାତ୍ର ଡିରେକ୍ଟୋରୀ %sକୁ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/glocalfile.c:1877 +msgid "Unable to find toplevel directory for trash" +msgstr "ଆବର୍ଜନା ପାତ୍ର ପାଇଁ ଉଚ୍ଚସ୍ତରୀୟ ଡିରେକ୍ଟୋରୀ ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: ../gio/glocalfile.c:1956 ../gio/glocalfile.c:1976 +msgid "Unable to find or create trash directory" +msgstr "ଆବର୍ଜନା ପାତ୍ର ଡିରେକ୍ଟୋରୀ ଖୋଜିବା ଏବଂ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ" + +#: ../gio/glocalfile.c:2010 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ବର୍ଜିତ ସୂଚନା ଫାଇଲ ନିର୍ମାଣରେ ଅସମର୍ଥ : %s" + +#: ../gio/glocalfile.c:2039 ../gio/glocalfile.c:2044 ../gio/glocalfile.c:2124 +#: ../gio/glocalfile.c:2131 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ଫାଇଲକୁ ବର୍ଜନ କରିବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/glocalfile.c:2132 ../glib/gregex.c:280 +msgid "internal error" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତୃଟି" + +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Error creating directory: %s" +msgstr "ଡିରେକ୍ଟୋରି ନିର୍ମାଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:2187 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ଫାଇଲତନ୍ତ୍ର ସାଙ୍କେତିକ ସଂଯୋଗିକିଗୁଡ଼ିକୁ ସହାୟତା କରେନାହିଁ" + +#: ../gio/glocalfile.c:2191 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ପ୍ରତୀକାତ୍ମକ ସମ୍ପର୍କ ନିର୍ମାଣରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:2253 ../gio/glocalfile.c:2347 +#, c-format +msgid "Error moving file: %s" +msgstr "ଫାଇଲ ଘୁଞ୍ଚାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:2276 +msgid "Can't move directory over directory" +msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ଡିରେକ୍ଟୋରୀକୁ ଘୁଞ୍ଚାଇପାରିବେ ନାହିଁ" + +#: ../gio/glocalfile.c:2303 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "ନକଲ ସଂରକ୍ଷଣ ଫାଇଲ ନିର୍ମାଣ ଅସଫଳ ହେଲା" + +#: ../gio/glocalfile.c:2322 +#, c-format +msgid "Error removing target file: %s" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲ ଘୁଞ୍ଚାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfile.c:2336 +msgid "Move between mounts not supported" +msgstr "ଅସମର୍ଥିତ ସ୍ଥାପନଗୁଡ଼ିକ ମଧ୍ଯରେ ଗତିକରନ୍ତୁ" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "ଗୁଣର ମୂଲ୍ୟ ନିଶ୍ଚିତରୂପେ non-NULL ହୋଇଥିବା ଉଚିତ" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "ଅବୈଧ ଗୁଣର ପ୍ରକାର (ବାକ୍ୟଖଣ୍ଡ ଆଶାକରାଯାଉଛି)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "ଅବୈଧ ବିସ୍ତୃତ ଗୁଣର ନାମ" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ଅନୁଲଗ୍ନ ଗୁଣ '%s'କୁ ବିନ୍ୟାସ କରିବା ସମୟରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (ଅବୈଧ ସାଙ୍କେତିକରଣ)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ଫାଇଲ '%s' ପାଇଁ ସୂଚନା ପାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +#| msgid "Error stating file descriptor: %s" +msgid "Error when getting information for file descriptor: %s" +msgstr "ଫାଇଲ ନିରୂପକ ପାଇଁ ସୂଚନା ପାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (unit32 ଆଶାକରାଯାଉଛି)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (unit64 ଆଶାକରାଯାଉଛି)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "ଅବୈଧ ଗୁଣ ପ୍ରକାର (ବାଇଟ ବାକ୍ୟଖଣ୍ଡ ଆଶାକରାଯାଉଛି)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "symlinks ରେ ଅନୁମତିଗୁଡ଼ିକୁ ସେଟ କରିପାରିବେ ନାହିଁ" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ଅନୁମତି ବିନ୍ୟାସକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "ମାଲିକ ନିରୁପଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "symlink ନିଶ୍ଚିତ ରୂପେ non-NULL" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:2099 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: ଫାଇଲଟି ଗୋଟିଏ symlink ନୁହଁ" + +#: ../gio/glocalfileinfo.c:2225 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ପରିବର୍ତ୍ତନ ଅଥବା ଅଭିଗମ୍ୟତା ସମୟ ବିନ୍ୟାସକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:2248 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ପ୍ରସଙ୍ଗଟି ନିଶ୍ଚିତ ରୂପେ non-NULL ଅଟେ" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ପ୍ରସଙ୍ଗ ବିନ୍ୟାସ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ଏହି ତନ୍ତ୍ରରେ ସକ୍ରିୟ ହୋଇନାହିଁ" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ଗୁଣ %s ବିନ୍ୟାସ କରିବା ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "ଫାଇଲରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ଫାଇଲଭିତରେ ଅନୁସନ୍ଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ଫାଇଲ ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସ୍ଥାନୀୟ ଫାଇଲ ମନିଟର ପ୍ରକାର ଖୋଜିବାରେ ଅସମର୍ଥ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "ଫାଇଲଭିତରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ପୁରୁଣା ନକଲ ସଂରକ୍ଷଣ ସଂଯୋଗ ଅପସାରଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ନକଲ ସଂରକ୍ଷଣ ନକଲ ନିର୍ମାଣରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ଅସ୍ଥାୟୀ ଫାଇଲର ନାମ ବଦଳାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "ଫାଇଲ ବିଚ୍ଛିନ୍ନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ଫାଇଲ '%s' ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲଟି ଗୋଟିଏ ଡିରେକ୍ଟୋରୀ ଅଟେ" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "ଲକ୍ଷ୍ୟ ଫାଇଲଟି ଗୋଟିଏ ନିୟମିତ ଫାଇଲ ନୁହେଁ" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ଫାଇଲଟି ବାହାରୁ ପରିବର୍ତ୍ତିତ" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "ପୁରୁଣା ଫାଇଲକୁ ଅପସାରଣରେ ତ୍ରୁଟି: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "ଅବୈଧ GSeekType ଦିଆଯାଇଅଛି" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "ଅବୈଧ ଅନୁସନ୍ଧାନ ଅନୁରୋଧ" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream କୁ ବିଚ୍ଛିନ୍ନ କରିହେବ ନାହିଁ " + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "ସ୍ମୃତି ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡର ଆକାର ବଦଳାଯାଇପାରିବ ନାହିଁ" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "ସ୍ମୃତି ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡର ଆକାର ବଦଳାଇବାରେ ଅସଫଳ" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "ଲେଖିବା ପାଇଁ ଆବଶ୍ୟକୀୟ ସ୍ମୃତି ସ୍ଥାନ ଉପଲବ୍ଧ ଠିକଣା ଠାରୁ ଅଧିକ" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "ଧାରା ଆରମ୍ଭ ପୂର୍ବରୁ ପାଇବା ପାଇଁ ଅନୁରୋଧ କରିଛି" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "\"unmount\" କୁ mount କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +msgid "mount doesn't implement \"eject\"" +msgstr "\"eject\" କୁ mount କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: ../gio/gmount.c:547 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"\"unmount\" କିମ୍ବା \"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:631 +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:717 +msgid "mount doesn't implement \"remount\"" +msgstr "\"remount\" କୁ mount କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ସ୍ଥାପନ ସମକାଳୀନ ସୂଚୀପତ୍ର ପ୍ରକାର ଅନୁମାନକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "'%s' ଆଧାର ନାମ '[' but not ']' କୁ ଧାରଣ କରିଥାଏ" + +#: ../gio/gnetworkmonitorbase.c:178 +#| msgid "Network unreachable through SOCKSv5 proxy." +msgid "Network unreachable" +msgstr "ନେଟୱର୍କ ଅପହଞ୍ଚ ଦୂରତାରେ ଅଛି" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "ହୋଷ୍ଟ ଅପହଞ୍ଚ ଦୂରତାରେ ଅଛି" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +#| msgid "could not get remote address: %s" +msgid "Could not create network monitor: %s" +msgstr "ନେଟୱର୍କ ପ୍ରଦର୍ଶିକା ନିର୍ମାଣ କରି ପାଇଲା ନାହିଁ: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "ନେଟୱର୍କ ପ୍ରଦର୍ଶିକା ନିର୍ମାଣ କରି ପାଇଲା ନାହିଁ:" + +#: ../gio/gnetworkmonitornetlink.c:177 +#| msgid "could not get remote address: %s" +msgid "Could not get network status: " +msgstr "ନେଟୱର୍କ ସ୍ଥିତି ପାଇଲା ନାହିଁ:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "ଫଳାଫଳ ବାକ୍ଯଖଣ୍ଡ ଲେଖିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "ଉତ୍ସ ବାକ୍ୟଖଣ୍ଡଟି ପୂର୍ବରୁ ବନ୍ଦହୋଇଯାଇଛି" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' କୁ ସମାଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' କୁ ବିପରିତ-ସମାଧାନ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "ଅନୁରୋଧ କରାଯାଇଥିବା '%s' ପାଇଁ କୌଣସି DNS ବିବରଣୀ ନାହିଁ" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "ଅସ୍ଥାୟୀ ଭାବରେ '%s' କୁ ସମାଧାନ କରିବାରେ ଅସମର୍ଥ" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' କୁ ସମାଧାନ କରିବାରେ ତ୍ରୁଟି" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s' ପାଇଁ ଅସମ୍ପୂର୍ଣ୍ଣ ତଥ୍ୟ ଗ୍ରହଣ ହୋଇଛି" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' ରେ ଉତ୍ସ ଅବସ୍ଥିତ ନାହିଁ" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "ସଙ୍କଚନ ଖୋଲିବା ପାଇଁ '%s' ରେ ଉତ୍ସ ବିଫଳ ହୋଇଛି" + +#: ../gio/gresourcefile.c:651 +#, c-format +#| msgid "Target file is a directory" +msgid "The resource at '%s' is not a directory" +msgstr "'%s' ରେ ଥିବା ଉତ୍ସଟି ଏକ ଡିରେକ୍ଟୋରୀ ନୁହଁ" + +#: ../gio/gresourcefile.c:859 +#| msgid "Input stream doesn't implement read" +msgid "Input stream doesn't implement seek" +msgstr "ନିବେଶ ଧାରାରେ ପଢ଼ିବାକୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "ସହାୟତାକୁ ମୁଦ୍ରଣ କରନ୍ତୁ" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "elf FILE ରେ ଉତ୍ସଗୁଡ଼ିକୁ ଧାରଣ କରିଥିବା ତାଲିକା ବିଭାଗ" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"ତାଲିକା ଉତ୍ସଗୁଡ଼ିକ\n" +"ଯଦି SECTION ଦିଆଯାଇଥାଏ, ତେବେ ଏହି ବିବାଗରେ କେବଳ ଉତ୍ସଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ\n" +"ଯଦି PATH ଦିଆଯାଇଥାଏ, ତେବେ ମେଳଖାଉଥିବା ଉତ୍ସଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "ବିଭାଗ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"ବିବରଣୀ ସହିତ ତାଲିକା ଉତ୍ସଗୁଡ଼ିକ\n" +"ଯଦି SECTION ଦିଆଯାଇଥାଏ, ତେବେ କେବଳ ଏହି ବିଭାଗରେ ଥିବା ଉତ୍ସଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ " +"କରନ୍ତୁ\n" +"ଯଦି PATH ଦିଆଯାଇଥାଏ, ତେବେ ମେଳଖାଉଥିବା ଉତ୍ସଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ\n" +"ଏହି ବିଭାଗରେ ବିବରଣୀ, ଆକାର ଏବଂ ସଙ୍କୋଚନଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "stdout କରିବାକୁ ଏକ ଉତ୍ସକୁ ବାହାର କରନ୍ତୁ" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "ଫାଇଲ ପଥ" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"ଅଜଣା ନିର୍ଦ୍ଦେଶ %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ବ୍ୟବହାର ବିଧି:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"ନିର୍ଦ୍ଦେଶଗୁଡ଼ିକ:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"ବିସ୍ତାର ଭାବରେ ସହାୟତା ପାଇବା ପାଇଁ 'gresource help COMMAND' ବ୍ୟବହାର କରନ୍ତୁ।\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ବ୍ଯବହାର ବିଧି:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "ସ୍ୱତନ୍ତ୍ରଚରଗୁଡ଼ିକ:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION ଏକ (ବୈକଳ୍ପିକ) elf ବିଭାଗ ନାମ\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND ବର୍ଣ୍ଣନା କରିବା ପାଇଁ (ବୈକଳ୍ପିକ) ନିର୍ଦ୍ଦେଶ\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE ଏକ elf ଫାଇଲ (ଏକ ଦ୍ୱମିକ ଅଥବା ସହଭାଗୀ ଲାଇବ୍ରେରୀ)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE ଏକ elf ଫାଇଲ (ଏକ ଦ୍ୱମିକ ଅଥବା ସହଭାଗୀ ଲାଇବ୍ରେରୀ)\n" +" କିମ୍ବା ଏକ ଉତ୍ସ ଫାଇଲ\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH ଏକ (ଇଚ୍ଛାମୁତାବକ) ଉତ୍ସ ପଥ (ହୁଏତଃ ଆଂଶିକ)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "ପଥ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH ଏକ ଉତ୍ସ ପଥ\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "ଏପରି କୌଣସି ଯୋଜନା ନାହିଁ '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"ଯୋଜନା '%s' କୁ ସ୍ଥାନାନ୍ତର କରିହେବ ନାହିଁ (ପଥକୁ ନିଶ୍ଚିତ ଭାବରେ ଉଲ୍ଲେଖ କରିହେବ " +"ନାହିଁ)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "ଯୋଜନା '%s' କୁ ସ୍ଥାନାନ୍ତର କରିହେବ (ପଥ ନିଶ୍ଚିତ ଭାବରେ ଉଲ୍ଲିଖିତ)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "ଖାଲି ପଥ ଦିଆଯାଇଛି।\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "ପଥଟି ସ୍ଲାଶ (/) ସହିତ ଆରମ୍ଭ ହେବା ଉଚିତ\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "ପଥଟି ସ୍ଲାଶ (/) ସହିତ ଶେଷ ହେବା ଉଚିତ\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "ପଥରେ ଦୁଇଟି ପାଖାପାଖି ସ୍ଲାଶ (//) ରହିବା ଉଚିତ ନୁହଁ\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "ଏପରି କୌଣସି କି ନାହିଁ '%s'\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "ପ୍ରଦତ୍ତ ମୂଲ୍ୟଟି ସୀମା ବାହାରେ\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "ସ୍ଥାପିତ (ସ୍ଥାନାନ୍ତର-ଅଯୋଗ୍ୟ) ଯୋଜନାଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "ସ୍ଥାପିତ ସ୍ଥାନାନ୍ତରଯୋଗ୍ୟ ଯୋଜନାଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA ରେ ଥିବା କିଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "SCHEMA ର ନିମ୍ନସ୍ତରକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"କି ଏବଂ ମୂଲ୍ୟଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ, ପୁନଃପୌନିକ ଭାବରେ\n" +"ଯଦି କୌଣସି ଯୋଜନା ଦିଆଯାଇନଥାଏ, ତେବେ ସମସ୍ତ କି ଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "KEY ପାଇଁ ମୂଲ୍ୟ ଆଣନ୍ତୁ" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "KEY ପାଇଁ ବୈଧ ମୂଲ୍ୟର ସୀମା ପଚରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "KEY ର ମୂଲ୍ୟକୁ VALUE ରେ ସେଟକରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "KEY କୁ ତାହାର ପୂର୍ବନିର୍ଦ୍ଧାରିତ ମୂଲ୍ୟରେ ପୁନଃସ୍ଥାପନ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" +"SCHEMA ରେ ଥିବା ସମସ୍ତ କିଗୁଡ଼ିକୁ ତାହାର ପୂର୍ବନିର୍ଦ୍ଧାରିତ ମୂଲ୍ୟରେ ପୁନଃସ୍ଥାପନ " +"କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "KEY ଟି ଲିଖନଯୋଗ୍ୟ କି ନୁହଁ ତାହା ଯାଞ୍ଚ କରନ୍ତୁ" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ପାଇଁ KEY କୁ ନିରୀକ୍ଷଣ କରନ୍ତୁ।\n" +"ଯଦି କୌଣସି KEY ଉଲ୍ଲେଖ ହୋଇନାହିଁ, ତେବେ SCHEMA ରେ ଥିବା ସମସ୍ତ କିଗୁଡ଼ିକୁ ନିରୀକ୍ଷଣ " +"କରନ୍ତୁ।\n" +"ନିରୀକ୍ଷଣ କରିବା ପାଇଁ ^C କୁ ବ୍ୟବହାର କରନ୍ତୁ।\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ବ୍ୟବହାର ବିଧି:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"ନିର୍ଦ୍ଦେଶଗୁଡ଼ିକ:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"ସମ୍ପୂର୍ଣ୍ଣ ସହାୟତା ପାଇବା ପାଇଁ 'gsettings help COMMAND' କୁ ବ୍ୟବହାର କରନ୍ତୁ।\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ବ୍ଯବହାର ବିଧି:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "ଅତିରିକ୍ତ ଯୋଜନା ପାଇଁ SCHEMADIR ଏକ ଡିରେକ୍ଟୋରୀ ଅଟେ\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA ଯୋଜନାର ନାମ\n" +" PATH ସ୍ଥାନାନ୍ତରଣ ଯୋଗ୍ୟ ପଥ\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY ଯୋଜନା ମଧ୍ଯରେ ଥିବା (ବୈକଳ୍ପିକ) କି\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY ଯୋଜନା ମଧ୍ଯରେ ଥିବା କି\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE ସେଟ କରିବା ପାଇଁ ଥିବା ମୂଲ୍ୟ\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "ଖାଲି ଯୋଜନା ନାମ ଦିଆଯାଇଛି\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "ଅବୈଧ ସକେଟ, ଆରମ୍ଭ ହୋଇନାହିଁ" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ଅବୈଧ ସକେଟ, ଏହା ଯୋଗୁଁ ପ୍ରାରମ୍ଭିକରଣ ବିଫଳ ହୋଇଛି: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "ସକେଟ ପୂର୍ବରୁ ବନ୍ଦହୋଇଯାଇଛି" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3537 ../gio/gsocket.c:3592 +msgid "Socket I/O timed out" +msgstr "ସକେଟ I/O ର ସମୟ ସମାପ୍ତ" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ରୁ GSocket ନିର୍ମାଣ କରୁଅଛି : %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ସକେଟ ନିର୍ମାଣ କରିବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/gsocket.c:510 +#| msgid "Unknown protocol was specified" +msgid "Unknown family was specified" +msgstr "ଅଜଣା ପରିବାରକୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "ଅଜଣା ପ୍ରଟୋକଲକୁ ଉଲ୍ଲେଖ କରାଯାଇଛି" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "ସ୍ଥାନୀୟ ଠିକଣା ପାଇଲା ନାହିଁ: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "ସୁଦୂର ଠିକଣା ପାଇଲା ନାହିଁ: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "ଶୁଣି ପାରିଲା ନାହିଁ: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "ଠିକଣା ସହିତ ବାନ୍ଧିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +#| msgid "Error launching application: %s" +msgid "Error joining multicast group: %s" +msgstr "ମଲଟିକାଷ୍ଟ ସମୂହକୁ ଯୋଗ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +#| msgid "Error launching application: %s" +msgid "Error leaving multicast group: %s" +msgstr "ମଲଟିକାଷ୍ଟ ସମୂହକୁ ତ୍ୟାଗ କରିବା ସମୟରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "ଉତ୍ସ ନିର୍ଦ୍ଦିଷ୍ଟ ମଲଟିକାଷ୍ଟ ପାଇଁ କୌଣସି ସହାୟତା ନାହିଁ" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ସଂଯୋଗ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "ସଂଯୋଗ କ୍ରିୟା ଚାଲିଅଛି" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4334 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ବକୟା ତ୍ରୁଟି ପାଇବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/gsocket.c:2524 +#, c-format +msgid "Error receiving data: %s" +msgstr "ତଥ୍ୟ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:2702 +#, c-format +msgid "Error sending data: %s" +msgstr "ତଥ୍ୟ ପଠାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:2816 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ସକେଟ ବନ୍ଦ କରିବାରେ ଅସମର୍ଥ: %s" + +#: ../gio/gsocket.c:2895 +#, c-format +msgid "Error closing socket: %s" +msgstr "ସକେଟ ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:3530 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ସକେଟ ଅବସ୍ଥା ପାଇଁ ଅପେକ୍ଷା କରିଅଛି: %s" + +#: ../gio/gsocket.c:3808 ../gio/gsocket.c:3889 +#, c-format +msgid "Error sending message: %s" +msgstr "ସନ୍ଦେଶ ପଠାଇବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:3833 +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage Windows ରେ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gsocket.c:4113 ../gio/gsocket.c:4249 +#, c-format +msgid "Error receiving message: %s" +msgstr "ସନ୍ଦେଶ ଗ୍ରହଣ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gsocket.c:4353 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials କୁ ଏହି OS ପାଇଁ ନିଯୁକ୍ତ କରାଯାଇ ନାହିଁ" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "ପ୍ରକ୍ସି ସର୍ଭର %s ସହିତ ସଂଯୋଗ କରିପାରିଲା ନାହିଁ: " + +#: ../gio/gsocketclient.c:188 +#, c-format +#| msgid "Could not open converter from '%s' to '%s': %s" +msgid "Could not connect to %s: " +msgstr "%s ସହିତ ସଂଯୁକ୍ତ କରିପାରିଲା ନାହିଁ:" + +#: ../gio/gsocketclient.c:190 +#| msgid "could not listen: %s" +msgid "Could not connect: " +msgstr "ସଂଯୁକ୍ତ କରିପାରିଲା ନାହିଁ:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "ସଂଯୋଗ କରିବା ସମୟରେ ଅଜଣା ତୃଟି" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +#| msgid "Proxy protocol '%s' is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "ଏକ TCP ହୀନ ସଂଯୋଗ ଉପରେ ପ୍ରକ୍ସି ସଂଯୋଗ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ।" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "ପ୍ରକ୍ସି ପ୍ରଟୋକଲ '%s' ସମର୍ଥିତ ନୁହଁ।" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "ଗ୍ରହଣକାରୀ ପୂର୍ବରୁ ବନ୍ଦଅଛି" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ଅତିରିକ୍ତ ସକେଟ ବନ୍ଦ ଅଛି" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 IPv6 ଠିକଣା '%s' କୁ ସମର୍ଥନ କରେନାହିଁ" + +#: ../gio/gsocks4aproxy.c:139 +#| msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 ପ୍ରୋଟୋକଲ ପାଇଁ ବ୍ୟବହାରକାରୀ ନାମଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +#| msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "ହୋଷ୍ଟନାମ '%s' ଟି SOCKSv4 ପ୍ରଟୋକଲ ପାଇଁ ଅତ୍ୟଧିକ ବଡ଼" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "ଏହି ସର୍ଭରଟି ଗୋଟିଏ SOCKSv4 ପ୍ରକ୍ସି ସର୍ଭର ନୁହଁ।" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 ସର୍ଭର ମାଧ୍ଯମରେ ଥିବା ସଂଯୋଗକୁ ପ୍ରତ୍ୟାଖ୍ୟାନ କରାଯାଇଛି" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "ସର୍ଭରଟି ଗୋଟିଏ SOCKSv5 ପ୍ରକ୍ସି ସର୍ଭର ନୁହଁ।" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ପ୍ରକ୍ସି ବୈଧିକରଣ ଆବଶ୍ୟକ କରିଥାଏ।" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 ପ୍ରକ୍ସି ଏକ ବୈଧିକରଣ ପଦ୍ଧତି ଆବଶ୍ୟକ କରିଥାଏ ଯାହାକି GLib ଦ୍ୱାରା ସହାୟତା " +"ପ୍ରାପ୍ତ ନୁହଁ।" + +#: ../gio/gsocks5proxy.c:208 +#| msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"SOCKSv5 ପ୍ରଟୋକଲ ପାଇଁ ବ୍ୟବହାରକାରୀ ନାମ କିମ୍ବା ପ୍ରବେଶ ସଂକେତଟି ଅତ୍ୟଧିକ ବଡ଼।" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "ଭୁଲ ଚାଳକନାମ କିମ୍ବା ପ୍ରବେଶ ସଂକେତ ହେତୁ SOCKSv5 ବୈଧିକରଣ ବିଫଳ ହୋଇଛି।" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +#| msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "ହୋଷ୍ଟନାମ '%s' ଟି SOCKSv5 ପ୍ରଟୋକଲ ପାଇଁ ଅତ୍ୟଧିକ ବଡ଼" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ପ୍ରକ୍ସି ସର୍ଭର ଅଜଣା ଠିକଣା ପ୍ରକାର ବ୍ୟବହାର କରିଥାଏ।" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "ଆଭ୍ୟନ୍ତରୀଣ SOCKSv5 ପ୍ରକ୍ସି ସର୍ଭର ତ୍ରୁଟି।" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 ସଂଯୋଗ ନିୟମାବଳୀ ଦ୍ୱାରା ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ।" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "ହୋଷ୍ଟ SOCKSv5 ସର୍ଭର ମାଧ୍ଯମରେ ପହଞ୍ଚିହେବ ନାହିଁ।" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "ନେଟୱର୍କ SOCKSv5 ପ୍ରକ୍ସି ମାଧ୍ଯମରେ ପହଞ୍ଚି ହେବ ନାହିଁ।" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "ସଂଯୋଗଟି SOCKSv5 ପ୍ରକ୍ସି ମାଧ୍ଯମରେ ବାରଣ ହୋଇଛି।" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ପ୍ରକ୍ସି 'connect' ନିର୍ଦ୍ଦେଶକୁ ସମର୍ଥନ କରେ ନାହିଁ।" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 ପ୍ରକ୍ସି ଦିଆଯାଇଥିବା ଠିକଣା ପ୍ରକାରକୁ ସମର୍ଥନ କରେନାହିଁ।" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "ଅଜଣା SOCKSv5 ପ୍ରକ୍ସି ତ୍ରୁଟି।" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ସାଙ୍କେତିକରଣର ସଂସ୍କରଣ %dକୁ ନିୟନ୍ତ୍ରଣ କରାଯାଇପାରିବ ନାହିଁ" + +#: ../gio/gtlscertificate.c:248 +#| msgid "Could not parse PEM-encoded private key" +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-ସାଙ୍କେତିକ ବ୍ୟକ୍ତିଗତ କିକୁ ବିଶ୍ଳଷଣ କରିପାରିଲା ନାହିଁ।" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "କୌଣସି PEM-ସାଙ୍କେତିକ ବ୍ୟକ୍ତିଗତ କି ମିଳି ନାହିଁ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-ସାଙ୍କେତିକ ବ୍ୟକ୍ତିଗତ କିକୁ ବିଶ୍ଳଷଣ କରିପାରିଲା ନାହିଁ।" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "କୌଣସି PEM-ସାଙ୍କେତିକ ପ୍ରମାଣପତ୍ର ମିଳି ନାହିଁ" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-ସାଙ୍କେତିକ ପ୍ରମାଣପତ୍ରକୁ ବିଶ୍ଳଷଣ କରିପାରିଲା ନାହିଁ" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"ପ୍ରବେଶାନୁମତି ବାରଣ ହେବା ପୂର୍ବରୁ ପ୍ରବେଶ ସଂକେତକୁ ସଠିକ ଭାବରେ ଭରଣ କରିବା ପାଇଁ " +"ଏହା ହେଉଛି ଅନ୍ତିମ ସୁଯୋଗ।" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"ଭରଣ ହୋଇଥିବା ଅନେକ ପ୍ରବେଶ ସଂକେତ ଭୁଲ ଅଟେ, ଏବଂ ଆପଣଙ୍କର ପ୍ରବେଶାନୁମତିକୁ ଏହାପରେ " +"ଅପରିବର୍ତ୍ତନୀୟ କରିଦିଆଯିବ।" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "ଦିଆଯାଇଥିବା ପ୍ରବେଶ ସଂକେତଟି ଠିକ ନୁହଁ।" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ନିୟନ୍ତ୍ରଣ ସନ୍ଦେଶକୁ ଆଶାକରୁଅଛି, %d ପାଇଲି" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "ସହାୟକ ତଥ୍ୟର ଅପ୍ରତ୍ୟାଶିତ ପ୍ରକାର" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ଗୋଟିଏ fd ଆଶାକରୁଅଛି, କିନ୍ତୁ %d ପାଇଲି\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "ଅବୈଧ fd ଗ୍ରହଣ କରିଛି" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "ଅଧିକାରଗୁଡ଼ିକୁ ପଠାଇବାରେ ତ୍ରୁଟି: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "ଯଦି SO_PASSCRED କୁ ସକେଟ ପାଇଁ ସକ୍ରିୟ କରାଗଲେ ଯାଞ୍ଚ ତ୍ରୁଟି ହେବ: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"ଯାଞ୍ଚ କରିବା ସମୟରେ ଅପ୍ରତ୍ୟାଶିତ ବିକଳ୍ପ ଲମ୍ବ ଯଦି SO_PASSCRED କୁ ସକେଟରେ ସକ୍ରିୟ " +"କରାଯାଏ। " +"ଆଶାତିତ %d ବାଇଟ, %d ପାଇଛି" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED କୁ ସକ୍ରିୟ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"ଅଧିକାର ଗ୍ରହଣ ପାଇଁ ଏକ ବାଇଟ ପଢ଼ିବାକୁ ଆଶାକରାଯାଇଥାଏ କିନ୍ତୁ ଶୂନ୍ୟ ବାଇଟ ପଢ଼ିଥାଏ" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "ନିୟନ୍ତ୍ରଣ ସନ୍ଦେଶକୁ ଆଶାକରିନଥାଏ, %d ପାଇଲି" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED କୁ ନିଷ୍କ୍ରିୟ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +#| msgid "Error stating file descriptor: %s" +msgid "Error reading from file descriptor: %s" +msgstr "ଫାଇଲ ବର୍ଣ୍ଣନାକାରୀରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +#| msgid "Error stating file descriptor: %s" +msgid "Error closing file descriptor: %s" +msgstr "ଫାଇଲ ବର୍ଣ୍ଣନାକାରୀକୁ ବନ୍ଦ କରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ଫାଇଲତନ୍ତ୍ର ମୂଳସ୍ଥାନ" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +#| msgid "Error stating file descriptor: %s" +msgid "Error writing to file descriptor: %s" +msgstr "ଫାଇଲ ନିରୂପକକୁ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gunixsocketaddress.c:244 +#| msgid "Abstract unix domain socket addresses not supported on this system" +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "ଅବ୍ୟବହାରିକ UNIX ଡମେନ ସକେଟ ଠିକଣା ଏହି ତନ୍ତ୍ରରେ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ଆକାର ବାହାର କରିବା ଅଥବା eject_with_operation କୁ କାର୍ଯ୍ୟକାରୀ କରେନାହିଁ" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "ପ୍ରୟୋଗକୁ ଖୋଜିପାରିଲା ନାହିଁ" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "ପ୍ରୟୋଗକୁ ଆରମ୍ଭକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIଗୁଡ଼ିକ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 ରେ ସଂସ୍ଥା ପରିବର୍ତ୍ତନ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 ରେ ସଂସ୍ଥା ନିର୍ମାଣ ସମର୍ଥିତ ନୁହଁ" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "ନିୟନ୍ତ୍ରଣରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "ନିୟନ୍ତ୍ରଣକୁ ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "ନିୟନ୍ତ୍ରଣରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "ଯଥେଷ୍ଟ ସ୍ମୃତି ସ୍ଥାନ ନାହିଁ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "ଆଭ୍ୟନ୍ତରୀଣ ତ୍ରୁଟି: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "ଅଧିକ ନିବେଶ ଆବଶ୍ୟକ" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "ଅବୈଧ ସଙ୍କୋଚିତ ତଥ୍ୟ" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "ଶୁଣିବା ପାଇଁ ଠିକଣା" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "ଅଗ୍ରାହ୍ୟ, GTestDbus ସହିତ ସନ୍ନିହିତ" + +#: ../gio/tests/gdbus-daemon.c:20 +#| msgid "Print help" +msgid "Print address" +msgstr "ଠିକଣାକୁ ମୁଦ୍ରଣ କରନ୍ତୁ" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "ସେଲ ଧାରାରେ ଠିକଣାକୁ ମୁଦ୍ରଣ କରନ୍ତୁ" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "ଏକ dbus ସର୍ଭିସକୁ ଚଲାନ୍ତୁ" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "ଭୁଲ ସ୍ୱତନ୍ତ୍ରଚରଗୁଡ଼ିକ\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' ର ଗୁଣ '%s' ଉପାଦାନ ପାଇଁ ଅପ୍ରତ୍ଯାଶିତ ଅଟେ" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' ଗୁଣକୁ '%s' ଉପାଦାନ ପାଇଁ ଖୋଜି ପାରିଲା ନାହିଁ" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ଅପ୍ରତ୍ଯାଶିତ '%s' ସୂଚକ, '%s' ସୂଚକକୁ ଆଶା କରାଯାଉଥିଲା" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "ଅପ୍ରତ୍ଯାଶିତ '%s' ସୂଚକଟି '%s' ମଧ୍ଯରେ ଅଛି" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "ତଥ୍ଯ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ କୌଣସି ବୈଧ ଚିହ୍ନିତ ସ୍ଥାନ ମିଳିଲା ନାହିଁ" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URI ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କ ପୂର୍ବରୁ ଅବସ୍ଥିତ ଅଛି" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ କୌଣସି ବୁକ୍ ମାର୍କ ମିଳିଲା ନାହିଁ" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" +"'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି MIME ପ୍ରକାରକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୌଣସି ଗୁପ୍ତ ଚିହ୍ନକକୁ ବ୍ଯାଖ୍ଯା କରାଯାଇ ନାହିଁ" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ପାଇଁ ବୁକ୍ ମାର୍କରେ କୈଣସି ସମୂହକୁ ସେଟ କରାଯାଇ ନାହିଁ" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" +"'%s' ନାମରେ ନାମିତ କୌଣସି ପ୍ରୟୋଗ '%s' ପାଇଁ ଗୋଟିଏ ବୁକ୍ ମାର୍କକୁ ପଞ୍ଜିକ୍ରୁତ କରିନାହିଁ" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' ୟୁ.ଆର.ଆଇ. ସହିତ '%s' ନିଷ୍ପାଦନ ଧାଡିକୁ ବର୍ଦ୍ଧନ କରିବାରେ ବିଫଳ" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "ନିବେଶର ସମାପ୍ତିରେ ଆଶିଂକ ଅକ୍ଷର ଅନୁକ୍ରମ" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "'%s' ସହାୟକକୁ ସଂକେତ '%s' ସେଟ୍ ରେ ରୁପାନ୍ତରିତ କରିହେଲା ନାହିଁ" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"'%s' ୟୁ.ଆର୍.ଆଇ. \"ଫାଇଲ\" ଯୋଜନାକୁ ବ୍ଯବହାର କରୁଥିବା ଗୋଟିଏ ସମ୍ପୂର୍ଣ୍ଣ ୟୁ.ଆର୍.ଆଇ. " +"ନୁହେଁ" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "'%s' ସ୍ଥାନୀୟ ଫାଇଲ ୟୁ.ଆର୍.ଆଇ. '#' ଚିହ୍ନକୁ ସମ୍ମିଳିତ କରିପାରିବ ନାହିଁ" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ. ଅବୈଧ ଅଟେ" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ର ଆଧାର ନାମ ଅବୈଧ ଅଟେ" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "'%s' ୟୁ.ଆର୍.ଆଇ.ରେ ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ରହିଛି" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' ପଥ ନାମ ଏକ ସମ୍ପୂର୍ଣ୍ଣ ପଥ ନୁହେଁ" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "ଅବୈଧ ଆଧାର ନାମ" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Oe %B %Oy %OI:%OM:%OS %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Od-%Om-%Oy" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%OI:%OM:%OS %p" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%OI:%OM:%OS %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ଜାନୁଆରୀ" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ଫେବୃଆରୀ" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "ମାର୍ଚ୍ଚ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ଅପ୍ରେଲ" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "ମଇ" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "ଜୁନ" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ଜୁଲାଇ" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ଅଗଷ୍ଟ" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "ସେପଟେମ୍ବର" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ଅକ୍ଟୋବର" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "ନଭେମ୍ବର" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ଡିସେମ୍ବର" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ଜାନୁୟାରୀ" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ଫେବୃଯାରୀ" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "ମାର୍ଚ୍ଚ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ଅପ୍ରେଲ" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "ମେ" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ଜୁନ" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ଜୁଲାଇ" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ଅଗଷ୍ଟ" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "ସେପଟେମ୍ବର" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ଅକ୍ଟୋବର" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ନଭେମ୍ବର" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ଡିସେମ୍ବର" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ସୋମବାର" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "ମଙ୍ଗଳବାର" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ବୁଧବାର" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ଗୁରୁବାର" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "ଶୁକ୍ରବାର" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "ଶନିବାର" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ରବିବାର" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ସୋମ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ମଙ୍ଗଳ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ବୁଧ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ଗୁରୁ" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ଶୁକ୍ର" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ଶନି" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ରବି" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "%s' ଡିରେକ୍ଟୋରି ଖୋଲିବାରେ ତ୍ରୁଟି: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "\"%2$s\" ଫାଇଲ ପଢିବା ପାଇଁ %1$lu ବାଇଟ୍ ବାଣ୍ଟିହେଲା ନାହିଁ" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ଫାଇଲ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ଫାଇଲ \"%s\" ଟି ଅତ୍ଯଧିକ ବଡ଼" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ଫାଇଲ ପଢିବାରେ ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ଫାଇଲର ଗୁଣ ପାଇବାରେ ଅସଫଳ: fstat() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ଫାଇଲ ରୁ '%s' ନାମ ବଦଳାଇ ବାରେ ଅସଫଳ: g_rename() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ଫାଇଲ ସ୍ରୁଷ୍ଟି କରିବାରେ ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' ଫାଇଲ କୁ େଲଖନ ପାଇଁ ଖୋଲିବାରେ ଅସଫଳ: fdopen() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fwrite() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fflush() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: fsync() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ଫାଇଲ କୁ ବନ୍ଦ କରିବା ରେ ଅସଫଳ: fclose() ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ଅବସ୍ଥିତ '%s' ଫାଇଲ କାଢି ହେଲା ନାହଁି: g_unlink ଅସଫଳ %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ନମୁନା ଟି ଅବୈଧ ଅଟେ, '%s' ଧାରଣ କରିବା ଉଚିତ ନୁହେଁ" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ନମୁନା ଟି XXXXXXକୁ ଧାରଣ କରିନାହିଁ" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ପଢିବାରେ ଅସଫଳ: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "ପ୍ରତିକାତ୍ମକ ସଂୟୋଗ ଅସହାୟକ" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "%s' ରୁ '%s' ର ରୁପାନ୍ତରକ ଖୋଲି ପାରିଲା ନାହିଁ: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ରେ ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2065 +#: ../glib/giochannel.c:2152 +msgid "Leftover unconverted data in read buffer" +msgstr "ପଠନ ବଫରରେ ଅରୂପାନ୍ତରିତ ତଥ୍ଯ ବଳକା ଅଛି" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "ଆଂଶିକ ଅକ୍ଷର ରେ ଚାନେଲର ସମାପ୍ତି" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end େର ଅଂସସାଧିତ ପଠନ କରିହେଲା ନାହିଁ" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "ଅନୁସନ୍ଧାନ ଡିରେକ୍ଟୋରି ମାନଙ୍କରେ ବୈଧ ଚାବି ଫାଇଲ ମିଳିଲା ନାହିଁ" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "ଏହା ଏକ ନିୟମିତ ଫାଇଲ ନୁହେଁ" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ମୁଖ୍ଯ ଫାଇଲ '%s' କୁ ଧାରଣ କରିଛି ଯାହାକି ଗୋଟିଏ ମୁଖ୍ଯ-ଗୁଣ ର ଯୋଡି, ସମୂହ, କିମ୍ବା " +"ବାକ୍ଯ ନୁହେଁ" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "ଅବୈଧ ସମୂହ ନାମ: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "ମୂଖ୍ଯ ଫାଇଲ କୌଣସି ସମୂହ ସହ ଆରମ୍ଭ ହୁଏ ନାହିଁ" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "ଅବୈଧ ଚାବି ନାମ: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଗୋଟିଏ ଅସହାୟକ ସଂକେତ '%s' ଧାରଣ କରିଛି" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ସମୂହ ନାହିଁ" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି ନାହିଁ" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ '%s' ଅଟେ, ଯାହାକି ଇଉ-ଟି-ଏଫ୍-à­® " +"ନୁହେଁ" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ଗୋଟିଏ '%s' ସମୂହ ସହିତ ଅଛି " +"ଯାହାର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ।" + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +#| msgid "" +#| "Key file contains key '%s' in group '%s' which has value that cannot be " +#| "interpreted." +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"କି '%s' ଯାହା ସମୂହ '%s' ରେ ଅଛି ତାହାର ମୂଲ୍ୟ '%s' ଯେଉଁଠି %s କୁ ଆଶାକରାଯାଇଥିଲା" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ େର '%s' ନାମ ଥିବା କୌଣସି ଚାବିକାଠି '%s' ସମୂହ ରେ ନାହିଁ " + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "ମୂଖ୍ଯ ଫାଇଲ ଟି ଲାଇନ୍ ର ସମାପ୍ତି ରେ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ମୂଖ୍ଯ ଫାଇଲ '%s' ଅବୈଧ ଏସ୍କେପ୍ ଅକ୍ଷର ଧାରଣ କରିଛି" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ସଂଖ୍ଯା ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ପୂର୍ଣ ମୂଲ୍ଯ '%s' ପରିସର ର ବାହାରେ ଅଛି" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' ମୂଲ୍ଯକୁ ଗୋଟିଏ ଭାସମାନ ସଂଖ୍ଯା ଭାବରେ ବ୍ଯାଖ୍ଯା କରିହେବ ନାହିଁ" + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "'%s' ର ମୂଲ୍ଯ ଗୋଟିଏ ବୁଲିଆନ୍ ଭାବରେ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#: ../glib/gmappedfile.c:128 +#, c-format +#| msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "'%s%s%s%s' ଫାଇଲର ଗୁଣ ପାଇବାରେ ଅସଫଳ: fstat() ଅସଫଳ: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +#| msgid "Failed to map file '%s': mmap() failed: %s" +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s ଫାଇଲ କୁ ମେଳାଇବାରେ ଅସଫଳ: mmap() ଅସଫଳ: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' ଫାଇଲ ଖୋଲିବାରେ ଅସଫଳ: open() ଅସଫଳ: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ଧାଡ଼ି %dର ଅକ୍ଷର %dରେ ତ୍ରୁଟି: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ନାମରେ ଅବୈଧ UTF-8 ସାଙ୍କେତିକ ପାଠ୍ଯ- '%s' ବୈଧ ନୁହଁ" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ଟି ଗୋଟିଏ ବୈଧ ନାମ ନୁହଁ" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ଟି ଗୋଟିଏ ବୈଧ ନାମ ନୁହଁ: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d ଧାଡ଼ିରେ ତ୍ରୁଟି: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "'%-.*s' ଅକ୍ଷର ରେଫରେନ୍ସ ଟି ଗୋଟିଏ ଅନୁମତ ଅକ୍ଷରକୁ ସଙ୍କେତ କରୁ ନାହିଁ" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"ଖାଲି ବସ୍ତୁ '&;' ଦେଖା ଗଲା; ବୈଧ ବସ୍ତୁଗୁଡ଼ିକ ହେଲା: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ବସ୍ତୁ ନାମ '%-.*s' ଜଣା ନାହିଁ" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "ଦଲିଲ ଗୋଟିଏ ଉପାଦାନରେ ଆରମ୍ଭ ହେବା ଉଚିତ (ଉଦାହରଣ ସ୍ବରୂପ )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' ଅକ୍ଷର ପଛରେ ଆସୁଥିବା '%s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଏହା ଗୋଟିଏ ବସ୍ତୁର ନାମକୁ ଆରମ୍ଭ " +"କରିପାରିବ ନାହିଁ" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ଅଯୁଗ୍ମ ସଂଖ୍ୟା '%s', ଖାଲି-ଉପାଦାନ ଟ୍ୟାଗ '%s' ପ୍ରାରମ୍ଭ ସୂଚକକୁ ସମାପ୍ତ କରିବା ପାଇଁ " +"'>' ଅକ୍ଷର " +"ଆଶାକରାଯାଉଥିଲା" + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"ବନ୍ଦ ଉପାଦାନ ନାମ '%2$s' ପଛରେ ଆସୁଥିବା '%1$s' ଅକ୍ଷର ବୈଧ ନୁହେଁ; ଅନୁମତ ଅକ୍ଷର ହେଲା " +"'>'" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, ବର୍ତ୍ତମାନ କୌଣସି ଉପାଦାନ ଖୋଲା ନାହିଁ" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ଉପାଦାନ '%s' ବନ୍ଦ କରାଯାଇଥିଲା, କିନ୍ତୁ ବର୍ତ୍ତମାନ '%s' ଉପାଦାନଟି ଖୋଲା ଅଛି" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "ଦଲିଲ ଖାଲି ଥିଲା ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"ଦଲିଲଟି ଗୋଟିଏ କୌଣିକ ବନ୍ଧନୀ '<'ର ଠିକ ପରେ ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"ଉପାଦାନଗୁଡ଼ିକ ଖୋଲା ଥାଇ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା'%s' ଉପାଦାନ " +"ସର୍ବଶେଷ ଖୋଲା " +"ଥିଲା" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା, <%s/> ସୂଚକ ସମାପ୍ତ କରିବା ପାଇଁ ଗୋଟିଏ " +"ବନ୍ଦ କୌଣିକ " +"ବନ୍ଧନୀ ପ୍ରତ୍ଯାଶିତ ଥିଲା" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "ଉପାଦାନର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ଗୁଣର ନାମ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ଉପାଦାନ ଆରମ୍ଭର ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ଗୁଣର ନାମ ପଛରେ ଆସୁଥିବା ସମାନ ଚିହ୍ନ ପରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା; " +"ଗୁଣର କିଛି " +"ମୂଲ୍ଯ ନାହିଁ" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ଗୁଣର ମୂଲ୍ଯ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' ଉପାଦାନର ବନ୍ଦ ସୂଚକ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ଟିପ୍ପଣୀ ବା ସଂସାଧନ ସାଧନ ମଧ୍ଯରେ ଦଲିଲଟି ଅପ୍ରତ୍ଯାଶିତ ଭାବରେ ସମାପ୍ତ ହୋଇ ଗଲା" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ବ୍ଯବହାର:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ପସନ୍ଦ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "ସବୁ ସାହାଯ୍ଯ ପସନ୍ଦ ଦେଖାନ୍ତୁ" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "ପ୍ରୟୋଗ ପସନ୍ଦ" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା ମୂଲ୍ଯ '%s' କୁ ବିଶ୍ଲେଷିଣ କରିହେଲା ନାହିଁ" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%s ପାଇଁ ପୂର୍ଣ ସଂଖ୍ଯା '%s' ର ମୂଲ୍ଯ ପରିସର ବାହାରେ" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯକୁ %s ପାଇଁ ବିଶ୍ଳେଷିତ କରିପାରିଲା ନାହିଁ" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "'%s' ଦ୍ବ୍ଯର୍ଥକ ମୂଲ୍ଯଟି %s ପାଇଁ ପରିସରର ବହିର୍ଭୂତ।" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "ରୁପାନ୍ତରଣ ର ବିକଲ୍ପ ରେ ତ୍ରୁଟି: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ପାଇଁ ସ୍ବତନ୍ତ୍ରଚର ଟି ହଜି ଯାଇଛି" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "ଅଜଣା ପସନ୍ଦ %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ଭ୍ରଷ୍ଟ ବସ୍ତୁ" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "ଆଭ୍ଯନ୍ତରୀଣ ତୃଟି କିମ୍ବା ଭ୍ରଷ୍ଟ ବସ୍ତୁ" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ସ୍ମୃତି ପରିସର ବାହାରେ" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "ପଶ୍ଚାତ ଅନୁମାର୍ଗଣ ସୀମା ପହଞ୍ଚି ଯାଇଛି" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "ଏହି ଶୈଳୀ ଆଂଶିକ ମେଳନ ପାଇଁ ସମର୍ଥିତ ନ ଥିବା ବସ୍ତୁ ମାନଙ୍କୁ ଧାରଣ କରିଥାଏ" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "ଆଂଶିକ ମେଳନ ପାଇଁ ସର୍ତ୍ତ ରୂପରେ ପଶ୍ଚାତ ନିର୍ଦ୍ଦେଶ ମାନ ସମର୍ଥିତ ନୁହଁନ୍ତି" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "ପୁନରାବର୍ତ୍ତନ ସୀମା ପହଞ୍ଚିଯାଇଛି" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ନୂତନ ଧାଡି ପତାକା ମାନଙ୍କ ପାଇଁ ଅବୈଧ ମିଶ୍ରଣ" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ଖରାପ ଅଫସେଟ" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "ସଂକ୍ଷିପ୍ତ utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "ପୁନଃପୌମିକ ଲୁପ" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ଅଜଣା ତୃଟି" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ନମୁନା ଶେଷରେ" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ନମୁନା ଶେଷରେ" + +#: ../glib/gregex.c:335 +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "ନିମ୍ନଲିଖିତ ପରେ ଅଚିହ୍ନା ଅକ୍ଷର\\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} ପରିମାଣକ ରେ ସଂଖ୍ୟାଗୁଡ଼ିକ କ୍ରମରେ ନାହିଁ" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} ପରିମାଣକ ରେ ସଂଖ୍ୟାଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀ ପାଇଁ ସମାପ୍ତି ] ଅନୁପସ୍ଥିତ ଅଛି" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀରେ ଅବୈଧ ନିକାସ ଅନୁକ୍ରମ" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "ବର୍ଣ୍ଣ ଶ୍ରେଣୀରେ ପରିସର ଅବ୍ୟବସ୍ଥିତ" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "ପୁନରାବର୍ତ୍ତନ ପାଇଁ କିଛି ନାହିଁ" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "ଅପ୍ରତ୍ୟାଶିତ ପୁନରାବୃତ୍ତି" + +#: ../glib/gregex.c:360 +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "(? କିମ୍ବା (?- ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ନାମିତ ଶ୍ରେଣୀଗୁଡ଼ିକ କେବଳ ଗୋଟିଏ ଶ୍ରେଣୀ ମଧ୍ଯରେ ସମର୍ଥିତ" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ସମାପ୍ତକାରୀ ) ଅନୁପସ୍ଥିତ" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "ଅସ୍ତିତ୍ୱ ନଥିବା ଉପନମୁନାର ସନ୍ଦର୍ଭ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ଟିପ୍ପଣୀ ପରେ ) ଅନୁପସ୍ଥିତ" + +#: ../glib/gregex.c:375 +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "ନିୟମିତ ପରିପ୍ରକାଶଟି ଅତ୍ଯଧିକ ବଡ଼" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ସ୍ମୃତିସ୍ଥାନ ପାଇବାରେ ବିଫଳ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ଆରମ୍ଭ ବିନା (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "ସଂକେତ ଅତିପ୍ରବାହ" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "ପଛକୁ ଦେଖି ନିଶ୍ଚିତକରଣର ସ୍ଥାୟୀ ଆକାର ନଥାଏ" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "ବିକୃତ ସଂଖ୍ୟା କିମ୍ବା (?( ପରେଥିବା ନାମ" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "ପ୍ରତିବନ୍ଧିତ ଶ୍ରେଣୀ ଦୁଇରୁ ଅଧିକ ଶାଖା ଧାରଣ କରିଥାଏ" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R କିମ୍ବା (?[+-]ଅଙ୍କଗୁଡ଼ିକ ନିଶ୍ଚିତରୂପେ ) ପରେ ଆସିବା ଉଚିତ" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ଅଜଣା POSIX ଶ୍ରେଣୀ ନାମ" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ସଂକଳନ ଉପାଦାନଗୁଡ଼ିକ ସମର୍ଥିତ ନୁହଁ" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ଅନୁକ୍ରମରେ ବର୍ଣ୍ଣର ମୂଲ୍ୟ ଅତ୍ୟଧିକ ବଡ଼" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ଅବୈଧ ସର୍ତ୍ତ (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ପଛକୁ ଦେଖି ନିଶ୍ଚିତକରଣରେ \\C ଅନୁମୋଦିତ ନୁହଁ" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "\\L, \\l, \\N{name}, \\U, ଏବଂ \\u ଗୁଡ଼ିକ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "ପୁନରାବର୍ତ୍ତୀ ଡାକରା ଅନିର୍ଦ୍ଧିଷ୍ଟ କାଳପାଇଁ ଚକ୍ର ସୃଷ୍ଟିକରିପାରେ" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P ପରେ ଅଚିହ୍ନା ଅକ୍ଷର" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "ଉପନମୁନା ନାମରେ ଅନ୍ତକ ନାହିଁ" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "ଦୁଇଟି ନାମିତ ଉପନମୁନାର ଏକା ନାମ ଅଛି" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "\\P କିମ୍ବା \\p ଅନୁକ୍ରମଟି ବିକୃତ ହୋଇଯାଇଛି" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P କିମ୍ବା \\p ପରେ ଅଜଣା ଗୁଣଧର୍ମ ନାମ" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ଉପଢ଼ାଞ୍ଚା ନାମଟି ଅତ୍ୟଧିକ ବଡ଼ (ସର୍ବାଧିକ 32 ବର୍ଣ୍ଣ)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ଅତ୍ୟଧିକ ନାମିତ ଉପଢ଼ାଞ୍ଚା (ସର୍ବାଧିକ 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "ଅଷ୍ଟମିକ ମୂଲ୍ୟଟି \\377 ଠାରୁ ବଡ଼" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "overran ସଙ୍କଳନ କାର୍ଯ୍ୟକ୍ଷେତ୍ର" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "ପୂର୍ବରୁ ଯାଞ୍ଚକରାଯାଇଥିବା ଉଲ୍ଲେଖିତ ଉପଢ଼ାଞ୍ଚା ମିଳୁନାହିଁ" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ଶ୍ରେଣୀ ଏକାଧିକ ଶାଖା ଧାରଣ କରେ" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "ଅସଂଗତ NEWLINE ବିକଳ୍ପଗୁଡ଼ିକ" + +#: ../glib/gregex.c:476 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g ଟି ଗୋଟିଏ ଆବଦ୍ଧ ନାମ ପରେ କିମ୍ବା ଇଚ୍ଛାଧୀନ ଆବଦ୍ଧ ପୂର୍ଣ୍ଣ ସଂଖ୍ୟା ପରେ ନଥାଏ" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "ଏକ ସାଂଖିକ ସନ୍ଦର୍ଭ ନିଶ୍ଚିତ ଭାବରେ ଶୂନ୍ୟ ହୋଇନଥିବା ଉଚିତ" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" +"ଏକ ସ୍ୱତନ୍ତ୍ରଚରକୁ (*ACCEPT), (*FAIL), କିମ୍ବା (*COMMIT) ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) କୁ ଚିହ୍ନିହେବ ନାହିଁ" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "ସଂଖ୍ୟାଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: ../glib/gregex.c:492 +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "(?& ପରେ ଅନୁପସ୍ଥିତ ଉପନମୁନା ନାମ" + +#: ../glib/gregex.c:495 +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "(?+ପରେ ଅଙ୍କ ଆଶା କରାଯାଉଥିଲା" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] ଟି JavaScript ସୁସଙ୍ଗତ ଧାରାରେ ଏକ ଅବୈଧ ତଥ୍ୟ ଅକ୍ଷର" + +#: ../glib/gregex.c:501 +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ସମାନ ସଂଖ୍ୟାର ଦୁଇଟି ନାମିତ ଉପନମୁନା ପାଇଁ ଭିନ୍ନ ନାମଗୁଡ଼ିକ ଅନୁମତି ପ୍ରାପ୍ତ" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) ରେ ନିଶ୍ଚିତ ଭାବରେ ଏକ ସ୍ୱତନ୍ତ୍ରଚର ଅଛି" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c ଟି ନିଶ୍ଚିତ ଭାବରେ ଏକ ASCII ଅକ୍ଷର ପରେ ଥାଏ" + +#: ../glib/gregex.c:510 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k କୁ ବନ୍ଧନି ପରେ ରଖାାଇନଥାଏ, କୌଣ-ବନ୍ଧନି, ଅଥବା ଉଦ୍ଧୃତ ନାମ" + +#: ../glib/gregex.c:513 +#| msgid "URIs not supported" +msgid "\\N is not supported in a class" +msgstr "\\N କୁ ଏକ ଶ୍ରେଣୀରେ ସହାୟତା ଦିଆଯାଇନଥାଏ" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "ଅତ୍ୟଧିକ ଆଗୁଆ ସନ୍ଦର୍ଭ" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), ଅଥବା (*THEN) ରେ ନାମଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: ../glib/gregex.c:522 +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... କ୍ରମରେ ଥିବା ଅକ୍ଷର ମୂଲ୍ୟଟି ଅତ୍ୟଧିକ ବଡ଼" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ ମିଳାଇବା ସମୟରେ ତୃଟି: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE ଲାଇବ୍ରେରୀକୁ UTF8 ସମର୍ଥନ ବିନା ସଙ୍କଳନ କରାଯାଇଛି" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE ଲାଇବ୍ରେରୀକୁ UTF8 ଗୁଣଧର୍ମ ସମର୍ଥନ ବିନା ସଙ୍କଳନ କରାଯାଇଛି" + +#: ../glib/gregex.c:1331 +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE ଲାଇବ୍ରେରୀକୁ ଅସଙ୍ଗତ ବିକଳ୍ପଗୁଡ଼ିକ ସହିତ ସଙ୍କଳନ କରାଯାଇଛି" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ %d ଅକ୍ଷରରେ ସଙ୍କଳନ କରିବା ସମୟରେ ତୃଟି: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s ନିୟମିତ ପରିପ୍ରକାଶକୁ ଅନୁକୂଳତମ କରିବା ସମୟରେ ତୃଟି: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "ଷୋଡଶାଧାରୀ ଅଙ୍କ କିମ୍ବା '}' ଆଶା କରାଯାଉଥିଲା" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "ଷୋଡଶାଧାରୀ ଅଙ୍କ ଆଶା କରାଯାଉଥିଲା" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶରେ '<' ଅନୁପସ୍ଥିତ" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "ଅସମାପ୍ତ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "ଶୂନ୍ଯ ଲମ୍ବ ବିଶିଷ୍ଟ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "ଅଙ୍କ ଆଶା କରାଯାଉଥିଲା" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ଅବୈଧ ପ୍ରତୀକାତ୍ମକ ନିର୍ଦ୍ଦେଶ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "ପଥଭ୍ରଷ୍ଟ ନିର୍ଣ୍ଣୟ '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ଅଜଣା ପଳାୟନ ସଂପ୍ରତୀକ" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ପରିବର୍ତ୍ତିତ ପାଠ୍ଯ \"%s\" ର %lu ଅକ୍ଷରରେ ବିଶ୍ଳଷଣ କରିବା ସମୟରେ ତୃଟି: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯ ଉଦ୍ଧ୍ରୁତ ଚିହ୍ନରେ ଆରମ୍ଭ ହୋଇ ନାହିଁ" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "ପାଠ୍ଯ ନିର୍ଦ୍ଦେଶ ବା ଅନ୍ଯ ଆବରଣ-ଉଦ୍ଧ୍ରୁତ ପାଠ୍ଯରେ ଅମେଳ ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ଗୋଟିଏ '\\' ଅକ୍ଷରର ଠିକ ପରେ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା (ପାଠ୍ଯଟି ଥିଲା: '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"%c ପାଇଁ ମେଳ ହେଉ ଥିବା ଉଦ୍ଧ୍ରୁତି ଚିହ୍ନ ମିଳିବା ପୂର୍ବରୁ ପାଠ୍ଯ ସମାପ୍ତ ହୋଇ ଗଲା. " +"(ପାଠ୍ଯଟି ଥିଲା: '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "ପାଠ୍ଯ ଖାଲି ଥିଲା (ବା କେବଳ ଖାଲି ଯାଗା ଧାରଣ କରିଥିଲା)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ select()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()ରେ ଅପ୍ରତ୍ଯାଶିତ ତ୍ରୁଟି (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "ନିମ୍ନ ସ୍ତରୀୟ ପଦ୍ଧତିକୁ ସଂକେତ %ld ସହିତ ପ୍ରସ୍ଥାନ କରିଥାଏ" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "ନିମ୍ନ ସ୍ତରୀୟ ପଦ୍ଧତିକୁ ସଂକେତ %ld ଦ୍ୱାରା ବନ୍ଦ କରିଥାଏ" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "ନିମ୍ନ ସ୍ତରୀୟ ପଦ୍ଧତିକୁ ସଂକେତ %ld ଦ୍ୱାରା ଅଟକ ରଖିଥାଏ" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "ନିମ୍ନ ସ୍ତରୀୟ ପଦ୍ଧତି ଅସାଧରଣ ଭାବରେ ପ୍ରସ୍ଥାନ କରିଥାଏ" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ନିର୍ଭରକ ପାଇପ୍ ରୁ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ଶାଖା ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s" + +# Gora: "change to directory" means "go to directory" here +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' ଡିରେକ୍ଟୋରିକୁ ଯିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା \"%s\" ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାର ନିର୍ଗମ ବା ନିବେଶର ପୁନଃନିର୍ଦ୍ଦେଶନ କରିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ଶାଖାଯୁକ୍ତ କରିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅଜଣା ତ୍ରୁଟି \"%s\"" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ନିର୍ଭରକ ପି.ଆଇ.ଡି. ପାଇପ୍ ରୁ ପର୍ଯ୍ଯାପ୍ତ ତଥ୍ଯ ପଢି଼ବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟା ସହିତ ସଂଯୋଗ ପାଇଁ ପାଇପ୍ ସୃଷ୍ଟି କରିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢ଼ିବାରେ ଅସଫଳ" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ନିର୍ଭରକ ପ୍ରକ୍ରିୟାକୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "ଅବୈଧ ପ୍ରୋଗ୍ରାମ ନାମ: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "ସଦିଶ ସ୍ବତନ୍ତ୍ରଚର %d ରେ ବାକ୍ଯଖଣ୍ଡ %s ଟି ଅବୈଧ ଅଟେ" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ଏହି ପରିୂବେଶ ରେ ବାକ୍ଯଖଣ୍ଡ:%s ଅବୈଧ ଅଟେ" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ଚଳନ୍ତି ଡିରେକ୍ଟୋରି: %s ଟି ଅବୈଧ ଅଟେ" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ସାହାଯ୍ଯ କାରିକା (%s) କୁ ନିଷ୍ପାଦନ କରିବାରେ ଅସଫଳ" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ନିର୍ଭରକ ପ୍ରକ୍ରିୟାରୁ ତଥ୍ଯ ପଢି଼ବାରେ g_io_channel_win32_poll()ରେ ଅପ୍ରତ୍ଯାଶିତ " +"ତ୍ରୁଟି" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "ଇ.ଉ.ଟିଏଫ୍.-à­® ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "ରୁପାନ୍ତରଣ ନିବେଶେର ଅବୈଧ ଅନୁକ୍ରମ" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "ଇ.ଉ.ଟିଏଫ୍.-à­§à­¬ ପାଇଁ ଅକ୍ଷରଟି ପରିସର ବାହାରେ" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u ବାଇଟ" +msgstr[1] "%u ବାଇଟ" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s ବାଇଟ" +msgstr[1] "%s ବାଇଟ" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' ପାଇଁ କୌଣସି ସର୍ଭିସ ଅନୁଲିପି ନାହିଁ" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ଶୂନ୍ଯ ଉପବାକ୍ଯଖଣ୍ଡ କାର୍ଯ୍ଯସ୍ଥଳୀ ପରିସୀମା ଶେଷ ହୋଇଯାଇଛି" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "ଅକ୍ଷର ପ୍ରକାର-ପରିବର୍ତ୍ତନ escapes (\\l, \\L, \\u, \\U) ଗୁଡ଼ିକ ଏଠାରେ ଅନୁମୋଦିତ ନୁହଁନ୍ତି" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE ଶ୍ରେଣୀର ପୁନରାବର୍ତ୍ତନ ଅନୁମୋଦିତ ନୁହଁ" + +#~ msgid "File is empty" +#~ msgstr "ଫାଇଲ ଟି ଖାଲି ଅଛି" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "ମୂଖ୍ଯ ଫାଇଲ ଧାରଣ କରିଥିବା '%s' ଚାବିକାଠି ର ମୂଲ୍ଯ ନିରୂପଣ କରିହେବ ନାହିଁ" + +#~ msgid "This option will be removed soon." +#~ msgstr "ଏହି ବିକଳ୍ପକୁ ଅତିଶିଘ୍ର ବାହାର କରିଦିଆଯିବ।" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "ଫାଇଲ '%s'କୁ ଆରମ୍ଭ କରିବାରେ ତ୍ରୁଟି: %s" + +#~ msgid "Error connecting: " +#~ msgstr "ସଂଯୋଗ କରିବାରେ ତ୍ରୁଟି: " + +#~ msgid "Error connecting: %s" +#~ msgstr "ସଂଯୋଗ କରିବାରେ ତ୍ରୁଟି: %s" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unixରୁ ପଢିବାରେ ତ୍ରୁଟି: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix ବନ୍ଦକରିବାରେ ତ୍ରୁଟି: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unixରେ ଲେଖିବାରେ ତ୍ରୁଟି: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ଡିରେକ୍ଟୋରୀ ଉପରେ ଡିରେକ୍ଟୋରୀକୁ ଘୁଞ୍ଚାଇପାରିବେ ନାହିଁ" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "ପ୍ରକାର %s ଶ୍ରେଣୀଭୁକ୍ତ ନୁହଁ" + +#, 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 "ଲମ୍ବା ତାଲିକାଭୁକ୍ତ ଶୈଳୀ ବ୍ୟବହାର କରନ୍ତୁ" diff --git a/po/pa.po b/po/pa.po new file mode 100644 index 0000000..1006116 --- /dev/null +++ b/po/pa.po @@ -0,0 +1,4524 @@ +# translation of glib.HEAD.po to Punjabi +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# +# +# Amanpreet Singh Alam , 2004. +# ASB , 2004, 2005, 2006, 2007. +# Amanpreet Singh Alam , 2008. +# A S Alam , 2009, 2010, 2011, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-13 22:53+0000\n" +"PO-Revision-Date: 2012-09-14 07:28+0530\n" +"Last-Translator: A S Alam \n" +"Language-Team: Punjabi/Panjabi \n" +"Language: pa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ਨੂੰ ਬਹੁਤ ਵੱਧ ਗਿਣਤੀ ਪਾਸ ਕੀਤੀ ਗਈ" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "ਬੇਸ ਸਟਰੀਮ ਉੱਤੇ ਸੀਕ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream ਨੂੰ ਛੋਟਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "ਸਟਰੀਮ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "ਬੇਸ ਸਟਰੀਮ ਉੱਤੇ ਟਰਾਂਸਕੇਟ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "ਓਪਰੇਸ਼ਨ ਰੱਦ ਕੀਤਾ ਗਿਆ" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "ਗਲਤ ਆਬਜੈਕਟ, ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ਇੰਪੁੱਟ ਵਿੱਚ ਅਧੂਰਾ ਮਲਟੀਬਾਈਟ ਕ੍ਰਮ" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "ਟਿਕਾਣੇ ਉੱਤੇ ਲੋੜੀਦੀ ਥਾਂ ਨਹੀਂ" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "ਬਦਲਣ ਲਈ ਦਿੱਤੀ ਸਤਰ ਵਿੱਚ ਬਾਇਟ ਦਾ ਸਰੂਪ ਠੀਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "ਤਬਦੀਲੀ ਦੌਰਾਨ ਗਲਤੀ %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "ਰੱਦਕਰਨਯੋਗ ਸ਼ੁਰੂ ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ਕਰੈਕਟਰ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਬਦਲਣ ਇਸ ਵੇਲੇ ਸੰਭਵ ਨਹੀਂ" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' ਤੋੱ '%s' ਵਿੱਚ ਬਦਲਣ ਵਾਲਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s ਟਾਈਪ" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "ਅਣਜਾਣ ਟਾਈਪ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ਫਾਇਲ-ਟਾਈਪ" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "ਇਸ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਲਈ GCredentials ਬਣਾਇਆ ਨਹੀਂ ਗਿਆ" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "ਤੁਹਾਡੇ ਪਲੇਟਫਾਰਮ ਲਈ GCredentials ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ਅਚਾਨਕ ਛੇਤੀ ਐਂਡ-ਆਫ਼-ਸਟੀਰਮ" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "ਐਡਰੈੱਸ ਐਂਟਰੀ '%2$s' ਵਿੱਚ ਗ਼ੈਰ-ਸਹਾਇਕ ਕੁੰਜੀ '%1$s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "ਐਡਰੈੱਸ `%s' ਗਲਤ ਹੈ (ਠੀਕ ਪਾਥ, tmpdir ਜਾਂ abstract ਕੁੰਜੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "ਐਡਰੈੱਸ ਐਂਟਰੀ `%s' ਵਿੱਚ ਬਿਨ-ਕਾਰਨ ਕੁੰਜੀ ਜੋੜਾ" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "`%s' ਐਡਰੈੱਸ 'ਚ ਗਲਤੀ - ਪੋਰਟ ਗੁਣ ਖ਼ਰਾਬ ਹੈ" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "ਐਡਰੈੱਸ `%s' ਵਿੱਚ ਗਲਤੀ - ਫੈਮਲੀ ਗੁਣ ਖ਼ਰਾਬ ਹੈ" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "ਐਡਰੈੱਸ ਐਲੀਮੈਂਟ `%s' ਕਾਲਨ (:) ਨਹੀਂ ਰੱਖਦਾ ਹੈ" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"ਐਡਰੈੱਸ ਐਲੀਮੈਂਟ `%3$s' ਵਿੱਚ ਕੁੰਜੀ/ਮੁੱਲ ਜੋੜਾ %1$d, `%2$s' ਬਰਾਬਰ ਸਾਈਨ ਨਹੀਂ ਰੱਖਦਾ " +"ਹੈ" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"ਐਡਰੈੱਸ ਤੱਕ `%3$s' ਵਿੱਚ ਗਲਤ ਕੁੰਜੀ ਜਾਂ ਕੁੰਜੀ/ਮੁੱਲ ਪੇਅਰ %1$d, '%2$s' 'ਚ ਗਲਤੀ ਹੈ" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"`%s' ਐਡਰੈੱਸ 'ਚ ਗਲਤੀ - ਯੂਨੈਕਸ ਟਰਾਂਸਪੋਰਟ ਲਈ ਠੀਕ ਇੱਕ `path' ਜਾਂ `abstract' ਕੁੰਜੀ " +"ਸੈੱਟ ਹੋਣੀ " +"ਚਾਹੀਦੀ ਹੈ।" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "`%s' ਐਡਰੈੱਸ 'ਚ ਗਲਤੀ - ਹੋਸਟ ਗੁਣ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਗਲਤ ਹੈ" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "`%s' ਐਡਰੈੱਸ 'ਚ ਗਲਤੀ - ਪੋਰਟ ਗੁਣ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਗਲਤ ਹੈ" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "`%s' ਐਡਰੈੱਸ 'ਚ ਗਲਤੀ - noncefile ਗੁਣ ਮੌਜੂਦ ਨਹੀਂ ਜਾਂ ਗਲਤ ਹੈ" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "ਆਟੋ-ਚਲਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "ਐਡਰੈੱਸ `%2$s' ਲਈ ਅਣਜਾਣ ਜਾਂ ਗ਼ੈਰ-ਸਹਾਇਕ `%1$s' ਟਰਾਂਸਪੋਰਟ" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "nonce ਫਾਇਲ '%s' ਖੋਲ੍ਹਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' nonce ਫਾਇਲ ਤੋਂ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' nonce ਫਾਇਲ ਤੋਂ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ, ਲੋੜ ਸੀ ੧੬ ਬਾਈਟ ਦੀ, ਮਿਲੇ %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "nonce ਫਾਇਲ `%s' ਦੀ ਸਮੱਗਰੀ ਸਟਰੀਮ ਉੱਤੇ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "ਦਿੱਤਾ ਐਡਰੈੱਸ ਖਾਲੀ ਹੈ" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "ਬਿਨਾਂ setuid ਦੇ ਸੁਨੇਹਾ ਬਸ ਸਪੈਵ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ:" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "ਬਿਨਾਂ ਮਸ਼ੀਨ-id ਦੇ ਸੁਨੇਹਾ ਬਸ ਸਪੈਵਨ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "`%s' ਕਮਾਂਡ ਲਾਈਨ ਸਵੈਪ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(ਇਹ ਵਿੰਡੋ ਬੰਦ ਕਰਨ ਲਈ ਕੋਈ ਅੱਖਰ ਲਿਖੋ)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "ਸ਼ੈਸ਼ਨ ਡੀਬਸ ਚੱਲ ਨਹੀਂ ਰਹੀ ਹੈ, ਅਤੇ ਆਪੇ-ਸ਼ੁਰੂ ਫੇਲ੍ਹ ਹੈ" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "ਸ਼ੈਸ਼ਨ ਬਸ ਐਡਰੈੱਸ ਜਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ (ਇਸ OS ਵਲੋਂ ਬਣਾਇਆ ਨਹੀਂ ਹੈ)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"ਬਸ ਐਡਰੈੱਸ ਜਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ DBUS_STARTER_BUS_TYPE ਇੰਵਾਇਰਨਮੈਂਟ ਵੇਰੀਬਲ " +"- " +"ਅਣਜਾਣ ਮੁੱਲ `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"ਬਸ ਐਡਰੈੱਸ ਜਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ DBUS_STARTER_BUS_TYPE ਇੰਵਾਇਰਨਮੈਂਟ ਵੇਰੀਬਲ " +"ਸੈੱਟ ਨਹੀਂ " +"ਹੈ" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "ਅਣਜਾਣ ਬਸ ਟਾਈਪ %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "ਲਾਈਨ ਦੀ ਸਮੱਗਰੀ ਪੜ੍ਹਨ ਦੌਰਾਨ ਅਚਾਨਕ ਸਮੱਗਰੀ ਦੀ ਕਿਸਮ ਆਈ" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "ਲਾਈਨ ਪੜ੍ਹਨ ਦੀ ਕੋਸ਼ਿਸ਼ (ਸੁਰੱਖਿਅਤ) ਅਚਾਨਕ ਸਮੱਗਰੀ ਦੀ ਕਿਸਮ ਆਈ" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "ਸਭ ਉਪਲੱਬਧ ਪਰਮਾਣਿਤ ਢੰਗ ਖਤਮ (ਵਰਤੇ: %s) (ਉਪਲੱਬਧ: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer ਰਾਹੀਂ ਰੱਦ ਕੀਤਾ" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "ਡਾਇਰੈਕਟਰੀ `%s' ਲਈ ਜਾਨਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"ਡਾਇਰੈਕਟਰੀ `%s' ਦੇ ਅਧਿਕਾਰ ਖ਼ਰਾਬ ਹੋ ਚੁੱਕੇ ਹਨ। ਲੋੜੀਦਾ ਮੋਡ 0700 ਸੀ, ਪਰ ਹੈ 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "`%s' ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "`%s' ਕੀਰਿੰਗ ਨੂੰ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "`%2$s' ਉੱਤੇ ਕੀਰਿੰਗ ਦੀ %1$d ਲਾਈਨ ਦੀ ਸਮੱਗਰੀ `%3$s' ਨਿਕਾਰਾ ਹੈ" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s' ਉੱਤੇ ਕੀਰਿੰਗ ਦੀ %1$d ਲਾਈਨ ਉੱਤੇ ਪਹਿਲੇ ਟੋਕਨ ਦੀ ਸਮੱਗਰੀ `%3$s' ਨਿਕਾਰਾ ਹੈ" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s' ਉੱਤੇ ਕੀਰਿੰਗ ਦੀ %1$d ਲਾਈਨ ਉੱਤੇ ਦੂਜੇ ਟੋਕਨ ਦੀ ਸਮੱਗਰੀ `%3$s' ਨਿਕਾਰਾ ਹੈ" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "`%2$s' ਉੱਤੇ ਕੀਰਿੰਗ ਵਿੱਚ id %1$d ਨਾਲ ਕੋਈ ਕੂਕੀਜ਼ ਨਹੀਂ ਲੱਭਿਆ" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ਸਟਾਲ ਲਾਕ ਫਾਇਲ `%s' ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "`%s' ਲਾਕ ਫਾਇਲ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "`%s' ਲਾਕ ਫਾਇਲ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ (ਬਿਨ-ਲਿੰਕ): %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "ਲਾਕ ਫਾਇਲ `%s' ਅਣ-ਲਿੰਕ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "`%s' ਕੀਰਿੰਗ ਨੂੰ ਲਿਖਣ ਲਈ ਖੋਲ੍ਹਣ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(ਇਸ ਤੋਂ ਇਲਾਵਾ, `%s' ਲਈ ਲਾਕ ਛੱਡਣ ਲਈ ਫੇਲ੍ਹ ਹੈ: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "ਕੁਨੈਕਸ਼ਨ ਬੰਦ ਕੀਤਾ ਗਿਆ।" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਚੁੱਕਾ ਸੀ" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਫਲੈਗ ਮਿਲੇ, ਜਦੋਂ ਕਿ ਕਲਾਇਟ-ਪੱਖੀ ਕੁਨੈਕਸ਼ਨ ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਸੀ" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"ਪਾਥ %s ਉੱਤੇ ਆਬਜੈਕਟ ਉੱਤੇ `org.freedesktop.DBus.Properties' ਵਰਗਾ ਕੋਈ ਆਬਜੈਕਟ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ `%s' ਸੈੱਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: ਲੋੜੀਦੀ ਕਿਸਮ ਸੀ `%s', ਪਰ ਮਿਲੀ `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "ਕੋਈ `%s' ਵਿਸ਼ੇਸ਼ਤਾ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ `%s' ਪੜ੍ਹਨਯੋਗ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "ਵਿਸ਼ੇਸ਼ਤਾ `%s' ਲਿਖਣਯੋਗ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' ਕੋਈ ਇੰਟਰਫੇਸ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "ਕੋਈ ਇੰਟਰਫੇਸ ਨਹੀਂ" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "ਪਾਥ %2$s ਉੱਤੇ ਆਬਜੈਕਟ ਲਈ `%1$s' ਕੋਈ ਇੰਟਰਫੇਸ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr " `%s' ਢੰਗ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "ਸੁਨੇਹੇ ਦੀ ਕਿਸਮ `%s' ਮੰਗੀ ਗਈ ਕਿਸਮ `%s' ਨਾਲ ਨਹੀਂ ਮਿਲਦੀ" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "ਆਬਜੈਕਟ %s ਆਬਜੈਕਟ ਲਈ %s ਉੱਤੇ ਪਹਿਲਾਂ ਹੀ ਐਕਸਪੋਰਟ ਕੀਤਾ ਗਿਆ ਹੈ" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "ਢੰਗ `%s' ਨੇ `%s' ਕਿਸਮ ਵਾਪਸ ਕੀਤੀ, ਪਰ ਚਾਹੀਦੀ ਸੀ `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "ਇੰਟਰਫੇਸ `%2$s' ਉੱਤੇ ਢੰਗ `%1$s' ਦਸਤਖਤ `%3$s' ਨਾਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "ਸਬ-ਟਰੀ ਪਹਿਲਾਂ ਹੀ %s ਲਈ ਐਕਸਪੋਰ ਕੀਤਾ ਜਾ ਚੁੱਕਿਆ ਹੈ" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "ਕਿਸਮ ਅਢੁੱਕਵੀਂ(INVALID) ਹੈ" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL ਸੁਨੇਹਾ: PATH ਜਾਂ MEMBER ਹੈੱਡਰ ਖੇਤਰ ਗੁੰਮ ਹੈ" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN ਸੁਨੇਹਾ: REPLY_SERIAL ਹੈੱਡਰ ਖੇਤਰ ਗੁੰਮ ਹੈ" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR ਸੁਨੇਹਾ: REPLY_SERIAL ਜਾਂ ERROR_NAME ਹੈੱਡਰ ਖੇਤਰ ਗੁੰਮ ਹੈ" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL ਸੁਨੇਹਾ: PATH, INTERFACE ਜਾਂ MEMBER ਹੈੱਡਰ ਖੇਤਰ ਮੌਜੂਦ ਨਹੀਂ" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL ਸੁਨੇਹਾ: PATH ਹੈੱਡਰ ਖੇਤਰ ਨੂੰ ਉਲਟ /org/freedesktop/DBus/Local ਮੁੱਲ ਨਾਲ " +"ਵਰਤਿਆ " +"ਜਾਂਦਾ ਹੈ।" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL ਸੁਨੇਹਾ: INTERFACE ਹੈੱਡਰ ਖੇਤਰ ਨੂੰ ਉਲਟ org.freedesktop.DBus.Local ਮੁੱਲ " +"ਨਾਲ ਵਰਤਿਆ " +"ਜਾਂਦਾ ਹੈ।" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu ਬਾਈਟ ਪੜ੍ਹਨ ਚਾਹੀਦੇ ਸਨ, ਪਰ EOF ਮਿਲੇ" +msgstr[1] "%lu ਬਾਈਟ ਪੜ੍ਹਨ ਚਾਹੀਦੇ ਸਨ, ਪਰ EOF ਮਿਲੇ" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"ਠੀਕ UTF-8 ਲਾਈਨ ਦੀ ਲੋੜ ਸੀ, ਪਰ ਬਾਈਟ ਆਫਸੈਟ %d ਉੱਤੇ ਗਲਤ ਬਾਈਟ ਮਿਲੇ (ਲਾਈਨ ਦੀ ਲੰਬਾਈ %" +"d)। " +"ਉਸ ਪੁਆਇੰਟ ਤੱਕ ਠੀਕ UTF-8 ਲਾਈਨ `%s' ਸੀ।" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "`%s' ਲਾਈਨ ਦੇ ਬਾਅਦ NUL ਬਾਈਟ ਦੀ ਲੋੜ ਸੀ, ਪਰ %d ਬਾਈਟ ਮਿਲੇ" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "ਪਾਰਸ ਕੀਤਾ ਮੁੱਲ `%s' ਢੁੱਕਵਾਂ ਡੀ-ਬੱਸ ਆਬਜੈਕਟ ਪਾਥ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "ਪਾਰਸ ਕੀਤਾ ਮੁੱਲ `%s' ਢੁੱਕਵਾਂ ਡੀ-ਬੱਸ ਦਸਤਖਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"ਮਿਲੀ ਅਰੇ ਦੀ ਲੰਬਾਈ %u ਬਾਈਟ ਹੈ। ਵੱਧੋ-ਵੱਧ ਲੰਬਾਈ 2<<26 ਬਾਈਟ (64 MiB) ਹੈ।" +msgstr[1] "" +"ਮਿਲੀ ਅਰੇ ਦੀ ਲੰਬਾਈ %u ਬਾਈਟ ਹੈ। ਵੱਧੋ-ਵੱਧ ਲੰਬਾਈ 2<<26 ਬਾਈਟ (64 MiB) ਹੈ।" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "ਵੇਰੀਐਂਟ ਲਈ ਪਾਰਸ ਕੀਤਾ ਮੁੱਲ `%s' ਢੁੱਕਵਾਂ ਡੀ-ਬੱਸ ਦਸਤਖਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"GVariant ਨੂੰ type string `%s' ਨਾਲ ਡੀ-ਬੱਸ ਵਾਇਰ ਫਾਰਮੈਟ 'ਚ ਗ਼ੈਰ-ਲੜੀਬੱਧ ਕਰਨ ਦੌਰਾਨ " +"ਗਲਤੀ" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"ਗਲਤ endianness ਮੁੱਲ। 0x6c ('l') ਜਾਂ 0x42 ('B') ਚਾਹੀਦਾ ਹੈ, ਪਰ ਮਿਲਿਆ ਮੁੱਲ 0x%" +"02x ਹੈ" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "ਗਲਤ ਮੇਜ਼ਰ ਪਰੋਟੋਕਾਲ ਵਰਜਨ ਹੈ। ਲੋੜ ਸੀ 1, ਪਰ ਮਿਲਿਆ %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "ਦਸਤਖਤ `%s' ਨਾਲ ਦਸਤਖਤ ਹੈੱਡਰ ਮਿਲਿਆ, ਪਰ ਸੁਨੇਹਾ ਮੁੱਖ ਭਾਗ ਖਾਲੀ ਹੈ" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "ਪਾਰਸ ਕੀਤਾ ਮੁੱਲ `%s' ਠੀਕ ਡੀ-ਬੱਸ ਦਸਤਖਤ ਨਹੀਂ ਹਨ (ਮੁੱਖ ਭਾਗ ਲਈ)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "ਸੁਨੇਹੇ 'ਚ ਕੋਈ ਦਸਤਖਤ ਹੈੱਡਰ ਨਹੀਂ ਹੈ, ਪਰ ਸੁਨੇਹਾ ਮੁੱਖ ਭਾਗ 'ਚ %u ਬਾਈਟ ਹਨ" +msgstr[1] "ਸੁਨੇਹੇ 'ਚ ਕੋਈ ਦਸਤਖਤ ਹੈੱਡਰ ਨਹੀਂ ਹੈ, ਪਰ ਸੁਨੇਹਾ ਮੁੱਖ ਭਾਗ 'ਚ %u ਬਾਈਟ ਹਨ" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "ਸੁਨੇਹਾ ਡੀਸੀਰੀਅਲਾਈਜ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"GVariant ਨੂੰ type string `%s' ਨਾਲ ਡੀ-ਬੱਸ ਵਾਇਰ ਫਾਰਮੈਟ 'ਚ ਲੜੀਬੱਧ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"ਸੁਨੇਹਾ %d ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਹੈ, ਪਰ ਹੈੱਡਰ ਖੇਤਰ ਦਰਸਾਉਂਦਾ %d ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਦਾ ਹੈ" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "ਸੁਨੇਹਾ ਲੜੀਬੱਧ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "ਸੁਨੇਹਾ ਮੁੱਖ ਭਾਗ 'ਚ ਦਸਤਖਤ `%s' ਹਨ, ਪਰ ਹੈੱਡਰ ਲਈ ਕੋਈ ਦਸਤਖਤ ਨਹੀਂ" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"ਸੁਨੇਹਾ ਮੁੱਖ ਭਾਗ 'ਚ `%s' ਕਿਸਮ ਦੇ ਦਸਤਖਤ ਹਨ, ਪਰ ਹੈੱਡਰ ਖੇਤਰ 'ਚ ਦਸਤਖਤ `%s' ਹਨ" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "ਸੁਨੇਹਾ ਦਾ ਮੁੱਖ ਭਾਗ ਖਾਲੀ ਹੈ, ਪਰ ਹੈੱਡਰ ਖੇਤਰ 'ਚ `(%s)' ਦਸਤਖਤ ਹਨ" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "`%s' ਕਿਸਮ ਦੇ ਮੁੱਖ ਭਾਗ ਨੇ ਗਲਤੀ ਵਾਪਸ ਕੀਤੀ" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "ਗਲਤੀ ਨੇ ਖਾਲੀ ਭਾਗ ਦਿੱਤਾ" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "ਹਾਰਡਵੇਅਰ ਪਰੋਫਾਇਲ ਲੈਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id ਜਾਂ /etc/machine-id ਲੋਡ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s ਲਈ StartServiceByName ਕਾਲ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "StartServiceByName(\"%2$s\") ਢੰਗ ਤੋਂ ਗਲਤ ਜਵਾਬ %1$d" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"ਢੰਗ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ; ਪਰਾਕਸੀ ਜਾਣੇ-ਪਛਾਣੇ ਨਾਂ ਨਾਲ ਬਿਨਾਂ ਓਨਰ ਦੇ ਪਰਾਕਸੀ ਹੈ " +"ਅਤੇ " +"ਪਰਾਕਸੀ ਨੂੰ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ਫਲੈਗ ਨਾਲ ਬਣਾਇਆ ਗਿਆ।" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstract ਨਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "ਜਦੋਂ ਸਰਵਰ ਬਣਾਉਣਾ ਹੋਵੇ ਤਾਂ nonce ਫਾਇਲ ਨਹੀਂ ਦਿੱਤੀ ਜਾ ਸਕਦੀ" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' ਉੱਤੇ nonce ਫਾਇਲ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "ਲਾਈਨ `%s' ਢੁੱਕਵਾਂ ਡੀ-ਬੱਸ GUID ਨਹੀਂ ਹੈ" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਟਰਾਂਸਪੋਰਟ `%s' ਉੱਤੇ ਸੁਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"ਕਮਾਂਡਾਂ:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "ਗਲਤੀ: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "XML ਇੰਟਰੋਸਪੈਕਸ਼ਨ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਗਲਤੀ: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "ਸਿਸਟਮ ਬਸ ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "ਸ਼ੈਸ਼ਨ ਬੱਸ ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "ਦਿੱਤੇ ਡੀ-ਬੱਸ ਐਡਰੈੱਸ ਨਾਲ ਕੁਨੈਕਟ" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "ਕੁਨੈਕਸ਼ਨ ਅੰਤ-ਪੁਆਇੰਟ ਚੋਣਾਂ:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "ਚੋਣਾਂ ਕੁਨੈਕਸ਼ਨ ਅੰਤ-ਪੁਆਇੰਟ ਦਿੰਦੀਆਂ ਹਨ" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "ਕੋਈ ਕੁਨੈਕਸ਼ਨ ਅੰਤ ਪੁਆਇੰਟ ਨਹੀਂ ਦਿੱਤਾ" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "ਕਈ ਕੁਨੈਕਸ਼ਨ ਅੰਤ-ਪੁਆਇੰਟ ਦਿੱਤੇ ਗਏ" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "ਸਾਵਧਾਨ: ਇੰਟਰੋਸਪੈਕਸ਼ਨ ਡਾਟੇ ਦੇ ਮੁਤਾਬਕ, ਇੰਟਰਫੇਸ `%s' ਮੌਜੂਦ ਨਹੀਂ ਹੈ।\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"ਸਾਵਧਾਨ: ਇੰਟਰੋਸਪੈਕਸ਼ਨ ਡਾਟੇ ਦੇ ਮੁਤਾਬਕ, ਢੰਗ `%s' ਇੰਟਰਫੇਸ `%s' ਉੱਤੇ ਮੌਜੂਦ ਨਹੀਂ " +"ਹੈ।\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "ਸਿਗਨਲ ਲਈ ਚੋਣਵਾਂ ਟਿਕਾਣਾ (ਵਿਲੱਖਣ ਨਾਂ)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "ਨਿਕਲੇ ਸਿਗਨਲ ਲਈ ਆਬਜੈਕਟ ਮਾਰਗ" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "ਸਿਗਨਲ ਅਤੇ ਇੰਟਰਫੇਸ ਨਾਂ" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "ਨਿਕਲਿਆਂ ਸਿਗਨਲ।" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "ਗਲਤੀ: ਆਬਜੈਕਟ ਪਾਥ ਨਹੀਂ ਦਿੱਤਾ\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "ਗਲਤੀ: %s ਢੁੱਕਵਾਂ ਆਬਜੈਕਟ ਪਾਥ ਨਹੀਂ ਹੈ\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "ਗਲਤੀ: ਸਿਗਨਲ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ।\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "ਗਲਤੀ: ਸਿਗਨਲ ਪੂਰਾ ਸਹੀਂ ਨਾਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ਗਲਤੀ: %s ਢੁੱਕਵਾਂ ਇੰਟਰਫੇਸ ਨਾਂ ਨਹੀਂ ਹੈ\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ਗਲਤੀ: %s ਢੁੱਕਵਾਂ ਮੈਂਬਰ ਨਾਂ ਨਹੀਂ ਹੈ\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ਗਲਤੀ: %s ਢੁੱਕਵਾਂ ਵਿਲੱਖਣ ਬਸ ਨਾਂ ਨਹੀਂ ਹੈ।\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%d ਪੈਰਾਮੀਟਰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "ਕੁਨੈਕਸ਼ਨ ਖਤਮ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "ਸ਼ਾਮਲ ਢੰਗ ਲਈ ਟਿਕਾਣਾ ਨਾਂ" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "ਇਸ ਉੱਤੇ ਸ਼ਾਮਲ ਢੰਗ ਲਈ ਆਬਜੈਕਟ ਪਾਥ" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "ਢੰਗ ਤੇ ਇੰਟਰਫੇਸ ਨਾਂ" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "ਟਾਈਮ-ਆਉਟ ਸਕਿੰਟਾਂ ਵਿੱਚ" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "ਰਿਮੋਟ ਆਬਜੈਕਟ ਉੱਤੇ ਢੰਗ ਸ਼ਾਮਲ" + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "ਗਲਤੀ: ਟਿਕਾਣਾ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "ਗਲਤੀ: ਆਬਜੈਕਟ ਪਾਥ ਨਹੀਂ ਦਿੱਤਾ\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "ਗਲਤੀ: ਢੰਘ ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ \n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "ਗਲਤੀ: ਢੰਗ ਨਾਂ `%s' ਢੁੱਕਵਾਂ ਨਹੀਂ\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "`%2$s' ਕਿਸਮ ਦੇ %1$d ਪੈਰਾਮੀਟਰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %3$s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "ਇੰਟਰਸਪੈਕਟ ਲਈ ਟਿਕਾਣਾ ਨਾਂ" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "ਇੰਟਰਸਪੈਕਟ ਲਈ ਆਬਜੈਕਟ ਪਾਥ" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "XML ਪਰਿੰਟ ਕਰੋ" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "ਆਪਸ ਵਿੱਚ ਜੁੜੇ ਚਾਈਲਡ" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "ਕੇਵਲ ਪ੍ਰਿੰਟ ਵਿਸ਼ੇਸ਼ਤਾ" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "ਰਿਮੋਟ ਆਬਜੈਕਟ ਇੰਟਰਸਪੈਕਟ ਕਰੋ।" + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "ਨਿਗਰਾਨੀ ਲਈ ਟਿਕਾਣਾ ਨਾਂ" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "ਨਿਗਰਾਨੀ ਲਈ ਆਬਜੈਕਟ ਨਾਂ" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "ਰਿਮੋਟ ਆਬਜੈਕਟ ਦੀ ਨਿਗਰਾਨੀ।" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "ਬਿਨ-ਨਾਂ" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "ਡੈਸਕਟਾਪ ਫਾਇਲ ਨੇ Exec ਫੀਲਡ ਨਹੀਂ ਦਿੱਤਾ ਹੈ" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਟਰਮੀਨਲ ਲੋੜ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ ਹੈ" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ਯੂਜ਼ਰ ਐਪਲੀਕੇਸ਼ਨ ਸੰਰਚਨਾ ਫੋਲਡਰ %s ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ਯੂਜ਼ਰ MIME ਸੰਰਚਨਾ ਫੋਲਡਰ %s ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਜਾਣਕਾਰੀ ਲਈ ਪਛਾਣਕਰਤਾ ਦੀ ਕਮੀ ਹੈ" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ਯੂਜ਼ਰ ਡੈਸਕਟਾਪ ਫਾਇਲ %s ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ਲਈ ਕਸਟਮ ਪਰਿਭਾਸ਼ਾ" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "ਡਰਾਇਵ eject ਜਾਂ eject_with_operation ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ।" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "ਮੀਡਿਆ ਪੋਲਿੰਗ ਲਈ ਡਰਾਇਵ ਹਾਲੇ ਸਥਾਪਤ ਨਹੀਂ" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "ਡਰਾਇਵਹ start ਹਾਲੇ ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ਡਰਾਇਵ stop ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS ਸਹਿਯੋਗ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ਇੰਕੋਡਿੰਗ ਵਿੱਚ ਨਿਕਾਰਾ ਟੋਕਨਾਂ ਦੀ ਗਿਣਤੀ (%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GThemedIcon ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ਇੰਕੋਡਿੰਗ ਵਿੱਚ ਨਿਕਾਰਾ ਟੋਕਨਾਂ ਦੀ ਗਿਣਤੀ (%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ਲਈ GEmblem ਦੀ ਲੋੜ ਸੀ" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "ਰੱਖਣ ਵਾਲਾ ਮਾਊਂਟ ਮੌਜੂਦ ਨਹੀਂ" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦਾ" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦੀ" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਮੌਜੂਦ ਹੈ" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਲਗਾਤਾਰ ਕਾਪੀ ਨਹੀਂ ਹੋ ਸਕਦੀ" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "ਸਪਲਿਸ ਸਕਾਇਕ ਨਹੀਂ" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "ਸਪਲਿਸ ਫਾਇਲ ਗਲਤੀ: %s " + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "ਖਾਸ ਫਾਇਲ ਕਾਪੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "ਗਲਤ ਸਿੰਬੋਲਿੰਕ ਮੁੱਲ ਦਿੱਤਾ" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "ਰੱਦ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ਫਾਇਲ ਨਾਂ ਵਿੱਚ ' %c' ਮੌਜੂਦ ਨਹੀਂ ਹੋ ਸਕਦਾ" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "ਵਾਲੀਅਮ ਲਈ ਮਾਊਂਟ ਸਥਾਪਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "ਇਹ ਫਾਇਲ ਹੈਂਡਲ ਕਰਨ ਲਈ ਕੋਈ ਐਪਲੀਕੇਸ਼ਨ ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ਈਨੂਮੀਟਰੇਟਰ ਬੰਦ ਹੈ" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "ਫਾਇਲ ਈਨੂਮੀਟਰੇਟਰ ਗੰਭੀਰ ਕਾਰਵਾਈ ਕਰ ਚੁੱਕਾ ਹੈ" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "ਸਟਰੀਮ query_info ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "ਸਟਰੀਮ ਉੱਤੇ ਸੀਕ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "ਇੰਪੁੱਟ ਸਟਰੀਮ ਉੱਤੇ ਟਰਾਂਸਕੇਟ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "ਸਟਰੀਮ ਉੱਤੇ ਟਰਾਂਸਕੇਟ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "ਟੋਕਨਾਂ ਦੀ ਗਲਤ ਗਿਣਤੀ (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "ਕਲਾਸ ਨਾਂ %s ਲਈ ਕੋਈ ਟਾਈਪ ਨਹੀਂ" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ਟਾਈਪ %s GIcon ਇੰਟਰਫੇਸ ਲਈ ਸਥਾਪਿਤ ਨਹੀਂ" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "ਟਾਈਪ %s ਕਲਾਸ ਨਹੀਂ ਹੈ" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "ਨਿਕਾਰਾ ਵਰਜਨ ਨੰਬਰ: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ਟਾਈਪ %s GIcon ਇੰਟਰਫੇਸ ਉੱਤੇ from_tokens() ਸਥਾਪਨ ਚਾਹੀਦਾ ਨਹੀਂ" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "ਆਈਕਾਨ ਇੰਕੋਡਿੰਗ ਦਾ ਦਿੱਤਾ ਵਰਜਨ ਨੰਬਰ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "ਕੋਈ ਐਡਰੈਸ ਨਹੀਂ ਦਿੱਤਾ" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "ਲੰਬਾਈ %u ਐਡਰੈਸ ਲਈ ਬਹੁਤ ਲੰਮੀ ਹੈ" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "ਐਡਰੈਸ ਨੇ ਪ੍ਰੀ-ਫਿਕਸ ਲੰਬਾਈ ਤੋਂ ਵੱਧ ਬਿੱਟ ਸੈੱਟ ਕੀਤੇ ਹਨ" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' ਨੂੰ IP ਐਡਰੈਸ ਮਾਸਕ ਵਜੋਂ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "ਸਾਕਟ ਐਡਰੈੱਸ ਲਈ ਲੋੜੀਦੀ ਥਾਂ ਨਹੀਂ" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਸਾਕਟ ਐਡਰੈੱਸ" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "ਸਟਰੀਮ ਪਹਿਲਾਂ ਹੀ ਕਾਰਵਾਈ ਅਧੀਨ ਹੈ" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%s> ਐਲੀਮੈਂਟ <%s> ਵਿੱਚ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "ਐਲੀਮੈਂਟ <%s> ਸਭ ਤੋਂ ਉੱਤੇ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "ਫਾਇਲ %s ਸਰੋਤ ਵਿੱਚ ਕਈ ਵਾਰ ਆਈ ਹੋਈ ਜਾਪਦੀ ਹੈ" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "ਕੋਈ ਸਰੋਤ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ '%s' ਲੱਭਣ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "ਮੌਜੂਦਾ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ '%s' ਲੱਭਣ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "ਅਣਜਾਣ ਕਾਰਵਾਈ ਚੋਣ \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "ਆਰਜ਼ੀ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint ਨਾਲ ਇੰਪੁੱਟ ਫਾਇਲ ਉੱਤੇ ਕਾਰਵਾਈ ਕਰਨ ਲਈ ਗਲਤੀ:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata ਨਾਲ ਇੰਪੁੱਟ ਫਾਇਲ ਉੱਤੇ ਕਾਰਵਾਈ ਕਰਨ ਲਈ ਗਲਤੀ:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s ਫਾਇਲ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "ਫਾਇਲ ਕੰਪਰੈਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "ਟੈਕਸਟ <%s> ਦੇ ਅੰਦਰ ਨਹੀਂ ਹੋ ਸਕਦਾ" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "ਆਉਟਪੁੱਟ ਫਾਇਲ ਦਾ ਨਾਂ" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"ਡਾਇਰੈਕਟਰੀਆਂ, ਜਿੱਥੋਂ ਫਾਇਲਾਂ ਨੂੰ ਪੜ੍ਹਿਆ ਜਾ ਸਕਦਾ ਹੈ (ਡਿਫਾਲਟ ਮੌਜੂਦਾ ਡਾਇਰੈਕਟਰੀ ਹੈ)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "ਡਾਇਰੈਕਟਰੀ" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ-ਨਾਂ ਇਕਸਟੈਸ਼ਨ ਰਾਹੀਂ ਚੁਣੇ ਫਾਰਮੈਟ ਵਿੱਚ ਆਉਟਪੁੱਟ ਤਿਆਰ ਕਰੋ" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "ਸਰੋਤ ਹੈੱਡਰ ਤਿਆਰ ਕਰੋ" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "ਸਰੋਤ ਫਾਇਲ ਵਿੱਚ ਵਰਤੇ ਲਿੰਕ ਤੋਂ ਸਰੋਤ ਕੋਡ ਨੂੰ ਆਪਣੇ ਕੋਡ ਵਿੱਚ ਤਿਆਰ ਕਰੋ" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "ਨਿਰਭਰਤਾ ਸੂਚੀ ਬਣਾਓ" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "ਸਰੋਤ ਆਪਣੇ-ਆਪ ਨਾ ਬਣਾਓ ਅਤੇ ਰਜਿਸਟਰ ਕਰੋ" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "ਤਿਆਰ ਕੀਤੇ ਸਰੋਤ ਕੋਡ ਲਈ C ਅਡੈਂਟਟੀਫਾਇਰ ਨਾਂ" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"ਸਰੋਤ ਫਾਇਲ ਨੂੰ ਇੱਕ ਸਰੋਤ ਹਦਾਇਤ 'ਚ ਕੰਪਾਇਲ ਕਰੋ।\n" +"ਸਰੋਤ ਹਦਾਇਤਾਂ ਲਈ .gresourcexml ਇਕਸਟੈਨਸ਼ਨ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ\n" +"ਅਤੇ ਸਰੋਤ ਫਾਇਲ ਦੀ ਇਕਸਟੈਨਸ਼ਨ ਨੂੰ .gresource ਕਿਹਾ ਜਾਂਦਾ ਹੈ।" + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਫਾਇਲ ਦਾ ਪੂਰਾ ਨਾਂ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "ਖਾਲੀ ਨਾਂ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ਗਲਤ ਨਾਂ '%s': ਨਾਂ ਛੋਟੇ ਅੱਖਰ ਨਾਲ ਹੀ ਸ਼ੁਰੂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"ਗਲਤ ਨਾਂ '%s': ਗਲਤ ਅੱਖਰ '%c'; ਕੇਵਲ ਛੋਟੇ ਅੱਖਰ, ਨੰਬਰ, ਤੇ ਹਾਈਫਨ ('-') ਮਨਜ਼ੂਰ ਨਹੀਂ " +"ਹਨ।" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "ਗਲਤ ਨਾਂ '%s': ਲਗਾਤਾਰ ਦੋ ਹਾਈਫਨ ('--') ਮਨਜ਼ੂਰ ਨਹੀਂ।" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "ਗਲਤ ਨਾਂ '%s': ਆਖਰੀ ਅੱਖਰ ਹਾਈਫਨ ('-') ਨਹੀਂ ਹੋ ਸਕਦਾ।" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ਗਲਤ ਨਾਂ '%s': ਵੱਧੋ-ਵੱਧ ਲੰਬਾਈ ੧੦੨੪" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " ਪਹਿਲਾਂ ਹੀ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr " ਕੁੰਜੀਆਂ 'list-of' ਸਕੀਮਾ 'ਚ ਜੋੜੀਆਂ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " ਪਹਿਲਾਂ ਹੀ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" ਸ਼ੈਡੋ ਵਿੱਚ; ਮੁੱਲ ਸੋਧਣ ਲਈ " +" ਵਰਤੋਂ" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +" ਲਈ ਗੁਣ ਵਜੋਂ ਦੇਣ ਲਈ 'type', 'enum' ਜਾਂ 'flags' ਵਿੱਚੋਂ ਠੀਕ ਇੱਕ ਦੇਣਾ " +"ਲਾਜ਼ਮੀ ਹੈ" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (ਹਾਲੇ) ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ।" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ਗਲਤ GVariant ਕਿਸਮ ਲਾਈਨ '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " ਦਿੱਤਾ, ਪਰ ਸਕੀਮਾ ਕੁਝ ਨਹੀਂ ਵਧਾ ਰਿਹਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ਅਣਡਿੱਠਾ ਕਰਨ ਲਈ ਨਹੀਂ" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " ਪਹਿਲਾਂ ਹੀ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " ਪਹਿਲਾਂ ਹੀ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " ਮੌਜੂਦਾ ਸਕੀਮਾ '%s' ਲਈ ਵਧਾਇਆ ਨਹੀਂ ਗਿਆ" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " ਹਾਲੇ ਨਾ-ਮੌਜੂਦ '%s' ਸਕੀਮਾ ਦੀ ਲਿਸਟ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "ਪਾਥ ਨਾਲ ਸਕੀਮਾ ਦੀ ਲਿਸਟ ਨਹੀਂ ਦਿੱਤੀ ਜਾ ਸਕਦੀ" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "ਪਾਥ ਨਾਲ ਸਕੀਮਾ ਨੂੰ ਵਧਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" ਲਿਸਟ ਹੈ, ਵਧਾਇਆ ਜਾ ਰਿਹਾ ਹੈ, ਜੋ ਕਿ ਲਿਸਟ ਨਹੀਂ " +"ਹੈ" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" ਵਧਾਇਆ, ਪਰ '%s' " +"'%s' ਨੂੰ ਵਧਾਉਂਦਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ਪਾਥ, ਜੇ ਦਿੱਤਾ ਹੋਵੇ ਤਾਂ ਸ਼ੁਰੂ ਤੇ ਖਤਮ ਸਲੈਸ਼ ਨਾਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ਲਿਸਟ ਦਾ ਪਾਥ ':/' ਨਾਲ ਖਤਮ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ਪਹਿਲਾਂ ਹੀ ਦਿੱਤਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "ਐਲੀਮੈਂਟ <%s> ਸਭ ਤੋਂ ਉੱਤੇ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict ਦਿੱਤੀ ਗਈ ਸੀ। ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "ਇਹ ਪੂਰੀ ਫਾਇਲ ਅਣਡਿੱਠੀ ਕੀਤੀ ਗਈ।\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "ਇਹ ਫਾਇਲ ਅਣਡਿੱਠੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ।\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "ਅਣਡਿੱਠਾ ਫਾਇਲ `%3$s' ਵਿੱਚ `%2$s' ਸਕੀਮਾ ਅੰਦਰ ਕੋਈ `%1$s' ਕੁੰਜੀ ਨਹੀਂ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ਇਹ ਕੁੰਜੀ ਅਣਡਿੱਠਾ ਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ਅਤੇ --strict ਦਿੱਤਾ ਗਿਆ ਸੀ, ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"ਅਣਡਿੱਠੀ ਫਾਇਲ `%3$s' ਵਿੱਚ `%2$s' ਸਕੀਮਾ ਅੰਦਰ ਕੋਈ `%1$s' ਕੁੰਜੀ ਨਹੀਂ ਹੈ: %4$s" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "ਇਹ ਕੁੰਜੀ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"ਅਣਡਿੱਠਾ ਫਾਇਲ `%3$s' ਵਿੱਚ `%2$s' ਸਕੀਮਾ ਅੰਦਰ `%1$s' ਕੁੰਜੀ ਲਈ ਅਣਡਿੱਠਾ ਕਰਨਾ ਸਕੀਮ " +"'ਚ " +"ਦਿੱਤੀ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"ਅਣਡਿੱਠਾ ਫਾਇਲ `%3$s' ਵਿੱਚ `%2$s' ਸਕੀਮਾ ਅੰਦਰ `%1$s' ਕੁੰਜੀ ਲਈ ਅਣਡਿੱਠਾ ਕਰਨਾ " +"ਦਿੱਤੀਆਂ " +"ਢੁੱਕਵੀਆਂ ਚੋਣਾਂ ਦੀ ਲਿਸਟ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ਫਾਇਲ ਨੂੰ ਕਿੱਥੇ ਸਟੋਰ ਕਰਨਾ ਹੈ" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "ਸਕੀਮਾ 'ਚ ਕੋਈ ਵੀ ਗਲਤੀ ਉੱਤੇ ਅਧੂਰਾ ਛੱਡੋ" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled ਫਾਇਲ ਨਾ ਲਿਖੋ" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "ਕੁੰਜੀ ਨਾਂ ਪਾਬੰਦੀਆਂ ਲਈ ਮਜ਼ਬੂਰ ਨਾ ਕਰੋ" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"ਜੀਸੈਟਿੰਗ ਸਕੀਮਾ ਫਾਇਲਾਂ ਨੂੰ ਇੱਕ ਸਕੀਮਾ ਕੈਸ਼ 'ਚ ਕੰਪਾਇਲ ਕਰੋ।\n" +"ਸਕੀਮਾ ਫਾਇਲਾਂ ਲਈ .gschema.xml ਇਕਸਟੈਨਸ਼ਨ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ\n" +"ਅਤੇ ਕੈਸ਼ ਫਾਇਲ ਨੂੰ gschemas.compiled ਕਿਹਾ ਜਾਂਦਾ ਹੈ।" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਡਾਇਰੈਕਟਰੀ ਦਾ ਪੂਰਾ ਨਾਂ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "ਕੋਈ ਸਕੀਮਾਂ ਫਾਇਲ ਨਹੀਂ ਲੱਭੀ: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "ਕੁਝ ਨਾ ਕਰੋ।\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "ਮੌਜੂਦਾ ਆਉਟਪੁੱਟ ਫਾਇਲ ਹਟਾਈ ਗਈ।\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "ਡਿਫਾਲਟ ਲੋਕਲ ਡਾਇਰੈਕਟਰੀ ਮਾਨੀਟਰ ਟਾਈਪ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ਗਲਤ ਫਾਇਲ ਨਾਂ %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ਫਾਇਲ ਸਿਸਟਮ ਜਾਣਕਾਰੀ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "ਰੂਟ ਡਾਇਰੈਕਟਰੀ ਦਾ ਨਾਂ ਨਹੀਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "ਫਾਇਲ ਨਾਂ ਬਦਲਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "ਫਾਇਲ ਨਾਂ ਨਹੀਂ ਬਦਲਿਆ ਜਾ ਸਕਦਾ, ਫਾਇਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "ਗਲਤ ਫਾਇਲ ਨਾਂ" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "ਫਾਇਲ ਖੋਲ੍ਹਣ ਦੌਰਾਨ ਗਲਤੀ: %s " + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "ਫਾਇਲ ਰੱਦੀ 'ਚ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ਰੱਦੀ ਡਾਇਰੈਕਟਰੀ %s ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "ਰੱਦੀ ਲਈ ਟਾਪ-ਲੈਵਲ ਡਾਇਰੈਕਟਰੀ ਲੱਭਣ ਲਈ ਅਸਮਰੱਥ" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "ਰੱਦੀ ਡਾਇਰੈਕਟਰੀ ਲੱਭਣ ਜਾਂ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ਰੱਦੀ 'ਚ ਭੇਜੀ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ਫਾਇਲ ਰੱਦੀ 'ਚ ਭੇਜਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "ਡਾਇਰੈਕਟਰੀ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ਫਾਇਲ-ਸਿਸਟਮ ਸਿੰਬੋਲਿਕ ਲਿੰਕ ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "ਸਿਬੋਲਿਕ ਲਿੰਕ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "ਫਾਇਲ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "ਡਾਇਰੈਕਟਰੀ ਨੂੰ ਡਾਇਰੈਕਟਰੀ ਉੱਤੇ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "ਬੈਕਅੱਪ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਫੇਲ੍ਹ" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "ਮਾਊਂਟ ਵਿੱਚ ਭੇਜਣਾ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "ਗੁਣ ਮੁੱਲ ਗ਼ੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "ਗਲਤ ਗੁਣ ਟਾਈਪ (ਲਾਈਨ ਦੀ ਲੋੜ ਸੀ)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "ਗਲਤ ਐਕਸਟੈੱਡ ਗੁਣ ਨਾਂ" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "ਐਕਸਟੈੱਡ ਗੁਣ '%s' ਸੈੱਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr "(ਗਲਤ ਇੰਕੋਡਿੰਗ)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ਫਾਇਲ '%s' ਲਈ ਜਾਣਕਾਰੀ ਲੈਣ ਲਈ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਲਈ ਜਾਣਕਾਰੀ ਲੈਣ ਦੇ ਦੌਰਾਨ ਗਲਤੀ: %s " + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (uint32 ਲੋੜੀਦਾ ਸੀ)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (uint64 ਲੋੜੀਦਾ ਸੀ)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "ਗਲਤ ਐਟਰੀਬਿਊਟ ਟਾਈਪ (ਬਾਈਟ ਲਾਈਨ ਲੋੜੀਦੀ ਸੀ)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "ਸਿਮਲਿੰਕਲਈ ਅਧਿਕਾਰ ਨਹੀਂ ਸੈੱਟ ਕੀਤੇ ਜਾ ਸਕਦੇ" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ਅਧਿਕਾਰ ਸੈੱਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "ਓਪਨ ਸੈਟਿੰਗ ਗਲਤੀ: %s " + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "ਸਿਮਲਿੰਕ ਗ਼ੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink ਸੈਟਿੰਗ ਗਲਤੀ: %s " + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink ਸੈਟਿੰਗ ਗਲਤੀ: ਫਾਇਲ ਇੱਕ symlink ਨਹੀਂ ਹੈ" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "ਸੋਧਣ ਜਾਂ ਵਰਤਣ ਸਮਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux ਪਰਸੰਗ ਗੈਰ-ਨਲ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux ਪਰਸੰਗ ਸੈਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "ਇਸ ਸਿਸਟਮ ਉੱਤੇ SELinux ਚਾਲੂ ਨਹੀਂ ਹੈ" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ਗੁਣ %s ਸੈਟਿੰਗ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "ਫਾਇਲ ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ਫਾਇਲ 'ਚ ਵੇਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "ਫਾਇਲ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "ਡਿਫਾਲਟ ਲੋਕਲ ਫਾਇਲ ਮਾਨੀਟਰ ਟਾਈਪ ਖੋਜਣ ਲਈ ਅਸਮਰੱਥ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "ਫਾਇਲ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "ਪੁਰਾਣਾ ਬੈਕਅੱਪ ਲਿੰਕ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "ਬੈਕਅੱਪ ਕਾਪੀ ਬਣਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ਆਰਜ਼ੀ ਫਾਇਲ ਨਾਂ ਬਦਲਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "ਫਾਇਲ ਸੰਖੇਪ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਖੋਲ੍ਹਣ 'ਚ ਗਲਤੀ: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਡਾਇਰੈਕਟਰੀ ਹੈ" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "ਟਾਰਗੇਟ ਫਾਇਲ ਇੱਕ ਰੈਗੂਲਰ ਫਾਇਲ ਨਹੀਂ ਹੈ" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ਫਾਇਲ ਬਾਹਰੋਂ ਸੋਧੀ ਗਈ ਸੀ" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "ਪੁਰਾਣੀ ਫਾਇਲ ਹਟਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "ਗਲਤ GSeekType ਦਿੱਤੀ ਗਈ" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "ਸੀਕ ਮੰਗ ਗਲਤ ਹੈ" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ਛੋਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "ਮੈਮੋਰੀ ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਮੁੜ-ਅਕਾਰ ਯੋਗ ਨਹੀਂ" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "ਮੈਮੋਰੀ ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਮੁੜ-ਸਾਈਜ਼ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "ਲਿਖਣ ਲਈ ਲੋੜੀਦੀ ਮੈਮੋਰੀ ਦੀ ਮਾਤਰਾ ਉਪਲੱਬਧ ਐਡਰੈੱਸ ਥਾਂ ਤੋਂ ਵੱਧ ਹੈ" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "ਕੀਤੀ ਗਈ ਮੰਗ ਸਟਰੀਮ ਦੇ ਸ਼ੁਰੂ ਤੋਂ ਪਹਿਲਾਂ ਹੈ" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ਸੈਕਰੋਨਿਸ ਪਰਸੰਗ ਟਾਈਪ ਗੈਸਿੰਗ ਲਈ ਮਾਊਂਟ ਸਥਾਪਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ਹੋਸਟ-ਨਾਂ '%s' '[' ਰੱਖਦਾ ਹੈ, ਪਰ ']' ਨਹੀਂ" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "ਨੈੱਟਵਰਕ ਪਹੁੰਚ 'ਚ ਨਹੀਂ" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "ਹੋਸਟ ਪਹੁੰਚ 'ਚ ਨਹੀਂ" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "ਨੈੱਟਵਰਕ ਮਾਨੀਟਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "ਨੈੱਟਵਰਕ ਮਾਨੀਟਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "ਨੈੱਟਵਰਕ ਹਾਲਤ ਲਈ ਨਹੀਂ ਜਾ ਸਕੀ: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "ਆਉਟਪੁੱਟ ਸਟਰੀਮ ਲਿਕਣ ਲਈ ਬਣਾਈ ਨਹੀਂ ਗਈ" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "ਸਰੋਤ ਸਟਰੀਮ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ਲੱਭਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ਉਲਟ-ਲੱਭਣ ਲਈ ਗਲਤੀ: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' ਲਈ ਮੰਗੀ ਕਿਸਮ ਦਾ ਕੋਈ ਵੀ DNS ਰਿਕਾਰਡ ਨਹੀਂ" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "'%s' ਲੱਭਣ ਲਈ ਆਰਜ਼ੀ ਰੂਪ ਵਿੱਚ ਅਸਮਰੱਥ" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ਲੱਭਣ ਦੌਰਾਨ ਗਲਤੀ" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "'%s' ਲਈ ਅਧੂਰਾ ਡਾਟਾ ਮਿਲਿਆ" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' ਉੱਤੇ ਸਰੋਤ ਮੌਜੂਦ ਨਹੀਂ ਹੈ" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' ਉੱਤੇ ਸਰੋਤ ਡੀਕੰਪਰੈਸ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s' ਉੱਤੇ ਸਰੋਤ ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਹੈ" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "ਇੰਪੁੱਟ ਸਟਰੀਮ ਲਈ seek ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "ਮੱਦਦ ਪਰਿੰਟ ਕਰੋ" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "elf FILE ਵਿੱਚ ਮੌਜੂਦ ਸ਼ੈਕਸ਼ਨ ਰੱਖਣ ਵਾਲੇ ਸਰੋਤਾਂ ਦੀ ਸੂਚੀ" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"ਸਰੋਤਾਂ ਦੀ ਸੂਚੀ\n" +"ਜੇ SECTION ਦਿੱਤਾ ਤਾਂ ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਸਰੋਤ ਵੇਖਾਏ ਜਾਣਗੇ\n" +"ਜੇ PATH ਦਿੱਤਾ ਤਾਂ ਕੇਵਲ ਮਿਲਦੀ ਸਰੋਤ ਹੀ ਵੇਖਾਏ ਜਾਂਦੇ ਹਨ" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"ਵੇਰਵੇ ਸਮੇਤ ਸਰੋਤਾਂ ਦੀ ਸੂਚੀ\n" +"ਜੇ SECTION ਦਿੱਤਾ ਤਾਂ ਇਹ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਸਰੋਤ ਵੇਖਾਏ ਜਾਣਗੇ\n" +"ਜੇ PATH ਦਿੱਤਾ ਤਾਂ ਕੇਵਲ ਮਿਲਦੀ ਸਰੋਤ ਹੀ ਵੇਖਾਏ ਜਾਂਦੇ ਹਨ\n" +"ਵੇਰਵੇ ਵਿੱਚ ਸ਼ੈਕਸ਼ਨ, ਆਕਾਰ ਅਤੇ ਕੰਪਰੈਸ਼ਨ ਹੁੰਦੀ ਹੈ" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "ਸਰੋਤ ਫਾਇਲ ਨੂੰ stdout ਉੱਤੇ ਖੋਲ੍ਹੋ" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"ਅਣਜਾਣ ਕਮਾਂਡ %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ਵਰਤੋਂ:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"ਵੇਰਵੇ ਸਮੇਤ ਜਾਣਕਾਰੀ ਲਈ 'gresource help COMMAND' ਵਰਤੋਂ।\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ਵਰਤੋਂ:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "ਆਰਗੂਮੈਂਟ:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION ਇੱਕ (ਚੋਣਵਾਂ) elf ਭਾਗ ਨਾਂ\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND (ਚੋਣਵਾਂ) ਕਮਾਂਡ ਬਾਰੇ ਜਾਣਕਾਰੀ\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE elf ਫਾਇਲ (ਬਾਈਨਰੀ ਜਾਂ ਸਾਂਝੀ ਲਾਇਬਰੇਰੀ)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE elf ਫਾਇਲ (ਬਾਈਨਰੀ ਜਾਂ ਸਾਂਝੀ ਲਾਇਬਰੇਰੀ)\n" +" ਜਾਂ ਇੱਕ ਕੰਪਾਇਲ ਕੀਤੀ ਸਰੋਤ ਫਾਇਲ\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH ਇੱਕ (ਚੋਣਵਾਂ) ਸਰੋਤ ਪਾਥ (ਅਧੂਰਾ ਵੀ ਹੋ ਸਕਦਾ ਹੈ)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH ਇੱਕ ਸਰੋਤ ਪਾਥ\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "ਇੰਝ ਦਾ ਕੋਈ ਵੀ '%s' ਸਕੀਮਾ ਨਹੀਂ\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "ਸਕੀਮਾ '%s' ਮੁੜ-ਬਦਲਣਯੋਗ ਨਹੀਂ ਹੈ (ਪਾਥ ਨਹੀਂ ਦਿੱਤਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "ਸਕੀਮਾ '%s' ਮੁੜ-ਬਦਲਣਯੋਗ ਹੈ (ਪਾਥ ਦਿੱਤਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "ਖਾਲੀ ਪਾਥ ਦਿੱਤਾ।\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "ਪਾਥ ਸਲੈਸ਼ (/) ਨਾਲ ਸ਼ੁਰੂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "ਪਾਥ ਸਲੈਸ਼ (/) ਨਾਲ ਖਤਮ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "ਪਾਥ ਵਿੱਚ ਦੋ ਲਗਾਤਾਰ ਸਲੈਸ਼ (//) ਨਹੀਂ ਹੋ ਸਕਦੀਆਂ\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "ਇੰਝ ਦੀ '%s' ਕੁੰਜੀ ਨਹੀਂ\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "ਦਿੱਤਾ ਮੁੱਲ ਢੁੱਕਵੀਂ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "ਇੰਸਟਾਲ ਹੋਏ (ਗ਼ੈਰ-ਬਦਲਣਯੋਗ) ਸਕੀਮਾ ਦੀ ਲਿਸਟ" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "ਇੰਸਟਾਲ ਹੋਏ ਬਦਲਣਯੋਗ ਸਕੀਮਾ ਦੀ ਲਿਸਟ" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA ਵਿੱਚ ਕੁੰਜੀਆਂ ਦੀ ਲਿਸਟ" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "SCHEMA ਵਿੱਚ ਚਿਲਡਰਨ ਦੀ ਲਿਸਟ" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"ਕੁੰਜੀਆਂ ਤੇ ਮੁੱਲ ਲਗਾਤਾਰ ਲਿਸਟ ਕਰੋ\n" +"ਜੇ ਕੋਈ SCHEMA ਨਹੀਂ ਦਿੱਤਾ ਤਾਂ, ਸਭ ਕੁੰਜੀਆਂ ਦਿਉ\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "KEY ਦਾ ਮੁੱਲ ਲਵੋ" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "KEY ਲਈ ਢੁੱਕਵੇਂ ਮੁੱਲ ਲਈ ਰੇਜ਼ ਕਿਊਰੀਆਂ" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "KEY ਲਈ ਮੁੱਲ (VALUE) ਸੈੱਟ ਕਰੋ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "KEY ਨੂੰ ਡਿਫਾਲਟ ਮੁੱਲ ਲਈ ਮੁੜ-ਸੈੱਟ ਕਰੋ" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA ਵਿੱਚ ਸਭ ਸਵਿੱਚਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਡਿਫਾਲਟ ਲਈ ਮੁੜ-ਸੈੱਟ ਕਰੋ" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "ਚੈੱਕ ਕਰੋ ਕਿ KEY ਲਿਖਣਯੋਗ ਹੈ" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"KEY ਲਈ ਬਦਲਾਅ ਉੱਤੇ ਨਿਗ੍ਹਾ ਰੱਖੋ।\n" +"ਜੇ ਕੋਈ KEY ਨਾ ਦਿੱਤੀ ਹੋਵੇ ਤਾਂ SCHEMA ਵਿੱਚ ਸਭ ਕੁੰਜੀਆਂ ਤੇ ਨਿਗ੍ਹਾ ਰੱਖੋ।\n" +"ਨਿਗਰਾਨੀ ਬੰਦ ਕਰਨ ਲਈ ^C ਵਰਤੋਂ।\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"ਵਰਤੋਂ:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help ਇਹ ਜਾਣਕਾਰੀ ਵੇਖਾਓ\n" +" list-schemas ਇੰਸਟਾਲ ਹੋਏ ਸਕੀਮਾਂ ਦੀ ਸੂਚੀ\n" +" list-relocatable-schemas ਮੁੜ-ਰੱਖਣਯੋਗ ਸਕੀਮਾਂ ਦੀ ਸੂਚੀ\n" +" list-keys ਸਕੀਮਾਂ ਵਿੱਚ ਕੁੰਜੀਆਂ ਦੀ ਸੂਚੀ\n" +" list-children ਸਕੀਮ ਦੇ ਅਧੀਨ ਦੀ ਸੂਚੀ\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor ਬਦਲਾਅ ਲਈ ਧਿਆਨ ਰੱਖੋ\n" +"\n" +"ਵੇਰਵੇ ਸਮੇਤ ਮੱਦਦ ਲਈ 'gsettings help COMMAND' ਵਰਤੋਂ।\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"ਵਰਤੋਂ:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR ਇੱਕ ਡਾਇਰੈਕਟਰੀ, ਜੋ ਕਿ ਹੋਰ ਸਕੀਮਾ ਲੱਭਣ ਲਈ ਹੈ\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA ਸਕੀਮਾ ਦਾ ਨਾਂ\n" +" PATH ਮੁੜ-ਲੱਭਣਯੋਗ ਸਕੀਮਾ ਲਈ ਪਾਥ\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY ਸਕੀਮਾ ਵਿੱਚ (ਚੋਣਵੀਂ) ਕੁੰਜੀ\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY ਸਕੀਮਾ ਵਿੱਚ ਕੁੰਜੀ\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE ਸੈੱਟ ਕਰਨ ਲਈ ਮੁੱਲ\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "ਖਾਲੀ ਸਕੀਮਾ ਨਾਂ ਦਿੱਤਾ\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "ਗਲਤ ਸਾਕਟ, ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ਗਲਤ ਸਾਕਟ, %s: ਕਰਕੇ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "ਸਾਕਟ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "ਸਾਕਟ I/O ਟਾਈਮ-ਆਉਟ" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd ਤੋਂ ਜੀਸਾਕਟ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ਸਾਕਟ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "ਅਣਜਾਣ ਵਰਗ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "ਅਣਜਾਣ ਪਰੋਟੋਕਾਲ ਦਿੱਤਾ ਗਿਆ" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "ਲੋਕਲ ਐਡਰੈੱਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "ਰਿਮੋਟ ਐਡਰੈੱਸ ਨਹੀਂ ਲਿਆ ਜਾ ਸਕਿਆ: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "ਸੁਣਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "ਐਡਰੈੱਸ ਸਬੰਧਿਤ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "ਮਲਟੀਕਾਸਟ ਗਰੁੱਪ ਜੁਆਇੰਨ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "ਮਲਟੀਕਾਸਟ ਗਰੁੱਪ ਛੱਡਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "ਸਰੋਤ-ਖਾਸ ਮਲਟੀਕਾਸਟ ਲਈ ਕੋਈ ਸਹਿਯੋਗ ਨਹੀਂ" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "ਕੁਨੈਕਸ਼ਨ ਮਨਜ਼ੂਰ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "ਕੁਨੈਕਸ਼ਨ ਜਾਰੀ ਹੈ" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ਬਾਕੀ ਗਲਤੀ ਲੈਣ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "ਡਾਟਾ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "ਡਾਟਾ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ਸਾਕਟ ਬੰਦ ਕਰਨ ਲਈ ਅਸਮਰੱਥ: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "ਸਾਕਟ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ਸਾਕਟ ਸ਼ਰਤ ਲਈ ਉਡੀਕ ਜਾਰੀ: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "ਸੁਨੇਹਾ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "ਵਿੰਡੋਜ਼ ਉੱਤੇ GSocketControlMessage ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "ਸੁਨੇਹਾ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "ਇਸ ਓਪਰੇਟਿੰਗ ਸਿਸਟਮ ਲਈ g_socket_get_credentials ਬਣਾਇਆ ਨਹੀਂ" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "%s ਪਰਾਕਸੀ ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s ਨਾਲ ਕੁਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "ਕੁਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "ਕੁਨੈਕਟ ਉੱਤੇ ਅਣਜਾਣ ਗਲਤੀ" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "ਗ਼ੈਰ-TCP ਕੁਨੈਕਸ਼ਨ ਉੱਤੇ ਪਰਾਕਸੀ ਵਰਤਣਾ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "ਪਰਾਕਸੀ ਪਰੋਟੋਕਾਲ '%s' ਸਹਾਇਕ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "ਲਿਸਨਰ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ਸਾਕਟ ਪਹਿਲਾਂ ਹੀ ਬੰਦ ਹੈ" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 IPv6 ਐਡਰੈੱਸ '%s' ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 ਪਰੋਟੋਕਾਲ ਲਈ ਬਹੁਤ ਲੰਮਾ ਯੂਜ਼ਰ ਨਾਂ ਹੈ" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 ਪਰੋਟੋਕਾਲ ਲਈ '%s' ਹੋਸਟ-ਨਾਂ ਬਹੁਤ ਲੰਮਾ ਹੈ" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "ਸਰਵਰ ਇੱਕ SOCKSv4 ਪਰਾਕਸੀ ਸਰਵਰ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv5 ਸਰਵਰ ਰਾਹੀਂ ਕੁਨੈਕਸ਼ਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ ਹੈ" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "ਸਰਵਰ SOCKSv5 ਪਰਾਕਸੀ ਸਰਵਰ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ਪਰਾਕਸੀ ਲਈ ਪਰਮਾਣਿਕਤਾ ਦੀ ਲੋੜ ਹੈ।" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 ਲਈ ਅਜਿਹੇ ਪਰਮਾਣਿਕਤਾ ਢੰਗ ਦੀ ਲੋੜ ਹੈ, ਜੋ ਕਿ GLib ਵਲੋਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 ਪਰੋਟੋਕਾਲ ਲਈ ਬਹੁਤ ਲੰਮਾ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ ਪਾਸਵਰਡ ਹੈ।" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 ਪਰਮਾਣਕਿਤਾ ਗਲਤ ਯੂਜ਼ਰ-ਨਾਂ ਜਾਂ ਪਾਸਵਰਡ ਕਰਕੇ ਫੇਲ੍ਹ ਹੋ ਗਈ ਹੈ" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 ਪਰੋਟੋਕਾਲ ਲਈ '%s' ਹੋਸਟ-ਨਾਂ ਬਹੁਤ ਲੰਮਾ ਹੈ।" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ਪਰਾਕਸੀ ਸਰਵਰ ਅਣਜਾਣ ਐਡਰੈੱਸ ਕਿਸਮ ਵਰਤਦਾ ਹੈ।" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "ਅੰਦਰੂਨੀ SOCKSv5 ਪਰਾਕਸੀ ਸਰਵਰ ਗਲਤੀ।" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 ਕੁਨੈਕਸ਼ਨ ruleset ਨਾਲ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 ਸਰਵਰ ਰਾਹੀਂ ਹੋਸਟ ਪਹੁੰਚ-ਯੋਗ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 ਪਰਾਕਸੀ ਰਾਹੀਂ ਨੈੱਟਵਰਕ ਪਹੁੰਚ 'ਚ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 ਪਰਾਕਸੀ ਨੇ ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ ਹੈ।" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ਪਰਾਕਸੀ 'connect' ਕਮਾਂਡ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 ਪਰਾਕਸੀ ਦਿੱਤੀ ਐਡਰੈੱਸ ਕਿਸਮ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "ਅਣਜਾਣ SOCKSv5 ਪਰਾਕਸੀ ਗਲਤੀ ਹੈ।" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ਇੰਕੋਡਿੰਗ ਦਾ %d ਵਰਜਨ ਹੈਂਡਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-ਇੰਕੋਡ ਕੀਤੀ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਪਾਰਸ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦਾ" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "ਕੋਈ PEM-ਇੰਕੋਡ ਕੀਤੀ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਨਹੀਂ ਲੱਭੀ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-ਇੰਕੋਡ ਕੀਤੀ ਪ੍ਰਾਈਵੇਟ ਕੁੰਜੀ ਪਾਰਸ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "ਕੋਈ PEM-ਇੰਕੋਡ ਕੀਤਾ ਸਰਟੀਫਿਕੇਟ ਨਹੀਂ ਲੱਭਿਆ ਹੈ" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-ਇੰਕੋਡ ਕੀਤਾ ਸਰਟੀਫਿਕੇਟ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"ਇਹ ਠੀਕ ਪਾਸਵਰਡ ਦੇਣ ਦਾ ਆਖਰੀ ਮੌਕਾ ਹੈ, ਇਸ ਤੋਂ ਪਹਿਲਾਂ ਕੀ ਤੁਹਾਡੀ ਅਸੈਸ ਲਾਕ ਹੋ ਜਾਵੇ।" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"ਦਿੱਤਾ ਗਿਆ ਪਾਸਵਰਡ ਬਹੁਤ ਵਾਰ ਗਲਤ ਹੋ ਚੁੱਕਾ ਹੈ, ਅਤੇ ਹੋਰ ਵਾਰ ਫੇਲ੍ਹ ਹੋਣ ਦੀ ਹਾਲਤ " +"ਤੁਹਾਡੀ ਵਰਤਣ ਦੀ " +"ਸਮੱਰਥਾ (ਅਸੈਸ) ਨੂੰ ਲਾਕ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "ਦਿੱਤਾ ਗਿਆ ਪਾਸਵਰਡ ਗਲਤ ਹੈ।" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 ਕੰਟਰੋਸ ਸੁਨੇਹੇ ਦੀ ਲੋੜ ਸੀ, %d ਮਿਲੇ" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "ਅਚੀਲਿਰੇ ਡਾਟਾ ਦੀ ਅਣਜਾਣ ਕਿਸਮ" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ਇੱਕ fd ਦੀ ਲੋੜ ਸੀ, ਪਰ %d ਮਿਲੀਆਂ।\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "ਗਲਤ fd ਮਿਲੀ" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "ਸਨਦ ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "%s: ਸਾਕਟ ਲਈ SO_PASSCRED ਚਾਲੂ ਹੈ ਜਾਂ ਨਹੀਂ ਚੈੱਕ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"ਸਾਕਟ ਲਈ SO_PASSCRED ਚਾਲੂ ਹੈ, ਚੈੱਕ ਕਰਨ ਦੌਰਾਨ ਗਲਤ ਚੋਣ ਲੰਬਾਈ। ਚਾਹੀਦੇ %d ਬਾਈਟ, " +"ਮਿਲੇ %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED ਚਾਲੂ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"ਮਿਲੀ ਸਨਦ (credentials) ਲਈ ਇੱਕਲਾ ਬਾਈਟ ਪੜ੍ਹਨ ਦੀ ਲੋੜ ਸੀ, ਪਰ ਮਿਲੇ ਸਿਫ਼ਰ ਬਾਈਟ" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "ਕੋਈ ਲੋੜੀਦਾ ਕੰਟਰੋਲ ਸੁਨੇਹਾ ਨਹੀਂ, ਪਰ %d ਮਿਲੇ" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED ਬੰਦ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਤੋਂ ਪੜ੍ਹਨ ਥਈ ਗਲਤੀ: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ਫਾਇਲ ਸਿਸਟਮ ਰੂਟ" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ਫਾਇਲ ਡਿਸਕ੍ਰਿਪਟਰ ਲਿਖਣ ਲਈ ਗਲਤੀ: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "ਯੂਨੈਕਸ ਡੋਮੇਨ ਸਾਕਟ ਐਡਰੈੱਸ ਇਹ ਸਿਸਟਮ ਵਲੋਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "ਵਾਲੀਅਮ ਲਈ eject ਜਾਂ eject_with_operation ਸਥਾਪਿਤ ਨਹੀਂ ਹੈ।" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਨਹੀਂ ਲੱਭੀ ਜਾ ਸਕਦੀ" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਲਾਂਚ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "ਸਬੰਧ ਬਦਲਣਾ win32 ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "ਸਬੰਧ ਬਣਾਉਣਾ win32 ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "ਹੈਂਡਲ ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "ਹੈਂਡਲ ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "ਹੈਂਡਲ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "ਲੋੜੀਦੀ ਮੈਮੋਰੀ ਨਹੀਂ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "ਹੋਰ ਇੰਪੁੱਟ ਦੀ ਲੋੜ" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "ਗਲਤ ਕੰਪਰੈੱਸ ਕੀਤਾ ਡਾਟਾ" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "ਸੁਣਨ ਲਈ ਐਡਰੈਸ" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "ਅਣਡਿੱਠਾ, GTestDbus ਨਾਲ ਕੰਪੈਕਟ" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "ਐਡਰੈੱਸ ਪਰਿੰਟ ਕਰੋ" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "ਸ਼ੈੱਲ ਮੋਡ ਵਿੱਚ ਐਡਰੈਸ ਪਰਿੰਟ ਕਰੋ" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "ਡੀਬਸ ਸਰਵਿਸ ਚਲਾਓ" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "ਗਲਤ ਆਰਗੂਮੈਂਟ\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "ਐਲੀਮੈਂਟ '%2$s' ਲਈ ਗਲਤ ਗੁਣ '%1$s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ਐਲੀਮੈਂਟ '%2$s' ਲਈ '%1$s' ਗੁਣ ਨਹੀਂ ਲੱਭਿਆ" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ਗਲਤ ਟੈਗ '%s', ਟੈਗ '%s' ਲੋੜੀਦਾ ਸੀ" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' ਵਿੱਚ '%1$s' ਟੈਗ" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "ਡਾਟਾ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਕੋਈ ਢੁੱਕਵੀਂ ਬੁੱਕਮਾਰਕ ਫਾਇਲ ਨਹੀਂ ਲੱਭੀ" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' ਲਈ ਇੱਕ ਬੁੱਕਮਾਰਕ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' ਲਈ ਕੋਈ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਲੱਭਾ" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਵਿੱਚ ਕੋਈ MIME ਕਿਸਮ ਪਰਿਭਾਸ਼ਿਤ ਨਹੀਂ ਹੈ" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਕੋਈ ਪ੍ਰਾਈਵੇਟ ਫਲੈਗ ਨਹੀਂ ਦੱਸਿਆ ਗਿਆ" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' ਲਈ ਬੁੱਕਮਾਰਕ ਵਿੱਚ ਕੋਈ ਗਰੁੱਪ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਗਿਆ" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ਕਿਸੇ ਕਾਰਜ ਨੇ '%2$s' ਲਈ '%1$s' ਨਾਂ ਨਾਲ ਕੋਈ ਬੁੱਕਮਾਰਕ ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec ਲਾਈਨ '%s' ਨੂੰ URI '%s' ਨਾਲ ਫੈਲਾਉਣ ਲਈ ਫੇਲ੍ਹ ਹੋਇਆ" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "ਸਤਰ ਦੇ ਅਖੀਰ ਤੇ ਅੱਖਰਾਂ ਦਾ ਸਰੂਪ ਅਧੂਰਾ ਹੈ" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ਕੋਡ ਸਮੂਹ %s ਤੋਂ %s ਵਿੱਚ ਤਬਦੀਲੀ ਸੰਭਵ ਨਹੀਂ" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"file\" ਸਕੀਮ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਸਲ URI ਨਹੀਂ ਹੈ" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "ਲੋਕਲ ਫਾਇਲ URI %s ਵਿੱਚ ਇਹ ਨਿਸ਼ਾਨ # ਨਹੀਂ ਹੈ" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI '%s' ਦੇ ਹੋਸਟ ਦਾ ਨਾਂ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' ਕੋਲ ਗਲਤ ਅੱਖਰ ਹਨ" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ਮਾਰਗ-ਨਾਂ %s ਇਕ ਅਸਲੀ (absolute) ਮਾਰਗ ਨਹੀਂ ਹੈ" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "ਗਲਤ ਹੋਸਟ-ਨਾਂ" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ਸਵੇਰ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ਸ਼ਾਮ" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %b %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ਜਨਵਰੀ" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ਫਰਵਰੀ" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "ਮਾਰਚ" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ਅਪਰੈਲ" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "ਮਈ" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "ਜੂਨ" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ਜੁਲਾਈ" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ਅਗਸਤ" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "ਸਤੰਬਰ" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ਅਕਤੂਬਰ" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "ਨਵੰਬਰ" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "ਦਸੰਬਰ" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ਜਨ" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ਫਰ" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "ਮਾਰ" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ਅਪ" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "ਮਈ" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ਜੂਨ" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ਜੁਲ" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ਅਗ" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "ਸਤੰ" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ਅਕ" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ਨਵੰ" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "ਦਸੰ" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ਸੋਮਵਾਰ" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "ਮੰਗਲਵਾਰ" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "ਬੁੱਧਵਾਰ" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ਵੀਰਵਾਰ" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "ਸ਼ੁੱਕਰਵਾਰ" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "ਸ਼ਨਿੱਚਰਵਾਰ" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ਐਤਵਾਰ" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ਸੋਮ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ਮੰਗ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ਬੁੱਧ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "ਵੀਰ" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ਸ਼ੁੱਕ" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ਸ਼ਨਿੱ" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ਐਤ" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਖੋਲ੍ਹਣ ਲਈ ਗਲਤੀ: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ਫਾਇਲ \"%2$s\" ਖੋਲ੍ਹਣ ਲਈ %1$lu ਬਾਈਟ ਨਹੀਂ ਦਿੱਤੇ ਜਾ ਸਕੇ" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਪੜ੍ਹਨ 'ਚ ਗਲਤੀ: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ਫਾਇਲ \"%s\" ਬਹੁਤ ਵੱਡੀ ਹੈ" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ਫਾਇਲ '%s' ਤੋਂ ਪੜ੍ਹਨ 'ਚ ਅਸਫ਼ਲ: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ਫਾਇਲ ਖੋਲ੍ਹ 'ਚ ਗਲਤੀ %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ਫਾਇਲ '%s' ਦੀਆਂ ਵਿਸ਼ੇਸਤਾ ਖੋਲ੍ਹਣ 'ਚ ਫੇਲ੍ਹ: fstat() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ਫਾਇਲ '%s' ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ਫਾਇਲ '%s' ਦਾ ਨਾਂ '%s' ਬਦਲਣ 'ਚ ਅਸਫ਼ਲ: g_rename() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ਫਾਇਲ %s' ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਖੋਲ੍ਹਣ ਵਾਸਤੇ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fwrite() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fflush() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਲਿਖਣ ਲਈ ਫੇਲ੍ਹ: fsync() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ਫਾਇਲ '%s' ਨੂੰ ਬੰਦ ਕਰਨ 'ਚ ਫੇਲ੍ਹ: fclose() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ਮੌਜੂਦਾ ਫਾਇਲ '%s' ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: g_unlink() ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "ਟੈਪਲੇਟ '%s' ਸਹੀਂ ਨਹੀਂ ਹੈ, ਇਸ ਕੋਲ '%s' ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "ਟੈਂਪਲੇਟ '%s' XXXXXX ਨਹੀਂ ਰੱਖਦਾ ਹੈ" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ਸਿੰਬੋਲਿਕ ਲਿੰਕ '%s' ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "ਸਿੰਬੋਲਿਕ ਲਿੰਕ ਮੱਦਦ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹਨ" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' ਤੋਂ '%s' ਬਦਲਣ ਵਾਲਾ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string ਵਿੱਚ ਰਾਅ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "ਕੁਝ ਅਣ-ਬਦਲਿਆ ਡਾਟਾ ਬਫਰ ਵਿੱਚ ਪਿਆ ਹੈ" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "ਇਕ ਅੱਧ ਪਚਦੇ ਅੱਖਰ ਉੱਤੇ ਚੈਨਲ ਬੰਦ ਹੋ ਗਿਆ" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end ਵਿੱਚ ਰਾਅ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "ਖੋਜ ਡਾਇਰੈਕਟਰੀਆਂ ਵਿੱਚ ਠੀਕ ਕੁੰਜੀ ਫਾਇਲ ਨਹੀਂ ਖੋਜੀ ਜਾ ਸਕੀ" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "ਇੱਕ ਰੈਗੂਲਰ ਫਾਇਲ ਨਹੀਂ" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ਕੁੰਜੀ ਫਾਇਲ ਲਾਈਨ '%s' ਰੱਖਦੀ ਹੈ, ਜੋ ਕਿ ਕੁੰਜੀ-ਮੁੱਲ ਜੋੜਾ, ਗਰੁੱਪ ਜਾਂ ਟਿੱਪਣੀ ਨਹੀਂ ਹੈ" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "ਗਲਤ ਗਰੁੱਪ ਨਾਂ: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਗਰੁੱਪ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "ਗਲਤ ਕੁੰਜੀ ਨਾਂ: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਨਾ-ਸਹਾਇਕ ਇੰਕੋਡਿੰਗ '%s' ਰੱਖਦੀ ਹੈ" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਦਾ ਗਰੁੱਪ '%s' ਨਹੀਂ ਹੈ" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਨਹੀਂ ਹੈ" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਕੁੰਜੀ '%s' ਦਾ ਮੁੱਲ '%s' ਹੈ, ਜੋ ਕਿ UTF-8 ਨਹੀਂ ਹੈ" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਮੁੱਲ ਹੈ, ਜਿਸ ਉੱਤੇ ਕਾਰਵਾਈ ਨਹੀਂ ਹੋ ਸਕਦੀ " +"ਹੈ" + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਗਰੁੱਪ '%2$s' ਵਿੱਚ ਕੁੰਜੀ '%1$s' ਹੈ, ਜਿਸ ਲਈ ਅਜਿਹਾ ਮੁੱਲ ਹੈ, ਜਿਸ " +"ਨੂੰ ਵਰਤਿਆ ਨਹੀਂ " +"ਜਾ ਸਕਦਾ।" + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"ਗਰੁੱਪ '%2$s' ਵਿੱਚ ਕੁੰਜੀ '%1$s' ਦਾ ਮੁੱਲ '%3$s' ਹੈ, ਜਦੋਂ ਕਿ ਲੋੜ %4$s ਦੀ ਸੀ" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਕੁੰਜੀ '%s' ਗਰੁੱਪ '%s' ਵਿੱਚ ਨਹੀਂ ਹੈ" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਲਾਈਨ ਦੇ ਅੰਤ ਵਿੱਚ ਇਸਕੇਪ ਅੱਖਰ ਹੈ" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ ਗਲਤ ਇਸਕੇਪ ਕ੍ਰਮ '%s' ਹੈ" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।" + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ਪੂਰਨ ਅੰਕ '%s' ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਇੱਕ ਦਸ਼ਮਲਵ ਅੰਕ ਦੇ ਤੌਰ 'ਤੇ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ।" + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ਮੁੱਲ '%s' ਨੂੰ ਬੂਲੀਅਨ ਵਾਂਗ ਇੰਟਰਪਰੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।" + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "ਫਾਇਲ '%s%s%s%s': fstat() ਦੇ ਗੁਣ ਲੈਣ ਲਈ ਫੇਲ੍ਹ: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "ਮੈਪ %s%s%s%s: mmap() ਲਈ ਫੇਲ੍ਹ ਹੈ: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ਫਾਇਲ '%s': ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: fdopen() ਫੇਲ੍ਹ: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "ਲਾਈਨ %d ਅੱਖਰ %d ਉੱਤੇ ਗਲਤੀ:" + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ਨਾਂ ਵਿੱਚ ਗਲਤ UTF-8 ਇੰਕੋਡ ਟੈਕਸਟ - ਵੈਧ '%s' ਨਹੀਂ" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ਢੁੱਕਵਾਂ ਨਾਂ ਨਹੀਂ" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ਢੁੱਕਵਾਂ ਨਾਂ ਨਹੀਂ ਹੈ: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "ਲਾਈਨ %d ਉੱਤੇ ਗਲਤੀ: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ਅੱਖਰ ਰੈਫਰੈਂਸ '%-.*s' ਇਕ ਚੁਣੇ ਅੱਖਰ ਨੂੰ ਇਨਕੋਡ ਨਹੀਂ ਕਰ ਸਕਦਾ" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "ਖਾਲੀ ਐਂਟਟੀ '&;' ਵੇਖੋ; ਵੈਧ ਐਂਟਟੀਆਂ ਹਨ : & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ਐਂਟਟੀ ਨਾਂ '%-.*s' ਪਤਾ ਨਹੀਂ ਹੈ" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "ਦਸਤਾਵੇਜ਼ ਇਕ ਐਲੀਮੈਂਟ (ਜਿਵੇਂ ਕਿ ) ਨਾਲ ਸ਼ੁਰੂ ਹੋਣਾ ਜਰੂਰੀ ਹੈ" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"ਇਹ '%s' ਜਾਇਜ ਅੱਖਰ ਨਹੀਂ ਹੈ ਜੋ ਕਿ '<' ਅੱਖਰ ਤੋਂ ਮਗਰ ਹੈ, ਇਹ ਕਿਸੇ ਐਲੀਮਿੰਟ ਦੇ ਨਾਂ " +"ਨਾਲ ਆਰੰਭ ਨਹੀਂ " +"ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ਅਨਿਸ਼ਚਿਤ ਅੱਖਰ '%s', ਇਹ '>' ਅੱਖਰ ਦੀ ਉਮੀਦ ਖਾਲੀ-ਐਲੀਮਿੰਟ ਟੈਗ '%s' ਬੰਦ ਕਰਨ ਲਈ ਸੀ" + +#: ../glib/gmarkup.c:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"ਇਹ '%s' ਅੱਖਰ '%s' ਐਲੀਮਿੰਟ ਨਾਂ ਮਗਰੋਂ ਜਾਇਜ ਨਹੀਂ ਹੈ ; ਸਿਰਫ '>' ਅੱਖਰ ਹੀ ਮਨਜ਼ੂਰ ਹੈ" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ਇਹ ਐਲੀਮਿੰਟ '%s' ਬੰਦ ਸੀ, ਕੋਈ ਐਲੀਮਿੰਟ ਖੁੱਲ੍ਹਾ ਨਹੀਂ ਹੈ" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ਇਹ ਐਲੀਮਿੰਟ '%s' ਬੰਦ ਸੀ, ਪਰ ਅਜੇ '%s' ਐਲੀਮਿੰਟ ਖੁੱਲਾ ਹੈ" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "ਦਸਤਾਵੇਜ਼ ਖਾਲੀ ਹੈ ਜਾਂ ਕੇਵਲ ਖਾਲੀ ਥਾਂ ਹੀ ਰੱਖਦਾ ਹੈ" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਖੁੱਲੀ ਬਰੈਕਟ '<' ਪਾਉਣ ਮਗਰੋਂ" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਜਦੋਂ ਕਿ-ਇਹ '%s' ਆਖਰੀ ਐਲੀਮਿੰਟ ਖੁੱਲਾ ਹੈ" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਇਕ ਬੰਦ ਬਰੈਕਟ <%s/> ਜੋ ਕਿ ਪੱਟੀ ਨੂੰ ਬੰਦ ਕਰਦੀ ਹੈ, " +"ਦੀ ਉਮੀਦ ਸੀ" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "ਇਕ ਐਲੀਮਿੰਟ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "ਇਕ ਐਲੀਮਿੰਟ-ਖੋਲ੍ਹਣ ਟੈਗ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"ਇਕ ਗੁਣ ਦੇ ਨਾਂ ਤੋਂ ਪਹਿਲਾਂ ਬਰਾਬਰ ਦੇ ਨਿਸ਼ਾਨ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ, ਗੁਣ " +"ਦਾ ਕੋਈ ਮੁੱਲ " +"ਨਹੀਂ ਹੈ" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "ਇਕ ਗੁਣ ਦੇ ਮੁੱਲ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "ਇਕ ਐਲੀਮਿੰਟ '%s' ਦੇ ਟੈਗ ਕਰਕੇ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ਇਕ ਟਿੱਪਣੀ ਜਾਂ ਹਦਾਇਤ ਚਲਾਉਣ ਦੌਰਾਨ ਦਸਤਾਵੇਜ਼ ਅਚਾਨਕ ਬੰਦ ਹੋ ਗਿਆ ਹੈ" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ਵਰਤੋਂ:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ਚੋਣ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "ਮੱਦਦ ਚੋਣ:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "ਮੱਦਦ ਚੋਣ ਵੇਖੋ" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "ਸਭ ਮੱਦਦ ਚੋਣਾਂ ਵੇਖੋ" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "ਐਪਲੀਕੇਸ਼ਨ ਚੋਣ:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ਪੂਰਨ ਅੰਕ ਮੁੱਲ %s' ਨੂੰ %s ਲਈ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "ਪੂਰਨ ਅੰਕ '%s' %s ਲਈ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਜਾ ਰਿਹਾ ਹੈ" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s ਲਈ ਡਬਲ ਮੁੱਲ '%1$s' ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s ਲਈ '%1$s' ਡਬਲ ਮੁੱਲ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ ਹੈ" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "ਚੋਣ %s ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s ਲਈ ਆਰਗੂਮੈਂਟ ਗੁੰਮ ਹੈ" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "ਅਣਜਾਣ ਚੋਣ %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ਨਿਕਾਰਾ ਆਬਜੈਕਟ" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "ਅੰਦਰੂਨੀ ਗਲਤੀ ਜਾਂ ਨਿਕਾਰਾ ਆਬਜੈਕਟ" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ਮੈਮੋਰੀ ਖਤਮ ਹੋਈ" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "ਬੈਕ-ਟਰੈਕਿੰਗ ਲਿਸਟ ਆ ਗਈ" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "ਪੈਟਰਨ ਵਿੱਚ ਆਈਟਮਾਂ ਹਨ, ਜੋ ਕਿ ਅਧੂਰੀ ਮੈਂਚਿੰਗ ਲਈ ਸਹਾਇਕ ਨਹੀਂ।" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "ਬੈਕ ਰੈਡਰੈਂਸ ਕੰਡੀਸ਼ਨ ਵਾਂਗ ਅਧੂਰੀ ਮੈਂਚਿੰਗ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹਨ" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "ਰੀਕਰਸਵ ਲਿਮਟ ਆਈ" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ਗਲਤ ਨਵੀਂ ਲਾਈਨ ਫਲੈਗ ਦਾ ਸੰਯੋਗ" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "ਖ਼ਰਾਬ ਆਫਸੈੱਟ" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "ਛੋਟਾ utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "ਲਗਾਤਾਰ ਲੂਪ" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "ਅਣਜਾਣ ਗਲਤੀ" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ਪੈਟਰਨ ਦੇ ਅੰਤ ਉੱਤੇ" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\ਪੈਟਰਨ ਦੇ ਅੰਤ ਉੱਤੇ c" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "ਬੇਪਛਾਣ ਕਰੈਕਟਰ ਅੱਗੇ \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "ਨੰਬਰ {} ਗਿਣਤੀ ਤੋਂ ਬਾਹਰ ਹਨ" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "ਨੰਬਰ {} ਵਿੱਚ ਆਉਣ ਤੋਂ ਬਹੁਤ ਵੱਡਾ" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਲਈ ਟਰਮੀਨੇਸ਼ਨ ] ਗੁੰਮ ਹੈ" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਵਿੱਚ ਅਸਕੇਪ ਲੜੀ ਗਲਤ ਹੈ" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "ਕਰੈਕਟਰ ਕਲਾਸ ਵਿੱਚ ਰੇਜ਼ ਬਿਨ-ਕ੍ਰਮ" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "ਰਪੀਟ ਕਰਨ ਲਈ ਕੁਝ ਨਹੀਂ" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "ਅਣਜਾਣ ਰਪੀਟ" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? ਜਾਂ (?- ਦੇ ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX ਨਾਂ ਦੀ ਕਲਾਸ ਕੇਵਲ ਇੱਕ ਹੀ ਕਲਾਸ ਸਹਿਯੋਗੀ ਹੈ" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ਟਰਮੀਨੇਸ਼ਨ ) ਗੁੰਮ ਹੈ" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "ਗ਼ੈਰ ਮੌਜੂਦ ਸਬ-ਪੈਟਰਨ ਲਈ ਰੈਫਰੈਂਸ" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ਟਿੱਪਣੀ ਦੇ ਬਾਅਦ ) ਗੁੰਮ ਹੈ" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "ਰੈਗੂਲਰ ਸਮੀਕਰਨ ਬਹੁਤ ਲੰਮਾ ਹੈ " + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ਮੈਮੋਰੀ ਲੈਣ ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ਬਿਨਾਂ ( ਖੋਲ੍ਹਣ ਦੇ ਹੈ" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "ਕੋਡ ਓਵਰਫਲੋ" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind ਸਥਿਰ ਲੰਬਾਈ ਵਿੱਚ ਨਹੀਂ" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( ਦੇ ਬਾਅਦ ਨਿਕਾਰਾ ਨੰਬਰ ਜਾਂ ਨਾਂ" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "ਕੰਡੀਸ਼ਨ ਗਰੁੱਪ ਵਿੱਚ ਦੋ ਤੋਂ ਵੱਧ ਬਰਾਂਚਾਂ ਹਨ" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ਜਾਂ (?[+-]ਡਿਜ਼ਟ ਦੇ ਬਾਅਦ ) ਹੋਣਾ ਚਾਹੀਦੀ ਹੈ" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "ਅਣਜਾਣ POSIX ਕਲਾਸ ਨਾਂ" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ਲੋਕੇਲ ਐਲੀਮੈਂਟ ਸਹਾਇਕ ਨਹੀਂ ਹੈ" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} ਵਿੱਚ ਅੱਖਰ ਮੁੱਖ, ਲੜੀ ਬਹੁਤ ਲੰਮੀ ਹੈ" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ਗਲਤ ਕੰਡੀਸ਼ਨ (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C lookbehind assertion ਲਈ ਸਹਾਇਕ ਨਹੀਂ" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "ਇਸਕੇਪ \\L, \\l, \\N{name}, \\U, ਅਤੇ \\u ਸਹਾਇਕ ਨਹੀਂ" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "ਲਗਾਤਾਰ ਕਾਲ ਨਾਲ ਬੇਅੰਤ ਲੂਪ ਚਾਲੂ ਹੋ ਸਕਦਾ ਸੀ" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P ਬਾਅਦ ਬੇਪਛਾਣ ਕਰੈਕਟਰ" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "ਸਬ-ਪੈਟਰਨ ਨਾਂ ਵਿੱਚ ਟਰਮੀਨੇਟਰ ਗੁੰਮ ਹੈ" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "ਦੋ ਨਾਮੀ ਸਬ-ਪੈਟਰਨ ਲਈ ਇੱਕੋ ਨਾਂ ਹੈ" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "ਨਿਕਾਰਾ \\P ਜਾਂ \\p ਕ੍ਰਮ" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ਜਾਂ \\p ਦੇ ਬਾਅਦ ਅਣਜਾਣ ਵਿਸ਼ੇਸ਼ਤਾ ਨਾਂ" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ਸਬ-ਪੈਟਰਨ ਬਹੁਤ ਲੰਮਾ ਹੈ (ਵੱਧੋ-ਵੱਧ ੩੨ ਅੱਖਰ)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ਬਹੁਤ ਵੱਧ ਸਬ-ਪੈਟਰਨ (ਵੱਧੋ-ਵੱਧ ੧੦,੦੦੦)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "ਓਕਟਲ ਮੁੱਲ \\à©©à©­à©­ ਤੋਂ ਵੱਧ" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "ਓਵਰ-ਰਨ ਕੰਪਾਇਲਿੰਗ ਵਰਕਸਪੇਸ" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "ਪਹਿਲਾਂ-ਚੈੱਕ ਕੀਤਾ ਰੈਂਫਰਡ ਸਬ-ਪੈਟਰਨ ਨਹੀਂ ਲੱਭਿਆ" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE ਗਰੁੱਪ ਵਿੱਚ ਇੱਕ ਤੋਂ ਵੱਧ ਬਰਾਂਚਾਂ ਹਨ" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "ਗਲਤ NEWLINE ਚੋਣਾਂ" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g ਨੂੰ ਕਿਸੇ ਵੀ ਬਰੈਕਟ ਨਾਂ ਜਾਂ ਚੋਣਵੀਂ ਬਰੈਕਟ, ਕੋਟ ਕੀਤੇ ਨਾਂ ਜਾਂ ਨੰਬਰ, ਜਾਂ ਪਲੇਨ " +"ਨੰਬਰ ਬਾਅਦ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "ਅੰਕ ਰੈਫ਼ਰੈਂਸ ਜ਼ੀਰੋ ਹੋਣਾ ਨਹੀਂ ਚਾਹੀਦਾ ਹੈ" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "(*ACCEPT), (*FAIL), ਜਾਂ (*COMMIT) ਦੇ ਬਾਅਦ ਆਰਗੂਮੈਂਟ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ਦੀ ਪਛਾਣ ਨਹੀਂ" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "ਨੰਬਰ ਬਹੁਤ ਵੱਡਾ ਹੈ" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& ਦੇ ਬਾਅਦ ਸਬ-ਪੈਟਰਨ ਨਾਂ ਵਿੱਚ ਟਰਮੀਨੇਟਰ ਗੁੰਮ ਹੈ" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ ਦੇ ਬਾਅਦ ਅੰਕ ਲੋੜੀਦਾ ਸੀ" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "ਜਾਵਾਸਕ੍ਰਿਪਟ ਮੋਡ ਵਿੱਚ ] ਗਲਤ ਡਾਟਾ ਅੱਖਰ ਹੈ" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ਇਕੋ ਅੰਕ ਦੇ ਦੋ ਨਾਮੀ ਸਬ-ਪੈਟਰਨ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹਨ" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) ਲਈ ਇੱਕ ਆਰਗੂਮੈਂਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c ਨੂੰ ਇੱਕ ASCII ਅੱਖਰ ਦੇ ਬਾਅਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k ਨੂੰ ਕਿਸੇ ਵੀ ਬਰੈਕਟ ਨਾਂ ਜਾਂ ਕੋਣੀ ਬਰੈਕਟ ਜਾਂ ਕੋਟ ਕੀਤੇ ਨਾਂ ਦੇ ਬਾਅਦ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N ਕਲਾਸ ਵਿੱਚ ਸਹਿਯੋਗੀ ਨਹੀਂ" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "ਬਹੁਤ ਸਾਰੇ ਅੱਗੇ ਰੈਫਰੈਂਸ" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), ਜਾਂ (*THEN) ਵਿੱਚ ਨਾਂ ਬਹੁਤ ਵੱਡਾ ਹੈ" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u... ਵਿੱਚ ਅੱਖਰ ਮੁੱਖ, ਲੜੀ ਬਹੁਤ ਲੰਮੀ ਹੈ" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "ਰੈਗੂਲਰ ਐਕਸਪਰੈਸ਼ਨ %s ਮਿਲਾਉਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE ਲਾਇਬਰੇਰੀ ਨੂੰ UTF8 ਮੱਦਦ ਬਗੈਰ ਕੰਪਾਇਲ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE ਲਾਇਬਰੇਰੀ ਨੂੰ UTF8 ਵਿਸ਼ੇਸ਼ਤਾ ਮੱਦਦ ਬਗੈਰ ਕੰਪਾਇਲ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE ਲਾਇਬਰੇਰੀ ਨੂੰ ਗੈਰ-ਅਨੁਕੂਲ ਚੋਣਾਂ ਨਾਲ ਕੰਪਾਇਲ ਕੀਤਾ ਗਿਆ ਹੈ।" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ਅੱਖਰ %2$d ਉੱਤੇ ਰੈਗੂਲਰ ਸਮੀਕਰਨ %1$s ਨਾਲ ਕੰਪਾਇਲ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %3$s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "%s ਰੈਗੂਲਰ ਐਕਸਪਰੈਸ਼ਨ ਅਨੁਕੂਲ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "ਹੈਕਸਾਡੈਸੀਮਕ ਅੰਕ ਜਾਂ '}' ਦੀ ਮੰਗ ਸੀ" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "ਹੈਕਾਡੈਸੀਮਲ ਅੰਕ ਲੋੜੀਦਾ ਸੀ" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ ਵਿੱਚ '<' ਨਹੀਂ ਹੈ" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "ਅਧੂਰਾ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "ਜ਼ੀਰੋ-ਲੰਬਾਈ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "ਅੰਕ ਲੋੜੀਦਾ ਸੀ" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "ਗਲਤ ਸਿੰਬੋਲਿਕ ਰੈਡਰੈਂਸ" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "ਸਟਰੇ ਫਾਈਨਲ '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "ਅਣਜਾਣ ਇਸਕੇਪ ਕਰਮ" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ਬਦਲਣ ਟੈਕਸਟ \"%s\" ਨੂੰ ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਅੱਖਰ %lu ਉੱਤੇ ਗਲਤੀ: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ਹਵਾਲਾ ਟੈਕਸਟ ਇਕ ਹਵਾਲਾ ਮਾਰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "ਕਮਾਂਡ ਲਾਈਨ ਜਾਂ ਸੈੱਲ ਟੈਕਸਟ ਵਿੱਚ ਬੇਮੇਲ ਹਵਾਲਾ ਮਾਰਕ ਹੈ" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ਇੱਕ '\\' ਅੱਖਰ ਮਗਰੋਂ ਟੈਕਸਟ ਖਤਮ ਹੋਣੇ ਹਨ (ਟੈਕਸਟ ਸੀ '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c ਲਈ ਹਵਾਲਾ ਲੱਭਣ ਤੋਂ ਪਹਿਲਾਂ ਟੈਕਸਟ ਖਤਮ ਹੈ। (ਟੈਕਸਟ ਸੀ '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "ਟੈਕਸਟ ਖਾਲੀ ਸੀ (ਜਾਂ ਸਾਫ ਥਾਂ ਹੀ ਹੈ)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲ੍ਹਣ ਲਈ select() ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() (%s) ਵਿੱਚ ਅਚਾਨਕ ਗਲਤੀ" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "ਚਲਾਈਡ ਪਰੋਸੈਸ %ld ਕੋਡ ਨਾਲ ਬੰਦ ਹੋਇਆ" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "ਚਲਾਈਡ ਪਰੋਸੈਸ %ld ਸਿਗਨਲ ਰਾਹੀਂ ਖਤਮ ਕੀਤਾ" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "ਚਲਾਈਡ ਪਰੋਸੈਸ %ld ਸਿਗਨਲ ਰਾਹੀਂ ਰੋਕਿਆ ਗਿਆ" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "ਚਲਾਈਡ ਪਰੋਸੈਸ ਅਸਧਾਰਨ ਢੰਗ ਨਾਲ ਬੰਦ" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "ਚਾਈਲਡ ਪਾਈਪ (%s) ਤੋਂ ਡਾਟਾ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ ਹੈ" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "ਫੋਰਕ (%s) ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "ਡਾਇਰੈਕਟਰੀ '%s' ਬਦਲਣ ਵਿੱਚ ਫੇਲ੍ਹ (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ \"%s\" (%s) ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਦੀ ਆਉਟਪੁੱਟ ਜਾਂ ਇੰਪੁੱਟ ਦੀ ਦਿਸ਼ਾ ਬਦਲਣ 'ਚ ਫੇਲ੍ਹ" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਫੋਰਕ ਕਰਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ \"%s\" ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਅਣਜਾਣੀ ਗਲਤੀ" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "ਚਾਈਲਡ pid ਪਾਇਪ (%s) ਤੋਂ ਚਾਹੀਦਾ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈਸ (%s) ਨਾਲ ਕਮਿਊਨੀਕੇਸ਼ਨ ਲਈ ਪਾਇਪ ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "ਚਾਈਲਡ ਪਰੋਸੈੱਸ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਲਈ ਫੇਲ੍ਹ" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ਚਾਈਲਡ ਕਾਰਵਾਈ (%s) ਚਾਲੂ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "ਗਲਤ ਪ੍ਰੋਗਰਾਮ ਨਾਂ: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d ਉੱਤੇ ਮੁੱਲ ਵੈਕਟਰ ਵਿੱਚ ਗਲਤ ਲਾਈਨ: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ਇੰਵਾਇਰਨਮਿੰਟ ਵਿੱਚ ਗਲਤ ਲਾਈਨ: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ਗਲਤ ਵਰਕਿੰਗ ਡਾਇਰੈਕਟਰੀ: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ਮੱਦਦ ਪਰੋਗਰਾਮ (%s) ਸ਼ੁਰੂ ਕਰਨ 'ਚ ਫੇਲ੍ਹ" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"ਇੱਕ ਚਾਈਲਡ ਪਰੋਸੈਸ ਤੋਂ ਡਾਟਾ ਪੜ੍ਹਨ ਦੌਰਾਨ g_io_channel_win32_poll() ਵਿੱਚ ਅਚਾਨਕ " +"ਗਲਤੀ" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 ਲਈ ਅੱਖਰ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "ਬਦਲਾਉ ਇੰਪੁੱਟ ਵਿੱਚ ਤਰਤੀਬ ਜਾਇਜ਼ ਨਹੀਂ ਹੈ" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-੧੬ ਲਈ ਅੱਖਰ ਰੇਜ਼ ਤੋਂ ਬਾਹਰ" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u ਬਾਈਟ" +msgstr[1] "%u ਬਾਈਟ" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s ਬਾਈਟ" +msgstr[1] "%s ਬਾਈਟ" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "ਕਮਾਂਡ ਲਾਈਨ `%s' ਨਾਲ ਅਸਧਾਰਨ ਪਰੋਗਰਾਮ ਖਤਮ: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "ਕਮਾਂਡ ਲਾਈਨ `%s' ਗ਼ੈਰ-ਸਿਫ਼ਰ ਬੰਦ ਹਾਲਤ %d ਨਾਲ ਬੰਦ ਹੋ ਗਈ ਹੈ: %s " + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' ਲਈ ਕੋਈ ਸਰਵਿਸ ਰਿਕਾਰਡ ਨਹੀਂ" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ਖਾਲੀ ਸਬ-ਲਾਈਨਾਂ ਲਈ ਵਰਕਸਪੇਸ ਲਿਸਮਟ ਆਈ" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "ਅੱਖਰ ਅੱਖਰ ਬਦਲਣਾ (\\l, \\L, \\u, \\U) ਇੱਥੇ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE ਗਰੁੱਪ ਨੂੰ ਦੁਹਰਾਉਣਾ ਮਨਜ਼ੂਰ ਨਹੀਂ" + +#~ msgid "File is empty" +#~ msgstr "ਫਾਇਲ ਖਾਲੀ ਹੈ" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "ਕੁੰਜੀ ਫਾਇਲ ਵਿੱਚ '%s' ਕੁੰਜੀ ਹੈ, ਜਿਸ ਤੇ ਕਾਰਵਾਈ ਨਹੀਂ ਹੋ ਸਕਦੀ ਹੈ" + +#~ msgid "This option will be removed soon." +#~ msgstr "ਇਹ ਚੋਣ ਛੇਤੀ ਹੀ ਹਟਾਈ ਜਾਵੇਗੀ।" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' ਫਾਇਲ ਦੇਣ'ਚ ਗਲਤੀ: %s" + +#~ msgid "Error connecting: " +#~ msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: " + +#~ msgid "Error connecting: %s" +#~ msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 ਸਥਾਪਨ 'ਚ ਯੂਜ਼ਰ-ਨਾਂ ਦੀ ਸੀਮਾ %i ਅੱਖਰਾਂ ਤੱਕ ਹੈ" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4 ਸਥਾਪਨ 'ਚ ਹੋਸਟ-ਨਾਂ ਦੀ ਸੀਮਾ %i ਅੱਖਰਾਂ ਤੱਕ ਹੈ" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix ਬੰਦ ਕਰਨ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unix ਉੱਤੇ ਲਿਖਣ ਦੌਰਾਨ ਗਲਤੀ: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "ਸਵੇਰ" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "ਸ਼ਾਮ" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "ਦਿੱਤਾ ਮੁੱਲ ਗਲਤ ਹੈ, ਮਿਲਿਆ '%s', ਚਾਹੀਦਾ ਸੀ '%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "%2$s ਕਿਸਮ ਦੀ %1$s ਵਿਸ਼ੇਸ਼ਤਾ ਸੈੱਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਪਰ ਇੰਟਰਫੇਸ ਲਈ ਚਾਹੀਦਾ ਮੁੱਲ %3$s " +#~ "ਹੈ।" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "ਅਣਡਿੱਠਾ ਫਾਇਲ `%2$s' ਵਿੱਚ `%1$s' ਵਰਗਾ ਕੋਈ ਸਕੀਮਾ ਨਹੀਂ ਦਿੱਤਾ" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "ਕਮਾਂਡ:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "ਸਕੀਮਾ ਲਈ ਪਾਥ ਦਿਓ" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "ਆਰਗੂਮੈਂਟ:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "ਕੀ '%s' ਲਿਖਣਯੋਗ ਨਹੀਂ ਹੈ\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "ਬਦਾਅਲ ਲਈ KEY ਦਾ ਧਿਆਨ ਰੱਖੋ ਤੇ ਬਦਲਾਅ ਮੁੱਲ ਪਰਿੰਟ ਕਰੋ।\n" +#~ "ਜਦੋਂ ਤੱਕ ਪਰੋਸੈਸ ਖਤਮ ਨਹੀਂ ਹੋ ਜਾਂਦਾ ਨਿਗਰਾਨੀ ਜਾਰੀ ਰਹੇਗੀ।" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "" +#~ "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 "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.po b/po/pl.po new file mode 100644 index 0000000..dcb4fd5 --- /dev/null +++ b/po/pl.po @@ -0,0 +1,4471 @@ +# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +# Aviary.pl +# Jeśli masz jakiekolwiek uwagi odnoszące się do tłumaczenia lub chcesz +# pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas: +# gnomepl@aviary.pl +# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +# Zbigniew Chyla , 2002-2003. +# Artur Flinta , 2003-2006. +# Tomasz Kłoczko , 2005. +# Wadim Dziedzic , 2007-2009. +# Tomasz Dominikowski , 2008-2009. +# Piotr Drąg , 2009-2013. +# Aviary.pl , 2007-2013. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2013-02-17 16:45+0100\n" +"PO-Revision-Date: 2013-02-17 16:46+0100\n" +"Last-Translator: Piotr Drąg \n" +"Language-Team: Polish \n" +"Language: pl\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Za duża wartość licznika przekazana do %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Szukanie nie jest obsługiwane przez podstawowy potok" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Nie można skrócić GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Potok jest już zamknięty" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Skracanie nie jest dozwolone na podstawowym potoku" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1421 +#: ../gio/glocalfile.c:2172 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Działanie zostało anulowane" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Nieprawidłowy obiekt, nie zainicjowano" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Niepełna sekwencja wielu bajtów na wejściu" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Brak wystarczającej ilości miejsca w miejscu docelowym" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Nieprawidłowa sekwencja bajtów na wejściu konwersji" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Błąd podczas konwersji: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Zainicjowanie, które można anulować nie jest obsługiwane" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nie można otworzyć konwertera z \"%s\" na \"%s\"" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Nieznany typ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "typ pliku %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials nie jest zaimplementowane w tym systemie operacyjnym" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Platforma nie obsługuje GCredentials" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "" +"GCredentials nie zawiera identyfikatora procesu w tym systemie operacyjnym" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Nieoczekiwany, przedwczesny koniec potoku" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nieobsługiwany klucz \"%s\" we wpisie adresu \"%s\"" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adres \"%s\" jest nieprawidłowy (wymaga dokładnie jednej ścieżki, katalogu " +"tymczasowego lub kluczy abstrakcyjnych)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Para klucz/wartość we wpisie adresu \"%s\" nie ma znaczenia" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Błąd w adresie \"%s\" - atrybut portu jest błędnie sformatowany" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Błąd w adresie \"%s\" - atrybut rodziny jest błędnie sformatowany" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Element adresu \"%s\" nie zawiera dwukropka (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Para klucz/wartość %d, \"%s\" w elemencie adresu \"%s\" nie zawiera znaku " +"równości" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Błąd podczas usuwania znaku sterującego klucza lub wartości w parze klucz/" +"wartość %d, \"%s\" w elemencie adresu \"%s\"" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Błąd w adresie \"%s\" - transport systemu UNIX wymaga ustawienia dokładnie " +"jednego z kluczy \"path\" lub \"abstract\"" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Błąd w adresie \"%s\" - brak atrybutu komputera lub jest błędnie sformatowany" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Błąd w adresie \"%s\" - brak atrybutu portu lub jest błędnie sformatowany" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Błąd w adresie \"%s\" - brak atrybutu pliku nonce lub jest błędnie " +"sformatowany" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Błąd podczas automatycznego uruchamiania: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Nieznany lub nieobsługiwany transport \"%s\" dla adresu \"%s\"" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Błąd podczas otwierania pliku nonce \"%s\": %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Błąd podczas odczytywania pliku nonce \"%s\": %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Błąd podczas odczytywania pliku nonce \"%s\", oczekiwano 16 bajtów, " +"otrzymano %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Błąd podczas zapisywania zawartości pliku nonce \"%s\" do potoku:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Podany adres jest pusty" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Nie można wywołać magistrali komunikatów, kiedy używane jest setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Nie można wywołać magistrali komunikatów bez identyfikatora komputera: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Błąd podczas wywoływania wiersza poleceń \"%s\": " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Wpisanie dowolnego znaku zamknie to okno)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"Magistrala D-Bus sesji nie jest uruchomiona, i automatyczne uruchomienie się " +"nie powiodło" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Nie można ustalić adresu magistrali sesji (nie jest zaimplementowane dla " +"tego systemu operacyjnego)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nie można ustalić adresu magistrali ze zmiennej środowiskowej " +"DBUS_STARTER_BUS_TYPE - nieznana wartość \"%s\"" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nie można ustalić adresu magistrali, ponieważ nie ustawiono zmiennej " +"środowiskowej DBUS_STARTER_BUS_TYPE" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Nieznany typ magistrali %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Oczekiwano braku zawartości podczas próby odczytania wiersza" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Oczekiwano braku zawartości podczas próby (bezpiecznego) odczytania wiersza" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Wyczerpano wszystkie dostępne mechanizmy uwierzytelniania (próby: %s, " +"dostępne: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Anulowano przez GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Błąd podczas pobierania informacji o katalogu \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Uprawnienia katalogu \"%s\" są błędnie sformatowane. Oczekiwano trybu 0700, " +"otrzymano 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Błąd podczas tworzenia katalogu \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Błąd podczas otwierania bazy kluczy \"%s\" do odczytania: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Wiersz %d bazy kluczy w \"%s\" z zawartością \"%s\" jest błędnie sformatowany" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Pierwszy token wiersza %d bazy kluczy w \"%s\" z zawartością \"%s\" jest " +"błędnie sformatowany" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Drugi token wiersza %d bazy kluczy w \"%s\" z zawartością \"%s\" jest " +"błędnie sformatowany" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"Nie odnaleziono ciasteczka z identyfikatorem %d w bazie kluczy w \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Błąd podczas usuwania starego pliku blokady \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Błąd podczas tworzenia pliku blokady \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Błąd podczas zamykania (niedowiązanego) pliku blokady \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Błąd podczas odwiązywania pliku blokady \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Błąd podczas otwierania bazy kluczy \"%s\" do zapisania: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Dodatkowo, uwolnienie blokady \"%s\" także się nie powiodło: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Połączenie jest zamknięte" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Przekroczono czas oczekiwania" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Wystąpiły nieobsługiwane flagi podczas tworzenia połączenia ze strony klienta" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Brak interfejsu \"org.freedesktop.DBus.Properties\" w obiekcie w ścieżce %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Błąd podczas ustawiania własności \"%s\": oczekiwano typ \"%s\", ale " +"otrzymano \"%s\"" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Brak własności \"%s\"" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Właściwość \"%s\" nie jest odczytywalna" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Właściwość \"%s\" nie jest zapisywalna" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Brak interfejsu \"%s\"" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Brak interfejsu" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Brak interfejsu \"%s\" w obiekcie w ścieżce %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Brak metody \"%s\"" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Typ komunikatu, \"%s\", nie pasuje do oczekiwanego typu \"%s\"" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Obiekt został już wyeksportowany dla interfejsu %s w %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoda \"%s\" zwróciła typ \"%s\", ale oczekiwano \"%s\"" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoda \"%s\" w interfejsie \"%s\" z podpisem \"%s\" nie istnieje" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Poddrzewo zostało już wyeksportowane dla %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "typ jest NIEPRAWIDŁOWY" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Komunikat METHOD_CALL: brak pola nagłówka PATH lub MEMBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Komunikat METHOD_RETURN: brak pola nagłówka REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Komunikat BŁĘDU: brak pola nagłówka REPLY_SERIAL lub ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Komunikat SYGNAŁU: brak pola nagłówka PATH, INTERFACE lub MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Komunikat SYGNAŁU: pole nagłówka PATH używa zastrzeżonej wartości /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Komunikat SYGNAŁU: pole nagłówka INTERFACE używa zastrzeżonej wartości org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Chciano odczytać %lu bajt, ale otrzymano tylko %lu" +msgstr[1] "Chciano odczytać %lu bajty, ale otrzymano tylko %lu" +msgstr[2] "Chciano odczytać %lu bajtów, ale otrzymano tylko %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Oczekiwano bajtu NUL po ciągu \"%s\", ale odnaleziono bajt %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Oczekiwano prawidłowego ciągu UTF-8, ale odnaleziono nieprawidłowe bajty w " +"wyrównaniu bajtu %d (długość ciągu wynosi %d). Prawidłowy ciąg UTF-8 do tego " +"miejsca to \"%s\"" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" +"Przetworzona wartość \"%s\" nie jest prawidłową ścieżką do obiektu usługi D-" +"Bus" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Przetworzona wartość \"%s\" nie jest prawidłowym podpisem usługi D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Wystąpiła macierz o długości %u bajta. Maksymalna długość to 2<<26 bajtów " +"(64 MiB)." +msgstr[1] "" +"Wystąpiła macierz o długości %u bajtów. Maksymalna długość to 2<<26 bajtów " +"(64 MiB)." +msgstr[2] "" +"Wystąpiła macierz o długości %u bajtów. Maksymalna długość to 2<<26 bajtów " +"(64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Przetworzona wartość \"%s\" dla wariantu nie jest prawidłowym podpisem " +"usługi D-Bus" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Błąd podczas deserializowania GVariant za pomocą ciągu typu \"%s\" z formatu " +"przewodu usługi D-Bus" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Nieprawidłowa wartość kolejności bajtów. Oczekiwano 0x6c (\"l\") lub 0x42 " +"(\"B\"), ale odnaleziono wartość 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Nieprawidłowa główna wersja protokołu. Oczekiwano 1, ale odnaleziono %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Odnaleziono nagłówek podpisu z podpisem \"%s\", ale treść komunikatu jest " +"pusta" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Przetworzona wartość \"%s\" nie jest prawidłowym podpisem usługi D-Bus (dla " +"treści)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Brak nagłówka podpisu w komunikacie, ale treść komunikatu liczy %u bajt" +msgstr[1] "" +"Brak nagłówka podpisu w komunikacie, ale treść komunikatu liczy %u bajty" +msgstr[2] "" +"Brak nagłówka podpisu w komunikacie, ale treść komunikatu liczy %u bajtów" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Nie można deserializować komunikatu: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Błąd podczas serializowania GVariant za pomocą ciągu typu \"%s\" z formatu " +"przewodu usługi D-Bus" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Komunikat posiada %d deskryptorów plików, ale pole nagłówka wskazuje na %d " +"deskryptorów plików" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Nie można serializować komunikatu: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Treść komunikatu posiada podpis \"%s\", ale brak nagłówka podpisu" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Treść komunikatu posiada podpis \"%s\", ale podpis w polu nagłówka to \"%s\"" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Treść komunikatu jest pusta, ale podpis w polu nagłówka to \"(%s)\"" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Błąd zwrotu z treścią typu \"%s\"" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Błąd zwrotu z pustą treścią" + +#: ../gio/gdbusprivate.c:2069 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Nie można pobrać profilu sprzętu: %s" + +#: ../gio/gdbusprivate.c:2114 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nie można wczytać pliku /var/lib/dbus/machine-id lub /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Błąd podczas wywoływania metody StartServiceByName dla %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Nieoczekiwana odpowiedź %d od metody StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Nie można wywołać metody; pośrednik jest dla znanej nazwy bez właściciela, a " +"pośrednik został utworzony za pomocą flagi " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:709 +msgid "Abstract name space not supported" +msgstr "Przestrzeń nazw abstrakcyjnych nie jest obsługiwana" + +#: ../gio/gdbusserver.c:796 +msgid "Cannot specify nonce file when creating a server" +msgstr "Nie można określić pliku nonce podczas tworzenia serwera" + +#: ../gio/gdbusserver.c:874 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Błąd podczas zapisywania pliku nonce w \"%s\": %s" + +#: ../gio/gdbusserver.c:1043 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Ciąg \"%s\" nie jest prawidłowym GUID usługi D-Bus" + +#: ../gio/gdbusserver.c:1083 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nie można nasłuchiwać na nieobsługiwanym transporcie \"%s\"" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "POLECENIE" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Polecenia:\n" +" help Wyświetla tę informację\n" +" introspect Bada zdalny obiekt\n" +" monitor Monitoruje zdalny obiekt\n" +" call Wywołuje metodę na zdalnym obiekcie\n" +" emit Emituje sygnał\n" +"\n" +"Wykonanie polecenia \"%s POLECENIE --help\" wyświetla pomoc o każdym " +"poleceniu.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Błąd: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Błąd podczas przetwarzania kodu XML introspekcji: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Łączy z magistralą systemową" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Łączy z magistralą sesji" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Łączy z podanym adresem usługi D-Bus" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Opcje punktów końcowych połączenia:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Opcje określające punkt końcowy połączenia" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nie określono żadnych punktów końcowych połączenia" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Określono wiele punktów końcowych połączenia" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Ostrzeżenie: według danych introspekcji, interfejs \"%s\" nie istnieje\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Ostrzeżenie: według danych introspekcji, metoda \"%s\" nie istnieje w " +"interfejsie \"%s\"\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Opcjonalny cel sygnału (unikalna nazwa)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Ścieżka do obiektu do wyemitowania sygnału" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Nazwa sygnału i interfejsu" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emituje sygnał." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Błąd podczas połączenia: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Błąd: nie określono ścieżki do obiektu.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Błąd: %s nie jest prawidłową ścieżką do obiektu\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Błąd: nie określono sygnału.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Błąd: sygnał musi być w pełni kwalifikowaną nazwą.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Błąd: %s nie jest prawidłową nazwą interfejsu\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Błąd: %s nie jest prawidłową nazwą elementu\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Błąd: %s nie jest prawidłową unikalną nazwą magistrali.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Błąd podczas przetwarzania parametru %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Błąd podczas czyszczenia połączenia: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Nazwa docelowa do wywołania na niej metody" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Ścieżka do obiektu do wywołania na niej metody" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Nazwa metody i interfejsu" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Czas oczekiwania w sekundach" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Wywołuje metodę na zdalnym obiekcie." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Błąd: nie określono celu\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Błąd: nie określono ścieżki do obiektu\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Błąd: nie określono nazwy metody\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Błąd: nazwa metody \"%s\" jest nieprawidłowa\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Błąd podczas przetwarzania parametru %d typu \"%s\": %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Nazwa docelowa do zbadania" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Ścieżka do obiektu do zbadania" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Wyświetla kod XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Bada elementy potomne" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Wyświetla tylko właściwości" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Bada zdalny obiekt." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Nazwa docelowa do monitorowania" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Ścieżka do obiektu do monitorowania" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Monitoruje zdalny obiekt." + +#: ../gio/gdesktopappinfo.c:594 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Bez nazwy" + +#: ../gio/gdesktopappinfo.c:1007 +msgid "Desktop file didn't specify Exec field" +msgstr "Plik .desktop nie określa pola Exec" + +#: ../gio/gdesktopappinfo.c:1295 +msgid "Unable to find terminal required for application" +msgstr "Nie można odnaleźć terminala wymaganego przez program" + +#: ../gio/gdesktopappinfo.c:1597 +#, 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:1601 +#, 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:1841 ../gio/gdesktopappinfo.c:1865 +msgid "Application information lacks an identifier" +msgstr "Brak identyfikatora w informacjach o programie" + +#: ../gio/gdesktopappinfo.c:2097 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nie można utworzyć pliku .desktop dla użytkownika %s" + +#: ../gio/gdesktopappinfo.c:2221 +#, c-format +msgid "Custom definition for %s" +msgstr "Własna definicja dla %s" + +#: ../gio/gdrive.c:394 +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:472 +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:548 +msgid "drive doesn't implement polling for media" +msgstr "napęd nie obsługuje wykrywania nośnika" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "napęd nie obsługuje rozpoczęcia" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "napęd nie obsługuje zatrzymania" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Obsługa TLS jest niedostępna" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Błędna liczba elementów (%d) w kodowaniu GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, 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:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Błędna liczba elementów (%d) w kodowaniu GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Oczekiwano obiektu GEmblem dla GEmblemedIcon" + +#: ../gio/gfile.c:917 ../gio/gfile.c:1156 ../gio/gfile.c:1295 +#: ../gio/gfile.c:1535 ../gio/gfile.c:1590 ../gio/gfile.c:1648 +#: ../gio/gfile.c:1732 ../gio/gfile.c:1789 ../gio/gfile.c:1853 +#: ../gio/gfile.c:1908 ../gio/gfile.c:3468 ../gio/gfile.c:3523 +#: ../gio/gfile.c:3669 ../gio/gfile.c:3711 ../gio/gfile.c:4113 +#: ../gio/gfile.c:4525 ../gio/gfile.c:4610 ../gio/gfile.c:4700 +#: ../gio/gfile.c:4797 ../gio/gfile.c:4884 ../gio/gfile.c:4985 +#: ../gio/gfile.c:5258 ../gio/gfile.c:5536 ../gio/gfile.c:5590 +#: ../gio/gfile.c:7135 ../gio/gfile.c:7225 ../gio/gfile.c:7309 +#: ../gio/win32/gwinhttpfile.c:439 +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:1419 ../gio/glocalfile.c:1096 ../gio/glocalfile.c:1107 +#: ../gio/glocalfile.c:1120 +msgid "Containing mount does not exist" +msgstr "Nie istnieje zawierające montowanie" + +#: ../gio/gfile.c:2474 ../gio/glocalfile.c:2328 +msgid "Can't copy over directory" +msgstr "Nie można skopiować na katalog" + +#: ../gio/gfile.c:2534 +msgid "Can't copy directory over directory" +msgstr "Nie można skopiować katalogu na katalog" + +#: ../gio/gfile.c:2542 ../gio/glocalfile.c:2337 +msgid "Target file exists" +msgstr "Plik docelowy istnieje" + +#: ../gio/gfile.c:2561 +msgid "Can't recursively copy directory" +msgstr "Nie można skopiować katalogu rekurencyjnie" + +#: ../gio/gfile.c:2825 +msgid "Splice not supported" +msgstr "Wywołanie \"splice\" nie jest obsługiwane" + +#: ../gio/gfile.c:2829 +#, c-format +msgid "Error splicing file: %s" +msgstr "Błąd podczas dzielenia pliku: %s" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "" +"Kopiowanie (reflink/clone) między obiektami montowania nie jest obsługiwane" + +#: ../gio/gfile.c:2964 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Kopiowanie (reflink/clone) nie jest obsługiwane lub jest nieprawidłowe" + +#: ../gio/gfile.c:2969 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Kopiowanie (reflink/clone) nie jest obsługiwane lub nie zadziałało" + +#: ../gio/gfile.c:3029 +msgid "Can't copy special file" +msgstr "Nie można skopiować pliku specjalnego" + +#: ../gio/gfile.c:3659 +msgid "Invalid symlink value given" +msgstr "Wprowadzono nieprawidłową wartość dowiązania symbolicznego" + +#: ../gio/gfile.c:3819 +msgid "Trash not supported" +msgstr "Kosz nie jest obsługiwany" + +#: ../gio/gfile.c:3870 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nazwy plików nie mogą zawierać \"%c\"" + +#: ../gio/gfile.c:6258 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "wolumin nie obsługuje montowania" + +#: ../gio/gfile.c:6367 +msgid "No application is registered as handling this file" +msgstr "Å»aden program nie jest zarejestrowany do obsługi tego pliku" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumerator jest zamknięty" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Enumerator plików ma zaległe działanie" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Potok nie obsługuje działania query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Szukanie nie jest obsługiwane przez potok" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Skracanie nie jest dozwolone na potoku wejściowym" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Skracanie nie jest dozwolone na potoku" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Błędna liczba elementów (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Brak typu dla nazwy klasy %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typ %s nie obsługuje interfejsu GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s nie jest klasowy" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Błędny format numeru wersji: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Nie można obsłużyć podanej wersji kodowania ikony" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nie podano adresu" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Długość %u jest za długa na adres" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adres posiada bity ustawione poza długością przedrostka" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Nie można przetworzyć \"%s\" jako maskę adresu IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Brak wystarczającej ilości miejsca dla adresu gniazda" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nieobsługiwany adres gniazda" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Potok ma zaległe działanie" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> nie jest dozwolony wewnątrz <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> nie jest dozwolony jako główny element" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Plik %s pojawia się wiele razy w zasobie" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "" +"Ustalenie położenia \"%s\" w dowolnym katalogu źródłowym się nie powiodło" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Ustalenie położenia \"%s\" w bieżącym katalogu się nie powiodło" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Nieznana opcja przetwarzania \"%s\"" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Utworzenie pliku tymczasowego się nie powiodło: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Błąd podczas przetwarzania pliku wejściowego za pomocą xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Błąd podczas przetwarzania pliku wejściowego za pomocą to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Błąd podczas odczytywania pliku %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Błąd podczas kompresowania pliku %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "tekst nie może znajdować się wewnątrz <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "nazwa pliku wyjściowego" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "PLIK" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Katalog, z którego odczytywać pliki (domyślnie bieżący katalog)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "KATALOG" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Tworzy wyjście w formacie wybranym przez rozszerzenie pliku docelowego" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Tworzy nagłówek źródła" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Tworzy kod źródłowy używany do dowiązania pliku zasobu do kodu" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Tworzy listę zależności" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Bez automatycznego tworzenia i rejestrowania zasobu" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Bez eksportowania funkcji; deklaruje je jako G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Nazwa identyfikatora języka C używana dla utworzonego kodu źródłowego" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompiluje określenie zasobu do pliku zasobu. Pliki określeń\n" +"zasobów posiadają rozszerzenie .gresource.xml, a pliki\n" +"zasobów posiadają rozszerzenie .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Należy podać dokładnie jedną nazwę pliku\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "puste nazwy nie są dozwolone" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" +"nieprawidłowa nazwa \"%s\": nazwy muszą rozpoczynać się od małej litery" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nieprawidłowa nazwa \"%s\": niedozwolony znak \"%c\". Dozwolone są tylko " +"małe litery, liczby i myślniki (\"-\")." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "nieprawidłowa nazwa \"%s\": dwa myślniki (\"--\") nie są dozwolone." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"nieprawidłowa nazwa \"%s\": ostatni znak nie może być myślnikiem (\"-\")." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nieprawidłowa nazwa \"%s\": maksymalna długość to 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " zostało już określone" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "nie można dodać kluczy do schematu \"list-of\"" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " zostało już określone" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" pokrywa w ; należy użyć " +"znacznika , aby zmodyfikować wartość" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"dokładnie jedna z wartości \"type\", \"enum\" lub \"flags\" musi zostać " +"określona jako atrybut znacznika " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> nie zostało (jeszcze) określone." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "nieprawidłowy typ GVariant ciągu \"%s\"" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "podano znacznik , ale schemat nic nie rozszerza" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "brak znacznika do zastąpienia" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " zostało już określone" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " zostało już określone" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " rozszerza jeszcze nie istniejący schemat \"%s\"" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " jest listą jeszcze nie istniejącego schematu \"%s\"" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nie można być listą schematów ze ścieżkami" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nie można rozszerzyć schematu ze ścieżką" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" jest listą rozszerzającą znacznik , który " +"nie jest listą" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" rozszerza znacznik , ale \"%s\" nie rozszerza \"%s\"" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"ścieżka, jeśli zostanie podana, musi rozpoczynać się i kończyć ukośnikiem" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ścieżka do listy musi kończyć się \":/\"" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> zostało już określone" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> nie jest dozwolony jako główny element" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "Podano opcję --strict; kończenie działania.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Cały plik został zignorowany.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorowanie tego pliku.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Brak klucza \"%s\" w schemacie \"%s\", jak określono w pliku zastąpienia \"%s" +"\"" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorowanie zastąpienia dla tego klucza.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " oraz podano opcję --strict; kończenie działania.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"błąd podczas przetwarzania klucza \"%s\" w schemacie \"%s\", jak określono w " +"pliku zastąpienia \"%s\": %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorowanie zastąpienia dla tego klucza.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"zastąpienie dla klucza \"%s\" w schemacie \"%s\" w pliku zastąpienia \"%s\" " +"jest poza zakresem podanym w schemacie" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"zastąpienie dla klucza \"%s\" w schemacie \"%s\" w pliku zastąpienia \"%s\" " +"nie znajduje się na liście prawidłowych wyborów" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gdzie przechowywać plik schemas.compiled" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Przerywa po każdym błędzie w schematach" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Bez zapisywania pliku gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Bez wymuszania ograniczeń nazw kluczy" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompiluje wszystkie pliki schematów GSettings do pamięci\n" +"podręcznej schematów. Pliki schematów muszą posiadać\n" +"rozszerzenie .gschema.xml, a pliki pamięci podręcznej\n" +"nazywają się gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Należy podać dokładnie jedną nazwę katalogu\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Nie odnaleziono plików schematów: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "nic.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "usunięto istniejący plik wyjściowy.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Nie można odnaleźć domyślnego typu monitora katalogu lokalnego" + +#: ../gio/glocalfile.c:597 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nieprawidłowa nazwa pliku %s" + +#: ../gio/glocalfile.c:974 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Błąd podczas pobierania informacji o systemie plików: %s" + +#: ../gio/glocalfile.c:1142 +msgid "Can't rename root directory" +msgstr "Nie można zmienić nazwy katalogu głównego" + +#: ../gio/glocalfile.c:1162 ../gio/glocalfile.c:1188 +#, c-format +msgid "Error renaming file: %s" +msgstr "Błąd podczas zmieniania nazwy pliku: %s" + +#: ../gio/glocalfile.c:1171 +msgid "Can't rename file, filename already exists" +msgstr "Nie można zmienić nazwy pliku, plik o takiej nazwie już istnieje" + +#: ../gio/glocalfile.c:1184 ../gio/glocalfile.c:2201 ../gio/glocalfile.c:2230 +#: ../gio/glocalfile.c:2390 ../gio/glocalfileoutputstream.c:575 +#: ../gio/glocalfileoutputstream.c:628 ../gio/glocalfileoutputstream.c:673 +#: ../gio/glocalfileoutputstream.c:1161 +msgid "Invalid filename" +msgstr "Nieprawidłowa nazwa pliku" + +#: ../gio/glocalfile.c:1351 ../gio/glocalfile.c:1375 +msgid "Can't open directory" +msgstr "Nie można otworzyć katalogu" + +#: ../gio/glocalfile.c:1359 +#, c-format +msgid "Error opening file: %s" +msgstr "Błąd podczas otwierania pliku: %s" + +#: ../gio/glocalfile.c:1500 +#, c-format +msgid "Error removing file: %s" +msgstr "Błąd podczas usuwania pliku: %s" + +#: ../gio/glocalfile.c:1880 +#, c-format +msgid "Error trashing file: %s" +msgstr "Błąd podczas przenoszenia pliku do kosza: %s" + +#: ../gio/glocalfile.c:1903 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nie można utworzyć katalogu kosza %s: %s" + +#: ../gio/glocalfile.c:1924 +msgid "Unable to find toplevel directory for trash" +msgstr "Nie można odnaleźć głównego katalogu dla kosza" + +#: ../gio/glocalfile.c:2003 ../gio/glocalfile.c:2023 +msgid "Unable to find or create trash directory" +msgstr "Nie można odnaleźć lub utworzyć katalogu kosza" + +#: ../gio/glocalfile.c:2057 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nie można utworzyć pliku informacji o koszu: %s" + +#: ../gio/glocalfile.c:2086 ../gio/glocalfile.c:2091 ../gio/glocalfile.c:2171 +#: ../gio/glocalfile.c:2178 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nie można przenieść pliku do kosza: %s" + +#: ../gio/glocalfile.c:2179 ../glib/gregex.c:280 +msgid "internal error" +msgstr "błąd wewnętrzny" + +#: ../gio/glocalfile.c:2205 +#, c-format +msgid "Error creating directory: %s" +msgstr "Błąd podczas tworzenia katalogu: %s" + +#: ../gio/glocalfile.c:2234 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "System plików nie obsługuje dowiązań symbolicznych" + +#: ../gio/glocalfile.c:2238 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Błąd podczas tworzenia dowiązania symbolicznego: %s" + +#: ../gio/glocalfile.c:2300 ../gio/glocalfile.c:2394 +#, c-format +msgid "Error moving file: %s" +msgstr "Błąd podczas przenoszenia pliku: %s" + +#: ../gio/glocalfile.c:2323 +msgid "Can't move directory over directory" +msgstr "Nie można przenieść katalogu na katalog" + +#: ../gio/glocalfile.c:2350 ../gio/glocalfileoutputstream.c:959 +#: ../gio/glocalfileoutputstream.c:973 ../gio/glocalfileoutputstream.c:988 +#: ../gio/glocalfileoutputstream.c:1004 ../gio/glocalfileoutputstream.c:1018 +msgid "Backup file creation failed" +msgstr "Utworzenie pliku kopii zapasowej się nie powiodło" + +#: ../gio/glocalfile.c:2369 +#, c-format +msgid "Error removing target file: %s" +msgstr "Błąd podczas usuwania pliku docelowego: %s" + +#: ../gio/glocalfile.c:2383 +msgid "Move between mounts not supported" +msgstr "Przenoszenie między punktami montowania nie jest obsługiwane" + +#: ../gio/glocalfileinfo.c:722 +msgid "Attribute value must be non-NULL" +msgstr "Wartość atrybutu nie może być pusta" + +#: ../gio/glocalfileinfo.c:729 +msgid "Invalid attribute type (string expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"string\")" + +#: ../gio/glocalfileinfo.c:736 +msgid "Invalid extended attribute name" +msgstr "Nieprawidłowa nazwa rozszerzonego atrybutu" + +#: ../gio/glocalfileinfo.c:776 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Błąd podczas ustawiania rozszerzonego atrybutu \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1548 +msgid " (invalid encoding)" +msgstr " (nieprawidłowe kodowanie)" + +#: ../gio/glocalfileinfo.c:1740 ../gio/glocalfileoutputstream.c:837 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Błąd podczas pobierania informacji o pliku \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1986 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Błąd podczas pobierania informacji o deskryptorze pliku: %s" + +#: ../gio/glocalfileinfo.c:2031 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"uint32\")" + +#: ../gio/glocalfileinfo.c:2049 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"uint64\")" + +#: ../gio/glocalfileinfo.c:2068 ../gio/glocalfileinfo.c:2087 +msgid "Invalid attribute type (byte string expected)" +msgstr "Nieprawidłowy typ atrybutu (oczekiwano \"byte string\")" + +#: ../gio/glocalfileinfo.c:2122 +msgid "Cannot set permissions on symlinks" +msgstr "Nie można ustawić uprawnień na dowiązaniach symbolicznych" + +#: ../gio/glocalfileinfo.c:2138 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Błąd podczas ustawiania uprawnień: %s" + +#: ../gio/glocalfileinfo.c:2189 +#, c-format +msgid "Error setting owner: %s" +msgstr "Błąd podczas ustawiania właściciela: %s" + +#: ../gio/glocalfileinfo.c:2212 +msgid "symlink must be non-NULL" +msgstr "dowiązanie symboliczne nie może być puste" + +#: ../gio/glocalfileinfo.c:2222 ../gio/glocalfileinfo.c:2241 +#: ../gio/glocalfileinfo.c:2252 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Błąd podczas ustawiania dowiązania symbolicznego: %s" + +#: ../gio/glocalfileinfo.c:2231 +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:2357 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Błąd podczas ustawiania czasu modyfikacji lub dostępu: %s" + +#: ../gio/glocalfileinfo.c:2380 +msgid "SELinux context must be non-NULL" +msgstr "Kontekst SELinux nie może być pusty" + +#: ../gio/glocalfileinfo.c:2395 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Błąd podczas ustawiania kontekstu SELinux: %s" + +#: ../gio/glocalfileinfo.c:2402 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nie jest włączony w tym systemie" + +#: ../gio/glocalfileinfo.c:2494 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Ustawianie atrybutu %s nie jest obsługiwane" + +#: ../gio/glocalfileinputstream.c:186 ../gio/glocalfileoutputstream.c:726 +#, c-format +msgid "Error reading from file: %s" +msgstr "Błąd podczas odczytywania z pliku: %s" + +#: ../gio/glocalfileinputstream.c:217 ../gio/glocalfileinputstream.c:229 +#: ../gio/glocalfileinputstream.c:336 ../gio/glocalfileoutputstream.c:464 +#: ../gio/glocalfileoutputstream.c:1036 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Błąd podczas wyszukiwania w pliku: %s" + +#: ../gio/glocalfileinputstream.c:258 ../gio/glocalfileoutputstream.c:254 +#: ../gio/glocalfileoutputstream.c:348 +#, c-format +msgid "Error closing file: %s" +msgstr "Błąd podczas zamykania pliku: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Nie można odnaleźć domyślnego typu monitora pliku lokalnego" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:234 +#: ../gio/glocalfileoutputstream.c:747 +#, c-format +msgid "Error writing to file: %s" +msgstr "Błąd podczas zapisywania do pliku: %s" + +#: ../gio/glocalfileoutputstream.c:281 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Błąd podczas usuwania odnośnika do starej kopii zapasowej: %s" + +#: ../gio/glocalfileoutputstream.c:295 ../gio/glocalfileoutputstream.c:308 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Błąd podczas tworzenia kopii zapasowej: %s" + +#: ../gio/glocalfileoutputstream.c:326 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Błąd podczas zmieniania nazwy pliku tymczasowego: %s" + +#: ../gio/glocalfileoutputstream.c:510 ../gio/glocalfileoutputstream.c:1087 +#, c-format +msgid "Error truncating file: %s" +msgstr "Błąd podczas skracania pliku: %s" + +#: ../gio/glocalfileoutputstream.c:581 ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 ../gio/glocalfileoutputstream.c:819 +#: ../gio/glocalfileoutputstream.c:1068 ../gio/glocalfileoutputstream.c:1167 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Błąd podczas otwierania pliku \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:850 +msgid "Target file is a directory" +msgstr "Plik docelowy jest katalogiem" + +#: ../gio/glocalfileoutputstream.c:855 +msgid "Target file is not a regular file" +msgstr "Plik docelowy nie jest zwykłym plikiem" + +#: ../gio/glocalfileoutputstream.c:867 +msgid "The file was externally modified" +msgstr "Plik został zmieniony poza programem" + +#: ../gio/glocalfileoutputstream.c:1052 +#, c-format +msgid "Error removing old file: %s" +msgstr "Błąd podczas usuwania starego pliku: %s" + +#: ../gio/gmemoryinputstream.c:476 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Podano nieprawidłowy obiekt GSeekType" + +#: ../gio/gmemoryinputstream.c:486 +msgid "Invalid seek request" +msgstr "Nieprawidłowe żądanie wyszukiwania" + +#: ../gio/gmemoryinputstream.c:510 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nie można skrócić GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Potok wyjściowy pamięci nie obsługuje zmiany rozmiaru" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Zmiana rozmiaru potoku wyjściowego pamięci się nie powiodła" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Zażądano przejścia przed początkiem potoku" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"montowany obiekt nie obsługuje synchronicznego rozpoznania typu zawartości" + +#: ../gio/gnetworkaddress.c:345 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nazwa komputera \"%s\" zawiera \"[\", ale nie \"]\"" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Sieć jest niedostępna" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Komputer jest niedostępny" + +#: ../gio/gnetworkmonitornetlink.c:98 ../gio/gnetworkmonitornetlink.c:110 +#: ../gio/gnetworkmonitornetlink.c:129 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Nie można utworzyć monitora sieci: %s" + +#: ../gio/gnetworkmonitornetlink.c:119 +msgid "Could not create network monitor: " +msgstr "Nie można utworzyć monitora sieci: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Nie można uzyskać stanu sieci: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Potok wyjściowy nie obsługuje zapisu" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Potok źródłowy jest już zamknięty" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Zasób w \"%s\" nie istnieje" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Zdekompresowanie zasobu w \"%s\" się nie powiodło" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Zasób w \"%s\" nie jest katalogiem" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Potok wejściowy nie obsługuje szukania" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Wyświetla pomoc" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[POLECENIE]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Wyświetla listę sekcji zawierających zasoby w PLIKU w formacie ELF" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Wyświetla listę zasobów\n" +"Jeśli podano SEKCJĘ, to wyświetla tylko zasoby w tej sekcji\n" +"Jeśli podano ŚCIEÅ»KĘ, to wyświetla tylko pasujące zasoby" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "PLIK [ŚCIEÅ»KA]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SEKCJA" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Wyświetla listę zasobów ze szczegółami\n" +"Jeśli podano SEKCJĘ, to wyświetla tylko zasoby w tej sekcji\n" +"Jeśli podano ŚCIEÅ»KĘ, to wyświetla tylko pasujące zasobySzczegóły zawierają " +"sekcję, rozmiar i kompresję" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Wydobywa plik zasobu do standardowego wyjścia" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "PLIK ŚCIEÅ»KA" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Nieznane polecenie %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Użycie:\n" +" gresource [--section SEKCJA] POLECENIE [PARAMETRY...]\n" +"\n" +"Polecenia:\n" +" help Wyświetla tę informację\n" +" sections Wyświetla listę sekcji zasobów\n" +" list Wyświetla listę zasobów\n" +" details Wyświetla listę zasobów ze szczegółami\n" +" extract Wydobywa zasób\n" +"\n" +"Wykonanie polecenia \"gresource help POLECENIE\" wyświetla szczegółową " +"pomoc.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Użycie:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Parametry:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKCJA (Opcjonalna) nazwa sekcji formatu ELF\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " POLECENIE (Opcjonalne) polecenie do wyjaśnienia\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" PLIK Plik w formacie ELF (plik binarny lub\n" +" biblioteka współdzielona)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" PLIK Plik w formacie ELF (plik binarny lub biblioteka\n" +" współdzielona) lub skompilowany plik zasobów\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[ŚCIEÅ»KA]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " ŚCIEÅ»KA (Opcjonalna) ścieżka do zasobu (może być częściowa)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "ŚCIEÅ»KA" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " ŚCIEÅ»KA Ścieżka do zasobu\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Brak schematu \"%s\"\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Nie można przenosić schematu \"%s\" (nie można podać ścieżki)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Można przenosić schemat \"%s\" (należy podać ścieżkę)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Podano pustą ścieżkę.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Ścieżka musi rozpoczynać się od ukośnika (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Ścieżka musi kończyć się ukośnikiem (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Ścieżka nie może zawierać dwóch sąsiadujących ukośników (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Brak klucza \"%s\"\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Podana wartość jest poza prawidłowym zakresem\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "" +"Wyświetla listę zainstalowanych schematów (których nie można przenosić)" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Wyświetla listę zainstalowanych schematów (które można przenosić)" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Wyświetla listę kluczy w SCHEMACIE" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMAT[:ŚCIEÅ»KA]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Wyświetla listę elementów potomnych SCHEMATU" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Wyświetla listę kluczy i wartości, rekursywnie\n" +"Jeśli nie podano SCHEMATU, to wyświetla listę wszystkich kluczy\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMAT[:ŚCIEÅ»KA]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Uzyskuje wartość KLUCZA" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMAT[:ŚCIEÅ»KA] KLUCZ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Odpytuje zakres prawidłowych wartości KLUCZA" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Ustawia wartość KLUCZA na WARTOŚĆ" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMAT[:ŚCIEÅ»KA] KLUCZ WARTOŚĆ" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Przywraca KLUCZ na jego domyślną wartość" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Przywraca wszystkie klucze w SCHEMACIE do domyślnych wartości" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Sprawdza, czy KLUCZ jest zapisywalny" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitoruje zmiany KLUCZA.\n" +"Jeśli nie podano KLUCZA, to monitoruje wszystkie klucze w SCHEMACIE.\n" +"Użycie ^C zatrzymuje monitorowanie.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMAT[:ŚCIEÅ»KA] [KLUCZ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Użycie:\n" +" gsettings [--schemadir KATALOG_SCHEMATÓW] POLECENIE [PARAMETRY...]\n" +"\n" +"Polecenia:\n" +" help Wyświetla te informacje\n" +" list-schemas Wyświetla listę zainstalowanych schematów\n" +" list-relocatable-schemas Wyświetla listę zainstalowanych schematów,\n" +" które można przenosić\n" +" list-keys Wyświetla listę kluczy w schemacie\n" +" list-children Wyświetla listę elementów potomnych schematu\n" +" list-recursively Wyświetla listę kluczy i wartości, rekursywanie\n" +" range Odpytuje zakres klucza\n" +" get Uzyskuje wartość klucza\n" +" set Ustawia wartość klucza\n" +" reset Przywraca wartość klucza\n" +" reset-recursively Przywraca wszystkie wartości\n" +" w podanym schemacie\n" +" writable Sprawdza, czy klucz jest zapisywalny\n" +" monitor Obserwuje zmiany\n" +"\n" +"Wykonanie polecenia \"gsettings help POLECENIE\" wyświetla szczegółową " +"pomoc.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Użycie:\n" +" gsettings [--schemadir KATALOG_SCHEMATÓW] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " KATALOG_SCHEMATÓW Katalog do wyszukiwania dodatkowych schematów\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMAT Identyfikator schematu\n" +" ŚCIEÅ»KA Ścieżka (dla schematów, które można przenosić)\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KLUCZ (Opcjonalny) klucz w schemacie\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KLUCZ Klucz w schemacie\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " WARTOŚĆ Wartość do ustawienia\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Podano pustą nazwę schematu\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Nieprawidłowe gniazdo, nie zainicjowano" + +#: ../gio/gsocket.c:318 +#, 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:326 +msgid "Socket is already closed" +msgstr "Gniazdo jest już zamknięte" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Przekroczono czas oczekiwania wejścia/wyjścia gniazda" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "tworzenie GSocket z fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nie można utworzyć gniazda: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Określono nieznaną rodzinę" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Określono nieznany protokół" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "nie można uzyskać lokalnego adresu: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "nie można uzyskać zdalnego adresu: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "nie można nasłuchiwać: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Błąd podczas dowiązywania do adresu: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Błąd podczas dołączania do grupy multicast: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Błąd podczas opuszczania grupy multicast: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Brak obsługi multicastu dla konkretnych źródeł" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Błąd podczas akceptowania połączenia: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Trwa połączenie" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Nie można uzyskać oczekującego błędu: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Błąd podczas pobierania danych: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Błąd podczas wysyłania danych: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nie można zamknąć gniazda: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Błąd podczas zamykania gniazda: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Oczekiwanie na warunek gniazda: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Błąd podczas wysyłania komunikatu: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage nie jest obsługiwane w systemie Windows" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Błąd podczas pobierania komunikatu: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nie można uzyskać oczekującego błędu: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials nie jest zaimplementowane dla tego systemu " +"operacyjnego" + +#: ../gio/gsocketclient.c:177 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nie można połączyć z serwerem pośrednika %s: " + +#: ../gio/gsocketclient.c:191 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nie można połączyć z %s: " + +#: ../gio/gsocketclient.c:193 +msgid "Could not connect: " +msgstr "Nie można połączyć: " + +#: ../gio/gsocketclient.c:1072 ../gio/gsocketclient.c:1636 +msgid "Unknown error on connect" +msgstr "Nieznany błąd połączenia" + +#: ../gio/gsocketclient.c:1125 ../gio/gsocketclient.c:1574 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Pośredniczenie przez połączenie nie będące TCP nie jest obsługiwana." + +#: ../gio/gsocketclient.c:1151 ../gio/gsocketclient.c:1595 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokół pośrednika \"%s\" nie jest obsługiwany." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Nasłuch jest już zamknięty" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Dodane gniazdo jest zamknięte" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nie obsługuje adresu IPv6 \"%s\"" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Nazwa użytkownika jest za długa dla protokołu SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Nazwa komputera \"%s\" jest za długa dla protokołu SOCKSv4" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Serwer nie jest serwerem pośrednika SOCKSv4." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Połączenie przez serwer SOCKSv4 zostało odrzucone" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Serwer nie jest serwerem pośrednika SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Pośrednik SOCKSv5 wymaga uwierzytelnienia." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 wymaga metody uwierzytelnienia nieobsługiwaną przez bibliotekę GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Nazwa użytkownika lub hasło są za długie dla protokołu SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Uwierzytelnienie SOCKSv5 się nie powiodło z powodu błędnej nazwy użytkownika " +"lub hasła." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Nazwa komputera \"%s\" jest za długa dla protokołu SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Serwer pośrednika SOCKSv5 używa nieznanego typu adresu." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Wewnętrzny błąd serwera pośrednika SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Połączenia SOCKSv5 nie są dozwolone przez zestaw reguł." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Komputer jest niedostępny przez serwer SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Sieć jest niedostępna przez serwer SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Połączenie przez pośrednika SOCKSv5 zostało odrzucone." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Pośrednik SOCKSv5 nie obsługuje polecenia \"connect\"." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Pośrednik SOCKSv5 nie obsługuje podanego typu adresu." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Nieznany błąd pośrednika SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nie można obsłużyć wersji %d kodowania GThemedIcon" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Błąd podczas rozwiązywania \"%s\": %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Błąd podczas odwrotnego rozwiązywania \"%s\": %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Brak wpisu DNS żądanego typu dla \"%s\"" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Nie można tymczasowo rozwiązać \"%s\"" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Błąd podczas rozwiązywania \"%s\"" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nie można odszyfrować klucza prywatnego zakodowanego za pomocą PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nie odnaleziono klucza prywatnego zakodowanego za pomocą PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nie można przetworzyć klucza prywatnego zakodowanego za pomocą PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nie odnaleziono certyfikatu zakodowanego za pomocą PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nie można przetworzyć certyfikatów zakodowanych za pomocą PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"To jest ostatnia szansa na poprawne podanie hasła, zanim dostęp zostanie " +"zablokowany." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Kilka podanych haseł było niepoprawnych, dostęp zostanie zablokowany po " +"dalszych niepowodzeniach." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Podane hasło jest niepoprawne." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Oczekiwano jeden komunikat kontrolny, otrzymano %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Nieoczekiwany typ podrzędnych danych" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Oczekiwano jedno fd, otrzymano %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Pobrano nieprawidłowe fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Błąd podczas wysyłania danych uwierzytelniających: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +"Błąd podczas sprawdzania, czy zmienna SO_PASSCRED została włączona dla " +"gniazda: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Błąd podczas włączania zmiennej SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Oczekiwano odczytania pojedynczego bajtu dla odbieranych danych " +"uwierzytelniających, ale odczytano zero bajtów" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Nie oczekiwano komunikatu kontrolnego, a otrzymano %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Błąd podczas wyłączania zmiennej SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Błąd podczas odczytywania z deskryptora pliku: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Błąd podczas zamykania deskryptora pliku: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Katalog główny systemu plików" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Błąd podczas zapisywania do deskryptora pliku: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "wolumin nie obsługuje wysunięcia lub \"eject_with_operation\"" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Nie można odnaleźć programu" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Błąd podczas uruchamiania programu: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Adresy URI nie są obsługiwane" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "zmiany skojarzeń nie są obsługiwane w win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Tworzenie skojarzeń nie jest obsługiwane w win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Błąd podczas odczytywania z pliku obsługi: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Błąd podczas zamykania pliku obsługi: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Błąd podczas zapisywania do pliku obsługi: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Brak wystarczającej ilości pamięci" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Błąd wewnętrzny: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Wymagane jest danych wejściowych" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Nieprawidłowe skompresowane dane" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adres, na którym nasłuchiwać" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorowane, dla zgodności z GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Wyświetla adres" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Wyświetla adres w trybie powłoki" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Uruchamia usługę D-Bus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Błędne parametry\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nieoczekiwany atrybut \"%s\" dla elementu \"%s\"" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Nie odnaleziono atrybutu \"%s\" dla elementu \"%s\"" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Nieoczekiwany znacznik \"%s\", oczekiwano znacznika \"%s\"" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nieoczekiwany znacznik \"%s\" wewnątrz \"%s\"" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zakładka dla adresu URI \"%s\" już istnieje" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nie odnaleziono zakładki dla adresu URI \"%s\"" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, 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:1871 +#, 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:1881 +#, 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:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adres URI \"%s\" jest nieprawidłowy" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Nazwa komputera w adresie URI \"%s\" jest nieprawidłowa" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adres URI \"%s\" zawiera nieprawidłowe znaki sterujące" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ścieżka \"%s\" nie jest ścieżką bezwzględną" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Nieprawidłowa nazwa komputera" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %-d %b %Y, %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%e %b %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "styczeń" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "luty" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "marzec" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "kwiecień" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "czerwiec" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "lipiec" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "sierpień" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "wrzesień" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "październik" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "listopad" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "grudzień" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "sty" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "lut" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "kwi" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "cze" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "lip" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "sie" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "wrz" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "paź" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "lis" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "gru" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "poniedziałek" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "wtorek" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "środa" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "czwartek" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "piątek" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sobota" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "niedziela" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "pon" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "wto" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "śro" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "czw" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "pią" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sob" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "nie" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Błąd podczas otwierania katalogu \"%s\": %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Nie można przydzielić %lu bajtu do odczytu pliku \"%s\"" +msgstr[1] "Nie można przydzielić %lu bajtów do odczytu pliku \"%s\"" +msgstr[2] "Nie można przydzielić %lu bajtów do odczytu pliku \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Błąd podczas odczytu pliku \"%s\": %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Plik \"%s\" jest za duży" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Odczytanie z pliku \"%s\" się nie powiodło: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Otwarcie pliku \"%s\" się nie powiodło: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Utworzenie pliku \"%s\" się nie powiodło: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1556 +#, 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:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Szablon \"%s\" nie zawiera XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, 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:2118 +msgid "Symbolic links not supported" +msgstr "Dowiązania symboliczne nie są obsługiwane" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "W buforze odczytu pozostały nieprzekonwertowane dane" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Na końcu kanału występuje sekwencja odpowiadająca części znaku" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +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:758 +msgid "Not a regular file" +msgstr "To nie jest zwykły plik" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nieprawidłowa nazwa grupy: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Plik klucza nie rozpoczyna się od grupy" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nieprawidłowa nazwa klucza: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Plik klucza zawiera nieobsługiwane kodowanie \"%s\"" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Plik klucza nie zawiera grupy \"%s\"" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Plik klucza nie zawiera klucza \"%s\"" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Plik klucza zawiera klucz \"%s\" w grupie \"%s\", która posiada wartość " +"niemożliwą do zinterpretowania." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"Klucz \"%s\" w grupie \"%s\" posiada wartość \"%s\", podczas gdy oczekiwano " +"%s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +msgid "Key file contains escape character at end of line" +msgstr "Plik klucza zawiera znak sterujący na końcu linii" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Plik klucza zawiera nieprawidłową sekwencję sterującą \"%s\"" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nie można zinterpretować \"%s\" jako liczby." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Wartość całkowita \"%s\" jest spoza dopuszczalnego zakresu" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nie można zinterpretować \"%s\" jako liczby zmiennoprzecinkowej." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nie można zinterpretować \"%s\" jako wartości logicznej." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Uzyskanie atrybutów pliku \"%s%s%s%s\" się nie powiodło: funkcja fstat() " +"zwróciła błąd: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "" +"Zmapowanie pliku %s%s%s%s się nie powiodło: funkcja mmap() zwróciła błąd: %s" + +#: ../glib/gmappedfile.c:262 +#, 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/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Błąd w wierszu %d przy znaku %d: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "\"%s\" nie jest prawidłową nazwą" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "\"%s\" nie jest prawidłową nazwą: \"%c\"" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Błąd w wierszu %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, 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:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Napotkano pustą jednostkę \"&;\"; poprawnymi jednostkami są: & " " +"< > '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nazwa jednostki \"%-.*s\" nie jest znana" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musi rozpoczynać się jakimś elementem (np. )" + +#: ../glib/gmarkup.c:1159 +#, 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:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, 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:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument jest pusty lub zawiera tylko spacje" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Zaraz po znaku \"<\" nastąpił nieoczekiwany koniec dokumentu" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy elementu" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz nazwy atrybutu" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu wewnątrz znacznika otwierającego " +"element." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Nastąpił nieoczekiwany koniec dokumentu wewnątrz wartości atrybutu" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Nastąpił nieoczekiwany koniec dokumentu wewnątrz komentarza lub instrukcji " +"przetwarzania" + +#: ../glib/goption.c:754 +msgid "Usage:" +msgstr "Użycie:" + +#: ../glib/goption.c:754 +msgid "[OPTION...]" +msgstr "[OPCJA...]" + +#: ../glib/goption.c:864 +msgid "Help Options:" +msgstr "Opcje pomocy:" + +#: ../glib/goption.c:865 +msgid "Show help options" +msgstr "Wyświetla opcje pomocy" + +#: ../glib/goption.c:871 +msgid "Show all help options" +msgstr "Wyświetla wszystkie opcje pomocy" + +#: ../glib/goption.c:933 +msgid "Application Options:" +msgstr "Opcje programu:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, 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:1007 ../glib/goption.c:1075 +#, 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:1032 +#, 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:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Błąd podczas przetwarzania opcji %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Brak parametru dla %s" + +#: ../glib/goption.c:1979 +#, c-format +msgid "Unknown option %s" +msgstr "Nieznana opcja %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "uszkodzony obiekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "błąd wewnętrzny lub uszkodzony obiekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "brak pamięci" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "osiągnięto limit wyjątku" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "wzorzec zawiera elementy nieobsługiwane w dopasowywaniu częściowym" + +#: ../glib/gregex.c:288 +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:297 +msgid "recursion limit reached" +msgstr "osiągnięto limit rekurencji" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "nieprawidłowa kombinacja flag nowych linii" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "błędne wyrównanie" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "krótki UTF-8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "pętla rekurencji" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "nieznany błąd" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ na końcu wzoru" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c na końcu wzoru" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "nierozpoznany znak po \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "liczby w operatorze {} nie są w kolejności" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "liczba za duża w kwantyfikatorze {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "brak kończącego znaku \"]\" dla klasy znaku" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "nieprawidłowa sekwencja sterująca w klasie znaku" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "zakres klasy znaków nie jest w kolejności" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nic do powtórzenia" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "nieoczekiwane powtórzenie" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "nierozpoznany znak po (? lub (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "brak znaku kończącego )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "nawiązanie do nieistniejącego podwzoru" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "brakujący znak \")\" po komentarzu" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "wyrażenie regularne jest za duże" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "uzyskanie pamięci się nie powiodło" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "znak ) bez znaku otwierającego (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "przepełnienie kodu" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "nierozpoznany znak po (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "asercja \"lookbehind\" nie ma stałej długości" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "błędna liczba lub nazwa za (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "zależna grupa zawiera więcej niż dwie gałęzie" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "za (?( oczekiwano asercji" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "po (?R lub (?[+-]cyfry musi następować znak )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nieznana nazwa klasy POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "elementy porównujące POSIX nie są obsługiwane" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "wartość znaku w sekwencji \\x{...} jest za duża" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "nieprawidłowy warunek (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "znak \\C nie jest dozwolony w asercji \"lookbehind\"" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "znaki sterujące \\L, \\l, \\N{nazwa}, \\U i \\u nie są obsługiwane" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "wywołanie rekurencyjne mogło prowadzić do pętli nieskończonej" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "nierozpoznany znak po (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "brak terminatora w nazwie podwzoru" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dwa podwzory mają tę samą nazwę" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "błędna sekwencja \\P lub \\p" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nieznana nazwa właściwości za \\P lub \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nazwa podwzoru jest za długa (maksymalnie 32 znaki)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "za dużo nazwanych podwzorów (maksymalnie 10000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "wartość ósemkowa jest większa niż \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "przekroczono przestrzeń roboczą kompilacji" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "nie znaleziono wcześniej sprawdzonego podwzorca" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "grupa DEFINE zawiera więcej niż jedną gałąź" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "niespójne opcje NEWLINE" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"po \\g nie następuje nazwa lub liczba w nawiasach, nawiasach ostrych, " +"cytowana, ani zwykła liczba" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "liczbowe odniesienie nie może wynosić zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "parametr nie jest dozwolony dla (*ACCEPT), (*FAIL) lub (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "nie rozpoznano (*VERB)" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "liczba jest za duża" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "brak nazwy podwzoru po (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "oczekiwano cyfry po (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] jest nieprawidłowym znakiem danych w trybie zgodności z językiem JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "różne nazwy dla podwzorów tej samej liczby nie są dozwolone" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) musi posiadać parametr" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "po \\c musi być znak ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"po \\k nie następuje nazwa w nawiasach, nawiasach ostrych, ani cytowana" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N nie jest obsługiwane w klasie" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "za dużo odniesień naprzód" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nazwa jest za długa w (*MARK), (*PRUNE), (*SKIP) lub (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "wartość znaku w sekwencji \\u.... jest za duża" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Błąd podczas dopasowywania wyrażenia regularnego %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteka PCRE została skompilowana bez obsługi UTF-8" + +#: ../glib/gregex.c:1323 +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:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Biblioteka PCRE została skompilowana za pomocą niezgodnych opcji" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Błąd podczas optymalizowania wyrażenia regularnego %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "oczekiwano cyfry szesnastkowej lub znaku \"}\"" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "oczekiwano cyfry szesnastkowej" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "brak znaku \"<\" w odniesieniu symbolicznym" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "niezakończona referencja symboliczna" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referencja symboliczna o zerowej długości" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "oczekiwano cyfry" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "niedozwolona referencja symboliczna" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "pominięto końcowe \"\\\"" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "nieznana sekwencja sterująca" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Cytowany znak nie rozpoczyna się znakiem cytowania" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Tekst jest pusty (lub zawiera tylko spacje)" + +#: ../glib/gspawn.c:203 +#, 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:362 +#, 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:853 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Proces potomny został zakończony z kodem %ld" + +#: ../glib/gspawn.c:861 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Proces potomny został zakończony sygnałem %ld" + +#: ../glib/gspawn.c:868 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Proces potomny został zatrzymany sygnałem %ld" + +#: ../glib/gspawn.c:875 +#, c-format +msgid "Child process exited abnormally" +msgstr "Proces potomny został nieprawidłowo zakończony" + +#: ../glib/gspawn.c:1280 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, 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.c:1348 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Rozdzielenie procesu (%s) się nie powiodło" + +#: ../glib/gspawn.c:1496 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Zmiana katalogu na \"%s\" (%s) się nie powiodła" + +#: ../glib/gspawn.c:1506 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Wykonanie procesu potomnego \"%s\" (%s) się nie powiodło" + +#: ../glib/gspawn.c:1516 +#, 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:1525 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Rozdzielenie procesu potomnego (%s) się nie powiodło" + +#: ../glib/gspawn.c:1533 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Podczas wykonywania procesu potomnego \"%s\" wystąpił nieznany błąd" + +#: ../glib/gspawn.c:1557 +#, 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/gspawn.c:1630 ../glib/gspawn-win32.c:300 +#, 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:283 +msgid "Failed to read data from child process" +msgstr "Odczytanie danych z procesu potomnego się nie powiodło" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nieprawidłowa sekwencja w środowisku: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nieprawidłowy katalog roboczy: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Wykonanie programu pomocniczego (%s) się nie powiodło" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Znak jest poza zakresem dla UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Nieprawidłowa sekwencja na wejściu konwersji" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Znak jest poza zakresem dla UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajty" +msgstr[2] "%u bajtów" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajt" +msgstr[1] "%s bajty" +msgstr[2] "%s bajtów" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" 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.po b/po/ps.po new file mode 100644 index 0000000..ef0dbac --- /dev/null +++ b/po/ps.po @@ -0,0 +1,3744 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2009-04-12 17:07-0800\n" +"Last-Translator: \n" +"Language-Team: Pashto \n" +"Language: ps\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "په اومتوک درکموندونو کې کومه سمه ليکنښه دوتنه ونه موندل شوه" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "لپاره يوه ليکنښه د مخکې نه شته دی URI '%s' د" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "لپاره کومه ليکنښه ونه مونل شوه URI '%s' د" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "ناسم دی URI '%s'" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "ناسم کوربه نوم" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "غ.م." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "غ.و." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A د %Y د %B %e، %Z %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "د %Y د %B %e" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "‫%I:%M:%S %p‬" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "جنوري" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "فبروري" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "مارچ" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "اپریل" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "مې" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "جون" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "جولاي" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "جنو" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "فبر" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "مار" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "اپر" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "مـې" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "جون" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "جول" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "دوشنبه" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "سه‌شنبه" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "چارشنبه" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "پنجشنبه" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "جمعه" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "شنبه" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "یکشنبه" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "د." + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "س." + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "چ." + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Ù¾." + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ج." + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Ø´." + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ی." + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "%s :درکموند پرانيستلو کې ستونزه '%s'" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "%s :دوتنې نه لوستلو کې پاتې راغی '%s' د" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "%s :دوتنه پرانيستلو کې پاتې راغی '%s'" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "%s :دوتنې جوړولو کې پاتې راغی '%s' د" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f م ب" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f Ú« ب" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f م ب" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Ú« ب" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f Ú© ب" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f Ú© ب" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "%s :په لوستلو کې پاتې راغی '%s' د پېلامي تړنې" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "اندرغل څيز" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "دنننۍ تېروتنه يا اندرغل څيز" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "له ياده بهر" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "دنننۍ تېروتنه" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "ناپېژندلې تېروتنه" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "ليکنه تشه وه (يا يوازې سپينه تشه يې لرله)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "د ماشوم بهير نه د اومتوک په لوستلو کې پاتې راغی" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "(%s) درکموند ته بدلېدلو کې پاتې راغی '%s'" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "(%s) د ماشوم بهيرپه پېلولو کې پاتې راغی" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "%s :ناسم کړنلار نوم" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "%s :ناسم کارونې درکموند" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "په پېلولو کې پاتې راغی (%s) د مرستندويه کړنلار" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr ":کارونه" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[...غوراوی]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr ":مرسته غوراوي" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "مرسته غوراوي ښودل" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "ټول مرسته غوراوي ښودل" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr ":کاريال غوراوي" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "صحيح ارزښت له سيمې بهر دی '%s' لپاره د %s د" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "%s ناپېژندلې غوراوی" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "ساده دوتنه نه ده" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "دوتنه تشه ده" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "%s :ناسم ډله نوم" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "کيلۍ دوتنه د کومې ډلې سره نه پېليږي" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "%s :ناسم کيلۍ نوم" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "لري '%s' کيلۍ دوتنه ناسمه کوډييزونه" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ډله نه لري '%s' کيلۍ دوتنه" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "کيلۍ نه لري '%s' کيلۍ دوتنه" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "کيلۍ نه لري '%s' ډله کې '%s' کيلۍ دوتنه په" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ارزښت د شمېرې په توګه نه شي ژباړل کېدی '%s'" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "د سيمې نه بهر دی '%s' صحيح ارزښت" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "چار بند شو" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "ډول %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "ناپېژندلی ډول" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "%s :درکموند پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "%s د پوښۍ په جوړولو کې ستونزه:" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "چار نه منل کيږي" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%s :درکموند پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "%s :درکموند پرانيستلو کې ستونزه '%s'" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "اندرغل څيز" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "بېنومه" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "نه شي جوړولی %s د کارن سرپاڼې دوتنه" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "لپاره دوديز پېژنداوی %s د" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "د درکموند پر سر نه شي لمېسلی" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "درکموند د درکموند پر سر نه شي لمېسلی" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "موخه دوتنه شتون لري" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "پېلامي تړنې نه منل کيږي" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "ځانګړې دوتنه نه شي لمېسلی" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "ناسم پېلامتړنې ارزښت ورکړل شوی" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "نه شي لرلی '%c' دوتنه نومونه" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "چار نه منل کيږي" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "%s ناسم دوتنه نوم" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "%s :د دوتنه غونډال خبرتياوو اخيستلو کې ستونزه" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "ولۍ درکموند نه شي بيانومولی" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "%s :دوتنه بيانومولو کې ستونزه" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "دوتنه نه شي بيانومولی، دوتنه نوم د مخکې نه شته" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "ناسم دوتنه نوم" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "درکموند نه شي پرانيستلی" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "%s د پوښۍ په جوړولو کې ستونزه:" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "%s :په لوستلو کې پاتې راغی '%s' د پېلامي تړنې" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "%s :د پېلامي تړنې په جوړولو کې ستونزه" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "%s :دوتنه خوځولو کې ستونزه" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "يو درکموند پر بل درکموند نه شي خوځولی" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "د شاتړ دوتنې جوړونه پاتې راغله" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "%s :د موخه دوتنې په ړنګولو کې ستونزه" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "د ماونټونو ترمنځ خوځېدنه نه منل کيږي" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (ناسمه کوډييزونه)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "%s :د خاوند په امستلو کې ستونزه" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "%s :د پرېښلو په امستلو کې ستونزه" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "%s :دوتنې نه لوستلو کې ستونزه" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "%s :د زوړ شاتړ تړون په ړنګولو کې ستونزه" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "%s :شاتړ لمېسې جوړولو کې ستونزه" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "%s :د لنډمهاله دوتنې په بيانومولو کې ستونزه" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه '%s'" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "موخه دوتنه يوه پوښۍ ده" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "موخه دوتنه ساده دوتنه نه ده" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "دوتنه په بهرنۍ توګه بدله شوې وه" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "%s :د زړې دوتنې ړنګولو کې ستونزه" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "%s :دوتنه لوسلو کې ستونزه '%s'" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "%s ناپېژندلې غوراوی" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "%s :دوتنې نه لوستلو کې ستونزه" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "%s :دوتنې جوړولو کې پاتې راغی '%s' د" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "%s :د اړونې پر مهال ستونزه" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "%s :دوتنې جوړولو کې پاتې راغی '%s' د" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "%s :دوتنې ړنګولو کې ستونزه" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "ناپېژندلې تېروتنه" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "پېلامي تړنې نه منل کيږي" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "%s :دوتنه پرانيستلو کې ستونزه" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "%s :دوتنه بيانومولو کې ستونزه" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "%s :د يونېکس نه په لوستلو کې تېروتنه" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "%s :د يونېکس په بندولو کې تېروتنه" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "دوتنه غونډال ولۍ" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "%s :پر يونېکس ليکلو کې تېروتنه" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "کاريال نه شي موندلی" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "%s :د کاريال په پېلولو کې تېروتنه" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "نه منل کيږي URIs" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "%s :دوتنې نه لوستلو کې ستونزه" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "%s :دوتنه بندولو کې ستونزه" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "%s :پر دوتنې ليکلو کې ستونزه" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "له ياده بهر" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "دنننۍ تېروتنه" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "ناسم کوربه نوم" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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.po b/po/pt.po new file mode 100644 index 0000000..eae2720 --- /dev/null +++ b/po/pt.po @@ -0,0 +1,4638 @@ +# glib's Portuguese Translation +# Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 glib +# Distributed under the same licence as the glib package +# Duarte Loreto , 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: 3.6\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-15 19:28+0100\n" +"PO-Revision-Date: 2012-09-15 19:30+0000\n" +"Last-Translator: Duarte Loreto \n" +"Language-Team: Portuguese \n" +"Language: pt\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valor de contagem demasiado grande passado para %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Procura não é suportada no fluxo base" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Incapaz de truncar um GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "O fluxo já se encontra fechado" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Truncar não é suportado no fluxo base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "A operação foi cancelada" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Objecto inválido, não inicializado" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Sequência multibyte inválida na entrada" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Espaço insuficiente no destino" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Sequência de bytes inválida na origem da conversão" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erro durante a conversão: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Não é suportada a inicialização cancelável" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Incapaz de abrir conversor de '%s' para '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "Tipo %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "Tipo de ficheiro %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials não está implementado neste SO" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Não existe suporte para GCredentials na sua plataforma" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Final precoce de fluxo inesperado" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Chave `%s' não suportada na entrada de endereço `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Endereço `%s' é inválido (é necessário um de caminho, tmpdir ou chaves " +"abstractas)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Combinação chave/valor sem sentido na entrada de endereço `%s'" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Erro no endereço `%s' - o atributo port está mal formado" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Erro no endereço `%s' - o atributo family está mal formado" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Elemento `%s' de endereço não contém dois-pontos (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Par chave/valor %d, `%s', no elemento `%s' de endereço, não contém um sinal " +"de igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Erro ao desfazer o escape de chave ou valor no par Chave/Valor %d, `%s', no " +"elemento `%s' de endereço" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Erro no endereço `%s' - o transporte unix requer que exactamente uma das " +"chaves `path' ou `abstract' esteja definida" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Erro no endereço `%s' - o atributo host está em falta ou mal formado" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Erro no endereço `%s' - o atributo port está em falta ou mal formado" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Erro no endereço `%s' - o atributo noncefile está em falta ou mal formado" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Erro ao auto-iniciar: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transporte `%s' desconhecido ou não suportado para o endereço `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Erro ao abrir o ficheiro nonce `%s': %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Erro ao ler do ficheiro nonce `%s': %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Erro ao ler do ficheiro nonce `%s', esperados 16 bytes, obtidos %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Erro ao escrever o conteúdo do ficheiro nonce `%s' para o fluxo:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "O endereço indicado está vazio" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Incapaz de criar um canal de mensagem quando em setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Incapaz de criar um canal de mensagem sem um id de máquina: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Erro ao criar uma linha de comando `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Introduza um qualquer caracter para fechar esta janela)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" +"Dbus de sessão não se encontra em execução e o início automático falhou" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Incapaz de determinar o endereço do canal de sessão (não implementado para " +"este SO)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Incapaz de determinar o endereço de canal a partir da variável de sessão " +"DBUS_STARTER_BUS_TYPE - valor `%s' desconhecido" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Incapaz de determinar o endereço do canal porque a variável de ambiente " +"DBUS_STARTER_BUS_TYPE não está definida" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tipo de canal %d desconhecido" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Falta de conteúdo inesperada ao tentar ler uma linha" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Falta de conteúdo inesperada ao tentar ler uma linha (em segurança)" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Esgotados todos os mecanismos de autenticação disponíveis (tentados: %s) " +"(disponíveis: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelado via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Erro ao obter informação do directório `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"As permissões do directório `%s' estão mal formadas. Esperado o modo 0700, " +"obtido 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Erro ao criar o directório `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Erro ao abrir o chaveiro `%s' para leitura: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Linha %d do chaveiro em `%s' com o conteúdo `%s' está mal formada" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O primeiro bloco da linha %d do chaveiro em `%s' com o conteúdo `%s' está " +"mal formado" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O segundo bloco da linha %d do chaveiro em `%s' com o conteúdo `%s' está mal " +"formado" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Incapaz de encontrar a cookie com o id %d no chaveiro em `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Erro ao apagar o ficheiro de acesso exclusivo `%s' abandonado: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Erro ao criar o ficheiro de acesso exclusivo `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Erro ao fechar o ficheiro de acesso exclusivo `%s' (não linkado): %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Erro ao desfazer a ligação do ficheiro de acesso exclusivo `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Erro ao abrir o chaveiro `%s' para escrita: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" +"(Adicionalmente, também falhou a libertação do ficheiro de acesso exclusivo " +"a `%s': %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "A ligação está fechada" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Foi atingido o tempo limite de espera" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Foram encontrados parâmetros não suportados ao construir a ligação de cliente" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Não existe o interface `org.freedesktop.DBus.Properties' no objecto no " +"caminho %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Erro ao definir a propriedade `%s': Esperado o tipo `%s' mas obtido o `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Não existe a propriedade `%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "A propriedade `%s' não pode ser lida" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "A propriedade `%s' não pode ser escrita" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Não existe o interface `%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Não existe o interface" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Não existe o interface `%s' no objecto no caminho %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Não existe o método `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Tipo de mensagem, `%s', não corresponde ao tipo `%s' esperado" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Já existe um objecto exportado para o interface %s em %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "O método `%s' devolveu o tipo `%s', mas era esperado `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "O método `%s' no interface `%s' com a assinatura `%s' não existe" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Já existe uma sub-árvore exportada para %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tipo é INVÁLIDO" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Mensagem METHOD_CALL: Falta campo de cabeçalho PATH ou MEMBER" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Mensagem ETHOD_RETURN: Falta campo de cabeçalho REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Mensagem ERROR: Falta campo de cabeçalho REPLY_SERIAL ou ERROR_NAME" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Mensagem SIGNAL: Falta campo de cabeçalho PATH, INTERFACE ou MEMBER" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Mensagem SIGNAL: O campo de cabeçalho PATH está a utilizar o valor " +"reservado /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Mensagem SIGNAL: O campo de cabeçalho INTERFACE está a utilizar o valor " +"reservado org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Tentativa de ler %lu byte mas obtido EOF" +msgstr[1] "Tentativa de ler %lu bytes mas obtido EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Esperada uma expressão em UTF-8 válida mas encontrados bytes inválidos no " +"deslocamento de bytes %d (comprimento da expressão é %d). A expressão UTF-8 " +"válida até esse ponto era `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Esperado o byte NUL após a expressão `%s' mas encontrado o byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Valor processado `%s' não é um caminho de objecto D-Bus válido" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Valor processado `%s' não é uma assinatura D-Bus válida" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Encontrado um vector de %u byte de comprimento. Tamanho máximo é 2<<26 bytes " +"(64MiB)." +msgstr[1] "" +"Encontrado um vector de %u bytes de comprimento. Tamanho máximo é 2<<26 " +"bytes (64MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Valor processado `%s' para variante não é uma assinatura D-Bus válida" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Erro ao des-serializar GVariant com a expressão de tipo `%s' do formato de " +"ligação D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor de 'endian' inválido. Esperado 0x6c ('l') ou 0x42 ('B') mas encontrado " +"o valor 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versão principal de protocolo inválida. Esperada 1 mas encontrada %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Assinatura de cabeçalho com a assinatura `%s' encontrada mas o corpo da " +"mensagem é vazio" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Valor processado `%s' não é uma assinatura D-Bus válida (para corpo)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Nenhum cabeçalho de assinatura na mensagem mas o corpo da mensagem tem %u " +"byte" +msgstr[1] "" +"Nenhum cabeçalho de assinatura na mensagem mas o corpo da mensagem tem %u " +"bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Incapaz de des-serializar a mensagem: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Erro ao serializar GVariant com a expressão de tipo `%s' para o formato de " +"ligação D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Mensagem tem %d descritores de ficheiros mas o campo de cabeçalho indica %d " +"descritores de ficheiros" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Incapaz de serializar a mensagem: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"O corpo da mensagem tem a assinatura `%s' mas não existe cabeçalho de " +"assinatura" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"O corpo da mensagem tem o tipo de assinatura `%s' mas a assinatura no campo " +"de cabeçalho é `%s'" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"O corpo da mensagem está vazio mas a assinatura no campo de cabeçalho é `" +"(%s)'" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Resposta de erro com corpo do tipo `%s'" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Resposta de erro com corpo vazio" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Incapaz de obter o perfil de Equipamento: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Incapaz de ler /var/lib/dbus/machine-id ou /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Erro ao invocar StartServiceByName para %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Resposta %d inesperada do método StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Incapaz de invocar o método; proxy é para um nome conhecido sem um dono e " +"proxy foi construída com o parâmetro G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Não é suportado nome de espaço abstracto" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Incapaz de especificar ficheiro nonce ao criar um servidor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Erro ao escrever no ficheiro nonce em `%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "A expressão `%s' não é um GUID D-Bus válido" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Incapaz de escutar no transporte não suportado `%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMANDO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Comandos:\n" +" help Apresenta esta informação\n" +" introspect Realiza introspecção de um objecto remoto\n" +" monitor Monitoriza um objecto remoto\n" +" call Invoca um método num objecto remoto\n" +" emit Emite um sinal\n" +"\n" +"Utilize \"%s COMMAND --help\" para obter ajuda sobre cada comando.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Erro: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Erro ao processar XML de introspecção: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Ligar ao bus de sistema" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Ligar ao bus de sessão" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Ligar ao endereço D-Bus especificado" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opções de Destino da Ligação:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opções que especificam o destino da ligação" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nenhum destino de ligação especificado" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Múltiplos destinos de ligação especificados" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Aviso: De acordo com os dados de introspecção, o interface `%s' não existe\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Aviso: De acordo com os dados de introspecção, o método `%s' não existe no " +"interface `%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Destino opcional para o sinal (nome único)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Caminho do objecto sobre o qual emitir sinal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Nome do sinal e da interface" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Emitir um sinal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Erro ao se ligar: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Erro: caminho de objecto não especificado.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Erro: %s não é um caminho de objecto válido\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Erro: sinal não especificado.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Erro: sinal tem de ser o nome completo (fully-qualified).\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Erro: %s não é um nome de interface válido\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Erro: %s não é um nome de membro válido\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Erro: %s não é um nome único de canal (bus) válido.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Erro ao processar o parâmetro %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Erro ao despejar a ligação: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nome de destino no qual invocar o método" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Caminho do objecto no qual invocar o método" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Método e nome de interface" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Tempo limite em segundos" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Invocar um método num objecto remoto." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Erro: Destino não está especificado\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Erro: Caminho de objecto não está especificado\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Erro: Nome de método não é especificado\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Erro: Nome de método `%s' é inválido\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Erro ao processar o parâmetro %d do tipo `%s': %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nome do destino sobre o qual realizar a introspecção" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Caminho do objecto sobre o qual realizar a introspecção" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Imprimir XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Realizar introspecção dos filhos" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Apenas imprimir propriedades" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Realizar a introspecção de um objecto remoto." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nome do destino a monitorizar" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Caminho do objecto a monitorizar" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Monitorizar um objecto remoto." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sem nome" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "Ficheiro de área de trabalho não especifica campo Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Incapaz de encontrar a consola necessária à aplicação" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Informação da aplicação não possui um identificador" + +#: ../gio/gdesktopappinfo.c:2069 +#, 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:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Definição personalizada de %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "a unidade não implementa ejectar ou eject_with_operation" + +#: ../gio/gdrive.c:543 +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:746 +msgid "drive doesn't implement start" +msgstr "a unidade não implementa a reprodução" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "a unidade não implementa o parar" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "O suporte TLS não está disponível" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperado um GEmblem para o GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Montagem contida não existe" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Incapaz de copiar sobre um directório" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Incapaz de copiar um directório sobre um directório" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Ficheiro de destino já existe" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Incapaz de copiar directório recursivamente" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Dividir ficheiros não é suportado" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erro ao dividir o ficheiro: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Incapaz de copiar ficheiro especial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Dado um valor de atalho inválido" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Não existe suporte para o Lixo" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nomes de ficheiros não podem conter '%c'" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "unidade não implementa a montagem" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Não existe nenhuma aplicação registada para gerir este ficheiro" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumerador está fechado" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Enumerador de ficheiro tem uma operação por terminar" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Fluxo não suporta query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Fluxo não suporta procura" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Fluxo de entrada não permite truncar" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Fluxo não suporta truncar" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número incorrecto de blocos (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Nenhum tipo para o nome da classe %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s não implementa o interface GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s não possui uma classe" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versão mal-formado: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Incapaz de manipular a versão especificada da codificação do ícone" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nenhum endereço especificado" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Comprimento %u é demasiado extenso para um endereço" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Endereço tem bits definidos para lá do comprimento do prefixo" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Incapaz de processar '%s' como a máscara do endereço IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Espaço insuficiente para o endereço do socket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Endereço de socket não suportado" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Fluxo tem uma operação por terminar" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elemento <%s> não é permitido dentro de <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elemento <%s> não é permitido no nível de topo" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "O ficheiro %s surge várias vezes no recurso" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Falha ao localizar '%s' em qualquer directório de origem" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Falha ao localizar '%s' no directório actual" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Opção de processamento \"%s\" desconhecida" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Falha ao criar o ficheiro temporário: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Erro ao processar o ficheiro de entrada com o xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Erro ao processar o ficheiro de entrada com o to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Erro ao ler o ficheiro %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Erro ao comprimir o ficheiro %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "Não pode surgir texto dentro de <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "nome do ficheiro de saída" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FICHEIRO" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"O directório de onde ler os ficheiros (por omissão é o directório actual)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTÓRIO" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Gerar o resultado no formato seleccionado pela extensão do nome do ficheiro " +"de saída" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Gerar o cabeçalho de código" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Gerar o código-fonte utilizado para ligar o ficheiro de recurso ao seu código" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Gerar lista de dependências" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Não criar e registar um recurso automaticamente" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Nome do identificador C utilizado no código fonte gerado" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compilar a especificação de um recurso num ficheiro de recursos.\n" +"Ficheiros de especificação de recursos têm de ter a extensão .gresource." +"xml,\n" +"e o ficheiro de recurso tem a extensão .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Deverá indicar apenas um nome de ficheiro\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "Não são permitidos nomes vazios" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nome '%s' inválido: nomes têm de começar com uma letra minúscula" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nome '%s' inválido: caracter '%c' inválido; apenas são permitidas letras " +"minúsculas, números e um traço ('-')." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"nome '%s' inválido: não são permitidos dois traços ('--') consecutivos." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "nome '%s' inválido: o último caracter não pode ser um traço ('-')." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nome '%s' inválido: tamanho máximo é 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "não é possível adicionar chaves a um esquema 'list-of'" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" sobrepõe-se a no ; utilize " +" para alterar o valor" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"exactamente um de 'type', 'enum' ou 'flags' tem de ser especificado como um " +"atributo de " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (ainda) não definido." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "expressão de tipo GVariante '%s' inválida" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " especificado mas o esquema não estende nada" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "nenhum a sobrepor" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " estende esquema '%s' que ainda não existe" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " é uma lista do esquema '%s' que ainda não existe" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Não é possível ser uma lista de um esquema com um caminho" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Incapaz de estender um esquema com um caminho" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" é uma lista, que estende o que não é uma " +"lista" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" estende mas '%s' " +"não estende '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "um caminho, se indicado, tem de começar e terminar com uma barra" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "o caminho de uma lista tem de terminar com ':/'" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> já especificado" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Elemento <%s> não é permitido no nível de topo" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "Foi especificado --strict; a terminar.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Todo este ficheiro foi ignorado.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "A ignorar este ficheiro.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nenhuma chave `%s' no esquema `%s' tal como especificado no ficheiro de " +"sobreposição `%s'" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; a ignorar a sobreposição para esta chave.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " e foi especificado o modo --strict; a terminar.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"erro ao processar a chave `%s' no esquema `%s' tal como especificado no " +"ficheiro de sobreposição `%s': %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "A ignorar sobreposição para esta chave.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"sobreposição para a chave `%s' no esquema `%s' no ficheiro de sobreposição `" +"%s' está fora do intervalo indicado no esquema" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"sobreposição para a chave `%s' no esquema `%s' no ficheiro de sobreposição `" +"%s' não pertence à lista de opções válidas" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "onde armazenar o ficheiro gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Abortar em qualquer erro nos esquemas" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Não escrever o ficheiro gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Não forçar restrições de nomes de chaves" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compilar todos os ficheiros de esquema GSettings numa cache de esquemas.\n" +"Ficheiros de esquema têm de ter a extensão .gschema.xml,\n" +"e o ficheiro de cache é designado gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Deverá indicar apenas um nome de directório\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Nenhum ficheiro de esquema encontrado: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "inactivo.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "removido o ficheiro de resultado existente.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de ficheiro %s inválido" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Erro ao obter a informação do sistema de ficheiros: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Incapaz de renomear o directório raiz" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erro ao renomear o ficheiro: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Incapaz de renomear o ficheiro, o nome já existe" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nome de ficheiro inválido" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Incapaz de abrir o directório" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Erro ao abrir o ficheiro: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Erro ao remover o ficheiro: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erro ao enviar o ficheiro para o Lixo: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Incapaz de criar o directório de Lixo %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Incapaz de encontrar o directório de topo para o Lixo" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Incapaz de encontrar ou criar o directório de Lixo" + +#: ../gio/glocalfile.c:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Incapaz de enviar o ficheiro para o Lixo: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "erro interno" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erro ao criar o directório: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "O sistema de ficheiros não suporta atalhos" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erro ao criar atalho: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Erro ao mover o ficheiro: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Incapaz de mover um directório sobre um directório" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Falha ao criar o ficheiro de cópia de segurança" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erro ao remover o ficheiro de destino: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Não é suportado mover entre montados" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Valor do atributo tem de ser não-NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo inválido (esperada uma expressão)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Nome de atributo extendido inválido" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Erro ao definir o atributo extendido '%s': %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (codificação inválida)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Erro ao obter informação para o ficheiro '%s': %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Erro ao obter informação sobre o descritor do ficheiro: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo inválido (esperado um uint32)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo inválido (esperado um uint64)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo inválido (esperado uma expressão byte)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Incapaz de definir permissões em atalhos simbólicos" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erro ao definir as permissões: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erro ao definir o dono: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "atalho tem de ser não-NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erro ao definir o atalho: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "Erro ao definir o atalho: ficheiro não é um atalho" + +#: ../gio/glocalfileinfo.c:2223 +#, 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:2246 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux tem de ser não-NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erro ao definir o contexto SELinux: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "O SELinux não está activo neste sistema" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Não é suportada a definição do atributo %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erro ao ler do ficheiro: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erro ao procurar no ficheiro: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Erro ao fechar o ficheiro: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erro ao escrever no ficheiro: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erro ao renomear ficheiro temporário: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erro ao truncar ficheiro: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erro ao abrir o ficheiro '%s': %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Ficheiro de destino é um directório" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "O ficheiro de destino não é um ficheiro comum" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "O ficheiro foi alterado externamente" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erro ao remover o ficheiro antigo: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Fornecido um GSeekType inválido" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Pedido de procura inválido" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Incapaz de truncar um GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Fluxo de saída de memória não é redimensionável" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Falha ao redimensionar fluxo de saída de memória" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Pedida uma procura para antes do início do fluxo" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nome de máquina '%s' contém '[' mas não ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Rede inacessível" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Servidor inacessível" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Incapaz de criar o monitor de rede: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Incapaz de criar o monitor de rede: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Incapaz de obter o estado da rede: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Fluxo de saída não implementa a escrita" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Fluxo de origem já está fechado" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erro ao resolver '%s': %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erro ao realizar a resolução invertida de '%s': %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nenhum registo DNS do tipo pedido para '%s'" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporariamente indisponível para resolver '%s'" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erro ao resolver '%s'" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Dados incompletos recebidos para '%s'" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "O recurso em '%s' não existe" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Falha ao descomprimir o recurso em '%s'" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "O recurso em '%s' não é um directório" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Fluxo de entrada não implementa seek" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Imprimir a ajuda" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMANDO]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Lista secções que contêm recursos num FICHEIRO elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Lista recursos\n" +"Se for especificada uma SECÇÃO, apenas listar recursos nesta secção\n" +"Se for especificado um CAMINHO, apenas listar recursos que coincidam" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FICHEIRO [CAMINHO]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECÇÃO" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Listar recursos com detalhes\n" +"Se for especificada uma SECÇÃO, apenas listar recursos nesta secção\n" +"Se for especificado um CAMINHO, apenas listar recursos que coincidam\n" +"Detalhes incluem a secção, tamanho e compressão" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extrair um ficheiro de recurso para a consola" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "CAMINHO FICHEIRO" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Comando %s desconhecido\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"utilização:\n" +" gresource [--section SECÇÃO] COMANDO [ARGS...]\n" +"\n" +"Comandos:\n" +" help Apresenta esta informação\n" +" sections Lista secções de recursos\n" +" list Lista recursos\n" +" details Lista recursos com detalhes\n" +" extract Extrai um recurso\n" +"\n" +"Utilize 'gresource help COMANDO' para obter ajuda detalhada.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilização:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumentos:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECÇÃO Um nome (opcional) de secção elf\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMANDO O comando (opcional) a ser explicado\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" +" FICHEIRO Um ficheiro elf (um binário ou uma biblioteca partilhada)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FICHEIRO Um ficheiro elf (um binário ou uma biblioteca partilhada)\n" +" ou um ficheiro de recurso compilado\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CAMINHO]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CAMINHO Um caminho (opcional) de recurso (pode ser parcial)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CAMINHO" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CAMINHO Um caminho de recurso\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Não existe o esquema '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "O esquema '%s' não é realocável (não pode ser especificado caminho)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "O esquema '%s' é realocável (tem de ser especificado o caminho)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Indicado um caminho vazio.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "O caminho tem de começar com uma barra (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "O caminho tem de terminar com uma barra (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "O caminho não pode conter duas barras adjacentes (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Não existe a chave '%s'\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "O valor especificado encontra-se fora do intervalo válido\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Listar os esquemas instalados (não-realocáveis)" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Listar os esquemas instalados realocáveis" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Listar as chaves no ESQUEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:CAMINHO]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Listar os filhos de ESQUEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Listar as chaves e valores, recursivamente\n" +"Se não for indicado um ESQUEMA, listar todas as chaves\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:CAMINHO]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Obter o valor da CHAVE" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:CAMINHO] CHAVE" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Consultar o intervalo de valores válidos para a CHAVE" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Definir o valor da CHAVE com o VALOR" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:CAMINHO] CHAVE VALOR" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Repor o valor por omissão de CHAVE" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Repor todas as chaves no ESQUEMA para os seus valores por omissão" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Verificar se é possível definir o valor de CHAVE" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizar a ocorrência de alterações da CHAVE.\n" +"Se nenhuma chave for especificada, monitorizar todas as chaves do ESQUEMA.\n" +"Utilizar ^C para parar de monitorizar.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:CAMINHO] [CHAVE]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilização:\n" +" gsettings [--schemadir DIRESQUEMAS] COMANDO [ARGS...]\n" +"\n" +"Comandos:\n" +" help Apresenta esta informação\n" +" list-schemas Lista os esquemas instalados\n" +" list-relocatable-schemas Lista os esquemas realocáveis\n" +" list-keys Lista as chaves num esquema\n" +" list-children Lista os filhos de um esquema\n" +" list-recursively Lista as chaves e valores, recursivamente\n" +" range Consulta o intervalo de uma chave\n" +" get Obtém o valor de uma chave\n" +" set Define o valor de uma chave\n" +" reset Repõe o valor por omissão de uma chave\n" +" reset-recursively Repor todos os valores de um esquema\n" +" writable Verifica se é possível alterar a chave\n" +" monitor Monitoriza por alterações\n" +"\n" +"Utilize 'gsettings help COMANDO' para obter ajuda detalhada.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilização:\n" +" gsettings [--schemadir DIRESQUEMAS] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " DIRESQUEMAS Um directório onde procurar por esquemas adicionais\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +"Argumentos:\n" +" ESQUEMA O nome do esquema\n" +" CAMINHO O caminho, para esquemas realocáveis\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " CHAVE A chave (opcional) dentro do esquema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " CHAVE A chave dentro do esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALOR O valor a definir\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Indicado um nome de esquema vazio\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Socket inválido, não inicializado" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket inválido, a inicialização falhou devido a: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket já está fechado" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Tempo expirou no I/O de socket" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "a criar o GSocket do fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Incapaz de criar socket: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Foi especificada uma família desconhecida" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Foi especificado um protocolo desconhecido" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "Incapaz de obter o endereço local: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "Incapaz de obter o endereço remoto(): %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "incapaz de escutar: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erro ao ligar-se ao endereço: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Erro ao juntar-se a um grupo multicast: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Erro ao sair do grupo multicast: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Suporte indisponível para multicast específico da origem" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erro ao aceitar a ligação: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Ligação em curso" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Incapaz de obter o erro pendente: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erro ao receber os dados: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Erro ao enviar os dados: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Incapaz de desligar o socket: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erro ao fechar o socket: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "A aguardar pela condição do socket: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Erro ao enviar a mensagem: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage não é suportada em Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erro ao receber a mensagem: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials não implementado neste SO" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Incapaz de se ligar ao servidor de proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Incapaz de se ligar a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "incapaz de se ligar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Erro desconhecido ao se ligar" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Não há suporte à realização de proxy sobre ligações não-TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "O protocolo de proxy '%s' não é suportado." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "A escuta já se encontra fechada" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Socket adicionado está fechado" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 não suporta o endereço IPv6 '%s'" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Utilizador demasiado extenso para o protocolo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Nome de máquina '%s' é demasiado extenso para o protocolo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "O servidor não é um servidor de proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "A ligação através do servidor SOCKSv4 foi rejeitada" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "O servidor não é um servidor de proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "A proxy SOCKSv5 requer autenticação." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"O SOCKSv5 requer um método de autenticação que não é suportado pelo GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Utilizador ou senha demasiado extenso para o protocolo SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "Falha na autenticação SOCKSv5 devido a utilizador ou senha incorrecto." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Nome de máquina '%s' demasiado extenso para o protocolo SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "O servidor de proxy SOCKSv5 utiliza um tipo de endereço desconhecido." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Erro interno de servidor de proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Ligação SOCKSv5 não é permitida pelo conjunto de regras." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Máquina inacessível através do servidor SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Rede inacessível através da proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Ligação recusada através da proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Proxy SOCKSv5 não suporta o comando 'connect'." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Proxy SOCKSv5 não suporta o tipo de endereço indicado." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Erro de proxy SOCKSv5 desconhecido." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Incapaz de manipular a versão %d da codificação GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Incapaz de desencriptar a chave privada codificada PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Incapaz de encontrar uma chave privada codificada PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Incapaz de processar a chave privada codificada PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Incapaz de encontrar um certificado codificado PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Incapaz de processar certificado codificado PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Esta é a última oportunidade para introduzir correctamente a senha antes de " +"lhe ser vedado o acesso." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Foram introduzidas várias senhas incorrectas e o seu acesso será vedado após " +"falhas adicionais." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "A senha introduzida está incorrecta." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Era esperada 1 mensagem de controlo, %d recebidas" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Tipo inesperado de dados basilares" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Era esperado um fd, foram recebidos %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Recebido um fd inválido" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Erro ao enviar as credenciais: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Erro ao verificar se SO_PASSCRED está activo para o socket: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Comprimento de opção inesperado ao verificar se SO_PASSCRED está activo para " +"socket. Esperados %d bytes, obtidos %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Erro ao activar SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Deveria ler um único byte para receber credenciais mas foram lidos zero bytes" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Não eram esperadas mensagens de controlo, mas foram recebidas %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Erro ao desactivar SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Erro ao ler do descritor do ficheiro: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Erro ao fechar o descritor do ficheiro: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Raiz do sistema de ficheiros" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Erro ao escrever no descritor do ficheiro: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +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:276 +msgid "Can't find application" +msgstr "Incapaz de encontrar a aplicação" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Erro ao iniciar a aplicação: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Não são suportados URIs" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "alterações de associação não são suportadas em win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Criação de associação não é suportada em win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Erro ao ler do manipulador: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Erro ao fechar o manipulador: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Erro ao escrever no manipulador: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Memória livre insuficiente" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Necessita de mais dados" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Dados comprimidos inválidos" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Endereço onde escutar" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorado, para compatibilidade com GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Endereço de impressão" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Endereço de impressão em modo de consola" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Executar um serviço dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Argumentos incorrectos\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo '%s' inesperado para o elemento '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributo '%s' do elemento '%s' não foi encontrado" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Etiqueta '%s' inesperada, esperada a etiqueta '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Etiqueta '%s' inesperada dentro de '%s'" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Já existe um marcador para o URI '%s'" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Não foi encontrado nenhum marcador para o URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nenhum grupo definido no marcador para o URI '%s'" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Sequência de caracteres parcial no final da origem" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Incapaz de converter recurso '%s' para conjunto de caracteres '%s'" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI '%s' é inválido" + +#: ../glib/gconvert.c:1909 +#, 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:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "O URI '%s' contém caracteres incorrectamente mascarados" + +#: ../glib/gconvert.c:2020 +#, 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:2030 +msgid "Invalid hostname" +msgstr "Nome de máquina inválido" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Janeiro" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Fevereiro" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Março" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maio" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Junho" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Julho" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Agosto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Setembro" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Outubro" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembro" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Dezembro" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Fev" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ago" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Set" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Out" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dez" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "2ª Feira" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "3ª Feira" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "4ª Feira" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "5ª Feira" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "6ª Feira" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sábado" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Domingo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "2ª" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "3ª" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "4ª" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "5ª" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "6ª" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sáb" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Dom" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erro ao abrir o directório '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erro ao ler o ficheiro '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Ficheiro \"%s\" é demasiado grande" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falha ao ler do ficheiro '%s': %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falha ao abrir o ficheiro '%s': %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falha ao criar o ficheiro '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Modelo '%s' não contém XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falha ao ler o atalho '%s': %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Atalhos não são suportados" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Dados residuais não convertidos no buffer de leitura" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Canal termina num caracter parcial" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Não é um ficheiro comum" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo inválido: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Ficheiro de chave não começa com um grupo" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de chave inválida: %s" + +#: ../glib/gkeyfile.c:1288 +#, 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:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ficheiro de chave não possui um grupo '%s'" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ficheiro de chave não contém a chave '%s'" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Ficheiro de chave contém a chave '%s' no grupo '%s' que tem um valor que não " +"pode ser interpretado." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Chave '%s' no grupo '%s' tem o valor '%s' onde %s era esperado" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, 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:4242 +#, 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:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valor inteiro '%s' para além do limite permitido" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Incapaz de interpretar o valor '%s' como uma boleana." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Falha ao obter atributos do ficheiro '%s%s%s%s': falha no fstat(): %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Falha ao mapear %s%s%s%s: falha no mmap(): %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falha ao abrir o ficheiro '%s': falha no open(): %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na linha %d caracter %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' não é um nome válido " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' não é um nome válido: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na linha %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Detectada entidade vazia '&;'; entidades válidas são: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nome de entidade '%-.*s' é desconhecido" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Documento tem de começar com um elemento (ex. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, 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:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Documento estava vazio ou apenas continha espaços" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Documento terminou inesperadamente logo após um caracter menor que '<'" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Documento terminou inesperadamente dentro do nome de um elemento" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Documento terminou inesperadamente dentro do nome de um atributo" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Documento terminou inesperadamente dentro da etiqueta de abertura de um " +"elemento." + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Documento terminou inesperadamente dentro do valor de um atributo" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Utilização:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPÇÃO...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opções de Ajuda:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Apresentar as opções de ajuda" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Apresentar todas as opções de ajuda" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opções da Aplicação:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Incapaz de processar o valor inteiro '%s' para %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, 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:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Incapaz de processar o valor double '%s' para %s" + +#: ../glib/goption.c:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Erro ao processar a opção %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Argumento em falta para %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Opção %s desconhecida" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objecto corrompido" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "erro interno ou objecto corrompido" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "sem memória livre" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "limite de retroceder alcançado" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "alcançado o limite de recursividade" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinação inválida de parâmetros de quebra de linha" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "deslocação inválida" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 curto" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "recursão infinita" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "erro desconhecido" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ no final do padrão" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c no final do padrão" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "caracter desconhecido após \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "números fora da ordem no quantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "número demasiado grande no quantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "falta o ] de fecho da classe de caracter" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "sequência de escape inválida na classe de caracter" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "intervalo fora da ordem na classe de caracter" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nada a repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetição inesperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "caracter desconhecido após (? or (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "falta o ) de fecho" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referência a padrão inexistente" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "falta o ) após o comentário" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "expressão regular demasiado extensa" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "falha ao obter memória" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") sem um ( de abertura" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "código fora dos limites" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "caracter desconhecido após (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "asserção de verificação anterior não é de largura fixa" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "número ou nome mal formado após (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "grupo condicional contém mais de dois ramos" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "esperada uma asserção após (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ou (?[+-]números tem de ser seguido de )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nome de classe POSIX desconhecido" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "não são suportados os elementos de junção POSIX" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "valor do caracter na sequência \\x{...} é demasiado grande" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "condição inválida (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C não é permitido numa asserção de verificação anterior" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{nome}, \\U, e \\u não são suportados" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "chamada recursiva pode iterar indefinidamente" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "caracter desconhecido após (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "falta o terminador no nome do subpadrão" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dois subpadrões denominados têm o mesmo nome" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "sequência \\P ou \\p mal formada" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propriedade desconhecido após \\P ou \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nome do subpadrão é demasiado extenso (máximo de 32 caracteres)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "demasiados subpadrões denominados (máximo de 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "valor octal é maior do que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "derramou fora da área de trabalho de compilação" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "subpadrão referenciado previamente verificado não foi encontrado" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "grupo DEFINE contém mais de um ramo" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opções de NEWLINE inconsistentes" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g não é seguido de um nome ou número delimitado por chavetas, parentesis " +"ou aspas ou um número simples" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "uma referência numerada não pode ser zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "não é permitido um argumento para (*ACCEPT), (*FAIL), ou (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) não é reconhecido" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "número é demasiado grande" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "falta o nome do subpadrão após (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "esperado um dígito após (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] é um caracter de dados inválido no modo de compatibilidade JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "não são permitidos nomes diferentes para subpadrões do mesmo número" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) tem de ter um argumento" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c não pode ser seguido de um caracter ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k não é seguido de um nome delimitado por chavetas, parentesis ou aspas" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N não é suportado numa classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "demasiadas referências de reencaminhamento" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nome é demasiado extenso em (*MARK), (*PRUNE), (*SKIP), ou (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "valor do caracter na sequência \\u.... é demasiado grande" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Erro ao comparar a expressão regular %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteca PCRE está compilada sem suporte UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblioteca PCRE está compilada sem suporte para propriedades UTF8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Biblioteca PCRE está compilada com opções incompatíveis" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Erro ao optimizar a expressão regular %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "esperado um dígito hexadecimal ou '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "esperado um dígito hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "falta '<' na referência simbólica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "referência simbólica por terminar" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referência simbólica de tamanho zero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "esperado um dígito" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "referência simbólica ilegal" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "'\\' final a mais" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "sequência de escape desconhecida" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Texto citado não é iniciado com um caracter de aspa" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texto estava vazio (ou apenas continha espaços)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Falha ao ler dados de processo filho (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erro inesperado em waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Processo filho terminou com o código %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Processo filho morto com o sinal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Processo filho parado com o sinal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "O processo filho terminou anormalmente" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falha ao ler de canal filho (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falha ao efectuar fork (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falha ao ir para directório '%s' (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falha ao executar o processo filho \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falha ao efectuar fork de processo filho (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erro desconhecido ao executar processo filho \"%s\"" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Falha ao ler dados de processo filho" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Falha ao executar processo filho (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de aplicação inválido: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Expressão inválida no ambiente: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directório de trabalho inválido: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falha ao executar aplicação auxiliar (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Caracter fora do limite para UTF-8 " + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Sequência inválida na conversão da entrada" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Caracter fora do limite para UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Aplicação terminou anormalmente ao criar uma linha de comando `%s': %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "Linha de comando `%s' terminou com o estado diferente de zero %d: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Nenhum registo de serviço para '%s'" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "alcançado o limite da área de trabalho para sub-expressões vazias" + +#~ 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)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "não é permitido repetir um grupo DEFINE" + +#~ msgid "File is empty" +#~ msgstr "Ficheiro está vazio" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Esta opção será removida brevemente." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Erro ao verificar o ficheiro '%s': %s" + +#~ msgid "Error connecting: " +#~ msgstr "Erro ao se ligar: %s" + +#~ msgid "Error connecting: %s" +#~ msgstr "Erro ao se ligar: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "A implementação SOCKSv4 limita o nome de utilizador a %i caracteres" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "A implementação SOCKSv4a limita o nome de máquina a %i caracteres" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Erro ao ler de unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Erro ao fechar unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Erro ao escrever no unix: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Tipo de valor de resposta é incorrecto, obtido `%s', esperado `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "A tentar definir a propriedade %s do tipo %s mas, de acordo com o " +#~ "interface esperado, o tipo é %s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Esquema `%s' não foi especificado no ficheiro de sobreposição `%s'" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Comandos:\n" +#~ " help Apresenta esta informação\n" +#~ " get Obtém o valor de uma chave\n" +#~ " set Define o valor de uma chave\n" +#~ " reset Repõe o valor original de uma chave\n" +#~ " monitor Monitoriza alterações a uma chave\n" +#~ " writable Verifica se é possível definir o valor de uma chave\n" +#~ "\n" +#~ "Utilize '%s COMMAND --help' para obter ajuda para comandos individuais.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especifique o caminho para o esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumentos:\n" +#~ " ESQUEMA O id do esquema\n" +#~ " CHAVE O nome da chave\n" +#~ " VALOR O valor a definir para a chave, como um GVariant " +#~ "serializado\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "O valor da chave %s não pode ser definido\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitoriza por alterações a CHAVE e imprime os valores alterados.\n" +#~ "A monitorização continua até que o processo seja terminado." + +#~ msgid "Do not give error for empty directory" +#~ msgstr "Não dar erro para um directório" + +#~ 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 "" +#~ "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 "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.po b/po/pt_BR.po new file mode 100644 index 0000000..b32c970 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,4533 @@ +# Brazilian Portuguese translation of glib. +# Copyright (C) 2001-2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Gustavo Noronha Silva , 2001-2005 +# Leonardo Ferreira Fontenelle , 2006-2009. +# Vladimir Melo , 2007, 2009. +# Luiz Armesto , 2008. +# Og Maciel , 2008-2009, 2011. +# Henrique P Machado , 2008-2009. +# Fábio Nogueira , 2009. +# Fabrício Godoy , 2010. +# Djavan Fagundes , 2011. +# Adorilson Bezerra , 2011. +# Jonh Wendell , 2009, 2010, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-19 02:32+0000\n" +"PO-Revision-Date: 2012-09-19 03:39-0300\n" +"Last-Translator: Rafael Ferreira \n" +"Language-Team: Brazilian Portuguese \n" +"Language: pt_BR\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: Virtaal 0.6.1\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Valor muito alto passado para %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Não há suporte à busca no fluxo base" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Não é possível truncar GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "O fluxo já está fechado" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Não há suporte para truncar fluxo base" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "A operação foi cancelada" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Objeto inválido, não inicializado" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Sequência de bytes incompleta na entrada" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Sem espaço suficiente no destino" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Sequência de bytes inválida na entrada de conversão" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Erro durante a conversão: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Sem suporte a inicialização cancelável" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, 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\"" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Não foi possível abrir conversor de \"%s\" para \"%s\"" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "tipo %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "tipo de arquivo %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials não está implementado neste SO" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Não há suporte ao GCredentials para sua plataforma" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Fim do fluxo antes do esperado" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Não há suporte a chave \"%s\" na entrada de endereço \"%s\"" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"O endereço \"%s\" não é válido (é necessário exatamente um dentre: caminho, " +"diretório temporário ou chaves abstratas)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" +"Combinação de pares chave/valor sem sentido na entrada de endereço \"%s\"" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Erro no endereço \"%s\" - o atributo porta é inválido" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Erro no endereço \"%s\" - o atributo família é inválido" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "O elemento endereço \"%s\" não contém um dois-pontos (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"O par chave/valor %d, \"%s\", no elemento endereço \"%s\", não contém um " +"sinal de igual" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Erro ao distinguir a chave ou valor no par chave/valor %d, \"%s\", no " +"elemento endereço \"%s\"" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Erro no endereço \"%s\" - o transporte Unix requer exatamente uma das chaves " +"\"path\" ou \"abstract\" sejam definidas" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Erro no endereço \"%s\" - o atributo servidor está faltando ou é inválido" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Erro no endereço \"%s\" - o atributo porta está faltando ou é inválido" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Erro no endereço \"%s\" - o atributo noncefile está faltando ou é inválido" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Erro ao lançar automaticamente: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"O transporte \"%s\" para o endereço \"%s\" é desconhecido ou não há suporte" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Erro ao abrir arquivo nonce \"%s\": %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Erro ao ler arquivo nonce \"%s\": %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Erro ao ler arquivo nonce \"%s\". É esperado 16 bytes, mas foi obtido %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Erro ao escrever do arquivo nonce \"%s\" no fluxo:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "O endereço fornecido está vazio" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Não foi possível chamar um barramento de mensagens com setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Não foi possível chamar um barramento de mensagens sem um ID de máquina: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Erro ao chamar a linha de comandos \"%s\": " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Digite qualquer tecla para fechar esta janela)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "A sessão dbus não está em execução, e o início automático falhou" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Não foi possível determinar o endereço de barramento da sessão (sem " +"implementação para este SO)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Não foi possível determinar o endereço de barramento da variável de ambiente " +"DBUS_STARTER_BUS_TYPE, o valor \"%s\" é desconhecido" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Não foi possível determinar o endereço de barramento porque a variável de " +"ambiente DBUS_STARTER_BUS_TYPE não está definida" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "O tipo de barramento %d é desconhecido" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Falta de conteúdo inesperada ao tentar ler uma linha" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Falta de conteúdo inesperada ao tentar (seguramente) ler uma linha" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Foram esgotados todos mecanismos de autenticação disponíveis (tentado: %s) " +"(disponível: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Cancelado via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Erro ao obter informação para o diretório \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"As permissões no diretório \"%s\" são inválidas. É esperado 0700, mas foi " +"obtido 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Erro ao criar o diretório \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Erro ao abrir o chaveiro \"%s\" para leitura: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "A linha %d do chaveiro em \"%s\" com o conteúdo \"%s\" é inválida" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O primeiro símbolo da linha %d do chaveiro em \"%s\" com o conteúdo \"%s\" é " +"inválido" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"O segundo símbolo da linha %d do chaveiro em \"%s\" com o conteúdo \"%s\" é " +"inválido" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Não foi encontrado um anexo com o ID %d no chaveiro em \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Erro ao excluir o arquivo de bloqueio anterior \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Erro ao criar o arquivo de bloqueio \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Erro ao fechar o arquivo de bloqueio (desvinculado) \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Erro ao desvincular o arquivo de bloqueio \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Erro ao abrir o chaveiro \"%s\" para escrita: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Adicionalmente, liberar o bloqueio de \"%s\" também falhou: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "A conexão está fechada" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "O tempo limite foi alcançado" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Foram encontrados sinalizadores sem suporte ao construir uma conexão do lado " +"do cliente" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nenhuma interface \"org.freedesktop.DBus.Properties\" no objeto no caminho %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Erro ao definir a propriedade \"%s\": o tipo esperado é \"%s\", mas obteve " +"\"%s\"" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Nenhuma propriedade \"%s\"" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "A propriedade \"%s\" está sem leitura" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "A propriedade \"%s\" está sem escrita" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Nenhuma interface \"%s\"" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Nenhuma interface" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nenhuma interface \"%s\" no objeto no caminho %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Nenhum método \"%s\"" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "O tipo da mensagem, \"%s\", não equivale ao tipo esperado \"%s\"" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Um objeto já foi exportado para a interface %s em %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "O método \"%s\" retornou o tipo \"%s\", mas é esperado \"%s\"" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "O método \"%s\" na interface \"%s\" com a assinatura \"%s\" não existe" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Uma subárvore já foi exportada para %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "o tipo é INVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"Mensagem de METHOD_CALL: O campo de cabeçalho PATH ou MEMBER está faltando" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" +"Mensagem de METHOD_RETURN: O campo de cabeçalho REPLY_SERIAL está faltando" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Mensagem de ERROR: O campo de cabeçalho REPLY_SERIAL ou ERROR_NAME está " +"faltando" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Mensagem de SIGNAL: O campo de cabeçalho PATH, INTERFACE ou MEMBER está " +"faltando" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Mensagem de SIGNAL: O campo de cabeçalho PATH está usando o valor reservado /" +"org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Mensagem de SIGNAL: O campo de cabeçalho INTERFACE está usando o valor " +"reservado org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Ao tentar ler %lu byte obteve-se EOF (fim de arquivo)" +msgstr[1] "Ao tentar ler %lu bytes obteve-se EOF (fim de arquivo)" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Era esperado um texto UTF-8 válido, mas foi localizado bytes inválidos na " +"posição %d (tamanho do texto é %d). O texto UTF-8 válido até este ponto era " +"\"%s\"" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" +"Era esperado um byte NUL (nulo) após o texto \"%s\", mas foi localizado o " +"byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "O valor \"%s\" analisado não é um objeto de caminho D-Bus válido" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "O valor \"%s\" analisado não é uma assinatura D-Bus válida" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Foi encontrado um vetor com tamanho de %u byte. O tamanho máximo é de 2<<26 " +"bytes (64 MiB)." +msgstr[1] "" +"Foi encontrado um vetor com tamanho de %u bytes. O tamanho máximo é de 2<<26 " +"bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"O valor \"%s\" analisado para variante não é uma assinatura D-Bus válida" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Erro ao desserializar GVariant com o texto de tipo \"%s\" do formato " +"delimitado pelo D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valor identificador de endian inválido. Era esperado 0x6c ('l') ou 0x42 " +"('B'), mas foi localizado o valor 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Versão majoritária de protocolo inválida. Era esperado 1, mas foi localizado " +"%d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"O cabeçalho de assinatura foi localizado com a assinatura \"%s\", mas o " +"corpo da mensagem está vazio" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"O valor \"%s\" analisado não é uma assinatura D-Bus válida (para o corpo)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Nenhum cabeçalho de assinatura na mensagem, mas o corpo da mensagem tem %u " +"byte" +msgstr[1] "" +"Nenhum cabeçalho de assinatura na mensagem, mas o corpo da mensagem tem %u " +"bytes" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Não foi possível desserializar a mensagem: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Erro ao serializar GVariant com o texto de tipo \"%s\" para o formato " +"delimitado pelo D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"A mensagem possui %d descritores de arquivos, mas o campo de cabeçalho " +"indica %d descritores de arquivos" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Não foi possível serializar a mensagem: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"O corpo da mensagem tem a assinatura \"%s\", mas não há um cabeçalho de " +"assinatura" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"O corpo da mensagem tem o tipo de assinatura \"%s\", mas a assinatura no " +"campo de cabeçalho é \"%s\"" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"O corpo da mensagem está vazio, mas a assinatura no campo de cabeçalho é \"(%" +"s)\"" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Retorno de erro com o corpo de tipo \"%s\"" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Retorno de erro com o corpo vazio" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Não foi possível obter o perfil da máquina: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "" +"Não foi possível carregar /var/lib/dbus/machine-id ou /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Erro ao chamar StartServiceByName para %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Resposta %d inesperada do método StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Não foi possível chamar método; o proxy é para um nome conhecido sem um dono " +"e o proxy foi construído com o sinalizador " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Não há suporte a espaço de nome abstrato" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Não foi possível especificar um arquivo nonce ao criar um servidor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Erro ao escrever no arquivo nonce em \"%s\": %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "O texto \"%s\" não é válido para GUID D-Bus" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Não é possível escutar no transporte \"%s\" por falta de suporte" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMANDO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Comandos:\n" +" help Mostra esta informação\n" +" introspect Introspecção de um objeto remoto\n" +" monitor Monitora um objeto remoto\n" +" call Chama um método de um objeto remoto\n" +" emit Emite um sinal\n" +"\n" +"Use \"%s COMANDO --help\" para obter ajuda de cada comando.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Erro: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Erro ao analisar XML de introspecção: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Conectar ao barramento de sistema" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Conectar ao barramento de sessão" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Conectar ao endereço D-Bus escolhido" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opções de conexão de ponto final:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opções especificando a conexão de ponto final" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nenhuma conexão de ponto final especificada" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Múltiplas conexões de ponto final especificadas" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Aviso: De acordo com os dados de introspecção a interface \"%s\" não existe\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Aviso: De acordo com os dados de introspecção o método \"%s\" não existe na " +"interface \"%s\"\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Destino opcional para o sinal (nome único)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Caminho do objeto para emitir sinal" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Nome de sinal e de interface" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Emitir um sinal." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Erro ao conectar: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Erro: caminho do objeto não especificado\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Erro: %s não é um caminho de objeto válido\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Erro: sinal não especificado\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Erro: sinal deve ser o nome completamente qualificado\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Erro: %s não é um nome de interface válido\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Erro: %s não é um nome de membro válido\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Erro: %s não é um nome válido de barramento exclusivo.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Erro ao analisar o parâmetro %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Erro limpando conexão: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Nome do destino para chamar um método" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Caminho do objeto para chamar um método" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Nome de método e de interface" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Tempo limite em segundos" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Chamar um método no objeto remoto." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Erro: O destino não foi especificado\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Erro: O caminho do objeto não foi especificado\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Erro: O nome do método não foi especificado\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Erro: O nome do método \"%s\" é inválido\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Erro ao analisar o parâmetro %d do tipo \"%s\": %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Nome do destino para introspecção" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Caminho do objeto para introspecção" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Exibir XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Auto-examinar filhos" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Apenas imprimir as propriedades" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Introspecção em objeto remoto." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Nome do destino para monitorar" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Caminho do objeto para monitorar" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Monitorar um objeto remoto." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Sem nome" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "O arquivo da área de trabalho não especifica o campo Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Não é possível localizar o terminal requerido para o aplicativo" + +#: ../gio/gdesktopappinfo.c:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "A informação do aplicativo não possui um identificador" + +#: ../gio/gdesktopappinfo.c:2069 +#, 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:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Definição personalizada para %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "unidade não implementa ejetar ou eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "unidade não implementa verificação por mídia" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "unidade não implementa start" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "unidade não implementa stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Suporte TLS não disponível" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Esperado um GEmblem para o GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Ponto de montagem contido não existe" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Não é possível copiar sobre diretório" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Não é possível copiar diretório sobre diretório" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Arquivo alvo existe" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Não é possível copiar o diretório recursivamente" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Não há suporte a união de arquivos" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Erro ao unir o arquivo: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Não é possível copiar o arquivo especial" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Fornecido valor inválido de link simbólico" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Não há suporte para lixeira" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Nomes de arquivo não podem conter \"%c\"" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "volume não implementa montagem" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Nenhum aplicativo está registrado como manipulador deste arquivo" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "O enumerador está fechado" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "O enumerador do arquivo tem operação pendente" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Fluxo não tem suporte para query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Não há suporte à busca no fluxo" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Não é permitido truncar fluxo de entrada" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Não há suporte para truncar fluxo" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Número errado de tokens (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Sem tipo para a classe chamada %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "O tipo %s não implementa a interface GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "O tipo %s não tem classe" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Número de versão malformado: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Não é possível lidar com a versão fornecida da codificação do ícone" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nenhum endereço fornecido" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "O tamanho %u é muito longo para o endereço" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "O endereço contém bits ativos além do tamanho do prefixo (máscara)" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Não foi possível interpretar \"%s\" como uma máscara de endereço IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Sem espaço suficiente para o endereço do soquete" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Endereço de soquete não suportado" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "O fluxo tem operação pendente" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "O elemento <%s> não é permitido dentro de <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "O elemento <%s> não é permitido no nível mais alto" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "O arquivo %s aparece várias vezes no recurso" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Falha ao localizar \"%s\" em todos os diretórios fontes" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Falha ao localizar \"%s\" no diretório atual" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Opção de processamento %s desconhecida" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Falha ao criar um arquivo temporário: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Erro enquanto processava o arquivo de entrada com o xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Erro enquanto processava o arquivo de entrada com o to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Erro ao ler arquivo %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Erro comprimindo o arquivo %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "texto não pode aparecer dentro de <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "nome do arquivo de saída" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "ARQUIVO" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Diretórios onde os arquivos serão lidos (o padrão é o diretório atual)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRETÓRIO" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Gera a saída no formato definido pela extensão do arquivo alvo" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Gera um cabeçalho" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Gera código fonte que vincula o recurso ao seu programa" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Gera uma lista de dependência" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Não cria e registra o recurso automaticamente" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Nome do identificador C usado no código fonte gerado" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Compila uma especificação de recurso em um arquivo de recurso.\n" +"Arquivos de especificação de recurso têm a extensão .gresource.xml,\n" +"e um arquivo de recurso tem a extensão .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Você deve fornecer somente um arquivo\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "não é permitido nomes vazios" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nome \"%s\" inválido: nomes precisam começar com uma letra minúscula" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"nome \"%s\" inválido: caractere \"%c\" inválido, apenas é permitido letras " +"minúsculas, números e traços (\"-\")." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"nome \"%s\" inválido: dois hifens (\"--\") consecutivos não são permitidos." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" +"nome \"%s\" inválido: o último caractere não pode ser um hífen (\"-\")." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nome \"%s\" inválido: o tamanho máximo é 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "não é possível adicionar chaves ao esquema \"list-of\"" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" oculta em ; use " +"para modificar o valor" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"apenas um entre \"type\", \"enum\" ou \"flags\" deve ser especificado como " +"atributo para " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> não está (ainda) definido." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "tipo de texto GVariant \"%s\" é inválido" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " determinado, mas o esquema não está estendendo nada" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "nenhum para sobrescrever" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " já especificado" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " estende um esquema ainda não existente \"%s\"" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " é uma lista de esquema ainda não existente \"%s\"" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Não pode ser uma lista de um esquema com um caminho" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Não é possível estender um esquema com um caminho" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" é uma lista, estendendo que não é uma lista" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" estende , mas \"%s" +"\" não estende \"%s\"" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "um caminho, se determinado, precisa começar e terminar com uma barra" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "o caminho de uma lista precisa terminar com \":/\"" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> já especificado" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "O elemento <%s> não é permitido no nível mais alto" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict foi especificado; saindo.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Este arquivo todo foi ignorado.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorando este arquivo.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nenhuma chave \"%s\" no esquema \"%s\" como especificado no arquivo de " +"sobrescrita \"%s\"" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorando sobrescrita para esta chave.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " e --strict foi especificado; saindo.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"erro analisando chave \"%s\" no esquema \"%s\" como especificado no arquivo " +"de sobrescrita \"%s\": %s." + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorando sobrescrita para esta chave.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"sobrescrita para chave \"%s\" no esquema \"%s\" no arquivo de sobrescrita " +"\"%s\" está fora dos limites dado pelo esquema" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"sobrescrita para a chave \"%s\" no esquema \"%s\" no arquivo de sobrescrita " +"\"%s\" não está na lista de escolhas válidas" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "onde armazenar o arquivo gschemas compilado" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Abortar em quaisquer erros nos esquemas" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Não gravar o arquivo gschema compilado" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Não forçar restrições de nome de chave" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compila todos os arquivos schema GSettings em um cache schema.\n" +"É necessário que os arquivos schema tenham a extensão\n" +".gschema.xml, e o arquivo de cache é chamado gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Você deveria dar exatamente um nome de diretório\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Nenhum arquivo schema localizado: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "fazendo nada.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "arquivo de saída existente removido.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nome de arquivo inválido: %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Erro ao obter informações do sistema de arquivos: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Não é possível renomear o diretório root" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Erro ao renomear arquivo: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Não é possível renomear o arquivo, o nome do arquivo já existe" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Nome de arquivo inválido" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Não é possível abrir diretório" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Erro ao abrir arquivo: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Erro ao remover arquivo: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Erro ao mover arquivo para a lixeira: %s" + +#: ../gio/glocalfile.c:1883 +#, 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:1904 +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:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Não é possível localizar ou criar o diretório da lixeira" + +#: ../gio/glocalfile.c:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Não é possível mover arquivo para a lixeira: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "erro interno" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Erro ao criar o diretório: %s" + +#: ../gio/glocalfile.c:2214 +#, 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:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Erro ao criar link simbólico: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Erro ao mover arquivo: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Não é possível mover diretório sobre diretório" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Falha ao criar arquivo de backup" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Erro ao remover arquivo alvo: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Não há suporte a mover entre montagens" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Valor de atributo deve ser não-NULO" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Tipo de atributo inválido (esperava-se expressão)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Nome de atributo estendido inválido" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Erro ao definir atributo estendido \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (codificação inválida)" + +#: ../gio/glocalfileinfo.c:1619 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Erro ao obter informação para o arquivo \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1854 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Erro ao obter informação para o descritor de arquivo: %s" + +#: ../gio/glocalfileinfo.c:1899 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tipo de atributo inválido (esperado uint32)" + +#: ../gio/glocalfileinfo.c:1917 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tipo de atributo inválido (esperado uint64)" + +#: ../gio/glocalfileinfo.c:1936 ../gio/glocalfileinfo.c:1955 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tipo de atributo inválido (expressão de byte esperada)" + +#: ../gio/glocalfileinfo.c:1990 +msgid "Cannot set permissions on symlinks" +msgstr "Não foi possível definir permissões aos links simbólicos" + +#: ../gio/glocalfileinfo.c:2006 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Erro ao definir permissões: %s" + +#: ../gio/glocalfileinfo.c:2057 +#, c-format +msgid "Error setting owner: %s" +msgstr "Erro ao definir proprietário: %s" + +#: ../gio/glocalfileinfo.c:2080 +msgid "symlink must be non-NULL" +msgstr "o link simbólico deve ser não-NULO" + +#: ../gio/glocalfileinfo.c:2090 ../gio/glocalfileinfo.c:2109 +#: ../gio/glocalfileinfo.c:2120 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Erro ao definir link simbólico: %s" + +#: ../gio/glocalfileinfo.c:2099 +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:2225 +#, 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:2248 +msgid "SELinux context must be non-NULL" +msgstr "O contexto SELinux deve ser não-NULO" + +#: ../gio/glocalfileinfo.c:2263 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Erro ao definir o contexto SELinux: %s" + +#: ../gio/glocalfileinfo.c:2270 +msgid "SELinux is not enabled on this system" +msgstr "SELinux não está habilitado neste sistema" + +#: ../gio/glocalfileinfo.c:2362 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Não há suporte à definição do atributo %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Erro ao ler do arquivo: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Erro ao buscar no arquivo: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Erro ao fechar arquivo: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Erro ao escrever no arquivo: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Erro ao remover link antigo de backup: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Erro ao criar cópia de backup: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Erro ao renomear arquivo temporário: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Erro ao truncar arquivo: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Erro ao abrir arquivo \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Arquivo alvo é um diretório" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Arquivo alvo não é um arquivo comum" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "O arquivo foi modificado externamente" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Erro ao remover arquivo antigo: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "GSeekType fornecido inválido" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Solicitação de busca inválida" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Não é possível truncar GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Fluxo de saída da memória não redimensionável" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Falha ao redimensionar fluxo de saída da memória" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Solicitada uma busca antes do começo do fluxo" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "objeto de montagem não implementa \"umount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +msgid "mount doesn't implement \"eject\"" +msgstr "objeto de montagem 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:547 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"objeto de montagem 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:631 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"objeto de montagem 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:717 +msgid "mount doesn't implement \"remount\"" +msgstr "objeto de montagem não implementa \"remount\"" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:797 +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:882 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Nome da máquina \"%s\" contém \"[\" mas não \"]\"" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Rede inalcançável" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Máquina inalcançável" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Não foi possível criar o monitor de rede: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Não foi possível criar o monitor de rede: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Não foi possível obter o estado da rede: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Fluxo de saída não implementa escrita" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "A fonte do fluxo já está fechada" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Erro ao resolver \"%s\": %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Erro ao resolver reversamente \"%s\": %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nenhum registro DNS do tipo de requisição para \"%s\"" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Temporariamente sem condições de resolver \"%s\"" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Erro ao resolver \"%s\"" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Dados incompletos recebidos para \"%s\"" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "O recurso em \"%s\" não existe" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Falha ao descompactar o recurso em \"%s\"" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "O recurso em \"%s\" não é um diretório" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Fluxo de entrada não implementa busca" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Exibe a ajuda" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMANDO]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Lista as seções contendo recursos no arquivo elf ARQUIVO" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Lista recursos\n" +"Se SEÇÃO é fornecida, só lista os recursos dentro desta seção\n" +"Se CAMINHO é fornecido, só lista recursos que casam com o caminho" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "ARQUIVO [CAMINHO]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SEÇÃO" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Lista recursos com detalhes\n" +"Se SEÇÃO é fornecida, só lista os recursos dentro desta seção\n" +"Se CAMINHO é fornecido, só lista recursos que casam com o caminho\n" +"Detalhes incluem a seção, tamanho e compactação" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Extrai um arquivo de recurso para a saída padrão" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "ARQUIVO CAMINHO" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Comando \"%s\" desconhecido\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gresource [--section SEÇÃO] COMANDO [ARGUMENTOS...]\n" +"\n" +"Comandos:\n" +" help Mostra esta ajuda\n" +" sections Lista as seções do recurso\n" +" list Lista os recursos\n" +" details Lista os recursos com detalhes\n" +" extract Extrai um recurso\n" +"\n" +"Use 'gresource help COMANDO' para obter uma ajuda detalhada.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Argumentos:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEÇÃO Um nome de seção elf (opcional) \n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMANDO O comando a ser explicado (opcional)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " ARQUIVO Um arquivo elf (binário ou biblioteca compartilhada)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ARQUIVO Um arquivo elf (binário ou biblioteca compartilhada)\n" +" ou um arquivo de recurso compilado\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[CAMINHO]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CAMINHO Um caminho do recurso (opcional, pode ser parcial)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "CAMINHO" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " CAMINHO Um caminho do recurso\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nenhum esquema \"%s\"\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" +"Esquema \"%s\" não é recolocável (o caminho não deve ser especificado)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Esquema \"%s\" é recolocável (o caminho deve ser especificado)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Caminho fornecido está vazio.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "O caminho deve começar com uma barra (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "O caminho deve terminar com uma barra (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "O caminho não pode conter duas barras adjacentes (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nenhuma chave \"%s\"\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "O valor fornecido está fora do intervalo válido\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Lista os esquemas instalados (não-recolocáveis)" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Lista os esquemas recolocáveis instalados" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Lista as chaves no ESQUEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "ESQUEMA[:CAMINHO]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Lista os filhos do ESQUEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Lista as chaves e valores, recursivamente\n" +"Se nenhum esquema for fornecido, lista todas as chaves\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[ESQUEMA[:CAMINHO]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Obtém o valor de CHAVE" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "ESQUEMA[:CAMINHO] CHAVE" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Consulta o intervalo de valores válidos para CHAVE" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Define o valor de CHAVE para VALOR" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ESQUEMA[:CAMINHO] CHAVE VALOR" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Restaurar CHAVE para seu valor padrão" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Restaurar todas as chaves no ESQUEMA para seus padrões" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Verifica se CHAVE é gravável" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitora por alterações de CHAVE.\n" +"Se nenhuma CHAVE for especificada, monitora todas as chaves no ESQUEMA.\n" +"Use ^C para parar o monitoramento.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ESQUEMA[:CAMINHO] [CHAVE]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir SCHEMADIR] COMANDO [ARGS...]\n" +"\n" +"Comandos:\n" +" help Exibe esta informação\n" +" list-schemas Lista os esquemas instalados\n" +" list-relocatable-schemas Lista os esquemas recolocáveis\n" +" list-keys Lista as chaves em um esquema\n" +" list-children Lista os filhos de um esquema\n" +" list-recursively Lista as chaves e valores, recursivamente\n" +" range Consulta o intervalo de uma chave\n" +" get Obtêm o valor de uma chave\n" +" set Define o valor de uma chave\n" +" reset Redefine o valor de uma chave\n" +" reset-recursively Restaura todas as chaves em um determinado\n" +" writable Verifica se uma chave é gravável\n" +" monitor Monitora alterações\n" +"\n" +"Use \"gsettings help COMANDO\" para obter ajuda detalhada.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uso:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR Um diretório para procurar por esquemas adicionais\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ESQUEMA O nome do esquema\n" +" CAMINHO O caminho, para esquemas recolocáveis\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " CHAVE A chave (opcional) com o esquema\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " CHAVE A chave com o esquema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALOR O valor para definir\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Nome de esquema vazio\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Soquete inválido, não inicializado" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Soquete inválido, inicialização falhou devido a: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "O soquete já está fechado" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Tempo de I/O do soquete foi esgotado" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "criando GSocket a partir do fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Não é possível criar soquete: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Foi especificada uma família desconhecida" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Foi especificado um protocolo desconhecido" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "não foi possível obter endereço local: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "não foi possível obter endereço remoto: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "não foi possível escutar: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Erro ao vincular ao endereço: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Erro ao entrar no grupo multicast: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Erro ao sair do grupo multicast: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Não há suporte para multicast com uma origem específica" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Erro ao aceitar a conexão: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Conexão em progresso" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Não é possível obter erro pendente: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Erro ao receber dados: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Erro ao enviar dados: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Não é possível encerrar soquete: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Erro ao fechar soquete: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Aguardando pela condição do soquete: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Erro ao enviar mensagem: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Não há suporte a GSocketControlMessage no Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Erro ao receber mensagem: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials não está implementado para este SO" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Não foi possível conectar-se ao servidor proxy %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Não foi possível conectar-se a %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Não foi possível conectar: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "erro desconhecido ao conectar" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Não há suporte ao uso de proxy sobre uma conexão não TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Não há suporte ao protocolo de proxy \"%s\"." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "O ouvinte já está fechado" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Soquete adicionado está fechado" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "Não há suporte ao endereço IPv6 \"%s\" pelo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "O nome de usuário é muito longo para o protocolo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "O nome \"%s\" é muito longo para o protocolo SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "O servidor não é um servidor proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "A conexão ao servidor por meio de SOCKSv4 foi rejeitada" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "O servidor não é um servidor proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "O proxy SOCKSv5 requer autenticação." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "O SOCKSv5 requer um método de autenticação sem suporte pelo GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "" +"O nome de usuário ou a senha são muito longos para o protocolo SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"A autenticação SOCKSv5 falhou devido a um nome de usuário ou senha errados." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "O nome \"%s\" é muito longo para o protocolo SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "O servidor proxy SOCKSv5 está usando um tipo de endereço desconhecido." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Erro interno de servidor proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "A conexão SOCKSv5 não foi permitida pelo conjunto de regras." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Servidor inalcançável por meio do servidor SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Rede inalcançável por meio do proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Conexão recusada por meio do proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Proxy SOCKSv5 sem suporte ao comando \"connect\"." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Proxy SOCKSv5 sem suporte ao tipo de endereço fornecido." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Erro de proxy SOCKSv5 desconhecido." + +#: ../gio/gthemedicon.c:498 +#, 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/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Não foi possível decodificar uma chave privada codificada com PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Chave privada codificada com PEM não encontrada" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Não foi possível analisar chave privada codificada com PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Certificado codificado com PEM não localizado" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Não foi possível analisar certificado codificado com PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Esta é a última chance para digitar a senha corretamente antes de seu acesso " +"ser bloqueado." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Várias das senhas digitadas estavam incorretas, e o seu acesso será " +"bloqueado se houverem mais falhas." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "A senha digitada está incorreta." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Esperando 1 mensagem de controle, obtive %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Tipo de dado auxiliar não esperado" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Esperando um fd, mas obtive %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Recebido fd inválido" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Erro ao enviar credenciais: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Erro ao verificar se SO_PASSCRED está habilitado pelo soquete: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Tamanho inesperado de opção ao verificar se SO_PASSCRED está habilitado pelo " +"soquete. Esperado %d bytes, mas obteve %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Erro ao habilitar SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Era esperado ler apenas um byte para receber credenciais, mas foi lido zero " +"byte" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Não esperava mensagem de controle, mas recebeu %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Erro ao desabilitar SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Erro ao ler do descritor de arquivo: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Erro ao fechar o descritor de arquivo: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Sistema de arquivos root" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Erro ao escrever no descritor de arquivo: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume não implementa eject ou eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Não é possível localizar o aplicativo" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Erro ao lançar o aplicativo: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Não há suporte a URIs" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "não há suporte às alterações de associação em win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Não há suporte à criação de associação em win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Erro ao ler do manipulador: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Erro ao fechar manipulador: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Erro ao escrever no manipulador: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Memória insuficiente" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Erro interno: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Precisa de mais entrada" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Dados comprimidos inválidos" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Endereço para escutar" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorado, para compatibilidade com GTesTDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Exibe o endereço" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Imprime endereço no modo shell" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Executa um serviço dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Args. incorretos\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atributo \"%s\" inesperado para o elemento \"%s\"" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Não foi localizado atributo \"%s\" do elemento \"%s\"" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Marca \"%s\" inesperada, esperava marca \"%s\"" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Marca \"%s\" inesperada dentro de \"%s\"" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Já existe um marcador para o URI \"%s\"" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Não foi localizado marcador para o URI \"%s\"" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Sequência de caracteres parcial no final da entrada" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" +"Não é possível converter a sequência \"%s\" para conjunto caracteres \"%s\"" + +#: ../glib/gconvert.c:1870 +#, 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:1880 +#, 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:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "O URI \"%s\" é inválido" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "O nome de servidor do URI \"%s\" é inválido" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "O URI \"%s\" contém caracteres com escape inválido" + +#: ../glib/gconvert.c:2020 +#, 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:2030 +msgid "Invalid hostname" +msgstr "Nome de servidor inválido" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d de %b %H:%M:%S %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "janeiro" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "fevereiro" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "março" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "abril" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "maio" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "junho" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "julho" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "agosto" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "setembro" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "outubro" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "novembro" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "dezembro" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "fev" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "abr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maio" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ago" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "set" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "out" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dez" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "segunda-feira" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "terça-feira" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "quarta-feira" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "quinta-feira" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "sexta-feira" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sábado" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "domingo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "seg" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ter" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "qua" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "qui" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "sex" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sab" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dom" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Erro ao abrir o diretório \"%s\": %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, 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:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Erro ao ler arquivo \"%s\": %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Arquivo \"%s\" é muito grande" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Falha ao ler do arquivo \"%s\": %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Falha ao abrir arquivo \"%s\": %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Falha ao abrir arquivo \"%s\": fdopen() falhou: %s" + +#: ../glib/gfileutils.c:993 +#, 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:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Falha ao criar arquivo \"%s\": %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fwrite() falhou: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fflush() falhou: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Falha ao escrever no arquivo \"%s\": fsync() falhou: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Falha ao fechar arquivo \"%s\": fclose() falhou: %s" + +#: ../glib/gfileutils.c:1282 +#, 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:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Modelo \"%s\" não contém XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Falha ao ler link simbólico \"%s\": %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Não há suporte a links simbólicos" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Dados residuais não convertidos no buffer de leitura" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Canal termina em um caractere parcial" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Não é um arquivo comum" + +#: ../glib/gkeyfile.c:1156 +#, 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:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nome de grupo inválido: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Arquivo de chave não começa com um grupo" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nome de chave inválido: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Arquivo de chave contém codificação \"%s\" sem suporte" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Arquivo de chave não tem grupo \"%s\"" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Arquivo de chave não tem chave \"%s\"" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, 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:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Arquivo de chave contém chave \"%s\" no grupo \"%s\" que tem um valor que " +"não pode ser interpretado." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Chave \"%s\" no grupo \"%s\" tem o valor \"%s\" onde %s era esperado" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, 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:4078 +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:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Arquivo de chave contém sequência de escape \"%s\" inválida" + +#: ../glib/gkeyfile.c:4242 +#, 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:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valor inteiro \"%s\" fora dos limites" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "O valor \"%s\" não pode ser interpretado como um booleano." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Falha ao obter atributos do arquivo \"%s%s%s%s\": fstat() falhou: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Falha ao mapear arquivo \"%s%s%s%s\": mmap() falhou: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Falha ao abrir arquivo \"%s\": open() falhou: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Erro na linha %d caractere %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" não é um nome válido " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" não é um nome válido: \"%c\" " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Erro na linha %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, 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:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Entidade \"&;\" vazia; as entidades válidas são: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Nome de entidade \"%-.*s\" não é conhecido" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Documento tem de começar com um elemento (ex. )" + +#: ../glib/gmarkup.c:1113 +#, 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:1181 +#, 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:1265 +#, 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:1306 +#, 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:1350 +#, 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 abertura de aspas após o sinal de " +"igual ao atribuir o valor ao atributo \"%s\" do elemento \"%s\"" + +#: ../glib/gmarkup.c:1483 +#, 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:1530 +#, 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:1539 +#, 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:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Documento estava vazio ou apenas continha espaços" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Documento terminou inesperadamente logo após um menor que \"<\"" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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:1737 +#, 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 sinal de maior (\">" +"\") para terminar a marca <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Documento terminou inesperadamente dentro de um nome de elemento" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Documento terminou inesperadamente dentro de um nome de atributo" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" +"Documento terminou inesperadamente dentro de uma marca de abertura de " +"elemento." + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Documento terminou inesperadamente dentro de um valor de atributo" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Uso:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPÇÃO...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Opções de ajuda:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Exibe opções de ajuda" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Exibe todas as opções de ajuda" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opções de aplicativo:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Não é possível converter o valor inteiro \"%s\" para %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Valor inteiro \"%s\" para %s fora dos limites" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" +"Não é possível converter o ponto flutuante com dupla precisão \"%s\" para %s" + +#: ../glib/goption.c:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Erro ao ler a opção %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Falta argumento para %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Opção %s desconhecida" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "objeto corrompido" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "erro interno ou objeto corrompido" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "memória insuficiente" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "limite de backtracking alcançado" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "limite de recursão alcançado" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "combinação inválida de sinalizador de nova linha" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "deslocamento ruim" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 curto" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "recursão infinita" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "erro desconhecido" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ no fim do padrão" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c no fim do padrão" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "caractere não reconhecido seguindo \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "números fora de ordem no quantificador {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "número grande demais no quantificador {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "terminação ] em falta para classe de caracteres" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "sequência de escape inválida na classe de caracteres" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "intervalo fora de ordem na classe de caracteres" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nada a repetir" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "repetição inesperada" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "caractere não reconhecido após (? ou (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "terminação ) em falta" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referência a subpadrão não existente" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "\")\" em falta após o comentário" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "expressão regular é grande demais" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "falha ao obter memória" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") sem abrir (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "estouro de código" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "caractere não reconhecido após (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "declaração de verificação anterior não é de largura fixa" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "número mal formado ou nome após (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "grupo condicional contém mais que duas ramificações" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "esperava-se declaração após (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "\"(?R\" ou \"(?[+-]digitos\" devem ser seguidos por )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nome de classe POSIX desconhecido" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "elementos de arranjo POSIX sem suporte" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "valor de caractere na sequência \\x{...} é grande demais" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "condição inválida (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C não permitido na declaração de verificação anterior" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{nome}, \\U e \\u não são suportados" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "chamada recursiva pode causar uma repetição indefinidamente" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "caractere não reconhecido após (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "terminação em falta no nome do subpadrão" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dois subpadrões nomeados têm o mesmo nome" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "sequência \\P ou \\p mal formada" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nome de propriedade desconhecido após \\P ou \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nome de subpadrão é grande demais (máximo 32 caracteres)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "excesso de subpadrões nomeados (máximo 10.000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "valor octal é maior que \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "espaço de trabalho de compilação invadido" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "subpadrão de referência verificado anteriormente não localizado" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "O grupo DEFINE contém mais que uma ramificação" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "opções do NEWLINE inconsistentes" + +# obs.: "angle-brackets" não existe no Brasil, mas existe brackets, que é '<' e '>' +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g não é seguido por um número ou nome entre aspas, chaves ou sinais de " +"menor que ou maior que um número diferente de zero opcionalmente entre chaves" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "uma referência numerada não pode ser zero" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "um argumento não é permitido para (*ACCEPT), (*FAIL) ou (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) não reconhecido" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "número é muito grande" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "faltando o nome do subpadrão após (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "esperava-se dígito após (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] é um caractere de dados inválido no modo de compatibilidade do JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "não é permitido dois subpadrões nomeados com o mesmo nome" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) deve possuir um argumento" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c pode ser seguido por um caractere ASCII" + +# obs.: "angle-brackets" não existe no Brasil, mas existe brackets, que é '<' e '>' +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k não é seguido por um nome entre aspas, chaves ou sinais de menor que ou " +"maior que" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N não é suportado em uma classe" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "muitas referências de encaminhamento" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "nome é muito cumprido em (*MARK), (*PRUNE), (*SKIP) ou (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "valor de caractere na sequência \\u... é grande demais" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Erro ao coincidir expressão regular %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteca PCRE compilada sem suporte a UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Biblioteca PCRE compilada sem suporte às propriedades UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Biblioteca PCRE compilada com opções incompatíveis" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Erro ao otimizar expressão regular %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "esperava-se dígito hexadecimal ou \"}\"" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "esperava-se dígito hexadecimal" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "\"<\" em falta na referência simbólica" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "referência simbólica inacabada" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referência simbólica de comprimento zero" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "esperava-se dígito" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "referência simbólica ilegal" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "\"\\\" final errado" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "sequência de escape desconhecida" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Texto citado não começa com uma aspa" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texto estava vazio (ou apenas continha espaços)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Falha ao ler dados de processo filho (%s)" + +#: ../glib/gspawn.c:351 +#, 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:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Erro inesperado em waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Processo filho concluiu com código %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Processo filho foi terminado pelo sinal %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Processo filho foi parado pelo sinal %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Processo filho concluiu anormalmente" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Falha ao ler de canal filho (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Falha no fork (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Falha ao ir para diretório \"%s\" (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Falha ao executar processo filho \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, 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:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Falha no fork de processo filho (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Erro desconhecido ao executar processo filho \"%s\"" + +#: ../glib/gspawn.c:1559 +#, 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/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, 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:280 +msgid "Failed to read data from child process" +msgstr "Falha ao ler dados de processo filho" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Falha ao executar processo filho (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nome de programa inválido: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, 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:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "String inválida no ambiente: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Diretório de trabalho inválido: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Falha ao executar programa auxiliar (%s)" + +#: ../glib/gspawn-win32.c:995 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Caractere fora do limite para UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Sequência inválida na conversão da entrada" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Caractere fora do limite para UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s bytes" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Término anormal de programa ao chamar a linha de comandos \"%s\": %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "A linha de comandos \"%s\" saiu com status de saída não-zero, %d: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "Nenhum serviço de registro para \"%s\"" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "limite de espaço de trabalho para substrings vazias alcançado" + +#~ 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" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "repetição de um grupo DEFINE não é permitida" + +#~ msgid "File is empty" +#~ msgstr "Arquivo vazio" + +#~ msgid "This option will be removed soon." +#~ msgstr "Esta opção será removida logo." + +#~ msgid "Error connecting: " +#~ msgstr "Erro ao conectar: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Erro ao conectar: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "A implementação SOCKSv4 limita o nome de usuário a %i caracteres" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "" +#~ "A implementação SOCKSv4a limita o nome de servidor para %i caracteres" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Erro ao ler do unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Erro ao fechar unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Erro ao escrever para unix: %s" + +#~ 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." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Erro ao iniciar arquivo \"%s\": %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "O tipo do valor de retorno está incorreto, obtido \"%s\", era esperado " +#~ "\"%s\"" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Tentando definir a propriedade %s do tipo %s, mas de acordo com a " +#~ "interface esperada o tipo é %s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Nenhum esquema \"%s\" especificado no arquivo de sobrescrita \"%s\"" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Comandos:\n" +#~ " help Mostra esta informação\n" +#~ " get Obtém o valor de uma chave\n" +#~ " set Define o valor de uma chave\n" +#~ " reset Restaura o valor de uma chave\n" +#~ " monitor Monitora uma chave por alterações\n" +#~ " writable Verifica se uma chave é gravável\n" +#~ "\n" +#~ "Use '%s COMANDO --help' para obter ajuda para comando individuais.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Especificar o caminho para um esquema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumentos:\n" +#~ " ESQUEMA A identificação do esquema\n" +#~ " CHAVE O nome da chave\n" +#~ " VALOR O valor para definir na chave, como um GVariant " +#~ "serializado\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "A chave %s não é gravável\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitorar CHAVE por alterações e exibir os valores alterados.\n" +#~ "O monitoramento continuará até que o processo seja terminado." diff --git a/po/ro.po b/po/ro.po new file mode 100644 index 0000000..a1b5060 --- /dev/null +++ b/po/ro.po @@ -0,0 +1,4013 @@ +# Romanian translation for glib +# Copyright (C) 2001 - 2010 Free Software Foundation, Inc. +# Marius Andreiana , 2001. +# Mișu Moldovan , 2004 - 2010. +# Lucian Adrian Grijincu , 2010, 2011. +# Lupescu Mircea , 2010. +# Lupescu Mircea , 2011. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-03-15 14:06+0200\n" +"Last-Translator: Lucian Adrian Grijincu \n" +"Language-Team: Romanian Gnome Team \n" +"Language: ro\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==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2);;\n" +"X-Generator: Virtaal 0.6.1\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nu se aștepta un atribut „%s” pentru elementul „%s”" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, 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:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "S-a primit eticheta „%s”, se aștepta eticheta „%s”" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nu se aștepta eticheta „%s” în „%s”" + +#: ../glib/gbookmarkfile.c:1834 +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:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Un favorit pentru URI-ul „%s” există deja" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nu s-a găsit un favorit pentru URI-ul „%s”" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Nu există grupuri definite în favoritul URI-ului „%s”" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nu s-a putut deschide convertorul de la „%s” la „%s”" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Secvență de octeți incorectă în inputul conversiei" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Eroare în timpul conversiei: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Secvență parțială de caractere la sfârșitul inputului" + +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, 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 „file”" + +#: ../glib/gconvert.c:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI-ul „%s” este nevalid" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Numele din URI-ul „%s” este nevalid" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI-ul „%s” conține caractere „escaped” incorecte" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Calea „%s” nu este o cale absolută" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Nume nevalid" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +#, fuzzy +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Ianuarie" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Februarie" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Martie" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Aprilie" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Iunie" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Iulie" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "August" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "Septembrie" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "Octombrie" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "Noiembrie" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "Decembrie" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ian" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Mai" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Iun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Iul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Oct" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Noi" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Luni" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Marți" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Miercuri" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Joi" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Vineri" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sâmbătă" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Duminică" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Lun" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mie" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Joi" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Vin" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sâm" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Dum" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Eroare la deschiderea directorului „%s”: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Eroare la citirea fișierului „%s”: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Fișierul „%s” este prea mare" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Nu s-a putut citi din fișierul „%s”: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nu s-a putut deschide fișierul „%s”: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Nu s-a putut crea fișierul „%s”: %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, 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:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Șablonul „%s” nu conține XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octeți" +msgstr[2] "%u de octeți" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u octet" +msgstr[1] "%u octeți" +msgstr[2] "%u de octeți" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Nu s-a putut citi legătura simbolică „%s”: %s" + +#: ../glib/gfileutils.c:2231 +msgid "Symbolic links not supported" +msgstr "Legăturile 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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Eroare în linia %d, caracterul %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "„%s” nu este un nume valid " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "„%s” nu este un nume valid: „%c” " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Eroare în linia %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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 parsa „%-.*s”, care ar fi trebuit să fie o cifră într-un " +"caracter referință (de exemplu ê). Poate cifra este prea mare" + +#: ../glib/gmarkup.c:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"S-a depistat o entitate nulă „&;”. Entitățile valide sunt: & " < " +"> '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Numele entității „%-.*s” nu este cunoscut" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Documentul trebuie să înceapă cu un element (de ex. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Documentul era gol sau conținea doar spațiu gol" + +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +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:1754 +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:1759 +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:1765 +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:1772 +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:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "obiect corupt" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "eroare internă sau obiect corupt" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "memorie insuficientă" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "s-a atins limita de „backtracking”" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +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:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "eroare internă" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "s-a atins limita de recursivitate" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "s-a atins limita maximă pentru subșiruri nule" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "combinație incorectă de indicatori de linie nouă" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "deplasament greșit" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "utf8 scurt" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "eroare necunoscută" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ la sfârșitul unui model" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c la sfârșitul unui model" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "după \\ urmează un caracter necunoscut" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "numere neordonate în cuantificatorul {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "număr prea mare în cuantificatorul {}" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "lipsește un ] de închidere pentru clasa caracter" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "secvență incorectă de tip „escape” în clasa caracter" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "interval depășit în clasa caracter" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "nimic de repetat" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "caracter nerecunoscut după (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "caracter nerecunoscut după (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "caracter nerecunoscut după (?P" + +#: ../glib/gregex.c:306 +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:309 +msgid "missing terminating )" +msgstr "lipsește un ) de închidere" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R sau (?[+-]digiți trebuie urmați de )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "referință la un submodel inexistent" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "lipsește un ) după comentariu" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "expresie regulată prea lungă" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "nu s-a putut aloca memoria" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "aserțiunea „lookbehind” nu e de lungime fixă" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "număr greșit formatat sau nume după (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "grupul de condiții conține mai mult de două ramuri" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "se așteaptă o aserțiune după (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "nume necunoscut de clasă POSIX" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "elementele POSIX de unire nu sunt implementate" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "valoarea caracterului în secvența \\x{...} este prea mare" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "condiție nevalidă (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nu este permis în aserțiunea „lookbehind”" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "apelul recursiv ar putea intra în buclă infinită" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "terminator lipsă în numele de submodel" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "două submodele au același nume" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "secvență malformată \\P sau \\p" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "nume necunoscut de proprietate după \\P ori \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "nume de submodel prea lung (sunt permise cel mult 32 de caractere)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "prea multe nume de submodeluri (sunt permise cel mult 10.000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "valoarea octală este mai mare decât \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "grupul DEFINE conține mai mult de o ramură" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "nu se permite repetarea unui grup DEFINE" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "opțiuni NEWLINE inconsistente" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "repetare neașteptată" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "„overflow” în cod" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "spațiul de compilare a fost depășit" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "nu s-a găsit submodelul referit și verificat anterior" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Eroare la compararea expresiei regulate %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Biblioteca PCRE este compilată cu suport UTF-8" + +#: ../glib/gregex.c:1215 +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:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Eroare la optimizarea expresiei regulate %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "se aștepta un digit hexadecimal or „}”" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "se aștepta un digit hexadecimal" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "„<” lipsă în referința simbolică" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "referință simbolică neterminată" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "referință simbolică de lungime zero" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "se aștepta un digit" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "referință simbolică ilegală" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "„\\” inutil la final" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "secvență „escape” necunoscută" + +#: ../glib/gregex.c:2360 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Textul citat nu începe cu un semn de citare" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Textul era gol (sau conținea doar spațiu gol)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Nu s-au putut citi datele de la procesul copil" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, 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:369 ../glib/gspawn.c:1383 +#, 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:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nu s-a putut executa procesul copil (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nume incorect de program: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Secvență incorectă în vectorul argumentului la %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Secvență incorectă în variabilele de mediu: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Director curent nevalid: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nu s-a putut porni programul asociat (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Eroare neașteptată în waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nu s-a putut clona procesul (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nu s-a putut executa procesul „%s” (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nu s-a putut clona procesul copil (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Eroare necunoscută la lansarea în execuție a procesului copil „%s”" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Caracter în afara limitelor standardului UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Secvență incorectă în inputul conversiei" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Caracter în afara limitelor standardului UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Utilizare:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPȚIUNE...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Opțiuni ajutor:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Arată opțiunile de ajutor" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Arată toate opțiunile de ajutor" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opțiuni aplicație:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nu se poate parsa valoarea întregului „%s” pentru %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Valoarea întregului „%s” pentru %s este în afara limitelor" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nu se poate parsa valoarea dublă „%s” pentru %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Valoarea dublă „%s” pentru %s este în afara limitelor" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Eroare la prelucrarea opțiunii %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument lipsă pentru %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Opțiune necunoscută %s" + +#: ../glib/gkeyfile.c:366 +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:401 +msgid "Not a regular file" +msgstr "Nu e un fișier obișnuit" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Fișierul e gol" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Nume incorect de grup: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Fișierul cheie nu începe cu un grup" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Nume incorect de cheie: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Fișierul cheie are o codare neimplementată de tip „%s”" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Fișierul cheie nu are grupul „%s”" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Fișierul cheie nu are cheia „%s”" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI-ul „%s” conține secvențe „escaped” incorecte" + +#: ../glib/gkeyfile.c:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Valoarea întregului „%s” este în afara limitelor" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "S-a pasat o valoare prea mare către %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Flux deja închis" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Operațiunea a fost anulată" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Obiect nevalid, neinițializat" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Secvență de octeți incompletă la intrare" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Spațiu insuficient în destinație" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "tip %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials nu este implementat pe acest sistem de operare" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Nu există suport pentru GCredentials pe platforma dumneavoastră" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Flux terminat neașteptat de repede" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Cheie „%s” nesuportată în intrarea de adresă „%s”" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresa „%s” nu este validă (e nevoie de exact o cale, un dosar temporar sau " +"o cheie abstractă)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Pereche cheie/valoare fără sens în intrarea de adresă „%s”" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Eroare în adresa „%s” - atributul port este greșit" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Eroare în adresa „%s” - atributul familie este greșit" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Elementul de adresă „%s” nu conține două puncte (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"Perechea cheie/valoare %d, „%s”, in elementul de adresă „%s”, nu conține un " +"semn de egalitate" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Eroare la conversia din format „escaped” a cheii sau valorii din perechea " +"Cheie/Valoare %d, „%s”, în elementul de adresă „%s”" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Eroare în adresa „%s” - transportul unix necesită exact una din cheile " +"„path” sau „abstract” să fie setată" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Eroare în adresa „%s” - atributul gazdă este greșit" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Eroare la adresa „%s” - atributul port este greșit sau lipsește" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Eroare în adresa „%s” - atributul noncefile este greșit sau lipsește" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Eroare la auto-lansare: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Transport „%s” necunoscut sau nesuportat pentru adresa „%s”" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Eroare la deschiderea fișierului nonce „%s”: %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Eroare la citirea fișierului nonce „%s”: %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Eroare la citirea fișierului nonce „%s”, se așteptau 16 octeți, s-au primit " +"%d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Eroare la scrierea conținutului fișierului nonce „%s” în flux:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "Adresa oferită este goală" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" +"Nu se poate lansa o magistrală de mesaje fără un identificator de mașină: " + +#: ../gio/gdbusaddress.c:1057 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Eroare la lansarea liniei de comandă „%s”: " + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Eroare la lansarea liniei de comandă „%s” s-a terminat anormal: %s" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Linia de comandă „%s” s-a încheiat cu un cod non-zero de eroare %d: %s" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Nu se poate determina adresa magistralei de sesiune (neimplementat pe acest " +"sistem de operare)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nu s-a putut determina adresa magistralei din variabila de mediu " +"DBUS_STARTER_BUS_TYPE - valoare necunoscută „%s”" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nu s-a putut determina adresa magistralei pentru că variabila de mediu " +"DBUS_STARTER_BUS_TYPE nu este setată" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "Tip de magistrală %d necunoscut" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "Lipsă de conținut neașteptată în timp ce se încerca citirea unei linii" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"Lipsă de conținut neașteptată în timp ce se încerca citirea (în siguranță a) " +"unei linii" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"S-au epuizat toate mecanismele de autentificare disponibile (încercat: %s) " +"(disponibile: %s)" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Anulat via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error statting directory `%s': %s" +msgstr "Eroare la aflarea statisticilor despre dosarul „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Permisiunile dosarul „%s” sunt greșite. Se aștepta modul 0700, s-a găsit 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Eroare la crearea dosarului „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Eroare la deschiderea fișierului „%s” pentru citire: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Linia %d a inelului de chei de la „%s” cu conținutul „%s” este greșită" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Primul element al liniei %d a inelului de chei de la „%s” cu conținutul „%s” " +"este greșit" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Al doilea element al liniei %d a inelului de chei de la „%s” cu conținutul " +"„%s” este greșit" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" +"Nu s-a găsit un cookie cu identificatorul %d în inelul de chei de la „%s”" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Eroare la ștergerea fișierului de blocare învechit „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Eroare la citirea fișierului de blocare „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "" +"Eroare la închiderea fișierului de blocare (fără legături deschise) „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Eroare la ștergerea fișierului fișierului de blocare „%s”: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Eroare la deschiderea pentru scriere a inelului de chei „%s”: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(În plus, a eșuat și deblocarea fișierului de blocare „%s”: %s)" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "Conexiunea este închisă" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "Limita de timp a fost atinsă" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"yuS-au întâlnit flag-uri nesuportate când se construia partea de client a " +"conexiunii" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nu există interfața „org.freedesktop.DBus.Properties” în obiectul aflat la " +"calea %s" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Eroare la setarea proprietății „%s”: Se aștepta tipul „%s”, dar s-a primit " +"„%s”" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "Nu există proprietatea „%s”" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Proprietatea „%s” nu poate fi citită" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Proprietatea „%s” nu poate fi scrisă" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "Nu există interfața „%s”" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "Nu există interfața" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nu există proprietatea „%s” în obiectul de la calea %s" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "Nu există metoda „%s”" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Tipul mesajului, „%s”, nu se potrivește cu cel așteptat „%s”" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Există deja un obiect exportat pentru interfața %s de la %s" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoda „%s” a întors tipul „%s”, dar se aștepta „%s”" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoda „%s” din interfața „%s” cu semnătura „%s” nu există" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Un subarbore este deja exporta pentru %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tipul este NEVALID" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"mesaj METHOD_CALL: unul din câmpurile de antet PATH sau MEMBER lipsește" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "mesaj METHOD_RETURN: câmpul antet REPLY_SERIAL lipsește" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"mesaj METHOD_RETURN: unul din câmpurile de antet REPLY_SERIAL sau ERROR_NAME " +"lipsește" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Mesaj SIGNAL: unul din câmpurile de antet PATH, INTERFACE sau MEMBER lipsește" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"mesaj SIGNAL: câmpul de antet PATH utilizează valoarea rezervată /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"mesaj SIGNAL: câmpul de antet INTERFACE utilizează valoarea rezervată org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, fuzzy, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "S-a încercat să se citească %lu octeți, dar s-a întâlnit EOF" +msgstr[1] "S-a încercat să se citească %lu octeți, dar s-a întâlnit EOF" +msgstr[2] "S-a încercat să se citească %lu octeți, dar s-a întâlnit EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Se aștepta un șir UTF-8 valid, dar s-au găsit octeți nevalizi la poziția %d " +"(lungimea șirului este %d). Șirul UTF-8 valid până la acel punct a fost „%s”" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Se aștepta un octet NUL după șirul „%s”, dar s-a octetul „%d”" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Valoarea parsată „%s” nu este o cale de obiect D-Bus validă" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Valoarea parsată „%s” nu este o semnătură D-Bus validă" + +#: ../gio/gdbusmessage.c:1324 +#, fuzzy, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"S-a întâlnit un vector de %u octeți. Lungimea maximă este de 2<<26 octeți " +"(64 MiB)." +msgstr[1] "" +"S-a întâlnit un vector de %u octeți. Lungimea maximă este de 2<<26 octeți " +"(64 MiB)." +msgstr[2] "" +"S-a întâlnit un vector de %u octeți. Lungimea maximă este de 2<<26 octeți " +"(64 MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Valoarea parsată „%s” nu este o semnătură D-Bus validă" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Eroare la deserializarea GVariant cu șirul-tip „%s” din formatul de rețea D-" +"Bus" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Valoare de endianness nevalidă. Se aștepta 0x6c („l”) sau 0x42 („B”), dar s-" +"a găsit valoarea 0x%02x" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Versiune majoră de protocol nevalidă. Se aștepta 1 dar s-a găsit %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "S-a găsit un antet cu semnătura „%s”, dar corpul mesajului este vid" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Valoarea parsată „%s” nu este o semnătură D-Bus validă (pentru corp)" + +#: ../gio/gdbusmessage.c:1821 +#, fuzzy, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Niciun antet de semnătură în mesaj, dar corpul mesajului este de %u octeți" +msgstr[1] "" +"Niciun antet de semnătură în mesaj, dar corpul mesajului este de %u octeți" +msgstr[2] "" +"Niciun antet de semnătură în mesaj, dar corpul mesajului este de %u octeți" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Nu se poate deserializa mesajul:" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Eroare la serializarea GVariant cu șirul-tip „%s” în formatul de rețea D-Bus" + +#: ../gio/gdbusmessage.c:2303 +#, fuzzy, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "Mesajul are %d fds, dar câmpul antet indică %d fds" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "Nu se poate serializa mesajul:" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" +"Corpul mesajului are semnătura „%s”, dar nu există nicio semnătură de antet" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Corpul mesajului are semnătura „%s”, dar semnătura din câmpul antet este „%s”" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Corpul mesajului este vid, dar semnătura din câmpul antet este „(%s)”" + +#: ../gio/gdbusmessage.c:2938 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Rezultat de eroare cu corp de tipul „%s”" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "Rezultat de eroare cu corp vid" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "Nu s-a putut încărca /var/lib/dbus/machine-id: " + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Eroare la apelul StartServiceByName pentru %s:" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Răspuns neașteptat %d de la metoda StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Nu se poate invoca metoda; proxy-ul este pentru un nume cunoscut fără " +"proprietar și a fost construit utilizând G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "Spațiul de nume abstract nu este suportat" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "Nu se poate specifica un fișier nonce când se creează un server" + +#: ../gio/gdbusserver.c:875 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Eroare la citirea fișierului nonce la „%s”: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Șirul „%s” nu este un GUID D-Bus valid" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nu se poate asculta pe transportul nesuportat „%s”" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "COMANDĂ" + +#: ../gio/gdbus-tool.c:93 +#, fuzzy, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Comenzi:\n" +" help Afișează aceste informații\n" +" introspect Introspectează un obiect la distanță\n" +" monitor Monitorizează un obiect la distanță\n" +" call Invocă o metodă pe un obiect la distanță\n" +"\n" +"Utilizați \"%s COMANDĂ --help\" pentru a primi ajutor pentru fiecare " +"comandă.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Eroare: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Eroare la parsarea introspecției XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Conectare la magistrala sistemului" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Conectare la magistrala de sesiune" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Conectare la adresa D-Bus dată" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Opțiuni ale capătului conexiunii:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Opțiuni care specifică capătul conexiunii" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Niciun capăt de conexiune specificat" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Mai multe capete de conexiune specificate" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Avertisment: Conform datelor de introspecție, interfața „%s” nu există\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Avertisment: Conform datelor de introspecție, metoda „%s” nu există în " +"interfața „%s”\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "Calea către obiectul de monitorizat" + +#: ../gio/gdbus-tool.c:536 +#, fuzzy +msgid "Signal and interface name" +msgstr "Metoda și numele interfeței" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Eroare la conectare: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, fuzzy, c-format +msgid "Error: object path not specified.\n" +msgstr "Eroare: calea către obiect nu a fost specificată\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Eroare: calea %s către obiect nu este validă\n" + +#: ../gio/gdbus-tool.c:625 +#, fuzzy, c-format +msgid "Error: signal not specified.\n" +msgstr "Eroare: destinația nu a fost specificată\n" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Eroare: calea %s către obiect nu este validă\n" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Eroare: calea %s către obiect nu este validă\n" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Eroare: calea %s către obiect nu este validă\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Eroare la parsarea parametrului %d: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Eroare la acceptarea conexiunii: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "Numele destinației pe care se va invoca metoda" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Calea către obiectul pe care se va invoca metoda" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Metoda și numele interfeței" + +#: ../gio/gdbus-tool.c:728 +#, fuzzy +msgid "Timeout in seconds" +msgstr "Limita de timp a fost atinsă" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Invocă o metodă pe un obiect la distanță." + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Eroare: destinația nu a fost specificată\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Eroare: calea către obiect nu a fost specificată\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Eroare: numele metodei nu a fost specificat\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Eroare: numele metodei „%s” nu este valid\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Eroare la parsarea parametrului %d cu tipul „%s”: %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "Numele destinației de introspectat" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Calea obiectului de introspectat" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Afișează XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Introspectează un obiect la distanță." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Numele destinației de monitorizat" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Calea către obiectul de monitorizat" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Monitorizează un obiect la distanță." + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Nedenumit" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Fișierul desktop nu are specificat un câmp „Exec”" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Nu s-a găsit un terminal pentru pornirea aplicației" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nu se poate crea dosarul pentru opțiunile aplicației %s: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nu se poate crea dosarul pentru opțiunile MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nu se poate crea fișierul desktop %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Definiție personalizată pentru %s" + +#: ../gio/gdrive.c:363 +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” sau „eject_with_operation”" + +#: ../gio/gdrive.c:521 +msgid "drive doesn't implement polling for media" +msgstr "unitatea nu poate verifica periodic pentru medii de stocare noi" + +#: ../gio/gdrive.c:728 +msgid "drive doesn't implement start" +msgstr "unitatea nu implementează comanda „start”" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "unitatea nu implementează comanda „stop”" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Suportul TLS nu este disponibil" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Număr de elemente greșit formatat (%d) în codarea GEmblem" + +#: ../gio/gemblemedicon.c:368 +#, 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:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Număr de elemente greșit formatat (%d) în codarea GEmblemedIcon" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Se aștepta un GEmblem pentru GEmblemedIcon" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Montarea conținută nu există" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Nu se poate copia peste director" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Nu se poate copia un director peste un alt director" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Fișierul destinație există deja" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Nu se poate copia recursiv directorul" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "Nu există suport pentru funcția „splice”" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "Eroare la aplicarea funcției „splice” fișierului: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Nu se poate copia fișierul special" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "S-a primit o valoare incorectă pentru legătura simbolică" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Nu există o implementare pentru coșul de gunoi" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Numele de fișiere nu pot conține „%c”" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "volumul nu implementează montarea" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Nu există o aplicație înregistrată pentru deschiderea acestui fișier" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Enumeratorul este închis" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Enumeratorul fișierului este deja deschis de o altă operațiune" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Enumeratorul fișierului este deja închis" + +#: ../gio/gfileicon.c:236 +#, 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:246 +msgid "Malformed input data for GFileIcon" +msgstr "Date de input malformate pentru GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Fluxul nu implementează „query_info”" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Căutarea în flux nu este implementată" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Nu se permite trunchierea fluxului de intrare" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Trunchierea fluxului nu este implementată" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Număr greșit de elemente (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Niciun tip pentru numele clasei %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tipul %s nu implementează interfața GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tipul %s nu este clasificat" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Număr malformat de versiune: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Nu se poate gestiona versiunea furnizată pentru codarea iconiței" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Asupra fluxului se execută deja o operațiune" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Spațiu insuficient pentru adresa socket-ului" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Adresă nesuportată de socket" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "numele vide nu sunt permise" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "nume nevalid „%s”: numele trebuie să înceapă cu o literă mică" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"nume nevalid „%s”: caracter nevalid „%c”; doar literele mici, numerele și " +"liniuța ('-') sunt permise." + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "nume nevalid „%s”: două liniuțe consecutive ('--') nu sunt permise." + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "nume nevalid „%s”: ultimul caracter nu poate fi o liniuță ('-')." + +#: ../gio/glib-compile-schemas.c:789 +#, fuzzy, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "nume nevalid „%s”: lungimea maximă este 32" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr " deja specificat" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "nu se pot adăuga chei unei scheme de tip „list-of”" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " deja specificat" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" ascunde în ; utilizați " +" pentru a modifica valoarea" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"exact una dintre valorile „type”, „enum” sau „flags” trebuie specificată " +"unui atribut al " + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> nu este (încă) definit." + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "șir-tip GVariant nevalid „%s”" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr " a fost specificat, dar schema nu extinde nimic" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "niciun element de suprascris" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr " deja specificat" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr " deja specificat" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " extinde o schemă „%s” ce încă nu există" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " este o listă de a unei scheme inexistente „%s”" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nu poate fi o listă a unei scheme cu o cale" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nu se poate extinde o schemă cu o cale" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" este o listă, ce extinde care nu este o " +"listă" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" extinde , dar " +"„%s” nu extinde „%s”" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"dacă este specificată, calea trebuie să înceapă și să se termine cu o bară " +"oblică („/”)" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "calea unei liste trebuie să se termine cu „:/”" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> deja specificat" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elementul <%s> nu este permis în <%s>" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elementul <%s> nu este permis la nivelul cel mai de sus" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "textul nu are voie să apară în <%s>" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict a fost specificat; se iese.\n" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Întregul fișier a fost ignorat.\n" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Se ignoră acest fișier.\n" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Nu există cheia „%s” în schema „%s” specificată în fișierul de suprascriere " +"„%s”" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; se ignoră suprascrierea pentru această cheie.\n" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "și --strict a fost specificat; se iese.\n" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"eroare la parsarea cheii „%s” în schema „%s” specificată în fișierul de " +"suprascriere „%s”: %s." + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Se ignoră suprascrierea pentru această cheie.\n" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"suprascrierea cheii „%s” în schema „%s” din fișierul de suprascriere „%s” nu " +"este în intervalul specificat de schemă" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"suprascrierea cheii „%s” în schema „%s” din fișierul de suprascriere „%s” nu " +"este în lista de valori valide" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "unde se stochează fișierul gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "DOSAR" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "Abandonează execuția la detectarea oricăror erori în scheme" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "Nu scrie fișierul gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "Această opțiune va fi eliminată în curând." + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "Nu impune restricții numelor cheilor" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Compilează toate fișierele-schemă GSettings într-un cache de schemă.\n" +"Fișierele schemă trebuie să aibă extensia .gschema.xml,\n" +"iar fișierul cache se numește gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Trebuie să dați exact un nume de dosar\n" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "Nu s-a găsit niciun fișier schemă: " + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "nu se face nimic.\n" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "s-a șters fișierul de ieșire existent.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Nume incorect de fișier: %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Eroare la citirea detaliilor sistemului de fișiere: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Nu se poate redenumi directorul rădăcină" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Eroare la redenumirea fișierului: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Nu se poate redenumi fișierul, numele de fișier există deja" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Nume nevalid de fișier" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Eroare la deschiderea fișierului: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Nu se poate deschide directorul" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Eroare la ștergerea fișierului: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Eroare la mutarea la coșul de gunoi a fișierului: %s" + +#: ../gio/glocalfile.c:1831 +#, 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:1852 +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:1931 ../gio/glocalfile.c:1951 +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:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "" +"Nu s-a putut crea fișierul cu detalii despre mutarea la coșul de gunoi: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nu s-a putut muta la coș fișierul: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Eroare la crearea directorului: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sistemul de fișiere nu suportă legături simbolice" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Eroare la crearea legăturii simbolice: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Eroare la mutarea fișierului: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Nu se poate muta un director peste un alt director" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Crearea fișierului de rezervă a eșuat" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Eroare la ștergerea fișierului destinație: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" +"Operațiunea de mutare între două dispozitive montate nu este implementată" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Valoarea atributului trebuie să fie diferită de NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Tip incorect de atribut (se aștepta un șir)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Nume incorect de atribut extins" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Eroare la setarea atributului extins „%s”: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Eroare la citirea detaliilor fișierului „%s”: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (codare incorectă)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Eroare la citirea descriptorilor fișierului: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Tip incorect de atribut (se aștepta o valoare uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Tip incorect de atribut (se aștepta o valoare uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Tip incorect de atribut (se aștepta un șir de octeți)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Nu se pot defini drepturi pentru legături simbolice" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Eroare la definirea drepturilor: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Eroare la definirea deținătorului: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "legătura simbolică trebuie să fie diferită de NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Eroare la definirea legăturii simbolice: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Eroare la definirea legăturii simbolice: fișierul nu este o legătură " +"simbolică" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Eroare la schimbarea datei de acces ori modificare: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "Contextul SELinux trebuie să fie diferit de NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Eroare la definirea contextului SELinux: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nu este activat pentru acest sistem" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Definirea atributului %s nu este implementată" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Eroare la citirea din fișier: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Eroare la căutarea în fișier: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Eroare la închiderea fișierului: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Eroare la scrierea în fișier: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Eroare la ștergerea vechii legături simbolice de backup: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Eroare la crearea copiei de backup: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Eroare la redenumirea fișierului temporar: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Eroare la trunchierea fișierului: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Eroare la deschiderea fișierului „%s”: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Fișierul destinație este un director" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Fișierul destinație nu este un fișier obișnuit" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Fișierul a fost modificat de o terță parte" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Eroare la ștergerea vechiului fișier: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "S-a primit un GSeekType nevalid" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Cerere nevalidă de căutare" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Nu se poate trunchia GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Fluxul de ieșire al memoriei nu poate fi redimensionat" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Nu s-a putut redimensiona fluxul de ieșire al memoriei" + +#: ../gio/gmemoryoutputstream.c:600 +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:756 +msgid "Requested seek before the beginning of the stream" +msgstr "S-a cerut mutarea cursorului înaintea începutului fluxului" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +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:442 +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” sau „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:611 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "obiectul montat nu implementează „eject” sau „eject_with_operation”" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:701 +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:785 +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:874 +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:322 +#, 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:411 +msgid "Output stream doesn't implement write" +msgstr "Fluxul de ieșire nu implementează scrierea" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Sursa fluxului este deja închisă" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Eroare la rezolvarea „%s”: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Eroare la rezolvarea inversă „%s”: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "Nu există înregistrări de serviciu pentru „%s”" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Eroare temporară la rezolvarea „%s”" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Eroare la rezolvarea „%s”" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema „%s” nu este relocalizabilă (nu trebuie specificată calea)\n" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nu există schema „%s”\n" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema „%s” este relocalizabilă (trebuie specificată calea)\n" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "Calea dată este goală.\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Calea trebuie să înceapă cu o bară oblică (/)\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Calea trebuie să se termine cu o bară oblică (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Calea trebuie să nu conțină două bare oblice adiacente (//)\n" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nu există cheia „%s”\n" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Valoarea furnizată este în afara intervalului valid\n" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "Afișează ajutorul" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "Listează schemele (nerelocalizabile) instalate" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "Listează schemele relocalizabile instalate" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "Listează cheile din SCHEMĂ" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMĂ[:CALE]" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "Listează copiii SCHEMEI" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Listează chei și valori, recursiv\n" +"Dacă nu a fost furnizată nicio SCHEMĂ, listează toate cheile\n" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMĂ[:CALE]]" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "Obține valoarea CHEII" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMĂ[:CALE] CHEIE" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "Interoghează intervalul valorilor valide pentru CHEIE" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "Setează valoarea CHEII la VALOARE" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMĂ[:CALE] CHEIE VALOARE" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "Resetează CHEIA la valoarea ei implicită" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "Verifică dacă CHEIA poate fi scrisă" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Monitorizează CHEIA pentru modificări.\n" +"Dacă nicio CHEIE nu este specificată, monitorizează toate cheile din " +"SCHEMĂ.\n" +"Folosiți ^C pentru a opri monitorizarea.\n" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMĂ[:CALE] [CHEIE]" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Comandă necunoscută %s\n" +"\n" + +#: ../gio/gsettings-tool.c:621 +#, fuzzy +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Utilizare:\n" +" gsettings COMANDĂ [ARGUMENTE...]\n" +"\n" +"Comenzi:\n" +" help Arată aceste informații\n" +" list-schemas Listează schemele instalate\n" +" list-relocatable-schemas Listează schemele relocalizabile\n" +" list-keys Listează cheile dintr-o schemă\n" +" list-children Listează copiii unei scheme\n" +" list-recursively Listează cheile și valorile, recursiv\n" +" range Interoghează intervalul unei chei\n" +" get Obține valoarea unei chei\n" +" set Setează valoarea unei chei\n" +" reset Resetează valoarea unei chei\n" +" writable Verifică dacă o cheie poate fi scrisă\n" +" monitor Monitorizează modificările\n" +"\n" +"Folosiți comanda „gsettings help COMANDĂ” pentru a obține ajutor detaliat.\n" +"\n" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Utilizare:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "Argumente:\n" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMANDĂ Comandă (opțională) de explicat\n" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMĂ Numele schemei\n" +" CALE Calea, pentru schemele relocalizabile\n" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr " CHEIE Cheia (opțională) din schemă\n" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr " CHEIE Cheia din schemă\n" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr " VALOARE Valoarea de setat\n" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "Numele schemei dat este gol \n" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Socket nevalid (neinițializat)" + +#: ../gio/gsocket.c:282 +#, 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:290 +msgid "Socket is already closed" +msgstr "Socket-ul este deja închis" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "A expirat limita de timp la I/O pe socket" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "se creează GSocket din fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nu s-a putut crea socket-ul: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "S-a specificat un protocol necunoscut" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "nu s-a putut obține adresa locală: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "nu s-a putut obține adresa la distanță: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "nu s-a putut asculta: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Eroare la asocierea adresei: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Eroare la acceptarea conexiunii: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Eroare la conectare: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "Conectare în progres" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Eroare la conectare: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nu s-a putut obține eroarea în așteptare: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Eroare la primirea datelor: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Eroare la trimiterea datelor: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nu s-a putut crea socket-ul: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Eroare la închiderea socket-ului: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Se așteaptă condiția socket-ului: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Eroare la trimiterea mesajului: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage nu e implementat în Windows" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Eroare la primirea mesajului: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials nu este implementat pe acest sistem de operare" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Eroare necunoscută la conectare" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Nu se poate utiliza proxy peste o conexiune non-TCP." + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protocolul proxy „%s” nu este suportat." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Procesul de ascultare este deja închis" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Socket-ul adăugat este închis" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nu acceptă adresă IPv6 „%s”" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "Implementarea SOCKSv4 limitează numele de utilizator la %i caractere" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "Implementarea SOCKSv4 limitează numele gazdei la %i caractere" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Serverul nu este un server de proxy SOCKSv4." + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Conectarea prin serverul SOCKSv4 a fost respinsă" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Serverul nu este un server de proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Proxy-ul SOCKSv5 necesită autentificare." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 necesită o metodă de autentificare ce nu este acceptată de GLib." + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" +"Numele de utilizator sau parola este prea lungă pentru protocolul SOCKSv5 " +"(lungimea maximă este %i)." + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Autentificarea SOCKSv5 a eșuat din cauza unui nume de utilizator sau a unei " +"parole greșite." + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" +"Numele de gazdă „%s” este prea lung pentru protocolul SOCKSv5 (lungimea " +"maximă este de %i octeți)." + +#: ../gio/gsocks5proxy.c:352 +#, fuzzy +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Serverul proxy SOCKSv5 utilizează un tip de adresă necunoscut." + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Eroare internă a serverului proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Setul de reguli nu permite conexiuni SOCKSv5." + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Gazda nu poate fi contactată prin intermediul serverului SOCKSv5." + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Rețeaua nu poate fi contactată prin intermediul proxy-ului SOCKSv5." + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Conexiune refuzată prin proxy-ul SOCKSv5." + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Proxy-ul SOCKSv5 nu acceptă comanda „connect”." + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Proxy-ul SOCKSv5 nu acceptă tipul de adresă furnizat." + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Eroare necunoscută a proxy-ului SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nu se poate gestiona versiunea %d a codării GThemedIcon" + +#: ../gio/gtlscertificate.c:226 +#, fuzzy +msgid "No PEM-encoded private key found" +msgstr "Nu s-a găsit niciun certificat codificat PEM" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "Nu s-a putut parsa cheia privată codificată PEM" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "Nu s-a găsit niciun certificat codificat PEM" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "Nu s-a putut parsa certificatul codificat PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, 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:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Tip neașteptat de date auxiliare" + +#: ../gio/gunixconnection.c:195 +#, 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:211 +msgid "Received invalid fd" +msgstr "S-a primit un fd nevalid" + +#: ../gio/gunixconnection.c:371 +msgid "Error sending credentials: " +msgstr "Eroare la trimiterea credențialelor: " + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Eroare la verificarea dacă SO_PASSCRED este activat pe socket: %s" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Lungime de opțiune neașteptată în timp ce se verifica dacă SO_PASSCRED este " +"activat pe socket. Se așteptau %d octeți, s-a primit %d" + +#: ../gio/gunixconnection.c:478 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Eroare la activarea SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Se aștepta să se citească un singur octet pentru a primi credențialele, dar " +"s-au citi zero octeți" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "S-a așteptat un mesaj de control, dar s-au primit %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Eroare la dezactivarea SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Eroare la citirea din „unix”: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Eroare la închiderea „unix”: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Rădăcina sistemului de fișiere" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Eroare la scrierea în „unix”: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "Volumul nu implementează „eject” sau „eject_with_operation”" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Nu s-a putut găsi aplicația" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Eroare la lansarea aplicației: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI-urile nu sunt admise" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "editarea asocierilor de fișiere nu e implementată în win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Crearea asocierilor de fișiere nu este implementată în win32" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Eroare la citirea din handle: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Eroare la închiderea handle-ului: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Eroare la scrierea în handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Memorie insuficientă" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Eroare internă: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Sunt necesare date suplimentare de la intrare" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Date comprimate nevalid" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "" +#~ "Tipul valorii rezultatului nu este corect, s-a primit „%s”, se aștepta " +#~ "„%s”" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "S-a încercat setarea proprietății %s cu tipul %s, dar conform interfeței " +#~ "așteptate tipul este %s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "Nu există schema „%s” specificată în fișierul de suprascriere „%s”" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Comenzi:\n" +#~ " help Afișează aceste informații\n" +#~ " get Obține valoarea unei chei\n" +#~ " set Setează valoarea unei chei\n" +#~ " reset Resetează valoarea unei chei\n" +#~ " monitor Monitorizează o cheie pentru schimbări\n" +#~ " writable Verifică dacă o cheie poate fi scrisă\n" +#~ "\n" +#~ "Utilizați '%s COMANDĂ --help' pentru a primi ajutor pentru comenzi " +#~ "individuale.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Specifică calea către schemă" + +#~ msgid "PATH" +#~ msgstr "CALE" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Argumente:\n" +#~ " SCHEMĂ Identificatorul schemei\n" +#~ " CHEIE Numele cheii\n" +#~ " VALOARE Valoarea la care se definește cheia, cum este serializată " +#~ "de GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Cheia %s nu poate fi scrisă\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Monitorizează cheia CHEIE pentru modificări și afișează valorile " +#~ "modificate.\n" +#~ "Monitorizarea va continua până când procesul este terminat." + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "Eroare la scrierea primilor 16 octeți ai mesajului în socket: " + +#~ msgid "The nonce-file `%s' was %lu bytes. Expected 16 bytes." +#~ msgstr "Fișierul nonce „%s” are %lu octeți. Se așteptau exact 16 octeți." diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..1d2d498 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,4467 @@ +# translation of ru.po to Russian +# Copyright (C) 1998-2002, 2004, 2006, 2008, 2010 Free Software Foundation, Inc. +# +# Valek Filippov , 2001-2002. +# Dmitry G. Mastrukov , 2002-2003. +# Leonid Kanter , 2004, 2006, 2010. +# Vasiliy Faronov , 2008. +# Yuri Kozlov , 2008. +# Anisimov Victor , 2009. +# Yuri Kozlov , 2010, 2011, 2012. +# Yuri Myasoedov , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: ru\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 23:40+0000\n" +"PO-Revision-Date: 2012-09-17 20:29+0400\n" +"Last-Translator: Yuri Myasoedov \n" +"Language-Team: русский \n" +"Language: ru\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: Lokalize 1.4\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Слишком большое значение количества передано в %s" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Переход в базовом потоке не поддерживается" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Нельзя усечь GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Поток уже закрыт" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Усечение не поддерживается в базовом потоке" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Действие было отменено" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Недопустимый объект, не инициализировано" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Неполная многобайтовая последовательность во входных данных" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Недостаточно места для результата" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Недопустимая последовательность байтов во входных преобразуемых данных" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Произошла ошибка при преобразовании: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Прерываемая инициализация не поддерживается" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Преобразование из набора символов «%s» в «%s» не поддерживается" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не удалось открыть преобразователь из «%s» в «%s»" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "тип %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Неизвестный тип" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "тип файлов %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "Тип GCredentials не реализован для этой ОС" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Поддержка GCredentials для вашей платформы отсутствует" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неожиданный ранний конец потока" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Неподдерживаемый ключ «%s» в элементе адреса «%s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Неправильный адрес «%s» (требуется путь, временный каталог или один из " +"абстрактных ключей)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Бессмысленная комбинация ключ/значение в элементе адреса «%s»" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Ошибка в адресе «%s» — неправильный формат атрибута порта" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Ошибка в адресе «%s» — неправильный формат атрибута семейства" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "В элементе адреса «%s» отсутствует двоеточие (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Пара ключ/значение %d, «%s», в элементе адреса «%s» не содержит знака " +"равенства" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Ошибка снятия экранирования ключа или значения в паре ключ/значение %d, " +"«%s», в элементе адреса «%s»" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Ошибка в адресе «%s» — для транспорта unix требуется только один " +"установленный ключ «path» или «abstract»" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Ошибка в адресе «%s» — атрибут узла отсутствует или имеет неправильный формат" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Ошибка в адресе «%s» — атрибут порта отсутствует или имеет неправильный " +"формат" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Ошибка в адресе «%s» — атрибут noncefile отсутствует или имеет неправильный " +"формат" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Ошибка автоматического запуска: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Неизвестный или неподдерживаемый транспорт «%s» для адреса «%s»" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Произошла ошибка при открытии nonce-файла «%s»: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Произошла ошибка при чтении nonce-файла «%s»: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Произошла ошибка при чтении nonce-файла «%s», ожидалось 16 байт, получено %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Произошла ошибка записи содержимого nonce-файла «%s» в поток:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Указанный адрес пуст" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "" +"Невозможно породить процесс шины сообщений, если установлен атрибут setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Невозможно породить процесс шины сообщений без идентификатора машины:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Произошла ошибка при создании процесса командной строки «%s»: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Чтобы закрыть это окно, введите любой символ)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Сеанс dbus не запущен, и автозапуск не выполнился" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Не удалось определить адрес сеансовой шины (не реализовано для этой ОС)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Не удалось определить адрес шины из значения переменной окружения " +"DBUS_STARTER_BUS_TYPE — неизвестное значение «%s»" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Не удалось определить адрес шины, т. к. значение переменной окружения " +"DBUS_STARTER_BUS_TYPE не установлено" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Неизвестный тип шины %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Неожиданное отсутствие содержимого при чтении строки" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Неожиданное отсутствие содержимого при (надёжном) чтении строки" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Перепробованы все доступные механизмы аутентификации (проведено: %s) " +"(доступно: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Отменено через GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Ошибка при получении информации о каталоге «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "Ошибочные права на каталог «%s». Ожидалось 0700, получено 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Произошла ошибка при создании каталога «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Произошла ошибка при открытии связки ключей «%s» на чтение: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Некорректная строка %d в связке ключей около «%s» с содержимым «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Некорректная первая лексема в строке %d в связке ключей около «%s» с " +"содержимым «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Некорректная вторая лексема в строке %d в связке ключей около «%s» с " +"содержимым «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Не удалось найти куки с идентификатором %d в связке ключей «%s»" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Произошла ошибка при удалении устаревшего файла блокировки «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Произошла ошибка при создании файла блокировки «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Произошла ошибка при закрытии (удалённого) файла блокировки «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Произошла ошибка при удалении файла блокировки «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Произошла ошибка при открытии связки ключей «%s» на запись: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Также, не удалось освободить блокировку «%s»: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Соединение закрыто" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Время ожидания истекло" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "При создании клиентского соединения обнаружены неподдерживаемые флаги" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Интерфейс «org.freedesktop.DBus.Properties» для пути %s объекта не найден" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Ошибка установки свойства «%s»: ожидался тип «%s», но получен «%s»" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Свойство «%s» отсутствует" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Свойство «%s» недоступно для чтения" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Свойство «%s» недоступно для записи" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Интерфейс «%s» отсутствует" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Интерфейс отсутствует" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Интерфейс «%s» для пути %s объекта не найден" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Метод «%s» отсутствует" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Тип сообщения «%s» не совпадает с ожидаемым типом «%s»" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Объект интерфейса %s уже экспортирован как %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Метод «%s» вернул тип «%s», но ожидалось «%s»" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Метод «%s» интерфейса «%s» с подписью «%s» не существует" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Поддерево уже экспортировано для %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "НЕПРАВИЛЬНЫЙ тип" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Сообщение METHOD_CALL: отсутствует поле заголовка PATH или MEMBER" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Сообщение METHOD_RETURN: отсутствует поле заголовка REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Сообщение ERROR: отсутствует поле заголовка REPLY_SERIAL или ERROR_NAME" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Сообщение SIGNAL: отсутствует поле заголовка PATH, INTERFACE или MEMBER" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Сообщение SIGNAL: поле заголовка PATH использует зарезервированное значение /" +"org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Сообщение SIGNAL: поле заголовка INTERFACE использует зарезервированное " +"значение org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Требовалось прочитать %lu байт, но получен EOF" +msgstr[1] "Требовалось прочитать %lu байта, но получен EOF" +msgstr[2] "Требовалось прочитать %lu байт, но получен EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Ожидалась корректная строка UTF-8, но обнаружены недопустимые байты " +"(смещение %d, длина строки %d). Корректная строка UTF-8 вплоть до тех байт: " +"«%s»" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Ожидался байт NUL после строки «%s», но найден байт %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Разобранное значение «%s» не является допустимым путём объекта D-Bus" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Разобранное значение «%s» не является допустимой подписью D-Bus" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Обнаружен массив длинной %u байт. Максимальная длина равна 2<<26 байт (64 " +"МиБ)." +msgstr[1] "" +"Обнаружен массив длинной %u байта. Максимальная длина равна 2<<26 байт (64 " +"МиБ)." +msgstr[2] "" +"Обнаружен массив длинной %u байт. Максимальная длина равна 2<<26 байт (64 " +"МиБ)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Разобранное значение «%s» для варианта не является допустимой подписью D-Bus" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Ошибка десериализации GVariant с типом строки «%s» из формата D-Bus wire" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Неправильный порядок байтов в значении. Ожидался 0x6c ('l') или 0x42 ('B'), " +"но найдено значение 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Неправильный старший номер версии протокола. Ожидался 1, но найден %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Найден заголовок подписи с подписью «%s», но тело сообщения пусто" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Разобранное значение «%s» не является допустимой подписью D-Bus (для тела)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Отсутствует заголовок подписи в сообщении, но тело сообщения занимает %u байт" +msgstr[1] "" +"Отсутствует заголовок подписи в сообщении, но тело сообщения занимает %u " +"байта" +msgstr[2] "" +"Отсутствует заголовок подписи в сообщении, но тело сообщения занимает %u байт" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Не удалось выполнить десериализацию сообщения:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Ошибка сериализации GVariant с типом строки «%s» в формат D-Bus wire" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Сообщение содержит %d файловых дескрипторов, но в поле заголовка указано %d" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Не удалось сериализовать сообщение: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Тело сообщения имеет подпись «%s», но нет заголовка подписи" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Тело сообщения имеет тип подписи «%s», но значение подписи в поле заголовка " +"равно «%s»" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" +"Тело сообщения пусто, но значение подписи в поле заголовка равно «(%s)»" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Возвращена ошибка с телом типа «%s»" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Возвращена ошибка с пустым телом" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Не удалось получить профиль аппаратуры: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Не удалось загрузить /var/lib/dbus/machine-id или /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Ошибка вызова StartServiceByName для %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Неожиданный ответ %d из метода StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Не удалось вызвать метод; у прокси с хорошо известным именем нет владельца и " +"прокси создать с флагом G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Абстрактное пространство имён не поддерживается" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Не удалось задать nonce-файл при создании сервера" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Произошла ошибка при записи в nonce-файл у «%s»: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Строка «%s» не является допустимым D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Невозможно прослушивать неподдерживаемый транспорт «%s»" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "КОМАНДА" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Команды:\n" +" help Показать эту справку\n" +" introspect Интроспектировать удалённый объект\n" +" monitor Следить за удалённым объектом\n" +" call Вызвать метод удалённого объекта\n" +" emit Послать сигнал\n" +"\n" +"Для получения справки по команде используйте «%s КОМАНДА --help».\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Ошибка: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Произошла ошибка при разборе интроспекции XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Подключиться к системной шине" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Подключиться к пользовательской шине" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Подключиться к заданному адресу D-Bus" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Параметры оконечной точки соединения:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Параметры, определяющие оконечную точку соединения" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Оконечная точка соединения не указана" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Указано несколько оконечных точек соединения" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Предупреждение: согласно данным интроспекции, интерфейс «%s» не существует\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Предупреждение: согласно данным интроспекции, метод «%s» в интерфейсе «%s» " +"не существует\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Необязательный получатель сигнала (уникальное имя)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Объектный путь, для выпуска сигнала" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Название сигнала и интерфейса" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Послать сигнал." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Произошла ошибка при соединении: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Ошибка: не указан объектный путь.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Ошибка: %s не является допустимым объектным путём\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Ошибка: не задан сигнал.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "" +"Ошибка: сигнал должен задаваться полностью определённым доменным именем\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Ошибка: %s не является допустимым именем интерфейса\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Ошибка: %s не является допустимым именем члена\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Ошибка: %s не является допустимым уникальным именем шины.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Произошла ошибка при разборе параметра %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Произошла ошибка при сбросе подключения: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Имя назначения, для которого вызывается метод" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Объектный путь, для которого вызывается метод" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Название метода или интерфейса" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Время ожидания в секундах" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Вызывает метод на удалённом объекте." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Ошибка: не указано назначение\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Ошибка: не указан объектный путь\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Ошибка: не указано имя метода\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Ошибка: неправильное имя метода «%s»\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Произошла ошибка при разборе параметра %d типа «%s»: %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Имя назначения для интроспекции" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Объектный путь для интроспекции" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "Напечатать XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Интроспекция потомка" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Только свойства печати" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Выполнить интроспекцию удалённого объекта." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Имя назначения для наблюдения" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Объектный путь для наблюдения" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Наблюдать за удалённым объектом." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Без имени" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "В desktop-файле не указано поле Exec" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "Не удалось найти терминал, требуемый для приложения" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не удалось создать пользовательскую папку настроек приложения %s: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не удалось создать пользовательскую папку настроек MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "В информации о приложении отсутствует идентификатор" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не удалось создать пользовательский desktop-файл %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "Особое определение для %s" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "привод не поддерживает извлечение или извлечение_с_операцией" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "привод не поддерживает опрос носителя" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "привод не поддерживает старт" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "привод не поддерживает остановку" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Поддержка TLS недоступна" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Не удалось обработать версию %d текстового представления GEmblem" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Некорректное число лексем (%d) текстового представления GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Не удалось обработать версию %d текстового представления GEmblemedIcon" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Некорректное число лексем (%d) текстового представления GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Для GEmblemedIcon ожидается GEmblem" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Содержащая точка монтирования не существует" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Нельзя скопировать поверх каталога" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "Нельзя скопировать каталог поверх каталога" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Целевой файл существует" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "Не удалось рекурсивно скопировать каталог" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "Соединение не поддерживается" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "Произошла ошибка при соединении файла: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "Нельзя скопировать специальный файл" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "Дано неверное значение символьной ссылки" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "Корзина не поддерживается" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имена файлов не могут содержать «%c»" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "том не поддерживает присоединение" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "Нет зарегистрированного приложения для обработки данного файла" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Перечислитель закрыт" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Перечислитель файлов имеет незавершённое действие" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Поток не поддерживает query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "Переход по потоку не поддерживается" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "Усечение на входном потоке не разрешено" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Усечение не поддерживается на потоке" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неверное число лексем (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Нет типа для класса с именем %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Тип %s не реализует интерфейс GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Тип %s не является классифицируемым" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Некорректный номер версии: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Тип %s не реализует from_tokens() интерфейса GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Не удалось обработать данную версию текстового представления значка" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Адрес не указан" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Значение длины %u слишком велико для адреса" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "В адресе установлены биты вне пределов длины префикса" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Невозможно считать «%s» маской IP-адреса" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Недостаточно места для адреса сокета" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Неподдерживаемый адрес сокета" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Поток имеет незавершённое действие" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Элемент <%s> не может быть внутри <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Элемент <%s> не может быть самым верхним" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Файл %s указан в ресурсе несколько раз" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Не удалось обнаружить «%s» в каталогах-источниках" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Не удалось обнаружить «%s» в текущем каталоге" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Неизвестный параметр обработки «%s»" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Не удалось создать временный файл: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Произошла ошибка при обработке входного файла с помощью xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Произошла ошибка при обработке входного файла с помощью to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Ошибка при чтении файла %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Ошибка при сжатии файла %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "текста не может быть внутри <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "имя выходного файла" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "ФАЙЛ" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Каталоги, в которых ищутся файлы для чтения (по умолчанию текущий каталог)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "КАТАЛОГ" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Генерировать результат в формате в соответствии с расширением целевого файла" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Генерировать исходный заголовок" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Генерировать sourcecode, который используется для связи с файлом ресурсов " +"вашего кода" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Генерировать список зависимостей" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Не создавать или регистрировать ресурс автоматически" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Имя C-идентификатора, используемое для генерации исходного кода" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Компилировать спецификацию ресурсов в файл ресурсов.\n" +"Файлы спецификации ресурсов имеют расширение .gresource.xml,\n" +"а файл ресурса имеет расширение .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Должно быть указано только одно имя имя файла\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "пустые имена запрещены" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "неверное имя «%s»: имена должны начинаться со строчной буквы" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"неверное имя «%s»: неверный символ «%c»; допускаются только строчные буквы, " +"числа и дефис («-»)." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "неверное имя «%s»: нельзя указывать два дефиса одновременно («--»)." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "неверное имя «%s»: последний символ не может быть дефисом («-»)." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "неверное имя «%s»: максимальная длина равна 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " уже задан" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "не удалось добавить ключи в схему «list-of»" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " уже задан" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" оттеняет в ; для изменения " +"значения используйте " + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"в качестве атрибута можно указать только «type», «enum» или «flags»" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> не определён (пока)." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "недопустимая строка типа GVariant «%s»" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " указан, но схема ничего не расширяет" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "не задан для замещения" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " уже задан" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " уже задан" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " расширяет пока не существующую схему «%s»" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " является списком пока не существующей схемы «%s»" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Не может быть списком схемы с путём" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Не удалось расширить схему путём" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" является списком, расширяющим , который не " +"является списком" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" расширяет , но " +"«%s» не расширяет «%s»" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" +"если указывается путь, то он должен начинаться и заканчиваться символом " +"косой черты" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "путь в списке должен заканчиваться «:/»" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> уже задан" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Элемент <%s> не может быть самым верхним" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "Был указан параметр --strict; завершение работы.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Всё содержимое файла было проигнорировано.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Этот файл игнорируется.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "Ключ «%s» в схеме «%s» отсутствует, хотя указан в файле замен «%s»" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; игнорируется замена для этого ключа.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " и был указан параметр --strict; завершение работы.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"ошибка разбора ключа «%s» в схеме «%s», который указан в файле замен «%s»: " +"%s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Игнорируется замена для этого ключа.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"замена ключа «%s» в схеме «%s» согласно файлу замен «%s» лежит вне " +"диапазона данной схемы" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"замена ключа «%s» в схеме «%s» согласно файлу замен «%s» лежит вне списка " +"допустимых значений" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "место хранения файла gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Останавливать работу при возникновении ошибок в схемах" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Не записывать файл gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Не устанавливать ограничения на имя ключа" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Компилировать все файлы схемы GSettings в кэш схемы.\n" +"Файлы схемы требуются для расширения .gschema.xml,\n" +"а файл кэша называется gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Должно быть указано только одно имя каталога\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Файлы схемы не найдены: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "ничего не выполняется.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "удалён существующий выходной файл.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Не удалось найти тип монитора локальных каталогов по умолчанию" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Недопустимое имя файла %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Произошла ошибка при получении сведений о файловой системе: %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "Нельзя переименовать корневой каталог" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "Произошла ошибка при переименовании файла: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "Невозможно переименовать файл, файл с таким именем уже существует" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Недопустимое имя файла" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Не удалось открыть каталог" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Произошла ошибка при открытии файла: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Произошла ошибка при удалении файла: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "Произошла ошибка при удалении файла в корзину: %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не удалось создать каталог корзины %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "Не удалось найти каталог верхнего уровня для корзины" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "Не удалось найти или создать каталог корзины" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не удалось создать запись о файле в корзине: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не удалось удалить файл в корзину: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "внутренняя ошибка" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Произошла ошибка при создании каталога: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файловая система не поддерживает символьные ссылки" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Произошла ошибка при создании символьной ссылки: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Произошла ошибка при перемещении файла: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "Нельзя переместить каталог поверх каталога" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Не удалось создать резервный файл" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Произошла ошибка при удалении целевого файла: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "Перемещение между точками монтирования не поддерживается" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "Значение атрибута не должно быть NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "Неверный тип атрибута (ожидалась строка)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "Недопустимое имя расширенного атрибута" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Произошла ошибка при установке расширенного атрибута «%s»: %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (неверная кодировка)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Ошибка при получении информации о файле «%s»: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Ошибка при получении информации о файловом дескрипторе: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неверный тип атрибута (ожидался uint32)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неверный тип атрибута (ожидался uint64)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неверный тип атрибута (ожидалась строка byte)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "Не удалось установить права на символические ссылки" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Произошла ошибка при установке прав: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "Произошла ошибка при установке владельца: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "символьная ссылка не должна быть NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Произошла ошибка при установке символьной ссылки: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Произошла ошибка при установке символьной ссылки: файл не является " +"символьной ссылкой" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Произошла ошибка при установке времени модификации или доступа: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "Контекст SELinux не должен быть равен NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Произошла ошибка при установке контекста SELinux: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "В этой системе не включён SELinux" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Установка атрибута %s не поддерживается" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Произошла ошибка при чтении из файла: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Произошла ошибка при переходе по файлу: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Произошла ошибка при закрытии файла: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Не удалось найти тип монитора локальных файлов по умолчанию" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Произошла ошибка при записи в файл: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Произошла ошибка при удалении старой резервной ссылки: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Произошла ошибка при создании резервной копии: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Произошла ошибка при переименовании временного файла: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Произошла ошибка при усечении файла: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Произошла ошибка при открытии файла «%s»: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Целевой файл является каталогом" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "Целевой файл не является обычным файлом" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Файл был изменён извне" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Произошла ошибка при удалении старого файла: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "Передан недопустимый GSeekType" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Недопустимый запрос на переход" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Нельзя усечь GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Невозможно изменить размер выходного потока в память" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Не удалось изменить размер выходного потока в память" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Количество памяти, требуемое процессом записи, больше чем доступное адресное " +"пространство" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "Выполнять перемещение в начало потока" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "точка монтирования не поддерживает «отсоединение»" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"точка монтирования не поддерживает возможность синхронного определения типа " +"содержимого" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Имя узла «%s» содержит «[», но не «]»" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Сеть недоступна" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Узел недоступен" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Не удалось создать сетевой монитор: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Не удалось создать сетевой монитор: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Не удалось получить состояние сети: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Выходной поток не поддерживает запись" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Исходный поток уже закрыт" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Ошибка разрешения «%s»: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ошибка обратного разрешения «%s»: %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Запись DNS с запрашиваемым типом «%s» отсутствует" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Временно невозможно разрешить «%s»" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Ошибка разрешения «%s»" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Получены неполные данные для «%s»" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Ресурс из «%s» не существует" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Не удалось расжать ресурс из «%s»" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Ресурс из «%s» не является каталогом" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "По входному потоку перемещение не поддерживается" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "Напечатать справку" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[КОМАНДА]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Вывести разделы, содержащие ресурсы в elf-ФАЙЛЕ" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Вывод списка ресурсов\n" +"Если указан РАЗДЕЛ, то выводится список ресурсов только из этого раздела\n" +"Если указан ПУТЬ, то выводится список совпадающих ресурсов" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "ФАЙЛ [ПУТЬ]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "РАЗДЕЛ" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Вывод списка ресурсов с подробностями\n" +"Если указан РАЗДЕЛ, то выводится список ресурсов только из этого раздела\n" +"Если указан ПУТЬ, то выводится список совпадающих ресурсов\n" +"Дополнительно выводится раздел, размер и сжатие" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Извлечь файл ресурса в stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "ФАЙЛ ПУТЬ" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Неизвестная команда %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Использование:\n" +" gresource [--section РАЗДЕЛ] КОМАНДА [АРГУМЕНТЫ…]\n" +"\n" +"Команды:\n" +" help Показать эту справку\n" +" sections Вывести разделы с ресурсами\n" +" list Вывести ресурсы\n" +" details Вывести ресурсы с подробностями\n" +" extract Извлечь ресурс\n" +"\n" +"Для получения справки используйте «gresource help КОМАНДА».\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Использование:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Аргументы:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " РАЗДЕЛ Имя раздела elf (необязательный)\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " КОМАНДА Команда для пояснения (необязательный)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " ФАЙЛ Файл elf (исполняемый или общая библиотека)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ФАЙЛ Файл elf (исполняемый или общая библиотека)\n" +" или скомпилированный файл ресурсов\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[ПУТЬ]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" +" ПУТЬ Путь ресурса (необязательный, можно указать только часть)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "ПУТЬ" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " ПУТЬ Путь ресурса\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Схема «%s» отсутствует\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Схема «%s» не является перемещаемой (задание пути недопустимо)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Схема «%s» является перемещаемой (должен быть указан путь)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Указан пустой путь.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Путь должен начинаться символом косой черты (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Путь должен заканчиваться символом косой черты (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "В пути не должно быть две стоящих рядом косых черты (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ключ «%s» отсутствует\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Предоставленное величина лежит вне диапазона допустимых значений\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Список установленных (неперемещаемых) схем" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Список установленных перемещаемых схем" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Список ключей в СХЕМЕ" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "СХЕМА[:ПУТЬ]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Список потомков СХЕМЫ" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Перечислить ключи и значения рекурсивно\n" +"Если указана СХЕМА, то перечислить все ключи\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[СХЕМА[:ПУТЬ]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Получить значение КЛЮЧА" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "СХЕМА[:ПУТЬ] КЛЮЧ" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Запросить диапазон допустимых значений КЛЮЧА" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Присвоить величину ЗНАЧЕНИЕ КЛЮЧУ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "СХЕМА[:ПУТЬ] КЛЮЧ ЗНАЧЕНИЕ" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Назначить КЛЮЧУ его значение по умолчанию" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Сбросить все ключи в СХЕМЕ в их значения по умолчанию" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Проверить, что КЛЮЧ доступен для записи" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Следить за изменениями КЛЮЧА.\n" +"Если КЛЮЧ не задан, то следить за всеми ключами СХЕМЫ.\n" +"Для остановки слежения используйте ^C.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "СХЕМА[:ПУТЬ] [КЛЮЧ]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Использование:\n" +" gsettings [--schemadir КАТАЛОГ_СХЕМ] КОМАНДА [АРГУМЕНТЫ…]\n" +"\n" +"Команды:\n" +" help Показать эту справку\n" +" list-schemas Список установленных схем\n" +" list-relocatable-schemas Список перемещаемых схем\n" +" list-keys Список ключей схемы\n" +" list-children Список потомков схемы\n" +" list-recursively Список ключей и значений, рекурсивно\n" +" range Запросить диапазон значений ключа\n" +" get Получить значение ключа\n" +" set Изменить значение ключа\n" +" reset Сбросить значение ключа\n" +" reset-recursively Сбросить все значения в заданной схеме\n" +" writable Проверить ключ на запись\n" +" monitor Следить за изменениями\n" +"\n" +"Подробную справку можно получить с помощью «gsettings help КОМАНДА».\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Использование:\n" +" gsettings [--schemadir КАТАЛОГ_СХЕМ] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " КАТ_СХЕМ Каталог для поиска дополнительных схем\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" СХЕМА Идентификатор схемы\n" +" ПУТЬ Путь, для перемещаемых схем\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " КЛЮЧ (Необязательный) ключ схемы\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " КЛЮЧ Ключ схемы\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " ЗНАЧЕНИЕ Присваиваемое значение\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Указано пустое имя схемы\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Недопустимый сокет, не инициализировано" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Недопустимый сокет, инициализация не удалась по причине: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Сокет уже закрыт" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Превышено время ожидания ввода-вывода сокета" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "создаётся GSocket из fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не удалось создать сокет: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Указано неизвестное семейство" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Указан неизвестный протокол" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "не удалось получить локальный адрес: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "не удалось получить удаленный адрес: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "не удалось слушать: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Произошла ошибка при связывании к адресу: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Ошибка при вступлении в мультикастовую группу: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Ошибка при выходе из мультикастовой группы: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Отсутствует поддержка мультикаста по источнику" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Ошибка приёма подключения: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Выполняется соединение" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не удалось получить ожидающую ошибку: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Ошибка при получении данных: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Ошибка при отправлении данных: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не удалось выключить сокет: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Произошла ошибка при закрытии сокета: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Ожидание состояния сокета: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Произошла ошибка при отправлении сообщения: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage не поддерживается в Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Произошла ошибка при получении сообщения: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "Функция g_socket_get_credentials не реализована в этой ОС" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Не удалось подключиться к прокси-серверу %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Не удалось подключиться к %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Не удалось подключиться к: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Неизвестная ошибка при соединении" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Проксирование через не-TCP соединение не поддерживается." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Протокол прокси «%s» не поддерживается." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Слушатель уже закрыт" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Добавленный сокет закрыт" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 не поддерживает адрес IPv6 «%s»" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Имя пользователя слишком длинно для протокола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Имя узла «%s» слишком длинно для протокола SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Сервер не является прокси-сервером SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Подключение через сервер SOCKSv4 было отклонено" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Сервер не является прокси-сервером SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Прокси SOCKSv5 требует аутентификацию." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Для прокси SOCKSv5 требуется метод аутентификации, который не поддерживается " +"GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Имя пользователя или пароль слишком длинные для протокола SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Аутентификация SOCKSv5 завершилась неудачно из-за неверного имени " +"пользователя или пароля." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Имя узла «%s» слишком длинное для протокола SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Прокси-сервер SOCKSv5 использует неизвестный тип адреса." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Внутренняя ошибка прокси-сервера SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Подключение SOCKSv5 запрещено набором правил." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Узел недоступен через сервер SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Сеть недоступна через прокси SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Подключение через прокси SOCKSv5 отклонено." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Прокси SOCKSv5 не поддерживает команду «connect»." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Прокси SOCKSv5 не поддерживает предложенный тип адреса." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Неизвестная ошибка прокси SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Не удалось обработать версию %d текстового представления GThemedIcon" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Не удалось расшифровать секретный ключ в формате PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Не найден секретный ключ в формате PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Не удалось разобрать секретный ключ в формате PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Не найден сертификат в формате PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Не удалось разобрать сертификат в формате PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Это последняя возможность правильно ввести пароль перед тем, как доступ " +"будет заблокирован." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Пароль был несколько раз введён неправильно, после следующих отказов ваш " +"доступ будет заблокирован." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Введённый пароль неверен." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Ожидается 1 контрольное сообщение, получено %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Неожиданный тип вспомогательных данных" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Ожидается один файловый дескриптор но получено %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Получен недопустимый файловый дескриптор" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Произошла ошибка при отправлении мандата:" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Произошла ошибка при проверке включения SO_PASSCRED для сокета: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Неожиданная длина параметра при проверке включения SO_PASSCRED для сокета. " +"Ожидалось %d байт, получено %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Произошла ошибка при включении SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Ожидалось прочитать один байт идентификационной информации (credentials), но " +"не прочитано ни одного байта" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Контрольное сообщение не ожидалось, но получено %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Произошла ошибка при отключении SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Ошибка при чтении из файлового дескриптора: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Ошибка при закрытии файлового дескриптора: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Корень файловой системы" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Ошибка при записи в файловый дескриптор: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"Абстрактные адреса доменных сокетов UNIX не поддерживаются на этой системе" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "том не поддерживает извлечение или извлечение_с_операцией" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Не удалось найти приложение" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Произошла ошибка при запуске приложения: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI не поддерживаются" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "смена ассоциаций не поддерживается в Win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Создание ассоциаций не поддерживается в Win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Произошла ошибка при чтении из дескриптора: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Произошла ошибка при закрытии дескриптора: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Произошла ошибка при записи в дескриптор: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Недостаточно памяти" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Внутренняя ошибка: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Требуется больше входных данных" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Неправильные сжатые данные" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Прослушиваемый адрес" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Игнорируется, для совместимости с GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Напечатать адрес" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Напечатать адрес в режиме оболочки" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Запуск службы dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Неверные параметры\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неожиданный атрибут «%s» элемента «%s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Не найден атрибут «%s» элемента «%s»" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неожиданный тэг «%s», ожидался тэг «%s»" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неожиданный тэг «%s» внутри «%s»" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Не удалось найти допустимый файл закладок в каталогах поиска" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Закладка для ресурса URI «%s» уже существует" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Для ресурса URI «%s» закладок не найдено" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "В закладке на ресурс «%s» не определён тип MIME" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Отметка о приватности данных в закладке для URI «%s» не определена" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "В закладке для URI «%s» не определена группа" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Нет приложения с именем «%s», создавшего закладку для «%s»" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не удалось дополнить строку выполнения «%s» с помощью URI «%s»" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "" +"Неполная символьная последовательность содержится в конце входных данных" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Невозможно корректно преобразовать символ «%s» в символ из набора «%s»" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"URI «%s» не является абсолютным идентификатором при использовании схемы " +"«file»" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Идентификатор URI локального файла «%s» не может включать символ «#»" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI «%s» недопустим" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Недопустимое имя узла в URI «%s»" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI «%s» содержит недопустимо экранированные символы" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путь «%s» не является абсолютным" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Недопустимое имя узла" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "д. п." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "п. п." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Январь" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Февраль" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Март" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Апрель" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Май" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Июнь" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Июль" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Август" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Сентябрь" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Октябрь" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Ноябрь" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Декабрь" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Янв" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Фев" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Мар" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Апр" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Май" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Июн" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Июл" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Авг" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Сен" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Окт" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Ноя" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Дек" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Понедельник" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Вторник" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Среда" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Четверг" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Пятница" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Суббота" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Воскресенье" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Пн" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Вт" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Ср" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Чт" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Пт" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Сб" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Вс" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Произошла ошибка при открытии каталога «%s»: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не удалось выделить %lu байтов для прочтения файла «%s»" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Произошла ошибка при чтении файла «%s»: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файл «%s» слишком велик" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не удалось прочитать из файла «%s»: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не удалось открыть файл «%s»: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не удалось получить атрибуты файла «%s»: сбой в функции fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не удалось открыть файл «%s»: сбой в функции fdopen(): %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Не удалось переименовать файл «%s» в «%s»: сбой в функции g_rename(): %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не удалось создать файл «%s»: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не удалось открыть файл «%s» для записи: сбой в функции fdopen(): %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fwrite(): %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fflush(): %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции fsync(): %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не удалось закрыть файл «%s»: сбой в функции fclose(): %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" +"Не удалось удалить существующий файл «%s»: сбой в функции g_unlink(): %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблон «%s» недопустим: он не должен содержать «%s»" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон «%s» не содержит XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не удалось прочитать символьную ссылку «%s»: %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "Символьные ссылки не поддерживаются" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не удалось открыть преобразователь из «%s» в «%s»: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "" +"Невозможно выполнить непосредственное чтение в функции " +"g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "В буфере чтения остались непреобразованные данные" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Канал закрывается на неполном символе" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "" +"Невозможно выполнить непосредственное чтение в функции " +"g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "В каталогах поиска не удалось найти допустимый файл ключей" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "Не является обычным файлом" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Файл ключей содержит строку «%s», которая не является парой «ключ-значение», " +"группой или комментарием" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Недопустимое имя группы: %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "Файл ключей не начинается с группы" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Недопустимое имя ключа: %s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Файл ключей содержит неподдерживаемую кодировку «%s»" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Файл ключей не содержит группу «%s»" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Файл ключей не содержит ключ «%s»" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Файл ключей содержит ключ «%s», значение которого «%s» не в кодировке UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Файл ключей содержит ключ «%s», значение которого не удалось " +"интерпретировать." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Файл ключей содержит ключ «%s» в группе «%s», значение которого не удалось " +"распознать." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Значение ключа «%s» в группе «%s» равно «%s», но ожидалось «%s»" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Файл ключей не содержит ключа «%s» в группе «%s»" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "Файл ключей содержит символ escape в конце строки" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Файл ключей содержит неверную экранирующую последовательность «%s»" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Не удалось преобразовать значение «%s» в число." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целочисленное значение «%s» выходит за пределы" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Не удалось преобразовать «%s» в число с плавающей запятой." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Не удалось преобразовать «%s» в булево значение." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Не удалось получить атрибуты файла «%s%s%s%s»: сбой в функции fstat(): %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Не удалось отобразить файл «%s%s%s%s»: сбой в функции mmap(): %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не удалось открыть файл «%s»: сбой в функции open(): %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Ошибка в строке %d на символе %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" +"Недопустимый UTF-8 текст в имени — неправильная последовательность «%s»" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "Недопустимое имя «%s»" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "Недопустимое имя «%s»: «%c»" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Ошибка в строке %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Ссылка на символ «%-.*s» не определяет допустимый символ" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Обнаружена пустая конструкция «&;»; допустимыми конструкциями являются: " +"& " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Имя сущности «%-.*s» неизвестно" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ должен начинаться с элемента (например )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Символ «%s» является недопустимым после символа «<»; этот символ не может " +"начинать имя элемента" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Встретился лишний символ «%s», ожидался символ «>» для завершения пустого " +"элемента тэга «%s»" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Встретился лишний символ «%s», ожидался символ «=» после имени атрибута «%s» " +"элемента «%s»" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Символ «%s» недопустим после закрывающего элемента имени «%s»; допустимым " +"символом является «>»" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Элемент «%s» был закрыт, ни один элемент в настоящий момент не открыт" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" +"Элемент «%s» был закрыт, но открытым в настоящий момент является элемент «%s»" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Документ был пуст или содержал только пробелы" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ неожиданно окончился сразу же после открывающей угловой скобки «<»" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ неожиданно окончился, когда ещё были открыты элементы — «%s» был " +"последним открытым элементом" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ неожиданно окончился, ожидалась закрывающая тэг <%s/> угловая скобка" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ неожиданно окончился внутри имени элемента" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ неожиданно окончился внутри имени атрибута" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ неожиданно окончился внутри открывающего элемент тэга" + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ неожиданно окончился после знака равенства, следующего за именем " +"атрибута; значение атрибута не указано" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ неожиданно окончился внутри значения атрибута" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ неожиданно окончился внутри тэга, закрывающего элемент «%s»" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Документ неожиданно окончился внутри комментария или инструкции обработки" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Использование:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ПАРАМЕТР...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Параметры справки:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Показать параметры справки" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Показать все параметры справки" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Параметры приложения:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не удалось разобрать целочисленное значение «%s» для %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Целочисленное значение «%s» для %s выходит за пределы" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не удалось разобрать дробное значение двойной точности «%s» для %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Дробное значение двойной точности «%s» для %s выходит за пределы" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Произошла ошибка при разборе параметра %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Отсутствует аргумент для %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Неизвестный параметр %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "повреждённый объект" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "внутренняя ошибка или повреждённый объект" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "закончилась память" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "достигнут предел обратного хода" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблон содержит элементы, которые не поддерживаются при поиске частичного " +"совпадения" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"условия в виде обратных ссылок при поиске частичного совпадения не " +"поддерживаются" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "достигнут предел рекурсии" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "недопустимая комбинация флагов перевода строки" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "неправильное смещение" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "короткий utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "зацикливание рекурсии" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "неизвестная ошибка" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ в конце шаблона" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c в конце шаблона" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "неопознанный символ следует за \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "числа в квантификаторе {} в неправильном порядке" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "слишком большое число в квантификаторе {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "отсутствует завершающая ] для класса символов" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "неверное экранирование в классе символов" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "диапазон в классе символов в неправильном порядке" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "нечего повторять" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "неожиданное повторение" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "неопознанный символ после (? или (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "именованные классы POSIX поддерживаются только внутри класса" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "отсутствует завершающая )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "ссылка на несуществующий подшаблон" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "отсутствует ) после комментария" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "слишком длинное регулярное выражение" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "не удалось получить память" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") без открывающей (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "переполнение кода" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "неопознанный символ после (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-утверждение не имеет фиксированную длину" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "ошибочное число или имя после (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "условная группа содержит более двух ветвей" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "после (?R или (?[+-]цифры должна идти )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "неизвестное имя класса POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "сортировочные элементы POSIX не поддерживаются" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "слишком большое значение символа в последовательности \\x{...}" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ошибочное условие (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C запрещено в lookbehind-утверждениях" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "экранирование \\L, \\l, \\N{name}, \\U и \\u не поддерживается" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивный вызов мог повторяться бесконечно" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "неопознанный символ после (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "отсутствует завершающий символ в имени подшаблона" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "два именованных подшаблона имеют одинаковое имя" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "ошибочная последовательность \\P или \\p" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "неизвестное имя свойства после \\P или \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "имя подшаблона слишком длинное (не должно превышать 32 символа)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "слишком много именованных подшаблонов (не должно быть больше 10 000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "восьмеричное значение превышает \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "переполнение рабочего пространства компиляции" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "не найден ранее проверенный подшаблон со ссылкой " + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "группа DEFINE содержит более одной ветви" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "противоречивые параметры NEWLINE" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"за \\g не следует имя или число в скобках, угловых скобках или кавычках, или " +"просто число" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "номерная ссылка не может быть нулём" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "нельзя указать параметр для (*ACCEPT), (*FAIL) или (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "значение (*VERB) не распознано" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "слишком большое число" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "отсутствует имя подшаблона после (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "ожидалась цифра после (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "нельзя использовать символ ] в режиме совместимости JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "" +"не допускаются использовать различные имена для подшаблонов с одинаковым " +"номером" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "для (*MARK) требуется параметр" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "за \\c должен быть символ ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "за \\k не следует имя в скобках, угловых скобках или кавычках" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N в классе не поддерживается" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "слишком много прямых ссылок" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "слишком длинное имя в (*MARK), (*PRUNE), (*SKIP) или (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "слишком большое значение символа в \\u...." + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" +"Во время поиска совпадений с регулярным выражением %s возникла ошибка: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Библиотека PCRE собрана без поддержки UTF-8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Библиотека PCRE собрана без поддержки свойств UTF-8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Библиотека PCRE собрана с несовместимыми параметрами" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" +"Произошла ошибка при компиляции регулярного выражения %s у символа с номером " +"%d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Произошла ошибка при оптимизации регулярного выражения %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "ожидалась шестнадцатеричная цифра или символ «}»" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "ожидалась шестнадцатеричная цифра" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "в символьной ссылке отсутствует «<»" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "незаконченная символьная ссылка" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "символьная ссылка нулевой длины" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "ожидалась цифра" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "недопустимая символьная ссылка" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "лишний «\\» в конце" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "неизвестная экранирующая последовательность" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Произошла ошибка во время разбора текста замен «%s» у символа с номером %lu: " +"%s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Текст в кавычках не начинается с символа кавычки" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Обнаружена незакрытая кавычка в командной строке или другом тексте от " +"оболочки" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст закончился сразу после символа «\\» (текст был «%s»)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текст закончился до того, как была найдена закрывающая кавычка для %c (текст " +"был «%s»)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст был пуст (или содержал только пробелы)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Не удалось прочитать данные из процесса-потомка (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Произошла неожиданная ошибка в функции select() при чтении данных из " +"процесса-потомка (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Произошла неожиданная ошибка в функции waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Дочерний процесс завершился с кодом %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Дочерний процесс убит по сигналу %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Дочерний процесс остановлен по сигналу %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Дочерний процесс аварийно завершил работу" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Не удалось прочитать данные из канала потомка (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Функция fork завершилась неудачно (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Не удалось сменить каталог на «%s» (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Не удалось выполнить процесс-потомок «%s» (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Не удалось перенаправить вывод или ввод процесса-потомка (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "При создании процесса-потомка функция fork завершилась неудачно (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Произошла неизвестная ошибка при выполнении процесса-потомка «%s»" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Не удалось прочитать нужное количество данных из канала процесса-потомка (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Не удалось создать канал для сообщения с процессом-потомком (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "Не удалось прочитать данные из процесса-потомка" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Не удалось выполнить процесс-потомок (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Недопустимое имя программы: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Недопустимая строка в векторе аргументов под номером %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Недопустимая строка в окружении: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Недопустимый рабочий каталог: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не удалось выполнить вспомогательную программу (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Произошла неожиданная ошибка в функции g_io_channel_win32_poll() при чтении " +"данных из процесса-потомка" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Символ находится вне диапазона для UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "" +"Во входной строке для преобразования обнаружена недопустимая " +"последовательность" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Символ находится вне диапазона для UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байта" +msgstr[2] "%u байт" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f КиБ" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f МиБ" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f ГиБ" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f ТиБ" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f ПиБ" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f ЭиБ" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f кБ" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f МБ" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f ГБ" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ТБ" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ПБ" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ЭБ" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s байт" +msgstr[1] "%s байта" +msgstr[2] "%s байт" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f КБ" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "" +#~ "Нештатное завершение программы при создании процесса командной строки " +#~ "«%s»: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "Выполнение командной строки «%s» завершилось ненулевым кодом завершения " +#~ "%d: %s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "достигнут предел рабочего пространства для пустых подстрок" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "экранирование, изменяющее регистр (\\l, \\L, \\u, \\U), здесь запрещено" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "запрещено повторять группу DEFINE" + +#~ msgid "No service record for '%s'" +#~ msgstr "Нет служебной записи для «%s»" + +#~ msgid "File is empty" +#~ msgstr "Файл пуст" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "Файл ключей содержит ключ «%s», значение которого не удалось распознать." + +#~ msgid "This option will be removed soon." +#~ msgstr "Этот параметр будет скоро удалён." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Произошла ошибка при получении сведений о файле «%s»: %s" + +#~ msgid "Error connecting: " +#~ msgstr "Произошла ошибка при соединении:" + +#~ msgid "Error connecting: %s" +#~ msgstr "Произошла ошибка при соединении: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "В реализации SOCKSv4 имя пользователя ограничено %i символами" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "В реализации SOCKSv4a имя узла ограничено %i символами" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Произошла ошибка при чтении из unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Произошла ошибка при закрытии unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Произошла ошибка при записи в unix: %s" diff --git a/po/rw.po b/po/rw.po new file mode 100644 index 0000000..d361cf7 --- /dev/null +++ b/po/rw.po @@ -0,0 +1,3896 @@ +# translation of glib to Kinyarwanda. +# Copyright (C) 2005 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Steve Murphy , 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-03-28 19:34-0700\n" +"Last-Translator: Steve Murphy \n" +"Language-Team: Kinyarwanda \n" +"Language: rw\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Inyuguti Ikitezwe: a Nyuma Ikiranga Izina: Bya Ikigize:" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Kuri Gusoma Ihuza" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, fuzzy, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Bivuye Inyuguti Gushyiraho Kuri ni OYA" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "OYA Gufungura Bivuye Kuri" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +#, fuzzy +msgid "Invalid byte sequence in conversion input" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, fuzzy, c-format +msgid "Error during conversion: %s" +msgstr "Ihindurangero" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +#, fuzzy +msgid "Partial character sequence at end of input" +msgstr "Inyuguti ku Impera Bya Iyinjiza" + +#: ../glib/gconvert.c:1059 +#, fuzzy, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "GUHINDURA Kuri" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, fuzzy, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "IDOSIYE Gicurasi OYA Gushyiramo a" + +#: ../glib/gconvert.c:1913 +#, fuzzy, c-format +msgid "The URI '%s' is invalid" +msgstr "ni Sibyo" + +#: ../glib/gconvert.c:1925 +#, fuzzy, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Izina ry'inturo: Bya ni Sibyo" + +#: ../glib/gconvert.c:1941 +#, fuzzy, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Kirimo Inyuguti" + +#: ../glib/gconvert.c:2036 +#, fuzzy, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ni OYA Inzira" + +#: ../glib/gconvert.c:2046 +#, fuzzy +msgid "Invalid hostname" +msgstr "Izina ry'inturo:" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Mutarama" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Gashyantare" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Werurwe" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Mata" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Gicuransi" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Kamena" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Nyakanga" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Mut" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Gas" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Wer" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Mat" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Gic" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Kam" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Nya" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Kuwa mbere" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Kuwa kabiri" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Kuwa gatatu" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Kuwa kane" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Kuwa gatanu" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Kuwa gatandatu" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Ku cyumweru" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Mbe" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Kab" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Gtu" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Kan" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Gnu" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Gnd" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Mwe" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, fuzzy, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gufungura %s%S bushyinguro" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, fuzzy, c-format +msgid "Error reading file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, fuzzy, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Kuri Gusoma Bivuye IDOSIYE" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, fuzzy, c-format +msgid "Failed to open file '%s': %s" +msgstr "Kuri Gufungura IDOSIYE" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, fuzzy, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Kuri Kubona Ibiranga Bya IDOSIYE Byanze" + +#: ../glib/gfileutils.c:754 +#, fuzzy, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, fuzzy, c-format +msgid "Failed to create file '%s': %s" +msgstr "Kuri Kurema IDOSIYE" + +#: ../glib/gfileutils.c:918 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Kuri Gufungura IDOSIYE kugirango Byanze" + +#: ../glib/gfileutils.c:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Kuri Gufunga IDOSIYE Byanze" + +#: ../glib/gfileutils.c:1152 +#, fuzzy, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "IDOSIYE OYA Cyavanyweho Byanze" + +#: ../glib/gfileutils.c:1412 +#, fuzzy, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Sibyo OYA a" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Impera Na:" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Kuri Gusoma Ihuza" + +#: ../glib/gfileutils.c:2231 +#, 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:2057 +#: ../glib/giochannel.c:2144 +#, 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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Kuri Gufungura IDOSIYE Byanze" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "ku Umurongo INYUGUTI" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "8 Umwandiko" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, fuzzy, c-format +msgid "Error on line %d: %s" +msgstr "ku Umurongo" + +#: ../glib/gmarkup.c:638 +#, 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:650 +#, 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:676 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Indango OYA a Inyuguti" + +#: ../glib/gmarkup.c:714 +#, fuzzy +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Byemewe" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Izina: ni OYA" + +#: ../glib/gmarkup.c:727 +#, 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:1078 +#, fuzzy +msgid "Document must begin with an element (e.g. )" +msgstr "g." + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, fuzzy, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Oya Ikigize: ni Gufungura" + +#: ../glib/gmarkup.c:1544 +#, fuzzy, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Gufungura Ikigize: ni" + +#: ../glib/gmarkup.c:1712 +#, fuzzy +msgid "Document was empty or contained only whitespace" +msgstr "ubusa Cyangwa" + +#: ../glib/gmarkup.c:1726 +#, fuzzy +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Nyuma Gufungura Imfuruka" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +#, fuzzy +msgid "Document ended unexpectedly inside an element name" +msgstr "Mo Imbere Ikigize: Izina:" + +#: ../glib/gmarkup.c:1754 +#, fuzzy +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Mo Imbere Ikiranga Izina:" + +#: ../glib/gmarkup.c:1759 +#, fuzzy +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Mo Imbere Ikigize: Gufungura%S Itagi:" + +#: ../glib/gmarkup.c:1765 +#, 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:1772 +#, fuzzy +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Mo Imbere Ikiranga Agaciro" + +#: ../glib/gmarkup.c:1788 +#, fuzzy, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Mo Imbere Gufunga Itagi: kugirango Ikigize:" + +#: ../glib/gmarkup.c:1794 +#, fuzzy +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Mo Imbere a Icyo wongeraho Cyangwa Inonosora" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "in a Bituzuye Inyuguti" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Inyuguti Indango" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Inyuguti Indango" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Inyuguti Indango" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "amahuza OYA" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "ku Umurongo INYUGUTI" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Indango" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +#, fuzzy +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Umwandiko Na: a Gusubiramo ibyavuzwe Ikimenyetso" + +#: ../glib/gshell.c:181 +#, 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:559 +#, fuzzy, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Nyuma a Inyuguti Umwandiko" + +#: ../glib/gshell.c:566 +#, 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:578 +#, fuzzy +msgid "Text was empty (or contained only whitespace)" +msgstr "ubusa Cyangwa" + +#: ../glib/gspawn-win32.c:282 +#, fuzzy +msgid "Failed to read data from child process" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, fuzzy, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Kuri Kurema kugirango Na:" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, fuzzy, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Kuri Gusoma Bivuye" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, fuzzy, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Kuri Guhindura>> Kuri bushyinguro" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, fuzzy, c-format +msgid "Failed to execute child process (%s)" +msgstr "Kuri Gukora" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Izina ry'inturo:" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "in Ihindurangero Iyinjiza" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Gufungura %s%S bushyinguro" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Kuri Gukora Porogaramu" + +#: ../glib/gspawn-win32.c:997 +#, 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:207 +#, fuzzy, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, fuzzy, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Ikosa in" + +#: ../glib/gspawn.c:1237 +#, fuzzy, c-format +msgid "Failed to fork (%s)" +msgstr "Kuri" + +#: ../glib/gspawn.c:1393 +#, fuzzy, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Kuri Gukora" + +#: ../glib/gspawn.c:1403 +#, fuzzy, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Kuri Ibisohoka Cyangwa Iyinjiza Bya" + +#: ../glib/gspawn.c:1412 +#, fuzzy, c-format +msgid "Failed to fork child process (%s)" +msgstr "Kuri" + +#: ../glib/gspawn.c:1420 +#, fuzzy, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Ikosa Gukora: %s%s" + +#: ../glib/gspawn.c:1444 +#, fuzzy, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Kuri Gusoma Ibyatanzwe Bivuye" + +#: ../glib/gutf8.c:1086 +#, fuzzy +msgid "Character out of range for UTF-8" +msgstr "Inyuma Bya Urutonde kugirango 8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +#, fuzzy +msgid "Invalid sequence in conversion input" +msgstr "in Ihindurangero Iyinjiza" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +#, 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:760 +msgid "Usage:" +msgstr "Ikoresha:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +#, fuzzy +msgid "Show help options" +msgstr "Ifashayobora Amahitamo" + +#: ../glib/goption.c:873 +#, fuzzy +msgid "Show all help options" +msgstr "Byose Ifashayobora Amahitamo" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Umubare wuzuye Agaciro kugirango" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, fuzzy, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: ../glib/goption.c:1032 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Umubare wuzuye Agaciro kugirango" + +#: ../glib/goption.c:1040 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Ihindurangero" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, fuzzy, c-format +msgid "Unknown option %s" +msgstr "Ihitamo ritazwi:" + +#: ../glib/gkeyfile.c:366 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "Urufunguzo IDOSIYE OYA Byabonetse in Ibyatanzwe" + +#: ../glib/gkeyfile.c:401 +#, fuzzy +msgid "Not a regular file" +msgstr "a Ibisanzwe IDOSIYE" + +#: ../glib/gkeyfile.c:409 +#, fuzzy +msgid "File is empty" +msgstr "Idosiye ni ubusa" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Izina ry'inturo:" + +#: ../glib/gkeyfile.c:850 +#, fuzzy +msgid "Key file does not start with a group" +msgstr "IDOSIYE OYA Gutangira Na: a Itsinda" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Izina ry'inturo:" + +#: ../glib/gkeyfile.c:903 +#, fuzzy, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "IDOSIYE Kirimo Imisobekere:" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, fuzzy, c-format +msgid "Key file does not have group '%s'" +msgstr "IDOSIYE OYA Itsinda" + +#: ../glib/gkeyfile.c:1323 +#, fuzzy, c-format +msgid "Key file does not have key '%s'" +msgstr "IDOSIYE OYA Urufunguzo" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, fuzzy, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "IDOSIYE Kirimo Urufunguzo Agaciro" + +#: ../glib/gkeyfile.c:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, fuzzy, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "IDOSIYE OYA Urufunguzo in Itsinda" + +#: ../glib/gkeyfile.c:3708 +#, fuzzy +msgid "Key file contains escape character at end of line" +msgstr "IDOSIYE Kirimo Inyuguti ku Impera Bya Umurongo" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "IDOSIYE Kirimo Sibyo" + +#: ../glib/gkeyfile.c:3872 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Nka a Umubare" + +#: ../glib/gkeyfile.c:3886 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "Agaciro kugirango Inyuma Bya Urutonde" + +#: ../glib/gkeyfile.c:3919 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Nka a Umubare" + +#: ../glib/gkeyfile.c:3943 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Nka a Icyungo" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Bayite in Ihindurangero Iyinjiza" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Ihitamo ritazwi:" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Gufungura %s%S bushyinguro" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Gufungura %s%S bushyinguro" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "amahuza OYA" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "ku Umurongo" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Ihindurangero" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ni OYA Byemewe Mo Imbere Izina:" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ni OYA Byemewe Mo Imbere Izina:" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ni OYA Byemewe Mo Imbere Izina:" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Ihindurangero" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Ihindurangero" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Gufungura %s%S bushyinguro" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "amahuza OYA" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "amahuza OYA" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "amahuza OYA" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, 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:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Izina ry'inturo:" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfile.c:1441 +#, 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:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Gufungura %s%S bushyinguro" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Kuri Gusoma Ihuza" + +#: ../gio/glocalfile.c:2166 +#, 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:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Mo Imbere Ikiranga Izina:" + +#: ../gio/glocalfileinfo.c:773 +#, 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:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Ihindurangero" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Ihindurangero" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Ihindurangero" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "ku Umurongo" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Ihindurangero" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Ihindurangero" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, 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:185 ../gio/glocalfileoutputstream.c:722 +#, 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:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, 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:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1083 +#, 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:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "a Ibisanzwe IDOSIYE" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Izina ry'inturo:" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gresolver.c:779 +#, 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:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Ihitamo ritazwi:" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Kuri Kurema IDOSIYE" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Kuri IDOSIYE Byanze" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Ihindurangero" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, 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:1875 +#, 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:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Kuri Kurema IDOSIYE" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "amahuza OYA" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "ku Umurongo" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Ihindurangero" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Ihindurangero" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "amahuza OYA" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Ikosa mu gusoma idosiye" + +# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_SFX_DOLOADFAILED.text +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Ikosa mu gusoma idosiye" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/si.po new file mode 100644 index 0000000..52f7ad0 --- /dev/null +++ b/po/si.po @@ -0,0 +1,3769 @@ +# translation of glib.si.po to Sinhala +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Danishka Navin , 2007. +msgid "" +msgstr "" +"Project-Id-Version: glib.si\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2007-06-20 14:56+0530\n" +"Last-Translator: Danishka Navin \n" +"Language-Team: Sinhala \n" +"Language: si\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%s' මූලය සඳහා බලාපොරොත්තු නොවු '%s' විශේෂණය" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%s' මූලයෙහි '%s' විශේෂණය හමුවුයේ නැත" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "'%s'බලාපොරොත්තු නොවු ටැගයකි, බලාපොරොත්තු වුයේ '%s' ටැගයයි" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s'බලාපොරොත්තු නොවු ටැගයක් '%s' තුළ ඇත" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "දත්ත බහලුම් තුළ නිරවද්‍ය පිටු සළකුණක් හමුවූයෙ නැත" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "'%s' URI සඳහා වු පිටු සළකුණ දැනට භාවිතයේ ඇත" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "'%s' URI සඳහා පිටු සළකුණු හමුවුයේ නැත" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "'%s' URI සඳහා වු පිටු සළකුණු තුළ MIME වර්‍හගයක් සදහන් කරුයේ නැත" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "'%s' URI සඳහා වු පිටු සළකුණු තුළ සමූහ කට්ටලය නැත" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' සිට '%s' දක්වා පරිවර්තකය විවෘත කළ නොහැකි විය" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "%s' URI සාවද්‍ය වේ" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' URI හි ධාරක නාමය සාවද්‍ය වේ" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "සාවද්‍ය ධාරක නාමය" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "පෙ.ව." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "à¶´.ව." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y-%m-%d %H:%M:%S %z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Y-%m-%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p %I:%M:%S" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "ජනවාරි" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "පෙබරවාරි" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "මාර්තු" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "අප්‍රියෙල්" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "මැයි" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "ජූනි" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "ජූලි" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ජන" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "පෙබ" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "මාර්" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "අප්‍රි" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "මැයි" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ජූනි" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ජූලි" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "සඳුදා" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "අඟහරුවාදා" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "බදාදා" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "බ්‍රහස්පතින්දා" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "සිකුරාදා" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "සෙනසුරාදා" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ඉරිදා" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "ස" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "අ" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "à¶¶" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "බ්‍ර" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "සි" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "සෙ" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ඉ" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, fuzzy, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr " \"%s\" ගොනුව කියවීම සඳහා %lu බයිට් ප්‍රමාණයක් යෙදවිය නොහැකි විය" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' ගොනුවෙන් කියවීම අසමත් විය: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' ගොනුවේ විශේෂණ ලබා ගැනීම අසමත් විය: fstat() අසමත් විය: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: fdopen() අසමත් විය: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s' ගොනුව '%s' ලෙස නම වෙනස් à¶­ කිරීම අසමත් විය: g_rename(අසමත් වියed: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ලිවීම සඳහා '%s' ගොනුව විවෘත කිරීම අසමත් විය: fdopen() අසමත් විය: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' ගොනුවට ලිවීම අසමත් විය: fwrite() අසමත් විය: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' ගොනුව වැසීමීම අසමත් විය: fclose() අසමත් විය: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "දැනට ඇති '%s' ගොනුව ඉවත් කළ නොහැක: g_unlink() අසමත් විය: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' ආකෘතිය සාවද්‍ය වේ, '%s' අඩංගු නොවිය යූතුය" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ආකෘතියේ XXXXXX අඩංගු නොවේ" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' සංකේතාත්මක පුරුක කියවිම අසමත් විය: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' ගොනුව විවෘත කිරීම අසමත් විය: open() අසමත් විය: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "'%s' ගොනුව අනුරුපණය කිරීම අසමත් විය: mmap()අසමත් විය: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d පේළියේ %d අක්‍ෂරය මත දෝෂයකි: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "සාවද්‍ය UTF-8 සංකේතාංකන පෙළ" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d පේළියේ à¶­ දෝෂයකි: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "'%s' වස්තුවේ නම නොදනී" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "ලේඛණය මූලයකින්ම ආරම්භ කළ යුතුම වේ (උදා. )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' මූලය වසා ඇති අතර කිසිම මූලයක් විවෘතව ඇත" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' මූලය වසා ඇති අතර දැනට'%s' මූලය විවෘතව ඇත" + +#: ../glib/gmarkup.c:1712 +#, fuzzy +msgid "Document was empty or contained only whitespace" +msgstr "ලේඛණය හිස්ව තිබුනි හෝ තිබුනේ සුදුඉඩ පමණි" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "විනාශ වු වස්තුවක්" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "අභ්‍යන්තර දෝෂය හෝ විනාශ වු වස්තුවක්" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "ප්‍රමාණවත් මතකයක් නැත" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "අභ්‍යන්තර දෝෂය" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "නොදන්නා දෝෂය" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "අවසන් නොකළ අක්‍ෂර යොමුව" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "දහසයේ පාදයේ අංකිතයක් හෝ '}' බලාපොරොත්තු වේ" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "දහසයේ පාදයේ අංකිතයක් බලාපොරොත්තු වේ" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "සංකේතාත්මක යොමුව තුළ '<' මගහැරී ඇත" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "අවසන් නොකළ සංකේතාත්මක යොමුව" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "ශුන්‍ය දිග සංකේතාත්මක යොමුව" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "අංකයක් බලාපොරොත්තු විය" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "සාවද්‍ය සංකේතාත්මක යොමුව" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "සාවද්‍ය වැඩසටහන් නම: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "සාවද්‍ය වැඩකරන බහලුම: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() බලාපොරොත්තු නොවු දෝෂයකි (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "භාැවිතය:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "සහාය විකල්ප:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "සහාය විකල්ප දර්ශනය කරන්න" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "සියළු සහාය විකල්ප දර්ශනය කරන්න" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "යෙදුම් විකල්ප:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "%s නොදන්නා විකල්පයකි" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "හිස් ගොනුවකි" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "සාවද්‍ය සමූහ නාමය: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "නොදන්නා දෝෂය" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%d පේළියේ à¶­ දෝෂයකි: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "ඇතුළත් කළ නම තුළ ඇති '%s' අක්‍ෂරය සාද්‍යවේ " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "ඇතුළත් කළ නම තුළ ඇති '%s' අක්‍ෂරය සාද්‍යවේ " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "ඇතුළත් කළ නම තුළ ඇති '%s' අක්‍ෂරය සාද්‍යවේ " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "විනාශ වු වස්තුවක්" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "සාවද්‍ය ධාරක නාමය" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "'%s' සංකේතාත්මක පුරුක කියවිම අසමත් විය: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "%d පේළියේ à¶­ දෝෂයකි: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' ගහලුම විවෘත කිරීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d පේළියේ à¶­ දෝෂයකි: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "සාවද්‍ය යතුරු නම: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "%s නොදන්නා විකල්පයකි" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "'%s' ගොනුව නිර්මාණය දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "නොදන්නා දෝෂය" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d පේළියේ à¶­ දෝෂයකි: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "පරිවර්තනයේදි දෝෂයකි : %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "සංකේතාත්මක පුරුක සහාය දක්නන්නේ නැත" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "'%s' ගොනුව කියවීම දෝෂ සහිතයි: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "ප්‍රමාණවත් මතකයක් නැත" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "අභ්‍යන්තර දෝෂය" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "සාවද්‍ය ධාරක නාමය" + +#, fuzzy +#~ msgid "Invalid UTF-8 sequence in input" +#~ msgstr "පරිවර්තන ප්‍රධාධා තුළ සාවද්‍ය බයිට් පිළිවෙළක්යේ" + +#, fuzzy +#~ msgid "[FILE...]" +#~ msgstr "[OPTION...]" + +#~ 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.po b/po/sk.po new file mode 100644 index 0000000..ab1be5c --- /dev/null +++ b/po/sk.po @@ -0,0 +1,4440 @@ +# Slovak translation for glib. +# Copyright (C) 2001, 2002, 2004, 2005, 2008, 2011, 2012 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Stanislav Visnovsky , 2001, 2002. +# Stanislav Visnovsky , 2004. +# Marcel Telka , 2005, 2008. +# Peter Mráz , 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-12-20 12:29+0000\n" +"PO-Revision-Date: 2012-12-23 14:31+0100\n" +"Last-Translator: Peter Mráz \n" +"Language-Team: Slovak \n" +"Language: sk\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:184 ../gio/ginputstream.c:375 +#: ../gio/ginputstream.c:612 ../gio/ginputstream.c:830 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "PríliÅ¡ vysoký počet hodnôt predaný do %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Presúvanie v základnom prúde nie je podporované" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream sa nedá skrátiÅ¥" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1020 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Prúd je už zatvorený" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Skrátenie nie je v základnom prúde podporované" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Operácia bola zruÅ¡ená" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Neplatný objekt, neinicializované" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Neúplná viacbajtová sekvencia na vstupe" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Nedostatok miesta v cieli" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Neplatná sekvencia bajtov na vstupe prevodu" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Chyba počas prevodu: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "ZruÅ¡iteľná inicializácia nie je podporovaná" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Prevod zo znakovej sady „%s“ do „%s“ nie je podporovaný" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Nepodarilo sa otvoriÅ¥ program na prevod z „%s“ do „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "typ %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Neznámy typ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "typ súboru %s" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials nie je implementované v tomto operačnom systéme" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Neexistuje podpora GCredentials pre vaÅ¡u platformu" + +#: ../gio/gcredentials.c:480 +#, fuzzy +#| msgid "GCredentials is not implemented on this OS" +msgid "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials nie je implementované v tomto operačnom systéme" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neočakávane skorý koniec prúdu" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nepodporovaný kľúč „%s“ v položke adresy „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresa „%s“ je neplatná (je potrebný práve jeden kľúč path, tmpdir alebo " +"abstract)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Nezmyselná kombinácia kľúč/hodnota v položke adresy „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Chyba v adrese „%s“ – atribút portu má zlý formát" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Chyba v adrese „%s“ – atribút rodiny má zlý formát" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Prvok adresy „%s“ neobsahuje dvojbodku (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "Pár kľúč/hodnota %d, „%s“ v prvku adresy „%s“ neobsahuje znak rovnosti" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Chyba kľúča alebo hodnoty s nahradenými Å¡peciálne uvedenými sekvenciami v " +"páre kľúč/hodnota %d, „%s“ v prvku adresy „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Chyba v adrese „%s“ – transport typu unix vyžaduje nastavenie práve jedného " +"z kľúčov „path“ alebo „abstract“" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribút hostiteľa chýba alebo má zlý formát" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribút portu chýba alebo má zlý formát" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Chyba v adrese „%s“ – atribút noncefile chýba alebo má zlý formát" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Chyba pri automatickom spustení: " + +# first is transport name +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Neznámy alebo nepodporovaný transport typu „%s“ pre adresu „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Chyba pri otváraní nonce súboru „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Chyba pri čítaní z nonce súboru „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Chyba pri čítaní z nonce súboru „%s“, očakávaných 16 bajtov, získaných %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Chyba pri zápise obsahu nounce súboru „%s“ do prúdu:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Daná adresa je prázdna" + +# PM: tu si nie som istý +# MČ: Komentár v kóde: /* Don't run binaries as root if we're setuid. */ +# MČ: v tomto prípade „spawn“ znamená: Spustí a posiela dáta, cez stdin a očakáva dáta cez stdout, takže by som skôr dal spustiÅ¥. +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Zbernica správ sa nedá spustiÅ¥ pri setuid" + +# MČ: v tomto prípade „spawn“ znamená: Spustí a posiela dáta, cez stdin a očakáva dáta cez stdout, takže by som skôr dal spustiÅ¥. +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Zbernica správ sa nedá spustiÅ¥ bez machine-id: " + +# MČ: v tomto prípade „spawn“ znamená: Spustí a posiela dáta, cez stdin a očakáva dáta cez stdout, takže by som skôr dal spustiÅ¥. +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Chyba pri spúšťaní príkazového riadka „%s“: " + +# PM: podľa mňa ked ide o zadanie treba na konci stlačiÅ¥ enter, nie som si istý či je to tento prípad +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Toto okno zatvoríte zadaním ľubovolného znaku)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Relácia dbus nebeží a automatické spustenie zlyhalo" + +# funkcia na určenie adresy relačnej zbernice +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Nedá sa určiÅ¥ adresa relačnej zbernice (nie je implementovaná pre tento " +"operačný systém)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Nedá sa určiÅ¥ adresa zbernice z premennej prostredia DBUS_STARTER_BUS_TYPE – " +"neznáma hodnota „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Nedá sa určiÅ¥ adresa zbernice, pretože premenná prostredia " +"DBUS_STARTER_BUS_TYPE nie je nastavená" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Neznámy typ zbernice %d" + +#: ../gio/gdbusauth.c:297 +msgid "Unexpected lack of content trying to read a line" +msgstr "Nečakaný nedostatok obsahu pri pokuse čítaÅ¥ riadok" + +#: ../gio/gdbusauth.c:341 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Nečakaný nedostatok obsahu pri pokuse (bezpečne) čítaÅ¥ riadok" + +#: ../gio/gdbusauth.c:512 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Vyčerpané vÅ¡etky dostupné mechanizmy overenia totožnosti (pokusy: %s) " +"(dostupné: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "ZruÅ¡ené cez GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Chyba pri získavaní informácií pre adresár „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Oprávnenia k adresáru „%s“ sú zle formátované. Očakávaný režim 0700, získaný " +"0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Chyba pri vytváraní adresára „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Chyba pri otváraní zväzku kľúčov „%s“ na čítanie: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Riadok č. %d zväzku kľúčov na „%s“ s obsahom „%s“ je zle formátovaný" + +# PK: token nie je nejaky znak? viacX +# PM: token je napríklad "%s" ide o znaky ktoré môžu byt nahradené nejakým textom napr %u - meno používateľa +# PK: token by mal byt string +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Prvý token riadka č. %d zväzku kľúčov na „%s“ s obsahom „%s“ je zle " +"formátovaný" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Druhý token riadka č. %d zväzku kľúčov na „%s“ s obsahom „%s“ je zle " +"formátovaný" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "NenaÅ¡lo sa cookie s identifikátorom %d vo zväzku kľúčov na „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Chyba pri odstraňovaní starého súboru uzamknutia „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Chyba pri vytváraní súboru uzamknutia „%s“: %s" + +# PM: Je to súbor určený na vymazanie ale vymaže sa až vtedy, keď ho zatvorí posledný, kto ho má otvorený +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Chyba pri zatváraní (vymazávaného) súboru uzamknutia „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Chyba pri mazaní súboru uzamknutia „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Chyba pri otváraní zväzku kľúčov „%s“ na zápis: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Okrem toho zlyhalo aj uvoľnenie zámky pre „%s“: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Spojenie je ukončené" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "VyprÅ¡al časový limit" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Pri vytváraní klientského pripojenia boli nájdené nepodporované príznaky" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Rozhranie „org.freedesktop.DBus.Properties“ nie je v objekte na ceste %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Chyba pri nastavovaní vlastnosti „%s“: Bol očakávaný typ „%s“, no získaný " +"bol „%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Neexistuje vlastnosÅ¥ „%s“" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "VlastnosÅ¥ „%s“ nie je čitateľná" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "VlastnosÅ¥ „%s“ nie je zapisovateľná" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Neexistuje rozhranie „%s“" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Také rozhranie neexistuje" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Rozhranie „%s“ nie je v objekte na ceste %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Neexistuje metóda „%s“" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Typ správy „%s“ nezodpovedá očakávanému typu „%s“" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Pre rozhranie %s je už exportovaný objekt na %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metóda „%s“ vrátila typ „%s“, no očakávaný bol „%s“" + +# MČ: mám k tomuto preklady výhrady, ale keď to tak chcete, môže byÅ¥. Keď signatúra nevyhovuje, tak skôr značka. Ak sa rozhodnete upraviÅ¥, tak pri vÅ¡etkých výskytoch. +# PK: http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures +# PK: mozno oznacenie +#: ../gio/gdbusconnection.c:6311 +#, fuzzy, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metóda „%s“ z rozhrania „%s“ s podpisom „%s“ neexistuje" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Podstrom je už exportovaný do %s" + +#: ../gio/gdbusmessage.c:1270 +msgid "type is INVALID" +msgstr "typ je INVALID" + +#: ../gio/gdbusmessage.c:1281 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Správa METHOD_CALL: chýba pole hlavičky PATH alebo MEMBER" + +#: ../gio/gdbusmessage.c:1292 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Správa METHOD_RETURN: chýba pole hlavičky REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1304 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Správa ERROR: chýba pole hlavičky REPLY_SERIAL alebo ERROR_NAME" + +#: ../gio/gdbusmessage.c:1317 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Správa SIGNAL: chýba pole hlavičky PATH, INTERFACE alebo MEMBER" + +#: ../gio/gdbusmessage.c:1325 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Správa SIGNAL: pole hlavičky PATH používa vyhradenú hodnotu /org/freedesktop/" +"DBus/Local" + +#: ../gio/gdbusmessage.c:1333 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Správa SIGNAL: pole hlavičky INTERFACE používa vyhradenú hodnotu org." +"freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1382 +#, fuzzy, c-format +#| msgid "Wanted to read %lu byte but got EOF" +#| msgid_plural "Wanted to read %lu bytes but got EOF" +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Potrebných %lu bajtov na čítanie, no získaný EOF" +msgstr[1] "Potrebný %lu bajt na čítanie, no získaný EOF" +msgstr[2] "Potrebné %lu bajty na čítanie, no získaný EOF" + +# *https://bugzilla.gnome.org/show_bug.cgi?id=658913 +# PM: tu je to hodnota znaku nie smerníka +#: ../gio/gdbusmessage.c:1397 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Očakávaný znak NUL za reÅ¥azcom „%s“, no nájdený bajt %d" + +#: ../gio/gdbusmessage.c:1416 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Očakávaný platný UTF-8 reÅ¥azec, no nájdené neplatné bajty na pozícii %d " +"(dĺžka reÅ¥azca je %d). Platný UTF-8 reÅ¥azec do toho miesta bol „%s“" + +#: ../gio/gdbusmessage.c:1618 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Analyzovaná hodnota „%s“ nie je platnou cestou k objektu D-Bus" + +#: ../gio/gdbusmessage.c:1642 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Analyzovaná hodnota „%s“ nie je platným podpisom D-Bus" + +#: ../gio/gdbusmessage.c:1697 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Zistené pole s dĺžkou %u bajtov. Maximálna dĺžka je 2<<26 bajtov (64 MiB)" +msgstr[1] "" +"Zistené pole s dĺžkou %u bajt. Maximálna dĺžka je 2<<26 bajtov (64 MiB)" +msgstr[2] "" +"Zistené pole s dĺžkou %u bajty. Maximálna dĺžka je 2<<26 bajtov (64 MiB)" + +#: ../gio/gdbusmessage.c:1850 +#, fuzzy, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Analyzovaná hodnota „%s“ pre variant nie je platným podpisom D-Bus" + +#: ../gio/gdbusmessage.c:1874 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Chyba pri deserializovaní GVariant pomocou reÅ¥azca typu „%s“ z prenosového " +"formátu D-Bus" + +# tu musia byt taketo uvodzovky, kedze je to tak aj v C alebo Java +#: ../gio/gdbusmessage.c:2061 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Neplatná hodnota poradia bytov. Očakávané 0x6c ('l') alebo 0x42 ('B'), no " +"nájdená hodnota 0x%02x" + +#  protocol version +#: ../gio/gdbusmessage.c:2074 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Neplatná hlavná verzia protokolu. Očakávaná 1, no nájdená %d" + +#: ../gio/gdbusmessage.c:2130 +#, fuzzy, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Nájdená hlavička podpisu s podpisom „%s“, no nájdené telo správy je prázdne" + +#: ../gio/gdbusmessage.c:2144 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Analyzovaná hodnota „%s“ nie je platným podpisom D-Bus (pre telo)" + +#: ../gio/gdbusmessage.c:2174 +#, fuzzy, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"V správe nie je žiadna hlavička podpisu, no telo správy má %u bajtov" +msgstr[1] "V správe nie je žiadna hlavička podpisu, no telo správy má %u bajt" +msgstr[2] "V správe nie je žiadna hlavička podpisu, no telo správy má %u bajty" + +#: ../gio/gdbusmessage.c:2184 +msgid "Cannot deserialize message: " +msgstr "Nedá sa deserializovaÅ¥ správa: " + +#: ../gio/gdbusmessage.c:2505 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Chyba pri serializovaní Gvariant pomocou reÅ¥azca typu „%s“ z prenosového " +"formátu D-Bus" + +# https://bugzilla.gnome.org/show_bug.cgi?id=658713 +#: ../gio/gdbusmessage.c:2642 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Správa má %d popisovačov súboru, no pole hlavičky uvádza %d popisovačov " +"súboru" + +#: ../gio/gdbusmessage.c:2650 +msgid "Cannot serialize message: " +msgstr "Nedá sa serializovaÅ¥ správa: " + +#: ../gio/gdbusmessage.c:2694 +#, fuzzy, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Telo správy má podpis „%s“, no neexistuje žiadna hlavička podpisu" + +#: ../gio/gdbusmessage.c:2704 +#, fuzzy, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Telo správy má podpis typu „%s“, no podpis v poli hlavičky je „%s“" + +#: ../gio/gdbusmessage.c:2720 +#, fuzzy, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Telo správy je prázdne, no podpis v poli hlavičky je „(%s)“" + +#: ../gio/gdbusmessage.c:3270 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Chyba pri návrate s telom typu „%s“" + +#: ../gio/gdbusmessage.c:3278 +msgid "Error return with empty body" +msgstr "Chyba pri návrate s prázdnym telom" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Nepodarilo sa získaÅ¥ hardvérový profil: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Nepodarilo sa načítaÅ¥ /var/lib/dbus/machine-id ani /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Chyba pri volaní StartServiceByName pre %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Neočakávaná odpoveď %d z metódy StartServiceByName(„%s“)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Nedá sa vyvolaÅ¥ metóda; proxy je pre dobre známy názov bez vlastníka a proxy " +"bol vytvorený s príznakom G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstraktný menný priestor nie je podporovaný" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Pri vytváraní servera sa nedá zadaÅ¥ nonce súbor" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Chyba pri zápise do nonce súboru na „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "ReÅ¥azec „%s“ nie je platný D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Nedá sa počúvaÅ¥ na nepodporovanom transporte „%s“" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "PRÍKAZ" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Príkazy:\n" +" help Zobrazí tieto informácie\n" +" introspect Vnútorne preskúma vzdialený objekt\n" +" monitor Sleduje vzdialený objekt\n" +" call Vyvolá metódu na vzdialenom objekte\n" +" emit VyÅ¡le signál\n" +"\n" +"Pomocníka pre každý z príkazov získate zadaním „%s PRÍKAZ --help“.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Chyba: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Chyba pri analýze XML vútorného preskúmania: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "PripojiÅ¥ k systémovej zbernici" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "PripojiÅ¥ k relačnej zbernici" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "PripojiÅ¥ k danej adrese D-Bus" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Voľby koncového bodu pripojenia:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Voľby určujúce koncový bod pripojenia" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Neurčený žiadny koncový bod pripojenia" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Určených viacero koncových bodov pripojenia" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Upozornenie: Podľa údajov vnútorného preskúmania rozhranie „%s“ neexistuje\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Upozornenie: Podľa údajov vnútorného preskúmania metóda „%s“ neexistuje na " +"rozhraní „%s“\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Voliteľný cieľ pre signál (jedinečný názov)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Cesta objektu, ktorému vyslaÅ¥ signál" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Názov signálu a rozhrania" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "VyslaÅ¥ signál." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Chyba pri pripájaní: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Chyba: neurčená cesta objektu.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Chyba: %s nie platná cesta objektu\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Chyba: signál nebol určený.\n" + +# PM: nie som si istý +# MČ: buď: „musí maÅ¥ plne-kvalifikovaný názov.“, alebo „musí byÅ¥ identifikovateľný plne-kvalifikovaným názvom“, majú predpísaný spôsob pomenovania. Preferoval by som prvý spôsob, +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Chyba: signál musí byÅ¥ identifikovateľný plne kvalifikovaným názvom.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Chyba: %s nie je platný názov rozhrania\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Chyba: %s nie je platný názov člena objektu\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Chyba: %s nie je platný jedinečný názov zbernice.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Chyba pri spracovaní parametra %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Chyba pri vyprázdnení pripojenia: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Názov cieľa, na ktorom sa má zavolaÅ¥ metóda" + +# PK: Nazov ciela, na ktorom zavolat metodu +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Cesta objektu na zavolanie metódy" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Názov metódy a rozhrania" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Časový limit v sekundách" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "ZavolaÅ¥ metódu na vzdialenom objekte." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Chyba: Cieľ nie je určený\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Chyba: Cesta objektu nie je určená\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Chyba: Názov metódy nie je určený\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Chyba: Názov metódy „%s“ nie je platný\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Chyba pri spracovaní parametra %d typu „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Názov cieľa na vnútorné preskúmanie" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Cesta objektu na vnútorné preskúmanie" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "VypísaÅ¥ XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Vnútorne preskúmaÅ¥ potomka" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Iba vypísaÅ¥ vlastnosti" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Vnútorne preskúmaÅ¥ vzdialený objekt." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Názov cieľa na sledovanie" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Cesta objektu na sledovanie" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "SledovaÅ¥ vzdialený objekt." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Bez názvu" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "V súbore desktop nie je určené pole Exec" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Nepodarilo sa nájsÅ¥ terminál vyžadovaný pre aplikáciu" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Nedá sa vytvoriÅ¥ používateľský konfiguračný priečinok aplikácie %s: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Nedá sa vytvoriÅ¥ používateľský konfiguračný priečinok MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "V informáciách o aplikácii chýba identifikátor" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Nedá sa vytvoriÅ¥ používateľský desktop súbor %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Vlastná definícia pre %s" + +#: ../gio/gdrive.c:394 +msgid "drive doesn't implement eject" +msgstr "mechanika neimplementuje vysúvanie" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gdrive.c:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"mechanika neimplementuje eject (vysunutie) ani eject_with_operation " +"(vysunutie s operáciou)" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "mechanika neimplementuje dotazovanie na vložené médium" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "mechanika neimplementuje spustenie" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "mechanika neimplementuje zastavenie" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Podpora TLS nie je dostupná" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Nedá sa spracovaÅ¥ kódovanie GEmblem verzie %d" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Chybný počet tokenov (%d) v kódovaní GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Nedá sa spracovaÅ¥ kódovanie GEmblemedIcon verzie %d" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Chybný počet tokenov (%d) v kódovaní GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Očakávaný GEmblem pre GEmblemedIcon" + +#: ../gio/gfile.c:902 ../gio/gfile.c:1141 ../gio/gfile.c:1280 +#: ../gio/gfile.c:1520 ../gio/gfile.c:1575 ../gio/gfile.c:1633 +#: ../gio/gfile.c:1717 ../gio/gfile.c:1774 ../gio/gfile.c:1838 +#: ../gio/gfile.c:1893 ../gio/gfile.c:3362 ../gio/gfile.c:3417 +#: ../gio/gfile.c:3563 ../gio/gfile.c:3605 ../gio/gfile.c:4007 +#: ../gio/gfile.c:4419 ../gio/gfile.c:4504 ../gio/gfile.c:4594 +#: ../gio/gfile.c:4691 ../gio/gfile.c:4778 ../gio/gfile.c:4879 +#: ../gio/gfile.c:5152 ../gio/gfile.c:5430 ../gio/gfile.c:5484 +#: ../gio/gfile.c:7028 ../gio/gfile.c:7118 ../gio/gfile.c:7202 +#: ../gio/win32/gwinhttpfile.c:439 +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:1404 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Obklopujúce pripojenie neexistuje" + +#: ../gio/gfile.c:2459 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Nedá sa prepísaÅ¥ adresár pri kopírovaní" + +#: ../gio/gfile.c:2519 +msgid "Can't copy directory over directory" +msgstr "Nedá sa prepísaÅ¥ adresár adresárom pri kopírovaní" + +#: ../gio/gfile.c:2527 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Cieľový súbor existuje" + +#: ../gio/gfile.c:2546 +msgid "Can't recursively copy directory" +msgstr "Adresár sa nedá kopírovaÅ¥ rekurzívne" + +#: ../gio/gfile.c:2810 +msgid "Splice not supported" +msgstr "Operácia zreÅ¥azovania vstupu s výstupom nie je podporovaná" + +# http://developer.gnome.org/gio/2.32/GOutputStream.html#g-output-stream-splice +#: ../gio/gfile.c:2814 +#, c-format +msgid "Error splicing file: %s" +msgstr "Chyba pri zreÅ¥azovaní súboru: %s" + +#: ../gio/gfile.c:2960 +msgid "Can't copy special file" +msgstr "Å peciálny súbor sa nedá kopírovaÅ¥" + +#: ../gio/gfile.c:3553 +msgid "Invalid symlink value given" +msgstr "Neplatný daný symbolický odkaz" + +#: ../gio/gfile.c:3713 +msgid "Trash not supported" +msgstr "Zahodenie do KoÅ¡a nie je podporované" + +# literal character +#: ../gio/gfile.c:3764 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Názvy súborov nemôžu obsahovaÅ¥ „%c“" + +#: ../gio/gfile.c:6152 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "zväzok neimplementuje pripojenie" + +#: ../gio/gfile.c:6261 +msgid "No application is registered as handling this file" +msgstr "Žiadna aplikácia nie je zaregistrovaná na spracovanie tohto súboru" + +# PK: vymenovavac hodnot, suborov +#  PM: som za zachovanie aktuálneho preklad, iterátor tiež nejako zvlášť neprekladáme +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Enumerátor je uzatvorený" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Enumerátor súborov má nevykonanú operáciu" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +msgid "File enumerator is already closed" +msgstr "Enumerátor súborov je už uzatvorený" + +#: ../gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Nedá sa spracovaÅ¥ kódovanie GFileIcon verzie %d" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Zle formátované vstupné údaje pre GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Prúd nepodporuje query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Presúvanie v prúde nie je podporované" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Skrátenie vo vstupnom prúde nie je podporované" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Skrátenie nie je v prúde podporované" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nesprávny počet tokenov (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Názov triedy %s nemá typ" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typ %s neimplementuje rozhranie GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typ %s nemá triedu" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Zlé číslo verzie: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Typ %s neimplementuje from_tokens() na rozhraní GIcon" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Nedá sa spracovaÅ¥ poskytnutá verzia kódovania ikon" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nebola zadaná žiadna adresa" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Dĺžka %u je pre adresu príliÅ¡ krátka" + +# PM: neviem či je to dosÅ¥ zrozumitelne +# MČ: „Adresa má nastavené bity aj mimo prefixu“ prefix by som neprekladal, pri slove predpona by som sa asi stratil. +# PM: Predpona adresy sa mi zdá úplne zrozumiteľná, skôr som myslel či nepoužiÅ¥ preklad ako napr. bity adresy presahujú sa hranicu stanovenú pre predponu adresy +# MČ: Skôr tento druhý reÅ¥azec, „dĺžka predpony“ by bola osobne pre mňa Å¡ialene nepochopiteľná, keby som nemal k dispozícii anglický originál. +# PK: to necham slovensky, lebo pre mna to je spanielska dedina +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adresa má bity nastavené za dĺžkou predpony" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Nepodarilo sa analyzovaÅ¥ „%s“ ako masku adresy IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nie je dostatok miesta pre adresu soketu" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nepodporovaná adresa soketu" + +#: ../gio/ginputstream.c:193 +msgid "Input stream doesn't implement read" +msgstr "Vstupný prúd neimplementuje čítanie" + +#. 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:1030 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Prúd má nevykonanú operáciu" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Prvok <%s> nie je dovolený vo vnútri <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Prvok <%s> nie je dovolený na najvyššej úrovni" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Súbor %s sa v zdroji objavil viackrát" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Nepodarilo sa nájsÅ¥ „%s“ v žiadnom zdrojovom adresári" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Zlyhalo hľadanie „%s“ v aktuálnom adresári" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Neznáma voľba spracovania „%s“" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Zlyhalo vytvorenie dočasného súboru: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Chyba pri spracovaní vstupného súboru pomocou xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Chyba pri spracovaní vstupného súboru pomocou to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Chyba pri čítaní súboru %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Chyba pri komprimovaní súboru %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text sa nemôže nachádzaÅ¥ vo vnútri <%s>" + +# cmd desc +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "názov výstupného súboru" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "SÚBOR" + +# cmd desc +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Adresáre, z ktorých sa majú čítaÅ¥ súbory (predvolený je aktuálny adresár)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "ADRESÁR" + +# cmd desc +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Vygeneruje výstup vo formáte stanovenom podľa prípony cielového súboru" + +#  cmd desc +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Vygeneruje zdrojové hlavičky" + +# cmd desc +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"Vygeneruje zdrojový kód použitý na prepojenie súboru zdrojov s vaším kódom" + +# cmd desc +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Vygeneruje zoznam závislostí" + +# cmd desc +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Nebude vytváraÅ¥ a registrovaÅ¥ zdroj automaticky" + +# cmd desc +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Nebude exportovaÅ¥ funkcie; deklaruje ich pomocou G_GNUC_INTERNAL" + +# cmd desc +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Identifikačný názov v jazyku C použitý pre generovaný zdrojový kód" + +# cmd program desc +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Preklad Å¡pecifikácie zdrojov do súboru zdrojov.\n" +"Súbory Å¡pecifikácie zdrojov majú príponu .gresource.xml,\n" +"a súbor zdrojov má príponu s názvom .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Mali by ste zadaÅ¥ práve jeden názov súboru\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "prázdne názvy nie sú povolené" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "neplatný názov „%s“: názvy musia začínaÅ¥ malým písmenom" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"neplatný názov „%s“: neplatný znak „%c“: povolené sú iba malé písmená, čísla " +"a spojovník („-“)." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"neplatný názov „%s“: dva za sebou nasledujúce spojovníky („--“) nie sú " +"povolené." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "neplatný názov „%s“: posledný znak nesmie byÅ¥ spojovník („-“)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "neplatný názov „%s“: maximálna dĺžka je 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " je už určený" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "nedajú sa pridaÅ¥ kľúče do schémy „list-of“" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " je už určený" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" zatieni v ; na úpravu " +"hodnoty použite " + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"ako atribút pre musí byÅ¥ určená práve jedna hodnota z „type“, „enum“ " +"alebo „flags“" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> nie je (zatiaľ) definovaný." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "neplatný reÅ¥azec typu GVariant „%s“" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr "zadaný , no schéma nič nerozÅ¡iruje" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "žiadny na preváženie" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " je už určený" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " je už určený" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " rozÅ¡iruje zatiaľ neexistujúcu schému „%s“" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " je zoznamom zatiaľ neexistujúcej schémy „%s“" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Nemôže byÅ¥ zoznamom schémy s cestou" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Nemôže rozšíriÅ¥ schému s cestou" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" je zoznamom rozÅ¡irujúcim , ktorý nie je " +"zoznamom" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" rozÅ¡iruje , no " +"„%s“ nerozÅ¡iruje „%s“" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "cesta (ak je zadaná) musí začínaÅ¥ a končiÅ¥ lomkou" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "cesta zoznamu musí končiÅ¥ „:/“" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> je už určený" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Prvok <%s> nie je dovolený na najvyššej úrovni" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict bolo zadané; ukončuje sa.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Celý tento súbor bol ignorovaný.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignoruje sa tento súbor.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Kľúč „%s“ neexistuje v schéme „%s“ ako to bolo určené v súbore preváženia " +"„%s“" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignoruje sa preváženie tohto kľúča.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " a --strict bolo zadané; ukončuje sa.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"chyba pri analyzovaní kľúča „%s“ v schéme „%s“ ako bolo určené v súbore " +"preváženia „%s“: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignoruje sa preváženie tohto kľúča.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"preváženie kľúča „%s“ v schéme „%s“ v prevažujúcom súbore „%s“ je mimo " +"rozsah daný schémou" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"preváženie kľúča „%s“ v schéme „%s“ v súbore preváženia „%s“ nie je v " +"zozname platných možností" + +# cmd desc +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "kam sa má uložiÅ¥ súbor gschemas.compiled" + +# cmd desc +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Preruší pri ľubovoľnej chybe v schémach" + +# cmd desc +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Nezapíše súbor gschema.compiled" + +# cmd desc +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Nevynúti obmedzenia pre názvy kľúčov" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Preklad vÅ¡etkých súborov schém GSettings do vyrovnávacej pamäte schém.\n" +"Súbory schém musia maÅ¥ príponu .gschema.xml,\n" +"a súbor vyrovnávacej pamäte sa nazýva gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Mali by ste zadaÅ¥ práve jeden názov adresára\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Nenájdené žiadne súbory schém: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "neurobí sa nič.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "odstránený existujúci výstupný súbor.\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "Nepodarilo sa nájsÅ¥ predvolený typ sledovania lokálneho adresára" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Neplatný názov súboru %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Chyba pri získavaní informácií o súborovom systéme: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Koreňový adresár sa nedá premenovaÅ¥" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Chyba pri premenovaní súboru: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Nedá sa premenovaÅ¥ súbor, názov súboru už existuje" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Neplatný názov súboru" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Nedá sa otvoriÅ¥ adresár" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Chyba pri otváraní súboru: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Chyba pri odstraňovaní súboru: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Chyba pri zahadzovaní súboru do KoÅ¡a: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ adresár Kôš %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Nepodarilo sa nájsÅ¥ adresár najvyššej úrovne pre Kôš" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Nepodarilo sa nájsÅ¥ ani vytvoriÅ¥ adresár Kôš" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ informačný súbor o zahadzovaní do KoÅ¡a: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Nepodarilo sa zahodiÅ¥ súbor do KoÅ¡a: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "vnútorná chyba" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Chyba pri vytváraní adresára: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Súborový systém nepodporuje symbolické odkazy" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Chyba pri vytváraní symbolického odkazu: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Chyba pri presúvaní súboru: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Nedá sa prepísaÅ¥ adresár adresárom počas presúvania" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Vytvorenie súboru zálohy zlyhalo" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Chyba pri odstraňovaní cieľového súboru: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Presun medzi pripojeniami nie je podporovaný" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Hodnota atribútu nesmie byÅ¥ NULL" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Neplatný typ atribútu (očakávaný reÅ¥azec)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Neplatný názov rozšíreného atribútu" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Chyba pri nastavovaní rozšíreného atribútu „%s“: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (neplatné kódovanie)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Chyba pri získavaní informácií pre súbor „%s“: %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Chyba pri získavaní informácií pre popisovač súboru: %s" + +#: ../gio/glocalfileinfo.c:2026 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neplatný typ atribútu (očakávané uint32)" + +#: ../gio/glocalfileinfo.c:2044 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neplatný typ atribútu (očakávané uint64)" + +#: ../gio/glocalfileinfo.c:2063 ../gio/glocalfileinfo.c:2082 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neplatný typ atribútu (očakávaný bajtový reÅ¥azec)" + +#: ../gio/glocalfileinfo.c:2117 +msgid "Cannot set permissions on symlinks" +msgstr "Pre symbolické odkazy sa nedajú nastaviÅ¥ oprávnenia" + +#: ../gio/glocalfileinfo.c:2133 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Chyba pri nastavovaní oprávnení: %s" + +#: ../gio/glocalfileinfo.c:2184 +#, c-format +msgid "Error setting owner: %s" +msgstr "Chyba pri nastavovaní vlastníka: %s" + +#: ../gio/glocalfileinfo.c:2207 +msgid "symlink must be non-NULL" +msgstr "symbolický odkaz nesmie byÅ¥ NULL" + +#: ../gio/glocalfileinfo.c:2217 ../gio/glocalfileinfo.c:2236 +#: ../gio/glocalfileinfo.c:2247 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Chyba pri nastavovaní symbolického odkazu: %s" + +#: ../gio/glocalfileinfo.c:2226 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Chyba pri nastavovaní symbolického odkazu: súbor nie je symbolický odkaz" + +#: ../gio/glocalfileinfo.c:2352 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Chyba pri nastavovaní času prístupu alebo zmeny: %s" + +#: ../gio/glocalfileinfo.c:2375 +msgid "SELinux context must be non-NULL" +msgstr "Kontext pre SELinux nesmie byÅ¥ NULL" + +#: ../gio/glocalfileinfo.c:2390 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Chyba pri nastavovaní kontextu pre SELinux: %s" + +#: ../gio/glocalfileinfo.c:2397 +msgid "SELinux is not enabled on this system" +msgstr "SELinux nie je na tomto systéme povolený" + +#: ../gio/glocalfileinfo.c:2489 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Nastavovanie atribútu %s nie je podporované" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Chyba pri čítaní zo súboru: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Chyba pri presúvaní v súbore: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Chyba pri zatváraní súboru: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Nepodarilo sa nájsÅ¥ predvolený typ sledovania lokálneho súboru" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Chyba pri zápise do súboru: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Chyba pri vytváraní záložnej kópie: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Chyba pri premenúvaní dočasného súboru: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Chyba pri skracovaní súboru: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Chyba pri otváraní súboru „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Cieľový súbor je adresár" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Cieľový súbor nie je obyčajný súbor" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Súbor bol externe zmenený" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Chyba pri odstraňovaní starého súboru: %s" + +#: ../gio/gmemoryinputstream.c:471 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Poskytnutý neplatný GSeekType" + +#: ../gio/gmemoryinputstream.c:481 +msgid "Invalid seek request" +msgstr "Neplatná požiadavka na presunutie" + +#: ../gio/gmemoryinputstream.c:505 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream sa nedá skrátiÅ¥" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Pamäťový výstupný prúd nepodporuje zmenu veľkosti" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Zlyhala zmena veľkosti pamäťového výstupného prúdu" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"VeľkosÅ¥ pamäte potrebná na vykonanie zápisu je väčšia ako dostupný adresný " +"priestor" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Požadovaný presun pred začiatok prúdu" + +#: ../gio/gmemoryoutputstream.c:758 +msgid "Requested seek beyond the end of the stream" +msgstr "Požadovaný presun za koniec prúdu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: ../gio/gmount.c:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "pripojenie neimplementuje „unmount“ (odpojenie)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:471 +msgid "mount doesn't implement \"eject\"" +msgstr "pripojenie neimplementuje „eject“ (vysunutie)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of unmount or unmount_with_operation. +#: ../gio/gmount.c:549 +msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" +msgstr "" +"pripojenie neimplementuje „unmount“ (odpojenie) ani " +"„unmount_with_operation“ (odpojenie s operáciou)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gmount.c:634 +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"pripojenie neimplementuje „eject“ (vysunutie) ani " +"„eject_with_operation“ (vysunutie s operáciou)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:722 +msgid "mount doesn't implement \"remount\"" +msgstr "pripojenie neimplementuje „remount“ (opätovné pripojenie)" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:803 +msgid "mount doesn't implement content type guessing" +msgstr "pripojenie neimplementuje odhad typu obsahu" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "pripojenie neimplementuje synchrónny odhad typu obsahu" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Názov hostiteľa „%s“ obsahuje „[“, ale neobsahuje „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "SieÅ¥ nedostupná" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Hostiteľ nedostupný" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ monitor siete: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Nepodarilo sa vytvoriÅ¥ monitor siete: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Nepodarilo sa získaÅ¥ vzdialenú adresu: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Výstupný prúd neimplementuje zápis" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Zdrojový prúd je už zatvorený" + +# %s je cesta +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Zdroj v „%s“ neexistuje" + +# %s je cesta +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Zdroj v „%s“ sa nepodarilo rozbaliÅ¥" + +# %s je cesta +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Zdroj v „%s“ nie je adresár" + +# MČ: vÅ¡imol som si to na viacerých miestach, ale nepasuje mi to. Nemalo by byÅ¥ skôr „posúvanie“? +# PM: presúvaÅ¡ sa na iné miesto posúvanie mi tiez nevadí, ak dalsí kontrolór uzná ze by to malo byt posúvanie môže zmeniÅ¥. +# PK: necham presuvanie, lebo presuva sa kurzor, posuvanie mi evokuje ze sa data posuvaju +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Vstupný prúd neimplementuje presúvanie" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Zobrazí pomocníka" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[PRÍKAZ]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Zoznam častí obsahujúcich zdroje v SÚBORE vo formáte elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Zoznam zdrojov\n" +"Ak je zadaná ČASŤ, budú to iba zdroje tejto časti\n" +"Ak je zadaná CESTA, bude to iba zoznam zodpovedajúcich zdrojov" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "SÚBOR [CESTA]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "ČASŤ" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Zoznam zdrojov s podrobnosÅ¥ami\n" +"Ak je zadaná ČASŤ, budú to iba zdroje tejto časti\n" +"Ak je zadaná CESTA, bude to iba zoznam zodpovedajúcich zdrojov\n" +"Podrobnosti zahŕňajú časti, veľkosti a kompresie" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Extrahuje súbor zdrojov do stdout" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "CESTA SÚBORU" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Neznámy príkaz %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Použitie:\n" +" gresource [--section ČASŤ] PRÍKAZ [PARAMETRE...]\n" +"\n" +"Príkazy:\n" +" help Zobrazí tieto informácie\n" +" sections Zoznam častí so zdrojmi\n" +" list Zoznam zdrojov\n" +" details Zoznam zdrojov s podrobnosÅ¥ami\n" +" extract Extrahuje zdroj\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Použitie:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Parametre:\n" + +# http://en.wikipedia.org/wiki/Executable_and_Linkable_Format +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " ČASŤ (voliteľný) názov časti elf\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " PRÍKAZ (voliteľný) príkaz na vysvetlenie\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " SÚBOR elf súbor (binárny súbor alebo zdieľaná knižnica)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" SÚBOR Súbor vo formáte elf (binárny súbor alebo zdieľaná knižnica)\n" +" alebo preložený súbor zdrojov\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[CESTA]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " CESTA (voliteľná) cesta k súboru zdrojov (môže byÅ¥ čiastočná)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "CESTA" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " CESTA Cesta k súboru zdrojov\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Neexistuje schéma „%s“\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schéma „%s“ nie je premiestniteľná (cesta nesmie byÅ¥ určená)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schéma „%s“ je premiestniteľná (cesta musí byÅ¥ určená)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Poskytnutá prázdna cesta.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Cesta musí začínaÅ¥ lomkou (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Cesta musí končiÅ¥ lomkou (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Cesta nesmie obsahovaÅ¥ dve po sebe nasledujúce lomky (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Neexistuje kľúč „%s“\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Poskytnutá hodnota nepatrí do platného rozsahu\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Vypíše nainÅ¡talované (nepremiestniteľné) schémy" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Vypíše nainÅ¡talované premiestniteľné schémy" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Vypíše kľúče v SCHÉME" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHÉMA[:CESTA]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Vypíše potomkov SCHÉMY" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Vypíše rekurzívne vÅ¡etky kľúče a hodnoty\n" +"Ak SCHÉMA nie je zadaná, vypíše vÅ¡etky kľúče\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHÉMA[:CESTA]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Získa hodnotu KĽÚČA" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHÉMA[:CESTA] KĽÚČ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Spýta sa na platný rozsah hodnôt KĽÚČA" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Nastaví hodnotu KĽÚČA na HODNOTU" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHÉMA[:CESTA] KĽÚČ HODNOTA" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Nastaví KĽÚČ na jeho predvolenú hodnotu" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Nastaví vÅ¡etky kľúče v SCHÉME na ich predvolené hodnoty" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Skontroluje, či je KĽÚČ zapisovateľný" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Sleduje zmeny KĽÚČA.\n" +"Ak KĽÚČ nie určený, sleduje vÅ¡etky kľúče v SCHÉME.\n" +"Sledovanie zastavíte pomocou ^C.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHÉMA[:CESTA] [KĽÚČ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Použitie:\n" +" gsettings [--schemadir ADRESÁR_SCHÉMY] PRÍKAZ [PARAMETRE...]\n" +"\n" +"Príkazy:\n" +" help Zobrazí tieto informácie\n" +" list-schemas Vypíše nainÅ¡talované schémy\n" +" list-relocatable-schemas Vypíše premiestniteľné schémy\n" +" list-keys Vypíše kľúče v schéme\n" +" list-children Vypíše potomkov schémy\n" +" list-recursively Rekurzívne vypíše kľúče a hodnoty\n" +" range Zistí rozsah hodnôt kľúča\n" +" get Získa hodnotu kľúča\n" +" set Nastaví hodnotu kľúča\n" +" reset Obnoví predvolenú hodnotu kľúča\n" +" reset-recursively Obnoví hodnoty vÅ¡etkých kľúčov v danej schéme\n" +" writable Skontroluje či je kľúč zapisovateľný\n" +" monitor Sleduje zmeny\n" +"\n" +"PodrobnejÅ¡ieho pomocníka získate pomocou „gsettings help PRÍKAZ“.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Použitie:\n" +" gsettings [--schemadir ADRESÁR_SCHÉMY] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " ADRESÁR_SCHÉMY Adresár, v ktorom sa majú hľadaÅ¥ dodatočné schémy\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHÉMA Názov schémy\n" +" CESTA Cesta pre premiestniteľné schémy\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KĽÚČ (voliteľný) kľúč vo vnútri schémy\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KĽÚČ Kľúč vo vnútri schémy\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " HODNOTA Hodnota, ktorá sa má nastaviÅ¥\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Poskytnutý prázdny názov schémy\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Neplatný soket, neinicializované" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neplatný soket, inicializácia zlyhala kvôli: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Soket je už zatvorený" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "VyprÅ¡al časový limit V/V soketu" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "vytvára sa GSocket z popisovanča súboru: %s" + +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Nepodarilo sa vytvoriÅ¥ soket: %s" + +#: ../gio/gsocket.c:515 +msgid "Unknown family was specified" +msgstr "Bola zadaná neznáma rodina protokolov" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "Bol zadaný neznámy protokol" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "nepodarilo sa získaÅ¥ lokálnu adresu: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "nepodarilo sa získaÅ¥ vzdialenú adresu: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "nepodarilo sa počúvaÅ¥: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "Chyba pri viazaní sa na adresu: %s" + +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Chyba pri pripájaní sa k multicast skupine: %s" + +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Chyba pri odpájaní sa od multicast skupiny: %s" + +# PM: SSM je termín neprekladal som to +# http://en.wikipedia.org/wiki/Source-specific_multicast +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "Nie je podpora pre source-specific multicast" + +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Chyba pri prijímaní pripojenia: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "Prebieha pripájanie" + +#: ../gio/gsocket.c:2330 +msgid "Unable to get pending error: " +msgstr "Nepodarilo sa získaÅ¥ chybu určenú na spracovanie: %s" + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "Chyba pri prijímaní údajov: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "Chyba pri odosielaní údajov: %s" + +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Nepodarilo sa vypnúť soket: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "Chyba pri zatváraní soketu: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čaká sa na stav soketu: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "Chyba pri odosielaní správy: %s" + +#: ../gio/gsocket.c:3805 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage nie je podporovaný vo Windows" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4274 +#, c-format +msgid "Error receiving message: %s" +msgstr "Chyba pri prijímaní správy: %s" + +#: ../gio/gsocket.c:4356 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Nepodarilo sa získaÅ¥ chybu určenú na spracovanie: %s" + +#: ../gio/gsocket.c:4375 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" +"g_socket_get_credentials nie je pre tento operačný systém implementovaný" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Nepodarilo sa pripojiÅ¥ k proxy serveru %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Nepodarilo sa pripojiÅ¥ k %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Nepodarilo sa pripojiÅ¥: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Neznáma chyba pripájania" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Pripojenie cez proxy nepoužívajúce TCP nie je podporované." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokol proxy „%s“ nie je podporovaný." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Poslucháč je už zatvorený" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Pridaný soket je zatvorený" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nepodporuje adresu IPv6 „%s“" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Používateľské meno je príliÅ¡ dlhé pre protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Názov hostiteľa „%s“ je pre protokol SOCKSv4 príliÅ¡ dlhý" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Server nie je proxy serverom SOCKSv4" + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Pripojenie cez server SOCKSv4 bolo odmietnuté" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Server nie je proxy serverom SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Proxy SOCKSv5 vyžaduje overenie totožnosti." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Proxy SOCKSv5 vyžaduje metódu overenia totožnosti, ktorú nepodporuje GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Používateľské meno alebo heslo je príliÅ¡ dlhé pre protokol SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Overenie totožnosti SOCKSv5 zlyhalo pre nesprávne používateľské meno alebo " +"heslo." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Názov hostiteľa „%s“ je pre protokol SOCKSv5 príliÅ¡ dlhý" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Proxy server SOCKSv5 používa neznámy typ adresy." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Vnútorná chyba proxy servera SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Pripojenie SOCKSv5 nie je povolené sadou pravidiel." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Hostiteľ nie je dostupný cez server SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SieÅ¥ nie je dostupný cez proxy SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Pripojenie cez proxy SOCKSv5 je odmietnuté." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Proxy SOCKSv5 nepodporuje príkaz „connect“." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Proxy SOCKSv5 nepodporuje poskytnutý typ adresy." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Neznáma chyba proxy SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Nedá sa spracovaÅ¥ kódovanie GThemedIcon verzie %d" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Chyba pri preklade adresy „%s“: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Chyba pri pri spätnom preklade adresy „%s“: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Neexistuje DNS záznam požadovaného typu pre „%s“" + +# DNS +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Služba nie je dočasne schopná preložiÅ¥ adresu „%s“" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Chyba pri preklade adresy „%s“" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Nepodá sa rozÅ¡ifrovaÅ¥ súkromný kľúč v kódovaní PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "NenaÅ¡iel sa súkromný kľúč v PEM kódovaní" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Nepodarilo sa analyzovaÅ¥ súkromný kľúč v kódovaní PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "NenaÅ¡iel sa certifikát v kódovaní PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Neporarilo sa analyzovaÅ¥ certifikát v kódovaní PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Toto je posledná Å¡anca na zadanie správneho hesla pred uzamknutím vášho " +"prístupu." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Niekoľko zadaných hesiel bolo nesprávnych a po ďalších zlyhaniach bude váš " +"prístup uzamknutý." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Zadané heslo je nesprávne." + +# PK: plural forms +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, fuzzy, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Očakávaná jedna riadiaca správa, získaných %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Neočakávaný typ doplnkových údajov" + +# PK: plural forms +#: ../gio/gunixconnection.c:190 +#, fuzzy, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Očakávaný jeden popisovač súboru, no získaných %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Prijatý neplatný popisovač súboru" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Chyba pri odosielaní poverení: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Chyba pri kontrole, či je SO_PASSCRED povolené pre soket: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Chyba pri povoľovaní SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Mal sa prečítaÅ¥ jeden bajt s prichádzajúcimi povereniami, no prečítalo sa " +"nula bajtov" + +# https://bugzilla.gnome.org/show_bug.cgi?id=658713 +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Neočakávala sa riadiaca správa, no získané %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Chyba počas zakazovania SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Chyba pri čítaní z popisovača súboru: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Chyba pri zatváraní popisovača súboru: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "Koreň súborového systému" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Chyba pri zápise do popisovača súboru: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"V tomto systéme nie sú podporované abstraktné adresy soketov unixových domén" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"zväzok neimplementuje eject (vysunutie) ani eject_with_operation (vysunutie " +"s operáciou)" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Nedá sa nájsÅ¥ aplikácia" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Chyba pri spúšťaní aplikácie: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Identifikátory URI nie sú podporované" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "menenie asociácií nie je podporované na win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Vytváranie asociácií nie je podporované na win32" + +# PÅ : file handle (win32) je ekvivalent file descriptor - dovolil som si to preložiÅ¥ rovnako. Keďže používané manipulátor, alebo rukoväť sú oba zlé preklady (obsluha je handler)... A dokonca aj v slovenskom preklade Správcu úloh vo win je použitý popisovač. +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Chyba pri čítaní z popisovača: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Chyba pri zatváraní popisovača: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Chyba pri zápise do popisovača: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nedostatok pamäte" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Vnútorná chyba: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Potrebných viac vstupov" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Neplatné komprimované údaje" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresa, na ktorej sa má počúvaÅ¥" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Ignorované kvôli kompatibilite s GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Zobrazí adresu" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Zobrazí adresu v režime shellu" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Spustí službu dbus" + +# PK: argumenty +# PM: agumenty sú (skutočné) parametre a parametre sú formálne parametre tak je to zaužívané - vid napr lexikón informatiky alebo knihu o pascale +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Chybné parametre\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočakávaný atribút „%s“ prvku „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atribút „%s“ prvku „%s“ nenájdený" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, 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:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočakávaná značka „%s“ vo vnútri „%s“" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "V dátových adresároch nebol nájdený žiadny platný súbor záložiek" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Záložka pre identifikátor URI „%s“ už existuje" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nebola nájedená záložka pre identifikátor URI „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "V záložke pre identifikátor URI „%s“ nie je definovaný žiadny typ MIME" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" +"V záložke pre identifikátor URI „%s“ nebol definovaný žiadny súkromný príznak" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "V záložke pre identifikátor URI „%s“ neboli nastavené žiadne skupiny" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Žiadna aplikácia s názvom „%s“ nezaregistrovala záložku pre „%s“" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Zlyhalo rozvinutie spustiteľného riadka „%s“ o identifikátor URI „%s“" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Čiastočná sekvencia znakov na konci vstupu" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Nedá sa previesÅ¥ náhradné „%s“ do kódovej stránky „%s“" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Identifikátor URI „%s“ nie je absolútny identifikátor URI používajúci schému " +"„file“" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Identifikátor URI lokálneho súboru „%s“ nesmie obsahovaÅ¥ „#“" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Identifikátor URI „%s“ je neplatný" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Názov hostiteľa URI „%s“ je neplatný" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Identifikátor URI „%s“ obsahuje neplatné Å¡peciálne uvedené znaky" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Cesta „%s“ nie je absolútna" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Neplatný názov hostiteľa" + +# PM: ale myslím si ze by to malo byÅ¥ preložené, lebo ak si niekto v hodinách prepne na 12 hodinový formát tak si potom nebude vedieÅ¥ nastaviÅ¥ správny čas +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "Doobeda" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "Poobede" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %-d. %B %Y, %H:%M:%S %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%H:%M:%S" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "január" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "február" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "marec" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "apríl" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "máj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "jún" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "júl" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "august" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "september" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "október" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "november" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "december" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "máj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jún" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "júl" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "pondelok" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "utorok" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "streda" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Å¡tvrtok" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "piatok" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sobota" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "nedela" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "po" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "ut" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "st" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Å¡t" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "pi" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "so" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ne" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Chyba pri otváraní adresára „%s“: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Nepodarilo sa alokovaÅ¥ %lu bajtov na čítanie súboru „%s“" +msgstr[1] "Nepodarilo sa alokovaÅ¥ %lu bajt na čítanie súboru „%s“" +msgstr[2] "Nepodarilo sa alokovaÅ¥ %lu bajty na čítanie súboru „%s“" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Chyba pri čítaní súboru „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Súbor „%s“ je príliÅ¡ veľký" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Zlyhalo čítanie zo súboru „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Zlyhalo otvorenie súboru „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Zlyhalo získanie atribútov súboru „%s“: fstat() zlyhalo: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Zlyhalo otvorenie súboru „%s“: fdopen() zlyhalo: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Zlyhalo premenovanie súboru „%s“ na „%s“: g_rename() zlyhalo: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Zlyhalo vytvorenie súboru „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Zlyhalo otvorenie súboru „%s“ na zápis: fdopen() zlyhalo: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Zlyhal zápis súboru „%s“: fwrite() zlyhalo: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Zlyhal zápis súboru „%s“: fflush() zlyhalo: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Zlyhal zápis súboru „%s“: fsync() zlyhalo: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Zlyhalo zatvorenie súboru „%s“: fclose() zlyhalo: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Existujúci súbor „%s“ nemohol byÅ¥ odstránený: g_unlink() zlyhalo: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Å ablóna „%s“ je neplatná, nesmie obsahovaÅ¥ „%s“" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablóna „%s“ neobsahuje XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Zlyhalo načítanie symbolického odkazu „%s“: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Symbolické odkazy nie sú podporované" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Nedá sa urobiÅ¥ priame čítanie v g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Zanechané neprevedené údaje v zásobníku na čítanie" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanál skončil s neúplným znakom" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Nedá sa urobiÅ¥ priame čítanie v g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "Nepodarilo sa nájsÅ¥ platný súbor kľúčov vo vyhľadávacích adresároch" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Nie je bežný súbor" + +#: ../glib/gkeyfile.c:1158 +#, 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árom kľúč-hodnota, " +"skupinou, ani komentárom" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neplatný názov skupiny: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Súbor kľúčov nezačína skupinou" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neplatný názov kľúča: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Súbor kľúčov obsahuje nepodporované kódovane „%s“" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Súbor kľúčov nemá skupinu „%s“" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Súbor kľúčov neobsahuje kľúč „%s“" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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á neinterpretovateľnú hodnotu." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Súbor kľúčov obsahuje kľúč „%s“ v skupine „%s“, ktorý má neinterpretovateľnú " +"hodnotu." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Kľúč „%s“ v skupine „%s“ má hodnotu „%s“, pričom bola očakávaná %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +msgid "Key file contains escape character at end of line" +msgstr "Súbor kľúčov obsahuje znak escape na konci riadku" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Súbor kľúčov obsahuje neplatnú Å¡peciálnu (escape) sekvenciu „%s“" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Hodnota „%s“ nemôže byÅ¥ interpretovaná ako číslo." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celočíselná hodnota „%s“ je mimo rozsah" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Hodnota „%s“ nemôže byÅ¥ interpretovaná ako reálne číslo." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Hodnota „%s“ nemôže byÅ¥ interpretovaná ako logická hodnota." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Zlyhalo získanie atribútov súboru „%s%s%s%s“: fstat() zlyhalo: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Zlyhalo mapovanie %s%s%s%s: mmap() zlyhalo: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Zlyhalo otvorenie súboru „%s“: open() zlyhalo: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Chyba na riadku %d znak %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "V názve je neplatný text v kódovaní UTF-8 – neplatné reÅ¥azec „%s“" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name" +msgstr "„%s“ nie je platný názov" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "„%s“ nie je platným názvom: „%c“" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Chyba na riadku č. %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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 "" +"Zlyhalo analyzovanie „%-.*s“, čo by mala byÅ¥ číslica z číselného kódu znaku " +"(napríklad ê) – možno je číslica príliÅ¡ veľká" + +#: ../glib/gmarkup.c:648 +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 "" +"Kód znaku neskončil bodkočiarkou. Asi ste použili & bez úmyslu napísaÅ¥ kód " +"znaku – zapíšte ho ako entitu &" + +#: ../glib/gmarkup.c:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Kód znaku „%-.*s“ nie je kódom povoleného znaku" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Nájdená prázdna entita „&;“, platné entity sú: & " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Názov entity „%-.*s“ nie je známy" + +#: ../glib/gmarkup.c:725 +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 neskončila bodkočiarkou. Asi ste použili & bez úmyslu napísaÅ¥ kód " +"znaku – zapíšte ho ako entitu &" + +#: ../glib/gmarkup.c:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument musí začínaÅ¥ prvkom (napr. )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ nie je platným znakom za znakom „<“, nesmie ním začínaÅ¥ názov prvku" + +#: ../glib/gmarkup.c:1181 +#, 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 „>“ ukončujúci značku prázdneho " +"prvku „%s“" + +#: ../glib/gmarkup.c:1265 +#, 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 názvom atribútu „%s“ v prvku " +"„%s“" + +#: ../glib/gmarkup.c:1306 +#, 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ý nepovinný atribút alebo znak „>“ alebo " +"„/“ ukončujúci začiatočnú značku prvku „%s“. Možno ste použili neplatný znak " +"v názve atribútu" + +#: ../glib/gmarkup.c:1350 +#, 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“. Bola očakávaná úvodzovka za znakom „=“ uvádzajúca " +"hodnotu atribútu „%s“ prvku „%s“" + +#: ../glib/gmarkup.c:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ nie je platným znakom po koncovom názve prvku „%s“. Povolený znak je „>“" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Prvok „%s“ bol ukončený, momentálne nie je otvorený žiadny prvok" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Prvok „%s“ bol ukončený, ale momentálne otvorený prvok je „%s“" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prázdny alebo obsahuje iba netlačiteľné znaky" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument neočakávane skončil hneď po začiatočnej lomenej zátvorke „<“" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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 prvkami – „%s“ bol posledný " +"otvorený prvok." + +#: ../glib/gmarkup.c:1737 +#, 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:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument neočakávane skončil v názve prvku" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument neočakávane skončil v názve atribútu" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument neočakávane skončil v začiatočnej značke prvku." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Dokument neočakávane skončil po „=“ za názvom atribútu, chýba hodnota " +"atribútu" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument neočakávane skončil v hodnote atribútu" + +#: ../glib/gmarkup.c:1783 +#, 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 prvok „%s“" + +#: ../glib/gmarkup.c:1789 +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/goption.c:742 +msgid "Usage:" +msgstr "Použitie:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[VOĽBA...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Voľby pomocníka:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Zobrazí voľby pomocníka" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Zobrazí vÅ¡etky voľby pomocníka" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Voľby aplikácie:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Nedá sa analyzovaÅ¥ celočíselná hodnota „%s“ pre %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celočíselná hodnota „%s“ pre %s je mimo rozsah" + +# PÅ : double je dvojitá presnosÅ¥ (čísla s desatinnou čiarkou) +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Nedá sa analyzovaÅ¥ hodnota double „%s“ pre %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Hodnota double „%s“ pre %s je mimo rozsah" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Chyba analyzovania voľby %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Chýbajúci parameter pre %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Neznáma voľba %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "poÅ¡kodený objekt" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "vnútorná chyba alebo poÅ¡kodený objekt" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "nedostatok pamäte" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "dosiahnutý limit spätného hľadania" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "vzor obsahuje položky nepodporované pri čiastočnom porovnávaní" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"spätné odkazy použité ako podmienky nie sú podporované pri čiastočnom " +"porovnávaní" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "dosiahnutý limit rekurzie" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "neplatná kombinácia príznakov nového riadka" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "zlý ofset" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "krátke utf8" + +# Ide o omyl programátora: case PCRE_ERROR_RECURSELOOP: return _("recursion loop"); +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekurzívna slučka" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "neznáma chyba" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ na konci vzoru" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c na konci vzoru" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "nerozpoznaný znak nasledujúci za \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "nesprávne poradie čísel v kvantifikátore {}" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "príliÅ¡ veľké číslo v kvantifikátore {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "chýbajúca koncová ] pre triedu znakov" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "neplatná Å¡peciálna (escape) sekvencia v triede znakov" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "nesprávne poradie rozsahu v triede znakov" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nie je čo opakovaÅ¥" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "neočakávané opakovanie" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "nerozpoznaný znak za (? alebo (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "triedy s názvami POSIX sú podporované iba v triedach" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "chýbajúca koncová )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "odkaz na neexistujúci podvzor" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "chýbajúca ) po komentári" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regulárny výraz je príliÅ¡ veľký" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "nepodarilo sa získaÅ¥ pamäť" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") bez otváracej (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "pretečenie kódu" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "nerozpoznaný znak za (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "spätné tvrdenie nemá pevnú dĺžku" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "zle formátované číslo alebo názov za (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "podmienková skupina obsahuje viac ako dve zátvorky" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "tvrdenie očakávané za (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "za (?R alebo (?[+-]číslice musí nasledovaÅ¥ )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "neznámy POSIX názov triedy" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "porovnávacie POSIX prvky nie sú podporované" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "hodnota znaku v postupnosti \\x{...} je príliÅ¡ veľká" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "neplatná podmienka (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C nie je povolené v spätnom tvrdení" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "\\L, \\l, \\N{name}, \\U, a \\u nie sú podporované" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "rekurzívne volanie by sa mohlo donekonečna opakovaÅ¥" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "nerozpoznaný znak za (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "chýba ukončovací člen v názve podvzoru" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dva pomenované podvzory majú rovnaký názov" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "zle formátovaná postupnosÅ¥ \\P alebo \\p" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "neznámy názov vlastnosti za \\P alebo \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "názov podvzoru je príliÅ¡ dlhý (maximum je 32 znakov)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "príliÅ¡ mnoho pomenovaných podvzorov (maximum je 10 000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "osmičková hodnota je väčšia ako \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "pretečený priestor pre preklad" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "predtým kontrolovaný odkazovaný podvzor nenájdený" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "skupina DEFINE obsahuje viac ako jednu vetvu" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "nekonzistentné voľby NEWLINE" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"za \\g nenasleduje názov v guľatých ani lomených zátvorkách, názov alebo " +"číslo v úvodzovkách ani nekódované číslo" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "očíslovaný odkaz nesmie byÅ¥ nula" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "parameter nie je pre (*ACCEPT), (*FAIL) a (*COMMIT) dovolený" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) nebolo rozpoznané" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "číslo je príliÅ¡ veľké" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "za (?& chýba názov podvzoru" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "za (?+ sa očakáva číslica" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" +"] nie je platný dátový znak v režime kompatibility s jazykom JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "rôzne názvy pre podvzory s rovnakým číslom nie sú povolené" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) musí maÅ¥ parameter" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "za \\c musí nasledovaÅ¥ znak ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"za \\k nenasleduje názov v zátvorkách, lomených zátvorkách alebo úvodzovkách" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N nie je v triede podporované" + +# PM:nie som si istý +# MČ: Hmm. Musel som pozrieÅ¥ zdrojáky pcre, aby som sa troÅ¡ku ztoho vymotal. Pri doprednom vyhľadávaní (lookahead) si stroj regulárneho výrazu odkladá odkazy na už asociované (zjednoduÅ¡ene nájdené) časti textu k regulárnemu výrazu. Ak je ich priveľa, nezmestia sa do pamäte, malloc zlyhá, vráti túto chybovú hlášku. Myslím, že preklad aj originál mi povedali rovnako veľa informácií. +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "príliÅ¡ mnoho dopredných odkazov" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "názov v (*MARK), (*PRUNE), (*SKIP) alebo (*THEN) je príliÅ¡ dlhý" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "hodnota znaku v postupnosti \\u.... je príliÅ¡ veľká" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Chyba počas porovnávania regulárneho výrazu %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knižnica PCRE je preložená bez podpory UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knižnica PCRE je preložená bez podpory vlastností UTF8" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Knižnica PCRE je preložená s nekompatibilnými voľbami" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Chyba počas prekladu regulárneho výrazu %s pri znaku %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Chyba počas optimalizovania regulárneho výrazu %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "očakávaná Å¡estnástková číslica alebo „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "očakávaná Å¡estnástková číslica" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "chýba „<“ v symbolickom odkaze" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "neukončený symbolický odkaz" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "symbolický odkaz s nulovou dĺžkou" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "očakávaná číslica" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "neplatný symbolický odkaz" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "zabudnuté koncové „\\“" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "neznáma Å¡peciálna (escape) sekvencia" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Chyba počas analyzovania nahrádzajúceho textu „%s“ pri znaku %lu: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citovaný text nezačína úvodzovkami" + +#: ../glib/gshell.c:178 +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 v " +"úvodzovkách" + +#: ../glib/gshell.c:574 +#, 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:581 +#, 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 znakom %c. (Text bol " +"„%s“)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Text bol prázdny (alebo obsahoval iba medzery)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Zlyhalo čítanie údajov z dcérskeho procesu (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Neočakávaná chyba v select() pri čítaní údajov z dcérskeho procesu (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Dcérsky proces skončil s kódom %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Dcérsky proces bol zabitý signálom %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Dcérsky proces bol zastavený signálom %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Dcérsky proces skončil neobvykle" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Zlyhalo čítanie zo zreÅ¥azenia s potomkom (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Zlyhalo vytvorenie vetvy (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Zlyhala zmena adresára na „%s“ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Zlyhalo spustenie dcérskeho procesu „%s“ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Zlyhalo presmerovanie vstupu alebo výstupu dcérskeho procesu (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Zlyhalo vytvorenie vetvy dcérskeho procesu (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznáma chyba pri spúšťaní dcérskeho procesu „%s“" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Nepodarilo sa prečítaÅ¥ dostatok údajov zo zreÅ¥azenia s dcérskym procesom (%s)" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Zlyhalo vytvorenie zreÅ¥azenia pre komunikáciu s dcérskym procesom (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Zlyhalo čítanie údajov z dcérskeho procesu" + +#: ../glib/gspawn-win32.c:376 ../glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Zlyhalo spustenie dcérskeho procesu (%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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neplatný reÅ¥azec v prostredí: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neplatný pracovný adresár: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Zlyhalo spustenie pomocného programu (%s)" + +#: ../glib/gspawn-win32.c:997 +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í údajov z dcérskeho " +"procesu" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Znak mimo rozsah UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Neplatná sekvencia na vstupe prevodu" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Znak mimo rozsah UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajtov" +msgstr[1] "%u bajt" +msgstr[2] "%u bajty" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajtov" +msgstr[1] "%s bajt" +msgstr[2] "%s bajty" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Neuplný údaj prijatý pre „%s“" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Neočakávaná dĺžka voľby počas kontrolovania, či je SO_PASSCRED povolené " +#~ "pre soket. Očakávaných %d bajtov, získaných %d" diff --git a/po/sl.po b/po/sl.po new file mode 100644 index 0000000..49c99f1 --- /dev/null +++ b/po/sl.po @@ -0,0 +1,4398 @@ +# Slovenian translations for glib. +# Copyright (C) 2002-2006 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# +# Andraž Tori 2000. +# Matej Urbančič , 2007 - 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-27 16:25+0000\n" +"PO-Revision-Date: 2013-01-27 21:58+0100\n" +"Last-Translator: Matej Urbančič \n" +"Language-Team: Slovenian GNOME Translation Team \n" +"Language: sl_SI\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-SourceCharset: utf-8\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Prevelika vrednost Å¡tetja poslana na %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Iskanje po osnovnem pretoku ni podprto" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Ni mogoče razčleniti GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Pretok je že zaprt" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Razčlenitev na osnovnem pretoku ni dovoljena" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Opravilo je bilo preklicano." + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Neveljaven predmet, opravilo ni začeto" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Neveljavno večbitno zaporedje na vhodu" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Ni dovolj prostora za cilju" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Neveljavno zaporedje bajtov na vhodu pretvorbe" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Napaka med pretvorbo: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Dejanje prekinitve zagona ni podprto" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvorba iz nabora znakov '%s' v '%s' ni podprta" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ni mogoče odpreti pretvornika iz '%s' v '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s vrsta" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Neznana vrsta" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s vrsta datoteke" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "Na tem OS predmet GCredentials ni podprt" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Okolje ne podpira možnosti GCredentials" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "Predmet GCredentials na tem sistemu ne vsebuje ustreznega ID opravila" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Nepričakovan prezgodnji konec pretoka" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nepodprt ključ `%s' v vnosu naslova `%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Naslov `%s' je nepravilen (zahtevana je pot, začasna mapa ali abstraktni " +"ključ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Nesmiselna kombinacija za par ključ/vrednost v vnosu naslova `%s'" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Napaka v naslovu `%s' - atribut vrat je nepravilno oblikovan" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Napaka v naslovu `%s' - atribut družine je nepravilno oblikovan" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Predmet naslova `%s' ne vsebuje dvopičja (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Par ključ/vrednost %d, `%s', v predmetu naslova `%s', ne vsebuje enačaja" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Napaka, neubežni ključ ali vrednost v paru ključ/vrednost %d, `%s', v " +"predmetu naslova `%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Napaka v naslovu `%s' - unix prenos zahteva enega izmed ključev `path' ali " +"`abstract' nastavljen" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Napaka v naslovu `%s' - atribut host manjka ali pa je nepravilno oblikovan" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" +"Napaka v naslovu `%s' - manjka atribut vrat ali pa ali je nepravilno " +"oblikovan" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Napaka v naslovu `%s' - atribut noncefile manjka ali pa je nepravilno " +"oblikovan" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Napaka samodejnega zaganjanja:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Neznan ali nepodprt prenos `%s' za naslov `%s' " + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Napaka med odpiranjem enkratne datoteke `%s': %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Napaka med branjem iz enkratne datoteke `%s': %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Napaka med branjem iz datoteke nonce `%s'; pričakovanih 16 bajtov, dobljenih " +"pa %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Napaka med pisanjem vsebine datoteke nonce `%s' v pretok:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Podan naslov je prazen." + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Ni mogoče oživiti vodila sporočila med izvajanjem ukaza setuid" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ni mogoče oživiti vodila sporočila brez predmeta machine-id:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Napaka med oživljanjem ukazne vrstice `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(S pritiskom na katerikoli znak, se okno zapre)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Vodilo seje DBus ni zagnano, zato je samodejni zagon spodletel" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Ni mogoče določiti naslova vodila seje (ni podprto v tem OS)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Ni mogoče določiti naslova vodila iz okoljske spremenljivke " +"DBUS_STARTER_BUS_TYPE - neznana vrednost `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Ni mogoče določiti naslova vodila, kajti okoljska spremenljivka " +"DBUS_STARTER_BUS_TYPE ni nastavljena" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Neznana vrsta vodila %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Nepričakovano pomanjkanje vsebine med branjem vrstice" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Nepričakovano pomanjkanje vsebine med (varnem) branjem vrstice" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Izčrpani so vsi razpoložljivi overitveni mehanizmi (poskusi: %s) " +"(razpoložljivih: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Prekinjeno s strani GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Napaka med pridobivanjem mape `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Dovoljenja na mapi `%s' so nepravilna. Pričakovana 0700, dobljena pa 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Napaka med ustvarjanjem mape `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Napaka med odpiranjem zbirke ključev `%s' za branje:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Vrstica %d zbirke ključev `%s' z vsebino `%s' je neustrezno oblikovana" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Prvi žeton vrstice %d zbirke ključev pri `%s' z vsebino `%s' je neustrezno " +"oblikovan" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Drugi žeton vrstice %d zbirke ključev pri `%s' z vsebino `%s' je neustrezno " +"oblikovana" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "PiÅ¡kota z id %d v zbirki ključev `%s' ni mogoče najti" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Napaka brisanja stare datoteke zaklepa `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Napaka med ustvarjanjem datoteke `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Napaka med zapiranjem (nepovezane) zaklepne datoteke `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Napaka med razvezovanjem datoteke zaklepa `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Napaka med odpiranjem zbirke ključev `%s' za branje: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(V nadaljevanju je spodletelo tudi sproščanje zaklepa `%s': %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Povezava je zaprta" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Čas zakasnitve je potekel" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"Med izgrajevanjem povezave s strani odjemalca so bile odkrite nepodprte " +"zastavice" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Vmesnik `org.freedesktop.DBus.Properties' na predmetu na poti %s ne obstaja" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Napaka med nastavljanjem lastnosti `%s': pričakovana je vrsta `%s', dobljena " +"pa `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Lastnost `%s' ne obstaja" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Lastnosti `%s' ni berljiva" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Lastnost `%s' ni zapisljiva" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Vmesnik `%s' ne obstaja" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Vmesnik ne obstaja" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Vmesnik `%s' na predmetu na poti %s ne obstaja" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Način `%s' ne obstaja" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Vrsta sporočila `%s' se ne sklada s pričakovano vrsto `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Za vmesnik %s pri %s je predmet že izvožen" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Način `%s' je vrnil vrsto `%s', pričakovana pa je vrsta `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Način `%s' na vmesniku `%s' s podpisom `%s' ne obstaja" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Podrejeno drevo je že izvoženo za %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "vrsta je neveljavna" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Sporočilo METHOD_CALL: manjka polje glave PATH ali MEMBER" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Sporočilo METHOD_RETURN: manjka polje glave REPLY_SERIAL" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "Sporočilo ERROR: manjka polje glave REPLY_SERIAL ali ERROR_NAME" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Sporočilo SIGNAL: mankja polje glave PATH, INTERFACE ali MEMBER" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Sporočilo SIGNAL: polje glave PATH uporablja rezervirano vrednost /org/" +"freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Sporočilo SIGNAL: polje glave INTERFACE uporablja rezervirano vrednost org." +"freedesktop.DBus.Local" + +# Double multiple plural? +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Med poskusom branja %lu bajtov je bilo prejetih le %lu." +msgstr[1] "Med poskusom branja %lu bajtov je bilo prejet le %lu." +msgstr[2] "Med poskusom branja %lu bajtov sta bila prejeta le %lu." +msgstr[3] "Med poskusom branja %lu bajtov so bili prejeti le %lu." + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Po nizu `%s' je pričakovan bajt NUL, vendar je bil zaznan %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Pričakovan veljaven UTF-8 niz, vendar je najdenih nepravilno Å¡tevilo bajtov " +"na bajtnem odmiku %d (dolžina niza %d). Do takrat veljaven UTF-8 niz je `%s'" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Razčlenjena vrednost `%s' ni veljavna pot predmeta vodila D-Bus" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Razčlenjena vrednost `%s' ni veljaven podpis vodila D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Najdeno je polje dolžine %u bajtov, največja dovoljena pa je 2<<26 bajtov " +"(64 MiB)." +msgstr[1] "" +"Najdeno je polje dolžine %u bajta, največja dovoljena pa je 2<<26 bajtov (64 " +"MiB)." +msgstr[2] "" +"Najdeno je polje dolžine %u bajtov, največja dovoljena pa je 2<<26 bajtov " +"(64 MiB)." +msgstr[3] "" +"Najdeno je polje dolžine %u bajtov, največja dovoljena pa je 2<<26 bajtov " +"(64 MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Razčlenjena vrednost `%s' ni veljaven podpis vodila D-Bus" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Napaka med ločevanjem GVariant iz zaporedja z vrsto niza `%s' iz D-Bus žične " +"oblike " + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Neveljavna vrednost vrstnega reda zlogov. Pričakovana je vrednost 0x6c ('l') " +"ali 0x42 ('B'), najdena pa je vrednost 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" +"Neveljavna večja različica protokola. Pričakovana je 1, najdenih pa jih je " +"več (%d)" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"Glava podpisa s podpisom `%s' je najdena, vendar je telo sporočila prazno" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Razčlenjena vrednost `%s' ni veljaven podpis vodila D-Bus (za telo)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"V sporočilu ni glave podpisa, vendar je telo sporočila dolgo %u bajtov" +msgstr[1] "" +"V sporočilu ni glave podpisa, vendar je telo sporočila dolgo %u bajt" +msgstr[2] "" +"V sporočilu ni glave podpisa, vendar je telo sporočila dolgo %u bajta" +msgstr[3] "" +"V sporočilu ni glave podpisa, vendar je telo sporočila dolgo %u bajte" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Sporočila ni mogoče ločiti iz zaporedja:" + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Napaka pri združevanju GVariant v zaporedje z vrsto niza `%s' v D-Bus žično " +"obliko" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "Sporočilo ima %d opisnikov datoteke, polje glave pa jih določa %d" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Sporočila ni bilo mogoče združiti v zaporedje:" + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Telo sporočila ima podpis `%s', vendar v glavi ni podpisa" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Telo sporočila ima podpis vrste `%s', vendar je podpis v polju glave `%s' " + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Telo sporočila je prazno, vendar je v polju glave podpis `(%s)'" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Napaka vrnjena s telesom vrste `%s'" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Napaka vrnjena s praznim telesom" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Ni mogoče pridobiti strojnega profila: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Ni mogoče naložiti /var/lib/dbus/machine-id oziroma /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Napaka med klicanjem predmeta StartServiceByName za %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Nepričakovan odgovor %d iz načina StartServiceByName(\"%s\")" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Ni mogoče sklicati načina; posredniÅ¡ki strežnik za znano ime brez lastnika " +"je bil zgrajen z zastavico G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstraktni imenski prostor ni podprt" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Med ustvarjanjem strežnika ni mogoče določiti enkratne datoteke" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Napaka med zapisovanjem enkratne datoteke na `%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Niz `%s' ni veljaven D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Na nepodprtem načinu prenosa `%s' ni mogoče posluÅ¡ati" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "UKAZ" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Ukazi:\n" +" help Prikaže te podrobnosti\n" +" introspect Samo-preveri oddaljen predmet\n" +" monitor Nadzoruje oddaljen predmet\n" +" call Pokliči metodo nad oddaljenim predmetom\n" +" emit Oddaj signal\n" +"\n" +"Uporabite \"%s COMMAND --help\" za pomoč o posameznem ukazu.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Napaka: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Napaka med samopreverjanjem XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Poveži s sistemskim vodilom" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Poveži z vodilom seje" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Poveži s podanim naslovom vodila D-Bus" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Možnosti končnih točk povezave:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Možnosti, ki določajo končne točke povezave" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Ni določene končne točke povezave" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Določenih je več povezav končne točke" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Opozorilo: na osnovi podatkov samopregleda, vmesnik `%s' ne obstaja\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Opozorilo: na osnovi podatkov samopregleda, način `%s' ne obstaja na " +"vmesniku `%s'\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Izbirni cilj za signal (enoznačno ime)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Pot predmeta za oddajanje signala" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Ime signala in vmesnika" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Oddaj signal." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Napaka med povezovanjem: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Napaka: pot predmeta ni določena.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Napaka: %s ni veljavna pot predmeta\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Napaka: signal ni določen\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Napaka: signal mora imeti polno kvalificirano ime.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Napaka: %s ni veljavno ime vmesnika.\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Napaka: %s ni veljavno ime predmeta.\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Napaka: %s ni veljavno enoznačno ime vodila.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Napaka med razčlenjevanjem parametra %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Napaka med počiščenjem povezave: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Ime cilja za sklicanje načina" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Pot do predmeta za sklicanje načina" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Ime načina in vmesnika" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Časovni zamik v sekundah" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Skliči način na oddaljenem predmetu." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Napaka: cilj ni določen\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Napaka: pot predmeta ni določena\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Napaka: ime načina ni določeno\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Napaka: ime načina `%s' ni veljavno\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Napaka med razčlenjevanjem parametra %d vrste `%s': %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Samopreverjanje ciljnega imena" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Samopreverjanje poti predmeta" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Natisni XML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Samopreverjanje podrejenih predmetov" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Natisni le lastnosti" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Samopreverjanje oddaljenega predmeta." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Nadzor ciljnega imena" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Nadzor poti predmeta" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Nadzoruj oddaljeni predmet." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Neimenovano" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Namizna datoteka ne vsebuje določenega polja Exec" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Ni mogoče najti terminala, ki ga zahteva program" + +#: ../gio/gdesktopappinfo.c:1594 +#, 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:1598 +#, 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:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "Podatki programa so brez določila" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ni mogoče ustvariti uporabnikove datoteke namizja %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Določilo po meri za %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "pogon ne vključuje ukaza izvrzi ali izvrzi_z_dejanjem" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "pogon ne podpira preverjanja enote" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "pogon ne vključuje možnosti zagona" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "pogon ne vključuje možnosti zaustavitve" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Podpora TLS ni na voljo" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblem" + +#: ../gio/gemblemedicon.c:367 +#, 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:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblemedIcon" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Pričakovan GEmblem za GEmblemedIcon" + +#: ../gio/gfile.c:916 ../gio/gfile.c:1155 ../gio/gfile.c:1294 +#: ../gio/gfile.c:1534 ../gio/gfile.c:1589 ../gio/gfile.c:1647 +#: ../gio/gfile.c:1731 ../gio/gfile.c:1788 ../gio/gfile.c:1852 +#: ../gio/gfile.c:1907 ../gio/gfile.c:3459 ../gio/gfile.c:3514 +#: ../gio/gfile.c:3660 ../gio/gfile.c:3702 ../gio/gfile.c:4104 +#: ../gio/gfile.c:4516 ../gio/gfile.c:4601 ../gio/gfile.c:4691 +#: ../gio/gfile.c:4788 ../gio/gfile.c:4875 ../gio/gfile.c:4976 +#: ../gio/gfile.c:5249 ../gio/gfile.c:5527 ../gio/gfile.c:5581 +#: ../gio/gfile.c:7126 ../gio/gfile.c:7216 ../gio/gfile.c:7300 +#: ../gio/win32/gwinhttpfile.c:439 +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:1418 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Obstoječa enota ne obstaja" + +#: ../gio/gfile.c:2473 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Ni mogoče kopirati preko mape" + +#: ../gio/gfile.c:2533 +msgid "Can't copy directory over directory" +msgstr "Ni mogoče kopirati mape preko mape" + +#: ../gio/gfile.c:2541 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Ciljna datoteka obstaja" + +#: ../gio/gfile.c:2560 +msgid "Can't recursively copy directory" +msgstr "Ni mogoče kopirati drevesne zgradbe map" + +#: ../gio/gfile.c:2824 +msgid "Splice not supported" +msgstr "Splice ni podprt" + +#: ../gio/gfile.c:2828 +#, c-format +msgid "Error splicing file: %s" +msgstr "Napaka med prepletanjem datoteke: %s" + +#: ../gio/gfile.c:2951 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "" +"Kopiranje (sklic povezave/kloniranje) med različnimi priklopi ni podprto" + +#: ../gio/gfile.c:2955 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto ali pa ni veljavno" + +#: ../gio/gfile.c:2960 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto ali pa ni delovalo" + +#: ../gio/gfile.c:3020 +msgid "Can't copy special file" +msgstr "Ni mogoče kopirati posebne datoteke" + +#: ../gio/gfile.c:3650 +msgid "Invalid symlink value given" +msgstr "Neveljavna vrednost simbolne povezave" + +#: ../gio/gfile.c:3810 +msgid "Trash not supported" +msgstr "Smeti niso podprte" + +#: ../gio/gfile.c:3861 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Ni mogoče uporabiti '%c' v imenu datoteke" + +#: ../gio/gfile.c:6249 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "enota ne podpira priklopa" + +#: ../gio/gfile.c:6358 +msgid "No application is registered as handling this file" +msgstr "Na voljo ni programa z a upravljanje s to datoteko" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Å tevilčnik je zaprt" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Å tevilčnik izvaja izredno dejanje" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Pretok ne podpira query_info" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Iskanje po pretoku ni podprto" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Razčlenitev ni dovoljena na dovodnem pretoku" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Razčlenitev ni podprta na pretoku" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Napačno Å¡tevilo znakov (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ni določenega imena razreda %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Vrsta %s ne vstavlja vmesnika GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Vrste %s ni uvrščena v razred" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Nepravilno oblikovana Å¡tevilka različice: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Ni mogoče ravnati z navedeno različico kodiranja ikone" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Naslov ni naveden" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Dolžina %u je predolga za naslov" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Naslov ima določene bite prek dolžine predpone" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Ni mogoče razčleniti '%s' kot maske naslova IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Ni dovolj prostora za naslov vtiča" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nepodprti naslov vtiča" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Pretok izvaja izredno dejanje" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Predmet <%s> ni dovoljen znotraj predmeta <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Predmet <%s> ni dovoljen na vrhnji ravni" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Datoteka %s se v viru pojavi večkrat" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "'%s' ni mogoče najti v nobeni mapi virov" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "'%s' ni mogoče najti v trenutni mapi" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Neznana možnost obdelovanja \"%s\"" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Ustvarjanje začasne datoteke je spodletelo: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Napaka pri obdelavi dovodne datoteke z xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Napaka pri obdelovanju dovodne datoteke z to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Napaka med branjem datoteke %s: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Napaka med stiskanjem datoteke %s" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "besedilo se ne sme pojaviti znotraj <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "ime izhodne datoteke" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "DATOTEKA" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Mape, iz katerih naj bodo brane datoteke (privzeto je to trenutna mapa)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "MAPA" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Ustvari odvod v obliki, izbrani s pripono imena ciljne datoteke" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Ustvari glavo vira" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Ustvari izvorno kodo za povezavo datoteke virov z vaÅ¡o kodo" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Ustvari seznam odvisnosti." + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Vira ne ustvari in ne vpiÅ¡i samodejno" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Ne izvozi funkcij; te je treba deklarirati v G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Določilo imena jezika C za ustvarjanje izvorne kode" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kodno prevedi določilo vira v datoteko vira.\n" +"Datoteke določil vira imajo pripone .gresource.xml,\n" +"datoteke vira pa pripono .gresource." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Podati je treba natanko eno ime datoteke\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "prazna imena niso dovoljena" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "neveljavno ime '%s': imena se morajo začeti z malo črko" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"Neveljavno ime '%s': neveljaven znak '%c'; dovoljene so samo male črke, " +"Å¡tevilke in vezaj ('-')." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "Neveljavno ime '%s': zaporedna vezaja ('--') nista dovoljena." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "Neveljavno ime '%s': zadnji znak ne sme biti vezaj ('-')." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "neveljavno ime '%s': največja dolžina je 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " je že določeno" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ključev ni mogoče dodati shemi 'list-of'" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " je že določeno" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" sence v ; za spreminjanje " +"vrednosti uporabite " + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"natančno eden izmed 'type', 'enum' ali 'flags' mora biti določen kot " +"lastnost " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (Å¡e) ni določen." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Neveljavena vrsta niza GVariant '%s'" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " je podan, vendar shema ne razÅ¡irja ničesar" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr " za prepis ni na voljo" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " je že določeno" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " je že določeno" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " razÅ¡irja Å¡e neobstoječo shemo '%s'" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " je seznam Å¡e neobstoječe sheme '%s'" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Seznam sheme s potjo ni mogoč" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Sheme ni mogoče razÅ¡iriti s potjo" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " je seznam, ki razÅ¡irja , ki ni seznam" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" razÅ¡irja vendar " +"'%s' ne razÅ¡irja '%s'" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "pot, če je podana, se mora začeti in končati s poÅ¡evnico" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "pot seznama se mora končati z ':/'" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> je že določeno" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Predmet <%s> na vrhnji ravni ni dovoljen" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict je določen, končanje.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Celotna datoteka je prezrta.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Datoteka je prezrta.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Ključ `%s' v shemi `%s' kot je določen v datoteki prepisa `%s' ne obstaja" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; prepis za ta ključ je prezrt.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " in --strict sta določena, končanje.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"napaka razčlenjevanja ključa `%s' v shemi `%s', kot je določeno v datoteki " +"prepisa `%s': %s. " + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Prepis za ta ključ je prezrt.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"prepis za ključ `%s' v shemi `%s' v datoteki prepisa `%s' ni v obsegu, " +"podanem v shemi" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"prepis za ključ `%s' v shemi `%s' v datoteki prepisa `%s' ni v seznamu " +"veljavnih možnosti" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "kje naj se shrani datoteka gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Prekini ob vsakrÅ¡nji napaki v shemi" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Ne zapiÅ¡i datoteke gschema.compiled" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Ne vsili omejitev imena ključa" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kodno prevedi vse datoteke shem GSetting v predpomnilnik.\n" +"sheme. Datoteke shem morajo imeti pripono .gschema.xml,\n" +"datoteka predpomnilnika pa se imenuje gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Podati je treba natanko eno ime mape\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Datotek sheme ni mogoče najti:" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "je brez dela.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "odstranjena obstoječa odvodna datoteka.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Ni mogoče najti privzete vrste nadzora mape" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Neveljavno ime datoteke %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Napaka med branjem podrobnosti datotečnega sistema: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Ni mogoče preimenovati skrbniÅ¡ke mape" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Napaka med preimenovanjem datoteke: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Ni mogoče preimenovati datoteke, izbrano ime že obstaja" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Neveljavno ime datoteke" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Ni mogoče odpreti mape" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Napaka med odpiranjem datoteke: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Napaka med odstranjevanjem datoteke: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Napaka ob premikanjem datoteke v smeti: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ni mogoče ustvariti mape smeti %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Ni mogoče najti vrhnje ravni smeti" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Ni mogoče najti ali ustvariti mape smeti" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Ni mogoče ustvariti datoteke podrobnosti: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ni mogoče premakniti datoteke v smeti: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "notranja napaka" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Napaka med ustvarjanjem mape: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Datotečni sistem ne podpira simbolnih povezav" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Napaka med ustvarjanjem simbolne povezave: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Napaka med premikanjem datoteke: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Ni mogoče premakniti mape čez mapo" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Ustvarjanje varnostne kopije je spodletelo." + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Napaka med odstranjevanjem ciljne datoteke: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Premikanje med priklopi ni podprto" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Vrednost atributa ni mogoče določiti kot NULL" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Neveljavna vrsta atributa (pričakovan niz)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Neveljavno razÅ¡irjeno ime atributa" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Napaka med določanjem razÅ¡irjenega atributa '%s': %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (neveljavni nabor znakov)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Napaka med pridobivanjem podatkov za datoteko '%s': %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Napaka med potrjevanjem opisovalnika datoteke: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Neveljavna vrsta atributa (pričakovan uint32)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Neveljavna vrsta atributa (pričakovan uint64)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Neveljavna vrsta atributa (pričakovan bitni niz)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "Ni mogoče določiti dovoljenj simbolnih povezav" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Napaka med določanjem dovoljenj: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "Napaka med določanjem lastnika: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "Simbolna povezava ne sme biti določena kot NULL" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Napaka med določanjem simbolne povezave: %s" + +#: ../gio/glocalfileinfo.c:2230 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"Napaka med določevanjem simbolne povezave; datoteka ni simbolna povezava" + +#: ../gio/glocalfileinfo.c:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Napaka med določanjem sprememb ali časa dostopa: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "SELinux atributa ni mogoče določiti kot NULL" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Napaka nastavitve vsebine SELinux: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "Na tem sistemu SELinux ni omogočen" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Določanje atributa %s ni podprto" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Napaka med branjem iz datoteke: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Napaka med iskanjem v datoteki: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Napaka med zapiranjem datoteke: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Ni mogoče najti privzete krajevne datoteke nadzora" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Napaka med pisanjem v datoteko: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Napaka med odstranjevanjem stare varnostne povezave: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Napaka med ustvarjanjem varnostne kopije: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Napaka med preimenovanjem začasne datoteke: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Napaka med obrezovanjem datoteke: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Napaka med odpiranjem datoteke '%s': %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Ciljna datoteka je mapa" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Ciljna datoteka ni običajna datoteka" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Datoteka je bila zunanje spremenjena" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Napaka med odstranjevanjem datoteke: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Privzet neveljaven GSeekType" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Neveljavna zahteva iskanja" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ni mogoče razčleniti GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Odvoda pretoka pomnilnika ni mogoče razÅ¡iriti" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "RazÅ¡irjanje pretoka odvoda pomnilnika je spodletelo." + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Zahtevano iskanje pred začetkom pretoka" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "priklop ne podpira usklajevanja ugibanja vsebine vrste" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Ime gostitelja '%s' vsebuje '[' vendar ne tudi ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Omrežje ni dosegljivo" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Gostitelj ni dosegljiv" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Ni mogoče ustvariti nadzornika omrežja: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Ni mogoče ustvariti nadzornika omrežja:" + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Ni mogoče pridobiti stanja omrežja:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Odvodni pretok ne podpira pisanja" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Izvorni pretok je že zaprt" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Vir '%s' ne obstaja" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Vira '%s' ni mogoče razÅ¡iriti" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "VIr '%s' ni mapa" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Vhodni pretok ne podpira iskanja" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "IzpiÅ¡i pomoč" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[UKAZ]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "IzpiÅ¡i seznam odsekov, ki vsebujejo vire v DATOTEKI elf" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"IzpiÅ¡i seznam virov\n" +"Če je ODSEK podan, izpiÅ¡i le vire iz tega odseka\n" +"Če je podana POT, izpiÅ¡i le skladne vire" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "DATOTEKA [POT]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "ODSEK" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"IzpiÅ¡i seznam virov s podrobnostmi\n" +"Če je ODSEK podan, izpiÅ¡i le vire iz tega odseka\n" +"Če je podana POT, izpiÅ¡i le ujemajoče vire\n" +"Podrobnosti vsebujejo odsek, velikost in stiskanje" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "RazÅ¡iri datoteko vira na standardni odvod" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "DATOTEKA POT" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Neznan ukaz %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uporaba:\n" +" gresource [--section ODSEK] UKAZ [ARGUMENTI ...]\n" +"\n" +"Ukazi:\n" +" help IzpiÅ¡i to besedilo\n" +" sections IzpiÅ¡i odseke vira\n" +" list IzpiÅ¡i vire\n" +" details IzpiÅ¡i vire s podrobnostmi\n" +" extract Izlušči vir\n" +"\n" +"Z ukazom 'gresource help UKAZ' pridobite podrobno pomoč.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uporaba:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumenti:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " ODSEK Ime (izbirno) izbora elf\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " UKAZ Ukaz (izbirno) za razlago\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " DATOTEKA Datoteka elf (dvojiÅ¡ka ali skupna knjižnica)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" DATOTEKA Datoteka elf (dvojiÅ¡ka ali skupna knjižnica)\n" +" ali prevedena datoteka vira\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[POT]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " POT Dodatna (neobvezna) pot vira (lahko je delna)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "POT" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " POT Pot vira\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Shema '%s' ne obstaja.\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Shema '%s' ni dodeljiva (pot ne sme biti določena)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Shema '%s' je dodeljiva (pot mora biti določena)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Pot ni podana.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Zapis poti se mora začeti s poÅ¡evnico (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Zapis poti se mora končati s poÅ¡evnico (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Pot ne sme vsebovati dveh zaporednih poÅ¡evnic (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ključ '%s' ne obstaja.\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Ponujena vrednost je izven veljavnega območja\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "IzpiÅ¡i nameščene (nedodeljive) sheme" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Seznam naloženih dodeljivih SHEM" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "IzpiÅ¡i seznam ključev SHEME" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SHEMA[:POT]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "IzpiÅ¡i seznam podrejenih predmetov SHEME" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Rekurzivno izpiÅ¡i ključe in vrednosti,\n" +"če ni podanana SHEMA, pa izpiÅ¡i vse ključe\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SHEMA[:POT]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Pridobi vrednost KLJUČA" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SHEMA[:POT] KLJUČ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Poizvej območje veljavnih vrednosti KLJUČA" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Nastavi vrednosti KLJUČA na VREDNOST" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SHEMA[:POT] KLJUČ VREDNOST" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Ponastavi KLJUČ na privzeto vrednost" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Ponastavi vse ključe SHEME na privzete vrednosti" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Preveri ali je KLJUČ zapisljiv" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Nadzoruj KLJUČ za spremembe.\n" +"V kolikor KLJUČ ni določen, nadzoruj vse ključe SHEME.\n" +"Pritisni ^C za zaustavitev nadzora.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SHEMA[:POT] [KLJUČ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Uporaba:\n" +" gsettings [--schemadir MAPASHEM] UKAZ [ARGUMENTI ...]\n" +"\n" +"Ukazi:\n" +" help Pokaži to pomoč\n" +" list-schemas IzpiÅ¡i seznam nameščenih shem\n" +" list-relocatable-schemas IzpiÅ¡i seznam dodeljivih shem\n" +" list-keys IzpiÅ¡i seznam ključev v shemi\n" +" list-children IzpiÅ¡i seznam podrejenih shem\n" +" list-recursively Rekurzivno izpiÅ¡i seznam ključev in vrednosti\n" +" range Izvede poizvedbo območja ključa\n" +" get Pridobi vrednost ključa\n" +" set Določi vrednost ključa\n" +" reset Počisti vrednost ključa\n" +" reset-recursively Počisti vse vrednosti v podani shemi\n" +" writable Preveri ali je ključ zapisljiv\n" +" monitor Nadzira spremembe\n" +"\n" +"Z ukazom 'gsettings help UKAZ' se izpiÅ¡e podrobna pomoč.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Uporaba:\n" +" gsettings [--schemadir MAPASHEM] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " MAPASHEM Mapa za iskanje dodatnih shem\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SHEMA Ime sheme\n" +" POT Pot do dodeljive sheme\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KLJUČ Ključ (izbirno) znotraj sheme\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KLJUČ Ključ znotraj sheme\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VREDNOST Vrednost za nastavitev\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Ni podanega imena sheme.\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Neveljaven vtič, ni zagnano" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neveljaven vtič, zaganjanje je spodletelo: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Vtič je že zaprt" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Vtič V/I naprave je časovno potekel" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ustvarjanje GSocet preko fd: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ni mogoče ustvariti vtiča: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Določena je neznana družina" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Določen je neznan protokol" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "ni mogoče pridobiti krajevnega naslova: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "ni mogoče pridobiti oddaljenega naslova: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "ni mogoče slediti: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "Napaka vezanjem na naslov: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Napaka povezovanja v skupino za večsmerno oddajanje: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Napaka zapuščanja skupine za večsmerno oddajanje: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Ni podpore za večsmerno oddajanje lastno viru" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Napaka med sprejemanjem povezave: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Povezava v teku" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Ni mogoče pridobiti uvrščene napake:" + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Napaka med prejemanjem podatkov: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Napaka med poÅ¡iljanjem podatkov: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Ni mogoče izklopiti vtiča: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Napaka med zapiranjem vtiča: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čakanje na stanje vtiča: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Napaka med poÅ¡iljanjem sporočila: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Predmet GSocketControlMessage na sistemih Windows ni podprt" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Napaka med prejemanjem sporočila: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ni mogoče pridobiti uvrščene napake: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "Operacijski sistem ne podpira možnosti g_socket_get_credentials" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Ni se mogoče povezati s posredniÅ¡kim strežnikom %s:" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Ni se mogoče povezati s strežnikom %s:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Ni se mogoče povezati:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Neznana napaka med povezovanjem" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Posredovanje preko ne-TCP povezave ni podprto." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokol posredniÅ¡ki strežnika '%s' ni podprt." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "PosluÅ¡alnik je že zaprt" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Dodan vtič je zaprt" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 nima podpore za naslove IPv6 '%s'" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "UporabniÅ¡ko ime je predolgo za protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Ime gostitelja '%s' je predolgo za protokol SOCKSv4" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Strežnik ni SOCKSv4 posredniÅ¡ki strežnik." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Povezava preko posredniÅ¡kega strežnika SOCKSv4 je zavrnjena." + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Strežnik ni SOCKSv5 posredniÅ¡ki strežnik." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "PosredniÅ¡ki strežnik SOCKSv5 zahteva overitev." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 zahteva overitveni način, ki ni podprt v GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "UporabniÅ¡ko ime ali geslo za protokol SOCKSv5 je predolgo." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Overitev strežnika SOCKSv5 je spodletela zaradi napačno vnesenega " +"uporabniÅ¡kega imena ali gesla." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Ime gostitelja '%s' je predolgo za protokol SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "PosredniÅ¡ki strežnik SOCKSv5 uporablja neznano vrsto naslova." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Notranja napaka posredniÅ¡kega strežnika SOCKSv5" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Nabor pravil ne dovoljuje SOCKSv5 povezave" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Gostitelj ni dosegljiv preko strežnika SOCKSv5" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Skozi SOCKSv5 posredniÅ¡ki strežnik ni mogoče doseči omrežja." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Povezava skozi posredniÅ¡ki strežnik SOCKSv5 je zavrnjena." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 posredniÅ¡ki strežnik ne podpira ukaza 'connect'." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 posredniÅ¡ki strežnik ne podpira ponujene vrste naslova" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Neznana napaka posredniÅ¡kega strežnika SOCKSv5." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ni mogoče upravljati z različico %d kodiranja GThemedIcon" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Napaka med razreÅ¡evanjem '%s': %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Napaka med obratnim razreÅ¡evanjem '%s': %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Ni zapisa DNS za zahtevano vrsto '%s'" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "začasno ni mogoče razreÅ¡iti '%s'" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Napaka med razreÅ¡evanjem '%s'" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Ni mogoče odÅ¡ifrirati s protokolom PEM Å¡ifriranega osebnega ključa" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Potrdila kodiranega s protokolom PEM ni mogoče najti." + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Ni mogoče razčleniti s protokolom PEM kodiranega zasebnega ključa." + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Potrdila kodiranega s protokolom PEM ni mogoče najti." + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Ni mogoče razčleniti s protokolom PEM kodiranega potrdila." + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"To je zadnja priložnost za pravilen vnos gesla preden se dostop zaklene." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Več poskusov vnosa gesla je bilo neuspeÅ¡nih, zato bo dostop ob nadaljnjih " +"napakah zaklenjen." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Vneseno geslo je nepravilno." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Pričakovano eno nadzorno sporočilo, prejetih %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Nepričakovana vrsta dodatnih podatkov" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Pričakovan en fd, pridobljenih %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Prejet neveljaven fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Napaka med poÅ¡iljanjem poveril:" + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Napaka med preverjanjem ali je predmet O_PASSCRED omogočen za vtič: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Napaka omogočanja predmeta SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Pri prejemanju poveril je pričakovano branje enega bajta, vendar se je " +"prebralo nič bajtov" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Nadzorno sporočilo ni pričakovano, vendar pa je prejeto %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Napaka med onemogočanjem SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Napaka med branjem iz opisovalnika datoteke: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Napaka med zapiranjem opisovalnika datoteke: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Koren datotečnega sistema" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Napaka med pisanjem v opisovalnik datoteke: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Abstraktni naslovi vtiča domene UNIX na tem sistemu niso podprti" + +#: ../gio/gvolume.c:439 +msgid "volume doesn't implement eject" +msgstr "nosilca 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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "nosilec ne prepozna ukaza izvrzi ali izvrzi_z_dejanjem" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ni mogoče najti programa" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Napaka med zaganjanjem programa: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "naslovi URI niso podprti" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "Spreminjanje asociativnih povezav ni podprto na win32 sistemih" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Ustvarjanje asociativnih povezav ni podprto na win32 sistemih" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Napaka branja iz ročnika: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Napaka med zapiranjem ročnika: %s." + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Napaka pisanja v ročnik: %s." + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Ni dovolj pomnilnika" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Notranja napaka: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Zahteva več vhoda" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Neveljavni stisnjeni podatki" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Naslov za prisluh" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Prezrto zaradi skladnosti z GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Natisni naslov" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Natisni naslov v načinu lupine" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Zaženi storitev DBus" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Napačni argumenti\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Nepričakovan atribut '%s' za predmet '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributa '%s' predmeta '%s' ni mogoče najti" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Nepričakovana oznaka '%s'. Pričakovana je '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Nepričakovana oznaka '%s' znotraj '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "Ni veljavne datoteke zaznamkov v podatkovnih mapah" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Zaznamek za URI '%s' že obstaja" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Ni veljavnega zaznamka za URI '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, 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:2462 +#, 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:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "V zaznamku za URI '%s' ni nastavljenih skupin" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "RazÅ¡irjanje ukazne vrstice '%s' z URI '%s' je spodletelo." + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Nedokončano zaporedje znakov na koncu vhoda" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ni mogoče pretvoriti '%s' v nabor znakov '%s'" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Naslov URI '%s' pri uporabi \"datotečne\" sheme ni absoluten" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "V naslovu URI krajevne datoteke '%s' ni mogoče uporabiti '#'" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Naslov URI '%s' je neveljaven" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime gostitelja naslova URI '%s' ni veljavno" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Naslov URI '%s' vsebuje neveljavne ubežne znake" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Pot '%s' ni absolutna pot" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Neveljavno ime gostitelja" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "dop" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "pop" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a, %e. %b %Y %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "januar" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "februar" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "marec" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "april" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "junij" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "julij" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "avgust" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "september" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "november" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "december" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "avg" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "ponedeljek" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "torek" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "sreda" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "četrtek" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "petek" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "sobota" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "nedeljo" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "pon" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "tor" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "sre" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "čet" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "pet" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sob" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ned" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Napaka med odpiranjem imenika '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Ni mogoče dodeliti %lu bajtov za branje datoteke \"%s\"" +msgstr[1] "Ni mogoče dodeliti %lu bajta za branje datoteke \"%s\"" +msgstr[2] "Ni mogoče dodeliti %lu bajtov za branje datoteke \"%s\"" +msgstr[3] "Ni mogoče dodeliti %lu bajtov za branje datoteke \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Napaka med branjem datoteke '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datoteka \"%s\" je prevelika." + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Branje datoteke '%s' je spodletelo: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Odpiranje datoteke '%s' je spodletelo: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "" +"Pridobivanje atributov datoteke '%s' je spodletelo: ukaz fstat() ni uspeÅ¡no " +"izveden: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Ni mogoče odpreti datoteke '%s': fdopen() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:993 +#, 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 uspeÅ¡no izveden: " +"%s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ni mogoče ustvariti datoteke '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"Ni mogoče odpreti datoteke '%s' za pisanje: fdopen() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fwrite() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fflush() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Ni mogoče zapisati datoteke '%s': fsync() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Ni mogoče zapreti datoteke '%s': fclose() ni uspeÅ¡no izveden: %s" + +#: ../glib/gfileutils.c:1282 +#, 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 uspeÅ¡no izveden: " +"%s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Predloga '%s' je neveljavna, saj ne sme vsebovati '%s'" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Predloga '%s' ne vsebuje XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Ni mogoče prebrati simbolne povezave '%s': %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Simbolne povezave niso podprte" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +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:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Preostanek nepretvorjenih podatkov v bralnem medpomnilniku" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanal je prekinjen v delnem znaku" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "Veljavnega ključa v iskanih mapah ni mogoče najti" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Ni običajna datoteka" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neveljavno ime skupine: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Datoteka s ključem se ne začne s skupino" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neveljavno ime ključa: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka s ključem vsebuje nepodprto kodiranje '%s'" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka s ključem ni del skupine '%s'" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka s ključem nima ključa '%s'" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a 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:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"Ključ '%s' v skupini '%s' ima vrednost '%s', pričakovana pa je vrednost %s." + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +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:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka ključa vsebuje neveljavno ubežno zaporedje '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vrednosti '%s' ni mogoče obravnavati kot Å¡tevilo." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "CeloÅ¡tevilska vrednost '%s' izven obsega" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vrednosti '%s' ni mogoče obravnavati kot logično Boolovo vrednost." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"Ni mogoče pridobiti atributov datoteke '%s%s%s%s': ukaz fstat() je " +"spodletel: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Ni mogoče preslikati %s%s%s%s: ukaz mmap() nje spodletel: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ni mogoče odpreti datoteke '%s': open() ni uspeÅ¡no izveden: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Napaka v vrstici %d, znak %d:" + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "'%s' ni veljavno ime" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' ni veljavno ime: '%c'" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Napaka v vrstici %d: %s" + +#: ../glib/gmarkup.c:682 +#, 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 določati Å¡tevilko znotraj sklica " +"znaka (na primer ê) - morda je Å¡tevilka prevelika" + +#: ../glib/gmarkup.c:694 +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 "" +"Sklic znaka se ni končal s podpičjem; najverjetneje je uporabljen znak '&' " +"brez povezave z entiteto - znak '&' mora biti zapisan kot '&'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Sklic znaka '%-.*s' ne kodira dovoljenega znaka" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Zaznana prazna entiteta '&;'; veljavne entitete so: & " < > " +"'" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Neznano ime entitete '%-.*s'" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument se mora začeti z predmetom (na primer )" + +#: ../glib/gmarkup.c:1159 +#, 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 " +"predmeta" + +#: ../glib/gmarkup.c:1227 +#, 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:1311 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Nenavaden znak '%s'. Za imenom atributa '%s' (predmeta '%s') je pričakovan " +"znak '='." + +#: ../glib/gmarkup.c:1352 +#, 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 " +"predmeta '%s' ali atribut; morda je uporabljen neveljaven znak v imenu " +"atributa" + +#: ../glib/gmarkup.c:1396 +#, 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' predmeta '%s'." + +#: ../glib/gmarkup.c:1529 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Znak '%s' ni veljaven, kadar sledi zaprtju imena predmeta '%s'; dovoljen " +"znak je '>'" + +#: ../glib/gmarkup.c:1576 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Predmet '%s' je zaprt, trenutno ni odprtega predmeta" + +#: ../glib/gmarkup.c:1585 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Predmet '%s' je zaprt, Å¡e vedno pa je odprt predmet '%s'" + +#: ../glib/gmarkup.c:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prazen ali pa vsebuje le presledne znake" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokument nepričakovano zaključen takoj za odprtjem predmeta '<'" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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 predmeti - '%s' je zadnji " +"odprt predmet" + +#: ../glib/gmarkup.c:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument nepričakovano zaključen sredi imena predmeta" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument nepričakovano zaključen sredi imena atributa" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument nepričakovano zaključen sredi oznake za odprtje predmeta." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument nepričakovano zaključen sredi vrednosti atributa" + +#: ../glib/gmarkup.c:1829 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Dokument nepričakovano zaključen sredi oznake zaprtja predmeta '%s'" + +#: ../glib/gmarkup.c:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument nepričakovano zaključen sredi opombe ali ukaza" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Uporaba:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[MOŽNOST ...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Možnosti pomoči:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Pokaži možnosti pomoči" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Pokaži vse možnosti pomoči" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Možnosti programa:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, 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:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "CeloÅ¡tevilska vrednost '%s' za %s izven obsega" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Ni mogoče razčleniti dvojne vrednosti '%s' za %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Vrednost dvojne velikosti '%s' za %s izven obsega" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Napaka med razčlenjevanjem %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Manjka argument za %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Neznana možnost %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "pokvarjen predmet" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "notranja napaka ali pokvarjen predmet" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "primanjkuje pomnilnika" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "dosežena omejitev sledenja nazaj" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "vzorec vsebuje predmete, ki niso podprti za delno iskanje zadetkov" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "predhodne povezave, kot pogoji, niso podprti za delno primerjavo" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "dosežena omejitev globine drevesne ravni" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "nepravilna sestava zastavic nove vrstice" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "slab odmik" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "kratki utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "rekurzivna zanka" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "neznana napaka" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ na koncu vzorca" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c na koncu vzorca" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "neprepoznan znak sledi \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "Å¡tevilke niso zapisane pravilno v {} količilniku" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "Å¡tevilke so prevelike v {} količilniku" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "manjkajoč zaključni znak ] za znakovni razred" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "neveljavno ubežno zaporedje v znakovnem razredu" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "nepravilen obseg v znakovnem razredu" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "ni mogoče ponoviti" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "nepričakovana ponovitev" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "neprepoznan znak za (? ali (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX razredi so podprti le znotraj razreda" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "manjka zaključujoči )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "povezava na neobstoječ podrejen vzorec" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "manjka ) po opombi" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "logični izraz je preobsežen" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "napaka med pridobivanjem pomnilnika" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") brez odpirajočega (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "prekoračitev kode" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "neprepoznan znak za (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "povratna trditev ni določene dolžine" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "nepravilno oblikovano ime ali Å¡tevilka za (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "pogojna skupina vsebuje več kot dve veji" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "trditev pričakovana za (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ali (?[+-] Å¡tevilom mora slediti )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "neznano POSIX ime razreda" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX zbirni predmeti niso podprti" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "znakovna vrednost v zaporedju \\x{...} je predolga" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "neveljaven pogoj (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ni dovoljen v povratnih trditvah" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "ubežna zaporedja \\L, \\l, \\N{name}, \\U in \\u niso podprta" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "drevesni klic opravila se lahko izvaja v neskončnost" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "neprepoznan znak za (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "manjkajoč zaključni znak v imenu podrejenega vzorca" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dva imenovana podrejena vzorca imata enako ime" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "nepravilno oblikovano \\P ali \\p zaporedje" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "neznano ime lastnosti za \\P ali \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ime podrejenega vzorca je predolgo (največ 32 znakov)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "preveč imenovanih podrejenih vzorcev (največ 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "osmiÅ¡ka vrednost je večja kot \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "pretečena delovna povrÅ¡ina prevajanja kode" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "predhodno preverjene povezave podrejenega vzorca ni mogoče najti" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE skupina vsebuje več kot eno vejo" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "nepopolna NEWLINE možnost" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g ne sledi ime oz. Å¡tevilo v oklepajih, oglatih oklepajih ali narekovajih, " +"niti navadno Å¡tevilo" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "oÅ¡tevilčen sklic ne sme biti ničeln" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "argument ni dovoljen za (*ACCEPT), (*FAIL) ali (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) ni prepoznan" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "Å¡tevilka je prevelika" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "manjkajoče ime podrejenega vzorca po (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "pričakovana Å¡tevka po " + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] je neveljaven podatkovni znak v združljivostnem načinu JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "različna imena podrejenih vzorcev z isto Å¡tevilko niso dovoljena" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) mora obvezno imeti argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c mora slediti znak ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k ne sledi ime v oklepajih, oglatih oklepajih ali narekovajih" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N ni podprto v razredu" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "preveč sklicev s preskokom" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "ime je predolgo v (*MARK), (*PRUNE), (*SKIP) ali (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "znakovna vrednost v zaporedju \\u.... je predolga" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Napaka med primerjanjem logičnega izraza %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Knjižnica PCRE je pretvorjena brez UTF-8 podpore" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Knjižnica PCRE je pretvorjena brez lastnosti UTF-8 podpore" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Knjižnica PCRE je prevedena brez možnosti nezdružljivosti" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Napaka med prilagajanjem logičnega izraza %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "Å¡estnajstiÅ¡ko Å¡tevilo ali pa pričakovan '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "pričakovano Å¡estnajstiÅ¡ko Å¡tevilo" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "manjkajoč znak '<' v simbolni povezavi" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "nedokončana simbolna povezava" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "simbolna povezava nične dolžine" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "pričakovano Å¡tevilo" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "neveljavna simbolna povezava" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "obidi končna '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "neznano ubežno zaporedje" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Navedeno besedilo se ne začne z narekovajem" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "V ukazni vrstici ali v navedenem besedilu manjka končni narekovaj" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Besedilo končano takoj po znaku '\\'. (Besedilo je '%s')" + +#: ../glib/gshell.c:581 +#, 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 '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Besedilo je bilo prazno (ali pa vsebuje le presledne znake)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Ni mogoče prebrati podatkov podrejenega procesa (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Nepričakovana napaka branja podatkov v opravilu select() podrejenega " +"opravila (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Podrejeni proces se je zaključil s kodo %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Podrejeni proces je uničen s signalom %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Podrejeni proces se je ustavil s signalom %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Podrejeni proces se je zaključil nenaravno" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Ni mogoče prebrati iz cevi podrejenega procesa (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Ni mogoča razvejitev (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Ni mogoče spremeniti v mapo '%s' (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Ni mogoče izvesti podrejenega procesa \"%s\" (%s)" + +#: ../glib/gspawn.c:1522 +#, 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:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Ni mogoče razvejiti podrejenega procesa (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Neznana napaka med izvajanjem podrejenega procesa \"%s\"" + +#: ../glib/gspawn.c:1563 +#, 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/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Ni mogoče ustvariti cevi za stik z opravilom podrejenega predmeta (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Ni mogoče prebrati podatkov iz opravila podrejenega predmeta" + +#: ../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 opravila (%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:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Neveljaven niz okolja: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Neveljavna delovna mapa: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Napaka med izvajanjem pomožnega programa (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Znak izven območja za UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Neveljavno zaporedje na vhodu pretvorbe" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Znak izven območja za UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, 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/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajtov" +msgstr[1] "%s bajt" +msgstr[2] "%s bajta" +msgstr[3] "%s bajti" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "Prejeti nepopolni podatki za '%s'" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "Nepričakovana dolžina možnosti pri preverjanju, če je za vtič SO_PASSCRED " +#~ "omogočen. Pričakovanih %d bajtov, dobljenih %d" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "Nepričakovana napaka v waitpid() (%s)" diff --git a/po/sq.po b/po/sq.po new file mode 100644 index 0000000..8a795b1 --- /dev/null +++ b/po/sq.po @@ -0,0 +1,4294 @@ +# Përkthimi i mesazheve të glib në shqip +# Copyright (C) 2003-2008 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# Laurent Dhima , 2003-2008. +msgid "" +msgstr "" +"Project-Id-Version: glib HEAD\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2008-08-18 10:19+0200\n" +"Last-Translator: Laurent Dhima \n" +"Language-Team: albanian \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Atribut i papritur '%s' për elementin '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Atributi '%s' i elementit '%s' nuk u gjet" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Tag '%s' i papritur, pritej tag '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Tag '%s' i papritur në brendësi të '%s'" + +#: ../glib/gbookmarkfile.c:1834 +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:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Një libërshënim për URI '%s' ekziston rregullisht" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nuk u gjet asnjë libërshënim për URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, 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:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "E pamundur hapja e konvertuesit nga '%s' në '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Sekuencë byte e pavlefshme tek të dhënat për konvertim" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Gabim gjatë konvertimit: %s" + +# (pofilter) doublewords: The word 'të' is repeated +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +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:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "I pamundur konvertimi i '%s' në familjen e simboleve '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' është e pasaktë" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Emri i host të URI '%s' është i pasaktë" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' përmban simbole escape të pavlefshëm" + +#: ../glib/gconvert.c:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "Emër host i pasaktë" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "PD" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "MD" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y-%b-%d %I.%M.%S.%p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%Y-%b-%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I.%M.%S. %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I.%M.%S.%p %Z" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "janar" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "shkurt" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "mars" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "prill" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "maj" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "qershor" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "korrik" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Shk" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Pri" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Qer" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Kor" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "e hënë " + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "e martë " + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "e mërkurë " + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "e enjte " + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "e premte " + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "e shtunë" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "e diel " + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Hën " + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar " + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Mër " + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Enj " + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pre " + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sht" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Die " + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Gabim gjatë hapjes së directory '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "File \"%s\" është tepër i madh" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "I pamundur leximi nga file '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "E pamundur hapja e file '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Dështoi krijimi i file '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, 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:1425 +#, 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:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, 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:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, fuzzy, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, fuzzy, c-format +msgid "%.1f PB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, fuzzy, c-format +msgid "%.1f EB" +msgstr "%.1f KB" + +# (pofilter) untranslated: checks whether a string has been translated at all +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "I pamundur leximi i lidhjes simbolike '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Gabim tek rreshti %d simboli %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, 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:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"U gjet një entitet bosh '&;'; entitetet e vlefshme janë: & " < " +"> '" + +#: ../glib/gmarkup.c:722 +#, 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:727 +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:1078 +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:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumenti ishte bosh apo përmbante vetëm hapësira të bardha" + +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumenti përfundoi papritur në brendësi të emrit të një elementi" + +#: ../glib/gmarkup.c:1754 +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:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumenti u mbyll papritur brënda një etikete hapje elementi" + +#: ../glib/gmarkup.c:1765 +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:1772 +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:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "objekt i korruptuar" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "gabim i brendshëm ose objekt i korruptuar" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "mbi memorjen" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "u arrit kufiri i backtracking" + +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +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:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "gabim i brendshëm" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "u arrit kufiri i ndjekjes" + +#: ../glib/gregex.c:231 +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:233 +msgid "invalid combination of newline flags" +msgstr "kombinim i pavlefshëm i flag të fund'rreshtit" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "gabim i panjohur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ në fund të modelit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:264 +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:267 +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:274 +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:277 +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:280 +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:283 +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:286 +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:289 +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:292 +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:295 +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:299 +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:303 +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:306 +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:309 +msgid "missing terminating )" +msgstr ") përfunduese mungon" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:313 +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:320 +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:323 +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:326 +msgid "missing ) after comment" +msgstr ") mungon mbas komentit" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:329 +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:332 +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:335 +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:338 +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:341 +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:344 +msgid "assertion expected after (?(" +msgstr "pritej kushti mbas (?(" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:347 +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:350 +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:353 +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:356 +msgid "invalid condition (?(0)" +msgstr "kusht (?(0) i pavlefshëm" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:359 +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:362 +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:365 +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:368 +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:371 +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:374 +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:377 +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:380 +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:383 +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:386 +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:389 +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:392 +msgid "inconsistent NEWLINE options" +msgstr "opsione NEWLINE jokoerente" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "përsëritje e papritur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "sasi e tepërt kodi" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../glib/gregex.c:408 +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:412 +msgid "previously-checked referenced subpattern not found" +msgstr "nën-model referues i kontrolluar më parë nuk u gjet" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, 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:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Libraria PCRE është kompiluar pa suportin për UTF8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Libraria PCRE është kompiluar pa suportin për pronësitë UTF8" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Gabim gjatë optimizimit të shprehjes së rregullt %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "pritej një shifër exadecimale ose '}'" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "pritej një shifër exadecimale" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "mungon '<' në referimin simbolik" + +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "Riferim simbolik i papërfunduar" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "referim simbolik me gjatësi zero" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "pritej një shifër" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "referim simbolik i palejuar" + +# (pofilter) startpunc: checks whether punctuation at the beginning of the strings match +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "'\\' në fund e izoluar" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "sekuencë e panjohur escape" + +#: ../glib/gregex.c:2360 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Teksti i kuotuar nuk fillon me shenjën e kuotimit" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Teksti është bosh (ose përmban vetëm hapsira të bardha)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "I pamundur leximi i të dhënave nga proçesi bir" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "I pamundur leximi nga pipe bijë (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "I pamundur ndryshimi i directory në '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "I pamundur ekzekutimi i proçesit bir (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Emër i pasaktë programi: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Vlerë e pavlefshme në ambient: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Directory e pavlefshme pune: %s" + +#: ../glib/gspawn-win32.c:783 +#, 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:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Gabim i papritur në waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "E pamundur kryerja e fork (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "I pamundur zbatimi i proçesit bir \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "E pamundur kryerja e fork për proçesin bir (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Gabim i panjohur gjatë ekzekutimit të proçesit bir \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Simboli nuk ekziston në UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Sekuencë e pavlefshme në hyrje për konvertimin" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Simboli nuk ekziston në UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Përdorimi:" + +# (pofilter) acronyms: acronyms should not be translated: OPTION +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPSIONI...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Opcionet e ndihmës:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Shfaq opcionet e ndihmës" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Shfaq të gjithë opcionet e ndihmës" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Opcionet e programit:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, 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:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Vlera integruese '%s' për %s është jashtë kufirit" + +#: ../glib/goption.c:1032 +#, 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:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Gabim gjatë analizimit të opsionit %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Mungojnë argumentë për %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Opcion i panjohur %s" + +#: ../glib/gkeyfile.c:366 +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:401 +msgid "Not a regular file" +msgstr "Nuk është një file i rregullt" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "File është bosh" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Emër i pasaktë grupi: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "File i kyçit nuk fillon me një grup" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Emër i pasaktë kyçi: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "File i kyçit përmban kodifikimin e pasuportuar '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "File i kyçit nuk ka grupin '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "File i kyçit nuk përmban kyçin '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, 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:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Vlera integruese '%s' është jashtë kufirit" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, 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:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +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:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Operacioni është anulluar" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Sekuencë byte e pavlefshme tek të dhënat për konvertim" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "Lloj %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +# (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" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +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/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Gabim gjatë ndarjes së file: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Gabim gjatë hapjes së file '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Gabim gjatë leximit të file '%s': %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/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +# (pofilter) startcaps: checks that the message starts with the correct capitalisation +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Lloj i panjohur" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Gabim gjatë hapjes së directory '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +# (pofilter) variables: translation contains variables not in original: %s, %s +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Gabim gjatë krijimit të directory: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Gabim gjatë hapjes së file '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %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/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Gabim gjatë mbylljes së file: %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Gabim gjatë hapjes së file '%s': %s" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Gabim gjatë hapjes së file '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Enumuruesi është mbyllur" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Stream është i mbyllur rregullisht" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%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/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Koshi nuk suportohet" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +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/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Gabim tek rreshti %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Gabim gjatë analizimit të opsionit %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +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/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Gabim gjatë hapjes së file: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Simboli '%s' nuk është i vlefshëm brenda emrit të një entiteti" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Simboli '%s' nuk është i vlefshëm brenda emrit të një entiteti" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Simboli '%s' nuk është i vlefshëm brenda emrit të një entiteti" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Gabim gjatë analizimit të opsionit %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Gabim gjatë konvertimit: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Gabim gjatë hapjes së directory '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "objekt i korruptuar" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Paemër" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gdesktopappinfo.c:969 +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:1250 +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:1515 +#, 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:1519 +#, 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" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gdesktopappinfo.c:2033 +#, 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:2149 +#, 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:363 +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:728 +#, 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:831 +#, fuzzy +msgid "drive doesn't implement stop" +msgstr "njësia nuk suporton nxjerrjen jashtë" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +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:2411 ../gio/glocalfile.c:2256 +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:2472 +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:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "File objektiv ekziston" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "I pamundur kopjimi rekursiv i directory" + +#: ../gio/gfile.c:2758 +#, 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:2762 +#, 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:2909 +#, 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:3483 +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:3577 +msgid "Trash not supported" +msgstr "Koshi nuk suportohet" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gfile.c:3626 +#, 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:6006 ../gio/gvolume.c:332 +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:6117 +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:205 +msgid "Enumerator is closed" +msgstr "Enumuruesi është mbyllur" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +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:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Enumuruesi i file është rregullisht i mbyllur" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +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:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +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:379 +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:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Ndërprerja nuk suportohet tek stream" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +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:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Stream prezanton një operacion në pritje" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Koshi nuk suportohet" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "Lloj i pasaktë atributi (pritej string)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/glocaldirectorymonitor.c:287 +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:571 ../gio/win32/gwinhttpfile.c:422 +#, 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:948 +#, 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:1097 +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:1117 ../gio/glocalfile.c:1143 +#, 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:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "I pamundur riemërtimi i file, emër ekzistues file" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +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:1300 +#, 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:1316 +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:1441 +#, 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:1808 +#, 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:1831 +#, 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:1852 +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:1931 ../gio/glocalfile.c:1951 +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:1985 +#, 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:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, 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:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Gabim gjatë krijimit të directory: %s" + +#: ../gio/glocalfile.c:2162 +#, 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:2166 +#, 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:2228 ../gio/glocalfile.c:2322 +#, 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:2251 +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:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +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:2297 +#, 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:2311 +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:719 +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:726 +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:733 +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:773 +#, 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:1482 ../gio/glocalfileoutputstream.c:833 +#, 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:1566 +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:1768 +#, 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:1813 +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:1831 +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:1850 ../gio/glocalfileinfo.c:1869 +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:1904 +#, 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:1920 +#, 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:1971 +#, 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:1994 +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:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, 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:2013 +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:2139 +#, 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:2162 +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:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Gabim gjatë përcaktimit të kontekstit SELinux: %s" + +#: ../gio/glocalfileinfo.c:2184 +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:2276 +#, 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:185 ../gio/glocalfileoutputstream.c:722 +#, 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:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, 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:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, 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:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, 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:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1083 +#, 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:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, 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:846 +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:851 +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:863 +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:1048 +#, 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:486 ../gio/gmemoryoutputstream.c:746 +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:496 +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:520 +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:496 +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:512 +msgid "Failed to resize memory output stream" +msgstr "Ripërmasimi i stream të output të memories dështoi" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +#, 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:442 +#, 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:611 +#, 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:701 +#, 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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"objekti mount nuk suporton mbivendosjen sinkrone të llojit të përmbajtjes" + +#: ../gio/gnetworkaddress.c:322 +#, 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:411 +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:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Stream burues është i mbyllur" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Gabim gjatë leximit të file '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, 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:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Gabim gjatë fshirjes së file: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Opcion i panjohur %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, 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:290 +#, fuzzy +msgid "Socket is already closed" +msgstr "Stream burues është i mbyllur" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +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:464 +#, 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:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "I pamundur krijimi i directory koshit \"%s\": %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "" + +#: ../gio/gsocket.c:1372 +#, 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:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: ../gio/gsocket.c:1566 +#, 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:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Gabim gjatë ndarjes së file: %s" + +#: ../gio/gsocket.c:1688 +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:1695 +#, 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:1738 ../gio/gsocket.c:3579 +#, 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:1875 +#, 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:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Gabim gjatë hapjes së 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:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "I pamundur krijimi i directory koshit \"%s\": %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:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Gabim gjatë mbylljes së file: %s" + +#: ../gio/gsocket.c:2791 +#, 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:3056 ../gio/gsocket.c:3137 +#, 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:3081 +#, 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:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Gabim gjatë fshirjes së file: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +#, fuzzy +msgid "Unknown error on connect" +msgstr "gabim i panjohur" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Lidhjet simbolike nuk suportohen" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gsocketlistener.c:191 +#, fuzzy +msgid "Listener is already closed" +msgstr "Stream është i mbyllur rregullisht" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +#, fuzzy +msgid "Unexpected type of ancillary data" +msgstr "End-of-stream i parakohshëm papritur" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +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/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Gabim gjatë hapjes së file: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +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/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Gabim gjatë ndryshimit të emrit të file: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %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/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, 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:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, 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:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "File rrënjë i sistemit" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Gabim gjatë shkrimit në unix: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +#, 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:276 +msgid "Can't find application" +msgstr "E pamundur gjetja e aplikativit" + +# (pofilter) isfuzzy: Check if the unit has been marked fuzzy. +#: ../gio/gwin32appinfo.c:299 +#, 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:335 +msgid "URIs not supported" +msgstr "URI nuk suportohen" + +# (pofilter) untranslated: checks whether a string has been translated at all +#: ../gio/gwin32appinfo.c:357 +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:369 +msgid "Association creation not supported on win32" +msgstr "Krijimi 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/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %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/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Gabim gjatë mbylljes 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/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Gabim gjatë shkrimit tek file: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +#, fuzzy +msgid "Not enough memory" +msgstr "mbi memorjen" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, fuzzy, c-format +msgid "Internal error: %s" +msgstr "gabim i brendshëm" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, fuzzy +msgid "Invalid compressed data" +msgstr "Emër host i pasaktë" + +# (pofilter) untranslated: checks whether a string has been translated at all +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "E pamundur lëvizja e directory mbi directory" + +#, 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 "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.po b/po/sr.po new file mode 100644 index 0000000..adfae17 --- /dev/null +++ b/po/sr.po @@ -0,0 +1,4380 @@ +# Serbian translation of glib +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003 - 2012. +# 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 Слободан Д. Средојевић +# Милош Поповић , 2010. +# Бранко Кокановић , 2010. +# Мирослав Николић , 2011—2013. +msgid "" +msgstr "" +"Project-Id-Version: 2.8\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&k" +"eywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-24 23:17+0000\n" +"PO-Revision-Date: 2013-02-18 10:33+0200\n" +"Last-Translator: Мирослав Николић \n" +"Language-Team: Serbian \n" +"Language: sr\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==1? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Превелика бројчана вредност је прослеђена у %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Није подржавано премотавање основног тока" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Не могу да скратим улазни ток у Гмеђумеморији" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Ток је већ затворен" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Није подржано сасецање основног тока" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Радња је отказана" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Неисправан објекат, није покренуто" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Непотпун низ бајтова на улазу" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Нема довољно места у одредишту" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка приликом претварања: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Није подржано покретање уз могућност отказивања" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не могу да покренем претварање из „%s“ у „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s врста" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Непозната врста" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s врста датотеке" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "Гуверења нису подржана на оперативном систему" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Немате подршку за Гуверења на овој платформи" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "Гуверења не садрже ИБ процеса на овом оперативном систему" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочекиван, преран крај тока" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Кључ „%s“ није подржан унутар адресе „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Адреса „%s“ је неисправна (потребна само једна путања, привремени " +"директоријум или апстрактни кључ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Безначајна комбинација кључ/вредност унутар адресе „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Грешка унутар адресе „%s“ — порт није исправно уписан" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Грешка унутар адресе „%s“ — атрибут фамилије је неисправно уписан" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Елемент адресе „%s“ не садржи две тачке (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Пар кључ/вредност %d, „%s“, у елементу адресе „%s“ не садржи знак једнакости" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Грешка при неизбегавању кључа или вредности у пару Кључ/Вредности %d, „%s“, " +"у елементу адресе „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Грешка у адреси „%s“ — Јуниксов пренос захтева постављање кључа " +"„path“ (путања) или „abstract“ (резиме)" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"Грешка унутар адресе „%s“ — атрибут домаћина недостаје или је неисправан" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Грешка унутар адресе „%s“ — порт недостаје или је неисправан" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"Грешка унутар адресе „%s“ — атрибут датотеке једнократних случајних бројева " +"недостаје или је неисправан" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "Грешка у самопокретању: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Непознати или неподржани пренос „%s“ за адресе „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "" +"Грешка приликом отварања датотеке једнократних случајних бројева „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Грешка при читању датотеке једнократних случајних бројева „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"Грешка при читању датотеке једнократних случајних бројева „%s“, очекивано 16 " +"бајтова, а добијено %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"Грешка приликом уписа садржаја датотеке једнократних случајних бројева „%s“ " +"у ток:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Дата адреса је празна" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Не могу да покренем магистралу порука када подешавам јиб" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Не могу да покренем магистралу порука без идентификације машине: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Грешка при покретању наредбе „%s“: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Упишите било који знак да затворите овај прозор)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Д-магистрала сесије није покренута, самопокретање није успело" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Не могу да одредим адресу магистрале сесије (није направљено за овај " +"оперативни систем)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Не могу да одредим адресу магистрале сесије из променљиве окружења " +"DBUS_STARTER_BUS_TYPE — непозната вредност „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Не могу да одредим адресу магистрале сесије јер није постављена променљива " +"окружења DBUS_STARTER_BUS_TYPE" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Непознат тип магистрале %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Неочекивани недостатак садржаја при читању линије" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Неочекивани недостатак садржаја при (сигурном) читању линије" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Истрошени су сви доступни механизми пријављивања (покушано: %s) (доступно: " +"%s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Поништено преко GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Грешка приликом добављања података за директоријум „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Овлашћења фасцикле „%s“ су неисправна. Очекивана вредност је била 0700, а " +"добијено је 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Грешка приликом образовања директоријума „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Грешка приликом отварања привеска кључева „%s“ за читање: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Линија %d привеска кључева на „%s“ са садржајем „%s“ није исправна" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Први токен линије %d привеска кључева на „%s“ са садржајем „%s“ није исправан" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Други токен линије %d привеска кључева на „%s“ са садржајем „%s“ није " +"исправан" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Нисам нашао колачић са идентификацијом %d у привеску кључева на „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Грешка при брисању заостале датотеке закључавања „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Грешка при прављењу датотеке закључавања „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Грешка приликом затварања (неповезане) датотеке закључавања „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Грешка приликом одвезивању датотеке закључавања „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Грешка приликом отварања привеска кључева „%s“ за писање: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Додатно, отпуштање кључа са „%s“ такође није успело: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Веза је затворена" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Време је истекло" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Наишао сам на неподржане ознаке при изградњи клијентског дела везе" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Нема интерфејса „org.freedesktop.DBus.Properties“ у објекту на путањи %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"Грешка при постављању особине „%s“: Очекивани тип је био „%s“, а добијен је " +"„%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Нема особине „%s“" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Особина „%s“ није читљива" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Није могуће писање особине „%s“" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Нема интерфејса „%s“" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Нема таквог интерфејса" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Нема интерфејса „%s“ у објекту на путањи %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Нема метода „%s“" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Тпи поруке, „%s“, не одговара очекиваном типу „%s“" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Објекат је већ извезен за интерфејс %s на %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Метод „%s“ је вратио тип „%s“, али је био очекиван „%s“" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Метод „%s“ на интерфејсу „%s“ са потписом „%s“ не постоји" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Поддрво је већ извезено за %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "врста је НЕИСПРАВНА" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Порука ПОЗИВА_МЕТОДА: недостају поља заглавља ПУТАЊА или ЧЛАН" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Порука РЕЗУЛТАТ_МЕТОДА: недостаје поље заглавља ОДГОВОРИ_СЕРИЈСКИ" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Порука ГРЕШКЕ: недостају поља заглавља ОДГОВОРИ_СЕРИЈСКИ или НАЗИВ_ГРЕШКЕ" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Порука СИГНАЛА: недостају поља заглавља ПУТАЊА, СУЧЕЉЕ или ЧЛАН" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Порука СИГНАЛА: поље заглавља ПУТАЊА користи резервисану вредност „/org/" +"freedesktop/DBus/Local“" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Порука СИГНАЛА: поље заглавља СУЧЕЉЕ користи резервисану вредност „org." +"freedesktop.DBus.Local“" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "Покушах да читам %lu бајт, али добих само %lu" +msgstr[1] "Покушах да читам %lu бајта, али добих само %lu" +msgstr[2] "Покушах да читам %lu бајтова, али добих само %lu" +msgstr[3] "Покушах да читам један бајт, али добих само %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Очекивао сам NUL бајт после ниске „%s“, али сам нашао бајт %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Очекивах исправну УТФ-8 ниску, али нађох неисправне бајтове на бајт померају " +"%d (дужина ниске је %d). Исправна ниска до тог дела је била „%s“" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Рашчлањена вредност „%s“ није исправна путања објекта Д-магистрале" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Рашчлањена вредност „%s“ није исправан потпис Д-магистрале" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"Наишао сам на низ дужине %u бајт. Највећа дужина је 2<<26 бајта (64 MiB)." +msgstr[1] "" +"Наишао сам на низ дужине %u бајта. Највећа дужина је 2<<26 бајта (64 MiB)." +msgstr[2] "" +"Наишао сам на низ дужине %u бајтова. Највећа дужина је 2<<26 бајтова (64 " +"MiB)." +msgstr[3] "" +"Наишао сам на низ дужине једног бајта. Највећа дужина је 2<<26 бајтова (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Рашчлањена вредност „%s“ за варијанту није исправан потпис Д-магистрале" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"Грешка при десеријализацији Гваријанта са ниском врсте „%s“ из жичаног " +"формата Д-магистрале" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Неисправна вредност за крајњост. Очекивао сам 0x6c („l“) или 0x42 („Bд) али " +"сам нашао вредност 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Неисправна главно издање протокола. Очекивано 1, али нађено %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Потпис заглавља са потписом „%s“ је нађен, али је тело поруке празно" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Рашчлањена вредност „%s“ није исправан потпис Д-магистрале (за тело поруке)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Нема заглавља потписа у поруци, али тело поруке има %u бајт" +msgstr[1] "Нема заглавља потписа у поруци, али тело поруке има %u бајта" +msgstr[2] "Нема заглавља потписа у поруци, али тело поруке има %u бајтова" +msgstr[3] "Нема заглавља потписа у поруци, али тело поруке има један бајт" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Не могу да десеријализујем поруку: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"Грешка при серијализацији Гваријанта са ниском врсте „%s“ из жичаног формата " +"Д-магистрале" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Порука има %d описивача датотеке, али заглавље указује на %d описивача " +"датотеке" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Не могу да серијализујем поруку: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Тело поруке има потпис „%s“, али недостаје заглавље потписа" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Тело поруке има тип потписа „%s“, али потпис у пољу заглавља је „%s“" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Тело поруке је празно,,, али је потпис у пољу заглавља „(%s)“" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Добијена је грешка са телом поруке типа „%s“" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Добијена је грешка са празним телом поруке" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Не могу да добавим профил физичких делова: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Не могу да учитам „/var/lib/dbus/machine-id“ или „/etc/machine-id“: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Грешка при позиву покрени услугу према називу за %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Неочекиван одговор %d од StartServiceByName(„%s“) метода" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Не могу да позовем метод; посредник је за добро знани назив без власника, а " +"направљен је без G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ознаке" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Апстрактни именски простор није подржан" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"Не могу да наведем датотеку једнократних случајних бројева при повезивању са " +"сервером" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" +"Грешка приликом уписа датотеке једнократних случајних бројева на „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Ниска „%s“ није исправни ГЈИБ Д-магистрале" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Не могу да слушам на неподржаном преносном механизму „%s“" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "НАРЕДБА" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Наредбе:\n" +" help Приказује ову информацију\n" +" introspect Испитује удаљени објекат\n" +" monitor Надгледа удаљени објекат\n" +" call Позива начин на удаљеном објекту\n" +" emit Одашиља сигнал\n" +"\n" +"Користите „%s НАРЕДБА --help“ да добијете помоћ за појединачне наредбе.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "Грешка: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Грешка при рашчлањивању XML-а добијеног испитивањем: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Повезивање на системску магистрали" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Повезивање на магистралу сесије" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Повезивање на задату Д-бас адресу" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Опције крајње тачке везе:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Опције које одређују крајњу тачку везе" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Није наведена крајња тачка везе" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Наведено више крајњих тачака везе" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Упозорење: Према подацима добијеним испитивањем, интерфејс „%s“ не постоји\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Упозорење: Према подацима добијеним испитивањем, метод „%s“ не постоји на " +"интерфејсу „%s“\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Опционална дестинација сигнала (јединствено име)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Путања објекта за емитовање сигнала" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Назив сигнала и сучеља" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Емитује сигнал." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Грешка у повезивању: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Грешка: није изабрана путања објекта.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Грешка: %s није исправна путања до објеката\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Грешка: сигнал није наведен.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Грешка: сигнал мора бити потпуно одговарајући назив.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Грешка: „%s“ није исправан назив сучеља\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Грешка: „%s“ није исправан назив члана\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Грешка: „%s“ није исправан назив јединствене магистрале.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Грешка при обради параметра %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Грешка испирања везе: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Назив одредишта на коме треба позвати метод" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Путања објекта на коме треба позвати метод" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Име метода и интерфејса" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Време истека у секундама" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Позивање метода на удаљеном објекту." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Грешка: Није изабрано одредиште\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Грешка: Није изабрана путања до објекта\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Грешка: Име начина није одређено\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Грешка: Име начина „%s“ није одређено\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Грешка при обради параметра %d врсте „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Назив одредишта за испитивање" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Путања објекта за испитивање" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Штампа ИксМЛ" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Преиспитује чланове" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Само штампа својства" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Испитајте удаљени објекат." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Назив одредишта за надгледање" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Путања објекта за надгледање" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Надгледање удаљеног објекта." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Неименовано" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Датотека за радну површ не садржи Exec унос" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Не могу да нађем терминал ради покретања овог програма" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не могу да направим фасциклу за корисникова подешавања %s: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не могу да направим фасциклу за корисникова МИМЕ подешавања %s: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "Подацима о програму недостаје идентификатор" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не могу да направим датотеку радне површи %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Произвољне одреднице за %s" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "уређај не подржава „избаци“ или „избаци_са_операцијом“" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "није подржано извлачење медијума на уређају" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "уређај не подржава „покрени“" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "уређај не подржава „заустави“" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "ТЛС подршка није доступна" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Не могу да радим са издањем %d кодирања ГЕмблема" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неисправно задат број токена (%d) у кодирању ГЕмблема" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Не могу да радим са издањем %d кодирања иконице ГЕмблема" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Није исправно задат број токена (%d) у кодирању иконице ГЕмблема" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очекивано је ГЕмблем за иконицу ГЕмблема" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7115 ../gio/gfile.c:7205 ../gio/gfile.c:7289 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Садржано монтирање не постоји" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Не могу да умножим преко директоријума" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "Не могу да умножим директоријум преко директоријума" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Циљна датотека већ постоји" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "Не могу да умножим директоријум и његов садржај" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "Дељење није подржано" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "Грешка приликом дељења датотеке: %s" + +#: ../gio/gfile.c:2952 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Није подржано умножавање (reflink/clone) између монтираних уређаја" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Умножавање (reflink/clone) није подржано или је неисправно" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Умножавање (reflink/clone) није подржано или не ради" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "Не могу да умножим специјалну датотеку" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "Дата је неисправна симболичка веза" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "Није подржано смеће" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Имена датотека не могу да садрже „%c“" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "није подржано монтирање диска" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "Ни један програм не може да отвори ову датотеку" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Набрајање је затворено" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Бројање датотека има неиспуњену радњу" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +msgid "File enumerator is already closed" +msgstr "Бројање датотека је већ завршено" + +#: ../gio/gfileicon.c:237 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Не могу да радим са издањем %d кодирања иконице ГДатотеке" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "Лоши улазни подаци за иконицу ГДатотеке" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Ток не подржава „пропитај_податке“" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Није подржавано премотавање тока" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Сасецање није дозвољену над улазним током" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Сасецање није дозвољено над током" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Није исправан број токена (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Не постоји врста за назив класе %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Врста %s не подржава сучеље ГИконице" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Врста %s не припада ни једној класи" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Број издања је лоше задат: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s врста не подржава „from_tokens()“ на сучељу ГИконице" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Не могу да радим са датим издањем кодирања иконице" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Није наведена адреса" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Дужина %u је превише дуга за адресу" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Адреса има скуп битова преко дужине префикса" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Не могу да обрадим „%s“ као маску ИП адресе" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Нема довољно места за адресу утичнице" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Није подржана адреса утичнице" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Ток ради јако добро" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Елемент <%s> није дозвољен унутар <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Елемент <%s> није дозвољен на највишем нивоу" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Датотека „%s“ се појављује више пута у извору" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Нисам успео да пронађем „%s“ ни у јеном изворном директоријуму" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Нисам успео да пронађем „%s“ у текућем директоријуму" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Непозната опција обраде „%s“" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Нисам успео да направим привремену датотеку: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Грешка обраде улазне датотеке са „xmllint“-ом:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Грешка обраде улазне датотеке са „to-pixdata“-ом:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "Грешка при сажимању датотеке „%s“" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "текст не може да се појављује унутар <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "назив излазне датотеке" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "ДАТОТЕКА" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Директоријуми из којих ће датотеке бити читане (основно је текући " +"директоријум)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "ДИРЕКТОРИЈУМ" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Ствара излаз у формату изабраном проширењем назива циљне датотеке" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Ствара заглавље извора" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Ствара изворни код коришћен да повеже датотеку ресурса у ваш код" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Ствара списак зависности" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Не ствара самостално и не бележи извор" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Не извози функције; објављује их „Г_ГНУЦ_УНУТРАШЊИМ“" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Назив Ц одредника коришћеног за створени изворни код" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Преводи одредницу ресурса у датотеку ресурса.\n" +"Датотеке одреднице ресурса имају проширење „.gresource.xml“,\n" +"а датотеке ресурса имају проширење „.gresource“." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Треба да наведете тачно један назив датотеке\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "празни називи нису дозвољени" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "неисправан назив „%s“: називи морају да почињу малим словом" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"неисправан назив „%s“: неисправан знак „%c“; само мала слова, бројеви и " +"цртица („-“) су дозвољени." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "неисправан назив „%s“: две узастопне цртице („--“) нису дозвољене." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "неисправан назив „%s“: последњи знак не може да буде цртиица („-“)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "неисправан назив „%s“: највећа дужина је 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " је већ наведено" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "не могу да додам кључеве у шему „list-of“" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " је већ наведено" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" прекрива у ; користите " +" да измените вредност" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"тачно једна ствар од „type“, „enum“ или „flags“ мора бити наведена као " +"атрибут за " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> није (још) дефинисано." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "неисправна врста ниске ГВаријанта „%s“" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " је дато, али шема не проширује ништа" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "нема за преклапање" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " је већ наведено" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " је већ наведено" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " проширује шему „%s“ која још не постоји" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " је списак још непостојеће шеме „%s“" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Не може бити списак шеме са путањом" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Не могу да проширим шему са путањом" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" је списак који проширује која није списак" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" проширује али " +"„%s“ не проширује „%s“" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "путања, ако се наводи мора да почиње и завршава са косом цртом" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "путања списка мора да се завршава са „:/“" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id=„%s“> је већ наведено" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Елемент <%s> није дозвољен на највишем нивоу" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "„--strict“ је наведено; излазим.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Читава ова датотека је занемарена.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Занемарујем ову датотеку.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Не постоји кључ „%s“ у шеми „%s“ као што је наведено у датотеци замене „%s“" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; занемарујем замену за овај кључ.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " и „--strict“ је наведено; излазим.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"грешка у анализи кључа „%s“ у шеми „%s“ као што је наведено у датотеци " +"замене „%s“: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Занемарујем замену за овај кључ.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"преклапање за кључ „%s“ у шеми „%s“ у преклопљеној датотеци „%s“ је изван " +"опсега датог у шеми" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"преклапање за кључ „%s“ у шеми „%s“ у преклопљеној датотеци „%s“ није у " +"списку дозвољених избора" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "где да складиштим „gschemas.compiled“ датотеку" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Прекини при било којој грешци у шемама" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Не уписуј „gschemas.compiled“ датотеку" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Не намеће ограничења назива кључа" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Преводи све датотеке шема ГПодешавања у кеш шема.\n" +"Датотеке шема морају да се завршавају са „.gschema.xml“,\n" +"а датотеке кеша имају назив „gschemas.compiled“." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Требате навести тачно један назив фасцикле\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Ниједна датотека са шемама није нађена: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "не радим ништа.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "уклоњена постојећа излазна датотека.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Не могу да нађем подразумевану врсту монитора за локални директоријум" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Неисправан назив датотеке %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка приликом добијања података о систему датотека: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Не могу да преименујем корени директоријум" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "Грешка у преименовању датотеке: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Не могу да преименујем датотеку, назив датотеке већ постоји" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Неисправан назив датотеке" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Не могу да отворим директоријум" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "Грешка приликом отварања датотеке: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "Грешка приликом уклањања датотеке: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "Грешка приликом премештања датотеке у смеће: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не могу да направим директоријум за смеће %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Не могу да нађем корени директоријум за смеће" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Не могу да нађем или направим директоријум за смеће" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не могу да направим датотеку са подацима о смећу: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не могу да пошаљем датотеку у смеће: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "унутрашња грешка" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "Грешка приликом образовања директоријума: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Систем датотека не подржава симболичке везе" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка приликом образовања симболичке везе: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "Грешка премештања датотеке: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Не могу да преместим директоријум преко директоријума" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Није успела израда резервне датотеке" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "Грешка уклањања циљне датотеке: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Није подржано премештање између монтираних уређаја" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Вредност особине мора бити различита од NULL" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Није исправна врста атрибута (очекивана је ниска знакова)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Није исправан назив проширене особине" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка приликом постављања проширене особине „%s“: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (неисправно кодирање)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Грешка приликом добављања података за датотеку „%s“: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Грешка приликом добављања података за описника датотеке: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Није исправна врста особине („uint32“ је очекивано)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Није исправна врста особине („uint64“ је очекивано)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Није исправна врста особине (очекивана је ниска битова)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "Не могу да поставим овлашћења за симболичке везе" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка приликом постављања овлашћења: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "Грешка приликом постављања власника: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "симболичке везе морају бити различите од NULL" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка приликом постављања симболичке везе: %s" + +#: ../gio/glocalfileinfo.c:2230 +msgid "Error setting symlink: file is not a symlink" +msgstr "Грешка при постављању симболичке везе: датотека није симболичка веза" + +#: ../gio/glocalfileinfo.c:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при постављању датума измене или приступа: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "СЕЛинукс контекст не сме бити NULL" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка приликом постављања СЕЛинукс контекста: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "СЕЛинукс није укључен на вашем систему" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Није подржано постављање особине %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "Грешка приликом читања датотеке: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка приликом претраге унутар датотеке: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "Грешка приликом затварања датотеке: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Не могу да пронађем подразумевану, локалну врсту монитора датотеке" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "Грешка приликом уписа у датотеку: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка приликом уклањања старе резервне копије везе: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка приликом образовања резервне копије: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка приликом преименовања привремене датотеке: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при сасецању датотеке: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка приликом отварања датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Циљна датотека је директоријум" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Циљна датотека није обична датотека" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Датотека је измењена спољним програмом" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "Грешка приликом уклањања старе датотеке: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Није исправно одређена врста ГПретраге" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Неисправан захтев претраге" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не могу да скратим улазни ток ГМеморије" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Величина излазне меморије се не може променити" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Не могу да променим величину излазног меморијског тока" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "Има више меморије за упис него што има места у датој адреси" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Захтевано је премотавање на део пре почетка тока" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "монтирање не подржава усклађено налажење врсте садржаја" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Име домаћина „%s“ садржи „[“, али не и „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Мрежа је недостижна" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Домаћин је недостижан" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Не могу да направим праћење мреже: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Не могу да направим праћење мреже: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Не могу да добавим стање мреже: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Излазни ток не подржава упис" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Изворни ток је већ затворен" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Ресурс „%s“ не постоји" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Ресурс на „%s“ није успео да се распакује" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Ресурс на „%s“ није директоријум" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Улазни ток не подржава премотавање" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Штампа помоћ" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[НАРЕДБА]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Наводи одељке који садрже ресурсе у елф ДАТОТЕЦИ" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Наводи ресурсе\n" +"Ако је дато ОДЕЉАК, наводи само ресурсе у том одељку\n" +"Ако је дато ПУТАЊА, наводи само одговарајуће ресурсе" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "ДАТОТЕКА [ПУТАЊА]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "ОДЕЉАК" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Наводи ресурсе са појединостима\n" +"Ако је дато ОДЕЉАК, наводи само ресурсе у том одељку\n" +"Ако је дато ПУТАЊА, наводи само одговарајуће ресурсе\n" +"У појединости спадају одељак, величина и сажимање" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Извлачи датотеку ресурса у стандардни излаз" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "ПУТАЊА ДАТОТЕКЕ" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Непозната наредба „%s“\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Употреба:\n" +" gresource [--section ОДЕЉАК] НАРЕДБА [АРГУМЕНТИ...]\n" +"\n" +"Наредбе:\n" +" help Приказује ово обавештење\n" +" sections Исписује одељке ресурса\n" +" list Исписује ресурсе\n" +" details Исписује ресурсе са појединостима\n" +" extract Извлачи ресурс\n" +"\n" +"Користите „gresource help НАРЕДБА“ да прикажете опширнију помоћ.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Коришћење:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Аргументи:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " ОДЕЉАК Назив (опционално) елф одељка\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " НАРЕДБА Наредба (опционално) за објашњавање\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " ДАТОТЕКА Елф датотека (извршна или дељена библиотека)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" ДАТОТЕКА Елф датотека (извршна или дељена библиотека)\n" +" или преведена датотека ресурса\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[ПУТАЊА]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " ПУТАЊА Путања (опционално) ресурса (може бити делимична)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "ПУТАЊА" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " ПУТАЊА Путања ресурса\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Нема такве шеме „%s“\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Шема „%s“ није преместљива (путања не сме бити наведена)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Шема „%s“ је преместљива (путања мора бити наведена)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Дата је празна путања.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Путања мора почети косом цртом (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Путања мора да се заврши косом цртом (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Путања не сме да садржи две суседне косе црте (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Нема таквог кључа „%s“\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Обезбеђена вредност је изван важећег опсега\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Наводи инсталиране (непреместљиве) шеме" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Наводи инсталиране преместљиве шеме" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Наводи кључеве у ШЕМИ" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "ШЕМА [:ПУТАЊА]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Наводи проистекле из ШЕМЕ" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Наводи кључеве и вредности, рекурзивно\n" +"Ако СХЕМА није дата, наводи све кључеве\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[ШЕМА[:ПУТАЊА]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Добавља вредност кључа" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "ШЕМА [:ПУТАЊА] КЉУЧ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Пропитује опсег важећих вредности за КЉУЧ" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Поставља вредност КЉУЧА на ВРЕДНОСТ" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ШЕМА [:ПУТАЊА] КЉУЧ ВРЕДНОСТ" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Поново поставља КЉУЧ на подразумевану вредност" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Враћа све кључеве у СХЕМИ на основне вредности" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Проверава да ли је КЉУЧ уписив" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Прати КЉУЧ за изменама.\n" +"Ако није наведен ниједан КЉУЧ, прати све кључеве у ШЕМИ.\n" +"Користите „^C“ да зауставите праћење.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ШЕМА [:ПУТАЊА] [КЉУЧ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Коришћење:\n" +" gsettings [--schemadir ШЕМАДИР] НАРЕДБА [АРГУМЕНТИ...]\n" +"\n" +"Наредба:\n" +" help Приказује ову информацију\n" +" list-schemas Наводи инсталиране шеме\n" +" list-relocatable-schemas Наводи преместљиве шеме\n" +" list-keys Наводи кључеве у шеми\n" +" list-children Наводи проистекле из шеме\n" +" list-recursively Наводи кључеве и вредности, дубински\n" +" range Пропитује опсег кључа\n" +" get Набавља вредност кључа\n" +" set Подешава вредност кључа\n" +" reset Поново подешава вредност кључа\n" +" writable Проверава да ли је кључ уписив\n" +" monitor Надгледа измене\n" +"\n" +"Користите „gsettings help НАРЕДБА“ да добијете детаљнију помоћ.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Коришћење:\n" +" gsettings [--schemadir ШЕМАДИР] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " ШЕМАДИР Директоријум за тражење додатних шема\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ШЕМА Име шеме\n" +" ПУТАЊА Путања, за преместиве шеме\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " КЉУЧ (опционални) кључ унутар шеме\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " КЉУЧ Кључ унутар шеме\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " ВРЕДНОСТ Вредност за подешавање\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Дат је празан назив шеме\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Неисправна утичница, није покренуто" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неисправна утичница, покретање није успело због: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Утичница је већ затворена" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Истекло време за У/И утичнице" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "правим ГУтичницу из фд-а: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не могу да направим утичницу: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Задата је непозната породица" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Задат је непознати протокол" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "не могу да добијем локалну адресу: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "не могу да добијем удаљену адресу: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "не могу да слушам: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "грешка при повезивању на адресу: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Грешка приликом приступања групи вишеструког емитовања: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Грешка приликом напуштања групе вишеструког емитовања: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Нема подршке за посебно вишеструко емитовање извора" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "грешка у прихватању везе: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Повезивање је у току" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Не могу да добијем грешку на чекању: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "Грешка у примању података: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "Грешка у слању података: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не могу да угасим утичницу: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "Грешка у затварању утичнице: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Чекам услов утичнице: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "Грешка при слању поруке: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Порука управљања Гутичницом није подржана на Виндоузу" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при примању поруке: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не могу да добијем грешку на чекању: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "г_утичница_добавља_уверења није примењена за овај оперативни систем" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Не могу да се повежем на сервер посредника „%s“: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Не могу да се повежем на „%s“: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Не могу да се повежем: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Непозната грешка везе" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Посредовање преко везе која није ТЦП није подржано." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Протокол посредника „%s“ није подржан." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Слушање је већ затворено" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Додата утичница је затворена" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "СОЦКСв4 не подржава ИПв6 адресу „%s“" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Корисничко име је предуго за СОЦКСв4 протокол" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Име домаћина „%s“ је предуго за СОЦКСв4 протокол" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Сервер није СОЦКСв4 сервер посредник." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Веза кроз СОЦКСв4 сервер је одбијена" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Сервер није СОЦКСв5 посреднички сервер." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "СОЦКСв5 посредник захтева потврђивање идентитета." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "Овај СОЦКСв5 захтева начин пријављивања који ГБибл не подржава." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Корисничко име или лозинка су предуги за СОЦКСв5 протокол." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"СОЦКСв5 пријављивање није успело јер су корисничко име или лозинка погрешни." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Име домаћина „%s“ је предуго за СОЦКСв5 протокол" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Овај СОЦКСв5 сервер посредник користи непознати тип адресе." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Унутрашња грешка СОЦКСв5 сервера посредника." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "СОЦКСв5 веза није дозвољена од стране скупа правила." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Домаћин недоступан кроз СОЦКСв5 сервер." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Мрежа недоступна кроз СОЦКСв5 сервер." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Веза одбијена кроз СОЦКСв5 посредника." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "СОЦКСв5 посредник не подржава наредбу „connect“." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "СОЦКСв5 посредник не подржава дати тип адресе." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Непозната грешка СОЦКСв5 посредника." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Не могу да радим са издањем кодирања %d иконице ГТемирања" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка у разрешавању „%s“: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка у обрнутом разрешавању „%s“: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Нема ДНС записа затражене врсте за „%s“" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Привремено не могу да разрешим „%s“" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "Грешка у разрешивању „%s“" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Не могу да дешифрујем ПЕМ шифровани приватни кључ" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Нисам пронашао ПЕМ шифровани приватни кључ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Не могу да рашчланим ПЕМ шифровани приватни кључ" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Нисам пронашао ПЕМ шифровано уверење" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Не могу да рашчланим ПЕМ шифровано уверење" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ово је последња прилика да исправно унесете лозинку пре него што ваш приступ " +"буде закључан." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Неколико унешених лозинки је било неисправно, и зато ће ваш приступ бити " +"закључан након будућих неуспеха." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Унешена лозинка је погрешна." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очекујем једну контролну поруку, добио сам %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Неочекивана врста подређених података" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очекујем једно fd, добио сам %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Примљен је неисправни fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "Грешка у слању акредитива: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Грешка приликом провере да ли је SO_PASSCRED омогућен за утичницу: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Грешка приликом омогућавања SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Очекивано да се прочита један бајт за добијање акредитива, али је прочитано " +"нула бајтова" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Не очекивах контролну поруку, али добих %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Грешка приликом онемогућавања SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Грешка приликом читања из описивача датотеке: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Грешка приликом затварања описника датотеке: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Корени систем датотека" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Грешка приликом писања у описивач датотеке: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Апстрактна ЈУНИКС утичница адреса домена није подржана на овом систему" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "диск не подржава „избаци“ или „избаци_са_радњом“" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Не могу да нађем програм" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Грешка при покретању програма: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Адресе нису подржане" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "нису подржане промене придруживања за win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Нису подржане промене придруживања за win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Грешка приликом читања ручке: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Грешка приликом затварања ручке: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Грешка приликом уписа у ручку: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Нема довољно меморије" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Унутрашња грешка: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Потребан је већи унос" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Подаци нису исправно запаковани" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Адреса на којој вршити ослушкивање" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Занемарено, због сагласности са ГТестДмагистралом" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Исписује адресу" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Исписује адресу у режиму шкољке" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Покреће услугу д-магистрале" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "Погрешни аргументи\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочекивано својство „%s“ елемента „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Својство „%s“ елемента „%s“ није пронађено" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочекивана ознака „%s“, очекивана је „%s“" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочекивана ознака „%s“ унутар „%s“" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Не могу да нађем исправну датотеку са обележивачима међу фасциклама са " +"подацима" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Обележивач за адресу „%s“ већ постоји" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Није пронађен обележивач за адресу „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "У обележивачу за адресу „%s“ није одређена МИМЕ врста" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "У обележивачу за адресу „%s“ није одређена приватна заставица" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "У обележивачу за адресу „%s“ нису одређене групе" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Програм „%s“ није регистровао обележивач за „%s“" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не могу да проширим комадну линију „%s“ са адресом „%s“" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Непотпун низ знакова на крају улаза" + +# ово претпостављам да се односи на делимичан УТФ8 запис +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Не може претворити резерву „%s“ у запис „%s“" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адреса локалне датотеке „%s“ не сме садржати „#“" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адреса „%s“ је неисправна" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Име домаћина из адресе „%s“ је неисправно" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путања „%s“ није апсолутна путања" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Неисправно име домаћина" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ПрП" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "ПоП" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %d. %B %Y. %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%T" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Јануар" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Фебруар" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Март" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Април" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Мај" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Јун" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Јул" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Август" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Септембар" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Октобар" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Новембар" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Децембар" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Јан" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Феб" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Мар" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Апр" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Мај" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Јун" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Јул" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Авг" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Сеп" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Окт" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Нов" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Дец" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Понедељак" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Уторак" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Среда" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Четвртак" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Петак" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Субота" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Недеља" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Пон" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Уто" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Сре" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Чет" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Пет" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Суб" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Нед" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +# bug: plural-forms +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %ld byte to read file \"%s\"" +#| msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Не могу да доделим %lu бајт за читање датотеке „%s“" +msgstr[1] "Не могу да доделим %lu бајта за читање датотеке „%s“" +msgstr[2] "Не могу да доделим %lu бајтова за читање датотеке „%s“" +msgstr[3] "Не могу да доделим %lu бајт за читање датотеке „%s“" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Датотека „%s“ је превелика" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не могу да прочитам из датотеке „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Нисам успео да отворим датотеку „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не могу да сазнам особине датотеке „%s“: неуспешан fstat(): %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспешан fdopen(): %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Не могу да преименујем датотеку „%s“ у „%s“: неуспешан g_rename(): %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“ ради уписа: неуспешан fdopen(): %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fwrite(): %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fflush(): %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не могу да упишем у датотеку „%s“: неуспешан fsync(): %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не могу да затворим датотеку „%s“: неуспешан fclose(): %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Постојећа датотека „%s“ се не може уклонити: неуспешан g_unlink(): %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Неисправан шаблон „%s“, не сме садржати „%s“" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон „%s“ не садржи XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "Симболичке везе нису подржане" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "Не могу да покренем претварање из „%s“ у „%s“: %s" + +#: ../glib/giochannel.c:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Не могу да обавим сирово читање ниске_г_уи_канала_читања_реда" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Преостали непретворени подаци у баферу за читање" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Канал се завршава делимичним знаком" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Не могу да читам без обраде у g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Не могу да нађем исправну датотеку са кључевима међу директоријумима претраге" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "Није обична датотека" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Датотека са кључевима садржи ред „%s“ што не чини пар кључ-вредност, групу " +"или примедбу" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неисправан назив групе: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Датотека са кључевима не почиње групом" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неисправан назив кључа: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Датотека са кључевима садржи неподржано кодирање „%s“" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Датотека са кључевима нема групу „%s“" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Датотека са кључевима нема кључ „%s“" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "Датотека са кључевима садржи кључ „%s“ вредности „%s“ што није УТФ-8" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "Датотека са кључевима садржи кључ „%s“ неразумљиве вредности." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Датотека са кључевима садржи кључ „%s“ у групи „%s“ неразумљиве вредности." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Кључ „%s“ у групи „%s“ има вредност „%s“ где је очекивано %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Датотека са кључевима не садржи кључ „%s“ у групи „%s“" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "Датотека са кључевима садржи знак истицања на крају реда" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Датотека са кључевима садржи недозвољен низ истицања „%s“" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Вредност „%s“ се не може сматрати бројем." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Целобројна вредност „%s“ је изван опсега" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Вредност „%s“ се не може сматрати реалним бројем једноструке тачности." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Вредност „%s“ се не може сматрати истинитосном." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Не могу да сазнам особине датотеке „%s%s%s%s“: неуспешан fstat(): %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Не могу да мапирам датотеку „%s%s%s%s“: неуспешан mmap(): %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспешан open(): %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка у %d. реду, %d. знак: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неисправан УТФ-8 текст у имену — „%s“ није исправно" + +#: ../glib/gmarkup.c:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "„%s“ није исправан назив" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "„%s“ није исправан назив: „%c“" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка у %d. реду: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Знаковна референца „%-.*s“ не представља дозвољени знак" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Уочен празан ентитет „&;“; прихватљиви ентитети су & " < > " +"'" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Име ентитета „%-.*s“ није познато" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ мора почети елементом (нпр. <књига>)" + +#: ../glib/gmarkup.c:1159 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не представља исправан знак након знака „<“; назив елемента не може " +"њиме почети" + +#: ../glib/gmarkup.c:1227 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Чудан знак „%s“, а очекиван је „>“ знак ради окончања ознаке празног " +"елемента „%s“" + +#: ../glib/gmarkup.c:1311 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Чудан знак „%s“, очекиван је „=“ после имена атрибута „%s“ елемента „%s“" + +#: ../glib/gmarkup.c:1352 +#, 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:1396 +#, 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:1529 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак " +"је „>“" + +#: ../glib/gmarkup.c:1576 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената" + +#: ../glib/gmarkup.c:1585 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“" + +#: ../glib/gmarkup.c:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Документ је празан или садржи само белине" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ завршен неочекивано са отвореним елементима — „%s“ је последње " +"отворен елемент" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ је завршен неочекивано, а очекивана је затворена косоугла заграда " +"која затвара ознаку <%s/>" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ завршен неочекивано усред имена елемента" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ завршен неочекивано усред имена атрибута" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ завршен неочекивано усред почетне ознаке елемента." + +#: ../glib/gmarkup.c:1806 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ завршен неочекивано након знака једнакости после имена атрибута; " +"вредност атрибута није наведена" + +#: ../glib/gmarkup.c:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ завршен неочекивано усред вредности атрибута" + +#: ../glib/gmarkup.c:1829 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“" + +#: ../glib/gmarkup.c:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ завршен неочекивано усред примедбе или упута за обраду" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Употреба:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ОПЦИЈА...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Помоћне опције:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Приказује опције за помоћ" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Приказује све опције за помоћ" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Опције програма:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не могу да рашчланим целобројну вредност „%s“ за %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Целобројна вредност „%s“ за %s је изван опсега" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не могу да рашчланим реалну вредност двоструке тачности „%s“ за %s" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Реална вредност двоструке тачности „%s“ за %s је изван опсега" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "Грешка при рашчлањивању могућности %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Недостаје аргумент за %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Непозната опција %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "оштећен објекат" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "интерна грешка или оштећен објекат" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "нема више меморије" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "достигнут је лимит претраживања уназад" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "образац садржи ставке које нису подржане за делимично поклапање" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"референце на претходно поклапање не могу бити услов за делимично поклапање" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "достигнут је лимит рекурзије" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "неисправна комбинација ознака за нову линију" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "лош померај" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "кратaк утф8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "дубинско вртење кроз директоријуме" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "непозната грешка" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ на крају обрасца" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c на крају обрасца" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "непознат знак следи након \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "бројеви нису по реду у {} бројачу" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "бројеви су превелики у {} бројачу" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "недостаје завршница ] за класу знакова" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "неисправан избегавачки низ у класи знакова" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "опсег је неисправан унутар класе знакова" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "нема ничега за понављање" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "неочекивано понављање" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "непознат знак након (? или (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "класе именоване ПОСИКС-ом су подржане само унутар класе" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "недостаје завршница )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "референца на непостојећи подобразац" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "недостаје ) након коментара" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "регуларни израз је предуг" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "не могу да добијем меморију" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") без отварања (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "прекорачење кода" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "непознат знак након (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "подаци иза тврдње нису задате дужине" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "неисправно задат број или назив након (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "условна група садржи више од две гране" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "након(?R или (?[+-]бројева мора да следи )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "непознат назив ПОСИКС класе" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "нису подржани ПОСИКС колациони елементи" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "превелика је вредност карактера у \\x{...} секвенци" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "неисправан је услов (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "није дозвољено \\C у подацима иза тврдње" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "знаци за промену реда „\\L, \\l, \\N{назив}, \\U, \\u“ нису подржани" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "дубински захтев се може понављати бесконачно" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "непознат знак након (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "недостаје завршница у називу подобрасца" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "двоимени подобрасци имају исто име" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "није исправно задата \\P или \\p секвенца" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "није познат назив особине након \\P или \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "назив подобрасца је предуг (највише 32 знака)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "има превише именованих подобразаца (сме их бити највише 10000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "осмобројна вредност је већа од \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "превише покренутих радних простора за превођење изворног кода" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "није нађен претходно проверени и повезани подобразац" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE група садржи више од једне гране" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "неуједначене NEWLINE опције" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"иза „\\g“ се не налази назив или број у загради, угластој загради, или под " +"наводницима, или обичан број" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "нумерисана референца не сме бити нула" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "аргумент није дозвољен за (*ACCEPT), (*FAIL), или (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) није препознато" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "број је превелик" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "недостаје назив подобрасца након (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "очекивана је цифра након (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] је неисправан знак података у режиму сагласности скрипте Јаве" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "различити називи за подобрасце истог броја нису дозвољени" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) мора да садржи аргумент" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "иза „\\c“ мора да следи АСКРИ знак" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"иза „\\k“ се не налази назив у загради, угластој загради, или под наводницима" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "„\\N“ није подржано у разреду" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "превише референци прослеђивања" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "назив је предуг у (*MARK), (*PRUNE), (*SKIP), или (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "вредност знака у низу „\\u....“ је превелика" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Грешка приликом претраживања регуларним изразом %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ПЦРЕ библиотека је преведена без подршке за УТФ8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "ПЦРЕ библиотека је преведена без подршке за УТФ8 особине" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "ПЦРЕ библиотека је преведена са несагласним опцијама" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка при превођењу регуларног израза %s код знака %d: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Грешка при оптимизовању регуларног израза %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "очекивана је хексадекадна цифра или „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "очекивана је хексадекадна цифра" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "недостаје „<“ у референци симбола" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "Недовршена референца симбола" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "референца симбола је дужине нула" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "очекивана је цифра" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "неисправна референца симбола" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "одлутало завршно „\\“" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "непозната секвенца избегавања" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "Грешка приликом обраде текста за замену „%s“ код карактера %lu: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Навод не почиње наводником" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Неупарен наводник у наредби или другом цитату из љуске" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Садржај завршен пре наиласка на одговарајући наводник за %c. (Ради се о " +"тексту „%s“)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Садржај празан (или садржи само белине)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспело читање података од потпроцеса (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочекивана грешка у функцији „select()“ приликом читања података из " +"потпроцеса (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Потпроцес је изашао са шифром %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Потпроцес је убијен сигналом %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Потпроцес је заустављен сигналом %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Потпроцес је неочекивано прекинут" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Нисам успео да читам из спојке порода (%s)" + +# за сада овако, можда гранање, умножавање? виљушкање ;-) +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Нисам успео да исцепим (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Нисам успео да пређем у директоријум „%s“ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Нисам успео да извршим потпроцес „%s“ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Нисам успео да преусмерим улаз или излаз потпроцеса (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Нисам успео да исцепим потпроцес (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршавању потпроцеса „%s“" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Није успео да прочита довољно података из цевке ка потпроцесу (%s)" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Нисам успео да направим спојку за везу са потпроцесом (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Нисам успео да читам податке из потпроцеса" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Није исправна ниска — члан вектора у %d: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Није исправна ниска у окружењу: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Није исправна радна фасцикла: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Нисам успео да извршим помоћнички програм (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци из " +"потпроцеса" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Знак ван опсега за УТФ-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Није исправан низ у уносу за претварање" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Знак ван опсега за УТФ-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u бајт" +msgstr[1] "%u бајта" +msgstr[2] "%u бајта" +msgstr[3] "Један бајт" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s бајт" +msgstr[1] "%s бајта" +msgstr[2] "%s бајтова" +msgstr[3] "Један бајт" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/sr@ije.po b/po/sr@ije.po new file mode 100644 index 0000000..1314554 --- /dev/null +++ b/po/sr@ije.po @@ -0,0 +1,3833 @@ +# Serbian translation of glib +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003, 2004. +# +# This file is distributed under the same license as the glib package. +# +# Maintainer: Данило Шеган +# Reviewed on 2004-02-01 by: Данило Шеган +# +msgid "" +msgstr "" +"Project-Id-Version: 2.4\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2004-04-29 01:11+0200\n" +"Last-Translator: Bojan Suzic \n" +"Language-Team: Serbian (sr) \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Претварање из скупа знакова „%s“ у „%s“ није подржано" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не могу да покренем претварање из „%s“ у „%s“" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Грешка при претварању: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Непотпун низ знакова на крају улаза" + +# ово претпостављам да се односи на делимичан УТФ8 запис +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "Адреса „%s“ није апсолутна адреса помоћу „file“ шеме" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Адреса локалне датотеке „%s“ не смије садржати „#“" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Адреса „%s“ је неисправна" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Име домаћина из адресе „%s“ је неисправно" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Путања „%s“ није апсолутна путања" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Неисправно име домаћина" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %d. %B %Y. %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y." + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%T" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "јануар" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "фебруар" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "март" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "април" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "мај" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "јун" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "јул" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "јан" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "феб" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "мар" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "апр" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "мај" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "јун" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "јул" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "понедељак" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "уторак" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "среда" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "четвртак" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "петак" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "субота" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "недеља" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "пон" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "уто" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "сре" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "чет" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "пет" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "суб" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "нед" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +# bug: plural-forms +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Не могу да прочитам из датотеке „%s“: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Не могу да отворим датотеку „%s“: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Не могу да сазнам особине датотеке „%s“: неуспјешан fstat(): %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:862 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../glib/gfileutils.c:918 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Неисправан шаблон „%s“, не смије садржати „%s“" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон „%s“ се не завршава са XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Не могу да отворим датотеку „%s“: неуспјешан fdopen(): %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Грешка у %d. реду, %d. знак: %s" + +# ознака знака??? неееее +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Неисправан текст у УТФ-8 запису" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Грешка у %d. реду: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Позив знака „%s“ не стоји за дозвољени знак" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Уочен празан ентитет „&;“; прихватљиви ентитети су & " < > " +"'" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ентитет „%s“ није познат" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ мора почети елементом (нпр. <књига>)" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"„%s“ не представља исправан знак након знака „<“; име елемента не може њиме " +"почети" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Чудан знак „%s“, а очекивао сам „>“ знак ради окончања почетне ознаке " +"елемента „%s“" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Чудан знак „%s“, очекивао сам „=“ после особине „%s“ елемента „%s“" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"„%s“ није исправан знак након имена затвореног елемента „%s“; дозвољени знак " +"је „>“" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Елемент „%s“ је затворен, нема тренутно отворених елемената" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Елемент „%s“ је затворен, а тренутно отворен елемент је „%s“" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Документ је празан или садржи само бјелине" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ завршен неочекивано непосредно након отворене косоугле заграде „<“" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ завршен неочекивано са отвореним елементима — „%s“ је последње " +"отворен елемент" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ завршен неочекивано, очекивао сам да наиђем на затворену косоуглу " +"заграду која затвара ознаку <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ завршен неочекивано усред имена елемента" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ завршен неочекивано усред имена особине" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ завршен неочекивано усред почетне ознаке елемента." + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ завршен неочекивано након знака једнакости после имена особине; " +"вриједност особине није наведена" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ завршен неочекивано усред вриједности особине" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "Документ завршен неочекивано усред завршне ознаке елемента „%s“" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ завршен неочекивано усред примедбе или упута за обраду" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Канал се завршава дјелимичним знаком" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +# позив уместо ознака? +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Недовршен позив знака" + +# позив уместо ознака? +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Недовршен позив знака" + +# позив уместо ознака? +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Недовршен позив знака" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Симболичке везе нису подржане" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Грешка у %d. реду, %d. знак: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Недовршена ознака ентитета" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Навод не почиње наводником" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Неупарен наводник у наредби или другом цитату из љуске" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Садржај завршен непосредно након „\\“ знака. (Ради се о тексту „%s“)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Садржај завршен прије наиласка на одговарајући наводник за %c. (Ради се о " +"тексту „%s“)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Садржај празан (или садржи само бјелине)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Неуспјело читање података из подређеног процеса" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Неуспјело стварање цјевке за везу са подређеним процесом (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Неуспјело читање из подређене цјевке (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Неуспјело приступање директоријуму „%s“ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Неуспјело извршавање подређеног процеса (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Неисправно име домаћина" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Неисправан низ у уносу за претварање" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Неуспјело извршавање помоћног програма" + +# Овај превод није психолошке природе :) +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочекивана грешка док су у g_io_channel_win32_poll() читани подаци од " +"подређеног процеса" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Неуспјело читање података од подређеног процеса (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочекивана грешка у select() при читању података од подређеног процеса (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочекивана грешка у waitpid() (%s)" + +# за сада овако, можда гранање, умножавање? виљушкање ;-) +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Неуспио fork() (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Неуспјело извршавање подређеног процеса „%s“ (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Неуспјело преусмјеравање улаза или излаза подређеног процеса (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Неуспио fork() подређеног процеса (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Непозната грешка при извршавању подређеног процеса „%s“" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" +"Није успио да прочита довољно података из цјевке ка подређеном процесу (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "Знак ван опсега за УТФ-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Неисправан низ у уносу за претварање" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Знак ван опсега за УТФ-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Грешка при претварању: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Неисправно име домаћина" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Неисправно име домаћина" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Адреса „%s“ садржи неисправно назначене знаке" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Неисправан низ бајтова у улазу који претварам" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Симболичке везе нису подржане" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Грешка у %d. реду: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Грешка при претварању: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Знак „%s“ није дозвољен у имену ентитета" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Знак „%s“ није дозвољен у имену ентитета" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Знак „%s“ није дозвољен у имену ентитета" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Грешка при претварању: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Грешка при претварању: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Симболичке везе нису подржане" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Симболичке везе нису подржане" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Симболичке везе нису подржане" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Неисправно име домаћина" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Неисправно име домаћина" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Не могу да прочитам симболичку везу „%s“: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Документ завршен неочекивано усред имена особине" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Грешка при отварању директоријума „%s“: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Грешка у %d. реду: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Симболичке везе нису подржане" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Неисправно име домаћина" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +# bug: plural-forms +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Не могу да обезбједим %lu бајтова за читање датотеке „%s“" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не могу да направим датотеку „%s“: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Симболичке везе нису подржане" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Грешка у %d. реду: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Грешка при претварању: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Симболичке везе нису подржане" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Грешка при читању датотеке „%s“: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/sr@latin.po new file mode 100644 index 0000000..58c6c4b --- /dev/null +++ b/po/sr@latin.po @@ -0,0 +1,4380 @@ +# Serbian translation of glib +# Courtesy of Prevod.org team (http://prevod.org/) -- 2003 - 2012. +# 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ć +# MiloÅ¡ Popović , 2010. +# Branko Kokanović , 2010. +# Miroslav Nikolić , 2011—2013. +msgid "" +msgstr "" +"Project-Id-Version: 2.8\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&k" +"eywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-24 23:17+0000\n" +"PO-Revision-Date: 2013-02-18 10:33+0200\n" +"Last-Translator: Miroslav Nikolić \n" +"Language-Team: Serbian \n" +"Language: sr\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==1? 3 : n%10==1 && n%100!=11 ? 0 : " +"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Project-Style: gnome\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "Prevelika brojčana vrednost je prosleđena u %s" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Nije podržavano premotavanje osnovnog toka" + +#: ../gio/gbufferedinputstream.c:945 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Ne mogu da skratim ulazni tok u Gmeđumemoriji" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "Tok je već zatvoren" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Nije podržano sasecanje osnovnog toka" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "Radnja je otkazana" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Neispravan objekat, nije pokrenuto" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "Nepotpun niz bajtova na ulazu" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Nema dovoljno mesta u odrediÅ¡tu" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Neispravan niz bajtova u ulazu koji pretvaram" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "GreÅ¡ka prilikom pretvaranja: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:991 +msgid "Cancellable initialization not supported" +msgstr "Nije podržano pokretanje uz mogućnost otkazivanja" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Pretvaranje iz skupa znakova „%s“ u „%s“ nije podržano" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Ne mogu da pokrenem pretvaranje iz „%s“ u „%s“" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s vrsta" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Nepoznata vrsta" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s vrsta datoteke" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "Guverenja nisu podržana na operativnom sistemu" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "Nemate podrÅ¡ku za Guverenja na ovoj platformi" + +#: ../gio/gcredentials.c:480 +msgid "GCredentials does not contain a process ID on this OS" +msgstr "Guverenja ne sadrže IB procesa na ovom operativnom sistemu" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Neočekivan, preran kraj toka" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Ključ „%s“ nije podržan unutar adrese „%s“" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Adresa „%s“ je neispravna (potrebna samo jedna putanja, privremeni " +"direktorijum ili apstraktni ključ)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Beznačajna kombinacija ključ/vrednost unutar adrese „%s“" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "GreÅ¡ka unutar adrese „%s“ — port nije ispravno upisan" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "GreÅ¡ka unutar adrese „%s“ — atribut familije je neispravno upisan" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Element adrese „%s“ ne sadrži dve tačke (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "" +"Par ključ/vrednost %d, „%s“, u elementu adrese „%s“ ne sadrži znak jednakosti" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"GreÅ¡ka pri neizbegavanju ključa ili vrednosti u paru Ključ/Vrednosti %d, „%s“, " +"u elementu adrese „%s“" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"GreÅ¡ka u adresi „%s“ — Juniksov prenos zahteva postavljanje ključa " +"„path“ (putanja) ili „abstract“ (rezime)" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" +"GreÅ¡ka unutar adrese „%s“ — atribut domaćina nedostaje ili je neispravan" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "GreÅ¡ka unutar adrese „%s“ — port nedostaje ili je neispravan" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" +"GreÅ¡ka unutar adrese „%s“ — atribut datoteke jednokratnih slučajnih brojeva " +"nedostaje ili je neispravan" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "GreÅ¡ka u samopokretanju: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Nepoznati ili nepodržani prenos „%s“ za adrese „%s“" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "" +"GreÅ¡ka prilikom otvaranja datoteke jednokratnih slučajnih brojeva „%s“: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke jednokratnih slučajnih brojeva „%s“: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"GreÅ¡ka pri čitanju datoteke jednokratnih slučajnih brojeva „%s“, očekivano 16 " +"bajtova, a dobijeno %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "" +"GreÅ¡ka prilikom upisa sadržaja datoteke jednokratnih slučajnih brojeva „%s“ " +"u tok:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "Data adresa je prazna" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "Ne mogu da pokrenem magistralu poruka kada podeÅ¡avam jib" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Ne mogu da pokrenem magistralu poruka bez identifikacije maÅ¡ine: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "GreÅ¡ka pri pokretanju naredbe „%s“: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(UpiÅ¡ite bilo koji znak da zatvorite ovaj prozor)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "D-magistrala sesije nije pokrenuta, samopokretanje nije uspelo" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Ne mogu da odredim adresu magistrale sesije (nije napravljeno za ovaj " +"operativni sistem)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Ne mogu da odredim adresu magistrale sesije iz promenljive okruženja " +"DBUS_STARTER_BUS_TYPE — nepoznata vrednost „%s“" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Ne mogu da odredim adresu magistrale sesije jer nije postavljena promenljiva " +"okruženja DBUS_STARTER_BUS_TYPE" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "Nepoznat tip magistrale %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Neočekivani nedostatak sadržaja pri čitanju linije" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Neočekivani nedostatak sadržaja pri (sigurnom) čitanju linije" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"IstroÅ¡eni su svi dostupni mehanizmi prijavljivanja (pokuÅ¡ano: %s) (dostupno: " +"%s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "PoniÅ¡teno preko GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "GreÅ¡ka prilikom dobavljanja podataka za direktorijum „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Ovlašćenja fascikle „%s“ su neispravna. Očekivana vrednost je bila 0700, a " +"dobijeno je 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "GreÅ¡ka prilikom obrazovanja direktorijuma „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "GreÅ¡ka prilikom otvaranja priveska ključeva „%s“ za čitanje: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Linija %d priveska ključeva na „%s“ sa sadržajem „%s“ nije ispravna" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Prvi token linije %d priveska ključeva na „%s“ sa sadržajem „%s“ nije ispravan" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Drugi token linije %d priveska ključeva na „%s“ sa sadržajem „%s“ nije " +"ispravan" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Nisam naÅ¡ao kolačić sa identifikacijom %d u privesku ključeva na „%s“" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "GreÅ¡ka pri brisanju zaostale datoteke zaključavanja „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "GreÅ¡ka pri pravljenju datoteke zaključavanja „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "GreÅ¡ka prilikom zatvaranja (nepovezane) datoteke zaključavanja „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "GreÅ¡ka prilikom odvezivanju datoteke zaključavanja „%s“: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "GreÅ¡ka prilikom otvaranja priveska ključeva „%s“ za pisanje: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Dodatno, otpuÅ¡tanje ključa sa „%s“ takođe nije uspelo: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Veza je zatvorena" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Vreme je isteklo" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "NaiÅ¡ao sam na nepodržane oznake pri izgradnji klijentskog dela veze" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Nema interfejsa „org.freedesktop.DBus.Properties“ u objektu na putanji %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" +"GreÅ¡ka pri postavljanju osobine „%s“: Očekivani tip je bio „%s“, a dobijen je " +"„%s“" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Nema osobine „%s“" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Osobina „%s“ nije čitljiva" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Nije moguće pisanje osobine „%s“" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "Nema interfejsa „%s“" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Nema takvog interfejsa" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Nema interfejsa „%s“ u objektu na putanji %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Nema metoda „%s“" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Tpi poruke, „%s“, ne odgovara očekivanom tipu „%s“" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Objekat je već izvezen za interfejs %s na %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metod „%s“ je vratio tip „%s“, ali je bio očekivan „%s“" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metod „%s“ na interfejsu „%s“ sa potpisom „%s“ ne postoji" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Poddrvo je već izvezeno za %s" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "vrsta je NEISPRAVNA" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "Poruka POZIVA_METODA: nedostaju polja zaglavlja PUTANJA ili ČLAN" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Poruka REZULTAT_METODA: nedostaje polje zaglavlja ODGOVORI_SERIJSKI" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Poruka GREÅ KE: nedostaju polja zaglavlja ODGOVORI_SERIJSKI ili NAZIV_GREÅ KE" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "Poruka SIGNALA: nedostaju polja zaglavlja PUTANJA, SUČELJE ili ČLAN" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Poruka SIGNALA: polje zaglavlja PUTANJA koristi rezervisanu vrednost „/org/" +"freedesktop/DBus/Local“" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Poruka SIGNALA: polje zaglavlja SUČELJE koristi rezervisanu vrednost „org." +"freedesktop.DBus.Local“" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "PokuÅ¡ah da čitam %lu bajt, ali dobih samo %lu" +msgstr[1] "PokuÅ¡ah da čitam %lu bajta, ali dobih samo %lu" +msgstr[2] "PokuÅ¡ah da čitam %lu bajtova, ali dobih samo %lu" +msgstr[3] "PokuÅ¡ah da čitam jedan bajt, ali dobih samo %lu" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Očekivao sam NUL bajt posle niske „%s“, ali sam naÅ¡ao bajt %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Očekivah ispravnu UTF-8 nisku, ali nađoh neispravne bajtove na bajt pomeraju " +"%d (dužina niske je %d). Ispravna niska do tog dela je bila „%s“" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Raščlanjena vrednost „%s“ nije ispravna putanja objekta D-magistrale" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Raščlanjena vrednost „%s“ nije ispravan potpis D-magistrale" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"NaiÅ¡ao sam na niz dužine %u bajt. Najveća dužina je 2<<26 bajta (64 MiB)." +msgstr[1] "" +"NaiÅ¡ao sam na niz dužine %u bajta. Najveća dužina je 2<<26 bajta (64 MiB)." +msgstr[2] "" +"NaiÅ¡ao sam na niz dužine %u bajtova. Najveća dužina je 2<<26 bajtova (64 " +"MiB)." +msgstr[3] "" +"NaiÅ¡ao sam na niz dužine jednog bajta. Najveća dužina je 2<<26 bajtova (64 " +"MiB)." + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Raščlanjena vrednost „%s“ za varijantu nije ispravan potpis D-magistrale" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"GreÅ¡ka pri deserijalizaciji Gvarijanta sa niskom vrste „%s“ iz žičanog " +"formata D-magistrale" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Neispravna vrednost za krajnjost. Očekivao sam 0x6c („l“) ili 0x42 („Bd) ali " +"sam naÅ¡ao vrednost 0x%02x" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Neispravna glavno izdanje protokola. Očekivano 1, ali nađeno %d" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Potpis zaglavlja sa potpisom „%s“ je nađen, ali je telo poruke prazno" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Raščlanjena vrednost „%s“ nije ispravan potpis D-magistrale (za telo poruke)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Nema zaglavlja potpisa u poruci, ali telo poruke ima %u bajt" +msgstr[1] "Nema zaglavlja potpisa u poruci, ali telo poruke ima %u bajta" +msgstr[2] "Nema zaglavlja potpisa u poruci, ali telo poruke ima %u bajtova" +msgstr[3] "Nema zaglavlja potpisa u poruci, ali telo poruke ima jedan bajt" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "Ne mogu da deserijalizujem poruku: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" +"GreÅ¡ka pri serijalizaciji Gvarijanta sa niskom vrste „%s“ iz žičanog formata " +"D-magistrale" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Poruka ima %d opisivača datoteke, ali zaglavlje ukazuje na %d opisivača " +"datoteke" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "Ne mogu da serijalizujem poruku: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Telo poruke ima potpis „%s“, ali nedostaje zaglavlje potpisa" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Telo poruke ima tip potpisa „%s“, ali potpis u polju zaglavlja je „%s“" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Telo poruke je prazno,,, ali je potpis u polju zaglavlja „(%s)“" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Dobijena je greÅ¡ka sa telom poruke tipa „%s“" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "Dobijena je greÅ¡ka sa praznim telom poruke" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Ne mogu da dobavim profil fizičkih delova: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Ne mogu da učitam „/var/lib/dbus/machine-id“ ili „/etc/machine-id“: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "GreÅ¡ka pri pozivu pokreni uslugu prema nazivu za %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Neočekivan odgovor %d od StartServiceByName(„%s“) metoda" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Ne mogu da pozovem metod; posrednik je za dobro znani naziv bez vlasnika, a " +"napravljen je bez G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START oznake" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Apstraktni imenski prostor nije podržan" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "" +"Ne mogu da navedem datoteku jednokratnih slučajnih brojeva pri povezivanju sa " +"serverom" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "" +"GreÅ¡ka prilikom upisa datoteke jednokratnih slučajnih brojeva na „%s“: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Niska „%s“ nije ispravni GJIB D-magistrale" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Ne mogu da sluÅ¡am na nepodržanom prenosnom mehanizmu „%s“" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "NAREDBA" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Naredbe:\n" +" help Prikazuje ovu informaciju\n" +" introspect Ispituje udaljeni objekat\n" +" monitor Nadgleda udaljeni objekat\n" +" call Poziva način na udaljenom objektu\n" +" emit OdaÅ¡ilja signal\n" +"\n" +"Koristite „%s NAREDBA --help“ da dobijete pomoć za pojedinačne naredbe.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "GreÅ¡ka: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "GreÅ¡ka pri raščlanjivanju XML-a dobijenog ispitivanjem: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "Povezivanje na sistemsku magistrali" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "Povezivanje na magistralu sesije" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "Povezivanje na zadatu D-bas adresu" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "Opcije krajnje tačke veze:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "Opcije koje određuju krajnju tačku veze" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "Nije navedena krajnja tačka veze" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Navedeno viÅ¡e krajnjih tačaka veze" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" +"Upozorenje: Prema podacima dobijenim ispitivanjem, interfejs „%s“ ne postoji\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Upozorenje: Prema podacima dobijenim ispitivanjem, metod „%s“ ne postoji na " +"interfejsu „%s“\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "Opcionalna destinacija signala (jedinstveno ime)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "Putanja objekta za emitovanje signala" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "Naziv signala i sučelja" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "Emituje signal." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "GreÅ¡ka u povezivanju: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "GreÅ¡ka: nije izabrana putanja objekta.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "GreÅ¡ka: %s nije ispravna putanja do objekata\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "GreÅ¡ka: signal nije naveden.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "GreÅ¡ka: signal mora biti potpuno odgovarajući naziv.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "GreÅ¡ka: „%s“ nije ispravan naziv sučelja\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "GreÅ¡ka: „%s“ nije ispravan naziv člana\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "GreÅ¡ka: „%s“ nije ispravan naziv jedinstvene magistrale.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "GreÅ¡ka pri obradi parametra %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "GreÅ¡ka ispiranja veze: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "Naziv odrediÅ¡ta na kome treba pozvati metod" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "Putanja objekta na kome treba pozvati metod" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "Ime metoda i interfejsa" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "Vreme isteka u sekundama" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "Pozivanje metoda na udaljenom objektu." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "GreÅ¡ka: Nije izabrano odrediÅ¡te\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "GreÅ¡ka: Nije izabrana putanja do objekta\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "GreÅ¡ka: Ime načina nije određeno\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "GreÅ¡ka: Ime načina „%s“ nije određeno\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "GreÅ¡ka pri obradi parametra %d vrste „%s“: %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "Naziv odrediÅ¡ta za ispitivanje" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "Putanja objekta za ispitivanje" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "Å tampa IksML" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "Preispituje članove" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "Samo Å¡tampa svojstva" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "Ispitajte udaljeni objekat." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "Naziv odrediÅ¡ta za nadgledanje" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "Putanja objekta za nadgledanje" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "Nadgledanje udaljenog objekta." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Neimenovano" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "Datoteka za radnu povrÅ¡ ne sadrži Exec unos" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "Ne mogu da nađem terminal radi pokretanja ovog programa" + +#: ../gio/gdesktopappinfo.c:1594 +#, 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:1598 +#, 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:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "Podacima o programu nedostaje identifikator" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Ne mogu da napravim datoteku radne povrÅ¡i %s" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "Proizvoljne odrednice za %s" + +#: ../gio/gdrive.c:394 +msgid "drive doesn't implement eject" +msgstr "uređaj ne podržava „izbaci“" + +#. Translators: This is an error +#. * message for drive objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gdrive.c:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "uređaj ne podržava „izbaci“ ili „izbaci_sa_operacijom“" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "nije podržano izvlačenje medijuma na uređaju" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "uređaj ne podržava „pokreni“" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "uređaj ne podržava „zaustavi“" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS podrÅ¡ka nije dostupna" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Ne mogu da radim sa izdanjem %d kodiranja GEmblema" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Neispravno zadat broj tokena (%d) u kodiranju GEmblema" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Ne mogu da radim sa izdanjem %d kodiranja ikonice GEmblema" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Nije ispravno zadat broj tokena (%d) u kodiranju ikonice GEmblema" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Očekivano je GEmblem za ikonicu GEmblema" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7115 ../gio/gfile.c:7205 ../gio/gfile.c:7289 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "Sadržano montiranje ne postoji" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "Ne mogu da umnožim preko direktorijuma" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "Ne mogu da umnožim direktorijum preko direktorijuma" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "Ciljna datoteka već postoji" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "Ne mogu da umnožim direktorijum i njegov sadržaj" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "Deljenje nije podržano" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "GreÅ¡ka prilikom deljenja datoteke: %s" + +#: ../gio/gfile.c:2952 +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "Nije podržano umnožavanje (reflink/clone) između montiranih uređaja" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "Umnožavanje (reflink/clone) nije podržano ili je neispravno" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "Umnožavanje (reflink/clone) nije podržano ili ne radi" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "Ne mogu da umnožim specijalnu datoteku" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "Data je neispravna simbolička veza" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "Nije podržano smeće" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Imena datoteka ne mogu da sadrže „%c“" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "nije podržano montiranje diska" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "Ni jedan program ne može da otvori ovu datoteku" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "Nabrajanje je zatvoreno" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "Brojanje datoteka ima neispunjenu radnju" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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 kodiranja ikonice GDatoteke" + +#: ../gio/gfileicon.c:247 +msgid "Malformed input data for GFileIcon" +msgstr "LoÅ¡i ulazni podaci za ikonicu GDatoteke" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "Tok ne podržava „propitaj_podatke“" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "Nije podržavano premotavanje toka" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "Sasecanje nije dozvoljenu nad ulaznim tokom" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "Sasecanje nije dozvoljeno nad tokom" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Nije ispravan broj tokena (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ne postoji vrsta za naziv klase %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Vrsta %s ne podržava sučelje GIkonice" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Vrsta %s ne pripada ni jednoj klasi" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Broj izdanja je loÅ¡e zadat: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s vrsta ne podržava „from_tokens()“ na sučelju GIkonice" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "Ne mogu da radim sa datim izdanjem kodiranja ikonice" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Nije navedena adresa" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Dužina %u je previÅ¡e duga za adresu" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adresa ima skup bitova preko dužine prefiksa" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Ne mogu da obradim „%s“ kao masku IP adrese" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Nema dovoljno mesta za adresu utičnice" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Nije podržana adresa utičnice" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "Tok radi jako dobro" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Element <%s> nije dozvoljen unutar <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Element <%s> nije dozvoljen na najviÅ¡em nivou" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Datoteka „%s“ se pojavljuje viÅ¡e puta u izvoru" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Nisam uspeo da pronađem „%s“ ni u jenom izvornom direktorijumu" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Nisam uspeo da pronađem „%s“ u tekućem direktorijumu" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Nepoznata opcija obrade „%s“" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Nisam uspeo da napravim privremenu datoteku: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"GreÅ¡ka obrade ulazne datoteke sa „xmllint“-om:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"GreÅ¡ka obrade ulazne datoteke sa „to-pixdata“-om:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "GreÅ¡ka pri čitanju datoteke „%s“: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "GreÅ¡ka pri sažimanju datoteke „%s“" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "tekst ne može da se pojavljuje unutar <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "naziv izlazne datoteke" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "DATOTEKA" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"Direktorijumi iz kojih će datoteke biti čitane (osnovno je tekući " +"direktorijum)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIREKTORIJUM" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "Stvara izlaz u formatu izabranom proÅ¡irenjem naziva ciljne datoteke" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "Stvara zaglavlje izvora" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Stvara izvorni kod korišćen da poveže datoteku resursa u vaÅ¡ kod" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "Stvara spisak zavisnosti" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "Ne stvara samostalno i ne beleži izvor" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "Ne izvozi funkcije; objavljuje ih „G_GNUC_UNUTRAÅ NJIM“" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "Naziv C odrednika korišćenog za stvoreni izvorni kod" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Prevodi odrednicu resursa u datoteku resursa.\n" +"Datoteke odrednice resursa imaju proÅ¡irenje „.gresource.xml“,\n" +"a datoteke resursa imaju proÅ¡irenje „.gresource“." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Treba da navedete tačno jedan naziv datoteke\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "prazni nazivi nisu dozvoljeni" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "neispravan naziv „%s“: nazivi moraju da počinju malim slovom" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"neispravan naziv „%s“: neispravan znak „%c“; samo mala slova, brojevi i " +"crtica („-“) su dozvoljeni." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "neispravan naziv „%s“: dve uzastopne crtice („--“) nisu dozvoljene." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "neispravan naziv „%s“: poslednji znak ne može da bude crtiica („-“)." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "neispravan naziv „%s“: najveća dužina je 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " je već navedeno" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ne mogu da dodam ključeve u Å¡emu „list-of“" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " je već navedeno" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" prekriva u ; koristite " +" da izmenite vrednost" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"tačno jedna stvar od „type“, „enum“ ili „flags“ mora biti navedena kao " +"atribut za " + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> nije (joÅ¡) definisano." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "neispravna vrsta niske GVarijanta „%s“" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " je dato, ali Å¡ema ne proÅ¡iruje niÅ¡ta" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "nema za preklapanje" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " je već navedeno" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " je već navedeno" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " proÅ¡iruje Å¡emu „%s“ koja joÅ¡ ne postoji" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " je spisak joÅ¡ nepostojeće Å¡eme „%s“" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Ne može biti spisak Å¡eme sa putanjom" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Ne mogu da proÅ¡irim Å¡emu sa putanjom" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" je spisak koji proÅ¡iruje koja nije spisak" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" proÅ¡iruje ali " +"„%s“ ne proÅ¡iruje „%s“" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "putanja, ako se navodi mora da počinje i zavrÅ¡ava sa kosom crtom" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "putanja spiska mora da se zavrÅ¡ava sa „:/“" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id=„%s“> je već navedeno" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Element <%s> nije dozvoljen na najviÅ¡em nivou" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "„--strict“ je navedeno; izlazim.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Čitava ova datoteka je zanemarena.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Zanemarujem ovu datoteku.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Ne postoji ključ „%s“ u Å¡emi „%s“ kao Å¡to je navedeno u datoteci zamene „%s“" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; zanemarujem zamenu za ovaj ključ.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " i „--strict“ je navedeno; izlazim.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"greÅ¡ka u analizi ključa „%s“ u Å¡emi „%s“ kao Å¡to je navedeno u datoteci " +"zamene „%s“: %s." + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Zanemarujem zamenu za ovaj ključ.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"preklapanje za ključ „%s“ u Å¡emi „%s“ u preklopljenoj datoteci „%s“ je izvan " +"opsega datog u Å¡emi" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"preklapanje za ključ „%s“ u Å¡emi „%s“ u preklopljenoj datoteci „%s“ nije u " +"spisku dozvoljenih izbora" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gde da skladiÅ¡tim „gschemas.compiled“ datoteku" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "Prekini pri bilo kojoj greÅ¡ci u Å¡emama" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "Ne upisuj „gschemas.compiled“ datoteku" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "Ne nameće ograničenja naziva ključa" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Prevodi sve datoteke Å¡ema GPodeÅ¡avanja u keÅ¡ Å¡ema.\n" +"Datoteke Å¡ema moraju da se zavrÅ¡avaju sa „.gschema.xml“,\n" +"a datoteke keÅ¡a imaju naziv „gschemas.compiled“." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Trebate navesti tačno jedan naziv fascikle\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "Nijedna datoteka sa Å¡emama nije nađena: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "ne radim niÅ¡ta.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "uklonjena postojeća izlazna datoteka.\n" + +#: ../gio/glocaldirectorymonitor.c:252 +msgid "Unable to find default local directory monitor type" +msgstr "Ne mogu da nađem podrazumevanu vrstu monitora za lokalni direktorijum" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Neispravan naziv datoteke %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "GreÅ¡ka prilikom dobijanja podataka o sistemu datoteka: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "Ne mogu da preimenujem koreni direktorijum" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "GreÅ¡ka u preimenovanju datoteke: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "Ne mogu da preimenujem datoteku, naziv datoteke već postoji" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "Neispravan naziv datoteke" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "Ne mogu da otvorim direktorijum" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "GreÅ¡ka prilikom otvaranja datoteke: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "GreÅ¡ka prilikom uklanjanja datoteke: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "GreÅ¡ka prilikom premeÅ¡tanja datoteke u smeće: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Ne mogu da napravim direktorijum za smeće %s: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "Ne mogu da nađem koreni direktorijum za smeće" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "Ne mogu da nađem ili napravim direktorijum za smeće" + +#: ../gio/glocalfile.c:2054 +#, 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:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Ne mogu da poÅ¡aljem datoteku u smeće: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "unutraÅ¡nja greÅ¡ka" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "GreÅ¡ka prilikom obrazovanja direktorijuma: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sistem datoteka ne podržava simboličke veze" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "GreÅ¡ka prilikom obrazovanja simboličke veze: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "GreÅ¡ka premeÅ¡tanja datoteke: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "Ne mogu da premestim direktorijum preko direktorijuma" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "Nije uspela izrada rezervne datoteke" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "GreÅ¡ka uklanjanja ciljne datoteke: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "Nije podržano premeÅ¡tanje između montiranih uređaja" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "Vrednost osobine mora biti različita od NULL" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "Nije ispravna vrsta atributa (očekivana je niska znakova)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "Nije ispravan naziv proÅ¡irene osobine" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "GreÅ¡ka prilikom postavljanja proÅ¡irene osobine „%s“: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (neispravno kodiranje)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "GreÅ¡ka prilikom dobavljanja podataka za datoteku „%s“: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "GreÅ¡ka prilikom dobavljanja podataka za opisnika datoteke: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Nije ispravna vrsta osobine („uint32“ je očekivano)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Nije ispravna vrsta osobine („uint64“ je očekivano)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "Nije ispravna vrsta osobine (očekivana je niska bitova)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "Ne mogu da postavim ovlašćenja za simboličke veze" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "GreÅ¡ka prilikom postavljanja ovlašćenja: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "GreÅ¡ka prilikom postavljanja vlasnika: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "simboličke veze moraju biti različite od NULL" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "GreÅ¡ka prilikom postavljanja simboličke veze: %s" + +#: ../gio/glocalfileinfo.c:2230 +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:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "GreÅ¡ka pri postavljanju datuma izmene ili pristupa: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "SELinuks kontekst ne sme biti NULL" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "GreÅ¡ka prilikom postavljanja SELinuks konteksta: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "SELinuks nije uključen na vaÅ¡em sistemu" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Nije podržano postavljanje osobine %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "GreÅ¡ka prilikom čitanja datoteke: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "GreÅ¡ka prilikom pretrage unutar datoteke: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "GreÅ¡ka prilikom zatvaranja datoteke: %s" + +#: ../gio/glocalfilemonitor.c:176 +msgid "Unable to find default local file monitor type" +msgstr "Ne mogu da pronađem podrazumevanu, lokalnu vrstu monitora datoteke" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "GreÅ¡ka prilikom upisa u datoteku: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "GreÅ¡ka prilikom uklanjanja stare rezervne kopije veze: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "GreÅ¡ka prilikom obrazovanja rezervne kopije: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "GreÅ¡ka prilikom preimenovanja privremene datoteke: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "GreÅ¡ka pri sasecanju datoteke: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "GreÅ¡ka prilikom otvaranja datoteke „%s“: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "Ciljna datoteka je direktorijum" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "Ciljna datoteka nije obična datoteka" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "Datoteka je izmenjena spoljnim programom" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "GreÅ¡ka prilikom uklanjanja stare datoteke: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "Nije ispravno određena vrsta GPretrage" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "Neispravan zahtev pretrage" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Ne mogu da skratim ulazni tok GMemorije" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "Veličina izlazne memorije se ne može promeniti" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "Ne mogu da promenim veličinu izlaznog memorijskog toka" + +#: ../gio/gmemoryoutputstream.c:648 +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:749 +msgid "Requested seek before the beginning of the stream" +msgstr "Zahtevano je premotavanje na deo pre početka toka" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "montiranje ne podržava usklađeno nalaženje vrste sadržaja" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Ime domaćina „%s“ sadrži „[“, ali ne i „]“" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Mreža je nedostižna" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Domaćin je nedostižan" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Ne mogu da napravim praćenje mreže: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "Ne mogu da napravim praćenje mreže: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "Ne mogu da dobavim stanje mreže: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "Izlazni tok ne podržava upis" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "Izvorni tok je već zatvoren" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Resurs „%s“ ne postoji" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Resurs na „%s“ nije uspeo da se raspakuje" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Resurs na „%s“ nije direktorijum" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "Ulazni tok ne podržava premotavanje" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "Å tampa pomoć" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[NAREDBA]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "Navodi odeljke koji sadrže resurse u elf DATOTECI" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Navodi resurse\n" +"Ako je dato ODELJAK, navodi samo resurse u tom odeljku\n" +"Ako je dato PUTANJA, navodi samo odgovarajuće resurse" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "DATOTEKA [PUTANJA]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "ODELJAK" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Navodi resurse sa pojedinostima\n" +"Ako je dato ODELJAK, navodi samo resurse u tom odeljku\n" +"Ako je dato PUTANJA, navodi samo odgovarajuće resurse\n" +"U pojedinosti spadaju odeljak, veličina i sažimanje" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "Izvlači datoteku resursa u standardni izlaz" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "PUTANJA DATOTEKE" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Nepoznata naredba „%s“\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Upotreba:\n" +" gresource [--section ODELJAK] NAREDBA [ARGUMENTI...]\n" +"\n" +"Naredbe:\n" +" help Prikazuje ovo obaveÅ¡tenje\n" +" sections Ispisuje odeljke resursa\n" +" list Ispisuje resurse\n" +" details Ispisuje resurse sa pojedinostima\n" +" extract Izvlači resurs\n" +"\n" +"Koristite „gresource help NAREDBA“ da prikažete opÅ¡irniju pomoć.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Korišćenje:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "Argumenti:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " ODELJAK Naziv (opcionalno) elf odeljka\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " NAREDBA Naredba (opcionalno) za objaÅ¡njavanje\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " DATOTEKA Elf datoteka (izvrÅ¡na ili deljena biblioteka)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" DATOTEKA Elf datoteka (izvrÅ¡na ili deljena biblioteka)\n" +" ili prevedena datoteka resursa\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PUTANJA]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PUTANJA Putanja (opcionalno) resursa (može biti delimična)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PUTANJA" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PUTANJA Putanja resursa\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Nema takve Å¡eme „%s“\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Å ema „%s“ nije premestljiva (putanja ne sme biti navedena)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Å ema „%s“ je premestljiva (putanja mora biti navedena)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "Data je prazna putanja.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Putanja mora početi kosom crtom (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Putanja mora da se zavrÅ¡i kosom crtom (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Putanja ne sme da sadrži dve susedne kose crte (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "Nema takvog ključa „%s“\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Obezbeđena vrednost je izvan važećeg opsega\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "Navodi instalirane (nepremestljive) Å¡eme" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "Navodi instalirane premestljive Å¡eme" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "Navodi ključeve u Å EMI" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "Å EMA [:PUTANJA]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "Navodi proistekle iz Å EME" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Navodi ključeve i vrednosti, rekurzivno\n" +"Ako SHEMA nije data, navodi sve ključeve\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[Å EMA[:PUTANJA]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "Dobavlja vrednost ključa" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "Å EMA [:PUTANJA] KLJUČ" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "Propituje opseg važećih vrednosti za KLJUČ" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "Postavlja vrednost KLJUČA na VREDNOST" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "Å EMA [:PUTANJA] KLJUČ VREDNOST" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "Ponovo postavlja KLJUČ na podrazumevanu vrednost" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Vraća sve ključeve u SHEMI na osnovne vrednosti" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "Proverava da li je KLJUČ upisiv" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Prati KLJUČ za izmenama.\n" +"Ako nije naveden nijedan KLJUČ, prati sve ključeve u Å EMI.\n" +"Koristite „^C“ da zaustavite praćenje.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "Å EMA [:PUTANJA] [KLJUČ]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Korišćenje:\n" +" gsettings [--schemadir Å EMADIR] NAREDBA [ARGUMENTI...]\n" +"\n" +"Naredba:\n" +" help Prikazuje ovu informaciju\n" +" list-schemas Navodi instalirane Å¡eme\n" +" list-relocatable-schemas Navodi premestljive Å¡eme\n" +" list-keys Navodi ključeve u Å¡emi\n" +" list-children Navodi proistekle iz Å¡eme\n" +" list-recursively Navodi ključeve i vrednosti, dubinski\n" +" range Propituje opseg ključa\n" +" get Nabavlja vrednost ključa\n" +" set PodeÅ¡ava vrednost ključa\n" +" reset Ponovo podeÅ¡ava vrednost ključa\n" +" writable Proverava da li je ključ upisiv\n" +" monitor Nadgleda izmene\n" +"\n" +"Koristite „gsettings help NAREDBA“ da dobijete detaljniju pomoć.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Korišćenje:\n" +" gsettings [--schemadir Å EMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " Å EMADIR Direktorijum za traženje dodatnih Å¡ema\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" Å EMA Ime Å¡eme\n" +" PUTANJA Putanja, za premestive Å¡eme\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KLJUČ (opcionalni) ključ unutar Å¡eme\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KLJUČ Ključ unutar Å¡eme\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VREDNOST Vrednost za podeÅ¡avanje\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "Dat je prazan naziv Å¡eme\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "Neispravna utičnica, nije pokrenuto" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Neispravna utičnica, pokretanje nije uspelo zbog: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "Utičnica je već zatvorena" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3525 ../gio/gsocket.c:3580 +msgid "Socket I/O timed out" +msgstr "Isteklo vreme za U/I utičnice" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "pravim GUtičnicu iz fd-a: %s" + +#: ../gio/gsocket.c:509 ../gio/gsocket.c:563 ../gio/gsocket.c:570 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Ne mogu da napravim utičnicu: %s" + +#: ../gio/gsocket.c:563 +msgid "Unknown family was specified" +msgstr "Zadata je nepoznata porodica" + +#: ../gio/gsocket.c:570 +msgid "Unknown protocol was specified" +msgstr "Zadat je nepoznati protokol" + +#: ../gio/gsocket.c:1728 +#, c-format +msgid "could not get local address: %s" +msgstr "ne mogu da dobijem lokalnu adresu: %s" + +#: ../gio/gsocket.c:1771 +#, c-format +msgid "could not get remote address: %s" +msgstr "ne mogu da dobijem udaljenu adresu: %s" + +#: ../gio/gsocket.c:1832 +#, c-format +msgid "could not listen: %s" +msgstr "ne mogu da sluÅ¡am: %s" + +#: ../gio/gsocket.c:1904 +#, c-format +msgid "Error binding to address: %s" +msgstr "greÅ¡ka pri povezivanju na adresu: %s" + +#: ../gio/gsocket.c:1957 ../gio/gsocket.c:1994 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "GreÅ¡ka prilikom pristupanja grupi viÅ¡estrukog emitovanja: %s" + +#: ../gio/gsocket.c:1958 ../gio/gsocket.c:1995 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "GreÅ¡ka prilikom napuÅ¡tanja grupe viÅ¡estrukog emitovanja: %s" + +#: ../gio/gsocket.c:1959 +msgid "No support for source-specific multicast" +msgstr "Nema podrÅ¡ke za posebno viÅ¡estruko emitovanje izvora" + +#: ../gio/gsocket.c:2178 +#, c-format +msgid "Error accepting connection: %s" +msgstr "greÅ¡ka u prihvatanju veze: %s" + +#: ../gio/gsocket.c:2299 +msgid "Connection in progress" +msgstr "Povezivanje je u toku" + +#: ../gio/gsocket.c:2346 +msgid "Unable to get pending error: " +msgstr "Ne mogu da dobijem greÅ¡ku na čekanju: " + +#: ../gio/gsocket.c:2512 +#, c-format +msgid "Error receiving data: %s" +msgstr "GreÅ¡ka u primanju podataka: %s" + +#: ../gio/gsocket.c:2690 +#, c-format +msgid "Error sending data: %s" +msgstr "GreÅ¡ka u slanju podataka: %s" + +#: ../gio/gsocket.c:2804 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Ne mogu da ugasim utičnicu: %s" + +#: ../gio/gsocket.c:2883 +#, c-format +msgid "Error closing socket: %s" +msgstr "GreÅ¡ka u zatvaranju utičnice: %s" + +#: ../gio/gsocket.c:3518 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Čekam uslov utičnice: %s" + +#: ../gio/gsocket.c:3796 ../gio/gsocket.c:3877 +#, c-format +msgid "Error sending message: %s" +msgstr "GreÅ¡ka pri slanju poruke: %s" + +#: ../gio/gsocket.c:3821 +msgid "GSocketControlMessage not supported on Windows" +msgstr "Poruka upravljanja Gutičnicom nije podržana na Vindouzu" + +#: ../gio/gsocket.c:4155 ../gio/gsocket.c:4290 +#, c-format +msgid "Error receiving message: %s" +msgstr "GreÅ¡ka pri primanju poruke: %s" + +#: ../gio/gsocket.c:4372 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Ne mogu da dobijem greÅ¡ku na čekanju: %s" + +#: ../gio/gsocket.c:4391 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_utičnica_dobavlja_uverenja nije primenjena za ovaj operativni sistem" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Ne mogu da se povežem na server posrednika „%s“: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Ne mogu da se povežem na „%s“: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Ne mogu da se povežem: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "Nepoznata greÅ¡ka veze" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Posredovanje preko veze koja nije TCP nije podržano." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Protokol posrednika „%s“ nije podržan." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "SluÅ¡anje je već zatvoreno" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Dodata utičnica je zatvorena" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ne podržava IPv6 adresu „%s“" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Korisničko ime je predugo za SOCKSv4 protokol" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Ime domaćina „%s“ je predugo za SOCKSv4 protokol" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Server nije SOCKSv4 server posrednik." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Veza kroz SOCKSv4 server je odbijena" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Server nije SOCKSv5 posrednički server." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 posrednik zahteva potvrđivanje identiteta." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "Ovaj SOCKSv5 zahteva način prijavljivanja koji GBibl ne podržava." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Korisničko ime ili lozinka su predugi za SOCKSv5 protokol." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"SOCKSv5 prijavljivanje nije uspelo jer su korisničko ime ili lozinka pogreÅ¡ni." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Ime domaćina „%s“ je predugo za SOCKSv5 protokol" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Ovaj SOCKSv5 server posrednik koristi nepoznati tip adrese." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "UnutraÅ¡nja greÅ¡ka SOCKSv5 servera posrednika." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 veza nije dozvoljena od strane skupa pravila." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Domaćin nedostupan kroz SOCKSv5 server." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Mreža nedostupna kroz SOCKSv5 server." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Veza odbijena kroz SOCKSv5 posrednika." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 posrednik ne podržava naredbu „connect“." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 posrednik ne podržava dati tip adrese." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Nepoznata greÅ¡ka SOCKSv5 posrednika." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Ne mogu da radim sa izdanjem kodiranja %d ikonice GTemiranja" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "GreÅ¡ka u razreÅ¡avanju „%s“: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "GreÅ¡ka u obrnutom razreÅ¡avanju „%s“: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Nema DNS zapisa zatražene vrste za „%s“" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Privremeno ne mogu da razreÅ¡im „%s“" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "GreÅ¡ka u razreÅ¡ivanju „%s“" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Ne mogu da deÅ¡ifrujem PEM Å¡ifrovani privatni ključ" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Nisam pronaÅ¡ao PEM Å¡ifrovani privatni ključ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Ne mogu da raščlanim PEM Å¡ifrovani privatni ključ" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Nisam pronaÅ¡ao PEM Å¡ifrovano uverenje" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Ne mogu da raščlanim PEM Å¡ifrovano uverenje" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"Ovo je poslednja prilika da ispravno unesete lozinku pre nego Å¡to vaÅ¡ pristup " +"bude zaključan." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Nekoliko uneÅ¡enih lozinki je bilo neispravno, i zato će vaÅ¡ pristup biti " +"zaključan nakon budućih neuspeha." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "UneÅ¡ena lozinka je pogreÅ¡na." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Očekujem jednu kontrolnu poruku, dobio sam %d" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "Neočekivana vrsta podređenih podataka" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Očekujem jedno fd, dobio sam %d\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "Primljen je neispravni fd" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "GreÅ¡ka u slanju akreditiva: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "GreÅ¡ka prilikom provere da li je SO_PASSCRED omogućen za utičnicu: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "GreÅ¡ka prilikom omogućavanja SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Očekivano da se pročita jedan bajt za dobijanje akreditiva, ali je pročitano " +"nula bajtova" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Ne očekivah kontrolnu poruku, ali dobih %d" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "GreÅ¡ka prilikom onemogućavanja SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "GreÅ¡ka prilikom čitanja iz opisivača datoteke: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "GreÅ¡ka prilikom zatvaranja opisnika datoteke: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2036 +msgid "Filesystem root" +msgstr "Koreni sistem datoteka" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "GreÅ¡ka prilikom pisanja u opisivač datoteke: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Apstraktna JUNIKS utičnica adresa domena nije podržana na ovom sistemu" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "disk ne podržava „izbaci“ ili „izbaci_sa_radnjom“" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Ne mogu da nađem program" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "GreÅ¡ka pri pokretanju programa: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Adrese nisu podržane" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "nisu podržane promene pridruživanja za win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Nisu podržane promene pridruživanja za win32" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "GreÅ¡ka prilikom čitanja ručke: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "GreÅ¡ka prilikom zatvaranja ručke: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "GreÅ¡ka prilikom upisa u ručku: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Nema dovoljno memorije" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "UnutraÅ¡nja greÅ¡ka: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Potreban je veći unos" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Podaci nisu ispravno zapakovani" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Adresa na kojoj vrÅ¡iti osluÅ¡kivanje" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Zanemareno, zbog saglasnosti sa GTestDmagistralom" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Ispisuje adresu" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "Ispisuje adresu u režimu Å¡koljke" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "Pokreće uslugu d-magistrale" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "PogreÅ¡ni argumenti\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Neočekivano svojstvo „%s“ elementa „%s“" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Svojstvo „%s“ elementa „%s“ nije pronađeno" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Neočekivana oznaka „%s“, očekivana je „%s“" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Neočekivana oznaka „%s“ unutar „%s“" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Obeleživač za adresu „%s“ već postoji" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Nije pronađen obeleživač za adresu „%s“" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "U obeleživaču za adresu „%s“ nije određena MIME vrsta" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "U obeleživaču za adresu „%s“ nije određena privatna zastavica" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "U obeleživaču za adresu „%s“ nisu određene grupe" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Program „%s“ nije registrovao obeleživač za „%s“" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Ne mogu da proÅ¡irim komadnu liniju „%s“ sa adresom „%s“" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +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:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Ne može pretvoriti rezervu „%s“ u zapis „%s“" + +#: ../glib/gconvert.c:1871 +#, 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:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Adresa lokalne datoteke „%s“ ne sme sadržati „#“" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Adresa „%s“ je neispravna" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ime domaćina iz adrese „%s“ je neispravno" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Adresa „%s“ sadrži neispravno naznačene znake" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Putanja „%s“ nije apsolutna putanja" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "Neispravno ime domaćina" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "PrP" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PoP" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %d. %B %Y. %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%T" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Januar" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februar" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Mart" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Jun" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Jul" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Avgust" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Septembar" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktobar" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Novembar" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Decembar" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Avg" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Ponedeljak" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Utorak" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Sreda" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Četvrtak" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Petak" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Subota" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Nedelja" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pon" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Uto" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Sre" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Čet" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Pet" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sub" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Ned" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "GreÅ¡ka pri otvaranju direktorijuma „%s“: %s" + +# bug: plural-forms +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %ld byte to read file \"%s\"" +#| msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %lu byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "Ne mogu da dodelim %lu bajt za čitanje datoteke „%s“" +msgstr[1] "Ne mogu da dodelim %lu bajta za čitanje datoteke „%s“" +msgstr[2] "Ne mogu da dodelim %lu bajtova za čitanje datoteke „%s“" +msgstr[3] "Ne mogu da dodelim %lu bajt za čitanje datoteke „%s“" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "GreÅ¡ka pri čitanju datoteke „%s“: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Datoteka „%s“ je prevelika" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Ne mogu da pročitam iz datoteke „%s“: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Nisam uspeo da otvorim datoteku „%s“: %s" + +#: ../glib/gfileutils.c:851 +#, 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:885 +#, 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:993 +#, 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:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Ne mogu da napravim datoteku „%s“: %s" + +#: ../glib/gfileutils.c:1049 +#, 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:1074 +#, 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:1093 +#, 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:1137 +#, 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:1161 +#, 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:1282 +#, 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:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Neispravan Å¡ablon „%s“, ne sme sadržati „%s“" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Å ablon „%s“ ne sadrži XXXXXX" + +#: ../glib/gfileutils.c:2097 +#, 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:2118 +msgid "Symbolic links not supported" +msgstr "Simboličke veze nisu podržane" + +#: ../glib/giochannel.c:1418 +#, 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:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Ne mogu da obavim sirovo čitanje niske_g_ui_kanala_čitanja_reda" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "Preostali nepretvoreni podaci u baferu za čitanje" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "Kanal se zavrÅ¡ava delimičnim znakom" + +#: ../glib/giochannel.c:1954 +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/gkeyfile.c:722 +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:758 +msgid "Not a regular file" +msgstr "Nije obična datoteka" + +#: ../glib/gkeyfile.c:1158 +#, 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:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "Neispravan naziv grupe: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "Datoteka sa ključevima ne počinje grupom" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "Neispravan naziv ključa: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Datoteka sa ključevima sadrži nepodržano kodiranje „%s“" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Datoteka sa ključevima nema grupu „%s“" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Datoteka sa ključevima nema ključ „%s“" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, 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:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, 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:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Datoteka sa ključevima sadrži ključ „%s“ u grupi „%s“ nerazumljive vrednosti." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Ključ „%s“ u grupi „%s“ ima vrednost „%s“ gde je očekivano %s" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, 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:4080 +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:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Datoteka sa ključevima sadrži nedozvoljen niz isticanja „%s“" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Vrednost „%s“ se ne može smatrati brojem." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Celobrojna vrednost „%s“ je izvan opsega" + +#: ../glib/gkeyfile.c:4291 +#, 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:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Vrednost „%s“ se ne može smatrati istinitosnom." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Ne mogu da saznam osobine datoteke „%s%s%s%s“: neuspeÅ¡an fstat(): %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Ne mogu da mapiram datoteku „%s%s%s%s“: neuspeÅ¡an mmap(): %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Ne mogu da otvorim datoteku „%s“: neuspeÅ¡an open(): %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "GreÅ¡ka u %d. redu, %d. znak: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, 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:472 +#, c-format +msgid "'%s' is not a valid name" +msgstr "„%s“ nije ispravan naziv" + +#: ../glib/gmarkup.c:488 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "„%s“ nije ispravan naziv: „%c“" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "GreÅ¡ka u %d. redu: %s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Znakovna referenca „%-.*s“ ne predstavlja dozvoljeni znak" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Uočen prazan entitet „&;“; prihvatljivi entiteti su & " < > " +"'" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Ime entiteta „%-.*s“ nije poznato" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokument mora početi elementom (npr. )" + +#: ../glib/gmarkup.c:1159 +#, 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 „<“; naziv elementa ne može " +"njime početi" + +#: ../glib/gmarkup.c:1227 +#, 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:1311 +#, 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:1352 +#, 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:1396 +#, 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:1529 +#, 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:1576 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Element „%s“ je zatvoren, nema trenutno otvorenih elemenata" + +#: ../glib/gmarkup.c:1585 +#, 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:1753 +msgid "Document was empty or contained only whitespace" +msgstr "Dokument je prazan ili sadrži samo beline" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Dokument zavrÅ¡en neočekivano neposredno nakon otvorene kosougle zagrade „<“" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, 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:1783 +#, 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:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokument zavrÅ¡en neočekivano usred imena elementa" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokument zavrÅ¡en neočekivano usred imena atributa" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokument zavrÅ¡en neočekivano usred početne oznake elementa." + +#: ../glib/gmarkup.c:1806 +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:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokument zavrÅ¡en neočekivano usred vrednosti atributa" + +#: ../glib/gmarkup.c:1829 +#, 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:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokument zavrÅ¡en neočekivano usred primedbe ili uputa za obradu" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Upotreba:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPCIJA...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Pomoćne opcije:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Prikazuje opcije za pomoć" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Prikazuje sve opcije za pomoć" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Opcije programa:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Ne mogu da raščlanim celobrojnu vrednost „%s“ za %s" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Celobrojna vrednost „%s“ za %s je izvan opsega" + +#: ../glib/goption.c:1014 +#, 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:1022 +#, 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:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "GreÅ¡ka pri raščlanjivanju mogućnosti %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Nedostaje argument za %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Nepoznata opcija %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "oÅ¡tećen objekat" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "interna greÅ¡ka ili oÅ¡tećen objekat" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "nema viÅ¡e memorije" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "dostignut je limit pretraživanja unazad" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "dostignut je limit rekurzije" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "neispravna kombinacija oznaka za novu liniju" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "loÅ¡ pomeraj" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "kratak utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "dubinsko vrtenje kroz direktorijume" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "nepoznata greÅ¡ka" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ na kraju obrasca" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c na kraju obrasca" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "nepoznat znak sledi nakon \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "brojevi nisu po redu u {} brojaču" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "brojevi su preveliki u {} brojaču" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "nedostaje zavrÅ¡nica ] za klasu znakova" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "neispravan izbegavački niz u klasi znakova" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "opseg je neispravan unutar klase znakova" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "nema ničega za ponavljanje" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "neočekivano ponavljanje" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "nepoznat znak nakon (? ili (?-" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "klase imenovane POSIKS-om su podržane samo unutar klase" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "nedostaje zavrÅ¡nica )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "referenca na nepostojeći podobrazac" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "nedostaje ) nakon komentara" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "regularni izraz je predug" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ne mogu da dobijem memoriju" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") bez otvaranja (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "prekoračenje koda" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "nepoznat znak nakon (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "podaci iza tvrdnje nisu zadate dužine" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "neispravno zadat broj ili naziv nakon (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "uslovna grupa sadrži viÅ¡e od dve grane" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "očekivana je tvrdnja nakon (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "nakon(?R ili (?[+-]brojeva mora da sledi )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "nepoznat naziv POSIKS klase" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "nisu podržani POSIKS kolacioni elementi" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "prevelika je vrednost karaktera u \\x{...} sekvenci" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "neispravan je uslov (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "nije dozvoljeno \\C u podacima iza tvrdnje" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "znaci za promenu reda „\\L, \\l, \\N{naziv}, \\U, \\u“ nisu podržani" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "dubinski zahtev se može ponavljati beskonačno" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "nepoznat znak nakon (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "nedostaje zavrÅ¡nica u nazivu podobrasca" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "dvoimeni podobrasci imaju isto ime" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "nije ispravno zadata \\P ili \\p sekvenca" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "nije poznat naziv osobine nakon \\P ili \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "naziv podobrasca je predug (najviÅ¡e 32 znaka)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ima previÅ¡e imenovanih podobrazaca (sme ih biti najviÅ¡e 10000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "osmobrojna vrednost je veća od \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "previÅ¡e pokrenutih radnih prostora za prevođenje izvornog koda" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "nije nađen prethodno provereni i povezani podobrazac" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grupa sadrži viÅ¡e od jedne grane" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "neujednačene NEWLINE opcije" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"iza „\\g“ se ne nalazi naziv ili broj u zagradi, uglastoj zagradi, ili pod " +"navodnicima, ili običan broj" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "numerisana referenca ne sme biti nula" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "argument nije dozvoljen za (*ACCEPT), (*FAIL), ili (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) nije prepoznato" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "broj je prevelik" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "nedostaje naziv podobrasca nakon (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "očekivana je cifra nakon (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] je neispravan znak podataka u režimu saglasnosti skripte Jave" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "različiti nazivi za podobrasce istog broja nisu dozvoljeni" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) mora da sadrži argument" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "iza „\\c“ mora da sledi ASKRI znak" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"iza „\\k“ se ne nalazi naziv u zagradi, uglastoj zagradi, ili pod navodnicima" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "„\\N“ nije podržano u razredu" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "previÅ¡e referenci prosleđivanja" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "naziv je predug u (*MARK), (*PRUNE), (*SKIP), ili (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "vrednost znaka u nizu „\\u....“ je prevelika" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "GreÅ¡ka prilikom pretraživanja regularnim izrazom %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE biblioteka je prevedena bez podrÅ¡ke za UTF8" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE biblioteka je prevedena bez podrÅ¡ke za UTF8 osobine" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE biblioteka je prevedena sa nesaglasnim opcijama" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "GreÅ¡ka pri optimizovanju regularnog izraza %s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "očekivana je heksadekadna cifra ili „}“" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "očekivana je heksadekadna cifra" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "nedostaje „<“ u referenci simbola" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "NedovrÅ¡ena referenca simbola" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "referenca simbola je dužine nula" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "očekivana je cifra" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "neispravna referenca simbola" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "odlutalo zavrÅ¡no „\\“" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "nepoznata sekvenca izbegavanja" + +#: ../glib/gregex.c:2508 +#, 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:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Navod ne počinje navodnikom" + +#: ../glib/gshell.c:178 +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:574 +#, 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:581 +#, 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:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Sadržaj prazan (ili sadrži samo beline)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Neuspelo čitanje podataka od potprocesa (%s)" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Neočekivana greÅ¡ka u funkciji „select()“ prilikom čitanja podataka iz " +"potprocesa (%s)" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Potproces je izaÅ¡ao sa Å¡ifrom %ld" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Potproces je ubijen signalom %ld" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Potproces je zaustavljen signalom %ld" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "Potproces je neočekivano prekinut" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Nisam uspeo da čitam iz spojke poroda (%s)" + +# za sada ovako, možda grananje, umnožavanje? viljuÅ¡kanje ;-) +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Nisam uspeo da iscepim (%s)" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Nisam uspeo da pređem u direktorijum „%s“ (%s)" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Nisam uspeo da izvrÅ¡im potproces „%s“ (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Nisam uspeo da preusmerim ulaz ili izlaz potprocesa (%s)" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Nisam uspeo da iscepim potproces (%s)" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Nepoznata greÅ¡ka pri izvrÅ¡avanju potprocesa „%s“" + +#: ../glib/gspawn.c:1563 +#, 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/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Nisam uspeo da napravim spojku za vezu sa potprocesom (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "Nisam uspeo da čitam podatke iz potprocesa" + +#: ../glib/gspawn-win32.c:376 ../glib/gspawn-win32.c:495 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Nisam uspeo da izvrÅ¡im potproces (%s)" + +#: ../glib/gspawn-win32.c:445 +#, c-format +msgid "Invalid program name: %s" +msgstr "Nije ispravan naziv programa: %s" + +#: ../glib/gspawn-win32.c:455 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1297 +#, 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:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Nije ispravna niska u okruženju: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Nije ispravna radna fascikla: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Nisam uspeo da izvrÅ¡im pomoćnički program (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Znak van opsega za UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Nije ispravan niz u unosu za pretvaranje" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Znak van opsega za UTF-16" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bajt" +msgstr[1] "%u bajta" +msgstr[2] "%u bajta" +msgstr[3] "Jedan bajt" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s bajt" +msgstr[1] "%s bajta" +msgstr[2] "%s bajtova" +msgstr[3] "Jedan bajt" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..ed149ba --- /dev/null +++ b/po/sv.po @@ -0,0 +1,4400 @@ +# Swedish messages for glib. +# Copyright (C) 2001-2012 Free Software Foundation, Inc. +# Christian Rose , 2001, 2002, 2003, 2004, 2005. +# Daniel Nylander , 2006, 2007, 2008, 2009, 2010, 2011, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-01 12:53+0200\n" +"PO-Revision-Date: 2012-04-01 13:11+0100\n" +"Last-Translator: Daniel Nylander \n" +"Language-Team: Swedish \n" +"Language: sv\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" + +#: ../gio/gbufferedinputstream.c:411 +#: ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 +#: ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 +#: ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 +#: ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "För stort räknevärde skickat till %s" + +#: ../gio/gbufferedinputstream.c:882 +#: ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 +#: ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "Strömmen är redan stängd" + +#: ../gio/gcancellable.c:318 +#: ../gio/gdbusconnection.c:1836 +#: ../gio/gdbusconnection.c:1928 +#: ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2133 +#: ../gio/gsimpleasyncresult.c:833 +#: ../gio/gsimpleasyncresult.c:859 +#, c-format +msgid "Operation was cancelled" +msgstr "Åtgärden avbröts" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Ogiltigt objekt, inte initierat" + +#: ../gio/gcharsetconverter.c:284 +#: ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Ofullständig flerbytesekvens i inmatning" + +#: ../gio/gcharsetconverter.c:318 +#: ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Inte tillräckligt med utrymme i mÃ¥let" + +#: ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 +#: ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 +#: ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 +#: ../glib/gutf8.c:841 +#: ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Ogiltig bytesekvens i konverteringsindata" + +#: ../gio/gcharsetconverter.c:350 +#: ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 +#: ../glib/giochannel.c:1590 +#: ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Fel vid konvertering: %s" + +#: ../gio/gcharsetconverter.c:447 +#: ../gio/gsocket.c:954 +msgid "Cancellable initialization not supported" +msgstr "Avbrytningsbar initiering stöds inte" + +#: ../gio/gcharsetconverter.c:458 +#: ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#: ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Konvertering frÃ¥n teckentabellen \"%s\" till \"%s\" stöds inte" + +#: ../gio/gcharsetconverter.c:462 +#: ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Kunde inte öppna konverteraren frÃ¥n \"%s\" till \"%s\"" + +#: ../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:680 +#, c-format +msgid "%s type" +msgstr "%s-typ" + +#: ../gio/gcredentials.c:273 +#: ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials har inte implementerats för detta operativsystem" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Det finns inget stöd för GCredentials för din plattform" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Oväntat tidig end-of-stream" + +#: ../gio/gdbusaddress.c:142 +#: ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Nyckeln \"%s\" stöds inte i adressposten \"%s\"" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "Adressen \"%s\" är ogiltig (behöver exakt en av sökväg, temporärkatalog eller abstrakta nycklar)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Betydelselös kombination av nyckel/värde-par i adressposten \"%s\"" + +#: ../gio/gdbusaddress.c:245 +#: ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Fel i adressen \"%s\" - portattributet är felformulerat" + +#: ../gio/gdbusaddress.c:256 +#: ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Fel i adressen \"%s\" - familjeattributet är felformulerat" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Adresselementet \"%s\" innehÃ¥ller inte ett kolontecken (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "Key/Value pair %d, `%s', in address element `%s', does not contain an equal sign" +msgstr "Nyckel/Värde-par %d, \"%s\", i adresselementet \"%s\", innehÃ¥ler inte ett lika med-tecken" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "Error unescaping key or value in Key/Value pair %d, `%s', in address element `%s'" +msgstr "Fel vid borttagning av escape i nyckel eller värde i Nyckel/Värde-par %d, \"%s\", i adresselementet \"%s\"" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "Error in address `%s' - the unix transport requires exactly one of the keys `path' or `abstract' to be set" +msgstr "Fel i adressen \"%s\" - unix-transporten kräver att exakt en av nycklarna \"path\" eller \"abstract\" har ställts in" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Fel i adressen \"%s\" - värdattributet saknas eller är felformulerat" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Fel i adressen \"%s\" - portattributet saknas eller är felformulerat" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Fel i adressen \"%s\" - attributet för noncefilen saknas eller är felformulerad" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "Fel vid automatisk körning: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "Okänd transport \"%s\" eller stöds inte för adressen \"%s\"" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Fel vid öppning av nonce-filen \"%s\": %s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Fel vid läsning frÃ¥n nonce-filen \"%s\": %s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Fel vid läsning frÃ¥n nonce-filen \"%s\", förväntade 16 byte, fick %d" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Fel vid skrivning av innehÃ¥ll i nonce-filen \"%s\" till ström:" + +#: ../gio/gdbusaddress.c:952 +msgid "The given address is empty" +msgstr "Angivna adressen är tom" + +#: ../gio/gdbusaddress.c:1021 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Kan inte starta en meddelandebuss utan ett maskin-id: " + +#: ../gio/gdbusaddress.c:1058 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Fel vid körning av kommandoraden \"%s\": " + +#: ../gio/gdbusaddress.c:1069 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "Onormal programterminering startar kommandoraden \"%s\": %s" + +#: ../gio/gdbusaddress.c:1083 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Kommandoraden \"%s\" avslutades med icke-noll-status %d: %s" + +#: ../gio/gdbusaddress.c:1156 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "Kan inte fastställa adress för sessionsbuss (inte implementerat för detta operativsystem)" + +#: ../gio/gdbusaddress.c:1255 +#: ../gio/gdbusconnection.c:6705 +#, c-format +msgid "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable - unknown value `%s'" +msgstr "Kan inte fastställa bussadressen frÃ¥n miljövariabeln DBUS_STARTER_BUS_TYPE - okänt värde \"%s\"" + +#: ../gio/gdbusaddress.c:1264 +#: ../gio/gdbusconnection.c:6714 +msgid "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment variable is not set" +msgstr "Kan inte fastställa bussadress därför att miljövariabeln DBUS_STARTER_BUS_TYPE inte är inställd" + +#: ../gio/gdbusaddress.c:1274 +#, c-format +msgid "Unknown bus type %d" +msgstr "Okänd busstyp %d" + +#: ../gio/gdbusauth.c:287 +msgid "Unexpected lack of content trying to read a line" +msgstr "Oväntad avsaknad av innehÃ¥ll vid försök att läsa en rad" + +#: ../gio/gdbusauth.c:331 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Oväntad avsaknad av innehÃ¥ll vid försök att (säkert) läsa en rad" + +#: ../gio/gdbusauth.c:502 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "Alla tillgängliga auteniseringsmekanismer har testats (försök: %s) (tillgängliga: %s)" + +#: ../gio/gdbusauth.c:1158 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Avbröts via GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Fel vid hämtning av information för katalogen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "Rättigheter pÃ¥ katalogen \"%s\" är felformulerad. Förväntade rättigheten 0700, fick 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Fel vid skapandet av katalogen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Fel vid öppnandet av nyckelringen \"%s\" för läsning: " + +#: ../gio/gdbusauthmechanismsha1.c:406 +#: ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Rad %d av nyckelringen vid \"%s\" med innehÃ¥ll \"%s\" är felformulerad" + +#: ../gio/gdbusauthmechanismsha1.c:420 +#: ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Första token pÃ¥ rad %d av nyckelringen i \"%s\" med innehÃ¥llet \"%s\" är felformulerad" + +#: ../gio/gdbusauthmechanismsha1.c:435 +#: ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Andra token pÃ¥ rad %d av nyckelringen i \"%s\" med innehÃ¥llet \"%s\" är felformulerad" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Hittade inte kaka med id %d i nyckelringen vid \"%s\"" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Fel vid borttagning av gamla lÃ¥sfilen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Fel vid skapandet av lÃ¥sfilen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Fel vid stängning av (avlänkad) lÃ¥sfilen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Fel vid avlänkning av lÃ¥sfilen \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Fel vid öppning av nyckelringen \"%s\" för skrivning: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(I tillägg misslyckades även upplÃ¥sningen för \"%s\": %s) " + +#: ../gio/gdbusconnection.c:594 +#: ../gio/gdbusconnection.c:2391 +msgid "The connection is closed" +msgstr "Anslutningen är stängd" + +#: ../gio/gdbusconnection.c:1881 +msgid "Timeout was reached" +msgstr "Tidsgränsen uppnÃ¥ddes" + +#: ../gio/gdbusconnection.c:2513 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "Flaggor som inte stöds pÃ¥träffades vid konstruktion av en anslutning pÃ¥ klientsidan" + +#: ../gio/gdbusconnection.c:4015 +#: ../gio/gdbusconnection.c:4331 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "Inget sÃ¥dant gränssnitt \"org.freedesktop.DBus.Properties\" pÃ¥ objekt med sökvägen %s" + +#: ../gio/gdbusconnection.c:4086 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Fel vid inställning av egenskapen \"%s\": Förväntade typen \"%s\" men fick \"%s\"" + +#: ../gio/gdbusconnection.c:4181 +#, c-format +msgid "No such property `%s'" +msgstr "Ingen sÃ¥dan egenskap \"%s\"" + +#: ../gio/gdbusconnection.c:4193 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Egenskapen \"%s\" är inte läsbar" + +#: ../gio/gdbusconnection.c:4204 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Egenskapen \"%s\" är inte skrivbar" + +#: ../gio/gdbusconnection.c:4274 +#: ../gio/gdbusconnection.c:6148 +#, c-format +msgid "No such interface `%s'" +msgstr "Inget sÃ¥dan gränssnitt \"%s\"" + +#: ../gio/gdbusconnection.c:4458 +msgid "No such interface" +msgstr "Inget sÃ¥dant gränssnitt" + +#: ../gio/gdbusconnection.c:4676 +#: ../gio/gdbusconnection.c:6654 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Inget sÃ¥dant gränssnitt \"%s\" pÃ¥ objekt med sökvägen %s" + +#: ../gio/gdbusconnection.c:4731 +#, c-format +msgid "No such method `%s'" +msgstr "Ingen sÃ¥dan metod \"%s\"" + +#: ../gio/gdbusconnection.c:4762 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Typ av meddelande, \"%s\", matchar inte förväntade typen \"%s\"" + +#: ../gio/gdbusconnection.c:4982 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Ett objekt är redan exporterat för gränssnittet %s vid %s" + +#: ../gio/gdbusconnection.c:5180 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Metoden \"%s\" returnerade typen \"%s\", men förväntade \"%s\"" + +#: ../gio/gdbusconnection.c:6259 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Metoden \"%s\" pÃ¥ gränssnittet \"%s\" med signaturen \"%s\" finns inte" + +#: ../gio/gdbusconnection.c:6378 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Ett underträd har redan exporterats för %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "typ är OGILTIG" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL-meddelande: rubrikfältet PATH eller MEMBER saknas" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN-meddelande: rubrikfältet REPLY_SERIAL saknas" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "FELmeddelande: rubrikfältet REPLY_SERIAL eller ERROR_NAME saknas" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL-meddelande: rubrikfältet PATH, INTERFACE eller MEMBER saknas" + +#: ../gio/gdbusmessage.c:914 +msgid "SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local" +msgstr "SIGNAL-meddelande: Rubrikfältet PATH använder det reserverade värdet /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local" +msgstr "SIGNAL-meddelande: Rubrikfältet INTERFACE använder det reserverade värdet org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Ville läsa %lu byte men fick EOF (slut pÃ¥ fil)" +msgstr[1] "Ville läsa %lu byte men fick EOF (slut pÃ¥ fil)" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "Förväntade giltig UTF-8-sträng men hittade ogiltiga byte vid byte-offset %d (längd av strängen är %d). Den giltiga UTF-8-strängen fram till den punkten var \"%s\"" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Förväntade NUL byte efter strängen \"%s\" men hittade byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Tolkat värde \"%s\" är inte en giltig D-Bus-objektsökväg" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Tolkat värde \"%s\" är inte en giltig D-Bus-signatur " + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "PÃ¥träffade array med längden %u byte. Maximal längd är 2<<26 byte (64 MiB)." +msgstr[1] "PÃ¥träffade array med längden %u byte. Maximal längd är 2<<26 byte (64 MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Tolkat värde \"%s\" för variant är inte en giltig D-Bus-signatur" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "Fel vid deserialisering av GVariant med typsträngen \"%s\" frÃ¥n D-Bus-wireformatet" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value 0x%02x" +msgstr "Ogiltigt värde för bitordning. Förväntade 0x6c ('l') eller 0x42 ('B') men hittade värdet 0x%02x" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Ogiltig större protokollversion. Förväntade 1 men hittade %d" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Signaturrubrik med signaturen \"%s\" hittades med meddelandetexten är tom" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Tolkat värde \"%s\" är inte en giltig D-Bus-signatur (för kropp)" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Ingen signaturrubrik i meddelande men meddelandetexten är %u byte" +msgstr[1] "Ingen signaturrubrik i meddelande men meddelandetexten är %u byte" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "Kan inte deserialisera meddelande: " + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Fel vid serialisering av GVariant med typsträngen \"%s\" till D-Bus-wireformatet" + +#: ../gio/gdbusmessage.c:2304 +#, c-format +msgid "Message has %d file descriptors but the header field indicates %d file descriptors" +msgstr "Meddelandet har %d filhandtag men rubrikfältet indikerar %d filhandtag" + +#: ../gio/gdbusmessage.c:2312 +msgid "Cannot serialize message: " +msgstr "Kan inte serialisera meddelandet: " + +#: ../gio/gdbusmessage.c:2356 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Meddelandetexten har signaturen \"%s\" men det finns ingen signaturrubrik" + +#: ../gio/gdbusmessage.c:2366 +#, c-format +msgid "Message body has type signature `%s' but signature in the header field is `%s'" +msgstr "Meddelandetexten har typsignaturen \"%s\" men signaturen i rubrikfältet är \"%s\"" + +#: ../gio/gdbusmessage.c:2382 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Meddelandetexten är tom men signaturen i rubrikfältet är \"(%s)\"" + +#: ../gio/gdbusmessage.c:2939 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Fel returnerades med meddelande av typen \"%s\"" + +#: ../gio/gdbusmessage.c:2947 +msgid "Error return with empty body" +msgstr "Fel returnerade med tom text" + +#: ../gio/gdbusprivate.c:2066 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Kunde inte läsa in /var/lib/dbus/machine-id eller /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Fel vid anrop av StartServiceByName för %s: " + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Oväntat svar %d frÃ¥n StartServiceByName(\"%s\")-metod" + +#: ../gio/gdbusproxy.c:2745 +#: ../gio/gdbusproxy.c:2882 +msgid "Cannot invoke method; proxy is for a well-known name without an owner and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "Kan inte anropa metod; proxy är för ett välkänt namn utan en ägare och proxy konstruerades med flaggan G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Abstrakt namnrymd stöds inte" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Kan inte ange nonce-filen när en server skapas" + +#: ../gio/gdbusserver.c:872 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Fel vid skrivning av nonce-fil i \"%s\": %s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Strängen \"%s\" är inte ett giltigt D-Bus GUID" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Kan inte lyssna pÃ¥ transport som inte stöds \"%s\"" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMMANDO" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Kommandon:\n" +" help Visar denna information\n" +" introspect Introspektera ett fjärrobjekt\n" +" monitor Övervaka ett fjärrobjekt\n" +" call Anropa en metod pÃ¥ ett fjärrobjekt\n" +" emit Sänd en signal\n" +"\n" +"Använd \"%s KOMMANDO --help\" för hjälp med varje kommando.\n" + +#: ../gio/gdbus-tool.c:162 +#: ../gio/gdbus-tool.c:218 +#: ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 +#: ../gio/gdbus-tool.c:691 +#: ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Fel: %s\n" + +#: ../gio/gdbus-tool.c:173 +#: ../gio/gdbus-tool.c:231 +#: ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Fel vid tolkning av introspektions-XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Anslut till systembussen" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Anslut till sessionsbussen" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Anslut till angiven D-Bus-adress" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Flaggor för anslutningspunkt:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Flaggor som anger anslutningens ändpunkt" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Ingen anslutningsändpunkt har angivits" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Flera anslutningsändpunkter har angivits" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Varning: Enligt introspektionsdata finns inte gränssnittet \"%s\"\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "Warning: According to introspection data, method `%s' does not exist on interface `%s'\n" +msgstr "Varning: Enligt introspektionsdata finns inte metoden \"%s\" pÃ¥ gränssnittet \"%s\"\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Valfritt mÃ¥l för signal (unikt namn)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Objektsökväg att sända signalen pÃ¥" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Signal- och gränssnittsnamn" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Sänd en signal." + +#: ../gio/gdbus-tool.c:602 +#: ../gio/gdbus-tool.c:822 +#: ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Fel vid anslutning: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Fel: objektsökväg har inte angivits.\n" + +#: ../gio/gdbus-tool.c:619 +#: ../gio/gdbus-tool.c:883 +#: ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Fel: %s är inte en giltig objektsökväg\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Fel: signal har inte angivits.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Fel: %s är inte ett giltigt gränssnittsnamn\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Fel: %s är inte ett giltigt medlemsnamn\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Fel: %s är inte ett giltigt unikt bussnamn.\n" + +#: ../gio/gdbus-tool.c:669 +#: ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Fel vid tolkning av parameter %d: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Fel vid tömning av anslutning: %s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "MÃ¥lnamn att anropa metod pÃ¥" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "Objektsökväg att anropa metod pÃ¥" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Metod- och gränssnittsnamn" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Tidsgräns i sekunder" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "Anropa en metod pÃ¥ ett fjärrobjekt." + +#: ../gio/gdbus-tool.c:842 +#: ../gio/gdbus-tool.c:1568 +#: ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Fel: MÃ¥l har inte angivits\n" + +#: ../gio/gdbus-tool.c:863 +#: ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Fel: Objektsökväg har inte angivits\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Fel: Metodnamnet är inte angivet\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Fel: Metodnamnet \"%s\" är ogiltigt\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Fel vid tolkning av parameter %d av typen \"%s\": %s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "MÃ¥lnamn att introspektera" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "Objektsökväg att introspektera" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "Skriv ut XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Introspektera barn" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Skriv endast ut egenskaper" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Introspektera ett fjärrobjekt." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "MÃ¥lnamn att övervaka" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Objektsökväg att övervaka" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Övervaka ett fjärrobjekt." + +#: ../gio/gdesktopappinfo.c:575 +#: ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Namnlös" + +#: ../gio/gdesktopappinfo.c:988 +msgid "Desktop file didn't specify Exec field" +msgstr "Skrivbordsfilen angav inget Exec-fält" + +#: ../gio/gdesktopappinfo.c:1276 +msgid "Unable to find terminal required for application" +msgstr "Kunde inte hitta terminal som krävs för programmet" + +#: ../gio/gdesktopappinfo.c:1563 +#, 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:1567 +#, 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:1807 +#: ../gio/gdesktopappinfo.c:1831 +msgid "Application information lacks an identifier" +msgstr "Programinformation saknar en identifierare" + +#: ../gio/gdesktopappinfo.c:2055 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kan inte skapa skrivbordsfil för användare %s" + +#: ../gio/gdesktopappinfo.c:2171 +#, c-format +msgid "Custom definition for %s" +msgstr "Anpassad definition för %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "enheten har inte implementerat start" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "enheten har inte implementerat stop" + +#: ../gio/gdummytlsbackend.c:168 +#: ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS-stöd finns inte tillgängligt" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Kan inte hantera version %d av GEmblem-kodning" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Felformaterat antal token (%d) i GEmblem-kodning" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Kan inte hantera version %d av GEmblemedIcon-kodning" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Felformaterat antal token (%d) i GEmblemedIcon-kodning" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Förväntade en GEmblem för GEmblemedIcon" + +#: ../gio/gfile.c:874 +#: ../gio/gfile.c:1105 +#: ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 +#: ../gio/gfile.c:1531 +#: ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 +#: ../gio/gfile.c:1726 +#: ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 +#: ../gio/gfile.c:3312 +#: ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 +#: ../gio/gfile.c:3541 +#: ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 +#: ../gio/gfile.c:4359 +#: ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 +#: ../gio/gfile.c:4633 +#: ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 +#: ../gio/gfile.c:5315 +#: ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 +#: ../gio/gfile.c:7098 +#: ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 +#: ../gio/glocalfile.c:1070 +#: ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "Infattande montering finns inte" + +#: ../gio/gfile.c:2414 +#: ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "Kan inte kopiera över katalog" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "Kan inte kopiera katalog över katalog" + +#: ../gio/gfile.c:2483 +#: ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "MÃ¥lfilen finns" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "Kan inte kopiera katalogen rekursivt" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "Splice stöds inte" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "Fel vid splice av fil: %s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "Kan inte kopiera specialfil" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "Ogiltigt värde för symbolisk länk angivet" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "Papperskorgen stöds inte" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Filnamn fÃ¥r inte innehÃ¥lla \"%c\"" + +#: ../gio/gfile.c:6067 +#: ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "volymen har inte implementerat montering" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "Inget program är registrerat för hantering av denna fil" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Numreraren är stängd" + +#: ../gio/gfileenumerator.c:212 +#: ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 +#: ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Filnumreraren har kvarstÃ¥ende Ã¥tgärd" + +#: ../gio/gfileenumerator.c:361 +#: ../gio/gfileenumerator.c:470 +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:154 +#: ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 +#: ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Strömmen saknar stöd för query_info" + +#: ../gio/gfileinputstream.c:335 +#: ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Sökning stöds inte pÃ¥ strömmen" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Kapning tillÃ¥ts inte pÃ¥ inmatningsströmmen" + +#: ../gio/gfileiostream.c:463 +#: ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Kapning stöds inte pÃ¥ strömmen" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Fel antal token (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Ingen typ för klassnamnet %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Typen %s implementerar inte GIcon-gränssnittet" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Typen %s är inte klassad" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Felformaterat versionsnummer: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Kan inte hantera angiven version för ikonkodningen" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Ingen adress angiven" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "Längden %u är för lÃ¥ng för adressen" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Adress har bitar inställda utanför prefixlängden" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "Kunde inte tolka \"%s\" som IP-adressmask" + +#: ../gio/ginetsocketaddress.c:206 +#: ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Inte tillräckligt med utrymme för uttagsadress" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Uttagsadressen stöds inte" + +#: ../gio/ginputstream.c:194 +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:898 +#: ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "Strömmen har kvarstÃ¥ende Ã¥tgärd" + +#: ../gio/glib-compile-resources.c:144 +#: ../gio/glib-compile-schemas.c:1449 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Elementet <%s> tillÃ¥ts inte inuti <%s>" + +#: ../gio/glib-compile-resources.c:148 +#: ../gio/glib-compile-schemas.c:1453 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Elementet <%s> tillÃ¥ts inte pÃ¥ toppnivÃ¥" + +#: ../gio/glib-compile-resources.c:238 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Filen %s finns pÃ¥ flera ställen i resursen" + +#: ../gio/glib-compile-resources.c:251 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Misslyckades med att hitta \"%s\" i nÃ¥gon källkatalog" + +#: ../gio/glib-compile-resources.c:262 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Misslyckades med att hitta \"%s\" i aktuell katalog" + +#: ../gio/glib-compile-resources.c:290 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Okänd behandlingsflagga \"%s\"" + +#: ../gio/glib-compile-resources.c:308 +#: ../gio/glib-compile-resources.c:366 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Misslyckades med att skapa temporärfil: %s" + +#: ../gio/glib-compile-resources.c:338 +msgid "Error processing input file with xmllint" +msgstr "Fel vid behandling av inmatningsfil med xmllint" + +#: ../gio/glib-compile-resources.c:393 +msgid "Error processing input file with to-pixdata" +msgstr "Fel vid behandling av inmatningsfil med to-pixdata" + +#: ../gio/glib-compile-resources.c:406 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Fel vid läsning av filen %s: %s" + +#: ../gio/glib-compile-resources.c:426 +#, c-format +msgid "Error compressing file %s" +msgstr "Fel vid komprimering av filen %s" + +#: ../gio/glib-compile-resources.c:490 +#: ../gio/glib-compile-schemas.c:1561 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "text fÃ¥r inte vara inuti <%s>" + +#: ../gio/glib-compile-resources.c:613 +msgid "name of the output file" +msgstr "namn pÃ¥ utmatningsfilen" + +#: ../gio/glib-compile-resources.c:613 +#: ../gio/glib-compile-resources.c:646 +#: ../gio/gresource-tool.c:477 +#: ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "FIL" + +#: ../gio/glib-compile-resources.c:614 +msgid "The directories where files are to be read from (default to current directory)" +msgstr "Katalogerna där filer ska läsas frÃ¥n (standard är aktuell katalog)" + +#: ../gio/glib-compile-resources.c:614 +#: ../gio/glib-compile-schemas.c:1989 +#: ../gio/glib-compile-schemas.c:2019 +msgid "DIRECTORY" +msgstr "KATALOG" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "Generera utmatning i formatet valt av mÃ¥lfilnamnets filändelse" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate source header" +msgstr "Generera källkods-header" + +#: ../gio/glib-compile-resources.c:617 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Generera källkod som används för att länka in resursfilen i din kod" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate dependency list" +msgstr "Generera beroendelista" + +#: ../gio/glib-compile-resources.c:619 +msgid "Don't automatically create and register resource" +msgstr "Skapa och registrera inte resursen automatiskt" + +#: ../gio/glib-compile-resources.c:620 +msgid "C identifier name used for the generated source code" +msgstr "C-identifierarnamn som används för den genererade källkoden" + +#: ../gio/glib-compile-resources.c:649 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Kompilera en resursspecifikation till en resursfil.\n" +"Resursspecifikationsfiler har filändelsen .gresource.xml,\n" +"och resursfilen har filändelsen .gresource." + +#: ../gio/glib-compile-resources.c:665 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Du bör ange exakt ett filnamn\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "tomma namn tillÃ¥ts inte" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ogiltigt namn \"%s\": namn mÃ¥ste börja med en liten bokstav" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "invalid name '%s': invalid character '%c'; only lowercase letters, numbers and dash ('-') are permitted." +msgstr "ogiltigt namn \"%s\": ogiltigt tecken \"%c\"; endast gemena bokstäver, siffror och minustecken (\"-\") tillÃ¥ts." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "ogiltigt namn \"%s\": tvÃ¥ efterföljande minustecken (\"--\") tillÃ¥ts inte." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "ogiltigt namn \"%s\": sista tecknet fÃ¥r inte vara ett minustecken (\"-\")." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ogiltigt namn \"%s\": maximal längd är 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " redan angiven" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "kan inte lägga till nycklar till ett \"list-of\"-schema" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " redan angiven" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid " shadows in ; use to modify value" +msgstr " skuggar i ; använd för att ändra värdet" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "exactly one of 'type', 'enum' or 'flags' must be specified as an attribute to " +msgstr "exakt en av \"type\", \"enum\" eller \"flags\" mÃ¥ste anges som ett attribut till " + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> inte (ännu) angiven." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ogiltig GVariant-typsträng \"%s\"" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " angavs men schemat utökar inte nÃ¥gonting" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "ingen att Ã¥sidosätta" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " redan angiven" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " redan angiven" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " utökar ännu inte befintliga schemat \"%s\"" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " är listad av ännu inte befintliga schemat \"%s\"" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Kan inte vara en lista för ett schema med en sökväg" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Kan inte utöka ett schema med en sökväg" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid " is a list, extending which is not a list" +msgstr " är en lista, som utökar vilket inte är en lista" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid " extends but '%s' does not extend '%s'" +msgstr " utökar men \"%s\" utökar inte \"%s\"" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "en sökväg, om angiven, mÃ¥ste börja och sluta med ett snedstreck" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "sökvägen för en lista mÃ¥ste sluta med \":/\"" + +#: ../gio/glib-compile-schemas.c:1229 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> redan angiven" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1747 +#: ../gio/glib-compile-schemas.c:1818 +#: ../gio/glib-compile-schemas.c:1894 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict angavs; avslutar.\n" + +#: ../gio/glib-compile-schemas.c:1755 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Hela denna filen har ignorerats.\n" + +#: ../gio/glib-compile-schemas.c:1814 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Ignorerar denna fil.\n" + +#: ../gio/glib-compile-schemas.c:1854 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "Ingen sÃ¥dan nyckel \"%s\" i schemat \"%s\" som angetts i Ã¥sidosättningsfilen \"%s\"" + +#: ../gio/glib-compile-schemas.c:1860 +#: ../gio/glib-compile-schemas.c:1918 +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; ignorerar Ã¥sidosättning för denna nyckel.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#: ../gio/glib-compile-schemas.c:1922 +#: ../gio/glib-compile-schemas.c:1950 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " och --strict angavs; avslutar.\n" + +#: ../gio/glib-compile-schemas.c:1880 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s. " +msgstr "fel vid tolkning av nyckeln \"%s\" i schemat \"%s\" som angetts i Ã¥sidosättningsfilen \"%s\": %s. " + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Ignorerar Ã¥sidosättning för denna nyckel.\n" + +#: ../gio/glib-compile-schemas.c:1908 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is out of the range given in the schema" +msgstr "Ã¥sidosättning för nyckeln \"%s\" i schemat \"%s\" i Ã¥sidosättningsfilen \"%s\" är utanför intervallet som anges i schemat" + +#: ../gio/glib-compile-schemas.c:1936 +#, c-format +msgid "override for key `%s' in schema `%s' in override file `%s' is not in the list of valid choices" +msgstr "Ã¥sidosättning för nyckeln \"%s\" i schemat \"%s\" i Ã¥sidosättningsfilen \"%s\" finns inte i listan över giltiga val" + +#: ../gio/glib-compile-schemas.c:1989 +msgid "where to store the gschemas.compiled file" +msgstr "var filen gschemas.compiled ska lagras" + +#: ../gio/glib-compile-schemas.c:1990 +msgid "Abort on any errors in schemas" +msgstr "Avbryt vid alla möjliga fel i scheman" + +#: ../gio/glib-compile-schemas.c:1991 +msgid "Do not write the gschema.compiled file" +msgstr "Skriv inte filen gschema.compiled" + +#: ../gio/glib-compile-schemas.c:1992 +msgid "Do not enforce key name restrictions" +msgstr "Tvinga inte igenom begränsningar för nyckelnamn" + +#: ../gio/glib-compile-schemas.c:2022 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Kompilera alla GSettings-schemafiler till en schemacache.\n" +"Schemafiler mÃ¥ste ha filändelsen .gschema.xml,\n" +"och cachefilen kallas för gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2038 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Du bör ange exakt ett katalognamn\n" + +#: ../gio/glib-compile-schemas.c:2077 +#, c-format +msgid "No schema files found: " +msgstr "Inga schemafiler hittades: " + +#: ../gio/glib-compile-schemas.c:2080 +#, c-format +msgid "doing nothing.\n" +msgstr "gör ingenting.\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "removed existing output file.\n" +msgstr "tog bort befintlig utmatningsfil.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Kunde inte hitta standardtyp för lokal katalogövervakare" + +#: ../gio/glocalfile.c:571 +#: ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Ogiltigt filnamn %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Fel vid hämtning av filsystemsinformation: %s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "Kan inte byta namn pÃ¥ rotkatalog" + +#: ../gio/glocalfile.c:1136 +#: ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "Fel vid namnbyte av fil: %s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "Kan inte byta namn pÃ¥ filen, filnamnet finns redan" + +#: ../gio/glocalfile.c:1158 +#: ../gio/glocalfile.c:2162 +#: ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 +#: ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 +#: ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Ogiltigt filnamn" + +#: ../gio/glocalfile.c:1325 +#: ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "Kan inte öppna katalog" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "Fel vid öppnade av fil: %s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "Fel vid borttagning av fil: %s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "Fel vid kastande av fil: %s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Kunde inte skapa papperskorgskatalogen %s: %s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "Kunde inte hitta toppnivÃ¥katalog för papperskorg" + +#: ../gio/glocalfile.c:1964 +#: ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "Kunde inte hitta eller skapa papperskorgskatalog" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Kunde inte skapa information om kastad fil: %s" + +#: ../gio/glocalfile.c:2047 +#: ../gio/glocalfile.c:2052 +#: ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Kunde inte kasta fil: %s" + +#: ../gio/glocalfile.c:2140 +#: ../glib/gregex.c:213 +msgid "internal error" +msgstr "internt fel" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "Fel vid skapande av katalog: %s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Filsystemet saknar stöd för symboliska länkar" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Fel vid skapande av symbolisk länk: %s" + +#: ../gio/glocalfile.c:2261 +#: ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "Fel vid flyttning av fil: %s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "Kan inte flytta katalog över katalog" + +#: ../gio/glocalfile.c:2311 +#: ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 +#: ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 +#: ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Misslyckades med att skapa säkerhetskopiefil" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "Fel vid borttagning av mÃ¥lfil: %s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "Flyttning mellan monteringar stöds inte" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Attributvärde mÃ¥ste vara icke-NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Ogiltig attributtyp (sträng förväntades)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Ogiltigt utökat attributnamn" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Fel vid inställning av utökat attribut \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (ogiltig kodning)" + +#: ../gio/glocalfileinfo.c:1527 +#: ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Fel vid hämtning av information om filen \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Fel vid hämtning av information om filhandtag: %s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Ogiltig attributtyp (uint32 förväntades)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Ogiltig attributtyp (uint64 förväntades)" + +#: ../gio/glocalfileinfo.c:1861 +#: ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "Ogiltig attributtyp (bytesträng förväntades)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "Kan inte ställa in rättigheter pÃ¥ symboliska länkar" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Fel vid inställning av rättigheter: %s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "Fel vid inställning av ägare: %s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "symbolisk länk mÃ¥ste vara icke-NULL" + +#: ../gio/glocalfileinfo.c:2015 +#: ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Fel vid inställning av symbolisk länk: %s" + +#: ../gio/glocalfileinfo.c:2024 +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:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Fel vid inställning av ändrings- eller Ã¥tkomsttid: %s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "SELinux-kontext mÃ¥ste vara icke-NULL" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Fel vid inställning av SELinux-kontext: %s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "SELinux är inte aktiverat pÃ¥ detta system" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Inställning av attributet %s stöds inte" + +#: ../gio/glocalfileinputstream.c:185 +#: ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Fel vid läsning frÃ¥n fil: %s" + +#: ../gio/glocalfileinputstream.c:216 +#: ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 +#: ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Fel vid sökning i fil: %s" + +#: ../gio/glocalfileinputstream.c:261 +#: ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Fel vid stängning av fil: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Kunde inte hitta standardtyp för lokal filövervakare" + +#: ../gio/glocalfileoutputstream.c:202 +#: ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Fel vid skrivning till fil: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Fel vid borttagning av gamla länk till säkerhetskopia: %s" + +#: ../gio/glocalfileoutputstream.c:297 +#: ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Fel vid skapande av säkerhetskopia: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Fel vid namnbyte pÃ¥ temporärfil: %s" + +#: ../gio/glocalfileoutputstream.c:516 +#: ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Fel vid kapning av fil: %s" + +#: ../gio/glocalfileoutputstream.c:587 +#: ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 +#: ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 +#: ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Fel vid öppning av filen \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "MÃ¥lfilen är en katalog" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "MÃ¥lfilen är inte en vanlig fil" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "Filen blev externt ändrad" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Fel vid borttagning av gammal fil: %s" + +#: ../gio/gmemoryinputstream.c:492 +#: ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "Ogiltig GSeekType angavs" + +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "Ogiltig sökbegäran" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Kan inte kapa av GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Storlek för minnesutmatningsström är inte ändringsbar" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Misslyckades med att ändra storlek pÃ¥ minnesutmatningsström" + +#: ../gio/gmemoryoutputstream.c:600 +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:760 +msgid "Requested seek before the beginning of the stream" +msgstr "Begärde sökning innan början av strömmen" + +#: ../gio/gmemoryoutputstream.c:769 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount har inte implementerat synkron estimering av innehÃ¥llstyp" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Värdnamnet \"%s\" innehÃ¥ller \"[\" men inte \"]\"" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Nätverket är inte nÃ¥bart" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Värddatorn är inte nÃ¥bar" + +#: ../gio/gnetworkmonitornetlink.c:97 +#: ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "Kunde inte skapa nätverksövervakare: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Kunde inte skapa nätverksövervakare: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Kunde inte fÃ¥ nätverksstatus: " + +#: ../gio/goutputstream.c:212 +#: ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "Utmatningsström har inte implementerat skrivning" + +#: ../gio/goutputstream.c:378 +#: ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "Källströmmen är redan stängd" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Fel vid uppslag av \"%s\": %s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Fel vid omvänt uppslag av \"%s\": %s" + +#: ../gio/gresolver.c:849 +#: ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "Ingen tjänstepost för \"%s\"" + +#: ../gio/gresolver.c:854 +#: ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Kan för tillfället inte slÃ¥ upp \"%s\"" + +#: ../gio/gresolver.c:859 +#: ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "Fel vid uppslag av \"%s\"" + +#: ../gio/gresource.c:294 +#: ../gio/gresource.c:539 +#: ../gio/gresource.c:556 +#: ../gio/gresource.c:679 +#: ../gio/gresource.c:748 +#: ../gio/gresource.c:809 +#: ../gio/gresource.c:889 +#: ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 +#: ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Resursen pÃ¥ \"%s\" finns inte" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Resursen pÃ¥ \"%s\" gick inte att dekomprimera" + +#: ../gio/gresourcefile.c:650 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Resursen pÃ¥ \"%s\" är inte en katalog" + +#: ../gio/gresourcefile.c:858 +msgid "Input stream doesn't implement seek" +msgstr "Inmatningsströmmen har inte implementerat spolning" + +#: ../gio/gresource-tool.c:470 +#: ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "Skriv ut hjälp" + +#: ../gio/gresource-tool.c:471 +#: ../gio/gresource-tool.c:539 +msgid "[COMMAND]" +msgstr "[KOMMANDO]" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "Lista sektioner som innehÃ¥ller resurser i en elf-FIL" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Lista resurser\n" +"Om SEKTION anges, lista endast resurser i denna sektion\n" +"Om SÖKVÄG anges, lista endast matchande resurser" + +#: ../gio/gresource-tool.c:485 +#: ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "FIL [SÖKVÄG]" + +#: ../gio/gresource-tool.c:486 +#: ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "SEKTION" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Lista resurser med detaljer\n" +"Om SEKTION anges, lista endast resurser i denna sektion\n" +"Om SÖKVÄG anges, lista endast matchande resurser\n" +"Detaljer inkluderar sektionen, storlek och komprimering" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "Extrahera en resursfil till standard ut" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "FILSÖKVÄG" + +#: ../gio/gresource-tool.c:508 +#: ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Okänt kommando %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Användning:\n" +" gresource [--section SEKTION] KOMMANDO [ARG...]\n" +"\n" +"Kommandon:\n" +" help Visa denna information\n" +" sections Lista resurssektioner\n" +" list Lista resurser\n" +" details Lista resurser med detaljer\n" +" extract Extrahera en resurs\n" +"\n" +"Använd \"gresource help KOMMANDO\" för detaljerad hjälp.\n" +"\n" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Användning:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:533 +#: ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "Argument:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr " SEKTION Ett (valfritt) elf-sektionsnamn\n" + +#: ../gio/gresource-tool.c:541 +#: ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND (Valfritt) kommando att förklara\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FIL En elf-fil (en binär eller ett delat bibliotek)\n" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FIL En elf-fil (en binär eller ett delat bibliotek)\n" +" eller en kompilerad resursfil\n" + +#: ../gio/gresource-tool.c:554 +msgid "[PATH]" +msgstr "[SÖKVÄG]" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " SÖKVÄG En (valfri) resurssökväg (kan vara delvis)\n" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "SÖKVÄG" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr " SÖKVÄG En resurssökväg\n" + +#: ../gio/gsettings-tool.c:53 +#: ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Inget sÃ¥dant schema \"%s\"\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schemat \"%s\" är inte flyttbart (sökvägen mÃ¥ste inte anges)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schemat \"%s\" är flyttbart (sökvägen mÃ¥ste anges)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Tom sökväg angavs.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Sökvägen mÃ¥ste börja med ett snedstreck (/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Sökvägen mÃ¥ste sluta med ett snedstreck (/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Sökvägen fÃ¥r inte innehÃ¥lla tvÃ¥ efterföljande snedstreck (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Ingen sÃ¥dan nyckel \"%s\"\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "TillhandahÃ¥llet värde är utanför det giltiga intervallet\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "Lista installerade (icke-flyttbara) scheman" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "Lista installerade, flyttbara scheman" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "Lista nycklarna i SCHEMA" + +#: ../gio/gsettings-tool.c:549 +#: ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:SÖKVÄG]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "Lista barnen i SCHEMA" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Lista nycklar och värden, rekursivt\n" +"Om inget SCHEMA anges, lista alla nycklar\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:SÖKVÄG]]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "FÃ¥ värdet för NYCKEL" + +#: ../gio/gsettings-tool.c:568 +#: ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 +#: ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:SÖKVÄG] NYCKEL" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "FrÃ¥ga efter giltiga värden för NYCKEL" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "Ställ in värdet för NYCKEL till VÄRDE" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:SÖKVÄG] NYCKELVÄRDE" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "Återställ NYCKEL till dess standardvärde" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Nollställ alla nycklar i SCHEMA till sina standardvärden" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "Kontrollera om NYCKEL är skrivbar" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Övervaka NYCKEL efter ändringar.\n" +"Om ingen NYCKEL anges, övervaka alla nycklar i SCHEMA.\n" +"Använd ^C för att avsluta övervakningen.\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:SÖKVÄG] [NYCKEL]" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Användning:\n" +" gsettings [--schemadir SCHEMAKAT] KOMMANDO [ARG...]\n" +"\n" +"Kommandon:\n" +" help Visa denna information\n" +" list-schemas Lista installerade scheman\n" +" list-relocatable-schemas Lista flyttbara scheman\n" +" list-keys Lista nycklar i ett schema\n" +" list-children Lista barn av ett schema\n" +" list-recursively Lista nycklar och värden, rekursivt\n" +" range FrÃ¥gar efter intervallet för en nyckel\n" +" get Hämta värdet för en nyckel\n" +" set Ställ in värdet för en nyckel\n" +" reset Nollställ värdet för en nyckel\n" +" reset-recursively Nollställ alla värden i ett angivet schema\n" +" writable Kontrollera om en nyckel är skrivbar\n" +" monitor Övervaka efter ändringar\n" +"\n" +"Använd \"gsettings help KOMMANDO\" för detaljerad hjälp.\n" +"\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Användning:\n" +" gsettings [--schemadir SCHEMAKAT] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMAKAT En katalog att söka i efter ytterligare scheman\n" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Namnet pÃ¥ schemat\n" +" PATH Sökvägen, för flyttbara scheman\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY (Valfri) nyckel inom schemat\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " KEY Nyckeln inom schemat\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " VÄRDE Värdet att ställa in\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "Tomt schemanamn angavs\n" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "Ogiltigt uttag, inte initierat" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Ogiltigt uttag, initiering misslyckades pÃ¥ grund av: %s" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "Uttaget är redan stängt" + +#: ../gio/gsocket.c:305 +#: ../gio/gsocket.c:3520 +#: ../gio/gsocket.c:3575 +msgid "Socket I/O timed out" +msgstr "Tidsgräns för in/ut pÃ¥ uttaget överstegs" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "skapar GSocket frÃ¥n fd: %s" + +#: ../gio/gsocket.c:506 +#: ../gio/gsocket.c:522 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Kunde inte skapa uttag: %s" + +#: ../gio/gsocket.c:506 +msgid "Unknown protocol was specified" +msgstr "Okänt protokoll angavs" + +#: ../gio/gsocket.c:1713 +#, c-format +msgid "could not get local address: %s" +msgstr "kunde inte fÃ¥ lokal adress: %s" + +#: ../gio/gsocket.c:1756 +#, c-format +msgid "could not get remote address: %s" +msgstr "Kunde inte fÃ¥ fjärradress: %s" + +#: ../gio/gsocket.c:1817 +#, c-format +msgid "could not listen: %s" +msgstr "kunde inte lyssna: %s" + +#: ../gio/gsocket.c:1891 +#, c-format +msgid "Error binding to address: %s" +msgstr "Fel vid bindning till adress: %s" + +#: ../gio/gsocket.c:1944 +#: ../gio/gsocket.c:1980 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Fel vid medlemskap i multicast-grupp: %s" + +#: ../gio/gsocket.c:1945 +#: ../gio/gsocket.c:1981 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Fel vid lämnande av multicast-grupp: %s" + +#: ../gio/gsocket.c:1946 +msgid "No support for source-specific multicast" +msgstr "Inget stöd för källspecifik multicast" + +#: ../gio/gsocket.c:2165 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Fel vid godkännande av anslutning: %s" + +#: ../gio/gsocket.c:2286 +msgid "Connection in progress" +msgstr "Anslutningsförsök pÃ¥gÃ¥r" + +#: ../gio/gsocket.c:2338 +#: ../gio/gsocket.c:4317 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Kunde inte fÃ¥ tag pÃ¥ väntande fel: %s" + +#: ../gio/gsocket.c:2508 +#, c-format +msgid "Error receiving data: %s" +msgstr "Fel vid mottagning av data: %s" + +#: ../gio/gsocket.c:2686 +#, c-format +msgid "Error sending data: %s" +msgstr "Fel vid sändning av data: %s" + +#: ../gio/gsocket.c:2800 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Kunde inte stänga ner uttag: %s" + +#: ../gio/gsocket.c:2879 +#, c-format +msgid "Error closing socket: %s" +msgstr "Fel vid stängning av uttag: %s" + +#: ../gio/gsocket.c:3513 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Väntar pÃ¥ uttagstillstÃ¥nd: %s" + +#: ../gio/gsocket.c:3791 +#: ../gio/gsocket.c:3872 +#, c-format +msgid "Error sending message: %s" +msgstr "Fel vid sändning av meddelande: %s" + +#: ../gio/gsocket.c:3816 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage stöds inte pÃ¥ Windows" + +#: ../gio/gsocket.c:4096 +#: ../gio/gsocket.c:4232 +#, c-format +msgid "Error receiving message: %s" +msgstr "Fel vid mottagning av meddelande: %s" + +#: ../gio/gsocket.c:4336 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials har inte implementerats för detta operativsystem" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Kunde inte ansluta till proxyservern %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Kunde inte ansluta till %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "Kunde inte ansluta: " + +#: ../gio/gsocketclient.c:976 +#: ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Okänt fel inträffade vid anslutning" + +#: ../gio/gsocketclient.c:1029 +#: ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "Försök att skicka via proxy över en icke-TCP-anslutning stöds inte." + +#: ../gio/gsocketclient.c:1055 +#: ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Proxyprotokollet \"%s\" stöds inte." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Lyssnaren är redan stängd" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Tillagt uttag är stängt" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 saknar stöd för IPv6-adressen \"%s\"" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Användarnamnet är för lÃ¥ngt för SOCKSv4-protokollet" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Värdnamnet \"%s\" är för lÃ¥ngt för SOCKSv4-protokollet" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Servern är inte en SOCKSv4-proxyserver." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Anslutningen genom SOCKSv4-servern nekades" + +#: ../gio/gsocks5proxy.c:155 +#: ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Servern är inte en SOCKSv5-proxyserver." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5-proxyservern kräver autentisering." + +#: ../gio/gsocks5proxy.c:179 +msgid "The SOCKSv5 proxy requires an authentication method that is not supported by GLib." +msgstr "SOCKSv5 kräver en autentiseringsmetod som inte stöds av GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Användarnamn eller lösenord är för lÃ¥ngt för SOCKSv5-protokollet." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5-autentiseringen misslyckades pÃ¥ grund av felaktigt användarnamn eller lösenord." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Värdnamnet \"%s\" är för lÃ¥ngt för SOCKSv5-protokollet" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5-proxyservern använder en okänd adresstyp." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Internt fel iSOCKSv5-proxyserver." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5-anslutning tillÃ¥ts inte av regeluppsättningen." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Värden är inte nÃ¥bar genom SOCKSv5-servern." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Nätverket är inte nÃ¥bart genom SOCKSv5-proxyservern." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Anslutningen nekades genom SOCKSv5-proxyservern." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5-proxyservern saknar stöd för kommandot \"connect\"." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5-proxyservern saknar stöd för angiven adresstyp." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Okänt fel i SOCKSv5-proxyserver." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Kan inte hantera version %d av GThemedIcon-kodning" + +#: ../gio/gtlscertificate.c:249 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Kan inte dekryptera PEM-kodad privat nyckel" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "Ingen PEM-kodad privat nyckel hittades" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "Kunde inte tolka PEM-kodad privat nyckel" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "Inget PEM-kodat certifikat hittades" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "Kunde inte tolka PEM-kodat certifikat" + +#: ../gio/gtlspassword.c:114 +msgid "This is the last chance to enter the password correctly before your access is locked out." +msgstr "Detta är sista chansen att ange ett korrekt lösenord innan ditt konto blir lÃ¥st." + +#: ../gio/gtlspassword.c:116 +msgid "Several password entered have been incorrect, and your access will be locked out after further failures." +msgstr "Flera felaktiga lösenord har angivits och din Ã¥tkomst kommer att lÃ¥sas efter ytterligare misslyckanden." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Det angivna lösenordet är felaktigt." + +#: ../gio/gunixconnection.c:164 +#: ../gio/gunixconnection.c:580 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Förväntade 1 kontrollmeddelande, fick %d" + +#: ../gio/gunixconnection.c:177 +#: ../gio/gunixconnection.c:590 +msgid "Unexpected type of ancillary data" +msgstr "Oväntad typ av underordnat data" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Förväntade ett fd, men fick %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Tog emot ogiltig fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Fel vid sändning av inloggningsuppgifter: " + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Fel vid kontroll om SO_PASSCRED har aktiverats för uttaget: %s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "Unexpected option length while checking if SO_PASSCRED is enabled for socket. Expected %d bytes, got %d" +msgstr "Oväntad flagglängd vid kontroll om SO_PASSCRED har aktiverats för uttaget. Förväntade %d byte, fick %d" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Fel vid aktivering av SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:568 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "Förväntade att läsa ett enda byte för mottagning av inloggningsuppgifter men läste noll byte" + +#: ../gio/gunixconnection.c:604 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Förväntade inte kontrollmeddelande, men fick %d" + +#: ../gio/gunixconnection.c:630 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Fel vid inaktivning av SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:392 +#: ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:493 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Fel vid läsning frÃ¥n filhandtag: %s" + +#: ../gio/gunixinputstream.c:448 +#: ../gio/gunixinputstream.c:643 +#: ../gio/gunixoutputstream.c:434 +#: ../gio/gunixoutputstream.c:598 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Fel vid stängning av filhandtag: %s" + +#: ../gio/gunixmounts.c:1983 +#: ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "Filsystemsrot" + +#: ../gio/gunixoutputstream.c:378 +#: ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:479 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Fel vid skrivning till filhandtag: %s" + +#: ../gio/gunixsocketaddress.c:244 +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:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "volume har inte implementerat eject eller eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Kan inte hitta programmet" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Fel vid start av program: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI:er stöds inte" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "associeringsändringar stöds inte pÃ¥ win32" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "Associeringsskapanden stöds inte pÃ¥ win32" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Fel vid läsning frÃ¥n handtag: %s" + +#: ../gio/gwin32inputstream.c:348 +#: ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "Fel vid stängning av handtag: %s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Fel vid skrivning till handtag: %s" + +#: ../gio/gzlibcompressor.c:396 +#: ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Slut pÃ¥ minne" + +#: ../gio/gzlibcompressor.c:403 +#: ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Internt fel: %s" + +#: ../gio/gzlibcompressor.c:416 +#: ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Behöver mer inmatning" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Ogiltigt komprimerat data" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Oväntat attribut \"%s\" för elementet \"%s\"" + +#: ../glib/gbookmarkfile.c:771 +#: ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 +#: ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Attributet \"%s\" för elementet \"%s\" hittades inte" + +#: ../glib/gbookmarkfile.c:1129 +#: ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 +#: ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Oväntad tagg \"%s\"\", taggen \"%s\" förväntades" + +#: ../glib/gbookmarkfile.c:1154 +#: ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 +#: ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Oväntad tagg \"%s\" inom \"%s\"" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "Ingen giltig bokmärkesfil hittades i datakataloger" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Ett bokmärke för uri \"%s\" finns redan" + +#: ../glib/gbookmarkfile.c:2053 +#: ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 +#: ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 +#: ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 +#: ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 +#: ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 +#: ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 +#: ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 +#: ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Inget bokmärke hittades för uri \"%s\"" + +#: ../glib/gbookmarkfile.c:2385 +#, 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:2470 +#, 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:2849 +#, 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:3244 +#: ../glib/gbookmarkfile.c:3401 +#, 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:3424 +#, 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:807 +#: ../glib/gutf8.c:837 +#: ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 +#: ../glib/gutf8.c:1288 +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:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Kan inte konvertera reservsträngen \"%s\" till kodningen \"%s\"" + +#: ../glib/gconvert.c:1874 +#, 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:1884 +#, 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:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI:n \"%s\" är ogiltig" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Värdnamnet i URI:n \"%s\" är ogiltigt" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI:n \"%s\" innehÃ¥ller ogiltigt kodade tecken" + +#: ../glib/gconvert.c:2024 +#, 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:2034 +msgid "Invalid hostname" +msgstr "Ogiltigt värdnamn" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %Y %H.%M.%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y-%m-%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H.%M.%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Januari" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Februari" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Mars" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "April" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Juni" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Juli" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Augusti" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "September" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Oktober" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "November" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "December" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Jan" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Feb" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Apr" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Maj" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Jun" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Jul" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Aug" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Sep" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Okt" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Nov" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Dec" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "MÃ¥ndag" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Tisdag" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Onsdag" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Torsdag" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Fredag" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Lördag" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Söndag" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "MÃ¥n" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Tis" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Ons" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Tor" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Fre" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Lör" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Sön" + +#: ../glib/gdir.c:121 +#: ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Fel vid öppning av katalogen \"%s\": %s" + +#: ../glib/gfileutils.c:675 +#: ../glib/gfileutils.c:763 +#, 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:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Fel vid läsning av filen \"%s\": %s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Filen \"%s\" är för stor" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Misslyckades med att läsa frÃ¥n filen \"%s\": %s" + +#: ../glib/gfileutils.c:838 +#: ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Misslyckades med att öppna filen \"%s\": %s" + +#: ../glib/gfileutils.c:855 +#, 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:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Misslyckades med att öppna filen \"%s\": fdopen() misslyckades: %s" + +#: ../glib/gfileutils.c:997 +#, 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:1039 +#: ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Misslyckades med att skapa filen \"%s\": %s" + +#: ../glib/gfileutils.c:1053 +#, 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:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fwrite() misslyckades: %s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fflush() misslyckades: %s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Misslyckades med att skriva filen \"%s\": fsync() misslyckades: %s" + +#: ../glib/gfileutils.c:1165 +#, 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:1287 +#, 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:1547 +#, 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:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Mallen \"%s\" innehÃ¥ller inte XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, 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:2109 +msgid "Symbolic links not supported" +msgstr "Symboliska länkar stöds inte" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +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:1807 +#: ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Överbliven okonverterad data i läsbufferten" + +#: ../glib/giochannel.c:1888 +#: ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kanalen slutar med ett ofullständigt tecken" + +#: ../glib/giochannel.c:1951 +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/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "Giltig nyckelfil kunde inte hittas i sökkatalogerna" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "Inte en vanlig fil" + +#: ../glib/gkeyfile.c:1162 +#, 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:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "Ogiltigt gruppnamn: %s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "Nyckelfilen börjar inte med en grupp" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "Ogiltigt nyckelnamn: %s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Nyckelfilen innehÃ¥ller kodningen \"%s\" som inte stöds" + +#: ../glib/gkeyfile.c:1541 +#: ../glib/gkeyfile.c:1703 +#: ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 +#: ../glib/gkeyfile.c:3273 +#: ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 +#: ../glib/gkeyfile.c:3778 +#: ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Nyckelfilen har inte gruppen \"%s\"" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Nyckelfilen har inte nyckeln \"%s\"" + +#: ../glib/gkeyfile.c:1822 +#: ../glib/gkeyfile.c:1938 +#, 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:1842 +#: ../glib/gkeyfile.c:1958 +#: ../glib/gkeyfile.c:2327 +#, 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:2544 +#: ../glib/gkeyfile.c:2910 +#, c-format +msgid "Key file contains key '%s' in group '%s' which has a value that cannot be interpreted." +msgstr "Nyckelfilen innehÃ¥ller nyckeln \"%s\" i gruppen \"%s\" vilken innehÃ¥ller ett värde som inte kan tolkas." + +#: ../glib/gkeyfile.c:2622 +#: ../glib/gkeyfile.c:2698 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Nyckeln \"%s\" i gruppen \"%s\" innehÃ¥ller värdet \"%s\" där %s förväntades" + +#: ../glib/gkeyfile.c:3096 +#: ../glib/gkeyfile.c:3288 +#: ../glib/gkeyfile.c:3857 +#, 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:4089 +msgid "Key file contains escape character at end of line" +msgstr "Nyckelfilen innehÃ¥ller kontrolltecken i slutet pÃ¥ en rad" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Nyckelfilen innehÃ¥ller ogiltiga kontrollsekvensen \"%s\"" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Värdet \"%s\" kan inte tolkas som ett tal." + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Heltalsvärdet \"%s\" är utanför intervallet" + +#: ../glib/gkeyfile.c:4300 +#, 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:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Värdet \"%s\" kan inte tolkas som ett booleskt värde." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Misslyckades med att fÃ¥ attribut för filen \"%s%s%s%s\": fstat() misslyckades: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Misslyckades med att mappa %s%s%s%s: mmap() misslyckades: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Misslyckades med att öppna filen \"%s\": open() misslyckades: %s" + +#: ../glib/gmarkup.c:356 +#: ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Fel pÃ¥ rad %d tecken %d:" + +#: ../glib/gmarkup.c:419 +#: ../glib/gmarkup.c:502 +#, 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:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "\"%s\" är inte ett giltigt namn " + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "\"%s\" är inte ett giltigt namn: \"%c\" " + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "Fel pÃ¥ rad %d: %s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Teckenreferensen \"%-.*s\" kodar inte ett tillÃ¥tet tecken" + +#: ../glib/gmarkup.c:715 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "Tom entitet \"&;\" hittades, giltiga entiteter är: & " < > '" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Entitetsnamnet \"%-.*s\" är okänt" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "Dokumentet mÃ¥ste börja med ett element (exempelvis )" + +#: ../glib/gmarkup.c:1116 +#, 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:1184 +#, 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:1268 +#, 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:1309 +#, 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:1353 +#, 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:1486 +#, 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:1533 +#, 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:1542 +#, 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:1710 +msgid "Document was empty or contained only whitespace" +msgstr "Dokumentet var tomt eller innehöll endast tomrum" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "Dokumentet tog oväntat slut efter ett öppningsklammer \"<\"" + +#: ../glib/gmarkup.c:1732 +#: ../glib/gmarkup.c:1777 +#, 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:1740 +#, 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:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "Dokumentet tog oväntat slut inuti ett elementnamn" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Dokumentet tog oväntat slut inuti ett attributnamn" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Dokumentet tog oväntat slut inuti en elementöppnande tagg." + +#: ../glib/gmarkup.c:1763 +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:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Dokumentet tog oväntat slut inuti ett attributvärde" + +#: ../glib/gmarkup.c:1786 +#, 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:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Dokumentet tog oväntat slut inuti en kommentar eller behandlingsinstruktion" + +#: ../glib/goption.c:766 +msgid "Usage:" +msgstr "Användning:" + +#: ../glib/goption.c:766 +msgid "[OPTION...]" +msgstr "[FLAGGA...]" + +#: ../glib/goption.c:872 +msgid "Help Options:" +msgstr "Hjälpflaggor:" + +#: ../glib/goption.c:873 +msgid "Show help options" +msgstr "Visa hjälpflaggor" + +#: ../glib/goption.c:879 +msgid "Show all help options" +msgstr "Visa alla hjälpflaggor" + +#: ../glib/goption.c:941 +msgid "Application Options:" +msgstr "Programflaggor:" + +#: ../glib/goption.c:1003 +#: ../glib/goption.c:1073 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Kan inte tolka heltalsvärdet \"%s\" för %s" + +#: ../glib/goption.c:1013 +#: ../glib/goption.c:1081 +#, 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:1038 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Kan inte tolka dubbelvärdet \"%s\" för %s" + +#: ../glib/goption.c:1046 +#, 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:1309 +#: ../glib/goption.c:1388 +#, c-format +msgid "Error parsing option %s" +msgstr "Fel vid tolkning av flaggan %s" + +#: ../glib/goption.c:1419 +#: ../glib/goption.c:1532 +#, c-format +msgid "Missing argument for %s" +msgstr "Argument saknas för %s" + +#: ../glib/goption.c:1985 +#, c-format +msgid "Unknown option %s" +msgstr "Okänd flagga %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "skadat objekt" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "internt fel eller skadat objekt" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "slut pÃ¥ minne" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "bakÃ¥tspÃ¥rningsgräns nÃ¥dd" + +#: ../glib/gregex.c:211 +#: ../glib/gregex.c:219 +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:221 +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:230 +msgid "recursion limit reached" +msgstr "rekursionsgräns nÃ¥dd" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "arbetsytans gräns för tomma understrängar nÃ¥dd" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "ogiltig kombination av nyradsflaggor" + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "felaktig offset" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "kort utf8" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "okänt fel" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "\\ pÃ¥ slutet av mönster" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "\\c pÃ¥ slutet av mönster" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "okänt tecken efter \\" + +#: ../glib/gregex.c:275 +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:278 +msgid "numbers out of order in {} quantifier" +msgstr "tal är inte i ordning i {}-kvantifierare" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "tal för stort i {}-kvantifierare" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "saknar avslutande ] för teckenklass" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "ogiltig escape-sekvens i teckenklass" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "intervall är inte i ordning i teckenklass" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "ingenting att upprepa" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "okänt tecken efter (?" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "okänt tecken efter (?<" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "okänt tecken efter (?P" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX-namngivna klasser stöds endast inom en klass" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "saknar avslutande )" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R eller (?[+-]siffror mÃ¥ste efterföljas av )" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "referens till icke-existerande undermönster" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "saknar ) efter kommentar" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "reguljärt uttryck för stort" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "misslyckades med att fÃ¥ minne" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-assertion är inte av fast längd" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "felformulerat tal eller namn efter (?(" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "villkorsgrupp innehÃ¥ller fler än tvÃ¥ grenar" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "assertion förväntades efter (?(" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "okänt POSIX-klassnamn" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "POSIX-sorteringselement stöds inte" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "teckenvärde i \\x{...}-sekvens är för stort" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "ogiltigt tillstÃ¥nd (?(0)" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C tillÃ¥ts inte i lookbehind-assertion" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "rekursivt anrop kan gÃ¥ in i en oändlig slinga" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "saknar avslutstecken i undermönstrets namn" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "tvÃ¥ namngivna undermönster har samma namn" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "felformulerad \\P eller \\p-sekvens" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "okänt egenskapsnamn efter \\P eller \\p" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "undermönstrets namn är för lÃ¥ngt (maximalt 32 tecken)" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "för mÃ¥nga namngivna undermönster (maximalt 10,000)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "oktalt värde är större än \\377" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE-grupp innehÃ¥ller fler än en gren" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "upprepning av en DEFINE-grupp tillÃ¥ts inte" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "inkonsistenta NEWLINE-flaggor" + +#: ../glib/gregex.c:396 +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:401 +msgid "unexpected repeat" +msgstr "oväntad upprepning" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "överflöde i kod" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "fyllde över kompileringsutrymme" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "tidigare kontrollerad refererande undermönster hittades inte" + +#: ../glib/gregex.c:631 +#: ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Fel vid matchning av reguljära uttrycket %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE-biblioteket är byggt utan stöd för UTF8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE-biblioteket är byggt utan stöd för UTF8-egenskaper" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Fel vid optimering av reguljära uttrycket %s: %s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "hexadecimal siffra eller \"}\" förväntades" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "hexadecimal siffra förväntades" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "saknar \"<\" i symbolisk referens" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "oavslutad symbolisk referens" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "symbolisk referens med noll-längd" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "siffra förväntades" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "otillÃ¥ten symbolisk referens" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "felplacerad avslutande \"\\\"" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "okänd escape-sekvens" + +#: ../glib/gregex.c:2359 +#, 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:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Citerad text börjar inte med citationstecken" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Ensamt citationstecken pÃ¥ kommandoraden eller annan skalciterad text" + +#: ../glib/gshell.c:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Texten var tom (eller innehöll bara tomrum)" + +#: ../glib/gspawn.c:208 +#, 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:348 +#, 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:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Oväntat fel i waitpid() (%s)" + +#: ../glib/gspawn.c:1174 +#: ../glib/gspawn-win32.c:338 +#: ../glib/gspawn-win32.c:346 +#, 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.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Misslyckades med att grena (%s)" + +#: ../glib/gspawn.c:1387 +#: ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Misslyckades med att byta till katalogen \"%s\" (%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Misslyckades med att köra barnprocessen \"%s\" (%s)" + +#: ../glib/gspawn.c:1407 +#, 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:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Misslyckades med att skapa barnprocess (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Okänt fel vid körning av barnprocessen \"%s\"" + +#: ../glib/gspawn.c:1448 +#, 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/gspawn.c:1521 +#: ../glib/gspawn-win32.c:299 +#, 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:282 +msgid "Failed to read data from child process" +msgstr "Misslyckades med att läsa data frÃ¥n barnprocessen" + +#: ../glib/gspawn-win32.c:375 +#: ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Misslyckades med att köra barnprocess (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Ogiltigt programnamn: %s" + +#: ../glib/gspawn-win32.c:454 +#: ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Ogiltig sträng i argumentvektorn vid %d: %s" + +#: ../glib/gspawn-win32.c:465 +#: ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Ogiltig sträng i miljön: %s" + +#: ../glib/gspawn-win32.c:718 +#: ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Ogiltig arbetskatalog: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Misslyckades med att köra hjälparprogram (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Tecknet är utanför intervallet för UTF-8" + +#: ../glib/gutf8.c:1015 +#: ../glib/gutf8.c:1024 +#: ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 +#: ../glib/gutf8.c:1302 +#: ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Ogiltig sekvens i konverteringsindata" + +#: ../glib/gutf8.c:1313 +#: ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Tecknet är utanför intervallet för UTF-16" + +#: ../glib/gutils.c:2166 +#: ../glib/gutils.c:2193 +#: ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u byte" + +#: ../glib/gutils.c:2172 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2174 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2177 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2180 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2183 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2186 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2202 +#: ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2205 +#: ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2207 +#: ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2210 +#: ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2213 +#: ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" +msgstr[1] "%s byte" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "File is empty" +#~ msgstr "Filen är tom" + +#~ 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." + +#~ msgid "This option will be removed soon." +#~ msgstr "Denna flagga kommer snart att försvinna." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Fel vid tillstÃ¥ndsläsning av filen \"%s\": %s" + +#~ msgid "Error connecting: " +#~ msgstr "Fel vid anslutning: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Fel vid anslutning: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4-implementationen begränsar användarnamn till %i tecken" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a-implementationen begränsar värdnamn till %i tecken" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Fel vid läsning frÃ¥n unix: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Fel vid stängning av unix: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Fel vid skrivning till unix: %s" +#~ msgctxt "GDateTime" + +#~ msgid "am" +#~ msgstr "am" +#~ msgctxt "GDateTime" + +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Typ av returvärde är felaktigt, fick \"%s\", förväntade \"%s\"" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Försöker att ställa in egenskapen %s av typen %s men enligt det " +#~ "förväntade gränssnittet är typen %s" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Ange sökvägen för schemat" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Nyckeln %s är inte skrivbar\n" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Kan inte flytta katalog över katalog" + +#, 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 "" +#~ "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 "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.po b/po/ta.po new file mode 100644 index 0000000..a734b72 --- /dev/null +++ b/po/ta.po @@ -0,0 +1,4400 @@ +# translation of glib.master.ta.po to +# translation of ta.po to +# Tamil translation of GLib. +# Copyright (C) 2001, 2006, 2007, 2009 Free Software Foundation, Inc. +# +# Dinesh Nadarajah , 2001. +# Felix , 2006. +# Dr.T.Vasudevan , 2007. +# I. Felix , 2009. +# Priyadharsini , 2009. +# I Felix , 2011. +# Shantha kumar , 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.ta\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug." +"cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-12-17 14:03+0000\n" +"PO-Revision-Date: 2012-12-18 16:44+0530\n" +"Last-Translator: Shantha kumar \n" +"Language-Team: Tamil <>\n" +"Language: \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" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%sக்கு மிகப்பெரிய எண்ணிக்கை மதிப்பு செலுத்தப்பட்டது" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "ஸ்ட்ரீமில் தேடுதல் துணைபுரியவில்லை" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBufferedInputStream ஐ தசமமிட முடியவில்லை" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "ஸ்ட்ரீம் ஏற்கனவே மூடப்பட்டது" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "பேஸ் ஸ்ட்ரீமில் ட்ரன்க்கேட் செயலுக்கு ஆதரவில்லை" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "செயல்பாடு ரத்து செய்யப்பட்டது" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "தவறான பொருள், துவக்கப்படவில்லை" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "உள்ளீடு முழுமையடையா மல்டிபைட்டின் வரிசை" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "இலக்கில் போதுமான இடம் இல்லை" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "நிலை மாற்றியின் உள்ளீடுக்கு தவறான பைட் வரிசைமுறை" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "மாற்றும் போது பிழை: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "ரத்துசெய்யக்கூடிய துவக்குதல் துணைபுரிவதில்லை" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "வரியுரு வகை `%s' இலிருந்து `%s' க்கு மாற்றுவதற்கு ஆதரவளிப்பு கிடையாது" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' லிருந்து '%s'க்கு மாற்றியை திறக்க முடியவில்லை" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s வகை" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "தெரியாத வகை" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s கோப்பு வகை" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:486 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ஆனது இந்த OS இல் செயல்படுத்தப்படவில்லை" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "உங்கள் தளத்திற்கான GCredentials துணை இல்லை" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "எதிர்ப்பார்க்கப்படாத முடிவு ஸ்ட்ரீம்" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "துணைபுரியாத விசை `%s' ஆனது முகவரி உள்ளிடு `%s' இல் உள்ளது" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"முகவரி `%s' தவறானது (சரியாக ஒரு பாதை தேவைப்படுகிறது, tmpdir அல்லது சுருக்க " +"விசைகள்)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "முகவரி உள்ளிடு `%s' இல் அர்த்தமற்ற விசை/மதிப்பு ஜோடி கலவை" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "முகவரி `%s' இல் பிழை - துறை பண்பு தவறானது" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "முகவரி `%s' இல் பிழை - குடும்ப பண்பு தவறானது" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "முகவரியின் `%s' என்ற கூறில் கோலன் (:) இல்லை" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "முகவரியின் '%3$s' கூறில் உள்ள விசை/மதிப்பு ஜோடி %1$d, `%2$s' இல் சமக் குறி இல்லை" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"பிழை தப்பிக்காத விசை அல்லது விசையின் மதிப்பு/மதிப்பு ஜோடி %d, `%s', உருப்படி " +"முகவரியில்`%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"முகவரியில் பிழை `%s' - யுனிக்ஸ் போக்குவரத்துசரியாக விசைகளின் ஒரு `பாதை' அல்லது " +"`தடுத்தல்' போன்றவற்றை அமைக்க கோருகிறது" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "முகவரி `%s' இல் பிழை - புரவலன் பண்பு விடுபட்டது அல்லது தவறானது" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "முகவரி `%s' இல் பிழை - துறை பண்பு விடுபட்டது அல்லது தவறானது" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "முகவரி `%s' இல் பிழை - நினைவுக்குறியீடுகோப்பு பண்பு விடுபட்டது அல்லது தவறானது" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "தானியக்க-துவக்கத்தில் பிழை:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "`%s' முகவரிக்கான தெரியாத அல்லது துணைபுரியாத போக்குவரத்து `%s'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "தற்போதைய கோப்பு '%s' ஐ திறக்கும் பிழை: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "தற்சமய கோப்பு '%s' இலிருந்து வாசிக்கும் பிழை: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "" +"தற்சமய கோப்பு `%s' இலிருந்து பிழை வாசிக்கிறது, 16 பைட்டுகள் எதிர்பார்க்கப்பட்டது, %d " +"பெறப்பட்டது" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "தற்சமய கோப்பு `%s' ஐ ஸ்ட்ரெம்மிற்கு உள்ளடக்கங்களை எழுதும் பிழை:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "கொடுக்கப்பட்ட முகவரி காலியாக உள்ளது " + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "uid ஐ அமைக்கும் போது ஒரு செய்தியை கொண்டு வர முடியாது" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "ஒரு கணினி-குறியீடு இல்லாமல் ஒரு செய்தி பஸ்ஸை உற்பத்தி செய்ய முடியாது:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "பிழை ஸ்பேனிங் கட்டளை வரி `%s': " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(இந்த சாளரத்தை மூட ஏதேனும் ஒரு எழுத்துக்குறியைத் தட்டச்சு செய்யவும்)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "dbus அமர்வு இயங்கவில்லை தானியக்க தொடக்கம் தோல்வியடைந்தது" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "அமர்வு பஸ் முகவரியை வரையறுக்க முடியவில்லை (இந்த OS க்காக செயல்படுத்தப்படவில்லை)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE சூழல் மாறியிலிருந்து பஸ் முகவரியை வரையறுக்க முடியாது- " +"தெரியாத மதிப்பு `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"பஸ் முகவரியை வரையறுக்க முடியவில்லை ஏனெனில் DBUS_STARTER_BUS_TYPE சூழல் மாறி " +"அமைக்கப்படவில்லை " + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "தெரியாத பஸ் வகை %d" + +#: ../gio/gdbusauth.c:297 +msgid "Unexpected lack of content trying to read a line" +msgstr "எதிர்பார்க்கப்படாத உள்ளடக்கத்தின் பற்றாக்குறை ஒரு வரியில் வாசிக்க முயற்சிக்கிறது" + +#: ../gio/gdbusauth.c:341 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" +"எதிர்பார்க்கப்படாத உள்ளடக்கத்தின் பற்றாக்குறை ஒரு வரியில் (பாதுகாப்பாக) வாசிக்க " +"முயற்சிக்கிறது" + +#: ../gio/gdbusauth.c:512 +#, c-format +msgid "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"அனைத்து கிடைக்கும் அங்கீகார நுட்பங்கள் வெளியேறப்பட்டது (முயற்சித்தது: %s) (இருப்பவை: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer வழியாக ரத்துசெய்யப்பட்டது" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "`%s' கோப்புறைக்கான தகவலைப் பெறுகையில் பிழை: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "அடைவிலுள்ள `%s' அனுமதிகள் தவறானது. எதிர்பாக்கப்பட்ட முறைமை 0700, கிடைத்தது 0%o ஆகும்" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "பிழை உருவாக்கும் அடைவு `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "திறக்கும் கீரிங் `%s' க்காக வாசிப்பத்தில் பிழை: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "கீரிங்கின் வரி %d `%s' இல் உள்ளடக்கத்துடன் `%s' தவறானது" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "வரியின் முதல் டோக்கன் %d கீரிங் `%s'இல் உள்ளடக்கத்துடன் `%s' தவறானது" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "வரியின் இரண்டாவது டோக்கன் %d கீரிங் `%s'இல் உள்ளடக்கத்துடன் `%s' தவறானது" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "id %d உடன் `%s' விசைரிங்கில் குக்கீயை தேட முடியவில்லை" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "பிழை அழிக்கும் பழைய பூட்டு கோப்பு `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "பிழை உருவாக்கும் பூட்டு கோப்பு '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "பிழை மூடும் (இணைப்பில்லாத) பூட்டு கோப்பு `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "பிழை இணைப்பு நீக்கும் பூட்டு கோப்பு '%s' : %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "எழுதுவதற்காக பிழை திறக்கும் கீரிங் `%s' : " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(கூடுதலாக, `%s' க்காக வெளியிடும் பூட்டும் தொல்வியுற்றது: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "இணைப்பு மூடப்பட்டது" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "நேரம்முடிவு பெறப்பட்டது" + +#: ../gio/gdbusconnection.c:2562 +msgid "Unsupported flags encountered when constructing a client-side connection" +msgstr "ஒரு கிளையன்ட் -பக்க இணைப்பை உருவாக்கும் போது ஆதரிக்கப்படாத கொடிகள் எதிர்ப்பட்டன" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "`org.freedesktop.DBus.Properties' பொருளில் %s பாதையில் இது போன்ற இடைமுகம் இல்லை" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "பிழை அமைக்கும் பண்பு `%s': எதிர்பார்க்கப்பட்ட வகை `%s' ஆனால் கிடைத்தது `%s' ஆகும்" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' போன்ற பண்பு எதுவும் இல்லை" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "பண்பு '%s' ஐ வாசிக்க முடியவில்லை" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "பண்பு '%s' ஐ எழுத முடியவில்லை" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' போன்ற இடைமுகம் இல்லை" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "இது போன்ற இடைமுகம் இல்லை" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "`%s' பொருளில் பாதை %s போன்ற இடைமுகம் இல்லை" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "`%s' போன்ற முறை இல்லை" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "செய்தியின் வகை, `%s', எதிர்பார்க்கப்பட வகை `%s' க்கு பொருந்தவில்லை" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "இடைமுகம் %s க்காக %s இல் ஏற்கனவே ஒரு பொருள் ஏற்றுமதி செய்யப்பட்டது" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "முறை `%s' திரும்பிய வகை `%s', ஆனால் எதிர்பார்க்கப்பட்டது `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "இடைமுகத்தில் `%s' முறை `%s' உடன் கையெழுத்து `%s' இல்லை" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "ஒரு துணைமரமானது %s க்காக ஏற்கனவே வெளியேற்றப்பட்டது" + +#: ../gio/gdbusmessage.c:1270 +msgid "type is INVALID" +msgstr "வகை தவறானது" + +#: ../gio/gdbusmessage.c:1281 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL செய்தி: பாதை அல்லது உறுப்பினர் தலைப்பு புலம் விடுபடுகிறது" + +#: ../gio/gdbusmessage.c:1292 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN செய்தி: REPLY_SERIAL தலைப்பு புலம் விடுபடுகிறது" + +#: ../gio/gdbusmessage.c:1304 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR செய்தி: REPLY_SERIAL அல்லது ERROR_NAME தலைப்பு புலம் விடுபடுகிறது" + +#: ../gio/gdbusmessage.c:1317 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL செய்தி: PATH, INTERFACE அல்லது MEMBER தலைப்பு புலம் விடுபடுகிறது" + +#: ../gio/gdbusmessage.c:1325 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL செய்தி: PATH தலைப்பு புலம் /org/freedesktop/DBus/Local க்காக முன்பதியப்பட்ட " +"மதிப்பினை பயன்படுத்துகிறது" + +#: ../gio/gdbusmessage.c:1333 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL செய்தி: INTERFACE தலைப்பு புலம் /org/freedesktop/.DBus/Local க்காக " +"முன்பதியப்பட்ட மதிப்பினை பயன்படுத்துகிறது" + +#: ../gio/gdbusmessage.c:1382 +#, c-format +#| msgid "Wanted to read %lu byte but got EOF" +#| msgid_plural "Wanted to read %lu bytes but got EOF" +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "%lu பைட்டுகளை வாசிக்க விரும்பியது ஆனால் %lu மட்டுமே கிடைத்தது" +msgstr[1] "%lu பைட்டை வாசிக்க விரும்பியது ஆனால் %lu மட்டுமே கிடைத்தது" + +#: ../gio/gdbusmessage.c:1397 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Expected NUL byte after the string `%s' but found byte %d" + +#: ../gio/gdbusmessage.c:1416 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"எதிர்பார்க்கப்பட்ட சரியான UTF-8 சரம் ஆனால்தவறான கைட்டுகள் பைட் ஆஃப்செட் %d இல் கிடைத்தது " +"(சரத்தின் நீளம் %d). சரியான UTF-8 சரமானது `%s' புள்ளி இருக்கும் வரை" + +#: ../gio/gdbusmessage.c:1618 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "பகுக்கப்பட்ட மதிப்பு '%s' ஆனது ஒரு சரியான D-Bus பொருள் பாதை இல்லை" + +#: ../gio/gdbusmessage.c:1642 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "பகுக்கப்பட்ட மதிப்பு '%s' ஆனது ஒரு சரியான D-Bus கையெழுத்து இல்லை" + +#: ../gio/gdbusmessage.c:1697 +#, c-format +msgid "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"எதிர்கொள்ளப்பட்ட அம்புக்குறியின் நீளம் %u பைட். அதிகபட்ச நீளம் 2<<26 bytes (64 MiB)." +msgstr[1] "" +"எதிர்கொள்ளப்பட்ட அம்புக்குறி நீள %u பைட்டுகள். அதிகபட்ச நீளம் 2<<26 bytes (64 MiB)." + +#: ../gio/gdbusmessage.c:1850 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "மாறிக்கான பகுக்கப்பட்ட மதிப்பு `%s' ஆனது ஒரு சரியான D-Bus கையெழுத்திற்கு இல்லை" + +#: ../gio/gdbusmessage.c:1874 +#, c-format +msgid "Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "GVariant உடன் சர வகை `%s' இலிருந்து D-Bus ஒயர் வடிவத்தில் வரிசைநீக்கப்பட்ட பிழை" + +#: ../gio/gdbusmessage.c:2061 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"தவறாக முடிவுறும் மதிப்பு. எதிர்பார்க்கப்பட்டது 0x6c ('l') or 0x42 ('B') ஆனால் " +"காணப்பட்ட மதிப்பு 0x%02x" + +#: ../gio/gdbusmessage.c:2074 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "தவறான முக்கியமான நெறிமுறை பதிப்பு. எதிர்பார்க்கப்பட்டது 1 ஆனால் %d காணப்பட்டது" + +#: ../gio/gdbusmessage.c:2130 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" +"கையெழுத்து தலைப்பு கையெழுத்து `%s' உடன் காணப்பட்டது ஆனால் செய்தியின் மூயப்பகுதி " +"காலியாக உள்ளது" + +#: ../gio/gdbusmessage.c:2144 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "பகுக்கப்பட்ட மதிப்பு '%s' ஆனது ஒரு சரியான D-Bus கையெழுத்து இல்லை (மையத்திற்கு)" + +#: ../gio/gdbusmessage.c:2174 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "கையெழுத்து தலைப்பு எதுவும் செய்தியில் இல்லை ஆனால் செய்தி மையப்பகுதி %u பைட் ஆகும்" +msgstr[1] "" +"கையெழுத்து தலைப்பு எதுவும் செய்தியில் இல்லை ஆனால் செய்தி மையப்பகுதி %u பைட்டுகள் ஆகும்" + +#: ../gio/gdbusmessage.c:2184 +msgid "Cannot deserialize message: " +msgstr "செய்தி வரிசைநீக்க முடியவில்லை:" + +#: ../gio/gdbusmessage.c:2505 +#, c-format +msgid "Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "GVariant உடன் சர வகை `%s' இலிருந்து D-Bus ஒயர் வடிவத்தில் வரிசைநீக்கப்பட்ட பிழை" + +#: ../gio/gdbusmessage.c:2642 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"செய்தியானது %d கோப்பு விளக்கிகளை கொண்டுள்ளது ஆனால் புலமானது %d கோப்பு விளக்கியை " +"சுட்டிக் காட்டுகிறது" + +#: ../gio/gdbusmessage.c:2650 +msgid "Cannot serialize message: " +msgstr "செய்தியை வரிசைப்படுத்த முடியவில்லை:" + +#: ../gio/gdbusmessage.c:2694 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "செய்திப் பகுதி கையெழுத்து `%s' ஐ கொண்டுள்ளது ஆனால் கையெழுத்து தலைப்பு இல்லை" + +#: ../gio/gdbusmessage.c:2704 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"செய்திப் பகுதி வகை கையெழுத்து `%s' ஐ கொண்டுள்ளது ஆனால் கையெழுத்து தலைப்பு புலம் '%s' " +"இல் உள்ளது" + +#: ../gio/gdbusmessage.c:2720 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "செய்திப் பகுதி காலியாக உள்ளது ஆனால் கையெழுத்து தலைப்பு புலம் '(%s)' இல் உள்ளது" + +#: ../gio/gdbusmessage.c:3270 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "வகை மையத்துடன் `%s' திரும்பும் பிழை" + +#: ../gio/gdbusmessage.c:3278 +msgid "Error return with empty body" +msgstr "காலியான மையத்துடன் பிழை திரும்பும்" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "வன்பொருள் விவரத்தொகுப்பைப் பெற முடியவில்லை: %s" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id அல்லது /etc/machine-id ஐ ஏற்ற முடியவில்லை: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "பிழை அழைக்கும் StartServiceByName க்கான %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr " எதிர்பார்க்கப்படாத பதில் %d StartServiceByName(\"%s\") முறையிலிருந்து" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"முறை செயலாக்க முடியவில்லை; ஒரு நன்றாக தெரியும் பெயருடைய ப்ராக்ஸி ஒரு உரிமையாளர் " +"இல்லாமல் ப்ராக்ஸியானது G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START கொடியுடன் கட்டப்பட்டது" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "சுருக்க பெயர் இடத்திற்கு துணைபுரிவதில்லை" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "ஒரு சேவையகத்தை உருவாக்கும் போது நினைவுக்குறியீட்டை குறிப்பிட முடியவில்லை" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' இல் பிழை எழுதும் தற்சமய கோப்பு: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "சரம் '%s' ஒரு சரியான D-Bus GUID இல்லை" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "துணைபுரியாத போக்குவரத்து `%s' ஐ கவனிக்க முடியவில்லை" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "COMMAND" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "பிழை: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "பிழை பகுக்கும் உள்ளாய்வு XML: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "கணினி பஸ்ஸிற்கு இணைக்கிறது" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "அமர்வு பஸ்ஸுக்கு இணைக்கிறது" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "கொடுக்கப்பட்ட D-Bus முகவரிக்கு இணைக்கவும்" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "இணைப்பு இறுதிபுள்ளி விருப்பங்கள்:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "இணைப்பு முடிவுபுள்ளியில் விருப்பங்களை குறிப்பிடப்படுகிறது" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "இறுதிபுள்ளியில் இணைப்பு எதுவும் குறிப்பிடப்படவில்லை" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "பல இணைப்பு இறுதிபுள்ளிகளில் குறிப்பிடப்பட்டது" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "எச்சரிக்கை: தன்னிலை தரவின் படி, முறை இடைமுகம் `%s' இல்லை\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "எச்சரிக்கை: தன்னிலை தரவின் படி, முறை `%s' இடைமுகம் `%s' இல் இல்லை\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "சிக்னலுக்கான விருப்பமான இலக்கு ( தனிப்பட்ட பெயர்)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "சிக்னல் ஆன்னை வெளியேறுவதற்கு பொருள் பாதை" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "சிக்னல் மற்றும் இடைமுக பெயர்" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "ஒரு சிக்னலை வெளியிடு." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "பிழை இணைக்கிறது: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "பிழை: பொருள் பாதை குறிப்பிடப்படவில்லை\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "பிழை: %s ஒரு சரியான பெயர் பாதை இல்லை\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "பிழை: சிக்னல் குறிப்பிடப்படவில்லை.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "பிழை: சிக்னல் ஒரு முழு தகுதிவாய்ந்த பெயராக இருக்க வேண்டும்.\n" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "பிழை: %s ஒரு சரியான இடைமுக பெயர் இல்லை\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "பிழை: %s ஒரு சரியான நபர் பெயர் இல்லை\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "பிழை: %s ஆனது ஒரு சரியான ஒத்த பஸ் பெயர் இல்லை.\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "பிழை பகுக்கும் அளவுரு %d: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "பிழை சுத்தமாக்கும் இணைப்பு: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "இலக்கு பெயரானது முறையை ஆன்னாக்க செயலாக்குகிறது" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "பொருள் பாதை முறையை ஆன்னாக்க செயலாக்குகிறது" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "முறை மற்றும் இடைமுகப் பெயர்" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "விநாடிகள் நேரம் முடிந்தது" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "ஒரு தொலை பொருளில் ஒரு முறை செயலாற்றுகிறது." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "பிழை: இலக்கு குறிப்பிடப்படவில்லை\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "பிழை: பொருள் பாதை குறிப்பிடப்படவில்லை\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "பிழை: முறைப் பெயர் குறிப்பிடப்படவில்லை\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "பிழை: முறை பெயர் `%s' தவறானது\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "பிழை பகுக்கும் அளவுரு %d வகை `%s': %s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "உள்ளாய்விற்கு இலக்கு பெயர்" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "உள்ளாய்விற்கு பொருள் பாதை" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "XML ஐ அச்சிடு" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "உள்ளாய்வு குழந்தை" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "அச்சு பண்புகள் மட்டும்" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "ஒரு தொலை பொருளை உள்ளாயவும்." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "கணிப்பதற்கான இலக்கு பெயர்" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "கணிப்பதற்கான பொருள் பாதை" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "ஒரு தொலை பொருளை கணிக்கவும்." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "பெயரில்லாதது" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "பணிமேடை கோப்பு Exec புலம் குறிப்பிடப்படவில்லை" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "விண்ணப்பத்திற்கு தேவைப்படும் முனையத்தை கண்டுபிடிக்க இயலவில்லை" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "பயனர் விண்ணப்ப கட்டமைப்பு கோப்புறை %sஐ உருவாக்க இயலவில்லை: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "பயனர் MIME கட்டமைப்பு கோப்புறை %s உருவாக்க இயலவில்லை: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "பயன்பாட்டு தகவல் ஒரு அடையாளங்காட்டியை இல்லாமல் செய்கிறது" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "பயனர் டெஸ்க்டாப் கோப்பு %s உருவாக்க முடியாது" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "%sக்கு தனிபயன் விளக்கம்" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "இயக்கி eject_with_operation அல்லது வெளியேற்றம் செயல்படுத்தப்படுவில்லை" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "இயக்கி ஊடகத்தில் பதிவு செய்யப்படவில்லை" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "இயக்கி துவக்கத்தை செயல்படுத்தப்படுவில்லை" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "இயக்கி நிறுத்தத்தை செயல்படுத்தப்படுவில்லை" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS துணை கிடைக்கவில்லை" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "பதிப்பு %d GEmblem குறிமுறையில் கையாள முடியவில்லை" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "தவறான டோக்கன்களின் எண்ணிக்கை (%d) GEmblem குறிமுறையில்" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "பதிப்பு %dஐ GEmblemedIcon குறிமுறையில் கையாள முடியவில்லை" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "தவறான டோக்கன் எண்ணிக்கை (%d) GEmblemedIcon குறிமுறையில்" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon க்காக ஒரு GEmblem எதிர்பார்க்கப்படுகிறது" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7258 ../gio/gfile.c:7348 ../gio/gfile.c:7432 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "கொண்டுள்ள மவுண்ட் இல்லை" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "அடைவுக்கு மேலாக நகலெடுக்க முடியாது" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "அடைவுக்கு மேலாக அடைவினை நகலெடுக்க முடியாது" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "இலக்கு கோப்பு வெளியேற்றப்பட்டது" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "அடைவை மீண்டும் நகலெடுக்க முடியவில்லை" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "ஸ்ப்லைஸுக்கு துணைபுரியவில்லை" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "பிழையை பிளக்கும் கோப்பு: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "சிறப்பு கோப்பை நகலெடுக்க முடியவில்லை" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "தவறான symlink மதிப்பு கொடுக்கப்பட்டுள்ளது" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "குப்பை ஆதரவு கிடையாது" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "'%c' கோப்பின் பெயர்களை பெற்றிருக்கவில்லை" + +#: ../gio/gfile.c:6323 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "தொகுதி மவுண்டை செயல்படுத்தவில்லை" + +#: ../gio/gfile.c:6431 +msgid "No application is registered as handling this file" +msgstr "இந்த கோப்பைக் கையாள எந்த பதிவு செய்யப்பட்ட விண்ணப்பமும் இல்லை" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "எண்ணிடல் மூடப்பட்டது" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "கோப்பு எண்ணிடல் சிறந்த செயல்பாட்டை கொண்டுள்ளது" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "ஸ்ட்ரீம் query_infoக்கு துணைபுரியவில்லை" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "ஸ்ட்ரீமில் தேடுதல் துணைபுரியவில்லை" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "உள்ளீடு ஸ்ட்ரீமில் வெட்டுதல் அனுமதி இல்லை" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "ஸ்ட்ரீமில் வெட்டுதல் துணைபுரியவில்லை" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "தவறான டோக்கன்களின் எண்ணிக்கை (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "வகுப்பு பெயர் %sக்கு வகை இல்லை" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "வகை %s GIcon முகப்பை செயல்படுத்தவில்லை" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "வகை %s பிரிக்கப்படவில்லை" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "தவறான பதிப்பு எண்: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "வகை %s from_tokens()ஐ GIcon முகப்பில் செயல்படுத்தவில்லை" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "வழங்கப்பட்ட சின்ன குறியீடாக்கத்தின் பதிப்பை கையாள முடியவில்லை" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "முகவரி குறிப்பிடப்படவில்லை" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "முகவரியின் நீளம் %u மிக நீளமானது" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "முகவரியில் முன்னொட்டு நீளத்திற்கும் அதிகமான பிட்டுகள் உள்ளன" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' ஐ IP முகவரி மூடியாக பாகுபடுத்த முடியவில்லை" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "சாக்கெட் முகவரிக்கு போதிய இடம் இல்லை" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "துணைபுரியாத சாக்கெட் முகவரி" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "ஸ்ட்ரீம் சிறந்த செயல்பாட்டை கொண்டுள்ளது" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "உருப்படி <%s> உள்ளே அனுமதிக்கப்படுவதில்லை <%s>" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "உருப்படி <%s> மேல்நிலையில் அனுமதிக்கப்படவில்லை" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "%s என்ற கோப்பு வளத்தில் பல முறை உள்ளதாகத் தெரிகிறது" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "எந்த மூலக் கோப்பகத்திலும் '%s' ஐக் கண்டறிய முடியவில்லை" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "நடப்பு கோப்பகத்தில் '%s' ஐக் கண்டறிய முடியவில்லை" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "தெரியாத செயலாக்க விருப்பம் \"%s\"" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "தற்காலிகக் கோப்பை உருவாக்குவதில் தோல்வி: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint கொண்டு உள்ளீட்டுக் கோப்பைச் செயலாக்குவதில் பிழை:\n" +"%s" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata வைக் கொண்டு உள்ளீட்டுக் கோப்பைச் செயலாக்குவதில் பிழை:\n" +"%s" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "%s கோப்பை வாசிக்கும் போது பிழை: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "%s கோப்பை கம்ப்ரஸ் செய்யும் போது பிழை: " + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "உரை உள்ளே தோன்றாமல் இருக்கலாம் <%s>" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "வெளியீட்டுக் கோப்பின் பெயர்" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"படிக்க வேண்டிய கோப்புகளைக் கொண்டுள்ள கோப்பகங்கள் (நடப்பு கோப்பகத்திற்கு முன்னிருப்பாக " +"அமைந்திருப்பது)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "Generate output in the format selected for by the target filename extension" +msgstr "இலக்கு கோப்புப் பெயர் நீட்சியால் தேர்ந்தெடுக்கப்பட்ட வெளியீட்டு வடிவத்தை உருவாக்கு" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "மூலத் தலைப்பை உருவாக்கு" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "உங்கள் குறீயீட்டில் வளக் கோப்பில் இணைக்கப் பயன்படும் மூலக்குறியீட்டை உருவாக்கு" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "சார்நிலைப் பட்டியலை உருவாக்கு" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "வளத்தை தானாக உருவாக்கி பதிவு செய்ய வேண்டாம்" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "சார்புகளை ஏற்றுமதி செய்ய வேண்டாம்; அவற்றை முன்னறிவிக்கவும் G_GNUC_INTERNAL" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "உருவாக்கப்பட்ட மூலக் குறியீட்டுக்கு C ஐடன்ட்டிஃபயர் பெயர் பயன்படுத்தப்பட்டுள்ளது" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"ஒரு வளக் கோப்பில் வள விவரக்குறிப்பை கம்பைல் செய்.\n" +"வள விவரக்குறிப்பு கோப்புக்கு .gresource.xml என்ற நீட்சி இருக்கும்,\n" +"வளக் கோப்புக்கு .gresource என்ற நீட்சி இருக்கும்." + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "நீங்கள் சரியாக ஒரு கோப்புப் பெயரையே கொடுக்க வேண்டும்\n" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "காலி பெயர்கள் அனுமதிக்கப்படுவதில்லை" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "தவறான பெயர் '%s': பெயர்கள் ஒரு சிறிய எழுத்தில் ஆரம்பிக்க வேண்டும்" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"தவறான பெயர் '%s': தவறான எழுத்து '%c'; சிறிய எழுத்துக்கள், எண்கள் மற்றும் டேஷ் ('-') " +"ஆகியவை மட்டுமே அனுமதிக்கப்படும்." + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "தவறான பெயர் '%s': இரண்டு அடுத்தடுத்த டேஷ்கள் ('--') அனுமதிக்கப்படாது." + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "தவறான பெயர் '%s': கடைசி எழுத்து ஒரு கோடாக இருக்காது ('-')." + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "தவறான பெயர் '%s': அதிகபட்ச நீளமானது 1024 ஆகும்" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " ஏற்கனவே குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "ஒரு திட்டத்தின் 'பட்டியலில்' விசைகளை சேர்க்க முடியாது" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " ஏற்கனவே குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" நிழல்கள் இதில் ; மாற்று மதிப்பை " +"பயன்படுத்தவும் " + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "சரியாக ஒரு 'வகை', 'enum' அல்லது 'கொடிகள்' இதற்கு ஒரு பண்பில் குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> இன்னும் வரையறுக்கப்படவில்லை." + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "தவறான GVariant வகை சரம் '%s'" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " கொடுக்கப்பட்டது ஆனால் திட்டத்தில் எதுவும் நீடிக்கவில்லை" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "க்கு மேலேற்றவில்லை" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " ஏற்கனவே குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr " ஏற்கனவே குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " இன்னும் இருக்கும் திட்டம் '%s' ஐ நீட்டிக்கிறது" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " இன்னும் இருக்கும் திட்டம் '%s'ஐ பட்டியலில் உள்ளது" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "ஒரு பாதையுடன் ஒரு திட்டத்தின் பட்டியலிட முடியாது" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "ஒரு பாதையுடன் ஒரு திட்டத்தை நீட்ட முடியாது" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid " is a list, extending which is not a list" +msgstr "" +" ஒரு பட்டியல், எது பட்டியலில் இல்லையோ ஐ " +"நீட்டிக்கிறது" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" நீட்டிக்கிறது ஆனால் " +"'%s' ஆனது '%s'ஐ நீட்டிக்கவில்லை" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ஒரு பாதை, கொடுக்கப்பட்டால்ர ஒரு ஸ்லாஷ் முடிவுடன் துவக்கப்பட வேண்டும்" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ஒரு பட்டியலின் பாதை முடிவுடன் இருக்க வேண்டும் ':/'" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id ='%s'> ஏற்கனவே குறிப்பிடப்பட்டது" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "கூறு <%s> மேல்நிலையில் அனுமதிக்கப்படாது" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict குறிப்பிடப்பட்டது; வெளியேறுகிறது.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "இந்த முழு கோப்பு புறக்கணிக்கப்படலாம்.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "இந்த கோப்பை புறக்கணிக்கிறது.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"`%s' திட்டத்தில் `%s' ஆக குறிப்பிடப்படும் புறக்கணிக்கும் கோப்பு `%s' இல் விசை எதுவும் " +"இல்லை" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; புறக்கணிப்பதற்கான இந்த விசையை புறக்கணிக்கிறது.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " மற்றும் --strict குறிப்பிடப்பட்டது; வெளியேறுகிறது.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +msgid "error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "" +"`%s' திட்டத்தில் `%s' ஆக குறிப்பிடப்படும் புறக்கணிக்கும் கோப்பில் பிழை பகுக்கும் விசை `" +"%s': %s. " + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "புறக்கணிப்பதற்கான இந்த விசையை புறக்கணிக்கிறது.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"ஓவர்ரைடு கோப்பு `%s' இல் உள்ள திட்டம் `%s' இல் உள்ள விசை`%s'திட்டத்தில் கொடுக்கப்பட்டுள்ள " +"வரம்புக்கு வெளியே உள்ளது" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"`%s' திட்டத்திற்கான விசையை புறக்கணித்து `%s' புறக்கணிப்பு கோப்பில் `%s' ஆனது சரியான " +"தேர்வுகளின் பட்டியலில் இல்லை" + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled கோப்பில் எங்கே சேமிப்பது" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "திட்டங்களிலுள்ள ஏதாவது பிழைகளை ஒதுக்கவும்" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled கோப்பில் எழுத முடியாது" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "விசை பெயர் கட்டுப்பாடுகளை வலுயுறுத்த கூடாது" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"அனைத்துGSettings திட்ட கோப்புகளை ஒரு செக்கின் ஒரு திட்டத்தில் தொகுத்தெழுதவும்.\n" +"extension .gschema.xml போன்றவற்றை திட்டக் கோப்புகள், மற்றும்\n" +"gschemas.compiled என அழைக்கப்படும் செக் கோப்பின் கொண்டிருக்க வேண்டும்." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "நீங்கள் சரியாக ஒரு நேரடி பெயரை கொடுக்க வேண்டும்\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "திட்ட கோப்புகள் எதுவும் காணப்படவில்லை:" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "செய்வதற்கு ஒன்றுமில்லை.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "இருக்கும் வெளிப்பாடு கோப்பு நீக்கப்பட்டது.\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "முன்னிருப்பு உள்ளமை அடைவு மானிட்டர் வகையை தேட முடியவில்லை" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "செல்லுபடியாகாத கோப்பு பெயர் %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "கோப்பு முறைமை தகவலை பெறும் போது பிழை: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "ரூட் அடைவை மறுபெயரிட முடியவில்லை" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "கோப்பு மறுபெயரிடும் போது பிழை: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "கோப்பை மறுபெயரிட முடியவில்லை, கோப்புபெயர் ஏற்கனவே உள்ளது" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "தவறான கோப்பு பெயர்" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "அடைவை திறக்க இயலவில்லை" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "கோப்பு திறக்கும் போது பிழை: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "கோப்பு நீக்கும் போது பிழை: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "கோப்பினை குப்பைக்கு அனுப்பும் போது பிழை: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "குப்பை அடைவு %sஐ உருவாக்க முடியவில்லை: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "குப்பைக்கு மேல் நிலை அடைவை தேட முடியவில்லை" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "குப்பை அடைவை தேட அல்லது உருவாக்க முடியவில்லை" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "குப்பை தகவல் கோப்பினை உருவாக்க முடியவில்லை: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "கோப்பை இழுக்க முடியவில்லை: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "உள்ளமை தவறு" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "அடைவை உருவாக்கும்போது பிழை: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "கோப்பு முறைமை அடையாள இணைப்புகளுக்கு துணைபுரியவில்லை" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "குறிப்பீட்டின் இணைப்பை ஏற்படுத்துவதுல் பிழை: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "பிழை நகர்த்தும் கோப்பு: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "அடைவில் அடைவை நகர்த்த முடியவில்லை" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "பின்சேமிப்பு கோப்பு உருவாக்க முடியவில்லை" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "பிழை நீக்கும் இலக்கு கோப்பு : %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "மவுண்டிற்கிடையே நகர்த்த முடியவில்லை" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "அளவுரு மதிப்பு பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "தவறான அளவுரு வகை (சரம் எதிர்பார்க்கப்பட்டது)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "பண்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "விரிவான அளவுரு'%s' அமைப்பதில் பிழை: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (தவறான குறிமுறை)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "கோப்பு '%s' க்கான தகவலைப் பெறூம் போது பிழை: %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "கோப்பு டிஸ்க்ரிப்ட்டருக்கான தகவலைப் பெறுவதில் பிழை: %s" + +#: ../gio/glocalfileinfo.c:2026 +msgid "Invalid attribute type (uint32 expected)" +msgstr "தவறான அளவுரு வகை (uint32 எதிர்ப்பார்க்கப்பட்டது)" + +#: ../gio/glocalfileinfo.c:2044 +msgid "Invalid attribute type (uint64 expected)" +msgstr "தவறான அளவுரு வகை (uint64 எதிர்பார்க்கப்பட்டது)" + +#: ../gio/glocalfileinfo.c:2063 ../gio/glocalfileinfo.c:2082 +msgid "Invalid attribute type (byte string expected)" +msgstr "தவறான அளவுரு வகை (பைட் சரம் எதிர்பார்க்கப்பட்டது)" + +#: ../gio/glocalfileinfo.c:2117 +msgid "Cannot set permissions on symlinks" +msgstr "symlinksக்கு அனுமதிகளை அமைக்க முடியவில்லை" + +#: ../gio/glocalfileinfo.c:2133 +#, c-format +msgid "Error setting permissions: %s" +msgstr "பிழை அமைப்பதில் அனுமதி: %s" + +#: ../gio/glocalfileinfo.c:2184 +#, c-format +msgid "Error setting owner: %s" +msgstr "மாற்றும் போது பிழை: %s" + +#: ../gio/glocalfileinfo.c:2207 +msgid "symlink must be non-NULL" +msgstr "symlink பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: ../gio/glocalfileinfo.c:2217 ../gio/glocalfileinfo.c:2236 +#: ../gio/glocalfileinfo.c:2247 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink: %s கை அமைப்பதில் பிழை" + +#: ../gio/glocalfileinfo.c:2226 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink அமைப்பதில் பிழை: கோப்பு ஒரு symlinkஆக இல்லை" + +#: ../gio/glocalfileinfo.c:2352 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "மாற்றத்தை அமைக்கும் போது அல்லது அணுகல் நேரத்தில் பிழை: %s" + +#: ../gio/glocalfileinfo.c:2375 +msgid "SELinux context must be non-NULL" +msgstr "SELinux சூழல் பூஜ்ஜியமாக இருக்கக்கூடாது" + +#: ../gio/glocalfileinfo.c:2390 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux சூழலை அமைப்பதில் பிழை: %s" + +#: ../gio/glocalfileinfo.c:2397 +msgid "SELinux is not enabled on this system" +msgstr "SELinux இந்த கணினியில் செயல்படுத்தப்படவில்லை" + +#: ../gio/glocalfileinfo.c:2489 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "அளவுரு %s ஐ அமைப்பதில் ஆதரவு கிடையாது" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "கோப்பிலிருந்து வாசிக்கும் போது பிழை: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "கோப்பை பார்க்கும் போது பிழை: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "கோப்பை முடிக்கும் போது பிழை: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "முன்னிருப்பு உள்ளமை கோப்பு மானிட்டர் வகையை தேட முடியவில்லை" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "பிழையை எழுதும் கோப்பு: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "பழைய பின்சேமிப்பு இணைப்பை நீக்குவதில் பிழை: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "பின்சேமிப்பு நகலை உருவாக்குவதில் பிழை: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "மறுபெயரிடப்பட்ட தற்காலிக கோப்பில் பிழை: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "கோப்பு வாசிக்கும் போது பிழை: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' பிழையை திறக்கும் கோப்பு: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "இலக்கு கோப்பு ஒரு அடைவில்லை" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "இலக்கு கோப்பு ஒரு நிரந்தர கோப்பு இல்லை" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "இந்த கோப்பு வெளியார்ந்து மாற்றப்பட்டுள்ளது" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "பிழையை நீக்கும் பழைய கோப்பு: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:748 +msgid "Invalid GSeekType supplied" +msgstr "தவறான GSeekType கொடுக்கப்பட்டுள்ளது" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "தவறான தேடும் கோரிக்கை" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStreamஐ தசமமிட முடியவில்லை" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "நினைவக வெளிப்பாடு ஸ்ட்ரீம் அளவிடக்கூடியதல்ல" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "நினைவக வெளிப்பாடு ஸ்ட்ரீமை மறுஅளவிட முடியவில்லை" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"செயல்பாட்டிற்கு எழுத தேவைப்படும் நினைவக தொகையானது இருக்கும் முகவரி இடத்தை விட " +"பெரியதாகும்" + +#: ../gio/gmemoryoutputstream.c:758 +msgid "Requested seek before the beginning of the stream" +msgstr "ஸ்ட்ரெம் துவக்கத்திற்கு முன் பெற வேண்டும்" + +#: ../gio/gmemoryoutputstream.c:767 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "ஏற்றம் \"ஏற்றம் நீக்கம்\"ஐ செயல்படுத்த முடியவில்லை" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount ஒருங்கிணைத்தல் உள்ளடக்க வகையை செயல்படுத்தவில்லை" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "புரவலன் பெயர் '%s' '[' but not ']'ஐ கொண்டுள்ளது" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "பிணையத்தை அடையமுடியவில்லை" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "வழங்கியை அடைய முடியவில்லை" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "பிணைய மானிட்டரை உருவாக்க முடியவில்லை: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "பிணைய மானிட்டரை உருவாக்க முடியவில்லை:" + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "நெட்வொர்க் நிலையைப் பெற முடியவில்லை:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "வெளிப்பாடு ஸ்ட்ரீம் எழுதுதலை செயல்படுத்தவில்லை" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "மூல ஸ்ட்ரீம் ஏற்கனவே மூடப்பட்டது" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' இல் உள்ள வளம் இல்லை" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' இல் உள்ள வளம் டிகம்ரஸ் செயலில் தோல்வியடைந்தது" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "%s இல் உள்ள வளம் ஒரு கோப்பகமல்ல" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "உள்ளீடு ஸ்ட்ரீம் வாசிப்பை செயல்படுத்தவில்லை" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "உதவியை அச்சிடவும்" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "ஒரு elf FILE இல் வளங்களைக் கொண்டுள்ள பிரிவுகளைப் பட்டியலிடு" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"வளங்களைப் பட்டியலிடு\n" +"SECTION கொடுக்கப்பட்டால், இந்தப் பிரிவில் உள்ள வளங்களை மட்டும் பட்டியலிடு\n" +"PATH கொடுக்கப்பட்டால், பொருந்தும் வளங்களை மட்டும் பட்டியலிடு" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"விவரங்களுடன் வளங்களைப் பட்டியலிடு\n" +"SECTION கொடுக்கப்பட்டால், இந்தப் பிரிவில் உள்ள வளங்களை மட்டும் பட்டியலிடு\n" +"PATH கொடுக்கப்பட்டால், பொருந்தும் வளங்களை மட்டும் பட்டியலிடு\n" +"விவரங்களில் பிரிவு, அளவு மற்றும் கம்ப்ரெஷன் ஆகியவை இருக்கும்" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "ஒரு வளக் கோப்பை stdout க்கு பிரித்தெடு" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"தெரியாத கட்டளை %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"பயன்பாடு:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"கட்டளைகள்:\n" +" help இந்தத் தகவலைக் காண்பி\n" +" sections வளப் பிரிவுகளைப் பட்டியலிடு\n" +" list வளங்களைப் பட்டியலிடு\n" +" details வளங்களை விவரங்களுடன் பட்டியலிடு\n" +" extract ஒரு வளத்தைப் பிரித்தெடு\n" +"\n" +"விவரமான உதவியைப் பெற 'gresource help COMMAND' கட்டளையைப் பயன்படுத்தவும்.\n" +"\n" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"பயன்பாடு:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "விவாதங்கள்:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION ஒரு (விரும்பினால் பயன்படுத்தும்) elf பிரிவு பெயர்\n" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND விவரிப்பதற்கான (விருப்பமான) கட்டளை\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE ஒரு elf கோப்பு (பைனரி அல்லது பகிரப்பட்ட லைப்ரரி)\n" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE ஒரு elf கோப்பு (பைனரி அல்லது பகிரப்பட்ட லைப்ரரி)\n" +" அல்லது கம்பைல் செய்யப்பட்ட வளக் கோப்பு\n" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH ஒரு (விரும்பினால் பயன்படுத்தும்) வளப் பாதை (பகுதியாக இருக்கக்கூடும்)\n" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr " PATH வளப் பாதை\n" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "'%s' போன்ற திட்டம் எதுவும் இல்லை\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "திட்டம் '%s' ஆனது மறு அமைக்கப்பட்டது (பாதை குறிப்பிடப்பட வேண்டும்)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "திட்டம் '%s' ஆனது மறு அமைக்கப்பட்டது (பாதை குறிப்பிடப்பட வேண்டும்)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "காலி பாதை கொடுக்கப்பட்டது.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "பாதை ஒரு ஸ்லாஷ் உடன் துவங்கப்பட வேண்டும் (/)\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "பாதை ஒரு ஸ்லாஷ் உடன் முடிக்கப்பட வேண்டும் (/)\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "பாதையானது இரண்டு அருகிலுள்ள ஸ்லாஷ்களை கொண்டிருக்க வேண்டும் (//)\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "'%s' போன்ற விசை எதுவும் இல்லை\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "மதிப்பு வரம்பின் வெளிப்பக்கத்தில் வழங்கப்பட்ட மதிப்பு\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "நினுவப்பட்ட (மறுஅமைக்க முடியாத) திட்டங்களின் பட்டியல்" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "நிறுவப்படக்கூடிய மறுஅமைக்கக்கூடிய திட்டங்களின் பட்டியல்" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "திட்டத்தில் விசைகளில் பட்டியல்" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "திட்டத்தின் சேய் பட்டியல்" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"விசைகள் மதிப்புகள், சுழல்நிலையின் பட்டியல்\n" +"SCHEMA கொடுக்கப்படவில்லை எனில், அனைத்து விசைகளையும் பட்டியவிடவும்\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "விசையின் மதிப்பை பெறவும்" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "சரியான மதிப்புகளின் விசைக்கான வரம்பை வினவவும்" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "விசையின் மதிப்பை மதிப்பிற்கு அமைக்கவும்" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "அதனுடைய முன்னிருப்பு மதிப்பிற்கு விசையை மறுஅமைக்கவும்" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "அதனுடைய முன்னிருப்புகளுக்கு திட்டத்தின் அனைத்து விசைகளை " + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "விசை எழுதக்கூடியதாக இருந்தால் சரிபார்க்கவும்" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"மாற்றங்களுக்கு விசையை கணிக்கவும்.\n" +"விசை குறிக்கப்படவில்லை, அனைத்து விசைகளையும் திட்டத்தில் கணிக்கவும்.\n" +"கணிப்பதை நிறுத்துவதற்கு ^C ஐ பயன்படுத்தவும்.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"பயன்பாடு:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"கட்டளைகள்:\n" +" help இந்தத் தகவலைக் காண்பி\n" +" list-schemas நிறுவியுள்ள திட்டவடிவங்களைப் பட்டியலிடு\n" +" list-relocatable-schemas இடமாற்றக்கூடிய திட்டவடிவங்களைப் பட்டியலிடு\n" +" list-keys திட்டவடிவத்திலுள்ள விசைகளைப் பட்டியலிடு\n" +" list-children திட்டவடிவத்தின் சேய் உறுப்புகளைப் பட்டியலிடு\n" +" list-recursively விசைகளையும் மதிப்புகளையும் சேர்த்துப் பட்டியலிடு\n" +" range ஒரு விசையின் வரம்பை வினவுகிறது\n" +" get ஒரு விசையின் மதிப்பைப் பெறு\n" +" set ஒரு விசையின் மதிப்பை அமை\n" +" reset ஒரு விசையின் மதிப்பை மீட்டமை\n" +" reset-recursively கொடுக்கப்பட்ட திட்டவடிவத்தில் உள்ள எல்லா மதிப்புகளையும் " +"மீட்டமை\n" +" writable ஒரு விசை எழுதக்கூடியதா என சோதி\n" +" monitor மாற்றங்களைக் கவனி\n" +"\n" +"விவரமான உதவிக்கு 'gsettings help COMMAND' கட்டளையைப் பயன்படுத்தவும்.\n" +"\n" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"பயன்பாடு:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR கூடுதல் திட்டவடிவங்களைத் தேடுவதற்கான கோப்பகம்\n" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY (விருப்பமான) விசை திட்டத்தினுள் உள்ளது\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY விசை திட்டத்தினுள் உள்ளது\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr "மதிப்பு அமைப்பதற்கான மதிப்பு\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "காலி திட்டப்பெயர் கொடுக்கப்பட்டது\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "தவறான சாக்கெட், துவக்கப்படவில்லை" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "தவறான சாக்கெட், இதனால் துவக்க முடியவில்லை: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "சாக்கெட் ஏற்கனவே மூடப்பட்டது" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "சாக்கெட் I/O நேரம் முடிந்தது" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "GSocketஐ fdஇலிருந்து உருவாக்குகிறது: %s" + +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "சாக்கெட்டை உருவாக்க முடியவில்லை: %s" + +#: ../gio/gsocket.c:515 +msgid "Unknown family was specified" +msgstr "தெரியாத குடும்பம் குறிப்பிடப்பட்டுள்ளது" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "தெரியாத நெறிமுறை குறிப்பிடப்பட்டுள்ளது" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "உள்ளமை முகவரியை பெற முடியவில்லை: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "தொலை முகவரியை பெற முடியவில்லை: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "கேட்க முடியவில்லை: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "முகவரியை பிணைக்கும் போது பிழை: %s" + +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "மல்டிகாஸ்ட் குழுவை இணைப்பதில் பிழை: %s" + +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "மல்டிகாஸ்ட் குழுவிலிருந்து வெளியேறுவதில் பிழை: %s" + +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "மூலம் சார்ந்த மல்டிகாஸ்ட்டுக்கு ஆதரவு இல்லை" + +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "இணைப்பை ஏற்கும் போது பிழை: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "இணைப்பு செயலிலுள்ளது" + +#: ../gio/gsocket.c:2330 +#| msgid "Unable to get pending error: %s" +msgid "Unable to get pending error: " +msgstr "நிலுவையிலுள்ள பிழையைப் பெற முடியவில்லை: " + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "தரவைப் பெறும் போது பிழை: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "தரவை அனுப்பும் போது பிழை: %s" + +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "சாக்கெட்டை பணிநிறுத்த முடியவில்லை: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "சாக்கெட்டை மூடும் போது பிழை: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "சாக்கெட் நிலைக்காக காத்திருக்கிறது: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "செய்தி அனுப்பும் போது பிழை: %s" + +#: ../gio/gsocket.c:3805 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage க்கு வின்டோசில் ஆதரவில்லை" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4271 +#, c-format +msgid "Error receiving message: %s" +msgstr "செய்தி பெறும் போது பிழை: %s" + +#: ../gio/gsocket.c:4353 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "விடுப்பட்ட பிழையைப் பெற முடியவில்லை: %s" + +#: ../gio/gsocket.c:4372 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials இந்த OS க்காக செயல்படுத்தப்படவில்லை" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "பதிலி சேவையகம் %s உடன் இணைக்க முடியவில்லை: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s க்கு இணைக்க முடியவில்லை: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "இணைக்க முடியவில்லை: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "இணைப்பில் தெரியாத தவறு" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "TCP அல்லாத இணைப்பில் பதிலியைப் பயன்படுத்துதலுக்கு ஆதரவில்லை." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "ப்ராக்ஸி '%s' துணைபுரியவில்லை." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "கேட்பாளர் ஏற்கனவே மூடப்பட்டது" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "சேர்க்கப்பட்ட சாக்கெட் மூடப்பட்டது" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 ஆனது IPv6 முகவரி '%s' க்கு துணைபுரியவில்லை" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 நெறிமுறைக்கான பயனர் பெயர் மிக நீளமாக உள்ளது" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 நெறிமுறைக்கான வழங்கி பெயர் '%s' ஆனது மிக நீளமாக உள்ளது" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "சேவையகம் ஒரு SOCKSv4 ப்ராக்ஸி சேவையகம் இல்லை." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "இணைப்பு வழியாக SOCKSv4 சேவையகம் மறுக்கப்பட்டது" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "சேவையகமானது ஒரு SOCKSv5 ப்ராக்ஸி சேவையகம் இல்லை." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ப்ராக்ஸிக்கு அங்கீகாரம் தேவைப்படுகிறது." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 ப்ராக்ஸியில் ஒரு அங்கீகரிக்கப்பட்ட முறை தேவைப்படுகிறது இது GLib ஆல் " +"துணைபுரியப்படவில்லை." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 நெறிமுறைக்கான பயனர் பெயர் அல்லது கடவுச்சொல் மிக நீளமாக உள்ளது." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "தவறான பயனர்பெயர் அல்லது கடவுச்சொலால் SOCKSv5 அங்கீகாரம் தோல்வியுற்றது." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "SOCKSv5 நெறிமுறைக்கான வழங்கி பெயர் '%s' ஆனது மிக நீளமாக உள்ளது" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ப்ராக்ஸி சேவையகமானது தெரியாக முகவரி வகையை பயன்படுகிறது." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "உள்ளார்ந்த SOCKSv5 ப்ராக்ஸி சேவையக பிழை." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "ரூல்செட்டின் படி SOCKSv5 இணைப்பு அனுமதிக்கப்படவில்லை." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 சேவையகத்தின் வழியாக புரவலன் அடையமுடியாதது." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 ப்ராக்ஸி வழியாக பிணையத்தை அடையமுடியாதது." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 ப்ராக்ஸி வழியாக இணைப்பு மறுக்கப்பட்டது." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ப்ராக்ஸி 'இணை' கட்டளைக்கு துணைபுரியவில்லை." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "வழங்கப்பட்ட முகவரி வகையானது SOCKSv5 ப்ராக்ஸிக்கு துணைபுரியவில்லை." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "தெரியாத SOCKSv5 ப்ராக்ஸி பிழை." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "பதிப்பு %d இன் GThemedIcon குறிமுறையாக்கத்திற்கு கையாள முடியாது" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s'ஐ தீர்க்கும் பிழை: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' ஐ தலைகீழாக தீர்க்கையில் பிழை: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' க்கு கோரப்பட்ட வகையிலான DNS பதிவு இல்லை" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "தற்காலிகமாக '%s'ஐ தீர்க்க முடியவில்லை" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "%sஐ தீர்க்கையில் பிழை" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM தனிப்பட்ட திறப்பை குறிநீக்கம் செய்ய முடியாது" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "PEM-மறைகுறியாக்கப்பட்ட தனிப்பட்ட விசை காணப்படவில்லை" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM தனிபட்ட விசையை பிரிக்க முடியவில்லை" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "PEM-மறைகுறியாக்கப்பட்ட சான்றிதழை காணப்படவில்லை" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-மறைகுறியாக்கப்பட்ட சான்றிதழை பகுக்க முடியவில்லை" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"உங்கள் அணுகல் பூட்டப்படுவதற்கு முன் சரியாக கடவுச்சொல்லை உள்ளிடுவதற்கான கடைசி வாய்ப்பாகும்." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"உள்ளிடப்பட்ட பல கடவுச்சொல் தவறானது, இது போன்ற தோல்விகளுக்கு பின் உங்கள் அணுகல் பூட்டப்படும்." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "உள்ளிடப்பட்ட கடவுச்சொல் தவறானது." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 கட்டுப்பாட்டு செய்தியை எதிர்ப்பார்க்கிறது, %dஐ பெறுகிறது" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "எதிர்ப்பார்க்கப்படாத துணை தரவு வகை" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ஒரு fdஐ எதிர்பார்க்கிறது, ஆனால் %dஐ பெற்றது\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "தவறான fd பெறப்பட்டது" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "சான்றுகளுக்கு பிழையை அனுப்புகிறது:" + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "SO_PASSCRED ஆனது சாக்கெட்டிற்காக செயல்படுத்தப்பட்டால் பிழை சரிபார்க்கப்படுகிறது: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "பிழை SO_PASSCRED ஐ செயல்படுத்துகிறது: %s" + +#: ../gio/gunixconnection.c:534 +msgid "Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"பெறும் சான்றுகளுக்காக ஆனால் பூஜ்ஜிய பைட்டுகளை வாணிப்பதற்கான ஒரு ஒற்றை பைட்டை வாசிக்க " +"எதிர்பார்க்கிறது" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "கட்டுப்பாட்டு செய்தியை எதிர்ப்பார்க்கப்படவில்லை, %dஐ பெறுகிறது" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED செயல்நீக்கும் போது பிழை: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "கோப்பு விவரிப்பானை வாசிப்பதில் பிழை: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "கோப்பு விவரிப்பானை மூடுவதில் பிழை: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "கோப்பு முறைமை ரூட்" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "கோப்பு விவரிப்பானில் எழுதுவதில் பிழை: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "யுனிக்ஸ் டொமைன் சாக்கெட் முகவரிகளுக்கு இந்த கணினியில் ஆதரவில்லை" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "தொகுதி eject_with_operation அல்லது வெளியேற்றத்தை செயல்படுத்தவில்லை" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "பயன்பாட்டை காணவில்லை" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "பிழையை கண்டுபிடிக்கும் விண்ணப்பம்: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIs துணைப்புரியவில்லை" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32இல் அமைப்பு மாற்றங்கள் துணைபுரிவதில்லை" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32இல் அமைப்பு உருவாக்கம் துணைபுரிவதில்லை" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "கையாளுவதிலிருந்து வாசிக்கும் போது பிழை: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "பிழை மூடும் கைப்பிடி: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "கையாளுவதற்கு எழுதுவதில் பிழை: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "போதுமான நினைவகம் இல்லை" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "உள்ளார்ந்த பிழை: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "அதிக உள்ளீடு தேவை" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "தவறான சுருக்கப்பட்ட தரவு" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "கவனிக்க வேண்டிய முகவரி" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "GTestDbus உடன் போட்டியிடுவதற்கு புறக்கணிக்கப்பட்டது" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "முகவரியை அச்சிடு" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "முகவரியை ஷெல் பயன்முறையில் அச்சிடு" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "ஒரு dbus சேவையை இயக்கு" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "தவறான அளவுருக்கள் (args)\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "எதிர்பாராத பண்புக்கூறு '%s' இந்த உறுப்புக்கு '%s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "மதிப்பு '%s' க்கு '%s' உறுப்பு எதுவும் இல்லை" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "எதிர்பாராத ஒட்டு'%s', ஒட்டு '%s' எதிர்பார்க்கப்பட்டது" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%s' க்குள் எதிர்பாராத ஒட்டு '%s' உள்ளது" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "தரவு அடைவுகளில் சரியான புத்தகக்குறி கோப்பு எதுவும் இல்லை" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' க்கு ஏற்கனவே புத்தகக்குறி உள்ளது" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URIக்கு புத்தகக்குறி எதுவும் இல்லை '%s'" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'க்கு MIME வகை எதுவும் புத்தகக்குறியில் குறிப்பிடப்படவில்லை" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'க்கு புத்தகக்குறியில் தனிபட்ட கொடி எதுவும் குறிப்பிடப்படவில்லை" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'க்கான புத்தகக்குறியில் குழுக்கள் எதுவும் அமைக்கப்படவில்லை" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "'%s' பெயரிலுள்ள பயன்பாடு '%s'க்கு ஒரு புத்தகக்குறியை பதிவு செய்தது" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec வரி '%s' ஐ யூஆர்ஐ (URI) '%s' உடன் விரிவாக்குதல் தோல்வியுற்றது" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "உள்ளீடின் முடிவில் பூர்த்தியாகாத வரியுரு வரிசைமுறை" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "பின்னடைப்பு '%s', '%s' குறிக் கணமிற்கு மாற்ற முடியவில்லை" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' \"கோப்பு\"திட்டத்தை பயன்படுத்தும் முழுமையான URI அல்ல" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "உள்ளமைக் கோப்பு வலை முகவரி `%s' இல் ஓர் `#' இல்லாமல் இருக்கலாம்" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "`%s' செல்லுபடியாகாத வலை முகவரி" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "`%s' வலை முகவரியின் விருந்தோம்புப்-பெயர் செல்லுபடியாகாதது" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "வலை முகவரி `%s' இல் செல்லுபடியாகாத 'விடுபடு' வரியுருகள்" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' பாதைப்-பெயர் ஓர் தனிப் பாதை அல்ல" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "பிழையான விருந்தோம்புப்-பெயர்" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "காலை" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "மாலை" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A %d %B %Y %I:%M:%S %p %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%A %d %B %Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%I:%M:%S %Z" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p %Z" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "ஜனவரி" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "பிப்ரவரி" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "மார்ச்" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ஏப்ரல்" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "மே" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "ஜூன்" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "ஜூலை" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ஆகஸ்ட்" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "செப்டம்பர்" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "அக்டோபர்" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "நவம்பர்" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "டிசம்பர்" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ஜன" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "பிப்" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "மார்" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ஏப்" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "மே" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "ஜூன்" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ஜூலை" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ஆகஸ்" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "செப்" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "அக்" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "நவ்" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "டிசம்" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "திங்கள்" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "செவ்வாய்" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "புதன்" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "வியாழன்" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "வெள்ளி" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "சனி" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ஞாயிறு" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "தி" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "செ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "பு" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "வி" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "வெ" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ச" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ஞா" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' அடைவு திறக்கும்போது பிழை: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %ld byte to read file \"%s\"" +#| msgid_plural "Could not allocate %ld bytes to read file \"%s\"" +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "%lu பைட்டை ஒதுக்கிட முடியவில்லை - கோப்பு \"%s\" ஐப் படிக்க" +msgstr[1] "%lu பைட்டுகளை ஒதுக்கிட முடியவில்லை - கோப்பு \"%s\" ஐப் படிக்க" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' கோப்பு வாசிக்கும் போது பிழை: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "கோப்பு \"%s\" மிகப்பெரியது" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' கோப்பிலிருந்து வாசிக்க முடியவில்லை: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' கோப்பு திறக்க முடியவில்லை: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "'%s' கோப்பின் பண்புகளை பெறமுடியவில்லை: fstat() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' கோப்பை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "'%s'கோப்பினை '%s'க்கு மறுபெயரிட முடியவில்லை: g_rename() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' கோப்பை படைக்க முடியவில்லை: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: fdopen() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' கோப்பினை எழுத முடியவில்லை: fwrite() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "கோப்பு '%s' எழுத முடியவில்லை: fflush() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "கோப்பு '%s' எழுத முடியவில்லை: fsync() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s'கோப்பினை மூட முடியவில்லை: fclose() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "இருக்கும் கோப்பு '%s' ஐ நீக்க முடியாது: g_unlink() செயலிழந்தது: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "'%s' படிம அச்சு செல்லுபடியாகாதது; அதனில் '%s' இருக்கக் கூடாது" + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' படிம அச்சில் XXXXXX இல்லை" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "'%s' என்பதன்-குறுக்கம் இணைப்பை வாசிக்க முடியவில்லை: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "என்பதன்-குறுக்கம் இணைப்புகளுக்கு ஆதரவு கிடையாது" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "'%s' லிருந்து'%s'க்கு மாற்றியை திறக்க முடியவில்லை: %s" + +#: ../glib/giochannel.c:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string இல் மூலமாக வாசிக்க முடியாது" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "வாசிப்புத் தாங்ககத்தில் மாற்றப்படாத மீதித் தரவுகள்" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "வாய்க்கால் பாதி வரியுருவில் முடிவடைகிறது" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end இல் மூலமாக வாசிக்க முடியாது" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "தேடல் அடைவுகளில் சரியான விசை கோப்பினை காண முடியவில்லை" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "ஒரு முறையான கோப்பில்லை" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "விசை கோப்பு வரி '%s' கொண்டுள்ளது இது விசை-மதிப்பு சோடியை, குழு, அல்லது குறிப்பு அல்ல" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "செல்லுபடியாகாத குழு பெயர்: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "விசை கோப்பு ஒரு குழுவாக ஆரம்பமாகாது" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "செல்லுபடியாகாத விசை பெயர்: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "விசை கோப்பு துணையில்லாத குறிமுறையை கொண்டுள்ளது '%s'" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "விசை கோப்பு குழுவினை கொண்டிருக்கவில்லை '%s'" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr " '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr " '%s'மதிப்பினை உடைய '%s'விசை விசை கோப்பு கொண்டுள்ளது, இது UTF-8 அல்ல" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "%s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற முடியாது." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"விசைக் கோப்பில் '%s' குழுவில் '%s' விசை உள்ளது. அது கொண்டுள்ள மதிப்பினை புரிந்துகொள்ள " +"முடியாது." + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" +"'%2$s' குழுவில் உள்ள விசை '%1$s' இல் மதிப்பு '%3$s'உள்ளது, ஆனால் அங்கு இருக்க " +"எதிர்பார்க்கப்பட்டது %4$s." + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "'%s' குழுவில் '%s' விசையை விசை கோப்பு கொண்டிருக்கவில்லை" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "கடைசி வரியில் விசை கோப்பு விடுபடு எழுத்தினை கொண்டுள்ளது" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "விசை கோப்பு தவறான விடுபடு வரிசையை கொண்டுள்ளது '%s'" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "மதிப்பு '%s' ஒரு எண்ணாக செயல்பட முடியாது." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "இயல் எண் மதிப்பு '%s' வரையறையை தாண்டியுள்ளது" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "மதிப்பு '%s' தசம எண்ணாக செயல்பட முடியாது." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "மதிப்பு '%s' பூலியனாக செயல்பட முடியாது." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "'%s%s%s%s' கோப்பின் பண்புருக்களைப் பெறமுடியவில்லை: fstat() தோல்வி: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s ஐ மேப் செய்வதில் தோல்வி: mmap() தோல்வி: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' கோப்பினை திறக்க முடியவில்லை: open() செயலிழந்தது: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "வரி %d எழுத்து %d ல் பிழை: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "பிழையான UTF-8 குறியீடு செய்யப்பட்ட உரை - செல்லுபடியாகும் '%s' அல்ல" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name" +msgstr "'%s' ஒரு செல்லுபடியான பெயர் அல்ல" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c'" +msgstr "'%s' ஒரு செல்லுபடியான பெயர் அல்ல: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d வரியில் பிழை: %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "எழுத்து குறிப்பு '%-.*s' ஒரு அனுமதிக்கப்பட்ட எழுத்தினை குறிமுறையாக்கவில்லை" + +#: ../glib/gmarkup.c:712 +msgid "Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "வெற்றா பிரதிநிதி '&;' கண்டது; சரியான பிரதிநிதிகள்: & " < &qt; '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "பிரதிநிதியின் பெயர் '%-.*s' தெரியாதது" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "ஆவணம் ஓர் உறுப்புடன் (உதாரணம்: ) தொடங்க வேண்டும்" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'<' வரியுருவை தொடர்ந்து '%s' வர முடியாது; அதைப் பயன்படுத்தி ஓர் உறுப்படியின் பெயரைத் " +"தொடங்க முடியாது" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"ஒற்றை வரியுரு '%s', '%s' உறுப்படி தொடங்கல் ஒட்டை ஓர் '>' வரியுரு முடிவு செய்யும் " +"என்று எதிர்பார்த்தது" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"'%s' ஓர் ஒற்றை வரியுரு, பண்பின் பெயர் '%s' பின் ('%s' உறுப்பின்) எதிர்பார்த்தது ஓர் '=' " +"வரியுரு" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, தற்பொது ஒரு உறுப்பும் திறந்து இல்லை" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' உறுப்பு மூடப்பட்டுல்லது, அனால் தற்பொது திறந்திறுக்கும் உறுப்பு '%s'" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "வெற்றான ஆவணம் அல்லது ஆவணத்தில் இறுப்பது அனைத்தும் வெண்வெளி" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "'<' பிறகு ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"உறுப்புகள் திறந்திறுக்கும்போது ஆவணம் திடீரென முடிவடைந்தது - கடைசியாகத் திறக்கப்பட்ட " +"உறுப்பு '%s'" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"ஆவணம் திடீரென முடிவடைந்தது, அடையாள ஒட்டு <%s/> முடிவில் ஓர் '}' இருக்கும் என " +"எதிர்பார்த்தது" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "உறுப்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "பண்பு பெயர் உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "உறுப்பு-தொடங்களின் அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1760 +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:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "பண்பு பெயர் உள்ளிறுக்கும் போது ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "'%s' என்னும் மூடு-அடையாள ஒட்டு உள்ளே ஆவணம் திடீரென முடிவடைந்தது" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "ஆவணம் திடீரென குறிப்புரையுல் அல்லது செயலாக்கம் ஆணையுல் முடிவடைந்தது" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ஓபயன்பாடு:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "உதவி விருப்பங்கள்:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "உதவி விருப்பங்களை காட்டு" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "அனைத்து உதவி விருப்பங்களை காட்டு" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "பயன்பாடு விருப்பங்கள்:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பினை கூறிட முடியாது" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "'%s' க்கு %sன் இயல் எண் மதிப்பு வரையறையை தாண்டியுள்ளது" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "இரட்டை மதிப்பு '%s' ஐ %sக்கு கூறிட முடியாது" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "இரட்டை மதிப்பு '%s' %sக்கு வரையறையை தாண்டியுள்ளது" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "கூறிடும் போது பிழை: %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr " %sக்கான விடுபட்ட மதிப்புரு" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "தெரியாத விருப்பம் %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "சிதைந்த பொருள்" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "உள்ளமை தவறு அல்லது சிதைந்த பொருள்" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "நினைவகம் நிரம்பியது" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "பின்நோக்கி ஆராயும் எல்லை அடையப்பட்டது" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "தோரணி உள்ளடக்கங்கள் பகுதி பொருத்தத்துக்கு ஆதரவு தராத உருப்படிகளாக உள்ளன" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "பின்நோக்கும் சமர்பணங்கள் பகுதி பொருத்தத்துக்கு ஆதரவு தராத உருப்படிகளாக உள்ளன" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "உட்சுழல் எல்லை அடையப்பட்டது." + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "செல்லாத புது வரி குறிகளின் கூட்டு" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "தவறான ஆஃப்செட்" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "குறுகிய utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "உட்சுழல் சுழற்சி" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "தெரியாத தவறு" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ at end of pattern" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c at end of pattern" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "\\ க்கு அடுத்து அடையாளம் காணப்படாத எழுத்துக்குறி" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} தகுதியாளரில் செயலிழக்கப்பட்டவையின் எண்ணிக்கைகள்" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "நிறையில்{} எண்கள் மிக பெரிதாக உள்ளன" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "எண் வகுப்புக்காக ] விடிபட்டவைகளை முடிவடையச் செய்தல்" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "எண் வகுப்பில் தவறான வரிசைமுறையை தவிர்த்தல்" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "எழுத்து வகுப்பில் வரம்பு செயலிழக்கப்பட்டது" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "மீண்டும் செய்வதற்கு எதுவுமில்லை" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "எதிர்பாராத திரும்புதல்" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? அல்லது (?- க்குப் பிறகு அடையாளம் காணப்படாத எழுத்துக்குறி" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX என பெயரிடப்பட்ட வகுப்புகள் வகுப்பிற்குள் மட்டும் தான் துணைபுரியும் " + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "விடுப்பட்ட முடித்தல் )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "இல்லாத துணை தோற்றத்திற்கான குறிப்பு" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "கட்டளைக்கு பிறகு ) தவறியது" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "சுருங்குறித் தொடர் மிகப் பெரியது" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "நினைவிற்கு கொண்டு வருவதில் தோல்வி" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") திறக்காமல் (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "அதிக குறியீடு" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "அடையாளம் காணமுடியாத எண்ணிற்கு பிறகு (?<" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind வலியுறுத்துதல் நிலையான நீளத்தில் இல்லை" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "தவறான எண் அல்லது பெயருக்கு பிறகு (?(" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "நிபந்தனைக்குட்பட்ட குழு இரண்டுக்கும் மேற்பட்ட கிளைகளை பெற்றுள்ளது" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R அல்லது (?[+-]இவற்றால் எண்கள் பின்தொடரப்பட்டால் )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "தெரியாத POSIX வகுப்பு பெயர்" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX collating elements are not supported" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "எண்ணின் மதிப்பு \\x{...} இடைவிடா வரிசையில் மிகப்பெரிதாக உள்ளது" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "தவறான நிபந்தனை (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C ஐ lookbehind ல் வலியுறுத்த அனுமதியில்லை" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "\\L, \\l, \\N{name}, \\U, \\u ஆகிய எஸ்கேப் குறிகளுக்கு ஆதரவில்லை" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "கட்டாயமில்லாமல் மறுசுழற்சி அழைப்பு சுற்றாது" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "அடையாளம் காணமுடியாத எண்ணிற்கு பிறகு (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "subpattern பெயரில் முடிக்கப்பட்ட விடுபட்டவைகள்" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "இரண்டு பெயரிடப்பட்ட subpatterns களும் ஒரே பெயரை பெற்றுள்ளது" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "தவறானது \\P அல்லது \\p இடைவிடா வரிசையானது" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "பின் தெரியாத இயல்பின் பெயர் \\P அல்லது \\p" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "subpattern ன் பெயர் மிக நீளமானது (அதிகபட்சம் 32 எண்கள்)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "subpatterns க்கு நிறைய பெயர்கள் உள்ளது (அதிகபட்சம் 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "எண்ம மதிப்பு \\377ஐ விட அதிகம்" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "overran கைம்பைல் பணியிடம்" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "முன்பு சோதிக்கப்பட்ட குறிப்பிடப்பட்ட துணை தோற்றம் இல்லை" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE குழு ஒன்றுக்கு மேற்பட்ட கிளைகளை கொண்டுள்ளது" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "தொடர்சியற்ற NEWLINE விருப்பங்கள்" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g ஐ அடுத்து அடைப்புக்குறிக்குள் இடப்பட்ட அல்லது முக்கோண அடைப்புக் குறிக்குள் இடப்பட்ட " +"அல்லது மேற்கோள் குறிக்குள் இடப்பட்ட பெயரோ எண்ணோ அல்லது எளிய எண்ணோ இல்லை" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "எண்ணுள்ள குறிப்பு பூச்சியமாக இருக்கக்கூடாது" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "(*ACCEPT), (*FAIL) அல்லது (*COMMIT) க்கு அளவுருவைப் பயன்படுத்த அனுமதியில்லை" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) அடையாளம் காணப்படவில்லை" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "எண் மிகப் பெரியது" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& க்கு பிறகு subpattern பெயர் இல்லை" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ க்குப் பிறகு எண் எதிர்பார்க்கப்பட்டது" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "JavaScript இணக்கப் பயன்முறையில் ] ஒரு தவறான தரவு எழுத்துக்குறி" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ஒரே எண்ணின் subpatternகளுக்கான இரண்டு வெவ்வேறு பெயர்களுக்கு அனுமதி இல்லை" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) க்கு ஒரு பண்புரு இருந்தாக வேண்டும்" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c க்கு அடுத்து ஒரு ASCII எழுத்துக்குறி இடம்பெற வேண்டும்" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k வை அடுத்து அடைப்புக்குறிக்குள் அமைந்த, அம்பு அடைப்புக்குறிக்குள் அமைந்த அல்லது மேற்கோள் " +"குறிக்குள் அமைந்த பெயர் இல்லை" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "கிளாஸுக்குள் \\N க்கு ஆதரவில்லை" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "முன்னனுப்பல் குறிப்புகள் அதிகமாக உள்ளன" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP) அல்லது (*THEN) இல் பெயர் மிக நீளமாக உள்ளது" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... தொடரில் உள்ள எழுத்துக்குறி மதிப்பு மிக நீளமாக உள்ளது" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "வழக்கமான கூற்றை பொருத்துவதில் பிழை%s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "பிசிஆர்ஈ நூலகம் யூடிஎஃப்8 ஆதரவு இல்லாமல் தொகுக்கப்பட்டது." + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "பிசிஆர்ஈ நூலகம் யூடிஎஃப்8 பண்புகள் ஆதரவு இல்லாமல் தொகுக்கப்பட்டது." + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE லைப்ரரியானது இணக்கமற்ற விருப்பங்களைக் கொண்டு கம்பைல் செய்யப்பட்டுள்ளது" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "இயல்பான கூற்று %s ஐ தொகுக்கும்போது %d வரியுருவில் பிழை: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "இயல்பான கூற்று ஐ உகந்ததாக்கும்போது பிழை:%s: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "பதின்னறும எண் அல்லது '}' எதிர்பார்க்கப்பட்டது." + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "பதின்னறும எண் எதிர்பார்க்கப்பட்டது." + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "குறியீட்டுருவான சமர்பணத்தில் '<' ஐ காணவில்லை" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "முடிவடையாத உள்ளீட்பு மேற்கோள்" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "பூஜ்ய நீள உள்ளீட்பு மேற்கோள்" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "எண் எதிர்பார்க்கப்பட்டது" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "சட்டவிரோத உள்ளீட்பு மேற்கோள்" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "அனாதையான கடைசி '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "தெரியாத வெளியேற்ற வரிசைமுறை" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "மாற்று உரை \"%s\" ஐ பகுக்கையில் பிழை வரியுரு %lu இல்: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "மேற்களித்த உரை ஓர் \" -உடன் தொடங்கவில்லை" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "`கட்டளை வடியில் அல்லது வேறு மேற்களித்த உரையில் பொருத்தமற்ற \" " + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "'\\' வரியுருக்கு பின்பு உரை முடிவடைந்தது. (கடைசி உரை: '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "%c க்கு பொருத்தமான மேற்கோள் கண்டுபிடிப்பதட்கு முன் உரை முடிவடைந்தது. (உரை: '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "உரை வெற்றா இருந்தது (அல்லது வெண்வெளி மட்டுமே)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்க முடியவில்லை" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "(%s) சேய்-செயலில் இருந்து தரவு வாசிக்கும் போது, select()'டில் எதிர்பாராத பிழை" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "சேய் உறுப்பு செயலாக்கம் %ld குறியீட்டுடன் வெளியேறியது" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "சேய் உறுப்பு செயலாக்கம் %ld சிக்னலினால் முடிக்கப்பட்டது" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "சேய் உறுப்பு செயலாக்கம் %ld சிக்னலினால் நிறுத்தப்பட்டது" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "சேய் உறுப்பு செயலாக்கம் இயல்பற்ற முறையில் வெளியேறியது" + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "(%s) சேய் கழாய்த் தொடரில் இருந்து வாசிக்க முடியவில்லை" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) தொடங்க முடியவில்லை" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "'%s' (%s) அடைவுக்கு போக முடியவில்லை" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "\"%s\" (%s) சேய்-செயலை இயக்க முடியவில்லை" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "சேய் (%s) செயலகத்தின் வெளியீடலை அல்லது உள்ளடலை திசை-மாற்றும்போது பிழை" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "சேய் (%s) செயலகத்தை தொடங்க முடியவில்லை" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "சேய் செயல் \"%s\" இயக்கும்போது தெரியாத பிழை" + +#: ../glib/gspawn.c:1563 +#, 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/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "(%s) சேய்-செயலிடன் தொடர்பு கொல்ல கழாய்த்-தொடரைப் படைக்க முடியவில்லை" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "சேய் செயலில் இருந்து தரவு வாசிக்க முடியவில்லை" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%dல் மதிப்பரு வெக்டாரில் தவறான சரம்: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "சூழலில் தவறான சரம்: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "தவறான பணி செய்யும் அடைவு: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "உதவியாளர் நிலையை இயக்க முடியவில்லை (%s)" + +#: ../glib/gspawn-win32.c:997 +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/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "உரையாடல் உள்ளீட்டில் தவறான வரிசை" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 க்கு வரியுரு வீச்சு எல்லைக்கு வெளியே" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u பைட்" +msgstr[1] "%u பைட்கள்" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s பைட்" +msgstr[1] "%s பைட்கள்" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Incomplete data received for '%s'" +#~ msgstr "'%s' க்கு முழுமையில்லாத தரவு பெறப்பட்டது" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "SO_PASSCRED ஆனது சாக்கெட்டிற்காக செயல்படுத்தப்பட்டால் எதிர்பாராத விருப்ப நீளம் " +#~ "சரிபார்க்கும் போது இருக்கும். எதிர்பார்க்கப்பட்ட %d பைட்டுகள், %d பெறப்பட்டது" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "(%s) waitpid()'டில் எதிர்பாராத பிழை" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "காலியான துணை சரங்களுக்கு பணியிட எல்லை அடையப்பட்டது." + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "case-changing escapes (\\l, \\L, \\u, \\U) இங்கு அனுமதி இல்லை" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE குழுவை மீண்டும் அமைக்க அனுமதி இல்லை" + +#~ msgid "File is empty" +#~ msgstr "கோப்பு வெற்றாக உள்ளது" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "%s'விசையை விசை கோப்பு கொண்டுள்ளது அது கொண்டுள்ள மதிப்பினை மாற்ற முடியாது." + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "அசாதாரண நிரல் முடிவு கட்டளை வரி `%s'ஐ ஸ்பேனிங் செய்கிறது: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "" +#~ "கட்டளை வரி `%s' ஆனது பூஜ்ஜியமில்லாத வெளியேறு நிலை %d உடன் வெளியேறியது: %s" + +#~ msgid "This option will be removed soon." +#~ msgstr "இந்த விருப்பமானது விரைவில் நீக்கப்படும்." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' கோப்பை துவக்குவதில் பிழை : %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s'க்கு சேவை பதிவு இல்லை" + +#~ msgid "Error connecting: " +#~ msgstr "இணைக்கும் போது பிழை:" + +#~ msgid "Error connecting: %s" +#~ msgstr "இணைக்கும் போது பிழை: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 செயல்பாடானது பயனர்பெயரின் %i எழுத்துக்களுக்கு வரம்பாகிறது" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a செயல்பாடானது புரவலப்பெயரின் %i எழுத்துக்களுக்கு வரம்பாகிறது" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix லிருந்து வாசிப்பதில் பிழை: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix ஐ மூடுவதில் பிழை: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "யுனிக்ஸில் எழுதும் போது பிழை: %s" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "அடைவில் அடைவை நகர்த்த முடியவில்லை" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "வகை %s பிரிக்கப்படவில்லை" + +#, 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 "நீண்ட பட்டியலிடும் முறையை பயன்படுத்து" diff --git a/po/te.po b/po/te.po new file mode 100644 index 0000000..ef45591 --- /dev/null +++ b/po/te.po @@ -0,0 +1,4415 @@ +# translation of glib.master.te.po to Telugu +# Telugu translation of glib +# Copyright (C) 2012 Swecha telugu localisation Team +# This file is distributed under the same license as the GLIB package. +# +# +# +# విక్రం ఫణీంద్ర , 2005. +# దండు ప్రసాద్ , 2005. +# రమణ సాయి , 2005. +# Krishna Babu K , 2008, 2009, 2012. +# Sasi Bhushan Boddepalli , 2012. +# Praveen Illa (swecha team), 2012. +# GVS.Giri (swecha team),2012. +# Sasi Bhushan Boddepalli <>, 2012. +msgid "" +msgstr "" +"Project-Id-Version: glib.master.te\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-09-14 23:40+0000\n" +"PO-Revision-Date: 2012-09-19 00:21+0530\n" +"Last-Translator: Krishnababu Krothapalli \n" +"Language-Team: Telugu \n" +"Language: te\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.4\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "చాలపెద్ద లెక్కింపు విలువ %sకు పంపబడింది" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "ఆధార ప్రవాహం కు మద్దతు లేదు అర్థించు" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "GBuffered ఇన్పుట్ ప్రవాహ ఖండించు సాధ్యం కాదు" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "స్ట్రీమ్ యిప్పటికే మూయబడింది" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "ఆధార ప్రవాహం కు మద్దతు లేదు ఖండించు" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "ఆపరేషన్ రద్దైనది" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "చెల్లుబాటులో లేని అంశం, initialized లేదు" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "ఇన్పుట్ లో అసంపూర్ణం మల్టిబైట్ క్రమం" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "గమ్యం లేని తగినంత స్థలం" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "ఎగుబడి బైట్ క్రమంను పరివర్తించుట నిస్సారమగును" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "పరివర్తనం నందు దోషం కలదు: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "రద్దుచేయగలిగిన సిద్దీకరణ మద్దతీయబడదు" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "అక్షరమాలలొ కల '%s' నుండి '%s' కు పరివర్తించడానికి సహకరించదు" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' నుండి '%s' కు పరివర్తించడం సాధ్యం కాదు " + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s రకము" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "తెలియని రకము" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s దస్త్రమురకము" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials ఈ OS లో అమలు కాలేదు" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "మీ వేదిక ఎటువంటి GCredentials మద్దతు ఉంది" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "స్ట్రీమ్ యొక్క అనుకోని త్వరిత ముగింపు" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "మద్దతు లేని కీ `%s 'చిరునామా ప్రవేశం లో`%s'" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"చిరునామా `%s 'చెల్లదు (సరిగ్గా మార్గం, tmpdir లేదా నైరూప్య కీలను ఒక అవసరం)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "చిరునామా ప్రవేశం లో అర్ధం కీ / విలువ జంట కలయిక `%s '" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "చిరునామా `%s లో లోపం '- పోర్ట్ గుణం సరిగ్గా లేదు" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "చిరునామా `%s లో లోపం '- కుటుంబం గుణం సరిగ్గా లేదు" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "చిరునామా మూలకం `%s ' కోలన్ (:) కలిగి లేదు" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "కీ/విలువ జత %d, `%s ', చిరునామా మూలకం లో `%s' ఈక్వల్ సైన్ కలిగిలేదు" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"చిరునామా మూలకం లో కీ / విలువ జంట%d లో లోపం unescaping కీ లేదా విలువ, `%s '`%s'" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"చిరునామా `%s 'లో లోపం - unix రవాణా కీలను సరిగ్గా ఒక అవసరం` మార్గం 'లేదా " +"`నైరూప్య' అమర్చవచ్చును" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "చిరునామా `%s లో లోపం '- హోస్ట్ గుణం తప్పిపోయిన లేదా తప్పుడు ఉంది" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "చిరునామా లో లోపం `%s '- పోర్ట్ గుణం తప్పిపోయిన లేదా తప్పుడు ఉంది" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "చిరునామా లో లోపం `%s '- noncefile గుణం లేదు లేదా తప్పుడు" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "అనుసంధానమగుటలో దోషము:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "తెలియదు లేదా మద్దతు రవాణా `%s 'చిరునామా`%s కోసం'" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "లోపం ప్రారంభ సమయము ఫైలు `%s ':%s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "దస్త్రం '%s': %s చదువుటలో దోషం" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "సమయ దస్త్రం `%s ', 16 బైట్లు అంచనా, నుండి చదవడంలో లోపం %d వచ్చింది" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "సమయము ఫైలు `%s 'ప్రవాహానికి విషయాలు వ్రాయడం లోపం:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "ఇచ్చిన చిరునామా ఖాళీగా ఉంది" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "uid అమర్చునప్పుడు సందేశ బస్ విస్తరింపలేము" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "ఒక యంత్రం-id లేకుండా ఒక సందేశాన్ని బస్సు వ్యాపిస్తాయి సాధ్యం కాదు:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "లోపం ఆవిర్భావానికి కారణమైంది కమాండ్ లైన్ `%s ':" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(ఈ విండోను మూసివేసి ఏ అక్షర టైప్ చేయండి)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "సమావేశంలో నడుస్తోంది లేదు dbus, మరియు స్వయం ప్రారంభం విఫలమైంది" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "సెషన్ బస్సు చిరునామా (ఈ OS కోసం అమలు కాలేదు) కనుగొనలేదు" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"చరరాశి DBUS_STARTER_BUS_TYPE పర్యావరణం నుంచి బస్సు చిరునామా కనుగొనలేదు - " +"తెలియని విలువ `%s '" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"బస్సు చిరునామా కనుగొనలేదు ఎందుకంటే DBUS_STARTER_BUS_TYPE పర్యావరణం వేరియబుల్ " +"సెట్ లేదు" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "తెలియని బస్సు రకం%d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "ఒక లైన్ చదివి ప్రయత్నిస్తున్న కంటెంట్ ఊహించని లేకపోవడం" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "ప్రయత్నిస్తున్న కంటెంట్ ఊహించని లేకపోవడం (సురక్షితంగా) ఒక లైన్ చదివి" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"(అందుబాటులో:%s): అన్నీ అందుబాటులో ప్రామాణీకరణ విధానాల (%s ప్రయత్నించాడు) " +"అలిసిపోయిన" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver ద్వారా రద్దు అయ్యింది :: అధికారం-అధికారం-పీర్" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "డైరెక్టరీ `%s' కొరకు సమాచారం పొందునప్పుడు దోషము: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"డైరెక్టరీ `%s'à°¨ అనుమతులు తప్పుడు ఉన్నాయి. ఊహించిన రీతిలో 0700, 0%o వచ్చింది" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "డైరెక్టరీ `%s 'సృష్టించడంలో లోపం:%s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "పఠనం కోసం `%s 'keyring లోపం ప్రారంభ:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "లైన్ %d కంటెంట్ `%s' తో` %s వద్ద keyring వద్ద సరిగ్గా లేదు" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"లైన్ %d కంటెంట్ `%s' తో `%s వద్ద keyring యొక్క మొదటి టోకెన్ సరిగ్గా లేదు" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"వరుస %d కంటెంట్ `%s' తో `%s' వద్ద keyring యొక్క రెండవ టోకెన్ సరిగ్గా లేదు" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "keyringలో id %d తో `%s' వద్ద కుకీ కనుగొనలేదు" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "లోపం తొలగించడంలో కాలం చెల్లిన లాక్ ఫైలు `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "%s లాక్ ఫైలు సృష్టించుటలో దోషం: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "లోపం ముగింపు (unlinked) లాక్ ఫైలు `%s':%s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "లోపం unlinking లాక్ ఫైలు `%s ':%s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "రచన కోసం `%s' keyring లోపం ప్రారంభ:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(అదనంగా, కోసం లాక్ విడుదల `%s' కూడా విఫలమైంది: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "కనెక్షన్ మూసివేయబడింది" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "సమయం ముగిసింది స్థానానికి చేరుకుంది" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"ఒక క్లయింట్-వైపు కనెక్షన్ నిర్మించడానికి ఉన్నప్పుడు మద్దతు లేని జెండాలు " +"ఎదుర్కొంది" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"మార్గం%s వద్ద వస్తువు మీద అటువంటి ఇంటర్ఫేస్ `org.freedesktop.DBus.Properties '" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "సెట్టింగ్లో లోపం ఆస్తి `%s ': ఊహించినది రకం`%s' కానీ వచ్చింది `%s '" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "అటువంటి ఆస్తి `%s '" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "ఆస్తి `%s 'రీడబుల్ కాదు" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "ఆస్తి `%s 'వ్రైటబుల్ కాదు" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "అటువంటి ఇంటర్ఫేస్ `%s '" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "అటువంటి ఇంటర్ఫేస్" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "అటువంటి ఇంటర్ఫేస్ `%s 'మార్గం%s వద్ద వస్తువు à°¨" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "అటువంటి పద్ధతి `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "సందేశం యొక్క పద్ధతి, `%s ', సరిపోలడం లేదు అంచనా రకం`%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "ఒక వస్తువు ఇప్పటికే %s వద్ద ఇంటర్ఫేస్ %s కోసం ఎగుమతి ఉంది" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "పద్ధతి `%s 'తిరిగి రకం`%s', కానీ అంచనా `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "పద్ధతి `%s 'ఇంటర్ఫేస్ à°¨`%s' సంతకం `%s 'లేదు తో" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "ఒక subtree ఇప్పటికే %s కోసం ఎగుమతి ఉంది" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "రకం చెల్లదు" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL సందేశం: PATH లేదా సభ్యుల శీర్షిక ఫీల్డ్ లేదు" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN సందేశం: REPLY_SERIAL శీర్షిక ఫీల్డ్ లేదు" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR సందేశం: REPLY_SERIAL లేదా ERROR_NAME శీర్షిక ఫీల్డ్ లేదు" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "సిగ్నల్ సందేశం: PATH, ఇంటర్ఫేస్ లేదా సభ్యుల శీర్షిక ఫీల్డ్ లేదు" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"సిగ్నల్ సందేశం: PATH శీర్షిక field ప్రత్యేకించబడిన విలువ / org ఉపయోగించి / " +"ఉందిfreedesktop/" +"DBus/ స్థానిక" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"సిగ్నల్ సందేశం: ఇంటర్ఫేస్ శీర్షిక ఫీల్డ్ ప్రత్యేకించబడిన విలువ org " +"ఉపయోగిస్తోంది freedesktop.DBus." +"Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu బైట్ చదవడానికి కావలెను కానీ EOF వచ్చింది" +msgstr[1] "%lu బైట్లు చదవడానికి కావలెను కానీ EOF వచ్చింది" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"ఊహించిన చెల్లుబాటు అయ్యే UTF-8 string కానీ బైట్ ఆఫ్సెట్ %d వద్ద చెల్లని " +"బైట్లు దొరకలేదు(స్ట్రింగ్ యొక్క " +"పొడవు %d ఉంటుంది). చెల్లుబాటు అయ్యే UTF-8 string అప్ ఆ సమయం వరకు ఉంది`%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "స్ట్రింగ్ `%s'తర్వాత NUL బైట్ అంచనా కానీ బైట్ %d దొరకలేదు" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "అన్వయించడం విలువ `%s 'ఒక చెల్లుబాటు అయ్యే D-బస్ వస్తువు మార్గం కాదు" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "అన్వయించడం విలువ `%s 'ఒక చెల్లుబాటు అయ్యే D-బస్ సంతకం కాదు " + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"పొడవు %u బైట్ యొక్క ఎదుర్కొంది అర్రే. గరిష్ఠ పొడవు 2 << 26 బైట్లు (64 MiB) " +"ఉంది." +msgstr[1] "" +"పొడవు %u బైట్లు యొక్క ఎదుర్కొంది అర్రే. గరిష్ఠ పొడవు 2 << 26 బైట్లు (64 " +"MiB) ఉంది." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"అన్వయించడం విలువ `%s 'వేరియంట్ కొరకు ఒక చెల్లుబాటు అయ్యే D-బస్ సంతకం కాదు" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"D-బస్ వైర్ ఫార్మాట్ నుండి రకం స్ట్రింగ్ `%s 'తో GVariant deserializing లోపం" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"చెల్లని endianness విలువ. కానీ అంచనా 0x6c ('ఎల్') లేదా 0x42 ('B') విలువ " +"దొరకలేదు0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "చెల్లని ప్రధాన ప్రోటోకాల్ వెర్షన్. 1 అంచనా కాని %d దొరకలేదు" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "సంతకం `%s 'తో సంతకం శీర్షిక కానీ దొరకలేదు సందేశ భాగం ఖాళీగా ఉంది" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"అన్వయించడం విలువ `%s 'ఒక చెల్లుబాటు అయ్యే D-బస్ సంతకం (శరీరం కోసం) కాదు" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "సందేశం కాని సందేశ భాగం లో కాదు సంతకం శీర్షిక %u బైట్ ఉంది" +msgstr[1] "సందేశం ఏ సంతకం శీర్షిక కాని సందేశ భాగం %u బైట్లు" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "సందేశం deserialize సాధ్యం కాదు:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "తో GVariant serializing లోపం రకం స్ట్రింగ్ `%s 'D-బస్ వైర్ ఆకృతికి" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"సందేశం%d ఫైలు సూచికలు కలిగి ఉంది కాని శీర్షిక ఫీల్డ్ %d ఫైలు " +"సూచిస్తుందిసూచికలు" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "సందేశం serialize సాధ్యం కాదు:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "సందేశ భాగం సంతకం `%s 'కలిగి ఉంది కాని సంఖ్య సంతకం శీర్షిక ఉంది" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "సందేశ భాగం రకం లేదు సంతకం `%s' కానీ శీర్షిక క్షేత్రంలో సంతకం`%s' ఉంది" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "సందేశ భాగం ఖాళీగా ఉంది కానీ శీర్షిక క్షేత్రంలో సంతకం (%s) `ఉంది '" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "రకం `%s యొక్క శరీరం తో లోపం తిరిగి '" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "ఖాళీ శరీరంతో లోపం తిరిగి" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "హార్డువేర్ స్థూల వివరంపొందడం సాధ్యం కాలేదు %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id లేదా /etc/machine-id లోడ్ చేయుటలో విఫలమైంది: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s యొక్క లోపం కాల్ StartServiceByName: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "ఊహించని సమాధానం %d StartServiceByName (\"%s\") పద్దతి నుండి" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"పద్ధతి ఇన్వోక్ కాదు; ప్రాక్సీ ఒక యజమాని లేకుండా ఒక well-తెలిసిన పేరు కోసం " +"మరియుప్రాక్సీ " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START జెండా నిర్మించబడింది" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "మద్దతు లేదు నైరూప్య నేమ్ స్పేస్" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "స్ట్రింగ్ `%s 'ఒక చెల్లుబాటు అయ్యే D-బస్ GUID కాదు" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "సమయ దస్త్రం%s: `%s 'వద్ద రాయడం లోపం " + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "స్ట్రింగ్ `%s 'ఒక చెల్లుబాటు అయ్యే D-బస్ GUID కాదు " + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "మద్దతివ్వని రవాణా `%s వినండి కాదు '" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "కమాండ్" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"ఆదేశాలు:\n" +" సహాయం ఈ సమాచారాన్ని చూపించు\n" +" ఇంట్రోస్పెక్ట్ తనను తాను పరిశీలించుకొను ఒక రిమోట్ వస్తువు \n" +" మానిటర్ ఒక సుదూర వస్తువు పర్యవేక్షణ\n" +" కాల్ సుదూర వస్తువు పై ఒక పద్ధతి ఇన్వోక్ కాల్\n" +" ఎమిట్ ఒక సిగ్నల్ విడుదల చేస్తాయి విడుదల చేస్తాయి\n" +"\n" +"ప్రతి ఆదేశంపై సహాయం పొందడానికి \"%s COMMAND --help\" వాడండి\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "దోషం కలదు :%s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "లోపం అన్వయ బయటకు రావటం XML: %s \n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "వ్యవస్థ బస్సు అనుసంధానమగుటకు" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "సెషన్ బస్సు అనుసంధానమగుటకు" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "ఇచ్చిన D-బస్ చిరునామా అనుసంధానమగుటకు" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "అనుసంధానము ముగింపు స్థలం ఎంపికలు:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "అనుసంధానము చివరి పాయింట్ తెలిపిన ఎంపికలు" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "పేర్కొనలేదు అనుసంధానము చివరి పాయింట్" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "పేర్కొన్న బహుళ అనుసంధానము అంత్య బిందువుల" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "హెచ్చరిక: ఆత్మ పరిశీలన డేటా ప్రకారం, ఇంటర్ఫేస్ `%s' లేదు \n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "హెచ్చరిక: ఆత్మ పరిశీలన డేటా ప్రకారం, పద్ధతి `%s' లేదు ఇంటర్ఫేస్ `%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "సంకేతం కోసం ఇచ్చాపూరితం గమ్యం (ప్రత్యేక పేరు)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "à°¨ సంకేతం విడుదల చేస్తాయి కు వస్తువు మార్గం" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "సంకేతం మరియు అంతర్ముఖం పేరు" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "ఒక సంకేతం విడుదల చేస్తాయి." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "అనుసంధానించుటలో దోషం: %s \n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "లోపం: వస్తువు మార్గం పేర్కొనబడలేదు.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "దోషం: %s ఒక చెల్లుబాటు అయ్యే వస్తువు మార్గం లేదు\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "లోపం: సంకేతం పేర్కొనబడలేదు \n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "దోషం: సంకేతం అనునది పూర్తిగా-ఉత్తీర్ణమైన పేరు కావలెను.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "దోషం: %s ఒక చెల్లుబాటు అయ్యే అంతర్ముఖం పేరు కాదు \n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "దోషం: %s ఒక చెల్లుబాటు అయ్యే సభ్యుడు పేరు కాదు \n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "లోపం: %s ఒక చెల్లుబాటు అయ్యే ప్రత్యేక బస్సు పేరు కాదు.\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "లోపం అన్వయ పారామితి %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "అనుసంధానమును లోపం ఒరవడిఅనుసంధానమును : %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "à°¨ పద్ధతి అర్థించడానికి గమ్యం పేరు" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "à°¨ పద్ధతి అర్థించడానికి వస్తువు మార్గం" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "పద్ధతి మరియు అంతర్ముఖం పేరు" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "సెకండ్లలో గడువు ముగిసింది" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "ఒక మారుమూల వస్తువు ఒక పద్ధతి అర్థించడానికి." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "లోపం: గమ్యం పేర్కొన్న లేదు \n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "లోపం: వస్తువు మార్గం పేర్కొన్న లేదు \n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "లోపం: మెథడ్ పేరు పేర్కొన్న లేదు \n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "లోపం: పద్ధతి పేరు `%s' చెల్లదు \n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "" +" ఒక దోషం ను అన్వయించడంలో %d పార్సీంగ్ పారామితి.ఆ దోషం దీనికి సంబంధించినది:`%" +"s':%s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "గమ్యం పేరు తనను తాను పరిశీలించుకొను కు" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "గమ్యం పేరు తనను తాను పరిశీలించుకొను కు" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "ముద్రణ XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "పిల్లలు పరిశీలించుకొను" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "కేవలం లక్షణాలు ముద్రించవచ్చు" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "ఒక మారుమూల వస్తువు పరిశీలించుకొ." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "పర్యవేక్షించుటకు గమ్యం పేరు" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "పర్యవేక్షించుటకు వస్తువు మార్గం" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "ఒక మారుమూల వస్తువు పర్యవేక్షించడానికి" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "నామములేని" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "డెస్కుటాప్ దస్త్రము Exec క్షేత్రమును తెలుపలేదు" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "అనువర్తనంకు కావలిసిన ‍టెర్మినల్‌ను కనుగొనలేక పోయింది" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "వినియోగదారి అనువర్తన ఆకృతీకరణ సంచయం %sను సృష్టించలేకపోయింది: %s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "వినియోగదారి MIME ఆకృతీకరణ సంచయం %sను సృష్టించలేకపోయింది: %s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "దరఖాస్తు సమాచారం ఒక గుర్తించే లేదు" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "వినియోగదారి డెస్కుటాప్ దస్త్రమును సృష్టించలేకపోయింది %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "%s కొరకు మలిచిన నిర్వచనము" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "" +"డ్రైవ్ బయటకుపంపు లేదా ఆపరేషన్‌తో_బయటకు_పంపు విలువను అభివృద్దిపరచలేక పోయింది" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "మాధ్యమం కొరకు ఎన్నికను డ్రైవ్ చేయలేదు" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "డ్రైవు ప్రారంభమును అభివృద్ది పరచలేకపోయింది" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "ఆపుటను డ్రైవు అభివృద్ది పరచలేకపోయింది" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS మద్దతు అందుబాటులో లేదు" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem ఎన్కోడింగ్ యొక్క వర్షన్ %dను సంభాలించలేదు" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem ఎన్కోడింగ్‌నందు టోకెన్సు (%d)యొక్క తప్పుగావున్న సంఖ్య" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon ఎన్కోడింగ్ యొక్క వర్షన్ %dను సంభాలించలేదు" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon ఎన్కోడింగ్‌నందు టోకెన్సు (%d)యొక్క తప్పుగావున్న సంఖ్య" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon కొరకు GEmblem కావలసివుంది" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "వినియోగదారికి దృగ్గోచరమగు మౌంట్ లేదు" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "డైరెక్టరీనందు నకలు తీయలేదు" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "డైరెక్టరీని డైరెక్టరీకి నకలు తీయలేము" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "లక్ష్యపు దస్త్రము వుంది" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "డైరెక్టరీని పునరావృతముగా నకలుతీయలేదు" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "అతుకుపెట్టు మద్దతు లేదు " + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "లోపం splicing ఫైలు: %s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "ప్రత్యేక దస్త్రమును నకలుతీయలేదు" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "చెల్లని సిమ్‌లింక్ విలువ యివ్వబడినది" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "ట్రాష్ మద్దతీయలేదు" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "దస్త్రము నామములు '%c'ని కలిగిలేవు" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "వాల్యూమ్ మౌంట్‌ను చేయలేకపోయింది" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "ఈ దస్త్రము సంబాలించుతున్నట్లు యెటువంటి అనువర్తనము నమోదుకాలేదు" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ఎన్యూమరేటర్ మూయబడినది" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "దస్త్ర యెన్యూమరేటర్ యిప్పటికే వొక ఆపరేషన్‌ను కలిగివుంది" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "స్ట్రీమ్ క్వరీ సమాచారంను మద్దతీయుటలేదు (_i)" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "సీక్ స్ట్రీమ్‌పైన మద్దతీయుటలేదు" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "ట్రంకేట్ ఇన్‌పుట్ స్ట్రీమ్‌పైన అనుమతించబడుటలేదు" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "స్ట్రీమ్‌పైన ట్రంకేట్ మద్దతీయుటలేదు" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "తప్పుడు సంఖ్యా టోకెన్లు (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "క్లాస్ నామము %s కొరకు ఏ రకములేదు" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "రకము %s GIcon యింటర్‌ఫేస్‌ను తయారుచేయలేదు" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "రకము %s వర్గీకరించబడలేదు" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "తప్పుగావున్న వర్షన్ సంఖ్య: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "GIcon యింటర్ఫేస్ పైన రకము %s అనునది from_tokens()ను తయారుచేయలేదు" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "ప్రతిమ యెన్కోడింగ్ యొక్క పంపిణీచేయబడిన వర్షన్‌ను సంభాలించలేదు" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "ఏ చిరునామా తెలుపలేదు" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "చిరునామా కొరకు %u మరీ పొడవుగా వుంది" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "ప్రిఫిక్స్ పొడవు దాటి బిట్సును చిరునామా కలిగివుంది" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "'%s' ను IP చిరునామా మాస్కువలె పార్స్ చేయలేకపోయింది" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "సాకెట్ చిరునామా కొరకు సరిపోవునంత జాగాలేదు" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "మద్దతీయని సాకెట్ చిరునామా" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "ఈ స్ట్రీమ్ యిప్పటికే వొక ఆపరేషన్‌ను కలిగివుంది" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "మూలకం <%s> <%s> లోపల అనుమతి లేదు" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "మూలకం <%s> toplevel వద్ద అనుమతి లేదు" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "వనరు నందు ఫైలు %s బహు పర్యాయాలు కనిపించెను" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "ఏదైనా వనరు డైరెక్టరీనందు '%s' గుర్తించుటలో విఫలమైంది" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "ప్రస్తుత డైరెక్టరీ నందు '%s' గుర్తించుటకు విఫలమయ్యెను" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "తెలియని నిర్వర్తన ఐచ్చికం \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "తాత్కాలిక ఫైలు సృష్టించుటకు విఫలమైంది: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"xmllint తో యిన్పుట్ ఫైలు నిర్వర్తించుటలో దోషం:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"to-pixdata తో యిన్పుట్ ఫైల్ నిర్వర్తించుటలో దోషం:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "ఫైలు %s చదువుటలో దోషం: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "ఫైలు %s కుదించుటలో దోషం" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "టెక్స్ట్ <%s> లోపల కనిపించక పోవచ్చు" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "అవుట్పుట్ ఫైల్ పేరు" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "" +"ఎచటనుండి ఫైళ్ళు చదువబడునో ఆ డైరెక్టరీలు (అప్రమేయంగా స్థానిక డైరెక్టరీనకు)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "డైరెక్టరీ" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"లక్ష్యపు ఫైల్‌పేరు పొడిగింపు చేత యెంపికచేసిన ఫార్మాట్‌లో అవుట్పుట్ జనియింపచేయి" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "మూలపు యెగువసూచి జనియింపచేయి" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" +"మీ కోడ్ లోనికి వనరు ఫైలునకు లింకు చేయుటకు వుపయోగించు సోర్సుకోడ్ జనియింపచేయి" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "ఆధార జాబితాను జనియింపచేయి" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "వనరు స్వయంచాలకంగా సృష్టించి మరియు నమోదు చేయవద్దు" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "జనియింపచేసిన సోర్స్ కోడ్ కొరకు వుపయోగించిన C గుర్తింపుకారి" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"వనరు వివరణమును వనరు ఫైలునకు వుంచుము.\n" +"వనరు వివరణము ఫైళ్లు .gresource.xml పొడిగింపును కలిగివుంటాయి,\n" +"మరియు మరియు వనరు ఫైలు .gresource గా పిలుచు పొడిగింపును కలిగివుండును." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "మీరు ఖచ్చితంగా వొక ఫైలు పేరు యివ్వాలి\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "ఖాళీ పేర్లు అనుమతి లేదు" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "చెల్లని పేరు '%s': పేర్లు ఒక చిన్న అక్షరంతో ప్రారంభమవుతాయి తప్పక" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"చెల్లని పేరు '%s': చెల్లని అక్షరం '%c'; చిన్న అక్షరాలు మాత్రమే, నంబర్లు మరియు " +"హైఫన్ ('-') " +"అనుమతించబడతాయి." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "చెల్లని పేరు '%s': రెండు వరుస హైఫన్లు ('--') అనుమతించబడవు." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "చెల్లని పేరు '%s': చివరి అక్షరం ('-') కాలేకపోవచ్చు." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "చెల్లని పేరు '%s': గరిష్ఠ పొడవు 1024 ఉంది" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr "<పిల్లల పేరు = '%s'>ఇప్పటికే తెలుపబడిన" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "కీలను 'list-of' స్కీమాకు జతచేయలేము" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr "<కీలక పేరు = '%s'>ఇప్పటికే తెలుపబడిన" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" లో నీడలు ; ఉపయోగం " +"విలువ సవరించడానికి" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "సరిగ్గా 'రకం' ఒకటి, 'enum' లేదా 'జెండాలు' ఒక లక్షణం గా తప్పక కు" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id = '%s'> లేదు (ఇంకా) నిర్వచించింది." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "GVariant రకం స్ట్రింగ్ '%s' నిలిపివేసిన" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " ఇచ్చిన కాని స్కీమ ఏదైనా పొడిగిస్తూ లేదు" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "తొలగించకండి ఎటువంటి " + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " ఇప్పటికే తెలుపబడిన" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr "ఇప్పటికే పేర్కొన్న " + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " ఇంకా-ఇప్పటికి-లేని స్కీమా '%s' విస్తరింపును" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " ఇంకా-ఇప్పటికి-లేని స్కీమా '%s' యొక్క జాబితా" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "ఒక మార్గాన్ని ఒక స్కీమ జాబితా ఉండకూడదు" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "ఒక మార్గాన్ని ఒక స్కీమ విస్తరించడానికి కాదు" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " ఒక జాబితా కాదు ఇది వ్యాపించి జాబితా" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" విస్తరించి కానీ " +"'%s'విస్తరించడానికి లేదు '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "ఒక మార్గ, వాడితేనే, ప్రారంభమవుతాయి మరియు ఒక స్లాష్ తో అంతం చేయాలి" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "ఒక జాబితా యొక్క మార్గం ':/' తో అంతం చేయాలి" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id = '%s'> ఇప్పటికే తెలుపబడిన" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "మూలకం <%s> పైస్థాయి వద్ద అనుమతించబడదు" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "-- కఠినమైన పేర్కొన్న జరిగినది; నిష్క్రమించే \n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "ఈ మొత్తం ఫైలు విస్మరించబడింది.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "ఈ ఫైలు విస్మరిస్తున్నాము.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "అటువంటి కీలక `%s 'స్కీమ లో `%s' గా ఓవరురైడు ఫైలు లో పేర్కొన్న `%s '" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr ";. ఈ కీ కోసం ఓవరురైడు విస్మరిస్తూ \n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " మరియు కఠినమైన పేర్కొన్న జరిగినది; నిష్క్రమించే.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"లోపం పార్సింగ్ కీలక `%s' స్కీమ లో`%s' గా ఓవరురైడు లో పేర్కొన్న ఫైల్ `%s': %" +"s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "ఈ కీ కోసం ఓవరురైడు విస్మరించడం. \n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"కీ `%s' కోసం స్కీమా`%s' నందు ఓవరురైడు ఫైలు `%s' నందు వోవర్ రైడ్ స్కీమలో " +"ఇవ్వబడిన పరిధికి బయటవుంది" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"కీలక `%s కోసం తొలగించకండి 'స్కీమ లో`%s' ఓవరురైడు ఫైలు `%s'లో లేదుచెల్లుబాటు " +"అయ్యే ఎంపికలు యొక్క " +"జాబితా" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ఫైలు నిల్వ చేయడానికి ఇక్కడ" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "స్కీమాస్ ఏ లోపాలను విస్మరించు" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Gschema.compiled ఫైలు వ్రాయడం లేదు" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "కీలక పేరు ఆంక్షలు అమలు లేదు" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"ఒక స్కీమ కాషె అన్ని GSettings స్కీమ ఫైళ్లు కంఫైల్.\n" +"స్కీమ ఫైళ్లు పొడిగింపు కలిగి ఉంటుంది. Gschema.xml,\n" +"మరియు కాషె ఫైల్ gschemas.compiled అని పిలుస్తారు." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "మీరు సరిగ్గా ఒక డైరెక్టరీ పేరు ఇవ్వాలి\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "ఏ స్కీమ ఫైళ్లు దొరకలేదు:" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "ఏమీ చేయడం.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "తొలగించబడింది ఉన్న అవుట్పుట్ ఫైలు.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "అప్రమేయ స్థానిక మానిటర్ రకమును కనుగొనలేక పోయింది" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "చెల్లని ఫైలుపేరు %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "దస్త్రవ్యవస్థ సమాచారంను కనుగొనుటలో దోషము : %s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "రూట్ డైరెక్టరీని పునఃనామకరణ చేయలేము" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "దస్త్రమును పునఃనామకరణ చేయుటలో దోషము: %s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "ఫైలు పేరు కాదు, ఫైల్ పేరు ఇప్పటికే ఉంది" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "చెల్లని దస్త్రనామము" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "డెరెక్టరీని తెరువలేము" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "దస్త్రమును తెరుచుటలో దోషము : %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "దస్త్రమును తొలగించుటలో దోషము: %s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "దస్త్రమును ట్రాష్ చేయుటలో దోషము : %s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ట్రాష్ డెరెక్టరీ(dir)ను సృష్టించలేక పోయింది %s: %s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "ట్రాష్ కొరకు పైస్థాయి డైరెక్టరీని కనుగొనలేక పోయింది" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "ట్రాష్ డైరెక్టీని కనుగోనలేక పోయింది లేదా సృష్టించలేక పోయింది" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ట్రాషింగ్ సమాచారపు దస్త్రమును సృష్టించలేక పోయింది: %s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "దస్త్రమును ట్రాష్ చేయలేక పోయింది: %s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "అంతర్గత దోషము" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "డెరెక్టరీని సృష్టించుటలో దోషము: %s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ఫైల్సిస్టమ్ సింబాలిక్ లింకులు మద్దతు ఇవ్వదు" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "చిహ్నరూప లింకును చేయుటలో దోషము: %s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "దస్త్రమును కదుపుటలో దోషము: %s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "డెరెక్టరీని డెరెక్టరీకి కదుపలేము" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "బ్యాకప్ దస్త్రము సృష్టీకరణ విఫలమైంది" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "టార్గెట్ దస్త్రమును తొలగించుటలో దోషము: %s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "మౌంట్స్‍ మధ్య కదలిక మద్దతీయబడదు" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "యాట్రిబ్యూట్ విలువ తప్పక NULL-కాకూడదు" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (స్ట్రింగ్ ఊహించినది)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "పొడిగించిన యాట్రిబ్యూట్ చెల్లని నామము" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "పొడిగించిన యాట్రిబ్యూట్ అమర్చుటలో దోషము '%s': %s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr " (చెల్లని యెన్కోడింగ్)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ఫైలు '%s' కొరకు సమాచారంను పొందుటలో దోషం: %s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "ఫైల్ వివరణి కొరకు సమాచారంను పొందుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (uint32 అనుకోబడినది)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (uint64 అనుకోబడినది)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "చెల్లని యాట్రిబ్యూట్ రకము (బైట్ స్ట్రింగ్ అనుకోబడినది)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "సిమ్‌లింకుల నందు అనుమతులను అమర్చలేదు" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "అనుమతులను అమర్చుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "యజమానిని అమర్చుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "సిమ్‌లింకు తప్పక NULL-కాకూడదు" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "సింమ్‌లింకు అమర్చుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "సింమ్‌లింకు అమర్చుటలో దోషము: దస్త్రము సిమ్‌లింకు కాదు" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "సవరణ లేదా యాక్సెస్ సమయం అమర్చుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux సందర్భం తప్పక NULL-కాకూడదు" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux సందర్భం అమర్చుటలో దోషము: %s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux ఈ సిస్టమ్‌పైన చేతనపరచ బడిలేదు" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "యాట్రిబ్యూట్ %sను అమర్చుట మద్దతీయుటలేదు" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "దస్త్రము నుండి చదువుటలో దోషము: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "దస్త్రముకు చూడుటలో దోషము: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "దస్త్రము మూయుటలో దోషము: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "అప్రమేయ స్థానిక దస్త్రపు మానిటర్ రకమును కనుగొనలేక పోయింది" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "దస్త్రముకు వ్రాయుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "పాత బ్యాకప్ లింకును తొలగించుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "బ్యాకప్ నకలును సృష్టించుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "తాత్కాలిక దస్త్రమును పునఃనామకరణ చేయుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "దస్త్రమును ట్రంకేట్‌ చేయుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "దస్త్రము '%s'ను తెరువుటలో దోషము: %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "లక్ష్యపు దస్త్రము వొక డైరెక్టరీ" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "లక్ష్యపు దస్త్రము వొక సాదారణ దస్త్రముకాదు" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "ఆ దస్త్రము బహిర్గతముగా మార్చబడినది" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "పాత దస్త్రమును తొలగించుటలో దోషము: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "చెల్లని GSeekType పంపిణీచేయబడింది" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "చెల్లని యెదురుచూపు అభ్యర్ధన" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStreamను కుదించ లేము" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "మెమోరీ అవుట్‌పుట్ స్ట్రీమ్ పునఃపరిమాణము చేయలేము" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "మెమోరీ అవుట్‌పుట్ స్ట్రీమ్‌ను పునఃపరిమాణము చేయుటలో విఫలమైంది" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"వ్రైట్ ప్రాసెస్ అవసరం మెమరీ పరిమాణాన్ని అందుబాటులో కంటే పెద్దదిచిరునామా స్థలం" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "కోరుకుంటారు అభ్యర్థించిన స్ట్రీమ్ ప్రారంభంలో ముందు" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +msgid "mount doesn't implement \"unmount\"" +msgstr "మౌంట్ తెరవండి అమలు లేదు " + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ఏకకాల సారము రకం ఊహింపును మౌంట్ అభివృద్ది చేయుటలేదు" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "హోస్టునామము '%s' కలిగివుంది '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "నెట్వర్కు చేరుకోవుట్లేదు" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "అతిథేయి చేరుకోవుటలేదు" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "నెట్వర్కు మానిటర్ సృష్టించలేక పోయింది: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "నెట్వర్కు మానిటర్ సృష్టించలేక పోయింది:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "నెట్వర్కు స్థితిని పొందలేక పోయింది: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "అవుట్‌పుట్ స్ట్రీమ్ వ్రాయుటను అభివృద్దిచేయుటలేదు" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "మూల స్ట్రీమ్ యిప్పటికే మూయబడివుంది" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' పరిష్కరించుటలో దోషము: %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "వ్యతిరేక-పరిష్కారములో దోషము '%s': %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "'%s' కోసం అభ్యర్ధన రకం సంఖ్య DNS రికార్డు " + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "తాత్కాలికంగా '%s' పరిష్కరించలేదు" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "%s పరిష్కరించుటలో దోషము" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "అసంపూర్ణం సమాచారాన్ని పొందింది '%s' కొరకు " + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "'%s' వద్ద వనరు లేదు" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "'%s' వద్ద వనరు డీకంప్రెస్ అగుటకు విఫలమైంది" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "'%s' వద్దగల వనరు డైరెక్టరీ కాదు" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "ఇన్‌పుట్ స్ట్రీమ్ సీక్‌ను అభివృద్ది చేయుటలేదు" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "సహాయం ముద్రణ" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "జాబితా విభాగాలు వనరులను elf ఫైలునందు కలిగివున్నాయి" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"వనరుల జాబితా\n" +"విభాగము యీయబడితే, ఈ విభాగము నందలి వనరులు మాత్రమే జాబితాచేయి\n" +"పాత్ యీయబడితే, సరిపోలిన వనరులను మాత్రమే జాబితాచేయి" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "విభాగము" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"వనరులను వివరాలతో జాబితాచేయి\n" +"విభాగము యీయబడితే, ఈ విభాగము నందలి వనరులను మాత్రమే జాబితాచేయి\n" +"పాత్ యీయబడితే, సరిపోలిన వనరులను మాత్రమే జాబితాచేయి\n" +"వివరాలు విభాగము, పరిమాణం మరియు కంప్రెషన్ ను కలిగివుండును" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "వనరు ఫైలును stdout పైనకు తెమ్ము" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "ఫైల్ పాత్" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "తెలియని ఆదేశం %s\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"వాడుక:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help ఈ సమాచారమును చూపుము\n" +" sections \n" +" list వనరులను జాబితాచేయును\n" +" details వనరులను వివరములతో జాబితాచేయును\n" +" extract ఒక వనరును బయటకుతెచ్చును\n" +"\n" +"విశదీకృత సహాయం కొరకు 'gresource help COMMAND' వుపయోగించు.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"వాడుక:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "వాదనలు:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION ఒక (ఐచ్చిక) elf విభాగం పేరు\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr "కమాండ్ (ఐచ్ఛిక) ఆదేశం వివరించటానికి \n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE ఒక elf ఫైలు (ఒక బైనరీ ఫైలు లేదా భాగస్వామ్య లైబ్రరీ)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE ఒక elf ఫైలు (ఒక బైనరీ లేదా భాగస్వామ్య లైబ్రరీ)\n" +" లేదా కంపైల్డ్ వనరు ఫైలు\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH ఒక (ఐచ్చిక) వనరు పాత్ (బహుశా పాక్షిక)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH ఒక వనరు పాత్\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "కాదు అలాంటి పథకం '%s' \n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "స్కీమ '%s' relocatable కాదు (మార్గం పేర్కొన్న ఉండకూడదు) \n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "స్కీమ '%s' relocatable (మార్గం తప్పక) ఉంది\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "ఇచ్చిన ఖాళీ మార్గం.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "పాత్ ఒక స్లాష్ (/) ప్రారంభమవుతాయి తప్పక\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "పాత్ ఒక స్లాష్ (/) తో అంతం చేయాలి\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "పాత్ రెండు సమీప slashes (/ /) ఉండకూడదు\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "'%s' వంటి కీ లేదు\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "యివ్వబడిన విలువ చెల్లుబాటు అయ్యే పరిధి బయట ఉంది\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "వ్యవస్థాపిత (non-relocatable) స్కీమాస్ జాబితా" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "ఇన్స్టాల్ relocatable స్కీమాస్ జాబితా" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "స్కీమ లో కీలను జాబితా" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "షెడ్యూల్ [: PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "స్కీమ పిల్లలకు జాబితా" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"జాబితా కీలు మరియు విలువలు, పునరావృతంగా \n" +"సంఖ్య స్కీమ ఇవ్వబడుతుంది ఒకవేళ అన్ని కీలను జాబితా\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[చార్ట్ [: PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "కీ విలువ పొందండి" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "షెడ్యూల్ [: PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "కీ కోసం చెల్లుబాటు అయ్యే విలువలు పరిధి విచారిస్తారు" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "VALUE కీ యొక్క విలువ అమర్చు" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "స్కీమ [: PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "దాని సాధారణ విలువ కీ రీసెట్" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "స్కీమ వారి లకు అన్ని కీలను రీసెట్" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "KEY రైటబుల్ ఉంటే తనిఖీ" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"మార్పులు KEY పర్యవేక్షించడానికి.\n" +"ఏ KEY పేర్కొన్న ఉంటే, స్కీమ అన్ని కీలను మానిటర్.\n" +"వాడుక ^ సి పర్యవేక్షణ ఆపడానికి.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"వాడుక:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"ఆదేశాలు:\n" +" help ఈ సమాచారాన్ని చూపించు\n" +" list-schemas సంస్థాపించిన స్కీమాలను జాబితా చేయును\n" +" list-relocatable-schemas relocatable స్కీమాస్ జాబితాచేయును\n" +" list-keys స్కీములోని కీలను జాబితాచేయును\n" +" list-children స్కీము చిల్డ్రన్ జాబితాచేయును\n" +" list-recursively కీలను మరియు విలువను జాబితాచేయును, పునరావృతంగా\n" +" range కీ విస్తృతిని ప్రశ్నించును\n" +" get కీ యొక్క విలువను పొందును\n" +" set కీ విలువను వుంచును\n" +" reset కీ విలువను తిరిగివుంచును\n" +" reset-recursively ఇచ్చిన స్కీమా నందలి అన్ని విలువలను తిరిగివుంచును\n" +" writable కీ వ్రాయదగునదా లేదా అనేది పరిశీలించును\n" +" monitor మార్పులను పర్యవేక్షించును\n" +"\n" +"విశదీకృత సహాయం కొరకు 'gsettings help COMMAND' వుపయోగించు.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"వాడుక:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR అదనపు స్కీమాలను అన్వేషించుటకు వొక డైరక్టరీ\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" స్కీమ యొక్క పథకం పేరు\n" +" PATH మార్గం, relocatable స్కీమాస్ కోసం \n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr "స్కీమ లోపల కీ (ఆప్షనల్) కీలక \n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr "స్కీమ లోపల KEY కీలక \n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr "అమర్చవలసిన విలువ VALUE\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "ఖాళీ స్కీమ పేరు ఇవ్వబడింది \n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "చెల్లని సాకెట్, సిద్దపరచలేదు" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "చెల్లని సాకెట్, దీని కారణంగా సద్దీకరణ విఫలమైంది: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "సాకెట్ యిప్పటికే మూయబడింది" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "సాకెట్ I / O సమయం ముగిసింది" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd నుండి GSocket సృష్టిస్తోంది: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "సాకెట్‌ను సృష్టించలేక పోయింది: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "అపరిచిత కుటుంబం తెలుపబడింది" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "తెలియని ప్రోటోకాల్ తెలుపబడింది" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "స్థానిక చిరునామాను పొందలేక పోయింది: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "దూరస్థ చిరునామాను పొందలేక పోయింది: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "%s వినలేక పోయింది" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "చిరునామాకు బందనం అగుటలో దోషము: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "మల్టీకాస్ట్ సమూహంకు జేరుటలో దోషం: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "మల్టీకాస్ట్ సమూహంకు వదులుటలో దోషం: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "వనరు-ప్రత్యేక మల్టీకాస్ట్ కొరకు తోడ్పాటులేదు" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "అనుసంధానమును ఆమోదించుటలో దోషము: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "అనుసంధానము పురోగతిలోవుంది" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "వాయిదావున్న దోషమును పొందలేక పోయింది: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "డాటా స్వీకరించుటలో దోషము: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "డాటా పంపుటలో దోషము: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "మూసివేతను కరంటు ప్లగ్గు పెట్టే చోటు సాధ్యం కాదు:%s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "సాకెట్ మూయుటలో దోషము: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "సాకెట్ పరిస్థితి కోరకు వేచివుంది: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "సందేశమును పంపుటలో దోషము: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "విండోస్ నందు GSocketControlMessage తోడ్పాటులేదు" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "సందేశమును స్వీకరించుటలో దోషము: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g(_s)తోర్ర_get_credentials ఈ OS కోసం అమలు కాలేదు" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "ప్రోక్సీ సేవిక %sకు అనుసంధానం కాలేకపోయింది: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s కు అనుసంధానం కాలేక పోయింది: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "అనుసంధానం కాలేక పోయింది: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "అనుసంధానమునందు తెలియని దోషము" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "TCP-కాని అనుసంధానంలో ప్రోక్సీయింగ్ తోడ్పాటులేదు." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "ప్రాక్సీ ప్రోటోకాల్ '%s' మద్దతు లేదు." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "లిజనర్ యిప్పటికే మూసివేయబడింది" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "జతచేసిన సాకెట్ మూయబడింది" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 IPv6 చిరునామా '%s' మద్దతు ఇవ్వదు" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "SOCKSv4 నిబందన కొరకు వాడుకరిపేరు మరీ పొడవుగా వుంది" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "అతిథేయిపేరు '%s' అనునది SOCKSv4 నిబందనకు మరీ పొడవుగా వుంది" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "సేవిక ఒక SOCKSv4 ప్రాక్సీ సర్వర్ కాదు." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 సర్వర్ ద్వారా అనుసంధానము తిరస్కరించబడింది" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "సేవిక ఒక SOCKSv5 ప్రాక్సీ సర్వర్ కాదు." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ప్రాక్సీ ప్రమాణీకరణ అవసరం." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 ప్రాక్సీ ద్వారా మద్దతు లేని ఒక ప్రామాణిక పద్ధతిని అవసరంGlib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "SOCKSv5 నిబందనకు వాడుకరిపేరు లేదా సంకేతపదం మరీ పొడవుగా వుంది." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 ప్రమాణీకరణ వర్డ్ కారణంగా విఫలమైంది" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "అతిథేయిపేరు '%s' అనునది SOCKSv5 నిబందనకు మరీ పొడవుగా వుంది" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ప్రాక్సీ సర్వర్ తెలియని చిరునామా రకం ఉపయోగిస్తుంది." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "అంతర్గత SOCKSv5 ప్రాక్సీ సర్వర్ లోపం." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Ruleset ద్వారా SOCKSv5 అనుసంధానము అనుమతి లేదు." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 సర్వర్ ద్వారా అందుబాటులో లేదు హోస్ట్ చేయండి." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 ప్రాక్సీ ద్వారా వర్క్ అందుబాటు లేదు." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "అనుసంధానము SOCKSv5 ప్రాక్సీ ద్వారా నిరాకరించారు." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ప్రాక్సీ 'అనుసంధానిస్తాయి' ఆదేశాన్ని మద్దతు ఇవ్వదు." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 ప్రాక్సీ చిరునామా రకం అందించిన మద్దతు ఇవ్వదు." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "తెలియని SOCKSv5 ప్రాక్సీ లోపం." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon ఎన్కోడింగుయొక్క వర్షన్ %dను సంభాలించలేదు" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM-encoded వ్యక్తిగత కీను డీక్రిప్టు చేయలేదు" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "ఏవీ దొరకలేదు pem-కోడ్ అయిన ప్రైవేట్ కీ" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Pem-కోడ్ అయిన ప్రైవేట్ కీ అన్వయించడం సాధ్యం కాదు" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "ఏవీ దొరకలేదు pem-కోడ్ అయిన సర్టిఫికేట్" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Pem-కోడ్ అయిన సర్టిఫికేట్ అన్వయించడం సాధ్యం కాదు" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" +"ఈ మీ ఆక్సెస్ ముందు సరిగ్గా పాస్వర్డ్ను ఎంటర్ చివరి అవకాశం ఉందిలాక్ " +"చేయబడుతుంది." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"ఎంటర్ అనేక వర్డ్ ఉన్నాయి, మరియు మీ ఆక్సెస్ లాక్ చేయబడుతుందిమరింత వైఫల్యాలు " +"తర్వాత బయటకు." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "నమోదు చేసిన పాస్ వర్డ్ సరియైనది కాదు." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 నింయంత్రణ సందేశము అనుకొంది, %d పొందింది" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "ఊహించని యాన్సిల్లరి డాటా రకము" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ఒక fd ఊహించినది, అయితే %d పొందింది\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "చెల్లని fd స్వీకరించినది" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "ఆధారాలను పంపడంలో లోపం:" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" +" SO(_P) పాస్క్రెడ్ ఉంటే తనిఖీ చేసేటప్పుడు లోపం సాకెట్ %s: కోసం ఉపయోగించ బడింది" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"ఊహించని ఎంపికను పొడవు SO_PASSCRED ఎనేబుల్ ఒకవేళ చూడ్డంలోకరంటు ప్లగ్గు పెట్టే " +"చోటు. ఆశించబడింది" +"%d బైట్లు,%d వచ్చింది" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "లోపం ఎనేబుల్ SO_PASSCRED:%s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"ఆధారాలను అందుకోవటానికి ఒకే బైట్ చదువు కానీ సున్నా బైట్లు చదవడానికి " +"ఎక్స్పెక్టింగ్" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "నియంత్రణ సందేశం వస్తుందని వాళ్ళకు, కానీ%d సంపాదించుకున్నారు" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED నిలిపివేసిన లోపం అయితే:%s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ఫైలు వివరిణి నుండి చదువుటలో దోషం: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ఫైల్ వివరిణిని మూయుటలో దోషం: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "దస్త్రవ్యవస్థ రూట్" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ఫైల్ వివరిణికి వ్రాయుటలో దోషం: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "" +"ఆబ్‌స్ట్రాక్టు యునిక్సు డొమైన్ సాకెట్ చిరునామాలకు ఈ సిస్టమ్ నందు తోడ్పాటులేదు" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"బయటకుపంపు లేదా ఆపరేషన్_తో_బయటకుపంపు అనుదానిని వాల్యూమ్ అభివృద్ది పరచుటలేదు" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "అనువర్తనమును కనుగొన లేదు" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "అనువర్తనంను ఆరంభించుటలో దోషము: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URIలు మద్దతీయుటలేదు" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 నందు సహసంభంద మార్పులు మద్దతీయుటలేదు" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 నందు సహసంభంద సృష్టీకరణ మద్దతీయుటలేదు" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "%s: అదుపు చేయగ వచ్చిన చదవడంలో లోపం" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "హ్యాండిల్ మూయుటలో దోషము: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "హ్యాండిల్ వ్రాయుటలో దోషము: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "మెమోరీ అయిపోయింది" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "అంతర్గత దోషము: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "మరింత ఇన్పుట్ అవసరం" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "చెల్లని కుదించబడిన డేటా" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "చిరునామా లో వినండి " + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "GTestDbus తో అనుసంధానం కోసం, నిర్లక్ష్యం" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "చిరునామా ముద్రించు " + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "షెల్ రీతిలో చిరునామా ముద్రించు " + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "ఒక dbus సేవను నడుపుము" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "తప్పు args\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "మూలకం '%2$s'కు అనుకోని యాట్రిబ్యూట్ '%1$s'" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "మూలకం '%2$s'యొక్క యాట్రిబ్యూట్ '%1$s' కనబడలేదు" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "అనుకోని టాగ్ '%s', అనుకున్న టాగ్ '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "అనుకోని టాగ్ '%s' దీని లోపల '%s'" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "డాటా dirsనందు యెటువంటి విలువైన పుస్తకగుర్తు దస్త్రము కనబడలేదు" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s'కు యిప్పటికే ఒక పుస్తకగుర్తు వుంది" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s'కొరకు యెటువంటి పుస్తకగుర్తు కనబడలేదు" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తకగుర్తునందు యెటువంటి MIME రకము నిర్వచించలేదు" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తుకగుర్తునందు యెటువంటి వ్యక్తిగత జెండా నిర్వచించలేదు" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s'కొరకు పుస్తకగుర్తునందు యెటువంటి సమూహములు అమర్చలేదు" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ఎటువంటి అనువర్తనము '%s' నామముతో పుస్తకగుర్తును '%s'కొరకు నమోదుచేయలేదు" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "exec వరుస '%s'ను URI '%s'తో పొడిగించుటకు విఫలమైంది" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "చివరి ఎగుబడి నందు పాక్షికముగా అక్షర క్రమము కలదు." + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ఫాల్ బ్యాక్ '%s' ను '%s'" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "\"దస్త్రం\" యోచనను ఉపయోగించిన యుఆర్ఐ '%s' సంపూర్ణమైన యుఆర్ఐ కాదు" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "స్థానిక యుఆర్ఐ '%s' '#' ను కలుపుకొనియండలెదు " + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr " '%s' యుఆర్ఐ నిస్సారము" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ఆతిథ్య నామం యొక్క యుఆర్ఐ '%s' నిస్సారము" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "యుఆర్ఐ '%s' నిస్సారమైన ఎస్కేప్ అక్షరాలు కలిగియున్నాయి." + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr " '%s' త్రోవ నామం సరిఐనది కాదు." + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "నిస్సారమైన ఆతిథ్య నామము" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "ఉ." + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "సా." + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %b %e %H:%M:%S %Y" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "జనవరి" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ఫిబ్రవరి" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "మార్చి" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ఏప్రిల్" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "మే" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "జూన్" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "జూలై" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "ఆగష్టు" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "సెప్టెంబరు" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "అక్టోబరు" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "నవంబరు" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "డిసెంబరు" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "జనవరి" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ఫిబ్రవరి" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "మార్చి" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ఏప్రిల్" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "మే" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "జూన్" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "జూలై" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "ఆగష్టు" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "సెప్టెంబరు" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "అక్టోబరు" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "నవంబరు" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "డిసెంబరు" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "సోమవారం" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "మంగళవారం" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "బుధవారం" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "గురువారం" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "శుక్రవారం" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "శనివారం" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "ఆదివారం" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "సోమ" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "మంగళ" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "బుధ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "గురు" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "శుక్ర" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "శని" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ఆది" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr " వివరణ తెరచుటలో దోషం '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "%lu బైట్లని దస్త్రం \"%s\" చదువుటకు ఇవ్వలేము" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "దస్త్రం '%s': %s చదువుటలో దోషం" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "దస్త్రము \"%s\" చాలా పెద్దది" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr " దస్త్రం '%s': %s నుండి చదువుటలో విఫలమైనారు" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr " దస్త్రం '%s': %s తెరుచుటలో విఫలమైనారు" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "దస్త్ర ఆపాదనలు విఫలమగును '%s': ఎఫ్ స్టాట్() విఫలమైనది: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "దస్త్రం '%s' తెరుచుటలో విఫలమైనారు: ఎఫ్ డిఓపన్() విఫలమైనది: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"దస్త్రమును '%s'నుండి '%s'కు పునఃనామకరణ చేయుటలో విఫలమైంది: g_rename() " +"విఫలమైంది: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr " '%s' దస్త్రమును సృష్టించుటలో విఫలమయినావు. :%s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "" +"దస్త్రము '%s'ను వ్రాయటుకొరకు తెరుచుటలో విఫలమైంది: fdopen() విఫలమైంది:%s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయటలో విఫలమైంది: fwrite() విఫలమైంది:%s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయుటకు విఫలమైంది: fflush() విఫలమైంది: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "దస్త్రము '%s'కు వ్రాయటలో విఫలమైంది: fsync() విఫలమైంది:%s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "దస్త్రము '%s'ను మూయుటలో విఫలమైంది: fclose() విఫలమైంది: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ఉన్న దస్త్రము '%s' తొలగించబడ లేకపోయింది: g_unlink() విఫలమైంది: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr " '%s' మాదిరి, '%s' కలిగియుండలెదు. " + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "మాదిరి '%s' XXXXXX కలిగిలేదు" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr " '%s' చిహ్న పూరితజోడి చదువుటలో విఫలమయినావు : %s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "చిహ్న పూరితజోడి సహకరించలెదు. " + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "కన్వర్టర్‌ను '%s' నుండి '%s'కు తెరువలేకపోయింది: %s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr " జి_ఐఓ_ఛానెల్_రీడ్_లైన్_స్ర్టింగ్ ముడి చదువు సాధ్యపడదు " + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr " మిగిలిన దత్తాంశమును రీడ్ బఫర్ లో పరివర్తించలెము " + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr " పూర్తికాని అక్షరాన్ని ప్రసార మార్గం ముగించును. " + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "జి_ఐఓ_ఛానెల్_రీడ్_లైన్_ఎండ్ ముడి చదువు సాధ్యపడదు" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "శోధన dirsనందు విలువైన కీ దస్త్రము కనబడలేదు" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "క్రమబద్దమైన దస్త్రం కాదు" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"ఏదైతే మీట-విలువలు , గ్రూప్ ,లేక వ్యాఖ్య కాదో అది మీట దస్త్రంలో లైన్ '%s' " +"కలిగియున్నది" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "చెల్లని గ్రూప్ నామము : %s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr " మీట దస్త్రం సముదాయంతో ప్రారంభమవలెదు. " + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "చెల్లని కీ నామము :%s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr " మీట దస్త్రం కలిగియున్న సంకేతరచన '%s' సహకరించదు " + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr " మీట దస్త్రం సముదాయం '%s' ను కలిగియుండలేదు " + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "మీట దస్త్రం '%s' తాళంను కలిగియుండలేదు. " + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "'%s' మీట దస్త్రం యొక్క మీటను కలిగియున్నది,దాని విలువ '%s' యుటిఫ్-8 " + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"కీ దస్త్రము ఇంటర్‌ప్రీట్ కాలేనటువంటి విలువను కలిగివున్న కీ '%s'ను కలిగివుంది." + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"'%s' కీను '%s' సమూహం నందు కలిగివున్న కీఫైలు యింటర్‌ప్రెట్ చేయలేని విలువను " +"కలిగివుంది." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "కీ '%s' సమూహం '%s' నందు '%s' విలువను కలిగివుంది కాని %s కావాలి" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "'%s' మీట దస్త్రం యొక్క మీట ను గ్రూప్ '%s' లో కలిగియుండలేదు " + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr " మీట దస్త్రం గీత చివర ఎస్పేప్ అక్షరము కలదు" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr " '%s' మీట దస్త్రం నిస్సారమైన ఎస్పేప్ వరుస కలదు " + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' విలువను సంఖ్య గా చదువుటకు సాధ్యపడదు." + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "పూర్ణాంకం విలువ '%s' విస్రృతిలో లేదు" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "'%s' విలువను ఫ్లోట్ సంఖ్యగా చదువుటకు సాధ్యపడదు." + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "%s' విలువను బులియన్ గా చదువుటకు సాధ్యపడదు." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "" +"'%s%s%s%s' ఫైలు యొక్క యాట్రిబ్యూట్లను పొందుటలో విఫలమైంది: fstat() విఫలమైంది: %" +"s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s కు మాప్ అగుటలో విఫలమైంది: mmap() విఫలమైంది: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "దస్త్రము '%s'ను తెరువుటలో విఫలమైంది: open() విఫలమైంది: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "వరుస %d అక్షరము %d పై దోషము: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "నామమునందు చెల్లని UTF-8 ఎన్కోడెడ్ పాఠ్యము - చెల్లనిది '%s'" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' చెల్లునటువంటి నామము కాదు " + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' చెల్లునటువంటి నామము కాదు: '%c' " + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d వరుసలో దోషం కలదు : %s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "అక్షర నివేదన '%-.*s' అనుమతించబడిన అక్షరము ఎన్ కోడ్ అవ్వదు." + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +" ఖాశి వ్యష్టి '&;' చూడబడినది; వర్తించు వ్యష్టిలు: & " < > " +"'" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "మూలకము నామము '%-.*s' తెలిసినది కాదు" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "పత్రం తప్పనిసరిగా ఒక మూలకంతో ప్రారంభమవలెను (ఉదా. <బుక్>)" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +" '<' తో ప్రారంభమగు '%s' అనునది సరరిఐన అక్షరం కాదు ; యిది మూలక నామంతో " +"ప్రారంభమవలేదు. " + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "బేసి అక్షరము '%s', ఖాళీ-మూలకపు టాగ్ '%s'ను ముగించుటకు '>' అనుకొనబడింది" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "బేసి అక్షరము '%s', ఊహించిన '=' తర్వాత '%s' ఆపాదించు నామం '%s' మూలకం " + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, 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:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr " '%s' మూలకం మూయబడినది, ప్రస్ధుతం ఏ మూలకము తెరచియుండలెదు " + +# ../glib/gmarkup.c:1588 +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "'%s' మూలకం మూయబడినది, కాని ప్రస్ధుతం తెరువ బడిన మూలకం '%s'" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr " పత్రం ఖాలిగా ఉన్నది లేక ఒక వైట్ స్పేస్ కలిగి యున్నది. " + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "పత్రం చివర కోణ కుండలీకరణము'<' వెంటనె అనవసరముగా ముగింపు అయినది" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"మూలకములు ఇంకను తెరచియున్న పత్రం ఊహించని విధంగా అంతమైనది- '%s' చివరిది మూలకము " +"తెరచబడినది" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"పత్రం ఊహించని విధంగా అంతమైనది,మూసిన కోణకుండశికరణం అంతము చూచుటకు ఊహించబడినది " +"బొందు <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr " పత్రం చివర ఊహించని మూలకనామం కలదు " + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "పత్రం చివర ఊహించని ఆపాదననామం కలదు" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "పత్రం చివర ఊహించని తెరచిన బొందు కలదు." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +" '=' చిహ్నము తర్వాత యాట్రిబ్యూట్ నామమును అనుసరిస్తూ యాట్రిబ్యూట్ విలువలేకుండా " +"పత్రము అనుకోకుండా " +"ముగించబడింది." + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr " లోపల ఆపాదన విలువ ఉన్నపుడు పాఠం ఊహించకుండా ముగింపు అయినది " + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr " '%s'మూలకము యోక్క మూసిన బొందు ఊహించకుండా పాఠం ముగింపు అయినది " + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr " లోపల వ్యాఖ్య క్రమగతి ఆదేశం ఉండగా ఊహించకుండా పాఠం ముగింపు అయినది " + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "వినిమయం:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[ఇచ్చాపూర్వరకం...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలు:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలను చూపించుట" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "సహాయ ఇచ్ఛాపూర్వకాలన్నింటని చూపించుట" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "కార్యక్షేత్ర ఇచ్ఛాపూర్వకాలు :" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "పూర్ణాంకం విలువ %sను %s కొరకు పార్స్‍ చేయలేదు" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr " పూర్ణాంకం విలువ '%s' లో విస్రృతి లో లేని %s " + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "డబుల్ విలువ '%s'ను %sకొరకు పార్శ్‍‌చేయలేదు" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "డబుల్ విలువ '%s' అనునది %sకొరకు వ్యాప్తిలో లేదు" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "ఐచ్చికం పార్శింగ్‌లో దోషము %s" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s కొరకు తప్పిపోయిన ఆర్గుమెంట్" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "తెలియని ఇచ్ఛాపూర్వకము %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "పాడైన ఆబ్జక్టు" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "అతర్గత దోషము లేదా పాడైన ఆబ్జక్టు" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "మెమోరీ అయిపోయింది" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "బ్యాక్‌ట్రాకింగ్ పరిమితి చేరుకొంది" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "పాక్షిక సరిజోడికి మద్దతీయని అంశములను మాదిరి కలిగివుంది" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "పాక్షిక సరిజోడికి నియమాలు మద్దతీయని కారణంగా బ్యాక్ రిఫరెన్స్‍" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "పునరావృతపు పరిమితి చేరినది" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "కొత్తవరుస జెండాలయొక్క చెల్లని మిశ్రమం" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "బ్యాడ్ ఆఫ్‌సెట్" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "లఘు utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "పునరావృత ఆవృతం" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "తెలియని దోషము" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ మాదిరి చివర వద్ద" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c మాదిరి చివరవద్ద" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "గుర్తించబడని అక్షరము అనుసరిస్తోంది \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} క్వాంటిఫైర్‌లో క్రమము బయటవున్న సంఖ్యలు" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} క్వాంటిఫైర్‌లో పెద్దగావున్న సంఖ్య" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "అక్షరపు క్లాస్‌కు ] ముగింపు తప్పిపోయినది" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "అక్షరపు క్లాస్‌నందు చెల్లని ఎస్కేప్ అనుక్రమము" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "అక్షరపు క్లాస్‌నందు వ్యాప్తి క్రమముకు బయటవుంది" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "మళ్ళీచేయుటకు యేమీలేదు" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "అనుకోని ఆవృతము" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "(? లేదా (?- తర్వాత గుర్తింపులేని అక్షరము" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX నామపు క్లాసెస్ క్లాస్ లోపల మాత్రమే మద్దతునిస్తాయి" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ముగించునది ) తప్పిపోయింది" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "లేని వుపమాదిరికి రిఫరెన్స్‍" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "వ్యాఖ్యానం తర్వాత తప్పిపోయిన )" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "సాదారణ సమీకరణం చాలా పెద్దది" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "మెమొరి పొందుటలో విఫలమైంది" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") తెరిచిన ( లేకుండా" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "కోడ్ వోవర్‌ఫ్లో" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< తర్వాత గుర్తించని అక్షరము" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "వెనుకచూడండి చెప్పినమాట నిర్ధరిత పోడవులేదు" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( తర్వాత తప్పుగావున్న సంఖ్య లేదా నామము" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "నియమరూపక సమూహం రెండుకన్నా యెక్కువ శాఖలను కలిగివుంది" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R లేదా (?[+-]అంకెలు తప్పక ) అనుసరించాలి" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "తెలియని POSIX తరగతి నామము" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX ఖండించుకొను మూలకాలు మద్దతీయబడవు" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} అనుక్రమమునందలి అక్షరపు విలువ చాలా పెద్దది" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "చెల్లని నియమము (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "వెనుక చెప్పిన దానిలో \\C అనుమతించబడదు" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, మరియు \\u తోడ్పాటులేదు" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "పునరావృత కాల్ అనంతంగా లూప్‌కాగలదు" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P తర్వాత గుర్తించని అక్షరము" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "ఉపమాదిరి నామమునందు తప్పిపోయిన ముగింపు" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "రెండు నామాల వుపమాదిరిలు ఒకే నామమును కలిగివున్నాయి" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "తప్పుగావున్న \\P లేదా \\p అనుక్రమము" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P లేదా \\p తర్వాత తెలియని లక్షణము నామము" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ఉపమాదిరి నామము మరీ పెద్దది (గరిష్ఠం 32 అక్షరములు)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "నామము గలిగిన చాలా వుపమాదిరిలు (గరిష్ఠంగా 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "అష్టాంశ విలువ \\377 కన్న పెద్దది" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "మించిపోయిన నిర్వర్తనా పనితలం" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "ముందుగా-పరిశీలించిన రిఫరెన్సుడు వుపమాదిరి కనబడలేదు" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "నిర్వచించిన సమూహం వొకటికన్నా యెక్కువ శాఖలను కలిగివుంది" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "అస్థిరత్వ NEWLINE ఐచ్చికాలు" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g బ్రేస్‌డ్, ఏంగిల్-బ్రాకెటెడ్, లేదా కోటెడ్ పేరు లేదా సంఖ్య, లేదా సాదా " +"సంఖ్య చే అనుసరింపబడదు" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "రిఫరెన్సు చేయబడుతున్న సంఖ్య సున్నా కారాదు" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" +"ఆర్గుమెంట్ అనునది (*ACCEPT), (*FAIL), లేదా (*COMMIT) కొరకై అనుమతించబడదు" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) గుర్తించబడలేదు" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "సంఖ్య మరీ పెద్దది" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& తరువాత వుపమాదిరి పేరు లేదు" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ తరువాతనే అంకె రావలెను" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "JavaScript సారూప్యతా రీతినందు ] చెల్లని దత్తాంశ అక్షరం" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "ఒకే సంఖ్య యొక్క వుపమాదిరిల కొరకు వేరువేరు పేర్లు అనుమతించబడవు" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) తప్పక వొక ఆర్గుమెంట్ కలిగివుండాలి" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c తప్పక ASCII అక్షరంచే అనుసరించబడాలి" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k బ్రేస్‌డ్ లేదా ఏంగిల్-బ్రాకెట్, లేదా కోటెడ్ పేరు చే అనుసరింపబడదు" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "ఒక తరగతి నందు \\N తోడ్పాటునీయదు" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "చాలా ఫార్వార్డ్ రిఫరెన్సులు" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "(*MARK), (*PRUNE), (*SKIP), నందు (*THEN) పేరు చాలా పెద్దగావుంది" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... వరుసక్రమం నందలి అక్షర విలువ మరీ పెద్దది" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "సాదారణ సమీకరణమును సరిజోడి చేస్తున్నప్పుడు దోషము %s: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE లైబ్రరీ UTF-8 మద్దతులేకుండా నిర్వర్తించబడింది" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE లైబ్రరీ UTF8 లక్షణముల మద్దతులేకుండా నిర్వర్తించబడింది" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE లైబ్రరీ సారూప్యతలేని ఐచ్చికాలతో నిర్వర్తించబడెను" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "సాదారణ సమీకరణము %sను అక్షరము %dవద్ద నిర్వర్తిస్తున్నప్పుడు దోషము: %s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "సాదారణ సమీకరణము %sను మెరుగుపరుస్తున్నప్పుడు దోషము: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "హెగ్జాడెసిమల్ డిజిట్ లేదా '}' అనుకోబడింది" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "హెగ్జాడెసిమల్ అంకె అనుకోబడింది" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "చిహ్నరూప రిఫరెన్సునందు '<' తప్పిపోయినది" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "పూర్తికాని చిహ్నరూప రెఫరెన్సు" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "సున్నా-పొడవు చిహ్నరూప రిఫరెన్సు" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "అంకె అనుకోబడినది" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "సరికాని చిహ్నరూప రిఫరెన్సు" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "స్ట్రే ఫైనల్ '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "తెలియని యెస్కేప్ అనుక్రమము" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "పునఃస్థన పాఠ్యము \"%s\"ను అక్షరం %lu వద్ద పార్శ్‍‌చేస్తుంటే దోషము: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "కోటెడ్ పాఠం కొటేషన్ చిహ్నంతో ప్రారంభవరాదు" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr " కమాండ్ లైన్ లేద షల్_కోటెడ్ పాఠం లో సామ్యంలేని కొటేషన్ చిహ్నం కలదు " + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "పాఠం '\\' అక్షరము వెంటనె ముగింపు అయినది. (ఈ పాఠము '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"సామ్యమైన కొటేషన్ చిహ్నం %c లభించకముందె పాఠం ముగింపు అయినది . (ఈ పాఠము'%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "పాఠం ఏమి లేదు (లేక ఒక వైట్ స్పేస్ కలదు)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) శిశు కార్యం నుండి వివరము చదువుటలో విఫలమయినావు " + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +" శిశు కార్యం (%s) నుండి పాఠం చదువుటలో సెలెక్ట్() లో ఊహించని దోషం కలదు. " + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "వెయిట్ పిడ్() లో ఊహించని దోషం కలదు(%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "%ld కోడ్‌ తో చైల్డ్ ప్రోసెస్ నిష్క్రమించెను" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "సంకేతం %ld తో చెల్డ్ ప్రోసెస్ అంతంచేయబడెను" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "సంకేతం %ld తో చైల్డ్ ప్రోసెస్ ఆపివేయబడెను" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "చైల్డ్ ప్రోసెస్ అసహజంగా నిష్క్రమించెను" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr " శిశు పైప్ నుండి చదువుటలో విఫలమయినావు(%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) ఫోర్క్ విఫలమయినది " + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr " '%s' (%s) వివరణ మార్చుటలో విఫలమయినావు " + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో విఫలమయినావు (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" +"ఎగుబడికి రిడైరెక్ట్ చేయుటలో విఫలమైనది లేక శిశు కార్యం యొక్క దిగుబడి (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr " (%s) శిశుకార్యం యెక్క ఫోర్క్ విఫలమయినది " + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr " \"%s\" శిశుకార్యం నిర్వర్తించుటలో తెలియని ధోషం కలదు " + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "శిశు పిడ్ పైప్ (%s) నుండి సరిపడునంత చదువుటలో విఫలమైనావు. " + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr " (%s) శిశు కార్యం తో తెలియచేయుటకు పైప్ ను సృష్టించుటలో విఫలమైనావు " + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr " శిశు కార్యం నుండి చదువుటలో విఫలమయినావు " + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "(%s) శిశు కార్యం నిర్వర్తించుటలో విఫలమయినావు " + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "చెల్లని ప్రోగ్రామ్ నామము: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "ఆర్గుమెంట్ శీర్షములో %dవద్ద చెల్లని స్ట్రింగ్: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "ఎన్విరాన్‌మెంట్ నందు చెల్లని స్ట్రింగ్: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "చెల్లని పనిచేయుచున్న డైరెక్టరి: %s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "సహాయ కార్యక్రమం నిర్వర్తించుటలో విఫలమైంది (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +" శిశు కార్యం నుండి జి_ఐఓ_ఛానెల్_విన్౩౨32_పోల్() పాఠం ను చదువుటలో ఊహించని " +"దోషం కలదు" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "అక్షరము యుటిఫ్-8 శ్రేణియందు లేదు " + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "పరివర్తన ఎగుబడి వరుస నిస్సారము " + +# ../glib/gutf8.c:1382 ../glib/gutf8.c:1478 +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "అక్షరము UTF-16 శ్రేణియందు లేదు" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u బైట్" +msgstr[1] "%u బైట్లు" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f piB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f pB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s బైటు" +msgstr[1] "%s బైట్లు" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "అసాధారణ కార్యక్రమం ముగింపు ఆవిర్భావానికి కారణమైంది కమాండ్ లైన్ `%s ':%s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "కమాండ్ లైన్ `%s 'non-సున్నా నిష్క్రమణ స్థితి%d తో exited:%s" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "ఖాళీ వుపస్ట్రింగ్స్‍ కొరకు పనితలం పరిమితి చేరినది" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "కేస్-మరల్పు యెస్కేప్స్‍ (\\l, \\L, \\u, \\U) యిక్కడ అనుమతించబడవు" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "నిర్వచించు సమూహంను మళ్ళీచేయుట అనుమతించబడదు" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' కొరకు ఏ సేవ రికార్డైలేదు" + +#~ msgid "File is empty" +#~ msgstr " కాళీ దస్త్రం " + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "'%s' మీట దస్త్రం యొక్క మీట ను కలిగియున్నది,దాని విలువను చదువుటకు సాధ్యపడదు." + +#~ msgid "This option will be removed soon." +#~ msgstr "ఈ ఐచ్ఛికం వెంటనే తొలగించబడతాయి." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "దస్త్రము '%s'ను ప్రారంభించుటలో దోషము: %s" + +#~ msgid "Error connecting: " +#~ msgstr "అనుసంధానమగుటలో దోషము:" + +#~ msgid "Error connecting: %s" +#~ msgstr "%sకు అనుసంధానమగుటలో దోషము" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "%i అక్షరాల SOCKSv4 అమలు పరిమితులు యూజర్పేరు" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a అమలు %i అక్షరాల హోస్ట్పేరు పరిమితం" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "యునిక్స్‍‌నుండి చదువుటలో దోషము: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "యునిక్స్‍‌ను మూయుటలో దోషము: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "యునిక్స్‍‌కు వ్రాయుటలో దోషము: %s" + +#~ msgid "Do not give error for empty directory" +#~ msgstr "ఖాళీ డైరెక్టరీ కోసం దోషాన్ని ఇస్తుంది లేదు" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "కీ %s వ్రైటబుల్ కాదు \n" + +#~ 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 "పొడవైన జాబితాకరణ రూపాన్ని ఉపయోగించుము" diff --git a/po/th.po b/po/th.po new file mode 100644 index 0000000..3c365fa --- /dev/null +++ b/po/th.po @@ -0,0 +1,3853 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2010-04-06 14:40+0700\n" +"Last-Translator: Theppitak Karoonboonyanan \n" +"Language-Team: Thai \n" +"Language: th\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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "พบแอตทริบิวต์ '%s' ที่ไม่ต้องการ สำหรับอิลิเมนต์ '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "ไม่พบแอตทริบิวต์ '%s' สำหรับอิลิเมนต์ '%s'" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "พบแท็ก '%s' ที่ไม่ต้องการ ขณะที่ต้องการแท็ก '%s'" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "พบแท็ก '%s' ที่ไม่ต้องการภายใน '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "ไม่พบแฟ้มที่คั่นหน้าที่ใช้การได้ในไดเรกทอรีข้อมูล" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "มีที่คั่นหน้าสำหรับ URI '%s' อยู่ก่อนแล้ว" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "ไม่พบที่คั่นหน้าสำหรับ URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดชนิด MIME ไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดแฟล็กส่วนตัวไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "ไม่ได้กำหนดกลุ่มไว้ในที่คั่นหน้าสำหรับ URI '%s'" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "ไม่มีโปรแกรมประยุกต์ชื่อ '%s' ที่ลงทะเบียนที่คั่นหน้าสำหรับ '%s' ไว้" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "กระจายบรรทัดคำสั่ง '%s' ด้วย URI '%s' ไม่สำเร็จ" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ไม่รองรับการแปลงรหัสอักขระจาก '%s' ไปเป็น '%s'" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ไม่สามารถเปิดตัวแปลงรหัสอักขระจาก '%s' ไปเป็น '%s' ได้" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "มีลำดับไบต์ที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "เกิดข้อผิดพลาดระหว่างแปลงรหัส: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "มีลำดับไบต์ไม่เต็มอักขระอยู่ที่ท้ายข้อมูลเข้า" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ไม่สามารถแปลงสตริงซ่อมเสริม '%s' ให้เป็นรหัส '%s' ได้" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' ไม่ใช่ URI สัมบูรณ์ที่ใช้ scheme \"file\"" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI ของแฟ้มท้องถิ่น '%s' ต้องไม่มี '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' ใช้ไม่ได้" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "ชื่อโฮสต์ของ URI '%s' ใช้ไม่ได้" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' มีอักขระหลีกที่ไม่ถูกต้อง" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "ชื่อพาธ '%s' ไม่ใช่พาธเต็ม" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "ชื่อโฮสต์ผิดรูปแบบ" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %e %b %Ey, %H:%M:%S" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%Ey" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "มกราคม" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "กุมภาพันธ์" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "มีนาคม" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "เมษายน" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "พฤษภาคม" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "มิถุนายน" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "กรกฎาคม" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "ม.ค." + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ก.พ." + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "มี.ค." + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "เม.ย." + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "พ.ค." + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "มิ.ย." + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "ก.ค." + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "จันทร์" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "อังคาร" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "พุธ" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "พฤหัสบดี" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "ศุกร์" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "เสาร์" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "อาทิตย์" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "จ." + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "อ." + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "พ." + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "พฤ." + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ศ." + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "ส." + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "อา." + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดไดเรกทอรี '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ไม่สามารถจองหน่วยความจำ %lu ไบต์เพื่ออ่านแฟ้ม \"%s\" ได้" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "แฟ้ม \"%s\" ใหญ่เกินไป" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "อ่านข้อมูลจากแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "อ่านแอตทริบิวต์ของแฟ้ม '%s' ไม่สำเร็จ: fstat() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: fdopen() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "เปลี่ยนชื่อแฟ้ม '%s' ไปเป็น '%s' ไม่สำเร็จ: g_rename() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "สร้างแฟ้ม '%s' ไม่สำเร็จ: %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "เปิดแฟ้ม '%s' เพื่อเขียนไม่สำเร็จ: fdopen() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fwrite() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fflush() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "เขียนแฟ้ม '%s' ไม่สำเร็จ: fsync() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ปิดแฟ้ม '%s' ไม่สำเร็จ: fclose() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "ไม่สามารถลบแฟ้ม '%s' ที่มีอยู่ได้: g_unlink() ล้มเหลว: %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "แม่แบบ '%s' ใช้ไม่ได้ ไม่ควรมี '%s'" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "แม่แบบ '%s' ไม่มี XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u ไบต์" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u ไบต์" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "อ่านลิงก์สัญลักษณ์ '%s' ไม่สำเร็จ: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "เปิดแฟ้ม '%s' ไม่สำเร็จ: open() ล้มเหลว: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "แม็ปแฟ้ม '%s' ไม่สำเร็จ: mmap() ล้มเหลว: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "มีข้อผิดพลาดที่บรรทัด %d อักขระที่ %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "พบข้อความลงรหัส UTF-8 ไม่ถูกต้องในชื่อ - ข้อความที่ผิด: '%s'" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้: '%c' " + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "มีข้อผิดพลาดที่บรรทัด %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ตัวอ้างอิงอักขระ '%-.*s' ไม่ได้ลงรหัสอักขระที่อนุญาตให้ใช้ได้" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "พบเอนทิตีว่างเปล่า '&;' ซึ่งไม่ถูกต้อง ค่าที่ใช้ได้คือ: & " < > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "ไม่รู้จักเอนทิตีชื่อ '%-.*s'" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "เอกสารต้องเริ่มด้วยอิลิเมนต์ (เช่น )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลัง '<' ได้ จึงไม่สามารถใช้ขึ้นต้นชื่ออิลิเมนต์ได้" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "พบอักขระแปลกปลอม '%s' ในขณะที่มองหาอักขระ '>' ที่จะมาปิดแท็กอิลิเมนต์เปล่า '%s'" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"พบอักขระแปลกปลอม '%s' ในขณะที่กำลังมองหา '=' หลังชื่อแอตทริบิวต์ '%s' ของอิลิเมนต์ '%s'" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "'%s' ไม่ใช่อักขระที่ใช้ตามหลังชื่ออิลิเมนต์ '%s' ในแท็กปิดได้ อักขระเดียวที่อนุญาตคือ '>'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "พบการปิดอิลิเมนต์ '%s' แต่ไม่มีอิลิเมนต์ใดเปิดอยู่" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "พบการปิดอิลิเมนต์ '%s' แต่อิลิเมนต์ที่เปิดอยู่คือ '%s'" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "เอกสารว่างเปล่า หรือมีแต่อักขระช่องว่าง" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "เอกสารจบแบบผิดปกติหลังจากวงเล็บแหลม '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "เอกสารจบแบบผิดปกติ โดยยังมีอิลิเมนต์เปิดอยู่ - '%s' คืออิลิเมนต์ที่เปิดล่าสุด" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "เอกสารจบแบบผิดปกติ ในขณะที่กำลังมองหาวงเล็บแหลมที่จะมาปิดแท็ก <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่ออิลิเมนต์" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางชื่อแอตทริบิวต์" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กเปิดอิลิเมนต์" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "เอกสารจบแบบผิดปกติหลังจากเครื่องหมาย '=' หลังชื่อแอตทริบิวต์ โดยไม่มีค่าของแอตทริบิวต์" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางค่าแอตทริบิวต์" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางแท็กปิดสำหรับอิลิเมนต์ '%s'" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "เอกสารจบแบบผิดปกติระหว่างกลางหมายเหตุหรือคำสั่งประมวลผล" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "ออบเจกต์เสียหาย" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "ข้อผิดพลาดภายในหรือออบเจกต์เสียหาย" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "หน่วยความจำเต็ม" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "เกินขอบเขตการถอยคืน" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "แพตเทิร์นมีรายการที่ไม่รองรับในการจับคู่ทีละส่วน" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "ข้อผิดพลาดภายใน" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "ไม่รองรับการใช้การอ้างอิงย้อนกลับเป็นเงื่อนไขในการจับคู่ทีละส่วน" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "เกินขอบเขตการเรียกตัวเอง" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "เกินขอบเขตพื้นที่ทำงานสำหรับสตริงย่อยเปล่า" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "ชุดของแฟล็กการขึ้นบรรทัดใหม่มีค่าไม่เข้ากัน" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "ข้อผิดพลาดไม่ทราบสาเหตุ" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "พบ \\ ที่ท้ายแพตเทิร์น" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "พบ \\c ที่ท้ายแพตเทิร์น" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "พบอักขระที่ไม่รู้จักตามหลัง \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "ห้ามใช้รหัสหลีกเปลี่ยนตัวพิมพ์ใหญ่-เล็ก (\\l, \\L, \\u, \\U) ที่ตำแหน่งนี้" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "ค่าตัวเลขผิดพลาดในตัวระบุปริมาณ {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "ค่าตัวเลขสูงเกินไปในตัวระบุปริมาณ {}" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "ไม่มี ] ปิดในคลาสอักขระ" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "มีลำดับอักขระหลีกที่ไม่ถูกต้องในคลาสอักขระ" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "ค่าช่วงผิดพลาดในคลาสอักขระ" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "ไม่มีสิ่งที่จะซ้ำ" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "พบอักขระที่ไม่รู้จักหลัง (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "ใช้ชื่อคลาสอักขระของ POSIX ได้ในคลาสเท่านั้น" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "ไม่มี ) ปิด" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R หรือ (?[+-]ตัวเลข ต้องตามด้วย ) เสมอ" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "มีการอ้างถึงแพตเทิร์นย่อยที่ไม่มีอยู่" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "ไม่มี ) หลังหมายเหตุ" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "นิพจน์เรกกิวลาร์ยาวเกินไป" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "จองหน่วยความจำไม่สำเร็จ" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "แพตเทิร์นตรวจค่าย้อนไม่ได้มีความยาวคงที่" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "ตัวเลขหรือชื่อผิดรูปแบบหลัง (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "กลุ่มเงื่อนไขมีทางเลือกที่เป็นไปได้มากกว่าสองทาง" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "ต้องการแพตเทิร์นตรวจค่าหลัง (?(" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "พบชื่อคลาสของ POSIX ที่ไม่รู้จัก" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "ไม่รองรับ collating element ของ POSIX" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "ค่าอักขระในลำดับ \\x{...} มีค่าสูงเกินไป" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "เงื่อนไข (?(0) ใช้ไม่ได้" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "ใช้ \\C ในแพตเทิร์นตรวจค่าย้อนไม่ได้" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "การเรียกตัวเองมีโอกาสวนรอบไม่รู้จบ" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "ไม่มีตัวปิดในชื่อแพตเทิร์นย่อย" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "มีแพตเทิร์นย่อยชื่อซ้ำกัน" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "ลำดับ \\P หรือ \\p ผิดรูปแบบ" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "พบชื่อคุณสมบัติที่ไม่รู้จักหลัง \\P หรือ \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "ชื่อแพตเทิร์นย่อยยาวเกินไป (ความยาวสูงสุดคือ 32 อักขระ)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "มีแพตเทิร์นย่อยมากเกินไป (สูงสุดได้ 10,000 แพตเทิร์น)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "ค่าเลขฐานแปดสูงกว่า \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "กลุ่ม DEFINE มีทางเลือกมากกว่าหนึ่งทาง" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "ซ้ำกลุ่ม DEFINE ไม่ได้" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "ตัวเลือก NEWLINE ขัดแย้งกันเอง" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g ไม่ได้ตามด้วยชื่อในวงเล็บปีกกา หรือตัวเลขที่ไม่ใช่ศูนย์ที่อาจอยู่ในวงเล็บปีกกา" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "พบการซ้ำที่ไม่คาดหมาย" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "โค้ดล้น" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "ใช้พื้นที่ทำงานสำหรับการคอมไพล์หมดแล้ว" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "ไม่พบแพตเทิร์นย่อยที่ตรวจสอบไปก่อนหน้าที่อ้างถึง" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "เกิดข้อผิดพลาดขณะจับคู่นิพจน์เรกกิวลาร์ %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่รองรับ UTF8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "ไลบรารี PCRE ถูกคอมไพล์มาแบบไม่รองรับคุณสมบัติ UTF8" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "เกิดข้อผิดพลาดขณะแจงนิพจน์เรกกิวลาร์ %s ที่อักขระที่ %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "เกิดข้อผิดพลาดขณะออปติไมซ์นิพจน์เรกกิวลาร์ %s: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "ต้องการเลขฐานสิบหกหรือ '}'" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "ต้องการเลขฐานสิบหก" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "ไม่มี '<' ในตัวอ้างอิงสัญลักษณ์" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์ไม่สมบูรณ์" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์มีความยาวเป็นศูนย์" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "ต้องการตัวเลข" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "ตัวอ้างอิงสัญลักษณ์ไม่ถูกต้อง" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "'\\' ปราศจากข้อมูลอยู่ที่ท้ายสตริง" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "ลำดับอักขระหลีกไม่รู้จัก" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "เกิดข้อผิดพลาดขณะแจงข้อความสำหรับแทนที่ \"%s\" ที่อักขระที่ %lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ข้อความคำพูดไม่ได้ขึ้นต้นด้วยอัญประกาศ" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "พบอัญประกาศไม่เข้าคู่ในบรรทัดคำสั่งหรือข้อความคำพูดของเชลล์" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "ข้อความจบทันทีหลังอักขระ '\\' (ข้อความที่ว่าคือ '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "ข้อความจบเสียก่อนจะพบอัญประกาศที่เข้าคู่กับ %c (ข้อความที่ว่าคือ '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "ข้อความว่างเปล่า (หรือมีแต่อักขระช่องว่าง)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "สร้างไปป์เพื่อสื่อสารกับโพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "เข้าไปที่ไดเรกทอรี '%s' ไม่สำเร็จ (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "ดำเนินงานโพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "ชื่อโปรแกรมผิดรูปแบบ: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "สตริงผิดรูปแบบในเวกเตอร์ของอาร์กิวเมนต์ที่ตำแหน่ง %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "สตริงผิดรูปแบบในตัวแปรสภาพแวดล้อม: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ไดเรกทอรีใช้งานมีรูปแบบไม่ถูกต้อง: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ดำเนินงานโปรแกรมช่วยไม่สำเร็จ (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"เกิดข้อผิดพลาดไม่คาดหมายใน g_io_channel_win32_poll() ระหว่างอ่านข้อมูลจากโพรเซสลูก" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "อ่านข้อมูลจากโพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน select() ระหว่างอ่านข้อมูลจากโพรเซสลูก (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "เกิดข้อผิดพลาดไม่คาดหมายใน waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork ไม่สำเร็จ (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "ดำเนินงานโพรเซสลูก \"%s\" ไม่สำเร็จ (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "เปลี่ยนทิศทางข้อมูลเข้าหรือออกจากโพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "fork โพรเซสลูกไม่สำเร็จ (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะดำเนินงานโพรเซสลูก \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "อ่านข้อมูลจากไปป์จากโพรเซสลูกได้ไม่เพียงพอ (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "อักขระอยู่นอกช่วงของ UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "มีลำดับข้อมูลที่ไม่ถูกต้องในข้อมูลที่ป้อนให้ตัวแปลงรหัส" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "อักขระอยู่นอกช่วงของ UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "วิธีใช้:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "ตัวเลือกแสดงวิธีใช้:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "แสดงวิธีใช้ตัวเลือกต่างๆ ทั้งหมด" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "ตัวเลือกของโปรแกรม:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "ไม่สามารถแจงค่าจำนวนเต็ม '%s' สำหรับ %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "ค่าจำนวนเต็ม '%s' สำหรับ %s ออกนอกช่วงที่กำหนด" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "ไม่สามารถแจงค่า double '%s' สำหรับ %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "ค่า double '%s' สำหรับ %s ออกนอกช่วงที่กำหนด" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "เกิดข้อผิดพลาดขณะแจงตัวเลือก: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "ขาดอาร์กิวเมนต์สำหรับ %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "ไม่รู้จักตัวเลือก %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "ไม่พบแฟ้มคีย์ที่ใช้การได้ในไดเรกทอรีแหล่งค้นหา" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "ไม่ใช่แฟ้มปกติ" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "แฟ้มว่างเปล่า" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "แฟ้มคีย์มีบรรทัด '%s' ซึ่งไม่ใช่รูปแบบคู่คีย์-ค่า, กลุ่ม, หรือหมายเหตุ ที่ถูกต้อง" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "ชื่อกลุ่มผิดรูปแบบ: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "แฟ้มคีย์ไม่ได้ขึ้นต้นด้วยกลุ่ม" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "ชื่อคีย์ผิดรูปแบบ: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "แฟ้มคีย์มีเนื้อหาเป็นรหัสอักขระ '%s' ซึ่งไม่รองรับ" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "แฟ้มคีย์ไม่มีกลุ่ม '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "แฟ้มคีย์ไม่มีคีย์ '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่า '%s' ซึ่งไม่ใช่รูปแบบ UTF-8" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "แฟ้มคีย์มีคีย์ '%s' ในกลุ่ม '%s' ซึ่งมีค่าที่ไม่สามารถตีความได้" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "แฟ้มคีย์ไม่มีคีย์ '%s' ในกลุ่ม '%s'" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "แฟ้มคีย์มีอักขระหลีกที่ท้ายบรรทัด" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "แฟ้มคีย์มีลำดับหลีก '%s' ที่ไม่ถูกต้อง" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลขได้" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "ค่าจำนวนเต็ม '%s' ออกนอกช่วง" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นตัวเลข float ได้" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "ค่า '%s' ไม่สามารถตีความเป็นบูลีนได้" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "มีการส่งค่า count ที่สูงเกินไปมาให้ %s" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "สตรีมถูกปิดไปแล้ว" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "การกระทำถูกยกเลิก" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "อ็อบเจกต์ผิดพลาด ยังไม่ได้ตั้งค่าเริ่มต้น" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "มีลำดับไบต์ที่ไม่สมบูรณ์ในข้อมูลเข้า" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "มีที่ว่างไม่พอที่ปลายทาง" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "ชนิด %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "พบจุดจบสตรีมก่อนกำหนด" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "ไม่รองรับที่อยู่ซ็อกเก็ต" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: " + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "ชนิดข้อมูลไม่รู้จัก" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดไดเรกทอรี '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างไดเรกทอรี: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้ม '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้ม: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "ซ็อกเก็ตที่เพิ่มถูกปิดไปแล้ว" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Listener ถูกปิดไปแล้ว" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "ไม่รองรับการใช้ถังขยะ" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "มีข้อผิดพลาดที่บรรทัด %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "เกิดข้อผิดพลาดขณะแจงตัวเลือก: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "กำลังอยู่ระหว่างเชื่อมต่อ" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "กำลังอยู่ระหว่างเชื่อมต่อ" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' ไม่ใช่ชื่อที่ใช้ได้ " + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "เกิดข้อผิดพลาดขณะแจงตัวเลือก: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "เกิดข้อผิดพลาดขณะรับการเชื่อมต่อ: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "เกิดข้อผิดพลาดขณะเปิดไดเรกทอรี '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "ออบเจกต์เสียหาย" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "ไม่มีชื่อ" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "แฟ้มเดสก์ท็อปไม่ได้ระบุเขตข้อมูล Exec" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "หาเทอร์มินัลซึ่งต้องใช้ในการเปิดโปรแกรมไม่พบ" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ไม่สามารถสร้างโฟลเดอร์ %s สำหรับเก็บค่าตั้งโปรแกรมของผู้ใช้: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ไม่สามารถสร้างโฟลเดอร์ %s สำหรับเก็บค่าตั้ง MIME ของผู้ใช้: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ไม่สามารถสร้างแฟ้มเดสก์ท็อป %s สำหรับผู้ใช้" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "ข้อกำหนดกำหนดเองสำหรับ %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "ไดรว์ไม่รองรับคำสั่ง start" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "ไดรว์ไม่รองรับคำสั่ง stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GEmblem รุ่น %d ได้" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "จำนวนโทเคนในรหัสของ GEmblem (%d) ไม่ถูกต้อง" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GEmblemedIcon รุ่น %d ได้" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "จำนวนโทเคนในรหัสของ GEmblemedIcon (%d) ไม่ถูกต้อง" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "ต้องการข้อมูล GEmblem สำหรับ GEmblemedIcon" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "ไม่มีจุดเมานท์ที่บรรจุแฟ้มอยู่" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "ไม่สามารถคัดลอกทับไดเรกทอรี" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "ไม่สามารถคัดลอกไดเรกทอรีทับไดเรกทอรี" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "มีแฟ้มปลายทางอยู่ก่อนแล้ว" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "ไม่สามารถคัดลอกไดเรกทอรีทั้งยวง" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "ไม่รองรับการต่อถ่าย (splice)" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "เกิดข้อผิดพลาดขณะต่อถ่าย (splice) แฟ้ม: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "ไม่สามารถคัดลอกแฟ้มพิเศษได้" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "ได้รับชื่อ symlink ที่ใช้การไม่ได้" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "ไม่รองรับการใช้ถังขยะ" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ชื่อแฟ้มจะมีอักขระ '%c' ไม่ได้" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "โวลุมไม่รองรับการเมานท์" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "ไม่มีโปรแกรมที่ลงทะเบียนสำหรับจัดการแฟ้มประเภทนี้ไว้" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "ตัวแจงนับถูกปิด" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "ตัวแจงนับแฟ้มมีการกระทำค้างอยู่" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "ตัวแจงนับแฟ้มถูกปิดไปแล้ว" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GFileIcon รุ่น %d ได้" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "ข้อมูลเข้าของ GFileIcon ผิดรูปแบบ" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "สตรีมไม่รองรับ query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "สตรีมไม่รองรับการเลื่อนตำแหน่งอ่านเขียน" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "สตรีมข้อมูลเข้าไม่สามารถตัดท้ายทิ้งได้" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "สตรีมไม่รองรับการตัดท้ายทิ้ง" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "จำนวนโทเคน (%d) ไม่ถูกต้อง" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "ไม่มีชนิดสำหรับคลาสชื่อ %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "ชนิด %s ไม่ได้ทำอินเทอร์เฟซ GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "เลขรุ่นมีรูปแบบไม่ถูกต้อง: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "ชนิด %s ไม่ได้ทำ from_tokens() ของอินเทอร์เฟซ GIcon" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของไอคอนรุ่นที่ระบุได้" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "สตรีมมีการกระทำค้างอยู่" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "มีที่ว่างไม่พอสำหรับที่อยู่ซ็อกเก็ต" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "ไม่รองรับที่อยู่ซ็อกเก็ต" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "ไม่รองรับการใช้ถังขยะ" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ชนิดของแอตทริบิวต์ใช้การไม่ได้ (ต้องการสตริง)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "ไม่สามารถหาชนิดปริยายของการเฝ้ามองไดเรกทอรีในเครื่อง" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ชื่อแฟ้ม %s ผิดรูปแบบ" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านข้อมูลของระบบแฟ้ม: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "ไม่สามารถเปลี่ยนชื่อไดเรกทอรีราก" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปลี่ยนชื่อแฟ้ม: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "ไม่สามารถเปลี่ยนชื่อแฟ้ม เนื่องจากมีแฟ้มชื่อเดียวกันอยู่ก่อนแล้ว" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "ชื่อแฟ้มผิดรูปแบบ" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "ไม่สามารถเปิดไดเรกทอรี" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้ม: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "เกิดข้อผิดพลาดขณะทิ้งแฟ้มลงถังขยะ: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "สร้างไดเรกทอรีถังขยะ '%s' ไม่สำเร็จ: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "หาไดเรกทอรีระดับบนสุดสำหรับถังขยะไม่สำเร็จ" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "หาหรือสร้างไดเรกทอรีถังขยะไม่สำเร็จ" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "สร้างแฟ้มข้อมูลการทิ้งขยะไม่สำเร็จ: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ทิ้งแฟ้มลงถังขยะไม่สำเร็จ: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างไดเรกทอรี: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ระบบแฟ้มไม่รองรับลิงก์สัญลักษณ์" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างลิงก์สัญลักษณ์: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "เกิดข้อผิดพลาดขณะย้ายแฟ้ม: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "ไม่สามารถย้ายไดเรกทอรีทับไดเรกทอรี" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "สร้างแฟ้มสำรองไม่สำเร็จ" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มปลายทาง: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "ไม่รองรับการย้ายแฟ้มข้ามอุปกรณ์" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "ค่าแอตทริบิวต์ต้องไม่ใช่ตัวชี้ศูนย์" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "ชนิดของแอตทริบิวต์ใช้การไม่ได้ (ต้องการสตริง)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "ชื่อแอตทริบิวต์ส่วนขยายเพิ่มใช้การไม่ได้" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดแอตทริบิวต์ส่วนขยาย '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะ stat แฟ้ม '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (รหัสอักขระไม่ถูกต้อง)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "เกิดข้อผิดพลาดขณะ stat file descriptor: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการ uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการ uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "ชนิดของแอตทริบิวต์ไม่ถูกต้อง (ต้องการสตริงของไบต์)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "ไม่สามารถกำหนดสิทธิ์ให้กับ symlink ได้" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดสิทธิ์: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดเจ้าของ: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "symlink ต้องไม่ใช่ตัวชี้ศูนย์" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนด symlink: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "เกิดข้อผิดพลาดขณะกำหนด symlink: แฟ้มไม่ใช่ symlink" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนดเวลาเปลี่ยนแปลงหรือเข้าถึง: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux context ต้องไม่ใช่ตัวชี้ศูนย์" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "เกิดข้อผิดพลาดขณะกำหนด SELinux context: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "ไม่ได้เปิดใช้งาน SELinux ในระบบนี้" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "ไม่รองรับการกำหนดแอตทริบิวต์ %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านข้อมูลจากแฟ้ม: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "เกิดข้อผิดพลาดขณะเลื่อนตำแหน่งอ่านเขียนแฟ้ม: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้ม: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "ไม่สามารถหาชนิดปริยายของการเฝ้ามองแฟ้มในเครื่อง" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มสำรองเก่า: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "เกิดข้อผิดพลาดขณะสร้างสำเนาสำรอง: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "เกิดข้อผิดพลาดขณะเปลี่ยนชื่อแฟ้มสำรอง: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "เกิดข้อผิดพลาดขณะตัดท้ายแฟ้มทิ้ง: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดแฟ้ม '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "แฟ้มปลายทางเป็นไดเรกทอรี" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "แฟ้มปลายทางไม่ใช่แฟ้มปกติ" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "แฟ้มถูกแก้ไขโดยโปรแกรมอื่น" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "เกิดข้อผิดพลาดขณะลบแฟ้มเดิม: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "ได้รับค่า GSeekType ที่ใช้การไม่ได้" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "คำสั่งเลื่อนตำแหน่งอ่านเขียนผิดเงื่อนไข" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "ไม่สามารถตัดท้าย GMemoryInputStream ทิ้ง" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "สตรีมข้อมูลออกในหน่วยความจำไม่สามารถเปลี่ยนขนาดได้" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "เปลี่ยนขนาดสตรีมข้อมูลออกในหน่วยความจำไม่สำเร็จ" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "ปริมาณหน่วยความจำที่ต้องการสำหรับการเขียนใหญ่เกินขอบเขตของแอดเดรสที่มี" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "มีการร้องขอให้เลื่อนตำแหน่งไปก่อนหน้าจุดเริ่มต้นของสตรีม" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "การเมานท์นี้ยังไม่รองรับการเดาชนิดเนื้อหาแบบซิงโครนัส" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ชื่อโฮสต์ '%s' มี '[' แต่ไม่มี ']'" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "สตรีมข้อมูลออกยังไม่รองรับการเขียนข้อมูล" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "สตรีมต้นทางถูกปิดไปแล้ว" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s': %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s' ย้อนกลับ: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "ไม่มีข้อมูลบริการสำหรับ '%s'" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "ไม่สามารถเปิดหาที่อยู่ '%s' ได้ชั่วคราว" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "เกิดข้อผิดพลาดขณะเปิดหาที่อยู่ '%s'" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "ไม่รู้จักตัวเลือก %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "ซ็อกเก็ตผิดพลาด ยังไม่ได้ตั้งค่าเริ่มต้น" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ซ็อกเก็ตผิดพลาด ตั้งค่าเริ่มต้นไม่สำเร็จเนื่องจาก: %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "ซ็อกเก็ตถูกปิดไปแล้ว" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ขณะสร้าง GSocket จาก fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "สร้างซ็อกเก็ตไม่สำเร็จ: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "มีการระบุโพรโทคอลที่ไม่รู้จัก" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "ไม่สามารถหาที่อยู่ฝั่งนี้ได้: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "ไม่สามารถหาที่อยู่ฝั่งโน้นได้: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "ไม่สามารถ listen: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "เกิดข้อผิดพลาดขณะ bind กับที่อยู่: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "เกิดข้อผิดพลาดขณะรับการเชื่อมต่อ: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: " + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "กำลังอยู่ระหว่างเชื่อมต่อ" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "เกิดข้อผิดพลาดขณะเชื่อมต่อ: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ไม่สามารถอ่านข้อผิดพลาดที่คั่งค้างอยู่ได้: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "เกิดข้อผิดพลาดขณะรับข้อมูล: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "เกิดข้อผิดพลาดขณะล่งข้อมูล: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "สร้างซ็อกเก็ตไม่สำเร็จ: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดซ็อกเก็ต: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "กำลังรอเงื่อนไขของซ็อกเก็ต: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "เกิดข้อผิดพลาดขณะส่งข้อความ: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "ไม่รองรับ GSocketControlMessage บนวินโดวส์" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "เกิดข้อผิดพลาดขณะรับข้อความ: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเชื่อมต่อ" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Listener ถูกปิดไปแล้ว" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "ซ็อกเก็ตที่เพิ่มถูกปิดไปแล้ว" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "ไม่สามารถจัดการกับรหัสของ GThemedIcon รุ่น %d ได้" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "ต้องการข้อความควบคุม 1 ข้อความ แต่ได้รับ %d ข้อความ" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "พบข้อมูลช่วยเป็นชนิดที่ไม่คาดหมาย" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ต้องการ fd หนึ่งรายการ แต่ได้รับ %d รายการ\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "ได้รับ fd ที่ไม่ถูกต้อง" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "เกิดข้อผิดพลาดขณะล่งข้อมูล: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "เกิดข้อผิดพลาดขณะเปลี่ยนชื่อแฟ้ม: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "ต้องการข้อความควบคุม 1 ข้อความ แต่ได้รับ %d ข้อความ" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านแฟ้มยูนิกซ์: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้มยูนิกซ์: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "รากระบบแฟ้ม" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้มยูนิกซ์: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "ระบบนี้ไม่รองรับที่อยู่ unix domain socket แบบ abstract" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "โวลุมยังไม่รองรับคำสั่ง eject หรือ eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "หาโปรแกรมไม่พบ" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "เกิดข้อผิดพลาดขณะเรียกโปรแกรม: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "ไม่รองรับ URI" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "ไม่รองรับการเปลี่ยนแปลงการเชื่อมโยงสำหรับ win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "ไม่รองรับการสร้างการเชื่อมโยงสำหรับ win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "เกิดข้อผิดพลาดขณะอ่านข้อมูลจากแฟ้ม: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "เกิดข้อผิดพลาดขณะปิดแฟ้ม: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "เกิดข้อผิดพลาดขณะเขียนข้อมูลลงแฟ้ม: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "หน่วยความจำไม่พอ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "ข้อผิดพลาดภายใน: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "ต้องการข้อมูลเข้าเพิ่มเติม" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "ข้อมูลบีบอัดผิดรูปแบบ" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "ไม่สามารถย้ายไดเรกทอรีทับไดเรกทอรี" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "ชนิด %s ไม่ได้เป็นคลาส" + +#~ 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.po b/po/tl.po new file mode 100644 index 0000000..7b9315f --- /dev/null +++ b/po/tl.po @@ -0,0 +1,3873 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-12-01 17:31+0800\n" +"Last-Translator: Eric Pareja \n" +"Language-Team: Tagalog \n" +"Language: tl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, 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:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "Walang mahanap na talaksang susi sa mga dir ng datos" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Hindi mabuksan ang converter mula '%s' tungong '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Hindi kumpletong karakter sequence sa dulo ng input" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Hindi maka-balik '%s' sa codeset '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Ang URI '%s' ay hindi tanggap" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Ang hostname ng URI '%s' ay hindi tanggap" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Ang URI '%s' ay may hindi tanggap na escaped karakter" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Ang pathname '%s' ay hindi absolute path" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Hindi tanggap na hostname" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %r %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%r" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Enero" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Pebrero" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Marso" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Abril" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mayo" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Hunyo" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Hulyo" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Ene" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Peb" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Abr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Hun" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Hul" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Lunes" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Martes" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Miyerkoles" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Huwebes" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Biyernes" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Sabado" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Linggo" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Lun" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Mar" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Miy" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Huw" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Biy" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Sab" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Lin" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Sawi ang pagbabasa ng talaksang '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Sawi ang pagbukas ng talaksang '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Hindi tanggap ang template '%s', wala dapat na '%s'" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Hindi XXXXXX ang dulo ng template '%s'" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Sawi ang pagbasa ng symbolic link '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Error sa linya %d char %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Error sa linya %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, 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:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Walang laman na entity '&' ay nakita; tanggap na mga entity ay: & " " +"< > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Pangalan ng entity '%s' ay hindi kilala" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Kailangang mag-umpisa ang dokumento ng elemento (hal. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Sinarhan ang elementong '%s', walang bukas na elemento." + +#: ../glib/gmarkup.c:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Walang laman ang dokumento o naglalaman lamang ito ng puwang" + +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng elemento" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng attribute" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +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:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Nagwakas sa partial karakter ang channel" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Hindi tapos na reference sa karakter" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Hindi tapos na reference sa karakter" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Hindi tapos na reference sa karakter" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Hindi tapos na reference sa entity" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +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:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Ang teksto ay walang laman (o naglaman lamang ng puwang)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Sawi sa pagbasa ng datos mula sa prosesong anak" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Sawi sa pagbasa mula sa child pipe (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Sawi sa paglipat sa directory '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Sawi sa pagtakbo ng prosesong anak (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Imbalidong string sa argument vector sa %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Imbalidong string sa kapaligiran: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Imbalidong working directory: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Bigo sa pagtakbo ng programang katulong (%s)" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Hindi inaasahang error sa waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Sawi sa pag-fork (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Sawi sa pagtakbo ng prosesong anak \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Sawi sa pag-fork ng prosesong anak (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Hindi kilalang error sa pagpatakbo ng prosesong anak \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Character wala sa sakop ng UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Hindi tanggap na sequence sa conversion input" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Character wala sa sakop ng UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Pag-gamit:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Option ng Tulong:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Ipakita ang option ng tulong" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Ipakita ang option ng tulong" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Option ng Aplikasyon:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Hindi mai-parse ang halagang integer '%s' para sa %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, 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:1040 +#, 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:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Error habang nagco-convert: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Kulang na argumento para sa %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Hindi kilalang option %s" + +#: ../glib/gkeyfile.c:366 +#, 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:401 +msgid "Not a regular file" +msgstr "Hindi karaniwang talaksan" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Walang laman ang talaksan" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Ang talaksang susi ay hindi naguumpisa sa isang grupo" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ang talaksang susi ay naglalaman ng hindi suportadong encoding '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ang talaksang susi ay walang grupong '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ang talaksang susi ay walang susing '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +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:3730 +#, 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:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ang halagang '%s' ay hindi mabasa bilang numero." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Halagang integer '%s' ay wala sa sakop" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ang halagang '%s' ay hindi mabasa bilang boolean." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Hindi tanggap na byte sequence sa conversion input" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Hindi kilalang option %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Error sa linya %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Hindi tanggap ang karakter '%s' sa loob ng pangalan ng entity" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Hindi tanggap ang karakter '%s' sa loob ng pangalan ng entity" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Hindi tanggap ang karakter '%s' sa loob ng pangalan ng entity" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Imbalidong pangalan ng programa: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Hindi tanggap na hostname" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Sawi ang pagbasa ng symbolic link '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "" +"Nagwakas ng hindi inaasahan ang dokumento sa loob ng pangalan ng attribute" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Error sa pagbukas ng directory '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Error sa linya %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Hindi karaniwang talaksan" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Imbalidong pangalan ng programa: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Hindi kilalang option %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Hindi mapalitan ang modo ng talaksan: bigo ang waitpid(): %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Sawi ang paglikha ng talaksang '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Error sa linya %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Error habang nagco-convert: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Hindi suportado ang mga symbolic link" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Error sa pagbasa ng talaksang '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/tr.po new file mode 100644 index 0000000..2b5ec18 --- /dev/null +++ b/po/tr.po @@ -0,0 +1,3959 @@ +# 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. +# Muhammet Kara , 2011. +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2011-07-08 01:03+0300\n" +"Last-Translator: Muhammet Kara \n" +"Language-Team: Turkish \n" +"Language: tr\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: Lokalize 1.2\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "'%2$s' öğesinde beklenmeyen '%1$s' özniteliği" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "'%2$s' öğesinde '%1$s' özelliği bulunamadı" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Beklenmeyen etiket '%s', '%s' bekleniyordu" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "'%2$s' içinde beklenmeyen etiket '%1$s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Veri dizinlerinde geçerli bir yer imi dosyası bulunamadı" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI '%s' için bir yer imi zaten var" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI '%s' için bir yer imi bulunamadı" + +#: ../glib/gbookmarkfile.c:2413 +#, 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:2498 +#, 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:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI '%s' için yer iminde grup tanımlanmadı" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, 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:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, 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:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Dönüşüm girdisinde geçersiz bayt dizisi" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Dönüşüm sırasında hata oluştu: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Girdinin sonunda parçalı karakter dizisi" + +#: ../glib/gconvert.c:1059 +#, 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:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Yerel dosya URI'si '%s', '#' içeremez" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' geçersiz" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI makine adı '%s' geçersiz" + +#: ../glib/gconvert.c:1941 +#, 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:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Yol adı '%s', kesin bir yol değil" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Geçersiz makine adı" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "ÖÖ" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "ÖS" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Ocak" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Şubat" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Mart" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Nisan" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Mayıs" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Haziran" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Temmuz" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "Ağustos" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "Eylül" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "Ekim" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "Kasım" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "Aralık" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Oca" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Şub" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Mar" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Nis" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "May" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Haz" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Tem" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Ağu" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Eyl" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Eki" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Kas" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Ara" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Pazartesi" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Salı" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Çarşamba" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Perşembe" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Cuma" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Cumartesi" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Pazar" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Pzt" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Sal" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Çar" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Per" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Cum" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Cmt" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Paz" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' dizini açılamadı: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' dosyası okunurken hata: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Dosya \"%s\" çok büyük" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' dosyasından okuma başarısız: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' dosyasını açma başarısız: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' dosyasını oluşturma başarısız: %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, 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:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Şablon '%s' geçersiz, '%s' içermemeli" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Şablon '%s' XXXXXX içermiyor" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u bayt" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f EB" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u bayt" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#: ../glib/gfileutils.c:2210 +#, 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:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Satır %d karakter %d hatalı: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' geçerli bir isim değil " + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' geçerli bir isim değil: '% c'" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Satır %d hata içeriyor: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Karakter referansı '%-.*s' izin verilen karakteri kodlamıyor" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Boş özvarlık '&;' görüldü; geçerli öğeler: & " < &qt; '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Varlık adı '%-.*s' bilinmiyor" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Belge bir öğe ile başlamalı (örneğin )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, 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:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Belge boş veya sadece boşluk karakteri içeriyor" + +#: ../glib/gmarkup.c:1726 +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:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Belge bir öğe isminin içinde beklenmedik bir şekilde bitti" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Belge bir öznitelik ismi içinde beklenmedik bir şekilde bitti" + +#: ../glib/gmarkup.c:1759 +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:1765 +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:1772 +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:1788 +#, 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:1794 +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:189 +msgid "corrupted object" +msgstr "bozuk nesne" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "dahili hata ya da bozuk öğe" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "yetersiz bellek" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "geri takip sınırına ulaşıldı" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +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:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "dahili hata" + +#: ../glib/gregex.c:220 +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:229 +msgid "recursion limit reached" +msgstr "iç içe tekrar sınırına ulaşıldı" + +#: ../glib/gregex.c:231 +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:233 +msgid "invalid combination of newline flags" +msgstr "yeni satır işaretlerinin geçersiz kombinasyonu" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "geçersiz ofset" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "kısa utf8" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "bilinmeyen hata" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ desenin sonunda" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c desenin sonunda" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "anlaşılamayan karakter \\ takip ediyor" + +#: ../glib/gregex.c:274 +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:277 +msgid "numbers out of order in {} quantifier" +msgstr "sayılar {} niceliği içerisinde sıra dışı" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "sayılar {} niceliği içerisinde çok büyük" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "karakter sınıfı için eksik sonlanan ]" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "karakter sınıfında geçersiz dizi" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "karakter sınıfında sıra dışı kapsam" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "tekrarlanacak bir şey yok" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "(? sonrası tanımlanmayan karakter" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "(?< sonrası tanımlanmayan karakter" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "(?P sonrası tanımlanmayan karakter" + +#: ../glib/gregex.c:306 +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:309 +msgid "missing terminating )" +msgstr "eksik sonlandıran )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R ya da (?[+-]basamakları ) ile takip etmelidir" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "mevcut olmayan alt desene referans" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "açıklama sonrası eksik )" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "düzenli ifade çok büyük" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "hafıza alma başarısız oldu" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "geribakma iddiası sabit uzunlukta değil" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "(?( sonrası bozuk rakam ya da isim" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "koşul grubu ikiden daha fazla branç içeriyor" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "(?( sonrası iddia bekleniyor" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "bilinmeyen POSIX sınıf ismi" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "POSIX karşılaştırma öğeleri desteklenmiyor" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} dizisi içerisinde karakter değeri çok büyük" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "geçersiz koşul (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C geriye bakma iddiası içerisinde izin verilmiyor" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "tekrarlı çağrı sonsuz döngü yapamadı" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "alt desen ismi içerisinde eksik sonlandırıcı" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "iki isimli alt desenler aynı isme sahip" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "bozulmuş \\P ya da \\p dizisi" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ya da \\p sonrası bilinmeyen özellik ismi" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "alt desen ismi çok uzun (en fazla 32 karakter)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "çok fazla isimlendirilmiş alt desen (en fazla 10.000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "sekizlik değer \\377'den daha büyük" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE grubu birden daha fazla branş içeriyor" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "bir DEFINE grubunu tekrarlamaya izin verilmiyor" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "kararsız NEWLINE seçenekleri" + +#: ../glib/gregex.c:395 +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:400 +msgid "unexpected repeat" +msgstr "beklenmeyen tekrar" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "kod akış taşması" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "derleme çalışma alanı kaplandı" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "onceden kontrol edilmiş referanslı alt desen bulunamadı" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Düzenli ifade %s eşleşirken hata: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE kütüphanesi UTF8 desteği olmadan derlenmiş" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE kütüphanesi UTF8 özellikleri desteği olmadan derlenmiş" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "Düzenli ifade %s eniyilemesinde (optimization) hata: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "onaltılı rakam ya da '}' beklendi" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "onaltılı rakam beklendi" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "sembolik referansda eksik '<'" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "tamamlanmamış sembolik referans" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "sıfır-uzunlukta sembolik referans" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "rakam beklendi" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "geçersiz sembolik referans" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "son '\\' kayıp" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "geçersiz çıkış dizisi" + +#: ../glib/gregex.c:2360 +#, 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:91 +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:181 +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:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Metin '\\' karakterinden hemen sonra bitti. (Metin: '%s')" + +#: ../glib/gshell.c:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Metin boştu (veya sadece boşluk içeriyordu)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Alt süreçten bilgi okuma başarısızlığı" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, 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:369 ../glib/gspawn.c:1383 +#, 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:375 ../glib/gspawn-win32.c:494 +#, 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:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Geçersiz program adı: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, 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:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Çevre içinde geçersiz dizgi: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Geçersiz çalışma dizini: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Yardımcı program (%s) çalıştırılamadı" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, 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:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid()'de beklenmeyen hata (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Çatallama başarısızlığı (%s)" + +#: ../glib/gspawn.c:1393 +#, 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:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Alt süreç çatallanamadı (%s)" + +#: ../glib/gspawn.c:1420 +#, 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:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Karakter UTF-8 için sınırlarının dışında" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Dönüşüm girdisi içinde geçersiz dizi" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Karakter UTF-16 sınırlarının dışında" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Kullanım:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[SEÇENEK...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Yardım Seçenekleri:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Yardım seçeneklerini göster" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Tüm yardım seçeneklerini göster" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Uygulama Seçenekleri:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, 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:1007 ../glib/goption.c:1075 +#, 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:1032 +#, 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:1040 +#, 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:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "%s seçeneği işlenirken hata" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s için parametre eksik" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Bilinmeyen seçenek %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Arama dizinlerinde geçerli anahtar dosyası bulunamadı" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Normal dosya değil" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Dosya boş" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Geçersiz grup adı: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Anahtar dosyası bir grupla başlamıyor" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Geçersiz anahtar adı: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Anahtar dosya geçersiz kodlama '%s' içeriyor" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Anahtar dosyasında '%s' grubu yok" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Anahtar dosyasında '%s' anahtarı yok" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "Anahtar dosyası satır sonunda çıkış karakteri içeriyor" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' geçersiz çıkış dizisi içeriyor" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "'%s' değeri bir sayı olarak yorumlanamıyor." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Tamsayı değeri '%s' aralık dışında" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, 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:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Akış zaten kapalı" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "İşlem iptal edildi" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Geçersiz nesne, ilklendirilmemiş" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Girdide tamamlanmamış çokbaytlı dizi" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Hedefte yeterli alan yok" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "%s türü" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "Bu iştetim sisteminde GCredentials gerçeklemesi mevcut değil" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Platformunuz için GCredentials desteği yok" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Beklenmeyen erken akış-sonu" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "`%2$s' adres girdisinde desteklenmeyen anahtar `%1$s'" + +#: ../gio/gdbusaddress.c:169 +#, fuzzy, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"`%s' adresi geçersiz (tam olarak bir yol, tmpdir veya soyut anahtarlar " +"gerekiyor)" + +#: ../gio/gdbusaddress.c:182 +#, fuzzy, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "`%s' adres girdisinde anlamsız anahtar/değer kombinasyonu" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, fuzzy, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "`%s' adresinde hata - `port' özniteliği kusurlu" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, fuzzy, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "`%s' adresinde hata - `family' özniteliği kusurlu" + +#: ../gio/gdbusaddress.c:446 +#, fuzzy, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "Adress öğesi `%s', iki nokta (:) içermiyor" + +#: ../gio/gdbusaddress.c:467 +#, fuzzy, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" +"Adres öğesi `%3$s' içerisindeki %1$d, `%2$s' Anahtar/Değer çifti, eşittir " +"işareti içermiyor" + +#: ../gio/gdbusaddress.c:481 +#, fuzzy, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Adres öğesi `%3$s' içerisindeki %1$d, `%2$s' Anahtar/Değer çiftindeki " +"anahtar ya da değeri açmada hata" + +#: ../gio/gdbusaddress.c:559 +#, fuzzy, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"`%s' adresinde hata - unix transport, `path' veya `abstract' anahtarlarından " +"tam olarak bir tanesine değer atanmış olmasını gereksinir." + +#: ../gio/gdbusaddress.c:595 +#, fuzzy, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "`%s' adresinde hata - host özniteliği eksik ya da kusurlu" + +#: ../gio/gdbusaddress.c:609 +#, fuzzy, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "`%s' adresinde hata - port özniteliği eksik ya da kusurlu" + +#: ../gio/gdbusaddress.c:623 +#, fuzzy, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "`%s' adresinde hata - noncefile özniteliği eksik ya da kusurlu" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Kendiliğinden çalışmada hata:" + +#: ../gio/gdbusaddress.c:652 +#, fuzzy, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "`%2$s' adresi için bilinmeyen ya da desteklenmeyen transport `%1$s'" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "`%s' nonce dosyası açılırken hata: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "`%s' nonce dosyası okunurken hata: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "`%s' nonce dosyasından okunurken hata, beklenen 16 bayt, alınan %d" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "`%s' nonce dosyasının içeriğini akışa yazma hatası:" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "Verilen adres boş" + +#: ../gio/gdbusaddress.c:1020 +#, fuzzy +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "machine-id olmadan mesaj veriyolu meydana getirilemiyor:" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "`%s' komut satırını meydana getirmede hata:" + +#: ../gio/gdbusaddress.c:1068 +#, fuzzy, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "`%s' komut satırın meydana getirirken program olağan dışı sonlandı: %s" + +#: ../gio/gdbusaddress.c:1082 +#, fuzzy, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "Komut satırı `%s', sıfır olmayan bir durum ile kapandı %d: %s" + +#: ../gio/gdbusaddress.c:1155 +#, fuzzy, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Oturum veriyolu adresi belirlenemiyor (bu işletim sistem için bu işlev " +"gerçeklenmedi)" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, fuzzy, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"DBUS_STARTER_BUS_TYPE ortam değişkeninden veriyolu adresi belirlenemiyor - " +"bilinmeyen değer `%s'" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +#, fuzzy +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"DBUS_STARTER_BUS_TYPE ortam değişkenine değer atanmadığı için veriyolu " +"adresi belirlenemiyor" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "Bilinmeyen veriyolu türü %d" + +#: ../gio/gdbusauth.c:288 +#, fuzzy +msgid "Unexpected lack of content trying to read a line" +msgstr "Satır okumada beklenmeyen içerik eksikliği" + +#: ../gio/gdbusauth.c:332 +#, fuzzy +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Satır okumada (güvenli), beklenmeyen içerik eksikliği" + +#: ../gio/gdbusauth.c:503 +#, fuzzy, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" +"Tüm olası kimlik doğrulama yöntemleri tükendi (denenen: %s) (mevcut: %s)" + +#: ../gio/gdbusauth.c:1159 +#, fuzzy +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer üzerinden iptal edildi" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "`%s' dizininin bilgilerini almada (stat) hata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, fuzzy, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"`%s' dizini üzerindeki izinler kusurlu. Beklenen kip 0700, elde edilen 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Dizin oluşturmada hata: `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "`%s' anahtarlığı okuma için açılırken hata: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, fuzzy, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "`%2$s' konumundaki anahtarlığın `%3$s' içerikli %1$d. satırı kusurlu" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, fuzzy, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s' konumundaki anahtarlığın, `%3$s' içerikli %1$d. satırındaki ilk simge " +"kusurlu" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, fuzzy, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"`%2$s' konumundaki anahtarlığın, `%3$s' içerikli %1$d. satırındaki ikinci " +"simge kusurlu" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, fuzzy, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "`%2$s konumundaki anahtarlıkta %1$d kimlikli çerez bulunamadı'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Eskimiş kilit dosyası `%s' silinirken hata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Kilit dosyası `%s' oluşturulurken hata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "(Bağı kaldırılmış) kilit dosyası `%s' kapatılırken hata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "`%s' kilit dosyasının bağı kaldırılırken hata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' anahtarlığını, yazma için açarken hata:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, fuzzy, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Ayrıca, `%s' kilit dosyasını serbest bırakma da başarısız oldu: %s)" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "Bağlantı kapalı" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "Zaman aşımı gerçekleşti" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" +"İstemci taraflı bağlantı kurulurken desteklenmeyen etiketlerle karşılaşıldı" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, fuzzy, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"%s konumundaki nesnede `org.freedesktop.DBus.Properties' gibi bir arayüz yok" + +#: ../gio/gdbusconnection.c:3841 +#, fuzzy, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "`%s' özelliği ayarlanırken hata: Beklenen tür `%s', elde edilen `%s'" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' gibi bir özellik yok" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' özelliği okunabilir değil" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' özelliği yazılabilir değil" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' gibi bir arabirim yok" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "Böyle bir arabirim yok" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "%2$s yolundaki nesnede `%1$s' gibi bir arabirim yok" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "`%s' gibi bir yöntem yok" + +#: ../gio/gdbusconnection.c:4515 +#, fuzzy, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "`%s' mesajının türü, beklenen `%s' türü ile örtüşmüyor" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s konumundaki %1$s arabirimi için bir nesne zaten dışa aktarıldı" + +#: ../gio/gdbusconnection.c:4932 +#, fuzzy, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "`%s' yöntemi `%s' türü döndürdü, fakat `%s' bekleniyordu" + +#: ../gio/gdbusconnection.c:5964 +#, fuzzy, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "`%s' imzalı arayüz `%s' üzerindeki `%s' yöntemi mevcut değil" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s için bir alt ağaç zaten dışa aktarılmış" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "tür GEÇERSİZ" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL mesajı: PATH ya da MEMBER başlık alanı eksik" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN mesajı: REPLY_SERIAL başlık alanı eksik " + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR mesajı: REPLY_SERIAL ya da ERROR_NAME başlık alanı eksik" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL mesajı: PATH, INTERFACE ya da MEMBER başlık alanı eksik" + +#: ../gio/gdbusmessage.c:914 +#, fuzzy +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"SIGNAL mesajı: PATH başlık alanı, ayrılmış olan /org/freedesktop/DBus/Local " +"değerini kullanıyor" + +#: ../gio/gdbusmessage.c:922 +#, fuzzy +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL mesajı: INTERFACE başlık alanı, ayrılmış olan org.freedesktop.DBus." +"Local değerini kullanıyor" + +#: ../gio/gdbusmessage.c:998 +#, fuzzy, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "%lu bayt okumak istendi fakat EOF alındı" + +#: ../gio/gdbusmessage.c:1025 +#, fuzzy, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Geçerli bir UTF-8 dizgesi bekleniyordu fakat %d bayt ofsetinde " +"geçersizbaytlar bulunda (dizge uzunluğu %d). Bu noktaya kadar geçerli olan " +"dizge `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, fuzzy, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "`%s' dizgesinden sonra NUL bayt bekleniyordu, fakat %d baytı bulundu" + +#: ../gio/gdbusmessage.c:1242 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "Ayrıştırılan değer `%s', geçerli bir D-Bus nesne yolu değil" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Ayrıştırılan değer `%s', geçerli bir D-Bus imzası değil" + +#: ../gio/gdbusmessage.c:1324 +#, fuzzy, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +"%u bayt uzunluğunda dizi ile karşılaşıldı. Olabilecek en fazla uzunluk 2<<26 " +"bayt (64 MiB)." + +#: ../gio/gdbusmessage.c:1490 +#, fuzzy, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "Varyant için ayrıştırılmış değer `%s' geçerli bir D-Bus imzası değil" + +#: ../gio/gdbusmessage.c:1517 +#, fuzzy, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" +"`%s' tür dizgeli GVariant, D-Bus wire biçiminden geri dönüştürülürken hata" + +#: ../gio/gdbusmessage.c:1705 +#, fuzzy, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Geçersiz sonluluk değeri. 0x6c ('l') veya 0x42 ('B') bekleniyordu fakat 0x" +"%02x bulundu" + +#: ../gio/gdbusmessage.c:1719 +#, fuzzy, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Geçersiz protokol baş sürümü. 1 bekleniyordu, fakat %d bulundu" + +#: ../gio/gdbusmessage.c:1776 +#, fuzzy, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "`%s' imzalı bir imza başlığı bulundu, fakat mesaj gövdesi boş" + +#: ../gio/gdbusmessage.c:1790 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "Ayrıştırılan değer `%s' geçerli bir D-Bus imzası değil (gövde için)" + +#: ../gio/gdbusmessage.c:1821 +#, fuzzy, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "Mesaj içinde imza başlığı yok, fakat mesaj %u bayt" + +#: ../gio/gdbusmessage.c:1831 +#, fuzzy +msgid "Cannot deserialize message: " +msgstr "Mesaj geri dönüştürülemiyor: " + +#: ../gio/gdbusmessage.c:2163 +#, fuzzy, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "`%s' tür dizgeli GVariant, D-Bus wire biçimine dönüştürülürken hata" + +#: ../gio/gdbusmessage.c:2303 +#, fuzzy, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "Mesaj %d fd'ye sahip, fakat başlık alanı %d fd olduğuna işaret ediyor" + +#: ../gio/gdbusmessage.c:2311 +#, fuzzy +msgid "Cannot serialize message: " +msgstr "Mesaj dönüştürülemiyor: " + +#: ../gio/gdbusmessage.c:2355 +#, fuzzy, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Mesaj gövdesi `%s' imzasına sahip, fakat imza başlığı bulunmamakta" + +#: ../gio/gdbusmessage.c:2365 +#, fuzzy, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" +"Mesaj gövdesi `%s' tür imzasına sahip, fakat başlık alanındaki imza `%s'" + +#: ../gio/gdbusmessage.c:2381 +#, fuzzy, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Mesaj gövdesi boş, fakat başlık alanındaki imza `(%s)'" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "%s türünden bir gövdeyle dönüş hatası" + +#: ../gio/gdbusmessage.c:2946 +#, fuzzy +msgid "Error return with empty body" +msgstr "Boş bir gövdeyle dönüş hatası" + +#: ../gio/gdbusprivate.c:1736 +#, fuzzy +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "Yükleme başarısız /var/lib/dbus/machine-id: " + +#: ../gio/gdbusproxy.c:1489 +#, fuzzy, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s için StartServiceByName çağrısında hata: " + +#: ../gio/gdbusproxy.c:1510 +#, fuzzy, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "StartServiceByName(\"%2$s\") yönteminden beklenmeyen yanıt %1$d" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +#, fuzzy +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Yöntem çağırılamıyor; vekil, sahibi olmayan bilindik bir ad için ve vekil " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START seçeneği ile oluşturuldu" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "Soyut ad alanı desteklenmiyor" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "Bir sunucu oluşturulurken nonce dosyası belirtilemez" + +#: ../gio/gdbusserver.c:875 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' konumundaki nonce dosyasına yazma hatası: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "`%s' dizgesi, geçerli bir D-Bus GUID değil" + +#: ../gio/gdbusserver.c:1082 +#, fuzzy, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Desteklenmeyen transport `%s' üzerinden dinlenemiyor" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "KOMUT" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Komutlar:\n" +" help Bu bilgiyi gösterir\n" +" introspect Bir uzak nesyene içgözlem yap\n" +" monitor Bir uzak nesneyi gözlemle\n" +" call Bir uzak nesne üzerinde yöntem çağır\n" +"\n" +"Her bir komut hakkında yardım almak için \"%s KOMUT --help\" kullanın.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "Hata: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "İçgözlem XML'ini ayrıştırmada hata: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Sistem veriyoluna bağlan" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Oturum veriyoluna bağlan" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Verilen D-Bus adresine bağlan" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Bağlantı Uç Noktası Seçenekleri:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Bağlantı uç noktasını belirleyen seçenekler" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Bağlantı uç noktası belirtilmedi" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Birden fazla bağlantı uç noktası belirtildi" + +#: ../gio/gdbus-tool.c:463 +#, fuzzy, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Uyarı: İçgözlem verisine göre, `%s' arayüzü bulunmuyor\n" + +#: ../gio/gdbus-tool.c:472 +#, fuzzy, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Uyarı: İçgözlem verisine göre, `%s' yöntemi `%s' arayüzü üzerinde mevcut " +"değil\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +#, fuzzy +msgid "Object path to emit signal on" +msgstr "Gözlemlenecek nesnenin yolu" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Sinyal ve arayüz adı" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Bir sinyal yayınla." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Bağlanırken hata: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Hata: Nesne yolu belirtilmedi.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Hata: %s geçerli bir nesne yolu değil\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Hata: sinyal belirtilmedi.\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Hata: %s geçerli bir arayüz adı değil\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Hata: %s geçerli bir üye adı değil\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Hata: %s geçerli bir özgün veriyolu adı değil\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "%d parametresini ayrıştırırken hata oluştu: %s\n" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Bağlantı kabul edilirken hata: %s" + +#: ../gio/gdbus-tool.c:725 +#, fuzzy +msgid "Destination name to invoke method on" +msgstr "Yöntemin üzerinde çağırılacağı hedefin ismi" + +#: ../gio/gdbus-tool.c:726 +#, fuzzy +msgid "Object path to invoke method on" +msgstr "Yöntemin üzerinde çağırılacağı nesnenin yolu" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "Yöntem ve arayüz adı" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "Saniye cinsinden zaman aşımı" + +#: ../gio/gdbus-tool.c:767 +#, fuzzy +msgid "Invoke a method on a remote object." +msgstr "Uzak nesne üzerinde bir yöntem çağır" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Hata: Hedef belirtilmedi\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Hata: Nesne yolu belirtilmedi\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Hata: Yöntem adı belirtilmedi\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Hata: Yöntem adı `%s' geçersiz\n" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "`%2$s' türünden olan %1$d parametresini ayrıştırmada hata: %3$s\n" + +#: ../gio/gdbus-tool.c:1406 +#, fuzzy +msgid "Destination name to introspect" +msgstr "İçgözlem yapılacak hedefin adı" + +#: ../gio/gdbus-tool.c:1407 +#, fuzzy +msgid "Object path to introspect" +msgstr "İçgözlem yapılacak nesnenin yolu" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "XML yazdır" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "Sadece Özellileri Yazdır" + +#: ../gio/gdbus-tool.c:1501 +#, fuzzy +msgid "Introspect a remote object." +msgstr "Uzak nesneye içgözlem yap." + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "Gözlemlenecek hedefin adı" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "Gözlemlenecek nesne yolu" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "Uzak nesneyi gözlemle." + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "İsimlendirilmemiş" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "Desktop dosyası Exec alanı belirtmemiş" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Uygulama için gerekli uçbirim bulunamadı" + +#: ../gio/gdesktopappinfo.c:1515 +#, 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:1519 +#, 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:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Kullanıcı masaüstü dosyası %s oluşturulamıyor" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "%s için özel tanım" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "sürücü start uygulamıyor" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "sürücü stop uygulamıyor" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS desteği kullanılabilir değil" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem kodlaması içerisinde bozuk sayıda token (%d)" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon kodlaması %d sürümü işlenemiyor" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon kodlaması içerisinde bozuk sayıda token (%d)" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon için bir Gemblem beklendi" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Bağlama mevcut değil içeriyor" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Dizin üzerine kopyalanamıyor" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Dizin dizin üzerine kopyalanamıyor" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Hedef dosya mevcut" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Dizin iç içe kopyalanamıyor" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Splice desteklenmiyor" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Splice ile veri taşımada hata: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Özel dosya kopyalanamıyor" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Geçersiz sembolik bağ değeri verildi" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Çöp desteklenmiyor" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Dosy adları '%c' içeremez" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "sistem bağlama uygulamıyor" + +#: ../gio/gfile.c:6117 +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:205 +msgid "Enumerator is closed" +msgstr "Enumerator kapalı" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Dosya numaralandırıcı sıradışı işleme sahip" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Dosya numaralandırıcı zaten kapalı" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "GFileIcon kodlaması %d sürümü işlenemiyor" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "GFileIcon için bozuk girdi verisi" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Akış query_info desteklemiyor" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Atlama akışta desteklenmiyor" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Sonunu kesmeye giriş akışında izin verilmiyor" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Akış üzerinde sonunun kesilmesi desteklenmiyor" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Yanlış sayıda token (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Sınıf ismi %s için tür yok" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Tür %s GIcon arayüzü uygulamıyor" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Tür %s sınıflandırılmış değil" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Bozuk sürüm numarası: %s" + +#: ../gio/gicon.c:353 +#, 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:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Simge kodlamasının verilen sürümü işlenemiyor" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Akışın sıradışı işlemi var" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Soket adresi için yeterli alan yok" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Desteklenmeyen soket adresi" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "boş adlara izin verilmiyor" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "geçersiz ad '%s': adlar küçük harf ile başlamalıdır" + +#: ../gio/glib-compile-schemas.c:763 +#, fuzzy, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" +"geçersiz ad '%s': geçersiz karakter '%c'; sadece küçük harfler, sayılar ve " +"tire ('-') işareti kullanılabilir" + +#: ../gio/glib-compile-schemas.c:772 +#, fuzzy, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "geçersiz ad '%s': birbirini izleyen iki tire ('--') kullanılamaz" + +#: ../gio/glib-compile-schemas.c:781 +#, fuzzy, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "geçersiz ad '%s': son karakter tire ('-') olamaz." + +#: ../gio/glib-compile-schemas.c:789 +#, fuzzy, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "geçersiz ad '%s': olabilecek en fazla uzunluk 32" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr " zaten belirtilmiş" + +#: ../gio/glib-compile-schemas.c:884 +#, fuzzy +msgid "can not add keys to a 'list-of' schema" +msgstr "'list-of' şemasına anahtarlar eklenemiyor" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " zaten belirtilmiş" + +#: ../gio/glib-compile-schemas.c:913 +#, fuzzy, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +", içindeki 'i gölgeliyor; " +" kullanın" + +#: ../gio/glib-compile-schemas.c:924 +#, fuzzy, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"'e öznitelik olarak, 'type', 'enum', ya da 'flags' özniteliklerinden " +"tam olarak bir tanesi belirtilmeli" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> (henüz) tanımlanmamış." + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "geçersiz GVariant tür dizgesi '%s'" + +#: ../gio/glib-compile-schemas.c:988 +#, fuzzy +msgid " given but schema isn't extending anything" +msgstr " verildi, fakat şema hiçbir şeyi genişletmedi" + +#: ../gio/glib-compile-schemas.c:1001 +#, fuzzy, c-format +msgid "no to override" +msgstr "üzerine yazılacak hiç yok" + +#: ../gio/glib-compile-schemas.c:1009 +#, fuzzy, c-format +msgid " already specified" +msgstr " zaten belirtildi" + +#: ../gio/glib-compile-schemas.c:1080 +#, fuzzy, c-format +msgid " already specified" +msgstr " zaten belirtildi" + +#: ../gio/glib-compile-schemas.c:1092 +#, fuzzy, c-format +msgid " extends not yet existing schema '%s'" +msgstr ", henüz mevcut olmayan '%s' şemasını genişletiyor" + +#: ../gio/glib-compile-schemas.c:1108 +#, fuzzy, c-format +msgid " is list of not yet existing schema '%s'" +msgstr ", henüz mevcut olmayan '%s' şemasının bir listesi" + +#: ../gio/glib-compile-schemas.c:1116 +#, fuzzy, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Yolu olan bir şemanın bir listesi olamaz" + +#: ../gio/glib-compile-schemas.c:1126 +#, fuzzy, c-format +msgid "Can not extend a schema with a path" +msgstr "Yolu olan bir şemayı genişletemez" + +#: ../gio/glib-compile-schemas.c:1136 +#, fuzzy, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +", bir liste olmayan 'i genişleten bir liste" + +#: ../gio/glib-compile-schemas.c:1146 +#, fuzzy, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +", 'i genişletiyor " +"fakat '%s', '%s' 'i genişletmiyor" + +#: ../gio/glib-compile-schemas.c:1163 +#, fuzzy, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "eğer verilmişse, bir yol, mutlaka bir taksim '/' ile başlayıp bitmeli" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "bir listenin yolu mutlaka ':/' ile bitmeli" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> zaten belirtilmiş" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "<%2$s> içinde <%1$s> öğesine izin verilmiyor" + +#: ../gio/glib-compile-schemas.c:1420 +#, fuzzy, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "<%s> öğesinin üst seviyede bulunmasına izin verilmiyor" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> içinde metin bulunamaz" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict belirtildi; çıkılıyor.\n" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Bu dosyanın tamamı gözardı edildi.\n" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Bu dosya gözardı ediliyor.\n" + +#: ../gio/glib-compile-schemas.c:1803 +#, fuzzy, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"`%3$s' üzerine yazma dosyasında belirtilen `%2$s' şemasında `%1$s'anahtarı " +"yok." + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, fuzzy, c-format +msgid "; ignoring override for this key.\n" +msgstr "; bu anahtar için üzerine yazma gözardı ediliyor.\n" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ve --strict belirtilmiş; çıkılıyor.\n" + +#: ../gio/glib-compile-schemas.c:1829 +#, fuzzy, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"`%3$s' üzerine yazma dosyasında belirtilen `%2$s' şemasındaki `%1$s' " +"anahtarını ayrıştırmada hata: %4$s. " + +#: ../gio/glib-compile-schemas.c:1839 +#, fuzzy, c-format +msgid "Ignoring override for this key.\n" +msgstr "Bu anahtar için üzerine yazma gözardı ediliyor.\n" + +#: ../gio/glib-compile-schemas.c:1857 +#, fuzzy, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" +"`%3$s' üzerine yazma dosyasındaki `%2$s' şemasının `%1$s' anahtarının " +"üzerine yazma, şemada verilen aralığın dışında" + +#: ../gio/glib-compile-schemas.c:1885 +#, fuzzy, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"`%3$s' üzerine yazma dosyasındaki `%2$s' şemasının `%1$s' anahtarının " +"üzerine yazma, geçerli seçenekler listesinde değil" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled dosyasının saklanacağı yer" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "DİZİN" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "Şemalardaki herhangi bir hatada iptal et" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled dosyasını yazma" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "Bu şeçenek yakında kaldırılacak." + +#: ../gio/glib-compile-schemas.c:1943 +#, fuzzy +msgid "Do not enforce key name restrictions" +msgstr "Anahtar adı kısıtlamalarına zorlama" + +#: ../gio/glib-compile-schemas.c:1973 +#, fuzzy +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Tüm GSettings şema dosyalarını bir şema önbelleği içerisine derle.\n" +"Şema dosyalarının .gschema.xml uzantısına sahip olmaları gerekir,\n" +"ve önbellek dosyası gschemas.compiled olarak anılır." + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Tam olarak bir adet dizin adı vermelisiniz\n" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "Hiç şema dosyası bulunamadı: " + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "hiçbir şey yapılmıyor.\n" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "varolan çıktı dosyası silindi.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Öntanımlı yerel dizin izleme tipi bulunamadı" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Geçersiz dosya adı %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Dosya sistemi bilgisi alınırken hata: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Kök dizini yeniden adlandırılamıyor" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Dosya yeniden adlandırılırken hata: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Dosya yeniden adlandırılamıyor, dosya ismi zaten mevcut" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Geçersiz dosya adı" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Dosya açılırken hata: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Dizin açılamıyor" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Dosya silinirken hata: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Dosya çöpe atılırken hata: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Çöp dizini %s oluşturulamıyor: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Çöp için en üst seviye dizin bulunamıyor" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "Çöp dizini bulunamıyor ya da oluşturulamıyor" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Çöp bilgi dosyası oluşturulamıyor: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Dosya çöpe atılamıyor: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Dizin oluşturulurken hata: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Dosya sistemi sembolik bağları desteklemiyor" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Sembolik bağ yaparken hata: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Dosya taşınırken hata: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Dizin dizin üzerine taşınamıyor" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Yedek dosyası oluşturma başarısız oldu" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Hedef dosya silerken hata: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Bağlı sistemler arasında taşıma desteklenmiyor" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Öznitelik değeri NULL olmamalı" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "Geçersiz öznitelik türü (dizgi beklendi)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Geçersiz genişletilmiş öznitelik ismi" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Genişletilmiş öznitelik '%s' atanırken hata: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' dosyası durumlandırılırken hata: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (geçersiz kodlama)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Dosya tanımlayıcı durumlandırılırken hata: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Geçersiz öznitelik türü (uint32 beklendi)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Geçersiz öznitelik türü (uint64 beklendi)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Geçersiz öznitelik türü (byte dizisi beklendi)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Sembolik bağlar uzerindeki yetkiler ayarlanamıyor" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "İzinler atanırken hata: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Sahip atanırken hata: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "sembolik bağ NULL olmamalı" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Sembolik bağ atanırken hata: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "Sembolik bağ atanırken hata: dosya bir sembolik bağ değil" + +#: ../gio/glocalfileinfo.c:2139 +#, 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:2162 +msgid "SELinux context must be non-NULL" +msgstr "SELinux bağlamı NULL olmamalı" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux bağlamı atanırken hata: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux bu sistede etkin değil" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Öznitelik %s ataması desteklenmiyor" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Dosyadan okunurken hata: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Dosya içinde atlama yapılırken hata: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Dosya kapatılırken hata: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Öntanımlı yerel dosya izleme türü bulunamadı" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Dosyaya yazılırken hata: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Eski yedek bağı silinirken hata: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Yedek kopyası oluşturulurken hata: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Geçici dosya yeniden adlandırılırken hata: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Dosyanın sonu kesilirken hata: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' dosyası açılırken hata: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Hedef dosya bir dizin" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Hedef dosya normal dosya değil" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Dosya harici olarak değiştirilmiş" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Eski dosya silinirken hata: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Geçersiz GSeekType sağlandı" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Geçersiz atlama isteği" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream sonu silinemiyor" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Hafıza çıktı akışı yeniden boyutlandırılamaz" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Hafız çıktı açışı yeniden boyutlandırma başarısız oldu" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Yazma işlemi için gereken bellek miktarı, kullanılabilir adres uzayından " +"daha büyük" + +#: ../gio/gmemoryoutputstream.c:756 +#, fuzzy +msgid "Requested seek before the beginning of the stream" +msgstr "Akışın başından öncesine denk düşen bir atlama istendi" + +#: ../gio/gmemoryoutputstream.c:765 +#, fuzzy +msgid "Requested seek beyond the end of the stream" +msgstr "Akışın sonundan da ötesine denk düşen bir atlama istendi" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement unmount. +#: ../gio/gmount.c:363 +#, fuzzy +msgid "mount doesn't implement \"unmount\"" +msgstr "mount nesnesi için \"unmount\" gerçeklenmemiş" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +#, fuzzy +msgid "mount doesn't implement \"eject\"" +msgstr "mount nesnesi için \"eject\" gerçeklenmemiş" + +#. 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 nesnesi için \"unmount\" veya \"unmount_with_operation\" gerçeklenmemiş" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement any of eject or eject_with_operation. +#: ../gio/gmount.c:611 +#, fuzzy +msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" +msgstr "" +"mount nesnesi için \"eject\" veya \"eject_with_operation\" gerçeklenmemiş" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement remount. +#: ../gio/gmount.c:701 +#, fuzzy +msgid "mount doesn't implement \"remount\"" +msgstr "mount nesnesi için \"remount\" gerçeklenmemiş" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement content type guessing. +#: ../gio/gmount.c:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "mount senkron içerik türü tahminini uygulamıyor" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Makine ismi '%s' içeriyor '[' var ama ']' yok" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "Çıktı akışı write uygulamıyor" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Kaynak akışı zaten kapalı" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' çözülürken hata: %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' tersine çözülürken hata: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "'%s' için servis kaydı yok" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Geçici olarak '%s' çözülemiyor" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "'%s' çözerken hata" + +#: ../gio/gsettings-tool.c:60 +#, fuzzy, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "'%s' şeması yeniden konumlandırılamaz (yol belirtilmemeli)\n" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "'%s' gibi bir şema yok\n" + +#: ../gio/gsettings-tool.c:77 +#, fuzzy, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "'%s' şeması konumlandırılabilir (yol mutlaka belirtilmeli)\n" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "Boş bir yol girildi.\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Yol, mutlaka taksim (/) ile başlamalıdır\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Yol, mutlaka bir taksim (/) ile bitmelidir\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Yol, ardışık olan iki taksim (//) içeremez\n" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "'%s' gibi bir anahtar yok\n" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Sağlanan değer, geçerli aralığın dışında\n" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "Yardımı yazdır" + +#: ../gio/gsettings-tool.c:539 +#, fuzzy +msgid "List the installed (non-relocatable) schemas" +msgstr "Yükli (yeniden konumlandırılamaz) şemaları listele" + +#: ../gio/gsettings-tool.c:545 +#, fuzzy +msgid "List the installed relocatable schemas" +msgstr "Yeniden konumlandırılabilir şemaları listele" + +#: ../gio/gsettings-tool.c:551 +#, fuzzy +msgid "List the keys in SCHEMA" +msgstr "ŞEMA içindeki anahtarları listele" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +#, fuzzy +msgid "SCHEMA[:PATH]" +msgstr "ŞEMA[:YOL]" + +#: ../gio/gsettings-tool.c:557 +#, fuzzy +msgid "List the children of SCHEMA" +msgstr "ŞEMA altlarını listele" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +#, fuzzy +msgid "[SCHEMA[:PATH]]" +msgstr "ŞEMA[:YOL]" + +#: ../gio/gsettings-tool.c:570 +#, fuzzy +msgid "Get the value of KEY" +msgstr "ANAHTAR'ın değerini al" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +#, fuzzy +msgid "SCHEMA[:PATH] KEY" +msgstr "ŞEMA[:YOL] ANAHTAR" + +#: ../gio/gsettings-tool.c:576 +#, fuzzy +msgid "Query the range of valid values for KEY" +msgstr "ANAHTAR için geçerli değerler aralığını sorgula" + +#: ../gio/gsettings-tool.c:582 +#, fuzzy +msgid "Set the value of KEY to VALUE" +msgstr "ANAHTAR'ın değerini DEĞER'e ata" + +#: ../gio/gsettings-tool.c:583 +#, fuzzy +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "ŞEMA[:YOL] ANAHTAR DEĞER" + +#: ../gio/gsettings-tool.c:588 +#, fuzzy +msgid "Reset KEY to its default value" +msgstr "ANAHTAR'ı varsayılan değerine döndür" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +#, fuzzy +msgid "Check if KEY is writable" +msgstr "ANAHTAR'ın yazılabilir olup olmadığını kontrol et" + +#: ../gio/gsettings-tool.c:606 +#, fuzzy +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Bir ANAHTAR'daki değişiklikleri gözlemle\n" +"Eğer hiçbir ANAHTAR belirtilmemişse, ŞEMA'daki tüm anahtarları gözlemle.\n" +"Gözlemlemeyi durdurmak için ^C kullanın.\n" + +#: ../gio/gsettings-tool.c:609 +#, fuzzy +msgid "SCHEMA[:PATH] [KEY]" +msgstr "ŞEMA[:YOL] [ANAHTAR]" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Bilinmeyen komut %s\n" +"\n" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Kullanımı:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "Argümanlar:\n" + +#: ../gio/gsettings-tool.c:652 +#, fuzzy +msgid " COMMAND The (optional) command to explain\n" +msgstr " KOMUT Açıklanacak (isteğe bağlı) komut\n" + +#: ../gio/gsettings-tool.c:656 +#, fuzzy +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" ŞEMA Şemanın adı\n" +" YOL Yol, yeniden konumlandırılabilir şemalar için\n" + +#: ../gio/gsettings-tool.c:661 +#, fuzzy +msgid " KEY The (optional) key within the schema\n" +msgstr " ANAHTAR Şema içinde (isteğe bağlı) anahtar\n" + +#: ../gio/gsettings-tool.c:665 +#, fuzzy +msgid " KEY The key within the schema\n" +msgstr " ANAHTAR Şema içindeki anahtar\n" + +#: ../gio/gsettings-tool.c:669 +#, fuzzy +msgid " VALUE The value to set\n" +msgstr " DEĞER Atanacak değer\n" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "Boş şema adı verildi\n" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Geçersiz soket, başlatılmamış" + +#: ../gio/gsocket.c:282 +#, 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:290 +msgid "Socket is already closed" +msgstr "Soket zaten kapalı" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +#, fuzzy +msgid "Socket I/O timed out" +msgstr "Soket Girdi/Çıktı zaman aşımı" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "fd'den GSocket oluşturuluyor: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Soket oluşturulamadı: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "Bilinmeyen protokol belirtildi" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "yerel adres alınamadı: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "uzaktaki adres alınamadı: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "dinlenemedi: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Adrese bağlarken hata: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Bağlantı kabul edilirken hata: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Bağlarken hata:" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "Bağlantı devam ediyor" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Bağlarken hata: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Bekleyen hata alınamıyor: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Veri alırken hata: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Veri gönderirken hata: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Soket oluşturulamadı: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Soket kapatılırken hata: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Soket durumu bekleniyor: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Mesaj gönderme hatası: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage windows'ta desteklenmiyor" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Mesaj alma hatası: %s" + +#: ../gio/gsocket.c:3598 +#, fuzzy +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "bu işletim sistemi için g_socket_get_credentials gerçeklenmedi" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "Bağlanırken bilinmeyen bir hata" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +#, fuzzy +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "TCP olmayan bağlantılar üzerinden vekillik desteklenmiyor." + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "'%s' vekil protokolü desteklenmiyor." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Dinleyici zaten kapalı" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Eklenen soket kapalı" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4, IPv6 adresi '%s'i desteklemiyor" + +#: ../gio/gsocks4aproxy.c:139 +#, fuzzy, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "SOCKSv4 gerçeklemesi, kullanıcı adını %i karakterle sınırlandırıyor" + +#: ../gio/gsocks4aproxy.c:157 +#, fuzzy, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "SOCKSv4 gerçeklemesi, makine adını %i karakterle sınırlandırıyor" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Bu sunucu bir SOCKSv4 vekil sunucusu değil." + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 sunucusu ile bağlantı, reddedildi" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Sunucu, bir SOCKSv5 vekil sunucusu değil." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 vekil sunucusu kimlik doğrulaması gerektiriyor." + +#: ../gio/gsocks5proxy.c:179 +#, fuzzy +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"SOCKSv5 vekil sunucusu, Glib tarafından desteklenmeyen bir kimlik doğrulama " +"yöntemini gereksiniyor." + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" +"Kullanıcı adı veya parola SOCKSv5 iletişim kuralı için çok uzun (azami %i)." + +#: ../gio/gsocks5proxy.c:239 +#, fuzzy +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" +"Yanlış kullanıcı adı veya paroladan dolayı SOCKSv5 kimlik doğrulatma " +"başarısız oldu." + +#: ../gio/gsocks5proxy.c:289 +#, fuzzy, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "'%s' makine adı SOCKSv5 protokolü için çok uzun (azami %i bayt)" + +#: ../gio/gsocks5proxy.c:352 +#, fuzzy +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 vekil sunucusu, bilinmeyen bir adres türü kullanıyor." + +#: ../gio/gsocks5proxy.c:359 +#, fuzzy +msgid "Internal SOCKSv5 proxy server error." +msgstr "İçsel SOCKSv5 vekil sunucu hatası." + +#: ../gio/gsocks5proxy.c:365 +#, fuzzy +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Kural kümesi tarafından, SOCKSv5 bağlantısına izin verilmiyor." + +#: ../gio/gsocks5proxy.c:372 +#, fuzzy +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 sunucusu ile makineye erişim sağlanamıyor." + +#: ../gio/gsocks5proxy.c:378 +#, fuzzy +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 vekili ile ağa erişilemiyor" + +#: ../gio/gsocks5proxy.c:384 +#, fuzzy +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 ile bağlantı reddedildi." + +#: ../gio/gsocks5proxy.c:390 +#, fuzzy +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 vekili, 'connect' komutunu desteklemiyor." + +#: ../gio/gsocks5proxy.c:396 +#, fuzzy +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Sağlanan adres türü SOCKSv5 vekili tarafından desteklenmiyor." + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Bilinmeyen SOCKSv5 vekil hatası." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon kodlaması %d sürümü işlenemiyor" + +#: ../gio/gtlscertificate.c:226 +#, fuzzy +msgid "No PEM-encoded private key found" +msgstr "PEM-kodlamalı sertifika bulunamadı" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM-kodlamalı özel anahtar ayrıştırılamadı" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "PEM-kodlamalı sertifika bulunamadı" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM-kodlamalı sertifika ayrıştırılamadı" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "1 kontrol mesajı bekleniyor, %d alındı" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Yardımcı veri'nin beklenmeyen türü" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Bir fd bekleniyordu, ancak %d alındı\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Geçersiz fd alındı" + +#: ../gio/gunixconnection.c:371 +msgid "Error sending credentials: " +msgstr "Kimlik bilgileri gönderilirken hata oluştu: " + +#: ../gio/gunixconnection.c:452 +#, fuzzy, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Soket için SO_PASSCRED'in etkin olup olmadığını kontrol hatası: %s" + +#: ../gio/gunixconnection.c:461 +#, fuzzy, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"SO_PASSCRED'in soket için etkin olup olmadığı kontrol edilirken beklenmeyen " +"seçenek uzunluğu. %d bayt bekleniyordu, fakat %d bayt bulundu." + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED etkinleştirmede hata: %s" + +#: ../gio/gunixconnection.c:509 +#, fuzzy +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Kimlik bilgileri almak için bir bayt okunması bekleniyordu, sıfır bayt okundu" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "1 kontrol mesajı bekleniyor, %d alındı" + +#: ../gio/gunixconnection.c:571 +#, fuzzy, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED devre dışı bırakılırken hata: %s" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Unix'den okurken hata: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Unix kapatılırken hata: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Dosya sistemi kök dizini" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Unix'e yazılırken hata: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Soyut unix soket adresleri bu sistemde desteklenmiyor" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "sistem, eject ya da eject_with_operation uygulamıyor" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Uygulama bulunamıyor" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Uygulama başlatılırken hata: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI'ler desteklenmiyor" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "eşleştirme değişimleri win32 üzerinde desteklenmiyor" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Eşleştirme oluşturulması win32 üzerinde desteklenmiyor" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Tutamaçtan okumada hata: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Tutamacı kapatmada hata: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Tutamaca yazmada hata: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Yeterli bellek yok" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "İç hata: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Daha fazla girdi gerekli" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Geçersiz sıkıştırılmış veri" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "öö" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "ös" + +#, fuzzy +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Dönüş değerinin türü yanlış, `%s' mevcut, fakat `%s' bekleniyordu" + +#, fuzzy +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "%2$s türünden %1$s özelliği ayarlanmaya çalışılıyor, fakat beklenen " +#~ "arayüze göre tür %3$s" + +#, fuzzy +#~| msgid "failed to get memory" +#~ msgid "Failed to set value\n" +#~ msgstr "ANAHTAR'ın değerini DEĞER'e ata" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Dizin dizin üzerine taşınamıyor" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "Tür %s sınıflandırılmış değil" + +#, 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.po b/po/tt.po new file mode 100644 index 0000000..4a72d4c --- /dev/null +++ b/po/tt.po @@ -0,0 +1,3751 @@ +# Tatarish translation +# Albert Fazlí , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: libgnome\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-11-09 13:19+0300\n" +"Last-Translator: Albert Fazlí \n" +"Language-Team: Tatarish \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "'%s' biremennän uqıp bulmadı: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "'%s' -› '%s' äyländergeçen açıp bulmadı" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" + +#: ../glib/gconvert.c:1896 +#, 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:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "'%s' digän URI yaraqsız" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "'%s' digän URI'nıñ host adı yaraqsız" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "'%s' digän yul töptän tügel" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Host adı yaraqsız" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %d %b %Y %T" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "Января" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "Февраля" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "Марта" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "Апреля" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "Мая" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "Июня" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "Июля" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Янв" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Фев" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Мар" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Апр" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Май" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Июн" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Июл" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Дышәмбе" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Сишәмбе" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Чәршәәмбе" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Пәнҗешмбе" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Җомга" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Шимбә" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Якшәмбе" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Дыш" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Сиш" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Чәрш" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Пәнҗ" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Җом" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Шим" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Якш" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "'%s' biremennän uqıp bulmadı: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "'%s' biremen açıp bulmadı: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "'%s' biremen açıp bulmadı: fdopen() uzmadı: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "'%s' biremen yazıp bulmadı: fwrite() uzmadı: %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "'%s' biremen yabıp bulmadı: fclose() uzmadı: %s" + +#: ../glib/gfileutils.c:1152 +#, 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:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "'%s' ürçetmäneñ azağında XXXXXX tügel" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "'%s' biremen açıp bulmadı: open() uzmadı: %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "%d. yulnıñ %d. bilgedä xata: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "%d. yulda xata: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +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:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%d. yulnıñ %d. bilgedä xata: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Tirä-yaqta yaraqsız yazma bar: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Eş törgäge yaraqsız: %s" + +#: ../glib/gspawn-win32.c:783 +#, 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:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "UTF-8 çigennän çıqqan bilge" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "UTF-16 çigennän çıqqan bilge" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Totılu:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[KÖYLÄMÄ...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Yärdäm Köylämäse:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Yärdäm köylämäsen kürsätü" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Yärdäm köylämäsen kürsätü" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Yazılım Köylämäläre:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, 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:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, 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:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "%s öçen köylämä birelmäde" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Bilgesez %s atlı köylämä" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Ğädäti birem tügel" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Birem buş ikän" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Açqıç bireme törkem belän başlanmí" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Açqıç biremendä '%s' digän totılmağan bilgelämä" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Açqıç biremendä '%s' törkeme yuq" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Açqıç biremendä '%s' açqıçı yuq" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, 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:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, 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:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "'%s' digän tulısan bäyäse çiktän çıqtı" + +#: ../glib/gkeyfile.c:3919 +#, 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:3943 +#, 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:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Bilgesez %s atlı köylämä" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "%d. yulda xata: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Yazılım adı yaraqsız: %s" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Host adı yaraqsız" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "'%s' törgägen açıp bulmadı: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "%d. yulda xata: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Ğädäti birem tügel" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Yazılım adı yaraqsız: %s" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Bilgesez %s atlı köylämä" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Birem ısulın üzgärtep bulmadı: waitpid() uzmadı: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "'%s' biremen yasap bulmadı: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "'%s' -› '%s' digän bilge äyländerü totılmí" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "%d. yulda xata: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Äyländergändä xata çıqtı: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "'%s' biremen uqığanda xata: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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/ug.po b/po/ug.po new file mode 100644 index 0000000..334646b --- /dev/null +++ b/po/ug.po @@ -0,0 +1,4294 @@ +# Uyghur translation for glib. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Gheyret Kenji,2010. +# Sahran , 2010. +# Zeper , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2013-01-18 21:59+0000\n" +"PO-Revision-Date: 2011-08-09 10:42+0600\n" +"Last-Translator: Sahran \n" +"Language-Team: Uyghur Computer Science Association \n" +"Language: \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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:506 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:377 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:833 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:732 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "%s ئۇزاتقان ساناق سان قىممەت بەك چوڭ" + +#: ../gio/gbufferedinputstream.c:899 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +#| msgid "Seek not supported on stream" +msgid "Seek not supported on base stream" +msgstr "ئاساسىي ‫ئېقىم يۆتكىلىش(Seek) نى قوللىمايدۇ" + +#: ../gio/gbufferedinputstream.c:945 +#| msgid "Cannot truncate GMemoryInputStream" +msgid "Cannot truncate GBufferedInputStream" +msgstr "ئېقىم GBufferedInputStream نى قىسقارتقىلى بولمىدى" + +#: ../gio/gbufferedinputstream.c:990 ../gio/ginputstream.c:1023 +#: ../gio/giostream.c:291 ../gio/goutputstream.c:1340 +msgid "Stream is already closed" +msgstr "‫ئېقىم ئاللىقاچان تاقالغان" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +#| msgid "Truncate not supported on stream" +msgid "Truncate not supported on base stream" +msgstr "ئاساسىي ‫ئېقىم قىسقارتىش(Truncate) نى قوللىمايدۇ" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1420 +#: ../gio/glocalfile.c:2169 ../gio/gsimpleasyncresult.c:843 +#: ../gio/gsimpleasyncresult.c:869 +#, c-format +msgid "Operation was cancelled" +msgstr "مەشغۇلات بىكار قىلىندى" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "ئىناۋەتسىز نەڭ. دەسلەپلەشتۈرۈلمىگەن" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "كىرگۈزۈشتە تاماملانمىغان كۆپ بايتلىق ھەرپ قاتارى بار" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "نىشاندا يېتەرلىك بوشلۇق يوق" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1264 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1586 ../glib/giochannel.c:1628 +#: ../glib/giochannel.c:2472 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "ئايلاندۇرۇپ كىرگۈزۈشتە ئىناۋەتسىز بايت قاتارى كۆرۈلدى" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1593 ../glib/giochannel.c:2484 +#, c-format +msgid "Error during conversion: %s" +msgstr "ئايلاندۇرۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:975 +msgid "Cancellable initialization not supported" +msgstr "فورماتلاشنى ئىناۋەتسىز قىلىشقا بولمايدۇ" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1414 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "ھەرپ بەلگە توپلىمى ‹%s› دىن ‹%s› غا ئايلاندۇرۇشنى قوللىمايدۇ" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "‹%s› دىن ‹%s› غا ئايلاندۇرغۇچنى ئاچالمايدۇ" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s تىپ" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "نامەلۇم تىپ" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s ھۆججەت تىپى" + +#: ../gio/gcredentials.c:264 ../gio/gcredentials.c:528 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials نى بۇ مەشغۇلات سىستېمىسىدا ئىشلەتكىلى بولمايدۇ" + +#: ../gio/gcredentials.c:438 +msgid "There is no GCredentials support for your platform" +msgstr "سىستېمىڭىز GCredentials نى قوللىمايدۇ" + +#: ../gio/gcredentials.c:480 +#| msgid "GCredentials is not implemented on this OS" +msgid "GCredentials does not contain a process ID on this OS" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "ئويلىشىلمىغان بالدۇرلا ئاخىرلاشقان ئېقىم بەلگىسى" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "«%2$s» ئادرېس تۈرىدىكى قوللىمايدىغان كۇنۇپكا «%1$s»" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "`%s' ئادرېس ئىناۋەتسىز (بەلگىلەش زۆرۈر بولغان بىر يول، ۋاقىتلىق مۇندەرىجە ياكى ئابستراكت كۇنۇپكا)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "ئادرېس تۈرى `%s' دىكى مەنىسى يوق كۇنۇپكا قىممەت جۈپىنىڭ بىرىكمىسى" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "`%s' ئادرېستا خاتالىق بار - ئېغىز خاسلىق فورماتىدا خاتالىق بار" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "`%s' ئادرېستا خاتالىق بار - ئائىلە (family) خاسلىق فورماتىدا خاتالىق بار" + +#: ../gio/gdbusaddress.c:454 +#, c-format +#| msgid "Address element `%s', does not contain a colon (:)" +msgid "Address element `%s' does not contain a colon (:)" +msgstr "ئادرېس ئېلېمېنتى `%s' قوش چېكىت (:) نى ئۆز ئىچىگە ئالمايدۇ" + +#: ../gio/gdbusaddress.c:475 +#, c-format +#| msgid "" +#| "Key/Value pair %d, `%s', in address element `%s', does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "ئادرېس ئېلېمېنتى «%3$s» دىكى %1$d - كۇنۇپكا/قىممەت جۈپى «%2$s»، تەڭلىك بەلگىسىنى ئۆز ئىچىگە ئالمايدۇ" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "كۇنۇپكا/قىممەت جۈپى %d، `%s'ئادرېس ئېلېمېنتى `%s' دىن مەنە ئۆزگەرتىشتە خاتالىق كۆرۈلدى" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "`%s' ئادرېستا خاتالىق بار - unix يوللاشتا `path' ياكى `abstract' دىن بىرىنىڭ كۇنۇپكىسى تەڭشىلىشى لازىم." + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "`%s' ئادرېستا خاتالىق بار - ماشىنا خاسلىقى يوقالغان ياكى فورماتىدا خاتالىق بار" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "`%s' ئادرېستا خاتالىق بار - ئېغىز خاسلىقى يوقالغان ياكى فورماتىدا خاتالىق بار" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "`%s' ئادرېستا خاتالىق بار - noncefile خاسلىقى يوقالغان ياكى فورماتىدا خاتالىق بار" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "ئاپتوماتىك ئىجرا قىلىشتا خاتالىق كۆرۈلدى: " + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "«%2$s» ئادرېسقا نىسبەتەن نامەلۇم ياكى قوللىمايدىغان يوللاش «%1$s»" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "ۋاقتىنچە ھۆججەت `%s' نى ئاچقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "ۋاقتىنچە ھۆججەت `%s' نى ئوقۇغاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "ۋاقتىنچە ھۆججەت `%s' نى ئوقۇغاندا خاتالىق كۆرۈلدى، 16 بايتلىقنى ئويلىغان، %d غا ئېرىشتى" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "ۋاقتىنچە ھۆججەت `%s' نىڭ مەزمۇنىنى ئېقىمغا يازغاندا خاتالىق كۆرۈلدى:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "بېرىلگەن ئادرېس بوش" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +#| msgid "Cannot spawn a message bus without a machine-id: " +msgid "Cannot spawn a message bus when setuid" +msgstr "" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "ماشىنا كىملىكى يوق ئەھۋالدا ئۇچۇر غول لىنىيىسىدىن بىرنى قوزغىتالمايدۇ: " + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "بۇيرۇق قۇرى `%s' نى قوزغاتقاندا خاتالىق كۆرۈلدى: " + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "بۇ كۆزنەكنى ئېتىش ئۈچۈن خالىغان بىر ھەرپنى بېسىڭ.\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "ئەڭگىمە غول لىنىيە ئادرېسىنى جەزملىيەلمىدى (بۇ مەشغۇلات سىستېمىسىدا تېخى ئەمەلگە ئاشۇرۇلمىغان)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "DBUS_STARTER_BUS_TYPE مۇھىت ئۆزگەرگۈچى مىقداردىن غول لىنىيە ئادرېسىنى جەزملىيەلمىدى - نامەلۇم قىممەت `%s'" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "غول لىنىيە ئادرېسىنى جەزملىيەلمىدى چۈنكى DBUS_STARTER_BUS_TYPE مۇھىت ئۆزگەرگۈچى مىقدار تەڭشەلمىگەن" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "نامەلۇم غول لىنىيە تىپى %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "بىر قۇرنى ئوقۇشنى سىنىغاندا ئويلىشىلمىغان كەم مەزمۇن" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "بىر قۇرنى (بىخەتەر) ئوقۇشنى سىنىغاندا ئويلىشىلمىغان كەم مەزمۇن" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "ئىشلەتكىلى بولىدىغان ھەممە دەلىللەش مېخانىزمىنى ئىشلىتىپ بولدى(سىنالغان قېتىم سانى: %s) (ئىشلىتىلىشچان: %s)" + +#: ../gio/gdbusauth.c:1175 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "GDBusAuthObserver::authorize-authenticated-peer ئارقىلىق بىكار قىلىندى" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "مۇندەرىجە ‹%s› نىڭ ئۇچۇرىنى ئېلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "`%s' مۇندەرىجە ھوقۇقى خاتالىقى. 0700 نى ئۈمىد قىلىدۇ ئەمما 0%o ئېرىشتى" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "مۇندەرىجە `%s' نى قۇرۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "ئاچقۇچ ھالقىسى `%s' نى ئوقۇۋاتقاندا خاتالىق كۆرۈلدى: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:719 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s دىكى ئاچقۇچ ھالقىسىنىڭ %1$d قۇرىدا فورماتقا ماس كەلمەيدىغان %3$s مەزمۇن بار" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:733 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s دىكى ئاچقۇچ ھالقىسىنىڭ %1$d قۇرىدىكى بىرىنچى بۇيرۇق تاختىسىدا فورماتقا ماس كەلمەيدىغان %3$s مەزمۇن بار" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:747 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s دىكى ئاچقۇچ ھالقىسىنىڭ %1$d قۇرىدىكى ئىككىنچى بۇيرۇق تاختىسىدا فورماتقا ماس كەلمەيدىغان %3$s مەزمۇن بار" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "`%2$s' دىكى ئاچقۇچ ھالقىسىدىن كىملىكى %1$d بولغان cookie نى تاپالمىدى" + +#: ../gio/gdbusauthmechanismsha1.c:537 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "ئۈنۈمىنى يوقاتقان قۇلۇپ ھۆججىتى `%s' نى ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:569 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "قۇلۇپ ھۆججىتى `%s' نى قۇرۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:599 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "قۇلۇپ ھۆججىتى `%s' نى يېپىۋاتقاندا (ئۇلانمىغان) خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:609 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "قۇلۇپ ھۆججەت `%s' نى ئۇلىنىشىنى بىكار قىلىشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusauthmechanismsha1.c:686 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "ئاچقۇچ ھالقىسى `%s' نى ئېچىپ يېزىۋاتقاندا خاتالىق كۆرۈلدى: " + +#: ../gio/gdbusauthmechanismsha1.c:883 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(ئۇندىن باشقا، `%s' نىڭ قۇلۇپىنى بوشىتىش مەغلۇپ بولدى: %s) " + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "باغلىنىش تاقالدى" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "مۆھلەتكە يەتتى" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "خېرىدار تەرەپ باغلىنىشى قۇرغاندا قوللىمايدىغان بەلگىگە يولۇقتى" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "%s يولدىكى نەڭدە `org.freedesktop.DBus.Properties' ئېغىزى يوق" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "`%s' خاسلىق تەڭشەشتە خاتالىق كۆرۈلدى: `%s' ئۈمىد قىلىنغان ئەمما `%s' غا ئېرىشتى" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "`%s' بۇنداق خاسلىق يوق" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "`%s' خاسلىقنى ئوقۇغىلى بولمايدۇ" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "`%s' خاسلىقنى يازغىلى بولمايدۇ" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "`%s' بۇنداق ئارايۈز يوق" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "بۇنداق ئارايۈز يوق" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "%2$s يولدىكى نەڭدە «%1$s» غا ئوخشاش ئارايۈز يوق" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "بۇنداق ئۇسۇل يوق `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "ئۇچۇر تىپى، `%s'، ئۈمىد قىلغان تىپ `%s' بىلەن ماس كەلمىدى" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s دىكى %1$s ئېغىز نەڭدىن بىرنى چىقاردى" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "`%s' ئۇسۇل `%s' تىپنى قايتۇردى ئەمما ئۈمىد قىلىنغىنى `%s'" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "%3$s ئىمزالىق ئېغىز %2$s دا %1$s ئۇسۇل مەۋجۇت ئەمەس" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "%s ئۈچۈن تارماق شاخچىدىن بىرنى چىقاردى" + +#: ../gio/gdbusmessage.c:1271 +msgid "type is INVALID" +msgstr "تىپى ئىناۋەتسىز" + +#: ../gio/gdbusmessage.c:1282 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL ئۇچۇرى: PATH ياكى MEMBER بېشى سۆز بۆلىكى كەم" + +#: ../gio/gdbusmessage.c:1293 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN ئۇچۇرى: REPLY_SERIAL بېشى سۆز بۆلىكى كەم" + +#: ../gio/gdbusmessage.c:1305 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "خاتالىق ئۇچۇرى: REPLY_SERIAL ياكى ERROR_NAME بېشى سۆز بۆلىكى كەم" + +#: ../gio/gdbusmessage.c:1318 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "سىگنال ئۇچۇرى: PATH ، INTERFACE ياكى MEMBER بېشى سۆز بۆلىكى كەم" + +#: ../gio/gdbusmessage.c:1326 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "سىگنال ئۇچۇرى: PATH بېشى سۆز بۆلىكى قالدۇرۇلغان قىممەتنى ئىشلىتىۋاتىدۇ/org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:1334 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "سىگنال ئۇچۇرى: INTERFACE بېشى سۆز بۆلىكى قالدۇرۇلغان قىممەتنى ئىشلىتىۋاتىدۇ org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:1383 +#, c-format +#| msgid "Wanted to read %lu byte but got EOF" +#| msgid_plural "Wanted to read %lu bytes but got EOF" +msgid "Wanted to read %lu bytes but only got %lu" +msgid_plural "Wanted to read %lu byte but only got %lu" +msgstr[0] "" + +#: ../gio/gdbusmessage.c:1398 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "`%s' نىڭ كەينىدىن ئۈمىد قىلىنغىنى NUL بايت ئەمما ئېرىشكىنى بايت %d" + +#: ../gio/gdbusmessage.c:1417 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "ئىناۋەتلىك UTF-8 تېكىستىنى ئۈمىد قىلغان ئەمما ھەرپ ئېغىشنىڭ %d ئورنىدا (ھەرپ تېكىستنىڭ ئۇزۇنلۇقى %d) ئىناۋەتسىز تېكىستكە يولۇقتى. بۇ نۇقتىنىڭ ئىناۋەتلىك UTF-8 تېكىستى ئەسلىدە `%s'" + +#: ../gio/gdbusmessage.c:1619 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "تەھلىل قىلغان قىممەت `%s' ئىناۋەتلىك D-Bus نەڭ يولى ئەمەس" + +#: ../gio/gdbusmessage.c:1643 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "تەھلىل قىلغان قىممەت `%s' ئىناۋەتلىك D-Bus ئىمزاسى ئەمەس" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "ئۇزۇنلۇقى %u بايت بولغان سانلار قاتارىغا يولۇقتى، ئەڭ ئۇزۇن ئۇزۇنلۇقى 2<<26 بايت (64 مېگابايت)" + +#: ../gio/gdbusmessage.c:1851 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "تەھلىل قىلغان شالغۇت خاسلىق قىممەت `%s' ئىناۋەتلىك D-Bus ئىمزاسى ئەمەس" + +#: ../gio/gdbusmessage.c:1875 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "D-Bus سىزىق فورماتىدا تىپ تېكىستى `%s' نى ئىشلىتىپ قارشى تەرتىپلەشتۈرۈشتە GVariant قىلغاندا خاتالىق كۆرۈلدى" + +#: ../gio/gdbusmessage.c:2062 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "ئىناۋەتسىز تەرتىپ قىممىتى. 0x6c ('l') ياكى 0x42 ('B') نىڭ ئورنىغا 0x%02x قىممەت بايقالدى" + +#: ../gio/gdbusmessage.c:2075 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "ئىناۋەتسىز ئاساسىي كېلىشىم نەشرى. 1 ئۈمىد قىلىنغان ئەمما %d بايقالدى" + +#: ../gio/gdbusmessage.c:2131 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "بېشىدا `%s' ئىمزاسى بار ئەمما ئۇچۇر گەۋدىسى بوش" + +#: ../gio/gdbusmessage.c:2145 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "`%s' يەشكەن قىممەت D-Bus ئىمزاسىنىڭ ئىناۋەتلىك قىممىتى ئەمەس (ئۇچۇر گەۋدىسىگە نىسبەتەن)" + +#: ../gio/gdbusmessage.c:2175 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "ئۇچۇردا ئىمزا بېشى يوق ئەمما ئۇچۇر گەۋدىسى %u بايت" + +#: ../gio/gdbusmessage.c:2185 +msgid "Cannot deserialize message: " +msgstr "ئۇچۇرنى يېشەلمىدى: " + +#: ../gio/gdbusmessage.c:2506 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "D-Bus سىزىق فورماتىدا تىپ تېكىستى `%s' نى ئىشلىتىپ GVariant تەرتىپلەشتۈرۈشتە خاتالىق كۆرۈلدى" + +#: ../gio/gdbusmessage.c:2643 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2651 +msgid "Cannot serialize message: " +msgstr "ئۇچۇرنى تەرتىپلەشتۈرەلمىدى: " + +#: ../gio/gdbusmessage.c:2695 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "ئۇچۇر گەۋدىسىدە ئىمزا `%s' بار ئەمما بېشىدا ئىمزا يوق" + +#: ../gio/gdbusmessage.c:2705 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "ئۇچۇر گەۋدىسىدە تىپ ئىمزا `%s'بار ئەمما بېشىدىكى ئىمزا `%s'" + +#: ../gio/gdbusmessage.c:2721 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "ئۇچۇر گەۋدىسى بوش ئەمما بېشىدىكى سۆز بۆلىكىدىكى ئىمزا `%s'" + +#: ../gio/gdbusmessage.c:3271 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "گەۋدە تىپى `%s' غا قايتقاندا خاتالىق كۆرۈلدى" + +#: ../gio/gdbusmessage.c:3279 +msgid "Error return with empty body" +msgstr "بوش گەۋدىگە قايتقاندا خاتالىق كۆرۈلدى" + +#: ../gio/gdbusprivate.c:2068 +#, c-format +#| msgid "Unable to trash file: %s" +msgid "Unable to get Hardware profile: %s" +msgstr "" + +#: ../gio/gdbusprivate.c:2113 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "/var/lib/dbus/machine-id ياكى /etc/machine-id نى ئوقۇغىلى بولمىدى: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "%s ئۈچۈن StartServiceByName نى چاقىرغاندا خاتالىق كۆرۈلدى: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "StartServiceByName(\"%2$s\") ئۇسۇلىدىن تاسادىپىي جاۋاب %1$d غا ئېرىشتى" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "ئۇسۇلنى چاقىرالمايدۇ؛ ۋاكالەتچى كۆپ ئۇچرايدىغان ئىگىدارى يوق ئات، ئەمما ۋاكالەتچى G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START بەلگىسىنى ئىشلىتىپ قۇرىدۇ" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "ئابستراكت ئات بوشلۇقىنى قوللىمايدۇ" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "مۇلازىمەت قۇرغاندا ۋاقتىنچە ھۆججەتنى بەلگىلىيەلمەيدۇ" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "`%s' دىكى ۋاقتىنچە ھۆججەتنى يازغاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "`%s' تېكىستى ئىناۋەتلىك D-Bus GUID ئەمەس" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "قوللىمايدىغان يوللاش `%s' نى تىڭشىيالمايدۇ" + +#: ../gio/gdbus-tool.c:92 +msgid "COMMAND" +msgstr "بۇيرۇق" + +#: ../gio/gdbus-tool.c:97 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "بۇيرۇقلار:\n" +" help مەزكۇر ئۇچۇرنى كۆرسىتىدۇ\n" +" introspect يىراقتىكى بىر نەڭ\n" +" monitor يىراقتىكى بىر نەڭنى كۆزىتىدۇ\n" +" call يىراقتىكى نەڭنىڭ بىر ئۇسۇلىنى چاقىرىدۇ\n" +" emit سىگنال تارقىتىدۇ\n" +"\n" +" \"%s COMMAND --help\" نى ئىشلىتىپ ھەر بىر بۇيرۇقنىڭ ياردىمىگە ئېرىشىدۇ.\n" + +#: ../gio/gdbus-tool.c:166 ../gio/gdbus-tool.c:222 ../gio/gdbus-tool.c:294 +#: ../gio/gdbus-tool.c:318 ../gio/gdbus-tool.c:701 ../gio/gdbus-tool.c:1020 +#: ../gio/gdbus-tool.c:1453 +#, c-format +msgid "Error: %s\n" +msgstr "خاتالىق: %s\n" + +#: ../gio/gdbus-tool.c:177 ../gio/gdbus-tool.c:235 ../gio/gdbus-tool.c:1469 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "introspection XML نى يېشىشتە خاتالىق كۆرۈلدى: %s\n" + +#: ../gio/gdbus-tool.c:352 +msgid "Connect to the system bus" +msgstr "سىستېما باش لىنىيىسىگە باغلىنىدۇ" + +#: ../gio/gdbus-tool.c:353 +msgid "Connect to the session bus" +msgstr "ئەڭگىمە باش لىنىيىسىگە باغلىنىدۇ" + +#: ../gio/gdbus-tool.c:354 +msgid "Connect to given D-Bus address" +msgstr "بېرىلگەن D-Bus ئادرېسقا باغلىنىدۇ" + +#: ../gio/gdbus-tool.c:364 +msgid "Connection Endpoint Options:" +msgstr "باغلىنىشنىڭ ئاخىرقى نۇقتا تاللانمىسى:" + +#: ../gio/gdbus-tool.c:365 +msgid "Options specifying the connection endpoint" +msgstr "باغلىنىش ئاخىرقى نۇقتىسىنىڭ تاللانمىسى بەلگىلىنىدۇ" + +#: ../gio/gdbus-tool.c:387 +#, c-format +msgid "No connection endpoint specified" +msgstr "باغلىنىش ئاخىرقى نۇقتىسى بەلگىلەنمىگەن" + +#: ../gio/gdbus-tool.c:397 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "كۆپ باغلىنىش ئاخىرقى نۇقتىسى بەلگىلەندى" + +#: ../gio/gdbus-tool.c:467 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "ئاگاھلاندۇرۇش: ئۆزىنى تەكشۈرۈش سانلىق-مەلۇماتىغا ئاساسەن `%s' ئېغىز مەۋجۇت ئەمەس\n" + +#: ../gio/gdbus-tool.c:476 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "ئاگاھلاندۇرۇش: ئۆزىنى تەكشۈرۈش سانلىق-مەلۇماتىغا ئاساسەن `%2$s' ئېغىزدا %1$s ئۇسۇل مەۋجۇت ئەمەس\n" + +#: ../gio/gdbus-tool.c:538 +msgid "Optional destination for signal (unique name)" +msgstr "سىگنالنىڭ ئىختىيارى نىشانى(ئۆزگىچە ئات)" + +#: ../gio/gdbus-tool.c:539 +msgid "Object path to emit signal on" +msgstr "سىگنال تارقىتىدىغان نەڭنىڭ يولى" + +#: ../gio/gdbus-tool.c:540 +msgid "Signal and interface name" +msgstr "سىگنال ۋە ئارايۈزنىڭ ئاتى" + +#: ../gio/gdbus-tool.c:572 +msgid "Emit a signal." +msgstr "سىگنال تارقىتىدۇ." + +#: ../gio/gdbus-tool.c:606 ../gio/gdbus-tool.c:832 ../gio/gdbus-tool.c:1559 +#: ../gio/gdbus-tool.c:1791 +#, c-format +msgid "Error connecting: %s\n" +msgstr "باغلىنىشتا خاتالىق كۆرۈلدى: %s\n" + +#: ../gio/gdbus-tool.c:618 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "خاتالىق: نەڭ يولى بەلگىلەنمىگەن.\n" + +#: ../gio/gdbus-tool.c:623 ../gio/gdbus-tool.c:893 ../gio/gdbus-tool.c:1617 +#: ../gio/gdbus-tool.c:1850 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "خاتالىق: %s ئىناۋەتلىك نەڭ يولى ئەمەس\n" + +#: ../gio/gdbus-tool.c:629 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "خاتالىق: سىگنال بەلگىلەنمىگەن.\n" + +#: ../gio/gdbus-tool.c:636 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:644 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "خاتالىق: %s ئىناۋەتلىك ئارايۈز ئاتى ئەمەس\n" + +#: ../gio/gdbus-tool.c:650 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "خاتالىق: %s ئىناۋەتلىك ئەزا ئاتى ئەمەس\n" + +#: ../gio/gdbus-tool.c:656 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "خاتالىق: %s ئىناۋەتلىك ئۆزگىچە باش لىنىيە ئاتى ئەمەس\n" + +#: ../gio/gdbus-tool.c:679 ../gio/gdbus-tool.c:992 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "پارامېتىر %d تەھلىل قىلىۋاتقاندا خاتالىق كۆرۈلدى: %s\n" + +#: ../gio/gdbus-tool.c:708 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "باغلىنىشنى ئاقتۇرۇۋاتقاندا خاتالىق كۆرۈلدى: %s\n" + +#: ../gio/gdbus-tool.c:735 +msgid "Destination name to invoke method on" +msgstr "ئۇسۇلنىڭ نىشان ئاتىنى چاقىرىدۇ" + +#: ../gio/gdbus-tool.c:736 +msgid "Object path to invoke method on" +msgstr "ئۇسۇلنىڭ نەڭ يولىنى چاقىرىدۇ" + +#: ../gio/gdbus-tool.c:737 +msgid "Method and interface name" +msgstr "ئۇسۇل ۋە ئېغىزنىڭ ئاتى" + +#: ../gio/gdbus-tool.c:738 +msgid "Timeout in seconds" +msgstr "سېكۇنتتا مۆھلەت توشىدۇ" + +#: ../gio/gdbus-tool.c:777 +msgid "Invoke a method on a remote object." +msgstr "يىراقتىكى نەڭدە ئۇسۇلدىن بىرنى چاقىرىدۇ." + +#: ../gio/gdbus-tool.c:852 ../gio/gdbus-tool.c:1578 ../gio/gdbus-tool.c:1810 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "خاتالىق: نىشان بەلگىلەنمىگەن\n" + +#: ../gio/gdbus-tool.c:873 ../gio/gdbus-tool.c:1597 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "خاتالىق: نەڭ يولى بەلگىلەنمىگەن\n" + +#: ../gio/gdbus-tool.c:908 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "خاتالىق: Method ئاتى بەلگىلەنمىگەن\n" + +#: ../gio/gdbus-tool.c:919 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "خاتالىق: ئۇسۇل ئاتى `%s' ئىناۋەتسىز\n" + +#: ../gio/gdbus-tool.c:984 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "%2$s تىپنىڭ پارامېتىرى %1$d نى تەھلىل قىلغاندا خاتالىق كۆرۈلدى: %3$s\n" + +#: ../gio/gdbus-tool.c:1416 +msgid "Destination name to introspect" +msgstr "ئۆزىنى تەكشۈرىدىغان نىشان ئات" + +#: ../gio/gdbus-tool.c:1417 +msgid "Object path to introspect" +msgstr "ئۆزىنى تەكشۈرىدىغان نەڭ يولى" + +#: ../gio/gdbus-tool.c:1418 +msgid "Print XML" +msgstr "XML باس" + +#: ../gio/gdbus-tool.c:1419 +msgid "Introspect children" +msgstr "ئۆزىنى تەكشۈرىدىغان بالا" + +#: ../gio/gdbus-tool.c:1420 +msgid "Only print properties" +msgstr "بېسىش خاسلىقلىرىلا" + +#: ../gio/gdbus-tool.c:1511 +msgid "Introspect a remote object." +msgstr "ئۆزىنى تەكشۈرىدىغان يىراقتىكى نەڭ." + +#: ../gio/gdbus-tool.c:1709 +msgid "Destination name to monitor" +msgstr "كۆزىتىدىغان نىشاننىڭ ئاتى" + +#: ../gio/gdbus-tool.c:1710 +msgid "Object path to monitor" +msgstr "كۆزىتىدىغان نەڭنىڭ يولى" + +#: ../gio/gdbus-tool.c:1743 +msgid "Monitor a remote object." +msgstr "يىراقتىكى نەڭنى كۆزىتىدۇ." + +#: ../gio/gdesktopappinfo.c:591 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "ئاتسىز" + +#: ../gio/gdesktopappinfo.c:1004 +msgid "Desktop file didn't specify Exec field" +msgstr "ئۈستەلئۈستى ھۆججىتى Exec سۆز بۆلىكىنى بەلگىلىمىگەن" + +#: ../gio/gdesktopappinfo.c:1292 +msgid "Unable to find terminal required for application" +msgstr "قوللىنىشچان پروگرامما ئېھتىياجلىق تېرمىنالنى تاپالمايدۇ" + +#: ../gio/gdesktopappinfo.c:1594 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "ئىشلەتكۈچى قوللىنىشچان پروگرامما قىسقۇچى %s نى قۇرالمايدۇ: %s" + +#: ../gio/gdesktopappinfo.c:1598 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "ئىشلەتكۈچى MIME سەپلىمە قىسقۇچى %s نى قۇرالمايدۇ: %s" + +#: ../gio/gdesktopappinfo.c:1838 ../gio/gdesktopappinfo.c:1862 +msgid "Application information lacks an identifier" +msgstr "پروگرامما ئۇچۇرىدا كىملىك يوق" + +#: ../gio/gdesktopappinfo.c:2094 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "ئىشلەتكۈچى ئۈستەلئۈستى ھۆججەت %s نى قۇرالمايدۇ" + +#: ../gio/gdesktopappinfo.c:2217 +#, c-format +msgid "Custom definition for %s" +msgstr "%s ئۈچۈن ئۆزلەشتۈرۈلگەن بەلگىلەش" + +#: ../gio/gdrive.c:394 +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:472 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "قوزغاتقۇچ eject ياكى eject_with_operation نى ئىشقا ئاشۇرالمىدى" + +#: ../gio/gdrive.c:548 +msgid "drive doesn't implement polling for media" +msgstr "قوزغاتقۇچ ۋاسىتە نۆۋەتلەشتۈرۈشنى ئىشقا ئاشۇرالمىدى" + +#: ../gio/gdrive.c:753 +msgid "drive doesn't implement start" +msgstr "قوزغاتقۇچ start نى ئىشقا ئاشۇرالمىدى" + +#: ../gio/gdrive.c:855 +msgid "drive doesn't implement stop" +msgstr "قوزغاتقۇچ stop نى ئىشقا ئاشۇرالمىدى" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS نى قوللاشنى ئىشلەتكىلى بولمايدۇ." + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "GEmblem كودلاشنىڭ %d نەشرىنى بىر تەرەپ قىلالمىدى" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem كودلاشتا ناتوغرا بەلگە سانى مەۋجۇت (%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "GEmblemedIcon كودلاشنىڭ %d نەشرىنى بىر تەرەپ قىلالمايدۇ" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon كودلاشتا ناتوغرا بەلگە سانى (%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon ئۈچۈن بىر GEmblem ئۈمىد قىلىندى" + +#: ../gio/gfile.c:913 ../gio/gfile.c:1152 ../gio/gfile.c:1291 +#: ../gio/gfile.c:1531 ../gio/gfile.c:1586 ../gio/gfile.c:1644 +#: ../gio/gfile.c:1728 ../gio/gfile.c:1785 ../gio/gfile.c:1849 +#: ../gio/gfile.c:1904 ../gio/gfile.c:3448 ../gio/gfile.c:3503 +#: ../gio/gfile.c:3649 ../gio/gfile.c:3691 ../gio/gfile.c:4093 +#: ../gio/gfile.c:4505 ../gio/gfile.c:4590 ../gio/gfile.c:4680 +#: ../gio/gfile.c:4777 ../gio/gfile.c:4864 ../gio/gfile.c:4965 +#: ../gio/gfile.c:5238 ../gio/gfile.c:5516 ../gio/gfile.c:5570 +#: ../gio/gfile.c:7114 ../gio/gfile.c:7204 ../gio/gfile.c:7288 +#: ../gio/win32/gwinhttpfile.c:439 +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:1415 ../gio/glocalfile.c:1093 ../gio/glocalfile.c:1104 +#: ../gio/glocalfile.c:1117 +msgid "Containing mount does not exist" +msgstr "ئۆز ئىچىگە ئالغان ئېگەرلەش مەۋجۇت ئەمەس" + +#: ../gio/gfile.c:2470 ../gio/glocalfile.c:2325 +msgid "Can't copy over directory" +msgstr "مۇندەرىجە ھالقىپ كۆچۈرەلمەيدۇ" + +#: ../gio/gfile.c:2530 +msgid "Can't copy directory over directory" +msgstr "مۇندەرىجىنى مۇندەرىجىگە كۆچۈرەلمىدى" + +#: ../gio/gfile.c:2538 ../gio/glocalfile.c:2334 +msgid "Target file exists" +msgstr "نىشان ھۆججەت مەۋجۇت" + +#: ../gio/gfile.c:2557 +msgid "Can't recursively copy directory" +msgstr "مۇندەرىجىنى قايتىلانما كۆچۈرەلمەيدۇ" + +#: ../gio/gfile.c:2821 +msgid "Splice not supported" +msgstr "جىپسىلاشنى قوللىمايدۇ" + +#: ../gio/gfile.c:2825 +#, c-format +msgid "Error splicing file: %s" +msgstr "ھۆججەت جىپسىلىغاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gfile.c:2952 +#| msgid "Move between mounts not supported" +msgid "Copy (reflink/clone) between mounts is not supported" +msgstr "" + +#: ../gio/gfile.c:2956 +msgid "Copy (reflink/clone) is not supported or invalid" +msgstr "" + +#: ../gio/gfile.c:2961 +msgid "Copy (reflink/clone) is not supported or didn't work" +msgstr "" + +#: ../gio/gfile.c:3026 +msgid "Can't copy special file" +msgstr "ئالاھىدە ھۆججەتنى كۆچۈرەلمەيدۇ" + +#: ../gio/gfile.c:3639 +msgid "Invalid symlink value given" +msgstr "بېرىلگەن بەلگە ئۇلىنىش قىممىتى ئىناۋەتسىز" + +#: ../gio/gfile.c:3799 +msgid "Trash not supported" +msgstr "ئەخلەتخانىنى قوللىمايدۇ" + +#: ../gio/gfile.c:3850 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "ھۆججەت ئاتىدا '%c' بولسا بولمايدۇ" + +#: ../gio/gfile.c:6238 ../gio/gvolume.c:365 +msgid "volume doesn't implement mount" +msgstr "دىسكىنى ئېگەرلىگىلى بولمايدۇ" + +#: ../gio/gfile.c:6347 +msgid "No application is registered as handling this file" +msgstr "بۇ خىل ھۆججەتنى بىر تەرەپ قىلىش ئۈچۈن ئۈچۈن خەتلىگەن مۇناسىپ قوللىنىشچان پروگرامما يوق" + +#: ../gio/gfileenumerator.c:204 +msgid "Enumerator is closed" +msgstr "سانىغۇچ تاقالغان" + +#: ../gio/gfileenumerator.c:211 ../gio/gfileenumerator.c:270 +#: ../gio/gfileenumerator.c:367 ../gio/gfileenumerator.c:467 +msgid "File enumerator has outstanding operation" +msgstr "ھۆججەت سانىغۇچتا بىنورمال مەشغۇلات بار" + +#: ../gio/gfileenumerator.c:358 ../gio/gfileenumerator.c:458 +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:154 ../gio/gfileinputstream.c:400 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:503 +msgid "Stream doesn't support query_info" +msgstr "ئېقىم query_info نى قوللىمايدۇ" + +#: ../gio/gfileinputstream.c:331 ../gio/gfileiostream.c:383 +#: ../gio/gfileoutputstream.c:377 +msgid "Seek not supported on stream" +msgstr "ئېقىم ئىزدەشنى قوللىمايدۇ" + +#: ../gio/gfileinputstream.c:375 +msgid "Truncate not allowed on input stream" +msgstr "كىرگۈزۈش ئېقىمى ئۈزۈشنى قوللىمايدۇ" + +#: ../gio/gfileiostream.c:459 ../gio/gfileoutputstream.c:453 +msgid "Truncate not supported on stream" +msgstr "ئېقىم ئۈزۈشنى قوللىمايدۇ" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "خاتا بەلگە سانى (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "خىل ئاتى %s نىڭ تىپى يوق" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "%s تىپ GIcon ئېغىزنى ئەمەلگە ئاشۇرالمىدى" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "%s تىپ خىل ئەمەس" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "خاتا نەشر نومۇرى: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "%s تىپ GIcon ئېغىزنىڭ from_tokens() ئۇسۇلىنى ئەمەلگە ئاشۇرالمىدى" + +#: ../gio/gicon.c:428 +#| msgid "Can't handle the supplied version the icon encoding" +msgid "Can't handle the supplied version of the icon encoding" +msgstr "تەمىنلەنگەن سىنبەلگە كودلاش نەشرىنى بىر تەرەپ قىلالمىدى" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "ئادرېس كۆرسىتىلمىگەن" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "ئادرېس ئۈچۈن %u بەك ئۇزۇن" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "‹%s› نى IP ئادرېس ماسكىسى دەپ قاراپ تەھلىل قىلغىلى بولمىدى" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "ئوقۇر ئادرېسى ئۈچۈن يېتەرلىك بوشلۇق يوق" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "قوللىمايدىغان ئوقۇر ئادرېسى" + +#: ../gio/ginputstream.c:194 +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:1033 ../gio/giostream.c:301 +#: ../gio/goutputstream.c:1350 +msgid "Stream has outstanding operation" +msgstr "ئېقىمدا ھەل بولمىغان مەشغۇلات بار" + +#: ../gio/glib-compile-resources.c:145 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "ئېلېمېنت <%s> نى <%s> نىڭ ئىچىدە ئىشلەتكىلى بولمايدۇ" + +#: ../gio/glib-compile-resources.c:149 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "ئۈستى قەۋەتتە <%s> ئېلېمېنتقا يول قويۇلمايدۇ" + +#: ../gio/glib-compile-resources.c:239 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "مەنبەنىڭ ئىچىدە ھۆججەت %s بىر قانچە يەردە بار ئىكەن" + +#: ../gio/glib-compile-resources.c:252 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "خالىغان بىر ئەسلى مۇندەرىجىدىكى ‹%s› نىڭ ئورنىنى بەلگىلەش مەغلۇپ بولدى" + +#: ../gio/glib-compile-resources.c:263 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "نۆۋەتتىكى مۇندەرىجىدىكى ‹%s› نىڭ ئورنىنى بەلگىلەش مەغلۇپ بولدى" + +#: ../gio/glib-compile-resources.c:291 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "" + +#: ../gio/glib-compile-resources.c:310 ../gio/glib-compile-resources.c:370 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "ۋاقىتلىق ھۆججەت قۇرۇش مەغلۇپ بولدى: %s" + +#: ../gio/glib-compile-resources.c:340 +#, c-format +#| msgid "Error seeking in file: %s" +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" + +#: ../gio/glib-compile-resources.c:396 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" + +#: ../gio/glib-compile-resources.c:410 +#, c-format +msgid "Error reading file %s: %s" +msgstr "ھۆججەت %s ئوقۇشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glib-compile-resources.c:430 +#, c-format +msgid "Error compressing file %s" +msgstr "ھۆججەت %s نى پرېسلاشتا خاتالىق كۆرۈلدى" + +#: ../gio/glib-compile-resources.c:494 ../gio/glib-compile-schemas.c:1571 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> ئىچىدە تېكىست كۆرۈلمەسلىكى لازىم" + +#: ../gio/glib-compile-resources.c:619 +msgid "name of the output file" +msgstr "چىقىرىش ھۆججىتىنىڭ ئاتى" + +#: ../gio/glib-compile-resources.c:619 ../gio/glib-compile-resources.c:650 +#: ../gio/gresource-tool.c:482 ../gio/gresource-tool.c:548 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:620 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "ھۆججەتلەرنى ئوقۇيدىغان مۇندەرىجىلەر (ئادەتتە نۆۋەتتىكى مۇندەرىجە كۆڭۈلدىكى قىلىپ ئىشلىتىلىدۇ)" + +#: ../gio/glib-compile-resources.c:620 ../gio/glib-compile-schemas.c:1999 +#: ../gio/glib-compile-schemas.c:2028 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:621 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" + +#: ../gio/glib-compile-resources.c:622 +msgid "Generate source header" +msgstr "" + +#: ../gio/glib-compile-resources.c:623 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "" + +#: ../gio/glib-compile-resources.c:624 +msgid "Generate dependency list" +msgstr "بېقىنىش تىزىمىنى ھاسىللاش" + +#: ../gio/glib-compile-resources.c:625 +msgid "Don't automatically create and register resource" +msgstr "" + +#: ../gio/glib-compile-resources.c:626 +msgid "Don't export functions; declare them G_GNUC_INTERNAL" +msgstr "" + +#: ../gio/glib-compile-resources.c:627 +msgid "C identifier name used for the generated source code" +msgstr "" + +#: ../gio/glib-compile-resources.c:653 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" + +#: ../gio/glib-compile-resources.c:669 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:778 +msgid "empty names are not permitted" +msgstr "بوش ئاتقا يول قويۇلمايدۇ" + +#: ../gio/glib-compile-schemas.c:788 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "ئىناۋەتسىز ئات ‹%s›: ئات چوقۇم كىچىك ھەرپتىن باشلىنىدۇ" + +#: ../gio/glib-compile-schemas.c:800 +#, c-format +#| msgid "" +#| "invalid name '%s': invalid character '%c'; only lowercase letters, " +#| "numbers and dash ('-') are permitted." +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:809 +#, c-format +#| msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:818 +#, c-format +#| msgid "invalid name '%s': the last character may not be a dash ('-')." +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:826 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "ئىناۋەتسىز ئات ‹%s›: ئەڭ چوڭ ئۇزۇنلۇقى 1024" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr " ئاللىقاچان بېكىتىلگەن" + +#: ../gio/glib-compile-schemas.c:921 +msgid "cannot add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:932 +#, c-format +msgid " already specified" +msgstr " ئاللىقاچان بېكىتىلگەن" + +#: ../gio/glib-compile-schemas.c:950 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr " دىكى بىلەن نىڭ سايىسى؛ نى ئىشلىتىپ قىممىتى ئۆزگەرتىلىدۇ" + +#: ../gio/glib-compile-schemas.c:961 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "'type'، 'enum' ياكى 'flags' تە چوقۇم دەپ بەلگىلەنگەن خاسلىق بولۇشى لازىم" + +#: ../gio/glib-compile-schemas.c:980 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> تېخى بەلگىلەنمىگەن" + +#: ../gio/glib-compile-schemas.c:995 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "ئىناۋەتسىز GVariant تىپلىق تېكىست ‹%s›" + +#: ../gio/glib-compile-schemas.c:1025 +msgid " given but schema isn't extending anything" +msgstr " بېرىلدى ئەمما لايىھە كېڭەيتىلمىدى" + +#: ../gio/glib-compile-schemas.c:1038 +#, c-format +msgid "no to override" +msgstr "قاپلايدىغان يوق" + +#: ../gio/glib-compile-schemas.c:1046 +#, c-format +msgid " already specified" +msgstr " ئاللىقاچان بېكىتىلگەن" + +#: ../gio/glib-compile-schemas.c:1117 +#, c-format +msgid " already specified" +msgstr "ئاللىقاچان بېكىتىلگەن" + +#: ../gio/glib-compile-schemas.c:1129 +#, c-format +#| msgid " extends not yet existing schema '%s'" +msgid " extends not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1145 +#, c-format +#| msgid " is list of not yet existing schema '%s'" +msgid " is list of not-yet-existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1153 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "بىر تۈركۈم يولى بار لايىھە بولسا بولمايدۇ" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "يول كېڭەيتىلگەن لايىھىنى ئىشلىتەلمەيدۇ" + +#: ../gio/glib-compile-schemas.c:1173 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " تىزىم، كېڭەيتىلگەن تىزىم ئەمەس" + +#: ../gio/glib-compile-schemas.c:1183 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr " كېڭەيتىلمە ئەمما ‹%s› بولسا ‹%s› نى كېڭەيتمەيدۇ" + +#: ../gio/glib-compile-schemas.c:1200 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "بىر يول، ئەگەر بېرىلسە ئۇنداقتا يانتۇ سىزىق (/) بىلەن باشلىنىپ ئاخىرلىشىدۇ" + +#: ../gio/glib-compile-schemas.c:1207 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "بىر تىزىمنىڭ يولى چوقۇم ':/' بىلەن ئاخىرلىشىدۇ" + +#: ../gio/glib-compile-schemas.c:1239 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> ئاللىقاچان بەلگىلەنگەن" + +#: ../gio/glib-compile-schemas.c:1463 +#, c-format +#| msgid "Element <%s> not allowed at toplevel" +msgid "Element <%s> not allowed at the top level" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1757 ../gio/glib-compile-schemas.c:1828 +#: ../gio/glib-compile-schemas.c:1904 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict بەلگىلەندى؛ چېكىنىۋاتىدۇ.\n" + +#: ../gio/glib-compile-schemas.c:1765 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "پۈتكۈل ھۆججەتكە پەرۋا قىلمىدى.\n" + +#: ../gio/glib-compile-schemas.c:1824 +#, c-format +msgid "Ignoring this file.\n" +msgstr "بۇ ھۆججەتكە پەرۋا قىلمايدۇ.\n" + +#: ../gio/glib-compile-schemas.c:1864 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "%3$s قاپلاش ھۆججىتىدە بەلگىلەنگەن لايىھە `%2$s' دا %1$s كۇنۇپكا يوق" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "؛ بۇ كۇنۇپكىنى قاپلاشقا پەرۋا قىلمايدۇ.\n" + +#: ../gio/glib-compile-schemas.c:1874 ../gio/glib-compile-schemas.c:1932 +#: ../gio/glib-compile-schemas.c:1960 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr " ھەمدە --strict بەلگىلەندى؛ چېكىنىۋاتىدۇ.\n" + +#: ../gio/glib-compile-schemas.c:1890 +#, c-format +#| msgid "" +#| "error parsing key `%s' in schema `%s' as specified in override file `%s': " +#| "%s. " +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %s." +msgstr "%3$s قاپلاش ھۆججىتىدە بەلگىلەنگەن `%2$s' دىكى %1$s كۇنۇپكىنى تەھلىل قىلىشتا خاتالىق كۆرۈلدى: %4$s" + +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "بۇ كۇنۇپكىنى قاپلاشقا پەرۋا قىلمايدۇ.\n" + +#: ../gio/glib-compile-schemas.c:1918 +#, c-format +#| msgid "" +#| "override for key `%s' in schema `%s' in override file `%s' is out of the " +#| "range given in the schema" +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1946 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "%3$s قاپلاش ھۆججىتىدىكى لايىھە `%2$s' دىكى %1$s كۇنۇپكىنىڭ قاپلىغان قىممىتى ئىناۋەتلىك قىممەت دائىرىسى ئىچىدە." + +#: ../gio/glib-compile-schemas.c:1999 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled ھۆججەت نەگە ساقلىنىدۇ" + +#: ../gio/glib-compile-schemas.c:2000 +msgid "Abort on any errors in schemas" +msgstr "لايىھىدە ھەر قانداق خاتالىق كۆرۈلسە ئۈزىدۇ" + +#: ../gio/glib-compile-schemas.c:2001 +msgid "Do not write the gschema.compiled file" +msgstr "gschema.compiled ھۆججەتكە يازمايدۇ" + +#: ../gio/glib-compile-schemas.c:2002 +msgid "Do not enforce key name restrictions" +msgstr "كۇنۇپكا ئاتىنىڭ چەكلىمىسىنى مەجبۇرلىمايدۇ" + +#: ../gio/glib-compile-schemas.c:2031 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "بارلىق GSettings لايىھە ھۆججەتنى لايىھە غەملەككە تەرجىمە-تەھرىرلەيدۇ.\n" +"كېڭەيتىلگەن .gschema.xml نى ئىشلىتىشتە، لايىھە ھۆججىتى بولۇشى لازىم، غەملەك ھۆججىتى gschemas.compiled دەپ ئاتىلىدۇ." + +#: ../gio/glib-compile-schemas.c:2047 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "سىز پەقەت ۋە پەقەت بىرلا مۇندەرىجە ئاتى بېرىشىڭىز لازىم\n" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "No schema files found: " +msgstr "لايىھە ھۆججىتى تېپىلمىدى: " + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "doing nothing.\n" +msgstr "ھېچنېمە قىلما.\n" + +#: ../gio/glib-compile-schemas.c:2092 +#, c-format +msgid "removed existing output file.\n" +msgstr "مەۋجۇت چىقارغان ھۆججەت چىقىرىۋېتىلدى.\n" + +#: ../gio/glocaldirectorymonitor.c:288 +msgid "Unable to find default local directory monitor type" +msgstr "كۆڭۈلدىكى يەرلىك مۇندەرىجە كۆزەتكۈچ تىپىنى تاپالمىدى" + +#: ../gio/glocalfile.c:594 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "ئىناۋەتسىز ھۆججەت ئاتى %s" + +#: ../gio/glocalfile.c:971 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "ھۆججەت سىستېمىسى ئۇچۇرلىرىنى ئېلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfile.c:1139 +msgid "Can't rename root directory" +msgstr "غول مۇندەرىجە ئاتىنى ئۆزگەرتكىلى بولمايدۇ" + +#: ../gio/glocalfile.c:1159 ../gio/glocalfile.c:1185 +#, c-format +msgid "Error renaming file: %s" +msgstr "ھۆججەت ئاتىنى ئۆزگەرتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfile.c:1168 +msgid "Can't rename file, filename already exists" +msgstr "ئاتىنى ئۆزگەرتكىلى بولمىدى، ھۆججەت مەۋجۇت ئىكەن" + +#: ../gio/glocalfile.c:1181 ../gio/glocalfile.c:2198 ../gio/glocalfile.c:2227 +#: ../gio/glocalfile.c:2387 ../gio/glocalfileoutputstream.c:586 +#: ../gio/glocalfileoutputstream.c:639 ../gio/glocalfileoutputstream.c:684 +#: ../gio/glocalfileoutputstream.c:1172 +msgid "Invalid filename" +msgstr "ئىناۋەتسىز ھۆججەت ئاتى" + +#: ../gio/glocalfile.c:1348 ../gio/glocalfile.c:1372 +msgid "Can't open directory" +msgstr "مۇندەرىجە ئاچالمىدى" + +#: ../gio/glocalfile.c:1356 +#, c-format +msgid "Error opening file: %s" +msgstr "ھۆججەت ئېچىش خاتالىقى: %s" + +#: ../gio/glocalfile.c:1497 +#, c-format +msgid "Error removing file: %s" +msgstr "ھۆججەتنى ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfile.c:1877 +#, c-format +msgid "Error trashing file: %s" +msgstr "ھۆججەتنى ئەخلەتخانىغا يۆتكەش خاتالىقى: %s" + +#: ../gio/glocalfile.c:1900 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ئەخلەتخانا مۇندەرىجىسى %s نى قۇرالمايدۇ: %s" + +#: ../gio/glocalfile.c:1921 +msgid "Unable to find toplevel directory for trash" +msgstr "ئەخلەتخانىنىڭ ئەڭ يۇقىرى دەرىجىدىكى مۇندەرىجىنى تاپالمايدۇ" + +#: ../gio/glocalfile.c:2000 ../gio/glocalfile.c:2020 +msgid "Unable to find or create trash directory" +msgstr "ئەخلەتخانا مۇندەرىجىسى قۇرالمايدۇ ياكى تاپالمايدۇ" + +#: ../gio/glocalfile.c:2054 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ئەخلەتخانا ئۇچۇر ھۆججىتىنى قۇرالمايدۇ: %s" + +#: ../gio/glocalfile.c:2083 ../gio/glocalfile.c:2088 ../gio/glocalfile.c:2168 +#: ../gio/glocalfile.c:2175 +#, c-format +msgid "Unable to trash file: %s" +msgstr "ھۆججەتنى ئەخلەتخانىغا يۆتكىيەلمەيدۇ: %s" + +#: ../gio/glocalfile.c:2176 ../glib/gregex.c:280 +msgid "internal error" +msgstr "ئىچكى خاتالىق" + +#: ../gio/glocalfile.c:2202 +#, c-format +msgid "Error creating directory: %s" +msgstr "مۇندەرىجە قۇرۇش خاتالىقى: %s" + +#: ../gio/glocalfile.c:2231 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ھۆججەت سىستېمىسى بەلگە ئۇلانمىسىنى قوللىمايدۇ" + +#: ../gio/glocalfile.c:2235 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "بەلگە ئۇلانما قۇرۇشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfile.c:2297 ../gio/glocalfile.c:2391 +#, c-format +msgid "Error moving file: %s" +msgstr "ھۆججەت يۆتكەش خاتالىقى: %s" + +#: ../gio/glocalfile.c:2320 +msgid "Can't move directory over directory" +msgstr "مۇندەرىجىنى مۇندەرىجىگە يۆتكىيەلمەيدۇ" + +#: ../gio/glocalfile.c:2347 ../gio/glocalfileoutputstream.c:970 +#: ../gio/glocalfileoutputstream.c:984 ../gio/glocalfileoutputstream.c:999 +#: ../gio/glocalfileoutputstream.c:1015 ../gio/glocalfileoutputstream.c:1029 +msgid "Backup file creation failed" +msgstr "زاپاس ھۆججەت قۇرالمىدى" + +#: ../gio/glocalfile.c:2366 +#, c-format +msgid "Error removing target file: %s" +msgstr "نىشان ھۆججەت يۆتكەۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfile.c:2380 +msgid "Move between mounts not supported" +msgstr "ئېگەرلەشلەر ئارىسىدا يۆتكەشنى قوللىمايدۇ" + +#: ../gio/glocalfileinfo.c:721 +msgid "Attribute value must be non-NULL" +msgstr "خاسلىق قىممىتى NULL بولمىسۇن" + +#: ../gio/glocalfileinfo.c:728 +msgid "Invalid attribute type (string expected)" +msgstr "ئىناۋەتسىز خاسلىق تىپى (تېكىست «string»بولۇشى لازىم)" + +#: ../gio/glocalfileinfo.c:735 +msgid "Invalid extended attribute name" +msgstr "ئىناۋەتسىز كېڭەيتىلگەن خاسلىق ئاتى" + +#: ../gio/glocalfileinfo.c:775 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "كېڭەيتىلگەن خاسلىق ‹%s›نى تەڭشەۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:1547 +msgid " (invalid encoding)" +msgstr " (ئىناۋەتسىز كودلاش)" + +#: ../gio/glocalfileinfo.c:1739 ../gio/glocalfileoutputstream.c:848 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "ھۆججەت ‹%s› نىڭ ئۇچۇرىنى ئېلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:1985 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "ھۆججەت چۈشەندۈرگۈچ ئۇچۇرىنى ئېلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2030 +msgid "Invalid attribute type (uint32 expected)" +msgstr "ئىناۋەتسىز خاسلىق تىپى (uint32 بولۇشى لازىم)" + +#: ../gio/glocalfileinfo.c:2048 +msgid "Invalid attribute type (uint64 expected)" +msgstr "ئىناۋەتسىز خاسلىق تىپى (uint64 بولۇشى لازىم)" + +#: ../gio/glocalfileinfo.c:2067 ../gio/glocalfileinfo.c:2086 +msgid "Invalid attribute type (byte string expected)" +msgstr "ئىناۋەتسىز خاسلىق تىپى (بايتلىق تېكىست «byte string»بولۇشى لازىم)" + +#: ../gio/glocalfileinfo.c:2121 +msgid "Cannot set permissions on symlinks" +msgstr "بەلگە ئۇلانما ھوقۇقىنى تەڭشىيەلمەيدۇ" + +#: ../gio/glocalfileinfo.c:2137 +#, c-format +msgid "Error setting permissions: %s" +msgstr "ھوقۇقلىرىنى بېكىتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting owner: %s" +msgstr "ئىگىسىنى بېكىتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2211 +msgid "symlink must be non-NULL" +msgstr "بەلگە ئۇلانما چوقۇم NULL بولمىسۇن" + +#: ../gio/glocalfileinfo.c:2221 ../gio/glocalfileinfo.c:2240 +#: ../gio/glocalfileinfo.c:2251 +#, c-format +msgid "Error setting symlink: %s" +msgstr "symlink نى بېكىتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2230 +msgid "Error setting symlink: file is not a symlink" +msgstr "symlink نى بېكىتىۋاتقاندا خاتالىق كۆرۈلدى: ھۆججەت symlink ئەمەس" + +#: ../gio/glocalfileinfo.c:2356 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "زىيارەت ۋاقتى ياكى تەڭشەكنى ئۆزگەرتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2379 +msgid "SELinux context must be non-NULL" +msgstr "SELinux تىل مۇھىتى NULL بولمىسۇن" + +#: ../gio/glocalfileinfo.c:2394 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "SELinux تىل مۇھىتى تەڭشەۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinfo.c:2401 +msgid "SELinux is not enabled on this system" +msgstr "بۇ سىستېمىدا SELinux قوزغىتىلمىغان" + +#: ../gio/glocalfileinfo.c:2493 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "%s خاسلىقنى تەڭشەشنى قوللىمايدۇ" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:737 +#, c-format +msgid "Error reading from file: %s" +msgstr "ھۆججەتتىن ئوقۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:475 +#: ../gio/glocalfileoutputstream.c:1047 +#, c-format +msgid "Error seeking in file: %s" +msgstr "ھۆججەتتە ئورۇن بەلگىلەۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:353 +#, c-format +msgid "Error closing file: %s" +msgstr "ھۆججەتنى يېپىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "كۆڭۈلدىكى يەرلىك ھۆججەت كۆزەتكۈچ تىپىنى تاپالمايدۇ" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:758 +#, c-format +msgid "Error writing to file: %s" +msgstr "ھۆججەتكە يېزىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "كونا زاپاسنىڭ ئۇلانمىسىنى ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "زاپاس نۇسخا قۇرۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "ۋاقىتلىق ھۆججەت ئاتىنى ئۆزگەرتىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:521 ../gio/glocalfileoutputstream.c:1098 +#, c-format +msgid "Error truncating file: %s" +msgstr "ھۆججەت ئۈزۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:592 ../gio/glocalfileoutputstream.c:645 +#: ../gio/glocalfileoutputstream.c:690 ../gio/glocalfileoutputstream.c:830 +#: ../gio/glocalfileoutputstream.c:1079 ../gio/glocalfileoutputstream.c:1178 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "ھۆججەت ‹%s› نى ئېچىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is a directory" +msgstr "نىشان ھۆججەت مۇندەرىجە" + +#: ../gio/glocalfileoutputstream.c:866 +msgid "Target file is not a regular file" +msgstr "نىشان ھۆججەت ئادەتتىكى ھۆججەت ئەمەس" + +#: ../gio/glocalfileoutputstream.c:878 +msgid "The file was externally modified" +msgstr "ھۆججەتنى باشقا پروگرامما ئۆزگەرتكەن" + +#: ../gio/glocalfileoutputstream.c:1063 +#, c-format +msgid "Error removing old file: %s" +msgstr "كونا ھۆججەتنى ئۆچۈرۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gmemoryinputstream.c:475 ../gio/gmemoryoutputstream.c:739 +msgid "Invalid GSeekType supplied" +msgstr "تەمىنلەنگەن GSeekType ئىناۋەتسىز" + +#: ../gio/gmemoryinputstream.c:485 +msgid "Invalid seek request" +msgstr "ئىناۋەتسىز ئىزدەش ئىلتىماسى" + +#: ../gio/gmemoryinputstream.c:509 +msgid "Cannot truncate GMemoryInputStream" +msgstr "GMemoryInputStream ئۈزەلمەيدۇ" + +#: ../gio/gmemoryoutputstream.c:544 +msgid "Memory output stream not resizable" +msgstr "ئەسلەك چىقىرىش ئېقىمىنىڭ چوڭلۇقىنى ئۆزگەرتكىلى بولمايدۇ" + +#: ../gio/gmemoryoutputstream.c:560 +msgid "Failed to resize memory output stream" +msgstr "ئەسلەك چىقىرىش ئېقىم چوڭلۇقىنى ئۆزگەرتەلمىدى" + +#: ../gio/gmemoryoutputstream.c:648 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "يېزىشقا ئېھتىياجلىق ئەسلەكنى بىر تەرەپ قىلىشتا ئىشلىتىلىشچان بوشلۇقتىن ھالقىپ كەتتى" + +#: ../gio/gmemoryoutputstream.c:749 +msgid "Requested seek before the beginning of the stream" +msgstr "ئىلتىماس قىلغان ئورۇن بېكىتىش قىممىتى ئېقىم باشلىنىشىدىن ئىلگىرى" + +#: ../gio/gmemoryoutputstream.c:758 +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:395 +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:471 +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:549 +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:634 +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:722 +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:803 +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:889 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "ئېگەرلەش قەدەمداش مەزمۇن تىپى مۆلچەرلەشنى ئىشقا ئاشۇرالمىدى" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "ماشىنا ئاتى ‹%s› دا '[' بار ئەمما ']' يوق" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "تورغا يېتەلمەيدۇ" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "ماشىنىغا يېتەلمەيدۇ" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:128 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "تور كۆزەتكۈچ قۇرغىلى بولمىدى: %s" + +#: ../gio/gnetworkmonitornetlink.c:118 +msgid "Could not create network monitor: " +msgstr "تور كۆزەتكۈچ قۇرغىلى بولمىدى: " + +#: ../gio/gnetworkmonitornetlink.c:176 +msgid "Could not get network status: " +msgstr "تور ھالىتىنى ئالغىلى بولمىدى: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "چىقىرىش ئېقىمىدا يېزىشنى ئىشلەتكىلى بولمايدۇ" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:956 +msgid "Source stream is already closed" +msgstr "مەنبە ئېقىم ئاللىبۇرۇن يېپىلغان" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:454 +#: ../gio/gresourcefile.c:555 ../gio/gresourcefile.c:657 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "" + +#: ../gio/gresourcefile.c:653 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "" + +#: ../gio/gresourcefile.c:861 +msgid "Input stream doesn't implement seek" +msgstr "كىرگۈزۈش ئېقىمىدا ئىزدەشنى ئىشلەتكىلى بولمايدۇ" + +#: ../gio/gresource-tool.c:475 ../gio/gsettings-tool.c:529 +msgid "Print help" +msgstr "بېسىش ياردىمى" + +#: ../gio/gresource-tool.c:476 ../gio/gresource-tool.c:544 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:481 +msgid "List sections containing resources in an elf FILE" +msgstr "" + +#: ../gio/gresource-tool.c:487 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" + +#: ../gio/gresource-tool.c:490 ../gio/gresource-tool.c:500 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:491 ../gio/gresource-tool.c:501 +#: ../gio/gresource-tool.c:508 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:496 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" + +#: ../gio/gresource-tool.c:506 +msgid "Extract a resource file to stdout" +msgstr "مەنبە ھۆججىتىنى ئۆلچەملىك چىقىرىشقا يايسۇن" + +#: ../gio/gresource-tool.c:507 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:513 ../gio/gsettings-tool.c:609 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "نامەلۇم بۇيرۇق %s\n" +"\n" + +#: ../gio/gresource-tool.c:521 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:535 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gresource-tool.c:538 ../gio/gsettings-tool.c:642 +msgid "Arguments:\n" +msgstr "ئەركىن ئۆزگەرگۈچى:\n" + +#: ../gio/gresource-tool.c:542 +msgid " SECTION An (optional) elf section name\n" +msgstr "" + +#: ../gio/gresource-tool.c:546 ../gio/gsettings-tool.c:649 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND بۇيرۇقتا چۈشەندۈرۈلىدۇ(تاللاشچان)\n" + +#: ../gio/gresource-tool.c:552 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr "" + +#: ../gio/gresource-tool.c:555 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" + +#: ../gio/gresource-tool.c:559 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:561 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr "" + +#: ../gio/gresource-tool.c:562 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:564 +msgid " PATH A resource path\n" +msgstr "" + +#: ../gio/gsettings-tool.c:57 ../gio/gsettings-tool.c:78 +#, c-format +msgid "No such schema '%s'\n" +msgstr "‹%s› دەك لايىھە يوق\n" + +#: ../gio/gsettings-tool.c:63 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "‹%s› لايىھىنى قايتا نىشان بەلگىلىگىلى بولمايدۇ (چوقۇم يول بەلگىلىنىشى لازىم)\n" + +#: ../gio/gsettings-tool.c:84 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "‹%s› لايىھىنى قايتا نىشان بەلگىلىگىلى بولىدۇ (چوقۇم يول بەلگىلىنىشى لازىم)\n" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Empty path given.\n" +msgstr "بېرىلگەن يول قۇرۇق.\n" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "يول چوقۇم يانتۇ سىزىق '/' بىلەن باشلىنىشى لازىم\n" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "يول چوقۇم يانتۇ سىزىق '/' بىلەن ئاخىرلىشىشى لازىم\n" + +#: ../gio/gsettings-tool.c:116 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "ئاتتا ئارقىمۇ ئارقا ئىككى يانتۇ سىزىق (//) بولماسلىقى لازىم\n" + +#: ../gio/gsettings-tool.c:137 +#, c-format +msgid "No such key '%s'\n" +msgstr "‹%s› دەك كۇنۇپكا يوق\n" + +#: ../gio/gsettings-tool.c:502 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "تەمىنلەنگەن قىممەت ئىناۋەتلىك دائىرىدە ئەمەس\n" + +#: ../gio/gsettings-tool.c:535 +msgid "List the installed (non-relocatable) schemas" +msgstr "ئورنىتىلغان (قايتا نىشان بەلگىلىگىلى بولمايدىغان) لايىھە تىزىمىنى كۆرسىتىدۇ" + +#: ../gio/gsettings-tool.c:541 +msgid "List the installed relocatable schemas" +msgstr "ئورنىتىلغان قايتا نىشان بەلگىلىگىلى بولىدىغان لايىھە تىزىمىنى كۆرسىتىدۇ" + +#: ../gio/gsettings-tool.c:547 +msgid "List the keys in SCHEMA" +msgstr "SCHEMA دىكى كۇنۇپكا تىزىمىنى كۆرسىتىدۇ" + +#: ../gio/gsettings-tool.c:548 ../gio/gsettings-tool.c:554 +#: ../gio/gsettings-tool.c:591 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:553 +msgid "List the children of SCHEMA" +msgstr "SCHEMA دىكى تارماق نەڭنى كۆرسىتىدۇ" + +#: ../gio/gsettings-tool.c:559 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "ئاچقۇچ ۋە قىممەتنى چوڭقۇرلاپ كۆرسىتىدۇ\n" +"ئەگەر SCHEMA بېرىلمىگەن بولسا بارلىق ئاچقۇچلارنى كۆرسىتىدۇ\n" + +#: ../gio/gsettings-tool.c:561 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:566 +msgid "Get the value of KEY" +msgstr "كۇنۇپكا قىممىتىگە ئېرىشىدۇ" + +#: ../gio/gsettings-tool.c:567 ../gio/gsettings-tool.c:573 +#: ../gio/gsettings-tool.c:585 ../gio/gsettings-tool.c:597 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:572 +msgid "Query the range of valid values for KEY" +msgstr "KEY نىڭ ئىناۋەتلىك قىممەت دائىرىسىنى سۈرۈشتۈرىدۇ" + +#: ../gio/gsettings-tool.c:578 +msgid "Set the value of KEY to VALUE" +msgstr "KEY نىڭ قىممىتىنى VALUE قىلىپ تەڭشەيدۇ" + +#: ../gio/gsettings-tool.c:579 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:584 +msgid "Reset KEY to its default value" +msgstr "KEY نى كۆڭۈلدىكى قىممەتكە ئەسلىگە قايتۇرىدۇ" + +#: ../gio/gsettings-tool.c:590 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "SCHEMA دىكى ھەممە كۇنۇپكا قىممىتىنى كۆڭۈلدىكىگە قايتۇر" + +#: ../gio/gsettings-tool.c:596 +msgid "Check if KEY is writable" +msgstr "KEY نىڭ يېزىشچان ياكى ئەمەسلىكىنى تەكشۈرىدۇ" + +#: ../gio/gsettings-tool.c:602 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "KEY ئۆزگىرىشىنى كۆزىتىدۇ.\n" +"ئەگەر KEY بەلگىلەنمىگەن بولسا ئۇنداقتا SCHEMA دىكى ھەممە كۇنۇپكىنى كۆزىتىدۇ. \n" +"^C دا كۆزىتىشنى توختىتىدۇ.\n" + +#: ../gio/gsettings-tool.c:605 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:617 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:639 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:645 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:653 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr " SCHEMA لايىھىنىڭ ئاتى\n" +" PATH قايتا نىشان بەلگىلىگىلى بولىدىغان يول\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY لايىھە(تاللاشچان)دىكى كۇنۇپكا\n" + +#: ../gio/gsettings-tool.c:662 +msgid " KEY The key within the schema\n" +msgstr " KEY لايىھىدىكى كۇنۇپكا\n" + +#: ../gio/gsettings-tool.c:666 +msgid " VALUE The value to set\n" +msgstr " VALUE تەڭشەيدىغان قىممەت\n" + +#: ../gio/gsettings-tool.c:784 +#, c-format +msgid "Empty schema name given\n" +msgstr "بېرىلگەن لايىھە ئاتى بوش\n" + +#: ../gio/gsocket.c:311 +msgid "Invalid socket, not initialized" +msgstr "socket ئىناۋەتسىز، دەسلەپلەشتۈرۈلمىگەن" + +#: ../gio/gsocket.c:318 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "ئىناۋەتسىز ئوقۇر، دەسلەپلەشتۈرەلمىگەنلىكنىڭ سەۋەبى: %s" + +#: ../gio/gsocket.c:326 +msgid "Socket is already closed" +msgstr "ئوقۇر تاقالغان" + +#: ../gio/gsocket.c:334 ../gio/gsocket.c:3509 ../gio/gsocket.c:3564 +msgid "Socket I/O timed out" +msgstr "ئوقۇر I/O مۆھلىتى ئۆتتى" + +#: ../gio/gsocket.c:481 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "ھۆججەت چۈشەندۈرۈش بەلگىسىدىن GSocket قۇرۇۋاتىدۇ: %s" + +#: ../gio/gsocket.c:515 ../gio/gsocket.c:522 ../gio/gsocket.c:538 +#, c-format +msgid "Unable to create socket: %s" +msgstr "ئوقۇر قۇرالمايدۇ: %s" + +#: ../gio/gsocket.c:515 +#| msgid "Unknown protocol was specified" +msgid "Unknown family was specified" +msgstr "" + +#: ../gio/gsocket.c:522 +msgid "Unknown protocol was specified" +msgstr "نامەلۇم كېلىشىم بەلگىلەندى" + +#: ../gio/gsocket.c:1712 +#, c-format +msgid "could not get local address: %s" +msgstr "يەرلىك ئادرېسقا ئېرىشەلمىدى: %s" + +#: ../gio/gsocket.c:1755 +#, c-format +msgid "could not get remote address: %s" +msgstr "يىراقتىكى ئادرېسقا ئېرىشەلمىدى: %s" + +#: ../gio/gsocket.c:1816 +#, c-format +msgid "could not listen: %s" +msgstr "تىڭشىيالمىدى: %s" + +#: ../gio/gsocket.c:1888 +#, c-format +msgid "Error binding to address: %s" +msgstr "ئادرېسقا باغلاۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:1941 ../gio/gsocket.c:1978 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "" + +#: ../gio/gsocket.c:1942 ../gio/gsocket.c:1979 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "" + +#: ../gio/gsocket.c:1943 +msgid "No support for source-specific multicast" +msgstr "" + +#: ../gio/gsocket.c:2162 +#, c-format +msgid "Error accepting connection: %s" +msgstr "باغلىنىشنى قوبۇل قىلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:2283 +msgid "Connection in progress" +msgstr "باغلىنىۋاتىدۇ" + +#: ../gio/gsocket.c:2330 +#| msgid "Unable to get pending error: %s" +msgid "Unable to get pending error: " +msgstr "" + +#: ../gio/gsocket.c:2496 +#, c-format +msgid "Error receiving data: %s" +msgstr "سانلىق-مەلۇمات قوبۇل قىلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:2674 +#, c-format +msgid "Error sending data: %s" +msgstr "سانلىق-مەلۇمات يوللاۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:2788 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ئوقۇرنى تاقىغىلى بولمىدى: %s" + +#: ../gio/gsocket.c:2867 +#, c-format +msgid "Error closing socket: %s" +msgstr "سوكېتنى يېپىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:3502 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "ئوقۇر ھالىتىنى كۈتۈۋاتىدۇ: %s" + +#: ../gio/gsocket.c:3780 ../gio/gsocket.c:3861 +#, c-format +msgid "Error sending message: %s" +msgstr "ئۇچۇر يوللاۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:3805 +#| msgid "GSocketControlMessage not supported on windows" +msgid "GSocketControlMessage not supported on Windows" +msgstr "windows تا GSocketControlMessage نى ئىشلەتكىلى بولمايدۇ" + +#: ../gio/gsocket.c:4139 ../gio/gsocket.c:4274 +#, c-format +msgid "Error receiving message: %s" +msgstr "ئۇچۇر قوبۇل قىلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gsocket.c:4356 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "ھەل بولمىغان خاتالىققا ئېرىشەلمەيدۇ: %s" + +#: ../gio/gsocket.c:4375 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "بۇ مەشغۇلات سىستېمىسىدا g_socket_get_credentials ئەمەلگە ئاشمىغان" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "ۋاكالەتچى مۇلازىمېتىرى %s غا باغلىنالمىدى: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "%s غا باغلانغىلى بولمىدى: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "باغلانغىلى بولمىدى: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1540 +msgid "Unknown error on connect" +msgstr "باغلانغاندا نامەلۇم خاتالىق كۆرۈلدى" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1478 +#| msgid "Trying to proxy over non-TCP connection is not supported." +msgid "Proxying over a non-TCP connection is not supported." +msgstr "TCP باشلىنىشتىن باشقىلىرىدا ۋاكالەتچىنى ئىشلەتكىلى بولمايدۇ." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1499 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "‹%s› ۋاكالەتچى كېلىشىمىنى قوللىمايدۇ." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "تىڭشىغۇچ تاقالغان" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "قوشۇلغان ئوقۇر يېپىلدى" + +#: ../gio/gsocks4aproxy.c:120 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "IPv6 ئادرېس ‹%s› نى SOCKSv4 قوللىمايدۇ" + +#: ../gio/gsocks4aproxy.c:138 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "ئىشلەتكۈچى ئاتى SOCKSv4 كېلىشىمىگە نىسبەتەن بەك ئۇزۇن" + +#: ../gio/gsocks4aproxy.c:155 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "كومپيۇتېر ئاتى ‹%s› كېلىشىم SOCKSv4 غا نىسبەتەن بەك ئۇزۇن" + +#: ../gio/gsocks4aproxy.c:181 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "بۇ مۇلازىمېتىر SOCKSv4 ۋاكالەتچى مۇلازىمېتىر ئەمەس." + +#: ../gio/gsocks4aproxy.c:188 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "SOCKSv4 مۇلازىمېتىرى ئارقىلىق باغلىنىش رەت قىلىندى" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "بۇ مۇلازىمېتىر SOCKSv5 ۋاكالەتچى مۇلازىمېتىر ئەمەس." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 ۋاكالەتچى مۇلازىمېتىر دەلىللەشكە ئېھتىياجلىق." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "بۇ SOCKSv5 باغلىنىشقا GLib قوللىمايدىغان دەلىللەش ئۇسۇلىغا ئېھتىياجلىق." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "ئىشلەتكۈچى ئاتى ياكى ئىم SOCKSv5 كېلىشىمىگە نىسبەتەن بەك ئۇزۇن." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 دەلىللىيەلمىدى ئىشلەتكۈچى ئاتى ياكى ئىم خاتا." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "كومپيۇتېر ئاتى ‹%s› كېلىشىم SOCKSv5 غا نىسبەتەن بەك ئۇزۇن" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 ۋاكالەتچى مۇلازىمېتىر نامەلۇم ئادرېس تىپى ئىشلەتكەن." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "ئىچكى SOCKSv5 ۋاكالەتچى مۇلازىمېتىر خاتا." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "قائىدە SOCKSv5 باغلىنىشى ئىشلىتىشكە يول قويمايدۇ." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "SOCKSv5 مۇلازىمېتىرىدىن باش ئاپپاراتنى كۆرگىلى بولمايدۇ" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "SOCKSv5 ۋاكالەتچى مۇلازىمېتىرىدىن تور كۆرۈنمىدى." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "SOCKSv5 ئارقىلىق باغلىنىش رەت قىلىندى." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 ۋاكالەتچى 'connect' بۇيرۇقىنى قوللىمايدۇ." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 ۋاكالەتچى تەمىنلەنگەن ئادرېس تىپىنى قوللىمايدۇ." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "نامەلۇم SOCKSv5 ۋاكالەتچى خاتالىقى." + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "GThemedIcon كودلاشنىڭ %d نەشرىنى بىر تەرەپ قىلالمايدۇ" + +#: ../gio/gthreadedresolver.c:110 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "‹%s› خاتا تەھلىلى: %s" + +#: ../gio/gthreadedresolver.c:195 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "‹%s› ئەكسى تەھلىل خاتالىقى: %s" + +#: ../gio/gthreadedresolver.c:397 ../gio/gthreadedresolver.c:571 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "" + +#: ../gio/gthreadedresolver.c:402 ../gio/gthreadedresolver.c:576 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "‹%s› ۋاقىتلىق تەھلىل قىلالمايدۇ" + +#: ../gio/gthreadedresolver.c:407 ../gio/gthreadedresolver.c:581 +#, c-format +msgid "Error resolving '%s'" +msgstr "‹%s› تەھلىل قىلىۋاتقاندا خاتالىق كۆرۈلدى" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "PEM بىلەن كودلانغان شەخسىي ئاچقۇچنى شىفىرسىزلىغىلى بولمىدى" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "PEM بىلەن كودلانغان شەخسىي ئاچقۇچ تېپىلمىدى" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "PEM بىلەن كودلانغان شەخسىي ئاچقۇچنى يېشەلمىدى" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "PEM بىلەن كودلانغان گۇۋاھنامە تېپىلمىدى" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "PEM بىلەن كودلانغان گۇۋاھنامىنى يېشەلمىدى" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "بۇ سىزنىڭ ئەڭ ئاخىرقى پۇرسىتىڭىز. يەنە خاتالاشسىڭىز قۇلۇپلىنىپ قالىدۇ." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "بىر قانچە قېتىم خاتالاشتىڭىز. يەنە خاتالاشسىڭىز قۇلۇپلىنىپ قالىدۇ." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "كىرگۈزگەن ئىم توغرا ئەمەس." + +#: ../gio/gunixconnection.c:159 ../gio/gunixconnection.c:548 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "تىزگىن ئۇچۇرىدىن بىرنى ئۈمىد قىلغان ئەمما %d غا ئېرىشتى" + +#: ../gio/gunixconnection.c:172 ../gio/gunixconnection.c:558 +msgid "Unexpected type of ancillary data" +msgstr "ئويلىشىلمىغان قوشۇمچە سانلىق-مەلۇمات تىپى" + +#: ../gio/gunixconnection.c:190 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "ھۆججەت چۈشەندۈرۈش بەلگىسىدىن بىرنى ئۈمىد قىلغان ئەمما %d غا ئېرىشتى\n" + +#: ../gio/gunixconnection.c:206 +msgid "Received invalid fd" +msgstr "ئىناۋەتسىز ھۆججەت چۈشەندۈرۈش بەلگىسى تاپشۇرۇۋالدى" + +#: ../gio/gunixconnection.c:342 +msgid "Error sending credentials: " +msgstr "ئىسپاتنامە يوللاش خاتالىقى: " + +#: ../gio/gunixconnection.c:490 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "ئوقۇر SO_PASSCRED نى قوزغاتقان ياكى قوزغاتمىغانلىقىنى تەكشۈرۈۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixconnection.c:505 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED نى قوزغىتىۋاتقاندا(ئىناۋەتلىك قىلىۋاتقاندا)خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixconnection.c:534 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "قوبۇللىغان ئىسپاتنامىگە بىر بايت ئوقۇشنى ئۈمىد قىلغان ئەمما 0 بايت ئوقۇدى" + +#: ../gio/gunixconnection.c:572 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "تىزگىن ئۇچۇرىنى ئۈمىد قىلمىغان ئىدى، ئەمما %d غا ئېرىشتى" + +#: ../gio/gunixconnection.c:596 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "SO_PASSCRED نى چەكلەۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "ھۆججەت چۈشەندۈرگۈچتىن ئوقۇشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixinputstream.c:436 ../gio/gunixoutputstream.c:422 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "ھۆججەت چۈشەندۈرگۈچنى يېپىشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "ھۆججەت سىستېمىسى غولى" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "ھۆججەت چۈشەندۈرگۈچكە يېزىشتا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gunixsocketaddress.c:244 +#| msgid "Abstract unix domain socket addresses not supported on this system" +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "بۇ سىستېما ئابستراكت unix دائىرە ئوقۇر ئادرېسىنى قوللىمايدۇ" + +#: ../gio/gvolume.c:439 +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:516 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "دىسكىغا eject ياكى eject_with_operation نى ئىجرا قىلالمىدى" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "پروگراممىنى تاپقىلى بولمىدى" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "پروگراممىنى ئىجرا قىلىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "URI نى قوللىمايدۇ" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 باغلىنىشلىق ئۆزگەرتىشنى قوللىمايدۇ" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 باغلىنىشلىق قۇرۇشنى قوللىمايدۇ" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "handle دىن ئوقۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "تۇتقا يېپىش خاتالىقى: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "تۇتقا يېزىش خاتالىقى: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "يېتەرلىك ئەسلەك يوق" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "ئىچكى خاتالىق: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "تېخىمۇ كۆپ كىرگۈزۈشكە ئېھتىياجلىق" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "ئىناۋەتسىز پرېسلانغان سانلىق-مەلۇمات" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:20 +#| msgid "Print help" +msgid "Print address" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:28 +msgid "Run a dbus service" +msgstr "" + +#: ../gio/tests/gdbus-daemon.c:42 +#, c-format +msgid "Wrong args\n" +msgstr "" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "«%2$s» ئېلېمېنتنىڭ ئويلىشىلمىغان خاسلىقى «%1$s»" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "«%2$s» ئېلېمېنتنىڭ خاسلىقى «%1$s» تېپىلمىدى" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "ئويلىشىلمىغان بەلگە ‹%s›، بەلگە ‹%s› زۆرۈر" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "«%2$s» دىكى ئويلىشىلمىغان بەلگە «%1$s»" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "سانلىق-مەلۇمات مۇندەرىجىسىدە ئىناۋەتلىك خەتكۈش ھۆججىتى تېپىلمىدى" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI ‹%s› نىڭ خەتكۈچى مەۋجۇت" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "URI ‹%s› نىڭ خەتكۈچى تېپىلمىدى" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI ‹%s› نىڭ خەتكۈچى MIME تىپىنى بەلگىلىمىگەن" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI ‹%s› نىڭ خەتكۈچى شەخسىي تۇغنى بەلگىلىمىگەن" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI ‹%s› نىڭ خەتكۈچى گۇرۇپپا بەلگىلىمىگەن" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "‹%s› ئاتلىق پروگرامما ‹%s› غا خەتكۈش خەتلەتمىگەن" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "URI '%2$s' ئارقىلىق exec قۇر '%1$s' نى يايالمىدى" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "كىرگۈزۈشنىڭ ئاخىرىدا تاماملانمىغان ھەرپ قاتارى كۆرۈلدى" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "زاپاس ھەرپ بەلگە توپلىمى ‹%s›نى ‹%s› غا ئايلاندۇرالمايدۇ" + +#: ../glib/gconvert.c:1871 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI ‹%s› بولسا \"file\" فورماتىدىكى مۇتلەق URI ئەمەس" + +#: ../glib/gconvert.c:1881 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "يەرلىك ھۆججەت URI ‹%s› دا '#' نى ئۆز ئىچىگە ئالمايدۇ" + +#: ../glib/gconvert.c:1898 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "بۇ URI ‹%s› ئىناۋەتسىز" + +#: ../glib/gconvert.c:1910 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI دىكى ماشىنا ئاتى ‹%s› ئىناۋەتسىز" + +#: ../glib/gconvert.c:1926 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI ‹%s› دا ئىناۋەتسىز بولغان كۆچمە مەنىدىكى ھەرپ بار" + +#: ../glib/gconvert.c:2021 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "‹%s› يول ئىسمى مۇتلەق يول ئەمەس" + +#: ../glib/gconvert.c:2031 +msgid "Invalid hostname" +msgstr "باش ماشىنا ئاتى ئىناۋەتسىز" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "چ ب" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "چ ك" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Y-%m-%dT%T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d-%m-%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%-I:%M:%S %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "قەھرىتان" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "ھۇت" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "نەۋرۇز" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "ئۈمىد" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "باھار" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "سەپەر" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "چىللە" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "تومۇز" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "مىزان" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "ئوغۇز" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "ئوغلاق" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "كۆنەك" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "قەھرىتان" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "ھۇت" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "نەۋرۇز" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "ئومۇت" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "باھار" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "سەپەر" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "چىللە" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "تومۇز" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "مىزان" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "ئوغۇز" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "ئوغلاق" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "كۆنەك" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "دۈشەنبە" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "سەيشەنبە" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "چارشەنبە" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "پەيشەنبە" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "جۈمە" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "شەنبە" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "يەكشەنبە" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "د" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "س" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "چ" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Ù¾" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "ج" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Ø´" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "ي" + +#: ../glib/gdir.c:120 ../glib/gdir.c:143 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "مۇندەرىجە ‹%s› نى ئېچىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +#| msgid "Could not allocate %lu bytes to read file \"%s\"" +msgid "Could not allocate %ld byte to read file \"%s\"" +msgid_plural "Could not allocate %lu bytes to read file \"%s\"" +msgstr[0] "%lu بايت تەقسىملىيەلمىدى(ھۆججەت «%s» نى ئوقۇش ئۈچۈن)" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "ھۆججەت ‹%s› ئوقۇشتا خاتالىق كۆرۈلدى: %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "ھۆججەت «%s» بەك چوڭ" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ھۆججەت ‹%s› دىن ئوقۇش مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ھۆججەت «%s» نى ئاچالمىدى: %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ھۆججەت ‹%s› نىڭ خاسلىقلىرىغا ئېرىشىش مەغلۇپ بولدى:fstat() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ھۆججەت ‹%s› نى ئېچىش مەغلۇپ بولدى: fdopen() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ئاتىنى ‹%s› دىن ‹%s› غا ئۆزگەرتىش مەغلۇپ بولدى: g_rename() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1593 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ھۆججەت ‹%s› قۇرۇش مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "‹%s› ھۆججەتنى ئېچىپ يازالمىدى: fdopen() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ھۆججەت ‹%s› نى يېزىش مەغلۇپ بولدى: fwrite() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ھۆججەت ‹%s› نى يېزىش مەغلۇپ بولدى: fflush() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ھۆججەت ‹%s› نى يېزىش مەغلۇپ بولدى: fsync() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ھۆججەت ‹%s› نى يېپىش مەغلۇپ بولدى: fclose() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "‹%s› مەۋجۇت ھۆججەتنى چىقىرىۋېتەلمەيدۇ: g_unlink() مەغلۇپ بولدى: %s" + +#: ../glib/gfileutils.c:1556 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "‹%s› قېلىپ ئىناۋەتسىز، ‹%s› نى ئۆز ئىچىگە ئالمايدۇ." + +#: ../glib/gfileutils.c:1569 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "‹%s› قېلىپ XXXXXX نى ئۆز ئىچىگە ئالمايدۇ" + +#: ../glib/gfileutils.c:2097 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "بەلگە ئۇلانمىسى ‹%s› نى ئوقۇيالمىدى: %s" + +#: ../glib/gfileutils.c:2118 +msgid "Symbolic links not supported" +msgstr "بەلگە ئۇلانمىسىنى قوللىمايدۇ" + +#: ../glib/giochannel.c:1418 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "‹%s› دىن ‹%s› غا ئايلاندۇرغۇچنى ئاچالمايدۇ: %s" + +#: ../glib/giochannel.c:1763 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string فۇنكسىيىسى ئەسلى پېتى ئوقۇيالمىدى" + +#: ../glib/giochannel.c:1810 ../glib/giochannel.c:2068 +#: ../glib/giochannel.c:2155 +msgid "Leftover unconverted data in read buffer" +msgstr "يىغلەكتە ساقلىنىپ قالغان ئايلاندۇرۇلمىغان سانلىق-مەلۇماتنى ئوقۇۋاتىدۇ" + +#: ../glib/giochannel.c:1891 ../glib/giochannel.c:1968 +msgid "Channel terminates in a partial character" +msgstr "قانال ئاخىرلاشمىغان ھەرپتە توختىدى" + +#: ../glib/giochannel.c:1954 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end فۇنكسىيىسى ئەسلى پېتى ئوقۇيالمىدى" + +#: ../glib/gkeyfile.c:722 +msgid "Valid key file could not be found in search dirs" +msgstr "ئىزدەش مۇندەرىجىسىدە ئىناۋەتلىك ئاچقۇچ ھۆججىتىنى تاپالمىدى" + +#: ../glib/gkeyfile.c:758 +msgid "Not a regular file" +msgstr "ئادەتتىكى ھۆججەت ئەمەس" + +#: ../glib/gkeyfile.c:1158 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "ئاچقۇچ ھۆججەتتىكى قۇر ‹%s› ئاچقۇچ-قىممەت جۈپى، گۇرۇپپا ياكى ئىزاھات ئەمەس" + +#: ../glib/gkeyfile.c:1215 +#, c-format +msgid "Invalid group name: %s" +msgstr "ئىناۋەتسىز گۇرۇپپا ئاتى: %s" + +#: ../glib/gkeyfile.c:1237 +msgid "Key file does not start with a group" +msgstr "ئاچقۇچ ھۆججەت گۇرۇپپىدىن باشلانمايدۇ" + +#: ../glib/gkeyfile.c:1263 +#, c-format +msgid "Invalid key name: %s" +msgstr "ئاچقۇچ ئاتى ئىناۋەتسىز: %s" + +#: ../glib/gkeyfile.c:1290 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "ئاچقۇچ ھۆججەت قوللىمايدىغان كودلاش ‹%s› نى ئۆز ئىچىگە ئالغان" + +#: ../glib/gkeyfile.c:1533 ../glib/gkeyfile.c:1695 ../glib/gkeyfile.c:3073 +#: ../glib/gkeyfile.c:3139 ../glib/gkeyfile.c:3265 ../glib/gkeyfile.c:3398 +#: ../glib/gkeyfile.c:3540 ../glib/gkeyfile.c:3770 ../glib/gkeyfile.c:3837 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "ئاچقۇچ ھۆججەتنىڭ گۇرۇپپا ‹%s› سى يوق" + +#: ../glib/gkeyfile.c:1707 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "ئاچقۇچ ھۆججەتتە ‹%s› كۇنۇپكا يوق" + +#: ../glib/gkeyfile.c:1814 ../glib/gkeyfile.c:1930 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "ئاچقۇچ ھۆججەت ‹%s› كۇنۇپكىنى ئۆز ئىچىگە ئالغان، ئۇنىڭ قىممىتى ‹%s› بولسا UTF-8 ئەمەس" + +#: ../glib/gkeyfile.c:1834 ../glib/gkeyfile.c:1950 ../glib/gkeyfile.c:2319 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "ئاچقۇچ ھۆججەت ‹%s› كۇنۇپكىنى ئۆز ئىچىگە ئالغان، ئۇنىڭ قىممىتىنى ئىزاھلىيالمىدى." + +#: ../glib/gkeyfile.c:2536 ../glib/gkeyfile.c:2902 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2614 ../glib/gkeyfile.c:2690 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "" + +#: ../glib/gkeyfile.c:3088 ../glib/gkeyfile.c:3280 ../glib/gkeyfile.c:3848 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "ئاچقۇچ ھۆججەتنىڭ «%2$s» گۇرۇپپىسىدا «%1$s» كۇنۇپكىنى ئۆز ئىچىگە ئالغان" + +#: ../glib/gkeyfile.c:4080 +msgid "Key file contains escape character at end of line" +msgstr "ئاچقۇچ ھۆججەت قۇر ئاخىرىدا كۆچمە مەنىدىكى ھەرپ بار" + +#: ../glib/gkeyfile.c:4102 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "ئاچقۇچ ھۆججەتتە ئىناۋەتسىز كۆچمە مەنىدىكى تەرتىپ ‹%s› نى ئۆز ئىچىگە ئالغان" + +#: ../glib/gkeyfile.c:4244 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "‹%s› قىممەتنى سان دەپ ئىزاھلىيالمىدى." + +#: ../glib/gkeyfile.c:4258 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "پۈتۈن سان قىممىتى ‹%s› چەكتىن ئېشىپ كەتتى" + +#: ../glib/gkeyfile.c:4291 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "‹%s› قىممەتنى لەيلىمە سان دەپ ئىزاھلىيالمىدى." + +#: ../glib/gkeyfile.c:4315 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "‹%s› قىممەتنى بۇلىئان قىممىتى دەپ ئىزاھلىيالمىدى." + +#: ../glib/gmappedfile.c:130 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "ھۆججەت ‹%s%s%s%s› نىڭ خاسلىقلىرىغا ئېرىشىش مەغلۇپ بولدى:fstat() مەغلۇپ بولدى: %s" + +#: ../glib/gmappedfile.c:196 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "%s%s%s%s غا خەرىتىلىيەلمىدى: mmap() مەغلۇپ بولدى: %s" + +#: ../glib/gmappedfile.c:262 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ھۆججەت ‹%s› نى ئېچىش مەغلۇپ بولدى: open() مەغلۇپ بولدى: %s" + +#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#, c-format +msgid "Error on line %d char %d: " +msgstr "قۇر %d ھەرپ %d دىكى خاتالىق: " + +#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "ئىناۋەتسىز UTF-8 بىلەن كودلانغان تېكىست ئاتىدا - ‹%s› ئىناۋەتسىز" + +#: ../glib/gmarkup.c:472 +#, c-format +#| msgid "'%s' is not a valid name " +msgid "'%s' is not a valid name" +msgstr "‹%s› ئىناۋەتلىك ئات ئەمەس" + +#: ../glib/gmarkup.c:488 +#, c-format +#| msgid "'%s' is not a valid name: '%c' " +msgid "'%s' is not a valid name: '%c'" +msgstr "‹%s› ئىناۋەتلىك ئات ئەمەس: '%c'" + +#: ../glib/gmarkup.c:598 +#, c-format +msgid "Error on line %d: %s" +msgstr "قۇر %d دىكى خاتالىق:%s" + +#: ../glib/gmarkup.c:682 +#, 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:694 +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:720 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "ھەرپ نەقىلى '%-.*s' يول قويۇلغان كودلاش ئەمەس" + +#: ../glib/gmarkup.c:758 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "بوش ئەمەلىي گەۋدە '&;' بايقالدى. ئىناۋەتلىك ئەمەلىي گەۋدە: & " < > '" + +#: ../glib/gmarkup.c:766 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "نامەلۇم ئەمەلىي گەۋدە ئاتى '%-.*s'" + +#: ../glib/gmarkup.c:771 +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:1119 +msgid "Document must begin with an element (e.g. )" +msgstr "پۈتۈك چوقۇم بىر ئېلېمېنت بىلەن باشلىنىشى كېرەك(مەسىلەن دېگەندەك)" + +#: ../glib/gmarkup.c:1159 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "‹%s› ھەرپ '<' نىڭ ئارقىسىدا كۆرۈلسە ئىناۋەتسىز ھەرپ؛ ئۇ ئېلېمېنتنىڭ بېشى بولالمايدۇ" + +#: ../glib/gmarkup.c:1227 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "‹%s› ھەرپ ئىناۋەتسىز، '>' بەلگىسى بىلەن بوش ئېلېمېنت بەلگىسى ‹%s› نى ئاخىرلاشتۇرىدۇ" + +#: ../glib/gmarkup.c:1311 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "‹%s› ھەرپ ئىناۋەتسىز، خاسلىق ئاتى‹%s› (ئېلېمېنت ‹%s›) نىڭ كەينىدە '=' ھەرپ بولىدۇ" + +#: ../glib/gmarkup.c:1352 +#, 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:1396 +#, 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:1529 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "‹%s› ئاخىرلاشقان ئېلېمېنت ئاتى ‹%s› نىڭ كەينىدە كۆرۈلسە ئىناۋەتسىز؛ يول قويىدىغان ھەرپ '>'" + +#: ../glib/gmarkup.c:1576 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "ئېلېمېنت ‹%s› يېپىلدى، بىراق ھازىر ھېچقانداق ئېلېمېنت ئېچىلمىغان" + +#: ../glib/gmarkup.c:1585 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "ئېلېمېنت ‹%s› يېپىلدى، بىراق ھازىر ئېلېمېنت ‹%s› ئېچىلغان ئىدى" + +#: ../glib/gmarkup.c:1753 +msgid "Document was empty or contained only whitespace" +msgstr "پۈتۈك بوش ياكى ئۇنىڭدا بوشلۇق بەلگىلىرىلا بار" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "پۈتۈك ئېچىلغان تىرناق '<' تىن كېيىن تاسادىپىي ئاخىرلاشتى" + +#: ../glib/gmarkup.c:1775 ../glib/gmarkup.c:1820 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "پۈتۈك تېخى ئاخىرلاشمىغان ئېلېمېنت مەۋجۇت ئەھۋالدا تاسادىپىي ئاخىرلاشتى - ئەڭ ئاخىرقى ئاخىرلاشمىغان ئېلېمېنت ‹%s›" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "پۈتۈك تاسادىپىي ئاخىرلاشتى، ئوڭ تىرناق بىلەن بەلگە<%s/> ئاخىرلىشىشى كېرەك ئىدى" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside an element name" +msgstr "پۈتۈك ئېلېمېنت ئاتىدا تاسادىپىي ئاخىرلاشتى" + +#: ../glib/gmarkup.c:1795 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "پۈتۈك خاسلىق ئاتىدا تاسادىپىي ئاخىرلاشتى" + +#: ../glib/gmarkup.c:1800 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "پۈتۈك ئېلېمېنت باشلاش بەلگىسىدە تاسادىپىي ئاخىرلاشتى." + +#: ../glib/gmarkup.c:1806 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "پۈتۈك خاسلىق ئاتىنىڭ ئارقىسىغا ئەگەشكەن تەڭلىك بەلگىسىدىن كېيىن تاسادىپىي ئاخىرلاشتى؛ خاسلىق قىممىتى يوق" + +#: ../glib/gmarkup.c:1813 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "پۈتۈك خاسلىق قىممىتىدە تاسادىپىي ئاخىرلاشتى" + +#: ../glib/gmarkup.c:1829 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "پۈتۈك ئېلېمېنت ‹%s› نىڭ ئاخىرلىشىش بەلگىسىدە تاسادىپىي ئاخىرلاشتى" + +#: ../glib/gmarkup.c:1835 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "پۈتۈك ئىزاھات ياكى بۇيرۇقنى بىر تەرەپ قىلىۋاتقاندا تاسادىپىي ئاخىرلاشتى" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "ئىشلىتىش ئۇسۇلى:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[تاللانما…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "ياردەم تاللانمىسى:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "ياردەم تاللانمىلىرىنى كۆرسەت" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "ھەممە ياردەم تاللانمىلىرىنى كۆرسەت" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "پروگرامما تاللانمىلىرى:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "%2$s ئىشلىتىدىغان پۈتۈن سان '%1$s' نى بىر تەرەپ قىلالمايدۇ" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s ئىشلىتىدىغان پۈتۈن سان '%1$s' دائىرىدىن ھالقىپ كەتتى" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "%2$s ئىشلىتىدىغان قوش ئېنىقلىقتىكى قىممەت '%1$s' نى بىر تەرەپ قىلالمايدۇ" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s ئىشلىتىدىغان قوش ئېنىقلىقتىكى قىممەت '%1$s' دائىرىدىن ھالقىپ كەتتى" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "تاللانما %s نى تەھلىل قىلىۋاتقاندا خاتالىق كۆرۈلدى" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "%s نىڭ ئەركىن ئۆزگەرگۈچىسى كەم" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "نامەلۇم تاللانما %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "ئىناۋەتسىز نەڭ" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "ئىچكى خاتالىق ياكى ئىناۋەتسىز نەڭ" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "ئەسلەك يېتىشمىدى" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "ئەسلىگە قايتىش چېكىگە يەتتى" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "ئىپادە قىسمەن ماس كەلمەيدىغان قوللاش تۈرىنى ئۆز ئىچىگە ئالغان" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "تولۇق ماس كەلمىگەندە شەرتنىڭ ئەسلىگە قايتىش نەقىلى سۈپىتىدە قوللىمايدۇ." + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "قايتىلانما جەريان چېكىگە يەتتى" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "ئىناۋەتسىز بولغان يېڭى قۇر بەلگىسىنىڭ بىرىكمىسى" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "خاتا ئېغىش" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "قىسقا utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "نامەلۇم خاتالىق" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ئىپادە ئاخىرىدا" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ئىپادە ئاخىرىدا" + +#: ../glib/gregex.c:335 +#| msgid "unrecognized character follows \\" +msgid "unrecognized character following \\" +msgstr "\\ نىڭ كەينىدىكى ھەرپنى تونۇغىلى بولمىدى" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} نىڭ ئىچىدىكى سانلارنىڭ تەرتىپى ئالمىشىپ قېلىپتۇ" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} ئىچىدىكى سان بەك چوڭ" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "] ھەرپ خىلىنىڭ تاماملىنىشى كەم" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "ھەرپ خىلىدا ئىناۋەتسىز كۆچمە مەنىدىكى قاتار بار" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "ھەرپ خىلىنىڭ دائىرە تەرتىپى ئالمىشىپ قېلىپتۇ" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "تەكرارلايدىغان ھېچنېمە يوق" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "تاسادىپىي تەكرارلىق" + +#: ../glib/gregex.c:360 +#| msgid "unrecognized character after (?" +msgid "unrecognized character after (? or (?-" +msgstr "(? نىڭ ياكى (?- كەينىدە تونۇيالمايدىغان ھەرپ بار" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "پەقەت خىلدا POSIX ئاتاشتىكى خىلنىلا قوللايدۇ" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "ئاخىرلىشىدىغان ) كەم" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "مەۋجۇت بولمىغان تارماق ئىپادە نەقىل قىلىندى" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "ئىزاھاتتىن كېيىن ) كەم" + +#: ../glib/gregex.c:375 +#| msgid "regular expression too large" +msgid "regular expression is too large" +msgstr "مۇنتىزىم ئىپادە بەك چوڭ" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "ئەسلەككە ئېرىشەلمىدى" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") ئېچىلغان ( كەم" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "كود ھالقىشى" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "(?< نىڭ كەينىدە تونۇيالمايدىغان ھەرپ بار" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind ھۆكۈم مۇقىم ئۇزۇنلۇقتا ئەمەس" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( كەينىدە شەكلى خاتا بولغان سان ياكى ئات بار" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "شەرت گۇرۇپپىسى ئىككىدىن ئارتۇق تارماقنى ئۆز ئىچىگە ئالغان" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +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:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R or (?[+-]سان چوقۇم ؟ غا ئەگىشىدۇ)" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "نامەلۇم ناتونۇش POSIX خىل ئاتى" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "POSIX توپلانما ئېلېمېنتنى قوللىمايدۇ" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} قاتاردىكى ھەرپنىڭ قىممىتى بەك چوڭ" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "ئىناۋەتسىز شەرت (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind ھۆكۈمدە \\C ئىشلىتىشكە يول قويۇلمايدۇ" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "قايتىلانما چاقىرىش چەكسىز دەۋرىيلىكنى كەلتۈرۈپ چىقارغان بولۇشى مۇمكىن" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "(?P نىڭ كەينىدە تونۇيالمايدىغان ھەرپ بار" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "تارماق ئىپادە ئاتىدا ئاخىرلاشتۇرۇش بەلگىسى كەم" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "ئاتى بار ئىككى ئىپادە ئوخشاش ئاتلىق" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "شەكلى خاتا \\P ياكى \\p قاتار" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "\\P ياكى \\p نىڭ كەينىدە نامەلۇم خاسلىق ئاتى بار" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "تارماق ئىپادە ئاتى بەك ئۇزۇن (ئەڭ كۆپ بولغاندا 32 ھەرپ)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "ئات بار ئىپادە بەك كۆپ(ئەڭ كۆپ بولغاندا 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "سەككىزلىك سىستېمىدىكى قىممىتى \\377 دىن چوڭ" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "تەرجىمە خىزمەت رايونى دائىرىدىن ھالقىپ كەتتى" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "ئىلگىرى تەكشۈرگەن نەقىل ئالغان تارماق ئىپادىنى تاپالمىدى" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE گۇرۇپپا بىردىن كۆپ تارماقنى ئۆز ئىچىگە ئالغان" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "زىددىيەتلىك NEWLINE تاللانما" + +#: ../glib/gregex.c:476 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "سان بەك چوڭ" + +#: ../glib/gregex.c:492 +#| msgid "missing terminator in subpattern name" +msgid "missing subpattern name after (?&" +msgstr "" + +#: ../glib/gregex.c:495 +#| msgid "digit expected" +msgid "digit expected after (?+" +msgstr "(?+ نىڭ كەينىدە رەقەم بولۇشى كېرەك" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "" + +#: ../glib/gregex.c:501 +#| msgid "two named subpatterns have the same name" +msgid "different names for subpatterns of the same number are not allowed" +msgstr "" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "" + +#: ../glib/gregex.c:510 +#| msgid "" +#| "\\g is not followed by a braced name or an optionally braced non-zero " +#| "number" +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" + +#: ../glib/gregex.c:513 +#| msgid "URIs not supported" +msgid "\\N is not supported in a class" +msgstr "" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "" + +#: ../glib/gregex.c:522 +#| msgid "character value in \\x{...} sequence is too large" +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... قاتارىدىكى ھەرپنىڭ قىممىتى بەك چوڭ" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "مۇنتىزىم ئىپادە %s بىلەن ماسلىشىشتا خاتالىق كۆرۈلدى: %s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE ئامبار تەرجىمە قىلغاندا UTF8 قوللاشنى ئۆز ئىچىگە ئالمىغان" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE ئامبار تەرجىمە قىلغاندا UTF8 خاسلىق قوللاشنى ئۆز ئىچىگە ئالمىغان" + +#: ../glib/gregex.c:1331 +#| msgid "PCRE library is compiled without UTF8 properties support" +msgid "PCRE library is compiled with incompatible options" +msgstr "" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "%2$d ھەرپتىكى مۇنتىزىم ئىپادە %1$s نى تەرجىمە قىلغاندا خاتالىق كۆرۈلدى: %3$s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "مۇنتىزىم ئىپادە %s نى ئەلالاشتۇرغاندا خاتالىق كۆرۈلدى: %s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "ئون ئالتىلىك سىستېمىدىكى سان ياكى '}' تەلەپ قىلىدۇ" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "ئون ئالتىلىك سىستېمىدىكى ساننى تەلەپ قىلىدۇ" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "بەلگە نەقىلىدە '<' كەم" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "تاماملانمىغان بەلگە نەقىل" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "نۆل كەڭلىكتىكى بەلگە نەقىل" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "رەقەم تەلەپ قىلىنىدۇ" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "قانۇنسىز بەلگە نەقىلى" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "ئەڭ ئاخىرقى '\\' يوقالغان" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "نامەلۇم كۆچمە مەنىلىك تەرتىپ" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "ئالماشتۇرىدىغان تېكىست «%s» نى تەھلىل قىلغاندا %lu ھەرپتە خاتالىق كۆرۈلدى: %s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "نەقىل ئالغان تېكىست نەقىل بەلگىسىدىن باشلانمىغان" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "بۇيرۇق قۇرى ياكى باشقا shell نەقىل تېكىستىدە ماسلاشمىغان نەقىل كۆرۈلدى" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "تېكىست '\\' ھەرپتىن كېيىن ئاخىرلىشىدۇ.(تېكىست ‹%s›)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "تېكىست %c بىلەن ماسلىشىدىغان نەقىل بەلگىسىنى تېپىشتىن ئىلگىرى ئاخىرلىشىدۇ.(تېكىست ‹%s›)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "تېكىست بوش (ياكى بوش ھەرپنىلا ئۆز ئىچىگە ئالىدۇ)" + +#: ../glib/gspawn.c:209 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "(%s) تارماق ئىجرادىن سانلىق-مەلۇمات ئوقۇيالمىدى" + +#: ../glib/gspawn.c:368 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "ئىجرا (%s) دىن سانلىق-مەلۇمات ئوقۇۋاتقاندا select() دا تاسادىپىي خاتالىق كۆرۈلدى" + +#: ../glib/gspawn.c:859 ../glib/gspawn-win32.c:1233 +#, c-format +msgid "Child process exited with code %ld" +msgstr "بالا ئىجرا %ld دېگەن كود بىلەن چېكىنىپ كەتتى" + +#: ../glib/gspawn.c:867 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "بالا ئىجرانى سىگنال %ld ئۆلتۈردى" + +#: ../glib/gspawn.c:874 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "بالا ئىجرانى سىگنال %ld توختاتتى" + +#: ../glib/gspawn.c:881 +#, c-format +msgid "Child process exited abnormally" +msgstr "بالا ئىجرا بىنورمال چېكىنىپ كەتتى." + +#: ../glib/gspawn.c:1286 ../glib/gspawn-win32.c:339 ../glib/gspawn-win32.c:347 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "تارماق تۇرۇبىدىن ئوقۇيالمىدى (%s)" + +#: ../glib/gspawn.c:1354 +#, c-format +msgid "Failed to fork (%s)" +msgstr "(%s) نى ئاچىلاش مەغلۇپ بولدى" + +#: ../glib/gspawn.c:1502 ../glib/gspawn-win32.c:370 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "مۇندەرىجە ‹%s› (%s)ئى ئۆزگەرتىش مەغلۇپ بولدى" + +#: ../glib/gspawn.c:1512 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "تارماق ئىجرا «%s» نى ئىجرا قىلالمىدى (%s)" + +#: ../glib/gspawn.c:1522 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "قايتا نىشانلانغان تارماق ئىجرا (%s)نىڭ كىرگۈزۈش ياكى چىقىرىشىدا خاتالىق كۆرۈلدى" + +#: ../glib/gspawn.c:1531 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "تارماق ئىجرا (%s) نى ئاچىلاش مەغلۇپ بولدى" + +#: ../glib/gspawn.c:1539 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "تارماق ئىجرا «%s» نى ئىجرا قىلغاندا نامەلۇم خاتالىق كۆرۈلدى" + +#: ../glib/gspawn.c:1563 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "تارماق تۇرۇبا (%s) دىن يېتەرلىك سانلىق-مەلۇمات ئوقۇشتا خاتالىق كۆرۈلدى" + +#: ../glib/gspawn.c:1636 ../glib/gspawn-win32.c:300 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "تارماق ئىجرا بىلەن ئالاقە قىلىدىغان تۇرۇبا قۇرالمىدى (%s)" + +#: ../glib/gspawn-win32.c:283 +msgid "Failed to read data from child process" +msgstr "تارماق ئىجرادىن سانلىق-مەلۇمات ئوقۇيالمىدى" + +#: ../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:722 +#: ../glib/gspawn-win32.c:1297 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d دىكى پارامېتىردا ئىناۋەتسىز تېكىست بار: %s" + +#: ../glib/gspawn-win32.c:466 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1330 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "مۇھىتتىكى تېكىست ئىناۋەتسىز: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid working directory: %s" +msgstr "ئىناۋەتسىز خىزمەت مۇندەرىجىسى: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "ياردەمچى پروگرامما (%s) نى ئىجرا قىلالمىدى" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "g_io_channel_win32_poll() تارماق ئىجرادىن سانلىق-مەلۇمات ئوقۇۋاتقاندا تاسادىپىي خاتالىق كۆرۈلدى" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "ھەرپ UTF-8 دائىرىسىدىن ھالقىپ كەتتى" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "ئايلاندۇرۇپ كىرگۈزۈشتە ئىناۋەتسىز تەرتىپ كۆرۈلدى" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "ھەرپ UTF-16 دائىرىسىدىن ھالقىپ كەتتى" + +#: ../glib/gutils.c:2185 ../glib/gutils.c:2212 ../glib/gutils.c:2316 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u بايت" + +#: ../glib/gutils.c:2191 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f كىلوبايت" + +#: ../glib/gutils.c:2193 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f مېگابايت" + +#: ../glib/gutils.c:2196 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f گىگابايت" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f تېرابايت" + +#: ../glib/gutils.c:2202 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f پېتابايت" + +#: ../glib/gutils.c:2205 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f ئېكسابايت" + +#: ../glib/gutils.c:2218 +#, c-format +msgid "%.1f kB" +msgstr "%.1f كىلوبايت" + +#: ../glib/gutils.c:2221 ../glib/gutils.c:2334 +#, c-format +msgid "%.1f MB" +msgstr "%.1f مېگابايت" + +#: ../glib/gutils.c:2224 ../glib/gutils.c:2339 +#, c-format +msgid "%.1f GB" +msgstr "%.1f گىگابايت" + +#: ../glib/gutils.c:2226 ../glib/gutils.c:2344 +#, c-format +msgid "%.1f TB" +msgstr "%.1f تېرابايت" + +#: ../glib/gutils.c:2229 ../glib/gutils.c:2349 +#, c-format +msgid "%.1f PB" +msgstr "%.1f پېتابايت" + +#: ../glib/gutils.c:2232 ../glib/gutils.c:2354 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ئېكسابايت" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2269 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s بايت" + +#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. * Please translate as literally as possible. +#. +#: ../glib/gutils.c:2329 +#, c-format +msgid "%.1f KB" +msgstr "%.1f كىلوبايت" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "بۇيرۇق `%s' بىنورمال پروگرامما توختىتىلدى: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "`%s' بۇيرۇق نۆل بولمىغان ھالەتتىكى سان %d چېكىندى: %s" + +#~ msgid "No service record for '%s'" +#~ msgstr "'%s' نىڭ خاتىرىلەش مۇلازىمىتى يوق" + +#~ msgid "" +#~ "Unexpected option length while checking if SO_PASSCRED is enabled for " +#~ "socket. Expected %d bytes, got %d" +#~ msgstr "" +#~ "ئوقۇر SO_PASSCRED نى قوزغاتقان ياكى قوزغاتمىغانلىقىنى تەكشۈرۈۋاتقاندا " +#~ "ئويلىشىلمىغان تاللانما ئۇزۇنلۇقى كۆرۈلدى. %d بايت ئۈمىد قىلغان ئەمما %d " +#~ "غا ئېرىشتى" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "بوش تارماق تېكىستنىڭ خىزمەت بوشلۇقى چېكىگە يەتتى" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "" +#~ "بۇ جايدا چوڭ كىچىك يېزىلىشنى ئالماشتۇرىدىغان بەلگە ئىشلىتىشكە يول قويمايدۇ" +#~ "(\\l, \\L, \\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "DEFINE گۇرۇپپىنى تەكرارلاشقا يول قويۇلمايدۇ" + +#~ msgid "Unexpected error in waitpid() (%s)" +#~ msgstr "waitpid() دا تاسادىپىي خاتالىق كۆرۈلدى (%s)" + +#~ msgid "File is empty" +#~ msgstr "ھۆججەت بوش" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "ئاچقۇچ ھۆججەت '%s' كۇنۇپكىنى ئۆز ئىچىگە ئالغان، ئۇنىڭ قىممىتىنى " +#~ "ئىزاھلىيالمىدى." + +#~ msgid "This option will be removed soon." +#~ msgstr "بۇ تاللانما پات ئارىدا ئۆچۈرۈلىدۇ." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "'%s' ھۆججەت ھالىتىگە ئېرىشىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#~ msgid "Error connecting: " +#~ msgstr "باغلىنىۋاتقاندا خاتالىق كۆرۈلدى: " + +#~ msgid "Error connecting: %s" +#~ msgstr "باغلىنىشتا خاتالىق كۆرۈلدى: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 ئەمەلگە ئاشۇرۇشتا ئىشلەتكۈچى ئاتى %i ھەرپتە چەكلىنىدۇ" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4 ئەمەلگە ئاشۇرۇشتا ماشىنا ئاتى %i ھەرپتە چەكلىنىدۇ" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "unix دىن ئوقۇۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "unix نى يېپىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "unix قا يېزىۋاتقاندا خاتالىق كۆرۈلدى: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "چ ب" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "چ ك" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "قايتۇرغان قىممەت تىپى خاتا، ئېرىشىلگىنى `%s'، ئۈمىد قىلىنغىنى `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "%s تىپنىڭ خاسلىقى %s نى تەڭشەشنى سىناۋاتىدۇ ئەمما ئۈمىد قىلغان ئېغىز ۋە " +#~ "تىپى %s" diff --git a/po/uk.po b/po/uk.po new file mode 100644 index 0000000..bf77340 --- /dev/null +++ b/po/uk.po @@ -0,0 +1,3800 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 20010-03-26 14:56+0300\n" +"Last-Translator: Maxim Dziumanenko \n" +"Language-Team: ukrainian >\n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "Неочікуваний атрибут \"%s\" для елемента \"%s\"" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "Атрибут \"%s\" для елемента \"%s\" не існує" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Неочікуваний тег \"%s\", очікувався тег \"%s\"" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Неочікуваний тег '%s' у '%s'" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "Не вдається знайти правильний файл закладок у каталогах даних" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "Файл закладок для URI '%s' вже існує" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "Не знайдено закладки для URI '%s'" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "Не визначено тип MIME у закладці для URI '%s'" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "Не вказано приватну ознаку у закладці для URI '%s'" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "Не встановлено групи у закладці для URI '%s'" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "Не зареєстровано програму з назвою '%s' для закладки '%s'" + +#: ../glib/gbookmarkfile.c:3458 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Помилка розкривання рядка виконання \"%s\" для URI %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Перетворення з набору символів \"%s\" у \"%s\" не підтримується" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Не вдається відкрити модуль перетворення з \"%s\" у \"%s\"" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Неправильна послідовність байтів у перетворюваних вхідних даних" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Помилка під час перетворення: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Незавершена символьна послідовність на кінці вводу" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Неможливо коректно перетворити символ \"%s\" у символ з набору \"%s\"" + +#: ../glib/gconvert.c:1886 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "" +"Ідентифікатор URI \"%s\" не є абсолютним ідентифікатором при використанні " +"схеми \"file\"" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "Ідентифікатор URI \"%s\" локального файла не може містити символ \"#\"" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI \"%s\" - неправильний" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Неправильна назва вузла в URI \"%s\"" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "Ідентифікатор URI \"%s\" містить неправильно екранований символ" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Шлях \"%s\" не є абсолютним" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Неправильна назва вузла" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a, %d-%b-%Y %X %z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d.%m.%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "січень" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "лютий" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "березень" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "квітень" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "травень" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "червень" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "липень" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "січ" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "лют" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "бер" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "кві" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "тра" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "чер" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "лип" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "понеділок" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "вівторок" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "середа" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "четвер" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "п'ятниця" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "субота" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "неділя" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "пн" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "вт" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "ср" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "чт" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "пт" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "сб" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "нд" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Помилка відкривання каталогу \"%s\": %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Не вдається виділити %lu байтів для зчитування файла \"%s\"" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Файл \"%s\" занадто великий" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Помилка зчитування з файлу \"%s\": %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Помилка відкривання файлу \"%s\": %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Помилка отримання атрибутів файлу \"%s\": помилка fstat(): %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Помилка відкривання файлу \"%s\": помилка fdopen(): %s" + +#: ../glib/gfileutils.c:862 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "Помилка перейменування файлу \"%s\" на \"%s\": помилка g_rename(): %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Помилка створення файлу \"%s\": %s" + +#: ../glib/gfileutils.c:918 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Помилка відкривання файлу \"%s\" для запису: помилка fdopen(): %s" + +#: ../glib/gfileutils.c:943 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Помилка запису у файл \"%s\": помилка fwrite(): %s" + +#: ../glib/gfileutils.c:962 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Помилка запису у файл '%s': помилка fflush(): %s" + +#: ../glib/gfileutils.c:1006 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Помилка запису у файл '%s': помилка fsync(): %s" + +#: ../glib/gfileutils.c:1030 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Помилка закривання файлу \"%s\": помилка fclose(): %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "Не вдається видалити існуючий файл \"%s\": помилка g_unlink(): %s" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Шаблон \"%s\" неправильний, бо не може містити \"%s\"" + +#: ../glib/gfileutils.c:1425 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Шаблон \"%s\" не містить XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байти" +msgstr[2] "%u байтів" + +#: ../glib/gfileutils.c:2007 +#, fuzzy, c-format +msgid "%.1f KiB" +msgstr "%.1f кбайт" + +#: ../glib/gfileutils.c:2010 +#, fuzzy, c-format +msgid "%.1f MiB" +msgstr "%.1f Мбайт" + +#: ../glib/gfileutils.c:2013 +#, fuzzy, c-format +msgid "%.1f GiB" +msgstr "%.1f Гбайт" + +#: ../glib/gfileutils.c:2016 +#, fuzzy, c-format +msgid "%.1f TiB" +msgstr "%.1f ТБайт" + +#: ../glib/gfileutils.c:2019 +#, fuzzy, c-format +msgid "%.1f PiB" +msgstr "%.1f ПетаБайт" + +#: ../glib/gfileutils.c:2022 +#, fuzzy, c-format +msgid "%.1f EiB" +msgstr "%.1f ЕксаБайт" + +#: ../glib/gfileutils.c:2035 +#, fuzzy, c-format +msgid "%.1f kB" +msgstr "%.1f кбайт" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "%.1f Мбайт" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "%.1f Гбайт" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "%.1f ТБайт" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "%.1f ПетаБайт" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "%.1f ЕксаБайт" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, fuzzy, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%u байт" +msgstr[1] "%u байти" +msgstr[2] "%u байтів" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "%.1f кбайт" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Помилка читання символічного посилання \"%s\": %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Помилка відкривання файлу \"%s\": помилка open(): %s" + +#: ../glib/gmappedfile.c:229 +#, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Помилка створення карти файлу \"%s\": помилка mmap(): %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Помилка в рядку %d на символі %d: " + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "" +"Текст закодований як UTF-8 неприпустимим способом - некоректна послідовність " +"'%s'" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' - недопустиме ім'я" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "'%s' - недопустиме ім'я: '%c'" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Помилка в рядку %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Посилання на символ \"%-.*s\" не визначає дозволений символ" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Виявлено порожній предикат \"&;\"; допустимими предикатами є: & " " +"< > '" + +#: ../glib/gmarkup.c:722 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Назва елементу '%-.*s' невідома" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Документ має починатися з елемента (наприклад, )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"Символ \"%s\" не дозволяється вживати після символу \"<\", він не може " +"починати назву елемента" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"Зайвий символ \"%s\", очікувався символ \">\" для закриття тегу порожнього " +"елементу \"%s\"" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"Зайвий символ \"%s\", очікувався символ \"=\" після назви ознаки \"%s\" " +"елемента \"%s\"" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"Символ \"%s\" неприпустимий на закритті назви елемента \"%s\"; припустимим " +"символом є \">\"" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Було закрито не відкритий елемент \"%s\"" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Було закрито елемент \"%s\", але зараз відрито елемент \"%s\"" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Документ порожній чи містить лише пропуски" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Документ раптово закінчився відразу після початкової кутової дужки \"<\"" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"Документ раптово закінчився, коли деякі елементи ще були відкритими – \"%s\" " +"був останнім відкритим елементом" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"Документ раптово закінчився, очікувалась кінцева кутова дужка для закриття " +"тегу <%s/>" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Документ раптово закінчився посеред назви елемента" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Документ раптово закінчився посеред назви ознаки" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Документ раптово закінчився у середині тегу, що відкривав елемент" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Документ раптово закінчився після знака рівності, що йшов за назвою ознаки; " +"значення ознаки не вказано" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Документ раптово закінчився посеред значення ознаки" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Документ раптово закінчився у середині тегу, що закривав елемент \"%s\"" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "Документ раптово закінчився у середині коментарю чи інструкції обробки" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "пошкоджений об'єкт" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "внутрішня помилка або пошкоджений об'єкт" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "недостатньо пам'яті" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "закінчилось обмеження зворотного ходу" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" +"шаблон містить елементи, які не підтримуються при пошуку часткової " +"відповідності" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "внутрішня помилка" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" +"умови у вигляді зворотних посилань при пошуку часткової відповідності не " +"підтримуються" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "досягнуто межу рекурсії" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "досягнуто межу робочого простору для порожніх підрядків" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "некоректна комбінація ознак переведення рядка" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "невідома помилка" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "\\ наприкінці шаблону" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "\\c наприкінці шаблону" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "нерозпізнаний символ за послідовністю \\" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "escape-символи (\\l, \\L, \\u, \\U) неприпустимі тут" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "неправильний порядок чисел у специфікаторі {}" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "надто велике число у специфікаторі {}" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "відсутній завершальний символ ] для класу символів" + +#: ../glib/gregex.c:286 +msgid "invalid escape sequence in character class" +msgstr "Неправильна escape-послідовність у класі символів" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "неправильний порядок у діапазоні у класі символів" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "немає що повторювати" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "нерозпізнаний символ після (?" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "нерозпізнаний символ після (?<" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "нерозпізнаний символ після (?P" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "назви класів у стилі POSIX підтримуються лише у межах класі" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "відсутній завершальний символ )" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(за ?R або (?[+-]цифри має бути вказано дужку )" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "посилання на неіснуючий вкладений шаблон" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "відсутня дужка ) після коментаря" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "регулярний вираз надто довгий" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "не вдається отримати пам'ять" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "твердження lookbehind має не фіксовану довжину" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "неправильне число або назва після (?(" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "група умови містить більше ніж дві гілки" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "після (?( очікується твердження" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "невідома POSIX-назва класу" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "елементи порівняння у стилі POSIX не підтримуються" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "значення символу у послідовності \\x{...} надто велике" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "неправильний вираз (?(0)" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "\\C неприпустимий у твердженні lookbehind" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "рекурсивний виклик може увійти у нескінчений цикл" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "відсутній завершальний символ у назві вкладеного шаблону" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "два іменовані вкладені шаблони мають однакову назву" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "неправильна послідовність \\P чи \\p" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "невідома назва властивості після \\P чи \\p" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "вкладена назва шаблону надто довга (максимум 32 символів)" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "надто багато іменованих вкладених шаблонів (максимум 10,000)" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "вісімкове значення більше ніж \\377" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "група DEFINE містить більш ніж одну гілку" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "повтор групи DEFINE неприпустимий" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "неузгоджені параметри NEWLINE" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" +"\\g не завершується скріпленою назвою чи необов'язковим скріпленим не-" +"нульове число" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "неочікуваний повтор" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "переповнення коду" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "переповнення при компіляції робочого простору" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" +"раніше перевірений вкладений шаблон, на який йде посилання не знайдений" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "Помилка під час пошуку відповідності регулярному виразу %s: %s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "Бібліотека PCRE не підтримує UTF8" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "Бібліотека PCRE не підтримує властивості у кодуванні UTF8" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Помилка при компіляції регулярного виразу %s на символі %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "При оптимізації регулярного виразу %s виникла помилка: %s" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "очікується шістнадцяткова цифра або символ '}'" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "очікується шістнадцяткова цифра" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "у символьному рядку відсутня '<'" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "незакінчене символьне посилання" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "символьне посилання нульової довжини" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "очікується цифра" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "некоректне символьне посилання" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "відкидати кінцеві '\\'" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "невідома escape-послідовність" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" +"Під час розбору тексту заміни \"%s\" виникла помилка у символі з номером " +"%lu: %s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Текст в лапках не починається з лапок" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "Невідповідні лапки у командному рядку чи іншому тексті оболонки" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Текст закінчився перед символом \"\\\". (Текст був таким: \"%s\")" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Текст закінчився перед відповідними лапками для %c. (Текст був таким: \"%s\")" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Текст порожній (чи містить лише пропуски)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Помилка зчитування даних з дочірнього процесу" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Помилка створення каналу для обміну з дочірнім процесом (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Помилка зчитування з дочірнього каналу (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Помилка переходу в каталог \"%s\" (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Помилка виконання дочірнього процесу (%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "Неправильна назва програми: %s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Неправильний рядок у векторі аргументів %d: %s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Неправильний рядок у оточенні: %s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "Неправильний робочий каталог: %s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Не вдається виконати допоміжну програму (%s)" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Неочікувана помилка в зчитуванні даних з дочірнього процесу через " +"g_io_channel_win32_poll() " + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Помилка зчитування даних з дочірнього процесу (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" +"Неочікувана помилка під час очікування на зміну стану файлового дескриптора " +"дочірнього процесу (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Неочікувана помилка у waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Помилка створення процесу (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Помилка виконання дочірнього процесу \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Помилка перенаправлення виводу чи вводу дочірнього процесу (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Помилка запуску дочірнього процесу (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Невідома помилка виконання дочірнього процесу \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Не вдається зчитати достатню кількість даних з дочірнього каналу (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "Символ не входить в набір UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Неправильна послідовність у перетворюваному вводі" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Символ не входить в набір UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Використання:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[ПАРАМЕТР...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Параметри довідки:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Показати параметри довідки" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Показати усі параметри довідки" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Параметри програми:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Не вдається розібрати числове ціле значення '%s' для %s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Числове ціле значення '%s' для %s поза межами діапазону" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Не вдається розібрати числове значення подвійної точності '%s' для %s" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Числове значення подвійної точності '%s' для %s поза межами діапазону" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, c-format +msgid "Error parsing option %s" +msgstr "Помилка розбору параметра %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "Відсутній аргумент %s" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Невідомий параметр %s" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "Не вдається знайти правильний ключовий файл у каталогах ключів" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Не є звичайним файлом" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Файл порожній" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" +"Ключовий файл містить рядок '%s, який не є парою ключ-значення, групою або " +"коментарем" + +#: ../glib/gkeyfile.c:828 +#, c-format +msgid "Invalid group name: %s" +msgstr "Неправильна назва групи: %s" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Ключовий файл не починається з групи" + +#: ../glib/gkeyfile.c:876 +#, c-format +msgid "Invalid key name: %s" +msgstr "Неправильна назва ключа: %s" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ключовий фал містить кодування, що не підтримується '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ключовий файл не містить групи '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ключовий файл не містить ключ '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" +"Ключовий файл містить ключ '%s' зі значенням '%s', кодування якого не UTF-8" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" +"Ключовий файл містить ключ '%s', що має значення, яке не вдається розібрати." + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" +"Ключ '%s' з файлу ключів містить значення, яке не вдається проаналізувати." + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" +"Ключовий файл містить '%s' у групі '%s', що має значення, яке неможливо " +"розібрати." + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ключовий файл не містить ключ '%s' у групі '%s'" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "Ключовий файл містить escape-символ наприкінці рядка" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "Ключовий файл містить неправильну escape-послідовність '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Не вдається розібрати значення '%s' як число." + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Числове ціле значення '%s' поза межами діапазону" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Значення '%s' не вдається перетворити у число з рухомою комою." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Не вдається розібрати значення '%s' як логічне значення." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "До %s передано надто велике значення лічильника" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "Потік вже закрито" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "Операцію скасовано" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "Неправильний об'єкт, не ініціалізований" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "Неправильна багатобайтова послідовність у перетворюваних вхідних даних" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "Бракує простору для результату" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "тип %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Неочікуваний передчасний кінець потоку" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, fuzzy, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Непідтримувана адреса сокету" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Помилка при з'єднанні:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Помилка при записі до файлу: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Невідомий тип" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Помилка відкривання каталогу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Помилка при створенні каталогу: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Помилка зчитування файлу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Помилка при закриванні файлу: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +#, fuzzy +msgid "The connection is closed" +msgstr "Доданий сокет закритий" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, fuzzy, c-format +msgid "Property `%s' is not readable" +msgstr "Тип %s не класифікований" + +#: ../gio/gdbusconnection.c:3959 +#, fuzzy, c-format +msgid "Property `%s' is not writable" +msgstr "Тип %s не класифікований" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, fuzzy, c-format +msgid "A subtree is already exported for %s" +msgstr "Прослуховувач з'єднання вже завершився" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, fuzzy, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Помилка при записі до файлу: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Смітник не підтримується" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Помилка при записі до файлу: %s" + +#: ../gio/gdbusserver.c:1042 +#, fuzzy, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Помилка в рядку %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Помилка розбору параметра %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +#, fuzzy +msgid "Connect to given D-Bus address" +msgstr "З'єднання триває" + +#: ../gio/gdbus-tool.c:360 +#, fuzzy +msgid "Connection Endpoint Options:" +msgstr "З'єднання триває" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Помилка при з'єднанні: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, fuzzy, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "'%s' - недопустиме ім'я" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Помилка розбору параметра %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Помилка при прийнятті з'єднання: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Помилка відкривання каталогу \"%s\": %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +#, fuzzy +msgid "Monitor a remote object." +msgstr "пошкоджений об'єкт" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Без назви" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "У Desktop-файлі не визначено поле Exec" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "Неможливо знайти термінал, що потрібен програмі" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "Не вдається створити теку параметрів програми %s: %s" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "Не вдається створити теку параметрів MIME %s: %s" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Не вдається створити для користувача desktop-файл %s" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "Власне визначення %s" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "у приводі не реалізована функція запуску" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "у приводі не реалізована функція зупинки" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "Версія %d кодування GEmblem не підтримується" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblem" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "Кодування GEmblemedIcon (версія %d) не підтримується" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblemedIcon" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Очікується GEmblem для GEmblemedIcon" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "Вкладена точка монтування не існує" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "Не вдається копіювати у каталог" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "Не вдається копіювати каталог у каталог" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "Цільовий файл існує" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "Не вдається рекурсивно скопіювати каталог" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "З'єднання не підтримується" + +#: ../gio/gfile.c:2762 +#, c-format +msgid "Error splicing file: %s" +msgstr "Помилка при з'єднанні файлу: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "Не вдається скопіювати спеціальний файл" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "Неправильне значення символьного посилання" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "Смітник не підтримується" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "назви файлів не можуть містити символ '%c'" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "том не підтримує операцію монтування" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "Не зареєстровано програму для обробки цього файлу" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "Лічильник закрито" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "Лічильник файлів має невиконані операції" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "Лічильник файлів вже закритий" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "Версія %d кодування GFileIcon не підтримується" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "Неправильні вхідні дані GFileIcon" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "Потік не підтримує query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "Операція встановлення позиції не підтримується для потоків" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "Операція урізання не підтримується для вхідного потоку" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "Операція урізання не підтримується для потоку" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Неправильна кількість лексем (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Відсутній тип назви класу %s" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "Для типу %s не реалізовано інтерфейс GIcon" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Тип %s не класифікований" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Неправильний номер версії: %s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "Для типу %s не реалізовано from_tokens() у інтерфейсі GIcon" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "Неможливо обробити вказану версію кодування значків" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "Для потоку є незавершена операція" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Бракує простору для адреси сокету" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "Непідтримувана адреса сокету" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Смітник не підтримується" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, fuzzy, c-format +msgid "invalid GVariant type string '%s'" +msgstr "неправильний тип атрибуту (очікувався рядок)" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "Не вдається знайти типовий різновид монітору локального каталогу" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Неправильна назва файлу %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "Помилка при отриманні інформації з файлової системи: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "Не можна перейменовувати кореневий каталог" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, c-format +msgid "Error renaming file: %s" +msgstr "Помилка при перейменуванні файлу: %s" + +#: ../gio/glocalfile.c:1126 +#, fuzzy +msgid "Can't rename file, filename already exists" +msgstr "Не вдається перейменувати файлу, файл з такою назвою вже існує" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +msgid "Invalid filename" +msgstr "Неправильна назва файлу" + +#: ../gio/glocalfile.c:1300 +#, c-format +msgid "Error opening file: %s" +msgstr "Помилка при відкриванні файлу: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "Не вдається відкрити каталог" + +#: ../gio/glocalfile.c:1441 +#, c-format +msgid "Error removing file: %s" +msgstr "Помилка при видаленні файлу: %s" + +#: ../gio/glocalfile.c:1808 +#, c-format +msgid "Error trashing file: %s" +msgstr "Помилка при переміщенні файлу до смітника: %s" + +#: ../gio/glocalfile.c:1831 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Помилка при створенні каталогу смітника %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "Не вдається знайти каталог верхнього рівня для смітника" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "не вдається знайти чи створити каталог смітника" + +#: ../gio/glocalfile.c:1985 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Помилка створення файл у смітнику: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, c-format +msgid "Unable to trash file: %s" +msgstr "Не вдається перемістити файл до смітника: %s" + +#: ../gio/glocalfile.c:2133 +#, c-format +msgid "Error creating directory: %s" +msgstr "Помилка при створенні каталогу: %s" + +#: ../gio/glocalfile.c:2162 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Файлова система не підтримує символічні посилання" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "Помилка при створенні символьного посилання: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, c-format +msgid "Error moving file: %s" +msgstr "Помилка при переміщенні файлу: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "Не вдається перемістити каталог у каталог" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "Помилка при створенні файлу резервної копії" + +#: ../gio/glocalfile.c:2297 +#, c-format +msgid "Error removing target file: %s" +msgstr "Помилка при зчитуванні цільового файлу: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "Переміщення між різними точками монтування не підтримується" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "Значення атрибуту не можу бути NULL" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "неправильний тип атрибуту (очікувався рядок)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "Неправильна назва розширеного атрибуту" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Помилка при встановленні розширеного атрибуту \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, c-format +msgid "Error stating file '%s': %s" +msgstr "Помилка отримання інформації про файл \"%s\": %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr " (неправильне кодування)" + +#: ../gio/glocalfileinfo.c:1768 +#, c-format +msgid "Error stating file descriptor: %s" +msgstr "Помилка отримання інформації для дескриптору файлу: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Неправильний тип атрибута (очікувався uint32)" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Неправильний тип атрибуту (очікувався uint64)" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "Неправильний тип атрибуту (очікувався рядок байтів)" + +#: ../gio/glocalfileinfo.c:1904 +msgid "Cannot set permissions on symlinks" +msgstr "Помилка при встановленні прав доступу на символічне посилання" + +#: ../gio/glocalfileinfo.c:1920 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Помилка встановлення прав доступу: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, c-format +msgid "Error setting owner: %s" +msgstr "Помилка встановлення власник: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "символьне посилання не може мати значення NULL" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, c-format +msgid "Error setting symlink: %s" +msgstr "Помилка при встановленні символьного посилання: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" +"помилка при встановленні символьного посилання: файл не є символьним " +"посиланням" + +#: ../gio/glocalfileinfo.c:2139 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "Помилка при встановленні часу зміни або доступу: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "Контекст SELinux не може значення NULL" + +#: ../gio/glocalfileinfo.c:2177 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Помилка при встановленні контексту SELinux: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "SELinux не увімкнено у цій системі" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "Встановлення атрибуту %s не підтримуються" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, c-format +msgid "Error reading from file: %s" +msgstr "Помилка при читанні файлу: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Помилка при встановленні позиції у файлі: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Помилка при закриванні файлу: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "Не вдається знайти типовий різновид монітору локального файлу" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, c-format +msgid "Error writing to file: %s" +msgstr "Помилка при записі до файлу: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "Помилка при видаленні старої резервної копії посилання: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "Помилка при створенні резервної копії: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "Помилка при перейменуванні тимчасового файлу: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, c-format +msgid "Error truncating file: %s" +msgstr "Помилка при усіканні файлу: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Помилка при відкритті файлу \"%s\": %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "Цільовий файл є каталогом" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "Цільовий файл не є звичайним файлом" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "Файл був змінений іншою програмою" + +#: ../gio/glocalfileoutputstream.c:1048 +#, c-format +msgid "Error removing old file: %s" +msgstr "Помилка при видаленні старого файлу: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "Вказано неправильний GSeekType" + +#: ../gio/gmemoryinputstream.c:496 +msgid "Invalid seek request" +msgstr "Неправильний тип операції зміни позиції у файлі" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Не можна усікати GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "Не можна змінювати розмір потоку виводу у пам'ять" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "Помилка при зміні розміру потоку виводу у пам'ять" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" +"Кількість пам'яті, потрібна для процесу запису, більша ніж доступний " +"адресний простір" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "Виконувати переміщення на початок потоку" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" +"для точки монтування не реалізовано автоматичне визначення типу синхронного " +"змісту" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Назва вузла '%s' містить '[' але не містить ']'" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "У потоці виводу не реалізовано операцію запису" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "Вхідний потік вже закритий" + +#: ../gio/gresolver.c:779 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Помилка розв'язання імені на адресу \"%s\": %s" + +#: ../gio/gresolver.c:829 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Помилка зворотного розв'язання імені за адресою \"%s\": %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "Немає службового запису для '%s'" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Тимчасово неможливо розв'язати '%s'" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, c-format +msgid "Error resolving '%s'" +msgstr "Помилка при розв'язанні імені %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Невідомий параметр %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "Неправильний сокет, не ініціалізований" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Неправильний сокет, помилка ініціалізації через : %s" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "Сокет вже закритий" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "створення GSocket з fd: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Не вдається створити сокет: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "Вказано невідомий протокол" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "не вдається отримати локальну адресу: %s" + +#: ../gio/gsocket.c:1311 +#, c-format +msgid "could not get remote address: %s" +msgstr "не вдається отримати віддалену адресу: %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "не вдається прослухати: %s" + +#: ../gio/gsocket.c:1446 +#, c-format +msgid "Error binding to address: %s" +msgstr "Помилка прив'язування до адреси: %s" + +#: ../gio/gsocket.c:1566 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Помилка при прийнятті з'єднання: %s" + +#: ../gio/gsocket.c:1683 +msgid "Error connecting: " +msgstr "Помилка при з'єднанні:" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "З'єднання триває" + +#: ../gio/gsocket.c:1695 +#, c-format +msgid "Error connecting: %s" +msgstr "Помилка при з'єднанні: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Не вдається отримати помилку, що очікує: %s" + +#: ../gio/gsocket.c:1875 +#, c-format +msgid "Error receiving data: %s" +msgstr "Помилка при отриманні даних: %s" + +#: ../gio/gsocket.c:2050 +#, c-format +msgid "Error sending data: %s" +msgstr "Помилка при надсиланні даних: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Не вдається створити сокет: %s" + +#: ../gio/gsocket.c:2242 +#, c-format +msgid "Error closing socket: %s" +msgstr "Помилка при закриванні сокету: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Очікується умова сокету: %s" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, c-format +msgid "Error sending message: %s" +msgstr "Помилка при надсиланні повідомлення: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "GSocketControlMessage не підтримується у windows" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, c-format +msgid "Error receiving message: %s" +msgstr "Помилка при отриманні повідомлення: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "невідома помилка при з'єднанні" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Тип %s не класифікований" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Прослуховувач з'єднання вже завершився" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Доданий сокет закритий" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "Версія %d кодування GThemedIcon не підтримується" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "Очікується 1 керуюче повідомлення, отримано %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "Неочікуваний тип допоміжних даних" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Очікувався один fd, але отримано %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Отримано неправильний fd" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Помилка при надсиланні даних: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Помилка при перейменуванні файлу: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, fuzzy, c-format +msgid "Not expecting control message, but got %d" +msgstr "Очікується 1 керуюче повідомлення, отримано %d" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, c-format +msgid "Error reading from unix: %s" +msgstr "Помилка при зчитуванні unix-сокету: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, c-format +msgid "Error closing unix: %s" +msgstr "Помилка при закриванні unix-сокету: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "Корінь файлової системи" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, c-format +msgid "Error writing to unix: %s" +msgstr "Помилка при записі до unix-сокету: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "Адреси абстрактних unix-сокетів не підтримуються цією системою" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" +"том не підтримує операцію витягування носія або ж витягування з операцією" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "Не вдається знайти програму" + +#: ../gio/gwin32appinfo.c:299 +#, c-format +msgid "Error launching application: %s" +msgstr "Помилка при запусканні програми: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "URI не підтримуються" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "Зміни асоціацій розширень не підтримуються на win32" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "Створення асоціацій розширень не підтримуються на win32" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Помилка при читанні файлу: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Помилка при закриванні файлу: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Помилка при записі до файлу: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Бракує пам'яті" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "внутрішня помилка: %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Потрібно більше вхідних даних" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Неправильно стиснені дані" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ msgstr "Не вдається перемістити каталог у каталог" + +#, fuzzy +#~ msgid "Key %s is not writable\n" +#~ msgstr "Тип %s не класифікований" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000..9d5a423 --- /dev/null +++ b/po/vi.po @@ -0,0 +1,4455 @@ +# 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-2012. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.19.6\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-08-30 09:52+0000\n" +"PO-Revision-Date: 2012-09-01 13:17+0700\n" +"Last-Translator: Nguyễn Thái Ngọc Duy \n" +"Language-Team: Vietnamese \n" +"Language: vi\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" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, 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:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "Chức năng seek (di chuyển nhanh) không được hỗ trợ trên luồng cÆ¡ sở" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "Không thể cắt GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "Luồng đã bị đóng" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "Không cho phép cắt ngắn luồng cÆ¡ sở" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "Thao tác bị thôi" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "Đối tượng không hợp lệ, chưa được sÆ¡ khởi" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +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:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "Không đủ không gian trong đích đến" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "Byte sequence không hợp lệ trong phần nhập chuyển đổi" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "Lỗi khi chuyển đổi: %s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "Không hỗ trợ thao tác khởi động có thể huá»· bỏ" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "Không hỗ trợ việc chuyển từ đặt ký tá»± '%s' thành '%s'" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Không thể mở trình chuyển đổi từ '%s' sang '%s'" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "kiểu %s" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "Không rõ kiểu" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "kiểu tập tin %s" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials không được hỗ trợ trên hệ điều hành này" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "Không có hỗ trợ GCredentials trên hệ điều hành cá»§a bạn" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "Kết thúc luồng sớm bất thường" + +#: ../gio/gdbusaddress.c:149 ../gio/gdbusaddress.c:237 +#: ../gio/gdbusaddress.c:318 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "Khoá không hỗ trợ `%s' ở đầu nhập địa chỉ `%s'" + +#: ../gio/gdbusaddress.c:176 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" +"Địa chỉ `%s' không hợp lệ (cần chính xác một đường dẫn, tmpdir hoặc khoá " +"tổng quát)" + +#: ../gio/gdbusaddress.c:189 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "Cặp khoá/giá trị vô nghÄ©a ở địa chỉ `%s'" + +#: ../gio/gdbusaddress.c:252 ../gio/gdbusaddress.c:333 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "Lỗi ở địa chỉ `%s' - thuộc tính cổng bị hư" + +#: ../gio/gdbusaddress.c:263 ../gio/gdbusaddress.c:344 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "Lỗi ở địa chỉ `%s' - thuộc tính họ (family) bị hư" + +#: ../gio/gdbusaddress.c:453 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "Thành phần địa chỉ `%s' không chứ dấu hai chấm (:)" + +#: ../gio/gdbusaddress.c:474 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "Cặp khoá/giá trị %d, `%s' ở địa chỉ `%s' không chứa dấu bằng" + +#: ../gio/gdbusaddress.c:488 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" +"Lỗi unescape khoá hoặc giá trị trong cặp khoá/giá trị %d, `%s', ở địa chỉ `" +"%s'" + +#: ../gio/gdbusaddress.c:566 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"Lỗi ở địa chỉ `%s' - phương thức vận chuyển unix cần đặt chính xác một trong " +"những khoá `path' hoặc `abstract'" + +#: ../gio/gdbusaddress.c:602 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "Lỗi ở địa chỉ `%s' - thuộc tính máy thiếu hoặc bị hư" + +#: ../gio/gdbusaddress.c:616 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "Lỗi ở địa chỉ `%s' - thuộc tính cổng thiếu hoặc bị hư" + +#: ../gio/gdbusaddress.c:630 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "Lỗi ở địa chỉ `%s' - thuộc tính noncefile thiếu hoặc bị hư" + +#: ../gio/gdbusaddress.c:651 +msgid "Error auto-launching: " +msgstr "Lỗi tá»± động khởi động: " + +#: ../gio/gdbusaddress.c:659 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" +"Phương thức vận chuyển `%s' cho địa chỉ `%s' không được hỗ trợ, hoặc không " +"nhận ra" + +#: ../gio/gdbusaddress.c:695 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Gặp lỗi khi mở nonce-file `%s': %s" + +#: ../gio/gdbusaddress.c:713 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Gặp lỗi khi đọc nonce-file '%s': %s" + +#: ../gio/gdbusaddress.c:722 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Gặp lỗi khi đọc nonce-file '%s', cần 16 byte, nhận %d" + +#: ../gio/gdbusaddress.c:740 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Lỗi ghi nội dung nonce-file `%s' vào luồng:" + +#: ../gio/gdbusaddress.c:959 +msgid "The given address is empty" +msgstr "Địa chỉ rỗng" + +#: ../gio/gdbusaddress.c:1028 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "Không thể tạo tuyến thông điệp mà không có machine-id: " + +#: ../gio/gdbusaddress.c:1070 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "Lỗi chạy dòng lệnh '%s':" + +#: ../gio/gdbusaddress.c:1287 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Nhập ký tá»± bất kỳ để đóng cá»­a sổ)\n" + +#: ../gio/gdbusaddress.c:1412 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "Dbus cho phiên làm việc chưa chạy, tá»± động chạy thất bại" + +#: ../gio/gdbusaddress.c:1433 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" +"Không thể xác định địa chỉ tuyến phiên làm việc (chưa được hỗ trợ trên hệ " +"điều hành này)" + +#: ../gio/gdbusaddress.c:1532 ../gio/gdbusconnection.c:6755 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" +"Không thể xác định địa chỉ tuyến từ biến môi trường DBUS_STARTER_BUS_TYPE - " +"giá trị lạ `%s'" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6764 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" +"Không thể xác định địa chỉ tuyến vì không có biến môi trường " +"DBUS_STARTER_BUS_TYPE" + +#: ../gio/gdbusaddress.c:1551 +#, c-format +msgid "Unknown bus type %d" +msgstr "Không rõ kiểu tuyến %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "Nội dung bị thiếu bất thường khi đọc một dòng" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "Nội dung bị thiếu bất thường khi đọc (an toàn) một dòng" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "Cạn kiệt các phương thức xác thá»±c hiện có (thá»­: %s) (còn: %s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "Đã huá»· thông qua GDBusAuthObserver::authorize-authenticated-peer" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "Gặp lỗi khi lấy thông tin thư mục '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" +"Quyền cá»§a thư mục `%s' bị hư. Giá trị là 0%o trong khi lẽ ra phải là 0700." + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "Lỗi tạo thư mục `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Lỗi mở keyring `%s' để đọc: " + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Dòng %d cá»§a keyring tại `%s' với nội dung `%s' bị hư" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" +"Token đầu tiên cá»§a dòng %d cá»§a keyring tại `%s' với nội dung `%s' bị hư" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "Token thứ hai cá»§a dòng %d cá»§a keyring tại `%s' với nội dung `%s' bị hư" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "Không tìm thấy cookie với id %d trong keyring ở `%s'" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Lỗi khi xoá tập tin khoá không dùng nữa '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Gặp lỗi khi tạo tập tin khoá '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Gặp lỗi khi đóng (unlink) tập tin khoá `%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Gặp lỗi xoá tập tin khoá '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Gặp lỗi khi mở keyring '%s' để ghi: " + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(Ngoài ra, giải phóng khoá cho `%s' cÅ©ng thất bại: %s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "Kết nối đã đóng" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "Quá hạn" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "Phát hiện cờ không hỗ trợ khi tạo kết nối phía client" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" +"Không có giao diện `org.freedesktop.DBus.Properties' trên đối tượng tại " +"đường dẫn %s" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "Lỗi đặt thuộc tính `%s': nhận được `%s' trong khi lẽ ra phải là `%s'" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "Không có thuộc tính `%s'" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "Thuộc tính `%s' không đọc được" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "Thuộc tính `%s' không ghi được" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6198 +#, c-format +msgid "No such interface `%s'" +msgstr "Không có giao diện `%s'" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "Không có giao diện như vậy" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6704 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "Không có giao diện `%s' trên đối tượng tại đường dẫn %s" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "Không có phương thức `%s'" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "Kiểu thông điệp, `%s', không khớp với kiểu đang cần `%s'" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "Đối tượng đã được xuất cho giao diện %s tại %s rồi" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "Phương thức `%s' trả về kiểu `%s', nhưng đang muốn `%s'" + +#: ../gio/gdbusconnection.c:6309 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "Phương thức `%s' trên giao diện `%s' với ký hiệu `%s' không tồn tại" + +#: ../gio/gdbusconnection.c:6428 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "Cây con đã được xuất cho %s" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "kiểu KHÔNG HỢP LỆ" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" +"Thông điệp METHOD_CALL: thiếu trường PATH (đường dẫn) hoặc MEMBER (thành " +"viên) trong header" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "Thông điệp METHOD_RETURN: thiếu trường REPLY_SERIAL trong header" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" +"Thông điệp ERROR: thiếu trường REPLY_SERIAL hoặc ERROR_NAME trong header" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" +"Thông điệp SIGNAL: thiếu trường PATH, INTERFACE hoặc MEMBER trong header" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" +"Thông điệp SIGNAL: trường PATH dùng giá trị dành riêng /org/freedesktop/DBus/" +"Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Thông điệp SIGNAL: trường INTERFACE dùng giá trị dành riêng org.freedesktop." +"DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "Muốn đọc %lu byte nhưng nhận được EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"Muốn chuỗi UTF-8 hợp lệ nhưng nhận được dãy byte không hợp lệ từ vị trí %d " +"(độ dài chuỗi là %d). Chuỗi UTF-8 hợp lệ dài nhất là `%s'" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "Chờ byte NUL sau chuỗi `%s' nhưng lại nhận byte %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" +"Giá trị đã phân tích `%s' không phải là đường dẫn đối tượng D-Bus hợp lệ" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "Giá trị đã phân tích `%s' không phải là ký hiệu D-Bus hợp lệ" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "Phát hiện mảng dài %u byte. Độ dài tối đa là 2<<26 byte (64 MiB)." + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" +"Giá trị đã phân tích `%s' cho biến thể không phải là ký hiệu D-Bus hợp lệ" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "Lỗi thôi tuần tá»± hoá GVariant với kiểu chuỗi `%s' từ định dạng D-Bus" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" +"Giá trị endianness không hợp lệ. Chờ 0x6c ('l') hoặc 0x42 ('B') nhưng nhận " +"được 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "Phiên bản chính cá»§a phương thức không hợp lệ. Chờ 1 nhưng nhận %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "Ký hiệu header `%s' nhưng phần thân trống rỗng" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" +"Giá trị đã phân tích `%s' không phải là ký hiệu D-Bus hợp lệ (cho phần thân)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +"Không có header ký hiệu trong thông điệp, nhưng phần thân thông điệp có %u " +"byte" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "Không thể bỏ tuần tá»± hoá thông điệp: " + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "Lỗi tuần tá»± hoá GVariant với kiểu chuỗi `%s' sang định dạng D-Bus" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" +"Thông điệp có %d bộ mô tả tập tin nhưng header chỉ ra %d bộ mô tả tập tin" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "Không thể tuần tá»± hoá thông điệp: " + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "Phần thân thông điệp có ký hiệu `%s' nhưng không có header ký hiệu" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "Phần thân thông điệp có ký hiệu `%s' nhưng header lại có ký hiệu `%s'" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "Thân thông điệp trống rỗng như ký hiệu trong header là `(%s)'" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "Lỗi tra ề thân cá»§a kiểu `%s'" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "Lỗi trả về thân trống rỗng" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "Không thể lấy hồ sÆ¡ phần cứng: %s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "Không thể nạp /var/lib/dbus/machine-id hoặc /etc/machine-id: " + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "Lỗi gọi StartServiceByName cho %s: " + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "Trả lời %d không mong đợi từ hàm StartServiceByName(\"%s)" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"Không thể gọi hàm; uá»· nhiệm chỉ dành cho nhá»­ng tên đã biết không có sở hữu " +"và uá»· nhiệm được xây dá»±ng với cờ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "Không hỗ trợ vùng tên tổng quát" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "Không thể xác định nonce-file khi tạo máy chá»§" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Lỗi ghi nonce-file tại `%s': %s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "Chuỗi '%s' không phải là D-BUS GUID hợp lệ" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "Không thể listen trên phương thức vận chuyển không hỗ trợ `%s'" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "LỆNH" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"Lệnh:\n" +" help Hiện những thông tin này\n" +" introspect Xem xét đối tượng từ xa\n" +" monitor Theo dõi đối tượng từ xa\n" +" call Gọi hàm trên đối tượng từ xa\n" +" emit Phát tín hiệu\n" +"\n" +"Dùng \"%s LỆNH --help\" để có trợ giúp cá»§a từng lệnh.\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "Lỗi: %s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Lỗi phân tích introspection XML: %s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "Không thể kết nối vào tuyến hệ thống" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "Không thể kết nối vào tuyến phiên làm việc" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "Kết nối đến địa chỉ D-Bus đã cho" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "Tuỳ chọn đầu kết nối:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "Tuỳ chọn xác định đầu nối" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "Chưa xác định đầu nối" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "Xác định nhiều đầu nối" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "Chú ý: theo dữ liệu introspection, giao diện `%s' không tồn tại\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" +"Chú ý: theo dữ liệu introspection, phương thức `%s' không tồn tại trên giao " +"diện `%s'\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "Đích tuỳ chọn cho tín hiệu (tên duy nhất)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "Đường dẫn để phát tín hiệu" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "Tên phương thức vào giao diện" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "Phát tín hiệu." + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "Lỗi kết nối: %s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "Lỗi: chưa xác định đường dẫn đối tượng.\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Lỗi: '%s' không phải là đường dẫn đối tượng hợp lệ\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "Lỗi: chưa xác định tín hiệu.\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +#| msgid "Error: signal not specified.\n" +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "Lỗi: tín hiệu phải có tên đầy đủ.\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Lỗi: %s không phải là tên giao tiếp hợp lệ\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Lỗi: %s không phải là tên thành viên hợp lệ\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Lỗi: %s không phải là tên tuyến duy nhất hợp lệ\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Lỗi phân tích tham số %d: %s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "Lỗi tống kết nối: %s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "Tên dích để gọi hàm" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "Đường dẫn đối tượng để gọi hàm" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "Tên phương thức vào giao diện" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "Thời hạn theo giây" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "Gọi hàm trên đối tượng từ xa." + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "Lỗi: chưa xác định đích\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "Lỗi: chưa xác định đường dẫn đối tượng\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "Lỗi: chưa xác định tên phương thức\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "Lỗi: tên phương thức `%s' không hợp lệ\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Lỗi phân tích tham số %d kiểu `%s': %s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "Tên đích cần xem xét" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "Đường dẫn đối tượng cần xem xét" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "In XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Xem xét con" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "Chỉ in thuộc tính" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "Xem xét đối tượng từ xa." + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "Tên đích cần theo dõi" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "Đường dẫn đối tượng cần theo dõi" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "Theo dõi đối tượng từ xa." + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "Không có tên" + +#: ../gio/gdesktopappinfo.c:993 +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:1281 +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:1569 +#, 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:1573 +#, 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:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "Thông tin ứng dụng thiếu định danh" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "Không thể tạo tập tin desktop %s" + +#: ../gio/gdesktopappinfo.c:2191 +#, c-format +msgid "Custom definition for %s" +msgstr "Lời định nghÄ©a riêng cho %s" + +#: ../gio/gdrive.c:363 +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:440 +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:513 +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:716 +msgid "drive doesn't implement start" +msgstr "ổ đĩa không thá»±c hiện chức năng chạy (start)" + +#: ../gio/gdrive.c:815 +msgid "drive doesn't implement stop" +msgstr "ổ đĩa không thá»±c hiện chức năng dừng (stop)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "Không hỗ trợ TLS" + +#: ../gio/gemblem.c:324 +#, 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:334 +#, 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:367 +#, 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:377 +#, 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:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "Mong đợi một GEmblem cho GEmblemedIcon" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3362 ../gio/gfile.c:3417 +#: ../gio/gfile.c:3563 ../gio/gfile.c:3605 ../gio/gfile.c:4007 +#: ../gio/gfile.c:4421 ../gio/gfile.c:4506 ../gio/gfile.c:4596 +#: ../gio/gfile.c:4693 ../gio/gfile.c:4780 ../gio/gfile.c:4872 +#: ../gio/gfile.c:5205 ../gio/gfile.c:5529 ../gio/gfile.c:5597 +#: ../gio/gfile.c:7224 ../gio/gfile.c:7314 ../gio/gfile.c:7398 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "Bộ lắp chứa không tồn tại" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "Không thể sao chép đè lên thư mục" + +#: ../gio/gfile.c:2520 +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:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "Tập tin đích đã có" + +#: ../gio/gfile.c:2546 +msgid "Can't recursively copy directory" +msgstr "Không thể sao chép đệ quy thư mục" + +#: ../gio/gfile.c:2810 +msgid "Splice not supported" +msgstr "Chức năng nối bện không được hỗ trợ" + +#: ../gio/gfile.c:2814 +#, c-format +msgid "Error splicing file: %s" +msgstr "Gặp lỗi khi nối bện tập tin: %s" + +#: ../gio/gfile.c:2960 +msgid "Can't copy special file" +msgstr "Không thể sao chép tập tin đặc biệt" + +#: ../gio/gfile.c:3553 +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:3713 +msgid "Trash not supported" +msgstr "Thùng rác không được hỗ trợ" + +#: ../gio/gfile.c:3764 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "Tên tập tin không thể chứa '%c'" + +#: ../gio/gfile.c:6289 ../gio/gvolume.c:332 +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:6397 +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:205 +msgid "Enumerator is closed" +msgstr "Bộ đếm bị đóng" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "Bộ đếm tập tin có thao tác còn chạy" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "Luồng không hỗ trợ hàm 'query_info'" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +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:374 +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:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "Không cho phép cắt ngắn luồng" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "Số các hiệu bài không đúng (%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "Không có kiểu cho tên hạng %s" + +#: ../gio/gicon.c:314 +#, 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:325 +#, c-format +msgid "Type %s is not classed" +msgstr "Kiểu %s không được đặt hạng" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "Số thứ tá»± phiên bản dạng sai: %s" + +#: ../gio/gicon.c:353 +#, 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:428 +msgid "Can't handle the supplied version of 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/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "Chưa xác định địa chỉ" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "%u là quá dài cho địa chỉ" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "Địa chỉ đặt bit vượt độ dài prefix" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "không thể phân tích '%s' làm mặt nạ địa chỉ IP" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "Không đủ không gian cho địa chỉ socket" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "Địa chỉ socket không hỗ trợ" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "Luồng có thao tác còn chạy" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "Không cho phép phần tá»­ <%s> bên trong <%s>" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "Không cho phép phần tá»­ <%s> ở cấp cao nhất" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "Tập tin %s xuất hiện nhiều lần trong tài nguyên" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "Lỗi định vị '%s' trong thư mục nguồn" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "Lỗi định vị '%s' trong thư mục hiện thời" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "Không biết tùy chọn xá»­ lý \"%s\"" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "Không tạo được tập tin tạm: %s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"Lỗi xá»­ lý tập tin nhập với xmllint:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"Lỗi xá»­ lý tập tin nhập với to-pixdata:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "Lỗi khi đọc tập tin %s: %s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "Gặp lỗi khi nén tập tin %s" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "văn bản không thể xuất hiện bên trong <%s>" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "tên tập tin xuất" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "TẬP TIN" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "Thư mục chứa tập tin cần đọc (mặc định là thư mục hiện thời)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "THƯ MỤC" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "" +"Phát sinh kết quả theo định dạng chọn theo phần mở rộng tên tập tin đích" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "Phát sinh source header" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "Phát sinh mã nguồn để liên kết trong tập tin tài nguyên vào mã cá»§a bạn" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "Phát sinh danh sách phụ thuộc" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "Không tá»± động tạo và đăng ký tài nguyên" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "Tên định danh C cho mã nguồn phát sinh" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"Biên dịch đặc tả tài nguyên thành tập tin tài nguyên.\n" +"Tập tin đặc tả tài nguyên có đuôi .gresource.xml,\n" +"và tập tin tài nguyên có đuôi .gresource." + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "Bạn nên đưa chính xác một tên tập tin\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "không cho phép tên rỗng" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "tên không hợp lệ '%s': tên phải bắt đầu bằng chữ thường" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"tên không hợp lệ '%s': ký tá»± không hợp lệ '%c'; chỉ được dùng chữ thường, số " +"hoặc dấu gạch ngang ('-')." + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "" +"tên không hợp lệ '%s': không được dùng hai gạch ngang liên tiếp ('--')." + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "tên không hợp lệ '%s': ký tá»± cuối không thể là gạch ngang ('-')." + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "tên không hợp lệ '%s': độ dài tối đa là 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " đã được xác định rồi" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "không thể thêm khoá vào schema 'list-of'" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " đã được xác định rồi" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" che trong ; dùng " +"để thay đổi giá trị" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" +"thuộc tính cá»§a chỉ có thể là duy nhất một trong 'type', 'enum' hoặc " +"'flags'" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> chưa định nghÄ©a." + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "kiểu chuỗi GVariant không hợp lệ '%s'" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr " được ghi nhưng schema không có gì để mở rộng" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "không có để ghi đè" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " đã được xác định rồi" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " đã được xác định rồi" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " mở rộng schema chưa tồn tại '%s'" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " là danh sách cá»§a schema chưa tồn tại '%s'" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "Không thể là danh sách cá»§a schema hoặc đường dẫn" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "Không thể mở rộng schema với một đường dẫn" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" +" là danh sách, mở rộng không phải là một " +"danh sách" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" mở rộng nhưng " +"'%s' không mở rộng '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "đường dẫn nếu có phải bắt đầu bằng dấu '/'" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "đường dẫn danh sách phải bắt đầu bằng ':/'" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> đã được xác định rồi" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "Không cho phép phần tá»­ <%s> ở cấp cao nhất" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "--strict được dùng; thoát.\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "Toàn bộ tập tin này bị bỏ qua.\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "Bỏ qua tập tin này.\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" +"Không có khoá `%s' trong schema `%s' như được xác định trong tập tin ghi đè `" +"%s'" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "; bỏ qua ghi đè cho khoá này.\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "và có dùng --strict; thoát.\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"lỗi phân tích khoá `%s' trong schema `%s' như xác định trong tập tin ghi đè `" +"%s': %s. " + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "Bỏ qua ghi đè khoá này.\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"ghi đè khoá `%s' trong schema `%s' trong tập tin ghi đè `%s' ngoài phạm vi " +"schema" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"ghi đè khoá `%s' trong schema `%s' trong tập tin ghi đè `%s' không nằm trong " +"danh sách lá»±a chọn hợp lệ" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "nÆ¡i lưu tập tin gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "Buộc huá»· nếu gặp bất cứ lỗi gì trong schema" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "Không ghi tập tin gschemas.compiled" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "Không áp đặt ràng buộc tên khoá" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"Biên dịch tất cả tập tin GSettings schema thành schema cache.\n" +"Tập tin schema cần có phần mở rộng .gschema.xml,\n" +"và tập tin cache tên là gschemas.compiled." + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "Bạn nên đưa chính xác một tên thư mục\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "Không tìm thấy tập tin schema: " + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "không làm gì cả.\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "đã xoá tập tin kết xuất hiện có.\n" + +#: ../gio/glocaldirectorymonitor.c:287 +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:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "Tên tập tin không hợp lệ: %s" + +#: ../gio/glocalfile.c:967 +#, 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:1135 +msgid "Can't rename root directory" +msgstr "Không thể thay đổi tên cá»§a thư mục gốc" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, 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:1164 +msgid "Can't rename file, filename already exists" +msgstr "Không thể đổi tên tập tin, tên tập tin đã có" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "Tên tập tin không hợp lệ" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "Không thể mở thư mục" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "Gặp lỗi khi mở tập tin: %s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "Gặp lỗi khi gỡ bỏ tập tin: %s" + +#: ../gio/glocalfile.c:1860 +#, 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:1883 +#, 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:1904 +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:1983 ../gio/glocalfile.c:2003 +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:2037 +#, 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:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, 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:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "lỗi nội bộ" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "Lỗi tạo thư mục: %s" + +#: ../gio/glocalfile.c:2214 +#, 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:2218 +#, 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:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "Gặp lỗi khi di chuyển tập tin: %s" + +#: ../gio/glocalfile.c:2303 +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:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "Lỗi tạo tập tin sao lưu" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "Gặp lỗi khi gỡ bỏ tập tin đích: %s" + +#: ../gio/glocalfile.c:2363 +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:718 +msgid "Attribute value must be non-NULL" +msgstr "Giá trị thuộc tính phải có giá trị" + +#: ../gio/glocalfileinfo.c:725 +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:732 +msgid "Invalid extended attribute name" +msgstr "Tên thuộc tính đã mở rộng không hợp lệ" + +#: ../gio/glocalfileinfo.c:772 +#, 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:1425 +msgid " (invalid encoding)" +msgstr " (bảng mã không hợp lệ)" + +#: ../gio/glocalfileinfo.c:1526 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "Lỗi lấy thông tin cho tập tin '%s': %s" + +#: ../gio/glocalfileinfo.c:1778 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "Lỗi lấy thông tin cho bộ mô tả tập tin: %s" + +#: ../gio/glocalfileinfo.c:1823 +msgid "Invalid attribute type (uint32 expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi uint32)" + +#: ../gio/glocalfileinfo.c:1841 +msgid "Invalid attribute type (uint64 expected)" +msgstr "Kiểu thuộc tính không hợp lệ (mong đợi uint64)" + +#: ../gio/glocalfileinfo.c:1860 ../gio/glocalfileinfo.c:1879 +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:1914 +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:1930 +#, c-format +msgid "Error setting permissions: %s" +msgstr "Gặp lỗi khi đặt quyền hạn: %s" + +#: ../gio/glocalfileinfo.c:1981 +#, c-format +msgid "Error setting owner: %s" +msgstr "Gặp lỗi khi đặt người sở hữu : %s" + +#: ../gio/glocalfileinfo.c:2004 +msgid "symlink must be non-NULL" +msgstr "liên kết tượng trưng phải có giá trị" + +#: ../gio/glocalfileinfo.c:2014 ../gio/glocalfileinfo.c:2033 +#: ../gio/glocalfileinfo.c:2044 +#, 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:2023 +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:2149 +#, 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:2172 +msgid "SELinux context must be non-NULL" +msgstr "Ngữ cảnh SELinux phải khác NULL" + +#: ../gio/glocalfileinfo.c:2187 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "Lỗi đặt ngữ cảnh SELinux: %s" + +#: ../gio/glocalfileinfo.c:2194 +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:2286 +#, 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:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "Gặp lỗi khi đọc từ tập tin: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, 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:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "Gặp lỗi khi đóng tập tin: %s" + +#: ../gio/glocalfilemonitor.c:212 +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:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "Gặp lỗi khi ghi vào tập tin: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, 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:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "Gặp lỗi khi cắt ngắn tập tin: %s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "Gặp lỗi khi mở tập tin '%s': %s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "Tập tin đích là một thư mục" + +#: ../gio/glocalfileoutputstream.c:861 +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:873 +msgid "The file was externally modified" +msgstr "Tập tin đã bị sá»­a đổi bên ngoài" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "Lỗi xoá tập tin cÅ©: %s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "GSeekType được cung cấp không hợp lệ" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "Yêu cầu tìm không hợp lệ" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "Không thể cắt GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "Luồng ra bộ nhớ không thể thay đổi kích thước" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "Lỗi thay đổi kích thước luồng ra bộ nhớ" + +#: ../gio/gmemoryoutputstream.c:634 +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:744 +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:753 +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:363 +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:438 +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:515 +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:599 +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:685 +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:765 +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:850 +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:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "Tên máy '%s' có '[' nhưng không có ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "Mạng không thể tiếp cận" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "Máy không thể tiếp cận" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "không thể tạo trình theo dõi mạng: %s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "Không thể tạo trình theo dõi mạng: " + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "Không thể lấy trạng thái mạng: " + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +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:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "Luồng nguồn đã bị đóng" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "Lỗi phân giải '%s': %s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Lỗi phân giải ngược '%s': %s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "Không có loại bản ghi DNS được yêu cầu cho '%s'" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "Tạm thời không thể phân giải '%s'" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "Lỗi phân giải '%s'" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "Nhận dữ liệu không hoàn chỉnh cho '%s'" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "Tài nguyên tại '%s' không tồn tại" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "Tài nguyên tại '%s' gặp lỗi giải nén" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "Tài nguyên tại '%s' không phải là thư mục" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "Luồng nhập vào không thá»±c hiện chức năng seek" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "In trợ giúp" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[LỆNH]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "Danh sách phần chứa tài nguyên cá»§a tập tin elf" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"Danh sách tài nguyên\n" +"Nếu xác định phần, chỉ liệt kê tài nguyên cá»§a phần đó\n" +"Nếu xác định đường dẫn, chỉ liệt kê tài nguyên khớp" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "TẬP-TIN [ĐƯỜNG-DẪN]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "PHẦN" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"Danh sách tài nguyên chi tiết\n" +"Nếu xác định phần, chỉ liệt kê tài nguyên cá»§a phần đó\n" +"Nếu xác định đường dẫn, chỉ liệt kê tài nguyên khớp\n" +"Chi tiết bao gồm phần, kích thước và nén" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "Trích tập tin tài nguyên ra đầu ra" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "ĐƯỜNG DẪN" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"Lệnh lạ '%s'\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Cách dùng:\n" +" gresource [--section PHẦN] LỆNH [THAM-SỐ...]\n" +"\n" +"Lệnh:\n" +" help Hiện thông tin này\n" +" sections Liệt kê các phần tài nguyên\n" +" list Liệt kê tài nguyên\n" +" details Liêt kê tài nguyên chi tiết\n" +" extract Trích tài nguyên\n" +"\n" +"Dùng 'gresource help LỆNH' để biết chi tiết.\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Cách dùng:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "Đối số:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " PHẦN Tên phần elf (tuỳ chọn)\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " LỆNH Lệnh để giải thích (tuỳ chọn)\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " TẬP TIN Tẹn tập tin elf (chương trình hoặc thư viện)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" TẬP TIN Tập tin elf (chương trình hoặc thư viện)\n" +" hoặc tập tin tài nguyên đã biên dịch\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[ĐƯỜNG DẪN]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " ĐƯỜNG DẪN (Một phần) Đường dẫn tài nguyên (tuỳ chọn)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "ĐƯỜNG DẪN" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " ĐƯỜNG DẪN Đường dẫn tài nguyên\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "Không có schema '%s'\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema '%s' không thể tái định vị (không cần xác định đường dấn)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema '%s' có thể tái định vị (cần xác định đường dẫn)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "Đường dẫn rỗng.\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "Đường dẫn phải bắt đầu bằng dấu '/'\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "Đường dẫn phải kết thúc bằng dấu '/'\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "Đường dẫn không được chứa hai dấu gạch chéo liên tiếp (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "Không có khoá '%s'\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "Giá trị cung cấp ngoài phạm vi hợp lệ\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "Danh sách schema (không thể tái định vị) đã cài đặt" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "Danh sách schema (có thể thể tái định vị) đã cài đặt" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "Liệt kê khoá trong SCHEMA" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:ĐƯỜNG DẪN]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "Liệt kê con cá»§a SCHEMA" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"Danh sách khoá và giá trị, đệ quy\n" +"Nếu không cho SCHEMA, liệt kê mọi khoá\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:ĐƯỜNG DẪN]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "Lấy giá trị cá»§a KHOÁ" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:ĐƯỜNG DẪN] KHOÁ" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "Truy vấn khoảng giá trị hợp lệ cho KHOÁ" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "Đặt giá trị GIÁ TRỊ cho KHOÁ" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:ĐƯỜNG DẪN] KHOÁ GIÁ-TRỊ" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "Phục hồi giá trị mặc định cho KHOÁ" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "Phục hồi mọi khoá trong SCHEMA về mặc định" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "Kiểm tra quyền ghi cá»§a KHOÁ" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"Theo dõi thay đổi cá»§a KHOÁ.\n" +"Nếu không xác định KHOÁ, theo dõi mọi khoá trong SCHEMA.\n" +"Nhấn ^C để ngưng.\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:ĐƯỜNG DẪN] [KHOÁ]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"Cách dùng:\n" +" gsettings [--schemadir SCHEMADIR] LỆNH [ĐỐI SỐ...]\n" +"\n" +"Commands:\n" +" help Hiện thông tin này\n" +" list-schemas Liệt kê schema đã cài đặt\n" +" list-relocatable-schemas Liệt kê schema có thể tái định vị\n" +" list-keys Liệt kê khoá trong schema\n" +" list-children Liệt kê khoá con trong schema\n" +" list-recursively Liệt kê khoá và giá trị đệ quy\n" +" range Truy vấn một vùng khoá\n" +" get Lấy giá trị khoá\n" +" set Đặt giá trị khoá\n" +" reset Phục hồi giá trị khoá\n" +" reset-recursively Phục hồi mọi giá trị khoá trong schema\n" +" writable Kiểm tra khoá có ghi được không\n" +" monitor Theo dõi thay đổi\n" +"\n" +"Dùng 'gsettings help LỆNH' để biết chi tiết.\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"Cách dùng:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR Thư mục cần tìm schema bổ sung\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA Tên schema\n" +" PATH Đường dẫn, cho schema tái định vị\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY Khoá trong schema (tuỳ chọn)\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY Khoá trong schema\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE Giá trị cần đặt\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "Tên schema rỗng\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "Socket không hợp lệ, chưa được sÆ¡ khởi" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "Socket không hợp lệ, khởi động thất bại vì: %s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket đã được đóng" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Hết giờ Socket I/O" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "tạo GSocket từ fd: %s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "Không thể tạo socket: %s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "Lỗi họ giao thức không xác định" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "Lỗi giao thức không xác định" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "không thể lấy địa chỉ cục bộ: %s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "không thể lấy địa chỉ ở xa: %s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "không thể lắng nghe: %s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "Lỗi liên kết địa chỉ: %s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "Lỗi tham gia nhóm multicast: %s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "Lỗi rời nhóm multicast: %s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "Không hỗ trợ multicast nguồn xác định" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "Lỗi chấp nhận kết nối: %s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "Kết nối đang hình thành" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "Không thể lấy lỗi đang chờ: %s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "Lỗi nhận dữ liệu: %s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "Lỗi gá»­i dữ liệu: %s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Không thể tắt socket: %s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "Lỗi đóng socket: %s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "Đang chờ socket: %s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "Lỗi gá»­i thông điệp: %s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "GSocketControlMessage không được hỗ trợ trên Windows" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "Lỗi nhận thông điệp: %s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials không được hỗ trợ trên hệ điều hành này" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "Không thể kết nối đến máy uá»· nhiệm %s: " + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "Không thể kết nối đến %s: " + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "không thể kết nối: " + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "Lỗi lạ khi kết nối" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "Không hỗ trợ uá»· nhiệm thông qua kết nối không phải TCP." + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Không hỗ trợ giao thức uá»· nhiệm '%s'." + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "Bên lắng nghe đã đóng" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "Socket được thêm đã đóng" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 không hỗ trợ địa chỉ IPv6 '%s'" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "Tên người dùng hoặc mật khẩu quá dài cho giao thức SOCKSv4" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "Tên máy '%s' quá dài đối cho giao thức SOCKSv4" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "Máy chá»§ không phải là máy uá»· nhiệm SOCKSv4." + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "Kết nối qua máy chá»§ SOCKSv4 bị từ chối" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "Máy chá»§ không phải máy SOCKSv5." + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "Máy uá»· nhiệm SOCKSv5 cần xác thá»±c." + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" +"Máy uá»· nhiệm SOCKSv5 cần dùng phương thức xác thá»±c không được hỗ trợ bởi " +"GLib." + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "Tên người dùng hoặc mật khẩu quá dài cho giao thức SOCKSv5." + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "Xác thá»±c SOCKSv5 thất bại vì sai tên người dùng hoặc mật khẩu." + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "Tên máy '%s' quá dài cho giao thức SOCKSv5" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "Máy chá»§ uá»· nhiệm SOCKSv5 dùng kiểu địa chỉ lạ." + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "Lỗi nội bộ máy chá»§ SOCKSv5." + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "Không cho phép kết nối SOCKSv5 dá»±a theo tập quy tắc." + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "Không thể tiếp cận thông qua máy chá»§ SOCKSv5." + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "Không thể tiếp cận mạng thông qua máy chá»§ SOCKSv5." + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "Kết nối bị từ chối thông qua máy chá»§ SOCKSv5." + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "Uá»· nhiệm SOCKSv5 không hỗ trợ lệnh 'connect' (kết nối)." + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "Uá»· nhiệm SOCKSv5 không hỗ trợ kiểu địa chỉ cung cấp." + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "Lỗi uá»· nhiệm SOCKSv5 lạ." + +#: ../gio/gthemedicon.c:498 +#, 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/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Không thể giải mã khoá riêng mã hoá dạng PEM" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "Không tìm thấy khoá riêng mã hoá dạng PEM" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "Không thể phân tích khoá riêng mã hoá dạng PEM" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "Không tìm thấy chứng nhận mã hoá dạng PEM" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "Không thể phân tích chứng nhận mã hoá dạng PEM" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "Đây là cÆ¡ hội cuối để nhập đúng mật khẩu trước khi truy cập bị khoá." + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"Mật khẩu nhập sai đã vài lần, truy cập cá»§a bạn sẽ bị khoá để ngăn lỗi có thể " +"xảy ra." + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "Mật khẩu nhập sai." + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, 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:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "Gặp dữ liệu bổ sung kiểu bất thường" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "Chờ 1 fd, nhận được %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "Nhận fd không hợp lệ" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "Lỗi gá»­i giấy uá»· nhiệm: " + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "Lỗi kiểm tra nếu SO_PASSCRED được bật cho socket: %s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"Chiều dài tuỳ chọn bất thường khi kiểm tra SO_PASSCRED có được bật cho " +"socket. Chờ %d byte, nhận %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Lỗi bật SO_PASSCRED: %s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" +"Cần đọc một byte duy nhất để nhận giấy uá»· nhiệm nhưng không đọc được byte nào" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "Chờ thông điệp điều khiển, nhận được %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "Lỗi khi tắt SO_PASSCRED: %s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "Gặp lỗi khi đọc từ bộ mô tả tập tin: %s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "Gặp lỗi khi đóng bộ mô tả tập tin: %s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "Gốc hệ thống tập tin" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "Gặp lỗi khi ghi vào bộ mô tả tập tin: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "Địa chỉ socket UNIX trừu tượng không được hỗ trợ trên hệ thống này" + +#: ../gio/gvolume.c:404 +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:480 +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:276 +msgid "Can't find application" +msgstr "Không tìm thấy ứng dụng" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "Gặp lỗi khi khởi chạy ứng dụng: %s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "Không hỗ trợ địa chỉ URI" + +#: ../gio/gwin32appinfo.c:366 +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:378 +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/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "Gặp lỗi khi đọc từ handle: %s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "Gặp lỗi khi đóng handle: %s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "Gặp lỗi khi ghi vào handle: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "Không đủ bộ nhớ" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "Lỗi nội bộ : %s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "Cần thêm đầu vào" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "Sai nén dữ liệu" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "Địa chỉ cần lắng nghe" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "Bỏ qua, mục đích tương thích với GTestDbus" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "Địa chỉ in" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "In địa chỉ trong chế độ hệ vỏ" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "Chạy dịch vụ dbus" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "Tham số sai\n" + +#: ../glib/gbookmarkfile.c:760 +#, 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:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, 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:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "Thẻ bất thường '%s', mong đợi thẻ '%s'" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "Thẻ bất thường '%s' bên trong '%s'" + +#: ../glib/gbookmarkfile.c:1798 +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:1999 +#, 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:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, 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:2377 +#, 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:2462 +#, 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:2841 +#, 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:3239 ../glib/gbookmarkfile.c:3396 +#, 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:3419 +#, 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:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "Character sequence riêng phần ở cuối đầu vào" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Không thể chuyển đổi fallback '%s' thành codeset '%s'" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI '%s' không phải URI tuyệt đối sá»­ dụng lược đồ tập tin" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "URI tập tin cục bộ '%s' có thể không bao gồm '#'" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI '%s' không hợp lệ" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Tên chá»§ cá»§a URI '%s' không hợp lệ" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI '%s' chứa không hợp lệ các ký tá»± thoát" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Tên đường dẫn '%s' không phải một đường dẫn tuyệt đối" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "Tên chá»§ không hợp lệ" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%A, %d %B Năm %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M %p" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "Tháng giêng" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "Tháng hai" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "Tháng ba" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "Tháng tư" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "Tháng năm" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "Tháng sáu" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "Tháng bảy" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "Tháng tám" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "Tháng chín" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "Tháng mười" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "Tháng mười một" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "Tháng mười hai" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Th1" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Th2" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Th3" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Th4" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Th5" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Th6" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Th7" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "Th8" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "Th9" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "Th10" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "Th11" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "Th12" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "Thứ hai" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "Thứ ba" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "Thứ tư" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "Thứ năm" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "Thứ sáu" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "Thứ bảy" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "Chá»§ Nhật" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "T2" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "T3" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "T4" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "T5" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "T6" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "T7" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "CN" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Lỗi khi mở thư mục '%s': %s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Không thẻ cấp phát %lu bytes để đọc tập tin \"%s\"" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Lỗi khi đọc tập tin '%s': %s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "Tập tin \"%s\" quá lớn" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Không đọc được từ tập tin '%s': %s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Lỗi khi mở tập tin '%s': %s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "Không lấy được các thuộc tính cá»§a tập tin '%s': fstat() không được: %s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Không mở được tập tin '%s': fdopen() không được: %s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "" +"Không đổi tên tập tin « %s » thành « %s » được: « g_rename() » không được: %s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Không tạo được tập tin '%s': %s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "Không mở được tập tin '%s': fdopen() không được: %s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Không mở được tập tin '%s': fdopen() không được: %s" + +#: ../glib/gfileutils.c:1093 +#, 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:1137 +#, 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:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Không mở được tập tin '%s': fdopen() không được: %s" + +#: ../glib/gfileutils.c:1282 +#, 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 »: « g_unlink() » thất bại: %s" + +#: ../glib/gfileutils.c:1542 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "Template '%s' không hợp lệ, không nên chứa '%s'" + +#: ../glib/gfileutils.c:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Biểu mẫu '%s' không chứa XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, 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:2104 +msgid "Symbolic links not supported" +msgstr "Không hỗ trợ liên kết tượng trưng" + +#: ../glib/giochannel.c:1415 +#, 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:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "Không thể thá»±c hiện đọc thô trong g_io_channel_read_line_string" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "Để lại dữ liệu chưa được chuyển đổi trong buffer đọc" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "Kênh tận hết trong ký tá»± riêng phần" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "Không thể thá»±c hiện đọc thô trong g_io_channel_read_to_end" + +#: ../glib/gkeyfile.c:720 +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:756 +msgid "Not a regular file" +msgstr "Không phải là một tập tin chuẩn." + +#: ../glib/gkeyfile.c:1156 +#, 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à cặp giá trị khóa, nhóm, hoặc " +"chú thích." + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "Tên nhóm không hợp lệ: %s" + +#: ../glib/gkeyfile.c:1235 +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:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "Tên khoá không hợp lệ: %s" + +#: ../glib/gkeyfile.c:1288 +#, 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:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, 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:1705 +#, 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:1812 ../glib/gkeyfile.c:1928 +#, 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 » có giá trị « %s » không phải là UTF-8." + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, 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:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "" +"Tập tin khóa chứa khóa '%s' trong nhóm '%s' có giá trị không thể diễn giải." + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "Khoá '%s' trong nhóm '%s' có giá trị '%s' trong khi cần %s" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Tập tin khóa không chứa khóa « %s » trong nhóm « %s »." + +#: ../glib/gkeyfile.c:4078 +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 dòng." + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "URI '%s' chứa không hợp lệ các ký tá»± thoát" + +#: ../glib/gkeyfile.c:4242 +#, 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:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "Giá trị số nguyên '%s' ở ngoài phạm vi" + +#: ../glib/gkeyfile.c:4289 +#, 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:4313 +#, 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)." + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "Không lấy được các thuộc tính cá»§a tập tin '%s%s%s%s': fstat() lỗi: %s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "Không ánh xạ được tập tin '%s%s%s%s': mmap() lỗi: %s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Không mở được tập tin '%s': fdopen() không được: %s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "Lỗi trên dòng %d ký tá»± %d: " + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, 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:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "'%s' không phải là tên hợp lệ" + +#: ../glib/gmarkup.c:443 +#, 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:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "Lỗi trên dòng %d: %s" + +#: ../glib/gmarkup.c:636 +#, 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 "" +"Không phân tách được « %-.*s », nó nên là một con số bên trong một tham " +"chiếu ký tá»± (v.d. « ê ») — có lẽ con số quá lớn." + +#: ../glib/gmarkup.c:648 +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 kết thúc bằng dấu chấm phẩy; dường như bạn đã dùng " +"một ký tá»± (và) mà không phải để bắt đầu một thá»± thể - thoát dấu (và) như là " +"&" + +#: ../glib/gmarkup.c:674 +#, 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á»± cho phép." + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Thá»±c thể trống '&;' được thấy; những mục nhập hợp lệ là: & " < " +"> '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Thá»±c thể lạ '%-.*s'" + +#: ../glib/gmarkup.c:725 +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 kết thúc bằng dấu chấm phẩy; dường như bạn đã dùng ký tá»± " +"(và) mà không phải để bắt đầu một thá»± thể - thoát khỏi dấu (và) như là &" + +#: ../glib/gmarkup.c:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "Tài liệu phải bắt đầu bằng một phần tá»­ (vd: )" + +#: ../glib/gmarkup.c:1113 +#, 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 một ký tá»± hợp lệ đi theo ký tá»± '<' ; nó có thể không bắt đầu " +"tên phần tá»­" + +#: ../glib/gmarkup.c:1181 +#, 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:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "Ký tá»± lẻ '%s', mong muốn '=' sau tên thuộc tính '%s' cá»§a phần tá»­ '%s'" + +#: ../glib/gmarkup.c:1306 +#, 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 muốn một ký tá»± '>' hay '/' để kết thúc tag khởi đầu cá»§a " +"phần ỷư '%s', hay tùy ý một thuộc tính; có lẽ bạn đã dùng một ký tá»± bát hợp " +"lệ trong một tên thuộc tính" + +#: ../glib/gmarkup.c:1350 +#, 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 muốn một dấu ngoặc kép sau dấu bằng khi nhận giá trị " +"cho thuộc tính '%s' cá»§a phần tá»­ '%s'" + +#: ../glib/gmarkup.c:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' không phải một ký tá»± hợp lệ đi theo tên phần tá»­ đóng '%s'; ký tá»± được " +"phép là '>'" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Phần tá»­ '%s' đã được đóng, không có phần tá»­ mở hiện thời" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "Phần tá»­ '%s' đã được đóng, nhưng phần tá»­ mở hiện thời là '%s'" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "Tài liệu trống hay chỉ chứa không gian trống" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Tài liệu đã kết thúc không mong muốn ngay sau một dấu ngoặc nhọn mở '<'" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, 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 không mong muốn với các phần tá»­ vẫn còn mở - '%s' là " +"phần tá»­ đã mở cuối cùng" + +#: ../glib/gmarkup.c:1737 +#, 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 không mong muốn, được cho là thấy dấu ngoặc nhọn kết thúc " +"tag <%s/>" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "Tài liệu được kết thúc không mong muốn bên trong tên phần tá»­" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Tài liệu được kết thúc không mong muốn bên trong tên thuộc tính" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Tài liệu được kết thúc không mong muốn bên trong tag cá»§a phần tá»­ mở." + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"Tài liệu kết thúc không mong muốn sau dấu bằng đi theo một tên thuộc tính; " +"không có giá trị thuộc tính" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" +"Tài liệu được kết thúc không mong muốn trong khi nằm trong một giá trị thuộc " +"tính" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"Tài liệu được kết thúc không mong muốn bên trong tag đóng cho phần tá»­ '%s'" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Tài liệu được kết thúc không mong muốn bên trong một ghi chú hay hướng dẫn " +"tiến trình" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "Sá»­ dụng:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[TÙY_CHỌN...]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "Tùy chọn trợ giúp:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "Hiển thị các tùy chọn trợ giúp" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "Hiển thị mọi tùy chọn trợ giúp" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "Tùy chọn ứng dụng:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Không phân tách giá trị số nguyên « %s » cho %s." + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, 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:1014 +#, 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:1022 +#, 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:1285 ../glib/goption.c:1364 +#, 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:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "Thiếu đối số cho %s" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "Không biết tùy chọn %s." + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "đối tượng bị hỏng" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "lỗi nội bộ hay đối tượng bị hỏng" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "hết bộ nhớ" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "không thể rút lùi nữa" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +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:288 +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:297 +msgid "recursion limit reached" +msgstr "không thể đề qui nữa" + +#: ../glib/gregex.c:299 +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:301 +msgid "bad offset" +msgstr "độ lệch sai" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "utf8 ngắn" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "vòng lặp đệ quy" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "lỗi lạ" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ ở kết thúc cá»§a mẫu" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c ở kết thúc cá»§a mẫu" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "có ký tá»± lạ phía sau \\" + +#: ../glib/gregex.c:338 +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:341 +msgid "number too big in {} quantifier" +msgstr "con số quá lớn trong chuỗi xác định số lượng {}" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "thiếu ] chấm dứt cho hạng ký tá»±" + +#: ../glib/gregex.c:347 +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:350 +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:353 +msgid "nothing to repeat" +msgstr "không có gì cần lặp lại" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "lặp lại bất thường" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "không nhận dạng ký tá»± nằm sau (? hoặc (?-" + +#: ../glib/gregex.c:363 +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:366 +msgid "missing terminating )" +msgstr "thiếu ) chấm dứt" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "tham chiếu đến mẫu phụ không tồn tại" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "thiếu ) nằm sau chú thích" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "biểu thức chính quy quá lớn" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "không lấy được bộ nhớ" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr "có ) không có ( đầu tiên" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "tràn mã" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "không nhận dạng ký tá»± nằm sau (?<" + +#: ../glib/gregex.c:393 +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:396 +msgid "malformed number or name after (?(" +msgstr "có con số hay tên dạng sai nằm sau (?(" + +#: ../glib/gregex.c:399 +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:402 +msgid "assertion expected after (?(" +msgstr "mong đợi khẳng định nằm sau (?(" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R hay (?[+-]chữ số phải có ) theo sau" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "không rõ tên hạng POSIX" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "Không hỗ trợ yếu tố đối chiếu POSIX" + +#: ../glib/gregex.c:418 +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:421 +msgid "invalid condition (?(0)" +msgstr "điều kiện không hợp lệ (?(0)" + +#: ../glib/gregex.c:424 +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:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "không hỗ trợ thoát \\L, \\l, \\N{tên}, \\U và \\u" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "lời gọi đệ quy có thể bị lặp vô hạn" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "không nhận dạng ký tá»± nằm sau (?P" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "thiếu dấu chấm dứt trong tên mẫu phụ" + +#: ../glib/gregex.c:444 +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:447 +msgid "malformed \\P or \\p sequence" +msgstr "dãy \\P hay \\p dạng sai" + +#: ../glib/gregex.c:450 +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:453 +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:456 +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:459 +msgid "octal value is greater than \\377" +msgstr "giá trị bát phân lớn hÆ¡n \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "tràn vùng làm việc biên dịch" + +#: ../glib/gregex.c:467 +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:470 +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:473 +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:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "" +"\\g không đi trước một tên có dấu ngoặc móc, ngoặc vuông, tên hoặc số trích " +"dẫn hoặc một con số không phải số thuần tuý" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "tham chiếu đánh số phải khác không" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "không chấp nhận đối số cho (*ACCEPT), (*FAIL) hoặc (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "không nhận ra (*VERB)" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "số quá lớn" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "thiếu tên mẫu phụ sau (?&" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "cần một chữ số sau (?+" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] là kí tá»± không hợp lệ trong chế độ tương thích JavaScript" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "không cho phép tên khác nhau cho mẫu con trong cùng số" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) phải có đối số" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c phải theo sau là một kí tá»± ASCII" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "" +"\\k không đi trước một tên có dấu ngoặc móc, ngoặc vuông, tên trích dẫn" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N không được hỗ trợ trong lớp" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "quá nhiều tham chiếu tới" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "tên quá dài trong (*MARK), (*PRUNE), (*SKIP) hoặc (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "dãy \\u... chứa giá trị ký tá»± quá lớn" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, 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:1319 +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:1323 +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:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "Thư viện PCRE đã biên dịch với tuỳ chọn không tương thích" + +#: ../glib/gregex.c:1390 +#, 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:1432 +#, 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:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "đợi chữ số thập lục hay dấu ngoặc móc đóng '}'" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "đợi chữ số thập lục" + +#: ../glib/gregex.c:2387 +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:2396 +msgid "unfinished symbolic reference" +msgstr "tham chiếu tượng trưng chưa hoàn thành" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "tham chiếu tượng trưng có độ dài số không" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "đợi chữ số" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "tham chiếu tượng trưng không cho phép" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "dấu xuyệc ngược kết thúc rải rác '\\'" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "dãy thoát lạ" + +#: ../glib/gregex.c:2508 +#, 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:88 +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:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" +"Dấu ngoặc kép không ăn khớp trong dòng lệnh hay một shell-quoted text khác" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "Văn bản được kết thúc ngay sau ký tá»± '\\'. (văn bản đã là '%s')" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"Text đã kết thúc trước khi làm khớp dấu ngoặc kép cho %c. (text là '%s')" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "Văn bản trống (hay chỉ gồm các ký tá»± trắng)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Không đọc được dữ liệu từ tiến trình con (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "Lỗi không mong muốn trong select() đọc dữ liệu từ tiến trình con (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Lỗi không mong muốn trong waitpid() (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "Tiến trình con thoát với mã %ld" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "Tiến trình con bị giết bằng tín hiệu %ld" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "Tiến trình con bị dừng bằng tín hiệu %ld" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "Tiến trình con thoát bất thường" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Không đọc được từ pipe con (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Không rẽ nhánh được (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Không thay đổi được thư mục '%s' (%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Không thá»± thi được tiến trình con \"%s\" (%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "Không gá»­i được lần nữa đầu ra hay đầu vào cá»§a tiến trình con (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Không rẽ nhánh được tiến trình con (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Lỗi không xác định khi thá»±c thi tiến trình con \"%s\"" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "Không đọc được đủ dữ liệu từ pid pipe con(%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Không tạo được pipe để liên lạc với tiến trình con (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "Không đọc được dữ liệu từ tiến trình con" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Không thá»±c thi được tiến trình con (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "Tên chương trình không hợp lệ: %s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "Gặp chuỗi không hợp lệ trong véc-tÆ¡ đối số tại %d: %s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "Gặp chuỗi không hợp lệ trong môi trường: %s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, 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:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Lỗi thá»±c thi chương trình bổ trợ (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"Lỗi không mong muốn trong g_io_channel_win32_poll() đọc dữ liệu từ tiến " +"trình con" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "Ký tá»± nằm ngoài vùng UTF-8" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "Sequence bất hợp lệ trong đầu vào chuyển đổi" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "Ký tá»± nằm ngoài vùng UTF-16" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s byte" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "Chương trình kết thúc bất thường khi chạy lệnh `%s: %s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "Lệnh `%s' thoát với mã khác không %d: %s" + +#~ 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" + +#~ 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)" + +#~ 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)" + +#~ msgid "No service record for '%s'" +#~ msgstr "Không có bản ghi dịch vụ (service record) cho '%s'" + +#~ msgid "File is empty" +#~ msgstr "Tập tin rỗng." + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "" +#~ "Tập tin khóa chứa khóa « %s » có giá trị không có khả năng giải dịch." + +#~ msgid "This option will be removed soon." +#~ msgstr "Tuỳ chọn này sẽ sớm bị bỏ." + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "Gặp lỗi khi lấy trạng thái về tập tin '%s': %s" + +#~ msgid "Error connecting: " +#~ msgstr "Lỗi kết nối: " + +#~ msgid "Error connecting: %s" +#~ msgstr "Lỗi kết nối: %s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "Bản SOCKSv4 giới hạn tên người dùng trong %i ký tá»±" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "Bản SOCKSv4 giới hạn tên máy trong %i ký tá»±" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "Gặp lỗi khi đọc từ UNIX: %s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "Gặp lỗi khi đóng UNIX: %s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "Gặp lỗi khi ghi vào UNIX: %s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "am" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "pm" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "Kiểu giá trị trả về không đúng, nhận `%s' nhưng muốn `%s'" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "Thá»­ đặt thuộc tính %s cá»§a kiểu %s nhưng theo giao diện muốn dùng thì kiểu " +#~ "là %s" + +#~ msgid "The nonce-file `%s' was %" +#~ msgstr "nonce-file `%s' là %" + +#~ msgid "Encountered array of length %" +#~ msgstr "Bắt gặp mảng dài %" + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "Lỗi ghi 16 byte đầu tiên cá»§a thông điệp vào socket: " + +#~ msgid "Do not give error for empty directory" +#~ msgstr "Không thông báo lỗi với thư mục rỗng" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "Lệnh:\n" +#~ " help Hiện những thông tin này\n" +#~ " get Lấy giá trị cá»§a khoá\n" +#~ " set Đặt giá trị cho khoá\n" +#~ " monitor Theo dõi thay đổi cá»§a khoá\n" +#~ " writable Kiểm tra khoá ghi được không\n" +#~ "\n" +#~ "Dùng '%s LỆNH --help' để biết thêm chi tiết.\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "Xác định đường dẫn cho schema" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "Đối số:\n" +#~ " SCHEMA id cá»§a schema\n" +#~ " KEY Tên khoá\n" +#~ " VALUE Giá trị cần đặt, theo kiểu GVariant tuần tá»± hoá\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "Khoá %s không ghi được\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "Theo dõi các thay đổi trên KHOÁ và in ra.\n" +#~ "Theo dõi sẽ tiếp tục đến khi tiến trình kết thúc." diff --git a/po/wa.po b/po/wa.po new file mode 100644 index 0000000..0fce2a3 --- /dev/null +++ b/po/wa.po @@ -0,0 +1,3773 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2004-05-03 14:40+0200\n" +"Last-Translator: Pablo Saratxaga \n" +"Language-Team: Walloon \n" +"Language: \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:780 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, 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:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, 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:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "" + +#: ../glib/gconvert.c:2036 +#, 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:2046 +msgid "Invalid hostname" +msgstr "No d' lodjoe nén valide" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "Li %A %d di %B %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %p" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "djanvî" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "fevrî" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "mÃ¥ss" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "avri" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "may" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "djun" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "djulete" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "dja" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "fev" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "mÃ¥s" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "avr" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "may" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "djn" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "djl" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "londi" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "mÃ¥rdi" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "mierkidi" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "djudi" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "vénrdi" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "semdi" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "dimegne" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "lon" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "mÃ¥r" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "mie" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "dju" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "vén" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "sem" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "dim" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, 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:555 +#, 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:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, 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:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Dji n' a savou drovi li fitchî «%s»: %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, 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:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, 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:962 +#, 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:1006 +#, 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:1030 +#, 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:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, 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:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "Li patron «%s» èn finixh nén avou XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, 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:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, 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:229 +#, 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:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Aroke el roye %d caractere %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, 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:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Aroke el roye %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Vude intité «&;» di trovêye; les intités valides sont: & " < " +"> '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Li no d' intité «%s» n' est nén cnoxhou" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Li documint doet cmincî avou èn elemint (eg: )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" + +#: ../glib/gmarkup.c:1186 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Li documint esteut vude ou avou seulmint des blancs" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +msgid "missing terminating ] for character class" +msgstr "" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +msgid "unrecognized character after (?" +msgstr "" + +#: ../glib/gregex.c:299 +msgid "unrecognized character after (?<" +msgstr "" + +#: ../glib/gregex.c:303 +msgid "unrecognized character after (?P" +msgstr "" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, 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:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +msgid "unfinished symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Li tecse esteut vude (ou avou seulmint des blancs)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Dji n' a savou lére do process efant" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, 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:369 ../glib/gspawn.c:1383 +#, 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:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Dji n' a savou enonder l' process efant (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "No d' lodjoe nén valide" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Secwince nén valide e l' intrêye do cviersaedje" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, 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:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Dji n' a savou enonder l' aidant programe" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Dji n' a savou fé on fork() (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Dji n' a savou enonder l' process efant «%s» (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Dji n' a savou fé on fork do process efant (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Aroke nén cnoxhowe tot-z enondant l' processus efant «%s»" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "Caractere foû fortchete po l' ecôdaedje UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Secwince nén valide e l' intrêye do cviersaedje" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Caractere foû fortchete po l' ecôdaedje UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "No d' lodjoe nén valide" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "No d' lodjoe nén valide" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Secwince d' octets nén valide e l' intrêye do cviersaedje" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Aroke el roye %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Li caractere «%s» n' est nén valide dins on no d' intité" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Li caractere «%s» n' est nén valide dins on no d' intité" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Li caractere «%s» n' est nén valide dins on no d' intité" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/gfile.c:2762 +#, 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:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "No d' lodjoe nén valide" + +#: ../gio/glocalfile.c:948 +#, 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:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, 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:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "No d' lodjoe nén valide" + +#: ../gio/glocalfile.c:1300 +#, 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:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, 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:1808 +#, 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:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Åk n' a nén stî tot drovant l' ridant «%s»: %s" + +#: ../gio/glocalfile.c:2162 +#, 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:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, 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:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, 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:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "" + +#: ../gio/glocalfileinfo.c:773 +#, 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:1482 ../gio/glocalfileoutputstream.c:833 +#, 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:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, 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:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Aroke el roye %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, 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:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, 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:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, 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:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, 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:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, 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:328 +#, 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:516 ../gio/glocalfileoutputstream.c:1083 +#, 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:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, 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:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, 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:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "No d' lodjoe nén valide" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, 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:829 +#, 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:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, 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:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, 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:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, 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:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:1875 +#, 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:2050 +#, 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:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Dji n' a savou askepyî l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:2242 +#, 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:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, 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:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, 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:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Aroke el roye %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Åk n' a nén stî tot cviersant: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Loyéns simbolikes nén sopoirtés" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Åk n' a nén stî tot léjhant l' fitchî «%s»: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 « & »" + +#, 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.po b/po/xh.po new file mode 100644 index 0000000..98cb45f --- /dev/null +++ b/po/xh.po @@ -0,0 +1,3863 @@ +# 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: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2005-02-08 12:31+0200\n" +"Last-Translator: Canonical Ltd \n" +"Language-Team: Xhosa \n" +"Language: xh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"Uphawu olutenxileyo '%s', lulindele '=' emva kwegama lophawu '%s' " +"lwesiqalelo '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +#, fuzzy +msgid "No valid bookmark file found in data dirs" +msgstr "" +"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, 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:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "Akukwazekanga ukuvula isiguquli ukusuka ku '%s' ukuya ku '%s'" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "Inxalenye yophawu lolandelelwano ekupheleni kongeniso-lwazi" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "Akukwazeki ukuguqula i-fallback '%s' kwiseti yekhowudi '%s'" + +#: ../glib/gconvert.c:1886 +#, 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:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "I-URI yefayili yendawo '%s' kunokwenzeka ingaquki i-'#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "Ayisebenzi i-'%s' yeURI" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "Igama lomququzeleli weURI '%s' alisebenzi" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "I-URI '%s' iqulethe iimpawu ezisindileyo ezingasebenziyo" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "Igama lendlela yothungelwano '%s' akuyiyo kuphela indlela" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "Igama lomququzeleli elingasebenziyo" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%a %-e %b %Y %T %Z" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%Y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%T" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "eyoMqungu" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "eyoMdumba" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "eyoKwindla" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "uTshazimpuzi" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "uCanzibe" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "eyeSilimela" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "eyeKhala" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "Mqu" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "Mdu" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "Kwi" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "Tsh" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "Can" + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "Sil" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "Kha" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "uMvulo" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "lwesiBini" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "lwesiThathu" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "ulweSine" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "lwesiHlanu" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "uMgqibelo" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "iCawa" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "Mvu" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "Bin" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "Tha" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "Sin" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "Hla" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "Mgq" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "Caw" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\"" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "Akuphumelelekanga ukufunda ifayili '%s': %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, 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:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gfileutils.c:862 +#, 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:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../glib/gfileutils.c:918 +#, 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:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "I-Template '%s' ayisebenzi, kufuneka ingaqulathi i '%s'" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "I-Template '%s' ayipheli ngo XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "Akuphumelelekanga ukuvula ifayili '%s': fdopen() akuphumelelekanga: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "Impazamo emgceni %d uphawu %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "Umbhalo onxulumanisayo ongasebenziyo we- UTF-8" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "Impazamo emgceni %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "Uphawu lokuthumela '%-.*s' alulunxulumanisi uphawu olunemvume" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"Into ezimeleyo eze '&;' ebonwayo; izinto ezizimeleyo ezisebenzayo: & " +"" < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "Igama lento ezimeleyo '%s' alaziwa" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "Uxwebhu kufuneka luqale ngesiqalelo (umzkl. )" + +#: ../glib/gmarkup.c:1118 +#, 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:1186 +#, 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:1270 +#, 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:1311 +#, 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:1355 +#, 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:1488 +#, 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:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "Isiqalelo '%s' besivaliwe, akukho siqalelo sivuliweyo njengangoku" + +#: ../glib/gmarkup.c:1544 +#, 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:1712 +msgid "Document was empty or contained only whitespace" +msgstr "Uxwebhu beluze okanye luqulathe isikhewu esimhlophe kuphela" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "" +"Uxwebhu luphele ngesiquphe kanye emva kwesibiyeli sedolo elivulekileyo '<'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, 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:1742 +#, 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:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lesiqalelo" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lophawu" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwelebhile evula isiqalelo." + +#: ../glib/gmarkup.c:1765 +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:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "Uxwebhu luphele ngesiquphe xeshikweni lungaphakathi kwexabiso lophawu" + +#: ../glib/gmarkup.c:1788 +#, 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:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"Uxwebhu luphele ngesiquphe ngaphaikathi komyalelo wezimvo okanye inkqubo" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "Isiqhagamshelanisi siphelela inxalenye yophawu" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "Uphawu lokuthumela olungagqitywanga" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +#, fuzzy +msgid "POSIX collating elements are not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "Impazamo emgceni %d uphawu %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "Into ezimeleyo yokuthumela engagqitywanga" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "Umbhalo ocatshuliweyo awuqali ngophawu locaphulo" + +#: ../glib/gshell.c:181 +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:559 +#, 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:566 +#, 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:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "Umbhalo ubuze (okanye uqulethe isithuba esimhlophe kuphela)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, 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:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "Akuphumelelekanga ukufunda kuthungelwano lomntwana (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "Akuphumelelekanga ukuguqukela kuvimba weefayili '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomncedi" + +#: ../glib/gspawn-win32.c:997 +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:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "Akuphumelelekanga ukufunda idata kwinkqubo yomntwana (%s)" + +#: ../glib/gspawn.c:347 +#, 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:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "Impazamo engalindelekanga kwi-waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "Akuphumelelekanga ukudala inkqubo entsha (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "Akuphumelelekanga ukuphumeza inkqubo yomntwana \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, 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:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "Akuphumelelekanga ukudala inkqubo entsha yomntwana (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "Impazamo engaziwayo yokuphumeza inkqubo yomntwana \"%s\"" + +#: ../glib/gspawn.c:1444 +#, 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:1086 +msgid "Character out of range for UTF-8" +msgstr "Uphawu lungaphandle kwesigaba se-UTF-8" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "Ulandelelwano olungasebenziyo kwinguqulo yongeniso-lwazi" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "Uphawu lungaphandle kwesigaba se-UTF-16" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "Ukusetyenziswa:" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "[OPTION...]" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "Uncedo lokunokukhethwa:" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "Bonisa amancedo anokukhethwa" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "Bonisa onke amancedo anokukhethwa" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "Iindlela zokusebenza ezinokukhethwa:" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, fuzzy, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: ../glib/goption.c:1032 +#, fuzzy, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "Akukwazeki ukwahlula ngezijungqe ixabiso lanani elimbaxa '%s' for --%s" + +#: ../glib/goption.c:1040 +#, fuzzy, c-format +msgid "Double value '%s' for %s out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "Ukhetho olungaziwayo %s" + +#: ../glib/gkeyfile.c:366 +#, fuzzy +msgid "Valid key file could not be found in search dirs" +msgstr "" +"Iqhosha elisebenzayo lefayili alifumanekanga kwidata yoovimba beefayili" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "Asiyofayili esebenza rhoqo" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "Ifayili ize" + +#: ../glib/gkeyfile.c:768 +#, 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:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "Ifayili engundoqo ayiqali ngeqela" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "Ifayili engundoqo iqulethe unxulumano olungaxhaswanga '%s'" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "Ifayili engundoqo ayinalo iqela '%s'" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "Ifayili engundoqo ayinalo iqhosha '%s'" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, 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:1450 ../glib/gkeyfile.c:1934 +#, 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:1566 +#, 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:2151 ../glib/gkeyfile.c:2515 +#, 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:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "Ifayili engundoqo ayinalo iqhosha '%s' eqeleni '%s'" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "Ifayili engundoqo iqulethe uphawu lokuphepha ekupheleni komgca" + +#: ../glib/gkeyfile.c:3730 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "" +"Ifayili engundoqo iqulethe ulandelelwano olungasebenziyo lokuphepha '%s'" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani." + +#: ../glib/gkeyfile.c:3886 +#, fuzzy, c-format +msgid "Integer value '%s' out of range" +msgstr "Ixabiso lenani elimbaxa '%s' le %s lingaphaya kwesigaba" + +#: ../glib/gkeyfile.c:3919 +#, fuzzy, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "Ixabiso '%s' alinakho ukuchazwa njengenani." + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "Ixabiso '%s' alinakho ukuchazwa njenge-boolean." + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "Ulandelelwano olungasebenziyo lwe-byte kungeniso-lwazi yenguqulo" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +#, 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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, fuzzy, c-format +msgid "Unknown bus type %d" +msgstr "Ukhetho olungaziwayo %s" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +#, fuzzy +msgid "Abstract name space not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "Impazamo emgceni %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "Uphawu '%s' alusebenzi ngaphakathi kwegama lento ezimeleyo" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "Uphawu '%s' alusebenzi ngaphakathi kwegama lento ezimeleyo" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "Uphawu '%s' alusebenzi ngaphakathi kwegama lento ezimeleyo" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +#, 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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +#, fuzzy +msgid "Splice not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +#, fuzzy +msgid "Trash not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +#, fuzzy +msgid "empty names are not permitted" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "Akuphumelelanga ukufunda ikhonkco elingumfuziselo '%s': %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "Uxwebhu luphele ngesiquphe ngaphakathi kwegama lophawu" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "Impazamo yokuvula uvimba weefayili '%s': %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "Impazamo emgceni %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, fuzzy, c-format +msgid "Setting attribute %s not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +#, fuzzy +msgid "Target file is not a regular file" +msgstr "Asiyofayili esebenza rhoqo" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "Igama lomququzeleli elingasebenziyo" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, fuzzy, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "Ukhetho olungaziwayo %s" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "Akwazekanga ukwaba %lu ii-byte ukufunda ifayili \"%s\"" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "Akuphumelelekanga ukudala ifayili '%s': %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "Impazamo emgceni %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "Impazamo ngelixa lenguqulo: %s" + +#: ../gio/gwin32appinfo.c:335 +#, fuzzy +msgid "URIs not supported" +msgstr "Ikhonkco elingumfuziselo alixhaswanga" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "Impazamo yokufunda ifayili '%s': %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/yi.po new file mode 100644 index 0000000..a879031 --- /dev/null +++ b/po/yi.po @@ -0,0 +1,3820 @@ +# Yiddish version +# Copyright (C) 2003 Free Software Foundation, Inc. +# Raphael Finkel , 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2011-09-04 23:56-0400\n" +"PO-Revision-Date: 2003-03-19\n" +"Last-Translator: Raphael Finkel \n" +"Language-Team: Yiddish \n" +"Language: yi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../glib/gbookmarkfile.c:780 +#, fuzzy, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם " +"עלעמענט '%s'" + +#: ../glib/gbookmarkfile.c:791 ../glib/gbookmarkfile.c:862 +#: ../glib/gbookmarkfile.c:872 ../glib/gbookmarkfile.c:979 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "" + +#: ../glib/gbookmarkfile.c:1149 ../glib/gbookmarkfile.c:1214 +#: ../glib/gbookmarkfile.c:1278 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "" + +#: ../glib/gbookmarkfile.c:1174 ../glib/gbookmarkfile.c:1188 +#: ../glib/gbookmarkfile.c:1256 ../glib/gbookmarkfile.c:1308 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:1834 +msgid "No valid bookmark file found in data dirs" +msgstr "" + +#: ../glib/gbookmarkfile.c:2035 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "" + +#: ../glib/gbookmarkfile.c:2081 ../glib/gbookmarkfile.c:2239 +#: ../glib/gbookmarkfile.c:2324 ../glib/gbookmarkfile.c:2404 +#: ../glib/gbookmarkfile.c:2489 ../glib/gbookmarkfile.c:2572 +#: ../glib/gbookmarkfile.c:2650 ../glib/gbookmarkfile.c:2729 +#: ../glib/gbookmarkfile.c:2771 ../glib/gbookmarkfile.c:2868 +#: ../glib/gbookmarkfile.c:2994 ../glib/gbookmarkfile.c:3184 +#: ../glib/gbookmarkfile.c:3260 ../glib/gbookmarkfile.c:3425 +#: ../glib/gbookmarkfile.c:3514 ../glib/gbookmarkfile.c:3604 +#: ../glib/gbookmarkfile.c:3732 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2413 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2498 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:2877 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3278 ../glib/gbookmarkfile.c:3435 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "" + +#: ../glib/gbookmarkfile.c:3458 +#, fuzzy, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../glib/gconvert.c:567 ../glib/gconvert.c:645 ../glib/giochannel.c:1404 +#: ../gio/gcharsetconverter.c:458 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "פֿאַרװאַנדלונג פֿון קאָדירונג %s צו %s ניט געשטיצט" + +#: ../glib/gconvert.c:571 ../glib/gconvert.c:649 +#: ../gio/gcharsetconverter.c:462 +#, fuzzy, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "ניט געקענט עפֿענען פֿאַרװאַנדלער פֿון %s צו %s: %s" + +#: ../glib/gconvert.c:768 ../glib/gconvert.c:1162 ../glib/giochannel.c:1576 +#: ../glib/giochannel.c:1618 ../glib/giochannel.c:2461 ../glib/gutf8.c:1012 +#: ../glib/gutf8.c:1463 ../gio/gcharsetconverter.c:345 +#: ../gio/gdatainputstream.c:854 ../gio/gdatainputstream.c:1291 +msgid "Invalid byte sequence in conversion input" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: ../glib/gconvert.c:777 ../glib/gconvert.c:1087 ../glib/giochannel.c:1583 +#: ../glib/giochannel.c:2473 ../gio/gcharsetconverter.c:350 +#, c-format +msgid "Error during conversion: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../glib/gconvert.c:809 ../glib/gutf8.c:1008 ../glib/gutf8.c:1218 +#: ../glib/gutf8.c:1355 ../glib/gutf8.c:1459 +msgid "Partial character sequence at end of input" +msgstr "האַלבע כאַראַקטער־סעקװענץ צום סוף פֿון אַרײַנשרײַב" + +#: ../glib/gconvert.c:1059 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "ניט געקענט פֿאַרװאַנדלען גרונטבאַטרעף %s צו קאָדירונג %s" + +#: ../glib/gconvert.c:1886 +#, fuzzy, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "דער URI %s איז ניט אַבסאָלוט לױט דער טעקע־סכעמע" + +#: ../glib/gconvert.c:1896 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "דער לאָקאַלער טעקע־URI %s טאָר ניט כּולל זײַן אַ '#'" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "דער URI %s איז אומלעקסיק" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "דער מאַשין־נאָמען פֿונעם URI %s איז אומלעקסיק" + +#: ../glib/gconvert.c:1941 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס" + +#: ../glib/gconvert.c:2036 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "די פּאַפּקע־רשימה %s איז ניט אַבסאָלוט" + +#: ../glib/gconvert.c:2046 +msgid "Invalid hostname" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:202 +msgctxt "GDateTime" +msgid "AM" +msgstr "AM" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:204 +msgctxt "GDateTime" +msgid "PM" +msgstr "PM" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Z %H:%M:%S %Y %b %d %a" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%d/%m/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%I:%M:%S %P" + +#: ../glib/gdatetime.c:229 +msgctxt "full month name" +msgid "January" +msgstr "יאַנואַר" + +#: ../glib/gdatetime.c:231 +msgctxt "full month name" +msgid "February" +msgstr "פֿעברואַר" + +#: ../glib/gdatetime.c:233 +msgctxt "full month name" +msgid "March" +msgstr "מאַרץ" + +#: ../glib/gdatetime.c:235 +msgctxt "full month name" +msgid "April" +msgstr "אַפּריל" + +#: ../glib/gdatetime.c:237 +msgctxt "full month name" +msgid "May" +msgstr "מײַ" + +#: ../glib/gdatetime.c:239 +msgctxt "full month name" +msgid "June" +msgstr "יוני" + +#: ../glib/gdatetime.c:241 +msgctxt "full month name" +msgid "July" +msgstr "יולי" + +#: ../glib/gdatetime.c:243 +msgctxt "full month name" +msgid "August" +msgstr "" + +#: ../glib/gdatetime.c:245 +msgctxt "full month name" +msgid "September" +msgstr "" + +#: ../glib/gdatetime.c:247 +msgctxt "full month name" +msgid "October" +msgstr "" + +#: ../glib/gdatetime.c:249 +msgctxt "full month name" +msgid "November" +msgstr "" + +#: ../glib/gdatetime.c:251 +msgctxt "full month name" +msgid "December" +msgstr "" + +#: ../glib/gdatetime.c:266 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "יאַנ" + +#: ../glib/gdatetime.c:268 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "פֿעב" + +#: ../glib/gdatetime.c:270 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "מאַר" + +#: ../glib/gdatetime.c:272 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "אַפּר" + +#: ../glib/gdatetime.c:274 +msgctxt "abbreviated month name" +msgid "May" +msgstr "מײַ " + +#: ../glib/gdatetime.c:276 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "יונ" + +#: ../glib/gdatetime.c:278 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "יול" + +#: ../glib/gdatetime.c:280 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "" + +#: ../glib/gdatetime.c:282 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "" + +#: ../glib/gdatetime.c:284 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "" + +#: ../glib/gdatetime.c:286 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "" + +#: ../glib/gdatetime.c:288 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "" + +#: ../glib/gdatetime.c:303 +msgctxt "full weekday name" +msgid "Monday" +msgstr "מאָנטיק" + +#: ../glib/gdatetime.c:305 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "דינסטיק" + +#: ../glib/gdatetime.c:307 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "מיטװאָך" + +#: ../glib/gdatetime.c:309 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "דאָנערשטיק" + +#: ../glib/gdatetime.c:311 +msgctxt "full weekday name" +msgid "Friday" +msgstr "פֿרײַטיק" + +#: ../glib/gdatetime.c:313 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "שבת" + +#: ../glib/gdatetime.c:315 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "זונטיק" + +#: ../glib/gdatetime.c:330 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "מאָנ'" + +#: ../glib/gdatetime.c:332 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "דינ'" + +#: ../glib/gdatetime.c:334 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "מיט'" + +#: ../glib/gdatetime.c:336 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "דאָנ'" + +#: ../glib/gdatetime.c:338 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "פֿרײַ'" + +#: ../glib/gdatetime.c:340 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "שבת" + +#: ../glib/gdatetime.c:342 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "זונ'" + +#: ../glib/gdir.c:115 ../glib/gdir.c:138 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../glib/gfileutils.c:540 ../glib/gfileutils.c:628 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s" + +#: ../glib/gfileutils.c:555 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../glib/gfileutils.c:569 +#, c-format +msgid "File \"%s\" is too large" +msgstr "" + +#: ../glib/gfileutils.c:652 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "ניט געקענט לײענען טעקע %s: %s" + +#: ../glib/gfileutils.c:703 ../glib/gfileutils.c:790 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "ניט געקענט עפֿענען טעקע '%s': %s" + +#: ../glib/gfileutils.c:720 ../glib/gmappedfile.c:169 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "ניט געקענט באַקומען אַטריבוטן פֿון טעקע %s: fstat() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:754 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:862 +#, fuzzy, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:904 ../glib/gfileutils.c:1449 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../glib/gfileutils.c:918 +#, fuzzy, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:943 +#, fuzzy, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:962 +#, fuzzy, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:1006 +#, fuzzy, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:1030 +#, fuzzy, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gfileutils.c:1152 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "" + +#: ../glib/gfileutils.c:1412 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "מוסטער %s אומלעקסיק, טאָר ניט כּולל זײַן %s" + +#: ../glib/gfileutils.c:1425 +#, fuzzy, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "מוסטער %s ענדיקט זיך ניט מיט XXXXXX" + +#: ../glib/gfileutils.c:2001 ../glib/gfileutils.c:2029 +#: ../glib/gfileutils.c:2134 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2007 +#, c-format +msgid "%.1f KiB" +msgstr "" + +#: ../glib/gfileutils.c:2010 +#, c-format +msgid "%.1f MiB" +msgstr "" + +#: ../glib/gfileutils.c:2013 +#, c-format +msgid "%.1f GiB" +msgstr "" + +#: ../glib/gfileutils.c:2016 +#, c-format +msgid "%.1f TiB" +msgstr "" + +#: ../glib/gfileutils.c:2019 +#, c-format +msgid "%.1f PiB" +msgstr "" + +#: ../glib/gfileutils.c:2022 +#, c-format +msgid "%.1f EiB" +msgstr "" + +#: ../glib/gfileutils.c:2035 +#, c-format +msgid "%.1f kB" +msgstr "" + +#: ../glib/gfileutils.c:2038 ../glib/gfileutils.c:2147 +#, c-format +msgid "%.1f MB" +msgstr "" + +#: ../glib/gfileutils.c:2041 ../glib/gfileutils.c:2152 +#, c-format +msgid "%.1f GB" +msgstr "" + +#: ../glib/gfileutils.c:2044 ../glib/gfileutils.c:2157 +#, c-format +msgid "%.1f TB" +msgstr "" + +#: ../glib/gfileutils.c:2047 ../glib/gfileutils.c:2162 +#, c-format +msgid "%.1f PB" +msgstr "" + +#: ../glib/gfileutils.c:2050 ../glib/gfileutils.c:2167 +#, c-format +msgid "%.1f EB" +msgstr "" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gfileutils.c:2087 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../glib/gfileutils.c:2142 +#, c-format +msgid "%.1f KB" +msgstr "" + +#: ../glib/gfileutils.c:2210 +#, fuzzy, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../glib/gfileutils.c:2231 +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:2057 +#: ../glib/giochannel.c:2144 +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:150 +#, fuzzy, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gmappedfile.c:229 +#, fuzzy, c-format +msgid "Failed to map file '%s': mmap() failed: %s" +msgstr "ניט געקענט עפֿענען טעקע %s: fdopen() איז דורכגעפֿאַלן: %s" + +#: ../glib/gmarkup.c:355 ../glib/gmarkup.c:396 +#, fuzzy, c-format +msgid "Error on line %d char %d: " +msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s" + +#: ../glib/gmarkup.c:418 ../glib/gmarkup.c:501 +#, fuzzy, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "אומלעקסיק UTFÖ¾8 קאָדירטער טעקסט" + +#: ../glib/gmarkup.c:429 +#, c-format +msgid "'%s' is not a valid name " +msgstr "" + +#: ../glib/gmarkup.c:445 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "" + +#: ../glib/gmarkup.c:554 +#, c-format +msgid "Error on line %d: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: ../glib/gmarkup.c:638 +#, 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:650 +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:676 +#, fuzzy, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "שריפֿטצײכן־רעפֿערענץ '%s' קאָדירט ניט קײן דערלאָזטן שריפֿטצײכן" + +#: ../glib/gmarkup.c:714 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "" +"לײדיקער אײנס '&;' געזען; לעקסיקע אײנסן זײַנען: & " < > '" + +#: ../glib/gmarkup.c:722 +#, fuzzy, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "אײנסנאָמען %s איז ניט באַקאַנט" + +#: ../glib/gmarkup.c:727 +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:1078 +msgid "Document must begin with an element (e.g. )" +msgstr "דאָקומענט מוז אָנהײבן מיט אַן עלעמענט (װי למשל )" + +#: ../glib/gmarkup.c:1118 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "" +"'%s' איך ניט קײן לעקסיקער שריפֿטצײכן נאָך אַ '‪<‬' שריפֿטצײכן;עס טאָר ניט אָנהײבן " +"קײן אײנסנאָמען" + +#: ../glib/gmarkup.c:1186 +#, fuzzy, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '‪>‬' שריפֿטצײכן צו ענדיקן דעם אָנהײב־הענטל " +"פֿונעם עלעמענט '%s'" + +#: ../glib/gmarkup.c:1270 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "" +"מאָדנע שריפֿטצײכן '%s'; דערװאַרט אַ '=' שריפֿטצײכן נאָך אַטריבוט־נאָמען %s פֿונעם " +"עלעמענט '%s'" + +#: ../glib/gmarkup.c:1311 +#, 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:1355 +#, 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:1488 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "" +"'%s' איז ניט קײן לעקסיקער שריפֿטצײכן נאָך דעם שלאָס־עלעמענט נאָמען '%s'; מען מוז " +"שטעלן '‪>‬'" + +#: ../glib/gmarkup.c:1535 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "עלעמענט '%s' איז פֿאַרמאַכט; קײן עלעמענט איז דערװײַל אָפֿן" + +#: ../glib/gmarkup.c:1544 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "עלעמענט '%s' איז פֿאַרמאַכט; דער איצטיקער אָפֿענער עלעמענט איז '%s'" + +#: ../glib/gmarkup.c:1712 +msgid "Document was empty or contained only whitespace" +msgstr "דאָקומענט איז פּוסט אָדער איז כּולל בלױז לײדיק אָרט" + +#: ../glib/gmarkup.c:1726 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך אַן עפֿן־צײכן '‪<‬'" + +#: ../glib/gmarkup.c:1734 ../glib/gmarkup.c:1779 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט מיט אָפֿענע עלעמענטן; '%s' איז געװען דער " +"לעצט־געעפֿנטער עלעמענט" + +#: ../glib/gmarkup.c:1742 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט; דערװאַרט אַ שלאָס־צײכן '‪>‬' צו ענדיקן דעם " +"הענטל ‪<%s/>‬" + +#: ../glib/gmarkup.c:1748 +msgid "Document ended unexpectedly inside an element name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־נאָמען" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־נאָמען" + +#: ../glib/gmarkup.c:1759 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן עלעמענט־עפֿן הענטל" + +#: ../glib/gmarkup.c:1765 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט נאָך דעם '=' שריפֿטצײכן נאָך אַן אַטריבוט־" +"נאָמען אָן קײן אַטריבוט־באַטרעף" + +#: ../glib/gmarkup.c:1772 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־באַטרעף" + +#: ../glib/gmarkup.c:1788 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון דעם שלאָס־הענטל פֿון עלעמענט " +"'%s'" + +#: ../glib/gmarkup.c:1794 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "" +"דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַ קאָמענטאַר אָדער אַ באַאַרבעטן־" +"באַפֿעל" + +#: ../glib/gregex.c:189 +msgid "corrupted object" +msgstr "" + +#: ../glib/gregex.c:191 +msgid "internal error or corrupted object" +msgstr "" + +#: ../glib/gregex.c:193 +msgid "out of memory" +msgstr "" + +#: ../glib/gregex.c:198 +msgid "backtracking limit reached" +msgstr "" + +#: ../glib/gregex.c:210 ../glib/gregex.c:218 +msgid "the pattern contains items not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:212 ../gio/glocalfile.c:2107 +msgid "internal error" +msgstr "" + +#: ../glib/gregex.c:220 +msgid "back references as conditions are not supported for partial matching" +msgstr "" + +#: ../glib/gregex.c:229 +msgid "recursion limit reached" +msgstr "" + +#: ../glib/gregex.c:231 +msgid "workspace limit for empty substrings reached" +msgstr "" + +#: ../glib/gregex.c:233 +msgid "invalid combination of newline flags" +msgstr "" + +#: ../glib/gregex.c:235 +msgid "bad offset" +msgstr "" + +#: ../glib/gregex.c:237 +msgid "short utf8" +msgstr "" + +#: ../glib/gregex.c:241 +msgid "unknown error" +msgstr "" + +#: ../glib/gregex.c:261 +msgid "\\ at end of pattern" +msgstr "" + +#: ../glib/gregex.c:264 +msgid "\\c at end of pattern" +msgstr "" + +#: ../glib/gregex.c:267 +msgid "unrecognized character follows \\" +msgstr "" + +#: ../glib/gregex.c:274 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "" + +#: ../glib/gregex.c:277 +msgid "numbers out of order in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:280 +msgid "number too big in {} quantifier" +msgstr "" + +#: ../glib/gregex.c:283 +#, fuzzy +msgid "missing terminating ] for character class" +msgstr "קאַנאַל ענדיקט זיך מיט אַ האַלבן שריפֿטצײכן" + +#: ../glib/gregex.c:286 +#, fuzzy +msgid "invalid escape sequence in character class" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: ../glib/gregex.c:289 +msgid "range out of order in character class" +msgstr "" + +#: ../glib/gregex.c:292 +msgid "nothing to repeat" +msgstr "" + +#: ../glib/gregex.c:295 +#, fuzzy +msgid "unrecognized character after (?" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: ../glib/gregex.c:299 +#, fuzzy +msgid "unrecognized character after (?<" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: ../glib/gregex.c:303 +#, fuzzy +msgid "unrecognized character after (?P" +msgstr "ניט־געענדיקט שריפֿטצײכן־רעפֿערענץ" + +#: ../glib/gregex.c:306 +msgid "POSIX named classes are supported only within a class" +msgstr "" + +#: ../glib/gregex.c:309 +msgid "missing terminating )" +msgstr "" + +#: ../glib/gregex.c:313 +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:320 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "" + +#: ../glib/gregex.c:323 +msgid "reference to non-existent subpattern" +msgstr "" + +#: ../glib/gregex.c:326 +msgid "missing ) after comment" +msgstr "" + +#: ../glib/gregex.c:329 +msgid "regular expression too large" +msgstr "" + +#: ../glib/gregex.c:332 +msgid "failed to get memory" +msgstr "" + +#: ../glib/gregex.c:335 +msgid "lookbehind assertion is not fixed length" +msgstr "" + +#: ../glib/gregex.c:338 +msgid "malformed number or name after (?(" +msgstr "" + +#: ../glib/gregex.c:341 +msgid "conditional group contains more than two branches" +msgstr "" + +#: ../glib/gregex.c:344 +msgid "assertion expected after (?(" +msgstr "" + +#: ../glib/gregex.c:347 +msgid "unknown POSIX class name" +msgstr "" + +#: ../glib/gregex.c:350 +msgid "POSIX collating elements are not supported" +msgstr "" + +#: ../glib/gregex.c:353 +msgid "character value in \\x{...} sequence is too large" +msgstr "" + +#: ../glib/gregex.c:356 +msgid "invalid condition (?(0)" +msgstr "" + +#: ../glib/gregex.c:359 +msgid "\\C not allowed in lookbehind assertion" +msgstr "" + +#: ../glib/gregex.c:362 +msgid "recursive call could loop indefinitely" +msgstr "" + +#: ../glib/gregex.c:365 +msgid "missing terminator in subpattern name" +msgstr "" + +#: ../glib/gregex.c:368 +msgid "two named subpatterns have the same name" +msgstr "" + +#: ../glib/gregex.c:371 +msgid "malformed \\P or \\p sequence" +msgstr "" + +#: ../glib/gregex.c:374 +msgid "unknown property name after \\P or \\p" +msgstr "" + +#: ../glib/gregex.c:377 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "" + +#: ../glib/gregex.c:380 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "" + +#: ../glib/gregex.c:383 +msgid "octal value is greater than \\377" +msgstr "" + +#: ../glib/gregex.c:386 +msgid "DEFINE group contains more than one branch" +msgstr "" + +#: ../glib/gregex.c:389 +msgid "repeating a DEFINE group is not allowed" +msgstr "" + +#: ../glib/gregex.c:392 +msgid "inconsistent NEWLINE options" +msgstr "" + +#: ../glib/gregex.c:395 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "" + +#: ../glib/gregex.c:400 +msgid "unexpected repeat" +msgstr "" + +#: ../glib/gregex.c:404 +msgid "code overflow" +msgstr "" + +#: ../glib/gregex.c:408 +msgid "overran compiling workspace" +msgstr "" + +#: ../glib/gregex.c:412 +msgid "previously-checked referenced subpattern not found" +msgstr "" + +#: ../glib/gregex.c:630 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "" + +#: ../glib/gregex.c:1271 +#, fuzzy, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "דורכפֿאַל אױף שורה %d פּאָזיציע %d: %s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "" + +#: ../glib/gregex.c:2183 +msgid "hexadecimal digit or '}' expected" +msgstr "" + +#: ../glib/gregex.c:2199 +msgid "hexadecimal digit expected" +msgstr "" + +#: ../glib/gregex.c:2239 +msgid "missing '<' in symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2248 +#, fuzzy +msgid "unfinished symbolic reference" +msgstr "ניט־געענדיקט אײנס־רעפֿערענץ" + +#: ../glib/gregex.c:2255 +msgid "zero-length symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2266 +msgid "digit expected" +msgstr "" + +#: ../glib/gregex.c:2284 +msgid "illegal symbolic reference" +msgstr "" + +#: ../glib/gregex.c:2346 +msgid "stray final '\\'" +msgstr "" + +#: ../glib/gregex.c:2350 +msgid "unknown escape sequence" +msgstr "" + +#: ../glib/gregex.c:2360 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "ציטירטער טעקסט הײבט ניט אָן מיט קײן גענדזן־פֿיסל" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "גענדזן־פֿיסל אָן אַ זיװג אין באַפֿעל־שורה אָדער אַנדער ציטירטן טעקסט" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "" +"טעקסט האָט זיך געענדיקט באַלד נאָך אַ '\\' שריפֿטצײכן. (דער טעקסט איז געװען '%s')" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "" +"טעקסט האָט זיך געענדיקט אײדער אַ זיװג צו דעם גענדזן־פֿיסל ‪%c‬. (דער טעקסט איז " +"געװען '%s')" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "טעקסט איז געװען פּוסט (אָדער איז כּולל בלױס לײדיק אָרט)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "ניט געקענט לײענען דאַטן פֿון קינדפּראָצעס" + +#: ../glib/gspawn-win32.c:299 ../glib/gspawn.c:1517 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "דורכפֿאַל אין שאַפֿן רער צוליב קאָמוניקירן מיט קינדפּראָצעס (%s)" + +#: ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 ../glib/gspawn.c:1170 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "דורכפֿאַל אין לײענע פֿון אַ ינדרער (%s)" + +#: ../glib/gspawn-win32.c:369 ../glib/gspawn.c:1383 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "דורכפֿאַל אין זיך קערן צו פּאַפּקע '%s' (%s)" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס (%s)" + +#: ../glib/gspawn-win32.c:444 +#, fuzzy, c-format +msgid "Invalid program name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, fuzzy, c-format +msgid "Invalid string in environment: %s" +msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, fuzzy, c-format +msgid "Invalid working directory: %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../glib/gspawn-win32.c:783 +#, fuzzy, c-format +msgid "Failed to execute helper program (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן הילף־פּראָגראַם" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "" +"אומדערװאַרטער דורכפֿאַל אין g_io_channel_win32_poll() בשעת לײענען דאַטן פֿון אַ " +"קינדפּראָצעס" + +#: ../glib/gspawn.c:207 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "דורכפֿאַל אין לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)" + +#: ../glib/gspawn.c:347 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "אומדערװאַרטער דורכפֿאַל אין select() לײענען דאַטן פֿון אַ קינדפּראָצעס (%s)" + +#: ../glib/gspawn.c:432 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "אומדערװאַרטער דורכפֿאַל אין waitpid() (%s)" + +#: ../glib/gspawn.c:1237 +#, c-format +msgid "Failed to fork (%s)" +msgstr "דורכפֿאַל אין קלאָנירן (%s)" + +#: ../glib/gspawn.c:1393 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\" (%s)" + +#: ../glib/gspawn.c:1403 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "דורכפֿאַל אין װידערצילן אַרױסשרײַב אָדער אַרײַנשרײַב פֿון קינדפּראָצעס (%s)" + +#: ../glib/gspawn.c:1412 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "דורכפֿאַל אין קלאָנירן קינדפּראָצעס (%s)" + +#: ../glib/gspawn.c:1420 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "אומבאַקאַנטער דורכפֿאַל אין באַאַרבעטן קינדפּראָצעס \"%s\"" + +#: ../glib/gspawn.c:1444 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "דורכפֿאַל אין לײענען גענוג דאַטן פֿון קינד pid-רער (%s)" + +#: ../glib/gutf8.c:1086 +msgid "Character out of range for UTF-8" +msgstr "שריפֿטצײכן ניט אין דער UTFÖ¾8 גאַמע" + +#: ../glib/gutf8.c:1186 ../glib/gutf8.c:1195 ../glib/gutf8.c:1325 +#: ../glib/gutf8.c:1334 ../glib/gutf8.c:1473 ../glib/gutf8.c:1569 +msgid "Invalid sequence in conversion input" +msgstr "אומלעקסיקער סעקװענץ אין פֿאַרװאַנדל־אַרײַנשרײַב" + +#: ../glib/gutf8.c:1484 ../glib/gutf8.c:1580 +msgid "Character out of range for UTF-16" +msgstr "שריפֿטצײכן ניט אין דער UTFÖ¾16 גאַמע" + +#: ../glib/goption.c:760 +msgid "Usage:" +msgstr "" + +#: ../glib/goption.c:760 +msgid "[OPTION...]" +msgstr "" + +#: ../glib/goption.c:866 +msgid "Help Options:" +msgstr "" + +#: ../glib/goption.c:867 +msgid "Show help options" +msgstr "" + +#: ../glib/goption.c:873 +msgid "Show all help options" +msgstr "" + +#: ../glib/goption.c:935 +msgid "Application Options:" +msgstr "" + +#: ../glib/goption.c:997 ../glib/goption.c:1067 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1007 ../glib/goption.c:1075 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1032 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "" + +#: ../glib/goption.c:1040 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "" + +#: ../glib/goption.c:1303 ../glib/goption.c:1382 +#, fuzzy, c-format +msgid "Error parsing option %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../glib/goption.c:1413 ../glib/goption.c:1526 +#, c-format +msgid "Missing argument for %s" +msgstr "" + +#: ../glib/goption.c:1957 +#, c-format +msgid "Unknown option %s" +msgstr "" + +#: ../glib/gkeyfile.c:366 +msgid "Valid key file could not be found in search dirs" +msgstr "" + +#: ../glib/gkeyfile.c:401 +msgid "Not a regular file" +msgstr "" + +#: ../glib/gkeyfile.c:409 +msgid "File is empty" +msgstr "" + +#: ../glib/gkeyfile.c:768 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "" + +#: ../glib/gkeyfile.c:828 +#, fuzzy, c-format +msgid "Invalid group name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../glib/gkeyfile.c:850 +msgid "Key file does not start with a group" +msgstr "" + +#: ../glib/gkeyfile.c:876 +#, fuzzy, c-format +msgid "Invalid key name: %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../glib/gkeyfile.c:903 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1149 ../glib/gkeyfile.c:1311 ../glib/gkeyfile.c:2686 +#: ../glib/gkeyfile.c:2752 ../glib/gkeyfile.c:2887 ../glib/gkeyfile.c:3020 +#: ../glib/gkeyfile.c:3162 ../glib/gkeyfile.c:3394 ../glib/gkeyfile.c:3463 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1323 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:1430 ../glib/gkeyfile.c:1546 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "" + +#: ../glib/gkeyfile.c:1450 ../glib/gkeyfile.c:1934 +#, c-format +msgid "Key file contains key '%s' which has value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:1566 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2151 ../glib/gkeyfile.c:2515 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has value that cannot be " +"interpreted." +msgstr "" + +#: ../glib/gkeyfile.c:2701 ../glib/gkeyfile.c:2902 ../glib/gkeyfile.c:3474 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "" + +#: ../glib/gkeyfile.c:3708 +msgid "Key file contains escape character at end of line" +msgstr "" + +#: ../glib/gkeyfile.c:3730 +#, fuzzy, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "דער URI %s איז כּולל אומלעקסיקע פּליטה־כאַראַקטערס" + +#: ../glib/gkeyfile.c:3872 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "" + +#: ../glib/gkeyfile.c:3886 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "" + +#: ../glib/gkeyfile.c:3919 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "" + +#: ../glib/gkeyfile.c:3943 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:198 ../gio/goutputstream.c:732 +#, c-format +msgid "Too large count value passed to %s" +msgstr "" + +#: ../gio/gbufferedinputstream.c:881 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:306 ../gio/goutputstream.c:1206 +msgid "Stream is already closed" +msgstr "" + +#: ../gio/gcancellable.c:321 ../gio/gdbusconnection.c:1640 +#: ../gio/gdbusconnection.c:1729 ../gio/gdbusconnection.c:1916 +#: ../gio/glocalfile.c:2100 ../gio/gsimpleasyncresult.c:814 +#: ../gio/gsimpleasyncresult.c:840 +msgid "Operation was cancelled" +msgstr "" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +#, fuzzy +msgid "Incomplete multibyte sequence in input" +msgstr "אומלעקסיק אַכטעלע־סעײַװענץ אין פֿאַרװאַנדלונג אַרױסשרײַב" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:854 +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:680 +#, c-format +msgid "%s type" +msgstr "" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "" + +#: ../gio/gdbusaddress.c:644 +#, fuzzy +msgid "Error auto-launching: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:688 +#, fuzzy, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:706 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:715 +#, fuzzy, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:733 +#, fuzzy, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:951 +msgid "The given address is empty" +msgstr "" + +#: ../gio/gdbusaddress.c:1020 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "" + +#: ../gio/gdbusaddress.c:1057 +#, fuzzy, c-format +msgid "Error spawning command line `%s': " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusaddress.c:1068 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1082 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "" + +#: ../gio/gdbusaddress.c:1155 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "" + +#: ../gio/gdbusaddress.c:1254 ../gio/gdbusconnection.c:6409 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "" + +#: ../gio/gdbusaddress.c:1263 ../gio/gdbusconnection.c:6418 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "" + +#: ../gio/gdbusaddress.c:1273 +#, c-format +msgid "Unknown bus type %d" +msgstr "" + +#: ../gio/gdbusauth.c:288 +msgid "Unexpected lack of content trying to read a line" +msgstr "" + +#: ../gio/gdbusauth.c:332 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "" + +#: ../gio/gdbusauth.c:503 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "" + +#: ../gio/gdbusauth.c:1159 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, fuzzy, c-format +msgid "Error statting directory `%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, fuzzy, c-format +msgid "Error creating directory `%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, fuzzy, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, fuzzy, c-format +msgid "Error creating lock file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, fuzzy, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, fuzzy, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, fuzzy, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "" + +#: ../gio/gdbusconnection.c:1150 ../gio/gdbusconnection.c:1376 +#: ../gio/gdbusconnection.c:1415 ../gio/gdbusconnection.c:1740 +msgid "The connection is closed" +msgstr "" + +#: ../gio/gdbusconnection.c:1684 +msgid "Timeout was reached" +msgstr "" + +#: ../gio/gdbusconnection.c:2306 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "" + +#: ../gio/gdbusconnection.c:3770 ../gio/gdbusconnection.c:4086 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:3841 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3936 +#, c-format +msgid "No such property `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:3948 +#, c-format +msgid "Property `%s' is not readable" +msgstr "" + +#: ../gio/gdbusconnection.c:3959 +#, c-format +msgid "Property `%s' is not writable" +msgstr "" + +#: ../gio/gdbusconnection.c:4029 ../gio/gdbusconnection.c:5853 +#, c-format +msgid "No such interface `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4213 +msgid "No such interface" +msgstr "" + +#: ../gio/gdbusconnection.c:4432 ../gio/gdbusconnection.c:6359 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4484 +#, c-format +msgid "No such method `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4515 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:4734 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "" + +#: ../gio/gdbusconnection.c:4932 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "" + +#: ../gio/gdbusconnection.c:5964 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "" + +#: ../gio/gdbusconnection.c:6082 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1324 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1490 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "" + +#: ../gio/gdbusmessage.c:1517 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:1705 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "" + +#: ../gio/gdbusmessage.c:1719 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "" + +#: ../gio/gdbusmessage.c:1776 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "" + +#: ../gio/gdbusmessage.c:1790 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "" + +#: ../gio/gdbusmessage.c:1821 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "" +msgstr[1] "" + +#: ../gio/gdbusmessage.c:1831 +msgid "Cannot deserialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2163 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "" + +#: ../gio/gdbusmessage.c:2303 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "" + +#: ../gio/gdbusmessage.c:2311 +msgid "Cannot serialize message: " +msgstr "" + +#: ../gio/gdbusmessage.c:2355 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "" + +#: ../gio/gdbusmessage.c:2365 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "" + +#: ../gio/gdbusmessage.c:2381 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "" + +#: ../gio/gdbusmessage.c:2938 +#, fuzzy, c-format +msgid "Error return with body of type `%s'" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusmessage.c:2946 +msgid "Error return with empty body" +msgstr "" + +#: ../gio/gdbusprivate.c:1736 +msgid "Unable to load /var/lib/dbus/machine-id: " +msgstr "" + +#: ../gio/gdbusproxy.c:1489 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "" + +#: ../gio/gdbusproxy.c:1510 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "" + +#: ../gio/gdbusproxy.c:2600 ../gio/gdbusproxy.c:2734 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" + +#: ../gio/gdbusserver.c:711 +msgid "Abstract name space not supported" +msgstr "" + +#: ../gio/gdbusserver.c:798 +msgid "Cannot specify nonce file when creating a server" +msgstr "" + +#: ../gio/gdbusserver.c:875 +#, fuzzy, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbusserver.c:1042 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "" + +#: ../gio/gdbusserver.c:1082 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, fuzzy, c-format +msgid "Error: %s\n" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, fuzzy, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, fuzzy, c-format +msgid "Error connecting: %s\n" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "" + +#: ../gio/gdbus-tool.c:634 +#, fuzzy, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "שריפֿטצײכן %s איז אומלעקסיק אין מיטן פֿון אַן אײנסנאָמען" + +#: ../gio/gdbus-tool.c:640 +#, fuzzy, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "שריפֿטצײכן %s איז אומלעקסיק אין מיטן פֿון אַן אײנסנאָמען" + +#: ../gio/gdbus-tool.c:646 +#, fuzzy, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "שריפֿטצײכן %s איז אומלעקסיק אין מיטן פֿון אַן אײנסנאָמען" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, fuzzy, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gdbus-tool.c:698 +#, fuzzy, c-format +msgid "Error flushing connection: %s\n" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "" + +#: ../gio/gdbus-tool.c:974 +#, fuzzy, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "" + +#: ../gio/gdesktopappinfo.c:572 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "" + +#: ../gio/gdesktopappinfo.c:969 +msgid "Desktop file didn't specify Exec field" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1250 +msgid "Unable to find terminal required for application" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1515 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1519 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:1785 ../gio/gdesktopappinfo.c:1809 +msgid "Application information lacks an identifier" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2033 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "" + +#: ../gio/gdesktopappinfo.c:2149 +#, c-format +msgid "Custom definition for %s" +msgstr "" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:368 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:378 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "" + +#: ../gio/gemblemedicon.c:401 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "" + +#: ../gio/gfile.c:871 ../gio/gfile.c:1102 ../gio/gfile.c:1237 +#: ../gio/gfile.c:1474 ../gio/gfile.c:1528 ../gio/gfile.c:1585 +#: ../gio/gfile.c:1668 ../gio/gfile.c:1723 ../gio/gfile.c:1783 +#: ../gio/gfile.c:1837 ../gio/gfile.c:3307 ../gio/gfile.c:3361 +#: ../gio/gfile.c:3493 ../gio/gfile.c:3534 ../gio/gfile.c:3864 +#: ../gio/gfile.c:4266 ../gio/gfile.c:4352 ../gio/gfile.c:4441 +#: ../gio/gfile.c:4539 ../gio/gfile.c:4626 ../gio/gfile.c:4720 +#: ../gio/gfile.c:5041 ../gio/gfile.c:5308 ../gio/gfile.c:5373 +#: ../gio/gfile.c:6947 ../gio/gfile.c:7037 ../gio/gfile.c:7123 +#: ../gio/win32/gwinhttpfile.c:439 +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:1358 ../gio/glocalfile.c:1051 ../gio/glocalfile.c:1062 +#: ../gio/glocalfile.c:1075 +msgid "Containing mount does not exist" +msgstr "" + +#: ../gio/gfile.c:2411 ../gio/glocalfile.c:2256 +msgid "Can't copy over directory" +msgstr "" + +#: ../gio/gfile.c:2472 +msgid "Can't copy directory over directory" +msgstr "" + +#: ../gio/gfile.c:2480 ../gio/glocalfile.c:2265 +msgid "Target file exists" +msgstr "" + +#: ../gio/gfile.c:2498 +msgid "Can't recursively copy directory" +msgstr "" + +#: ../gio/gfile.c:2758 +msgid "Splice not supported" +msgstr "" + +#: ../gio/gfile.c:2762 +#, fuzzy, c-format +msgid "Error splicing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gfile.c:2909 +msgid "Can't copy special file" +msgstr "" + +#: ../gio/gfile.c:3483 +msgid "Invalid symlink value given" +msgstr "" + +#: ../gio/gfile.c:3577 +msgid "Trash not supported" +msgstr "" + +#: ../gio/gfile.c:3626 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "" + +#: ../gio/gfile.c:6006 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "" + +#: ../gio/gfile.c:6117 +msgid "No application is registered as handling this file" +msgstr "" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +msgid "File enumerator is already closed" +msgstr "" + +#: ../gio/gfileicon.c:236 +#, c-format +msgid "Can't handle version %d of GFileIcon encoding" +msgstr "" + +#: ../gio/gfileicon.c:246 +msgid "Malformed input data for GFileIcon" +msgstr "" + +#: ../gio/gfileinputstream.c:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:316 +#: ../gio/goutputstream.c:1216 +msgid "Stream has outstanding operation" +msgstr "" + +#: ../gio/ginetsocketaddress.c:181 ../gio/ginetsocketaddress.c:198 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "" + +#: ../gio/ginetsocketaddress.c:211 +msgid "Unsupported socket address" +msgstr "" + +#: ../gio/glib-compile-schemas.c:741 +msgid "empty names are not permitted" +msgstr "" + +#: ../gio/glib-compile-schemas.c:751 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "" + +#: ../gio/glib-compile-schemas.c:763 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:772 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "" + +#: ../gio/glib-compile-schemas.c:781 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "" + +#: ../gio/glib-compile-schemas.c:789 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "" + +#: ../gio/glib-compile-schemas.c:858 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:884 +msgid "can not add keys to a 'list-of' schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:895 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:913 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" + +#: ../gio/glib-compile-schemas.c:924 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "" + +#: ../gio/glib-compile-schemas.c:943 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "" + +#: ../gio/glib-compile-schemas.c:958 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:988 +msgid " given but schema isn't extending anything" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1001 +#, c-format +msgid "no to override" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1009 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1080 +#, c-format +msgid " already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1092 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1108 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1116 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1126 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1136 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1146 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1163 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1170 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1416 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1420 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1511 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1696 ../gio/glib-compile-schemas.c:1767 +#: ../gio/glib-compile-schemas.c:1843 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1704 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1763 +#, c-format +msgid "Ignoring this file.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1803 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1809 ../gio/glib-compile-schemas.c:1867 +#: ../gio/glib-compile-schemas.c:1895 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1813 ../gio/glib-compile-schemas.c:1871 +#: ../gio/glib-compile-schemas.c:1899 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1829 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" + +#: ../gio/glib-compile-schemas.c:1839 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1857 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1885 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 +msgid "where to store the gschemas.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1939 ../gio/glib-compile-schemas.c:1970 +msgid "DIRECTORY" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1940 +msgid "Abort on any errors in schemas" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1941 +msgid "Do not write the gschema.compiled file" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1942 +msgid "This option will be removed soon." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1943 +msgid "Do not enforce key name restrictions" +msgstr "" + +#: ../gio/glib-compile-schemas.c:1973 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" + +#: ../gio/glib-compile-schemas.c:1989 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2028 +#, c-format +msgid "No schema files found: " +msgstr "" + +#: ../gio/glib-compile-schemas.c:2031 +#, c-format +msgid "doing nothing.\n" +msgstr "" + +#: ../gio/glib-compile-schemas.c:2034 +#, c-format +msgid "removed existing output file.\n" +msgstr "" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, fuzzy, c-format +msgid "Invalid filename %s" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../gio/glocalfile.c:948 +#, fuzzy, c-format +msgid "Error getting filesystem info: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:1097 +msgid "Can't rename root directory" +msgstr "" + +#: ../gio/glocalfile.c:1117 ../gio/glocalfile.c:1143 +#, fuzzy, c-format +msgid "Error renaming file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:1126 +msgid "Can't rename file, filename already exists" +msgstr "" + +#: ../gio/glocalfile.c:1139 ../gio/glocalfile.c:2129 ../gio/glocalfile.c:2158 +#: ../gio/glocalfile.c:2318 ../gio/glocalfileoutputstream.c:571 +#: ../gio/glocalfileoutputstream.c:624 ../gio/glocalfileoutputstream.c:669 +#: ../gio/glocalfileoutputstream.c:1157 +#, fuzzy +msgid "Invalid filename" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../gio/glocalfile.c:1300 +#, fuzzy, c-format +msgid "Error opening file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:1316 +msgid "Can't open directory" +msgstr "" + +#: ../gio/glocalfile.c:1441 +#, fuzzy, c-format +msgid "Error removing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:1808 +#, fuzzy, c-format +msgid "Error trashing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:1831 +#, fuzzy, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/glocalfile.c:1852 +msgid "Unable to find toplevel directory for trash" +msgstr "" + +#: ../gio/glocalfile.c:1931 ../gio/glocalfile.c:1951 +msgid "Unable to find or create trash directory" +msgstr "" + +#: ../gio/glocalfile.c:1985 +#, fuzzy, c-format +msgid "Unable to create trashing info file: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/glocalfile.c:2014 ../gio/glocalfile.c:2019 ../gio/glocalfile.c:2099 +#: ../gio/glocalfile.c:2106 +#, fuzzy, c-format +msgid "Unable to trash file: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/glocalfile.c:2133 +#, fuzzy, c-format +msgid "Error creating directory: %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../gio/glocalfile.c:2162 +#, fuzzy, c-format +msgid "Filesystem does not support symbolic links" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/glocalfile.c:2166 +#, fuzzy, c-format +msgid "Error making symbolic link: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfile.c:2228 ../gio/glocalfile.c:2322 +#, fuzzy, c-format +msgid "Error moving file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:2251 +msgid "Can't move directory over directory" +msgstr "" + +#: ../gio/glocalfile.c:2278 ../gio/glocalfileoutputstream.c:955 +#: ../gio/glocalfileoutputstream.c:969 ../gio/glocalfileoutputstream.c:984 +#: ../gio/glocalfileoutputstream.c:1000 ../gio/glocalfileoutputstream.c:1014 +msgid "Backup file creation failed" +msgstr "" + +#: ../gio/glocalfile.c:2297 +#, fuzzy, c-format +msgid "Error removing target file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfile.c:2311 +msgid "Move between mounts not supported" +msgstr "" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:733 +#, fuzzy +msgid "Invalid extended attribute name" +msgstr "דאָקומענט ענדיקט זיך אומגעריכטערהײט אין דרינען פֿון אַן אַטריבוט־נאָמען" + +#: ../gio/glocalfileinfo.c:773 +#, fuzzy, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "דורכפֿאַל אין עפֿענען פּאַפּקע %s: %s" + +#: ../gio/glocalfileinfo.c:1482 ../gio/glocalfileoutputstream.c:833 +#, fuzzy, c-format +msgid "Error stating file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileinfo.c:1566 +msgid " (invalid encoding)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1768 +#, fuzzy, c-format +msgid "Error stating file descriptor: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileinfo.c:1813 +msgid "Invalid attribute type (uint32 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1831 +msgid "Invalid attribute type (uint64 expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1850 ../gio/glocalfileinfo.c:1869 +msgid "Invalid attribute type (byte string expected)" +msgstr "" + +#: ../gio/glocalfileinfo.c:1904 +#, fuzzy +msgid "Cannot set permissions on symlinks" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileinfo.c:1920 +#, fuzzy, c-format +msgid "Error setting permissions: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileinfo.c:1971 +#, fuzzy, c-format +msgid "Error setting owner: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileinfo.c:1994 +msgid "symlink must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2004 ../gio/glocalfileinfo.c:2023 +#: ../gio/glocalfileinfo.c:2034 +#, fuzzy, c-format +msgid "Error setting symlink: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: ../gio/glocalfileinfo.c:2013 +msgid "Error setting symlink: file is not a symlink" +msgstr "" + +#: ../gio/glocalfileinfo.c:2139 +#, fuzzy, c-format +msgid "Error setting modification or access time: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileinfo.c:2162 +msgid "SELinux context must be non-NULL" +msgstr "" + +#: ../gio/glocalfileinfo.c:2177 +#, fuzzy, c-format +msgid "Error setting SELinux context: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileinfo.c:2184 +msgid "SELinux is not enabled on this system" +msgstr "" + +#: ../gio/glocalfileinfo.c:2276 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:722 +#, fuzzy, c-format +msgid "Error reading from file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1032 +#, fuzzy, c-format +msgid "Error seeking in file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, fuzzy, c-format +msgid "Error closing file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:743 +#, fuzzy, c-format +msgid "Error writing to file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileoutputstream.c:283 +#, fuzzy, c-format +msgid "Error removing old backup link: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, fuzzy, c-format +msgid "Error creating backup copy: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileoutputstream.c:328 +#, fuzzy, c-format +msgid "Error renaming temporary file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1083 +#, fuzzy, c-format +msgid "Error truncating file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileoutputstream.c:577 ../gio/glocalfileoutputstream.c:630 +#: ../gio/glocalfileoutputstream.c:675 ../gio/glocalfileoutputstream.c:815 +#: ../gio/glocalfileoutputstream.c:1064 ../gio/glocalfileoutputstream.c:1163 +#, fuzzy, c-format +msgid "Error opening file '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/glocalfileoutputstream.c:846 +msgid "Target file is a directory" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:851 +msgid "Target file is not a regular file" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:863 +msgid "The file was externally modified" +msgstr "" + +#: ../gio/glocalfileoutputstream.c:1048 +#, fuzzy, c-format +msgid "Error removing old file: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gmemoryinputstream.c:486 ../gio/gmemoryoutputstream.c:746 +msgid "Invalid GSeekType supplied" +msgstr "" + +#: ../gio/gmemoryinputstream.c:496 +#, fuzzy +msgid "Invalid seek request" +msgstr "אומלעקסיקער מאַשין־נאָמען" + +#: ../gio/gmemoryinputstream.c:520 +msgid "Cannot truncate GMemoryInputStream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:756 +msgid "Requested seek before the beginning of the stream" +msgstr "" + +#: ../gio/gmemoryoutputstream.c:765 +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:363 +msgid "mount doesn't implement \"unmount\"" +msgstr "" + +#. Translators: This is an error +#. * message for mount objects that +#. * don't implement eject. +#: ../gio/gmount.c:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "" + +#: ../gio/goutputstream.c:207 ../gio/goutputstream.c:411 +msgid "Output stream doesn't implement write" +msgstr "" + +#: ../gio/goutputstream.c:372 ../gio/goutputstream.c:855 +msgid "Source stream is already closed" +msgstr "" + +#: ../gio/gresolver.c:779 +#, fuzzy, c-format +msgid "Error resolving '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gresolver.c:829 +#, fuzzy, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gresolver.c:864 ../gio/gresolver.c:943 +#, c-format +msgid "No service record for '%s'" +msgstr "" + +#: ../gio/gresolver.c:869 ../gio/gresolver.c:948 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "" + +#: ../gio/gresolver.c:874 ../gio/gresolver.c:953 +#, fuzzy, c-format +msgid "Error resolving '%s'" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsettings-tool.c:60 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:65 ../gio/gsettings-tool.c:82 +#, c-format +msgid "No such schema '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:77 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:92 +#, c-format +msgid "Empty path given.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:98 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:104 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:110 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "" + +#: ../gio/gsettings-tool.c:131 +#, c-format +msgid "No such key '%s'\n" +msgstr "" + +#: ../gio/gsettings-tool.c:504 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "" + +#: ../gio/gsettings-tool.c:533 +msgid "Print help" +msgstr "" + +#: ../gio/gsettings-tool.c:539 +msgid "List the installed (non-relocatable) schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:545 +msgid "List the installed relocatable schemas" +msgstr "" + +#: ../gio/gsettings-tool.c:551 +msgid "List the keys in SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:552 ../gio/gsettings-tool.c:558 +#: ../gio/gsettings-tool.c:595 +msgid "SCHEMA[:PATH]" +msgstr "" + +#: ../gio/gsettings-tool.c:557 +msgid "List the children of SCHEMA" +msgstr "" + +#: ../gio/gsettings-tool.c:563 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" + +#: ../gio/gsettings-tool.c:565 +msgid "[SCHEMA[:PATH]]" +msgstr "" + +#: ../gio/gsettings-tool.c:570 +msgid "Get the value of KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:571 ../gio/gsettings-tool.c:577 +#: ../gio/gsettings-tool.c:589 ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:576 +msgid "Query the range of valid values for KEY" +msgstr "" + +#: ../gio/gsettings-tool.c:582 +msgid "Set the value of KEY to VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:583 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "" + +#: ../gio/gsettings-tool.c:588 +msgid "Reset KEY to its default value" +msgstr "" + +#: ../gio/gsettings-tool.c:594 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "" + +#: ../gio/gsettings-tool.c:600 +msgid "Check if KEY is writable" +msgstr "" + +#: ../gio/gsettings-tool.c:606 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" + +#: ../gio/gsettings-tool.c:609 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "" + +#: ../gio/gsettings-tool.c:613 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:621 +msgid "" +"Usage:\n" +" gsettings COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:643 +#, c-format +msgid "" +"Usage:\n" +" gsettings %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" + +#: ../gio/gsettings-tool.c:648 +msgid "Arguments:\n" +msgstr "" + +#: ../gio/gsettings-tool.c:652 +msgid " COMMAND The (optional) command to explain\n" +msgstr "" + +#: ../gio/gsettings-tool.c:656 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" + +#: ../gio/gsettings-tool.c:661 +msgid " KEY The (optional) key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:665 +msgid " KEY The key within the schema\n" +msgstr "" + +#: ../gio/gsettings-tool.c:669 +msgid " VALUE The value to set\n" +msgstr "" + +#: ../gio/gsettings-tool.c:766 +#, c-format +msgid "Empty schema name given\n" +msgstr "" + +#: ../gio/gsocket.c:275 +msgid "Invalid socket, not initialized" +msgstr "" + +#: ../gio/gsocket.c:282 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "" + +#: ../gio/gsocket.c:290 +msgid "Socket is already closed" +msgstr "" + +#: ../gio/gsocket.c:298 ../gio/gsocket.c:2798 ../gio/gsocket.c:2842 +msgid "Socket I/O timed out" +msgstr "" + +#: ../gio/gsocket.c:464 +#, fuzzy, c-format +msgid "creating GSocket from fd: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:498 ../gio/gsocket.c:514 +#, fuzzy, c-format +msgid "Unable to create socket: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/gsocket.c:498 +msgid "Unknown protocol was specified" +msgstr "" + +#: ../gio/gsocket.c:1268 +#, c-format +msgid "could not get local address: %s" +msgstr "" + +#: ../gio/gsocket.c:1311 +#, fuzzy, c-format +msgid "could not get remote address: %s" +msgstr "ניט געקענט אױסטײלן %lu אַכטעלעך צו לײענען טעקע %s" + +#: ../gio/gsocket.c:1372 +#, c-format +msgid "could not listen: %s" +msgstr "" + +#: ../gio/gsocket.c:1446 +#, fuzzy, c-format +msgid "Error binding to address: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:1566 +#, fuzzy, c-format +msgid "Error accepting connection: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gsocket.c:1683 +#, fuzzy +msgid "Error connecting: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:1688 +msgid "Connection in progress" +msgstr "" + +#: ../gio/gsocket.c:1695 +#, fuzzy, c-format +msgid "Error connecting: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:1738 ../gio/gsocket.c:3579 +#, fuzzy, c-format +msgid "Unable to get pending error: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/gsocket.c:1875 +#, fuzzy, c-format +msgid "Error receiving data: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:2050 +#, fuzzy, c-format +msgid "Error sending data: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:2163 +#, fuzzy, c-format +msgid "Unable to shutdown socket: %s" +msgstr "ניט געקענט שאַפֿן טעקע %s: %s" + +#: ../gio/gsocket.c:2242 +#, fuzzy, c-format +msgid "Error closing socket: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:2791 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "" + +#: ../gio/gsocket.c:3056 ../gio/gsocket.c:3137 +#, fuzzy, c-format +msgid "Error sending message: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:3081 +msgid "GSocketControlMessage not supported on windows" +msgstr "" + +#: ../gio/gsocket.c:3358 ../gio/gsocket.c:3494 +#, fuzzy, c-format +msgid "Error receiving message: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gsocket.c:3598 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "" + +#: ../gio/gsocketclient.c:798 ../gio/gsocketclient.c:1368 +msgid "Unknown error on connect" +msgstr "" + +#: ../gio/gsocketclient.c:836 ../gio/gsocketclient.c:1252 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "" + +#: ../gio/gsocketclient.c:858 ../gio/gsocketclient.c:1277 +#, fuzzy, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "פֿאַרװאַנדלונג פֿון קאָדירונג %s צו %s ניט געשטיצט" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "" + +#: ../gio/gsocks4aproxy.c:139 +#, c-format +msgid "SOCKSv4 implementation limits username to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:157 +#, c-format +msgid "SOCKSv4a implementation limits hostname to %i characters" +msgstr "" + +#: ../gio/gsocks4aproxy.c:183 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "" + +#: ../gio/gsocks4aproxy.c:190 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:328 +#: ../gio/gsocks5proxy.c:338 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "" + +#: ../gio/gsocks5proxy.c:208 +#, c-format +msgid "Username or password is too long for SOCKSv5 protocol (max. is %i)." +msgstr "" + +#: ../gio/gsocks5proxy.c:239 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "" + +#: ../gio/gsocks5proxy.c:289 +#, c-format +msgid "Hostname '%s' too long for SOCKSv5 protocol (maximum is %i bytes)" +msgstr "" + +#: ../gio/gsocks5proxy.c:352 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:359 +msgid "Internal SOCKSv5 proxy server error." +msgstr "" + +#: ../gio/gsocks5proxy.c:365 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "" + +#: ../gio/gsocks5proxy.c:372 +msgid "Host unreachable through SOCKSv5 server." +msgstr "" + +#: ../gio/gsocks5proxy.c:378 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:384 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "" + +#: ../gio/gsocks5proxy.c:390 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "" + +#: ../gio/gsocks5proxy.c:396 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "" + +#: ../gio/gsocks5proxy.c:402 +msgid "Unknown SOCKSv5 proxy error." +msgstr "" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "" + +#: ../gio/gtlscertificate.c:226 +msgid "No PEM-encoded private key found" +msgstr "" + +#: ../gio/gtlscertificate.c:235 +msgid "Could not parse PEM-encoded private key" +msgstr "" + +#: ../gio/gtlscertificate.c:260 +msgid "No PEM-encoded certificate found" +msgstr "" + +#: ../gio/gtlscertificate.c:269 +msgid "Could not parse PEM-encoded certificate" +msgstr "" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:521 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:531 +msgid "Unexpected type of ancillary data" +msgstr "" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "" + +#: ../gio/gunixconnection.c:371 +#, fuzzy +msgid "Error sending credentials: " +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gunixconnection.c:452 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "" + +#: ../gio/gunixconnection.c:461 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" + +#: ../gio/gunixconnection.c:478 +#, fuzzy, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gunixconnection.c:509 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "" + +#: ../gio/gunixconnection.c:545 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "" + +#: ../gio/gunixconnection.c:571 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "" + +#: ../gio/gunixinputstream.c:368 ../gio/gunixinputstream.c:388 +#: ../gio/gunixinputstream.c:466 +#, fuzzy, c-format +msgid "Error reading from unix: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gunixinputstream.c:421 ../gio/gunixinputstream.c:601 +#: ../gio/gunixoutputstream.c:407 ../gio/gunixoutputstream.c:556 +#, fuzzy, c-format +msgid "Error closing unix: %s" +msgstr "דורכפֿאַל אױף שורה %d: %s" + +#: ../gio/gunixmounts.c:1900 ../gio/gunixmounts.c:1937 +msgid "Filesystem root" +msgstr "" + +#: ../gio/gunixoutputstream.c:353 ../gio/gunixoutputstream.c:374 +#: ../gio/gunixoutputstream.c:452 +#, fuzzy, c-format +msgid "Error writing to unix: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "" + +#: ../gio/gwin32appinfo.c:299 +#, fuzzy, c-format +msgid "Error launching application: %s" +msgstr "דורכפֿאַל בשעת פֿאַרװאַנדלונג: %s" + +#: ../gio/gwin32appinfo.c:335 +msgid "URIs not supported" +msgstr "" + +#: ../gio/gwin32appinfo.c:357 +msgid "association changes not supported on win32" +msgstr "" + +#: ../gio/gwin32appinfo.c:369 +msgid "Association creation not supported on win32" +msgstr "" + +#: ../gio/gwin32inputstream.c:318 +#, fuzzy, c-format +msgid "Error reading from handle: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, fuzzy, c-format +msgid "Error closing handle: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gwin32outputstream.c:318 +#, fuzzy, c-format +msgid "Error writing to handle: %s" +msgstr "דורכפֿאַל אין לײענען טעקע %s: %s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "" + +#: ../gio/gzlibdecompressor.c:342 +#, 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 "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.po b/po/zh_CN.po new file mode 100644 index 0000000..c12e0e2 --- /dev/null +++ b/po/zh_CN.po @@ -0,0 +1,4129 @@ +# glib simplified chinese translation +# Copyright (C) 2009, 2010 Free Software Foundation, Inc. +# This file is distributed under the same license as the glib package. +# He Qiangqiang , 2001. +# Funda Wang , 2004, 2005. +# yetist , 2007. +# Deng Xiyue , 2008, 2009. +# Aron Xu , 2009, 2010. +# Dark Blue , 2010. +# Tao Wang , 2010. +# Aron Xu , 2010. +# wei Li , 2011. +# Lele Long , 2011. +# Mike Manilone , 2012. +# +# Note:"fd" is abbr. of "File Descriptor", 文件描述符 +# +msgid "" +msgstr "" +"Project-Id-Version: glib master\n" +"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" +"product=glib&keywords=I18N+L10N&component=general\n" +"POT-Creation-Date: 2012-04-14 16:35+0000\n" +"PO-Revision-Date: 2012-04-14 21:15+0800\n" +"Last-Translator: Wylmer Wang \n" +"Language-Team: Chinese (simplified) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#: ../gio/gbufferedinputstream.c:411 ../gio/gbufferedinputstream.c:492 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:317 +#: ../gio/ginputstream.c:556 ../gio/ginputstream.c:680 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:753 +#, c-format +msgid "Too large count value passed to %s" +msgstr "传递给 %s 的计数值太大了" + +#: ../gio/gbufferedinputstream.c:882 ../gio/ginputstream.c:888 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1228 +msgid "Stream is already closed" +msgstr "流已经关闭" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1836 +#: ../gio/gdbusconnection.c:1928 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2133 ../gio/gsimpleasyncresult.c:833 +#: ../gio/gsimpleasyncresult.c:859 +#, c-format +msgid "Operation was cancelled" +msgstr "操作被取消" + +#: ../gio/gcharsetconverter.c:263 +msgid "Invalid object, not initialized" +msgstr "无效的对象,未初始化" + +#: ../gio/gcharsetconverter.c:284 ../gio/gcharsetconverter.c:312 +msgid "Incomplete multibyte sequence in input" +msgstr "输入中有不完整的多字节序列" + +#: ../gio/gcharsetconverter.c:318 ../gio/gcharsetconverter.c:327 +msgid "Not enough space in destination" +msgstr "目标位置没有足够的空间" + +#: ../gio/gcharsetconverter.c:345 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:768 +#: ../glib/gconvert.c:1160 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "转换输入中出现无效字符序列" + +#: ../gio/gcharsetconverter.c:350 ../glib/gconvert.c:776 +#: ../glib/gconvert.c:1085 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "转换过程中出错:%s" + +#: ../gio/gcharsetconverter.c:447 ../gio/gsocket.c:961 +msgid "Cancellable initialization not supported" +msgstr "不支持可撤销的初始化" + +#: ../gio/gcharsetconverter.c:458 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支持从字符集“%s”到“%s”的转换" + +#: ../gio/gcharsetconverter.c:462 ../glib/gconvert.c:572 +#: ../glib/gconvert.c:650 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "无法打开从“%s”到“%s”的转换器" + +#: ../gio/gcontenttype.c:180 +msgid "Unknown type" +msgstr "未知类型" + +#: ../gio/gcontenttype.c:181 +#, c-format +msgid "%s filetype" +msgstr "%s 文件类型" + +#: ../gio/gcontenttype.c:680 +#, c-format +msgid "%s type" +msgstr "%s 类型" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "此操作系统上没有实现 GCredentials" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "您的系统尚不支持 GCredentials" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "非预期的过早的流结束符" + +#: ../gio/gdbusaddress.c:142 ../gio/gdbusaddress.c:230 +#: ../gio/gdbusaddress.c:311 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "地址条目“%2$s”中不支持的键“%1$s”" + +#: ../gio/gdbusaddress.c:169 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "地址 %s 无效(需要指定的一个路径、临时目录或抽象键)" + +#: ../gio/gdbusaddress.c:182 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "地址条目“%s”中无意义的键值对组合" + +#: ../gio/gdbusaddress.c:245 ../gio/gdbusaddress.c:326 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "地址“%s”中有错误 - 端口属性格式错误" + +#: ../gio/gdbusaddress.c:256 ../gio/gdbusaddress.c:337 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "地址“%s”中有错误 - 类别 (family) 属性格式错误" + +#: ../gio/gdbusaddress.c:446 +#, c-format +msgid "Address element `%s', does not contain a colon (:)" +msgstr "地址元素“%s”不包含冒号 (:)" + +#: ../gio/gdbusaddress.c:467 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s', does not contain an equal " +"sign" +msgstr "地址元素“%3$s”中的第 %1$d 个键值对 -“%2$s”,不包含等号" + +#: ../gio/gdbusaddress.c:481 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "在键/值对 %d ,“%s”在地址元素“%s”,中去转义发生错误" + +#: ../gio/gdbusaddress.c:559 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "地址 %s 有错误 - UNIX 传输需要“path”或“abstract”之一的键被设置。" + +#: ../gio/gdbusaddress.c:595 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "地址“%s”中有错误 - 主机属性丢失或格式错误" + +#: ../gio/gdbusaddress.c:609 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "地址“%s”中有错误 - 端口属性丢失或格式错误" + +#: ../gio/gdbusaddress.c:623 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "地址“%s”中有错误 - noncefile 属性丢失或格式错误" + +#: ../gio/gdbusaddress.c:644 +msgid "Error auto-launching: " +msgstr "自启动出错:" + +#: ../gio/gdbusaddress.c:652 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "对地址 %2$s 的未知或不支持的传输 %1$s" + +#: ../gio/gdbusaddress.c:688 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "打开临时文件“%s”出错:%s" + +#: ../gio/gdbusaddress.c:706 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "读取临时文件“%s”出错:%s" + +#: ../gio/gdbusaddress.c:715 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "读取临时文件“%s”出错,预期 16 个字节,得到了 %d 个字节" + +#: ../gio/gdbusaddress.c:733 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "写入临时文件 %s 的内容到流的过程中出错:" + +#: ../gio/gdbusaddress.c:952 +msgid "The given address is empty" +msgstr "给出的地址为空" + +#: ../gio/gdbusaddress.c:1021 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "无法在无机器 ID 时启动一条消息总线:" + +#: ../gio/gdbusaddress.c:1058 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "启动命令 %s 出错:" + +#: ../gio/gdbusaddress.c:1069 +#, c-format +msgid "Abnormal program termination spawning command line `%s': %s" +msgstr "命令 %s 非正常程序终止:%s" + +#: ../gio/gdbusaddress.c:1083 +#, c-format +msgid "Command line `%s' exited with non-zero exit status %d: %s" +msgstr "命令 %s 以非零状态数 %d 退出:%s" + +#: ../gio/gdbusaddress.c:1156 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "无法确定会话总线地址(尚未在此操作系统上实现)" + +#: ../gio/gdbusaddress.c:1255 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "无法从 DBUS_STARTER_BUS_TYPE 环境变量确定总线地址 - 未知的值“%s”" + +#: ../gio/gdbusaddress.c:1264 ../gio/gdbusconnection.c:6715 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "无法确定总线地址,因为环境变量 DBUS_STARTER_BUS_TYPE 未设置" + +#: ../gio/gdbusaddress.c:1274 +#, c-format +msgid "Unknown bus type %d" +msgstr "未知的总线类型 %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "试图读取一行时,异常地缺失内容" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "试图(安全地)读取一行时,异常地缺失内容" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "用尽了所有可用的认证机制(已尝试:%s)(可用的:%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "通过 GDBusAuthObserver::authorize-authenticated-peer 取消" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "获取目录“%s”信息时发生错误:%s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "目录“%s”权限错误。期望 0700,却得到了 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "创建目录“%s”出错:%s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "打开密钥环“%s”读取时出错:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s 处的密钥环的 %1$d 行有不符合格式的内容 %3$s" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s 处的密钥环的 %1$d 行第一个令牌有不符合格式的内容 %3$s" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "%2$s 处的密钥环的 %1$d 行第二个令牌有不符合格式的内容 %3$s" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "未在 %2$s 处的密钥环中找到 ID 为 %1$d 的 cookie" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "删除失效的锁文件“%s”出错:%s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "创建锁文件“%s”出错:%s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "关闭(删除)锁文件“%s”出错:%s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "删除锁文件“%s”出错:%s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "打开钥匙环“%s”以写入出错:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(此外,释放 %s 的锁失败:%s)" + +#: ../gio/gdbusconnection.c:594 ../gio/gdbusconnection.c:2391 +msgid "The connection is closed" +msgstr "连接已关闭" + +#: ../gio/gdbusconnection.c:1881 +msgid "Timeout was reached" +msgstr "已到超时限制" + +#: ../gio/gdbusconnection.c:2513 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "构建客户端连接时遇到不支持的标志" + +#: ../gio/gdbusconnection.c:4016 ../gio/gdbusconnection.c:4332 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "路径 %s 的对象上没有 org.freedesktop.DBus.Properties 接口" + +#: ../gio/gdbusconnection.c:4087 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "设置属性 %s 出错:期望 %s 类型但得到 %s 类型" + +#: ../gio/gdbusconnection.c:4182 +#, c-format +msgid "No such property `%s'" +msgstr "无此属性:%s" + +#: ../gio/gdbusconnection.c:4194 +#, c-format +msgid "Property `%s' is not readable" +msgstr "属性 %s 不可读" + +#: ../gio/gdbusconnection.c:4205 +#, c-format +msgid "Property `%s' is not writable" +msgstr "属性 %s 不可写" + +#: ../gio/gdbusconnection.c:4275 ../gio/gdbusconnection.c:6149 +#, c-format +msgid "No such interface `%s'" +msgstr "无此接口:%s" + +#: ../gio/gdbusconnection.c:4459 +msgid "No such interface" +msgstr "无此接口" + +#: ../gio/gdbusconnection.c:4677 ../gio/gdbusconnection.c:6655 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "在路径 %s 的对象上没有 %s 接口" + +#: ../gio/gdbusconnection.c:4732 +#, c-format +msgid "No such method `%s'" +msgstr "无此方法:%s" + +#: ../gio/gdbusconnection.c:4763 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "消息的类型“%s”,与预期的类型“%s”不匹配" + +#: ../gio/gdbusconnection.c:4983 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "%2$s 处的接口 %1$s 已经导出了一个对象" + +#: ../gio/gdbusconnection.c:5181 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "方法“%s”返回类型“%s”,但预期的是“%s”" + +#: ../gio/gdbusconnection.c:6260 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "带有 %3$s 签名的接口 %2$s 上不存在 %1$s 方法" + +#: ../gio/gdbusconnection.c:6379 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "已经为 %s 导出一个子树" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "类型无效" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL 消息:PATH 或 MEMBER 头域缺失" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_CALL 消息:REPLY_SERIAL 头域缺失" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "错误消息:REPLY_SERIAL 或 ERROR_NAME 头域缺失" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "信号消息:PATH、INTERFACE 或 MEMBER 头域缺失" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "信号消息:PATH 头域正在使用保留值 /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "信号消息:INTERFACE 头域正在使用保留值 org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "期望读取 %lu 字节但得到 EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"期望得到有效的 UTF-8 字符串,但在字节偏移 %d 处(字符串长度为 %d)得到了无效的" +"字节。该点的有效 UTF-8 字符串曾是 %s。" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "期望 %s 后为 NUL 字节但得到字节 %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "已解析的值 %s 不是有效的 D-Bus 对象路径" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "已解析的值 %s 不是有效的 D-Bus 签名" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "得到长度为 %u 字节的数组,最大长度应为 2<<26 字节(64 MiB)。" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "已解析的衍生属性值 %s 不是有效的 D-Bus 签名" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "在以 D-Bus 线格式用类型字符串“%s”反序列化 GVariant 时发生错误" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "无效的字节序值。期望为 0x6c (“l”)或 0x42 (“B”)但是发现了值 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "无效的主协议版本。期望 1,但是找到了 %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "头部带有 %s 签名但消息主体为空" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "已解析的值 %s 不是有效的 D-Bus 签名(针对消息主体)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "消息中没有签名的头部,但消息主体为 %u 字节" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "无法解串消息:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "在以 D-Bus 线格式用类型字符串“%s”序列化 GVariant 时发生错误" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "消息拥有 %d 个文件描述符,但是头区域指出 %d 个文件描述符" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "无法串行消息:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "消息主体有签名 %s 但头部没有签名" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `%" +"s'" +msgstr "消息主体有类型签名 %s 但头部的签名为 %s" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "消息主体为空,但头部有签名 %s" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "返回主体类型 %s 出错" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "返回空主体出错" + +#: ../gio/gdbusprivate.c:2066 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "无法加载 /var/lib/dbus/machine-id 和 /etc/machine-id:" + +#: ../gio/gdbusproxy.c:1624 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "为 %s 调用 StartServiceByName 出错:" + +#: ../gio/gdbusproxy.c:1645 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "从 StartServiceByName(%2$s) 方式处获得意外回复 %1$d" + +#: ../gio/gdbusproxy.c:2745 ../gio/gdbusproxy.c:2882 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"无法调用方法;代理名称为常见的无所有者的名称,而代理使用 " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 标记构建。" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "不支持抽象命名空间" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "创建服务器时无法指定临时文件" + +#: ../gio/gdbusserver.c:872 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "写入“%s”处的临时文件出错:%s" + +#: ../gio/gdbusserver.c:1038 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "字符串“%s”不是有效 D-Bus GUID" + +#: ../gio/gdbusserver.c:1078 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "无法监听不支持的传输 %s" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "命令" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"命令:\n" +" help 显示本信息\n" +" introspect Introspect 一个远程对象\n" +" monitor 监视一个远程对象\n" +" call 调用远程对象的一个方法\n" +"\n" +"使用“%s COMMAND --help”以获得每一个命令的帮助。\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:691 ../gio/gdbus-tool.c:1010 +#: ../gio/gdbus-tool.c:1443 +#, c-format +msgid "Error: %s\n" +msgstr "错误:%s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1459 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "解析 Introspection XML 时出错:%s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "连接到系统总线" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "连接到会话总线" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "连接到给定的 D-Bus 地址" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "连接端点选项:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "指定连接端点的选项" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "没有指定连接的端点" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "指定了多个连接端点" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "警告:根据 Introspection 数据,接口“%s”不存在\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "警告:根据 Introspection 数据,在接口“%s”中方法“%s”不存在\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "信号的可选目标位置(唯一名字)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "要触发信号的对象路径" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "信号和接口名称" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "发射信号。" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:822 ../gio/gdbus-tool.c:1549 +#: ../gio/gdbus-tool.c:1781 +#, c-format +msgid "Error connecting: %s\n" +msgstr "连接时出错:%s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "错误:没有指定对象路径。\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:883 ../gio/gdbus-tool.c:1607 +#: ../gio/gdbus-tool.c:1840 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "错误:%s 不是有效的对象路径\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "错误:没有指定对象。\n" + +#: ../gio/gdbus-tool.c:634 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "错误:%s 不是有效的接口名字。\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "错误:%s 不是有效的成员名字。\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "错误:%s 不是有效的唯一总线名。\n" + +#: ../gio/gdbus-tool.c:669 ../gio/gdbus-tool.c:982 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "解析第 %d 个选项出错:%s\n" + +#: ../gio/gdbus-tool.c:698 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "清空连接接时出错:%s\n" + +#: ../gio/gdbus-tool.c:725 +msgid "Destination name to invoke method on" +msgstr "调用方法的目标位置名称" + +#: ../gio/gdbus-tool.c:726 +msgid "Object path to invoke method on" +msgstr "调用方法的对象路径" + +#: ../gio/gdbus-tool.c:727 +msgid "Method and interface name" +msgstr "方法和接口名称" + +#: ../gio/gdbus-tool.c:728 +msgid "Timeout in seconds" +msgstr "超时(以秒为单位)" + +#: ../gio/gdbus-tool.c:767 +msgid "Invoke a method on a remote object." +msgstr "在远程对象上调用一个方法。" + +#: ../gio/gdbus-tool.c:842 ../gio/gdbus-tool.c:1568 ../gio/gdbus-tool.c:1800 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "错误:没有指定目标位置名称\n" + +#: ../gio/gdbus-tool.c:863 ../gio/gdbus-tool.c:1587 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "错误:没有指定对象路径\n" + +#: ../gio/gdbus-tool.c:898 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "错误:方法名没有指定\n" + +#: ../gio/gdbus-tool.c:909 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "错误:方法名“%s”无效\n" + +#: ../gio/gdbus-tool.c:974 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "解析 %2$s 类型的参数 %1$d 时发生错误:%3$s\n" + +#: ../gio/gdbus-tool.c:1406 +msgid "Destination name to introspect" +msgstr "要 Introspect 的目标位置名称" + +#: ../gio/gdbus-tool.c:1407 +msgid "Object path to introspect" +msgstr "要 Introspect 的对象路径" + +#: ../gio/gdbus-tool.c:1408 +msgid "Print XML" +msgstr "输出 XML" + +#: ../gio/gdbus-tool.c:1409 +msgid "Introspect children" +msgstr "Introspect 子对象" + +#: ../gio/gdbus-tool.c:1410 +msgid "Only print properties" +msgstr "只打印属性" + +#: ../gio/gdbus-tool.c:1501 +msgid "Introspect a remote object." +msgstr "Introspect 远程对象。" + +#: ../gio/gdbus-tool.c:1699 +msgid "Destination name to monitor" +msgstr "要监视的目标位置名称" + +#: ../gio/gdbus-tool.c:1700 +msgid "Object path to monitor" +msgstr "要监视的对象路径" + +#: ../gio/gdbus-tool.c:1733 +msgid "Monitor a remote object." +msgstr "监视一个远程对象。" + +#: ../gio/gdesktopappinfo.c:578 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "未命名" + +#: ../gio/gdesktopappinfo.c:991 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面文件未指定 Exec 区域" + +#: ../gio/gdesktopappinfo.c:1279 +msgid "Unable to find terminal required for application" +msgstr "无法找到应用程序需要的终端" + +#: ../gio/gdesktopappinfo.c:1566 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "无法创建用户应用程序配置文件夹 %s:%s" + +#: ../gio/gdesktopappinfo.c:1570 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "无法创建用户 MIME 配置文件夹 %s:%s" + +#: ../gio/gdesktopappinfo.c:1810 ../gio/gdesktopappinfo.c:1834 +msgid "Application information lacks an identifier" +msgstr "应用程序信息缺少标志符。" + +#: ../gio/gdesktopappinfo.c:2058 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "无法创建用户桌面文件 %s" + +#: ../gio/gdesktopappinfo.c:2174 +#, c-format +msgid "Custom definition for %s" +msgstr "%s 的自定义定义" + +#: ../gio/gdrive.c:363 +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:728 +msgid "drive doesn't implement start" +msgstr "驱动器未实现 start" + +#: ../gio/gdrive.c:831 +msgid "drive doesn't implement stop" +msgstr "驱动器未实现 stop" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS 支持不可用" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "无法处理 GEmblem 编码的版本 %d " + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 编码中有不正确的符号数量(%d)" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "无法处理 GEmblemedIcon 编码的版本 %d" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 编码中有不正确的符号数量(%d)" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "GEmblemedIcon 中应为 GEmblem" + +#: ../gio/gfile.c:874 ../gio/gfile.c:1105 ../gio/gfile.c:1240 +#: ../gio/gfile.c:1477 ../gio/gfile.c:1531 ../gio/gfile.c:1588 +#: ../gio/gfile.c:1671 ../gio/gfile.c:1726 ../gio/gfile.c:1786 +#: ../gio/gfile.c:1840 ../gio/gfile.c:3312 ../gio/gfile.c:3366 +#: ../gio/gfile.c:3500 ../gio/gfile.c:3541 ../gio/gfile.c:3871 +#: ../gio/gfile.c:4273 ../gio/gfile.c:4359 ../gio/gfile.c:4448 +#: ../gio/gfile.c:4546 ../gio/gfile.c:4633 ../gio/gfile.c:4727 +#: ../gio/gfile.c:5048 ../gio/gfile.c:5315 ../gio/gfile.c:5380 +#: ../gio/gfile.c:7008 ../gio/gfile.c:7098 ../gio/gfile.c:7184 +#: ../gio/win32/gwinhttpfile.c:439 +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:1361 ../gio/glocalfile.c:1070 ../gio/glocalfile.c:1081 +#: ../gio/glocalfile.c:1094 +msgid "Containing mount does not exist" +msgstr "包含的挂载不存在" + +#: ../gio/gfile.c:2414 ../gio/glocalfile.c:2289 +msgid "Can't copy over directory" +msgstr "无法跨目录复制" + +#: ../gio/gfile.c:2475 +msgid "Can't copy directory over directory" +msgstr "无法跨目录复制到目录" + +#: ../gio/gfile.c:2483 ../gio/glocalfile.c:2298 +msgid "Target file exists" +msgstr "目标文件已存在" + +#: ../gio/gfile.c:2501 +msgid "Can't recursively copy directory" +msgstr "无法递归复制目录" + +#: ../gio/gfile.c:2761 +msgid "Splice not supported" +msgstr "不支持拼接" + +#: ../gio/gfile.c:2765 +#, c-format +msgid "Error splicing file: %s" +msgstr "拼接文件出错:%s" + +#: ../gio/gfile.c:2912 +msgid "Can't copy special file" +msgstr "无法复制特殊文件" + +#: ../gio/gfile.c:3490 +msgid "Invalid symlink value given" +msgstr "给出的符号链接值无效" + +#: ../gio/gfile.c:3584 +msgid "Trash not supported" +msgstr "不支持回收站" + +#: ../gio/gfile.c:3633 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "文件名不能包含“%c”" + +#: ../gio/gfile.c:6067 ../gio/gvolume.c:332 +msgid "volume doesn't implement mount" +msgstr "卷未实现挂载" + +#: ../gio/gfile.c:6178 +msgid "No application is registered as handling this file" +msgstr "没有为此类型文件注册相应的处理程序" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "枚举器已关闭" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:480 +msgid "File enumerator has outstanding operation" +msgstr "文件枚举器有异常操作" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:470 +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:154 ../gio/gfileinputstream.c:420 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:523 +msgid "Stream doesn't support query_info" +msgstr "流不支持 query_info" + +#: ../gio/gfileinputstream.c:335 ../gio/gfileiostream.c:387 +#: ../gio/gfileoutputstream.c:381 +msgid "Seek not supported on stream" +msgstr "流不支持查找" + +#: ../gio/gfileinputstream.c:379 +msgid "Truncate not allowed on input stream" +msgstr "输入流不允许截断" + +#: ../gio/gfileiostream.c:463 ../gio/gfileoutputstream.c:457 +msgid "Truncate not supported on stream" +msgstr "流不支持截断" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "错误的符号数量(%d)" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "类名 %s 没有类型" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "类型 %s 没有实现 GIcon 接口" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "类型 %s 不是类" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "不正确的版本号:%s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "类型 %s 没有实现 GIcon 接口的 from_tokens() 方法" + +#: ../gio/gicon.c:430 +msgid "Can't handle the supplied version the icon encoding" +msgstr "无法处理提供的图标编码版本" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "没有指定地址" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "对地址来说长度 %u 太长了" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "地址位数设得超出了前缀长度" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "不能将“%s”解析为 IP 地址掩码" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "没有足够的空间套接字地址" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "不支持的套接字地址" + +#: ../gio/ginputstream.c:194 +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:898 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1238 +msgid "Stream has outstanding operation" +msgstr "流有异常操作" + +#: ../gio/glib-compile-resources.c:144 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "在 <%2$s> 中不允许元素 <%1$s>" + +#: ../gio/glib-compile-resources.c:148 ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "顶层中不允许元素 <%s>" + +#: ../gio/glib-compile-resources.c:238 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "文件 %s 在资源中出现了多次" + +#: ../gio/glib-compile-resources.c:251 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "在所有源目录中定位“%s”失败" + +#: ../gio/glib-compile-resources.c:262 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "在当前目录定位“%s”失败" + +#: ../gio/glib-compile-resources.c:290 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "未知的处理选项“%s”" + +#: ../gio/glib-compile-resources.c:308 ../gio/glib-compile-resources.c:366 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "创建临时文件失败:%s" + +#: ../gio/glib-compile-resources.c:338 +msgid "Error processing input file with xmllint" +msgstr "用 xmllint 处理输入文件出错" + +#: ../gio/glib-compile-resources.c:393 +msgid "Error processing input file with to-pixdata" +msgstr "用 to-pixdata 处理输入文件出错" + +#: ../gio/glib-compile-resources.c:406 +#, c-format +msgid "Error reading file %s: %s" +msgstr "读取文件 %s 出错:%s" + +#: ../gio/glib-compile-resources.c:426 +#, c-format +msgid "Error compressing file %s" +msgstr "压缩文件时出错:%s" + +#: ../gio/glib-compile-resources.c:490 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "<%s> 内不应出现文本" + +#: ../gio/glib-compile-resources.c:613 +msgid "name of the output file" +msgstr "输出文件名" + +#: ../gio/glib-compile-resources.c:613 ../gio/glib-compile-resources.c:646 +#: ../gio/gresource-tool.c:477 ../gio/gresource-tool.c:543 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:614 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "文件会被读出的目录(默认为当前目录)" + +#: ../gio/glib-compile-resources.c:614 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "DIRECTORY" + +#: ../gio/glib-compile-resources.c:615 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "以目标文件扩展名所选择的格式生成输出" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate source header" +msgstr "生成源码头文件" + +#: ../gio/glib-compile-resources.c:617 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "生成用于将资源文件链接到您的代码的源代码" + +#: ../gio/glib-compile-resources.c:618 +msgid "Generate dependency list" +msgstr "生成依赖关系列表" + +#: ../gio/glib-compile-resources.c:619 +msgid "Don't automatically create and register resource" +msgstr "不要自动创建和注册资源" + +#: ../gio/glib-compile-resources.c:620 +msgid "C identifier name used for the generated source code" +msgstr "用于生成的源代码的 C 标识符名称" + +#: ../gio/glib-compile-resources.c:649 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"将一份资源规格编译为资源文件。\n" +"资源规格文件以 .gresource.xml 为扩展名,\n" +"资源文件以 .gresource 为扩展名。" + +#: ../gio/glib-compile-resources.c:665 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "您应该给出惟一的文件名\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "不允许空名称" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "无效名称 %s:名称必须以小写字母开始" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and dash ('-') are permitted." +msgstr "无效名称 %s:无效的字符 %c,仅小写字母、数字和横线(“-”)可以使用。" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive dashes ('--') are not permitted." +msgstr "无效名称 %s:不允许使用连续的横行(“--”)。" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a dash ('-')." +msgstr "无效名称 %s:最后一个字符串不应为横线(“-”)。" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "无效名称 %s:最大长度为 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " 已指定" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "无法添加键到一个 list-of 方案" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " 已指定" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" 与 在 重合; 请使用 " +" 修改其值。" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "type、enum 或 flags 中必须有一个被指定为 的属性。" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> 尚未定义。" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "无效的 GVariant 类型字符串 %s" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "给出了 但方案并未扩展" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "无 可覆盖" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " 已指定" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " 已指定" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not yet existing schema '%s'" +msgstr " 扩展了尚不存在的方案 %s" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not yet existing schema '%s'" +msgstr " 是尚不存在的方案 %s 的列表" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "不能是一系列带有路径的方案" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "无法使用路径扩展方案" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " 是一个列表,扩展的 不是列表" + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" 扩展 ,但“%s”不扩" +"展 %s" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "一个路径,如果给出则必须以斜线(/)开始和结束" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "一个列表的路径必须以 :/ 结束" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> 已指定" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "指定了 --strict;退出。\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "整个文件被忽略。\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "忽略此文件。\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "覆盖文件 %3$s 中指定的方案 %2$s 中没有键 %1$s" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr ";忽略对此键的覆盖。\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "并且指定了 --strict;退出。\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': %" +"s. " +msgstr "解析覆盖文件 %3$s 中指定的 %2$s 中的键 %1$s 出错:%4$s。" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "忽略对此键的覆盖。\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is out of the " +"range given in the schema" +msgstr "覆盖文件 %3$s 中方案 %2$s 的键 %1$s 的覆盖超出了方案给出的范围" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "覆盖文件 %3$s 中方案 %2$s 的键 %1$s 的覆盖的值不在有效值列表内" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "gschemas.compiled 文件存储于何处" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "在方案出现任何错误时中止" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "不要对 gschema.compiled 进行写操作" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "不要强制键名的限制" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"编译所有的 GSettings 方案文件为方案缓存。\n" +"要使用扩展 .gschema.xml,需要有方案文件,\n" +"缓存文件被称为 gschemas.compiled。" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "您应该给出且只能给出一个目录名\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "没有找到方案文件:" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "什么都没做。\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "已删除存在的输出文件。\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "无法找到默认的本地目录监视器类型" + +#: ../gio/glocalfile.c:571 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "无效的文件名 %s" + +#: ../gio/glocalfile.c:948 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "读取文件系统信息时出错:%s" + +#: ../gio/glocalfile.c:1116 +msgid "Can't rename root directory" +msgstr "无法重命名根目录" + +#: ../gio/glocalfile.c:1136 ../gio/glocalfile.c:1162 +#, c-format +msgid "Error renaming file: %s" +msgstr "重命名文件时出错:%s" + +#: ../gio/glocalfile.c:1145 +msgid "Can't rename file, filename already exists" +msgstr "无法重命名文件,该文件名已存在" + +#: ../gio/glocalfile.c:1158 ../gio/glocalfile.c:2162 ../gio/glocalfile.c:2191 +#: ../gio/glocalfile.c:2351 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "无效的文件名" + +#: ../gio/glocalfile.c:1325 ../gio/glocalfile.c:1349 +msgid "Can't open directory" +msgstr "无法打开目录" + +#: ../gio/glocalfile.c:1333 +#, c-format +msgid "Error opening file: %s" +msgstr "打开文件时出错:%s" + +#: ../gio/glocalfile.c:1474 +#, c-format +msgid "Error removing file: %s" +msgstr "删除文件时出错:%s" + +#: ../gio/glocalfile.c:1841 +#, c-format +msgid "Error trashing file: %s" +msgstr "将文件放到回收站时出错:%s" + +#: ../gio/glocalfile.c:1864 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "无法创建回收站目录 %s:%s" + +#: ../gio/glocalfile.c:1885 +msgid "Unable to find toplevel directory for trash" +msgstr "找不到回收站的顶级目录" + +#: ../gio/glocalfile.c:1964 ../gio/glocalfile.c:1984 +msgid "Unable to find or create trash directory" +msgstr "无法找到或创建回收站目录" + +#: ../gio/glocalfile.c:2018 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "创建回收站信息文件失败:%s" + +#: ../gio/glocalfile.c:2047 ../gio/glocalfile.c:2052 ../gio/glocalfile.c:2132 +#: ../gio/glocalfile.c:2139 +#, c-format +msgid "Unable to trash file: %s" +msgstr "无法将文件移动到回收站:%s" + +#: ../gio/glocalfile.c:2140 ../glib/gregex.c:213 +msgid "internal error" +msgstr "内部错误" + +#: ../gio/glocalfile.c:2166 +#, c-format +msgid "Error creating directory: %s" +msgstr "创建目录时出错:%s" + +#: ../gio/glocalfile.c:2195 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "文件系统不支持符号链接" + +#: ../gio/glocalfile.c:2199 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "创建符号链接时出错:%s" + +#: ../gio/glocalfile.c:2261 ../gio/glocalfile.c:2355 +#, c-format +msgid "Error moving file: %s" +msgstr "移动文件时出错:%s" + +#: ../gio/glocalfile.c:2284 +msgid "Can't move directory over directory" +msgstr "无法将目录移动到目录" + +#: ../gio/glocalfile.c:2311 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "备份文件创建失败" + +#: ../gio/glocalfile.c:2330 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目标文件出错:%s" + +#: ../gio/glocalfile.c:2344 +msgid "Move between mounts not supported" +msgstr "不支持在挂载之间移动" + +#: ../gio/glocalfileinfo.c:719 +msgid "Attribute value must be non-NULL" +msgstr "属性值必须为非空" + +#: ../gio/glocalfileinfo.c:726 +msgid "Invalid attribute type (string expected)" +msgstr "无效的属性类型(应为 string)" + +#: ../gio/glocalfileinfo.c:733 +msgid "Invalid extended attribute name" +msgstr "无效的扩展属性名" + +#: ../gio/glocalfileinfo.c:773 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "设置扩展属性“%s”出错:%s" + +#: ../gio/glocalfileinfo.c:1426 +msgid " (invalid encoding)" +msgstr " (无效的编码)" + +#: ../gio/glocalfileinfo.c:1527 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "获取文件“%s”的信息出错:%s" + +#: ../gio/glocalfileinfo.c:1779 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "获取文件描述符的信息时出错:%s" + +#: ../gio/glocalfileinfo.c:1824 +msgid "Invalid attribute type (uint32 expected)" +msgstr "无效的属性类型(应为 uint32)" + +#: ../gio/glocalfileinfo.c:1842 +msgid "Invalid attribute type (uint64 expected)" +msgstr "无效的属性类型(应为 uint64)" + +#: ../gio/glocalfileinfo.c:1861 ../gio/glocalfileinfo.c:1880 +msgid "Invalid attribute type (byte string expected)" +msgstr "无效的属性类型(应为 byte string)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Cannot set permissions on symlinks" +msgstr "无法为符号链设置权限" + +#: ../gio/glocalfileinfo.c:1931 +#, c-format +msgid "Error setting permissions: %s" +msgstr "设置访问权限出错:%s" + +#: ../gio/glocalfileinfo.c:1982 +#, c-format +msgid "Error setting owner: %s" +msgstr "设置所有者出错:%s" + +#: ../gio/glocalfileinfo.c:2005 +msgid "symlink must be non-NULL" +msgstr "符号链接必须是非空" + +#: ../gio/glocalfileinfo.c:2015 ../gio/glocalfileinfo.c:2034 +#: ../gio/glocalfileinfo.c:2045 +#, c-format +msgid "Error setting symlink: %s" +msgstr "设置符号链接出错:%s" + +#: ../gio/glocalfileinfo.c:2024 +msgid "Error setting symlink: file is not a symlink" +msgstr "设定符号链接出错:文件不是符号链接" + +#: ../gio/glocalfileinfo.c:2150 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "错误设置修改或访问时间:%s" + +#: ../gio/glocalfileinfo.c:2173 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 上下文必须是非空" + +#: ../gio/glocalfileinfo.c:2188 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "设置 SELinux 上下文出错:%s" + +#: ../gio/glocalfileinfo.c:2195 +msgid "SELinux is not enabled on this system" +msgstr "此系统尚未启用 SELinux" + +#: ../gio/glocalfileinfo.c:2287 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支持设置属性 %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "读取文件出错:%s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在文件中定位时出错:%s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "关闭文件出错:%s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "无法找到默认的本地文件监视器类型" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "写入文件出错:%s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除旧的备份链接出错:%s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "创建备份拷贝:%s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重命名临时文件出错:%s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "截断文件出错:%s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "打开文件“%s”出错:%s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "目标文件是目录" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "目标文件不是普通文件" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "文件已经被其他程序修改" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除旧文件出错:%s" + +#: ../gio/gmemoryinputstream.c:492 ../gio/gmemoryoutputstream.c:750 +msgid "Invalid GSeekType supplied" +msgstr "提供的 GSeekType 无效" + +#: ../gio/gmemoryinputstream.c:502 +msgid "Invalid seek request" +msgstr "无效的查找请求" + +#: ../gio/gmemoryinputstream.c:526 +msgid "Cannot truncate GMemoryInputStream" +msgstr "无法截断 GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:496 +msgid "Memory output stream not resizable" +msgstr "内存输出流无法改变大小" + +#: ../gio/gmemoryoutputstream.c:512 +msgid "Failed to resize memory output stream" +msgstr "改变内存输出流大小失败" + +#: ../gio/gmemoryoutputstream.c:600 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "处理写入所需要的内存超过了可用的空间" + +#: ../gio/gmemoryoutputstream.c:760 +msgid "Requested seek before the beginning of the stream" +msgstr "请求的定位值在流的开始之前" + +#: ../gio/gmemoryoutputstream.c:769 +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:363 +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:442 +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:611 +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:701 +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:785 +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:874 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "挂载未实现同步内容类型猜测" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主机名“%s”包含“[”但是缺少“]”" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "网络不可达" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "主机不可达" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "不能创建网络监视器:%s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "不能创建网络监视器:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "不能获取网络状态: %s" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:417 +msgid "Output stream doesn't implement write" +msgstr "输出流未实现写入(write)" + +#: ../gio/goutputstream.c:378 ../gio/goutputstream.c:876 +msgid "Source stream is already closed" +msgstr "源流已经关闭" + +#: ../gio/gresolver.c:764 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "解析“%s”出错:%s" + +#: ../gio/gresolver.c:814 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "反向解析“%s”出错:%s" + +#: ../gio/gresolver.c:849 ../gio/gresolver.c:928 +#, c-format +msgid "No service record for '%s'" +msgstr "没有“%s”的服务记录" + +#: ../gio/gresolver.c:854 ../gio/gresolver.c:933 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暂时无法解析“%s”" + +#: ../gio/gresolver.c:859 ../gio/gresolver.c:938 +#, c-format +msgid "Error resolving '%s'" +msgstr "解析“%s”出错" + +#: ../gio/gresource.c:295 ../gio/gresource.c:540 ../gio/gresource.c:557 +#: ../gio/gresource.c:678 ../gio/gresource.c:747 ../gio/gresource.c:808 +#: ../gio/gresource.c:888 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:552 ../gio/gresourcefile.c:654 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "位于 “%s”的资源不存在" + +#: ../gio/gresource.c:457 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "解压位于“%s”的资源失败" + +#: ../gio/gresourcefile.c:650 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "“%s” 处的资源并非目录" + +#: ../gio/gresourcefile.c:858 +msgid "Input stream doesn't implement seek" +msgstr "输入流未实现搜寻(seek)" + +#: ../gio/gresource-tool.c:470 ../gio/gsettings-tool.c:530 +msgid "Print help" +msgstr "打印帮助" + +#: ../gio/gresource-tool.c:471 ../gio/gresource-tool.c:539 +msgid "[COMMAND]" +msgstr "[COMMAND]" + +#: ../gio/gresource-tool.c:476 +msgid "List sections containing resources in an elf FILE" +msgstr "列出 ELF 文件 FILE 中包含资源的段" + +#: ../gio/gresource-tool.c:482 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"列出资源\n" +"如果指定了 SECTION,则仅在此段中列出资源\n" +"如果指定了 PATH,则仅列出匹配的资源" + +#: ../gio/gresource-tool.c:485 ../gio/gresource-tool.c:495 +msgid "FILE [PATH]" +msgstr "FILE [PATH]" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +#: ../gio/gresource-tool.c:503 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:491 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"列出资源和详细信息\n" +"如果指定了 SECTION,则仅列出此段中的资源\n" +"如果指定了 PATH,则仅列出匹配的资源\n" +"详细信息包括段、大小和压缩情况" + +#: ../gio/gresource-tool.c:501 +msgid "Extract a resource file to stdout" +msgstr "提取一个资源文件到标准输出" + +#: ../gio/gresource-tool.c:502 +msgid "FILE PATH" +msgstr "FILE PATH" + +#: ../gio/gresource-tool.c:508 ../gio/gsettings-tool.c:610 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"未知命令 %s\n" +"\n" + +#: ../gio/gresource-tool.c:516 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"命令:\n" +" help 显示此信息\n" +" sections 列出资源段\n" +" list 列出资源\n" +" details 列出资源和详细信息\n" +" extract 提取某个资源\n" +"\n" +"使用“gresoure help COMMAND”获取详细帮助。\n" +"\n" + +#: ../gio/gresource-tool.c:530 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:533 ../gio/gsettings-tool.c:643 +msgid "Arguments:\n" +msgstr "参数:\n" + +#: ../gio/gresource-tool.c:537 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION ELF 段名(可选)\n" + +#: ../gio/gresource-tool.c:541 ../gio/gsettings-tool.c:650 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND 要解释的命令(可选)\n" + +#: ../gio/gresource-tool.c:547 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE ELF 文件(可执行文件或共享库)\n" + +#: ../gio/gresource-tool.c:550 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE ELF 文件(可执行文件或共享库)\n" +" 或已编译的资源文件\n" + +#: ../gio/gresource-tool.c:554 +msgid "[PATH]" +msgstr "[PATH]" + +#: ../gio/gresource-tool.c:556 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH (部分)资源路径(可选)\n" + +#: ../gio/gresource-tool.c:557 +msgid "PATH" +msgstr "PATH" + +#: ../gio/gresource-tool.c:559 +msgid " PATH A resource path\n" +msgstr " PATH 资源路径\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "没有“%s”这个方案\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "“%s”方案不可重定向(必须指定路径)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "“%s”方案可重定向(必须指定路径)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "指定的路径为空。\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "路径必须以斜杠开头(/)\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "路径必须以斜杠结束(/)\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "路径中不能包含连续两个斜杠(//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "没有“%s”这个键\n" + +#: ../gio/gsettings-tool.c:503 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "提供的值不在有效范围内\n" + +#: ../gio/gsettings-tool.c:536 +msgid "List the installed (non-relocatable) schemas" +msgstr "列出安装的(不可重定向的)方案" + +#: ../gio/gsettings-tool.c:542 +msgid "List the installed relocatable schemas" +msgstr "列出安装的可重定向方案" + +#: ../gio/gsettings-tool.c:548 +msgid "List the keys in SCHEMA" +msgstr "列出 SCHEMA 中的键" + +#: ../gio/gsettings-tool.c:549 ../gio/gsettings-tool.c:555 +#: ../gio/gsettings-tool.c:592 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:554 +msgid "List the children of SCHEMA" +msgstr "列出 SCHEMA 的子对象" + +#: ../gio/gsettings-tool.c:560 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"递归列出键和值\n" +"如果没有给出 SCHEMA,列出所有键\n" + +#: ../gio/gsettings-tool.c:562 +msgid "[SCHEMA[:PATH]]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:567 +msgid "Get the value of KEY" +msgstr "获取 KEY 的值" + +#: ../gio/gsettings-tool.c:568 ../gio/gsettings-tool.c:574 +#: ../gio/gsettings-tool.c:586 ../gio/gsettings-tool.c:598 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:573 +msgid "Query the range of valid values for KEY" +msgstr "查询 KEY 的有效值范围" + +#: ../gio/gsettings-tool.c:579 +msgid "Set the value of KEY to VALUE" +msgstr "将 KEY 的值设为 VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:585 +msgid "Reset KEY to its default value" +msgstr "将 KEY 重设为默认值" + +#: ../gio/gsettings-tool.c:591 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "重置 SCHEMA 中所有键为默认值" + +#: ../gio/gsettings-tool.c:597 +msgid "Check if KEY is writable" +msgstr "查看 KEY 是否可写" + +#: ../gio/gsettings-tool.c:603 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"监视 KEY 的更改。\n" +"如果没有指定 KEY,则监视 SCHEMA 中的所有键。\n" +"使用 ^C 停止监视。\n" + +#: ../gio/gsettings-tool.c:606 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:618 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"命令:\n" +" help 显示此信息\n" +" list-schemas 列出安装了的方案\n" +" list-relocatable-schemas 列出可重定向的方案\n" +" list-keys 列出某个方案中的键\n" +" list-children 列出某个方案的子对象\n" +" list-recursively 递归地列出键和值\n" +" range 查询某个键的范围\n" +" get 获取某个键值\n" +" set 设置某个键值\n" +" reset 重设某个键值\n" +" reset-recursively 重设指定方案中的所有值\n" +" writable 检查某个键是否可写\n" +" monitor 监视更改\n" +"\n" +"使用 'gsettings help 命令' 查看详细的帮助。\n" +"\n" + +#: ../gio/gsettings-tool.c:640 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:646 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR 一个用于搜索附加方案的目录\n" + +#: ../gio/gsettings-tool.c:654 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA 方案的名称\n" +" PATH 可重定向方案的路径\n" + +#: ../gio/gsettings-tool.c:659 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY 方案中(可选)的键\n" + +#: ../gio/gsettings-tool.c:663 +msgid " KEY The key within the schema\n" +msgstr " KEY 方案中的键\n" + +#: ../gio/gsettings-tool.c:667 +msgid " VALUE The value to set\n" +msgstr " VALUE 要设的值\n" + +#: ../gio/gsettings-tool.c:788 +#, c-format +msgid "Empty schema name given\n" +msgstr "给出了空的大纲名称\n" + +#: ../gio/gsocket.c:282 +msgid "Invalid socket, not initialized" +msgstr "无效的套接字,尚未初始化" + +#: ../gio/gsocket.c:289 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "无效的套接字,初始化失败的原因是:%s" + +#: ../gio/gsocket.c:297 +msgid "Socket is already closed" +msgstr "套接字已经关闭" + +#: ../gio/gsocket.c:305 ../gio/gsocket.c:3527 ../gio/gsocket.c:3582 +msgid "Socket I/O timed out" +msgstr "套接字 I/O 超时" + +#: ../gio/gsocket.c:472 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "从文件描述符创建 GSocket:%s" + +#: ../gio/gsocket.c:506 ../gio/gsocket.c:513 ../gio/gsocket.c:529 +#, c-format +msgid "Unable to create socket: %s" +msgstr "无法创建套接字:%s" + +#: ../gio/gsocket.c:506 +msgid "Unknown family was specified" +msgstr "指定了未知协议族" + +#: ../gio/gsocket.c:513 +msgid "Unknown protocol was specified" +msgstr "指定了未知协议" + +#: ../gio/gsocket.c:1720 +#, c-format +msgid "could not get local address: %s" +msgstr "不能获取本地地址:%s" + +#: ../gio/gsocket.c:1763 +#, c-format +msgid "could not get remote address: %s" +msgstr "不能获取远程地址: %s" + +#: ../gio/gsocket.c:1824 +#, c-format +msgid "could not listen: %s" +msgstr "无法监听:%s" + +#: ../gio/gsocket.c:1898 +#, c-format +msgid "Error binding to address: %s" +msgstr "错误绑定地址:%s" + +#: ../gio/gsocket.c:1951 ../gio/gsocket.c:1987 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "加入多播组出错:%s" + +#: ../gio/gsocket.c:1952 ../gio/gsocket.c:1988 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "退出多播组出错:%s" + +#: ../gio/gsocket.c:1953 +msgid "No support for source-specific multicast" +msgstr "不支持指定源的多播" + +#: ../gio/gsocket.c:2172 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受连接时出错:%s" + +#: ../gio/gsocket.c:2293 +msgid "Connection in progress" +msgstr "正在连接" + +#: ../gio/gsocket.c:2345 ../gio/gsocket.c:4324 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "无法获取未决的错误:%s" + +#: ../gio/gsocket.c:2515 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收数据出错:%s" + +#: ../gio/gsocket.c:2693 +#, c-format +msgid "Error sending data: %s" +msgstr "发送数据出错:%s" + +#: ../gio/gsocket.c:2807 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "无法关闭套接字:%s" + +#: ../gio/gsocket.c:2886 +#, c-format +msgid "Error closing socket: %s" +msgstr "关闭套接字出错:%s" + +#: ../gio/gsocket.c:3520 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等待套接字状态:%s" + +#: ../gio/gsocket.c:3798 ../gio/gsocket.c:3879 +#, c-format +msgid "Error sending message: %s" +msgstr "发送信息出错:%s" + +#: ../gio/gsocket.c:3823 +msgid "GSocketControlMessage not supported on windows" +msgstr "Windows 不支持 GSocketControlMessage" + +#: ../gio/gsocket.c:4103 ../gio/gsocket.c:4239 +#, c-format +msgid "Error receiving message: %s" +msgstr "接受信息出错:%s" + +#: ../gio/gsocket.c:4343 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "此操作系统上没有实现 g_socket_get_credentials" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "不能连接到代理服务器 %s:" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "无法连接到 %s:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "无法连接:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "连接时出现未知错误" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Trying to proxy over non-TCP connection is not supported." +msgstr "不支持通过非 TCP 连接的代理。" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "不支持 %s 代理协议。" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "监听器已关闭" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "新增套接字已关闭" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 不支持 IPv6 地址 %s" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "用户名对于 SOCKSv4 协议太长。" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "主机名 %s 对于 SOCKSv4 协议太长" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "此服务器不是 SOCKSv4 代理服务器。" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "通过 SOCKSv4 服务器连接被拒绝" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "此服务器不是 SOCKSv5 代理服务器。" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKSv5 代理服务器需要认证。" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "æ­¤ SOCKSv5 连接需要一种 GLib 不支持的认证方法。" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "用户名或密码对于 SOCKSv5 协议太长。" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 认证失败:用户名或密码错误。" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "主机名 %s 对于 SOCKSv5 协议太长。" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 代理服务器使用未知地址类型。" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "SOCKSv5 代理服务器内部错误。" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "规则不允许 SOCKSv5 连接。" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "通过 SOCKSv5 服务器主机不可达。" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "通过 SOCKSv5 代理网络不可达。" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "通过 SOCKSv5 代理连接被拒绝。" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 代理不支持 connect 命令。" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 代理不支持提供的地址类型。" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "未知 SOCKSv5 代理错误。" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "无法处理 GThemedIcon 编码的版本 %d" + +#: ../gio/gtlscertificate.c:249 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "无法解密 PEM 加密的私钥" + +#: ../gio/gtlscertificate.c:254 +msgid "No PEM-encoded private key found" +msgstr "未找到 PEM 加密的私钥" + +#: ../gio/gtlscertificate.c:264 +msgid "Could not parse PEM-encoded private key" +msgstr "无法解析 PEM 加密的私钥" + +#: ../gio/gtlscertificate.c:289 +msgid "No PEM-encoded certificate found" +msgstr "未找到 PEM 加密的证书" + +#: ../gio/gtlscertificate.c:298 +msgid "Could not parse PEM-encoded certificate" +msgstr "无法解析 PEM 加密的证书" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "这是您的访问被锁定前最后一次机会输入正确的密码。" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "密码多次输入错误,您的访问将在下一次错误输入后锁定。" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "输入的密码不正确。" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:582 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "期望一个控制信息,却得到 %d 个" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:592 +msgid "Unexpected type of ancillary data" +msgstr "非预期的辅助数据类型" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "期望一个文件描述符,却得到 %d 个\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "收到无效文件描述符" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "发送证书出错:" + +#: ../gio/gunixconnection.c:511 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "检查套接字是否启用 SO_PASSCRED 出错:%s" + +#: ../gio/gunixconnection.c:520 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "检查套接字是否启用 SO_PASSCRED 时选项长度异常。期望 %d 字节,获得了 %d" + +#: ../gio/gunixconnection.c:537 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "启用 SO_PASSCRED 出错:%s" + +#: ../gio/gunixconnection.c:568 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "期望为接收证书读到单个字节但是只读到了 0 字节" + +#: ../gio/gunixconnection.c:606 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "未期望控制信息,却得到 %d 个" + +#: ../gio/gunixconnection.c:632 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "禁用 SO_PASSCRED 时出错:%s" + +#: ../gio/gunixinputstream.c:392 ../gio/gunixinputstream.c:413 +#: ../gio/gunixinputstream.c:493 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "从文件描述符读取出错:%s" + +#: ../gio/gunixinputstream.c:448 ../gio/gunixinputstream.c:643 +#: ../gio/gunixoutputstream.c:434 ../gio/gunixoutputstream.c:598 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "关闭文件描述符出错:%s" + +#: ../gio/gunixmounts.c:1983 ../gio/gunixmounts.c:2020 +msgid "Filesystem root" +msgstr "文件系统根目录" + +#: ../gio/gunixoutputstream.c:378 ../gio/gunixoutputstream.c:399 +#: ../gio/gunixoutputstream.c:479 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "写入文件描述符出错:%s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract unix domain socket addresses not supported on this system" +msgstr "本系统不支持摘要 Unix 域套接字地址" + +#: ../gio/gvolume.c:408 +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:488 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "卷未执行 eject 或 eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "无法找到应用程序" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "启动应用程序出错:%s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "不支持 URI" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "win32 不支持关联的修改" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "win32 不支持关联的创建" + +#: ../gio/gwin32inputstream.c:318 +#, c-format +msgid "Error reading from handle: %s" +msgstr "读取句柄出错:%s" + +#: ../gio/gwin32inputstream.c:348 ../gio/gwin32outputstream.c:348 +#, c-format +msgid "Error closing handle: %s" +msgstr "关闭句柄出错:%s" + +#: ../gio/gwin32outputstream.c:318 +#, c-format +msgid "Error writing to handle: %s" +msgstr "写入句柄出错:%s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "内存不足" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "内部错误:%s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "需要更多输入" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "无效的压缩数据" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元素“%2$s”的意外属性“%1$s”" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "元素“%2$s”的属性“%1$s”未找到" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "意外标签“%s”,需要标签“%s”" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "“%2$s”中的意外标签“%1$s”" + +#: ../glib/gbookmarkfile.c:1806 +msgid "No valid bookmark file found in data dirs" +msgstr "数据目录中没有找到有效的书签文件" + +#: ../glib/gbookmarkfile.c:2007 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI“%s”的书签已经存在" + +#: ../glib/gbookmarkfile.c:2053 ../glib/gbookmarkfile.c:2211 +#: ../glib/gbookmarkfile.c:2296 ../glib/gbookmarkfile.c:2376 +#: ../glib/gbookmarkfile.c:2461 ../glib/gbookmarkfile.c:2544 +#: ../glib/gbookmarkfile.c:2622 ../glib/gbookmarkfile.c:2701 +#: ../glib/gbookmarkfile.c:2743 ../glib/gbookmarkfile.c:2840 +#: ../glib/gbookmarkfile.c:2960 ../glib/gbookmarkfile.c:3150 +#: ../glib/gbookmarkfile.c:3226 ../glib/gbookmarkfile.c:3391 +#: ../glib/gbookmarkfile.c:3480 ../glib/gbookmarkfile.c:3570 +#: ../glib/gbookmarkfile.c:3698 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "未找到 URI“%s”的书签" + +#: ../glib/gbookmarkfile.c:2385 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI“%s”的书签未定义 MIME 类型" + +#: ../glib/gbookmarkfile.c:2470 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI“%s”的书签未定义私有标志" + +#: ../glib/gbookmarkfile.c:2849 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI“%s”的书签未设定组" + +#: ../glib/gbookmarkfile.c:3244 ../glib/gbookmarkfile.c:3401 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "没有名为“%s”的应用程序为“%s”注册书签" + +#: ../glib/gbookmarkfile.c:3424 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "用 URI“%2$s”展开 exec 行“%1$s”失败" + +#: ../glib/gconvert.c:807 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "输入末尾出现未尽字符序列" + +#: ../glib/gconvert.c:1057 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "无法转换后备字符集“%s”到字符集“%s”" + +#: ../glib/gconvert.c:1874 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI“%s”不是“file”格式的绝对 URI" + +#: ../glib/gconvert.c:1884 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本地文件 URI“%s”不能包含“#”" + +#: ../glib/gconvert.c:1901 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI“%s”无效" + +#: ../glib/gconvert.c:1913 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI中的主机名“%s”无效" + +#: ../glib/gconvert.c:1929 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI“%s”中包含无效的转义字符" + +#: ../glib/gconvert.c:2024 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路径名“%s”不是绝对路径" + +#: ../glib/gconvert.c:2034 +msgid "Invalid hostname" +msgstr "无效的主机名" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "上午" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "下午" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "%Yå¹´%m月%d日 %A %H时%M分%S秒" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%m/%d/%y" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p %I时%M分%S秒" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "一月" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "二月" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "三月" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "四月" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "五月" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "六月" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "七月" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "八月" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "九月" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "十月" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "十一月" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "十二月" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "01月" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "02月" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "03月" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "04月" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "05月" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "06月" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "07月" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "08月" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "09月" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "10月" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "11月" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "12月" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "星期一" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "星期二" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "星期三" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "星期四" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "星期五" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "星期六" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "星期日" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "一" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "二" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "三" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "四" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "五" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "六" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "日" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "打开目录“%s”时发生错误:%s" + +#: ../glib/gfileutils.c:675 ../glib/gfileutils.c:763 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "无法分配 %lu 字节以读取文件“%s”" + +#: ../glib/gfileutils.c:690 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "读取文件“%s”出错:%s" + +#: ../glib/gfileutils.c:704 +#, c-format +msgid "File \"%s\" is too large" +msgstr "文件“%s”太大" + +#: ../glib/gfileutils.c:787 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "读取文件“%s”失败:%s" + +#: ../glib/gfileutils.c:838 ../glib/gfileutils.c:925 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "打开文件“%s”失败:%s" + +#: ../glib/gfileutils.c:855 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "获得文件“%s”的属性失败:fstat() 失败:%s" + +#: ../glib/gfileutils.c:889 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "打开文件“%s”失败:fdopen() 失败:%s" + +#: ../glib/gfileutils.c:997 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "将文件“%s”重命名为“%s”失败:g_rename() 失败:%s" + +#: ../glib/gfileutils.c:1039 ../glib/gfileutils.c:1584 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "创建文件“%s”失败:%s" + +#: ../glib/gfileutils.c:1053 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "打开文件“%s”写入失败:fdopen() 失败:%s" + +#: ../glib/gfileutils.c:1078 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "写入文件“%s”失败:fwrite() 失败:%s" + +#: ../glib/gfileutils.c:1097 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "写入文件“%s”失败:fflush() 失败:%s" + +#: ../glib/gfileutils.c:1141 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "写入文件“%s”失败:fsync() 失败:%s" + +#: ../glib/gfileutils.c:1165 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "关闭文件“%s”失败:fclose() 失败:%s" + +#: ../glib/gfileutils.c:1287 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "无法删除已有文件“%s”:g_unlink() 失败:%s" + +#: ../glib/gfileutils.c:1547 +#, c-format +msgid "Template '%s' invalid, should not contain a '%s'" +msgstr "模板“%s”无效,不应该包含“%s”" + +#: ../glib/gfileutils.c:1560 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "模板“%s”不包含 XXXXXX" + +#: ../glib/gfileutils.c:2088 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "读取符号链接“%s”失败:%s" + +#: ../glib/gfileutils.c:2109 +msgid "Symbolic links not supported" +msgstr "不支持符号链接" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "无法打开从“%s”到“%s”的转换器:%s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "g_io_channel_read_line_string 函数无法进行原始读取" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "在读缓冲里留有未转换数据" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "通道终止于未尽字符" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 函数无法进行原始读取" + +#: ../glib/gkeyfile.c:726 +msgid "Valid key file could not be found in search dirs" +msgstr "在搜索目录中无法找到有效的键文件" + +#: ../glib/gkeyfile.c:762 +msgid "Not a regular file" +msgstr "不是普通文件" + +#: ../glib/gkeyfile.c:1162 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "键文件中的行“%s”不是键-值对、组或注释" + +#: ../glib/gkeyfile.c:1222 +#, c-format +msgid "Invalid group name: %s" +msgstr "无效的组名:%s" + +#: ../glib/gkeyfile.c:1244 +msgid "Key file does not start with a group" +msgstr "键文件不以组开始" + +#: ../glib/gkeyfile.c:1270 +#, c-format +msgid "Invalid key name: %s" +msgstr "无效的键名:%s" + +#: ../glib/gkeyfile.c:1297 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "键文件包含不支持的编码“%s”" + +#: ../glib/gkeyfile.c:1541 ../glib/gkeyfile.c:1703 ../glib/gkeyfile.c:3081 +#: ../glib/gkeyfile.c:3147 ../glib/gkeyfile.c:3273 ../glib/gkeyfile.c:3406 +#: ../glib/gkeyfile.c:3548 ../glib/gkeyfile.c:3778 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "键文件没有组“%s”" + +#: ../glib/gkeyfile.c:1715 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "键文件没有键“%s”" + +#: ../glib/gkeyfile.c:1822 ../glib/gkeyfile.c:1938 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "键文件包含“%s”,其值“%s”不是 UTF-8" + +#: ../glib/gkeyfile.c:1842 ../glib/gkeyfile.c:1958 ../glib/gkeyfile.c:2327 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "键文件包含键“%s”,其值无法解释。" + +#: ../glib/gkeyfile.c:2544 ../glib/gkeyfile.c:2910 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "键文件中组“%2$s”的键“%1$s”有一个无法解释的值。" + +#: ../glib/gkeyfile.c:2622 ../glib/gkeyfile.c:2698 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "组“%2$s”中的键“%1$s”的值为“%3$s”,应为 %4$s。" + +#: ../glib/gkeyfile.c:3096 ../glib/gkeyfile.c:3288 ../glib/gkeyfile.c:3857 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "键文件的组“%2$s”中不包含键“%1$s”" + +#: ../glib/gkeyfile.c:4089 +msgid "Key file contains escape character at end of line" +msgstr "键文件在行尾含有转义字符" + +#: ../glib/gkeyfile.c:4111 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "键文件中包含无效的转义序列“%s”" + +#: ../glib/gkeyfile.c:4253 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "无法将值“%s”解释为数值。" + +#: ../glib/gkeyfile.c:4267 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整数值“%s”超出范围" + +#: ../glib/gkeyfile.c:4300 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "无法将值“%s”解释为浮点数。" + +#: ../glib/gkeyfile.c:4324 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "无法将值“%s”解释为布尔值。" + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "获取文件“%s%s%s%s”的属性失败 : fstat() 失败:%s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "映射 %s%s%s%s 失败:mmap() 失败:%s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "打开文件“%s”失败:open() 失败:%s" + +#: ../glib/gmarkup.c:356 ../glib/gmarkup.c:397 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第 %d 行第 %d 个字符出错:" + +#: ../glib/gmarkup.c:419 ../glib/gmarkup.c:502 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "无效的 UTF-8 编码的文本名称 -“%s”无效" + +#: ../glib/gmarkup.c:430 +#, c-format +msgid "'%s' is not a valid name " +msgstr "“%s”不是有效的名称" + +#: ../glib/gmarkup.c:446 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "“%s”不是有效的名称:“%c”" + +#: ../glib/gmarkup.c:555 +#, c-format +msgid "Error on line %d: %s" +msgstr "第 %d 行出错:%s" + +#: ../glib/gmarkup.c:639 +#, 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:651 +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:677 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字符引用“%-.*s”不是编码一个被允许的字符" + +#: ../glib/gmarkup.c:715 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "发现空的实体“&;”。有效的实体为:& " < > '" + +#: ../glib/gmarkup.c:723 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "未知的实体名“%-.*s”" + +#: ../glib/gmarkup.c:728 +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:1076 +msgid "Document must begin with an element (e.g. )" +msgstr "文档必须以一个元素开始(例如 )" + +#: ../glib/gmarkup.c:1116 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "“%s”出现在字符“<”后是无效字符;它不能作为元素名的开头" + +#: ../glib/gmarkup.c:1184 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag '%" +"s'" +msgstr "字符“%s”无效,应该以字符“>”来结束空元素标记“%s”" + +#: ../glib/gmarkup.c:1268 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "字符“%s”无效,在属性名“%s”(元素“%s”)的后应该是字符“=”" + +#: ../glib/gmarkup.c:1309 +#, 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:1353 +#, 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:1486 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "“%s”出现在结束的元素名“%s”后无效;允许的字符是“>”" + +#: ../glib/gmarkup.c:1533 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素“%s”已经结束,没有未结束的元素" + +#: ../glib/gmarkup.c:1542 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素“%s”已经结束,当前未结束的元素是“%s”" + +#: ../glib/gmarkup.c:1710 +msgid "Document was empty or contained only whitespace" +msgstr "文档为空或仅含空白字符" + +#: ../glib/gmarkup.c:1724 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文档在一个打开的尖括号“<”后意外结束" + +#: ../glib/gmarkup.c:1732 ../glib/gmarkup.c:1777 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "文档在还存在未结束元素时意外结束 - 最后的未结束元素是“%s”" + +#: ../glib/gmarkup.c:1740 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文档意外结束,应该以右尖括号“>”来结束标记 <%s/>" + +#: ../glib/gmarkup.c:1746 +msgid "Document ended unexpectedly inside an element name" +msgstr "文档在元素名中意外结束" + +#: ../glib/gmarkup.c:1752 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "文档在属性名中意外结束" + +#: ../glib/gmarkup.c:1757 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "文档在元素起始标记中意外结束" + +#: ../glib/gmarkup.c:1763 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "文档在跟在属性名后的等号后意外结束;没有属性值" + +#: ../glib/gmarkup.c:1770 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "文档在属性值中意外结束" + +#: ../glib/gmarkup.c:1786 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "文档在元素“%s”结束标记中意外结束" + +#: ../glib/gmarkup.c:1792 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "文档在注释或处理指令中意外结束" + +#: ../glib/goption.c:746 +msgid "Usage:" +msgstr "用法:" + +#: ../glib/goption.c:746 +msgid "[OPTION...]" +msgstr "[选项...]" + +#: ../glib/goption.c:852 +msgid "Help Options:" +msgstr "帮助选项:" + +#: ../glib/goption.c:853 +msgid "Show help options" +msgstr "显示帮助选项" + +#: ../glib/goption.c:859 +msgid "Show all help options" +msgstr "显示全部帮助选项" + +#: ../glib/goption.c:921 +msgid "Application Options:" +msgstr "应用程序选项:" + +#: ../glib/goption.c:983 ../glib/goption.c:1053 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "无法处理 %2$s 所用的整数值“%1$s”" + +#: ../glib/goption.c:993 ../glib/goption.c:1061 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 所用的整数值“%1$s”超出范围" + +#: ../glib/goption.c:1018 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "无法处理 %2$s 所用的双精度值“%1$s”" + +#: ../glib/goption.c:1026 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 所用的双精度值“%1$s”超出范围" + +#: ../glib/goption.c:1289 ../glib/goption.c:1368 +#, c-format +msgid "Error parsing option %s" +msgstr "解析选项 %s 时出错" + +#: ../glib/goption.c:1399 ../glib/goption.c:1512 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的参数" + +#: ../glib/goption.c:1965 +#, c-format +msgid "Unknown option %s" +msgstr "未知选项 %s" + +#: ../glib/gregex.c:190 +msgid "corrupted object" +msgstr "无效对象" + +#: ../glib/gregex.c:192 +msgid "internal error or corrupted object" +msgstr "内部错误或者无效对象" + +#: ../glib/gregex.c:194 +msgid "out of memory" +msgstr "内存不足" + +#: ../glib/gregex.c:199 +msgid "backtracking limit reached" +msgstr "达到回溯上限" + +#: ../glib/gregex.c:211 ../glib/gregex.c:219 +msgid "the pattern contains items not supported for partial matching" +msgstr "表达式包含不被部分匹配支持的项" + +#: ../glib/gregex.c:221 +msgid "back references as conditions are not supported for partial matching" +msgstr "不完全匹配时作为条件的后向引用不被支持." + +#: ../glib/gregex.c:230 +msgid "recursion limit reached" +msgstr "达到递归上限" + +#: ../glib/gregex.c:232 +msgid "workspace limit for empty substrings reached" +msgstr "达到空子串的工作空间限制" + +#: ../glib/gregex.c:234 +msgid "invalid combination of newline flags" +msgstr "无效的新行标志组合." + +#: ../glib/gregex.c:236 +msgid "bad offset" +msgstr "错误的偏移值" + +#: ../glib/gregex.c:238 +msgid "short utf8" +msgstr "UTF-8 短编码" + +#: ../glib/gregex.c:242 +msgid "unknown error" +msgstr "未知错误" + +#: ../glib/gregex.c:262 +msgid "\\ at end of pattern" +msgstr "表达式末尾的 \\" + +#: ../glib/gregex.c:265 +msgid "\\c at end of pattern" +msgstr "表达式末尾的 \\c" + +#: ../glib/gregex.c:268 +msgid "unrecognized character follows \\" +msgstr "无法识别 \\ 后的字符" + +#: ../glib/gregex.c:275 +msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +msgstr "这里不允许使用改变大小写的转义符(\\l, \\L, \\u, \\U)" + +#: ../glib/gregex.c:278 +msgid "numbers out of order in {} quantifier" +msgstr "{} 里的数字次序颠倒了" + +#: ../glib/gregex.c:281 +msgid "number too big in {} quantifier" +msgstr "{} 里的数字太大了" + +#: ../glib/gregex.c:284 +msgid "missing terminating ] for character class" +msgstr "字符类缺少终结的 ]" + +#: ../glib/gregex.c:287 +msgid "invalid escape sequence in character class" +msgstr "字符类包含无效的转义序列" + +#: ../glib/gregex.c:290 +msgid "range out of order in character class" +msgstr "字符类的范围次序颠倒" + +#: ../glib/gregex.c:293 +msgid "nothing to repeat" +msgstr "没有可以重复的内容" + +#: ../glib/gregex.c:296 +msgid "unrecognized character after (?" +msgstr "(? 后有无法识别的字符" + +#: ../glib/gregex.c:300 +msgid "unrecognized character after (?<" +msgstr "(?< 后有无法识别的字符" + +#: ../glib/gregex.c:304 +msgid "unrecognized character after (?P" +msgstr "(?P 有无法识别的字符" + +#: ../glib/gregex.c:307 +msgid "POSIX named classes are supported only within a class" +msgstr "只有类里支持 POSIX 命名的类" + +#: ../glib/gregex.c:310 +msgid "missing terminating )" +msgstr "缺少结束的 )" + +#: ../glib/gregex.c:314 +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:321 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]数字 必须跟着 )" + +#: ../glib/gregex.c:324 +msgid "reference to non-existent subpattern" +msgstr "引用了不存在的子表达式" + +#: ../glib/gregex.c:327 +msgid "missing ) after comment" +msgstr "注释后缺少 )" + +#: ../glib/gregex.c:330 +msgid "regular expression too large" +msgstr "正则表达式过长" + +#: ../glib/gregex.c:333 +msgid "failed to get memory" +msgstr "获取内存失败" + +#: ../glib/gregex.c:336 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 断言不是定长的" + +#: ../glib/gregex.c:339 +msgid "malformed number or name after (?(" +msgstr "(?( 后有形式不正确的数字或名称" + +#: ../glib/gregex.c:342 +msgid "conditional group contains more than two branches" +msgstr "条件组包含了超过两个分支" + +#: ../glib/gregex.c:345 +msgid "assertion expected after (?(" +msgstr "(?( 后应该有断言" + +#: ../glib/gregex.c:348 +msgid "unknown POSIX class name" +msgstr "未知的 POSIX 类名" + +#: ../glib/gregex.c:351 +msgid "POSIX collating elements are not supported" +msgstr "不支持 POSIX 整理元素" + +#: ../glib/gregex.c:354 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{...} 序列里的字符值太大了" + +#: ../glib/gregex.c:357 +msgid "invalid condition (?(0)" +msgstr "无效的条件 (?(0)" + +#: ../glib/gregex.c:360 +msgid "\\C not allowed in lookbehind assertion" +msgstr "lookbehind 断言里不允许使用 \\C" + +#: ../glib/gregex.c:363 +msgid "recursive call could loop indefinitely" +msgstr "递归调用可能导致无限循环" + +#: ../glib/gregex.c:366 +msgid "missing terminator in subpattern name" +msgstr "子表达式名里缺少终结符" + +#: ../glib/gregex.c:369 +msgid "two named subpatterns have the same name" +msgstr "两个有名子表达式有相同的名称" + +#: ../glib/gregex.c:372 +msgid "malformed \\P or \\p sequence" +msgstr "形式不正确的 \\P 或 \\p 序列" + +#: ../glib/gregex.c:375 +msgid "unknown property name after \\P or \\p" +msgstr "\\P 或 \\p 后有未知的属性名" + +#: ../glib/gregex.c:378 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子表达式名太长了(最多32个字符)" + +#: ../glib/gregex.c:381 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "有名子表达式太多了(最多10,000个)" + +#: ../glib/gregex.c:384 +msgid "octal value is greater than \\377" +msgstr "八进制值大于 \\377" + +#: ../glib/gregex.c:387 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 组包含多于一个分支" + +#: ../glib/gregex.c:390 +msgid "repeating a DEFINE group is not allowed" +msgstr "不允许重复 DEFINE 组" + +#: ../glib/gregex.c:393 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 选项" + +#: ../glib/gregex.c:396 +msgid "" +"\\g is not followed by a braced name or an optionally braced non-zero number" +msgstr "\\g 后没有花括号括起来的名称或可选的花括号括起来的非零数字" + +#: ../glib/gregex.c:401 +msgid "unexpected repeat" +msgstr "非预期的重复" + +#: ../glib/gregex.c:405 +msgid "code overflow" +msgstr "代码溢出" + +#: ../glib/gregex.c:409 +msgid "overran compiling workspace" +msgstr "编译工作区超出正常范围" + +#: ../glib/gregex.c:413 +msgid "previously-checked referenced subpattern not found" +msgstr "未找到之前检查过的引用过的子表达式" + +#: ../glib/gregex.c:631 ../glib/gregex.c:1753 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "匹配正则表达式 %s 出现错误:%s" + +#: ../glib/gregex.c:1206 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 库编译时未包含 UTF8 支持" + +#: ../glib/gregex.c:1215 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 库编译时未包含 UTF8 属性支持" + +#: ../glib/gregex.c:1271 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "编译正则表达式 %s (于字符 %d 处)时出错:%s" + +#: ../glib/gregex.c:1307 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "优化正则表达式 %s 时出错:%s" + +#: ../glib/gregex.c:2182 +msgid "hexadecimal digit or '}' expected" +msgstr "期望十六进制数或 '}'" + +#: ../glib/gregex.c:2198 +msgid "hexadecimal digit expected" +msgstr "期望十六进制数" + +#: ../glib/gregex.c:2238 +msgid "missing '<' in symbolic reference" +msgstr "在符号引用中缺少“<”" + +#: ../glib/gregex.c:2247 +msgid "unfinished symbolic reference" +msgstr "未完成的符号引用" + +#: ../glib/gregex.c:2254 +msgid "zero-length symbolic reference" +msgstr "零长符号引用" + +#: ../glib/gregex.c:2265 +msgid "digit expected" +msgstr "期望数字" + +#: ../glib/gregex.c:2283 +msgid "illegal symbolic reference" +msgstr "非法的符号引用" + +#: ../glib/gregex.c:2345 +msgid "stray final '\\'" +msgstr "丢失了最后的“\\”" + +#: ../glib/gregex.c:2349 +msgid "unknown escape sequence" +msgstr "未知的转义序列" + +#: ../glib/gregex.c:2359 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "分析替换文本\"%s\" 时在字符 %lu 处发生错误:%s" + +#: ../glib/gshell.c:91 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "引用的文本没有以引号开头" + +#: ../glib/gshell.c:181 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "命令行或其他 shell 引用文本中出现不匹配的引号" + +#: ../glib/gshell.c:559 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文本在一个“\\”字符后结束。(文本为“%s”)" + +#: ../glib/gshell.c:566 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "文本在找到与 %c 匹配的引号之前结束。(文本为“%s”)" + +#: ../glib/gshell.c:578 +msgid "Text was empty (or contained only whitespace)" +msgstr "文本为空(或仅含空白字符)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "从子进程中读取数据失败(%s)" + +#: ../glib/gspawn.c:348 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "select() 在从子进程中读取数据时出现异常错误 (%s)" + +#: ../glib/gspawn.c:433 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 出现异常错误 (%s)" + +#: ../glib/gspawn.c:1174 ../glib/gspawn-win32.c:338 ../glib/gspawn-win32.c:346 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "从子管道中读取失败(%s)" + +#: ../glib/gspawn.c:1241 +#, c-format +msgid "Failed to fork (%s)" +msgstr "fork 失败(%s)" + +#: ../glib/gspawn.c:1387 ../glib/gspawn-win32.c:369 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "更改到目录“%s”失败(%s)" + +#: ../glib/gspawn.c:1397 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "执行子进程“%s”失败(%s)" + +#: ../glib/gspawn.c:1407 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "重定向子进程(%s)的输入或输出失败" + +#: ../glib/gspawn.c:1416 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "fork 子进程失败 (%s)" + +#: ../glib/gspawn.c:1424 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "执行子进程“%s”时出现未知错误" + +#: ../glib/gspawn.c:1448 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "从子进程管道中读取足够的数据失败(%s)" + +#: ../glib/gspawn.c:1521 ../glib/gspawn-win32.c:299 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "创建与子进程通讯的管道失败(%s)" + +#: ../glib/gspawn-win32.c:282 +msgid "Failed to read data from child process" +msgstr "从子进程中读取数据失败" + +#: ../glib/gspawn-win32.c:375 ../glib/gspawn-win32.c:494 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "执行子进程失败(%s)" + +#: ../glib/gspawn-win32.c:444 +#, c-format +msgid "Invalid program name: %s" +msgstr "无效的程序名:%s" + +#: ../glib/gspawn-win32.c:454 ../glib/gspawn-win32.c:722 +#: ../glib/gspawn-win32.c:1278 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "%d 处的参数中有无效的字符串:%s" + +#: ../glib/gspawn-win32.c:465 ../glib/gspawn-win32.c:737 +#: ../glib/gspawn-win32.c:1311 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "环境中有无效的字符串:%s" + +#: ../glib/gspawn-win32.c:718 ../glib/gspawn-win32.c:1259 +#, c-format +msgid "Invalid working directory: %s" +msgstr "无效的工作目录:%s" + +#: ../glib/gspawn-win32.c:783 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "执行助手程序(%s)失败" + +#: ../glib/gspawn-win32.c:997 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "g_io_channel_win32_poll() 从子进程中读取数据时出现异常错误" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "字符超出 UTF-8 范围" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "转换输入中出现无效序列" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "字符超出 UTF-16 范围" + +#: ../glib/gutils.c:2166 ../glib/gutils.c:2193 ../glib/gutils.c:2297 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 字节" + +#: ../glib/gutils.c:2172 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2174 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2177 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2180 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2183 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2186 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2199 +#, c-format +msgid "%.1f kB" +msgstr "%.1f KB" + +#: ../glib/gutils.c:2202 ../glib/gutils.c:2310 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2205 ../glib/gutils.c:2315 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2207 ../glib/gutils.c:2320 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2210 ../glib/gutils.c:2325 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2213 ../glib/gutils.c:2330 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2250 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s 字节" + +#: ../glib/gutils.c:2305 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "File is empty" +#~ msgstr "文件为空" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "键文件包含键“%s”,其值无法解释。" + +#~ msgid "This option will be removed soon." +#~ msgstr "此选项将在不久删除。" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "获取文件“%s”状态出错:%s" + +#~ msgid "Error connecting: " +#~ msgstr "连接出错:" + +#~ msgid "Error connecting: %s" +#~ msgstr "连接时出错:%s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKv4 的实现限制用户名在 %i 个字符串内" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKv4a 的实现限制主机名在 %i 个字符串内" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "读取 unix 出错:%s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "关闭 unix 出错:%s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "写入 unix 出错:%s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "上" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "下" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "返回值类型不正确,获得了“%s”,但是期望“%s”" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "尝试设置类型 %s 的属性 %s,但是根据期望的接口,类型是 %s" diff --git a/po/zh_HK.po b/po/zh_HK.po new file mode 100644 index 0000000..0aa676e --- /dev/null +++ b/po/zh_HK.po @@ -0,0 +1,4417 @@ +# 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. +# Wei-Lun Chao , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.31.21\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-16 12:20+0800\n" +"PO-Revision-Date: 2012-09-16 12:20+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (Hong Kong) \n" +"Language: zh_TW\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: Poedit 1.5.3\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "傳給 %s 的計數值太大" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "不支援在基礎串流中搜尋" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "不能截短 GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "串流已經關閉" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "在基礎串流中不支援截短(truncate)" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "操作已被取消" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "無效的物件,尚未初始化" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "在輸入中出現不完整的多位元組次序" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "在目的端中沒有足夠的空間" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "轉換輸入資料時遇到不正確的位元組組合" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "轉換時發生錯誤:%s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "不支援可取消的初始化" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支援將字符集‘%s’轉換成‘%s’" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "無法將‘%s’轉換至‘%s’" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s 類型" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "不明的類型" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s 檔案類型" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials 沒有在這個 OS 上實作" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "你的平臺沒有 GCredentials 支援" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "未預期的串流過早結束" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "位址項目「%2$s」有不支援的設定鍵「%1$s」" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "位址「%s」是無效的(需要有明確的 path、tmpdir 或 abstract 設定鍵之一)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "在位址項「%s」有無意義的設定鍵/數值組合配對" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "位址「%s」有錯誤 - port 屬性的格式不良" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "位址「%s」有錯誤 - family 屬性的格式不良" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "位址元素「%s」,並未包含分號 (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "設定鍵/數值配對 %d,「%s」,於位址元素「%s」,並未包含等於符號" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "在設定鍵/數值配對 %d,「%s」,位址元素「%s」中有錯誤的反轉義設定鍵" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "位址「%s」有錯誤 - unix 傳輸需要明確的設定一個「path」或「abstract」設定鍵" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - host 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - port 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - noncefile 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "自動執行失敗:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "位址「%2$s」有不明或不支援的傳輸「%1$s」" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "開啟臨時檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "讀取臨時檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "讀取臨時檔案「%s」時發生錯誤,預期為 16 位元組,卻得到 %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "寫入臨時檔案「%s」的內容到串流時發生錯誤:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "指定的位址是空白的" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "在 setuid 時不能產生訊息匯流排" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "沒有 machine-id 不能產生訊息匯流排:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "產生命令列「%s」時出現錯誤:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(輸入任何字符以關閉這個視窗)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "作業階段 dbus 尚未執行,且自動執行失敗" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "不能判斷作業階段匯流排位址(沒有在這個 OS 實作)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "不能從 DBUS_STARTER_BUS_TYPE 環境變數判斷匯流排位址 - 不明的數值「%s」" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "不能判斷匯流排位址,因為尚未設定 DBUS_STARTER_BUS_TYPE 環境變數" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "不明的匯流排類型 %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "未預期的內容缺乏嘗試讀取行" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "未預期的內容缺乏嘗試(安全的)讀取行" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "竭盡所有可用的驗證機制 (已嘗試:%s) (可用:%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "已透過 GDBusAuthObserver::authorize-authenticated-peer 取消" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "從目錄「%s」取得資訊時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "目錄「%s」的權限格式下良。預期的模式為 0700,卻得到 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "建立目錄「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "開啟密碼匙圈「%s」讀取時發生錯誤:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的密碼匙圈第 %1$d 列格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的密碼匙圈第 %1$d 列第一記號格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的密碼匙圈第 %1$d 列第二記號格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "在「%2$s」密碼匙圈找不到 id %1$d 的 cookie" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "刪除舊的鎖定檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "建立鎖定檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "關閉(取消連結)鎖定檔案時發生錯誤「%s」:%s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "取消連結鎖定檔案時發生錯誤「%s」:%s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "開啟密碼匙圈「%s」寫入時發生錯誤:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(另外,釋放「%s」的鎖定失敗:%s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "這個連線已關閉" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "已達逾時時間" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "當建立客戶端連線時遇到不支援的旗標" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "在路徑 %s 的物件沒有「org.freedesktop.DBus.Properties」這個介面" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "設定屬性「%s」錯誤:預期的類型為「%s」但得到「%s」" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "沒有這個屬性「%s」" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "屬性「%s」無法讀取" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "屬性「%s」無法寫入" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "沒有這個介面「%s」" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "沒有這個介面" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "在路徑 %2$s 的物件沒有「%1$s」這個介面" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "沒有這個方法「%s」" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "訊息的類型,「%s」,不符合預期的類型「%s」" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "有物件已為介面 %s 匯出於 %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "方法「%s」傳回類型「%s」,但預期為「%s」" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "介面「%2$s」簽署「%3$s」的方法「%1$s」不存在" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "子樹狀目錄已為 %s 匯出" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "類型為無效" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL 訊息:缺少 PATH 或 MEMBER 標頭欄位" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN 訊息:缺少 REPLY_SERIAL 標頭欄位" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR 訊息:缺少 REPLY_SERIAL 或 ERROR_NAME 標頭欄位" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL 訊息:缺少 PATH、INTERFACE 或 MEMBER 標頭欄位" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "SIGNAL 訊息:PATH 標頭欄位使用了保留的數值 /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "SIGNAL 訊息:INTERFACE 標頭欄位使用了保留的數值 org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "嘗試讀取 %lu 位元組卻得到 EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "預期為有效的 UTF-8 字串但是在位元組 %d 處發現無效的位元組(字串的長度為 %d)。到那一點之前的有效 UTF-8 字串為「%s」" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "預期在字串「%s」之後為 NUL 位元組,但是發現位元組 %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "已解析數值「%s」不是有效的 D-Bus 物件路徑" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "已解析數值「%s」不是一個有效的 D-Bus 簽署" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "遇到長度為 %u 位元組的陣列。最大長度為 2<<26 位元組 (64 MiB)。" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "已分析數值「%s」不是有效的 D-Bus 簽署" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "從 D-Bus 線性格式以類型字串「%s」反序列化 GVariant 時發生錯誤" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "無效的位元組順序數值。預期為 0x6c「I」或 0x42「B」卻得到數值 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "無效的主通訊協定版本。預期為 1 但找到 %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "發現簽署「%s」的簽署標頭但訊息主體是空的" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "已解析數值「%s」不是有效的 D-Bus 簽署 (於主體)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "在訊息中沒有簽署標頭但訊息主體有 %u 位元組" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "不能反序列化訊息:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "從 D-Bus 線性格式以類型字串「%s」序列化 GVariant 時發生錯誤" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "訊息有 %d 檔案描述符但標頭欄位表示有 %d 檔案描述符" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "不能序列化訊息:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "訊息主體有簽署「%s」但是沒有簽署標頭" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "訊息主體有類型簽署「%s」但是標頭欄位中的簽署為「%s」" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "訊息主體是空的但是標頭欄位中的簽署為「%s」" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "傳回類型「%s」主體時發生錯誤" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "傳回空白主體錯誤" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "無法取得硬件設定組合:%s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "無法載入 /var/lib/dbus/machine-id 或 /etc/machine-id:" + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "呼叫 %s StartServiceByName 時發生錯誤:" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "來自 StartServiceByName(\"%2$s\") 方法的未預期回應 %1$d" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "不能呼叫方法;proxy 是沒有擁有者的知名名稱,而 proxy 是以 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 旗標建立的" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "不支援抽象命名空間" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "當建立伺服器時不能指定臨時檔案" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "在「%s」寫入臨時檔案時發生錯誤:%s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "字串「%s」不是一個有效的 D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "不能聽取不支援的傳輸「%s」" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "指令" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"指令:\n" +" help 顯示這個資訊\n" +" introspect 檢查遠端物件\n" +" monitor 監控遠端物件\n" +" call 呼叫遠端物件的方法\n" +" emit 發出信號\n" +"\n" +"使用「%s COMMAND --help」來取得每個指令的求助資訊。\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "錯誤:%s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "解析檢討 XML 時出現錯誤:%s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "連線到系統匯流排" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "連線到作業階段匯流排" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "連線到指定的 D-Bus 位址" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "連線端點選項:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "指定連線端點的選項" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "沒有指定連線端點" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "指定了多重連線端點" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "警告:根據檢討資料,介面「%s」不存在\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "警告:根據檢討資料,介面「%2$s」的方法「%1$s」不存在\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "信號的選擇性目的端 (獨特名稱)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "要發出信號的物件路徑" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "信號和介面名稱" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "發出信號。" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "連線錯誤:%s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "錯誤:沒有指定物件路徑。\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "錯誤:%s 不是有效的物件路徑\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "錯誤:尚未指定信號。\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "錯誤:信號必須為完全合規定的名稱。\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "錯誤:%s 不是有效的介面名稱\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "錯誤:%s 不是有效的成員名稱\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "錯誤:%s 不是有效的獨特匯流排名稱。\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "解析參數 %d 時發生錯誤:%s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "清除連線時發生錯誤:%s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "要呼叫方法的目的端名稱" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "要呼叫方法的物件路徑" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "方法和介面名稱" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "逾時時間(秒)" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "呼叫遠端物件的方法。" + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "錯誤:尚未指定目的端\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "錯誤:沒有指定物件路徑\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "錯誤:沒有指定方法名稱\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "錯誤:方法名稱「%s」是無效的\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "解析類型「%2$s」的參數 %1$d 時發生錯誤:%3$s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "要檢討的目的端名稱" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "要檢討的物件路徑" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "顯示 XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspect 子項目" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "只有列印屬性" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "檢討遠端物件。" + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "要監控的目的端名稱" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "要監控的物件路徑" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "監控遠端物件。" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "未命名的" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面(Desktop)檔案未指定 Exec 欄位" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "無法找到應用程式要求的終端機" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "不能建立使用者應用程式組態資料夾 %s:%s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "不能建立使用者 MIME 組態資料夾 %s:%s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "應用程式資訊缺少識別碼" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "不能建立使用者桌面檔案 %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "自選 %s 的定義" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "裝置無法實作退出功能(eject) 或 eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "裝置無法實作媒體的輪詢" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "裝置無法實作啟動功能(start)" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "裝置無法實作停止功能(stop)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS 支援無法使用" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "不能處理版本為 %d 的 GEmblem 編碼" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 編碼中記號 (%d) 的數量格式不正確" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "不能處理版本為 %d 的 GEmblemedIcon 編碼" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 編碼中記號 (%d) 的數量格式不正確" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "預期為 GEmblemedIcon 的 GEmblem" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "包含了不存在的掛載點" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "不能複製整個目錄" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "不能將目錄複製到目錄上" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "目標檔案已存在" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "不能遞廻複製目錄" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "不支援拼接" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "拼接檔案時發生錯誤:%s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "不能複製特殊的檔案" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "提供了無效的符號連結值" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "不支援回收筒" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "檔案名稱不能包含「%c」" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "儲存區尚未實作掛載功能" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "沒有應用程式註冊為用以處理這個檔案" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "檔案列舉器(enumerator)已關閉" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "檔案列舉器(enumerator)有異常操作" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "串流不支援 query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "不支援在串流中搜尋" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "在輸入串流中不允許截短(truncate)" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "在串流中不支援截短(truncate)" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "記號數量 (%d) 錯誤" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "類別名稱 %s 沒有類型" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "類型 %s 尚未歸類" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "格式不良的版本號碼:%s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面的 from_tokens()" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "不能處理提供的圖示編碼版本" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "尚未指定位址" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "長度 %u 對位址來說太長了" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "位址在 prefix length 後有位元設定" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "無法解析「%s」做為 IP 位址遮罩" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "socket 位址沒有足夠的空間" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "不支援的 socket 位址" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "串流有異常操作" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "元素 <%s> 不可出現在 <%s> 內" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "元素 <%s> 不允許在頂端層級" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "檔案 %s 似乎在這個資源出出現多次" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "無法在任何來源目錄中定位「%s」" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "無法在目前的目錄中定位「%s」" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "不明的置處理選項「%s」" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "無法建立暫存檔案:%s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"以 xmllint 處理輸入檔案時發生錯誤:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"以 to-pixdata 處理輸入檔案時發生錯誤:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "讀取檔案 %s 時發生錯誤:%s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "壓縮檔案 %s 時發生錯誤" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "在 <%s> 內不能出現文字" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "輸出檔案的名稱" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "用來讀取檔案的目錄 (預設為目前的目錄)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "目錄" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "以目標檔案名稱的延伸檔名來選擇要產生輸出的格式" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "產生來源標頭" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "產生原始碼用來連結資源檔到你的程式碼中" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "產生相根據性清單" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "不要自動建立與註冊資源" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "用於產生原始碼的 C 識別碼名稱" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"將資源規格編譯進資源檔。\n" +"資源規格檔案的延伸檔名必須為 .gresource.xml,\n" +"而資源檔案的延伸檔名叫做 .gresource。" + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "你應該明確指定一個檔案名稱\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "不允許空名名稱" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "無效的名稱「%s」:名稱必須以小寫字母開頭" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "無效的名稱「%s」:無效的字符「%c」;只允許小寫字母、數字和破折號 ('-')。" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "無效的名稱「%s」:不允許兩個破折號 ('--')。" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "無效的名稱「%s」:最後一個字符不能是破折號 ('-')。" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "無效的名稱「%s」:最大長度為 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "不能將設定鍵加入 'list-of' schema" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr " 遮蔽 於 ;使用 來修改數值" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "必須明確指定「type」、「enum」或「flags」之一做為 的屬性" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> 尚未定義。" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "無效的 GVariant 類型字串「%s」" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "指定了 但 schema 並未延伸任何東西" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "沒有 要覆蓋" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " 延伸了尚不存在的 schema '%s'" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " 是尚不存在的 schema '%s' 的清單" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "不能成為有路徑 schema 的清單" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "不能延伸有路徑的 schema" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " 是清單,卻延伸了不是清單的 " + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr " 延伸了 但是 '%s' 並未延伸 '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "如果指定了路徑,開頭與結尾都要加上斜線" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "清單的路徑不能以‘:/’為結尾" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> 已經指定了" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "元素 <%s> 不允許在頂端層級" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "並且指定了 --strict;正在結束。\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "這整個檔案都被忽略了。\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "忽略這個檔案。\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "在覆蓋檔案「%3$s」的 schema「%2$s」中沒有指定這個設定鍵「%1$s」" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr ";忽略這個設定鍵的覆蓋。\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "並且指定了 --strict;正在結束。\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "在覆蓋檔案「%3$s」中指定的 schema「%2$s」解析設定鍵「%1$s」時發生錯誤:%4$s。" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "忽略這個設定鍵的覆蓋。\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "在覆蓋檔案「%3$s」中覆蓋 schema「%2$s」的設定鍵「%1$s」超出了 schema 指定的範圍" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "在覆蓋檔案「%3$s」中覆蓋 schema「%2$s」的設定鍵「%1$s」不在有效的選擇清單中" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "要將 gschemas.compiled 檔案儲存到哪裏" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "在 schema 中有任何錯誤即中止" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "不要寫入 gschemas.compiled 檔案" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "不要強制設定鍵名稱限制" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"將所有的 GSettings schema 檔案編譯為 schema 快取。\n" +"Schema 檔案的延伸檔名必須為 .gschema.xml,\n" +"而快取檔案叫做 gschemas.compiled。" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "你應該明確指定一個目錄名稱\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "找不到 schema 檔案:" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "不做任何事。\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "移除現有的輸出檔案。\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "無法找到預設的本地端目錄監視器類型" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "無效的檔案名稱 %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "取得檔案系統資訊時發生錯誤:%s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "不能重新命名根目錄" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "重新命名檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "不能重新命名檔案,該檔案名稱已存在" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "無效的檔案名稱" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "不能開啟目錄" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "開啓檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "移除檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "移動檔案至回收筒時發生錯誤:%s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "無法建立回收筒目錄 %s:%s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "無法找到回收筒的頂端層級目錄" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "無法找到或建立回收筒目錄" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "無法建立回收筒資訊檔案:%s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "無法將檔案移至回收筒:%s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "內部的錯誤" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "建立目錄發生錯誤:%s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "檔案系統不支援符號連結" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "建立符號連結時發生錯誤:%s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "移動檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "不能將目錄移動至目錄上" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "建立備份檔案失敗" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目標檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "不支援在掛載點之間移動" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "屬性數值必須為非-NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "無效的屬性類型(應為字串值)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "無效的延伸屬性名稱" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "設定延伸屬性「%s」時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr "(無效的編碼)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "取得檔案「%s」資訊時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "取得檔案描述狀態資訊時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "無效的屬性類型(應為 uint32 值)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "無效的屬性類型(應為 uint64 值)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "無效的屬性類型(應為 byte string 值)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "不能設定符號連結的權限" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "設定權限時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "設定擁有者時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "符號連結必須為非-NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "設定符號連結時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "設定符號連結時發生錯誤:檔案不是符號連結" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "設定修改或存取時刻時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 關聯必須為非-NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "設定 SELinux 關聯時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 在這個系統上並未啟用" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支援設定屬性 %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "從檔案讀取時發生錯誤:%s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在檔案中搜尋時發生錯誤:%s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "關閉檔案時發生錯誤:%s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "無法找到預設的本地端檔案監視器類型" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "寫入至檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除舊備份連結時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "建立備份複本時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重新命名暫存檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "截短檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "開啟檔案「%s」時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "目標檔案是一個目錄" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "目標檔案不是正規的檔案" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "該檔案已被外部程式修改過" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除舊檔案時發生錯誤:%s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "提供了無效的 GSeek 類型" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "無效的搜尋要求" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "不能截短 GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "記憶體輸出串流不能改變大小" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "改變記憶體輸出串流的大小失敗" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "進行寫入所需的記憶體總額大於可用的位址空間" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "在串流的開頭之前要求的搜索" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "掛載點尚未實作同步內容類型預測" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主機名稱「%s」含有 '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "無法連接網絡" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "無法連接主機" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "無法建立網絡監控:%s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "無法建立網絡監控:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "無法取得網絡狀態:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "輸出串流尚未實作寫入" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "來源串流已經關閉" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "解析「%s」時發生錯誤:%s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "反向解析「%s」時發生錯誤:%s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "「%s」的要求類型沒有 DNS 紀錄" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暫時無法解析「%s」" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "解析「%s」時發生錯誤" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "收到「%s」的不完整資料" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "「%s」的資源不存在" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "「%s」的資源無法解壓縮" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "「%s」的資源不是目錄" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "輸入串流尚未實作尋找" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "顯示求助" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[指令]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "列出 elf FILE 中包含資源的節區" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"列出資源\n" +"如果指定 SECTION,只會列出這個節區的資源\n" +"如果指定 PATH,只會列出符合的資源" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "檔案 [路徑]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"列出資源詳細資料\n" +"如果指定 SECTION,只會列出這個節區的資源\n" +"如果指定 PATH,只會列出符合的資源\n" +"詳細資料包含節區、大小和壓縮率" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "解壓縮資源檔案到 stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "檔案路徑" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"不明指令 %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"指令:\n" +" help 顯示這個資訊\n" +" sections 列出資源節區\n" +" list 列出資源\n" +" details 列出資源詳細資料\n" +" extract 解壓縮資源\n" +"\n" +"使用 'gresource help COMMAND' 以取得詳細的說明文件。\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "引數:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION 一個 (選擇性的) elf 節區名稱\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND 要解釋的(選擇性)指令\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE 一個 elf 檔案 (二元檔或共享程式庫)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE 一個 elf 檔案 (二元檔或共享程式庫)\n" +" 或編譯過的資源檔案\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[路徑]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH 一個 (選擇性的) 資源路徑 (可能為部分)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "路徑" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH 資源路徑\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "沒有這個 schema「%s」\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema「%s」不是可重新配置的(路徑不能指定)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema「%s」是可重新配置的(路徑必須指定)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "指定了空白的路徑。\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "路徑不能以斜線 (/) 開頭\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "路徑不能以斜線 (/) 結尾\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "路徑不能包含兩個相鄰的斜線 (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "沒有設定鍵「%s」\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "提供的數值超出了有效的範圍\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "列出已安裝的(非-可重新配置)schema" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "列出已安裝的可重新配置 schema" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "列出 SCHEMA 中的設定鍵" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "列出 SCHEMA 的子項" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"遞迴的列出設定鍵與鍵值\n" +"如果沒有指定 SCHEMA,列出所有設定鍵\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "取得 KEY 的數值" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "查詢 KEY 有效數值的範圍" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "將 KEY 的數值設定為 VALUE" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "將 KEY 設定為預設值" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "將 SCHEMA 的所有設定鍵重設為預設值" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "檢查 KEY 是否可寫入" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"監控 KEY 的更改。\n" +"如果沒有指定 KEY,會監控 SCHEMA 的所有設定鍵。\n" +"使用 ^C 可停止監控。\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"指令:\n" +" help 顯示這個資訊\n" +" list-schemas 列出已安裝的 schemas\n" +" list-relocatable-schemas 列出可重新配置的 schemas\n" +" list-keys 列出 schema 中的設定鍵\n" +" list-children 列出 schema 的子項\n" +" list-recursively 遞迴列出設定鍵和數值\n" +" range 查詢設定鍵的範圍\n" +" get 取得設定鍵的數值\n" +" set 設定設定鍵的數值\n" +" reset 重設設定鍵的數值\n" +" reset-recursively 重設指定 schema 的所有數值\n" +" writable 檢查設定鍵是否可寫入\n" +" monitor 監看更改\n" +"\n" +"使用「gsettings help COMMAND」取得詳細的說明。\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR 搜尋額外 schema 的目錄\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA 這個 schema 的名稱\n" +" PATH 路徑,用於可重新配置的 schema\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY schema 中的(選擇性的)設定鍵\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY schema 中的設定鍵\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE 要設定的數值\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "指定了空的 schema 名稱\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "無效的 socket,尚未初始化" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無效的 socket,初始化失敗原因為:%s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket 已經關閉" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Socket I/O 逾時" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "正在從 fd 建立 GSocket:%s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "無法建立 socket:%s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "指定了不明的字族" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "指定了不明的通訊協定" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "無法取得本地端位址:%s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "無法取得遠端位址:%s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "無法聽取:%s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "綁定至位址時發生錯誤:%s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "加入多點廣播羣組時發生錯誤:%s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "離開多點廣播羣組時發生錯誤:%s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "不支援指定來源的多點廣播" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受連線時發生錯誤:%s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "連線進行中" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "無法取得未處理的錯誤:%s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收資料時發生錯誤:%s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "傳送資料時發生錯誤:%s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "無法關閉 socket:%s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "關閉 socket 時發生錯誤:%s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等候 socket 情況:%s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "傳送訊息時發生錯誤:%s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "視窗不支援 GSocketControlMessage" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "取回郵件發生錯誤:%s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials 沒有在這個 OS 上實作" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "無法連線到代理伺服器 %s:" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "無法連接到 %s:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "無法連接:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "連線時有不明的錯誤" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "不支援嘗試透過非-TCP 連線使用代理伺服器。" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "指定的通訊協定「%s」不被支援。" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "聽取程式已經關閉" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "加入的 socket 已經關閉" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 不支援 IPv6 位址「%s」" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "使用者名稱對 SOCKSv4 通訊協定" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "主機名稱「%s」對 SOCKSv4 通訊協定來說太長了" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "伺服器不是 SOCKSv4 代理伺服器。" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "透過 SOCKSv4 伺服器連線被拒絕" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "伺服器不是 SOCKSv5 代理伺服器。" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKv5 代理伺服器要求驗證。" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 代理需要的驗證方式尚未被 GLib 支援。" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "使用者名稱或密碼對 SOCKSv5 通訊協定來說太長了。" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 驗證由於錯誤的使用者名稱或密碼失敗了。" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "主機名稱「%s」對 SOCKSv5 通訊協定來說太長了" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 代理伺服器使用了不明的位址類型。" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "內部的 SOCKSv5 代理伺服器錯誤。" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 連線不被規則組允許。" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "主機無法透過 SOCKSv5 代理伺服器抵達。" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "網絡無法透過 SOCKSv5 代理伺服器抵達。" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "透過 SOCKSv5 代理伺服器連線被拒絕。" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 代理伺服器不支援「connect」指令。" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 代理伺服器不支援提供的位址類型。" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "不明的 SOCKSv5 代理伺服器錯誤。" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "不能處理版本為 %d 的 GThemedIcon 編碼" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "不能解鎖 PEM 編碼的私人密碼匙" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "找不到 PEM 編碼的私人密碼匙" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "無法解析 PEM 編碼的私人密碼匙" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "找到非 PEM 編碼的證書" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "無法解析 PEM 編碼的證書" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "這是在你的存取被鎖定之前最後輸入密碼的機會。" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "你已經輸入多入不正確的密碼,如果接下來還是輸入錯誤將會鎖定你的存取權限。" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "輸入的密碼是不正確的。" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "預期有 1 個控制訊息,卻收到 %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "輔助資料的未預期類型" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "預期有 1 個 fd,卻收到 %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "收到無效的 fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "傳送證書時發生錯誤:" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "檢查 SO_PASSCRED 在 socket 是否啟用時發生錯誤:%s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "檢查 SO_PASSCRED 在 socket 是否啟用時有未預期的選項長度。預期為 %d 位元組,得到 %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "啟用 SO_PASSCRED 時發生錯誤:%s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "預期接收證書要讀取單一位元組,但讀取到零位元組" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "不是預期的控制訊息,卻收到 %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "停用 SO_PASSCRED 時發生錯誤:%s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "讀取檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "關閉檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "根檔案系統" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "寫入檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "這個系統不支授抽象 UNIX 網域 socket 位址" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "儲存區尚未實作退出(eject) 或 eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "找不到應用程式" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "執行應用程式時發生錯誤:%s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "不支援 URIs" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "關聯更改在 win32 上不支援" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "關聯建立在 win32 上不支援" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "從處理器讀取時發生錯誤:%s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "關閉處理器時發生錯誤:%s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "寫入至處理器時發生錯誤:%s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "沒有足夠的記憶體" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "內部的錯誤:%s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "需要更多輸入" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "無效的壓縮資料" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "監聽的位址" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "已忽略,用於 GTestDbus 兼容性" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "顯示位址" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "以系統殼模式顯示位址" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "執行 dbus 服務" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "錯誤引數\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元件「%2$s」中有未預期的屬性「%1$s」" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "找不到元件「%2$s」中的屬性「%1$s」" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "未預期的標籤「%s」,應為標籤「%s」" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "「%2$s」中有未預期的標籤「%1$s」" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "在資料目錄中找不到有效的書籤檔案" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI「%s」的書籤已經存在" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "找不到 URI「%s」的書籤" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有定義 MIME 類型" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有私有旗幟" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有設定羣組" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "沒有名為「%s」的應用程式註冊書籤「%s」" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "輸入資料結束時字符仍未完整" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "無法將後備字串‘%s’的字符集轉換成‘%s’" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI‘%s’不是使用“file”格式的絕對 URI" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本機檔案的 URI‘%s’不應含有‘#’" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI‘%s’無效" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI‘%s’中的主機名稱無效" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI‘%s’含有「不正確跳出」的字符" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路徑名稱‘%s’不是絕對路徑" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "主機名稱無效" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "上午" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "下午" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "西元%Yå¹´%m月%d日 (%A) %H時%M分%S秒" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p %I時%M分%S秒" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "一月" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "二月" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "三月" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "四月" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "五月" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "六月" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "七月" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "八月" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "九月" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "十月" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "十一月" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "十二月" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "一月" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "二月" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "三月" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "四月" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "五月" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "六月" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "七月" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "八月" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "九月" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "十月" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "十一月" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "十二月" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "星期一" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "星期二" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "星期三" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "星期四" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "星期五" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "星期六" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "星期日" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "週一" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "週二" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "週三" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "週四" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "週五" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "週六" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "週日" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "開啟目錄‘%s’時發生錯誤:%s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "無法配置 %lu 位元來讀取檔案“%s”" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "讀取檔案‘%s’時發生錯誤:%s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "檔案「%s」太過巨大" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "讀取檔案‘%s’失敗:%s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "開啟檔案「%s」失敗:%s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "建立檔案‘%s’失敗:%s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "無法寫入檔案「%s」:fflush() 失敗:%s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "無法寫入檔案「%s」:fsync() 失敗:%s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s" + +#: ../glib/gfileutils.c:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "檔案樣式‘%s’沒有包含 XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "讀取符號連結‘%s’失敗:%s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "不支援符號連結" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "用來讀取資料的緩衝區中仍有未轉換的資料" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "在字符未完整之前,輸入管道已經結束" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 中無法讀取原始資料" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "在資料目錄中找不到有效的設定鍵檔案" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "不是正規的檔案" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、羣組或註解" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "無效的羣組名稱:%s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "設定鍵檔案並非以羣組開頭" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "無效的設定鍵名稱:%s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "設定鍵檔案包含不支援的編碼‘%s’" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "設定鍵檔案沒有羣組‘%s’" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "設定鍵檔案沒有設定鍵‘%s’" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵「%s」的數值無法解譯。" + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "設定鍵檔案包含的羣組「%2$s」中設定鍵「%1$s」數值無法解譯。" + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "羣組「%2$s」中設定鍵「%1$s」包含數值「%3$s」,但預期為「%4$s」" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "設定鍵檔案的羣組‘%2$s’中沒有設定鍵‘%1$s’" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "設定鍵檔案在行尾包含跳出字符" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "設定鍵檔案含有不正確的「跳出字符」‘%s’" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "數值‘%s’不能被解譯為數字。" + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整數值‘%s’超出範圍" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "數值‘%s’不能被解譯為浮點數。" + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "數值‘%s’不能被解譯為邏輯值。" + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "獲取檔案 「%s%s%s%s」的屬性失敗:fstat() 失敗:%s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "對應檔案 %s%s%s%s 失敗:mmap() 失敗:%s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "開啟檔案‘%s’失敗:open() 失敗:%s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第 %d 列第 %d 個字發生錯誤:" + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名稱中無效的 UTF-8 編碼文字 - 不是合法的「%s」" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "「%s」不是一個有效的名稱" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "「%s」不是一個有效的名稱:「%c」" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "第 %d 列發生錯誤:%s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字符參引‘%-.*s’無法表示任何能接受的字符" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "出現空白的實體‘&;’;可用的實體為:& " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "實體名稱 '%-.*s' 意義不明" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "文件開始必須為一元素(例如 )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "‘<’字符後的‘%s’不是有效的字符;這樣不可能是元素名稱的開始部份" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "字符「%s」只有一半,空元素標籤「%s」的結尾應該以‘>’字符結束" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "不尋常的字符‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字符" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "字符‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字符為「>」" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素‘%s’已關閉,沒有開啟中的元素" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "文件完全空白或只含有空白字符" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文件在尖角括號‘<’後突然終止" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "在元素的名稱內,文件突然結束" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "在屬性名稱內,文件突然結束" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "在元素的開啟標籤內,文件突然結束" + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "在屬性值內,文件突然結束" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "在元素‘%s’的關閉標籤內,文件突然結束" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "在註解或處理指示內,文件突然結束" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "用法:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[選項…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "說明選項:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "顯示說明的選項" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "顯示所有的說明選項" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "應用程式選項:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "無法給 %2$s 解析整數值‘%1$s’" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 的整數值‘%1$s’超出範圍" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "解析 %s 選項時發生錯誤" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的參數" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "不明的選項 %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "損毀的物件" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "內部錯誤或損毀的物件" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "記憶體耗盡" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "已達回溯上限" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "此模式包含了不支援部分比對的項目" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "部分比對不支援以反向參照為條件" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "已達遞廻上限" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "無效的換列旗標組合" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "錯誤的偏移" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "短式 utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "循環廻圈" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "不明的錯誤" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ 於模式結尾" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c 於模式結尾" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "無法辨識的字符接着 \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} 裏的數字次序顛倒了" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} 裏的數字太大了" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "字符類別缺少結束的 ]" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "字符類別中無效的跳脫序列" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "字符類別的範圍次序顛倒" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "沒有東西可重複" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "未預期的重複" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "在 (? 或 (?- 後無法辨識的字符" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 命名類別只在單一類別中支援" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "缺少結束的 )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "參照不存在的子模式" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "註解後缺少 )" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "正規表示式太大" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "取得記憶體失敗" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") 沒有開頭的 (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "程式碼溢流" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "在 (?< 後有無法辨識的字符" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 判斷提示(assertion) 不是固定的長度" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( 之後有格式不正確的數字或名稱" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "條件式羣組包含了兩個以上的分支" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "(?( 後應該有判斷提示(assertion)" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]數字必須接着 )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "不明的 POSIX 類別名稱" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "不支援 POSIX 整理元件" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{…} 序列中的字符值太大" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "無效的條件 (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "在 lookbehind 判斷提示(assertion) 中不支援\\C" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, 和 \\u 不支援" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "遞廻呼叫可能變成無限廻圈" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "在 (?P 後有無法辨識的字符" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "子模式名稱中缺少結束字符" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "兩個命名的子模式具有相同的名稱" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "格式不正確的 \\P 或 \\p 序列" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "在 \\P 或 \\p 後有不明的屬性名稱" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子模式名稱太長(最多 32 字符)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "太多命名的子模式(最大值 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "8 進位值大於 \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "編譯工作區超出範圍" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "找不到預先核取的參照子字串" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 羣組包含一個以上的分支" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 選項" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "\\g 並未隨着具有大括弧、角括弧或引號的名稱或數字或純文字數字" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "編號式參照必須不為零" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "引數不允許用於 (*ACCEPT)、(*FAIL) 或 (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) 無法辨識" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "數字太大" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& 後缺少子樣式" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ 後應該有數字" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] 在 JavaScript 兼容性模式中是無效的資料字符" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "不允許同樣編號的子樣式有不同的名稱" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) 需要一個引數" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c 必須接着 ASCII 字符" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k 並未隨着具有大括弧、角括弧或引號的名稱" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N 在類別中不支援" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "有太多的向前參照" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "名稱在 (*MARK)、(*PRUNE)、(*SKIP) 或 (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... 序列中的字符值太大" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "比對正規表示式 %s 發生錯誤:%s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 程式庫並未編譯對 UTF8 的支援" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 程式庫並未編譯對 UTF8 屬性的支援" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE 程式庫並未編譯不兼容的選項" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "編譯正規表示式 %s 時於第 %d 個字發生錯誤:%s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "最佳化正規表示式 %s 時發生錯誤:%s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "應為 16 進位數字或「}」" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "應為 16 進位數字" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "在符號參照中缺少「<」" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "未完成的符號參照" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "零-長度的符號參照" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "預期數字" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "不合法的符號參照" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "缺少最後的「\\」" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "不明的跳脫序列" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "當解析於字符 %2$lu 的取代文字「%1$s」時發生錯誤:%3$s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "應該用引號括起來的文字不是以括號為開始" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "指令列或其它標為指令的字串內有不對稱的引號" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文字在‘\\’字符後就終止了。(文字為‘%s’)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "文字是空白的(或只含有空白字符)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "無法從副進程讀取資料 (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "當 select() 從子程序讀取資料時發生未預期的錯誤 (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 發生未預期的錯誤 (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "子程序以代碼 %ld 結束" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "子程序被信號 %ld 中止" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "子程序被信號 %ld 停止" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "子程序異常結束" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "無法從管道讀取資料 (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "無法衍生進程 (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "無法進入目錄‘%s’(%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "無法執行副進程“%s”(%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "無法將副進程的輸出或輸入重新導向 (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "無法衍生副進程 (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "執行副進程“%s”時發生不明的錯誤" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "無法建立管道來和副進程溝通 (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "無法從副進程讀取資料" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "無法執行副進程 (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "程式名稱無效:%s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "第 %d 個引數中含無效的字串:%s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境變數中的字串無效:%s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "無效的工作目錄:%s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "無法執行協助程式 (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "字符不在 UTF-8 範圍之內" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "轉換輸入資料時出現無效的字符次序" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "字符不在 UTF-16 範圍之內" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 位元組" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s 位元組" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "不正常的程式中止產生命令列「%s」:%s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "命令列「%s」以非零結束狀態 %d 結束:%s" + +#~ msgid "No service record for '%s'" +#~ msgstr "沒有「%s」的服務紀錄" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "已達空白子字串的工作區上限" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "這裡不允許使用改變大小寫的轉義符(\\l, \\L, \\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "不允許重複 DEFINE 群組" + +#~ msgid "File is empty" +#~ msgstr "檔案是空白的" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。" + +#~ msgid "This option will be removed soon." +#~ msgstr "這個選項很快會被移除。" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "取得檔案「%s」狀態時發生錯誤:%s" + +#~ msgid "Error connecting: " +#~ msgstr "連線錯誤:" + +#~ msgid "Error connecting: %s" +#~ msgstr "連線錯誤:%s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 實作限制使用者名稱只能有 %i 字元" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a 實作限制主機名稱只能有 %i 字元" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "從 unix 讀取時發生錯誤:%s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "關閉 unix 時發生錯誤:%s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "寫入至 unix 時發生錯誤:%s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "上午" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "下午" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "回傳值的類型是不正確的,得到「%s」,預期為「%s」" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "正在嘗試設定類型 %2$s 的屬性 %1$s 但是根據預期的介面這個類型應該是 %3$s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "在覆蓋檔案「%2$s」沒有指定這個 schema「%1$s」" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "指令:\n" +#~ " help 顯示這個資訊\n" +#~ " get 取得設定鍵的數值\n" +#~ " set 設定設定鍵的數值\n" +#~ " reset 重設設定鍵的數值\n" +#~ " monitor 監控設定鍵的變更\n" +#~ " writable 檢查設定鍵是否可寫入\n" +#~ "\n" +#~ "使用「%s COMMAND --help」取得個別指令的求助文件。\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "指定 schema 的路徑" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "引數:\n" +#~ " SCHEMA schema 的 id\n" +#~ " KEY 設定鍵的名稱\n" +#~ " VALUE 設定鍵的數值,為序列化的 GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "設定鍵 %s 無法寫入\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "監控 KEY 的變更並顯示變更後的數值。\n" +#~ "監控會持續到程序中止為止。" + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "當寫入訊息的頭 16 位元組到 socket 時發生錯誤:" + +#~ msgid "The nonce-file `%s' was %lu bytes. Expected 16 bytes." +#~ msgstr "nonce-file「%s」有 %lu 位元組。預期應為 16 位元組。" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "" +#~ "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 "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.po b/po/zh_TW.po new file mode 100644 index 0000000..5677cf1 --- /dev/null +++ b/po/zh_TW.po @@ -0,0 +1,4442 @@ +# 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. +# Wei-Lun Chao , 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: glib 2.31.21\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-16 12:20+0800\n" +"PO-Revision-Date: 2012-09-15 15:30+0800\n" +"Last-Translator: Chao-Hsiung Liao \n" +"Language-Team: Chinese (traditional)\n" +"Language: zh_TW\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: Poedit 1.5.3\n" + +#: ../gio/gbufferedinputstream.c:427 ../gio/gbufferedinputstream.c:508 +#: ../gio/ginputstream.c:185 ../gio/ginputstream.c:376 +#: ../gio/ginputstream.c:615 ../gio/ginputstream.c:850 +#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:800 +#: ../gio/gpollableinputstream.c:207 ../gio/gpollableoutputstream.c:208 +#, c-format +msgid "Too large count value passed to %s" +msgstr "傳給 %s 的計數值太大" + +#: ../gio/gbufferedinputstream.c:905 ../gio/gbufferedoutputstream.c:581 +#: ../gio/gdataoutputstream.c:568 +msgid "Seek not supported on base stream" +msgstr "不支援在基礎串流中搜尋" + +#: ../gio/gbufferedinputstream.c:951 +msgid "Cannot truncate GBufferedInputStream" +msgstr "不能截短 GBufferedInputStream" + +#: ../gio/gbufferedinputstream.c:996 ../gio/ginputstream.c:1050 +#: ../gio/giostream.c:292 ../gio/goutputstream.c:1368 +msgid "Stream is already closed" +msgstr "串流已經關閉" + +#: ../gio/gbufferedoutputstream.c:618 ../gio/gdataoutputstream.c:598 +msgid "Truncate not supported on base stream" +msgstr "在基礎串流中不支援截短(truncate)" + +#: ../gio/gcancellable.c:318 ../gio/gdbusconnection.c:1885 +#: ../gio/gdbusconnection.c:1977 ../gio/gdbusprivate.c:1414 +#: ../gio/glocalfile.c:2152 ../gio/gsimpleasyncresult.c:841 +#: ../gio/gsimpleasyncresult.c:867 +#, c-format +msgid "Operation was cancelled" +msgstr "操作已被取消" + +#: ../gio/gcharsetconverter.c:262 +msgid "Invalid object, not initialized" +msgstr "無效的物件,尚未初始化" + +#: ../gio/gcharsetconverter.c:283 ../gio/gcharsetconverter.c:311 +msgid "Incomplete multibyte sequence in input" +msgstr "在輸入中出現不完整的多位元組次序" + +#: ../gio/gcharsetconverter.c:317 ../gio/gcharsetconverter.c:326 +msgid "Not enough space in destination" +msgstr "在目的端中沒有足夠的空間" + +#: ../gio/gcharsetconverter.c:344 ../gio/gdatainputstream.c:854 +#: ../gio/gdatainputstream.c:1294 ../glib/gconvert.c:764 +#: ../glib/gconvert.c:1156 ../glib/giochannel.c:1583 ../glib/giochannel.c:1625 +#: ../glib/giochannel.c:2468 ../glib/gutf8.c:841 ../glib/gutf8.c:1292 +msgid "Invalid byte sequence in conversion input" +msgstr "轉換輸入資料時遇到不正確的位元組組合" + +#: ../gio/gcharsetconverter.c:349 ../glib/gconvert.c:772 +#: ../glib/gconvert.c:1081 ../glib/giochannel.c:1590 ../glib/giochannel.c:2480 +#, c-format +msgid "Error during conversion: %s" +msgstr "轉換時發生錯誤:%s" + +#: ../gio/gcharsetconverter.c:446 ../gio/gsocket.c:963 +msgid "Cancellable initialization not supported" +msgstr "不支援可取消的初始化" + +#: ../gio/gcharsetconverter.c:457 ../glib/gconvert.c:564 +#: ../glib/gconvert.c:642 ../glib/giochannel.c:1411 +#, c-format +msgid "Conversion from character set '%s' to '%s' is not supported" +msgstr "不支援將字元集‘%s’轉換成‘%s’" + +#: ../gio/gcharsetconverter.c:461 ../glib/gconvert.c:568 +#: ../glib/gconvert.c:646 +#, c-format +msgid "Could not open converter from '%s' to '%s'" +msgstr "無法將‘%s’轉換至‘%s’" + +#: ../gio/gcontenttype.c:335 +#, c-format +msgid "%s type" +msgstr "%s 類型" + +#: ../gio/gcontenttype-win32.c:162 +msgid "Unknown type" +msgstr "不明的類型" + +#: ../gio/gcontenttype-win32.c:163 +#, c-format +msgid "%s filetype" +msgstr "%s 檔案類型" + +#: ../gio/gcredentials.c:273 ../gio/gcredentials.c:495 +msgid "GCredentials is not implemented on this OS" +msgstr "GCredentials 沒有在這個 OS 上實作" + +#: ../gio/gcredentials.c:447 +msgid "There is no GCredentials support for your platform" +msgstr "您的平臺沒有 GCredentials 支援" + +#: ../gio/gdatainputstream.c:311 +msgid "Unexpected early end-of-stream" +msgstr "未預期的串流過早結束" + +#: ../gio/gdbusaddress.c:150 ../gio/gdbusaddress.c:238 +#: ../gio/gdbusaddress.c:319 +#, c-format +msgid "Unsupported key `%s' in address entry `%s'" +msgstr "位址項目「%2$s」有不支援的設定鍵「%1$s」" + +#: ../gio/gdbusaddress.c:177 +#, c-format +msgid "" +"Address `%s' is invalid (need exactly one of path, tmpdir or abstract keys)" +msgstr "位址「%s」是無效的(需要有明確的 path、tmpdir 或 abstract 設定鍵之一)" + +#: ../gio/gdbusaddress.c:190 +#, c-format +msgid "Meaningless key/value pair combination in address entry `%s'" +msgstr "在位址項「%s」有無意義的設定鍵/數值組合配對" + +#: ../gio/gdbusaddress.c:253 ../gio/gdbusaddress.c:334 +#, c-format +msgid "Error in address `%s' - the port attribute is malformed" +msgstr "位址「%s」有錯誤 - port 屬性的格式不良" + +#: ../gio/gdbusaddress.c:264 ../gio/gdbusaddress.c:345 +#, c-format +msgid "Error in address `%s' - the family attribute is malformed" +msgstr "位址「%s」有錯誤 - family 屬性的格式不良" + +#: ../gio/gdbusaddress.c:454 +#, c-format +msgid "Address element `%s' does not contain a colon (:)" +msgstr "位址元素「%s」,並未包含分號 (:)" + +#: ../gio/gdbusaddress.c:475 +#, c-format +msgid "" +"Key/Value pair %d, `%s', in address element `%s' does not contain an equal " +"sign" +msgstr "設定鍵/數值配對 %d,「%s」,於位址元素「%s」,並未包含等於符號" + +#: ../gio/gdbusaddress.c:489 +#, c-format +msgid "" +"Error unescaping key or value in Key/Value pair %d, `%s', in address element " +"`%s'" +msgstr "在設定鍵/數值配對 %d,「%s」,位址元素「%s」中有錯誤的反轉義設定鍵" + +#: ../gio/gdbusaddress.c:567 +#, c-format +msgid "" +"Error in address `%s' - the unix transport requires exactly one of the keys " +"`path' or `abstract' to be set" +msgstr "" +"位址「%s」有錯誤 - unix 傳輸需要明確的設定一個「path」或「abstract」設定鍵" + +#: ../gio/gdbusaddress.c:603 +#, c-format +msgid "Error in address `%s' - the host attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - host 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:617 +#, c-format +msgid "Error in address `%s' - the port attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - port 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:631 +#, c-format +msgid "Error in address `%s' - the noncefile attribute is missing or malformed" +msgstr "位址「%s」有錯誤 - noncefile 屬性遺失或格式不良" + +#: ../gio/gdbusaddress.c:652 +msgid "Error auto-launching: " +msgstr "自動執行失敗:" + +#: ../gio/gdbusaddress.c:660 +#, c-format +msgid "Unknown or unsupported transport `%s' for address `%s'" +msgstr "位址「%2$s」有不明或不支援的傳輸「%1$s」" + +#: ../gio/gdbusaddress.c:696 +#, c-format +msgid "Error opening nonce file `%s': %s" +msgstr "開啟臨時檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusaddress.c:714 +#, c-format +msgid "Error reading from nonce file `%s': %s" +msgstr "讀取臨時檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusaddress.c:723 +#, c-format +msgid "Error reading from nonce file `%s', expected 16 bytes, got %d" +msgstr "讀取臨時檔案「%s」時發生錯誤,預期為 16 位元組,卻得到 %d" + +#: ../gio/gdbusaddress.c:741 +#, c-format +msgid "Error writing contents of nonce file `%s' to stream:" +msgstr "寫入臨時檔案「%s」的內容到串流時發生錯誤:" + +#: ../gio/gdbusaddress.c:960 +msgid "The given address is empty" +msgstr "指定的位址是空白的" + +#: ../gio/gdbusaddress.c:1030 +#, c-format +msgid "Cannot spawn a message bus when setuid" +msgstr "在 setuid 時不能產生訊息匯流排" + +#: ../gio/gdbusaddress.c:1037 +msgid "Cannot spawn a message bus without a machine-id: " +msgstr "沒有 machine-id 不能產生訊息匯流排:" + +#: ../gio/gdbusaddress.c:1079 +#, c-format +msgid "Error spawning command line `%s': " +msgstr "產生命令列「%s」時出現錯誤:" + +#: ../gio/gdbusaddress.c:1296 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(輸入任何字元以關閉這個視窗)\n" + +#: ../gio/gdbusaddress.c:1421 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "作業階段 dbus 尚未執行,且自動執行失敗" + +#: ../gio/gdbusaddress.c:1442 +#, c-format +msgid "Cannot determine session bus address (not implemented for this OS)" +msgstr "不能判斷作業階段匯流排位址(沒有在這個 OS 實作)" + +#: ../gio/gdbusaddress.c:1541 ../gio/gdbusconnection.c:6757 +#, c-format +msgid "" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " +"- unknown value `%s'" +msgstr "不能從 DBUS_STARTER_BUS_TYPE 環境變數判斷匯流排位址 - 不明的數值「%s」" + +#: ../gio/gdbusaddress.c:1550 ../gio/gdbusconnection.c:6766 +msgid "" +"Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " +"variable is not set" +msgstr "不能判斷匯流排位址,因為尚未設定 DBUS_STARTER_BUS_TYPE 環境變數" + +#: ../gio/gdbusaddress.c:1560 +#, c-format +msgid "Unknown bus type %d" +msgstr "不明的匯流排類型 %d" + +#: ../gio/gdbusauth.c:298 +msgid "Unexpected lack of content trying to read a line" +msgstr "未預期的內容缺乏嘗試讀取行" + +#: ../gio/gdbusauth.c:342 +msgid "Unexpected lack of content trying to (safely) read a line" +msgstr "未預期的內容缺乏嘗試(安全的)讀取行" + +#: ../gio/gdbusauth.c:513 +#, c-format +msgid "" +"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +msgstr "竭盡所有可用的驗證機制 (已嘗試:%s) (可用:%s)" + +#: ../gio/gdbusauth.c:1174 +msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" +msgstr "已透過 GDBusAuthObserver::authorize-authenticated-peer 取消" + +#: ../gio/gdbusauthmechanismsha1.c:266 +#, c-format +msgid "Error when getting information for directory `%s': %s" +msgstr "從目錄「%s」取得資訊時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:278 +#, c-format +msgid "" +"Permissions on directory `%s' are malformed. Expected mode 0700, got 0%o" +msgstr "目錄「%s」的權限格式下良。預期的模式為 0700,卻得到 0%o" + +#: ../gio/gdbusauthmechanismsha1.c:299 +#, c-format +msgid "Error creating directory `%s': %s" +msgstr "建立目錄「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:382 +#, c-format +msgid "Error opening keyring `%s' for reading: " +msgstr "開啟鑰匙圈「%s」讀取時發生錯誤:" + +#: ../gio/gdbusauthmechanismsha1.c:406 ../gio/gdbusauthmechanismsha1.c:718 +#, c-format +msgid "Line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的鑰匙圈第 %1$d 列格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:420 ../gio/gdbusauthmechanismsha1.c:732 +#, c-format +msgid "" +"First token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的鑰匙圈第 %1$d 列第一記號格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:435 ../gio/gdbusauthmechanismsha1.c:746 +#, c-format +msgid "" +"Second token of line %d of the keyring at `%s' with content `%s' is malformed" +msgstr "位於「%2$s」內容「%3$s」的鑰匙圈第 %1$d 列第二記號格式不良" + +#: ../gio/gdbusauthmechanismsha1.c:459 +#, c-format +msgid "Didn't find cookie with id %d in the keyring at `%s'" +msgstr "在「%2$s」鑰匙圈找不到 id %1$d 的 cookie" + +#: ../gio/gdbusauthmechanismsha1.c:536 +#, c-format +msgid "Error deleting stale lock file `%s': %s" +msgstr "刪除舊的鎖定檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:568 +#, c-format +msgid "Error creating lock file `%s': %s" +msgstr "建立鎖定檔案「%s」時發生錯誤:%s" + +#: ../gio/gdbusauthmechanismsha1.c:598 +#, c-format +msgid "Error closing (unlinked) lock file `%s': %s" +msgstr "關閉(取消連結)鎖定檔案時發生錯誤「%s」:%s" + +#: ../gio/gdbusauthmechanismsha1.c:608 +#, c-format +msgid "Error unlinking lock file `%s': %s" +msgstr "取消連結鎖定檔案時發生錯誤「%s」:%s" + +#: ../gio/gdbusauthmechanismsha1.c:685 +#, c-format +msgid "Error opening keyring `%s' for writing: " +msgstr "開啟鑰匙圈「%s」寫入時發生錯誤:" + +#: ../gio/gdbusauthmechanismsha1.c:882 +#, c-format +msgid "(Additionally, releasing the lock for `%s' also failed: %s) " +msgstr "(另外,釋放「%s」的鎖定失敗:%s)" + +#: ../gio/gdbusconnection.c:597 ../gio/gdbusconnection.c:2440 +msgid "The connection is closed" +msgstr "這個連線已關閉" + +#: ../gio/gdbusconnection.c:1930 +msgid "Timeout was reached" +msgstr "已達逾時時間" + +#: ../gio/gdbusconnection.c:2562 +msgid "" +"Unsupported flags encountered when constructing a client-side connection" +msgstr "當建立客戶端連線時遇到不支援的旗標" + +#: ../gio/gdbusconnection.c:4065 ../gio/gdbusconnection.c:4381 +#, c-format +msgid "" +"No such interface `org.freedesktop.DBus.Properties' on object at path %s" +msgstr "在路徑 %s 的物件沒有「org.freedesktop.DBus.Properties」這個介面" + +#: ../gio/gdbusconnection.c:4136 +#, c-format +msgid "Error setting property `%s': Expected type `%s' but got `%s'" +msgstr "設定屬性「%s」錯誤:預期的類型為「%s」但得到「%s」" + +#: ../gio/gdbusconnection.c:4231 +#, c-format +msgid "No such property `%s'" +msgstr "沒有這個屬性「%s」" + +#: ../gio/gdbusconnection.c:4243 +#, c-format +msgid "Property `%s' is not readable" +msgstr "屬性「%s」無法讀取" + +#: ../gio/gdbusconnection.c:4254 +#, c-format +msgid "Property `%s' is not writable" +msgstr "屬性「%s」無法寫入" + +#: ../gio/gdbusconnection.c:4324 ../gio/gdbusconnection.c:6200 +#, c-format +msgid "No such interface `%s'" +msgstr "沒有這個介面「%s」" + +#: ../gio/gdbusconnection.c:4508 +msgid "No such interface" +msgstr "沒有這個介面" + +#: ../gio/gdbusconnection.c:4726 ../gio/gdbusconnection.c:6706 +#, c-format +msgid "No such interface `%s' on object at path %s" +msgstr "在路徑 %2$s 的物件沒有「%1$s」這個介面" + +#: ../gio/gdbusconnection.c:4781 +#, c-format +msgid "No such method `%s'" +msgstr "沒有這個方法「%s」" + +#: ../gio/gdbusconnection.c:4812 +#, c-format +msgid "Type of message, `%s', does not match expected type `%s'" +msgstr "訊息的類型,「%s」,不符合預期的類型「%s」" + +#: ../gio/gdbusconnection.c:5032 +#, c-format +msgid "An object is already exported for the interface %s at %s" +msgstr "有物件已為介面 %s 匯出於 %s" + +#: ../gio/gdbusconnection.c:5230 +#, c-format +msgid "Method `%s' returned type `%s', but expected `%s'" +msgstr "方法「%s」傳回類型「%s」,但預期為「%s」" + +#: ../gio/gdbusconnection.c:6311 +#, c-format +msgid "Method `%s' on interface `%s' with signature `%s' does not exist" +msgstr "介面「%2$s」簽章「%3$s」的方法「%1$s」不存在" + +#: ../gio/gdbusconnection.c:6430 +#, c-format +msgid "A subtree is already exported for %s" +msgstr "子樹狀目錄已為 %s 匯出" + +#: ../gio/gdbusmessage.c:859 +msgid "type is INVALID" +msgstr "類型為無效" + +#: ../gio/gdbusmessage.c:870 +msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgstr "METHOD_CALL 訊息:缺少 PATH 或 MEMBER 標頭欄位" + +#: ../gio/gdbusmessage.c:881 +msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +msgstr "METHOD_RETURN 訊息:缺少 REPLY_SERIAL 標頭欄位" + +#: ../gio/gdbusmessage.c:893 +msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +msgstr "ERROR 訊息:缺少 REPLY_SERIAL 或 ERROR_NAME 標頭欄位" + +#: ../gio/gdbusmessage.c:906 +msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +msgstr "SIGNAL 訊息:缺少 PATH、INTERFACE 或 MEMBER 標頭欄位" + +#: ../gio/gdbusmessage.c:914 +msgid "" +"SIGNAL message: The PATH header field is using the reserved value /org/" +"freedesktop/DBus/Local" +msgstr "SIGNAL 訊息:PATH 標頭欄位使用了保留的數值 /org/freedesktop/DBus/Local" + +#: ../gio/gdbusmessage.c:922 +msgid "" +"SIGNAL message: The INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"SIGNAL 訊息:INTERFACE 標頭欄位使用了保留的數值 org.freedesktop.DBus.Local" + +#: ../gio/gdbusmessage.c:998 +#, c-format +msgid "Wanted to read %lu byte but got EOF" +msgid_plural "Wanted to read %lu bytes but got EOF" +msgstr[0] "嘗試讀取 %lu 位元組卻得到 EOF" + +#: ../gio/gdbusmessage.c:1025 +#, c-format +msgid "" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d " +"(length of string is %d). The valid UTF-8 string up until that point was `%s'" +msgstr "" +"預期為有效的 UTF-8 字串但是在位元組 %d 處發現無效的位元組(字串的長度為 " +"%d)。到那一點之前的有效 UTF-8 字串為「%s」" + +#: ../gio/gdbusmessage.c:1038 +#, c-format +msgid "Expected NUL byte after the string `%s' but found byte %d" +msgstr "預期在字串「%s」之後為 NUL 位元組,但是發現位元組 %d" + +#: ../gio/gdbusmessage.c:1242 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus object path" +msgstr "已解析數值「%s」不是有效的 D-Bus 物件路徑" + +#: ../gio/gdbusmessage.c:1268 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature" +msgstr "已解析數值「%s」不是一個有效的 D-Bus 簽章" + +#: ../gio/gdbusmessage.c:1325 +#, c-format +msgid "" +"Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." +msgid_plural "" +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +msgstr[0] "遇到長度為 %u 位元組的陣列。最大長度為 2<<26 位元組 (64 MiB)。" + +#: ../gio/gdbusmessage.c:1483 +#, c-format +msgid "Parsed value `%s' for variant is not a valid D-Bus signature" +msgstr "已分析數值「%s」不是有效的 D-Bus 簽章" + +#: ../gio/gdbusmessage.c:1510 +#, c-format +msgid "" +"Error deserializing GVariant with type string `%s' from the D-Bus wire format" +msgstr "從 D-Bus 線性格式以類型字串「%s」反序列化 GVariant 時發生錯誤" + +#: ../gio/gdbusmessage.c:1698 +#, c-format +msgid "" +"Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found value " +"0x%02x" +msgstr "無效的字節順序數值。預期為 0x6c「I」或 0x42「B」卻得到數值 0x%02x" + +#: ../gio/gdbusmessage.c:1712 +#, c-format +msgid "Invalid major protocol version. Expected 1 but found %d" +msgstr "無效的主通訊協定版本。預期為 1 但找到 %d" + +#: ../gio/gdbusmessage.c:1769 +#, c-format +msgid "Signature header with signature `%s' found but message body is empty" +msgstr "發現簽章「%s」的簽章標頭但訊息主體是空的" + +#: ../gio/gdbusmessage.c:1783 +#, c-format +msgid "Parsed value `%s' is not a valid D-Bus signature (for body)" +msgstr "已解析數值「%s」不是有效的 D-Bus 簽章 (於主體)" + +#: ../gio/gdbusmessage.c:1814 +#, c-format +msgid "No signature header in message but the message body is %u byte" +msgid_plural "No signature header in message but the message body is %u bytes" +msgstr[0] "在訊息中沒有簽章標頭但訊息主體有 %u 位元組" + +#: ../gio/gdbusmessage.c:1824 +msgid "Cannot deserialize message: " +msgstr "不能反序列化訊息:" + +#: ../gio/gdbusmessage.c:2156 +#, c-format +msgid "" +"Error serializing GVariant with type string `%s' to the D-Bus wire format" +msgstr "從 D-Bus 線性格式以類型字串「%s」序列化 GVariant 時發生錯誤" + +#: ../gio/gdbusmessage.c:2297 +#, c-format +msgid "" +"Message has %d file descriptors but the header field indicates %d file " +"descriptors" +msgstr "訊息有 %d 檔案描述符但標頭欄位表示有 %d 檔案描述符" + +#: ../gio/gdbusmessage.c:2305 +msgid "Cannot serialize message: " +msgstr "不能序列化訊息:" + +#: ../gio/gdbusmessage.c:2349 +#, c-format +msgid "Message body has signature `%s' but there is no signature header" +msgstr "訊息主體有簽章「%s」但是沒有簽章標頭" + +#: ../gio/gdbusmessage.c:2359 +#, c-format +msgid "" +"Message body has type signature `%s' but signature in the header field is `" +"%s'" +msgstr "訊息主體有類型簽章「%s」但是標頭欄位中的簽章為「%s」" + +#: ../gio/gdbusmessage.c:2375 +#, c-format +msgid "Message body is empty but signature in the header field is `(%s)'" +msgstr "訊息主體是空的但是標頭欄位中的簽章為「%s」" + +#: ../gio/gdbusmessage.c:2932 +#, c-format +msgid "Error return with body of type `%s'" +msgstr "傳回類型「%s」主體時發生錯誤" + +#: ../gio/gdbusmessage.c:2940 +msgid "Error return with empty body" +msgstr "傳回空白主體錯誤" + +#: ../gio/gdbusprivate.c:2062 +#, c-format +msgid "Unable to get Hardware profile: %s" +msgstr "無法取得硬體設定組合:%s" + +#: ../gio/gdbusprivate.c:2107 +msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +msgstr "無法載入 /var/lib/dbus/machine-id 或 /etc/machine-id:" + +#: ../gio/gdbusproxy.c:1640 +#, c-format +msgid "Error calling StartServiceByName for %s: " +msgstr "呼叫 %s StartServiceByName 時發生錯誤:" + +#: ../gio/gdbusproxy.c:1663 +#, c-format +msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" +msgstr "來自 StartServiceByName(\"%2$s\") 方法的未預期回應 %1$d" + +#: ../gio/gdbusproxy.c:2763 ../gio/gdbusproxy.c:2900 +msgid "" +"Cannot invoke method; proxy is for a well-known name without an owner and " +"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +msgstr "" +"不能呼叫方法;proxy 是沒有擁有者的知名名稱,而 proxy 是以 " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 旗標建構的" + +#: ../gio/gdbusserver.c:708 +msgid "Abstract name space not supported" +msgstr "不支援抽象命名空間" + +#: ../gio/gdbusserver.c:795 +msgid "Cannot specify nonce file when creating a server" +msgstr "當建立伺服器時不能指定臨時檔案" + +#: ../gio/gdbusserver.c:873 +#, c-format +msgid "Error writing nonce file at `%s': %s" +msgstr "在「%s」寫入臨時檔案時發生錯誤:%s" + +#: ../gio/gdbusserver.c:1041 +#, c-format +msgid "The string `%s' is not a valid D-Bus GUID" +msgstr "字串「%s」不是一個有效的 D-Bus GUID" + +#: ../gio/gdbusserver.c:1081 +#, c-format +msgid "Cannot listen on unsupported transport `%s'" +msgstr "不能聽取不支援的傳輸「%s」" + +#: ../gio/gdbus-tool.c:88 +msgid "COMMAND" +msgstr "指令" + +#: ../gio/gdbus-tool.c:93 +#, c-format +msgid "" +"Commands:\n" +" help Shows this information\n" +" introspect Introspect a remote object\n" +" monitor Monitor a remote object\n" +" call Invoke a method on a remote object\n" +" emit Emit a signal\n" +"\n" +"Use \"%s COMMAND --help\" to get help on each command.\n" +msgstr "" +"指令:\n" +" help 顯示這個資訊\n" +" introspect 檢查遠端物件\n" +" monitor 監控遠端物件\n" +" call 呼叫遠端物件的方法\n" +" emit 發出信號\n" +"\n" +"使用「%s COMMAND --help」來取得每個指令的求助資訊。\n" + +#: ../gio/gdbus-tool.c:162 ../gio/gdbus-tool.c:218 ../gio/gdbus-tool.c:290 +#: ../gio/gdbus-tool.c:314 ../gio/gdbus-tool.c:697 ../gio/gdbus-tool.c:1016 +#: ../gio/gdbus-tool.c:1449 +#, c-format +msgid "Error: %s\n" +msgstr "錯誤:%s\n" + +#: ../gio/gdbus-tool.c:173 ../gio/gdbus-tool.c:231 ../gio/gdbus-tool.c:1465 +#, c-format +msgid "Error parsing introspection XML: %s\n" +msgstr "解析檢討 XML 時出現錯誤:%s\n" + +#: ../gio/gdbus-tool.c:348 +msgid "Connect to the system bus" +msgstr "連線到系統匯流排" + +#: ../gio/gdbus-tool.c:349 +msgid "Connect to the session bus" +msgstr "連線到作業階段匯流排" + +#: ../gio/gdbus-tool.c:350 +msgid "Connect to given D-Bus address" +msgstr "連線到指定的 D-Bus 位址" + +#: ../gio/gdbus-tool.c:360 +msgid "Connection Endpoint Options:" +msgstr "連線端點選項:" + +#: ../gio/gdbus-tool.c:361 +msgid "Options specifying the connection endpoint" +msgstr "指定連線端點的選項" + +#: ../gio/gdbus-tool.c:383 +#, c-format +msgid "No connection endpoint specified" +msgstr "沒有指定連線端點" + +#: ../gio/gdbus-tool.c:393 +#, c-format +msgid "Multiple connection endpoints specified" +msgstr "指定了多重連線端點" + +#: ../gio/gdbus-tool.c:463 +#, c-format +msgid "" +"Warning: According to introspection data, interface `%s' does not exist\n" +msgstr "警告:根據檢討資料,介面「%s」不存在\n" + +#: ../gio/gdbus-tool.c:472 +#, c-format +msgid "" +"Warning: According to introspection data, method `%s' does not exist on " +"interface `%s'\n" +msgstr "警告:根據檢討資料,介面「%2$s」的方法「%1$s」不存在\n" + +#: ../gio/gdbus-tool.c:534 +msgid "Optional destination for signal (unique name)" +msgstr "信號的選擇性目的端 (獨特名稱)" + +#: ../gio/gdbus-tool.c:535 +msgid "Object path to emit signal on" +msgstr "要發出信號的物件路徑" + +#: ../gio/gdbus-tool.c:536 +msgid "Signal and interface name" +msgstr "信號和介面名稱" + +#: ../gio/gdbus-tool.c:568 +msgid "Emit a signal." +msgstr "發出信號。" + +#: ../gio/gdbus-tool.c:602 ../gio/gdbus-tool.c:828 ../gio/gdbus-tool.c:1555 +#: ../gio/gdbus-tool.c:1787 +#, c-format +msgid "Error connecting: %s\n" +msgstr "連線錯誤:%s\n" + +#: ../gio/gdbus-tool.c:614 +#, c-format +msgid "Error: object path not specified.\n" +msgstr "錯誤:沒有指定物件路徑。\n" + +#: ../gio/gdbus-tool.c:619 ../gio/gdbus-tool.c:889 ../gio/gdbus-tool.c:1613 +#: ../gio/gdbus-tool.c:1846 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "錯誤:%s 不是有效的物件路徑\n" + +#: ../gio/gdbus-tool.c:625 +#, c-format +msgid "Error: signal not specified.\n" +msgstr "錯誤:尚未指定信號。\n" + +#: ../gio/gdbus-tool.c:632 +#, c-format +msgid "Error: signal must be the fully-qualified name.\n" +msgstr "錯誤:信號必須為完全合規定的名稱。\n" + +#: ../gio/gdbus-tool.c:640 +#, c-format +msgid "Error: %s is not a valid interface name\n" +msgstr "錯誤:%s 不是有效的介面名稱\n" + +#: ../gio/gdbus-tool.c:646 +#, c-format +msgid "Error: %s is not a valid member name\n" +msgstr "錯誤:%s 不是有效的成員名稱\n" + +#: ../gio/gdbus-tool.c:652 +#, c-format +msgid "Error: %s is not a valid unique bus name.\n" +msgstr "錯誤:%s 不是有效的獨特匯流排名稱。\n" + +#: ../gio/gdbus-tool.c:675 ../gio/gdbus-tool.c:988 +#, c-format +msgid "Error parsing parameter %d: %s\n" +msgstr "解析參數 %d 時發生錯誤:%s\n" + +#: ../gio/gdbus-tool.c:704 +#, c-format +msgid "Error flushing connection: %s\n" +msgstr "清除連線時發生錯誤:%s\n" + +#: ../gio/gdbus-tool.c:731 +msgid "Destination name to invoke method on" +msgstr "要呼叫方法的目的端名稱" + +#: ../gio/gdbus-tool.c:732 +msgid "Object path to invoke method on" +msgstr "要呼叫方法的物件路徑" + +#: ../gio/gdbus-tool.c:733 +msgid "Method and interface name" +msgstr "方法和介面名稱" + +#: ../gio/gdbus-tool.c:734 +msgid "Timeout in seconds" +msgstr "逾時時間(秒)" + +#: ../gio/gdbus-tool.c:773 +msgid "Invoke a method on a remote object." +msgstr "呼叫遠端物件的方法。" + +#: ../gio/gdbus-tool.c:848 ../gio/gdbus-tool.c:1574 ../gio/gdbus-tool.c:1806 +#, c-format +msgid "Error: Destination is not specified\n" +msgstr "錯誤:尚未指定目的端\n" + +#: ../gio/gdbus-tool.c:869 ../gio/gdbus-tool.c:1593 +#, c-format +msgid "Error: Object path is not specified\n" +msgstr "錯誤:沒有指定物件路徑\n" + +#: ../gio/gdbus-tool.c:904 +#, c-format +msgid "Error: Method name is not specified\n" +msgstr "錯誤:沒有指定方法名稱\n" + +#: ../gio/gdbus-tool.c:915 +#, c-format +msgid "Error: Method name `%s' is invalid\n" +msgstr "錯誤:方法名稱「%s」是無效的\n" + +#: ../gio/gdbus-tool.c:980 +#, c-format +msgid "Error parsing parameter %d of type `%s': %s\n" +msgstr "解析類型「%2$s」的參數 %1$d 時發生錯誤:%3$s\n" + +#: ../gio/gdbus-tool.c:1412 +msgid "Destination name to introspect" +msgstr "要檢討的目的端名稱" + +#: ../gio/gdbus-tool.c:1413 +msgid "Object path to introspect" +msgstr "要檢討的物件路徑" + +#: ../gio/gdbus-tool.c:1414 +msgid "Print XML" +msgstr "顯示 XML" + +#: ../gio/gdbus-tool.c:1415 +msgid "Introspect children" +msgstr "Introspect 子項目" + +#: ../gio/gdbus-tool.c:1416 +msgid "Only print properties" +msgstr "只有列印屬性" + +#: ../gio/gdbus-tool.c:1507 +msgid "Introspect a remote object." +msgstr "檢討遠端物件。" + +#: ../gio/gdbus-tool.c:1705 +msgid "Destination name to monitor" +msgstr "要監控的目的端名稱" + +#: ../gio/gdbus-tool.c:1706 +msgid "Object path to monitor" +msgstr "要監控的物件路徑" + +#: ../gio/gdbus-tool.c:1739 +msgid "Monitor a remote object." +msgstr "監控遠端物件。" + +#: ../gio/gdesktopappinfo.c:580 ../gio/gwin32appinfo.c:221 +msgid "Unnamed" +msgstr "未命名的" + +#: ../gio/gdesktopappinfo.c:993 +msgid "Desktop file didn't specify Exec field" +msgstr "桌面(Desktop)檔案未指定 Exec 欄位" + +#: ../gio/gdesktopappinfo.c:1281 +msgid "Unable to find terminal required for application" +msgstr "無法找到應用程式要求的終端機" + +#: ../gio/gdesktopappinfo.c:1569 +#, c-format +msgid "Can't create user application configuration folder %s: %s" +msgstr "不能建立使用者應用程式組態資料夾 %s:%s" + +#: ../gio/gdesktopappinfo.c:1573 +#, c-format +msgid "Can't create user MIME configuration folder %s: %s" +msgstr "不能建立使用者 MIME 組態資料夾 %s:%s" + +#: ../gio/gdesktopappinfo.c:1813 ../gio/gdesktopappinfo.c:1837 +msgid "Application information lacks an identifier" +msgstr "應用程式資訊缺少識別碼" + +#: ../gio/gdesktopappinfo.c:2069 +#, c-format +msgid "Can't create user desktop file %s" +msgstr "不能建立使用者桌面檔案 %s" + +#: ../gio/gdesktopappinfo.c:2192 +#, c-format +msgid "Custom definition for %s" +msgstr "自訂 %s 的定義" + +#: ../gio/gdrive.c:393 +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:470 +msgid "drive doesn't implement eject or eject_with_operation" +msgstr "裝置無法實作退出功能(eject) 或 eject_with_operation" + +#: ../gio/gdrive.c:543 +msgid "drive doesn't implement polling for media" +msgstr "裝置無法實作媒體的輪詢" + +#: ../gio/gdrive.c:746 +msgid "drive doesn't implement start" +msgstr "裝置無法實作啟動功能(start)" + +#: ../gio/gdrive.c:845 +msgid "drive doesn't implement stop" +msgstr "裝置無法實作停止功能(stop)" + +#: ../gio/gdummytlsbackend.c:168 ../gio/gdummytlsbackend.c:288 +#: ../gio/gdummytlsbackend.c:378 +msgid "TLS support is not available" +msgstr "TLS 支援無法使用" + +#: ../gio/gemblem.c:324 +#, c-format +msgid "Can't handle version %d of GEmblem encoding" +msgstr "不能處理版本為 %d 的 GEmblem 編碼" + +#: ../gio/gemblem.c:334 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblem encoding" +msgstr "GEmblem 編碼中記號 (%d) 的數量格式不正確" + +#: ../gio/gemblemedicon.c:367 +#, c-format +msgid "Can't handle version %d of GEmblemedIcon encoding" +msgstr "不能處理版本為 %d 的 GEmblemedIcon 編碼" + +#: ../gio/gemblemedicon.c:377 +#, c-format +msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" +msgstr "GEmblemedIcon 編碼中記號 (%d) 的數量格式不正確" + +#: ../gio/gemblemedicon.c:400 +msgid "Expected a GEmblem for GEmblemedIcon" +msgstr "預期為 GEmblemedIcon 的 GEmblem" + +#: ../gio/gfile.c:903 ../gio/gfile.c:1142 ../gio/gfile.c:1281 +#: ../gio/gfile.c:1521 ../gio/gfile.c:1576 ../gio/gfile.c:1634 +#: ../gio/gfile.c:1718 ../gio/gfile.c:1775 ../gio/gfile.c:1839 +#: ../gio/gfile.c:1894 ../gio/gfile.c:3363 ../gio/gfile.c:3418 +#: ../gio/gfile.c:3564 ../gio/gfile.c:3606 ../gio/gfile.c:4008 +#: ../gio/gfile.c:4422 ../gio/gfile.c:4507 ../gio/gfile.c:4597 +#: ../gio/gfile.c:4694 ../gio/gfile.c:4781 ../gio/gfile.c:4873 +#: ../gio/gfile.c:5206 ../gio/gfile.c:5530 ../gio/gfile.c:5598 +#: ../gio/gfile.c:7225 ../gio/gfile.c:7315 ../gio/gfile.c:7399 +#: ../gio/win32/gwinhttpfile.c:439 +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:1405 ../gio/glocalfile.c:1089 ../gio/glocalfile.c:1100 +#: ../gio/glocalfile.c:1113 +msgid "Containing mount does not exist" +msgstr "包含了不存在的掛載點" + +#: ../gio/gfile.c:2460 ../gio/glocalfile.c:2308 +msgid "Can't copy over directory" +msgstr "不能複製整個目錄" + +#: ../gio/gfile.c:2520 +msgid "Can't copy directory over directory" +msgstr "不能將目錄複製到目錄上" + +#: ../gio/gfile.c:2528 ../gio/glocalfile.c:2317 +msgid "Target file exists" +msgstr "目標檔案已存在" + +#: ../gio/gfile.c:2547 +msgid "Can't recursively copy directory" +msgstr "不能遞廻複製目錄" + +#: ../gio/gfile.c:2811 +msgid "Splice not supported" +msgstr "不支援拼接" + +#: ../gio/gfile.c:2815 +#, c-format +msgid "Error splicing file: %s" +msgstr "拼接檔案時發生錯誤:%s" + +#: ../gio/gfile.c:2961 +msgid "Can't copy special file" +msgstr "不能複製特殊的檔案" + +#: ../gio/gfile.c:3554 +msgid "Invalid symlink value given" +msgstr "提供了無效的符號連結值" + +#: ../gio/gfile.c:3714 +msgid "Trash not supported" +msgstr "不支援回收筒" + +#: ../gio/gfile.c:3765 +#, c-format +msgid "File names cannot contain '%c'" +msgstr "檔案名稱不能包含「%c」" + +#: ../gio/gfile.c:6290 ../gio/gvolume.c:364 +msgid "volume doesn't implement mount" +msgstr "儲存區尚未實作掛載功能" + +#: ../gio/gfile.c:6398 +msgid "No application is registered as handling this file" +msgstr "沒有應用程式註冊為用以處理這個檔案" + +#: ../gio/gfileenumerator.c:205 +msgid "Enumerator is closed" +msgstr "檔案列舉器(enumerator)已關閉" + +#: ../gio/gfileenumerator.c:212 ../gio/gfileenumerator.c:271 +#: ../gio/gfileenumerator.c:371 ../gio/gfileenumerator.c:476 +msgid "File enumerator has outstanding operation" +msgstr "檔案列舉器(enumerator)有異常操作" + +#: ../gio/gfileenumerator.c:361 ../gio/gfileenumerator.c:466 +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:154 ../gio/gfileinputstream.c:415 +#: ../gio/gfileiostream.c:170 ../gio/gfileoutputstream.c:169 +#: ../gio/gfileoutputstream.c:518 +msgid "Stream doesn't support query_info" +msgstr "串流不支援 query_info" + +#: ../gio/gfileinputstream.c:330 ../gio/gfileiostream.c:382 +#: ../gio/gfileoutputstream.c:376 +msgid "Seek not supported on stream" +msgstr "不支援在串流中搜尋" + +#: ../gio/gfileinputstream.c:374 +msgid "Truncate not allowed on input stream" +msgstr "在輸入串流中不允許截短(truncate)" + +#: ../gio/gfileiostream.c:458 ../gio/gfileoutputstream.c:452 +msgid "Truncate not supported on stream" +msgstr "在串流中不支援截短(truncate)" + +#: ../gio/gicon.c:284 +#, c-format +msgid "Wrong number of tokens (%d)" +msgstr "記號數量 (%d) 錯誤" + +#: ../gio/gicon.c:304 +#, c-format +msgid "No type for class name %s" +msgstr "類別名稱 %s 沒有類型" + +#: ../gio/gicon.c:314 +#, c-format +msgid "Type %s does not implement the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面" + +#: ../gio/gicon.c:325 +#, c-format +msgid "Type %s is not classed" +msgstr "類型 %s 尚未歸類" + +#: ../gio/gicon.c:339 +#, c-format +msgid "Malformed version number: %s" +msgstr "格式不良的版本號碼:%s" + +#: ../gio/gicon.c:353 +#, c-format +msgid "Type %s does not implement from_tokens() on the GIcon interface" +msgstr "類型 %s 沒有實作 GIcon 介面的 from_tokens()" + +#: ../gio/gicon.c:428 +msgid "Can't handle the supplied version of the icon encoding" +msgstr "不能處理提供的圖示編碼版本" + +#: ../gio/ginetaddressmask.c:184 +msgid "No address specified" +msgstr "尚未指定位址" + +#: ../gio/ginetaddressmask.c:192 +#, c-format +msgid "Length %u is too long for address" +msgstr "長度 %u 對位址來說太長了" + +#: ../gio/ginetaddressmask.c:225 +msgid "Address has bits set beyond prefix length" +msgstr "位址在 prefix length 後有位元設定" + +#: ../gio/ginetaddressmask.c:304 +#, c-format +msgid "Could not parse '%s' as IP address mask" +msgstr "無法解析「%s」做為 IP 位址遮罩" + +#: ../gio/ginetsocketaddress.c:206 ../gio/ginetsocketaddress.c:223 +#: ../gio/gunixsocketaddress.c:221 +msgid "Not enough space for socket address" +msgstr "socket 位址沒有足夠的空間" + +#: ../gio/ginetsocketaddress.c:238 +msgid "Unsupported socket address" +msgstr "不支援的 socket 位址" + +#: ../gio/ginputstream.c:194 +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:1060 ../gio/giostream.c:302 +#: ../gio/goutputstream.c:1378 +msgid "Stream has outstanding operation" +msgstr "串流有異常操作" + +#: ../gio/glib-compile-resources.c:141 ../gio/glib-compile-schemas.c:1455 +#, c-format +msgid "Element <%s> not allowed inside <%s>" +msgstr "元素 <%s> 不可出現在 <%s> 內" + +#: ../gio/glib-compile-resources.c:145 +#, c-format +msgid "Element <%s> not allowed at toplevel" +msgstr "元素 <%s> 不允許在頂端層級" + +#: ../gio/glib-compile-resources.c:235 +#, c-format +msgid "File %s appears multiple times in the resource" +msgstr "檔案 %s 似乎在這個資源出出現多次" + +#: ../gio/glib-compile-resources.c:248 +#, c-format +msgid "Failed to locate '%s' in any source directory" +msgstr "無法在任何來源目錄中定位「%s」" + +#: ../gio/glib-compile-resources.c:259 +#, c-format +msgid "Failed to locate '%s' in current directory" +msgstr "無法在目前的目錄中定位「%s」" + +#: ../gio/glib-compile-resources.c:288 +#, c-format +msgid "Unknown processing option \"%s\"" +msgstr "不明的置處理選項「%s」" + +#: ../gio/glib-compile-resources.c:306 ../gio/glib-compile-resources.c:365 +#, c-format +msgid "Failed to create temp file: %s" +msgstr "無法建立暫存檔案:%s" + +#: ../gio/glib-compile-resources.c:336 +#, c-format +msgid "" +"Error processing input file with xmllint:\n" +"%s" +msgstr "" +"以 xmllint 處理輸入檔案時發生錯誤:\n" +"%s" + +#: ../gio/glib-compile-resources.c:391 +#, c-format +msgid "" +"Error processing input file with to-pixdata:\n" +"%s" +msgstr "" +"以 to-pixdata 處理輸入檔案時發生錯誤:\n" +"%s" + +#: ../gio/glib-compile-resources.c:404 +#, c-format +msgid "Error reading file %s: %s" +msgstr "讀取檔案 %s 時發生錯誤:%s" + +#: ../gio/glib-compile-resources.c:424 +#, c-format +msgid "Error compressing file %s" +msgstr "壓縮檔案 %s 時發生錯誤" + +#: ../gio/glib-compile-resources.c:488 ../gio/glib-compile-schemas.c:1567 +#, c-format +msgid "text may not appear inside <%s>" +msgstr "在 <%s> 內不能出現文字" + +#: ../gio/glib-compile-resources.c:611 +msgid "name of the output file" +msgstr "輸出檔案的名稱" + +#: ../gio/glib-compile-resources.c:611 ../gio/glib-compile-resources.c:644 +#: ../gio/gresource-tool.c:478 ../gio/gresource-tool.c:544 +msgid "FILE" +msgstr "FILE" + +#: ../gio/glib-compile-resources.c:612 +msgid "" +"The directories where files are to be read from (default to current " +"directory)" +msgstr "用來讀取檔案的目錄 (預設為目前的目錄)" + +#: ../gio/glib-compile-resources.c:612 ../gio/glib-compile-schemas.c:1995 +#: ../gio/glib-compile-schemas.c:2025 +msgid "DIRECTORY" +msgstr "目錄" + +#: ../gio/glib-compile-resources.c:613 +msgid "" +"Generate output in the format selected for by the target filename extension" +msgstr "以目標檔案名稱的延伸檔名來選擇要產生輸出的格式" + +#: ../gio/glib-compile-resources.c:614 +msgid "Generate source header" +msgstr "產生來源標頭" + +#: ../gio/glib-compile-resources.c:615 +msgid "Generate sourcecode used to link in the resource file into your code" +msgstr "產生原始碼用來連結資源檔到您的程式碼中" + +#: ../gio/glib-compile-resources.c:616 +msgid "Generate dependency list" +msgstr "產生相依性清單" + +#: ../gio/glib-compile-resources.c:617 +msgid "Don't automatically create and register resource" +msgstr "不要自動建立與註冊資源" + +#: ../gio/glib-compile-resources.c:618 +msgid "C identifier name used for the generated source code" +msgstr "用於產生原始碼的 C 識別碼名稱" + +#: ../gio/glib-compile-resources.c:647 +msgid "" +"Compile a resource specification into a resource file.\n" +"Resource specification files have the extension .gresource.xml,\n" +"and the resource file have the extension called .gresource." +msgstr "" +"將資源規格編譯進資源檔。\n" +"資源規格檔案的延伸檔名必須為 .gresource.xml,\n" +"而資源檔案的延伸檔名叫做 .gresource。" + +#: ../gio/glib-compile-resources.c:663 +#, c-format +msgid "You should give exactly one file name\n" +msgstr "您應該明確指定一個檔案名稱\n" + +#: ../gio/glib-compile-schemas.c:774 +msgid "empty names are not permitted" +msgstr "不允許空名名稱" + +#: ../gio/glib-compile-schemas.c:784 +#, c-format +msgid "invalid name '%s': names must begin with a lowercase letter" +msgstr "無效的名稱「%s」:名稱必須以小寫字母開頭" + +#: ../gio/glib-compile-schemas.c:796 +#, c-format +msgid "" +"invalid name '%s': invalid character '%c'; only lowercase letters, numbers " +"and hyphen ('-') are permitted." +msgstr "" +"無效的名稱「%s」:無效的字元「%c」;只允許小寫字母、數字和破折號 ('-')。" + +#: ../gio/glib-compile-schemas.c:805 +#, c-format +msgid "invalid name '%s': two successive hyphens ('--') are not permitted." +msgstr "無效的名稱「%s」:不允許兩個破折號 ('--')。" + +#: ../gio/glib-compile-schemas.c:814 +#, c-format +msgid "invalid name '%s': the last character may not be a hyphen ('-')." +msgstr "無效的名稱「%s」:最後一個字元不能是破折號 ('-')。" + +#: ../gio/glib-compile-schemas.c:822 +#, c-format +msgid "invalid name '%s': maximum length is 1024" +msgstr "無效的名稱「%s」:最大長度為 1024" + +#: ../gio/glib-compile-schemas.c:891 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:917 +msgid "cannot add keys to a 'list-of' schema" +msgstr "不能將設定鍵加入 'list-of' schema" + +#: ../gio/glib-compile-schemas.c:928 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:946 +#, c-format +msgid "" +" shadows in ; use " +"to modify value" +msgstr "" +" 遮蔽 於 ;使用 來" +"修改數值" + +#: ../gio/glib-compile-schemas.c:957 +#, c-format +msgid "" +"exactly one of 'type', 'enum' or 'flags' must be specified as an attribute " +"to " +msgstr "必須明確指定「type」、「enum」或「flags」之一做為 的屬性" + +#: ../gio/glib-compile-schemas.c:976 +#, c-format +msgid "<%s id='%s'> not (yet) defined." +msgstr "<%s id='%s'> 尚未定義。" + +#: ../gio/glib-compile-schemas.c:991 +#, c-format +msgid "invalid GVariant type string '%s'" +msgstr "無效的 GVariant 類型字串「%s」" + +#: ../gio/glib-compile-schemas.c:1021 +msgid " given but schema isn't extending anything" +msgstr "指定了 但 schema 並未延伸任何東西" + +#: ../gio/glib-compile-schemas.c:1034 +#, c-format +msgid "no to override" +msgstr "沒有 要覆蓋" + +#: ../gio/glib-compile-schemas.c:1042 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:1113 +#, c-format +msgid " already specified" +msgstr " 已經指定了" + +#: ../gio/glib-compile-schemas.c:1125 +#, c-format +msgid " extends not-yet-existing schema '%s'" +msgstr " 延伸了尚不存在的 schema '%s'" + +#: ../gio/glib-compile-schemas.c:1141 +#, c-format +msgid " is list of not-yet-existing schema '%s'" +msgstr " 是尚不存在的 schema '%s' 的清單" + +#: ../gio/glib-compile-schemas.c:1149 +#, c-format +msgid "Can not be a list of a schema with a path" +msgstr "不能成為有路徑 schema 的清單" + +#: ../gio/glib-compile-schemas.c:1159 +#, c-format +msgid "Can not extend a schema with a path" +msgstr "不能延伸有路徑的 schema" + +#: ../gio/glib-compile-schemas.c:1169 +#, c-format +msgid "" +" is a list, extending which is not a list" +msgstr " 是清單,卻延伸了不是清單的 " + +#: ../gio/glib-compile-schemas.c:1179 +#, c-format +msgid "" +" extends but '%s' " +"does not extend '%s'" +msgstr "" +" 延伸了 但是 '%s' " +"並未延伸 '%s'" + +#: ../gio/glib-compile-schemas.c:1196 +#, c-format +msgid "a path, if given, must begin and end with a slash" +msgstr "如果指定了路徑,開頭與結尾都要加上斜線" + +#: ../gio/glib-compile-schemas.c:1203 +#, c-format +msgid "the path of a list must end with ':/'" +msgstr "清單的路徑不能以‘:/’為結尾" + +#: ../gio/glib-compile-schemas.c:1235 +#, c-format +msgid "<%s id='%s'> already specified" +msgstr "<%s id='%s'> 已經指定了" + +#: ../gio/glib-compile-schemas.c:1459 +#, c-format +msgid "Element <%s> not allowed at the top level" +msgstr "元素 <%s> 不允許在頂端層級" + +#. Translators: Do not translate "--strict". +#: ../gio/glib-compile-schemas.c:1753 ../gio/glib-compile-schemas.c:1824 +#: ../gio/glib-compile-schemas.c:1900 +#, c-format +msgid "--strict was specified; exiting.\n" +msgstr "並且指定了 --strict;正在結束。\n" + +#: ../gio/glib-compile-schemas.c:1761 +#, c-format +msgid "This entire file has been ignored.\n" +msgstr "這整個檔案都被忽略了。\n" + +#: ../gio/glib-compile-schemas.c:1820 +#, c-format +msgid "Ignoring this file.\n" +msgstr "忽略這個檔案。\n" + +#: ../gio/glib-compile-schemas.c:1860 +#, c-format +msgid "No such key `%s' in schema `%s' as specified in override file `%s'" +msgstr "在覆蓋檔案「%3$s」的 schema「%2$s」中沒有指定這個設定鍵「%1$s」" + +#: ../gio/glib-compile-schemas.c:1866 ../gio/glib-compile-schemas.c:1924 +#: ../gio/glib-compile-schemas.c:1952 +#, c-format +msgid "; ignoring override for this key.\n" +msgstr ";忽略這個設定鍵的覆蓋。\n" + +#: ../gio/glib-compile-schemas.c:1870 ../gio/glib-compile-schemas.c:1928 +#: ../gio/glib-compile-schemas.c:1956 +#, c-format +msgid " and --strict was specified; exiting.\n" +msgstr "並且指定了 --strict;正在結束。\n" + +#: ../gio/glib-compile-schemas.c:1886 +#, c-format +msgid "" +"error parsing key `%s' in schema `%s' as specified in override file `%s': " +"%s. " +msgstr "" +"在覆蓋檔案「%3$s」中指定的 schema「%2$s」解析設定鍵「%1$s」時發生錯誤:%4$s。" + +#: ../gio/glib-compile-schemas.c:1896 +#, c-format +msgid "Ignoring override for this key.\n" +msgstr "忽略這個設定鍵的覆蓋。\n" + +#: ../gio/glib-compile-schemas.c:1914 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is outside the " +"range given in the schema" +msgstr "" +"在覆蓋檔案「%3$s」中覆蓋 schema「%2$s」的設定鍵「%1$s」超出了 schema 指定的範" +"圍" + +#: ../gio/glib-compile-schemas.c:1942 +#, c-format +msgid "" +"override for key `%s' in schema `%s' in override file `%s' is not in the " +"list of valid choices" +msgstr "" +"在覆蓋檔案「%3$s」中覆蓋 schema「%2$s」的設定鍵「%1$s」不在有效的選擇清單中" + +#: ../gio/glib-compile-schemas.c:1995 +msgid "where to store the gschemas.compiled file" +msgstr "要將 gschemas.compiled 檔案儲存到哪裡" + +#: ../gio/glib-compile-schemas.c:1996 +msgid "Abort on any errors in schemas" +msgstr "在 schema 中有任何錯誤即中止" + +#: ../gio/glib-compile-schemas.c:1997 +msgid "Do not write the gschema.compiled file" +msgstr "不要寫入 gschemas.compiled 檔案" + +#: ../gio/glib-compile-schemas.c:1998 +msgid "Do not enforce key name restrictions" +msgstr "不要強制設定鍵名稱限制" + +#: ../gio/glib-compile-schemas.c:2028 +msgid "" +"Compile all GSettings schema files into a schema cache.\n" +"Schema files are required to have the extension .gschema.xml,\n" +"and the cache file is called gschemas.compiled." +msgstr "" +"將所有的 GSettings schema 檔案編譯為 schema 快取。\n" +"Schema 檔案的延伸檔名必須為 .gschema.xml,\n" +"而快取檔案叫做 gschemas.compiled。" + +#: ../gio/glib-compile-schemas.c:2044 +#, c-format +msgid "You should give exactly one directory name\n" +msgstr "您應該明確指定一個目錄名稱\n" + +#: ../gio/glib-compile-schemas.c:2083 +#, c-format +msgid "No schema files found: " +msgstr "找不到 schema 檔案:" + +#: ../gio/glib-compile-schemas.c:2086 +#, c-format +msgid "doing nothing.\n" +msgstr "不做任何事。\n" + +#: ../gio/glib-compile-schemas.c:2089 +#, c-format +msgid "removed existing output file.\n" +msgstr "移除現有的輸出檔案。\n" + +#: ../gio/glocaldirectorymonitor.c:287 +msgid "Unable to find default local directory monitor type" +msgstr "無法找到預設的本地端目錄監視器類型" + +#: ../gio/glocalfile.c:590 ../gio/win32/gwinhttpfile.c:422 +#, c-format +msgid "Invalid filename %s" +msgstr "無效的檔案名稱 %s" + +#: ../gio/glocalfile.c:967 +#, c-format +msgid "Error getting filesystem info: %s" +msgstr "取得檔案系統資訊時發生錯誤:%s" + +#: ../gio/glocalfile.c:1135 +msgid "Can't rename root directory" +msgstr "不能重新命名根目錄" + +#: ../gio/glocalfile.c:1155 ../gio/glocalfile.c:1181 +#, c-format +msgid "Error renaming file: %s" +msgstr "重新命名檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1164 +msgid "Can't rename file, filename already exists" +msgstr "不能重新命名檔案,該檔案名稱已存在" + +#: ../gio/glocalfile.c:1177 ../gio/glocalfile.c:2181 ../gio/glocalfile.c:2210 +#: ../gio/glocalfile.c:2370 ../gio/glocalfileoutputstream.c:581 +#: ../gio/glocalfileoutputstream.c:634 ../gio/glocalfileoutputstream.c:679 +#: ../gio/glocalfileoutputstream.c:1167 +msgid "Invalid filename" +msgstr "無效的檔案名稱" + +#: ../gio/glocalfile.c:1344 ../gio/glocalfile.c:1368 +msgid "Can't open directory" +msgstr "不能開啟目錄" + +#: ../gio/glocalfile.c:1352 +#, c-format +msgid "Error opening file: %s" +msgstr "開啓檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1493 +#, c-format +msgid "Error removing file: %s" +msgstr "移除檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:1860 +#, c-format +msgid "Error trashing file: %s" +msgstr "移動檔案至回收筒時發生錯誤:%s" + +#: ../gio/glocalfile.c:1883 +#, c-format +msgid "Unable to create trash dir %s: %s" +msgstr "無法建立回收筒目錄 %s:%s" + +#: ../gio/glocalfile.c:1904 +msgid "Unable to find toplevel directory for trash" +msgstr "無法找到回收筒的頂端層級目錄" + +#: ../gio/glocalfile.c:1983 ../gio/glocalfile.c:2003 +msgid "Unable to find or create trash directory" +msgstr "無法找到或建立回收筒目錄" + +#: ../gio/glocalfile.c:2037 +#, c-format +msgid "Unable to create trashing info file: %s" +msgstr "無法建立回收筒資訊檔案:%s" + +#: ../gio/glocalfile.c:2066 ../gio/glocalfile.c:2071 ../gio/glocalfile.c:2151 +#: ../gio/glocalfile.c:2158 +#, c-format +msgid "Unable to trash file: %s" +msgstr "無法將檔案移至回收筒:%s" + +#: ../gio/glocalfile.c:2159 ../glib/gregex.c:280 +msgid "internal error" +msgstr "內部的錯誤" + +#: ../gio/glocalfile.c:2185 +#, c-format +msgid "Error creating directory: %s" +msgstr "建立目錄發生錯誤:%s" + +#: ../gio/glocalfile.c:2214 +#, c-format +msgid "Filesystem does not support symbolic links" +msgstr "檔案系統不支援符號連結" + +#: ../gio/glocalfile.c:2218 +#, c-format +msgid "Error making symbolic link: %s" +msgstr "建立符號連結時發生錯誤:%s" + +#: ../gio/glocalfile.c:2280 ../gio/glocalfile.c:2374 +#, c-format +msgid "Error moving file: %s" +msgstr "移動檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:2303 +msgid "Can't move directory over directory" +msgstr "不能將目錄移動至目錄上" + +#: ../gio/glocalfile.c:2330 ../gio/glocalfileoutputstream.c:965 +#: ../gio/glocalfileoutputstream.c:979 ../gio/glocalfileoutputstream.c:994 +#: ../gio/glocalfileoutputstream.c:1010 ../gio/glocalfileoutputstream.c:1024 +msgid "Backup file creation failed" +msgstr "建立備份檔案失敗" + +#: ../gio/glocalfile.c:2349 +#, c-format +msgid "Error removing target file: %s" +msgstr "移除目標檔案時發生錯誤:%s" + +#: ../gio/glocalfile.c:2363 +msgid "Move between mounts not supported" +msgstr "不支援在掛載點之間移動" + +#: ../gio/glocalfileinfo.c:718 +msgid "Attribute value must be non-NULL" +msgstr "屬性數值必須為非-NULL" + +#: ../gio/glocalfileinfo.c:725 +msgid "Invalid attribute type (string expected)" +msgstr "無效的屬性類型(應為字串值)" + +#: ../gio/glocalfileinfo.c:732 +msgid "Invalid extended attribute name" +msgstr "無效的延伸屬性名稱" + +#: ../gio/glocalfileinfo.c:772 +#, c-format +msgid "Error setting extended attribute '%s': %s" +msgstr "設定延伸屬性「%s」時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1425 +msgid " (invalid encoding)" +msgstr "(無效的編碼)" + +#: ../gio/glocalfileinfo.c:1617 ../gio/glocalfileoutputstream.c:843 +#, c-format +msgid "Error when getting information for file '%s': %s" +msgstr "取得檔案「%s」資訊時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1852 +#, c-format +msgid "Error when getting information for file descriptor: %s" +msgstr "取得檔案描述狀態資訊時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:1897 +msgid "Invalid attribute type (uint32 expected)" +msgstr "無效的屬性類型(應為 uint32 值)" + +#: ../gio/glocalfileinfo.c:1915 +msgid "Invalid attribute type (uint64 expected)" +msgstr "無效的屬性類型(應為 uint64 值)" + +#: ../gio/glocalfileinfo.c:1934 ../gio/glocalfileinfo.c:1953 +msgid "Invalid attribute type (byte string expected)" +msgstr "無效的屬性類型(應為 byte string 值)" + +#: ../gio/glocalfileinfo.c:1988 +msgid "Cannot set permissions on symlinks" +msgstr "不能設定符號連結的權限" + +#: ../gio/glocalfileinfo.c:2004 +#, c-format +msgid "Error setting permissions: %s" +msgstr "設定權限時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2055 +#, c-format +msgid "Error setting owner: %s" +msgstr "設定擁有者時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2078 +msgid "symlink must be non-NULL" +msgstr "符號連結必須為非-NULL" + +#: ../gio/glocalfileinfo.c:2088 ../gio/glocalfileinfo.c:2107 +#: ../gio/glocalfileinfo.c:2118 +#, c-format +msgid "Error setting symlink: %s" +msgstr "設定符號連結時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2097 +msgid "Error setting symlink: file is not a symlink" +msgstr "設定符號連結時發生錯誤:檔案不是符號連結" + +#: ../gio/glocalfileinfo.c:2223 +#, c-format +msgid "Error setting modification or access time: %s" +msgstr "設定修改或存取時刻時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2246 +msgid "SELinux context must be non-NULL" +msgstr "SELinux 關聯必須為非-NULL" + +#: ../gio/glocalfileinfo.c:2261 +#, c-format +msgid "Error setting SELinux context: %s" +msgstr "設定 SELinux 關聯時發生錯誤:%s" + +#: ../gio/glocalfileinfo.c:2268 +msgid "SELinux is not enabled on this system" +msgstr "SELinux 在這個系統上並未啟用" + +#: ../gio/glocalfileinfo.c:2360 +#, c-format +msgid "Setting attribute %s not supported" +msgstr "不支援設定屬性 %s" + +#: ../gio/glocalfileinputstream.c:185 ../gio/glocalfileoutputstream.c:732 +#, c-format +msgid "Error reading from file: %s" +msgstr "從檔案讀取時發生錯誤:%s" + +#: ../gio/glocalfileinputstream.c:216 ../gio/glocalfileinputstream.c:228 +#: ../gio/glocalfileinputstream.c:340 ../gio/glocalfileoutputstream.c:470 +#: ../gio/glocalfileoutputstream.c:1042 +#, c-format +msgid "Error seeking in file: %s" +msgstr "在檔案中搜尋時發生錯誤:%s" + +#: ../gio/glocalfileinputstream.c:261 ../gio/glocalfileoutputstream.c:256 +#: ../gio/glocalfileoutputstream.c:351 +#, c-format +msgid "Error closing file: %s" +msgstr "關閉檔案時發生錯誤:%s" + +#: ../gio/glocalfilemonitor.c:212 +msgid "Unable to find default local file monitor type" +msgstr "無法找到預設的本地端檔案監視器類型" + +#: ../gio/glocalfileoutputstream.c:202 ../gio/glocalfileoutputstream.c:235 +#: ../gio/glocalfileoutputstream.c:753 +#, c-format +msgid "Error writing to file: %s" +msgstr "寫入至檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:283 +#, c-format +msgid "Error removing old backup link: %s" +msgstr "移除舊備份連結時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:297 ../gio/glocalfileoutputstream.c:310 +#, c-format +msgid "Error creating backup copy: %s" +msgstr "建立備份複本時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:328 +#, c-format +msgid "Error renaming temporary file: %s" +msgstr "重新命名暫存檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:516 ../gio/glocalfileoutputstream.c:1093 +#, c-format +msgid "Error truncating file: %s" +msgstr "截短檔案時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:587 ../gio/glocalfileoutputstream.c:640 +#: ../gio/glocalfileoutputstream.c:685 ../gio/glocalfileoutputstream.c:825 +#: ../gio/glocalfileoutputstream.c:1074 ../gio/glocalfileoutputstream.c:1173 +#, c-format +msgid "Error opening file '%s': %s" +msgstr "開啟檔案「%s」時發生錯誤:%s" + +#: ../gio/glocalfileoutputstream.c:856 +msgid "Target file is a directory" +msgstr "目標檔案是一個目錄" + +#: ../gio/glocalfileoutputstream.c:861 +msgid "Target file is not a regular file" +msgstr "目標檔案不是正規的檔案" + +#: ../gio/glocalfileoutputstream.c:873 +msgid "The file was externally modified" +msgstr "該檔案已被外部程式修改過" + +#: ../gio/glocalfileoutputstream.c:1058 +#, c-format +msgid "Error removing old file: %s" +msgstr "移除舊檔案時發生錯誤:%s" + +#: ../gio/gmemoryinputstream.c:483 ../gio/gmemoryoutputstream.c:734 +msgid "Invalid GSeekType supplied" +msgstr "提供了無效的 GSeek 類型" + +#: ../gio/gmemoryinputstream.c:493 +msgid "Invalid seek request" +msgstr "無效的搜尋要求" + +#: ../gio/gmemoryinputstream.c:517 +msgid "Cannot truncate GMemoryInputStream" +msgstr "不能截短 GMemoryInputStream" + +#: ../gio/gmemoryoutputstream.c:530 +msgid "Memory output stream not resizable" +msgstr "記憶體輸出串流不能改變大小" + +#: ../gio/gmemoryoutputstream.c:546 +msgid "Failed to resize memory output stream" +msgstr "改變記憶體輸出串流的大小失敗" + +#: ../gio/gmemoryoutputstream.c:634 +msgid "" +"Amount of memory required to process the write is larger than available " +"address space" +msgstr "進行寫入所需的記憶體總額大於可用的位址空間" + +#: ../gio/gmemoryoutputstream.c:744 +msgid "Requested seek before the beginning of the stream" +msgstr "在串流的開頭之前要求的搜索" + +#: ../gio/gmemoryoutputstream.c:753 +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:395 +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:470 +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:547 +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:631 +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:717 +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:797 +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:882 +msgid "mount doesn't implement synchronous content type guessing" +msgstr "掛載點尚未實作同步內容類型預測" + +#: ../gio/gnetworkaddress.c:322 +#, c-format +msgid "Hostname '%s' contains '[' but not ']'" +msgstr "主機名稱「%s」含有 '[' but not ']'" + +#: ../gio/gnetworkmonitorbase.c:178 +msgid "Network unreachable" +msgstr "無法連接網路" + +#: ../gio/gnetworkmonitorbase.c:218 +msgid "Host unreachable" +msgstr "無法連接主機" + +#: ../gio/gnetworkmonitornetlink.c:97 ../gio/gnetworkmonitornetlink.c:109 +#: ../gio/gnetworkmonitornetlink.c:120 +#, c-format +msgid "Could not create network monitor: %s" +msgstr "無法建立網路監控:%s" + +#: ../gio/gnetworkmonitornetlink.c:129 +msgid "Could not create network monitor: " +msgstr "無法建立網路監控:" + +#: ../gio/gnetworkmonitornetlink.c:177 +msgid "Could not get network status: " +msgstr "無法取得網路狀態:" + +#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:464 +msgid "Output stream doesn't implement write" +msgstr "輸出串流尚未實作寫入" + +#: ../gio/goutputstream.c:425 ../gio/goutputstream.c:1029 +msgid "Source stream is already closed" +msgstr "來源串流已經關閉" + +#: ../gio/gresolver.c:917 +#, c-format +msgid "Error resolving '%s': %s" +msgstr "解析「%s」時發生錯誤:%s" + +#: ../gio/gresolver.c:967 +#, c-format +msgid "Error reverse-resolving '%s': %s" +msgstr "反向解析「%s」時發生錯誤:%s" + +#: ../gio/gresolver.c:1170 ../gio/gresolver.c:1369 +#, c-format +msgid "No DNS record of the requested type for '%s'" +msgstr "「%s」的要求類型沒有 DNS 紀錄" + +#: ../gio/gresolver.c:1175 ../gio/gresolver.c:1374 +#, c-format +msgid "Temporarily unable to resolve '%s'" +msgstr "暫時無法解析「%s」" + +#: ../gio/gresolver.c:1180 ../gio/gresolver.c:1379 +#, c-format +msgid "Error resolving '%s'" +msgstr "解析「%s」時發生錯誤" + +#: ../gio/gresolver.c:1208 ../gio/gresolver.c:1269 +#, c-format +msgid "Incomplete data received for '%s'" +msgstr "收到「%s」的不完整資料" + +#: ../gio/gresource.c:291 ../gio/gresource.c:539 ../gio/gresource.c:556 +#: ../gio/gresource.c:677 ../gio/gresource.c:746 ../gio/gresource.c:807 +#: ../gio/gresource.c:887 ../gio/gresourcefile.c:452 +#: ../gio/gresourcefile.c:553 ../gio/gresourcefile.c:655 +#, c-format +msgid "The resource at '%s' does not exist" +msgstr "「%s」的資源不存在" + +#: ../gio/gresource.c:456 +#, c-format +msgid "The resource at '%s' failed to decompress" +msgstr "「%s」的資源無法解壓縮" + +#: ../gio/gresourcefile.c:651 +#, c-format +msgid "The resource at '%s' is not a directory" +msgstr "「%s」的資源不是目錄" + +#: ../gio/gresourcefile.c:859 +msgid "Input stream doesn't implement seek" +msgstr "輸入串流尚未實作尋找" + +#: ../gio/gresource-tool.c:471 ../gio/gsettings-tool.c:525 +msgid "Print help" +msgstr "顯示求助" + +#: ../gio/gresource-tool.c:472 ../gio/gresource-tool.c:540 +msgid "[COMMAND]" +msgstr "[指令]" + +#: ../gio/gresource-tool.c:477 +msgid "List sections containing resources in an elf FILE" +msgstr "列出 elf FILE 中包含資源的節區" + +#: ../gio/gresource-tool.c:483 +msgid "" +"List resources\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources" +msgstr "" +"列出資源\n" +"如果指定 SECTION,只會列出這個節區的資源\n" +"如果指定 PATH,只會列出符合的資源" + +#: ../gio/gresource-tool.c:486 ../gio/gresource-tool.c:496 +msgid "FILE [PATH]" +msgstr "檔案 [路徑]" + +#: ../gio/gresource-tool.c:487 ../gio/gresource-tool.c:497 +#: ../gio/gresource-tool.c:504 +msgid "SECTION" +msgstr "SECTION" + +#: ../gio/gresource-tool.c:492 +msgid "" +"List resources with details\n" +"If SECTION is given, only list resources in this section\n" +"If PATH is given, only list matching resources\n" +"Details include the section, size and compression" +msgstr "" +"列出資源詳細資料\n" +"如果指定 SECTION,只會列出這個節區的資源\n" +"如果指定 PATH,只會列出符合的資源\n" +"詳細資料包含節區、大小和壓縮率" + +#: ../gio/gresource-tool.c:502 +msgid "Extract a resource file to stdout" +msgstr "解壓縮資源檔案到 stdout" + +#: ../gio/gresource-tool.c:503 +msgid "FILE PATH" +msgstr "檔案路徑" + +#: ../gio/gresource-tool.c:509 ../gio/gsettings-tool.c:605 +#, c-format +msgid "" +"Unknown command %s\n" +"\n" +msgstr "" +"不明指令 %s\n" +"\n" + +#: ../gio/gresource-tool.c:517 +msgid "" +"Usage:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" sections List resource sections\n" +" list List resources\n" +" details List resources with details\n" +" extract Extract a resource\n" +"\n" +"Use 'gresource help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gresource [--section SECTION] COMMAND [ARGS...]\n" +"\n" +"指令:\n" +" help 顯示這個資訊\n" +" sections 列出資源節區\n" +" list 列出資源\n" +" details 列出資源詳細資料\n" +" extract 解壓縮資源\n" +"\n" +"使用 'gresource help COMMAND' 以取得詳細的說明文件。\n" +"\n" + +#: ../gio/gresource-tool.c:531 +#, c-format +msgid "" +"Usage:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gresource %s%s%s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gresource-tool.c:534 ../gio/gsettings-tool.c:638 +msgid "Arguments:\n" +msgstr "引數:\n" + +#: ../gio/gresource-tool.c:538 +msgid " SECTION An (optional) elf section name\n" +msgstr " SECTION 一個 (選擇性的) elf 節區名稱\n" + +#: ../gio/gresource-tool.c:542 ../gio/gsettings-tool.c:645 +msgid " COMMAND The (optional) command to explain\n" +msgstr " COMMAND 要解釋的(選擇性)指令\n" + +#: ../gio/gresource-tool.c:548 +msgid " FILE An elf file (a binary or a shared library)\n" +msgstr " FILE 一個 elf 檔案 (二元檔或共享程式庫)\n" + +#: ../gio/gresource-tool.c:551 +msgid "" +" FILE An elf file (a binary or a shared library)\n" +" or a compiled resource file\n" +msgstr "" +" FILE 一個 elf 檔案 (二元檔或共享程式庫)\n" +" 或編譯過的資源檔案\n" + +#: ../gio/gresource-tool.c:555 +msgid "[PATH]" +msgstr "[路徑]" + +#: ../gio/gresource-tool.c:557 +msgid " PATH An (optional) resource path (may be partial)\n" +msgstr " PATH 一個 (選擇性的) 資源路徑 (可能為部分)\n" + +#: ../gio/gresource-tool.c:558 +msgid "PATH" +msgstr "路徑" + +#: ../gio/gresource-tool.c:560 +msgid " PATH A resource path\n" +msgstr " PATH 資源路徑\n" + +#: ../gio/gsettings-tool.c:53 ../gio/gsettings-tool.c:74 +#, c-format +msgid "No such schema '%s'\n" +msgstr "沒有這個 schema「%s」\n" + +#: ../gio/gsettings-tool.c:59 +#, c-format +msgid "Schema '%s' is not relocatable (path must not be specified)\n" +msgstr "Schema「%s」不是可重新配置的(路徑不能指定)\n" + +#: ../gio/gsettings-tool.c:80 +#, c-format +msgid "Schema '%s' is relocatable (path must be specified)\n" +msgstr "Schema「%s」是可重新配置的(路徑必須指定)\n" + +#: ../gio/gsettings-tool.c:94 +#, c-format +msgid "Empty path given.\n" +msgstr "指定了空白的路徑。\n" + +#: ../gio/gsettings-tool.c:100 +#, c-format +msgid "Path must begin with a slash (/)\n" +msgstr "路徑不能以斜線 (/) 開頭\n" + +#: ../gio/gsettings-tool.c:106 +#, c-format +msgid "Path must end with a slash (/)\n" +msgstr "路徑不能以斜線 (/) 結尾\n" + +#: ../gio/gsettings-tool.c:112 +#, c-format +msgid "Path must not contain two adjacent slashes (//)\n" +msgstr "路徑不能包含兩個相鄰的斜線 (//)\n" + +#: ../gio/gsettings-tool.c:133 +#, c-format +msgid "No such key '%s'\n" +msgstr "沒有設定鍵「%s」\n" + +#: ../gio/gsettings-tool.c:498 +#, c-format +msgid "The provided value is outside of the valid range\n" +msgstr "提供的數值超出了有效的範圍\n" + +#: ../gio/gsettings-tool.c:531 +msgid "List the installed (non-relocatable) schemas" +msgstr "列出已安裝的(非-可重新配置)schema" + +#: ../gio/gsettings-tool.c:537 +msgid "List the installed relocatable schemas" +msgstr "列出已安裝的可重新配置 schema" + +#: ../gio/gsettings-tool.c:543 +msgid "List the keys in SCHEMA" +msgstr "列出 SCHEMA 中的設定鍵" + +#: ../gio/gsettings-tool.c:544 ../gio/gsettings-tool.c:550 +#: ../gio/gsettings-tool.c:587 +msgid "SCHEMA[:PATH]" +msgstr "SCHEMA[:PATH]" + +#: ../gio/gsettings-tool.c:549 +msgid "List the children of SCHEMA" +msgstr "列出 SCHEMA 的子項" + +#: ../gio/gsettings-tool.c:555 +msgid "" +"List keys and values, recursively\n" +"If no SCHEMA is given, list all keys\n" +msgstr "" +"遞迴的列出設定鍵與鍵值\n" +"如果沒有指定 SCHEMA,列出所有設定鍵\n" + +#: ../gio/gsettings-tool.c:557 +msgid "[SCHEMA[:PATH]]" +msgstr "[SCHEMA[:PATH]]" + +#: ../gio/gsettings-tool.c:562 +msgid "Get the value of KEY" +msgstr "取得 KEY 的數值" + +#: ../gio/gsettings-tool.c:563 ../gio/gsettings-tool.c:569 +#: ../gio/gsettings-tool.c:581 ../gio/gsettings-tool.c:593 +msgid "SCHEMA[:PATH] KEY" +msgstr "SCHEMA[:PATH] KEY" + +#: ../gio/gsettings-tool.c:568 +msgid "Query the range of valid values for KEY" +msgstr "查詢 KEY 有效數值的範圍" + +#: ../gio/gsettings-tool.c:574 +msgid "Set the value of KEY to VALUE" +msgstr "將 KEY 的數值設定為 VALUE" + +#: ../gio/gsettings-tool.c:575 +msgid "SCHEMA[:PATH] KEY VALUE" +msgstr "SCHEMA[:PATH] KEY VALUE" + +#: ../gio/gsettings-tool.c:580 +msgid "Reset KEY to its default value" +msgstr "將 KEY 設定為預設值" + +#: ../gio/gsettings-tool.c:586 +msgid "Reset all keys in SCHEMA to their defaults" +msgstr "將 SCHEMA 的所有設定鍵重設為預設值" + +#: ../gio/gsettings-tool.c:592 +msgid "Check if KEY is writable" +msgstr "檢查 KEY 是否可寫入" + +#: ../gio/gsettings-tool.c:598 +msgid "" +"Monitor KEY for changes.\n" +"If no KEY is specified, monitor all keys in SCHEMA.\n" +"Use ^C to stop monitoring.\n" +msgstr "" +"監控 KEY 的變更。\n" +"如果沒有指定 KEY,會監控 SCHEMA 的所有設定鍵。\n" +"使用 ^C 可停止監控。\n" + +#: ../gio/gsettings-tool.c:601 +msgid "SCHEMA[:PATH] [KEY]" +msgstr "SCHEMA[:PATH] [KEY]" + +#: ../gio/gsettings-tool.c:613 +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"Commands:\n" +" help Show this information\n" +" list-schemas List installed schemas\n" +" list-relocatable-schemas List relocatable schemas\n" +" list-keys List keys in a schema\n" +" list-children List children of a schema\n" +" list-recursively List keys and values, recursively\n" +" range Queries the range of a key\n" +" get Get the value of a key\n" +" set Set the value of a key\n" +" reset Reset the value of a key\n" +" reset-recursively Reset all values in a given schema\n" +" writable Check if a key is writable\n" +" monitor Watch for changes\n" +"\n" +"Use 'gsettings help COMMAND' to get detailed help.\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" +"\n" +"指令:\n" +" help 顯示這個資訊\n" +" list-schemas 列出已安裝的 schemas\n" +" list-relocatable-schemas 列出可重新配置的 schemas\n" +" list-keys 列出 schema 中的設定鍵\n" +" list-children 列出 schema 的子項\n" +" list-recursively 遞迴列出設定鍵和數值\n" +" range 查詢設定鍵的範圍\n" +" get 取得設定鍵的數值\n" +" set 設定設定鍵的數值\n" +" reset 重設設定鍵的數值\n" +" reset-recursively 重設指定 schema 的所有數值\n" +" writable 檢查設定鍵是否可寫入\n" +" monitor 監看變更\n" +"\n" +"使用「gsettings help COMMAND」取得詳細的說明。\n" +"\n" + +#: ../gio/gsettings-tool.c:635 +#, c-format +msgid "" +"Usage:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" +msgstr "" +"用法:\n" +" gsettings [--schemadir SCHEMADIR] %s %s\n" +"\n" +"%s\n" +"\n" + +#: ../gio/gsettings-tool.c:641 +msgid " SCHEMADIR A directory to search for additional schemas\n" +msgstr " SCHEMADIR 搜尋額外 schema 的目錄\n" + +#: ../gio/gsettings-tool.c:649 +msgid "" +" SCHEMA The name of the schema\n" +" PATH The path, for relocatable schemas\n" +msgstr "" +" SCHEMA 這個 schema 的名稱\n" +" PATH 路徑,用於可重新配置的 schema\n" + +#: ../gio/gsettings-tool.c:654 +msgid " KEY The (optional) key within the schema\n" +msgstr " KEY schema 中的(選擇性的)設定鍵\n" + +#: ../gio/gsettings-tool.c:658 +msgid " KEY The key within the schema\n" +msgstr " KEY schema 中的設定鍵\n" + +#: ../gio/gsettings-tool.c:662 +msgid " VALUE The value to set\n" +msgstr " VALUE 要設定的數值\n" + +#: ../gio/gsettings-tool.c:783 +#, c-format +msgid "Empty schema name given\n" +msgstr "指定了空的 schema 名稱\n" + +#: ../gio/gsocket.c:286 +msgid "Invalid socket, not initialized" +msgstr "無效的 socket,尚未初始化" + +#: ../gio/gsocket.c:293 +#, c-format +msgid "Invalid socket, initialization failed due to: %s" +msgstr "無效的 socket,初始化失敗原因為:%s" + +#: ../gio/gsocket.c:301 +msgid "Socket is already closed" +msgstr "Socket 已經關閉" + +#: ../gio/gsocket.c:309 ../gio/gsocket.c:3529 ../gio/gsocket.c:3584 +msgid "Socket I/O timed out" +msgstr "Socket I/O 逾時" + +#: ../gio/gsocket.c:476 +#, c-format +msgid "creating GSocket from fd: %s" +msgstr "正在從 fd 建立 GSocket:%s" + +#: ../gio/gsocket.c:510 ../gio/gsocket.c:517 ../gio/gsocket.c:533 +#, c-format +msgid "Unable to create socket: %s" +msgstr "無法建立 socket:%s" + +#: ../gio/gsocket.c:510 +msgid "Unknown family was specified" +msgstr "指定了不明的字族" + +#: ../gio/gsocket.c:517 +msgid "Unknown protocol was specified" +msgstr "指定了不明的通訊協定" + +#: ../gio/gsocket.c:1722 +#, c-format +msgid "could not get local address: %s" +msgstr "無法取得本地端位址:%s" + +#: ../gio/gsocket.c:1765 +#, c-format +msgid "could not get remote address: %s" +msgstr "無法取得遠端位址:%s" + +#: ../gio/gsocket.c:1826 +#, c-format +msgid "could not listen: %s" +msgstr "無法聽取:%s" + +#: ../gio/gsocket.c:1900 +#, c-format +msgid "Error binding to address: %s" +msgstr "綁定至位址時發生錯誤:%s" + +#: ../gio/gsocket.c:1953 ../gio/gsocket.c:1989 +#, c-format +msgid "Error joining multicast group: %s" +msgstr "加入多點廣播群組時發生錯誤:%s" + +#: ../gio/gsocket.c:1954 ../gio/gsocket.c:1990 +#, c-format +msgid "Error leaving multicast group: %s" +msgstr "離開多點廣播群組時發生錯誤:%s" + +#: ../gio/gsocket.c:1955 +msgid "No support for source-specific multicast" +msgstr "不支援指定來源的多點廣播" + +#: ../gio/gsocket.c:2174 +#, c-format +msgid "Error accepting connection: %s" +msgstr "接受連線時發生錯誤:%s" + +#: ../gio/gsocket.c:2295 +msgid "Connection in progress" +msgstr "連線進行中" + +#: ../gio/gsocket.c:2347 ../gio/gsocket.c:4326 +#, c-format +msgid "Unable to get pending error: %s" +msgstr "無法取得未處理的錯誤:%s" + +#: ../gio/gsocket.c:2517 +#, c-format +msgid "Error receiving data: %s" +msgstr "接收資料時發生錯誤:%s" + +#: ../gio/gsocket.c:2695 +#, c-format +msgid "Error sending data: %s" +msgstr "傳送資料時發生錯誤:%s" + +#: ../gio/gsocket.c:2809 +#, c-format +msgid "Unable to shutdown socket: %s" +msgstr "無法關閉 socket:%s" + +#: ../gio/gsocket.c:2888 +#, c-format +msgid "Error closing socket: %s" +msgstr "關閉 socket 時發生錯誤:%s" + +#: ../gio/gsocket.c:3522 +#, c-format +msgid "Waiting for socket condition: %s" +msgstr "等候 socket 情況:%s" + +#: ../gio/gsocket.c:3800 ../gio/gsocket.c:3881 +#, c-format +msgid "Error sending message: %s" +msgstr "傳送訊息時發生錯誤:%s" + +#: ../gio/gsocket.c:3825 +msgid "GSocketControlMessage not supported on Windows" +msgstr "視窗不支援 GSocketControlMessage" + +#: ../gio/gsocket.c:4105 ../gio/gsocket.c:4241 +#, c-format +msgid "Error receiving message: %s" +msgstr "取回郵件發生錯誤:%s" + +#: ../gio/gsocket.c:4345 +msgid "g_socket_get_credentials not implemented for this OS" +msgstr "g_socket_get_credentials 沒有在這個 OS 上實作" + +#: ../gio/gsocketclient.c:174 +#, c-format +msgid "Could not connect to proxy server %s: " +msgstr "無法連線到代理伺服器 %s:" + +#: ../gio/gsocketclient.c:188 +#, c-format +msgid "Could not connect to %s: " +msgstr "無法連接到 %s:" + +#: ../gio/gsocketclient.c:190 +msgid "Could not connect: " +msgstr "無法連接:" + +#: ../gio/gsocketclient.c:976 ../gio/gsocketclient.c:1547 +msgid "Unknown error on connect" +msgstr "連線時有不明的錯誤" + +#: ../gio/gsocketclient.c:1029 ../gio/gsocketclient.c:1486 +msgid "Proxying over a non-TCP connection is not supported." +msgstr "不支援嘗試透過非-TCP 連線使用代理伺服器。" + +#: ../gio/gsocketclient.c:1055 ../gio/gsocketclient.c:1507 +#, c-format +msgid "Proxy protocol '%s' is not supported." +msgstr "指定的通訊協定「%s」不被支援。" + +#: ../gio/gsocketlistener.c:191 +msgid "Listener is already closed" +msgstr "聽取程式已經關閉" + +#: ../gio/gsocketlistener.c:232 +msgid "Added socket is closed" +msgstr "加入的 socket 已經關閉" + +#: ../gio/gsocks4aproxy.c:121 +#, c-format +msgid "SOCKSv4 does not support IPv6 address '%s'" +msgstr "SOCKSv4 不支援 IPv6 位址「%s」" + +#: ../gio/gsocks4aproxy.c:139 +msgid "Username is too long for SOCKSv4 protocol" +msgstr "使用者名稱對 SOCKSv4 通訊協定" + +#: ../gio/gsocks4aproxy.c:156 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv4 protocol" +msgstr "主機名稱「%s」對 SOCKSv4 通訊協定來說太長了" + +#: ../gio/gsocks4aproxy.c:182 +msgid "The server is not a SOCKSv4 proxy server." +msgstr "伺服器不是 SOCKSv4 代理伺服器。" + +#: ../gio/gsocks4aproxy.c:189 +msgid "Connection through SOCKSv4 server was rejected" +msgstr "透過 SOCKSv4 伺服器連線被拒絕" + +#: ../gio/gsocks5proxy.c:155 ../gio/gsocks5proxy.c:326 +#: ../gio/gsocks5proxy.c:336 +msgid "The server is not a SOCKSv5 proxy server." +msgstr "伺服器不是 SOCKSv5 代理伺服器。" + +#: ../gio/gsocks5proxy.c:169 +msgid "The SOCKSv5 proxy requires authentication." +msgstr "SOCKv5 代理伺服器要求驗證。" + +#: ../gio/gsocks5proxy.c:179 +msgid "" +"The SOCKSv5 proxy requires an authentication method that is not supported by " +"GLib." +msgstr "SOCKSv5 代理需要的驗證方式尚未被 GLib 支援。" + +#: ../gio/gsocks5proxy.c:208 +msgid "Username or password is too long for SOCKSv5 protocol." +msgstr "使用者名稱或密碼對 SOCKSv5 通訊協定來說太長了。" + +#: ../gio/gsocks5proxy.c:238 +msgid "SOCKSv5 authentication failed due to wrong username or password." +msgstr "SOCKSv5 驗證由於錯誤的使用者名稱或密碼失敗了。" + +#: ../gio/gsocks5proxy.c:288 +#, c-format +msgid "Hostname '%s' is too long for SOCKSv5 protocol" +msgstr "主機名稱「%s」對 SOCKSv5 通訊協定來說太長了" + +#: ../gio/gsocks5proxy.c:350 +msgid "The SOCKSv5 proxy server uses unknown address type." +msgstr "SOCKSv5 代理伺服器使用了不明的位址類型。" + +#: ../gio/gsocks5proxy.c:357 +msgid "Internal SOCKSv5 proxy server error." +msgstr "內部的 SOCKSv5 代理伺服器錯誤。" + +#: ../gio/gsocks5proxy.c:363 +msgid "SOCKSv5 connection not allowed by ruleset." +msgstr "SOCKSv5 連線不被規則組允許。" + +#: ../gio/gsocks5proxy.c:370 +msgid "Host unreachable through SOCKSv5 server." +msgstr "主機無法透過 SOCKSv5 代理伺服器抵達。" + +#: ../gio/gsocks5proxy.c:376 +msgid "Network unreachable through SOCKSv5 proxy." +msgstr "網路無法透過 SOCKSv5 代理伺服器抵達。" + +#: ../gio/gsocks5proxy.c:382 +msgid "Connection refused through SOCKSv5 proxy." +msgstr "透過 SOCKSv5 代理伺服器連線被拒絕。" + +#: ../gio/gsocks5proxy.c:388 +msgid "SOCKSv5 proxy does not support 'connect' command." +msgstr "SOCKSv5 代理伺服器不支援「connect」指令。" + +#: ../gio/gsocks5proxy.c:394 +msgid "SOCKSv5 proxy does not support provided address type." +msgstr "SOCKSv5 代理伺服器不支援提供的位址類型。" + +#: ../gio/gsocks5proxy.c:400 +msgid "Unknown SOCKSv5 proxy error." +msgstr "不明的 SOCKSv5 代理伺服器錯誤。" + +#: ../gio/gthemedicon.c:498 +#, c-format +msgid "Can't handle version %d of GThemedIcon encoding" +msgstr "不能處理版本為 %d 的 GThemedIcon 編碼" + +#: ../gio/gtlscertificate.c:248 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "不能解鎖 PEM 編碼的私鑰" + +#: ../gio/gtlscertificate.c:253 +msgid "No PEM-encoded private key found" +msgstr "找不到 PEM 編碼的私鑰" + +#: ../gio/gtlscertificate.c:263 +msgid "Could not parse PEM-encoded private key" +msgstr "無法解析 PEM 編碼的私鑰" + +#: ../gio/gtlscertificate.c:288 +msgid "No PEM-encoded certificate found" +msgstr "找到非 PEM 編碼的憑證" + +#: ../gio/gtlscertificate.c:297 +msgid "Could not parse PEM-encoded certificate" +msgstr "無法解析 PEM 編碼的憑證" + +#: ../gio/gtlspassword.c:114 +msgid "" +"This is the last chance to enter the password correctly before your access " +"is locked out." +msgstr "這是在您的存取被鎖定之前最後輸入密碼的機會。" + +#: ../gio/gtlspassword.c:116 +msgid "" +"Several password entered have been incorrect, and your access will be locked " +"out after further failures." +msgstr "" +"您已經輸入多入不正確的密碼,如果接下來還是輸入錯誤將會鎖定您的存取權限。" + +#: ../gio/gtlspassword.c:118 +msgid "The password entered is incorrect." +msgstr "輸入的密碼是不正確的。" + +#: ../gio/gunixconnection.c:164 ../gio/gunixconnection.c:579 +#, c-format +msgid "Expecting 1 control message, got %d" +msgstr "預期有 1 個控制訊息,卻收到 %d" + +#: ../gio/gunixconnection.c:177 ../gio/gunixconnection.c:589 +msgid "Unexpected type of ancillary data" +msgstr "輔助資料的未預期類型" + +#: ../gio/gunixconnection.c:195 +#, c-format +msgid "Expecting one fd, but got %d\n" +msgstr "預期有 1 個 fd,卻收到 %d\n" + +#: ../gio/gunixconnection.c:211 +msgid "Received invalid fd" +msgstr "收到無效的 fd" + +#: ../gio/gunixconnection.c:347 +msgid "Error sending credentials: " +msgstr "傳送憑證時發生錯誤:" + +#: ../gio/gunixconnection.c:510 +#, c-format +msgid "Error checking if SO_PASSCRED is enabled for socket: %s" +msgstr "檢查 SO_PASSCRED 在 socket 是否啟用時發生錯誤:%s" + +#: ../gio/gunixconnection.c:519 +#, c-format +msgid "" +"Unexpected option length while checking if SO_PASSCRED is enabled for " +"socket. Expected %d bytes, got %d" +msgstr "" +"檢查 SO_PASSCRED 在 socket 是否啟用時有未預期的選項長度。預期為 %d 位元組,得" +"到 %d" + +#: ../gio/gunixconnection.c:536 +#, c-format +msgid "Error enabling SO_PASSCRED: %s" +msgstr "啟用 SO_PASSCRED 時發生錯誤:%s" + +#: ../gio/gunixconnection.c:565 +msgid "" +"Expecting to read a single byte for receiving credentials but read zero bytes" +msgstr "預期接收憑證要讀取單一位元組,但讀取到零位元組" + +#: ../gio/gunixconnection.c:603 +#, c-format +msgid "Not expecting control message, but got %d" +msgstr "不是預期的控制訊息,卻收到 %d" + +#: ../gio/gunixconnection.c:629 +#, c-format +msgid "Error while disabling SO_PASSCRED: %s" +msgstr "停用 SO_PASSCRED 時發生錯誤:%s" + +#: ../gio/gunixinputstream.c:382 ../gio/gunixinputstream.c:403 +#, c-format +msgid "Error reading from file descriptor: %s" +msgstr "讀取檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixinputstream.c:438 ../gio/gunixinputstream.c:510 +#: ../gio/gunixoutputstream.c:424 ../gio/gunixoutputstream.c:465 +#, c-format +msgid "Error closing file descriptor: %s" +msgstr "關閉檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixmounts.c:1979 ../gio/gunixmounts.c:2032 +msgid "Filesystem root" +msgstr "根檔案系統" + +#: ../gio/gunixoutputstream.c:368 ../gio/gunixoutputstream.c:389 +#, c-format +msgid "Error writing to file descriptor: %s" +msgstr "寫入檔案描述狀態時發生錯誤:%s" + +#: ../gio/gunixsocketaddress.c:244 +msgid "Abstract UNIX domain socket addresses not supported on this system" +msgstr "這個系統不支授抽象 UNIX 網域 socket 位址" + +#: ../gio/gvolume.c:436 +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:512 +msgid "volume doesn't implement eject or eject_with_operation" +msgstr "儲存區尚未實作退出(eject) 或 eject_with_operation" + +#: ../gio/gwin32appinfo.c:276 +msgid "Can't find application" +msgstr "找不到應用程式" + +#: ../gio/gwin32appinfo.c:308 +#, c-format +msgid "Error launching application: %s" +msgstr "執行應用程式時發生錯誤:%s" + +#: ../gio/gwin32appinfo.c:344 +msgid "URIs not supported" +msgstr "不支援 URIs" + +#: ../gio/gwin32appinfo.c:366 +msgid "association changes not supported on win32" +msgstr "關聯變更在 win32 上不支援" + +#: ../gio/gwin32appinfo.c:378 +msgid "Association creation not supported on win32" +msgstr "關聯建立在 win32 上不支援" + +#: ../gio/gwin32inputstream.c:355 +#, c-format +msgid "Error reading from handle: %s" +msgstr "從處理器讀取時發生錯誤:%s" + +#: ../gio/gwin32inputstream.c:387 ../gio/gwin32outputstream.c:375 +#, c-format +msgid "Error closing handle: %s" +msgstr "關閉處理器時發生錯誤:%s" + +#: ../gio/gwin32outputstream.c:343 +#, c-format +msgid "Error writing to handle: %s" +msgstr "寫入至處理器時發生錯誤:%s" + +#: ../gio/gzlibcompressor.c:396 ../gio/gzlibdecompressor.c:349 +msgid "Not enough memory" +msgstr "沒有足夠的記憶體" + +#: ../gio/gzlibcompressor.c:403 ../gio/gzlibdecompressor.c:356 +#, c-format +msgid "Internal error: %s" +msgstr "內部的錯誤:%s" + +#: ../gio/gzlibcompressor.c:416 ../gio/gzlibdecompressor.c:370 +msgid "Need more input" +msgstr "需要更多輸入" + +#: ../gio/gzlibdecompressor.c:342 +msgid "Invalid compressed data" +msgstr "無效的壓縮資料" + +#: ../gio/tests/gdbus-daemon.c:18 +msgid "Address to listen on" +msgstr "監聽的位址" + +#: ../gio/tests/gdbus-daemon.c:19 +msgid "Ignored, for compat with GTestDbus" +msgstr "已忽略,用於 GTestDbus 相容性" + +#: ../gio/tests/gdbus-daemon.c:20 +msgid "Print address" +msgstr "顯示位址" + +#: ../gio/tests/gdbus-daemon.c:21 +msgid "Print address in shell mode" +msgstr "以系統殼模式顯示位址" + +#: ../gio/tests/gdbus-daemon.c:30 +msgid "Run a dbus service" +msgstr "執行 dbus 服務" + +#: ../gio/tests/gdbus-daemon.c:44 +#, c-format +msgid "Wrong args\n" +msgstr "錯誤引數\n" + +#: ../glib/gbookmarkfile.c:760 +#, c-format +msgid "Unexpected attribute '%s' for element '%s'" +msgstr "元件「%2$s」中有未預期的屬性「%1$s」" + +#: ../glib/gbookmarkfile.c:771 ../glib/gbookmarkfile.c:842 +#: ../glib/gbookmarkfile.c:852 ../glib/gbookmarkfile.c:959 +#, c-format +msgid "Attribute '%s' of element '%s' not found" +msgstr "找不到元件「%2$s」中的屬性「%1$s」" + +#: ../glib/gbookmarkfile.c:1129 ../glib/gbookmarkfile.c:1194 +#: ../glib/gbookmarkfile.c:1258 ../glib/gbookmarkfile.c:1268 +#, c-format +msgid "Unexpected tag '%s', tag '%s' expected" +msgstr "未預期的標籤「%s」,應為標籤「%s」" + +#: ../glib/gbookmarkfile.c:1154 ../glib/gbookmarkfile.c:1168 +#: ../glib/gbookmarkfile.c:1236 ../glib/gbookmarkfile.c:1288 +#, c-format +msgid "Unexpected tag '%s' inside '%s'" +msgstr "「%2$s」中有未預期的標籤「%1$s」" + +#: ../glib/gbookmarkfile.c:1798 +msgid "No valid bookmark file found in data dirs" +msgstr "在資料目錄中找不到有效的書籤檔案" + +#: ../glib/gbookmarkfile.c:1999 +#, c-format +msgid "A bookmark for URI '%s' already exists" +msgstr "URI「%s」的書籤已經存在" + +#: ../glib/gbookmarkfile.c:2045 ../glib/gbookmarkfile.c:2203 +#: ../glib/gbookmarkfile.c:2288 ../glib/gbookmarkfile.c:2368 +#: ../glib/gbookmarkfile.c:2453 ../glib/gbookmarkfile.c:2536 +#: ../glib/gbookmarkfile.c:2614 ../glib/gbookmarkfile.c:2693 +#: ../glib/gbookmarkfile.c:2735 ../glib/gbookmarkfile.c:2832 +#: ../glib/gbookmarkfile.c:2952 ../glib/gbookmarkfile.c:3142 +#: ../glib/gbookmarkfile.c:3218 ../glib/gbookmarkfile.c:3386 +#: ../glib/gbookmarkfile.c:3475 ../glib/gbookmarkfile.c:3565 +#: ../glib/gbookmarkfile.c:3693 +#, c-format +msgid "No bookmark found for URI '%s'" +msgstr "找不到 URI「%s」的書籤" + +#: ../glib/gbookmarkfile.c:2377 +#, c-format +msgid "No MIME type defined in the bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有定義 MIME 類型" + +#: ../glib/gbookmarkfile.c:2462 +#, c-format +msgid "No private flag has been defined in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有私有旗幟" + +#: ../glib/gbookmarkfile.c:2841 +#, c-format +msgid "No groups set in bookmark for URI '%s'" +msgstr "URI「%s」書籤中沒有設定群組" + +#: ../glib/gbookmarkfile.c:3239 ../glib/gbookmarkfile.c:3396 +#, c-format +msgid "No application with name '%s' registered a bookmark for '%s'" +msgstr "沒有名為「%s」的應用程式註冊書籤「%s」" + +#: ../glib/gbookmarkfile.c:3419 +#, c-format +msgid "Failed to expand exec line '%s' with URI '%s'" +msgstr "以 URI‘%2$s’ 展開 exec 行‘%1$s’失敗" + +#: ../glib/gconvert.c:803 ../glib/gutf8.c:837 ../glib/gutf8.c:1047 +#: ../glib/gutf8.c:1184 ../glib/gutf8.c:1288 +msgid "Partial character sequence at end of input" +msgstr "輸入資料結束時字元仍未完整" + +#: ../glib/gconvert.c:1053 +#, c-format +msgid "Cannot convert fallback '%s' to codeset '%s'" +msgstr "無法將後備字串‘%s’的字元集轉換成‘%s’" + +#: ../glib/gconvert.c:1870 +#, c-format +msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" +msgstr "URI‘%s’不是使用“file”格式的絕對 URI" + +#: ../glib/gconvert.c:1880 +#, c-format +msgid "The local file URI '%s' may not include a '#'" +msgstr "本機檔案的 URI‘%s’不應含有‘#’" + +#: ../glib/gconvert.c:1897 +#, c-format +msgid "The URI '%s' is invalid" +msgstr "URI‘%s’無效" + +#: ../glib/gconvert.c:1909 +#, c-format +msgid "The hostname of the URI '%s' is invalid" +msgstr "URI‘%s’中的主機名稱無效" + +#: ../glib/gconvert.c:1925 +#, c-format +msgid "The URI '%s' contains invalidly escaped characters" +msgstr "URI‘%s’含有「不正確跳出」的字元" + +#: ../glib/gconvert.c:2020 +#, c-format +msgid "The pathname '%s' is not an absolute path" +msgstr "路徑名稱‘%s’不是絕對路徑" + +#: ../glib/gconvert.c:2030 +msgid "Invalid hostname" +msgstr "主機名稱無效" + +#. Translators: 'before midday' indicator +#: ../glib/gdatetime.c:205 +msgctxt "GDateTime" +msgid "AM" +msgstr "上午" + +#. Translators: 'after midday' indicator +#: ../glib/gdatetime.c:207 +msgctxt "GDateTime" +msgid "PM" +msgstr "下午" + +#. Translators: this is the preferred format for expressing the date and the time +#: ../glib/gdatetime.c:210 +msgctxt "GDateTime" +msgid "%a %b %e %H:%M:%S %Y" +msgstr "西元%Yå¹´%m月%d日 (%A) %H時%M分%S秒" + +#. Translators: this is the preferred format for expressing the date +#: ../glib/gdatetime.c:213 +msgctxt "GDateTime" +msgid "%m/%d/%y" +msgstr "%y/%m/%d" + +#. Translators: this is the preferred format for expressing the time +#: ../glib/gdatetime.c:216 +msgctxt "GDateTime" +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#. Translators: this is the preferred format for expressing 12 hour time +#: ../glib/gdatetime.c:219 +msgctxt "GDateTime" +msgid "%I:%M:%S %p" +msgstr "%p %I時%M分%S秒" + +#: ../glib/gdatetime.c:232 +msgctxt "full month name" +msgid "January" +msgstr "一月" + +#: ../glib/gdatetime.c:234 +msgctxt "full month name" +msgid "February" +msgstr "二月" + +#: ../glib/gdatetime.c:236 +msgctxt "full month name" +msgid "March" +msgstr "三月" + +#: ../glib/gdatetime.c:238 +msgctxt "full month name" +msgid "April" +msgstr "四月" + +#: ../glib/gdatetime.c:240 +msgctxt "full month name" +msgid "May" +msgstr "五月" + +#: ../glib/gdatetime.c:242 +msgctxt "full month name" +msgid "June" +msgstr "六月" + +#: ../glib/gdatetime.c:244 +msgctxt "full month name" +msgid "July" +msgstr "七月" + +#: ../glib/gdatetime.c:246 +msgctxt "full month name" +msgid "August" +msgstr "八月" + +#: ../glib/gdatetime.c:248 +msgctxt "full month name" +msgid "September" +msgstr "九月" + +#: ../glib/gdatetime.c:250 +msgctxt "full month name" +msgid "October" +msgstr "十月" + +#: ../glib/gdatetime.c:252 +msgctxt "full month name" +msgid "November" +msgstr "十一月" + +#: ../glib/gdatetime.c:254 +msgctxt "full month name" +msgid "December" +msgstr "十二月" + +#: ../glib/gdatetime.c:269 +msgctxt "abbreviated month name" +msgid "Jan" +msgstr "一月" + +#: ../glib/gdatetime.c:271 +msgctxt "abbreviated month name" +msgid "Feb" +msgstr "二月" + +#: ../glib/gdatetime.c:273 +msgctxt "abbreviated month name" +msgid "Mar" +msgstr "三月" + +#: ../glib/gdatetime.c:275 +msgctxt "abbreviated month name" +msgid "Apr" +msgstr "四月" + +#: ../glib/gdatetime.c:277 +msgctxt "abbreviated month name" +msgid "May" +msgstr "五月" + +#: ../glib/gdatetime.c:279 +msgctxt "abbreviated month name" +msgid "Jun" +msgstr "六月" + +#: ../glib/gdatetime.c:281 +msgctxt "abbreviated month name" +msgid "Jul" +msgstr "七月" + +#: ../glib/gdatetime.c:283 +msgctxt "abbreviated month name" +msgid "Aug" +msgstr "八月" + +#: ../glib/gdatetime.c:285 +msgctxt "abbreviated month name" +msgid "Sep" +msgstr "九月" + +#: ../glib/gdatetime.c:287 +msgctxt "abbreviated month name" +msgid "Oct" +msgstr "十月" + +#: ../glib/gdatetime.c:289 +msgctxt "abbreviated month name" +msgid "Nov" +msgstr "十一月" + +#: ../glib/gdatetime.c:291 +msgctxt "abbreviated month name" +msgid "Dec" +msgstr "十二月" + +#: ../glib/gdatetime.c:306 +msgctxt "full weekday name" +msgid "Monday" +msgstr "星期一" + +#: ../glib/gdatetime.c:308 +msgctxt "full weekday name" +msgid "Tuesday" +msgstr "星期二" + +#: ../glib/gdatetime.c:310 +msgctxt "full weekday name" +msgid "Wednesday" +msgstr "星期三" + +#: ../glib/gdatetime.c:312 +msgctxt "full weekday name" +msgid "Thursday" +msgstr "星期四" + +#: ../glib/gdatetime.c:314 +msgctxt "full weekday name" +msgid "Friday" +msgstr "星期五" + +#: ../glib/gdatetime.c:316 +msgctxt "full weekday name" +msgid "Saturday" +msgstr "星期六" + +#: ../glib/gdatetime.c:318 +msgctxt "full weekday name" +msgid "Sunday" +msgstr "星期日" + +#: ../glib/gdatetime.c:333 +msgctxt "abbreviated weekday name" +msgid "Mon" +msgstr "週一" + +#: ../glib/gdatetime.c:335 +msgctxt "abbreviated weekday name" +msgid "Tue" +msgstr "週二" + +#: ../glib/gdatetime.c:337 +msgctxt "abbreviated weekday name" +msgid "Wed" +msgstr "週三" + +#: ../glib/gdatetime.c:339 +msgctxt "abbreviated weekday name" +msgid "Thu" +msgstr "週四" + +#: ../glib/gdatetime.c:341 +msgctxt "abbreviated weekday name" +msgid "Fri" +msgstr "週五" + +#: ../glib/gdatetime.c:343 +msgctxt "abbreviated weekday name" +msgid "Sat" +msgstr "週六" + +#: ../glib/gdatetime.c:345 +msgctxt "abbreviated weekday name" +msgid "Sun" +msgstr "週日" + +#: ../glib/gdir.c:121 ../glib/gdir.c:144 +#, c-format +msgid "Error opening directory '%s': %s" +msgstr "開啟目錄‘%s’時發生錯誤:%s" + +#: ../glib/gfileutils.c:671 ../glib/gfileutils.c:759 +#, c-format +msgid "Could not allocate %lu bytes to read file \"%s\"" +msgstr "無法配置 %lu 位元來讀取檔案“%s”" + +#: ../glib/gfileutils.c:686 +#, c-format +msgid "Error reading file '%s': %s" +msgstr "讀取檔案‘%s’時發生錯誤:%s" + +#: ../glib/gfileutils.c:700 +#, c-format +msgid "File \"%s\" is too large" +msgstr "檔案「%s」太過巨大" + +#: ../glib/gfileutils.c:783 +#, c-format +msgid "Failed to read from file '%s': %s" +msgstr "讀取檔案‘%s’失敗:%s" + +#: ../glib/gfileutils.c:834 ../glib/gfileutils.c:921 +#, c-format +msgid "Failed to open file '%s': %s" +msgstr "開啟檔案「%s」失敗:%s" + +#: ../glib/gfileutils.c:851 +#, c-format +msgid "Failed to get attributes of file '%s': fstat() failed: %s" +msgstr "獲取檔案‘%s’的屬性失敗:fstat() 失敗:%s" + +#: ../glib/gfileutils.c:885 +#, c-format +msgid "Failed to open file '%s': fdopen() failed: %s" +msgstr "開啟檔案‘%s’失敗:fdopen() 失敗:%s" + +#: ../glib/gfileutils.c:993 +#, c-format +msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" +msgstr "檔案名稱由‘%s’改為‘%s’失敗:g_rename() 失敗:%s" + +#: ../glib/gfileutils.c:1035 ../glib/gfileutils.c:1579 +#, c-format +msgid "Failed to create file '%s': %s" +msgstr "建立檔案‘%s’失敗:%s" + +#: ../glib/gfileutils.c:1049 +#, c-format +msgid "Failed to open file '%s' for writing: fdopen() failed: %s" +msgstr "開啟檔案‘%s’作寫入失敗:fdopen() 失敗:%s" + +#: ../glib/gfileutils.c:1074 +#, c-format +msgid "Failed to write file '%s': fwrite() failed: %s" +msgstr "寫入檔案‘%s’失敗:fwrite() 失敗:%s" + +#: ../glib/gfileutils.c:1093 +#, c-format +msgid "Failed to write file '%s': fflush() failed: %s" +msgstr "無法寫入檔案「%s」:fflush() 失敗:%s" + +#: ../glib/gfileutils.c:1137 +#, c-format +msgid "Failed to write file '%s': fsync() failed: %s" +msgstr "無法寫入檔案「%s」:fsync() 失敗:%s" + +#: ../glib/gfileutils.c:1161 +#, c-format +msgid "Failed to close file '%s': fclose() failed: %s" +msgstr "關閉檔案‘%s’失敗:fclose() 失敗:%s" + +#: ../glib/gfileutils.c:1282 +#, c-format +msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" +msgstr "現存檔案‘%s’無法移除:g_unlink() 失敗:%s" + +#: ../glib/gfileutils.c:1542 +#, 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:1555 +#, c-format +msgid "Template '%s' doesn't contain XXXXXX" +msgstr "檔案樣式‘%s’沒有包含 XXXXXX" + +#: ../glib/gfileutils.c:2083 +#, c-format +msgid "Failed to read the symbolic link '%s': %s" +msgstr "讀取符號連結‘%s’失敗:%s" + +#: ../glib/gfileutils.c:2104 +msgid "Symbolic links not supported" +msgstr "不支援符號連結" + +#: ../glib/giochannel.c:1415 +#, c-format +msgid "Could not open converter from '%s' to '%s': %s" +msgstr "無法開啟將‘%s’轉換至‘%s’的轉換器:%s" + +#: ../glib/giochannel.c:1760 +msgid "Can't do a raw read in g_io_channel_read_line_string" +msgstr "在 g_io_channel_read_line_string 中無法讀取原始資料" + +#: ../glib/giochannel.c:1807 ../glib/giochannel.c:2064 +#: ../glib/giochannel.c:2151 +msgid "Leftover unconverted data in read buffer" +msgstr "用來讀取資料的緩衝區中仍有未轉換的資料" + +#: ../glib/giochannel.c:1888 ../glib/giochannel.c:1965 +msgid "Channel terminates in a partial character" +msgstr "在字元未完整之前,輸入管道已經結束" + +#: ../glib/giochannel.c:1951 +msgid "Can't do a raw read in g_io_channel_read_to_end" +msgstr "g_io_channel_read_to_end 中無法讀取原始資料" + +#: ../glib/gkeyfile.c:720 +msgid "Valid key file could not be found in search dirs" +msgstr "在資料目錄中找不到有效的設定鍵檔案" + +#: ../glib/gkeyfile.c:756 +msgid "Not a regular file" +msgstr "不是正規的檔案" + +#: ../glib/gkeyfile.c:1156 +#, c-format +msgid "" +"Key file contains line '%s' which is not a key-value pair, group, or comment" +msgstr "設定鍵檔案中‘%s’行並非設定鍵值配對、群組或註解" + +#: ../glib/gkeyfile.c:1213 +#, c-format +msgid "Invalid group name: %s" +msgstr "無效的群組名稱:%s" + +#: ../glib/gkeyfile.c:1235 +msgid "Key file does not start with a group" +msgstr "設定鍵檔案並非以群組開頭" + +#: ../glib/gkeyfile.c:1261 +#, c-format +msgid "Invalid key name: %s" +msgstr "無效的設定鍵名稱:%s" + +#: ../glib/gkeyfile.c:1288 +#, c-format +msgid "Key file contains unsupported encoding '%s'" +msgstr "設定鍵檔案包含不支援的編碼‘%s’" + +#: ../glib/gkeyfile.c:1531 ../glib/gkeyfile.c:1693 ../glib/gkeyfile.c:3071 +#: ../glib/gkeyfile.c:3137 ../glib/gkeyfile.c:3263 ../glib/gkeyfile.c:3396 +#: ../glib/gkeyfile.c:3538 ../glib/gkeyfile.c:3768 ../glib/gkeyfile.c:3835 +#, c-format +msgid "Key file does not have group '%s'" +msgstr "設定鍵檔案沒有群組‘%s’" + +#: ../glib/gkeyfile.c:1705 +#, c-format +msgid "Key file does not have key '%s'" +msgstr "設定鍵檔案沒有設定鍵‘%s’" + +#: ../glib/gkeyfile.c:1812 ../glib/gkeyfile.c:1928 +#, c-format +msgid "Key file contains key '%s' with value '%s' which is not UTF-8" +msgstr "設定鍵檔案包含的設定鍵‘%s’(數值為‘%s’)並非 UTF-8" + +#: ../glib/gkeyfile.c:1832 ../glib/gkeyfile.c:1948 ../glib/gkeyfile.c:2317 +#, c-format +msgid "" +"Key file contains key '%s' which has a value that cannot be interpreted." +msgstr "設定鍵檔案包含的設定鍵「%s」的數值無法解譯。" + +#: ../glib/gkeyfile.c:2534 ../glib/gkeyfile.c:2900 +#, c-format +msgid "" +"Key file contains key '%s' in group '%s' which has a value that cannot be " +"interpreted." +msgstr "設定鍵檔案包含的群組「%2$s」中設定鍵「%1$s」數值無法解譯。" + +#: ../glib/gkeyfile.c:2612 ../glib/gkeyfile.c:2688 +#, c-format +msgid "Key '%s' in group '%s' has value '%s' where %s was expected" +msgstr "群組「%2$s」中設定鍵「%1$s」包含數值「%3$s」,但預期為「%4$s」" + +#: ../glib/gkeyfile.c:3086 ../glib/gkeyfile.c:3278 ../glib/gkeyfile.c:3846 +#, c-format +msgid "Key file does not have key '%s' in group '%s'" +msgstr "設定鍵檔案的群組‘%2$s’中沒有設定鍵‘%1$s’" + +#: ../glib/gkeyfile.c:4078 +msgid "Key file contains escape character at end of line" +msgstr "設定鍵檔案在行尾包含跳出字元" + +#: ../glib/gkeyfile.c:4100 +#, c-format +msgid "Key file contains invalid escape sequence '%s'" +msgstr "設定鍵檔案含有不正確的「跳出字元」‘%s’" + +#: ../glib/gkeyfile.c:4242 +#, c-format +msgid "Value '%s' cannot be interpreted as a number." +msgstr "數值‘%s’不能被解譯為數字。" + +#: ../glib/gkeyfile.c:4256 +#, c-format +msgid "Integer value '%s' out of range" +msgstr "整數值‘%s’超出範圍" + +#: ../glib/gkeyfile.c:4289 +#, c-format +msgid "Value '%s' cannot be interpreted as a float number." +msgstr "數值‘%s’不能被解譯為浮點數。" + +#: ../glib/gkeyfile.c:4313 +#, c-format +msgid "Value '%s' cannot be interpreted as a boolean." +msgstr "數值‘%s’不能被解譯為邏輯值。" + +#: ../glib/gmappedfile.c:128 +#, c-format +msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" +msgstr "獲取檔案 「%s%s%s%s」的屬性失敗:fstat() 失敗:%s" + +#: ../glib/gmappedfile.c:194 +#, c-format +msgid "Failed to map %s%s%s%s: mmap() failed: %s" +msgstr "對應檔案 %s%s%s%s 失敗:mmap() 失敗:%s" + +#: ../glib/gmappedfile.c:260 +#, c-format +msgid "Failed to open file '%s': open() failed: %s" +msgstr "開啟檔案‘%s’失敗:open() 失敗:%s" + +#: ../glib/gmarkup.c:353 ../glib/gmarkup.c:394 +#, c-format +msgid "Error on line %d char %d: " +msgstr "第 %d 列第 %d 個字發生錯誤:" + +#: ../glib/gmarkup.c:416 ../glib/gmarkup.c:499 +#, c-format +msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgstr "名稱中無效的 UTF-8 編碼文字 - 不是合法的「%s」" + +#: ../glib/gmarkup.c:427 +#, c-format +msgid "'%s' is not a valid name " +msgstr "「%s」不是一個有效的名稱" + +#: ../glib/gmarkup.c:443 +#, c-format +msgid "'%s' is not a valid name: '%c' " +msgstr "「%s」不是一個有效的名稱:「%c」" + +#: ../glib/gmarkup.c:552 +#, c-format +msgid "Error on line %d: %s" +msgstr "第 %d 列發生錯誤:%s" + +#: ../glib/gmarkup.c:636 +#, 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:648 +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:674 +#, c-format +msgid "Character reference '%-.*s' does not encode a permitted character" +msgstr "字元參引‘%-.*s’無法表示任何能接受的字元" + +#: ../glib/gmarkup.c:712 +msgid "" +"Empty entity '&;' seen; valid entities are: & " < > '" +msgstr "出現空白的實體‘&;’;可用的實體為:& " < > '" + +#: ../glib/gmarkup.c:720 +#, c-format +msgid "Entity name '%-.*s' is not known" +msgstr "實體名稱 '%-.*s' 意義不明" + +#: ../glib/gmarkup.c:725 +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:1073 +msgid "Document must begin with an element (e.g. )" +msgstr "文件開始必須為一元素(例如 )" + +#: ../glib/gmarkup.c:1113 +#, c-format +msgid "" +"'%s' is not a valid character following a '<' character; it may not begin an " +"element name" +msgstr "‘<’字元後的‘%s’不是有效的字元;這樣不可能是元素名稱的開始部份" + +#: ../glib/gmarkup.c:1181 +#, c-format +msgid "" +"Odd character '%s', expected a '>' character to end the empty-element tag " +"'%s'" +msgstr "字元「%s」只有一半,空元素標籤「%s」的結尾應該以‘>’字元結束" + +#: ../glib/gmarkup.c:1265 +#, c-format +msgid "" +"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +msgstr "不尋常的字元‘%s’,屬性名稱‘%s’(屬於元素‘%s’)後應該是‘=’字元" + +#: ../glib/gmarkup.c:1306 +#, 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:1350 +#, 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:1483 +#, c-format +msgid "" +"'%s' is not a valid character following the characters ''" +msgstr "字元‘%s’是無效的(位置在關閉元素‘%s’末端);允許的字元為「>」" + +#: ../glib/gmarkup.c:1530 +#, c-format +msgid "Element '%s' was closed, no element is currently open" +msgstr "元素‘%s’已關閉,沒有開啟中的元素" + +#: ../glib/gmarkup.c:1539 +#, c-format +msgid "Element '%s' was closed, but the currently open element is '%s'" +msgstr "元素‘%s’已關閉,但開啟中的元素是‘%s’" + +#: ../glib/gmarkup.c:1707 +msgid "Document was empty or contained only whitespace" +msgstr "文件完全空白或只含有空白字元" + +#: ../glib/gmarkup.c:1721 +msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgstr "文件在尖角括號‘<’後突然終止" + +#: ../glib/gmarkup.c:1729 ../glib/gmarkup.c:1774 +#, c-format +msgid "" +"Document ended unexpectedly with elements still open - '%s' was the last " +"element opened" +msgstr "在仍然有開啟中的元素時,文件突然結束 ─‘%s’是最後一個開啟的元素" + +#: ../glib/gmarkup.c:1737 +#, c-format +msgid "" +"Document ended unexpectedly, expected to see a close angle bracket ending " +"the tag <%s/>" +msgstr "文件突然結束,本來應該出現用來關閉標籤 <%s/> 的尖角括號" + +#: ../glib/gmarkup.c:1743 +msgid "Document ended unexpectedly inside an element name" +msgstr "在元素的名稱內,文件突然結束" + +#: ../glib/gmarkup.c:1749 +msgid "Document ended unexpectedly inside an attribute name" +msgstr "在屬性名稱內,文件突然結束" + +#: ../glib/gmarkup.c:1754 +msgid "Document ended unexpectedly inside an element-opening tag." +msgstr "在元素的開啟標籤內,文件突然結束" + +#: ../glib/gmarkup.c:1760 +msgid "" +"Document ended unexpectedly after the equals sign following an attribute " +"name; no attribute value" +msgstr "在屬性名稱的等號後,文件突然結束;沒有屬性值" + +#: ../glib/gmarkup.c:1767 +msgid "Document ended unexpectedly while inside an attribute value" +msgstr "在屬性值內,文件突然結束" + +#: ../glib/gmarkup.c:1783 +#, c-format +msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgstr "在元素‘%s’的關閉標籤內,文件突然結束" + +#: ../glib/gmarkup.c:1789 +msgid "Document ended unexpectedly inside a comment or processing instruction" +msgstr "在註解或處理指示內,文件突然結束" + +#: ../glib/goption.c:742 +msgid "Usage:" +msgstr "用法:" + +#: ../glib/goption.c:742 +msgid "[OPTION...]" +msgstr "[選項…]" + +#: ../glib/goption.c:848 +msgid "Help Options:" +msgstr "說明選項:" + +#: ../glib/goption.c:849 +msgid "Show help options" +msgstr "顯示說明的選項" + +#: ../glib/goption.c:855 +msgid "Show all help options" +msgstr "顯示所有的說明選項" + +#: ../glib/goption.c:917 +msgid "Application Options:" +msgstr "應用程式選項:" + +#: ../glib/goption.c:979 ../glib/goption.c:1049 +#, c-format +msgid "Cannot parse integer value '%s' for %s" +msgstr "無法給 %2$s 解析整數值‘%1$s’" + +#: ../glib/goption.c:989 ../glib/goption.c:1057 +#, c-format +msgid "Integer value '%s' for %s out of range" +msgstr "%2$s 的整數值‘%1$s’超出範圍" + +#: ../glib/goption.c:1014 +#, c-format +msgid "Cannot parse double value '%s' for %s" +msgstr "無法給 %2$s 解析雙精度浮點數‘%1$s’" + +#: ../glib/goption.c:1022 +#, c-format +msgid "Double value '%s' for %s out of range" +msgstr "%2$s 的雙精度浮點數‘%1$s’超出範圍" + +#: ../glib/goption.c:1285 ../glib/goption.c:1364 +#, c-format +msgid "Error parsing option %s" +msgstr "解析 %s 選項時發生錯誤" + +#: ../glib/goption.c:1395 ../glib/goption.c:1508 +#, c-format +msgid "Missing argument for %s" +msgstr "缺少 %s 的參數" + +#: ../glib/goption.c:1961 +#, c-format +msgid "Unknown option %s" +msgstr "不明的選項 %s" + +#: ../glib/gregex.c:257 +msgid "corrupted object" +msgstr "損毀的物件" + +#: ../glib/gregex.c:259 +msgid "internal error or corrupted object" +msgstr "內部錯誤或損毀的物件" + +#: ../glib/gregex.c:261 +msgid "out of memory" +msgstr "記憶體耗盡" + +#: ../glib/gregex.c:266 +msgid "backtracking limit reached" +msgstr "已達回溯上限" + +#: ../glib/gregex.c:278 ../glib/gregex.c:286 +msgid "the pattern contains items not supported for partial matching" +msgstr "此模式包含了不支援部分比對的項目" + +#: ../glib/gregex.c:288 +msgid "back references as conditions are not supported for partial matching" +msgstr "部分比對不支援以反向參照為條件" + +#: ../glib/gregex.c:297 +msgid "recursion limit reached" +msgstr "已達遞廻上限" + +#: ../glib/gregex.c:299 +msgid "invalid combination of newline flags" +msgstr "無效的換列旗標組合" + +#: ../glib/gregex.c:301 +msgid "bad offset" +msgstr "錯誤的偏移" + +#: ../glib/gregex.c:303 +msgid "short utf8" +msgstr "短式 utf8" + +#: ../glib/gregex.c:305 +msgid "recursion loop" +msgstr "循環廻圈" + +#: ../glib/gregex.c:309 +msgid "unknown error" +msgstr "不明的錯誤" + +#: ../glib/gregex.c:329 +msgid "\\ at end of pattern" +msgstr "\\ 於模式結尾" + +#: ../glib/gregex.c:332 +msgid "\\c at end of pattern" +msgstr "\\c 於模式結尾" + +#: ../glib/gregex.c:335 +msgid "unrecognized character following \\" +msgstr "無法辨識的字元接著 \\" + +#: ../glib/gregex.c:338 +msgid "numbers out of order in {} quantifier" +msgstr "{} 裡的數字次序顛倒了" + +#: ../glib/gregex.c:341 +msgid "number too big in {} quantifier" +msgstr "{} 裡的數字太大了" + +#: ../glib/gregex.c:344 +msgid "missing terminating ] for character class" +msgstr "字元類別缺少結束的 ]" + +#: ../glib/gregex.c:347 +msgid "invalid escape sequence in character class" +msgstr "字元類別中無效的跳脫序列" + +#: ../glib/gregex.c:350 +msgid "range out of order in character class" +msgstr "字元類別的範圍次序顛倒" + +#: ../glib/gregex.c:353 +msgid "nothing to repeat" +msgstr "沒有東西可重複" + +#: ../glib/gregex.c:357 +msgid "unexpected repeat" +msgstr "未預期的重複" + +#: ../glib/gregex.c:360 +msgid "unrecognized character after (? or (?-" +msgstr "在 (? 或 (?- 後無法辨識的字元" + +#: ../glib/gregex.c:363 +msgid "POSIX named classes are supported only within a class" +msgstr "POSIX 命名類別只在單一類別中支援" + +#: ../glib/gregex.c:366 +msgid "missing terminating )" +msgstr "缺少結束的 )" + +#: ../glib/gregex.c:369 +msgid "reference to non-existent subpattern" +msgstr "參照不存在的子模式" + +#: ../glib/gregex.c:372 +msgid "missing ) after comment" +msgstr "註解後缺少 )" + +#: ../glib/gregex.c:375 +msgid "regular expression is too large" +msgstr "正規表示式太大" + +#: ../glib/gregex.c:378 +msgid "failed to get memory" +msgstr "取得記憶體失敗" + +#: ../glib/gregex.c:382 +msgid ") without opening (" +msgstr ") 沒有開頭的 (" + +#: ../glib/gregex.c:386 +msgid "code overflow" +msgstr "程式碼溢流" + +#: ../glib/gregex.c:390 +msgid "unrecognized character after (?<" +msgstr "在 (?< 後有無法辨識的字元" + +#: ../glib/gregex.c:393 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind 判斷提示(assertion) 不是固定的長度" + +#: ../glib/gregex.c:396 +msgid "malformed number or name after (?(" +msgstr "(?( 之後有格式不正確的數字或名稱" + +#: ../glib/gregex.c:399 +msgid "conditional group contains more than two branches" +msgstr "條件式群組包含了兩個以上的分支" + +#: ../glib/gregex.c:402 +msgid "assertion expected after (?(" +msgstr "(?( 後應該有判斷提示(assertion)" + +#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) +#. * sequences here, '(?-54' would be an example for the second group. +#. +#: ../glib/gregex.c:409 +msgid "(?R or (?[+-]digits must be followed by )" +msgstr "(?R 或 (?[+-]數字必須接著 )" + +#: ../glib/gregex.c:412 +msgid "unknown POSIX class name" +msgstr "不明的 POSIX 類別名稱" + +#: ../glib/gregex.c:415 +msgid "POSIX collating elements are not supported" +msgstr "不支援 POSIX 整理元件" + +#: ../glib/gregex.c:418 +msgid "character value in \\x{...} sequence is too large" +msgstr "\\x{…} 序列中的字元值太大" + +#: ../glib/gregex.c:421 +msgid "invalid condition (?(0)" +msgstr "無效的條件 (?(0)" + +#: ../glib/gregex.c:424 +msgid "\\C not allowed in lookbehind assertion" +msgstr "在 lookbehind 判斷提示(assertion) 中不支援\\C" + +#: ../glib/gregex.c:431 +msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +msgstr "escapes \\L, \\l, \\N{name}, \\U, 和 \\u 不支援" + +#: ../glib/gregex.c:434 +msgid "recursive call could loop indefinitely" +msgstr "遞廻呼叫可能變成無限廻圈" + +#: ../glib/gregex.c:438 +msgid "unrecognized character after (?P" +msgstr "在 (?P 後有無法辨識的字元" + +#: ../glib/gregex.c:441 +msgid "missing terminator in subpattern name" +msgstr "子模式名稱中缺少結束字元" + +#: ../glib/gregex.c:444 +msgid "two named subpatterns have the same name" +msgstr "兩個命名的子模式具有相同的名稱" + +#: ../glib/gregex.c:447 +msgid "malformed \\P or \\p sequence" +msgstr "格式不正確的 \\P 或 \\p 序列" + +#: ../glib/gregex.c:450 +msgid "unknown property name after \\P or \\p" +msgstr "在 \\P 或 \\p 後有不明的屬性名稱" + +#: ../glib/gregex.c:453 +msgid "subpattern name is too long (maximum 32 characters)" +msgstr "子模式名稱太長(最多 32 字元)" + +#: ../glib/gregex.c:456 +msgid "too many named subpatterns (maximum 10,000)" +msgstr "太多命名的子模式(最大值 10,000)" + +#: ../glib/gregex.c:459 +msgid "octal value is greater than \\377" +msgstr "8 進位值大於 \\377" + +#: ../glib/gregex.c:463 +msgid "overran compiling workspace" +msgstr "編譯工作區超出範圍" + +#: ../glib/gregex.c:467 +msgid "previously-checked referenced subpattern not found" +msgstr "找不到預先核取的參照子字串" + +#: ../glib/gregex.c:470 +msgid "DEFINE group contains more than one branch" +msgstr "DEFINE 群組包含一個以上的分支" + +#: ../glib/gregex.c:473 +msgid "inconsistent NEWLINE options" +msgstr "不一致的 NEWLINE 選項" + +#: ../glib/gregex.c:476 +msgid "" +"\\g is not followed by a braced, angle-bracketed, or quoted name or number, " +"or by a plain number" +msgstr "\\g 並未隨著具有大括弧、角括弧或引號的名稱或數字或純文字數字" + +#: ../glib/gregex.c:480 +msgid "a numbered reference must not be zero" +msgstr "編號式參照必須不為零" + +#: ../glib/gregex.c:483 +msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" +msgstr "引數不允許用於 (*ACCEPT)、(*FAIL) 或 (*COMMIT)" + +#: ../glib/gregex.c:486 +msgid "(*VERB) not recognized" +msgstr "(*VERB) 無法辨識" + +#: ../glib/gregex.c:489 +msgid "number is too big" +msgstr "數字太大" + +#: ../glib/gregex.c:492 +msgid "missing subpattern name after (?&" +msgstr "(?& 後缺少子樣式" + +#: ../glib/gregex.c:495 +msgid "digit expected after (?+" +msgstr "(?+ 後應該有數字" + +#: ../glib/gregex.c:498 +msgid "] is an invalid data character in JavaScript compatibility mode" +msgstr "] 在 JavaScript 相容性模式中是無效的資料字元" + +#: ../glib/gregex.c:501 +msgid "different names for subpatterns of the same number are not allowed" +msgstr "不允許同樣編號的子樣式有不同的名稱" + +#: ../glib/gregex.c:504 +msgid "(*MARK) must have an argument" +msgstr "(*MARK) 需要一個引數" + +#: ../glib/gregex.c:507 +msgid "\\c must be followed by an ASCII character" +msgstr "\\c 必須接著 ASCII 字元" + +#: ../glib/gregex.c:510 +msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" +msgstr "\\k 並未隨著具有大括弧、角括弧或引號的名稱" + +#: ../glib/gregex.c:513 +msgid "\\N is not supported in a class" +msgstr "\\N 在類別中不支援" + +#: ../glib/gregex.c:516 +msgid "too many forward references" +msgstr "有太多的向前參照" + +#: ../glib/gregex.c:519 +msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" +msgstr "名稱在 (*MARK)、(*PRUNE)、(*SKIP) 或 (*THEN)" + +#: ../glib/gregex.c:522 +msgid "character value in \\u.... sequence is too large" +msgstr "\\u.... 序列中的字元值太大" + +#: ../glib/gregex.c:745 ../glib/gregex.c:1899 +#, c-format +msgid "Error while matching regular expression %s: %s" +msgstr "比對正規表示式 %s 發生錯誤:%s" + +#: ../glib/gregex.c:1319 +msgid "PCRE library is compiled without UTF8 support" +msgstr "PCRE 程式庫並未編譯對 UTF8 的支援" + +#: ../glib/gregex.c:1323 +msgid "PCRE library is compiled without UTF8 properties support" +msgstr "PCRE 程式庫並未編譯對 UTF8 屬性的支援" + +#: ../glib/gregex.c:1331 +msgid "PCRE library is compiled with incompatible options" +msgstr "PCRE 程式庫並未編譯不相容的選項" + +#: ../glib/gregex.c:1390 +#, c-format +msgid "Error while compiling regular expression %s at char %d: %s" +msgstr "編譯正規表示式 %s 時於第 %d 個字發生錯誤:%s" + +#: ../glib/gregex.c:1432 +#, c-format +msgid "Error while optimizing regular expression %s: %s" +msgstr "最佳化正規表示式 %s 時發生錯誤:%s" + +#: ../glib/gregex.c:2331 +msgid "hexadecimal digit or '}' expected" +msgstr "應為 16 進位數字或「}」" + +#: ../glib/gregex.c:2347 +msgid "hexadecimal digit expected" +msgstr "應為 16 進位數字" + +#: ../glib/gregex.c:2387 +msgid "missing '<' in symbolic reference" +msgstr "在符號參照中缺少「<」" + +#: ../glib/gregex.c:2396 +msgid "unfinished symbolic reference" +msgstr "未完成的符號參照" + +#: ../glib/gregex.c:2403 +msgid "zero-length symbolic reference" +msgstr "零-長度的符號參照" + +#: ../glib/gregex.c:2414 +msgid "digit expected" +msgstr "預期數字" + +#: ../glib/gregex.c:2432 +msgid "illegal symbolic reference" +msgstr "不合法的符號參照" + +#: ../glib/gregex.c:2494 +msgid "stray final '\\'" +msgstr "缺少最後的「\\」" + +#: ../glib/gregex.c:2498 +msgid "unknown escape sequence" +msgstr "不明的跳脫序列" + +#: ../glib/gregex.c:2508 +#, c-format +msgid "Error while parsing replacement text \"%s\" at char %lu: %s" +msgstr "當解析於字元 %2$lu 的取代文字「%1$s」時發生錯誤:%3$s" + +#: ../glib/gshell.c:88 +msgid "Quoted text doesn't begin with a quotation mark" +msgstr "應該用引號括起來的文字不是以括號為開始" + +#: ../glib/gshell.c:178 +msgid "Unmatched quotation mark in command line or other shell-quoted text" +msgstr "指令列或其它標為指令的字串內有不對稱的引號" + +#: ../glib/gshell.c:574 +#, c-format +msgid "Text ended just after a '\\' character. (The text was '%s')" +msgstr "文字在‘\\’字元後就終止了。(文字為‘%s’)" + +#: ../glib/gshell.c:581 +#, c-format +msgid "Text ended before matching quote was found for %c. (The text was '%s')" +msgstr "字串完結前仍沒有對應於 %c 的引號(字串為‘%s’)" + +#: ../glib/gshell.c:593 +msgid "Text was empty (or contained only whitespace)" +msgstr "文字是空白的(或只含有空白字元)" + +#: ../glib/gspawn.c:208 +#, c-format +msgid "Failed to read data from child process (%s)" +msgstr "無法從副進程讀取資料 (%s)" + +#: ../glib/gspawn.c:351 +#, c-format +msgid "Unexpected error in select() reading data from a child process (%s)" +msgstr "當 select() 從子程序讀取資料時發生未預期的錯誤 (%s)" + +#: ../glib/gspawn.c:436 +#, c-format +msgid "Unexpected error in waitpid() (%s)" +msgstr "waitpid() 發生未預期的錯誤 (%s)" + +#: ../glib/gspawn.c:855 ../glib/gspawn-win32.c:1231 +#, c-format +msgid "Child process exited with code %ld" +msgstr "子程序以代碼 %ld 結束" + +#: ../glib/gspawn.c:863 +#, c-format +msgid "Child process killed by signal %ld" +msgstr "子程序被信號 %ld 中止" + +#: ../glib/gspawn.c:870 +#, c-format +msgid "Child process stopped by signal %ld" +msgstr "子程序被信號 %ld 停止" + +#: ../glib/gspawn.c:877 +#, c-format +msgid "Child process exited abnormally" +msgstr "子程序異常結束" + +#: ../glib/gspawn.c:1282 ../glib/gspawn-win32.c:336 ../glib/gspawn-win32.c:344 +#, c-format +msgid "Failed to read from child pipe (%s)" +msgstr "無法從管道讀取資料 (%s)" + +#: ../glib/gspawn.c:1350 +#, c-format +msgid "Failed to fork (%s)" +msgstr "無法衍生進程 (%s)" + +#: ../glib/gspawn.c:1498 ../glib/gspawn-win32.c:367 +#, c-format +msgid "Failed to change to directory '%s' (%s)" +msgstr "無法進入目錄‘%s’(%s)" + +#: ../glib/gspawn.c:1508 +#, c-format +msgid "Failed to execute child process \"%s\" (%s)" +msgstr "無法執行副進程“%s”(%s)" + +#: ../glib/gspawn.c:1518 +#, c-format +msgid "Failed to redirect output or input of child process (%s)" +msgstr "無法將副進程的輸出或輸入重新導向 (%s)" + +#: ../glib/gspawn.c:1527 +#, c-format +msgid "Failed to fork child process (%s)" +msgstr "無法衍生副進程 (%s)" + +#: ../glib/gspawn.c:1535 +#, c-format +msgid "Unknown error executing child process \"%s\"" +msgstr "執行副進程“%s”時發生不明的錯誤" + +#: ../glib/gspawn.c:1559 +#, c-format +msgid "Failed to read enough data from child pid pipe (%s)" +msgstr "無法從 child pid pipe 讀取足夠的資料 (%s)" + +#: ../glib/gspawn.c:1632 ../glib/gspawn-win32.c:297 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "無法建立管道來和副進程溝通 (%s)" + +#: ../glib/gspawn-win32.c:280 +msgid "Failed to read data from child process" +msgstr "無法從副進程讀取資料" + +#: ../glib/gspawn-win32.c:373 ../glib/gspawn-win32.c:492 +#, c-format +msgid "Failed to execute child process (%s)" +msgstr "無法執行副進程 (%s)" + +#: ../glib/gspawn-win32.c:442 +#, c-format +msgid "Invalid program name: %s" +msgstr "程式名稱無效:%s" + +#: ../glib/gspawn-win32.c:452 ../glib/gspawn-win32.c:720 +#: ../glib/gspawn-win32.c:1295 +#, c-format +msgid "Invalid string in argument vector at %d: %s" +msgstr "第 %d 個引數中含無效的字串:%s" + +#: ../glib/gspawn-win32.c:463 ../glib/gspawn-win32.c:735 +#: ../glib/gspawn-win32.c:1328 +#, c-format +msgid "Invalid string in environment: %s" +msgstr "環境變數中的字串無效:%s" + +#: ../glib/gspawn-win32.c:716 ../glib/gspawn-win32.c:1276 +#, c-format +msgid "Invalid working directory: %s" +msgstr "無效的工作目錄:%s" + +#: ../glib/gspawn-win32.c:781 +#, c-format +msgid "Failed to execute helper program (%s)" +msgstr "無法執行協助程式 (%s)" + +#: ../glib/gspawn-win32.c:995 +msgid "" +"Unexpected error in g_io_channel_win32_poll() reading data from a child " +"process" +msgstr "當 g_io_channel_win32_poll() 從副進程讀取資料時發生無法預計的錯誤" + +#: ../glib/gutf8.c:915 +msgid "Character out of range for UTF-8" +msgstr "字元不在 UTF-8 範圍之內" + +#: ../glib/gutf8.c:1015 ../glib/gutf8.c:1024 ../glib/gutf8.c:1154 +#: ../glib/gutf8.c:1163 ../glib/gutf8.c:1302 ../glib/gutf8.c:1398 +msgid "Invalid sequence in conversion input" +msgstr "轉換輸入資料時出現無效的字元次序" + +#: ../glib/gutf8.c:1313 ../glib/gutf8.c:1409 +msgid "Character out of range for UTF-16" +msgstr "字元不在 UTF-16 範圍之內" + +#: ../glib/gutils.c:2184 ../glib/gutils.c:2211 ../glib/gutils.c:2315 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u 位元組" + +#: ../glib/gutils.c:2190 +#, c-format +msgid "%.1f KiB" +msgstr "%.1f KiB" + +#: ../glib/gutils.c:2192 +#, c-format +msgid "%.1f MiB" +msgstr "%.1f MiB" + +#: ../glib/gutils.c:2195 +#, c-format +msgid "%.1f GiB" +msgstr "%.1f GiB" + +#: ../glib/gutils.c:2198 +#, c-format +msgid "%.1f TiB" +msgstr "%.1f TiB" + +#: ../glib/gutils.c:2201 +#, c-format +msgid "%.1f PiB" +msgstr "%.1f PiB" + +#: ../glib/gutils.c:2204 +#, c-format +msgid "%.1f EiB" +msgstr "%.1f EiB" + +#: ../glib/gutils.c:2217 +#, c-format +msgid "%.1f kB" +msgstr "%.1f kB" + +#: ../glib/gutils.c:2220 ../glib/gutils.c:2328 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" + +#: ../glib/gutils.c:2223 ../glib/gutils.c:2333 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" + +#: ../glib/gutils.c:2225 ../glib/gutils.c:2338 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" + +#: ../glib/gutils.c:2228 ../glib/gutils.c:2343 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" + +#: ../glib/gutils.c:2231 ../glib/gutils.c:2348 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" + +#. Translators: the %s in "%s bytes" will always be replaced by a number. +#: ../glib/gutils.c:2268 +#, c-format +msgid "%s byte" +msgid_plural "%s bytes" +msgstr[0] "%s 位元組" + +#: ../glib/gutils.c:2323 +#, c-format +msgid "%.1f KB" +msgstr "%.1f KB" + +#~ msgid "Abnormal program termination spawning command line `%s': %s" +#~ msgstr "不正常的程式中止產生命令列「%s」:%s" + +#~ msgid "Command line `%s' exited with non-zero exit status %d: %s" +#~ msgstr "命令列「%s」以非零結束狀態 %d 結束:%s" + +#~ msgid "No service record for '%s'" +#~ msgstr "沒有「%s」的服務紀錄" + +#~ msgid "workspace limit for empty substrings reached" +#~ msgstr "已達空白子字串的工作區上限" + +#~ msgid "case-changing escapes (\\l, \\L, \\u, \\U) are not allowed here" +#~ msgstr "這裡不允許使用改變大小寫的轉義符(\\l, \\L, \\u, \\U)" + +#~ msgid "repeating a DEFINE group is not allowed" +#~ msgstr "不允許重複 DEFINE 群組" + +#~ msgid "File is empty" +#~ msgstr "檔案是空白的" + +#~ msgid "" +#~ "Key file contains key '%s' which has value that cannot be interpreted." +#~ msgstr "設定鍵檔案包含的設定鍵‘%s’的數值無法解譯。" + +#~ msgid "This option will be removed soon." +#~ msgstr "這個選項很快會被移除。" + +#~ msgid "Error stating file '%s': %s" +#~ msgstr "取得檔案「%s」狀態時發生錯誤:%s" + +#~ msgid "Error connecting: " +#~ msgstr "連線錯誤:" + +#~ msgid "Error connecting: %s" +#~ msgstr "連線錯誤:%s" + +#~ msgid "SOCKSv4 implementation limits username to %i characters" +#~ msgstr "SOCKSv4 實作限制使用者名稱只能有 %i 字元" + +#~ msgid "SOCKSv4a implementation limits hostname to %i characters" +#~ msgstr "SOCKSv4a 實作限制主機名稱只能有 %i 字元" + +#~ msgid "Error reading from unix: %s" +#~ msgstr "從 unix 讀取時發生錯誤:%s" + +#~ msgid "Error closing unix: %s" +#~ msgstr "關閉 unix 時發生錯誤:%s" + +#~ msgid "Error writing to unix: %s" +#~ msgstr "寫入至 unix 時發生錯誤:%s" + +#~ msgctxt "GDateTime" +#~ msgid "am" +#~ msgstr "上午" + +#~ msgctxt "GDateTime" +#~ msgid "pm" +#~ msgstr "下午" + +#~ msgid "Type of return value is incorrect, got `%s', expected `%s'" +#~ msgstr "回傳值的類型是不正確的,得到「%s」,預期為「%s」" + +#~ msgid "" +#~ "Trying to set property %s of type %s but according to the expected " +#~ "interface the type is %s" +#~ msgstr "" +#~ "正在嘗試設定類型 %2$s 的屬性 %1$s 但是根據預期的介面這個類型應該是 %3$s" + +#~ msgid "No such schema `%s' specified in override file `%s'" +#~ msgstr "在覆蓋檔案「%2$s」沒有指定這個 schema「%1$s」" + +#~ msgid "" +#~ "Commands:\n" +#~ " help Show this information\n" +#~ " get Get the value of a key\n" +#~ " set Set the value of a key\n" +#~ " reset Reset the value of a key\n" +#~ " monitor Monitor a key for changes\n" +#~ " writable Check if a key is writable\n" +#~ "\n" +#~ "Use '%s COMMAND --help' to get help for individual commands.\n" +#~ msgstr "" +#~ "指令:\n" +#~ " help 顯示這個資訊\n" +#~ " get 取得設定鍵的數值\n" +#~ " set 設定設定鍵的數值\n" +#~ " reset 重設設定鍵的數值\n" +#~ " monitor 監控設定鍵的變更\n" +#~ " writable 檢查設定鍵是否可寫入\n" +#~ "\n" +#~ "使用「%s COMMAND --help」取得個別指令的求助文件。\n" + +#~ msgid "Specify the path for the schema" +#~ msgstr "指定 schema 的路徑" + +#~ msgid "" +#~ "Arguments:\n" +#~ " SCHEMA The id of the schema\n" +#~ " KEY The name of the key\n" +#~ " VALUE The value to set key to, as a serialized GVariant\n" +#~ msgstr "" +#~ "引數:\n" +#~ " SCHEMA schema 的 id\n" +#~ " KEY 設定鍵的名稱\n" +#~ " VALUE 設定鍵的數值,為序列化的 GVariant\n" + +#~ msgid "Key %s is not writable\n" +#~ msgstr "設定鍵 %s 無法寫入\n" + +#~ msgid "" +#~ "Monitor KEY for changes and print the changed values.\n" +#~ "Monitoring will continue until the process is terminated." +#~ msgstr "" +#~ "監控 KEY 的變更並顯示變更後的數值。\n" +#~ "監控會持續到程序中止為止。" + +#~ msgid "Error writing first 16 bytes of message to socket: " +#~ msgstr "當寫入訊息的頭 16 位元組到 socket 時發生錯誤:" + +#~ msgid "The nonce-file `%s' was %lu bytes. Expected 16 bytes." +#~ msgstr "nonce-file「%s」有 %lu 位元組。預期應為 16 位元組。" + +#, fuzzy +#~ msgid "Do not give error for empty directory" +#~ 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 "" +#~ "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 "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/.gitignore b/tests/.gitignore new file mode 100644 index 0000000..30bacf1 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,78 @@ +makefile.msc + +assert-msg-test +asyncqueue-test +atomic-test +base64-test +bit-test +bookmarkfile-test +child-test +closures +collate.out +completion-test +convert-test +cxx-test +datetime +deftype +dirname-test +env-test +file-test +file-test-get-contents +gio-test +iochannel-test +iochannel-test-outfile +list-test +mainloop-test +mapchild +mapping-test +maptest +markup-collect +markup-escape-test +markup-test +module-test +objects +objects2 +onceinit +patterntest +properties +properties2 +properties3 +properties4 +qsort-test +queue-test +regex-test +relation-test +scannerapi +sequence-test +shell-test +signal1 +signal2 +signal3 +signal4 +slice-color +slice-concurrent +slice-test +slice-threadinit +slist-test +sources +spawn-test +testgdate +testgdateparser +testglib +testgobject +testingbase64 +testmarshal.c +testmarshal.h +thread-test +threadpool-test +timeloop +timeloop-closure +tree-test +type-test +unicode-caseconv +unicode-collate +unicode-encoding +unicode-normalize +uri-test +utf8-pointer +utf8-validate diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..a5af03a --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,192 @@ +include $(top_srcdir)/Makefile.decl + +SUBDIRS=gobject refcount + +AM_CPPFLAGS = \ + $(gmodule_INCLUDES) \ + -DGLIB_DISABLE_DEPRECATION_WARNINGS \ + $(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 \ + assert-msg-test.gdb + +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) \ + assert-msg-test \ + datetime \ + testgobject + +TEST_PROGS += testglib +testglib_SOURCES = testglib.c +testglib_LDADD = $(libglib) + + +testgdate_LDADD = $(libglib) +testgdateparser_LDADD = $(libglib) +unicode_normalize_LDADD = $(libglib) +unicode_collate_LDADD = $(libglib) +assert_msg_test_LDADD = $(libglib) +if ENABLE_TIMELOOP +timeloop_LDADD = $(libglib) +timeloop_closure_LDADD = $(libglib) $(libgobject) +endif +datetime_LDADD = $(libglib) +testgobject_LDADD = $(libglib) $(libgobject) + +test_programs = \ + atomic-test \ + bit-test \ + $(CXX_TEST) \ + child-test \ + completion-test \ + dirname-test \ + file-test \ + env-test \ + gio-test \ + iochannel-test \ + mainloop-test \ + mapping-test \ + module-test \ + onceinit \ + asyncqueue-test \ + qsort-test \ + relation-test \ + slice-test \ + slice-color \ + slice-concurrent \ + slice-threadinit \ + sources \ + spawn-test \ + $(spawn_test_win32_gui) \ + thread-test \ + threadpool-test \ + type-test \ + unicode-caseconv \ + unicode-encoding + +test_scripts = run-collate-tests.sh run-assert-msg-test.sh + +test_script_support_programs = unicode-collate + +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) +bit_test_LDADD = $(progs_ldadd) +child_test_LDADD = $(thread_ldadd) +completion_test_LDADD = $(progs_ldadd) +dirname_test_LDADD = $(progs_ldadd) +file_test_LDADD = $(progs_ldadd) +env_test_LDADD = $(progs_ldadd) +gio_test_LDADD = $(progs_ldadd) +iochannel_test_LDADD = $(progs_ldadd) +mainloop_test_LDADD = $(thread_ldadd) +mapping_test_LDADD = $(progs_ldadd) +module_test_LDADD = $(module_ldadd) $(module_test_exp) +module_test_LDFLAGS = $(G_MODULE_LDFLAGS) +onceinit_LDADD = $(thread_ldadd) +asyncqueue_test_LDADD = $(thread_ldadd) +qsort_test_LDADD = $(progs_ldadd) +relation_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) +sources_LDADD = $(progs_ldadd) +spawn_test_LDADD = $(progs_ldadd) +thread_test_LDADD = $(thread_ldadd) +threadpool_test_LDADD = $(thread_ldadd) +type_test_LDADD = $(progs_ldadd) +unicode_encoding_LDADD = $(progs_ldadd) +unicode_caseconv_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)/collate; \ + for f in $(srcdir)/collate/* ; do \ + if test -f $$f; then cp $$f $(distdir)/collate; fi; done + +DISTCLEANFILES = \ + iochannel-test-outfile \ + file-test-get-contents \ + maptest \ + mapchild \ + collate.out diff --git a/tests/assert-msg-test.c b/tests/assert-msg-test.c new file mode 100644 index 0000000..44f8010 --- /dev/null +++ b/tests/assert-msg-test.c @@ -0,0 +1,8 @@ +#include + +int main(int argc, char **argv) +{ + g_assert(42 < 0); + return 0; +} + diff --git a/tests/assert-msg-test.gdb b/tests/assert-msg-test.gdb new file mode 100644 index 0000000..a22981a --- /dev/null +++ b/tests/assert-msg-test.gdb @@ -0,0 +1,3 @@ +run +set print elements 0 +print (char*) __glib_assert_msg diff --git a/tests/asyncqueue-test.c b/tests/asyncqueue-test.c new file mode 100644 index 0000000..bdc5303 --- /dev/null +++ b/tests/asyncqueue-test.c @@ -0,0 +1,243 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN +#undef G_DISABLE_DEPRECATED + +#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 G_GNUC_UNUSED; + 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)); +} + +static gint destroy_count = 0; + +static void +counting_destroy (gpointer item) +{ + destroy_count++; +} + +static void +basic_tests (void) +{ + GAsyncQueue *q; + gpointer item; + + destroy_count = 0; + + q = g_async_queue_new_full (counting_destroy); + g_async_queue_lock (q); + g_async_queue_ref (q); + g_async_queue_unlock (q); + g_async_queue_lock (q); + g_async_queue_ref_unlocked (q); + g_async_queue_unref_and_unlock (q); + + item = g_async_queue_try_pop (q); + g_assert (item == NULL); + + g_async_queue_lock (q); + item = g_async_queue_try_pop_unlocked (q); + g_async_queue_unlock (q); + g_assert (item == NULL); + + g_async_queue_push (q, GINT_TO_POINTER (1)); + g_async_queue_push (q, GINT_TO_POINTER (2)); + g_async_queue_push (q, GINT_TO_POINTER (3)); + g_assert_cmpint (destroy_count, ==, 0); + + g_async_queue_unref (q); + g_assert_cmpint (destroy_count, ==, 0); + + item = g_async_queue_pop (q); + g_assert_cmpint (GPOINTER_TO_INT (item), ==, 1); + g_assert_cmpint (destroy_count, ==, 0); + + g_async_queue_unref (q); + g_assert_cmpint (destroy_count, ==, 2); +} + +int +main (int argc, char *argv[]) +{ + gint i; + gint max_threads = MAX_THREADS; + gint max_unused_threads = MAX_THREADS; + gint sort_multiplier = MAX_SORTS; + gint sort_interval; + gchar *msg G_GNUC_UNUSED; + + g_thread_init (NULL); + + basic_tests (); + + 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); + + return EXIT_SUCCESS; +} diff --git a/tests/atomic-test.c b/tests/atomic-test.c new file mode 100644 index 0000000..3dd4b19 --- /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_add (&atomic, 5) == 0); + g_assert (atomic == 5); + + g_assert (g_atomic_int_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/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/casefold.txt b/tests/casefold.txt new file mode 100644 index 0000000..964e221 --- /dev/null +++ b/tests/casefold.txt @@ -0,0 +1,1140 @@ +# Test cases generated from Unicode 6.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 +H h +I i +J j +K k +L l +ï¼­ m +ï¼® n +O o +ï¼° p +ï¼± q +ï¼² r +ï¼³ s +ï¼´ t +ï¼µ u +ï¼¶ v +ï¼· w +X x +ï¼¹ y +Z z +𐐀 𐐨 +𐐁 𐐩 +𐐂 𐐪 +𐐃 𐐫 +𐐄 𐐬 +𐐅 𐐭 +𐐆 𐐮 +𐐇 𐐯 +𐐈 𐐰 +𐐉 𐐱 +𐐊 𐐲 +𐐋 𐐳 +𐐌 𐐴 +𐐍 𐐵 +𐐎 𐐶 +𐐏 𐐷 +𐐐 𐐸 +𐐑 𐐹 +𐐒 𐐺 +𐐓 𐐻 +𐐔 𐐼 +𐐕 𐐽 +𐐖 𐐾 +𐐗 𐐿 +𐐘 𐑀 +𐐙 𐑁 +𐐚 𐑂 +𐐛 𐑃 +𐐜 𐑄 +𐐝 𐑅 +𐐞 𐑆 +𐐟 𐑇 +𐐠 𐑈 +𐐡 𐑉 +𐐢 𐑊 +𐐣 𐑋 +𐐤 𐑌 +𐐥 𐑍 +𐐦 𐑎 +𐐧 𐑏 diff --git a/tests/casemap.txt b/tests/casemap.txt new file mode 100644 index 0000000..aa73e04 --- /dev/null +++ b/tests/casemap.txt @@ -0,0 +1,3269 @@ +# Test cases generated from Unicode 6.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 + µ µ Μ Μ # B5 + À à À # 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 + Ô¤ Ô¥ Ô¤ # 524 + Ô¥ Ô¥ Ô¤ Ô¤ # 525 + Ô¦ Ô§ Ô¦ # 526 + Ô§ Ô§ Ô¦ Ô¦ # 527 + Ô± Õ¡ Ô± # 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 + Ⴧ â´§ Ⴧ # 10C7 + Ⴭ â´­ Ⴭ # 10CD + ᴀ ᴀ # 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 + ᵫ ᵫ # 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 + ℂ ℂ # 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 + â±° ɒ â±° # 2C70 + â±± â±± # 2C71 + â±² â±³ â±² # 2C72 + â±³ â±³ â±² â±² # 2C73 + â±´ â±´ # 2C74 + â±µ â±¶ â±µ # 2C75 + â±¶ â±¶ â±µ â±µ # 2C76 + â±· â±· # 2C77 + ⱸ ⱸ # 2C78 + â±¹ â±¹ # 2C79 + ⱺ ⱺ # 2C7A + â±» â±» # 2C7B + â±¾ È¿ â±¾ # 2C7E + Ɀ ɀ Ɀ # 2C7F + Ⲁ ⲁ Ⲁ # 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 + Ⳬ ⳬ Ⳬ # 2CEB + ⳬ ⳬ Ⳬ Ⳬ # 2CEC + â³­ â³® â³­ # 2CED + â³® â³® â³­ â³­ # 2CEE + â³² â³³ â³² # 2CF2 + â³³ â³³ â³² â³² # 2CF3 + ⴀ ⴀ Ⴀ Ⴀ # 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 + â´§ â´§ Ⴧ Ⴧ # 2D27 + â´­ â´­ Ⴭ Ⴭ # 2D2D + Ꙁ ꙁ Ꙁ # 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 + Ꙡ ꙡ Ꙡ # A660 + ꙡ ꙡ Ꙡ Ꙡ # A661 + Ꙣ ꙣ Ꙣ # 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 + Ɥ É¥ Ɥ # A78D + ꞎ ꞎ # A78E + Ꞑ ꞑ Ꞑ # A790 + ꞑ ꞑ Ꞑ Ꞑ # A791 + Ꞓ ꞓ Ꞓ # A792 + ꞓ ꞓ Ꞓ Ꞓ # A793 + Ꞡ ꞡ Ꞡ # A7A0 + ꞡ ꞡ Ꞡ Ꞡ # A7A1 + Ꞣ ꞣ Ꞣ # A7A2 + ꞣ ꞣ Ꞣ Ꞣ # A7A3 + Ꞥ ꞥ Ꞥ # A7A4 + ꞥ ꞥ Ꞥ Ꞥ # A7A5 + Ꞧ ꞧ Ꞧ # A7A6 + ꞧ ꞧ Ꞧ Ꞧ # A7A7 + Ꞩ ꞩ Ꞩ # A7A8 + ꞩ ꞩ Ꞩ Ꞩ # A7A9 + Ɦ ɦ Ɦ # A7AA + ꟺ ꟺ # A7FA + 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 ï¼§ # 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 ï¼¶ # 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 ï¼§ ï¼§ # 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 ï¼¶ ï¼¶ # 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/child-test.c b/tests/child-test.c new file mode 100644 index 0000000..ec36b24 --- /dev/null +++ b/tests/child-test.c @@ -0,0 +1,202 @@ +/* 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 + +static 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 */ +} + +static 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 + +#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 ("true"); +#endif + + alive = 2; + g_timeout_add_seconds (30, 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; + } + + 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..789cd9a --- /dev/null +++ b/tests/completion-test.c @@ -0,0 +1,82 @@ +/* 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); + g_completion_set_compare (cmp, strncmp); + + 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); + + items = g_list_append (NULL, "bb"); + g_completion_remove_items (cmp, items); + + items = g_completion_complete_utf8 (cmp, "b", &prefix); + g_assert (g_list_length (items) == 1); + g_free (prefix); + + g_completion_free (cmp); + + 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/datetime.c b/tests/datetime.c new file mode 100644 index 0000000..6ee38c8 --- /dev/null +++ b/tests/datetime.c @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2011 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.1 of the + * licence, or (at your option) any later version. + * + * This is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should 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 +#include + +int +main (int argc, char *argv[]) +{ + gchar *fmt; + GDateTime *dt; + gchar *str; + + setlocale (LC_ALL, ""); + + if (argc > 1) + fmt = argv[1]; + else + fmt = "%x %X"; + + dt = g_date_time_new_now_local (); + str = g_date_time_format (dt, fmt); + g_print ("%s\n", str); + g_free (str); + + 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/file-test.c b/tests/file-test.c new file mode 100644 index 0000000..62f712c --- /dev/null +++ b/tests/file-test.c @@ -0,0 +1,232 @@ +/* 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 + +#include /* For open() */ + +#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_mkdtemp (void) +{ + char template[32], *retval; + int fd; + int i; + + strcpy (template, "foodir"); + retval = g_mkdtemp (template); + if (retval != NULL) + { + g_warning ("g_mkdtemp works even if template doesn't contain XXXXXX"); + g_rmdir (retval); + } + + strcpy (template, "foodir"); + retval = g_mkdtemp (template); + if (retval != NULL) + { + g_warning ("g_mkdtemp works even if template contains less than six X"); + g_rmdir (retval); + } + + strcpy (template, "fooXXXXXX"); + retval = g_mkdtemp (template); + g_assert (retval != NULL && "g_mkdtemp didn't work for template fooXXXXXX"); + g_assert (retval == template && "g_mkdtemp allocated the resulting string?"); + g_assert (!g_file_test (template, G_FILE_TEST_IS_REGULAR)); + g_assert (g_file_test (template, G_FILE_TEST_IS_DIR)); + + strcat (template, "/abc"); + fd = g_open (template, O_WRONLY | O_CREAT, 0600); + g_assert (fd != -1 && "couldn't open file in temporary directory"); + close (fd); + g_assert (g_file_test (template, G_FILE_TEST_IS_REGULAR)); + i = g_unlink (template); + g_assert (i != -1 && "couldn't unlink file in temporary directory"); + + template[9] = '\0'; + i = g_rmdir (template); + g_assert (i != -1 && "couldn't remove temporary directory"); + + strcpy (template, "fooXXXXXX.dir"); + retval = g_mkdtemp (template); + g_assert (retval != NULL && "g_mkdtemp didn't work for template fooXXXXXX.dir"); + g_assert (g_file_test (template, G_FILE_TEST_IS_DIR)); + g_rmdir (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_mkdtemp (); + 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-ls.c b/tests/gio-ls.c new file mode 100644 index 0000000..9ae74d4 --- /dev/null +++ b/tests/gio-ls.c @@ -0,0 +1,114 @@ + +#include + +#define GETTEXT_PACKAGE "gio-ls" +#define N_(s) (s) +#define _(s) (s) + +enum +{ + SHOW_ALL, + SHOW_LONG +}; + +static void print_path (const gchar* path, guint32 flags); + +static gboolean show_all = FALSE; +static gboolean show_long = FALSE; + +int +main (int argc, char *argv[]) +{ + + GOptionContext *context = NULL; + static GOptionEntry options[] = + { + {"all", 'a', 0, G_OPTION_ARG_NONE, &show_all, + N_("do not hide entries"), NULL }, + {"long", 'l', 0, G_OPTION_ARG_NONE, &show_long, + N_("use a long listing format"), NULL }, + { NULL } + }; + GError *error = NULL; + int i; + + context = g_option_context_new(_("[FILE...]")); + g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); + + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_print ("%s", error->message); + g_error_free (error); + + } + else + { + for (i = 1; i < argc; i++) + { + print_path (argv[i], (show_all ? SHOW_ALL : 0) | (show_long ? SHOW_LONG : 0)); + } + } + + g_option_context_free(context); + return 0; +} + +static void +print_path (const gchar* path, + guint32 flags) +{ + GFile *top; + const gchar *short_attrs = G_FILE_ATTRIBUTE_STANDARD_NAME; + const gchar *long_attrs = G_FILE_ATTRIBUTE_OWNER_USER "," G_FILE_ATTRIBUTE_OWNER_GROUP "," \ + "access:*,std:*"; + const gchar *attrs; + + if (flags & SHOW_LONG) + attrs = long_attrs; + else + attrs = short_attrs; + + top = g_file_new_for_path (path); + if (top) + { + GFileInfo *info; + GError *error = NULL; + GFileEnumerator *enumerator = g_file_enumerate_children (top, attrs, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); + if (error) + { + g_print ("%s", error->message); + g_error_free (error); + } + if (!enumerator) + return; + + while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) + { + const gchar *name = g_file_info_get_name (info); + + if (flags & SHOW_LONG) + { + const gchar *val; + + g_print ("%c%c%c%c ", + g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY ? 'd' : '-', + g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_READ) ? 'r' : '-', + g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE) ? 'w' : '-', + g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE) ? 'x' : '-'); + + val = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_USER); + g_print ("\t%15s", val ? val : "?user?"); + + val = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP); + g_print ("\t%15s", val ? val : "?group?"); + } + + g_print ("\t%s\n", name ? name : "?noname?"); + + g_object_unref (info); + } + + g_object_unref (top); + } +} diff --git a/tests/gio-test.c b/tests/gio-test.c new file mode 100644 index 0000000..7c28497 --- /dev/null +++ b/tests/gio-test.c @@ -0,0 +1,428 @@ +/* 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: %d\n", fd, error); + 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) + { + g_assert_cmpint (seq, ==, seqtab[i].seq); + 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)); + + g_assert_cmpint (nbytes, <, BUFSIZE); + 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++) + g_assert (buf[j] == ' ' + ((nbytes + j) % 95)); +#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/.gitignore b/tests/gobject/.gitignore new file mode 100644 index 0000000..96ea26a --- /dev/null +++ b/tests/gobject/.gitignore @@ -0,0 +1,14 @@ +accumulator +defaultiface +dynamictype +gvalue-test +ifacecheck +ifaceinherit +ifaceinit +ifaceproperties +override +paramspec-test +performance +performance-threaded +references +singleton diff --git a/tests/gobject/Makefile.am b/tests/gobject/Makefile.am new file mode 100644 index 0000000..e766b7a --- /dev/null +++ b/tests/gobject/Makefile.am @@ -0,0 +1,96 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + $(gmodule_INCLUDES) \ + -DGLIB_DISABLE_DEPRECATION_WARNINGS \ + $(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) + $(AM_V_GEN) $(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.h testmarshal.list $(glib_genmarshal) + $(AM_V_GEN) (echo "#include \"testmarshal.h\""; $(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 \ + 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/accumulator.c b/tests/gobject/accumulator.c new file mode 100644 index 0000000..f8a6c12 --- /dev/null +++ b/tests/gobject/accumulator.c @@ -0,0 +1,307 @@ +/* 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); + GVariant* (*test_signal3) (TestObject *tobject, + gboolean *weak_ptr); +}; + +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; +} + +static gchar * +test_object_signal1_callback_before (TestObject *tobject, + gint param, + gpointer data) +{ + return g_strdup (""); +} + +static gchar * +test_object_real_signal1 (TestObject *tobject, + gint param) +{ + return g_strdup (""); +} + +static gchar * +test_object_signal1_callback_after (TestObject *tobject, + gint param, + gpointer data) +{ + return g_strdup (""); +} + +static 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; +} + +static 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; +} + +static 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 gboolean +test_signal3_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer data) +{ + GVariant *variant; + + variant = g_value_get_variant (handler_return); + g_assert (!g_variant_is_floating (variant)); + + g_value_set_variant (return_accu, variant); + + return variant == NULL; +} + +/* To be notified when the variant is finalised, we construct + * it from data with a custom GDestroyNotify. + */ + +typedef struct { + char *mem; + gsize n; + gboolean *weak_ptr; +} VariantData; + +static void +free_data (VariantData *data) +{ + *(data->weak_ptr) = TRUE; + g_free (data->mem); + g_slice_free (VariantData, data); +} + +static GVariant * +test_object_real_signal3 (TestObject *tobject, + gboolean *weak_ptr) +{ + GVariant *variant; + VariantData *data; + + variant = g_variant_ref_sink (g_variant_new_uint32 (42)); + data = g_slice_new (VariantData); + data->weak_ptr = weak_ptr; + data->n = g_variant_get_size (variant); + data->mem = g_malloc (data->n); + g_variant_store (variant, data->mem); + g_variant_unref (variant); + + variant = g_variant_new_from_data (G_VARIANT_TYPE ("u"), + data->mem, + data->n, + TRUE, + (GDestroyNotify) free_data, + data); + return g_variant_ref_sink (variant); +} + +static void +test_object_class_init (TestObjectClass *class) +{ + class->test_signal1 = test_object_real_signal1; + class->test_signal2 = test_object_real_signal2; + class->test_signal3 = test_object_real_signal3; + + 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); + g_signal_new ("test-signal3", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (TestObjectClass, test_signal3), + test_signal3_accumulator, NULL, + test_marshal_VARIANT__POINTER, + G_TYPE_VARIANT, 1, G_TYPE_POINTER); +} + +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; + gboolean variant_finalised; + GVariant *variant_result; + + g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) | + G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_CRITICAL); + + 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); + + variant_finalised = FALSE; + variant_result = NULL; + g_signal_emit_by_name (object, "test-signal3", &variant_finalised, &variant_result); + g_assert (variant_result != NULL); + g_assert (!g_variant_is_floating (variant_result)); + + /* Test that variant_result had refcount 1 */ + g_assert (!variant_finalised); + g_variant_unref (variant_result); + g_assert (variant_finalised); + + return 0; +} diff --git a/tests/gobject/defaultiface.c b/tests/gobject/defaultiface.c new file mode 100644 index 0000000..c44c18a --- /dev/null +++ b/tests/gobject/defaultiface.c @@ -0,0 +1,196 @@ +/* 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; +}; + +GType test_static_iface_get_type (void); +#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) +{ + 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) +{ + TestDynamicIfaceClass *dynamic_iface; + + 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); +#if 0 + g_assert (!dynamic_iface_init); +#endif + + /* Peek returns NULL */ + dynamic_iface = g_type_default_interface_peek (TEST_TYPE_DYNAMIC_IFACE); +#if 0 + g_assert (dynamic_iface == NULL); +#endif + + /* 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); +#if 0 + g_assert (!dynamic_iface_init); +#endif +} + +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); + + 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..232feff --- /dev/null +++ b/tests/gobject/deftype.c @@ -0,0 +1,61 @@ +/* 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) { \ + 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; + +GType type_name_get_type (void); + +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..b527608 --- /dev/null +++ b/tests/gobject/dynamictype.c @@ -0,0 +1,177 @@ +/* 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; +}; + +static GType test_iface_get_type (void); +#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) +{ +} + +GType dynamic_object_get_type (void); +#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) +{ + DynamicObjectClass *class; + + 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); +#if 0 + g_assert (!class); + g_assert (!loaded); +#endif + + /* 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); +#if 0 + g_assert (!class); + g_assert (!loaded); +#endif +} + +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); + + 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..fa7bede --- /dev/null +++ b/tests/gobject/gvalue-test.c @@ -0,0 +1,398 @@ +/* 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 = G_VALUE_INIT; + GValue xform = G_VALUE_INIT; + 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); + g_assert (g_value_get_schar (&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 = G_VALUE_INIT; + GValue copy = G_VALUE_INIT; + + 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 = G_VALUE_INIT; + 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); + + g_value_unset (&value); + g_value_init (&value, G_TYPE_VARIANT); + error = collect (&value, g_variant_new_uint32 (42)); + g_assert (error == NULL); + g_assert (g_variant_is_of_type (g_value_get_variant (&value), G_VARIANT_TYPE ("u"))); + g_assert_cmpuint (g_variant_get_uint32 (g_value_get_variant (&value)), ==, 42); + + g_value_unset (&value); +} + +static void +test_copying (void) +{ + GValue value = G_VALUE_INIT; + 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); + } + + { + GVariant *c = NULL; + + g_value_unset (&value); + g_value_init (&value, G_TYPE_VARIANT); + g_value_set_variant (&value, g_variant_new_uint32 (42)); + error = lcopy (&value, &c); + g_assert (error == NULL); + g_assert (c != NULL); + g_assert (g_variant_is_of_type (c, G_VARIANT_TYPE ("u"))); + g_assert_cmpuint (g_variant_get_uint32 (c), ==, 42); + g_variant_unref (c); + } +} + + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gvalue/enum-transformation", test_enum_transformation); + g_test_add_func ("/gvalue/gtype", test_gtype_value); + g_test_add_func ("/gvalue/collection", test_collection); + g_test_add_func ("/gvalue/copying", test_copying); + + return g_test_run (); +} diff --git a/tests/gobject/ifacecheck.c b/tests/gobject/ifacecheck.c new file mode 100644 index 0000000..e00d9b5 --- /dev/null +++ b/tests/gobject/ifacecheck.c @@ -0,0 +1,165 @@ +/* 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"; + + /* 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); + { + 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..7de658b --- /dev/null +++ b/tests/gobject/ifaceinherit.c @@ -0,0 +1,232 @@ +/* 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 (void); +static GType derived_object_get_type (void); + +/* + * 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; +}; + +static GType test_iface1_get_type (void); +static GType test_iface2_get_type (void); +static GType test_iface3_get_type (void); +static GType test_iface4_get_type (void); +static GType test_iface5_get_type (void); + +#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); + + /* 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..ec62fd7 --- /dev/null +++ b/tests/gobject/ifaceinit.c @@ -0,0 +1,423 @@ +/* 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 { \ + 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); + + /* 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); + + g_type_class_unref (object_class); + + return 0; +} diff --git a/tests/gobject/override.c b/tests/gobject/override.c new file mode 100644 index 0000000..95b4023 --- /dev/null +++ b/tests/gobject/override.c @@ -0,0 +1,417 @@ +/* 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] = { G_VALUE_INIT }; + + 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] = { G_VALUE_INIT }; + + 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] = { G_VALUE_INIT }; + + 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] = { G_VALUE_INIT }; + + 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] = { G_VALUE_INIT }; + + 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); + + 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..129a24f --- /dev/null +++ b/tests/gobject/paramspec-test.c @@ -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/. + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#include +#include + +static void +test_param_spec_char (void) +{ + GParamSpec *pspec; + GValue value = G_VALUE_INIT; + 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_value_set_schar (&value, 0); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_schar (&value) == 20); + + g_value_set_schar (&value, 20); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_schar (&value) == 20); + + g_value_set_schar (&value, 40); + modified = g_param_value_validate (pspec, &value); + g_assert (!modified && g_value_get_schar (&value) == 40); + + g_value_set_schar (&value, 60); + modified = g_param_value_validate (pspec, &value); + g_assert (modified && g_value_get_schar (&value) == 40); + + g_param_spec_unref (pspec); +} + +static void +test_param_spec_string (void) +{ + GParamSpec *pspec; + GValue value = G_VALUE_INIT; + 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 = G_VALUE_INIT; + 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 = G_VALUE_INIT; + 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); +} + +static void +test_param_spec_variant (void) +{ + GParamSpec *pspec; + GValue value = G_VALUE_INIT; + gboolean modified; + + pspec = g_param_spec_variant ("variant", "nick", "blurb", + G_VARIANT_TYPE ("i"), + g_variant_new_int32 (42), + G_PARAM_READWRITE); + + g_value_init (&value, G_TYPE_VARIANT); + g_value_set_variant (&value, g_variant_new_int32 (42)); + + g_assert (g_param_value_defaults (pspec, &value)); + + modified = g_param_value_validate (pspec, &value); + g_assert (!modified); + + g_value_reset (&value); + g_value_set_variant (&value, g_variant_new_uint32 (41)); + modified = g_param_value_validate (pspec, &value); + g_assert (modified); + g_assert_cmpint (g_variant_get_int32 (g_value_get_variant (&value)), ==, 42); + g_value_unset (&value); + + g_param_spec_unref (pspec); +} + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/paramspec/char", test_param_spec_char); + g_test_add_func ("/paramspec/string", test_param_spec_string); + g_test_add_func ("/paramspec/override", test_param_spec_override); + g_test_add_func ("/paramspec/gtype", test_param_spec_gtype); + g_test_add_func ("/paramspec/variant", test_param_spec_variant); + + return g_test_run (); +} diff --git a/tests/gobject/performance-threaded.c b/tests/gobject/performance-threaded.c new file mode 100644 index 0000000..76f153f --- /dev/null +++ b/tests/gobject/performance-threaded.c @@ -0,0 +1,379 @@ +/* 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; + + 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..e9310a5 --- /dev/null +++ b/tests/gobject/performance.c @@ -0,0 +1,920 @@ +/* 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 + *************************************************************/ + +static GType simple_object_get_type (void); +#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); +}; + +static GType test_iface1_get_type (void); +static GType test_iface2_get_type (void); +static GType test_iface3_get_type (void); +static GType test_iface4_get_type (void); +static GType test_iface5_get_type (void); + +#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. + *************************************************************/ + +static GType complex_object_get_type (void); +#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); + void (*signal_empty) (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_SIGNAL_EMPTY, + COMPLEX_SIGNAL_GENERIC, + COMPLEX_SIGNAL_GENERIC_EMPTY, + 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); + + complex_signals[COMPLEX_SIGNAL_EMPTY] = + g_signal_new ("signal-empty", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ComplexObjectClass, signal_empty), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + complex_signals[COMPLEX_SIGNAL_GENERIC] = + g_signal_new ("signal-generic", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ComplexObjectClass, signal), + NULL, NULL, + NULL, + G_TYPE_NONE, 0); + complex_signals[COMPLEX_SIGNAL_GENERIC_EMPTY] = + g_signal_new ("signal-generic-empty", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ComplexObjectClass, signal_empty), + NULL, NULL, + NULL, + 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 (*)(void))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 unhandled emissions performance + *************************************************************/ + +#define NUM_EMISSIONS_PER_ROUND 10000 + +struct EmissionTest { + GObject *object; + int n_checks; + int signal_id; +}; + +static gpointer +test_emission_unhandled_setup (PerformanceTest *test) +{ + struct EmissionTest *data; + + data = g_new0 (struct EmissionTest, 1); + data->object = g_object_new (COMPLEX_TYPE_OBJECT, NULL); + data->signal_id = complex_signals[GPOINTER_TO_INT (test->extra_data)]; + return data; +} + +static void +test_emission_unhandled_init (PerformanceTest *test, + gpointer _data, + double factor) +{ + struct EmissionTest *data = _data; + + data->n_checks = factor * NUM_EMISSIONS_PER_ROUND; +} + +static void +test_emission_unhandled_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, + data->signal_id, + 0); +} + +static void +test_emission_unhandled_finish (PerformanceTest *test, + gpointer data) +{ +} + +static void +test_emission_unhandled_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_unhandled_teardown (PerformanceTest *test, + gpointer _data) +{ + struct EmissionTest *data = _data; + + g_object_unref (data->object); + g_free (data); +} + +/************************************************************* + * Test signal handled emissions performance + *************************************************************/ + +static void +test_emission_handled_handler (ComplexObject *obj, gpointer data) +{ +} + +static gpointer +test_emission_handled_setup (PerformanceTest *test) +{ + struct EmissionTest *data; + + data = g_new0 (struct EmissionTest, 1); + data->object = g_object_new (COMPLEX_TYPE_OBJECT, NULL); + data->signal_id = complex_signals[GPOINTER_TO_INT (test->extra_data)]; + g_signal_connect (data->object, "signal", + G_CALLBACK (test_emission_handled_handler), + NULL); + g_signal_connect (data->object, "signal-empty", + G_CALLBACK (test_emission_handled_handler), + NULL); + g_signal_connect (data->object, "signal-generic", + G_CALLBACK (test_emission_handled_handler), + NULL); + g_signal_connect (data->object, "signal-generic-empty", + G_CALLBACK (test_emission_handled_handler), + NULL); + + return data; +} + +static void +test_emission_handled_init (PerformanceTest *test, + gpointer _data, + double factor) +{ + struct EmissionTest *data = _data; + + data->n_checks = factor * NUM_EMISSIONS_PER_ROUND; +} + +static void +test_emission_handled_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, + data->signal_id, + 0); +} + +static void +test_emission_handled_finish (PerformanceTest *test, + gpointer data) +{ +} + +static void +test_emission_handled_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_handled_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-unhandled", + GINT_TO_POINTER (COMPLEX_SIGNAL), + test_emission_unhandled_setup, + test_emission_unhandled_init, + test_emission_unhandled_run, + test_emission_unhandled_finish, + test_emission_unhandled_teardown, + test_emission_unhandled_print_result + }, + { + "emit-unhandled-empty", + GINT_TO_POINTER (COMPLEX_SIGNAL_EMPTY), + test_emission_unhandled_setup, + test_emission_unhandled_init, + test_emission_unhandled_run, + test_emission_unhandled_finish, + test_emission_unhandled_teardown, + test_emission_unhandled_print_result + }, + { + "emit-unhandled-generic", + GINT_TO_POINTER (COMPLEX_SIGNAL_GENERIC), + test_emission_unhandled_setup, + test_emission_unhandled_init, + test_emission_unhandled_run, + test_emission_unhandled_finish, + test_emission_unhandled_teardown, + test_emission_unhandled_print_result + }, + { + "emit-unhandled-generic-empty", + GINT_TO_POINTER (COMPLEX_SIGNAL_GENERIC_EMPTY), + test_emission_unhandled_setup, + test_emission_unhandled_init, + test_emission_unhandled_run, + test_emission_unhandled_finish, + test_emission_unhandled_teardown, + test_emission_unhandled_print_result + }, + { + "emit-handled", + GINT_TO_POINTER (COMPLEX_SIGNAL), + test_emission_handled_setup, + test_emission_handled_init, + test_emission_handled_run, + test_emission_handled_finish, + test_emission_handled_teardown, + test_emission_handled_print_result + }, + { + "emit-handled-empty", + GINT_TO_POINTER (COMPLEX_SIGNAL_EMPTY), + test_emission_handled_setup, + test_emission_handled_init, + test_emission_handled_run, + test_emission_handled_finish, + test_emission_handled_teardown, + test_emission_handled_print_result + }, + { + "emit-handled-generic", + GINT_TO_POINTER (COMPLEX_SIGNAL_GENERIC), + test_emission_handled_setup, + test_emission_handled_init, + test_emission_handled_run, + test_emission_handled_finish, + test_emission_handled_teardown, + test_emission_handled_print_result + }, + { + "emit-handled-generic-empty", + GINT_TO_POINTER (COMPLEX_SIGNAL_GENERIC_EMPTY), + test_emission_handled_setup, + test_emission_handled_init, + test_emission_handled_run, + test_emission_handled_finish, + test_emission_handled_teardown, + test_emission_handled_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; + + 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..cfedfa9 --- /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 + */ +static GType test_object_get_type (void); +#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); + + /* 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/run-performance.sh b/tests/gobject/run-performance.sh new file mode 100755 index 0000000..f2d53df --- /dev/null +++ b/tests/gobject/run-performance.sh @@ -0,0 +1,6 @@ +#!/bin/sh +DIR=`dirname $0`; +(cd $DIR; make performance) +ID=`git rev-list --max-count=1 HEAD` +echo "Testing revision ${ID}" +$DIR/performance | tee "perf-${ID}.log" diff --git a/tests/gobject/singleton.c b/tests/gobject/singleton.c new file mode 100644 index 0000000..abf1a0b --- /dev/null +++ b/tests/gobject/singleton.c @@ -0,0 +1,86 @@ +/* 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; + +static GType my_singleton_get_type (void); +#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; + + /* 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..6c377e4 --- /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) \ + { \ + 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) \ + { \ + 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) \ +{ \ + 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.list b/tests/gobject/testmarshal.list new file mode 100644 index 0000000..198c4f9 --- /dev/null +++ b/tests/gobject/testmarshal.list @@ -0,0 +1,4 @@ +# Marshallers used in tests +BOOLEAN:INT +STRING:INT +VARIANT:POINTER 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/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..492b47e --- /dev/null +++ b/tests/iochannel-test.c @@ -0,0 +1,170 @@ +#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 = G_IO_STATUS_ERROR; + 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_clear_error (&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; + + 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_clear_error (&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_clear_error (&gerr); + return 1; + } + + g_io_channel_set_encoding (gio_r, encoding, &gerr); + if (gerr) + { + g_warning ("%s", 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_clear_error (&gerr); + } + + 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 ("%s", gerr->message); + g_clear_error (&gerr); + } + 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 ("%s", gerr->message); + g_clear_error (&gerr); + 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 ("%s", gerr->message); + g_clear_error (&gerr); + } + +#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..69fdd0f --- /dev/null +++ b/tests/libmoduletestplugin_a.c @@ -0,0 +1,77 @@ +/* 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 + +void gplugin_a_func (void); +void gplugin_clash_func (void); +void g_clash_func (void); +void gplugin_say_boo_func (void); +void gplugin_a_module_func (GModule *module); + +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..26cc33f --- /dev/null +++ b/tests/libmoduletestplugin_b.c @@ -0,0 +1,78 @@ +/* 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; + +const gchar* g_module_check_init (GModule *module); +void g_module_unload (GModule *module); + +void gplugin_b_func (void); +void gplugin_clash_func (void); +void g_clash_func (void); +void gplugin_say_boo_func (void); + +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/mainloop-test.c b/tests/mainloop-test.c new file mode 100644 index 0000000..f4a805e --- /dev/null +++ b/tests/mainloop-test.c @@ -0,0 +1,436 @@ +#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); + +static 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; +} + +static 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; +} + +static 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; +} + +static gboolean +timeout_callback (gpointer data) +{ + AddrData *addr_data = data; + + addr_data->count++; + + return TRUE; +} + +static 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_name (adder_source, "Adder I/O"); + 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_name (timeout_source, "Adder timeout"); + 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; +} + +static 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); +} + +static 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); +} + +static 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; +} + +static 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_name (source, "Crawler timeout"); + 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_name (source, "Recursing idle source"); + 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[]) +{ + gint i; + + g_thread_init (NULL); + + context_array = g_ptr_array_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); + + 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/memchunks.c b/tests/memchunks.c new file mode 100644 index 0000000..8ce1625 --- /dev/null +++ b/tests/memchunks.c @@ -0,0 +1,605 @@ +/* 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 --- */ +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; +static GMemChunk *mem_chunks = NULL; + +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 amount 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..dd99b71 --- /dev/null +++ b/tests/module-test.c @@ -0,0 +1,204 @@ +/* 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); + +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/onceinit.c b/tests/onceinit.c new file mode 100644 index 0000000..f142fbf --- /dev/null +++ b/tests/onceinit.c @@ -0,0 +1,275 @@ +/* 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; +static GCond tcond; +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_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_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_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_add (&thread_call_count, 1); + return NULL; +} + +static void* stress_concurrent_initializers (void*); + +int +main (int argc, + char *argv[]) +{ + G_GNUC_UNUSED GThread *threads[N_THREADS]; + int i; + void *p; + + /* test simple initializer */ + initializer1(); + initializer1(); + /* test pointer initializer */ + p = initializer2(); + g_assert (p == &dummy_value); + p = initializer2(); + g_assert (p == &dummy_value); + /* setup threads */ + g_thread_init (NULL); + /* 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 + */ +#undef g_once_init_enter +#undef g_once_init_leave + +/* 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_add (&thread_call_count, 1); + } + return NULL; +} diff --git a/tests/qsort-test.c b/tests/qsort-test.c new file mode 100644 index 0000000..67abb23 --- /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 argc, char **argv) +{ + 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 elements is a valid case */ + g_qsort_with_data (array, 0, sizeof (guint32), sort, NULL); + + return 0; +} diff --git a/tests/refcount/Makefile.am b/tests/refcount/Makefile.am new file mode 100644 index 0000000..34daca6 --- /dev/null +++ b/tests/refcount/Makefile.am @@ -0,0 +1,44 @@ +include $(top_srcdir)/Makefile.decl + +AM_CPPFLAGS = \ + $(gmodule_INCLUDES) \ + -DGLIB_DISABLE_DEPRECATION_WARNINGS \ + $(GLIB_DEBUG_FLAGS) + +libglib = $(top_builddir)/glib/libglib-2.0.la +libgmodule = $(top_builddir)/gmodule/libgmodule-2.0.la +libgobject = $(top_builddir)/gobject/libgobject-2.0.la + +LDADD = $(libglib) $(libgobject) + +test_programs = \ + closures \ + objects \ + objects2 \ + properties \ + properties2 \ + properties3 \ + properties4 \ + signal1 \ + signal2 \ + signal3 \ + signal4 + + + +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) +signal4_SOURCES = signals.c +signal4_CFLAGS = -DTESTNUM=4 $(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/closures.c b/tests/refcount/closures.c new file mode 100644 index 0000000..cc29354 --- /dev/null +++ b/tests/refcount/closures.c @@ -0,0 +1,290 @@ +/* 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)) + +static GType my_test_get_type (void); +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_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)); + + 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..9ff3b60 --- /dev/null +++ b/tests/refcount/objects.c @@ -0,0 +1,156 @@ +#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) { + 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", test); + + 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_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)); + + 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..51d7aa7 --- /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) { + 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", test); + + 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_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)); + + test = g_object_new (G_TYPE_TEST, NULL); + + for (i=0; i<100000000; i++) { + my_test_do_refcount (test); + } + + g_object_unref (test); + + g_print ("\n"); + + return 0; +} diff --git a/tests/refcount/properties.c b/tests/refcount/properties.c new file mode 100644 index 0000000..d96a012 --- /dev/null +++ b/tests/refcount/properties.c @@ -0,0 +1,249 @@ +#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) { + 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) +{ + 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_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)); + + 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..577e33e --- /dev/null +++ b/tests/refcount/properties2.c @@ -0,0 +1,197 @@ +#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) { + 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", test); + + 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_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)); + + 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/properties3.c b/tests/refcount/properties3.c new file mode 100644 index 0000000..5821188 --- /dev/null +++ b/tests/refcount/properties3.c @@ -0,0 +1,202 @@ +#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; + gint setcount; +}; + +struct _GTestClass +{ + GObjectClass parent_class; +}; + +static GType my_test_get_type (void); +G_DEFINE_TYPE (GTest, my_test, G_TYPE_OBJECT); + +static volatile gboolean stopping; + +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 void +my_test_class_init (GTestClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + 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_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, g_atomic_int_get (&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: + g_atomic_int_set (&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); + + g_atomic_int_inc (&test->count); +} + +static void +my_test_do_property (GTest * test) +{ + gint dummy; + + g_atomic_int_inc (&test->setcount); + + 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; + GTest *test; + GArray *test_threads; + const gint n_threads = 5; + + 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)); + + test = g_object_new (G_TYPE_TEST, NULL); + + 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; + + thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL); + g_array_append_val (test_threads, thread); + } + g_usleep (30000000); + + 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"); + + g_print ("%d %d\n", test->setcount, test->count); + + g_array_free (test_threads, TRUE); + g_object_unref (test); + + return 0; +} diff --git a/tests/refcount/properties4.c b/tests/refcount/properties4.c new file mode 100644 index 0000000..2512160 --- /dev/null +++ b/tests/refcount/properties4.c @@ -0,0 +1,169 @@ +#include +#include + +#define MY_TYPE_BADGER (my_badger_get_type ()) +#define MY_BADGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_BADGER, MyBadger)) +#define MY_IS_BADGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_BADGER)) +#define MY_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MY_TYPE_BADGER, MyBadgerClass)) +#define MY_IS_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_TYPE_BADGER)) +#define MY_BADGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_BADGER, MyBadgerClass)) + +enum { + PROP_0, + PROP_MAMA +}; + +typedef struct _MyBadger MyBadger; +typedef struct _MyBadgerClass MyBadgerClass; + +struct _MyBadger +{ + GObject parent_instance; + + MyBadger * mama; + guint mama_notify_count; +}; + +struct _MyBadgerClass +{ + GObjectClass parent_class; +}; + +static GType my_badger_get_type (void); +G_DEFINE_TYPE (MyBadger, my_badger, G_TYPE_OBJECT); + +static void my_badger_dispose (GObject * object); + +static void my_badger_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void my_badger_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); + +static void my_badger_mama_notify (GObject *object, + GParamSpec *pspec); + +static void +my_badger_class_init (MyBadgerClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->dispose = my_badger_dispose; + + gobject_class->get_property = my_badger_get_property; + gobject_class->set_property = my_badger_set_property; + + g_object_class_install_property (gobject_class, + PROP_MAMA, + g_param_spec_object ("mama", + NULL, + NULL, + MY_TYPE_BADGER, + G_PARAM_READWRITE)); +} + +static void +my_badger_init (MyBadger * self) +{ + g_signal_connect (self, "notify::mama", G_CALLBACK (my_badger_mama_notify), + NULL); +} + +static void +my_badger_dispose (GObject * object) +{ + MyBadger * self; + + self = MY_BADGER (object); + + if (self->mama != NULL) + { + g_object_unref (self->mama); + self->mama = NULL; + } + + G_OBJECT_CLASS (my_badger_parent_class)->dispose (object); +} + +static void +my_badger_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MyBadger *self; + + self = MY_BADGER (object); + + switch (prop_id) + { + case PROP_MAMA: + g_value_set_object (value, self->mama); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_badger_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MyBadger *self; + + self = MY_BADGER (object); + + switch (prop_id) + { + case PROP_MAMA: + if (self->mama) + g_object_unref (self->mama); + self->mama = g_value_dup_object (value); + if (self->mama) + g_object_set (self->mama, "mama", NULL, NULL); /* another notify */ + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +my_badger_mama_notify (GObject *object, + GParamSpec *pspec) +{ + MyBadger *self; + + self = MY_BADGER (object); + + self->mama_notify_count++; +} + +int +main (int argc, char **argv) +{ + MyBadger * badger1, * badger2; + + 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)); + + badger1 = g_object_new (MY_TYPE_BADGER, NULL); + badger2 = g_object_new (MY_TYPE_BADGER, NULL); + + g_object_set (badger1, "mama", badger2, NULL); + g_assert_cmpuint (badger1->mama_notify_count, ==, 1); + g_assert_cmpuint (badger2->mama_notify_count, ==, 1); + + g_object_unref (badger1); + g_object_unref (badger2); + + return 0; +} diff --git a/tests/refcount/signals.c b/tests/refcount/signals.c new file mode 100644 index 0000000..0677834 --- /dev/null +++ b/tests/refcount/signals.c @@ -0,0 +1,309 @@ +#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); + gchar * (*test_signal3) (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, + TEST_SIGNAL3, + /* 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 gchar * signal3_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) { + 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); + + 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); + my_test_signals[TEST_SIGNAL3] = + g_signal_new ("test-signal3", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal3), NULL, + NULL, g_cclosure_marshal_generic, G_TYPE_STRING, 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; + klass->test_signal3 = signal3_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", test); + + 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 gchar * +signal3_handler (GTest * test, gint anint) +{ + return g_strdup ("test"); +} + +static void +my_test_do_signal3 (GTest * test) +{ + gchar *res; + + g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL3], 0, 0, &res); + g_assert (res); + g_free (res); +} + +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 (TESTNUM == 4) + my_test_do_signal3 (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_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)); + + 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"); + + g_array_free (test_threads, TRUE); + g_object_unref (test1); + g_object_unref (test2); + + return 0; +} 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..58305b0 --- /dev/null +++ b/tests/run-assert-msg-test.sh @@ -0,0 +1,48 @@ +#! /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 + +if [ -z "$LIBTOOL" ]; then + if [ -f ../libtool ]; then + LIBTOOL=../libtool + else + LIBTOOL=libtool + fi +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 + +echo_v "Running gdb on assert-msg-test" +OUT=$($LIBTOOL --mode=execute gdb --batch -x ${srcdir:-.}/assert-msg-test.gdb ./assert-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-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/slice-color.c b/tests/slice-color.c new file mode 100644 index 0000000..ecd38d1 --- /dev/null +++ b/tests/slice-color.c @@ -0,0 +1,179 @@ +/* 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=%" G_GUINT64_FORMAT " memory-size=%" G_GUINT64_FORMAT "\n", block_size, area_size); + usage(); + return 1; + } + + g_printerr ("Will allocate and touch %" G_GUINT64_FORMAT " blocks of %" G_GUINT64_FORMAT " bytes (= %" G_GUINT64_FORMAT " bytes) %" G_GUINT64_FORMAT " times with color increment: 0x%08" G_GINT64_MODIFIER "x\n", + n_blocks, block_size, n_blocks * block_size, repeats, + (guint64)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..202cfe7 --- /dev/null +++ b/tests/slice-concurrent.c @@ -0,0 +1,122 @@ +/* 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]; + +static 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++) + { + int bytes; + char *mem; + int f; + int t; + + if (rand() % (N_ALLOCS / 20) == 0) + g_print ("%c", 'a' - 1 + td->thread_id); + + /* allocate block of random size and randomly fill */ + bytes = rand() % MAX_BLOCK_SIZE + 1; + mem = g_slice_alloc (bytes); + + for (f = 0; f < bytes; f++) + mem[f] = rand(); + + /* associate block with random thread */ + 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 (void) +{ + int t; + + for (t = 0; t < N_THREADS; t++) + { + tdata[t].thread_id = t + 1; + tdata[t].n_to_free = 0; + tdata[t].n_freed = 0; + } + 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..9ff96ae --- /dev/null +++ b/tests/slice-test.c @@ -0,0 +1,308 @@ +/* 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) --- */ +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 (test_sliced_mem_thread, seedp, TRUE, NULL); + else + { + for (i = 0; i < n_threads; i++) + threads[i] = g_thread_create (test_memchunk_thread, seedp, TRUE, 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 (" %9" G_GINT64_FORMAT " | %9" G_GINT64_FORMAT " | %9" G_GINT64_FORMAT "\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..f29dcbe --- /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 { 97, 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/sources.c b/tests/sources.c new file mode 100644 index 0000000..35edb85 --- /dev/null +++ b/tests/sources.c @@ -0,0 +1,179 @@ +/* This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Copyright 2012 Red Hat, Inc + */ + +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +#define NSOURCES 50000 + +static gboolean +callback (gpointer user_data) +{ + g_assert_not_reached (); + return FALSE; +} + +static void +shuffle (GSource **sources, int num) +{ + int i, a, b; + GSource *tmp; + + for (i = 0; i < num * 10; i++) + { + a = g_random_int_range (0, num); + b = g_random_int_range (0, num); + tmp = sources[a]; + sources[a] = sources[b]; + sources[b] = tmp; + } +} + +static void +thread_pool_attach_func (gpointer data, + gpointer user_data) +{ + GMainContext *context = user_data; + GSource *source = data; + + g_source_attach (source, context); +} + +static void +thread_pool_destroy_func (gpointer data, + gpointer user_data) +{ + GSource *source = data; + + g_source_destroy (source); +} + +int +main (int argc, char **argv) +{ + int i; + gint64 start; + gint64 end; + GMainContext *context; + GSource **sources; + GThreadPool *pool; + GError *error = NULL; + + context = g_main_context_default (); + sources = g_new0 (GSource *, NSOURCES); + + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + { + sources[i] = g_idle_source_new (); + g_source_set_callback (sources[i], callback, NULL, NULL); + g_source_attach (sources[i], context); + } + end = g_get_monotonic_time (); + g_print ("Add same-priority sources: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + +#ifdef SLOW + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + g_assert (sources[i] == g_main_context_find_source_by_id (context, g_source_get_id (sources[i]))); + end = g_get_monotonic_time (); + g_print ("Find each source: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); +#endif + + shuffle (sources, NSOURCES); + + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + g_source_destroy (sources[i]); + end = g_get_monotonic_time (); + g_print ("Remove in random order: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + + /* Make sure they really did get removed */ + g_main_context_iteration (context, FALSE); + + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + { + sources[i] = g_idle_source_new (); + g_source_set_callback (sources[i], callback, NULL, NULL); + g_source_set_priority (sources[i], i % 100); + g_source_attach (sources[i], context); + } + end = g_get_monotonic_time (); + g_print ("Add different-priority sources: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + +#ifdef SLOW + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + g_assert (sources[i] == g_main_context_find_source_by_id (context, g_source_get_id (sources[i]))); + end = g_get_monotonic_time (); + g_print ("Find each source: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); +#endif + + shuffle (sources, NSOURCES); + + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + g_source_destroy (sources[i]); + end = g_get_monotonic_time (); + g_print ("Remove in random order: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + + /* Make sure they really did get removed */ + g_main_context_iteration (context, FALSE); + + pool = g_thread_pool_new (thread_pool_attach_func, context, + 20, TRUE, NULL); + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + { + sources[i] = g_idle_source_new (); + g_source_set_callback (sources[i], callback, NULL, NULL); + g_thread_pool_push (pool, sources[i], &error); + g_assert_no_error (error); + } + g_thread_pool_free (pool, FALSE, TRUE); + end = g_get_monotonic_time (); + g_print ("Add sources from threads: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + + pool = g_thread_pool_new (thread_pool_destroy_func, context, + 20, TRUE, NULL); + start = g_get_monotonic_time (); + for (i = 0; i < NSOURCES; i++) + { + g_thread_pool_push (pool, sources[i], &error); + g_assert_no_error (error); + } + g_thread_pool_free (pool, FALSE, TRUE); + end = g_get_monotonic_time (); + g_print ("Remove sources from threads: %" G_GINT64_FORMAT "\n", + (end - start) / 1000); + + /* Make sure they really did get removed */ + g_main_context_iteration (context, FALSE); + + 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..f5fc435 --- /dev/null +++ b/tests/testgdate.c @@ -0,0 +1,507 @@ +#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 + +static 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..4736379 --- /dev/null +++ b/tests/testgdateparser.c @@ -0,0 +1,100 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#ifdef GLIB_COMPILATION +#undef GLIB_COMPILATION +#endif + +#include "glib.h" + +#include +#include +#include + +/* 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..d41d674 --- /dev/null +++ b/tests/testglib.c @@ -0,0 +1,1600 @@ +/* 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"); + } + + g_tree_unref (tree); +} + +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[] = { + { "foo", 1 }, + { "bar", 2 }, + { "baz", 4 }, + { "weird", 8 }, + }; + guint n_keys = G_N_ELEMENTS (keys); + 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); + + result = g_parse_debug_string ("all", keys, n_keys); + g_assert_cmpuint (result, ==, (1 << n_keys) - 1); + + /* Test subtracting debug flags from "all" */ + result = g_parse_debug_string ("all:foo", keys, n_keys); + g_assert_cmpuint (result, ==, 2 | 4 | 8); + + result = g_parse_debug_string ("foo baz,all", keys, n_keys); + g_assert_cmpuint (result, ==, 2 | 8); + + result = g_parse_debug_string ("all,fooo,baz", keys, n_keys); + g_assert_cmpuint (result, ==, 1 | 2 | 8); + + result = g_parse_debug_string ("all:weird", keys, n_keys); + g_assert_cmpuint (result, ==, 1 | 2 | 4); +} + +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, *uruntimedir; + gchar **sv, *cwd, *sdatadirs, *sconfdirs, *langnames; + const gchar *charset; + gboolean charset_is_utf8; + 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); + + /* reload, just for fun */ + g_reload_user_special_dirs_cache (); + g_reload_user_special_dirs_cache (); + + 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); + uruntimedir = g_get_user_runtime_dir (); + g_assert (uruntimedir != NULL); + + 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 ("user_runtime: %s\n", uruntimedir); + 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); + + charset_is_utf8 = g_get_charset ((const char**)&charset); + + if (g_test_verbose()) + { + if (charset_is_utf8) + g_print ("current charset is UTF-8: %s\n", charset); + else + g_print ("current charset is not UTF-8: %s\n", charset); + } + + if (g_test_verbose()) + { +#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"); + if (fd != -1) + 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; + name_used = 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); + } + if (fd != -1) + close (fd); + g_clear_error (&error); + g_free (name_used); + +#ifdef G_OS_WIN32 + name_used = NULL; + 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); + g_free (name_used); +#endif + + strcpy (template, "zapXXXXXX"); + name_used = NULL; + 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); + g_free (name_used); + + name_used = NULL; + 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); + g_free (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); +} + +#ifndef G_DISABLE_DEPRECATED +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; +} +#endif + +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; + const 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_INVALID3 "1980-02-22T" +#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" +#define REF_STR_DATE_ONLY "1980-02-22" + + 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_INVALID3, &date) == FALSE); + g_assert (g_time_val_from_iso8601 (REF_STR_DATE_ONLY, &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]); + + g_mem_chunk_destroy (mem_chunk); +} +#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); +#ifndef G_DISABLE_DEPRECATED + g_test_add_func ("/testglib/Relation (deprecated)", relation_test); +#endif + 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/testgobject.c b/tests/testgobject.c new file mode 100644 index 0000000..39e10d1 --- /dev/null +++ b/tests/testgobject.c @@ -0,0 +1,429 @@ +/* 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 + +#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) + { + 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) + { + 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) +{ + 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_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); +static GType +derived_object_get_type (void) +{ + static GType derived_object_type = 0; + + if (!derived_object_type) + { + 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); + + /* 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 (type == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST)); + 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 (type == G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_USER_FIRST + 1)); + 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/tests/thread-test.c b/tests/thread-test.c new file mode 100644 index 0000000..93c0158 --- /dev/null +++ b/tests/thread-test.c @@ -0,0 +1,396 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include + +/* GMutex */ + +static GMutex test_g_mutex_mutex; +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; + + 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); +} + +/* 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 GMutex test_g_static_private_mutex; +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_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_counter++; + g_mutex_unlock (&test_g_static_private_mutex); + return g_new (guint,1); +} + +static void +test_g_static_private_destructor (gpointer data) +{ + g_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_counter--; + g_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_mutex_lock (&test_g_static_private_mutex); + test_g_static_private_ready++; + g_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 (void) +{ + 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 */ +static void +run_all_tests (void) +{ + 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[]) +{ + 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 (); + + return 0; +} diff --git a/tests/threadpool-test.c b/tests/threadpool-test.c new file mode 100644 index 0000000..07420df --- /dev/null +++ b/tests/threadpool-test.c @@ -0,0 +1,464 @@ +#undef G_DISABLE_ASSERT +#undef G_LOG_DOMAIN + +#include "config.h" + +#include + +/* #define DEBUG 1 */ + +#ifdef DEBUG +# define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); +#else +# define DEBUG_MSG(x) +#endif + +#define WAIT 5 /* seconds */ +#define MAX_THREADS 10 + +/* if > 0 the test will run continuously (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_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] stopping unused threads")); + g_thread_pool_stop_unused_threads (); + + for (i = 0; i < 5; i++) + { + if (g_thread_pool_get_num_unused_threads () == 0) + break; + + 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", + g_thread_pool_get_num_unused_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) +{ +#ifdef DEBUG + guint id = 0; + + id = GPOINTER_TO_UINT (data); +#endif + + 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 guaranteed 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) +{ +#ifdef DEBUG + guint thread_id; + + thread_id = GPOINTER_TO_UINT (data); +#endif + + 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) +{ + gint i; + + 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 (void) +{ + guint limit = 50; + guint interval = 10000; + gint i; + + idle_pool = g_thread_pool_new (test_thread_idle_time_entry_func, + NULL, + 0, + FALSE, + NULL); + + g_thread_pool_set_max_threads (idle_pool, MAX_THREADS, 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_threads (idle_pool) == MAX_THREADS); + 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_assert_cmpint (g_thread_pool_unprocessed (idle_pool), <=, limit); + + 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[]) +{ + 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); + + 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; + + 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/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..b276a2f --- /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; + + +static 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); +} + +static 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/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 diff --git a/win32-fixup.pl b/win32-fixup.pl new file mode 100644 index 0000000..2134c38 --- /dev/null +++ b/win32-fixup.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl + +$major = 1; +$minor = 3; +$micro = 7; +$binary_age = 0; +$interface_age = 0; +$gettext_package = "glib20"; +$current_minus_age = 0; + +sub process_file +{ + my $outfilename = shift; + my $infilename = $outfilename . ".in"; + + open (INPUT, "< $infilename") || exit 1; + open (OUTPUT, "> $outfilename") || exit 1; + + while () { + s/\@GLIB_MAJOR_VERSION\@/$major/g; + s/\@GLIB_MINOR_VERSION\@/$minor/g; + s/\@GLIB_MICRO_VERSION\@/$micro/g; + s/\@GLIB_INTERFACE_AGE\@/$interface_age/g; + s/\@GLIB_BINARY_AGE\@/$binary_age/g; + s/\@GETTEXT_PACKAGE\@/$gettext_package/g; + s/\@LT_CURRENT_MINUS_AGE@/$current_minus_age/g; + print OUTPUT; + } +} + +process_file ("config.h.win32"); +process_file ("glibconfig.h.win32"); +process_file ("glib/makefile.msc"); +process_file ("glib/glib.rc"); +process_file ("gmodule/makefile.msc"); +process_file ("gmodule/gmodule.rc"); +process_file ("gobject/makefile.msc"); +process_file ("gobject/gobject.rc"); +process_file ("gthread/makefile.msc"); +process_file ("gthread/gthread.rc"); +process_file ("tests/makefile.msc"); -- 2.34.1